Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Eagar <joeedh@gmail.com>2011-04-15 05:19:13 +0400
committerJoseph Eagar <joeedh@gmail.com>2011-04-15 05:19:13 +0400
commitc98148a963d37fc2f25e125afeb4cf21df6fbf14 (patch)
tree691a051e27f08e35bf09d35b6fb9c88e4c37b8d2
parent0bba684d08952d0be822f3906ffb2a03b2674cc2 (diff)
parentfa63c297753636c149fbb1a3877d9b3d93601357 (diff)
=bmesh= merge from trunk at r36153
-rw-r--r--CMakeLists.txt196
-rw-r--r--GNUmakefile18
-rw-r--r--SConstruct33
-rw-r--r--build_files/buildbot/config/user-config-i686.py86
-rw-r--r--build_files/buildbot/config/user-config-player-i686.py65
-rw-r--r--build_files/buildbot/config/user-config-player-x86_64.py66
-rw-r--r--build_files/buildbot/config/user-config-x86_64.py86
-rw-r--r--build_files/buildbot/master.cfg176
-rw-r--r--build_files/buildbot/master_unpack.py124
-rw-r--r--build_files/buildbot/slave_compile.py123
-rw-r--r--build_files/buildbot/slave_pack.py118
-rw-r--r--build_files/buildbot/slave_test.py40
-rw-r--r--build_files/cmake/FindPythonLibsUnix.cmake72
-rw-r--r--build_files/cmake/Modules/FindGLEW.cmake59
-rw-r--r--build_files/cmake/cmake_qtcreator_project.py236
-rwxr-xr-xbuild_files/cmake/example_scripts/make_quicky.py6
-rw-r--r--build_files/cmake/macros.cmake50
-rw-r--r--build_files/cmake/packaging.cmake79
-rwxr-xr-xbuild_files/package_spec/build_archive.py70
-rw-r--r--build_files/package_spec/debian/control4
-rwxr-xr-xbuild_files/package_spec/debian/rules6
-rw-r--r--build_files/package_spec/debian/watch1
-rw-r--r--build_files/package_spec/pacman/PKGBUILD15
-rw-r--r--build_files/scons/config/aix4-config.py2
-rw-r--r--build_files/scons/config/darwin-config.py2
-rw-r--r--build_files/scons/config/freebsd7-config.py9
-rw-r--r--build_files/scons/config/freebsd8-config.py9
-rw-r--r--build_files/scons/config/freebsd9-config.py9
-rw-r--r--build_files/scons/config/irix6-config.py2
-rw-r--r--build_files/scons/config/linux2-config.py9
-rw-r--r--build_files/scons/config/linuxcross-config.py4
-rw-r--r--build_files/scons/config/openbsd3-config.py2
-rw-r--r--build_files/scons/config/sunos5-config.py2
-rw-r--r--build_files/scons/config/win32-mingw-config.py12
-rw-r--r--build_files/scons/config/win32-vc-config.py6
-rw-r--r--build_files/scons/config/win64-vc-config.py6
-rw-r--r--build_files/scons/tools/Blender.py163
-rw-r--r--build_files/scons/tools/btools.py89
-rw-r--r--doc/doxygen/Doxyfile (renamed from doc/Doxyfile)12
-rw-r--r--doc/doxygen/doxygen.extern (renamed from doc/doxygen.extern)0
-rw-r--r--doc/doxygen/doxygen.intern (renamed from doc/doxygen.intern)0
-rw-r--r--doc/doxygen/doxygen.main (renamed from doc/doxygen.main)0
-rw-r--r--doc/doxygen/doxygen.source (renamed from doc/doxygen.source)50
-rw-r--r--doc/doxygen/footer.html (renamed from doc/footer.html)0
-rw-r--r--doc/manpage/blender.113
-rw-r--r--doc/python_api/examples/bpy.data.py4
-rw-r--r--doc/python_api/examples/bpy.props.2.py4
-rw-r--r--doc/python_api/examples/bpy.types.BlendDataLibraries.load.py23
-rw-r--r--doc/python_api/examples/bpy.types.Menu.py6
-rw-r--r--doc/python_api/examples/bpy.types.Operator.2.py1
-rw-r--r--doc/python_api/examples/bpy.types.bpy_struct.keyframe_insert.1.py28
-rw-r--r--doc/python_api/examples/bpy.types.bpy_struct.keyframe_insert.py11
-rw-r--r--doc/python_api/examples/mathutils.py4
-rw-r--r--doc/python_api/rst/bge.logic.rst12
-rw-r--r--doc/python_api/rst/change_log.rst698
-rw-r--r--doc/python_api/sphinx_changelog_gen.py364
-rw-r--r--doc/python_api/sphinx_doc_gen.py164
-rwxr-xr-xdoc/python_api/sphinx_doc_gen.sh15
-rw-r--r--extern/CMakeLists.txt4
-rw-r--r--extern/bullet2/CMakeLists.txt10
-rw-r--r--extern/bullet2/src/Bullet-C-Api.h1
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h27
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h14
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h19
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h4
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.cpp6
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h25
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp75
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h48
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h4
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.h4
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp4
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h1
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp259
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h112
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp19
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h5
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp64
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h4
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp435
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h66
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp57
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp16
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h28
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp54
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h137
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp873
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h144
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp41
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp247
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h95
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp16
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp211
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h3
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp4
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h4
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp23
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h11
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btGhostObject.h5
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp772
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h46
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp30
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h33
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp89
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp3
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h13
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btBox2dShape.cpp42
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btBox2dShape.h363
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp3
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.h5
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp106
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h61
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp6
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.h57
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.cpp37
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h42
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp121
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h68
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.cpp3
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.cpp12
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h5
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvex2dShape.cpp92
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvex2dShape.h80
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp61
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h29
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp74
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.h109
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp7
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.h15
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp94
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp15
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h16
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp87
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h80
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMaterial.h5
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp3
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp98
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h59
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h5
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp19
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h6
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp50
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h54
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp7
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h33
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.cpp112
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.h25
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h3
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp8
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h43
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp323
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h70
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp34
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h6
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp22
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h38
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp7
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleInfoMap.h238
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp3
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h10
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp8
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h6
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h14
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btUniformScalingShape.cpp71
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btUniformScalingShape.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btBoxCollision.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btClipPolygon.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btContactProcessing.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGImpactBvh.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGImpactBvh.h8
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp19
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h6
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGImpactMassUtil.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.h6
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGImpactShape.cpp20
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGImpactShape.h57
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGenericPoolAllocator.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGenericPoolAllocator.h4
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btGeometryOperations.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btQuantization.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_array.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_basic_geometry_operations.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_bitset.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_box_collision.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_box_set.h5
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_clip_polygon.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_contact.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_geom_types.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_geometry.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_hash_table.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_linear_math.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_math.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_memory.h6
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_radixsort.h2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_tri_collision.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/Gimpact/gim_tri_collision.h2
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp13
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h2
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h6
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h11
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.cpp628
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.h53
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp96
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h4
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp16
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h6
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp179
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h9
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h39
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp173
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h6
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp10
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h49
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h9
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp6
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h3
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp5
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp6
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h21
-rw-r--r--extern/bullet2/src/BulletDynamics/Character/btCharacterControllerInterface.h45
-rw-r--r--extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp641
-rw-r--r--extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.h162
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp232
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h114
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp387
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.h122
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h6
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp543
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h231
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp172
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h97
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp66
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h58
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp801
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h250
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h2
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp172
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h73
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp792
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h57
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp928
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.h132
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverBody.h30
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverConstraint.h12
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp142
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h264
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp87
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h62
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/Bullet-C-API.cpp15
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btActionInterface.h11
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp4
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp667
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h27
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h15
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp95
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h230
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp41
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h11
-rw-r--r--extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp29
-rw-r--r--extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h15
-rw-r--r--extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h3
-rw-r--r--extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.cpp151
-rw-r--r--extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.h63
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBody.cpp1027
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBody.h159
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp9
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBodyData.h217
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp355
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.h26
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h88
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBodySolverVertexBuffer.h165
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftBodySolvers.h154
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp4
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp168
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.h20
-rw-r--r--extern/bullet2/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp3
-rw-r--r--extern/bullet2/src/LinearMath/btAlignedAllocator.cpp25
-rw-r--r--extern/bullet2/src/LinearMath/btAlignedObjectArray.h35
-rw-r--r--extern/bullet2/src/LinearMath/btConvexHull.cpp66
-rw-r--r--extern/bullet2/src/LinearMath/btConvexHull.h4
-rw-r--r--extern/bullet2/src/LinearMath/btDefaultMotionState.h2
-rw-r--r--extern/bullet2/src/LinearMath/btHashMap.h211
-rw-r--r--extern/bullet2/src/LinearMath/btIDebugDraw.h186
-rw-r--r--extern/bullet2/src/LinearMath/btMatrix3x3.h1129
-rw-r--r--extern/bullet2/src/LinearMath/btMinMax.h6
-rw-r--r--extern/bullet2/src/LinearMath/btPoolAllocator.h14
-rw-r--r--extern/bullet2/src/LinearMath/btQuaternion.h44
-rw-r--r--extern/bullet2/src/LinearMath/btQuickprof.cpp229
-rw-r--r--extern/bullet2/src/LinearMath/btQuickprof.h198
-rw-r--r--extern/bullet2/src/LinearMath/btScalar.h125
-rw-r--r--extern/bullet2/src/LinearMath/btSerializer.cpp832
-rw-r--r--extern/bullet2/src/LinearMath/btSerializer.h655
-rw-r--r--extern/bullet2/src/LinearMath/btTransform.h78
-rw-r--r--extern/bullet2/src/LinearMath/btTransformUtil.h53
-rw-r--r--extern/bullet2/src/LinearMath/btVector3.h172
-rw-r--r--extern/bullet2/src/btBulletCollisionCommon.h3
-rw-r--r--extern/bullet2/src/btBulletDynamicsCommon.h3
-rw-r--r--extern/glew/include/GL/glew.h3365
-rw-r--r--extern/glew/include/GL/glxew.h150
-rw-r--r--extern/glew/include/GL/wglew.h128
-rw-r--r--extern/glew/src/glew.c3275
-rw-r--r--intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp2
-rw-r--r--intern/audaspace/intern/AUD_C-API.cpp9
-rw-r--r--intern/audaspace/intern/AUD_C-API.h4
-rw-r--r--intern/audaspace/intern/AUD_SequencerFactory.cpp14
-rw-r--r--intern/audaspace/intern/AUD_SequencerFactory.h5
-rw-r--r--intern/audaspace/intern/AUD_SequencerReader.cpp75
-rw-r--r--intern/ghost/CMakeLists.txt11
-rw-r--r--intern/ghost/GHOST_C-api.h11
-rw-r--r--intern/ghost/GHOST_IEvent.h1
-rw-r--r--intern/ghost/GHOST_ISystem.h9
-rw-r--r--intern/ghost/SConscript3
-rw-r--r--intern/ghost/intern/GHOST_C-api.cpp7
-rw-r--r--intern/ghost/intern/GHOST_DisplayManagerWin32.cpp11
-rw-r--r--intern/ghost/intern/GHOST_System.cpp58
-rw-r--r--intern/ghost/intern/GHOST_System.h7
-rw-r--r--intern/ghost/intern/GHOST_SystemPathsX11.cpp12
-rw-r--r--intern/ghost/intern/GHOST_SystemWin32.cpp472
-rw-r--r--intern/ghost/intern/GHOST_SystemWin32.h158
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.cpp4
-rw-r--r--intern/ghost/intern/GHOST_WindowWin32.cpp150
-rw-r--r--intern/ghost/intern/GHOST_WindowWin32.h11
-rw-r--r--intern/ghost/intern/GHOST_WindowX11.cpp13
-rw-r--r--intern/guardedalloc/MEM_guardedalloc.h2
-rw-r--r--intern/guardedalloc/intern/mallocn.c51
-rw-r--r--intern/itasc/Scene.cpp4
-rw-r--r--intern/memutil/MEM_Allocator.h1
-rw-r--r--intern/mikktspace/mikktspace.c15
-rw-r--r--intern/opennl/CMakeLists.txt4
-rw-r--r--release/datafiles/blenderbuttonsbin210319 -> 210335 bytes
-rw-r--r--release/datafiles/splash.pngbin174800 -> 268962 bytes
-rw-r--r--release/freedesktop/blender.desktop2
-rw-r--r--release/scripts/io/add_mesh_torus.py98
-rw-r--r--release/scripts/io/export_mdd.py208
-rw-r--r--release/scripts/io/mesh_skin.py647
-rw-r--r--release/scripts/io/netrender/__init__.py73
-rw-r--r--release/scripts/io/netrender/balancing.py195
-rw-r--r--release/scripts/io/netrender/client.py372
-rw-r--r--release/scripts/io/netrender/master.py1079
-rw-r--r--release/scripts/io/netrender/master_html.py315
-rw-r--r--release/scripts/io/netrender/model.py360
-rw-r--r--release/scripts/io/netrender/netrender.css88
-rw-r--r--release/scripts/io/netrender/netrender.js146
-rw-r--r--release/scripts/io/netrender/operators.py564
-rw-r--r--release/scripts/io/netrender/repath.py150
-rw-r--r--release/scripts/io/netrender/slave.py349
-rw-r--r--release/scripts/io/netrender/thumbnail.py81
-rw-r--r--release/scripts/io/netrender/ui.py550
-rw-r--r--release/scripts/io/netrender/utils.py313
-rw-r--r--release/scripts/io/netrender/versioning.py72
-rw-r--r--release/scripts/keyingsets/keyingsets_utils.py159
-rw-r--r--release/scripts/modules/addon_utils.py17
-rw-r--r--release/scripts/modules/animsys_refactor.py22
-rw-r--r--release/scripts/modules/bpy/__init__.py16
-rw-r--r--release/scripts/modules/bpy/utils.py74
-rw-r--r--release/scripts/modules/bpy_types.py38
-rw-r--r--release/scripts/modules/bpyml.py12
-rw-r--r--release/scripts/modules/bpyml_ui.py4
-rw-r--r--release/scripts/modules/console_python.py306
-rw-r--r--release/scripts/modules/console_shell.py78
-rw-r--r--release/scripts/modules/image_utils.py2
-rw-r--r--release/scripts/modules/io_utils.py22
-rw-r--r--release/scripts/modules/keyingsets_utils.py24
-rw-r--r--release/scripts/modules/mesh_utils.py69
-rw-r--r--release/scripts/modules/rna_info.py16
-rw-r--r--release/scripts/modules/sys_info.py29
-rw-r--r--release/scripts/presets/interaction/blender.py3
-rw-r--r--release/scripts/presets/keyconfig/maya.py442
-rw-r--r--release/scripts/startup/bl_operators/__init__.py58
-rw-r--r--release/scripts/startup/bl_operators/add_mesh_torus.py138
-rw-r--r--release/scripts/startup/bl_operators/animsys_update.py699
-rw-r--r--release/scripts/startup/bl_operators/image.py202
-rw-r--r--release/scripts/startup/bl_operators/mesh.py172
-rw-r--r--release/scripts/startup/bl_operators/nla.py170
-rw-r--r--release/scripts/startup/bl_operators/object.py563
-rw-r--r--release/scripts/startup/bl_operators/object_align.py280
-rw-r--r--release/scripts/startup/bl_operators/object_quick_effects.py292
-rw-r--r--release/scripts/startup/bl_operators/object_randomize_transform.py147
-rw-r--r--release/scripts/startup/bl_operators/presets.py352
-rw-r--r--release/scripts/startup/bl_operators/screen_play_rendered_anim.py142
-rw-r--r--release/scripts/startup/bl_operators/sequencer.py134
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_follow_active.py250
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_lightmap.py582
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_smart_project.py1141
-rw-r--r--release/scripts/startup/bl_operators/vertexpaint_dirt.py176
-rw-r--r--release/scripts/startup/bl_operators/wm.py1000
-rw-r--r--release/scripts/startup/bl_ui/__init__.py121
-rw-r--r--release/scripts/startup/bl_ui/properties_animviz.py (renamed from release/scripts/ui/properties_animviz.py)21
-rw-r--r--release/scripts/startup/bl_ui/properties_data_armature.py (renamed from release/scripts/ui/properties_data_armature.py)86
-rw-r--r--release/scripts/startup/bl_ui/properties_data_bone.py (renamed from release/scripts/ui/properties_data_bone.py)13
-rw-r--r--release/scripts/startup/bl_ui/properties_data_camera.py (renamed from release/scripts/ui/properties_data_camera.py)10
-rw-r--r--release/scripts/startup/bl_ui/properties_data_curve.py (renamed from release/scripts/ui/properties_data_curve.py)25
-rw-r--r--release/scripts/startup/bl_ui/properties_data_empty.py (renamed from release/scripts/ui/properties_data_empty.py)11
-rw-r--r--release/scripts/startup/bl_ui/properties_data_lamp.py (renamed from release/scripts/ui/properties_data_lamp.py)41
-rw-r--r--release/scripts/startup/bl_ui/properties_data_lattice.py (renamed from release/scripts/ui/properties_data_lattice.py)38
-rw-r--r--release/scripts/startup/bl_ui/properties_data_mesh.py (renamed from release/scripts/ui/properties_data_mesh.py)22
-rw-r--r--release/scripts/startup/bl_ui/properties_data_metaball.py (renamed from release/scripts/ui/properties_data_metaball.py)12
-rw-r--r--release/scripts/startup/bl_ui/properties_data_modifier.py (renamed from release/scripts/ui/properties_data_modifier.py)68
-rw-r--r--release/scripts/startup/bl_ui/properties_game.py (renamed from release/scripts/ui/properties_game.py)49
-rw-r--r--release/scripts/startup/bl_ui/properties_material.py (renamed from release/scripts/ui/properties_material.py)99
-rw-r--r--release/scripts/startup/bl_ui/properties_object.py (renamed from release/scripts/ui/properties_object.py)40
-rw-r--r--release/scripts/startup/bl_ui/properties_object_constraint.py (renamed from release/scripts/ui/properties_object_constraint.py)151
-rw-r--r--release/scripts/startup/bl_ui/properties_particle.py (renamed from release/scripts/ui/properties_particle.py)384
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_cloth.py (renamed from release/scripts/ui/properties_physics_cloth.py)18
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_common.py (renamed from release/scripts/ui/properties_physics_common.py)22
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_field.py (renamed from release/scripts/ui/properties_physics_field.py)20
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_fluid.py (renamed from release/scripts/ui/properties_physics_fluid.py)18
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_smoke.py (renamed from release/scripts/ui/properties_physics_smoke.py)19
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_softbody.py (renamed from release/scripts/ui/properties_physics_softbody.py)16
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py (renamed from release/scripts/ui/properties_render.py)31
-rw-r--r--release/scripts/startup/bl_ui/properties_scene.py (renamed from release/scripts/ui/properties_scene.py)25
-rw-r--r--release/scripts/startup/bl_ui/properties_texture.py (renamed from release/scripts/ui/properties_texture.py)137
-rw-r--r--release/scripts/startup/bl_ui/properties_world.py (renamed from release/scripts/ui/properties_world.py)10
-rw-r--r--release/scripts/startup/bl_ui/space_console.py (renamed from release/scripts/ui/space_console.py)14
-rw-r--r--release/scripts/startup/bl_ui/space_dopesheet.py (renamed from release/scripts/ui/space_dopesheet.py)100
-rw-r--r--release/scripts/startup/bl_ui/space_filebrowser.py (renamed from release/scripts/ui/space_filebrowser.py)12
-rw-r--r--release/scripts/startup/bl_ui/space_graph.py (renamed from release/scripts/ui/space_graph.py)14
-rw-r--r--release/scripts/startup/bl_ui/space_image.py (renamed from release/scripts/ui/space_image.py)43
-rw-r--r--release/scripts/startup/bl_ui/space_info.py (renamed from release/scripts/ui/space_info.py)23
-rw-r--r--release/scripts/startup/bl_ui/space_logic.py (renamed from release/scripts/ui/space_logic.py)10
-rw-r--r--release/scripts/startup/bl_ui/space_nla.py (renamed from release/scripts/ui/space_nla.py)14
-rw-r--r--release/scripts/startup/bl_ui/space_node.py (renamed from release/scripts/ui/space_node.py)13
-rw-r--r--release/scripts/startup/bl_ui/space_outliner.py (renamed from release/scripts/ui/space_outliner.py)12
-rw-r--r--release/scripts/startup/bl_ui/space_sequencer.py (renamed from release/scripts/ui/space_sequencer.py)56
-rw-r--r--release/scripts/startup/bl_ui/space_text.py (renamed from release/scripts/ui/space_text.py)10
-rw-r--r--release/scripts/startup/bl_ui/space_time.py (renamed from release/scripts/ui/space_time.py)11
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py (renamed from release/scripts/ui/space_userpref.py)74
-rw-r--r--release/scripts/startup/bl_ui/space_userpref_keymap.py (renamed from release/scripts/ui/space_userpref_keymap.py)58
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py (renamed from release/scripts/ui/space_view3d.py)94
-rw-r--r--release/scripts/startup/bl_ui/space_view3d_toolbar.py (renamed from release/scripts/ui/space_view3d_toolbar.py)152
-rw-r--r--release/scripts/startup/keyingsets_builtins.py (renamed from release/scripts/keyingsets/keyingsets_builtins.py)176
-rw-r--r--release/scripts/templates/addon_add_object.py8
-rw-r--r--release/scripts/templates/background_job.py64
-rw-r--r--release/scripts/templates/builtin_keyingset.py3
-rw-r--r--release/scripts/templates/operator_export.py7
-rw-r--r--release/scripts/templates/operator_mesh_add.py2
-rw-r--r--release/scripts/templates/operator_modal.py2
-rw-r--r--release/scripts/templates/operator_modal_timer.py45
-rw-r--r--release/text/readme.html13
-rw-r--r--release/windows/installer/00.sconsblender.nsi126
-rw-r--r--source/blender/avi/intern/avi.c7
-rw-r--r--source/blender/avi/intern/avi_intern.h5
-rw-r--r--source/blender/avi/intern/avirgb.c5
-rw-r--r--source/blender/avi/intern/avirgb.h5
-rw-r--r--source/blender/avi/intern/codecs.c5
-rw-r--r--source/blender/avi/intern/endian.c5
-rw-r--r--source/blender/avi/intern/endian.h5
-rw-r--r--source/blender/avi/intern/mjpeg.c5
-rw-r--r--source/blender/avi/intern/mjpeg.h5
-rw-r--r--source/blender/avi/intern/options.c5
-rw-r--r--source/blender/avi/intern/rgb32.c5
-rw-r--r--source/blender/avi/intern/rgb32.h5
-rw-r--r--source/blender/blenfont/BLF_api.h5
-rw-r--r--source/blender/blenfont/CMakeLists.txt2
-rw-r--r--source/blender/blenfont/intern/blf.c5
-rw-r--r--source/blender/blenfont/intern/blf_dir.c7
-rw-r--r--source/blender/blenfont/intern/blf_font.c5
-rw-r--r--source/blender/blenfont/intern/blf_glyph.c7
-rw-r--r--source/blender/blenfont/intern/blf_internal.h5
-rw-r--r--source/blender/blenfont/intern/blf_internal_types.h5
-rw-r--r--source/blender/blenfont/intern/blf_lang.c5
-rw-r--r--source/blender/blenfont/intern/blf_util.c5
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h2
-rw-r--r--source/blender/blenkernel/BKE_action.h8
-rw-r--r--source/blender/blenkernel/BKE_animsys.h3
-rw-r--r--source/blender/blenkernel/BKE_blender.h10
-rw-r--r--source/blender/blenkernel/BKE_curve.h2
-rw-r--r--source/blender/blenkernel/BKE_customdata_file.h4
-rw-r--r--source/blender/blenkernel/BKE_depsgraph.h2
-rw-r--r--source/blender/blenkernel/BKE_fcurve.h4
-rw-r--r--source/blender/blenkernel/BKE_global.h1
-rwxr-xr-xsource/blender/blenkernel/BKE_idcode.h8
-rw-r--r--source/blender/blenkernel/BKE_idprop.h30
-rw-r--r--source/blender/blenkernel/BKE_mesh.h21
-rw-r--r--source/blender/blenkernel/BKE_modifier.h2
-rw-r--r--source/blender/blenkernel/BKE_node.h2
-rw-r--r--source/blender/blenkernel/BKE_object.h4
-rw-r--r--source/blender/blenkernel/BKE_paint.h9
-rw-r--r--source/blender/blenkernel/BKE_particle.h63
-rw-r--r--source/blender/blenkernel/BKE_report.h2
-rw-r--r--source/blender/blenkernel/BKE_scene.h12
-rw-r--r--source/blender/blenkernel/BKE_screen.h5
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h3
-rw-r--r--source/blender/blenkernel/BKE_sound.h2
-rw-r--r--source/blender/blenkernel/BKE_texture.h1
-rw-r--r--source/blender/blenkernel/CMakeLists.txt2
-rw-r--r--source/blender/blenkernel/depsgraph_private.h5
-rw-r--r--source/blender/blenkernel/intern/BME_Customdata.c5
-rw-r--r--source/blender/blenkernel/intern/BME_conversions.c5
-rw-r--r--source/blender/blenkernel/intern/BME_eulers.c5
-rw-r--r--source/blender/blenkernel/intern/BME_mesh.c5
-rw-r--r--source/blender/blenkernel/intern/BME_structure.c5
-rw-r--r--source/blender/blenkernel/intern/BME_tools.c5
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.c72
-rw-r--r--source/blender/blenkernel/intern/CCGSubSurf.h3
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c17
-rw-r--r--source/blender/blenkernel/intern/action.c39
-rw-r--r--source/blender/blenkernel/intern/anim.c13
-rw-r--r--source/blender/blenkernel/intern/anim_sys.c86
-rw-r--r--source/blender/blenkernel/intern/armature.c23
-rw-r--r--source/blender/blenkernel/intern/blender.c26
-rw-r--r--source/blender/blenkernel/intern/bmesh_private.h5
-rw-r--r--source/blender/blenkernel/intern/bmfont.c5
-rw-r--r--source/blender/blenkernel/intern/boids.c74
-rw-r--r--source/blender/blenkernel/intern/booleanops_mesh.c7
-rw-r--r--source/blender/blenkernel/intern/brush.c97
-rw-r--r--source/blender/blenkernel/intern/bullet.c5
-rw-r--r--source/blender/blenkernel/intern/bvhutils.c25
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c107
-rw-r--r--source/blender/blenkernel/intern/cloth.c5
-rw-r--r--source/blender/blenkernel/intern/collision.c5
-rw-r--r--source/blender/blenkernel/intern/colortools.c25
-rw-r--r--source/blender/blenkernel/intern/constraint.c62
-rw-r--r--source/blender/blenkernel/intern/context.c9
-rw-r--r--source/blender/blenkernel/intern/curve.c135
-rw-r--r--source/blender/blenkernel/intern/customdata.c112
-rw-r--r--source/blender/blenkernel/intern/customdata_file.c13
-rw-r--r--source/blender/blenkernel/intern/deform.c5
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c13
-rw-r--r--source/blender/blenkernel/intern/displist.c21
-rw-r--r--source/blender/blenkernel/intern/editderivedbmesh.c15
-rw-r--r--source/blender/blenkernel/intern/effect.c36
-rw-r--r--source/blender/blenkernel/intern/exotic.c13
-rw-r--r--source/blender/blenkernel/intern/fcurve.c120
-rw-r--r--source/blender/blenkernel/intern/fluidsim.c5
-rw-r--r--source/blender/blenkernel/intern/fmodifier.c11
-rw-r--r--source/blender/blenkernel/intern/font.c51
-rw-r--r--source/blender/blenkernel/intern/gpencil.c5
-rw-r--r--source/blender/blenkernel/intern/group.c5
-rw-r--r--source/blender/blenkernel/intern/icons.c5
-rwxr-xr-xsource/blender/blenkernel/intern/idcode.c10
-rw-r--r--source/blender/blenkernel/intern/idprop.c7
-rw-r--r--source/blender/blenkernel/intern/image.c21
-rw-r--r--source/blender/blenkernel/intern/image_gen.c9
-rw-r--r--source/blender/blenkernel/intern/implicit.c5
-rw-r--r--source/blender/blenkernel/intern/ipo.c7
-rw-r--r--source/blender/blenkernel/intern/key.c31
-rw-r--r--source/blender/blenkernel/intern/lattice.c32
-rw-r--r--source/blender/blenkernel/intern/library.c15
-rw-r--r--source/blender/blenkernel/intern/material.c37
-rw-r--r--source/blender/blenkernel/intern/mball.c57
-rw-r--r--source/blender/blenkernel/intern/mesh.c358
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c11
-rw-r--r--source/blender/blenkernel/intern/modifier.c5
-rw-r--r--source/blender/blenkernel/intern/multires.c29
-rw-r--r--source/blender/blenkernel/intern/nla.c50
-rw-r--r--source/blender/blenkernel/intern/node.c65
-rw-r--r--source/blender/blenkernel/intern/object.c105
-rw-r--r--source/blender/blenkernel/intern/packedFile.c5
-rw-r--r--source/blender/blenkernel/intern/paint.c5
-rw-r--r--source/blender/blenkernel/intern/particle.c193
-rw-r--r--source/blender/blenkernel/intern/particle_system.c2475
-rw-r--r--source/blender/blenkernel/intern/pointcache.c50
-rw-r--r--source/blender/blenkernel/intern/property.c5
-rw-r--r--source/blender/blenkernel/intern/report.c5
-rw-r--r--source/blender/blenkernel/intern/sca.c5
-rw-r--r--source/blender/blenkernel/intern/scene.c53
-rw-r--r--source/blender/blenkernel/intern/screen.c26
-rw-r--r--source/blender/blenkernel/intern/script.c5
-rwxr-xr-xsource/blender/blenkernel/intern/seqcache.c5
-rw-r--r--source/blender/blenkernel/intern/seqeffects.c138
-rw-r--r--source/blender/blenkernel/intern/sequencer.c83
-rw-r--r--source/blender/blenkernel/intern/shrinkwrap.c7
-rw-r--r--source/blender/blenkernel/intern/sketch.c5
-rw-r--r--source/blender/blenkernel/intern/smoke.c5
-rw-r--r--source/blender/blenkernel/intern/softbody.c5
-rw-r--r--source/blender/blenkernel/intern/sound.c13
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c58
-rw-r--r--source/blender/blenkernel/intern/suggestions.c5
-rw-r--r--source/blender/blenkernel/intern/text.c6
-rw-r--r--source/blender/blenkernel/intern/texture.c83
-rw-r--r--source/blender/blenkernel/intern/unit.c9
-rw-r--r--source/blender/blenkernel/intern/world.c7
-rw-r--r--source/blender/blenkernel/intern/writeavi.c5
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c3
-rw-r--r--source/blender/blenkernel/intern/writeframeserver.c3
-rw-r--r--source/blender/blenkernel/nla_private.h5
-rw-r--r--source/blender/blenlib/BLI_array.h2
-rw-r--r--source/blender/blenlib/BLI_blenlib.h4
-rw-r--r--source/blender/blenlib/BLI_bpath.h2
-rw-r--r--source/blender/blenlib/BLI_dynstr.h2
-rw-r--r--source/blender/blenlib/BLI_editVert.h1
-rw-r--r--source/blender/blenlib/BLI_math_geom.h6
-rw-r--r--source/blender/blenlib/BLI_math_rotation.h9
-rw-r--r--source/blender/blenlib/BLI_path_util.h22
-rw-r--r--source/blender/blenlib/BLI_pbvh.h2
-rw-r--r--source/blender/blenlib/BLI_storage_types.h3
-rw-r--r--source/blender/blenlib/BLI_string.h12
-rw-r--r--source/blender/blenlib/BLI_utildefines.h6
-rw-r--r--source/blender/blenlib/BLI_winstuff.h5
-rw-r--r--source/blender/blenlib/PIL_dynlib.h5
-rw-r--r--source/blender/blenlib/PIL_time.h29
-rw-r--r--source/blender/blenlib/intern/BLI_args.c5
-rw-r--r--source/blender/blenlib/intern/BLI_callbacks.h5
-rw-r--r--source/blender/blenlib/intern/BLI_dynstr.c5
-rw-r--r--source/blender/blenlib/intern/BLI_ghash.c5
-rw-r--r--source/blender/blenlib/intern/BLI_heap.c5
-rw-r--r--source/blender/blenlib/intern/BLI_kdopbvh.c5
-rw-r--r--source/blender/blenlib/intern/BLI_kdtree.c5
-rw-r--r--source/blender/blenlib/intern/BLI_linklist.c5
-rw-r--r--source/blender/blenlib/intern/BLI_memarena.c5
-rw-r--r--source/blender/blenlib/intern/BLI_mempool.c5
-rw-r--r--source/blender/blenlib/intern/DLRB_tree.c5
-rw-r--r--source/blender/blenlib/intern/boxpack2d.c5
-rw-r--r--source/blender/blenlib/intern/bpath.c7
-rw-r--r--source/blender/blenlib/intern/cpu.c5
-rw-r--r--source/blender/blenlib/intern/dynamiclist.h5
-rw-r--r--source/blender/blenlib/intern/dynlib.c5
-rw-r--r--source/blender/blenlib/intern/edgehash.c5
-rw-r--r--source/blender/blenlib/intern/fileops.c8
-rw-r--r--source/blender/blenlib/intern/fnmatch.c3
-rw-r--r--source/blender/blenlib/intern/freetypefont.c63
-rw-r--r--source/blender/blenlib/intern/graph.c5
-rw-r--r--source/blender/blenlib/intern/gsqueue.c5
-rw-r--r--source/blender/blenlib/intern/jitter.c5
-rw-r--r--source/blender/blenlib/intern/listbase.c5
-rw-r--r--source/blender/blenlib/intern/math_base.c5
-rw-r--r--source/blender/blenlib/intern/math_base_inline.c13
-rw-r--r--source/blender/blenlib/intern/math_color.c25
-rw-r--r--source/blender/blenlib/intern/math_geom.c145
-rw-r--r--source/blender/blenlib/intern/math_geom_inline.c5
-rw-r--r--source/blender/blenlib/intern/math_matrix.c31
-rw-r--r--source/blender/blenlib/intern/math_rotation.c79
-rw-r--r--source/blender/blenlib/intern/math_vector.c19
-rw-r--r--source/blender/blenlib/intern/math_vector_inline.c19
-rw-r--r--source/blender/blenlib/intern/noise.c5
-rw-r--r--source/blender/blenlib/intern/path_util.c288
-rw-r--r--source/blender/blenlib/intern/pbvh.c7
-rw-r--r--source/blender/blenlib/intern/rand.c5
-rw-r--r--source/blender/blenlib/intern/rct.c9
-rw-r--r--source/blender/blenlib/intern/scanfill.c3
-rw-r--r--source/blender/blenlib/intern/storage.c10
-rw-r--r--source/blender/blenlib/intern/string.c29
-rw-r--r--source/blender/blenlib/intern/threads.c5
-rw-r--r--source/blender/blenlib/intern/time.c5
-rw-r--r--source/blender/blenlib/intern/uvproject.c23
-rw-r--r--source/blender/blenlib/intern/voxel.c5
-rw-r--r--source/blender/blenlib/intern/winstuff.c114
-rw-r--r--source/blender/blenloader/BLO_readfile.h24
-rw-r--r--source/blender/blenloader/BLO_soundfile.h2
-rw-r--r--source/blender/blenloader/BLO_sys_types.h4
-rw-r--r--source/blender/blenloader/BLO_undofile.h2
-rw-r--r--source/blender/blenloader/BLO_writefile.h2
-rw-r--r--source/blender/blenloader/intern/readblenentry.c18
-rw-r--r--source/blender/blenloader/intern/readfile.c514
-rw-r--r--source/blender/blenloader/intern/readfile.h5
-rw-r--r--source/blender/blenloader/intern/undofile.c5
-rw-r--r--source/blender/blenloader/intern/writefile.c9
-rw-r--r--source/blender/blenpluginapi/documentation.h5
-rw-r--r--source/blender/blenpluginapi/externdef.h3
-rw-r--r--source/blender/blenpluginapi/floatpatch.h3
-rw-r--r--source/blender/blenpluginapi/iff.h3
-rw-r--r--source/blender/blenpluginapi/intern/pluginapi.c5
-rw-r--r--source/blender/blenpluginapi/plugin.h3
-rw-r--r--source/blender/blenpluginapi/util.h3
-rw-r--r--source/blender/bmesh/operators/bevel.c35
-rw-r--r--source/blender/collada/AnimationImporter.cpp9
-rw-r--r--source/blender/collada/ArmatureExporter.cpp5
-rw-r--r--source/blender/collada/ArmatureImporter.cpp5
-rw-r--r--source/blender/collada/CMakeLists.txt8
-rw-r--r--source/blender/collada/CameraExporter.cpp5
-rw-r--r--source/blender/collada/DocumentExporter.cpp61
-rw-r--r--source/blender/collada/DocumentImporter.cpp1676
-rw-r--r--source/blender/collada/DocumentImporter.h61
-rw-r--r--source/blender/collada/EffectExporter.cpp99
-rw-r--r--source/blender/collada/EffectExporter.h11
-rw-r--r--source/blender/collada/ExtraHandler.cpp81
-rw-r--r--source/blender/collada/ExtraHandler.h77
-rw-r--r--source/blender/collada/ExtraTags.cpp122
-rw-r--r--source/blender/collada/ExtraTags.h80
-rw-r--r--source/blender/collada/GeometryExporter.cpp16
-rw-r--r--source/blender/collada/ImageExporter.cpp40
-rw-r--r--source/blender/collada/ImageExporter.h2
-rw-r--r--source/blender/collada/InstanceWriter.cpp12
-rw-r--r--source/blender/collada/LightExporter.cpp108
-rw-r--r--source/blender/collada/LightExporter.h3
-rw-r--r--source/blender/collada/MaterialExporter.cpp7
-rw-r--r--source/blender/collada/MeshImporter.cpp78
-rw-r--r--source/blender/collada/MeshImporter.h1
-rw-r--r--source/blender/collada/SConscript4
-rw-r--r--source/blender/collada/SkinInfo.cpp5
-rw-r--r--source/blender/collada/TransformReader.cpp5
-rw-r--r--source/blender/collada/TransformWriter.cpp5
-rw-r--r--source/blender/collada/collada.cpp5
-rw-r--r--source/blender/collada/collada_internal.cpp24
-rw-r--r--source/blender/collada/collada_internal.h6
-rw-r--r--source/blender/collada/collada_utils.cpp5
-rw-r--r--source/blender/editors/animation/CMakeLists.txt1
-rw-r--r--source/blender/editors/animation/anim_channels_defines.c7
-rw-r--r--source/blender/editors/animation/anim_channels_edit.c14
-rw-r--r--source/blender/editors/animation/anim_deps.c5
-rw-r--r--source/blender/editors/animation/anim_draw.c13
-rw-r--r--source/blender/editors/animation/anim_filter.c50
-rw-r--r--source/blender/editors/animation/anim_intern.h5
-rw-r--r--source/blender/editors/animation/anim_ipo_utils.c5
-rw-r--r--source/blender/editors/animation/anim_markers.c84
-rw-r--r--source/blender/editors/animation/anim_ops.c9
-rw-r--r--source/blender/editors/animation/drivers.c5
-rw-r--r--source/blender/editors/animation/fmodifier_ui.c100
-rw-r--r--source/blender/editors/animation/keyframes_draw.c78
-rw-r--r--source/blender/editors/animation/keyframes_edit.c13
-rw-r--r--source/blender/editors/animation/keyframes_general.c53
-rw-r--r--source/blender/editors/animation/keyframing.c36
-rw-r--r--source/blender/editors/animation/keyingsets.c14
-rw-r--r--source/blender/editors/armature/BIF_generate.h5
-rw-r--r--source/blender/editors/armature/BIF_retarget.h9
-rw-r--r--source/blender/editors/armature/CMakeLists.txt1
-rw-r--r--source/blender/editors/armature/armature_intern.h20
-rw-r--r--source/blender/editors/armature/armature_ops.c11
-rw-r--r--source/blender/editors/armature/editarmature.c20
-rw-r--r--source/blender/editors/armature/editarmature_generate.c5
-rw-r--r--source/blender/editors/armature/editarmature_retarget.c11
-rw-r--r--source/blender/editors/armature/editarmature_sketch.c5
-rw-r--r--source/blender/editors/armature/meshlaplacian.c25
-rw-r--r--source/blender/editors/armature/meshlaplacian.h5
-rw-r--r--source/blender/editors/armature/poseSlide.c593
-rw-r--r--source/blender/editors/armature/poseUtils.c84
-rw-r--r--source/blender/editors/armature/poselib.c21
-rw-r--r--source/blender/editors/armature/poseobject.c47
-rw-r--r--source/blender/editors/armature/reeb.c5
-rw-r--r--source/blender/editors/armature/reeb.h5
-rw-r--r--source/blender/editors/curve/curve_intern.h5
-rw-r--r--source/blender/editors/curve/curve_ops.c8
-rw-r--r--source/blender/editors/curve/editcurve.c155
-rw-r--r--source/blender/editors/curve/editfont.c31
-rw-r--r--source/blender/editors/curve/lorem.c5
-rw-r--r--source/blender/editors/datafiles/Bfont.c5
-rw-r--r--source/blender/editors/datafiles/add.png.c3
-rw-r--r--source/blender/editors/datafiles/bfont.ttf.c3
-rw-r--r--source/blender/editors/datafiles/blenderbuttons.c13151
-rw-r--r--source/blender/editors/datafiles/blob.png.c3
-rw-r--r--source/blender/editors/datafiles/blur.png.c3
-rw-r--r--source/blender/editors/datafiles/bmonofont.ttf.c3
-rw-r--r--source/blender/editors/datafiles/clay.png.c3
-rw-r--r--source/blender/editors/datafiles/clone.png.c3
-rw-r--r--source/blender/editors/datafiles/crease.png.c3
-rw-r--r--source/blender/editors/datafiles/darken.png.c3
-rw-r--r--source/blender/editors/datafiles/draw.png.c3
-rw-r--r--source/blender/editors/datafiles/fill.png.c3
-rw-r--r--source/blender/editors/datafiles/flatten.png.c3
-rw-r--r--source/blender/editors/datafiles/grab.png.c3
-rw-r--r--source/blender/editors/datafiles/inflate.png.c3
-rw-r--r--source/blender/editors/datafiles/layer.png.c3
-rw-r--r--source/blender/editors/datafiles/lighten.png.c3
-rw-r--r--source/blender/editors/datafiles/mix.png.c3
-rw-r--r--source/blender/editors/datafiles/multiply.png.c3
-rw-r--r--source/blender/editors/datafiles/nudge.png.c3
-rw-r--r--source/blender/editors/datafiles/pinch.png.c3
-rw-r--r--source/blender/editors/datafiles/preview.blend.c3
-rw-r--r--source/blender/editors/datafiles/prvicons.c3
-rw-r--r--source/blender/editors/datafiles/scrape.png.c3
-rw-r--r--source/blender/editors/datafiles/smear.png.c3
-rw-r--r--source/blender/editors/datafiles/smooth.png.c3
-rw-r--r--source/blender/editors/datafiles/snake_hook.png.c3
-rw-r--r--source/blender/editors/datafiles/soften.png.c3
-rw-r--r--source/blender/editors/datafiles/splash.png.c13871
-rw-r--r--source/blender/editors/datafiles/startup.blend.c15991
-rw-r--r--source/blender/editors/datafiles/subtract.png.c3
-rw-r--r--source/blender/editors/datafiles/texdraw.png.c3
-rw-r--r--source/blender/editors/datafiles/thumb.png.c3
-rw-r--r--source/blender/editors/datafiles/twist.png.c3
-rw-r--r--source/blender/editors/datafiles/vertexdraw.png.c3
-rw-r--r--source/blender/editors/gpencil/CMakeLists.txt1
-rw-r--r--source/blender/editors/gpencil/drawgpencil.c70
-rw-r--r--source/blender/editors/gpencil/editaction_gpencil.c5
-rw-r--r--source/blender/editors/gpencil/gpencil_buttons.c61
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c15
-rw-r--r--source/blender/editors/gpencil/gpencil_intern.h5
-rw-r--r--source/blender/editors/gpencil/gpencil_ops.c5
-rw-r--r--source/blender/editors/gpencil/gpencil_paint.c154
-rw-r--r--source/blender/editors/include/BIF_gl.h2
-rw-r--r--source/blender/editors/include/ED_anim_api.h5
-rw-r--r--source/blender/editors/include/ED_fileselect.h10
-rw-r--r--source/blender/editors/include/ED_keyframes_draw.h6
-rw-r--r--source/blender/editors/include/ED_markers.h3
-rw-r--r--source/blender/editors/include/ED_mesh.h1
-rw-r--r--source/blender/editors/include/ED_screen.h5
-rw-r--r--source/blender/editors/include/ED_sequencer.h2
-rw-r--r--source/blender/editors/include/ED_transform.h1
-rw-r--r--source/blender/editors/include/ED_util.h2
-rw-r--r--source/blender/editors/include/ED_uvedit.h6
-rw-r--r--source/blender/editors/include/ED_view3d.h9
-rw-r--r--source/blender/editors/include/UI_icons.h4
-rw-r--r--source/blender/editors/include/UI_interface.h5
-rw-r--r--source/blender/editors/include/UI_resources.h7
-rw-r--r--source/blender/editors/interface/CMakeLists.txt1
-rw-r--r--source/blender/editors/interface/interface.c427
-rw-r--r--source/blender/editors/interface/interface_anim.c3
-rw-r--r--source/blender/editors/interface/interface_draw.c85
-rw-r--r--source/blender/editors/interface/interface_handlers.c307
-rw-r--r--source/blender/editors/interface/interface_icons.c85
-rw-r--r--source/blender/editors/interface/interface_intern.h6
-rw-r--r--source/blender/editors/interface/interface_layout.c111
-rw-r--r--source/blender/editors/interface/interface_ops.c5
-rw-r--r--source/blender/editors/interface/interface_panel.c17
-rw-r--r--source/blender/editors/interface/interface_regions.c45
-rw-r--r--source/blender/editors/interface/interface_style.c9
-rw-r--r--source/blender/editors/interface/interface_templates.c143
-rw-r--r--source/blender/editors/interface/interface_utils.c30
-rw-r--r--source/blender/editors/interface/interface_widgets.c82
-rw-r--r--source/blender/editors/interface/resources.c238
-rw-r--r--source/blender/editors/interface/view2d.c19
-rw-r--r--source/blender/editors/interface/view2d_ops.c17
-rw-r--r--source/blender/editors/mesh/CMakeLists.txt1
-rw-r--r--source/blender/editors/mesh/editface.c15
-rwxr-xr-xsource/blender/editors/mesh/knifetool.c2
-rw-r--r--source/blender/editors/mesh/loopcut.c5
-rw-r--r--source/blender/editors/mesh/mesh_data.c19
-rw-r--r--source/blender/editors/mesh/mesh_intern.h7
-rw-r--r--source/blender/editors/mesh/mesh_ops.c7
-rw-r--r--source/blender/editors/mesh/meshtools.c5
-rw-r--r--source/blender/editors/metaball/mball_edit.c12
-rw-r--r--source/blender/editors/metaball/mball_intern.h5
-rw-r--r--source/blender/editors/metaball/mball_ops.c7
-rw-r--r--source/blender/editors/object/object_add.c56
-rw-r--r--source/blender/editors/object/object_bake.c7
-rw-r--r--source/blender/editors/object/object_constraint.c20
-rw-r--r--source/blender/editors/object/object_edit.c13
-rw-r--r--source/blender/editors/object/object_group.c5
-rw-r--r--source/blender/editors/object/object_hook.c5
-rw-r--r--source/blender/editors/object/object_intern.h5
-rw-r--r--source/blender/editors/object/object_lattice.c7
-rw-r--r--source/blender/editors/object/object_modifier.c21
-rw-r--r--source/blender/editors/object/object_ops.c5
-rw-r--r--source/blender/editors/object/object_relations.c36
-rw-r--r--source/blender/editors/object/object_select.c18
-rw-r--r--source/blender/editors/object/object_shapekey.c5
-rw-r--r--source/blender/editors/object/object_transform.c64
-rw-r--r--source/blender/editors/object/object_vgroup.c54
-rw-r--r--source/blender/editors/physics/CMakeLists.txt1
-rw-r--r--source/blender/editors/physics/particle_boids.c5
-rw-r--r--source/blender/editors/physics/particle_edit.c157
-rw-r--r--source/blender/editors/physics/particle_object.c7
-rw-r--r--source/blender/editors/physics/physics_fluid.c31
-rw-r--r--source/blender/editors/physics/physics_intern.h5
-rw-r--r--source/blender/editors/physics/physics_ops.c7
-rw-r--r--source/blender/editors/physics/physics_pointcache.c5
-rw-r--r--source/blender/editors/render/CMakeLists.txt2
-rw-r--r--source/blender/editors/render/render_intern.h5
-rw-r--r--source/blender/editors/render/render_internal.c23
-rw-r--r--source/blender/editors/render/render_opengl.c29
-rw-r--r--source/blender/editors/render/render_ops.c5
-rw-r--r--source/blender/editors/render/render_preview.c85
-rw-r--r--source/blender/editors/render/render_shading.c16
-rw-r--r--source/blender/editors/screen/CMakeLists.txt1
-rw-r--r--source/blender/editors/screen/area.c44
-rw-r--r--source/blender/editors/screen/glutil.c27
-rw-r--r--source/blender/editors/screen/screen_context.c13
-rw-r--r--source/blender/editors/screen/screen_edit.c62
-rw-r--r--source/blender/editors/screen/screen_intern.h5
-rw-r--r--source/blender/editors/screen/screen_ops.c412
-rw-r--r--source/blender/editors/screen/screendump.c5
-rw-r--r--source/blender/editors/sculpt_paint/CMakeLists.txt1
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c92
-rw-r--r--source/blender/editors/sculpt_paint/paint_intern.h7
-rw-r--r--source/blender/editors/sculpt_paint/paint_ops.c251
-rw-r--r--source/blender/editors/sculpt_paint/paint_stroke.c51
-rw-r--r--source/blender/editors/sculpt_paint/paint_undo.c5
-rw-r--r--source/blender/editors/sculpt_paint/paint_utils.c9
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c70
-rw-r--r--source/blender/editors/sculpt_paint/sculpt.c380
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_intern.h11
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_undo.c37
-rw-r--r--source/blender/editors/sound/sound_intern.h5
-rw-r--r--source/blender/editors/sound/sound_ops.c5
-rw-r--r--source/blender/editors/space_action/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_action/action_draw.c5
-rw-r--r--source/blender/editors/space_action/action_edit.c141
-rw-r--r--source/blender/editors/space_action/action_intern.h8
-rw-r--r--source/blender/editors/space_action/action_ops.c28
-rw-r--r--source/blender/editors/space_action/action_select.c25
-rw-r--r--source/blender/editors/space_action/space_action.c7
-rw-r--r--source/blender/editors/space_api/space.c5
-rw-r--r--source/blender/editors/space_api/spacetypes.c13
-rw-r--r--source/blender/editors/space_buttons/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_buttons/buttons_context.c11
-rw-r--r--source/blender/editors/space_buttons/buttons_header.c5
-rw-r--r--source/blender/editors/space_buttons/buttons_intern.h5
-rw-r--r--source/blender/editors/space_buttons/buttons_ops.c12
-rw-r--r--source/blender/editors/space_buttons/space_buttons.c13
-rw-r--r--source/blender/editors/space_console/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_console/console_draw.c5
-rw-r--r--source/blender/editors/space_console/console_intern.h5
-rw-r--r--source/blender/editors/space_console/console_ops.c7
-rw-r--r--source/blender/editors/space_console/space_console.c6
-rw-r--r--source/blender/editors/space_file/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_file/file_draw.c102
-rw-r--r--source/blender/editors/space_file/file_intern.h5
-rw-r--r--source/blender/editors/space_file/file_ops.c325
-rw-r--r--source/blender/editors/space_file/file_panels.c9
-rw-r--r--source/blender/editors/space_file/filelist.c120
-rw-r--r--source/blender/editors/space_file/filelist.h23
-rw-r--r--source/blender/editors/space_file/filesel.c107
-rw-r--r--source/blender/editors/space_file/fsmenu.c23
-rw-r--r--source/blender/editors/space_file/fsmenu.h5
-rw-r--r--source/blender/editors/space_file/space_file.c11
-rw-r--r--source/blender/editors/space_graph/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_graph/graph_buttons.c67
-rw-r--r--source/blender/editors/space_graph/graph_draw.c5
-rw-r--r--source/blender/editors/space_graph/graph_edit.c195
-rw-r--r--source/blender/editors/space_graph/graph_intern.h9
-rw-r--r--source/blender/editors/space_graph/graph_ops.c25
-rw-r--r--source/blender/editors/space_graph/graph_select.c38
-rw-r--r--source/blender/editors/space_graph/graph_utils.c5
-rw-r--r--source/blender/editors/space_graph/space_graph.c7
-rw-r--r--source/blender/editors/space_image/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_image/image_buttons.c76
-rw-r--r--source/blender/editors/space_image/image_draw.c34
-rw-r--r--source/blender/editors/space_image/image_header.c16
-rw-r--r--source/blender/editors/space_image/image_intern.h5
-rw-r--r--source/blender/editors/space_image/image_ops.c107
-rw-r--r--source/blender/editors/space_image/image_render.c5
-rw-r--r--source/blender/editors/space_image/space_image.c13
-rw-r--r--source/blender/editors/space_info/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_info/info_draw.c5
-rw-r--r--source/blender/editors/space_info/info_intern.h5
-rw-r--r--source/blender/editors/space_info/info_ops.c32
-rw-r--r--source/blender/editors/space_info/info_report.c5
-rw-r--r--source/blender/editors/space_info/info_stats.c5
-rw-r--r--source/blender/editors/space_info/space_info.c9
-rw-r--r--source/blender/editors/space_info/textview.c5
-rw-r--r--source/blender/editors/space_info/textview.h5
-rw-r--r--source/blender/editors/space_logic/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_logic/logic_buttons.c5
-rw-r--r--source/blender/editors/space_logic/logic_intern.h5
-rw-r--r--source/blender/editors/space_logic/logic_ops.c5
-rw-r--r--source/blender/editors/space_logic/logic_window.c581
-rw-r--r--source/blender/editors/space_logic/space_logic.c5
-rw-r--r--source/blender/editors/space_nla/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_nla/nla_buttons.c59
-rw-r--r--source/blender/editors/space_nla/nla_channels.c5
-rw-r--r--source/blender/editors/space_nla/nla_draw.c17
-rw-r--r--source/blender/editors/space_nla/nla_edit.c14
-rw-r--r--source/blender/editors/space_nla/nla_intern.h5
-rw-r--r--source/blender/editors/space_nla/nla_ops.c5
-rw-r--r--source/blender/editors/space_nla/nla_select.c9
-rw-r--r--source/blender/editors/space_nla/space_nla.c5
-rw-r--r--source/blender/editors/space_node/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_node/drawnode.c425
-rw-r--r--source/blender/editors/space_node/node_buttons.c9
-rw-r--r--source/blender/editors/space_node/node_draw.c34
-rw-r--r--source/blender/editors/space_node/node_edit.c58
-rw-r--r--source/blender/editors/space_node/node_header.c13
-rw-r--r--source/blender/editors/space_node/node_intern.h19
-rw-r--r--source/blender/editors/space_node/node_ops.c5
-rw-r--r--source/blender/editors/space_node/node_select.c5
-rw-r--r--source/blender/editors/space_node/node_state.c5
-rw-r--r--source/blender/editors/space_node/space_node.c8
-rw-r--r--source/blender/editors/space_outliner/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_outliner/outliner.c21
-rw-r--r--source/blender/editors/space_outliner/outliner_intern.h5
-rw-r--r--source/blender/editors/space_outliner/outliner_ops.c5
-rw-r--r--source/blender/editors/space_outliner/space_outliner.c5
-rw-r--r--source/blender/editors/space_script/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_script/script_edit.c5
-rw-r--r--source/blender/editors/space_script/script_header.c5
-rw-r--r--source/blender/editors/space_script/script_intern.h5
-rw-r--r--source/blender/editors/space_script/script_ops.c5
-rw-r--r--source/blender/editors/space_script/space_script.c5
-rw-r--r--source/blender/editors/space_sequencer/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_sequencer/sequencer_add.c5
-rw-r--r--source/blender/editors/space_sequencer/sequencer_buttons.c5
-rw-r--r--source/blender/editors/space_sequencer/sequencer_draw.c53
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c109
-rw-r--r--source/blender/editors/space_sequencer/sequencer_intern.h5
-rw-r--r--source/blender/editors/space_sequencer/sequencer_ops.c20
-rw-r--r--source/blender/editors/space_sequencer/sequencer_scopes.c86
-rw-r--r--source/blender/editors/space_sequencer/sequencer_select.c5
-rw-r--r--source/blender/editors/space_sequencer/space_sequencer.c5
-rw-r--r--source/blender/editors/space_sound/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_sound/sound_header.c5
-rw-r--r--source/blender/editors/space_sound/sound_intern.h5
-rw-r--r--source/blender/editors/space_sound/space_sound.c5
-rw-r--r--source/blender/editors/space_text/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_text/space_text.c6
-rw-r--r--source/blender/editors/space_text/text_draw.c9
-rw-r--r--source/blender/editors/space_text/text_header.c57
-rw-r--r--source/blender/editors/space_text/text_intern.h5
-rw-r--r--source/blender/editors/space_text/text_ops.c70
-rw-r--r--source/blender/editors/space_text/text_python.c5
-rw-r--r--source/blender/editors/space_time/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_time/space_time.c11
-rw-r--r--source/blender/editors/space_time/time_intern.h5
-rw-r--r--source/blender/editors/space_time/time_ops.c5
-rw-r--r--source/blender/editors/space_userpref/space_userpref.c10
-rw-r--r--source/blender/editors/space_userpref/userpref_intern.h5
-rw-r--r--source/blender/editors/space_userpref/userpref_ops.c5
-rw-r--r--source/blender/editors/space_view3d/CMakeLists.txt1
-rw-r--r--source/blender/editors/space_view3d/drawanimviz.c5
-rw-r--r--source/blender/editors/space_view3d/drawarmature.c19
-rw-r--r--source/blender/editors/space_view3d/drawmesh.c10
-rw-r--r--source/blender/editors/space_view3d/drawobject.c324
-rw-r--r--source/blender/editors/space_view3d/drawvolume.c5
-rw-r--r--source/blender/editors/space_view3d/space_view3d.c19
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c147
-rw-r--r--source/blender/editors/space_view3d/view3d_draw.c114
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c69
-rw-r--r--source/blender/editors/space_view3d/view3d_fly.c46
-rw-r--r--source/blender/editors/space_view3d/view3d_header.c66
-rw-r--r--source/blender/editors/space_view3d/view3d_intern.h5
-rw-r--r--source/blender/editors/space_view3d/view3d_ops.c26
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c35
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c39
-rw-r--r--source/blender/editors/space_view3d/view3d_toolbar.c9
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c131
-rw-r--r--source/blender/editors/transform/CMakeLists.txt1
-rw-r--r--source/blender/editors/transform/transform.c143
-rw-r--r--source/blender/editors/transform/transform.h5
-rw-r--r--source/blender/editors/transform/transform_constraints.c19
-rw-r--r--source/blender/editors/transform/transform_conversions.c492
-rw-r--r--source/blender/editors/transform/transform_generics.c11
-rw-r--r--source/blender/editors/transform/transform_input.c12
-rw-r--r--source/blender/editors/transform/transform_manipulator.c40
-rw-r--r--source/blender/editors/transform/transform_ndofinput.c5
-rw-r--r--source/blender/editors/transform/transform_ops.c106
-rw-r--r--source/blender/editors/transform/transform_orientations.c5
-rw-r--r--source/blender/editors/transform/transform_snap.c23
-rw-r--r--source/blender/editors/util/crazyspace.c81
-rw-r--r--source/blender/editors/util/ed_util.c32
-rw-r--r--source/blender/editors/util/editmode_undo.c5
-rw-r--r--source/blender/editors/util/numinput.c11
-rw-r--r--source/blender/editors/util/undo.c13
-rw-r--r--source/blender/editors/util/util_intern.h5
-rw-r--r--source/blender/editors/uvedit/CMakeLists.txt1
-rw-r--r--source/blender/editors/uvedit/uvedit_draw.c119
-rw-r--r--source/blender/editors/uvedit/uvedit_intern.h5
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c234
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.c91
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.h3
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c71
-rw-r--r--source/blender/gpu/CMakeLists.txt2
-rw-r--r--source/blender/gpu/GPU_extensions.h10
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c5
-rw-r--r--source/blender/gpu/intern/gpu_codegen.c9
-rw-r--r--source/blender/gpu/intern/gpu_codegen.h5
-rw-r--r--source/blender/gpu/intern/gpu_draw.c29
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c80
-rw-r--r--source/blender/gpu/intern/gpu_material.c82
-rw-r--r--source/blender/gpu/intern/gpu_shader_material.glsl.c3
-rw-r--r--source/blender/gpu/intern/gpu_shader_vertex.glsl.c3
-rw-r--r--source/blender/ikplugin/BIK_api.h5
-rw-r--r--source/blender/ikplugin/intern/ikplugin_api.c5
-rw-r--r--source/blender/ikplugin/intern/ikplugin_api.h5
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.c7
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.h5
-rw-r--r--source/blender/ikplugin/intern/itasc_plugin.cpp7
-rw-r--r--source/blender/ikplugin/intern/itasc_plugin.h5
-rw-r--r--source/blender/imbuf/IMB_imbuf.h5
-rw-r--r--source/blender/imbuf/IMB_thumbs.h5
-rw-r--r--source/blender/imbuf/intern/IMB_anim.h5
-rw-r--r--source/blender/imbuf/intern/IMB_filetype.h5
-rw-r--r--source/blender/imbuf/intern/IMB_metadata.h5
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c19
-rw-r--r--source/blender/imbuf/intern/anim_movie.c31
-rw-r--r--source/blender/imbuf/intern/bmp.c9
-rw-r--r--source/blender/imbuf/intern/cache.c5
-rw-r--r--source/blender/imbuf/intern/cineon/cin_debug_stuff.h3
-rw-r--r--source/blender/imbuf/intern/cineon/cineon_dpx.c5
-rw-r--r--source/blender/imbuf/intern/cineon/cineonfile.h3
-rw-r--r--source/blender/imbuf/intern/cineon/cineonlib.c6
-rw-r--r--source/blender/imbuf/intern/cineon/cineonlib.h3
-rw-r--r--source/blender/imbuf/intern/cineon/dpxfile.h3
-rw-r--r--source/blender/imbuf/intern/cineon/dpxlib.c3
-rw-r--r--source/blender/imbuf/intern/cineon/dpxlib.h3
-rw-r--r--source/blender/imbuf/intern/cineon/logImageCore.c3
-rw-r--r--source/blender/imbuf/intern/cineon/logImageCore.h3
-rw-r--r--source/blender/imbuf/intern/cineon/logImageLib.c3
-rw-r--r--source/blender/imbuf/intern/cineon/logImageLib.h3
-rw-r--r--source/blender/imbuf/intern/cineon/logmemfile.c3
-rw-r--r--source/blender/imbuf/intern/cineon/logmemfile.h3
-rw-r--r--source/blender/imbuf/intern/dds/BlockDXT.cpp5
-rw-r--r--source/blender/imbuf/intern/dds/BlockDXT.h5
-rw-r--r--source/blender/imbuf/intern/dds/Color.h5
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.cpp5
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.h5
-rw-r--r--source/blender/imbuf/intern/dds/Common.h5
-rw-r--r--source/blender/imbuf/intern/dds/DirectDrawSurface.cpp5
-rw-r--r--source/blender/imbuf/intern/dds/DirectDrawSurface.h5
-rw-r--r--source/blender/imbuf/intern/dds/Image.cpp5
-rw-r--r--source/blender/imbuf/intern/dds/Image.h5
-rw-r--r--source/blender/imbuf/intern/dds/PixelFormat.h5
-rw-r--r--source/blender/imbuf/intern/dds/Stream.cpp5
-rw-r--r--source/blender/imbuf/intern/dds/Stream.h5
-rw-r--r--source/blender/imbuf/intern/dds/dds_api.cpp5
-rw-r--r--source/blender/imbuf/intern/dds/dds_api.h5
-rw-r--r--source/blender/imbuf/intern/divers.c15
-rw-r--r--source/blender/imbuf/intern/filetype.c7
-rw-r--r--source/blender/imbuf/intern/filter.c5
-rw-r--r--source/blender/imbuf/intern/imageprocess.c21
-rw-r--r--source/blender/imbuf/intern/imbuf.h5
-rw-r--r--source/blender/imbuf/intern/iris.c13
-rw-r--r--source/blender/imbuf/intern/jp2.c5
-rw-r--r--source/blender/imbuf/intern/jpeg.c35
-rw-r--r--source/blender/imbuf/intern/md5.c3
-rw-r--r--source/blender/imbuf/intern/md5.h3
-rw-r--r--source/blender/imbuf/intern/metadata.c5
-rw-r--r--source/blender/imbuf/intern/module.c5
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp3
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.h5
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_multi.h5
-rw-r--r--source/blender/imbuf/intern/png.c25
-rw-r--r--source/blender/imbuf/intern/radiance_hdr.c5
-rw-r--r--source/blender/imbuf/intern/readimage.c17
-rw-r--r--source/blender/imbuf/intern/rectop.c17
-rw-r--r--source/blender/imbuf/intern/rotate.c7
-rw-r--r--source/blender/imbuf/intern/scaling.c186
-rw-r--r--source/blender/imbuf/intern/targa.c21
-rw-r--r--source/blender/imbuf/intern/thumbs.c38
-rw-r--r--source/blender/imbuf/intern/thumbs_blend.c5
-rw-r--r--source/blender/imbuf/intern/tiff.c7
-rw-r--r--source/blender/imbuf/intern/util.c5
-rw-r--r--source/blender/imbuf/intern/writeimage.c5
-rw-r--r--source/blender/makesdna/DNA_action_types.h8
-rw-r--r--source/blender/makesdna/DNA_anim_types.h2
-rw-r--r--source/blender/makesdna/DNA_gpencil_types.h2
-rw-r--r--source/blender/makesdna/DNA_material_types.h8
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h20
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h7
-rw-r--r--source/blender/makesdna/DNA_node_types.h3
-rw-r--r--source/blender/makesdna/DNA_object_types.h8
-rw-r--r--source/blender/makesdna/DNA_particle_types.h38
-rw-r--r--source/blender/makesdna/DNA_scene_types.h20
-rw-r--r--source/blender/makesdna/DNA_screen_types.h2
-rw-r--r--source/blender/makesdna/DNA_space_types.h25
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h4
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h6
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h3
-rw-r--r--source/blender/makesdna/intern/dna_genfile.c16
-rw-r--r--source/blender/makesdna/intern/makesdna.c6
-rw-r--r--source/blender/makesrna/RNA_access.h12
-rw-r--r--source/blender/makesrna/RNA_documentation.h3
-rw-r--r--source/blender/makesrna/RNA_enum_types.h9
-rw-r--r--source/blender/makesrna/RNA_types.h36
-rw-r--r--source/blender/makesrna/SConscript4
-rw-r--r--source/blender/makesrna/intern/CMakeLists.txt6
-rw-r--r--source/blender/makesrna/intern/SConscript4
-rw-r--r--source/blender/makesrna/intern/makesrna.c8
-rw-r--r--source/blender/makesrna/intern/rna_ID.c7
-rw-r--r--source/blender/makesrna/intern/rna_access.c197
-rw-r--r--source/blender/makesrna/intern/rna_action.c19
-rw-r--r--source/blender/makesrna/intern/rna_action_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_actuator.c29
-rw-r--r--source/blender/makesrna/intern/rna_actuator_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_animation.c12
-rw-r--r--source/blender/makesrna/intern/rna_animation_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_animviz.c5
-rw-r--r--source/blender/makesrna/intern/rna_armature.c7
-rw-r--r--source/blender/makesrna/intern/rna_armature_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_boid.c7
-rw-r--r--source/blender/makesrna/intern/rna_brush.c36
-rw-r--r--source/blender/makesrna/intern/rna_camera.c5
-rw-r--r--source/blender/makesrna/intern/rna_cloth.c5
-rw-r--r--source/blender/makesrna/intern/rna_color.c7
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c176
-rw-r--r--source/blender/makesrna/intern/rna_context.c5
-rw-r--r--source/blender/makesrna/intern/rna_controller.c7
-rw-r--r--source/blender/makesrna/intern/rna_controller_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_curve.c17
-rw-r--r--source/blender/makesrna/intern/rna_define.c34
-rw-r--r--source/blender/makesrna/intern/rna_fcurve.c28
-rw-r--r--source/blender/makesrna/intern/rna_fcurve_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_fluidsim.c5
-rw-r--r--source/blender/makesrna/intern/rna_gpencil.c105
-rw-r--r--source/blender/makesrna/intern/rna_group.c5
-rw-r--r--source/blender/makesrna/intern/rna_image.c82
-rw-r--r--source/blender/makesrna/intern/rna_image_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_internal.h5
-rw-r--r--source/blender/makesrna/intern/rna_internal_types.h7
-rw-r--r--source/blender/makesrna/intern/rna_key.c23
-rw-r--r--source/blender/makesrna/intern/rna_lamp.c35
-rw-r--r--source/blender/makesrna/intern/rna_lattice.c5
-rw-r--r--source/blender/makesrna/intern/rna_main.c25
-rw-r--r--source/blender/makesrna/intern/rna_main_api.c30
-rw-r--r--source/blender/makesrna/intern/rna_material.c96
-rw-r--r--source/blender/makesrna/intern/rna_material_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_mesh.c6
-rw-r--r--source/blender/makesrna/intern/rna_mesh_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_meta.c9
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c33
-rw-r--r--source/blender/makesrna/intern/rna_nla.c15
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c108
-rw-r--r--source/blender/makesrna/intern/rna_nodetree_types.h5
-rw-r--r--source/blender/makesrna/intern/rna_object.c11
-rw-r--r--source/blender/makesrna/intern/rna_object_api.c39
-rw-r--r--source/blender/makesrna/intern/rna_object_force.c13
-rw-r--r--source/blender/makesrna/intern/rna_packedfile.c5
-rw-r--r--source/blender/makesrna/intern/rna_particle.c200
-rw-r--r--source/blender/makesrna/intern/rna_pose.c9
-rw-r--r--source/blender/makesrna/intern/rna_pose_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_property.c5
-rw-r--r--source/blender/makesrna/intern/rna_render.c17
-rw-r--r--source/blender/makesrna/intern/rna_rna.c14
-rw-r--r--source/blender/makesrna/intern/rna_scene.c63
-rw-r--r--source/blender/makesrna/intern/rna_scene_api.c26
-rw-r--r--source/blender/makesrna/intern/rna_screen.c15
-rw-r--r--source/blender/makesrna/intern/rna_sculpt_paint.c7
-rw-r--r--source/blender/makesrna/intern/rna_sensor.c10
-rw-r--r--source/blender/makesrna/intern/rna_sensor_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_sequencer.c7
-rw-r--r--source/blender/makesrna/intern/rna_sequencer_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_smoke.c5
-rw-r--r--source/blender/makesrna/intern/rna_sound.c5
-rw-r--r--source/blender/makesrna/intern/rna_space.c25
-rw-r--r--source/blender/makesrna/intern/rna_test.c5
-rw-r--r--source/blender/makesrna/intern/rna_text.c5
-rw-r--r--source/blender/makesrna/intern/rna_text_api.c5
-rw-r--r--source/blender/makesrna/intern/rna_texture.c15
-rw-r--r--source/blender/makesrna/intern/rna_timeline.c5
-rw-r--r--source/blender/makesrna/intern/rna_ui.c17
-rw-r--r--source/blender/makesrna/intern/rna_ui_api.c7
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c17
-rw-r--r--source/blender/makesrna/intern/rna_vfont.c5
-rw-r--r--source/blender/makesrna/intern/rna_wm.c88
-rw-r--r--source/blender/makesrna/intern/rna_wm_api.c42
-rw-r--r--source/blender/makesrna/intern/rna_world.c16
-rw-r--r--source/blender/modifiers/intern/MOD_armature.c12
-rw-r--r--source/blender/modifiers/intern/MOD_array.c20
-rw-r--r--source/blender/modifiers/intern/MOD_bevel.c22
-rw-r--r--source/blender/modifiers/intern/MOD_boolean.c21
-rw-r--r--source/blender/modifiers/intern/MOD_build.c2
-rw-r--r--source/blender/modifiers/intern/MOD_cast.c32
-rw-r--r--source/blender/modifiers/intern/MOD_cloth.c18
-rw-r--r--source/blender/modifiers/intern/MOD_collision.c41
-rw-r--r--source/blender/modifiers/intern/MOD_curve.c16
-rw-r--r--source/blender/modifiers/intern/MOD_decimate.c26
-rw-r--r--source/blender/modifiers/intern/MOD_displace.c10
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c204
-rw-r--r--source/blender/modifiers/intern/MOD_explode.c57
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim.c20
-rw-r--r--source/blender/modifiers/intern/MOD_hook.c18
-rw-r--r--source/blender/modifiers/intern/MOD_lattice.c18
-rw-r--r--source/blender/modifiers/intern/MOD_mask.c22
-rw-r--r--source/blender/modifiers/intern/MOD_meshdeform.c16
-rw-r--r--source/blender/modifiers/intern/MOD_mirror.c20
-rw-r--r--source/blender/modifiers/intern/MOD_multires.c26
-rw-r--r--source/blender/modifiers/intern/MOD_none.c33
-rw-r--r--source/blender/modifiers/intern/MOD_particleinstance.c32
-rw-r--r--source/blender/modifiers/intern/MOD_particlesystem.c38
-rw-r--r--source/blender/modifiers/intern/MOD_screw.c20
-rw-r--r--source/blender/modifiers/intern/MOD_shrinkwrap.c16
-rw-r--r--source/blender/modifiers/intern/MOD_simpledeform.c28
-rw-r--r--source/blender/modifiers/intern/MOD_smoke.c33
-rw-r--r--source/blender/modifiers/intern/MOD_smooth.c24
-rw-r--r--source/blender/modifiers/intern/MOD_softbody.c30
-rw-r--r--source/blender/modifiers/intern/MOD_solidify.c39
-rw-r--r--source/blender/modifiers/intern/MOD_subsurf.c22
-rw-r--r--source/blender/modifiers/intern/MOD_surface.c24
-rw-r--r--source/blender/modifiers/intern/MOD_uvproject.c18
-rw-r--r--source/blender/modifiers/intern/MOD_wave.c26
-rw-r--r--source/blender/nodes/CMakeLists.txt2
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_blur.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_brightness.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c9
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c9
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_composite.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_crop.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_curves.c13
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_defocus.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_dilate.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_displace.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_filter.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_flip.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_gamma.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_glare.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_idMask.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_image.c27
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_invert.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_levels.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c7
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_math.c7
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_normal.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_normalize.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_rgb.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_rotate.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_scale.c7
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_texture.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_translate.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_value.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c7
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_viewer.c5
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c5
-rw-r--r--source/blender/nodes/intern/CMP_util.c7
-rw-r--r--source/blender/nodes/intern/CMP_util.h5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_camera.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_curves.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_geom.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c9
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_invert.c7
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_mapping.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_material.c7
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_math.c9
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_normal.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_output.c7
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_rgb.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_texture.c7
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_value.c5
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c5
-rw-r--r--source/blender/nodes/intern/SHD_util.c5
-rw-r--r--source/blender/nodes/intern/SHD_util.h5
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_at.c8
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_bricks.c9
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_checker.c14
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_compose.c8
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_coord.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_curves.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_decompose.c8
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_distance.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c12
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_image.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_invert.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_math.c13
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_output.c12
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_proc.c27
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_rotate.c10
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_scale.c5
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_texture.c7
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_translate.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c6
-rw-r--r--source/blender/nodes/intern/TEX_nodes/TEX_viewer.c8
-rw-r--r--source/blender/nodes/intern/TEX_util.c7
-rw-r--r--source/blender/nodes/intern/TEX_util.h5
-rw-r--r--source/blender/nodes/intern/node_util.c7
-rw-r--r--source/blender/nodes/intern/node_util.h5
-rw-r--r--source/blender/python/BPY_extern.h4
-rw-r--r--source/blender/python/SConscript31
-rw-r--r--source/blender/python/generic/CMakeLists.txt2
-rw-r--r--source/blender/python/generic/IDProp.c38
-rw-r--r--source/blender/python/generic/IDProp.h5
-rw-r--r--source/blender/python/generic/bgl.c23
-rw-r--r--source/blender/python/generic/bgl.h5
-rw-r--r--source/blender/python/generic/blf_py_api.c5
-rw-r--r--source/blender/python/generic/blf_py_api.h5
-rw-r--r--source/blender/python/generic/bpy_internal_import.c173
-rw-r--r--source/blender/python/generic/bpy_internal_import.h9
-rw-r--r--source/blender/python/generic/mathutils.c132
-rw-r--r--source/blender/python/generic/mathutils.h13
-rw-r--r--source/blender/python/generic/mathutils_Color.c43
-rw-r--r--source/blender/python/generic/mathutils_Color.h5
-rw-r--r--source/blender/python/generic/mathutils_Euler.c47
-rw-r--r--source/blender/python/generic/mathutils_Euler.h5
-rw-r--r--source/blender/python/generic/mathutils_Matrix.c147
-rw-r--r--source/blender/python/generic/mathutils_Matrix.h5
-rw-r--r--source/blender/python/generic/mathutils_Quaternion.c111
-rw-r--r--source/blender/python/generic/mathutils_Quaternion.h5
-rw-r--r--source/blender/python/generic/mathutils_Vector.c239
-rw-r--r--source/blender/python/generic/mathutils_Vector.h5
-rw-r--r--source/blender/python/generic/mathutils_geometry.c43
-rw-r--r--source/blender/python/generic/mathutils_geometry.h5
-rw-r--r--source/blender/python/generic/noise_py_api.c9
-rw-r--r--source/blender/python/generic/noise_py_api.h5
-rw-r--r--source/blender/python/generic/py_capi_utils.c56
-rw-r--r--source/blender/python/generic/py_capi_utils.h6
-rw-r--r--source/blender/python/intern/CMakeLists.txt7
-rw-r--r--source/blender/python/intern/bpy.c87
-rw-r--r--source/blender/python/intern/bpy.h5
-rw-r--r--source/blender/python/intern/bpy_app.c28
-rw-r--r--source/blender/python/intern/bpy_app.h5
-rw-r--r--source/blender/python/intern/bpy_driver.c38
-rw-r--r--source/blender/python/intern/bpy_driver.h5
-rw-r--r--source/blender/python/intern/bpy_interface.c164
-rw-r--r--source/blender/python/intern/bpy_library.c367
-rw-r--r--source/blender/python/intern/bpy_operator.c34
-rw-r--r--source/blender/python/intern/bpy_operator.h5
-rw-r--r--source/blender/python/intern/bpy_operator_wrap.c34
-rw-r--r--source/blender/python/intern/bpy_operator_wrap.h5
-rw-r--r--source/blender/python/intern/bpy_props.c78
-rw-r--r--source/blender/python/intern/bpy_props.h5
-rw-r--r--source/blender/python/intern/bpy_rna.c1851
-rw-r--r--source/blender/python/intern/bpy_rna.h88
-rw-r--r--source/blender/python/intern/bpy_rna_anim.c354
-rw-r--r--source/blender/python/intern/bpy_rna_anim.h37
-rw-r--r--source/blender/python/intern/bpy_rna_array.c55
-rw-r--r--source/blender/python/intern/bpy_rna_callback.c13
-rw-r--r--source/blender/python/intern/bpy_rna_callback.h5
-rw-r--r--source/blender/python/intern/bpy_traceback.c8
-rw-r--r--source/blender/python/intern/bpy_traceback.h5
-rw-r--r--source/blender/python/intern/bpy_util.c21
-rw-r--r--source/blender/python/intern/bpy_util.h11
-rw-r--r--source/blender/python/intern/stubs.c5
-rw-r--r--source/blender/quicktime/apple/quicktime_export.c5
-rw-r--r--source/blender/quicktime/apple/quicktime_import.c5
-rw-r--r--source/blender/quicktime/quicktime_export.h5
-rw-r--r--source/blender/quicktime/quicktime_import.h5
-rw-r--r--source/blender/readblenfile/BLO_readblenfile.h2
-rw-r--r--source/blender/readblenfile/intern/BLO_readblenfile.c2
-rw-r--r--source/blender/readblenfile/stub/BLO_readblenfileSTUB.c5
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h1
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h1
-rw-r--r--source/blender/render/intern/include/envmap.h5
-rw-r--r--source/blender/render/intern/include/gammaCorrectionTables.h5
-rw-r--r--source/blender/render/intern/include/initrender.h5
-rw-r--r--source/blender/render/intern/include/occlusion.h5
-rw-r--r--source/blender/render/intern/include/pixelblending.h5
-rw-r--r--source/blender/render/intern/include/pixelshading.h5
-rw-r--r--source/blender/render/intern/include/pointdensity.h5
-rw-r--r--source/blender/render/intern/include/raycounter.h5
-rw-r--r--source/blender/render/intern/include/rayintersection.h5
-rw-r--r--source/blender/render/intern/include/rayobject.h5
-rw-r--r--source/blender/render/intern/include/render_types.h7
-rw-r--r--source/blender/render/intern/include/rendercore.h5
-rw-r--r--source/blender/render/intern/include/renderdatabase.h5
-rw-r--r--source/blender/render/intern/include/renderpipeline.h5
-rw-r--r--source/blender/render/intern/include/shadbuf.h5
-rw-r--r--source/blender/render/intern/include/shading.h5
-rw-r--r--source/blender/render/intern/include/sss.h5
-rw-r--r--source/blender/render/intern/include/strand.h5
-rw-r--r--source/blender/render/intern/include/sunsky.h5
-rw-r--r--source/blender/render/intern/include/texture.h23
-rw-r--r--source/blender/render/intern/include/volume_precache.h5
-rw-r--r--source/blender/render/intern/include/volumetric.h5
-rw-r--r--source/blender/render/intern/include/voxeldata.h5
-rw-r--r--source/blender/render/intern/include/zbuf.h5
-rw-r--r--source/blender/render/intern/raytrace/bvh.h8
-rw-r--r--source/blender/render/intern/raytrace/rayobject.cpp5
-rw-r--r--source/blender/render/intern/raytrace/rayobject_blibvh.cpp5
-rw-r--r--source/blender/render/intern/raytrace/rayobject_empty.cpp5
-rw-r--r--source/blender/render/intern/raytrace/rayobject_hint.h5
-rw-r--r--source/blender/render/intern/raytrace/rayobject_instance.cpp5
-rw-r--r--source/blender/render/intern/raytrace/rayobject_internal.h3
-rw-r--r--source/blender/render/intern/raytrace/rayobject_octree.cpp5
-rw-r--r--source/blender/render/intern/raytrace/rayobject_qbvh.cpp14
-rw-r--r--source/blender/render/intern/raytrace/rayobject_raycounter.cpp5
-rw-r--r--source/blender/render/intern/raytrace/rayobject_rtbuild.cpp17
-rw-r--r--source/blender/render/intern/raytrace/rayobject_rtbuild.h5
-rw-r--r--source/blender/render/intern/raytrace/rayobject_svbvh.cpp13
-rw-r--r--source/blender/render/intern/raytrace/rayobject_vbvh.cpp23
-rw-r--r--source/blender/render/intern/raytrace/reorganize.h10
-rw-r--r--source/blender/render/intern/raytrace/svbvh.h5
-rw-r--r--source/blender/render/intern/raytrace/vbvh.h12
-rw-r--r--source/blender/render/intern/source/convertblender.c168
-rw-r--r--source/blender/render/intern/source/envmap.c91
-rw-r--r--source/blender/render/intern/source/gammaCorrectionTables.c5
-rw-r--r--source/blender/render/intern/source/imagetexture.c89
-rw-r--r--source/blender/render/intern/source/initrender.c5
-rw-r--r--source/blender/render/intern/source/occlusion.c9
-rw-r--r--source/blender/render/intern/source/pipeline.c41
-rw-r--r--source/blender/render/intern/source/pixelblending.c5
-rw-r--r--source/blender/render/intern/source/pixelshading.c5
-rw-r--r--source/blender/render/intern/source/pointdensity.c15
-rw-r--r--source/blender/render/intern/source/rayshade.c21
-rw-r--r--source/blender/render/intern/source/render_texture.c44
-rw-r--r--source/blender/render/intern/source/rendercore.c8
-rw-r--r--source/blender/render/intern/source/renderdatabase.c17
-rw-r--r--source/blender/render/intern/source/shadbuf.c5
-rw-r--r--source/blender/render/intern/source/shadeinput.c10
-rw-r--r--source/blender/render/intern/source/shadeoutput.c112
-rw-r--r--source/blender/render/intern/source/sss.c5
-rw-r--r--source/blender/render/intern/source/strand.c34
-rw-r--r--source/blender/render/intern/source/sunsky.c7
-rw-r--r--source/blender/render/intern/source/volume_precache.c5
-rw-r--r--source/blender/render/intern/source/volumetric.c5
-rw-r--r--source/blender/render/intern/source/voxeldata.c5
-rw-r--r--source/blender/render/intern/source/zbuf.c5
-rw-r--r--source/blender/windowmanager/CMakeLists.txt2
-rw-r--r--source/blender/windowmanager/WM_api.h2
-rw-r--r--source/blender/windowmanager/WM_types.h1
-rw-r--r--source/blender/windowmanager/intern/wm_cursors.c24
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c65
-rw-r--r--source/blender/windowmanager/intern/wm_files.c43
-rw-r--r--source/blender/windowmanager/intern/wm_gesture.c2
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c22
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c2
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c234
-rw-r--r--source/blender/windowmanager/intern/wm_subwindow.c12
-rw-r--r--source/blender/windowmanager/intern/wm_window.c19
-rw-r--r--source/blender/windowmanager/wm_cursors.h6
-rw-r--r--source/blender/windowmanager/wm_event_types.h13
-rw-r--r--source/blenderplayer/CMakeLists.txt84
-rw-r--r--source/blenderplayer/bad_level_call_stubs/CMakeLists.txt1
-rw-r--r--source/blenderplayer/bad_level_call_stubs/SConscript4
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c47
-rw-r--r--source/creator/CMakeLists.txt755
-rw-r--r--source/creator/creator.c46
-rw-r--r--source/darwin/blender.app/Contents/Info.plist8
-rw-r--r--source/darwin/blendercreator.app/Contents/Info.plist53
-rw-r--r--source/darwin/blendercreator.app/Contents/MacOS/blendercreator1
-rw-r--r--source/darwin/blendercreator.app/Contents/PkgInfo1
-rw-r--r--source/darwin/blendercreator.app/Contents/Resources/blender creator icon.icnsbin189097 -> 0 bytes
-rw-r--r--source/darwin/blendercreator.app/Contents/Resources/blender file icon.icnsbin145836 -> 0 bytes
-rw-r--r--source/darwin/blenderplayer.app/Contents/Info.plist54
-rw-r--r--source/darwin/blenderpublisher.app/Contents/Info.plist53
-rw-r--r--source/darwin/blenderpublisher.app/Contents/MacOS/blenderpublisher1
-rw-r--r--source/darwin/blenderpublisher.app/Contents/PkgInfo1
-rw-r--r--source/darwin/blenderpublisher.app/Contents/Resources/blender file icon.icnsbin1721 -> 0 bytes
-rw-r--r--source/darwin/blenderpublisher.app/Contents/Resources/blender publisher icon.icnsbin1991 -> 0 bytes
-rw-r--r--source/gameengine/BlenderRoutines/CMakeLists.txt2
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp2
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderGL.cpp6
-rw-r--r--source/gameengine/Converter/BL_ArmatureChannel.cpp1
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp104
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp76
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.h13
-rw-r--r--source/gameengine/Converter/KX_ConvertActuators.cpp20
-rw-r--r--source/gameengine/Converter/KX_ConvertSensors.cpp8
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.cpp5
-rw-r--r--source/gameengine/Expressions/PyObjectPlus.h1
-rw-r--r--source/gameengine/GameLogic/SCA_JoystickSensor.cpp1
-rw-r--r--source/gameengine/GameLogic/SCA_PythonController.cpp34
-rw-r--r--source/gameengine/GamePlayer/common/CMakeLists.txt2
-rw-r--r--source/gameengine/GamePlayer/ghost/CMakeLists.txt2
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_ghost.cpp22
-rw-r--r--source/gameengine/Ketsji/CMakeLists.txt2
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.cpp11
-rw-r--r--source/gameengine/Ketsji/KX_BulletPhysicsController.h2
-rw-r--r--source/gameengine/Ketsji/KX_Camera.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp45
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_ObjectActuator.cpp22
-rw-r--r--source/gameengine/Ketsji/KX_PolygonMaterial.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_PyConstraintBinding.cpp18
-rw-r--r--source/gameengine/Ketsji/KX_PyMath.h6
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp255
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.h4
-rw-r--r--source/gameengine/Ketsji/KX_PythonSeq.cpp30
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp8
-rw-r--r--source/gameengine/Physics/Bullet/CMakeLists.txt2
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.h4
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp128
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h8
-rw-r--r--source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h1
-rw-r--r--source/gameengine/Rasterizer/CMakeLists.txt2
-rw-r--r--source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp2
-rw-r--r--source/gameengine/Rasterizer/RAS_IRasterizer.h6
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt2
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp14
-rw-r--r--source/gameengine/VideoTexture/CMakeLists.txt2
-rw-r--r--source/icons/SConscript13
-rw-r--r--source/icons/blender.exe.manifest10
-rw-r--r--source/icons/linuxcrossblender.rcscons2
-rw-r--r--source/icons/winblender.rc42
-rw-r--r--source/icons/winblender.rcscons2
-rw-r--r--source/tests/CMakeLists.txt126
-rw-r--r--source/tests/batch_import.py32
-rw-r--r--source/tests/bl_load_addons.py78
-rw-r--r--source/tests/bl_load_py_modules.py145
-rw-r--r--source/tests/bl_run_operators.py176
-rw-r--r--source/tests/bl_test.py4
-rw-r--r--source/tests/pep8.py15
1589 files changed, 82580 insertions, 47207 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 53d96c9fdcd..74fbff513c1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -44,11 +44,40 @@ endif()
cmake_minimum_required(VERSION 2.8)
+# this starts out unset
+set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/build_files/cmake/Modules/")
+
# quiet output for Makefiles, 'make -s' helps too
# set_property(GLOBAL PROPERTY RULE_MESSAGES OFF)
+# ignore system set flag, use our own
+# must be before project(...)
+# if the user wants to add their own its ok after first run.
+if(DEFINED CMAKE_C_STANDARD_LIBRARIES)
+ set(_reset_standard_libraries OFF)
+else()
+ set(_reset_standard_libraries ON)
+endif()
+
+
project(Blender)
+
+if (_reset_standard_libraries)
+ # Must come after project(...)
+ #
+ # MINGW workaround for -ladvapi32 being included which surprisingly causes
+ # string formatting of floats, eg: printf("%.*f", 3, value). to crash blender
+ # with a meaningless stack trace. by overriding this flag we ensure we only
+ # have libs we define and that cmake & scons builds match.
+ set(CMAKE_C_STANDARD_LIBRARIES "" CACHE STRING "" FORCE)
+ set(CMAKE_CXX_STANDARD_LIBRARIES "" CACHE STRING "" FORCE)
+ mark_as_advanced(CMAKE_C_STANDARD_LIBRARIES)
+ mark_as_advanced(CMAKE_CXX_STANDARD_LIBRARIES)
+endif()
+unset(_reset_standard_libraries)
+
+
enable_testing()
#-----------------------------------------------------------------------------
@@ -67,11 +96,13 @@ include(build_files/cmake/macros.cmake)
get_blender_version()
# Blender internal features
-option(WITH_INTERNATIONAL "Enable I18N (International fonts and text)" ON)
-option(WITH_PYTHON "Enable Embedded Python API" ON)
-option(WITH_PYTHON_MODULE "Enable building as a python module (experemental)" OFF)
-option(WITH_BUILDINFO "Include extra build details" ON)
-option(WITH_IK_ITASC "Enable ITASC IK solver" ON)
+option(WITH_INTERNATIONAL "Enable I18N (International fonts and text)" ON)
+option(WITH_PYTHON "Enable Embedded Python API (only disable for development)" ON)
+mark_as_advanced(WITH_PYTHON) # dont want people disabling this unless they really know what they are doing.
+option(WITH_PYTHON_SAFETY "Enable internal API error checking to track invalid data to prevent crash on access (at the expense of some effeciency, only enable for development)." OFF)
+option(WITH_PYTHON_MODULE "Enable building as a python module (experemental, only enable for development)" OFF)
+option(WITH_BUILDINFO "Include extra build details (only disable for development & faster builds)" ON)
+option(WITH_IK_ITASC "Enable ITASC IK solver (only disable for development & for incompatible C++ compilers)" ON)
option(WITH_FFTW3 "Enable FFTW3 support (Used for smoke and audio effects)" OFF)
option(WITH_BULLET "Enable Bullet (Physics Engine)" ON)
option(WITH_GAMEENGINE "Enable Game Engine" ON)
@@ -83,10 +114,20 @@ else()
option(WITH_OPENMP "Enable OpenMP (has to be supported by the compiler)" OFF)
endif()
+if(UNIX AND NOT APPLE)
+ option(WITH_X11_XINPUT "Enable X11 Xinput (tablet support)" ON)
+ option(WITH_BUILTIN_GLEW "Use GLEW OpenGL wrapper library bundled with blender" ON)
+else()
+ # not an option for other OS's
+ set(WITH_BUILTIN_GLEW ON)
+endif()
+
# Modifiers
option(WITH_MOD_FLUID "Enable Elbeem Modifier (Fluid Simulation)" ON)
option(WITH_MOD_DECIMATE "Enable Decimate Modifier" ON)
option(WITH_MOD_BOOLEAN "Enable Boolean Modifier" ON)
+option(WITH_MOD_CLOTH_ELTOPO "Enable Experemental cloth solver" OFF)
+mark_as_advanced(WITH_MOD_CLOTH_ELTOPO)
# Image format support
option(WITH_IMAGE_OPENEXR "Enable OpenEXR Support (http://www.openexr.com)" ON)
@@ -106,11 +147,7 @@ endif()
# 3D format support
# disable opencollada on non-apple unix because opencollada has no package for debian
-if(UNIX AND NOT APPLE)
- option(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org)" OFF)
-else()
- option(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org)" OFF)
-endif()
+option(WITH_OPENCOLLADA "Enable OpenCollada Support (http://www.opencollada.org)" OFF)
# Sound output
option(WITH_SDL "Enable SDL for sound and joystick support" ON)
@@ -124,17 +161,29 @@ option(WITH_LZMA "Enable best LZMA compression, (used for pointcache)"
# Misc
option(WITH_RAYOPTIMIZATION "Enable use of SIMD (SSE) optimizations for the raytracer" ON)
-option(WITH_INSTALL "Install accompanying scripts and language files needed to run blender" ON)
+if(UNIX AND NOT APPLE)
+ option(WITH_INSTALL_PORTABLE "Install redistributeable runtime, otherwise install into CMAKE_INSTALL_PREFIX" ON)
+endif()
option(WITH_PYTHON_INSTALL "Copy system python into the blender install folder" ON)
# Debug
-option(WITH_CXX_GUARDEDALLOC "Enable GuardedAlloc for C++ memory allocation tracking" OFF)
+option(WITH_CXX_GUARDEDALLOC "Enable GuardedAlloc for C++ memory allocation tracking (only enable for development)" OFF)
mark_as_advanced(WITH_CXX_GUARDEDALLOC)
option(WITH_ASSERT_ABORT "Call abort() when raising an assertion through BLI_assert()" OFF)
mark_as_advanced(WITH_ASSERT_ABORT)
if(APPLE)
+ if(NOT CMAKE_OSX_ARCHITECTURES)
+ set(CMAKE_OSX_ARCHITECTURES x86_64 CACHE STRING
+ "Choose the architecture you want to build Blender for: i386, x86_64 or ppc"
+ FORCE)
+ endif()
+ if(NOT CMAKE_OSX_DEPLOYMENT_TARGET)
+ set(CMAKE_OSX_DEPLOYMENT_TARGET 10.5 CACHE STRING
+ "Choose the minimum OSX version required: 10.4 or 10.5"
+ FORCE)
+ endif()
option(WITH_COCOA "Use Cocoa framework instead of deprecated Carbon" ON)
option(USE_QTKIT "Use QtKit instead of Carbon quicktime (needed for having partial quicktime for 64bit)" OFF)
option(WITH_LIBS10.5 "Use 10.5 libs (needed for 64bit builds)" OFF)
@@ -147,10 +196,6 @@ if(NOT WITH_GAMEENGINE AND WITH_PLAYER)
message(FATAL_ERROR "WITH_PLAYER requires WITH_GAMEENGINE")
endif()
-if(NOT WITH_INSTALL AND WITH_PYTHON_INSTALL)
- message("WARNING: WITH_PYTHON_INSTALL requires WITH_INSTALL")
-endif()
-
if(NOT WITH_SAMPLERATE AND (WITH_OPENAL OR WITH_SDL OR WITH_JACK))
message(FATAL_ERROR "WITH_OPENAL/WITH_SDL/WITH_JACK require WITH_SAMPLERATE")
endif()
@@ -168,6 +213,9 @@ if(WITH_PYTHON_MODULE AND WITH_PYTHON_INSTALL)
message(FATAL_ERROR "WITH_PYTHON_MODULE requires WITH_PYTHON_INSTALL to be OFF")
endif()
+# remove old vars
+unset(WITH_INSTALL CACHE)
+
TEST_SSE_SUPPORT()
#-----------------------------------------------------------------------------
@@ -186,9 +234,17 @@ set(CXX_WARNINGS "")
# For alternate Python locations the commandline can be used to override detected/default cache settings, e.g:
# On Unix:
-# cmake -D PYTHON_LIBRARY=/usr/local/lib/python3.1/config/libpython3.1.so -D PYTHON_INCLUDE_DIRS=/usr/local/include/python3.1 -G "Unix Makefiles" ../blender
+# cmake ../blender \
+# -D PYTHON_VERSION=3.2 \
+# -D PYTHON_INCLUDE_DIRS=/opt/py32/include/python3.2d \
+# -D PYTHON_LIBPATH=/opt/py32/lib \
+# -D PYTHON_LIBRARY=python3.2d
+#
# On Macs:
-# cmake -D PYTHON_INCLUDE_DIRS=/System/Library/Frameworks/Python.framework/Versions/3.1/include/python3.1 -D PYTHON_LIBPATH=/System/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/config -G Xcode ../blender
+# cmake ../blender \
+# -D PYTHON_INCLUDE_DIRS=/System/Library/Frameworks/Python.framework/Versions/3.2/include/python3.2 \
+# -D PYTHON_LIBPATH=/System/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/config \
+# -G Xcode
#
# When changing any of this remember to update the notes in doc/build_systems/cmake.txt
@@ -196,6 +252,11 @@ set(CXX_WARNINGS "")
#Platform specifics
if(UNIX AND NOT APPLE)
+
+ # needed for ubuntu 11.04
+ if(EXISTS "/usr/lib/x86_64-linux-gnu")
+ set(CMAKE_LIBRARY_PATH "/usr/lib/x86_64-linux-gnu;${CMAKE_LIBRARY_PATH}")
+ endif()
if(WITH_OPENAL)
find_package(OpenAL)
@@ -243,23 +304,19 @@ if(UNIX AND NOT APPLE)
if(WITH_PYTHON)
- # No way to set py31. remove for now.
+ # No way to set py32. remove for now.
# find_package(PythonLibs)
- set(PYTHON /usr)
- set(PYTHON_VERSION 3.1 CACHE STRING "")
- mark_as_advanced(PYTHON_VERSION)
- set(PYTHON_INCLUDE_DIRS "${PYTHON}/include/python${PYTHON_VERSION}" CACHE STRING "")
- mark_as_advanced(PYTHON_INCLUDE_DIRS)
- # set(PYTHON_BINARY python) # not used yet
- set(PYTHON_LIBRARY python${PYTHON_VERSION} CACHE STRING "")
- mark_as_advanced(PYTHON_LIBRARY)
- set(PYTHON_LIBPATH ${PYTHON}/lib CACHE STRING "")
- mark_as_advanced(PYTHON_LIBPATH)
- # find_package(PythonInterp) # not used yet
- # set(PYTHON_BINARY ${PYTHON_EXECUTABLE} CACHE STRING "")
-
- set(PYTHON_LINKFLAGS "-Xlinker -export-dynamic")
- mark_as_advanced(PYTHON_LINKFLAGS)
+
+ # defines...
+
+ # PYTHON_VERSION
+ # PYTHON_INCLUDE_DIRS
+ # PYTHON_LIBRARY
+ # PYTHON_LIBPATH
+ # PYTHON_LINKFLAGS
+
+ include(build_files/cmake/FindPythonLibsUnix.cmake)
+
endif()
if(WITH_SDL)
@@ -363,7 +420,11 @@ if(UNIX AND NOT APPLE)
mark_as_advanced(X11_XF86keysym_INCLUDE_PATH)
# OpenSuse needs lutil, ArchLinux not, for now keep, can avoid by using --as-needed
- set(LLIBS "-lutil -lc -lm -lpthread -lstdc++ ${X11_X11_LIB} ${X11_Xinput_LIB}")
+ set(LLIBS "-lutil -lc -lm -lpthread -lstdc++ ${X11_X11_LIB}")
+
+ if(WITH_X11_XINPUT)
+ list(APPEND LLIBS ${X11_Xinput_LIB})
+ endif()
if(CMAKE_SYSTEM_NAME MATCHES "Linux")
if(NOT WITH_PYTHON_MODULE)
@@ -481,7 +542,7 @@ elseif(WIN32)
if(MSVC)
if(CMAKE_CL_64)
- set(LLIBS kernel32 user32 vfw32 winmm ws2_32 )
+ set(LLIBS ws2_32 vfw32 winmm kernel32 user32 gdi32 comdlg32 advapi32 shfolder shell32 ole32 oleaut32 uuid )
else()
set(LLIBS kernel32 user32 gdi32 comdlg32 advapi32 shell32 ole32 oleaut32 uuid ws2_32 vfw32 winmm)
endif()
@@ -609,18 +670,18 @@ elseif(WIN32)
if(WITH_PYTHON)
set(PYTHON ${LIBDIR}/python)
- set(PYTHON_VERSION 3.1)
+ set(PYTHON_VERSION 3.2)
set(PYTHON_INCLUDE_DIRS "${PYTHON}/include/python${PYTHON_VERSION}")
# set(PYTHON_BINARY python) # not used yet
- set(PYTHON_LIBRARY python31)
+ set(PYTHON_LIBRARY python32)
set(PYTHON_LIBPATH ${PYTHON}/lib)
endif()
# MSVC only, Mingw doesnt need
if(CMAKE_CL_64)
- set(PLATFORM_LINKFLAGS "/MACHINE:X64 /NODEFAULTLIB:libc.lib ")
+ set(PLATFORM_LINKFLAGS "/MACHINE:X64 /NODEFAULTLIB:libc.lib /STACK:2097152 ")
else()
- set(PLATFORM_LINKFLAGS "/NODEFAULTLIB:libc.lib ")
+ set(PLATFORM_LINKFLAGS "/NODEFAULTLIB:libc.lib /STACK:2097152 ")
endif()
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:libcmt.lib;libc.lib ")
@@ -716,13 +777,15 @@ elseif(WIN32)
if(WITH_PYTHON)
set(PYTHON ${LIBDIR}/python)
- set(PYTHON_VERSION 3.1)
+ set(PYTHON_VERSION 3.2)
set(PYTHON_INCLUDE_DIRS "${PYTHON}/include/python${PYTHON_VERSION}")
# set(PYTHON_BINARY python) # not used yet
- set(PYTHON_LIBRARY python31mw)
+ set(PYTHON_LIBRARY python32mw)
set(PYTHON_LIBPATH ${PYTHON}/lib)
endif()
+ set(PLATFORM_LINKFLAGS "--stack,2097152")
+
endif()
# used in many places so include globally, like OpenGL
@@ -730,6 +793,10 @@ elseif(WIN32)
elseif(APPLE)
+ if (${CMAKE_OSX_DEPLOYMENT_TARGET} STREQUAL "10.5")
+ set(WITH_LIBS10.5 ON CACHE BOOL "Use 10.5 libs" FORCE)
+ endif()
+
if(WITH_LIBS10.5)
set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin-9.x.universal)
else()
@@ -765,10 +832,10 @@ elseif(APPLE)
set(SNDFILE_LIBPATH ${SNDFILE}/lib ${FFMPEG}/lib)
endif()
- set(PYTHON_VERSION 3.1)
+ set(PYTHON_VERSION 3.2)
- if(PYTHON_VERSION MATCHES 3.1)
- # we use precompiled libraries for py 3.1 and up by default
+ if(PYTHON_VERSION MATCHES 3.2)
+ # we use precompiled libraries for py 3.2 and up by default
set(PYTHON ${LIBDIR}/python)
set(PYTHON_INCLUDE_DIRS "${PYTHON}/include/python${PYTHON_VERSION}")
@@ -780,7 +847,7 @@ elseif(APPLE)
# otherwise, use custom system framework
set(PYTHON /System/Library/Frameworks/Python.framework/Versions/)
- set(PYTHON_VERSION 3.1)
+ set(PYTHON_VERSION 3.2)
set(PYTHON_INCLUDE_DIRS "${PYTHON}${PYTHON_VERSION}/include/python${PYTHON_VERSION}")
# set(PYTHON_BINARY ${PYTHON}${PYTHON_VERSION}/bin/python${PYTHON_VERSION}) # not used yet
set(PYTHON_LIBRARY "")
@@ -990,6 +1057,30 @@ if(WITH_OPENMP)
endif()
#-----------------------------------------------------------------------------
+# Configure GLEW
+
+if(WITH_BUILTIN_GLEW)
+ # set(GLEW_LIBRARY "") # unused
+ set(GLEW_INCLUDE_PATH "${CMAKE_SOURCE_DIR}/extern/glew/include")
+else()
+ find_package(GLEW)
+
+ if(NOT GLEW_FOUND)
+ message(FATAL_ERROR "GLEW is required to build blender, install it or use WITH_BUILTIN_GLEW")
+ endif()
+
+ mark_as_advanced(GLEW_LIBRARY)
+ mark_as_advanced(GLEW_INCLUDE_PATH)
+endif()
+
+#-----------------------------------------------------------------------------
+# Configure Python.
+
+if(WITH_PYTHON_MODULE)
+ add_definitions(-DPy_ENABLE_SHARED)
+endif()
+
+#-----------------------------------------------------------------------------
# Extra compile flags
if((NOT WIN32) AND (NOT MSVC))
@@ -1014,12 +1105,16 @@ if(CMAKE_COMPILER_IS_GNUCC)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ERROR_DECLARATION_AFTER_STATEMENT -Werror=declaration-after-statement)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ERROR_IMPLICIT_FUNCTION_DECLARATION -Werror=implicit-function-declaration)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ERROR_RETURN_TYPE -Werror=return-type)
- ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ERROR_STRICT_PROTOTYPES -Werror=strict-prototypes)
+ # system headers sometimes do this, disable for now, was: -Werror=strict-prototypes
+ ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_STRICT_PROTOTYPES -Wstrict-prototypes)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_CHAR_SUBSCRIPTS -Wno-char-subscripts)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_UNKNOWN_PRAGMAS -Wno-unknown-pragmas)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_POINTER_ARITH -Wpointer-arith)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNUSED_PARAMETER -Wunused-parameter)
ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_WRITE_STRINGS -Wwrite-strings)
+ # disable because it gives warnings for printf() & friends.
+ # ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_DOUBLE_PROMOTION -Wdouble-promotion -Wno-error=double-promotion)
+ ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_ERROR_UNUSED_BUT_SET_VARIABLE -Wno-error=unused-but-set-variable)
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ALL -Wall)
ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_INVALID_OFFSETOF -Wno-invalid-offsetof)
@@ -1037,6 +1132,13 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
endif()
+if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ if(WITH_IK_ITASC OR WITH_MOD_FLUID)
+ message(WARNING "Using Clang as CXX compiler: disabling WITH_IK_ITASC and WITH_MOD_FLUID, these features will be missing.")
+ set(WITH_IK_ITASC OFF)
+ set(WITH_MOD_FLUID OFF)
+ endif()
+endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PLATFORM_CFLAGS} ${C_WARNINGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PLATFORM_CFLAGS} ${CXX_WARNINGS}")
diff --git a/GNUmakefile b/GNUmakefile
index 0e1f57bd3dc..008dfe77eae 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -52,7 +52,7 @@ ifeq ($(OS), Linux)
NPROCS:=$(shell grep -c ^processor /proc/cpuinfo)
endif
ifeq ($(OS), Darwin)
- NPROCS:=$(shell system_profiler | awk '/Number Of CPUs/{print $4}{next;}')
+ NPROCS:=$(shell sysctl -a | grep "hw.ncpu " | cut -d" " -f3)
endif
ifeq ($(OS), FreeBSD)
NPROCS:=$(shell sysctl -a | grep "hw.ncpu " | cut -d" " -f3 )
@@ -75,7 +75,7 @@ all:
@echo
@echo Building Blender ...
- cd $(BUILD_DIR) ; make -s -j $(NPROCS)
+ cd $(BUILD_DIR) ; make -s -j $(NPROCS) install
@echo
@echo run blender from "$(BUILD_DIR)/bin/blender"
@echo
@@ -90,10 +90,24 @@ package_debian:
package_pacman:
cd build_files/package_spec/pacman ; MAKEFLAGS="-j$(NPROCS)" makepkg --asroot
+package_archive:
+ cd $(BUILD_DIR) ; make -s package_archive
+ @echo archive in "$(BUILD_DIR)/release"
+
# forward build targets
test:
cd $(BUILD_DIR) ; ctest . --output-on-failure
+# run pep8 check check on scripts we distribute.
+test_pep8:
+ python source/tests/pep8.py > test_pep8.log 2>&1
+ @echo "written: test_pep8.log"
+
+# run some checks on our cmakefiles.
+test_cmake:
+ python build_files/cmake/cmake_consistency_check.py > test_cmake_consistency.log 2>&1
+ @echo "written: test_cmake_consistency.log"
+
clean:
cd $(BUILD_DIR) ; make clean
diff --git a/SConstruct b/SConstruct
index 49c5ae98249..954422e0b3d 100644
--- a/SConstruct
+++ b/SConstruct
@@ -153,13 +153,11 @@ if cc:
if cxx:
env['CXX'] = cxx
-if env['CC'] in ['cl', 'cl.exe'] and sys.platform=='win32':
- if bitness == 64:
- platform = 'win64-vc'
- else:
- platform = 'win32-vc'
-elif env['CC'] in ['gcc'] and sys.platform=='win32':
- platform = 'win32-mingw'
+if sys.platform=='win32':
+ if env['CC'] in ['cl', 'cl.exe']:
+ platform = 'win64-vc' if bitness == 64 else 'win32-vc'
+ elif env['CC'] in ['gcc']:
+ platform = 'win32-mingw'
env.SConscriptChdir(0)
@@ -197,6 +195,10 @@ else:
opts = btools.read_opts(env, optfiles, B.arguments)
opts.Update(env)
+if sys.platform=='win32':
+ if bitness==64:
+ env.Append(CFLAGS=['-DWIN64']) # -DWIN32 needed too, as it's used all over to target Windows generally
+
if not env['BF_FANCY']:
B.bc.disable()
@@ -641,6 +643,16 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'win64-vc', 'linuxcross'):
'${BF_FFMPEG_LIBPATH}/avdevice-52.dll',
'${BF_FFMPEG_LIBPATH}/avutil-50.dll',
'${BF_FFMPEG_LIBPATH}/swscale-0.dll']
+
+ # Since the thumb handler is loaded by Explorer, architecture is
+ # strict: the x86 build fails on x64 Windows. We need to ship
+ # both builds in x86 packages.
+ if bitness == 32:
+ dllsources.append('${LCGDIR}/thumbhandler/lib/BlendThumb.dll')
+ dllsources.append('${LCGDIR}/thumbhandler/lib/BlendThumb64.dll')
+
+ dllsources.append('#source/icons/blender.exe.manifest')
+
windlls = env.Install(dir=env['BF_INSTALLDIR'], source = dllsources)
allinstall += windlls
@@ -669,7 +681,14 @@ if 'blenderlite' in B.targets:
Depends(nsiscmd, allinstall)
+buildslave_action = env.Action(btools.buildslave, btools.buildslave_print)
+buildslave_cmd = env.Command('buildslave_exec', None, buildslave_action)
+buildslave_alias = env.Alias('buildslave', buildslave_cmd)
+
+Depends(buildslave_cmd, allinstall)
+
Default(B.program_list)
if not env['WITHOUT_BF_INSTALL']:
Default(installtarget)
+
diff --git a/build_files/buildbot/config/user-config-i686.py b/build_files/buildbot/config/user-config-i686.py
new file mode 100644
index 00000000000..3fdce4ff9de
--- /dev/null
+++ b/build_files/buildbot/config/user-config-i686.py
@@ -0,0 +1,86 @@
+BF_BUILDDIR = '../blender-build/linux-glibc27-i686'
+BF_INSTALLDIR = '../blender-install/linux-glibc27-i686'
+
+# Python configuration
+BF_PYTHON_VERSION = '3.2'
+BF_PYTHON_ABI_FLAGS = 'mu'
+BF_PYTHON = '/opt/python3.2'
+
+WITH_BF_STATICPYTHON = True
+
+# OpenCollada configuration
+WITH_BF_COLLADA = True
+BF_OPENCOLLADA = '/opt/opencollada'
+BF_OPENCOLLADA_INC = '${BF_OPENCOLLADA}/include'
+BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver buffer ftoa libxml2-static libexpat-static libpcre-static'
+BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib /home/sources/staticlibs/lib32'
+BF_PCRE_LIB = ''
+BF_EXPAT_LIB = ''
+
+# FFMPEG configuration
+WITH_BF_FFMPEG = True
+WITH_BF_STATICFFMPEG = True
+
+# Used for linking against system ffmpeg, but it gives pixelization,, so fall back to ffmpeg from 2.52 temporary
+#BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libavformat.a ${BF_FFMPEG_LIBPATH}/libavcodec.a ${BF_FFMPEG_LIBPATH}/libswscale.a ' + \
+# '${BF_FFMPEG_LIBPATH}/libavutil.a ${BF_FFMPEG_LIBPATH}/libavdevice.a ${BF_FFMPEG_LIBPATH}/libdc1394.a ' + \
+# '${BF_FFMPEG_LIBPATH}/libraw1394.a ${BF_FFMPEG_LIBPATH}/libdirac_encoder.a ${BF_FFMPEG_LIBPATH}/libschroedinger-1.0.a ' + \
+# '${BF_FFMPEG_LIBPATH}/libfaad.a ${BF_FFMPEG_LIBPATH}/libtheora.a ' + \
+# '${BF_FFMPEG_LIBPATH}/libspeex.a ${BF_FFMPEG_LIBPATH}/libbz2.a ${BF_FFMPEG_LIBPATH}/liboil-0.3.a ${BF_FFMPEG_LIBPATH}/libogg.a ' + \
+# '${BF_FFMPEG_LIBPATH}/libvorbisenc.a ${BF_FFMPEG_LIBPATH}/libvorbis.a ${BF_FFMPEG_LIBPATH}/libgsm.a'
+
+BF_FFMPEG = '/home/sources/staticlibs/ffmpeg'
+BF_FFMPEG_LIBPATH = '${BF_FFMPEG}/lib32'
+BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libextern_libavformat.a ${BF_FFMPEG_LIBPATH}/libextern_libswscale.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libextern_libavcodec.a ${BF_FFMPEG_LIBPATH}/libextern_libavdevice.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libextern_libavutil.a ${BF_FFMPEG_LIBPATH}/libextern_xvidcore.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libextern_libmp3lame.a ${BF_FFMPEG_LIBPATH}/libextern_x264.a'
+
+# Don't depend on system's libstdc++
+WITH_BF_STATICCXX = True
+BF_CXX_LIB_STATIC = '/usr/lib/gcc/i486-linux-gnu/4.3.2/libstdc++.a'
+
+WITH_BF_OPENAL = True
+WITH_BF_STATICOPENAL = True
+BF_OPENAL_LIB_STATIC = '/opt/openal/lib/libopenal.a'
+
+WITH_BF_GETTEXT_STATIC = True
+BF_FREETYPE_LIB_STATIC = True
+
+WITH_BF_OPENEXR = True
+WITH_BF_STATICOPENEXR = True
+
+WITH_BF_TIFF = True
+WITH_BF_STATICTIFF = True
+BF_TIFF_LIB_STATIC = '${BF_TIFF}/lib/libtiff.a'
+
+WITH_BF_JPEG = True
+BF_JPEG_LIB = 'libjpeg'
+BF_JPEG_LIBPATH = '/home/sources/staticlibs/lib32'
+
+WITH_BF_PNG = True
+BF_PNG_LIB = 'libpng'
+BF_PNG_LIBPATH = '/home/sources/staticlibs/lib32'
+
+WITH_BF_STATICLIBSAMPLERATE = True
+
+WITH_BF_ZLIB = True
+WITH_BF_STATICZLIB = True
+BF_ZLIB_LIB_STATIC = '${BF_ZLIB}/lib/libz.a'
+
+WITH_BF_SDL = True
+WITH_BF_OGG = True
+
+WITH_BF_OPENMP = True
+
+WITH_BF_GAMEENGINE = True
+WITH_BF_BULLET = True
+
+# Blender player (would be enabled in it's own config)
+WITH_BF_PLAYER = False
+
+# Compilation and optimization
+BF_DEBUG = False
+REL_CFLAGS = ['-O2']
+REL_CCFLAGS = ['-O2']
+PLATFORM_LINKFLAGS = ['-L/home/sources/staticlibs/lib32']
diff --git a/build_files/buildbot/config/user-config-player-i686.py b/build_files/buildbot/config/user-config-player-i686.py
new file mode 100644
index 00000000000..3e686463358
--- /dev/null
+++ b/build_files/buildbot/config/user-config-player-i686.py
@@ -0,0 +1,65 @@
+BF_BUILDDIR = '../blender-build/linux-glibc27-i686'
+BF_INSTALLDIR = '../blender-install/linux-glibc27-i686'
+
+# Python configuration
+BF_PYTHON_VERSION = '3.2'
+BF_PYTHON_ABI_FLAGS = 'mu'
+BF_PYTHON = '/opt/python3.2'
+
+WITH_BF_STATICPYTHON = True
+
+# OpenCollada configuration
+WITH_BF_COLLADA = False
+
+# FFMPEG configuration
+WITH_BF_FFMPEG = False
+
+# Don't depend on system's libstdc++
+WITH_BF_STATICCXX = True
+BF_CXX_LIB_STATIC = '/usr/lib/gcc/i486-linux-gnu/4.3.2/libstdc++.a'
+
+WITH_BF_OPENAL = True
+WITH_BF_STATICOPENAL = True
+BF_OPENAL_LIB_STATIC = '/opt/openal/lib/libopenal.a'
+
+WITH_BF_GETTEXT_STATIC = True
+BF_FREETYPE_LIB_STATIC = True
+
+WITH_BF_OPENEXR = False
+WITH_BF_STATICOPENEXR = True
+
+WITH_BF_TIFF = False
+WITH_BF_STATICTIFF = True
+BF_TIFF_LIB_STATIC = '${BF_TIFF}/lib/libtiff.a'
+
+WITH_BF_JPEG = True
+BF_JPEG_LIB = 'libjpeg'
+BF_JPEG_LIBPATH = '/home/sources/staticlibs/lib32'
+
+WITH_BF_PNG = True
+BF_PNG_LIB = 'libpng'
+BF_PNG_LIBPATH = '/home/sources/staticlibs/lib32'
+
+WITH_BF_STATICLIBSAMPLERATE = True
+
+WITH_BF_ZLIB = True
+WITH_BF_STATICZLIB = True
+BF_ZLIB_LIB_STATIC = '${BF_ZLIB}/lib/libz.a'
+
+WITH_BF_SDL = True
+WITH_BF_OGG = False
+
+WITH_BF_OPENMP = True
+
+WITH_BF_GAMEENGINE = True
+WITH_BF_BULLET = True
+
+# Do not build blender when building blenderplayer
+WITH_BF_NOBLENDER = True
+WITH_BF_PLAYER = True
+
+# Compilation and optimization
+BF_DEBUG = False
+REL_CFLAGS = ['-O2']
+REL_CCFLAGS = ['-O2']
+PLATFORM_LINKFLAGS = ['-L/home/sources/staticlibs/lib32']
diff --git a/build_files/buildbot/config/user-config-player-x86_64.py b/build_files/buildbot/config/user-config-player-x86_64.py
new file mode 100644
index 00000000000..e439523706e
--- /dev/null
+++ b/build_files/buildbot/config/user-config-player-x86_64.py
@@ -0,0 +1,66 @@
+BF_BUILDDIR = '../blender-build/linux-glibc27-x86_64'
+BF_INSTALLDIR = '../blender-install/linux-glibc27-x86_64'
+
+# Python configuration
+BF_PYTHON_VERSION = '3.2'
+BF_PYTHON_ABI_FLAGS = 'mu'
+BF_PYTHON = '/opt/python3.2'
+
+WITH_BF_STATICPYTHON = True
+
+# OpenCollada configuration
+WITH_BF_COLLADA = False
+
+# FFMPEG configuration
+WITH_BF_FFMPEG = False
+
+# Don't depend on system's libstdc++
+WITH_BF_STATICCXX = True
+BF_CXX_LIB_STATIC = '/usr/lib/gcc/x86_64-linux-gnu/4.3.2/libstdc++.a'
+
+WITH_BF_OPENAL = True
+WITH_BF_STATICOPENAL = True
+BF_OPENAL_LIB_STATIC = '/opt/openal/lib/libopenal.a'
+
+WITH_BF_GETTEXT_STATIC = True
+BF_FREETYPE_LIB_STATIC = True
+
+WITH_BF_OPENEXR = False
+WITH_BF_STATICOPENEXR = True
+
+WITH_BF_TIFF = False
+WITH_BF_STATICTIFF = True
+BF_TIFF_LIB_STATIC = '${BF_TIFF}/lib/libtiff.a'
+
+WITH_BF_JPEG = True
+BF_JPEG_LIB = 'libjpeg'
+BF_JPEG_LIBPATH = '/home/sources/staticlibs/lib64'
+
+WITH_BF_PNG = True
+BF_PNG_LIB = 'libpng'
+BF_PNG_LIBPATH = '/home/sources/staticlibs/lib64'
+
+WITH_BF_STATICLIBSAMPLERATE = True
+
+WITH_BF_ZLIB = True
+WITH_BF_STATICZLIB = True
+BF_ZLIB_LIB_STATIC = '${BF_ZLIB}/lib/libz.a'
+
+WITH_BF_STATICZLIB = False
+WITH_BF_SDL = True
+WITH_BF_OGG = False
+
+WITH_BF_OPENMP = True
+
+WITH_BF_GAMEENGINE = True
+WITH_BF_BULLET = True
+
+# Do not build blender when building blenderplayer
+WITH_BF_NOBLENDER = True
+WITH_BF_PLAYER = True
+
+# Compilation and optimization
+BF_DEBUG = False
+REL_CFLAGS = ['-O2']
+REL_CCFLAGS = ['-O2']
+PLATFORM_LINKFLAGS = ['-L/home/sources/staticlibs/lib64']
diff --git a/build_files/buildbot/config/user-config-x86_64.py b/build_files/buildbot/config/user-config-x86_64.py
new file mode 100644
index 00000000000..fccc31f9c73
--- /dev/null
+++ b/build_files/buildbot/config/user-config-x86_64.py
@@ -0,0 +1,86 @@
+BF_BUILDDIR = '../blender-build/linux-glibc27-x86_64'
+BF_INSTALLDIR = '../blender-install/linux-glibc27-x86_64'
+
+# Python configuration
+BF_PYTHON_VERSION = '3.2'
+BF_PYTHON_ABI_FLAGS = 'mu'
+BF_PYTHON = '/opt/python3.2'
+
+WITH_BF_STATICPYTHON = True
+
+# OpenCollada configuration
+WITH_BF_COLLADA = True
+BF_OPENCOLLADA = '/opt/opencollada'
+BF_OPENCOLLADA_INC = '${BF_OPENCOLLADA}/include'
+BF_OPENCOLLADA_LIB = 'OpenCOLLADAStreamWriter OpenCOLLADASaxFrameworkLoader OpenCOLLADAFramework OpenCOLLADABaseUtils GeneratedSaxParser UTF MathMLSolver buffer ftoa libxml2-static libexpat-static libpcre-static'
+BF_OPENCOLLADA_LIBPATH = '${BF_OPENCOLLADA}/lib /home/sources/staticlibs/lib64'
+BF_PCRE_LIB = ''
+BF_EXPAT_LIB = ''
+
+# FFMPEG configuration
+WITH_BF_FFMPEG = True
+WITH_BF_STATICFFMPEG = True
+
+# Used for linking against system ffmpeg, but it gives pixelization,, so fall back to ffmpeg from 2.52 temporary
+#BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libavformat.a ${BF_FFMPEG_LIBPATH}/libavcodec.a ${BF_FFMPEG_LIBPATH}/libswscale.a ' + \
+# '${BF_FFMPEG_LIBPATH}/libavutil.a ${BF_FFMPEG_LIBPATH}/libavdevice.a ${BF_FFMPEG_LIBPATH}/libdc1394.a ' + \
+# '${BF_FFMPEG_LIBPATH}/libraw1394.a ${BF_FFMPEG_LIBPATH}/libdirac_encoder.a ${BF_FFMPEG_LIBPATH}/libschroedinger-1.0.a ' + \
+# '${BF_FFMPEG_LIBPATH}/libfaad.a ${BF_FFMPEG_LIBPATH}/libtheora.a ' + \
+# '${BF_FFMPEG_LIBPATH}/libspeex.a ${BF_FFMPEG_LIBPATH}/libbz2.a ${BF_FFMPEG_LIBPATH}/liboil-0.3.a ${BF_FFMPEG_LIBPATH}/libogg.a ' + \
+# '${BF_FFMPEG_LIBPATH}/libvorbisenc.a ${BF_FFMPEG_LIBPATH}/libvorbis.a ${BF_FFMPEG_LIBPATH}/libgsm.a'
+
+BF_FFMPEG = '/home/sources/staticlibs/ffmpeg'
+BF_FFMPEG_LIBPATH = '${BF_FFMPEG}/lib64'
+BF_FFMPEG_LIB_STATIC = '${BF_FFMPEG_LIBPATH}/libextern_libavformat.a ${BF_FFMPEG_LIBPATH}/libextern_libswscale.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libextern_libavcodec.a ${BF_FFMPEG_LIBPATH}/libextern_libavdevice.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libextern_libavutil.a ${BF_FFMPEG_LIBPATH}/libextern_xvidcore.a ' + \
+ '${BF_FFMPEG_LIBPATH}/libextern_libmp3lame.a ${BF_FFMPEG_LIBPATH}/libextern_x264.a'
+
+# Don't depend on system's libstdc++
+WITH_BF_STATICCXX = True
+BF_CXX_LIB_STATIC = '/usr/lib/gcc/x86_64-linux-gnu/4.3.2/libstdc++.a'
+
+WITH_BF_OPENAL = True
+WITH_BF_STATICOPENAL = True
+BF_OPENAL_LIB_STATIC = '/opt/openal/lib/libopenal.a'
+
+WITH_BF_GETTEXT_STATIC = True
+BF_FREETYPE_LIB_STATIC = True
+
+WITH_BF_OPENEXR = True
+WITH_BF_STATICOPENEXR = True
+
+WITH_BF_TIFF = True
+WITH_BF_STATICTIFF = True
+BF_TIFF_LIB_STATIC = '${BF_TIFF}/lib/libtiff.a'
+
+WITH_BF_JPEG = True
+BF_JPEG_LIB = 'libjpeg'
+BF_JPEG_LIBPATH = '/home/sources/staticlibs/lib64'
+
+WITH_BF_PNG = True
+BF_PNG_LIB = 'libpng'
+BF_PNG_LIBPATH = '/home/sources/staticlibs/lib64'
+
+WITH_BF_STATICLIBSAMPLERATE = True
+
+WITH_BF_ZLIB = True
+WITH_BF_STATICZLIB = True
+BF_ZLIB_LIB_STATIC = '${BF_ZLIB}/lib/libz.a'
+
+WITH_BF_SDL = True
+WITH_BF_OGG = True
+
+WITH_BF_OPENMP = True
+
+WITH_BF_GAMEENGINE = True
+WITH_BF_BULLET = True
+
+# Blender player (would be enabled in it's own config)
+WITH_BF_PLAYER = False
+
+# Compilation and optimization
+BF_DEBUG = False
+REL_CFLAGS = ['-O2']
+REL_CCFLAGS = ['-O2']
+PLATFORM_LINKFLAGS = ['-L/home/sources/staticlibs/lib64']
diff --git a/build_files/buildbot/master.cfg b/build_files/buildbot/master.cfg
new file mode 100644
index 00000000000..6913ed2dab0
--- /dev/null
+++ b/build_files/buildbot/master.cfg
@@ -0,0 +1,176 @@
+# -*- python -*-
+# ex: set syntax=python:
+
+# <pep8 compliant>
+
+# Dictionary that the buildmaster pays attention to.
+c = BuildmasterConfig = {}
+
+# BUILD SLAVES
+#
+# We load the slaves and their passwords from a separator file, so we can have
+# this one in SVN.
+
+from buildbot.buildslave import BuildSlave
+import master_private
+
+c['slaves'] = []
+
+for slave in master_private.slaves:
+ c['slaves'].append(BuildSlave(slave['name'], slave['password']))
+
+# TCP port through which slaves connect
+
+c['slavePortnum'] = 9989
+
+# CHANGE SOURCES
+
+from buildbot.changes.svnpoller import SVNPoller
+
+c['change_source'] = SVNPoller(
+ 'https://svn.blender.org/svnroot/bf-blender/trunk/',
+ pollinterval=1200)
+
+# BUILDERS
+#
+# The 'builders' list defines the Builders, which tell Buildbot how to perform a build:
+# what steps, and which slaves can execute them. Note that any particular build will
+# only take place on one slave.
+
+from buildbot.process.factory import BuildFactory
+from buildbot.steps.source import SVN
+from buildbot.steps.shell import ShellCommand
+from buildbot.steps.shell import Compile
+from buildbot.steps.shell import Test
+from buildbot.steps.transfer import FileUpload
+# from buildbot.steps.transfer import FileDownload
+from buildbot.steps.master import MasterShellCommand
+from buildbot.config import BuilderConfig
+
+# add builder utility
+
+c['builders'] = []
+buildernames = []
+
+
+def add_builder(c, name, libdir, factory):
+ slavenames = []
+
+ for slave in master_private.slaves:
+ if name in slave['builders']:
+ slavenames.append(slave['name'])
+
+ if len(slavenames) > 0:
+ f = factory(name, libdir)
+ c['builders'].append(BuilderConfig(name=name, slavenames=slavenames, factory=f, category='blender'))
+ buildernames.append(name)
+
+# common steps
+
+
+def svn_step():
+ return SVN(baseURL='https://svn.blender.org/svnroot/bf-blender/%%BRANCH%%/blender', mode='update', defaultBranch='trunk', workdir='blender')
+
+
+def lib_svn_step(dir):
+ return SVN(name='lib svn', baseURL='https://svn.blender.org/svnroot/bf-blender/%%BRANCH%%/lib/' + dir, mode='update', defaultBranch='trunk', workdir='lib/' + dir)
+
+# generic builder
+
+
+def generic_builder(id, libdir=""):
+ filename = 'buildbot_upload_' + id + '.zip'
+ compile_script = '../blender/build_files/buildbot/slave_compile.py'
+ test_script = '../blender/build_files/buildbot/slave_test.py'
+ pack_script = '../blender/build_files/buildbot/slave_pack.py'
+ unpack_script = 'master_unpack.py'
+
+ f = BuildFactory()
+ f.addStep(svn_step())
+ if libdir != '':
+ f.addStep(lib_svn_step(libdir))
+
+ f.addStep(Compile(command=['python', compile_script, id]))
+ f.addStep(Test(command=['python', test_script, id]))
+ f.addStep(ShellCommand(name='package', command=['python', pack_script, id], description='packaging', descriptionDone='packaged'))
+ if id.find('cmake') != -1:
+ f.addStep(FileUpload(name='upload', slavesrc='buildbot_upload.zip', masterdest=filename, maxsize=100 * 1024 * 1024))
+ else:
+ f.addStep(FileUpload(name='upload', slavesrc='buildbot_upload.zip', masterdest=filename, maxsize=100 * 1024 * 1024, workdir='install'))
+ f.addStep(MasterShellCommand(name='unpack', command=['python', unpack_script, filename], description='unpacking', descriptionDone='unpacked'))
+ return f
+
+# builders
+
+add_builder(c, 'mac_x86_64_cmake', 'darwin-9.x.universal', generic_builder)
+add_builder(c, 'mac_i386_cmake', 'darwin-9.x.universal', generic_builder)
+add_builder(c, 'mac_ppc_cmake', 'darwin-9.x.universal', generic_builder)
+add_builder(c, 'linux_x86_64_cmake', '', generic_builder)
+add_builder(c, 'linux_x86_64_scons', '', generic_builder)
+add_builder(c, 'win32_scons', 'windows', generic_builder)
+
+# SCHEDULERS
+#
+# Decide how to react to incoming changes.
+
+# from buildbot.scheduler import Scheduler
+from buildbot.schedulers import timed
+
+c['schedulers'] = []
+#c['schedulers'].append(Scheduler(name="all", branch=None,
+# treeStableTimer=None,
+# builderNames=[]))
+#c['schedulers'].append(timed.Periodic(name="nightly",
+# builderNames=buildernames,
+# periodicBuildTimer=24*60*60))
+
+c['schedulers'].append(timed.Nightly(name='nightly',
+ builderNames=buildernames,
+ hour=3,
+ minute=0))
+
+# STATUS TARGETS
+#
+# 'status' is a list of Status Targets. The results of each build will be
+# pushed to these targets. buildbot/status/*.py has a variety to choose from,
+# including web pages, email senders, and IRC bots.
+
+c['status'] = []
+
+from buildbot.status import html
+from buildbot.status.web import authz
+
+authz_cfg = authz.Authz(
+ # change any of these to True to enable; see the manual for more
+ # options
+ gracefulShutdown=False,
+ forceBuild=True, # use this to test your slave once it is set up
+ forceAllBuilds=False,
+ pingBuilder=False,
+ stopBuild=False,
+ stopAllBuilds=False,
+ cancelPendingBuild=False,
+)
+
+c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg))
+
+# PROJECT IDENTITY
+
+c['projectName'] = "Blender"
+c['projectURL'] = "http://www.blender.org"
+
+# the 'buildbotURL' string should point to the location where the buildbot's
+# internal web server (usually the html.WebStatus page) is visible. This
+# typically uses the port number set in the Waterfall 'status' entry, but
+# with an externally-visible host name which the buildbot cannot figure out
+# without some help.
+
+c['buildbotURL'] = "http://builder.blender.org/"
+
+# DB URL
+#
+# This specifies what database buildbot uses to store change and scheduler
+# state. You can leave this at its default for all but the largest
+# installations.
+
+c['db_url'] = "sqlite:///state.sqlite"
diff --git a/build_files/buildbot/master_unpack.py b/build_files/buildbot/master_unpack.py
new file mode 100644
index 00000000000..06c11b368b0
--- /dev/null
+++ b/build_files/buildbot/master_unpack.py
@@ -0,0 +1,124 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# Runs on Buildbot master, to unpack incoming unload.zip into latest
+# builds directory and remove older builds.
+
+# <pep8 compliant>
+
+import os
+import shutil
+import sys
+import zipfile
+
+
+# extension stripping
+def strip_extension(filename):
+ extensions = '.zip', '.tar', '.bz2', '.gz', '.tgz', '.tbz', '.exe'
+ filename_noext, ext = os.path.splitext(filename)
+ if ext in extensions:
+ return strip_extension(filename_noext) # may have .tar.bz2
+ else:
+ return filename
+
+
+# extract platform from package name
+def get_platform(filename):
+ # name is blender-version-platform.extension. we want to get the
+ # platform out, but there may be some variations, so we fiddle a
+ # bit to handle current and hopefully future names
+ filename = strip_extension(filename)
+
+ tokens = filename.split("-")
+ platforms = ('osx', 'mac', 'bsd',
+ 'win', 'linux', 'source',
+ 'irix', 'solaris')
+ platform_tokens = []
+ found = False
+
+ for i, token in enumerate(tokens):
+ if not found:
+ for platform in platforms:
+ if platform in token.lower():
+ found = True
+ break
+
+ if found:
+ platform_tokens += [token]
+
+ return '-'.join(platform_tokens)
+
+# get filename
+if len(sys.argv) < 2:
+ sys.stderr.write("Not enough arguments, expecting file to unpack\n")
+ sys.exit(1)
+
+filename = sys.argv[1]
+
+# open zip file
+if not os.path.exists(filename):
+ sys.stderr.write("File %r not found.\n" % filename)
+ sys.exit(1)
+
+try:
+ z = zipfile.ZipFile(filename, "r")
+except Exception, ex:
+ sys.stderr.write('Failed to open zip file: %s\n' % str(ex))
+ sys.exit(1)
+
+if len(z.namelist()) != 1:
+ sys.stderr.write("Expected one file in %r." % filename)
+ sys.exit(1)
+
+package = z.namelist()[0]
+packagename = os.path.basename(package)
+
+# detect platform
+platform = get_platform(packagename)
+
+if platform == '':
+ sys.stderr.write('Failed to detect platform ' +
+ 'from package: %r\n' % packagename)
+ sys.exit(1)
+
+# extract
+directory = 'public_html/download'
+
+try:
+ zf = z.open(package)
+ f = file(os.path.join(directory, packagename), "wb")
+
+ shutil.copyfileobj(zf, f)
+
+ zf.close()
+ z.close()
+
+ os.remove(filename)
+except Exception, ex:
+ sys.stderr.write('Failed to unzip package: %s\n' % str(ex))
+ sys.exit(1)
+
+# remove other files from the same platform
+try:
+ for f in os.listdir(directory):
+ if platform.lower() in f.lower():
+ if f != packagename:
+ os.remove(os.path.join(directory, f))
+except Exception, ex:
+ sys.stderr.write('Failed to remove old packages: %s\n' % str(ex))
+ sys.exit(1)
diff --git a/build_files/buildbot/slave_compile.py b/build_files/buildbot/slave_compile.py
new file mode 100644
index 00000000000..e6dd4840bd6
--- /dev/null
+++ b/build_files/buildbot/slave_compile.py
@@ -0,0 +1,123 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import os
+import subprocess
+import sys
+
+# get builder name
+if len(sys.argv) < 2:
+ sys.stderr.write("Not enough arguments, expecting builder name\n")
+ sys.exit(1)
+
+builder = sys.argv[1]
+
+# we run from build/ directory
+blender_dir = '../blender'
+
+if builder.find('cmake') != -1:
+ # cmake
+
+ # set build options
+ cmake_options = ['-DCMAKE_BUILD_TYPE:STRING=Release']
+
+ if builder == 'mac_x86_64_cmake':
+ cmake_options.append('-DCMAKE_OSX_ARCHITECTURES:STRING=x86_64')
+ elif builder == 'mac_i386_cmake':
+ cmake_options.append('-DCMAKE_OSX_ARCHITECTURES:STRING=i386')
+ elif builder == 'mac_ppc_cmake':
+ cmake_options.append('-DCMAKE_OSX_ARCHITECTURES:STRING=ppc')
+
+ # configure and make
+ retcode = subprocess.call(['cmake', blender_dir] + cmake_options)
+ if retcode != 0:
+ sys.exit(retcode)
+ retcode = subprocess.call(['make', '-s', '-j4', 'install'])
+ sys.exit(retcode)
+else:
+ # scons
+ os.chdir(blender_dir)
+ scons_cmd = ['python', 'scons/scons.py']
+ scons_options = []
+
+ if builder.startswith('linux'):
+ import shutil
+
+ cores = 1
+ if hasattr(os, 'sysconf'):
+ if 'SC_NPROCESSORS_ONLN' in os.sysconf_names:
+ cores = os.sysconf('SC_NPROCESSORS_ONLN')
+
+ if cores > 1:
+ # there're two chroot environments in one machine,
+ # so use only a half of power for better performance
+ cores = cores / 2
+
+ # We're using the same rules as release builder, so tweak
+ # build and install dirs
+ build_dir = os.path.join('..', 'build', builder)
+ install_dir = os.path.join('..', 'install', builder)
+
+ common_options = ['BF_NUMJOBS=' + str(cores),
+ 'BF_BUILDDIR=' + build_dir,
+ 'BF_INSTALLDIR=' + install_dir]
+
+ # Clean all directories first
+ retcode = subprocess.call(scons_cmd + common_options + ['clean'])
+ if retcode != 0:
+ print('Error cleaning build directory')
+ sys.exit(retcode)
+
+ if os.path.isdir(install_dir):
+ shutil.rmtree(install_dir)
+
+ buildbot_dir = os.path.dirname(os.path.realpath(__file__))
+ config_dir = os.path.join(buildbot_dir, 'config')
+
+ configs = []
+ if builder == 'linux_x86_64_scons':
+ configs = ['user-config-player-x86_64.py',
+ 'user-config-x86_64.py']
+ elif builder == 'linux_i386_scons':
+ configs = ['user-config-player-i686.py',
+ 'user-config-i686.py']
+
+ for config in configs:
+ config_fpath = os.path.join(config_dir, config)
+
+ scons_options = []
+ scons_options += common_options
+
+ if config.find('player') == -1:
+ scons_options.append('blender')
+ else:
+ scons_options.append('blenderplayer')
+
+ scons_options.append('BF_CONFIG=' + config_fpath)
+
+ retcode = subprocess.call(scons_cmd + scons_options)
+ if retcode != 0:
+ print('Error building rules wuth config ' + config)
+ sys.exit(retcode)
+
+ sys.exit(0)
+ else:
+ retcode = subprocess.call(['python', 'scons/scons.py'] + scons_options)
+ sys.exit(retcode)
diff --git a/build_files/buildbot/slave_pack.py b/build_files/buildbot/slave_pack.py
new file mode 100644
index 00000000000..81402b3aca4
--- /dev/null
+++ b/build_files/buildbot/slave_pack.py
@@ -0,0 +1,118 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# Runs on buildbot slave, creating a release package using the build
+# system and zipping it into buildbot_upload.zip. This is then uploaded
+# to the master in the next buildbot step.
+
+import os
+import subprocess
+import sys
+import zipfile
+
+# get builder name
+if len(sys.argv) < 2:
+ sys.stderr.write("Not enough arguments, expecting builder name\n")
+ sys.exit(1)
+
+builder = sys.argv[1]
+
+# scons does own packaging
+if builder.find('scons') != -1:
+ os.chdir('../blender')
+ scons_options = ['BF_QUICK=slnt', 'buildslave']
+
+ if builder.startswith('linux'):
+ buildbot_dir = os.path.dirname(os.path.realpath(__file__))
+ config_dir = os.path.join(buildbot_dir, 'config')
+ build_dir = os.path.join('..', 'build', builder)
+ install_dir = os.path.join('..', 'install', builder)
+
+ scons_options += ['WITH_BF_NOBLENDER=True', 'WITH_BF_PLAYER=False',
+ 'BF_BUILDDIR=' + build_dir,
+ 'BF_INSTALLDIR=' + install_dir,
+ 'WITHOUT_BF_INSTALL=True']
+
+ config = None
+
+ if builder == 'linux_x86_64_scons':
+ config = 'user-config-x86_64.py'
+ elif builder == 'linux_i386_scons':
+ config = 'user-config-x86_64.py'
+
+ if config is not None:
+ config_fpath = os.path.join(config_dir, config)
+ scons_options.append('BF_CONFIG=' + config_fpath)
+
+ blender = os.path.join(install_dir, 'blender')
+ blenderplayer = os.path.join(install_dir, 'blenderplayer')
+ subprocess.call(['strip', '--strip-all', blender, blenderplayer])
+
+ retcode = subprocess.call(['python', 'scons/scons.py'] + scons_options)
+ sys.exit(retcode)
+ else:
+ retcode = subprocess.call(['python', 'scons/scons.py'] + scons_options)
+ sys.exit(retcode)
+
+# clean release directory if it already exists
+dir = 'release'
+
+if os.path.exists(dir):
+ for f in os.listdir(dir):
+ if os.path.isfile(os.path.join(dir, f)):
+ os.remove(os.path.join(dir, f))
+
+# create release package
+try:
+ subprocess.call(['make', 'package_archive'])
+except Exception, ex:
+ sys.stderr.write('Make package release failed' + str(ex) + '\n')
+ sys.exit(1)
+
+# find release directory, must exist this time
+if not os.path.exists(dir):
+ sys.stderr.write("Failed to find release directory.\n")
+ sys.exit(1)
+
+# find release package
+file = None
+filepath = None
+
+for f in os.listdir(dir):
+ rf = os.path.join(dir, f)
+ if os.path.isfile(rf) and f.startswith('blender'):
+ file = f
+ filepath = rf
+
+if not file:
+ sys.stderr.write("Failed to find release package.\n")
+ sys.exit(1)
+
+# create zip file
+try:
+ upload_zip = "buildbot_upload.zip"
+ if os.path.exists(upload_zip):
+ os.remove(upload_zip)
+ z = zipfile.ZipFile(upload_zip, "w", compression=zipfile.ZIP_STORED)
+ z.write(filepath, arcname=file)
+ z.close()
+except Exception, ex:
+ sys.stderr.write('Create buildbot_upload.zip failed' + str(ex) + '\n')
+ sys.exit(1)
diff --git a/build_files/buildbot/slave_test.py b/build_files/buildbot/slave_test.py
new file mode 100644
index 00000000000..f79ef7cf5c6
--- /dev/null
+++ b/build_files/buildbot/slave_test.py
@@ -0,0 +1,40 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import subprocess
+import sys
+
+# get builder name
+if len(sys.argv) < 2:
+ sys.stderr.write("Not enough arguments, expecting builder name\n")
+ sys.exit(1)
+
+builder = sys.argv[1]
+
+# we run from build/ directory
+blender_dir = '../blender'
+
+if builder.find('cmake') != -1:
+ # cmake
+ retcode = subprocess.call(['ctest', '.' '--output-on-failure'])
+ sys.exit(retcode)
+else:
+ # scons
+ pass
diff --git a/build_files/cmake/FindPythonLibsUnix.cmake b/build_files/cmake/FindPythonLibsUnix.cmake
new file mode 100644
index 00000000000..0752de4ce3c
--- /dev/null
+++ b/build_files/cmake/FindPythonLibsUnix.cmake
@@ -0,0 +1,72 @@
+# - Find python libraries
+#
+# PYTHON_VERSION
+# PYTHON_INCLUDE_DIRS
+# PYTHON_LIBRARY
+# PYTHON_LIBPATH
+# PYTHON_LINKFLAGS
+
+#=============================================================================
+
+set(PYTHON_VERSION 3.2 CACHE STRING "")
+mark_as_advanced(PYTHON_VERSION)
+
+set(PYTHON_LINKFLAGS "-Xlinker -export-dynamic")
+mark_as_advanced(PYTHON_LINKFLAGS)
+
+set(_Python_ABI_FLAGS
+ "m;mu;u; ")
+
+string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION})
+set(_Python_PATHS
+ "$ENV{HOME}/py${_PYTHON_VERSION_NO_DOTS}" "/opt/py${_PYTHON_VERSION_NO_DOTS}" "/usr" "/usr/local")
+
+if(NOT DEFINED PYTHON_INCLUDE_DIRS)
+ message(STATUS "Looking for include Python.h")
+ set(_Found_PYTHON_H OFF)
+
+ foreach(_CURRENT_PATH ${_Python_PATHS})
+ foreach(_CURRENT_ABI_FLAGS ${_Python_ABI_FLAGS})
+ if(CMAKE_BUILD_TYPE STREQUAL Debug)
+ set(_CURRENT_ABI_FLAGS "d${_CURRENT_ABI_FLAGS}")
+ endif()
+ string(REPLACE " " "" _CURRENT_ABI_FLAGS ${_CURRENT_ABI_FLAGS})
+
+ set(_Python_HEADER "${_CURRENT_PATH}/include/python${PYTHON_VERSION}${_CURRENT_ABI_FLAGS}/Python.h")
+
+ if(EXISTS ${_Python_HEADER})
+ message(STATUS "Checking for header: ${_Python_HEADER} - found")
+ set(_Found_PYTHON_H ON)
+ set(PYTHON ${_CURRENT_PATH})
+ set(PYTHON_ABI_FLAGS ${_CURRENT_ABI_FLAGS})
+ break()
+ else()
+ message(STATUS "Checking for header: ${_Python_HEADER}")
+ endif()
+ endforeach()
+
+ if(_Found_PYTHON_H)
+ break()
+ endif()
+ endforeach()
+
+ if(NOT _Found_PYTHON_H)
+ message(FATAL_ERROR "Python.h not found")
+ endif()
+endif()
+
+#=============================================================================
+# now the python versions are found
+
+
+set(PYTHON_INCLUDE_DIRS "${PYTHON}/include/python${PYTHON_VERSION}${PYTHON_ABI_FLAGS}" CACHE STRING "")
+mark_as_advanced(PYTHON_INCLUDE_DIRS)
+set(PYTHON_LIBRARY "python${PYTHON_VERSION}${PYTHON_ABI_FLAGS}" CACHE STRING "")
+mark_as_advanced(PYTHON_LIBRARY)
+set(PYTHON_LIBPATH ${PYTHON}/lib CACHE STRING "")
+mark_as_advanced(PYTHON_LIBPATH)
+# set(PYTHON_BINARY ${PYTHON_EXECUTABLE} CACHE STRING "")
+
+if(NOT EXISTS "${PYTHON_INCLUDE_DIRS}/Python.h")
+ message(FATAL_ERROR " Missing python header: ${PYTHON_INCLUDE_DIRS}/Python.h")
+endif()
diff --git a/build_files/cmake/Modules/FindGLEW.cmake b/build_files/cmake/Modules/FindGLEW.cmake
new file mode 100644
index 00000000000..c791327c8da
--- /dev/null
+++ b/build_files/cmake/Modules/FindGLEW.cmake
@@ -0,0 +1,59 @@
+#
+# Try to find GLEW library and include path.
+# Once done this will define
+#
+# GLEW_FOUND
+# GLEW_INCLUDE_PATH
+# GLEW_LIBRARY
+#
+
+IF (WIN32)
+ FIND_PATH( GLEW_INCLUDE_PATH GL/glew.h
+ $ENV{PROGRAMFILES}/GLEW/include
+ ${PROJECT_SOURCE_DIR}/src/nvgl/glew/include
+ DOC "The directory where GL/glew.h resides")
+ IF (NV_SYSTEM_PROCESSOR STREQUAL "AMD64")
+ FIND_LIBRARY( GLEW_LIBRARY
+ NAMES glew64 glew64s
+ PATHS
+ $ENV{PROGRAMFILES}/GLEW/lib
+ ${PROJECT_SOURCE_DIR}/src/nvgl/glew/bin
+ ${PROJECT_SOURCE_DIR}/src/nvgl/glew/lib
+ DOC "The GLEW library (64-bit)"
+ )
+ ELSE(NV_SYSTEM_PROCESSOR STREQUAL "AMD64")
+ FIND_LIBRARY( GLEW_LIBRARY
+ NAMES glew GLEW glew32 glew32s
+ PATHS
+ $ENV{PROGRAMFILES}/GLEW/lib
+ ${PROJECT_SOURCE_DIR}/src/nvgl/glew/bin
+ ${PROJECT_SOURCE_DIR}/src/nvgl/glew/lib
+ DOC "The GLEW library"
+ )
+ ENDIF(NV_SYSTEM_PROCESSOR STREQUAL "AMD64")
+ELSE (WIN32)
+ FIND_PATH( GLEW_INCLUDE_PATH GL/glew.h
+ /usr/include
+ /usr/local/include
+ /sw/include
+ /opt/local/include
+ DOC "The directory where GL/glew.h resides")
+ FIND_LIBRARY( GLEW_LIBRARY
+ NAMES GLEW glew
+ PATHS
+ /usr/lib64
+ /usr/lib
+ /usr/local/lib64
+ /usr/local/lib
+ /sw/lib
+ /opt/local/lib
+ DOC "The GLEW library")
+ENDIF (WIN32)
+
+IF (GLEW_INCLUDE_PATH)
+ SET( GLEW_FOUND 1 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise")
+ELSE (GLEW_INCLUDE_PATH)
+ SET( GLEW_FOUND 0 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise")
+ENDIF (GLEW_INCLUDE_PATH)
+
+MARK_AS_ADVANCED( GLEW_FOUND )
diff --git a/build_files/cmake/cmake_qtcreator_project.py b/build_files/cmake/cmake_qtcreator_project.py
index 925aee564b8..59b8b2a3b02 100644
--- a/build_files/cmake/cmake_qtcreator_project.py
+++ b/build_files/cmake/cmake_qtcreator_project.py
@@ -17,12 +17,21 @@
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
-# Contributor(s): Campbell Barton
+# Contributor(s): Campbell Barton, M.G. Kishalmi
#
# ***** END GPL LICENSE BLOCK *****
# <pep8 compliant>
+"""
+Example Win32 usage:
+ c:\Python32\python.exe c:\blender_dev\blender\build_files\cmake\cmake_qtcreator_project.py c:\blender_dev\cmake_build
+
+example linux usage
+ python .~/blenderSVN/blender/build_files/cmake/cmake_qtcreator_project.py ~/blenderSVN/cmake
+"""
+
+import sys
import os
from os.path import join, dirname, normpath, abspath, splitext, relpath, exists
@@ -30,6 +39,22 @@ base = join(os.path.dirname(__file__), "..", "..")
base = normpath(base)
base = abspath(base)
+SIMPLE_PROJECTFILE = False
+
+# get cmake path
+CMAKE_DIR = sys.argv[-1]
+
+if not os.path.exists(os.path.join(CMAKE_DIR, "CMakeCache.txt")):
+ CMAKE_DIR = os.getcwd()
+if not os.path.exists(os.path.join(CMAKE_DIR, "CMakeCache.txt")):
+ print("CMakeCache.txt not found in %r or %r\n Pass CMake build dir as an argument, or run from that dir, aborting" % (CMAKE_DIR, os.getcwd()))
+ sys.exit(1)
+
+
+# could be either.
+# PROJECT_DIR = base
+PROJECT_DIR = CMAKE_DIR
+
def source_list(path, filename_check=None):
for dirpath, dirnames, filenames in os.walk(path):
@@ -47,7 +72,7 @@ def source_list(path, filename_check=None):
# extension checking
def is_cmake(filename):
ext = splitext(filename)[1]
- return (ext == ".cmake") or (filename == "CMakeLists.txt")
+ return (ext == ".cmake") or (filename.endswith("CMakeLists.txt"))
def is_c_header(filename):
@@ -55,6 +80,16 @@ def is_c_header(filename):
return (ext in (".h", ".hpp", ".hxx"))
+def is_py(filename):
+ ext = splitext(filename)[1]
+ return (ext == ".py")
+
+
+def is_glsl(filename):
+ ext = splitext(filename)[1]
+ return (ext == ".glsl")
+
+
def is_c(filename):
ext = splitext(filename)[1]
return (ext in (".c", ".cpp", ".cxx", ".m", ".mm", ".rc"))
@@ -71,31 +106,186 @@ def is_svn_file(filename):
def is_project_file(filename):
- return (is_c_any(filename) or is_cmake(filename)) and is_svn_file(filename)
+ return (is_c_any(filename) or is_cmake(filename) or is_glsl(filename)) # and is_svn_file(filename)
+
+
+def cmake_advanced_info():
+ """ Extracr includes and defines from cmake.
+ """
+
+ def create_eclipse_project(CMAKE_DIR):
+ print("CMAKE_DIR %r" % CMAKE_DIR)
+ if sys.platform == "win32":
+ cmd = 'cmake "%s" -G"Eclipse CDT4 - MinGW Makefiles"' % CMAKE_DIR
+ else:
+ cmd = 'cmake "%s" -G"Eclipse CDT4 - Unix Makefiles"' % CMAKE_DIR
+
+ os.system(cmd)
+
+ includes = []
+ defines = []
+
+ create_eclipse_project(CMAKE_DIR)
+
+ from xml.dom.minidom import parse
+ tree = parse(os.path.join(CMAKE_DIR, ".cproject"))
+ '''
+ f = open(".cproject_pretty", 'w')
+ f.write(tree.toprettyxml(indent=" ", newl=""))
+ '''
+ ELEMENT_NODE = tree.ELEMENT_NODE
+
+ cproject, = tree.getElementsByTagName("cproject")
+ for storage in cproject.childNodes:
+ if storage.nodeType != ELEMENT_NODE:
+ continue
+
+ if storage.attributes["moduleId"].value == "org.eclipse.cdt.core.settings":
+ cconfig = storage.getElementsByTagName("cconfiguration")[0]
+ for substorage in cconfig.childNodes:
+ if substorage.nodeType != ELEMENT_NODE:
+ continue
+
+ moduleId = substorage.attributes["moduleId"].value
+
+ # org.eclipse.cdt.core.settings
+ # org.eclipse.cdt.core.language.mapping
+ # org.eclipse.cdt.core.externalSettings
+ # org.eclipse.cdt.core.pathentry
+ # org.eclipse.cdt.make.core.buildtargets
+
+ if moduleId == "org.eclipse.cdt.core.pathentry":
+ for path in substorage.childNodes:
+ if path.nodeType != ELEMENT_NODE:
+ continue
+ kind = path.attributes["kind"].value
+
+ if kind == "mac":
+ # <pathentry kind="mac" name="PREFIX" path="" value="&quot;/opt/blender25&quot;"/>
+ defines.append((path.attributes["name"].value, path.attributes["value"].value))
+ elif kind == "inc":
+ # <pathentry include="/data/src/blender/blender/source/blender/editors/include" kind="inc" path="" system="true"/>
+ includes.append(path.attributes["include"].value)
+ else:
+ pass
+
+ return includes, defines
+
+
+def cmake_cache_var(var):
+ cache_file = open(os.path.join(CMAKE_DIR, "CMakeCache.txt"))
+ lines = [l_strip for l in cache_file for l_strip in (l.strip(),) if l_strip if not l_strip.startswith("//") if not l_strip.startswith("#")]
+ cache_file.close()
+
+ for l in lines:
+ if l.split(":")[0] == var:
+ return l.split("=", 1)[-1]
+ return None
+
+
+def cmake_compiler_defines():
+ compiler = cmake_cache_var("CMAKE_C_COMPILER") # could do CXX too
+
+ if compiler is None:
+ print("Couldn't find the compiler, os defines will be omitted...")
+ return
+
+ import tempfile
+ temp_c = tempfile.mkstemp(suffix=".c")[1]
+ temp_def = tempfile.mkstemp(suffix=".def")[1]
+
+ os.system("%s -dM -E %s > %s" % (compiler, temp_c, temp_def))
+
+ temp_def_file = open(temp_def)
+ lines = [l.strip() for l in temp_def_file if l.strip()]
+ temp_def_file.close()
+
+ os.remove(temp_c)
+ os.remove(temp_def)
+ return lines
+
+
+def create_qtc_project_main():
+ files = list(source_list(base, filename_check=is_project_file))
+ files_rel = [relpath(f, start=PROJECT_DIR) for f in files]
+ files_rel.sort()
+
+ # --- qtcreator specific, simple format
+ if SIMPLE_PROJECTFILE:
+ # --- qtcreator specific, simple format
+ PROJECT_NAME = "Blender"
+ f = open(join(PROJECT_DIR, "%s.files" % PROJECT_NAME), 'w')
+ f.write("\n".join(files_rel))
+
+ f = open(join(PROJECT_DIR, "%s.includes" % PROJECT_NAME), 'w')
+ f.write("\n".join(sorted(list(set(dirname(f) for f in files_rel if is_c_header(f))))))
+
+ qtc_prj = join(PROJECT_DIR, "%s.creator" % PROJECT_NAME)
+ f = open(qtc_prj, 'w')
+ f.write("[General]\n")
+
+ qtc_cfg = join(PROJECT_DIR, "%s.config" % PROJECT_NAME)
+ if not exists(qtc_cfg):
+ f = open(qtc_cfg, 'w')
+ f.write("// ADD PREDEFINED MACROS HERE!\n")
+ else:
+ includes, defines = cmake_advanced_info()
+
+ # for some reason it doesnt give all internal includes
+ includes = list(set(includes) | set(dirname(f) for f in files_rel if is_c_header(f)))
+ includes.sort()
+
+ PROJECT_NAME = "Blender"
+ FILE_NAME = PROJECT_NAME.lower()
+ f = open(join(PROJECT_DIR, "%s.files" % FILE_NAME), 'w')
+ f.write("\n".join(files_rel))
+
+ f = open(join(PROJECT_DIR, "%s.includes" % FILE_NAME), 'w')
+ f.write("\n".join(sorted(includes)))
+
+ qtc_prj = join(PROJECT_DIR, "%s.creator" % FILE_NAME)
+ f = open(qtc_prj, 'w')
+ f.write("[General]\n")
+
+ qtc_cfg = join(PROJECT_DIR, "%s.config" % FILE_NAME)
+ f = open(qtc_cfg, 'w')
+ f.write("// ADD PREDEFINED MACROS HERE!\n")
+ defines_final = [("#define %s %s" % item) for item in defines]
+ if sys.platform != "win32":
+ defines_final += cmake_compiler_defines() # defines from the compiler
+ f.write("\n".join(defines_final))
+
+ print("Blender project file written to: %s" % qtc_prj)
+ # --- end
+
+
+def create_qtc_project_python():
+ files = list(source_list(base, filename_check=is_py))
+ files_rel = [relpath(f, start=PROJECT_DIR) for f in files]
+ files_rel.sort()
+
+ # --- qtcreator specific, simple format
+ PROJECT_NAME = "Blender_Python"
+ FILE_NAME = PROJECT_NAME.lower()
+ f = open(join(PROJECT_DIR, "%s.files" % FILE_NAME), 'w')
+ f.write("\n".join(files_rel))
-files = list(source_list(base, filename_check=is_project_file))
-files_rel = [relpath(f, start=base) for f in files]
-files_rel.sort()
+ qtc_prj = join(PROJECT_DIR, "%s.creator" % FILE_NAME)
+ f = open(qtc_prj, 'w')
+ f.write("[General]\n")
+ qtc_cfg = join(PROJECT_DIR, "%s.config" % FILE_NAME)
+ if not exists(qtc_cfg):
+ f = open(qtc_cfg, 'w')
+ f.write("// ADD PREDEFINED MACROS HERE!\n")
-# --- qtcreator spesific, simple format
-PROJECT_NAME = "Blender"
-f = open(join(base, "%s.files" % PROJECT_NAME), 'w')
-f.write("\n".join(files_rel))
+ print("Python project file written to: %s" % qtc_prj)
-f = open(join(base, "%s.includes" % PROJECT_NAME), 'w')
-f.write("\n".join(sorted(list(set(dirname(f) for f in files_rel if is_c_header(f))))))
-qtc_prj = join(base, "%s.creator" % PROJECT_NAME)
-f = open(qtc_prj, 'w')
-f.write("[General]\n")
+def main():
+ create_qtc_project_main()
+ create_qtc_project_python()
-qtc_cfg = join(base, "%s.config" % PROJECT_NAME)
-if not exists(qtc_cfg):
- f = open(qtc_cfg, 'w')
- f.write("// ADD PREDEFINED MACROS HERE!\n")
- # todo, include real defines.
- f.write("#define WITH_PYTHON\n")
-print("Project file written to: %s" % qtc_prj)
-# --- end
+if __name__ == "__main__":
+ main()
diff --git a/build_files/cmake/example_scripts/make_quicky.py b/build_files/cmake/example_scripts/make_quicky.py
index 69f7604c8cc..05850254867 100755
--- a/build_files/cmake/example_scripts/make_quicky.py
+++ b/build_files/cmake/example_scripts/make_quicky.py
@@ -42,8 +42,8 @@ def main():
targets = set()
# collect targets
- file = open("Makefile", "r")
- for line in file:
+ makefile = open("Makefile", "r")
+ for line in makefile:
line = line.rstrip()
if not line or line[0] in ". \t@$#":
continue
@@ -58,7 +58,7 @@ def main():
continue
targets.add(line)
- file.close()
+ makefile.close()
# remove cmake targets
diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 007c147ccef..ca1dd79cd8e 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -66,7 +66,7 @@ macro(SETUP_LIBDIRS)
link_directories(${JPEG_LIBPATH} ${PNG_LIBPATH} ${ZLIB_LIBPATH} ${FREETYPE_LIBPATH})
- if(WITH_PYTHON AND NOT WITH_PYTHON_MODULE)
+ if(WITH_PYTHON) # AND NOT WITH_PYTHON_MODULE # WIN32 needs
link_directories(${PYTHON_LIBPATH})
endif()
if(WITH_INTERNATIONAL)
@@ -127,7 +127,7 @@ macro(setup_liblinks
target_link_libraries(${target} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ${JPEG_LIBRARIES} ${PNG_LIBRARIES} ${ZLIB_LIBRARIES} ${LLIBS})
# since we are using the local libs for python when compiling msvc projects, we need to add _d when compiling debug versions
- if(WITH_PYTHON AND NOT WITH_PYTHON_MODULE)
+ if(WITH_PYTHON) # AND NOT WITH_PYTHON_MODULE # WIN32 needs
target_link_libraries(${target} ${PYTHON_LINKFLAGS})
if(WIN32 AND NOT UNIX)
@@ -138,6 +138,10 @@ macro(setup_liblinks
endif()
endif()
+ if(NOT WITH_BUILTIN_GLEW)
+ target_link_libraries(${target} ${GLEW_LIBRARY})
+ endif()
+
target_link_libraries(${target} ${OPENGL_glu_LIBRARY} ${JPEG_LIBRARIES} ${PNG_LIBRARIES} ${ZLIB_LIBRARIES})
target_link_libraries(${target} ${FREETYPE_LIBRARY})
@@ -265,7 +269,7 @@ endmacro()
# needs to be removed for some external libs which we dont maintain.
# utility macro
-macro(_remove_strict_flags
+macro(remove_flag
flag)
string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
@@ -285,12 +289,12 @@ endmacro()
macro(remove_strict_flags)
if(CMAKE_COMPILER_IS_GNUCC)
- _remove_strict_flags("-Wstrict-prototypes")
- _remove_strict_flags("-Wunused-parameter")
- _remove_strict_flags("-Wwrite-strings")
- _remove_strict_flags("-Wshadow")
- _remove_strict_flags("-Werror=[^ ]+")
- _remove_strict_flags("-Werror")
+ remove_flag("-Wstrict-prototypes")
+ remove_flag("-Wunused-parameter")
+ remove_flag("-Wwrite-strings")
+ remove_flag("-Wshadow")
+ remove_flag("-Werror=[^ ]+")
+ remove_flag("-Werror")
endif()
if(MSVC)
@@ -350,7 +354,12 @@ macro(get_blender_version)
message(FATAL_ERROR "Version parsing failed for BLENDER_SUBVERSION")
endif()
- if(NOT ${_out_version_char} MATCHES "[a-z]+")
+ # clumsy regex, only single char are ok but it could be unset
+
+ string(LENGTH "${_out_version_char}" _out_version_char_len)
+ if(NOT _out_version_char_len EQUAL 1)
+ set(_out_version_char "")
+ elseif(NOT ${_out_version_char} MATCHES "[a-z]+")
message(FATAL_ERROR "Version parsing failed for BLENDER_VERSION_CHAR")
endif()
@@ -358,13 +367,30 @@ macro(get_blender_version)
message(FATAL_ERROR "Version parsing failed for BLENDER_VERSION_CYCLE")
endif()
- MATH(EXPR BLENDER_VERSION_MAJOR "${_out_version} / 100")
- MATH(EXPR BLENDER_VERSION_MINOR "${_out_version} % 100")
+ math(EXPR BLENDER_VERSION_MAJOR "${_out_version} / 100")
+ math(EXPR BLENDER_VERSION_MINOR "${_out_version} % 100")
set(BLENDER_VERSION "${BLENDER_VERSION_MAJOR}.${BLENDER_VERSION_MINOR}")
set(BLENDER_SUBVERSION ${_out_subversion})
set(BLENDER_VERSION_CHAR ${_out_version_char})
set(BLENDER_VERSION_CYCLE ${_out_version_cycle})
+ # for packaging, alpha to numbers
+ string(COMPARE EQUAL "${BLENDER_VERSION_CHAR}" "" _out_version_char_empty)
+ if(${_out_version_char_empty})
+ set(BLENDER_VERSION_CHAR_INDEX "0")
+ else()
+ set(_char_ls a b c d e f g h i j k l m n o p q r s t u v w q y z)
+ list(FIND _char_ls ${BLENDER_VERSION_CHAR} _out_version_char_index)
+ math(EXPR BLENDER_VERSION_CHAR_INDEX "${_out_version_char_index} + 1")
+ unset(_char_ls)
+ unset(_out_version_char_index)
+ endif()
+
+ unset(_out_subversion)
+ unset(_out_version_char)
+ unset(_out_version_char_empty)
+ unset(_out_version_cycle)
+
# message(STATUS "Version (Internal): ${BLENDER_VERSION}.${BLENDER_SUBVERSION}, Version (external): ${BLENDER_VERSION}${BLENDER_VERSION_CHAR}-${BLENDER_VERSION_CYCLE}")
endmacro()
diff --git a/build_files/cmake/packaging.cmake b/build_files/cmake/packaging.cmake
index 0de5451d45f..ee07857db26 100644
--- a/build_files/cmake/packaging.cmake
+++ b/build_files/cmake/packaging.cmake
@@ -4,37 +4,82 @@ set(PROJECT_CONTACT "foundation@blender.org")
set(PROJECT_VENDOR "Blender Foundation")
set(ORG_WEBSITE "www.blender.org")
+set(MAJOR_VERSION ${BLENDER_VERSION_MAJOR})
+set(MINOR_VERSION ${BLENDER_VERSION_MINOR})
+set(PATCH_VERSION ${BLENDER_VERSION_CHAR_INDEX})
+
set(CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME})
set(CPACK_PACKAGE_DESCRIPTION ${PROJECT_DESCRIPTION})
set(CPACK_PACKAGE_VENDOR ${PROJECT_VENDOR})
set(CPACK_PACKAGE_CONTACT ${PROJECT_CONTACT})
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING")
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
+SET(CPACK_PACKAGE_VERSION_MAJOR "${MAJOR_VERSION}")
+SET(CPACK_PACKAGE_VERSION_MINOR "${MINOR_VERSION}")
+SET(CPACK_PACKAGE_VERSION_PATCH "${PATCH_VERSION}")
+
+
+# Get the build revision, note that this can get out-of-sync, so for packaging run cmake first.
+include(FindSubversion)
+set(MY_WC_REVISION "unknown")
+if(EXISTS ${CMAKE_SOURCE_DIR}/.svn/)
+ if(Subversion_FOUND)
+ Subversion_WC_INFO(${CMAKE_SOURCE_DIR} MY)
+ endif()
+endif()
+set(BUILD_REV ${MY_WC_REVISION})
+
# Force Package Name
set(CPACK_PACKAGE_FILE_NAME ${PROJECT_NAME}-${BLENDER_VERSION}-r${BUILD_REV}-${CPACK_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR})
-# RPM packages
-include(build_files/cmake/RpmBuild.cmake)
-if(RPMBUILD_FOUND AND NOT WIN32)
- set(CPACK_GENERATOR "RPM")
- set(CPACK_SET_DESTDIR TRUE)
- set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
-endif(RPMBUILD_FOUND AND NOT WIN32)
+if(CMAKE_SYSTEM_NAME MATCHES "Linux")
+ # RPM packages
+ include(build_files/cmake/RpmBuild.cmake)
+ if(RPMBUILD_FOUND AND NOT WIN32)
+ set(CPACK_GENERATOR "RPM")
+ set(CPACK_SET_DESTDIR TRUE)
+ set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_DESCRIPTION}")
+ set(CPACK_RPM_PACKAGE_LICENSE "GPLv2")
+ set(CPACK_RPM_PACKAGE_GROUP "Amusements/Graphics")
+ endif()
+endif()
# Mac Bundle
if(APPLE)
- set(CPACK_GENERATOR "DragNDrop")
-
- #Libraries are bundled directly
- set(CPACK_COMPONENT_LIBRARIES_HIDDEN TRUE)
+ set(CPACK_GENERATOR "DragNDrop")
- # Bundle Properties
- set(MACOSX_BUNDLE_BUNDLE_NAME blender)
- set(MACOSX_BUNDLE_BUNDLE_VERSION ${BLENDER_VERSION})
- set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${BLENDER_VERSION})
- set(MACOSX_BUNDLE_LONG_VERSION_STRING "Version ${BLENDER_VERSION}-r${BUILD_REV}")
-endif(APPLE)
+ # Libraries are bundled directly
+ set(CPACK_COMPONENT_LIBRARIES_HIDDEN TRUE)
+endif()
set(CPACK_PACKAGE_EXECUTABLES "blender")
include(CPack)
+
+# Target for build_archive.py script, to automatically pass along
+# version, revision, platform, build directory
+macro(add_package_archive packagename extension)
+ set(build_archive python ${CMAKE_SOURCE_DIR}/build_files/package_spec/build_archive.py)
+ set(package_output ${CMAKE_BINARY_DIR}/release/${packagename}.${extension})
+
+ add_custom_target(package_archive DEPENDS ${package_output})
+
+ add_custom_command(
+ OUTPUT ${package_output}
+ COMMAND ${build_archive} ${packagename} ${extension} bin release
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
+endmacro()
+
+if(APPLE)
+ add_package_archive(
+ "blender-${BLENDER_VERSION}-r${BUILD_REV}-OSX-${CMAKE_OSX_ARCHITECTURES}"
+ "zip")
+elseif(UNIX)
+ # platform name could be tweaked, to include glibc, and ensure processor is correct (i386 vs i686)
+ string(TOLOWER ${CMAKE_SYSTEM_NAME} PACKAGE_SYSTEM_NAME)
+
+ add_package_archive(
+ "blender-${BLENDER_VERSION}-r${BUILD_REV}-${PACKAGE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}"
+ "tar.bz2")
+endif()
+
diff --git a/build_files/package_spec/build_archive.py b/build_files/package_spec/build_archive.py
new file mode 100755
index 00000000000..0329d16b1ec
--- /dev/null
+++ b/build_files/package_spec/build_archive.py
@@ -0,0 +1,70 @@
+#!/usr/bin/python
+
+# <pep8 compliant>
+
+import os
+import shutil
+import subprocess
+import sys
+
+# todo:
+# strip executables
+
+# get parameters
+if len(sys.argv) < 5:
+ sys.stderr.write('Excepted arguments: ./build_archive.py name extension install_dir output_dir')
+ sys.exit(1)
+
+package_name = sys.argv[1]
+extension = sys.argv[2]
+install_dir = sys.argv[3]
+output_dir = sys.argv[4]
+
+package_archive = os.path.join(output_dir, package_name + '.' + extension)
+package_dir = package_name
+
+# remove existing package with the same name
+try:
+ if os.path.exists(package_archive):
+ os.remove(package_archive)
+ if os.path.exists(package_dir):
+ shutil.rmtree(package_dir)
+except Exception, ex:
+ sys.stderr.write('Failed to clean up old package files: ' + str(ex) + '\n')
+ sys.exit(1)
+
+# create temporary package dir
+try:
+ shutil.copytree(install_dir, package_dir)
+
+ for f in os.listdir(package_dir):
+ if f.startswith('makes'):
+ os.remove(os.path.join(package_dir, f))
+except Exception, ex:
+ sys.stderr.write('Failed to copy install directory: ' + str(ex) + '\n')
+ sys.exit(1)
+
+# create archive
+try:
+ if not os.path.exists(output_dir):
+ os.mkdir(output_dir)
+
+ if extension == 'zip':
+ archive_cmd = ['zip', '-9', '-r', package_archive, package_dir]
+ elif extension == 'tar.bz2':
+ archive_cmd = ['tar', 'cjf', package_archive, package_dir]
+ else:
+ sys.stderr.write('Unknown archive extension: ' + extension)
+ sys.exit(-1)
+
+ subprocess.call(archive_cmd)
+except Exception, ex:
+ sys.stderr.write('Failed to create package archive: ' + str(ex) + '\n')
+ sys.exit(1)
+
+# empty temporary package dir
+try:
+ shutil.rmtree(package_dir)
+except Exception, ex:
+ sys.stderr.write('Failed to clean up package directory: ' + str(ex) + '\n')
+ sys.exit(1)
diff --git a/build_files/package_spec/debian/control b/build_files/package_spec/debian/control
index 7329a552dbc..be703e05071 100644
--- a/build_files/package_spec/debian/control
+++ b/build_files/package_spec/debian/control
@@ -2,10 +2,10 @@ Source: blender
Section: graphics
Priority: extra
Maintainer: Dan Eicher <dan@trollwerks.org>
-Build-Depends: debhelper (>= 7.0.50~), cmake, python3, python, libfreetype6-dev, libglu1-mesa-dev, libilmbase-dev, libopenexr-dev, libjpeg62-dev, libopenal-dev, libpng12-dev, libsamplerate0-dev, libsdl-dev, libtiff4-dev, libx11-dev, libxi-dev, zlib1g-dev, python3.1-dev, libopenjpeg-dev
+Build-Depends: debhelper (>= 7.0.50~), cmake, python3, python, libfreetype6-dev, libglu1-mesa-dev, libilmbase-dev, libopenexr-dev, libjpeg62-dev, libopenal-dev, libpng12-dev, libsamplerate0-dev, libsdl-dev, libtiff4-dev, libx11-dev, libxi-dev, zlib1g-dev, python3.2-dev, libopenjpeg-dev
Standards-Version: 3.9.1
Homepage: http://blender.org/
-X-Python3-Version: >= 3.1, << 3.2
+X-Python3-Version: >= 3.2, << 3.3
Package: blender-snapshot
Architecture: any
diff --git a/build_files/package_spec/debian/rules b/build_files/package_spec/debian/rules
index 2991589916e..7a3d2d52adc 100755
--- a/build_files/package_spec/debian/rules
+++ b/build_files/package_spec/debian/rules
@@ -15,9 +15,13 @@ override_dh_auto_configure:
# blender spesific CMake options
dh_auto_configure -- \
-DCMAKE_BUILD_TYPE:STRING=Release \
+ -DWITH_INSTALL_PORTABLE:BOOL=OFF \
-DWITH_PYTHON_INSTALL:BOOL=OFF \
-DWITH_OPENCOLLADA:BOOL=OFF
+override_dh_auto_test:
+ # don't run CTest
+
override_dh_install:
dh_install
@@ -25,7 +29,7 @@ override_dh_install:
rm -rf debian/blender-snapshot/usr/share/doc/blender
override_dh_python3:
- dh_python3 -V 3.1-3.2 /usr/share/blender/$(REL)/scripts
+ dh_python3 -V 3.2-3.3 /usr/share/blender/$(REL)/scripts
get-orig-source:
rm -rf get-orig-source $(TARBALL)
diff --git a/build_files/package_spec/debian/watch b/build_files/package_spec/debian/watch
index 25e0a6ddccc..0f8473b25ef 100644
--- a/build_files/package_spec/debian/watch
+++ b/build_files/package_spec/debian/watch
@@ -1,2 +1,3 @@
version=3
+opts=uversionmangle=s/[a-z]$/.$&/;s/[j-s]$/1$&/;s/[t-z]$/2$&/;tr/a-z/1-90-90-6/ \
http://download.blender.org/source/blender-([0-9.]+[a-z]?)\.tar\.gz
diff --git a/build_files/package_spec/pacman/PKGBUILD b/build_files/package_spec/pacman/PKGBUILD
index 5f7dd8b38ac..0c4164b1242 100644
--- a/build_files/package_spec/pacman/PKGBUILD
+++ b/build_files/package_spec/pacman/PKGBUILD
@@ -3,11 +3,11 @@
# custom blender vars
blender_srcdir=$(dirname $startdir)"/../.."
# value may be formatted: 35042:35051M
-blender_revision=$(svnversion $blender_srcdir | cut -d: -f2 | tr -dc 0-9)
-blender_version=$(grep BLENDER_VERSION $blender_srcdir/source/blender/blenkernel/BKE_blender.h | tr -dc 0-9)
+blender_revision=$(svnversion $blender_srcdir | cut -d: -f2 | awk '{print $3}')
+blender_version=$(grep BLENDER_VERSION $blender_srcdir/source/blender/blenkernel/BKE_blender.h | awk '{print $3}')
blender_version=$(expr $blender_version / 100).$(expr $blender_version % 100) # 256 -> 2.56
blender_version_char=$(sed -ne 's/.*BLENDER_VERSION_CHAR.*\([a-z]\)$/\1/p' $blender_srcdir/source/blender/blenkernel/BKE_blender.h)
-# blender_subversion=$(grep BLENDER_SUBVERSION $blender_srcdir/source/blender/blenkernel/BKE_blender.h | tr -dc 0-9)
+# blender_subversion=$(grep BLENDER_SUBVERSION $blender_srcdir/source/blender/blenkernel/BKE_blender.h | awk '{print $3}')
# map the version a -> 1
# not to be confused with blender's internal subversions
@@ -25,7 +25,7 @@ arch=('i686' 'x86_64')
url="www.blender.org"
license=('GPL')
groups=()
-depends=('libjpeg' 'libpng' 'openjpeg' 'libtiff' 'openexr' 'python>=3.1' 'gettext' 'libxi' 'libxmu' 'mesa' 'freetype2' 'openal' 'sdl' 'libsndfile' 'libsamplerate' 'ffmpeg')
+depends=('libjpeg' 'libpng' 'openjpeg' 'libtiff' 'openexr' 'python>=3.2' 'gettext' 'libxi' 'libxmu' 'mesa' 'freetype2' 'openal' 'sdl' 'libsndfile' 'libsamplerate' 'ffmpeg')
makedepends=('cmake' 'svn')
optdepends=()
provides=()
@@ -47,8 +47,13 @@ build() {
cmake $blender_srcdir \
-DCMAKE_INSTALL_PREFIX:PATH=/usr \
-DCMAKE_BUILD_TYPE:STRING=Release \
+ -DWITH_INSTALL_PORTABLE:BOOL=OFF \
-DWITH_PYTHON_INSTALL:BOOL=OFF \
- -DWITH_OPENCOLLADA:BOOL=OFF
+ -DWITH_OPENCOLLADA:BOOL=OFF \
+ -DPYTHON_VERSION:STRING=3.2 \
+ -DPYTHON_LIBPATH:STRING=/usr/lib \
+ -DPYTHON_LIBRARY:STRING=python3.2mu \
+ -DPYTHON_INCLUDE_DIRS:STRING=/usr/include/python3.2mu
make $MAKEFLAGS
}
diff --git a/build_files/scons/config/aix4-config.py b/build_files/scons/config/aix4-config.py
index c3c28d27e6e..e8004338271 100644
--- a/build_files/scons/config/aix4-config.py
+++ b/build_files/scons/config/aix4-config.py
@@ -8,7 +8,7 @@ WITH_BF_VERSE = 'false'
BF_VERSE_INCLUDE = "#extern/verse/dist"
BF_PYTHON = LCGDIR+'/python'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
WITH_BF_STATICPYTHON = 'true'
BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}'
diff --git a/build_files/scons/config/darwin-config.py b/build_files/scons/config/darwin-config.py
index fb59eb69a2d..0c51476a6d0 100644
--- a/build_files/scons/config/darwin-config.py
+++ b/build_files/scons/config/darwin-config.py
@@ -86,7 +86,7 @@ BF_FFMPEG_LIB = 'avcodec avdevice avformat avutil mp3lame swscale x264 xvidcore
#bz2 is a standard osx dynlib
# python 3.1 uses precompiled libraries in bf svn /lib by default
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
BF_PYTHON = LIBDIR + '/python'
BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
# BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}'
diff --git a/build_files/scons/config/freebsd7-config.py b/build_files/scons/config/freebsd7-config.py
index 387b4ed521a..a73574abf67 100644
--- a/build_files/scons/config/freebsd7-config.py
+++ b/build_files/scons/config/freebsd7-config.py
@@ -4,14 +4,15 @@ CXX = 'g++44'
LCGDIR = '../lib/freebsd7'
LIBDIR = "${LCGDIR}"
+BF_PYTHON_ABI_FLAGS = ''
BF_PYTHON = '/usr/local'
BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
WITH_BF_STATICPYTHON = False
-BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
+BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}'
BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}'
-BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}'
-BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}.a'
+BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}'
+BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}.a'
WITH_BF_OPENAL = True
WITH_BF_STATICOPENAL = False
diff --git a/build_files/scons/config/freebsd8-config.py b/build_files/scons/config/freebsd8-config.py
index 1ceeea9d823..dd7ab5f9ab9 100644
--- a/build_files/scons/config/freebsd8-config.py
+++ b/build_files/scons/config/freebsd8-config.py
@@ -4,14 +4,15 @@ CXX = 'g++44'
LCGDIR = '../lib/freebsd8'
LIBDIR = "${LCGDIR}"
+BF_PYTHON_ABI_FLAGS = ''
BF_PYTHON = '/usr/local'
BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
WITH_BF_STATICPYTHON = False
-BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
+BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}'
BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}'
-BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}'
-BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}.a'
+BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}'
+BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}.a'
WITH_BF_OPENAL = True
WITH_BF_STATICOPENAL = False
diff --git a/build_files/scons/config/freebsd9-config.py b/build_files/scons/config/freebsd9-config.py
index 4209ff4ab72..9c53d52ce71 100644
--- a/build_files/scons/config/freebsd9-config.py
+++ b/build_files/scons/config/freebsd9-config.py
@@ -4,14 +4,15 @@ CXX = 'g++44'
LCGDIR = '../lib/freebsd9'
LIBDIR = "${LCGDIR}"
+BF_PYTHON_ABI_FLAGS = ''
BF_PYTHON = '/usr/local'
BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
WITH_BF_STATICPYTHON = False
-BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
+BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}'
BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}'
-BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}'
-BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}.a'
+BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}'
+BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}.a'
WITH_BF_OPENAL = True
WITH_BF_STATICOPENAL = False
diff --git a/build_files/scons/config/irix6-config.py b/build_files/scons/config/irix6-config.py
index 14dc04c4259..4ca7bcc7b64 100644
--- a/build_files/scons/config/irix6-config.py
+++ b/build_files/scons/config/irix6-config.py
@@ -4,7 +4,7 @@ LCGDIR = os.getcwd()+"/../lib/irix-6.5-mips"
LIBDIR = LCGDIR
BF_PYTHON = LCGDIR+'/python'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
WITH_BF_STATICPYTHON = 'true'
BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}'
diff --git a/build_files/scons/config/linux2-config.py b/build_files/scons/config/linux2-config.py
index b0054ea472e..d4e97c78c38 100644
--- a/build_files/scons/config/linux2-config.py
+++ b/build_files/scons/config/linux2-config.py
@@ -1,15 +1,16 @@
LCGDIR = '../lib/linux2'
LIBDIR = "${LCGDIR}"
+BF_PYTHON_ABI_FLAGS = 'm' # Most common for linux distros
BF_PYTHON = '/usr'
BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
WITH_BF_STATICPYTHON = False
-BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
+BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}'
BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}'
-BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}' #BF_PYTHON+'/lib/python'+BF_PYTHON_VERSION+'/config/libpython'+BF_PYTHON_VERSION+'.a'
+BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}' # BF_PYTHON+'/lib/python'+BF_PYTHON_VERSION+'/config/libpython'+BF_PYTHON_VERSION+'.a'
BF_PYTHON_LINKFLAGS = ['-Xlinker', '-export-dynamic']
-BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}.a'
+BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION}${BF_PYTHON_ABI_FLAGS}.a'
WITH_BF_OPENAL = True
WITH_BF_STATICOPENAL = False
diff --git a/build_files/scons/config/linuxcross-config.py b/build_files/scons/config/linuxcross-config.py
index 8ba82f795a5..62474527825 100644
--- a/build_files/scons/config/linuxcross-config.py
+++ b/build_files/scons/config/linuxcross-config.py
@@ -2,7 +2,7 @@ LCGDIR = '#../lib/windows'
LIBDIR = '${LCGDIR}'
BF_PYTHON = LIBDIR + '/python'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
BF_PYTHON_BINARY = 'python'
BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION[0]}${BF_PYTHON_VERSION[2]}mw'
@@ -184,6 +184,8 @@ CC_WARN = [ '-Wall' ]
LLIBS = [ '-ldxguid', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++', '-luuid', '-lole32'] #'-lutil', '-lc', '-lm', '-ldl', '-lpthread' ]
+PLATFORM_LINKFLAGS = ['--stack,2097152']
+
BF_DEBUG = False
BF_DEBUG_CCFLAGS = ['-g', '-D_DEBUG']
diff --git a/build_files/scons/config/openbsd3-config.py b/build_files/scons/config/openbsd3-config.py
index 4ecc0b158ca..67d850ff48d 100644
--- a/build_files/scons/config/openbsd3-config.py
+++ b/build_files/scons/config/openbsd3-config.py
@@ -2,7 +2,7 @@ LCGDIR = '../lib/openbsd3'
LIBDIR = '${LCGDIR}'
BF_PYTHON = '/usr/local'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}'
BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}'
diff --git a/build_files/scons/config/sunos5-config.py b/build_files/scons/config/sunos5-config.py
index 9f998c168d0..828e286efee 100644
--- a/build_files/scons/config/sunos5-config.py
+++ b/build_files/scons/config/sunos5-config.py
@@ -2,7 +2,7 @@ LCGDIR = '../lib/sunos5'
LIBDIR = '${LCGDIR}'
BF_PYTHON = '/usr/local'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
BF_PYTHON_BINARY = '${BF_PYTHON}/bin/python${BF_PYTHON_VERSION}'
BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}' #BF_PYTHON+'/lib/python'+BF_PYTHON_VERSION+'/config/libpython'+BF_PYTHON_VERSION+'.a'
diff --git a/build_files/scons/config/win32-mingw-config.py b/build_files/scons/config/win32-mingw-config.py
index 98ab63b5e73..6dac29b37f7 100644
--- a/build_files/scons/config/win32-mingw-config.py
+++ b/build_files/scons/config/win32-mingw-config.py
@@ -2,12 +2,12 @@ LCGDIR = '#../lib/windows'
LIBDIR = "${LCGDIR}"
BF_PYTHON = LIBDIR + '/python'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
WITH_BF_STATICPYTHON = False
BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
BF_PYTHON_BINARY = 'python'
BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION[0]}${BF_PYTHON_VERSION[2]}mw'
-BF_PYTHON_DLL = 'python31'
+BF_PYTHON_DLL = 'python32'
BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
BF_PYTHON_LIB_STATIC = '${BF_PYTHON}/lib/libpython${BF_PYTHON_VERSION[0]}${BF_PYTHON_VERSION[2]}.a'
@@ -50,7 +50,7 @@ BF_PTHREADS_INC = '${BF_PTHREADS}/include'
BF_PTHREADS_LIB = 'pthreadGC2'
BF_PTHREADS_LIBPATH = '${BF_PTHREADS}/lib'
-WITH_BF_OPENEXR = True
+WITH_BF_OPENEXR = False # TODO, gives linking problems for the moment.
WITH_BF_STATICOPENEXR = False
BF_OPENEXR = LIBDIR + '/gcc/openexr'
BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/OpenEXR'
@@ -144,7 +144,7 @@ BF_OPENGL_LIB_STATIC = [ '${BF_OPENGL}/lib/libGL.a', '${BF_OPENGL}/lib/libGLU.a'
'${BF_OPENGL}/lib/libXmu.a', '${BF_OPENGL}/lib/libXext.a',
'${BF_OPENGL}/lib/libX11.a', '${BF_OPENGL}/lib/libXi.a' ]
-WITH_BF_COLLADA = True
+WITH_BF_COLLADA = False # TODO, gives linking problems at the moment.
BF_COLLADA = '#source/blender/collada'
BF_COLLADA_INC = '${BF_COLLADA}'
BF_COLLADA_LIB = 'bf_collada'
@@ -165,7 +165,7 @@ CXX = 'g++'
CCFLAGS = [ '-pipe', '-funsigned-char', '-fno-strict-aliasing' ]
CPPFLAGS = ['-DWIN32', '-DFREE_WINDOWS', '-D_LARGEFILE_SOURCE', '-D_FILE_OFFSET_BITS=64', '-D_LARGEFILE64_SOURCE']
-CXXFLAGS = ['-pipe', '-mwindows', '-funsigned-char', '-fno-strict-aliasing' ]
+CXXFLAGS = ['-pipe', '-funsigned-char', '-fno-strict-aliasing' ]
REL_CFLAGS = ['-DNDEBUG', '-O2']
REL_CCFLAGS = ['-DNDEBUG', '-O2']
@@ -175,6 +175,8 @@ CC_WARN = [ '-Wall' ]
LLIBS = ['-lshell32', '-lshfolder', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++','-lole32','-luuid']
+PLATFORM_LINKFLAGS = ['--stack,2097152']
+
BF_DEBUG = False
BF_DEBUG_CCFLAGS= ['-g', '-D_DEBUG']
diff --git a/build_files/scons/config/win32-vc-config.py b/build_files/scons/config/win32-vc-config.py
index 219e7e0bce3..eeb50a9ca65 100644
--- a/build_files/scons/config/win32-vc-config.py
+++ b/build_files/scons/config/win32-vc-config.py
@@ -9,10 +9,10 @@ BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib'
BF_FFMPEG_LIB = 'avformat-52.lib avcodec-52.lib avdevice-52.lib avutil-50.lib swscale-0.lib'
BF_PYTHON = LIBDIR + '/python'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
BF_PYTHON_BINARY = 'python'
-BF_PYTHON_LIB = 'python31'
+BF_PYTHON_LIB = 'python32'
BF_PYTHON_DLL = '${BF_PYTHON_LIB}'
BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
@@ -187,7 +187,7 @@ CXX_WARN = []
LLIBS = ['ws2_32', 'vfw32', 'winmm', 'kernel32', 'user32', 'gdi32', 'comdlg32', 'advapi32', 'shfolder', 'shell32', 'ole32', 'oleaut32', 'uuid']
-PLATFORM_LINKFLAGS = ['/SUBSYSTEM:CONSOLE','/MACHINE:IX86','/INCREMENTAL:NO','/NODEFAULTLIB:"msvcprt.lib"','/NODEFAULTLIB:"msvcprtd.lib"','/NODEFAULTLIB:"glut32.lib"','/NODEFAULTLIB:"libc.lib"','/NODEFAULTLIB:"libcd.lib"','/NODEFAULTLIB:"libcpd.lib"','/NODEFAULTLIB:"libcp.lib"','/NODEFAULTLIB:"msvcrt.lib"', '/NODEFAULTLIB:"msvcrtd.lib"', '/NODEFAULTLIB:"msvcmrt.lib"', '/NODEFAULTLIB:"msvcurt.lib"', '/LARGEADDRESSAWARE']
+PLATFORM_LINKFLAGS = ['/SUBSYSTEM:CONSOLE','/MACHINE:IX86','/STACK:2097152','/INCREMENTAL:NO', '/LARGEADDRESSAWARE']
# # Todo
# BF_PROFILE_CCFLAGS = ['-pg', '-g ']
diff --git a/build_files/scons/config/win64-vc-config.py b/build_files/scons/config/win64-vc-config.py
index 950f9257b99..2dcbe8aeb2e 100644
--- a/build_files/scons/config/win64-vc-config.py
+++ b/build_files/scons/config/win64-vc-config.py
@@ -9,10 +9,10 @@ BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib'
BF_FFMPEG_LIB = 'avformat-52.lib avcodec-52.lib avdevice-52.lib avutil-50.lib swscale-0.lib'
BF_PYTHON = LIBDIR + '/python'
-BF_PYTHON_VERSION = '3.1'
+BF_PYTHON_VERSION = '3.2'
BF_PYTHON_INC = '${BF_PYTHON}/include/python${BF_PYTHON_VERSION}'
BF_PYTHON_BINARY = 'python'
-BF_PYTHON_LIB = 'python31'
+BF_PYTHON_LIB = 'python32'
BF_PYTHON_DLL = '${BF_PYTHON_LIB}'
BF_PYTHON_LIBPATH = '${BF_PYTHON}/lib'
@@ -194,7 +194,7 @@ if BF_DEBUG:
else:
BF_NUMJOBS=6
-PLATFORM_LINKFLAGS = ['/SUBSYSTEM:CONSOLE','/MACHINE:X64','/INCREMENTAL:NO','/NODEFAULTLIB:"msvcprt.lib"','/NODEFAULTLIB:"msvcprtd.lib"','/NODEFAULTLIB:"glut32.lib"','/NODEFAULTLIB:"libc.lib"','/NODEFAULTLIB:"libcd.lib"','/NODEFAULTLIB:"libcpd.lib"','/NODEFAULTLIB:"libcp.lib"','/NODEFAULTLIB:"msvcrt.lib"', '/NODEFAULTLIB:"msvcrtd.lib"', '/NODEFAULTLIB:"msvcmrt.lib"', '/NODEFAULTLIB:"msvcurt.lib"']
+PLATFORM_LINKFLAGS = ['/SUBSYSTEM:CONSOLE','/MACHINE:X64','/STACK:2097152','/OPT:NOREF','/INCREMENTAL:NO']
BF_BUILDDIR = '..\\build\\blender25-win64-vc'
BF_INSTALLDIR='..\\install\\blender25-win64-vc'
diff --git a/build_files/scons/tools/Blender.py b/build_files/scons/tools/Blender.py
index cab245a4518..ad4df1a60c1 100644
--- a/build_files/scons/tools/Blender.py
+++ b/build_files/scons/tools/Blender.py
@@ -20,7 +20,7 @@ import string
import glob
import time
import sys
-import zipfile
+import tarfile
import shutil
import cStringIO
import platform
@@ -399,89 +399,13 @@ def set_quiet_output(env):
if env['BF_LINE_OVERWRITE']:
SCons.Action._ActionAction.print_cmd_line = my_print_cmd_line
-
-class CompZipFile(zipfile.ZipFile):
- """Partial copy of python2.6's zipfile.ZipFile (see http://www.python.org)
- to get a extractall() that works on py2.5 and probably earlier distributions."""
- def __init__(self, file, mode="r", compression=zipfile.ZIP_STORED, allowZip64=False):
- if sys.version_info < (2, 6):
- zipfile.ZipFile.__init__(self, file, mode, compression)
- else:
- zipfile.ZipFile.__init__(self, file, mode, compression, allowZip64)
-
- if not hasattr(self,"extractall"): # use our method
- print "Debug: Using comp_extractall!"
- self.extractall= self.comp_extractall
-
- def comp_extractall(self, path=None, members=None, pwd=None): #renamed method
- """Extract all members from the archive to the current working
- directory. `path' specifies a different directory to extract to.
- `members' is optional and must be a subset of the list returned
- by namelist().
- """
- if members is None:
- members = self.namelist()
-
- for zipinfo in members:
- self.comp_extract(zipinfo, path, pwd) # use our method
-
- def comp_extract(self, member, path=None, pwd=None): #renamed method
- """Extract a member from the archive to the current working directory,
- using its full name. Its file information is extracted as accurately
- as possible. `member' may be a filename or a ZipInfo object. You can
- specify a different directory using `path'.
- """
- if not isinstance(member, zipfile.ZipInfo):
- member = self.getinfo(member)
-
- if path is None:
- path = os.getcwd()
-
- return self.comp_extract_member(member, path, pwd) # use our method
-
- def comp_extract_member(self, member, targetpath, pwd): #renamed method
- """Extract the ZipInfo object 'member' to a physical
- file on the path targetpath.
- """
- # build the destination pathname, replacing
- # forward slashes to platform specific separators.
- if targetpath[-1:] in (os.path.sep, os.path.altsep):
- targetpath = targetpath[:-1]
-
- # don't include leading "/" from file name if present
- if member.filename[0] == '/':
- targetpath = os.path.join(targetpath, member.filename[1:])
- else:
- targetpath = os.path.join(targetpath, member.filename)
-
- targetpath = os.path.normpath(targetpath)
-
- # Create all upper directories if necessary.
- upperdirs = os.path.dirname(targetpath)
- if upperdirs and not os.path.exists(upperdirs):
- os.makedirs(upperdirs)
-
- if member.filename[-1] == '/':
- os.mkdir(targetpath)
- return targetpath
-
- #use StrinIO instead so we don't have to reproduce more functionality.
- source = cStringIO.StringIO(self.read(member.filename))
- target = file(targetpath, "wb")
- shutil.copyfileobj(source, target)
- source.close()
- target.close()
-
- return targetpath
-
-def unzip_pybundle(from_zip,to_dir,exclude_re):
-
- zip= CompZipFile(from_zip, mode='r')
+def untar_pybundle(from_tar,to_dir,exclude_re):
+ tar= tarfile.open(from_tar, mode='r')
exclude_re= list(exclude_re) #single re object or list of re objects
debug= 0 #list files instead of unpacking
good= []
if debug: print '\nFiles not being unpacked:\n'
- for name in zip.namelist():
+ for name in tar.getnames():
is_bad= 0
for r in exclude_re:
if r.match(name):
@@ -489,26 +413,26 @@ def unzip_pybundle(from_zip,to_dir,exclude_re):
if debug: print name
break
if not is_bad:
- good.append(name)
+ good.append(tar.getmember(name))
if debug:
print '\nFiles being unpacked:\n'
for g in good:
print g
else:
- zip.extractall(to_dir, good)
+ tar.extractall(to_dir, good)
def my_winpybundle_print(target, source, env):
pass
def WinPyBundle(target=None, source=None, env=None):
import re
- py_zip= env.subst( env['LCGDIR'] )
- if py_zip[0]=='#':
- py_zip= py_zip[1:]
+ py_tar= env.subst( env['LCGDIR'] )
+ if py_tar[0]=='#':
+ py_tar= py_tar[1:]
if env['BF_DEBUG']:
- py_zip+= '/release/python' + env['BF_PYTHON_VERSION'].replace('.','') + '_d.zip'
+ py_tar+= '/release/python' + env['BF_PYTHON_VERSION'].replace('.','') + '_d.tar.gz'
else:
- py_zip+= '/release/python' + env['BF_PYTHON_VERSION'].replace('.','') + '.zip'
+ py_tar+= '/release/python' + env['BF_PYTHON_VERSION'].replace('.','') + '.tar.gz'
py_target = env.subst( env['BF_INSTALLDIR'] )
if py_target[0]=='#':
@@ -525,8 +449,8 @@ def WinPyBundle(target=None, source=None, env=None):
re.compile('^idlelib/.*'),
re.compile('^lib2to3/.*'),
re.compile('^tkinter/.*')]
- print "Unpacking '" + py_zip + "' to '" + py_target + "'"
- unzip_pybundle(py_zip,py_target,exclude_re)
+ print "Unpacking '" + py_tar + "' to '" + py_target + "'"
+ untar_pybundle(py_tar,py_target,exclude_re)
def my_appit_print(target, source, env):
a = '%s' % (target[0])
@@ -546,6 +470,7 @@ def AppIt(target=None, source=None, env=None):
installdir = env['BF_INSTALLDIR']
print("compiled architecture: %s"%(osxarch))
print("Installing to %s"%(installdir))
+ # TODO, use tar.
python_zip = 'python_' + osxarch + '.zip' # set specific python_arch.zip
print("unzipping to app-bundle: %s"%(python_zip))
bldroot = env.Dir('.').abspath
@@ -563,7 +488,8 @@ def AppIt(target=None, source=None, env=None):
if os.path.isdir(cmd):
shutil.rmtree(cmd)
shutil.copytree(sourcedir, cmd)
- cmd = "cat %s | sed s/VERSION/`cat release/VERSION`/ | sed s/DATE/`date +'%%Y-%%b-%%d'`/ > %s"%(sourceinfo,targetinfo)
+ cmd = "cat %s | sed s/\$\{MACOSX_BUNDLE_SHORT_VERSION_STRING\}/%s/ | "%(sourceinfo,VERSION)
+ cmd += "sed s/\$\{MACOSX_BUNDLE_LONG_VERSION_STRING\}/%s,\ %s/g > %s"%(VERSION,time.strftime("%Y-%b-%d"),targetinfo)
commands.getoutput(cmd)
cmd = 'cp %s/%s %s/%s.app/Contents/MacOS/%s'%(builddir, binary,installdir, binary, binary)
commands.getoutput(cmd)
@@ -624,31 +550,36 @@ def UnixPyBundle(target=None, source=None, env=None):
print '\t"%s"' % py_target
print '\t(skipping copy)\n'
return
-
-
+
# Copied from source/creator/CMakeLists.txt, keep in sync.
print 'Install python from:'
- print '\t"%s" into...' % py_src
- print '\t"%s"\n' % py_target
+ print '\t"%s" into...' % py_src
+ print '\t"%s"\n' % py_target
+
+ run("rm -rf '%s'" % py_target)
+ try:
+ os.makedirs(os.path.dirname(py_target)) # the final part is copied
+ except:
+ pass
+
+ run("cp -R '%s' '%s'" % (py_src, os.path.dirname(py_target)))
+ run("rm -rf '%s/distutils'" % py_target)
+ run("rm -rf '%s/lib2to3'" % py_target)
+ run("rm -rf '%s/idlelib'" % py_target)
+ run("rm -rf '%s/tkinter'" % py_target)
+ run("rm -rf '%s/config'" % py_target)
+
+ run("rm -rf '%s/site-packages'" % py_target)
+ run("mkdir '%s/site-packages'" % py_target) # python needs it.'
+
+ run("rm -f '%s/lib-dynload/_tkinter.so'" % py_target)
+ run("find '%s' -type d -name 'test' -prune -exec rm -rf {} ';'" % py_target)
+ run("find '%s' -type d -name 'config-*' -prune -exec rm -rf {} ';'" % py_target)
+ run("find '%s' -type d -name 'turtledemo' -prune -exec rm -rf {} ';'" % py_target)
+ run("find '%s' -type d -name '__pycache__' -exec rm -rf {} ';'" % py_target)
+ run("find '%s' -name '*.py[co]' -exec rm -rf {} ';'" % py_target)
+ run("find '%s' -name '*.so' -exec strip -s {} ';'" % py_target)
- run('rm -rf "%s"' % py_target)
- try: os.makedirs(os.path.dirname(py_target)) # the final part is copied
- except:pass
-
- run('cp -R "%s" "%s"' % (py_src, os.path.dirname(py_target)))
- run('rm -rf "%s/distutils"' % py_target)
- run('rm -rf "%s/lib2to3"' % py_target)
- run('rm -rf "%s/idlelib"' % py_target)
- run('rm -rf "%s/tkinter"' % py_target)
- run('rm -rf "%s/config"' % py_target)
-
- run('rm -rf "%s/site-packages"' % py_target)
- run('mkdir "%s/site-packages"' % py_target) # python needs it.'
-
- run('rm -f "%s/lib-dynload/_tkinter.so"' % py_target)
- run('find "%s" -name "test" -prune -exec rm -rf {} \;' % py_target)
- run('find "%s" -name "*.py?" -exec rm -rf {} \;' % py_target)
- run('find "%s" -name "*.so"-exec strip -s {} \;' % py_target)
#### END ACTION STUFF #########
@@ -675,6 +606,8 @@ def bsc(env, target, source):
class BlenderEnvironment(SConsEnvironment):
+ PyBundleActionAdded = False
+
def BlenderRes(self=None, libname=None, source=None, libtype=['core'], priority=[100]):
global libs
if not self or not libname or not source:
@@ -818,12 +751,14 @@ class BlenderEnvironment(SConsEnvironment):
lenv.AddPostAction(prog,Action(AppIt,strfunction=my_appit_print))
elif os.sep == '/' and lenv['OURPLATFORM'] != 'linuxcross': # any unix (except cross-compilation)
if lenv['WITH_BF_PYTHON']:
- if not lenv['WITHOUT_BF_INSTALL'] and not lenv['WITHOUT_BF_PYTHON_INSTALL']:
+ if not lenv['WITHOUT_BF_INSTALL'] and not lenv['WITHOUT_BF_PYTHON_INSTALL'] and not BlenderEnvironment.PyBundleActionAdded:
lenv.AddPostAction(prog,Action(UnixPyBundle,strfunction=my_unixpybundle_print))
+ BlenderEnvironment.PyBundleActionAdded = True
elif lenv['OURPLATFORM'].startswith('win') or lenv['OURPLATFORM'] == 'linuxcross': # windows or cross-compilation
if lenv['WITH_BF_PYTHON']:
- if not lenv['WITHOUT_BF_PYTHON_INSTALL']:
+ if not lenv['WITHOUT_BF_PYTHON_INSTALL'] and not BlenderEnvironment.PyBundleActionAdded:
lenv.AddPostAction(prog,Action(WinPyBundle,strfunction=my_winpybundle_print))
+ BlenderEnvironment.PyBundleActionAdded = True
return prog
def Glob(lenv, pattern):
diff --git a/build_files/scons/tools/btools.py b/build_files/scons/tools/btools.py
index b1b2494d522..a646b9084c2 100644
--- a/build_files/scons/tools/btools.py
+++ b/build_files/scons/tools/btools.py
@@ -56,10 +56,16 @@ def get_version():
raise Exception("%s: missing version string" % fname)
+def get_revision():
+ build_rev = os.popen('svnversion').read()[:-1] # remove \n
+ if build_rev == '' or build_rev==None:
+ build_rev = 'UNKNOWN'
+
+ return 'r' + build_rev
# This is used in creating the local config directories
VERSION, VERSION_DISPLAY = get_version()
-
+REVISION = get_revision()
def print_arguments(args, bc):
if len(args):
@@ -72,7 +78,7 @@ def print_arguments(args, bc):
def validate_arguments(args, bc):
opts_list = [
- 'WITH_BF_PYTHON', 'BF_PYTHON', 'BF_PYTHON_VERSION', 'BF_PYTHON_INC', 'BF_PYTHON_BINARY', 'BF_PYTHON_LIB', 'BF_PYTHON_LIBPATH', 'WITH_BF_STATICPYTHON', 'BF_PYTHON_LIB_STATIC', 'BF_PYTHON_DLL',
+ 'WITH_BF_PYTHON', 'WITH_BF_PYTHON_SAFETY', 'BF_PYTHON', 'BF_PYTHON_VERSION', 'BF_PYTHON_INC', 'BF_PYTHON_BINARY', 'BF_PYTHON_LIB', 'BF_PYTHON_LIBPATH', 'WITH_BF_STATICPYTHON', 'BF_PYTHON_LIB_STATIC', 'BF_PYTHON_DLL', 'BF_PYTHON_ABI_FLAGS',
'WITH_BF_OPENAL', 'BF_OPENAL', 'BF_OPENAL_INC', 'BF_OPENAL_LIB', 'BF_OPENAL_LIBPATH', 'WITH_BF_STATICOPENAL', 'BF_OPENAL_LIB_STATIC',
'WITH_BF_SDL', 'BF_SDL', 'BF_SDL_INC', 'BF_SDL_LIB', 'BF_SDL_LIBPATH',
'BF_LIBSAMPLERATE', 'BF_LIBSAMPLERATE_INC', 'BF_LIBSAMPLERATE_LIB', 'BF_LIBSAMPLERATE_LIBPATH', 'WITH_BF_STATICLIBSAMPLERATE', 'BF_LIBSAMPLERATE_LIB_STATIC',
@@ -175,7 +181,7 @@ def print_targets(targs, bc):
def validate_targets(targs, bc):
valid_list = ['.', 'blender', 'blenderstatic', 'blenderplayer', 'webplugin',
'blendernogame', 'blenderstaticnogame', 'blenderlite', 'release',
- 'everything', 'clean', 'install-bin', 'install', 'nsis']
+ 'everything', 'clean', 'install-bin', 'install', 'nsis','buildslave']
oklist = []
for t in targs:
if t in valid_list:
@@ -211,6 +217,7 @@ def read_opts(env, cfg, args):
localopts.AddVariables(
('LCGDIR', 'location of cvs lib dir'),
(BoolVariable('WITH_BF_PYTHON', 'Compile with python', True)),
+ (BoolVariable('WITH_BF_PYTHON_SAFETY', 'Internal API error checking to track invalid data to prevent crash on access (at the expense of some effeciency)', False)),
('BF_PYTHON', 'base path for python', ''),
('BF_PYTHON_VERSION', 'Python version to use', ''),
('BF_PYTHON_INC', 'include path for Python headers', ''),
@@ -221,6 +228,7 @@ def read_opts(env, cfg, args):
('BF_PYTHON_LIBPATH', 'Library path', ''),
('BF_PYTHON_LINKFLAGS', 'Python link flags', ''),
(BoolVariable('WITH_BF_STATICPYTHON', 'Staticly link to python', False)),
+ ('BF_PYTHON_ABI_FLAGS', 'Python ABI flags (suffix in library version: m, mu, etc)', ''),
(BoolVariable('BF_NO_ELBEEM', 'Disable Fluid Sim', False)),
('BF_PROFILE_FLAGS', 'Profiling compiler flags', ''),
@@ -494,6 +502,79 @@ def read_opts(env, cfg, args):
return localopts
+def buildbot_zip(src, dest, package_name, extension):
+ import zipfile
+ ln = len(src)+1 # one extra to remove leading os.sep when cleaning root for package_root
+ flist = list()
+
+ # create list of tuples containing file and archive name
+ for root, dirs, files in os.walk(src):
+ package_root = os.path.join(package_name, root[ln:])
+ flist.extend([(os.path.join(root, file), os.path.join(package_root, file)) for file in files])
+
+ if extension == '.zip':
+ package = zipfile.ZipFile(dest, 'w', zipfile.ZIP_DEFLATED)
+ package.comment = package_name + ' is a zip-file containing the Blender software. Visit http://www.blender.org for more information.'
+ for entry in flist:
+ package.write(entry[0], entry[1])
+ package.close()
+ else:
+ import tarfile
+ package = tarfile.open(dest, 'w:bz2')
+ for entry in flist:
+ package.add(entry[0], entry[1], recursive=False)
+ package.close()
+ bb_zip_name = os.path.normpath(src + os.sep + '..' + os.sep + 'buildbot_upload.zip')
+ print("creating %s" % (bb_zip_name))
+ bb_zip = zipfile.ZipFile(bb_zip_name, 'w', zipfile.ZIP_DEFLATED)
+ print("writing %s to %s" % (dest, bb_zip_name))
+ bb_zip.write(dest, os.path.split(dest)[1])
+ bb_zip.close()
+ print("removing unneeded packed file %s (to keep install directory clean)" % (dest))
+ os.remove(dest)
+ print("done.")
+
+def buildslave_print(target, source, env):
+ return "Running buildslave target"
+
+def buildslave(target=None, source=None, env=None):
+ """
+ Builder for buildbot integration. Used by buildslaves of http://builder.blender.org only.
+ """
+
+ if env['OURPLATFORM'] in ('win32-vc', 'win64-vc', 'win32-mingw'):
+ extension = '.zip'
+ else:
+ extension = '.tar.bz2'
+
+ platform = env['OURPLATFORM'].split('-')[0]
+ if platform == 'linux2':
+ import platform
+
+ bitness = platform.architecture()[0]
+ if bitness == '64bit':
+ platform = 'linux-glibc27-x86_64'
+ elif bitness == '32bit':
+ platform = 'linux-glibc27-i686'
+
+ outdir = os.path.abspath(env['BF_INSTALLDIR'])
+ package_name = 'blender-' + VERSION+'-'+REVISION + '-' + platform
+ package_dir = os.path.normpath(outdir + os.sep + '..' + os.sep + package_name)
+ package_archive = os.path.normpath(outdir + os.sep + '..' + os.sep + package_name + extension)
+
+ try:
+ if os.path.exists(package_archive):
+ os.remove(package_archive)
+ if os.path.exists(package_dir):
+ shutil.rmtree(package_dir)
+ except Exception, ex:
+ sys.stderr.write('Failed to clean up old package files: ' + str(ex) + '\n')
+ return 1
+
+ buildbot_zip(outdir, package_archive, package_name, extension)
+
+ return 0
+
def NSIS_print(target, source, env):
return "Creating NSIS installer for Blender"
@@ -542,7 +623,7 @@ def NSIS_Installer(target=None, source=None, env=None):
#### change to suit install dir ####
inst_dir = install_base_dir + env['BF_INSTALLDIR']
- os.chdir("windows/installer")
+ os.chdir(rel_dir)
ns = open("00.sconsblender.nsi","r")
diff --git a/doc/Doxyfile b/doc/doxygen/Doxyfile
index a29abac1373..89dcf834227 100644
--- a/doc/Doxyfile
+++ b/doc/doxygen/Doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME = Blender
# This could be handy for archiving the generated documentation or
# if some version control system is used.
-PROJECT_NUMBER = "V2.56a BETA"
+PROJECT_NUMBER = "V2.57"
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer
@@ -44,7 +44,7 @@ PROJECT_BRIEF =
# exceed 55 pixels and the maximum width should not exceed 200 pixels.
# Doxygen will copy the logo to the output directory.
-PROJECT_LOGO = ../release/freedesktop/icons/48x48/blender.png
+PROJECT_LOGO = ../../release/freedesktop/icons/48x48/blender.png
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
# base path where the generated documentation will be put.
@@ -616,9 +616,9 @@ INPUT = doxygen.main \
doxygen.source \
doxygen.intern \
doxygen.extern \
- ../source \
- ../intern \
- ../extern/bullet2
+ ../../source \
+ ../../intern \
+ ../../extern/bullet2
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -648,7 +648,7 @@ RECURSIVE = YES
# excluded from the INPUT source files. This way you can easily exclude a
# subdirectory from a directory tree whose root is specified with the INPUT tag.
-EXCLUDE = ../source/gameengine/PyDoc
+EXCLUDE = ../../source/gameengine/PyDoc
# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
diff --git a/doc/doxygen.extern b/doc/doxygen/doxygen.extern
index 6c6872ff53f..6c6872ff53f 100644
--- a/doc/doxygen.extern
+++ b/doc/doxygen/doxygen.extern
diff --git a/doc/doxygen.intern b/doc/doxygen/doxygen.intern
index ae8f6ca88e4..ae8f6ca88e4 100644
--- a/doc/doxygen.intern
+++ b/doc/doxygen/doxygen.intern
diff --git a/doc/doxygen.main b/doc/doxygen/doxygen.main
index 188382d6a9c..188382d6a9c 100644
--- a/doc/doxygen.main
+++ b/doc/doxygen/doxygen.main
diff --git a/doc/doxygen.source b/doc/doxygen/doxygen.source
index c9a73e70539..9cd86e23e59 100644
--- a/doc/doxygen.source
+++ b/doc/doxygen/doxygen.source
@@ -1,6 +1,10 @@
/** \defgroup blenderplayer Blender Player */
+/** \defgroup blc bad level calls
+ * \ingroup blenderplayer
+ */
+
/** \defgroup render Rendering
* \ingroup blender
*/
@@ -14,6 +18,19 @@
* \ingroup blender scripts
*/
+/** \defgroup pygen Python Generic
+ * \ingroup python
+ */
+
+/** \defgroup pythonintern Python RNA and Operators
+ * \ingroup python
+ */
+
+/** \defgroup blpluginapi Blender pluginapi
+ * \ingroup blender
+ * \attention not in use currently
+ */
+
/* ================================ */
/** \defgroup bge Game Engine */
@@ -74,6 +91,10 @@
/** \defgroup blender blender */
+/** \defgroup blf blenfont
+ * \ingroup blender
+ */
+
/** \defgroup bke blenkernel
* \ingroup blender
*/
@@ -86,6 +107,17 @@
* \ingroup blender
*/
+/** \defgroup cmpnodes cmpnodes
+ * \ingroup nodes
+ */
+
+/** \defgroup shdnodes shdnodes
+ * \ingroup nodes
+ */
+
+/** \defgroup texnodes texnodes
+ * \ingroup nodes
+ */
/** \defgroup modifiers modifiers
* \ingroup blender
*/
@@ -107,11 +139,13 @@
* \ingroup blender data
*/
-/** \defgroup readwrite .blend read and write functions
+/** \defgroup blenloader .blend read and write functions
* \ingroup blender data
+ * \todo check if \ref blo and \ref blenloader groups can be
+ * merged in docs.
*/
-/** \defgroup readblenfile readblenfile
+/** \defgroup blo readblenfile
* \ingroup blender data
*/
@@ -294,6 +328,18 @@
* \ingroup blender
*/
+/** \defgroup imbcineon Cineon
+ * \ingroup imbuf
+ */
+
+/** \defgorup imbdds DDS
+ * \ingroup imbuf
+ */
+
+/** \defgroup openexr OpenEXR
+ * \ingroup imbuf
+ */
+
/* ================================ */
/** \defgroup kernel kernel */
diff --git a/doc/footer.html b/doc/doxygen/footer.html
index a74f5055b15..a74f5055b15 100644
--- a/doc/footer.html
+++ b/doc/doxygen/footer.html
diff --git a/doc/manpage/blender.1 b/doc/manpage/blender.1
index 2c301d982e1..c27cc98f08b 100644
--- a/doc/manpage/blender.1
+++ b/doc/manpage/blender.1
@@ -1,4 +1,4 @@
-.TH "BLENDER" "1" "January 27, 2011" "Blender Blender 2\&.56 (sub 0) "
+.TH "BLENDER" "1" "April 05, 2011" "Blender Blender 2\&.56 (sub 6)"
.SH NAME
blender \- a 3D modelling and rendering package
@@ -15,7 +15,7 @@ Use Blender to create TV commercials, to make technical visualizations, business
http://www.blender.org
.SH OPTIONS
-Blender 2.56 (sub 0) Build
+Blender 2.56 (sub 6)
Usage: blender [args ...] [file] [args ...]
.br
.SS "Render Options:"
@@ -347,7 +347,13 @@ Playback <file(s)>, only operates this way when not running in background.
.TP
.B \-R
.br
-Register .blend extension (windows only)
+Register .blend extension, then exit (Windows only)
+.br
+
+.TP
+.B \-r
+.br
+Silently register .blend extension, then exit (Windows only)
.br
.SS "Argument Parsing:"
@@ -377,7 +383,6 @@ Arguments are executed in the order they are given. eg
\fIBLENDER_SYSTEM_DATAFILES\fR Directory for system wide data files.
\fIBLENDER_SYSTEM_PYTHON\fR Directory for system python libraries.
\fITMP\fR or \fITMPDIR\fR Store temporary files here.
- \fISDL_AUDIODRIVER\fR LibSDL audio driver \- alsa, esd, dma.
\fIPYTHONHOME\fR Path to the python directory, eg. /usr/lib/python.
.br
.br
diff --git a/doc/python_api/examples/bpy.data.py b/doc/python_api/examples/bpy.data.py
index 555b421ddac..7d6bf94532b 100644
--- a/doc/python_api/examples/bpy.data.py
+++ b/doc/python_api/examples/bpy.data.py
@@ -14,7 +14,7 @@ print(bpy.data.scenes.keys())
if "Cube" in bpy.data.meshes:
mesh = bpy.data.meshes["Cube"]
print("removing mesh", mesh)
- bpy.data.meshes.unlink(mesh)
+ bpy.data.meshes.remove(mesh)
# write images into a file next to the blend
@@ -22,6 +22,6 @@ import os
file = open(os.path.splitext(bpy.data.filepath)[0] + ".txt", 'w')
for image in bpy.data.images:
- file.write("%s %dx%d\n" % (image.filepath, image.size[0], image.size[1]))
+ file.write("%s %d x %d\n" % (image.filepath, image.size[0], image.size[1]))
file.close()
diff --git a/doc/python_api/examples/bpy.props.2.py b/doc/python_api/examples/bpy.props.2.py
index e27e6227ba3..22fef5dc13a 100644
--- a/doc/python_api/examples/bpy.props.2.py
+++ b/doc/python_api/examples/bpy.props.2.py
@@ -22,6 +22,6 @@ bpy.types.Material.my_settings = \
# test the new settings work
material = bpy.data.materials[0]
-material.my_settings.val_int = 5
-material.my_settings.val_float = 3.0
+material.my_settings.my_int = 5
+material.my_settings.my_float = 3.0
material.my_settings.my_string = "Foo"
diff --git a/doc/python_api/examples/bpy.types.BlendDataLibraries.load.py b/doc/python_api/examples/bpy.types.BlendDataLibraries.load.py
new file mode 100644
index 00000000000..43e6ac90ae7
--- /dev/null
+++ b/doc/python_api/examples/bpy.types.BlendDataLibraries.load.py
@@ -0,0 +1,23 @@
+import bpy
+
+filepath = "//link_library.blend"
+
+# load a single scene we know the name of.
+with bpy.data.libraries.load(filepath) as (data_from, data_to):
+ data_to.scenes = ["Scene"]
+
+
+# load all meshes
+with bpy.data.libraries.load(filepath) as (data_from, data_to):
+ data_to.meshes = data_from.meshes
+
+
+# link all objects starting with 'A'
+with bpy.data.libraries.load(filepath, link=True) as (data_from, data_to):
+ data_to.objects = [name for name in data_from.objects if name.startswith("A")]
+
+
+# append everything
+with bpy.data.libraries.load(filepath) as (data_from, data_to):
+ for attr in dir(data_to):
+ setattr(data_to, attr, getattr(data_from, attr))
diff --git a/doc/python_api/examples/bpy.types.Menu.py b/doc/python_api/examples/bpy.types.Menu.py
index 3fbc0f6a8f0..e8c4a2aa072 100644
--- a/doc/python_api/examples/bpy.types.Menu.py
+++ b/doc/python_api/examples/bpy.types.Menu.py
@@ -10,6 +10,12 @@ convention for menus.
.. note::
Menu subclasses must be registered before referencing them from blender.
+
+.. note::
+ Menu's have their :class:`Layout.operator_context` initialized as
+ 'EXEC_REGION_WIN' rather then 'INVOKE_DEFAULT', so if the operator context
+ needs to initialize inputs from the :class:`Operator.invoke` function
+ then this needs to be explicitly set.
"""
import bpy
diff --git a/doc/python_api/examples/bpy.types.Operator.2.py b/doc/python_api/examples/bpy.types.Operator.2.py
index 54bd481b339..39ff5caae8a 100644
--- a/doc/python_api/examples/bpy.types.Operator.2.py
+++ b/doc/python_api/examples/bpy.types.Operator.2.py
@@ -39,6 +39,7 @@ class ExportSomeData(bpy.types.Operator):
# Only needed if you want to add into a dynamic menu
def menu_func(self, context):
+ self.layout.operator_context = 'INVOKE_DEFAULT'
self.layout.operator(ExportSomeData.bl_idname, text="Text Export Operator")
# Register and add to the file selector
diff --git a/doc/python_api/examples/bpy.types.bpy_struct.keyframe_insert.1.py b/doc/python_api/examples/bpy.types.bpy_struct.keyframe_insert.1.py
new file mode 100644
index 00000000000..faf3b121ec6
--- /dev/null
+++ b/doc/python_api/examples/bpy.types.bpy_struct.keyframe_insert.1.py
@@ -0,0 +1,28 @@
+"""
+Note that when keying data paths which contain nested properties this must be
+done from the :class:`ID` subclass, in this case the :class:`Armature` rather
+then the bone.
+"""
+
+import bpy
+from bpy.props import PointerProperty
+
+
+# define a nested property
+class MyPropGroup(bpy.types.PropertyGroup):
+ nested = bpy.props.FloatProperty(name="Nested", default=0.0)
+
+# register it so its available for all bones
+bpy.utils.register_class(MyPropGroup)
+bpy.types.Bone.my_prop = PointerProperty(type=MyPropGroup,
+ name="MyProp")
+
+# get a bone
+obj = bpy.data.objects["Armature"]
+arm = obj.data
+
+# set the keyframe at frame 1
+arm.bones["Bone"].my_prop_group.nested = 10
+arm.keyframe_insert(data_path='bones["Bone"].my_prop.nested',
+ frame=1,
+ group="Nested Group")
diff --git a/doc/python_api/examples/bpy.types.bpy_struct.keyframe_insert.py b/doc/python_api/examples/bpy.types.bpy_struct.keyframe_insert.py
new file mode 100644
index 00000000000..f1f4b98b32f
--- /dev/null
+++ b/doc/python_api/examples/bpy.types.bpy_struct.keyframe_insert.py
@@ -0,0 +1,11 @@
+"""
+This is the most simple example of inserting a keyframe from python.
+"""
+
+import bpy
+
+obj = bpy.context.object
+
+# set the keyframe at frame 1
+obj.location = 3.0, 4.0, 10.0
+obj.keyframe_insert(data_path="location", frame=1)
diff --git a/doc/python_api/examples/mathutils.py b/doc/python_api/examples/mathutils.py
index dcc10c5885c..b65e61a1044 100644
--- a/doc/python_api/examples/mathutils.py
+++ b/doc/python_api/examples/mathutils.py
@@ -13,6 +13,6 @@ mat3 = mat.to_3x3()
quat1 = mat.to_quaternion()
quat2 = mat3.to_quaternion()
-angle = quat1.difference(quat2)
+quat_diff = quat1.rotation_difference(quat2)
-print(angle)
+print(quat_diff.angle)
diff --git a/doc/python_api/rst/bge.logic.rst b/doc/python_api/rst/bge.logic.rst
index d3261f5747b..20a3a68b387 100644
--- a/doc/python_api/rst/bge.logic.rst
+++ b/doc/python_api/rst/bge.logic.rst
@@ -173,7 +173,7 @@ General functions
Restarts the current game by reloading the .blend file (the last saved version, not what is currently running).
-.. function:: LibLoad(blend, type, data)
+.. function:: LibLoad(blend, type, data, load_actions=False, verbose=False)
Converts the all of the datablocks of the given type from the given blend.
@@ -183,6 +183,10 @@ General functions
:type type: string
:arg data: Binary data from a blend file (optional)
:type data: bytes
+ :arg load_actions: Search for and load all actions in a given Scene and not just the "active" actions (Scene type only)
+ :type load_actions: bool
+ :arg verbose: Whether or not to print debugging information (e.g., "SceneName: Scene")
+ :type verbose: bool
.. function:: LibNew(name, type, data)
@@ -201,6 +205,12 @@ General functions
:arg name: The name of the library to free (the name used in LibNew)
:type name: string
+
+.. function:: LibList()
+
+ Returns a list of currently loaded libraries.
+
+ :rtype: list [str]
.. function:: addScene(name, overlay=1)
diff --git a/doc/python_api/rst/change_log.rst b/doc/python_api/rst/change_log.rst
new file mode 100644
index 00000000000..7035ef4311b
--- /dev/null
+++ b/doc/python_api/rst/change_log.rst
@@ -0,0 +1,698 @@
+Blender API Change Log
+**********************
+
+.. note, this document is auto generated by sphinx_changelog_gen.py
+
+
+2.56 to 2.57
+============
+bpy.types.SplineBezierPoints
+----------------------------
+
+Function Arguments
+^^^^^^^^^^^^^^^^^^
+
+* :class:`bpy.types.SplineBezierPoints.friction` (count), *was (number)*
+
+bpy.types.RenderSettings
+------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.RenderSettings.use_stamp_lens`
+
+Removed
+^^^^^^^
+
+* **use_backbuf**
+
+bpy.types.ActionPoseMarkers
+---------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ActionPoseMarkers.active`
+* :class:`bpy.types.ActionPoseMarkers.active_index`
+
+bpy.types.SpaceImageEditor
+--------------------------
+
+Renamed
+^^^^^^^
+
+* **curves** -> :class:`bpy.types.SpaceImageEditor.curve`
+
+bpy.types.Scene
+---------------
+
+Removed
+^^^^^^^
+
+* **network_render**
+
+bpy.types.GameObjectSettings
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.GameObjectSettings.use_material_physics_fh`
+
+Removed
+^^^^^^^
+
+* **use_material_physics**
+
+bpy.types.SplinePoints
+----------------------
+
+Function Arguments
+^^^^^^^^^^^^^^^^^^
+
+* :class:`bpy.types.SplinePoints.use_material_physics` (count), *was (number)*
+
+bpy.types.Area
+--------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Area.height`
+* :class:`bpy.types.Area.width`
+
+bpy.types.SolidifyModifier
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SolidifyModifier.material_offset`
+* :class:`bpy.types.SolidifyModifier.material_offset_rim`
+
+Removed
+^^^^^^^
+
+* **use_rim_material**
+
+bpy.types.UserPreferencesEdit
+-----------------------------
+
+Removed
+^^^^^^^
+
+* **use_keyframe_insert_keyingset**
+
+bpy.types.MaterialTextureSlot
+-----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.MaterialTextureSlot.bump_method`
+* :class:`bpy.types.MaterialTextureSlot.bump_objectspace`
+
+Removed
+^^^^^^^
+
+* **use_old_bump**
+
+bpy.types.ExplodeModifier
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ExplodeModifier.particle_uv`
+* :class:`bpy.types.ExplodeModifier.use_edge_cut`
+
+Removed
+^^^^^^^
+
+* **use_edge_split**
+
+bpy.types.Node
+--------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Node.label`
+
+bpy.types.RigidBodyJointConstraint
+----------------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_max_x`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_max_y`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_max_z`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_min_x`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_min_y`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_min_z`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_max_x`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_max_y`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_max_z`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_min_x`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_min_y`
+* :class:`bpy.types.RigidBodyJointConstraint.limit_min_z`
+
+Removed
+^^^^^^^
+
+* **limit_cone_max**
+* **limit_cone_min**
+* **limit_generic_max**
+* **limit_generic_min**
+
+bpy.types.KeyMap
+----------------
+
+Renamed
+^^^^^^^
+
+* **items** -> :class:`bpy.types.KeyMap.keymap_items`
+
+bpy.types.SpaceNodeEditor
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SpaceNodeEditor.backdrop_channels`
+* :class:`bpy.types.SpaceNodeEditor.backdrop_x`
+* :class:`bpy.types.SpaceNodeEditor.backdrop_y`
+* :class:`bpy.types.SpaceNodeEditor.backdrop_zoom`
+* :class:`bpy.types.SpaceNodeEditor.use_auto_render`
+
+bpy.types.SPHFluidSettings
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SPHFluidSettings.factor_density`
+* :class:`bpy.types.SPHFluidSettings.factor_radius`
+* :class:`bpy.types.SPHFluidSettings.factor_repulsion`
+* :class:`bpy.types.SPHFluidSettings.factor_rest_length`
+* :class:`bpy.types.SPHFluidSettings.factor_stiff_viscosity`
+* :class:`bpy.types.SPHFluidSettings.plasticity`
+* :class:`bpy.types.SPHFluidSettings.repulsion`
+* :class:`bpy.types.SPHFluidSettings.spring_frames`
+* :class:`bpy.types.SPHFluidSettings.stiff_viscosity`
+* :class:`bpy.types.SPHFluidSettings.use_initial_rest_length`
+* :class:`bpy.types.SPHFluidSettings.use_viscoelastic_springs`
+* :class:`bpy.types.SPHFluidSettings.yield_ratio`
+
+Removed
+^^^^^^^
+
+* **stiffness_near**
+* **viscosity_beta**
+
+Renamed
+^^^^^^^
+
+* **viscosity_omega** -> :class:`bpy.types.SPHFluidSettings.linear_viscosity`
+
+bpy.types.ConstraintActuator
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ConstraintActuator.direction_axis_pos`
+* :class:`bpy.types.ConstraintActuator.fh_force`
+
+Removed
+^^^^^^^
+
+* **spring**
+
+bpy.types.UILayout
+------------------
+
+Renamed
+^^^^^^^
+
+* **operator_enums** -> :class:`bpy.types.UILayout.operator_enum`
+
+bpy.types.SpaceDopeSheetEditor
+------------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SpaceDopeSheetEditor.show_pose_markers`
+
+bpy.types.ToolSettings
+----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ToolSettings.edge_path_live_unwrap`
+* :class:`bpy.types.ToolSettings.proportional_size`
+* :class:`bpy.types.ToolSettings.use_keyframe_insert_keyingset`
+
+bpy.types.EditBone
+------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.EditBone.bbone_x`
+* :class:`bpy.types.EditBone.bbone_z`
+
+Function Arguments
+^^^^^^^^^^^^^^^^^^
+
+* :class:`bpy.types.EditBone.bbone_z` (self, matrix, scale, roll), *was (self, matrix)*
+
+bpy.types.ID
+------------
+
+Renamed
+^^^^^^^
+
+* **update** -> :class:`bpy.types.ID.update_tag`
+
+bpy.types.SpaceGraphEditor
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SpaceGraphEditor.use_fancy_drawing`
+
+bpy.types.ParticleSystem
+------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ParticleSystem.child_seed`
+
+bpy.types.SpaceTimeline
+-----------------------
+
+Removed
+^^^^^^^
+
+* **use_play_3d_editors**
+* **use_play_animation_editors**
+* **use_play_image_editors**
+* **use_play_node_editors**
+* **use_play_properties_editors**
+* **use_play_sequence_editors**
+* **use_play_top_left_3d_editor**
+
+bpy.types.Mesh
+--------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Mesh.validate`
+
+Renamed
+^^^^^^^
+
+* **show_extra_edge_angle** -> :class:`bpy.types.Mesh.show_extra_face_angle`
+
+Function Arguments
+^^^^^^^^^^^^^^^^^^
+
+* :class:`bpy.types.Mesh.show_extra_face_angle` (self, vertices, edges, faces), *was (self, verts, edges, faces)*
+
+bpy.types.EnumProperty
+----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.EnumProperty.default_flag`
+
+Renamed
+^^^^^^^
+
+* **items** -> :class:`bpy.types.EnumProperty.enum_items`
+
+bpy.types.Screen
+----------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Screen.use_play_3d_editors`
+* :class:`bpy.types.Screen.use_play_animation_editors`
+* :class:`bpy.types.Screen.use_play_image_editors`
+* :class:`bpy.types.Screen.use_play_node_editors`
+* :class:`bpy.types.Screen.use_play_properties_editors`
+* :class:`bpy.types.Screen.use_play_sequence_editors`
+* :class:`bpy.types.Screen.use_play_top_left_3d_editor`
+
+bpy.types.MirrorModifier
+------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.MirrorModifier.use_mirror_merge`
+
+bpy.types.Operator
+------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Operator.cancel`
+
+bpy.types.Brush
+---------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Brush.height`
+* :class:`bpy.types.Brush.use_fixed_texture`
+
+Renamed
+^^^^^^^
+
+* **imagepaint_tool** -> :class:`bpy.types.Brush.image_tool`
+* **use_paint_texture** -> :class:`bpy.types.Brush.use_paint_image`
+* **vertexpaint_tool** -> :class:`bpy.types.Brush.vertex_tool`
+
+bpy.types.Key
+-------------
+
+Renamed
+^^^^^^^
+
+* **keys** -> :class:`bpy.types.Key.key_blocks`
+
+bpy.types.CompositorNodeBlur
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.CompositorNodeBlur.aspect_correction`
+
+bpy.types.SpaceTextEditor
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SpaceTextEditor.margin_column`
+* :class:`bpy.types.SpaceTextEditor.show_margin`
+
+bpy.types.GPencilLayer
+----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.GPencilLayer.show_x_ray`
+
+Removed
+^^^^^^^
+
+* **active**
+
+bpy.types.MarbleTexture
+-----------------------
+
+Renamed
+^^^^^^^
+
+* **noisebasis_2** -> :class:`bpy.types.MarbleTexture.noise_basis_2`
+
+bpy.types.Particle
+------------------
+
+Removed
+^^^^^^^
+
+* **is_hair**
+
+Renamed
+^^^^^^^
+
+* **keys** -> :class:`bpy.types.Particle.hair_keys`
+* **keys** -> :class:`bpy.types.Particle.particle_keys`
+
+bpy.types.Modifier
+------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Modifier.use_apply_on_spline`
+
+bpy.types.Property
+------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Property.is_enum_flag`
+
+bpy.types.SpaceProperties
+-------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SpaceProperties.texture_context`
+
+Removed
+^^^^^^^
+
+* **show_brush_texture**
+
+bpy.types.VertexGroups
+----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.VertexGroups.remove`
+
+Removed
+^^^^^^^
+
+* **assign**
+
+bpy.types.Material
+------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Material.shadow_only_type`
+
+bpy.types.RenderLayer
+---------------------
+
+Function Arguments
+^^^^^^^^^^^^^^^^^^
+
+* :class:`bpy.types.RenderLayer.shadow_only_type` (filename, x, y), *was (filename)*
+
+bpy.types.Object
+----------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Object.is_modified`
+
+Renamed
+^^^^^^^
+
+* **create_dupli_list** -> :class:`bpy.types.Object.dupli_list_create`
+* **create_mesh** -> :class:`bpy.types.Object.to_mesh`
+* **free_dupli_list** -> :class:`bpy.types.Object.dupli_list_clear`
+
+bpy.types.NodeTree
+------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.NodeTree.inputs`
+* :class:`bpy.types.NodeTree.outputs`
+
+bpy.types.DopeSheet
+-------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.DopeSheet.filter_fcurve_name`
+* :class:`bpy.types.DopeSheet.show_lattices`
+* :class:`bpy.types.DopeSheet.show_only_matching_fcurves`
+
+bpy.types.ActionFCurves
+-----------------------
+
+Function Arguments
+^^^^^^^^^^^^^^^^^^
+
+* :class:`bpy.types.ActionFCurves.show_only_matching_fcurves` (data_path, index, action_group), *was (data_path, array_index, action_group)*
+
+bpy.types.ShrinkwrapModifier
+----------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ShrinkwrapModifier.cull_face`
+
+Removed
+^^^^^^^
+
+* **use_cull_back_faces**
+* **use_cull_front_faces**
+
+bpy.types.WindowManager
+-----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.WindowManager.addon_filter`
+* :class:`bpy.types.WindowManager.addon_search`
+* :class:`bpy.types.WindowManager.addon_support`
+* :class:`bpy.types.WindowManager.event_timer_add`
+* :class:`bpy.types.WindowManager.event_timer_remove`
+
+bpy.types.WoodTexture
+---------------------
+
+Renamed
+^^^^^^^
+
+* **noisebasis_2** -> :class:`bpy.types.WoodTexture.noise_basis_2`
+
+bpy.types.VertexGroup
+---------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.VertexGroup.add`
+* :class:`bpy.types.VertexGroup.remove`
+* :class:`bpy.types.VertexGroup.weight`
+
+bpy.types.FCurveKeyframePoints
+------------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.FCurveKeyframePoints.insert`
+
+Function Arguments
+^^^^^^^^^^^^^^^^^^
+
+* :class:`bpy.types.FCurveKeyframePoints.insert` (count), *was (frame, value, replace, needed, fast)*
+
+bpy.types.ThemeView3D
+---------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ThemeView3D.outline_width`
+
+bpy.types.Image
+---------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Image.pixels`
+
+bpy.types.Bone
+--------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.Bone.bbone_x`
+* :class:`bpy.types.Bone.bbone_z`
+
+bpy.types.InputKeyMapPanel
+--------------------------
+
+Removed
+^^^^^^^
+
+* **draw_entry**
+* **draw_filtered**
+* **draw_hierarchy**
+* **draw_keymaps**
+* **draw_km**
+* **draw_kmi**
+* **draw_kmi_properties**
+* **indented_layout**
+
+bpy.types.ParticleSettings
+--------------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.ParticleSettings.active_texture`
+* :class:`bpy.types.ParticleSettings.active_texture_index`
+* :class:`bpy.types.ParticleSettings.child_parting_factor`
+* :class:`bpy.types.ParticleSettings.child_parting_max`
+* :class:`bpy.types.ParticleSettings.child_parting_min`
+* :class:`bpy.types.ParticleSettings.color_maximum`
+* :class:`bpy.types.ParticleSettings.create_long_hair_children`
+* :class:`bpy.types.ParticleSettings.draw_color`
+* :class:`bpy.types.ParticleSettings.effector_amount`
+* :class:`bpy.types.ParticleSettings.grid_random`
+* :class:`bpy.types.ParticleSettings.hair_length`
+* :class:`bpy.types.ParticleSettings.hexagonal_grid`
+* :class:`bpy.types.ParticleSettings.is_fluid`
+* :class:`bpy.types.ParticleSettings.kink_amplitude_clump`
+* :class:`bpy.types.ParticleSettings.kink_flat`
+* :class:`bpy.types.ParticleSettings.texture_slots`
+* :class:`bpy.types.ParticleSettings.timestep`
+* :class:`bpy.types.ParticleSettings.use_advanced_hair`
+
+Removed
+^^^^^^^
+
+* **reaction_shape**
+* **show_material_color**
+* **use_animate_branching**
+* **use_branching**
+* **use_symmetric_branching**
+
+bpy.types.SceneGameData
+-----------------------
+
+Added
+^^^^^
+
+* :class:`bpy.types.SceneGameData.show_mouse`
+
+bpy.types.MaterialPhysics
+-------------------------
+
+Renamed
+^^^^^^^
+
+* **damping** -> :class:`bpy.types.MaterialPhysics.fh_damping`
+* **distance** -> :class:`bpy.types.MaterialPhysics.fh_distance`
+* **force** -> :class:`bpy.types.MaterialPhysics.fh_force`
+* **use_normal_align** -> :class:`bpy.types.MaterialPhysics.use_fh_normal`
+
diff --git a/doc/python_api/sphinx_changelog_gen.py b/doc/python_api/sphinx_changelog_gen.py
new file mode 100644
index 00000000000..eb4fc4716e6
--- /dev/null
+++ b/doc/python_api/sphinx_changelog_gen.py
@@ -0,0 +1,364 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+"""
+Dump the python API into a text file so we can generate changelogs.
+
+output from this tool should be added into "doc/python_api/rst/change_log.rst"
+
+# dump api blender_version.py in CWD
+blender --background --python intern/tools/rna_api_dump.py -- --dump
+
+# create changelog
+blender --background --python intern/tools/rna_api_dump.py -- \
+ --api_from blender_2_56_1.py \
+ --api_to blender_2_57_0.py \
+ --api_out changes.rst
+
+
+# Api comparison can also run without blender
+python intern/tools/rna_api_dump.py
+ --api_from blender_api_2_56_6.py \
+ --api_to blender_api_2_57.py \
+ --api_out changes.rst
+
+"""
+
+# format
+'''
+{"module.name":
+ {"parent.class":
+ {"basic_type", "member_name": ("Name", type, range, length, default, descr, f_args, f_arg_types, f_ret_types)}, ...
+ }, ...
+}
+'''
+
+api_names = "basic_type" "name", "type", "range", "length", "default", "descr", "f_args", "f_arg_types", "f_ret_types"
+
+API_BASIC_TYPE = 0
+API_F_ARGS = 7
+
+
+def api_dunp_fname():
+ import bpy
+ return "blender_api_%s.py" % "_".join([str(i) for i in bpy.app.version])
+
+
+def api_dump():
+ dump = {}
+ dump_module = dump["bpy.types"] = {}
+
+ import rna_info
+ import inspect
+
+ struct = rna_info.BuildRNAInfo()[0]
+ for struct_id, strict_info in sorted(struct.items()):
+
+ struct_id_str = strict_info.identifier
+
+ if rna_info.rna_id_ignore(struct_id_str):
+ continue
+
+ for base in strict_info.get_bases():
+ struct_id_str = base.identifier + "." + struct_id_str
+
+ dump_class = dump_module[struct_id_str] = {}
+
+ props = [(prop.identifier, prop) for prop in strict_info.properties]
+ for prop_id, prop in sorted(props):
+ # if prop.type == 'boolean':
+ # continue
+ prop_type = prop.type
+ prop_length = prop.array_length
+ prop_range = round(prop.min, 4), round(prop.max, 4)
+ prop_default = prop.default
+ if type(prop_default) is float:
+ prop_default = round(prop_default, 4)
+
+ if prop_range[0] == -1 and prop_range[1] == -1:
+ prop_range = None
+
+ dump_class[prop_id] = (
+ "prop_rna", # basic_type
+ prop.name, # name
+ prop_type, # type
+ prop_range, # range
+ prop_length, # length
+ prop.default, # default
+ prop.description, # descr
+ Ellipsis, # f_args
+ Ellipsis, # f_arg_types
+ Ellipsis, # f_ret_types
+ )
+ del props
+
+ # python props, tricky since we dont know much about them.
+ for prop_id, attr in strict_info.get_py_properties():
+
+ dump_class[prop_id] = (
+ "prop_py", # basic_type
+ Ellipsis, # name
+ Ellipsis, # type
+ Ellipsis, # range
+ Ellipsis, # length
+ Ellipsis, # default
+ attr.__doc__, # descr
+ Ellipsis, # f_args
+ Ellipsis, # f_arg_types
+ Ellipsis, # f_ret_types
+ )
+
+ # kludge func -> props
+ funcs = [(func.identifier, func) for func in strict_info.functions]
+ for func_id, func in funcs:
+
+ func_ret_types = tuple([prop.type for prop in func.return_values])
+ func_args_ids = tuple([prop.identifier for prop in func.args])
+ func_args_type = tuple([prop.type for prop in func.args])
+
+ dump_class[func_id] = (
+ "func_rna", # basic_type
+ Ellipsis, # name
+ Ellipsis, # type
+ Ellipsis, # range
+ Ellipsis, # length
+ Ellipsis, # default
+ func.description, # descr
+ func_args_ids, # f_args
+ func_args_type, # f_arg_types
+ func_ret_types, # f_ret_types
+ )
+ del funcs
+
+ # kludge func -> props
+ funcs = strict_info.get_py_functions()
+ for func_id, attr in funcs:
+ # arg_str = inspect.formatargspec(*inspect.getargspec(py_func))
+
+ func_args_ids = tuple(inspect.getargspec(attr).args)
+
+ dump_class[func_id] = (
+ "func_py", # basic_type
+ Ellipsis, # name
+ Ellipsis, # type
+ Ellipsis, # range
+ Ellipsis, # length
+ Ellipsis, # default
+ attr.__doc__, # descr
+ func_args_ids, # f_args
+ Ellipsis, # f_arg_types
+ Ellipsis, # f_ret_types
+ )
+ del funcs
+
+ import pprint
+
+ filename = api_dunp_fname()
+ filehandle = open(filename, 'w')
+ tot = filehandle.write(pprint.pformat(dump, width=1))
+ filehandle.close()
+ print("%s, %d bytes written" % (filename, tot))
+
+
+def compare_props(a, b, fuzz=0.75):
+
+ # must be same basic_type, function != property
+ if a[0] != b[0]:
+ return False
+
+ tot = 0
+ totlen = 0
+ for i in range(1, len(a)):
+ if not (Ellipsis is a[i] is b[i]):
+ tot += (a[i] == b[i])
+ totlen += 1
+
+ return ((tot / totlen) >= fuzz)
+
+
+def api_changelog(api_from, api_to, api_out):
+
+ file_handle = open(api_from, 'r')
+ dict_from = eval(file_handle.read())
+ file_handle.close()
+
+ file_handle = open(api_to, 'r')
+ dict_to = eval(file_handle.read())
+ file_handle.close()
+
+ api_changes = []
+
+ # first work out what moved
+ for mod_id, mod_data in dict_to.items():
+ mod_data_other = dict_from[mod_id]
+ for class_id, class_data in mod_data.items():
+ class_data_other = mod_data_other.get(class_id)
+ if class_data_other is None:
+ # TODO, document new structs
+ continue
+
+ # find the props which are not in either
+ set_props_new = set(class_data.keys())
+ set_props_other = set(class_data_other.keys())
+ set_props_shared = set_props_new & set_props_other
+
+ props_moved = []
+ props_new = []
+ props_old = []
+ func_args = []
+
+ set_props_old = set_props_other - set_props_shared
+ set_props_new = set_props_new - set_props_shared
+
+ # first find settings which have been moved old -> new
+ for prop_id_old in set_props_old.copy():
+ prop_data_other = class_data_other[prop_id_old]
+ for prop_id_new in set_props_new.copy():
+ prop_data = class_data[prop_id_new]
+ if compare_props(prop_data_other, prop_data):
+ props_moved.append((prop_id_old, prop_id_new))
+
+ # remove
+ if prop_id_old in set_props_old:
+ set_props_old.remove(prop_id_old)
+ set_props_new.remove(prop_id_new)
+
+ # func args
+ for prop_id in set_props_shared:
+ prop_data = class_data[prop_id]
+ prop_data_other = class_data_other[prop_id]
+ if prop_data[API_BASIC_TYPE] == prop_data_other[API_BASIC_TYPE]:
+ if prop_data[API_BASIC_TYPE].startswith("func"):
+ args_new = prop_data[API_F_ARGS]
+ args_old = prop_data_other[API_F_ARGS]
+
+ if args_new != args_old:
+ func_args.append((prop_id, args_old, args_new))
+
+ if props_moved or set_props_new or set_props_old or func_args:
+ props_moved.sort()
+ props_new[:] = sorted(set_props_new)
+ props_old[:] = sorted(set_props_old)
+ func_args.sort()
+
+ api_changes.append((mod_id, class_id, props_moved, props_new, props_old, func_args))
+
+ # also document function argument changes
+
+ fout = open(api_out, 'w')
+ fw = fout.write
+ # print(api_changes)
+
+ # :class:`bpy_struct.id_data`
+
+ def write_title(title, title_char):
+ fw("%s\n%s\n\n" % (title, title_char * len(title)))
+
+ for mod_id, class_id, props_moved, props_new, props_old, func_args in api_changes:
+ class_name = class_id.split(".")[-1]
+ title = mod_id + "." + class_name
+ write_title(title, "-")
+
+ if props_new:
+ write_title("Added", "^")
+ for prop_id in props_new:
+ fw("* :class:`%s.%s.%s`\n" % (mod_id, class_name, prop_id))
+ fw("\n")
+
+ if props_old:
+ write_title("Removed", "^")
+ for prop_id in props_old:
+ fw("* **%s**\n" % prop_id) # cant link to remvoed docs
+ fw("\n")
+
+ if props_moved:
+ write_title("Renamed", "^")
+ for prop_id_old, prop_id in props_moved:
+ fw("* **%s** -> :class:`%s.%s.%s`\n" % (prop_id_old, mod_id, class_name, prop_id))
+ fw("\n")
+
+ if func_args:
+ write_title("Function Arguments", "^")
+ for func_id, args_old, args_new in func_args:
+ args_new = ", ".join(args_new)
+ args_old = ", ".join(args_old)
+ fw("* :class:`%s.%s.%s` (%s), *was (%s)*\n" % (mod_id, class_name, prop_id, args_new, args_old))
+ fw("\n")
+
+ fout.close()
+
+
+def main():
+ import sys
+ import os
+
+ try:
+ import argparse
+ except:
+ print("Old Blender, just dumping")
+ api_dump()
+ return
+
+ argv = sys.argv
+
+ if "--" not in argv:
+ argv = [] # as if no args are passed
+ else:
+ argv = argv[argv.index("--") + 1:] # get all args after "--"
+
+ # When --help or no args are given, print this help
+ usage_text = "Run blender in background mode with this script: "
+ "blender --background --python %s -- [options]" % os.path.basename(__file__)
+
+ epilog = "Run this before releases"
+
+ parser = argparse.ArgumentParser(description=usage_text, epilog=epilog)
+
+ parser.add_argument("--dump", dest="dump", action='store_true',
+ help="When set the api will be dumped into blender_version.py")
+
+ parser.add_argument("--api_from", dest="api_from", metavar='FILE',
+ help="File to compare from (previous version)")
+ parser.add_argument("--api_to", dest="api_to", metavar='FILE',
+ help="File to compare from (current)")
+ parser.add_argument("--api_out", dest="api_out", metavar='FILE',
+ help="Output sphinx changelog")
+
+ args = parser.parse_args(argv) # In this example we wont use the args
+
+ if not argv:
+ parser.print_help()
+ return
+
+ if args.dump:
+ api_dump()
+ else:
+ if args.api_from and args.api_to and args.api_out:
+ api_changelog(args.api_from, args.api_to, args.api_out)
+ else:
+ print("Error: --api_from/api_to/api_out args needed")
+ parser.print_help()
+ return
+
+ print("batch job finished, exiting")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py
index e10d5c5cf9a..258b28a3d33 100644
--- a/doc/python_api/sphinx_doc_gen.py
+++ b/doc/python_api/sphinx_doc_gen.py
@@ -27,7 +27,7 @@ For HTML generation
-------------------
- Run this script from blenders root path once you have compiled blender
- ./blender.bin -b -P doc/python_api/sphinx_doc_gen.py
+ ./blender.bin --background --python doc/python_api/sphinx_doc_gen.py
This will generate python files in doc/python_api/sphinx-in/,
assuming that ./blender.bin is or links to the blender executable
@@ -36,7 +36,7 @@ For HTML generation
sphinx-build doc/python_api/sphinx-in doc/python_api/sphinx-out
- assuming that you have sphinx 0.6.7 installed
+ assuming that you have sphinx 1.0.7 installed
For PDF generation
------------------
@@ -61,7 +61,7 @@ else:
"bpy.app",
"bpy.path",
"bpy.data",
- #"bpy.props",
+ "bpy.props",
"bpy.utils",
"bpy.context",
# "bpy.types", # supports filtering
@@ -74,7 +74,7 @@ else:
"mathutils.geometry",
)
- FILTER_BPY_TYPES = ("PropertyGroup", "Panel", "Menu", "Operator", "RenderEngine") # allow
+ FILTER_BPY_TYPES = ("bpy_struct", "Panel", "Menu", "Operator", "RenderEngine") # allow
FILTER_BPY_OPS = ("import.scene", ) # allow
# for quick rebuilds
@@ -102,8 +102,14 @@ EXAMPLE_SET = set()
EXAMPLE_SET_USED = set()
_BPY_STRUCT_FAKE = "bpy_struct"
+_BPY_PROP_COLLECTION_FAKE = "bpy_prop_collection"
_BPY_FULL_REBUILD = False
+if _BPY_PROP_COLLECTION_FAKE:
+ _BPY_PROP_COLLECTION_ID = ":class:`%s`" % _BPY_PROP_COLLECTION_FAKE
+else:
+ _BPY_PROP_COLLECTION_ID = "collection"
+
def undocumented_message(module_name, type_name, identifier):
if str(type_name).startswith('<module'):
@@ -155,6 +161,10 @@ def example_extract_docstring(filepath):
return "\n".join(text), line_no
+def write_title(fw, text, heading_char):
+ fw("%s\n%s\n\n" % (text, len(text) * heading_char))
+
+
def write_example_ref(ident, fw, example_id, ext="py"):
if example_id in EXAMPLE_SET:
@@ -262,7 +272,7 @@ def py_descr2sphinx(ident, fw, descr, module_name, type_name, identifier):
else:
raise TypeError("type was not GetSetDescriptorType, MethodDescriptorType or ClassMethodDescriptorType")
- write_example_ref(ident, fw, module_name + "." + type_name + "." + identifier)
+ write_example_ref(ident + " ", fw, module_name + "." + type_name + "." + identifier)
fw("\n")
@@ -279,6 +289,13 @@ def py_c_func2sphinx(ident, fw, module_name, type_name, identifier, py_func, is_
fw(ident + ".. function:: %s()\n\n" % identifier)
fw(ident + " " + undocumented_message(module_name, type_name, identifier))
+ if is_class:
+ write_example_ref(ident + " ", fw, module_name + "." + type_name + "." + identifier)
+ else:
+ write_example_ref(ident + " ", fw, module_name + "." + identifier)
+
+ fw("\n")
+
def pyprop2sphinx(ident, fw, identifier, py_prop):
'''
@@ -303,8 +320,7 @@ def pymodule2sphinx(BASEPATH, module_name, module, title):
fw = file.write
- fw(title + "\n")
- fw(("=" * len(title)) + "\n\n")
+ write_title(fw, title, "=")
fw(".. module:: %s\n\n" % module_name)
@@ -356,7 +372,7 @@ def pymodule2sphinx(BASEPATH, module_name, module, title):
elif value_type in (types.BuiltinMethodType, types.BuiltinFunctionType): # both the same at the moment but to be future proof
# note: can't get args from these, so dump the string as is
# this means any module used like this must have fully formatted docstrings.
- py_c_func2sphinx("", fw, module_name, module, attribute, value, is_class=False)
+ py_c_func2sphinx("", fw, module_name, None, attribute, value, is_class=False)
elif value_type == type:
classes.append((attribute, value))
elif value_type in (bool, int, float, str, tuple):
@@ -445,6 +461,7 @@ def pycontext2sphinx(BASEPATH):
"edit_text": ("Text", False),
"editable_bones": ("EditBone", True),
"fluid": ("FluidSimulationModifier", False),
+ "image_paint_object": ("Object", False),
"lamp": ("Lamp", False),
"lattice": ("Lattice", False),
"material": ("Material", False),
@@ -474,7 +491,6 @@ def pycontext2sphinx(BASEPATH):
"smoke": ("SmokeModifier", False),
"soft_body": ("SoftBodyModifier", False),
"texture": ("Texture", False),
- "texture_paint_object": ("Object", False),
"texture_slot": ("MaterialTextureSlot", False),
"vertex_paint_object": ("Object", False),
"visible_bases": ("ObjectBase", True),
@@ -528,14 +544,18 @@ def pyrna2sphinx(BASEPATH):
if is_return:
id_name = "return"
id_type = "rtype"
- kwargs = {"as_ret": True, "class_fmt": ":class:`%s`"}
+ kwargs = {"as_ret": True}
identifier = ""
else:
id_name = "arg"
id_type = "type"
- kwargs = {"as_arg": True, "class_fmt": ":class:`%s`"}
+ kwargs = {"as_arg": True}
identifier = " %s" % prop.identifier
+ kwargs["class_fmt"] = ":class:`%s`"
+
+ kwargs["collection_id"] = _BPY_PROP_COLLECTION_ID
+
type_descr = prop.get_type_description(**kwargs)
if prop.name or prop.description:
fw(ident + ":%s%s: %s\n" % (id_name, identifier, ", ".join(val for val in (prop.name, prop.description) if val)))
@@ -563,7 +583,7 @@ def pyrna2sphinx(BASEPATH):
else:
title = struct.identifier
- fw("%s\n%s\n\n" % (title, "=" * len(title)))
+ write_title(fw, title, "=")
fw(".. module:: bpy.types\n\n")
@@ -608,7 +628,7 @@ def pyrna2sphinx(BASEPATH):
sorted_struct_properties.sort(key=lambda prop: prop.identifier)
for prop in sorted_struct_properties:
- type_descr = prop.get_type_description(class_fmt=":class:`%s`")
+ type_descr = prop.get_type_description(class_fmt=":class:`%s`", collection_id=_BPY_PROP_COLLECTION_ID)
# readonly properties use "data" directive, variables properties use "attribute" directive
if 'readonly' in type_descr:
fw(" .. data:: %s\n\n" % prop.identifier)
@@ -639,7 +659,7 @@ def pyrna2sphinx(BASEPATH):
elif func.return_values: # multiple return values
fw(" :return (%s):\n" % ", ".join(prop.identifier for prop in func.return_values))
for prop in func.return_values:
- type_descr = prop.get_type_description(as_ret=True, class_fmt=":class:`%s`")
+ type_descr = prop.get_type_description(as_ret=True, class_fmt=":class:`%s`", collection_id=_BPY_PROP_COLLECTION_ID)
descr = prop.description
if not descr:
descr = prop.name
@@ -655,6 +675,12 @@ def pyrna2sphinx(BASEPATH):
pyfunc2sphinx(" ", fw, identifier, py_func, is_class=True)
del py_funcs, py_func
+ py_funcs = struct.get_py_c_functions()
+ py_func = None
+
+ for identifier, py_func in py_funcs:
+ py_c_func2sphinx(" ", fw, "bpy.types", struct.identifier, identifier, py_func, is_class=True)
+
lines = []
if struct.base or _BPY_STRUCT_FAKE:
@@ -742,38 +768,46 @@ def pyrna2sphinx(BASEPATH):
continue
write_struct(struct)
- # special case, bpy_struct
- if _BPY_STRUCT_FAKE:
- filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % _BPY_STRUCT_FAKE)
+ def fake_bpy_type(class_value, class_name, descr_str, use_subclasses=True):
+ filepath = os.path.join(BASEPATH, "bpy.types.%s.rst" % class_name)
file = open(filepath, "w")
fw = file.write
- fw("%s\n" % _BPY_STRUCT_FAKE)
- fw("=" * len(_BPY_STRUCT_FAKE) + "\n")
- fw("\n")
+ write_title(fw, class_name, "=")
+
fw(".. module:: bpy.types\n")
fw("\n")
- subclass_ids = [s.identifier for s in structs.values() if s.base is None if not rna_info.rna_id_ignore(s.identifier)]
- if subclass_ids:
- fw("subclasses --- \n" + ", ".join((":class:`%s`" % s) for s in sorted(subclass_ids)) + "\n\n")
+ if use_subclasses:
+ subclass_ids = [s.identifier for s in structs.values() if s.base is None if not rna_info.rna_id_ignore(s.identifier)]
+ if subclass_ids:
+ fw("subclasses --- \n" + ", ".join((":class:`%s`" % s) for s in sorted(subclass_ids)) + "\n\n")
- fw(".. class:: %s\n\n" % _BPY_STRUCT_FAKE)
- fw(" built-in base class for all classes in bpy.types.\n\n")
+ fw(".. class:: %s\n\n" % class_name)
+ fw(" %s\n\n" % descr_str)
fw(" .. note::\n\n")
- fw(" Note that bpy.types.%s is not actually available from within blender, it only exists for the purpose of documentation.\n\n" % _BPY_STRUCT_FAKE)
+ fw(" Note that bpy.types.%s is not actually available from within blender, it only exists for the purpose of documentation.\n\n" % class_name)
- descr_items = [(key, descr) for key, descr in sorted(bpy.types.Struct.__bases__[0].__dict__.items()) if not key.startswith("__")]
+ descr_items = [(key, descr) for key, descr in sorted(class_value.__dict__.items()) if not key.startswith("__")]
for key, descr in descr_items:
if type(descr) == MethodDescriptorType: # GetSetDescriptorType, GetSetDescriptorType's are not documented yet
- py_descr2sphinx(" ", fw, descr, "bpy.types", _BPY_STRUCT_FAKE, key)
+ py_descr2sphinx(" ", fw, descr, "bpy.types", class_name, key)
for key, descr in descr_items:
if type(descr) == GetSetDescriptorType:
- py_descr2sphinx(" ", fw, descr, "bpy.types", _BPY_STRUCT_FAKE, key)
+ py_descr2sphinx(" ", fw, descr, "bpy.types", class_name, key)
file.close()
+ # write fake classes
+ if _BPY_STRUCT_FAKE:
+ class_value = bpy.types.Struct.__bases__[0]
+ fake_bpy_type(class_value, _BPY_STRUCT_FAKE, "built-in base class for all classes in bpy.types.", use_subclasses=True)
+
+ if _BPY_PROP_COLLECTION_FAKE:
+ class_value = bpy.data.objects.__class__
+ fake_bpy_type(class_value, _BPY_PROP_COLLECTION_FAKE, "built-in class used for all collections.", use_subclasses=False)
+
# operators
def write_ops():
API_BASEURL = "https://svn.blender.org/svnroot/bf-blender/trunk/blender/release/scripts"
@@ -789,7 +823,8 @@ def pyrna2sphinx(BASEPATH):
fw = file.write
title = "%s Operators" % op_module_name.replace("_", " ").title()
- fw("%s\n%s\n\n" % (title, "=" * len(title)))
+
+ write_title(fw, title, "=")
fw(".. module:: bpy.ops.%s\n\n" % op_module_name)
@@ -838,14 +873,18 @@ def rna2sphinx(BASEPATH):
if bpy.app.build_revision != "Unknown":
version_string = version_string + " r" + bpy.app.build_revision
- # for use with files
version_string_fp = "_".join(str(v) for v in bpy.app.version)
+ if bpy.app.version_cycle == "release":
+ version_string_pdf = "%s%s_release" % ("_".join(str(v) for v in bpy.app.version[:2]), bpy.app.version_char)
+ else:
+ version_string_pdf = version_string_fp
+
fw("project = 'Blender'\n")
# fw("master_doc = 'index'\n")
fw("copyright = u'Blender Foundation'\n")
- fw("version = '%s - UNSTABLE API'\n" % version_string)
- fw("release = '%s - UNSTABLE API'\n" % version_string)
+ fw("version = '%s - API'\n" % version_string)
+ fw("release = '%s - API'\n" % version_string)
fw("html_theme = 'blender-org'\n")
fw("html_theme_path = ['../']\n")
fw("html_favicon = 'favicon.ico'\n")
@@ -866,30 +905,19 @@ def rna2sphinx(BASEPATH):
fw(" Blender Documentation contents\n")
fw("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n")
fw("\n")
- fw("This document is an API reference for Blender %s. built %s.\n" % (version_string, bpy.app.build_date))
+ fw("Welcome, this document is an API reference for Blender %s. built %s.\n" % (version_string, bpy.app.build_date))
fw("\n")
- fw("| An introduction to Blender and Python can be found at `Quickstart Intro <http://wiki.blender.org/index.php/Dev:2.5/Py/API/Intro>`_,\n")
- fw("| For a more general explanation of blender/python see the `API Overview <http://wiki.blender.org/index.php/Dev:2.5/Py/API/Overview>`_\n")
+ fw("`A PDF version of this document is also available <blender_python_reference_%s.pdf>`_\n" % version_string_pdf)
+
fw("\n")
- fw("`A PDF version of this document is also available <blender_python_reference_%s.pdf>`_\n" % version_string_fp)
+
+ fw("============================\n")
+ fw("Blender/Python Documentation\n")
+ fw("============================\n")
fw("\n")
- fw(".. warning:: The Python API in Blender is **UNSTABLE**, It should only be used for testing, any script written now may break in future releases.\n")
- fw(" \n")
- fw(" The following areas are subject to change.\n")
- fw(" * operator names and arguments\n")
- fw(" * render api\n")
- fw(" * function calls with the data api (any function calls with values accessed from bpy.data), including functions for importing and exporting meshes\n")
- fw(" * class registration (Operator, Panels, Menus, Headers)\n")
- fw(" * modules: bpy.props, blf)\n")
- fw(" * members in the bpy.context have to be reviewed\n")
- fw(" * python defined modal operators, especially drawing callbacks are highly experemental\n")
- fw(" \n")
- fw(" These parts of the API are relatively stable and are unlikely to change significantly\n")
- fw(" * data API, access to attributes of blender data such as mesh verts, material color, timeline frames and scene objects\n")
- fw(" * user interface functions for defining buttons, creation of menus, headers, panels\n")
- fw(" * modules: bgl and mathutils\n")
- fw(" * game engine modules\n")
fw("\n")
+ fw("* `Quickstart Intro <http://wiki.blender.org/index.php/Dev:2.5/Py/API/Intro>`_ if you are new to scripting in blender and want to get you're feet wet!\n")
+ fw("* `Blender/Python Overview <http://wiki.blender.org/index.php/Dev:2.5/Py/API/Overview>`_ for a more complete explanation of python integration in blender\n")
fw("===================\n")
fw("Application Modules\n")
@@ -949,6 +977,30 @@ def rna2sphinx(BASEPATH):
fw(" bge.render.rst\n\n")
fw(" bge.events.rst\n\n")
+ # rna generated change log
+ fw("========\n")
+ fw("API Info\n")
+ fw("========\n")
+ fw("\n")
+ fw(".. toctree::\n")
+ fw(" :maxdepth: 1\n\n")
+ fw(" change_log.rst\n\n")
+
+ fw("\n")
+ fw("\n")
+ fw(".. note:: The Blender Python API has areas which are still in development.\n")
+ fw(" \n")
+ fw(" The following areas are subject to change.\n")
+ fw(" * operator behavior, names and arguments\n")
+ fw(" * mesh creation and editing functions\n")
+ fw(" \n")
+ fw(" These parts of the API are relatively stable and are unlikely to change significantly\n")
+ fw(" * data API, access to attributes of blender data such as mesh verts, material color, timeline frames and scene objects\n")
+ fw(" * user interface functions for defining buttons, creation of menus, headers, panels\n")
+ fw(" * render engine integration\n")
+ fw(" * modules: bgl, mathutils & game engine.\n")
+ fw("\n")
+
file.close()
# internal modules
@@ -1053,6 +1105,8 @@ def rna2sphinx(BASEPATH):
shutil.copy2(os.path.join(BASEPATH, "..", "rst", "bge.render.rst"), BASEPATH)
shutil.copy2(os.path.join(BASEPATH, "..", "rst", "bge.events.rst"), BASEPATH)
+ shutil.copy2(os.path.join(BASEPATH, "..", "rst", "change_log.rst"), BASEPATH)
+
if 0:
filepath = os.path.join(BASEPATH, "bpy.rst")
file = open(filepath, "w")
@@ -1061,7 +1115,9 @@ def rna2sphinx(BASEPATH):
fw("\n")
title = ":mod:`bpy` --- Blender Python Module"
- fw("%s\n%s\n\n" % (title, "=" * len(title)))
+
+ write_title(fw, title, "=")
+
fw(".. module:: bpy.types\n\n")
file.close()
diff --git a/doc/python_api/sphinx_doc_gen.sh b/doc/python_api/sphinx_doc_gen.sh
index c027db83831..5f23ca395b6 100755
--- a/doc/python_api/sphinx_doc_gen.sh
+++ b/doc/python_api/sphinx_doc_gen.sh
@@ -12,9 +12,17 @@ SSH_UPLOAD="/data/www/vhosts/www.blender.org/documentation" # blender_python_api
# "_".join(str(v) for v in bpy.app.version)
# custom blender vars
blender_srcdir=$(dirname $0)/../../
-blender_version=$(grep BLENDER_VERSION $blender_srcdir/source/blender/blenkernel/BKE_blender.h | tr -dc 0-9)
-blender_subversion=$(grep BLENDER_SUBVERSION $blender_srcdir/source/blender/blenkernel/BKE_blender.h | tr -dc 0-9)
-BLENDER_VERSION=$(expr $blender_version / 100)_$(expr $blender_version % 100)_$blender_subversion
+blender_version=$(grep "BLENDER_VERSION\s" $blender_srcdir/source/blender/blenkernel/BKE_blender.h | awk '{print $3}')
+blender_version_char=$(grep BLENDER_VERSION_CHAR $blender_srcdir/source/blender/blenkernel/BKE_blender.h | awk '{print $3}')
+blender_version_cycle=$(grep BLENDER_VERSION_CYCLE $blender_srcdir/source/blender/blenkernel/BKE_blender.h | awk '{print $3}')
+blender_subversion=$(grep BLENDER_SUBVERSION $blender_srcdir/source/blender/blenkernel/BKE_blender.h | awk '{print $3}')
+
+if [ "$blender_version_cycle" == "release" ]
+then
+ BLENDER_VERSION=$(expr $blender_version / 100)_$(expr $blender_version % 100)$blender_version_char"_release"
+else
+ BLENDER_VERSION=$(expr $blender_version / 100)_$(expr $blender_version % 100)_$blender_subversion
+fi
SSH_UPLOAD_FULL=$SSH_UPLOAD/"blender_python_api_"$BLENDER_VERSION
@@ -25,6 +33,7 @@ $BLENDER --background --factory-startup --python $SPHINXBASE/sphinx_doc_gen.py
# html
sphinx-build $SPHINXBASE/sphinx-in $SPHINXBASE/sphinx-out
+
cp $SPHINXBASE/sphinx-out/contents.html $SPHINXBASE/sphinx-out/index.html
ssh $SSH_USER@emo.blender.org 'rm -rf '$SSH_UPLOAD_FULL'/*'
rsync --progress -avze "ssh -p 22" $SPHINXBASE/sphinx-out/* $SSH_HOST:$SSH_UPLOAD_FULL/
diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt
index 999e60980db..d74c6683f2c 100644
--- a/extern/CMakeLists.txt
+++ b/extern/CMakeLists.txt
@@ -35,7 +35,9 @@ if(WITH_BINRELOC)
add_subdirectory(binreloc)
endif()
-add_subdirectory(glew)
+if(WITH_BUILTIN_GLEW)
+ add_subdirectory(glew)
+endif()
if(WITH_IMAGE_OPENJPEG AND (NOT UNIX OR APPLE))
add_subdirectory(libopenjpeg)
diff --git a/extern/bullet2/CMakeLists.txt b/extern/bullet2/CMakeLists.txt
index 74f0fc2ab56..a9137dd33f7 100644
--- a/extern/bullet2/CMakeLists.txt
+++ b/extern/bullet2/CMakeLists.txt
@@ -107,7 +107,6 @@ set(SRC
src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
src/BulletCollision/NarrowPhaseCollision/btConvexCast.cpp
src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp
- src/BulletCollision/NarrowPhaseCollision/btGjkEpa.cpp
src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp
src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
@@ -119,6 +118,7 @@ set(SRC
src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
+ src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp
src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
@@ -132,6 +132,7 @@ set(SRC
src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
src/BulletDynamics/Vehicle/btRaycastVehicle.cpp
src/BulletDynamics/Vehicle/btWheelInfo.cpp
+ src/BulletSoftBody/btDefaultSoftBodySolver.cpp
src/BulletSoftBody/btSoftBody.cpp
src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
src/BulletSoftBody/btSoftBodyHelpers.cpp
@@ -143,6 +144,8 @@ set(SRC
src/LinearMath/btConvexHull.cpp
src/LinearMath/btGeometryUtil.cpp
src/LinearMath/btQuickprof.cpp
+ src/LinearMath/btSerializer.cpp
+
src/Bullet-C-Api.h
src/BulletCollision/BroadphaseCollision/btAxisSweep3.h
@@ -247,7 +250,6 @@ set(SRC
src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h
- src/BulletCollision/NarrowPhaseCollision/btGjkEpa.h
src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h
src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h
src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
@@ -264,6 +266,7 @@ set(SRC
src/BulletDynamics/ConstraintSolver/btContactConstraint.h
src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
+ src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h
src/BulletDynamics/ConstraintSolver/btHingeConstraint.h
src/BulletDynamics/ConstraintSolver/btJacobianEntry.h
src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
@@ -282,6 +285,7 @@ set(SRC
src/BulletDynamics/Vehicle/btRaycastVehicle.h
src/BulletDynamics/Vehicle/btVehicleRaycaster.h
src/BulletDynamics/Vehicle/btWheelInfo.h
+ src/BulletSoftBody/btDefaultSoftBodySolver.h
src/BulletSoftBody/btSoftBody.h
src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h
src/BulletSoftBody/btSoftBodyHelpers.h
@@ -310,11 +314,13 @@ set(SRC
src/LinearMath/btQuickprof.h
src/LinearMath/btRandom.h
src/LinearMath/btScalar.h
+ src/LinearMath/btSerializer.h
src/LinearMath/btSimdMinMax.h
src/LinearMath/btStackAlloc.h
src/LinearMath/btTransform.h
src/LinearMath/btTransformUtil.h
src/LinearMath/btVector3.h
+
src/btBulletCollisionCommon.h
src/btBulletDynamicsCommon.h
)
diff --git a/extern/bullet2/src/Bullet-C-Api.h b/extern/bullet2/src/Bullet-C-Api.h
index d2123047c68..f27a17d51f7 100644
--- a/extern/bullet2/src/Bullet-C-Api.h
+++ b/extern/bullet2/src/Bullet-C-Api.h
@@ -147,6 +147,7 @@ extern "C" {
extern void plSetPosition(plRigidBodyHandle object, const plVector3 position);
extern void plSetOrientation(plRigidBodyHandle object, const plQuaternion orientation);
extern void plSetEuler(plReal yaw,plReal pitch,plReal roll, plQuaternion orient);
+ extern void plSetOpenGLMatrix(plRigidBodyHandle object, plReal* matrix);
typedef struct plRayCastResult {
plRigidBodyHandle m_body;
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h
index cad21b4cad2..07167af3baf 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h
@@ -150,6 +150,8 @@ public:
virtual void getAabb(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const;
virtual void rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin=btVector3(0,0,0), const btVector3& aabbMax = btVector3(0,0,0));
+ virtual void aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback);
+
void quantize(BP_FP_INT_TYPE* out, const btVector3& point, int isMax) const;
///unQuantize should be conservative: aabbMin/aabbMax should be larger then 'getAabb' result
@@ -285,6 +287,31 @@ void btAxisSweep3Internal<BP_FP_INT_TYPE>::rayTest(const btVector3& rayFrom,cons
}
}
+template <typename BP_FP_INT_TYPE>
+void btAxisSweep3Internal<BP_FP_INT_TYPE>::aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback)
+{
+ if (m_raycastAccelerator)
+ {
+ m_raycastAccelerator->aabbTest(aabbMin,aabbMax,callback);
+ } else
+ {
+ //choose axis?
+ BP_FP_INT_TYPE axis = 0;
+ //for each proxy
+ for (BP_FP_INT_TYPE i=1;i<m_numHandles*2+1;i++)
+ {
+ if (m_pEdges[axis][i].IsMax())
+ {
+ Handle* handle = getHandle(m_pEdges[axis][i].m_handle);
+ if (TestAabbAgainstAabb2(aabbMin,aabbMax,handle->m_aabbMin,handle->m_aabbMax))
+ {
+ callback.process(handle);
+ }
+ }
+ }
+ }
+}
+
template <typename BP_FP_INT_TYPE>
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
index b7bbaf512ae..fe414effbfc 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
@@ -26,7 +26,14 @@ class btOverlappingPairCache;
-struct btBroadphaseRayCallback
+struct btBroadphaseAabbCallback
+{
+ virtual ~btBroadphaseAabbCallback() {}
+ virtual bool process(const btBroadphaseProxy* proxy) = 0;
+};
+
+
+struct btBroadphaseRayCallback : public btBroadphaseAabbCallback
{
///added some cached data to accelerate ray-AABB tests
btVector3 m_rayDirectionInverse;
@@ -34,7 +41,6 @@ struct btBroadphaseRayCallback
btScalar m_lambda_max;
virtual ~btBroadphaseRayCallback() {}
- virtual bool process(const btBroadphaseProxy* proxy) = 0;
};
#include "LinearMath/btVector3.h"
@@ -54,6 +60,8 @@ public:
virtual void rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin=btVector3(0,0,0), const btVector3& aabbMax = btVector3(0,0,0)) = 0;
+ virtual void aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback) = 0;
+
///calculateOverlappingPairs is optional: incremental algorithms (sweep and prune) might do it during the set aabb
virtual void calculateOverlappingPairs(btDispatcher* dispatcher)=0;
@@ -65,7 +73,7 @@ public:
virtual void getBroadphaseAabb(btVector3& aabbMin,btVector3& aabbMax) const =0;
///reset broadphase internal structures, to ensure determinism/reproducability
- virtual void resetPool(btDispatcher* dispatcher) {};
+ virtual void resetPool(btDispatcher* dispatcher) { (void) dispatcher; };
virtual void printStats() = 0;
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
index a9f3223798b..62d349739c3 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
@@ -46,6 +46,8 @@ IMPLICIT_CONVEX_SHAPES_START_HERE,
UNIFORM_SCALING_SHAPE_PROXYTYPE,
MINKOWSKI_SUM_SHAPE_PROXYTYPE,
MINKOWSKI_DIFFERENCE_SHAPE_PROXYTYPE,
+ BOX_2D_SHAPE_PROXYTYPE,
+ CONVEX_2D_SHAPE_PROXYTYPE,
CUSTOM_CONVEX_SHAPE_TYPE,
//concave shapes
CONCAVE_SHAPES_START_HERE,
@@ -139,6 +141,11 @@ BT_DECLARE_ALIGNED_ALLOCATOR();
return (proxyType < CONCAVE_SHAPES_START_HERE);
}
+ static SIMD_FORCE_INLINE bool isNonMoving(int proxyType)
+ {
+ return (isConcave(proxyType) && !(proxyType==GIMPACT_SHAPE_PROXYTYPE));
+ }
+
static SIMD_FORCE_INLINE bool isConcave(int proxyType)
{
return ((proxyType > CONCAVE_SHAPES_START_HERE) &&
@@ -148,14 +155,22 @@ BT_DECLARE_ALIGNED_ALLOCATOR();
{
return (proxyType == COMPOUND_SHAPE_PROXYTYPE);
}
+
+ static SIMD_FORCE_INLINE bool isSoftBody(int proxyType)
+ {
+ return (proxyType == SOFTBODY_SHAPE_PROXYTYPE);
+ }
+
static SIMD_FORCE_INLINE bool isInfinite(int proxyType)
{
return (proxyType == STATIC_PLANE_PROXYTYPE);
}
- static SIMD_FORCE_INLINE bool isSoftBody(int proxyType)
+
+ static SIMD_FORCE_INLINE bool isConvex2d(int proxyType)
{
- return (proxyType == SOFTBODY_SHAPE_PROXYTYPE);
+ return (proxyType == BOX_2D_SHAPE_PROXYTYPE) || (proxyType == CONVEX_2D_SHAPE_PROXYTYPE);
}
+
}
;
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h
index 1618ad9fdd3..0d8bca41c8e 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h
@@ -44,7 +44,7 @@ struct btCollisionAlgorithmConstructionInfo
btDispatcher* m_dispatcher1;
btPersistentManifold* m_manifold;
- int getDispatcherId();
+// int getDispatcherId();
};
@@ -59,7 +59,7 @@ protected:
btDispatcher* m_dispatcher;
protected:
- int getDispatcherId();
+// int getDispatcherId();
public:
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.cpp b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.cpp
index a6e36b47049..95443af5070 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.cpp
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.cpp
@@ -61,7 +61,7 @@ static void getmaxdepth(const btDbvtNode* node,int depth,int& maxdepth)
if(node->isinternal())
{
getmaxdepth(node->childs[0],depth+1,maxdepth);
- getmaxdepth(node->childs[0],depth+1,maxdepth);
+ getmaxdepth(node->childs[1],depth+1,maxdepth);
} else maxdepth=btMax(maxdepth,depth);
}
@@ -238,7 +238,7 @@ static void split( const tNodeArray& leaves,
right.resize(0);
for(int i=0,ni=leaves.size();i<ni;++i)
{
- if(dot(axis,leaves[i]->volume.Center()-org)<0)
+ if(btDot(axis,leaves[i]->volume.Center()-org)<0)
left.push_back(leaves[i]);
else
right.push_back(leaves[i]);
@@ -319,7 +319,7 @@ static btDbvtNode* topdown(btDbvt* pdbvt,
const btVector3 x=leaves[i]->volume.Center()-org;
for(int j=0;j<3;++j)
{
- ++splitcount[j][dot(x,axis[j])>0?1:0];
+ ++splitcount[j][btDot(x,axis[j])>0?1:0];
}
}
for( i=0;i<3;++i)
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h
index d3cf1e75039..2bb8ef5d2a7 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvt.h
@@ -32,7 +32,7 @@ subject to the following restrictions:
#define DBVT_IMPL_SSE 1 // SSE
// Template implementation of ICollide
-#ifdef WIN32
+#ifdef _WIN32
#if (defined (_MSC_VER) && _MSC_VER >= 1400)
#define DBVT_USE_TEMPLATE 1
#else
@@ -57,7 +57,7 @@ subject to the following restrictions:
// Specific methods implementation
//SSE gives errors on a MSVC 7.1
-#ifdef BT_USE_SSE
+#if defined (BT_USE_SSE) && defined (_WIN32)
#define DBVT_SELECT_IMPL DBVT_IMPL_SSE
#define DBVT_MERGE_IMPL DBVT_IMPL_SSE
#define DBVT_INT0_IMPL DBVT_IMPL_SSE
@@ -92,7 +92,7 @@ subject to the following restrictions:
#endif
#if DBVT_USE_MEMMOVE
-#ifndef __CELLOS_LV2__
+#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__)
#include <memory.h>
#endif
#include <string.h>
@@ -484,8 +484,8 @@ DBVT_INLINE int btDbvtAabbMm::Classify(const btVector3& n,btScalar o,int s) con
case (1+2+4): px=btVector3(mx.x(),mx.y(),mx.z());
pi=btVector3(mi.x(),mi.y(),mi.z());break;
}
- if((dot(n,px)+o)<0) return(-1);
- if((dot(n,pi)+o)>=0) return(+1);
+ if((btDot(n,px)+o)<0) return(-1);
+ if((btDot(n,pi)+o)>=0) return(+1);
return(0);
}
@@ -496,7 +496,7 @@ DBVT_INLINE btScalar btDbvtAabbMm::ProjectMinimum(const btVector3& v,unsigned si
const btVector3 p( b[(signs>>0)&1]->x(),
b[(signs>>1)&1]->y(),
b[(signs>>2)&1]->z());
- return(dot(p,v));
+ return(btDot(p,v));
}
//
@@ -947,6 +947,7 @@ inline void btDbvt::rayTestInternal( const btDbvtNode* root,
const btVector3& aabbMax,
DBVT_IPOLICY) const
{
+ (void) rayTo;
DBVT_CHECKTYPE
if(root)
{
@@ -961,8 +962,8 @@ inline void btDbvt::rayTestInternal( const btDbvtNode* root,
do
{
const btDbvtNode* node=stack[--depth];
- bounds[0] = node->volume.Mins()+aabbMin;
- bounds[1] = node->volume.Maxs()+aabbMax;
+ bounds[0] = node->volume.Mins()-aabbMax;
+ bounds[1] = node->volume.Maxs()-aabbMin;
btScalar tmin=1.f,lambda_min=0.f;
unsigned int result1=false;
result1 = btRayAabb2(rayFrom,rayDirectionInverse,signs,bounds,tmin,lambda_min,lambda_max);
@@ -1000,11 +1001,11 @@ inline void btDbvt::rayTest( const btDbvtNode* root,
btVector3 rayDir = (rayTo-rayFrom);
rayDir.normalize ();
- ///what about division by zero? --> just set rayDirection[i] to INF/1e30
+ ///what about division by zero? --> just set rayDirection[i] to INF/BT_LARGE_FLOAT
btVector3 rayDirectionInverse;
- rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[0];
- rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[1];
- rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[2];
+ rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[0];
+ rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[1];
+ rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[2];
unsigned int signs[3] = { rayDirectionInverse[0] < 0.0, rayDirectionInverse[1] < 0.0, rayDirectionInverse[2] < 0.0};
btScalar lambda_max = rayDir.dot(rayTo-rayFrom);
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp
index f231717af17..75cfac64368 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2007 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -12,6 +12,7 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
+
///btDbvtBroadphase implementation by Nathanael Presson
#include "btDbvtBroadphase.h"
@@ -123,7 +124,7 @@ btDbvtBroadphase::btDbvtBroadphase(btOverlappingPairCache* paircache)
m_deferedcollide = false;
m_needcleanup = true;
m_releasepaircache = (paircache!=0)?false:true;
- m_prediction = 1/(btScalar)2;
+ m_prediction = 0;
m_stageCurrent = 0;
m_fixedleft = 0;
m_fupdates = 1;
@@ -249,6 +250,34 @@ void btDbvtBroadphase::rayTest(const btVector3& rayFrom,const btVector3& rayTo,
}
+
+struct BroadphaseAabbTester : btDbvt::ICollide
+{
+ btBroadphaseAabbCallback& m_aabbCallback;
+ BroadphaseAabbTester(btBroadphaseAabbCallback& orgCallback)
+ :m_aabbCallback(orgCallback)
+ {
+ }
+ void Process(const btDbvtNode* leaf)
+ {
+ btDbvtProxy* proxy=(btDbvtProxy*)leaf->data;
+ m_aabbCallback.process(proxy);
+ }
+};
+
+void btDbvtBroadphase::aabbTest(const btVector3& aabbMin,const btVector3& aabbMax,btBroadphaseAabbCallback& aabbCallback)
+{
+ BroadphaseAabbTester callback(aabbCallback);
+
+ const ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds=btDbvtVolume::FromMM(aabbMin,aabbMax);
+ //process all children, that overlap with the given AABB bounds
+ m_sets[0].collideTV(m_sets[0].m_root,bounds,callback);
+ m_sets[1].collideTV(m_sets[1].m_root,bounds,callback);
+
+}
+
+
+
//
void btDbvtBroadphase::setAabb( btBroadphaseProxy* absproxy,
const btVector3& aabbMin,
@@ -316,6 +345,47 @@ void btDbvtBroadphase::setAabb( btBroadphaseProxy* absproxy,
}
}
+
+//
+void btDbvtBroadphase::setAabbForceUpdate( btBroadphaseProxy* absproxy,
+ const btVector3& aabbMin,
+ const btVector3& aabbMax,
+ btDispatcher* /*dispatcher*/)
+{
+ btDbvtProxy* proxy=(btDbvtProxy*)absproxy;
+ ATTRIBUTE_ALIGNED16(btDbvtVolume) aabb=btDbvtVolume::FromMM(aabbMin,aabbMax);
+ bool docollide=false;
+ if(proxy->stage==STAGECOUNT)
+ {/* fixed -> dynamic set */
+ m_sets[1].remove(proxy->leaf);
+ proxy->leaf=m_sets[0].insert(aabb,proxy);
+ docollide=true;
+ }
+ else
+ {/* dynamic set */
+ ++m_updates_call;
+ /* Teleporting */
+ m_sets[0].update(proxy->leaf,aabb);
+ ++m_updates_done;
+ docollide=true;
+ }
+ listremove(proxy,m_stageRoots[proxy->stage]);
+ proxy->m_aabbMin = aabbMin;
+ proxy->m_aabbMax = aabbMax;
+ proxy->stage = m_stageCurrent;
+ listappend(proxy,m_stageRoots[m_stageCurrent]);
+ if(docollide)
+ {
+ m_needcleanup=true;
+ if(!m_deferedcollide)
+ {
+ btDbvtTreeCollider collider(this);
+ m_sets[1].collideTTpersistentStack(m_sets[1].m_root,proxy->leaf,collider);
+ m_sets[0].collideTTpersistentStack(m_sets[0].m_root,proxy->leaf,collider);
+ }
+ }
+}
+
//
void btDbvtBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher)
{
@@ -571,7 +641,6 @@ void btDbvtBroadphase::resetPool(btDispatcher* dispatcher)
m_deferedcollide = false;
m_needcleanup = true;
- m_prediction = 1/(btScalar)2;
m_stageCurrent = 0;
m_fixedleft = 0;
m_fupdates = 1;
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h
index fe70bc39c43..18b64ad0e57 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2007 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -12,6 +12,7 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
+
///btDbvtBroadphase implementation by Nathanael Presson
#ifndef BT_DBVT_BROADPHASE_H
#define BT_DBVT_BROADPHASE_H
@@ -101,26 +102,45 @@ struct btDbvtBroadphase : btBroadphaseInterface
~btDbvtBroadphase();
void collide(btDispatcher* dispatcher);
void optimize();
- /* btBroadphaseInterface Implementation */
+
+ /* btBroadphaseInterface Implementation */
btBroadphaseProxy* createProxy(const btVector3& aabbMin,const btVector3& aabbMax,int shapeType,void* userPtr,short int collisionFilterGroup,short int collisionFilterMask,btDispatcher* dispatcher,void* multiSapProxy);
- void destroyProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher);
- void setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,const btVector3& aabbMax,btDispatcher* dispatcher);
- virtual void rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin=btVector3(0,0,0), const btVector3& aabbMax = btVector3(0,0,0));
-
- virtual void getAabb(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const;
- void calculateOverlappingPairs(btDispatcher* dispatcher);
- btOverlappingPairCache* getOverlappingPairCache();
- const btOverlappingPairCache* getOverlappingPairCache() const;
- void getBroadphaseAabb(btVector3& aabbMin,btVector3& aabbMax) const;
- void printStats();
- static void benchmark(btBroadphaseInterface*);
+ virtual void destroyProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher);
+ virtual void setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,const btVector3& aabbMax,btDispatcher* dispatcher);
+ virtual void rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin=btVector3(0,0,0), const btVector3& aabbMax = btVector3(0,0,0));
+ virtual void aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback);
+ virtual void getAabb(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const;
+ virtual void calculateOverlappingPairs(btDispatcher* dispatcher);
+ virtual btOverlappingPairCache* getOverlappingPairCache();
+ virtual const btOverlappingPairCache* getOverlappingPairCache() const;
+ virtual void getBroadphaseAabb(btVector3& aabbMin,btVector3& aabbMax) const;
+ virtual void printStats();
- void performDeferredRemoval(btDispatcher* dispatcher);
///reset broadphase internal structures, to ensure determinism/reproducability
virtual void resetPool(btDispatcher* dispatcher);
+ void performDeferredRemoval(btDispatcher* dispatcher);
+
+ void setVelocityPrediction(btScalar prediction)
+ {
+ m_prediction = prediction;
+ }
+ btScalar getVelocityPrediction() const
+ {
+ return m_prediction;
+ }
+
+ ///this setAabbForceUpdate is similar to setAabb but always forces the aabb update.
+ ///it is not part of the btBroadphaseInterface but specific to btDbvtBroadphase.
+ ///it bypasses certain optimizations that prevent aabb updates (when the aabb shrinks), see
+ ///http://code.google.com/p/bullet/issues/detail?id=223
+ void setAabbForceUpdate( btBroadphaseProxy* absproxy,const btVector3& aabbMin,const btVector3& aabbMax,btDispatcher* /*dispatcher*/);
+
+ static void benchmark(btBroadphaseInterface*);
+
+
};
#endif
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h
index ee57aa96151..8ded0006c3b 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h
@@ -46,8 +46,9 @@ struct btDispatcherInfo
m_enableSPU(true),
m_useEpa(true),
m_allowedCcdPenetration(btScalar(0.04)),
- m_useConvexConservativeDistanceUtil(true),
+ m_useConvexConservativeDistanceUtil(false),
m_convexConservativeDistanceThreshold(0.0f),
+ m_convexMaxDistanceUseCPT(false),
m_stackAllocator(0)
{
@@ -64,6 +65,7 @@ struct btDispatcherInfo
btScalar m_allowedCcdPenetration;
bool m_useConvexConservativeDistanceUtil;
btScalar m_convexConservativeDistanceThreshold;
+ bool m_convexMaxDistanceUseCPT;
btStackAlloc* m_stackAllocator;
};
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.h
index 91c504eee22..7bcfe6b132a 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.h
@@ -133,8 +133,8 @@ public:
///will add some transform later
virtual void getBroadphaseAabb(btVector3& aabbMin,btVector3& aabbMax) const
{
- aabbMin.setValue(-1e30f,-1e30f,-1e30f);
- aabbMax.setValue(1e30f,1e30f,1e30f);
+ aabbMin.setValue(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT);
+ aabbMax.setValue(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT);
}
void buildTree(const btVector3& bvhAabbMin,const btVector3& bvhAabbMax);
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
index b209bcb9a20..041bbe05ae2 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
@@ -240,7 +240,7 @@ btBroadphasePair* btHashedOverlappingPairCache::internalAddPair(btBroadphaseProx
}*/
int count = m_overlappingPairArray.size();
int oldCapacity = m_overlappingPairArray.capacity();
- void* mem = &m_overlappingPairArray.expand();
+ void* mem = &m_overlappingPairArray.expandNonInitializing();
//this is where we add an actual pair, so also call the 'ghost'
if (m_ghostPairCallback)
@@ -467,7 +467,7 @@ btBroadphasePair* btSortedOverlappingPairCache::addOverlappingPair(btBroadphaseP
if (!needsBroadphaseCollision(proxy0,proxy1))
return 0;
- void* mem = &m_overlappingPairArray.expand();
+ void* mem = &m_overlappingPairArray.expandNonInitializing();
btBroadphasePair* pair = new (mem) btBroadphasePair(*proxy0,*proxy1);
gOverlappingPairs++;
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
index eda45c47b5b..3945afb8d70 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
@@ -457,6 +457,7 @@ public:
virtual void sortOverlappingPairs(btDispatcher* dispatcher)
{
+ (void) dispatcher;
}
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp
index 8bef8f0d43e..c911435a946 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp
@@ -17,6 +17,7 @@ subject to the following restrictions:
#include "LinearMath/btAabbUtil2.h"
#include "LinearMath/btIDebugDraw.h"
+#include "LinearMath/btSerializer.h"
#define RAYAABB2
@@ -78,10 +79,10 @@ void btQuantizedBvh::buildInternal()
#ifdef DEBUG_PATCH_COLORS
btVector3 color[4]=
{
- btVector3(255,0,0),
- btVector3(0,255,0),
- btVector3(0,0,255),
- btVector3(0,255,255)
+ btVector3(1,0,0),
+ btVector3(0,1,0),
+ btVector3(0,0,1),
+ btVector3(0,1,1)
};
#endif //DEBUG_PATCH_COLORS
@@ -474,9 +475,9 @@ void btQuantizedBvh::walkStacklessTreeAgainstRay(btNodeOverlapCallback* nodeCall
lambda_max = rayDir.dot(rayTarget-raySource);
///what about division by zero? --> just set rayDirection[i] to 1.0
btVector3 rayDirectionInverse;
- rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[0];
- rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[1];
- rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[2];
+ rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[0];
+ rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[1];
+ rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[2];
unsigned int sign[3] = { rayDirectionInverse[0] < 0.0, rayDirectionInverse[1] < 0.0, rayDirectionInverse[2] < 0.0};
#endif
@@ -493,8 +494,8 @@ void btQuantizedBvh::walkStacklessTreeAgainstRay(btNodeOverlapCallback* nodeCall
bounds[0] = rootNode->m_aabbMinOrg;
bounds[1] = rootNode->m_aabbMaxOrg;
/* Add box cast extents */
- bounds[0] += aabbMin;
- bounds[1] += aabbMax;
+ bounds[0] -= aabbMax;
+ bounds[1] -= aabbMin;
aabbOverlap = TestAabbAgainstAabb2(rayAabbMin,rayAabbMax,rootNode->m_aabbMinOrg,rootNode->m_aabbMaxOrg);
//perhaps profile if it is worth doing the aabbOverlap test first
@@ -561,9 +562,9 @@ void btQuantizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback*
rayDirection.normalize ();
lambda_max = rayDirection.dot(rayTarget-raySource);
///what about division by zero? --> just set rayDirection[i] to 1.0
- rayDirection[0] = rayDirection[0] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDirection[0];
- rayDirection[1] = rayDirection[1] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDirection[1];
- rayDirection[2] = rayDirection[2] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDirection[2];
+ rayDirection[0] = rayDirection[0] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDirection[0];
+ rayDirection[1] = rayDirection[1] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDirection[1];
+ rayDirection[2] = rayDirection[2] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDirection[2];
unsigned int sign[3] = { rayDirection[0] < 0.0, rayDirection[1] < 0.0, rayDirection[2] < 0.0};
#endif
@@ -617,8 +618,8 @@ void btQuantizedBvh::walkStacklessQuantizedTreeAgainstRay(btNodeOverlapCallback*
bounds[0] = unQuantize(rootNode->m_quantizedAabbMin);
bounds[1] = unQuantize(rootNode->m_quantizedAabbMax);
/* Add box cast extents */
- bounds[0] += aabbMin;
- bounds[1] += aabbMax;
+ bounds[0] -= aabbMax;
+ bounds[1] -= aabbMin;
btVector3 normal;
#if 0
bool ra2 = btRayAabb2 (raySource, rayDirection, sign, bounds, param, 0.0, lambda_max);
@@ -830,7 +831,7 @@ unsigned int btQuantizedBvh::getAlignmentSerializationPadding()
return 0;//BVH_ALIGNMENT_BLOCKS * BVH_ALIGNMENT;
}
-unsigned btQuantizedBvh::calculateSerializeBufferSize()
+unsigned btQuantizedBvh::calculateSerializeBufferSize() const
{
unsigned baseSize = sizeof(btQuantizedBvh) + getAlignmentSerializationPadding();
baseSize += sizeof(btBvhSubtreeInfo) * m_subtreeHeaderCount;
@@ -841,7 +842,7 @@ unsigned btQuantizedBvh::calculateSerializeBufferSize()
return baseSize + m_curNodeIndex * sizeof(btOptimizedBvhNode);
}
-bool btQuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBufferSize */, bool i_swapEndian)
+bool btQuantizedBvh::serialize(void *o_alignedDataBuffer, unsigned /*i_dataBufferSize */, bool i_swapEndian) const
{
btAssert(m_subtreeHeaderCount == m_SubtreeHeaders.size());
m_subtreeHeaderCount = m_SubtreeHeaders.size();
@@ -1143,6 +1144,232 @@ m_bulletVersion(BT_BULLET_VERSION)
}
+void btQuantizedBvh::deSerializeFloat(struct btQuantizedBvhFloatData& quantizedBvhFloatData)
+{
+ m_bvhAabbMax.deSerializeFloat(quantizedBvhFloatData.m_bvhAabbMax);
+ m_bvhAabbMin.deSerializeFloat(quantizedBvhFloatData.m_bvhAabbMin);
+ m_bvhQuantization.deSerializeFloat(quantizedBvhFloatData.m_bvhQuantization);
+
+ m_curNodeIndex = quantizedBvhFloatData.m_curNodeIndex;
+ m_useQuantization = quantizedBvhFloatData.m_useQuantization!=0;
+
+ {
+ int numElem = quantizedBvhFloatData.m_numContiguousLeafNodes;
+ m_contiguousNodes.resize(numElem);
+
+ if (numElem)
+ {
+ btOptimizedBvhNodeFloatData* memPtr = quantizedBvhFloatData.m_contiguousNodesPtr;
+
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_contiguousNodes[i].m_aabbMaxOrg.deSerializeFloat(memPtr->m_aabbMaxOrg);
+ m_contiguousNodes[i].m_aabbMinOrg.deSerializeFloat(memPtr->m_aabbMinOrg);
+ m_contiguousNodes[i].m_escapeIndex = memPtr->m_escapeIndex;
+ m_contiguousNodes[i].m_subPart = memPtr->m_subPart;
+ m_contiguousNodes[i].m_triangleIndex = memPtr->m_triangleIndex;
+ }
+ }
+ }
+
+ {
+ int numElem = quantizedBvhFloatData.m_numQuantizedContiguousNodes;
+ m_quantizedContiguousNodes.resize(numElem);
+
+ if (numElem)
+ {
+ btQuantizedBvhNodeData* memPtr = quantizedBvhFloatData.m_quantizedContiguousNodesPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_quantizedContiguousNodes[i].m_escapeIndexOrTriangleIndex = memPtr->m_escapeIndexOrTriangleIndex;
+ m_quantizedContiguousNodes[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0];
+ m_quantizedContiguousNodes[i].m_quantizedAabbMax[1] = memPtr->m_quantizedAabbMax[1];
+ m_quantizedContiguousNodes[i].m_quantizedAabbMax[2] = memPtr->m_quantizedAabbMax[2];
+ m_quantizedContiguousNodes[i].m_quantizedAabbMin[0] = memPtr->m_quantizedAabbMin[0];
+ m_quantizedContiguousNodes[i].m_quantizedAabbMin[1] = memPtr->m_quantizedAabbMin[1];
+ m_quantizedContiguousNodes[i].m_quantizedAabbMin[2] = memPtr->m_quantizedAabbMin[2];
+ }
+ }
+ }
+
+ m_traversalMode = btTraversalMode(quantizedBvhFloatData.m_traversalMode);
+
+ {
+ int numElem = quantizedBvhFloatData.m_numSubtreeHeaders;
+ m_SubtreeHeaders.resize(numElem);
+ if (numElem)
+ {
+ btBvhSubtreeInfoData* memPtr = quantizedBvhFloatData.m_subTreeInfoPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_SubtreeHeaders[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0] ;
+ m_SubtreeHeaders[i].m_quantizedAabbMax[1] = memPtr->m_quantizedAabbMax[1];
+ m_SubtreeHeaders[i].m_quantizedAabbMax[2] = memPtr->m_quantizedAabbMax[2];
+ m_SubtreeHeaders[i].m_quantizedAabbMin[0] = memPtr->m_quantizedAabbMin[0];
+ m_SubtreeHeaders[i].m_quantizedAabbMin[1] = memPtr->m_quantizedAabbMin[1];
+ m_SubtreeHeaders[i].m_quantizedAabbMin[2] = memPtr->m_quantizedAabbMin[2];
+ m_SubtreeHeaders[i].m_rootNodeIndex = memPtr->m_rootNodeIndex;
+ m_SubtreeHeaders[i].m_subtreeSize = memPtr->m_subtreeSize;
+ }
+ }
+ }
+}
+
+void btQuantizedBvh::deSerializeDouble(struct btQuantizedBvhDoubleData& quantizedBvhDoubleData)
+{
+ m_bvhAabbMax.deSerializeDouble(quantizedBvhDoubleData.m_bvhAabbMax);
+ m_bvhAabbMin.deSerializeDouble(quantizedBvhDoubleData.m_bvhAabbMin);
+ m_bvhQuantization.deSerializeDouble(quantizedBvhDoubleData.m_bvhQuantization);
+
+ m_curNodeIndex = quantizedBvhDoubleData.m_curNodeIndex;
+ m_useQuantization = quantizedBvhDoubleData.m_useQuantization!=0;
+
+ {
+ int numElem = quantizedBvhDoubleData.m_numContiguousLeafNodes;
+ m_contiguousNodes.resize(numElem);
+
+ if (numElem)
+ {
+ btOptimizedBvhNodeDoubleData* memPtr = quantizedBvhDoubleData.m_contiguousNodesPtr;
+
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_contiguousNodes[i].m_aabbMaxOrg.deSerializeDouble(memPtr->m_aabbMaxOrg);
+ m_contiguousNodes[i].m_aabbMinOrg.deSerializeDouble(memPtr->m_aabbMinOrg);
+ m_contiguousNodes[i].m_escapeIndex = memPtr->m_escapeIndex;
+ m_contiguousNodes[i].m_subPart = memPtr->m_subPart;
+ m_contiguousNodes[i].m_triangleIndex = memPtr->m_triangleIndex;
+ }
+ }
+ }
+
+ {
+ int numElem = quantizedBvhDoubleData.m_numQuantizedContiguousNodes;
+ m_quantizedContiguousNodes.resize(numElem);
+
+ if (numElem)
+ {
+ btQuantizedBvhNodeData* memPtr = quantizedBvhDoubleData.m_quantizedContiguousNodesPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_quantizedContiguousNodes[i].m_escapeIndexOrTriangleIndex = memPtr->m_escapeIndexOrTriangleIndex;
+ m_quantizedContiguousNodes[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0];
+ m_quantizedContiguousNodes[i].m_quantizedAabbMax[1] = memPtr->m_quantizedAabbMax[1];
+ m_quantizedContiguousNodes[i].m_quantizedAabbMax[2] = memPtr->m_quantizedAabbMax[2];
+ m_quantizedContiguousNodes[i].m_quantizedAabbMin[0] = memPtr->m_quantizedAabbMin[0];
+ m_quantizedContiguousNodes[i].m_quantizedAabbMin[1] = memPtr->m_quantizedAabbMin[1];
+ m_quantizedContiguousNodes[i].m_quantizedAabbMin[2] = memPtr->m_quantizedAabbMin[2];
+ }
+ }
+ }
+
+ m_traversalMode = btTraversalMode(quantizedBvhDoubleData.m_traversalMode);
+
+ {
+ int numElem = quantizedBvhDoubleData.m_numSubtreeHeaders;
+ m_SubtreeHeaders.resize(numElem);
+ if (numElem)
+ {
+ btBvhSubtreeInfoData* memPtr = quantizedBvhDoubleData.m_subTreeInfoPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_SubtreeHeaders[i].m_quantizedAabbMax[0] = memPtr->m_quantizedAabbMax[0] ;
+ m_SubtreeHeaders[i].m_quantizedAabbMax[1] = memPtr->m_quantizedAabbMax[1];
+ m_SubtreeHeaders[i].m_quantizedAabbMax[2] = memPtr->m_quantizedAabbMax[2];
+ m_SubtreeHeaders[i].m_quantizedAabbMin[0] = memPtr->m_quantizedAabbMin[0];
+ m_SubtreeHeaders[i].m_quantizedAabbMin[1] = memPtr->m_quantizedAabbMin[1];
+ m_SubtreeHeaders[i].m_quantizedAabbMin[2] = memPtr->m_quantizedAabbMin[2];
+ m_SubtreeHeaders[i].m_rootNodeIndex = memPtr->m_rootNodeIndex;
+ m_SubtreeHeaders[i].m_subtreeSize = memPtr->m_subtreeSize;
+ }
+ }
+ }
+
+}
+
+
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btQuantizedBvh::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btQuantizedBvhData* quantizedData = (btQuantizedBvhData*)dataBuffer;
+
+ m_bvhAabbMax.serialize(quantizedData->m_bvhAabbMax);
+ m_bvhAabbMin.serialize(quantizedData->m_bvhAabbMin);
+ m_bvhQuantization.serialize(quantizedData->m_bvhQuantization);
+
+ quantizedData->m_curNodeIndex = m_curNodeIndex;
+ quantizedData->m_useQuantization = m_useQuantization;
+
+ quantizedData->m_numContiguousLeafNodes = m_contiguousNodes.size();
+ quantizedData->m_contiguousNodesPtr = (btOptimizedBvhNodeData*) (m_contiguousNodes.size() ? serializer->getUniquePointer((void*)&m_contiguousNodes[0]) : 0);
+ if (quantizedData->m_contiguousNodesPtr)
+ {
+ int sz = sizeof(btOptimizedBvhNodeData);
+ int numElem = m_contiguousNodes.size();
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ btOptimizedBvhNodeData* memPtr = (btOptimizedBvhNodeData*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_contiguousNodes[i].m_aabbMaxOrg.serialize(memPtr->m_aabbMaxOrg);
+ m_contiguousNodes[i].m_aabbMinOrg.serialize(memPtr->m_aabbMinOrg);
+ memPtr->m_escapeIndex = m_contiguousNodes[i].m_escapeIndex;
+ memPtr->m_subPart = m_contiguousNodes[i].m_subPart;
+ memPtr->m_triangleIndex = m_contiguousNodes[i].m_triangleIndex;
+ }
+ serializer->finalizeChunk(chunk,"btOptimizedBvhNodeData",BT_ARRAY_CODE,(void*)&m_contiguousNodes[0]);
+ }
+
+ quantizedData->m_numQuantizedContiguousNodes = m_quantizedContiguousNodes.size();
+// printf("quantizedData->m_numQuantizedContiguousNodes=%d\n",quantizedData->m_numQuantizedContiguousNodes);
+ quantizedData->m_quantizedContiguousNodesPtr =(btQuantizedBvhNodeData*) (m_quantizedContiguousNodes.size() ? serializer->getUniquePointer((void*)&m_quantizedContiguousNodes[0]) : 0);
+ if (quantizedData->m_quantizedContiguousNodesPtr)
+ {
+ int sz = sizeof(btQuantizedBvhNodeData);
+ int numElem = m_quantizedContiguousNodes.size();
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ btQuantizedBvhNodeData* memPtr = (btQuantizedBvhNodeData*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ memPtr->m_escapeIndexOrTriangleIndex = m_quantizedContiguousNodes[i].m_escapeIndexOrTriangleIndex;
+ memPtr->m_quantizedAabbMax[0] = m_quantizedContiguousNodes[i].m_quantizedAabbMax[0];
+ memPtr->m_quantizedAabbMax[1] = m_quantizedContiguousNodes[i].m_quantizedAabbMax[1];
+ memPtr->m_quantizedAabbMax[2] = m_quantizedContiguousNodes[i].m_quantizedAabbMax[2];
+ memPtr->m_quantizedAabbMin[0] = m_quantizedContiguousNodes[i].m_quantizedAabbMin[0];
+ memPtr->m_quantizedAabbMin[1] = m_quantizedContiguousNodes[i].m_quantizedAabbMin[1];
+ memPtr->m_quantizedAabbMin[2] = m_quantizedContiguousNodes[i].m_quantizedAabbMin[2];
+ }
+ serializer->finalizeChunk(chunk,"btQuantizedBvhNodeData",BT_ARRAY_CODE,(void*)&m_quantizedContiguousNodes[0]);
+ }
+
+ quantizedData->m_traversalMode = int(m_traversalMode);
+ quantizedData->m_numSubtreeHeaders = m_SubtreeHeaders.size();
+
+ quantizedData->m_subTreeInfoPtr = (btBvhSubtreeInfoData*) (m_SubtreeHeaders.size() ? serializer->getUniquePointer((void*)&m_SubtreeHeaders[0]) : 0);
+ if (quantizedData->m_subTreeInfoPtr)
+ {
+ int sz = sizeof(btBvhSubtreeInfoData);
+ int numElem = m_SubtreeHeaders.size();
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ btBvhSubtreeInfoData* memPtr = (btBvhSubtreeInfoData*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ memPtr->m_quantizedAabbMax[0] = m_SubtreeHeaders[i].m_quantizedAabbMax[0];
+ memPtr->m_quantizedAabbMax[1] = m_SubtreeHeaders[i].m_quantizedAabbMax[1];
+ memPtr->m_quantizedAabbMax[2] = m_SubtreeHeaders[i].m_quantizedAabbMax[2];
+ memPtr->m_quantizedAabbMin[0] = m_SubtreeHeaders[i].m_quantizedAabbMin[0];
+ memPtr->m_quantizedAabbMin[1] = m_SubtreeHeaders[i].m_quantizedAabbMin[1];
+ memPtr->m_quantizedAabbMin[2] = m_SubtreeHeaders[i].m_quantizedAabbMin[2];
+
+ memPtr->m_rootNodeIndex = m_SubtreeHeaders[i].m_rootNodeIndex;
+ memPtr->m_subtreeSize = m_SubtreeHeaders[i].m_subtreeSize;
+ }
+ serializer->finalizeChunk(chunk,"btBvhSubtreeInfoData",BT_ARRAY_CODE,(void*)&m_SubtreeHeaders[0]);
+ }
+ return btQuantizedBvhDataName;
+}
+
+
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
index ced457b6036..aa30d43a025 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h
@@ -16,6 +16,8 @@ subject to the following restrictions:
#ifndef QUANTIZED_BVH_H
#define QUANTIZED_BVH_H
+class btSerializer;
+
//#define DEBUG_CHECK_DEQUANTIZATION 1
#ifdef DEBUG_CHECK_DEQUANTIZATION
#ifdef __SPU__
@@ -29,6 +31,17 @@ subject to the following restrictions:
#include "LinearMath/btVector3.h"
#include "LinearMath/btAlignedAllocator.h"
+#ifdef BT_USE_DOUBLE_PRECISION
+#define btQuantizedBvhData btQuantizedBvhDoubleData
+#define btOptimizedBvhNodeData btOptimizedBvhNodeDoubleData
+#define btQuantizedBvhDataName "btQuantizedBvhDoubleData"
+#else
+#define btQuantizedBvhData btQuantizedBvhFloatData
+#define btOptimizedBvhNodeData btOptimizedBvhNodeFloatData
+#define btQuantizedBvhDataName "btQuantizedBvhFloatData"
+#endif
+
+
//http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrf__m128.asp
@@ -190,7 +203,7 @@ protected:
BvhSubtreeInfoArray m_SubtreeHeaders;
//This is only used for serialization so we don't have to add serialization directly to btAlignedObjectArray
- int m_subtreeHeaderCount;
+ mutable int m_subtreeHeaderCount;
@@ -443,17 +456,32 @@ public:
return m_SubtreeHeaders;
}
+////////////////////////////////////////////////////////////////////
/////Calculate space needed to store BVH for serialization
- unsigned calculateSerializeBufferSize();
+ unsigned calculateSerializeBufferSize() const;
/// Data buffer MUST be 16 byte aligned
- virtual bool serialize(void *o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian);
+ virtual bool serialize(void *o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const;
///deSerializeInPlace loads and initializes a BVH from a buffer in memory 'in place'
static btQuantizedBvh *deSerializeInPlace(void *i_alignedDataBuffer, unsigned int i_dataBufferSize, bool i_swapEndian);
static unsigned int getAlignmentSerializationPadding();
+//////////////////////////////////////////////////////////////////////
+
+
+ virtual int calculateSerializeBufferSizeNew() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+ virtual void deSerializeFloat(struct btQuantizedBvhFloatData& quantizedBvhFloatData);
+
+ virtual void deSerializeDouble(struct btQuantizedBvhDoubleData& quantizedBvhDoubleData);
+
+
+////////////////////////////////////////////////////////////////////
SIMD_FORCE_INLINE bool isQuantized()
{
@@ -470,4 +498,82 @@ private:
;
+struct btBvhSubtreeInfoData
+{
+ int m_rootNodeIndex;
+ int m_subtreeSize;
+ unsigned short m_quantizedAabbMin[3];
+ unsigned short m_quantizedAabbMax[3];
+};
+
+struct btOptimizedBvhNodeFloatData
+{
+ btVector3FloatData m_aabbMinOrg;
+ btVector3FloatData m_aabbMaxOrg;
+ int m_escapeIndex;
+ int m_subPart;
+ int m_triangleIndex;
+ char m_pad[4];
+};
+
+struct btOptimizedBvhNodeDoubleData
+{
+ btVector3DoubleData m_aabbMinOrg;
+ btVector3DoubleData m_aabbMaxOrg;
+ int m_escapeIndex;
+ int m_subPart;
+ int m_triangleIndex;
+ char m_pad[4];
+};
+
+
+struct btQuantizedBvhNodeData
+{
+ unsigned short m_quantizedAabbMin[3];
+ unsigned short m_quantizedAabbMax[3];
+ int m_escapeIndexOrTriangleIndex;
+};
+
+struct btQuantizedBvhFloatData
+{
+ btVector3FloatData m_bvhAabbMin;
+ btVector3FloatData m_bvhAabbMax;
+ btVector3FloatData m_bvhQuantization;
+ int m_curNodeIndex;
+ int m_useQuantization;
+ int m_numContiguousLeafNodes;
+ int m_numQuantizedContiguousNodes;
+ btOptimizedBvhNodeFloatData *m_contiguousNodesPtr;
+ btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr;
+ btBvhSubtreeInfoData *m_subTreeInfoPtr;
+ int m_traversalMode;
+ int m_numSubtreeHeaders;
+
+};
+
+struct btQuantizedBvhDoubleData
+{
+ btVector3DoubleData m_bvhAabbMin;
+ btVector3DoubleData m_bvhAabbMax;
+ btVector3DoubleData m_bvhQuantization;
+ int m_curNodeIndex;
+ int m_useQuantization;
+ int m_numContiguousLeafNodes;
+ int m_numQuantizedContiguousNodes;
+ btOptimizedBvhNodeDoubleData *m_contiguousNodesPtr;
+ btQuantizedBvhNodeData *m_quantizedContiguousNodesPtr;
+
+ int m_traversalMode;
+ int m_numSubtreeHeaders;
+ btBvhSubtreeInfoData *m_subTreeInfoPtr;
+};
+
+
+SIMD_FORCE_INLINE int btQuantizedBvh::calculateSerializeBufferSizeNew() const
+{
+ return sizeof(btQuantizedBvhData);
+}
+
+
+
#endif //QUANTIZED_BVH_H
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
index caed63db005..752fcd0fef2 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
@@ -20,6 +20,8 @@ subject to the following restrictions:
#include "LinearMath/btVector3.h"
#include "LinearMath/btTransform.h"
#include "LinearMath/btMatrix3x3.h"
+#include "LinearMath/btAabbUtil2.h"
+
#include <new>
extern int gOverlappingPairs;
@@ -166,6 +168,23 @@ void btSimpleBroadphase::rayTest(const btVector3& rayFrom,const btVector3& rayTo
}
+void btSimpleBroadphase::aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback)
+{
+ for (int i=0; i <= m_LastHandleIndex; i++)
+ {
+ btSimpleBroadphaseProxy* proxy = &m_pHandles[i];
+ if(!proxy->m_clientObject)
+ {
+ continue;
+ }
+ if (TestAabbAgainstAabb2(aabbMin,aabbMax,proxy->m_aabbMin,proxy->m_aabbMax))
+ {
+ callback.process(proxy);
+ }
+ }
+}
+
+
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
index cc7613bf6a0..3e7c7ee3b62 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
@@ -136,6 +136,7 @@ public:
virtual void getAabb(btBroadphaseProxy* proxy,btVector3& aabbMin, btVector3& aabbMax ) const;
virtual void rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback, const btVector3& aabbMin=btVector3(0,0,0),const btVector3& aabbMax=btVector3(0,0,0));
+ virtual void aabbTest(const btVector3& aabbMin, const btVector3& aabbMax, btBroadphaseAabbCallback& callback);
btOverlappingPairCache* getOverlappingPairCache()
{
@@ -153,8 +154,8 @@ public:
///will add some transform later
virtual void getBroadphaseAabb(btVector3& aabbMin,btVector3& aabbMax) const
{
- aabbMin.setValue(-1e30f,-1e30f,-1e30f);
- aabbMax.setValue(1e30f,1e30f,1e30f);
+ aabbMin.setValue(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT);
+ aabbMax.setValue(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT);
}
virtual void printStats()
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
index 9a749a03793..23a5c7526b4 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
@@ -37,7 +37,7 @@ void SphereTriangleDetector::getClosestPoints(const ClosestPointInput& input,Res
btVector3 point,normal;
btScalar timeOfImpact = btScalar(1.);
btScalar depth = btScalar(0.);
-// output.m_distance = btScalar(1e30);
+// output.m_distance = btScalar(BT_LARGE_FLOAT);
//move sphere into triangle space
btTransform sphereInTr = transformB.inverseTimes(transformA);
@@ -57,8 +57,6 @@ void SphereTriangleDetector::getClosestPoints(const ClosestPointInput& input,Res
}
-#define MAX_OVERLAP btScalar(0.)
-
// See also geometrictools.com
@@ -93,48 +91,39 @@ bool SphereTriangleDetector::facecontains(const btVector3 &p,const btVector3* ve
return pointInTriangle(vertices, lnormal, &lp);
}
-///combined discrete/continuous sphere-triangle
bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &point, btVector3& resultNormal, btScalar& depth, btScalar &timeOfImpact, btScalar contactBreakingThreshold)
{
const btVector3* vertices = &m_triangle->getVertexPtr(0);
- const btVector3& c = sphereCenter;
- btScalar r = m_sphere->getRadius();
-
- btVector3 delta (0,0,0);
+
+ btScalar radius = m_sphere->getRadius();
+ btScalar radiusWithThreshold = radius + contactBreakingThreshold;
btVector3 normal = (vertices[1]-vertices[0]).cross(vertices[2]-vertices[0]);
normal.normalize();
- btVector3 p1ToCentre = c - vertices[0];
+ btVector3 p1ToCentre = sphereCenter - vertices[0];
btScalar distanceFromPlane = p1ToCentre.dot(normal);
if (distanceFromPlane < btScalar(0.))
{
//triangle facing the other way
-
distanceFromPlane *= btScalar(-1.);
normal *= btScalar(-1.);
}
- btScalar contactMargin = contactBreakingThreshold;
- bool isInsideContactPlane = distanceFromPlane < r + contactMargin;
- bool isInsideShellPlane = distanceFromPlane < r;
+ bool isInsideContactPlane = distanceFromPlane < radiusWithThreshold;
- btScalar deltaDotNormal = delta.dot(normal);
- if (!isInsideShellPlane && deltaDotNormal >= btScalar(0.0))
- return false;
-
// Check for contact / intersection
bool hasContact = false;
btVector3 contactPoint;
if (isInsideContactPlane) {
- if (facecontains(c,vertices,normal)) {
+ if (facecontains(sphereCenter,vertices,normal)) {
// Inside the contact wedge - touches a point on the shell plane
hasContact = true;
- contactPoint = c - normal*distanceFromPlane;
+ contactPoint = sphereCenter - normal*distanceFromPlane;
} else {
// Could be inside one of the contact capsules
- btScalar contactCapsuleRadiusSqr = (r + contactMargin) * (r + contactMargin);
+ btScalar contactCapsuleRadiusSqr = radiusWithThreshold*radiusWithThreshold;
btVector3 nearestOnEdge;
for (int i = 0; i < m_triangle->getNumEdges(); i++) {
@@ -143,7 +132,7 @@ bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &po
m_triangle->getEdge(i,pa,pb);
- btScalar distanceSqr = SegmentSqrDistance(pa,pb,c, nearestOnEdge);
+ btScalar distanceSqr = SegmentSqrDistance(pa,pb,sphereCenter, nearestOnEdge);
if (distanceSqr < contactCapsuleRadiusSqr) {
// Yep, we're inside a capsule
hasContact = true;
@@ -155,24 +144,27 @@ bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &po
}
if (hasContact) {
- btVector3 contactToCentre = c - contactPoint;
+ btVector3 contactToCentre = sphereCenter - contactPoint;
btScalar distanceSqr = contactToCentre.length2();
- if (distanceSqr < (r - MAX_OVERLAP)*(r - MAX_OVERLAP)) {
- btScalar distance = btSqrt(distanceSqr);
- resultNormal = contactToCentre;
- resultNormal.normalize();
- point = contactPoint;
- depth = -(r-distance);
+
+ if (distanceSqr < radiusWithThreshold*radiusWithThreshold)
+ {
+ if (distanceSqr>SIMD_EPSILON)
+ {
+ btScalar distance = btSqrt(distanceSqr);
+ resultNormal = contactToCentre;
+ resultNormal.normalize();
+ point = contactPoint;
+ depth = -(radius-distance);
+ } else
+ {
+ btScalar distance = 0.f;
+ resultNormal = normal;
+ point = contactPoint;
+ depth = -radius;
+ }
return true;
}
-
- if (delta.dot(contactToCentre) >= btScalar(0.0))
- return false;
-
- // Moving towards the contact point -> collision
- point = contactPoint;
- timeOfImpact = btScalar(0.0);
- return true;
}
return false;
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
index 981bd54e76c..f656e5c323a 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
@@ -34,9 +34,11 @@ struct SphereTriangleDetector : public btDiscreteCollisionDetectorInterface
virtual ~SphereTriangleDetector() {};
+ bool collide(const btVector3& sphereCenter,btVector3 &point, btVector3& resultNormal, btScalar& depth, btScalar &timeOfImpact, btScalar contactBreakingThreshold);
+
private:
- bool collide(const btVector3& sphereCenter,btVector3 &point, btVector3& resultNormal, btScalar& depth, btScalar &timeOfImpact, btScalar contactBreakingThreshold);
+
bool pointInTriangle(const btVector3 vertices[], const btVector3 &normal, btVector3 *p );
bool facecontains(const btVector3 &p,const btVector3* vertices,btVector3& normal);
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp
new file mode 100644
index 00000000000..2182d0d7e49
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp
@@ -0,0 +1,435 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+* The b2CollidePolygons routines are Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+///btBox2dBox2dCollisionAlgorithm, with modified b2CollidePolygons routines from the Box2D library.
+///The modifications include: switching from b2Vec to btVector3, redefinition of b2Dot, b2Cross
+
+#include "btBox2dBox2dCollisionAlgorithm.h"
+#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
+#include "BulletCollision/CollisionShapes/btBoxShape.h"
+#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
+#include "BulletCollision/CollisionDispatch/btBoxBoxDetector.h"
+#include "BulletCollision/CollisionShapes/btBox2dShape.h"
+
+#define USE_PERSISTENT_CONTACTS 1
+
+btBox2dBox2dCollisionAlgorithm::btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* obj0,btCollisionObject* obj1)
+: btActivatingCollisionAlgorithm(ci,obj0,obj1),
+m_ownManifold(false),
+m_manifoldPtr(mf)
+{
+ if (!m_manifoldPtr && m_dispatcher->needsCollision(obj0,obj1))
+ {
+ m_manifoldPtr = m_dispatcher->getNewManifold(obj0,obj1);
+ m_ownManifold = true;
+ }
+}
+
+btBox2dBox2dCollisionAlgorithm::~btBox2dBox2dCollisionAlgorithm()
+{
+
+ if (m_ownManifold)
+ {
+ if (m_manifoldPtr)
+ m_dispatcher->releaseManifold(m_manifoldPtr);
+ }
+
+}
+
+
+void b2CollidePolygons(btManifoldResult* manifold, const btBox2dShape* polyA, const btTransform& xfA, const btBox2dShape* polyB, const btTransform& xfB);
+
+//#include <stdio.h>
+void btBox2dBox2dCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+{
+ if (!m_manifoldPtr)
+ return;
+
+ btCollisionObject* col0 = body0;
+ btCollisionObject* col1 = body1;
+ btBox2dShape* box0 = (btBox2dShape*)col0->getCollisionShape();
+ btBox2dShape* box1 = (btBox2dShape*)col1->getCollisionShape();
+
+ resultOut->setPersistentManifold(m_manifoldPtr);
+
+ b2CollidePolygons(resultOut,box0,col0->getWorldTransform(),box1,col1->getWorldTransform());
+
+ // refreshContactPoints is only necessary when using persistent contact points. otherwise all points are newly added
+ if (m_ownManifold)
+ {
+ resultOut->refreshContactPoints();
+ }
+
+}
+
+btScalar btBox2dBox2dCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* /*body0*/,btCollisionObject* /*body1*/,const btDispatcherInfo& /*dispatchInfo*/,btManifoldResult* /*resultOut*/)
+{
+ //not yet
+ return 1.f;
+}
+
+
+struct ClipVertex
+{
+ btVector3 v;
+ int id;
+ //b2ContactID id;
+ //b2ContactID id;
+};
+
+#define b2Dot(a,b) (a).dot(b)
+#define b2Mul(a,b) (a)*(b)
+#define b2MulT(a,b) (a).transpose()*(b)
+#define b2Cross(a,b) (a).cross(b)
+#define btCrossS(a,s) btVector3(s * a.getY(), -s * a.getX(),0.f)
+
+int b2_maxManifoldPoints =2;
+
+static int ClipSegmentToLine(ClipVertex vOut[2], ClipVertex vIn[2],
+ const btVector3& normal, btScalar offset)
+{
+ // Start with no output points
+ int numOut = 0;
+
+ // Calculate the distance of end points to the line
+ btScalar distance0 = b2Dot(normal, vIn[0].v) - offset;
+ btScalar distance1 = b2Dot(normal, vIn[1].v) - offset;
+
+ // If the points are behind the plane
+ if (distance0 <= 0.0f) vOut[numOut++] = vIn[0];
+ if (distance1 <= 0.0f) vOut[numOut++] = vIn[1];
+
+ // If the points are on different sides of the plane
+ if (distance0 * distance1 < 0.0f)
+ {
+ // Find intersection point of edge and plane
+ btScalar interp = distance0 / (distance0 - distance1);
+ vOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v);
+ if (distance0 > 0.0f)
+ {
+ vOut[numOut].id = vIn[0].id;
+ }
+ else
+ {
+ vOut[numOut].id = vIn[1].id;
+ }
+ ++numOut;
+ }
+
+ return numOut;
+}
+
+// Find the separation between poly1 and poly2 for a give edge normal on poly1.
+static btScalar EdgeSeparation(const btBox2dShape* poly1, const btTransform& xf1, int edge1,
+ const btBox2dShape* poly2, const btTransform& xf2)
+{
+ const btVector3* vertices1 = poly1->getVertices();
+ const btVector3* normals1 = poly1->getNormals();
+
+ int count2 = poly2->getVertexCount();
+ const btVector3* vertices2 = poly2->getVertices();
+
+ btAssert(0 <= edge1 && edge1 < poly1->getVertexCount());
+
+ // Convert normal from poly1's frame into poly2's frame.
+ btVector3 normal1World = b2Mul(xf1.getBasis(), normals1[edge1]);
+ btVector3 normal1 = b2MulT(xf2.getBasis(), normal1World);
+
+ // Find support vertex on poly2 for -normal.
+ int index = 0;
+ btScalar minDot = BT_LARGE_FLOAT;
+
+ for (int i = 0; i < count2; ++i)
+ {
+ btScalar dot = b2Dot(vertices2[i], normal1);
+ if (dot < minDot)
+ {
+ minDot = dot;
+ index = i;
+ }
+ }
+
+ btVector3 v1 = b2Mul(xf1, vertices1[edge1]);
+ btVector3 v2 = b2Mul(xf2, vertices2[index]);
+ btScalar separation = b2Dot(v2 - v1, normal1World);
+ return separation;
+}
+
+// Find the max separation between poly1 and poly2 using edge normals from poly1.
+static btScalar FindMaxSeparation(int* edgeIndex,
+ const btBox2dShape* poly1, const btTransform& xf1,
+ const btBox2dShape* poly2, const btTransform& xf2)
+{
+ int count1 = poly1->getVertexCount();
+ const btVector3* normals1 = poly1->getNormals();
+
+ // Vector pointing from the centroid of poly1 to the centroid of poly2.
+ btVector3 d = b2Mul(xf2, poly2->getCentroid()) - b2Mul(xf1, poly1->getCentroid());
+ btVector3 dLocal1 = b2MulT(xf1.getBasis(), d);
+
+ // Find edge normal on poly1 that has the largest projection onto d.
+ int edge = 0;
+ btScalar maxDot = -BT_LARGE_FLOAT;
+ for (int i = 0; i < count1; ++i)
+ {
+ btScalar dot = b2Dot(normals1[i], dLocal1);
+ if (dot > maxDot)
+ {
+ maxDot = dot;
+ edge = i;
+ }
+ }
+
+ // Get the separation for the edge normal.
+ btScalar s = EdgeSeparation(poly1, xf1, edge, poly2, xf2);
+ if (s > 0.0f)
+ {
+ return s;
+ }
+
+ // Check the separation for the previous edge normal.
+ int prevEdge = edge - 1 >= 0 ? edge - 1 : count1 - 1;
+ btScalar sPrev = EdgeSeparation(poly1, xf1, prevEdge, poly2, xf2);
+ if (sPrev > 0.0f)
+ {
+ return sPrev;
+ }
+
+ // Check the separation for the next edge normal.
+ int nextEdge = edge + 1 < count1 ? edge + 1 : 0;
+ btScalar sNext = EdgeSeparation(poly1, xf1, nextEdge, poly2, xf2);
+ if (sNext > 0.0f)
+ {
+ return sNext;
+ }
+
+ // Find the best edge and the search direction.
+ int bestEdge;
+ btScalar bestSeparation;
+ int increment;
+ if (sPrev > s && sPrev > sNext)
+ {
+ increment = -1;
+ bestEdge = prevEdge;
+ bestSeparation = sPrev;
+ }
+ else if (sNext > s)
+ {
+ increment = 1;
+ bestEdge = nextEdge;
+ bestSeparation = sNext;
+ }
+ else
+ {
+ *edgeIndex = edge;
+ return s;
+ }
+
+ // Perform a local search for the best edge normal.
+ for ( ; ; )
+ {
+ if (increment == -1)
+ edge = bestEdge - 1 >= 0 ? bestEdge - 1 : count1 - 1;
+ else
+ edge = bestEdge + 1 < count1 ? bestEdge + 1 : 0;
+
+ s = EdgeSeparation(poly1, xf1, edge, poly2, xf2);
+ if (s > 0.0f)
+ {
+ return s;
+ }
+
+ if (s > bestSeparation)
+ {
+ bestEdge = edge;
+ bestSeparation = s;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ *edgeIndex = bestEdge;
+ return bestSeparation;
+}
+
+static void FindIncidentEdge(ClipVertex c[2],
+ const btBox2dShape* poly1, const btTransform& xf1, int edge1,
+ const btBox2dShape* poly2, const btTransform& xf2)
+{
+ const btVector3* normals1 = poly1->getNormals();
+
+ int count2 = poly2->getVertexCount();
+ const btVector3* vertices2 = poly2->getVertices();
+ const btVector3* normals2 = poly2->getNormals();
+
+ btAssert(0 <= edge1 && edge1 < poly1->getVertexCount());
+
+ // Get the normal of the reference edge in poly2's frame.
+ btVector3 normal1 = b2MulT(xf2.getBasis(), b2Mul(xf1.getBasis(), normals1[edge1]));
+
+ // Find the incident edge on poly2.
+ int index = 0;
+ btScalar minDot = BT_LARGE_FLOAT;
+ for (int i = 0; i < count2; ++i)
+ {
+ btScalar dot = b2Dot(normal1, normals2[i]);
+ if (dot < minDot)
+ {
+ minDot = dot;
+ index = i;
+ }
+ }
+
+ // Build the clip vertices for the incident edge.
+ int i1 = index;
+ int i2 = i1 + 1 < count2 ? i1 + 1 : 0;
+
+ c[0].v = b2Mul(xf2, vertices2[i1]);
+// c[0].id.features.referenceEdge = (unsigned char)edge1;
+// c[0].id.features.incidentEdge = (unsigned char)i1;
+// c[0].id.features.incidentVertex = 0;
+
+ c[1].v = b2Mul(xf2, vertices2[i2]);
+// c[1].id.features.referenceEdge = (unsigned char)edge1;
+// c[1].id.features.incidentEdge = (unsigned char)i2;
+// c[1].id.features.incidentVertex = 1;
+}
+
+// Find edge normal of max separation on A - return if separating axis is found
+// Find edge normal of max separation on B - return if separation axis is found
+// Choose reference edge as min(minA, minB)
+// Find incident edge
+// Clip
+
+// The normal points from 1 to 2
+void b2CollidePolygons(btManifoldResult* manifold,
+ const btBox2dShape* polyA, const btTransform& xfA,
+ const btBox2dShape* polyB, const btTransform& xfB)
+{
+
+ int edgeA = 0;
+ btScalar separationA = FindMaxSeparation(&edgeA, polyA, xfA, polyB, xfB);
+ if (separationA > 0.0f)
+ return;
+
+ int edgeB = 0;
+ btScalar separationB = FindMaxSeparation(&edgeB, polyB, xfB, polyA, xfA);
+ if (separationB > 0.0f)
+ return;
+
+ const btBox2dShape* poly1; // reference poly
+ const btBox2dShape* poly2; // incident poly
+ btTransform xf1, xf2;
+ int edge1; // reference edge
+ unsigned char flip;
+ const btScalar k_relativeTol = 0.98f;
+ const btScalar k_absoluteTol = 0.001f;
+
+ // TODO_ERIN use "radius" of poly for absolute tolerance.
+ if (separationB > k_relativeTol * separationA + k_absoluteTol)
+ {
+ poly1 = polyB;
+ poly2 = polyA;
+ xf1 = xfB;
+ xf2 = xfA;
+ edge1 = edgeB;
+ flip = 1;
+ }
+ else
+ {
+ poly1 = polyA;
+ poly2 = polyB;
+ xf1 = xfA;
+ xf2 = xfB;
+ edge1 = edgeA;
+ flip = 0;
+ }
+
+ ClipVertex incidentEdge[2];
+ FindIncidentEdge(incidentEdge, poly1, xf1, edge1, poly2, xf2);
+
+ int count1 = poly1->getVertexCount();
+ const btVector3* vertices1 = poly1->getVertices();
+
+ btVector3 v11 = vertices1[edge1];
+ btVector3 v12 = edge1 + 1 < count1 ? vertices1[edge1+1] : vertices1[0];
+
+ btVector3 dv = v12 - v11;
+ btVector3 sideNormal = b2Mul(xf1.getBasis(), v12 - v11);
+ sideNormal.normalize();
+ btVector3 frontNormal = btCrossS(sideNormal, 1.0f);
+
+
+ v11 = b2Mul(xf1, v11);
+ v12 = b2Mul(xf1, v12);
+
+ btScalar frontOffset = b2Dot(frontNormal, v11);
+ btScalar sideOffset1 = -b2Dot(sideNormal, v11);
+ btScalar sideOffset2 = b2Dot(sideNormal, v12);
+
+ // Clip incident edge against extruded edge1 side edges.
+ ClipVertex clipPoints1[2];
+ clipPoints1[0].v.setValue(0,0,0);
+ clipPoints1[1].v.setValue(0,0,0);
+
+ ClipVertex clipPoints2[2];
+ clipPoints2[0].v.setValue(0,0,0);
+ clipPoints2[1].v.setValue(0,0,0);
+
+
+ int np;
+
+ // Clip to box side 1
+ np = ClipSegmentToLine(clipPoints1, incidentEdge, -sideNormal, sideOffset1);
+
+ if (np < 2)
+ return;
+
+ // Clip to negative box side 1
+ np = ClipSegmentToLine(clipPoints2, clipPoints1, sideNormal, sideOffset2);
+
+ if (np < 2)
+ {
+ return;
+ }
+
+ // Now clipPoints2 contains the clipped points.
+ btVector3 manifoldNormal = flip ? -frontNormal : frontNormal;
+
+ int pointCount = 0;
+ for (int i = 0; i < b2_maxManifoldPoints; ++i)
+ {
+ btScalar separation = b2Dot(frontNormal, clipPoints2[i].v) - frontOffset;
+
+ if (separation <= 0.0f)
+ {
+
+ //b2ManifoldPoint* cp = manifold->points + pointCount;
+ //btScalar separation = separation;
+ //cp->localPoint1 = b2MulT(xfA, clipPoints2[i].v);
+ //cp->localPoint2 = b2MulT(xfB, clipPoints2[i].v);
+
+ manifold->addContactPoint(-manifoldNormal,clipPoints2[i].v,separation);
+
+// cp->id = clipPoints2[i].id;
+// cp->id.features.flip = flip;
+ ++pointCount;
+ }
+ }
+
+// manifold->pointCount = pointCount;}
+}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h
new file mode 100644
index 00000000000..21342175238
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.h
@@ -0,0 +1,66 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
+#define BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
+
+#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h"
+#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
+#include "BulletCollision/BroadphaseCollision/btDispatcher.h"
+#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h"
+
+class btPersistentManifold;
+
+///box-box collision detection
+class btBox2dBox2dCollisionAlgorithm : public btActivatingCollisionAlgorithm
+{
+ bool m_ownManifold;
+ btPersistentManifold* m_manifoldPtr;
+
+public:
+ btBox2dBox2dCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci)
+ : btActivatingCollisionAlgorithm(ci) {}
+
+ virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+
+ virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+
+ btBox2dBox2dCollisionAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1);
+
+ virtual ~btBox2dBox2dCollisionAlgorithm();
+
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ {
+ if (m_manifoldPtr && m_ownManifold)
+ {
+ manifoldArray.push_back(m_manifoldPtr);
+ }
+ }
+
+
+ struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ {
+ virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
+ {
+ int bbsize = sizeof(btBox2dBox2dCollisionAlgorithm);
+ void* ptr = ci.m_dispatcher1->allocateCollisionAlgorithm(bbsize);
+ return new(ptr) btBox2dBox2dCollisionAlgorithm(0,ci,body0,body1);
+ }
+ };
+
+};
+
+#endif //BOX_2D_BOX_2D__COLLISION_ALGORITHM_H
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp
index d3342c547b5..49628853493 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp
@@ -61,7 +61,7 @@ void btBoxBoxCollisionAlgorithm::processCollision (btCollisionObject* body0,btCo
#endif //USE_PERSISTENT_CONTACTS
btDiscreteCollisionDetectorInterface::ClosestPointInput input;
- input.m_maximumDistanceSquared = 1e30f;
+ input.m_maximumDistanceSquared = BT_LARGE_FLOAT;
input.m_transformA = body0->getWorldTransform();
input.m_transformB = body1->getWorldTransform();
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp
index 31353f1b2c4..a7c8cf140ce 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp
@@ -1,4 +1,3 @@
-
/*
* Box-Box collision detection re-distributed under the ZLib license with permission from Russell L. Smith
* Original version is from Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.
@@ -212,7 +211,7 @@ void cullPoints2 (int n, btScalar p[], int m, int i0, int iret[])
a = 1.f/(btScalar(3.0)*(a+q));
} else
{
- a=1e30f;
+ a=BT_LARGE_FLOAT;
}
cx = a*(cx + q*(p[n*2-2]+p[0]));
cy = a*(cy + q*(p[n*2-1]+p[1]));
@@ -267,7 +266,7 @@ int dBoxBox2 (const btVector3& p1, const dMatrix3 R1,
int maxc, dContactGeom * /*contact*/, int /*skip*/,btDiscreteCollisionDetectorInterface::Result& output)
{
const btScalar fudge_factor = btScalar(1.05);
- btVector3 p,pp,normalC;
+ btVector3 p,pp,normalC(0.f,0.f,0.f);
const btScalar *normalR = 0;
btScalar A[3],B[3],R11,R12,R13,R21,R22,R23,R31,R32,R33,
Q11,Q12,Q13,Q21,Q22,Q23,Q31,Q32,Q33,s,s2,l;
@@ -333,9 +332,9 @@ int dBoxBox2 (const btVector3& p1, const dMatrix3 R1,
#undef TST
#define TST(expr1,expr2,n1,n2,n3,cc) \
s2 = btFabs(expr1) - (expr2); \
- if (s2 > 0) return 0; \
+ if (s2 > SIMD_EPSILON) return 0; \
l = btSqrt((n1)*(n1) + (n2)*(n2) + (n3)*(n3)); \
- if (l > 0) { \
+ if (l > SIMD_EPSILON) { \
s2 /= l; \
if (s2*fudge_factor > s) { \
s = s2; \
@@ -346,6 +345,20 @@ int dBoxBox2 (const btVector3& p1, const dMatrix3 R1,
} \
}
+ btScalar fudge2 (1.0e-5f);
+
+ Q11 += fudge2;
+ Q12 += fudge2;
+ Q13 += fudge2;
+
+ Q21 += fudge2;
+ Q22 += fudge2;
+ Q23 += fudge2;
+
+ Q31 += fudge2;
+ Q32 += fudge2;
+ Q33 += fudge2;
+
// separating axis = u1 x (v1,v2,v3)
TST(pp[2]*R21-pp[1]*R31,(A[1]*Q31+A[2]*Q21+B[1]*Q13+B[2]*Q12),0,-R31,R21,7);
TST(pp[2]*R22-pp[1]*R32,(A[1]*Q32+A[2]*Q22+B[0]*Q13+B[2]*Q11),0,-R32,R22,8);
@@ -424,6 +437,7 @@ int dBoxBox2 (const btVector3& p1, const dMatrix3 R1,
output.addContactPoint(-normal,pointInWorld,-*depth);
#else
output.addContactPoint(-normal,pb,-*depth);
+
#endif //
*return_code = code;
}
@@ -593,21 +607,30 @@ int dBoxBox2 (const btVector3& p1, const dMatrix3 R1,
if (maxc < 1) maxc = 1;
if (cnum <= maxc) {
- // we have less contacts than we need, so we use them all
- for (j=0; j < cnum; j++) {
-
- //AddContactPoint...
-
- //dContactGeom *con = CONTACT(contact,skip*j);
- //for (i=0; i<3; i++) con->pos[i] = point[j*3+i] + pa[i];
- //con->depth = dep[j];
+ if (code<4)
+ {
+ // we have less contacts than we need, so we use them all
+ for (j=0; j < cnum; j++)
+ {
btVector3 pointInWorld;
for (i=0; i<3; i++)
pointInWorld[i] = point[j*3+i] + pa[i];
output.addContactPoint(-normal,pointInWorld,-dep[j]);
}
+ } else
+ {
+ // we have less contacts than we need, so we use them all
+ for (j=0; j < cnum; j++)
+ {
+ btVector3 pointInWorld;
+ for (i=0; i<3; i++)
+ pointInWorld[i] = point[j*3+i] + pa[i]-normal[i]*dep[j];
+ //pointInWorld[i] = point[j*3+i] + pa[i];
+ output.addContactPoint(-normal,pointInWorld,-dep[j]);
+ }
+ }
}
else {
// we have more contacts than are wanted, some of them must be culled.
@@ -632,7 +655,13 @@ int dBoxBox2 (const btVector3& p1, const dMatrix3 R1,
btVector3 posInWorld;
for (i=0; i<3; i++)
posInWorld[i] = point[iret[j]*3+i] + pa[i];
- output.addContactPoint(-normal,posInWorld,-dep[iret[j]]);
+ if (code<4)
+ {
+ output.addContactPoint(-normal,posInWorld,-dep[iret[j]]);
+ } else
+ {
+ output.addContactPoint(-normal,posInWorld-normal*dep[iret[j]],-dep[iret[j]]);
+ }
}
cnum = maxc;
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
index e6ff2130aad..9fed44a19f7 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
@@ -34,9 +34,7 @@ int gNumManifold = 0;
btCollisionDispatcher::btCollisionDispatcher (btCollisionConfiguration* collisionConfiguration):
- m_count(0),
- m_useIslands(true),
- m_staticWarningReported(false),
+m_dispatcherFlags(btCollisionDispatcher::CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD),
m_collisionConfiguration(collisionConfiguration)
{
int i;
@@ -79,9 +77,11 @@ btPersistentManifold* btCollisionDispatcher::getNewManifold(void* b0,void* b1)
btCollisionObject* body0 = (btCollisionObject*)b0;
btCollisionObject* body1 = (btCollisionObject*)b1;
- //test for Bullet 2.74: use a relative contact breaking threshold without clamping against 'gContactBreakingThreshold'
- //btScalar contactBreakingThreshold = btMin(gContactBreakingThreshold,btMin(body0->getCollisionShape()->getContactBreakingThreshold(),body1->getCollisionShape()->getContactBreakingThreshold()));
- btScalar contactBreakingThreshold = btMin(body0->getCollisionShape()->getContactBreakingThreshold(),body1->getCollisionShape()->getContactBreakingThreshold());
+ //optional relative contact breaking threshold, turned on by default (use setDispatcherFlags to switch off feature for improved performance)
+
+ btScalar contactBreakingThreshold = (m_dispatcherFlags & btCollisionDispatcher::CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD) ?
+ btMin(body0->getCollisionShape()->getContactBreakingThreshold(gContactBreakingThreshold) , body1->getCollisionShape()->getContactBreakingThreshold(gContactBreakingThreshold))
+ : gContactBreakingThreshold ;
btScalar contactProcessingThreshold = btMin(body0->getContactProcessingThreshold(),body1->getContactProcessingThreshold());
@@ -169,13 +169,13 @@ bool btCollisionDispatcher::needsCollision(btCollisionObject* body0,btCollisionO
bool needsCollision = true;
#ifdef BT_DEBUG
- if (!m_staticWarningReported)
+ if (!(m_dispatcherFlags & btCollisionDispatcher::CD_STATIC_STATIC_REPORTED))
{
//broadphase filtering already deals with this
if ((body0->isStaticObject() || body0->isKinematicObject()) &&
(body1->isStaticObject() || body1->isKinematicObject()))
{
- m_staticWarningReported = true;
+ m_dispatcherFlags |= btCollisionDispatcher::CD_STATIC_STATIC_REPORTED;
printf("warning btCollisionDispatcher::needsCollision: static-static collision!\n");
}
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h
index a9c9cd414c1..3c4f039504a 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h
@@ -42,14 +42,13 @@ typedef void (*btNearCallback)(btBroadphasePair& collisionPair, btCollisionDispa
///Time of Impact, Closest Points and Penetration Depth.
class btCollisionDispatcher : public btDispatcher
{
- int m_count;
-
- btAlignedObjectArray<btPersistentManifold*> m_manifoldsPtr;
- bool m_useIslands;
+protected:
+
+ int m_dispatcherFlags;
+
+ btAlignedObjectArray<btPersistentManifold*> m_manifoldsPtr;
- bool m_staticWarningReported;
-
btManifoldResult m_defaultManifoldResult;
btNearCallback m_nearCallback;
@@ -59,13 +58,28 @@ class btCollisionDispatcher : public btDispatcher
btPoolAllocator* m_persistentManifoldPoolAllocator;
btCollisionAlgorithmCreateFunc* m_doubleDispatch[MAX_BROADPHASE_COLLISION_TYPES][MAX_BROADPHASE_COLLISION_TYPES];
-
btCollisionConfiguration* m_collisionConfiguration;
public:
+ enum DispatcherFlags
+ {
+ CD_STATIC_STATIC_REPORTED = 1,
+ CD_USE_RELATIVE_CONTACT_BREAKING_THRESHOLD = 2
+ };
+
+ int getDispatcherFlags() const
+ {
+ return m_dispatcherFlags;
+ }
+
+ void setDispatcherFlags(int flags)
+ {
+ m_dispatcherFlags = flags;
+ }
+
///registerCollisionCreateFunc allows registration of custom/alternative collision create functions
void registerCollisionCreateFunc(int proxyType0,int proxyType1, btCollisionAlgorithmCreateFunc* createFunc);
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp
index 285b8f174e4..580ea345860 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp
@@ -15,13 +15,15 @@ subject to the following restrictions:
#include "btCollisionObject.h"
+#include "LinearMath/btSerializer.h"
btCollisionObject::btCollisionObject()
: m_anisotropicFriction(1.f,1.f,1.f),
m_hasAnisotropicFriction(false),
- m_contactProcessingThreshold(0.f),
+ m_contactProcessingThreshold(BT_LARGE_FLOAT),
m_broadphaseHandle(0),
m_collisionShape(0),
+ m_extensionPointer(0),
m_rootCollisionShape(0),
m_collisionFlags(btCollisionObject::CF_STATIC_OBJECT),
m_islandTag1(-1),
@@ -30,14 +32,14 @@ btCollisionObject::btCollisionObject()
m_deactivationTime(btScalar(0.)),
m_friction(btScalar(0.5)),
m_restitution(btScalar(0.)),
- m_userObjectPointer(0),
m_internalType(CO_COLLISION_OBJECT),
+ m_userObjectPointer(0),
m_hitFraction(btScalar(1.)),
m_ccdSweptSphereRadius(btScalar(0.)),
m_ccdMotionThreshold(btScalar(0.)),
m_checkCollideWith(false)
{
-
+ m_worldTransform.setIdentity();
}
btCollisionObject::~btCollisionObject()
@@ -64,5 +66,51 @@ void btCollisionObject::activate(bool forceActivation)
}
}
+const char* btCollisionObject::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btCollisionObjectData* dataOut = (btCollisionObjectData*)dataBuffer;
+ m_worldTransform.serialize(dataOut->m_worldTransform);
+ m_interpolationWorldTransform.serialize(dataOut->m_interpolationWorldTransform);
+ m_interpolationLinearVelocity.serialize(dataOut->m_interpolationLinearVelocity);
+ m_interpolationAngularVelocity.serialize(dataOut->m_interpolationAngularVelocity);
+ m_anisotropicFriction.serialize(dataOut->m_anisotropicFriction);
+ dataOut->m_hasAnisotropicFriction = m_hasAnisotropicFriction;
+ dataOut->m_contactProcessingThreshold = m_contactProcessingThreshold;
+ dataOut->m_broadphaseHandle = 0;
+ dataOut->m_collisionShape = serializer->getUniquePointer(m_collisionShape);
+ dataOut->m_rootCollisionShape = 0;//@todo
+ dataOut->m_collisionFlags = m_collisionFlags;
+ dataOut->m_islandTag1 = m_islandTag1;
+ dataOut->m_companionId = m_companionId;
+ dataOut->m_activationState1 = m_activationState1;
+ dataOut->m_activationState1 = m_activationState1;
+ dataOut->m_deactivationTime = m_deactivationTime;
+ dataOut->m_friction = m_friction;
+ dataOut->m_restitution = m_restitution;
+ dataOut->m_internalType = m_internalType;
+
+ char* name = (char*) serializer->findNameForPointer(this);
+ dataOut->m_name = (char*)serializer->getUniquePointer(name);
+ if (dataOut->m_name)
+ {
+ serializer->serializeName(name);
+ }
+ dataOut->m_hitFraction = m_hitFraction;
+ dataOut->m_ccdSweptSphereRadius = m_ccdSweptSphereRadius;
+ dataOut->m_ccdMotionThreshold = m_ccdMotionThreshold;
+ dataOut->m_ccdMotionThreshold = m_ccdMotionThreshold;
+ dataOut->m_checkCollideWith = m_checkCollideWith;
+
+ return btCollisionObjectDataName;
+}
+
+
+void btCollisionObject::serializeSingleObject(class btSerializer* serializer) const
+{
+ int len = calculateSerializeBufferSize();
+ btChunk* chunk = serializer->allocate(len,1);
+ const char* structType = serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk,structType,BT_COLLISIONOBJECT_CODE,(void*)this);
+}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
index 0d5b7886443..5de829824ff 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
@@ -27,13 +27,21 @@ subject to the following restrictions:
struct btBroadphaseProxy;
class btCollisionShape;
+struct btCollisionShapeData;
#include "LinearMath/btMotionState.h"
#include "LinearMath/btAlignedAllocator.h"
#include "LinearMath/btAlignedObjectArray.h"
-
typedef btAlignedObjectArray<class btCollisionObject*> btCollisionObjectArray;
+#ifdef BT_USE_DOUBLE_PRECISION
+#define btCollisionObjectData btCollisionObjectDoubleData
+#define btCollisionObjectDataName "btCollisionObjectDoubleData"
+#else
+#define btCollisionObjectData btCollisionObjectFloatData
+#define btCollisionObjectDataName "btCollisionObjectFloatData"
+#endif
+
/// btCollisionObject can be used to manage collision detection objects.
/// btCollisionObject maintains all information that is needed for a collision detection: Shape, Transform and AABB proxy.
@@ -53,12 +61,14 @@ protected:
btVector3 m_interpolationLinearVelocity;
btVector3 m_interpolationAngularVelocity;
- btVector3 m_anisotropicFriction;
- bool m_hasAnisotropicFriction;
- btScalar m_contactProcessingThreshold;
+ btVector3 m_anisotropicFriction;
+ int m_hasAnisotropicFriction;
+ btScalar m_contactProcessingThreshold;
btBroadphaseProxy* m_broadphaseHandle;
btCollisionShape* m_collisionShape;
+ ///m_extensionPointer is used by some internal low-level Bullet extensions.
+ void* m_extensionPointer;
///m_rootCollisionShape is temporarily used to store the original collision shape
///The m_collisionShape might be temporarily replaced by a child collision shape during collision detection purposes
@@ -76,13 +86,13 @@ protected:
btScalar m_friction;
btScalar m_restitution;
- ///users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPointer
- void* m_userObjectPointer;
-
///m_internalType is reserved to distinguish Bullet's btCollisionObject, btRigidBody, btSoftBody, btGhostObject etc.
///do not assign your own m_internalType unless you write a new dynamics object class.
int m_internalType;
+ ///users can point to their objects, m_userPointer is not used by Bullet, see setUserPointer/getUserPointer
+ void* m_userObjectPointer;
+
///time of impact calculation
btScalar m_hitFraction;
@@ -93,9 +103,7 @@ protected:
btScalar m_ccdMotionThreshold;
/// If some object should have elaborate collision filtering by sub-classes
- bool m_checkCollideWith;
-
- char m_pad[7];
+ int m_checkCollideWith;
virtual bool checkCollideWithOverride(btCollisionObject* /* co */)
{
@@ -112,18 +120,21 @@ public:
CF_KINEMATIC_OBJECT= 2,
CF_NO_CONTACT_RESPONSE = 4,
CF_CUSTOM_MATERIAL_CALLBACK = 8,//this allows per-triangle material (friction/restitution)
- CF_CHARACTER_OBJECT = 16
+ CF_CHARACTER_OBJECT = 16,
+ CF_DISABLE_VISUALIZE_OBJECT = 32, //disable debug drawing
+ CF_DISABLE_SPU_COLLISION_PROCESSING = 64//disable parallel/SPU processing
};
enum CollisionObjectTypes
{
CO_COLLISION_OBJECT =1,
- CO_RIGID_BODY,
+ CO_RIGID_BODY=2,
///CO_GHOST_OBJECT keeps track of all objects overlapping its AABB and that pass its collision filter
///It is useful for collision sensors, explosion objects, character controller etc.
- CO_GHOST_OBJECT,
- CO_SOFT_BODY,
- CO_HF_FLUID
+ CO_GHOST_OBJECT=4,
+ CO_SOFT_BODY=8,
+ CO_HF_FLUID=16,
+ CO_USER_TYPE=32
};
SIMD_FORCE_INLINE bool mergesSimulationIslands() const
@@ -143,7 +154,7 @@ public:
}
bool hasAnisotropicFriction() const
{
- return m_hasAnisotropicFriction;
+ return m_hasAnisotropicFriction!=0;
}
///the constraint solver can discard solving contacts, if the distance is above this threshold. 0 by default.
@@ -213,6 +224,19 @@ public:
m_collisionShape = collisionShape;
}
+ ///Avoid using this internal API call, the extension pointer is used by some Bullet extensions.
+ ///If you need to store your own user pointer, use 'setUserPointer/getUserPointer' instead.
+ void* internalGetExtensionPointer() const
+ {
+ return m_extensionPointer;
+ }
+ ///Avoid using this internal API call, the extension pointer is used by some Bullet extensions
+ ///If you need to store your own user pointer, use 'setUserPointer/getUserPointer' instead.
+ void internalSetExtensionPointer(void* pointer)
+ {
+ m_extensionPointer = pointer;
+ }
+
SIMD_FORCE_INLINE int getActivationState() const { return m_activationState1;}
void setActivationState(int newState);
@@ -393,7 +417,7 @@ public:
/// Don't do continuous collision detection if the motion (in one step) is less then m_ccdMotionThreshold
void setCcdMotionThreshold(btScalar ccdMotionThreshold)
{
- m_ccdMotionThreshold = ccdMotionThreshold*ccdMotionThreshold;
+ m_ccdMotionThreshold = ccdMotionThreshold;
}
///users can point to their objects, userPointer is not used by Bullet
@@ -416,6 +440,85 @@ public:
return true;
}
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const;
+
+ virtual void serializeSingleObject(class btSerializer* serializer) const;
+
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btCollisionObjectDoubleData
+{
+ void *m_broadphaseHandle;
+ void *m_collisionShape;
+ btCollisionShapeData *m_rootCollisionShape;
+ char *m_name;
+
+ btTransformDoubleData m_worldTransform;
+ btTransformDoubleData m_interpolationWorldTransform;
+ btVector3DoubleData m_interpolationLinearVelocity;
+ btVector3DoubleData m_interpolationAngularVelocity;
+ btVector3DoubleData m_anisotropicFriction;
+ double m_contactProcessingThreshold;
+ double m_deactivationTime;
+ double m_friction;
+ double m_restitution;
+ double m_hitFraction;
+ double m_ccdSweptSphereRadius;
+ double m_ccdMotionThreshold;
+
+ int m_hasAnisotropicFriction;
+ int m_collisionFlags;
+ int m_islandTag1;
+ int m_companionId;
+ int m_activationState1;
+ int m_internalType;
+ int m_checkCollideWith;
+
+ char m_padding[4];
};
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btCollisionObjectFloatData
+{
+ void *m_broadphaseHandle;
+ void *m_collisionShape;
+ btCollisionShapeData *m_rootCollisionShape;
+ char *m_name;
+
+ btTransformFloatData m_worldTransform;
+ btTransformFloatData m_interpolationWorldTransform;
+ btVector3FloatData m_interpolationLinearVelocity;
+ btVector3FloatData m_interpolationAngularVelocity;
+ btVector3FloatData m_anisotropicFriction;
+ float m_contactProcessingThreshold;
+ float m_deactivationTime;
+ float m_friction;
+ float m_restitution;
+ float m_hitFraction;
+ float m_ccdSweptSphereRadius;
+ float m_ccdMotionThreshold;
+
+ int m_hasAnisotropicFriction;
+ int m_collisionFlags;
+ int m_islandTag1;
+ int m_companionId;
+ int m_activationState1;
+ int m_internalType;
+ int m_checkCollideWith;
+};
+
+
+
+SIMD_FORCE_INLINE int btCollisionObject::calculateSerializeBufferSize() const
+{
+ return sizeof(btCollisionObjectData);
+}
+
+
+
#endif //COLLISION_OBJECT_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
index 5c645f82a45..bfe8d4f52fb 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
@@ -26,12 +26,16 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h"
#include "BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h"
#include "BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h"
-
+#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
+#include "BulletCollision/BroadphaseCollision/btDbvt.h"
#include "LinearMath/btAabbUtil2.h"
#include "LinearMath/btQuickprof.h"
#include "LinearMath/btStackAlloc.h"
-#include "BulletSoftBody/btSoftBody.h"
+#include "LinearMath/btSerializer.h"
+
+//#define DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION
+
//#define USE_BRUTEFORCE_RAYBROADPHASE 1
//RECALCULATE_AABB is slower, but benefit is that you don't need to call 'stepSimulation' or 'updateAabbs' before using a rayTest
@@ -43,10 +47,29 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionConfiguration.h"
+///for debug drawing
+
+//for debug rendering
+#include "BulletCollision/CollisionShapes/btBoxShape.h"
+#include "BulletCollision/CollisionShapes/btCapsuleShape.h"
+#include "BulletCollision/CollisionShapes/btCompoundShape.h"
+#include "BulletCollision/CollisionShapes/btConeShape.h"
+#include "BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h"
+#include "BulletCollision/CollisionShapes/btCylinderShape.h"
+#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
+#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h"
+#include "BulletCollision/CollisionShapes/btSphereShape.h"
+#include "BulletCollision/CollisionShapes/btTriangleCallback.h"
+#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h"
+#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h"
+
+
+
btCollisionWorld::btCollisionWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache, btCollisionConfiguration* collisionConfiguration)
:m_dispatcher1(dispatcher),
m_broadphasePairCache(pairCache),
-m_debugDrawer(0)
+m_debugDrawer(0),
+m_forceUpdateAllAabbs(true)
{
m_stackAlloc = collisionConfiguration->getStackAllocator();
m_dispatchInfo.m_stackAllocator = m_stackAlloc;
@@ -89,28 +112,30 @@ btCollisionWorld::~btCollisionWorld()
void btCollisionWorld::addCollisionObject(btCollisionObject* collisionObject,short int collisionFilterGroup,short int collisionFilterMask)
{
+ btAssert(collisionObject);
+
//check that the object isn't already added
- btAssert( m_collisionObjects.findLinearSearch(collisionObject) == m_collisionObjects.size());
+ btAssert( m_collisionObjects.findLinearSearch(collisionObject) == m_collisionObjects.size());
- m_collisionObjects.push_back(collisionObject);
+ m_collisionObjects.push_back(collisionObject);
- //calculate new AABB
- btTransform trans = collisionObject->getWorldTransform();
+ //calculate new AABB
+ btTransform trans = collisionObject->getWorldTransform();
- btVector3 minAabb;
- btVector3 maxAabb;
- collisionObject->getCollisionShape()->getAabb(trans,minAabb,maxAabb);
+ btVector3 minAabb;
+ btVector3 maxAabb;
+ collisionObject->getCollisionShape()->getAabb(trans,minAabb,maxAabb);
- int type = collisionObject->getCollisionShape()->getShapeType();
- collisionObject->setBroadphaseHandle( getBroadphase()->createProxy(
- minAabb,
- maxAabb,
- type,
- collisionObject,
- collisionFilterGroup,
- collisionFilterMask,
- m_dispatcher1,0
- )) ;
+ int type = collisionObject->getCollisionShape()->getShapeType();
+ collisionObject->setBroadphaseHandle( getBroadphase()->createProxy(
+ minAabb,
+ maxAabb,
+ type,
+ collisionObject,
+ collisionFilterGroup,
+ collisionFilterMask,
+ m_dispatcher1,0
+ )) ;
@@ -129,6 +154,16 @@ void btCollisionWorld::updateSingleAabb(btCollisionObject* colObj)
minAabb -= contactThreshold;
maxAabb += contactThreshold;
+ if(getDispatchInfo().m_convexMaxDistanceUseCPT)
+ {
+ btVector3 minAabb2,maxAabb2;
+ colObj->getCollisionShape()->getAabb(colObj->getInterpolationWorldTransform(),minAabb2,maxAabb2);
+ minAabb2 -= contactThreshold;
+ maxAabb2 += contactThreshold;
+ minAabb.setMin(minAabb2);
+ maxAabb.setMax(maxAabb2);
+ }
+
btBroadphaseInterface* bp = (btBroadphaseInterface*)m_broadphasePairCache;
//moving objects should be moderately sized, probably something wrong if not
@@ -163,7 +198,7 @@ void btCollisionWorld::updateAabbs()
btCollisionObject* colObj = m_collisionObjects[i];
//only update aabb of active objects
- if (colObj->isActive())
+ if (m_forceUpdateAllAabbs || colObj->isActive())
{
updateSingleAabb(colObj);
}
@@ -226,10 +261,10 @@ void btCollisionWorld::removeCollisionObject(btCollisionObject* collisionObject)
void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans,
- btCollisionObject* collisionObject,
- const btCollisionShape* collisionShape,
- const btTransform& colObjWorldTransform,
- RayResultCallback& resultCallback)
+ btCollisionObject* collisionObject,
+ const btCollisionShape* collisionShape,
+ const btTransform& colObjWorldTransform,
+ RayResultCallback& resultCallback)
{
btSphereShape pointShape(btScalar(0.0));
pointShape.setMargin(0.f);
@@ -237,7 +272,7 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
if (collisionShape->isConvex())
{
-// BT_PROFILE("rayTestConvex");
+ // BT_PROFILE("rayTestConvex");
btConvexCast::CastResult castResult;
castResult.m_fraction = resultCallback.m_closestHitFraction;
@@ -266,10 +301,10 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
castResult.m_normal.normalize();
btCollisionWorld::LocalRayResult localRayResult
(
- collisionObject,
- 0,
- castResult.m_normal,
- castResult.m_fraction
+ collisionObject,
+ 0,
+ castResult.m_normal,
+ castResult.m_fraction
);
bool normalInWorldSpace = true;
@@ -281,7 +316,7 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
} else {
if (collisionShape->isConcave())
{
-// BT_PROFILE("rayTestConcave");
+ // BT_PROFILE("rayTestConcave");
if (collisionShape->getShapeType()==TRIANGLE_MESH_SHAPE_PROXYTYPE)
{
///optimized version for btBvhTriangleMeshShape
@@ -297,15 +332,18 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
btCollisionObject* m_collisionObject;
btTriangleMeshShape* m_triangleMesh;
+ btTransform m_colObjWorldTransform;
+
BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to,
- btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btTriangleMeshShape* triangleMesh):
- //@BP Mod
- btTriangleRaycastCallback(from,to, resultCallback->m_flags),
- m_resultCallback(resultCallback),
- m_collisionObject(collisionObject),
- m_triangleMesh(triangleMesh)
- {
- }
+ btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btTriangleMeshShape* triangleMesh,const btTransform& colObjWorldTransform):
+ //@BP Mod
+ btTriangleRaycastCallback(from,to, resultCallback->m_flags),
+ m_resultCallback(resultCallback),
+ m_collisionObject(collisionObject),
+ m_triangleMesh(triangleMesh),
+ m_colObjWorldTransform(colObjWorldTransform)
+ {
+ }
virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex )
@@ -314,19 +352,21 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
shapeInfo.m_shapePart = partId;
shapeInfo.m_triangleIndex = triangleIndex;
+ btVector3 hitNormalWorld = m_colObjWorldTransform.getBasis() * hitNormalLocal;
+
btCollisionWorld::LocalRayResult rayResult
- (m_collisionObject,
+ (m_collisionObject,
&shapeInfo,
- hitNormalLocal,
+ hitNormalWorld,
hitFraction);
- bool normalInWorldSpace = false;
+ bool normalInWorldSpace = true;
return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace);
}
};
- BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,triangleMesh);
+ BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,triangleMesh,colObjWorldTransform);
rcb.m_hitFraction = resultCallback.m_closestHitFraction;
triangleMesh->performRaycast(&rcb,rayFromLocal,rayToLocal);
} else
@@ -347,15 +387,18 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
btCollisionObject* m_collisionObject;
btConcaveShape* m_triangleMesh;
+ btTransform m_colObjWorldTransform;
+
BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to,
- btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btConcaveShape* triangleMesh):
- //@BP Mod
- btTriangleRaycastCallback(from,to, resultCallback->m_flags),
- m_resultCallback(resultCallback),
- m_collisionObject(collisionObject),
- m_triangleMesh(triangleMesh)
- {
- }
+ btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btConcaveShape* triangleMesh, const btTransform& colObjWorldTransform):
+ //@BP Mod
+ btTriangleRaycastCallback(from,to, resultCallback->m_flags),
+ m_resultCallback(resultCallback),
+ m_collisionObject(collisionObject),
+ m_triangleMesh(triangleMesh),
+ m_colObjWorldTransform(colObjWorldTransform)
+ {
+ }
virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex )
@@ -364,22 +407,22 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
shapeInfo.m_shapePart = partId;
shapeInfo.m_triangleIndex = triangleIndex;
+ btVector3 hitNormalWorld = m_colObjWorldTransform.getBasis() * hitNormalLocal;
+
btCollisionWorld::LocalRayResult rayResult
- (m_collisionObject,
+ (m_collisionObject,
&shapeInfo,
- hitNormalLocal,
+ hitNormalWorld,
hitFraction);
- bool normalInWorldSpace = false;
+ bool normalInWorldSpace = true;
return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace);
-
-
}
};
- BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,concaveShape);
+ BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,concaveShape, colObjWorldTransform);
rcb.m_hitFraction = resultCallback.m_closestHitFraction;
btVector3 rayAabbMinLocal = rayFromLocal;
@@ -390,27 +433,118 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
concaveShape->processAllTriangles(&rcb,rayAabbMinLocal,rayAabbMaxLocal);
}
} else {
-// BT_PROFILE("rayTestCompound");
- ///@todo: use AABB tree or other BVH acceleration structure, see btDbvt
+ // BT_PROFILE("rayTestCompound");
if (collisionShape->isCompound())
{
+ struct LocalInfoAdder2 : public RayResultCallback
+ {
+ RayResultCallback* m_userCallback;
+ int m_i;
+
+ LocalInfoAdder2 (int i, RayResultCallback *user)
+ : m_userCallback(user), m_i(i)
+ {
+ m_closestHitFraction = m_userCallback->m_closestHitFraction;
+ }
+ virtual bool needsCollision(btBroadphaseProxy* p) const
+ {
+ return m_userCallback->needsCollision(p);
+ }
+
+ virtual btScalar addSingleResult (btCollisionWorld::LocalRayResult &r, bool b)
+ {
+ btCollisionWorld::LocalShapeInfo shapeInfo;
+ shapeInfo.m_shapePart = -1;
+ shapeInfo.m_triangleIndex = m_i;
+ if (r.m_localShapeInfo == NULL)
+ r.m_localShapeInfo = &shapeInfo;
+
+ const btScalar result = m_userCallback->addSingleResult(r, b);
+ m_closestHitFraction = m_userCallback->m_closestHitFraction;
+ return result;
+ }
+ };
+
+ struct RayTester : btDbvt::ICollide
+ {
+ btCollisionObject* m_collisionObject;
+ const btCompoundShape* m_compoundShape;
+ const btTransform& m_colObjWorldTransform;
+ const btTransform& m_rayFromTrans;
+ const btTransform& m_rayToTrans;
+ RayResultCallback& m_resultCallback;
+
+ RayTester(btCollisionObject* collisionObject,
+ const btCompoundShape* compoundShape,
+ const btTransform& colObjWorldTransform,
+ const btTransform& rayFromTrans,
+ const btTransform& rayToTrans,
+ RayResultCallback& resultCallback):
+ m_collisionObject(collisionObject),
+ m_compoundShape(compoundShape),
+ m_colObjWorldTransform(colObjWorldTransform),
+ m_rayFromTrans(rayFromTrans),
+ m_rayToTrans(rayToTrans),
+ m_resultCallback(resultCallback)
+ {
+
+ }
+
+ void Process(int i)
+ {
+ const btCollisionShape* childCollisionShape = m_compoundShape->getChildShape(i);
+ const btTransform& childTrans = m_compoundShape->getChildTransform(i);
+ btTransform childWorldTrans = m_colObjWorldTransform * childTrans;
+
+ // replace collision shape so that callback can determine the triangle
+ btCollisionShape* saveCollisionShape = m_collisionObject->getCollisionShape();
+ m_collisionObject->internalSetTemporaryCollisionShape((btCollisionShape*)childCollisionShape);
+
+ LocalInfoAdder2 my_cb(i, &m_resultCallback);
+
+ rayTestSingle(
+ m_rayFromTrans,
+ m_rayToTrans,
+ m_collisionObject,
+ childCollisionShape,
+ childWorldTrans,
+ my_cb);
+
+ // restore
+ m_collisionObject->internalSetTemporaryCollisionShape(saveCollisionShape);
+ }
+
+ void Process(const btDbvtNode* leaf)
+ {
+ Process(leaf->dataAsInt);
+ }
+ };
+
const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(collisionShape);
- int i=0;
- for (i=0;i<compoundShape->getNumChildShapes();i++)
+ const btDbvt* dbvt = compoundShape->getDynamicAabbTree();
+
+
+ RayTester rayCB(
+ collisionObject,
+ compoundShape,
+ colObjWorldTransform,
+ rayFromTrans,
+ rayToTrans,
+ resultCallback);
+#ifndef DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION
+ if (dbvt)
{
- btTransform childTrans = compoundShape->getChildTransform(i);
- const btCollisionShape* childCollisionShape = compoundShape->getChildShape(i);
- btTransform childWorldTrans = colObjWorldTransform * childTrans;
- // replace collision shape so that callback can determine the triangle
- btCollisionShape* saveCollisionShape = collisionObject->getCollisionShape();
- collisionObject->internalSetTemporaryCollisionShape((btCollisionShape*)childCollisionShape);
- rayTestSingle(rayFromTrans,rayToTrans,
- collisionObject,
- childCollisionShape,
- childWorldTrans,
- resultCallback);
- // restore
- collisionObject->internalSetTemporaryCollisionShape(saveCollisionShape);
+ btVector3 localRayFrom = colObjWorldTransform.inverseTimes(rayFromTrans).getOrigin();
+ btVector3 localRayTo = colObjWorldTransform.inverseTimes(rayToTrans).getOrigin();
+ btDbvt::rayTest(dbvt->m_root, localRayFrom , localRayTo, rayCB);
+ }
+ else
+#endif //DISABLE_DBVT_COMPOUNDSHAPE_RAYCAST_ACCELERATION
+ {
+ for (int i = 0, n = compoundShape->getNumChildShapes(); i < n; ++i)
+ {
+ rayCB.Process(i);
+ }
}
}
}
@@ -418,10 +552,10 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
}
void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const btTransform& convexFromTrans,const btTransform& convexToTrans,
- btCollisionObject* collisionObject,
- const btCollisionShape* collisionShape,
- const btTransform& colObjWorldTransform,
- ConvexResultCallback& resultCallback, btScalar allowedPenetration)
+ btCollisionObject* collisionObject,
+ const btCollisionShape* collisionShape,
+ const btTransform& colObjWorldTransform,
+ ConvexResultCallback& resultCallback, btScalar allowedPenetration)
{
if (collisionShape->isConvex())
{
@@ -433,15 +567,15 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
btConvexShape* convexShape = (btConvexShape*) collisionShape;
btVoronoiSimplexSolver simplexSolver;
btGjkEpaPenetrationDepthSolver gjkEpaPenetrationSolver;
-
+
btContinuousConvexCollision convexCaster1(castShape,convexShape,&simplexSolver,&gjkEpaPenetrationSolver);
//btGjkConvexCast convexCaster2(castShape,convexShape,&simplexSolver);
//btSubsimplexConvexCast convexCaster3(castShape,convexShape,&simplexSolver);
btConvexCast* castPtr = &convexCaster1;
-
-
-
+
+
+
if (castPtr->calcTimeOfImpact(convexFromTrans,convexToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
{
//add hit
@@ -451,13 +585,13 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
{
castResult.m_normal.normalize();
btCollisionWorld::LocalConvexResult localConvexResult
- (
- collisionObject,
- 0,
- castResult.m_normal,
- castResult.m_hitPoint,
- castResult.m_fraction
- );
+ (
+ collisionObject,
+ 0,
+ castResult.m_normal,
+ castResult.m_hitPoint,
+ castResult.m_fraction
+ );
bool normalInWorldSpace = true;
resultCallback.addSingleResult(localConvexResult, normalInWorldSpace);
@@ -487,12 +621,12 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
BridgeTriangleConvexcastCallback(const btConvexShape* castShape, const btTransform& from,const btTransform& to,
btCollisionWorld::ConvexResultCallback* resultCallback, btCollisionObject* collisionObject,btTriangleMeshShape* triangleMesh, const btTransform& triangleToWorld):
- btTriangleConvexcastCallback(castShape, from,to, triangleToWorld, triangleMesh->getMargin()),
- m_resultCallback(resultCallback),
- m_collisionObject(collisionObject),
- m_triangleMesh(triangleMesh)
- {
- }
+ btTriangleConvexcastCallback(castShape, from,to, triangleToWorld, triangleMesh->getMargin()),
+ m_resultCallback(resultCallback),
+ m_collisionObject(collisionObject),
+ m_triangleMesh(triangleMesh)
+ {
+ }
virtual btScalar reportHit(const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex )
@@ -504,7 +638,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
{
btCollisionWorld::LocalConvexResult convexResult
- (m_collisionObject,
+ (m_collisionObject,
&shapeInfo,
hitNormalLocal,
hitPointLocal,
@@ -522,6 +656,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans,convexToTrans,&resultCallback,collisionObject,triangleMesh, colObjWorldTransform);
tccb.m_hitFraction = resultCallback.m_closestHitFraction;
+ tccb.m_allowedPenetration = allowedPenetration;
btVector3 boxMinLocal, boxMaxLocal;
castShape->getAabb(rotationXform, boxMinLocal, boxMaxLocal);
triangleMesh->performConvexcast(&tccb,convexFromLocal,convexToLocal,boxMinLocal, boxMaxLocal);
@@ -544,12 +679,12 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
BridgeTriangleConvexcastCallback(const btConvexShape* castShape, const btTransform& from,const btTransform& to,
btCollisionWorld::ConvexResultCallback* resultCallback, btCollisionObject* collisionObject,btConcaveShape* triangleMesh, const btTransform& triangleToWorld):
- btTriangleConvexcastCallback(castShape, from,to, triangleToWorld, triangleMesh->getMargin()),
- m_resultCallback(resultCallback),
- m_collisionObject(collisionObject),
- m_triangleMesh(triangleMesh)
- {
- }
+ btTriangleConvexcastCallback(castShape, from,to, triangleToWorld, triangleMesh->getMargin()),
+ m_resultCallback(resultCallback),
+ m_collisionObject(collisionObject),
+ m_triangleMesh(triangleMesh)
+ {
+ }
virtual btScalar reportHit(const btVector3& hitNormalLocal, const btVector3& hitPointLocal, btScalar hitFraction, int partId, int triangleIndex )
@@ -561,7 +696,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
{
btCollisionWorld::LocalConvexResult convexResult
- (m_collisionObject,
+ (m_collisionObject,
&shapeInfo,
hitNormalLocal,
hitPointLocal,
@@ -578,6 +713,7 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
BridgeTriangleConvexcastCallback tccb(castShape, convexFromTrans,convexToTrans,&resultCallback,collisionObject,concaveShape, colObjWorldTransform);
tccb.m_hitFraction = resultCallback.m_closestHitFraction;
+ tccb.m_allowedPenetration = allowedPenetration;
btVector3 boxMinLocal, boxMaxLocal;
castShape->getAabb(rotationXform, boxMinLocal, boxMaxLocal);
@@ -604,11 +740,41 @@ void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const bt
// replace collision shape so that callback can determine the triangle
btCollisionShape* saveCollisionShape = collisionObject->getCollisionShape();
collisionObject->internalSetTemporaryCollisionShape((btCollisionShape*)childCollisionShape);
+ struct LocalInfoAdder : public ConvexResultCallback {
+ ConvexResultCallback* m_userCallback;
+ int m_i;
+
+ LocalInfoAdder (int i, ConvexResultCallback *user)
+ : m_userCallback(user), m_i(i)
+ {
+ m_closestHitFraction = m_userCallback->m_closestHitFraction;
+ }
+ virtual bool needsCollision(btBroadphaseProxy* p) const
+ {
+ return m_userCallback->needsCollision(p);
+ }
+ virtual btScalar addSingleResult (btCollisionWorld::LocalConvexResult& r, bool b)
+ {
+ btCollisionWorld::LocalShapeInfo shapeInfo;
+ shapeInfo.m_shapePart = -1;
+ shapeInfo.m_triangleIndex = m_i;
+ if (r.m_localShapeInfo == NULL)
+ r.m_localShapeInfo = &shapeInfo;
+ const btScalar result = m_userCallback->addSingleResult(r, b);
+ m_closestHitFraction = m_userCallback->m_closestHitFraction;
+ return result;
+
+ }
+ };
+
+ LocalInfoAdder my_cb(i, &resultCallback);
+
+
objectQuerySingle(castShape, convexFromTrans,convexToTrans,
collisionObject,
childCollisionShape,
childWorldTrans,
- resultCallback, allowedPenetration);
+ my_cb, allowedPenetration);
// restore
collisionObject->internalSetTemporaryCollisionShape(saveCollisionShape);
}
@@ -631,10 +797,10 @@ struct btSingleRayCallback : public btBroadphaseRayCallback
btCollisionWorld::RayResultCallback& m_resultCallback;
btSingleRayCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld,const btCollisionWorld* world,btCollisionWorld::RayResultCallback& resultCallback)
- :m_rayFromWorld(rayFromWorld),
- m_rayToWorld(rayToWorld),
- m_world(world),
- m_resultCallback(resultCallback)
+ :m_rayFromWorld(rayFromWorld),
+ m_rayToWorld(rayToWorld),
+ m_world(world),
+ m_resultCallback(resultCallback)
{
m_rayFromTrans.setIdentity();
m_rayFromTrans.setOrigin(m_rayFromWorld);
@@ -644,10 +810,10 @@ struct btSingleRayCallback : public btBroadphaseRayCallback
btVector3 rayDir = (rayToWorld-rayFromWorld);
rayDir.normalize ();
- ///what about division by zero? --> just set rayDirection[i] to INF/1e30
- m_rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[0];
- m_rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[1];
- m_rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[2];
+ ///what about division by zero? --> just set rayDirection[i] to INF/BT_LARGE_FLOAT
+ m_rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[0];
+ m_rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[1];
+ m_rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[2];
m_signs[0] = m_rayDirectionInverse[0] < 0.0;
m_signs[1] = m_rayDirectionInverse[1] < 0.0;
m_signs[2] = m_rayDirectionInverse[2] < 0.0;
@@ -656,7 +822,7 @@ struct btSingleRayCallback : public btBroadphaseRayCallback
}
-
+
virtual bool process(const btBroadphaseProxy* proxy)
{
@@ -687,9 +853,9 @@ struct btSingleRayCallback : public btBroadphaseRayCallback
{
m_world->rayTestSingle(m_rayFromTrans,m_rayToTrans,
collisionObject,
- collisionObject->getCollisionShape(),
- collisionObject->getWorldTransform(),
- m_resultCallback);
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ m_resultCallback);
}
}
return true;
@@ -698,7 +864,7 @@ struct btSingleRayCallback : public btBroadphaseRayCallback
void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const
{
- BT_PROFILE("rayTest");
+ //BT_PROFILE("rayTest");
/// use the broadphase to accelerate the search for objects, based on their aabb
/// and for each object with ray-aabb overlap, perform an exact ray test
btSingleRayCallback rayCB(rayFromWorld,rayToWorld,this,resultCallback);
@@ -737,10 +903,10 @@ struct btSingleSweepCallback : public btBroadphaseRayCallback
{
btVector3 unnormalizedRayDir = (m_convexToTrans.getOrigin()-m_convexFromTrans.getOrigin());
btVector3 rayDir = unnormalizedRayDir.normalized();
- ///what about division by zero? --> just set rayDirection[i] to INF/1e30
- m_rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[0];
- m_rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[1];
- m_rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(1e30) : btScalar(1.0) / rayDir[2];
+ ///what about division by zero? --> just set rayDirection[i] to INF/BT_LARGE_FLOAT
+ m_rayDirectionInverse[0] = rayDir[0] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[0];
+ m_rayDirectionInverse[1] = rayDir[1] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[1];
+ m_rayDirectionInverse[2] = rayDir[2] == btScalar(0.0) ? btScalar(BT_LARGE_FLOAT) : btScalar(1.0) / rayDir[2];
m_signs[0] = m_rayDirectionInverse[0] < 0.0;
m_signs[1] = m_rayDirectionInverse[1] < 0.0;
m_signs[2] = m_rayDirectionInverse[2] < 0.0;
@@ -761,13 +927,13 @@ struct btSingleSweepCallback : public btBroadphaseRayCallback
if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle())) {
//RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
m_world->objectQuerySingle(m_castShape, m_convexFromTrans,m_convexToTrans,
- collisionObject,
- collisionObject->getCollisionShape(),
- collisionObject->getWorldTransform(),
- m_resultCallback,
- m_allowedCcdPenetration);
+ collisionObject,
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ m_resultCallback,
+ m_allowedCcdPenetration);
}
-
+
return true;
}
};
@@ -782,7 +948,7 @@ void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btT
/// and for each object with ray-aabb overlap, perform an exact ray test
/// unfortunately the implementation for rayTest and convexSweepTest duplicated, albeit practically identical
-
+
btTransform convexFromTrans,convexToTrans;
convexFromTrans = convexFromWorld;
@@ -825,12 +991,455 @@ void btCollisionWorld::convexSweepTest(const btConvexShape* castShape, const btT
{
objectQuerySingle(castShape, convexFromTrans,convexToTrans,
collisionObject,
- collisionObject->getCollisionShape(),
- collisionObject->getWorldTransform(),
- resultCallback,
- allowedCcdPenetration);
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ resultCallback,
+ allowedCcdPenetration);
}
}
}
#endif //USE_BRUTEFORCE_RAYBROADPHASE
}
+
+
+
+struct btBridgedManifoldResult : public btManifoldResult
+{
+
+ btCollisionWorld::ContactResultCallback& m_resultCallback;
+
+ btBridgedManifoldResult( btCollisionObject* obj0,btCollisionObject* obj1,btCollisionWorld::ContactResultCallback& resultCallback )
+ :btManifoldResult(obj0,obj1),
+ m_resultCallback(resultCallback)
+ {
+ }
+
+ virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
+ {
+ bool isSwapped = m_manifoldPtr->getBody0() != m_body0;
+ btVector3 pointA = pointInWorld + normalOnBInWorld * depth;
+ btVector3 localA;
+ btVector3 localB;
+ if (isSwapped)
+ {
+ localA = m_rootTransB.invXform(pointA );
+ localB = m_rootTransA.invXform(pointInWorld);
+ } else
+ {
+ localA = m_rootTransA.invXform(pointA );
+ localB = m_rootTransB.invXform(pointInWorld);
+ }
+
+ btManifoldPoint newPt(localA,localB,normalOnBInWorld,depth);
+ newPt.m_positionWorldOnA = pointA;
+ newPt.m_positionWorldOnB = pointInWorld;
+
+ //BP mod, store contact triangles.
+ if (isSwapped)
+ {
+ newPt.m_partId0 = m_partId1;
+ newPt.m_partId1 = m_partId0;
+ newPt.m_index0 = m_index1;
+ newPt.m_index1 = m_index0;
+ } else
+ {
+ newPt.m_partId0 = m_partId0;
+ newPt.m_partId1 = m_partId1;
+ newPt.m_index0 = m_index0;
+ newPt.m_index1 = m_index1;
+ }
+
+ //experimental feature info, for per-triangle material etc.
+ btCollisionObject* obj0 = isSwapped? m_body1 : m_body0;
+ btCollisionObject* obj1 = isSwapped? m_body0 : m_body1;
+ m_resultCallback.addSingleResult(newPt,obj0,newPt.m_partId0,newPt.m_index0,obj1,newPt.m_partId1,newPt.m_index1);
+
+ }
+
+};
+
+
+
+struct btSingleContactCallback : public btBroadphaseAabbCallback
+{
+
+ btCollisionObject* m_collisionObject;
+ btCollisionWorld* m_world;
+ btCollisionWorld::ContactResultCallback& m_resultCallback;
+
+
+ btSingleContactCallback(btCollisionObject* collisionObject, btCollisionWorld* world,btCollisionWorld::ContactResultCallback& resultCallback)
+ :m_collisionObject(collisionObject),
+ m_world(world),
+ m_resultCallback(resultCallback)
+ {
+ }
+
+ virtual bool process(const btBroadphaseProxy* proxy)
+ {
+ btCollisionObject* collisionObject = (btCollisionObject*)proxy->m_clientObject;
+ if (collisionObject == m_collisionObject)
+ return true;
+
+ //only perform raycast if filterMask matches
+ if(m_resultCallback.needsCollision(collisionObject->getBroadphaseHandle()))
+ {
+ btCollisionAlgorithm* algorithm = m_world->getDispatcher()->findAlgorithm(m_collisionObject,collisionObject);
+ if (algorithm)
+ {
+ btBridgedManifoldResult contactPointResult(m_collisionObject,collisionObject, m_resultCallback);
+ //discrete collision detection query
+ algorithm->processCollision(m_collisionObject,collisionObject, m_world->getDispatchInfo(),&contactPointResult);
+
+ algorithm->~btCollisionAlgorithm();
+ m_world->getDispatcher()->freeCollisionAlgorithm(algorithm);
+ }
+ }
+ return true;
+ }
+};
+
+
+///contactTest performs a discrete collision test against all objects in the btCollisionWorld, and calls the resultCallback.
+///it reports one or more contact points for every overlapping object (including the one with deepest penetration)
+void btCollisionWorld::contactTest( btCollisionObject* colObj, ContactResultCallback& resultCallback)
+{
+ btVector3 aabbMin,aabbMax;
+ colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(),aabbMin,aabbMax);
+ btSingleContactCallback contactCB(colObj,this,resultCallback);
+
+ m_broadphasePairCache->aabbTest(aabbMin,aabbMax,contactCB);
+}
+
+
+///contactTest performs a discrete collision test between two collision objects and calls the resultCallback if overlap if detected.
+///it reports one or more contact points (including the one with deepest penetration)
+void btCollisionWorld::contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback)
+{
+ btCollisionAlgorithm* algorithm = getDispatcher()->findAlgorithm(colObjA,colObjB);
+ if (algorithm)
+ {
+ btBridgedManifoldResult contactPointResult(colObjA,colObjB, resultCallback);
+ //discrete collision detection query
+ algorithm->processCollision(colObjA,colObjB, getDispatchInfo(),&contactPointResult);
+
+ algorithm->~btCollisionAlgorithm();
+ getDispatcher()->freeCollisionAlgorithm(algorithm);
+ }
+
+}
+
+
+
+
+class DebugDrawcallback : public btTriangleCallback, public btInternalTriangleIndexCallback
+{
+ btIDebugDraw* m_debugDrawer;
+ btVector3 m_color;
+ btTransform m_worldTrans;
+
+public:
+
+ DebugDrawcallback(btIDebugDraw* debugDrawer,const btTransform& worldTrans,const btVector3& color) :
+ m_debugDrawer(debugDrawer),
+ m_color(color),
+ m_worldTrans(worldTrans)
+ {
+ }
+
+ virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
+ {
+ processTriangle(triangle,partId,triangleIndex);
+ }
+
+ virtual void processTriangle(btVector3* triangle,int partId, int triangleIndex)
+ {
+ (void)partId;
+ (void)triangleIndex;
+
+ btVector3 wv0,wv1,wv2;
+ wv0 = m_worldTrans*triangle[0];
+ wv1 = m_worldTrans*triangle[1];
+ wv2 = m_worldTrans*triangle[2];
+ btVector3 center = (wv0+wv1+wv2)*btScalar(1./3.);
+
+ btVector3 normal = (wv1-wv0).cross(wv2-wv0);
+ normal.normalize();
+ btVector3 normalColor(1,1,0);
+ m_debugDrawer->drawLine(center,center+normal,normalColor);
+
+
+
+
+ m_debugDrawer->drawLine(wv0,wv1,m_color);
+ m_debugDrawer->drawLine(wv1,wv2,m_color);
+ m_debugDrawer->drawLine(wv2,wv0,m_color);
+ }
+};
+
+
+void btCollisionWorld::debugDrawObject(const btTransform& worldTransform, const btCollisionShape* shape, const btVector3& color)
+{
+ // Draw a small simplex at the center of the object
+ getDebugDrawer()->drawTransform(worldTransform,1);
+
+ if (shape->getShapeType() == COMPOUND_SHAPE_PROXYTYPE)
+ {
+ const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(shape);
+ for (int i=compoundShape->getNumChildShapes()-1;i>=0;i--)
+ {
+ btTransform childTrans = compoundShape->getChildTransform(i);
+ const btCollisionShape* colShape = compoundShape->getChildShape(i);
+ debugDrawObject(worldTransform*childTrans,colShape,color);
+ }
+
+ } else
+ {
+ switch (shape->getShapeType())
+ {
+
+ case BOX_SHAPE_PROXYTYPE:
+ {
+ const btBoxShape* boxShape = static_cast<const btBoxShape*>(shape);
+ btVector3 halfExtents = boxShape->getHalfExtentsWithMargin();
+ getDebugDrawer()->drawBox(-halfExtents,halfExtents,worldTransform,color);
+ break;
+ }
+
+ case SPHERE_SHAPE_PROXYTYPE:
+ {
+ const btSphereShape* sphereShape = static_cast<const btSphereShape*>(shape);
+ btScalar radius = sphereShape->getMargin();//radius doesn't include the margin, so draw with margin
+
+ getDebugDrawer()->drawSphere(radius, worldTransform, color);
+ break;
+ }
+ case MULTI_SPHERE_SHAPE_PROXYTYPE:
+ {
+ const btMultiSphereShape* multiSphereShape = static_cast<const btMultiSphereShape*>(shape);
+
+ btTransform childTransform;
+ childTransform.setIdentity();
+
+ for (int i = multiSphereShape->getSphereCount()-1; i>=0;i--)
+ {
+ childTransform.setOrigin(multiSphereShape->getSpherePosition(i));
+ getDebugDrawer()->drawSphere(multiSphereShape->getSphereRadius(i), worldTransform*childTransform, color);
+ }
+
+ break;
+ }
+ case CAPSULE_SHAPE_PROXYTYPE:
+ {
+ const btCapsuleShape* capsuleShape = static_cast<const btCapsuleShape*>(shape);
+
+ btScalar radius = capsuleShape->getRadius();
+ btScalar halfHeight = capsuleShape->getHalfHeight();
+
+ int upAxis = capsuleShape->getUpAxis();
+ getDebugDrawer()->drawCapsule(radius, halfHeight, upAxis, worldTransform, color);
+ break;
+ }
+ case CONE_SHAPE_PROXYTYPE:
+ {
+ const btConeShape* coneShape = static_cast<const btConeShape*>(shape);
+ btScalar radius = coneShape->getRadius();//+coneShape->getMargin();
+ btScalar height = coneShape->getHeight();//+coneShape->getMargin();
+
+ int upAxis= coneShape->getConeUpIndex();
+ getDebugDrawer()->drawCone(radius, height, upAxis, worldTransform, color);
+ break;
+
+ }
+ case CYLINDER_SHAPE_PROXYTYPE:
+ {
+ const btCylinderShape* cylinder = static_cast<const btCylinderShape*>(shape);
+ int upAxis = cylinder->getUpAxis();
+ btScalar radius = cylinder->getRadius();
+ btScalar halfHeight = cylinder->getHalfExtentsWithMargin()[upAxis];
+ getDebugDrawer()->drawCylinder(radius, halfHeight, upAxis, worldTransform, color);
+ break;
+ }
+
+ case STATIC_PLANE_PROXYTYPE:
+ {
+ const btStaticPlaneShape* staticPlaneShape = static_cast<const btStaticPlaneShape*>(shape);
+ btScalar planeConst = staticPlaneShape->getPlaneConstant();
+ const btVector3& planeNormal = staticPlaneShape->getPlaneNormal();
+ getDebugDrawer()->drawPlane(planeNormal, planeConst,worldTransform, color);
+ break;
+
+ }
+ default:
+ {
+
+ if (shape->isConcave())
+ {
+ btConcaveShape* concaveMesh = (btConcaveShape*) shape;
+
+ ///@todo pass camera, for some culling? no -> we are not a graphics lib
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+ btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+
+ DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
+ concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
+
+ }
+
+ if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE)
+ {
+ btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape;
+ //todo: pass camera for some culling
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+ btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+ //DebugDrawcallback drawCallback;
+ DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
+ convexMesh->getMeshInterface()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax);
+ }
+
+
+ /// for polyhedral shapes
+ if (shape->isPolyhedral())
+ {
+ btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shape;
+
+ int i;
+ for (i=0;i<polyshape->getNumEdges();i++)
+ {
+ btVector3 a,b;
+ polyshape->getEdge(i,a,b);
+ btVector3 wa = worldTransform * a;
+ btVector3 wb = worldTransform * b;
+ getDebugDrawer()->drawLine(wa,wb,color);
+
+ }
+
+
+ }
+ }
+ }
+ }
+}
+
+
+void btCollisionWorld::debugDrawWorld()
+{
+ if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawContactPoints)
+ {
+ int numManifolds = getDispatcher()->getNumManifolds();
+ btVector3 color(0,0,0);
+ for (int i=0;i<numManifolds;i++)
+ {
+ btPersistentManifold* contactManifold = getDispatcher()->getManifoldByIndexInternal(i);
+ //btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
+ //btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1());
+
+ int numContacts = contactManifold->getNumContacts();
+ for (int j=0;j<numContacts;j++)
+ {
+ btManifoldPoint& cp = contactManifold->getContactPoint(j);
+ getDebugDrawer()->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color);
+ }
+ }
+ }
+
+ if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & (btIDebugDraw::DBG_DrawWireframe | btIDebugDraw::DBG_DrawAabb))
+ {
+ int i;
+
+ for ( i=0;i<m_collisionObjects.size();i++)
+ {
+ btCollisionObject* colObj = m_collisionObjects[i];
+ if ((colObj->getCollisionFlags() & btCollisionObject::CF_DISABLE_VISUALIZE_OBJECT)==0)
+ {
+ if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe)
+ {
+ btVector3 color(btScalar(1.),btScalar(1.),btScalar(1.));
+ switch(colObj->getActivationState())
+ {
+ case ACTIVE_TAG:
+ color = btVector3(btScalar(1.),btScalar(1.),btScalar(1.)); break;
+ case ISLAND_SLEEPING:
+ color = btVector3(btScalar(0.),btScalar(1.),btScalar(0.));break;
+ case WANTS_DEACTIVATION:
+ color = btVector3(btScalar(0.),btScalar(1.),btScalar(1.));break;
+ case DISABLE_DEACTIVATION:
+ color = btVector3(btScalar(1.),btScalar(0.),btScalar(0.));break;
+ case DISABLE_SIMULATION:
+ color = btVector3(btScalar(1.),btScalar(1.),btScalar(0.));break;
+ default:
+ {
+ color = btVector3(btScalar(1),btScalar(0.),btScalar(0.));
+ }
+ };
+
+ debugDrawObject(colObj->getWorldTransform(),colObj->getCollisionShape(),color);
+ }
+ if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
+ {
+ btVector3 minAabb,maxAabb;
+ btVector3 colorvec(1,0,0);
+ colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);
+ btVector3 contactThreshold(gContactBreakingThreshold,gContactBreakingThreshold,gContactBreakingThreshold);
+ minAabb -= contactThreshold;
+ maxAabb += contactThreshold;
+
+ btVector3 minAabb2,maxAabb2;
+
+ colObj->getCollisionShape()->getAabb(colObj->getInterpolationWorldTransform(),minAabb2,maxAabb2);
+ minAabb2 -= contactThreshold;
+ maxAabb2 += contactThreshold;
+
+ minAabb.setMin(minAabb2);
+ maxAabb.setMax(maxAabb2);
+
+ m_debugDrawer->drawAabb(minAabb,maxAabb,colorvec);
+ }
+ }
+
+ }
+ }
+}
+
+
+void btCollisionWorld::serializeCollisionObjects(btSerializer* serializer)
+{
+ int i;
+ //serialize all collision objects
+ for (i=0;i<m_collisionObjects.size();i++)
+ {
+ btCollisionObject* colObj = m_collisionObjects[i];
+ if (colObj->getInternalType() == btCollisionObject::CO_COLLISION_OBJECT)
+ {
+ colObj->serializeSingleObject(serializer);
+ }
+ }
+
+ ///keep track of shapes already serialized
+ btHashMap<btHashPtr,btCollisionShape*> serializedShapes;
+
+ for (i=0;i<m_collisionObjects.size();i++)
+ {
+ btCollisionObject* colObj = m_collisionObjects[i];
+ btCollisionShape* shape = colObj->getCollisionShape();
+
+ if (!serializedShapes.find(shape))
+ {
+ serializedShapes.insert(shape,shape);
+ shape->serializeSingleShape(serializer);
+ }
+ }
+
+}
+
+
+void btCollisionWorld::serialize(btSerializer* serializer)
+{
+
+ serializer->startSerialization();
+
+ serializeCollisionObjects(serializer);
+
+ serializer->finishSerialization();
+}
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
index 1f785cf69e4..b42e2c40b21 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
@@ -1,5 +1,5 @@
/*
-Bullet Continuous Collision Detection and Physics %Library
+Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://bulletphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty.
@@ -15,50 +15,48 @@ subject to the following restrictions:
/**
- * \file btCollisionWorld.h
- * \ingroup bullet
- *
- * @page bulletdoc Bullet Documentation
+ * @mainpage Bullet Documentation
*
* @section intro_sec Introduction
* Bullet Collision Detection & Physics SDK
*
- * Bullet is a Collision Detection and Rigid Body Dynamics %Library. The %Library is Open Source and free for commercial use, under the ZLib license ( http://opensource.org/licenses/zlib-license.php ).
+ * Bullet is a Collision Detection and Rigid Body Dynamics Library. The Library is Open Source and free for commercial use, under the ZLib license ( http://opensource.org/licenses/zlib-license.php ).
*
+ * The main documentation is Bullet_User_Manual.pdf, included in the source code distribution.
* There is the Physics Forum for feedback and general Collision Detection and Physics discussions.
* Please visit http://www.bulletphysics.com
*
* @section install_sec Installation
*
* @subsection step1 Step 1: Download
- * You can download the Bullet Physics %Library from the Google Code repository: http://code.google.com/p/bullet/downloads/list
+ * You can download the Bullet Physics Library from the Google Code repository: http://code.google.com/p/bullet/downloads/list
+ *
* @subsection step2 Step 2: Building
- * Bullet comes with autogenerated Project Files for Microsoft Visual Studio 6, 7, 7.1 and 8.
- * The main Workspace/Solution is located in Bullet/msvc/8/wksbullet.sln (replace 8 with your version).
- *
- * Under other platforms, like Linux or Mac OS-X, Bullet can be build using either using make, cmake, http://www.cmake.org , or jam, http://www.perforce.com/jam/jam.html . cmake can autogenerate Xcode, KDevelop, MSVC and other build systems. just run cmake . in the root of Bullet.
- * So if you are not using MSVC or cmake, you can run ./autogen.sh ./configure to create both Makefile and Jamfile and then run make or jam.
- * Jam is a build system that can build the library, demos and also autogenerate the MSVC Project Files.
- * If you don't have jam installed, you can make jam from the included jam-2.5 sources, or download jam from ftp://ftp.perforce.com/jam
+ * Bullet main build system for all platforms is cmake, you can download http://www.cmake.org
+ * cmake can autogenerate projectfiles for Microsoft Visual Studio, Apple Xcode, KDevelop and Unix Makefiles.
+ * The easiest is to run the CMake cmake-gui graphical user interface and choose the options and generate projectfiles.
+ * You can also use cmake in the command-line. Here are some examples for various platforms:
+ * cmake . -G "Visual Studio 9 2008"
+ * cmake . -G Xcode
+ * cmake . -G "Unix Makefiles"
+ * Although cmake is recommended, you can also use autotools for UNIX: ./autogen.sh ./configure to create a Makefile and then run make.
*
* @subsection step3 Step 3: Testing demos
* Try to run and experiment with BasicDemo executable as a starting point.
- * Bullet can be used in several ways, as Full Rigid Body simulation, as Collision Detector %Library or Low Level / Snippets like the GJK Closest Point calculation.
+ * Bullet can be used in several ways, as Full Rigid Body simulation, as Collision Detector Library or Low Level / Snippets like the GJK Closest Point calculation.
* The Dependencies can be seen in this documentation under Directories
*
* @subsection step4 Step 4: Integrating in your application, full Rigid Body and Soft Body simulation
* Check out BasicDemo how to create a btDynamicsWorld, btRigidBody and btCollisionShape, Stepping the simulation and synchronizing your graphics object transform.
* Check out SoftDemo how to use soft body dynamics, using btSoftRigidDynamicsWorld.
- * @subsection step5 Step 5 : Integrate the Collision Detection %Library (without Dynamics and other Extras)
+ * @subsection step5 Step 5 : Integrate the Collision Detection Library (without Dynamics and other Extras)
* Bullet Collision Detection can also be used without the Dynamics/Extras.
* Check out btCollisionWorld and btCollisionObject, and the CollisionInterfaceDemo.
* @subsection step6 Step 6 : Use Snippets like the GJK Closest Point calculation.
* Bullet has been designed in a modular way keeping dependencies to a minimum. The ConvexHullDistance demo demonstrates direct use of btGjkPairDetector.
*
* @section copyright Copyright
- * Copyright (C) 2005-2008 Erwin Coumans, some contributions Copyright Gino van den Bergen, Christer Ericson, Simon Hobbs, Ricardo Padrela, F Richter(res), Stephane Redon
- * Special thanks to all visitors of the Bullet Physics forum, and in particular above contributors, John McCutchan, Nathanael Presson, Dave Eberle, Dirk Gregorius, Erin Catto, Dave Eberle, Adam Moravanszky,
- * Pierre Terdiman, Kenny Erleben, Russell Smith, Oliver Strunk, Jan Paul van Waveren, Marten Svanfeldt.
+ * For up-to-data information and copyright and contributors list check out the Bullet_User_Manual.pdf
*
*/
@@ -71,6 +69,8 @@ class btStackAlloc;
class btCollisionShape;
class btConvexShape;
class btBroadphaseInterface;
+class btSerializer;
+
#include "LinearMath/btVector3.h"
#include "LinearMath/btTransform.h"
#include "btCollisionObject.h"
@@ -97,7 +97,12 @@ protected:
btIDebugDraw* m_debugDrawer;
-
+ ///m_forceUpdateAllAabbs can be set to false as an optimization to only update active object AABBs
+ ///it is true by default, because it is error-prone (setting the position of static objects wouldn't update their AABB)
+ bool m_forceUpdateAllAabbs;
+
+ void serializeCollisionObjects(btSerializer* serializer);
+
public:
//this constructor doesn't own the dispatcher and paircache/broadphase
@@ -150,6 +155,10 @@ public:
return m_debugDrawer;
}
+ virtual void debugDrawWorld();
+
+ virtual void debugDrawObject(const btTransform& worldTransform, const btCollisionShape* shape, const btVector3& color);
+
///LocalShapeInfo gives extra information for complex shapes
///Currently, only btTriangleMeshShape is available, so it just contains triangleIndex and subpart
@@ -255,6 +264,45 @@ public:
}
};
+ struct AllHitsRayResultCallback : public RayResultCallback
+ {
+ AllHitsRayResultCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld)
+ :m_rayFromWorld(rayFromWorld),
+ m_rayToWorld(rayToWorld)
+ {
+ }
+
+ btAlignedObjectArray<btCollisionObject*> m_collisionObjects;
+
+ btVector3 m_rayFromWorld;//used to calculate hitPointWorld from hitFraction
+ btVector3 m_rayToWorld;
+
+ btAlignedObjectArray<btVector3> m_hitNormalWorld;
+ btAlignedObjectArray<btVector3> m_hitPointWorld;
+ btAlignedObjectArray<btScalar> m_hitFractions;
+
+ virtual btScalar addSingleResult(LocalRayResult& rayResult,bool normalInWorldSpace)
+ {
+ m_collisionObject = rayResult.m_collisionObject;
+ m_collisionObjects.push_back(rayResult.m_collisionObject);
+ btVector3 hitNormalWorld;
+ if (normalInWorldSpace)
+ {
+ hitNormalWorld = rayResult.m_hitNormalLocal;
+ } else
+ {
+ ///need to transform normal into worldspace
+ hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal;
+ }
+ m_hitNormalWorld.push_back(hitNormalWorld);
+ btVector3 hitPointWorld;
+ hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,rayResult.m_hitFraction);
+ m_hitPointWorld.push_back(hitPointWorld);
+ m_hitFractions.push_back(rayResult.m_hitFraction);
+ return m_closestHitFraction;
+ }
+ };
+
struct LocalConvexResult
{
@@ -350,6 +398,34 @@ public:
}
};
+ ///ContactResultCallback is used to report contact points
+ struct ContactResultCallback
+ {
+ short int m_collisionFilterGroup;
+ short int m_collisionFilterMask;
+
+ ContactResultCallback()
+ :m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
+ m_collisionFilterMask(btBroadphaseProxy::AllFilter)
+ {
+ }
+
+ virtual ~ContactResultCallback()
+ {
+ }
+
+ virtual bool needsCollision(btBroadphaseProxy* proxy0) const
+ {
+ bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
+ collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
+ return collides;
+ }
+
+ virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) = 0;
+ };
+
+
+
int getNumCollisionObjects() const
{
return int(m_collisionObjects.size());
@@ -359,10 +435,18 @@ public:
/// This allows for several queries: first hit, all hits, any hit, dependent on the value returned by the callback.
virtual void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const;
- // convexTest performs a swept convex cast on all objects in the btCollisionWorld, and calls the resultCallback
- // This allows for several queries: first hit, all hits, any hit, dependent on the value return by the callback.
+ /// convexTest performs a swept convex cast on all objects in the btCollisionWorld, and calls the resultCallback
+ /// This allows for several queries: first hit, all hits, any hit, dependent on the value return by the callback.
void convexSweepTest (const btConvexShape* castShape, const btTransform& from, const btTransform& to, ConvexResultCallback& resultCallback, btScalar allowedCcdPenetration = btScalar(0.)) const;
+ ///contactTest performs a discrete collision test between colObj against all objects in the btCollisionWorld, and calls the resultCallback.
+ ///it reports one or more contact points for every overlapping object (including the one with deepest penetration)
+ void contactTest(btCollisionObject* colObj, ContactResultCallback& resultCallback);
+
+ ///contactTest performs a discrete collision test between two collision objects and calls the resultCallback if overlap if detected.
+ ///it reports one or more contact points (including the one with deepest penetration)
+ void contactPairTest(btCollisionObject* colObjA, btCollisionObject* colObjB, ContactResultCallback& resultCallback);
+
/// rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest.
/// In a future implementation, we consider moving the ray test as a virtual method in btCollisionShape.
@@ -380,7 +464,7 @@ public:
const btTransform& colObjWorldTransform,
ConvexResultCallback& resultCallback, btScalar allowedPenetration);
- void addCollisionObject(btCollisionObject* collisionObject,short int collisionFilterGroup=btBroadphaseProxy::DefaultFilter,short int collisionFilterMask=btBroadphaseProxy::AllFilter);
+ virtual void addCollisionObject(btCollisionObject* collisionObject,short int collisionFilterGroup=btBroadphaseProxy::DefaultFilter,short int collisionFilterMask=btBroadphaseProxy::AllFilter);
btCollisionObjectArray& getCollisionObjectArray()
{
@@ -393,7 +477,7 @@ public:
}
- void removeCollisionObject(btCollisionObject* collisionObject);
+ virtual void removeCollisionObject(btCollisionObject* collisionObject);
virtual void performDiscreteCollisionDetection();
@@ -406,6 +490,18 @@ public:
{
return m_dispatchInfo;
}
+
+ bool getForceUpdateAllAabbs() const
+ {
+ return m_forceUpdateAllAabbs;
+ }
+ void setForceUpdateAllAabbs( bool forceUpdateAllAabbs)
+ {
+ m_forceUpdateAllAabbs = forceUpdateAllAabbs;
+ }
+
+ ///Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (Bullet/Demos/SerializeDemo)
+ virtual void serialize(btSerializer* serializer);
};
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
index 1dea91a0b0b..54889a6375d 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
@@ -114,8 +114,9 @@ public:
void ProcessChildShape(btCollisionShape* childShape,int index)
{
-
+ btAssert(index>=0);
btCompoundShape* compoundShape = static_cast<btCompoundShape*>(m_compoundColObj->getCollisionShape());
+ btAssert(index<compoundShape->getNumChildShapes());
//backup
@@ -142,6 +143,15 @@ public:
if (!m_childCollisionAlgorithms[index])
m_childCollisionAlgorithms[index] = m_dispatcher->findAlgorithm(m_compoundColObj,m_otherObj,m_sharedManifold);
+ ///detect swapping case
+ if (m_resultOut->getBody0Internal() == m_compoundColObj)
+ {
+ m_resultOut->setShapeIdentifiersA(-1,index);
+ } else
+ {
+ m_resultOut->setShapeIdentifiersB(-1,index);
+ }
+
m_childCollisionAlgorithms[index]->processCollision(m_compoundColObj,m_otherObj,m_dispatchInfo,m_resultOut);
if (m_dispatchInfo.m_debugDraw && (m_dispatchInfo.m_debugDraw->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
{
@@ -224,7 +234,7 @@ void btCompoundCollisionAlgorithm::processCollision (btCollisionObject* body0,bt
resultOut->setPersistentManifold(0);//??necessary?
}
}
- manifoldArray.clear();
+ manifoldArray.resize(0);
}
}
}
@@ -257,20 +267,24 @@ void btCompoundCollisionAlgorithm::processCollision (btCollisionObject* body0,bt
int numChildren = m_childCollisionAlgorithms.size();
int i;
btManifoldArray manifoldArray;
-
+ btCollisionShape* childShape = 0;
+ btTransform orgTrans;
+ btTransform orgInterpolationTrans;
+ btTransform newChildWorldTrans;
+ btVector3 aabbMin0,aabbMax0,aabbMin1,aabbMax1;
+
for (i=0;i<numChildren;i++)
{
if (m_childCollisionAlgorithms[i])
{
- btCollisionShape* childShape = compoundShape->getChildShape(i);
+ childShape = compoundShape->getChildShape(i);
//if not longer overlapping, remove the algorithm
- btTransform orgTrans = colObj->getWorldTransform();
- btTransform orgInterpolationTrans = colObj->getInterpolationWorldTransform();
+ orgTrans = colObj->getWorldTransform();
+ orgInterpolationTrans = colObj->getInterpolationWorldTransform();
const btTransform& childTrans = compoundShape->getChildTransform(i);
- btTransform newChildWorldTrans = orgTrans*childTrans ;
+ newChildWorldTrans = orgTrans*childTrans ;
//perform an AABB check first
- btVector3 aabbMin0,aabbMax0,aabbMin1,aabbMax1;
childShape->getAabb(newChildWorldTrans,aabbMin0,aabbMax0);
otherObj->getCollisionShape()->getAabb(otherObj->getWorldTransform(),aabbMin1,aabbMax1);
@@ -280,13 +294,8 @@ void btCompoundCollisionAlgorithm::processCollision (btCollisionObject* body0,bt
m_dispatcher->freeCollisionAlgorithm(m_childCollisionAlgorithms[i]);
m_childCollisionAlgorithms[i] = 0;
}
-
}
-
}
-
-
-
}
}
@@ -311,13 +320,15 @@ btScalar btCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject*
int numChildren = m_childCollisionAlgorithms.size();
int i;
+ btTransform orgTrans;
+ btScalar frac;
for (i=0;i<numChildren;i++)
{
//temporarily exchange parent btCollisionShape with childShape, and recurse
btCollisionShape* childShape = compoundShape->getChildShape(i);
//backup
- btTransform orgTrans = colObj->getWorldTransform();
+ orgTrans = colObj->getWorldTransform();
const btTransform& childTrans = compoundShape->getChildTransform(i);
//btTransform newChildWorldTrans = orgTrans*childTrans ;
@@ -325,7 +336,7 @@ btScalar btCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject*
btCollisionShape* tmpShape = colObj->getCollisionShape();
colObj->internalSetTemporaryCollisionShape( childShape );
- btScalar frac = m_childCollisionAlgorithms[i]->calculateTimeOfImpact(colObj,otherObj,dispatchInfo,resultOut);
+ frac = m_childCollisionAlgorithms[i]->calculateTimeOfImpact(colObj,otherObj,dispatchInfo,resultOut);
if (frac<hitFraction)
{
hitFraction = frac;
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp
new file mode 100644
index 00000000000..db7f884ac82
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp
@@ -0,0 +1,247 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#include "btConvex2dConvex2dAlgorithm.h"
+
+//#include <stdio.h>
+#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h"
+#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
+#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
+#include "BulletCollision/CollisionShapes/btConvexShape.h"
+#include "BulletCollision/CollisionShapes/btCapsuleShape.h"
+
+
+#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
+#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
+#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
+#include "BulletCollision/CollisionShapes/btBoxShape.h"
+#include "BulletCollision/CollisionDispatch/btManifoldResult.h"
+
+#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h"
+#include "BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h"
+#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h"
+#include "BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h"
+
+
+
+#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
+#include "BulletCollision/CollisionShapes/btSphereShape.h"
+
+#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h"
+
+#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h"
+#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
+
+
+btConvex2dConvex2dAlgorithm::CreateFunc::CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver)
+{
+ m_numPerturbationIterations = 0;
+ m_minimumPointsPerturbationThreshold = 3;
+ m_simplexSolver = simplexSolver;
+ m_pdSolver = pdSolver;
+}
+
+btConvex2dConvex2dAlgorithm::CreateFunc::~CreateFunc()
+{
+}
+
+btConvex2dConvex2dAlgorithm::btConvex2dConvex2dAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver,int numPerturbationIterations, int minimumPointsPerturbationThreshold)
+: btActivatingCollisionAlgorithm(ci,body0,body1),
+m_simplexSolver(simplexSolver),
+m_pdSolver(pdSolver),
+m_ownManifold (false),
+m_manifoldPtr(mf),
+m_lowLevelOfDetail(false),
+ m_numPerturbationIterations(numPerturbationIterations),
+m_minimumPointsPerturbationThreshold(minimumPointsPerturbationThreshold)
+{
+ (void)body0;
+ (void)body1;
+}
+
+
+
+
+btConvex2dConvex2dAlgorithm::~btConvex2dConvex2dAlgorithm()
+{
+ if (m_ownManifold)
+ {
+ if (m_manifoldPtr)
+ m_dispatcher->releaseManifold(m_manifoldPtr);
+ }
+}
+
+void btConvex2dConvex2dAlgorithm ::setLowLevelOfDetail(bool useLowLevel)
+{
+ m_lowLevelOfDetail = useLowLevel;
+}
+
+
+
+extern btScalar gContactBreakingThreshold;
+
+
+//
+// Convex-Convex collision algorithm
+//
+void btConvex2dConvex2dAlgorithm ::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+{
+
+ if (!m_manifoldPtr)
+ {
+ //swapped?
+ m_manifoldPtr = m_dispatcher->getNewManifold(body0,body1);
+ m_ownManifold = true;
+ }
+ resultOut->setPersistentManifold(m_manifoldPtr);
+
+ //comment-out next line to test multi-contact generation
+ //resultOut->getPersistentManifold()->clearManifold();
+
+
+ btConvexShape* min0 = static_cast<btConvexShape*>(body0->getCollisionShape());
+ btConvexShape* min1 = static_cast<btConvexShape*>(body1->getCollisionShape());
+
+ btVector3 normalOnB;
+ btVector3 pointOnBWorld;
+
+ {
+
+
+ btGjkPairDetector::ClosestPointInput input;
+
+ btGjkPairDetector gjkPairDetector(min0,min1,m_simplexSolver,m_pdSolver);
+ //TODO: if (dispatchInfo.m_useContinuous)
+ gjkPairDetector.setMinkowskiA(min0);
+ gjkPairDetector.setMinkowskiB(min1);
+
+ {
+ input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold();
+ input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared;
+ }
+
+ input.m_stackAlloc = dispatchInfo.m_stackAllocator;
+ input.m_transformA = body0->getWorldTransform();
+ input.m_transformB = body1->getWorldTransform();
+
+ gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
+
+ btVector3 v0,v1;
+ btVector3 sepNormalWorldSpace;
+
+ }
+
+ if (m_ownManifold)
+ {
+ resultOut->refreshContactPoints();
+ }
+
+}
+
+
+
+
+btScalar btConvex2dConvex2dAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+{
+ (void)resultOut;
+ (void)dispatchInfo;
+ ///Rather then checking ALL pairs, only calculate TOI when motion exceeds threshold
+
+ ///Linear motion for one of objects needs to exceed m_ccdSquareMotionThreshold
+ ///col0->m_worldTransform,
+ btScalar resultFraction = btScalar(1.);
+
+
+ btScalar squareMot0 = (col0->getInterpolationWorldTransform().getOrigin() - col0->getWorldTransform().getOrigin()).length2();
+ btScalar squareMot1 = (col1->getInterpolationWorldTransform().getOrigin() - col1->getWorldTransform().getOrigin()).length2();
+
+ if (squareMot0 < col0->getCcdSquareMotionThreshold() &&
+ squareMot1 < col1->getCcdSquareMotionThreshold())
+ return resultFraction;
+
+
+ //An adhoc way of testing the Continuous Collision Detection algorithms
+ //One object is approximated as a sphere, to simplify things
+ //Starting in penetration should report no time of impact
+ //For proper CCD, better accuracy and handling of 'allowed' penetration should be added
+ //also the mainloop of the physics should have a kind of toi queue (something like Brian Mirtich's application of Timewarp for Rigidbodies)
+
+
+ /// Convex0 against sphere for Convex1
+ {
+ btConvexShape* convex0 = static_cast<btConvexShape*>(col0->getCollisionShape());
+
+ btSphereShape sphere1(col1->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
+ btConvexCast::CastResult result;
+ btVoronoiSimplexSolver voronoiSimplex;
+ //SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex);
+ ///Simplification, one object is simplified as a sphere
+ btGjkConvexCast ccd1( convex0 ,&sphere1,&voronoiSimplex);
+ //ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0);
+ if (ccd1.calcTimeOfImpact(col0->getWorldTransform(),col0->getInterpolationWorldTransform(),
+ col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result))
+ {
+
+ //store result.m_fraction in both bodies
+
+ if (col0->getHitFraction()> result.m_fraction)
+ col0->setHitFraction( result.m_fraction );
+
+ if (col1->getHitFraction() > result.m_fraction)
+ col1->setHitFraction( result.m_fraction);
+
+ if (resultFraction > result.m_fraction)
+ resultFraction = result.m_fraction;
+
+ }
+
+
+
+
+ }
+
+ /// Sphere (for convex0) against Convex1
+ {
+ btConvexShape* convex1 = static_cast<btConvexShape*>(col1->getCollisionShape());
+
+ btSphereShape sphere0(col0->getCcdSweptSphereRadius()); //todo: allow non-zero sphere sizes, for better approximation
+ btConvexCast::CastResult result;
+ btVoronoiSimplexSolver voronoiSimplex;
+ //SubsimplexConvexCast ccd0(&sphere,min0,&voronoiSimplex);
+ ///Simplification, one object is simplified as a sphere
+ btGjkConvexCast ccd1(&sphere0,convex1,&voronoiSimplex);
+ //ContinuousConvexCollision ccd(min0,min1,&voronoiSimplex,0);
+ if (ccd1.calcTimeOfImpact(col0->getWorldTransform(),col0->getInterpolationWorldTransform(),
+ col1->getWorldTransform(),col1->getInterpolationWorldTransform(),result))
+ {
+
+ //store result.m_fraction in both bodies
+
+ if (col0->getHitFraction() > result.m_fraction)
+ col0->setHitFraction( result.m_fraction);
+
+ if (col1->getHitFraction() > result.m_fraction)
+ col1->setHitFraction( result.m_fraction);
+
+ if (resultFraction > result.m_fraction)
+ resultFraction = result.m_fraction;
+
+ }
+ }
+
+ return resultFraction;
+
+}
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h
new file mode 100644
index 00000000000..5738401401e
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.h
@@ -0,0 +1,95 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef CONVEX_2D_CONVEX_2D_ALGORITHM_H
+#define CONVEX_2D_CONVEX_2D_ALGORITHM_H
+
+#include "BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h"
+#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
+#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
+#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
+#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
+#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h"
+#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
+#include "LinearMath/btTransformUtil.h" //for btConvexSeparatingDistanceUtil
+
+class btConvexPenetrationDepthSolver;
+
+
+///The convex2dConvex2dAlgorithm collision algorithm support 2d collision detection for btConvex2dShape
+///Currently it requires the btMinkowskiPenetrationDepthSolver, it has support for 2d penetration depth computation
+class btConvex2dConvex2dAlgorithm : public btActivatingCollisionAlgorithm
+{
+ btSimplexSolverInterface* m_simplexSolver;
+ btConvexPenetrationDepthSolver* m_pdSolver;
+
+
+ bool m_ownManifold;
+ btPersistentManifold* m_manifoldPtr;
+ bool m_lowLevelOfDetail;
+
+ int m_numPerturbationIterations;
+ int m_minimumPointsPerturbationThreshold;
+
+public:
+
+ btConvex2dConvex2dAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver, int numPerturbationIterations, int minimumPointsPerturbationThreshold);
+
+
+ virtual ~btConvex2dConvex2dAlgorithm();
+
+ virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+
+ virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+
+ virtual void getAllContactManifolds(btManifoldArray& manifoldArray)
+ {
+ ///should we use m_ownManifold to avoid adding duplicates?
+ if (m_manifoldPtr && m_ownManifold)
+ manifoldArray.push_back(m_manifoldPtr);
+ }
+
+
+ void setLowLevelOfDetail(bool useLowLevel);
+
+
+ const btPersistentManifold* getManifold()
+ {
+ return m_manifoldPtr;
+ }
+
+ struct CreateFunc :public btCollisionAlgorithmCreateFunc
+ {
+
+ btConvexPenetrationDepthSolver* m_pdSolver;
+ btSimplexSolverInterface* m_simplexSolver;
+ int m_numPerturbationIterations;
+ int m_minimumPointsPerturbationThreshold;
+
+ CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver);
+
+ virtual ~CreateFunc();
+
+ virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
+ {
+ void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btConvex2dConvex2dAlgorithm));
+ return new(mem) btConvex2dConvex2dAlgorithm(ci.m_manifold,ci,body0,body1,m_simplexSolver,m_pdSolver,m_numPerturbationIterations,m_minimumPointsPerturbationThreshold);
+ }
+ };
+
+
+};
+
+#endif //CONVEX_2D_CONVEX_2D_ALGORITHM_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp
index cbc5530732b..268ec4b6c7e 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp
@@ -95,7 +95,7 @@ void btConvexTriangleCallback::processTriangle(btVector3* triangle,int partId, i
///debug drawing of the overlapping triangles
if (m_dispatchInfoPtr && m_dispatchInfoPtr->m_debugDraw && (m_dispatchInfoPtr->m_debugDraw->getDebugMode() &btIDebugDraw::DBG_DrawWireframe ))
{
- btVector3 color(255,255,0);
+ btVector3 color(1,1,0);
btTransform& tr = ob->getWorldTransform();
m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]),tr(triangle[1]),color);
m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]),tr(triangle[2]),color);
@@ -121,12 +121,16 @@ void btConvexTriangleCallback::processTriangle(btVector3* triangle,int partId, i
ob->internalSetTemporaryCollisionShape( &tm );
btCollisionAlgorithm* colAlgo = ci.m_dispatcher1->findAlgorithm(m_convexBody,m_triBody,m_manifoldPtr);
- ///this should use the btDispatcher, so the actual registered algorithm is used
- // btConvexConvexAlgorithm cvxcvxalgo(m_manifoldPtr,ci,m_convexBody,m_triBody);
- m_resultOut->setShapeIdentifiers(-1,-1,partId,triangleIndex);
- // cvxcvxalgo.setShapeIdentifiers(-1,-1,partId,triangleIndex);
-// cvxcvxalgo.processCollision(m_convexBody,m_triBody,*m_dispatchInfoPtr,m_resultOut);
+ if (m_resultOut->getBody0Internal() == m_triBody)
+ {
+ m_resultOut->setShapeIdentifiersA(partId,triangleIndex);
+ }
+ else
+ {
+ m_resultOut->setShapeIdentifiersB(partId,triangleIndex);
+ }
+
colAlgo->processCollision(m_convexBody,m_triBody,*m_dispatchInfoPtr,m_resultOut);
colAlgo->~btCollisionAlgorithm();
ci.m_dispatcher1->freeCollisionAlgorithm(colAlgo);
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
index 496fd996f8c..ede1afb2a03 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
@@ -13,6 +13,11 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+///Specialized capsule-capsule collision algorithm has been added for Bullet 2.75 release to increase ragdoll performance
+///If you experience problems with capsule-capsule collision, try to define BT_DISABLE_CAPSULE_CAPSULE_COLLIDER and report it in the Bullet forums
+///with reproduction case
+//define BT_DISABLE_CAPSULE_CAPSULE_COLLIDER 1
+
#include "btConvexConvexAlgorithm.h"
//#include <stdio.h>
@@ -20,6 +25,9 @@ subject to the following restrictions:
#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
#include "BulletCollision/CollisionShapes/btConvexShape.h"
+#include "BulletCollision/CollisionShapes/btCapsuleShape.h"
+
+
#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
@@ -43,8 +51,127 @@ subject to the following restrictions:
+///////////
+
+
+
+static SIMD_FORCE_INLINE void segmentsClosestPoints(
+ btVector3& ptsVector,
+ btVector3& offsetA,
+ btVector3& offsetB,
+ btScalar& tA, btScalar& tB,
+ const btVector3& translation,
+ const btVector3& dirA, btScalar hlenA,
+ const btVector3& dirB, btScalar hlenB )
+{
+ // compute the parameters of the closest points on each line segment
+
+ btScalar dirA_dot_dirB = btDot(dirA,dirB);
+ btScalar dirA_dot_trans = btDot(dirA,translation);
+ btScalar dirB_dot_trans = btDot(dirB,translation);
+
+ btScalar denom = 1.0f - dirA_dot_dirB * dirA_dot_dirB;
+
+ if ( denom == 0.0f ) {
+ tA = 0.0f;
+ } else {
+ tA = ( dirA_dot_trans - dirB_dot_trans * dirA_dot_dirB ) / denom;
+ if ( tA < -hlenA )
+ tA = -hlenA;
+ else if ( tA > hlenA )
+ tA = hlenA;
+ }
+
+ tB = tA * dirA_dot_dirB - dirB_dot_trans;
+
+ if ( tB < -hlenB ) {
+ tB = -hlenB;
+ tA = tB * dirA_dot_dirB + dirA_dot_trans;
+
+ if ( tA < -hlenA )
+ tA = -hlenA;
+ else if ( tA > hlenA )
+ tA = hlenA;
+ } else if ( tB > hlenB ) {
+ tB = hlenB;
+ tA = tB * dirA_dot_dirB + dirA_dot_trans;
+
+ if ( tA < -hlenA )
+ tA = -hlenA;
+ else if ( tA > hlenA )
+ tA = hlenA;
+ }
+
+ // compute the closest points relative to segment centers.
+
+ offsetA = dirA * tA;
+ offsetB = dirB * tB;
+
+ ptsVector = translation - offsetA + offsetB;
+}
+
+
+static SIMD_FORCE_INLINE btScalar capsuleCapsuleDistance(
+ btVector3& normalOnB,
+ btVector3& pointOnB,
+ btScalar capsuleLengthA,
+ btScalar capsuleRadiusA,
+ btScalar capsuleLengthB,
+ btScalar capsuleRadiusB,
+ int capsuleAxisA,
+ int capsuleAxisB,
+ const btTransform& transformA,
+ const btTransform& transformB,
+ btScalar distanceThreshold )
+{
+ btVector3 directionA = transformA.getBasis().getColumn(capsuleAxisA);
+ btVector3 translationA = transformA.getOrigin();
+ btVector3 directionB = transformB.getBasis().getColumn(capsuleAxisB);
+ btVector3 translationB = transformB.getOrigin();
+
+ // translation between centers
+
+ btVector3 translation = translationB - translationA;
+
+ // compute the closest points of the capsule line segments
+
+ btVector3 ptsVector; // the vector between the closest points
+
+ btVector3 offsetA, offsetB; // offsets from segment centers to their closest points
+ btScalar tA, tB; // parameters on line segment
+
+ segmentsClosestPoints( ptsVector, offsetA, offsetB, tA, tB, translation,
+ directionA, capsuleLengthA, directionB, capsuleLengthB );
+
+ btScalar distance = ptsVector.length() - capsuleRadiusA - capsuleRadiusB;
+
+ if ( distance > distanceThreshold )
+ return distance;
+
+ btScalar lenSqr = ptsVector.length2();
+ if (lenSqr<= (SIMD_EPSILON*SIMD_EPSILON))
+ {
+ //degenerate case where 2 capsules are likely at the same location: take a vector tangential to 'directionA'
+ btVector3 q;
+ btPlaneSpace1(directionA,normalOnB,q);
+ } else
+ {
+ // compute the contact normal
+ normalOnB = ptsVector*-btRecipSqrt(lenSqr);
+ }
+ pointOnB = transformB.getOrigin()+offsetB + normalOnB * capsuleRadiusB;
+
+ return distance;
+}
+
+
+
+
+
+//////////
+
@@ -69,7 +196,7 @@ m_ownManifold (false),
m_manifoldPtr(mf),
m_lowLevelOfDetail(false),
#ifdef USE_SEPDISTANCE_UTIL2
-,m_sepDistance((static_cast<btConvexShape*>(body0->getCollisionShape()))->getAngularMotionDisc(),
+m_sepDistance((static_cast<btConvexShape*>(body0->getCollisionShape()))->getAngularMotionDisc(),
(static_cast<btConvexShape*>(body1->getCollisionShape()))->getAngularMotionDisc()),
#endif
m_numPerturbationIterations(numPerturbationIterations),
@@ -111,8 +238,8 @@ struct btPerturbedContactResult : public btManifoldResult
:m_originalManifoldResult(originalResult),
m_transformA(transformA),
m_transformB(transformB),
- m_perturbA(perturbA),
m_unPerturbedTransform(unPerturbedTransform),
+ m_perturbA(perturbA),
m_debugDrawer(debugDrawer)
{
}
@@ -155,6 +282,7 @@ struct btPerturbedContactResult : public btManifoldResult
extern btScalar gContactBreakingThreshold;
+
//
// Convex-Convex collision algorithm
//
@@ -176,8 +304,39 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
btConvexShape* min0 = static_cast<btConvexShape*>(body0->getCollisionShape());
btConvexShape* min1 = static_cast<btConvexShape*>(body1->getCollisionShape());
+ btVector3 normalOnB;
+ btVector3 pointOnBWorld;
+#ifndef BT_DISABLE_CAPSULE_CAPSULE_COLLIDER
+ if ((min0->getShapeType() == CAPSULE_SHAPE_PROXYTYPE) && (min1->getShapeType() == CAPSULE_SHAPE_PROXYTYPE))
+ {
+ btCapsuleShape* capsuleA = (btCapsuleShape*) min0;
+ btCapsuleShape* capsuleB = (btCapsuleShape*) min1;
+ btVector3 localScalingA = capsuleA->getLocalScaling();
+ btVector3 localScalingB = capsuleB->getLocalScaling();
+
+ btScalar threshold = m_manifoldPtr->getContactBreakingThreshold();
+
+ btScalar dist = capsuleCapsuleDistance(normalOnB, pointOnBWorld,capsuleA->getHalfHeight(),capsuleA->getRadius(),
+ capsuleB->getHalfHeight(),capsuleB->getRadius(),capsuleA->getUpAxis(),capsuleB->getUpAxis(),
+ body0->getWorldTransform(),body1->getWorldTransform(),threshold);
+
+ if (dist<threshold)
+ {
+ btAssert(normalOnB.length2()>=(SIMD_EPSILON*SIMD_EPSILON));
+ resultOut->addContactPoint(normalOnB,pointOnBWorld,dist);
+ }
+ resultOut->refreshContactPoints();
+ return;
+ }
+#endif //BT_DISABLE_CAPSULE_CAPSULE_COLLIDER
+
+
#ifdef USE_SEPDISTANCE_UTIL2
- m_sepDistance.updateSeparatingDistance(body0->getWorldTransform(),body1->getWorldTransform());
+ if (dispatchInfo.m_useConvexConservativeDistanceUtil)
+ {
+ m_sepDistance.updateSeparatingDistance(body0->getWorldTransform(),body1->getWorldTransform());
+ }
+
if (!dispatchInfo.m_useConvexConservativeDistanceUtil || m_sepDistance.getConservativeSeparatingDistance()<=0.f)
#endif //USE_SEPDISTANCE_UTIL2
@@ -194,31 +353,55 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
#ifdef USE_SEPDISTANCE_UTIL2
if (dispatchInfo.m_useConvexConservativeDistanceUtil)
{
- input.m_maximumDistanceSquared = 1e30f;
+ input.m_maximumDistanceSquared = BT_LARGE_FLOAT;
} else
#endif //USE_SEPDISTANCE_UTIL2
{
- input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold();
+ if (dispatchInfo.m_convexMaxDistanceUseCPT)
+ {
+ input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactProcessingThreshold();
+ } else
+ {
+ input.m_maximumDistanceSquared = min0->getMargin() + min1->getMargin() + m_manifoldPtr->getContactBreakingThreshold();
+ }
input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared;
}
+ input.m_stackAlloc = dispatchInfo.m_stackAllocator;
input.m_transformA = body0->getWorldTransform();
input.m_transformB = body1->getWorldTransform();
gjkPairDetector.getClosestPoints(input,*resultOut,dispatchInfo.m_debugDraw);
- btScalar sepDist = gjkPairDetector.getCachedSeparatingDistance()+dispatchInfo.m_convexConservativeDistanceThreshold;
- //now perturbe directions to get multiple contact points
- btVector3 v0,v1;
- btVector3 sepNormalWorldSpace = gjkPairDetector.getCachedSeparatingAxis().normalized();
- btPlaneSpace1(sepNormalWorldSpace,v0,v1);
+
+
+#ifdef USE_SEPDISTANCE_UTIL2
+ btScalar sepDist = 0.f;
+ if (dispatchInfo.m_useConvexConservativeDistanceUtil)
+ {
+ sepDist = gjkPairDetector.getCachedSeparatingDistance();
+ if (sepDist>SIMD_EPSILON)
+ {
+ sepDist += dispatchInfo.m_convexConservativeDistanceThreshold;
+ //now perturbe directions to get multiple contact points
+
+ }
+ }
+#endif //USE_SEPDISTANCE_UTIL2
+
//now perform 'm_numPerturbationIterations' collision queries with the perturbated collision objects
//perform perturbation when more then 'm_minimumPointsPerturbationThreshold' points
- if (resultOut->getPersistentManifold()->getNumContacts() < m_minimumPointsPerturbationThreshold)
+ if (m_numPerturbationIterations && resultOut->getPersistentManifold()->getNumContacts() < m_minimumPointsPerturbationThreshold)
{
int i;
+ btVector3 v0,v1;
+ btVector3 sepNormalWorldSpace;
+
+ sepNormalWorldSpace = gjkPairDetector.getCachedSeparatingAxis().normalized();
+ btPlaneSpace1(sepNormalWorldSpace,v0,v1);
+
bool perturbeA = true;
const btScalar angleLimit = 0.125f * SIMD_PI;
@@ -248,6 +431,8 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
for ( i=0;i<m_numPerturbationIterations;i++)
{
+ if (v0.length2()>SIMD_EPSILON)
+ {
btQuaternion perturbeRot(v0,perturbeAngle);
btScalar iterationAngle = i*(SIMD_2_PI/btScalar(m_numPerturbationIterations));
btQuaternion rotq(sepNormalWorldSpace,iterationAngle);
@@ -271,7 +456,7 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
btPerturbedContactResult perturbedResultOut(resultOut,input.m_transformA,input.m_transformB,unPerturbedTransform,perturbeA,dispatchInfo.m_debugDraw);
gjkPairDetector.getClosestPoints(input,perturbedResultOut,dispatchInfo.m_debugDraw);
-
+ }
}
}
@@ -279,7 +464,7 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
#ifdef USE_SEPDISTANCE_UTIL2
- if (dispatchInfo.m_useConvexConservativeDistanceUtil)
+ if (dispatchInfo.m_useConvexConservativeDistanceUtil && (sepDist>SIMD_EPSILON))
{
m_sepDistance.initSeparatingDistance(gjkPairDetector.getCachedSeparatingAxis(),sepDist,body0->getWorldTransform(),body1->getWorldTransform());
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
index 62dd33eb98d..d38aff6862c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
@@ -31,7 +31,8 @@ class btConvexPenetrationDepthSolver;
///so the distance is not conservative. In that case, enabling this USE_SEPDISTANCE_UTIL2 would result in failing/missing collisions.
///Either improve GJK for large size ratios (testing a 100 units versus a 0.1 unit object) or only enable the util
///for certain pairs that have a small size ratio
-///#define USE_SEPDISTANCE_UTIL2 1
+
+//#define USE_SEPDISTANCE_UTIL2 1
///The convexConvexAlgorithm collision algorithm implements time of impact, convex closest points and penetration depth calculations between two convex objects.
///Multiple contact points are calculated by perturbing the orientation of the smallest object orthogonal to the separating normal.
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp
index a7b3b163d66..dda85dc693f 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp
@@ -102,9 +102,9 @@ void btConvexPlaneCollisionAlgorithm::processCollision (btCollisionObject* body0
btConvexShape* convexShape = (btConvexShape*) convexObj->getCollisionShape();
btStaticPlaneShape* planeShape = (btStaticPlaneShape*) planeObj->getCollisionShape();
- bool hasCollision = false;
+
const btVector3& planeNormal = planeShape->getPlaneNormal();
- const btScalar& planeConstant = planeShape->getPlaneConstant();
+ //const btScalar& planeConstant = planeShape->getPlaneConstant();
//first perform a collision query with the non-perturbated collision objects
{
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h
index 368ca71dda0..f49ac45e772 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h
@@ -60,8 +60,8 @@ public:
int m_minimumPointsPerturbationThreshold;
CreateFunc()
- : m_numPerturbationIterations(3),
- m_minimumPointsPerturbationThreshold(3)
+ : m_numPerturbationIterations(1),
+ m_minimumPointsPerturbationThreshold(1)
{
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp
index 3ae25f109c2..c27d8ce0752 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp
@@ -45,17 +45,17 @@ btDefaultCollisionConfiguration::btDefaultCollisionConfiguration(const btDefault
void* mem = btAlignedAlloc(sizeof(btVoronoiSimplexSolver),16);
m_simplexSolver = new (mem)btVoronoiSimplexSolver();
-
-#define USE_EPA 1
-#ifdef USE_EPA
- mem = btAlignedAlloc(sizeof(btGjkEpaPenetrationDepthSolver),16);
- m_pdSolver = new (mem)btGjkEpaPenetrationDepthSolver;
-#else
- mem = btAlignedAlloc(sizeof(btMinkowskiPenetrationDepthSolver),16);
- m_pdSolver = new (mem)btMinkowskiPenetrationDepthSolver;
-#endif//USE_EPA
-
+ if (constructionInfo.m_useEpaPenetrationAlgorithm)
+ {
+ mem = btAlignedAlloc(sizeof(btGjkEpaPenetrationDepthSolver),16);
+ m_pdSolver = new (mem)btGjkEpaPenetrationDepthSolver;
+ }else
+ {
+ mem = btAlignedAlloc(sizeof(btMinkowskiPenetrationDepthSolver),16);
+ m_pdSolver = new (mem)btMinkowskiPenetrationDepthSolver;
+ }
+
//default CreationFunctions, filling the m_doubleDispatch table
mem = btAlignedAlloc(sizeof(btConvexConvexAlgorithm::CreateFunc),16);
m_convexConvexCreateFunc = new(mem) btConvexConvexAlgorithm::CreateFunc(m_simplexSolver,m_pdSolver);
@@ -102,7 +102,8 @@ btDefaultCollisionConfiguration::btDefaultCollisionConfiguration(const btDefault
int maxSize3 = sizeof(btCompoundCollisionAlgorithm);
int sl = sizeof(btConvexSeparatingDistanceUtil);
sl = sizeof(btGjkPairDetector);
- int collisionAlgorithmMaxElementSize = btMax(maxSize,maxSize2);
+ int collisionAlgorithmMaxElementSize = btMax(maxSize,constructionInfo.m_customCollisionAlgorithmMaxElementSize);
+ collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize2);
collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize3);
if (constructionInfo.m_stackAlloc)
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h
index 6d8cab726bd..6aa0d8c270f 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h
@@ -27,7 +27,9 @@ struct btDefaultCollisionConstructionInfo
btPoolAllocator* m_collisionAlgorithmPool;
int m_defaultMaxPersistentManifoldPoolSize;
int m_defaultMaxCollisionAlgorithmPoolSize;
+ int m_customCollisionAlgorithmMaxElementSize;
int m_defaultStackAllocatorSize;
+ int m_useEpaPenetrationAlgorithm;
btDefaultCollisionConstructionInfo()
:m_stackAlloc(0),
@@ -35,7 +37,9 @@ struct btDefaultCollisionConstructionInfo
m_collisionAlgorithmPool(0),
m_defaultMaxPersistentManifoldPoolSize(4096),
m_defaultMaxCollisionAlgorithmPoolSize(4096),
- m_defaultStackAllocatorSize(0)
+ m_customCollisionAlgorithmMaxElementSize(0),
+ m_defaultStackAllocatorSize(0),
+ m_useEpaPenetrationAlgorithm(true)
{
}
};
@@ -108,6 +112,11 @@ public:
return m_stackAlloc;
}
+ virtual btVoronoiSimplexSolver* getSimplexSolver()
+ {
+ return m_simplexSolver;
+ }
+
virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1);
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btGhostObject.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btGhostObject.h
index 95b5750240c..8ec86138575 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btGhostObject.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btGhostObject.h
@@ -160,7 +160,7 @@ public:
return 0;
}
- virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy0,btDispatcher* dispatcher)
+ virtual void removeOverlappingPairsContainingProxy(btBroadphaseProxy* /*proxy0*/,btDispatcher* /*dispatcher*/)
{
btAssert(0);
//need to keep track of all ghost objects and call them here
@@ -171,4 +171,5 @@ public:
};
-#endif \ No newline at end of file
+#endif
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp
new file mode 100644
index 00000000000..5cceb04dbb4
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp
@@ -0,0 +1,772 @@
+#include "btInternalEdgeUtility.h"
+
+#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h"
+#include "BulletCollision/CollisionShapes/btTriangleShape.h"
+#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
+#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h"
+#include "LinearMath/btIDebugDraw.h"
+
+
+//#define DEBUG_INTERNAL_EDGE
+
+
+#ifdef DEBUG_INTERNAL_EDGE
+#include <stdio.h>
+#endif //DEBUG_INTERNAL_EDGE
+
+
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+static btIDebugDraw* gDebugDrawer = 0;
+
+void btSetDebugDrawer(btIDebugDraw* debugDrawer)
+{
+ gDebugDrawer = debugDrawer;
+}
+
+static void btDebugDrawLine(const btVector3& from,const btVector3& to, const btVector3& color)
+{
+ if (gDebugDrawer)
+ gDebugDrawer->drawLine(from,to,color);
+}
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+
+static int btGetHash(int partId, int triangleIndex)
+{
+ int hash = (partId<<(31-MAX_NUM_PARTS_IN_BITS)) | triangleIndex;
+ return hash;
+}
+
+
+
+static btScalar btGetAngle(const btVector3& edgeA, const btVector3& normalA,const btVector3& normalB)
+{
+ const btVector3 refAxis0 = edgeA;
+ const btVector3 refAxis1 = normalA;
+ const btVector3 swingAxis = normalB;
+ btScalar angle = btAtan2(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1));
+ return angle;
+}
+
+
+struct btConnectivityProcessor : public btTriangleCallback
+{
+ int m_partIdA;
+ int m_triangleIndexA;
+ btVector3* m_triangleVerticesA;
+ btTriangleInfoMap* m_triangleInfoMap;
+
+
+ virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
+ {
+ //skip self-collisions
+ if ((m_partIdA == partId) && (m_triangleIndexA == triangleIndex))
+ return;
+
+ //skip duplicates (disabled for now)
+ //if ((m_partIdA <= partId) && (m_triangleIndexA <= triangleIndex))
+ // return;
+
+ //search for shared vertices and edges
+ int numshared = 0;
+ int sharedVertsA[3]={-1,-1,-1};
+ int sharedVertsB[3]={-1,-1,-1};
+
+ ///skip degenerate triangles
+ btScalar crossBSqr = ((triangle[1]-triangle[0]).cross(triangle[2]-triangle[0])).length2();
+ if (crossBSqr < m_triangleInfoMap->m_equalVertexThreshold)
+ return;
+
+
+ btScalar crossASqr = ((m_triangleVerticesA[1]-m_triangleVerticesA[0]).cross(m_triangleVerticesA[2]-m_triangleVerticesA[0])).length2();
+ ///skip degenerate triangles
+ if (crossASqr< m_triangleInfoMap->m_equalVertexThreshold)
+ return;
+
+#if 0
+ printf("triangle A[0] = (%f,%f,%f)\ntriangle A[1] = (%f,%f,%f)\ntriangle A[2] = (%f,%f,%f)\n",
+ m_triangleVerticesA[0].getX(),m_triangleVerticesA[0].getY(),m_triangleVerticesA[0].getZ(),
+ m_triangleVerticesA[1].getX(),m_triangleVerticesA[1].getY(),m_triangleVerticesA[1].getZ(),
+ m_triangleVerticesA[2].getX(),m_triangleVerticesA[2].getY(),m_triangleVerticesA[2].getZ());
+
+ printf("partId=%d, triangleIndex=%d\n",partId,triangleIndex);
+ printf("triangle B[0] = (%f,%f,%f)\ntriangle B[1] = (%f,%f,%f)\ntriangle B[2] = (%f,%f,%f)\n",
+ triangle[0].getX(),triangle[0].getY(),triangle[0].getZ(),
+ triangle[1].getX(),triangle[1].getY(),triangle[1].getZ(),
+ triangle[2].getX(),triangle[2].getY(),triangle[2].getZ());
+#endif
+
+ for (int i=0;i<3;i++)
+ {
+ for (int j=0;j<3;j++)
+ {
+ if ( (m_triangleVerticesA[i]-triangle[j]).length2() < m_triangleInfoMap->m_equalVertexThreshold)
+ {
+ sharedVertsA[numshared] = i;
+ sharedVertsB[numshared] = j;
+ numshared++;
+ ///degenerate case
+ if(numshared >= 3)
+ return;
+ }
+ }
+ ///degenerate case
+ if(numshared >= 3)
+ return;
+ }
+ switch (numshared)
+ {
+ case 0:
+ {
+ break;
+ }
+ case 1:
+ {
+ //shared vertex
+ break;
+ }
+ case 2:
+ {
+ //shared edge
+ //we need to make sure the edge is in the order V2V0 and not V0V2 so that the signs are correct
+ if (sharedVertsA[0] == 0 && sharedVertsA[1] == 2)
+ {
+ sharedVertsA[0] = 2;
+ sharedVertsA[1] = 0;
+ int tmp = sharedVertsB[1];
+ sharedVertsB[1] = sharedVertsB[0];
+ sharedVertsB[0] = tmp;
+ }
+
+ int hash = btGetHash(m_partIdA,m_triangleIndexA);
+
+ btTriangleInfo* info = m_triangleInfoMap->find(hash);
+ if (!info)
+ {
+ btTriangleInfo tmp;
+ m_triangleInfoMap->insert(hash,tmp);
+ info = m_triangleInfoMap->find(hash);
+ }
+
+ int sumvertsA = sharedVertsA[0]+sharedVertsA[1];
+ int otherIndexA = 3-sumvertsA;
+
+
+ btVector3 edge(m_triangleVerticesA[sharedVertsA[1]]-m_triangleVerticesA[sharedVertsA[0]]);
+
+ btTriangleShape tA(m_triangleVerticesA[0],m_triangleVerticesA[1],m_triangleVerticesA[2]);
+ int otherIndexB = 3-(sharedVertsB[0]+sharedVertsB[1]);
+
+ btTriangleShape tB(triangle[sharedVertsB[1]],triangle[sharedVertsB[0]],triangle[otherIndexB]);
+ //btTriangleShape tB(triangle[0],triangle[1],triangle[2]);
+
+ btVector3 normalA;
+ btVector3 normalB;
+ tA.calcNormal(normalA);
+ tB.calcNormal(normalB);
+ edge.normalize();
+ btVector3 edgeCrossA = edge.cross(normalA).normalize();
+
+ {
+ btVector3 tmp = m_triangleVerticesA[otherIndexA]-m_triangleVerticesA[sharedVertsA[0]];
+ if (edgeCrossA.dot(tmp) < 0)
+ {
+ edgeCrossA*=-1;
+ }
+ }
+
+ btVector3 edgeCrossB = edge.cross(normalB).normalize();
+
+ {
+ btVector3 tmp = triangle[otherIndexB]-triangle[sharedVertsB[0]];
+ if (edgeCrossB.dot(tmp) < 0)
+ {
+ edgeCrossB*=-1;
+ }
+ }
+
+ btScalar angle2 = 0;
+ btScalar ang4 = 0.f;
+
+
+ btVector3 calculatedEdge = edgeCrossA.cross(edgeCrossB);
+ btScalar len2 = calculatedEdge.length2();
+
+ btScalar correctedAngle(0);
+ btVector3 calculatedNormalB = normalA;
+ bool isConvex = false;
+
+ if (len2<m_triangleInfoMap->m_planarEpsilon)
+ {
+ angle2 = 0.f;
+ ang4 = 0.f;
+ } else
+ {
+
+ calculatedEdge.normalize();
+ btVector3 calculatedNormalA = calculatedEdge.cross(edgeCrossA);
+ calculatedNormalA.normalize();
+ angle2 = btGetAngle(calculatedNormalA,edgeCrossA,edgeCrossB);
+ ang4 = SIMD_PI-angle2;
+ btScalar dotA = normalA.dot(edgeCrossB);
+ ///@todo: check if we need some epsilon, due to floating point imprecision
+ isConvex = (dotA<0.);
+
+ correctedAngle = isConvex ? ang4 : -ang4;
+ btQuaternion orn2(calculatedEdge,-correctedAngle);
+ calculatedNormalB = btMatrix3x3(orn2)*normalA;
+
+
+ }
+
+
+
+
+
+ //alternatively use
+ //btVector3 calculatedNormalB2 = quatRotate(orn,normalA);
+
+
+ switch (sumvertsA)
+ {
+ case 1:
+ {
+ btVector3 edge = m_triangleVerticesA[0]-m_triangleVerticesA[1];
+ btQuaternion orn(edge,-correctedAngle);
+ btVector3 computedNormalB = quatRotate(orn,normalA);
+ btScalar bla = computedNormalB.dot(normalB);
+ if (bla<0)
+ {
+ computedNormalB*=-1;
+ info->m_flags |= TRI_INFO_V0V1_SWAP_NORMALB;
+ }
+#ifdef DEBUG_INTERNAL_EDGE
+ if ((computedNormalB-normalB).length()>0.0001)
+ {
+ printf("warning: normals not identical\n");
+ }
+#endif//DEBUG_INTERNAL_EDGE
+
+ info->m_edgeV0V1Angle = -correctedAngle;
+
+ if (isConvex)
+ info->m_flags |= TRI_INFO_V0V1_CONVEX;
+ break;
+ }
+ case 2:
+ {
+ btVector3 edge = m_triangleVerticesA[2]-m_triangleVerticesA[0];
+ btQuaternion orn(edge,-correctedAngle);
+ btVector3 computedNormalB = quatRotate(orn,normalA);
+ if (computedNormalB.dot(normalB)<0)
+ {
+ computedNormalB*=-1;
+ info->m_flags |= TRI_INFO_V2V0_SWAP_NORMALB;
+ }
+
+#ifdef DEBUG_INTERNAL_EDGE
+ if ((computedNormalB-normalB).length()>0.0001)
+ {
+ printf("warning: normals not identical\n");
+ }
+#endif //DEBUG_INTERNAL_EDGE
+ info->m_edgeV2V0Angle = -correctedAngle;
+ if (isConvex)
+ info->m_flags |= TRI_INFO_V2V0_CONVEX;
+ break;
+ }
+ case 3:
+ {
+ btVector3 edge = m_triangleVerticesA[1]-m_triangleVerticesA[2];
+ btQuaternion orn(edge,-correctedAngle);
+ btVector3 computedNormalB = quatRotate(orn,normalA);
+ if (computedNormalB.dot(normalB)<0)
+ {
+ info->m_flags |= TRI_INFO_V1V2_SWAP_NORMALB;
+ computedNormalB*=-1;
+ }
+#ifdef DEBUG_INTERNAL_EDGE
+ if ((computedNormalB-normalB).length()>0.0001)
+ {
+ printf("warning: normals not identical\n");
+ }
+#endif //DEBUG_INTERNAL_EDGE
+ info->m_edgeV1V2Angle = -correctedAngle;
+
+ if (isConvex)
+ info->m_flags |= TRI_INFO_V1V2_CONVEX;
+ break;
+ }
+ }
+
+ break;
+ }
+ default:
+ {
+ // printf("warning: duplicate triangle\n");
+ }
+
+ }
+ }
+};
+/////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////
+
+void btGenerateInternalEdgeInfo (btBvhTriangleMeshShape*trimeshShape, btTriangleInfoMap* triangleInfoMap)
+{
+ //the user pointer shouldn't already be used for other purposes, we intend to store connectivity info there!
+ if (trimeshShape->getTriangleInfoMap())
+ return;
+
+ trimeshShape->setTriangleInfoMap(triangleInfoMap);
+
+ btStridingMeshInterface* meshInterface = trimeshShape->getMeshInterface();
+ const btVector3& meshScaling = meshInterface->getScaling();
+
+ for (int partId = 0; partId< meshInterface->getNumSubParts();partId++)
+ {
+ const unsigned char *vertexbase = 0;
+ int numverts = 0;
+ PHY_ScalarType type = PHY_INTEGER;
+ int stride = 0;
+ const unsigned char *indexbase = 0;
+ int indexstride = 0;
+ int numfaces = 0;
+ PHY_ScalarType indicestype = PHY_INTEGER;
+ //PHY_ScalarType indexType=0;
+
+ btVector3 triangleVerts[3];
+ meshInterface->getLockedReadOnlyVertexIndexBase(&vertexbase,numverts, type,stride,&indexbase,indexstride,numfaces,indicestype,partId);
+ btVector3 aabbMin,aabbMax;
+
+ for (int triangleIndex = 0 ; triangleIndex < numfaces;triangleIndex++)
+ {
+ unsigned int* gfxbase = (unsigned int*)(indexbase+triangleIndex*indexstride);
+
+ for (int j=2;j>=0;j--)
+ {
+
+ int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j];
+ if (type == PHY_FLOAT)
+ {
+ float* graphicsbase = (float*)(vertexbase+graphicsindex*stride);
+ triangleVerts[j] = btVector3(
+ graphicsbase[0]*meshScaling.getX(),
+ graphicsbase[1]*meshScaling.getY(),
+ graphicsbase[2]*meshScaling.getZ());
+ }
+ else
+ {
+ double* graphicsbase = (double*)(vertexbase+graphicsindex*stride);
+ triangleVerts[j] = btVector3( btScalar(graphicsbase[0]*meshScaling.getX()), btScalar(graphicsbase[1]*meshScaling.getY()), btScalar(graphicsbase[2]*meshScaling.getZ()));
+ }
+ }
+ aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+ aabbMin.setMin(triangleVerts[0]);
+ aabbMax.setMax(triangleVerts[0]);
+ aabbMin.setMin(triangleVerts[1]);
+ aabbMax.setMax(triangleVerts[1]);
+ aabbMin.setMin(triangleVerts[2]);
+ aabbMax.setMax(triangleVerts[2]);
+
+ btConnectivityProcessor connectivityProcessor;
+ connectivityProcessor.m_partIdA = partId;
+ connectivityProcessor.m_triangleIndexA = triangleIndex;
+ connectivityProcessor.m_triangleVerticesA = &triangleVerts[0];
+ connectivityProcessor.m_triangleInfoMap = triangleInfoMap;
+
+ trimeshShape->processAllTriangles(&connectivityProcessor,aabbMin,aabbMax);
+ }
+
+ }
+
+}
+
+
+
+
+// Given a point and a line segment (defined by two points), compute the closest point
+// in the line. Cap the point at the endpoints of the line segment.
+void btNearestPointInLineSegment(const btVector3 &point, const btVector3& line0, const btVector3& line1, btVector3& nearestPoint)
+{
+ btVector3 lineDelta = line1 - line0;
+
+ // Handle degenerate lines
+ if ( lineDelta.fuzzyZero())
+ {
+ nearestPoint = line0;
+ }
+ else
+ {
+ btScalar delta = (point-line0).dot(lineDelta) / (lineDelta).dot(lineDelta);
+
+ // Clamp the point to conform to the segment's endpoints
+ if ( delta < 0 )
+ delta = 0;
+ else if ( delta > 1 )
+ delta = 1;
+
+ nearestPoint = line0 + lineDelta*delta;
+ }
+}
+
+
+
+
+bool btClampNormal(const btVector3& edge,const btVector3& tri_normal_org,const btVector3& localContactNormalOnB, btScalar correctedEdgeAngle, btVector3 & clampedLocalNormal)
+{
+ btVector3 tri_normal = tri_normal_org;
+ //we only have a local triangle normal, not a local contact normal -> only normal in world space...
+ //either compute the current angle all in local space, or all in world space
+
+ btVector3 edgeCross = edge.cross(tri_normal).normalize();
+ btScalar curAngle = btGetAngle(edgeCross,tri_normal,localContactNormalOnB);
+
+ if (correctedEdgeAngle<0)
+ {
+ if (curAngle < correctedEdgeAngle)
+ {
+ btScalar diffAngle = correctedEdgeAngle-curAngle;
+ btQuaternion rotation(edge,diffAngle );
+ clampedLocalNormal = btMatrix3x3(rotation)*localContactNormalOnB;
+ return true;
+ }
+ }
+
+ if (correctedEdgeAngle>=0)
+ {
+ if (curAngle > correctedEdgeAngle)
+ {
+ btScalar diffAngle = correctedEdgeAngle-curAngle;
+ btQuaternion rotation(edge,diffAngle );
+ clampedLocalNormal = btMatrix3x3(rotation)*localContactNormalOnB;
+ return true;
+ }
+ }
+ return false;
+}
+
+
+
+/// Changes a btManifoldPoint collision normal to the normal from the mesh.
+void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject* colObj0,const btCollisionObject* colObj1, int partId0, int index0, int normalAdjustFlags)
+{
+ //btAssert(colObj0->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE);
+ if (colObj0->getCollisionShape()->getShapeType() != TRIANGLE_SHAPE_PROXYTYPE)
+ return;
+
+ btBvhTriangleMeshShape* trimesh = (btBvhTriangleMeshShape*)colObj0->getRootCollisionShape();
+ btTriangleInfoMap* triangleInfoMapPtr = (btTriangleInfoMap*) trimesh->getTriangleInfoMap();
+ if (!triangleInfoMapPtr)
+ return;
+
+ int hash = btGetHash(partId0,index0);
+
+
+ btTriangleInfo* info = triangleInfoMapPtr->find(hash);
+ if (!info)
+ return;
+
+ btScalar frontFacing = (normalAdjustFlags & BT_TRIANGLE_CONVEX_BACKFACE_MODE)==0? 1.f : -1.f;
+
+ const btTriangleShape* tri_shape = static_cast<const btTriangleShape*>(colObj0->getCollisionShape());
+ btVector3 v0,v1,v2;
+ tri_shape->getVertex(0,v0);
+ tri_shape->getVertex(1,v1);
+ tri_shape->getVertex(2,v2);
+
+ btVector3 center = (v0+v1+v2)*btScalar(1./3.);
+
+ btVector3 red(1,0,0), green(0,1,0),blue(0,0,1),white(1,1,1),black(0,0,0);
+ btVector3 tri_normal;
+ tri_shape->calcNormal(tri_normal);
+
+ //btScalar dot = tri_normal.dot(cp.m_normalWorldOnB);
+ btVector3 nearest;
+ btNearestPointInLineSegment(cp.m_localPointB,v0,v1,nearest);
+
+ btVector3 contact = cp.m_localPointB;
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ const btTransform& tr = colObj0->getWorldTransform();
+ btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,red);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+
+
+ bool isNearEdge = false;
+
+ int numConcaveEdgeHits = 0;
+ int numConvexEdgeHits = 0;
+
+ btVector3 localContactNormalOnB = colObj0->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB;
+ localContactNormalOnB.normalize();//is this necessary?
+
+ if ((info->m_edgeV0V1Angle)< SIMD_2_PI)
+ {
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black);
+#endif
+ btScalar len = (contact-nearest).length();
+ if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
+ {
+ btVector3 edge(v0-v1);
+ isNearEdge = true;
+
+ if (info->m_edgeV0V1Angle==btScalar(0))
+ {
+ numConcaveEdgeHits++;
+ } else
+ {
+
+ bool isEdgeConvex = (info->m_flags & TRI_INFO_V0V1_CONVEX);
+ btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1);
+ #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
+ #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+ btVector3 nA = swapFactor * tri_normal;
+
+ btQuaternion orn(edge,info->m_edgeV0V1Angle);
+ btVector3 computedNormalB = quatRotate(orn,tri_normal);
+ if (info->m_flags & TRI_INFO_V0V1_SWAP_NORMALB)
+ computedNormalB*=-1;
+ btVector3 nB = swapFactor*computedNormalB;
+
+ btScalar NdotA = localContactNormalOnB.dot(nA);
+ btScalar NdotB = localContactNormalOnB.dot(nB);
+ bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
+
+#ifdef DEBUG_INTERNAL_EDGE
+ {
+
+ btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red);
+ }
+#endif //DEBUG_INTERNAL_EDGE
+
+
+ if (backFacingNormal)
+ {
+ numConcaveEdgeHits++;
+ }
+ else
+ {
+ numConvexEdgeHits++;
+ btVector3 clampedLocalNormal;
+ bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV0V1Angle,clampedLocalNormal);
+ if (isClamped)
+ {
+ if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0))
+ {
+ btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal;
+ // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
+ cp.m_normalWorldOnB = newNormal;
+ // Reproject collision point along normal. (what about cp.m_distance1?)
+ cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
+ cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB);
+
+ }
+ }
+ }
+ }
+ }
+ }
+
+ btNearestPointInLineSegment(contact,v1,v2,nearest);
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,green);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+ if ((info->m_edgeV1V2Angle)< SIMD_2_PI)
+ {
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+
+
+ btScalar len = (contact-nearest).length();
+ if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
+ {
+ isNearEdge = true;
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+ btVector3 edge(v1-v2);
+
+ isNearEdge = true;
+
+ if (info->m_edgeV1V2Angle == btScalar(0))
+ {
+ numConcaveEdgeHits++;
+ } else
+ {
+ bool isEdgeConvex = (info->m_flags & TRI_INFO_V1V2_CONVEX)!=0;
+ btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1);
+ #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
+ #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+ btVector3 nA = swapFactor * tri_normal;
+
+ btQuaternion orn(edge,info->m_edgeV1V2Angle);
+ btVector3 computedNormalB = quatRotate(orn,tri_normal);
+ if (info->m_flags & TRI_INFO_V1V2_SWAP_NORMALB)
+ computedNormalB*=-1;
+ btVector3 nB = swapFactor*computedNormalB;
+
+#ifdef DEBUG_INTERNAL_EDGE
+ {
+ btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red);
+ }
+#endif //DEBUG_INTERNAL_EDGE
+
+
+ btScalar NdotA = localContactNormalOnB.dot(nA);
+ btScalar NdotB = localContactNormalOnB.dot(nB);
+ bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
+
+ if (backFacingNormal)
+ {
+ numConcaveEdgeHits++;
+ }
+ else
+ {
+ numConvexEdgeHits++;
+ btVector3 localContactNormalOnB = colObj0->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB;
+ btVector3 clampedLocalNormal;
+ bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB, info->m_edgeV1V2Angle,clampedLocalNormal);
+ if (isClamped)
+ {
+ if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0))
+ {
+ btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal;
+ // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
+ cp.m_normalWorldOnB = newNormal;
+ // Reproject collision point along normal.
+ cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
+ cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ btNearestPointInLineSegment(contact,v2,v0,nearest);
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr*nearest,tr*cp.m_localPointB,blue);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+ if ((info->m_edgeV2V0Angle)< SIMD_2_PI)
+ {
+
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr*contact,tr*(contact+cp.m_normalWorldOnB*10),black);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+ btScalar len = (contact-nearest).length();
+ if(len<triangleInfoMapPtr->m_edgeDistanceThreshold)
+ {
+ isNearEdge = true;
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr*nearest,tr*(nearest+tri_normal*10),white);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+ btVector3 edge(v2-v0);
+
+ if (info->m_edgeV2V0Angle==btScalar(0))
+ {
+ numConcaveEdgeHits++;
+ } else
+ {
+
+ bool isEdgeConvex = (info->m_flags & TRI_INFO_V2V0_CONVEX)!=0;
+ btScalar swapFactor = isEdgeConvex ? btScalar(1) : btScalar(-1);
+ #ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+ btDebugDrawLine(tr*nearest,tr*(nearest+swapFactor*tri_normal*10),white);
+ #endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+ btVector3 nA = swapFactor * tri_normal;
+ btQuaternion orn(edge,info->m_edgeV2V0Angle);
+ btVector3 computedNormalB = quatRotate(orn,tri_normal);
+ if (info->m_flags & TRI_INFO_V2V0_SWAP_NORMALB)
+ computedNormalB*=-1;
+ btVector3 nB = swapFactor*computedNormalB;
+
+#ifdef DEBUG_INTERNAL_EDGE
+ {
+ btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+tr.getBasis()*(nB*20),red);
+ }
+#endif //DEBUG_INTERNAL_EDGE
+
+ btScalar NdotA = localContactNormalOnB.dot(nA);
+ btScalar NdotB = localContactNormalOnB.dot(nB);
+ bool backFacingNormal = (NdotA< triangleInfoMapPtr->m_convexEpsilon) && (NdotB<triangleInfoMapPtr->m_convexEpsilon);
+
+ if (backFacingNormal)
+ {
+ numConcaveEdgeHits++;
+ }
+ else
+ {
+ numConvexEdgeHits++;
+ // printf("hitting convex edge\n");
+
+
+ btVector3 localContactNormalOnB = colObj0->getWorldTransform().getBasis().transpose() * cp.m_normalWorldOnB;
+ btVector3 clampedLocalNormal;
+ bool isClamped = btClampNormal(edge,swapFactor*tri_normal,localContactNormalOnB,info->m_edgeV2V0Angle,clampedLocalNormal);
+ if (isClamped)
+ {
+ if (((normalAdjustFlags & BT_TRIANGLE_CONVEX_DOUBLE_SIDED)!=0) || (clampedLocalNormal.dot(frontFacing*tri_normal)>0))
+ {
+ btVector3 newNormal = colObj0->getWorldTransform().getBasis() * clampedLocalNormal;
+ // cp.m_distance1 = cp.m_distance1 * newNormal.dot(cp.m_normalWorldOnB);
+ cp.m_normalWorldOnB = newNormal;
+ // Reproject collision point along normal.
+ cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
+ cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB);
+ }
+ }
+ }
+ }
+
+
+ }
+ }
+
+#ifdef DEBUG_INTERNAL_EDGE
+ {
+ btVector3 color(0,1,1);
+ btDebugDrawLine(cp.getPositionWorldOnB(),cp.getPositionWorldOnB()+cp.m_normalWorldOnB*10,color);
+ }
+#endif //DEBUG_INTERNAL_EDGE
+
+ if (isNearEdge)
+ {
+
+ if (numConcaveEdgeHits>0)
+ {
+ if ((normalAdjustFlags & BT_TRIANGLE_CONCAVE_DOUBLE_SIDED)!=0)
+ {
+ //fix tri_normal so it pointing the same direction as the current local contact normal
+ if (tri_normal.dot(localContactNormalOnB) < 0)
+ {
+ tri_normal *= -1;
+ }
+ cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis()*tri_normal;
+ } else
+ {
+ //modify the normal to be the triangle normal (or backfacing normal)
+ cp.m_normalWorldOnB = colObj0->getWorldTransform().getBasis() *(tri_normal *frontFacing);
+ }
+
+
+ // Reproject collision point along normal.
+ cp.m_positionWorldOnB = cp.m_positionWorldOnA - cp.m_normalWorldOnB * cp.m_distance1;
+ cp.m_localPointB = colObj0->getWorldTransform().invXform(cp.m_positionWorldOnB);
+ }
+ }
+}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h
new file mode 100644
index 00000000000..9efb0122bb8
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h
@@ -0,0 +1,46 @@
+
+#ifndef BT_INTERNAL_EDGE_UTILITY_H
+#define BT_INTERNAL_EDGE_UTILITY_H
+
+#include "LinearMath/btHashMap.h"
+#include "LinearMath/btVector3.h"
+
+#include "BulletCollision/CollisionShapes/btTriangleInfoMap.h"
+
+///The btInternalEdgeUtility helps to avoid or reduce artifacts due to wrong collision normals caused by internal edges.
+///See also http://code.google.com/p/bullet/issues/detail?id=27
+
+class btBvhTriangleMeshShape;
+class btCollisionObject;
+class btManifoldPoint;
+class btIDebugDraw;
+
+
+
+enum btInternalEdgeAdjustFlags
+{
+ BT_TRIANGLE_CONVEX_BACKFACE_MODE = 1,
+ BT_TRIANGLE_CONCAVE_DOUBLE_SIDED = 2, //double sided options are experimental, single sided is recommended
+ BT_TRIANGLE_CONVEX_DOUBLE_SIDED = 4
+};
+
+
+///Call btGenerateInternalEdgeInfo to create triangle info, store in the shape 'userInfo'
+void btGenerateInternalEdgeInfo (btBvhTriangleMeshShape*trimeshShape, btTriangleInfoMap* triangleInfoMap);
+
+
+///Call the btFixMeshNormal to adjust the collision normal, using the triangle info map (generated using btGenerateInternalEdgeInfo)
+///If this info map is missing, or the triangle is not store in this map, nothing will be done
+void btAdjustInternalEdgeContacts(btManifoldPoint& cp, const btCollisionObject* trimeshColObj0,const btCollisionObject* otherColObj1, int partId0, int index0, int normalAdjustFlags = 0);
+
+///Enable the BT_INTERNAL_EDGE_DEBUG_DRAW define and call btSetDebugDrawer, to get visual info to see if the internal edge utility works properly.
+///If the utility doesn't work properly, you might have to adjust the threshold values in btTriangleInfoMap
+//#define BT_INTERNAL_EDGE_DEBUG_DRAW
+
+#ifdef BT_INTERNAL_EDGE_DEBUG_DRAW
+void btSetDebugDrawer(btIDebugDraw* debugDrawer);
+#endif //BT_INTERNAL_EDGE_DEBUG_DRAW
+
+
+#endif //BT_INTERNAL_EDGE_UTILITY_H
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp
index f8dfa5b101f..fd684c056f7 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp
@@ -47,6 +47,12 @@ btManifoldResult::btManifoldResult(btCollisionObject* body0,btCollisionObject* b
:m_manifoldPtr(0),
m_body0(body0),
m_body1(body1)
+#ifdef DEBUG_PART_INDEX
+ ,m_partId0(-1),
+ m_partId1(-1),
+ m_index0(-1),
+ m_index1(-1)
+#endif //DEBUG_PART_INDEX
{
m_rootTransA = body0->getWorldTransform();
m_rootTransB = body1->getWorldTransform();
@@ -57,8 +63,9 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b
{
btAssert(m_manifoldPtr);
//order in manifold needs to match
-
- if (depth > m_manifoldPtr->getContactBreakingThreshold())
+
+// if (depth > m_manifoldPtr->getContactBreakingThreshold())
+ if (depth > m_manifoldPtr->getContactProcessingThreshold())
return;
bool isSwapped = m_manifoldPtr->getBody0() != m_body0;
@@ -88,10 +95,19 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b
newPt.m_combinedRestitution = calculateCombinedRestitution(m_body0,m_body1);
//BP mod, store contact triangles.
- newPt.m_partId0 = m_partId0;
- newPt.m_partId1 = m_partId1;
- newPt.m_index0 = m_index0;
- newPt.m_index1 = m_index1;
+ if (isSwapped)
+ {
+ newPt.m_partId0 = m_partId1;
+ newPt.m_partId1 = m_partId0;
+ newPt.m_index0 = m_index1;
+ newPt.m_index1 = m_index0;
+ } else
+ {
+ newPt.m_partId0 = m_partId0;
+ newPt.m_partId1 = m_partId1;
+ newPt.m_index0 = m_index0;
+ newPt.m_index1 = m_index1;
+ }
//printf("depth=%f\n",depth);
///@todo, check this for any side effects
if (insertIndex >= 0)
@@ -112,7 +128,7 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b
//experimental feature info, for per-triangle material etc.
btCollisionObject* obj0 = isSwapped? m_body1 : m_body0;
btCollisionObject* obj1 = isSwapped? m_body0 : m_body1;
- (*gContactAddedCallback)(m_manifoldPtr->getContactPoint(insertIndex),obj0,m_partId0,m_index0,obj1,m_partId1,m_index1);
+ (*gContactAddedCallback)(m_manifoldPtr->getContactPoint(insertIndex),obj0,newPt.m_partId0,newPt.m_index0,obj1,newPt.m_partId1,newPt.m_index1);
}
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h
index 964b6a04483..927e2bc4f76 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h
@@ -28,11 +28,14 @@ class btManifoldPoint;
typedef bool (*ContactAddedCallback)(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1);
extern ContactAddedCallback gContactAddedCallback;
+//#define DEBUG_PART_INDEX 1
///btManifoldResult is a helper class to manage contact results.
class btManifoldResult : public btDiscreteCollisionDetectorInterface::Result
{
+protected:
+
btPersistentManifold* m_manifoldPtr;
//we need this for compounds
@@ -50,6 +53,13 @@ class btManifoldResult : public btDiscreteCollisionDetectorInterface::Result
public:
btManifoldResult()
+#ifdef DEBUG_PART_INDEX
+ :
+ m_partId0(-1),
+ m_partId1(-1),
+ m_index0(-1),
+ m_index1(-1)
+#endif //DEBUG_PART_INDEX
{
}
@@ -71,12 +81,16 @@ public:
return m_manifoldPtr;
}
- virtual void setShapeIdentifiers(int partId0,int index0, int partId1,int index1)
+ virtual void setShapeIdentifiersA(int partId0,int index0)
{
- m_partId0=partId0;
- m_partId1=partId1;
- m_index0=index0;
- m_index1=index1;
+ m_partId0=partId0;
+ m_index0=index0;
+ }
+
+ virtual void setShapeIdentifiersB( int partId1,int index1)
+ {
+ m_partId1=partId1;
+ m_index1=index1;
}
@@ -99,7 +113,16 @@ public:
}
}
+ const btCollisionObject* getBody0Internal() const
+ {
+ return m_body0;
+ }
+ const btCollisionObject* getBody1Internal() const
+ {
+ return m_body1;
+ }
+
};
#endif //MANIFOLD_RESULT_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
index 0328d0f738f..bb2a7f23985 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
@@ -1,3 +1,4 @@
+
/*
Bullet Continuous Collision Detection and Physics Library
Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
@@ -44,10 +45,12 @@ void btSimulationIslandManager::findUnions(btDispatcher* /* dispatcher */,btColl
{
{
+ btOverlappingPairCache* pairCachePtr = colWorld->getPairCache();
+ const int numOverlappingPairs = pairCachePtr->getNumOverlappingPairs();
+ btBroadphasePair* pairPtr = pairCachePtr->getOverlappingPairArrayPtr();
- for (int i=0;i<colWorld->getPairCache()->getNumOverlappingPairs();i++)
+ for (int i=0;i<numOverlappingPairs;i++)
{
- btBroadphasePair* pairPtr = colWorld->getPairCache()->getOverlappingPairArrayPtr();
const btBroadphasePair& collisionPair = pairPtr[i];
btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject;
btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject;
@@ -63,15 +66,69 @@ void btSimulationIslandManager::findUnions(btDispatcher* /* dispatcher */,btColl
}
}
+#ifdef STATIC_SIMULATION_ISLAND_OPTIMIZATION
+void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld,btDispatcher* dispatcher)
+{
+
+ // put the index into m_controllers into m_tag
+ int index = 0;
+ {
+
+ int i;
+ for (i=0;i<colWorld->getCollisionObjectArray().size(); i++)
+ {
+ btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i];
+ //Adding filtering here
+ if (!collisionObject->isStaticOrKinematicObject())
+ {
+ collisionObject->setIslandTag(index++);
+ }
+ collisionObject->setCompanionId(-1);
+ collisionObject->setHitFraction(btScalar(1.));
+ }
+ }
+ // do the union find
+
+ initUnionFind( index );
+
+ findUnions(dispatcher,colWorld);
+}
+
+void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* colWorld)
+{
+ // put the islandId ('find' value) into m_tag
+ {
+ int index = 0;
+ int i;
+ for (i=0;i<colWorld->getCollisionObjectArray().size();i++)
+ {
+ btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i];
+ if (!collisionObject->isStaticOrKinematicObject())
+ {
+ collisionObject->setIslandTag( m_unionFind.find(index) );
+ //Set the correct object offset in Collision Object Array
+ m_unionFind.getElement(index).m_sz = i;
+ collisionObject->setCompanionId(-1);
+ index++;
+ } else
+ {
+ collisionObject->setIslandTag(-1);
+ collisionObject->setCompanionId(-2);
+ }
+ }
+ }
+}
+
+#else //STATIC_SIMULATION_ISLAND_OPTIMIZATION
void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld,btDispatcher* dispatcher)
{
-
+
initUnionFind( int (colWorld->getCollisionObjectArray().size()));
-
+
// put the index into m_controllers into m_tag
{
-
+
int index = 0;
int i;
for (i=0;i<colWorld->getCollisionObjectArray().size(); i++)
@@ -81,26 +138,20 @@ void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld
collisionObject->setCompanionId(-1);
collisionObject->setHitFraction(btScalar(1.));
index++;
-
+
}
}
// do the union find
-
- findUnions(dispatcher,colWorld);
-
-
+ findUnions(dispatcher,colWorld);
}
-
-
-
void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* colWorld)
{
// put the islandId ('find' value) into m_tag
{
-
-
+
+
int index = 0;
int i;
for (i=0;i<colWorld->getCollisionObjectArray().size();i++)
@@ -120,6 +171,8 @@ void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* col
}
}
+#endif //STATIC_SIMULATION_ISLAND_OPTIMIZATION
+
inline int getIslandId(const btPersistentManifold* lhs)
{
int islandId;
@@ -339,15 +392,15 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
int islandId = getUnionFind().getElement(startIslandIndex).m_id;
- bool islandSleeping = false;
+ bool islandSleeping = true;
for (endIslandIndex = startIslandIndex;(endIslandIndex<numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId);endIslandIndex++)
{
int i = getUnionFind().getElement(endIslandIndex).m_sz;
btCollisionObject* colObj0 = collisionObjects[i];
m_islandBodies.push_back(colObj0);
- if (!colObj0->isActive())
- islandSleeping = true;
+ if (colObj0->isActive())
+ islandSleeping = false;
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
index 2d5efcf56ba..c327c3ff72a 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
@@ -59,7 +59,7 @@ void btSphereTriangleCollisionAlgorithm::processCollision (btCollisionObject* co
SphereTriangleDetector detector(sphere,triangle, m_manifoldPtr->getContactBreakingThreshold());
btDiscreteCollisionDetectorInterface::ClosestPointInput input;
- input.m_maximumDistanceSquared = btScalar(1e30);///@todo: tighter bounds
+ input.m_maximumDistanceSquared = btScalar(BT_LARGE_FLOAT);///@todo: tighter bounds
input.m_transformA = sphereObj->getWorldTransform();
input.m_transformB = triObj->getWorldTransform();
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp
index c561df06109..4c4f58d44fa 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp
@@ -70,7 +70,9 @@ void btUnionFind::sortIslands()
for (int i=0;i<numElements;i++)
{
m_elements[i].m_id = find(i);
+#ifndef STATIC_SIMULATION_ISLAND_OPTIMIZATION
m_elements[i].m_sz = i;
+#endif //STATIC_SIMULATION_ISLAND_OPTIMIZATION
}
// Sort the vector using predicate and std::sort
@@ -78,4 +80,3 @@ void btUnionFind::sortIslands()
m_elements.quickSort(btUnionFindElementSortPredicate());
}
-
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h
index e105ecbff18..2cce335145b 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h
@@ -18,7 +18,10 @@ subject to the following restrictions:
#include "LinearMath/btAlignedObjectArray.h"
- #define USE_PATH_COMPRESSION 1
+#define USE_PATH_COMPRESSION 1
+
+///see for discussion of static island optimizations by Vroonsh here: http://code.google.com/p/bullet/issues/detail?id=406
+#define STATIC_SIMULATION_ISLAND_OPTIMIZATION 1
struct btElement
{
@@ -106,10 +109,12 @@ class btUnionFind
//not really a reason not to use path compression, and it flattens the trees/improves find performance dramatically
#ifdef USE_PATH_COMPRESSION
- //
- m_elements[x].m_id = m_elements[m_elements[x].m_id].m_id;
- #endif //
+ const btElement* elementPtr = &m_elements[m_elements[x].m_id];
+ m_elements[x].m_id = elementPtr->m_id;
+ x = elementPtr->m_id;
+ #else//
x = m_elements[x].m_id;
+ #endif
//btAssert(x < m_N);
//btAssert(x >= 0);
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btBox2dShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btBox2dShape.cpp
new file mode 100644
index 00000000000..ecce028c2e6
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btBox2dShape.cpp
@@ -0,0 +1,42 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#include "btBox2dShape.h"
+
+
+//{
+
+
+void btBox2dShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+{
+ btTransformAabb(getHalfExtentsWithoutMargin(),getMargin(),t,aabbMin,aabbMax);
+}
+
+
+void btBox2dShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+{
+ //btScalar margin = btScalar(0.);
+ btVector3 halfExtents = getHalfExtentsWithMargin();
+
+ btScalar lx=btScalar(2.)*(halfExtents.x());
+ btScalar ly=btScalar(2.)*(halfExtents.y());
+ btScalar lz=btScalar(2.)*(halfExtents.z());
+
+ inertia.setValue(mass/(btScalar(12.0)) * (ly*ly + lz*lz),
+ mass/(btScalar(12.0)) * (lx*lx + lz*lz),
+ mass/(btScalar(12.0)) * (lx*lx + ly*ly));
+
+}
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btBox2dShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btBox2dShape.h
new file mode 100644
index 00000000000..fc032069c03
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btBox2dShape.h
@@ -0,0 +1,363 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef OBB_BOX_2D_SHAPE_H
+#define OBB_BOX_2D_SHAPE_H
+
+#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h"
+#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
+#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
+#include "LinearMath/btVector3.h"
+#include "LinearMath/btMinMax.h"
+
+///The btBox2dShape is a box primitive around the origin, its sides axis aligned with length specified by half extents, in local shape coordinates. When used as part of a btCollisionObject or btRigidBody it will be an oriented box in world space.
+class btBox2dShape: public btPolyhedralConvexShape
+{
+
+ //btVector3 m_boxHalfExtents1; //use m_implicitShapeDimensions instead
+
+ btVector3 m_centroid;
+ btVector3 m_vertices[4];
+ btVector3 m_normals[4];
+
+public:
+
+ btVector3 getHalfExtentsWithMargin() const
+ {
+ btVector3 halfExtents = getHalfExtentsWithoutMargin();
+ btVector3 margin(getMargin(),getMargin(),getMargin());
+ halfExtents += margin;
+ return halfExtents;
+ }
+
+ const btVector3& getHalfExtentsWithoutMargin() const
+ {
+ return m_implicitShapeDimensions;//changed in Bullet 2.63: assume the scaling and margin are included
+ }
+
+
+ virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
+ {
+ btVector3 halfExtents = getHalfExtentsWithoutMargin();
+ btVector3 margin(getMargin(),getMargin(),getMargin());
+ halfExtents += margin;
+
+ return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()),
+ btFsels(vec.y(), halfExtents.y(), -halfExtents.y()),
+ btFsels(vec.z(), halfExtents.z(), -halfExtents.z()));
+ }
+
+ SIMD_FORCE_INLINE btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+ {
+ const btVector3& halfExtents = getHalfExtentsWithoutMargin();
+
+ return btVector3(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()),
+ btFsels(vec.y(), halfExtents.y(), -halfExtents.y()),
+ btFsels(vec.z(), halfExtents.z(), -halfExtents.z()));
+ }
+
+ virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+ {
+ const btVector3& halfExtents = getHalfExtentsWithoutMargin();
+
+ for (int i=0;i<numVectors;i++)
+ {
+ const btVector3& vec = vectors[i];
+ supportVerticesOut[i].setValue(btFsels(vec.x(), halfExtents.x(), -halfExtents.x()),
+ btFsels(vec.y(), halfExtents.y(), -halfExtents.y()),
+ btFsels(vec.z(), halfExtents.z(), -halfExtents.z()));
+ }
+
+ }
+
+
+ btBox2dShape( const btVector3& boxHalfExtents)
+ : btPolyhedralConvexShape(),
+ m_centroid(0,0,0)
+ {
+ m_vertices[0].setValue(-boxHalfExtents.getX(),-boxHalfExtents.getY(),0);
+ m_vertices[1].setValue(boxHalfExtents.getX(),-boxHalfExtents.getY(),0);
+ m_vertices[2].setValue(boxHalfExtents.getX(),boxHalfExtents.getY(),0);
+ m_vertices[3].setValue(-boxHalfExtents.getX(),boxHalfExtents.getY(),0);
+
+ m_normals[0].setValue(0,-1,0);
+ m_normals[1].setValue(1,0,0);
+ m_normals[2].setValue(0,1,0);
+ m_normals[3].setValue(-1,0,0);
+
+ m_shapeType = BOX_2D_SHAPE_PROXYTYPE;
+ btVector3 margin(getMargin(),getMargin(),getMargin());
+ m_implicitShapeDimensions = (boxHalfExtents * m_localScaling) - margin;
+ };
+
+ virtual void setMargin(btScalar collisionMargin)
+ {
+ //correct the m_implicitShapeDimensions for the margin
+ btVector3 oldMargin(getMargin(),getMargin(),getMargin());
+ btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
+
+ btConvexInternalShape::setMargin(collisionMargin);
+ btVector3 newMargin(getMargin(),getMargin(),getMargin());
+ m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin;
+
+ }
+ virtual void setLocalScaling(const btVector3& scaling)
+ {
+ btVector3 oldMargin(getMargin(),getMargin(),getMargin());
+ btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
+ btVector3 unScaledImplicitShapeDimensionsWithMargin = implicitShapeDimensionsWithMargin / m_localScaling;
+
+ btConvexInternalShape::setLocalScaling(scaling);
+
+ m_implicitShapeDimensions = (unScaledImplicitShapeDimensionsWithMargin * m_localScaling) - oldMargin;
+
+ }
+
+ virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
+
+
+
+ virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+
+
+
+
+
+ int getVertexCount() const
+ {
+ return 4;
+ }
+
+ virtual int getNumVertices()const
+ {
+ return 4;
+ }
+
+ const btVector3* getVertices() const
+ {
+ return &m_vertices[0];
+ }
+
+ const btVector3* getNormals() const
+ {
+ return &m_normals[0];
+ }
+
+
+
+
+
+
+
+ virtual void getPlane(btVector3& planeNormal,btVector3& planeSupport,int i ) const
+ {
+ //this plane might not be aligned...
+ btVector4 plane ;
+ getPlaneEquation(plane,i);
+ planeNormal = btVector3(plane.getX(),plane.getY(),plane.getZ());
+ planeSupport = localGetSupportingVertex(-planeNormal);
+ }
+
+
+ const btVector3& getCentroid() const
+ {
+ return m_centroid;
+ }
+
+ virtual int getNumPlanes() const
+ {
+ return 6;
+ }
+
+
+
+ virtual int getNumEdges() const
+ {
+ return 12;
+ }
+
+
+ virtual void getVertex(int i,btVector3& vtx) const
+ {
+ btVector3 halfExtents = getHalfExtentsWithoutMargin();
+
+ vtx = btVector3(
+ halfExtents.x() * (1-(i&1)) - halfExtents.x() * (i&1),
+ halfExtents.y() * (1-((i&2)>>1)) - halfExtents.y() * ((i&2)>>1),
+ halfExtents.z() * (1-((i&4)>>2)) - halfExtents.z() * ((i&4)>>2));
+ }
+
+
+ virtual void getPlaneEquation(btVector4& plane,int i) const
+ {
+ btVector3 halfExtents = getHalfExtentsWithoutMargin();
+
+ switch (i)
+ {
+ case 0:
+ plane.setValue(btScalar(1.),btScalar(0.),btScalar(0.),-halfExtents.x());
+ break;
+ case 1:
+ plane.setValue(btScalar(-1.),btScalar(0.),btScalar(0.),-halfExtents.x());
+ break;
+ case 2:
+ plane.setValue(btScalar(0.),btScalar(1.),btScalar(0.),-halfExtents.y());
+ break;
+ case 3:
+ plane.setValue(btScalar(0.),btScalar(-1.),btScalar(0.),-halfExtents.y());
+ break;
+ case 4:
+ plane.setValue(btScalar(0.),btScalar(0.),btScalar(1.),-halfExtents.z());
+ break;
+ case 5:
+ plane.setValue(btScalar(0.),btScalar(0.),btScalar(-1.),-halfExtents.z());
+ break;
+ default:
+ btAssert(0);
+ }
+ }
+
+
+ virtual void getEdge(int i,btVector3& pa,btVector3& pb) const
+ //virtual void getEdge(int i,Edge& edge) const
+ {
+ int edgeVert0 = 0;
+ int edgeVert1 = 0;
+
+ switch (i)
+ {
+ case 0:
+ edgeVert0 = 0;
+ edgeVert1 = 1;
+ break;
+ case 1:
+ edgeVert0 = 0;
+ edgeVert1 = 2;
+ break;
+ case 2:
+ edgeVert0 = 1;
+ edgeVert1 = 3;
+
+ break;
+ case 3:
+ edgeVert0 = 2;
+ edgeVert1 = 3;
+ break;
+ case 4:
+ edgeVert0 = 0;
+ edgeVert1 = 4;
+ break;
+ case 5:
+ edgeVert0 = 1;
+ edgeVert1 = 5;
+
+ break;
+ case 6:
+ edgeVert0 = 2;
+ edgeVert1 = 6;
+ break;
+ case 7:
+ edgeVert0 = 3;
+ edgeVert1 = 7;
+ break;
+ case 8:
+ edgeVert0 = 4;
+ edgeVert1 = 5;
+ break;
+ case 9:
+ edgeVert0 = 4;
+ edgeVert1 = 6;
+ break;
+ case 10:
+ edgeVert0 = 5;
+ edgeVert1 = 7;
+ break;
+ case 11:
+ edgeVert0 = 6;
+ edgeVert1 = 7;
+ break;
+ default:
+ btAssert(0);
+
+ }
+
+ getVertex(edgeVert0,pa );
+ getVertex(edgeVert1,pb );
+ }
+
+
+
+
+
+ virtual bool isInside(const btVector3& pt,btScalar tolerance) const
+ {
+ btVector3 halfExtents = getHalfExtentsWithoutMargin();
+
+ //btScalar minDist = 2*tolerance;
+
+ bool result = (pt.x() <= (halfExtents.x()+tolerance)) &&
+ (pt.x() >= (-halfExtents.x()-tolerance)) &&
+ (pt.y() <= (halfExtents.y()+tolerance)) &&
+ (pt.y() >= (-halfExtents.y()-tolerance)) &&
+ (pt.z() <= (halfExtents.z()+tolerance)) &&
+ (pt.z() >= (-halfExtents.z()-tolerance));
+
+ return result;
+ }
+
+
+ //debugging
+ virtual const char* getName()const
+ {
+ return "Box2d";
+ }
+
+ virtual int getNumPreferredPenetrationDirections() const
+ {
+ return 6;
+ }
+
+ virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
+ {
+ switch (index)
+ {
+ case 0:
+ penetrationVector.setValue(btScalar(1.),btScalar(0.),btScalar(0.));
+ break;
+ case 1:
+ penetrationVector.setValue(btScalar(-1.),btScalar(0.),btScalar(0.));
+ break;
+ case 2:
+ penetrationVector.setValue(btScalar(0.),btScalar(1.),btScalar(0.));
+ break;
+ case 3:
+ penetrationVector.setValue(btScalar(0.),btScalar(-1.),btScalar(0.));
+ break;
+ case 4:
+ penetrationVector.setValue(btScalar(0.),btScalar(0.),btScalar(1.));
+ break;
+ case 5:
+ penetrationVector.setValue(btScalar(0.),btScalar(0.),btScalar(-1.));
+ break;
+ default:
+ btAssert(0);
+ }
+ }
+
+};
+
+#endif //OBB_BOX_2D_SHAPE_H
+
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp
index 8bc2cfa6ffa..c6644efbef3 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -12,7 +12,6 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "btBoxShape.h"
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.h
index 14502d485dc..b405efc8e3c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -41,7 +41,7 @@ public:
const btVector3& getHalfExtentsWithoutMargin() const
{
- return m_implicitShapeDimensions;//changed in Bullet 2.63: assume the scaling and margin are included
+ return m_implicitShapeDimensions;//scaling is included, margin is not
}
@@ -312,6 +312,7 @@ public:
};
+
#endif //OBB_BOX_MINKOWSKI_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
index 4d350196943..ace4cfa2646 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -17,12 +17,14 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h"
#include "BulletCollision/CollisionShapes/btOptimizedBvh.h"
+#include "LinearMath/btSerializer.h"
///Bvh Concave triangle mesh is a static-triangle mesh shape with Bounding Volume Hierarchy optimization.
///Uses an interface to access the triangles to allow for sharing graphics/physics triangles.
btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression, bool buildBvh)
:btTriangleMeshShape(meshInterface),
m_bvh(0),
+m_triangleInfoMap(0),
m_useQuantizedAabbCompression(useQuantizedAabbCompression),
m_ownsBvh(false)
{
@@ -42,6 +44,7 @@ m_ownsBvh(false)
btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression,const btVector3& bvhAabbMin,const btVector3& bvhAabbMax,bool buildBvh)
:btTriangleMeshShape(meshInterface),
m_bvh(0),
+m_triangleInfoMap(0),
m_useQuantizedAabbCompression(useQuantizedAabbCompression),
m_ownsBvh(false)
{
@@ -274,13 +277,13 @@ void btBvhTriangleMeshShape::processAllTriangles(btTriangleCallback* callback,co
nodeSubPart);
unsigned int* gfxbase = (unsigned int*)(indexbase+nodeTriangleIndex*indexstride);
- btAssert(indicestype==PHY_INTEGER||indicestype==PHY_SHORT);
+ btAssert(indicestype==PHY_INTEGER||indicestype==PHY_SHORT||indicestype==PHY_UCHAR);
const btVector3& meshScaling = m_meshInterface->getScaling();
for (int j=2;j>=0;j--)
{
- int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:gfxbase[j];
+ int graphicsindex = indicestype==PHY_SHORT?((unsigned short*)gfxbase)[j]:indicestype==PHY_INTEGER?gfxbase[j]:((unsigned char*)gfxbase)[j];
#ifdef DEBUG_TRIANGLE_MESH
@@ -364,3 +367,100 @@ void btBvhTriangleMeshShape::setOptimizedBvh(btOptimizedBvh* bvh, const btVect
}
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btBvhTriangleMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btTriangleMeshShapeData* trimeshData = (btTriangleMeshShapeData*) dataBuffer;
+
+ btCollisionShape::serialize(&trimeshData->m_collisionShapeData,serializer);
+
+ m_meshInterface->serialize(&trimeshData->m_meshInterface, serializer);
+
+ trimeshData->m_collisionMargin = float(m_collisionMargin);
+
+
+
+ if (m_bvh && !(serializer->getSerializationFlags()&BT_SERIALIZE_NO_BVH))
+ {
+ void* chunk = serializer->findPointer(m_bvh);
+ if (chunk)
+ {
+#ifdef BT_USE_DOUBLE_PRECISION
+ trimeshData->m_quantizedDoubleBvh = (btQuantizedBvhData*)chunk;
+ trimeshData->m_quantizedFloatBvh = 0;
+#else
+ trimeshData->m_quantizedFloatBvh = (btQuantizedBvhData*)chunk;
+ trimeshData->m_quantizedDoubleBvh= 0;
+#endif //BT_USE_DOUBLE_PRECISION
+ } else
+ {
+
+#ifdef BT_USE_DOUBLE_PRECISION
+ trimeshData->m_quantizedDoubleBvh = (btQuantizedBvhData*)serializer->getUniquePointer(m_bvh);
+ trimeshData->m_quantizedFloatBvh = 0;
+#else
+ trimeshData->m_quantizedFloatBvh = (btQuantizedBvhData*)serializer->getUniquePointer(m_bvh);
+ trimeshData->m_quantizedDoubleBvh= 0;
+#endif //BT_USE_DOUBLE_PRECISION
+
+ int sz = m_bvh->calculateSerializeBufferSizeNew();
+ btChunk* chunk = serializer->allocate(sz,1);
+ const char* structType = m_bvh->serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk,structType,BT_QUANTIZED_BVH_CODE,m_bvh);
+ }
+ } else
+ {
+ trimeshData->m_quantizedFloatBvh = 0;
+ trimeshData->m_quantizedDoubleBvh = 0;
+ }
+
+
+
+ if (m_triangleInfoMap && !(serializer->getSerializationFlags()&BT_SERIALIZE_NO_TRIANGLEINFOMAP))
+ {
+ void* chunk = serializer->findPointer(m_triangleInfoMap);
+ if (chunk)
+ {
+ trimeshData->m_triangleInfoMap = (btTriangleInfoMapData*)chunk;
+ } else
+ {
+ trimeshData->m_triangleInfoMap = (btTriangleInfoMapData*)serializer->getUniquePointer(m_triangleInfoMap);
+ int sz = m_triangleInfoMap->calculateSerializeBufferSize();
+ btChunk* chunk = serializer->allocate(sz,1);
+ const char* structType = m_triangleInfoMap->serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk,structType,BT_TRIANLGE_INFO_MAP,m_triangleInfoMap);
+ }
+ } else
+ {
+ trimeshData->m_triangleInfoMap = 0;
+ }
+
+ return "btTriangleMeshShapeData";
+}
+
+void btBvhTriangleMeshShape::serializeSingleBvh(btSerializer* serializer) const
+{
+ if (m_bvh)
+ {
+ int len = m_bvh->calculateSerializeBufferSizeNew(); //make sure not to use calculateSerializeBufferSize because it is used for in-place
+ btChunk* chunk = serializer->allocate(len,1);
+ const char* structType = m_bvh->serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk,structType,BT_QUANTIZED_BVH_CODE,(void*)m_bvh);
+ }
+}
+
+void btBvhTriangleMeshShape::serializeSingleTriangleInfoMap(btSerializer* serializer) const
+{
+ if (m_triangleInfoMap)
+ {
+ int len = m_triangleInfoMap->calculateSerializeBufferSize();
+ btChunk* chunk = serializer->allocate(len,1);
+ const char* structType = m_triangleInfoMap->serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk,structType,BT_TRIANLGE_INFO_MAP,(void*)m_triangleInfoMap);
+ }
+}
+
+
+
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
index ab54bd1a1ed..c269ef27bdb 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -19,7 +19,7 @@ subject to the following restrictions:
#include "btTriangleMeshShape.h"
#include "btOptimizedBvh.h"
#include "LinearMath/btAlignedAllocator.h"
-
+#include "btTriangleInfoMap.h"
///The btBvhTriangleMeshShape is a static-triangle mesh shape with several optimizations, such as bounding volume hierarchy and cache friendly traversal for PlayStation 3 Cell SPU. It is recommended to enable useQuantizedAabbCompression for better memory usage.
///It takes a triangle mesh as input, for example a btTriangleMesh or btTriangleIndexVertexArray. The btBvhTriangleMeshShape class allows for triangle mesh deformations by a refit or partialRefit method.
@@ -29,6 +29,8 @@ ATTRIBUTE_ALIGNED16(class) btBvhTriangleMeshShape : public btTriangleMeshShape
{
btOptimizedBvh* m_bvh;
+ btTriangleInfoMap* m_triangleInfoMap;
+
bool m_useQuantizedAabbCompression;
bool m_ownsBvh;
bool m_pad[11];////need padding due to alignment
@@ -37,7 +39,7 @@ public:
BT_DECLARE_ALIGNED_ALLOCATOR();
- btBvhTriangleMeshShape() : btTriangleMeshShape(0),m_bvh(0),m_ownsBvh(false) {m_shapeType = TRIANGLE_MESH_SHAPE_PROXYTYPE;};
+
btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression, bool buildBvh = true);
///optionally pass in a larger bvh aabb, used for quantization. This allows for deformations within this aabb
@@ -73,7 +75,6 @@ public:
return m_bvh;
}
-
void setOptimizedBvh(btOptimizedBvh* bvh, const btVector3& localScaling=btVector3(1,1,1));
void buildOptimizedBvh();
@@ -82,7 +83,57 @@ public:
{
return m_useQuantizedAabbCompression;
}
+
+ void setTriangleInfoMap(btTriangleInfoMap* triangleInfoMap)
+ {
+ m_triangleInfoMap = triangleInfoMap;
+ }
+
+ const btTriangleInfoMap* getTriangleInfoMap() const
+ {
+ return m_triangleInfoMap;
+ }
+
+ btTriangleInfoMap* getTriangleInfoMap()
+ {
+ return m_triangleInfoMap;
+ }
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+ virtual void serializeSingleBvh(btSerializer* serializer) const;
+
+ virtual void serializeSingleTriangleInfoMap(btSerializer* serializer) const;
+
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btTriangleMeshShapeData
+{
+ btCollisionShapeData m_collisionShapeData;
+
+ btStridingMeshInterfaceData m_meshInterface;
+
+ btQuantizedBvhFloatData *m_quantizedFloatBvh;
+ btQuantizedBvhDoubleData *m_quantizedDoubleBvh;
+
+ btTriangleInfoMapData *m_triangleInfoMap;
+
+ float m_collisionMargin;
+
+ char m_pad3[4];
+
+};
+
+
+SIMD_FORCE_INLINE int btBvhTriangleMeshShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btTriangleMeshShapeData);
}
-;
+
+
#endif //BVH_TRIANGLE_MESH_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp
index 60a96a542f9..2faa11d4360 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -32,7 +32,7 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
btVector3 supVec(0,0,0);
- btScalar maxDot(btScalar(-1e30));
+ btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
@@ -88,7 +88,7 @@ btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInter
for (int j=0;j<numVectors;j++)
{
- btScalar maxDot(btScalar(-1e30));
+ btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
const btVector3& vec = vectors[j];
btVector3 vtx;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.h
index 828c1b3a565..ab763abf808 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -43,6 +43,18 @@ public:
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
+ virtual void setMargin(btScalar collisionMargin)
+ {
+ //correct the m_implicitShapeDimensions for the margin
+ btVector3 oldMargin(getMargin(),getMargin(),getMargin());
+ btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
+
+ btConvexInternalShape::setMargin(collisionMargin);
+ btVector3 newMargin(getMargin(),getMargin(),getMargin());
+ m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin;
+
+ }
+
virtual void getAabb (const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
btVector3 halfExtents(getRadius(),getRadius(),getRadius());
@@ -77,6 +89,24 @@ public:
return m_implicitShapeDimensions[m_upAxis];
}
+ virtual void setLocalScaling(const btVector3& scaling)
+ {
+ btVector3 oldMargin(getMargin(),getMargin(),getMargin());
+ btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
+ btVector3 unScaledImplicitShapeDimensionsWithMargin = implicitShapeDimensionsWithMargin / m_localScaling;
+
+ btConvexInternalShape::setLocalScaling(scaling);
+
+ m_implicitShapeDimensions = (unScaledImplicitShapeDimensionsWithMargin * m_localScaling) - oldMargin;
+
+ }
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+
};
///btCapsuleShapeX represents a capsule around the Z axis
@@ -113,6 +143,31 @@ public:
};
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btCapsuleShapeData
+{
+ btConvexInternalShapeData m_convexInternalShapeData;
+
+ int m_upAxis;
+
+ char m_padding[4];
+};
+
+SIMD_FORCE_INLINE int btCapsuleShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btCapsuleShapeData);
+}
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btCapsuleShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btCapsuleShapeData* shapeData = (btCapsuleShapeData*) dataBuffer;
+
+ btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData,serializer);
+ shapeData->m_upAxis = m_upAxis;
+
+ return "btCapsuleShapeData";
+}
#endif //BT_CAPSULE_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h
index 4730264d3df..18fd026041f 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.cpp
index d242cba1b72..39ee21cad73 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -12,12 +12,8 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
-
#include "BulletCollision/CollisionShapes/btCollisionShape.h"
-
-
-btScalar gContactThresholdFactor=btScalar(0.02);
-
+#include "LinearMath/btSerializer.h"
/*
Make sure this dummy function never changes so that it
@@ -45,10 +41,12 @@ void btCollisionShape::getBoundingSphere(btVector3& center,btScalar& radius) con
center = (aabbMin+aabbMax)*btScalar(0.5);
}
-btScalar btCollisionShape::getContactBreakingThreshold() const
+
+btScalar btCollisionShape::getContactBreakingThreshold(btScalar defaultContactThreshold) const
{
- return getAngularMotionDisc() * gContactThresholdFactor;
+ return getAngularMotionDisc() * defaultContactThreshold;
}
+
btScalar btCollisionShape::getAngularMotionDisc() const
{
///@todo cache this value, to improve performance
@@ -96,3 +94,26 @@ void btCollisionShape::calculateTemporalAabb(const btTransform& curTrans,const b
temporalAabbMin -= angularMotion3d;
temporalAabbMax += angularMotion3d;
}
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btCollisionShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btCollisionShapeData* shapeData = (btCollisionShapeData*) dataBuffer;
+ char* name = (char*) serializer->findNameForPointer(this);
+ shapeData->m_name = (char*)serializer->getUniquePointer(name);
+ if (shapeData->m_name)
+ {
+ serializer->serializeName(name);
+ }
+ shapeData->m_shapeType = m_shapeType;
+ //shapeData->m_padding//??
+ return "btCollisionShapeData";
+}
+
+void btCollisionShape::serializeSingleShape(btSerializer* serializer) const
+{
+ int len = calculateSerializeBufferSize();
+ btChunk* chunk = serializer->allocate(len,1);
+ const char* structType = serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk,structType,BT_SHAPE_CODE,(void*)this);
+} \ No newline at end of file
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h
index b6374e64153..f32bd736a99 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -20,6 +20,8 @@ subject to the following restrictions:
#include "LinearMath/btVector3.h"
#include "LinearMath/btMatrix3x3.h"
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" //for the shape types
+class btSerializer;
+
///The btCollisionShape class provides an interface for collision shapes that can be shared among btCollisionObjects.
class btCollisionShape
@@ -46,24 +48,33 @@ public:
///getAngularMotionDisc returns the maximus radius needed for Conservative Advancement to handle time-of-impact with rotations.
virtual btScalar getAngularMotionDisc() const;
- virtual btScalar getContactBreakingThreshold() const;
+ virtual btScalar getContactBreakingThreshold(btScalar defaultContactThresholdFactor) const;
///calculateTemporalAabb calculates the enclosing aabb for the moving object over interval [0..timeStep)
///result is conservative
void calculateTemporalAabb(const btTransform& curTrans,const btVector3& linvel,const btVector3& angvel,btScalar timeStep, btVector3& temporalAabbMin,btVector3& temporalAabbMax) const;
-#ifndef __SPU__
+
SIMD_FORCE_INLINE bool isPolyhedral() const
{
return btBroadphaseProxy::isPolyhedral(getShapeType());
}
+ SIMD_FORCE_INLINE bool isConvex2d() const
+ {
+ return btBroadphaseProxy::isConvex2d(getShapeType());
+ }
+
SIMD_FORCE_INLINE bool isConvex() const
{
return btBroadphaseProxy::isConvex(getShapeType());
}
+ SIMD_FORCE_INLINE bool isNonMoving() const
+ {
+ return btBroadphaseProxy::isNonMoving(getShapeType());
+ }
SIMD_FORCE_INLINE bool isConcave() const
{
return btBroadphaseProxy::isConcave(getShapeType());
@@ -72,6 +83,7 @@ public:
{
return btBroadphaseProxy::isCompound(getShapeType());
}
+
SIMD_FORCE_INLINE bool isSoftBody() const
{
return btBroadphaseProxy::isSoftBody(getShapeType());
@@ -83,7 +95,7 @@ public:
return btBroadphaseProxy::isInfinite(getShapeType());
}
-
+#ifndef __SPU__
virtual void setLocalScaling(const btVector3& scaling) =0;
virtual const btVector3& getLocalScaling() const =0;
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const = 0;
@@ -110,7 +122,29 @@ public:
return m_userPointer;
}
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+ virtual void serializeSingleShape(btSerializer* serializer) const;
+
};
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btCollisionShapeData
+{
+ char *m_name;
+ int m_shapeType;
+ char m_padding[4];
+};
+
+SIMD_FORCE_INLINE int btCollisionShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btCollisionShapeData);
+}
+
+
+
#endif //COLLISION_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp
index 9c2b04d18fa..4eb860c57f1 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -16,14 +16,15 @@ subject to the following restrictions:
#include "btCompoundShape.h"
#include "btCollisionShape.h"
#include "BulletCollision/BroadphaseCollision/btDbvt.h"
+#include "LinearMath/btSerializer.h"
btCompoundShape::btCompoundShape(bool enableDynamicAabbTree)
-: m_localAabbMin(btScalar(1e30),btScalar(1e30),btScalar(1e30)),
-m_localAabbMax(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30)),
-m_collisionMargin(btScalar(0.)),
-m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.)),
+: m_localAabbMin(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT)),
+m_localAabbMax(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT)),
m_dynamicAabbTree(0),
-m_updateRevision(1)
+m_updateRevision(1),
+m_collisionMargin(btScalar(0.)),
+m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.))
{
m_shapeType = COMPOUND_SHAPE_PROXYTYPE;
@@ -51,6 +52,7 @@ void btCompoundShape::addChildShape(const btTransform& localTransform,btCollisio
//m_childTransforms.push_back(localTransform);
//m_childShapes.push_back(shape);
btCompoundShapeChild child;
+ child.m_node = 0;
child.m_transform = localTransform;
child.m_childShape = shape;
child.m_childShapeType = shape->getShapeType();
@@ -83,7 +85,7 @@ void btCompoundShape::addChildShape(const btTransform& localTransform,btCollisio
}
-void btCompoundShape::updateChildTransform(int childIndex, const btTransform& newChildTransform)
+void btCompoundShape::updateChildTransform(int childIndex, const btTransform& newChildTransform,bool shouldRecalculateLocalAabb)
{
m_children[childIndex].m_transform = newChildTransform;
@@ -93,11 +95,14 @@ void btCompoundShape::updateChildTransform(int childIndex, const btTransform& ne
btVector3 localAabbMin,localAabbMax;
m_children[childIndex].m_childShape->getAabb(newChildTransform,localAabbMin,localAabbMax);
ATTRIBUTE_ALIGNED16(btDbvtVolume) bounds=btDbvtVolume::FromMM(localAabbMin,localAabbMax);
- int index = m_children.size()-1;
+ //int index = m_children.size()-1;
m_dynamicAabbTree->update(m_children[childIndex].m_node,bounds);
}
- recalculateLocalAabb();
+ if (shouldRecalculateLocalAabb)
+ {
+ recalculateLocalAabb();
+ }
}
void btCompoundShape::removeChildShapeByIndex(int childShapeIndex)
@@ -109,6 +114,8 @@ void btCompoundShape::removeChildShapeByIndex(int childShapeIndex)
m_dynamicAabbTree->remove(m_children[childShapeIndex].m_node);
}
m_children.swap(childShapeIndex,m_children.size()-1);
+ if (m_dynamicAabbTree)
+ m_children[childShapeIndex].m_node->dataAsInt = childShapeIndex;
m_children.pop_back();
}
@@ -124,14 +131,7 @@ void btCompoundShape::removeChildShape(btCollisionShape* shape)
{
if(m_children[i].m_childShape == shape)
{
- m_children.swap(i,m_children.size()-1);
- m_children.pop_back();
- //remove it from the m_dynamicAabbTree too
- //@todo: this leads to problems due to caching in the btCompoundCollisionAlgorithm
- //so effectively, removeChildShape is broken at the moment
- //m_dynamicAabbTree->remove(m_aabbProxies[i]);
- //m_aabbProxies.swap(i,m_children.size()-1);
- //m_aabbProxies.pop_back();
+ removeChildShapeByIndex(i);
}
}
@@ -145,8 +145,8 @@ void btCompoundShape::recalculateLocalAabb()
// Recalculate the local aabb
// Brute force, it iterates over all the shapes left.
- m_localAabbMin = btVector3(btScalar(1e30),btScalar(1e30),btScalar(1e30));
- m_localAabbMax = btVector3(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ m_localAabbMin = btVector3(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+ m_localAabbMax = btVector3(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
//extend the local aabbMin/aabbMax
for (int j = 0; j < m_children.size(); j++)
@@ -223,9 +223,13 @@ void btCompoundShape::calculatePrincipalAxisTransform(btScalar* masses, btTransf
for (k = 0; k < n; k++)
{
+ btAssert(masses[k]>0);
center += m_children[k].m_transform.getOrigin() * masses[k];
totalMass += masses[k];
}
+
+ btAssert(totalMass>0);
+
center /= totalMass;
principal.setOrigin(center);
@@ -271,3 +275,82 @@ void btCompoundShape::calculatePrincipalAxisTransform(btScalar* masses, btTransf
+void btCompoundShape::setLocalScaling(const btVector3& scaling)
+{
+
+ for(int i = 0; i < m_children.size(); i++)
+ {
+ btTransform childTrans = getChildTransform(i);
+ btVector3 childScale = m_children[i].m_childShape->getLocalScaling();
+// childScale = childScale * (childTrans.getBasis() * scaling);
+ childScale = childScale * scaling / m_localScaling;
+ m_children[i].m_childShape->setLocalScaling(childScale);
+ childTrans.setOrigin((childTrans.getOrigin())*scaling);
+ updateChildTransform(i, childTrans,false);
+ }
+
+ m_localScaling = scaling;
+ recalculateLocalAabb();
+
+}
+
+
+void btCompoundShape::createAabbTreeFromChildren()
+{
+ if ( !m_dynamicAabbTree )
+ {
+ void* mem = btAlignedAlloc(sizeof(btDbvt),16);
+ m_dynamicAabbTree = new(mem) btDbvt();
+ btAssert(mem==m_dynamicAabbTree);
+
+ for ( int index = 0; index < m_children.size(); index++ )
+ {
+ btCompoundShapeChild &child = m_children[index];
+
+ //extend the local aabbMin/aabbMax
+ btVector3 localAabbMin,localAabbMax;
+ child.m_childShape->getAabb(child.m_transform,localAabbMin,localAabbMax);
+
+ const btDbvtVolume bounds=btDbvtVolume::FromMM(localAabbMin,localAabbMax);
+ child.m_node = m_dynamicAabbTree->insert(bounds,(void*)index);
+ }
+ }
+}
+
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btCompoundShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+
+ btCompoundShapeData* shapeData = (btCompoundShapeData*) dataBuffer;
+ btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer);
+
+ shapeData->m_collisionMargin = float(m_collisionMargin);
+ shapeData->m_numChildShapes = m_children.size();
+ shapeData->m_childShapePtr = 0;
+ if (shapeData->m_numChildShapes)
+ {
+ btChunk* chunk = serializer->allocate(sizeof(btCompoundShapeChildData),shapeData->m_numChildShapes);
+ btCompoundShapeChildData* memPtr = (btCompoundShapeChildData*)chunk->m_oldPtr;
+ shapeData->m_childShapePtr = (btCompoundShapeChildData*)serializer->getUniquePointer(memPtr);
+
+ for (int i=0;i<shapeData->m_numChildShapes;i++,memPtr++)
+ {
+ memPtr->m_childMargin = float(m_children[i].m_childMargin);
+ memPtr->m_childShape = (btCollisionShapeData*)serializer->getUniquePointer(m_children[i].m_childShape);
+ //don't serialize shapes that already have been serialized
+ if (!serializer->findPointer(m_children[i].m_childShape))
+ {
+ btChunk* chunk = serializer->allocate(m_children[i].m_childShape->calculateSerializeBufferSize(),1);
+ const char* structType = m_children[i].m_childShape->serialize(chunk->m_oldPtr,serializer);
+ serializer->finalizeChunk(chunk,structType,BT_SHAPE_CODE,m_children[i].m_childShape);
+ }
+
+ memPtr->m_childShapeType = m_children[i].m_childShapeType;
+ m_children[i].m_transform.serializeFloat(memPtr->m_transform);
+ }
+ serializer->finalizeChunk(chunk,"btCompoundShapeChildData",BT_ARRAY_CODE,chunk->m_oldPtr);
+ }
+ return "btCompoundShapeData";
+}
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h
index 434860c8633..7f41dd4517b 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -62,6 +62,11 @@ ATTRIBUTE_ALIGNED16(class) btCompoundShape : public btCollisionShape
///increment m_updateRevision when adding/removing/replacing child shapes, so that some caches can be updated
int m_updateRevision;
+ btScalar m_collisionMargin;
+
+protected:
+ btVector3 m_localScaling;
+
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
@@ -101,7 +106,7 @@ public:
}
///set a new transform for a child, and update internal data structures (local aabb and dynamic tree)
- void updateChildTransform(int childIndex, const btTransform& newChildTransform);
+ void updateChildTransform(int childIndex, const btTransform& newChildTransform, bool shouldRecalculateLocalAabb = true);
btCompoundShapeChild* getChildList()
@@ -116,10 +121,8 @@ public:
Use this yourself if you modify the children or their transforms. */
virtual void recalculateLocalAabb();
- virtual void setLocalScaling(const btVector3& scaling)
- {
- m_localScaling = scaling;
- }
+ virtual void setLocalScaling(const btVector3& scaling);
+
virtual const btVector3& getLocalScaling() const
{
return m_localScaling;
@@ -140,14 +143,18 @@ public:
return "Compound";
}
- //this is optional, but should make collision queries faster, by culling non-overlapping nodes
- void createAabbTreeFromChildren();
-
- btDbvt* getDynamicAabbTree()
+ const btDbvt* getDynamicAabbTree() const
+ {
+ return m_dynamicAabbTree;
+ }
+
+ btDbvt* getDynamicAabbTree()
{
return m_dynamicAabbTree;
}
+ void createAabbTreeFromChildren();
+
///computes the exact moment of inertia and the transform from the coordinate system defined by the principal axes of the moment of inertia
///and the center of mass to the current coordinate system. "masses" points to an array of masses of the children. The resulting transform
///"principal" has to be applied inversely to all children transforms in order for the local coordinate system of the compound
@@ -160,13 +167,46 @@ public:
return m_updateRevision;
}
-private:
- btScalar m_collisionMargin;
-protected:
- btVector3 m_localScaling;
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
};
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btCompoundShapeChildData
+{
+ btTransformFloatData m_transform;
+ btCollisionShapeData *m_childShape;
+ int m_childShapeType;
+ float m_childMargin;
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btCompoundShapeData
+{
+ btCollisionShapeData m_collisionShapeData;
+
+ btCompoundShapeChildData *m_childShapePtr;
+
+ int m_numChildShapes;
+
+ float m_collisionMargin;
+
+};
+
+
+SIMD_FORCE_INLINE int btCompoundShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btCompoundShapeData);
+}
+
+
+
+
+
#endif //COMPOUND_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.cpp
index 5103500a012..58ff84a5b02 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.cpp
@@ -1,7 +1,6 @@
-
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h
index 30065d55a12..2a370a47c75 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.cpp
index d887be61ada..5e83087b320 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -131,3 +131,13 @@ btVector3 btConeShape::localGetSupportingVertex(const btVector3& vec) const
}
+void btConeShape::setLocalScaling(const btVector3& scaling)
+{
+ int axis = m_coneIndices[1];
+ int r1 = m_coneIndices[0];
+ int r2 = m_coneIndices[2];
+ m_height *= scaling[axis] / m_localScaling[axis];
+ m_radius *= (scaling[r1] / m_localScaling[r1] + scaling[r2] / m_localScaling[r2]) / 2;
+ m_sinAngle = (m_radius / btSqrt(m_radius * m_radius + m_height * m_height));
+ btConvexInternalShape::setLocalScaling(scaling);
+} \ No newline at end of file
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h
index 1869893f37a..bd7d1443ac2 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -81,6 +81,9 @@ public:
{
return m_coneIndices[1];
}
+
+ virtual void setLocalScaling(const btVector3& scaling);
+
};
///btConeShape implements a Cone shape, around the X axis
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvex2dShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvex2dShape.cpp
new file mode 100644
index 00000000000..10ea3e981af
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvex2dShape.cpp
@@ -0,0 +1,92 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#include "btConvex2dShape.h"
+
+btConvex2dShape::btConvex2dShape( btConvexShape* convexChildShape):
+btConvexShape (), m_childConvexShape(convexChildShape)
+{
+ m_shapeType = CONVEX_2D_SHAPE_PROXYTYPE;
+}
+
+btConvex2dShape::~btConvex2dShape()
+{
+}
+
+
+
+btVector3 btConvex2dShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
+{
+ return m_childConvexShape->localGetSupportingVertexWithoutMargin(vec);
+}
+
+void btConvex2dShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+{
+ m_childConvexShape->batchedUnitVectorGetSupportingVertexWithoutMargin(vectors,supportVerticesOut,numVectors);
+}
+
+
+btVector3 btConvex2dShape::localGetSupportingVertex(const btVector3& vec)const
+{
+ return m_childConvexShape->localGetSupportingVertex(vec);
+}
+
+
+void btConvex2dShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+{
+ ///this linear upscaling is not realistic, but we don't deal with large mass ratios...
+ m_childConvexShape->calculateLocalInertia(mass,inertia);
+}
+
+
+ ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
+void btConvex2dShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+{
+ m_childConvexShape->getAabb(t,aabbMin,aabbMax);
+}
+
+void btConvex2dShape::getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+{
+ m_childConvexShape->getAabbSlow(t,aabbMin,aabbMax);
+}
+
+void btConvex2dShape::setLocalScaling(const btVector3& scaling)
+{
+ m_childConvexShape->setLocalScaling(scaling);
+}
+
+const btVector3& btConvex2dShape::getLocalScaling() const
+{
+ return m_childConvexShape->getLocalScaling();
+}
+
+void btConvex2dShape::setMargin(btScalar margin)
+{
+ m_childConvexShape->setMargin(margin);
+}
+btScalar btConvex2dShape::getMargin() const
+{
+ return m_childConvexShape->getMargin();
+}
+
+int btConvex2dShape::getNumPreferredPenetrationDirections() const
+{
+ return m_childConvexShape->getNumPreferredPenetrationDirections();
+}
+
+void btConvex2dShape::getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
+{
+ m_childConvexShape->getPreferredPenetrationDirection(index,penetrationVector);
+}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvex2dShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvex2dShape.h
new file mode 100644
index 00000000000..caf54329da9
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvex2dShape.h
@@ -0,0 +1,80 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef BT_CONVEX_2D_SHAPE_H
+#define BT_CONVEX_2D_SHAPE_H
+
+#include "BulletCollision/CollisionShapes/btConvexShape.h"
+#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+
+///The btConvex2dShape allows to use arbitrary convex shapes as 2d convex shapes, with the Z component assumed to be 0.
+///For 2d boxes, the btBox2dShape is recommended.
+class btConvex2dShape : public btConvexShape
+{
+ btConvexShape* m_childConvexShape;
+
+ public:
+
+ btConvex2dShape( btConvexShape* convexChildShape);
+
+ virtual ~btConvex2dShape();
+
+ virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
+
+ virtual btVector3 localGetSupportingVertex(const btVector3& vec)const;
+
+ virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
+
+ virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+
+ btConvexShape* getChildShape()
+ {
+ return m_childConvexShape;
+ }
+
+ const btConvexShape* getChildShape() const
+ {
+ return m_childConvexShape;
+ }
+
+ virtual const char* getName()const
+ {
+ return "Convex2dShape";
+ }
+
+
+
+ ///////////////////////////
+
+
+ ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
+ void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
+
+ virtual void getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
+
+ virtual void setLocalScaling(const btVector3& scaling) ;
+ virtual const btVector3& getLocalScaling() const ;
+
+ virtual void setMargin(btScalar margin);
+ virtual btScalar getMargin() const;
+
+ virtual int getNumPreferredPenetrationDirections() const;
+
+ virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const;
+
+
+};
+
+#endif //BT_CONVEX_2D_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
index 7b45fad12df..69bc67cafab 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -12,14 +12,14 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
+
#include "btConvexHullShape.h"
#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
#include "LinearMath/btQuaternion.h"
+#include "LinearMath/btSerializer.h"
-
-
-btConvexHullShape ::btConvexHullShape (const btScalar* points,int numPoints,int stride) : btPolyhedralConvexShape ()
+btConvexHullShape ::btConvexHullShape (const btScalar* points,int numPoints,int stride) : btPolyhedralConvexAabbCachingShape ()
{
m_shapeType = CONVEX_HULL_SHAPE_PROXYTYPE;
m_unscaledPoints.resize(numPoints);
@@ -52,22 +52,10 @@ void btConvexHullShape::addPoint(const btVector3& point)
}
-btVector3 btConvexHullShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
+btVector3 btConvexHullShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
{
btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
- btScalar newDot,maxDot = btScalar(-1e30);
-
- btVector3 vec = vec0;
- btScalar lenSqr = vec.length2();
- if (lenSqr < btScalar(0.0001))
- {
- vec.setValue(1,0,0);
- } else
- {
- btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
- vec *= rlen;
- }
-
+ btScalar newDot,maxDot = btScalar(-BT_LARGE_FLOAT);
for (int i=0;i<m_unscaledPoints.size();i++)
{
@@ -90,7 +78,7 @@ void btConvexHullShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const
{
for (int i=0;i<numVectors;i++)
{
- supportVerticesOut[i][3] = btScalar(-1e30);
+ supportVerticesOut[i][3] = btScalar(-BT_LARGE_FLOAT);
}
}
for (int i=0;i<m_unscaledPoints.size();i++)
@@ -186,3 +174,38 @@ bool btConvexHullShape::isInside(const btVector3& ,btScalar ) const
return false;
}
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btConvexHullShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ //int szc = sizeof(btConvexHullShapeData);
+ btConvexHullShapeData* shapeData = (btConvexHullShapeData*) dataBuffer;
+ btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer);
+
+ int numElem = m_unscaledPoints.size();
+ shapeData->m_numUnscaledPoints = numElem;
+#ifdef BT_USE_DOUBLE_PRECISION
+ shapeData->m_unscaledPointsFloatPtr = 0;
+ shapeData->m_unscaledPointsDoublePtr = numElem ? (btVector3Data*)serializer->getUniquePointer((void*)&m_unscaledPoints[0]): 0;
+#else
+ shapeData->m_unscaledPointsFloatPtr = numElem ? (btVector3Data*)serializer->getUniquePointer((void*)&m_unscaledPoints[0]): 0;
+ shapeData->m_unscaledPointsDoublePtr = 0;
+#endif
+
+ if (numElem)
+ {
+ int sz = sizeof(btVector3Data);
+ // int sz2 = sizeof(btVector3DoubleData);
+ // int sz3 = sizeof(btVector3FloatData);
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ btVector3Data* memPtr = (btVector3Data*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_unscaledPoints[i].serialize(*memPtr);
+ }
+ serializer->finalizeChunk(chunk,btVector3DataName,BT_ARRAY_CODE,(void*)&m_unscaledPoints[0]);
+ }
+
+ return "btConvexHullShapeData";
+}
+
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h
index baf074be6c3..bf960f4df92 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -20,9 +20,10 @@ subject to the following restrictions:
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
#include "LinearMath/btAlignedObjectArray.h"
+
///The btConvexHullShape implements an implicit convex hull of an array of vertices.
///Bullet provides a general and fast collision detector for convex shapes based on GJK and EPA using localGetSupportingVertex.
-ATTRIBUTE_ALIGNED16(class) btConvexHullShape : public btPolyhedralConvexShape
+ATTRIBUTE_ALIGNED16(class) btConvexHullShape : public btPolyhedralConvexAabbCachingShape
{
btAlignedObjectArray<btVector3> m_unscaledPoints;
@@ -88,8 +89,32 @@ public:
///in case we receive negative scaling
virtual void setLocalScaling(const btVector3& scaling);
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btConvexHullShapeData
+{
+ btConvexInternalShapeData m_convexInternalShapeData;
+
+ btVector3FloatData *m_unscaledPointsFloatPtr;
+ btVector3DoubleData *m_unscaledPointsDoublePtr;
+
+ int m_numUnscaledPoints;
+ char m_padding3[4];
+
};
+SIMD_FORCE_INLINE int btConvexHullShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btConvexHullShapeData);
+}
+
+
#endif //CONVEX_HULL_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
index bfb741310e1..083d60b1b1e 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -34,7 +34,8 @@ void btConvexInternalShape::setLocalScaling(const btVector3& scaling)
void btConvexInternalShape::getAabbSlow(const btTransform& trans,btVector3&minAabb,btVector3&maxAabb) const
{
-
+#ifndef __SPU__
+ //use localGetSupportingVertexWithoutMargin?
btScalar margin = getMargin();
for (int i=0;i<3;i++)
{
@@ -49,6 +50,7 @@ void btConvexInternalShape::getAabbSlow(const btTransform& trans,btVector3&minAa
tmp = trans(localGetSupportingVertex(vec*trans.getBasis()));
minAabb[i] = tmp[i]-margin;
}
+#endif
}
@@ -79,3 +81,71 @@ btVector3 btConvexInternalShape::localGetSupportingVertex(const btVector3& vec)c
}
+btConvexInternalAabbCachingShape::btConvexInternalAabbCachingShape()
+ : btConvexInternalShape(),
+m_localAabbMin(1,1,1),
+m_localAabbMax(-1,-1,-1),
+m_isLocalAabbValid(false)
+{
+}
+
+
+void btConvexInternalAabbCachingShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
+{
+ getNonvirtualAabb(trans,aabbMin,aabbMax,getMargin());
+}
+
+void btConvexInternalAabbCachingShape::setLocalScaling(const btVector3& scaling)
+{
+ btConvexInternalShape::setLocalScaling(scaling);
+ recalcLocalAabb();
+}
+
+
+void btConvexInternalAabbCachingShape::recalcLocalAabb()
+{
+ m_isLocalAabbValid = true;
+
+ #if 1
+ static const btVector3 _directions[] =
+ {
+ btVector3( 1., 0., 0.),
+ btVector3( 0., 1., 0.),
+ btVector3( 0., 0., 1.),
+ btVector3( -1., 0., 0.),
+ btVector3( 0., -1., 0.),
+ btVector3( 0., 0., -1.)
+ };
+
+ btVector3 _supporting[] =
+ {
+ btVector3( 0., 0., 0.),
+ btVector3( 0., 0., 0.),
+ btVector3( 0., 0., 0.),
+ btVector3( 0., 0., 0.),
+ btVector3( 0., 0., 0.),
+ btVector3( 0., 0., 0.)
+ };
+
+ batchedUnitVectorGetSupportingVertexWithoutMargin(_directions, _supporting, 6);
+
+ for ( int i = 0; i < 3; ++i )
+ {
+ m_localAabbMax[i] = _supporting[i][i] + m_collisionMargin;
+ m_localAabbMin[i] = _supporting[i + 3][i] - m_collisionMargin;
+ }
+
+ #else
+
+ for (int i=0;i<3;i++)
+ {
+ btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
+ vec[i] = btScalar(1.);
+ btVector3 tmp = localGetSupportingVertex(vec);
+ m_localAabbMax[i] = tmp[i]+m_collisionMargin;
+ vec[i] = btScalar(-1.);
+ tmp = localGetSupportingVertex(vec);
+ m_localAabbMin[i] = tmp[i]-m_collisionMargin;
+ }
+ #endif
+}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.h
index bab720d7b6d..12527731804 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.h
@@ -1,8 +1,24 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
#ifndef BT_CONVEX_INTERNAL_SHAPE_H
#define BT_CONVEX_INTERNAL_SHAPE_H
#include "btConvexShape.h"
+#include "LinearMath/btAabbUtil2.h"
+
///The btConvexInternalShape is an internal base class, shared by most convex shape implementations.
class btConvexInternalShape : public btConvexShape
@@ -37,6 +53,15 @@ public:
return m_implicitShapeDimensions;
}
+ ///warning: use setImplicitShapeDimensions with care
+ ///changing a collision shape while the body is in the world is not recommended,
+ ///it is best to remove the body from the world, then make the change, and re-add it
+ ///alternatively flush the contact points, see documentation for 'cleanProxyFromPairs'
+ void setImplicitShapeDimensions(const btVector3& dimensions)
+ {
+ m_implicitShapeDimensions = dimensions;
+ }
+
///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
{
@@ -85,9 +110,93 @@ public:
btAssert(0);
}
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btConvexInternalShapeData
+{
+ btCollisionShapeData m_collisionShapeData;
+
+ btVector3FloatData m_localScaling;
+ btVector3FloatData m_implicitShapeDimensions;
+ float m_collisionMargin;
+
+ int m_padding;
+
};
+
+SIMD_FORCE_INLINE int btConvexInternalShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btConvexInternalShapeData);
+}
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btConvexInternalShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btConvexInternalShapeData* shapeData = (btConvexInternalShapeData*) dataBuffer;
+ btCollisionShape::serialize(&shapeData->m_collisionShapeData, serializer);
+
+ m_implicitShapeDimensions.serializeFloat(shapeData->m_implicitShapeDimensions);
+ m_localScaling.serializeFloat(shapeData->m_localScaling);
+ shapeData->m_collisionMargin = float(m_collisionMargin);
+
+ return "btConvexInternalShapeData";
+}
+
+
+
+
+///btConvexInternalAabbCachingShape adds local aabb caching for convex shapes, to avoid expensive bounding box calculations
+class btConvexInternalAabbCachingShape : public btConvexInternalShape
+{
+ btVector3 m_localAabbMin;
+ btVector3 m_localAabbMax;
+ bool m_isLocalAabbValid;
+
+protected:
+
+ btConvexInternalAabbCachingShape();
+
+ void setCachedLocalAabb (const btVector3& aabbMin, const btVector3& aabbMax)
+ {
+ m_isLocalAabbValid = true;
+ m_localAabbMin = aabbMin;
+ m_localAabbMax = aabbMax;
+ }
+
+ inline void getCachedLocalAabb (btVector3& aabbMin, btVector3& aabbMax) const
+ {
+ btAssert(m_isLocalAabbValid);
+ aabbMin = m_localAabbMin;
+ aabbMax = m_localAabbMax;
+ }
+
+ inline void getNonvirtualAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax, btScalar margin) const
+ {
+
+ //lazy evaluation of local aabb
+ btAssert(m_isLocalAabbValid);
+ btTransformAabb(m_localAabbMin,m_localAabbMax,margin,trans,aabbMin,aabbMax);
+ }
+
+public:
+
+ virtual void setLocalScaling(const btVector3& scaling);
+
+ virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
+
+ void recalcLocalAabb();
+
+};
+
#endif //BT_CONVEX_INTERNAL_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
index 4ab5d692945..c1b155aef45 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -12,6 +12,7 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
+
#include "btConvexPointCloudShape.h"
#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
@@ -27,7 +28,7 @@ void btConvexPointCloudShape::setLocalScaling(const btVector3& scaling)
btVector3 btConvexPointCloudShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
{
btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
- btScalar newDot,maxDot = btScalar(-1e30);
+ btScalar newDot,maxDot = btScalar(-BT_LARGE_FLOAT);
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
@@ -62,7 +63,7 @@ void btConvexPointCloudShape::batchedUnitVectorGetSupportingVertexWithoutMargin(
{
for (int i=0;i<numVectors;i++)
{
- supportVerticesOut[i][3] = btScalar(-1e30);
+ supportVerticesOut[i][3] = btScalar(-BT_LARGE_FLOAT);
}
}
for (int i=0;i<m_numPoints;i++)
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.h
index 7e1c13b29c1..54b5afac3ec 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -21,7 +21,7 @@ subject to the following restrictions:
#include "LinearMath/btAlignedObjectArray.h"
///The btConvexPointCloudShape implements an implicit convex hull of an array of vertices.
-ATTRIBUTE_ALIGNED16(class) btConvexPointCloudShape : public btPolyhedralConvexShape
+ATTRIBUTE_ALIGNED16(class) btConvexPointCloudShape : public btPolyhedralConvexAabbCachingShape
{
btVector3* m_unscaledPoints;
int m_numPoints;
@@ -29,6 +29,14 @@ ATTRIBUTE_ALIGNED16(class) btConvexPointCloudShape : public btPolyhedralConvexSh
public:
BT_DECLARE_ALIGNED_ALLOCATOR();
+ btConvexPointCloudShape()
+ {
+ m_localScaling.setValue(1.f,1.f,1.f);
+ m_shapeType = CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE;
+ m_unscaledPoints = 0;
+ m_numPoints = 0;
+ }
+
btConvexPointCloudShape(btVector3* points,int numPoints, const btVector3& localScaling,bool computeAabb = true)
{
m_localScaling = localScaling;
@@ -40,10 +48,11 @@ public:
recalcLocalAabb();
}
- void setPoints (btVector3* points, int numPoints, bool computeAabb = true)
+ void setPoints (btVector3* points, int numPoints, bool computeAabb = true,const btVector3& localScaling=btVector3(1.f,1.f,1.f))
{
m_unscaledPoints = points;
m_numPoints = numPoints;
+ m_localScaling = localScaling;
if (computeAabb)
recalcLocalAabb();
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp
index 7e67696f4c7..f5f3aa58aa4 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -21,6 +21,18 @@ subject to the following restrictions:
#include "btConvexHullShape.h"
#include "btConvexPointCloudShape.h"
+///not supported on IBM SDK, until we fix the alignment of btVector3
+#if defined (__CELLOS_LV2__) && defined (__SPU__)
+#include <spu_intrinsics.h>
+static inline vec_float4 vec_dot3( vec_float4 vec0, vec_float4 vec1 )
+{
+ vec_float4 result;
+ result = spu_mul( vec0, vec1 );
+ result = spu_madd( spu_rlqwbyte( vec0, 4 ), spu_rlqwbyte( vec1, 4 ), result );
+ return spu_madd( spu_rlqwbyte( vec0, 8 ), spu_rlqwbyte( vec1, 8 ), result );
+}
+#endif //__SPU__
+
btConvexShape::btConvexShape ()
{
}
@@ -32,35 +44,71 @@ btConvexShape::~btConvexShape()
-static btVector3 convexHullSupport (const btVector3& localDir, const btVector3* points, int numPoints, const btVector3& localScaling)
-{
- btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
- btScalar newDot,maxDot = btScalar(-1e30);
-
- btVector3 vec0(localDir.getX(),localDir.getY(),localDir.getZ());
- btVector3 vec = vec0;
- btScalar lenSqr = vec.length2();
- if (lenSqr < btScalar(0.0001))
- {
- vec.setValue(1,0,0);
- } else {
- btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
- vec *= rlen;
+static btVector3 convexHullSupport (const btVector3& localDirOrg, const btVector3* points, int numPoints, const btVector3& localScaling)
+{
+
+ btVector3 vec = localDirOrg * localScaling;
+
+#if defined (__CELLOS_LV2__) && defined (__SPU__)
+
+ btVector3 localDir = vec;
+
+ vec_float4 v_distMax = {-FLT_MAX,0,0,0};
+ vec_int4 v_idxMax = {-999,0,0,0};
+ int v=0;
+ int numverts = numPoints;
+
+ for(;v<(int)numverts-4;v+=4) {
+ vec_float4 p0 = vec_dot3(points[v ].get128(),localDir.get128());
+ vec_float4 p1 = vec_dot3(points[v+1].get128(),localDir.get128());
+ vec_float4 p2 = vec_dot3(points[v+2].get128(),localDir.get128());
+ vec_float4 p3 = vec_dot3(points[v+3].get128(),localDir.get128());
+ const vec_int4 i0 = {v ,0,0,0};
+ const vec_int4 i1 = {v+1,0,0,0};
+ const vec_int4 i2 = {v+2,0,0,0};
+ const vec_int4 i3 = {v+3,0,0,0};
+ vec_uint4 retGt01 = spu_cmpgt(p0,p1);
+ vec_float4 pmax01 = spu_sel(p1,p0,retGt01);
+ vec_int4 imax01 = spu_sel(i1,i0,retGt01);
+ vec_uint4 retGt23 = spu_cmpgt(p2,p3);
+ vec_float4 pmax23 = spu_sel(p3,p2,retGt23);
+ vec_int4 imax23 = spu_sel(i3,i2,retGt23);
+ vec_uint4 retGt0123 = spu_cmpgt(pmax01,pmax23);
+ vec_float4 pmax0123 = spu_sel(pmax23,pmax01,retGt0123);
+ vec_int4 imax0123 = spu_sel(imax23,imax01,retGt0123);
+ vec_uint4 retGtMax = spu_cmpgt(v_distMax,pmax0123);
+ v_distMax = spu_sel(pmax0123,v_distMax,retGtMax);
+ v_idxMax = spu_sel(imax0123,v_idxMax,retGtMax);
}
+ for(;v<(int)numverts;v++) {
+ vec_float4 p = vec_dot3(points[v].get128(),localDir.get128());
+ const vec_int4 i = {v,0,0,0};
+ vec_uint4 retGtMax = spu_cmpgt(v_distMax,p);
+ v_distMax = spu_sel(p,v_distMax,retGtMax);
+ v_idxMax = spu_sel(i,v_idxMax,retGtMax);
+ }
+ int ptIndex = spu_extract(v_idxMax,0);
+ const btVector3& supVec= points[ptIndex] * localScaling;
+ return supVec;
+#else
+ btScalar newDot,maxDot = btScalar(-BT_LARGE_FLOAT);
+ int ptIndex = -1;
for (int i=0;i<numPoints;i++)
{
- btVector3 vtx = points[i] * localScaling;
- newDot = vec.dot(vtx);
+ newDot = vec.dot(points[i]);
if (newDot > maxDot)
{
maxDot = newDot;
- supVec = vtx;
+ ptIndex = i;
}
}
- return btVector3(supVec.getX(),supVec.getY(),supVec.getZ());
+ btAssert(ptIndex >= 0);
+ btVector3 supVec = points[ptIndex] * localScaling;
+ return supVec;
+#endif //__SPU__
}
btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual (const btVector3& localDir) const
@@ -160,7 +208,7 @@ btVector3 btConvexShape::localGetSupportVertexWithoutMarginNonVirtual (const btV
btScalar radius = capsuleShape->getRadius();
btVector3 supVec(0,0,0);
- btScalar maxDot(btScalar(-1e30));
+ btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
@@ -292,7 +340,7 @@ btScalar btConvexShape::getMarginNonVirtual () const
btAssert (0);
return btScalar(0.0f);
}
-
+#ifndef __SPU__
void btConvexShape::getAabbNonVirtual (const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const
{
switch (m_shapeType)
@@ -360,7 +408,7 @@ void btConvexShape::getAabbNonVirtual (const btTransform& t, btVector3& aabbMin,
case CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
case CONVEX_HULL_SHAPE_PROXYTYPE:
{
- btPolyhedralConvexShape* convexHullShape = (btPolyhedralConvexShape*)this;
+ btPolyhedralConvexAabbCachingShape* convexHullShape = (btPolyhedralConvexAabbCachingShape*)this;
btScalar margin = convexHullShape->getMarginNonVirtual();
convexHullShape->getNonvirtualAabb (t, aabbMin, aabbMax, margin);
}
@@ -377,3 +425,5 @@ void btConvexShape::getAabbNonVirtual (const btTransform& t, btVector3& aabbMin,
// should never reach here
btAssert (0);
}
+
+#endif //__SPU__
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h
index 0cc7b349521..9c158259c1c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
index 4bd986bb7f7..0f9ced554b8 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -12,6 +12,7 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
+
#include "btConvexTriangleMeshShape.h"
#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
@@ -20,7 +21,7 @@ subject to the following restrictions:
btConvexTriangleMeshShape ::btConvexTriangleMeshShape (btStridingMeshInterface* meshInterface, bool calcAabb)
-: btPolyhedralConvexShape(), m_stridingMesh(meshInterface)
+: btPolyhedralConvexAabbCachingShape(), m_stridingMesh(meshInterface)
{
m_shapeType = CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE;
if ( calcAabb )
@@ -43,7 +44,7 @@ public:
LocalSupportVertexCallback(const btVector3& supportVecLocal)
: m_supportVertexLocal(btScalar(0.),btScalar(0.),btScalar(0.)),
- m_maxDot(btScalar(-1e30)),
+ m_maxDot(btScalar(-BT_LARGE_FLOAT)),
m_supportVecLocal(supportVecLocal)
{
}
@@ -91,7 +92,7 @@ btVector3 btConvexTriangleMeshShape::localGetSupportingVertexWithoutMargin(const
}
LocalSupportVertexCallback supportCallback(vec);
- btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
m_stridingMesh->InternalProcessAllTriangles(&supportCallback,-aabbMax,aabbMax);
supVec = supportCallback.GetSupportVertexLocal();
@@ -104,7 +105,7 @@ void btConvexTriangleMeshShape::batchedUnitVectorGetSupportingVertexWithoutMargi
{
for (int i=0;i<numVectors;i++)
{
- supportVerticesOut[i][3] = btScalar(-1e30);
+ supportVerticesOut[i][3] = btScalar(-BT_LARGE_FLOAT);
}
}
@@ -115,7 +116,7 @@ void btConvexTriangleMeshShape::batchedUnitVectorGetSupportingVertexWithoutMargi
{
const btVector3& vec = vectors[j];
LocalSupportVertexCallback supportCallback(vec);
- btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
m_stridingMesh->InternalProcessAllTriangles(&supportCallback,-aabbMax,aabbMax);
supportVerticesOut[j] = supportCallback.GetSupportVertexLocal();
}
@@ -297,7 +298,7 @@ void btConvexTriangleMeshShape::calculatePrincipalAxisTransform(btTransform& pri
};
CenterCallback centerCallback;
- btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
m_stridingMesh->InternalProcessAllTriangles(&centerCallback, -aabbMax, aabbMax);
btVector3 center = centerCallback.getCenter();
principal.setOrigin(center);
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
index 9d7e39fce69..f5167e74b80 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
@@ -1,3 +1,17 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
#ifndef CONVEX_TRIANGLEMESH_SHAPE_H
#define CONVEX_TRIANGLEMESH_SHAPE_H
@@ -8,7 +22,7 @@
/// The btConvexTriangleMeshShape is a convex hull of a triangle mesh, but the performance is not as good as btConvexHullShape.
/// A small benefit of this class is that it uses the btStridingMeshInterface, so you can avoid the duplication of the triangle mesh data. Nevertheless, most users should use the much better performing btConvexHullShape instead.
-class btConvexTriangleMeshShape : public btPolyhedralConvexShape
+class btConvexTriangleMeshShape : public btPolyhedralConvexAabbCachingShape
{
class btStridingMeshInterface* m_stridingMesh;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp
index c9fa907edf3..c2e534b0b46 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -12,14 +12,16 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
+
#include "btCylinderShape.h"
btCylinderShape::btCylinderShape (const btVector3& halfExtents)
-:btBoxShape(halfExtents),
+:btConvexInternalShape(),
m_upAxis(1)
{
+ btVector3 margin(getMargin(),getMargin(),getMargin());
+ m_implicitShapeDimensions = (halfExtents * m_localScaling) - margin;
m_shapeType = CYLINDER_SHAPE_PROXYTYPE;
- recalcLocalAabb();
}
@@ -27,7 +29,7 @@ btCylinderShapeX::btCylinderShapeX (const btVector3& halfExtents)
:btCylinderShape(halfExtents)
{
m_upAxis = 0;
- recalcLocalAabb();
+
}
@@ -35,13 +37,84 @@ btCylinderShapeZ::btCylinderShapeZ (const btVector3& halfExtents)
:btCylinderShape(halfExtents)
{
m_upAxis = 2;
- recalcLocalAabb();
+
}
void btCylinderShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
{
- //skip the box 'getAabb'
- btPolyhedralConvexShape::getAabb(t,aabbMin,aabbMax);
+ btTransformAabb(getHalfExtentsWithoutMargin(),getMargin(),t,aabbMin,aabbMax);
+}
+
+void btCylinderShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
+{
+
+//Until Bullet 2.77 a box approximation was used, so uncomment this if you need backwards compatibility
+//#define USE_BOX_INERTIA_APPROXIMATION 1
+#ifndef USE_BOX_INERTIA_APPROXIMATION
+
+ /*
+ cylinder is defined as following:
+ *
+ * - principle axis aligned along y by default, radius in x, z-value not used
+ * - for btCylinderShapeX: principle axis aligned along x, radius in y direction, z-value not used
+ * - for btCylinderShapeZ: principle axis aligned along z, radius in x direction, y-value not used
+ *
+ */
+
+ btScalar radius2; // square of cylinder radius
+ btScalar height2; // square of cylinder height
+ btVector3 halfExtents = getHalfExtentsWithMargin(); // get cylinder dimension
+ btScalar div12 = mass / 12.f;
+ btScalar div4 = mass / 4.f;
+ btScalar div2 = mass / 2.f;
+ int idxRadius, idxHeight;
+
+ switch (m_upAxis) // get indices of radius and height of cylinder
+ {
+ case 0: // cylinder is aligned along x
+ idxRadius = 1;
+ idxHeight = 0;
+ break;
+ case 2: // cylinder is aligned along z
+ idxRadius = 0;
+ idxHeight = 2;
+ break;
+ default: // cylinder is aligned along y
+ idxRadius = 0;
+ idxHeight = 1;
+ }
+
+ // calculate squares
+ radius2 = halfExtents[idxRadius] * halfExtents[idxRadius];
+ height2 = btScalar(4.) * halfExtents[idxHeight] * halfExtents[idxHeight];
+
+ // calculate tensor terms
+ btScalar t1 = div12 * height2 + div4 * radius2;
+ btScalar t2 = div2 * radius2;
+
+ switch (m_upAxis) // set diagonal elements of inertia tensor
+ {
+ case 0: // cylinder is aligned along x
+ inertia.setValue(t2,t1,t1);
+ break;
+ case 2: // cylinder is aligned along z
+ inertia.setValue(t1,t1,t2);
+ break;
+ default: // cylinder is aligned along y
+ inertia.setValue(t1,t2,t1);
+ }
+#else //USE_BOX_INERTIA_APPROXIMATION
+ //approximation of box shape
+ btVector3 halfExtents = getHalfExtentsWithMargin();
+
+ btScalar lx=btScalar(2.)*(halfExtents.x());
+ btScalar ly=btScalar(2.)*(halfExtents.y());
+ btScalar lz=btScalar(2.)*(halfExtents.z());
+
+ inertia.setValue(mass/(btScalar(12.0)) * (ly*ly + lz*lz),
+ mass/(btScalar(12.0)) * (lx*lx + lz*lz),
+ mass/(btScalar(12.0)) * (lx*lx + ly*ly));
+#endif //USE_BOX_INERTIA_APPROXIMATION
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h
index bda74a8612d..f7899265d31 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -21,7 +21,7 @@ subject to the following restrictions:
#include "LinearMath/btVector3.h"
/// The btCylinderShape class implements a cylinder shape primitive, centered around the origin. Its central axis aligned with the Y axis. btCylinderShapeX is aligned with the X axis and btCylinderShapeZ around the Z axis.
-class btCylinderShape : public btBoxShape
+class btCylinderShape : public btConvexInternalShape
{
@@ -30,15 +30,42 @@ protected:
int m_upAxis;
public:
+
+ btVector3 getHalfExtentsWithMargin() const
+ {
+ btVector3 halfExtents = getHalfExtentsWithoutMargin();
+ btVector3 margin(getMargin(),getMargin(),getMargin());
+ halfExtents += margin;
+ return halfExtents;
+ }
+
+ const btVector3& getHalfExtentsWithoutMargin() const
+ {
+ return m_implicitShapeDimensions;//changed in Bullet 2.63: assume the scaling and margin are included
+ }
+
btCylinderShape (const btVector3& halfExtents);
- ///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
+ virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
+ virtual void setMargin(btScalar collisionMargin)
+ {
+ //correct the m_implicitShapeDimensions for the margin
+ btVector3 oldMargin(getMargin(),getMargin(),getMargin());
+ btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
+
+ btConvexInternalShape::setMargin(collisionMargin);
+ btVector3 newMargin(getMargin(),getMargin(),getMargin());
+ m_implicitShapeDimensions = implicitShapeDimensionsWithMargin - newMargin;
+
+ }
+
virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
{
@@ -73,13 +100,28 @@ public:
return getHalfExtentsWithMargin().getX();
}
+ virtual void setLocalScaling(const btVector3& scaling)
+ {
+ btVector3 oldMargin(getMargin(),getMargin(),getMargin());
+ btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
+ btVector3 unScaledImplicitShapeDimensionsWithMargin = implicitShapeDimensionsWithMargin / m_localScaling;
+
+ btConvexInternalShape::setLocalScaling(scaling);
+
+ m_implicitShapeDimensions = (unScaledImplicitShapeDimensionsWithMargin * m_localScaling) - oldMargin;
+
+ }
+
//debugging
virtual const char* getName()const
{
return "CylinderY";
}
+ virtual int calculateSerializeBufferSize() const;
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
};
@@ -112,10 +154,6 @@ public:
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
- virtual int getUpAxis() const
- {
- return 2;
- }
//debugging
virtual const char* getName()const
{
@@ -129,6 +167,34 @@ public:
};
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btCylinderShapeData
+{
+ btConvexInternalShapeData m_convexInternalShapeData;
+
+ int m_upAxis;
+
+ char m_padding[4];
+};
+
+SIMD_FORCE_INLINE int btCylinderShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btCylinderShapeData);
+}
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btCylinderShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btCylinderShapeData* shapeData = (btCylinderShapeData*) dataBuffer;
+
+ btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData,serializer);
+
+ shapeData->m_upAxis = m_upAxis;
+
+ return "btCylinderShapeData";
+}
+
+
#endif //CYLINDER_MINKOWSKI_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.cpp
index 8387b9584bb..a9e6df5c58e 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h
index 8720d53ae63..9f6b4435c29 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
index 7d4875d8037..3a1e6f4a2b9 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
index 36489a0ebc3..4f5d1e35bf3 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMaterial.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btMaterial.h
index 7cb6d5ab6fe..030e167da50 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMaterial.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMaterial.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -31,4 +31,5 @@ public:
btMaterial(btScalar fric, btScalar rest) { m_friction = fric; m_restitution = rest; }
};
-#endif // MATERIAL_H \ No newline at end of file
+#endif // MATERIAL_H
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
index b107b0bea6e..06707e24e55 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -13,6 +13,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+
#include "btMinkowskiSumShape.h"
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
index 6f637fbf40b..d6fd040213b 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
index 9423505290d..c996bfcdaba 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -13,29 +13,31 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+
+
#include "btMultiSphereShape.h"
#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
#include "LinearMath/btQuaternion.h"
+#include "LinearMath/btSerializer.h"
-btMultiSphereShape::btMultiSphereShape (const btVector3& inertiaHalfExtents,const btVector3* positions,const btScalar* radi,int numSpheres)
-:btConvexInternalShape (), m_inertiaHalfExtents(inertiaHalfExtents)
+btMultiSphereShape::btMultiSphereShape (const btVector3* positions,const btScalar* radi,int numSpheres)
+:btConvexInternalAabbCachingShape ()
{
m_shapeType = MULTI_SPHERE_SHAPE_PROXYTYPE;
- btScalar startMargin = btScalar(1e30);
+ //btScalar startMargin = btScalar(BT_LARGE_FLOAT);
- m_numSpheres = numSpheres;
- for (int i=0;i<m_numSpheres;i++)
+ m_localPositionArray.resize(numSpheres);
+ m_radiArray.resize(numSpheres);
+ for (int i=0;i<numSpheres;i++)
{
- m_localPositions[i] = positions[i];
- m_radi[i] = radi[i];
- if (radi[i] < startMargin)
- startMargin = radi[i];
+ m_localPositionArray[i] = positions[i];
+ m_radiArray[i] = radi[i];
+
}
- setMargin(startMargin);
-
-}
+ recalcLocalAabb();
+}
btVector3 btMultiSphereShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
@@ -43,7 +45,7 @@ btMultiSphereShape::btMultiSphereShape (const btVector3& inertiaHalfExtents,cons
int i;
btVector3 supVec(0,0,0);
- btScalar maxDot(btScalar(-1e30));
+ btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
btVector3 vec = vec0;
@@ -60,10 +62,11 @@ btMultiSphereShape::btMultiSphereShape (const btVector3& inertiaHalfExtents,cons
btVector3 vtx;
btScalar newDot;
- const btVector3* pos = &m_localPositions[0];
- const btScalar* rad = &m_radi[0];
+ const btVector3* pos = &m_localPositionArray[0];
+ const btScalar* rad = &m_radiArray[0];
+ int numSpheres = m_localPositionArray.size();
- for (i=0;i<m_numSpheres;i++)
+ for (i=0;i<numSpheres;i++)
{
vtx = (*pos) +vec*m_localScaling*(*rad) - vec * getMargin();
pos++;
@@ -85,17 +88,17 @@ btMultiSphereShape::btMultiSphereShape (const btVector3& inertiaHalfExtents,cons
for (int j=0;j<numVectors;j++)
{
- btScalar maxDot(btScalar(-1e30));
+ btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
const btVector3& vec = vectors[j];
btVector3 vtx;
btScalar newDot;
- const btVector3* pos = &m_localPositions[0];
- const btScalar* rad = &m_radi[0];
-
- for (int i=0;i<m_numSpheres;i++)
+ const btVector3* pos = &m_localPositionArray[0];
+ const btScalar* rad = &m_radiArray[0];
+ int numSpheres = m_localPositionArray.size();
+ for (int i=0;i<numSpheres;i++)
{
vtx = (*pos) +vec*m_localScaling*(*rad) - vec * getMargin();
pos++;
@@ -121,29 +124,44 @@ void btMultiSphereShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
{
//as an approximation, take the inertia of the box that bounds the spheres
- btTransform ident;
- ident.setIdentity();
-// btVector3 aabbMin,aabbMax;
-
-// getAabb(ident,aabbMin,aabbMax);
+ btVector3 localAabbMin,localAabbMax;
+ getCachedLocalAabb(localAabbMin,localAabbMax);
+ btVector3 halfExtents = (localAabbMax-localAabbMin)*btScalar(0.5);
- btVector3 halfExtents = m_inertiaHalfExtents;//(aabbMax - aabbMin)* btScalar(0.5);
+ btScalar lx=btScalar(2.)*(halfExtents.x());
+ btScalar ly=btScalar(2.)*(halfExtents.y());
+ btScalar lz=btScalar(2.)*(halfExtents.z());
- btScalar margin = CONVEX_DISTANCE_MARGIN;
+ inertia.setValue(mass/(btScalar(12.0)) * (ly*ly + lz*lz),
+ mass/(btScalar(12.0)) * (lx*lx + lz*lz),
+ mass/(btScalar(12.0)) * (lx*lx + ly*ly));
- btScalar lx=btScalar(2.)*(halfExtents[0]+margin);
- btScalar ly=btScalar(2.)*(halfExtents[1]+margin);
- btScalar lz=btScalar(2.)*(halfExtents[2]+margin);
- const btScalar x2 = lx*lx;
- const btScalar y2 = ly*ly;
- const btScalar z2 = lz*lz;
- const btScalar scaledmass = mass * btScalar(.08333333);
+}
- inertia[0] = scaledmass * (y2+z2);
- inertia[1] = scaledmass * (x2+z2);
- inertia[2] = scaledmass * (x2+y2);
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btMultiSphereShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btMultiSphereShapeData* shapeData = (btMultiSphereShapeData*) dataBuffer;
+ btConvexInternalShape::serialize(&shapeData->m_convexInternalShapeData, serializer);
+
+ int numElem = m_localPositionArray.size();
+ shapeData->m_localPositionArrayPtr = numElem ? (btPositionAndRadius*)serializer->getUniquePointer((void*)&m_localPositionArray[0]): 0;
+
+ shapeData->m_localPositionArraySize = numElem;
+ if (numElem)
+ {
+ btChunk* chunk = serializer->allocate(sizeof(btPositionAndRadius),numElem);
+ btPositionAndRadius* memPtr = (btPositionAndRadius*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_localPositionArray[i].serializeFloat(memPtr->m_pos);
+ memPtr->m_radius = float(m_radiArray[i]);
+ }
+ serializer->finalizeChunk(chunk,"btPositionAndRadius",BT_ARRAY_CODE,(void*)&m_localPositionArray[0]);
+ }
+
+ return "btMultiSphereShapeData";
}
-
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h
index 97309fbbed9..3db7e320889 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -18,26 +18,21 @@ subject to the following restrictions:
#include "btConvexInternalShape.h"
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#include "LinearMath/btAlignedObjectArray.h"
+#include "LinearMath/btAabbUtil2.h"
-#define MAX_NUM_SPHERES 5
-///The btMultiSphereShape represents the convex hull of a collection of spheres. You can create special capsules or other smooth volumes.
-///It is possible to animate the spheres for deformation.
-class btMultiSphereShape : public btConvexInternalShape
+///The btMultiSphereShape represents the convex hull of a collection of spheres. You can create special capsules or other smooth volumes.
+///It is possible to animate the spheres for deformation, but call 'recalcLocalAabb' after changing any sphere position/radius
+class btMultiSphereShape : public btConvexInternalAabbCachingShape
{
- btVector3 m_localPositions[MAX_NUM_SPHERES];
- btScalar m_radi[MAX_NUM_SPHERES];
- btVector3 m_inertiaHalfExtents;
-
- int m_numSpheres;
+ btAlignedObjectArray<btVector3> m_localPositionArray;
+ btAlignedObjectArray<btScalar> m_radiArray;
-
-
-
public:
- btMultiSphereShape (const btVector3& inertiaHalfExtents,const btVector3* positions,const btScalar* radi,int numSpheres);
+ btMultiSphereShape (const btVector3* positions,const btScalar* radi,int numSpheres);
///CollisionShape Interface
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
@@ -49,17 +44,17 @@ public:
int getSphereCount() const
{
- return m_numSpheres;
+ return m_localPositionArray.size();
}
const btVector3& getSpherePosition(int index) const
{
- return m_localPositions[index];
+ return m_localPositionArray[index];
}
btScalar getSphereRadius(int index) const
{
- return m_radi[index];
+ return m_radiArray[index];
}
@@ -68,7 +63,37 @@ public:
return "MultiSphere";
}
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+
+};
+
+
+struct btPositionAndRadius
+{
+ btVector3FloatData m_pos;
+ float m_radius;
+};
+
+struct btMultiSphereShapeData
+{
+ btConvexInternalShapeData m_convexInternalShapeData;
+
+ btPositionAndRadius *m_localPositionArrayPtr;
+ int m_localPositionArraySize;
+ char m_padding[4];
};
+
+SIMD_FORCE_INLINE int btMultiSphereShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btMultiSphereShapeData);
+}
+
+
+
#endif //MULTI_SPHERE_MINKOWSKI_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp
index fc47e86411d..58799ac96ad 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h
index d025a5c4450..96b2ad95b6d 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -31,13 +31,11 @@ public:
BT_DECLARE_ALIGNED_ALLOCATOR();
- btMultimaterialTriangleMeshShape(): btBvhTriangleMeshShape() {m_shapeType = MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE;}
btMultimaterialTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression, bool buildBvh = true):
btBvhTriangleMeshShape(meshInterface, useQuantizedAabbCompression, buildBvh)
{
m_shapeType = MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE;
- btVector3 m_triangle[3];
const unsigned char *vertexbase;
int numverts;
PHY_ScalarType type;
@@ -71,7 +69,6 @@ public:
{
m_shapeType = MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE;
- btVector3 m_triangle[3];
const unsigned char *vertexbase;
int numverts;
PHY_ScalarType type;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
index 3e73059394c..981b8a2652c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -13,6 +13,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+
#include "btOptimizedBvh.h"
#include "btStridingMeshInterface.h"
#include "LinearMath/btAabbUtil2.h"
@@ -55,8 +56,8 @@ void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantized
{
btOptimizedBvhNode node;
btVector3 aabbMin,aabbMax;
- aabbMin.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
- aabbMax.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
aabbMin.setMin(triangle[0]);
aabbMax.setMax(triangle[0]);
aabbMin.setMin(triangle[1]);
@@ -103,8 +104,8 @@ void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantized
btQuantizedBvhNode node;
btVector3 aabbMin,aabbMax;
- aabbMin.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
- aabbMax.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
aabbMin.setMin(triangle[0]);
aabbMax.setMax(triangle[0]);
aabbMin.setMin(triangle[1]);
@@ -167,8 +168,8 @@ void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantized
{
NodeTriangleCallback callback(m_leafNodes);
- btVector3 aabbMin(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
- btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ btVector3 aabbMin(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
triangles->InternalProcessAllTriangles(&callback,aabbMin,aabbMax);
@@ -336,8 +337,8 @@ void btOptimizedBvh::updateBvhNodes(btStridingMeshInterface* meshInterface,int f
- aabbMin.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
- aabbMax.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
aabbMin.setMin(triangleVerts[0]);
aabbMax.setMax(triangleVerts[0]);
aabbMin.setMin(triangleVerts[1]);
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
index d7536417d7e..749fe6005dd 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -13,6 +13,8 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+///Contains contributions from Disney Studio's
+
#ifndef OPTIMIZED_BVH_H
#define OPTIMIZED_BVH_H
@@ -45,7 +47,7 @@ public:
void updateBvhNodes(btStridingMeshInterface* meshInterface,int firstNode,int endNode,int index);
/// Data buffer MUST be 16 byte aligned
- virtual bool serialize(void *o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian)
+ virtual bool serializeInPlace(void *o_alignedDataBuffer, unsigned i_dataBufferSize, bool i_swapEndian) const
{
return btQuantizedBvh::serialize(o_alignedDataBuffer,i_dataBufferSize,i_swapEndian);
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
index 7a79ac25791..b1ecb3e432c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -15,11 +15,7 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h"
-btPolyhedralConvexShape::btPolyhedralConvexShape() :btConvexInternalShape(),
-m_localAabbMin(1,1,1),
-m_localAabbMax(-1,-1,-1),
-m_isLocalAabbValid(false),
-m_optionalHull(0)
+btPolyhedralConvexShape::btPolyhedralConvexShape() :btConvexInternalShape()
{
}
@@ -27,10 +23,12 @@ m_optionalHull(0)
btVector3 btPolyhedralConvexShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
{
- int i;
- btVector3 supVec(0,0,0);
- btScalar maxDot(btScalar(-1e30));
+
+ btVector3 supVec(0,0,0);
+#ifndef __SPU__
+ int i;
+ btScalar maxDot(btScalar(-BT_LARGE_FLOAT));
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
@@ -57,12 +55,16 @@ btVector3 btPolyhedralConvexShape::localGetSupportingVertexWithoutMargin(const b
}
}
+
+#endif //__SPU__
return supVec;
-
}
+
+
void btPolyhedralConvexShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
{
+#ifndef __SPU__
int i;
btVector3 vtx;
@@ -70,7 +72,7 @@ void btPolyhedralConvexShape::batchedUnitVectorGetSupportingVertexWithoutMargin(
for (i=0;i<numVectors;i++)
{
- supportVerticesOut[i][3] = btScalar(-1e30);
+ supportVerticesOut[i][3] = btScalar(-BT_LARGE_FLOAT);
}
for (int j=0;j<numVectors;j++)
@@ -90,12 +92,14 @@ void btPolyhedralConvexShape::batchedUnitVectorGetSupportingVertexWithoutMargin(
}
}
}
+#endif //__SPU__
}
void btPolyhedralConvexShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const
{
+#ifndef __SPU__
//not yet, return box inertia
btScalar margin = getMargin();
@@ -115,25 +119,31 @@ void btPolyhedralConvexShape::calculateLocalInertia(btScalar mass,btVector3& ine
const btScalar scaledmass = mass * btScalar(0.08333333);
inertia = scaledmass * (btVector3(y2+z2,x2+z2,x2+y2));
-
+#endif //__SPU__
}
-void btPolyhedralConvexShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
+void btPolyhedralConvexAabbCachingShape::setLocalScaling(const btVector3& scaling)
{
- getNonvirtualAabb(trans,aabbMin,aabbMax,getMargin());
+ btConvexInternalShape::setLocalScaling(scaling);
+ recalcLocalAabb();
}
+btPolyhedralConvexAabbCachingShape::btPolyhedralConvexAabbCachingShape()
+:btPolyhedralConvexShape(),
+m_localAabbMin(1,1,1),
+m_localAabbMax(-1,-1,-1),
+m_isLocalAabbValid(false)
+{
+}
-
-void btPolyhedralConvexShape::setLocalScaling(const btVector3& scaling)
+void btPolyhedralConvexAabbCachingShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
{
- btConvexInternalShape::setLocalScaling(scaling);
- recalcLocalAabb();
+ getNonvirtualAabb(trans,aabbMin,aabbMax,getMargin());
}
-void btPolyhedralConvexShape::recalcLocalAabb()
+void btPolyhedralConvexAabbCachingShape::recalcLocalAabb()
{
m_isLocalAabbValid = true;
@@ -181,5 +191,3 @@ void btPolyhedralConvexShape::recalcLocalAabb()
#endif
}
-
-
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
index 7567a42d3ba..2c691b95652 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -17,7 +17,6 @@ subject to the following restrictions:
#define BU_SHAPE
#include "LinearMath/btMatrix3x3.h"
-#include "LinearMath/btAabbUtil2.h"
#include "btConvexInternalShape.h"
@@ -26,10 +25,7 @@ class btPolyhedralConvexShape : public btConvexInternalShape
{
protected:
- btVector3 m_localAabbMin;
- btVector3 m_localAabbMax;
- bool m_isLocalAabbValid;
-
+
public:
btPolyhedralConvexShape();
@@ -38,10 +34,32 @@ public:
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
-
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const;
+
+
+ virtual int getNumVertices() const = 0 ;
+ virtual int getNumEdges() const = 0;
+ virtual void getEdge(int i,btVector3& pa,btVector3& pb) const = 0;
+ virtual void getVertex(int i,btVector3& vtx) const = 0;
+ virtual int getNumPlanes() const = 0;
+ virtual void getPlane(btVector3& planeNormal,btVector3& planeSupport,int i ) const = 0;
+// virtual int getIndex(int i) const = 0 ;
+ virtual bool isInside(const btVector3& pt,btScalar tolerance) const = 0;
+
+};
+
+
+///The btPolyhedralConvexAabbCachingShape adds aabb caching to the btPolyhedralConvexShape
+class btPolyhedralConvexAabbCachingShape : public btPolyhedralConvexShape
+{
+
+ btVector3 m_localAabbMin;
+ btVector3 m_localAabbMax;
+ bool m_isLocalAabbValid;
+
+protected:
void setCachedLocalAabb (const btVector3& aabbMin, const btVector3& aabbMax)
{
@@ -57,6 +75,10 @@ public:
aabbMax = m_localAabbMax;
}
+public:
+
+ btPolyhedralConvexAabbCachingShape();
+
inline void getNonvirtualAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax, btScalar margin) const
{
@@ -65,25 +87,11 @@ public:
btTransformAabb(m_localAabbMin,m_localAabbMax,margin,trans,aabbMin,aabbMax);
}
-
- virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
-
virtual void setLocalScaling(const btVector3& scaling);
- void recalcLocalAabb();
-
- virtual int getNumVertices() const = 0 ;
- virtual int getNumEdges() const = 0;
- virtual void getEdge(int i,btVector3& pa,btVector3& pb) const = 0;
- virtual void getVertex(int i,btVector3& vtx) const = 0;
- virtual int getNumPlanes() const = 0;
- virtual void getPlane(btVector3& planeNormal,btVector3& planeSupport,int i ) const = 0;
-// virtual int getIndex(int i) const = 0 ;
+ virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
- virtual bool isInside(const btVector3& pt,btScalar tolerance) const = 0;
-
- /// optional Hull is for optional Separating Axis Test Hull collision detection, see Hull.cpp
- class Hull* m_optionalHull;
+ void recalcLocalAabb();
};
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
index 203f5b7596c..25d58d61bb1 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -13,6 +13,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+
#include "btScaledBvhTriangleMeshShape.h"
btScaledBvhTriangleMeshShape::btScaledBvhTriangleMeshShape(btBvhTriangleMeshShape* childShape,const btVector3& localScaling)
@@ -61,12 +62,12 @@ void btScaledBvhTriangleMeshShape::processAllTriangles(btTriangleCallback* callb
scaledAabbMin[0] = m_localScaling.getX() >= 0. ? aabbMin[0] * invLocalScaling[0] : aabbMax[0] * invLocalScaling[0];
scaledAabbMin[1] = m_localScaling.getY() >= 0. ? aabbMin[1] * invLocalScaling[1] : aabbMax[1] * invLocalScaling[1];
scaledAabbMin[2] = m_localScaling.getZ() >= 0. ? aabbMin[2] * invLocalScaling[2] : aabbMax[2] * invLocalScaling[2];
- scaledAabbMin[3] = 0.0; /* otherwise un-initialized stack memory: uninitialized_stack_vec.patch, blender patch */
+ scaledAabbMin[3] = 0.f;
scaledAabbMax[0] = m_localScaling.getX() <= 0. ? aabbMin[0] * invLocalScaling[0] : aabbMax[0] * invLocalScaling[0];
scaledAabbMax[1] = m_localScaling.getY() <= 0. ? aabbMin[1] * invLocalScaling[1] : aabbMax[1] * invLocalScaling[1];
scaledAabbMax[2] = m_localScaling.getZ() <= 0. ? aabbMin[2] * invLocalScaling[2] : aabbMax[2] * invLocalScaling[2];
- scaledAabbMax[3] = 0.0; /* otherwise un-initialized stack memory: uninitialized_stack_vec.patch, blender patch */
+ scaledAabbMax[3] = 0.f;
m_bvhTriMeshShape->processAllTriangles(&scaledCallback,scaledAabbMin,scaledAabbMax);
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h
index 5da6fe8bc95..4ab28555ba8 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -57,6 +57,37 @@ public:
//debugging
virtual const char* getName()const {return "SCALEDBVHTRIANGLEMESH";}
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
};
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btScaledTriangleMeshShapeData
+{
+ btTriangleMeshShapeData m_trimeshShapeData;
+
+ btVector3FloatData m_localScaling;
+};
+
+
+SIMD_FORCE_INLINE int btScaledBvhTriangleMeshShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btScaledTriangleMeshShapeData);
+}
+
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btScaledBvhTriangleMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btScaledTriangleMeshShapeData* scaledMeshData = (btScaledTriangleMeshShapeData*) dataBuffer;
+ m_bvhTriMeshShape->serialize(&scaledMeshData->m_trimeshShapeData,serializer);
+ scaledMeshData->m_trimeshShapeData.m_collisionShapeData.m_shapeType = SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE;
+ m_localScaling.serializeFloat(scaledMeshData->m_localScaling);
+ return "btScaledTriangleMeshShapeData";
+}
+
+
#endif //BVH_TRIANGLE_MESH_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.cpp
index a87b87f1a6f..3beaf865801 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.cpp
@@ -1,13 +1,11 @@
/*
-btbtShapeHull implemented by John McCutchan.
-
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2008 Erwin Coumans http://bulletphysics.com
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it freely,
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
@@ -15,57 +13,14 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+//btShapeHull was implemented by John McCutchan.
+
+
#include "btShapeHull.h"
#include "LinearMath/btConvexHull.h"
#define NUM_UNITSPHERE_POINTS 42
-static btVector3 btUnitSpherePoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
-{
- btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
- btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
- btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
- btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
- btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
- btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
- btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
- btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
- btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
- btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
- btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
- btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
- btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
- btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
- btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
- btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
- btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
- btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
- btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
- btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
- btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
- btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
- btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
- btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
- btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
- btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
- btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
- btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
- btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
- btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
- btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
- btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
- btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
- btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
- btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
- btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
- btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
- btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
- btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
- btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
- btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
- btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
-};
-
btShapeHull::btShapeHull (const btConvexShape* shape)
{
m_shape = shape;
@@ -92,7 +47,7 @@ btShapeHull::buildHull (btScalar /*margin*/)
{
btVector3 norm;
m_shape->getPreferredPenetrationDirection(i,norm);
- btUnitSpherePoints[numSampleDirections] = norm;
+ getUnitSpherePoints()[numSampleDirections] = norm;
numSampleDirections++;
}
}
@@ -102,7 +57,7 @@ btShapeHull::buildHull (btScalar /*margin*/)
int i;
for (i = 0; i < numSampleDirections; i++)
{
- supportPoints[i] = m_shape->localGetSupportingVertex(btUnitSpherePoints[i]);
+ supportPoints[i] = m_shape->localGetSupportingVertex(getUnitSpherePoints()[i]);
}
HullDesc hd;
@@ -162,3 +117,54 @@ btShapeHull::numIndices () const
return static_cast<int>(m_numIndices);
}
+
+btVector3* btShapeHull::getUnitSpherePoints()
+{
+ static btVector3 sUnitSpherePoints[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
+ {
+ btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
+ btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
+ btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
+ btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
+ btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
+ btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
+ btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
+ btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
+ btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
+ btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
+ btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
+ btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
+ btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
+ btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
+ btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
+ btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
+ btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
+ btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
+ btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
+ btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
+ btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
+ btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
+ btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
+ btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
+ btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
+ btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
+ btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
+ btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
+ btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
+ btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
+ btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
+ btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
+ btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
+ btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
+ btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
+ btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
+ btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
+ btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
+ btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
+ btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
+ btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
+ btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
+ };
+ return sUnitSpherePoints;
+}
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.h
index 583c6b99eb6..07b3500f994 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btShapeHull.h
@@ -1,13 +1,11 @@
/*
-btShapeHull implemented by John McCutchan.
-
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it freely,
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
@@ -15,6 +13,8 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+///btShapeHull implemented by John McCutchan.
+
#ifndef _SHAPE_HULL_H
#define _SHAPE_HULL_H
@@ -27,6 +27,15 @@ subject to the following restrictions:
///It approximates the convex hull using the supporting vertex of 42 directions.
class btShapeHull
{
+protected:
+
+ btAlignedObjectArray<btVector3> m_vertices;
+ btAlignedObjectArray<unsigned int> m_indices;
+ unsigned int m_numIndices;
+ const btConvexShape* m_shape;
+
+ static btVector3* getUnitSpherePoints();
+
public:
btShapeHull (const btConvexShape* shape);
~btShapeHull ();
@@ -45,12 +54,6 @@ public:
{
return &m_indices[0];
}
-
-protected:
- btAlignedObjectArray<btVector3> m_vertices;
- btAlignedObjectArray<unsigned int> m_indices;
- unsigned int m_numIndices;
- const btConvexShape* m_shape;
};
#endif //_SHAPE_HULL_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.cpp
index cab7b277289..b9a736c0fdd 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h
index bf163d3b501..f98372442ba 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -12,7 +12,6 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef SPHERE_MINKOWSKI_H
#define SPHERE_MINKOWSKI_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp
index 17b8776d459..38ef8f03706 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -38,7 +38,7 @@ void btStaticPlaneShape::getAabb(const btTransform& t,btVector3& aabbMin,btVecto
{
(void)t;
/*
- btVector3 infvec (btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ btVector3 infvec (btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
btVector3 center = m_planeNormal*m_planeConstant;
aabbMin = center + infvec*m_planeNormal;
@@ -47,8 +47,8 @@ void btStaticPlaneShape::getAabb(const btTransform& t,btVector3& aabbMin,btVecto
aabbMax.setMax(center - infvec*m_planeNormal);
*/
- aabbMin.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
- aabbMax.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ aabbMin.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h
index a496013c077..beb53ef33a1 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -20,7 +20,7 @@ subject to the following restrictions:
///The btStaticPlaneShape simulates an infinite non-moving (static) collision plane.
-class btStaticPlaneShape : public btConcaveShape
+ATTRIBUTE_ALIGNED16(class) btStaticPlaneShape : public btConcaveShape
{
protected:
btVector3 m_localAabbMin;
@@ -58,7 +58,46 @@ public:
//debugging
virtual const char* getName()const {return "STATICPLANE";}
+ virtual int calculateSerializeBufferSize() const;
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btStaticPlaneShapeData
+{
+ btCollisionShapeData m_collisionShapeData;
+
+ btVector3FloatData m_localScaling;
+ btVector3FloatData m_planeNormal;
+ float m_planeConstant;
+ char m_pad[4];
};
+
+SIMD_FORCE_INLINE int btStaticPlaneShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btStaticPlaneShapeData);
+}
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btStaticPlaneShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btStaticPlaneShapeData* planeData = (btStaticPlaneShapeData*) dataBuffer;
+ btCollisionShape::serialize(&planeData->m_collisionShapeData,serializer);
+
+ m_localScaling.serializeFloat(planeData->m_localScaling);
+ m_planeNormal.serializeFloat(planeData->m_planeNormal);
+ planeData->m_planeConstant = float(m_planeConstant);
+
+ return "btStaticPlaneShapeData";
+}
+
+
#endif //STATIC_PLANE_SHAPE_H
+
+
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
index 752a5fc1dfa..bc2f9f21448 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -14,6 +14,7 @@ subject to the following restrictions:
*/
#include "btStridingMeshInterface.h"
+#include "LinearMath/btSerializer.h"
btStridingMeshInterface::~btStridingMeshInterface()
{
@@ -35,7 +36,6 @@ void btStridingMeshInterface::InternalProcessAllTriangles(btInternalTriangleInde
int stride,numverts,numtriangles;
int gfxindex;
btVector3 triangle[3];
- btScalar* graphicsbase;
btVector3 meshScaling = getScaling();
@@ -45,40 +45,128 @@ void btStridingMeshInterface::InternalProcessAllTriangles(btInternalTriangleInde
getLockedReadOnlyVertexIndexBase(&vertexbase,numverts,type,stride,&indexbase,indexstride,numtriangles,gfxindextype,part);
numtotalphysicsverts+=numtriangles*3; //upper bound
- switch (gfxindextype)
+ ///unlike that developers want to pass in double-precision meshes in single-precision Bullet build
+ ///so disable this feature by default
+ ///see patch http://code.google.com/p/bullet/issues/detail?id=213
+
+ switch (type)
{
- case PHY_INTEGER:
- {
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
- {
- unsigned int* tri_indices= (unsigned int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (btScalar*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (btScalar*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (btScalar*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
- }
- break;
- }
- case PHY_SHORT:
+ case PHY_FLOAT:
+ {
+
+ float* graphicsbase;
+
+ switch (gfxindextype)
+ {
+ case PHY_INTEGER:
+ {
+ for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ {
+ unsigned int* tri_indices= (unsigned int*)(indexbase+gfxindex*indexstride);
+ graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
+ triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase+tri_indices[1]*stride);
+ triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase+tri_indices[2]*stride);
+ triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ }
+ break;
+ }
+ case PHY_SHORT:
+ {
+ for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ {
+ unsigned short int* tri_indices= (unsigned short int*)(indexbase+gfxindex*indexstride);
+ graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
+ triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase+tri_indices[1]*stride);
+ triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase+tri_indices[2]*stride);
+ triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ }
+ break;
+ }
+ case PHY_UCHAR:
+ {
+ for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ {
+ unsigned char* tri_indices= (unsigned char*)(indexbase+gfxindex*indexstride);
+ graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
+ triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase+tri_indices[1]*stride);
+ triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (float*)(vertexbase+tri_indices[2]*stride);
+ triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ }
+ break;
+ }
+ default:
+ btAssert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
+ }
+ break;
+ }
+
+ case PHY_DOUBLE:
{
- for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ double* graphicsbase;
+
+ switch (gfxindextype)
{
- unsigned short int* tri_indices= (unsigned short int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (btScalar*)(vertexbase+tri_indices[0]*stride);
- triangle[0].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(),graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (btScalar*)(vertexbase+tri_indices[1]*stride);
- triangle[1].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- graphicsbase = (btScalar*)(vertexbase+tri_indices[2]*stride);
- triangle[2].setValue(graphicsbase[0]*meshScaling.getX(),graphicsbase[1]*meshScaling.getY(), graphicsbase[2]*meshScaling.getZ());
- callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ case PHY_INTEGER:
+ {
+ for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ {
+ unsigned int* tri_indices= (unsigned int*)(indexbase+gfxindex*indexstride);
+ graphicsbase = (double*)(vertexbase+tri_indices[0]*stride);
+ triangle[0].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(),(btScalar)graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase+tri_indices[1]*stride);
+ triangle[1].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase+tri_indices[2]*stride);
+ triangle[2].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ }
+ break;
+ }
+ case PHY_SHORT:
+ {
+ for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ {
+ unsigned short int* tri_indices= (unsigned short int*)(indexbase+gfxindex*indexstride);
+ graphicsbase = (double*)(vertexbase+tri_indices[0]*stride);
+ triangle[0].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(),(btScalar)graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase+tri_indices[1]*stride);
+ triangle[1].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase+tri_indices[2]*stride);
+ triangle[2].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ }
+ break;
+ }
+ case PHY_UCHAR:
+ {
+ for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ {
+ unsigned char* tri_indices= (unsigned char*)(indexbase+gfxindex*indexstride);
+ graphicsbase = (double*)(vertexbase+tri_indices[0]*stride);
+ triangle[0].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(),(btScalar)graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase+tri_indices[1]*stride);
+ triangle[1].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
+ graphicsbase = (double*)(vertexbase+tri_indices[2]*stride);
+ triangle[2].setValue((btScalar)graphicsbase[0]*meshScaling.getX(),(btScalar)graphicsbase[1]*meshScaling.getY(), (btScalar)graphicsbase[2]*meshScaling.getZ());
+ callback->internalProcessTriangleIndex(triangle,part,gfxindex);
+ }
+ break;
+ }
+ default:
+ btAssert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
}
break;
}
default:
- btAssert((gfxindextype == PHY_INTEGER) || (gfxindextype == PHY_SHORT));
+ btAssert((type == PHY_FLOAT) || (type == PHY_DOUBLE));
}
unLockReadOnlyVertexBase(part);
@@ -95,8 +183,8 @@ void btStridingMeshInterface::calculateAabbBruteForce(btVector3& aabbMin,btVecto
AabbCalculationCallback()
{
- m_aabbMin.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
- m_aabbMax.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ m_aabbMin.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
+ m_aabbMax.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
}
virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
@@ -113,12 +201,179 @@ void btStridingMeshInterface::calculateAabbBruteForce(btVector3& aabbMin,btVecto
}
};
- //first calculate the total aabb for all triangles
+ //first calculate the total aabb for all triangles
AabbCalculationCallback aabbCallback;
- aabbMin.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
- aabbMax.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ aabbMin.setValue(btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT),btScalar(-BT_LARGE_FLOAT));
+ aabbMax.setValue(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
InternalProcessAllTriangles(&aabbCallback,aabbMin,aabbMax);
aabbMin = aabbCallback.m_aabbMin;
aabbMax = aabbCallback.m_aabbMax;
}
+
+
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btStridingMeshInterface::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btStridingMeshInterfaceData* trimeshData = (btStridingMeshInterfaceData*) dataBuffer;
+
+ trimeshData->m_numMeshParts = getNumSubParts();
+
+ //void* uniquePtr = 0;
+
+ trimeshData->m_meshPartsPtr = 0;
+
+ if (trimeshData->m_numMeshParts)
+ {
+ btChunk* chunk = serializer->allocate(sizeof(btMeshPartData),trimeshData->m_numMeshParts);
+ btMeshPartData* memPtr = (btMeshPartData*)chunk->m_oldPtr;
+ trimeshData->m_meshPartsPtr = (btMeshPartData *)serializer->getUniquePointer(memPtr);
+
+
+ // int numtotalphysicsverts = 0;
+ int part,graphicssubparts = getNumSubParts();
+ const unsigned char * vertexbase;
+ const unsigned char * indexbase;
+ int indexstride;
+ PHY_ScalarType type;
+ PHY_ScalarType gfxindextype;
+ int stride,numverts,numtriangles;
+ int gfxindex;
+ // btVector3 triangle[3];
+
+ btVector3 meshScaling = getScaling();
+
+ ///if the number of parts is big, the performance might drop due to the innerloop switch on indextype
+ for (part=0;part<graphicssubparts ;part++,memPtr++)
+ {
+ getLockedReadOnlyVertexIndexBase(&vertexbase,numverts,type,stride,&indexbase,indexstride,numtriangles,gfxindextype,part);
+ memPtr->m_numTriangles = numtriangles;//indices = 3*numtriangles
+ memPtr->m_numVertices = numverts;
+ memPtr->m_indices16 = 0;
+ memPtr->m_indices32 = 0;
+ memPtr->m_3indices16 = 0;
+ memPtr->m_vertices3f = 0;
+ memPtr->m_vertices3d = 0;
+
+ switch (gfxindextype)
+ {
+ case PHY_INTEGER:
+ {
+ int numindices = numtriangles*3;
+
+ if (numindices)
+ {
+ btChunk* chunk = serializer->allocate(sizeof(btIntIndexData),numindices);
+ btIntIndexData* tmpIndices = (btIntIndexData*)chunk->m_oldPtr;
+ memPtr->m_indices32 = (btIntIndexData*)serializer->getUniquePointer(tmpIndices);
+ for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ {
+ unsigned int* tri_indices= (unsigned int*)(indexbase+gfxindex*indexstride);
+ tmpIndices[gfxindex*3].m_value = tri_indices[0];
+ tmpIndices[gfxindex*3+1].m_value = tri_indices[1];
+ tmpIndices[gfxindex*3+2].m_value = tri_indices[2];
+ }
+ serializer->finalizeChunk(chunk,"btIntIndexData",BT_ARRAY_CODE,(void*)chunk->m_oldPtr);
+ }
+ break;
+ }
+ case PHY_SHORT:
+ {
+ if (numtriangles)
+ {
+ btChunk* chunk = serializer->allocate(sizeof(btShortIntIndexTripletData),numtriangles);
+ btShortIntIndexTripletData* tmpIndices = (btShortIntIndexTripletData*)chunk->m_oldPtr;
+ memPtr->m_3indices16 = (btShortIntIndexTripletData*) serializer->getUniquePointer(tmpIndices);
+ for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ {
+ unsigned short int* tri_indices= (unsigned short int*)(indexbase+gfxindex*indexstride);
+ tmpIndices[gfxindex].m_values[0] = tri_indices[0];
+ tmpIndices[gfxindex].m_values[1] = tri_indices[1];
+ tmpIndices[gfxindex].m_values[2] = tri_indices[2];
+ }
+ serializer->finalizeChunk(chunk,"btShortIntIndexTripletData",BT_ARRAY_CODE,(void*)chunk->m_oldPtr);
+ }
+ break;
+ }
+ case PHY_UCHAR:
+ {
+ if (numtriangles)
+ {
+ btChunk* chunk = serializer->allocate(sizeof(btCharIndexTripletData),numtriangles);
+ btCharIndexTripletData* tmpIndices = (btCharIndexTripletData*)chunk->m_oldPtr;
+ memPtr->m_3indices8 = (btCharIndexTripletData*) serializer->getUniquePointer(tmpIndices);
+ for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
+ {
+ unsigned char* tri_indices= (unsigned char*)(indexbase+gfxindex*indexstride);
+ tmpIndices[gfxindex].m_values[0] = tri_indices[0];
+ tmpIndices[gfxindex].m_values[1] = tri_indices[1];
+ tmpIndices[gfxindex].m_values[2] = tri_indices[2];
+ }
+ serializer->finalizeChunk(chunk,"btCharIndexTripletData",BT_ARRAY_CODE,(void*)chunk->m_oldPtr);
+ }
+ break;
+ }
+ default:
+ {
+ btAssert(0);
+ //unknown index type
+ }
+ }
+
+ switch (type)
+ {
+ case PHY_FLOAT:
+ {
+ float* graphicsbase;
+
+ if (numverts)
+ {
+ btChunk* chunk = serializer->allocate(sizeof(btVector3FloatData),numverts);
+ btVector3FloatData* tmpVertices = (btVector3FloatData*) chunk->m_oldPtr;
+ memPtr->m_vertices3f = (btVector3FloatData *)serializer->getUniquePointer(tmpVertices);
+ for (int i=0;i<numverts;i++)
+ {
+ graphicsbase = (float*)(vertexbase+i*stride);
+ tmpVertices[i].m_floats[0] = graphicsbase[0];
+ tmpVertices[i].m_floats[1] = graphicsbase[1];
+ tmpVertices[i].m_floats[2] = graphicsbase[2];
+ }
+ serializer->finalizeChunk(chunk,"btVector3FloatData",BT_ARRAY_CODE,(void*)chunk->m_oldPtr);
+ }
+ break;
+ }
+
+ case PHY_DOUBLE:
+ {
+ if (numverts)
+ {
+ btChunk* chunk = serializer->allocate(sizeof(btVector3DoubleData),numverts);
+ btVector3DoubleData* tmpVertices = (btVector3DoubleData*) chunk->m_oldPtr;
+ memPtr->m_vertices3d = (btVector3DoubleData *) serializer->getUniquePointer(tmpVertices);
+ for (int i=0;i<numverts;i++)
+ {
+ double* graphicsbase = (double*)(vertexbase+i*stride);//for now convert to float, might leave it at double
+ tmpVertices[i].m_floats[0] = graphicsbase[0];
+ tmpVertices[i].m_floats[1] = graphicsbase[1];
+ tmpVertices[i].m_floats[2] = graphicsbase[2];
+ }
+ serializer->finalizeChunk(chunk,"btVector3DoubleData",BT_ARRAY_CODE,(void*)chunk->m_oldPtr);
+ }
+ break;
+ }
+
+ default:
+ btAssert((type == PHY_FLOAT) || (type == PHY_DOUBLE));
+ }
+
+ unLockReadOnlyVertexBase(part);
+ }
+
+ serializer->finalizeChunk(chunk,"btMeshPartData",BT_ARRAY_CODE,chunk->m_oldPtr);
+ }
+
+
+ m_scaling.serializeFloat(trimeshData->m_scaling);
+ return "btStridingMeshInterfaceData";
+}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h
index e61b11499d4..9e3e2ab0f59 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -22,6 +22,8 @@ subject to the following restrictions:
+
+
/// The btStridingMeshInterface is the interface class for high performance generic access to triangle meshes, used in combination with btBvhTriangleMeshShape and some other collision shapes.
/// Using index striding of 3*sizeof(integer) it can use triangle arrays, using index striding of 1*sizeof(integer) it can handle triangle strips.
/// It allows for sharing graphics and collision meshes. Also it provides locking/unlocking of graphics meshes that are in gpu memory.
@@ -89,8 +91,72 @@ class btStridingMeshInterface
m_scaling = scaling;
}
-
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+
+};
+
+struct btIntIndexData
+{
+ int m_value;
+};
+struct btShortIntIndexData
+{
+ short m_value;
+ char m_pad[2];
+};
+
+struct btShortIntIndexTripletData
+{
+ short m_values[3];
+ char m_pad[2];
};
+struct btCharIndexTripletData
+{
+ unsigned char m_values[3];
+ char m_pad;
+};
+
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btMeshPartData
+{
+ btVector3FloatData *m_vertices3f;
+ btVector3DoubleData *m_vertices3d;
+
+ btIntIndexData *m_indices32;
+ btShortIntIndexTripletData *m_3indices16;
+ btCharIndexTripletData *m_3indices8;
+
+ btShortIntIndexData *m_indices16;//backwards compatibility
+
+ int m_numTriangles;//length of m_indices = m_numTriangles
+ int m_numVertices;
+};
+
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btStridingMeshInterfaceData
+{
+ btMeshPartData *m_meshPartsPtr;
+ btVector3FloatData m_scaling;
+ int m_numMeshParts;
+ char m_padding[4];
+};
+
+
+
+
+SIMD_FORCE_INLINE int btStridingMeshInterface::calculateSerializeBufferSize() const
+{
+ return sizeof(btStridingMeshInterfaceData);
+}
+
+
+
#endif //STRIDING_MESHINTERFACE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp
index 7fd8fb4691b..52f346bf726 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp
@@ -1,7 +1,6 @@
-
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -13,23 +12,24 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
+
#include "btTetrahedronShape.h"
#include "LinearMath/btMatrix3x3.h"
-btBU_Simplex1to4::btBU_Simplex1to4() : btPolyhedralConvexShape (),
+btBU_Simplex1to4::btBU_Simplex1to4() : btPolyhedralConvexAabbCachingShape (),
m_numVertices(0)
{
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
}
-btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0) : btPolyhedralConvexShape (),
+btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0) : btPolyhedralConvexAabbCachingShape (),
m_numVertices(0)
{
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
addVertex(pt0);
}
-btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1) : btPolyhedralConvexShape (),
+btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1) : btPolyhedralConvexAabbCachingShape (),
m_numVertices(0)
{
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
@@ -37,7 +37,7 @@ m_numVertices(0)
addVertex(pt1);
}
-btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1,const btVector3& pt2) : btPolyhedralConvexShape (),
+btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1,const btVector3& pt2) : btPolyhedralConvexAabbCachingShape (),
m_numVertices(0)
{
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
@@ -46,7 +46,7 @@ m_numVertices(0)
addVertex(pt2);
}
-btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1,const btVector3& pt2,const btVector3& pt3) : btPolyhedralConvexShape (),
+btBU_Simplex1to4::btBU_Simplex1to4(const btVector3& pt0,const btVector3& pt1,const btVector3& pt2,const btVector3& pt3) : btPolyhedralConvexAabbCachingShape (),
m_numVertices(0)
{
m_shapeType = TETRAHEDRAL_SHAPE_PROXYTYPE;
@@ -57,13 +57,31 @@ m_numVertices(0)
}
+void btBU_Simplex1to4::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+{
+#if 1
+ btPolyhedralConvexAabbCachingShape::getAabb(t,aabbMin,aabbMax);
+#else
+ aabbMin.setValue(BT_LARGE_FLOAT,BT_LARGE_FLOAT,BT_LARGE_FLOAT);
+ aabbMax.setValue(-BT_LARGE_FLOAT,-BT_LARGE_FLOAT,-BT_LARGE_FLOAT);
+
+ //just transform the vertices in worldspace, and take their AABB
+ for (int i=0;i<m_numVertices;i++)
+ {
+ btVector3 worldVertex = t(m_vertices[i]);
+ aabbMin.setMin(worldVertex);
+ aabbMax.setMax(worldVertex);
+ }
+#endif
+}
+
+
void btBU_Simplex1to4::addVertex(const btVector3& pt)
{
m_vertices[m_numVertices++] = pt;
-
recalcLocalAabb();
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h
index 114ae288bb0..72e9f232876 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -22,7 +22,7 @@ subject to the following restrictions:
///The btBU_Simplex1to4 implements tetrahedron, triangle, line, vertex collision shapes. In most cases it is better to use btConvexHullShape instead.
-class btBU_Simplex1to4 : public btPolyhedralConvexShape
+class btBU_Simplex1to4 : public btPolyhedralConvexAabbCachingShape
{
protected:
@@ -43,7 +43,7 @@ public:
m_numVertices = 0;
}
-
+ virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
void addVertex(const btVector3& pt);
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.cpp
index 5194219f256..3027e65b256 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.h
index adca38041b2..b71fc8b3746 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.cpp
index a020746db5f..f558bf6d241 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h
index cb760be80ca..0499702b05b 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
index 5f292532861..a665024cb61 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
@@ -1,11 +1,11 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it freely,
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
@@ -44,11 +44,9 @@ void btTriangleIndexVertexArray::getLockedVertexIndexBase(unsigned char **vertex
numverts = mesh.m_numVertices;
(*vertexbase) = (unsigned char *) mesh.m_vertexBase;
- #ifdef BT_USE_DOUBLE_PRECISION
- type = PHY_DOUBLE;
- #else
- type = PHY_FLOAT;
- #endif
+
+ type = mesh.m_vertexType;
+
vertexStride = mesh.m_vertexStride;
numfaces = mesh.m_numTriangles;
@@ -64,11 +62,9 @@ void btTriangleIndexVertexArray::getLockedReadOnlyVertexIndexBase(const unsigned
numverts = mesh.m_numVertices;
(*vertexbase) = (const unsigned char *)mesh.m_vertexBase;
- #ifdef BT_USE_DOUBLE_PRECISION
- type = PHY_DOUBLE;
- #else
- type = PHY_FLOAT;
- #endif
+
+ type = mesh.m_vertexType;
+
vertexStride = mesh.m_vertexStride;
numfaces = mesh.m_numTriangles;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
index eb79ff5e47d..c64ea6e7043 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -27,16 +27,32 @@ ATTRIBUTE_ALIGNED16( struct) btIndexedMesh
{
BT_DECLARE_ALIGNED_ALLOCATOR();
- int m_numTriangles;
- const unsigned char * m_triangleIndexBase;
- int m_triangleIndexStride;
- int m_numVertices;
- const unsigned char * m_vertexBase;
- int m_vertexStride;
- // The index type is set when adding an indexed mesh to the
- // btTriangleIndexVertexArray, do not set it manually
- PHY_ScalarType m_indexType;
- int pad;
+ int m_numTriangles;
+ const unsigned char * m_triangleIndexBase;
+ int m_triangleIndexStride;
+ int m_numVertices;
+ const unsigned char * m_vertexBase;
+ int m_vertexStride;
+
+ // The index type is set when adding an indexed mesh to the
+ // btTriangleIndexVertexArray, do not set it manually
+ PHY_ScalarType m_indexType;
+
+ // The vertex type has a default type similar to Bullet's precision mode (float or double)
+ // but can be set manually if you for example run Bullet with double precision but have
+ // mesh data in single precision..
+ PHY_ScalarType m_vertexType;
+
+
+ btIndexedMesh()
+ :m_indexType(PHY_INTEGER),
+#ifdef BT_USE_DOUBLE_PRECISION
+ m_vertexType(PHY_DOUBLE)
+#else // BT_USE_DOUBLE_PRECISION
+ m_vertexType(PHY_FLOAT)
+#endif // BT_USE_DOUBLE_PRECISION
+ {
+ }
}
;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp
index abefa71250a..dc562941ad6 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp
@@ -1,12 +1,11 @@
-
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it freely,
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h
index 69a2e631458..ba4f7b46076 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleInfoMap.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleInfoMap.h
new file mode 100644
index 00000000000..282a7702e80
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleInfoMap.h
@@ -0,0 +1,238 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2010 Erwin Coumans http://bulletphysics.org
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef _BT_TRIANGLE_INFO_MAP_H
+#define _BT_TRIANGLE_INFO_MAP_H
+
+
+#include "LinearMath/btHashMap.h"
+#include "LinearMath/btSerializer.h"
+
+
+///for btTriangleInfo m_flags
+#define TRI_INFO_V0V1_CONVEX 1
+#define TRI_INFO_V1V2_CONVEX 2
+#define TRI_INFO_V2V0_CONVEX 4
+
+#define TRI_INFO_V0V1_SWAP_NORMALB 8
+#define TRI_INFO_V1V2_SWAP_NORMALB 16
+#define TRI_INFO_V2V0_SWAP_NORMALB 32
+
+
+///The btTriangleInfo structure stores information to adjust collision normals to avoid collisions against internal edges
+///it can be generated using
+struct btTriangleInfo
+{
+ btTriangleInfo()
+ {
+ m_edgeV0V1Angle = SIMD_2_PI;
+ m_edgeV1V2Angle = SIMD_2_PI;
+ m_edgeV2V0Angle = SIMD_2_PI;
+ m_flags=0;
+ }
+
+ int m_flags;
+
+ btScalar m_edgeV0V1Angle;
+ btScalar m_edgeV1V2Angle;
+ btScalar m_edgeV2V0Angle;
+
+};
+
+typedef btHashMap<btHashInt,btTriangleInfo> btInternalTriangleInfoMap;
+
+
+///The btTriangleInfoMap stores edge angle information for some triangles. You can compute this information yourself or using btGenerateInternalEdgeInfo.
+struct btTriangleInfoMap : public btInternalTriangleInfoMap
+{
+ btScalar m_convexEpsilon;///used to determine if an edge or contact normal is convex, using the dot product
+ btScalar m_planarEpsilon; ///used to determine if a triangle edge is planar with zero angle
+ btScalar m_equalVertexThreshold; ///used to compute connectivity: if the distance between two vertices is smaller than m_equalVertexThreshold, they are considered to be 'shared'
+ btScalar m_edgeDistanceThreshold; ///used to determine edge contacts: if the closest distance between a contact point and an edge is smaller than this distance threshold it is considered to "hit the edge"
+ btScalar m_zeroAreaThreshold; ///used to determine if a triangle is degenerate (length squared of cross product of 2 triangle edges < threshold)
+
+
+ btTriangleInfoMap()
+ {
+ m_convexEpsilon = 0.00f;
+ m_planarEpsilon = 0.0001f;
+ m_equalVertexThreshold = btScalar(0.0001)*btScalar(0.0001);
+ m_edgeDistanceThreshold = btScalar(0.1);
+ m_zeroAreaThreshold = btScalar(0.0001)*btScalar(0.0001);
+ }
+ virtual ~btTriangleInfoMap() {}
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+ void deSerialize(struct btTriangleInfoMapData& data);
+
+};
+
+struct btTriangleInfoData
+{
+ int m_flags;
+ float m_edgeV0V1Angle;
+ float m_edgeV1V2Angle;
+ float m_edgeV2V0Angle;
+};
+
+struct btTriangleInfoMapData
+{
+ int *m_hashTablePtr;
+ int *m_nextPtr;
+ btTriangleInfoData *m_valueArrayPtr;
+ int *m_keyArrayPtr;
+
+ float m_convexEpsilon;
+ float m_planarEpsilon;
+ float m_equalVertexThreshold;
+ float m_edgeDistanceThreshold;
+ float m_zeroAreaThreshold;
+
+ int m_nextSize;
+ int m_hashTableSize;
+ int m_numValues;
+ int m_numKeys;
+ char m_padding[4];
+};
+
+SIMD_FORCE_INLINE int btTriangleInfoMap::calculateSerializeBufferSize() const
+{
+ return sizeof(btTriangleInfoMapData);
+}
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btTriangleInfoMap::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btTriangleInfoMapData* tmapData = (btTriangleInfoMapData*) dataBuffer;
+ tmapData->m_convexEpsilon = m_convexEpsilon;
+ tmapData->m_planarEpsilon = m_planarEpsilon;
+ tmapData->m_equalVertexThreshold = m_equalVertexThreshold;
+ tmapData->m_edgeDistanceThreshold = m_edgeDistanceThreshold;
+ tmapData->m_zeroAreaThreshold = m_zeroAreaThreshold;
+
+ tmapData->m_hashTableSize = m_hashTable.size();
+
+ tmapData->m_hashTablePtr = tmapData->m_hashTableSize ? (int*)serializer->getUniquePointer((void*)&m_hashTable[0]) : 0;
+ if (tmapData->m_hashTablePtr)
+ {
+ //serialize an int buffer
+ int sz = sizeof(int);
+ int numElem = tmapData->m_hashTableSize;
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ int* memPtr = (int*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ *memPtr = m_hashTable[i];
+ }
+ serializer->finalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_hashTable[0]);
+
+ }
+
+ tmapData->m_nextSize = m_next.size();
+ tmapData->m_nextPtr = tmapData->m_nextSize? (int*)serializer->getUniquePointer((void*)&m_next[0]): 0;
+ if (tmapData->m_nextPtr)
+ {
+ int sz = sizeof(int);
+ int numElem = tmapData->m_nextSize;
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ int* memPtr = (int*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ *memPtr = m_next[i];
+ }
+ serializer->finalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_next[0]);
+ }
+
+ tmapData->m_numValues = m_valueArray.size();
+ tmapData->m_valueArrayPtr = tmapData->m_numValues ? (btTriangleInfoData*)serializer->getUniquePointer((void*)&m_valueArray[0]): 0;
+ if (tmapData->m_valueArrayPtr)
+ {
+ int sz = sizeof(btTriangleInfoData);
+ int numElem = tmapData->m_numValues;
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ btTriangleInfoData* memPtr = (btTriangleInfoData*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ memPtr->m_edgeV0V1Angle = m_valueArray[i].m_edgeV0V1Angle;
+ memPtr->m_edgeV1V2Angle = m_valueArray[i].m_edgeV1V2Angle;
+ memPtr->m_edgeV2V0Angle = m_valueArray[i].m_edgeV2V0Angle;
+ memPtr->m_flags = m_valueArray[i].m_flags;
+ }
+ serializer->finalizeChunk(chunk,"btTriangleInfoData",BT_ARRAY_CODE,(void*) &m_valueArray[0]);
+ }
+
+ tmapData->m_numKeys = m_keyArray.size();
+ tmapData->m_keyArrayPtr = tmapData->m_numKeys ? (int*)serializer->getUniquePointer((void*)&m_keyArray[0]) : 0;
+ if (tmapData->m_keyArrayPtr)
+ {
+ int sz = sizeof(int);
+ int numElem = tmapData->m_numValues;
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ int* memPtr = (int*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ *memPtr = m_keyArray[i].getUid1();
+ }
+ serializer->finalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*) &m_keyArray[0]);
+
+ }
+ return "btTriangleInfoMapData";
+}
+
+
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE void btTriangleInfoMap::deSerialize(btTriangleInfoMapData& tmapData )
+{
+
+
+ m_convexEpsilon = tmapData.m_convexEpsilon;
+ m_planarEpsilon = tmapData.m_planarEpsilon;
+ m_equalVertexThreshold = tmapData.m_equalVertexThreshold;
+ m_edgeDistanceThreshold = tmapData.m_edgeDistanceThreshold;
+ m_zeroAreaThreshold = tmapData.m_zeroAreaThreshold;
+ m_hashTable.resize(tmapData.m_hashTableSize);
+ int i =0;
+ for (i=0;i<tmapData.m_hashTableSize;i++)
+ {
+ m_hashTable[i] = tmapData.m_hashTablePtr[i];
+ }
+ m_next.resize(tmapData.m_nextSize);
+ for (i=0;i<tmapData.m_nextSize;i++)
+ {
+ m_next[i] = tmapData.m_nextPtr[i];
+ }
+ m_valueArray.resize(tmapData.m_numValues);
+ for (i=0;i<tmapData.m_numValues;i++)
+ {
+ m_valueArray[i].m_edgeV0V1Angle = tmapData.m_valueArrayPtr[i].m_edgeV0V1Angle;
+ m_valueArray[i].m_edgeV1V2Angle = tmapData.m_valueArrayPtr[i].m_edgeV1V2Angle;
+ m_valueArray[i].m_edgeV2V0Angle = tmapData.m_valueArrayPtr[i].m_edgeV2V0Angle;
+ m_valueArray[i].m_flags = tmapData.m_valueArrayPtr[i].m_flags;
+ }
+
+ m_keyArray.resize(tmapData.m_numKeys,btHashInt(0));
+ for (i=0;i<tmapData.m_numKeys;i++)
+ {
+ m_keyArray[i].setUid1(tmapData.m_keyArrayPtr[i]);
+ }
+}
+
+
+#endif //_BT_TRIANGLE_INFO_MAP_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp
index 5dcfa51c280..b29e0f71e62 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -13,6 +13,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+
#include "btTriangleMesh.h"
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h
index f06fbb7c22d..d2624fe18e1 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -13,7 +13,6 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
-
#ifndef TRIANGLE_MESH_H
#define TRIANGLE_MESH_H
@@ -41,9 +40,6 @@ class btTriangleMesh : public btTriangleIndexVertexArray
btTriangleMesh (bool use32bitIndices=true,bool use4componentVertices=true);
- int findOrAddVertex(const btVector3& vertex, bool removeDuplicateVertices);
- void addIndex(int index);
-
bool getUse32bitIndices() const
{
return m_use32bitIndices;
@@ -62,6 +58,10 @@ class btTriangleMesh : public btTriangleIndexVertexArray
virtual void preallocateVertices(int numverts){(void) numverts;}
virtual void preallocateIndices(int numindices){(void) numindices;}
+ ///findOrAddVertex is an internal method, use addTriangle instead
+ int findOrAddVertex(const btVector3& vertex, bool removeDuplicateVertices);
+ ///addIndex is an internal method, use addTriangle instead
+ void addIndex(int index);
};
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
index 1bd7e84a4e7..683684da770 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -91,7 +91,7 @@ public:
btVector3 m_supportVecLocal;
SupportVertexCallback(const btVector3& supportVecWorld,const btTransform& trans)
- : m_supportVertexLocal(btScalar(0.),btScalar(0.),btScalar(0.)), m_worldTrans(trans) ,m_maxDot(btScalar(-1e30))
+ : m_supportVertexLocal(btScalar(0.),btScalar(0.),btScalar(0.)), m_worldTrans(trans) ,m_maxDot(btScalar(-BT_LARGE_FLOAT))
{
m_supportVecLocal = supportVecWorld * m_worldTrans.getBasis();
@@ -199,7 +199,7 @@ btVector3 btTriangleMeshShape::localGetSupportingVertex(const btVector3& vec) co
SupportVertexCallback supportCallback(vec,ident);
- btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ btVector3 aabbMax(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
processAllTriangles(&supportCallback,-aabbMax,aabbMax);
@@ -207,3 +207,5 @@ btVector3 btTriangleMeshShape::localGetSupportingVertex(const btVector3& vec) co
return supportVertex;
}
+
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h
index 53d65799001..2216698d275 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -79,7 +79,11 @@ public:
//debugging
virtual const char* getName()const {return "TRIANGLEMESH";}
+
};
+
+
+
#endif //TRIANGLE_MESH_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h
index 4bfb0b9e881..847147cf6b4 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -19,7 +19,7 @@ subject to the following restrictions:
#include "btConvexShape.h"
#include "btBoxShape.h"
-class btTriangleShape : public btPolyhedralConvexShape
+ATTRIBUTE_ALIGNED16(class) btTriangleShape : public btPolyhedralConvexShape
{
@@ -32,6 +32,11 @@ public:
return 3;
}
+ btVector3& getVertexPtr(int index)
+ {
+ return m_vertices1[index];
+ }
+
const btVector3& getVertexPtr(int index) const
{
return m_vertices1[index];
@@ -77,7 +82,10 @@ public:
}
-
+ btTriangleShape() : btPolyhedralConvexShape ()
+ {
+ m_shapeType = TRIANGLE_SHAPE_PROXYTYPE;
+ }
btTriangleShape(const btVector3& p0,const btVector3& p1,const btVector3& p2) : btPolyhedralConvexShape ()
{
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btUniformScalingShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btUniformScalingShape.cpp
index 4c1c716d519..b148bbd99a5 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btUniformScalingShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btUniformScalingShape.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2007 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -64,25 +64,70 @@ void btUniformScalingShape::calculateLocalInertia(btScalar mass,btVector3& inert
///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
-void btUniformScalingShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
+void btUniformScalingShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
{
- m_childConvexShape->getAabb(t,aabbMin,aabbMax);
- btVector3 aabbCenter = (aabbMax+aabbMin)*btScalar(0.5);
- btVector3 scaledAabbHalfExtends = (aabbMax-aabbMin)*btScalar(0.5)*m_uniformScalingFactor;
-
- aabbMin = aabbCenter - scaledAabbHalfExtends;
- aabbMax = aabbCenter + scaledAabbHalfExtends;
+ getAabbSlow(trans,aabbMin,aabbMax);
}
void btUniformScalingShape::getAabbSlow(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
{
- m_childConvexShape->getAabbSlow(t,aabbMin,aabbMax);
- btVector3 aabbCenter = (aabbMax+aabbMin)*btScalar(0.5);
- btVector3 scaledAabbHalfExtends = (aabbMax-aabbMin)*btScalar(0.5)*m_uniformScalingFactor;
+#if 1
+ btVector3 _directions[] =
+ {
+ btVector3( 1., 0., 0.),
+ btVector3( 0., 1., 0.),
+ btVector3( 0., 0., 1.),
+ btVector3( -1., 0., 0.),
+ btVector3( 0., -1., 0.),
+ btVector3( 0., 0., -1.)
+ };
+
+ btVector3 _supporting[] =
+ {
+ btVector3( 0., 0., 0.),
+ btVector3( 0., 0., 0.),
+ btVector3( 0., 0., 0.),
+ btVector3( 0., 0., 0.),
+ btVector3( 0., 0., 0.),
+ btVector3( 0., 0., 0.)
+ };
+
+ for (int i=0;i<6;i++)
+ {
+ _directions[i] = _directions[i]*t.getBasis();
+ }
+
+ batchedUnitVectorGetSupportingVertexWithoutMargin(_directions, _supporting, 6);
+
+ btVector3 aabbMin1(0,0,0),aabbMax1(0,0,0);
+
+ for ( int i = 0; i < 3; ++i )
+ {
+ aabbMax1[i] = t(_supporting[i])[i];
+ aabbMin1[i] = t(_supporting[i + 3])[i];
+ }
+ btVector3 marginVec(getMargin(),getMargin(),getMargin());
+ aabbMin = aabbMin1-marginVec;
+ aabbMax = aabbMax1+marginVec;
+
+#else
+
+ btScalar margin = getMargin();
+ for (int i=0;i<3;i++)
+ {
+ btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
+ vec[i] = btScalar(1.);
+ btVector3 sv = localGetSupportingVertex(vec*t.getBasis());
+ btVector3 tmp = t(sv);
+ aabbMax[i] = tmp[i]+margin;
+ vec[i] = btScalar(-1.);
+ sv = localGetSupportingVertex(vec*t.getBasis());
+ tmp = t(sv);
+ aabbMin[i] = tmp[i]-margin;
+ }
- aabbMin = aabbCenter - scaledAabbHalfExtends;
- aabbMax = aabbCenter + scaledAabbHalfExtends;
+#endif
}
void btUniformScalingShape::setLocalScaling(const btVector3& scaling)
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btUniformScalingShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btUniformScalingShape.h
index 945976ac036..cbf7e6fd3ed 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btUniformScalingShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btUniformScalingShape.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btBoxCollision.h b/extern/bullet2/src/BulletCollision/Gimpact/btBoxCollision.h
index 827a3c89587..d5676aaa80e 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btBoxCollision.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btBoxCollision.h
@@ -2,7 +2,7 @@
#define BT_BOX_COLLISION_H_INCLUDED
/*! \file gim_box_collision.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btClipPolygon.h b/extern/bullet2/src/BulletCollision/Gimpact/btClipPolygon.h
index 5de391a7561..de0a5231baf 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btClipPolygon.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btClipPolygon.h
@@ -2,7 +2,7 @@
#define BT_CLIP_POLYGON_H_INCLUDED
/*! \file btClipPolygon.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btContactProcessing.h b/extern/bullet2/src/BulletCollision/Gimpact/btContactProcessing.h
index 4b0b70293b4..0c66f8e106c 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btContactProcessing.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btContactProcessing.h
@@ -2,7 +2,7 @@
#define BT_CONTACT_H_INCLUDED
/*! \file gim_contact.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactBvh.cpp b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactBvh.cpp
index 38fed6b4fd2..863233163a6 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactBvh.cpp
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactBvh.cpp
@@ -1,5 +1,5 @@
/*! \file gim_box_set.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactBvh.h b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactBvh.h
index b432b615f8a..6174ae97a97 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactBvh.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactBvh.h
@@ -2,7 +2,7 @@
#define GIM_BOX_SET_H_INCLUDED
/*! \file gim_box_set.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
@@ -231,6 +231,8 @@ class btPrimitiveManagerBase
{
public:
+ virtual ~btPrimitiveManagerBase() {}
+
//! determines if this manager consist on only triangles, which special case will be optimized
virtual bool is_trimesh() const = 0;
virtual int get_primitive_count() const = 0;
@@ -381,9 +383,9 @@ public:
return m_box_tree.get_node_pointer(index);
}
-
+#ifdef TRI_COLLISION_PROFILING
static float getAverageTreeCollisionTime();
-
+#endif //TRI_COLLISION_PROFILING
static void find_collision(btGImpactBvh * boxset1, const btTransform & trans1,
btGImpactBvh * boxset2, const btTransform & trans2,
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp
index 4d6fa88f62d..2f2c09ffc03 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp
@@ -102,6 +102,7 @@ public:
{
return m_parent->m_gim_shape->getChildShape(index);
}
+ virtual ~ChildShapeRetriever() {}
};
class TriangleShapeRetriever:public ChildShapeRetriever
@@ -113,6 +114,7 @@ public:
m_parent->m_gim_shape->getBulletTriangle(index,m_parent->m_trishape);
return &m_parent->m_trishape;
}
+ virtual ~TriangleShapeRetriever() {}
};
class TetraShapeRetriever:public ChildShapeRetriever
@@ -213,7 +215,8 @@ void btGImpactCollisionAlgorithm::addContactPoint(btCollisionObject * body0,
const btVector3 & normal,
btScalar distance)
{
- m_resultOut->setShapeIdentifiers(m_part0,m_triface0,m_part1,m_triface1);
+ m_resultOut->setShapeIdentifiersA(m_part0,m_triface0);
+ m_resultOut->setShapeIdentifiersB(m_part1,m_triface1);
checkManifold(body0,body1);
m_resultOut->addContactPoint(normal,point,distance);
}
@@ -236,7 +239,8 @@ void btGImpactCollisionAlgorithm::shape_vs_shape_collision(
btCollisionAlgorithm* algor = newAlgorithm(body0,body1);
// post : checkManifold is called
- m_resultOut->setShapeIdentifiers(m_part0,m_triface0,m_part1,m_triface1);
+ m_resultOut->setShapeIdentifiersA(m_part0,m_triface0);
+ m_resultOut->setShapeIdentifiersB(m_part1,m_triface1);
algor->processCollision(body0,body1,*m_dispatchInfo,m_resultOut);
@@ -262,7 +266,8 @@ void btGImpactCollisionAlgorithm::convex_vs_convex_collision(
body1->internalSetTemporaryCollisionShape(shape1);
- m_resultOut->setShapeIdentifiers(m_part0,m_triface0,m_part1,m_triface1);
+ m_resultOut->setShapeIdentifiersA(m_part0,m_triface0);
+ m_resultOut->setShapeIdentifiersB(m_part1,m_triface1);
checkConvexAlgorithm(body0,body1);
m_convex_algorithm->processCollision(body0,body1,*m_dispatchInfo,m_resultOut);
@@ -876,22 +881,24 @@ btScalar btGImpactCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* b
///////////////////////////////////// REGISTERING ALGORITHM //////////////////////////////////////////////
-btGImpactCollisionAlgorithm::CreateFunc g_gimpact_cf;
+
//! Use this function for register the algorithm externally
void btGImpactCollisionAlgorithm::registerAlgorithm(btCollisionDispatcher * dispatcher)
{
+ static btGImpactCollisionAlgorithm::CreateFunc s_gimpact_cf;
+
int i;
for ( i = 0;i < MAX_BROADPHASE_COLLISION_TYPES ;i++ )
{
- dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE,i ,&g_gimpact_cf);
+ dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE,i ,&s_gimpact_cf);
}
for ( i = 0;i < MAX_BROADPHASE_COLLISION_TYPES ;i++ )
{
- dispatcher->registerCollisionCreateFunc(i,GIMPACT_SHAPE_PROXYTYPE ,&g_gimpact_cf);
+ dispatcher->registerCollisionCreateFunc(i,GIMPACT_SHAPE_PROXYTYPE ,&s_gimpact_cf);
}
}
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h
index 453472aa034..ae5d55ab7d9 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h
@@ -1,5 +1,5 @@
/*! \file btGImpactShape.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
@@ -222,13 +222,13 @@ public:
//! Use this function for register the algorithm externally
static void registerAlgorithm(btCollisionDispatcher * dispatcher);
-
+#ifdef TRI_COLLISION_PROFILING
//! Gets the average time in miliseconds of tree collisions
static float getAverageTreeCollisionTime();
//! Gets the average time in miliseconds of triangle collisions
static float getAverageTriangleCollisionTime();
-
+#endif //TRI_COLLISION_PROFILING
//! Collides two gimpact shapes
/*!
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactMassUtil.h b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactMassUtil.h
index 0a10f3cdb7b..2543aefcfc6 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactMassUtil.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactMassUtil.h
@@ -1,5 +1,5 @@
/*! \file btGImpactMassUtil.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp
index ea1647a8129..cd4dfdb60e9 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp
@@ -1,5 +1,5 @@
/*! \file gim_box_set.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.h b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.h
index e9cccac75f5..9c990774739 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.h
@@ -2,7 +2,7 @@
#define GIM_QUANTIZED_SET_H_INCLUDED
/*! \file btGImpactQuantizedBvh.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
@@ -359,9 +359,9 @@ public:
return m_box_tree.get_node_pointer(index);
}
-
+#ifdef TRI_COLLISION_PROFILING
static float getAverageTreeCollisionTime();
-
+#endif //TRI_COLLISION_PROFILING
static void find_collision(btGImpactQuantizedBvh * boxset1, const btTransform & trans1,
btGImpactQuantizedBvh * boxset2, const btTransform & trans2,
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactShape.cpp b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactShape.cpp
index da6a4dbfc28..cceace55e4b 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactShape.cpp
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactShape.cpp
@@ -181,3 +181,23 @@ void btGImpactMeshShape::processAllTriangles(btTriangleCallback* callback,const
m_mesh_parts[i]->processAllTriangles(callback,aabbMin,aabbMax);
}
}
+
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btGImpactMeshShape::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btGImpactMeshShapeData* trimeshData = (btGImpactMeshShapeData*) dataBuffer;
+
+ btCollisionShape::serialize(&trimeshData->m_collisionShapeData,serializer);
+
+ m_meshInterface->serialize(&trimeshData->m_meshInterface, serializer);
+
+ trimeshData->m_collisionMargin = float(m_collisionMargin);
+
+ localScaling.serializeFloat(trimeshData->m_localScaling);
+
+ trimeshData->m_gimpactSubType = int(getGImpactShapeType());
+
+ return "btGImpactMeshShapeData";
+}
+
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactShape.h b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactShape.h
index 05431cfce15..90015bb9ac0 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGImpactShape.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGImpactShape.h
@@ -189,7 +189,7 @@ public:
//!@{
//! Base method for determinig which kind of GIMPACT shape we get
- virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() = 0;
+ virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const = 0 ;
//! gets boxset
SIMD_FORCE_INLINE btGImpactBoxSet * getBoxSet()
@@ -276,6 +276,7 @@ public:
//! virtual method for ray collision
virtual void rayTest(const btVector3& rayFrom, const btVector3& rayTo, btCollisionWorld::RayResultCallback& resultCallback) const
{
+ (void) rayFrom; (void) rayTo; (void) resultCallback;
}
//! Function for retrieve triangles.
@@ -284,6 +285,7 @@ public:
*/
virtual void processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
{
+ (void) callback; (void) aabbMin; (void) aabbMax;
}
//!@}
@@ -302,10 +304,12 @@ public:
class CompoundPrimitiveManager:public btPrimitiveManagerBase
{
public:
+ virtual ~CompoundPrimitiveManager() {}
btGImpactCompoundShape * m_compoundShape;
CompoundPrimitiveManager(const CompoundPrimitiveManager& compound)
+ : btPrimitiveManagerBase()
{
m_compoundShape = compound.m_compoundShape;
}
@@ -348,6 +352,7 @@ public:
virtual void get_primitive_triangle(int prim_index,btPrimitiveTriangle & triangle) const
{
btAssert(0);
+ (void) prim_index; (void) triangle;
}
};
@@ -364,6 +369,7 @@ public:
btGImpactCompoundShape(bool children_has_transform = true)
{
+ (void) children_has_transform;
m_primitive_manager.m_compoundShape = this;
m_box_set.setPrimitiveManager(&m_primitive_manager);
}
@@ -477,11 +483,13 @@ public:
virtual void getBulletTriangle(int prim_index,btTriangleShapeEx & triangle) const
{
+ (void) prim_index; (void) triangle;
btAssert(0);
}
virtual void getBulletTetrahedron(int prim_index,btTetrahedronShapeEx & tetrahedron) const
{
+ (void) prim_index; (void) tetrahedron;
btAssert(0);
}
@@ -494,7 +502,7 @@ public:
return "GImpactCompound";
}
- virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType()
+ virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const
{
return CONST_GIMPACT_COMPOUND_SHAPE;
}
@@ -550,6 +558,7 @@ public:
}
TrimeshPrimitiveManager(const TrimeshPrimitiveManager & manager)
+ : btPrimitiveManagerBase()
{
m_meshInterface = manager.m_meshInterface;
m_part = manager.m_part;
@@ -582,6 +591,7 @@ public:
}
+ virtual ~TrimeshPrimitiveManager() {}
void lock()
{
@@ -746,6 +756,7 @@ public:
//! Gets the children
virtual btCollisionShape* getChildShape(int index)
{
+ (void) index;
btAssert(0);
return NULL;
}
@@ -755,6 +766,7 @@ public:
//! Gets the child
virtual const btCollisionShape* getChildShape(int index) const
{
+ (void) index;
btAssert(0);
return NULL;
}
@@ -762,6 +774,7 @@ public:
//! Gets the children transform
virtual btTransform getChildTransform(int index) const
{
+ (void) index;
btAssert(0);
return btTransform();
}
@@ -772,6 +785,8 @@ public:
*/
virtual void setChildTransform(int index, const btTransform & transform)
{
+ (void) index;
+ (void) transform;
btAssert(0);
}
@@ -801,7 +816,7 @@ public:
return "GImpactMeshShapePart";
}
- virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType()
+ virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const
{
return CONST_GIMPACT_TRIMESH_SHAPE_PART;
}
@@ -825,6 +840,8 @@ public:
virtual void getBulletTetrahedron(int prim_index,btTetrahedronShapeEx & tetrahedron) const
{
+ (void) prim_index;
+ (void) tetrahedron;
btAssert(0);
}
@@ -1036,11 +1053,13 @@ public:
virtual void getBulletTriangle(int prim_index,btTriangleShapeEx & triangle) const
{
+ (void) prim_index; (void) triangle;
btAssert(0);
}
virtual void getBulletTetrahedron(int prim_index,btTetrahedronShapeEx & tetrahedron) const
{
+ (void) prim_index; (void) tetrahedron;
btAssert(0);
}
@@ -1063,12 +1082,14 @@ public:
*/
virtual void getChildAabb(int child_index,const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
{
+ (void) child_index; (void) t; (void) aabbMin; (void) aabbMax;
btAssert(0);
}
//! Gets the children
virtual btCollisionShape* getChildShape(int index)
{
+ (void) index;
btAssert(0);
return NULL;
}
@@ -1077,6 +1098,7 @@ public:
//! Gets the child
virtual const btCollisionShape* getChildShape(int index) const
{
+ (void) index;
btAssert(0);
return NULL;
}
@@ -1084,6 +1106,7 @@ public:
//! Gets the children transform
virtual btTransform getChildTransform(int index) const
{
+ (void) index;
btAssert(0);
return btTransform();
}
@@ -1094,11 +1117,12 @@ public:
*/
virtual void setChildTransform(int index, const btTransform & transform)
{
+ (void) index; (void) transform;
btAssert(0);
}
- virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType()
+ virtual eGIMPACT_SHAPE_TYPE getGImpactShapeType() const
{
return CONST_GIMPACT_TRIMESH_SHAPE;
}
@@ -1116,7 +1140,32 @@ public:
It gives the triangles in local space
*/
virtual void processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btGImpactMeshShapeData
+{
+ btCollisionShapeData m_collisionShapeData;
+
+ btStridingMeshInterfaceData m_meshInterface;
+
+ btVector3FloatData m_localScaling;
+
+ float m_collisionMargin;
+
+ int m_gimpactSubType;
};
+SIMD_FORCE_INLINE int btGImpactMeshShape::calculateSerializeBufferSize() const
+{
+ return sizeof(btGImpactMeshShapeData);
+}
+
#endif //GIMPACT_MESH_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGenericPoolAllocator.cpp b/extern/bullet2/src/BulletCollision/Gimpact/btGenericPoolAllocator.cpp
index 956fa0430e3..5d07d1adb97 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGenericPoolAllocator.cpp
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGenericPoolAllocator.cpp
@@ -1,5 +1,5 @@
/*! \file btGenericPoolAllocator.cpp
-\author Francisco Len Nßjera. email projectileman@yahoo.com
+\author Francisco Leon Najera. email projectileman@yahoo.com
General purpose allocator class
*/
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGenericPoolAllocator.h b/extern/bullet2/src/BulletCollision/Gimpact/btGenericPoolAllocator.h
index e883bcd23d2..b46d8516347 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGenericPoolAllocator.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGenericPoolAllocator.h
@@ -1,5 +1,5 @@
/*! \file btGenericPoolAllocator.h
-\author Francisco Len Nßjera. email projectileman@yahoo.com
+\author Francisco Leon Najera. email projectileman@yahoo.com
General purpose allocator class
*/
@@ -23,7 +23,7 @@ subject to the following restrictions:
#include <limits.h>
#include <stdio.h>
-#include <memory.h>
+#include <string.h>
#include "LinearMath/btAlignedAllocator.h"
#define BT_UINT_MAX UINT_MAX
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btGeometryOperations.h b/extern/bullet2/src/BulletCollision/Gimpact/btGeometryOperations.h
index bc5a416ddb7..60f06510ad7 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btGeometryOperations.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btGeometryOperations.h
@@ -2,7 +2,7 @@
#define BT_BASIC_GEOMETRY_OPERATIONS_H_INCLUDED
/*! \file btGeometryOperations.h
-*\author Francisco Len Nßjera
+*\author Francisco Leon Najera
*/
/*
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btQuantization.h b/extern/bullet2/src/BulletCollision/Gimpact/btQuantization.h
index 7faada61c95..e0487c22766 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btQuantization.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btQuantization.h
@@ -2,7 +2,7 @@
#define BT_QUANTIZATION_H_INCLUDED
/*! \file btQuantization.h
-*\author Francisco Len Nßjera
+*\author Francisco Leon Najera
*/
/*
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.cpp b/extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.cpp
index 78696277c34..ca76cc54a12 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.cpp
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.cpp
@@ -1,5 +1,5 @@
/*! \file btGImpactTriangleShape.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.h b/extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.h
index bbd6b630c02..fcc981dfb69 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/btTriangleShapeEx.h
@@ -1,5 +1,5 @@
/*! \file btGImpactShape.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
This source file is part of GIMPACT Library.
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_array.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_array.h
index c8161d252d5..cfd5da8f49a 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_array.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_array.h
@@ -1,7 +1,7 @@
#ifndef GIM_ARRAY_H_INCLUDED
#define GIM_ARRAY_H_INCLUDED
/*! \file gim_array.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_basic_geometry_operations.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_basic_geometry_operations.h
index 666abf7917a..915277404d6 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_basic_geometry_operations.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_basic_geometry_operations.h
@@ -2,7 +2,7 @@
#define GIM_BASIC_GEOMETRY_OPERATIONS_H_INCLUDED
/*! \file gim_basic_geometry_operations.h
-*\author Francisco Len Nßjera
+*\author Francisco Leon Najera
type independant geometry routines
*/
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_bitset.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_bitset.h
index 322004a8d5b..7dee48a4c76 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_bitset.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_bitset.h
@@ -1,7 +1,7 @@
#ifndef GIM_BITSET_H_INCLUDED
#define GIM_BITSET_H_INCLUDED
/*! \file gim_bitset.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_box_collision.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_box_collision.h
index 0add5e4b99f..b360dd47038 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_box_collision.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_box_collision.h
@@ -2,7 +2,7 @@
#define GIM_BOX_COLLISION_H_INCLUDED
/*! \file gim_box_collision.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_box_set.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_box_set.h
index 1058a0872a5..61d190a7dfe 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_box_set.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_box_set.h
@@ -2,7 +2,7 @@
#define GIM_BOX_SET_H_INCLUDED
/*! \file gim_box_set.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
@@ -91,6 +91,7 @@ class GIM_PRIMITIVE_MANAGER_PROTOTYPE
{
public:
+ virtual ~GIM_PRIMITIVE_MANAGER_PROTOTYPE() {}
//! determines if this manager consist on only triangles, which special case will be optimized
virtual bool is_trimesh() = 0;
virtual GUINT get_primitive_count() = 0;
@@ -669,3 +670,5 @@ public:
#endif // GIM_BOXPRUNING_H_INCLUDED
+
+
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_clip_polygon.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_clip_polygon.h
index a91fd3aa422..e342459ce56 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_clip_polygon.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_clip_polygon.h
@@ -2,7 +2,7 @@
#define GIM_CLIP_POLYGON_H_INCLUDED
/*! \file gim_tri_collision.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_contact.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_contact.h
index ad3e12298fe..5d9f8ef8180 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_contact.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_contact.h
@@ -2,7 +2,7 @@
#define GIM_CONTACT_H_INCLUDED
/*! \file gim_contact.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_geom_types.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_geom_types.h
index 2fb1e3f9e45..6b8f9ea6c21 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_geom_types.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_geom_types.h
@@ -2,7 +2,7 @@
#define GIM_GEOM_TYPES_H_INCLUDED
/*! \file gim_geom_types.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_geometry.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_geometry.h
index 6cc41672101..c67a6991c02 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_geometry.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_geometry.h
@@ -2,7 +2,7 @@
#define GIM_GEOMETRY_H_INCLUDED
/*! \file gim_geometry.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_hash_table.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_hash_table.h
index 93c66f81823..e4237c2c570 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_hash_table.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_hash_table.h
@@ -1,7 +1,7 @@
#ifndef GIM_HASH_TABLE_H_INCLUDED
#define GIM_HASH_TABLE_H_INCLUDED
/*! \file gim_trimesh_data.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_linear_math.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_linear_math.h
index 0247d4e61cc..64f11b49543 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_linear_math.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_linear_math.h
@@ -2,7 +2,7 @@
#define GIM_LINEAR_H_INCLUDED
/*! \file gim_linear_math.h
-*\author Francisco Len Nßjera
+*\author Francisco Leon Najera
Type Independant Vector and matrix operations.
*/
/*
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_math.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_math.h
index 8b9e6806ef7..939079e1040 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_math.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_math.h
@@ -1,7 +1,7 @@
#ifndef GIM_MATH_H_INCLUDED
#define GIM_MATH_H_INCLUDED
/*! \file gim_math.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_memory.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_memory.h
index fa99eebb60e..e203888a1e2 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_memory.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_memory.h
@@ -1,7 +1,7 @@
#ifndef GIM_MEMORY_H_INCLUDED
#define GIM_MEMORY_H_INCLUDED
/*! \file gim_memory.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
@@ -34,7 +34,7 @@ email: projectileman@yahoo.com
#include "gim_math.h"
-#include <memory.h>
+#include <string.h>
#ifdef PREFETCH
#include <xmmintrin.h> // for prefetch
@@ -117,7 +117,7 @@ void gim_free(void *ptr);
-#if defined (WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
+#if defined (_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
#define GIM_SIMD_MEMORY 1
#endif
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_radixsort.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_radixsort.h
index f7dadbbca93..c246ef12543 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_radixsort.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_radixsort.h
@@ -1,7 +1,7 @@
#ifndef GIM_RADIXSORT_H_INCLUDED
#define GIM_RADIXSORT_H_INCLUDED
/*! \file gim_radixsort.h
-\author Francisco Len Nßjera.
+\author Francisco Leon Najera.
Based on the work of Michael Herf : "fast floating-point radix sort"
Avaliable on http://www.stereopsis.com/radix.html
*/
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_tri_collision.cpp b/extern/bullet2/src/BulletCollision/Gimpact/gim_tri_collision.cpp
index 74d734146a7..f9727e1d53b 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_tri_collision.cpp
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_tri_collision.cpp
@@ -1,6 +1,6 @@
/*! \file gim_tri_collision.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/Gimpact/gim_tri_collision.h b/extern/bullet2/src/BulletCollision/Gimpact/gim_tri_collision.h
index 2d6e43a1a2e..5b552a1ed51 100644
--- a/extern/bullet2/src/BulletCollision/Gimpact/gim_tri_collision.h
+++ b/extern/bullet2/src/BulletCollision/Gimpact/gim_tri_collision.h
@@ -2,7 +2,7 @@
#define GIM_TRI_COLLISION_H_INCLUDED
/*! \file gim_tri_collision.h
-\author Francisco Len Nßjera
+\author Francisco Leon Najera
*/
/*
-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
index 2f41b3c2757..9ee83e7d561 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
@@ -96,7 +96,7 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
{
- btGjkPairDetector gjk(m_convexA,m_convexB,m_simplexSolver,m_penetrationDepthSolver);
+ btGjkPairDetector gjk(m_convexA,m_convexB,m_convexA->getShapeType(),m_convexB->getShapeType(),m_convexA->getMargin(),m_convexB->getMargin(),m_simplexSolver,m_penetrationDepthSolver);
btGjkPairDetector::ClosestPointInput input;
//we don't use margins during CCD
@@ -121,6 +121,10 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
//not close enough
while (dist > radius)
{
+ if (result.m_debugDrawer)
+ {
+ result.m_debugDrawer->drawSphere(c,0.2f,btVector3(1,1,1));
+ }
numIter++;
if (numIter > maxIter)
{
@@ -170,6 +174,11 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
btTransformUtil::integrateTransform(fromB,linVelB,angVelB,lambda,interpolatedTransB);
relativeTrans = interpolatedTransB.inverseTimes(interpolatedTransA);
+ if (result.m_debugDrawer)
+ {
+ result.m_debugDrawer->drawSphere(interpolatedTransA.getOrigin(),0.2f,btVector3(1,0,0));
+ }
+
result.DebugDraw( lambda );
btPointCollector pointCollector;
@@ -197,6 +206,7 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
//??
return false;
}
+
}
@@ -224,4 +234,3 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
*/
}
-
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h
index 0edf4dcd496..b0bce341e41 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h
@@ -41,7 +41,7 @@ public:
virtual void drawCoordSystem(const btTransform& trans) {(void)trans;}
CastResult()
- :m_fraction(btScalar(1e30)),
+ :m_fraction(btScalar(BT_LARGE_FLOAT)),
m_debugDrawer(0),
m_allowedPenetration(btScalar(0))
{
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
index 2989daeb44e..7e3fde8e291 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
@@ -14,8 +14,8 @@ subject to the following restrictions:
*/
-#ifndef CONVEX_PENETRATION_DEPTH_H
-#define CONVEX_PENETRATION_DEPTH_H
+#ifndef __CONVEX_PENETRATION_DEPTH_H
+#define __CONVEX_PENETRATION_DEPTH_H
class btStackAlloc;
class btVector3;
@@ -33,7 +33,7 @@ public:
const btConvexShape* convexA,const btConvexShape* convexB,
const btTransform& transA,const btTransform& transB,
btVector3& v, btVector3& pa, btVector3& pb,
- class btIDebugDraw* debugDraw
+ class btIDebugDraw* debugDraw,btStackAlloc* stackAlloc
) = 0;
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
index b011bb9ae58..bc711ad495c 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
@@ -33,21 +33,24 @@ struct btDiscreteCollisionDetectorInterface
virtual ~Result(){}
- ///setShapeIdentifiers provides experimental support for per-triangle material / custom material combiner
- virtual void setShapeIdentifiers(int partId0,int index0, int partId1,int index1)=0;
+ ///setShapeIdentifiersA/B provides experimental support for per-triangle material / custom material combiner
+ virtual void setShapeIdentifiersA(int partId0,int index0)=0;
+ virtual void setShapeIdentifiersB(int partId1,int index1)=0;
virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)=0;
};
struct ClosestPointInput
{
ClosestPointInput()
- :m_maximumDistanceSquared(btScalar(1e30))
+ :m_maximumDistanceSquared(btScalar(BT_LARGE_FLOAT)),
+ m_stackAlloc(0)
{
}
btTransform m_transformA;
btTransform m_transformB;
btScalar m_maximumDistanceSquared;
+ btStackAlloc* m_stackAlloc;
};
virtual ~btDiscreteCollisionDetectorInterface() {};
@@ -66,7 +69,7 @@ struct btStorageResult : public btDiscreteCollisionDetectorInterface::Result
btVector3 m_closestPointInB;
btScalar m_distance; //negative means penetration !
- btStorageResult() : m_distance(btScalar(1e30))
+ btStorageResult() : m_distance(btScalar(BT_LARGE_FLOAT))
{
}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.cpp
deleted file mode 100644
index 36cdeeaefdb..00000000000
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.cpp
+++ /dev/null
@@ -1,628 +0,0 @@
-/*
-Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
-
-This software is provided 'as-is', without any express or implied warranty.
-In no event will the authors be held liable for any damages arising from the
-use of this software.
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it
-freely,
-subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not
-claim that you wrote the original software. If you use this software in a
-product, an acknowledgment in the product documentation would be appreciated
-but is not required.
-2. Altered source versions must be plainly marked as such, and must not be
-misrepresented as being the original software.
-3. This notice may not be removed or altered from any source distribution.
-*/
-
-/*
-GJK-EPA collision solver by Nathanael Presson
-Nov.2006
-*/
-
-#include "btGjkEpa.h"
-#include <string.h> //for memset
-#include "LinearMath/btStackAlloc.h"
-
-#if defined(DEBUG) || defined (_DEBUG)
-#include <stdio.h> //for debug printf
-#ifdef __SPU__
-#include <spu_printf.h>
-#define printf spu_printf
-#endif //__SPU__
-#endif
-
-namespace gjkepa_impl
-{
-
-//
-// Port. typedefs
-//
-
-typedef btScalar F;
-typedef bool Z;
-typedef int I;
-typedef unsigned int U;
-typedef unsigned char U1;
-typedef unsigned short U2;
-
-typedef btVector3 Vector3;
-typedef btMatrix3x3 Rotation;
-
-//
-// Config
-//
-
-#if 0
-#define BTLOCALSUPPORT localGetSupportingVertexWithoutMargin
-#else
-#define BTLOCALSUPPORT localGetSupportingVertex
-#endif
-
-//
-// Const
-//
-
-
-#define cstInf SIMD_INFINITY
-#define cstPi SIMD_PI
-#define cst2Pi SIMD_2_PI
-#define GJK_maxiterations (128)
-#define GJK_hashsize (1<<6)
-#define GJK_hashmask (GJK_hashsize-1)
-#define GJK_insimplex_eps F(0.0001)
-#define GJK_sqinsimplex_eps (GJK_insimplex_eps*GJK_insimplex_eps)
-#define EPA_maxiterations 256
-#define EPA_inface_eps F(0.01)
-#define EPA_accuracy F(0.001)
-
-//
-// Utils
-//
-
-static inline F Abs(F v) { return(v<0?-v:v); }
-static inline F Sign(F v) { return(F(v<0?-1:1)); }
-template <typename T> static inline void Swap(T& a,T& b) { T
-t(a);a=b;b=t; }
-template <typename T> static inline T Min(const T& a,const T& b) {
-return(a<b?a:b); }
-template <typename T> static inline T Max(const T& a,const T& b) {
-return(a>b?a:b); }
-static inline void ClearMemory(void* p,U sz) { memset(p,0,(size_t)sz);
-}
-#if 0
-template <typename T> static inline void Raise(const T& object) {
-throw(object); }
-#else
-template <typename T> static inline void Raise(const T&) {}
-#endif
-
-
-
-//
-// GJK
-//
-struct GJK
- {
- struct Mkv
- {
- Vector3 w; /* Minkowski vertice */
- Vector3 r; /* Ray */
- };
- struct He
- {
- Vector3 v;
- He* n;
- };
- btStackAlloc* sa;
- btBlock* sablock;
- He* table[GJK_hashsize];
- Rotation wrotations[2];
- Vector3 positions[2];
- const btConvexShape* shapes[2];
- Mkv simplex[5];
- Vector3 ray;
- U order;
- U iterations;
- F margin;
- Z failed;
- //
- GJK(btStackAlloc* psa,
- const Rotation& wrot0,const Vector3& pos0,const btConvexShape* shape0,
- const Rotation& wrot1,const Vector3& pos1,const btConvexShape* shape1,
- F pmargin=0)
- {
- wrotations[0]=wrot0;positions[0]=pos0;shapes[0]=shape0;
- wrotations[1]=wrot1;positions[1]=pos1;shapes[1]=shape1;
- sa =psa;
- sablock =sa->beginBlock();
- margin =pmargin;
- failed =false;
- }
- //
- ~GJK()
- {
- sa->endBlock(sablock);
- }
- // vdh : very dumm hash
- static inline U Hash(const Vector3& v)
- {
- //this doesn't compile under GCC 3.3.5, so add the ()...
- //const U h(U(v[0]*15461)^U(v[1]*83003)^U(v[2]*15473));
- //return(((*((const U*)&h))*169639)&GJK_hashmask);
- const U h((U)(v[0]*15461)^(U)(v[1]*83003)^(U)(v[2]*15473));
- return(((*((const U*)&h))*169639)&GJK_hashmask);
- }
- //
- inline Vector3 LocalSupport(const Vector3& d,U i) const
- {
- return(wrotations[i]*shapes[i]->BTLOCALSUPPORT(d*wrotations[i])+positions[i]);
- }
- //
- inline void Support(const Vector3& d,Mkv& v) const
- {
- v.r = d;
- v.w = LocalSupport(d,0)-LocalSupport(-d,1)+d*margin;
- }
- #define SPX(_i_) simplex[_i_]
- #define SPXW(_i_) simplex[_i_].w
- //
- inline Z FetchSupport()
- {
- const U h(Hash(ray));
- He* e = (He*)(table[h]);
- while(e) { if(e->v==ray) { --order;return(false); } else e=e->n; }
- e=(He*)sa->allocate(sizeof(He));e->v=ray;e->n=table[h];table[h]=e;
- Support(ray,simplex[++order]);
- return(ray.dot(SPXW(order))>0);
- }
- //
- inline Z SolveSimplex2(const Vector3& ao,const Vector3& ab)
- {
- if(ab.dot(ao)>=0)
- {
- const Vector3 cabo(cross(ab,ao));
- if(cabo.length2()>GJK_sqinsimplex_eps)
- { ray=cross(cabo,ab); }
- else
- { return(true); }
- }
- else
- { order=0;SPX(0)=SPX(1);ray=ao; }
- return(false);
- }
- //
- inline Z SolveSimplex3(const Vector3& ao,const Vector3& ab,const Vector3&
-ac)
- {
- return(SolveSimplex3a(ao,ab,ac,cross(ab,ac)));
- }
- //
- inline Z SolveSimplex3a(const Vector3& ao,const Vector3& ab,const Vector3&
-ac,const Vector3& cabc)
- {
- if((cross(cabc,ab)).dot(ao)<-GJK_insimplex_eps)
- { order=1;SPX(0)=SPX(1);SPX(1)=SPX(2);return(SolveSimplex2(ao,ab)); }
- else if((cross(cabc,ac)).dot(ao)>+GJK_insimplex_eps)
- { order=1;SPX(1)=SPX(2);return(SolveSimplex2(ao,ac)); }
- else
- {
- const F d(cabc.dot(ao));
- if(Abs(d)>GJK_insimplex_eps)
- {
- if(d>0)
- { ray=cabc; }
- else
- { ray=-cabc;Swap(SPX(0),SPX(1)); }
- return(false);
- } else return(true);
- }
- }
- //
- inline Z SolveSimplex4(const Vector3& ao,const Vector3& ab,const Vector3&
-ac,const Vector3& ad)
- {
- Vector3 crs;
- if((crs=cross(ab,ac)).dot(ao)>GJK_insimplex_eps)
- {
-order=2;SPX(0)=SPX(1);SPX(1)=SPX(2);SPX(2)=SPX(3);return(SolveSimplex3a(ao,ab,ac,crs));
-}
- else if((crs=cross(ac,ad)).dot(ao)>GJK_insimplex_eps)
- { order=2;SPX(2)=SPX(3);return(SolveSimplex3a(ao,ac,ad,crs)); }
- else if((crs=cross(ad,ab)).dot(ao)>GJK_insimplex_eps)
- {
-order=2;SPX(1)=SPX(0);SPX(0)=SPX(2);SPX(2)=SPX(3);return(SolveSimplex3a(ao,ad,ab,crs));
-}
- else return(true);
- }
- //
- inline Z SearchOrigin(const Vector3& initray=Vector3(1,0,0))
- {
- iterations = 0;
- order = (U)-1;
- failed = false;
- ray = initray.normalized();
- ClearMemory(table,sizeof(void*)*GJK_hashsize);
- FetchSupport();
- ray = -SPXW(0);
- for(;iterations<GJK_maxiterations;++iterations)
- {
- const F rl(ray.length());
- ray/=rl>0?rl:1;
- if(FetchSupport())
- {
- Z found(false);
- switch(order)
- {
- case 1: found=SolveSimplex2(-SPXW(1),SPXW(0)-SPXW(1));break;
- case 2: found=SolveSimplex3(-SPXW(2),SPXW(1)-SPXW(2),SPXW(0)-SPXW(2));break;
- case 3: found=SolveSimplex4(-SPXW(3),SPXW(2)-SPXW(3),SPXW(1)-SPXW(3),SPXW(0)-SPXW(3));break;
- }
- if(found) return(true);
- } else return(false);
- }
- failed=true;
- return(false);
- }
- //
- inline Z EncloseOrigin()
- {
- switch(order)
- {
- /* Point */
- case 0: break;
- /* Line */
- case 1:
- {
- const Vector3 ab(SPXW(1)-SPXW(0));
- const Vector3 b[]={ cross(ab,Vector3(1,0,0)),
- cross(ab,Vector3(0,1,0)),
- cross(ab,Vector3(0,0,1))};
- const F m[]={b[0].length2(),b[1].length2(),b[2].length2()};
- const Rotation r(btQuaternion(ab.normalized(),cst2Pi/3));
- Vector3 w(b[m[0]>m[1]?m[0]>m[2]?0:2:m[1]>m[2]?1:2]);
- Support(w.normalized(),simplex[4]);w=r*w;
- Support(w.normalized(),simplex[2]);w=r*w;
- Support(w.normalized(),simplex[3]);w=r*w;
- order=4;
- return(true);
- }
- break;
- /* Triangle */
- case 2:
- {
- const
-Vector3 n(cross((SPXW(1)-SPXW(0)),(SPXW(2)-SPXW(0))).normalized());
- Support( n,simplex[3]);
- Support(-n,simplex[4]);
- order=4;
- return(true);
- }
- break;
- /* Tetrahedron */
- case 3: return(true);
- /* Hexahedron */
- case 4: return(true);
- }
- return(false);
- }
- #undef SPX
- #undef SPXW
- };
-
-//
-// EPA
-//
-struct EPA
- {
- //
- struct Face
- {
- const GJK::Mkv* v[3];
- Face* f[3];
- U e[3];
- Vector3 n;
- F d;
- U mark;
- Face* prev;
- Face* next;
- Face() {}
- };
- //
- GJK* gjk;
- btStackAlloc* sa;
- Face* root;
- U nfaces;
- U iterations;
- Vector3 features[2][3];
- Vector3 nearest[2];
- Vector3 normal;
- F depth;
- Z failed;
- //
- EPA(GJK* pgjk)
- {
- gjk = pgjk;
- sa = pgjk->sa;
- }
- //
- ~EPA()
- {
- }
- //
- inline Vector3 GetCoordinates(const Face* face) const
- {
- const Vector3 o(face->n*-face->d);
- const F a[]={ cross(face->v[0]->w-o,face->v[1]->w-o).length(),
- cross(face->v[1]->w-o,face->v[2]->w-o).length(),
- cross(face->v[2]->w-o,face->v[0]->w-o).length()};
- const F sm(a[0]+a[1]+a[2]);
- return(Vector3(a[1],a[2],a[0])/(sm>0?sm:1));
- }
- //
- inline Face* FindBest() const
- {
- Face* bf = 0;
- if(root)
- {
- Face* cf = root;
- F bd(cstInf);
- do {
- if(cf->d<bd) { bd=cf->d;bf=cf; }
- } while(0!=(cf=cf->next));
- }
- return(bf);
- }
- //
- inline Z Set(Face* f,const GJK::Mkv* a,const GJK::Mkv* b,const GJK::Mkv*
-c) const
- {
- const Vector3 nrm(cross(b->w-a->w,c->w-a->w));
- const F len(nrm.length());
- const Z valid( (cross(a->w,b->w).dot(nrm)>=-EPA_inface_eps)&&
- (cross(b->w,c->w).dot(nrm)>=-EPA_inface_eps)&&
- (cross(c->w,a->w).dot(nrm)>=-EPA_inface_eps));
- f->v[0] = a;
- f->v[1] = b;
- f->v[2] = c;
- f->mark = 0;
- f->n = nrm/(len>0?len:cstInf);
- f->d = Max<F>(0,-f->n.dot(a->w));
- return(valid);
- }
- //
- inline Face* NewFace(const GJK::Mkv* a,const GJK::Mkv* b,const GJK::Mkv* c)
- {
- Face* pf = (Face*)sa->allocate(sizeof(Face));
- if(Set(pf,a,b,c))
- {
- if(root) root->prev=pf;
- pf->prev=0;
- pf->next=root;
- root =pf;
- ++nfaces;
- }
- else
- {
- pf->prev=pf->next=0;
- }
- return(pf);
- }
- //
- inline void Detach(Face* face)
- {
- if(face->prev||face->next)
- {
- --nfaces;
- if(face==root)
- { root=face->next;root->prev=0; }
- else
- {
- if(face->next==0)
- { face->prev->next=0; }
- else
- { face->prev->next=face->next;face->next->prev=face->prev; }
- }
- face->prev=face->next=0;
- }
- }
- //
- inline void Link(Face* f0,U e0,Face* f1,U e1) const
- {
- f0->f[e0]=f1;f1->e[e1]=e0;
- f1->f[e1]=f0;f0->e[e0]=e1;
- }
- //
- GJK::Mkv* Support(const Vector3& w) const
- {
- GJK::Mkv* v =(GJK::Mkv*)sa->allocate(sizeof(GJK::Mkv));
- gjk->Support(w,*v);
- return(v);
- }
- //
- U BuildHorizon(U markid,const GJK::Mkv* w,Face& f,U e,Face*& cf,Face*&
-ff)
- {
- static const U mod3[]={0,1,2,0,1};
- U ne(0);
- if(f.mark!=markid)
- {
- const U e1(mod3[e+1]);
- if((f.n.dot(w->w)+f.d)>0)
- {
- Face* nf = NewFace(f.v[e1],f.v[e],w);
- Link(nf,0,&f,e);
- if(cf) Link(cf,1,nf,2); else ff=nf;
- cf=nf;ne=1;
- }
- else
- {
- const U e2(mod3[e+2]);
- Detach(&f);
- f.mark = markid;
- ne += BuildHorizon(markid,w,*f.f[e1],f.e[e1],cf,ff);
- ne += BuildHorizon(markid,w,*f.f[e2],f.e[e2],cf,ff);
- }
- }
- return(ne);
- }
- //
- inline F EvaluatePD(F accuracy=EPA_accuracy)
- {
- btBlock* sablock = sa->beginBlock();
- Face* bestface = 0;
- U markid(1);
- depth = -cstInf;
- normal = Vector3(0,0,0);
- root = 0;
- nfaces = 0;
- iterations = 0;
- failed = false;
- /* Prepare hull */
- if(gjk->EncloseOrigin())
- {
- const U* pfidx = 0;
- U nfidx= 0;
- const U* peidx = 0;
- U neidx = 0;
- GJK::Mkv* basemkv[5];
- Face* basefaces[6];
- switch(gjk->order)
- {
- /* Tetrahedron */
- case 3: {
- static const U fidx[4][3]={{2,1,0},{3,0,1},{3,1,2},{3,2,0}};
- static const
-U eidx[6][4]={{0,0,2,1},{0,1,1,1},{0,2,3,1},{1,0,3,2},{2,0,1,2},{3,0,2,2}};
- pfidx=(const U*)fidx;nfidx=4;peidx=(const U*)eidx;neidx=6;
- } break;
- /* Hexahedron */
- case 4: {
- static const
-U fidx[6][3]={{2,0,4},{4,1,2},{1,4,0},{0,3,1},{0,2,3},{1,3,2}};
- static const
-U eidx[9][4]={{0,0,4,0},{0,1,2,1},{0,2,1,2},{1,1,5,2},{1,0,2,0},{2,2,3,2},{3,1,5,0},{3,0,4,2},{5,1,4,1}};
- pfidx=(const U*)fidx;nfidx=6;peidx=(const U*)eidx;neidx=9;
- } break;
- }
- U i;
-
- for( i=0;i<=gjk->order;++i) {
-basemkv[i]=(GJK::Mkv*)sa->allocate(sizeof(GJK::Mkv));*basemkv[i]=gjk->simplex[i];
-}
- for( i=0;i<nfidx;++i,pfidx+=3) {
-basefaces[i]=NewFace(basemkv[pfidx[0]],basemkv[pfidx[1]],basemkv[pfidx[2]]);
-}
- for( i=0;i<neidx;++i,peidx+=4) {
-Link(basefaces[peidx[0]],peidx[1],basefaces[peidx[2]],peidx[3]); }
- }
- if(0==nfaces)
- {
- sa->endBlock(sablock);
- return(depth);
- }
- /* Expand hull */
- for(;iterations<EPA_maxiterations;++iterations)
- {
- Face* bf = FindBest();
- if(bf)
- {
- GJK::Mkv* w = Support(-bf->n);
- const F d(bf->n.dot(w->w)+bf->d);
- bestface = bf;
- if(d<-accuracy)
- {
- Face* cf =0;
- Face* ff =0;
- U nf = 0;
- Detach(bf);
- bf->mark=++markid;
- for(U i=0;i<3;++i) {
-nf+=BuildHorizon(markid,w,*bf->f[i],bf->e[i],cf,ff); }
- if(nf<=2) { break; }
- Link(cf,1,ff,2);
- } else break;
- } else break;
- }
- /* Extract contact */
- if(bestface)
- {
- const Vector3 b(GetCoordinates(bestface));
- normal = bestface->n;
- depth = Max<F>(0,bestface->d);
- for(U i=0;i<2;++i)
- {
- const F s(F(i?-1:1));
- for(U j=0;j<3;++j)
- {
- features[i][j]=gjk->LocalSupport(s*bestface->v[j]->r,i);
- }
- }
- nearest[0] = features[0][0]*b.x()+features[0][1]*b.y()+features[0][2]*b.z();
- nearest[1] = features[1][0]*b.x()+features[1][1]*b.y()+features[1][2]*b.z();
- } else failed=true;
- sa->endBlock(sablock);
- return(depth);
- }
- };
-}
-
-//
-// Api
-//
-
-using namespace gjkepa_impl;
-
-
-
-//
-bool btGjkEpaSolver::Collide(const btConvexShape *shape0,const btTransform &wtrs0,
- const btConvexShape *shape1,const btTransform &wtrs1,
- btScalar radialmargin,
- btStackAlloc* stackAlloc,
- sResults& results)
-{
-
-
-/* Initialize */
-results.witnesses[0] =
-results.witnesses[1] =
-results.normal = Vector3(0,0,0);
-results.depth = 0;
-results.status = sResults::Separated;
-results.epa_iterations = 0;
-results.gjk_iterations = 0;
-/* Use GJK to locate origin */
-GJK gjk(stackAlloc,
- wtrs0.getBasis(),wtrs0.getOrigin(),shape0,
- wtrs1.getBasis(),wtrs1.getOrigin(),shape1,
- radialmargin+EPA_accuracy);
-const Z collide(gjk.SearchOrigin());
-results.gjk_iterations = static_cast<int>(gjk.iterations+1);
-if(collide)
- {
- /* Then EPA for penetration depth */
- EPA epa(&gjk);
- const F pd(epa.EvaluatePD());
- results.epa_iterations = static_cast<int>(epa.iterations+1);
- if(pd>0)
- {
- results.status = sResults::Penetrating;
- results.normal = epa.normal;
- results.depth = pd;
- results.witnesses[0] = epa.nearest[0];
- results.witnesses[1] = epa.nearest[1];
- return(true);
- } else { if(epa.failed) results.status=sResults::EPA_Failed; }
- } else { if(gjk.failed) results.status=sResults::GJK_Failed; }
-return(false);
-}
-
-
-
-
-
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.h
deleted file mode 100644
index 1c256f41939..00000000000
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
-
-This software is provided 'as-is', without any express or implied warranty.
-In no event will the authors be held liable for any damages arising from the use of this software.
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it freely,
-subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
-2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
-3. This notice may not be removed or altered from any source distribution.
-*/
-
-/*
-GJK-EPA collision solver by Nathanael Presson
-Nov.2006
-*/
-
-
-#ifndef _05E48D53_04E0_49ad_BB0A_D74FE62E7366_
-#define _05E48D53_04E0_49ad_BB0A_D74FE62E7366_
-#include "BulletCollision/CollisionShapes/btConvexShape.h"
-
-class btStackAlloc;
-
-///btGjkEpaSolver contributed under zlib by Nathanael Presson
-struct btGjkEpaSolver
-{
-struct sResults
- {
- enum eStatus
- {
- Separated, /* Shapes doesnt penetrate */
- Penetrating, /* Shapes are penetrating */
- GJK_Failed, /* GJK phase fail, no big issue, shapes are probably just 'touching' */
- EPA_Failed /* EPA phase fail, bigger problem, need to save parameters, and debug */
- } status;
- btVector3 witnesses[2];
- btVector3 normal;
- btScalar depth;
- int epa_iterations;
- int gjk_iterations;
- };
-static bool Collide(const btConvexShape* shape0,const btTransform& wtrs0,
- const btConvexShape* shape1,const btTransform& wtrs1,
- btScalar radialmargin,
- btStackAlloc* stackAlloc,
- sResults& results);
-};
-
-#endif
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp
index ada20d3ef7a..f74261d4b21 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp
@@ -68,7 +68,43 @@ namespace gjkepa2_impl
const btConvexShape* m_shapes[2];
btMatrix3x3 m_toshape1;
btTransform m_toshape0;
+#ifdef __SPU__
+ bool m_enableMargin;
+#else
btVector3 (btConvexShape::*Ls)(const btVector3&) const;
+#endif//__SPU__
+
+
+ MinkowskiDiff()
+ {
+
+ }
+#ifdef __SPU__
+ void EnableMargin(bool enable)
+ {
+ m_enableMargin = enable;
+ }
+ inline btVector3 Support0(const btVector3& d) const
+ {
+ if (m_enableMargin)
+ {
+ return m_shapes[0]->localGetSupportVertexNonVirtual(d);
+ } else
+ {
+ return m_shapes[0]->localGetSupportVertexWithoutMarginNonVirtual(d);
+ }
+ }
+ inline btVector3 Support1(const btVector3& d) const
+ {
+ if (m_enableMargin)
+ {
+ return m_toshape0*(m_shapes[1]->localGetSupportVertexNonVirtual(m_toshape1*d));
+ } else
+ {
+ return m_toshape0*(m_shapes[1]->localGetSupportVertexWithoutMarginNonVirtual(m_toshape1*d));
+ }
+ }
+#else
void EnableMargin(bool enable)
{
if(enable)
@@ -84,6 +120,8 @@ namespace gjkepa2_impl
{
return(m_toshape0*((m_shapes[1])->*(Ls))(m_toshape1*d));
}
+#endif //__SPU__
+
inline btVector3 Support(const btVector3& d) const
{
return(Support0(d)-Support1(-d));
@@ -202,7 +240,7 @@ namespace gjkepa2_impl
lastw[clastw=(clastw+1)&3]=w;
}
/* Check for termination */
- const btScalar omega=dot(m_ray,w)/rl;
+ const btScalar omega=btDot(m_ray,w)/rl;
alpha=btMax(omega,alpha);
if(((rl-alpha)-(GJK_ACCURARY*rl))<=0)
{/* Return old simplex */
@@ -259,6 +297,9 @@ namespace gjkepa2_impl
{
case eStatus::Valid: m_distance=m_ray.length();break;
case eStatus::Inside: m_distance=0;break;
+ default:
+ {
+ }
}
return(m_status);
}
@@ -288,7 +329,7 @@ namespace gjkepa2_impl
{
btVector3 axis=btVector3(0,0,0);
axis[i]=1;
- const btVector3 p=cross(d,axis);
+ const btVector3 p=btCross(d,axis);
if(p.length2()>0)
{
appendvertice(*m_simplex, p);
@@ -303,7 +344,7 @@ namespace gjkepa2_impl
break;
case 3:
{
- const btVector3 n=cross(m_simplex->c[1]->w-m_simplex->c[0]->w,
+ const btVector3 n=btCross(m_simplex->c[1]->w-m_simplex->c[0]->w,
m_simplex->c[2]->w-m_simplex->c[0]->w);
if(n.length2()>0)
{
@@ -357,7 +398,7 @@ namespace gjkepa2_impl
const btScalar l=d.length2();
if(l>GJK_SIMPLEX2_EPS)
{
- const btScalar t(l>0?-dot(a,d)/l:0);
+ const btScalar t(l>0?-btDot(a,d)/l:0);
if(t>=1) { w[0]=0;w[1]=1;m=2;return(b.length2()); }
else if(t<=0) { w[0]=1;w[1]=0;m=1;return(a.length2()); }
else { w[0]=1-(w[1]=t);m=3;return((a+d*t).length2()); }
@@ -372,16 +413,16 @@ namespace gjkepa2_impl
static const U imd3[]={1,2,0};
const btVector3* vt[]={&a,&b,&c};
const btVector3 dl[]={a-b,b-c,c-a};
- const btVector3 n=cross(dl[0],dl[1]);
+ const btVector3 n=btCross(dl[0],dl[1]);
const btScalar l=n.length2();
if(l>GJK_SIMPLEX3_EPS)
{
btScalar mindist=-1;
- btScalar subw[2];
- U subm;
+ btScalar subw[2]={0.f,0.f};
+ U subm(0);
for(U i=0;i<3;++i)
{
- if(dot(*vt[i],cross(dl[i],n))>0)
+ if(btDot(*vt[i],btCross(dl[i],n))>0)
{
const U j=imd3[i];
const btScalar subd(projectorigin(*vt[i],*vt[j],subw,subm));
@@ -397,13 +438,13 @@ namespace gjkepa2_impl
}
if(mindist<0)
{
- const btScalar d=dot(a,n);
+ const btScalar d=btDot(a,n);
const btScalar s=btSqrt(l);
const btVector3 p=n*(d/l);
mindist = p.length2();
m = 7;
- w[0] = (cross(dl[1],b-p)).length()/s;
- w[1] = (cross(dl[2],c-p)).length()/s;
+ w[0] = (btCross(dl[1],b-p)).length()/s;
+ w[1] = (btCross(dl[2],c-p)).length()/s;
w[2] = 1-(w[0]+w[1]);
}
return(mindist);
@@ -420,16 +461,16 @@ namespace gjkepa2_impl
const btVector3* vt[]={&a,&b,&c,&d};
const btVector3 dl[]={a-d,b-d,c-d};
const btScalar vl=det(dl[0],dl[1],dl[2]);
- const bool ng=(vl*dot(a,cross(b-c,a-b)))<=0;
+ const bool ng=(vl*btDot(a,btCross(b-c,a-b)))<=0;
if(ng&&(btFabs(vl)>GJK_SIMPLEX4_EPS))
{
btScalar mindist=-1;
- btScalar subw[3];
- U subm;
+ btScalar subw[3]={0.f,0.f,0.f};
+ U subm(0);
for(U i=0;i<3;++i)
{
const U j=imd3[i];
- const btScalar s=vl*dot(d,cross(dl[i],dl[j]));
+ const btScalar s=vl*btDot(d,btCross(dl[i],dl[j]));
if(s>0)
{
const btScalar subd=projectorigin(*vt[i],*vt[j],d,subw,subm);
@@ -601,7 +642,7 @@ namespace gjkepa2_impl
bool valid=true;
best->pass = (U1)(++pass);
gjk.getsupport(best->n,*w);
- const btScalar wdist=dot(best->n,w->w)-best->d;
+ const btScalar wdist=btDot(best->n,w->w)-best->d;
if(wdist>EPA_ACCURACY)
{
for(U j=0;(j<3)&&valid;++j)
@@ -628,11 +669,11 @@ namespace gjkepa2_impl
m_result.c[0] = outer.c[0];
m_result.c[1] = outer.c[1];
m_result.c[2] = outer.c[2];
- m_result.p[0] = cross( outer.c[1]->w-projection,
+ m_result.p[0] = btCross( outer.c[1]->w-projection,
outer.c[2]->w-projection).length();
- m_result.p[1] = cross( outer.c[2]->w-projection,
+ m_result.p[1] = btCross( outer.c[2]->w-projection,
outer.c[0]->w-projection).length();
- m_result.p[2] = cross( outer.c[0]->w-projection,
+ m_result.p[2] = btCross( outer.c[0]->w-projection,
outer.c[1]->w-projection).length();
const btScalar sum=m_result.p[0]+m_result.p[1]+m_result.p[2];
m_result.p[0] /= sum;
@@ -666,18 +707,18 @@ namespace gjkepa2_impl
face->c[0] = a;
face->c[1] = b;
face->c[2] = c;
- face->n = cross(b->w-a->w,c->w-a->w);
+ face->n = btCross(b->w-a->w,c->w-a->w);
const btScalar l=face->n.length();
const bool v=l>EPA_ACCURACY;
face->p = btMin(btMin(
- dot(a->w,cross(face->n,a->w-b->w)),
- dot(b->w,cross(face->n,b->w-c->w))),
- dot(c->w,cross(face->n,c->w-a->w))) /
+ btDot(a->w,btCross(face->n,a->w-b->w)),
+ btDot(b->w,btCross(face->n,b->w-c->w))),
+ btDot(c->w,btCross(face->n,c->w-a->w))) /
(v?l:1);
face->p = face->p>=-EPA_INSIDE_EPS?0:face->p;
if(v)
{
- face->d = dot(a->w,face->n)/l;
+ face->d = btDot(a->w,face->n)/l;
face->n /= l;
if(forced||(face->d>=-EPA_PLANE_EPS))
{
@@ -715,7 +756,7 @@ namespace gjkepa2_impl
if(f->pass!=pass)
{
const U e1=i1m3[e];
- if((dot(f->n,w->w)-f->d)<-EPA_PLANE_EPS)
+ if((btDot(f->n,w->w)-f->d)<-EPA_PLANE_EPS)
{
sFace* nf=newface(f->c[e1],f->c[e],w,false);
if(nf)
@@ -854,10 +895,14 @@ bool btGjkEpaSolver2::Penetration( const btConvexShape* shape0,
case GJK::eStatus::Failed:
results.status=sResults::GJK_Failed;
break;
+ default:
+ {
+ }
}
return(false);
}
+#ifndef __SPU__
//
btScalar btGjkEpaSolver2::SignedDistance(const btVector3& position,
btScalar margin,
@@ -923,6 +968,7 @@ bool btGjkEpaSolver2::SignedDistance(const btConvexShape* shape0,
else
return(true);
}
+#endif //__SPU__
/* Symbols cleanup */
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h
index a55214203d3..2296527d7db 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h
@@ -55,7 +55,7 @@ static bool Penetration(const btConvexShape* shape0,const btTransform& wtrs0,
const btVector3& guess,
sResults& results,
bool usemargins=true);
-
+#ifndef __SPU__
static btScalar SignedDistance( const btVector3& position,
btScalar margin,
const btConvexShape* shape,
@@ -66,6 +66,8 @@ static bool SignedDistance( const btConvexShape* shape0,const btTransform& wtrs
const btConvexShape* shape1,const btTransform& wtrs1,
const btVector3& guess,
sResults& results);
+#endif //__SPU__
+
};
#endif
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
index 55c23ee8549..c6dc3f3a672 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
@@ -25,17 +25,19 @@ bool btGjkEpaPenetrationDepthSolver::calcPenDepth( btSimplexSolverInterface& sim
const btConvexShape* pConvexA, const btConvexShape* pConvexB,
const btTransform& transformA, const btTransform& transformB,
btVector3& v, btVector3& wWitnessOnA, btVector3& wWitnessOnB,
- class btIDebugDraw* debugDraw )
+ class btIDebugDraw* debugDraw, btStackAlloc* stackAlloc )
{
(void)debugDraw;
(void)v;
(void)simplexSolver;
- const btScalar radialmargin(btScalar(0.));
+// const btScalar radialmargin(btScalar(0.));
btVector3 guessVector(transformA.getOrigin()-transformB.getOrigin());
btGjkEpaSolver2::sResults results;
+
+
if(btGjkEpaSolver2::Penetration(pConvexA,transformA,
pConvexB,transformB,
guessVector,results))
@@ -45,8 +47,18 @@ bool btGjkEpaPenetrationDepthSolver::calcPenDepth( btSimplexSolverInterface& sim
//resultOut->addContactPoint(results.normal,results.witnesses[1],-results.depth);
wWitnessOnA = results.witnesses[0];
wWitnessOnB = results.witnesses[1];
+ v = results.normal;
return true;
+ } else
+ {
+ if(btGjkEpaSolver2::Distance(pConvexA,transformA,pConvexB,transformB,guessVector,results))
+ {
+ wWitnessOnA = results.witnesses[0];
+ wWitnessOnB = results.witnesses[1];
+ v = results.normal;
+ return false;
}
+ }
return false;
}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h
index 4db18628021..a49689a1501 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h
@@ -25,11 +25,15 @@ class btGjkEpaPenetrationDepthSolver : public btConvexPenetrationDepthSolver
{
public :
+ btGjkEpaPenetrationDepthSolver()
+ {
+ }
+
bool calcPenDepth( btSimplexSolverInterface& simplexSolver,
const btConvexShape* pConvexA, const btConvexShape* pConvexB,
const btTransform& transformA, const btTransform& transformB,
btVector3& v, btVector3& wWitnessOnA, btVector3& wWitnessOnB,
- class btIDebugDraw* debugDraw );
+ class btIDebugDraw* debugDraw,btStackAlloc* stackAlloc );
private :
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
index 331d25623df..8af16b9cf6f 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
@@ -38,20 +38,49 @@ int gNumDeepPenetrationChecks = 0;
int gNumGjkChecks = 0;
-
btGjkPairDetector::btGjkPairDetector(const btConvexShape* objectA,const btConvexShape* objectB,btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver* penetrationDepthSolver)
-:m_cachedSeparatingAxis(btScalar(0.),btScalar(0.),btScalar(1.)),
+:m_cachedSeparatingAxis(btScalar(0.),btScalar(1.),btScalar(0.)),
+m_penetrationDepthSolver(penetrationDepthSolver),
+m_simplexSolver(simplexSolver),
+m_minkowskiA(objectA),
+m_minkowskiB(objectB),
+m_shapeTypeA(objectA->getShapeType()),
+m_shapeTypeB(objectB->getShapeType()),
+m_marginA(objectA->getMargin()),
+m_marginB(objectB->getMargin()),
+m_ignoreMargin(false),
+m_lastUsedMethod(-1),
+m_catchDegeneracies(1)
+{
+}
+btGjkPairDetector::btGjkPairDetector(const btConvexShape* objectA,const btConvexShape* objectB,int shapeTypeA,int shapeTypeB,btScalar marginA, btScalar marginB, btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver* penetrationDepthSolver)
+:m_cachedSeparatingAxis(btScalar(0.),btScalar(1.),btScalar(0.)),
m_penetrationDepthSolver(penetrationDepthSolver),
m_simplexSolver(simplexSolver),
m_minkowskiA(objectA),
m_minkowskiB(objectB),
+m_shapeTypeA(shapeTypeA),
+m_shapeTypeB(shapeTypeB),
+m_marginA(marginA),
+m_marginB(marginB),
m_ignoreMargin(false),
m_lastUsedMethod(-1),
m_catchDegeneracies(1)
{
}
-void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw,bool swapResults)
+void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw,bool swapResults)
+{
+ (void)swapResults;
+
+ getClosestPointsNonVirtual(input,output,debugDraw);
+}
+
+#ifdef __SPU__
+void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw)
+#else
+void btGjkPairDetector::getClosestPointsNonVirtual(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw)
+#endif
{
m_cachedSeparatingDistance = 0.f;
@@ -64,21 +93,10 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
localTransA.getOrigin() -= positionOffset;
localTransB.getOrigin() -= positionOffset;
-#ifdef __SPU__
- btScalar marginA = m_minkowskiA->getMarginNonVirtual();
- btScalar marginB = m_minkowskiB->getMarginNonVirtual();
-#else
- btScalar marginA = m_minkowskiA->getMargin();
- btScalar marginB = m_minkowskiB->getMargin();
-#ifdef TEST_NON_VIRTUAL
- btScalar marginAv = m_minkowskiA->getMarginNonVirtual();
- btScalar marginBv = m_minkowskiB->getMarginNonVirtual();
- btAssert(marginA == marginAv);
- btAssert(marginB == marginBv);
-#endif //TEST_NON_VIRTUAL
-#endif
-
+ bool check2d = m_minkowskiA->isConvex2d() && m_minkowskiB->isConvex2d();
+ btScalar marginA = m_marginA;
+ btScalar marginB = m_marginB;
gNumGjkChecks++;
@@ -107,7 +125,7 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
m_lastUsedMethod = -1;
{
- btScalar squaredDistance = SIMD_INFINITY;
+ btScalar squaredDistance = BT_LARGE_FLOAT;
btScalar delta = btScalar(0.);
btScalar margin = marginA + marginB;
@@ -123,6 +141,15 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
btVector3 seperatingAxisInA = (-m_cachedSeparatingAxis)* input.m_transformA.getBasis();
btVector3 seperatingAxisInB = m_cachedSeparatingAxis* input.m_transformB.getBasis();
+#if 1
+
+ btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
+ btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
+
+// btVector3 pInA = localGetSupportingVertexWithoutMargin(m_shapeTypeA, m_minkowskiA, seperatingAxisInA,input.m_convexVertexData[0]);//, &featureIndexA);
+// btVector3 qInB = localGetSupportingVertexWithoutMargin(m_shapeTypeB, m_minkowskiB, seperatingAxisInB,input.m_convexVertexData[1]);//, &featureIndexB);
+
+#else
#ifdef __SPU__
btVector3 pInA = m_minkowskiA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
btVector3 qInB = m_minkowskiB->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInB);
@@ -136,6 +163,8 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
btAssert((qInBv-qInB).length() < 0.0001);
#endif //
#endif //__SPU__
+#endif
+
btVector3 pWorld = localTransA(pInA);
btVector3 qWorld = localTransB(qInB);
@@ -144,12 +173,19 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
spu_printf("got local supporting vertices\n");
#endif
+ if (check2d)
+ {
+ pWorld[2] = 0.f;
+ qWorld[2] = 0.f;
+ }
+
btVector3 w = pWorld - qWorld;
delta = m_cachedSeparatingAxis.dot(w);
// potential exit, they don't overlap
if ((delta > btScalar(0.0)) && (delta * delta > squaredDistance * input.m_maximumDistanceSquared))
{
+ m_degenerateSimplex = 10;
checkSimplex=true;
//checkPenetration = false;
break;
@@ -171,6 +207,9 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
if (f0 <= btScalar(0.))
{
m_degenerateSimplex = 2;
+ } else
+ {
+ m_degenerateSimplex = 11;
}
checkSimplex = true;
break;
@@ -184,34 +223,52 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
#ifdef DEBUG_SPU_COLLISION_DETECTION
spu_printf("addVertex 2\n");
#endif
+ btVector3 newCachedSeparatingAxis;
+
//calculate the closest point to the origin (update vector v)
- if (!m_simplexSolver->closest(m_cachedSeparatingAxis))
+ if (!m_simplexSolver->closest(newCachedSeparatingAxis))
{
m_degenerateSimplex = 3;
checkSimplex = true;
break;
}
- if(m_cachedSeparatingAxis.length2()<REL_ERROR2)
+ if(newCachedSeparatingAxis.length2()<REL_ERROR2)
{
+ m_cachedSeparatingAxis = newCachedSeparatingAxis;
m_degenerateSimplex = 6;
checkSimplex = true;
break;
}
btScalar previousSquaredDistance = squaredDistance;
- squaredDistance = m_cachedSeparatingAxis.length2();
+ squaredDistance = newCachedSeparatingAxis.length2();
+#if 0
+///warning: this termination condition leads to some problems in 2d test case see Bullet/Demos/Box2dDemo
+ if (squaredDistance>previousSquaredDistance)
+ {
+ m_degenerateSimplex = 7;
+ squaredDistance = previousSquaredDistance;
+ checkSimplex = false;
+ break;
+ }
+#endif //
+
//redundant m_simplexSolver->compute_points(pointOnA, pointOnB);
//are we getting any closer ?
if (previousSquaredDistance - squaredDistance <= SIMD_EPSILON * previousSquaredDistance)
{
- m_simplexSolver->backup_closest(m_cachedSeparatingAxis);
+// m_simplexSolver->backup_closest(m_cachedSeparatingAxis);
checkSimplex = true;
+ m_degenerateSimplex = 12;
+
break;
}
+ m_cachedSeparatingAxis = newCachedSeparatingAxis;
+
//degeneracy, this is typically due to invalid/uninitialized worldtransforms for a btCollisionObject
if (m_curIter++ > gGjkMaxIter)
{
@@ -238,7 +295,8 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
if (!check)
{
//do we need this backup_closest here ?
- m_simplexSolver->backup_closest(m_cachedSeparatingAxis);
+// m_simplexSolver->backup_closest(m_cachedSeparatingAxis);
+ m_degenerateSimplex = 13;
break;
}
}
@@ -246,8 +304,9 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
if (checkSimplex)
{
m_simplexSolver->compute_points(pointOnA, pointOnB);
- normalInB = pointOnA-pointOnB;
- btScalar lenSqr = m_cachedSeparatingAxis.length2();
+ normalInB = m_cachedSeparatingAxis;
+ btScalar lenSqr =m_cachedSeparatingAxis.length2();
+
//valid normal
if (lenSqr < 0.0001)
{
@@ -279,7 +338,7 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
if (checkPenetration && (!isValid || catchDegeneratePenetrationCase ))
{
//penetration case
-
+
//if there is no way to handle penetrations, bail out
if (m_penetrationDepthSolver)
{
@@ -287,19 +346,27 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
btVector3 tmpPointOnA,tmpPointOnB;
gNumDeepPenetrationChecks++;
+ m_cachedSeparatingAxis.setZero();
bool isValid2 = m_penetrationDepthSolver->calcPenDepth(
*m_simplexSolver,
m_minkowskiA,m_minkowskiB,
localTransA,localTransB,
m_cachedSeparatingAxis, tmpPointOnA, tmpPointOnB,
- debugDraw
+ debugDraw,input.m_stackAlloc
);
+
if (isValid2)
{
btVector3 tmpNormalInB = tmpPointOnB-tmpPointOnA;
btScalar lenSqr = tmpNormalInB.length2();
+ if (lenSqr <= (SIMD_EPSILON*SIMD_EPSILON))
+ {
+ tmpNormalInB = m_cachedSeparatingAxis;
+ lenSqr = m_cachedSeparatingAxis.length2();
+ }
+
if (lenSqr > (SIMD_EPSILON*SIMD_EPSILON))
{
tmpNormalInB /= btSqrt(lenSqr);
@@ -315,32 +382,62 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
m_lastUsedMethod = 3;
} else
{
-
+ m_lastUsedMethod = 8;
}
} else
{
- //isValid = false;
- m_lastUsedMethod = 4;
+ m_lastUsedMethod = 9;
}
} else
+
{
- m_lastUsedMethod = 5;
+ ///this is another degenerate case, where the initial GJK calculation reports a degenerate case
+ ///EPA reports no penetration, and the second GJK (using the supporting vector without margin)
+ ///reports a valid positive distance. Use the results of the second GJK instead of failing.
+ ///thanks to Jacob.Langford for the reproduction case
+ ///http://code.google.com/p/bullet/issues/detail?id=250
+
+
+ if (m_cachedSeparatingAxis.length2() > btScalar(0.))
+ {
+ btScalar distance2 = (tmpPointOnA-tmpPointOnB).length()-margin;
+ //only replace valid distances when the distance is less
+ if (!isValid || (distance2 < distance))
+ {
+ distance = distance2;
+ pointOnA = tmpPointOnA;
+ pointOnB = tmpPointOnB;
+ pointOnA -= m_cachedSeparatingAxis * marginA ;
+ pointOnB += m_cachedSeparatingAxis * marginB ;
+ normalInB = m_cachedSeparatingAxis;
+ normalInB.normalize();
+ isValid = true;
+ m_lastUsedMethod = 6;
+ } else
+ {
+ m_lastUsedMethod = 5;
+ }
+ }
}
}
+
}
}
- if (isValid)
- {
-#ifdef __SPU__
- //spu_printf("distance\n");
-#endif //__CELLOS_LV2__
+
+ if (isValid && ((distance < 0) || (distance*distance < input.m_maximumDistanceSquared)))
+ {
+#if 0
+///some debugging
+// if (check2d)
+ {
+ printf("n = %2.3f,%2.3f,%2.3f. ",normalInB[0],normalInB[1],normalInB[2]);
+ printf("distance = %2.3f exit=%d deg=%d\n",distance,m_lastUsedMethod,m_degenerateSimplex);
+ }
+#endif
-#ifdef DEBUG_SPU_COLLISION_DETECTION
- spu_printf("output 1\n");
-#endif
m_cachedSeparatingAxis = normalInB;
m_cachedSeparatingDistance = distance;
@@ -349,10 +446,6 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
pointOnB+positionOffset,
distance);
-#ifdef DEBUG_SPU_COLLISION_DETECTION
- spu_printf("output 2\n");
-#endif
- //printf("gjk add:%f",distance);
}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
index 0ad4aab8a59..cc6287c86b0 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
@@ -36,6 +36,11 @@ class btGjkPairDetector : public btDiscreteCollisionDetectorInterface
btSimplexSolverInterface* m_simplexSolver;
const btConvexShape* m_minkowskiA;
const btConvexShape* m_minkowskiB;
+ int m_shapeTypeA;
+ int m_shapeTypeB;
+ btScalar m_marginA;
+ btScalar m_marginB;
+
bool m_ignoreMargin;
btScalar m_cachedSeparatingDistance;
@@ -50,10 +55,14 @@ public:
btGjkPairDetector(const btConvexShape* objectA,const btConvexShape* objectB,btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver* penetrationDepthSolver);
+ btGjkPairDetector(const btConvexShape* objectA,const btConvexShape* objectB,int shapeTypeA,int shapeTypeB,btScalar marginA, btScalar marginB, btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver* penetrationDepthSolver);
virtual ~btGjkPairDetector() {};
virtual void getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw,bool swapResults=false);
+ void getClosestPointsNonVirtual(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw);
+
+
void setMinkowskiA(btConvexShape* minkA)
{
m_minkowskiA = minkA;
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
index c7c9812985d..cd310570e06 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
@@ -19,7 +19,21 @@ subject to the following restrictions:
#include "LinearMath/btVector3.h"
#include "LinearMath/btTransformUtil.h"
-
+#ifdef PFX_USE_FREE_VECTORMATH
+ #include "physics_effects\base_level\solver\pfx_constraint_row.h"
+typedef sce::PhysicsEffects::PfxConstraintRow btConstraintRow;
+#else
+ // Don't change following order of parameters
+ ATTRIBUTE_ALIGNED16(struct) btConstraintRow {
+ btScalar m_normal[3];
+ btScalar m_rhs;
+ btScalar m_jacDiagInv;
+ btScalar m_lowerLimit;
+ btScalar m_upperLimit;
+ btScalar m_accumImpulse;
+ };
+ typedef btConstraintRow PfxConstraintRow;
+#endif //PFX_USE_FREE_VECTORMATH
@@ -34,6 +48,10 @@ class btManifoldPoint
m_lateralFrictionInitialized(false),
m_appliedImpulseLateral1(0.f),
m_appliedImpulseLateral2(0.f),
+ m_contactMotion1(0.f),
+ m_contactMotion2(0.f),
+ m_contactCFM1(0.f),
+ m_contactCFM2(0.f),
m_lifeTime(0)
{
}
@@ -52,10 +70,15 @@ class btManifoldPoint
m_lateralFrictionInitialized(false),
m_appliedImpulseLateral1(0.f),
m_appliedImpulseLateral2(0.f),
+ m_contactMotion1(0.f),
+ m_contactMotion2(0.f),
+ m_contactCFM1(0.f),
+ m_contactCFM2(0.f),
m_lifeTime(0)
{
-
-
+ mConstraintRow[0].m_accumImpulse = 0.f;
+ mConstraintRow[1].m_accumImpulse = 0.f;
+ mConstraintRow[2].m_accumImpulse = 0.f;
}
@@ -83,11 +106,21 @@ class btManifoldPoint
bool m_lateralFrictionInitialized;
btScalar m_appliedImpulseLateral1;
btScalar m_appliedImpulseLateral2;
+ btScalar m_contactMotion1;
+ btScalar m_contactMotion2;
+ btScalar m_contactCFM1;
+ btScalar m_contactCFM2;
+
int m_lifeTime;//lifetime of the contactpoint in frames
btVector3 m_lateralFrictionDir1;
btVector3 m_lateralFrictionDir2;
+
+
+ btConstraintRow mConstraintRow[3];
+
+
btScalar getDistance() const
{
return m_distance1;
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp
index 1fdbb2457d1..fe31f08d61a 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp
@@ -20,63 +20,20 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btConvexShape.h"
#define NUM_UNITSPHERE_POINTS 42
-static btVector3 sPenetrationDirections[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
-{
-btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
-btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
-btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
-btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
-btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
-btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
-btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
-btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
-btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
-btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
-btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
-btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
-btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
-btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
-btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
-btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
-btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
-btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
-btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
-btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
-btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
-btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
-btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
-btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
-btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
-btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
-btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
-btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
-btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
-btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
-btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
-btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
-btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
-btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
-btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
-btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
-btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
-btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
-btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
-btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
-btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
-btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
-};
bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& simplexSolver,
const btConvexShape* convexA,const btConvexShape* convexB,
const btTransform& transA,const btTransform& transB,
btVector3& v, btVector3& pa, btVector3& pb,
- class btIDebugDraw* debugDraw
+ class btIDebugDraw* debugDraw,btStackAlloc* stackAlloc
)
{
+ (void)stackAlloc;
(void)v;
+ bool check2d= convexA->isConvex2d() && convexB->isConvex2d();
struct btIntermediateResult : public btDiscreteCollisionDetectorInterface::Result
{
@@ -90,10 +47,13 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
btScalar m_depth;
bool m_hasResult;
- virtual void setShapeIdentifiers(int partId0,int index0, int partId1,int index1)
+ virtual void setShapeIdentifiersA(int partId0,int index0)
{
(void)partId0;
(void)index0;
+ }
+ virtual void setShapeIdentifiersB(int partId1,int index1)
+ {
(void)partId1;
(void)index1;
}
@@ -107,7 +67,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
};
//just take fixed number of orientation, and sample the penetration depth in that direction
- btScalar minProj = btScalar(1e30);
+ btScalar minProj = btScalar(BT_LARGE_FLOAT);
btVector3 minNorm(btScalar(0.), btScalar(0.), btScalar(0.));
btVector3 minA,minB;
btVector3 seperatingAxisInA,seperatingAxisInB;
@@ -128,7 +88,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
for (i=0;i<numSampleDirections;i++)
{
- const btVector3& norm = sPenetrationDirections[i];
+ btVector3 norm = getPenetrationDirections()[i];
seperatingAxisInABatch[i] = (-norm) * transA.getBasis() ;
seperatingAxisInBBatch[i] = norm * transB.getBasis() ;
}
@@ -142,7 +102,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
btVector3 norm;
convexA->getPreferredPenetrationDirection(i,norm);
norm = transA.getBasis() * norm;
- sPenetrationDirections[numSampleDirections] = norm;
+ getPenetrationDirections()[numSampleDirections] = norm;
seperatingAxisInABatch[numSampleDirections] = (-norm) * transA.getBasis();
seperatingAxisInBBatch[numSampleDirections] = norm * transB.getBasis();
numSampleDirections++;
@@ -159,7 +119,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
btVector3 norm;
convexB->getPreferredPenetrationDirection(i,norm);
norm = transB.getBasis() * norm;
- sPenetrationDirections[numSampleDirections] = norm;
+ getPenetrationDirections()[numSampleDirections] = norm;
seperatingAxisInABatch[numSampleDirections] = (-norm) * transA.getBasis();
seperatingAxisInBBatch[numSampleDirections] = norm * transB.getBasis();
numSampleDirections++;
@@ -169,29 +129,44 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
+
convexA->batchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInABatch,supportVerticesABatch,numSampleDirections);
convexB->batchedUnitVectorGetSupportingVertexWithoutMargin(seperatingAxisInBBatch,supportVerticesBBatch,numSampleDirections);
for (i=0;i<numSampleDirections;i++)
{
- const btVector3& norm = sPenetrationDirections[i];
- seperatingAxisInA = seperatingAxisInABatch[i];
- seperatingAxisInB = seperatingAxisInBBatch[i];
+ btVector3 norm = getPenetrationDirections()[i];
+ if (check2d)
+ {
+ norm[2] = 0.f;
+ }
+ if (norm.length2()>0.01)
+ {
- pInA = supportVerticesABatch[i];
- qInB = supportVerticesBBatch[i];
+ seperatingAxisInA = seperatingAxisInABatch[i];
+ seperatingAxisInB = seperatingAxisInBBatch[i];
- pWorld = transA(pInA);
- qWorld = transB(qInB);
- w = qWorld - pWorld;
- btScalar delta = norm.dot(w);
- //find smallest delta
- if (delta < minProj)
- {
- minProj = delta;
- minNorm = norm;
- minA = pWorld;
- minB = qWorld;
+ pInA = supportVerticesABatch[i];
+ qInB = supportVerticesBBatch[i];
+
+ pWorld = transA(pInA);
+ qWorld = transB(qInB);
+ if (check2d)
+ {
+ pWorld[2] = 0.f;
+ qWorld[2] = 0.f;
+ }
+
+ w = qWorld - pWorld;
+ btScalar delta = norm.dot(w);
+ //find smallest delta
+ if (delta < minProj)
+ {
+ minProj = delta;
+ minNorm = norm;
+ minA = pWorld;
+ minB = qWorld;
+ }
}
}
#else
@@ -208,7 +183,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
btVector3 norm;
convexA->getPreferredPenetrationDirection(i,norm);
norm = transA.getBasis() * norm;
- sPenetrationDirections[numSampleDirections] = norm;
+ getPenetrationDirections()[numSampleDirections] = norm;
numSampleDirections++;
}
}
@@ -223,7 +198,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
btVector3 norm;
convexB->getPreferredPenetrationDirection(i,norm);
norm = transB.getBasis() * norm;
- sPenetrationDirections[numSampleDirections] = norm;
+ getPenetrationDirections()[numSampleDirections] = norm;
numSampleDirections++;
}
}
@@ -232,7 +207,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
for (int i=0;i<numSampleDirections;i++)
{
- const btVector3& norm = sPenetrationDirections[i];
+ const btVector3& norm = getPenetrationDirections()[i];
seperatingAxisInA = (-norm)* transA.getBasis();
seperatingAxisInB = norm* transB.getBasis();
pInA = convexA->localGetSupportVertexWithoutMarginNonVirtual(seperatingAxisInA);
@@ -260,7 +235,8 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
if (minProj < btScalar(0.))
return false;
- minProj += (convexA->getMarginNonVirtual() + convexB->getMarginNonVirtual());
+ btScalar extraSeparation = 0.5f;///scale dependent
+ minProj += extraSeparation+(convexA->getMarginNonVirtual() + convexB->getMarginNonVirtual());
@@ -298,9 +274,10 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
input.m_transformA = displacedTrans;
input.m_transformB = transB;
- input.m_maximumDistanceSquared = btScalar(1e30);//minProj;
+ input.m_maximumDistanceSquared = btScalar(BT_LARGE_FLOAT);//minProj;
btIntermediateResult res;
+ gjkdet.setCachedSeperatingAxis(-minNorm);
gjkdet.getClosestPoints(input,res,debugDraw);
btScalar correctedMinNorm = minProj - res.m_depth;
@@ -309,12 +286,14 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
//the penetration depth is over-estimated, relax it
btScalar penetration_relaxation= btScalar(1.);
minNorm*=penetration_relaxation;
+
if (res.m_hasResult)
{
pa = res.m_pointInWorld - minNorm * correctedMinNorm;
pb = res.m_pointInWorld;
+ v = minNorm;
#ifdef DEBUG_DRAW
if (debugDraw)
@@ -329,5 +308,55 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
return res.m_hasResult;
}
+btVector3* btMinkowskiPenetrationDepthSolver::getPenetrationDirections()
+{
+ static btVector3 sPenetrationDirections[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
+ {
+ btVector3(btScalar(0.000000) , btScalar(-0.000000),btScalar(-1.000000)),
+ btVector3(btScalar(0.723608) , btScalar(-0.525725),btScalar(-0.447219)),
+ btVector3(btScalar(-0.276388) , btScalar(-0.850649),btScalar(-0.447219)),
+ btVector3(btScalar(-0.894426) , btScalar(-0.000000),btScalar(-0.447216)),
+ btVector3(btScalar(-0.276388) , btScalar(0.850649),btScalar(-0.447220)),
+ btVector3(btScalar(0.723608) , btScalar(0.525725),btScalar(-0.447219)),
+ btVector3(btScalar(0.276388) , btScalar(-0.850649),btScalar(0.447220)),
+ btVector3(btScalar(-0.723608) , btScalar(-0.525725),btScalar(0.447219)),
+ btVector3(btScalar(-0.723608) , btScalar(0.525725),btScalar(0.447219)),
+ btVector3(btScalar(0.276388) , btScalar(0.850649),btScalar(0.447219)),
+ btVector3(btScalar(0.894426) , btScalar(0.000000),btScalar(0.447216)),
+ btVector3(btScalar(-0.000000) , btScalar(0.000000),btScalar(1.000000)),
+ btVector3(btScalar(0.425323) , btScalar(-0.309011),btScalar(-0.850654)),
+ btVector3(btScalar(-0.162456) , btScalar(-0.499995),btScalar(-0.850654)),
+ btVector3(btScalar(0.262869) , btScalar(-0.809012),btScalar(-0.525738)),
+ btVector3(btScalar(0.425323) , btScalar(0.309011),btScalar(-0.850654)),
+ btVector3(btScalar(0.850648) , btScalar(-0.000000),btScalar(-0.525736)),
+ btVector3(btScalar(-0.525730) , btScalar(-0.000000),btScalar(-0.850652)),
+ btVector3(btScalar(-0.688190) , btScalar(-0.499997),btScalar(-0.525736)),
+ btVector3(btScalar(-0.162456) , btScalar(0.499995),btScalar(-0.850654)),
+ btVector3(btScalar(-0.688190) , btScalar(0.499997),btScalar(-0.525736)),
+ btVector3(btScalar(0.262869) , btScalar(0.809012),btScalar(-0.525738)),
+ btVector3(btScalar(0.951058) , btScalar(0.309013),btScalar(0.000000)),
+ btVector3(btScalar(0.951058) , btScalar(-0.309013),btScalar(0.000000)),
+ btVector3(btScalar(0.587786) , btScalar(-0.809017),btScalar(0.000000)),
+ btVector3(btScalar(0.000000) , btScalar(-1.000000),btScalar(0.000000)),
+ btVector3(btScalar(-0.587786) , btScalar(-0.809017),btScalar(0.000000)),
+ btVector3(btScalar(-0.951058) , btScalar(-0.309013),btScalar(-0.000000)),
+ btVector3(btScalar(-0.951058) , btScalar(0.309013),btScalar(-0.000000)),
+ btVector3(btScalar(-0.587786) , btScalar(0.809017),btScalar(-0.000000)),
+ btVector3(btScalar(-0.000000) , btScalar(1.000000),btScalar(-0.000000)),
+ btVector3(btScalar(0.587786) , btScalar(0.809017),btScalar(-0.000000)),
+ btVector3(btScalar(0.688190) , btScalar(-0.499997),btScalar(0.525736)),
+ btVector3(btScalar(-0.262869) , btScalar(-0.809012),btScalar(0.525738)),
+ btVector3(btScalar(-0.850648) , btScalar(0.000000),btScalar(0.525736)),
+ btVector3(btScalar(-0.262869) , btScalar(0.809012),btScalar(0.525738)),
+ btVector3(btScalar(0.688190) , btScalar(0.499997),btScalar(0.525736)),
+ btVector3(btScalar(0.525730) , btScalar(0.000000),btScalar(0.850652)),
+ btVector3(btScalar(0.162456) , btScalar(-0.499995),btScalar(0.850654)),
+ btVector3(btScalar(-0.425323) , btScalar(-0.309011),btScalar(0.850654)),
+ btVector3(btScalar(-0.425323) , btScalar(0.309011),btScalar(0.850654)),
+ btVector3(btScalar(0.162456) , btScalar(0.499995),btScalar(0.850654))
+ };
+
+ return sPenetrationDirections;
+}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h
index e93e4e4bb4e..7b6c8a63779 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h
@@ -22,13 +22,17 @@ subject to the following restrictions:
///Implementation is based on sampling the depth using support mapping, and using GJK step to get the witness points.
class btMinkowskiPenetrationDepthSolver : public btConvexPenetrationDepthSolver
{
+protected:
+
+ static btVector3* getPenetrationDirections();
+
public:
virtual bool calcPenDepth( btSimplexSolverInterface& simplexSolver,
const btConvexShape* convexA,const btConvexShape* convexB,
const btTransform& transA,const btTransform& transB,
btVector3& v, btVector3& pa, btVector3& pb,
- class btIDebugDraw* debugDraw
+ class btIDebugDraw* debugDraw,btStackAlloc* stackAlloc
);
};
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
index eecf927ee10..924a8af87d1 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
@@ -25,7 +25,8 @@ ContactProcessedCallback gContactProcessedCallback = 0;
btPersistentManifold::btPersistentManifold()
-:m_body0(0),
+:btTypedObject(BT_PERSISTENT_MANIFOLD_TYPE),
+m_body0(0),
m_body1(0),
m_cachedPoints (0),
m_index1a(0)
@@ -172,9 +173,6 @@ int btPersistentManifold::addManifoldPoint(const btManifoldPoint& newPoint)
#if MANIFOLD_CACHE_SIZE >= 4
//sort cache so best points come first, based on area
insertIndex = sortCachedPoints(newPoint);
-
- if (insertIndex<0)
- insertIndex=0;
#else
insertIndex = 0;
#endif
@@ -183,7 +181,11 @@ int btPersistentManifold::addManifoldPoint(const btManifoldPoint& newPoint)
} else
{
m_cachedPoints++;
+
+
}
+ if (insertIndex<0)
+ insertIndex=0;
btAssert(m_pointCache[insertIndex].m_userPersistentData==0);
m_pointCache[insertIndex] = newPoint;
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
index 0b3c734d1d7..c8aac637307 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
@@ -30,9 +30,14 @@ extern btScalar gContactBreakingThreshold;
typedef bool (*ContactDestroyedCallback)(void* userPersistentData);
typedef bool (*ContactProcessedCallback)(btManifoldPoint& cp,void* body0,void* body1);
extern ContactDestroyedCallback gContactDestroyedCallback;
+extern ContactProcessedCallback gContactProcessedCallback;
-
-
+//the enum starts at 1024 to avoid type conflicts with btTypedConstraint
+enum btContactManifoldTypes
+{
+ MIN_CONTACT_MANIFOLD_TYPE = 1024,
+ BT_PERSISTENT_MANIFOLD_TYPE
+};
#define MANIFOLD_CACHE_SIZE 4
@@ -43,7 +48,10 @@ extern ContactDestroyedCallback gContactDestroyedCallback;
///reduces the cache to 4 points, when more then 4 points are added, using following rules:
///the contact point with deepest penetration is always kept, and it tries to maximuze the area covered by the points
///note that some pairs of objects might have more then one contact manifold.
-ATTRIBUTE_ALIGNED16( class) btPersistentManifold
+
+
+ATTRIBUTE_ALIGNED128( class) btPersistentManifold : public btTypedObject
+//ATTRIBUTE_ALIGNED16( class) btPersistentManifold : public btTypedObject
{
btManifoldPoint m_pointCache[MANIFOLD_CACHE_SIZE];
@@ -52,6 +60,7 @@ ATTRIBUTE_ALIGNED16( class) btPersistentManifold
/// void* will allow any rigidbody class
void* m_body0;
void* m_body1;
+
int m_cachedPoints;
btScalar m_contactBreakingThreshold;
@@ -67,16 +76,19 @@ public:
BT_DECLARE_ALIGNED_ALLOCATOR();
+ int m_companionIdA;
+ int m_companionIdB;
+
int m_index1a;
btPersistentManifold();
btPersistentManifold(void* body0,void* body1,int , btScalar contactBreakingThreshold,btScalar contactProcessingThreshold)
- : m_body0(body0),m_body1(body1),m_cachedPoints(0),
+ : btTypedObject(BT_PERSISTENT_MANIFOLD_TYPE),
+ m_body0(body0),m_body1(body1),m_cachedPoints(0),
m_contactBreakingThreshold(contactBreakingThreshold),
m_contactProcessingThreshold(contactProcessingThreshold)
{
-
}
SIMD_FORCE_INLINE void* getBody0() { return m_body0;}
@@ -134,6 +146,10 @@ public:
m_pointCache[index] = m_pointCache[lastUsedIndex];
//get rid of duplicated userPersistentData pointer
m_pointCache[lastUsedIndex].m_userPersistentData = 0;
+ m_pointCache[lastUsedIndex].mConstraintRow[0].m_accumImpulse = 0.f;
+ m_pointCache[lastUsedIndex].mConstraintRow[1].m_accumImpulse = 0.f;
+ m_pointCache[lastUsedIndex].mConstraintRow[2].m_accumImpulse = 0.f;
+
m_pointCache[lastUsedIndex].m_appliedImpulse = 0.f;
m_pointCache[lastUsedIndex].m_lateralFrictionInitialized = false;
m_pointCache[lastUsedIndex].m_appliedImpulseLateral1 = 0.f;
@@ -151,10 +167,13 @@ public:
#define MAINTAIN_PERSISTENCY 1
#ifdef MAINTAIN_PERSISTENCY
int lifeTime = m_pointCache[insertIndex].getLifeTime();
- btScalar appliedImpulse = m_pointCache[insertIndex].m_appliedImpulse;
- btScalar appliedLateralImpulse1 = m_pointCache[insertIndex].m_appliedImpulseLateral1;
- btScalar appliedLateralImpulse2 = m_pointCache[insertIndex].m_appliedImpulseLateral2;
-
+ btScalar appliedImpulse = m_pointCache[insertIndex].mConstraintRow[0].m_accumImpulse;
+ btScalar appliedLateralImpulse1 = m_pointCache[insertIndex].mConstraintRow[1].m_accumImpulse;
+ btScalar appliedLateralImpulse2 = m_pointCache[insertIndex].mConstraintRow[2].m_accumImpulse;
+// bool isLateralFrictionInitialized = m_pointCache[insertIndex].m_lateralFrictionInitialized;
+
+
+
btAssert(lifeTime>=0);
void* cache = m_pointCache[insertIndex].m_userPersistentData;
@@ -165,6 +184,11 @@ public:
m_pointCache[insertIndex].m_appliedImpulseLateral1 = appliedLateralImpulse1;
m_pointCache[insertIndex].m_appliedImpulseLateral2 = appliedLateralImpulse2;
+ m_pointCache[insertIndex].mConstraintRow[0].m_accumImpulse = appliedImpulse;
+ m_pointCache[insertIndex].mConstraintRow[1].m_accumImpulse = appliedLateralImpulse1;
+ m_pointCache[insertIndex].mConstraintRow[2].m_accumImpulse = appliedLateralImpulse2;
+
+
m_pointCache[insertIndex].m_lifeTime = lifeTime;
#else
clearUserCache(m_pointCache[insertIndex]);
@@ -175,7 +199,12 @@ public:
bool validContactDistance(const btManifoldPoint& pt) const
{
- return pt.m_distance1 <= getContactBreakingThreshold();
+ if (pt.m_lifeTime >1)
+ {
+ return pt.m_distance1 <= getContactBreakingThreshold();
+ }
+ return pt.m_distance1 <= getContactProcessingThreshold();
+
}
/// calculated new worldspace coordinates and depth, and reject points that exceed the collision margin
void refreshContactPoints( const btTransform& trA,const btTransform& trB);
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h
index 6262f44b9f1..6ca60548e71 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h
@@ -31,17 +31,20 @@ struct btPointCollector : public btDiscreteCollisionDetectorInterface::Result
bool m_hasResult;
btPointCollector ()
- : m_distance(btScalar(1e30)),m_hasResult(false)
+ : m_distance(btScalar(BT_LARGE_FLOAT)),m_hasResult(false)
{
}
- virtual void setShapeIdentifiers(int partId0,int index0, int partId1,int index1)
+ virtual void setShapeIdentifiersA(int partId0,int index0)
{
(void)partId0;
(void)index0;
+
+ }
+ virtual void setShapeIdentifiersB(int partId1,int index1)
+ {
(void)partId1;
(void)index1;
- //??
}
virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
index cdb1d22444d..fbe579ce1e5 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
@@ -124,8 +124,9 @@ btTriangleConvexcastCallback::btTriangleConvexcastCallback (const btConvexShape*
m_convexShapeFrom = convexShapeFrom;
m_convexShapeTo = convexShapeTo;
m_triangleToWorld = triangleToWorld;
- m_hitFraction = 1.0;
- m_triangleCollisionMargin = triangleCollisionMargin;
+ m_hitFraction = 1.0f;
+ m_triangleCollisionMargin = triangleCollisionMargin;
+ m_allowedPenetration = 0.f;
}
void
@@ -148,6 +149,7 @@ btTriangleConvexcastCallback::processTriangle (btVector3* triangle, int partId,
btConvexCast::CastResult castResult;
castResult.m_fraction = btScalar(1.);
+ castResult.m_allowedPenetration = m_allowedPenetration;
if (convexCaster.calcTimeOfImpact(m_convexShapeFrom,m_convexShapeTo,m_triangleToWorld, m_triangleToWorld, castResult))
{
//add hit
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
index 3a1ab388c13..bdd1add36d2 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
@@ -58,7 +58,8 @@ public:
btTransform m_convexShapeTo;
btTransform m_triangleToWorld;
btScalar m_hitFraction;
- btScalar m_triangleCollisionMargin;
+ btScalar m_triangleCollisionMargin;
+ btScalar m_allowedPenetration;
btTriangleConvexcastCallback (const btConvexShape* convexShape, const btTransform& convexShapeFrom, const btTransform& convexShapeTo, const btTransform& triangleToWorld, const btScalar triangleCollisionMargin);
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
index 4c709a8c3a9..18eb662de2f 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
@@ -114,7 +114,10 @@ bool btSubsimplexConvexCast::calcTimeOfImpact(
hasResult = true;
}
}
- m_simplexSolver->addVertex( w, supVertexA , supVertexB);
+ ///Just like regular GJK only add the vertex if it isn't already (close) to current vertex, it would lead to divisions by zero and NaN etc.
+ if (!m_simplexSolver->inSimplex(w))
+ m_simplexSolver->addVertex( w, supVertexA , supVertexB);
+
if (m_simplexSolver->closest(v))
{
dist2 = v.length2();
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
index a7ffeda8c62..a775198ab29 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
@@ -68,7 +68,7 @@ void btVoronoiSimplexSolver::reset()
m_cachedValidClosest = false;
m_numVertices = 0;
m_needsUpdate = true;
- m_lastW = btVector3(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ m_lastW = btVector3(btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT),btScalar(BT_LARGE_FLOAT));
m_cachedBC.reset();
}
@@ -289,7 +289,11 @@ bool btVoronoiSimplexSolver::inSimplex(const btVector3& w)
//w is in the current (reduced) simplex
for (i=0;i<numverts;i++)
{
+#ifdef BT_USE_EQUAL_VERTEX_THRESHOLD
+ if ( m_simplexVectorW[i].distance2(w) <= m_equalVertexThreshold)
+#else
if (m_simplexVectorW[i] == w)
+#endif
found = true;
}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
index d3162d9fbeb..9a4f552924c 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
@@ -24,6 +24,11 @@ subject to the following restrictions:
#define VORONOI_SIMPLEX_MAX_VERTS 5
+///disable next define, or use defaultCollisionConfiguration->getSimplexSolver()->setEqualVertexThreshold(0.f) to disable/configure
+#define BT_USE_EQUAL_VERTEX_THRESHOLD
+#define VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD 0.0001f
+
+
struct btUsageBitfield{
btUsageBitfield()
{
@@ -106,8 +111,11 @@ public:
btVector3 m_cachedP2;
btVector3 m_cachedV;
btVector3 m_lastW;
+
+ btScalar m_equalVertexThreshold;
bool m_cachedValidClosest;
+
btSubSimplexClosestResult m_cachedBC;
bool m_needsUpdate;
@@ -122,10 +130,23 @@ public:
public:
+ btVoronoiSimplexSolver()
+ : m_equalVertexThreshold(VORONOI_DEFAULT_EQUAL_VERTEX_THRESHOLD)
+ {
+ }
void reset();
void addVertex(const btVector3& w, const btVector3& p, const btVector3& q);
+ void setEqualVertexThreshold(btScalar threshold)
+ {
+ m_equalVertexThreshold = threshold;
+ }
+
+ btScalar getEqualVertexThreshold() const
+ {
+ return m_equalVertexThreshold;
+ }
bool closest(btVector3& v);
diff --git a/extern/bullet2/src/BulletDynamics/Character/btCharacterControllerInterface.h b/extern/bullet2/src/BulletDynamics/Character/btCharacterControllerInterface.h
new file mode 100644
index 00000000000..19373daa241
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/Character/btCharacterControllerInterface.h
@@ -0,0 +1,45 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2008 Erwin Coumans http://bulletphysics.com
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef CHARACTER_CONTROLLER_INTERFACE_H
+#define CHARACTER_CONTROLLER_INTERFACE_H
+
+#include "LinearMath/btVector3.h"
+#include "BulletDynamics/Dynamics/btActionInterface.h"
+
+class btCollisionShape;
+class btRigidBody;
+class btCollisionWorld;
+
+class btCharacterControllerInterface : public btActionInterface
+{
+public:
+ btCharacterControllerInterface () {};
+ virtual ~btCharacterControllerInterface () {};
+
+ virtual void setWalkDirection(const btVector3& walkDirection) = 0;
+ virtual void setVelocityForTimeInterval(const btVector3& velocity, btScalar timeInterval) = 0;
+ virtual void reset () = 0;
+ virtual void warp (const btVector3& origin) = 0;
+
+ virtual void preStep ( btCollisionWorld* collisionWorld) = 0;
+ virtual void playerStep (btCollisionWorld* collisionWorld, btScalar dt) = 0;
+ virtual bool canJump () const = 0;
+ virtual void jump () = 0;
+
+ virtual bool onGround () const = 0;
+};
+
+#endif
diff --git a/extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp b/extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp
new file mode 100644
index 00000000000..9732553130d
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.cpp
@@ -0,0 +1,641 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2008 Erwin Coumans http://bulletphysics.com
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+
+#include "LinearMath/btIDebugDraw.h"
+#include "BulletCollision/CollisionDispatch/btGhostObject.h"
+#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
+#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h"
+#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
+#include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
+#include "LinearMath/btDefaultMotionState.h"
+#include "btKinematicCharacterController.h"
+
+
+// static helper method
+static btVector3
+getNormalizedVector(const btVector3& v)
+{
+ btVector3 n = v.normalized();
+ if (n.length() < SIMD_EPSILON) {
+ n.setValue(0, 0, 0);
+ }
+ return n;
+}
+
+
+///@todo Interact with dynamic objects,
+///Ride kinematicly animated platforms properly
+///More realistic (or maybe just a config option) falling
+/// -> Should integrate falling velocity manually and use that in stepDown()
+///Support jumping
+///Support ducking
+class btKinematicClosestNotMeRayResultCallback : public btCollisionWorld::ClosestRayResultCallback
+{
+public:
+ btKinematicClosestNotMeRayResultCallback (btCollisionObject* me) : btCollisionWorld::ClosestRayResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0))
+ {
+ m_me = me;
+ }
+
+ virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult,bool normalInWorldSpace)
+ {
+ if (rayResult.m_collisionObject == m_me)
+ return 1.0;
+
+ return ClosestRayResultCallback::addSingleResult (rayResult, normalInWorldSpace);
+ }
+protected:
+ btCollisionObject* m_me;
+};
+
+class btKinematicClosestNotMeConvexResultCallback : public btCollisionWorld::ClosestConvexResultCallback
+{
+public:
+ btKinematicClosestNotMeConvexResultCallback (btCollisionObject* me, const btVector3& up, btScalar minSlopeDot)
+ : btCollisionWorld::ClosestConvexResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0))
+ , m_me(me)
+ , m_up(up)
+ , m_minSlopeDot(minSlopeDot)
+ {
+ }
+
+ virtual btScalar addSingleResult(btCollisionWorld::LocalConvexResult& convexResult,bool normalInWorldSpace)
+ {
+ if (convexResult.m_hitCollisionObject == m_me)
+ return btScalar(1.0);
+
+ btVector3 hitNormalWorld;
+ if (normalInWorldSpace)
+ {
+ hitNormalWorld = convexResult.m_hitNormalLocal;
+ } else
+ {
+ ///need to transform normal into worldspace
+ hitNormalWorld = m_hitCollisionObject->getWorldTransform().getBasis()*convexResult.m_hitNormalLocal;
+ }
+
+ btScalar dotUp = m_up.dot(hitNormalWorld);
+ if (dotUp < m_minSlopeDot) {
+ return btScalar(1.0);
+ }
+
+ return ClosestConvexResultCallback::addSingleResult (convexResult, normalInWorldSpace);
+ }
+protected:
+ btCollisionObject* m_me;
+ const btVector3 m_up;
+ btScalar m_minSlopeDot;
+};
+
+/*
+ * Returns the reflection direction of a ray going 'direction' hitting a surface with normal 'normal'
+ *
+ * from: http://www-cs-students.stanford.edu/~adityagp/final/node3.html
+ */
+btVector3 btKinematicCharacterController::computeReflectionDirection (const btVector3& direction, const btVector3& normal)
+{
+ return direction - (btScalar(2.0) * direction.dot(normal)) * normal;
+}
+
+/*
+ * Returns the portion of 'direction' that is parallel to 'normal'
+ */
+btVector3 btKinematicCharacterController::parallelComponent (const btVector3& direction, const btVector3& normal)
+{
+ btScalar magnitude = direction.dot(normal);
+ return normal * magnitude;
+}
+
+/*
+ * Returns the portion of 'direction' that is perpindicular to 'normal'
+ */
+btVector3 btKinematicCharacterController::perpindicularComponent (const btVector3& direction, const btVector3& normal)
+{
+ return direction - parallelComponent(direction, normal);
+}
+
+btKinematicCharacterController::btKinematicCharacterController (btPairCachingGhostObject* ghostObject,btConvexShape* convexShape,btScalar stepHeight, int upAxis)
+{
+ m_upAxis = upAxis;
+ m_addedMargin = 0.02;
+ m_walkDirection.setValue(0,0,0);
+ m_useGhostObjectSweepTest = true;
+ m_ghostObject = ghostObject;
+ m_stepHeight = stepHeight;
+ m_turnAngle = btScalar(0.0);
+ m_convexShape=convexShape;
+ m_useWalkDirection = true; // use walk direction by default, legacy behavior
+ m_velocityTimeInterval = 0.0;
+ m_verticalVelocity = 0.0;
+ m_verticalOffset = 0.0;
+ m_gravity = 9.8 * 3 ; // 3G acceleration.
+ m_fallSpeed = 55.0; // Terminal velocity of a sky diver in m/s.
+ m_jumpSpeed = 10.0; // ?
+ m_wasOnGround = false;
+ m_wasJumping = false;
+ setMaxSlope(btRadians(45.0));
+}
+
+btKinematicCharacterController::~btKinematicCharacterController ()
+{
+}
+
+btPairCachingGhostObject* btKinematicCharacterController::getGhostObject()
+{
+ return m_ghostObject;
+}
+
+bool btKinematicCharacterController::recoverFromPenetration ( btCollisionWorld* collisionWorld)
+{
+
+ bool penetration = false;
+
+ collisionWorld->getDispatcher()->dispatchAllCollisionPairs(m_ghostObject->getOverlappingPairCache(), collisionWorld->getDispatchInfo(), collisionWorld->getDispatcher());
+
+ m_currentPosition = m_ghostObject->getWorldTransform().getOrigin();
+
+ btScalar maxPen = btScalar(0.0);
+ for (int i = 0; i < m_ghostObject->getOverlappingPairCache()->getNumOverlappingPairs(); i++)
+ {
+ m_manifoldArray.resize(0);
+
+ btBroadphasePair* collisionPair = &m_ghostObject->getOverlappingPairCache()->getOverlappingPairArray()[i];
+
+ if (collisionPair->m_algorithm)
+ collisionPair->m_algorithm->getAllContactManifolds(m_manifoldArray);
+
+
+ for (int j=0;j<m_manifoldArray.size();j++)
+ {
+ btPersistentManifold* manifold = m_manifoldArray[j];
+ btScalar directionSign = manifold->getBody0() == m_ghostObject ? btScalar(-1.0) : btScalar(1.0);
+ for (int p=0;p<manifold->getNumContacts();p++)
+ {
+ const btManifoldPoint&pt = manifold->getContactPoint(p);
+
+ btScalar dist = pt.getDistance();
+
+ if (dist < 0.0)
+ {
+ if (dist < maxPen)
+ {
+ maxPen = dist;
+ m_touchingNormal = pt.m_normalWorldOnB * directionSign;//??
+
+ }
+ m_currentPosition += pt.m_normalWorldOnB * directionSign * dist * btScalar(0.2);
+ penetration = true;
+ } else {
+ //printf("touching %f\n", dist);
+ }
+ }
+
+ //manifold->clearManifold();
+ }
+ }
+ btTransform newTrans = m_ghostObject->getWorldTransform();
+ newTrans.setOrigin(m_currentPosition);
+ m_ghostObject->setWorldTransform(newTrans);
+// printf("m_touchingNormal = %f,%f,%f\n",m_touchingNormal[0],m_touchingNormal[1],m_touchingNormal[2]);
+ return penetration;
+}
+
+void btKinematicCharacterController::stepUp ( btCollisionWorld* world)
+{
+ // phase 1: up
+ btTransform start, end;
+ m_targetPosition = m_currentPosition + getUpAxisDirections()[m_upAxis] * (m_stepHeight + (m_verticalOffset > 0.f?m_verticalOffset:0.f));
+
+ start.setIdentity ();
+ end.setIdentity ();
+
+ /* FIXME: Handle penetration properly */
+ start.setOrigin (m_currentPosition + getUpAxisDirections()[m_upAxis] * (m_convexShape->getMargin() + m_addedMargin));
+ end.setOrigin (m_targetPosition);
+
+ btKinematicClosestNotMeConvexResultCallback callback (m_ghostObject, -getUpAxisDirections()[m_upAxis], btScalar(0.7071));
+ callback.m_collisionFilterGroup = getGhostObject()->getBroadphaseHandle()->m_collisionFilterGroup;
+ callback.m_collisionFilterMask = getGhostObject()->getBroadphaseHandle()->m_collisionFilterMask;
+
+ if (m_useGhostObjectSweepTest)
+ {
+ m_ghostObject->convexSweepTest (m_convexShape, start, end, callback, world->getDispatchInfo().m_allowedCcdPenetration);
+ }
+ else
+ {
+ world->convexSweepTest (m_convexShape, start, end, callback);
+ }
+
+ if (callback.hasHit())
+ {
+ // Only modify the position if the hit was a slope and not a wall or ceiling.
+ if(callback.m_hitNormalWorld.dot(getUpAxisDirections()[m_upAxis]) > 0.0)
+ {
+ // we moved up only a fraction of the step height
+ m_currentStepOffset = m_stepHeight * callback.m_closestHitFraction;
+ m_currentPosition.setInterpolate3 (m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
+ }
+ m_verticalVelocity = 0.0;
+ m_verticalOffset = 0.0;
+ } else {
+ m_currentStepOffset = m_stepHeight;
+ m_currentPosition = m_targetPosition;
+ }
+}
+
+void btKinematicCharacterController::updateTargetPositionBasedOnCollision (const btVector3& hitNormal, btScalar tangentMag, btScalar normalMag)
+{
+ btVector3 movementDirection = m_targetPosition - m_currentPosition;
+ btScalar movementLength = movementDirection.length();
+ if (movementLength>SIMD_EPSILON)
+ {
+ movementDirection.normalize();
+
+ btVector3 reflectDir = computeReflectionDirection (movementDirection, hitNormal);
+ reflectDir.normalize();
+
+ btVector3 parallelDir, perpindicularDir;
+
+ parallelDir = parallelComponent (reflectDir, hitNormal);
+ perpindicularDir = perpindicularComponent (reflectDir, hitNormal);
+
+ m_targetPosition = m_currentPosition;
+ if (0)//tangentMag != 0.0)
+ {
+ btVector3 parComponent = parallelDir * btScalar (tangentMag*movementLength);
+// printf("parComponent=%f,%f,%f\n",parComponent[0],parComponent[1],parComponent[2]);
+ m_targetPosition += parComponent;
+ }
+
+ if (normalMag != 0.0)
+ {
+ btVector3 perpComponent = perpindicularDir * btScalar (normalMag*movementLength);
+// printf("perpComponent=%f,%f,%f\n",perpComponent[0],perpComponent[1],perpComponent[2]);
+ m_targetPosition += perpComponent;
+ }
+ } else
+ {
+// printf("movementLength don't normalize a zero vector\n");
+ }
+}
+
+void btKinematicCharacterController::stepForwardAndStrafe ( btCollisionWorld* collisionWorld, const btVector3& walkMove)
+{
+ // printf("m_normalizedDirection=%f,%f,%f\n",
+ // m_normalizedDirection[0],m_normalizedDirection[1],m_normalizedDirection[2]);
+ // phase 2: forward and strafe
+ btTransform start, end;
+ m_targetPosition = m_currentPosition + walkMove;
+
+ start.setIdentity ();
+ end.setIdentity ();
+
+ btScalar fraction = 1.0;
+ btScalar distance2 = (m_currentPosition-m_targetPosition).length2();
+// printf("distance2=%f\n",distance2);
+
+ if (m_touchingContact)
+ {
+ if (m_normalizedDirection.dot(m_touchingNormal) > btScalar(0.0))
+ {
+ updateTargetPositionBasedOnCollision (m_touchingNormal);
+ }
+ }
+
+ int maxIter = 10;
+
+ while (fraction > btScalar(0.01) && maxIter-- > 0)
+ {
+ start.setOrigin (m_currentPosition);
+ end.setOrigin (m_targetPosition);
+ btVector3 sweepDirNegative(m_currentPosition - m_targetPosition);
+
+ btKinematicClosestNotMeConvexResultCallback callback (m_ghostObject, sweepDirNegative, btScalar(0.0));
+ callback.m_collisionFilterGroup = getGhostObject()->getBroadphaseHandle()->m_collisionFilterGroup;
+ callback.m_collisionFilterMask = getGhostObject()->getBroadphaseHandle()->m_collisionFilterMask;
+
+
+ btScalar margin = m_convexShape->getMargin();
+ m_convexShape->setMargin(margin + m_addedMargin);
+
+
+ if (m_useGhostObjectSweepTest)
+ {
+ m_ghostObject->convexSweepTest (m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
+ } else
+ {
+ collisionWorld->convexSweepTest (m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
+ }
+
+ m_convexShape->setMargin(margin);
+
+
+ fraction -= callback.m_closestHitFraction;
+
+ if (callback.hasHit())
+ {
+ // we moved only a fraction
+ btScalar hitDistance;
+ hitDistance = (callback.m_hitPointWorld - m_currentPosition).length();
+
+// m_currentPosition.setInterpolate3 (m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
+
+ updateTargetPositionBasedOnCollision (callback.m_hitNormalWorld);
+ btVector3 currentDir = m_targetPosition - m_currentPosition;
+ distance2 = currentDir.length2();
+ if (distance2 > SIMD_EPSILON)
+ {
+ currentDir.normalize();
+ /* See Quake2: "If velocity is against original velocity, stop ead to avoid tiny oscilations in sloping corners." */
+ if (currentDir.dot(m_normalizedDirection) <= btScalar(0.0))
+ {
+ break;
+ }
+ } else
+ {
+// printf("currentDir: don't normalize a zero vector\n");
+ break;
+ }
+
+ } else {
+ // we moved whole way
+ m_currentPosition = m_targetPosition;
+ }
+
+ // if (callback.m_closestHitFraction == 0.f)
+ // break;
+
+ }
+}
+
+void btKinematicCharacterController::stepDown ( btCollisionWorld* collisionWorld, btScalar dt)
+{
+ btTransform start, end;
+
+ // phase 3: down
+ /*btScalar additionalDownStep = (m_wasOnGround && !onGround()) ? m_stepHeight : 0.0;
+ btVector3 step_drop = getUpAxisDirections()[m_upAxis] * (m_currentStepOffset + additionalDownStep);
+ btScalar downVelocity = (additionalDownStep == 0.0 && m_verticalVelocity<0.0?-m_verticalVelocity:0.0) * dt;
+ btVector3 gravity_drop = getUpAxisDirections()[m_upAxis] * downVelocity;
+ m_targetPosition -= (step_drop + gravity_drop);*/
+
+ btScalar downVelocity = (m_verticalVelocity<0.f?-m_verticalVelocity:0.f) * dt;
+ if(downVelocity > 0.0 && downVelocity < m_stepHeight
+ && (m_wasOnGround || !m_wasJumping))
+ {
+ downVelocity = m_stepHeight;
+ }
+
+ btVector3 step_drop = getUpAxisDirections()[m_upAxis] * (m_currentStepOffset + downVelocity);
+ m_targetPosition -= step_drop;
+
+ start.setIdentity ();
+ end.setIdentity ();
+
+ start.setOrigin (m_currentPosition);
+ end.setOrigin (m_targetPosition);
+
+ btKinematicClosestNotMeConvexResultCallback callback (m_ghostObject, getUpAxisDirections()[m_upAxis], m_maxSlopeCosine);
+ callback.m_collisionFilterGroup = getGhostObject()->getBroadphaseHandle()->m_collisionFilterGroup;
+ callback.m_collisionFilterMask = getGhostObject()->getBroadphaseHandle()->m_collisionFilterMask;
+
+ if (m_useGhostObjectSweepTest)
+ {
+ m_ghostObject->convexSweepTest (m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
+ } else
+ {
+ collisionWorld->convexSweepTest (m_convexShape, start, end, callback, collisionWorld->getDispatchInfo().m_allowedCcdPenetration);
+ }
+
+ if (callback.hasHit())
+ {
+ // we dropped a fraction of the height -> hit floor
+ m_currentPosition.setInterpolate3 (m_currentPosition, m_targetPosition, callback.m_closestHitFraction);
+ m_verticalVelocity = 0.0;
+ m_verticalOffset = 0.0;
+ m_wasJumping = false;
+ } else {
+ // we dropped the full height
+
+ m_currentPosition = m_targetPosition;
+ }
+}
+
+
+
+void btKinematicCharacterController::setWalkDirection
+(
+const btVector3& walkDirection
+)
+{
+ m_useWalkDirection = true;
+ m_walkDirection = walkDirection;
+ m_normalizedDirection = getNormalizedVector(m_walkDirection);
+}
+
+
+
+void btKinematicCharacterController::setVelocityForTimeInterval
+(
+const btVector3& velocity,
+btScalar timeInterval
+)
+{
+// printf("setVelocity!\n");
+// printf(" interval: %f\n", timeInterval);
+// printf(" velocity: (%f, %f, %f)\n",
+// velocity.x(), velocity.y(), velocity.z());
+
+ m_useWalkDirection = false;
+ m_walkDirection = velocity;
+ m_normalizedDirection = getNormalizedVector(m_walkDirection);
+ m_velocityTimeInterval = timeInterval;
+}
+
+
+
+void btKinematicCharacterController::reset ()
+{
+}
+
+void btKinematicCharacterController::warp (const btVector3& origin)
+{
+ btTransform xform;
+ xform.setIdentity();
+ xform.setOrigin (origin);
+ m_ghostObject->setWorldTransform (xform);
+}
+
+
+void btKinematicCharacterController::preStep ( btCollisionWorld* collisionWorld)
+{
+
+ int numPenetrationLoops = 0;
+ m_touchingContact = false;
+ while (recoverFromPenetration (collisionWorld))
+ {
+ numPenetrationLoops++;
+ m_touchingContact = true;
+ if (numPenetrationLoops > 4)
+ {
+ //printf("character could not recover from penetration = %d\n", numPenetrationLoops);
+ break;
+ }
+ }
+
+ m_currentPosition = m_ghostObject->getWorldTransform().getOrigin();
+ m_targetPosition = m_currentPosition;
+// printf("m_targetPosition=%f,%f,%f\n",m_targetPosition[0],m_targetPosition[1],m_targetPosition[2]);
+
+
+}
+
+#include <stdio.h>
+
+void btKinematicCharacterController::playerStep ( btCollisionWorld* collisionWorld, btScalar dt)
+{
+// printf("playerStep(): ");
+// printf(" dt = %f", dt);
+
+ // quick check...
+ if (!m_useWalkDirection && m_velocityTimeInterval <= 0.0) {
+// printf("\n");
+ return; // no motion
+ }
+
+ m_wasOnGround = onGround();
+
+ // Update fall velocity.
+ m_verticalVelocity -= m_gravity * dt;
+ if(m_verticalVelocity > 0.0 && m_verticalVelocity > m_jumpSpeed)
+ {
+ m_verticalVelocity = m_jumpSpeed;
+ }
+ if(m_verticalVelocity < 0.0 && btFabs(m_verticalVelocity) > btFabs(m_fallSpeed))
+ {
+ m_verticalVelocity = -btFabs(m_fallSpeed);
+ }
+ m_verticalOffset = m_verticalVelocity * dt;
+
+
+ btTransform xform;
+ xform = m_ghostObject->getWorldTransform ();
+
+// printf("walkDirection(%f,%f,%f)\n",walkDirection[0],walkDirection[1],walkDirection[2]);
+// printf("walkSpeed=%f\n",walkSpeed);
+
+ stepUp (collisionWorld);
+ if (m_useWalkDirection) {
+ stepForwardAndStrafe (collisionWorld, m_walkDirection);
+ } else {
+ //printf(" time: %f", m_velocityTimeInterval);
+ // still have some time left for moving!
+ btScalar dtMoving =
+ (dt < m_velocityTimeInterval) ? dt : m_velocityTimeInterval;
+ m_velocityTimeInterval -= dt;
+
+ // how far will we move while we are moving?
+ btVector3 move = m_walkDirection * dtMoving;
+
+ //printf(" dtMoving: %f", dtMoving);
+
+ // okay, step
+ stepForwardAndStrafe(collisionWorld, move);
+ }
+ stepDown (collisionWorld, dt);
+
+ // printf("\n");
+
+ xform.setOrigin (m_currentPosition);
+ m_ghostObject->setWorldTransform (xform);
+}
+
+void btKinematicCharacterController::setFallSpeed (btScalar fallSpeed)
+{
+ m_fallSpeed = fallSpeed;
+}
+
+void btKinematicCharacterController::setJumpSpeed (btScalar jumpSpeed)
+{
+ m_jumpSpeed = jumpSpeed;
+}
+
+void btKinematicCharacterController::setMaxJumpHeight (btScalar maxJumpHeight)
+{
+ m_maxJumpHeight = maxJumpHeight;
+}
+
+bool btKinematicCharacterController::canJump () const
+{
+ return onGround();
+}
+
+void btKinematicCharacterController::jump ()
+{
+ if (!canJump())
+ return;
+
+ m_verticalVelocity = m_jumpSpeed;
+ m_wasJumping = true;
+
+#if 0
+ currently no jumping.
+ btTransform xform;
+ m_rigidBody->getMotionState()->getWorldTransform (xform);
+ btVector3 up = xform.getBasis()[1];
+ up.normalize ();
+ btScalar magnitude = (btScalar(1.0)/m_rigidBody->getInvMass()) * btScalar(8.0);
+ m_rigidBody->applyCentralImpulse (up * magnitude);
+#endif
+}
+
+void btKinematicCharacterController::setGravity(btScalar gravity)
+{
+ m_gravity = gravity;
+}
+
+btScalar btKinematicCharacterController::getGravity() const
+{
+ return m_gravity;
+}
+
+void btKinematicCharacterController::setMaxSlope(btScalar slopeRadians)
+{
+ m_maxSlopeRadians = slopeRadians;
+ m_maxSlopeCosine = btCos(slopeRadians);
+}
+
+btScalar btKinematicCharacterController::getMaxSlope() const
+{
+ return m_maxSlopeRadians;
+}
+
+bool btKinematicCharacterController::onGround () const
+{
+ return m_verticalVelocity == 0.0 && m_verticalOffset == 0.0;
+}
+
+
+btVector3* btKinematicCharacterController::getUpAxisDirections()
+{
+ static btVector3 sUpAxisDirection[3] = { btVector3(1.0f, 0.0f, 0.0f), btVector3(0.0f, 1.0f, 0.0f), btVector3(0.0f, 0.0f, 1.0f) };
+
+ return sUpAxisDirection;
+}
+
+void btKinematicCharacterController::debugDraw(btIDebugDraw* debugDrawer)
+{
+}
diff --git a/extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.h b/extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.h
new file mode 100644
index 00000000000..704355c0ae1
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/Character/btKinematicCharacterController.h
@@ -0,0 +1,162 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2008 Erwin Coumans http://bulletphysics.com
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+
+#ifndef KINEMATIC_CHARACTER_CONTROLLER_H
+#define KINEMATIC_CHARACTER_CONTROLLER_H
+
+#include "LinearMath/btVector3.h"
+
+#include "btCharacterControllerInterface.h"
+
+#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
+
+
+class btCollisionShape;
+class btRigidBody;
+class btCollisionWorld;
+class btCollisionDispatcher;
+class btPairCachingGhostObject;
+
+///btKinematicCharacterController is an object that supports a sliding motion in a world.
+///It uses a ghost object and convex sweep test to test for upcoming collisions. This is combined with discrete collision detection to recover from penetrations.
+///Interaction between btKinematicCharacterController and dynamic rigid bodies needs to be explicity implemented by the user.
+class btKinematicCharacterController : public btCharacterControllerInterface
+{
+protected:
+
+ btScalar m_halfHeight;
+
+ btPairCachingGhostObject* m_ghostObject;
+ btConvexShape* m_convexShape;//is also in m_ghostObject, but it needs to be convex, so we store it here to avoid upcast
+
+ btScalar m_verticalVelocity;
+ btScalar m_verticalOffset;
+ btScalar m_fallSpeed;
+ btScalar m_jumpSpeed;
+ btScalar m_maxJumpHeight;
+ btScalar m_maxSlopeRadians; // Slope angle that is set (used for returning the exact value)
+ btScalar m_maxSlopeCosine; // Cosine equivalent of m_maxSlopeRadians (calculated once when set, for optimization)
+ btScalar m_gravity;
+
+ btScalar m_turnAngle;
+
+ btScalar m_stepHeight;
+
+ btScalar m_addedMargin;//@todo: remove this and fix the code
+
+ ///this is the desired walk direction, set by the user
+ btVector3 m_walkDirection;
+ btVector3 m_normalizedDirection;
+
+ //some internal variables
+ btVector3 m_currentPosition;
+ btScalar m_currentStepOffset;
+ btVector3 m_targetPosition;
+
+ ///keep track of the contact manifolds
+ btManifoldArray m_manifoldArray;
+
+ bool m_touchingContact;
+ btVector3 m_touchingNormal;
+
+ bool m_wasOnGround;
+ bool m_wasJumping;
+ bool m_useGhostObjectSweepTest;
+ bool m_useWalkDirection;
+ btScalar m_velocityTimeInterval;
+ int m_upAxis;
+
+ static btVector3* getUpAxisDirections();
+
+ btVector3 computeReflectionDirection (const btVector3& direction, const btVector3& normal);
+ btVector3 parallelComponent (const btVector3& direction, const btVector3& normal);
+ btVector3 perpindicularComponent (const btVector3& direction, const btVector3& normal);
+
+ bool recoverFromPenetration ( btCollisionWorld* collisionWorld);
+ void stepUp (btCollisionWorld* collisionWorld);
+ void updateTargetPositionBasedOnCollision (const btVector3& hit_normal, btScalar tangentMag = btScalar(0.0), btScalar normalMag = btScalar(1.0));
+ void stepForwardAndStrafe (btCollisionWorld* collisionWorld, const btVector3& walkMove);
+ void stepDown (btCollisionWorld* collisionWorld, btScalar dt);
+public:
+ btKinematicCharacterController (btPairCachingGhostObject* ghostObject,btConvexShape* convexShape,btScalar stepHeight, int upAxis = 1);
+ ~btKinematicCharacterController ();
+
+
+ ///btActionInterface interface
+ virtual void updateAction( btCollisionWorld* collisionWorld,btScalar deltaTime)
+ {
+ preStep ( collisionWorld);
+ playerStep (collisionWorld, deltaTime);
+ }
+
+ ///btActionInterface interface
+ void debugDraw(btIDebugDraw* debugDrawer);
+
+ void setUpAxis (int axis)
+ {
+ if (axis < 0)
+ axis = 0;
+ if (axis > 2)
+ axis = 2;
+ m_upAxis = axis;
+ }
+
+ /// This should probably be called setPositionIncrementPerSimulatorStep.
+ /// This is neither a direction nor a velocity, but the amount to
+ /// increment the position each simulation iteration, regardless
+ /// of dt.
+ /// This call will reset any velocity set by setVelocityForTimeInterval().
+ virtual void setWalkDirection(const btVector3& walkDirection);
+
+ /// Caller provides a velocity with which the character should move for
+ /// the given time period. After the time period, velocity is reset
+ /// to zero.
+ /// This call will reset any walk direction set by setWalkDirection().
+ /// Negative time intervals will result in no motion.
+ virtual void setVelocityForTimeInterval(const btVector3& velocity,
+ btScalar timeInterval);
+
+ void reset ();
+ void warp (const btVector3& origin);
+
+ void preStep ( btCollisionWorld* collisionWorld);
+ void playerStep ( btCollisionWorld* collisionWorld, btScalar dt);
+
+ void setFallSpeed (btScalar fallSpeed);
+ void setJumpSpeed (btScalar jumpSpeed);
+ void setMaxJumpHeight (btScalar maxJumpHeight);
+ bool canJump () const;
+
+ void jump ();
+
+ void setGravity(btScalar gravity);
+ btScalar getGravity() const;
+
+ /// The max slope determines the maximum angle that the controller can walk up.
+ /// The slope angle is measured in radians.
+ void setMaxSlope(btScalar slopeRadians);
+ btScalar getMaxSlope() const;
+
+ btPairCachingGhostObject* getGhostObject();
+ void setUseGhostSweepTest(bool useGhostObjectSweepTest)
+ {
+ m_useGhostObjectSweepTest = useGhostObjectSweepTest;
+ }
+
+ bool onGround () const;
+};
+
+#endif // KINEMATIC_CHARACTER_CONTROLLER_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
index 07262b95b73..bc371e4062d 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
@@ -29,14 +29,15 @@ Written by: Marcus Hennix
#define CONETWIST_DEF_FIX_THRESH btScalar(.05f)
-
-btConeTwistConstraint::btConeTwistConstraint()
-:btTypedConstraint(CONETWIST_CONSTRAINT_TYPE),
-m_useSolveConstraintObsolete(CONETWIST_USE_OBSOLETE_SOLVER)
+SIMD_FORCE_INLINE btScalar computeAngularImpulseDenominator(const btVector3& axis, const btMatrix3x3& invInertiaWorld)
{
+ btVector3 vec = axis * invInertiaWorld;
+ return axis.dot(vec);
}
+
+
btConeTwistConstraint::btConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,
const btTransform& rbAFrame,const btTransform& rbBFrame)
:btTypedConstraint(CONETWIST_CONSTRAINT_TYPE, rbA,rbB),m_rbAFrame(rbAFrame),m_rbBFrame(rbBFrame),
@@ -67,11 +68,13 @@ void btConeTwistConstraint::init()
setLimit(btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT), btScalar(BT_LARGE_FLOAT));
m_damping = btScalar(0.01);
m_fixThresh = CONETWIST_DEF_FIX_THRESH;
+ m_flags = 0;
+ m_linCFM = btScalar(0.f);
+ m_linERP = btScalar(0.7f);
+ m_angCFM = btScalar(0.f);
}
-
-
void btConeTwistConstraint::getInfo1 (btConstraintInfo1* info)
{
if (m_useSolveConstraintObsolete)
@@ -83,7 +86,7 @@ void btConeTwistConstraint::getInfo1 (btConstraintInfo1* info)
{
info->m_numConstraintRows = 3;
info->nub = 3;
- calcAngleInfo2();
+ calcAngleInfo2(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(),m_rbA.getInvInertiaTensorWorld(),m_rbB.getInvInertiaTensorWorld());
if(m_solveSwingLimit)
{
info->m_numConstraintRows++;
@@ -101,22 +104,31 @@ void btConeTwistConstraint::getInfo1 (btConstraintInfo1* info)
}
}
}
-
+void btConeTwistConstraint::getInfo1NonVirtual (btConstraintInfo1* info)
+{
+ //always reserve 6 rows: object transform is not available on SPU
+ info->m_numConstraintRows = 6;
+ info->nub = 0;
+
+}
+
void btConeTwistConstraint::getInfo2 (btConstraintInfo2* info)
{
+ getInfo2NonVirtual(info,m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(),m_rbA.getInvInertiaTensorWorld(),m_rbB.getInvInertiaTensorWorld());
+}
+
+void btConeTwistConstraint::getInfo2NonVirtual (btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btMatrix3x3& invInertiaWorldA,const btMatrix3x3& invInertiaWorldB)
+{
+ calcAngleInfo2(transA,transB,invInertiaWorldA,invInertiaWorldB);
+
btAssert(!m_useSolveConstraintObsolete);
- //retrieve matrices
- btTransform body0_trans;
- body0_trans = m_rbA.getCenterOfMassTransform();
- btTransform body1_trans;
- body1_trans = m_rbB.getCenterOfMassTransform();
// set jacobian
info->m_J1linearAxis[0] = 1;
info->m_J1linearAxis[info->rowskip+1] = 1;
info->m_J1linearAxis[2*info->rowskip+2] = 1;
- btVector3 a1 = body0_trans.getBasis() * m_rbAFrame.getOrigin();
+ btVector3 a1 = transA.getBasis() * m_rbAFrame.getOrigin();
{
btVector3* angular0 = (btVector3*)(info->m_J1angularAxis);
btVector3* angular1 = (btVector3*)(info->m_J1angularAxis+info->rowskip);
@@ -124,7 +136,7 @@ void btConeTwistConstraint::getInfo2 (btConstraintInfo2* info)
btVector3 a1neg = -a1;
a1neg.getSkewSymmetricMatrix(angular0,angular1,angular2);
}
- btVector3 a2 = body1_trans.getBasis() * m_rbBFrame.getOrigin();
+ btVector3 a2 = transB.getBasis() * m_rbBFrame.getOrigin();
{
btVector3* angular0 = (btVector3*)(info->m_J2angularAxis);
btVector3* angular1 = (btVector3*)(info->m_J2angularAxis+info->rowskip);
@@ -132,13 +144,18 @@ void btConeTwistConstraint::getInfo2 (btConstraintInfo2* info)
a2.getSkewSymmetricMatrix(angular0,angular1,angular2);
}
// set right hand side
- btScalar k = info->fps * info->erp;
+ btScalar linERP = (m_flags & BT_CONETWIST_FLAGS_LIN_ERP) ? m_linERP : info->erp;
+ btScalar k = info->fps * linERP;
int j;
for (j=0; j<3; j++)
{
- info->m_constraintError[j*info->rowskip] = k * (a2[j] + body1_trans.getOrigin()[j] - a1[j] - body0_trans.getOrigin()[j]);
+ info->m_constraintError[j*info->rowskip] = k * (a2[j] + transB.getOrigin()[j] - a1[j] - transA.getOrigin()[j]);
info->m_lowerLimit[j*info->rowskip] = -SIMD_INFINITY;
info->m_upperLimit[j*info->rowskip] = SIMD_INFINITY;
+ if(m_flags & BT_CONETWIST_FLAGS_LIN_CFM)
+ {
+ info->cfm[j*info->rowskip] = m_linCFM;
+ }
}
int row = 3;
int srow = row * info->rowskip;
@@ -150,7 +167,7 @@ void btConeTwistConstraint::getInfo2 (btConstraintInfo2* info)
btScalar *J2 = info->m_J2angularAxis;
if((m_swingSpan1 < m_fixThresh) && (m_swingSpan2 < m_fixThresh))
{
- btTransform trA = m_rbA.getCenterOfMassTransform()*m_rbAFrame;
+ btTransform trA = transA*m_rbAFrame;
btVector3 p = trA.getBasis().getColumn(1);
btVector3 q = trA.getBasis().getColumn(2);
int srow1 = srow + info->rowskip;
@@ -187,7 +204,10 @@ void btConeTwistConstraint::getInfo2 (btConstraintInfo2* info)
btScalar k = info->fps * m_biasFactor;
info->m_constraintError[srow] = k * m_swingCorrection;
- info->cfm[srow] = 0.0f;
+ if(m_flags & BT_CONETWIST_FLAGS_ANG_CFM)
+ {
+ info->cfm[srow] = m_angCFM;
+ }
// m_swingCorrection is always positive or 0
info->m_lowerLimit[srow] = 0;
info->m_upperLimit[srow] = SIMD_INFINITY;
@@ -207,7 +227,10 @@ void btConeTwistConstraint::getInfo2 (btConstraintInfo2* info)
J2[srow+2] = -ax1[2];
btScalar k = info->fps * m_biasFactor;
info->m_constraintError[srow] = k * m_twistCorrection;
- info->cfm[srow] = 0.0f;
+ if(m_flags & BT_CONETWIST_FLAGS_ANG_CFM)
+ {
+ info->cfm[srow] = m_angCFM;
+ }
if(m_twistSpan > 0.0f)
{
@@ -275,14 +298,15 @@ void btConeTwistConstraint::buildJacobian()
}
}
- calcAngleInfo2();
+ calcAngleInfo2(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(),m_rbA.getInvInertiaTensorWorld(),m_rbB.getInvInertiaTensorWorld());
}
}
-void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep)
+void btConeTwistConstraint::solveConstraintObsolete(btRigidBody& bodyA,btRigidBody& bodyB,btScalar timeStep)
{
+ #ifndef __SPU__
if (m_useSolveConstraintObsolete)
{
btVector3 pivotAInW = m_rbA.getCenterOfMassTransform()*m_rbAFrame.getOrigin();
@@ -297,9 +321,9 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
btVector3 rel_pos2 = pivotBInW - m_rbB.getCenterOfMassPosition();
btVector3 vel1;
- bodyA.getVelocityInLocalPointObsolete(rel_pos1,vel1);
+ bodyA.internalGetVelocityInLocalPointObsolete(rel_pos1,vel1);
btVector3 vel2;
- bodyB.getVelocityInLocalPointObsolete(rel_pos2,vel2);
+ bodyB.internalGetVelocityInLocalPointObsolete(rel_pos2,vel2);
btVector3 vel = vel1 - vel2;
for (int i=0;i<3;i++)
@@ -316,8 +340,8 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
btVector3 ftorqueAxis1 = rel_pos1.cross(normal);
btVector3 ftorqueAxis2 = rel_pos2.cross(normal);
- bodyA.applyImpulse(normal*m_rbA.getInvMass(), m_rbA.getInvInertiaTensorWorld()*ftorqueAxis1,impulse);
- bodyB.applyImpulse(normal*m_rbB.getInvMass(), m_rbB.getInvInertiaTensorWorld()*ftorqueAxis2,-impulse);
+ bodyA.internalApplyImpulse(normal*m_rbA.getInvMass(), m_rbA.getInvInertiaTensorWorld()*ftorqueAxis1,impulse);
+ bodyB.internalApplyImpulse(normal*m_rbB.getInvMass(), m_rbB.getInvInertiaTensorWorld()*ftorqueAxis2,-impulse);
}
}
@@ -328,8 +352,8 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
// compute current and predicted transforms
btTransform trACur = m_rbA.getCenterOfMassTransform();
btTransform trBCur = m_rbB.getCenterOfMassTransform();
- btVector3 omegaA; bodyA.getAngularVelocity(omegaA);
- btVector3 omegaB; bodyB.getAngularVelocity(omegaB);
+ btVector3 omegaA; bodyA.internalGetAngularVelocity(omegaA);
+ btVector3 omegaB; bodyB.internalGetAngularVelocity(omegaB);
btTransform trAPred; trAPred.setIdentity();
btVector3 zerovec(0,0,0);
btTransformUtil::integrateTransform(
@@ -403,15 +427,15 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
btScalar impulseMag = impulse.length();
btVector3 impulseAxis = impulse / impulseMag;
- bodyA.applyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*impulseAxis, impulseMag);
- bodyB.applyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*impulseAxis, -impulseMag);
+ bodyA.internalApplyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*impulseAxis, impulseMag);
+ bodyB.internalApplyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*impulseAxis, -impulseMag);
}
}
else if (m_damping > SIMD_EPSILON) // no motor: do a little damping
{
- btVector3 angVelA; bodyA.getAngularVelocity(angVelA);
- btVector3 angVelB; bodyB.getAngularVelocity(angVelB);
+ btVector3 angVelA; bodyA.internalGetAngularVelocity(angVelA);
+ btVector3 angVelB; bodyB.internalGetAngularVelocity(angVelB);
btVector3 relVel = angVelB - angVelA;
if (relVel.length2() > SIMD_EPSILON)
{
@@ -423,8 +447,8 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
btScalar impulseMag = impulse.length();
btVector3 impulseAxis = impulse / impulseMag;
- bodyA.applyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*impulseAxis, impulseMag);
- bodyB.applyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*impulseAxis, -impulseMag);
+ bodyA.internalApplyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*impulseAxis, impulseMag);
+ bodyB.internalApplyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*impulseAxis, -impulseMag);
}
}
@@ -432,9 +456,9 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
{
///solve angular part
btVector3 angVelA;
- bodyA.getAngularVelocity(angVelA);
+ bodyA.internalGetAngularVelocity(angVelA);
btVector3 angVelB;
- bodyB.getAngularVelocity(angVelB);
+ bodyB.internalGetAngularVelocity(angVelB);
// solve swing limit
if (m_solveSwingLimit)
@@ -463,8 +487,8 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
impulseMag = impulse.length();
btVector3 noTwistSwingAxis = impulse / impulseMag;
- bodyA.applyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*noTwistSwingAxis, impulseMag);
- bodyB.applyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*noTwistSwingAxis, -impulseMag);
+ bodyA.internalApplyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*noTwistSwingAxis, impulseMag);
+ bodyB.internalApplyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*noTwistSwingAxis, -impulseMag);
}
@@ -484,16 +508,19 @@ void btConeTwistConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolver
btVector3 impulse = m_twistAxis * impulseMag;
- bodyA.applyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*m_twistAxis,impulseMag);
- bodyB.applyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*m_twistAxis,-impulseMag);
+ bodyA.internalApplyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*m_twistAxis,impulseMag);
+ bodyB.internalApplyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*m_twistAxis,-impulseMag);
}
}
}
-
+#else
+btAssert(0);
+#endif //__SPU__
}
+
void btConeTwistConstraint::updateRHS(btScalar timeStep)
{
(void)timeStep;
@@ -501,7 +528,7 @@ void btConeTwistConstraint::updateRHS(btScalar timeStep)
}
-
+#ifndef __SPU__
void btConeTwistConstraint::calcAngleInfo()
{
m_swingCorrection = btScalar(0.);
@@ -587,13 +614,13 @@ void btConeTwistConstraint::calcAngleInfo()
}
}
}
-
+#endif //__SPU__
static btVector3 vTwist(1,0,0); // twist axis in constraint's space
-void btConeTwistConstraint::calcAngleInfo2()
+void btConeTwistConstraint::calcAngleInfo2(const btTransform& transA, const btTransform& transB, const btMatrix3x3& invInertiaWorldA,const btMatrix3x3& invInertiaWorldB)
{
m_swingCorrection = btScalar(0.);
m_twistLimitSign = btScalar(0.);
@@ -601,13 +628,13 @@ void btConeTwistConstraint::calcAngleInfo2()
m_solveSwingLimit = false;
// compute rotation of A wrt B (in constraint space)
if (m_bMotorEnabled && (!m_useSolveConstraintObsolete))
- { // it is assumed that setMotorTarget() was already called
+ { // it is assumed that setMotorTarget() was alredy called
// and motor target m_qTarget is within constraint limits
// TODO : split rotation to pure swing and pure twist
// compute desired transforms in world
btTransform trPose(m_qTarget);
- btTransform trA = getRigidBodyA().getCenterOfMassTransform() * m_rbAFrame;
- btTransform trB = getRigidBodyB().getCenterOfMassTransform() * m_rbBFrame;
+ btTransform trA = transA * m_rbAFrame;
+ btTransform trB = transB * m_rbBFrame;
btTransform trDeltaAB = trB * trPose * trA.inverse();
btQuaternion qDeltaAB = trDeltaAB.getRotation();
btVector3 swingAxis = btVector3(qDeltaAB.x(), qDeltaAB.y(), qDeltaAB.z());
@@ -624,8 +651,8 @@ void btConeTwistConstraint::calcAngleInfo2()
{
// compute rotation of A wrt B (in constraint space)
- btQuaternion qA = getRigidBodyA().getCenterOfMassTransform().getRotation() * m_rbAFrame.getRotation();
- btQuaternion qB = getRigidBodyB().getCenterOfMassTransform().getRotation() * m_rbBFrame.getRotation();
+ btQuaternion qA = transA.getRotation() * m_rbAFrame.getRotation();
+ btQuaternion qB = transB.getRotation() * m_rbBFrame.getRotation();
btQuaternion qAB = qB.inverse() * qA;
// split rotation into cone and twist
// (all this is done from B's perspective. Maybe I should be averaging axes...)
@@ -664,8 +691,8 @@ void btConeTwistConstraint::calcAngleInfo2()
m_twistAxisA.setValue(0,0,0);
m_kSwing = btScalar(1.) /
- (getRigidBodyA().computeAngularImpulseDenominator(m_swingAxis) +
- getRigidBodyB().computeAngularImpulseDenominator(m_swingAxis));
+ (computeAngularImpulseDenominator(m_swingAxis,invInertiaWorldA) +
+ computeAngularImpulseDenominator(m_swingAxis,invInertiaWorldB));
}
}
else
@@ -673,10 +700,10 @@ void btConeTwistConstraint::calcAngleInfo2()
// you haven't set any limits;
// or you're trying to set at least one of the swing limits too small. (if so, do you really want a conetwist constraint?)
// anyway, we have either hinge or fixed joint
- btVector3 ivA = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(0);
- btVector3 jvA = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(1);
- btVector3 kvA = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(2);
- btVector3 ivB = getRigidBodyB().getCenterOfMassTransform().getBasis() * m_rbBFrame.getBasis().getColumn(0);
+ btVector3 ivA = transA.getBasis() * m_rbAFrame.getBasis().getColumn(0);
+ btVector3 jvA = transA.getBasis() * m_rbAFrame.getBasis().getColumn(1);
+ btVector3 kvA = transA.getBasis() * m_rbAFrame.getBasis().getColumn(2);
+ btVector3 ivB = transB.getBasis() * m_rbBFrame.getBasis().getColumn(0);
btVector3 target;
btScalar x = ivB.dot(ivA);
btScalar y = ivB.dot(jvA);
@@ -767,8 +794,8 @@ void btConeTwistConstraint::calcAngleInfo2()
m_twistAxis = quatRotate(qB, -twistAxis);
m_kTwist = btScalar(1.) /
- (getRigidBodyA().computeAngularImpulseDenominator(m_twistAxis) +
- getRigidBodyB().computeAngularImpulseDenominator(m_twistAxis));
+ (computeAngularImpulseDenominator(m_twistAxis,invInertiaWorldA) +
+ computeAngularImpulseDenominator(m_twistAxis,invInertiaWorldB));
}
if (m_solveSwingLimit)
@@ -1004,6 +1031,97 @@ void btConeTwistConstraint::setMotorTargetInConstraintSpace(const btQuaternion &
}
}
+///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+///If no axis is provided, it uses the default axis for this constraint.
+void btConeTwistConstraint::setParam(int num, btScalar value, int axis)
+{
+ switch(num)
+ {
+ case BT_CONSTRAINT_ERP :
+ case BT_CONSTRAINT_STOP_ERP :
+ if((axis >= 0) && (axis < 3))
+ {
+ m_linERP = value;
+ m_flags |= BT_CONETWIST_FLAGS_LIN_ERP;
+ }
+ else
+ {
+ m_biasFactor = value;
+ }
+ break;
+ case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_STOP_CFM :
+ if((axis >= 0) && (axis < 3))
+ {
+ m_linCFM = value;
+ m_flags |= BT_CONETWIST_FLAGS_LIN_CFM;
+ }
+ else
+ {
+ m_angCFM = value;
+ m_flags |= BT_CONETWIST_FLAGS_ANG_CFM;
+ }
+ break;
+ default:
+ btAssertConstrParams(0);
+ break;
+ }
+}
+
+///return the local value of parameter
+btScalar btConeTwistConstraint::getParam(int num, int axis) const
+{
+ btScalar retVal = 0;
+ switch(num)
+ {
+ case BT_CONSTRAINT_ERP :
+ case BT_CONSTRAINT_STOP_ERP :
+ if((axis >= 0) && (axis < 3))
+ {
+ btAssertConstrParams(m_flags & BT_CONETWIST_FLAGS_LIN_ERP);
+ retVal = m_linERP;
+ }
+ else if((axis >= 3) && (axis < 6))
+ {
+ retVal = m_biasFactor;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
+ case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_STOP_CFM :
+ if((axis >= 0) && (axis < 3))
+ {
+ btAssertConstrParams(m_flags & BT_CONETWIST_FLAGS_LIN_CFM);
+ retVal = m_linCFM;
+ }
+ else if((axis >= 3) && (axis < 6))
+ {
+ btAssertConstrParams(m_flags & BT_CONETWIST_FLAGS_ANG_CFM);
+ retVal = m_angCFM;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
+ default :
+ btAssertConstrParams(0);
+ }
+ return retVal;
+}
+
+
+void btConeTwistConstraint::setFrames(const btTransform & frameA, const btTransform & frameB)
+{
+ m_rbAFrame = frameA;
+ m_rbBFrame = frameB;
+ buildJacobian();
+ //calculateTransforms();
+}
+
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
index 8a893d4fb8c..c1c5aa851b6 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
@@ -42,6 +42,12 @@ and swing 1 and 2 are along the z and y axes respectively.
class btRigidBody;
+enum btConeTwistFlags
+{
+ BT_CONETWIST_FLAGS_LIN_CFM = 1,
+ BT_CONETWIST_FLAGS_LIN_ERP = 2,
+ BT_CONETWIST_FLAGS_ANG_CFM = 4
+};
///btConeTwistConstraint can be used to simulate ragdoll joints (upper arm, leg etc)
class btConeTwistConstraint : public btTypedConstraint
@@ -99,25 +105,46 @@ public:
btScalar m_maxMotorImpulse;
btVector3 m_accMotorImpulse;
+ // parameters
+ int m_flags;
+ btScalar m_linCFM;
+ btScalar m_linERP;
+ btScalar m_angCFM;
+
+protected:
+
+ void init();
+
+ void computeConeLimitInfo(const btQuaternion& qCone, // in
+ btScalar& swingAngle, btVector3& vSwingAxis, btScalar& swingLimit); // all outs
+
+ void computeTwistLimitInfo(const btQuaternion& qTwist, // in
+ btScalar& twistAngle, btVector3& vTwistAxis); // all outs
+
+ void adjustSwingAxisToUseEllipseNormal(btVector3& vSwingAxis) const;
+
+
public:
btConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame);
btConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame);
- btConeTwistConstraint();
-
virtual void buildJacobian();
virtual void getInfo1 (btConstraintInfo1* info);
+
+ void getInfo1NonVirtual(btConstraintInfo1* info);
virtual void getInfo2 (btConstraintInfo2* info);
+ void getInfo2NonVirtual(btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btMatrix3x3& invInertiaWorldA,const btMatrix3x3& invInertiaWorldB);
- virtual void solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep);
+ virtual void solveConstraintObsolete(btRigidBody& bodyA,btRigidBody& bodyB,btScalar timeStep);
void updateRHS(btScalar timeStep);
+
const btRigidBody& getRigidBodyA() const
{
return m_rbA;
@@ -198,7 +225,7 @@ public:
}
void calcAngleInfo();
- void calcAngleInfo2();
+ void calcAngleInfo2(const btTransform& transA, const btTransform& transB,const btMatrix3x3& invInertiaWorldA,const btMatrix3x3& invInertiaWorldB);
inline btScalar getSwingSpan1()
{
@@ -218,7 +245,6 @@ public:
}
bool isPastSwingLimit() { return m_solveSwingLimit; }
-
void setDamping(btScalar damping) { m_damping = damping; }
void enableMotor(bool b) { m_bMotorEnabled = b; }
@@ -239,18 +265,82 @@ public:
btVector3 GetPointForAngle(btScalar fAngleInRadians, btScalar fLength) const;
+ ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///If no axis is provided, it uses the default axis for this constraint.
+ virtual void setParam(int num, btScalar value, int axis = -1);
+ virtual void setFrames(const btTransform& frameA, const btTransform& frameB);
-protected:
- void init();
+ const btTransform& getFrameOffsetA() const
+ {
+ return m_rbAFrame;
+ }
- void computeConeLimitInfo(const btQuaternion& qCone, // in
- btScalar& swingAngle, btVector3& vSwingAxis, btScalar& swingLimit); // all outs
+ const btTransform& getFrameOffsetB() const
+ {
+ return m_rbBFrame;
+ }
- void computeTwistLimitInfo(const btQuaternion& qTwist, // in
- btScalar& twistAngle, btVector3& vTwistAxis); // all outs
- void adjustSwingAxisToUseEllipseNormal(btVector3& vSwingAxis) const;
+ ///return the local value of parameter
+ virtual btScalar getParam(int num, int axis = -1) const;
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btConeTwistConstraintData
+{
+ btTypedConstraintData m_typeConstraintData;
+ btTransformFloatData m_rbAFrame;
+ btTransformFloatData m_rbBFrame;
+
+ //limits
+ float m_swingSpan1;
+ float m_swingSpan2;
+ float m_twistSpan;
+ float m_limitSoftness;
+ float m_biasFactor;
+ float m_relaxationFactor;
+
+ float m_damping;
+
+ char m_pad[4];
+
};
+
+
+
+SIMD_FORCE_INLINE int btConeTwistConstraint::calculateSerializeBufferSize() const
+{
+ return sizeof(btConeTwistConstraintData);
+
+}
+
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btConeTwistConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btConeTwistConstraintData* cone = (btConeTwistConstraintData*) dataBuffer;
+ btTypedConstraint::serialize(&cone->m_typeConstraintData,serializer);
+
+ m_rbAFrame.serializeFloat(cone->m_rbAFrame);
+ m_rbBFrame.serializeFloat(cone->m_rbBFrame);
+
+ cone->m_swingSpan1 = float(m_swingSpan1);
+ cone->m_swingSpan2 = float(m_swingSpan2);
+ cone->m_twistSpan = float(m_twistSpan);
+ cone->m_limitSoftness = float(m_limitSoftness);
+ cone->m_biasFactor = float(m_biasFactor);
+ cone->m_relaxationFactor = float(m_relaxationFactor);
+ cone->m_damping = float(m_damping);
+
+ return "btConeTwistConstraintData";
+}
+
#endif //CONETWISTCONSTRAINT_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
index 012c321fd6d..d97096d9f26 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
@@ -22,6 +22,52 @@ subject to the following restrictions:
#include "LinearMath/btMinMax.h"
#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h"
+
+
+btContactConstraint::btContactConstraint(btPersistentManifold* contactManifold,btRigidBody& rbA,btRigidBody& rbB)
+:btTypedConstraint(CONTACT_CONSTRAINT_TYPE,rbA,rbB),
+ m_contactManifold(*contactManifold)
+{
+
+}
+
+btContactConstraint::~btContactConstraint()
+{
+
+}
+
+void btContactConstraint::setContactManifold(btPersistentManifold* contactManifold)
+{
+ m_contactManifold = *contactManifold;
+}
+
+void btContactConstraint::getInfo1 (btConstraintInfo1* info)
+{
+
+}
+
+void btContactConstraint::getInfo2 (btConstraintInfo2* info)
+{
+
+}
+
+void btContactConstraint::buildJacobian()
+{
+
+}
+
+
+
+
+
+#include "btContactConstraint.h"
+#include "BulletDynamics/Dynamics/btRigidBody.h"
+#include "LinearMath/btVector3.h"
+#include "btJacobianEntry.h"
+#include "btContactSolverInfo.h"
+#include "LinearMath/btMinMax.h"
+#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h"
+
#define ASSERT2 btAssert
#define USE_INTERNAL_APPLY_IMPULSE 1
@@ -85,345 +131,4 @@ void resolveSingleBilateral(btRigidBody& body1, const btVector3& pos1,
-//response between two dynamic objects with friction
-btScalar resolveSingleCollision(
- btRigidBody& body1,
- btRigidBody& body2,
- btManifoldPoint& contactPoint,
- const btContactSolverInfo& solverInfo)
-{
-
- const btVector3& pos1_ = contactPoint.getPositionWorldOnA();
- const btVector3& pos2_ = contactPoint.getPositionWorldOnB();
- const btVector3& normal = contactPoint.m_normalWorldOnB;
-
- //constant over all iterations
- btVector3 rel_pos1 = pos1_ - body1.getCenterOfMassPosition();
- btVector3 rel_pos2 = pos2_ - body2.getCenterOfMassPosition();
-
- btVector3 vel1 = body1.getVelocityInLocalPoint(rel_pos1);
- btVector3 vel2 = body2.getVelocityInLocalPoint(rel_pos2);
- btVector3 vel = vel1 - vel2;
- btScalar rel_vel;
- rel_vel = normal.dot(vel);
-
- btScalar Kfps = btScalar(1.) / solverInfo.m_timeStep ;
-
- // btScalar damping = solverInfo.m_damping ;
- btScalar Kerp = solverInfo.m_erp;
- btScalar Kcor = Kerp *Kfps;
-
- btConstraintPersistentData* cpd = (btConstraintPersistentData*) contactPoint.m_userPersistentData;
- btAssert(cpd);
- btScalar distance = cpd->m_penetration;
- btScalar positionalError = Kcor *-distance;
- btScalar velocityError = cpd->m_restitution - rel_vel;// * damping;
-
- btScalar penetrationImpulse = positionalError * cpd->m_jacDiagABInv;
-
- btScalar velocityImpulse = velocityError * cpd->m_jacDiagABInv;
-
- btScalar normalImpulse = penetrationImpulse+velocityImpulse;
-
- // See Erin Catto's GDC 2006 paper: Clamp the accumulated impulse
- btScalar oldNormalImpulse = cpd->m_appliedImpulse;
- btScalar sum = oldNormalImpulse + normalImpulse;
- cpd->m_appliedImpulse = btScalar(0.) > sum ? btScalar(0.): sum;
-
- normalImpulse = cpd->m_appliedImpulse - oldNormalImpulse;
-
-#ifdef USE_INTERNAL_APPLY_IMPULSE
- if (body1.getInvMass())
- {
- body1.internalApplyImpulse(contactPoint.m_normalWorldOnB*body1.getInvMass(),cpd->m_angularComponentA,normalImpulse);
- }
- if (body2.getInvMass())
- {
- body2.internalApplyImpulse(contactPoint.m_normalWorldOnB*body2.getInvMass(),cpd->m_angularComponentB,-normalImpulse);
- }
-#else //USE_INTERNAL_APPLY_IMPULSE
- body1.applyImpulse(normal*(normalImpulse), rel_pos1);
- body2.applyImpulse(-normal*(normalImpulse), rel_pos2);
-#endif //USE_INTERNAL_APPLY_IMPULSE
-
- return normalImpulse;
-}
-
-
-btScalar resolveSingleFriction(
- btRigidBody& body1,
- btRigidBody& body2,
- btManifoldPoint& contactPoint,
- const btContactSolverInfo& solverInfo)
-{
-
- (void)solverInfo;
-
- const btVector3& pos1 = contactPoint.getPositionWorldOnA();
- const btVector3& pos2 = contactPoint.getPositionWorldOnB();
-
- btVector3 rel_pos1 = pos1 - body1.getCenterOfMassPosition();
- btVector3 rel_pos2 = pos2 - body2.getCenterOfMassPosition();
-
- btConstraintPersistentData* cpd = (btConstraintPersistentData*) contactPoint.m_userPersistentData;
- btAssert(cpd);
-
- btScalar combinedFriction = cpd->m_friction;
-
- btScalar limit = cpd->m_appliedImpulse * combinedFriction;
-
- if (cpd->m_appliedImpulse>btScalar(0.))
- //friction
- {
- //apply friction in the 2 tangential directions
-
- // 1st tangent
- btVector3 vel1 = body1.getVelocityInLocalPoint(rel_pos1);
- btVector3 vel2 = body2.getVelocityInLocalPoint(rel_pos2);
- btVector3 vel = vel1 - vel2;
-
- btScalar j1,j2;
-
- {
-
- btScalar vrel = cpd->m_frictionWorldTangential0.dot(vel);
-
- // calculate j that moves us to zero relative velocity
- j1 = -vrel * cpd->m_jacDiagABInvTangent0;
- btScalar oldTangentImpulse = cpd->m_accumulatedTangentImpulse0;
- cpd->m_accumulatedTangentImpulse0 = oldTangentImpulse + j1;
- btSetMin(cpd->m_accumulatedTangentImpulse0, limit);
- btSetMax(cpd->m_accumulatedTangentImpulse0, -limit);
- j1 = cpd->m_accumulatedTangentImpulse0 - oldTangentImpulse;
-
- }
- {
- // 2nd tangent
-
- btScalar vrel = cpd->m_frictionWorldTangential1.dot(vel);
-
- // calculate j that moves us to zero relative velocity
- j2 = -vrel * cpd->m_jacDiagABInvTangent1;
- btScalar oldTangentImpulse = cpd->m_accumulatedTangentImpulse1;
- cpd->m_accumulatedTangentImpulse1 = oldTangentImpulse + j2;
- btSetMin(cpd->m_accumulatedTangentImpulse1, limit);
- btSetMax(cpd->m_accumulatedTangentImpulse1, -limit);
- j2 = cpd->m_accumulatedTangentImpulse1 - oldTangentImpulse;
- }
-
-#ifdef USE_INTERNAL_APPLY_IMPULSE
- if (body1.getInvMass())
- {
- body1.internalApplyImpulse(cpd->m_frictionWorldTangential0*body1.getInvMass(),cpd->m_frictionAngularComponent0A,j1);
- body1.internalApplyImpulse(cpd->m_frictionWorldTangential1*body1.getInvMass(),cpd->m_frictionAngularComponent1A,j2);
- }
- if (body2.getInvMass())
- {
- body2.internalApplyImpulse(cpd->m_frictionWorldTangential0*body2.getInvMass(),cpd->m_frictionAngularComponent0B,-j1);
- body2.internalApplyImpulse(cpd->m_frictionWorldTangential1*body2.getInvMass(),cpd->m_frictionAngularComponent1B,-j2);
- }
-#else //USE_INTERNAL_APPLY_IMPULSE
- body1.applyImpulse((j1 * cpd->m_frictionWorldTangential0)+(j2 * cpd->m_frictionWorldTangential1), rel_pos1);
- body2.applyImpulse((j1 * -cpd->m_frictionWorldTangential0)+(j2 * -cpd->m_frictionWorldTangential1), rel_pos2);
-#endif //USE_INTERNAL_APPLY_IMPULSE
-
-
- }
- return cpd->m_appliedImpulse;
-}
-
-
-btScalar resolveSingleFrictionOriginal(
- btRigidBody& body1,
- btRigidBody& body2,
- btManifoldPoint& contactPoint,
- const btContactSolverInfo& solverInfo);
-
-btScalar resolveSingleFrictionOriginal(
- btRigidBody& body1,
- btRigidBody& body2,
- btManifoldPoint& contactPoint,
- const btContactSolverInfo& solverInfo)
-{
-
- (void)solverInfo;
-
- const btVector3& pos1 = contactPoint.getPositionWorldOnA();
- const btVector3& pos2 = contactPoint.getPositionWorldOnB();
-
- btVector3 rel_pos1 = pos1 - body1.getCenterOfMassPosition();
- btVector3 rel_pos2 = pos2 - body2.getCenterOfMassPosition();
-
- btConstraintPersistentData* cpd = (btConstraintPersistentData*) contactPoint.m_userPersistentData;
- btAssert(cpd);
-
- btScalar combinedFriction = cpd->m_friction;
-
- btScalar limit = cpd->m_appliedImpulse * combinedFriction;
- //if (contactPoint.m_appliedImpulse>btScalar(0.))
- //friction
- {
- //apply friction in the 2 tangential directions
-
- {
- // 1st tangent
- btVector3 vel1 = body1.getVelocityInLocalPoint(rel_pos1);
- btVector3 vel2 = body2.getVelocityInLocalPoint(rel_pos2);
- btVector3 vel = vel1 - vel2;
-
- btScalar vrel = cpd->m_frictionWorldTangential0.dot(vel);
-
- // calculate j that moves us to zero relative velocity
- btScalar j = -vrel * cpd->m_jacDiagABInvTangent0;
- btScalar total = cpd->m_accumulatedTangentImpulse0 + j;
- btSetMin(total, limit);
- btSetMax(total, -limit);
- j = total - cpd->m_accumulatedTangentImpulse0;
- cpd->m_accumulatedTangentImpulse0 = total;
- body1.applyImpulse(j * cpd->m_frictionWorldTangential0, rel_pos1);
- body2.applyImpulse(j * -cpd->m_frictionWorldTangential0, rel_pos2);
- }
-
-
- {
- // 2nd tangent
- btVector3 vel1 = body1.getVelocityInLocalPoint(rel_pos1);
- btVector3 vel2 = body2.getVelocityInLocalPoint(rel_pos2);
- btVector3 vel = vel1 - vel2;
-
- btScalar vrel = cpd->m_frictionWorldTangential1.dot(vel);
-
- // calculate j that moves us to zero relative velocity
- btScalar j = -vrel * cpd->m_jacDiagABInvTangent1;
- btScalar total = cpd->m_accumulatedTangentImpulse1 + j;
- btSetMin(total, limit);
- btSetMax(total, -limit);
- j = total - cpd->m_accumulatedTangentImpulse1;
- cpd->m_accumulatedTangentImpulse1 = total;
- body1.applyImpulse(j * cpd->m_frictionWorldTangential1, rel_pos1);
- body2.applyImpulse(j * -cpd->m_frictionWorldTangential1, rel_pos2);
- }
- }
- return cpd->m_appliedImpulse;
-}
-
-
-//velocity + friction
-//response between two dynamic objects with friction
-btScalar resolveSingleCollisionCombined(
- btRigidBody& body1,
- btRigidBody& body2,
- btManifoldPoint& contactPoint,
- const btContactSolverInfo& solverInfo)
-{
-
- const btVector3& pos1 = contactPoint.getPositionWorldOnA();
- const btVector3& pos2 = contactPoint.getPositionWorldOnB();
- const btVector3& normal = contactPoint.m_normalWorldOnB;
-
- btVector3 rel_pos1 = pos1 - body1.getCenterOfMassPosition();
- btVector3 rel_pos2 = pos2 - body2.getCenterOfMassPosition();
-
- btVector3 vel1 = body1.getVelocityInLocalPoint(rel_pos1);
- btVector3 vel2 = body2.getVelocityInLocalPoint(rel_pos2);
- btVector3 vel = vel1 - vel2;
- btScalar rel_vel;
- rel_vel = normal.dot(vel);
-
- btScalar Kfps = btScalar(1.) / solverInfo.m_timeStep ;
-
- //btScalar damping = solverInfo.m_damping ;
- btScalar Kerp = solverInfo.m_erp;
- btScalar Kcor = Kerp *Kfps;
-
- btConstraintPersistentData* cpd = (btConstraintPersistentData*) contactPoint.m_userPersistentData;
- btAssert(cpd);
- btScalar distance = cpd->m_penetration;
- btScalar positionalError = Kcor *-distance;
- btScalar velocityError = cpd->m_restitution - rel_vel;// * damping;
-
- btScalar penetrationImpulse = positionalError * cpd->m_jacDiagABInv;
-
- btScalar velocityImpulse = velocityError * cpd->m_jacDiagABInv;
-
- btScalar normalImpulse = penetrationImpulse+velocityImpulse;
-
- // See Erin Catto's GDC 2006 paper: Clamp the accumulated impulse
- btScalar oldNormalImpulse = cpd->m_appliedImpulse;
- btScalar sum = oldNormalImpulse + normalImpulse;
- cpd->m_appliedImpulse = btScalar(0.) > sum ? btScalar(0.): sum;
-
- normalImpulse = cpd->m_appliedImpulse - oldNormalImpulse;
-
-
-#ifdef USE_INTERNAL_APPLY_IMPULSE
- if (body1.getInvMass())
- {
- body1.internalApplyImpulse(contactPoint.m_normalWorldOnB*body1.getInvMass(),cpd->m_angularComponentA,normalImpulse);
- }
- if (body2.getInvMass())
- {
- body2.internalApplyImpulse(contactPoint.m_normalWorldOnB*body2.getInvMass(),cpd->m_angularComponentB,-normalImpulse);
- }
-#else //USE_INTERNAL_APPLY_IMPULSE
- body1.applyImpulse(normal*(normalImpulse), rel_pos1);
- body2.applyImpulse(-normal*(normalImpulse), rel_pos2);
-#endif //USE_INTERNAL_APPLY_IMPULSE
-
- {
- //friction
- btVector3 vel1 = body1.getVelocityInLocalPoint(rel_pos1);
- btVector3 vel2 = body2.getVelocityInLocalPoint(rel_pos2);
- btVector3 vel = vel1 - vel2;
-
- rel_vel = normal.dot(vel);
-
-
- btVector3 lat_vel = vel - normal * rel_vel;
- btScalar lat_rel_vel = lat_vel.length();
-
- btScalar combinedFriction = cpd->m_friction;
-
- if (cpd->m_appliedImpulse > 0)
- if (lat_rel_vel > SIMD_EPSILON)
- {
- lat_vel /= lat_rel_vel;
- btVector3 temp1 = body1.getInvInertiaTensorWorld() * rel_pos1.cross(lat_vel);
- btVector3 temp2 = body2.getInvInertiaTensorWorld() * rel_pos2.cross(lat_vel);
- btScalar friction_impulse = lat_rel_vel /
- (body1.getInvMass() + body2.getInvMass() + lat_vel.dot(temp1.cross(rel_pos1) + temp2.cross(rel_pos2)));
- btScalar normal_impulse = cpd->m_appliedImpulse * combinedFriction;
-
- btSetMin(friction_impulse, normal_impulse);
- btSetMax(friction_impulse, -normal_impulse);
- body1.applyImpulse(lat_vel * -friction_impulse, rel_pos1);
- body2.applyImpulse(lat_vel * friction_impulse, rel_pos2);
- }
- }
-
-
-
- return normalImpulse;
-}
-
-btScalar resolveSingleFrictionEmpty(
- btRigidBody& body1,
- btRigidBody& body2,
- btManifoldPoint& contactPoint,
- const btContactSolverInfo& solverInfo);
-
-btScalar resolveSingleFrictionEmpty(
- btRigidBody& body1,
- btRigidBody& body2,
- btManifoldPoint& contactPoint,
- const btContactSolverInfo& solverInfo)
-{
- (void)contactPoint;
- (void)body1;
- (void)body2;
- (void)solverInfo;
-
-
- return btScalar(0.);
-}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.h
index e8871f3860b..63c1a417bc1 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.h
@@ -16,107 +16,53 @@ subject to the following restrictions:
#ifndef CONTACT_CONSTRAINT_H
#define CONTACT_CONSTRAINT_H
-///@todo: make into a proper class working with the iterative constraint solver
-
-class btRigidBody;
#include "LinearMath/btVector3.h"
-#include "LinearMath/btScalar.h"
-struct btContactSolverInfo;
-class btManifoldPoint;
-
-enum {
- DEFAULT_CONTACT_SOLVER_TYPE=0,
- CONTACT_SOLVER_TYPE1,
- CONTACT_SOLVER_TYPE2,
- USER_CONTACT_SOLVER_TYPE1,
- MAX_CONTACT_SOLVER_TYPES
-};
+#include "btJacobianEntry.h"
+#include "btTypedConstraint.h"
+#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
+
+///btContactConstraint can be automatically created to solve contact constraints using the unified btTypedConstraint interface
+ATTRIBUTE_ALIGNED16(class) btContactConstraint : public btTypedConstraint
+{
+protected:
+ btPersistentManifold m_contactManifold;
-typedef btScalar (*ContactSolverFunc)(btRigidBody& body1,
- btRigidBody& body2,
- class btManifoldPoint& contactPoint,
- const btContactSolverInfo& info);
+public:
-///stores some extra information to each contact point. It is not in the contact point, because that want to keep the collision detection independent from the constraint solver.
-struct btConstraintPersistentData
-{
- inline btConstraintPersistentData()
- :m_appliedImpulse(btScalar(0.)),
- m_prevAppliedImpulse(btScalar(0.)),
- m_accumulatedTangentImpulse0(btScalar(0.)),
- m_accumulatedTangentImpulse1(btScalar(0.)),
- m_jacDiagABInv(btScalar(0.)),
- m_persistentLifeTime(0),
- m_restitution(btScalar(0.)),
- m_friction(btScalar(0.)),
- m_penetration(btScalar(0.)),
- m_contactSolverFunc(0),
- m_frictionSolverFunc(0)
+
+ btContactConstraint(btPersistentManifold* contactManifold,btRigidBody& rbA,btRigidBody& rbB);
+
+ void setContactManifold(btPersistentManifold* contactManifold);
+
+ btPersistentManifold* getContactManifold()
{
+ return &m_contactManifold;
}
-
-
- /// total applied impulse during most recent frame
- btScalar m_appliedImpulse;
- btScalar m_prevAppliedImpulse;
- btScalar m_accumulatedTangentImpulse0;
- btScalar m_accumulatedTangentImpulse1;
-
- btScalar m_jacDiagABInv;
- btScalar m_jacDiagABInvTangent0;
- btScalar m_jacDiagABInvTangent1;
- int m_persistentLifeTime;
- btScalar m_restitution;
- btScalar m_friction;
- btScalar m_penetration;
- btVector3 m_frictionWorldTangential0;
- btVector3 m_frictionWorldTangential1;
-
- btVector3 m_frictionAngularComponent0A;
- btVector3 m_frictionAngularComponent0B;
- btVector3 m_frictionAngularComponent1A;
- btVector3 m_frictionAngularComponent1B;
-
- //some data doesn't need to be persistent over frames: todo: clean/reuse this
- btVector3 m_angularComponentA;
- btVector3 m_angularComponentB;
-
- ContactSolverFunc m_contactSolverFunc;
- ContactSolverFunc m_frictionSolverFunc;
-};
+ const btPersistentManifold* getContactManifold() const
+ {
+ return &m_contactManifold;
+ }
-///bilateral constraint between two dynamic objects
-///positive distance = separation, negative distance = penetration
-void resolveSingleBilateral(btRigidBody& body1, const btVector3& pos1,
- btRigidBody& body2, const btVector3& pos2,
- btScalar distance, const btVector3& normal,btScalar& impulse ,btScalar timeStep);
+ virtual ~btContactConstraint();
+
+ virtual void getInfo1 (btConstraintInfo1* info);
+
+ virtual void getInfo2 (btConstraintInfo2* info);
+ ///obsolete methods
+ virtual void buildJacobian();
-///contact constraint resolution:
-///calculate and apply impulse to satisfy non-penetration and non-negative relative velocity constraint
-///positive distance = separation, negative distance = penetration
-btScalar resolveSingleCollision(
- btRigidBody& body1,
- btRigidBody& body2,
- btManifoldPoint& contactPoint,
- const btContactSolverInfo& info);
-btScalar resolveSingleFriction(
- btRigidBody& body1,
- btRigidBody& body2,
- btManifoldPoint& contactPoint,
- const btContactSolverInfo& solverInfo
- );
+};
+
+///resolveSingleBilateral is an obsolete methods used for vehicle friction between two dynamic objects
+void resolveSingleBilateral(btRigidBody& body1, const btVector3& pos1,
+ btRigidBody& body2, const btVector3& pos2,
+ btScalar distance, const btVector3& normal,btScalar& impulse ,btScalar timeStep);
-btScalar resolveSingleCollisionCombined(
- btRigidBody& body1,
- btRigidBody& body2,
- btManifoldPoint& contactPoint,
- const btContactSolverInfo& solverInfo
- );
#endif //CONTACT_CONSTRAINT_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
index a11fc94ea11..db5bb5e4c51 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
@@ -35,7 +35,7 @@ struct btContactSolverInfoData
btScalar m_tau;
- btScalar m_damping;
+ btScalar m_damping;//global non-contact constraint damping, can be locally overridden by constraints during 'getInfo2'.
btScalar m_friction;
btScalar m_timeStep;
btScalar m_restitution;
@@ -52,6 +52,7 @@ struct btContactSolverInfoData
int m_solverMode;
int m_restingContactRestitutionThreshold;
+ int m_minimumSolverBatchSize;
};
@@ -77,8 +78,9 @@ struct btContactSolverInfo : public btContactSolverInfoData
m_splitImpulsePenetrationThreshold = -0.02f;
m_linearSlop = btScalar(0.0);
m_warmstartingFactor=btScalar(0.85);
- m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_USE_2_FRICTION_DIRECTIONS |SOLVER_SIMD | SOLVER_RANDMIZE_ORDER;
+ m_solverMode = SOLVER_USE_WARMSTARTING | SOLVER_SIMD;// | SOLVER_RANDMIZE_ORDER;
m_restingContactRestitutionThreshold = 2;//resting contact lifetime threshold to disable restitution
+ m_minimumSolverBatchSize = 128; //try to combine islands until the amount of constraints reaches this limit
}
};
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
index 38e81688f02..7c5e4f6e7b2 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
@@ -28,14 +28,10 @@ http://gimpact.sf.net
#define D6_USE_OBSOLETE_METHOD false
+#define D6_USE_FRAME_OFFSET true
+
-btGeneric6DofConstraint::btGeneric6DofConstraint()
-:btTypedConstraint(D6_CONSTRAINT_TYPE),
-m_useLinearReferenceFrameA(true),
-m_useSolveConstraintObsolete(D6_USE_OBSOLETE_METHOD)
-{
-}
@@ -44,13 +40,31 @@ btGeneric6DofConstraint::btGeneric6DofConstraint(btRigidBody& rbA, btRigidBody&
, m_frameInA(frameInA)
, m_frameInB(frameInB),
m_useLinearReferenceFrameA(useLinearReferenceFrameA),
+m_useOffsetForConstraintFrame(D6_USE_FRAME_OFFSET),
+m_flags(0),
m_useSolveConstraintObsolete(D6_USE_OBSOLETE_METHOD)
{
+ calculateTransforms();
+}
+
+
+btGeneric6DofConstraint::btGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB)
+ : btTypedConstraint(D6_CONSTRAINT_TYPE, getFixedBody(), rbB),
+ m_frameInB(frameInB),
+ m_useLinearReferenceFrameA(useLinearReferenceFrameB),
+ m_useOffsetForConstraintFrame(D6_USE_FRAME_OFFSET),
+ m_flags(0),
+ m_useSolveConstraintObsolete(false)
+{
+ ///not providing rigidbody A means implicitly using worldspace for body A
+ m_frameInA = rbB.getCenterOfMassTransform() * m_frameInB;
+ calculateTransforms();
}
+
#define GENERIC_D6_DISABLE_WARMSTARTING 1
@@ -112,7 +126,6 @@ int btRotationalLimitMotor::testLimitValue(btScalar test_value)
m_currentLimit = 0;//Free from violation
return 0;
}
-
if (test_value < m_loLimit)
{
m_currentLimit = 1;//low limit violation
@@ -135,7 +148,7 @@ int btRotationalLimitMotor::testLimitValue(btScalar test_value)
btScalar btRotationalLimitMotor::solveAngularLimits(
btScalar timeStep,btVector3& axis,btScalar jacDiagABInv,
- btRigidBody * body0, btSolverBody& bodyA, btRigidBody * body1, btSolverBody& bodyB)
+ btRigidBody * body0, btRigidBody * body1 )
{
if (needApplyTorques()==false) return 0.0f;
@@ -145,7 +158,7 @@ btScalar btRotationalLimitMotor::solveAngularLimits(
//current error correction
if (m_currentLimit!=0)
{
- target_velocity = -m_ERP*m_currentLimitError/(timeStep);
+ target_velocity = -m_stopERP*m_currentLimitError/(timeStep);
maxMotorForce = m_maxLimitForce;
}
@@ -154,9 +167,9 @@ btScalar btRotationalLimitMotor::solveAngularLimits(
// current velocity difference
btVector3 angVelA;
- bodyA.getAngularVelocity(angVelA);
+ body0->internalGetAngularVelocity(angVelA);
btVector3 angVelB;
- bodyB.getAngularVelocity(angVelB);
+ body1->internalGetAngularVelocity(angVelB);
btVector3 vel_diff;
vel_diff = angVelA-angVelB;
@@ -207,8 +220,8 @@ btScalar btRotationalLimitMotor::solveAngularLimits(
//body0->applyTorqueImpulse(motorImp);
//body1->applyTorqueImpulse(-motorImp);
- bodyA.applyImpulse(btVector3(0,0,0), body0->getInvInertiaTensorWorld()*axis,clippedMotorImpulse);
- bodyB.applyImpulse(btVector3(0,0,0), body1->getInvInertiaTensorWorld()*axis,-clippedMotorImpulse);
+ body0->internalApplyImpulse(btVector3(0,0,0), body0->getInvInertiaTensorWorld()*axis,clippedMotorImpulse);
+ body1->internalApplyImpulse(btVector3(0,0,0), body1->getInvInertiaTensorWorld()*axis,-clippedMotorImpulse);
return clippedMotorImpulse;
@@ -258,8 +271,8 @@ int btTranslationalLimitMotor::testLimitValue(int limitIndex, btScalar test_valu
btScalar btTranslationalLimitMotor::solveLinearAxis(
btScalar timeStep,
btScalar jacDiagABInv,
- btRigidBody& body1,btSolverBody& bodyA,const btVector3 &pointInA,
- btRigidBody& body2,btSolverBody& bodyB,const btVector3 &pointInB,
+ btRigidBody& body1,const btVector3 &pointInA,
+ btRigidBody& body2,const btVector3 &pointInB,
int limit_index,
const btVector3 & axis_normal_on_a,
const btVector3 & anchorPos)
@@ -272,9 +285,9 @@ btScalar btTranslationalLimitMotor::solveLinearAxis(
btVector3 rel_pos2 = anchorPos - body2.getCenterOfMassPosition();
btVector3 vel1;
- bodyA.getVelocityInLocalPointObsolete(rel_pos1,vel1);
+ body1.internalGetVelocityInLocalPointObsolete(rel_pos1,vel1);
btVector3 vel2;
- bodyB.getVelocityInLocalPointObsolete(rel_pos2,vel2);
+ body2.internalGetVelocityInLocalPointObsolete(rel_pos2,vel2);
btVector3 vel = vel1 - vel2;
btScalar rel_vel = axis_normal_on_a.dot(vel);
@@ -332,8 +345,8 @@ btScalar btTranslationalLimitMotor::solveLinearAxis(
btVector3 ftorqueAxis1 = rel_pos1.cross(axis_normal_on_a);
btVector3 ftorqueAxis2 = rel_pos2.cross(axis_normal_on_a);
- bodyA.applyImpulse(axis_normal_on_a*body1.getInvMass(), body1.getInvInertiaTensorWorld()*ftorqueAxis1,normalImpulse);
- bodyB.applyImpulse(axis_normal_on_a*body2.getInvMass(), body2.getInvInertiaTensorWorld()*ftorqueAxis2,-normalImpulse);
+ body1.internalApplyImpulse(axis_normal_on_a*body1.getInvMass(), body1.getInvInertiaTensorWorld()*ftorqueAxis1,normalImpulse);
+ body2.internalApplyImpulse(axis_normal_on_a*body2.getInvMass(), body2.getInvInertiaTensorWorld()*ftorqueAxis2,-normalImpulse);
@@ -374,14 +387,33 @@ void btGeneric6DofConstraint::calculateAngleInfo()
}
-
-
void btGeneric6DofConstraint::calculateTransforms()
{
- m_calculatedTransformA = m_rbA.getCenterOfMassTransform() * m_frameInA;
- m_calculatedTransformB = m_rbB.getCenterOfMassTransform() * m_frameInB;
+ calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+}
+
+void btGeneric6DofConstraint::calculateTransforms(const btTransform& transA,const btTransform& transB)
+{
+ m_calculatedTransformA = transA * m_frameInA;
+ m_calculatedTransformB = transB * m_frameInB;
calculateLinearInfo();
calculateAngleInfo();
+ if(m_useOffsetForConstraintFrame)
+ { // get weight factors depending on masses
+ btScalar miA = getRigidBodyA().getInvMass();
+ btScalar miB = getRigidBodyB().getInvMass();
+ m_hasStaticBody = (miA < SIMD_EPSILON) || (miB < SIMD_EPSILON);
+ btScalar miS = miA + miB;
+ if(miS > btScalar(0.f))
+ {
+ m_factA = miB / miS;
+ }
+ else
+ {
+ m_factA = btScalar(0.5f);
+ }
+ m_factB = btScalar(1.0f) - m_factA;
+ }
}
@@ -420,6 +452,7 @@ void btGeneric6DofConstraint::buildAngularJacobian(
bool btGeneric6DofConstraint::testAngularLimitMotor(int axis_index)
{
btScalar angle = m_calculatedAxisAngleDiff[axis_index];
+ angle = btAdjustAngleToLimits(angle, m_angularLimits[axis_index].m_loLimit, m_angularLimits[axis_index].m_hiLimit);
m_angularLimits[axis_index].m_currentPosition = angle;
//test limits
m_angularLimits[axis_index].testLimitValue(angle);
@@ -430,6 +463,7 @@ bool btGeneric6DofConstraint::testAngularLimitMotor(int axis_index)
void btGeneric6DofConstraint::buildJacobian()
{
+#ifndef __SPU__
if (m_useSolveConstraintObsolete)
{
@@ -441,7 +475,7 @@ void btGeneric6DofConstraint::buildJacobian()
m_angularLimits[i].m_accumulatedImpulse = btScalar(0.);
}
//calculates transform
- calculateTransforms();
+ calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
// const btVector3& pivotAInW = m_calculatedTransformA.getOrigin();
// const btVector3& pivotBInW = m_calculatedTransformB.getOrigin();
@@ -484,8 +518,9 @@ void btGeneric6DofConstraint::buildJacobian()
}
}
-}
+#endif //__SPU__
+}
void btGeneric6DofConstraint::getInfo1 (btConstraintInfo1* info)
@@ -497,7 +532,7 @@ void btGeneric6DofConstraint::getInfo1 (btConstraintInfo1* info)
} else
{
//prepare constraint
- calculateTransforms();
+ calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
info->m_numConstraintRows = 0;
info->nub = 6;
int i;
@@ -522,21 +557,76 @@ void btGeneric6DofConstraint::getInfo1 (btConstraintInfo1* info)
}
}
+void btGeneric6DofConstraint::getInfo1NonVirtual (btConstraintInfo1* info)
+{
+ if (m_useSolveConstraintObsolete)
+ {
+ info->m_numConstraintRows = 0;
+ info->nub = 0;
+ } else
+ {
+ //pre-allocate all 6
+ info->m_numConstraintRows = 6;
+ info->nub = 0;
+ }
+}
void btGeneric6DofConstraint::getInfo2 (btConstraintInfo2* info)
{
btAssert(!m_useSolveConstraintObsolete);
- int row = setLinearLimits(info);
- setAngularLimits(info, row);
+
+ const btTransform& transA = m_rbA.getCenterOfMassTransform();
+ const btTransform& transB = m_rbB.getCenterOfMassTransform();
+ const btVector3& linVelA = m_rbA.getLinearVelocity();
+ const btVector3& linVelB = m_rbB.getLinearVelocity();
+ const btVector3& angVelA = m_rbA.getAngularVelocity();
+ const btVector3& angVelB = m_rbB.getAngularVelocity();
+
+ if(m_useOffsetForConstraintFrame)
+ { // for stability better to solve angular limits first
+ int row = setAngularLimits(info, 0,transA,transB,linVelA,linVelB,angVelA,angVelB);
+ setLinearLimits(info, row, transA,transB,linVelA,linVelB,angVelA,angVelB);
+ }
+ else
+ { // leave old version for compatibility
+ int row = setLinearLimits(info, 0, transA,transB,linVelA,linVelB,angVelA,angVelB);
+ setAngularLimits(info, row,transA,transB,linVelA,linVelB,angVelA,angVelB);
+ }
+
+}
+
+
+void btGeneric6DofConstraint::getInfo2NonVirtual (btConstraintInfo2* info, const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB)
+{
+
+ btAssert(!m_useSolveConstraintObsolete);
+ //prepare constraint
+ calculateTransforms(transA,transB);
+
+ int i;
+ for (i=0;i<3 ;i++ )
+ {
+ testAngularLimitMotor(i);
+ }
+
+ if(m_useOffsetForConstraintFrame)
+ { // for stability better to solve angular limits first
+ int row = setAngularLimits(info, 0,transA,transB,linVelA,linVelB,angVelA,angVelB);
+ setLinearLimits(info, row, transA,transB,linVelA,linVelB,angVelA,angVelB);
+ }
+ else
+ { // leave old version for compatibility
+ int row = setLinearLimits(info, 0, transA,transB,linVelA,linVelB,angVelA,angVelB);
+ setAngularLimits(info, row,transA,transB,linVelA,linVelB,angVelA,angVelB);
+ }
}
-int btGeneric6DofConstraint::setLinearLimits(btConstraintInfo2* info)
+int btGeneric6DofConstraint::setLinearLimits(btConstraintInfo2* info, int row, const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB)
{
- btGeneric6DofConstraint * d6constraint = this;
- int row = 0;
+// int row = 0;
//solve linear limits
btRotationalLimitMotor limot;
for (int i=0;i<3 ;i++ )
@@ -549,7 +639,6 @@ int btGeneric6DofConstraint::setLinearLimits(btConstraintInfo2* info)
limot.m_currentLimitError = m_linearLimits.m_currentLimitError[i];
limot.m_damping = m_linearLimits.m_damping;
limot.m_enableMotor = m_linearLimits.m_enableMotor[i];
- limot.m_ERP = m_linearLimits.m_restitution;
limot.m_hiLimit = m_linearLimits.m_upperLimit[i];
limot.m_limitSoftness = m_linearLimits.m_limitSoftness;
limot.m_loLimit = m_linearLimits.m_lowerLimit[i];
@@ -557,7 +646,25 @@ int btGeneric6DofConstraint::setLinearLimits(btConstraintInfo2* info)
limot.m_maxMotorForce = m_linearLimits.m_maxMotorForce[i];
limot.m_targetVelocity = m_linearLimits.m_targetVelocity[i];
btVector3 axis = m_calculatedTransformA.getBasis().getColumn(i);
- row += get_limit_motor_info2(&limot, &m_rbA, &m_rbB, info, row, axis, 0);
+ int flags = m_flags >> (i * BT_6DOF_FLAGS_AXIS_SHIFT);
+ limot.m_normalCFM = (flags & BT_6DOF_FLAGS_CFM_NORM) ? m_linearLimits.m_normalCFM[i] : info->cfm[0];
+ limot.m_stopCFM = (flags & BT_6DOF_FLAGS_CFM_STOP) ? m_linearLimits.m_stopCFM[i] : info->cfm[0];
+ limot.m_stopERP = (flags & BT_6DOF_FLAGS_ERP_STOP) ? m_linearLimits.m_stopERP[i] : info->erp;
+ if(m_useOffsetForConstraintFrame)
+ {
+ int indx1 = (i + 1) % 3;
+ int indx2 = (i + 2) % 3;
+ int rotAllowed = 1; // rotations around orthos to current axis
+ if(m_angularLimits[indx1].m_currentLimit && m_angularLimits[indx2].m_currentLimit)
+ {
+ rotAllowed = 0;
+ }
+ row += get_limit_motor_info2(&limot, transA,transB,linVelA,linVelB,angVelA,angVelB, info, row, axis, 0, rotAllowed);
+ }
+ else
+ {
+ row += get_limit_motor_info2(&limot, transA,transB,linVelA,linVelB,angVelA,angVelB, info, row, axis, 0);
+ }
}
}
return row;
@@ -565,7 +672,7 @@ int btGeneric6DofConstraint::setLinearLimits(btConstraintInfo2* info)
-int btGeneric6DofConstraint::setAngularLimits(btConstraintInfo2 *info, int row_offset)
+int btGeneric6DofConstraint::setAngularLimits(btConstraintInfo2 *info, int row_offset, const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB)
{
btGeneric6DofConstraint * d6constraint = this;
int row = row_offset;
@@ -575,80 +682,30 @@ int btGeneric6DofConstraint::setAngularLimits(btConstraintInfo2 *info, int row_o
if(d6constraint->getRotationalLimitMotor(i)->needApplyTorques())
{
btVector3 axis = d6constraint->getAxis(i);
- row += get_limit_motor_info2(
- d6constraint->getRotationalLimitMotor(i),
- &m_rbA,
- &m_rbB,
- info,row,axis,1);
- }
- }
-
- return row;
-}
-
-
-
-void btGeneric6DofConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep)
-{
- if (m_useSolveConstraintObsolete)
- {
-
-
- m_timeStep = timeStep;
-
- //calculateTransforms();
-
- int i;
-
- // linear
-
- btVector3 pointInA = m_calculatedTransformA.getOrigin();
- btVector3 pointInB = m_calculatedTransformB.getOrigin();
-
- btScalar jacDiagABInv;
- btVector3 linear_axis;
- for (i=0;i<3;i++)
- {
- if (m_linearLimits.isLimited(i))
+ int flags = m_flags >> ((i + 3) * BT_6DOF_FLAGS_AXIS_SHIFT);
+ if(!(flags & BT_6DOF_FLAGS_CFM_NORM))
{
- jacDiagABInv = btScalar(1.) / m_jacLinear[i].getDiagonal();
-
- if (m_useLinearReferenceFrameA)
- linear_axis = m_calculatedTransformA.getBasis().getColumn(i);
- else
- linear_axis = m_calculatedTransformB.getBasis().getColumn(i);
-
- m_linearLimits.solveLinearAxis(
- m_timeStep,
- jacDiagABInv,
- m_rbA,bodyA,pointInA,
- m_rbB,bodyB,pointInB,
- i,linear_axis, m_AnchorPos);
-
+ m_angularLimits[i].m_normalCFM = info->cfm[0];
}
- }
-
- // angular
- btVector3 angular_axis;
- btScalar angularJacDiagABInv;
- for (i=0;i<3;i++)
- {
- if (m_angularLimits[i].needApplyTorques())
+ if(!(flags & BT_6DOF_FLAGS_CFM_STOP))
{
-
- // get axis
- angular_axis = getAxis(i);
-
- angularJacDiagABInv = btScalar(1.) / m_jacAng[i].getDiagonal();
-
- m_angularLimits[i].solveAngularLimits(m_timeStep,angular_axis,angularJacDiagABInv, &m_rbA,bodyA,&m_rbB,bodyB);
+ m_angularLimits[i].m_stopCFM = info->cfm[0];
+ }
+ if(!(flags & BT_6DOF_FLAGS_ERP_STOP))
+ {
+ m_angularLimits[i].m_stopERP = info->erp;
}
+ row += get_limit_motor_info2(d6constraint->getRotationalLimitMotor(i),
+ transA,transB,linVelA,linVelB,angVelA,angVelB, info,row,axis,1);
}
}
+
+ return row;
}
+
void btGeneric6DofConstraint::updateRHS(btScalar timeStep)
{
(void)timeStep;
@@ -656,6 +713,15 @@ void btGeneric6DofConstraint::updateRHS(btScalar timeStep)
}
+void btGeneric6DofConstraint::setFrames(const btTransform& frameA, const btTransform& frameB)
+{
+ m_frameInA = frameA;
+ m_frameInB = frameB;
+ buildJacobian();
+ calculateTransforms();
+}
+
+
btVector3 btGeneric6DofConstraint::getAxis(int axis_index) const
{
@@ -712,8 +778,8 @@ void btGeneric6DofConstraint::calculateLinearInfo()
int btGeneric6DofConstraint::get_limit_motor_info2(
btRotationalLimitMotor * limot,
- btRigidBody * body0, btRigidBody * body1,
- btConstraintInfo2 *info, int row, btVector3& ax1, int rotational)
+ const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB,
+ btConstraintInfo2 *info, int row, btVector3& ax1, int rotational,int rotAllowed)
{
int srow = row * info->rowskip;
int powered = limot->m_enableMotor;
@@ -733,18 +799,51 @@ int btGeneric6DofConstraint::get_limit_motor_info2(
}
if((!rotational))
{
- btVector3 ltd; // Linear Torque Decoupling vector
- btVector3 c = m_calculatedTransformB.getOrigin() - body0->getCenterOfMassPosition();
- ltd = c.cross(ax1);
- info->m_J1angularAxis[srow+0] = ltd[0];
- info->m_J1angularAxis[srow+1] = ltd[1];
- info->m_J1angularAxis[srow+2] = ltd[2];
-
- c = m_calculatedTransformB.getOrigin() - body1->getCenterOfMassPosition();
- ltd = -c.cross(ax1);
- info->m_J2angularAxis[srow+0] = ltd[0];
- info->m_J2angularAxis[srow+1] = ltd[1];
- info->m_J2angularAxis[srow+2] = ltd[2];
+ if (m_useOffsetForConstraintFrame)
+ {
+ btVector3 tmpA, tmpB, relA, relB;
+ // get vector from bodyB to frameB in WCS
+ relB = m_calculatedTransformB.getOrigin() - transB.getOrigin();
+ // get its projection to constraint axis
+ btVector3 projB = ax1 * relB.dot(ax1);
+ // get vector directed from bodyB to constraint axis (and orthogonal to it)
+ btVector3 orthoB = relB - projB;
+ // same for bodyA
+ relA = m_calculatedTransformA.getOrigin() - transA.getOrigin();
+ btVector3 projA = ax1 * relA.dot(ax1);
+ btVector3 orthoA = relA - projA;
+ // get desired offset between frames A and B along constraint axis
+ btScalar desiredOffs = limot->m_currentPosition - limot->m_currentLimitError;
+ // desired vector from projection of center of bodyA to projection of center of bodyB to constraint axis
+ btVector3 totalDist = projA + ax1 * desiredOffs - projB;
+ // get offset vectors relA and relB
+ relA = orthoA + totalDist * m_factA;
+ relB = orthoB - totalDist * m_factB;
+ tmpA = relA.cross(ax1);
+ tmpB = relB.cross(ax1);
+ if(m_hasStaticBody && (!rotAllowed))
+ {
+ tmpA *= m_factA;
+ tmpB *= m_factB;
+ }
+ int i;
+ for (i=0; i<3; i++) info->m_J1angularAxis[srow+i] = tmpA[i];
+ for (i=0; i<3; i++) info->m_J2angularAxis[srow+i] = -tmpB[i];
+ } else
+ {
+ btVector3 ltd; // Linear Torque Decoupling vector
+ btVector3 c = m_calculatedTransformB.getOrigin() - transA.getOrigin();
+ ltd = c.cross(ax1);
+ info->m_J1angularAxis[srow+0] = ltd[0];
+ info->m_J1angularAxis[srow+1] = ltd[1];
+ info->m_J1angularAxis[srow+2] = ltd[2];
+
+ c = m_calculatedTransformB.getOrigin() - transB.getOrigin();
+ ltd = -c.cross(ax1);
+ info->m_J2angularAxis[srow+0] = ltd[0];
+ info->m_J2angularAxis[srow+1] = ltd[1];
+ info->m_J2angularAxis[srow+2] = ltd[2];
+ }
}
// if we're limited low and high simultaneously, the joint motor is
// ineffective
@@ -752,7 +851,7 @@ int btGeneric6DofConstraint::get_limit_motor_info2(
info->m_constraintError[srow] = btScalar(0.f);
if (powered)
{
- info->cfm[srow] = 0.0f;
+ info->cfm[srow] = limot->m_normalCFM;
if(!limit)
{
btScalar tag_vel = rotational ? limot->m_targetVelocity : -limot->m_targetVelocity;
@@ -761,7 +860,7 @@ int btGeneric6DofConstraint::get_limit_motor_info2(
limot->m_loLimit,
limot->m_hiLimit,
tag_vel,
- info->fps * info->erp);
+ info->fps * limot->m_stopERP);
info->m_constraintError[srow] += mot_fact * limot->m_targetVelocity;
info->m_lowerLimit[srow] = -limot->m_maxMotorForce;
info->m_upperLimit[srow] = limot->m_maxMotorForce;
@@ -769,7 +868,7 @@ int btGeneric6DofConstraint::get_limit_motor_info2(
}
if(limit)
{
- btScalar k = info->fps * limot->m_ERP;
+ btScalar k = info->fps * limot->m_stopERP;
if(!rotational)
{
info->m_constraintError[srow] += k * limot->m_currentLimitError;
@@ -778,7 +877,7 @@ int btGeneric6DofConstraint::get_limit_motor_info2(
{
info->m_constraintError[srow] += -k * limot->m_currentLimitError;
}
- info->cfm[srow] = 0.0f;
+ info->cfm[srow] = limot->m_stopCFM;
if (limot->m_loLimit == limot->m_hiLimit)
{ // limited low and high simultaneously
info->m_lowerLimit[srow] = -SIMD_INFINITY;
@@ -803,15 +902,17 @@ int btGeneric6DofConstraint::get_limit_motor_info2(
btScalar vel;
if (rotational)
{
- vel = body0->getAngularVelocity().dot(ax1);
- if (body1)
- vel -= body1->getAngularVelocity().dot(ax1);
+ vel = angVelA.dot(ax1);
+//make sure that if no body -> angVelB == zero vec
+// if (body1)
+ vel -= angVelB.dot(ax1);
}
else
{
- vel = body0->getLinearVelocity().dot(ax1);
- if (body1)
- vel -= body1->getLinearVelocity().dot(ax1);
+ vel = linVelA.dot(ax1);
+//make sure that if no body -> angVelB == zero vec
+// if (body1)
+ vel -= linVelB.dot(ax1);
}
// only apply bounce if the velocity is incoming, and if the
// resulting c[] exceeds what we already have.
@@ -844,128 +945,126 @@ int btGeneric6DofConstraint::get_limit_motor_info2(
-btGeneric6DofSpringConstraint::btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA)
- : btGeneric6DofConstraint(rbA, rbB, frameInA, frameInB, useLinearReferenceFrameA)
-{
- for(int i = 0; i < 6; i++)
- {
- m_springEnabled[i] = false;
- m_equilibriumPoint[i] = btScalar(0.f);
- m_springStiffness[i] = btScalar(0.f);
- m_springDamping[i] = btScalar(1.f);
- }
-}
-void btGeneric6DofSpringConstraint::enableSpring(int index, bool onOff)
+ ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///If no axis is provided, it uses the default axis for this constraint.
+void btGeneric6DofConstraint::setParam(int num, btScalar value, int axis)
{
- btAssert((index >= 0) && (index < 6));
- m_springEnabled[index] = onOff;
- if(index < 3)
- {
- m_linearLimits.m_enableMotor[index] = onOff;
- }
- else
+ if((axis >= 0) && (axis < 3))
{
- m_angularLimits[index - 3].m_enableMotor = onOff;
- }
-}
-
-
-
-void btGeneric6DofSpringConstraint::setStiffness(int index, btScalar stiffness)
-{
- btAssert((index >= 0) && (index < 6));
- m_springStiffness[index] = stiffness;
-}
-
-
-void btGeneric6DofSpringConstraint::setDamping(int index, btScalar damping)
-{
- btAssert((index >= 0) && (index < 6));
- m_springDamping[index] = damping;
-}
-
-
-void btGeneric6DofSpringConstraint::setEquilibriumPoint()
-{
- calculateTransforms();
- for(int i = 0; i < 3; i++)
- {
- m_equilibriumPoint[i] = m_calculatedLinearDiff[i];
+ switch(num)
+ {
+ case BT_CONSTRAINT_STOP_ERP :
+ m_linearLimits.m_stopERP[axis] = value;
+ m_flags |= BT_6DOF_FLAGS_ERP_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
+ break;
+ case BT_CONSTRAINT_STOP_CFM :
+ m_linearLimits.m_stopCFM[axis] = value;
+ m_flags |= BT_6DOF_FLAGS_CFM_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
+ break;
+ case BT_CONSTRAINT_CFM :
+ m_linearLimits.m_normalCFM[axis] = value;
+ m_flags |= BT_6DOF_FLAGS_CFM_NORM << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
+ break;
+ default :
+ btAssertConstrParams(0);
+ }
}
- for(int i = 0; i < 3; i++)
+ else if((axis >=3) && (axis < 6))
{
- m_equilibriumPoint[i + 3] = m_calculatedAxisAngleDiff[i];
- }
-}
-
-
-
-void btGeneric6DofSpringConstraint::setEquilibriumPoint(int index)
-{
- btAssert((index >= 0) && (index < 6));
- calculateTransforms();
- if(index < 3)
- {
- m_equilibriumPoint[index] = m_calculatedLinearDiff[index];
+ switch(num)
+ {
+ case BT_CONSTRAINT_STOP_ERP :
+ m_angularLimits[axis - 3].m_stopERP = value;
+ m_flags |= BT_6DOF_FLAGS_ERP_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
+ break;
+ case BT_CONSTRAINT_STOP_CFM :
+ m_angularLimits[axis - 3].m_stopCFM = value;
+ m_flags |= BT_6DOF_FLAGS_CFM_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
+ break;
+ case BT_CONSTRAINT_CFM :
+ m_angularLimits[axis - 3].m_normalCFM = value;
+ m_flags |= BT_6DOF_FLAGS_CFM_NORM << (axis * BT_6DOF_FLAGS_AXIS_SHIFT);
+ break;
+ default :
+ btAssertConstrParams(0);
+ }
}
else
{
- m_equilibriumPoint[index + 3] = m_calculatedAxisAngleDiff[index];
+ btAssertConstrParams(0);
}
}
-
-
-void btGeneric6DofSpringConstraint::internalUpdateSprings(btConstraintInfo2* info)
+ ///return the local value of parameter
+btScalar btGeneric6DofConstraint::getParam(int num, int axis) const
{
- calculateTransforms();
- // it is assumed that calculateTransforms() have been called before this call
- int i;
- btVector3 relVel = m_rbB.getLinearVelocity() - m_rbA.getLinearVelocity();
- for(i = 0; i < 3; i++)
+ btScalar retVal = 0;
+ if((axis >= 0) && (axis < 3))
{
- if(m_springEnabled[i])
+ switch(num)
{
- // get current position of constraint
- btScalar currPos = m_calculatedLinearDiff[i];
- // calculate difference
- btScalar delta = currPos - m_equilibriumPoint[i];
- // spring force is (delta * m_stiffness) according to Hooke's Law
- btScalar force = delta * m_springStiffness[i];
- btScalar velFactor = info->fps * m_springDamping[i];
- m_linearLimits.m_targetVelocity[i] = velFactor * force;
- m_linearLimits.m_maxMotorForce[i] = btFabs(force) / info->fps;
+ case BT_CONSTRAINT_STOP_ERP :
+ btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_ERP_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
+ retVal = m_linearLimits.m_stopERP[axis];
+ break;
+ case BT_CONSTRAINT_STOP_CFM :
+ btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
+ retVal = m_linearLimits.m_stopCFM[axis];
+ break;
+ case BT_CONSTRAINT_CFM :
+ btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_NORM << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
+ retVal = m_linearLimits.m_normalCFM[axis];
+ break;
+ default :
+ btAssertConstrParams(0);
}
}
- for(i = 0; i < 3; i++)
+ else if((axis >=3) && (axis < 6))
{
- if(m_springEnabled[i + 3])
+ switch(num)
{
- // get current position of constraint
- btScalar currPos = m_calculatedAxisAngleDiff[i];
- // calculate difference
- btScalar delta = currPos - m_equilibriumPoint[i+3];
- // spring force is (-delta * m_stiffness) according to Hooke's Law
- btScalar force = -delta * m_springStiffness[i+3];
- btScalar velFactor = info->fps * m_springDamping[i+3];
- m_angularLimits[i].m_targetVelocity = velFactor * force;
- m_angularLimits[i].m_maxMotorForce = btFabs(force) / info->fps;
+ case BT_CONSTRAINT_STOP_ERP :
+ btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_ERP_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
+ retVal = m_angularLimits[axis - 3].m_stopERP;
+ break;
+ case BT_CONSTRAINT_STOP_CFM :
+ btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_STOP << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
+ retVal = m_angularLimits[axis - 3].m_stopCFM;
+ break;
+ case BT_CONSTRAINT_CFM :
+ btAssertConstrParams(m_flags & (BT_6DOF_FLAGS_CFM_NORM << (axis * BT_6DOF_FLAGS_AXIS_SHIFT)));
+ retVal = m_angularLimits[axis - 3].m_normalCFM;
+ break;
+ default :
+ btAssertConstrParams(0);
}
}
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ return retVal;
}
+
-void btGeneric6DofSpringConstraint::getInfo2(btConstraintInfo2* info)
+void btGeneric6DofConstraint::setAxis(const btVector3& axis1,const btVector3& axis2)
{
- // this will be called by constraint solver at the constraint setup stage
- // set current motor parameters
- internalUpdateSprings(info);
- // do the rest of job for constraint setup
- btGeneric6DofConstraint::getInfo2(info);
-}
-
-
-
-
+ btVector3 zAxis = axis1.normalized();
+ btVector3 yAxis = axis2.normalized();
+ btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
+
+ btTransform frameInW;
+ frameInW.setIdentity();
+ frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
+
+ // now get constraint frame in local coordinate systems
+ m_frameInA = m_rbA.getCenterOfMassTransform().inverse() * frameInW;
+ m_frameInB = m_rbB.getCenterOfMassTransform().inverse() * frameInW;
+
+ calculateTransforms();
+} \ No newline at end of file
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
index 8082eb1f132..4fdac113378 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
@@ -12,6 +12,10 @@ subject to the following restrictions:
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
+
+/// 2009 March: btGeneric6DofConstraint refactored by Roman Ponomarev
+/// Added support for generic constraint solver through getInfo1/getInfo2 methods
+
/*
2007-09-09
btGeneric6DofConstraint Refactored by Francisco Le?n
@@ -45,7 +49,9 @@ public:
btScalar m_maxLimitForce;//!< max force on limit
btScalar m_damping;//!< Damping.
btScalar m_limitSoftness;//! Relaxation factor
- btScalar m_ERP;//!< Error tolerance factor when joint is at limit
+ btScalar m_normalCFM;//!< Constraint force mixing factor
+ btScalar m_stopERP;//!< Error tolerance factor when joint is at limit
+ btScalar m_stopCFM;//!< Constraint force mixing factor when joint is at limit
btScalar m_bounce;//!< restitution factor
bool m_enableMotor;
@@ -65,9 +71,11 @@ public:
m_targetVelocity = 0;
m_maxMotorForce = 0.1f;
m_maxLimitForce = 300.0f;
- m_loLimit = -SIMD_INFINITY;
- m_hiLimit = SIMD_INFINITY;
- m_ERP = 0.5f;
+ m_loLimit = 1.0f;
+ m_hiLimit = -1.0f;
+ m_normalCFM = 0.f;
+ m_stopERP = 0.2f;
+ m_stopCFM = 0.f;
m_bounce = 0.0f;
m_damping = 1.0f;
m_limitSoftness = 0.5f;
@@ -83,7 +91,9 @@ public:
m_limitSoftness = limot.m_limitSoftness;
m_loLimit = limot.m_loLimit;
m_hiLimit = limot.m_hiLimit;
- m_ERP = limot.m_ERP;
+ m_normalCFM = limot.m_normalCFM;
+ m_stopERP = limot.m_stopERP;
+ m_stopCFM = limot.m_stopCFM;
m_bounce = limot.m_bounce;
m_currentLimit = limot.m_currentLimit;
m_currentLimitError = limot.m_currentLimitError;
@@ -113,7 +123,7 @@ public:
int testLimitValue(btScalar test_value);
//! apply the correction impulses for two bodies
- btScalar solveAngularLimits(btScalar timeStep,btVector3& axis, btScalar jacDiagABInv,btRigidBody * body0, btSolverBody& bodyA,btRigidBody * body1,btSolverBody& bodyB);
+ btScalar solveAngularLimits(btScalar timeStep,btVector3& axis, btScalar jacDiagABInv,btRigidBody * body0, btRigidBody * body1);
};
@@ -130,6 +140,9 @@ public:
btScalar m_limitSoftness;//!< Softness for linear limit
btScalar m_damping;//!< Damping for linear limit
btScalar m_restitution;//! Bounce parameter for linear limit
+ btVector3 m_normalCFM;//!< Constraint force mixing factor
+ btVector3 m_stopERP;//!< Error tolerance factor when joint is at limit
+ btVector3 m_stopCFM;//!< Constraint force mixing factor when joint is at limit
//!@}
bool m_enableMotor[3];
btVector3 m_targetVelocity;//!< target motor velocity
@@ -143,6 +156,9 @@ public:
m_lowerLimit.setValue(0.f,0.f,0.f);
m_upperLimit.setValue(0.f,0.f,0.f);
m_accumulatedImpulse.setValue(0.f,0.f,0.f);
+ m_normalCFM.setValue(0.f, 0.f, 0.f);
+ m_stopERP.setValue(0.2f, 0.2f, 0.2f);
+ m_stopCFM.setValue(0.f, 0.f, 0.f);
m_limitSoftness = 0.7f;
m_damping = btScalar(1.0f);
@@ -164,6 +180,10 @@ public:
m_limitSoftness = other.m_limitSoftness ;
m_damping = other.m_damping;
m_restitution = other.m_restitution;
+ m_normalCFM = other.m_normalCFM;
+ m_stopERP = other.m_stopERP;
+ m_stopCFM = other.m_stopCFM;
+
for(int i=0; i < 3; i++)
{
m_enableMotor[i] = other.m_enableMotor[i];
@@ -194,8 +214,8 @@ public:
btScalar solveLinearAxis(
btScalar timeStep,
btScalar jacDiagABInv,
- btRigidBody& body1,btSolverBody& bodyA,const btVector3 &pointInA,
- btRigidBody& body2,btSolverBody& bodyB,const btVector3 &pointInB,
+ btRigidBody& body1,const btVector3 &pointInA,
+ btRigidBody& body2,const btVector3 &pointInB,
int limit_index,
const btVector3 & axis_normal_on_a,
const btVector3 & anchorPos);
@@ -203,6 +223,15 @@ public:
};
+enum bt6DofFlags
+{
+ BT_6DOF_FLAGS_CFM_NORM = 1,
+ BT_6DOF_FLAGS_CFM_STOP = 2,
+ BT_6DOF_FLAGS_ERP_STOP = 4
+};
+#define BT_6DOF_FLAGS_AXIS_SHIFT 3 // bits per axis
+
+
/// btGeneric6DofConstraint between two rigidbodies each with a pivotpoint that descibes the axis location in local space
/*!
btGeneric6DofConstraint can leave any of the 6 degree of freedom 'free' or 'locked'.
@@ -217,20 +246,22 @@ This brings support for limit parameters and motors. </li>
<li> Angulars limits have these possible ranges:
<table border=1 >
-<tr
-
+<tr>
<td><b>AXIS</b></td>
<td><b>MIN ANGLE</b></td>
<td><b>MAX ANGLE</b></td>
+</tr><tr>
<td>X</td>
- <td>-PI</td>
- <td>PI</td>
+ <td>-PI</td>
+ <td>PI</td>
+</tr><tr>
<td>Y</td>
- <td>-PI/2</td>
- <td>PI/2</td>
+ <td>-PI/2</td>
+ <td>PI/2</td>
+</tr><tr>
<td>Z</td>
- <td>-PI/2</td>
- <td>PI/2</td>
+ <td>-PI</td>
+ <td>PI</td>
</tr>
</table>
</li>
@@ -274,11 +305,17 @@ protected:
btVector3 m_calculatedAxisAngleDiff;
btVector3 m_calculatedAxis[3];
btVector3 m_calculatedLinearDiff;
+ btScalar m_factA;
+ btScalar m_factB;
+ bool m_hasStaticBody;
btVector3 m_AnchorPos; // point betwen pivots of bodies A and B to solve linear axes
bool m_useLinearReferenceFrameA;
+ bool m_useOffsetForConstraintFrame;
+ int m_flags;
+
//!@}
btGeneric6DofConstraint& operator=(btGeneric6DofConstraint& other)
@@ -289,9 +326,9 @@ protected:
}
- int setAngularLimits(btConstraintInfo2 *info, int row_offset);
+ int setAngularLimits(btConstraintInfo2 *info, int row_offset,const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB);
- int setLinearLimits(btConstraintInfo2 *info);
+ int setLinearLimits(btConstraintInfo2 *info, int row, const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB);
void buildLinearJacobian(
btJacobianEntry & jacLinear,const btVector3 & normalWorld,
@@ -313,15 +350,16 @@ public:
bool m_useSolveConstraintObsolete;
btGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
-
- btGeneric6DofConstraint();
-
+ btGeneric6DofConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB);
+
//! Calcs global transform of the offsets
/*!
Calcs the global transform for the joint offset for body A an B, and also calcs the agle differences between the bodies.
\sa btGeneric6DofConstraint.getCalculatedTransformA , btGeneric6DofConstraint.getCalculatedTransformB, btGeneric6DofConstraint.calculateAngleInfo
*/
- void calculateTransforms();
+ void calculateTransforms(const btTransform& transA,const btTransform& transB);
+
+ void calculateTransforms();
//! Gets the global transform of the offset for body A
/*!
@@ -368,9 +406,12 @@ public:
virtual void getInfo1 (btConstraintInfo1* info);
+ void getInfo1NonVirtual (btConstraintInfo1* info);
+
virtual void getInfo2 (btConstraintInfo2* info);
- virtual void solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep);
+ void getInfo2NonVirtual (btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB);
+
void updateRHS(btScalar timeStep);
@@ -392,6 +433,7 @@ public:
*/
btScalar getRelativePivotPosition(int axis_index) const;
+ void setFrames(const btTransform & frameA, const btTransform & frameB);
//! Test angular limit.
/*!
@@ -405,25 +447,45 @@ public:
m_linearLimits.m_lowerLimit = linearLower;
}
- void setLinearUpperLimit(const btVector3& linearUpper)
- {
- m_linearLimits.m_upperLimit = linearUpper;
- }
+ void getLinearLowerLimit(btVector3& linearLower)
+ {
+ linearLower = m_linearLimits.m_lowerLimit;
+ }
+
+ void setLinearUpperLimit(const btVector3& linearUpper)
+ {
+ m_linearLimits.m_upperLimit = linearUpper;
+ }
+
+ void getLinearUpperLimit(btVector3& linearUpper)
+ {
+ linearUpper = m_linearLimits.m_upperLimit;
+ }
void setAngularLowerLimit(const btVector3& angularLower)
{
- m_angularLimits[0].m_loLimit = angularLower.getX();
- m_angularLimits[1].m_loLimit = angularLower.getY();
- m_angularLimits[2].m_loLimit = angularLower.getZ();
+ for(int i = 0; i < 3; i++)
+ m_angularLimits[i].m_loLimit = btNormalizeAngle(angularLower[i]);
}
+ void getAngularLowerLimit(btVector3& angularLower)
+ {
+ for(int i = 0; i < 3; i++)
+ angularLower[i] = m_angularLimits[i].m_loLimit;
+ }
+
void setAngularUpperLimit(const btVector3& angularUpper)
{
- m_angularLimits[0].m_hiLimit = angularUpper.getX();
- m_angularLimits[1].m_hiLimit = angularUpper.getY();
- m_angularLimits[2].m_hiLimit = angularUpper.getZ();
+ for(int i = 0; i < 3; i++)
+ m_angularLimits[i].m_hiLimit = btNormalizeAngle(angularUpper[i]);
}
+ void getAngularUpperLimit(btVector3& angularUpper)
+ {
+ for(int i = 0; i < 3; i++)
+ angularUpper[i] = m_angularLimits[i].m_hiLimit;
+ }
+
//! Retrieves the angular limit informacion
btRotationalLimitMotor * getRotationalLimitMotor(int index)
{
@@ -446,6 +508,8 @@ public:
}
else
{
+ lo = btNormalizeAngle(lo);
+ hi = btNormalizeAngle(hi);
m_angularLimits[axis-3].m_loLimit = lo;
m_angularLimits[axis-3].m_hiLimit = hi;
}
@@ -468,52 +532,83 @@ public:
return m_angularLimits[limitIndex-3].isLimited();
}
- const btRigidBody& getRigidBodyA() const
- {
- return m_rbA;
- }
- const btRigidBody& getRigidBodyB() const
- {
- return m_rbB;
- }
-
virtual void calcAnchorPos(void); // overridable
int get_limit_motor_info2( btRotationalLimitMotor * limot,
- btRigidBody * body0, btRigidBody * body1,
- btConstraintInfo2 *info, int row, btVector3& ax1, int rotational);
+ const btTransform& transA,const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB,const btVector3& angVelA,const btVector3& angVelB,
+ btConstraintInfo2 *info, int row, btVector3& ax1, int rotational, int rotAllowed = false);
+ // access for UseFrameOffset
+ bool getUseFrameOffset() { return m_useOffsetForConstraintFrame; }
+ void setUseFrameOffset(bool frameOffsetOnOff) { m_useOffsetForConstraintFrame = frameOffsetOnOff; }
-};
+ ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///If no axis is provided, it uses the default axis for this constraint.
+ virtual void setParam(int num, btScalar value, int axis = -1);
+ ///return the local value of parameter
+ virtual btScalar getParam(int num, int axis = -1) const;
+
+ void setAxis( const btVector3& axis1, const btVector3& axis2);
-/// Generic 6 DOF constraint that allows to set spring motors to any translational and rotational DOF
+ virtual int calculateSerializeBufferSize() const;
-/// DOF index used in enableSpring() and setStiffness() means:
-/// 0 : translation X
-/// 1 : translation Y
-/// 2 : translation Z
-/// 3 : rotation X (3rd Euler rotational around new position of X axis, range [-PI+epsilon, PI-epsilon] )
-/// 4 : rotation Y (2nd Euler rotational around new position of Y axis, range [-PI/2+epsilon, PI/2-epsilon] )
-/// 5 : rotation Z (1st Euler rotational around Z axis, range [-PI+epsilon, PI-epsilon] )
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
-class btGeneric6DofSpringConstraint : public btGeneric6DofConstraint
+
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btGeneric6DofConstraintData
{
-protected:
- bool m_springEnabled[6];
- btScalar m_equilibriumPoint[6];
- btScalar m_springStiffness[6];
- btScalar m_springDamping[6]; // between 0 and 1 (1 == no damping)
- void internalUpdateSprings(btConstraintInfo2* info);
-public:
- btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
- void enableSpring(int index, bool onOff);
- void setStiffness(int index, btScalar stiffness);
- void setDamping(int index, btScalar damping);
- void setEquilibriumPoint(); // set the current constraint position/orientation as an equilibrium point for all DOF
- void setEquilibriumPoint(int index); // set the current constraint position/orientation as an equilibrium point for given DOF
- virtual void getInfo2 (btConstraintInfo2* info);
+ btTypedConstraintData m_typeConstraintData;
+ btTransformFloatData m_rbAFrame; // constraint axii. Assumes z is hinge axis.
+ btTransformFloatData m_rbBFrame;
+
+ btVector3FloatData m_linearUpperLimit;
+ btVector3FloatData m_linearLowerLimit;
+
+ btVector3FloatData m_angularUpperLimit;
+ btVector3FloatData m_angularLowerLimit;
+
+ int m_useLinearReferenceFrameA;
+ int m_useOffsetForConstraintFrame;
};
+SIMD_FORCE_INLINE int btGeneric6DofConstraint::calculateSerializeBufferSize() const
+{
+ return sizeof(btGeneric6DofConstraintData);
+}
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btGeneric6DofConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+
+ btGeneric6DofConstraintData* dof = (btGeneric6DofConstraintData*)dataBuffer;
+ btTypedConstraint::serialize(&dof->m_typeConstraintData,serializer);
+
+ m_frameInA.serializeFloat(dof->m_rbAFrame);
+ m_frameInB.serializeFloat(dof->m_rbBFrame);
+
+
+ int i;
+ for (i=0;i<3;i++)
+ {
+ dof->m_angularLowerLimit.m_floats[i] = float(m_angularLimits[i].m_loLimit);
+ dof->m_angularUpperLimit.m_floats[i] = float(m_angularLimits[i].m_hiLimit);
+ dof->m_linearLowerLimit.m_floats[i] = float(m_linearLimits.m_lowerLimit[i]);
+ dof->m_linearUpperLimit.m_floats[i] = float(m_linearLimits.m_upperLimit[i]);
+ }
+
+ dof->m_useLinearReferenceFrameA = m_useLinearReferenceFrameA? 1 : 0;
+ dof->m_useOffsetForConstraintFrame = m_useOffsetForConstraintFrame ? 1 : 0;
+
+ return "btGeneric6DofConstraintData";
+}
+
+
+
+
#endif //GENERIC_6DOF_CONSTRAINT_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp
new file mode 100644
index 00000000000..d3503456625
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.cpp
@@ -0,0 +1,172 @@
+/*
+Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org
+Copyright (C) 2006, 2007 Sony Computer Entertainment Inc.
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#include "btGeneric6DofSpringConstraint.h"
+#include "BulletDynamics/Dynamics/btRigidBody.h"
+#include "LinearMath/btTransformUtil.h"
+
+
+btGeneric6DofSpringConstraint::btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA)
+ : btGeneric6DofConstraint(rbA, rbB, frameInA, frameInB, useLinearReferenceFrameA)
+{
+ m_objectType = D6_SPRING_CONSTRAINT_TYPE;
+
+ for(int i = 0; i < 6; i++)
+ {
+ m_springEnabled[i] = false;
+ m_equilibriumPoint[i] = btScalar(0.f);
+ m_springStiffness[i] = btScalar(0.f);
+ m_springDamping[i] = btScalar(1.f);
+ }
+}
+
+
+void btGeneric6DofSpringConstraint::enableSpring(int index, bool onOff)
+{
+ btAssert((index >= 0) && (index < 6));
+ m_springEnabled[index] = onOff;
+ if(index < 3)
+ {
+ m_linearLimits.m_enableMotor[index] = onOff;
+ }
+ else
+ {
+ m_angularLimits[index - 3].m_enableMotor = onOff;
+ }
+}
+
+
+
+void btGeneric6DofSpringConstraint::setStiffness(int index, btScalar stiffness)
+{
+ btAssert((index >= 0) && (index < 6));
+ m_springStiffness[index] = stiffness;
+}
+
+
+void btGeneric6DofSpringConstraint::setDamping(int index, btScalar damping)
+{
+ btAssert((index >= 0) && (index < 6));
+ m_springDamping[index] = damping;
+}
+
+
+void btGeneric6DofSpringConstraint::setEquilibriumPoint()
+{
+ calculateTransforms();
+ int i;
+
+ for( i = 0; i < 3; i++)
+ {
+ m_equilibriumPoint[i] = m_calculatedLinearDiff[i];
+ }
+ for(i = 0; i < 3; i++)
+ {
+ m_equilibriumPoint[i + 3] = m_calculatedAxisAngleDiff[i];
+ }
+}
+
+
+
+void btGeneric6DofSpringConstraint::setEquilibriumPoint(int index)
+{
+ btAssert((index >= 0) && (index < 6));
+ calculateTransforms();
+ if(index < 3)
+ {
+ m_equilibriumPoint[index] = m_calculatedLinearDiff[index];
+ }
+ else
+ {
+ m_equilibriumPoint[index] = m_calculatedAxisAngleDiff[index - 3];
+ }
+}
+
+void btGeneric6DofSpringConstraint::setEquilibriumPoint(int index, btScalar val)
+{
+ btAssert((index >= 0) && (index < 6));
+ m_equilibriumPoint[index] = val;
+}
+
+
+void btGeneric6DofSpringConstraint::internalUpdateSprings(btConstraintInfo2* info)
+{
+ // it is assumed that calculateTransforms() have been called before this call
+ int i;
+ btVector3 relVel = m_rbB.getLinearVelocity() - m_rbA.getLinearVelocity();
+ for(i = 0; i < 3; i++)
+ {
+ if(m_springEnabled[i])
+ {
+ // get current position of constraint
+ btScalar currPos = m_calculatedLinearDiff[i];
+ // calculate difference
+ btScalar delta = currPos - m_equilibriumPoint[i];
+ // spring force is (delta * m_stiffness) according to Hooke's Law
+ btScalar force = delta * m_springStiffness[i];
+ btScalar velFactor = info->fps * m_springDamping[i] / btScalar(info->m_numIterations);
+ m_linearLimits.m_targetVelocity[i] = velFactor * force;
+ m_linearLimits.m_maxMotorForce[i] = btFabs(force) / info->fps;
+ }
+ }
+ for(i = 0; i < 3; i++)
+ {
+ if(m_springEnabled[i + 3])
+ {
+ // get current position of constraint
+ btScalar currPos = m_calculatedAxisAngleDiff[i];
+ // calculate difference
+ btScalar delta = currPos - m_equilibriumPoint[i+3];
+ // spring force is (-delta * m_stiffness) according to Hooke's Law
+ btScalar force = -delta * m_springStiffness[i+3];
+ btScalar velFactor = info->fps * m_springDamping[i+3] / btScalar(info->m_numIterations);
+ m_angularLimits[i].m_targetVelocity = velFactor * force;
+ m_angularLimits[i].m_maxMotorForce = btFabs(force) / info->fps;
+ }
+ }
+}
+
+
+void btGeneric6DofSpringConstraint::getInfo2(btConstraintInfo2* info)
+{
+ // this will be called by constraint solver at the constraint setup stage
+ // set current motor parameters
+ internalUpdateSprings(info);
+ // do the rest of job for constraint setup
+ btGeneric6DofConstraint::getInfo2(info);
+}
+
+
+void btGeneric6DofSpringConstraint::setAxis(const btVector3& axis1,const btVector3& axis2)
+{
+ btVector3 zAxis = axis1.normalized();
+ btVector3 yAxis = axis2.normalized();
+ btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
+
+ btTransform frameInW;
+ frameInW.setIdentity();
+ frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
+
+ // now get constraint frame in local coordinate systems
+ m_frameInA = m_rbA.getCenterOfMassTransform().inverse() * frameInW;
+ m_frameInB = m_rbB.getCenterOfMassTransform().inverse() * frameInW;
+
+ calculateTransforms();
+}
+
+
+
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h
new file mode 100644
index 00000000000..16ff973e427
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h
@@ -0,0 +1,97 @@
+/*
+Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org
+Copyright (C) 2006, 2007 Sony Computer Entertainment Inc.
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef GENERIC_6DOF_SPRING_CONSTRAINT_H
+#define GENERIC_6DOF_SPRING_CONSTRAINT_H
+
+
+#include "LinearMath/btVector3.h"
+#include "btTypedConstraint.h"
+#include "btGeneric6DofConstraint.h"
+
+
+/// Generic 6 DOF constraint that allows to set spring motors to any translational and rotational DOF
+
+/// DOF index used in enableSpring() and setStiffness() means:
+/// 0 : translation X
+/// 1 : translation Y
+/// 2 : translation Z
+/// 3 : rotation X (3rd Euler rotational around new position of X axis, range [-PI+epsilon, PI-epsilon] )
+/// 4 : rotation Y (2nd Euler rotational around new position of Y axis, range [-PI/2+epsilon, PI/2-epsilon] )
+/// 5 : rotation Z (1st Euler rotational around Z axis, range [-PI+epsilon, PI-epsilon] )
+
+class btGeneric6DofSpringConstraint : public btGeneric6DofConstraint
+{
+protected:
+ bool m_springEnabled[6];
+ btScalar m_equilibriumPoint[6];
+ btScalar m_springStiffness[6];
+ btScalar m_springDamping[6]; // between 0 and 1 (1 == no damping)
+ void internalUpdateSprings(btConstraintInfo2* info);
+public:
+ btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
+ void enableSpring(int index, bool onOff);
+ void setStiffness(int index, btScalar stiffness);
+ void setDamping(int index, btScalar damping);
+ void setEquilibriumPoint(); // set the current constraint position/orientation as an equilibrium point for all DOF
+ void setEquilibriumPoint(int index); // set the current constraint position/orientation as an equilibrium point for given DOF
+ void setEquilibriumPoint(int index, btScalar val);
+
+ virtual void setAxis( const btVector3& axis1, const btVector3& axis2);
+
+ virtual void getInfo2 (btConstraintInfo2* info);
+
+ virtual int calculateSerializeBufferSize() const;
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+};
+
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btGeneric6DofSpringConstraintData
+{
+ btGeneric6DofConstraintData m_6dofData;
+
+ int m_springEnabled[6];
+ float m_equilibriumPoint[6];
+ float m_springStiffness[6];
+ float m_springDamping[6];
+};
+
+SIMD_FORCE_INLINE int btGeneric6DofSpringConstraint::calculateSerializeBufferSize() const
+{
+ return sizeof(btGeneric6DofSpringConstraintData);
+}
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btGeneric6DofSpringConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btGeneric6DofSpringConstraintData* dof = (btGeneric6DofSpringConstraintData*)dataBuffer;
+ btGeneric6DofConstraint::serialize(&dof->m_6dofData,serializer);
+
+ int i;
+ for (i=0;i<6;i++)
+ {
+ dof->m_equilibriumPoint[i] = m_equilibriumPoint[i];
+ dof->m_springDamping[i] = m_springDamping[i];
+ dof->m_springEnabled[i] = m_springEnabled[i]? 1 : 0;
+ dof->m_springStiffness[i] = m_springStiffness[i];
+ }
+ return "btGeneric6DofConstraintData";
+}
+
+#endif // GENERIC_6DOF_SPRING_CONSTRAINT_H
+
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp
new file mode 100644
index 00000000000..29123d526b4
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.cpp
@@ -0,0 +1,66 @@
+/*
+Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org
+Copyright (C) 2006, 2007 Sony Computer Entertainment Inc.
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+
+
+#include "btHinge2Constraint.h"
+#include "BulletDynamics/Dynamics/btRigidBody.h"
+#include "LinearMath/btTransformUtil.h"
+
+
+
+// constructor
+// anchor, axis1 and axis2 are in world coordinate system
+// axis1 must be orthogonal to axis2
+btHinge2Constraint::btHinge2Constraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2)
+: btGeneric6DofSpringConstraint(rbA, rbB, btTransform::getIdentity(), btTransform::getIdentity(), true),
+ m_anchor(anchor),
+ m_axis1(axis1),
+ m_axis2(axis2)
+{
+ // build frame basis
+ // 6DOF constraint uses Euler angles and to define limits
+ // it is assumed that rotational order is :
+ // Z - first, allowed limits are (-PI,PI);
+ // new position of Y - second (allowed limits are (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number
+ // used to prevent constraint from instability on poles;
+ // new position of X, allowed limits are (-PI,PI);
+ // So to simulate ODE Universal joint we should use parent axis as Z, child axis as Y and limit all other DOFs
+ // Build the frame in world coordinate system first
+ btVector3 zAxis = axis1.normalize();
+ btVector3 xAxis = axis2.normalize();
+ btVector3 yAxis = zAxis.cross(xAxis); // we want right coordinate system
+ btTransform frameInW;
+ frameInW.setIdentity();
+ frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
+ frameInW.setOrigin(anchor);
+ // now get constraint frame in local coordinate systems
+ m_frameInA = rbA.getCenterOfMassTransform().inverse() * frameInW;
+ m_frameInB = rbB.getCenterOfMassTransform().inverse() * frameInW;
+ // sei limits
+ setLinearLowerLimit(btVector3(0.f, 0.f, -1.f));
+ setLinearUpperLimit(btVector3(0.f, 0.f, 1.f));
+ // like front wheels of a car
+ setAngularLowerLimit(btVector3(1.f, 0.f, -SIMD_HALF_PI * 0.5f));
+ setAngularUpperLimit(btVector3(-1.f, 0.f, SIMD_HALF_PI * 0.5f));
+ // enable suspension
+ enableSpring(2, true);
+ setStiffness(2, SIMD_PI * SIMD_PI * 4.f); // period 1 sec for 1 kilogramm weel :-)
+ setDamping(2, 0.01f);
+ setEquilibriumPoint();
+}
+
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h
new file mode 100644
index 00000000000..15fd4a014cc
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHinge2Constraint.h
@@ -0,0 +1,58 @@
+/*
+Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org
+Copyright (C) 2006, 2007 Sony Computer Entertainment Inc.
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef HINGE2_CONSTRAINT_H
+#define HINGE2_CONSTRAINT_H
+
+
+
+#include "LinearMath/btVector3.h"
+#include "btTypedConstraint.h"
+#include "btGeneric6DofSpringConstraint.h"
+
+
+
+// Constraint similar to ODE Hinge2 Joint
+// has 3 degrees of frredom:
+// 2 rotational degrees of freedom, similar to Euler rotations around Z (axis 1) and X (axis 2)
+// 1 translational (along axis Z) with suspension spring
+
+class btHinge2Constraint : public btGeneric6DofSpringConstraint
+{
+protected:
+ btVector3 m_anchor;
+ btVector3 m_axis1;
+ btVector3 m_axis2;
+public:
+ // constructor
+ // anchor, axis1 and axis2 are in world coordinate system
+ // axis1 must be orthogonal to axis2
+ btHinge2Constraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2);
+ // access
+ const btVector3& getAnchor() { return m_calculatedTransformA.getOrigin(); }
+ const btVector3& getAnchor2() { return m_calculatedTransformB.getOrigin(); }
+ const btVector3& getAxis1() { return m_axis1; }
+ const btVector3& getAxis2() { return m_axis2; }
+ btScalar getAngle1() { return getAngle(2); }
+ btScalar getAngle2() { return getAngle(0); }
+ // limits
+ void setUpperLimit(btScalar ang1max) { setAngularUpperLimit(btVector3(-1.f, 0.f, ang1max)); }
+ void setLowerLimit(btScalar ang1min) { setAngularLowerLimit(btVector3( 1.f, 0.f, ang1min)); }
+};
+
+
+
+#endif // HINGE2_CONSTRAINT_H
+
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
index b6b34305804..144beef1cd6 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
@@ -21,31 +21,31 @@ subject to the following restrictions:
#include <new>
#include "btSolverBody.h"
-//-----------------------------------------------------------------------------
+
+//#define HINGE_USE_OBSOLETE_SOLVER false
#define HINGE_USE_OBSOLETE_SOLVER false
-//-----------------------------------------------------------------------------
+#define HINGE_USE_FRAME_OFFSET true
+
+#ifndef __SPU__
+
-btHingeConstraint::btHingeConstraint()
-: btTypedConstraint (HINGE_CONSTRAINT_TYPE),
-m_enableAngularMotor(false),
-m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
-m_useReferenceFrameA(false)
-{
- m_referenceSign = m_useReferenceFrameA ? btScalar(-1.f) : btScalar(1.f);
-}
-//-----------------------------------------------------------------------------
btHingeConstraint::btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB,
- btVector3& axisInA,btVector3& axisInB, bool useReferenceFrameA)
+ const btVector3& axisInA,const btVector3& axisInB, bool useReferenceFrameA)
:btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA,rbB),
m_angularOnly(false),
m_enableAngularMotor(false),
m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
- m_useReferenceFrameA(useReferenceFrameA)
+ m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
+ m_useReferenceFrameA(useReferenceFrameA),
+ m_flags(0)
+#ifdef _BT_USE_CENTER_LIMIT_
+ ,m_limit()
+#endif
{
m_rbAFrame.getOrigin() = pivotInA;
@@ -78,22 +78,29 @@ btHingeConstraint::btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const bt
rbAxisB1.getY(),rbAxisB2.getY(),axisInB.getY(),
rbAxisB1.getZ(),rbAxisB2.getZ(),axisInB.getZ() );
+#ifndef _BT_USE_CENTER_LIMIT_
//start with free
- m_lowerLimit = btScalar(1e30);
- m_upperLimit = btScalar(-1e30);
+ m_lowerLimit = btScalar(1.0f);
+ m_upperLimit = btScalar(-1.0f);
m_biasFactor = 0.3f;
m_relaxationFactor = 1.0f;
m_limitSoftness = 0.9f;
m_solveLimit = false;
+#endif
m_referenceSign = m_useReferenceFrameA ? btScalar(-1.f) : btScalar(1.f);
}
-//-----------------------------------------------------------------------------
-btHingeConstraint::btHingeConstraint(btRigidBody& rbA,const btVector3& pivotInA,btVector3& axisInA, bool useReferenceFrameA)
+
+btHingeConstraint::btHingeConstraint(btRigidBody& rbA,const btVector3& pivotInA,const btVector3& axisInA, bool useReferenceFrameA)
:btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA), m_angularOnly(false), m_enableAngularMotor(false),
m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
-m_useReferenceFrameA(useReferenceFrameA)
+m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
+m_useReferenceFrameA(useReferenceFrameA),
+m_flags(0)
+#ifdef _BT_USE_CENTER_LIMIT_
+,m_limit()
+#endif
{
// since no frame is given, assume this to be zero angle and just pick rb transform axis
@@ -118,17 +125,19 @@ m_useReferenceFrameA(useReferenceFrameA)
rbAxisB1.getY(),rbAxisB2.getY(),axisInB.getY(),
rbAxisB1.getZ(),rbAxisB2.getZ(),axisInB.getZ() );
+#ifndef _BT_USE_CENTER_LIMIT_
//start with free
- m_lowerLimit = btScalar(1e30);
- m_upperLimit = btScalar(-1e30);
+ m_lowerLimit = btScalar(1.0f);
+ m_upperLimit = btScalar(-1.0f);
m_biasFactor = 0.3f;
m_relaxationFactor = 1.0f;
m_limitSoftness = 0.9f;
m_solveLimit = false;
+#endif
m_referenceSign = m_useReferenceFrameA ? btScalar(-1.f) : btScalar(1.f);
}
-//-----------------------------------------------------------------------------
+
btHingeConstraint::btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB,
const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA)
@@ -136,48 +145,62 @@ btHingeConstraint::btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB,
m_angularOnly(false),
m_enableAngularMotor(false),
m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
-m_useReferenceFrameA(useReferenceFrameA)
+m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
+m_useReferenceFrameA(useReferenceFrameA),
+m_flags(0)
+#ifdef _BT_USE_CENTER_LIMIT_
+,m_limit()
+#endif
{
+#ifndef _BT_USE_CENTER_LIMIT_
//start with free
- m_lowerLimit = btScalar(1e30);
- m_upperLimit = btScalar(-1e30);
+ m_lowerLimit = btScalar(1.0f);
+ m_upperLimit = btScalar(-1.0f);
m_biasFactor = 0.3f;
m_relaxationFactor = 1.0f;
m_limitSoftness = 0.9f;
m_solveLimit = false;
+#endif
m_referenceSign = m_useReferenceFrameA ? btScalar(-1.f) : btScalar(1.f);
}
-//-----------------------------------------------------------------------------
+
btHingeConstraint::btHingeConstraint(btRigidBody& rbA, const btTransform& rbAFrame, bool useReferenceFrameA)
:btTypedConstraint(HINGE_CONSTRAINT_TYPE, rbA),m_rbAFrame(rbAFrame),m_rbBFrame(rbAFrame),
m_angularOnly(false),
m_enableAngularMotor(false),
m_useSolveConstraintObsolete(HINGE_USE_OBSOLETE_SOLVER),
-m_useReferenceFrameA(useReferenceFrameA)
+m_useOffsetForConstraintFrame(HINGE_USE_FRAME_OFFSET),
+m_useReferenceFrameA(useReferenceFrameA),
+m_flags(0)
+#ifdef _BT_USE_CENTER_LIMIT_
+,m_limit()
+#endif
{
///not providing rigidbody B means implicitly using worldspace for body B
m_rbBFrame.getOrigin() = m_rbA.getCenterOfMassTransform()(m_rbAFrame.getOrigin());
-
+#ifndef _BT_USE_CENTER_LIMIT_
//start with free
- m_lowerLimit = btScalar(1e30);
- m_upperLimit = btScalar(-1e30);
+ m_lowerLimit = btScalar(1.0f);
+ m_upperLimit = btScalar(-1.0f);
m_biasFactor = 0.3f;
m_relaxationFactor = 1.0f;
m_limitSoftness = 0.9f;
m_solveLimit = false;
+#endif
m_referenceSign = m_useReferenceFrameA ? btScalar(-1.f) : btScalar(1.f);
}
-//-----------------------------------------------------------------------------
+
void btHingeConstraint::buildJacobian()
{
if (m_useSolveConstraintObsolete)
{
m_appliedImpulse = btScalar(0.);
+ m_accMotorImpulse = btScalar(0.);
if (!m_angularOnly)
{
@@ -221,7 +244,6 @@ void btHingeConstraint::buildJacobian()
btPlaneSpace1(m_rbAFrame.getBasis().getColumn(2),jointAxis0local,jointAxis1local);
- getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(2);
btVector3 jointAxis0 = getRigidBodyA().getCenterOfMassTransform().getBasis() * jointAxis0local;
btVector3 jointAxis1 = getRigidBodyA().getCenterOfMassTransform().getBasis() * jointAxis1local;
btVector3 hingeAxisWorld = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(2);
@@ -248,7 +270,7 @@ void btHingeConstraint::buildJacobian()
m_accLimitImpulse = btScalar(0.);
// test angular limit
- testLimit();
+ testLimit(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
//Compute K = J*W*J' for hinge axis
btVector3 axisA = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(2);
@@ -258,7 +280,9 @@ void btHingeConstraint::buildJacobian()
}
}
-//-----------------------------------------------------------------------------
+
+#endif //__SPU__
+
void btHingeConstraint::getInfo1(btConstraintInfo1* info)
{
@@ -271,53 +295,123 @@ void btHingeConstraint::getInfo1(btConstraintInfo1* info)
{
info->m_numConstraintRows = 5; // Fixed 3 linear + 2 angular
info->nub = 1;
+ //always add the row, to avoid computation (data is not available yet)
//prepare constraint
- testLimit();
+ testLimit(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
if(getSolveLimit() || getEnableAngularMotor())
{
info->m_numConstraintRows++; // limit 3rd anguar as well
info->nub--;
}
+
}
-} // btHingeConstraint::getInfo1 ()
+}
-//-----------------------------------------------------------------------------
+void btHingeConstraint::getInfo1NonVirtual(btConstraintInfo1* info)
+{
+ if (m_useSolveConstraintObsolete)
+ {
+ info->m_numConstraintRows = 0;
+ info->nub = 0;
+ }
+ else
+ {
+ //always add the 'limit' row, to avoid computation (data is not available yet)
+ info->m_numConstraintRows = 6; // Fixed 3 linear + 2 angular
+ info->nub = 0;
+ }
+}
void btHingeConstraint::getInfo2 (btConstraintInfo2* info)
{
+ if(m_useOffsetForConstraintFrame)
+ {
+ getInfo2InternalUsingFrameOffset(info, m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(),m_rbA.getAngularVelocity(),m_rbB.getAngularVelocity());
+ }
+ else
+ {
+ getInfo2Internal(info, m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(),m_rbA.getAngularVelocity(),m_rbB.getAngularVelocity());
+ }
+}
+
+
+void btHingeConstraint::getInfo2NonVirtual (btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btVector3& angVelA,const btVector3& angVelB)
+{
+ ///the regular (virtual) implementation getInfo2 already performs 'testLimit' during getInfo1, so we need to do it now
+ testLimit(transA,transB);
+
+ getInfo2Internal(info,transA,transB,angVelA,angVelB);
+}
+
+
+void btHingeConstraint::getInfo2Internal(btConstraintInfo2* info, const btTransform& transA,const btTransform& transB,const btVector3& angVelA,const btVector3& angVelB)
+{
+
btAssert(!m_useSolveConstraintObsolete);
- int i, s = info->rowskip;
+ int i, skip = info->rowskip;
// transforms in world space
- btTransform trA = m_rbA.getCenterOfMassTransform()*m_rbAFrame;
- btTransform trB = m_rbB.getCenterOfMassTransform()*m_rbBFrame;
+ btTransform trA = transA*m_rbAFrame;
+ btTransform trB = transB*m_rbBFrame;
// pivot point
btVector3 pivotAInW = trA.getOrigin();
btVector3 pivotBInW = trB.getOrigin();
+#if 0
+ if (0)
+ {
+ for (i=0;i<6;i++)
+ {
+ info->m_J1linearAxis[i*skip]=0;
+ info->m_J1linearAxis[i*skip+1]=0;
+ info->m_J1linearAxis[i*skip+2]=0;
+
+ info->m_J1angularAxis[i*skip]=0;
+ info->m_J1angularAxis[i*skip+1]=0;
+ info->m_J1angularAxis[i*skip+2]=0;
+
+ info->m_J2angularAxis[i*skip]=0;
+ info->m_J2angularAxis[i*skip+1]=0;
+ info->m_J2angularAxis[i*skip+2]=0;
+
+ info->m_constraintError[i*skip]=0.f;
+ }
+ }
+#endif //#if 0
// linear (all fixed)
- info->m_J1linearAxis[0] = 1;
- info->m_J1linearAxis[s + 1] = 1;
- info->m_J1linearAxis[2 * s + 2] = 1;
- btVector3 a1 = pivotAInW - m_rbA.getCenterOfMassTransform().getOrigin();
+
+ if (!m_angularOnly)
+ {
+ info->m_J1linearAxis[0] = 1;
+ info->m_J1linearAxis[skip + 1] = 1;
+ info->m_J1linearAxis[2 * skip + 2] = 1;
+ }
+
+
+
+
+ btVector3 a1 = pivotAInW - transA.getOrigin();
{
btVector3* angular0 = (btVector3*)(info->m_J1angularAxis);
- btVector3* angular1 = (btVector3*)(info->m_J1angularAxis + s);
- btVector3* angular2 = (btVector3*)(info->m_J1angularAxis + 2 * s);
+ btVector3* angular1 = (btVector3*)(info->m_J1angularAxis + skip);
+ btVector3* angular2 = (btVector3*)(info->m_J1angularAxis + 2 * skip);
btVector3 a1neg = -a1;
a1neg.getSkewSymmetricMatrix(angular0,angular1,angular2);
}
- btVector3 a2 = pivotBInW - m_rbB.getCenterOfMassTransform().getOrigin();
+ btVector3 a2 = pivotBInW - transB.getOrigin();
{
btVector3* angular0 = (btVector3*)(info->m_J2angularAxis);
- btVector3* angular1 = (btVector3*)(info->m_J2angularAxis + s);
- btVector3* angular2 = (btVector3*)(info->m_J2angularAxis + 2 * s);
+ btVector3* angular1 = (btVector3*)(info->m_J2angularAxis + skip);
+ btVector3* angular2 = (btVector3*)(info->m_J2angularAxis + 2 * skip);
a2.getSkewSymmetricMatrix(angular0,angular1,angular2);
}
// linear RHS
btScalar k = info->fps * info->erp;
- for(i = 0; i < 3; i++)
- {
- info->m_constraintError[i * s] = k * (pivotBInW[i] - pivotAInW[i]);
- }
+ if (!m_angularOnly)
+ {
+ for(i = 0; i < 3; i++)
+ {
+ info->m_constraintError[i * skip] = k * (pivotBInW[i] - pivotAInW[i]);
+ }
+ }
// make rotations around X and Y equal
// the hinge axis should be the only unconstrained
// rotational axis, the angular velocity of the two bodies perpendicular to
@@ -374,8 +468,13 @@ void btHingeConstraint::getInfo2 (btConstraintInfo2* info)
int limit = 0;
if(getSolveLimit())
{
- limit_err = m_correction * m_referenceSign;
- limit = (limit_err > btScalar(0.0)) ? 1 : 2;
+#ifdef _BT_USE_CENTER_LIMIT_
+ limit_err = m_limit.getCorrection() * m_referenceSign;
+#else
+ limit_err = m_correction * m_referenceSign;
+#endif
+ limit = (limit_err > btScalar(0.0)) ? 1 : 2;
+
}
// if the hinge has joint limits or motor, add in the extra row
int powered = 0;
@@ -402,19 +501,26 @@ void btHingeConstraint::getInfo2 (btConstraintInfo2* info)
powered = 0;
}
info->m_constraintError[srow] = btScalar(0.0f);
+ btScalar currERP = (m_flags & BT_HINGE_FLAGS_ERP_STOP) ? m_stopERP : info->erp;
if(powered)
{
- info->cfm[srow] = btScalar(0.0);
- btScalar mot_fact = getMotorFactor(m_hingeAngle, lostop, histop, m_motorTargetVelocity, info->fps * info->erp);
+ if(m_flags & BT_HINGE_FLAGS_CFM_NORM)
+ {
+ info->cfm[srow] = m_normalCFM;
+ }
+ btScalar mot_fact = getMotorFactor(m_hingeAngle, lostop, histop, m_motorTargetVelocity, info->fps * currERP);
info->m_constraintError[srow] += mot_fact * m_motorTargetVelocity * m_referenceSign;
info->m_lowerLimit[srow] = - m_maxMotorImpulse;
info->m_upperLimit[srow] = m_maxMotorImpulse;
}
if(limit)
{
- k = info->fps * info->erp;
+ k = info->fps * currERP;
info->m_constraintError[srow] += k * limit_err;
- info->cfm[srow] = btScalar(0.0);
+ if(m_flags & BT_HINGE_FLAGS_CFM_STOP)
+ {
+ info->cfm[srow] = m_stopCFM;
+ }
if(lostop == histop)
{
// limited low and high simultaneously
@@ -432,11 +538,15 @@ void btHingeConstraint::getInfo2 (btConstraintInfo2* info)
info->m_upperLimit[srow] = 0;
}
// bounce (we'll use slider parameter abs(1.0 - m_dampingLimAng) for that)
+#ifdef _BT_USE_CENTER_LIMIT_
+ btScalar bounce = m_limit.getRelaxationFactor();
+#else
btScalar bounce = m_relaxationFactor;
+#endif
if(bounce > btScalar(0.0))
{
- btScalar vel = m_rbA.getAngularVelocity().dot(ax1);
- vel -= m_rbB.getAngularVelocity().dot(ax1);
+ btScalar vel = angVelA.dot(ax1);
+ vel -= angVelB.dot(ax1);
// only apply bounce if the velocity is incoming, and if the
// resulting c[] exceeds what we already have.
if(limit == 1)
@@ -462,160 +572,23 @@ void btHingeConstraint::getInfo2 (btConstraintInfo2* info)
}
}
}
+#ifdef _BT_USE_CENTER_LIMIT_
+ info->m_constraintError[srow] *= m_limit.getBiasFactor();
+#else
info->m_constraintError[srow] *= m_biasFactor;
+#endif
} // if(limit)
} // if angular limit or powered
}
-//-----------------------------------------------------------------------------
-void btHingeConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep)
+void btHingeConstraint::setFrames(const btTransform & frameA, const btTransform & frameB)
{
-
- ///for backwards compatibility during the transition to 'getInfo/getInfo2'
- if (m_useSolveConstraintObsolete)
- {
-
- btVector3 pivotAInW = m_rbA.getCenterOfMassTransform()*m_rbAFrame.getOrigin();
- btVector3 pivotBInW = m_rbB.getCenterOfMassTransform()*m_rbBFrame.getOrigin();
-
- btScalar tau = btScalar(0.3);
-
- //linear part
- if (!m_angularOnly)
- {
- btVector3 rel_pos1 = pivotAInW - m_rbA.getCenterOfMassPosition();
- btVector3 rel_pos2 = pivotBInW - m_rbB.getCenterOfMassPosition();
-
- btVector3 vel1,vel2;
- bodyA.getVelocityInLocalPointObsolete(rel_pos1,vel1);
- bodyB.getVelocityInLocalPointObsolete(rel_pos2,vel2);
- btVector3 vel = vel1 - vel2;
-
- for (int i=0;i<3;i++)
- {
- const btVector3& normal = m_jac[i].m_linearJointAxis;
- btScalar jacDiagABInv = btScalar(1.) / m_jac[i].getDiagonal();
-
- btScalar rel_vel;
- rel_vel = normal.dot(vel);
- //positional error (zeroth order error)
- btScalar depth = -(pivotAInW - pivotBInW).dot(normal); //this is the error projected on the normal
- btScalar impulse = depth*tau/timeStep * jacDiagABInv - rel_vel * jacDiagABInv;
- m_appliedImpulse += impulse;
- btVector3 impulse_vector = normal * impulse;
- btVector3 ftorqueAxis1 = rel_pos1.cross(normal);
- btVector3 ftorqueAxis2 = rel_pos2.cross(normal);
- bodyA.applyImpulse(normal*m_rbA.getInvMass(), m_rbA.getInvInertiaTensorWorld()*ftorqueAxis1,impulse);
- bodyB.applyImpulse(normal*m_rbB.getInvMass(), m_rbB.getInvInertiaTensorWorld()*ftorqueAxis2,-impulse);
- }
- }
-
-
- {
- ///solve angular part
-
- // get axes in world space
- btVector3 axisA = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(2);
- btVector3 axisB = getRigidBodyB().getCenterOfMassTransform().getBasis() * m_rbBFrame.getBasis().getColumn(2);
-
- btVector3 angVelA;
- bodyA.getAngularVelocity(angVelA);
- btVector3 angVelB;
- bodyB.getAngularVelocity(angVelB);
-
- btVector3 angVelAroundHingeAxisA = axisA * axisA.dot(angVelA);
- btVector3 angVelAroundHingeAxisB = axisB * axisB.dot(angVelB);
-
- btVector3 angAorthog = angVelA - angVelAroundHingeAxisA;
- btVector3 angBorthog = angVelB - angVelAroundHingeAxisB;
- btVector3 velrelOrthog = angAorthog-angBorthog;
- {
-
-
- //solve orthogonal angular velocity correction
- btScalar relaxation = btScalar(1.);
- btScalar len = velrelOrthog.length();
- if (len > btScalar(0.00001))
- {
- btVector3 normal = velrelOrthog.normalized();
- btScalar denom = getRigidBodyA().computeAngularImpulseDenominator(normal) +
- getRigidBodyB().computeAngularImpulseDenominator(normal);
- // scale for mass and relaxation
- //velrelOrthog *= (btScalar(1.)/denom) * m_relaxationFactor;
-
- bodyA.applyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*velrelOrthog,-(btScalar(1.)/denom));
- bodyB.applyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*velrelOrthog,(btScalar(1.)/denom));
-
- }
-
- //solve angular positional correction
- btVector3 angularError = axisA.cross(axisB) *(btScalar(1.)/timeStep);
- btScalar len2 = angularError.length();
- if (len2>btScalar(0.00001))
- {
- btVector3 normal2 = angularError.normalized();
- btScalar denom2 = getRigidBodyA().computeAngularImpulseDenominator(normal2) +
- getRigidBodyB().computeAngularImpulseDenominator(normal2);
- //angularError *= (btScalar(1.)/denom2) * relaxation;
-
- bodyA.applyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*angularError,(btScalar(1.)/denom2));
- bodyB.applyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*angularError,-(btScalar(1.)/denom2));
-
- }
-
-
-
-
-
- // solve limit
- if (m_solveLimit)
- {
- btScalar amplitude = ( (angVelB - angVelA).dot( axisA )*m_relaxationFactor + m_correction* (btScalar(1.)/timeStep)*m_biasFactor ) * m_limitSign;
-
- btScalar impulseMag = amplitude * m_kHinge;
-
- // Clamp the accumulated impulse
- btScalar temp = m_accLimitImpulse;
- m_accLimitImpulse = btMax(m_accLimitImpulse + impulseMag, btScalar(0) );
- impulseMag = m_accLimitImpulse - temp;
-
-
-
- bodyA.applyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*axisA,impulseMag * m_limitSign);
- bodyB.applyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*axisA,-(impulseMag * m_limitSign));
-
- }
- }
-
- //apply motor
- if (m_enableAngularMotor)
- {
- //todo: add limits too
- btVector3 angularLimit(0,0,0);
-
- btVector3 velrel = angVelAroundHingeAxisA - angVelAroundHingeAxisB;
- btScalar projRelVel = velrel.dot(axisA);
-
- btScalar desiredMotorVel = m_motorTargetVelocity;
- btScalar motor_relvel = desiredMotorVel - projRelVel;
-
- btScalar unclippedMotorImpulse = m_kHinge * motor_relvel;;
- //todo: should clip against accumulated impulse
- btScalar clippedMotorImpulse = unclippedMotorImpulse > m_maxMotorImpulse ? m_maxMotorImpulse : unclippedMotorImpulse;
- clippedMotorImpulse = clippedMotorImpulse < -m_maxMotorImpulse ? -m_maxMotorImpulse : clippedMotorImpulse;
- btVector3 motorImp = clippedMotorImpulse * axisA;
-
- bodyA.applyImpulse(btVector3(0,0,0), m_rbA.getInvInertiaTensorWorld()*axisA,clippedMotorImpulse);
- bodyB.applyImpulse(btVector3(0,0,0), m_rbB.getInvInertiaTensorWorld()*axisA,-clippedMotorImpulse);
-
- }
- }
- }
-
+ m_rbAFrame = frameA;
+ m_rbBFrame = frameB;
+ buildJacobian();
}
-//-----------------------------------------------------------------------------
void btHingeConstraint::updateRHS(btScalar timeStep)
{
@@ -623,28 +596,37 @@ void btHingeConstraint::updateRHS(btScalar timeStep)
}
-//-----------------------------------------------------------------------------
btScalar btHingeConstraint::getHingeAngle()
{
- const btVector3 refAxis0 = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(0);
- const btVector3 refAxis1 = getRigidBodyA().getCenterOfMassTransform().getBasis() * m_rbAFrame.getBasis().getColumn(1);
- const btVector3 swingAxis = getRigidBodyB().getCenterOfMassTransform().getBasis() * m_rbBFrame.getBasis().getColumn(1);
- btScalar angle = btAtan2Fast(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1));
+ return getHingeAngle(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+}
+
+btScalar btHingeConstraint::getHingeAngle(const btTransform& transA,const btTransform& transB)
+{
+ const btVector3 refAxis0 = transA.getBasis() * m_rbAFrame.getBasis().getColumn(0);
+ const btVector3 refAxis1 = transA.getBasis() * m_rbAFrame.getBasis().getColumn(1);
+ const btVector3 swingAxis = transB.getBasis() * m_rbBFrame.getBasis().getColumn(1);
+// btScalar angle = btAtan2Fast(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1));
+ btScalar angle = btAtan2(swingAxis.dot(refAxis0), swingAxis.dot(refAxis1));
return m_referenceSign * angle;
}
-//-----------------------------------------------------------------------------
-void btHingeConstraint::testLimit()
+
+void btHingeConstraint::testLimit(const btTransform& transA,const btTransform& transB)
{
// Compute limit information
- m_hingeAngle = getHingeAngle();
+ m_hingeAngle = getHingeAngle(transA,transB);
+#ifdef _BT_USE_CENTER_LIMIT_
+ m_limit.test(m_hingeAngle);
+#else
m_correction = btScalar(0.);
m_limitSign = btScalar(0.);
m_solveLimit = false;
if (m_lowerLimit <= m_upperLimit)
{
+ m_hingeAngle = btAdjustAngleToLimits(m_hingeAngle, m_lowerLimit, m_upperLimit);
if (m_hingeAngle <= m_lowerLimit)
{
m_correction = (m_lowerLimit - m_hingeAngle);
@@ -658,9 +640,394 @@ void btHingeConstraint::testLimit()
m_solveLimit = true;
}
}
+#endif
return;
-} // btHingeConstraint::testLimit()
+}
+
+
+static btVector3 vHinge(0, 0, btScalar(1));
+
+void btHingeConstraint::setMotorTarget(const btQuaternion& qAinB, btScalar dt)
+{
+ // convert target from body to constraint space
+ btQuaternion qConstraint = m_rbBFrame.getRotation().inverse() * qAinB * m_rbAFrame.getRotation();
+ qConstraint.normalize();
+
+ // extract "pure" hinge component
+ btVector3 vNoHinge = quatRotate(qConstraint, vHinge); vNoHinge.normalize();
+ btQuaternion qNoHinge = shortestArcQuat(vHinge, vNoHinge);
+ btQuaternion qHinge = qNoHinge.inverse() * qConstraint;
+ qHinge.normalize();
+
+ // compute angular target, clamped to limits
+ btScalar targetAngle = qHinge.getAngle();
+ if (targetAngle > SIMD_PI) // long way around. flip quat and recalculate.
+ {
+ qHinge = operator-(qHinge);
+ targetAngle = qHinge.getAngle();
+ }
+ if (qHinge.getZ() < 0)
+ targetAngle = -targetAngle;
+
+ setMotorTarget(targetAngle, dt);
+}
+
+void btHingeConstraint::setMotorTarget(btScalar targetAngle, btScalar dt)
+{
+#ifdef _BT_USE_CENTER_LIMIT_
+ m_limit.fit(targetAngle);
+#else
+ if (m_lowerLimit < m_upperLimit)
+ {
+ if (targetAngle < m_lowerLimit)
+ targetAngle = m_lowerLimit;
+ else if (targetAngle > m_upperLimit)
+ targetAngle = m_upperLimit;
+ }
+#endif
+ // compute angular velocity
+ btScalar curAngle = getHingeAngle(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ btScalar dAngle = targetAngle - curAngle;
+ m_motorTargetVelocity = dAngle / dt;
+}
+
+
+
+void btHingeConstraint::getInfo2InternalUsingFrameOffset(btConstraintInfo2* info, const btTransform& transA,const btTransform& transB,const btVector3& angVelA,const btVector3& angVelB)
+{
+ btAssert(!m_useSolveConstraintObsolete);
+ int i, s = info->rowskip;
+ // transforms in world space
+ btTransform trA = transA*m_rbAFrame;
+ btTransform trB = transB*m_rbBFrame;
+ // pivot point
+ btVector3 pivotAInW = trA.getOrigin();
+ btVector3 pivotBInW = trB.getOrigin();
+#if 1
+ // difference between frames in WCS
+ btVector3 ofs = trB.getOrigin() - trA.getOrigin();
+ // now get weight factors depending on masses
+ btScalar miA = getRigidBodyA().getInvMass();
+ btScalar miB = getRigidBodyB().getInvMass();
+ bool hasStaticBody = (miA < SIMD_EPSILON) || (miB < SIMD_EPSILON);
+ btScalar miS = miA + miB;
+ btScalar factA, factB;
+ if(miS > btScalar(0.f))
+ {
+ factA = miB / miS;
+ }
+ else
+ {
+ factA = btScalar(0.5f);
+ }
+ factB = btScalar(1.0f) - factA;
+ // get the desired direction of hinge axis
+ // as weighted sum of Z-orthos of frameA and frameB in WCS
+ btVector3 ax1A = trA.getBasis().getColumn(2);
+ btVector3 ax1B = trB.getBasis().getColumn(2);
+ btVector3 ax1 = ax1A * factA + ax1B * factB;
+ ax1.normalize();
+ // fill first 3 rows
+ // we want: velA + wA x relA == velB + wB x relB
+ btTransform bodyA_trans = transA;
+ btTransform bodyB_trans = transB;
+ int s0 = 0;
+ int s1 = s;
+ int s2 = s * 2;
+ int nrow = 2; // last filled row
+ btVector3 tmpA, tmpB, relA, relB, p, q;
+ // get vector from bodyB to frameB in WCS
+ relB = trB.getOrigin() - bodyB_trans.getOrigin();
+ // get its projection to hinge axis
+ btVector3 projB = ax1 * relB.dot(ax1);
+ // get vector directed from bodyB to hinge axis (and orthogonal to it)
+ btVector3 orthoB = relB - projB;
+ // same for bodyA
+ relA = trA.getOrigin() - bodyA_trans.getOrigin();
+ btVector3 projA = ax1 * relA.dot(ax1);
+ btVector3 orthoA = relA - projA;
+ btVector3 totalDist = projA - projB;
+ // get offset vectors relA and relB
+ relA = orthoA + totalDist * factA;
+ relB = orthoB - totalDist * factB;
+ // now choose average ortho to hinge axis
+ p = orthoB * factA + orthoA * factB;
+ btScalar len2 = p.length2();
+ if(len2 > SIMD_EPSILON)
+ {
+ p /= btSqrt(len2);
+ }
+ else
+ {
+ p = trA.getBasis().getColumn(1);
+ }
+ // make one more ortho
+ q = ax1.cross(p);
+ // fill three rows
+ tmpA = relA.cross(p);
+ tmpB = relB.cross(p);
+ for (i=0; i<3; i++) info->m_J1angularAxis[s0+i] = tmpA[i];
+ for (i=0; i<3; i++) info->m_J2angularAxis[s0+i] = -tmpB[i];
+ tmpA = relA.cross(q);
+ tmpB = relB.cross(q);
+ if(hasStaticBody && getSolveLimit())
+ { // to make constraint between static and dynamic objects more rigid
+ // remove wA (or wB) from equation if angular limit is hit
+ tmpB *= factB;
+ tmpA *= factA;
+ }
+ for (i=0; i<3; i++) info->m_J1angularAxis[s1+i] = tmpA[i];
+ for (i=0; i<3; i++) info->m_J2angularAxis[s1+i] = -tmpB[i];
+ tmpA = relA.cross(ax1);
+ tmpB = relB.cross(ax1);
+ if(hasStaticBody)
+ { // to make constraint between static and dynamic objects more rigid
+ // remove wA (or wB) from equation
+ tmpB *= factB;
+ tmpA *= factA;
+ }
+ for (i=0; i<3; i++) info->m_J1angularAxis[s2+i] = tmpA[i];
+ for (i=0; i<3; i++) info->m_J2angularAxis[s2+i] = -tmpB[i];
+
+ btScalar k = info->fps * info->erp;
+
+ if (!m_angularOnly)
+ {
+ for (i=0; i<3; i++) info->m_J1linearAxis[s0+i] = p[i];
+ for (i=0; i<3; i++) info->m_J1linearAxis[s1+i] = q[i];
+ for (i=0; i<3; i++) info->m_J1linearAxis[s2+i] = ax1[i];
+
+ // compute three elements of right hand side
+
+ btScalar rhs = k * p.dot(ofs);
+ info->m_constraintError[s0] = rhs;
+ rhs = k * q.dot(ofs);
+ info->m_constraintError[s1] = rhs;
+ rhs = k * ax1.dot(ofs);
+ info->m_constraintError[s2] = rhs;
+ }
+ // the hinge axis should be the only unconstrained
+ // rotational axis, the angular velocity of the two bodies perpendicular to
+ // the hinge axis should be equal. thus the constraint equations are
+ // p*w1 - p*w2 = 0
+ // q*w1 - q*w2 = 0
+ // where p and q are unit vectors normal to the hinge axis, and w1 and w2
+ // are the angular velocity vectors of the two bodies.
+ int s3 = 3 * s;
+ int s4 = 4 * s;
+ info->m_J1angularAxis[s3 + 0] = p[0];
+ info->m_J1angularAxis[s3 + 1] = p[1];
+ info->m_J1angularAxis[s3 + 2] = p[2];
+ info->m_J1angularAxis[s4 + 0] = q[0];
+ info->m_J1angularAxis[s4 + 1] = q[1];
+ info->m_J1angularAxis[s4 + 2] = q[2];
+
+ info->m_J2angularAxis[s3 + 0] = -p[0];
+ info->m_J2angularAxis[s3 + 1] = -p[1];
+ info->m_J2angularAxis[s3 + 2] = -p[2];
+ info->m_J2angularAxis[s4 + 0] = -q[0];
+ info->m_J2angularAxis[s4 + 1] = -q[1];
+ info->m_J2angularAxis[s4 + 2] = -q[2];
+ // compute the right hand side of the constraint equation. set relative
+ // body velocities along p and q to bring the hinge back into alignment.
+ // if ax1A,ax1B are the unit length hinge axes as computed from bodyA and
+ // bodyB, we need to rotate both bodies along the axis u = (ax1 x ax2).
+ // if "theta" is the angle between ax1 and ax2, we need an angular velocity
+ // along u to cover angle erp*theta in one step :
+ // |angular_velocity| = angle/time = erp*theta / stepsize
+ // = (erp*fps) * theta
+ // angular_velocity = |angular_velocity| * (ax1 x ax2) / |ax1 x ax2|
+ // = (erp*fps) * theta * (ax1 x ax2) / sin(theta)
+ // ...as ax1 and ax2 are unit length. if theta is smallish,
+ // theta ~= sin(theta), so
+ // angular_velocity = (erp*fps) * (ax1 x ax2)
+ // ax1 x ax2 is in the plane space of ax1, so we project the angular
+ // velocity to p and q to find the right hand side.
+ k = info->fps * info->erp;
+ btVector3 u = ax1A.cross(ax1B);
+ info->m_constraintError[s3] = k * u.dot(p);
+ info->m_constraintError[s4] = k * u.dot(q);
+#endif
+ // check angular limits
+ nrow = 4; // last filled row
+ int srow;
+ btScalar limit_err = btScalar(0.0);
+ int limit = 0;
+ if(getSolveLimit())
+ {
+#ifdef _BT_USE_CENTER_LIMIT_
+ limit_err = m_limit.getCorrection() * m_referenceSign;
+#else
+ limit_err = m_correction * m_referenceSign;
+#endif
+ limit = (limit_err > btScalar(0.0)) ? 1 : 2;
+
+ }
+ // if the hinge has joint limits or motor, add in the extra row
+ int powered = 0;
+ if(getEnableAngularMotor())
+ {
+ powered = 1;
+ }
+ if(limit || powered)
+ {
+ nrow++;
+ srow = nrow * info->rowskip;
+ info->m_J1angularAxis[srow+0] = ax1[0];
+ info->m_J1angularAxis[srow+1] = ax1[1];
+ info->m_J1angularAxis[srow+2] = ax1[2];
+
+ info->m_J2angularAxis[srow+0] = -ax1[0];
+ info->m_J2angularAxis[srow+1] = -ax1[1];
+ info->m_J2angularAxis[srow+2] = -ax1[2];
+
+ btScalar lostop = getLowerLimit();
+ btScalar histop = getUpperLimit();
+ if(limit && (lostop == histop))
+ { // the joint motor is ineffective
+ powered = 0;
+ }
+ info->m_constraintError[srow] = btScalar(0.0f);
+ btScalar currERP = (m_flags & BT_HINGE_FLAGS_ERP_STOP) ? m_stopERP : info->erp;
+ if(powered)
+ {
+ if(m_flags & BT_HINGE_FLAGS_CFM_NORM)
+ {
+ info->cfm[srow] = m_normalCFM;
+ }
+ btScalar mot_fact = getMotorFactor(m_hingeAngle, lostop, histop, m_motorTargetVelocity, info->fps * currERP);
+ info->m_constraintError[srow] += mot_fact * m_motorTargetVelocity * m_referenceSign;
+ info->m_lowerLimit[srow] = - m_maxMotorImpulse;
+ info->m_upperLimit[srow] = m_maxMotorImpulse;
+ }
+ if(limit)
+ {
+ k = info->fps * currERP;
+ info->m_constraintError[srow] += k * limit_err;
+ if(m_flags & BT_HINGE_FLAGS_CFM_STOP)
+ {
+ info->cfm[srow] = m_stopCFM;
+ }
+ if(lostop == histop)
+ {
+ // limited low and high simultaneously
+ info->m_lowerLimit[srow] = -SIMD_INFINITY;
+ info->m_upperLimit[srow] = SIMD_INFINITY;
+ }
+ else if(limit == 1)
+ { // low limit
+ info->m_lowerLimit[srow] = 0;
+ info->m_upperLimit[srow] = SIMD_INFINITY;
+ }
+ else
+ { // high limit
+ info->m_lowerLimit[srow] = -SIMD_INFINITY;
+ info->m_upperLimit[srow] = 0;
+ }
+ // bounce (we'll use slider parameter abs(1.0 - m_dampingLimAng) for that)
+#ifdef _BT_USE_CENTER_LIMIT_
+ btScalar bounce = m_limit.getRelaxationFactor();
+#else
+ btScalar bounce = m_relaxationFactor;
+#endif
+ if(bounce > btScalar(0.0))
+ {
+ btScalar vel = angVelA.dot(ax1);
+ vel -= angVelB.dot(ax1);
+ // only apply bounce if the velocity is incoming, and if the
+ // resulting c[] exceeds what we already have.
+ if(limit == 1)
+ { // low limit
+ if(vel < 0)
+ {
+ btScalar newc = -bounce * vel;
+ if(newc > info->m_constraintError[srow])
+ {
+ info->m_constraintError[srow] = newc;
+ }
+ }
+ }
+ else
+ { // high limit - all those computations are reversed
+ if(vel > 0)
+ {
+ btScalar newc = -bounce * vel;
+ if(newc < info->m_constraintError[srow])
+ {
+ info->m_constraintError[srow] = newc;
+ }
+ }
+ }
+ }
+#ifdef _BT_USE_CENTER_LIMIT_
+ info->m_constraintError[srow] *= m_limit.getBiasFactor();
+#else
+ info->m_constraintError[srow] *= m_biasFactor;
+#endif
+ } // if(limit)
+ } // if angular limit or powered
+}
+
+
+///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+///If no axis is provided, it uses the default axis for this constraint.
+void btHingeConstraint::setParam(int num, btScalar value, int axis)
+{
+ if((axis == -1) || (axis == 5))
+ {
+ switch(num)
+ {
+ case BT_CONSTRAINT_STOP_ERP :
+ m_stopERP = value;
+ m_flags |= BT_HINGE_FLAGS_ERP_STOP;
+ break;
+ case BT_CONSTRAINT_STOP_CFM :
+ m_stopCFM = value;
+ m_flags |= BT_HINGE_FLAGS_CFM_STOP;
+ break;
+ case BT_CONSTRAINT_CFM :
+ m_normalCFM = value;
+ m_flags |= BT_HINGE_FLAGS_CFM_NORM;
+ break;
+ default :
+ btAssertConstrParams(0);
+ }
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+}
+
+///return the local value of parameter
+btScalar btHingeConstraint::getParam(int num, int axis) const
+{
+ btScalar retVal = 0;
+ if((axis == -1) || (axis == 5))
+ {
+ switch(num)
+ {
+ case BT_CONSTRAINT_STOP_ERP :
+ btAssertConstrParams(m_flags & BT_HINGE_FLAGS_ERP_STOP);
+ retVal = m_stopERP;
+ break;
+ case BT_CONSTRAINT_STOP_CFM :
+ btAssertConstrParams(m_flags & BT_HINGE_FLAGS_CFM_STOP);
+ retVal = m_stopCFM;
+ break;
+ case BT_CONSTRAINT_CFM :
+ btAssertConstrParams(m_flags & BT_HINGE_FLAGS_CFM_NORM);
+ retVal = m_normalCFM;
+ break;
+ default :
+ btAssertConstrParams(0);
+ }
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ return retVal;
+}
+
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h
index 0af655f4409..50e3f73cb6d 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h
@@ -17,6 +17,8 @@ subject to the following restrictions:
#ifndef HINGECONSTRAINT_H
#define HINGECONSTRAINT_H
+#define _BT_USE_CENTER_LIMIT_ 1
+
#include "LinearMath/btVector3.h"
#include "btJacobianEntry.h"
@@ -24,9 +26,27 @@ subject to the following restrictions:
class btRigidBody;
+#ifdef BT_USE_DOUBLE_PRECISION
+#define btHingeConstraintData btHingeConstraintDoubleData
+#define btHingeConstraintDataName "btHingeConstraintDoubleData"
+#else
+#define btHingeConstraintData btHingeConstraintFloatData
+#define btHingeConstraintDataName "btHingeConstraintFloatData"
+#endif //BT_USE_DOUBLE_PRECISION
+
+
+
+enum btHingeFlags
+{
+ BT_HINGE_FLAGS_CFM_STOP = 1,
+ BT_HINGE_FLAGS_ERP_STOP = 2,
+ BT_HINGE_FLAGS_CFM_NORM = 4
+};
+
+
/// hinge constraint between two rigidbodies each with a pivotpoint that descibes the axis location in local space
/// axis defines the orientation of the hinge axis
-class btHingeConstraint : public btTypedConstraint
+ATTRIBUTE_ALIGNED16(class) btHingeConstraint : public btTypedConstraint
{
#ifdef IN_PARALLELL_SOLVER
public:
@@ -40,48 +60,67 @@ public:
btScalar m_motorTargetVelocity;
btScalar m_maxMotorImpulse;
+
+#ifdef _BT_USE_CENTER_LIMIT_
+ btAngularLimit m_limit;
+#else
+ btScalar m_lowerLimit;
+ btScalar m_upperLimit;
+ btScalar m_limitSign;
+ btScalar m_correction;
+
btScalar m_limitSoftness;
btScalar m_biasFactor;
- btScalar m_relaxationFactor;
+ btScalar m_relaxationFactor;
+
+ bool m_solveLimit;
+#endif
- btScalar m_lowerLimit;
- btScalar m_upperLimit;
-
btScalar m_kHinge;
- btScalar m_limitSign;
- btScalar m_correction;
btScalar m_accLimitImpulse;
btScalar m_hingeAngle;
- btScalar m_referenceSign;
+ btScalar m_referenceSign;
bool m_angularOnly;
bool m_enableAngularMotor;
- bool m_solveLimit;
bool m_useSolveConstraintObsolete;
+ bool m_useOffsetForConstraintFrame;
bool m_useReferenceFrameA;
+ btScalar m_accMotorImpulse;
+
+ int m_flags;
+ btScalar m_normalCFM;
+ btScalar m_stopCFM;
+ btScalar m_stopERP;
+
public:
- btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB, btVector3& axisInA,btVector3& axisInB, bool useReferenceFrameA = false);
+ btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB, const btVector3& axisInA,const btVector3& axisInB, bool useReferenceFrameA = false);
- btHingeConstraint(btRigidBody& rbA,const btVector3& pivotInA,btVector3& axisInA, bool useReferenceFrameA = false);
+ btHingeConstraint(btRigidBody& rbA,const btVector3& pivotInA,const btVector3& axisInA, bool useReferenceFrameA = false);
btHingeConstraint(btRigidBody& rbA,btRigidBody& rbB, const btTransform& rbAFrame, const btTransform& rbBFrame, bool useReferenceFrameA = false);
btHingeConstraint(btRigidBody& rbA,const btTransform& rbAFrame, bool useReferenceFrameA = false);
- btHingeConstraint();
virtual void buildJacobian();
virtual void getInfo1 (btConstraintInfo1* info);
+ void getInfo1NonVirtual(btConstraintInfo1* info);
+
virtual void getInfo2 (btConstraintInfo2* info);
-
- virtual void solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep);
+
+ void getInfo2NonVirtual(btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btVector3& angVelA,const btVector3& angVelB);
+
+ void getInfo2Internal(btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btVector3& angVelA,const btVector3& angVelB);
+ void getInfo2InternalUsingFrameOffset(btConstraintInfo2* info,const btTransform& transA,const btTransform& transB,const btVector3& angVelA,const btVector3& angVelB);
+
void updateRHS(btScalar timeStep);
@@ -102,7 +141,19 @@ public:
btRigidBody& getRigidBodyB()
{
return m_rbB;
- }
+ }
+
+ btTransform& getFrameOffsetA()
+ {
+ return m_rbAFrame;
+ }
+
+ btTransform& getFrameOffsetB()
+ {
+ return m_rbBFrame;
+ }
+
+ void setFrames(const btTransform& frameA, const btTransform& frameB);
void setAngularOnly(bool angularOnly)
{
@@ -116,44 +167,101 @@ public:
m_maxMotorImpulse = maxMotorImpulse;
}
+ // extra motor API, including ability to set a target rotation (as opposed to angular velocity)
+ // note: setMotorTarget sets angular velocity under the hood, so you must call it every tick to
+ // maintain a given angular target.
+ void enableMotor(bool enableMotor) { m_enableAngularMotor = enableMotor; }
+ void setMaxMotorImpulse(btScalar maxMotorImpulse) { m_maxMotorImpulse = maxMotorImpulse; }
+ void setMotorTarget(const btQuaternion& qAinB, btScalar dt); // qAinB is rotation of body A wrt body B.
+ void setMotorTarget(btScalar targetAngle, btScalar dt);
+
+
void setLimit(btScalar low,btScalar high,btScalar _softness = 0.9f, btScalar _biasFactor = 0.3f, btScalar _relaxationFactor = 1.0f)
{
- m_lowerLimit = low;
- m_upperLimit = high;
-
+#ifdef _BT_USE_CENTER_LIMIT_
+ m_limit.set(low, high, _softness, _biasFactor, _relaxationFactor);
+#else
+ m_lowerLimit = btNormalizeAngle(low);
+ m_upperLimit = btNormalizeAngle(high);
m_limitSoftness = _softness;
m_biasFactor = _biasFactor;
m_relaxationFactor = _relaxationFactor;
+#endif
+ }
+
+ void setAxis(btVector3& axisInA)
+ {
+ btVector3 rbAxisA1, rbAxisA2;
+ btPlaneSpace1(axisInA, rbAxisA1, rbAxisA2);
+ btVector3 pivotInA = m_rbAFrame.getOrigin();
+// m_rbAFrame.getOrigin() = pivotInA;
+ m_rbAFrame.getBasis().setValue( rbAxisA1.getX(),rbAxisA2.getX(),axisInA.getX(),
+ rbAxisA1.getY(),rbAxisA2.getY(),axisInA.getY(),
+ rbAxisA1.getZ(),rbAxisA2.getZ(),axisInA.getZ() );
+
+ btVector3 axisInB = m_rbA.getCenterOfMassTransform().getBasis() * axisInA;
+
+ btQuaternion rotationArc = shortestArcQuat(axisInA,axisInB);
+ btVector3 rbAxisB1 = quatRotate(rotationArc,rbAxisA1);
+ btVector3 rbAxisB2 = axisInB.cross(rbAxisB1);
+
+ m_rbBFrame.getOrigin() = m_rbB.getCenterOfMassTransform().inverse()(m_rbA.getCenterOfMassTransform()(pivotInA));
+
+ m_rbBFrame.getBasis().setValue( rbAxisB1.getX(),rbAxisB2.getX(),axisInB.getX(),
+ rbAxisB1.getY(),rbAxisB2.getY(),axisInB.getY(),
+ rbAxisB1.getZ(),rbAxisB2.getZ(),axisInB.getZ() );
+ m_rbBFrame.getBasis() = m_rbB.getCenterOfMassTransform().getBasis().inverse() * m_rbBFrame.getBasis();
}
btScalar getLowerLimit() const
{
- return m_lowerLimit;
+#ifdef _BT_USE_CENTER_LIMIT_
+ return m_limit.getLow();
+#else
+ return m_lowerLimit;
+#endif
}
btScalar getUpperLimit() const
{
- return m_upperLimit;
+#ifdef _BT_USE_CENTER_LIMIT_
+ return m_limit.getHigh();
+#else
+ return m_upperLimit;
+#endif
}
btScalar getHingeAngle();
- void testLimit();
+ btScalar getHingeAngle(const btTransform& transA,const btTransform& transB);
+
+ void testLimit(const btTransform& transA,const btTransform& transB);
+
+ const btTransform& getAFrame() const { return m_rbAFrame; };
+ const btTransform& getBFrame() const { return m_rbBFrame; };
- const btTransform& getAFrame() { return m_rbAFrame; };
- const btTransform& getBFrame() { return m_rbBFrame; };
+ btTransform& getAFrame() { return m_rbAFrame; };
+ btTransform& getBFrame() { return m_rbBFrame; };
inline int getSolveLimit()
{
- return m_solveLimit;
+#ifdef _BT_USE_CENTER_LIMIT_
+ return m_limit.isLimit();
+#else
+ return m_solveLimit;
+#endif
}
inline btScalar getLimitSign()
{
+#ifdef _BT_USE_CENTER_LIMIT_
+ return m_limit.getSign();
+#else
return m_limitSign;
+#endif
}
inline bool getAngularOnly()
@@ -172,7 +280,101 @@ public:
{
return m_maxMotorImpulse;
}
+ // access for UseFrameOffset
+ bool getUseFrameOffset() { return m_useOffsetForConstraintFrame; }
+ void setUseFrameOffset(bool frameOffsetOnOff) { m_useOffsetForConstraintFrame = frameOffsetOnOff; }
+
+
+ ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///If no axis is provided, it uses the default axis for this constraint.
+ virtual void setParam(int num, btScalar value, int axis = -1);
+ ///return the local value of parameter
+ virtual btScalar getParam(int num, int axis = -1) const;
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btHingeConstraintDoubleData
+{
+ btTypedConstraintData m_typeConstraintData;
+ btTransformDoubleData m_rbAFrame; // constraint axii. Assumes z is hinge axis.
+ btTransformDoubleData m_rbBFrame;
+ int m_useReferenceFrameA;
+ int m_angularOnly;
+ int m_enableAngularMotor;
+ float m_motorTargetVelocity;
+ float m_maxMotorImpulse;
+
+ float m_lowerLimit;
+ float m_upperLimit;
+ float m_limitSoftness;
+ float m_biasFactor;
+ float m_relaxationFactor;
+
+};
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btHingeConstraintFloatData
+{
+ btTypedConstraintData m_typeConstraintData;
+ btTransformFloatData m_rbAFrame; // constraint axii. Assumes z is hinge axis.
+ btTransformFloatData m_rbBFrame;
+ int m_useReferenceFrameA;
+ int m_angularOnly;
+
+ int m_enableAngularMotor;
+ float m_motorTargetVelocity;
+ float m_maxMotorImpulse;
+
+ float m_lowerLimit;
+ float m_upperLimit;
+ float m_limitSoftness;
+ float m_biasFactor;
+ float m_relaxationFactor;
};
+
+
+SIMD_FORCE_INLINE int btHingeConstraint::calculateSerializeBufferSize() const
+{
+ return sizeof(btHingeConstraintData);
+}
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btHingeConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btHingeConstraintData* hingeData = (btHingeConstraintData*)dataBuffer;
+ btTypedConstraint::serialize(&hingeData->m_typeConstraintData,serializer);
+
+ m_rbAFrame.serialize(hingeData->m_rbAFrame);
+ m_rbBFrame.serialize(hingeData->m_rbBFrame);
+
+ hingeData->m_angularOnly = m_angularOnly;
+ hingeData->m_enableAngularMotor = m_enableAngularMotor;
+ hingeData->m_maxMotorImpulse = float(m_maxMotorImpulse);
+ hingeData->m_motorTargetVelocity = float(m_motorTargetVelocity);
+ hingeData->m_useReferenceFrameA = m_useReferenceFrameA;
+#ifdef _BT_USE_CENTER_LIMIT_
+ hingeData->m_lowerLimit = float(m_limit.getLow());
+ hingeData->m_upperLimit = float(m_limit.getHigh());
+ hingeData->m_limitSoftness = float(m_limit.getSoftness());
+ hingeData->m_biasFactor = float(m_limit.getBiasFactor());
+ hingeData->m_relaxationFactor = float(m_limit.getRelaxationFactor());
+#else
+ hingeData->m_lowerLimit = float(m_lowerLimit);
+ hingeData->m_upperLimit = float(m_upperLimit);
+ hingeData->m_limitSoftness = float(m_limitSoftness);
+ hingeData->m_biasFactor = float(m_biasFactor);
+ hingeData->m_relaxationFactor = float(m_relaxationFactor);
+#endif
+
+ return btHingeConstraintDataName;
+}
+
#endif //HINGECONSTRAINT_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h
index bfeb24c2dfb..22a8af66b8e 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h
@@ -28,7 +28,7 @@ subject to the following restrictions:
/// Jacobian entry is an abstraction that allows to describe constraints
/// it can be used in combination with a constraint solver
/// Can be used to relate the effect of an impulse to the constraint error
-class btJacobianEntry
+ATTRIBUTE_ALIGNED16(class) btJacobianEntry
{
public:
btJacobianEntry() {};
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
index 1da749517e8..7e0d93b9765 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
@@ -20,14 +20,11 @@ subject to the following restrictions:
-btPoint2PointConstraint::btPoint2PointConstraint()
-:btTypedConstraint(POINT2POINT_CONSTRAINT_TYPE),
-m_useSolveConstraintObsolete(false)
-{
-}
+
btPoint2PointConstraint::btPoint2PointConstraint(btRigidBody& rbA,btRigidBody& rbB, const btVector3& pivotInA,const btVector3& pivotInB)
:btTypedConstraint(POINT2POINT_CONSTRAINT_TYPE,rbA,rbB),m_pivotInA(pivotInA),m_pivotInB(pivotInB),
+m_flags(0),
m_useSolveConstraintObsolete(false)
{
@@ -36,6 +33,7 @@ m_useSolveConstraintObsolete(false)
btPoint2PointConstraint::btPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA)
:btTypedConstraint(POINT2POINT_CONSTRAINT_TYPE,rbA),m_pivotInA(pivotInA),m_pivotInB(rbA.getCenterOfMassTransform()(pivotInA)),
+m_flags(0),
m_useSolveConstraintObsolete(false)
{
@@ -43,6 +41,7 @@ m_useSolveConstraintObsolete(false)
void btPoint2PointConstraint::buildJacobian()
{
+
///we need it for both methods
{
m_appliedImpulse = btScalar(0.);
@@ -66,11 +65,16 @@ void btPoint2PointConstraint::buildJacobian()
}
}
-}
+}
void btPoint2PointConstraint::getInfo1 (btConstraintInfo1* info)
{
+ getInfo1NonVirtual(info);
+}
+
+void btPoint2PointConstraint::getInfo1NonVirtual (btConstraintInfo1* info)
+{
if (m_useSolveConstraintObsolete)
{
info->m_numConstraintRows = 0;
@@ -82,22 +86,26 @@ void btPoint2PointConstraint::getInfo1 (btConstraintInfo1* info)
}
}
+
+
+
void btPoint2PointConstraint::getInfo2 (btConstraintInfo2* info)
{
+ getInfo2NonVirtual(info, m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+}
+
+void btPoint2PointConstraint::getInfo2NonVirtual (btConstraintInfo2* info, const btTransform& body0_trans, const btTransform& body1_trans)
+{
btAssert(!m_useSolveConstraintObsolete);
//retrieve matrices
- btTransform body0_trans;
- body0_trans = m_rbA.getCenterOfMassTransform();
- btTransform body1_trans;
- body1_trans = m_rbB.getCenterOfMassTransform();
// anchor points in global coordinates with respect to body PORs.
// set jacobian
info->m_J1linearAxis[0] = 1;
- info->m_J1linearAxis[info->rowskip+1] = 1;
- info->m_J1linearAxis[2*info->rowskip+2] = 1;
+ info->m_J1linearAxis[info->rowskip+1] = 1;
+ info->m_J1linearAxis[2*info->rowskip+2] = 1;
btVector3 a1 = body0_trans.getBasis()*getPivotInA();
{
@@ -126,14 +134,21 @@ void btPoint2PointConstraint::getInfo2 (btConstraintInfo2* info)
// set right hand side
- btScalar k = info->fps * info->erp;
+ btScalar currERP = (m_flags & BT_P2P_FLAGS_ERP) ? m_erp : info->erp;
+ btScalar k = info->fps * currERP;
int j;
-
for (j=0; j<3; j++)
{
- info->m_constraintError[j*info->rowskip] = k * (a2[j] + body1_trans.getOrigin()[j] - a1[j] - body0_trans.getOrigin()[j]);
+ info->m_constraintError[j*info->rowskip] = k * (a2[j] + body1_trans.getOrigin()[j] - a1[j] - body0_trans.getOrigin()[j]);
//printf("info->m_constraintError[%d]=%f\n",j,info->m_constraintError[j]);
}
+ if(m_flags & BT_P2P_FLAGS_CFM)
+ {
+ for (j=0; j<3; j++)
+ {
+ info->cfm[j*info->rowskip] = m_cfm;
+ }
+ }
btScalar impulseClamp = m_setting.m_impulseClamp;//
for (j=0; j<3; j++)
@@ -144,87 +159,72 @@ void btPoint2PointConstraint::getInfo2 (btConstraintInfo2* info)
info->m_upperLimit[j*info->rowskip] = impulseClamp;
}
}
+ info->m_damping = m_setting.m_damping;
}
-void btPoint2PointConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep)
-{
- if (m_useSolveConstraintObsolete)
- {
- btVector3 pivotAInW = m_rbA.getCenterOfMassTransform()*m_pivotInA;
- btVector3 pivotBInW = m_rbB.getCenterOfMassTransform()*m_pivotInB;
+void btPoint2PointConstraint::updateRHS(btScalar timeStep)
+{
+ (void)timeStep;
- btVector3 normal(0,0,0);
-
-
- // btVector3 angvelA = m_rbA.getCenterOfMassTransform().getBasis().transpose() * m_rbA.getAngularVelocity();
- // btVector3 angvelB = m_rbB.getCenterOfMassTransform().getBasis().transpose() * m_rbB.getAngularVelocity();
+}
- for (int i=0;i<3;i++)
- {
- normal[i] = 1;
- btScalar jacDiagABInv = btScalar(1.) / m_jac[i].getDiagonal();
-
- btVector3 rel_pos1 = pivotAInW - m_rbA.getCenterOfMassPosition();
- btVector3 rel_pos2 = pivotBInW - m_rbB.getCenterOfMassPosition();
- //this jacobian entry could be re-used for all iterations
-
- btVector3 vel1,vel2;
- bodyA.getVelocityInLocalPointObsolete(rel_pos1,vel1);
- bodyB.getVelocityInLocalPointObsolete(rel_pos2,vel2);
- btVector3 vel = vel1 - vel2;
-
- btScalar rel_vel;
- rel_vel = normal.dot(vel);
-
- /*
- //velocity error (first order error)
- btScalar rel_vel = m_jac[i].getRelativeVelocity(m_rbA.getLinearVelocity(),angvelA,
- m_rbB.getLinearVelocity(),angvelB);
- */
-
- //positional error (zeroth order error)
- btScalar depth = -(pivotAInW - pivotBInW).dot(normal); //this is the error projected on the normal
-
- btScalar deltaImpulse = depth*m_setting.m_tau/timeStep * jacDiagABInv - m_setting.m_damping * rel_vel * jacDiagABInv;
-
- btScalar impulseClamp = m_setting.m_impulseClamp;
-
- const btScalar sum = btScalar(m_appliedImpulse) + deltaImpulse;
- if (sum < -impulseClamp)
- {
- deltaImpulse = -impulseClamp-m_appliedImpulse;
- m_appliedImpulse = -impulseClamp;
- }
- else if (sum > impulseClamp)
- {
- deltaImpulse = impulseClamp-m_appliedImpulse;
- m_appliedImpulse = impulseClamp;
- }
- else
- {
- m_appliedImpulse = sum;
- }
-
-
- btVector3 impulse_vector = normal * deltaImpulse;
-
- btVector3 ftorqueAxis1 = rel_pos1.cross(normal);
- btVector3 ftorqueAxis2 = rel_pos2.cross(normal);
- bodyA.applyImpulse(normal*m_rbA.getInvMass(), m_rbA.getInvInertiaTensorWorld()*ftorqueAxis1,deltaImpulse);
- bodyB.applyImpulse(normal*m_rbB.getInvMass(), m_rbB.getInvInertiaTensorWorld()*ftorqueAxis2,-deltaImpulse);
-
-
- normal[i] = 0;
+///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+///If no axis is provided, it uses the default axis for this constraint.
+void btPoint2PointConstraint::setParam(int num, btScalar value, int axis)
+{
+ if(axis != -1)
+ {
+ btAssertConstrParams(0);
+ }
+ else
+ {
+ switch(num)
+ {
+ case BT_CONSTRAINT_ERP :
+ case BT_CONSTRAINT_STOP_ERP :
+ m_erp = value;
+ m_flags |= BT_P2P_FLAGS_ERP;
+ break;
+ case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_STOP_CFM :
+ m_cfm = value;
+ m_flags |= BT_P2P_FLAGS_CFM;
+ break;
+ default:
+ btAssertConstrParams(0);
}
}
}
-void btPoint2PointConstraint::updateRHS(btScalar timeStep)
+///return the local value of parameter
+btScalar btPoint2PointConstraint::getParam(int num, int axis) const
{
- (void)timeStep;
-
+ btScalar retVal(SIMD_INFINITY);
+ if(axis != -1)
+ {
+ btAssertConstrParams(0);
+ }
+ else
+ {
+ switch(num)
+ {
+ case BT_CONSTRAINT_ERP :
+ case BT_CONSTRAINT_STOP_ERP :
+ btAssertConstrParams(m_flags & BT_P2P_FLAGS_ERP);
+ retVal = m_erp;
+ break;
+ case BT_CONSTRAINT_CFM :
+ case BT_CONSTRAINT_STOP_CFM :
+ btAssertConstrParams(m_flags & BT_P2P_FLAGS_CFM);
+ retVal = m_cfm;
+ break;
+ default:
+ btAssertConstrParams(0);
+ }
+ }
+ return retVal;
}
-
+
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
index e2b865cd484..b589ee68254 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
@@ -22,6 +22,15 @@ subject to the following restrictions:
class btRigidBody;
+
+#ifdef BT_USE_DOUBLE_PRECISION
+#define btPoint2PointConstraintData btPoint2PointConstraintDoubleData
+#define btPoint2PointConstraintDataName "btPoint2PointConstraintDoubleData"
+#else
+#define btPoint2PointConstraintData btPoint2PointConstraintFloatData
+#define btPoint2PointConstraintDataName "btPoint2PointConstraintFloatData"
+#endif //BT_USE_DOUBLE_PRECISION
+
struct btConstraintSetting
{
btConstraintSetting() :
@@ -35,8 +44,14 @@ struct btConstraintSetting
btScalar m_impulseClamp;
};
+enum btPoint2PointFlags
+{
+ BT_P2P_FLAGS_ERP = 1,
+ BT_P2P_FLAGS_CFM = 2
+};
+
/// point to point constraint between two rigidbodies each with a pivotpoint that descibes the 'ballsocket' location in local space
-class btPoint2PointConstraint : public btTypedConstraint
+ATTRIBUTE_ALIGNED16(class) btPoint2PointConstraint : public btTypedConstraint
{
#ifdef IN_PARALLELL_SOLVER
public:
@@ -46,7 +61,9 @@ public:
btVector3 m_pivotInA;
btVector3 m_pivotInB;
-
+ int m_flags;
+ btScalar m_erp;
+ btScalar m_cfm;
public:
@@ -59,16 +76,16 @@ public:
btPoint2PointConstraint(btRigidBody& rbA,const btVector3& pivotInA);
- btPoint2PointConstraint();
virtual void buildJacobian();
virtual void getInfo1 (btConstraintInfo1* info);
- virtual void getInfo2 (btConstraintInfo2* info);
+ void getInfo1NonVirtual (btConstraintInfo1* info);
+ virtual void getInfo2 (btConstraintInfo2* info);
- virtual void solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep);
+ void getInfo2NonVirtual (btConstraintInfo2* info, const btTransform& body0_trans, const btTransform& body1_trans);
void updateRHS(btScalar timeStep);
@@ -92,7 +109,53 @@ public:
return m_pivotInB;
}
+ ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///If no axis is provided, it uses the default axis for this constraint.
+ virtual void setParam(int num, btScalar value, int axis = -1);
+ ///return the local value of parameter
+ virtual btScalar getParam(int num, int axis = -1) const;
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
};
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btPoint2PointConstraintFloatData
+{
+ btTypedConstraintData m_typeConstraintData;
+ btVector3FloatData m_pivotInA;
+ btVector3FloatData m_pivotInB;
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btPoint2PointConstraintDoubleData
+{
+ btTypedConstraintData m_typeConstraintData;
+ btVector3DoubleData m_pivotInA;
+ btVector3DoubleData m_pivotInB;
+};
+
+
+SIMD_FORCE_INLINE int btPoint2PointConstraint::calculateSerializeBufferSize() const
+{
+ return sizeof(btPoint2PointConstraintData);
+
+}
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btPoint2PointConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btPoint2PointConstraintData* p2pData = (btPoint2PointConstraintData*)dataBuffer;
+
+ btTypedConstraint::serialize(&p2pData->m_typeConstraintData,serializer);
+ m_pivotInA.serialize(p2pData->m_pivotInA);
+ m_pivotInB.serialize(p2pData->m_pivotInB);
+
+ return btPoint2PointConstraintDataName;
+}
+
#endif //POINT2POINTCONSTRAINT_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
index dbd09b39238..0fc93cd3756 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
@@ -34,6 +34,8 @@ subject to the following restrictions:
#include "LinearMath/btAlignedObjectArray.h"
#include <string.h> //for memset
+int gNumSplitImpulseRecoveries = 0;
+
btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver()
:m_btSeed2(0)
{
@@ -46,24 +48,24 @@ btSequentialImpulseConstraintSolver::~btSequentialImpulseConstraintSolver()
#ifdef USE_SIMD
#include <emmintrin.h>
-#define vec_splat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e,e,e,e))
-static inline __m128 _vmathVfDot3( __m128 vec0, __m128 vec1 )
+#define btVecSplat(x, e) _mm_shuffle_ps(x, x, _MM_SHUFFLE(e,e,e,e))
+static inline __m128 btSimdDot3( __m128 vec0, __m128 vec1 )
{
__m128 result = _mm_mul_ps( vec0, vec1);
- return _mm_add_ps( vec_splat( result, 0 ), _mm_add_ps( vec_splat( result, 1 ), vec_splat( result, 2 ) ) );
+ return _mm_add_ps( btVecSplat( result, 0 ), _mm_add_ps( btVecSplat( result, 1 ), btVecSplat( result, 2 ) ) );
}
#endif//USE_SIMD
// Project Gauss Seidel or the equivalent Sequential Impulse
-void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c)
+void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& c)
{
#ifdef USE_SIMD
__m128 cpAppliedImp = _mm_set1_ps(c.m_appliedImpulse);
__m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
__m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
__m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse),_mm_set1_ps(c.m_cfm)));
- __m128 deltaVel1Dotn = _mm_add_ps(_vmathVfDot3(c.m_contactNormal.mVec128,body1.m_deltaLinearVelocity.mVec128), _vmathVfDot3(c.m_relpos1CrossNormal.mVec128,body1.m_deltaAngularVelocity.mVec128));
- __m128 deltaVel2Dotn = _mm_sub_ps(_vmathVfDot3(c.m_relpos2CrossNormal.mVec128,body2.m_deltaAngularVelocity.mVec128),_vmathVfDot3((c.m_contactNormal).mVec128,body2.m_deltaLinearVelocity.mVec128));
+ __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal.mVec128,body1.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetDeltaAngularVelocity().mVec128));
+ __m128 deltaVel2Dotn = _mm_sub_ps(btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetDeltaAngularVelocity().mVec128),btSimdDot3((c.m_contactNormal).mVec128,body2.internalGetDeltaLinearVelocity().mVec128));
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
@@ -76,26 +78,26 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
__m128 upperMinApplied = _mm_sub_ps(upperLimit1,cpAppliedImp);
deltaImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, deltaImpulse), _mm_andnot_ps(resultUpperLess, upperMinApplied) );
c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultUpperLess, c.m_appliedImpulse), _mm_andnot_ps(resultUpperLess, upperLimit1) );
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.m_invMass.mVec128);
- __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.m_invMass.mVec128);
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.internalGetInvMass().mVec128);
+ __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.internalGetInvMass().mVec128);
__m128 impulseMagnitude = deltaImpulse;
- body1.m_deltaLinearVelocity.mVec128 = _mm_add_ps(body1.m_deltaLinearVelocity.mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
- body1.m_deltaAngularVelocity.mVec128 = _mm_add_ps(body1.m_deltaAngularVelocity.mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
- body2.m_deltaLinearVelocity.mVec128 = _mm_sub_ps(body2.m_deltaLinearVelocity.mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
- body2.m_deltaAngularVelocity.mVec128 = _mm_add_ps(body2.m_deltaAngularVelocity.mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
+ body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
+ body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
+ body2.internalGetDeltaLinearVelocity().mVec128 = _mm_sub_ps(body2.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
+ body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
#else
resolveSingleConstraintRowGeneric(body1,body2,c);
#endif
}
// Project Gauss Seidel or the equivalent Sequential Impulse
- void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGeneric(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c)
+ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGeneric(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& c)
{
btScalar deltaImpulse = c.m_rhs-btScalar(c.m_appliedImpulse)*c.m_cfm;
- const btScalar deltaVel1Dotn = c.m_contactNormal.dot(body1.m_deltaLinearVelocity) + c.m_relpos1CrossNormal.dot(body1.m_deltaAngularVelocity);
- const btScalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.m_deltaLinearVelocity) + c.m_relpos2CrossNormal.dot(body2.m_deltaAngularVelocity);
+ const btScalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity());
+ const btScalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity());
- const btScalar delta_rel_vel = deltaVel1Dotn-deltaVel2Dotn;
+// const btScalar delta_rel_vel = deltaVel1Dotn-deltaVel2Dotn;
deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
@@ -114,19 +116,19 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
{
c.m_appliedImpulse = sum;
}
- body1.applyImpulse(c.m_contactNormal*body1.m_invMass,c.m_angularComponentA,deltaImpulse);
- body2.applyImpulse(-c.m_contactNormal*body2.m_invMass,c.m_angularComponentB,deltaImpulse);
+ body1.internalApplyImpulse(c.m_contactNormal*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
+ body2.internalApplyImpulse(-c.m_contactNormal*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
}
- void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimitSIMD(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c)
+ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimitSIMD(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& c)
{
#ifdef USE_SIMD
__m128 cpAppliedImp = _mm_set1_ps(c.m_appliedImpulse);
__m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
__m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
__m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhs), _mm_mul_ps(_mm_set1_ps(c.m_appliedImpulse),_mm_set1_ps(c.m_cfm)));
- __m128 deltaVel1Dotn = _mm_add_ps(_vmathVfDot3(c.m_contactNormal.mVec128,body1.m_deltaLinearVelocity.mVec128), _vmathVfDot3(c.m_relpos1CrossNormal.mVec128,body1.m_deltaAngularVelocity.mVec128));
- __m128 deltaVel2Dotn = _mm_sub_ps(_vmathVfDot3(c.m_relpos2CrossNormal.mVec128,body2.m_deltaAngularVelocity.mVec128),_vmathVfDot3((c.m_contactNormal).mVec128,body2.m_deltaLinearVelocity.mVec128));
+ __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal.mVec128,body1.internalGetDeltaLinearVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetDeltaAngularVelocity().mVec128));
+ __m128 deltaVel2Dotn = _mm_sub_ps(btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetDeltaAngularVelocity().mVec128),btSimdDot3((c.m_contactNormal).mVec128,body2.internalGetDeltaLinearVelocity().mVec128));
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
@@ -136,24 +138,24 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
__m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
- __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.m_invMass.mVec128);
- __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.m_invMass.mVec128);
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.internalGetInvMass().mVec128);
+ __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.internalGetInvMass().mVec128);
__m128 impulseMagnitude = deltaImpulse;
- body1.m_deltaLinearVelocity.mVec128 = _mm_add_ps(body1.m_deltaLinearVelocity.mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
- body1.m_deltaAngularVelocity.mVec128 = _mm_add_ps(body1.m_deltaAngularVelocity.mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
- body2.m_deltaLinearVelocity.mVec128 = _mm_sub_ps(body2.m_deltaLinearVelocity.mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
- body2.m_deltaAngularVelocity.mVec128 = _mm_add_ps(body2.m_deltaAngularVelocity.mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
+ body1.internalGetDeltaLinearVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
+ body1.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body1.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
+ body2.internalGetDeltaLinearVelocity().mVec128 = _mm_sub_ps(body2.internalGetDeltaLinearVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
+ body2.internalGetDeltaAngularVelocity().mVec128 = _mm_add_ps(body2.internalGetDeltaAngularVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
#else
resolveSingleConstraintRowLowerLimit(body1,body2,c);
#endif
}
// Project Gauss Seidel or the equivalent Sequential Impulse
- void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimit(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& c)
+ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowLowerLimit(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& c)
{
btScalar deltaImpulse = c.m_rhs-btScalar(c.m_appliedImpulse)*c.m_cfm;
- const btScalar deltaVel1Dotn = c.m_contactNormal.dot(body1.m_deltaLinearVelocity) + c.m_relpos1CrossNormal.dot(body1.m_deltaAngularVelocity);
- const btScalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.m_deltaLinearVelocity) + c.m_relpos2CrossNormal.dot(body2.m_deltaAngularVelocity);
+ const btScalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetDeltaLinearVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetDeltaAngularVelocity());
+ const btScalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetDeltaLinearVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetDeltaAngularVelocity());
deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
@@ -167,8 +169,73 @@ void btSequentialImpulseConstraintSolver::resolveSingleConstraintRowGenericSIMD(
{
c.m_appliedImpulse = sum;
}
- body1.applyImpulse(c.m_contactNormal*body1.m_invMass,c.m_angularComponentA,deltaImpulse);
- body2.applyImpulse(-c.m_contactNormal*body2.m_invMass,c.m_angularComponentB,deltaImpulse);
+ body1.internalApplyImpulse(c.m_contactNormal*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
+ body2.internalApplyImpulse(-c.m_contactNormal*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
+}
+
+
+void btSequentialImpulseConstraintSolver::resolveSplitPenetrationImpulseCacheFriendly(
+ btRigidBody& body1,
+ btRigidBody& body2,
+ const btSolverConstraint& c)
+{
+ if (c.m_rhsPenetration)
+ {
+ gNumSplitImpulseRecoveries++;
+ btScalar deltaImpulse = c.m_rhsPenetration-btScalar(c.m_appliedPushImpulse)*c.m_cfm;
+ const btScalar deltaVel1Dotn = c.m_contactNormal.dot(body1.internalGetPushVelocity()) + c.m_relpos1CrossNormal.dot(body1.internalGetTurnVelocity());
+ const btScalar deltaVel2Dotn = -c.m_contactNormal.dot(body2.internalGetPushVelocity()) + c.m_relpos2CrossNormal.dot(body2.internalGetTurnVelocity());
+
+ deltaImpulse -= deltaVel1Dotn*c.m_jacDiagABInv;
+ deltaImpulse -= deltaVel2Dotn*c.m_jacDiagABInv;
+ const btScalar sum = btScalar(c.m_appliedPushImpulse) + deltaImpulse;
+ if (sum < c.m_lowerLimit)
+ {
+ deltaImpulse = c.m_lowerLimit-c.m_appliedPushImpulse;
+ c.m_appliedPushImpulse = c.m_lowerLimit;
+ }
+ else
+ {
+ c.m_appliedPushImpulse = sum;
+ }
+ body1.internalApplyPushImpulse(c.m_contactNormal*body1.internalGetInvMass(),c.m_angularComponentA,deltaImpulse);
+ body2.internalApplyPushImpulse(-c.m_contactNormal*body2.internalGetInvMass(),c.m_angularComponentB,deltaImpulse);
+ }
+}
+
+ void btSequentialImpulseConstraintSolver::resolveSplitPenetrationSIMD(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& c)
+{
+#ifdef USE_SIMD
+ if (!c.m_rhsPenetration)
+ return;
+
+ gNumSplitImpulseRecoveries++;
+
+ __m128 cpAppliedImp = _mm_set1_ps(c.m_appliedPushImpulse);
+ __m128 lowerLimit1 = _mm_set1_ps(c.m_lowerLimit);
+ __m128 upperLimit1 = _mm_set1_ps(c.m_upperLimit);
+ __m128 deltaImpulse = _mm_sub_ps(_mm_set1_ps(c.m_rhsPenetration), _mm_mul_ps(_mm_set1_ps(c.m_appliedPushImpulse),_mm_set1_ps(c.m_cfm)));
+ __m128 deltaVel1Dotn = _mm_add_ps(btSimdDot3(c.m_contactNormal.mVec128,body1.internalGetPushVelocity().mVec128), btSimdDot3(c.m_relpos1CrossNormal.mVec128,body1.internalGetTurnVelocity().mVec128));
+ __m128 deltaVel2Dotn = _mm_sub_ps(btSimdDot3(c.m_relpos2CrossNormal.mVec128,body2.internalGetTurnVelocity().mVec128),btSimdDot3((c.m_contactNormal).mVec128,body2.internalGetPushVelocity().mVec128));
+ deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel1Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
+ deltaImpulse = _mm_sub_ps(deltaImpulse,_mm_mul_ps(deltaVel2Dotn,_mm_set1_ps(c.m_jacDiagABInv)));
+ btSimdScalar sum = _mm_add_ps(cpAppliedImp,deltaImpulse);
+ btSimdScalar resultLowerLess,resultUpperLess;
+ resultLowerLess = _mm_cmplt_ps(sum,lowerLimit1);
+ resultUpperLess = _mm_cmplt_ps(sum,upperLimit1);
+ __m128 lowMinApplied = _mm_sub_ps(lowerLimit1,cpAppliedImp);
+ deltaImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowMinApplied), _mm_andnot_ps(resultLowerLess, deltaImpulse) );
+ c.m_appliedImpulse = _mm_or_ps( _mm_and_ps(resultLowerLess, lowerLimit1), _mm_andnot_ps(resultLowerLess, sum) );
+ __m128 linearComponentA = _mm_mul_ps(c.m_contactNormal.mVec128,body1.internalGetInvMass().mVec128);
+ __m128 linearComponentB = _mm_mul_ps((c.m_contactNormal).mVec128,body2.internalGetInvMass().mVec128);
+ __m128 impulseMagnitude = deltaImpulse;
+ body1.internalGetPushVelocity().mVec128 = _mm_add_ps(body1.internalGetPushVelocity().mVec128,_mm_mul_ps(linearComponentA,impulseMagnitude));
+ body1.internalGetTurnVelocity().mVec128 = _mm_add_ps(body1.internalGetTurnVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentA.mVec128,impulseMagnitude));
+ body2.internalGetPushVelocity().mVec128 = _mm_sub_ps(body2.internalGetPushVelocity().mVec128,_mm_mul_ps(linearComponentB,impulseMagnitude));
+ body2.internalGetTurnVelocity().mVec128 = _mm_add_ps(body2.internalGetTurnVelocity().mVec128 ,_mm_mul_ps(c.m_angularComponentB.mVec128,impulseMagnitude));
+#else
+ resolveSplitPenetrationImpulseCacheFriendly(body1,body2,c);
+#endif
}
@@ -210,29 +277,33 @@ int btSequentialImpulseConstraintSolver::btRandInt2 (int n)
}
-
+#if 0
void btSequentialImpulseConstraintSolver::initSolverBody(btSolverBody* solverBody, btCollisionObject* collisionObject)
{
btRigidBody* rb = collisionObject? btRigidBody::upcast(collisionObject) : 0;
- solverBody->m_deltaLinearVelocity.setValue(0.f,0.f,0.f);
- solverBody->m_deltaAngularVelocity.setValue(0.f,0.f,0.f);
+ solverBody->internalGetDeltaLinearVelocity().setValue(0.f,0.f,0.f);
+ solverBody->internalGetDeltaAngularVelocity().setValue(0.f,0.f,0.f);
+ solverBody->internalGetPushVelocity().setValue(0.f,0.f,0.f);
+ solverBody->internalGetTurnVelocity().setValue(0.f,0.f,0.f);
if (rb)
{
- solverBody->m_invMass = btVector3(rb->getInvMass(),rb->getInvMass(),rb->getInvMass())*rb->getLinearFactor();
+ solverBody->internalGetInvMass() = btVector3(rb->getInvMass(),rb->getInvMass(),rb->getInvMass())*rb->getLinearFactor();
solverBody->m_originalBody = rb;
solverBody->m_angularFactor = rb->getAngularFactor();
} else
{
- solverBody->m_invMass.setValue(0,0,0);
+ solverBody->internalGetInvMass().setValue(0,0,0);
solverBody->m_originalBody = 0;
solverBody->m_angularFactor.setValue(1,1,1);
}
}
+#endif
+
+
-int gNumSplitImpulseRecoveries = 0;
btScalar btSequentialImpulseConstraintSolver::restitutionCurve(btScalar rel_vel, btScalar restitution)
{
@@ -258,27 +329,23 @@ void applyAnisotropicFriction(btCollisionObject* colObj,btVector3& frictionDirec
}
-
-btSolverConstraint& btSequentialImpulseConstraintSolver::addFrictionConstraint(const btVector3& normalAxis,int solverBodyIdA,int solverBodyIdB,int frictionIndex,btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2,btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation)
+void btSequentialImpulseConstraintSolver::setupFrictionConstraint(btSolverConstraint& solverConstraint, const btVector3& normalAxis,btRigidBody* solverBodyA,btRigidBody* solverBodyB,btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2,btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, btScalar desiredVelocity, btScalar cfmSlip)
{
btRigidBody* body0=btRigidBody::upcast(colObj0);
btRigidBody* body1=btRigidBody::upcast(colObj1);
- btSolverConstraint& solverConstraint = m_tmpSolverContactFrictionConstraintPool.expand();
- memset(&solverConstraint,0xff,sizeof(btSolverConstraint));
solverConstraint.m_contactNormal = normalAxis;
- solverConstraint.m_solverBodyIdA = solverBodyIdA;
- solverConstraint.m_solverBodyIdB = solverBodyIdB;
- solverConstraint.m_frictionIndex = frictionIndex;
+ solverConstraint.m_solverBodyA = body0 ? body0 : &getFixedBody();
+ solverConstraint.m_solverBodyB = body1 ? body1 : &getFixedBody();
solverConstraint.m_friction = cp.m_combinedFriction;
solverConstraint.m_originalContactPoint = 0;
solverConstraint.m_appliedImpulse = 0.f;
- // solverConstraint.m_appliedPushImpulse = 0.f;
+ solverConstraint.m_appliedPushImpulse = 0.f;
{
btVector3 ftorqueAxis1 = rel_pos1.cross(solverConstraint.m_contactNormal);
@@ -333,21 +400,31 @@ btSolverConstraint& btSequentialImpulseConstraintSolver::addFrictionConstraint(c
rel_vel = vel1Dotn+vel2Dotn;
- btScalar positionalError = 0.f;
+// btScalar positionalError = 0.f;
- btSimdScalar velocityError = - rel_vel;
+ btSimdScalar velocityError = desiredVelocity - rel_vel;
btSimdScalar velocityImpulse = velocityError * btSimdScalar(solverConstraint.m_jacDiagABInv);
solverConstraint.m_rhs = velocityImpulse;
- solverConstraint.m_cfm = 0.f;
+ solverConstraint.m_cfm = cfmSlip;
solverConstraint.m_lowerLimit = 0;
solverConstraint.m_upperLimit = 1e10f;
}
+}
+
+
+btSolverConstraint& btSequentialImpulseConstraintSolver::addFrictionConstraint(const btVector3& normalAxis,btRigidBody* solverBodyA,btRigidBody* solverBodyB,int frictionIndex,btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2,btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, btScalar desiredVelocity, btScalar cfmSlip)
+{
+ btSolverConstraint& solverConstraint = m_tmpSolverContactFrictionConstraintPool.expandNonInitializing();
+ solverConstraint.m_frictionIndex = frictionIndex;
+ setupFrictionConstraint(solverConstraint, normalAxis, solverBodyA, solverBodyB, cp, rel_pos1, rel_pos2,
+ colObj0, colObj1, relaxation, desiredVelocity, cfmSlip);
return solverConstraint;
}
int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject& body)
{
+#if 0
int solverBodyIdA = -1;
if (body.getCompanionId() >= 0)
@@ -369,70 +446,36 @@ int btSequentialImpulseConstraintSolver::getOrInitSolverBody(btCollisionObject&
}
}
return solverBodyIdA;
+#endif
+ return 0;
}
#include <stdio.h>
-
-void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* manifold,const btContactSolverInfo& infoGlobal)
+void btSequentialImpulseConstraintSolver::setupContactConstraint(btSolverConstraint& solverConstraint,
+ btCollisionObject* colObj0, btCollisionObject* colObj1,
+ btManifoldPoint& cp, const btContactSolverInfo& infoGlobal,
+ btVector3& vel, btScalar& rel_vel, btScalar& relaxation,
+ btVector3& rel_pos1, btVector3& rel_pos2)
{
- btCollisionObject* colObj0=0,*colObj1=0;
-
- colObj0 = (btCollisionObject*)manifold->getBody0();
- colObj1 = (btCollisionObject*)manifold->getBody1();
-
- int solverBodyIdA=-1;
- int solverBodyIdB=-1;
-
- if (manifold->getNumContacts())
- {
- solverBodyIdA = getOrInitSolverBody(*colObj0);
- solverBodyIdB = getOrInitSolverBody(*colObj1);
- }
-
- ///avoid collision response between two static objects
- if (!solverBodyIdA && !solverBodyIdB)
- return;
-
- btVector3 rel_pos1;
- btVector3 rel_pos2;
- btScalar relaxation;
-
- for (int j=0;j<manifold->getNumContacts();j++)
- {
-
- btManifoldPoint& cp = manifold->getContactPoint(j);
-
- if (cp.getDistance() <= manifold->getContactProcessingThreshold())
- {
+ btRigidBody* rb0 = btRigidBody::upcast(colObj0);
+ btRigidBody* rb1 = btRigidBody::upcast(colObj1);
const btVector3& pos1 = cp.getPositionWorldOnA();
const btVector3& pos2 = cp.getPositionWorldOnB();
+// btVector3 rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin();
+// btVector3 rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
rel_pos1 = pos1 - colObj0->getWorldTransform().getOrigin();
rel_pos2 = pos2 - colObj1->getWorldTransform().getOrigin();
-
relaxation = 1.f;
- btScalar rel_vel;
- btVector3 vel;
- int frictionIndex = m_tmpSolverContactConstraintPool.size();
+ btVector3 torqueAxis0 = rel_pos1.cross(cp.m_normalWorldOnB);
+ solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld()*torqueAxis0*rb0->getAngularFactor() : btVector3(0,0,0);
+ btVector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB);
+ solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld()*-torqueAxis1*rb1->getAngularFactor() : btVector3(0,0,0);
- {
- btSolverConstraint& solverConstraint = m_tmpSolverContactConstraintPool.expand();
- btRigidBody* rb0 = btRigidBody::upcast(colObj0);
- btRigidBody* rb1 = btRigidBody::upcast(colObj1);
-
- solverConstraint.m_solverBodyIdA = solverBodyIdA;
- solverConstraint.m_solverBodyIdB = solverBodyIdB;
-
- solverConstraint.m_originalContactPoint = &cp;
-
- btVector3 torqueAxis0 = rel_pos1.cross(cp.m_normalWorldOnB);
- solverConstraint.m_angularComponentA = rb0 ? rb0->getInvInertiaTensorWorld()*torqueAxis0*rb0->getAngularFactor() : btVector3(0,0,0);
- btVector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB);
- solverConstraint.m_angularComponentB = rb1 ? rb1->getInvInertiaTensorWorld()*-torqueAxis1*rb1->getAngularFactor() : btVector3(0,0,0);
{
#ifdef COMPUTE_IMPULSE_DENOM
btScalar denom0 = rb0->computeImpulseDenominator(pos1,cp.m_normalWorldOnB);
@@ -462,12 +505,12 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
solverConstraint.m_relpos2CrossNormal = rel_pos2.cross(-cp.m_normalWorldOnB);
- btVector3 vel1 = rb0 ? rb0->getVelocityInLocalPoint(rel_pos1) : btVector3(0,0,0);
- btVector3 vel2 = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
- vel = vel1 - vel2;
- rel_vel = cp.m_normalWorldOnB.dot(vel);
+ btVector3 vel1 = rb0 ? rb0->getVelocityInLocalPoint(rel_pos1) : btVector3(0,0,0);
+ btVector3 vel2 = rb1 ? rb1->getVelocityInLocalPoint(rel_pos2) : btVector3(0,0,0);
+ vel = vel1 - vel2;
+ rel_vel = cp.m_normalWorldOnB.dot(vel);
btScalar penetration = cp.getDistance()+infoGlobal.m_linearSlop;
@@ -494,15 +537,15 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
{
solverConstraint.m_appliedImpulse = cp.m_appliedImpulse * infoGlobal.m_warmstartingFactor;
if (rb0)
- m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdA].applyImpulse(solverConstraint.m_contactNormal*rb0->getInvMass()*rb0->getLinearFactor(),solverConstraint.m_angularComponentA,solverConstraint.m_appliedImpulse);
+ rb0->internalApplyImpulse(solverConstraint.m_contactNormal*rb0->getInvMass()*rb0->getLinearFactor(),solverConstraint.m_angularComponentA,solverConstraint.m_appliedImpulse);
if (rb1)
- m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdB].applyImpulse(solverConstraint.m_contactNormal*rb1->getInvMass()*rb1->getLinearFactor(),-solverConstraint.m_angularComponentB,-solverConstraint.m_appliedImpulse);
+ rb1->internalApplyImpulse(solverConstraint.m_contactNormal*rb1->getInvMass()*rb1->getLinearFactor(),-solverConstraint.m_angularComponentB,-(btScalar)solverConstraint.m_appliedImpulse);
} else
{
solverConstraint.m_appliedImpulse = 0.f;
}
- // solverConstraint.m_appliedPushImpulse = 0.f;
+ solverConstraint.m_appliedPushImpulse = 0.f;
{
btScalar rel_vel;
@@ -514,69 +557,46 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
rel_vel = vel1Dotn+vel2Dotn;
btScalar positionalError = 0.f;
- positionalError = -penetration * infoGlobal.m_erp/infoGlobal.m_timeStep;
btScalar velocityError = restitution - rel_vel;// * damping;
+
+ if (penetration>0)
+ {
+ positionalError = 0;
+ velocityError -= penetration / infoGlobal.m_timeStep;
+ } else
+ {
+ positionalError = -penetration * infoGlobal.m_erp/infoGlobal.m_timeStep;
+ }
+
btScalar penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv;
btScalar velocityImpulse = velocityError *solverConstraint.m_jacDiagABInv;
- solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
+ if (!infoGlobal.m_splitImpulse || (penetration > infoGlobal.m_splitImpulsePenetrationThreshold))
+ {
+ //combine position and velocity into rhs
+ solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
+ solverConstraint.m_rhsPenetration = 0.f;
+ } else
+ {
+ //split position and velocity into rhs and m_rhsPenetration
+ solverConstraint.m_rhs = velocityImpulse;
+ solverConstraint.m_rhsPenetration = penetrationImpulse;
+ }
solverConstraint.m_cfm = 0.f;
solverConstraint.m_lowerLimit = 0;
solverConstraint.m_upperLimit = 1e10f;
}
- /////setup the friction constraints
-
- if (1)
- {
- solverConstraint.m_frictionIndex = m_tmpSolverContactFrictionConstraintPool.size();
- if (!(infoGlobal.m_solverMode & SOLVER_ENABLE_FRICTION_DIRECTION_CACHING) || !cp.m_lateralFrictionInitialized)
- {
- cp.m_lateralFrictionDir1 = vel - cp.m_normalWorldOnB * rel_vel;
- btScalar lat_rel_vel = cp.m_lateralFrictionDir1.length2();
- if (!(infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION) && lat_rel_vel > SIMD_EPSILON)
- {
- cp.m_lateralFrictionDir1 /= btSqrt(lat_rel_vel);
- if((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
- {
- cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross(cp.m_normalWorldOnB);
- cp.m_lateralFrictionDir2.normalize();//??
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir2);
- addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
- }
-
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1);
- addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
- cp.m_lateralFrictionInitialized = true;
- } else
- {
- //re-calculate friction direction every frame, todo: check if this is really needed
- btPlaneSpace1(cp.m_normalWorldOnB,cp.m_lateralFrictionDir1,cp.m_lateralFrictionDir2);
- if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
- {
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir2);
- addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
- }
+}
- applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1);
- applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1);
- addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
- cp.m_lateralFrictionInitialized = true;
- }
-
- } else
- {
- addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
- if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
- addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyIdA,solverBodyIdB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
- }
+void btSequentialImpulseConstraintSolver::setFrictionConstraintImpulse( btSolverConstraint& solverConstraint,
+ btRigidBody* rb0, btRigidBody* rb1,
+ btManifoldPoint& cp, const btContactSolverInfo& infoGlobal)
+{
if (infoGlobal.m_solverMode & SOLVER_USE_FRICTION_WARMSTARTING)
{
{
@@ -585,9 +605,9 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
{
frictionConstraint1.m_appliedImpulse = cp.m_appliedImpulseLateral1 * infoGlobal.m_warmstartingFactor;
if (rb0)
- m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdA].applyImpulse(frictionConstraint1.m_contactNormal*rb0->getInvMass()*rb0->getLinearFactor(),frictionConstraint1.m_angularComponentA,frictionConstraint1.m_appliedImpulse);
+ rb0->internalApplyImpulse(frictionConstraint1.m_contactNormal*rb0->getInvMass()*rb0->getLinearFactor(),frictionConstraint1.m_angularComponentA,frictionConstraint1.m_appliedImpulse);
if (rb1)
- m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdB].applyImpulse(frictionConstraint1.m_contactNormal*rb1->getInvMass()*rb1->getLinearFactor(),-frictionConstraint1.m_angularComponentB,-frictionConstraint1.m_appliedImpulse);
+ rb1->internalApplyImpulse(frictionConstraint1.m_contactNormal*rb1->getInvMass()*rb1->getLinearFactor(),-frictionConstraint1.m_angularComponentB,-(btScalar)frictionConstraint1.m_appliedImpulse);
} else
{
frictionConstraint1.m_appliedImpulse = 0.f;
@@ -601,9 +621,9 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
{
frictionConstraint2.m_appliedImpulse = cp.m_appliedImpulseLateral2 * infoGlobal.m_warmstartingFactor;
if (rb0)
- m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdA].applyImpulse(frictionConstraint2.m_contactNormal*rb0->getInvMass(),frictionConstraint2.m_angularComponentA,frictionConstraint2.m_appliedImpulse);
+ rb0->internalApplyImpulse(frictionConstraint2.m_contactNormal*rb0->getInvMass(),frictionConstraint2.m_angularComponentA,frictionConstraint2.m_appliedImpulse);
if (rb1)
- m_tmpSolverBodyPool[solverConstraint.m_solverBodyIdB].applyImpulse(frictionConstraint2.m_contactNormal*rb1->getInvMass(),-frictionConstraint2.m_angularComponentB,-frictionConstraint2.m_appliedImpulse);
+ rb1->internalApplyImpulse(frictionConstraint2.m_contactNormal*rb1->getInvMass(),-frictionConstraint2.m_angularComponentB,-(btScalar)frictionConstraint2.m_appliedImpulse);
} else
{
frictionConstraint2.m_appliedImpulse = 0.f;
@@ -619,16 +639,109 @@ void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* m
frictionConstraint2.m_appliedImpulse = 0.f;
}
}
+}
+
+
+
+
+void btSequentialImpulseConstraintSolver::convertContact(btPersistentManifold* manifold,const btContactSolverInfo& infoGlobal)
+{
+ btCollisionObject* colObj0=0,*colObj1=0;
+
+ colObj0 = (btCollisionObject*)manifold->getBody0();
+ colObj1 = (btCollisionObject*)manifold->getBody1();
+
+
+ btRigidBody* solverBodyA = btRigidBody::upcast(colObj0);
+ btRigidBody* solverBodyB = btRigidBody::upcast(colObj1);
+
+ ///avoid collision response between two static objects
+ if ((!solverBodyA || !solverBodyA->getInvMass()) && (!solverBodyB || !solverBodyB->getInvMass()))
+ return;
+
+ for (int j=0;j<manifold->getNumContacts();j++)
+ {
+
+ btManifoldPoint& cp = manifold->getContactPoint(j);
+
+ if (cp.getDistance() <= manifold->getContactProcessingThreshold())
+ {
+ btVector3 rel_pos1;
+ btVector3 rel_pos2;
+ btScalar relaxation;
+ btScalar rel_vel;
+ btVector3 vel;
+
+ int frictionIndex = m_tmpSolverContactConstraintPool.size();
+ btSolverConstraint& solverConstraint = m_tmpSolverContactConstraintPool.expandNonInitializing();
+ btRigidBody* rb0 = btRigidBody::upcast(colObj0);
+ btRigidBody* rb1 = btRigidBody::upcast(colObj1);
+ solverConstraint.m_solverBodyA = rb0? rb0 : &getFixedBody();
+ solverConstraint.m_solverBodyB = rb1? rb1 : &getFixedBody();
+ solverConstraint.m_originalContactPoint = &cp;
+
+ setupContactConstraint(solverConstraint, colObj0, colObj1, cp, infoGlobal, vel, rel_vel, relaxation, rel_pos1, rel_pos2);
+
+// const btVector3& pos1 = cp.getPositionWorldOnA();
+// const btVector3& pos2 = cp.getPositionWorldOnB();
+
+ /////setup the friction constraints
+
+ solverConstraint.m_frictionIndex = m_tmpSolverContactFrictionConstraintPool.size();
+
+ if (!(infoGlobal.m_solverMode & SOLVER_ENABLE_FRICTION_DIRECTION_CACHING) || !cp.m_lateralFrictionInitialized)
+ {
+ cp.m_lateralFrictionDir1 = vel - cp.m_normalWorldOnB * rel_vel;
+ btScalar lat_rel_vel = cp.m_lateralFrictionDir1.length2();
+ if (!(infoGlobal.m_solverMode & SOLVER_DISABLE_VELOCITY_DEPENDENT_FRICTION_DIRECTION) && lat_rel_vel > SIMD_EPSILON)
+ {
+ cp.m_lateralFrictionDir1 /= btSqrt(lat_rel_vel);
+ if((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
+ {
+ cp.m_lateralFrictionDir2 = cp.m_lateralFrictionDir1.cross(cp.m_normalWorldOnB);
+ cp.m_lateralFrictionDir2.normalize();//??
+ applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2);
+ applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir2);
+ addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyA,solverBodyB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
+ }
+
+ applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1);
+ applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1);
+ addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyA,solverBodyB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
+ cp.m_lateralFrictionInitialized = true;
+ } else
+ {
+ //re-calculate friction direction every frame, todo: check if this is really needed
+ btPlaneSpace1(cp.m_normalWorldOnB,cp.m_lateralFrictionDir1,cp.m_lateralFrictionDir2);
+ if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
+ {
+ applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir2);
+ applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir2);
+ addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyA,solverBodyB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
+ }
+
+ applyAnisotropicFriction(colObj0,cp.m_lateralFrictionDir1);
+ applyAnisotropicFriction(colObj1,cp.m_lateralFrictionDir1);
+ addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyA,solverBodyB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation);
+
+ cp.m_lateralFrictionInitialized = true;
}
- }
+ } else
+ {
+ addFrictionConstraint(cp.m_lateralFrictionDir1,solverBodyA,solverBodyB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation,cp.m_contactMotion1, cp.m_contactCFM1);
+ if ((infoGlobal.m_solverMode & SOLVER_USE_2_FRICTION_DIRECTIONS))
+ addFrictionConstraint(cp.m_lateralFrictionDir2,solverBodyA,solverBodyB,frictionIndex,cp,rel_pos1,rel_pos2,colObj0,colObj1, relaxation, cp.m_contactMotion2, cp.m_contactCFM2);
+ }
+
+ setFrictionConstraintImpulse( solverConstraint, rb0, rb1, cp, infoGlobal);
}
}
}
-btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** /*bodies */,int /*numBodies */,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc)
+btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCollisionObject** bodies, int numBodies, btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc)
{
BT_PROFILE("solveGroupCacheFriendlySetup");
(void)stackAlloc;
@@ -641,6 +754,33 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
return 0.f;
}
+ if (infoGlobal.m_splitImpulse)
+ {
+ for (int i = 0; i < numBodies; i++)
+ {
+ btRigidBody* body = btRigidBody::upcast(bodies[i]);
+ if (body)
+ {
+ body->internalGetDeltaLinearVelocity().setZero();
+ body->internalGetDeltaAngularVelocity().setZero();
+ body->internalGetPushVelocity().setZero();
+ body->internalGetTurnVelocity().setZero();
+ }
+ }
+ }
+ else
+ {
+ for (int i = 0; i < numBodies; i++)
+ {
+ btRigidBody* body = btRigidBody::upcast(bodies[i]);
+ if (body)
+ {
+ body->internalGetDeltaLinearVelocity().setZero();
+ body->internalGetDeltaAngularVelocity().setZero();
+ }
+ }
+ }
+
if (1)
{
int j;
@@ -650,10 +790,6 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
constraint->buildJacobian();
}
}
-
- btSolverBody& fixedBody = m_tmpSolverBodyPool.expand();
- initSolverBody(&fixedBody,0);
-
//btRigidBody* rb0=0,*rb1=0;
//if (1)
@@ -662,26 +798,25 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
int totalNumRows = 0;
int i;
+
+ m_tmpConstraintSizesPool.resize(numConstraints);
//calculate the total number of contraint rows
for (i=0;i<numConstraints;i++)
{
-
- btTypedConstraint::btConstraintInfo1 info1;
+ btTypedConstraint::btConstraintInfo1& info1 = m_tmpConstraintSizesPool[i];
constraints[i]->getInfo1(&info1);
totalNumRows += info1.m_numConstraintRows;
}
m_tmpSolverNonContactConstraintPool.resize(totalNumRows);
- btTypedConstraint::btConstraintInfo1 info1;
- info1.m_numConstraintRows = 0;
-
-
+
///setup the btSolverConstraints
int currentRow = 0;
- for (i=0;i<numConstraints;i++,currentRow+=info1.m_numConstraintRows)
+ for (i=0;i<numConstraints;i++)
{
- constraints[i]->getInfo1(&info1);
+ const btTypedConstraint::btConstraintInfo1& info1 = m_tmpConstraintSizesPool[i];
+
if (info1.m_numConstraintRows)
{
btAssert(currentRow<totalNumRows);
@@ -694,12 +829,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
btRigidBody& rbA = constraint->getRigidBodyA();
btRigidBody& rbB = constraint->getRigidBodyB();
- int solverBodyIdA = getOrInitSolverBody(rbA);
- int solverBodyIdB = getOrInitSolverBody(rbB);
-
- btSolverBody* bodyAPtr = &m_tmpSolverBodyPool[solverBodyIdA];
- btSolverBody* bodyBPtr = &m_tmpSolverBodyPool[solverBodyIdB];
-
+
int j;
for ( j=0;j<info1.m_numConstraintRows;j++)
{
@@ -708,14 +838,14 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
currentConstraintRow[j].m_upperLimit = FLT_MAX;
currentConstraintRow[j].m_appliedImpulse = 0.f;
currentConstraintRow[j].m_appliedPushImpulse = 0.f;
- currentConstraintRow[j].m_solverBodyIdA = solverBodyIdA;
- currentConstraintRow[j].m_solverBodyIdB = solverBodyIdB;
+ currentConstraintRow[j].m_solverBodyA = &rbA;
+ currentConstraintRow[j].m_solverBodyB = &rbB;
}
- bodyAPtr->m_deltaLinearVelocity.setValue(0.f,0.f,0.f);
- bodyAPtr->m_deltaAngularVelocity.setValue(0.f,0.f,0.f);
- bodyBPtr->m_deltaLinearVelocity.setValue(0.f,0.f,0.f);
- bodyBPtr->m_deltaAngularVelocity.setValue(0.f,0.f,0.f);
+ rbA.internalGetDeltaLinearVelocity().setValue(0.f,0.f,0.f);
+ rbA.internalGetDeltaAngularVelocity().setValue(0.f,0.f,0.f);
+ rbB.internalGetDeltaLinearVelocity().setValue(0.f,0.f,0.f);
+ rbB.internalGetDeltaAngularVelocity().setValue(0.f,0.f,0.f);
@@ -730,15 +860,19 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
///the size of btSolverConstraint needs be a multiple of btScalar
btAssert(info2.rowskip*sizeof(btScalar)== sizeof(btSolverConstraint));
info2.m_constraintError = &currentConstraintRow->m_rhs;
+ currentConstraintRow->m_cfm = infoGlobal.m_globalCfm;
+ info2.m_damping = infoGlobal.m_damping;
info2.cfm = &currentConstraintRow->m_cfm;
info2.m_lowerLimit = &currentConstraintRow->m_lowerLimit;
info2.m_upperLimit = &currentConstraintRow->m_upperLimit;
+ info2.m_numIterations = infoGlobal.m_numIterations;
constraints[i]->getInfo2(&info2);
///finalize the constraint setup
for ( j=0;j<info1.m_numConstraintRows;j++)
{
btSolverConstraint& solverConstraint = currentConstraintRow[j];
+ solverConstraint.m_originalContactPoint = constraint;
{
const btVector3& ftorqueAxis1 = solverConstraint.m_relpos1CrossNormal;
@@ -775,7 +909,7 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
btScalar restitution = 0.f;
btScalar positionalError = solverConstraint.m_rhs;//already filled in by getConstraintInfo2
- btScalar velocityError = restitution - rel_vel;// * damping;
+ btScalar velocityError = restitution - rel_vel * info2.m_damping;
btScalar penetrationImpulse = positionalError*solverConstraint.m_jacDiagABInv;
btScalar velocityImpulse = velocityError *solverConstraint.m_jacDiagABInv;
solverConstraint.m_rhs = penetrationImpulse+velocityImpulse;
@@ -784,13 +918,14 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
}
}
}
+ currentRow+=m_tmpConstraintSizesPool[i].m_numConstraintRows;
}
}
{
int i;
btPersistentManifold* manifold = 0;
- btCollisionObject* colObj0=0,*colObj1=0;
+// btCollisionObject* colObj0=0,*colObj1=0;
for (i=0;i<numManifolds;i++)
@@ -827,152 +962,173 @@ btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySetup(btCol
}
-btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyIterations(btCollisionObject** /*bodies */,int /*numBodies*/,btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* /*debugDrawer*/,btStackAlloc* /*stackAlloc*/)
+btScalar btSequentialImpulseConstraintSolver::solveSingleIteration(int iteration, btCollisionObject** /*bodies */,int /*numBodies*/,btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* /*debugDrawer*/,btStackAlloc* /*stackAlloc*/)
{
- BT_PROFILE("solveGroupCacheFriendlyIterations");
int numConstraintPool = m_tmpSolverContactConstraintPool.size();
int numFrictionPool = m_tmpSolverContactFrictionConstraintPool.size();
- //should traverse the contacts random order...
- int iteration;
+ int j;
+
+ if (infoGlobal.m_solverMode & SOLVER_RANDMIZE_ORDER)
{
- for ( iteration = 0;iteration<infoGlobal.m_numIterations;iteration++)
- {
+ if ((iteration & 7) == 0) {
+ for (j=0; j<numConstraintPool; ++j) {
+ int tmp = m_orderTmpConstraintPool[j];
+ int swapi = btRandInt2(j+1);
+ m_orderTmpConstraintPool[j] = m_orderTmpConstraintPool[swapi];
+ m_orderTmpConstraintPool[swapi] = tmp;
+ }
- int j;
- if (infoGlobal.m_solverMode & SOLVER_RANDMIZE_ORDER)
+ for (j=0; j<numFrictionPool; ++j) {
+ int tmp = m_orderFrictionConstraintPool[j];
+ int swapi = btRandInt2(j+1);
+ m_orderFrictionConstraintPool[j] = m_orderFrictionConstraintPool[swapi];
+ m_orderFrictionConstraintPool[swapi] = tmp;
+ }
+ }
+ }
+
+ if (infoGlobal.m_solverMode & SOLVER_SIMD)
+ {
+ ///solve all joint constraints, using SIMD, if available
+ for (j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
+ {
+ btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[j];
+ resolveSingleConstraintRowGenericSIMD(*constraint.m_solverBodyA,*constraint.m_solverBodyB,constraint);
+ }
+
+ for (j=0;j<numConstraints;j++)
+ {
+ constraints[j]->solveConstraintObsolete(constraints[j]->getRigidBodyA(),constraints[j]->getRigidBodyB(),infoGlobal.m_timeStep);
+ }
+
+ ///solve all contact constraints using SIMD, if available
+ int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
+ for (j=0;j<numPoolConstraints;j++)
+ {
+ const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
+ resolveSingleConstraintRowLowerLimitSIMD(*solveManifold.m_solverBodyA,*solveManifold.m_solverBodyB,solveManifold);
+
+ }
+ ///solve all friction constraints, using SIMD, if available
+ int numFrictionPoolConstraints = m_tmpSolverContactFrictionConstraintPool.size();
+ for (j=0;j<numFrictionPoolConstraints;j++)
+ {
+ btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[j]];
+ btScalar totalImpulse = m_tmpSolverContactConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
+
+ if (totalImpulse>btScalar(0))
{
- if ((iteration & 7) == 0) {
- for (j=0; j<numConstraintPool; ++j) {
- int tmp = m_orderTmpConstraintPool[j];
- int swapi = btRandInt2(j+1);
- m_orderTmpConstraintPool[j] = m_orderTmpConstraintPool[swapi];
- m_orderTmpConstraintPool[swapi] = tmp;
- }
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
- for (j=0; j<numFrictionPool; ++j) {
- int tmp = m_orderFrictionConstraintPool[j];
- int swapi = btRandInt2(j+1);
- m_orderFrictionConstraintPool[j] = m_orderFrictionConstraintPool[swapi];
- m_orderFrictionConstraintPool[swapi] = tmp;
- }
- }
+ resolveSingleConstraintRowGenericSIMD(*solveManifold.m_solverBodyA, *solveManifold.m_solverBodyB,solveManifold);
}
+ }
+ } else
+ {
- if (infoGlobal.m_solverMode & SOLVER_SIMD)
+ ///solve all joint constraints
+ for (j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
+ {
+ btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[j];
+ resolveSingleConstraintRowGeneric(*constraint.m_solverBodyA,*constraint.m_solverBodyB,constraint);
+ }
+
+ for (j=0;j<numConstraints;j++)
+ {
+ constraints[j]->solveConstraintObsolete(constraints[j]->getRigidBodyA(),constraints[j]->getRigidBodyB(),infoGlobal.m_timeStep);
+ }
+ ///solve all contact constraints
+ int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
+ for (j=0;j<numPoolConstraints;j++)
+ {
+ const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
+ resolveSingleConstraintRowLowerLimit(*solveManifold.m_solverBodyA,*solveManifold.m_solverBodyB,solveManifold);
+ }
+ ///solve all friction constraints
+ int numFrictionPoolConstraints = m_tmpSolverContactFrictionConstraintPool.size();
+ for (j=0;j<numFrictionPoolConstraints;j++)
+ {
+ btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[j]];
+ btScalar totalImpulse = m_tmpSolverContactConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
+
+ if (totalImpulse>btScalar(0))
{
- ///solve all joint constraints, using SIMD, if available
- for (j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
- {
- btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[j];
- resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[constraint.m_solverBodyIdA],m_tmpSolverBodyPool[constraint.m_solverBodyIdB],constraint);
- }
+ solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
+ solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
- for (j=0;j<numConstraints;j++)
- {
- int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA());
- int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB());
- btSolverBody& bodyA = m_tmpSolverBodyPool[bodyAid];
- btSolverBody& bodyB = m_tmpSolverBodyPool[bodyBid];
- constraints[j]->solveConstraintObsolete(bodyA,bodyB,infoGlobal.m_timeStep);
- }
+ resolveSingleConstraintRowGeneric(*solveManifold.m_solverBodyA,*solveManifold.m_solverBodyB,solveManifold);
+ }
+ }
+ }
+ return 0.f;
+}
- ///solve all contact constraints using SIMD, if available
- int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
- for (j=0;j<numPoolConstraints;j++)
- {
- const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- resolveSingleConstraintRowLowerLimitSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
- }
- ///solve all friction constraints, using SIMD, if available
- int numFrictionPoolConstraints = m_tmpSolverContactFrictionConstraintPool.size();
- for (j=0;j<numFrictionPoolConstraints;j++)
+void btSequentialImpulseConstraintSolver::solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc)
+{
+ int iteration;
+ if (infoGlobal.m_splitImpulse)
+ {
+ if (infoGlobal.m_solverMode & SOLVER_SIMD)
+ {
+ for ( iteration = 0;iteration<infoGlobal.m_numIterations;iteration++)
+ {
{
- btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[j]];
- btScalar totalImpulse = m_tmpSolverContactConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
-
- if (totalImpulse>btScalar(0))
+ int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
+ int j;
+ for (j=0;j<numPoolConstraints;j++)
{
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
+ const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- resolveSingleConstraintRowGenericSIMD(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ resolveSplitPenetrationSIMD(*solveManifold.m_solverBodyA,*solveManifold.m_solverBodyB,solveManifold);
}
}
- } else
+ }
+ }
+ else
+ {
+ for ( iteration = 0;iteration<infoGlobal.m_numIterations;iteration++)
{
-
- ///solve all joint constraints
- for (j=0;j<m_tmpSolverNonContactConstraintPool.size();j++)
{
- btSolverConstraint& constraint = m_tmpSolverNonContactConstraintPool[j];
- resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[constraint.m_solverBodyIdA],m_tmpSolverBodyPool[constraint.m_solverBodyIdB],constraint);
- }
-
- for (j=0;j<numConstraints;j++)
- {
- int bodyAid = getOrInitSolverBody(constraints[j]->getRigidBodyA());
- int bodyBid = getOrInitSolverBody(constraints[j]->getRigidBodyB());
- btSolverBody& bodyA = m_tmpSolverBodyPool[bodyAid];
- btSolverBody& bodyB = m_tmpSolverBodyPool[bodyBid];
-
- constraints[j]->solveConstraintObsolete(bodyA,bodyB,infoGlobal.m_timeStep);
- }
-
- ///solve all contact constraints
- int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
- for (j=0;j<numPoolConstraints;j++)
- {
- const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- resolveSingleConstraintRowLowerLimit(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA],m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
- }
- ///solve all friction constraints
- int numFrictionPoolConstraints = m_tmpSolverContactFrictionConstraintPool.size();
- for (j=0;j<numFrictionPoolConstraints;j++)
- {
- btSolverConstraint& solveManifold = m_tmpSolverContactFrictionConstraintPool[m_orderFrictionConstraintPool[j]];
- btScalar totalImpulse = m_tmpSolverContactConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
-
- if (totalImpulse>btScalar(0))
+ int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
+ int j;
+ for (j=0;j<numPoolConstraints;j++)
{
- solveManifold.m_lowerLimit = -(solveManifold.m_friction*totalImpulse);
- solveManifold.m_upperLimit = solveManifold.m_friction*totalImpulse;
+ const btSolverConstraint& solveManifold = m_tmpSolverContactConstraintPool[m_orderTmpConstraintPool[j]];
- resolveSingleConstraintRowGeneric(m_tmpSolverBodyPool[solveManifold.m_solverBodyIdA], m_tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold);
+ resolveSplitPenetrationImpulseCacheFriendly(*solveManifold.m_solverBodyA,*solveManifold.m_solverBodyB,solveManifold);
}
}
}
-
-
-
}
}
- return 0.f;
}
-
-
-/// btSequentialImpulseConstraintSolver Sequentially applies impulses
-btScalar btSequentialImpulseConstraintSolver::solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc,btDispatcher* /*dispatcher*/)
+btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyIterations(btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc)
{
+ BT_PROFILE("solveGroupCacheFriendlyIterations");
+ //should traverse the contacts random order...
+ int iteration;
+ {
+ for ( iteration = 0;iteration<infoGlobal.m_numIterations;iteration++)
+ {
+ solveSingleIteration(iteration, bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer,stackAlloc);
+ }
+
+ solveGroupCacheFriendlySplitImpulseIterations(bodies ,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer,stackAlloc);
+ }
+ return 0.f;
+}
- BT_PROFILE("solveGroup");
- //we only implement SOLVER_CACHE_FRIENDLY now
- //you need to provide at least some bodies
- btAssert(bodies);
- btAssert(numBodies);
-
- int i;
-
- solveGroupCacheFriendlySetup( bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer, stackAlloc);
- solveGroupCacheFriendlyIterations(bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer, stackAlloc);
-
+btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendlyFinish(btCollisionObject** bodies ,int numBodies,btPersistentManifold** /*manifoldPtr*/, int /*numManifolds*/,btTypedConstraint** /*constraints*/,int /* numConstraints*/,const btContactSolverInfo& infoGlobal,btIDebugDraw* /*debugDrawer*/,btStackAlloc* /*stackAlloc*/)
+{
int numPoolConstraints = m_tmpSolverContactConstraintPool.size();
- int j;
+ int i,j;
for (j=0;j<numPoolConstraints;j++)
{
@@ -990,22 +1146,36 @@ btScalar btSequentialImpulseConstraintSolver::solveGroup(btCollisionObject** bod
//do a callback here?
}
+ numPoolConstraints = m_tmpSolverNonContactConstraintPool.size();
+ for (j=0;j<numPoolConstraints;j++)
+ {
+ const btSolverConstraint& solverConstr = m_tmpSolverNonContactConstraintPool[j];
+ btTypedConstraint* constr = (btTypedConstraint*)solverConstr.m_originalContactPoint;
+ btScalar sum = constr->internalGetAppliedImpulse();
+ sum += solverConstr.m_appliedImpulse;
+ constr->internalSetAppliedImpulse(sum);
+ }
+
+
if (infoGlobal.m_splitImpulse)
{
- for ( i=0;i<m_tmpSolverBodyPool.size();i++)
+ for ( i=0;i<numBodies;i++)
{
- m_tmpSolverBodyPool[i].writebackVelocity(infoGlobal.m_timeStep);
+ btRigidBody* body = btRigidBody::upcast(bodies[i]);
+ if (body)
+ body->internalWritebackVelocity(infoGlobal.m_timeStep);
}
} else
{
- for ( i=0;i<m_tmpSolverBodyPool.size();i++)
+ for ( i=0;i<numBodies;i++)
{
- m_tmpSolverBodyPool[i].writebackVelocity();
+ btRigidBody* body = btRigidBody::upcast(bodies[i]);
+ if (body)
+ body->internalWritebackVelocity();
}
}
- m_tmpSolverBodyPool.resize(0);
m_tmpSolverContactConstraintPool.resize(0);
m_tmpSolverNonContactConstraintPool.resize(0);
m_tmpSolverContactFrictionConstraintPool.resize(0);
@@ -1015,15 +1185,33 @@ btScalar btSequentialImpulseConstraintSolver::solveGroup(btCollisionObject** bod
+/// btSequentialImpulseConstraintSolver Sequentially applies impulses
+btScalar btSequentialImpulseConstraintSolver::solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc,btDispatcher* /*dispatcher*/)
+{
+ BT_PROFILE("solveGroup");
+ //you need to provide at least some bodies
+ btAssert(bodies);
+ btAssert(numBodies);
+ solveGroupCacheFriendlySetup( bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer, stackAlloc);
+ solveGroupCacheFriendlyIterations(bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer, stackAlloc);
-
+ solveGroupCacheFriendlyFinish(bodies, numBodies, manifoldPtr, numManifolds,constraints, numConstraints,infoGlobal,debugDrawer, stackAlloc);
+
+ return 0.f;
+}
void btSequentialImpulseConstraintSolver::reset()
{
m_btSeed2 = 0;
}
+btRigidBody& btSequentialImpulseConstraintSolver::getFixedBody()
+{
+ static btRigidBody s_fixed(0, 0,0);
+ s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
+ return s_fixed;
+}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h
index 90e7fc8354d..f268ec9ae74 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h
@@ -21,48 +21,76 @@ class btIDebugDraw;
#include "btContactConstraint.h"
#include "btSolverBody.h"
#include "btSolverConstraint.h"
-
-
+#include "btTypedConstraint.h"
+#include "BulletCollision/NarrowPhaseCollision/btManifoldPoint.h"
///The btSequentialImpulseConstraintSolver is a fast SIMD implementation of the Projected Gauss Seidel (iterative LCP) method.
class btSequentialImpulseConstraintSolver : public btConstraintSolver
{
protected:
- btAlignedObjectArray<btSolverBody> m_tmpSolverBodyPool;
btConstraintArray m_tmpSolverContactConstraintPool;
btConstraintArray m_tmpSolverNonContactConstraintPool;
btConstraintArray m_tmpSolverContactFrictionConstraintPool;
btAlignedObjectArray<int> m_orderTmpConstraintPool;
btAlignedObjectArray<int> m_orderFrictionConstraintPool;
+ btAlignedObjectArray<btTypedConstraint::btConstraintInfo1> m_tmpConstraintSizesPool;
- btSolverConstraint& addFrictionConstraint(const btVector3& normalAxis,int solverBodyIdA,int solverBodyIdB,int frictionIndex,btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2,btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation);
+ void setupFrictionConstraint( btSolverConstraint& solverConstraint, const btVector3& normalAxis,btRigidBody* solverBodyA,btRigidBody* solverBodyIdB,
+ btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2,
+ btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation,
+ btScalar desiredVelocity=0., btScalar cfmSlip=0.);
+
+ btSolverConstraint& addFrictionConstraint(const btVector3& normalAxis,btRigidBody* solverBodyA,btRigidBody* solverBodyB,int frictionIndex,btManifoldPoint& cp,const btVector3& rel_pos1,const btVector3& rel_pos2,btCollisionObject* colObj0,btCollisionObject* colObj1, btScalar relaxation, btScalar desiredVelocity=0., btScalar cfmSlip=0.);
+ void setupContactConstraint(btSolverConstraint& solverConstraint, btCollisionObject* colObj0, btCollisionObject* colObj1, btManifoldPoint& cp,
+ const btContactSolverInfo& infoGlobal, btVector3& vel, btScalar& rel_vel, btScalar& relaxation,
+ btVector3& rel_pos1, btVector3& rel_pos2);
+
+ void setFrictionConstraintImpulse( btSolverConstraint& solverConstraint, btRigidBody* rb0, btRigidBody* rb1,
+ btManifoldPoint& cp, const btContactSolverInfo& infoGlobal);
+
///m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction
unsigned long m_btSeed2;
- void initSolverBody(btSolverBody* solverBody, btCollisionObject* collisionObject);
+// void initSolverBody(btSolverBody* solverBody, btCollisionObject* collisionObject);
btScalar restitutionCurve(btScalar rel_vel, btScalar restitution);
void convertContact(btPersistentManifold* manifold,const btContactSolverInfo& infoGlobal);
+
+ void resolveSplitPenetrationSIMD(
+ btRigidBody& body1,
+ btRigidBody& body2,
+ const btSolverConstraint& contactConstraint);
+
void resolveSplitPenetrationImpulseCacheFriendly(
- btSolverBody& body1,
- btSolverBody& body2,
- const btSolverConstraint& contactConstraint,
- const btContactSolverInfo& solverInfo);
+ btRigidBody& body1,
+ btRigidBody& body2,
+ const btSolverConstraint& contactConstraint);
//internal method
int getOrInitSolverBody(btCollisionObject& body);
- void resolveSingleConstraintRowGeneric(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& contactConstraint);
+ void resolveSingleConstraintRowGeneric(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& contactConstraint);
- void resolveSingleConstraintRowGenericSIMD(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& contactConstraint);
+ void resolveSingleConstraintRowGenericSIMD(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& contactConstraint);
- void resolveSingleConstraintRowLowerLimit(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& contactConstraint);
+ void resolveSingleConstraintRowLowerLimit(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& contactConstraint);
- void resolveSingleConstraintRowLowerLimitSIMD(btSolverBody& body1,btSolverBody& body2,const btSolverConstraint& contactConstraint);
+ void resolveSingleConstraintRowLowerLimitSIMD(btRigidBody& body1,btRigidBody& body2,const btSolverConstraint& contactConstraint);
+protected:
+ static btRigidBody& getFixedBody();
+
+ virtual void solveGroupCacheFriendlySplitImpulseIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc);
+ virtual btScalar solveGroupCacheFriendlyFinish(btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc);
+ btScalar solveSingleIteration(int iteration, btCollisionObject** bodies ,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc);
+
+ virtual btScalar solveGroupCacheFriendlySetup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc);
+ virtual btScalar solveGroupCacheFriendlyIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc);
+
+
public:
@@ -71,9 +99,8 @@ public:
virtual btScalar solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& info, btIDebugDraw* debugDrawer, btStackAlloc* stackAlloc,btDispatcher* dispatcher);
- btScalar solveGroupCacheFriendlySetup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc);
- btScalar solveGroupCacheFriendlyIterations(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc);
+
///clear internal cached data and reset random seed
virtual void reset();
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp
index 133aed7271b..b69f46da1b4 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp
@@ -25,7 +25,7 @@ April 04, 2008
#include "LinearMath/btTransformUtil.h"
#include <new>
-
+#define USE_OFFSET_FOR_CONSTANT_FRAME true
void btSliderConstraint::initParams()
{
@@ -36,21 +36,27 @@ void btSliderConstraint::initParams()
m_softnessDirLin = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionDirLin = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingDirLin = btScalar(0.);
+ m_cfmDirLin = SLIDER_CONSTRAINT_DEF_CFM;
m_softnessDirAng = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionDirAng = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingDirAng = btScalar(0.);
+ m_cfmDirAng = SLIDER_CONSTRAINT_DEF_CFM;
m_softnessOrthoLin = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionOrthoLin = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingOrthoLin = SLIDER_CONSTRAINT_DEF_DAMPING;
+ m_cfmOrthoLin = SLIDER_CONSTRAINT_DEF_CFM;
m_softnessOrthoAng = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionOrthoAng = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingOrthoAng = SLIDER_CONSTRAINT_DEF_DAMPING;
+ m_cfmOrthoAng = SLIDER_CONSTRAINT_DEF_CFM;
m_softnessLimLin = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionLimLin = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingLimLin = SLIDER_CONSTRAINT_DEF_DAMPING;
+ m_cfmLimLin = SLIDER_CONSTRAINT_DEF_CFM;
m_softnessLimAng = SLIDER_CONSTRAINT_DEF_SOFTNESS;
m_restitutionLimAng = SLIDER_CONSTRAINT_DEF_RESTITUTION;
m_dampingLimAng = SLIDER_CONSTRAINT_DEF_DAMPING;
+ m_cfmLimAng = SLIDER_CONSTRAINT_DEF_CFM;
m_poweredLinMotor = false;
m_targetLinMotorVelocity = btScalar(0.);
@@ -62,43 +68,38 @@ void btSliderConstraint::initParams()
m_maxAngMotorForce = btScalar(0.);
m_accumulatedAngMotorImpulse = btScalar(0.0);
-}
-
+ m_flags = 0;
+ m_flags = 0;
+ m_useOffsetForConstraintFrame = USE_OFFSET_FOR_CONSTANT_FRAME;
-btSliderConstraint::btSliderConstraint()
- :btTypedConstraint(SLIDER_CONSTRAINT_TYPE),
- m_useLinearReferenceFrameA(true),
- m_useSolveConstraintObsolete(false)
-// m_useSolveConstraintObsolete(true)
-{
- initParams();
+ calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
}
+
+
btSliderConstraint::btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA)
- : btTypedConstraint(SLIDER_CONSTRAINT_TYPE, rbA, rbB)
- , m_frameInA(frameInA)
- , m_frameInB(frameInB),
- m_useLinearReferenceFrameA(useLinearReferenceFrameA),
- m_useSolveConstraintObsolete(false)
-// m_useSolveConstraintObsolete(true)
+ : btTypedConstraint(SLIDER_CONSTRAINT_TYPE, rbA, rbB),
+ m_useSolveConstraintObsolete(false),
+ m_frameInA(frameInA),
+ m_frameInB(frameInB),
+ m_useLinearReferenceFrameA(useLinearReferenceFrameA)
{
initParams();
}
-static btRigidBody s_fixed(0, 0, 0);
-btSliderConstraint::btSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB)
- : btTypedConstraint(SLIDER_CONSTRAINT_TYPE, s_fixed, rbB)
- ,
- m_frameInB(frameInB),
- m_useLinearReferenceFrameA(useLinearReferenceFrameB),
- m_useSolveConstraintObsolete(false)
-// m_useSolveConstraintObsolete(true)
+
+btSliderConstraint::btSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA)
+ : btTypedConstraint(SLIDER_CONSTRAINT_TYPE, getFixedBody(), rbB),
+ m_useSolveConstraintObsolete(false),
+ m_frameInB(frameInB),
+ m_useLinearReferenceFrameA(useLinearReferenceFrameA)
{
- ///not providing rigidbody B means implicitly using worldspace for body B
+ ///not providing rigidbody A means implicitly using worldspace for body A
+ m_frameInA = rbB.getCenterOfMassTransform() * m_frameInB;
// m_frameInA.getOrigin() = m_rbA.getCenterOfMassTransform()(m_frameInA.getOrigin());
initParams();
@@ -106,117 +107,211 @@ btSliderConstraint::btSliderConstraint(btRigidBody& rbB, const btTransform& fram
-void btSliderConstraint::buildJacobian()
+
+
+
+void btSliderConstraint::getInfo1(btConstraintInfo1* info)
{
- if (!m_useSolveConstraintObsolete)
- {
- return;
- }
- if(m_useLinearReferenceFrameA)
+ if (m_useSolveConstraintObsolete)
{
- buildJacobianInt(m_rbA, m_rbB, m_frameInA, m_frameInB);
+ info->m_numConstraintRows = 0;
+ info->nub = 0;
}
else
{
- buildJacobianInt(m_rbB, m_rbA, m_frameInB, m_frameInA);
+ info->m_numConstraintRows = 4; // Fixed 2 linear + 2 angular
+ info->nub = 2;
+ //prepare constraint
+ calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ testAngLimits();
+ testLinLimits();
+ if(getSolveLinLimit() || getPoweredLinMotor())
+ {
+ info->m_numConstraintRows++; // limit 3rd linear as well
+ info->nub--;
+ }
+ if(getSolveAngLimit() || getPoweredAngMotor())
+ {
+ info->m_numConstraintRows++; // limit 3rd angular as well
+ info->nub--;
+ }
}
}
+void btSliderConstraint::getInfo1NonVirtual(btConstraintInfo1* info)
+{
+
+ info->m_numConstraintRows = 6; // Fixed 2 linear + 2 angular + 1 limit (even if not used)
+ info->nub = 0;
+}
+
+void btSliderConstraint::getInfo2(btConstraintInfo2* info)
+{
+ getInfo2NonVirtual(info,m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform(), m_rbA.getLinearVelocity(),m_rbB.getLinearVelocity(), m_rbA.getInvMass(),m_rbB.getInvMass());
+}
+
-void btSliderConstraint::buildJacobianInt(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB)
+
+
+
+
+void btSliderConstraint::calculateTransforms(const btTransform& transA,const btTransform& transB)
{
- //calculate transforms
- m_calculatedTransformA = rbA.getCenterOfMassTransform() * frameInA;
- m_calculatedTransformB = rbB.getCenterOfMassTransform() * frameInB;
+ if(m_useLinearReferenceFrameA || (!m_useSolveConstraintObsolete))
+ {
+ m_calculatedTransformA = transA * m_frameInA;
+ m_calculatedTransformB = transB * m_frameInB;
+ }
+ else
+ {
+ m_calculatedTransformA = transB * m_frameInB;
+ m_calculatedTransformB = transA * m_frameInA;
+ }
m_realPivotAInW = m_calculatedTransformA.getOrigin();
m_realPivotBInW = m_calculatedTransformB.getOrigin();
m_sliderAxis = m_calculatedTransformA.getBasis().getColumn(0); // along X
- m_delta = m_realPivotBInW - m_realPivotAInW;
+ if(m_useLinearReferenceFrameA || m_useSolveConstraintObsolete)
+ {
+ m_delta = m_realPivotBInW - m_realPivotAInW;
+ }
+ else
+ {
+ m_delta = m_realPivotAInW - m_realPivotBInW;
+ }
m_projPivotInW = m_realPivotAInW + m_sliderAxis.dot(m_delta) * m_sliderAxis;
- m_relPosA = m_projPivotInW - rbA.getCenterOfMassPosition();
- m_relPosB = m_realPivotBInW - rbB.getCenterOfMassPosition();
btVector3 normalWorld;
int i;
//linear part
for(i = 0; i < 3; i++)
{
normalWorld = m_calculatedTransformA.getBasis().getColumn(i);
- new (&m_jacLin[i]) btJacobianEntry(
- rbA.getCenterOfMassTransform().getBasis().transpose(),
- rbB.getCenterOfMassTransform().getBasis().transpose(),
- m_relPosA,
- m_relPosB,
- normalWorld,
- rbA.getInvInertiaDiagLocal(),
- rbA.getInvMass(),
- rbB.getInvInertiaDiagLocal(),
- rbB.getInvMass()
- );
- m_jacLinDiagABInv[i] = btScalar(1.) / m_jacLin[i].getDiagonal();
m_depth[i] = m_delta.dot(normalWorld);
}
- testLinLimits();
- // angular part
- for(i = 0; i < 3; i++)
- {
- normalWorld = m_calculatedTransformA.getBasis().getColumn(i);
- new (&m_jacAng[i]) btJacobianEntry(
- normalWorld,
- rbA.getCenterOfMassTransform().getBasis().transpose(),
- rbB.getCenterOfMassTransform().getBasis().transpose(),
- rbA.getInvInertiaDiagLocal(),
- rbB.getInvInertiaDiagLocal()
- );
- }
- testAngLimits();
- btVector3 axisA = m_calculatedTransformA.getBasis().getColumn(0);
- m_kAngle = btScalar(1.0 )/ (rbA.computeAngularImpulseDenominator(axisA) + rbB.computeAngularImpulseDenominator(axisA));
- // clear accumulator for motors
- m_accumulatedLinMotorImpulse = btScalar(0.0);
- m_accumulatedAngMotorImpulse = btScalar(0.0);
}
+
-
-void btSliderConstraint::getInfo1(btConstraintInfo1* info)
+void btSliderConstraint::testLinLimits(void)
{
- if (m_useSolveConstraintObsolete)
+ m_solveLinLim = false;
+ m_linPos = m_depth[0];
+ if(m_lowerLinLimit <= m_upperLinLimit)
{
- info->m_numConstraintRows = 0;
- info->nub = 0;
+ if(m_depth[0] > m_upperLinLimit)
+ {
+ m_depth[0] -= m_upperLinLimit;
+ m_solveLinLim = true;
+ }
+ else if(m_depth[0] < m_lowerLinLimit)
+ {
+ m_depth[0] -= m_lowerLinLimit;
+ m_solveLinLim = true;
+ }
+ else
+ {
+ m_depth[0] = btScalar(0.);
+ }
}
else
{
- info->m_numConstraintRows = 4; // Fixed 2 linear + 2 angular
- info->nub = 2;
- //prepare constraint
- calculateTransforms();
- testLinLimits();
- if(getSolveLinLimit() || getPoweredLinMotor())
+ m_depth[0] = btScalar(0.);
+ }
+}
+
+
+
+void btSliderConstraint::testAngLimits(void)
+{
+ m_angDepth = btScalar(0.);
+ m_solveAngLim = false;
+ if(m_lowerAngLimit <= m_upperAngLimit)
+ {
+ const btVector3 axisA0 = m_calculatedTransformA.getBasis().getColumn(1);
+ const btVector3 axisA1 = m_calculatedTransformA.getBasis().getColumn(2);
+ const btVector3 axisB0 = m_calculatedTransformB.getBasis().getColumn(1);
+// btScalar rot = btAtan2Fast(axisB0.dot(axisA1), axisB0.dot(axisA0));
+ btScalar rot = btAtan2(axisB0.dot(axisA1), axisB0.dot(axisA0));
+ rot = btAdjustAngleToLimits(rot, m_lowerAngLimit, m_upperAngLimit);
+ m_angPos = rot;
+ if(rot < m_lowerAngLimit)
{
- info->m_numConstraintRows++; // limit 3rd linear as well
- info->nub--;
- }
- testAngLimits();
- if(getSolveAngLimit() || getPoweredAngMotor())
+ m_angDepth = rot - m_lowerAngLimit;
+ m_solveAngLim = true;
+ }
+ else if(rot > m_upperAngLimit)
{
- info->m_numConstraintRows++; // limit 3rd angular as well
- info->nub--;
+ m_angDepth = rot - m_upperAngLimit;
+ m_solveAngLim = true;
}
}
}
+btVector3 btSliderConstraint::getAncorInA(void)
+{
+ btVector3 ancorInA;
+ ancorInA = m_realPivotAInW + (m_lowerLinLimit + m_upperLinLimit) * btScalar(0.5) * m_sliderAxis;
+ ancorInA = m_rbA.getCenterOfMassTransform().inverse() * ancorInA;
+ return ancorInA;
+}
+
-void btSliderConstraint::getInfo2(btConstraintInfo2* info)
+btVector3 btSliderConstraint::getAncorInB(void)
+{
+ btVector3 ancorInB;
+ ancorInB = m_frameInB.getOrigin();
+ return ancorInB;
+}
+
+
+void btSliderConstraint::getInfo2NonVirtual(btConstraintInfo2* info, const btTransform& transA,const btTransform& transB, const btVector3& linVelA,const btVector3& linVelB, btScalar rbAinvMass,btScalar rbBinvMass )
{
- btAssert(!m_useSolveConstraintObsolete);
- int i, s = info->rowskip;
const btTransform& trA = getCalculatedTransformA();
const btTransform& trB = getCalculatedTransformB();
+
+ btAssert(!m_useSolveConstraintObsolete);
+ int i, s = info->rowskip;
+
btScalar signFact = m_useLinearReferenceFrameA ? btScalar(1.0f) : btScalar(-1.0f);
- // make rotations around Y and Z equal
+
+ // difference between frames in WCS
+ btVector3 ofs = trB.getOrigin() - trA.getOrigin();
+ // now get weight factors depending on masses
+ btScalar miA = rbAinvMass;
+ btScalar miB = rbBinvMass;
+ bool hasStaticBody = (miA < SIMD_EPSILON) || (miB < SIMD_EPSILON);
+ btScalar miS = miA + miB;
+ btScalar factA, factB;
+ if(miS > btScalar(0.f))
+ {
+ factA = miB / miS;
+ }
+ else
+ {
+ factA = btScalar(0.5f);
+ }
+ factB = btScalar(1.0f) - factA;
+ btVector3 ax1, p, q;
+ btVector3 ax1A = trA.getBasis().getColumn(0);
+ btVector3 ax1B = trB.getBasis().getColumn(0);
+ if(m_useOffsetForConstraintFrame)
+ {
+ // get the desired direction of slider axis
+ // as weighted sum of X-orthos of frameA and frameB in WCS
+ ax1 = ax1A * factA + ax1B * factB;
+ ax1.normalize();
+ // construct two orthos to slider axis
+ btPlaneSpace1 (ax1, p, q);
+ }
+ else
+ { // old way - use frameA
+ ax1 = trA.getBasis().getColumn(0);
+ // get 2 orthos to slider axis (Y, Z)
+ p = trA.getBasis().getColumn(1);
+ q = trA.getBasis().getColumn(2);
+ }
+ // make rotations around these orthos equal
// the slider axis should be the only unconstrained
// rotational axis, the angular velocity of the two bodies perpendicular to
// the slider axis should be equal. thus the constraint equations are
@@ -224,12 +319,6 @@ void btSliderConstraint::getInfo2(btConstraintInfo2* info)
// q*w1 - q*w2 = 0
// where p and q are unit vectors normal to the slider axis, and w1 and w2
// are the angular velocity vectors of the two bodies.
- // get slider axis (X)
- btVector3 ax1 = trA.getBasis().getColumn(0);
- // get 2 orthos to slider axis (Y, Z)
- btVector3 p = trA.getBasis().getColumn(1);
- btVector3 q = trA.getBasis().getColumn(2);
- // set the two slider rows
info->m_J1angularAxis[0] = p[0];
info->m_J1angularAxis[1] = p[1];
info->m_J1angularAxis[2] = p[2];
@@ -245,8 +334,8 @@ void btSliderConstraint::getInfo2(btConstraintInfo2* info)
info->m_J2angularAxis[s+2] = -q[2];
// compute the right hand side of the constraint equation. set relative
// body velocities along p and q to bring the slider back into alignment.
- // if ax1,ax2 are the unit length slider axes as computed from body1 and
- // body2, we need to rotate both bodies along the axis u = (ax1 x ax2).
+ // if ax1A,ax1B are the unit length slider axes as computed from bodyA and
+ // bodyB, we need to rotate both bodies along the axis u = (ax1 x ax2).
// if "theta" is the angle between ax1 and ax2, we need an angular velocity
// along u to cover angle erp*theta in one step :
// |angular_velocity| = angle/time = erp*theta / stepsize
@@ -258,64 +347,126 @@ void btSliderConstraint::getInfo2(btConstraintInfo2* info)
// angular_velocity = (erp*fps) * (ax1 x ax2)
// ax1 x ax2 is in the plane space of ax1, so we project the angular
// velocity to p and q to find the right hand side.
- btScalar k = info->fps * info->erp * getSoftnessOrthoAng();
- btVector3 ax2 = trB.getBasis().getColumn(0);
- btVector3 u = ax1.cross(ax2);
+// btScalar k = info->fps * info->erp * getSoftnessOrthoAng();
+ btScalar currERP = (m_flags & BT_SLIDER_FLAGS_ERP_ORTANG) ? m_softnessOrthoAng : m_softnessOrthoAng * info->erp;
+ btScalar k = info->fps * currERP;
+
+ btVector3 u = ax1A.cross(ax1B);
info->m_constraintError[0] = k * u.dot(p);
info->m_constraintError[s] = k * u.dot(q);
- // pull out pos and R for both bodies. also get the connection
- // vector c = pos2-pos1.
- // next two rows. we want: vel2 = vel1 + w1 x c ... but this would
- // result in three equations, so we project along the planespace vectors
- // so that sliding along the slider axis is disregarded. for symmetry we
- // also consider rotation around center of mass of two bodies (factA and factB).
- btTransform bodyA_trans = m_rbA.getCenterOfMassTransform();
- btTransform bodyB_trans = m_rbB.getCenterOfMassTransform();
- int s2 = 2 * s, s3 = 3 * s;
- btVector3 c;
- btScalar miA = m_rbA.getInvMass();
- btScalar miB = m_rbB.getInvMass();
- btScalar miS = miA + miB;
- btScalar factA, factB;
- if(miS > btScalar(0.f))
+ if(m_flags & BT_SLIDER_FLAGS_CFM_ORTANG)
{
- factA = miB / miS;
+ info->cfm[0] = m_cfmOrthoAng;
+ info->cfm[s] = m_cfmOrthoAng;
}
- else
+
+ int nrow = 1; // last filled row
+ int srow;
+ btScalar limit_err;
+ int limit;
+ int powered;
+
+ // next two rows.
+ // we want: velA + wA x relA == velB + wB x relB ... but this would
+ // result in three equations, so we project along two orthos to the slider axis
+
+ btTransform bodyA_trans = transA;
+ btTransform bodyB_trans = transB;
+ nrow++;
+ int s2 = nrow * s;
+ nrow++;
+ int s3 = nrow * s;
+ btVector3 tmpA(0,0,0), tmpB(0,0,0), relA(0,0,0), relB(0,0,0), c(0,0,0);
+ if(m_useOffsetForConstraintFrame)
{
- factA = btScalar(0.5f);
+ // get vector from bodyB to frameB in WCS
+ relB = trB.getOrigin() - bodyB_trans.getOrigin();
+ // get its projection to slider axis
+ btVector3 projB = ax1 * relB.dot(ax1);
+ // get vector directed from bodyB to slider axis (and orthogonal to it)
+ btVector3 orthoB = relB - projB;
+ // same for bodyA
+ relA = trA.getOrigin() - bodyA_trans.getOrigin();
+ btVector3 projA = ax1 * relA.dot(ax1);
+ btVector3 orthoA = relA - projA;
+ // get desired offset between frames A and B along slider axis
+ btScalar sliderOffs = m_linPos - m_depth[0];
+ // desired vector from projection of center of bodyA to projection of center of bodyB to slider axis
+ btVector3 totalDist = projA + ax1 * sliderOffs - projB;
+ // get offset vectors relA and relB
+ relA = orthoA + totalDist * factA;
+ relB = orthoB - totalDist * factB;
+ // now choose average ortho to slider axis
+ p = orthoB * factA + orthoA * factB;
+ btScalar len2 = p.length2();
+ if(len2 > SIMD_EPSILON)
+ {
+ p /= btSqrt(len2);
+ }
+ else
+ {
+ p = trA.getBasis().getColumn(1);
+ }
+ // make one more ortho
+ q = ax1.cross(p);
+ // fill two rows
+ tmpA = relA.cross(p);
+ tmpB = relB.cross(p);
+ for (i=0; i<3; i++) info->m_J1angularAxis[s2+i] = tmpA[i];
+ for (i=0; i<3; i++) info->m_J2angularAxis[s2+i] = -tmpB[i];
+ tmpA = relA.cross(q);
+ tmpB = relB.cross(q);
+ if(hasStaticBody && getSolveAngLimit())
+ { // to make constraint between static and dynamic objects more rigid
+ // remove wA (or wB) from equation if angular limit is hit
+ tmpB *= factB;
+ tmpA *= factA;
+ }
+ for (i=0; i<3; i++) info->m_J1angularAxis[s3+i] = tmpA[i];
+ for (i=0; i<3; i++) info->m_J2angularAxis[s3+i] = -tmpB[i];
+ for (i=0; i<3; i++) info->m_J1linearAxis[s2+i] = p[i];
+ for (i=0; i<3; i++) info->m_J1linearAxis[s3+i] = q[i];
}
- if(factA > 0.99f) factA = 0.99f;
- if(factA < 0.01f) factA = 0.01f;
- factB = btScalar(1.0f) - factA;
- c = bodyB_trans.getOrigin() - bodyA_trans.getOrigin();
- btVector3 tmp = c.cross(p);
- for (i=0; i<3; i++) info->m_J1angularAxis[s2+i] = factA*tmp[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[s2+i] = factB*tmp[i];
- tmp = c.cross(q);
- for (i=0; i<3; i++) info->m_J1angularAxis[s3+i] = factA*tmp[i];
- for (i=0; i<3; i++) info->m_J2angularAxis[s3+i] = factB*tmp[i];
-
- for (i=0; i<3; i++) info->m_J1linearAxis[s2+i] = p[i];
- for (i=0; i<3; i++) info->m_J1linearAxis[s3+i] = q[i];
- // compute two elements of right hand side. we want to align the offset
- // point (in body 2's frame) with the center of body 1.
- btVector3 ofs; // offset point in global coordinates
- ofs = trB.getOrigin() - trA.getOrigin();
- k = info->fps * info->erp * getSoftnessOrthoLin();
- info->m_constraintError[s2] = k * p.dot(ofs);
- info->m_constraintError[s3] = k * q.dot(ofs);
- int nrow = 3; // last filled row
- int srow;
- // check linear limits linear
- btScalar limit_err = btScalar(0.0);
- int limit = 0;
+ else
+ { // old way - maybe incorrect if bodies are not on the slider axis
+ // see discussion "Bug in slider constraint" http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=9&t=4024&start=0
+ c = bodyB_trans.getOrigin() - bodyA_trans.getOrigin();
+ btVector3 tmp = c.cross(p);
+ for (i=0; i<3; i++) info->m_J1angularAxis[s2+i] = factA*tmp[i];
+ for (i=0; i<3; i++) info->m_J2angularAxis[s2+i] = factB*tmp[i];
+ tmp = c.cross(q);
+ for (i=0; i<3; i++) info->m_J1angularAxis[s3+i] = factA*tmp[i];
+ for (i=0; i<3; i++) info->m_J2angularAxis[s3+i] = factB*tmp[i];
+
+ for (i=0; i<3; i++) info->m_J1linearAxis[s2+i] = p[i];
+ for (i=0; i<3; i++) info->m_J1linearAxis[s3+i] = q[i];
+ }
+ // compute two elements of right hand side
+
+ // k = info->fps * info->erp * getSoftnessOrthoLin();
+ currERP = (m_flags & BT_SLIDER_FLAGS_ERP_ORTLIN) ? m_softnessOrthoLin : m_softnessOrthoLin * info->erp;
+ k = info->fps * currERP;
+
+ btScalar rhs = k * p.dot(ofs);
+ info->m_constraintError[s2] = rhs;
+ rhs = k * q.dot(ofs);
+ info->m_constraintError[s3] = rhs;
+ if(m_flags & BT_SLIDER_FLAGS_CFM_ORTLIN)
+ {
+ info->cfm[s2] = m_cfmOrthoLin;
+ info->cfm[s3] = m_cfmOrthoLin;
+ }
+
+
+ // check linear limits
+ limit_err = btScalar(0.0);
+ limit = 0;
if(getSolveLinLimit())
{
limit_err = getLinDepth() * signFact;
limit = (limit_err > btScalar(0.0)) ? 2 : 1;
}
- int powered = 0;
+ powered = 0;
if(getPoweredLinMotor())
{
powered = 1;
@@ -335,16 +486,32 @@ void btSliderConstraint::getInfo2(btConstraintInfo2* info)
// constraint force is applied at must lie along the same ax1 axis.
// a torque couple will result in limited slider-jointed free
// bodies from gaining angular momentum.
- // the solution used here is to apply the constraint forces at the center of mass of the two bodies
- btVector3 ltd; // Linear Torque Decoupling vector (a torque)
-// c = btScalar(0.5) * c;
- ltd = c.cross(ax1);
- info->m_J1angularAxis[srow+0] = factA*ltd[0];
- info->m_J1angularAxis[srow+1] = factA*ltd[1];
- info->m_J1angularAxis[srow+2] = factA*ltd[2];
- info->m_J2angularAxis[srow+0] = factB*ltd[0];
- info->m_J2angularAxis[srow+1] = factB*ltd[1];
- info->m_J2angularAxis[srow+2] = factB*ltd[2];
+ if(m_useOffsetForConstraintFrame)
+ {
+ // this is needed only when bodyA and bodyB are both dynamic.
+ if(!hasStaticBody)
+ {
+ tmpA = relA.cross(ax1);
+ tmpB = relB.cross(ax1);
+ info->m_J1angularAxis[srow+0] = tmpA[0];
+ info->m_J1angularAxis[srow+1] = tmpA[1];
+ info->m_J1angularAxis[srow+2] = tmpA[2];
+ info->m_J2angularAxis[srow+0] = -tmpB[0];
+ info->m_J2angularAxis[srow+1] = -tmpB[1];
+ info->m_J2angularAxis[srow+2] = -tmpB[2];
+ }
+ }
+ else
+ { // The old way. May be incorrect if bodies are not on the slider axis
+ btVector3 ltd; // Linear Torque Decoupling vector (a torque)
+ ltd = c.cross(ax1);
+ info->m_J1angularAxis[srow+0] = factA*ltd[0];
+ info->m_J1angularAxis[srow+1] = factA*ltd[1];
+ info->m_J1angularAxis[srow+2] = factA*ltd[2];
+ info->m_J2angularAxis[srow+0] = factB*ltd[0];
+ info->m_J2angularAxis[srow+1] = factB*ltd[1];
+ info->m_J2angularAxis[srow+2] = factB*ltd[2];
+ }
// right-hand part
btScalar lostop = getLowerLinLimit();
btScalar histop = getUpperLinLimit();
@@ -355,21 +522,27 @@ void btSliderConstraint::getInfo2(btConstraintInfo2* info)
info->m_constraintError[srow] = 0.;
info->m_lowerLimit[srow] = 0.;
info->m_upperLimit[srow] = 0.;
+ currERP = (m_flags & BT_SLIDER_FLAGS_ERP_LIMLIN) ? m_softnessLimLin : info->erp;
if(powered)
{
- info->cfm[nrow] = btScalar(0.0);
+ if(m_flags & BT_SLIDER_FLAGS_CFM_DIRLIN)
+ {
+ info->cfm[srow] = m_cfmDirLin;
+ }
btScalar tag_vel = getTargetLinMotorVelocity();
- btScalar mot_fact = getMotorFactor(m_linPos, m_lowerLinLimit, m_upperLinLimit, tag_vel, info->fps * info->erp);
-// info->m_constraintError[srow] += mot_fact * getTargetLinMotorVelocity();
+ btScalar mot_fact = getMotorFactor(m_linPos, m_lowerLinLimit, m_upperLinLimit, tag_vel, info->fps * currERP);
info->m_constraintError[srow] -= signFact * mot_fact * getTargetLinMotorVelocity();
info->m_lowerLimit[srow] += -getMaxLinMotorForce() * info->fps;
info->m_upperLimit[srow] += getMaxLinMotorForce() * info->fps;
}
if(limit)
{
- k = info->fps * info->erp;
+ k = info->fps * currERP;
info->m_constraintError[srow] += k * limit_err;
- info->cfm[srow] = btScalar(0.0); // stop_cfm;
+ if(m_flags & BT_SLIDER_FLAGS_CFM_LIMLIN)
+ {
+ info->cfm[srow] = m_cfmLimLin;
+ }
if(lostop == histop)
{ // limited low and high simultaneously
info->m_lowerLimit[srow] = -SIMD_INFINITY;
@@ -389,8 +562,8 @@ void btSliderConstraint::getInfo2(btConstraintInfo2* info)
btScalar bounce = btFabs(btScalar(1.0) - getDampingLimLin());
if(bounce > btScalar(0.0))
{
- btScalar vel = m_rbA.getLinearVelocity().dot(ax1);
- vel -= m_rbB.getLinearVelocity().dot(ax1);
+ btScalar vel = linVelA.dot(ax1);
+ vel -= linVelB.dot(ax1);
vel *= signFact;
// only apply bounce if the velocity is incoming, and if the
// resulting c[] exceeds what we already have.
@@ -452,19 +625,26 @@ void btSliderConstraint::getInfo2(btConstraintInfo2* info)
{ // the joint motor is ineffective
powered = 0;
}
+ currERP = (m_flags & BT_SLIDER_FLAGS_ERP_LIMANG) ? m_softnessLimAng : info->erp;
if(powered)
{
- info->cfm[srow] = btScalar(0.0);
- btScalar mot_fact = getMotorFactor(m_angPos, m_lowerAngLimit, m_upperAngLimit, getTargetAngMotorVelocity(), info->fps * info->erp);
+ if(m_flags & BT_SLIDER_FLAGS_CFM_DIRANG)
+ {
+ info->cfm[srow] = m_cfmDirAng;
+ }
+ btScalar mot_fact = getMotorFactor(m_angPos, m_lowerAngLimit, m_upperAngLimit, getTargetAngMotorVelocity(), info->fps * currERP);
info->m_constraintError[srow] = mot_fact * getTargetAngMotorVelocity();
info->m_lowerLimit[srow] = -getMaxAngMotorForce() * info->fps;
info->m_upperLimit[srow] = getMaxAngMotorForce() * info->fps;
}
if(limit)
{
- k = info->fps * info->erp;
+ k = info->fps * currERP;
info->m_constraintError[srow] += k * limit_err;
- info->cfm[srow] = btScalar(0.0); // stop_cfm;
+ if(m_flags & BT_SLIDER_FLAGS_CFM_LIMANG)
+ {
+ info->cfm[srow] = m_cfmLimAng;
+ }
if(lostop == histop)
{
// limited low and high simultaneously
@@ -518,316 +698,160 @@ void btSliderConstraint::getInfo2(btConstraintInfo2* info)
}
-
-void btSliderConstraint::solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep)
+///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+///If no axis is provided, it uses the default axis for this constraint.
+void btSliderConstraint::setParam(int num, btScalar value, int axis)
{
- if (m_useSolveConstraintObsolete)
+ switch(num)
{
- m_timeStep = timeStep;
- if(m_useLinearReferenceFrameA)
+ case BT_CONSTRAINT_STOP_ERP :
+ if(axis < 1)
+ {
+ m_softnessLimLin = value;
+ m_flags |= BT_SLIDER_FLAGS_ERP_LIMLIN;
+ }
+ else if(axis < 3)
+ {
+ m_softnessOrthoLin = value;
+ m_flags |= BT_SLIDER_FLAGS_ERP_ORTLIN;
+ }
+ else if(axis == 3)
{
- solveConstraintInt(m_rbA,bodyA, m_rbB,bodyB);
+ m_softnessLimAng = value;
+ m_flags |= BT_SLIDER_FLAGS_ERP_LIMANG;
+ }
+ else if(axis < 6)
+ {
+ m_softnessOrthoAng = value;
+ m_flags |= BT_SLIDER_FLAGS_ERP_ORTANG;
}
else
{
- solveConstraintInt(m_rbB,bodyB, m_rbA,bodyA);
+ btAssertConstrParams(0);
}
- }
-}
-
-
-
-void btSliderConstraint::solveConstraintInt(btRigidBody& rbA, btSolverBody& bodyA,btRigidBody& rbB, btSolverBody& bodyB)
-{
- int i;
- // linear
- btVector3 velA;
- bodyA.getVelocityInLocalPointObsolete(m_relPosA,velA);
- btVector3 velB;
- bodyB.getVelocityInLocalPointObsolete(m_relPosB,velB);
- btVector3 vel = velA - velB;
- for(i = 0; i < 3; i++)
- {
- const btVector3& normal = m_jacLin[i].m_linearJointAxis;
- btScalar rel_vel = normal.dot(vel);
- // calculate positional error
- btScalar depth = m_depth[i];
- // get parameters
- btScalar softness = (i) ? m_softnessOrthoLin : (m_solveLinLim ? m_softnessLimLin : m_softnessDirLin);
- btScalar restitution = (i) ? m_restitutionOrthoLin : (m_solveLinLim ? m_restitutionLimLin : m_restitutionDirLin);
- btScalar damping = (i) ? m_dampingOrthoLin : (m_solveLinLim ? m_dampingLimLin : m_dampingDirLin);
- // calcutate and apply impulse
- btScalar normalImpulse = softness * (restitution * depth / m_timeStep - damping * rel_vel) * m_jacLinDiagABInv[i];
- btVector3 impulse_vector = normal * normalImpulse;
-
- //rbA.applyImpulse( impulse_vector, m_relPosA);
- //rbB.applyImpulse(-impulse_vector, m_relPosB);
- {
- btVector3 ftorqueAxis1 = m_relPosA.cross(normal);
- btVector3 ftorqueAxis2 = m_relPosB.cross(normal);
- bodyA.applyImpulse(normal*rbA.getInvMass(), rbA.getInvInertiaTensorWorld()*ftorqueAxis1,normalImpulse);
- bodyB.applyImpulse(normal*rbB.getInvMass(), rbB.getInvInertiaTensorWorld()*ftorqueAxis2,-normalImpulse);
- }
-
-
-
- if(m_poweredLinMotor && (!i))
- { // apply linear motor
- if(m_accumulatedLinMotorImpulse < m_maxLinMotorForce)
- {
- btScalar desiredMotorVel = m_targetLinMotorVelocity;
- btScalar motor_relvel = desiredMotorVel + rel_vel;
- normalImpulse = -motor_relvel * m_jacLinDiagABInv[i];
- // clamp accumulated impulse
- btScalar new_acc = m_accumulatedLinMotorImpulse + btFabs(normalImpulse);
- if(new_acc > m_maxLinMotorForce)
- {
- new_acc = m_maxLinMotorForce;
- }
- btScalar del = new_acc - m_accumulatedLinMotorImpulse;
- if(normalImpulse < btScalar(0.0))
- {
- normalImpulse = -del;
- }
- else
- {
- normalImpulse = del;
- }
- m_accumulatedLinMotorImpulse = new_acc;
- // apply clamped impulse
- impulse_vector = normal * normalImpulse;
- //rbA.applyImpulse( impulse_vector, m_relPosA);
- //rbB.applyImpulse(-impulse_vector, m_relPosB);
-
- {
- btVector3 ftorqueAxis1 = m_relPosA.cross(normal);
- btVector3 ftorqueAxis2 = m_relPosB.cross(normal);
- bodyA.applyImpulse(normal*rbA.getInvMass(), rbA.getInvInertiaTensorWorld()*ftorqueAxis1,normalImpulse);
- bodyB.applyImpulse(normal*rbB.getInvMass(), rbB.getInvInertiaTensorWorld()*ftorqueAxis2,-normalImpulse);
- }
-
-
-
- }
+ break;
+ case BT_CONSTRAINT_CFM :
+ if(axis < 1)
+ {
+ m_cfmDirLin = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_DIRLIN;
}
- }
- // angular
- // get axes in world space
- btVector3 axisA = m_calculatedTransformA.getBasis().getColumn(0);
- btVector3 axisB = m_calculatedTransformB.getBasis().getColumn(0);
-
- btVector3 angVelA;
- bodyA.getAngularVelocity(angVelA);
- btVector3 angVelB;
- bodyB.getAngularVelocity(angVelB);
-
- btVector3 angVelAroundAxisA = axisA * axisA.dot(angVelA);
- btVector3 angVelAroundAxisB = axisB * axisB.dot(angVelB);
-
- btVector3 angAorthog = angVelA - angVelAroundAxisA;
- btVector3 angBorthog = angVelB - angVelAroundAxisB;
- btVector3 velrelOrthog = angAorthog-angBorthog;
- //solve orthogonal angular velocity correction
- btScalar len = velrelOrthog.length();
- btScalar orthorImpulseMag = 0.f;
-
- if (len > btScalar(0.00001))
- {
- btVector3 normal = velrelOrthog.normalized();
- btScalar denom = rbA.computeAngularImpulseDenominator(normal) + rbB.computeAngularImpulseDenominator(normal);
- //velrelOrthog *= (btScalar(1.)/denom) * m_dampingOrthoAng * m_softnessOrthoAng;
- orthorImpulseMag = (btScalar(1.)/denom) * m_dampingOrthoAng * m_softnessOrthoAng;
- }
- //solve angular positional correction
- btVector3 angularError = axisA.cross(axisB) *(btScalar(1.)/m_timeStep);
- btVector3 angularAxis = angularError;
- btScalar angularImpulseMag = 0;
-
- btScalar len2 = angularError.length();
- if (len2>btScalar(0.00001))
- {
- btVector3 normal2 = angularError.normalized();
- btScalar denom2 = rbA.computeAngularImpulseDenominator(normal2) + rbB.computeAngularImpulseDenominator(normal2);
- angularImpulseMag = (btScalar(1.)/denom2) * m_restitutionOrthoAng * m_softnessOrthoAng;
- angularError *= angularImpulseMag;
- }
- // apply impulse
- //rbA.applyTorqueImpulse(-velrelOrthog+angularError);
- //rbB.applyTorqueImpulse(velrelOrthog-angularError);
-
- bodyA.applyImpulse(btVector3(0,0,0), rbA.getInvInertiaTensorWorld()*velrelOrthog,-orthorImpulseMag);
- bodyB.applyImpulse(btVector3(0,0,0), rbB.getInvInertiaTensorWorld()*velrelOrthog,orthorImpulseMag);
- bodyA.applyImpulse(btVector3(0,0,0), rbA.getInvInertiaTensorWorld()*angularAxis,angularImpulseMag);
- bodyB.applyImpulse(btVector3(0,0,0), rbB.getInvInertiaTensorWorld()*angularAxis,-angularImpulseMag);
-
-
- btScalar impulseMag;
- //solve angular limits
- if(m_solveAngLim)
- {
- impulseMag = (angVelB - angVelA).dot(axisA) * m_dampingLimAng + m_angDepth * m_restitutionLimAng / m_timeStep;
- impulseMag *= m_kAngle * m_softnessLimAng;
- }
- else
- {
- impulseMag = (angVelB - angVelA).dot(axisA) * m_dampingDirAng + m_angDepth * m_restitutionDirAng / m_timeStep;
- impulseMag *= m_kAngle * m_softnessDirAng;
- }
- btVector3 impulse = axisA * impulseMag;
- //rbA.applyTorqueImpulse(impulse);
- //rbB.applyTorqueImpulse(-impulse);
-
- bodyA.applyImpulse(btVector3(0,0,0), rbA.getInvInertiaTensorWorld()*axisA,impulseMag);
- bodyB.applyImpulse(btVector3(0,0,0), rbB.getInvInertiaTensorWorld()*axisA,-impulseMag);
-
-
-
- //apply angular motor
- if(m_poweredAngMotor)
- {
- if(m_accumulatedAngMotorImpulse < m_maxAngMotorForce)
+ else if(axis == 3)
{
- btVector3 velrel = angVelAroundAxisA - angVelAroundAxisB;
- btScalar projRelVel = velrel.dot(axisA);
-
- btScalar desiredMotorVel = m_targetAngMotorVelocity;
- btScalar motor_relvel = desiredMotorVel - projRelVel;
-
- btScalar angImpulse = m_kAngle * motor_relvel;
- // clamp accumulated impulse
- btScalar new_acc = m_accumulatedAngMotorImpulse + btFabs(angImpulse);
- if(new_acc > m_maxAngMotorForce)
- {
- new_acc = m_maxAngMotorForce;
- }
- btScalar del = new_acc - m_accumulatedAngMotorImpulse;
- if(angImpulse < btScalar(0.0))
- {
- angImpulse = -del;
- }
- else
- {
- angImpulse = del;
- }
- m_accumulatedAngMotorImpulse = new_acc;
- // apply clamped impulse
- btVector3 motorImp = angImpulse * axisA;
- //rbA.applyTorqueImpulse(motorImp);
- //rbB.applyTorqueImpulse(-motorImp);
-
- bodyA.applyImpulse(btVector3(0,0,0), rbA.getInvInertiaTensorWorld()*axisA,angImpulse);
- bodyB.applyImpulse(btVector3(0,0,0), rbB.getInvInertiaTensorWorld()*axisA,-angImpulse);
+ m_cfmDirAng = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_DIRANG;
}
- }
-}
-
-
-
-
-
-void btSliderConstraint::calculateTransforms(void){
- if(m_useLinearReferenceFrameA || (!m_useSolveConstraintObsolete))
- {
- m_calculatedTransformA = m_rbA.getCenterOfMassTransform() * m_frameInA;
- m_calculatedTransformB = m_rbB.getCenterOfMassTransform() * m_frameInB;
- }
- else
- {
- m_calculatedTransformA = m_rbB.getCenterOfMassTransform() * m_frameInB;
- m_calculatedTransformB = m_rbA.getCenterOfMassTransform() * m_frameInA;
- }
- m_realPivotAInW = m_calculatedTransformA.getOrigin();
- m_realPivotBInW = m_calculatedTransformB.getOrigin();
- m_sliderAxis = m_calculatedTransformA.getBasis().getColumn(0); // along X
- if(m_useLinearReferenceFrameA || m_useSolveConstraintObsolete)
- {
- m_delta = m_realPivotBInW - m_realPivotAInW;
- }
- else
- {
- m_delta = m_realPivotAInW - m_realPivotBInW;
- }
- m_projPivotInW = m_realPivotAInW + m_sliderAxis.dot(m_delta) * m_sliderAxis;
- btVector3 normalWorld;
- int i;
- //linear part
- for(i = 0; i < 3; i++)
- {
- normalWorld = m_calculatedTransformA.getBasis().getColumn(i);
- m_depth[i] = m_delta.dot(normalWorld);
- }
-}
-
-
-
-void btSliderConstraint::testLinLimits(void)
-{
- m_solveLinLim = false;
- m_linPos = m_depth[0];
- if(m_lowerLinLimit <= m_upperLinLimit)
- {
- if(m_depth[0] > m_upperLinLimit)
+ else
{
- m_depth[0] -= m_upperLinLimit;
- m_solveLinLim = true;
+ btAssertConstrParams(0);
}
- else if(m_depth[0] < m_lowerLinLimit)
+ break;
+ case BT_CONSTRAINT_STOP_CFM :
+ if(axis < 1)
{
- m_depth[0] -= m_lowerLinLimit;
- m_solveLinLim = true;
+ m_cfmLimLin = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_LIMLIN;
+ }
+ else if(axis < 3)
+ {
+ m_cfmOrthoLin = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_ORTLIN;
+ }
+ else if(axis == 3)
+ {
+ m_cfmLimAng = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_LIMANG;
+ }
+ else if(axis < 6)
+ {
+ m_cfmOrthoAng = value;
+ m_flags |= BT_SLIDER_FLAGS_CFM_ORTANG;
}
else
{
- m_depth[0] = btScalar(0.);
+ btAssertConstrParams(0);
}
- }
- else
- {
- m_depth[0] = btScalar(0.);
+ break;
}
}
-
-
-void btSliderConstraint::testAngLimits(void)
+///return the local value of parameter
+btScalar btSliderConstraint::getParam(int num, int axis) const
{
- m_angDepth = btScalar(0.);
- m_solveAngLim = false;
- if(m_lowerAngLimit <= m_upperAngLimit)
+ btScalar retVal(SIMD_INFINITY);
+ switch(num)
{
- const btVector3 axisA0 = m_calculatedTransformA.getBasis().getColumn(1);
- const btVector3 axisA1 = m_calculatedTransformA.getBasis().getColumn(2);
- const btVector3 axisB0 = m_calculatedTransformB.getBasis().getColumn(1);
- btScalar rot = btAtan2Fast(axisB0.dot(axisA1), axisB0.dot(axisA0));
- m_angPos = rot;
- if(rot < m_lowerAngLimit)
+ case BT_CONSTRAINT_STOP_ERP :
+ if(axis < 1)
{
- m_angDepth = rot - m_lowerAngLimit;
- m_solveAngLim = true;
- }
- else if(rot > m_upperAngLimit)
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_LIMLIN);
+ retVal = m_softnessLimLin;
+ }
+ else if(axis < 3)
{
- m_angDepth = rot - m_upperAngLimit;
- m_solveAngLim = true;
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_ORTLIN);
+ retVal = m_softnessOrthoLin;
+ }
+ else if(axis == 3)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_LIMANG);
+ retVal = m_softnessLimAng;
+ }
+ else if(axis < 6)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_ERP_ORTANG);
+ retVal = m_softnessOrthoAng;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
+ case BT_CONSTRAINT_CFM :
+ if(axis < 1)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_DIRLIN);
+ retVal = m_cfmDirLin;
+ }
+ else if(axis == 3)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_DIRANG);
+ retVal = m_cfmDirAng;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
+ case BT_CONSTRAINT_STOP_CFM :
+ if(axis < 1)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_LIMLIN);
+ retVal = m_cfmLimLin;
+ }
+ else if(axis < 3)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_ORTLIN);
+ retVal = m_cfmOrthoLin;
}
+ else if(axis == 3)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_LIMANG);
+ retVal = m_cfmLimAng;
+ }
+ else if(axis < 6)
+ {
+ btAssertConstrParams(m_flags & BT_SLIDER_FLAGS_CFM_ORTANG);
+ retVal = m_cfmOrthoAng;
+ }
+ else
+ {
+ btAssertConstrParams(0);
+ }
+ break;
}
+ return retVal;
}
-
-btVector3 btSliderConstraint::getAncorInA(void)
-{
- btVector3 ancorInA;
- ancorInA = m_realPivotAInW + (m_lowerLinLimit + m_upperLinLimit) * btScalar(0.5) * m_sliderAxis;
- ancorInA = m_rbA.getCenterOfMassTransform().inverse() * ancorInA;
- return ancorInA;
-}
-
-
-btVector3 btSliderConstraint::getAncorInB(void)
-{
- btVector3 ancorInB;
- ancorInB = m_frameInB.getOrigin();
- return ancorInB;
-}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.h
index 01cef59ed31..e9723a7bb40 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSliderConstraint.h
@@ -40,14 +40,32 @@ class btRigidBody;
#define SLIDER_CONSTRAINT_DEF_SOFTNESS (btScalar(1.0))
#define SLIDER_CONSTRAINT_DEF_DAMPING (btScalar(1.0))
#define SLIDER_CONSTRAINT_DEF_RESTITUTION (btScalar(0.7))
+#define SLIDER_CONSTRAINT_DEF_CFM (btScalar(0.f))
+enum btSliderFlags
+{
+ BT_SLIDER_FLAGS_CFM_DIRLIN = (1 << 0),
+ BT_SLIDER_FLAGS_ERP_DIRLIN = (1 << 1),
+ BT_SLIDER_FLAGS_CFM_DIRANG = (1 << 2),
+ BT_SLIDER_FLAGS_ERP_DIRANG = (1 << 3),
+ BT_SLIDER_FLAGS_CFM_ORTLIN = (1 << 4),
+ BT_SLIDER_FLAGS_ERP_ORTLIN = (1 << 5),
+ BT_SLIDER_FLAGS_CFM_ORTANG = (1 << 6),
+ BT_SLIDER_FLAGS_ERP_ORTANG = (1 << 7),
+ BT_SLIDER_FLAGS_CFM_LIMLIN = (1 << 8),
+ BT_SLIDER_FLAGS_ERP_LIMLIN = (1 << 9),
+ BT_SLIDER_FLAGS_CFM_LIMANG = (1 << 10),
+ BT_SLIDER_FLAGS_ERP_LIMANG = (1 << 11)
+};
+
class btSliderConstraint : public btTypedConstraint
{
protected:
///for backwards compatibility during the transition to 'getInfo/getInfo2'
bool m_useSolveConstraintObsolete;
+ bool m_useOffsetForConstraintFrame;
btTransform m_frameInA;
btTransform m_frameInB;
// use frameA fo define limits, if true
@@ -67,26 +85,39 @@ protected:
btScalar m_softnessDirLin;
btScalar m_restitutionDirLin;
btScalar m_dampingDirLin;
+ btScalar m_cfmDirLin;
+
btScalar m_softnessDirAng;
btScalar m_restitutionDirAng;
btScalar m_dampingDirAng;
+ btScalar m_cfmDirAng;
+
btScalar m_softnessLimLin;
btScalar m_restitutionLimLin;
btScalar m_dampingLimLin;
+ btScalar m_cfmLimLin;
+
btScalar m_softnessLimAng;
btScalar m_restitutionLimAng;
btScalar m_dampingLimAng;
+ btScalar m_cfmLimAng;
+
btScalar m_softnessOrthoLin;
btScalar m_restitutionOrthoLin;
btScalar m_dampingOrthoLin;
+ btScalar m_cfmOrthoLin;
+
btScalar m_softnessOrthoAng;
btScalar m_restitutionOrthoAng;
btScalar m_dampingOrthoAng;
+ btScalar m_cfmOrthoAng;
// for interlal use
bool m_solveLinLim;
bool m_solveAngLim;
+ int m_flags;
+
btJacobianEntry m_jacLin[3];
btScalar m_jacLinDiagABInv[3];
@@ -126,16 +157,18 @@ protected:
public:
// constructors
btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
- btSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameB);
- btSliderConstraint();
+ btSliderConstraint(btRigidBody& rbB, const btTransform& frameInB, bool useLinearReferenceFrameA);
+
// overrides
- virtual void buildJacobian();
+
virtual void getInfo1 (btConstraintInfo1* info);
+
+ void getInfo1NonVirtual(btConstraintInfo1* info);
virtual void getInfo2 (btConstraintInfo2* info);
- virtual void solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep);
-
+ void getInfo2NonVirtual(btConstraintInfo2* info, const btTransform& transA, const btTransform& transB,const btVector3& linVelA,const btVector3& linVelB, btScalar rbAinvMass,btScalar rbBinvMass);
+
// access
const btRigidBody& getRigidBodyA() const { return m_rbA; }
@@ -151,9 +184,9 @@ public:
btScalar getUpperLinLimit() { return m_upperLinLimit; }
void setUpperLinLimit(btScalar upperLimit) { m_upperLinLimit = upperLimit; }
btScalar getLowerAngLimit() { return m_lowerAngLimit; }
- void setLowerAngLimit(btScalar lowerLimit) { m_lowerAngLimit = lowerLimit; }
+ void setLowerAngLimit(btScalar lowerLimit) { m_lowerAngLimit = btNormalizeAngle(lowerLimit); }
btScalar getUpperAngLimit() { return m_upperAngLimit; }
- void setUpperAngLimit(btScalar upperLimit) { m_upperAngLimit = upperLimit; }
+ void setUpperAngLimit(btScalar upperLimit) { m_upperAngLimit = btNormalizeAngle(upperLimit); }
bool getUseLinearReferenceFrameA() { return m_useLinearReferenceFrameA; }
btScalar getSoftnessDirLin() { return m_softnessDirLin; }
btScalar getRestitutionDirLin() { return m_restitutionDirLin; }
@@ -211,20 +244,87 @@ public:
btScalar getLinDepth() { return m_depth[0]; }
bool getSolveAngLimit() { return m_solveAngLim; }
btScalar getAngDepth() { return m_angDepth; }
- // internal
- void buildJacobianInt(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB);
- void solveConstraintInt(btRigidBody& rbA, btSolverBody& bodyA,btRigidBody& rbB, btSolverBody& bodyB);
// shared code used by ODE solver
- void calculateTransforms(void);
- void testLinLimits(void);
- void testLinLimits2(btConstraintInfo2* info);
- void testAngLimits(void);
+ void calculateTransforms(const btTransform& transA,const btTransform& transB);
+ void testLinLimits();
+ void testAngLimits();
// access for PE Solver
- btVector3 getAncorInA(void);
- btVector3 getAncorInB(void);
+ btVector3 getAncorInA();
+ btVector3 getAncorInB();
+ // access for UseFrameOffset
+ bool getUseFrameOffset() { return m_useOffsetForConstraintFrame; }
+ void setUseFrameOffset(bool frameOffsetOnOff) { m_useOffsetForConstraintFrame = frameOffsetOnOff; }
+
+ void setFrames(const btTransform& frameA, const btTransform& frameB)
+ {
+ m_frameInA=frameA;
+ m_frameInB=frameB;
+ calculateTransforms(m_rbA.getCenterOfMassTransform(),m_rbB.getCenterOfMassTransform());
+ buildJacobian();
+ }
+
+
+ ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///If no axis is provided, it uses the default axis for this constraint.
+ virtual void setParam(int num, btScalar value, int axis = -1);
+ ///return the local value of parameter
+ virtual btScalar getParam(int num, int axis = -1) const;
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
+
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btSliderConstraintData
+{
+ btTypedConstraintData m_typeConstraintData;
+ btTransformFloatData m_rbAFrame; // constraint axii. Assumes z is hinge axis.
+ btTransformFloatData m_rbBFrame;
+
+ float m_linearUpperLimit;
+ float m_linearLowerLimit;
+
+ float m_angularUpperLimit;
+ float m_angularLowerLimit;
+
+ int m_useLinearReferenceFrameA;
+ int m_useOffsetForConstraintFrame;
+
};
+SIMD_FORCE_INLINE int btSliderConstraint::calculateSerializeBufferSize() const
+{
+ return sizeof(btSliderConstraintData);
+}
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+SIMD_FORCE_INLINE const char* btSliderConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+
+ btSliderConstraintData* sliderData = (btSliderConstraintData*) dataBuffer;
+ btTypedConstraint::serialize(&sliderData->m_typeConstraintData,serializer);
+
+ m_frameInA.serializeFloat(sliderData->m_rbAFrame);
+ m_frameInB.serializeFloat(sliderData->m_rbBFrame);
+
+ sliderData->m_linearUpperLimit = float(m_upperLinLimit);
+ sliderData->m_linearLowerLimit = float(m_lowerLinLimit);
+
+ sliderData->m_angularUpperLimit = float(m_upperAngLimit);
+ sliderData->m_angularLowerLimit = float(m_lowerAngLimit);
+
+ sliderData->m_useLinearReferenceFrameA = m_useLinearReferenceFrameA;
+ sliderData->m_useOffsetForConstraintFrame = m_useOffsetForConstraintFrame;
+
+ return "btSliderConstraintData";
+}
+
+
#endif //SLIDER_CONSTRAINT_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverBody.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverBody.h
index 6b728959162..8de515812ee 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverBody.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverBody.h
@@ -105,17 +105,16 @@ operator+(const btSimdScalar& v1, const btSimdScalar& v2)
#endif
///The btSolverBody is an internal datastructure for the constraint solver. Only necessary data is packed to increase cache coherence/performance.
-ATTRIBUTE_ALIGNED16 (struct) btSolverBody
+ATTRIBUTE_ALIGNED64 (struct) btSolverBodyObsolete
{
BT_DECLARE_ALIGNED_ALLOCATOR();
btVector3 m_deltaLinearVelocity;
btVector3 m_deltaAngularVelocity;
btVector3 m_angularFactor;
btVector3 m_invMass;
- btScalar m_friction;
btRigidBody* m_originalBody;
btVector3 m_pushVelocity;
- //btVector3 m_turnVelocity;
+ btVector3 m_turnVelocity;
SIMD_FORCE_INLINE void getVelocityInLocalPointObsolete(const btVector3& rel_pos, btVector3& velocity ) const
@@ -145,12 +144,18 @@ ATTRIBUTE_ALIGNED16 (struct) btSolverBody
}
}
-
-/*
+ SIMD_FORCE_INLINE void internalApplyPushImpulse(const btVector3& linearComponent, const btVector3& angularComponent,btScalar impulseMagnitude)
+ {
+ if (m_originalBody)
+ {
+ m_pushVelocity += linearComponent*impulseMagnitude;
+ m_turnVelocity += angularComponent*(impulseMagnitude*m_angularFactor);
+ }
+ }
void writebackVelocity()
{
- if (m_invMass)
+ if (m_originalBody)
{
m_originalBody->setLinearVelocity(m_originalBody->getLinearVelocity()+ m_deltaLinearVelocity);
m_originalBody->setAngularVelocity(m_originalBody->getAngularVelocity()+m_deltaAngularVelocity);
@@ -158,14 +163,21 @@ ATTRIBUTE_ALIGNED16 (struct) btSolverBody
//m_originalBody->setCompanionId(-1);
}
}
- */
- void writebackVelocity(btScalar timeStep=0)
+
+ void writebackVelocity(btScalar timeStep)
{
+ (void) timeStep;
if (m_originalBody)
{
- m_originalBody->setLinearVelocity(m_originalBody->getLinearVelocity()+m_deltaLinearVelocity);
+ m_originalBody->setLinearVelocity(m_originalBody->getLinearVelocity()+ m_deltaLinearVelocity);
m_originalBody->setAngularVelocity(m_originalBody->getAngularVelocity()+m_deltaAngularVelocity);
+
+ //correct the position/orientation based on push/turn recovery
+ btTransform newTransform;
+ btTransformUtil::integrateTransform(m_originalBody->getWorldTransform(),m_pushVelocity,m_turnVelocity,timeStep,newTransform);
+ m_originalBody->setWorldTransform(newTransform);
+
//m_originalBody->setCompanionId(-1);
}
}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverConstraint.h
index 867d62a301d..79e45a4383b 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverConstraint.h
@@ -26,7 +26,7 @@ class btRigidBody;
///1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and friction constraints.
-ATTRIBUTE_ALIGNED16 (struct) btSolverConstraint
+ATTRIBUTE_ALIGNED64 (struct) btSolverConstraint
{
BT_DECLARE_ALIGNED_ALLOCATOR();
@@ -58,13 +58,13 @@ ATTRIBUTE_ALIGNED16 (struct) btSolverConstraint
};
union
{
- int m_solverBodyIdA;
- btScalar m_unusedPadding2;
+ btRigidBody* m_solverBodyA;
+ int m_companionIdA;
};
union
{
- int m_solverBodyIdB;
- btScalar m_unusedPadding3;
+ btRigidBody* m_solverBodyB;
+ int m_companionIdB;
};
union
@@ -78,6 +78,8 @@ ATTRIBUTE_ALIGNED16 (struct) btSolverConstraint
btScalar m_lowerLimit;
btScalar m_upperLimit;
+ btScalar m_rhsPenetration;
+
enum btSolverConstraintType
{
BT_SOLVER_CONTACT_1D = 0,
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
index 3fa98ee4c88..8212c36ff4e 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
@@ -16,51 +16,38 @@ subject to the following restrictions:
#include "btTypedConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
+#include "LinearMath/btSerializer.h"
-static btRigidBody s_fixed(0, 0,0);
#define DEFAULT_DEBUGDRAW_SIZE btScalar(0.3f)
-btTypedConstraint::btTypedConstraint(btTypedConstraintType type)
-:m_userConstraintType(-1),
-m_userConstraintId(-1),
-m_constraintType (type),
-m_rbA(s_fixed),
-m_rbB(s_fixed),
-m_appliedImpulse(btScalar(0.)),
-m_dbgDrawSize(DEFAULT_DEBUGDRAW_SIZE)
-{
- s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
-}
btTypedConstraint::btTypedConstraint(btTypedConstraintType type, btRigidBody& rbA)
-:m_userConstraintType(-1),
+:btTypedObject(type),
+m_userConstraintType(-1),
m_userConstraintId(-1),
-m_constraintType (type),
+m_needsFeedback(false),
m_rbA(rbA),
-m_rbB(s_fixed),
+m_rbB(getFixedBody()),
m_appliedImpulse(btScalar(0.)),
m_dbgDrawSize(DEFAULT_DEBUGDRAW_SIZE)
{
- s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
-
}
btTypedConstraint::btTypedConstraint(btTypedConstraintType type, btRigidBody& rbA,btRigidBody& rbB)
-:m_userConstraintType(-1),
+:btTypedObject(type),
+m_userConstraintType(-1),
m_userConstraintId(-1),
-m_constraintType (type),
+m_needsFeedback(false),
m_rbA(rbA),
m_rbB(rbB),
m_appliedImpulse(btScalar(0.)),
m_dbgDrawSize(DEFAULT_DEBUGDRAW_SIZE)
{
- s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
-
}
-//-----------------------------------------------------------------------------
+
btScalar btTypedConstraint::getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact)
{
@@ -109,6 +96,115 @@ btScalar btTypedConstraint::getMotorFactor(btScalar pos, btScalar lowLim, btScal
lim_fact = btScalar(0.0f);
}
return lim_fact;
-} // btTypedConstraint::getMotorFactor()
+}
+
+///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btTypedConstraint::serialize(void* dataBuffer, btSerializer* serializer) const
+{
+ btTypedConstraintData* tcd = (btTypedConstraintData*) dataBuffer;
+
+ tcd->m_rbA = (btRigidBodyData*)serializer->getUniquePointer(&m_rbA);
+ tcd->m_rbB = (btRigidBodyData*)serializer->getUniquePointer(&m_rbB);
+ char* name = (char*) serializer->findNameForPointer(this);
+ tcd->m_name = (char*)serializer->getUniquePointer(name);
+ if (tcd->m_name)
+ {
+ serializer->serializeName(name);
+ }
+
+ tcd->m_objectType = m_objectType;
+ tcd->m_needsFeedback = m_needsFeedback;
+ tcd->m_userConstraintId =m_userConstraintId;
+ tcd->m_userConstraintType =m_userConstraintType;
+
+ tcd->m_appliedImpulse = float(m_appliedImpulse);
+ tcd->m_dbgDrawSize = float(m_dbgDrawSize );
+
+ tcd->m_disableCollisionsBetweenLinkedBodies = false;
+
+ int i;
+ for (i=0;i<m_rbA.getNumConstraintRefs();i++)
+ if (m_rbA.getConstraintRef(i) == this)
+ tcd->m_disableCollisionsBetweenLinkedBodies = true;
+ for (i=0;i<m_rbB.getNumConstraintRefs();i++)
+ if (m_rbB.getConstraintRef(i) == this)
+ tcd->m_disableCollisionsBetweenLinkedBodies = true;
+
+ return "btTypedConstraintData";
+}
+
+btRigidBody& btTypedConstraint::getFixedBody()
+{
+ static btRigidBody s_fixed(0, 0,0);
+ s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
+ return s_fixed;
+}
+
+
+void btAngularLimit::set(btScalar low, btScalar high, btScalar _softness, btScalar _biasFactor, btScalar _relaxationFactor)
+{
+ m_halfRange = (high - low) / 2.0f;
+ m_center = btNormalizeAngle(low + m_halfRange);
+ m_softness = _softness;
+ m_biasFactor = _biasFactor;
+ m_relaxationFactor = _relaxationFactor;
+}
+
+void btAngularLimit::test(const btScalar angle)
+{
+ m_correction = 0.0f;
+ m_sign = 0.0f;
+ m_solveLimit = false;
+
+ if (m_halfRange >= 0.0f)
+ {
+ btScalar deviation = btNormalizeAngle(angle - m_center);
+ if (deviation < -m_halfRange)
+ {
+ m_solveLimit = true;
+ m_correction = - (deviation + m_halfRange);
+ m_sign = +1.0f;
+ }
+ else if (deviation > m_halfRange)
+ {
+ m_solveLimit = true;
+ m_correction = m_halfRange - deviation;
+ m_sign = -1.0f;
+ }
+ }
+}
+btScalar btAngularLimit::getError() const
+{
+ return m_correction * m_sign;
+}
+
+void btAngularLimit::fit(btScalar& angle) const
+{
+ if (m_halfRange > 0.0f)
+ {
+ btScalar relativeAngle = btNormalizeAngle(angle - m_center);
+ if (!btEqual(relativeAngle, m_halfRange))
+ {
+ if (relativeAngle > 0.0f)
+ {
+ angle = getHigh();
+ }
+ else
+ {
+ angle = getLow();
+ }
+ }
+ }
+}
+
+btScalar btAngularLimit::getLow() const
+{
+ return btNormalizeAngle(m_center - m_halfRange);
+}
+
+btScalar btAngularLimit::getHigh() const
+{
+ return btNormalizeAngle(m_center + m_halfRange);
+}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h
index 14cbe831b40..65e6d558300 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2010 Erwin Coumans http://continuousphysics.com/Bullet/
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -19,27 +19,50 @@ subject to the following restrictions:
class btRigidBody;
#include "LinearMath/btScalar.h"
#include "btSolverConstraint.h"
-struct btSolverBody;
-
-
+class btSerializer;
+//Don't change any of the existing enum values, so add enum types at the end for serialization compatibility
enum btTypedConstraintType
{
- POINT2POINT_CONSTRAINT_TYPE,
+ POINT2POINT_CONSTRAINT_TYPE=3,
HINGE_CONSTRAINT_TYPE,
CONETWIST_CONSTRAINT_TYPE,
D6_CONSTRAINT_TYPE,
- SLIDER_CONSTRAINT_TYPE
+ SLIDER_CONSTRAINT_TYPE,
+ CONTACT_CONSTRAINT_TYPE,
+ D6_SPRING_CONSTRAINT_TYPE,
+ MAX_CONSTRAINT_TYPE
+};
+
+
+enum btConstraintParams
+{
+ BT_CONSTRAINT_ERP=1,
+ BT_CONSTRAINT_STOP_ERP,
+ BT_CONSTRAINT_CFM,
+ BT_CONSTRAINT_STOP_CFM
};
+#if 1
+ #define btAssertConstrParams(_par) btAssert(_par)
+#else
+ #define btAssertConstrParams(_par)
+#endif
+
+
///TypedConstraint is the baseclass for Bullet constraints and vehicles
-class btTypedConstraint
+class btTypedConstraint : public btTypedObject
{
int m_userConstraintType;
- int m_userConstraintId;
- btTypedConstraintType m_constraintType;
+ union
+ {
+ int m_userConstraintId;
+ void* m_userConstraintPtr;
+ };
+
+ bool m_needsFeedback;
btTypedConstraint& operator=(btTypedConstraint& other)
{
@@ -54,10 +77,13 @@ protected:
btScalar m_appliedImpulse;
btScalar m_dbgDrawSize;
+ ///internal method used by the constraint solver, don't use them directly
+ btScalar getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact);
+
+ static btRigidBody& getFixedBody();
public:
- btTypedConstraint(btTypedConstraintType type);
virtual ~btTypedConstraint() {};
btTypedConstraint(btTypedConstraintType type, btRigidBody& rbA);
btTypedConstraint(btTypedConstraintType type, btRigidBody& rbA,btRigidBody& rbB);
@@ -93,21 +119,45 @@ public:
// note that the returned indexes are relative to the first index of
// the constraint.
int *findex;
- };
+ // number of solver iterations
+ int m_numIterations;
+ //damping of the velocity
+ btScalar m_damping;
+ };
- virtual void buildJacobian() = 0;
+ ///internal method used by the constraint solver, don't use them directly
+ virtual void buildJacobian() {};
+ ///internal method used by the constraint solver, don't use them directly
virtual void setupSolverConstraint(btConstraintArray& ca, int solverBodyA,int solverBodyB, btScalar timeStep)
{
+ (void)ca;
+ (void)solverBodyA;
+ (void)solverBodyB;
+ (void)timeStep;
}
+
+ ///internal method used by the constraint solver, don't use them directly
virtual void getInfo1 (btConstraintInfo1* info)=0;
+ ///internal method used by the constraint solver, don't use them directly
virtual void getInfo2 (btConstraintInfo2* info)=0;
- virtual void solveConstraintObsolete(btSolverBody& bodyA,btSolverBody& bodyB,btScalar timeStep) = 0;
+ ///internal method used by the constraint solver, don't use them directly
+ void internalSetAppliedImpulse(btScalar appliedImpulse)
+ {
+ m_appliedImpulse = appliedImpulse;
+ }
+ ///internal method used by the constraint solver, don't use them directly
+ btScalar internalGetAppliedImpulse()
+ {
+ return m_appliedImpulse;
+ }
+
+ ///internal method used by the constraint solver, don't use them directly
+ virtual void solveConstraintObsolete(btRigidBody& /*bodyA*/,btRigidBody& /*bodyB*/,btScalar /*timeStep*/) {};
- btScalar getMotorFactor(btScalar pos, btScalar lowLim, btScalar uppLim, btScalar vel, btScalar timeFact);
const btRigidBody& getRigidBodyA() const
{
@@ -147,19 +197,44 @@ public:
return m_userConstraintId;
}
+ void setUserConstraintPtr(void* ptr)
+ {
+ m_userConstraintPtr = ptr;
+ }
+
+ void* getUserConstraintPtr()
+ {
+ return m_userConstraintPtr;
+ }
+
int getUid() const
{
return m_userConstraintId;
}
+ bool needsFeedback() const
+ {
+ return m_needsFeedback;
+ }
+
+ ///enableFeedback will allow to read the applied linear and angular impulse
+ ///use getAppliedImpulse, getAppliedLinearImpulse and getAppliedAngularImpulse to read feedback information
+ void enableFeedback(bool needsFeedback)
+ {
+ m_needsFeedback = needsFeedback;
+ }
+
+ ///getAppliedImpulse is an estimated total applied impulse.
+ ///This feedback could be used to determine breaking constraints or playing sounds.
btScalar getAppliedImpulse() const
{
+ btAssert(m_needsFeedback);
return m_appliedImpulse;
}
btTypedConstraintType getConstraintType () const
{
- return m_constraintType;
+ return btTypedConstraintType(m_objectType);
}
void setDbgDrawSize(btScalar dbgDrawSize)
@@ -170,7 +245,166 @@ public:
{
return m_dbgDrawSize;
}
+
+ ///override the default global value of a parameter (such as ERP or CFM), optionally provide the axis (0..5).
+ ///If no axis is provided, it uses the default axis for this constraint.
+ virtual void setParam(int num, btScalar value, int axis = -1) = 0;
+
+ ///return the local value of parameter
+ virtual btScalar getParam(int num, int axis = -1) const = 0;
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, btSerializer* serializer) const;
+
};
+// returns angle in range [-SIMD_2_PI, SIMD_2_PI], closest to one of the limits
+// all arguments should be normalized angles (i.e. in range [-SIMD_PI, SIMD_PI])
+SIMD_FORCE_INLINE btScalar btAdjustAngleToLimits(btScalar angleInRadians, btScalar angleLowerLimitInRadians, btScalar angleUpperLimitInRadians)
+{
+ if(angleLowerLimitInRadians >= angleUpperLimitInRadians)
+ {
+ return angleInRadians;
+ }
+ else if(angleInRadians < angleLowerLimitInRadians)
+ {
+ btScalar diffLo = btFabs(btNormalizeAngle(angleLowerLimitInRadians - angleInRadians));
+ btScalar diffHi = btFabs(btNormalizeAngle(angleUpperLimitInRadians - angleInRadians));
+ return (diffLo < diffHi) ? angleInRadians : (angleInRadians + SIMD_2_PI);
+ }
+ else if(angleInRadians > angleUpperLimitInRadians)
+ {
+ btScalar diffHi = btFabs(btNormalizeAngle(angleInRadians - angleUpperLimitInRadians));
+ btScalar diffLo = btFabs(btNormalizeAngle(angleInRadians - angleLowerLimitInRadians));
+ return (diffLo < diffHi) ? (angleInRadians - SIMD_2_PI) : angleInRadians;
+ }
+ else
+ {
+ return angleInRadians;
+ }
+}
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btTypedConstraintData
+{
+ btRigidBodyData *m_rbA;
+ btRigidBodyData *m_rbB;
+ char *m_name;
+
+ int m_objectType;
+ int m_userConstraintType;
+ int m_userConstraintId;
+ int m_needsFeedback;
+
+ float m_appliedImpulse;
+ float m_dbgDrawSize;
+
+ int m_disableCollisionsBetweenLinkedBodies;
+ char m_pad4[4];
+
+};
+
+SIMD_FORCE_INLINE int btTypedConstraint::calculateSerializeBufferSize() const
+{
+ return sizeof(btTypedConstraintData);
+}
+
+
+
+class btAngularLimit
+{
+private:
+ btScalar
+ m_center,
+ m_halfRange,
+ m_softness,
+ m_biasFactor,
+ m_relaxationFactor,
+ m_correction,
+ m_sign;
+
+ bool
+ m_solveLimit;
+
+public:
+ /// Default constructor initializes limit as inactive, allowing free constraint movement
+ btAngularLimit()
+ :m_center(0.0f),
+ m_halfRange(-1.0f),
+ m_softness(0.9f),
+ m_biasFactor(0.3f),
+ m_relaxationFactor(1.0f),
+ m_correction(0.0f),
+ m_sign(0.0f),
+ m_solveLimit(false)
+ {}
+
+ /// Sets all limit's parameters.
+ /// When low > high limit becomes inactive.
+ /// When high - low > 2PI limit is ineffective too becouse no angle can exceed the limit
+ void set(btScalar low, btScalar high, btScalar _softness = 0.9f, btScalar _biasFactor = 0.3f, btScalar _relaxationFactor = 1.0f);
+
+ /// Checks conastaint angle against limit. If limit is active and the angle violates the limit
+ /// correction is calculated.
+ void test(const btScalar angle);
+
+ /// Returns limit's softness
+ inline btScalar getSoftness() const
+ {
+ return m_softness;
+ }
+
+ /// Returns limit's bias factor
+ inline btScalar getBiasFactor() const
+ {
+ return m_biasFactor;
+ }
+
+ /// Returns limit's relaxation factor
+ inline btScalar getRelaxationFactor() const
+ {
+ return m_relaxationFactor;
+ }
+
+ /// Returns correction value evaluated when test() was invoked
+ inline btScalar getCorrection() const
+ {
+ return m_correction;
+ }
+
+ /// Returns sign value evaluated when test() was invoked
+ inline btScalar getSign() const
+ {
+ return m_sign;
+ }
+
+ /// Gives half of the distance between min and max limit angle
+ inline btScalar getHalfRange() const
+ {
+ return m_halfRange;
+ }
+
+ /// Returns true when the last test() invocation recognized limit violation
+ inline bool isLimit() const
+ {
+ return m_solveLimit;
+ }
+
+ /// Checks given angle against limit. If limit is active and angle doesn't fit it, the angle
+ /// returned is modified so it equals to the limit closest to given angle.
+ void fit(btScalar& angle) const;
+
+ /// Returns correction value multiplied by sign value
+ btScalar getError() const;
+
+ btScalar getLow() const;
+
+ btScalar getHigh() const;
+
+};
+
+
+
#endif //TYPED_CONSTRAINT_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp
new file mode 100644
index 00000000000..40c56e77954
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.cpp
@@ -0,0 +1,87 @@
+/*
+Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org
+Copyright (C) 2006, 2007 Sony Computer Entertainment Inc.
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+
+
+#include "btUniversalConstraint.h"
+#include "BulletDynamics/Dynamics/btRigidBody.h"
+#include "LinearMath/btTransformUtil.h"
+
+
+
+#define UNIV_EPS btScalar(0.01f)
+
+
+// constructor
+// anchor, axis1 and axis2 are in world coordinate system
+// axis1 must be orthogonal to axis2
+btUniversalConstraint::btUniversalConstraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2)
+: btGeneric6DofConstraint(rbA, rbB, btTransform::getIdentity(), btTransform::getIdentity(), true),
+ m_anchor(anchor),
+ m_axis1(axis1),
+ m_axis2(axis2)
+{
+ // build frame basis
+ // 6DOF constraint uses Euler angles and to define limits
+ // it is assumed that rotational order is :
+ // Z - first, allowed limits are (-PI,PI);
+ // new position of Y - second (allowed limits are (-PI/2 + epsilon, PI/2 - epsilon), where epsilon is a small positive number
+ // used to prevent constraint from instability on poles;
+ // new position of X, allowed limits are (-PI,PI);
+ // So to simulate ODE Universal joint we should use parent axis as Z, child axis as Y and limit all other DOFs
+ // Build the frame in world coordinate system first
+ btVector3 zAxis = axis1.normalize();
+ btVector3 yAxis = axis2.normalize();
+ btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
+ btTransform frameInW;
+ frameInW.setIdentity();
+ frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
+ frameInW.setOrigin(anchor);
+ // now get constraint frame in local coordinate systems
+ m_frameInA = rbA.getCenterOfMassTransform().inverse() * frameInW;
+ m_frameInB = rbB.getCenterOfMassTransform().inverse() * frameInW;
+ // sei limits
+ setLinearLowerLimit(btVector3(0., 0., 0.));
+ setLinearUpperLimit(btVector3(0., 0., 0.));
+ setAngularLowerLimit(btVector3(0.f, -SIMD_HALF_PI + UNIV_EPS, -SIMD_PI + UNIV_EPS));
+ setAngularUpperLimit(btVector3(0.f, SIMD_HALF_PI - UNIV_EPS, SIMD_PI - UNIV_EPS));
+}
+
+void btUniversalConstraint::setAxis(const btVector3& axis1,const btVector3& axis2)
+{
+ m_axis1 = axis1;
+ m_axis2 = axis2;
+
+ btVector3 zAxis = axis1.normalized();
+ btVector3 yAxis = axis2.normalized();
+ btVector3 xAxis = yAxis.cross(zAxis); // we want right coordinate system
+
+ btTransform frameInW;
+ frameInW.setIdentity();
+ frameInW.getBasis().setValue( xAxis[0], yAxis[0], zAxis[0],
+ xAxis[1], yAxis[1], zAxis[1],
+ xAxis[2], yAxis[2], zAxis[2]);
+ frameInW.setOrigin(m_anchor);
+
+ // now get constraint frame in local coordinate systems
+ m_frameInA = m_rbA.getCenterOfMassTransform().inverse() * frameInW;
+ m_frameInB = m_rbB.getCenterOfMassTransform().inverse() * frameInW;
+
+ calculateTransforms();
+}
+
+
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h
new file mode 100644
index 00000000000..a8d404a591c
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btUniversalConstraint.h
@@ -0,0 +1,62 @@
+/*
+Bullet Continuous Collision Detection and Physics Library, http://bulletphysics.org
+Copyright (C) 2006, 2007 Sony Computer Entertainment Inc.
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef UNIVERSAL_CONSTRAINT_H
+#define UNIVERSAL_CONSTRAINT_H
+
+
+
+#include "LinearMath/btVector3.h"
+#include "btTypedConstraint.h"
+#include "btGeneric6DofConstraint.h"
+
+
+
+/// Constraint similar to ODE Universal Joint
+/// has 2 rotatioonal degrees of freedom, similar to Euler rotations around Z (axis 1)
+/// and Y (axis 2)
+/// Description from ODE manual :
+/// "Given axis 1 on body 1, and axis 2 on body 2 that is perpendicular to axis 1, it keeps them perpendicular.
+/// In other words, rotation of the two bodies about the direction perpendicular to the two axes will be equal."
+
+class btUniversalConstraint : public btGeneric6DofConstraint
+{
+protected:
+ btVector3 m_anchor;
+ btVector3 m_axis1;
+ btVector3 m_axis2;
+public:
+ // constructor
+ // anchor, axis1 and axis2 are in world coordinate system
+ // axis1 must be orthogonal to axis2
+ btUniversalConstraint(btRigidBody& rbA, btRigidBody& rbB, btVector3& anchor, btVector3& axis1, btVector3& axis2);
+ // access
+ const btVector3& getAnchor() { return m_calculatedTransformA.getOrigin(); }
+ const btVector3& getAnchor2() { return m_calculatedTransformB.getOrigin(); }
+ const btVector3& getAxis1() { return m_axis1; }
+ const btVector3& getAxis2() { return m_axis2; }
+ btScalar getAngle1() { return getAngle(2); }
+ btScalar getAngle2() { return getAngle(1); }
+ // limits
+ void setUpperLimit(btScalar ang1max, btScalar ang2max) { setAngularUpperLimit(btVector3(0.f, ang1max, ang2max)); }
+ void setLowerLimit(btScalar ang1min, btScalar ang2min) { setAngularLowerLimit(btVector3(0.f, ang1min, ang2min)); }
+
+ void setAxis( const btVector3& axis1, const btVector3& axis2);
+};
+
+
+
+#endif // UNIVERSAL_CONSTRAINT_H
+
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/Bullet-C-API.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/Bullet-C-API.cpp
index 20d6975832b..bd8e2748383 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/Bullet-C-API.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/Bullet-C-API.cpp
@@ -43,7 +43,7 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h"
#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h"
#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h"
-#include "LinearMath/btStackAlloc.h"
+
/*
Create and Delete a Physics SDK
@@ -181,12 +181,12 @@ plCollisionShapeHandle plNewBoxShape(plReal x, plReal y, plReal z)
plCollisionShapeHandle plNewCapsuleShape(plReal radius, plReal height)
{
//capsule is convex hull of 2 spheres, so use btMultiSphereShape
- btVector3 inertiaHalfExtents(radius,height,radius);
+
const int numSpheres = 2;
btVector3 positions[numSpheres] = {btVector3(0,height,0),btVector3(0,-height,0)};
btScalar radi[numSpheres] = {radius,radius};
void* mem = btAlignedAlloc(sizeof(btMultiSphereShape),16);
- return (plCollisionShapeHandle) new (mem)btMultiSphereShape(inertiaHalfExtents,positions,radi,numSpheres);
+ return (plCollisionShapeHandle) new (mem)btMultiSphereShape(positions,radi,numSpheres);
}
plCollisionShapeHandle plNewConeShape(plReal radius, plReal height)
{
@@ -295,6 +295,14 @@ void plSetOrientation(plRigidBodyHandle object, const plQuaternion orientation)
body->setWorldTransform(worldTrans);
}
+void plSetOpenGLMatrix(plRigidBodyHandle object, plReal* matrix)
+{
+ btRigidBody* body = reinterpret_cast< btRigidBody* >(object);
+ btAssert(body);
+ btTransform& worldTrans = body->getWorldTransform();
+ worldTrans.setFromOpenGLMatrix(matrix);
+}
+
void plGetOpenGLMatrix(plRigidBodyHandle object, plReal* matrix)
{
btRigidBody* body = reinterpret_cast< btRigidBody* >(object);
@@ -365,6 +373,7 @@ double plNearestPoints(float p1[3], float p2[3], float p3[3], float q1[3], float
btPointCollector gjkOutput;
btGjkPairDetector::ClosestPointInput input;
+
btTransform tr;
tr.setIdentity();
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btActionInterface.h b/extern/bullet2/src/BulletDynamics/Dynamics/btActionInterface.h
index 8348795ef70..e1fea3a49c0 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btActionInterface.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btActionInterface.h
@@ -20,11 +20,17 @@ class btIDebugDraw;
class btCollisionWorld;
#include "LinearMath/btScalar.h"
+#include "btRigidBody.h"
///Basic interface to allow actions such as vehicles and characters to be updated inside a btDynamicsWorld
class btActionInterface
{
- public:
+protected:
+
+ static btRigidBody& getFixedBody();
+
+
+public:
virtual ~btActionInterface()
{
@@ -36,4 +42,5 @@ class btActionInterface
};
-#endif //_BT_ACTION_INTERFACE_H \ No newline at end of file
+#endif //_BT_ACTION_INTERFACE_H
+
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp
index fa0d63d74a1..23501c4435e 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp
@@ -48,6 +48,10 @@ void btContinuousDynamicsWorld::internalSingleStepSimulation( btScalar timeStep)
startProfiling(timeStep);
+ if(0 != m_internalPreTickCallback) {
+ (*m_internalPreTickCallback)(this, timeStep);
+ }
+
///update aabbs information
updateAabbs();
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
index b6231a8fda6..e1eada07c82 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -19,6 +19,7 @@ subject to the following restrictions:
//collision detection
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h"
+#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
#include "BulletCollision/CollisionShapes/btCollisionShape.h"
#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h"
#include "LinearMath/btTransformUtil.h"
@@ -35,27 +36,15 @@ subject to the following restrictions:
#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h"
#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h"
-//for debug rendering
-#include "BulletCollision/CollisionShapes/btBoxShape.h"
-#include "BulletCollision/CollisionShapes/btCapsuleShape.h"
-#include "BulletCollision/CollisionShapes/btCompoundShape.h"
-#include "BulletCollision/CollisionShapes/btConeShape.h"
-#include "BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h"
-#include "BulletCollision/CollisionShapes/btCylinderShape.h"
-#include "BulletCollision/CollisionShapes/btMultiSphereShape.h"
-#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h"
-#include "BulletCollision/CollisionShapes/btSphereShape.h"
-#include "BulletCollision/CollisionShapes/btTriangleCallback.h"
-#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h"
-#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h"
#include "LinearMath/btIDebugDraw.h"
+#include "BulletCollision/CollisionShapes/btSphereShape.h"
#include "BulletDynamics/Dynamics/btActionInterface.h"
#include "LinearMath/btQuickprof.h"
#include "LinearMath/btMotionState.h"
-
+#include "LinearMath/btSerializer.h"
@@ -63,7 +52,8 @@ btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btBroa
:btDynamicsWorld(dispatcher,pairCache,collisionConfiguration),
m_constraintSolver(constraintSolver),
m_gravity(0,-10,0),
-m_localTime(btScalar(1.)/btScalar(60.)),
+m_localTime(0),
+m_synchronizeAllMotionStates(false),
m_profileTimings(0)
{
if (!m_constraintSolver)
@@ -103,47 +93,31 @@ btDiscreteDynamicsWorld::~btDiscreteDynamicsWorld()
void btDiscreteDynamicsWorld::saveKinematicState(btScalar timeStep)
{
-
+///would like to iterate over m_nonStaticRigidBodies, but unfortunately old API allows
+///to switch status _after_ adding kinematic objects to the world
+///fix it for Bullet 3.x release
for (int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
- if (body)
+ if (body && body->getActivationState() != ISLAND_SLEEPING)
{
- if (body->getActivationState() != ISLAND_SLEEPING)
- {
- if (body->isKinematicObject())
- {
- //to calculate velocities next frame
- body->saveKinematicState(timeStep);
- }
- }
+ if (body->isKinematicObject())
+ {
+ //to calculate velocities next frame
+ body->saveKinematicState(timeStep);
+ }
}
}
+
}
void btDiscreteDynamicsWorld::debugDrawWorld()
{
BT_PROFILE("debugDrawWorld");
- if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawContactPoints)
- {
- int numManifolds = getDispatcher()->getNumManifolds();
- btVector3 color(0,0,0);
- for (int i=0;i<numManifolds;i++)
- {
- btPersistentManifold* contactManifold = getDispatcher()->getManifoldByIndexInternal(i);
- //btCollisionObject* obA = static_cast<btCollisionObject*>(contactManifold->getBody0());
- //btCollisionObject* obB = static_cast<btCollisionObject*>(contactManifold->getBody1());
+ btCollisionWorld::debugDrawWorld();
- int numContacts = contactManifold->getNumContacts();
- for (int j=0;j<numContacts;j++)
- {
- btManifoldPoint& cp = contactManifold->getContactPoint(j);
- getDebugDrawer()->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color);
- }
- }
- }
bool drawConstraints = false;
if (getDebugDrawer())
{
@@ -168,42 +142,6 @@ void btDiscreteDynamicsWorld::debugDrawWorld()
{
int i;
- for ( i=0;i<m_collisionObjects.size();i++)
- {
- btCollisionObject* colObj = m_collisionObjects[i];
- if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe)
- {
- btVector3 color(btScalar(255.),btScalar(255.),btScalar(255.));
- switch(colObj->getActivationState())
- {
- case ACTIVE_TAG:
- color = btVector3(btScalar(255.),btScalar(255.),btScalar(255.)); break;
- case ISLAND_SLEEPING:
- color = btVector3(btScalar(0.),btScalar(255.),btScalar(0.));break;
- case WANTS_DEACTIVATION:
- color = btVector3(btScalar(0.),btScalar(255.),btScalar(255.));break;
- case DISABLE_DEACTIVATION:
- color = btVector3(btScalar(255.),btScalar(0.),btScalar(0.));break;
- case DISABLE_SIMULATION:
- color = btVector3(btScalar(255.),btScalar(255.),btScalar(0.));break;
- default:
- {
- color = btVector3(btScalar(255.),btScalar(0.),btScalar(0.));
- }
- };
-
- debugDrawObject(colObj->getWorldTransform(),colObj->getCollisionShape(),color);
- }
- if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
- {
- btVector3 minAabb,maxAabb;
- btVector3 colorvec(1,0,0);
- colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);
- m_debugDrawer->drawAabb(minAabb,maxAabb,colorvec);
- }
-
- }
-
if (getDebugDrawer() && getDebugDrawer()->getDebugMode())
{
for (i=0;i<m_actions.size();i++)
@@ -217,15 +155,12 @@ void btDiscreteDynamicsWorld::debugDrawWorld()
void btDiscreteDynamicsWorld::clearForces()
{
///@todo: iterate over awake simulation islands!
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
{
- btCollisionObject* colObj = m_collisionObjects[i];
-
- btRigidBody* body = btRigidBody::upcast(colObj);
- if (body)
- {
- body->clearForces();
- }
+ btRigidBody* body = m_nonStaticRigidBodies[i];
+ //need to check if next line is ok
+ //it might break backward compatibility (people applying forces on sleeping objects get never cleared and accumulate on wake-up
+ body->clearForces();
}
}
@@ -233,12 +168,10 @@ void btDiscreteDynamicsWorld::clearForces()
void btDiscreteDynamicsWorld::applyGravity()
{
///@todo: iterate over awake simulation islands!
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
{
- btCollisionObject* colObj = m_collisionObjects[i];
-
- btRigidBody* body = btRigidBody::upcast(colObj);
- if (body && body->isActive())
+ btRigidBody* body = m_nonStaticRigidBodies[i];
+ if (body->isActive())
{
body->applyGravity();
}
@@ -269,32 +202,26 @@ void btDiscreteDynamicsWorld::synchronizeSingleMotionState(btRigidBody* body)
void btDiscreteDynamicsWorld::synchronizeMotionStates()
{
BT_PROFILE("synchronizeMotionStates");
+ if (m_synchronizeAllMotionStates)
{
- //todo: iterate over awake simulation islands!
+ //iterate over all collision objects
for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
-
btRigidBody* body = btRigidBody::upcast(colObj);
if (body)
synchronizeSingleMotionState(body);
}
- }
-/*
- if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe)
+ } else
{
- for ( int i=0;i<this->m_vehicles.size();i++)
+ //iterate over all active rigid bodies
+ for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
{
- for (int v=0;v<m_vehicles[i]->getNumWheels();v++)
- {
- //synchronize the wheels with the (interpolated) chassis worldtransform
- m_vehicles[i]->updateWheelTransform(v,true);
- }
+ btRigidBody* body = m_nonStaticRigidBodies[i];
+ if (body->isActive())
+ synchronizeSingleMotionState(body);
}
}
- */
-
-
}
@@ -340,23 +267,25 @@ int btDiscreteDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps,
if (numSimulationSubSteps)
{
- saveKinematicState(fixedTimeStep);
+ //clamp the number of substeps, to prevent simulation grinding spiralling down to a halt
+ int clampedSimulationSteps = (numSimulationSubSteps > maxSubSteps)? maxSubSteps : numSimulationSubSteps;
+
+ saveKinematicState(fixedTimeStep*clampedSimulationSteps);
applyGravity();
- //clamp the number of substeps, to prevent simulation grinding spiralling down to a halt
- int clampedSimulationSteps = (numSimulationSubSteps > maxSubSteps)? maxSubSteps : numSimulationSubSteps;
+
for (int i=0;i<clampedSimulationSteps;i++)
{
internalSingleStepSimulation(fixedTimeStep);
- //for Blender, no need to synchronize here, it is done in blender anyway
- //synchronizeMotionStates();
+ synchronizeMotionStates();
}
- }
- //else
- // synchronizeMotionStates();
+ } else
+ {
+ synchronizeMotionStates();
+ }
clearForces();
@@ -372,6 +301,10 @@ void btDiscreteDynamicsWorld::internalSingleStepSimulation(btScalar timeStep)
BT_PROFILE("internalSingleStepSimulation");
+ if(0 != m_internalPreTickCallback) {
+ (*m_internalPreTickCallback)(this, timeStep);
+ }
+
///apply gravity, predict motion
predictUnconstraintMotion(timeStep);
@@ -412,11 +345,10 @@ void btDiscreteDynamicsWorld::internalSingleStepSimulation(btScalar timeStep)
void btDiscreteDynamicsWorld::setGravity(const btVector3& gravity)
{
m_gravity = gravity;
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
{
- btCollisionObject* colObj = m_collisionObjects[i];
- btRigidBody* body = btRigidBody::upcast(colObj);
- if (body)
+ btRigidBody* body = m_nonStaticRigidBodies[i];
+ if (body->isActive() && !(body->getFlags() &BT_DISABLE_WORLD_GRAVITY))
{
body->setGravity(gravity);
}
@@ -428,21 +360,44 @@ btVector3 btDiscreteDynamicsWorld::getGravity () const
return m_gravity;
}
+void btDiscreteDynamicsWorld::addCollisionObject(btCollisionObject* collisionObject,short int collisionFilterGroup,short int collisionFilterMask)
+{
+ btCollisionWorld::addCollisionObject(collisionObject,collisionFilterGroup,collisionFilterMask);
+}
+
+void btDiscreteDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
+{
+ btRigidBody* body = btRigidBody::upcast(collisionObject);
+ if (body)
+ removeRigidBody(body);
+ else
+ btCollisionWorld::removeCollisionObject(collisionObject);
+}
void btDiscreteDynamicsWorld::removeRigidBody(btRigidBody* body)
{
- removeCollisionObject(body);
+ m_nonStaticRigidBodies.remove(body);
+ btCollisionWorld::removeCollisionObject(body);
}
+
void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body)
{
- if (!body->isStaticOrKinematicObject())
+ if (!body->isStaticOrKinematicObject() && !(body->getFlags() &BT_DISABLE_WORLD_GRAVITY))
{
body->setGravity(m_gravity);
}
if (body->getCollisionShape())
{
+ if (!body->isStaticObject())
+ {
+ m_nonStaticRigidBodies.push_back(body);
+ } else
+ {
+ body->setActivationState(ISLAND_SLEEPING);
+ }
+
bool isDynamic = !(body->isStaticObject() || body->isKinematicObject());
short collisionFilterGroup = isDynamic? short(btBroadphaseProxy::DefaultFilter) : short(btBroadphaseProxy::StaticFilter);
short collisionFilterMask = isDynamic? short(btBroadphaseProxy::AllFilter) : short(btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter);
@@ -453,13 +408,21 @@ void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body)
void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body, short group, short mask)
{
- if (!body->isStaticOrKinematicObject())
+ if (!body->isStaticOrKinematicObject() && !(body->getFlags() &BT_DISABLE_WORLD_GRAVITY))
{
body->setGravity(m_gravity);
}
if (body->getCollisionShape())
{
+ if (!body->isStaticObject())
+ {
+ m_nonStaticRigidBodies.push_back(body);
+ }
+ else
+ {
+ body->setActivationState(ISLAND_SLEEPING);
+ }
addCollisionObject(body,group,mask);
}
}
@@ -480,10 +443,9 @@ void btDiscreteDynamicsWorld::updateActivationState(btScalar timeStep)
{
BT_PROFILE("updateActivationState");
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
{
- btCollisionObject* colObj = m_collisionObjects[i];
- btRigidBody* body = btRigidBody::upcast(colObj);
+ btRigidBody* body = m_nonStaticRigidBodies[i];
if (body)
{
body->updateDeactivation(timeStep);
@@ -589,7 +551,6 @@ class btSortConstraintOnIslandPredicate
-
void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
{
BT_PROFILE("solveConstraints");
@@ -604,6 +565,11 @@ void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
btIDebugDraw* m_debugDrawer;
btStackAlloc* m_stackAlloc;
btDispatcher* m_dispatcher;
+
+ btAlignedObjectArray<btCollisionObject*> m_bodies;
+ btAlignedObjectArray<btPersistentManifold*> m_manifolds;
+ btAlignedObjectArray<btTypedConstraint*> m_constraints;
+
InplaceSolverIslandCallback(
btContactSolverInfo& solverInfo,
@@ -624,6 +590,7 @@ void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
}
+
InplaceSolverIslandCallback& operator=(InplaceSolverIslandCallback& other)
{
btAssert(0);
@@ -664,17 +631,48 @@ void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
}
}
- ///only call solveGroup if there is some work: avoid virtual function call, its overhead can be excessive
- if (numManifolds + numCurConstraints)
+ if (m_solverInfo.m_minimumSolverBatchSize<=1)
{
- m_solver->solveGroup( bodies,numBodies,manifolds, numManifolds,startConstraint,numCurConstraints,m_solverInfo,m_debugDrawer,m_stackAlloc,m_dispatcher);
+ ///only call solveGroup if there is some work: avoid virtual function call, its overhead can be excessive
+ if (numManifolds + numCurConstraints)
+ {
+ m_solver->solveGroup( bodies,numBodies,manifolds, numManifolds,startConstraint,numCurConstraints,m_solverInfo,m_debugDrawer,m_stackAlloc,m_dispatcher);
+ }
+ } else
+ {
+
+ for (i=0;i<numBodies;i++)
+ m_bodies.push_back(bodies[i]);
+ for (i=0;i<numManifolds;i++)
+ m_manifolds.push_back(manifolds[i]);
+ for (i=0;i<numCurConstraints;i++)
+ m_constraints.push_back(startConstraint[i]);
+ if ((m_constraints.size()+m_manifolds.size())>m_solverInfo.m_minimumSolverBatchSize)
+ {
+ processConstraints();
+ } else
+ {
+ //printf("deferred\n");
+ }
}
-
}
}
+ void processConstraints()
+ {
+ if (m_manifolds.size() + m_constraints.size()>0)
+ {
+ m_solver->solveGroup( &m_bodies[0],m_bodies.size(), &m_manifolds[0], m_manifolds.size(), &m_constraints[0], m_constraints.size() ,m_solverInfo,m_debugDrawer,m_stackAlloc,m_dispatcher);
+ }
+ m_bodies.resize(0);
+ m_manifolds.resize(0);
+ m_constraints.resize(0);
+
+ }
};
+
+
//sorted version of all btTypedConstraint, based on islandId
btAlignedObjectArray<btTypedConstraint*> sortedConstraints;
sortedConstraints.resize( m_constraints.size());
@@ -699,6 +697,8 @@ void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
/// solve all the constraints for this island
m_islandManager->buildAndProcessIslands(getCollisionWorld()->getDispatcher(),getCollisionWorld(),&solverCallback);
+ solverCallback.processConstraints();
+
m_constraintSolver->allSolved(solverInfo, m_debugDrawer, m_stackAlloc);
}
@@ -726,13 +726,9 @@ void btDiscreteDynamicsWorld::calculateSimulationIslands()
{
if (colObj0->isActive() || colObj1->isActive())
{
- if ((colObj0)->getIslandTag() != -1 && (colObj1)->getIslandTag() != -1)
- {
-
- getSimulationIslandManager()->getUnionFind().unite((colObj0)->getIslandTag(),
- (colObj1)->getIslandTag());
- }
-
+
+ getSimulationIslandManager()->getUnionFind().unite((colObj0)->getIslandTag(),
+ (colObj1)->getIslandTag());
}
}
}
@@ -745,7 +741,7 @@ void btDiscreteDynamicsWorld::calculateSimulationIslands()
}
-#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
+
class btClosestNotMeConvexResultCallback : public btCollisionWorld::ClosestConvexResultCallback
{
@@ -758,8 +754,8 @@ class btClosestNotMeConvexResultCallback : public btCollisionWorld::ClosestConve
public:
btClosestNotMeConvexResultCallback (btCollisionObject* me,const btVector3& fromA,const btVector3& toA,btOverlappingPairCache* pairCache,btDispatcher* dispatcher) :
btCollisionWorld::ClosestConvexResultCallback(fromA,toA),
- m_allowedPenetration(0.0f),
m_me(me),
+ m_allowedPenetration(0.0f),
m_pairCache(pairCache),
m_dispatcher(dispatcher)
{
@@ -833,46 +829,42 @@ void btDiscreteDynamicsWorld::integrateTransforms(btScalar timeStep)
{
BT_PROFILE("integrateTransforms");
btTransform predictedTrans;
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
{
- btCollisionObject* colObj = m_collisionObjects[i];
- btRigidBody* body = btRigidBody::upcast(colObj);
- if (body)
+ btRigidBody* body = m_nonStaticRigidBodies[i];
+ body->setHitFraction(1.f);
+
+ if (body->isActive() && (!body->isStaticOrKinematicObject()))
{
- body->setHitFraction(1.f);
+ body->predictIntegratedTransform(timeStep, predictedTrans);
+ btScalar squareMotion = (predictedTrans.getOrigin()-body->getWorldTransform().getOrigin()).length2();
- if (body->isActive() && (!body->isStaticOrKinematicObject()))
+ if (body->getCcdSquareMotionThreshold() && body->getCcdSquareMotionThreshold() < squareMotion)
{
- body->predictIntegratedTransform(timeStep, predictedTrans);
- btScalar squareMotion = (predictedTrans.getOrigin()-body->getWorldTransform().getOrigin()).length2();
-
- if (body->getCcdSquareMotionThreshold() && body->getCcdSquareMotionThreshold() < squareMotion)
+ BT_PROFILE("CCD motion clamping");
+ if (body->getCollisionShape()->isConvex())
{
- BT_PROFILE("CCD motion clamping");
- if (body->getCollisionShape()->isConvex())
+ gNumClampedCcdMotions++;
+
+ btClosestNotMeConvexResultCallback sweepResults(body,body->getWorldTransform().getOrigin(),predictedTrans.getOrigin(),getBroadphase()->getOverlappingPairCache(),getDispatcher());
+ //btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
+ btSphereShape tmpSphere(body->getCcdSweptSphereRadius());//btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
+
+ sweepResults.m_collisionFilterGroup = body->getBroadphaseProxy()->m_collisionFilterGroup;
+ sweepResults.m_collisionFilterMask = body->getBroadphaseProxy()->m_collisionFilterMask;
+
+ convexSweepTest(&tmpSphere,body->getWorldTransform(),predictedTrans,sweepResults);
+ if (sweepResults.hasHit() && (sweepResults.m_closestHitFraction < 1.f))
{
- gNumClampedCcdMotions++;
-
- btClosestNotMeConvexResultCallback sweepResults(body,body->getWorldTransform().getOrigin(),predictedTrans.getOrigin(),getBroadphase()->getOverlappingPairCache(),getDispatcher());
- btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
- btSphereShape tmpSphere(body->getCcdSweptSphereRadius());//btConvexShape* convexShape = static_cast<btConvexShape*>(body->getCollisionShape());
-
- sweepResults.m_collisionFilterGroup = body->getBroadphaseProxy()->m_collisionFilterGroup;
- sweepResults.m_collisionFilterMask = body->getBroadphaseProxy()->m_collisionFilterMask;
-
- convexSweepTest(&tmpSphere,body->getWorldTransform(),predictedTrans,sweepResults);
- if (sweepResults.hasHit() && (sweepResults.m_closestHitFraction < 1.f))
- {
- body->setHitFraction(sweepResults.m_closestHitFraction);
- body->predictIntegratedTransform(timeStep*body->getHitFraction(), predictedTrans);
- body->setHitFraction(0.f);
+ body->setHitFraction(sweepResults.m_closestHitFraction);
+ body->predictIntegratedTransform(timeStep*body->getHitFraction(), predictedTrans);
+ body->setHitFraction(0.f);
// printf("clamped integration to hit fraction = %f\n",fraction);
- }
}
}
-
- body->proceedToTransform( predictedTrans);
}
+
+ body->proceedToTransform( predictedTrans);
}
}
}
@@ -884,21 +876,16 @@ void btDiscreteDynamicsWorld::integrateTransforms(btScalar timeStep)
void btDiscreteDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
{
BT_PROFILE("predictUnconstraintMotion");
- for ( int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_nonStaticRigidBodies.size();i++)
{
- btCollisionObject* colObj = m_collisionObjects[i];
- btRigidBody* body = btRigidBody::upcast(colObj);
- if (body)
+ btRigidBody* body = m_nonStaticRigidBodies[i];
+ if (!body->isStaticOrKinematicObject())
{
- if (!body->isStaticOrKinematicObject())
- {
-
- body->integrateVelocities( timeStep);
- //damping
- body->applyDamping(timeStep);
+ body->integrateVelocities( timeStep);
+ //damping
+ body->applyDamping(timeStep);
- body->predictIntegratedTransform(timeStep,body->getInterpolationWorldTransform());
- }
+ body->predictIntegratedTransform(timeStep,body->getInterpolationWorldTransform());
}
}
}
@@ -919,281 +906,6 @@ void btDiscreteDynamicsWorld::startProfiling(btScalar timeStep)
-class DebugDrawcallback : public btTriangleCallback, public btInternalTriangleIndexCallback
-{
- btIDebugDraw* m_debugDrawer;
- btVector3 m_color;
- btTransform m_worldTrans;
-
-public:
-
- DebugDrawcallback(btIDebugDraw* debugDrawer,const btTransform& worldTrans,const btVector3& color) :
- m_debugDrawer(debugDrawer),
- m_color(color),
- m_worldTrans(worldTrans)
- {
- }
-
- virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
- {
- processTriangle(triangle,partId,triangleIndex);
- }
-
- virtual void processTriangle(btVector3* triangle,int partId, int triangleIndex)
- {
- (void)partId;
- (void)triangleIndex;
-
- btVector3 wv0,wv1,wv2;
- wv0 = m_worldTrans*triangle[0];
- wv1 = m_worldTrans*triangle[1];
- wv2 = m_worldTrans*triangle[2];
- m_debugDrawer->drawLine(wv0,wv1,m_color);
- m_debugDrawer->drawLine(wv1,wv2,m_color);
- m_debugDrawer->drawLine(wv2,wv0,m_color);
- }
-};
-
-void btDiscreteDynamicsWorld::debugDrawSphere(btScalar radius, const btTransform& transform, const btVector3& color)
-{
- btVector3 start = transform.getOrigin();
-
- const btVector3 xoffs = transform.getBasis() * btVector3(radius,0,0);
- const btVector3 yoffs = transform.getBasis() * btVector3(0,radius,0);
- const btVector3 zoffs = transform.getBasis() * btVector3(0,0,radius);
-
- // XY
- getDebugDrawer()->drawLine(start-xoffs, start+yoffs, color);
- getDebugDrawer()->drawLine(start+yoffs, start+xoffs, color);
- getDebugDrawer()->drawLine(start+xoffs, start-yoffs, color);
- getDebugDrawer()->drawLine(start-yoffs, start-xoffs, color);
-
- // XZ
- getDebugDrawer()->drawLine(start-xoffs, start+zoffs, color);
- getDebugDrawer()->drawLine(start+zoffs, start+xoffs, color);
- getDebugDrawer()->drawLine(start+xoffs, start-zoffs, color);
- getDebugDrawer()->drawLine(start-zoffs, start-xoffs, color);
-
- // YZ
- getDebugDrawer()->drawLine(start-yoffs, start+zoffs, color);
- getDebugDrawer()->drawLine(start+zoffs, start+yoffs, color);
- getDebugDrawer()->drawLine(start+yoffs, start-zoffs, color);
- getDebugDrawer()->drawLine(start-zoffs, start-yoffs, color);
-}
-
-void btDiscreteDynamicsWorld::debugDrawObject(const btTransform& worldTransform, const btCollisionShape* shape, const btVector3& color)
-{
- // Draw a small simplex at the center of the object
- {
- btVector3 start = worldTransform.getOrigin();
- getDebugDrawer()->drawLine(start, start+worldTransform.getBasis() * btVector3(1,0,0), btVector3(1,0,0));
- getDebugDrawer()->drawLine(start, start+worldTransform.getBasis() * btVector3(0,1,0), btVector3(0,1,0));
- getDebugDrawer()->drawLine(start, start+worldTransform.getBasis() * btVector3(0,0,1), btVector3(0,0,1));
- }
-
- if (shape->getShapeType() == COMPOUND_SHAPE_PROXYTYPE)
- {
- const btCompoundShape* compoundShape = static_cast<const btCompoundShape*>(shape);
- for (int i=compoundShape->getNumChildShapes()-1;i>=0;i--)
- {
- btTransform childTrans = compoundShape->getChildTransform(i);
- const btCollisionShape* colShape = compoundShape->getChildShape(i);
- debugDrawObject(worldTransform*childTrans,colShape,color);
- }
-
- } else
- {
- switch (shape->getShapeType())
- {
-
- case SPHERE_SHAPE_PROXYTYPE:
- {
- const btSphereShape* sphereShape = static_cast<const btSphereShape*>(shape);
- btScalar radius = sphereShape->getMargin();//radius doesn't include the margin, so draw with margin
-
- debugDrawSphere(radius, worldTransform, color);
- break;
- }
- case MULTI_SPHERE_SHAPE_PROXYTYPE:
- {
- const btMultiSphereShape* multiSphereShape = static_cast<const btMultiSphereShape*>(shape);
-
- for (int i = multiSphereShape->getSphereCount()-1; i>=0;i--)
- {
- btTransform childTransform = worldTransform;
- childTransform.getOrigin() += multiSphereShape->getSpherePosition(i);
- debugDrawSphere(multiSphereShape->getSphereRadius(i), childTransform, color);
- }
-
- break;
- }
- case CAPSULE_SHAPE_PROXYTYPE:
- {
- const btCapsuleShape* capsuleShape = static_cast<const btCapsuleShape*>(shape);
-
- btScalar radius = capsuleShape->getRadius();
- btScalar halfHeight = capsuleShape->getHalfHeight();
-
- int upAxis = capsuleShape->getUpAxis();
-
-
- btVector3 capStart(0.f,0.f,0.f);
- capStart[upAxis] = -halfHeight;
-
- btVector3 capEnd(0.f,0.f,0.f);
- capEnd[upAxis] = halfHeight;
-
- // Draw the ends
- {
-
- btTransform childTransform = worldTransform;
- childTransform.getOrigin() = worldTransform * capStart;
- debugDrawSphere(radius, childTransform, color);
- }
-
- {
- btTransform childTransform = worldTransform;
- childTransform.getOrigin() = worldTransform * capEnd;
- debugDrawSphere(radius, childTransform, color);
- }
-
- // Draw some additional lines
- btVector3 start = worldTransform.getOrigin();
-
-
- capStart[(upAxis+1)%3] = radius;
- capEnd[(upAxis+1)%3] = radius;
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * capStart,start+worldTransform.getBasis() * capEnd, color);
- capStart[(upAxis+1)%3] = -radius;
- capEnd[(upAxis+1)%3] = -radius;
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * capStart,start+worldTransform.getBasis() * capEnd, color);
-
- capStart[(upAxis+1)%3] = 0.f;
- capEnd[(upAxis+1)%3] = 0.f;
-
- capStart[(upAxis+2)%3] = radius;
- capEnd[(upAxis+2)%3] = radius;
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * capStart,start+worldTransform.getBasis() * capEnd, color);
- capStart[(upAxis+2)%3] = -radius;
- capEnd[(upAxis+2)%3] = -radius;
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * capStart,start+worldTransform.getBasis() * capEnd, color);
-
-
- break;
- }
- case CONE_SHAPE_PROXYTYPE:
- {
- const btConeShape* coneShape = static_cast<const btConeShape*>(shape);
- btScalar radius = coneShape->getRadius();//+coneShape->getMargin();
- btScalar height = coneShape->getHeight();//+coneShape->getMargin();
- btVector3 start = worldTransform.getOrigin();
-
- int upAxis= coneShape->getConeUpIndex();
-
-
- btVector3 offsetHeight(0,0,0);
- offsetHeight[upAxis] = height * btScalar(0.5);
- btVector3 offsetRadius(0,0,0);
- offsetRadius[(upAxis+1)%3] = radius;
- btVector3 offset2Radius(0,0,0);
- offset2Radius[(upAxis+2)%3] = radius;
-
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight),start+worldTransform.getBasis() * (-offsetHeight+offsetRadius),color);
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight),start+worldTransform.getBasis() * (-offsetHeight-offsetRadius),color);
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight),start+worldTransform.getBasis() * (-offsetHeight+offset2Radius),color);
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight),start+worldTransform.getBasis() * (-offsetHeight-offset2Radius),color);
-
-
-
- break;
-
- }
- case CYLINDER_SHAPE_PROXYTYPE:
- {
- const btCylinderShape* cylinder = static_cast<const btCylinderShape*>(shape);
- int upAxis = cylinder->getUpAxis();
- btScalar radius = cylinder->getRadius();
- btScalar halfHeight = cylinder->getHalfExtentsWithMargin()[upAxis];
- btVector3 start = worldTransform.getOrigin();
- btVector3 offsetHeight(0,0,0);
- offsetHeight[upAxis] = halfHeight;
- btVector3 offsetRadius(0,0,0);
- offsetRadius[(upAxis+1)%3] = radius;
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight+offsetRadius),start+worldTransform.getBasis() * (-offsetHeight+offsetRadius),color);
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * (offsetHeight-offsetRadius),start+worldTransform.getBasis() * (-offsetHeight-offsetRadius),color);
- break;
- }
-
- case STATIC_PLANE_PROXYTYPE:
- {
- const btStaticPlaneShape* staticPlaneShape = static_cast<const btStaticPlaneShape*>(shape);
- btScalar planeConst = staticPlaneShape->getPlaneConstant();
- const btVector3& planeNormal = staticPlaneShape->getPlaneNormal();
- btVector3 planeOrigin = planeNormal * planeConst;
- btVector3 vec0,vec1;
- btPlaneSpace1(planeNormal,vec0,vec1);
- btScalar vecLen = 100.f;
- btVector3 pt0 = planeOrigin + vec0*vecLen;
- btVector3 pt1 = planeOrigin - vec0*vecLen;
- btVector3 pt2 = planeOrigin + vec1*vecLen;
- btVector3 pt3 = planeOrigin - vec1*vecLen;
- getDebugDrawer()->drawLine(worldTransform*pt0,worldTransform*pt1,color);
- getDebugDrawer()->drawLine(worldTransform*pt2,worldTransform*pt3,color);
- break;
-
- }
- default:
- {
-
- if (shape->isConcave())
- {
- btConcaveShape* concaveMesh = (btConcaveShape*) shape;
-
- ///@todo pass camera, for some culling? no -> we are not a graphics lib
- btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
- btVector3 aabbMin(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
-
- DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
- concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax);
-
- }
-
- if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE)
- {
- btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape;
- //todo: pass camera for some culling
- btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
- btVector3 aabbMin(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
- //DebugDrawcallback drawCallback;
- DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
- convexMesh->getMeshInterface()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax);
- }
-
-
- /// for polyhedral shapes
- if (shape->isPolyhedral())
- {
- btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shape;
-
- int i;
- for (i=0;i<polyshape->getNumEdges();i++)
- {
- btVector3 a,b;
- polyshape->getEdge(i,a,b);
- btVector3 wa = worldTransform * a;
- btVector3 wb = worldTransform * b;
- getDebugDrawer()->drawLine(wa,wb,color);
-
- }
-
-
- }
- }
- }
- }
-}
-
-
void btDiscreteDynamicsWorld::debugDrawConstraint(btTypedConstraint* constraint)
{
bool drawFrames = (getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawConstraints) != 0;
@@ -1297,6 +1009,7 @@ void btDiscreteDynamicsWorld::debugDrawConstraint(btTypedConstraint* constraint)
}
}
break;
+ case D6_SPRING_CONSTRAINT_TYPE:
case D6_CONSTRAINT_TYPE:
{
btGeneric6DofConstraint* p6DOF = (btGeneric6DofConstraint*)constraint;
@@ -1354,7 +1067,7 @@ void btDiscreteDynamicsWorld::debugDrawConstraint(btTypedConstraint* constraint)
if(drawFrames) getDebugDrawer()->drawTransform(tr, dbgDrawSize);
if(drawLimits)
{
- btTransform tr = pSlider->getCalculatedTransformA();
+ btTransform tr = pSlider->getUseLinearReferenceFrameA() ? pSlider->getCalculatedTransformA() : pSlider->getCalculatedTransformB();
btVector3 li_min = tr * btVector3(pSlider->getLowerLinLimit(), 0.f, 0.f);
btVector3 li_max = tr * btVector3(pSlider->getUpperLinLimit(), 0.f, 0.f);
getDebugDrawer()->drawLine(li_min, li_max, btVector3(0, 0, 0));
@@ -1371,7 +1084,7 @@ void btDiscreteDynamicsWorld::debugDrawConstraint(btTypedConstraint* constraint)
break;
}
return;
-} // btDiscreteDynamicsWorld::debugDrawConstraint()
+}
@@ -1407,3 +1120,43 @@ const btTypedConstraint* btDiscreteDynamicsWorld::getConstraint(int index) const
}
+
+void btDiscreteDynamicsWorld::serializeRigidBodies(btSerializer* serializer)
+{
+ int i;
+ //serialize all collision objects
+ for (i=0;i<m_collisionObjects.size();i++)
+ {
+ btCollisionObject* colObj = m_collisionObjects[i];
+ if (colObj->getInternalType() & btCollisionObject::CO_RIGID_BODY)
+ {
+ int len = colObj->calculateSerializeBufferSize();
+ btChunk* chunk = serializer->allocate(len,1);
+ const char* structType = colObj->serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk,structType,BT_RIGIDBODY_CODE,colObj);
+ }
+ }
+
+ for (i=0;i<m_constraints.size();i++)
+ {
+ btTypedConstraint* constraint = m_constraints[i];
+ int size = constraint->calculateSerializeBufferSize();
+ btChunk* chunk = serializer->allocate(size,1);
+ const char* structType = constraint->serialize(chunk->m_oldPtr,serializer);
+ serializer->finalizeChunk(chunk,structType,BT_CONSTRAINT_CODE,constraint);
+ }
+}
+
+
+void btDiscreteDynamicsWorld::serialize(btSerializer* serializer)
+{
+
+ serializer->startSerialization();
+
+ serializeRigidBodies(serializer);
+
+ serializeCollisionObjects(serializer);
+
+ serializer->finishSerialization();
+}
+
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h b/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
index 4662cf5052a..df47c29044f 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
@@ -1,6 +1,6 @@
/*
Bullet Continuous Collision Detection and Physics Library
-Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -13,6 +13,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+
#ifndef BT_DISCRETE_DYNAMICS_WORLD_H
#define BT_DISCRETE_DYNAMICS_WORLD_H
@@ -41,6 +42,8 @@ protected:
btAlignedObjectArray<btTypedConstraint*> m_constraints;
+ btAlignedObjectArray<btRigidBody*> m_nonStaticRigidBodies;
+
btVector3 m_gravity;
//for variable timesteps
@@ -49,6 +52,7 @@ protected:
bool m_ownsIslandManager;
bool m_ownsConstraintSolver;
+ bool m_synchronizeAllMotionStates;
btAlignedObjectArray<btActionInterface*> m_actions;
@@ -73,8 +77,7 @@ protected:
virtual void saveKinematicState(btScalar timeStep);
- void debugDrawSphere(btScalar radius, const btTransform& transform, const btVector3& color);
-
+ void serializeRigidBodies(btSerializer* serializer);
public:
@@ -120,13 +123,17 @@ public:
virtual btVector3 getGravity () const;
+ virtual void addCollisionObject(btCollisionObject* collisionObject,short int collisionFilterGroup=btBroadphaseProxy::StaticFilter,short int collisionFilterMask=btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter);
+
virtual void addRigidBody(btRigidBody* body);
virtual void addRigidBody(btRigidBody* body, short group, short mask);
virtual void removeRigidBody(btRigidBody* body);
- void debugDrawObject(const btTransform& worldTransform, const btCollisionShape* shape, const btVector3& color);
+ ///removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise call btCollisionWorld::removeCollisionObject
+ virtual void removeCollisionObject(btCollisionObject* collisionObject);
+
void debugDrawConstraint(btTypedConstraint* constraint);
@@ -174,6 +181,18 @@ public:
///obsolete, use removeAction instead
virtual void removeCharacter(btActionInterface* character);
+ void setSynchronizeAllMotionStates(bool synchronizeAll)
+ {
+ m_synchronizeAllMotionStates = synchronizeAll;
+ }
+ bool getSynchronizeAllMotionStates() const
+ {
+ return m_synchronizeAllMotionStates;
+ }
+
+ ///Preliminary serialization test for Bullet 2.76. Loading those files requires a separate parser (see Bullet/Demos/SerializeDemo)
+ virtual void serialize(btSerializer* serializer);
+
};
#endif //BT_DISCRETE_DYNAMICS_WORLD_H
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h b/extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h
index ecf7a2f0c64..105317920ae 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h
@@ -41,6 +41,7 @@ class btDynamicsWorld : public btCollisionWorld
protected:
btInternalTickCallback m_internalTickCallback;
+ btInternalTickCallback m_internalPreTickCallback;
void* m_worldUserInfo;
btContactSolverInfo m_solverInfo;
@@ -49,7 +50,7 @@ public:
btDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* broadphase,btCollisionConfiguration* collisionConfiguration)
- :btCollisionWorld(dispatcher,broadphase,collisionConfiguration), m_internalTickCallback(0), m_worldUserInfo(0)
+ :btCollisionWorld(dispatcher,broadphase,collisionConfiguration), m_internalTickCallback(0),m_internalPreTickCallback(0), m_worldUserInfo(0)
{
}
@@ -85,6 +86,8 @@ public:
virtual void addRigidBody(btRigidBody* body) = 0;
+ virtual void addRigidBody(btRigidBody* body, short group, short mask) = 0;
+
virtual void removeRigidBody(btRigidBody* body) = 0;
virtual void setConstraintSolver(btConstraintSolver* solver) = 0;
@@ -102,9 +105,15 @@ public:
virtual void clearForces() = 0;
/// Set the callback for when an internal tick (simulation substep) happens, optional user info
- void setInternalTickCallback(btInternalTickCallback cb, void* worldUserInfo=0)
+ void setInternalTickCallback(btInternalTickCallback cb, void* worldUserInfo=0,bool isPreTick=false)
{
- m_internalTickCallback = cb;
+ if (isPreTick)
+ {
+ m_internalPreTickCallback = cb;
+ } else
+ {
+ m_internalTickCallback = cb;
+ }
m_worldUserInfo = worldUserInfo;
}
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp
index a4d8e1d77f6..aefb26a1be2 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp
@@ -19,6 +19,7 @@ subject to the following restrictions:
#include "LinearMath/btTransformUtil.h"
#include "LinearMath/btMotionState.h"
#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
+#include "LinearMath/btSerializer.h"
//'temporarily' global variables
btScalar gDeactivationTime = btScalar(2.);
@@ -50,8 +51,8 @@ void btRigidBody::setupRigidBody(const btRigidBody::btRigidBodyConstructionInfo&
m_gravity_acceleration.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
m_totalForce.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
m_totalTorque.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)),
- m_linearDamping = btScalar(0.);
- m_angularDamping = btScalar(0.5);
+ setDamping(constructionInfo.m_linearDamping, constructionInfo.m_angularDamping);
+
m_linearSleepingThreshold = constructionInfo.m_linearSleepingThreshold;
m_angularSleepingThreshold = constructionInfo.m_angularSleepingThreshold;
m_optionalMotionState = constructionInfo.m_motionState;
@@ -83,9 +84,19 @@ void btRigidBody::setupRigidBody(const btRigidBody::btRigidBodyConstructionInfo&
m_debugBodyId = uniqueId++;
setMassProps(constructionInfo.m_mass, constructionInfo.m_localInertia);
- setDamping(constructionInfo.m_linearDamping, constructionInfo.m_angularDamping);
updateInertiaTensor();
+ m_rigidbodyFlags = 0;
+
+
+ m_deltaLinearVelocity.setZero();
+ m_deltaAngularVelocity.setZero();
+ m_invMass = m_inverseMass*m_linearFactor;
+ m_pushVelocity.setZero();
+ m_turnVelocity.setZero();
+
+
+
}
@@ -136,8 +147,8 @@ void btRigidBody::setGravity(const btVector3& acceleration)
void btRigidBody::setDamping(btScalar lin_damping, btScalar ang_damping)
{
- m_linearDamping = GEN_clamped(lin_damping, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0));
- m_angularDamping = GEN_clamped(ang_damping, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0));
+ m_linearDamping = btClamped(lin_damping, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0));
+ m_angularDamping = btClamped(ang_damping, (btScalar)btScalar(0.0), (btScalar)btScalar(1.0));
}
@@ -227,11 +238,15 @@ void btRigidBody::setMassProps(btScalar mass, const btVector3& inertia)
m_collisionFlags &= (~btCollisionObject::CF_STATIC_OBJECT);
m_inverseMass = btScalar(1.0) / mass;
}
+
+ //Fg = m * a
+ m_gravity = mass * m_gravity_acceleration;
m_invInertiaLocal.setValue(inertia.x() != btScalar(0.0) ? btScalar(1.0) / inertia.x(): btScalar(0.0),
inertia.y() != btScalar(0.0) ? btScalar(1.0) / inertia.y(): btScalar(0.0),
inertia.z() != btScalar(0.0) ? btScalar(1.0) / inertia.z(): btScalar(0.0));
+ m_invMass = m_linearFactor*m_inverseMass;
}
@@ -301,6 +316,28 @@ bool btRigidBody::checkCollideWithOverride(btCollisionObject* co)
return true;
}
+void btRigidBody::internalWritebackVelocity(btScalar timeStep)
+{
+ (void) timeStep;
+ if (m_inverseMass)
+ {
+ setLinearVelocity(getLinearVelocity()+ m_deltaLinearVelocity);
+ setAngularVelocity(getAngularVelocity()+m_deltaAngularVelocity);
+
+ //correct the position/orientation based on push/turn recovery
+ btTransform newTransform;
+ btTransformUtil::integrateTransform(getWorldTransform(),m_pushVelocity,m_turnVelocity,timeStep,newTransform);
+ setWorldTransform(newTransform);
+ //m_originalBody->setCompanionId(-1);
+ }
+// m_deltaLinearVelocity.setZero();
+// m_deltaAngularVelocity .setZero();
+// m_pushVelocity.setZero();
+// m_turnVelocity.setZero();
+}
+
+
+
void btRigidBody::addConstraintRef(btTypedConstraint* c)
{
int index = m_constraintRefs.findLinearSearch(c);
@@ -315,3 +352,51 @@ void btRigidBody::removeConstraintRef(btTypedConstraint* c)
m_constraintRefs.remove(c);
m_checkCollideWith = m_constraintRefs.size() > 0;
}
+
+int btRigidBody::calculateSerializeBufferSize() const
+{
+ int sz = sizeof(btRigidBodyData);
+ return sz;
+}
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btRigidBody::serialize(void* dataBuffer, class btSerializer* serializer) const
+{
+ btRigidBodyData* rbd = (btRigidBodyData*) dataBuffer;
+
+ btCollisionObject::serialize(&rbd->m_collisionObjectData, serializer);
+
+ m_invInertiaTensorWorld.serialize(rbd->m_invInertiaTensorWorld);
+ m_linearVelocity.serialize(rbd->m_linearVelocity);
+ m_angularVelocity.serialize(rbd->m_angularVelocity);
+ rbd->m_inverseMass = m_inverseMass;
+ m_angularFactor.serialize(rbd->m_angularFactor);
+ m_linearFactor.serialize(rbd->m_linearFactor);
+ m_gravity.serialize(rbd->m_gravity);
+ m_gravity_acceleration.serialize(rbd->m_gravity_acceleration);
+ m_invInertiaLocal.serialize(rbd->m_invInertiaLocal);
+ m_totalForce.serialize(rbd->m_totalForce);
+ m_totalTorque.serialize(rbd->m_totalTorque);
+ rbd->m_linearDamping = m_linearDamping;
+ rbd->m_angularDamping = m_angularDamping;
+ rbd->m_additionalDamping = m_additionalDamping;
+ rbd->m_additionalDampingFactor = m_additionalDampingFactor;
+ rbd->m_additionalLinearDampingThresholdSqr = m_additionalLinearDampingThresholdSqr;
+ rbd->m_additionalAngularDampingThresholdSqr = m_additionalAngularDampingThresholdSqr;
+ rbd->m_additionalAngularDampingFactor = m_additionalAngularDampingFactor;
+ rbd->m_linearSleepingThreshold=m_linearSleepingThreshold;
+ rbd->m_angularSleepingThreshold = m_angularSleepingThreshold;
+
+ return btRigidBodyDataName;
+}
+
+
+
+void btRigidBody::serializeSingleObject(class btSerializer* serializer) const
+{
+ btChunk* chunk = serializer->allocate(calculateSerializeBufferSize(),1);
+ const char* structType = serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk,structType,BT_RIGIDBODY_CODE,(void*)this);
+}
+
+
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h b/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h
index da1fcb78611..5a7ba97ccbc 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h
@@ -29,6 +29,20 @@ class btTypedConstraint;
extern btScalar gDeactivationTime;
extern bool gDisableDeactivation;
+#ifdef BT_USE_DOUBLE_PRECISION
+#define btRigidBodyData btRigidBodyDoubleData
+#define btRigidBodyDataName "btRigidBodyDoubleData"
+#else
+#define btRigidBodyData btRigidBodyFloatData
+#define btRigidBodyDataName "btRigidBodyFloatData"
+#endif //BT_USE_DOUBLE_PRECISION
+
+
+enum btRigidBodyFlags
+{
+ BT_DISABLE_WORLD_GRAVITY = 1
+};
+
///The btRigidBody is the main class for rigid body objects. It is derived from btCollisionObject, so it keeps a pointer to a btCollisionShape.
///It is recommended for performance and memory use to share btCollisionShape objects whenever possible.
@@ -45,7 +59,6 @@ class btRigidBody : public btCollisionObject
btVector3 m_linearVelocity;
btVector3 m_angularVelocity;
btScalar m_inverseMass;
- btVector3 m_angularFactor;
btVector3 m_linearFactor;
btVector3 m_gravity;
@@ -73,6 +86,21 @@ class btRigidBody : public btCollisionObject
//keep track of typed constraints referencing this rigid body
btAlignedObjectArray<btTypedConstraint*> m_constraintRefs;
+ int m_rigidbodyFlags;
+
+ int m_debugBodyId;
+
+
+protected:
+
+ ATTRIBUTE_ALIGNED64(btVector3 m_deltaLinearVelocity);
+ btVector3 m_deltaAngularVelocity;
+ btVector3 m_angularFactor;
+ btVector3 m_invMass;
+ btVector3 m_pushVelocity;
+ btVector3 m_turnVelocity;
+
+
public:
@@ -111,7 +139,6 @@ public:
btScalar m_additionalAngularDampingThresholdSqr;
btScalar m_additionalAngularDampingFactor;
-
btRigidBodyConstructionInfo( btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia=btVector3(0,0,0)):
m_mass(mass),
m_motionState(motionState),
@@ -161,13 +188,13 @@ public:
///but a rigidbody is derived from btCollisionObject, so we can safely perform an upcast
static const btRigidBody* upcast(const btCollisionObject* colObj)
{
- if (colObj->getInternalType()==btCollisionObject::CO_RIGID_BODY)
+ if (colObj->getInternalType()&btCollisionObject::CO_RIGID_BODY)
return (const btRigidBody*)colObj;
return 0;
}
static btRigidBody* upcast(btCollisionObject* colObj)
{
- if (colObj->getInternalType()==btCollisionObject::CO_RIGID_BODY)
+ if (colObj->getInternalType()&btCollisionObject::CO_RIGID_BODY)
return (btRigidBody*)colObj;
return 0;
}
@@ -227,6 +254,7 @@ public:
void setLinearFactor(const btVector3& linearFactor)
{
m_linearFactor = linearFactor;
+ m_invMass = m_linearFactor*m_inverseMass;
}
btScalar getInvMass() const { return m_inverseMass; }
const btMatrix3x3& getInvInertiaTensorWorld() const {
@@ -242,12 +270,12 @@ public:
m_totalForce += force*m_linearFactor;
}
- const btVector3& getTotalForce()
+ const btVector3& getTotalForce() const
{
return m_totalForce;
};
- const btVector3& getTotalTorque()
+ const btVector3& getTotalTorque() const
{
return m_totalTorque;
};
@@ -301,19 +329,6 @@ public:
}
}
- //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position
- SIMD_FORCE_INLINE void internalApplyImpulse(const btVector3& linearComponent, const btVector3& angularComponent,btScalar impulseMagnitude)
- {
- if (m_inverseMass != btScalar(0.))
- {
- m_linearVelocity += linearComponent*m_linearFactor*impulseMagnitude;
- if (m_angularFactor)
- {
- m_angularVelocity += angularComponent*m_angularFactor*impulseMagnitude;
- }
- }
- }
-
void clearForces()
{
m_totalForce.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
@@ -489,12 +504,185 @@ public:
return m_constraintRefs[index];
}
- int getNumConstraintRefs()
+ int getNumConstraintRefs() const
{
return m_constraintRefs.size();
}
- int m_debugBodyId;
+ void setFlags(int flags)
+ {
+ m_rigidbodyFlags = flags;
+ }
+
+ int getFlags() const
+ {
+ return m_rigidbodyFlags;
+ }
+
+ const btVector3& getDeltaLinearVelocity() const
+ {
+ return m_deltaLinearVelocity;
+ }
+
+ const btVector3& getDeltaAngularVelocity() const
+ {
+ return m_deltaAngularVelocity;
+ }
+
+ const btVector3& getPushVelocity() const
+ {
+ return m_pushVelocity;
+ }
+
+ const btVector3& getTurnVelocity() const
+ {
+ return m_turnVelocity;
+ }
+
+
+ ////////////////////////////////////////////////
+ ///some internal methods, don't use them
+
+ btVector3& internalGetDeltaLinearVelocity()
+ {
+ return m_deltaLinearVelocity;
+ }
+
+ btVector3& internalGetDeltaAngularVelocity()
+ {
+ return m_deltaAngularVelocity;
+ }
+
+ const btVector3& internalGetAngularFactor() const
+ {
+ return m_angularFactor;
+ }
+
+ const btVector3& internalGetInvMass() const
+ {
+ return m_invMass;
+ }
+
+ btVector3& internalGetPushVelocity()
+ {
+ return m_pushVelocity;
+ }
+
+ btVector3& internalGetTurnVelocity()
+ {
+ return m_turnVelocity;
+ }
+
+ SIMD_FORCE_INLINE void internalGetVelocityInLocalPointObsolete(const btVector3& rel_pos, btVector3& velocity ) const
+ {
+ velocity = getLinearVelocity()+m_deltaLinearVelocity + (getAngularVelocity()+m_deltaAngularVelocity).cross(rel_pos);
+ }
+
+ SIMD_FORCE_INLINE void internalGetAngularVelocity(btVector3& angVel) const
+ {
+ angVel = getAngularVelocity()+m_deltaAngularVelocity;
+ }
+
+
+ //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position
+ SIMD_FORCE_INLINE void internalApplyImpulse(const btVector3& linearComponent, const btVector3& angularComponent,const btScalar impulseMagnitude)
+ {
+ if (m_inverseMass)
+ {
+ m_deltaLinearVelocity += linearComponent*impulseMagnitude;
+ m_deltaAngularVelocity += angularComponent*(impulseMagnitude*m_angularFactor);
+ }
+ }
+
+ SIMD_FORCE_INLINE void internalApplyPushImpulse(const btVector3& linearComponent, const btVector3& angularComponent,btScalar impulseMagnitude)
+ {
+ if (m_inverseMass)
+ {
+ m_pushVelocity += linearComponent*impulseMagnitude;
+ m_turnVelocity += angularComponent*(impulseMagnitude*m_angularFactor);
+ }
+ }
+
+ void internalWritebackVelocity()
+ {
+ if (m_inverseMass)
+ {
+ setLinearVelocity(getLinearVelocity()+ m_deltaLinearVelocity);
+ setAngularVelocity(getAngularVelocity()+m_deltaAngularVelocity);
+ //m_deltaLinearVelocity.setZero();
+ //m_deltaAngularVelocity .setZero();
+ //m_originalBody->setCompanionId(-1);
+ }
+ }
+
+
+ void internalWritebackVelocity(btScalar timeStep);
+
+
+
+ ///////////////////////////////////////////////
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const;
+
+ virtual void serializeSingleObject(class btSerializer* serializer) const;
+
+};
+
+//@todo add m_optionalMotionState and m_constraintRefs to btRigidBodyData
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btRigidBodyFloatData
+{
+ btCollisionObjectFloatData m_collisionObjectData;
+ btMatrix3x3FloatData m_invInertiaTensorWorld;
+ btVector3FloatData m_linearVelocity;
+ btVector3FloatData m_angularVelocity;
+ btVector3FloatData m_angularFactor;
+ btVector3FloatData m_linearFactor;
+ btVector3FloatData m_gravity;
+ btVector3FloatData m_gravity_acceleration;
+ btVector3FloatData m_invInertiaLocal;
+ btVector3FloatData m_totalForce;
+ btVector3FloatData m_totalTorque;
+ float m_inverseMass;
+ float m_linearDamping;
+ float m_angularDamping;
+ float m_additionalDampingFactor;
+ float m_additionalLinearDampingThresholdSqr;
+ float m_additionalAngularDampingThresholdSqr;
+ float m_additionalAngularDampingFactor;
+ float m_linearSleepingThreshold;
+ float m_angularSleepingThreshold;
+ int m_additionalDamping;
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btRigidBodyDoubleData
+{
+ btCollisionObjectDoubleData m_collisionObjectData;
+ btMatrix3x3DoubleData m_invInertiaTensorWorld;
+ btVector3DoubleData m_linearVelocity;
+ btVector3DoubleData m_angularVelocity;
+ btVector3DoubleData m_angularFactor;
+ btVector3DoubleData m_linearFactor;
+ btVector3DoubleData m_gravity;
+ btVector3DoubleData m_gravity_acceleration;
+ btVector3DoubleData m_invInertiaLocal;
+ btVector3DoubleData m_totalForce;
+ btVector3DoubleData m_totalTorque;
+ double m_inverseMass;
+ double m_linearDamping;
+ double m_angularDamping;
+ double m_additionalDampingFactor;
+ double m_additionalLinearDampingThresholdSqr;
+ double m_additionalAngularDampingThresholdSqr;
+ double m_additionalAngularDampingFactor;
+ double m_linearSleepingThreshold;
+ double m_angularSleepingThreshold;
+ int m_additionalDamping;
+ char m_padding[4];
};
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
index 3f6141463c3..5fc2f3cf8f7 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
@@ -78,7 +78,7 @@ int btSimpleDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, b
btContactSolverInfo infoGlobal;
infoGlobal.m_timeStep = timeStep;
m_constraintSolver->prepareSolve(0,numManifolds);
- m_constraintSolver->solveGroup(0,0,manifoldPtr, numManifolds,0,0,infoGlobal,m_debugDrawer, m_stackAlloc,m_dispatcher1);
+ m_constraintSolver->solveGroup(&getCollisionObjectArray()[0],getNumCollisionObjects(),manifoldPtr, numManifolds,0,0,infoGlobal,m_debugDrawer, m_stackAlloc,m_dispatcher1);
m_constraintSolver->allSolved(infoGlobal,m_debugDrawer, m_stackAlloc);
}
@@ -132,9 +132,19 @@ btVector3 btSimpleDynamicsWorld::getGravity () const
void btSimpleDynamicsWorld::removeRigidBody(btRigidBody* body)
{
- removeCollisionObject(body);
+ btCollisionWorld::removeCollisionObject(body);
}
+void btSimpleDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
+{
+ btRigidBody* body = btRigidBody::upcast(collisionObject);
+ if (body)
+ removeRigidBody(body);
+ else
+ btCollisionWorld::removeCollisionObject(collisionObject);
+}
+
+
void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body)
{
body->setGravity(m_gravity);
@@ -145,6 +155,33 @@ void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body)
}
}
+void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body, short group, short mask)
+{
+ body->setGravity(m_gravity);
+
+ if (body->getCollisionShape())
+ {
+ addCollisionObject(body,group,mask);
+ }
+}
+
+
+void btSimpleDynamicsWorld::debugDrawWorld()
+{
+
+}
+
+void btSimpleDynamicsWorld::addAction(btActionInterface* action)
+{
+
+}
+
+void btSimpleDynamicsWorld::removeAction(btActionInterface* action)
+{
+
+}
+
+
void btSimpleDynamicsWorld::updateAabbs()
{
btTransform predictedTrans;
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h b/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
index ea1a2a1ccc7..07a727e2efe 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
@@ -56,7 +56,18 @@ public:
virtual void addRigidBody(btRigidBody* body);
+ virtual void addRigidBody(btRigidBody* body, short group, short mask);
+
virtual void removeRigidBody(btRigidBody* body);
+
+ virtual void debugDrawWorld();
+
+ virtual void addAction(btActionInterface* action);
+
+ virtual void removeAction(btActionInterface* action);
+
+ ///removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise call btCollisionWorld::removeCollisionObject
+ virtual void removeCollisionObject(btCollisionObject* collisionObject);
virtual void updateAabbs();
diff --git a/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp b/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp
index 031fcb5b447..5b467883d84 100644
--- a/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp
+++ b/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp
@@ -22,7 +22,15 @@
#include "LinearMath/btIDebugDraw.h"
#include "BulletDynamics/ConstraintSolver/btContactConstraint.h"
-static btRigidBody s_fixedObject( 0,0,0);
+#define ROLLING_INFLUENCE_FIX
+
+
+btRigidBody& btActionInterface::getFixedBody()
+{
+ static btRigidBody s_fixed(0, 0,0);
+ s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
+ return s_fixed;
+}
btRaycastVehicle::btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis, btVehicleRaycaster* raycaster )
:m_vehicleRaycaster(raycaster),
@@ -70,6 +78,7 @@ btWheelInfo& btRaycastVehicle::addWheel( const btVector3& connectionPointCS, con
ci.m_frictionSlip = tuning.m_frictionSlip;
ci.m_bIsFrontWheel = isFrontWheel;
ci.m_maxSuspensionTravelCm = tuning.m_maxSuspensionTravelCm;
+ ci.m_maxSuspensionForce = tuning.m_maxSuspensionForce;
m_wheelInfo.push_back( btWheelInfo(ci));
@@ -186,7 +195,7 @@ btScalar btRaycastVehicle::rayCast(btWheelInfo& wheel)
wheel.m_raycastInfo.m_contactNormalWS = rayResults.m_hitNormalInWorld;
wheel.m_raycastInfo.m_isInContact = true;
- wheel.m_raycastInfo.m_groundObject = &s_fixedObject;///@todo for driving on dynamic/movable objects!;
+ wheel.m_raycastInfo.m_groundObject = &getFixedBody();///@todo for driving on dynamic/movable objects!;
//wheel.m_raycastInfo.m_groundObject = object;
@@ -301,10 +310,9 @@ void btRaycastVehicle::updateVehicle( btScalar step )
btScalar suspensionForce = wheel.m_wheelsSuspensionForce;
- btScalar gMaxSuspensionForce = btScalar(6000.);
- if (suspensionForce > gMaxSuspensionForce)
+ if (suspensionForce > wheel.m_maxSuspensionForce)
{
- suspensionForce = gMaxSuspensionForce;
+ suspensionForce = wheel.m_maxSuspensionForce;
}
btVector3 impulse = wheel.m_raycastInfo.m_contactNormalWS * suspensionForce * step;
btVector3 relpos = wheel.m_raycastInfo.m_contactPointWS - getRigidBody()->getCenterOfMassPosition();
@@ -689,7 +697,12 @@ void btRaycastVehicle::updateFriction(btScalar timeStep)
btVector3 sideImp = m_axle[wheel] * m_sideImpulse[wheel];
+#if defined ROLLING_INFLUENCE_FIX // fix. It only worked if car's up was along Y - VT.
+ btVector3 vChassisWorldUp = getRigidBody()->getCenterOfMassTransform().getBasis().getColumn(m_indexUpAxis);
+ rel_pos -= vChassisWorldUp * (vChassisWorldUp.dot(rel_pos) * (1.f-wheelInfo.m_rollInfluence));
+#else
rel_pos[m_indexUpAxis] *= wheelInfo.m_rollInfluence;
+#endif
m_chassisBody->applyImpulse(sideImp,rel_pos);
//apply friction impulse on the ground
@@ -708,13 +721,13 @@ void btRaycastVehicle::debugDraw(btIDebugDraw* debugDrawer)
for (int v=0;v<this->getNumWheels();v++)
{
- btVector3 wheelColor(0,255,255);
+ btVector3 wheelColor(0,1,1);
if (getWheelInfo(v).m_raycastInfo.m_isInContact)
{
- wheelColor.setValue(0,0,255);
+ wheelColor.setValue(0,0,1);
} else
{
- wheelColor.setValue(255,0,255);
+ wheelColor.setValue(1,0,1);
}
btVector3 wheelPosWS = getWheelInfo(v).m_worldTransform.getOrigin();
diff --git a/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h b/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h
index d5a299c606f..ac42f1313be 100644
--- a/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h
+++ b/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h
@@ -29,12 +29,11 @@ class btRaycastVehicle : public btActionInterface
btAlignedObjectArray<btVector3> m_axle;
btAlignedObjectArray<btScalar> m_forwardImpulse;
btAlignedObjectArray<btScalar> m_sideImpulse;
-
+
+ ///backwards compatibility
int m_userConstraintType;
-
int m_userConstraintId;
-
public:
class btVehicleTuning
{
@@ -45,7 +44,8 @@ public:
m_suspensionCompression(btScalar(0.83)),
m_suspensionDamping(btScalar(0.88)),
m_maxSuspensionTravelCm(btScalar(500.)),
- m_frictionSlip(btScalar(10.5))
+ m_frictionSlip(btScalar(10.5)),
+ m_maxSuspensionForce(btScalar(6000.))
{
}
btScalar m_suspensionStiffness;
@@ -53,6 +53,7 @@ public:
btScalar m_suspensionDamping;
btScalar m_maxSuspensionTravelCm;
btScalar m_frictionSlip;
+ btScalar m_maxSuspensionForce;
};
private:
@@ -83,6 +84,7 @@ public:
///btActionInterface interface
virtual void updateAction( btCollisionWorld* collisionWorld, btScalar step)
{
+ (void) collisionWorld;
updateVehicle(step);
}
@@ -110,7 +112,7 @@ public:
void updateWheelTransform( int wheelIndex, bool interpolatedTransform = true );
- void setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth);
+// void setRaycastWheelInfo( int wheelIndex , bool isInContact, const btVector3& hitPoint, const btVector3& hitNormal,btScalar depth);
btWheelInfo& addWheel( const btVector3& connectionPointCS0, const btVector3& wheelDirectionCS0,const btVector3& wheelAxleCS,btScalar suspensionRestLength,btScalar wheelRadius,const btVehicleTuning& tuning, bool isFrontWheel);
@@ -192,6 +194,8 @@ public:
m_indexForwardAxis = forwardIndex;
}
+
+ ///backwards compatibility
int getUserConstraintType() const
{
return m_userConstraintType ;
@@ -212,7 +216,6 @@ public:
return m_userConstraintId;
}
-
};
class btDefaultVehicleRaycaster : public btVehicleRaycaster
diff --git a/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h b/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h
index ac2729f4fd7..b74f8c80acb 100644
--- a/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h
+++ b/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h
@@ -29,6 +29,7 @@ struct btWheelInfoConstructionInfo
btScalar m_wheelsDampingCompression;
btScalar m_wheelsDampingRelaxation;
btScalar m_frictionSlip;
+ btScalar m_maxSuspensionForce;
bool m_bIsFrontWheel;
};
@@ -68,6 +69,7 @@ struct btWheelInfo
btScalar m_rotation;
btScalar m_deltaRotation;
btScalar m_rollInfluence;
+ btScalar m_maxSuspensionForce;
btScalar m_engineForce;
@@ -99,6 +101,7 @@ struct btWheelInfo
m_brake = btScalar(0.);
m_rollInfluence = btScalar(0.1);
m_bIsFrontWheel = ci.m_bIsFrontWheel;
+ m_maxSuspensionForce = ci.m_maxSuspensionForce;
}
diff --git a/extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.cpp b/extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.cpp
new file mode 100644
index 00000000000..c876ebf1fd6
--- /dev/null
+++ b/extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.cpp
@@ -0,0 +1,151 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h"
+#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
+#include "BulletCollision/CollisionShapes/btCollisionShape.h"
+
+#include "btDefaultSoftBodySolver.h"
+#include "BulletCollision/CollisionShapes/btCapsuleShape.h"
+#include "BulletSoftBody/btSoftBody.h"
+
+
+btDefaultSoftBodySolver::btDefaultSoftBodySolver()
+{
+ // Initial we will clearly need to update solver constants
+ // For now this is global for the cloths linked with this solver - we should probably make this body specific
+ // for performance in future once we understand more clearly when constants need to be updated
+ m_updateSolverConstants = true;
+}
+
+btDefaultSoftBodySolver::~btDefaultSoftBodySolver()
+{
+}
+
+// In this case the data is already in the soft bodies so there is no need for us to do anything
+void btDefaultSoftBodySolver::copyBackToSoftBodies()
+{
+
+}
+
+void btDefaultSoftBodySolver::optimize( btAlignedObjectArray< btSoftBody * > &softBodies , bool forceUpdate)
+{
+ m_softBodySet.copyFromArray( softBodies );
+}
+
+void btDefaultSoftBodySolver::updateSoftBodies( )
+{
+ for ( int i=0; i < m_softBodySet.size(); i++)
+ {
+ btSoftBody* psb=(btSoftBody*)m_softBodySet[i];
+ if (psb->isActive())
+ {
+ psb->integrateMotion();
+ }
+ }
+} // updateSoftBodies
+
+bool btDefaultSoftBodySolver::checkInitialized()
+{
+ return true;
+}
+
+void btDefaultSoftBodySolver::solveConstraints( float solverdt )
+{
+ // Solve constraints for non-solver softbodies
+ for(int i=0; i < m_softBodySet.size(); ++i)
+ {
+ btSoftBody* psb = static_cast<btSoftBody*>(m_softBodySet[i]);
+ if (psb->isActive())
+ {
+ psb->solveConstraints();
+ }
+ }
+} // btDefaultSoftBodySolver::solveConstraints
+
+
+void btDefaultSoftBodySolver::copySoftBodyToVertexBuffer( const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer )
+{
+ // Currently only support CPU output buffers
+ // TODO: check for DX11 buffers. Take all offsets into the same DX11 buffer
+ // and use them together on a single kernel call if possible by setting up a
+ // per-cloth target buffer array for the copy kernel.
+
+ if( vertexBuffer->getBufferType() == btVertexBufferDescriptor::CPU_BUFFER )
+ {
+ const btAlignedObjectArray<btSoftBody::Node> &clothVertices( softBody->m_nodes );
+ int numVertices = clothVertices.size();
+
+ const btCPUVertexBufferDescriptor *cpuVertexBuffer = static_cast< btCPUVertexBufferDescriptor* >(vertexBuffer);
+ float *basePointer = cpuVertexBuffer->getBasePointer();
+
+ if( vertexBuffer->hasVertexPositions() )
+ {
+ const int vertexOffset = cpuVertexBuffer->getVertexOffset();
+ const int vertexStride = cpuVertexBuffer->getVertexStride();
+ float *vertexPointer = basePointer + vertexOffset;
+
+ for( int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex )
+ {
+ btVector3 position = clothVertices[vertexIndex].m_x;
+ *(vertexPointer + 0) = position.getX();
+ *(vertexPointer + 1) = position.getY();
+ *(vertexPointer + 2) = position.getZ();
+ vertexPointer += vertexStride;
+ }
+ }
+ if( vertexBuffer->hasNormals() )
+ {
+ const int normalOffset = cpuVertexBuffer->getNormalOffset();
+ const int normalStride = cpuVertexBuffer->getNormalStride();
+ float *normalPointer = basePointer + normalOffset;
+
+ for( int vertexIndex = 0; vertexIndex < numVertices; ++vertexIndex )
+ {
+ btVector3 normal = clothVertices[vertexIndex].m_n;
+ *(normalPointer + 0) = normal.getX();
+ *(normalPointer + 1) = normal.getY();
+ *(normalPointer + 2) = normal.getZ();
+ normalPointer += normalStride;
+ }
+ }
+ }
+} // btDefaultSoftBodySolver::copySoftBodyToVertexBuffer
+
+void btDefaultSoftBodySolver::processCollision( btSoftBody* softBody, btSoftBody* otherSoftBody)
+{
+ softBody->defaultCollisionHandler( otherSoftBody);
+}
+
+// For the default solver just leave the soft body to do its collision processing
+void btDefaultSoftBodySolver::processCollision( btSoftBody *softBody, btCollisionObject* collisionObject )
+{
+ softBody->defaultCollisionHandler( collisionObject );
+} // btDefaultSoftBodySolver::processCollision
+
+
+void btDefaultSoftBodySolver::predictMotion( float timeStep )
+{
+ for ( int i=0; i < m_softBodySet.size(); ++i)
+ {
+ btSoftBody* psb = m_softBodySet[i];
+
+ if (psb->isActive())
+ {
+ psb->predictMotion(timeStep);
+ }
+ }
+}
+
diff --git a/extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.h b/extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.h
new file mode 100644
index 00000000000..8e7db3daf98
--- /dev/null
+++ b/extern/bullet2/src/BulletSoftBody/btDefaultSoftBodySolver.h
@@ -0,0 +1,63 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef BT_SOFT_BODY_DEFAULT_SOLVER_H
+#define BT_SOFT_BODY_DEFAULT_SOLVER_H
+
+
+#include "BulletSoftBody/btSoftBodySolvers.h"
+#include "btSoftBodySolverVertexBuffer.h"
+
+
+class btDefaultSoftBodySolver : public btSoftBodySolver
+{
+protected:
+ /** Variable to define whether we need to update solver constants on the next iteration */
+ bool m_updateSolverConstants;
+
+ btAlignedObjectArray< btSoftBody * > m_softBodySet;
+
+
+public:
+ btDefaultSoftBodySolver();
+
+ virtual ~btDefaultSoftBodySolver();
+
+ virtual SolverTypes getSolverType() const
+ {
+ return DEFAULT_SOLVER;
+ }
+
+ virtual bool checkInitialized();
+
+ virtual void updateSoftBodies( );
+
+ virtual void optimize( btAlignedObjectArray< btSoftBody * > &softBodies,bool forceUpdate=false );
+
+ virtual void copyBackToSoftBodies();
+
+ virtual void solveConstraints( float solverdt );
+
+ virtual void predictMotion( float solverdt );
+
+ virtual void copySoftBodyToVertexBuffer( const btSoftBody *const softBody, btVertexBufferDescriptor *vertexBuffer );
+
+ virtual void processCollision( btSoftBody *, btCollisionObject* );
+
+ virtual void processCollision( btSoftBody*, btSoftBody* );
+
+};
+
+#endif // #ifndef BT_ACCELERATED_SOFT_BODY_CPU_SOLVER_H
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp b/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
index ee810c54082..a90acb99f04 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBody.cpp
@@ -15,12 +15,51 @@ subject to the following restrictions:
///btSoftBody implementation by Nathanael Presson
#include "btSoftBodyInternals.h"
+#include "BulletSoftBody/btSoftBodySolvers.h"
+#include "btSoftBodyData.h"
+#include "LinearMath/btSerializer.h"
//
btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo,int node_count, const btVector3* x, const btScalar* m)
-:m_worldInfo(worldInfo)
+:m_worldInfo(worldInfo),m_softBodySolver(0)
{
/* Init */
+ initDefaults();
+
+ /* Default material */
+ Material* pm=appendMaterial();
+ pm->m_kLST = 1;
+ pm->m_kAST = 1;
+ pm->m_kVST = 1;
+ pm->m_flags = fMaterial::Default;
+
+ /* Nodes */
+ const btScalar margin=getCollisionShape()->getMargin();
+ m_nodes.resize(node_count);
+ for(int i=0,ni=node_count;i<ni;++i)
+ {
+ Node& n=m_nodes[i];
+ ZeroInitialize(n);
+ n.m_x = x?*x++:btVector3(0,0,0);
+ n.m_q = n.m_x;
+ n.m_im = m?*m++:1;
+ n.m_im = n.m_im>0?1/n.m_im:0;
+ n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x,margin),&n);
+ n.m_material= pm;
+ }
+ updateBounds();
+
+}
+
+btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo)
+:m_worldInfo(worldInfo)
+{
+ initDefaults();
+}
+
+
+void btSoftBody::initDefaults()
+{
m_internalType = CO_SOFT_BODY;
m_cfg.aeromodel = eAeroModel::V_Point;
m_cfg.kVCF = 1;
@@ -61,33 +100,16 @@ btSoftBody::btSoftBody(btSoftBodyWorldInfo* worldInfo,int node_count, const btV
m_bounds[1] = btVector3(0,0,0);
m_worldTransform.setIdentity();
setSolver(eSolverPresets::Positions);
- /* Default material */
- Material* pm=appendMaterial();
- pm->m_kLST = 1;
- pm->m_kAST = 1;
- pm->m_kVST = 1;
- pm->m_flags = fMaterial::Default;
+
/* Collision shape */
///for now, create a collision shape internally
m_collisionShape = new btSoftBodyCollisionShape(this);
m_collisionShape->setMargin(0.25);
- /* Nodes */
- const btScalar margin=getCollisionShape()->getMargin();
- m_nodes.resize(node_count);
- for(int i=0,ni=node_count;i<ni;++i)
- {
- Node& n=m_nodes[i];
- ZeroInitialize(n);
- n.m_x = x?*x++:btVector3(0,0,0);
- n.m_q = n.m_x;
- n.m_im = m?*m++:1;
- n.m_im = n.m_im>0?1/n.m_im:0;
- n.m_leaf = m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x,margin),&n);
- n.m_material= pm;
- }
- updateBounds();
-
+
m_initialWorldTransform.setIdentity();
+
+ m_windVelocity = btVector3(0,0,0);
+
}
//
@@ -306,8 +328,44 @@ void btSoftBody::appendFace(int node0,int node1,int node2,Material* mat)
}
//
+void btSoftBody::appendTetra(int model,Material* mat)
+{
+Tetra t;
+if(model>=0)
+ t=m_tetras[model];
+ else
+ { ZeroInitialize(t);t.m_material=mat?mat:m_materials[0]; }
+m_tetras.push_back(t);
+}
+
+//
+void btSoftBody::appendTetra(int node0,
+ int node1,
+ int node2,
+ int node3,
+ Material* mat)
+{
+ appendTetra(-1,mat);
+ Tetra& t=m_tetras[m_tetras.size()-1];
+ t.m_n[0] = &m_nodes[node0];
+ t.m_n[1] = &m_nodes[node1];
+ t.m_n[2] = &m_nodes[node2];
+ t.m_n[3] = &m_nodes[node3];
+ t.m_rv = VolumeOf(t.m_n[0]->m_x,t.m_n[1]->m_x,t.m_n[2]->m_x,t.m_n[3]->m_x);
+ m_bUpdateRtCst=true;
+}
+
+//
+
void btSoftBody::appendAnchor(int node,btRigidBody* body, bool disableCollisionBetweenLinkedBodies)
{
+ btVector3 local = body->getWorldTransform().inverse()*m_nodes[node].m_x;
+ appendAnchor(node,body,local,disableCollisionBetweenLinkedBodies);
+}
+
+//
+void btSoftBody::appendAnchor(int node,btRigidBody* body, const btVector3& localPivot,bool disableCollisionBetweenLinkedBodies)
+{
if (disableCollisionBetweenLinkedBodies)
{
if (m_collisionDisabledObjects.findLinearSearch(body)==m_collisionDisabledObjects.size())
@@ -319,7 +377,7 @@ void btSoftBody::appendAnchor(int node,btRigidBody* body, bool disableCollisio
Anchor a;
a.m_node = &m_nodes[node];
a.m_body = body;
- a.m_local = body->getInterpolationWorldTransform().inverse()*a.m_node->m_x;
+ a.m_local = localPivot;
a.m_node->m_battach = 1;
m_anchors.push_back(a);
}
@@ -491,6 +549,51 @@ void btSoftBody::setTotalDensity(btScalar density)
}
//
+void btSoftBody::setVolumeMass(btScalar mass)
+{
+btAlignedObjectArray<btScalar> ranks;
+ranks.resize(m_nodes.size(),0);
+int i;
+
+for(i=0;i<m_nodes.size();++i)
+ {
+ m_nodes[i].m_im=0;
+ }
+for(i=0;i<m_tetras.size();++i)
+ {
+ const Tetra& t=m_tetras[i];
+ for(int j=0;j<4;++j)
+ {
+ t.m_n[j]->m_im+=btFabs(t.m_rv);
+ ranks[int(t.m_n[j]-&m_nodes[0])]+=1;
+ }
+ }
+for( i=0;i<m_nodes.size();++i)
+ {
+ if(m_nodes[i].m_im>0)
+ {
+ m_nodes[i].m_im=ranks[i]/m_nodes[i].m_im;
+ }
+ }
+setTotalMass(mass,false);
+}
+
+//
+void btSoftBody::setVolumeDensity(btScalar density)
+{
+btScalar volume=0;
+for(int i=0;i<m_tetras.size();++i)
+ {
+ const Tetra& t=m_tetras[i];
+ for(int j=0;j<4;++j)
+ {
+ volume+=btFabs(t.m_rv);
+ }
+ }
+setVolumeMass(volume*density/6);
+}
+
+//
void btSoftBody::transform(const btTransform& trs)
{
const btScalar margin=getCollisionShape()->getMargin();
@@ -533,6 +636,7 @@ void btSoftBody::rotate( const btQuaternion& rot)
//
void btSoftBody::scale(const btVector3& scl)
{
+
const btScalar margin=getCollisionShape()->getMargin();
ATTRIBUTE_ALIGNED16(btDbvtVolume) vol;
@@ -611,7 +715,7 @@ btScalar btSoftBody::getVolume() const
for(i=0,ni=m_faces.size();i<ni;++i)
{
const Face& f=m_faces[i];
- vol+=dot(f.m_n[0]->m_x-org,cross(f.m_n[1]->m_x-org,f.m_n[2]->m_x-org));
+ vol+=btDot(f.m_n[0]->m_x-org,btCross(f.m_n[1]->m_x-org,f.m_n[2]->m_x-org));
}
vol/=(btScalar)6;
}
@@ -644,14 +748,14 @@ btVector3 btSoftBody::clusterCom(int cluster) const
//
btVector3 btSoftBody::clusterVelocity(const Cluster* cluster,const btVector3& rpos)
{
- return(cluster->m_lv+cross(cluster->m_av,rpos));
+ return(cluster->m_lv+btCross(cluster->m_av,rpos));
}
//
void btSoftBody::clusterVImpulse(Cluster* cluster,const btVector3& rpos,const btVector3& impulse)
{
const btVector3 li=cluster->m_imass*impulse;
- const btVector3 ai=cluster->m_invwi*cross(rpos,impulse);
+ const btVector3 ai=cluster->m_invwi*btCross(rpos,impulse);
cluster->m_vimpulses[0]+=li;cluster->m_lv+=li;
cluster->m_vimpulses[1]+=ai;cluster->m_av+=ai;
cluster->m_nvimpulses++;
@@ -661,7 +765,7 @@ void btSoftBody::clusterVImpulse(Cluster* cluster,const btVector3& rpos,const
void btSoftBody::clusterDImpulse(Cluster* cluster,const btVector3& rpos,const btVector3& impulse)
{
const btVector3 li=cluster->m_imass*impulse;
- const btVector3 ai=cluster->m_invwi*cross(rpos,impulse);
+ const btVector3 ai=cluster->m_invwi*btCross(rpos,impulse);
cluster->m_dimpulses[0]+=li;
cluster->m_dimpulses[1]+=ai;
cluster->m_ndimpulses++;
@@ -704,6 +808,13 @@ void btSoftBody::clusterDCImpulse(Cluster* cluster,const btVector3& impulse)
cluster->m_ndimpulses++;
}
+struct NodeLinks
+{
+ btAlignedObjectArray<int> m_links;
+};
+
+
+
//
int btSoftBody::generateBendingConstraints(int distance,Material* mat)
{
@@ -715,14 +826,21 @@ int btSoftBody::generateBendingConstraints(int distance,Material* mat)
const int n=m_nodes.size();
const unsigned inf=(~(unsigned)0)>>1;
unsigned* adj=new unsigned[n*n];
+
+
#define IDX(_x_,_y_) ((_y_)*n+(_x_))
for(j=0;j<n;++j)
{
for(i=0;i<n;++i)
{
- if(i!=j) adj[IDX(i,j)]=adj[IDX(j,i)]=inf;
+ if(i!=j)
+ {
+ adj[IDX(i,j)]=adj[IDX(j,i)]=inf;
+ }
else
+ {
adj[IDX(i,j)]=adj[IDX(j,i)]=0;
+ }
}
}
for( i=0;i<m_links.size();++i)
@@ -732,20 +850,71 @@ int btSoftBody::generateBendingConstraints(int distance,Material* mat)
adj[IDX(ia,ib)]=1;
adj[IDX(ib,ia)]=1;
}
- for(int k=0;k<n;++k)
+
+
+ //special optimized case for distance == 2
+ if (distance == 2)
+ {
+
+ btAlignedObjectArray<NodeLinks> nodeLinks;
+
+
+ /* Build node links */
+ nodeLinks.resize(m_nodes.size());
+
+ for( i=0;i<m_links.size();++i)
+ {
+ const int ia=(int)(m_links[i].m_n[0]-&m_nodes[0]);
+ const int ib=(int)(m_links[i].m_n[1]-&m_nodes[0]);
+ if (nodeLinks[ia].m_links.findLinearSearch(ib)==nodeLinks[ia].m_links.size())
+ nodeLinks[ia].m_links.push_back(ib);
+
+ if (nodeLinks[ib].m_links.findLinearSearch(ia)==nodeLinks[ib].m_links.size())
+ nodeLinks[ib].m_links.push_back(ia);
+ }
+ for (int ii=0;ii<nodeLinks.size();ii++)
+ {
+ int i=ii;
+
+ for (int jj=0;jj<nodeLinks[ii].m_links.size();jj++)
+ {
+ int k = nodeLinks[ii].m_links[jj];
+ for (int kk=0;kk<nodeLinks[k].m_links.size();kk++)
+ {
+ int j = nodeLinks[k].m_links[kk];
+ if (i!=j)
+ {
+ const unsigned sum=adj[IDX(i,k)]+adj[IDX(k,j)];
+ btAssert(sum==2);
+ if(adj[IDX(i,j)]>sum)
+ {
+ adj[IDX(i,j)]=adj[IDX(j,i)]=sum;
+ }
+ }
+
+ }
+ }
+ }
+ } else
{
- for(j=0;j<n;++j)
+ ///generic Floyd's algorithm
+ for(int k=0;k<n;++k)
{
- for(i=j+1;i<n;++i)
+ for(j=0;j<n;++j)
{
- const unsigned sum=adj[IDX(i,k)]+adj[IDX(k,j)];
- if(adj[IDX(i,j)]>sum)
+ for(i=j+1;i<n;++i)
{
- adj[IDX(i,j)]=adj[IDX(j,i)]=sum;
+ const unsigned sum=adj[IDX(i,k)]+adj[IDX(k,j)];
+ if(adj[IDX(i,j)]>sum)
+ {
+ adj[IDX(i,j)]=adj[IDX(j,i)]=sum;
+ }
}
}
}
}
+
+
/* Build links */
int nlinks=0;
for(j=0;j<n;++j)
@@ -917,10 +1086,50 @@ int btSoftBody::generateClusters(int k,int maxiterations)
releaseCluster(i--);
}
}
+ } else
+ {
+ //create a cluster for each tetrahedron (if tetrahedra exist) or each face
+ if (m_tetras.size())
+ {
+ m_clusters.resize(m_tetras.size());
+ for(i=0;i<m_clusters.size();++i)
+ {
+ m_clusters[i] = new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
+ m_clusters[i]->m_collide= true;
+ }
+ for (i=0;i<m_tetras.size();i++)
+ {
+ for (int j=0;j<4;j++)
+ {
+ m_clusters[i]->m_nodes.push_back(m_tetras[i].m_n[j]);
+ }
+ }
+
+ } else
+ {
+ m_clusters.resize(m_faces.size());
+ for(i=0;i<m_clusters.size();++i)
+ {
+ m_clusters[i] = new(btAlignedAlloc(sizeof(Cluster),16)) Cluster();
+ m_clusters[i]->m_collide= true;
+ }
+
+ for(i=0;i<m_faces.size();++i)
+ {
+ for(int j=0;j<3;++j)
+ {
+ m_clusters[i]->m_nodes.push_back(m_faces[i].m_n[j]);
+ }
+ }
+ }
+ }
+ if (m_clusters.size())
+ {
initializeClusters();
updateClusters();
+
//for self-collision
m_clusterConnectivity.resize(m_clusters.size()*m_clusters.size());
{
@@ -948,10 +1157,9 @@ int btSoftBody::generateClusters(int k,int maxiterations)
}
}
}
-
- return(m_clusters.size());
}
- return(0);
+
+ return(m_clusters.size());
}
//
@@ -1311,6 +1519,7 @@ void btSoftBody::setSolver(eSolverPresets::_ preset)
//
void btSoftBody::predictMotion(btScalar dt)
{
+
int i,ni;
/* Update */
@@ -1402,6 +1611,7 @@ void btSoftBody::predictMotion(btScalar dt)
//
void btSoftBody::solveConstraints()
{
+
/* Apply clusters */
applyClusters(false);
/* Prepare links */
@@ -1585,19 +1795,19 @@ btScalar btSoftBody::RayFromToCaster::rayFromToTriangle( const btVector3& rayF
static const btScalar ceps=-SIMD_EPSILON*10;
static const btScalar teps=SIMD_EPSILON*10;
- const btVector3 n=cross(b-a,c-a);
- const btScalar d=dot(a,n);
- const btScalar den=dot(rayNormalizedDirection,n);
+ const btVector3 n=btCross(b-a,c-a);
+ const btScalar d=btDot(a,n);
+ const btScalar den=btDot(rayNormalizedDirection,n);
if(!btFuzzyZero(den))
{
- const btScalar num=dot(rayFrom,n)-d;
+ const btScalar num=btDot(rayFrom,n)-d;
const btScalar t=-num/den;
if((t>teps)&&(t<maxt))
{
const btVector3 hit=rayFrom+rayNormalizedDirection*t;
- if( (dot(n,cross(a-hit,b-hit))>ceps) &&
- (dot(n,cross(b-hit,c-hit))>ceps) &&
- (dot(n,cross(c-hit,a-hit))>ceps))
+ if( (btDot(n,btCross(a-hit,b-hit))>ceps) &&
+ (btDot(n,btCross(b-hit,c-hit))>ceps) &&
+ (btDot(n,btCross(c-hit,a-hit))>ceps))
{
return(t);
}
@@ -1771,20 +1981,21 @@ bool btSoftBody::checkContact( btCollisionObject* colObj,
btScalar margin,
btSoftBody::sCti& cti) const
{
- btVector3 nrm;
- btCollisionShape* shp=colObj->getCollisionShape();
- btRigidBody* tmpRigid = btRigidBody::upcast(colObj);
- const btTransform& wtr=tmpRigid? tmpRigid->getInterpolationWorldTransform() : colObj->getWorldTransform();
- btScalar dst=m_worldInfo->m_sparsesdf.Evaluate( wtr.invXform(x),
- shp,
- nrm,
- margin);
+ btVector3 nrm;
+ btCollisionShape *shp = colObj->getCollisionShape();
+ btRigidBody *tmpRigid = btRigidBody::upcast(colObj);
+ const btTransform &wtr = tmpRigid ? tmpRigid->getWorldTransform() : colObj->getWorldTransform();
+ btScalar dst =
+ m_worldInfo->m_sparsesdf.Evaluate(
+ wtr.invXform(x),
+ shp,
+ nrm,
+ margin);
if(dst<0)
{
- cti.m_colObj = colObj;
- cti.m_normal = wtr.getBasis()*nrm;
- cti.m_offset = -dot( cti.m_normal,
- x-cti.m_normal*dst);
+ cti.m_colObj = colObj;
+ cti.m_normal = wtr.getBasis()*nrm;
+ cti.m_offset = -btDot( cti.m_normal, x - cti.m_normal * dst );
return(true);
}
return(false);
@@ -1793,6 +2004,7 @@ bool btSoftBody::checkContact( btCollisionObject* colObj,
//
void btSoftBody::updateNormals()
{
+
const btVector3 zv(0,0,0);
int i,ni;
@@ -1803,7 +2015,7 @@ void btSoftBody::updateNormals()
for(i=0,ni=m_faces.size();i<ni;++i)
{
btSoftBody::Face& f=m_faces[i];
- const btVector3 n=cross(f.m_n[1]->m_x-f.m_n[0]->m_x,
+ const btVector3 n=btCross(f.m_n[1]->m_x-f.m_n[0]->m_x,
f.m_n[2]->m_x-f.m_n[0]->m_x);
f.m_normal=n.normalized();
f.m_n[0]->m_n+=n;
@@ -1821,29 +2033,42 @@ void btSoftBody::updateNormals()
//
void btSoftBody::updateBounds()
{
- if(m_ndbvt.m_root)
- {
- const btVector3& mins=m_ndbvt.m_root->volume.Mins();
- const btVector3& maxs=m_ndbvt.m_root->volume.Maxs();
- const btScalar csm=getCollisionShape()->getMargin();
- const btVector3 mrg=btVector3( csm,
- csm,
- csm)*1; // ??? to investigate...
- m_bounds[0]=mins-mrg;
- m_bounds[1]=maxs+mrg;
- if(0!=getBroadphaseHandle())
- {
- m_worldInfo->m_broadphase->setAabb( getBroadphaseHandle(),
- m_bounds[0],
- m_bounds[1],
- m_worldInfo->m_dispatcher);
+ /*if( m_acceleratedSoftBody )
+ {
+ // If we have an accelerated softbody we need to obtain the bounds correctly
+ // For now (slightly hackily) just have a very large AABB
+ // TODO: Write get bounds kernel
+ // If that is updating in place, atomic collisions might be low (when the cloth isn't perfectly aligned to an axis) and we could
+ // probably do a test and exchange reasonably efficiently.
+
+ m_bounds[0] = btVector3(-1000, -1000, -1000);
+ m_bounds[1] = btVector3(1000, 1000, 1000);
+
+ } else {*/
+ if(m_ndbvt.m_root)
+ {
+ const btVector3& mins=m_ndbvt.m_root->volume.Mins();
+ const btVector3& maxs=m_ndbvt.m_root->volume.Maxs();
+ const btScalar csm=getCollisionShape()->getMargin();
+ const btVector3 mrg=btVector3( csm,
+ csm,
+ csm)*1; // ??? to investigate...
+ m_bounds[0]=mins-mrg;
+ m_bounds[1]=maxs+mrg;
+ if(0!=getBroadphaseHandle())
+ {
+ m_worldInfo->m_broadphase->setAabb( getBroadphaseHandle(),
+ m_bounds[0],
+ m_bounds[1],
+ m_worldInfo->m_dispatcher);
+ }
}
- }
- else
- {
- m_bounds[0]=
- m_bounds[1]=btVector3(0,0,0);
- }
+ else
+ {
+ m_bounds[0]=
+ m_bounds[1]=btVector3(0,0,0);
+ }
+ //}
}
@@ -1941,10 +2166,17 @@ void btSoftBody::initializeClusters()
c.m_masses.resize(c.m_nodes.size());
for(int j=0;j<c.m_nodes.size();++j)
{
- c.m_masses[j] = c.m_nodes[j]->m_im>0?1/c.m_nodes[j]->m_im:0;
+ if (c.m_nodes[j]->m_im==0)
+ {
+ c.m_containsAnchor = true;
+ c.m_masses[j] = BT_LARGE_FLOAT;
+ } else
+ {
+ c.m_masses[j] = btScalar(1.)/c.m_nodes[j]->m_im;
+ }
c.m_imass += c.m_masses[j];
}
- c.m_imass = 1/c.m_imass;
+ c.m_imass = btScalar(1.)/c.m_imass;
c.m_com = btSoftBody::clusterCom(&c);
c.m_lv = btVector3(0,0,0);
c.m_av = btVector3(0,0,0);
@@ -1971,7 +2203,9 @@ void btSoftBody::initializeClusters()
ii[1][0]=ii[0][1];
ii[2][0]=ii[0][2];
ii[2][1]=ii[1][2];
- ii=ii.inverse();
+
+ ii = ii.inverse();
+
/* Frame */
c.m_framexform.setIdentity();
c.m_framexform.setOrigin(c.m_com);
@@ -1996,7 +2230,7 @@ void btSoftBody::updateClusters()
{
btSoftBody::Cluster& c=*m_clusters[i];
const int n=c.m_nodes.size();
- const btScalar invn=1/(btScalar)n;
+ //const btScalar invn=1/(btScalar)n;
if(n)
{
/* Frame */
@@ -2058,7 +2292,7 @@ void btSoftBody::updateClusters()
{
const btVector3 v=c.m_nodes[i]->m_v*c.m_masses[i];
c.m_lv += v;
- c.m_av += cross(c.m_nodes[i]->m_x-c.m_com,v);
+ c.m_av += btCross(c.m_nodes[i]->m_x-c.m_com,v);
}
}
c.m_lv=c.m_imass*c.m_lv*(1-c.m_ldamping);
@@ -2141,8 +2375,8 @@ void btSoftBody::solveClusters(btScalar sor)
void btSoftBody::applyClusters(bool drift)
{
BT_PROFILE("ApplyClusters");
- const btScalar f0=m_sst.sdt;
- const btScalar f1=f0/2;
+// const btScalar f0=m_sst.sdt;
+ //const btScalar f1=f0/2;
btAlignedObjectArray<btVector3> deltas;
btAlignedObjectArray<btScalar> weights;
deltas.resize(m_nodes.size(),btVector3(0,0,0));
@@ -2174,14 +2408,17 @@ void btSoftBody::applyClusters(bool drift)
const int idx=int(c.m_nodes[j]-&m_nodes[0]);
const btVector3& x=c.m_nodes[j]->m_x;
const btScalar q=c.m_masses[j];
- deltas[idx] += (v+cross(w,x-c.m_com))*q;
+ deltas[idx] += (v+btCross(w,x-c.m_com))*q;
weights[idx] += q;
}
}
}
for(i=0;i<deltas.size();++i)
{
- if(weights[i]>0) m_nodes[i].m_x+=deltas[i]/weights[i];
+ if(weights[i]>0)
+ {
+ m_nodes[i].m_x+=deltas[i]/weights[i];
+ }
}
}
@@ -2200,7 +2437,7 @@ void btSoftBody::dampClusters()
Node& n=*c.m_nodes[j];
if(n.m_im>0)
{
- const btVector3 vx=c.m_lv+cross(c.m_av,c.m_nodes[j]->m_q-c.m_com);
+ const btVector3 vx=c.m_lv+btCross(c.m_av,c.m_nodes[j]->m_q-c.m_com);
if(vx.length2()<=n.m_v.length2())
{
n.m_v += c.m_ndamping*(vx-n.m_v);
@@ -2269,8 +2506,8 @@ void btSoftBody::AJoint::Prepare(btScalar dt,int iterations)
Joint::Prepare(dt,iterations);
m_axis[0] = m_bodies[0].xform().getBasis()*m_refs[0];
m_axis[1] = m_bodies[1].xform().getBasis()*m_refs[1];
- m_drift = NormalizeAny(cross(m_axis[1],m_axis[0]));
- m_drift *= btMin(maxdrift,btAcos(Clamp<btScalar>(dot(m_axis[0],m_axis[1]),-1,+1)));
+ m_drift = NormalizeAny(btCross(m_axis[1],m_axis[0]));
+ m_drift *= btMin(maxdrift,btAcos(Clamp<btScalar>(btDot(m_axis[0],m_axis[1]),-1,+1)));
m_drift *= m_erp/dt;
m_massmatrix= AngularImpulseMatrix(m_bodies[0].invWorldInertia(),m_bodies[1].invWorldInertia());
if(m_split>0)
@@ -2287,7 +2524,7 @@ void btSoftBody::AJoint::Solve(btScalar dt,btScalar sor)
const btVector3 va=m_bodies[0].angularVelocity();
const btVector3 vb=m_bodies[1].angularVelocity();
const btVector3 vr=va-vb;
- const btScalar sp=dot(vr,m_axis[0]);
+ const btScalar sp=btDot(vr,m_axis[0]);
const btVector3 vc=vr-m_axis[0]*m_icontrol->Speed(this,sp);
btSoftBody::Impulse impulse;
impulse.m_asVelocity = 1;
@@ -2334,7 +2571,7 @@ void btSoftBody::CJoint::Solve(btScalar dt,btScalar sor)
const btVector3 va=m_bodies[0].velocity(m_rpos[0]);
const btVector3 vb=m_bodies[1].velocity(m_rpos[1]);
const btVector3 vrel=va-vb;
- const btScalar rvac=dot(vrel,m_normal);
+ const btScalar rvac=btDot(vrel,m_normal);
btSoftBody::Impulse impulse;
impulse.m_asVelocity = 1;
impulse.m_velocity = m_drift;
@@ -2345,8 +2582,29 @@ void btSoftBody::CJoint::Solve(btScalar dt,btScalar sor)
impulse.m_velocity += iv+fv*m_friction;
}
impulse.m_velocity=m_massmatrix*impulse.m_velocity*sor;
- m_bodies[0].applyImpulse(-impulse,m_rpos[0]);
- m_bodies[1].applyImpulse( impulse,m_rpos[1]);
+
+ if (m_bodies[0].m_soft==m_bodies[1].m_soft)
+ {
+ if ((impulse.m_velocity.getX() ==impulse.m_velocity.getX())&&(impulse.m_velocity.getY() ==impulse.m_velocity.getY())&&
+ (impulse.m_velocity.getZ() ==impulse.m_velocity.getZ()))
+ {
+ if (impulse.m_asVelocity)
+ {
+ if (impulse.m_velocity.length() <m_bodies[0].m_soft->m_maxSelfCollisionImpulse)
+ {
+
+ } else
+ {
+ m_bodies[0].applyImpulse(-impulse*m_bodies[0].m_soft->m_selfCollisionImpulseFactor,m_rpos[0]);
+ m_bodies[1].applyImpulse( impulse*m_bodies[0].m_soft->m_selfCollisionImpulseFactor,m_rpos[1]);
+ }
+ }
+ }
+ } else
+ {
+ m_bodies[0].applyImpulse(-impulse,m_rpos[0]);
+ m_bodies[1].applyImpulse( impulse,m_rpos[1]);
+ }
}
//
@@ -2364,27 +2622,27 @@ void btSoftBody::applyForces()
{
BT_PROFILE("SoftBody applyForces");
- const btScalar dt=m_sst.sdt;
- const btScalar kLF=m_cfg.kLF;
- const btScalar kDG=m_cfg.kDG;
- const btScalar kPR=m_cfg.kPR;
- const btScalar kVC=m_cfg.kVC;
- const bool as_lift=kLF>0;
- const bool as_drag=kDG>0;
- const bool as_pressure=kPR!=0;
- const bool as_volume=kVC>0;
- const bool as_aero= as_lift ||
- as_drag ;
- const bool as_vaero= as_aero &&
- (m_cfg.aeromodel<btSoftBody::eAeroModel::F_TwoSided);
- const bool as_faero= as_aero &&
- (m_cfg.aeromodel>=btSoftBody::eAeroModel::F_TwoSided);
- const bool use_medium= as_aero;
- const bool use_volume= as_pressure ||
+ const btScalar dt = m_sst.sdt;
+ const btScalar kLF = m_cfg.kLF;
+ const btScalar kDG = m_cfg.kDG;
+ const btScalar kPR = m_cfg.kPR;
+ const btScalar kVC = m_cfg.kVC;
+ const bool as_lift = kLF>0;
+ const bool as_drag = kDG>0;
+ const bool as_pressure = kPR!=0;
+ const bool as_volume = kVC>0;
+ const bool as_aero = as_lift ||
+ as_drag ;
+ const bool as_vaero = as_aero &&
+ (m_cfg.aeromodel < btSoftBody::eAeroModel::F_TwoSided);
+ const bool as_faero = as_aero &&
+ (m_cfg.aeromodel >= btSoftBody::eAeroModel::F_TwoSided);
+ const bool use_medium = as_aero;
+ const bool use_volume = as_pressure ||
as_volume ;
- btScalar volume=0;
- btScalar ivolumetp=0;
- btScalar dvolumetv=0;
+ btScalar volume = 0;
+ btScalar ivolumetp = 0;
+ btScalar dvolumetv = 0;
btSoftBody::sMedium medium;
if(use_volume)
{
@@ -2402,33 +2660,41 @@ void btSoftBody::applyForces()
{
if(use_medium)
{
- EvaluateMedium(m_worldInfo,n.m_x,medium);
+ EvaluateMedium(m_worldInfo, n.m_x, medium);
+ medium.m_velocity = m_windVelocity;
+ medium.m_density = m_worldInfo->air_density;
+
/* Aerodynamics */
if(as_vaero)
{
- const btVector3 rel_v=n.m_v-medium.m_velocity;
- const btScalar rel_v2=rel_v.length2();
+ const btVector3 rel_v = n.m_v - medium.m_velocity;
+ const btScalar rel_v2 = rel_v.length2();
if(rel_v2>SIMD_EPSILON)
{
- btVector3 nrm=n.m_n;
+ btVector3 nrm = n.m_n;
/* Setup normal */
switch(m_cfg.aeromodel)
{
case btSoftBody::eAeroModel::V_Point:
- nrm=NormalizeAny(rel_v);break;
+ nrm = NormalizeAny(rel_v);
+ break;
case btSoftBody::eAeroModel::V_TwoSided:
- nrm*=(btScalar)(dot(nrm,rel_v)<0?-1:+1);break;
+ nrm *= (btScalar)( (btDot(nrm,rel_v) < 0) ? -1 : +1);
+ break;
+ default:
+ {
+ }
}
- const btScalar dvn=dot(rel_v,nrm);
+ const btScalar dvn = btDot(rel_v,nrm);
/* Compute forces */
if(dvn>0)
{
btVector3 force(0,0,0);
- const btScalar c0 = n.m_area*dvn*rel_v2/2;
- const btScalar c1 = c0*medium.m_density;
+ const btScalar c0 = n.m_area * dvn * rel_v2/2;
+ const btScalar c1 = c0 * medium.m_density;
force += nrm*(-c1*kLF);
- force += rel_v.normalized()*(-c1*kDG);
- ApplyClampedForce(n,force,dt);
+ force += rel_v.normalized() * (-c1 * kDG);
+ ApplyClampedForce(n, force, dt);
}
}
}
@@ -2463,9 +2729,12 @@ void btSoftBody::applyForces()
switch(m_cfg.aeromodel)
{
case btSoftBody::eAeroModel::F_TwoSided:
- nrm*=(btScalar)(dot(nrm,rel_v)<0?-1:+1);break;
+ nrm*=(btScalar)(btDot(nrm,rel_v)<0?-1:+1);break;
+ default:
+ {
+ }
}
- const btScalar dvn=dot(rel_v,nrm);
+ const btScalar dvn=btDot(rel_v,nrm);
/* Compute forces */
if(dvn>0)
{
@@ -2490,7 +2759,7 @@ void btSoftBody::PSolve_Anchors(btSoftBody* psb,btScalar kst,btScalar ti)
for(int i=0,ni=psb->m_anchors.size();i<ni;++i)
{
const Anchor& a=psb->m_anchors[i];
- const btTransform& t=a.m_body->getInterpolationWorldTransform();
+ const btTransform& t=a.m_body->getWorldTransform();
Node& n=*a.m_node;
const btVector3 wa=t*a.m_local;
const btVector3 va=a.m_body->getVelocityInLocalPoint(a.m_c1)*dt;
@@ -2503,26 +2772,27 @@ void btSoftBody::PSolve_Anchors(btSoftBody* psb,btScalar kst,btScalar ti)
}
//
-void btSoftBody::PSolve_RContacts(btSoftBody* psb,btScalar kst,btScalar ti)
+void btSoftBody::PSolve_RContacts(btSoftBody* psb, btScalar kst, btScalar ti)
{
- const btScalar dt=psb->m_sst.sdt;
- const btScalar mrg=psb->getCollisionShape()->getMargin();
+ const btScalar dt = psb->m_sst.sdt;
+ const btScalar mrg = psb->getCollisionShape()->getMargin();
for(int i=0,ni=psb->m_rcontacts.size();i<ni;++i)
{
- const RContact& c=psb->m_rcontacts[i];
- const sCti& cti=c.m_cti;
+ const RContact& c = psb->m_rcontacts[i];
+ const sCti& cti = c.m_cti;
btRigidBody* tmpRigid = btRigidBody::upcast(cti.m_colObj);
- const btVector3 va=tmpRigid ? tmpRigid->getVelocityInLocalPoint(c.m_c1)*dt : btVector3(0,0,0);
- const btVector3 vb=c.m_node->m_x-c.m_node->m_q;
- const btVector3 vr=vb-va;
- const btScalar dn=dot(vr,cti.m_normal);
+ const btVector3 va = tmpRigid ? tmpRigid->getVelocityInLocalPoint(c.m_c1)*dt : btVector3(0,0,0);
+ const btVector3 vb = c.m_node->m_x-c.m_node->m_q;
+ const btVector3 vr = vb-va;
+ const btScalar dn = btDot(vr, cti.m_normal);
if(dn<=SIMD_EPSILON)
{
- const btScalar dp=btMin(dot(c.m_node->m_x,cti.m_normal)+cti.m_offset,mrg);
- const btVector3 fv=vr-cti.m_normal*dn;
- const btVector3 impulse=c.m_c0*((vr-fv*c.m_c3+cti.m_normal*(dp*c.m_c4))*kst);
- c.m_node->m_x-=impulse*c.m_c2;
+ const btScalar dp = btMin( (btDot(c.m_node->m_x, cti.m_normal) + cti.m_offset), mrg );
+ const btVector3 fv = vr - (cti.m_normal * dn);
+ // c0 is the impulse matrix, c3 is 1 - the friction coefficient or 0, c4 is the contact hardness coefficient
+ const btVector3 impulse = c.m_c0 * ( (vr - (fv * c.m_c3) + (cti.m_normal * (dp * c.m_c4))) * kst );
+ c.m_node->m_x -= impulse * c.m_c2;
if (tmpRigid)
tmpRigid->applyImpulse(impulse,c.m_c1);
}
@@ -2548,9 +2818,10 @@ void btSoftBody::PSolve_SContacts(btSoftBody* psb,btScalar,btScalar ti)
c.m_weights);
const btVector3 vr=(n.m_x-n.m_q)-(p-q);
btVector3 corr(0,0,0);
- if(dot(vr,nr)<0)
+ btScalar dot = btDot(vr,nr);
+ if(dot<0)
{
- const btScalar j=c.m_margin-(dot(nr,n.m_x)-dot(nr,p));
+ const btScalar j=c.m_margin-(btDot(nr,n.m_x)-btDot(nr,p));
corr+=c.m_normal*j;
}
corr -= ProjectOnPlane(vr,nr)*c.m_friction;
@@ -2573,10 +2844,12 @@ void btSoftBody::PSolve_Links(btSoftBody* psb,btScalar kst,btScalar ti)
Node& b=*l.m_n[1];
const btVector3 del=b.m_x-a.m_x;
const btScalar len=del.length2();
- const btScalar k=((l.m_c1-len)/(l.m_c0*(l.m_c1+len)))*kst;
- const btScalar t=k*a.m_im;
- a.m_x-=del*(k*a.m_im);
- b.m_x+=del*(k*b.m_im);
+ if (l.m_c1+len > SIMD_EPSILON)
+ {
+ const btScalar k=((l.m_c1-len)/(l.m_c0*(l.m_c1+len)))*kst;
+ a.m_x-=del*(k*a.m_im);
+ b.m_x+=del*(k*b.m_im);
+ }
}
}
}
@@ -2588,7 +2861,7 @@ void btSoftBody::VSolve_Links(btSoftBody* psb,btScalar kst)
{
Link& l=psb->m_links[i];
Node** n=l.m_n;
- const btScalar j=-dot(l.m_c3,n[0]->m_v-n[1]->m_v)*l.m_c2*kst;
+ const btScalar j=-btDot(l.m_c3,n[0]->m_v-n[1]->m_v)*l.m_c2*kst;
n[0]->m_v+= l.m_c3*(j*n[0]->m_im);
n[1]->m_v-= l.m_c3*(j*n[1]->m_im);
}
@@ -2599,10 +2872,17 @@ btSoftBody::psolver_t btSoftBody::getSolver(ePSolver::_ solver)
{
switch(solver)
{
- case ePSolver::Anchors: return(&btSoftBody::PSolve_Anchors);
- case ePSolver::Linear: return(&btSoftBody::PSolve_Links);
- case ePSolver::RContacts: return(&btSoftBody::PSolve_RContacts);
- case ePSolver::SContacts: return(&btSoftBody::PSolve_SContacts);
+ case ePSolver::Anchors:
+ return(&btSoftBody::PSolve_Anchors);
+ case ePSolver::Linear:
+ return(&btSoftBody::PSolve_Links);
+ case ePSolver::RContacts:
+ return(&btSoftBody::PSolve_RContacts);
+ case ePSolver::SContacts:
+ return(&btSoftBody::PSolve_SContacts);
+ default:
+ {
+ }
}
return(0);
}
@@ -2613,6 +2893,9 @@ btSoftBody::vsolver_t btSoftBody::getSolver(eVSolver::_ solver)
switch(solver)
{
case eVSolver::Linear: return(&btSoftBody::VSolve_Links);
+ default:
+ {
+ }
}
return(0);
}
@@ -2620,13 +2903,14 @@ btSoftBody::vsolver_t btSoftBody::getSolver(eVSolver::_ solver)
//
void btSoftBody::defaultCollisionHandler(btCollisionObject* pco)
{
+
switch(m_cfg.collisions&fCollision::RVSmask)
{
case fCollision::SDF_RS:
{
btSoftColliders::CollideSDF_RS docollide;
btRigidBody* prb1=btRigidBody::upcast(pco);
- btTransform wtr=prb1 ? prb1->getInterpolationWorldTransform() : pco->getWorldTransform();
+ btTransform wtr=pco->getWorldTransform();
const btTransform ctr=pco->getWorldTransform();
const btScalar timemargin=(wtr.getOrigin()-ctr.getOrigin()).length();
@@ -2634,7 +2918,7 @@ void btSoftBody::defaultCollisionHandler(btCollisionObject* pco)
btVector3 mins;
btVector3 maxs;
ATTRIBUTE_ALIGNED16(btDbvtVolume) volume;
- pco->getCollisionShape()->getAabb( pco->getInterpolationWorldTransform(),
+ pco->getCollisionShape()->getAabb( pco->getWorldTransform(),
mins,
maxs);
volume=btDbvtVolume::FromMM(mins,maxs);
@@ -2665,8 +2949,14 @@ void btSoftBody::defaultCollisionHandler(btSoftBody* psb)
{
case fCollision::CL_SS:
{
- btSoftColliders::CollideCL_SS docollide;
- docollide.Process(this,psb);
+
+ //support self-collision if CL_SELF flag set
+ if (this!=psb || psb->m_cfg.collisions&fCollision::CL_SELF)
+ {
+ btSoftColliders::CollideCL_SS docollide;
+ docollide.Process(this,psb);
+ }
+
}
break;
case fCollision::VF_SS:
@@ -2693,5 +2983,426 @@ void btSoftBody::defaultCollisionHandler(btSoftBody* psb)
}
}
break;
+ default:
+ {
+
+ }
+ }
+}
+
+
+
+void btSoftBody::setWindVelocity( const btVector3 &velocity )
+{
+ m_windVelocity = velocity;
+}
+
+
+const btVector3& btSoftBody::getWindVelocity()
+{
+ return m_windVelocity;
+}
+
+
+
+int btSoftBody::calculateSerializeBufferSize() const
+{
+ int sz = sizeof(btSoftBodyData);
+ return sz;
+}
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+const char* btSoftBody::serialize(void* dataBuffer, class btSerializer* serializer) const
+{
+ btSoftBodyData* sbd = (btSoftBodyData*) dataBuffer;
+
+ btCollisionObject::serialize(&sbd->m_collisionObjectData, serializer);
+
+ btHashMap<btHashPtr,int> m_nodeIndexMap;
+
+ sbd->m_numMaterials = m_materials.size();
+ sbd->m_materials = sbd->m_numMaterials? (SoftBodyMaterialData**) serializer->getUniquePointer((void*)&m_materials): 0;
+
+ if (sbd->m_materials)
+ {
+ int sz = sizeof(SoftBodyMaterialData*);
+ int numElem = sbd->m_numMaterials;
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ //SoftBodyMaterialData** memPtr = chunk->m_oldPtr;
+ SoftBodyMaterialData** memPtr = (SoftBodyMaterialData**)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ btSoftBody::Material* mat = m_materials[i];
+ *memPtr = mat ? (SoftBodyMaterialData*)serializer->getUniquePointer((void*)mat) : 0;
+ if (!serializer->findPointer(mat))
+ {
+ //serialize it here
+ btChunk* chunk = serializer->allocate(sizeof(SoftBodyMaterialData),1);
+ SoftBodyMaterialData* memPtr = (SoftBodyMaterialData*)chunk->m_oldPtr;
+ memPtr->m_flags = mat->m_flags;
+ memPtr->m_angularStiffness = mat->m_kAST;
+ memPtr->m_linearStiffness = mat->m_kLST;
+ memPtr->m_volumeStiffness = mat->m_kVST;
+ serializer->finalizeChunk(chunk,"SoftBodyMaterialData",BT_SBMATERIAL_CODE,mat);
+ }
+ }
+ serializer->finalizeChunk(chunk,"SoftBodyMaterialData",BT_ARRAY_CODE,(void*) &m_materials);
+ }
+
+
+
+
+ sbd->m_numNodes = m_nodes.size();
+ sbd->m_nodes = sbd->m_numNodes ? (SoftBodyNodeData*)serializer->getUniquePointer((void*)&m_nodes): 0;
+ if (sbd->m_nodes)
+ {
+ int sz = sizeof(SoftBodyNodeData);
+ int numElem = sbd->m_numNodes;
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ SoftBodyNodeData* memPtr = (SoftBodyNodeData*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_nodes[i].m_f.serializeFloat( memPtr->m_accumulatedForce);
+ memPtr->m_area = m_nodes[i].m_area;
+ memPtr->m_attach = m_nodes[i].m_battach;
+ memPtr->m_inverseMass = m_nodes[i].m_im;
+ memPtr->m_material = m_nodes[i].m_material? (SoftBodyMaterialData*)serializer->getUniquePointer((void*) m_nodes[i].m_material):0;
+ m_nodes[i].m_n.serializeFloat(memPtr->m_normal);
+ m_nodes[i].m_x.serializeFloat(memPtr->m_position);
+ m_nodes[i].m_q.serializeFloat(memPtr->m_previousPosition);
+ m_nodes[i].m_v.serializeFloat(memPtr->m_velocity);
+ m_nodeIndexMap.insert(&m_nodes[i],i);
+ }
+ serializer->finalizeChunk(chunk,"SoftBodyNodeData",BT_SBNODE_CODE,(void*) &m_nodes);
+ }
+
+ sbd->m_numLinks = m_links.size();
+ sbd->m_links = sbd->m_numLinks? (SoftBodyLinkData*) serializer->getUniquePointer((void*)&m_links[0]):0;
+ if (sbd->m_links)
+ {
+ int sz = sizeof(SoftBodyLinkData);
+ int numElem = sbd->m_numLinks;
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ SoftBodyLinkData* memPtr = (SoftBodyLinkData*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ memPtr->m_bbending = m_links[i].m_bbending;
+ memPtr->m_material = m_links[i].m_material? (SoftBodyMaterialData*)serializer->getUniquePointer((void*) m_links[i].m_material):0;
+ memPtr->m_nodeIndices[0] = m_links[i].m_n[0] ? m_links[i].m_n[0] - &m_nodes[0]: -1;
+ memPtr->m_nodeIndices[1] = m_links[i].m_n[1] ? m_links[i].m_n[1] - &m_nodes[0]: -1;
+ btAssert(memPtr->m_nodeIndices[0]<m_nodes.size());
+ btAssert(memPtr->m_nodeIndices[1]<m_nodes.size());
+ memPtr->m_restLength = m_links[i].m_rl;
+ }
+ serializer->finalizeChunk(chunk,"SoftBodyLinkData",BT_ARRAY_CODE,(void*) &m_links[0]);
+
+ }
+
+
+ sbd->m_numFaces = m_faces.size();
+ sbd->m_faces = sbd->m_numFaces? (SoftBodyFaceData*) serializer->getUniquePointer((void*)&m_faces[0]):0;
+ if (sbd->m_faces)
+ {
+ int sz = sizeof(SoftBodyFaceData);
+ int numElem = sbd->m_numFaces;
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ SoftBodyFaceData* memPtr = (SoftBodyFaceData*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ memPtr->m_material = m_faces[i].m_material ? (SoftBodyMaterialData*) serializer->getUniquePointer((void*)m_faces[i].m_material): 0;
+ m_faces[i].m_normal.serializeFloat( memPtr->m_normal);
+ for (int j=0;j<3;j++)
+ {
+ memPtr->m_nodeIndices[j] = m_faces[i].m_n[j]? m_faces[i].m_n[j] - &m_nodes[0]: -1;
+ }
+ memPtr->m_restArea = m_faces[i].m_ra;
+ }
+ serializer->finalizeChunk(chunk,"SoftBodyFaceData",BT_ARRAY_CODE,(void*) &m_faces[0]);
+ }
+
+
+ sbd->m_numTetrahedra = m_tetras.size();
+ sbd->m_tetrahedra = sbd->m_numTetrahedra ? (SoftBodyTetraData*) serializer->getUniquePointer((void*)&m_tetras[0]):0;
+ if (sbd->m_tetrahedra)
+ {
+ int sz = sizeof(SoftBodyTetraData);
+ int numElem = sbd->m_numTetrahedra;
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ SoftBodyTetraData* memPtr = (SoftBodyTetraData*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ for (int j=0;j<4;j++)
+ {
+ m_tetras[i].m_c0[j].serializeFloat( memPtr->m_c0[j] );
+ memPtr->m_nodeIndices[j] = m_tetras[j].m_n[j]? m_tetras[j].m_n[j]-&m_nodes[0] : -1;
+ }
+ memPtr->m_c1 = m_tetras[i].m_c1;
+ memPtr->m_c2 = m_tetras[i].m_c2;
+ memPtr->m_material = m_tetras[i].m_material ? (SoftBodyMaterialData*)serializer->getUniquePointer((void*) m_tetras[i].m_material): 0;
+ memPtr->m_restVolume = m_tetras[i].m_rv;
+ }
+ serializer->finalizeChunk(chunk,"SoftBodyTetraData",BT_ARRAY_CODE,(void*) &m_tetras[0]);
+ }
+
+ sbd->m_numAnchors = m_anchors.size();
+ sbd->m_anchors = sbd->m_numAnchors ? (SoftRigidAnchorData*) serializer->getUniquePointer((void*)&m_anchors[0]):0;
+ if (sbd->m_anchors)
+ {
+ int sz = sizeof(SoftRigidAnchorData);
+ int numElem = sbd->m_numAnchors;
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ SoftRigidAnchorData* memPtr = (SoftRigidAnchorData*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_anchors[i].m_c0.serializeFloat(memPtr->m_c0);
+ m_anchors[i].m_c1.serializeFloat(memPtr->m_c1);
+ memPtr->m_c2 = m_anchors[i].m_c2;
+ m_anchors[i].m_local.serializeFloat(memPtr->m_localFrame);
+ memPtr->m_nodeIndex = m_anchors[i].m_node? m_anchors[i].m_node-&m_nodes[0]: -1;
+
+ memPtr->m_rigidBody = m_anchors[i].m_body? (btRigidBodyData*) serializer->getUniquePointer((void*)m_anchors[i].m_body): 0;
+ btAssert(memPtr->m_nodeIndex < m_nodes.size());
+ }
+ serializer->finalizeChunk(chunk,"SoftRigidAnchorData",BT_ARRAY_CODE,(void*) &m_anchors[0]);
+ }
+
+
+ sbd->m_config.m_dynamicFriction = m_cfg.kDF;
+ sbd->m_config.m_baumgarte = m_cfg.kVCF;
+ sbd->m_config.m_pressure = m_cfg.kPR;
+ sbd->m_config.m_aeroModel = this->m_cfg.aeromodel;
+ sbd->m_config.m_lift = m_cfg.kLF;
+ sbd->m_config.m_drag = m_cfg.kDG;
+ sbd->m_config.m_positionIterations = m_cfg.piterations;
+ sbd->m_config.m_driftIterations = m_cfg.diterations;
+ sbd->m_config.m_clusterIterations = m_cfg.citerations;
+ sbd->m_config.m_velocityIterations = m_cfg.viterations;
+ sbd->m_config.m_maxVolume = m_cfg.maxvolume;
+ sbd->m_config.m_damping = m_cfg.kDP;
+ sbd->m_config.m_poseMatch = m_cfg.kMT;
+ sbd->m_config.m_collisionFlags = m_cfg.collisions;
+ sbd->m_config.m_volume = m_cfg.kVC;
+ sbd->m_config.m_rigidContactHardness = m_cfg.kCHR;
+ sbd->m_config.m_kineticContactHardness = m_cfg.kKHR;
+ sbd->m_config.m_softContactHardness = m_cfg.kSHR;
+ sbd->m_config.m_anchorHardness = m_cfg.kAHR;
+ sbd->m_config.m_timeScale = m_cfg.timescale;
+ sbd->m_config.m_maxVolume = m_cfg.maxvolume;
+ sbd->m_config.m_softRigidClusterHardness = m_cfg.kSRHR_CL;
+ sbd->m_config.m_softKineticClusterHardness = m_cfg.kSKHR_CL;
+ sbd->m_config.m_softSoftClusterHardness = m_cfg.kSSHR_CL;
+ sbd->m_config.m_softRigidClusterImpulseSplit = m_cfg.kSR_SPLT_CL;
+ sbd->m_config.m_softKineticClusterImpulseSplit = m_cfg.kSK_SPLT_CL;
+ sbd->m_config.m_softSoftClusterImpulseSplit = m_cfg.kSS_SPLT_CL;
+
+ //pose for shape matching
+ {
+ sbd->m_pose = (SoftBodyPoseData*)serializer->getUniquePointer((void*)&m_pose);
+
+ int sz = sizeof(SoftBodyPoseData);
+ btChunk* chunk = serializer->allocate(sz,1);
+ SoftBodyPoseData* memPtr = (SoftBodyPoseData*)chunk->m_oldPtr;
+
+ m_pose.m_aqq.serializeFloat(memPtr->m_aqq);
+ memPtr->m_bframe = m_pose.m_bframe;
+ memPtr->m_bvolume = m_pose.m_bvolume;
+ m_pose.m_com.serializeFloat(memPtr->m_com);
+
+ memPtr->m_numPositions = m_pose.m_pos.size();
+ memPtr->m_positions = memPtr->m_numPositions ? (btVector3FloatData*)serializer->getUniquePointer((void*)&m_pose.m_pos[0]): 0;
+ if (memPtr->m_numPositions)
+ {
+ int numElem = memPtr->m_numPositions;
+ int sz = sizeof(btVector3Data);
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ btVector3FloatData* memPtr = (btVector3FloatData*)chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ m_pose.m_pos[i].serializeFloat(*memPtr);
+ }
+ serializer->finalizeChunk(chunk,"btVector3FloatData",BT_ARRAY_CODE,(void*)&m_pose.m_pos[0]);
+ }
+ memPtr->m_restVolume = m_pose.m_volume;
+ m_pose.m_rot.serializeFloat(memPtr->m_rot);
+ m_pose.m_scl.serializeFloat(memPtr->m_scale);
+
+ memPtr->m_numWeigts = m_pose.m_wgh.size();
+ memPtr->m_weights = memPtr->m_numWeigts? (float*) serializer->getUniquePointer((void*) &m_pose.m_wgh[0]) : 0;
+ if (memPtr->m_numWeigts)
+ {
+
+ int numElem = memPtr->m_numWeigts;
+ int sz = sizeof(float);
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ float* memPtr = (float*) chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ *memPtr = m_pose.m_wgh[i];
+ }
+ serializer->finalizeChunk(chunk,"float",BT_ARRAY_CODE,(void*)&m_pose.m_wgh[0]);
+ }
+
+ serializer->finalizeChunk(chunk,"SoftBodyPoseData",BT_ARRAY_CODE,(void*)&m_pose);
+ }
+
+ //clusters for convex-cluster collision detection
+
+ sbd->m_numClusters = m_clusters.size();
+ sbd->m_clusters = sbd->m_numClusters? (SoftBodyClusterData*) serializer->getUniquePointer((void*)m_clusters[0]) : 0;
+ if (sbd->m_numClusters)
+ {
+ int numElem = sbd->m_numClusters;
+ int sz = sizeof(SoftBodyClusterData);
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ SoftBodyClusterData* memPtr = (SoftBodyClusterData*) chunk->m_oldPtr;
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ memPtr->m_adamping= m_clusters[i]->m_adamping;
+ m_clusters[i]->m_av.serializeFloat(memPtr->m_av);
+ memPtr->m_clusterIndex = m_clusters[i]->m_clusterIndex;
+ memPtr->m_collide = m_clusters[i]->m_collide;
+ m_clusters[i]->m_com.serializeFloat(memPtr->m_com);
+ memPtr->m_containsAnchor = m_clusters[i]->m_containsAnchor;
+ m_clusters[i]->m_dimpulses[0].serializeFloat(memPtr->m_dimpulses[0]);
+ m_clusters[i]->m_dimpulses[1].serializeFloat(memPtr->m_dimpulses[1]);
+ m_clusters[i]->m_framexform.serializeFloat(memPtr->m_framexform);
+ memPtr->m_idmass = m_clusters[i]->m_idmass;
+ memPtr->m_imass = m_clusters[i]->m_imass;
+ m_clusters[i]->m_invwi.serializeFloat(memPtr->m_invwi);
+ memPtr->m_ldamping = m_clusters[i]->m_ldamping;
+ m_clusters[i]->m_locii.serializeFloat(memPtr->m_locii);
+ m_clusters[i]->m_lv.serializeFloat(memPtr->m_lv);
+ memPtr->m_matching = m_clusters[i]->m_matching;
+ memPtr->m_maxSelfCollisionImpulse = m_clusters[i]->m_maxSelfCollisionImpulse;
+ memPtr->m_ndamping = m_clusters[i]->m_ndamping;
+ memPtr->m_ldamping = m_clusters[i]->m_ldamping;
+ memPtr->m_adamping = m_clusters[i]->m_adamping;
+ memPtr->m_selfCollisionImpulseFactor = m_clusters[i]->m_selfCollisionImpulseFactor;
+
+ memPtr->m_numFrameRefs = m_clusters[i]->m_framerefs.size();
+ memPtr->m_numMasses = m_clusters[i]->m_masses.size();
+ memPtr->m_numNodes = m_clusters[i]->m_nodes.size();
+
+ memPtr->m_nvimpulses = m_clusters[i]->m_nvimpulses;
+ m_clusters[i]->m_vimpulses[0].serializeFloat(memPtr->m_vimpulses[0]);
+ m_clusters[i]->m_vimpulses[1].serializeFloat(memPtr->m_vimpulses[1]);
+ memPtr->m_ndimpulses = m_clusters[i]->m_ndimpulses;
+
+
+
+ memPtr->m_framerefs = memPtr->m_numFrameRefs? (btVector3FloatData*)serializer->getUniquePointer((void*)&m_clusters[i]->m_framerefs[0]) : 0;
+ if (memPtr->m_framerefs)
+ {
+ int numElem = memPtr->m_numFrameRefs;
+ int sz = sizeof(btVector3FloatData);
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ btVector3FloatData* memPtr = (btVector3FloatData*) chunk->m_oldPtr;
+ for (int j=0;j<numElem;j++,memPtr++)
+ {
+ m_clusters[i]->m_framerefs[j].serializeFloat(*memPtr);
+ }
+ serializer->finalizeChunk(chunk,"btVector3FloatData",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_framerefs[0]);
+ }
+
+ memPtr->m_masses = memPtr->m_numMasses ? (float*) serializer->getUniquePointer((void*)&m_clusters[i]->m_masses[0]): 0;
+ if (memPtr->m_masses)
+ {
+ int numElem = memPtr->m_numMasses;
+ int sz = sizeof(float);
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ float* memPtr = (float*) chunk->m_oldPtr;
+ for (int j=0;j<numElem;j++,memPtr++)
+ {
+ *memPtr = m_clusters[i]->m_masses[j];
+ }
+ serializer->finalizeChunk(chunk,"float",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_masses[0]);
+ }
+
+ memPtr->m_nodeIndices = memPtr->m_numNodes ? (int*) serializer->getUniquePointer((void*) &m_clusters[i]->m_nodes) : 0;
+ if (memPtr->m_nodeIndices )
+ {
+ int numElem = memPtr->m_numMasses;
+ int sz = sizeof(int);
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ int* memPtr = (int*) chunk->m_oldPtr;
+ for (int j=0;j<numElem;j++,memPtr++)
+ {
+ int* indexPtr = m_nodeIndexMap.find(m_clusters[i]->m_nodes[j]);
+ btAssert(indexPtr);
+ *memPtr = *indexPtr;
+ }
+ serializer->finalizeChunk(chunk,"int",BT_ARRAY_CODE,(void*)&m_clusters[i]->m_nodes);
+ }
+ }
+ serializer->finalizeChunk(chunk,"SoftBodyClusterData",BT_ARRAY_CODE,(void*)m_clusters[0]);
+
+ }
+
+
+
+ sbd->m_numJoints = m_joints.size();
+ sbd->m_joints = m_joints.size()? (btSoftBodyJointData*) serializer->getUniquePointer((void*)&m_joints[0]) : 0;
+
+ if (sbd->m_joints)
+ {
+ int sz = sizeof(btSoftBodyJointData);
+ int numElem = m_joints.size();
+ btChunk* chunk = serializer->allocate(sz,numElem);
+ btSoftBodyJointData* memPtr = (btSoftBodyJointData*)chunk->m_oldPtr;
+
+ for (int i=0;i<numElem;i++,memPtr++)
+ {
+ memPtr->m_jointType = (int)m_joints[i]->Type();
+ m_joints[i]->m_refs[0].serializeFloat(memPtr->m_refs[0]);
+ m_joints[i]->m_refs[1].serializeFloat(memPtr->m_refs[1]);
+ memPtr->m_cfm = m_joints[i]->m_cfm;
+ memPtr->m_erp = m_joints[i]->m_erp;
+ memPtr->m_split = m_joints[i]->m_split;
+ memPtr->m_delete = m_joints[i]->m_delete;
+
+ for (int j=0;j<4;j++)
+ {
+ memPtr->m_relPosition[0].m_floats[j] = 0.f;
+ memPtr->m_relPosition[1].m_floats[j] = 0.f;
+ }
+ memPtr->m_bodyA = 0;
+ memPtr->m_bodyB = 0;
+ if (m_joints[i]->m_bodies[0].m_soft)
+ {
+ memPtr->m_bodyAtype = BT_JOINT_SOFT_BODY_CLUSTER;
+ memPtr->m_bodyA = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[0].m_soft);
+ }
+ if (m_joints[i]->m_bodies[0].m_collisionObject)
+ {
+ memPtr->m_bodyAtype = BT_JOINT_COLLISION_OBJECT;
+ memPtr->m_bodyA = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[0].m_collisionObject);
+ }
+ if (m_joints[i]->m_bodies[0].m_rigid)
+ {
+ memPtr->m_bodyAtype = BT_JOINT_RIGID_BODY;
+ memPtr->m_bodyA = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[0].m_rigid);
+ }
+
+ if (m_joints[i]->m_bodies[1].m_soft)
+ {
+ memPtr->m_bodyBtype = BT_JOINT_SOFT_BODY_CLUSTER;
+ memPtr->m_bodyB = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[1].m_soft);
+ }
+ if (m_joints[i]->m_bodies[1].m_collisionObject)
+ {
+ memPtr->m_bodyBtype = BT_JOINT_COLLISION_OBJECT;
+ memPtr->m_bodyB = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[1].m_collisionObject);
+ }
+ if (m_joints[i]->m_bodies[1].m_rigid)
+ {
+ memPtr->m_bodyBtype = BT_JOINT_RIGID_BODY;
+ memPtr->m_bodyB = serializer->getUniquePointer((void*)m_joints[i]->m_bodies[1].m_rigid);
+ }
+ }
+ serializer->finalizeChunk(chunk,"btSoftBodyJointData",BT_ARRAY_CODE,(void*) &m_joints[0]);
}
+
+
+ return btSoftBodyDataName;
}
+
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBody.h b/extern/bullet2/src/BulletSoftBody/btSoftBody.h
index a62c21883c8..ad8678f28b2 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftBody.h
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBody.h
@@ -27,8 +27,17 @@ subject to the following restrictions:
#include "btSparseSDF.h"
#include "BulletCollision/BroadphaseCollision/btDbvt.h"
+//#ifdef BT_USE_DOUBLE_PRECISION
+//#define btRigidBodyData btRigidBodyDoubleData
+//#define btRigidBodyDataName "btRigidBodyDoubleData"
+//#else
+#define btSoftBodyData btSoftBodyFloatData
+#define btSoftBodyDataName "btSoftBodyFloatData"
+//#endif //BT_USE_DOUBLE_PRECISION
+
class btBroadphaseInterface;
class btDispatcher;
+class btSoftBodySolver;
/* btSoftBodyWorldInfo */
struct btSoftBodyWorldInfo
@@ -41,6 +50,17 @@ struct btSoftBodyWorldInfo
btDispatcher* m_dispatcher;
btVector3 m_gravity;
btSparseSdf<3> m_sparsesdf;
+
+ btSoftBodyWorldInfo()
+ :air_density((btScalar)1.2),
+ water_density(0),
+ water_offset(0),
+ water_normal(0,0,0),
+ m_broadphase(0),
+ m_dispatcher(0),
+ m_gravity(0,-10,0)
+ {
+ }
};
@@ -51,6 +71,9 @@ class btSoftBody : public btCollisionObject
public:
btAlignedObjectArray<class btCollisionObject*> m_collisionDisabledObjects;
+ // The solver object that handles this soft body
+ btSoftBodySolver *m_softBodySolver;
+
//
// Enumerations
//
@@ -110,9 +133,10 @@ public:
SDF_RS = 0x0001, ///SDF based rigid vs soft
CL_RS = 0x0002, ///Cluster vs convex rigid vs soft
- SVSmask = 0x00f0, ///Rigid versus soft mask
+ SVSmask = 0x0030, ///Rigid versus soft mask
VF_SS = 0x0010, ///Vertex vs face soft vs soft handling
CL_SS = 0x0020, ///Cluster vs cluster soft vs soft handling
+ CL_SELF = 0x0040, ///Cluster soft body self collision
/* presets */
Default = SDF_RS,
END
@@ -220,6 +244,16 @@ public:
btScalar m_ra; // Rest area
btDbvtNode* m_leaf; // Leaf data
};
+ /* Tetra */
+ struct Tetra : Feature
+ {
+ Node* m_n[4]; // Node pointers
+ btScalar m_rv; // Rest volume
+ btDbvtNode* m_leaf; // Leaf data
+ btVector3 m_c0[4]; // gradients
+ btScalar m_c1; // (4*kVST)/(im0+im1+im2+im3)
+ btScalar m_c2; // m_c1/sum(|g0..3|^2)
+ };
/* RContact */
struct RContact
{
@@ -276,9 +310,9 @@ public:
};
/* Cluster */
struct Cluster
- {
- btAlignedObjectArray<Node*> m_nodes;
+ {
tScalarArray m_masses;
+ btAlignedObjectArray<Node*> m_nodes;
tVector3Array m_framerefs;
btTransform m_framexform;
btScalar m_idmass;
@@ -297,9 +331,16 @@ public:
btScalar m_ldamping; /* Linear damping */
btScalar m_adamping; /* Angular damping */
btScalar m_matching;
+ btScalar m_maxSelfCollisionImpulse;
+ btScalar m_selfCollisionImpulseFactor;
+ bool m_containsAnchor;
bool m_collide;
int m_clusterIndex;
- Cluster() : m_leaf(0),m_ndamping(0),m_ldamping(0),m_adamping(0),m_matching(0) {}
+ Cluster() : m_leaf(0),m_ndamping(0),m_ldamping(0),m_adamping(0),m_matching(0)
+ ,m_maxSelfCollisionImpulse(100.f),
+ m_selfCollisionImpulseFactor(0.01f),
+ m_containsAnchor(false)
+ {}
};
/* Impulse */
struct Impulse
@@ -340,7 +381,11 @@ public:
void activate() const
{
- if(m_rigid) m_rigid->activate();
+ if(m_rigid)
+ m_rigid->activate();
+ if (m_collisionObject)
+ m_collisionObject->activate();
+
}
const btMatrix3x3& invWorldInertia() const
{
@@ -358,7 +403,7 @@ public:
const btTransform& xform() const
{
static const btTransform identity=btTransform::getIdentity();
- if(m_collisionObject) return(m_collisionObject->getInterpolationWorldTransform());
+ if(m_collisionObject) return(m_collisionObject->getWorldTransform());
if(m_soft) return(m_soft->m_framexform);
return(identity);
}
@@ -370,8 +415,8 @@ public:
}
btVector3 angularVelocity(const btVector3& rpos) const
{
- if(m_rigid) return(cross(m_rigid->getAngularVelocity(),rpos));
- if(m_soft) return(cross(m_soft->m_av,rpos));
+ if(m_rigid) return(btCross(m_rigid->getAngularVelocity(),rpos));
+ if(m_soft) return(btCross(m_soft->m_av,rpos));
return(btVector3(0,0,0));
}
btVector3 angularVelocity() const
@@ -396,8 +441,16 @@ public:
}
void applyImpulse(const Impulse& impulse,const btVector3& rpos) const
{
- if(impulse.m_asVelocity) applyVImpulse(impulse.m_velocity,rpos);
- if(impulse.m_asDrift) applyDImpulse(impulse.m_drift,rpos);
+ if(impulse.m_asVelocity)
+ {
+// printf("impulse.m_velocity = %f,%f,%f\n",impulse.m_velocity.getX(),impulse.m_velocity.getY(),impulse.m_velocity.getZ());
+ applyVImpulse(impulse.m_velocity,rpos);
+ }
+ if(impulse.m_asDrift)
+ {
+// printf("impulse.m_drift = %f,%f,%f\n",impulse.m_drift.getX(),impulse.m_drift.getY(),impulse.m_drift.getZ());
+ applyDImpulse(impulse.m_drift,rpos);
+ }
}
void applyVAImpulse(const btVector3& impulse) const
{
@@ -424,7 +477,7 @@ public:
struct Joint
{
struct eType { enum _ {
- Linear,
+ Linear=0,
Angular,
Contact
};};
@@ -563,7 +616,7 @@ public:
};
//
- // Typedef's
+ // Typedefs
//
typedef void (*psolver_t)(btSoftBody*,btScalar,btScalar);
@@ -574,6 +627,7 @@ public:
typedef btAlignedObjectArray<btDbvtNode*> tLeafArray;
typedef btAlignedObjectArray<Link> tLinkArray;
typedef btAlignedObjectArray<Face> tFaceArray;
+ typedef btAlignedObjectArray<Tetra> tTetraArray;
typedef btAlignedObjectArray<Anchor> tAnchorArray;
typedef btAlignedObjectArray<RContact> tRContactArray;
typedef btAlignedObjectArray<SContact> tSContactArray;
@@ -594,6 +648,7 @@ public:
tNodeArray m_nodes; // Nodes
tLinkArray m_links; // Links
tFaceArray m_faces; // Faces
+ tTetraArray m_tetras; // Tetras
tAnchorArray m_anchors; // Anchors
tRContactArray m_rcontacts; // Rigid contacts
tSContactArray m_scontacts; // Soft contacts
@@ -611,14 +666,19 @@ public:
btTransform m_initialWorldTransform;
+ btVector3 m_windVelocity;
//
// Api
//
/* ctor */
- btSoftBody( btSoftBodyWorldInfo* worldInfo,int node_count,
- const btVector3* x,
- const btScalar* m);
+ btSoftBody( btSoftBodyWorldInfo* worldInfo,int node_count, const btVector3* x, const btScalar* m);
+
+ /* ctor */
+ btSoftBody( btSoftBodyWorldInfo* worldInfo);
+
+ void initDefaults();
+
/* dtor */
virtual ~btSoftBody();
/* Check for existing link */
@@ -681,9 +741,19 @@ public:
int node1,
int node2,
Material* mat=0);
+ void appendTetra(int model,Material* mat);
+ //
+ void appendTetra(int node0,
+ int node1,
+ int node2,
+ int node3,
+ Material* mat=0);
+
+
/* Append anchor */
void appendAnchor( int node,
btRigidBody* body, bool disableCollisionBetweenLinkedBodies=false);
+ void appendAnchor(int node,btRigidBody* body, const btVector3& localPivot,bool disableCollisionBetweenLinkedBodies=false);
/* Append linear joint */
void appendLinearJoint(const LJoint::Specs& specs,Cluster* body0,Body body1);
void appendLinearJoint(const LJoint::Specs& specs,Body body=Body());
@@ -718,6 +788,10 @@ public:
bool fromfaces=false);
/* Set total density */
void setTotalDensity(btScalar density);
+ /* Set volume mass (using tetrahedrons) */
+ void setVolumeMass( btScalar mass);
+ /* Set volume density (using tetrahedrons) */
+ void setVolumeDensity( btScalar density);
/* Transform */
void transform( const btTransform& trs);
/* Translate */
@@ -755,6 +829,8 @@ public:
void releaseCluster(int index);
void releaseClusters();
/* Generate clusters (K-mean) */
+ ///generateClusters with k=0 will create a convex cluster for each tetrahedron or triangle
+ ///otherwise an approximation will be used (better performance)
int generateClusters(int k,int maxiterations=8192);
/* Refine */
void refine(ImplicitFn* ifn,btScalar accurary,bool cut);
@@ -784,6 +860,49 @@ public:
void defaultCollisionHandler(btCollisionObject* pco);
void defaultCollisionHandler(btSoftBody* psb);
+
+
+ //
+ // Functionality to deal with new accelerated solvers.
+ //
+
+ /**
+ * Set a wind velocity for interaction with the air.
+ */
+ void setWindVelocity( const btVector3 &velocity );
+
+
+ /**
+ * Return the wind velocity for interaction with the air.
+ */
+ const btVector3& getWindVelocity();
+
+ //
+ // Set the solver that handles this soft body
+ // Should not be allowed to get out of sync with reality
+ // Currently called internally on addition to the world
+ void setSoftBodySolver( btSoftBodySolver *softBodySolver )
+ {
+ m_softBodySolver = softBodySolver;
+ }
+
+ //
+ // Return the solver that handles this soft body
+ //
+ btSoftBodySolver *getSoftBodySolver()
+ {
+ return m_softBodySolver;
+ }
+
+ //
+ // Return the solver that handles this soft body
+ //
+ btSoftBodySolver *getSoftBodySolver() const
+ {
+ return m_softBodySolver;
+ }
+
+
//
// Cast
//
@@ -841,8 +960,18 @@ public:
static psolver_t getSolver(ePSolver::_ solver);
static vsolver_t getSolver(eVSolver::_ solver);
+
+ virtual int calculateSerializeBufferSize() const;
+
+ ///fills the dataBuffer and returns the struct name (and 0 on failure)
+ virtual const char* serialize(void* dataBuffer, class btSerializer* serializer) const;
+
+ //virtual void serializeSingleObject(class btSerializer* serializer) const;
+
+
};
+
#endif //_BT_SOFT_BODY_H
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp b/extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
index f334e15e0d3..04ee7ea77cf 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp
@@ -95,9 +95,9 @@ void btSoftBodyTriangleCallback::processTriangle(btVector3* triangle,int partId,
ci.m_dispatcher1 = m_dispatcher;
///debug drawing of the overlapping triangles
- if (m_dispatchInfoPtr && m_dispatchInfoPtr->m_debugDraw && m_dispatchInfoPtr->m_debugDraw->getDebugMode() > 0)
+ if (m_dispatchInfoPtr && m_dispatchInfoPtr->m_debugDraw && m_dispatchInfoPtr->m_debugDraw->getDebugMode() &btIDebugDraw::DBG_DrawWireframe)
{
- btVector3 color(255,255,0);
+ btVector3 color(1,1,0);
btTransform& tr = ob->getWorldTransform();
m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]),tr(triangle[1]),color);
m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]),tr(triangle[2]),color);
@@ -168,8 +168,7 @@ void btSoftBodyTriangleCallback::processTriangle(btVector3* triangle,int partId,
///this should use the btDispatcher, so the actual registered algorithm is used
// btConvexConvexAlgorithm cvxcvxalgo(m_manifoldPtr,ci,m_convexBody,m_triBody);
- //m_resultOut->setShapeIdentifiers(-1,-1,partId,triangleIndex);
- // cvxcvxalgo.setShapeIdentifiers(-1,-1,partId,triangleIndex);
+ //m_resultOut->setShapeIdentifiersB(partId,triangleIndex);
// cvxcvxalgo.processCollision(m_convexBody,m_triBody,*m_dispatchInfoPtr,m_resultOut);
colAlgo->processCollision(m_softBody,m_triBody,*m_dispatchInfoPtr,m_resultOut);
colAlgo->~btCollisionAlgorithm();
@@ -219,7 +218,7 @@ void btSoftBodyConcaveCollisionAlgorithm::processCollision (btCollisionObject* b
{
- btCollisionObject* convexBody = m_isSwapped ? body1 : body0;
+ //btCollisionObject* convexBody = m_isSwapped ? body1 : body0;
btCollisionObject* triBody = m_isSwapped ? body0 : body1;
if (triBody->getCollisionShape()->isConcave())
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBodyData.h b/extern/bullet2/src/BulletSoftBody/btSoftBodyData.h
new file mode 100644
index 00000000000..40dc65c3d8c
--- /dev/null
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBodyData.h
@@ -0,0 +1,217 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef BT_SOFTBODY_FLOAT_DATA
+#define BT_SOFTBODY_FLOAT_DATA
+
+#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
+
+
+
+struct SoftBodyMaterialData
+{
+ float m_linearStiffness;
+ float m_angularStiffness;
+ float m_volumeStiffness;
+ int m_flags;
+};
+
+struct SoftBodyNodeData
+{
+ SoftBodyMaterialData *m_material;
+ btVector3FloatData m_position;
+ btVector3FloatData m_previousPosition;
+ btVector3FloatData m_velocity;
+ btVector3FloatData m_accumulatedForce;
+ btVector3FloatData m_normal;
+ float m_inverseMass;
+ float m_area;
+ int m_attach;
+ int m_pad;
+};
+
+struct SoftBodyLinkData
+{
+ SoftBodyMaterialData *m_material;
+ int m_nodeIndices[2]; // Node pointers
+ float m_restLength; // Rest length
+ int m_bbending; // Bending link
+};
+
+struct SoftBodyFaceData
+{
+ btVector3FloatData m_normal; // Normal
+ SoftBodyMaterialData *m_material;
+ int m_nodeIndices[3]; // Node pointers
+ float m_restArea; // Rest area
+};
+
+struct SoftBodyTetraData
+{
+ btVector3FloatData m_c0[4]; // gradients
+ SoftBodyMaterialData *m_material;
+ int m_nodeIndices[4]; // Node pointers
+ float m_restVolume; // Rest volume
+ float m_c1; // (4*kVST)/(im0+im1+im2+im3)
+ float m_c2; // m_c1/sum(|g0..3|^2)
+ int m_pad;
+};
+
+struct SoftRigidAnchorData
+{
+ btMatrix3x3FloatData m_c0; // Impulse matrix
+ btVector3FloatData m_c1; // Relative anchor
+ btVector3FloatData m_localFrame; // Anchor position in body space
+ btRigidBodyData *m_rigidBody;
+ int m_nodeIndex; // Node pointer
+ float m_c2; // ima*dt
+};
+
+
+
+struct SoftBodyConfigData
+{
+ int m_aeroModel; // Aerodynamic model (default: V_Point)
+ float m_baumgarte; // Velocities correction factor (Baumgarte)
+ float m_damping; // Damping coefficient [0,1]
+ float m_drag; // Drag coefficient [0,+inf]
+ float m_lift; // Lift coefficient [0,+inf]
+ float m_pressure; // Pressure coefficient [-inf,+inf]
+ float m_volume; // Volume conversation coefficient [0,+inf]
+ float m_dynamicFriction; // Dynamic friction coefficient [0,1]
+ float m_poseMatch; // Pose matching coefficient [0,1]
+ float m_rigidContactHardness; // Rigid contacts hardness [0,1]
+ float m_kineticContactHardness; // Kinetic contacts hardness [0,1]
+ float m_softContactHardness; // Soft contacts hardness [0,1]
+ float m_anchorHardness; // Anchors hardness [0,1]
+ float m_softRigidClusterHardness; // Soft vs rigid hardness [0,1] (cluster only)
+ float m_softKineticClusterHardness; // Soft vs kinetic hardness [0,1] (cluster only)
+ float m_softSoftClusterHardness; // Soft vs soft hardness [0,1] (cluster only)
+ float m_softRigidClusterImpulseSplit; // Soft vs rigid impulse split [0,1] (cluster only)
+ float m_softKineticClusterImpulseSplit; // Soft vs rigid impulse split [0,1] (cluster only)
+ float m_softSoftClusterImpulseSplit; // Soft vs rigid impulse split [0,1] (cluster only)
+ float m_maxVolume; // Maximum volume ratio for pose
+ float m_timeScale; // Time scale
+ int m_velocityIterations; // Velocities solver iterations
+ int m_positionIterations; // Positions solver iterations
+ int m_driftIterations; // Drift solver iterations
+ int m_clusterIterations; // Cluster solver iterations
+ int m_collisionFlags; // Collisions flags
+};
+
+struct SoftBodyPoseData
+{
+ btMatrix3x3FloatData m_rot; // Rotation
+ btMatrix3x3FloatData m_scale; // Scale
+ btMatrix3x3FloatData m_aqq; // Base scaling
+ btVector3FloatData m_com; // COM
+
+ btVector3FloatData *m_positions; // Reference positions
+ float *m_weights; // Weights
+ int m_numPositions;
+ int m_numWeigts;
+
+ int m_bvolume; // Is valid
+ int m_bframe; // Is frame
+ float m_restVolume; // Rest volume
+ int m_pad;
+};
+
+struct SoftBodyClusterData
+{
+ btTransformFloatData m_framexform;
+ btMatrix3x3FloatData m_locii;
+ btMatrix3x3FloatData m_invwi;
+ btVector3FloatData m_com;
+ btVector3FloatData m_vimpulses[2];
+ btVector3FloatData m_dimpulses[2];
+ btVector3FloatData m_lv;
+ btVector3FloatData m_av;
+
+ btVector3FloatData *m_framerefs;
+ int *m_nodeIndices;
+ float *m_masses;
+
+ int m_numFrameRefs;
+ int m_numNodes;
+ int m_numMasses;
+
+ float m_idmass;
+ float m_imass;
+ int m_nvimpulses;
+ int m_ndimpulses;
+ float m_ndamping;
+ float m_ldamping;
+ float m_adamping;
+ float m_matching;
+ float m_maxSelfCollisionImpulse;
+ float m_selfCollisionImpulseFactor;
+ int m_containsAnchor;
+ int m_collide;
+ int m_clusterIndex;
+};
+
+
+enum btSoftJointBodyType
+{
+ BT_JOINT_SOFT_BODY_CLUSTER=1,
+ BT_JOINT_RIGID_BODY,
+ BT_JOINT_COLLISION_OBJECT
+};
+
+struct btSoftBodyJointData
+{
+ void *m_bodyA;
+ void *m_bodyB;
+ btVector3FloatData m_refs[2];
+ float m_cfm;
+ float m_erp;
+ float m_split;
+ int m_delete;
+ btVector3FloatData m_relPosition[2];//linear
+ int m_bodyAtype;
+ int m_bodyBtype;
+ int m_jointType;
+ int m_pad;
+};
+
+///do not change those serialization structures, it requires an updated sBulletDNAstr/sBulletDNAstr64
+struct btSoftBodyFloatData
+{
+ btCollisionObjectFloatData m_collisionObjectData;
+
+ SoftBodyPoseData *m_pose;
+ SoftBodyMaterialData **m_materials;
+ SoftBodyNodeData *m_nodes;
+ SoftBodyLinkData *m_links;
+ SoftBodyFaceData *m_faces;
+ SoftBodyTetraData *m_tetrahedra;
+ SoftRigidAnchorData *m_anchors;
+ SoftBodyClusterData *m_clusters;
+ btSoftBodyJointData *m_joints;
+
+ int m_numMaterials;
+ int m_numNodes;
+ int m_numLinks;
+ int m_numFaces;
+ int m_numTetrahedra;
+ int m_numAnchors;
+ int m_numClusters;
+ int m_numJoints;
+ SoftBodyConfigData m_config;
+};
+
+#endif //BT_SOFTBODY_FLOAT_DATA
+
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp b/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp
index 61aac5b4ce5..1a271066497 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.cpp
@@ -130,7 +130,7 @@ static inline btScalar tetravolume(const btVector3& x0,
const btVector3 a=x1-x0;
const btVector3 b=x2-x0;
const btVector3 c=x3-x0;
- return(dot(a,cross(b,c)));
+ return(btDot(a,btCross(b,c)));
}
//
@@ -165,98 +165,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
const btVector3 ccolor=btVector3(1,0,0);
int i,j,nj;
- /* Nodes */
- if(0!=(drawflags&fDrawFlags::Nodes))
- {
- for(i=0;i<psb->m_nodes.size();++i)
- {
- const btSoftBody::Node& n=psb->m_nodes[i];
- if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- idraw->drawLine(n.m_x-btVector3(scl,0,0),n.m_x+btVector3(scl,0,0),btVector3(1,0,0));
- idraw->drawLine(n.m_x-btVector3(0,scl,0),n.m_x+btVector3(0,scl,0),btVector3(0,1,0));
- idraw->drawLine(n.m_x-btVector3(0,0,scl),n.m_x+btVector3(0,0,scl),btVector3(0,0,1));
- }
- }
- /* Links */
- if(0!=(drawflags&fDrawFlags::Links))
- {
- for(i=0;i<psb->m_links.size();++i)
- {
- const btSoftBody::Link& l=psb->m_links[i];
- if(0==(l.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- idraw->drawLine(l.m_n[0]->m_x,l.m_n[1]->m_x,lcolor);
- }
- }
- /* Normals */
- if(0!=(drawflags&fDrawFlags::Normals))
- {
- for(i=0;i<psb->m_nodes.size();++i)
- {
- const btSoftBody::Node& n=psb->m_nodes[i];
- if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- const btVector3 d=n.m_n*nscl;
- idraw->drawLine(n.m_x,n.m_x+d,ncolor);
- idraw->drawLine(n.m_x,n.m_x-d,ncolor*0.5);
- }
- }
- /* Contacts */
- if(0!=(drawflags&fDrawFlags::Contacts))
- {
- static const btVector3 axis[]={btVector3(1,0,0),
- btVector3(0,1,0),
- btVector3(0,0,1)};
- for(i=0;i<psb->m_rcontacts.size();++i)
- {
- const btSoftBody::RContact& c=psb->m_rcontacts[i];
- const btVector3 o= c.m_node->m_x-c.m_cti.m_normal*
- (dot(c.m_node->m_x,c.m_cti.m_normal)+c.m_cti.m_offset);
- const btVector3 x=cross(c.m_cti.m_normal,axis[c.m_cti.m_normal.minAxis()]).normalized();
- const btVector3 y=cross(x,c.m_cti.m_normal).normalized();
- idraw->drawLine(o-x*nscl,o+x*nscl,ccolor);
- idraw->drawLine(o-y*nscl,o+y*nscl,ccolor);
- idraw->drawLine(o,o+c.m_cti.m_normal*nscl*3,btVector3(1,1,0));
- }
- }
- /* Anchors */
- if(0!=(drawflags&fDrawFlags::Anchors))
- {
- for(i=0;i<psb->m_anchors.size();++i)
- {
- const btSoftBody::Anchor& a=psb->m_anchors[i];
- const btVector3 q=a.m_body->getWorldTransform()*a.m_local;
- drawVertex(idraw,a.m_node->m_x,0.25,btVector3(1,0,0));
- drawVertex(idraw,q,0.25,btVector3(0,1,0));
- idraw->drawLine(a.m_node->m_x,q,btVector3(1,1,1));
- }
- for(i=0;i<psb->m_nodes.size();++i)
- {
- const btSoftBody::Node& n=psb->m_nodes[i];
- if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- if(n.m_im<=0)
- {
- drawVertex(idraw,n.m_x,0.25,btVector3(1,0,0));
- }
- }
- }
- /* Faces */
- if(0!=(drawflags&fDrawFlags::Faces))
- {
- const btScalar scl=(btScalar)0.8;
- const btScalar alp=(btScalar)1;
- const btVector3 col(0,(btScalar)0.7,0);
- for(i=0;i<psb->m_faces.size();++i)
- {
- const btSoftBody::Face& f=psb->m_faces[i];
- if(0==(f.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
- const btVector3 x[]={f.m_n[0]->m_x,f.m_n[1]->m_x,f.m_n[2]->m_x};
- const btVector3 c=(x[0]+x[1]+x[2])/3;
- idraw->drawTriangle((x[0]-c)*scl+c,
- (x[1]-c)*scl+c,
- (x[2]-c)*scl+c,
- col,alp);
- }
- }
- /* Clusters */
+ /* Clusters */
if(0!=(drawflags&fDrawFlags::Clusters))
{
srand(1806);
@@ -299,17 +208,131 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
{
const btSoftBody::Cluster& c=psb->m_clusters[i];
const btVector3 r=c.m_nodes[j]->m_x-c.m_com;
- const btVector3 v=c.m_lv+cross(c.m_av,r);
+ const btVector3 v=c.m_lv+btCross(c.m_av,r);
idraw->drawLine(c.m_nodes[j]->m_x,c.m_nodes[j]->m_x+v,btVector3(1,0,0));
}
#endif
/* Frame */
- btSoftBody::Cluster& c=*psb->m_clusters[i];
- idraw->drawLine(c.m_com,c.m_framexform*btVector3(10,0,0),btVector3(1,0,0));
- idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,10,0),btVector3(0,1,0));
- idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,0,10),btVector3(0,0,1));
+ // btSoftBody::Cluster& c=*psb->m_clusters[i];
+ // idraw->drawLine(c.m_com,c.m_framexform*btVector3(10,0,0),btVector3(1,0,0));
+ // idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,10,0),btVector3(0,1,0));
+ // idraw->drawLine(c.m_com,c.m_framexform*btVector3(0,0,10),btVector3(0,0,1));
}
}
+ else
+ {
+ /* Nodes */
+ if(0!=(drawflags&fDrawFlags::Nodes))
+ {
+ for(i=0;i<psb->m_nodes.size();++i)
+ {
+ const btSoftBody::Node& n=psb->m_nodes[i];
+ if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
+ idraw->drawLine(n.m_x-btVector3(scl,0,0),n.m_x+btVector3(scl,0,0),btVector3(1,0,0));
+ idraw->drawLine(n.m_x-btVector3(0,scl,0),n.m_x+btVector3(0,scl,0),btVector3(0,1,0));
+ idraw->drawLine(n.m_x-btVector3(0,0,scl),n.m_x+btVector3(0,0,scl),btVector3(0,0,1));
+ }
+ }
+ /* Links */
+ if(0!=(drawflags&fDrawFlags::Links))
+ {
+ for(i=0;i<psb->m_links.size();++i)
+ {
+ const btSoftBody::Link& l=psb->m_links[i];
+ if(0==(l.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
+ idraw->drawLine(l.m_n[0]->m_x,l.m_n[1]->m_x,lcolor);
+ }
+ }
+ /* Normals */
+ if(0!=(drawflags&fDrawFlags::Normals))
+ {
+ for(i=0;i<psb->m_nodes.size();++i)
+ {
+ const btSoftBody::Node& n=psb->m_nodes[i];
+ if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
+ const btVector3 d=n.m_n*nscl;
+ idraw->drawLine(n.m_x,n.m_x+d,ncolor);
+ idraw->drawLine(n.m_x,n.m_x-d,ncolor*0.5);
+ }
+ }
+ /* Contacts */
+ if(0!=(drawflags&fDrawFlags::Contacts))
+ {
+ static const btVector3 axis[]={btVector3(1,0,0),
+ btVector3(0,1,0),
+ btVector3(0,0,1)};
+ for(i=0;i<psb->m_rcontacts.size();++i)
+ {
+ const btSoftBody::RContact& c=psb->m_rcontacts[i];
+ const btVector3 o= c.m_node->m_x-c.m_cti.m_normal*
+ (btDot(c.m_node->m_x,c.m_cti.m_normal)+c.m_cti.m_offset);
+ const btVector3 x=btCross(c.m_cti.m_normal,axis[c.m_cti.m_normal.minAxis()]).normalized();
+ const btVector3 y=btCross(x,c.m_cti.m_normal).normalized();
+ idraw->drawLine(o-x*nscl,o+x*nscl,ccolor);
+ idraw->drawLine(o-y*nscl,o+y*nscl,ccolor);
+ idraw->drawLine(o,o+c.m_cti.m_normal*nscl*3,btVector3(1,1,0));
+ }
+ }
+ /* Faces */
+ if(0!=(drawflags&fDrawFlags::Faces))
+ {
+ const btScalar scl=(btScalar)0.8;
+ const btScalar alp=(btScalar)1;
+ const btVector3 col(0,(btScalar)0.7,0);
+ for(i=0;i<psb->m_faces.size();++i)
+ {
+ const btSoftBody::Face& f=psb->m_faces[i];
+ if(0==(f.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
+ const btVector3 x[]={f.m_n[0]->m_x,f.m_n[1]->m_x,f.m_n[2]->m_x};
+ const btVector3 c=(x[0]+x[1]+x[2])/3;
+ idraw->drawTriangle((x[0]-c)*scl+c,
+ (x[1]-c)*scl+c,
+ (x[2]-c)*scl+c,
+ col,alp);
+ }
+ }
+ /* Tetras */
+ if(0!=(drawflags&fDrawFlags::Tetras))
+ {
+ const btScalar scl=(btScalar)0.8;
+ const btScalar alp=(btScalar)1;
+ const btVector3 col((btScalar)0.7,(btScalar)0.7,(btScalar)0.7);
+ for(int i=0;i<psb->m_tetras.size();++i)
+ {
+ const btSoftBody::Tetra& t=psb->m_tetras[i];
+ if(0==(t.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
+ const btVector3 x[]={t.m_n[0]->m_x,t.m_n[1]->m_x,t.m_n[2]->m_x,t.m_n[3]->m_x};
+ const btVector3 c=(x[0]+x[1]+x[2]+x[3])/4;
+ idraw->drawTriangle((x[0]-c)*scl+c,(x[1]-c)*scl+c,(x[2]-c)*scl+c,col,alp);
+ idraw->drawTriangle((x[0]-c)*scl+c,(x[1]-c)*scl+c,(x[3]-c)*scl+c,col,alp);
+ idraw->drawTriangle((x[1]-c)*scl+c,(x[2]-c)*scl+c,(x[3]-c)*scl+c,col,alp);
+ idraw->drawTriangle((x[2]-c)*scl+c,(x[0]-c)*scl+c,(x[3]-c)*scl+c,col,alp);
+ }
+ }
+ }
+ /* Anchors */
+ if(0!=(drawflags&fDrawFlags::Anchors))
+ {
+ for(i=0;i<psb->m_anchors.size();++i)
+ {
+ const btSoftBody::Anchor& a=psb->m_anchors[i];
+ const btVector3 q=a.m_body->getWorldTransform()*a.m_local;
+ drawVertex(idraw,a.m_node->m_x,0.25,btVector3(1,0,0));
+ drawVertex(idraw,q,0.25,btVector3(0,1,0));
+ idraw->drawLine(a.m_node->m_x,q,btVector3(1,1,1));
+ }
+ for(i=0;i<psb->m_nodes.size();++i)
+ {
+ const btSoftBody::Node& n=psb->m_nodes[i];
+ if(0==(n.m_material->m_flags&btSoftBody::fMaterial::DebugDraw)) continue;
+ if(n.m_im<=0)
+ {
+ drawVertex(idraw,n.m_x,0.25,btVector3(1,0,0));
+ }
+ }
+ }
+
+
/* Notes */
if(0!=(drawflags&fDrawFlags::Notes))
{
@@ -351,7 +374,7 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
break;
case btSoftBody::Joint::eType::Angular:
{
- const btSoftBody::AJoint* pja=(const btSoftBody::AJoint*)pj;
+ //const btSoftBody::AJoint* pja=(const btSoftBody::AJoint*)pj;
const btVector3 o0=pj->m_bodies[0].xform().getOrigin();
const btVector3 o1=pj->m_bodies[1].xform().getOrigin();
const btVector3 a0=pj->m_bodies[0].xform().getBasis()*pj->m_refs[0];
@@ -360,7 +383,12 @@ void btSoftBodyHelpers::Draw( btSoftBody* psb,
idraw->drawLine(o0,o0+a1*10,btVector3(1,1,0));
idraw->drawLine(o1,o1+a0*10,btVector3(0,1,1));
idraw->drawLine(o1,o1+a1*10,btVector3(0,1,1));
+ break;
+ }
+ default:
+ {
}
+
}
}
}
@@ -828,10 +856,12 @@ btSoftBody* btSoftBodyHelpers::CreateFromTriMesh(btSoftBodyWorldInfo& worldInfo
#undef IDX
psb->appendFace(idx[0],idx[1],idx[2]);
}
+
if (randomizeConstraints)
{
psb->randomizeConstraints();
}
+
return(psb);
}
@@ -863,3 +893,130 @@ btSoftBody* btSoftBodyHelpers::CreateFromConvexHull(btSoftBodyWorldInfo& worldI
}
return(psb);
}
+
+
+
+
+static int nextLine(const char* buffer)
+{
+ int numBytesRead=0;
+
+ while (*buffer != '\n')
+ {
+ buffer++;
+ numBytesRead++;
+ }
+
+
+ if (buffer[0]==0x0a)
+ {
+ buffer++;
+ numBytesRead++;
+ }
+ return numBytesRead;
+}
+
+/* Create from TetGen .ele, .face, .node data */
+btSoftBody* btSoftBodyHelpers::CreateFromTetGenData(btSoftBodyWorldInfo& worldInfo,
+ const char* ele,
+ const char* face,
+ const char* node,
+ bool bfacelinks,
+ bool btetralinks,
+ bool bfacesfromtetras)
+{
+btAlignedObjectArray<btVector3> pos;
+int nnode=0;
+int ndims=0;
+int nattrb=0;
+int hasbounds=0;
+int result = sscanf(node,"%d %d %d %d",&nnode,&ndims,&nattrb,&hasbounds);
+result = sscanf(node,"%d %d %d %d",&nnode,&ndims,&nattrb,&hasbounds);
+node += nextLine(node);
+
+pos.resize(nnode);
+for(int i=0;i<pos.size();++i)
+ {
+ int index=0;
+ //int bound=0;
+ float x,y,z;
+ sscanf(node,"%d %f %f %f",&index,&x,&y,&z);
+
+// sn>>index;
+// sn>>x;sn>>y;sn>>z;
+ node += nextLine(node);
+
+ //for(int j=0;j<nattrb;++j)
+ // sn>>a;
+
+ //if(hasbounds)
+ // sn>>bound;
+
+ pos[index].setX(btScalar(x));
+ pos[index].setY(btScalar(y));
+ pos[index].setZ(btScalar(z));
+ }
+btSoftBody* psb=new btSoftBody(&worldInfo,nnode,&pos[0],0);
+#if 0
+if(face&&face[0])
+ {
+ int nface=0;
+ sf>>nface;sf>>hasbounds;
+ for(int i=0;i<nface;++i)
+ {
+ int index=0;
+ int bound=0;
+ int ni[3];
+ sf>>index;
+ sf>>ni[0];sf>>ni[1];sf>>ni[2];
+ sf>>bound;
+ psb->appendFace(ni[0],ni[1],ni[2]);
+ if(btetralinks)
+ {
+ psb->appendLink(ni[0],ni[1],0,true);
+ psb->appendLink(ni[1],ni[2],0,true);
+ psb->appendLink(ni[2],ni[0],0,true);
+ }
+ }
+ }
+#endif
+
+if(ele&&ele[0])
+ {
+ int ntetra=0;
+ int ncorner=0;
+ int neattrb=0;
+ sscanf(ele,"%d %d %d",&ntetra,&ncorner,&neattrb);
+ ele += nextLine(ele);
+
+ //se>>ntetra;se>>ncorner;se>>neattrb;
+ for(int i=0;i<ntetra;++i)
+ {
+ int index=0;
+ int ni[4];
+
+ //se>>index;
+ //se>>ni[0];se>>ni[1];se>>ni[2];se>>ni[3];
+ sscanf(ele,"%d %d %d %d %d",&index,&ni[0],&ni[1],&ni[2],&ni[3]);
+ ele+=nextLine(ele);
+ //for(int j=0;j<neattrb;++j)
+ // se>>a;
+ psb->appendTetra(ni[0],ni[1],ni[2],ni[3]);
+ if(btetralinks)
+ {
+ psb->appendLink(ni[0],ni[1],0,true);
+ psb->appendLink(ni[1],ni[2],0,true);
+ psb->appendLink(ni[2],ni[0],0,true);
+ psb->appendLink(ni[0],ni[3],0,true);
+ psb->appendLink(ni[1],ni[3],0,true);
+ psb->appendLink(ni[2],ni[3],0,true);
+ }
+ }
+ }
+printf("Nodes: %u\r\n",psb->m_nodes.size());
+printf("Links: %u\r\n",psb->m_links.size());
+printf("Faces: %u\r\n",psb->m_faces.size());
+printf("Tetras: %u\r\n",psb->m_tetras.size());
+return(psb);
+}
+
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.h b/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.h
index 5eb2ebc0735..49b1f0bbce8 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.h
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBodyHelpers.h
@@ -110,12 +110,34 @@ struct btSoftBodyHelpers
const btScalar* vertices,
const int* triangles,
int ntriangles,
- bool randomizeConstraints = true);
+ bool randomizeConstraints = true);
/* Create from convex-hull */
static btSoftBody* CreateFromConvexHull( btSoftBodyWorldInfo& worldInfo,
const btVector3* vertices,
int nvertices,
- bool randomizeConstraints = true);
+ bool randomizeConstraints = true);
+
+
+ /* Export TetGen compatible .smesh file */
+// static void ExportAsSMeshFile( btSoftBody* psb,
+// const char* filename);
+ /* Create from TetGen .ele, .face, .node files */
+// static btSoftBody* CreateFromTetGenFile( btSoftBodyWorldInfo& worldInfo,
+// const char* ele,
+// const char* face,
+// const char* node,
+// bool bfacelinks,
+// bool btetralinks,
+// bool bfacesfromtetras);
+ /* Create from TetGen .ele, .face, .node data */
+ static btSoftBody* CreateFromTetGenData( btSoftBodyWorldInfo& worldInfo,
+ const char* ele,
+ const char* face,
+ const char* node,
+ bool bfacelinks,
+ bool btetralinks,
+ bool bfacesfromtetras);
+
};
#endif //SOFT_BODY_HELPERS_H
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h b/extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h
index 5f0f7d54318..885571069d0 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBodyInternals.h
@@ -19,12 +19,13 @@ subject to the following restrictions:
#include "btSoftBody.h"
+
#include "LinearMath/btQuickprof.h"
#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
#include "BulletCollision/CollisionShapes/btConvexInternalShape.h"
#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h"
-
+#include <string.h> //for memset
//
// btSymMatrix
//
@@ -124,11 +125,11 @@ public:
virtual btVector3 localGetSupportingVertex(const btVector3& vec) const
{
btSoftBody::Node* const * n=&m_cluster->m_nodes[0];
- btScalar d=dot(vec,n[0]->m_x);
+ btScalar d=btDot(vec,n[0]->m_x);
int j=0;
for(int i=1,ni=m_cluster->m_nodes.size();i<ni;++i)
{
- const btScalar k=dot(vec,n[i]->m_x);
+ const btScalar k=btDot(vec,n[i]->m_x);
if(k>d) { d=k;j=i; }
}
return(n[j]->m_x);
@@ -171,8 +172,7 @@ public:
template <typename T>
static inline void ZeroInitialize(T& value)
{
- static const T zerodummy;
- value=zerodummy;
+ memset(&value,0,sizeof(T));
}
//
template <typename T>
@@ -296,9 +296,9 @@ static inline btMatrix3x3 Mul(const btMatrix3x3& a,
//
static inline void Orthogonalize(btMatrix3x3& m)
{
- m[2]=cross(m[0],m[1]).normalized();
- m[1]=cross(m[2],m[0]).normalized();
- m[0]=cross(m[1],m[2]).normalized();
+ m[2]=btCross(m[0],m[1]).normalized();
+ m[1]=btCross(m[2],m[0]).normalized();
+ m[0]=btCross(m[1],m[2]).normalized();
}
//
static inline btMatrix3x3 MassMatrix(btScalar im,const btMatrix3x3& iwi,const btVector3& r)
@@ -335,7 +335,7 @@ static inline btMatrix3x3 AngularImpulseMatrix( const btMatrix3x3& iia,
static inline btVector3 ProjectOnAxis( const btVector3& v,
const btVector3& a)
{
- return(a*dot(v,a));
+ return(a*btDot(v,a));
}
//
static inline btVector3 ProjectOnPlane( const btVector3& v,
@@ -354,7 +354,7 @@ static inline void ProjectOrigin( const btVector3& a,
const btScalar m2=d.length2();
if(m2>SIMD_EPSILON)
{
- const btScalar t=Clamp<btScalar>(-dot(a,d)/m2,0,1);
+ const btScalar t=Clamp<btScalar>(-btDot(a,d)/m2,0,1);
const btVector3 p=a+d*t;
const btScalar l2=p.length2();
if(l2<sqd)
@@ -371,19 +371,19 @@ static inline void ProjectOrigin( const btVector3& a,
btVector3& prj,
btScalar& sqd)
{
- const btVector3& q=cross(b-a,c-a);
+ const btVector3& q=btCross(b-a,c-a);
const btScalar m2=q.length2();
if(m2>SIMD_EPSILON)
{
const btVector3 n=q/btSqrt(m2);
- const btScalar k=dot(a,n);
+ const btScalar k=btDot(a,n);
const btScalar k2=k*k;
if(k2<sqd)
{
const btVector3 p=n*k;
- if( (dot(cross(a-p,b-p),q)>0)&&
- (dot(cross(b-p,c-p),q)>0)&&
- (dot(cross(c-p,a-p),q)>0))
+ if( (btDot(btCross(a-p,b-p),q)>0)&&
+ (btDot(btCross(b-p,c-p),q)>0)&&
+ (btDot(btCross(c-p,a-p),q)>0))
{
prj=p;
sqd=k2;
@@ -413,9 +413,9 @@ static inline btVector3 BaryCoord( const btVector3& a,
const btVector3& c,
const btVector3& p)
{
- const btScalar w[]={ cross(a-p,b-p).length(),
- cross(b-p,c-p).length(),
- cross(c-p,a-p).length()};
+ const btScalar w[]={ btCross(a-p,b-p).length(),
+ btCross(b-p,c-p).length(),
+ btCross(c-p,a-p).length()};
const btScalar isum=1/(w[0]+w[1]+w[2]);
return(btVector3(w[1]*isum,w[2]*isum,w[0]*isum));
}
@@ -485,7 +485,7 @@ static inline btScalar AreaOf( const btVector3& x0,
{
const btVector3 a=x1-x0;
const btVector3 b=x2-x0;
- const btVector3 cr=cross(a,b);
+ const btVector3 cr=btCross(a,b);
const btScalar area=cr.length();
return(area);
}
@@ -499,7 +499,7 @@ static inline btScalar VolumeOf( const btVector3& x0,
const btVector3 a=x1-x0;
const btVector3 b=x2-x0;
const btVector3 c=x3-x0;
- return(dot(a,cross(b,c)));
+ return(btDot(a,btCross(b,c)));
}
//
@@ -512,7 +512,7 @@ static void EvaluateMedium( const btSoftBodyWorldInfo* wfi,
medium.m_density = wfi->air_density;
if(wfi->water_density>0)
{
- const btScalar depth=-(dot(x,wfi->water_normal)+wfi->water_offset);
+ const btScalar depth=-(btDot(x,wfi->water_normal)+wfi->water_offset);
if(depth>0)
{
medium.m_density = wfi->water_density;
@@ -654,14 +654,14 @@ struct btSoftColliders
{
btScalar erp;
btScalar idt;
- btScalar margin;
+ btScalar m_margin;
btScalar friction;
btScalar threshold;
ClusterBase()
{
erp =(btScalar)1;
idt =0;
- margin =0;
+ m_margin =0;
friction =0;
threshold =(btScalar)0;
}
@@ -669,16 +669,21 @@ struct btSoftColliders
btSoftBody::Body ba,btSoftBody::Body bb,
btSoftBody::CJoint& joint)
{
- if(res.distance<margin)
+ if(res.distance<m_margin)
{
+ btVector3 norm = res.normal;
+ norm.normalize();//is it necessary?
+
const btVector3 ra=res.witnesses[0]-ba.xform().getOrigin();
const btVector3 rb=res.witnesses[1]-bb.xform().getOrigin();
const btVector3 va=ba.velocity(ra);
const btVector3 vb=bb.velocity(rb);
const btVector3 vrel=va-vb;
- const btScalar rvac=dot(vrel,res.normal);
- const btScalar depth=res.distance-margin;
- const btVector3 iv=res.normal*rvac;
+ const btScalar rvac=btDot(vrel,norm);
+ btScalar depth=res.distance-m_margin;
+
+// printf("depth=%f\n",depth);
+ const btVector3 iv=norm*rvac;
const btVector3 fv=vrel-iv;
joint.m_bodies[0] = ba;
joint.m_bodies[1] = bb;
@@ -691,12 +696,16 @@ struct btSoftColliders
joint.m_life = 0;
joint.m_maxlife = 0;
joint.m_split = 1;
- joint.m_drift = depth*res.normal;
- joint.m_normal = res.normal;
+
+ joint.m_drift = depth*norm;
+
+ joint.m_normal = norm;
+// printf("normal=%f,%f,%f\n",res.normal.getX(),res.normal.getY(),res.normal.getZ());
joint.m_delete = false;
joint.m_friction = fv.length2()<(-rvac*friction)?1:friction;
joint.m_massmatrix = ImpulseMatrix( ba.invMass(),ba.invWorldInertia(),joint.m_rpos[0],
bb.invMass(),bb.invWorldInertia(),joint.m_rpos[1]);
+
return(true);
}
return(false);
@@ -714,10 +723,16 @@ struct btSoftColliders
{
btSoftBody::Cluster* cluster=(btSoftBody::Cluster*)leaf->data;
btSoftClusterCollisionShape cshape(cluster);
+
const btConvexShape* rshape=(const btConvexShape*)m_colObj->getCollisionShape();
+
+ ///don't collide an anchored cluster with a static/kinematic object
+ if(m_colObj->isStaticOrKinematicObject() && cluster->m_containsAnchor)
+ return;
+
btGjkEpaSolver2::sResults res;
if(btGjkEpaSolver2::SignedDistance( &cshape,btTransform::getIdentity(),
- rshape,m_colObj->getInterpolationWorldTransform(),
+ rshape,m_colObj->getWorldTransform(),
btVector3(1,0,0),res))
{
btSoftBody::CJoint joint;
@@ -743,16 +758,16 @@ struct btSoftColliders
psb = ps;
m_colObj = colOb;
idt = ps->m_sst.isdt;
- margin = m_colObj->getCollisionShape()->getMargin();
+ m_margin = m_colObj->getCollisionShape()->getMargin()+psb->getCollisionShape()->getMargin();
///Bullet rigid body uses multiply instead of minimum to determine combined friction. Some customization would be useful.
friction = btMin(psb->m_cfg.kDF,m_colObj->getFriction());
btVector3 mins;
btVector3 maxs;
ATTRIBUTE_ALIGNED16(btDbvtVolume) volume;
- colOb->getCollisionShape()->getAabb(colOb->getInterpolationWorldTransform(),mins,maxs);
+ colOb->getCollisionShape()->getAabb(colOb->getWorldTransform(),mins,maxs);
volume=btDbvtVolume::FromMM(mins,maxs);
- volume.Expand(btVector3(1,1,1)*margin);
+ volume.Expand(btVector3(1,1,1)*m_margin);
ps->m_cdbvt.collideTV(ps->m_cdbvt.m_root,volume,*this);
}
};
@@ -803,7 +818,8 @@ struct btSoftColliders
void Process(btSoftBody* psa,btSoftBody* psb)
{
idt = psa->m_sst.isdt;
- margin = (psa->getCollisionShape()->getMargin()+psb->getCollisionShape()->getMargin())/2;
+ //m_margin = (psa->getCollisionShape()->getMargin()+psb->getCollisionShape()->getMargin())/2;
+ m_margin = (psa->getCollisionShape()->getMargin()+psb->getCollisionShape()->getMargin());
friction = btMin(psa->m_cfg.kDF,psb->m_cfg.kDF);
bodies[0] = psa;
bodies[1] = psb;
@@ -832,14 +848,14 @@ struct btSoftColliders
const btScalar ms=ima+imb;
if(ms>0)
{
- const btTransform& wtr=m_rigidBody?m_rigidBody->getInterpolationWorldTransform() : m_colObj1->getWorldTransform();
+ const btTransform& wtr=m_rigidBody?m_rigidBody->getWorldTransform() : m_colObj1->getWorldTransform();
static const btMatrix3x3 iwiStatic(0,0,0,0,0,0,0,0,0);
const btMatrix3x3& iwi=m_rigidBody?m_rigidBody->getInvInertiaTensorWorld() : iwiStatic;
const btVector3 ra=n.m_x-wtr.getOrigin();
const btVector3 va=m_rigidBody ? m_rigidBody->getVelocityInLocalPoint(ra)*psb->m_sst.sdt : btVector3(0,0,0);
const btVector3 vb=n.m_x-n.m_q;
const btVector3 vr=vb-va;
- const btScalar dn=dot(vr,c.m_cti.m_normal);
+ const btScalar dn=btDot(vr,c.m_cti.m_normal);
const btVector3 fv=vr-c.m_cti.m_normal*dn;
const btScalar fc=psb->m_cfg.kDF*m_colObj1->getFriction();
c.m_node = &n;
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBodySolverVertexBuffer.h b/extern/bullet2/src/BulletSoftBody/btSoftBodySolverVertexBuffer.h
new file mode 100644
index 00000000000..c4733d64000
--- /dev/null
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBodySolverVertexBuffer.h
@@ -0,0 +1,165 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_H
+#define BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_H
+
+
+class btVertexBufferDescriptor
+{
+public:
+ enum BufferTypes
+ {
+ CPU_BUFFER,
+ DX11_BUFFER,
+ OPENGL_BUFFER
+ };
+
+protected:
+
+ bool m_hasVertexPositions;
+ bool m_hasNormals;
+
+ int m_vertexOffset;
+ int m_vertexStride;
+
+ int m_normalOffset;
+ int m_normalStride;
+
+public:
+ btVertexBufferDescriptor()
+ {
+ m_hasVertexPositions = false;
+ m_hasNormals = false;
+ m_vertexOffset = 0;
+ m_vertexStride = 0;
+ m_normalOffset = 0;
+ m_normalStride = 0;
+ }
+
+ virtual ~btVertexBufferDescriptor()
+ {
+
+ }
+
+ virtual bool hasVertexPositions() const
+ {
+ return m_hasVertexPositions;
+ }
+
+ virtual bool hasNormals() const
+ {
+ return m_hasNormals;
+ }
+
+ /**
+ * Return the type of the vertex buffer descriptor.
+ */
+ virtual BufferTypes getBufferType() const = 0;
+
+ /**
+ * Return the vertex offset in floats from the base pointer.
+ */
+ virtual int getVertexOffset() const
+ {
+ return m_vertexOffset;
+ }
+
+ /**
+ * Return the vertex stride in number of floats between vertices.
+ */
+ virtual int getVertexStride() const
+ {
+ return m_vertexStride;
+ }
+
+ /**
+ * Return the vertex offset in floats from the base pointer.
+ */
+ virtual int getNormalOffset() const
+ {
+ return m_normalOffset;
+ }
+
+ /**
+ * Return the vertex stride in number of floats between vertices.
+ */
+ virtual int getNormalStride() const
+ {
+ return m_normalStride;
+ }
+};
+
+
+class btCPUVertexBufferDescriptor : public btVertexBufferDescriptor
+{
+protected:
+ float *m_basePointer;
+
+public:
+ /**
+ * vertexBasePointer is pointer to beginning of the buffer.
+ * vertexOffset is the offset in floats to the first vertex.
+ * vertexStride is the stride in floats between vertices.
+ */
+ btCPUVertexBufferDescriptor( float *basePointer, int vertexOffset, int vertexStride )
+ {
+ m_basePointer = basePointer;
+ m_vertexOffset = vertexOffset;
+ m_vertexStride = vertexStride;
+ m_hasVertexPositions = true;
+ }
+
+ /**
+ * vertexBasePointer is pointer to beginning of the buffer.
+ * vertexOffset is the offset in floats to the first vertex.
+ * vertexStride is the stride in floats between vertices.
+ */
+ btCPUVertexBufferDescriptor( float *basePointer, int vertexOffset, int vertexStride, int normalOffset, int normalStride )
+ {
+ m_basePointer = basePointer;
+
+ m_vertexOffset = vertexOffset;
+ m_vertexStride = vertexStride;
+ m_hasVertexPositions = true;
+
+ m_normalOffset = normalOffset;
+ m_normalStride = normalStride;
+ m_hasNormals = true;
+ }
+
+ virtual ~btCPUVertexBufferDescriptor()
+ {
+
+ }
+
+ /**
+ * Return the type of the vertex buffer descriptor.
+ */
+ virtual BufferTypes getBufferType() const
+ {
+ return CPU_BUFFER;
+ }
+
+ /**
+ * Return the base pointer in memory to the first vertex.
+ */
+ virtual float *getBasePointer() const
+ {
+ return m_basePointer;
+ }
+};
+
+#endif // #ifndef BT_SOFT_BODY_SOLVER_VERTEX_BUFFER_H
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftBodySolvers.h b/extern/bullet2/src/BulletSoftBody/btSoftBodySolvers.h
new file mode 100644
index 00000000000..440084c5f7b
--- /dev/null
+++ b/extern/bullet2/src/BulletSoftBody/btSoftBodySolvers.h
@@ -0,0 +1,154 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef BT_SOFT_BODY_SOLVERS_H
+#define BT_SOFT_BODY_SOLVERS_H
+
+#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h"
+
+
+class btSoftBodyTriangleData;
+class btSoftBodyLinkData;
+class btSoftBodyVertexData;
+class btVertexBufferDescriptor;
+class btCollisionObject;
+class btSoftBody;
+
+
+class btSoftBodySolver
+{
+public:
+ enum SolverTypes
+ {
+ DEFAULT_SOLVER,
+ CPU_SOLVER,
+ CL_SOLVER,
+ CL_SIMD_SOLVER,
+ DX_SOLVER,
+ DX_SIMD_SOLVER
+ };
+
+
+protected:
+ int m_numberOfPositionIterations;
+ int m_numberOfVelocityIterations;
+ // Simulation timescale
+ float m_timeScale;
+
+public:
+ btSoftBodySolver() :
+ m_numberOfPositionIterations( 10 ),
+ m_timeScale( 1 )
+ {
+ m_numberOfVelocityIterations = 0;
+ m_numberOfPositionIterations = 5;
+ }
+
+ virtual ~btSoftBodySolver()
+ {
+ }
+
+ /**
+ * Return the type of the solver.
+ */
+ virtual SolverTypes getSolverType() const = 0;
+
+
+ /** Ensure that this solver is initialized. */
+ virtual bool checkInitialized() = 0;
+
+ /** Optimize soft bodies in this solver. */
+ virtual void optimize( btAlignedObjectArray< btSoftBody * > &softBodies , bool forceUpdate=false) = 0;
+
+ /** Copy necessary data back to the original soft body source objects. */
+ virtual void copyBackToSoftBodies() = 0;
+
+ /** Predict motion of soft bodies into next timestep */
+ virtual void predictMotion( float solverdt ) = 0;
+
+ /** Solve constraints for a set of soft bodies */
+ virtual void solveConstraints( float solverdt ) = 0;
+
+ /** Perform necessary per-step updates of soft bodies such as recomputing normals and bounding boxes */
+ virtual void updateSoftBodies() = 0;
+
+ /** Process a collision between one of the world's soft bodies and another collision object */
+ virtual void processCollision( btSoftBody *, btCollisionObject* ) = 0;
+
+ /** Process a collision between two soft bodies */
+ virtual void processCollision( btSoftBody*, btSoftBody* ) = 0;
+
+ /** Set the number of velocity constraint solver iterations this solver uses. */
+ virtual void setNumberOfPositionIterations( int iterations )
+ {
+ m_numberOfPositionIterations = iterations;
+ }
+
+ /** Get the number of velocity constraint solver iterations this solver uses. */
+ virtual int getNumberOfPositionIterations()
+ {
+ return m_numberOfPositionIterations;
+ }
+
+ /** Set the number of velocity constraint solver iterations this solver uses. */
+ virtual void setNumberOfVelocityIterations( int iterations )
+ {
+ m_numberOfVelocityIterations = iterations;
+ }
+
+ /** Get the number of velocity constraint solver iterations this solver uses. */
+ virtual int getNumberOfVelocityIterations()
+ {
+ return m_numberOfVelocityIterations;
+ }
+
+ /** Return the timescale that the simulation is using */
+ float getTimeScale()
+ {
+ return m_timeScale;
+ }
+
+#if 0
+ /**
+ * Add a collision object to be used by the indicated softbody.
+ */
+ virtual void addCollisionObjectForSoftBody( int clothIdentifier, btCollisionObject *collisionObject ) = 0;
+#endif
+};
+
+/**
+ * Class to manage movement of data from a solver to a given target.
+ * This version is abstract. Subclasses will have custom pairings for different combinations.
+ */
+class btSoftBodySolverOutput
+{
+protected:
+
+public:
+ btSoftBodySolverOutput()
+ {
+ }
+
+ virtual ~btSoftBodySolverOutput()
+ {
+ }
+
+
+ /** Output current computed vertex data to the vertex buffers for all cloths in the solver. */
+ virtual void copySoftBodyToVertexBuffer( const btSoftBody * const softBody, btVertexBufferDescriptor *vertexBuffer ) = 0;
+};
+
+
+#endif // #ifndef BT_SOFT_BODY_SOLVERS_H
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp b/extern/bullet2/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp
index 11ad9e7daba..bc374c805e7 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp
@@ -19,6 +19,8 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btBoxShape.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
#include "btSoftBody.h"
+#include "BulletSoftBody/btSoftBodySolvers.h"
+
///TODO: include all the shapes that the softbody can collide with
///alternatively, implement special case collision algorithms (just like for rigid collision shapes)
@@ -61,7 +63,7 @@ void btSoftRigidCollisionAlgorithm::processCollision (btCollisionObject* body0,b
if (softBody->m_collisionDisabledObjects.findLinearSearch(rigidCollisionObject)==softBody->m_collisionDisabledObjects.size())
{
- softBody->defaultCollisionHandler(rigidCollisionObject);
+ softBody->getSoftBodySolver()->processCollision(softBody, rigidCollisionObject);
}
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp b/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp
index 982ec3e5eb3..1b9b5e392a1 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp
@@ -20,15 +20,28 @@ subject to the following restrictions:
//softbody & helpers
#include "btSoftBody.h"
#include "btSoftBodyHelpers.h"
-
-
-//#define USE_BRUTEFORCE_RAYBROADPHASE 1
-
-
-
-btSoftRigidDynamicsWorld::btSoftRigidDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration)
-:btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration)
+#include "btSoftBodySolvers.h"
+#include "btDefaultSoftBodySolver.h"
+#include "LinearMath/btSerializer.h"
+
+
+btSoftRigidDynamicsWorld::btSoftRigidDynamicsWorld(
+ btDispatcher* dispatcher,
+ btBroadphaseInterface* pairCache,
+ btConstraintSolver* constraintSolver,
+ btCollisionConfiguration* collisionConfiguration,
+ btSoftBodySolver *softBodySolver ) :
+ btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration),
+ m_softBodySolver( softBodySolver ),
+ m_ownsSolver(false)
{
+ if( !m_softBodySolver )
+ {
+ void* ptr = btAlignedAlloc(sizeof(btDefaultSoftBodySolver),16);
+ m_softBodySolver = new(ptr) btDefaultSoftBodySolver();
+ m_ownsSolver = true;
+ }
+
m_drawFlags = fDrawFlags::Std;
m_drawNodeTree = true;
m_drawFaceTree = false;
@@ -38,31 +51,50 @@ btSoftRigidDynamicsWorld::btSoftRigidDynamicsWorld(btDispatcher* dispatcher,btBr
m_sbi.m_sparsesdf.Initialize();
m_sbi.m_sparsesdf.Reset();
+ m_sbi.air_density = (btScalar)1.2;
+ m_sbi.water_density = 0;
+ m_sbi.water_offset = 0;
+ m_sbi.water_normal = btVector3(0,0,0);
+ m_sbi.m_gravity.setValue(0,-10,0);
+
+ m_sbi.m_sparsesdf.Initialize();
+
+
}
btSoftRigidDynamicsWorld::~btSoftRigidDynamicsWorld()
{
-
+ if (m_ownsSolver)
+ {
+ m_softBodySolver->~btSoftBodySolver();
+ btAlignedFree(m_softBodySolver);
+ }
}
void btSoftRigidDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
{
- btDiscreteDynamicsWorld::predictUnconstraintMotion( timeStep);
-
- for ( int i=0;i<m_softBodies.size();++i)
+ btDiscreteDynamicsWorld::predictUnconstraintMotion( timeStep );
{
- btSoftBody* psb= m_softBodies[i];
-
- psb->predictMotion(timeStep);
+ BT_PROFILE("predictUnconstraintMotionSoftBody");
+ m_softBodySolver->predictMotion( timeStep );
}
}
-void btSoftRigidDynamicsWorld::internalSingleStepSimulation( btScalar timeStep)
+void btSoftRigidDynamicsWorld::internalSingleStepSimulation( btScalar timeStep )
{
+
+ // Let the solver grab the soft bodies and if necessary optimize for it
+ m_softBodySolver->optimize( getSoftBodyArray() );
+
+ if( !m_softBodySolver->checkInitialized() )
+ {
+ btAssert( "Solver initialization failed\n" );
+ }
+
btDiscreteDynamicsWorld::internalSingleStepSimulation( timeStep );
///solve soft bodies constraints
- solveSoftBodiesConstraints();
+ solveSoftBodiesConstraints( timeStep );
//self collisions
for ( int i=0;i<m_softBodies.size();i++)
@@ -72,22 +104,14 @@ void btSoftRigidDynamicsWorld::internalSingleStepSimulation( btScalar timeStep)
}
///update soft bodies
- updateSoftBodies();
-
-}
-
-void btSoftRigidDynamicsWorld::updateSoftBodies()
-{
- BT_PROFILE("updateSoftBodies");
+ m_softBodySolver->updateSoftBodies( );
+
+ // End solver-wise simulation step
+ // ///////////////////////////////
- for ( int i=0;i<m_softBodies.size();i++)
- {
- btSoftBody* psb=(btSoftBody*)m_softBodies[i];
- psb->integrateMotion();
- }
}
-void btSoftRigidDynamicsWorld::solveSoftBodiesConstraints()
+void btSoftRigidDynamicsWorld::solveSoftBodiesConstraints( btScalar timeStep )
{
BT_PROFILE("solveSoftConstraints");
@@ -96,20 +120,22 @@ void btSoftRigidDynamicsWorld::solveSoftBodiesConstraints()
btSoftBody::solveClusters(m_softBodies);
}
- for(int i=0;i<m_softBodies.size();++i)
- {
- btSoftBody* psb=(btSoftBody*)m_softBodies[i];
- psb->solveConstraints();
- }
+ // Solve constraints solver-wise
+ m_softBodySolver->solveConstraints( timeStep * m_softBodySolver->getTimeScale() );
+
}
-void btSoftRigidDynamicsWorld::addSoftBody(btSoftBody* body)
+void btSoftRigidDynamicsWorld::addSoftBody(btSoftBody* body,short int collisionFilterGroup,short int collisionFilterMask)
{
m_softBodies.push_back(body);
+ // Set the soft body solver that will deal with this body
+ // to be the world's solver
+ body->setSoftBodySolver( m_softBodySolver );
+
btCollisionWorld::addCollisionObject(body,
- btBroadphaseProxy::DefaultFilter,
- btBroadphaseProxy::AllFilter);
+ collisionFilterGroup,
+ collisionFilterMask);
}
@@ -120,6 +146,15 @@ void btSoftRigidDynamicsWorld::removeSoftBody(btSoftBody* body)
btCollisionWorld::removeCollisionObject(body);
}
+void btSoftRigidDynamicsWorld::removeCollisionObject(btCollisionObject* collisionObject)
+{
+ btSoftBody* body = btSoftBody::upcast(collisionObject);
+ if (body)
+ removeSoftBody(body);
+ else
+ btDiscreteDynamicsWorld::removeCollisionObject(collisionObject);
+}
+
void btSoftRigidDynamicsWorld::debugDrawWorld()
{
btDiscreteDynamicsWorld::debugDrawWorld();
@@ -130,8 +165,12 @@ void btSoftRigidDynamicsWorld::debugDrawWorld()
for ( i=0;i<this->m_softBodies.size();i++)
{
btSoftBody* psb=(btSoftBody*)this->m_softBodies[i];
- btSoftBodyHelpers::DrawFrame(psb,m_debugDrawer);
- btSoftBodyHelpers::Draw(psb,m_debugDrawer,m_drawFlags);
+ if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & (btIDebugDraw::DBG_DrawWireframe))
+ {
+ btSoftBodyHelpers::DrawFrame(psb,m_debugDrawer);
+ btSoftBodyHelpers::Draw(psb,m_debugDrawer,m_drawFlags);
+ }
+
if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
{
if(m_drawNodeTree) btSoftBodyHelpers::DrawNodeTree(psb,m_debugDrawer);
@@ -143,6 +182,8 @@ void btSoftRigidDynamicsWorld::debugDrawWorld()
}
+
+
struct btSoftSingleRayCallback : public btBroadphaseRayCallback
{
btVector3 m_rayFromWorld;
@@ -251,8 +292,10 @@ void btSoftRigidDynamicsWorld::rayTestSingle(const btTransform& rayFromTrans,con
btSoftBody::sRayCast softResult;
if (softBody->rayTest(rayFromTrans.getOrigin(), rayToTrans.getOrigin(), softResult))
{
- if (softResult.fraction<= resultCallback.m_closestHitFraction)
+
+ if (softResult.fraction<= resultCallback.m_closestHitFraction)
{
+
btCollisionWorld::LocalShapeInfo shapeInfo;
shapeInfo.m_shapePart = 0;
shapeInfo.m_triangleIndex = softResult.index;
@@ -260,14 +303,14 @@ void btSoftRigidDynamicsWorld::rayTestSingle(const btTransform& rayFromTrans,con
btVector3 normal = softBody->m_faces[softResult.index].m_normal;
btVector3 rayDir = rayToTrans.getOrigin() - rayFromTrans.getOrigin();
if (normal.dot(rayDir) > 0) {
- // normal must always point toward origin of the ray
+ // normal always point toward origin of the ray
normal = -normal;
}
btCollisionWorld::LocalRayResult rayResult
(collisionObject,
- &shapeInfo,
- normal,
- softResult.fraction);
+ &shapeInfo,
+ normal,
+ softResult.fraction);
bool normalInWorldSpace = true;
resultCallback.addSingleResult(rayResult,normalInWorldSpace);
}
@@ -278,3 +321,38 @@ void btSoftRigidDynamicsWorld::rayTestSingle(const btTransform& rayFromTrans,con
btCollisionWorld::rayTestSingle(rayFromTrans,rayToTrans,collisionObject,collisionShape,colObjWorldTransform,resultCallback);
}
}
+
+
+void btSoftRigidDynamicsWorld::serializeSoftBodies(btSerializer* serializer)
+{
+ int i;
+ //serialize all collision objects
+ for (i=0;i<m_collisionObjects.size();i++)
+ {
+ btCollisionObject* colObj = m_collisionObjects[i];
+ if (colObj->getInternalType() & btCollisionObject::CO_SOFT_BODY)
+ {
+ int len = colObj->calculateSerializeBufferSize();
+ btChunk* chunk = serializer->allocate(len,1);
+ const char* structType = colObj->serialize(chunk->m_oldPtr, serializer);
+ serializer->finalizeChunk(chunk,structType,BT_SOFTBODY_CODE,colObj);
+ }
+ }
+
+}
+
+void btSoftRigidDynamicsWorld::serialize(btSerializer* serializer)
+{
+
+ serializer->startSerialization();
+
+ serializeSoftBodies(serializer);
+
+ serializeRigidBodies(serializer);
+
+ serializeCollisionObjects(serializer);
+
+ serializer->finishSerialization();
+}
+
+
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.h b/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.h
index 14220ee7564..7d8d0cb7daa 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.h
+++ b/extern/bullet2/src/BulletSoftBody/btSoftRigidDynamicsWorld.h
@@ -21,6 +21,8 @@ subject to the following restrictions:
typedef btAlignedObjectArray<btSoftBody*> btSoftBodyArray;
+class btSoftBodySolver;
+
class btSoftRigidDynamicsWorld : public btDiscreteDynamicsWorld
{
@@ -30,6 +32,9 @@ class btSoftRigidDynamicsWorld : public btDiscreteDynamicsWorld
bool m_drawFaceTree;
bool m_drawClusterTree;
btSoftBodyWorldInfo m_sbi;
+ ///Solver classes that encapsulate multiple soft bodies for solving
+ btSoftBodySolver *m_softBodySolver;
+ bool m_ownsSolver;
protected:
@@ -37,23 +42,25 @@ protected:
virtual void internalSingleStepSimulation( btScalar timeStep);
- void updateSoftBodies();
-
- void solveSoftBodiesConstraints();
+ void solveSoftBodiesConstraints( btScalar timeStep );
+ void serializeSoftBodies(btSerializer* serializer);
public:
- btSoftRigidDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration);
+ btSoftRigidDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver, btCollisionConfiguration* collisionConfiguration, btSoftBodySolver *softBodySolver = 0 );
virtual ~btSoftRigidDynamicsWorld();
virtual void debugDrawWorld();
- void addSoftBody(btSoftBody* body);
+ void addSoftBody(btSoftBody* body,short int collisionFilterGroup=btBroadphaseProxy::DefaultFilter,short int collisionFilterMask=btBroadphaseProxy::AllFilter);
void removeSoftBody(btSoftBody* body);
+ ///removeCollisionObject will first check if it is a rigid body, if so call removeRigidBody otherwise call btDiscreteDynamicsWorld::removeCollisionObject
+ virtual void removeCollisionObject(btCollisionObject* collisionObject);
+
int getDrawFlags() const { return(m_drawFlags); }
void setDrawFlags(int f) { m_drawFlags=f; }
@@ -77,6 +84,7 @@ public:
return m_softBodies;
}
+
virtual void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const;
/// rayTestSingle performs a raycast call and calls the resultCallback. It is used internally by rayTest.
@@ -88,6 +96,8 @@ public:
const btTransform& colObjWorldTransform,
RayResultCallback& resultCallback);
+ virtual void serialize(btSerializer* serializer);
+
};
#endif //BT_SOFT_RIGID_DYNAMICS_WORLD_H
diff --git a/extern/bullet2/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp b/extern/bullet2/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp
index 85a727944e0..1b8cfa72371 100644
--- a/extern/bullet2/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp
@@ -17,6 +17,7 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
#include "BulletCollision/CollisionShapes/btBoxShape.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
+#include "BulletSoftBody/btSoftBodySolvers.h"
#include "btSoftBody.h"
#define USE_PERSISTENT_CONTACTS 1
@@ -36,7 +37,7 @@ void btSoftSoftCollisionAlgorithm::processCollision (btCollisionObject* body0,bt
{
btSoftBody* soft0 = (btSoftBody*)body0;
btSoftBody* soft1 = (btSoftBody*)body1;
- soft0->defaultCollisionHandler(soft1);
+ soft0->getSoftBodySolver()->processCollision(soft0, soft1);
}
btScalar btSoftSoftCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* /*body0*/,btCollisionObject* /*body1*/,const btDispatcherInfo& /*dispatchInfo*/,btManifoldResult* /*resultOut*/)
diff --git a/extern/bullet2/src/LinearMath/btAlignedAllocator.cpp b/extern/bullet2/src/LinearMath/btAlignedAllocator.cpp
index a3d790f8abc..189b759d237 100644
--- a/extern/bullet2/src/LinearMath/btAlignedAllocator.cpp
+++ b/extern/bullet2/src/LinearMath/btAlignedAllocator.cpp
@@ -160,22 +160,8 @@ void btAlignedFreeInternal (void* ptr,int line,char* filename)
void* btAlignedAllocInternal (size_t size, int alignment)
{
gNumAlignedAllocs++;
- void* ptr;
-#if defined (BT_HAS_ALIGNED_ALLOCATOR) || defined(__CELLOS_LV2__)
+ void* ptr;
ptr = sAlignedAllocFunc(size, alignment);
-#else
- char *real;
- unsigned long offset;
-
- real = (char *)sAllocFunc(size + sizeof(void *) + (alignment-1));
- if (real) {
- offset = (alignment - (unsigned long)(real + sizeof(void *))) & (alignment-1);
- ptr = (void *)((real + sizeof(void *)) + offset);
- *((void **)(ptr)-1) = (void *)(real);
- } else {
- ptr = (void *)(real);
- }
-#endif // defined (BT_HAS_ALIGNED_ALLOCATOR) || defined(__CELLOS_LV2__)
// printf("btAlignedAllocInternal %d, %x\n",size,ptr);
return ptr;
}
@@ -189,16 +175,7 @@ void btAlignedFreeInternal (void* ptr)
gNumAlignedFree++;
// printf("btAlignedFreeInternal %x\n",ptr);
-#if defined (BT_HAS_ALIGNED_ALLOCATOR) || defined(__CELLOS_LV2__)
sAlignedFreeFunc(ptr);
-#else
- void* real;
-
- if (ptr) {
- real = *((void **)(ptr)-1);
- sFreeFunc(real);
- }
-#endif // defined (BT_HAS_ALIGNED_ALLOCATOR) || defined(__CELLOS_LV2__)
}
#endif //BT_DEBUG_MEMORY_ALLOCATIONS
diff --git a/extern/bullet2/src/LinearMath/btAlignedObjectArray.h b/extern/bullet2/src/LinearMath/btAlignedObjectArray.h
index bad1eee1f63..955bb128e83 100644
--- a/extern/bullet2/src/LinearMath/btAlignedObjectArray.h
+++ b/extern/bullet2/src/LinearMath/btAlignedObjectArray.h
@@ -138,6 +138,16 @@ class btAlignedObjectArray
return m_size;
}
+ SIMD_FORCE_INLINE const T& at(int n) const
+ {
+ return m_data[n];
+ }
+
+ SIMD_FORCE_INLINE T& at(int n)
+ {
+ return m_data[n];
+ }
+
SIMD_FORCE_INLINE const T& operator[](int n) const
{
return m_data[n];
@@ -171,9 +181,9 @@ class btAlignedObjectArray
{
int curSize = size();
- if (newsize < size())
+ if (newsize < curSize)
{
- for(int i = curSize; i < newsize; i++)
+ for(int i = newsize; i < curSize; i++)
{
m_data[i].~T();
}
@@ -195,6 +205,18 @@ class btAlignedObjectArray
m_size = newsize;
}
+ SIMD_FORCE_INLINE T& expandNonInitializing( )
+ {
+ int sz = size();
+ if( sz == capacity() )
+ {
+ reserve( allocSize(size()) );
+ }
+ m_size++;
+
+ return m_data[sz];
+ }
+
SIMD_FORCE_INLINE T& expand( const T& fillValue=T())
{
@@ -384,7 +406,7 @@ class btAlignedObjectArray
int findBinarySearch(const T& key) const
{
int first = 0;
- int last = size();
+ int last = size()-1;
//assume sorted array
while (first <= last) {
@@ -437,6 +459,13 @@ class btAlignedObjectArray
m_capacity = capacity;
}
+ void copyFromArray(const btAlignedObjectArray& otherArray)
+ {
+ int otherSize = otherArray.size();
+ resize (otherSize);
+ otherArray.copy(0, otherSize, m_data);
+ }
+
};
#endif //BT_OBJECT_ARRAY__
diff --git a/extern/bullet2/src/LinearMath/btConvexHull.cpp b/extern/bullet2/src/LinearMath/btConvexHull.cpp
index 419c752a1d9..532d76d881f 100644
--- a/extern/bullet2/src/LinearMath/btConvexHull.cpp
+++ b/extern/bullet2/src/LinearMath/btConvexHull.cpp
@@ -16,9 +16,9 @@ subject to the following restrictions:
#include <string.h>
#include "btConvexHull.h"
-#include "LinearMath/btAlignedObjectArray.h"
-#include "LinearMath/btMinMax.h"
-#include "LinearMath/btVector3.h"
+#include "btAlignedObjectArray.h"
+#include "btMinMax.h"
+#include "btVector3.h"
@@ -96,21 +96,21 @@ btVector3 PlaneLineIntersection(const btPlane &plane, const btVector3 &p0, const
// returns the point where the line p0-p1 intersects the plane n&d
static btVector3 dif;
dif = p1-p0;
- btScalar dn= dot(plane.normal,dif);
- btScalar t = -(plane.dist+dot(plane.normal,p0) )/dn;
+ btScalar dn= btDot(plane.normal,dif);
+ btScalar t = -(plane.dist+btDot(plane.normal,p0) )/dn;
return p0 + (dif*t);
}
btVector3 PlaneProject(const btPlane &plane, const btVector3 &point)
{
- return point - plane.normal * (dot(point,plane.normal)+plane.dist);
+ return point - plane.normal * (btDot(point,plane.normal)+plane.dist);
}
btVector3 TriNormal(const btVector3 &v0, const btVector3 &v1, const btVector3 &v2)
{
// return the normal of the triangle
// inscribed by v0, v1, and v2
- btVector3 cp=cross(v1-v0,v2-v1);
+ btVector3 cp=btCross(v1-v0,v2-v1);
btScalar m=cp.length();
if(m==0) return btVector3(1,0,0);
return cp*(btScalar(1.0)/m);
@@ -120,23 +120,23 @@ btVector3 TriNormal(const btVector3 &v0, const btVector3 &v1, const btVector3 &v
btScalar DistanceBetweenLines(const btVector3 &ustart, const btVector3 &udir, const btVector3 &vstart, const btVector3 &vdir, btVector3 *upoint, btVector3 *vpoint)
{
static btVector3 cp;
- cp = cross(udir,vdir).normalized();
+ cp = btCross(udir,vdir).normalized();
- btScalar distu = -dot(cp,ustart);
- btScalar distv = -dot(cp,vstart);
+ btScalar distu = -btDot(cp,ustart);
+ btScalar distv = -btDot(cp,vstart);
btScalar dist = (btScalar)fabs(distu-distv);
if(upoint)
{
btPlane plane;
- plane.normal = cross(vdir,cp).normalized();
- plane.dist = -dot(plane.normal,vstart);
+ plane.normal = btCross(vdir,cp).normalized();
+ plane.dist = -btDot(plane.normal,vstart);
*upoint = PlaneLineIntersection(plane,ustart,ustart+udir);
}
if(vpoint)
{
btPlane plane;
- plane.normal = cross(udir,cp).normalized();
- plane.dist = -dot(plane.normal,ustart);
+ plane.normal = btCross(udir,cp).normalized();
+ plane.dist = -btDot(plane.normal,ustart);
*vpoint = PlaneLineIntersection(plane,vstart,vstart+vdir);
}
return dist;
@@ -170,7 +170,7 @@ ConvexH::ConvexH(int vertices_size,int edges_size,int facets_size)
int PlaneTest(const btPlane &p, const btVector3 &v);
int PlaneTest(const btPlane &p, const btVector3 &v) {
- btScalar a = dot(v,p.normal)+p.dist;
+ btScalar a = btDot(v,p.normal)+p.dist;
int flag = (a>planetestepsilon)?OVER:((a<-planetestepsilon)?UNDER:COPLANAR);
return flag;
}
@@ -228,7 +228,7 @@ int maxdirfiltered(const T *p,int count,const T &dir,btAlignedObjectArray<int> &
for(int i=0;i<count;i++)
if(allow[i])
{
- if(m==-1 || dot(p[i],dir)>dot(p[m],dir))
+ if(m==-1 || btDot(p[i],dir)>btDot(p[m],dir))
m=i;
}
btAssert(m!=-1);
@@ -238,8 +238,8 @@ int maxdirfiltered(const T *p,int count,const T &dir,btAlignedObjectArray<int> &
btVector3 orth(const btVector3 &v);
btVector3 orth(const btVector3 &v)
{
- btVector3 a=cross(v,btVector3(0,0,1));
- btVector3 b=cross(v,btVector3(0,1,0));
+ btVector3 a=btCross(v,btVector3(0,0,1));
+ btVector3 b=btCross(v,btVector3(0,1,0));
if (a.length() > b.length())
{
return a.normalized();
@@ -258,7 +258,7 @@ int maxdirsterid(const T *p,int count,const T &dir,btAlignedObjectArray<int> &al
m = maxdirfiltered(p,count,dir,allow);
if(allow[m]==3) return m;
T u = orth(dir);
- T v = cross(u,dir);
+ T v = btCross(u,dir);
int ma=-1;
for(btScalar x = btScalar(0.0) ; x<= btScalar(360.0) ; x+= btScalar(45.0))
{
@@ -313,7 +313,7 @@ int above(btVector3* vertices,const int3& t, const btVector3 &p, btScalar epsilo
int above(btVector3* vertices,const int3& t, const btVector3 &p, btScalar epsilon)
{
btVector3 n=TriNormal(vertices[t[0]],vertices[t[1]],vertices[t[2]]);
- return (dot(n,p-vertices[t[0]]) > epsilon); // EPSILON???
+ return (btDot(n,p-vertices[t[0]]) > epsilon); // EPSILON???
}
int hasedge(const int3 &t, int a,int b);
int hasedge(const int3 &t, int a,int b)
@@ -495,8 +495,8 @@ int4 HullLibrary::FindSimplex(btVector3 *verts,int verts_count,btAlignedObjectAr
basis[0] = verts[p0]-verts[p1];
if(p0==p1 || basis[0]==btVector3(0,0,0))
return int4(-1,-1,-1,-1);
- basis[1] = cross(btVector3( btScalar(1),btScalar(0.02), btScalar(0)),basis[0]);
- basis[2] = cross(btVector3(btScalar(-0.02), btScalar(1), btScalar(0)),basis[0]);
+ basis[1] = btCross(btVector3( btScalar(1),btScalar(0.02), btScalar(0)),basis[0]);
+ basis[2] = btCross(btVector3(btScalar(-0.02), btScalar(1), btScalar(0)),basis[0]);
if (basis[1].length() > basis[2].length())
{
basis[1].normalize();
@@ -512,13 +512,13 @@ int4 HullLibrary::FindSimplex(btVector3 *verts,int verts_count,btAlignedObjectAr
if(p2 == p0 || p2 == p1)
return int4(-1,-1,-1,-1);
basis[1] = verts[p2] - verts[p0];
- basis[2] = cross(basis[1],basis[0]).normalized();
+ basis[2] = btCross(basis[1],basis[0]).normalized();
int p3 = maxdirsterid(verts,verts_count,basis[2],allow);
if(p3==p0||p3==p1||p3==p2) p3 = maxdirsterid(verts,verts_count,-basis[2],allow);
if(p3==p0||p3==p1||p3==p2)
return int4(-1,-1,-1,-1);
btAssert(!(p0==p1||p0==p2||p0==p3||p1==p2||p1==p3||p2==p3));
- if(dot(verts[p3]-verts[p0],cross(verts[p1]-verts[p0],verts[p2]-verts[p0])) <0) {Swap(p2,p3);}
+ if(btDot(verts[p3]-verts[p0],btCross(verts[p1]-verts[p0],verts[p2]-verts[p0])) <0) {Swap(p2,p3);}
return int4(p0,p1,p2,p3);
}
@@ -564,7 +564,7 @@ int HullLibrary::calchullgen(btVector3 *verts,int verts_count, int vlimit)
btAssert(t->vmax<0);
btVector3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]);
t->vmax = maxdirsterid(verts,verts_count,n,allow);
- t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]);
+ t->rise = btDot(n,verts[t->vmax]-verts[(*t)[0]]);
}
btHullTriangle *te;
vlimit-=4;
@@ -592,7 +592,7 @@ int HullLibrary::calchullgen(btVector3 *verts,int verts_count, int vlimit)
if(!m_tris[j]) continue;
if(!hasvert(*m_tris[j],v)) break;
int3 nt=*m_tris[j];
- if(above(verts,nt,center,btScalar(0.01)*epsilon) || cross(verts[nt[1]]-verts[nt[0]],verts[nt[2]]-verts[nt[1]]).length()< epsilon*epsilon*btScalar(0.1) )
+ if(above(verts,nt,center,btScalar(0.01)*epsilon) || btCross(verts[nt[1]]-verts[nt[0]],verts[nt[2]]-verts[nt[1]]).length()< epsilon*epsilon*btScalar(0.1) )
{
btHullTriangle *nb = m_tris[m_tris[j]->n[0]];
btAssert(nb);btAssert(!hasvert(*nb,v));btAssert(nb->id<j);
@@ -614,7 +614,7 @@ int HullLibrary::calchullgen(btVector3 *verts,int verts_count, int vlimit)
}
else
{
- t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]);
+ t->rise = btDot(n,verts[t->vmax]-verts[(*t)[0]]);
}
}
vlimit --;
@@ -876,7 +876,7 @@ bool HullLibrary::CleanupVertices(unsigned int svcount,
vcount = 0;
- btScalar recip[3];
+ btScalar recip[3]={0.f,0.f,0.f};
if ( scale )
{
@@ -1011,9 +1011,9 @@ bool HullLibrary::CleanupVertices(unsigned int svcount,
btScalar y = v[1];
btScalar z = v[2];
- btScalar dx = fabsf(x - px );
- btScalar dy = fabsf(y - py );
- btScalar dz = fabsf(z - pz );
+ btScalar dx = btFabs(x - px );
+ btScalar dy = btFabs(y - py );
+ btScalar dz = btFabs(z - pz );
if ( dx < normalepsilon && dy < normalepsilon && dz < normalepsilon )
{
@@ -1135,7 +1135,7 @@ void HullLibrary::BringOutYourDead(const btVector3* verts,unsigned int vcount, b
ocount = 0;
- for (i=0; i<indexcount; i++)
+ for (i=0; i<int (indexcount); i++)
{
unsigned int v = indices[i]; // original array index
@@ -1156,7 +1156,7 @@ void HullLibrary::BringOutYourDead(const btVector3* verts,unsigned int vcount, b
for (int k=0;k<m_vertexIndexMapping.size();k++)
{
- if (tmpIndices[k]==v)
+ if (tmpIndices[k]==int(v))
m_vertexIndexMapping[k]=ocount;
}
diff --git a/extern/bullet2/src/LinearMath/btConvexHull.h b/extern/bullet2/src/LinearMath/btConvexHull.h
index 92560bddb9c..a23fa4d550f 100644
--- a/extern/bullet2/src/LinearMath/btConvexHull.h
+++ b/extern/bullet2/src/LinearMath/btConvexHull.h
@@ -19,8 +19,8 @@ subject to the following restrictions:
#ifndef CD_HULL_H
#define CD_HULL_H
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btAlignedObjectArray.h"
+#include "btVector3.h"
+#include "btAlignedObjectArray.h"
typedef btAlignedObjectArray<unsigned int> TUIntArray;
diff --git a/extern/bullet2/src/LinearMath/btDefaultMotionState.h b/extern/bullet2/src/LinearMath/btDefaultMotionState.h
index d758f77ed81..7858a10d219 100644
--- a/extern/bullet2/src/LinearMath/btDefaultMotionState.h
+++ b/extern/bullet2/src/LinearMath/btDefaultMotionState.h
@@ -1,6 +1,8 @@
#ifndef DEFAULT_MOTION_STATE_H
#define DEFAULT_MOTION_STATE_H
+#include "btMotionState.h"
+
///The btDefaultMotionState provides a common implementation to synchronize world transforms with offsets.
struct btDefaultMotionState : public btMotionState
{
diff --git a/extern/bullet2/src/LinearMath/btHashMap.h b/extern/bullet2/src/LinearMath/btHashMap.h
index f883e0e489a..e3302b5e9ff 100644
--- a/extern/bullet2/src/LinearMath/btHashMap.h
+++ b/extern/bullet2/src/LinearMath/btHashMap.h
@@ -3,94 +3,215 @@
#include "btAlignedObjectArray.h"
+///very basic hashable string implementation, compatible with btHashMap
+struct btHashString
+{
+ const char* m_string;
+ unsigned int m_hash;
+
+ SIMD_FORCE_INLINE unsigned int getHash()const
+ {
+ return m_hash;
+ }
+
+ btHashString(const char* name)
+ :m_string(name)
+ {
+ /* magic numbers from http://www.isthe.com/chongo/tech/comp/fnv/ */
+ static const unsigned int InitialFNV = 2166136261u;
+ static const unsigned int FNVMultiple = 16777619u;
+
+ /* Fowler / Noll / Vo (FNV) Hash */
+ unsigned int hash = InitialFNV;
+
+ for(int i = 0; m_string[i]; i++)
+ {
+ hash = hash ^ (m_string[i]); /* xor the low 8 bits */
+ hash = hash * FNVMultiple; /* multiply by the magic number */
+ }
+ m_hash = hash;
+ }
+
+ int portableStringCompare(const char* src, const char* dst) const
+ {
+ int ret = 0 ;
+
+ while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
+ ++src, ++dst;
+
+ if ( ret < 0 )
+ ret = -1 ;
+ else if ( ret > 0 )
+ ret = 1 ;
+
+ return( ret );
+ }
+
+ bool equals(const btHashString& other) const
+ {
+ return (m_string == other.m_string) ||
+ (0==portableStringCompare(m_string,other.m_string));
+
+ }
+
+};
+
const int BT_HASH_NULL=0xffffffff;
-template <class Value>
-class btHashKey
+
+class btHashInt
{
int m_uid;
public:
-
- btHashKey(int uid)
- :m_uid(uid)
+ btHashInt(int uid) :m_uid(uid)
{
}
- int getUid() const
+ int getUid1() const
{
return m_uid;
}
+ void setUid1(int uid)
+ {
+ m_uid = uid;
+ }
+
+ bool equals(const btHashInt& other) const
+ {
+ return getUid1() == other.getUid1();
+ }
//to our success
SIMD_FORCE_INLINE unsigned int getHash()const
{
int key = m_uid;
// Thomas Wang's hash
- key += ~(key << 15);
- key ^= (key >> 10);
- key += (key << 3);
- key ^= (key >> 6);
- key += ~(key << 11);
- key ^= (key >> 16);
+ key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
return key;
}
+};
- btHashKey getKey(const Value& value) const
+
+
+class btHashPtr
+{
+
+ union
{
- return btHashKey(value.getUid());
+ const void* m_pointer;
+ int m_hashValues[2];
+ };
+
+public:
+
+ btHashPtr(const void* ptr)
+ :m_pointer(ptr)
+ {
+ }
+
+ const void* getPointer() const
+ {
+ return m_pointer;
+ }
+
+ bool equals(const btHashPtr& other) const
+ {
+ return getPointer() == other.getPointer();
+ }
+
+ //to our success
+ SIMD_FORCE_INLINE unsigned int getHash()const
+ {
+ const bool VOID_IS_8 = ((sizeof(void*)==8));
+
+ int key = VOID_IS_8? m_hashValues[0]+m_hashValues[1] : m_hashValues[0];
+
+ // Thomas Wang's hash
+ key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
+ return key;
}
+
+
};
template <class Value>
class btHashKeyPtr
{
+ int m_uid;
+public:
+
+ btHashKeyPtr(int uid) :m_uid(uid)
+ {
+ }
+
+ int getUid1() const
+ {
+ return m_uid;
+ }
+
+ bool equals(const btHashKeyPtr<Value>& other) const
+ {
+ return getUid1() == other.getUid1();
+ }
+
+ //to our success
+ SIMD_FORCE_INLINE unsigned int getHash()const
+ {
+ int key = m_uid;
+ // Thomas Wang's hash
+ key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
+ return key;
+ }
+
+
+};
+
+
+template <class Value>
+class btHashKey
+{
int m_uid;
public:
- btHashKeyPtr(int uid)
- :m_uid(uid)
+ btHashKey(int uid) :m_uid(uid)
{
}
- int getUid() const
+ int getUid1() const
{
return m_uid;
}
+ bool equals(const btHashKey<Value>& other) const
+ {
+ return getUid1() == other.getUid1();
+ }
//to our success
SIMD_FORCE_INLINE unsigned int getHash()const
{
int key = m_uid;
// Thomas Wang's hash
- key += ~(key << 15);
- key ^= (key >> 10);
- key += (key << 3);
- key ^= (key >> 6);
- key += ~(key << 11);
- key ^= (key >> 16);
+ key += ~(key << 15); key ^= (key >> 10); key += (key << 3); key ^= (key >> 6); key += ~(key << 11); key ^= (key >> 16);
return key;
}
-
- btHashKeyPtr getKey(const Value& value) const
- {
- return btHashKeyPtr(value->getUid());
- }
};
+
///The btHashMap template class implements a generic and lightweight hashmap.
///A basic sample of how to use btHashMap is located in Demos\BasicDemo\main.cpp
template <class Key, class Value>
class btHashMap
{
+protected:
btAlignedObjectArray<int> m_hashTable;
btAlignedObjectArray<int> m_next;
+
btAlignedObjectArray<Value> m_valueArray;
+ btAlignedObjectArray<Key> m_keyArray;
-
-
- void growTables(const Key& key)
+ void growTables(const Key& /*key*/)
{
int newCapacity = m_valueArray.capacity();
@@ -115,9 +236,10 @@ class btHashMap
for(i=0;i<curHashtableSize;i++)
{
- const Value& value = m_valueArray[i];
+ //const Value& value = m_valueArray[i];
+ //const Key& key = m_keyArray[i];
- int hashValue = key.getKey(value).getHash() & (m_valueArray.capacity()-1); // New hash value with new mask
+ int hashValue = m_keyArray[i].getHash() & (m_valueArray.capacity()-1); // New hash value with new mask
m_next[i] = m_hashTable[hashValue];
m_hashTable[hashValue] = i;
}
@@ -130,14 +252,20 @@ class btHashMap
void insert(const Key& key, const Value& value) {
int hash = key.getHash() & (m_valueArray.capacity()-1);
- //don't add it if it is already there
- if (find(key))
+
+ //replace value if the key is already there
+ int index = findIndex(key);
+ if (index != BT_HASH_NULL)
{
+ m_valueArray[index]=value;
return;
}
+
int count = m_valueArray.size();
int oldCapacity = m_valueArray.capacity();
m_valueArray.push_back(value);
+ m_keyArray.push_back(key);
+
int newCapacity = m_valueArray.capacity();
if (oldCapacity < newCapacity)
{
@@ -191,12 +319,12 @@ class btHashMap
if (lastPairIndex == pairIndex)
{
m_valueArray.pop_back();
+ m_keyArray.pop_back();
return;
}
// Remove the last pair from the hash table.
- const Value* lastValue = &m_valueArray[lastPairIndex];
- int lastHash = key.getKey(*lastValue).getHash() & (m_valueArray.capacity()-1);
+ int lastHash = m_keyArray[lastPairIndex].getHash() & (m_valueArray.capacity()-1);
index = m_hashTable[lastHash];
btAssert(index != BT_HASH_NULL);
@@ -220,12 +348,14 @@ class btHashMap
// Copy the last pair into the remove pair's spot.
m_valueArray[pairIndex] = m_valueArray[lastPairIndex];
+ m_keyArray[pairIndex] = m_keyArray[lastPairIndex];
// Insert the last pair into the hash table
m_next[pairIndex] = m_hashTable[lastHash];
m_hashTable[lastHash] = pairIndex;
m_valueArray.pop_back();
+ m_keyArray.pop_back();
}
@@ -276,15 +406,15 @@ class btHashMap
int findIndex(const Key& key) const
{
- int hash = key.getHash() & (m_valueArray.capacity()-1);
+ unsigned int hash = key.getHash() & (m_valueArray.capacity()-1);
- if (hash >= m_hashTable.size())
+ if (hash >= (unsigned int)m_hashTable.size())
{
return BT_HASH_NULL;
}
int index = m_hashTable[hash];
- while ((index != BT_HASH_NULL) && (key.getUid() == key.getKey(m_valueArray[index]).getUid()) == false)
+ while ((index != BT_HASH_NULL) && key.equals(m_keyArray[index]) == false)
{
index = m_next[index];
}
@@ -296,6 +426,7 @@ class btHashMap
m_hashTable.clear();
m_next.clear();
m_valueArray.clear();
+ m_keyArray.clear();
}
};
diff --git a/extern/bullet2/src/LinearMath/btIDebugDraw.h b/extern/bullet2/src/LinearMath/btIDebugDraw.h
index e5a0061b779..48c15806a7d 100644
--- a/extern/bullet2/src/LinearMath/btIDebugDraw.h
+++ b/extern/bullet2/src/LinearMath/btIDebugDraw.h
@@ -1,27 +1,16 @@
/*
-Copyright (c) 2005 Gino van den Bergen / Erwin Coumans http://continuousphysics.com
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
*/
@@ -35,6 +24,7 @@ DEALINGS IN THE SOFTWARE.
///The btIDebugDraw interface class allows hooking up a debug renderer to visually debug simulations.
///Typical use case: create a debug drawer object, and assign it to a btCollisionWorld or btDynamicsWorld using setDebugDrawer and call debugDrawWorld.
///A class that implements the btIDebugDraw interface has to implement the drawLine method at a minimum.
+///For color arguments the X,Y,Z components refer to Red, Green and Blue each in the range [0..1]
class btIDebugDraw
{
public:
@@ -55,25 +45,54 @@ class btIDebugDraw
DBG_EnableCCD = 1024,
DBG_DrawConstraints = (1 << 11),
DBG_DrawConstraintLimits = (1 << 12),
+ DBG_FastWireframe = (1<<13),
DBG_MAX_DEBUG_DRAW_MODE
};
virtual ~btIDebugDraw() {};
+ virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)=0;
+
virtual void drawLine(const btVector3& from,const btVector3& to, const btVector3& fromColor, const btVector3& toColor)
{
+ (void) toColor;
drawLine (from, to, fromColor);
}
- virtual void drawBox (const btVector3& boxMin, const btVector3& boxMax, const btVector3& color, btScalar alpha)
+ virtual void drawSphere(btScalar radius, const btTransform& transform, const btVector3& color)
{
- }
+ btVector3 start = transform.getOrigin();
+
+ const btVector3 xoffs = transform.getBasis() * btVector3(radius,0,0);
+ const btVector3 yoffs = transform.getBasis() * btVector3(0,radius,0);
+ const btVector3 zoffs = transform.getBasis() * btVector3(0,0,radius);
+ // XY
+ drawLine(start-xoffs, start+yoffs, color);
+ drawLine(start+yoffs, start+xoffs, color);
+ drawLine(start+xoffs, start-yoffs, color);
+ drawLine(start-yoffs, start-xoffs, color);
+
+ // XZ
+ drawLine(start-xoffs, start+zoffs, color);
+ drawLine(start+zoffs, start+xoffs, color);
+ drawLine(start+xoffs, start-zoffs, color);
+ drawLine(start-zoffs, start-xoffs, color);
+
+ // YZ
+ drawLine(start-yoffs, start+zoffs, color);
+ drawLine(start+zoffs, start+yoffs, color);
+ drawLine(start+yoffs, start-zoffs, color);
+ drawLine(start-zoffs, start-yoffs, color);
+ }
+
virtual void drawSphere (const btVector3& p, btScalar radius, const btVector3& color)
{
+ btTransform tr;
+ tr.setIdentity();
+ tr.setOrigin(p);
+ drawSphere(radius,tr,color);
}
-
- virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)=0;
virtual void drawTriangle(const btVector3& v0,const btVector3& v1,const btVector3& v2,const btVector3& /*n0*/,const btVector3& /*n1*/,const btVector3& /*n2*/,const btVector3& color, btScalar alpha)
{
@@ -96,7 +115,7 @@ class btIDebugDraw
virtual int getDebugMode() const = 0;
- inline void drawAabb(const btVector3& from,const btVector3& to,const btVector3& color)
+ virtual void drawAabb(const btVector3& from,const btVector3& to,const btVector3& color)
{
btVector3 halfExtents = (to-from)* 0.5f;
@@ -125,7 +144,7 @@ class btIDebugDraw
edgecoord[i]*=-1.f;
}
}
- void drawTransform(const btTransform& transform, btScalar orthoLen)
+ virtual void drawTransform(const btTransform& transform, btScalar orthoLen)
{
btVector3 start = transform.getOrigin();
drawLine(start, start+transform.getBasis() * btVector3(orthoLen, 0, 0), btVector3(0.7f,0,0));
@@ -133,7 +152,7 @@ class btIDebugDraw
drawLine(start, start+transform.getBasis() * btVector3(0, 0, orthoLen), btVector3(0,0,0.7f));
}
- void drawArc(const btVector3& center, const btVector3& normal, const btVector3& axis, btScalar radiusA, btScalar radiusB, btScalar minAngle, btScalar maxAngle,
+ virtual void drawArc(const btVector3& center, const btVector3& normal, const btVector3& axis, btScalar radiusA, btScalar radiusB, btScalar minAngle, btScalar maxAngle,
const btVector3& color, bool drawSect, btScalar stepDegrees = btScalar(10.f))
{
const btVector3& vx = axis;
@@ -158,7 +177,7 @@ class btIDebugDraw
drawLine(center, prev, color);
}
}
- void drawSpherePatch(const btVector3& center, const btVector3& up, const btVector3& axis, btScalar radius,
+ virtual void drawSpherePatch(const btVector3& center, const btVector3& up, const btVector3& axis, btScalar radius,
btScalar minTh, btScalar maxTh, btScalar minPs, btScalar maxPs, const btVector3& color, btScalar stepDegrees = btScalar(10.f))
{
btVector3 vA[74];
@@ -260,7 +279,7 @@ class btIDebugDraw
}
}
- void drawBox(const btVector3& bbMin, const btVector3& bbMax, const btVector3& color)
+ virtual void drawBox(const btVector3& bbMin, const btVector3& bbMax, const btVector3& color)
{
drawLine(btVector3(bbMin[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMin[1], bbMin[2]), color);
drawLine(btVector3(bbMax[0], bbMin[1], bbMin[2]), btVector3(bbMax[0], bbMax[1], bbMin[2]), color);
@@ -275,7 +294,7 @@ class btIDebugDraw
drawLine(btVector3(bbMax[0], bbMax[1], bbMax[2]), btVector3(bbMin[0], bbMax[1], bbMax[2]), color);
drawLine(btVector3(bbMin[0], bbMax[1], bbMax[2]), btVector3(bbMin[0], bbMin[1], bbMax[2]), color);
}
- void drawBox(const btVector3& bbMin, const btVector3& bbMax, const btTransform& trans, const btVector3& color)
+ virtual void drawBox(const btVector3& bbMin, const btVector3& bbMax, const btTransform& trans, const btVector3& color)
{
drawLine(trans * btVector3(bbMin[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), color);
drawLine(trans * btVector3(bbMax[0], bbMin[1], bbMin[2]), trans * btVector3(bbMax[0], bbMax[1], bbMin[2]), color);
@@ -290,6 +309,107 @@ class btIDebugDraw
drawLine(trans * btVector3(bbMax[0], bbMax[1], bbMax[2]), trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), color);
drawLine(trans * btVector3(bbMin[0], bbMax[1], bbMax[2]), trans * btVector3(bbMin[0], bbMin[1], bbMax[2]), color);
}
+
+ virtual void drawCapsule(btScalar radius, btScalar halfHeight, int upAxis, const btTransform& transform, const btVector3& color)
+ {
+ btVector3 capStart(0.f,0.f,0.f);
+ capStart[upAxis] = -halfHeight;
+
+ btVector3 capEnd(0.f,0.f,0.f);
+ capEnd[upAxis] = halfHeight;
+
+ // Draw the ends
+ {
+
+ btTransform childTransform = transform;
+ childTransform.getOrigin() = transform * capStart;
+ drawSphere(radius, childTransform, color);
+ }
+
+ {
+ btTransform childTransform = transform;
+ childTransform.getOrigin() = transform * capEnd;
+ drawSphere(radius, childTransform, color);
+ }
+
+ // Draw some additional lines
+ btVector3 start = transform.getOrigin();
+
+ capStart[(upAxis+1)%3] = radius;
+ capEnd[(upAxis+1)%3] = radius;
+ drawLine(start+transform.getBasis() * capStart,start+transform.getBasis() * capEnd, color);
+ capStart[(upAxis+1)%3] = -radius;
+ capEnd[(upAxis+1)%3] = -radius;
+ drawLine(start+transform.getBasis() * capStart,start+transform.getBasis() * capEnd, color);
+
+ capStart[(upAxis+1)%3] = 0.f;
+ capEnd[(upAxis+1)%3] = 0.f;
+
+ capStart[(upAxis+2)%3] = radius;
+ capEnd[(upAxis+2)%3] = radius;
+ drawLine(start+transform.getBasis() * capStart,start+transform.getBasis() * capEnd, color);
+ capStart[(upAxis+2)%3] = -radius;
+ capEnd[(upAxis+2)%3] = -radius;
+ drawLine(start+transform.getBasis() * capStart,start+transform.getBasis() * capEnd, color);
+ }
+
+ virtual void drawCylinder(btScalar radius, btScalar halfHeight, int upAxis, const btTransform& transform, const btVector3& color)
+ {
+ btVector3 start = transform.getOrigin();
+ btVector3 offsetHeight(0,0,0);
+ offsetHeight[upAxis] = halfHeight;
+ btVector3 offsetRadius(0,0,0);
+ offsetRadius[(upAxis+1)%3] = radius;
+ drawLine(start+transform.getBasis() * (offsetHeight+offsetRadius),start+transform.getBasis() * (-offsetHeight+offsetRadius),color);
+ drawLine(start+transform.getBasis() * (offsetHeight-offsetRadius),start+transform.getBasis() * (-offsetHeight-offsetRadius),color);
+
+ // Drawing top and bottom caps of the cylinder
+ btVector3 yaxis(0,0,0);
+ yaxis[upAxis] = btScalar(1.0);
+ btVector3 xaxis(0,0,0);
+ xaxis[(upAxis+1)%3] = btScalar(1.0);
+ drawArc(start-transform.getBasis()*(offsetHeight),transform.getBasis()*yaxis,transform.getBasis()*xaxis,radius,radius,0,SIMD_2_PI,color,false,btScalar(10.0));
+ drawArc(start+transform.getBasis()*(offsetHeight),transform.getBasis()*yaxis,transform.getBasis()*xaxis,radius,radius,0,SIMD_2_PI,color,false,btScalar(10.0));
+ }
+
+ virtual void drawCone(btScalar radius, btScalar height, int upAxis, const btTransform& transform, const btVector3& color)
+ {
+
+ btVector3 start = transform.getOrigin();
+
+ btVector3 offsetHeight(0,0,0);
+ offsetHeight[upAxis] = height * btScalar(0.5);
+ btVector3 offsetRadius(0,0,0);
+ offsetRadius[(upAxis+1)%3] = radius;
+ btVector3 offset2Radius(0,0,0);
+ offset2Radius[(upAxis+2)%3] = radius;
+
+ drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight+offsetRadius),color);
+ drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight-offsetRadius),color);
+ drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight+offset2Radius),color);
+ drawLine(start+transform.getBasis() * (offsetHeight),start+transform.getBasis() * (-offsetHeight-offset2Radius),color);
+
+ // Drawing the base of the cone
+ btVector3 yaxis(0,0,0);
+ yaxis[upAxis] = btScalar(1.0);
+ btVector3 xaxis(0,0,0);
+ xaxis[(upAxis+1)%3] = btScalar(1.0);
+ drawArc(start-transform.getBasis()*(offsetHeight),transform.getBasis()*yaxis,transform.getBasis()*xaxis,radius,radius,0,SIMD_2_PI,color,false,10.0);
+ }
+
+ virtual void drawPlane(const btVector3& planeNormal, btScalar planeConst, const btTransform& transform, const btVector3& color)
+ {
+ btVector3 planeOrigin = planeNormal * planeConst;
+ btVector3 vec0,vec1;
+ btPlaneSpace1(planeNormal,vec0,vec1);
+ btScalar vecLen = 100.f;
+ btVector3 pt0 = planeOrigin + vec0*vecLen;
+ btVector3 pt1 = planeOrigin - vec0*vecLen;
+ btVector3 pt2 = planeOrigin + vec1*vecLen;
+ btVector3 pt3 = planeOrigin - vec1*vecLen;
+ drawLine(transform*pt0,transform*pt1,color);
+ drawLine(transform*pt2,transform*pt3,color);
+ }
};
diff --git a/extern/bullet2/src/LinearMath/btMatrix3x3.h b/extern/bullet2/src/LinearMath/btMatrix3x3.h
index e45afc3c055..d0234a04369 100644
--- a/extern/bullet2/src/LinearMath/btMatrix3x3.h
+++ b/extern/bullet2/src/LinearMath/btMatrix3x3.h
@@ -13,162 +13,179 @@ subject to the following restrictions:
*/
-#ifndef btMatrix3x3_H
-#define btMatrix3x3_H
-
-#include "btScalar.h"
+#ifndef BT_MATRIX3x3_H
+#define BT_MATRIX3x3_H
#include "btVector3.h"
#include "btQuaternion.h"
+#ifdef BT_USE_DOUBLE_PRECISION
+#define btMatrix3x3Data btMatrix3x3DoubleData
+#else
+#define btMatrix3x3Data btMatrix3x3FloatData
+#endif //BT_USE_DOUBLE_PRECISION
/**@brief The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with btQuaternion, btTransform and btVector3.
- * Make sure to only include a pure orthogonal matrix without scaling. */
+* Make sure to only include a pure orthogonal matrix without scaling. */
class btMatrix3x3 {
- public:
- /** @brief No initializaion constructor */
- btMatrix3x3 () {}
-
-// explicit btMatrix3x3(const btScalar *m) { setFromOpenGLSubMatrix(m); }
-
- /**@brief Constructor from Quaternion */
- explicit btMatrix3x3(const btQuaternion& q) { setRotation(q); }
- /*
- template <typename btScalar>
- Matrix3x3(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
- {
- setEulerYPR(yaw, pitch, roll);
- }
- */
- /** @brief Constructor with row major formatting */
- btMatrix3x3(const btScalar& xx, const btScalar& xy, const btScalar& xz,
- const btScalar& yx, const btScalar& yy, const btScalar& yz,
- const btScalar& zx, const btScalar& zy, const btScalar& zz)
- {
- setValue(xx, xy, xz,
- yx, yy, yz,
- zx, zy, zz);
- }
- /** @brief Copy constructor */
- SIMD_FORCE_INLINE btMatrix3x3 (const btMatrix3x3& other)
- {
- m_el[0] = other.m_el[0];
- m_el[1] = other.m_el[1];
- m_el[2] = other.m_el[2];
- }
- /** @brief Assignment Operator */
- SIMD_FORCE_INLINE btMatrix3x3& operator=(const btMatrix3x3& other)
- {
- m_el[0] = other.m_el[0];
- m_el[1] = other.m_el[1];
- m_el[2] = other.m_el[2];
- return *this;
- }
- /** @brief Get a column of the matrix as a vector
- * @param i Column number 0 indexed */
- SIMD_FORCE_INLINE btVector3 getColumn(int i) const
- {
- return btVector3(m_el[0][i],m_el[1][i],m_el[2][i]);
- }
-
+ ///Data storage for the matrix, each vector is a row of the matrix
+ btVector3 m_el[3];
- /** @brief Get a row of the matrix as a vector
- * @param i Row number 0 indexed */
- SIMD_FORCE_INLINE const btVector3& getRow(int i) const
- {
- btFullAssert(0 <= i && i < 3);
- return m_el[i];
- }
+public:
+ /** @brief No initializaion constructor */
+ btMatrix3x3 () {}
- /** @brief Get a mutable reference to a row of the matrix as a vector
- * @param i Row number 0 indexed */
- SIMD_FORCE_INLINE btVector3& operator[](int i)
- {
- btFullAssert(0 <= i && i < 3);
- return m_el[i];
- }
-
- /** @brief Get a const reference to a row of the matrix as a vector
- * @param i Row number 0 indexed */
- SIMD_FORCE_INLINE const btVector3& operator[](int i) const
- {
- btFullAssert(0 <= i && i < 3);
- return m_el[i];
- }
-
- /** @brief Multiply by the target matrix on the right
- * @param m Rotation matrix to be applied
- * Equivilant to this = this * m */
- btMatrix3x3& operator*=(const btMatrix3x3& m);
-
- /** @brief Set from a carray of btScalars
- * @param m A pointer to the beginning of an array of 9 btScalars */
+ // explicit btMatrix3x3(const btScalar *m) { setFromOpenGLSubMatrix(m); }
+
+ /**@brief Constructor from Quaternion */
+ explicit btMatrix3x3(const btQuaternion& q) { setRotation(q); }
+ /*
+ template <typename btScalar>
+ Matrix3x3(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
+ {
+ setEulerYPR(yaw, pitch, roll);
+ }
+ */
+ /** @brief Constructor with row major formatting */
+ btMatrix3x3(const btScalar& xx, const btScalar& xy, const btScalar& xz,
+ const btScalar& yx, const btScalar& yy, const btScalar& yz,
+ const btScalar& zx, const btScalar& zy, const btScalar& zz)
+ {
+ setValue(xx, xy, xz,
+ yx, yy, yz,
+ zx, zy, zz);
+ }
+ /** @brief Copy constructor */
+ SIMD_FORCE_INLINE btMatrix3x3 (const btMatrix3x3& other)
+ {
+ m_el[0] = other.m_el[0];
+ m_el[1] = other.m_el[1];
+ m_el[2] = other.m_el[2];
+ }
+ /** @brief Assignment Operator */
+ SIMD_FORCE_INLINE btMatrix3x3& operator=(const btMatrix3x3& other)
+ {
+ m_el[0] = other.m_el[0];
+ m_el[1] = other.m_el[1];
+ m_el[2] = other.m_el[2];
+ return *this;
+ }
+
+ /** @brief Get a column of the matrix as a vector
+ * @param i Column number 0 indexed */
+ SIMD_FORCE_INLINE btVector3 getColumn(int i) const
+ {
+ return btVector3(m_el[0][i],m_el[1][i],m_el[2][i]);
+ }
+
+
+ /** @brief Get a row of the matrix as a vector
+ * @param i Row number 0 indexed */
+ SIMD_FORCE_INLINE const btVector3& getRow(int i) const
+ {
+ btFullAssert(0 <= i && i < 3);
+ return m_el[i];
+ }
+
+ /** @brief Get a mutable reference to a row of the matrix as a vector
+ * @param i Row number 0 indexed */
+ SIMD_FORCE_INLINE btVector3& operator[](int i)
+ {
+ btFullAssert(0 <= i && i < 3);
+ return m_el[i];
+ }
+
+ /** @brief Get a const reference to a row of the matrix as a vector
+ * @param i Row number 0 indexed */
+ SIMD_FORCE_INLINE const btVector3& operator[](int i) const
+ {
+ btFullAssert(0 <= i && i < 3);
+ return m_el[i];
+ }
+
+ /** @brief Multiply by the target matrix on the right
+ * @param m Rotation matrix to be applied
+ * Equivilant to this = this * m */
+ btMatrix3x3& operator*=(const btMatrix3x3& m);
+
+ /** @brief Adds by the target matrix on the right
+ * @param m matrix to be applied
+ * Equivilant to this = this + m */
+ btMatrix3x3& operator+=(const btMatrix3x3& m);
+
+ /** @brief Substractss by the target matrix on the right
+ * @param m matrix to be applied
+ * Equivilant to this = this - m */
+ btMatrix3x3& operator-=(const btMatrix3x3& m);
+
+ /** @brief Set from the rotational part of a 4x4 OpenGL matrix
+ * @param m A pointer to the beginning of the array of scalars*/
void setFromOpenGLSubMatrix(const btScalar *m)
- {
- m_el[0].setValue(m[0],m[4],m[8]);
- m_el[1].setValue(m[1],m[5],m[9]);
- m_el[2].setValue(m[2],m[6],m[10]);
+ {
+ m_el[0].setValue(m[0],m[4],m[8]);
+ m_el[1].setValue(m[1],m[5],m[9]);
+ m_el[2].setValue(m[2],m[6],m[10]);
- }
- /** @brief Set the values of the matrix explicitly (row major)
- * @param xx Top left
- * @param xy Top Middle
- * @param xz Top Right
- * @param yx Middle Left
- * @param yy Middle Middle
- * @param yz Middle Right
- * @param zx Bottom Left
- * @param zy Bottom Middle
- * @param zz Bottom Right*/
- void setValue(const btScalar& xx, const btScalar& xy, const btScalar& xz,
- const btScalar& yx, const btScalar& yy, const btScalar& yz,
- const btScalar& zx, const btScalar& zy, const btScalar& zz)
- {
- m_el[0].setValue(xx,xy,xz);
- m_el[1].setValue(yx,yy,yz);
- m_el[2].setValue(zx,zy,zz);
- }
+ }
+ /** @brief Set the values of the matrix explicitly (row major)
+ * @param xx Top left
+ * @param xy Top Middle
+ * @param xz Top Right
+ * @param yx Middle Left
+ * @param yy Middle Middle
+ * @param yz Middle Right
+ * @param zx Bottom Left
+ * @param zy Bottom Middle
+ * @param zz Bottom Right*/
+ void setValue(const btScalar& xx, const btScalar& xy, const btScalar& xz,
+ const btScalar& yx, const btScalar& yy, const btScalar& yz,
+ const btScalar& zx, const btScalar& zy, const btScalar& zz)
+ {
+ m_el[0].setValue(xx,xy,xz);
+ m_el[1].setValue(yx,yy,yz);
+ m_el[2].setValue(zx,zy,zz);
+ }
+
+ /** @brief Set the matrix from a quaternion
+ * @param q The Quaternion to match */
+ void setRotation(const btQuaternion& q)
+ {
+ btScalar d = q.length2();
+ btFullAssert(d != btScalar(0.0));
+ btScalar s = btScalar(2.0) / d;
+ btScalar xs = q.x() * s, ys = q.y() * s, zs = q.z() * s;
+ btScalar wx = q.w() * xs, wy = q.w() * ys, wz = q.w() * zs;
+ btScalar xx = q.x() * xs, xy = q.x() * ys, xz = q.x() * zs;
+ btScalar yy = q.y() * ys, yz = q.y() * zs, zz = q.z() * zs;
+ setValue(btScalar(1.0) - (yy + zz), xy - wz, xz + wy,
+ xy + wz, btScalar(1.0) - (xx + zz), yz - wx,
+ xz - wy, yz + wx, btScalar(1.0) - (xx + yy));
+ }
- /** @brief Set the matrix from a quaternion
- * @param q The Quaternion to match */
- void setRotation(const btQuaternion& q)
- {
- btScalar d = q.length2();
- btFullAssert(d != btScalar(0.0));
- btScalar s = btScalar(2.0) / d;
- btScalar xs = q.x() * s, ys = q.y() * s, zs = q.z() * s;
- btScalar wx = q.w() * xs, wy = q.w() * ys, wz = q.w() * zs;
- btScalar xx = q.x() * xs, xy = q.x() * ys, xz = q.x() * zs;
- btScalar yy = q.y() * ys, yz = q.y() * zs, zz = q.z() * zs;
- setValue(btScalar(1.0) - (yy + zz), xy - wz, xz + wy,
- xy + wz, btScalar(1.0) - (xx + zz), yz - wx,
- xz - wy, yz + wx, btScalar(1.0) - (xx + yy));
- }
-
-
- /** @brief Set the matrix from euler angles using YPR around YXZ respectively
- * @param yaw Yaw about Y axis
- * @param pitch Pitch about X axis
- * @param roll Roll about Z axis
- */
- void setEulerYPR(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
- {
- setEulerZYX(roll, pitch, yaw);
- }
+
+ /** @brief Set the matrix from euler angles using YPR around YXZ respectively
+ * @param yaw Yaw about Y axis
+ * @param pitch Pitch about X axis
+ * @param roll Roll about Z axis
+ */
+ void setEulerYPR(const btScalar& yaw, const btScalar& pitch, const btScalar& roll)
+ {
+ setEulerZYX(roll, pitch, yaw);
+ }
/** @brief Set the matrix from euler angles YPR around ZYX axes
- * @param eulerX Roll about X axis
- * @param eulerY Pitch around Y axis
- * @param eulerZ Yaw aboud Z axis
- *
- * These angles are used to produce a rotation matrix. The euler
- * angles are applied in ZYX order. I.e a vector is first rotated
- * about X then Y and then Z
- **/
+ * @param eulerX Roll about X axis
+ * @param eulerY Pitch around Y axis
+ * @param eulerZ Yaw aboud Z axis
+ *
+ * These angles are used to produce a rotation matrix. The euler
+ * angles are applied in ZYX order. I.e a vector is first rotated
+ * about X then Y and then Z
+ **/
void setEulerZYX(btScalar eulerX,btScalar eulerY,btScalar eulerZ) {
- ///@todo proposed to reverse this since it's labeled zyx but takes arguments xyz and it will match all other parts of the code
+ ///@todo proposed to reverse this since it's labeled zyx but takes arguments xyz and it will match all other parts of the code
btScalar ci ( btCos(eulerX));
btScalar cj ( btCos(eulerY));
btScalar ch ( btCos(eulerZ));
@@ -179,227 +196,233 @@ class btMatrix3x3 {
btScalar cs = ci * sh;
btScalar sc = si * ch;
btScalar ss = si * sh;
-
+
setValue(cj * ch, sj * sc - cs, sj * cc + ss,
- cj * sh, sj * ss + cc, sj * cs - sc,
- -sj, cj * si, cj * ci);
+ cj * sh, sj * ss + cc, sj * cs - sc,
+ -sj, cj * si, cj * ci);
}
- /**@brief Set the matrix to the identity */
- void setIdentity()
- {
- setValue(btScalar(1.0), btScalar(0.0), btScalar(0.0),
- btScalar(0.0), btScalar(1.0), btScalar(0.0),
- btScalar(0.0), btScalar(0.0), btScalar(1.0));
- }
+ /**@brief Set the matrix to the identity */
+ void setIdentity()
+ {
+ setValue(btScalar(1.0), btScalar(0.0), btScalar(0.0),
+ btScalar(0.0), btScalar(1.0), btScalar(0.0),
+ btScalar(0.0), btScalar(0.0), btScalar(1.0));
+ }
+
+ static const btMatrix3x3& getIdentity()
+ {
+ static const btMatrix3x3 identityMatrix(btScalar(1.0), btScalar(0.0), btScalar(0.0),
+ btScalar(0.0), btScalar(1.0), btScalar(0.0),
+ btScalar(0.0), btScalar(0.0), btScalar(1.0));
+ return identityMatrix;
+ }
+
+ /**@brief Fill the rotational part of an OpenGL matrix and clear the shear/perspective
+ * @param m The array to be filled */
+ void getOpenGLSubMatrix(btScalar *m) const
+ {
+ m[0] = btScalar(m_el[0].x());
+ m[1] = btScalar(m_el[1].x());
+ m[2] = btScalar(m_el[2].x());
+ m[3] = btScalar(0.0);
+ m[4] = btScalar(m_el[0].y());
+ m[5] = btScalar(m_el[1].y());
+ m[6] = btScalar(m_el[2].y());
+ m[7] = btScalar(0.0);
+ m[8] = btScalar(m_el[0].z());
+ m[9] = btScalar(m_el[1].z());
+ m[10] = btScalar(m_el[2].z());
+ m[11] = btScalar(0.0);
+ }
+
+ /**@brief Get the matrix represented as a quaternion
+ * @param q The quaternion which will be set */
+ void getRotation(btQuaternion& q) const
+ {
+ btScalar trace = m_el[0].x() + m_el[1].y() + m_el[2].z();
+ btScalar temp[4];
- static const btMatrix3x3& getIdentity()
+ if (trace > btScalar(0.0))
+ {
+ btScalar s = btSqrt(trace + btScalar(1.0));
+ temp[3]=(s * btScalar(0.5));
+ s = btScalar(0.5) / s;
+
+ temp[0]=((m_el[2].y() - m_el[1].z()) * s);
+ temp[1]=((m_el[0].z() - m_el[2].x()) * s);
+ temp[2]=((m_el[1].x() - m_el[0].y()) * s);
+ }
+ else
{
- static const btMatrix3x3 identityMatrix(btScalar(1.0), btScalar(0.0), btScalar(0.0),
- btScalar(0.0), btScalar(1.0), btScalar(0.0),
- btScalar(0.0), btScalar(0.0), btScalar(1.0));
- return identityMatrix;
+ int i = m_el[0].x() < m_el[1].y() ?
+ (m_el[1].y() < m_el[2].z() ? 2 : 1) :
+ (m_el[0].x() < m_el[2].z() ? 2 : 0);
+ int j = (i + 1) % 3;
+ int k = (i + 2) % 3;
+
+ btScalar s = btSqrt(m_el[i][i] - m_el[j][j] - m_el[k][k] + btScalar(1.0));
+ temp[i] = s * btScalar(0.5);
+ s = btScalar(0.5) / s;
+
+ temp[3] = (m_el[k][j] - m_el[j][k]) * s;
+ temp[j] = (m_el[j][i] + m_el[i][j]) * s;
+ temp[k] = (m_el[k][i] + m_el[i][k]) * s;
}
+ q.setValue(temp[0],temp[1],temp[2],temp[3]);
+ }
+
+ /**@brief Get the matrix represented as euler angles around YXZ, roundtrip with setEulerYPR
+ * @param yaw Yaw around Y axis
+ * @param pitch Pitch around X axis
+ * @param roll around Z axis */
+ void getEulerYPR(btScalar& yaw, btScalar& pitch, btScalar& roll) const
+ {
+
+ // first use the normal calculus
+ yaw = btScalar(btAtan2(m_el[1].x(), m_el[0].x()));
+ pitch = btScalar(btAsin(-m_el[2].x()));
+ roll = btScalar(btAtan2(m_el[2].y(), m_el[2].z()));
- /**@brief Fill the values of the matrix into a 9 element array
- * @param m The array to be filled */
- void getOpenGLSubMatrix(btScalar *m) const
+ // on pitch = +/-HalfPI
+ if (btFabs(pitch)==SIMD_HALF_PI)
{
- m[0] = btScalar(m_el[0].x());
- m[1] = btScalar(m_el[1].x());
- m[2] = btScalar(m_el[2].x());
- m[3] = btScalar(0.0);
- m[4] = btScalar(m_el[0].y());
- m[5] = btScalar(m_el[1].y());
- m[6] = btScalar(m_el[2].y());
- m[7] = btScalar(0.0);
- m[8] = btScalar(m_el[0].z());
- m[9] = btScalar(m_el[1].z());
- m[10] = btScalar(m_el[2].z());
- m[11] = btScalar(0.0);
+ if (yaw>0)
+ yaw-=SIMD_PI;
+ else
+ yaw+=SIMD_PI;
+
+ if (roll>0)
+ roll-=SIMD_PI;
+ else
+ roll+=SIMD_PI;
}
+ };
- /**@brief Get the matrix represented as a quaternion
- * @param q The quaternion which will be set */
- void getRotation(btQuaternion& q) const
+
+ /**@brief Get the matrix represented as euler angles around ZYX
+ * @param yaw Yaw around X axis
+ * @param pitch Pitch around Y axis
+ * @param roll around X axis
+ * @param solution_number Which solution of two possible solutions ( 1 or 2) are possible values*/
+ void getEulerZYX(btScalar& yaw, btScalar& pitch, btScalar& roll, unsigned int solution_number = 1) const
+ {
+ struct Euler
{
- btScalar trace = m_el[0].x() + m_el[1].y() + m_el[2].z();
- btScalar temp[4];
-
- if (trace > btScalar(0.0))
+ btScalar yaw;
+ btScalar pitch;
+ btScalar roll;
+ };
+
+ Euler euler_out;
+ Euler euler_out2; //second solution
+ //get the pointer to the raw data
+
+ // Check that pitch is not at a singularity
+ if (btFabs(m_el[2].x()) >= 1)
+ {
+ euler_out.yaw = 0;
+ euler_out2.yaw = 0;
+
+ // From difference of angles formula
+ btScalar delta = btAtan2(m_el[0].x(),m_el[0].z());
+ if (m_el[2].x() > 0) //gimbal locked up
{
- btScalar s = btSqrt(trace + btScalar(1.0));
- temp[3]=(s * btScalar(0.5));
- s = btScalar(0.5) / s;
-
- temp[0]=((m_el[2].y() - m_el[1].z()) * s);
- temp[1]=((m_el[0].z() - m_el[2].x()) * s);
- temp[2]=((m_el[1].x() - m_el[0].y()) * s);
- }
- else
+ euler_out.pitch = SIMD_PI / btScalar(2.0);
+ euler_out2.pitch = SIMD_PI / btScalar(2.0);
+ euler_out.roll = euler_out.pitch + delta;
+ euler_out2.roll = euler_out.pitch + delta;
+ }
+ else // gimbal locked down
{
- int i = m_el[0].x() < m_el[1].y() ?
- (m_el[1].y() < m_el[2].z() ? 2 : 1) :
- (m_el[0].x() < m_el[2].z() ? 2 : 0);
- int j = (i + 1) % 3;
- int k = (i + 2) % 3;
-
- btScalar s = btSqrt(m_el[i][i] - m_el[j][j] - m_el[k][k] + btScalar(1.0));
- temp[i] = s * btScalar(0.5);
- s = btScalar(0.5) / s;
-
- temp[3] = (m_el[k][j] - m_el[j][k]) * s;
- temp[j] = (m_el[j][i] + m_el[i][j]) * s;
- temp[k] = (m_el[k][i] + m_el[i][k]) * s;
+ euler_out.pitch = -SIMD_PI / btScalar(2.0);
+ euler_out2.pitch = -SIMD_PI / btScalar(2.0);
+ euler_out.roll = -euler_out.pitch + delta;
+ euler_out2.roll = -euler_out.pitch + delta;
}
- q.setValue(temp[0],temp[1],temp[2],temp[3]);
}
-
- /**@brief Get the matrix represented as euler angles around YXZ, roundtrip with setEulerYPR
- * @param yaw Yaw around Y axis
- * @param pitch Pitch around X axis
- * @param roll around Z axis */
- void getEulerYPR(btScalar& yaw, btScalar& pitch, btScalar& roll) const
+ else
{
-
- // first use the normal calculus
- yaw = btScalar(btAtan2(m_el[1].x(), m_el[0].x()));
- pitch = btScalar(btAsin(-m_el[2].x()));
- roll = btScalar(btAtan2(m_el[2].y(), m_el[2].z()));
-
- // on pitch = +/-HalfPI
- if (btFabs(pitch)==SIMD_HALF_PI)
- {
- if (yaw>0)
- yaw-=SIMD_PI;
- else
- yaw+=SIMD_PI;
-
- if (roll>0)
- roll-=SIMD_PI;
- else
- roll+=SIMD_PI;
- }
- };
-
+ euler_out.pitch = - btAsin(m_el[2].x());
+ euler_out2.pitch = SIMD_PI - euler_out.pitch;
- /**@brief Get the matrix represented as euler angles around ZYX
- * @param yaw Yaw around X axis
- * @param pitch Pitch around Y axis
- * @param roll around X axis
- * @param solution_number Which solution of two possible solutions ( 1 or 2) are possible values*/
- void getEulerZYX(btScalar& yaw, btScalar& pitch, btScalar& roll, unsigned int solution_number = 1) const
- {
- struct Euler{btScalar yaw, pitch, roll;};
- Euler euler_out;
- Euler euler_out2; //second solution
- //get the pointer to the raw data
-
- // Check that pitch is not at a singularity
- if (btFabs(m_el[2].x()) >= 1)
- {
- euler_out.yaw = 0;
- euler_out2.yaw = 0;
-
- // From difference of angles formula
- btScalar delta = btAtan2(m_el[0].x(),m_el[0].z());
- if (m_el[2].x() > 0) //gimbal locked up
- {
- euler_out.pitch = SIMD_PI / btScalar(2.0);
- euler_out2.pitch = SIMD_PI / btScalar(2.0);
- euler_out.roll = euler_out.pitch + delta;
- euler_out2.roll = euler_out.pitch + delta;
- }
- else // gimbal locked down
- {
- euler_out.pitch = -SIMD_PI / btScalar(2.0);
- euler_out2.pitch = -SIMD_PI / btScalar(2.0);
- euler_out.roll = -euler_out.pitch + delta;
- euler_out2.roll = -euler_out.pitch + delta;
- }
- }
- else
- {
- euler_out.pitch = - btAsin(m_el[2].x());
- euler_out2.pitch = SIMD_PI - euler_out.pitch;
-
- euler_out.roll = btAtan2(m_el[2].y()/btCos(euler_out.pitch),
- m_el[2].z()/btCos(euler_out.pitch));
- euler_out2.roll = btAtan2(m_el[2].y()/btCos(euler_out2.pitch),
+ euler_out.roll = btAtan2(m_el[2].y()/btCos(euler_out.pitch),
+ m_el[2].z()/btCos(euler_out.pitch));
+ euler_out2.roll = btAtan2(m_el[2].y()/btCos(euler_out2.pitch),
m_el[2].z()/btCos(euler_out2.pitch));
-
- euler_out.yaw = btAtan2(m_el[1].x()/btCos(euler_out.pitch),
- m_el[0].x()/btCos(euler_out.pitch));
- euler_out2.yaw = btAtan2(m_el[1].x()/btCos(euler_out2.pitch),
- m_el[0].x()/btCos(euler_out2.pitch));
- }
-
- if (solution_number == 1)
- {
- yaw = euler_out.yaw;
- pitch = euler_out.pitch;
- roll = euler_out.roll;
- }
- else
- {
- yaw = euler_out2.yaw;
- pitch = euler_out2.pitch;
- roll = euler_out2.roll;
- }
- }
-
- /**@brief Create a scaled copy of the matrix
- * @param s Scaling vector The elements of the vector will scale each column */
-
- btMatrix3x3 scaled(const btVector3& s) const
- {
- return btMatrix3x3(m_el[0].x() * s.x(), m_el[0].y() * s.y(), m_el[0].z() * s.z(),
- m_el[1].x() * s.x(), m_el[1].y() * s.y(), m_el[1].z() * s.z(),
- m_el[2].x() * s.x(), m_el[2].y() * s.y(), m_el[2].z() * s.z());
- }
- /**@brief Return the determinant of the matrix */
- btScalar determinant() const;
- /**@brief Return the adjoint of the matrix */
- btMatrix3x3 adjoint() const;
- /**@brief Return the matrix with all values non negative */
- btMatrix3x3 absolute() const;
- /**@brief Return the transpose of the matrix */
- btMatrix3x3 transpose() const;
- /**@brief Return the inverse of the matrix */
- btMatrix3x3 inverse() const;
-
- btMatrix3x3 transposeTimes(const btMatrix3x3& m) const;
- btMatrix3x3 timesTranspose(const btMatrix3x3& m) const;
-
- SIMD_FORCE_INLINE btScalar tdotx(const btVector3& v) const
- {
- return m_el[0].x() * v.x() + m_el[1].x() * v.y() + m_el[2].x() * v.z();
+ euler_out.yaw = btAtan2(m_el[1].x()/btCos(euler_out.pitch),
+ m_el[0].x()/btCos(euler_out.pitch));
+ euler_out2.yaw = btAtan2(m_el[1].x()/btCos(euler_out2.pitch),
+ m_el[0].x()/btCos(euler_out2.pitch));
}
- SIMD_FORCE_INLINE btScalar tdoty(const btVector3& v) const
- {
- return m_el[0].y() * v.x() + m_el[1].y() * v.y() + m_el[2].y() * v.z();
+
+ if (solution_number == 1)
+ {
+ yaw = euler_out.yaw;
+ pitch = euler_out.pitch;
+ roll = euler_out.roll;
}
- SIMD_FORCE_INLINE btScalar tdotz(const btVector3& v) const
- {
- return m_el[0].z() * v.x() + m_el[1].z() * v.y() + m_el[2].z() * v.z();
+ else
+ {
+ yaw = euler_out2.yaw;
+ pitch = euler_out2.pitch;
+ roll = euler_out2.roll;
}
-
-
- /**@brief diagonalizes this matrix by the Jacobi method.
- * @param rot stores the rotation from the coordinate system in which the matrix is diagonal to the original
- * coordinate system, i.e., old_this = rot * new_this * rot^T.
- * @param threshold See iteration
- * @param iteration The iteration stops when all off-diagonal elements are less than the threshold multiplied
- * by the sum of the absolute values of the diagonal, or when maxSteps have been executed.
- *
- * Note that this matrix is assumed to be symmetric.
- */
- void diagonalize(btMatrix3x3& rot, btScalar threshold, int maxSteps)
+ }
+
+ /**@brief Create a scaled copy of the matrix
+ * @param s Scaling vector The elements of the vector will scale each column */
+
+ btMatrix3x3 scaled(const btVector3& s) const
+ {
+ return btMatrix3x3(m_el[0].x() * s.x(), m_el[0].y() * s.y(), m_el[0].z() * s.z(),
+ m_el[1].x() * s.x(), m_el[1].y() * s.y(), m_el[1].z() * s.z(),
+ m_el[2].x() * s.x(), m_el[2].y() * s.y(), m_el[2].z() * s.z());
+ }
+
+ /**@brief Return the determinant of the matrix */
+ btScalar determinant() const;
+ /**@brief Return the adjoint of the matrix */
+ btMatrix3x3 adjoint() const;
+ /**@brief Return the matrix with all values non negative */
+ btMatrix3x3 absolute() const;
+ /**@brief Return the transpose of the matrix */
+ btMatrix3x3 transpose() const;
+ /**@brief Return the inverse of the matrix */
+ btMatrix3x3 inverse() const;
+
+ btMatrix3x3 transposeTimes(const btMatrix3x3& m) const;
+ btMatrix3x3 timesTranspose(const btMatrix3x3& m) const;
+
+ SIMD_FORCE_INLINE btScalar tdotx(const btVector3& v) const
+ {
+ return m_el[0].x() * v.x() + m_el[1].x() * v.y() + m_el[2].x() * v.z();
+ }
+ SIMD_FORCE_INLINE btScalar tdoty(const btVector3& v) const
+ {
+ return m_el[0].y() * v.x() + m_el[1].y() * v.y() + m_el[2].y() * v.z();
+ }
+ SIMD_FORCE_INLINE btScalar tdotz(const btVector3& v) const
+ {
+ return m_el[0].z() * v.x() + m_el[1].z() * v.y() + m_el[2].z() * v.z();
+ }
+
+
+ /**@brief diagonalizes this matrix by the Jacobi method.
+ * @param rot stores the rotation from the coordinate system in which the matrix is diagonal to the original
+ * coordinate system, i.e., old_this = rot * new_this * rot^T.
+ * @param threshold See iteration
+ * @param iteration The iteration stops when all off-diagonal elements are less than the threshold multiplied
+ * by the sum of the absolute values of the diagonal, or when maxSteps have been executed.
+ *
+ * Note that this matrix is assumed to be symmetric.
+ */
+ void diagonalize(btMatrix3x3& rot, btScalar threshold, int maxSteps)
+ {
+ rot.setIdentity();
+ for (int step = maxSteps; step > 0; step--)
{
- rot.setIdentity();
- for (int step = maxSteps; step > 0; step--)
- {
// find off-diagonal element [p][q] with largest magnitude
int p = 0;
int q = 1;
@@ -408,27 +431,27 @@ class btMatrix3x3 {
btScalar v = btFabs(m_el[0][2]);
if (v > max)
{
- q = 2;
- r = 1;
- max = v;
+ q = 2;
+ r = 1;
+ max = v;
}
v = btFabs(m_el[1][2]);
if (v > max)
{
- p = 1;
- q = 2;
- r = 0;
- max = v;
+ p = 1;
+ q = 2;
+ r = 0;
+ max = v;
}
btScalar t = threshold * (btFabs(m_el[0][0]) + btFabs(m_el[1][1]) + btFabs(m_el[2][2]));
if (max <= t)
{
- if (max <= SIMD_EPSILON * t)
- {
- return;
- }
- step = 1;
+ if (max <= SIMD_EPSILON * t)
+ {
+ return;
+ }
+ step = 1;
}
// compute Jacobi rotation J which leads to a zero for element [p][q]
@@ -439,17 +462,17 @@ class btMatrix3x3 {
btScalar sin;
if (theta2 * theta2 < btScalar(10 / SIMD_EPSILON))
{
- t = (theta >= 0) ? 1 / (theta + btSqrt(1 + theta2))
- : 1 / (theta - btSqrt(1 + theta2));
- cos = 1 / btSqrt(1 + t * t);
- sin = cos * t;
+ t = (theta >= 0) ? 1 / (theta + btSqrt(1 + theta2))
+ : 1 / (theta - btSqrt(1 + theta2));
+ cos = 1 / btSqrt(1 + t * t);
+ sin = cos * t;
}
else
{
- // approximation for large theta-value, i.e., a nearly diagonal matrix
- t = 1 / (theta * (2 + btScalar(0.5) / theta2));
- cos = 1 - btScalar(0.5) * t * t;
- sin = cos * t;
+ // approximation for large theta-value, i.e., a nearly diagonal matrix
+ t = 1 / (theta * (2 + btScalar(0.5) / theta2));
+ cos = 1 - btScalar(0.5) * t * t;
+ sin = cos * t;
}
// apply rotation to matrix (this = J^T * this * J)
@@ -464,155 +487,285 @@ class btMatrix3x3 {
// apply rotation to rot (rot = rot * J)
for (int i = 0; i < 3; i++)
{
- btVector3& row = rot[i];
- mrp = row[p];
- mrq = row[q];
- row[p] = cos * mrp - sin * mrq;
- row[q] = cos * mrq + sin * mrp;
+ btVector3& row = rot[i];
+ mrp = row[p];
+ mrq = row[q];
+ row[p] = cos * mrp - sin * mrq;
+ row[q] = cos * mrq + sin * mrp;
}
- }
}
+ }
-
- protected:
- /**@brief Calculate the matrix cofactor
- * @param r1 The first row to use for calculating the cofactor
- * @param c1 The first column to use for calculating the cofactor
- * @param r1 The second row to use for calculating the cofactor
- * @param c1 The second column to use for calculating the cofactor
- * See http://en.wikipedia.org/wiki/Cofactor_(linear_algebra) for more details
- */
- btScalar cofac(int r1, int c1, int r2, int c2) const
- {
- return m_el[r1][c1] * m_el[r2][c2] - m_el[r1][c2] * m_el[r2][c1];
- }
- ///Data storage for the matrix, each vector is a row of the matrix
- btVector3 m_el[3];
- };
-
- SIMD_FORCE_INLINE btMatrix3x3&
- btMatrix3x3::operator*=(const btMatrix3x3& m)
- {
- setValue(m.tdotx(m_el[0]), m.tdoty(m_el[0]), m.tdotz(m_el[0]),
- m.tdotx(m_el[1]), m.tdoty(m_el[1]), m.tdotz(m_el[1]),
- m.tdotx(m_el[2]), m.tdoty(m_el[2]), m.tdotz(m_el[2]));
- return *this;
- }
-
- SIMD_FORCE_INLINE btScalar
- btMatrix3x3::determinant() const
- {
- return triple((*this)[0], (*this)[1], (*this)[2]);
- }
-
- SIMD_FORCE_INLINE btMatrix3x3
- btMatrix3x3::absolute() const
- {
- return btMatrix3x3(
- btFabs(m_el[0].x()), btFabs(m_el[0].y()), btFabs(m_el[0].z()),
- btFabs(m_el[1].x()), btFabs(m_el[1].y()), btFabs(m_el[1].z()),
- btFabs(m_el[2].x()), btFabs(m_el[2].y()), btFabs(m_el[2].z()));
- }
- SIMD_FORCE_INLINE btMatrix3x3
- btMatrix3x3::transpose() const
+ /**@brief Calculate the matrix cofactor
+ * @param r1 The first row to use for calculating the cofactor
+ * @param c1 The first column to use for calculating the cofactor
+ * @param r1 The second row to use for calculating the cofactor
+ * @param c1 The second column to use for calculating the cofactor
+ * See http://en.wikipedia.org/wiki/Cofactor_(linear_algebra) for more details
+ */
+ btScalar cofac(int r1, int c1, int r2, int c2) const
{
- return btMatrix3x3(m_el[0].x(), m_el[1].x(), m_el[2].x(),
- m_el[0].y(), m_el[1].y(), m_el[2].y(),
- m_el[0].z(), m_el[1].z(), m_el[2].z());
- }
-
- SIMD_FORCE_INLINE btMatrix3x3
- btMatrix3x3::adjoint() const
- {
- return btMatrix3x3(cofac(1, 1, 2, 2), cofac(0, 2, 2, 1), cofac(0, 1, 1, 2),
- cofac(1, 2, 2, 0), cofac(0, 0, 2, 2), cofac(0, 2, 1, 0),
- cofac(1, 0, 2, 1), cofac(0, 1, 2, 0), cofac(0, 0, 1, 1));
- }
-
- SIMD_FORCE_INLINE btMatrix3x3
- btMatrix3x3::inverse() const
- {
- btVector3 co(cofac(1, 1, 2, 2), cofac(1, 2, 2, 0), cofac(1, 0, 2, 1));
- btScalar det = (*this)[0].dot(co);
- btFullAssert(det != btScalar(0.0));
- btScalar s = btScalar(1.0) / det;
- return btMatrix3x3(co.x() * s, cofac(0, 2, 2, 1) * s, cofac(0, 1, 1, 2) * s,
- co.y() * s, cofac(0, 0, 2, 2) * s, cofac(0, 2, 1, 0) * s,
- co.z() * s, cofac(0, 1, 2, 0) * s, cofac(0, 0, 1, 1) * s);
- }
-
- SIMD_FORCE_INLINE btMatrix3x3
- btMatrix3x3::transposeTimes(const btMatrix3x3& m) const
- {
- return btMatrix3x3(
- m_el[0].x() * m[0].x() + m_el[1].x() * m[1].x() + m_el[2].x() * m[2].x(),
- m_el[0].x() * m[0].y() + m_el[1].x() * m[1].y() + m_el[2].x() * m[2].y(),
- m_el[0].x() * m[0].z() + m_el[1].x() * m[1].z() + m_el[2].x() * m[2].z(),
- m_el[0].y() * m[0].x() + m_el[1].y() * m[1].x() + m_el[2].y() * m[2].x(),
- m_el[0].y() * m[0].y() + m_el[1].y() * m[1].y() + m_el[2].y() * m[2].y(),
- m_el[0].y() * m[0].z() + m_el[1].y() * m[1].z() + m_el[2].y() * m[2].z(),
- m_el[0].z() * m[0].x() + m_el[1].z() * m[1].x() + m_el[2].z() * m[2].x(),
- m_el[0].z() * m[0].y() + m_el[1].z() * m[1].y() + m_el[2].z() * m[2].y(),
- m_el[0].z() * m[0].z() + m_el[1].z() * m[1].z() + m_el[2].z() * m[2].z());
- }
-
- SIMD_FORCE_INLINE btMatrix3x3
- btMatrix3x3::timesTranspose(const btMatrix3x3& m) const
- {
- return btMatrix3x3(
- m_el[0].dot(m[0]), m_el[0].dot(m[1]), m_el[0].dot(m[2]),
- m_el[1].dot(m[0]), m_el[1].dot(m[1]), m_el[1].dot(m[2]),
- m_el[2].dot(m[0]), m_el[2].dot(m[1]), m_el[2].dot(m[2]));
-
+ return m_el[r1][c1] * m_el[r2][c2] - m_el[r1][c2] * m_el[r2][c1];
}
- SIMD_FORCE_INLINE btVector3
- operator*(const btMatrix3x3& m, const btVector3& v)
- {
- return btVector3(m[0].dot(v), m[1].dot(v), m[2].dot(v));
- }
-
+ void serialize(struct btMatrix3x3Data& dataOut) const;
- SIMD_FORCE_INLINE btVector3
- operator*(const btVector3& v, const btMatrix3x3& m)
- {
- return btVector3(m.tdotx(v), m.tdoty(v), m.tdotz(v));
- }
+ void serializeFloat(struct btMatrix3x3FloatData& dataOut) const;
- SIMD_FORCE_INLINE btMatrix3x3
- operator*(const btMatrix3x3& m1, const btMatrix3x3& m2)
- {
- return btMatrix3x3(
- m2.tdotx( m1[0]), m2.tdoty( m1[0]), m2.tdotz( m1[0]),
- m2.tdotx( m1[1]), m2.tdoty( m1[1]), m2.tdotz( m1[1]),
- m2.tdotx( m1[2]), m2.tdoty( m1[2]), m2.tdotz( m1[2]));
- }
+ void deSerialize(const struct btMatrix3x3Data& dataIn);
+
+ void deSerializeFloat(const struct btMatrix3x3FloatData& dataIn);
+
+ void deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn);
+
+};
+
+
+SIMD_FORCE_INLINE btMatrix3x3&
+btMatrix3x3::operator*=(const btMatrix3x3& m)
+{
+ setValue(m.tdotx(m_el[0]), m.tdoty(m_el[0]), m.tdotz(m_el[0]),
+ m.tdotx(m_el[1]), m.tdoty(m_el[1]), m.tdotz(m_el[1]),
+ m.tdotx(m_el[2]), m.tdoty(m_el[2]), m.tdotz(m_el[2]));
+ return *this;
+}
+
+SIMD_FORCE_INLINE btMatrix3x3&
+btMatrix3x3::operator+=(const btMatrix3x3& m)
+{
+ setValue(
+ m_el[0][0]+m.m_el[0][0],
+ m_el[0][1]+m.m_el[0][1],
+ m_el[0][2]+m.m_el[0][2],
+ m_el[1][0]+m.m_el[1][0],
+ m_el[1][1]+m.m_el[1][1],
+ m_el[1][2]+m.m_el[1][2],
+ m_el[2][0]+m.m_el[2][0],
+ m_el[2][1]+m.m_el[2][1],
+ m_el[2][2]+m.m_el[2][2]);
+ return *this;
+}
+
+SIMD_FORCE_INLINE btMatrix3x3
+operator*(const btMatrix3x3& m, const btScalar & k)
+{
+ return btMatrix3x3(
+ m[0].x()*k,m[0].y()*k,m[0].z()*k,
+ m[1].x()*k,m[1].y()*k,m[1].z()*k,
+ m[2].x()*k,m[2].y()*k,m[2].z()*k);
+}
+
+ SIMD_FORCE_INLINE btMatrix3x3
+operator+(const btMatrix3x3& m1, const btMatrix3x3& m2)
+{
+ return btMatrix3x3(
+ m1[0][0]+m2[0][0],
+ m1[0][1]+m2[0][1],
+ m1[0][2]+m2[0][2],
+ m1[1][0]+m2[1][0],
+ m1[1][1]+m2[1][1],
+ m1[1][2]+m2[1][2],
+ m1[2][0]+m2[2][0],
+ m1[2][1]+m2[2][1],
+ m1[2][2]+m2[2][2]);
+}
+
+SIMD_FORCE_INLINE btMatrix3x3
+operator-(const btMatrix3x3& m1, const btMatrix3x3& m2)
+{
+ return btMatrix3x3(
+ m1[0][0]-m2[0][0],
+ m1[0][1]-m2[0][1],
+ m1[0][2]-m2[0][2],
+ m1[1][0]-m2[1][0],
+ m1[1][1]-m2[1][1],
+ m1[1][2]-m2[1][2],
+ m1[2][0]-m2[2][0],
+ m1[2][1]-m2[2][1],
+ m1[2][2]-m2[2][2]);
+}
+
+
+SIMD_FORCE_INLINE btMatrix3x3&
+btMatrix3x3::operator-=(const btMatrix3x3& m)
+{
+ setValue(
+ m_el[0][0]-m.m_el[0][0],
+ m_el[0][1]-m.m_el[0][1],
+ m_el[0][2]-m.m_el[0][2],
+ m_el[1][0]-m.m_el[1][0],
+ m_el[1][1]-m.m_el[1][1],
+ m_el[1][2]-m.m_el[1][2],
+ m_el[2][0]-m.m_el[2][0],
+ m_el[2][1]-m.m_el[2][1],
+ m_el[2][2]-m.m_el[2][2]);
+ return *this;
+}
+
+
+SIMD_FORCE_INLINE btScalar
+btMatrix3x3::determinant() const
+{
+ return btTriple((*this)[0], (*this)[1], (*this)[2]);
+}
+
+
+SIMD_FORCE_INLINE btMatrix3x3
+btMatrix3x3::absolute() const
+{
+ return btMatrix3x3(
+ btFabs(m_el[0].x()), btFabs(m_el[0].y()), btFabs(m_el[0].z()),
+ btFabs(m_el[1].x()), btFabs(m_el[1].y()), btFabs(m_el[1].z()),
+ btFabs(m_el[2].x()), btFabs(m_el[2].y()), btFabs(m_el[2].z()));
+}
+
+SIMD_FORCE_INLINE btMatrix3x3
+btMatrix3x3::transpose() const
+{
+ return btMatrix3x3(m_el[0].x(), m_el[1].x(), m_el[2].x(),
+ m_el[0].y(), m_el[1].y(), m_el[2].y(),
+ m_el[0].z(), m_el[1].z(), m_el[2].z());
+}
+
+SIMD_FORCE_INLINE btMatrix3x3
+btMatrix3x3::adjoint() const
+{
+ return btMatrix3x3(cofac(1, 1, 2, 2), cofac(0, 2, 2, 1), cofac(0, 1, 1, 2),
+ cofac(1, 2, 2, 0), cofac(0, 0, 2, 2), cofac(0, 2, 1, 0),
+ cofac(1, 0, 2, 1), cofac(0, 1, 2, 0), cofac(0, 0, 1, 1));
+}
+
+SIMD_FORCE_INLINE btMatrix3x3
+btMatrix3x3::inverse() const
+{
+ btVector3 co(cofac(1, 1, 2, 2), cofac(1, 2, 2, 0), cofac(1, 0, 2, 1));
+ btScalar det = (*this)[0].dot(co);
+ btFullAssert(det != btScalar(0.0));
+ btScalar s = btScalar(1.0) / det;
+ return btMatrix3x3(co.x() * s, cofac(0, 2, 2, 1) * s, cofac(0, 1, 1, 2) * s,
+ co.y() * s, cofac(0, 0, 2, 2) * s, cofac(0, 2, 1, 0) * s,
+ co.z() * s, cofac(0, 1, 2, 0) * s, cofac(0, 0, 1, 1) * s);
+}
+
+SIMD_FORCE_INLINE btMatrix3x3
+btMatrix3x3::transposeTimes(const btMatrix3x3& m) const
+{
+ return btMatrix3x3(
+ m_el[0].x() * m[0].x() + m_el[1].x() * m[1].x() + m_el[2].x() * m[2].x(),
+ m_el[0].x() * m[0].y() + m_el[1].x() * m[1].y() + m_el[2].x() * m[2].y(),
+ m_el[0].x() * m[0].z() + m_el[1].x() * m[1].z() + m_el[2].x() * m[2].z(),
+ m_el[0].y() * m[0].x() + m_el[1].y() * m[1].x() + m_el[2].y() * m[2].x(),
+ m_el[0].y() * m[0].y() + m_el[1].y() * m[1].y() + m_el[2].y() * m[2].y(),
+ m_el[0].y() * m[0].z() + m_el[1].y() * m[1].z() + m_el[2].y() * m[2].z(),
+ m_el[0].z() * m[0].x() + m_el[1].z() * m[1].x() + m_el[2].z() * m[2].x(),
+ m_el[0].z() * m[0].y() + m_el[1].z() * m[1].y() + m_el[2].z() * m[2].y(),
+ m_el[0].z() * m[0].z() + m_el[1].z() * m[1].z() + m_el[2].z() * m[2].z());
+}
+
+SIMD_FORCE_INLINE btMatrix3x3
+btMatrix3x3::timesTranspose(const btMatrix3x3& m) const
+{
+ return btMatrix3x3(
+ m_el[0].dot(m[0]), m_el[0].dot(m[1]), m_el[0].dot(m[2]),
+ m_el[1].dot(m[0]), m_el[1].dot(m[1]), m_el[1].dot(m[2]),
+ m_el[2].dot(m[0]), m_el[2].dot(m[1]), m_el[2].dot(m[2]));
+
+}
+
+SIMD_FORCE_INLINE btVector3
+operator*(const btMatrix3x3& m, const btVector3& v)
+{
+ return btVector3(m[0].dot(v), m[1].dot(v), m[2].dot(v));
+}
+
+
+SIMD_FORCE_INLINE btVector3
+operator*(const btVector3& v, const btMatrix3x3& m)
+{
+ return btVector3(m.tdotx(v), m.tdoty(v), m.tdotz(v));
+}
+
+SIMD_FORCE_INLINE btMatrix3x3
+operator*(const btMatrix3x3& m1, const btMatrix3x3& m2)
+{
+ return btMatrix3x3(
+ m2.tdotx( m1[0]), m2.tdoty( m1[0]), m2.tdotz( m1[0]),
+ m2.tdotx( m1[1]), m2.tdoty( m1[1]), m2.tdotz( m1[1]),
+ m2.tdotx( m1[2]), m2.tdoty( m1[2]), m2.tdotz( m1[2]));
+}
/*
- SIMD_FORCE_INLINE btMatrix3x3 btMultTransposeLeft(const btMatrix3x3& m1, const btMatrix3x3& m2) {
- return btMatrix3x3(
- m1[0][0] * m2[0][0] + m1[1][0] * m2[1][0] + m1[2][0] * m2[2][0],
- m1[0][0] * m2[0][1] + m1[1][0] * m2[1][1] + m1[2][0] * m2[2][1],
- m1[0][0] * m2[0][2] + m1[1][0] * m2[1][2] + m1[2][0] * m2[2][2],
- m1[0][1] * m2[0][0] + m1[1][1] * m2[1][0] + m1[2][1] * m2[2][0],
- m1[0][1] * m2[0][1] + m1[1][1] * m2[1][1] + m1[2][1] * m2[2][1],
- m1[0][1] * m2[0][2] + m1[1][1] * m2[1][2] + m1[2][1] * m2[2][2],
- m1[0][2] * m2[0][0] + m1[1][2] * m2[1][0] + m1[2][2] * m2[2][0],
- m1[0][2] * m2[0][1] + m1[1][2] * m2[1][1] + m1[2][2] * m2[2][1],
- m1[0][2] * m2[0][2] + m1[1][2] * m2[1][2] + m1[2][2] * m2[2][2]);
+SIMD_FORCE_INLINE btMatrix3x3 btMultTransposeLeft(const btMatrix3x3& m1, const btMatrix3x3& m2) {
+return btMatrix3x3(
+m1[0][0] * m2[0][0] + m1[1][0] * m2[1][0] + m1[2][0] * m2[2][0],
+m1[0][0] * m2[0][1] + m1[1][0] * m2[1][1] + m1[2][0] * m2[2][1],
+m1[0][0] * m2[0][2] + m1[1][0] * m2[1][2] + m1[2][0] * m2[2][2],
+m1[0][1] * m2[0][0] + m1[1][1] * m2[1][0] + m1[2][1] * m2[2][0],
+m1[0][1] * m2[0][1] + m1[1][1] * m2[1][1] + m1[2][1] * m2[2][1],
+m1[0][1] * m2[0][2] + m1[1][1] * m2[1][2] + m1[2][1] * m2[2][2],
+m1[0][2] * m2[0][0] + m1[1][2] * m2[1][0] + m1[2][2] * m2[2][0],
+m1[0][2] * m2[0][1] + m1[1][2] * m2[1][1] + m1[2][2] * m2[2][1],
+m1[0][2] * m2[0][2] + m1[1][2] * m2[1][2] + m1[2][2] * m2[2][2]);
}
*/
/**@brief Equality operator between two matrices
- * It will test all elements are equal. */
+* It will test all elements are equal. */
SIMD_FORCE_INLINE bool operator==(const btMatrix3x3& m1, const btMatrix3x3& m2)
{
- return ( m1[0][0] == m2[0][0] && m1[1][0] == m2[1][0] && m1[2][0] == m2[2][0] &&
- m1[0][1] == m2[0][1] && m1[1][1] == m2[1][1] && m1[2][1] == m2[2][1] &&
- m1[0][2] == m2[0][2] && m1[1][2] == m2[1][2] && m1[2][2] == m2[2][2] );
+ return ( m1[0][0] == m2[0][0] && m1[1][0] == m2[1][0] && m1[2][0] == m2[2][0] &&
+ m1[0][1] == m2[0][1] && m1[1][1] == m2[1][1] && m1[2][1] == m2[2][1] &&
+ m1[0][2] == m2[0][2] && m1[1][2] == m2[1][2] && m1[2][2] == m2[2][2] );
+}
+
+///for serialization
+struct btMatrix3x3FloatData
+{
+ btVector3FloatData m_el[3];
+};
+
+///for serialization
+struct btMatrix3x3DoubleData
+{
+ btVector3DoubleData m_el[3];
+};
+
+
+
+
+SIMD_FORCE_INLINE void btMatrix3x3::serialize(struct btMatrix3x3Data& dataOut) const
+{
+ for (int i=0;i<3;i++)
+ m_el[i].serialize(dataOut.m_el[i]);
}
-#endif
+SIMD_FORCE_INLINE void btMatrix3x3::serializeFloat(struct btMatrix3x3FloatData& dataOut) const
+{
+ for (int i=0;i<3;i++)
+ m_el[i].serializeFloat(dataOut.m_el[i]);
+}
+
+
+SIMD_FORCE_INLINE void btMatrix3x3::deSerialize(const struct btMatrix3x3Data& dataIn)
+{
+ for (int i=0;i<3;i++)
+ m_el[i].deSerialize(dataIn.m_el[i]);
+}
+
+SIMD_FORCE_INLINE void btMatrix3x3::deSerializeFloat(const struct btMatrix3x3FloatData& dataIn)
+{
+ for (int i=0;i<3;i++)
+ m_el[i].deSerializeFloat(dataIn.m_el[i]);
+}
+
+SIMD_FORCE_INLINE void btMatrix3x3::deSerializeDouble(const struct btMatrix3x3DoubleData& dataIn)
+{
+ for (int i=0;i<3;i++)
+ m_el[i].deSerializeDouble(dataIn.m_el[i]);
+}
+
+#endif //BT_MATRIX3x3_H
+
diff --git a/extern/bullet2/src/LinearMath/btMinMax.h b/extern/bullet2/src/LinearMath/btMinMax.h
index 5e27d62a4a4..80601c1e232 100644
--- a/extern/bullet2/src/LinearMath/btMinMax.h
+++ b/extern/bullet2/src/LinearMath/btMinMax.h
@@ -17,6 +17,8 @@ subject to the following restrictions:
#ifndef GEN_MINMAX_H
#define GEN_MINMAX_H
+#include "LinearMath/btScalar.h"
+
template <class T>
SIMD_FORCE_INLINE const T& btMin(const T& a, const T& b)
{
@@ -30,7 +32,7 @@ SIMD_FORCE_INLINE const T& btMax(const T& a, const T& b)
}
template <class T>
-SIMD_FORCE_INLINE const T& GEN_clamped(const T& a, const T& lb, const T& ub)
+SIMD_FORCE_INLINE const T& btClamped(const T& a, const T& lb, const T& ub)
{
return a < lb ? lb : (ub < a ? ub : a);
}
@@ -54,7 +56,7 @@ SIMD_FORCE_INLINE void btSetMax(T& a, const T& b)
}
template <class T>
-SIMD_FORCE_INLINE void GEN_clamp(T& a, const T& lb, const T& ub)
+SIMD_FORCE_INLINE void btClamp(T& a, const T& lb, const T& ub)
{
if (a < lb)
{
diff --git a/extern/bullet2/src/LinearMath/btPoolAllocator.h b/extern/bullet2/src/LinearMath/btPoolAllocator.h
index 39d2559c747..e3b4be9b155 100644
--- a/extern/bullet2/src/LinearMath/btPoolAllocator.h
+++ b/extern/bullet2/src/LinearMath/btPoolAllocator.h
@@ -57,6 +57,11 @@ public:
return m_freeCount;
}
+ int getUsedCount() const
+ {
+ return m_maxElements - m_freeCount;
+ }
+
void* allocate(int size)
{
// release mode fix
@@ -96,6 +101,15 @@ public:
return m_elemSize;
}
+ unsigned char* getPoolAddress()
+ {
+ return m_pool;
+ }
+
+ const unsigned char* getPoolAddress() const
+ {
+ return m_pool;
+ }
};
diff --git a/extern/bullet2/src/LinearMath/btQuaternion.h b/extern/bullet2/src/LinearMath/btQuaternion.h
index cbeca2681cc..15cf5f868d9 100644
--- a/extern/bullet2/src/LinearMath/btQuaternion.h
+++ b/extern/bullet2/src/LinearMath/btQuaternion.h
@@ -209,8 +209,17 @@ public:
return s;
}
+ /**@brief Return the axis of the rotation represented by this quaternion */
+ btVector3 getAxis() const
+ {
+ btScalar s_squared = btScalar(1.) - btPow(m_floats[3], btScalar(2.));
+ if (s_squared < btScalar(10.) * SIMD_EPSILON) //Check for divide by zero
+ return btVector3(1.0, 0.0, 0.0); // Arbitrary
+ btScalar s = btSqrt(s_squared);
+ return btVector3(m_floats[0] / s, m_floats[1] / s, m_floats[2] / s);
+ }
- /**@brief Return the inverse of this quaternion */
+ /**@brief Return the inverse of this quaternion */
btQuaternion inverse() const
{
return btQuaternion(-m_floats[0], -m_floats[1], -m_floats[2], m_floats[3]);
@@ -252,6 +261,18 @@ public:
return (-qd);
}
+ /**@todo document this and it's use */
+ SIMD_FORCE_INLINE btQuaternion nearest( const btQuaternion& qd) const
+ {
+ btQuaternion diff,sum;
+ diff = *this - qd;
+ sum = *this + qd;
+ if( diff.dot(diff) < sum.dot(sum) )
+ return qd;
+ return (-qd);
+ }
+
+
/**@brief Return the quaternion which is the result of Spherical Linear Interpolation between this and the other quaternion
* @param q The other quaternion to interpolate with
* @param t The ratio between this and q to interpolate. If t = 0 the result is this, if t=1 the result is q.
@@ -264,10 +285,17 @@ public:
btScalar d = btScalar(1.0) / btSin(theta);
btScalar s0 = btSin((btScalar(1.0) - t) * theta);
btScalar s1 = btSin(t * theta);
- return btQuaternion((m_floats[0] * s0 + q.x() * s1) * d,
- (m_floats[1] * s0 + q.y() * s1) * d,
- (m_floats[2] * s0 + q.z() * s1) * d,
- (m_floats[3] * s0 + q.m_floats[3] * s1) * d);
+ if (dot(q) < 0) // Take care of long angle case see http://en.wikipedia.org/wiki/Slerp
+ return btQuaternion((m_floats[0] * s0 + -q.x() * s1) * d,
+ (m_floats[1] * s0 + -q.y() * s1) * d,
+ (m_floats[2] * s0 + -q.z() * s1) * d,
+ (m_floats[3] * s0 + -q.m_floats[3] * s1) * d);
+ else
+ return btQuaternion((m_floats[0] * s0 + q.x() * s1) * d,
+ (m_floats[1] * s0 + q.y() * s1) * d,
+ (m_floats[2] * s0 + q.z() * s1) * d,
+ (m_floats[3] * s0 + q.m_floats[3] * s1) * d);
+
}
else
{
@@ -378,7 +406,11 @@ shortestArcQuat(const btVector3& v0, const btVector3& v1) // Game Programming Ge
btScalar d = v0.dot(v1);
if (d < -1.0 + SIMD_EPSILON)
- return btQuaternion(0.0f,1.0f,0.0f,0.0f); // just pick any vector
+ {
+ btVector3 n,unused;
+ btPlaneSpace1(v0,n,unused);
+ return btQuaternion(n.x(),n.y(),n.z(),0.0f); // just pick any vector that is orthogonal to v0
+ }
btScalar s = btSqrt((1.0f + d) * 2.0f);
btScalar rs = 1.0f / s;
diff --git a/extern/bullet2/src/LinearMath/btQuickprof.cpp b/extern/bullet2/src/LinearMath/btQuickprof.cpp
index 621d50427d6..14534068a0d 100644
--- a/extern/bullet2/src/LinearMath/btQuickprof.cpp
+++ b/extern/bullet2/src/LinearMath/btQuickprof.cpp
@@ -1,6 +1,6 @@
+/*
-
-/***************************************************************************************************
+***************************************************************************************************
**
** profile.cpp
**
@@ -13,13 +13,232 @@
// Credits: The Clock class was inspired by the Timer classes in
// Ogre (www.ogre3d.org).
-#include "LinearMath/btQuickprof.h"
+#include "btQuickprof.h"
+#ifndef BT_NO_PROFILE
-#ifdef USE_BT_CLOCK
static btClock gProfileClock;
+
+#ifdef __CELLOS_LV2__
+#include <sys/sys_time.h>
+#include <sys/time_util.h>
+#include <stdio.h>
+#endif
+
+#if defined (SUNOS) || defined (__SUNOS__)
+#include <stdio.h>
+#endif
+
+#if defined(WIN32) || defined(_WIN32)
+
+#define BT_USE_WINDOWS_TIMERS
+#define WIN32_LEAN_AND_MEAN
+#define NOWINRES
+#define NOMCX
+#define NOIME
+
+#ifdef _XBOX
+ #include <Xtl.h>
+#else //_XBOX
+ #include <windows.h>
+#endif //_XBOX
+
+#include <time.h>
+
+
+#else //_WIN32
+#include <sys/time.h>
+#endif //_WIN32
+
+#define mymin(a,b) (a > b ? a : b)
+
+struct btClockData
+{
+
+#ifdef BT_USE_WINDOWS_TIMERS
+ LARGE_INTEGER mClockFrequency;
+ DWORD mStartTick;
+ LONGLONG mPrevElapsedTime;
+ LARGE_INTEGER mStartTime;
+#else
+#ifdef __CELLOS_LV2__
+ uint64_t mStartTime;
+#else
+ struct timeval mStartTime;
+#endif
+#endif //__CELLOS_LV2__
+
+};
+
+///The btClock is a portable basic clock that measures accurate time in seconds, use for profiling.
+btClock::btClock()
+{
+ m_data = new btClockData;
+#ifdef BT_USE_WINDOWS_TIMERS
+ QueryPerformanceFrequency(&m_data->mClockFrequency);
+#endif
+ reset();
+}
+
+btClock::~btClock()
+{
+ delete m_data;
+}
+
+btClock::btClock(const btClock& other)
+{
+ m_data = new btClockData;
+ *m_data = *other.m_data;
+}
+
+btClock& btClock::operator=(const btClock& other)
+{
+ *m_data = *other.m_data;
+ return *this;
+}
+
+
+ /// Resets the initial reference time.
+void btClock::reset()
+{
+#ifdef BT_USE_WINDOWS_TIMERS
+ QueryPerformanceCounter(&m_data->mStartTime);
+ m_data->mStartTick = GetTickCount();
+ m_data->mPrevElapsedTime = 0;
+#else
+#ifdef __CELLOS_LV2__
+
+ typedef uint64_t ClockSize;
+ ClockSize newTime;
+ //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
+ SYS_TIMEBASE_GET( newTime );
+ m_data->mStartTime = newTime;
+#else
+ gettimeofday(&m_data->mStartTime, 0);
+#endif
+#endif
+}
+
+/// Returns the time in ms since the last call to reset or since
+/// the btClock was created.
+unsigned long int btClock::getTimeMilliseconds()
+{
+#ifdef BT_USE_WINDOWS_TIMERS
+ LARGE_INTEGER currentTime;
+ QueryPerformanceCounter(&currentTime);
+ LONGLONG elapsedTime = currentTime.QuadPart -
+ m_data->mStartTime.QuadPart;
+ // Compute the number of millisecond ticks elapsed.
+ unsigned long msecTicks = (unsigned long)(1000 * elapsedTime /
+ m_data->mClockFrequency.QuadPart);
+ // Check for unexpected leaps in the Win32 performance counter.
+ // (This is caused by unexpected data across the PCI to ISA
+ // bridge, aka south bridge. See Microsoft KB274323.)
+ unsigned long elapsedTicks = GetTickCount() - m_data->mStartTick;
+ signed long msecOff = (signed long)(msecTicks - elapsedTicks);
+ if (msecOff < -100 || msecOff > 100)
+ {
+ // Adjust the starting time forwards.
+ LONGLONG msecAdjustment = mymin(msecOff *
+ m_data->mClockFrequency.QuadPart / 1000, elapsedTime -
+ m_data->mPrevElapsedTime);
+ m_data->mStartTime.QuadPart += msecAdjustment;
+ elapsedTime -= msecAdjustment;
+
+ // Recompute the number of millisecond ticks elapsed.
+ msecTicks = (unsigned long)(1000 * elapsedTime /
+ m_data->mClockFrequency.QuadPart);
+ }
+
+ // Store the current elapsed time for adjustments next time.
+ m_data->mPrevElapsedTime = elapsedTime;
+
+ return msecTicks;
+#else
+
+#ifdef __CELLOS_LV2__
+ uint64_t freq=sys_time_get_timebase_frequency();
+ double dFreq=((double) freq) / 1000.0;
+ typedef uint64_t ClockSize;
+ ClockSize newTime;
+ SYS_TIMEBASE_GET( newTime );
+ //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
+
+ return (unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq);
+#else
+
+ struct timeval currentTime;
+ gettimeofday(&currentTime, 0);
+ return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000 +
+ (currentTime.tv_usec - m_data->mStartTime.tv_usec) / 1000;
+#endif //__CELLOS_LV2__
+#endif
+}
+
+ /// Returns the time in us since the last call to reset or since
+ /// the Clock was created.
+unsigned long int btClock::getTimeMicroseconds()
+{
+#ifdef BT_USE_WINDOWS_TIMERS
+ LARGE_INTEGER currentTime;
+ QueryPerformanceCounter(&currentTime);
+ LONGLONG elapsedTime = currentTime.QuadPart -
+ m_data->mStartTime.QuadPart;
+
+ // Compute the number of millisecond ticks elapsed.
+ unsigned long msecTicks = (unsigned long)(1000 * elapsedTime /
+ m_data->mClockFrequency.QuadPart);
+
+ // Check for unexpected leaps in the Win32 performance counter.
+ // (This is caused by unexpected data across the PCI to ISA
+ // bridge, aka south bridge. See Microsoft KB274323.)
+ unsigned long elapsedTicks = GetTickCount() - m_data->mStartTick;
+ signed long msecOff = (signed long)(msecTicks - elapsedTicks);
+ if (msecOff < -100 || msecOff > 100)
+ {
+ // Adjust the starting time forwards.
+ LONGLONG msecAdjustment = mymin(msecOff *
+ m_data->mClockFrequency.QuadPart / 1000, elapsedTime -
+ m_data->mPrevElapsedTime);
+ m_data->mStartTime.QuadPart += msecAdjustment;
+ elapsedTime -= msecAdjustment;
+ }
+
+ // Store the current elapsed time for adjustments next time.
+ m_data->mPrevElapsedTime = elapsedTime;
+
+ // Convert to microseconds.
+ unsigned long usecTicks = (unsigned long)(1000000 * elapsedTime /
+ m_data->mClockFrequency.QuadPart);
+
+ return usecTicks;
+#else
+
+#ifdef __CELLOS_LV2__
+ uint64_t freq=sys_time_get_timebase_frequency();
+ double dFreq=((double) freq)/ 1000000.0;
+ typedef uint64_t ClockSize;
+ ClockSize newTime;
+ //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
+ SYS_TIMEBASE_GET( newTime );
+
+ return (unsigned long int)((double(newTime-m_data->mStartTime)) / dFreq);
+#else
+
+ struct timeval currentTime;
+ gettimeofday(&currentTime, 0);
+ return (currentTime.tv_sec - m_data->mStartTime.tv_sec) * 1000000 +
+ (currentTime.tv_usec - m_data->mStartTime.tv_usec);
+#endif//__CELLOS_LV2__
+#endif
+}
+
+
+
+
+
inline void Profile_Get_Ticks(unsigned long int * ticks)
{
*ticks = gProfileClock.getTimeMicroseconds();
@@ -342,5 +561,5 @@ void CProfileManager::dumpAll()
-#endif //USE_BT_CLOCK
+#endif //BT_NO_PROFILE
diff --git a/extern/bullet2/src/LinearMath/btQuickprof.h b/extern/bullet2/src/LinearMath/btQuickprof.h
index f8d47c36861..adfbbe6149c 100644
--- a/extern/bullet2/src/LinearMath/btQuickprof.h
+++ b/extern/bullet2/src/LinearMath/btQuickprof.h
@@ -18,216 +18,42 @@
//To disable built-in profiling, please comment out next line
//#define BT_NO_PROFILE 1
#ifndef BT_NO_PROFILE
-
+#include <stdio.h>//@todo remove this, backwards compatibility
#include "btScalar.h"
-#include "LinearMath/btAlignedAllocator.h"
+#include "btAlignedAllocator.h"
#include <new>
-//if you don't need btClock, you can comment next line
+
#define USE_BT_CLOCK 1
#ifdef USE_BT_CLOCK
-#ifdef __CELLOS_LV2__
-#include <sys/sys_time.h>
-#include <sys/time_util.h>
-#include <stdio.h>
-#endif
-
-#if defined (SUNOS) || defined (__SUNOS__)
-#include <stdio.h>
-#endif
-
-#if defined(WIN32) || defined(_WIN32)
-
-#define USE_WINDOWS_TIMERS
-#define WIN32_LEAN_AND_MEAN
-#define NOWINRES
-#define NOMCX
-#define NOIME
-#ifdef _XBOX
-#include <Xtl.h>
-#else
-#include <windows.h>
-#endif
-#include <time.h>
-
-#else
-#include <sys/time.h>
-#endif
-
-#define mymin(a,b) (a > b ? a : b)
///The btClock is a portable basic clock that measures accurate time in seconds, use for profiling.
class btClock
{
public:
- btClock()
- {
-#ifdef USE_WINDOWS_TIMERS
- QueryPerformanceFrequency(&mClockFrequency);
-#endif
- reset();
- }
-
- ~btClock()
- {
- }
+ btClock();
- /// Resets the initial reference time.
- void reset()
- {
-#ifdef USE_WINDOWS_TIMERS
- QueryPerformanceCounter(&mStartTime);
- mStartTick = GetTickCount();
- mPrevElapsedTime = 0;
-#else
-#ifdef __CELLOS_LV2__
+ btClock(const btClock& other);
+ btClock& operator=(const btClock& other);
- typedef uint64_t ClockSize;
- ClockSize newTime;
- //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
- SYS_TIMEBASE_GET( newTime );
- mStartTime = newTime;
-#else
- gettimeofday(&mStartTime, 0);
-#endif
+ ~btClock();
-#endif
- }
+ /// Resets the initial reference time.
+ void reset();
/// Returns the time in ms since the last call to reset or since
/// the btClock was created.
- unsigned long int getTimeMilliseconds()
- {
-#ifdef USE_WINDOWS_TIMERS
- LARGE_INTEGER currentTime;
- QueryPerformanceCounter(&currentTime);
- LONGLONG elapsedTime = currentTime.QuadPart -
- mStartTime.QuadPart;
-
- // Compute the number of millisecond ticks elapsed.
- unsigned long msecTicks = (unsigned long)(1000 * elapsedTime /
- mClockFrequency.QuadPart);
-
- // Check for unexpected leaps in the Win32 performance counter.
- // (This is caused by unexpected data across the PCI to ISA
- // bridge, aka south bridge. See Microsoft KB274323.)
- unsigned long elapsedTicks = GetTickCount() - mStartTick;
- signed long msecOff = (signed long)(msecTicks - elapsedTicks);
- if (msecOff < -100 || msecOff > 100)
- {
- // Adjust the starting time forwards.
- LONGLONG msecAdjustment = mymin(msecOff *
- mClockFrequency.QuadPart / 1000, elapsedTime -
- mPrevElapsedTime);
- mStartTime.QuadPart += msecAdjustment;
- elapsedTime -= msecAdjustment;
-
- // Recompute the number of millisecond ticks elapsed.
- msecTicks = (unsigned long)(1000 * elapsedTime /
- mClockFrequency.QuadPart);
- }
-
- // Store the current elapsed time for adjustments next time.
- mPrevElapsedTime = elapsedTime;
-
- return msecTicks;
-#else
-
-#ifdef __CELLOS_LV2__
- uint64_t freq=sys_time_get_timebase_frequency();
- double dFreq=((double) freq) / 1000.0;
- typedef uint64_t ClockSize;
- ClockSize newTime;
- SYS_TIMEBASE_GET( newTime );
- //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
-
- return (unsigned long int)((double(newTime-mStartTime)) / dFreq);
-#else
-
- struct timeval currentTime;
- gettimeofday(&currentTime, 0);
- return (currentTime.tv_sec - mStartTime.tv_sec) * 1000 +
- (currentTime.tv_usec - mStartTime.tv_usec) / 1000;
-#endif //__CELLOS_LV2__
-#endif
- }
+ unsigned long int getTimeMilliseconds();
/// Returns the time in us since the last call to reset or since
/// the Clock was created.
- unsigned long int getTimeMicroseconds()
- {
-#ifdef USE_WINDOWS_TIMERS
- LARGE_INTEGER currentTime;
- QueryPerformanceCounter(&currentTime);
- LONGLONG elapsedTime = currentTime.QuadPart -
- mStartTime.QuadPart;
-
- // Compute the number of millisecond ticks elapsed.
- unsigned long msecTicks = (unsigned long)(1000 * elapsedTime /
- mClockFrequency.QuadPart);
-
- // Check for unexpected leaps in the Win32 performance counter.
- // (This is caused by unexpected data across the PCI to ISA
- // bridge, aka south bridge. See Microsoft KB274323.)
- unsigned long elapsedTicks = GetTickCount() - mStartTick;
- signed long msecOff = (signed long)(msecTicks - elapsedTicks);
- if (msecOff < -100 || msecOff > 100)
- {
- // Adjust the starting time forwards.
- LONGLONG msecAdjustment = mymin(msecOff *
- mClockFrequency.QuadPart / 1000, elapsedTime -
- mPrevElapsedTime);
- mStartTime.QuadPart += msecAdjustment;
- elapsedTime -= msecAdjustment;
- }
-
- // Store the current elapsed time for adjustments next time.
- mPrevElapsedTime = elapsedTime;
-
- // Convert to microseconds.
- unsigned long usecTicks = (unsigned long)(1000000 * elapsedTime /
- mClockFrequency.QuadPart);
-
- return usecTicks;
-#else
-
-#ifdef __CELLOS_LV2__
- uint64_t freq=sys_time_get_timebase_frequency();
- double dFreq=((double) freq)/ 1000000.0;
- typedef uint64_t ClockSize;
- ClockSize newTime;
- //__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
- SYS_TIMEBASE_GET( newTime );
-
- return (unsigned long int)((double(newTime-mStartTime)) / dFreq);
-#else
-
- struct timeval currentTime;
- gettimeofday(&currentTime, 0);
- return (currentTime.tv_sec - mStartTime.tv_sec) * 1000000 +
- (currentTime.tv_usec - mStartTime.tv_usec);
-#endif//__CELLOS_LV2__
-#endif
- }
-
+ unsigned long int getTimeMicroseconds();
private:
-#ifdef USE_WINDOWS_TIMERS
- LARGE_INTEGER mClockFrequency;
- DWORD mStartTick;
- LONGLONG mPrevElapsedTime;
- LARGE_INTEGER mStartTime;
-#else
-#ifdef __CELLOS_LV2__
- uint64_t mStartTime;
-#else
- struct timeval mStartTime;
-#endif
-#endif //__CELLOS_LV2__
-
+ struct btClockData* m_data;
};
#endif //USE_BT_CLOCK
diff --git a/extern/bullet2/src/LinearMath/btScalar.h b/extern/bullet2/src/LinearMath/btScalar.h
index 08b2dee8af3..165626d530f 100644
--- a/extern/bullet2/src/LinearMath/btScalar.h
+++ b/extern/bullet2/src/LinearMath/btScalar.h
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2003-2006 Gino van den Bergen / Erwin Coumans http://continuousphysics.com/Bullet/
+Copyright (c) 2003-2009 Erwin Coumans http://bullet.googlecode.com
This software is provided 'as-is', without any express or implied warranty.
In no event will the authors be held liable for any damages arising from the use of this software.
@@ -17,15 +17,20 @@ subject to the following restrictions:
#ifndef SIMD___SCALAR_H
#define SIMD___SCALAR_H
-#include <math.h>
+#ifdef BT_MANAGED_CODE
+//Aligned data types not supported in managed code
+#pragma unmanaged
+#endif
-#include <stdlib.h>//size_t for MSVC 6.0
+#include <math.h>
+#include <stdlib.h>//size_t for MSVC 6.0
#include <cstdlib>
#include <cfloat>
#include <float.h>
-#define BT_BULLET_VERSION 274
+/* SVN $Revision$ on $Date$ from http://bullet.googlecode.com*/
+#define BT_BULLET_VERSION 278
inline int btGetVersion()
{
@@ -37,12 +42,13 @@ inline int btGetVersion()
#endif
-#ifdef WIN32
+#ifdef _WIN32
#if defined(__MINGW32__) || defined(__CYGWIN__) || (defined (_MSC_VER) && _MSC_VER < 1300)
#define SIMD_FORCE_INLINE inline
#define ATTRIBUTE_ALIGNED16(a) a
+ #define ATTRIBUTE_ALIGNED64(a) a
#define ATTRIBUTE_ALIGNED128(a) a
#else
//#define BT_HAS_ALIGNED_ALLOCATOR
@@ -53,6 +59,7 @@ inline int btGetVersion()
#define SIMD_FORCE_INLINE __forceinline
#define ATTRIBUTE_ALIGNED16(a) __declspec(align(16)) a
+ #define ATTRIBUTE_ALIGNED64(a) __declspec(align(64)) a
#define ATTRIBUTE_ALIGNED128(a) __declspec (align(128)) a
#ifdef _XBOX
#define BT_USE_VMX128
@@ -62,7 +69,7 @@ inline int btGetVersion()
#define btFsel(a,b,c) __fsel((a),(b),(c))
#else
-#if (defined (WIN32) && (_MSC_VER) && _MSC_VER >= 1400) && (!defined (BT_USE_DOUBLE_PRECISION))
+#if (defined (_WIN32) && (_MSC_VER) && _MSC_VER >= 1400) && (!defined (BT_USE_DOUBLE_PRECISION))
#define BT_USE_SSE
#include <emmintrin.h>
#endif
@@ -86,14 +93,22 @@ inline int btGetVersion()
#else
#if defined (__CELLOS_LV2__)
- #define SIMD_FORCE_INLINE inline
+ #define SIMD_FORCE_INLINE inline __attribute__((always_inline))
#define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16)))
+ #define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64)))
#define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128)))
#ifndef assert
#include <assert.h>
#endif
#ifdef BT_DEBUG
- #define btAssert assert
+#ifdef __SPU__
+#include <spu_printf.h>
+#define printf spu_printf
+ #define btAssert(x) {if(!(x)){printf("Assert "__FILE__ ":%u ("#x")\n", __LINE__);spu_hcmpeq(0,0);}}
+#else
+ #define btAssert assert
+#endif
+
#else
#define btAssert(x)
#endif
@@ -109,6 +124,7 @@ inline int btGetVersion()
#define SIMD_FORCE_INLINE __inline
#define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16)))
+ #define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64)))
#define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128)))
#ifndef assert
#include <assert.h>
@@ -129,11 +145,39 @@ inline int btGetVersion()
#else
//non-windows systems
+#if (defined (__APPLE__) && defined (__i386__) && (!defined (BT_USE_DOUBLE_PRECISION)))
+ #define BT_USE_SSE
+ #include <emmintrin.h>
+
+ #define SIMD_FORCE_INLINE inline
+///@todo: check out alignment methods for other platforms/compilers
+ #define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16)))
+ #define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64)))
+ #define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128)))
+ #ifndef assert
+ #include <assert.h>
+ #endif
+
+ #if defined(DEBUG) || defined (_DEBUG)
+ #define btAssert assert
+ #else
+ #define btAssert(x)
+ #endif
+
+ //btFullAssert is optional, slows down a lot
+ #define btFullAssert(x)
+ #define btLikely(_c) _c
+ #define btUnlikely(_c) _c
+
+#else
+
#define SIMD_FORCE_INLINE inline
///@todo: check out alignment methods for other platforms/compilers
///#define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16)))
+ ///#define ATTRIBUTE_ALIGNED64(a) a __attribute__ ((aligned (64)))
///#define ATTRIBUTE_ALIGNED128(a) a __attribute__ ((aligned (128)))
#define ATTRIBUTE_ALIGNED16(a) a
+ #define ATTRIBUTE_ALIGNED64(a) a
#define ATTRIBUTE_ALIGNED128(a) a
#ifndef assert
#include <assert.h>
@@ -149,21 +193,13 @@ inline int btGetVersion()
#define btFullAssert(x)
#define btLikely(_c) _c
#define btUnlikely(_c) _c
-
+#endif //__APPLE__
#endif // LIBSPE2
#endif //__CELLOS_LV2__
#endif
-/// older compilers (gcc 3.x) and Sun needs double version of sqrt etc.
-/// exclude Apple Intel (i's assumed to be a Macbook or new Intel Dual Core Processor)
-#if defined (__sun) || defined (__sun__) || defined (__sparc) || (defined (__APPLE__) && ! defined (__i386__))
-//use slow double float precision operation on those platforms
-#ifndef BT_USE_DOUBLE_PRECISION
-#define BT_FORCE_DOUBLE_FUNCTIONS
-#endif
-#endif
///The btScalar type abstracts floating point numbers, to easily switch between double and single floating point precision.
#if defined(BT_USE_DOUBLE_PRECISION)
@@ -197,13 +233,14 @@ SIMD_FORCE_INLINE btScalar btFabs(btScalar x) { return fabs(x); }
SIMD_FORCE_INLINE btScalar btCos(btScalar x) { return cos(x); }
SIMD_FORCE_INLINE btScalar btSin(btScalar x) { return sin(x); }
SIMD_FORCE_INLINE btScalar btTan(btScalar x) { return tan(x); }
-SIMD_FORCE_INLINE btScalar btAcos(btScalar x) { return acos(x); }
-SIMD_FORCE_INLINE btScalar btAsin(btScalar x) { return asin(x); }
+SIMD_FORCE_INLINE btScalar btAcos(btScalar x) { if (x<btScalar(-1)) x=btScalar(-1); if (x>btScalar(1)) x=btScalar(1); return acos(x); }
+SIMD_FORCE_INLINE btScalar btAsin(btScalar x) { if (x<btScalar(-1)) x=btScalar(-1); if (x>btScalar(1)) x=btScalar(1); return asin(x); }
SIMD_FORCE_INLINE btScalar btAtan(btScalar x) { return atan(x); }
SIMD_FORCE_INLINE btScalar btAtan2(btScalar x, btScalar y) { return atan2(x, y); }
SIMD_FORCE_INLINE btScalar btExp(btScalar x) { return exp(x); }
SIMD_FORCE_INLINE btScalar btLog(btScalar x) { return log(x); }
SIMD_FORCE_INLINE btScalar btPow(btScalar x,btScalar y) { return pow(x,y); }
+SIMD_FORCE_INLINE btScalar btFmod(btScalar x,btScalar y) { return fmod(x,y); }
#else
@@ -216,7 +253,7 @@ SIMD_FORCE_INLINE btScalar btSqrt(btScalar y)
tempf = y;
*tfptr = (0xbfcdd90a - *tfptr)>>1; /* estimate of 1/sqrt(y) */
x = tempf;
- z = y*btScalar(0.5); /* hoist out the “/2” */
+ z = y*btScalar(0.5);
x = (btScalar(1.5)*x)-(x*x)*(x*z); /* iteration formula */
x = (btScalar(1.5)*x)-(x*x)*(x*z);
x = (btScalar(1.5)*x)-(x*x)*(x*z);
@@ -232,15 +269,25 @@ SIMD_FORCE_INLINE btScalar btCos(btScalar x) { return cosf(x); }
SIMD_FORCE_INLINE btScalar btSin(btScalar x) { return sinf(x); }
SIMD_FORCE_INLINE btScalar btTan(btScalar x) { return tanf(x); }
SIMD_FORCE_INLINE btScalar btAcos(btScalar x) {
- btAssert(x <= btScalar(1.));
+ if (x<btScalar(-1))
+ x=btScalar(-1);
+ if (x>btScalar(1))
+ x=btScalar(1);
return acosf(x);
}
-SIMD_FORCE_INLINE btScalar btAsin(btScalar x) { return asinf(x); }
+SIMD_FORCE_INLINE btScalar btAsin(btScalar x) {
+ if (x<btScalar(-1))
+ x=btScalar(-1);
+ if (x>btScalar(1))
+ x=btScalar(1);
+ return asinf(x);
+}
SIMD_FORCE_INLINE btScalar btAtan(btScalar x) { return atanf(x); }
SIMD_FORCE_INLINE btScalar btAtan2(btScalar x, btScalar y) { return atan2f(x, y); }
SIMD_FORCE_INLINE btScalar btExp(btScalar x) { return expf(x); }
SIMD_FORCE_INLINE btScalar btLog(btScalar x) { return logf(x); }
SIMD_FORCE_INLINE btScalar btPow(btScalar x,btScalar y) { return powf(x,y); }
+SIMD_FORCE_INLINE btScalar btFmod(btScalar x,btScalar y) { return fmodf(x,y); }
#endif
@@ -249,6 +296,10 @@ SIMD_FORCE_INLINE btScalar btPow(btScalar x,btScalar y) { return powf(x,y); }
#define SIMD_HALF_PI (SIMD_2_PI * btScalar(0.25))
#define SIMD_RADS_PER_DEG (SIMD_2_PI / btScalar(360.0))
#define SIMD_DEGS_PER_RAD (btScalar(360.0) / SIMD_2_PI)
+#define SIMDSQRT12 btScalar(0.7071067811865475244008443621048490)
+
+#define btRecipSqrt(x) ((btScalar)(btScalar(1.0)/btSqrt(btScalar(x)))) /* reciprocal square root */
+
#ifdef BT_USE_DOUBLE_PRECISION
#define SIMD_EPSILON DBL_EPSILON
@@ -439,5 +490,35 @@ SIMD_FORCE_INLINE double btUnswapEndianDouble(const unsigned char *src)
return d;
}
+// returns normalized value in range [-SIMD_PI, SIMD_PI]
+SIMD_FORCE_INLINE btScalar btNormalizeAngle(btScalar angleInRadians)
+{
+ angleInRadians = btFmod(angleInRadians, SIMD_2_PI);
+ if(angleInRadians < -SIMD_PI)
+ {
+ return angleInRadians + SIMD_2_PI;
+ }
+ else if(angleInRadians > SIMD_PI)
+ {
+ return angleInRadians - SIMD_2_PI;
+ }
+ else
+ {
+ return angleInRadians;
+ }
+}
+///rudimentary class to provide type info
+struct btTypedObject
+{
+ btTypedObject(int objectType)
+ :m_objectType(objectType)
+ {
+ }
+ int m_objectType;
+ inline int getObjectType() const
+ {
+ return m_objectType;
+ }
+};
#endif //SIMD___SCALAR_H
diff --git a/extern/bullet2/src/LinearMath/btSerializer.cpp b/extern/bullet2/src/LinearMath/btSerializer.cpp
new file mode 100644
index 00000000000..c6d387e6133
--- /dev/null
+++ b/extern/bullet2/src/LinearMath/btSerializer.cpp
@@ -0,0 +1,832 @@
+unsigned char sBulletDNAstr[]= {
+83,68,78,65,78,65,77,69,42,1,0,0,109,95,115,105,122,101,0,109,
+95,99,97,112,97,99,105,116,121,0,42,109,95,100,97,116,97,0,109,95,
+99,111,108,108,105,115,105,111,110,83,104,97,112,101,115,0,109,95,99,111,
+108,108,105,115,105,111,110,79,98,106,101,99,116,115,0,109,95,99,111,110,
+115,116,114,97,105,110,116,115,0,42,102,105,114,115,116,0,42,108,97,115,
+116,0,109,95,102,108,111,97,116,115,91,52,93,0,109,95,101,108,91,51,
+93,0,109,95,98,97,115,105,115,0,109,95,111,114,105,103,105,110,0,109,
+95,114,111,111,116,78,111,100,101,73,110,100,101,120,0,109,95,115,117,98,
+116,114,101,101,83,105,122,101,0,109,95,113,117,97,110,116,105,122,101,100,
+65,97,98,98,77,105,110,91,51,93,0,109,95,113,117,97,110,116,105,122,
+101,100,65,97,98,98,77,97,120,91,51,93,0,109,95,97,97,98,98,77,
+105,110,79,114,103,0,109,95,97,97,98,98,77,97,120,79,114,103,0,109,
+95,101,115,99,97,112,101,73,110,100,101,120,0,109,95,115,117,98,80,97,
+114,116,0,109,95,116,114,105,97,110,103,108,101,73,110,100,101,120,0,109,
+95,112,97,100,91,52,93,0,109,95,101,115,99,97,112,101,73,110,100,101,
+120,79,114,84,114,105,97,110,103,108,101,73,110,100,101,120,0,109,95,98,
+118,104,65,97,98,98,77,105,110,0,109,95,98,118,104,65,97,98,98,77,
+97,120,0,109,95,98,118,104,81,117,97,110,116,105,122,97,116,105,111,110,
+0,109,95,99,117,114,78,111,100,101,73,110,100,101,120,0,109,95,117,115,
+101,81,117,97,110,116,105,122,97,116,105,111,110,0,109,95,110,117,109,67,
+111,110,116,105,103,117,111,117,115,76,101,97,102,78,111,100,101,115,0,109,
+95,110,117,109,81,117,97,110,116,105,122,101,100,67,111,110,116,105,103,117,
+111,117,115,78,111,100,101,115,0,42,109,95,99,111,110,116,105,103,117,111,
+117,115,78,111,100,101,115,80,116,114,0,42,109,95,113,117,97,110,116,105,
+122,101,100,67,111,110,116,105,103,117,111,117,115,78,111,100,101,115,80,116,
+114,0,42,109,95,115,117,98,84,114,101,101,73,110,102,111,80,116,114,0,
+109,95,116,114,97,118,101,114,115,97,108,77,111,100,101,0,109,95,110,117,
+109,83,117,98,116,114,101,101,72,101,97,100,101,114,115,0,42,109,95,110,
+97,109,101,0,109,95,115,104,97,112,101,84,121,112,101,0,109,95,112,97,
+100,100,105,110,103,91,52,93,0,109,95,99,111,108,108,105,115,105,111,110,
+83,104,97,112,101,68,97,116,97,0,109,95,108,111,99,97,108,83,99,97,
+108,105,110,103,0,109,95,112,108,97,110,101,78,111,114,109,97,108,0,109,
+95,112,108,97,110,101,67,111,110,115,116,97,110,116,0,109,95,105,109,112,
+108,105,99,105,116,83,104,97,112,101,68,105,109,101,110,115,105,111,110,115,
+0,109,95,99,111,108,108,105,115,105,111,110,77,97,114,103,105,110,0,109,
+95,112,97,100,100,105,110,103,0,109,95,112,111,115,0,109,95,114,97,100,
+105,117,115,0,109,95,99,111,110,118,101,120,73,110,116,101,114,110,97,108,
+83,104,97,112,101,68,97,116,97,0,42,109,95,108,111,99,97,108,80,111,
+115,105,116,105,111,110,65,114,114,97,121,80,116,114,0,109,95,108,111,99,
+97,108,80,111,115,105,116,105,111,110,65,114,114,97,121,83,105,122,101,0,
+109,95,118,97,108,117,101,0,109,95,112,97,100,91,50,93,0,109,95,118,
+97,108,117,101,115,91,51,93,0,109,95,112,97,100,0,42,109,95,118,101,
+114,116,105,99,101,115,51,102,0,42,109,95,118,101,114,116,105,99,101,115,
+51,100,0,42,109,95,105,110,100,105,99,101,115,51,50,0,42,109,95,51,
+105,110,100,105,99,101,115,49,54,0,42,109,95,51,105,110,100,105,99,101,
+115,56,0,42,109,95,105,110,100,105,99,101,115,49,54,0,109,95,110,117,
+109,84,114,105,97,110,103,108,101,115,0,109,95,110,117,109,86,101,114,116,
+105,99,101,115,0,42,109,95,109,101,115,104,80,97,114,116,115,80,116,114,
+0,109,95,115,99,97,108,105,110,103,0,109,95,110,117,109,77,101,115,104,
+80,97,114,116,115,0,109,95,109,101,115,104,73,110,116,101,114,102,97,99,
+101,0,42,109,95,113,117,97,110,116,105,122,101,100,70,108,111,97,116,66,
+118,104,0,42,109,95,113,117,97,110,116,105,122,101,100,68,111,117,98,108,
+101,66,118,104,0,42,109,95,116,114,105,97,110,103,108,101,73,110,102,111,
+77,97,112,0,109,95,112,97,100,51,91,52,93,0,109,95,116,114,105,109,
+101,115,104,83,104,97,112,101,68,97,116,97,0,109,95,116,114,97,110,115,
+102,111,114,109,0,42,109,95,99,104,105,108,100,83,104,97,112,101,0,109,
+95,99,104,105,108,100,83,104,97,112,101,84,121,112,101,0,109,95,99,104,
+105,108,100,77,97,114,103,105,110,0,42,109,95,99,104,105,108,100,83,104,
+97,112,101,80,116,114,0,109,95,110,117,109,67,104,105,108,100,83,104,97,
+112,101,115,0,109,95,117,112,65,120,105,115,0,109,95,102,108,97,103,115,
+0,109,95,101,100,103,101,86,48,86,49,65,110,103,108,101,0,109,95,101,
+100,103,101,86,49,86,50,65,110,103,108,101,0,109,95,101,100,103,101,86,
+50,86,48,65,110,103,108,101,0,42,109,95,104,97,115,104,84,97,98,108,
+101,80,116,114,0,42,109,95,110,101,120,116,80,116,114,0,42,109,95,118,
+97,108,117,101,65,114,114,97,121,80,116,114,0,42,109,95,107,101,121,65,
+114,114,97,121,80,116,114,0,109,95,99,111,110,118,101,120,69,112,115,105,
+108,111,110,0,109,95,112,108,97,110,97,114,69,112,115,105,108,111,110,0,
+109,95,101,113,117,97,108,86,101,114,116,101,120,84,104,114,101,115,104,111,
+108,100,0,109,95,101,100,103,101,68,105,115,116,97,110,99,101,84,104,114,
+101,115,104,111,108,100,0,109,95,122,101,114,111,65,114,101,97,84,104,114,
+101,115,104,111,108,100,0,109,95,110,101,120,116,83,105,122,101,0,109,95,
+104,97,115,104,84,97,98,108,101,83,105,122,101,0,109,95,110,117,109,86,
+97,108,117,101,115,0,109,95,110,117,109,75,101,121,115,0,109,95,103,105,
+109,112,97,99,116,83,117,98,84,121,112,101,0,42,109,95,117,110,115,99,
+97,108,101,100,80,111,105,110,116,115,70,108,111,97,116,80,116,114,0,42,
+109,95,117,110,115,99,97,108,101,100,80,111,105,110,116,115,68,111,117,98,
+108,101,80,116,114,0,109,95,110,117,109,85,110,115,99,97,108,101,100,80,
+111,105,110,116,115,0,109,95,112,97,100,100,105,110,103,51,91,52,93,0,
+42,109,95,98,114,111,97,100,112,104,97,115,101,72,97,110,100,108,101,0,
+42,109,95,99,111,108,108,105,115,105,111,110,83,104,97,112,101,0,42,109,
+95,114,111,111,116,67,111,108,108,105,115,105,111,110,83,104,97,112,101,0,
+109,95,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109,95,105,
+110,116,101,114,112,111,108,97,116,105,111,110,87,111,114,108,100,84,114,97,
+110,115,102,111,114,109,0,109,95,105,110,116,101,114,112,111,108,97,116,105,
+111,110,76,105,110,101,97,114,86,101,108,111,99,105,116,121,0,109,95,105,
+110,116,101,114,112,111,108,97,116,105,111,110,65,110,103,117,108,97,114,86,
+101,108,111,99,105,116,121,0,109,95,97,110,105,115,111,116,114,111,112,105,
+99,70,114,105,99,116,105,111,110,0,109,95,99,111,110,116,97,99,116,80,
+114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100,0,109,
+95,100,101,97,99,116,105,118,97,116,105,111,110,84,105,109,101,0,109,95,
+102,114,105,99,116,105,111,110,0,109,95,114,101,115,116,105,116,117,116,105,
+111,110,0,109,95,104,105,116,70,114,97,99,116,105,111,110,0,109,95,99,
+99,100,83,119,101,112,116,83,112,104,101,114,101,82,97,100,105,117,115,0,
+109,95,99,99,100,77,111,116,105,111,110,84,104,114,101,115,104,111,108,100,
+0,109,95,104,97,115,65,110,105,115,111,116,114,111,112,105,99,70,114,105,
+99,116,105,111,110,0,109,95,99,111,108,108,105,115,105,111,110,70,108,97,
+103,115,0,109,95,105,115,108,97,110,100,84,97,103,49,0,109,95,99,111,
+109,112,97,110,105,111,110,73,100,0,109,95,97,99,116,105,118,97,116,105,
+111,110,83,116,97,116,101,49,0,109,95,105,110,116,101,114,110,97,108,84,
+121,112,101,0,109,95,99,104,101,99,107,67,111,108,108,105,100,101,87,105,
+116,104,0,109,95,99,111,108,108,105,115,105,111,110,79,98,106,101,99,116,
+68,97,116,97,0,109,95,105,110,118,73,110,101,114,116,105,97,84,101,110,
+115,111,114,87,111,114,108,100,0,109,95,108,105,110,101,97,114,86,101,108,
+111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,86,101,108,111,99,
+105,116,121,0,109,95,97,110,103,117,108,97,114,70,97,99,116,111,114,0,
+109,95,108,105,110,101,97,114,70,97,99,116,111,114,0,109,95,103,114,97,
+118,105,116,121,0,109,95,103,114,97,118,105,116,121,95,97,99,99,101,108,
+101,114,97,116,105,111,110,0,109,95,105,110,118,73,110,101,114,116,105,97,
+76,111,99,97,108,0,109,95,116,111,116,97,108,70,111,114,99,101,0,109,
+95,116,111,116,97,108,84,111,114,113,117,101,0,109,95,105,110,118,101,114,
+115,101,77,97,115,115,0,109,95,108,105,110,101,97,114,68,97,109,112,105,
+110,103,0,109,95,97,110,103,117,108,97,114,68,97,109,112,105,110,103,0,
+109,95,97,100,100,105,116,105,111,110,97,108,68,97,109,112,105,110,103,70,
+97,99,116,111,114,0,109,95,97,100,100,105,116,105,111,110,97,108,76,105,
+110,101,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108,100,
+83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103,117,
+108,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108,100,83,
+113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103,117,108,
+97,114,68,97,109,112,105,110,103,70,97,99,116,111,114,0,109,95,108,105,
+110,101,97,114,83,108,101,101,112,105,110,103,84,104,114,101,115,104,111,108,
+100,0,109,95,97,110,103,117,108,97,114,83,108,101,101,112,105,110,103,84,
+104,114,101,115,104,111,108,100,0,109,95,97,100,100,105,116,105,111,110,97,
+108,68,97,109,112,105,110,103,0,109,95,110,117,109,67,111,110,115,116,114,
+97,105,110,116,82,111,119,115,0,110,117,98,0,42,109,95,114,98,65,0,
+42,109,95,114,98,66,0,109,95,111,98,106,101,99,116,84,121,112,101,0,
+109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,84,121,112,101,
+0,109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,73,100,0,
+109,95,110,101,101,100,115,70,101,101,100,98,97,99,107,0,109,95,97,112,
+112,108,105,101,100,73,109,112,117,108,115,101,0,109,95,100,98,103,68,114,
+97,119,83,105,122,101,0,109,95,100,105,115,97,98,108,101,67,111,108,108,
+105,115,105,111,110,115,66,101,116,119,101,101,110,76,105,110,107,101,100,66,
+111,100,105,101,115,0,109,95,112,97,100,52,91,52,93,0,109,95,116,121,
+112,101,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,109,95,112,
+105,118,111,116,73,110,65,0,109,95,112,105,118,111,116,73,110,66,0,109,
+95,114,98,65,70,114,97,109,101,0,109,95,114,98,66,70,114,97,109,101,
+0,109,95,117,115,101,82,101,102,101,114,101,110,99,101,70,114,97,109,101,
+65,0,109,95,97,110,103,117,108,97,114,79,110,108,121,0,109,95,101,110,
+97,98,108,101,65,110,103,117,108,97,114,77,111,116,111,114,0,109,95,109,
+111,116,111,114,84,97,114,103,101,116,86,101,108,111,99,105,116,121,0,109,
+95,109,97,120,77,111,116,111,114,73,109,112,117,108,115,101,0,109,95,108,
+111,119,101,114,76,105,109,105,116,0,109,95,117,112,112,101,114,76,105,109,
+105,116,0,109,95,108,105,109,105,116,83,111,102,116,110,101,115,115,0,109,
+95,98,105,97,115,70,97,99,116,111,114,0,109,95,114,101,108,97,120,97,
+116,105,111,110,70,97,99,116,111,114,0,109,95,115,119,105,110,103,83,112,
+97,110,49,0,109,95,115,119,105,110,103,83,112,97,110,50,0,109,95,116,
+119,105,115,116,83,112,97,110,0,109,95,100,97,109,112,105,110,103,0,109,
+95,108,105,110,101,97,114,85,112,112,101,114,76,105,109,105,116,0,109,95,
+108,105,110,101,97,114,76,111,119,101,114,76,105,109,105,116,0,109,95,97,
+110,103,117,108,97,114,85,112,112,101,114,76,105,109,105,116,0,109,95,97,
+110,103,117,108,97,114,76,111,119,101,114,76,105,109,105,116,0,109,95,117,
+115,101,76,105,110,101,97,114,82,101,102,101,114,101,110,99,101,70,114,97,
+109,101,65,0,109,95,117,115,101,79,102,102,115,101,116,70,111,114,67,111,
+110,115,116,114,97,105,110,116,70,114,97,109,101,0,109,95,54,100,111,102,
+68,97,116,97,0,109,95,115,112,114,105,110,103,69,110,97,98,108,101,100,
+91,54,93,0,109,95,101,113,117,105,108,105,98,114,105,117,109,80,111,105,
+110,116,91,54,93,0,109,95,115,112,114,105,110,103,83,116,105,102,102,110,
+101,115,115,91,54,93,0,109,95,115,112,114,105,110,103,68,97,109,112,105,
+110,103,91,54,93,0,109,95,108,105,110,101,97,114,83,116,105,102,102,110,
+101,115,115,0,109,95,97,110,103,117,108,97,114,83,116,105,102,102,110,101,
+115,115,0,109,95,118,111,108,117,109,101,83,116,105,102,102,110,101,115,115,
+0,42,109,95,109,97,116,101,114,105,97,108,0,109,95,112,111,115,105,116,
+105,111,110,0,109,95,112,114,101,118,105,111,117,115,80,111,115,105,116,105,
+111,110,0,109,95,118,101,108,111,99,105,116,121,0,109,95,97,99,99,117,
+109,117,108,97,116,101,100,70,111,114,99,101,0,109,95,110,111,114,109,97,
+108,0,109,95,97,114,101,97,0,109,95,97,116,116,97,99,104,0,109,95,
+110,111,100,101,73,110,100,105,99,101,115,91,50,93,0,109,95,114,101,115,
+116,76,101,110,103,116,104,0,109,95,98,98,101,110,100,105,110,103,0,109,
+95,110,111,100,101,73,110,100,105,99,101,115,91,51,93,0,109,95,114,101,
+115,116,65,114,101,97,0,109,95,99,48,91,52,93,0,109,95,110,111,100,
+101,73,110,100,105,99,101,115,91,52,93,0,109,95,114,101,115,116,86,111,
+108,117,109,101,0,109,95,99,49,0,109,95,99,50,0,109,95,99,48,0,
+109,95,108,111,99,97,108,70,114,97,109,101,0,42,109,95,114,105,103,105,
+100,66,111,100,121,0,109,95,110,111,100,101,73,110,100,101,120,0,109,95,
+97,101,114,111,77,111,100,101,108,0,109,95,98,97,117,109,103,97,114,116,
+101,0,109,95,100,114,97,103,0,109,95,108,105,102,116,0,109,95,112,114,
+101,115,115,117,114,101,0,109,95,118,111,108,117,109,101,0,109,95,100,121,
+110,97,109,105,99,70,114,105,99,116,105,111,110,0,109,95,112,111,115,101,
+77,97,116,99,104,0,109,95,114,105,103,105,100,67,111,110,116,97,99,116,
+72,97,114,100,110,101,115,115,0,109,95,107,105,110,101,116,105,99,67,111,
+110,116,97,99,116,72,97,114,100,110,101,115,115,0,109,95,115,111,102,116,
+67,111,110,116,97,99,116,72,97,114,100,110,101,115,115,0,109,95,97,110,
+99,104,111,114,72,97,114,100,110,101,115,115,0,109,95,115,111,102,116,82,
+105,103,105,100,67,108,117,115,116,101,114,72,97,114,100,110,101,115,115,0,
+109,95,115,111,102,116,75,105,110,101,116,105,99,67,108,117,115,116,101,114,
+72,97,114,100,110,101,115,115,0,109,95,115,111,102,116,83,111,102,116,67,
+108,117,115,116,101,114,72,97,114,100,110,101,115,115,0,109,95,115,111,102,
+116,82,105,103,105,100,67,108,117,115,116,101,114,73,109,112,117,108,115,101,
+83,112,108,105,116,0,109,95,115,111,102,116,75,105,110,101,116,105,99,67,
+108,117,115,116,101,114,73,109,112,117,108,115,101,83,112,108,105,116,0,109,
+95,115,111,102,116,83,111,102,116,67,108,117,115,116,101,114,73,109,112,117,
+108,115,101,83,112,108,105,116,0,109,95,109,97,120,86,111,108,117,109,101,
+0,109,95,116,105,109,101,83,99,97,108,101,0,109,95,118,101,108,111,99,
+105,116,121,73,116,101,114,97,116,105,111,110,115,0,109,95,112,111,115,105,
+116,105,111,110,73,116,101,114,97,116,105,111,110,115,0,109,95,100,114,105,
+102,116,73,116,101,114,97,116,105,111,110,115,0,109,95,99,108,117,115,116,
+101,114,73,116,101,114,97,116,105,111,110,115,0,109,95,114,111,116,0,109,
+95,115,99,97,108,101,0,109,95,97,113,113,0,109,95,99,111,109,0,42,
+109,95,112,111,115,105,116,105,111,110,115,0,42,109,95,119,101,105,103,104,
+116,115,0,109,95,110,117,109,80,111,115,105,116,105,111,110,115,0,109,95,
+110,117,109,87,101,105,103,116,115,0,109,95,98,118,111,108,117,109,101,0,
+109,95,98,102,114,97,109,101,0,109,95,102,114,97,109,101,120,102,111,114,
+109,0,109,95,108,111,99,105,105,0,109,95,105,110,118,119,105,0,109,95,
+118,105,109,112,117,108,115,101,115,91,50,93,0,109,95,100,105,109,112,117,
+108,115,101,115,91,50,93,0,109,95,108,118,0,109,95,97,118,0,42,109,
+95,102,114,97,109,101,114,101,102,115,0,42,109,95,110,111,100,101,73,110,
+100,105,99,101,115,0,42,109,95,109,97,115,115,101,115,0,109,95,110,117,
+109,70,114,97,109,101,82,101,102,115,0,109,95,110,117,109,78,111,100,101,
+115,0,109,95,110,117,109,77,97,115,115,101,115,0,109,95,105,100,109,97,
+115,115,0,109,95,105,109,97,115,115,0,109,95,110,118,105,109,112,117,108,
+115,101,115,0,109,95,110,100,105,109,112,117,108,115,101,115,0,109,95,110,
+100,97,109,112,105,110,103,0,109,95,108,100,97,109,112,105,110,103,0,109,
+95,97,100,97,109,112,105,110,103,0,109,95,109,97,116,99,104,105,110,103,
+0,109,95,109,97,120,83,101,108,102,67,111,108,108,105,115,105,111,110,73,
+109,112,117,108,115,101,0,109,95,115,101,108,102,67,111,108,108,105,115,105,
+111,110,73,109,112,117,108,115,101,70,97,99,116,111,114,0,109,95,99,111,
+110,116,97,105,110,115,65,110,99,104,111,114,0,109,95,99,111,108,108,105,
+100,101,0,109,95,99,108,117,115,116,101,114,73,110,100,101,120,0,42,109,
+95,98,111,100,121,65,0,42,109,95,98,111,100,121,66,0,109,95,114,101,
+102,115,91,50,93,0,109,95,99,102,109,0,109,95,101,114,112,0,109,95,
+115,112,108,105,116,0,109,95,100,101,108,101,116,101,0,109,95,114,101,108,
+80,111,115,105,116,105,111,110,91,50,93,0,109,95,98,111,100,121,65,116,
+121,112,101,0,109,95,98,111,100,121,66,116,121,112,101,0,109,95,106,111,
+105,110,116,84,121,112,101,0,42,109,95,112,111,115,101,0,42,42,109,95,
+109,97,116,101,114,105,97,108,115,0,42,109,95,110,111,100,101,115,0,42,
+109,95,108,105,110,107,115,0,42,109,95,102,97,99,101,115,0,42,109,95,
+116,101,116,114,97,104,101,100,114,97,0,42,109,95,97,110,99,104,111,114,
+115,0,42,109,95,99,108,117,115,116,101,114,115,0,42,109,95,106,111,105,
+110,116,115,0,109,95,110,117,109,77,97,116,101,114,105,97,108,115,0,109,
+95,110,117,109,76,105,110,107,115,0,109,95,110,117,109,70,97,99,101,115,
+0,109,95,110,117,109,84,101,116,114,97,104,101,100,114,97,0,109,95,110,
+117,109,65,110,99,104,111,114,115,0,109,95,110,117,109,67,108,117,115,116,
+101,114,115,0,109,95,110,117,109,74,111,105,110,116,115,0,109,95,99,111,
+110,102,105,103,0,0,0,0,84,89,80,69,72,0,0,0,99,104,97,114,
+0,117,99,104,97,114,0,115,104,111,114,116,0,117,115,104,111,114,116,0,
+105,110,116,0,108,111,110,103,0,117,108,111,110,103,0,102,108,111,97,116,
+0,100,111,117,98,108,101,0,118,111,105,100,0,80,111,105,110,116,101,114,
+65,114,114,97,121,0,98,116,80,104,121,115,105,99,115,83,121,115,116,101,
+109,0,76,105,115,116,66,97,115,101,0,98,116,86,101,99,116,111,114,51,
+70,108,111,97,116,68,97,116,97,0,98,116,86,101,99,116,111,114,51,68,
+111,117,98,108,101,68,97,116,97,0,98,116,77,97,116,114,105,120,51,120,
+51,70,108,111,97,116,68,97,116,97,0,98,116,77,97,116,114,105,120,51,
+120,51,68,111,117,98,108,101,68,97,116,97,0,98,116,84,114,97,110,115,
+102,111,114,109,70,108,111,97,116,68,97,116,97,0,98,116,84,114,97,110,
+115,102,111,114,109,68,111,117,98,108,101,68,97,116,97,0,98,116,66,118,
+104,83,117,98,116,114,101,101,73,110,102,111,68,97,116,97,0,98,116,79,
+112,116,105,109,105,122,101,100,66,118,104,78,111,100,101,70,108,111,97,116,
+68,97,116,97,0,98,116,79,112,116,105,109,105,122,101,100,66,118,104,78,
+111,100,101,68,111,117,98,108,101,68,97,116,97,0,98,116,81,117,97,110,
+116,105,122,101,100,66,118,104,78,111,100,101,68,97,116,97,0,98,116,81,
+117,97,110,116,105,122,101,100,66,118,104,70,108,111,97,116,68,97,116,97,
+0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,68,111,117,98,108,
+101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111,110,83,104,97,
+112,101,68,97,116,97,0,98,116,83,116,97,116,105,99,80,108,97,110,101,
+83,104,97,112,101,68,97,116,97,0,98,116,67,111,110,118,101,120,73,110,
+116,101,114,110,97,108,83,104,97,112,101,68,97,116,97,0,98,116,80,111,
+115,105,116,105,111,110,65,110,100,82,97,100,105,117,115,0,98,116,77,117,
+108,116,105,83,112,104,101,114,101,83,104,97,112,101,68,97,116,97,0,98,
+116,73,110,116,73,110,100,101,120,68,97,116,97,0,98,116,83,104,111,114,
+116,73,110,116,73,110,100,101,120,68,97,116,97,0,98,116,83,104,111,114,
+116,73,110,116,73,110,100,101,120,84,114,105,112,108,101,116,68,97,116,97,
+0,98,116,67,104,97,114,73,110,100,101,120,84,114,105,112,108,101,116,68,
+97,116,97,0,98,116,77,101,115,104,80,97,114,116,68,97,116,97,0,98,
+116,83,116,114,105,100,105,110,103,77,101,115,104,73,110,116,101,114,102,97,
+99,101,68,97,116,97,0,98,116,84,114,105,97,110,103,108,101,77,101,115,
+104,83,104,97,112,101,68,97,116,97,0,98,116,84,114,105,97,110,103,108,
+101,73,110,102,111,77,97,112,68,97,116,97,0,98,116,83,99,97,108,101,
+100,84,114,105,97,110,103,108,101,77,101,115,104,83,104,97,112,101,68,97,
+116,97,0,98,116,67,111,109,112,111,117,110,100,83,104,97,112,101,67,104,
+105,108,100,68,97,116,97,0,98,116,67,111,109,112,111,117,110,100,83,104,
+97,112,101,68,97,116,97,0,98,116,67,121,108,105,110,100,101,114,83,104,
+97,112,101,68,97,116,97,0,98,116,67,97,112,115,117,108,101,83,104,97,
+112,101,68,97,116,97,0,98,116,84,114,105,97,110,103,108,101,73,110,102,
+111,68,97,116,97,0,98,116,71,73,109,112,97,99,116,77,101,115,104,83,
+104,97,112,101,68,97,116,97,0,98,116,67,111,110,118,101,120,72,117,108,
+108,83,104,97,112,101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,
+111,110,79,98,106,101,99,116,68,111,117,98,108,101,68,97,116,97,0,98,
+116,67,111,108,108,105,115,105,111,110,79,98,106,101,99,116,70,108,111,97,
+116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,70,108,111,
+97,116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,68,111,
+117,98,108,101,68,97,116,97,0,98,116,67,111,110,115,116,114,97,105,110,
+116,73,110,102,111,49,0,98,116,84,121,112,101,100,67,111,110,115,116,114,
+97,105,110,116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,
+68,97,116,97,0,98,116,80,111,105,110,116,50,80,111,105,110,116,67,111,
+110,115,116,114,97,105,110,116,70,108,111,97,116,68,97,116,97,0,98,116,
+80,111,105,110,116,50,80,111,105,110,116,67,111,110,115,116,114,97,105,110,
+116,68,111,117,98,108,101,68,97,116,97,0,98,116,72,105,110,103,101,67,
+111,110,115,116,114,97,105,110,116,68,111,117,98,108,101,68,97,116,97,0,
+98,116,72,105,110,103,101,67,111,110,115,116,114,97,105,110,116,70,108,111,
+97,116,68,97,116,97,0,98,116,67,111,110,101,84,119,105,115,116,67,111,
+110,115,116,114,97,105,110,116,68,97,116,97,0,98,116,71,101,110,101,114,
+105,99,54,68,111,102,67,111,110,115,116,114,97,105,110,116,68,97,116,97,
+0,98,116,71,101,110,101,114,105,99,54,68,111,102,83,112,114,105,110,103,
+67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,98,116,83,108,105,
+100,101,114,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,83,111,
+102,116,66,111,100,121,77,97,116,101,114,105,97,108,68,97,116,97,0,83,
+111,102,116,66,111,100,121,78,111,100,101,68,97,116,97,0,83,111,102,116,
+66,111,100,121,76,105,110,107,68,97,116,97,0,83,111,102,116,66,111,100,
+121,70,97,99,101,68,97,116,97,0,83,111,102,116,66,111,100,121,84,101,
+116,114,97,68,97,116,97,0,83,111,102,116,82,105,103,105,100,65,110,99,
+104,111,114,68,97,116,97,0,83,111,102,116,66,111,100,121,67,111,110,102,
+105,103,68,97,116,97,0,83,111,102,116,66,111,100,121,80,111,115,101,68,
+97,116,97,0,83,111,102,116,66,111,100,121,67,108,117,115,116,101,114,68,
+97,116,97,0,98,116,83,111,102,116,66,111,100,121,74,111,105,110,116,68,
+97,116,97,0,98,116,83,111,102,116,66,111,100,121,70,108,111,97,116,68,
+97,116,97,0,84,76,69,78,1,0,1,0,2,0,2,0,4,0,4,0,
+4,0,4,0,8,0,0,0,12,0,36,0,8,0,16,0,32,0,48,0,
+96,0,64,0,-128,0,20,0,48,0,80,0,16,0,84,0,-124,0,12,0,
+52,0,52,0,20,0,64,0,4,0,4,0,8,0,4,0,32,0,28,0,
+60,0,56,0,76,0,76,0,24,0,60,0,60,0,16,0,64,0,68,0,
+-56,1,-8,0,-32,1,-104,3,8,0,44,0,0,0,76,0,108,0,84,1,
+-44,0,-52,0,-12,0,84,1,-60,0,16,0,100,0,20,0,36,0,100,0,
+92,0,104,0,-64,0,92,1,104,0,-92,1,83,84,82,67,61,0,0,0,
+10,0,3,0,4,0,0,0,4,0,1,0,9,0,2,0,11,0,3,0,
+10,0,3,0,10,0,4,0,10,0,5,0,12,0,2,0,9,0,6,0,
+9,0,7,0,13,0,1,0,7,0,8,0,14,0,1,0,8,0,8,0,
+15,0,1,0,13,0,9,0,16,0,1,0,14,0,9,0,17,0,2,0,
+15,0,10,0,13,0,11,0,18,0,2,0,16,0,10,0,14,0,11,0,
+19,0,4,0,4,0,12,0,4,0,13,0,2,0,14,0,2,0,15,0,
+20,0,6,0,13,0,16,0,13,0,17,0,4,0,18,0,4,0,19,0,
+4,0,20,0,0,0,21,0,21,0,6,0,14,0,16,0,14,0,17,0,
+4,0,18,0,4,0,19,0,4,0,20,0,0,0,21,0,22,0,3,0,
+2,0,14,0,2,0,15,0,4,0,22,0,23,0,12,0,13,0,23,0,
+13,0,24,0,13,0,25,0,4,0,26,0,4,0,27,0,4,0,28,0,
+4,0,29,0,20,0,30,0,22,0,31,0,19,0,32,0,4,0,33,0,
+4,0,34,0,24,0,12,0,14,0,23,0,14,0,24,0,14,0,25,0,
+4,0,26,0,4,0,27,0,4,0,28,0,4,0,29,0,21,0,30,0,
+22,0,31,0,4,0,33,0,4,0,34,0,19,0,32,0,25,0,3,0,
+0,0,35,0,4,0,36,0,0,0,37,0,26,0,5,0,25,0,38,0,
+13,0,39,0,13,0,40,0,7,0,41,0,0,0,21,0,27,0,5,0,
+25,0,38,0,13,0,39,0,13,0,42,0,7,0,43,0,4,0,44,0,
+28,0,2,0,13,0,45,0,7,0,46,0,29,0,4,0,27,0,47,0,
+28,0,48,0,4,0,49,0,0,0,37,0,30,0,1,0,4,0,50,0,
+31,0,2,0,2,0,50,0,0,0,51,0,32,0,2,0,2,0,52,0,
+0,0,51,0,33,0,2,0,0,0,52,0,0,0,53,0,34,0,8,0,
+13,0,54,0,14,0,55,0,30,0,56,0,32,0,57,0,33,0,58,0,
+31,0,59,0,4,0,60,0,4,0,61,0,35,0,4,0,34,0,62,0,
+13,0,63,0,4,0,64,0,0,0,37,0,36,0,7,0,25,0,38,0,
+35,0,65,0,23,0,66,0,24,0,67,0,37,0,68,0,7,0,43,0,
+0,0,69,0,38,0,2,0,36,0,70,0,13,0,39,0,39,0,4,0,
+17,0,71,0,25,0,72,0,4,0,73,0,7,0,74,0,40,0,4,0,
+25,0,38,0,39,0,75,0,4,0,76,0,7,0,43,0,41,0,3,0,
+27,0,47,0,4,0,77,0,0,0,37,0,42,0,3,0,27,0,47,0,
+4,0,77,0,0,0,37,0,43,0,4,0,4,0,78,0,7,0,79,0,
+7,0,80,0,7,0,81,0,37,0,14,0,4,0,82,0,4,0,83,0,
+43,0,84,0,4,0,85,0,7,0,86,0,7,0,87,0,7,0,88,0,
+7,0,89,0,7,0,90,0,4,0,91,0,4,0,92,0,4,0,93,0,
+4,0,94,0,0,0,37,0,44,0,5,0,25,0,38,0,35,0,65,0,
+13,0,39,0,7,0,43,0,4,0,95,0,45,0,5,0,27,0,47,0,
+13,0,96,0,14,0,97,0,4,0,98,0,0,0,99,0,46,0,24,0,
+9,0,100,0,9,0,101,0,25,0,102,0,0,0,35,0,18,0,103,0,
+18,0,104,0,14,0,105,0,14,0,106,0,14,0,107,0,8,0,108,0,
+8,0,109,0,8,0,110,0,8,0,111,0,8,0,112,0,8,0,113,0,
+8,0,114,0,4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0,
+4,0,119,0,4,0,120,0,4,0,121,0,0,0,37,0,47,0,23,0,
+9,0,100,0,9,0,101,0,25,0,102,0,0,0,35,0,17,0,103,0,
+17,0,104,0,13,0,105,0,13,0,106,0,13,0,107,0,7,0,108,0,
+7,0,109,0,7,0,110,0,7,0,111,0,7,0,112,0,7,0,113,0,
+7,0,114,0,4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0,
+4,0,119,0,4,0,120,0,4,0,121,0,48,0,21,0,47,0,122,0,
+15,0,123,0,13,0,124,0,13,0,125,0,13,0,126,0,13,0,127,0,
+13,0,-128,0,13,0,-127,0,13,0,-126,0,13,0,-125,0,13,0,-124,0,
+7,0,-123,0,7,0,-122,0,7,0,-121,0,7,0,-120,0,7,0,-119,0,
+7,0,-118,0,7,0,-117,0,7,0,-116,0,7,0,-115,0,4,0,-114,0,
+49,0,22,0,46,0,122,0,16,0,123,0,14,0,124,0,14,0,125,0,
+14,0,126,0,14,0,127,0,14,0,-128,0,14,0,-127,0,14,0,-126,0,
+14,0,-125,0,14,0,-124,0,8,0,-123,0,8,0,-122,0,8,0,-121,0,
+8,0,-120,0,8,0,-119,0,8,0,-118,0,8,0,-117,0,8,0,-116,0,
+8,0,-115,0,4,0,-114,0,0,0,37,0,50,0,2,0,4,0,-113,0,
+4,0,-112,0,51,0,11,0,52,0,-111,0,52,0,-110,0,0,0,35,0,
+4,0,-109,0,4,0,-108,0,4,0,-107,0,4,0,-106,0,7,0,-105,0,
+7,0,-104,0,4,0,-103,0,0,0,-102,0,53,0,3,0,51,0,-101,0,
+13,0,-100,0,13,0,-99,0,54,0,3,0,51,0,-101,0,14,0,-100,0,
+14,0,-99,0,55,0,13,0,51,0,-101,0,18,0,-98,0,18,0,-97,0,
+4,0,-96,0,4,0,-95,0,4,0,-94,0,7,0,-93,0,7,0,-92,0,
+7,0,-91,0,7,0,-90,0,7,0,-89,0,7,0,-88,0,7,0,-87,0,
+56,0,13,0,51,0,-101,0,17,0,-98,0,17,0,-97,0,4,0,-96,0,
+4,0,-95,0,4,0,-94,0,7,0,-93,0,7,0,-92,0,7,0,-91,0,
+7,0,-90,0,7,0,-89,0,7,0,-88,0,7,0,-87,0,57,0,11,0,
+51,0,-101,0,17,0,-98,0,17,0,-97,0,7,0,-86,0,7,0,-85,0,
+7,0,-84,0,7,0,-89,0,7,0,-88,0,7,0,-87,0,7,0,-83,0,
+0,0,21,0,58,0,9,0,51,0,-101,0,17,0,-98,0,17,0,-97,0,
+13,0,-82,0,13,0,-81,0,13,0,-80,0,13,0,-79,0,4,0,-78,0,
+4,0,-77,0,59,0,5,0,58,0,-76,0,4,0,-75,0,7,0,-74,0,
+7,0,-73,0,7,0,-72,0,60,0,9,0,51,0,-101,0,17,0,-98,0,
+17,0,-97,0,7,0,-82,0,7,0,-81,0,7,0,-80,0,7,0,-79,0,
+4,0,-78,0,4,0,-77,0,61,0,4,0,7,0,-71,0,7,0,-70,0,
+7,0,-69,0,4,0,78,0,62,0,10,0,61,0,-68,0,13,0,-67,0,
+13,0,-66,0,13,0,-65,0,13,0,-64,0,13,0,-63,0,7,0,-123,0,
+7,0,-62,0,4,0,-61,0,4,0,53,0,63,0,4,0,61,0,-68,0,
+4,0,-60,0,7,0,-59,0,4,0,-58,0,64,0,4,0,13,0,-63,0,
+61,0,-68,0,4,0,-57,0,7,0,-56,0,65,0,7,0,13,0,-55,0,
+61,0,-68,0,4,0,-54,0,7,0,-53,0,7,0,-52,0,7,0,-51,0,
+4,0,53,0,66,0,6,0,15,0,-50,0,13,0,-52,0,13,0,-49,0,
+52,0,-48,0,4,0,-47,0,7,0,-51,0,67,0,26,0,4,0,-46,0,
+7,0,-45,0,7,0,-83,0,7,0,-44,0,7,0,-43,0,7,0,-42,0,
+7,0,-41,0,7,0,-40,0,7,0,-39,0,7,0,-38,0,7,0,-37,0,
+7,0,-36,0,7,0,-35,0,7,0,-34,0,7,0,-33,0,7,0,-32,0,
+7,0,-31,0,7,0,-30,0,7,0,-29,0,7,0,-28,0,7,0,-27,0,
+4,0,-26,0,4,0,-25,0,4,0,-24,0,4,0,-23,0,4,0,116,0,
+68,0,12,0,15,0,-22,0,15,0,-21,0,15,0,-20,0,13,0,-19,0,
+13,0,-18,0,7,0,-17,0,4,0,-16,0,4,0,-15,0,4,0,-14,0,
+4,0,-13,0,7,0,-53,0,4,0,53,0,69,0,27,0,17,0,-12,0,
+15,0,-11,0,15,0,-10,0,13,0,-19,0,13,0,-9,0,13,0,-8,0,
+13,0,-7,0,13,0,-6,0,13,0,-5,0,4,0,-4,0,7,0,-3,0,
+4,0,-2,0,4,0,-1,0,4,0,0,1,7,0,1,1,7,0,2,1,
+4,0,3,1,4,0,4,1,7,0,5,1,7,0,6,1,7,0,7,1,
+7,0,8,1,7,0,9,1,7,0,10,1,4,0,11,1,4,0,12,1,
+4,0,13,1,70,0,12,0,9,0,14,1,9,0,15,1,13,0,16,1,
+7,0,17,1,7,0,18,1,7,0,19,1,4,0,20,1,13,0,21,1,
+4,0,22,1,4,0,23,1,4,0,24,1,4,0,53,0,71,0,19,0,
+47,0,122,0,68,0,25,1,61,0,26,1,62,0,27,1,63,0,28,1,
+64,0,29,1,65,0,30,1,66,0,31,1,69,0,32,1,70,0,33,1,
+4,0,34,1,4,0,-1,0,4,0,35,1,4,0,36,1,4,0,37,1,
+4,0,38,1,4,0,39,1,4,0,40,1,67,0,41,1,};
+int sBulletDNAlen= sizeof(sBulletDNAstr);
+unsigned char sBulletDNAstr64[]= {
+83,68,78,65,78,65,77,69,42,1,0,0,109,95,115,105,122,101,0,109,
+95,99,97,112,97,99,105,116,121,0,42,109,95,100,97,116,97,0,109,95,
+99,111,108,108,105,115,105,111,110,83,104,97,112,101,115,0,109,95,99,111,
+108,108,105,115,105,111,110,79,98,106,101,99,116,115,0,109,95,99,111,110,
+115,116,114,97,105,110,116,115,0,42,102,105,114,115,116,0,42,108,97,115,
+116,0,109,95,102,108,111,97,116,115,91,52,93,0,109,95,101,108,91,51,
+93,0,109,95,98,97,115,105,115,0,109,95,111,114,105,103,105,110,0,109,
+95,114,111,111,116,78,111,100,101,73,110,100,101,120,0,109,95,115,117,98,
+116,114,101,101,83,105,122,101,0,109,95,113,117,97,110,116,105,122,101,100,
+65,97,98,98,77,105,110,91,51,93,0,109,95,113,117,97,110,116,105,122,
+101,100,65,97,98,98,77,97,120,91,51,93,0,109,95,97,97,98,98,77,
+105,110,79,114,103,0,109,95,97,97,98,98,77,97,120,79,114,103,0,109,
+95,101,115,99,97,112,101,73,110,100,101,120,0,109,95,115,117,98,80,97,
+114,116,0,109,95,116,114,105,97,110,103,108,101,73,110,100,101,120,0,109,
+95,112,97,100,91,52,93,0,109,95,101,115,99,97,112,101,73,110,100,101,
+120,79,114,84,114,105,97,110,103,108,101,73,110,100,101,120,0,109,95,98,
+118,104,65,97,98,98,77,105,110,0,109,95,98,118,104,65,97,98,98,77,
+97,120,0,109,95,98,118,104,81,117,97,110,116,105,122,97,116,105,111,110,
+0,109,95,99,117,114,78,111,100,101,73,110,100,101,120,0,109,95,117,115,
+101,81,117,97,110,116,105,122,97,116,105,111,110,0,109,95,110,117,109,67,
+111,110,116,105,103,117,111,117,115,76,101,97,102,78,111,100,101,115,0,109,
+95,110,117,109,81,117,97,110,116,105,122,101,100,67,111,110,116,105,103,117,
+111,117,115,78,111,100,101,115,0,42,109,95,99,111,110,116,105,103,117,111,
+117,115,78,111,100,101,115,80,116,114,0,42,109,95,113,117,97,110,116,105,
+122,101,100,67,111,110,116,105,103,117,111,117,115,78,111,100,101,115,80,116,
+114,0,42,109,95,115,117,98,84,114,101,101,73,110,102,111,80,116,114,0,
+109,95,116,114,97,118,101,114,115,97,108,77,111,100,101,0,109,95,110,117,
+109,83,117,98,116,114,101,101,72,101,97,100,101,114,115,0,42,109,95,110,
+97,109,101,0,109,95,115,104,97,112,101,84,121,112,101,0,109,95,112,97,
+100,100,105,110,103,91,52,93,0,109,95,99,111,108,108,105,115,105,111,110,
+83,104,97,112,101,68,97,116,97,0,109,95,108,111,99,97,108,83,99,97,
+108,105,110,103,0,109,95,112,108,97,110,101,78,111,114,109,97,108,0,109,
+95,112,108,97,110,101,67,111,110,115,116,97,110,116,0,109,95,105,109,112,
+108,105,99,105,116,83,104,97,112,101,68,105,109,101,110,115,105,111,110,115,
+0,109,95,99,111,108,108,105,115,105,111,110,77,97,114,103,105,110,0,109,
+95,112,97,100,100,105,110,103,0,109,95,112,111,115,0,109,95,114,97,100,
+105,117,115,0,109,95,99,111,110,118,101,120,73,110,116,101,114,110,97,108,
+83,104,97,112,101,68,97,116,97,0,42,109,95,108,111,99,97,108,80,111,
+115,105,116,105,111,110,65,114,114,97,121,80,116,114,0,109,95,108,111,99,
+97,108,80,111,115,105,116,105,111,110,65,114,114,97,121,83,105,122,101,0,
+109,95,118,97,108,117,101,0,109,95,112,97,100,91,50,93,0,109,95,118,
+97,108,117,101,115,91,51,93,0,109,95,112,97,100,0,42,109,95,118,101,
+114,116,105,99,101,115,51,102,0,42,109,95,118,101,114,116,105,99,101,115,
+51,100,0,42,109,95,105,110,100,105,99,101,115,51,50,0,42,109,95,51,
+105,110,100,105,99,101,115,49,54,0,42,109,95,51,105,110,100,105,99,101,
+115,56,0,42,109,95,105,110,100,105,99,101,115,49,54,0,109,95,110,117,
+109,84,114,105,97,110,103,108,101,115,0,109,95,110,117,109,86,101,114,116,
+105,99,101,115,0,42,109,95,109,101,115,104,80,97,114,116,115,80,116,114,
+0,109,95,115,99,97,108,105,110,103,0,109,95,110,117,109,77,101,115,104,
+80,97,114,116,115,0,109,95,109,101,115,104,73,110,116,101,114,102,97,99,
+101,0,42,109,95,113,117,97,110,116,105,122,101,100,70,108,111,97,116,66,
+118,104,0,42,109,95,113,117,97,110,116,105,122,101,100,68,111,117,98,108,
+101,66,118,104,0,42,109,95,116,114,105,97,110,103,108,101,73,110,102,111,
+77,97,112,0,109,95,112,97,100,51,91,52,93,0,109,95,116,114,105,109,
+101,115,104,83,104,97,112,101,68,97,116,97,0,109,95,116,114,97,110,115,
+102,111,114,109,0,42,109,95,99,104,105,108,100,83,104,97,112,101,0,109,
+95,99,104,105,108,100,83,104,97,112,101,84,121,112,101,0,109,95,99,104,
+105,108,100,77,97,114,103,105,110,0,42,109,95,99,104,105,108,100,83,104,
+97,112,101,80,116,114,0,109,95,110,117,109,67,104,105,108,100,83,104,97,
+112,101,115,0,109,95,117,112,65,120,105,115,0,109,95,102,108,97,103,115,
+0,109,95,101,100,103,101,86,48,86,49,65,110,103,108,101,0,109,95,101,
+100,103,101,86,49,86,50,65,110,103,108,101,0,109,95,101,100,103,101,86,
+50,86,48,65,110,103,108,101,0,42,109,95,104,97,115,104,84,97,98,108,
+101,80,116,114,0,42,109,95,110,101,120,116,80,116,114,0,42,109,95,118,
+97,108,117,101,65,114,114,97,121,80,116,114,0,42,109,95,107,101,121,65,
+114,114,97,121,80,116,114,0,109,95,99,111,110,118,101,120,69,112,115,105,
+108,111,110,0,109,95,112,108,97,110,97,114,69,112,115,105,108,111,110,0,
+109,95,101,113,117,97,108,86,101,114,116,101,120,84,104,114,101,115,104,111,
+108,100,0,109,95,101,100,103,101,68,105,115,116,97,110,99,101,84,104,114,
+101,115,104,111,108,100,0,109,95,122,101,114,111,65,114,101,97,84,104,114,
+101,115,104,111,108,100,0,109,95,110,101,120,116,83,105,122,101,0,109,95,
+104,97,115,104,84,97,98,108,101,83,105,122,101,0,109,95,110,117,109,86,
+97,108,117,101,115,0,109,95,110,117,109,75,101,121,115,0,109,95,103,105,
+109,112,97,99,116,83,117,98,84,121,112,101,0,42,109,95,117,110,115,99,
+97,108,101,100,80,111,105,110,116,115,70,108,111,97,116,80,116,114,0,42,
+109,95,117,110,115,99,97,108,101,100,80,111,105,110,116,115,68,111,117,98,
+108,101,80,116,114,0,109,95,110,117,109,85,110,115,99,97,108,101,100,80,
+111,105,110,116,115,0,109,95,112,97,100,100,105,110,103,51,91,52,93,0,
+42,109,95,98,114,111,97,100,112,104,97,115,101,72,97,110,100,108,101,0,
+42,109,95,99,111,108,108,105,115,105,111,110,83,104,97,112,101,0,42,109,
+95,114,111,111,116,67,111,108,108,105,115,105,111,110,83,104,97,112,101,0,
+109,95,119,111,114,108,100,84,114,97,110,115,102,111,114,109,0,109,95,105,
+110,116,101,114,112,111,108,97,116,105,111,110,87,111,114,108,100,84,114,97,
+110,115,102,111,114,109,0,109,95,105,110,116,101,114,112,111,108,97,116,105,
+111,110,76,105,110,101,97,114,86,101,108,111,99,105,116,121,0,109,95,105,
+110,116,101,114,112,111,108,97,116,105,111,110,65,110,103,117,108,97,114,86,
+101,108,111,99,105,116,121,0,109,95,97,110,105,115,111,116,114,111,112,105,
+99,70,114,105,99,116,105,111,110,0,109,95,99,111,110,116,97,99,116,80,
+114,111,99,101,115,115,105,110,103,84,104,114,101,115,104,111,108,100,0,109,
+95,100,101,97,99,116,105,118,97,116,105,111,110,84,105,109,101,0,109,95,
+102,114,105,99,116,105,111,110,0,109,95,114,101,115,116,105,116,117,116,105,
+111,110,0,109,95,104,105,116,70,114,97,99,116,105,111,110,0,109,95,99,
+99,100,83,119,101,112,116,83,112,104,101,114,101,82,97,100,105,117,115,0,
+109,95,99,99,100,77,111,116,105,111,110,84,104,114,101,115,104,111,108,100,
+0,109,95,104,97,115,65,110,105,115,111,116,114,111,112,105,99,70,114,105,
+99,116,105,111,110,0,109,95,99,111,108,108,105,115,105,111,110,70,108,97,
+103,115,0,109,95,105,115,108,97,110,100,84,97,103,49,0,109,95,99,111,
+109,112,97,110,105,111,110,73,100,0,109,95,97,99,116,105,118,97,116,105,
+111,110,83,116,97,116,101,49,0,109,95,105,110,116,101,114,110,97,108,84,
+121,112,101,0,109,95,99,104,101,99,107,67,111,108,108,105,100,101,87,105,
+116,104,0,109,95,99,111,108,108,105,115,105,111,110,79,98,106,101,99,116,
+68,97,116,97,0,109,95,105,110,118,73,110,101,114,116,105,97,84,101,110,
+115,111,114,87,111,114,108,100,0,109,95,108,105,110,101,97,114,86,101,108,
+111,99,105,116,121,0,109,95,97,110,103,117,108,97,114,86,101,108,111,99,
+105,116,121,0,109,95,97,110,103,117,108,97,114,70,97,99,116,111,114,0,
+109,95,108,105,110,101,97,114,70,97,99,116,111,114,0,109,95,103,114,97,
+118,105,116,121,0,109,95,103,114,97,118,105,116,121,95,97,99,99,101,108,
+101,114,97,116,105,111,110,0,109,95,105,110,118,73,110,101,114,116,105,97,
+76,111,99,97,108,0,109,95,116,111,116,97,108,70,111,114,99,101,0,109,
+95,116,111,116,97,108,84,111,114,113,117,101,0,109,95,105,110,118,101,114,
+115,101,77,97,115,115,0,109,95,108,105,110,101,97,114,68,97,109,112,105,
+110,103,0,109,95,97,110,103,117,108,97,114,68,97,109,112,105,110,103,0,
+109,95,97,100,100,105,116,105,111,110,97,108,68,97,109,112,105,110,103,70,
+97,99,116,111,114,0,109,95,97,100,100,105,116,105,111,110,97,108,76,105,
+110,101,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108,100,
+83,113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103,117,
+108,97,114,68,97,109,112,105,110,103,84,104,114,101,115,104,111,108,100,83,
+113,114,0,109,95,97,100,100,105,116,105,111,110,97,108,65,110,103,117,108,
+97,114,68,97,109,112,105,110,103,70,97,99,116,111,114,0,109,95,108,105,
+110,101,97,114,83,108,101,101,112,105,110,103,84,104,114,101,115,104,111,108,
+100,0,109,95,97,110,103,117,108,97,114,83,108,101,101,112,105,110,103,84,
+104,114,101,115,104,111,108,100,0,109,95,97,100,100,105,116,105,111,110,97,
+108,68,97,109,112,105,110,103,0,109,95,110,117,109,67,111,110,115,116,114,
+97,105,110,116,82,111,119,115,0,110,117,98,0,42,109,95,114,98,65,0,
+42,109,95,114,98,66,0,109,95,111,98,106,101,99,116,84,121,112,101,0,
+109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,84,121,112,101,
+0,109,95,117,115,101,114,67,111,110,115,116,114,97,105,110,116,73,100,0,
+109,95,110,101,101,100,115,70,101,101,100,98,97,99,107,0,109,95,97,112,
+112,108,105,101,100,73,109,112,117,108,115,101,0,109,95,100,98,103,68,114,
+97,119,83,105,122,101,0,109,95,100,105,115,97,98,108,101,67,111,108,108,
+105,115,105,111,110,115,66,101,116,119,101,101,110,76,105,110,107,101,100,66,
+111,100,105,101,115,0,109,95,112,97,100,52,91,52,93,0,109,95,116,121,
+112,101,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,109,95,112,
+105,118,111,116,73,110,65,0,109,95,112,105,118,111,116,73,110,66,0,109,
+95,114,98,65,70,114,97,109,101,0,109,95,114,98,66,70,114,97,109,101,
+0,109,95,117,115,101,82,101,102,101,114,101,110,99,101,70,114,97,109,101,
+65,0,109,95,97,110,103,117,108,97,114,79,110,108,121,0,109,95,101,110,
+97,98,108,101,65,110,103,117,108,97,114,77,111,116,111,114,0,109,95,109,
+111,116,111,114,84,97,114,103,101,116,86,101,108,111,99,105,116,121,0,109,
+95,109,97,120,77,111,116,111,114,73,109,112,117,108,115,101,0,109,95,108,
+111,119,101,114,76,105,109,105,116,0,109,95,117,112,112,101,114,76,105,109,
+105,116,0,109,95,108,105,109,105,116,83,111,102,116,110,101,115,115,0,109,
+95,98,105,97,115,70,97,99,116,111,114,0,109,95,114,101,108,97,120,97,
+116,105,111,110,70,97,99,116,111,114,0,109,95,115,119,105,110,103,83,112,
+97,110,49,0,109,95,115,119,105,110,103,83,112,97,110,50,0,109,95,116,
+119,105,115,116,83,112,97,110,0,109,95,100,97,109,112,105,110,103,0,109,
+95,108,105,110,101,97,114,85,112,112,101,114,76,105,109,105,116,0,109,95,
+108,105,110,101,97,114,76,111,119,101,114,76,105,109,105,116,0,109,95,97,
+110,103,117,108,97,114,85,112,112,101,114,76,105,109,105,116,0,109,95,97,
+110,103,117,108,97,114,76,111,119,101,114,76,105,109,105,116,0,109,95,117,
+115,101,76,105,110,101,97,114,82,101,102,101,114,101,110,99,101,70,114,97,
+109,101,65,0,109,95,117,115,101,79,102,102,115,101,116,70,111,114,67,111,
+110,115,116,114,97,105,110,116,70,114,97,109,101,0,109,95,54,100,111,102,
+68,97,116,97,0,109,95,115,112,114,105,110,103,69,110,97,98,108,101,100,
+91,54,93,0,109,95,101,113,117,105,108,105,98,114,105,117,109,80,111,105,
+110,116,91,54,93,0,109,95,115,112,114,105,110,103,83,116,105,102,102,110,
+101,115,115,91,54,93,0,109,95,115,112,114,105,110,103,68,97,109,112,105,
+110,103,91,54,93,0,109,95,108,105,110,101,97,114,83,116,105,102,102,110,
+101,115,115,0,109,95,97,110,103,117,108,97,114,83,116,105,102,102,110,101,
+115,115,0,109,95,118,111,108,117,109,101,83,116,105,102,102,110,101,115,115,
+0,42,109,95,109,97,116,101,114,105,97,108,0,109,95,112,111,115,105,116,
+105,111,110,0,109,95,112,114,101,118,105,111,117,115,80,111,115,105,116,105,
+111,110,0,109,95,118,101,108,111,99,105,116,121,0,109,95,97,99,99,117,
+109,117,108,97,116,101,100,70,111,114,99,101,0,109,95,110,111,114,109,97,
+108,0,109,95,97,114,101,97,0,109,95,97,116,116,97,99,104,0,109,95,
+110,111,100,101,73,110,100,105,99,101,115,91,50,93,0,109,95,114,101,115,
+116,76,101,110,103,116,104,0,109,95,98,98,101,110,100,105,110,103,0,109,
+95,110,111,100,101,73,110,100,105,99,101,115,91,51,93,0,109,95,114,101,
+115,116,65,114,101,97,0,109,95,99,48,91,52,93,0,109,95,110,111,100,
+101,73,110,100,105,99,101,115,91,52,93,0,109,95,114,101,115,116,86,111,
+108,117,109,101,0,109,95,99,49,0,109,95,99,50,0,109,95,99,48,0,
+109,95,108,111,99,97,108,70,114,97,109,101,0,42,109,95,114,105,103,105,
+100,66,111,100,121,0,109,95,110,111,100,101,73,110,100,101,120,0,109,95,
+97,101,114,111,77,111,100,101,108,0,109,95,98,97,117,109,103,97,114,116,
+101,0,109,95,100,114,97,103,0,109,95,108,105,102,116,0,109,95,112,114,
+101,115,115,117,114,101,0,109,95,118,111,108,117,109,101,0,109,95,100,121,
+110,97,109,105,99,70,114,105,99,116,105,111,110,0,109,95,112,111,115,101,
+77,97,116,99,104,0,109,95,114,105,103,105,100,67,111,110,116,97,99,116,
+72,97,114,100,110,101,115,115,0,109,95,107,105,110,101,116,105,99,67,111,
+110,116,97,99,116,72,97,114,100,110,101,115,115,0,109,95,115,111,102,116,
+67,111,110,116,97,99,116,72,97,114,100,110,101,115,115,0,109,95,97,110,
+99,104,111,114,72,97,114,100,110,101,115,115,0,109,95,115,111,102,116,82,
+105,103,105,100,67,108,117,115,116,101,114,72,97,114,100,110,101,115,115,0,
+109,95,115,111,102,116,75,105,110,101,116,105,99,67,108,117,115,116,101,114,
+72,97,114,100,110,101,115,115,0,109,95,115,111,102,116,83,111,102,116,67,
+108,117,115,116,101,114,72,97,114,100,110,101,115,115,0,109,95,115,111,102,
+116,82,105,103,105,100,67,108,117,115,116,101,114,73,109,112,117,108,115,101,
+83,112,108,105,116,0,109,95,115,111,102,116,75,105,110,101,116,105,99,67,
+108,117,115,116,101,114,73,109,112,117,108,115,101,83,112,108,105,116,0,109,
+95,115,111,102,116,83,111,102,116,67,108,117,115,116,101,114,73,109,112,117,
+108,115,101,83,112,108,105,116,0,109,95,109,97,120,86,111,108,117,109,101,
+0,109,95,116,105,109,101,83,99,97,108,101,0,109,95,118,101,108,111,99,
+105,116,121,73,116,101,114,97,116,105,111,110,115,0,109,95,112,111,115,105,
+116,105,111,110,73,116,101,114,97,116,105,111,110,115,0,109,95,100,114,105,
+102,116,73,116,101,114,97,116,105,111,110,115,0,109,95,99,108,117,115,116,
+101,114,73,116,101,114,97,116,105,111,110,115,0,109,95,114,111,116,0,109,
+95,115,99,97,108,101,0,109,95,97,113,113,0,109,95,99,111,109,0,42,
+109,95,112,111,115,105,116,105,111,110,115,0,42,109,95,119,101,105,103,104,
+116,115,0,109,95,110,117,109,80,111,115,105,116,105,111,110,115,0,109,95,
+110,117,109,87,101,105,103,116,115,0,109,95,98,118,111,108,117,109,101,0,
+109,95,98,102,114,97,109,101,0,109,95,102,114,97,109,101,120,102,111,114,
+109,0,109,95,108,111,99,105,105,0,109,95,105,110,118,119,105,0,109,95,
+118,105,109,112,117,108,115,101,115,91,50,93,0,109,95,100,105,109,112,117,
+108,115,101,115,91,50,93,0,109,95,108,118,0,109,95,97,118,0,42,109,
+95,102,114,97,109,101,114,101,102,115,0,42,109,95,110,111,100,101,73,110,
+100,105,99,101,115,0,42,109,95,109,97,115,115,101,115,0,109,95,110,117,
+109,70,114,97,109,101,82,101,102,115,0,109,95,110,117,109,78,111,100,101,
+115,0,109,95,110,117,109,77,97,115,115,101,115,0,109,95,105,100,109,97,
+115,115,0,109,95,105,109,97,115,115,0,109,95,110,118,105,109,112,117,108,
+115,101,115,0,109,95,110,100,105,109,112,117,108,115,101,115,0,109,95,110,
+100,97,109,112,105,110,103,0,109,95,108,100,97,109,112,105,110,103,0,109,
+95,97,100,97,109,112,105,110,103,0,109,95,109,97,116,99,104,105,110,103,
+0,109,95,109,97,120,83,101,108,102,67,111,108,108,105,115,105,111,110,73,
+109,112,117,108,115,101,0,109,95,115,101,108,102,67,111,108,108,105,115,105,
+111,110,73,109,112,117,108,115,101,70,97,99,116,111,114,0,109,95,99,111,
+110,116,97,105,110,115,65,110,99,104,111,114,0,109,95,99,111,108,108,105,
+100,101,0,109,95,99,108,117,115,116,101,114,73,110,100,101,120,0,42,109,
+95,98,111,100,121,65,0,42,109,95,98,111,100,121,66,0,109,95,114,101,
+102,115,91,50,93,0,109,95,99,102,109,0,109,95,101,114,112,0,109,95,
+115,112,108,105,116,0,109,95,100,101,108,101,116,101,0,109,95,114,101,108,
+80,111,115,105,116,105,111,110,91,50,93,0,109,95,98,111,100,121,65,116,
+121,112,101,0,109,95,98,111,100,121,66,116,121,112,101,0,109,95,106,111,
+105,110,116,84,121,112,101,0,42,109,95,112,111,115,101,0,42,42,109,95,
+109,97,116,101,114,105,97,108,115,0,42,109,95,110,111,100,101,115,0,42,
+109,95,108,105,110,107,115,0,42,109,95,102,97,99,101,115,0,42,109,95,
+116,101,116,114,97,104,101,100,114,97,0,42,109,95,97,110,99,104,111,114,
+115,0,42,109,95,99,108,117,115,116,101,114,115,0,42,109,95,106,111,105,
+110,116,115,0,109,95,110,117,109,77,97,116,101,114,105,97,108,115,0,109,
+95,110,117,109,76,105,110,107,115,0,109,95,110,117,109,70,97,99,101,115,
+0,109,95,110,117,109,84,101,116,114,97,104,101,100,114,97,0,109,95,110,
+117,109,65,110,99,104,111,114,115,0,109,95,110,117,109,67,108,117,115,116,
+101,114,115,0,109,95,110,117,109,74,111,105,110,116,115,0,109,95,99,111,
+110,102,105,103,0,0,0,0,84,89,80,69,72,0,0,0,99,104,97,114,
+0,117,99,104,97,114,0,115,104,111,114,116,0,117,115,104,111,114,116,0,
+105,110,116,0,108,111,110,103,0,117,108,111,110,103,0,102,108,111,97,116,
+0,100,111,117,98,108,101,0,118,111,105,100,0,80,111,105,110,116,101,114,
+65,114,114,97,121,0,98,116,80,104,121,115,105,99,115,83,121,115,116,101,
+109,0,76,105,115,116,66,97,115,101,0,98,116,86,101,99,116,111,114,51,
+70,108,111,97,116,68,97,116,97,0,98,116,86,101,99,116,111,114,51,68,
+111,117,98,108,101,68,97,116,97,0,98,116,77,97,116,114,105,120,51,120,
+51,70,108,111,97,116,68,97,116,97,0,98,116,77,97,116,114,105,120,51,
+120,51,68,111,117,98,108,101,68,97,116,97,0,98,116,84,114,97,110,115,
+102,111,114,109,70,108,111,97,116,68,97,116,97,0,98,116,84,114,97,110,
+115,102,111,114,109,68,111,117,98,108,101,68,97,116,97,0,98,116,66,118,
+104,83,117,98,116,114,101,101,73,110,102,111,68,97,116,97,0,98,116,79,
+112,116,105,109,105,122,101,100,66,118,104,78,111,100,101,70,108,111,97,116,
+68,97,116,97,0,98,116,79,112,116,105,109,105,122,101,100,66,118,104,78,
+111,100,101,68,111,117,98,108,101,68,97,116,97,0,98,116,81,117,97,110,
+116,105,122,101,100,66,118,104,78,111,100,101,68,97,116,97,0,98,116,81,
+117,97,110,116,105,122,101,100,66,118,104,70,108,111,97,116,68,97,116,97,
+0,98,116,81,117,97,110,116,105,122,101,100,66,118,104,68,111,117,98,108,
+101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,111,110,83,104,97,
+112,101,68,97,116,97,0,98,116,83,116,97,116,105,99,80,108,97,110,101,
+83,104,97,112,101,68,97,116,97,0,98,116,67,111,110,118,101,120,73,110,
+116,101,114,110,97,108,83,104,97,112,101,68,97,116,97,0,98,116,80,111,
+115,105,116,105,111,110,65,110,100,82,97,100,105,117,115,0,98,116,77,117,
+108,116,105,83,112,104,101,114,101,83,104,97,112,101,68,97,116,97,0,98,
+116,73,110,116,73,110,100,101,120,68,97,116,97,0,98,116,83,104,111,114,
+116,73,110,116,73,110,100,101,120,68,97,116,97,0,98,116,83,104,111,114,
+116,73,110,116,73,110,100,101,120,84,114,105,112,108,101,116,68,97,116,97,
+0,98,116,67,104,97,114,73,110,100,101,120,84,114,105,112,108,101,116,68,
+97,116,97,0,98,116,77,101,115,104,80,97,114,116,68,97,116,97,0,98,
+116,83,116,114,105,100,105,110,103,77,101,115,104,73,110,116,101,114,102,97,
+99,101,68,97,116,97,0,98,116,84,114,105,97,110,103,108,101,77,101,115,
+104,83,104,97,112,101,68,97,116,97,0,98,116,84,114,105,97,110,103,108,
+101,73,110,102,111,77,97,112,68,97,116,97,0,98,116,83,99,97,108,101,
+100,84,114,105,97,110,103,108,101,77,101,115,104,83,104,97,112,101,68,97,
+116,97,0,98,116,67,111,109,112,111,117,110,100,83,104,97,112,101,67,104,
+105,108,100,68,97,116,97,0,98,116,67,111,109,112,111,117,110,100,83,104,
+97,112,101,68,97,116,97,0,98,116,67,121,108,105,110,100,101,114,83,104,
+97,112,101,68,97,116,97,0,98,116,67,97,112,115,117,108,101,83,104,97,
+112,101,68,97,116,97,0,98,116,84,114,105,97,110,103,108,101,73,110,102,
+111,68,97,116,97,0,98,116,71,73,109,112,97,99,116,77,101,115,104,83,
+104,97,112,101,68,97,116,97,0,98,116,67,111,110,118,101,120,72,117,108,
+108,83,104,97,112,101,68,97,116,97,0,98,116,67,111,108,108,105,115,105,
+111,110,79,98,106,101,99,116,68,111,117,98,108,101,68,97,116,97,0,98,
+116,67,111,108,108,105,115,105,111,110,79,98,106,101,99,116,70,108,111,97,
+116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,70,108,111,
+97,116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,68,111,
+117,98,108,101,68,97,116,97,0,98,116,67,111,110,115,116,114,97,105,110,
+116,73,110,102,111,49,0,98,116,84,121,112,101,100,67,111,110,115,116,114,
+97,105,110,116,68,97,116,97,0,98,116,82,105,103,105,100,66,111,100,121,
+68,97,116,97,0,98,116,80,111,105,110,116,50,80,111,105,110,116,67,111,
+110,115,116,114,97,105,110,116,70,108,111,97,116,68,97,116,97,0,98,116,
+80,111,105,110,116,50,80,111,105,110,116,67,111,110,115,116,114,97,105,110,
+116,68,111,117,98,108,101,68,97,116,97,0,98,116,72,105,110,103,101,67,
+111,110,115,116,114,97,105,110,116,68,111,117,98,108,101,68,97,116,97,0,
+98,116,72,105,110,103,101,67,111,110,115,116,114,97,105,110,116,70,108,111,
+97,116,68,97,116,97,0,98,116,67,111,110,101,84,119,105,115,116,67,111,
+110,115,116,114,97,105,110,116,68,97,116,97,0,98,116,71,101,110,101,114,
+105,99,54,68,111,102,67,111,110,115,116,114,97,105,110,116,68,97,116,97,
+0,98,116,71,101,110,101,114,105,99,54,68,111,102,83,112,114,105,110,103,
+67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,98,116,83,108,105,
+100,101,114,67,111,110,115,116,114,97,105,110,116,68,97,116,97,0,83,111,
+102,116,66,111,100,121,77,97,116,101,114,105,97,108,68,97,116,97,0,83,
+111,102,116,66,111,100,121,78,111,100,101,68,97,116,97,0,83,111,102,116,
+66,111,100,121,76,105,110,107,68,97,116,97,0,83,111,102,116,66,111,100,
+121,70,97,99,101,68,97,116,97,0,83,111,102,116,66,111,100,121,84,101,
+116,114,97,68,97,116,97,0,83,111,102,116,82,105,103,105,100,65,110,99,
+104,111,114,68,97,116,97,0,83,111,102,116,66,111,100,121,67,111,110,102,
+105,103,68,97,116,97,0,83,111,102,116,66,111,100,121,80,111,115,101,68,
+97,116,97,0,83,111,102,116,66,111,100,121,67,108,117,115,116,101,114,68,
+97,116,97,0,98,116,83,111,102,116,66,111,100,121,74,111,105,110,116,68,
+97,116,97,0,98,116,83,111,102,116,66,111,100,121,70,108,111,97,116,68,
+97,116,97,0,84,76,69,78,1,0,1,0,2,0,2,0,4,0,4,0,
+4,0,4,0,8,0,0,0,16,0,48,0,16,0,16,0,32,0,48,0,
+96,0,64,0,-128,0,20,0,48,0,80,0,16,0,96,0,-112,0,16,0,
+56,0,56,0,20,0,72,0,4,0,4,0,8,0,4,0,56,0,32,0,
+80,0,72,0,96,0,80,0,32,0,64,0,64,0,16,0,72,0,80,0,
+-40,1,8,1,-16,1,-88,3,8,0,56,0,0,0,88,0,120,0,96,1,
+-32,0,-40,0,0,1,96,1,-48,0,16,0,104,0,24,0,40,0,104,0,
+96,0,104,0,-56,0,104,1,112,0,-40,1,83,84,82,67,61,0,0,0,
+10,0,3,0,4,0,0,0,4,0,1,0,9,0,2,0,11,0,3,0,
+10,0,3,0,10,0,4,0,10,0,5,0,12,0,2,0,9,0,6,0,
+9,0,7,0,13,0,1,0,7,0,8,0,14,0,1,0,8,0,8,0,
+15,0,1,0,13,0,9,0,16,0,1,0,14,0,9,0,17,0,2,0,
+15,0,10,0,13,0,11,0,18,0,2,0,16,0,10,0,14,0,11,0,
+19,0,4,0,4,0,12,0,4,0,13,0,2,0,14,0,2,0,15,0,
+20,0,6,0,13,0,16,0,13,0,17,0,4,0,18,0,4,0,19,0,
+4,0,20,0,0,0,21,0,21,0,6,0,14,0,16,0,14,0,17,0,
+4,0,18,0,4,0,19,0,4,0,20,0,0,0,21,0,22,0,3,0,
+2,0,14,0,2,0,15,0,4,0,22,0,23,0,12,0,13,0,23,0,
+13,0,24,0,13,0,25,0,4,0,26,0,4,0,27,0,4,0,28,0,
+4,0,29,0,20,0,30,0,22,0,31,0,19,0,32,0,4,0,33,0,
+4,0,34,0,24,0,12,0,14,0,23,0,14,0,24,0,14,0,25,0,
+4,0,26,0,4,0,27,0,4,0,28,0,4,0,29,0,21,0,30,0,
+22,0,31,0,4,0,33,0,4,0,34,0,19,0,32,0,25,0,3,0,
+0,0,35,0,4,0,36,0,0,0,37,0,26,0,5,0,25,0,38,0,
+13,0,39,0,13,0,40,0,7,0,41,0,0,0,21,0,27,0,5,0,
+25,0,38,0,13,0,39,0,13,0,42,0,7,0,43,0,4,0,44,0,
+28,0,2,0,13,0,45,0,7,0,46,0,29,0,4,0,27,0,47,0,
+28,0,48,0,4,0,49,0,0,0,37,0,30,0,1,0,4,0,50,0,
+31,0,2,0,2,0,50,0,0,0,51,0,32,0,2,0,2,0,52,0,
+0,0,51,0,33,0,2,0,0,0,52,0,0,0,53,0,34,0,8,0,
+13,0,54,0,14,0,55,0,30,0,56,0,32,0,57,0,33,0,58,0,
+31,0,59,0,4,0,60,0,4,0,61,0,35,0,4,0,34,0,62,0,
+13,0,63,0,4,0,64,0,0,0,37,0,36,0,7,0,25,0,38,0,
+35,0,65,0,23,0,66,0,24,0,67,0,37,0,68,0,7,0,43,0,
+0,0,69,0,38,0,2,0,36,0,70,0,13,0,39,0,39,0,4,0,
+17,0,71,0,25,0,72,0,4,0,73,0,7,0,74,0,40,0,4,0,
+25,0,38,0,39,0,75,0,4,0,76,0,7,0,43,0,41,0,3,0,
+27,0,47,0,4,0,77,0,0,0,37,0,42,0,3,0,27,0,47,0,
+4,0,77,0,0,0,37,0,43,0,4,0,4,0,78,0,7,0,79,0,
+7,0,80,0,7,0,81,0,37,0,14,0,4,0,82,0,4,0,83,0,
+43,0,84,0,4,0,85,0,7,0,86,0,7,0,87,0,7,0,88,0,
+7,0,89,0,7,0,90,0,4,0,91,0,4,0,92,0,4,0,93,0,
+4,0,94,0,0,0,37,0,44,0,5,0,25,0,38,0,35,0,65,0,
+13,0,39,0,7,0,43,0,4,0,95,0,45,0,5,0,27,0,47,0,
+13,0,96,0,14,0,97,0,4,0,98,0,0,0,99,0,46,0,24,0,
+9,0,100,0,9,0,101,0,25,0,102,0,0,0,35,0,18,0,103,0,
+18,0,104,0,14,0,105,0,14,0,106,0,14,0,107,0,8,0,108,0,
+8,0,109,0,8,0,110,0,8,0,111,0,8,0,112,0,8,0,113,0,
+8,0,114,0,4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0,
+4,0,119,0,4,0,120,0,4,0,121,0,0,0,37,0,47,0,23,0,
+9,0,100,0,9,0,101,0,25,0,102,0,0,0,35,0,17,0,103,0,
+17,0,104,0,13,0,105,0,13,0,106,0,13,0,107,0,7,0,108,0,
+7,0,109,0,7,0,110,0,7,0,111,0,7,0,112,0,7,0,113,0,
+7,0,114,0,4,0,115,0,4,0,116,0,4,0,117,0,4,0,118,0,
+4,0,119,0,4,0,120,0,4,0,121,0,48,0,21,0,47,0,122,0,
+15,0,123,0,13,0,124,0,13,0,125,0,13,0,126,0,13,0,127,0,
+13,0,-128,0,13,0,-127,0,13,0,-126,0,13,0,-125,0,13,0,-124,0,
+7,0,-123,0,7,0,-122,0,7,0,-121,0,7,0,-120,0,7,0,-119,0,
+7,0,-118,0,7,0,-117,0,7,0,-116,0,7,0,-115,0,4,0,-114,0,
+49,0,22,0,46,0,122,0,16,0,123,0,14,0,124,0,14,0,125,0,
+14,0,126,0,14,0,127,0,14,0,-128,0,14,0,-127,0,14,0,-126,0,
+14,0,-125,0,14,0,-124,0,8,0,-123,0,8,0,-122,0,8,0,-121,0,
+8,0,-120,0,8,0,-119,0,8,0,-118,0,8,0,-117,0,8,0,-116,0,
+8,0,-115,0,4,0,-114,0,0,0,37,0,50,0,2,0,4,0,-113,0,
+4,0,-112,0,51,0,11,0,52,0,-111,0,52,0,-110,0,0,0,35,0,
+4,0,-109,0,4,0,-108,0,4,0,-107,0,4,0,-106,0,7,0,-105,0,
+7,0,-104,0,4,0,-103,0,0,0,-102,0,53,0,3,0,51,0,-101,0,
+13,0,-100,0,13,0,-99,0,54,0,3,0,51,0,-101,0,14,0,-100,0,
+14,0,-99,0,55,0,13,0,51,0,-101,0,18,0,-98,0,18,0,-97,0,
+4,0,-96,0,4,0,-95,0,4,0,-94,0,7,0,-93,0,7,0,-92,0,
+7,0,-91,0,7,0,-90,0,7,0,-89,0,7,0,-88,0,7,0,-87,0,
+56,0,13,0,51,0,-101,0,17,0,-98,0,17,0,-97,0,4,0,-96,0,
+4,0,-95,0,4,0,-94,0,7,0,-93,0,7,0,-92,0,7,0,-91,0,
+7,0,-90,0,7,0,-89,0,7,0,-88,0,7,0,-87,0,57,0,11,0,
+51,0,-101,0,17,0,-98,0,17,0,-97,0,7,0,-86,0,7,0,-85,0,
+7,0,-84,0,7,0,-89,0,7,0,-88,0,7,0,-87,0,7,0,-83,0,
+0,0,21,0,58,0,9,0,51,0,-101,0,17,0,-98,0,17,0,-97,0,
+13,0,-82,0,13,0,-81,0,13,0,-80,0,13,0,-79,0,4,0,-78,0,
+4,0,-77,0,59,0,5,0,58,0,-76,0,4,0,-75,0,7,0,-74,0,
+7,0,-73,0,7,0,-72,0,60,0,9,0,51,0,-101,0,17,0,-98,0,
+17,0,-97,0,7,0,-82,0,7,0,-81,0,7,0,-80,0,7,0,-79,0,
+4,0,-78,0,4,0,-77,0,61,0,4,0,7,0,-71,0,7,0,-70,0,
+7,0,-69,0,4,0,78,0,62,0,10,0,61,0,-68,0,13,0,-67,0,
+13,0,-66,0,13,0,-65,0,13,0,-64,0,13,0,-63,0,7,0,-123,0,
+7,0,-62,0,4,0,-61,0,4,0,53,0,63,0,4,0,61,0,-68,0,
+4,0,-60,0,7,0,-59,0,4,0,-58,0,64,0,4,0,13,0,-63,0,
+61,0,-68,0,4,0,-57,0,7,0,-56,0,65,0,7,0,13,0,-55,0,
+61,0,-68,0,4,0,-54,0,7,0,-53,0,7,0,-52,0,7,0,-51,0,
+4,0,53,0,66,0,6,0,15,0,-50,0,13,0,-52,0,13,0,-49,0,
+52,0,-48,0,4,0,-47,0,7,0,-51,0,67,0,26,0,4,0,-46,0,
+7,0,-45,0,7,0,-83,0,7,0,-44,0,7,0,-43,0,7,0,-42,0,
+7,0,-41,0,7,0,-40,0,7,0,-39,0,7,0,-38,0,7,0,-37,0,
+7,0,-36,0,7,0,-35,0,7,0,-34,0,7,0,-33,0,7,0,-32,0,
+7,0,-31,0,7,0,-30,0,7,0,-29,0,7,0,-28,0,7,0,-27,0,
+4,0,-26,0,4,0,-25,0,4,0,-24,0,4,0,-23,0,4,0,116,0,
+68,0,12,0,15,0,-22,0,15,0,-21,0,15,0,-20,0,13,0,-19,0,
+13,0,-18,0,7,0,-17,0,4,0,-16,0,4,0,-15,0,4,0,-14,0,
+4,0,-13,0,7,0,-53,0,4,0,53,0,69,0,27,0,17,0,-12,0,
+15,0,-11,0,15,0,-10,0,13,0,-19,0,13,0,-9,0,13,0,-8,0,
+13,0,-7,0,13,0,-6,0,13,0,-5,0,4,0,-4,0,7,0,-3,0,
+4,0,-2,0,4,0,-1,0,4,0,0,1,7,0,1,1,7,0,2,1,
+4,0,3,1,4,0,4,1,7,0,5,1,7,0,6,1,7,0,7,1,
+7,0,8,1,7,0,9,1,7,0,10,1,4,0,11,1,4,0,12,1,
+4,0,13,1,70,0,12,0,9,0,14,1,9,0,15,1,13,0,16,1,
+7,0,17,1,7,0,18,1,7,0,19,1,4,0,20,1,13,0,21,1,
+4,0,22,1,4,0,23,1,4,0,24,1,4,0,53,0,71,0,19,0,
+47,0,122,0,68,0,25,1,61,0,26,1,62,0,27,1,63,0,28,1,
+64,0,29,1,65,0,30,1,66,0,31,1,69,0,32,1,70,0,33,1,
+4,0,34,1,4,0,-1,0,4,0,35,1,4,0,36,1,4,0,37,1,
+4,0,38,1,4,0,39,1,4,0,40,1,67,0,41,1,};
+int sBulletDNAlen64= sizeof(sBulletDNAstr64);
diff --git a/extern/bullet2/src/LinearMath/btSerializer.h b/extern/bullet2/src/LinearMath/btSerializer.h
new file mode 100644
index 00000000000..8a89374c612
--- /dev/null
+++ b/extern/bullet2/src/LinearMath/btSerializer.h
@@ -0,0 +1,655 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.org
+
+This software is provided 'as-is', without any express or implied warranty.
+In no event will the authors be held liable for any damages arising from the use of this software.
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it freely,
+subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef BT_SERIALIZER_H
+#define BT_SERIALIZER_H
+
+#include "btScalar.h" // has definitions like SIMD_FORCE_INLINE
+#include "btStackAlloc.h"
+#include "btHashMap.h"
+
+#if !defined( __CELLOS_LV2__) && !defined(__MWERKS__)
+#include <memory.h>
+#endif
+#include <string.h>
+
+
+
+///only the 32bit versions for now
+extern unsigned char sBulletDNAstr[];
+extern int sBulletDNAlen;
+extern unsigned char sBulletDNAstr64[];
+extern int sBulletDNAlen64;
+
+SIMD_FORCE_INLINE int btStrLen(const char* str)
+{
+ if (!str)
+ return(0);
+ int len = 0;
+
+ while (*str != 0)
+ {
+ str++;
+ len++;
+ }
+
+ return len;
+}
+
+
+class btChunk
+{
+public:
+ int m_chunkCode;
+ int m_length;
+ void *m_oldPtr;
+ int m_dna_nr;
+ int m_number;
+};
+
+enum btSerializationFlags
+{
+ BT_SERIALIZE_NO_BVH = 1,
+ BT_SERIALIZE_NO_TRIANGLEINFOMAP = 2,
+ BT_SERIALIZE_NO_DUPLICATE_ASSERT = 4
+};
+
+class btSerializer
+{
+
+public:
+
+ virtual ~btSerializer() {}
+
+ virtual const unsigned char* getBufferPointer() const = 0;
+
+ virtual int getCurrentBufferSize() const = 0;
+
+ virtual btChunk* allocate(size_t size, int numElements) = 0;
+
+ virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode,void* oldPtr)= 0;
+
+ virtual void* findPointer(void* oldPtr) = 0;
+
+ virtual void* getUniquePointer(void*oldPtr) = 0;
+
+ virtual void startSerialization() = 0;
+
+ virtual void finishSerialization() = 0;
+
+ virtual const char* findNameForPointer(const void* ptr) const = 0;
+
+ virtual void registerNameForPointer(const void* ptr, const char* name) = 0;
+
+ virtual void serializeName(const char* ptr) = 0;
+
+ virtual int getSerializationFlags() const = 0;
+
+ virtual void setSerializationFlags(int flags) = 0;
+
+
+};
+
+
+
+#define BT_HEADER_LENGTH 12
+#if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__BIG_ENDIAN__)
+# define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) )
+#else
+# define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) )
+#endif
+
+#define BT_SOFTBODY_CODE MAKE_ID('S','B','D','Y')
+#define BT_COLLISIONOBJECT_CODE MAKE_ID('C','O','B','J')
+#define BT_RIGIDBODY_CODE MAKE_ID('R','B','D','Y')
+#define BT_CONSTRAINT_CODE MAKE_ID('C','O','N','S')
+#define BT_BOXSHAPE_CODE MAKE_ID('B','O','X','S')
+#define BT_QUANTIZED_BVH_CODE MAKE_ID('Q','B','V','H')
+#define BT_TRIANLGE_INFO_MAP MAKE_ID('T','M','A','P')
+#define BT_SHAPE_CODE MAKE_ID('S','H','A','P')
+#define BT_ARRAY_CODE MAKE_ID('A','R','A','Y')
+#define BT_SBMATERIAL_CODE MAKE_ID('S','B','M','T')
+#define BT_SBNODE_CODE MAKE_ID('S','B','N','D')
+#define BT_DNA_CODE MAKE_ID('D','N','A','1')
+
+
+struct btPointerUid
+{
+ union
+ {
+ void* m_ptr;
+ int m_uniqueIds[2];
+ };
+};
+
+///The btDefaultSerializer is the main Bullet serialization class.
+///The constructor takes an optional argument for backwards compatibility, it is recommended to leave this empty/zero.
+class btDefaultSerializer : public btSerializer
+{
+
+
+ btAlignedObjectArray<char*> mTypes;
+ btAlignedObjectArray<short*> mStructs;
+ btAlignedObjectArray<short> mTlens;
+ btHashMap<btHashInt, int> mStructReverse;
+ btHashMap<btHashString,int> mTypeLookup;
+
+
+ btHashMap<btHashPtr,void*> m_chunkP;
+
+ btHashMap<btHashPtr,const char*> m_nameMap;
+
+ btHashMap<btHashPtr,btPointerUid> m_uniquePointers;
+ int m_uniqueIdGenerator;
+
+ int m_totalSize;
+ unsigned char* m_buffer;
+ int m_currentSize;
+ void* m_dna;
+ int m_dnaLength;
+
+ int m_serializationFlags;
+
+
+ btAlignedObjectArray<btChunk*> m_chunkPtrs;
+
+protected:
+
+ virtual void* findPointer(void* oldPtr)
+ {
+ void** ptr = m_chunkP.find(oldPtr);
+ if (ptr && *ptr)
+ return *ptr;
+ return 0;
+ }
+
+
+
+
+
+ void writeDNA()
+ {
+ btChunk* dnaChunk = allocate(m_dnaLength,1);
+ memcpy(dnaChunk->m_oldPtr,m_dna,m_dnaLength);
+ finalizeChunk(dnaChunk,"DNA1",BT_DNA_CODE, m_dna);
+ }
+
+ int getReverseType(const char *type) const
+ {
+
+ btHashString key(type);
+ const int* valuePtr = mTypeLookup.find(key);
+ if (valuePtr)
+ return *valuePtr;
+
+ return -1;
+ }
+
+ void initDNA(const char* bdnaOrg,int dnalen)
+ {
+ ///was already initialized
+ if (m_dna)
+ return;
+
+ int littleEndian= 1;
+ littleEndian= ((char*)&littleEndian)[0];
+
+
+ m_dna = btAlignedAlloc(dnalen,16);
+ memcpy(m_dna,bdnaOrg,dnalen);
+ m_dnaLength = dnalen;
+
+ int *intPtr=0;
+ short *shtPtr=0;
+ char *cp = 0;int dataLen =0;long nr=0;
+ intPtr = (int*)m_dna;
+
+ /*
+ SDNA (4 bytes) (magic number)
+ NAME (4 bytes)
+ <nr> (4 bytes) amount of names (int)
+ <string>
+ <string>
+ */
+
+ if (strncmp((const char*)m_dna, "SDNA", 4)==0)
+ {
+ // skip ++ NAME
+ intPtr++; intPtr++;
+ }
+
+ // Parse names
+ if (!littleEndian)
+ *intPtr = btSwapEndian(*intPtr);
+
+ dataLen = *intPtr;
+
+ intPtr++;
+
+ cp = (char*)intPtr;
+ int i;
+ for ( i=0; i<dataLen; i++)
+ {
+
+ while (*cp)cp++;
+ cp++;
+ }
+ {
+ nr= (long)cp;
+ // long mask=3;
+ nr= ((nr+3)&~3)-nr;
+ while (nr--)
+ {
+ cp++;
+ }
+ }
+
+ /*
+ TYPE (4 bytes)
+ <nr> amount of types (int)
+ <string>
+ <string>
+ */
+
+ intPtr = (int*)cp;
+ assert(strncmp(cp, "TYPE", 4)==0); intPtr++;
+
+ if (!littleEndian)
+ *intPtr = btSwapEndian(*intPtr);
+
+ dataLen = *intPtr;
+ intPtr++;
+
+
+ cp = (char*)intPtr;
+ for (i=0; i<dataLen; i++)
+ {
+ mTypes.push_back(cp);
+ while (*cp)cp++;
+ cp++;
+ }
+
+ {
+ nr= (long)cp;
+ // long mask=3;
+ nr= ((nr+3)&~3)-nr;
+ while (nr--)
+ {
+ cp++;
+ }
+ }
+
+
+ /*
+ TLEN (4 bytes)
+ <len> (short) the lengths of types
+ <len>
+ */
+
+ // Parse type lens
+ intPtr = (int*)cp;
+ assert(strncmp(cp, "TLEN", 4)==0); intPtr++;
+
+ dataLen = (int)mTypes.size();
+
+ shtPtr = (short*)intPtr;
+ for (i=0; i<dataLen; i++, shtPtr++)
+ {
+ if (!littleEndian)
+ shtPtr[0] = btSwapEndian(shtPtr[0]);
+ mTlens.push_back(shtPtr[0]);
+ }
+
+ if (dataLen & 1) shtPtr++;
+
+ /*
+ STRC (4 bytes)
+ <nr> amount of structs (int)
+ <typenr>
+ <nr_of_elems>
+ <typenr>
+ <namenr>
+ <typenr>
+ <namenr>
+ */
+
+ intPtr = (int*)shtPtr;
+ cp = (char*)intPtr;
+ assert(strncmp(cp, "STRC", 4)==0); intPtr++;
+
+ if (!littleEndian)
+ *intPtr = btSwapEndian(*intPtr);
+ dataLen = *intPtr ;
+ intPtr++;
+
+
+ shtPtr = (short*)intPtr;
+ for (i=0; i<dataLen; i++)
+ {
+ mStructs.push_back (shtPtr);
+
+ if (!littleEndian)
+ {
+ shtPtr[0]= btSwapEndian(shtPtr[0]);
+ shtPtr[1]= btSwapEndian(shtPtr[1]);
+
+ int len = shtPtr[1];
+ shtPtr+= 2;
+
+ for (int a=0; a<len; a++, shtPtr+=2)
+ {
+ shtPtr[0]= btSwapEndian(shtPtr[0]);
+ shtPtr[1]= btSwapEndian(shtPtr[1]);
+ }
+
+ } else
+ {
+ shtPtr+= (2*shtPtr[1])+2;
+ }
+ }
+
+ // build reverse lookups
+ for (i=0; i<(int)mStructs.size(); i++)
+ {
+ short *strc = mStructs.at(i);
+ mStructReverse.insert(strc[0], i);
+ mTypeLookup.insert(btHashString(mTypes[strc[0]]),i);
+ }
+ }
+
+public:
+
+
+
+
+ btDefaultSerializer(int totalSize=0)
+ :m_totalSize(totalSize),
+ m_currentSize(0),
+ m_dna(0),
+ m_dnaLength(0),
+ m_serializationFlags(0)
+ {
+ m_buffer = m_totalSize?(unsigned char*)btAlignedAlloc(totalSize,16):0;
+
+ const bool VOID_IS_8 = ((sizeof(void*)==8));
+
+#ifdef BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+ if (VOID_IS_8)
+ {
+#if _WIN64
+ initDNA((const char*)sBulletDNAstr64,sBulletDNAlen64);
+#else
+ btAssert(0);
+#endif
+ } else
+ {
+#ifndef _WIN64
+ initDNA((const char*)sBulletDNAstr,sBulletDNAlen);
+#else
+ btAssert(0);
+#endif
+ }
+
+#else //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+ if (VOID_IS_8)
+ {
+ initDNA((const char*)sBulletDNAstr64,sBulletDNAlen64);
+ } else
+ {
+ initDNA((const char*)sBulletDNAstr,sBulletDNAlen);
+ }
+#endif //BT_INTERNAL_UPDATE_SERIALIZATION_STRUCTURES
+
+ }
+
+ virtual ~btDefaultSerializer()
+ {
+ if (m_buffer)
+ btAlignedFree(m_buffer);
+ if (m_dna)
+ btAlignedFree(m_dna);
+ }
+
+ void writeHeader(unsigned char* buffer) const
+ {
+
+
+#ifdef BT_USE_DOUBLE_PRECISION
+ memcpy(buffer, "BULLETd", 7);
+#else
+ memcpy(buffer, "BULLETf", 7);
+#endif //BT_USE_DOUBLE_PRECISION
+
+ int littleEndian= 1;
+ littleEndian= ((char*)&littleEndian)[0];
+
+ if (sizeof(void*)==8)
+ {
+ buffer[7] = '-';
+ } else
+ {
+ buffer[7] = '_';
+ }
+
+ if (littleEndian)
+ {
+ buffer[8]='v';
+ } else
+ {
+ buffer[8]='V';
+ }
+
+
+ buffer[9] = '2';
+ buffer[10] = '7';
+ buffer[11] = '8';
+
+ }
+
+ virtual void startSerialization()
+ {
+ m_uniqueIdGenerator= 1;
+ if (m_totalSize)
+ {
+ unsigned char* buffer = internalAlloc(BT_HEADER_LENGTH);
+ writeHeader(buffer);
+ }
+
+ }
+
+ virtual void finishSerialization()
+ {
+ writeDNA();
+
+ //if we didn't pre-allocate a buffer, we need to create a contiguous buffer now
+ int mysize = 0;
+ if (!m_totalSize)
+ {
+ if (m_buffer)
+ btAlignedFree(m_buffer);
+
+ m_currentSize += BT_HEADER_LENGTH;
+ m_buffer = (unsigned char*)btAlignedAlloc(m_currentSize,16);
+
+ unsigned char* currentPtr = m_buffer;
+ writeHeader(m_buffer);
+ currentPtr += BT_HEADER_LENGTH;
+ mysize+=BT_HEADER_LENGTH;
+ for (int i=0;i< m_chunkPtrs.size();i++)
+ {
+ int curLength = sizeof(btChunk)+m_chunkPtrs[i]->m_length;
+ memcpy(currentPtr,m_chunkPtrs[i], curLength);
+ btAlignedFree(m_chunkPtrs[i]);
+ currentPtr+=curLength;
+ mysize+=curLength;
+ }
+ }
+
+ mTypes.clear();
+ mStructs.clear();
+ mTlens.clear();
+ mStructReverse.clear();
+ mTypeLookup.clear();
+ m_chunkP.clear();
+ m_nameMap.clear();
+ m_uniquePointers.clear();
+ m_chunkPtrs.clear();
+ }
+
+ virtual void* getUniquePointer(void*oldPtr)
+ {
+ if (!oldPtr)
+ return 0;
+
+ btPointerUid* uptr = (btPointerUid*)m_uniquePointers.find(oldPtr);
+ if (uptr)
+ {
+ return uptr->m_ptr;
+ }
+ m_uniqueIdGenerator++;
+
+ btPointerUid uid;
+ uid.m_uniqueIds[0] = m_uniqueIdGenerator;
+ uid.m_uniqueIds[1] = m_uniqueIdGenerator;
+ m_uniquePointers.insert(oldPtr,uid);
+ return uid.m_ptr;
+
+ }
+
+ virtual const unsigned char* getBufferPointer() const
+ {
+ return m_buffer;
+ }
+
+ virtual int getCurrentBufferSize() const
+ {
+ return m_currentSize;
+ }
+
+ virtual void finalizeChunk(btChunk* chunk, const char* structType, int chunkCode,void* oldPtr)
+ {
+ if (!(m_serializationFlags&BT_SERIALIZE_NO_DUPLICATE_ASSERT))
+ {
+ btAssert(!findPointer(oldPtr));
+ }
+
+ chunk->m_dna_nr = getReverseType(structType);
+
+ chunk->m_chunkCode = chunkCode;
+
+ void* uniquePtr = getUniquePointer(oldPtr);
+
+ m_chunkP.insert(oldPtr,uniquePtr);//chunk->m_oldPtr);
+ chunk->m_oldPtr = uniquePtr;//oldPtr;
+
+ }
+
+
+ virtual unsigned char* internalAlloc(size_t size)
+ {
+ unsigned char* ptr = 0;
+
+ if (m_totalSize)
+ {
+ ptr = m_buffer+m_currentSize;
+ m_currentSize += int(size);
+ btAssert(m_currentSize<m_totalSize);
+ } else
+ {
+ ptr = (unsigned char*)btAlignedAlloc(size,16);
+ m_currentSize += int(size);
+ }
+ return ptr;
+ }
+
+
+
+ virtual btChunk* allocate(size_t size, int numElements)
+ {
+
+ unsigned char* ptr = internalAlloc(int(size)*numElements+sizeof(btChunk));
+
+ unsigned char* data = ptr + sizeof(btChunk);
+
+ btChunk* chunk = (btChunk*)ptr;
+ chunk->m_chunkCode = 0;
+ chunk->m_oldPtr = data;
+ chunk->m_length = int(size)*numElements;
+ chunk->m_number = numElements;
+
+ m_chunkPtrs.push_back(chunk);
+
+
+ return chunk;
+ }
+
+ virtual const char* findNameForPointer(const void* ptr) const
+ {
+ const char*const * namePtr = m_nameMap.find(ptr);
+ if (namePtr && *namePtr)
+ return *namePtr;
+ return 0;
+
+ }
+
+ virtual void registerNameForPointer(const void* ptr, const char* name)
+ {
+ m_nameMap.insert(ptr,name);
+ }
+
+ virtual void serializeName(const char* name)
+ {
+ if (name)
+ {
+ //don't serialize name twice
+ if (findPointer((void*)name))
+ return;
+
+ int len = btStrLen(name);
+ if (len)
+ {
+
+ int newLen = len+1;
+ int padding = ((newLen+3)&~3)-newLen;
+ newLen += padding;
+
+ //serialize name string now
+ btChunk* chunk = allocate(sizeof(char),newLen);
+ char* destinationName = (char*)chunk->m_oldPtr;
+ for (int i=0;i<len;i++)
+ {
+ destinationName[i] = name[i];
+ }
+ destinationName[len] = 0;
+ finalizeChunk(chunk,"char",BT_ARRAY_CODE,(void*)name);
+ }
+ }
+ }
+
+ virtual int getSerializationFlags() const
+ {
+ return m_serializationFlags;
+ }
+
+ virtual void setSerializationFlags(int flags)
+ {
+ m_serializationFlags = flags;
+ }
+
+};
+
+
+#endif //BT_SERIALIZER_H
+
diff --git a/extern/bullet2/src/LinearMath/btTransform.h b/extern/bullet2/src/LinearMath/btTransform.h
index c4fe33eecd7..187b09116cc 100644
--- a/extern/bullet2/src/LinearMath/btTransform.h
+++ b/extern/bullet2/src/LinearMath/btTransform.h
@@ -17,14 +17,26 @@ subject to the following restrictions:
#ifndef btTransform_H
#define btTransform_H
-#include "btVector3.h"
+
#include "btMatrix3x3.h"
+#ifdef BT_USE_DOUBLE_PRECISION
+#define btTransformData btTransformDoubleData
+#else
+#define btTransformData btTransformFloatData
+#endif
+
+
+
/**@brief The btTransform class supports rigid transforms with only translation and rotation and no scaling/shear.
*It can be used in combination with btVector3, btQuaternion and btMatrix3x3 linear algebra classes. */
class btTransform {
+ ///Storage for the rotation
+ btMatrix3x3 m_basis;
+ ///Storage for the translation
+ btVector3 m_origin;
public:
@@ -195,12 +207,17 @@ public:
static const btTransform identityTransform(btMatrix3x3::getIdentity());
return identityTransform;
}
-
-private:
- ///Storage for the rotation
- btMatrix3x3 m_basis;
- ///Storage for the translation
- btVector3 m_origin;
+
+ void serialize(struct btTransformData& dataOut) const;
+
+ void serializeFloat(struct btTransformFloatData& dataOut) const;
+
+ void deSerialize(const struct btTransformData& dataIn);
+
+ void deSerializeDouble(const struct btTransformDoubleData& dataIn);
+
+ void deSerializeFloat(const struct btTransformFloatData& dataIn);
+
};
@@ -234,6 +251,53 @@ SIMD_FORCE_INLINE bool operator==(const btTransform& t1, const btTransform& t2)
}
+///for serialization
+struct btTransformFloatData
+{
+ btMatrix3x3FloatData m_basis;
+ btVector3FloatData m_origin;
+};
+
+struct btTransformDoubleData
+{
+ btMatrix3x3DoubleData m_basis;
+ btVector3DoubleData m_origin;
+};
+
+
+
+SIMD_FORCE_INLINE void btTransform::serialize(btTransformData& dataOut) const
+{
+ m_basis.serialize(dataOut.m_basis);
+ m_origin.serialize(dataOut.m_origin);
+}
+
+SIMD_FORCE_INLINE void btTransform::serializeFloat(btTransformFloatData& dataOut) const
+{
+ m_basis.serializeFloat(dataOut.m_basis);
+ m_origin.serializeFloat(dataOut.m_origin);
+}
+
+
+SIMD_FORCE_INLINE void btTransform::deSerialize(const btTransformData& dataIn)
+{
+ m_basis.deSerialize(dataIn.m_basis);
+ m_origin.deSerialize(dataIn.m_origin);
+}
+
+SIMD_FORCE_INLINE void btTransform::deSerializeFloat(const btTransformFloatData& dataIn)
+{
+ m_basis.deSerializeFloat(dataIn.m_basis);
+ m_origin.deSerializeFloat(dataIn.m_origin);
+}
+
+SIMD_FORCE_INLINE void btTransform::deSerializeDouble(const btTransformDoubleData& dataIn)
+{
+ m_basis.deSerializeDouble(dataIn.m_basis);
+ m_origin.deSerializeDouble(dataIn.m_origin);
+}
+
+
#endif
diff --git a/extern/bullet2/src/LinearMath/btTransformUtil.h b/extern/bullet2/src/LinearMath/btTransformUtil.h
index e8328da4ca6..626110ce4ee 100644
--- a/extern/bullet2/src/LinearMath/btTransformUtil.h
+++ b/extern/bullet2/src/LinearMath/btTransformUtil.h
@@ -21,9 +21,6 @@ subject to the following restrictions:
-#define SIMDSQRT12 btScalar(0.7071067811865475244008443621048490)
-
-#define btRecipSqrt(x) ((btScalar)(btScalar(1.0)/btSqrt(btScalar(x)))) /* reciprocal square root */
SIMD_FORCE_INLINE btVector3 btAabbSupport(const btVector3& halfExtents,const btVector3& supportDir)
{
@@ -33,25 +30,7 @@ SIMD_FORCE_INLINE btVector3 btAabbSupport(const btVector3& halfExtents,const btV
}
-SIMD_FORCE_INLINE void btPlaneSpace1 (const btVector3& n, btVector3& p, btVector3& q)
-{
- if (btFabs(n.z()) > SIMDSQRT12) {
- // choose p in y-z plane
- btScalar a = n[1]*n[1] + n[2]*n[2];
- btScalar k = btRecipSqrt (a);
- p.setValue(0,-n[2]*k,n[1]*k);
- // set q = n x p
- q.setValue(a*k,-n[0]*p[2],n[0]*p[1]);
- }
- else {
- // choose p in x-y plane
- btScalar a = n.x()*n.x() + n.y()*n.y();
- btScalar k = btRecipSqrt (a);
- p.setValue(-n.y()*k,n.x()*k,0);
- // set q = n x p
- q.setValue(-n.z()*p.y(),n.z()*p.x(),a*k);
- }
-}
+
@@ -117,10 +96,8 @@ public:
static void calculateDiffAxisAngleQuaternion(const btQuaternion& orn0,const btQuaternion& orn1a,btVector3& axis,btScalar& angle)
{
- btQuaternion orn1 = orn0.farthest(orn1a);
+ btQuaternion orn1 = orn0.nearest(orn1a);
btQuaternion dorn = orn1 * orn0.inverse();
- ///floating point inaccuracy can lead to w component > 1..., which breaks
- dorn.normalize();
angle = dorn.getAngle();
axis = btVector3(dorn.x(),dorn.y(),dorn.z());
axis[3] = btScalar(0.);
@@ -209,7 +186,7 @@ public:
btTransformUtil::calculateVelocityQuaternion(m_posB,toPosB,m_ornB,toOrnB,btScalar(1.),linVelB,angVelB);
btScalar maxAngularProjectedVelocity = angVelA.length() * m_boundingRadiusA + angVelB.length() * m_boundingRadiusB;
btVector3 relLinVel = (linVelB-linVelA);
- btScalar relLinVelocLength = (linVelB-linVelA).dot(m_separatingNormal);
+ btScalar relLinVelocLength = relLinVel.dot(m_separatingNormal);
if (relLinVelocLength<0.f)
{
relLinVelocLength = 0.f;
@@ -227,17 +204,21 @@ public:
void initSeparatingDistance(const btVector3& separatingVector,btScalar separatingDistance,const btTransform& transA,const btTransform& transB)
{
- m_separatingNormal = separatingVector;
m_separatingDistance = separatingDistance;
-
- const btVector3& toPosA = transA.getOrigin();
- const btVector3& toPosB = transB.getOrigin();
- btQuaternion toOrnA = transA.getRotation();
- btQuaternion toOrnB = transB.getRotation();
- m_posA = toPosA;
- m_posB = toPosB;
- m_ornA = toOrnA;
- m_ornB = toOrnB;
+
+ if (m_separatingDistance>0.f)
+ {
+ m_separatingNormal = separatingVector;
+
+ const btVector3& toPosA = transA.getOrigin();
+ const btVector3& toPosB = transB.getOrigin();
+ btQuaternion toOrnA = transA.getRotation();
+ btQuaternion toOrnB = transB.getRotation();
+ m_posA = toPosA;
+ m_posB = toPosB;
+ m_ornA = toOrnA;
+ m_ornB = toOrnB;
+ }
}
};
diff --git a/extern/bullet2/src/LinearMath/btVector3.h b/extern/bullet2/src/LinearMath/btVector3.h
index 5d5c39e8587..068e87c94ab 100644
--- a/extern/bullet2/src/LinearMath/btVector3.h
+++ b/extern/bullet2/src/LinearMath/btVector3.h
@@ -19,30 +19,37 @@ subject to the following restrictions:
#include "btScalar.h"
-#include "btScalar.h"
#include "btMinMax.h"
+
+#ifdef BT_USE_DOUBLE_PRECISION
+#define btVector3Data btVector3DoubleData
+#define btVector3DataName "btVector3DoubleData"
+#else
+#define btVector3Data btVector3FloatData
+#define btVector3DataName "btVector3FloatData"
+#endif //BT_USE_DOUBLE_PRECISION
+
+
+
+
/**@brief btVector3 can be used to represent 3D points and vectors.
* It has an un-used w component to suit 16-byte alignment when btVector3 is stored in containers. This extra component can be used by derived classes (Quaternion?) or by user
* Ideally, this class should be replaced by a platform optimized SIMD version that keeps the data in registers
*/
-
ATTRIBUTE_ALIGNED16(class) btVector3
{
public:
#if defined (__SPU__) && defined (__CELLOS_LV2__)
- union {
- vec_float4 mVec128;
btScalar m_floats[4];
- };
public:
- vec_float4 get128() const
+ SIMD_FORCE_INLINE const vec_float4& get128() const
{
- return mVec128;
+ return *((const vec_float4*)&m_floats[0]);
}
public:
#else //__CELLOS_LV2__ __SPU__
-#ifdef BT_USE_SSE // WIN32
+#ifdef BT_USE_SSE // _WIN32
union {
__m128 mVec128;
btScalar m_floats[4];
@@ -141,6 +148,19 @@ public:
* This is symantically treating the vector like a point */
SIMD_FORCE_INLINE btScalar distance(const btVector3& v) const;
+ SIMD_FORCE_INLINE btVector3& safeNormalize()
+ {
+ btVector3 absVec = this->absolute();
+ int maxIndex = absVec.maxAxis();
+ if (absVec[maxIndex]>0)
+ {
+ *this /= absVec[maxIndex];
+ return *this /= length();
+ }
+ setValue(1,0,0);
+ return *this;
+ }
+
/**@brief Normalize this vector
* x^2 + y^2 + z^2 = 1 */
SIMD_FORCE_INLINE btVector3& normalize()
@@ -151,10 +171,10 @@ public:
/**@brief Return a normalized version of this vector */
SIMD_FORCE_INLINE btVector3 normalized() const;
- /**@brief Rotate this vector
+ /**@brief Return a rotated version of this vector
* @param wAxis The axis to rotate about
* @param angle The angle to rotate by */
- SIMD_FORCE_INLINE btVector3 rotate( const btVector3& wAxis, const btScalar angle );
+ SIMD_FORCE_INLINE btVector3 rotate( const btVector3& wAxis, const btScalar angle ) const;
/**@brief Return the angle between this and another vector
* @param v The other vector */
@@ -306,7 +326,7 @@ public:
m_floats[0]=x;
m_floats[1]=y;
m_floats[2]=z;
- m_floats[3] = 0.f;
+ m_floats[3] = btScalar(0.);
}
void getSkewSymmetricMatrix(btVector3* v0,btVector3* v1,btVector3* v2) const
@@ -316,6 +336,33 @@ public:
v2->setValue(-y() ,x() ,0.);
}
+ void setZero()
+ {
+ setValue(btScalar(0.),btScalar(0.),btScalar(0.));
+ }
+
+ SIMD_FORCE_INLINE bool isZero() const
+ {
+ return m_floats[0] == btScalar(0) && m_floats[1] == btScalar(0) && m_floats[2] == btScalar(0);
+ }
+
+ SIMD_FORCE_INLINE bool fuzzyZero() const
+ {
+ return length2() < SIMD_EPSILON;
+ }
+
+ SIMD_FORCE_INLINE void serialize(struct btVector3Data& dataOut) const;
+
+ SIMD_FORCE_INLINE void deSerialize(const struct btVector3Data& dataIn);
+
+ SIMD_FORCE_INLINE void serializeFloat(struct btVector3FloatData& dataOut) const;
+
+ SIMD_FORCE_INLINE void deSerializeFloat(const struct btVector3FloatData& dataIn);
+
+ SIMD_FORCE_INLINE void serializeDouble(struct btVector3DoubleData& dataOut) const;
+
+ SIMD_FORCE_INLINE void deSerializeDouble(const struct btVector3DoubleData& dataIn);
+
};
/**@brief Return the sum of two vectors (Point symantics)*/
@@ -376,7 +423,7 @@ operator/(const btVector3& v1, const btVector3& v2)
/**@brief Return the dot product between two vectors */
SIMD_FORCE_INLINE btScalar
-dot(const btVector3& v1, const btVector3& v2)
+btDot(const btVector3& v1, const btVector3& v2)
{
return v1.dot(v2);
}
@@ -384,7 +431,7 @@ dot(const btVector3& v1, const btVector3& v2)
/**@brief Return the distance squared between two vectors */
SIMD_FORCE_INLINE btScalar
-distance2(const btVector3& v1, const btVector3& v2)
+btDistance2(const btVector3& v1, const btVector3& v2)
{
return v1.distance2(v2);
}
@@ -392,27 +439,27 @@ distance2(const btVector3& v1, const btVector3& v2)
/**@brief Return the distance between two vectors */
SIMD_FORCE_INLINE btScalar
-distance(const btVector3& v1, const btVector3& v2)
+btDistance(const btVector3& v1, const btVector3& v2)
{
return v1.distance(v2);
}
/**@brief Return the angle between two vectors */
SIMD_FORCE_INLINE btScalar
-angle(const btVector3& v1, const btVector3& v2)
+btAngle(const btVector3& v1, const btVector3& v2)
{
return v1.angle(v2);
}
/**@brief Return the cross product of two vectors */
SIMD_FORCE_INLINE btVector3
-cross(const btVector3& v1, const btVector3& v2)
+btCross(const btVector3& v1, const btVector3& v2)
{
return v1.cross(v2);
}
SIMD_FORCE_INLINE btScalar
-triple(const btVector3& v1, const btVector3& v2, const btVector3& v3)
+btTriple(const btVector3& v1, const btVector3& v2, const btVector3& v3)
{
return v1.triple(v2, v3);
}
@@ -444,7 +491,7 @@ SIMD_FORCE_INLINE btVector3 btVector3::normalized() const
return *this / length();
}
-SIMD_FORCE_INLINE btVector3 btVector3::rotate( const btVector3& wAxis, const btScalar angle )
+SIMD_FORCE_INLINE btVector3 btVector3::rotate( const btVector3& wAxis, const btScalar angle ) const
{
// wAxis must be a unit lenght vector
@@ -488,7 +535,7 @@ public:
SIMD_FORCE_INLINE int maxAxis4() const
{
int maxIndex = -1;
- btScalar maxVal = btScalar(-1e30);
+ btScalar maxVal = btScalar(-BT_LARGE_FLOAT);
if (m_floats[0] > maxVal)
{
maxIndex = 0;
@@ -521,7 +568,7 @@ public:
SIMD_FORCE_INLINE int minAxis4() const
{
int minIndex = -1;
- btScalar minVal = btScalar(1e30);
+ btScalar minVal = btScalar(BT_LARGE_FLOAT);
if (m_floats[0] < minVal)
{
minIndex = 0;
@@ -585,8 +632,6 @@ public:
}
-
-
};
@@ -635,4 +680,87 @@ SIMD_FORCE_INLINE void btUnSwapVector3Endian(btVector3& vector)
vector = swappedVec;
}
+template <class T>
+SIMD_FORCE_INLINE void btPlaneSpace1 (const T& n, T& p, T& q)
+{
+ if (btFabs(n[2]) > SIMDSQRT12) {
+ // choose p in y-z plane
+ btScalar a = n[1]*n[1] + n[2]*n[2];
+ btScalar k = btRecipSqrt (a);
+ p[0] = 0;
+ p[1] = -n[2]*k;
+ p[2] = n[1]*k;
+ // set q = n x p
+ q[0] = a*k;
+ q[1] = -n[0]*p[2];
+ q[2] = n[0]*p[1];
+ }
+ else {
+ // choose p in x-y plane
+ btScalar a = n[0]*n[0] + n[1]*n[1];
+ btScalar k = btRecipSqrt (a);
+ p[0] = -n[1]*k;
+ p[1] = n[0]*k;
+ p[2] = 0;
+ // set q = n x p
+ q[0] = -n[2]*p[1];
+ q[1] = n[2]*p[0];
+ q[2] = a*k;
+ }
+}
+
+
+struct btVector3FloatData
+{
+ float m_floats[4];
+};
+
+struct btVector3DoubleData
+{
+ double m_floats[4];
+
+};
+
+SIMD_FORCE_INLINE void btVector3::serializeFloat(struct btVector3FloatData& dataOut) const
+{
+ ///could also do a memcpy, check if it is worth it
+ for (int i=0;i<4;i++)
+ dataOut.m_floats[i] = float(m_floats[i]);
+}
+
+SIMD_FORCE_INLINE void btVector3::deSerializeFloat(const struct btVector3FloatData& dataIn)
+{
+ for (int i=0;i<4;i++)
+ m_floats[i] = btScalar(dataIn.m_floats[i]);
+}
+
+
+SIMD_FORCE_INLINE void btVector3::serializeDouble(struct btVector3DoubleData& dataOut) const
+{
+ ///could also do a memcpy, check if it is worth it
+ for (int i=0;i<4;i++)
+ dataOut.m_floats[i] = double(m_floats[i]);
+}
+
+SIMD_FORCE_INLINE void btVector3::deSerializeDouble(const struct btVector3DoubleData& dataIn)
+{
+ for (int i=0;i<4;i++)
+ m_floats[i] = btScalar(dataIn.m_floats[i]);
+}
+
+
+SIMD_FORCE_INLINE void btVector3::serialize(struct btVector3Data& dataOut) const
+{
+ ///could also do a memcpy, check if it is worth it
+ for (int i=0;i<4;i++)
+ dataOut.m_floats[i] = m_floats[i];
+}
+
+SIMD_FORCE_INLINE void btVector3::deSerialize(const struct btVector3Data& dataIn)
+{
+ for (int i=0;i<4;i++)
+ m_floats[i] = dataIn.m_floats[i];
+}
+
+
#endif //SIMD__VECTOR3_H
diff --git a/extern/bullet2/src/btBulletCollisionCommon.h b/extern/bullet2/src/btBulletCollisionCommon.h
index 4b14f6d00f3..472690c1573 100644
--- a/extern/bullet2/src/btBulletCollisionCommon.h
+++ b/extern/bullet2/src/btBulletCollisionCommon.h
@@ -33,6 +33,7 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btTriangleMesh.h"
#include "BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h"
#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h"
+#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h"
#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h"
#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h"
#include "BulletCollision/CollisionShapes/btCompoundShape.h"
@@ -61,6 +62,8 @@ subject to the following restrictions:
#include "LinearMath/btDefaultMotionState.h"
#include "LinearMath/btQuickprof.h"
#include "LinearMath/btIDebugDraw.h"
+#include "LinearMath/btSerializer.h"
+
#endif //BULLET_COLLISION_COMMON_H
diff --git a/extern/bullet2/src/btBulletDynamicsCommon.h b/extern/bullet2/src/btBulletDynamicsCommon.h
index b95972cd15d..db8b37989f5 100644
--- a/extern/bullet2/src/btBulletDynamicsCommon.h
+++ b/extern/bullet2/src/btBulletDynamicsCommon.h
@@ -30,6 +30,9 @@ subject to the following restrictions:
#include "BulletDynamics/ConstraintSolver/btConeTwistConstraint.h"
#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h"
#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h"
+#include "BulletDynamics/ConstraintSolver/btGeneric6DofSpringConstraint.h"
+#include "BulletDynamics/ConstraintSolver/btUniversalConstraint.h"
+#include "BulletDynamics/ConstraintSolver/btHinge2Constraint.h"
#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h"
diff --git a/extern/glew/include/GL/glew.h b/extern/glew/include/GL/glew.h
index bee6a071e5d..2d7b7478622 100644
--- a/extern/glew/include/GL/glew.h
+++ b/extern/glew/include/GL/glew.h
@@ -80,7 +80,7 @@
#define __glew_h__
#define __GLEW_H__
-#if defined(__gl_h_) || defined(__GL_H__)
+#if defined(__gl_h_) || defined(__GL_H__) || defined(__X_GL_H)
#error gl.h included before glew.h
#endif
#if defined(__glext_h_) || defined(__GLEXT_H_)
@@ -92,6 +92,7 @@
#define __gl_h_
#define __GL_H__
+#define __X_GL_H
#define __glext_h_
#define __GLEXT_H_
#define __gl_ATI_h_
@@ -106,7 +107,7 @@
/* <windef.h> */
#ifndef APIENTRY
#define GLEW_APIENTRY_DEFINED
-# if defined(__MINGW32__)
+# if defined(__MINGW32__) || defined(__CYGWIN__)
# define APIENTRY __stdcall
# elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__)
# define APIENTRY __stdcall
@@ -115,14 +116,14 @@
# endif
#endif
#ifndef GLAPI
-# if defined(__MINGW32__)
+# if defined(__MINGW32__) || defined(__CYGWIN__)
# define GLAPI extern
# endif
#endif
/* <winnt.h> */
#ifndef CALLBACK
#define GLEW_CALLBACK_DEFINED
-# if defined(__MINGW32__)
+# if defined(__MINGW32__) || defined(__CYGWIN__)
# define CALLBACK __attribute__ ((__stdcall__))
# elif (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS)
# define CALLBACK __stdcall
@@ -148,7 +149,7 @@ typedef unsigned short wchar_t;
# define _W64
# endif
#endif
-#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_)
+#if !defined(_PTRDIFF_T_DEFINED) && !defined(_PTRDIFF_T_) && !defined(__MINGW64__)
# ifdef _WIN64
typedef __int64 ptrdiff_t;
# else
@@ -159,7 +160,7 @@ typedef _W64 int ptrdiff_t;
#endif
#ifndef GLAPI
-# if defined(__MINGW32__)
+# if defined(__MINGW32__) || defined(__CYGWIN__)
# define GLAPI extern
# else
# define GLAPI WINGDIAPI
@@ -171,9 +172,10 @@ typedef _W64 int ptrdiff_t;
#endif
/*
- * GLEW_STATIC needs to be set when using the static version.
- * GLEW_BUILD is set when building the DLL version.
+ * GLEW_STATIC is defined for static library.
+ * GLEW_BUILD is defined for building the DLL library.
*/
+
#ifdef GLEW_STATIC
# define GLEWAPI extern
#else
@@ -196,11 +198,33 @@ typedef _W64 int ptrdiff_t;
*/
#include <stddef.h>
+
+/* SGI MIPSPro doesn't like stdint.h in C++ mode */
+
+#if defined(__sgi) && !defined(__GNUC__)
+#include <inttypes.h>
+#else
#include <stdint.h>
+#endif
#define GLEW_APIENTRY_DEFINED
#define APIENTRY
-#define GLEWAPI extern
+
+/*
+ * GLEW_STATIC is defined for static library.
+ */
+
+#ifdef GLEW_STATIC
+# define GLEWAPI extern
+#else
+# if defined(__GNUC__) && __GNUC__>=4
+# define GLEWAPI extern __attribute__ ((visibility("default")))
+# elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+# define GLEWAPI extern __global
+# else
+# define GLEWAPI extern
+# endif
+#endif
/* <glu.h> */
#ifndef GLAPI
@@ -237,28 +261,61 @@ typedef float GLclampf;
typedef double GLdouble;
typedef double GLclampd;
typedef void GLvoid;
-#if defined(_MSC_VER)
-# if _MSC_VER < 1400
+#if defined(_MSC_VER) && _MSC_VER < 1400
typedef __int64 GLint64EXT;
typedef unsigned __int64 GLuint64EXT;
-# else
+#elif defined(_MSC_VER) || defined(__BORLANDC__)
typedef signed long long GLint64EXT;
typedef unsigned long long GLuint64EXT;
-# endif
#else
-# if defined(__MINGW32__)
+# if defined(__MINGW32__) || defined(__CYGWIN__)
#include <inttypes.h>
# endif
typedef int64_t GLint64EXT;
typedef uint64_t GLuint64EXT;
#endif
+typedef GLint64EXT GLint64;
+typedef GLuint64EXT GLuint64;
+typedef struct __GLsync *GLsync;
+typedef char GLchar;
+
+#define GL_ZERO 0
+#define GL_FALSE 0
+#define GL_LOGIC_OP 0x0BF1
+#define GL_NONE 0
+#define GL_TEXTURE_COMPONENTS 0x1003
+#define GL_NO_ERROR 0
+#define GL_POINTS 0x0000
+#define GL_CURRENT_BIT 0x00000001
+#define GL_TRUE 1
+#define GL_ONE 1
+#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
+#define GL_LINES 0x0001
+#define GL_LINE_LOOP 0x0002
+#define GL_POINT_BIT 0x00000002
+#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
+#define GL_LINE_STRIP 0x0003
+#define GL_LINE_BIT 0x00000004
+#define GL_TRIANGLES 0x0004
+#define GL_TRIANGLE_STRIP 0x0005
+#define GL_TRIANGLE_FAN 0x0006
+#define GL_QUADS 0x0007
+#define GL_QUAD_STRIP 0x0008
+#define GL_POLYGON_BIT 0x00000008
+#define GL_POLYGON 0x0009
+#define GL_POLYGON_STIPPLE_BIT 0x00000010
+#define GL_PIXEL_MODE_BIT 0x00000020
+#define GL_LIGHTING_BIT 0x00000040
+#define GL_FOG_BIT 0x00000080
+#define GL_DEPTH_BUFFER_BIT 0x00000100
#define GL_ACCUM 0x0100
#define GL_LOAD 0x0101
#define GL_RETURN 0x0102
#define GL_MULT 0x0103
#define GL_ADD 0x0104
#define GL_NEVER 0x0200
+#define GL_ACCUM_BUFFER_BIT 0x00000200
#define GL_LESS 0x0201
#define GL_EQUAL 0x0202
#define GL_LEQUAL 0x0203
@@ -266,39 +323,6 @@ typedef uint64_t GLuint64EXT;
#define GL_NOTEQUAL 0x0205
#define GL_GEQUAL 0x0206
#define GL_ALWAYS 0x0207
-#define GL_CURRENT_BIT 0x00000001
-#define GL_POINT_BIT 0x00000002
-#define GL_LINE_BIT 0x00000004
-#define GL_POLYGON_BIT 0x00000008
-#define GL_POLYGON_STIPPLE_BIT 0x00000010
-#define GL_PIXEL_MODE_BIT 0x00000020
-#define GL_LIGHTING_BIT 0x00000040
-#define GL_FOG_BIT 0x00000080
-#define GL_DEPTH_BUFFER_BIT 0x00000100
-#define GL_ACCUM_BUFFER_BIT 0x00000200
-#define GL_STENCIL_BUFFER_BIT 0x00000400
-#define GL_VIEWPORT_BIT 0x00000800
-#define GL_TRANSFORM_BIT 0x00001000
-#define GL_ENABLE_BIT 0x00002000
-#define GL_COLOR_BUFFER_BIT 0x00004000
-#define GL_HINT_BIT 0x00008000
-#define GL_EVAL_BIT 0x00010000
-#define GL_LIST_BIT 0x00020000
-#define GL_TEXTURE_BIT 0x00040000
-#define GL_SCISSOR_BIT 0x00080000
-#define GL_ALL_ATTRIB_BITS 0x000fffff
-#define GL_POINTS 0x0000
-#define GL_LINES 0x0001
-#define GL_LINE_LOOP 0x0002
-#define GL_LINE_STRIP 0x0003
-#define GL_TRIANGLES 0x0004
-#define GL_TRIANGLE_STRIP 0x0005
-#define GL_TRIANGLE_FAN 0x0006
-#define GL_QUADS 0x0007
-#define GL_QUAD_STRIP 0x0008
-#define GL_POLYGON 0x0009
-#define GL_ZERO 0
-#define GL_ONE 1
#define GL_SRC_COLOR 0x0300
#define GL_ONE_MINUS_SRC_COLOR 0x0301
#define GL_SRC_ALPHA 0x0302
@@ -308,26 +332,7 @@ typedef uint64_t GLuint64EXT;
#define GL_DST_COLOR 0x0306
#define GL_ONE_MINUS_DST_COLOR 0x0307
#define GL_SRC_ALPHA_SATURATE 0x0308
-#define GL_TRUE 1
-#define GL_FALSE 0
-#define GL_CLIP_PLANE0 0x3000
-#define GL_CLIP_PLANE1 0x3001
-#define GL_CLIP_PLANE2 0x3002
-#define GL_CLIP_PLANE3 0x3003
-#define GL_CLIP_PLANE4 0x3004
-#define GL_CLIP_PLANE5 0x3005
-#define GL_BYTE 0x1400
-#define GL_UNSIGNED_BYTE 0x1401
-#define GL_SHORT 0x1402
-#define GL_UNSIGNED_SHORT 0x1403
-#define GL_INT 0x1404
-#define GL_UNSIGNED_INT 0x1405
-#define GL_FLOAT 0x1406
-#define GL_2_BYTES 0x1407
-#define GL_3_BYTES 0x1408
-#define GL_4_BYTES 0x1409
-#define GL_DOUBLE 0x140A
-#define GL_NONE 0
+#define GL_STENCIL_BUFFER_BIT 0x00000400
#define GL_FRONT_LEFT 0x0400
#define GL_FRONT_RIGHT 0x0401
#define GL_BACK_LEFT 0x0402
@@ -341,7 +346,6 @@ typedef uint64_t GLuint64EXT;
#define GL_AUX1 0x040A
#define GL_AUX2 0x040B
#define GL_AUX3 0x040C
-#define GL_NO_ERROR 0
#define GL_INVALID_ENUM 0x0500
#define GL_INVALID_VALUE 0x0501
#define GL_INVALID_OPERATION 0x0502
@@ -362,6 +366,7 @@ typedef uint64_t GLuint64EXT;
#define GL_COPY_PIXEL_TOKEN 0x0706
#define GL_LINE_RESET_TOKEN 0x0707
#define GL_EXP 0x0800
+#define GL_VIEWPORT_BIT 0x00000800
#define GL_EXP2 0x0801
#define GL_CW 0x0900
#define GL_CCW 0x0901
@@ -578,6 +583,7 @@ typedef uint64_t GLuint64EXT;
#define GL_SELECTION_BUFFER_POINTER 0x0DF3
#define GL_SELECTION_BUFFER_SIZE 0x0DF4
#define GL_TEXTURE_WIDTH 0x1000
+#define GL_TRANSFORM_BIT 0x00001000
#define GL_TEXTURE_HEIGHT 0x1001
#define GL_TEXTURE_INTERNAL_FORMAT 0x1003
#define GL_TEXTURE_BORDER_COLOR 0x1004
@@ -585,14 +591,6 @@ typedef uint64_t GLuint64EXT;
#define GL_DONT_CARE 0x1100
#define GL_FASTEST 0x1101
#define GL_NICEST 0x1102
-#define GL_LIGHT0 0x4000
-#define GL_LIGHT1 0x4001
-#define GL_LIGHT2 0x4002
-#define GL_LIGHT3 0x4003
-#define GL_LIGHT4 0x4004
-#define GL_LIGHT5 0x4005
-#define GL_LIGHT6 0x4006
-#define GL_LIGHT7 0x4007
#define GL_AMBIENT 0x1200
#define GL_DIFFUSE 0x1201
#define GL_SPECULAR 0x1202
@@ -605,6 +603,17 @@ typedef uint64_t GLuint64EXT;
#define GL_QUADRATIC_ATTENUATION 0x1209
#define GL_COMPILE 0x1300
#define GL_COMPILE_AND_EXECUTE 0x1301
+#define GL_BYTE 0x1400
+#define GL_UNSIGNED_BYTE 0x1401
+#define GL_SHORT 0x1402
+#define GL_UNSIGNED_SHORT 0x1403
+#define GL_INT 0x1404
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_2_BYTES 0x1407
+#define GL_3_BYTES 0x1408
+#define GL_4_BYTES 0x1409
+#define GL_DOUBLE 0x140A
#define GL_CLEAR 0x1500
#define GL_AND 0x1501
#define GL_AND_REVERSE 0x1502
@@ -660,6 +669,7 @@ typedef uint64_t GLuint64EXT;
#define GL_VERSION 0x1F02
#define GL_EXTENSIONS 0x1F03
#define GL_S 0x2000
+#define GL_ENABLE_BIT 0x00002000
#define GL_T 0x2001
#define GL_R 0x2002
#define GL_Q 0x2003
@@ -686,14 +696,42 @@ typedef uint64_t GLuint64EXT;
#define GL_TEXTURE_WRAP_T 0x2803
#define GL_CLAMP 0x2900
#define GL_REPEAT 0x2901
-#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001
-#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002
-#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff
-#define GL_POLYGON_OFFSET_FACTOR 0x8038
#define GL_POLYGON_OFFSET_UNITS 0x2A00
#define GL_POLYGON_OFFSET_POINT 0x2A01
#define GL_POLYGON_OFFSET_LINE 0x2A02
+#define GL_R3_G3_B2 0x2A10
+#define GL_V2F 0x2A20
+#define GL_V3F 0x2A21
+#define GL_C4UB_V2F 0x2A22
+#define GL_C4UB_V3F 0x2A23
+#define GL_C3F_V3F 0x2A24
+#define GL_N3F_V3F 0x2A25
+#define GL_C4F_N3F_V3F 0x2A26
+#define GL_T2F_V3F 0x2A27
+#define GL_T4F_V4F 0x2A28
+#define GL_T2F_C4UB_V3F 0x2A29
+#define GL_T2F_C3F_V3F 0x2A2A
+#define GL_T2F_N3F_V3F 0x2A2B
+#define GL_T2F_C4F_N3F_V3F 0x2A2C
+#define GL_T4F_C4F_N3F_V4F 0x2A2D
+#define GL_CLIP_PLANE0 0x3000
+#define GL_CLIP_PLANE1 0x3001
+#define GL_CLIP_PLANE2 0x3002
+#define GL_CLIP_PLANE3 0x3003
+#define GL_CLIP_PLANE4 0x3004
+#define GL_CLIP_PLANE5 0x3005
+#define GL_LIGHT0 0x4000
+#define GL_COLOR_BUFFER_BIT 0x00004000
+#define GL_LIGHT1 0x4001
+#define GL_LIGHT2 0x4002
+#define GL_LIGHT3 0x4003
+#define GL_LIGHT4 0x4004
+#define GL_LIGHT5 0x4005
+#define GL_LIGHT6 0x4006
+#define GL_LIGHT7 0x4007
+#define GL_HINT_BIT 0x00008000
#define GL_POLYGON_OFFSET_FILL 0x8037
+#define GL_POLYGON_OFFSET_FACTOR 0x8038
#define GL_ALPHA4 0x803B
#define GL_ALPHA8 0x803C
#define GL_ALPHA12 0x803D
@@ -713,7 +751,6 @@ typedef uint64_t GLuint64EXT;
#define GL_INTENSITY8 0x804B
#define GL_INTENSITY12 0x804C
#define GL_INTENSITY16 0x804D
-#define GL_R3_G3_B2 0x2A10
#define GL_RGB4 0x804F
#define GL_RGB5 0x8050
#define GL_RGB8 0x8051
@@ -765,28 +802,18 @@ typedef uint64_t GLuint64EXT;
#define GL_INDEX_ARRAY_POINTER 0x8091
#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092
#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093
-#define GL_V2F 0x2A20
-#define GL_V3F 0x2A21
-#define GL_C4UB_V2F 0x2A22
-#define GL_C4UB_V3F 0x2A23
-#define GL_C3F_V3F 0x2A24
-#define GL_N3F_V3F 0x2A25
-#define GL_C4F_N3F_V3F 0x2A26
-#define GL_T2F_V3F 0x2A27
-#define GL_T4F_V4F 0x2A28
-#define GL_T2F_C4UB_V3F 0x2A29
-#define GL_T2F_C3F_V3F 0x2A2A
-#define GL_T2F_N3F_V3F 0x2A2B
-#define GL_T2F_C4F_N3F_V3F 0x2A2C
-#define GL_T4F_C4F_N3F_V4F 0x2A2D
-#define GL_LOGIC_OP GL_INDEX_LOGIC_OP
-#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT
#define GL_COLOR_INDEX1_EXT 0x80E2
#define GL_COLOR_INDEX2_EXT 0x80E3
#define GL_COLOR_INDEX4_EXT 0x80E4
#define GL_COLOR_INDEX8_EXT 0x80E5
#define GL_COLOR_INDEX12_EXT 0x80E6
#define GL_COLOR_INDEX16_EXT 0x80E7
+#define GL_EVAL_BIT 0x00010000
+#define GL_LIST_BIT 0x00020000
+#define GL_TEXTURE_BIT 0x00040000
+#define GL_SCISSOR_BIT 0x00080000
+#define GL_ALL_ATTRIB_BITS 0x000fffff
+#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff
GLAPI void GLAPIENTRY glAccum (GLenum op, GLfloat value);
GLAPI void GLAPIENTRY glAlphaFunc (GLenum func, GLclampf ref);
@@ -1199,6 +1226,15 @@ typedef void (GLAPIENTRY * PFNGLTEXSUBIMAGE3DPROC) (GLenum target, GLint level,
#endif /* GL_VERSION_1_2 */
+/* ---------------------------- GL_VERSION_1_2_1 --------------------------- */
+
+#ifndef GL_VERSION_1_2_1
+#define GL_VERSION_1_2_1 1
+
+#define GLEW_VERSION_1_2_1 GLEW_GET_VAR(__GLEW_VERSION_1_2_1)
+
+#endif /* GL_VERSION_1_2_1 */
+
/* ----------------------------- GL_VERSION_1_3 ---------------------------- */
#ifndef GL_VERSION_1_3
@@ -1455,9 +1491,9 @@ typedef void (GLAPIENTRY * PFNGLFOGCOORDFVPROC) (const GLfloat *coord);
typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount);
typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount);
typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param);
-typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, GLfloat *params);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params);
typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param);
-typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, GLint *params);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params);
typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue);
typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v);
typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue);
@@ -1474,7 +1510,7 @@ typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green
typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v);
typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue);
typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v);
-typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y);
typedef void (GLAPIENTRY * PFNGLWINDOWPOS2DVPROC) (const GLdouble *p);
typedef void (GLAPIENTRY * PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y);
@@ -1600,8 +1636,8 @@ typedef void (GLAPIENTRY * PFNGLWINDOWPOS3SVPROC) (const GLshort *p);
#define GL_DYNAMIC_COPY 0x88EA
#define GL_SAMPLES_PASSED 0x8914
-typedef ptrdiff_t GLsizeiptr;
typedef ptrdiff_t GLintptr;
+typedef ptrdiff_t GLsizeiptr;
typedef void (GLAPIENTRY * PFNGLBEGINQUERYPROC) (GLenum target, GLuint id);
typedef void (GLAPIENTRY * PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
@@ -1737,8 +1773,6 @@ typedef GLboolean (GLAPIENTRY * PFNGLUNMAPBUFFERPROC) (GLenum target);
#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4
#define GL_STENCIL_BACK_WRITEMASK 0x8CA5
-typedef char GLchar;
-
typedef void (GLAPIENTRY * PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
typedef void (GLAPIENTRY * PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar* name);
typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum, GLenum);
@@ -1758,12 +1792,12 @@ typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const G
typedef void (GLAPIENTRY * PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
typedef void (GLAPIENTRY * PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint* param);
typedef void (GLAPIENTRY * PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
-typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLint obj, GLsizei maxLength, GLsizei* length, GLchar* source);
+typedef void (GLAPIENTRY * PFNGLGETSHADERSOURCEPROC) (GLuint obj, GLsizei maxLength, GLsizei* length, GLchar* source);
typedef void (GLAPIENTRY * PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint* param);
typedef GLint (GLAPIENTRY * PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar* name);
typedef void (GLAPIENTRY * PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat* params);
typedef void (GLAPIENTRY * PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint* params);
-typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid*);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint, GLenum, GLvoid**);
typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBDVPROC) (GLuint, GLenum, GLdouble*);
typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBFVPROC) (GLuint, GLenum, GLfloat*);
typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIVPROC) (GLuint, GLenum, GLint*);
@@ -2094,8 +2128,6 @@ typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei
typedef void (GLAPIENTRY * PFNGLBEGINCONDITIONALRENDERPROC) (GLuint, GLenum);
typedef void (GLAPIENTRY * PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum);
-typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum, GLuint, GLuint);
-typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum, GLuint, GLuint, GLintptr, GLsizeiptr);
typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONPROC) (GLuint, GLuint, const GLchar*);
typedef void (GLAPIENTRY * PFNGLCLAMPCOLORPROC) (GLenum, GLenum);
typedef void (GLAPIENTRY * PFNGLCLEARBUFFERFIPROC) (GLenum, GLint, GLfloat, GLint);
@@ -2109,18 +2141,17 @@ typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERPROC) (void);
typedef void (GLAPIENTRY * PFNGLENDTRANSFORMFEEDBACKPROC) (void);
typedef void (GLAPIENTRY * PFNGLGETBOOLEANI_VPROC) (GLenum, GLuint, GLboolean*);
typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATALOCATIONPROC) (GLuint, const GLchar*);
-typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum, GLuint, GLint*);
typedef const GLubyte* (GLAPIENTRY * PFNGLGETSTRINGIPROC) (GLenum, GLuint);
typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIIVPROC) (GLenum, GLenum, GLint*);
typedef void (GLAPIENTRY * PFNGLGETTEXPARAMETERIUIVPROC) (GLenum, GLenum, GLuint*);
-typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint, GLuint, GLint*);
+typedef void (GLAPIENTRY * PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint, GLuint, GLsizei, GLsizei *, GLsizei *, GLenum *, GLchar *);
typedef void (GLAPIENTRY * PFNGLGETUNIFORMUIVPROC) (GLuint, GLint, GLuint*);
typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIIVPROC) (GLuint, GLenum, GLint*);
typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint, GLenum, GLuint*);
typedef GLboolean (GLAPIENTRY * PFNGLISENABLEDIPROC) (GLenum, GLuint);
typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIIVPROC) (GLenum, GLenum, const GLint*);
typedef void (GLAPIENTRY * PFNGLTEXPARAMETERIUIVPROC) (GLenum, GLenum, const GLuint*);
-typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint, GLsizei, const GLint*, GLenum);
+typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint, GLsizei, const GLchar **, GLenum);
typedef void (GLAPIENTRY * PFNGLUNIFORM1UIPROC) (GLint, GLuint);
typedef void (GLAPIENTRY * PFNGLUNIFORM1UIVPROC) (GLint, GLsizei, const GLuint*);
typedef void (GLAPIENTRY * PFNGLUNIFORM2UIPROC) (GLint, GLuint, GLuint);
@@ -2153,8 +2184,6 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint, GLint, GLenum
#define glBeginConditionalRender GLEW_GET_FUN(__glewBeginConditionalRender)
#define glBeginTransformFeedback GLEW_GET_FUN(__glewBeginTransformFeedback)
-#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase)
-#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange)
#define glBindFragDataLocation GLEW_GET_FUN(__glewBindFragDataLocation)
#define glClampColor GLEW_GET_FUN(__glewClampColor)
#define glClearBufferfi GLEW_GET_FUN(__glewClearBufferfi)
@@ -2168,7 +2197,6 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint, GLint, GLenum
#define glEndTransformFeedback GLEW_GET_FUN(__glewEndTransformFeedback)
#define glGetBooleani_v GLEW_GET_FUN(__glewGetBooleani_v)
#define glGetFragDataLocation GLEW_GET_FUN(__glewGetFragDataLocation)
-#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v)
#define glGetStringi GLEW_GET_FUN(__glewGetStringi)
#define glGetTexParameterIiv GLEW_GET_FUN(__glewGetTexParameterIiv)
#define glGetTexParameterIuiv GLEW_GET_FUN(__glewGetTexParameterIuiv)
@@ -2214,6 +2242,170 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint, GLint, GLenum
#endif /* GL_VERSION_3_0 */
+/* ----------------------------- GL_VERSION_3_1 ---------------------------- */
+
+#ifndef GL_VERSION_3_1
+#define GL_VERSION_3_1 1
+
+#define GL_TEXTURE_RECTANGLE 0x84F5
+#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6
+#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7
+#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8
+#define GL_SAMPLER_2D_RECT 0x8B63
+#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64
+#define GL_TEXTURE_BUFFER 0x8C2A
+#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B
+#define GL_TEXTURE_BINDING_BUFFER 0x8C2C
+#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D
+#define GL_TEXTURE_BUFFER_FORMAT 0x8C2E
+#define GL_SAMPLER_BUFFER 0x8DC2
+#define GL_INT_SAMPLER_2D_RECT 0x8DCD
+#define GL_INT_SAMPLER_BUFFER 0x8DD0
+#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8
+#define GL_RED_SNORM 0x8F90
+#define GL_RG_SNORM 0x8F91
+#define GL_RGB_SNORM 0x8F92
+#define GL_RGBA_SNORM 0x8F93
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_R16_SNORM 0x8F98
+#define GL_RG16_SNORM 0x8F99
+#define GL_RGB16_SNORM 0x8F9A
+#define GL_RGBA16_SNORM 0x8F9B
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_PRIMITIVE_RESTART 0x8F9D
+#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E
+#define GL_BUFFER_ACCESS_FLAGS 0x911F
+#define GL_BUFFER_MAP_LENGTH 0x9120
+#define GL_BUFFER_MAP_OFFSET 0x9121
+
+typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum, GLint, GLsizei, GLsizei);
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum, GLsizei, GLenum, const GLvoid*, GLsizei);
+typedef void (GLAPIENTRY * PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint);
+typedef void (GLAPIENTRY * PFNGLTEXBUFFERPROC) (GLenum, GLenum, GLuint);
+
+#define glDrawArraysInstanced GLEW_GET_FUN(__glewDrawArraysInstanced)
+#define glDrawElementsInstanced GLEW_GET_FUN(__glewDrawElementsInstanced)
+#define glPrimitiveRestartIndex GLEW_GET_FUN(__glewPrimitiveRestartIndex)
+#define glTexBuffer GLEW_GET_FUN(__glewTexBuffer)
+
+#define GLEW_VERSION_3_1 GLEW_GET_VAR(__GLEW_VERSION_3_1)
+
+#endif /* GL_VERSION_3_1 */
+
+/* ----------------------------- GL_VERSION_3_2 ---------------------------- */
+
+#ifndef GL_VERSION_3_2
+#define GL_VERSION_3_2 1
+
+#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
+#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
+#define GL_LINES_ADJACENCY 0x000A
+#define GL_LINE_STRIP_ADJACENCY 0x000B
+#define GL_TRIANGLES_ADJACENCY 0x000C
+#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D
+#define GL_PROGRAM_POINT_SIZE 0x8642
+#define GL_GEOMETRY_VERTICES_OUT 0x8916
+#define GL_GEOMETRY_INPUT_TYPE 0x8917
+#define GL_GEOMETRY_OUTPUT_TYPE 0x8918
+#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29
+#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7
+#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8
+#define GL_GEOMETRY_SHADER 0x8DD9
+#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF
+#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0
+#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1
+#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122
+#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123
+#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124
+#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125
+#define GL_CONTEXT_PROFILE_MASK 0x9126
+
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum, GLenum, GLuint, GLint);
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum, GLenum, GLint64 *);
+typedef void (GLAPIENTRY * PFNGLGETINTEGER64I_VPROC) (GLenum, GLuint, GLint64 *);
+
+#define glFramebufferTexture GLEW_GET_FUN(__glewFramebufferTexture)
+#define glGetBufferParameteri64v GLEW_GET_FUN(__glewGetBufferParameteri64v)
+#define glGetInteger64i_v GLEW_GET_FUN(__glewGetInteger64i_v)
+
+#define GLEW_VERSION_3_2 GLEW_GET_VAR(__GLEW_VERSION_3_2)
+
+#endif /* GL_VERSION_3_2 */
+
+/* ----------------------------- GL_VERSION_3_3 ---------------------------- */
+
+#ifndef GL_VERSION_3_3
+#define GL_VERSION_3_3 1
+
+#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46
+#define GL_RGB10_A2UI 0x906F
+
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor);
+
+#define glVertexAttribDivisor GLEW_GET_FUN(__glewVertexAttribDivisor)
+
+#define GLEW_VERSION_3_3 GLEW_GET_VAR(__GLEW_VERSION_3_3)
+
+#endif /* GL_VERSION_3_3 */
+
+/* ----------------------------- GL_VERSION_4_0 ---------------------------- */
+
+#ifndef GL_VERSION_4_0
+#define GL_VERSION_4_0 1
+
+#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F
+#define GL_SAMPLE_SHADING 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS 0x8F9F
+#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B
+#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F
+
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGPROC) (GLclampf value);
+
+#define glBlendEquationSeparatei GLEW_GET_FUN(__glewBlendEquationSeparatei)
+#define glBlendEquationi GLEW_GET_FUN(__glewBlendEquationi)
+#define glBlendFuncSeparatei GLEW_GET_FUN(__glewBlendFuncSeparatei)
+#define glBlendFunci GLEW_GET_FUN(__glewBlendFunci)
+#define glMinSampleShading GLEW_GET_FUN(__glewMinSampleShading)
+
+#define GLEW_VERSION_4_0 GLEW_GET_VAR(__GLEW_VERSION_4_0)
+
+#endif /* GL_VERSION_4_0 */
+
+/* ----------------------------- GL_VERSION_4_1 ---------------------------- */
+
+#ifndef GL_VERSION_4_1
+#define GL_VERSION_4_1 1
+
+#define GLEW_VERSION_4_1 GLEW_GET_VAR(__GLEW_VERSION_4_1)
+
+#endif /* GL_VERSION_4_1 */
+
/* -------------------------- GL_3DFX_multisample -------------------------- */
#ifndef GL_3DFX_multisample
@@ -2253,6 +2445,220 @@ typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask);
#endif /* GL_3DFX_texture_compression_FXT1 */
+/* ----------------------- GL_AMD_conservative_depth ----------------------- */
+
+#ifndef GL_AMD_conservative_depth
+#define GL_AMD_conservative_depth 1
+
+#define GLEW_AMD_conservative_depth GLEW_GET_VAR(__GLEW_AMD_conservative_depth)
+
+#endif /* GL_AMD_conservative_depth */
+
+/* -------------------------- GL_AMD_debug_output -------------------------- */
+
+#ifndef GL_AMD_debug_output
+#define GL_AMD_debug_output 1
+
+#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145
+#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147
+#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148
+#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149
+#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A
+#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B
+#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C
+#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D
+#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E
+#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F
+#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150
+
+typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id, GLenum category, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam);
+
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void* userParam);
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const char* buf);
+typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufsize, GLenum* categories, GLuint* severities, GLuint* ids, GLsizei* lengths, char* message);
+
+#define glDebugMessageCallbackAMD GLEW_GET_FUN(__glewDebugMessageCallbackAMD)
+#define glDebugMessageEnableAMD GLEW_GET_FUN(__glewDebugMessageEnableAMD)
+#define glDebugMessageInsertAMD GLEW_GET_FUN(__glewDebugMessageInsertAMD)
+#define glGetDebugMessageLogAMD GLEW_GET_FUN(__glewGetDebugMessageLogAMD)
+
+#define GLEW_AMD_debug_output GLEW_GET_VAR(__GLEW_AMD_debug_output)
+
+#endif /* GL_AMD_debug_output */
+
+/* ---------------------- GL_AMD_depth_clamp_separate ---------------------- */
+
+#ifndef GL_AMD_depth_clamp_separate
+#define GL_AMD_depth_clamp_separate 1
+
+#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E
+#define GL_DEPTH_CLAMP_FAR_AMD 0x901F
+
+#define GLEW_AMD_depth_clamp_separate GLEW_GET_VAR(__GLEW_AMD_depth_clamp_separate)
+
+#endif /* GL_AMD_depth_clamp_separate */
+
+/* ----------------------- GL_AMD_draw_buffers_blend ----------------------- */
+
+#ifndef GL_AMD_draw_buffers_blend
+#define GL_AMD_draw_buffers_blend 1
+
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+
+#define glBlendEquationIndexedAMD GLEW_GET_FUN(__glewBlendEquationIndexedAMD)
+#define glBlendEquationSeparateIndexedAMD GLEW_GET_FUN(__glewBlendEquationSeparateIndexedAMD)
+#define glBlendFuncIndexedAMD GLEW_GET_FUN(__glewBlendFuncIndexedAMD)
+#define glBlendFuncSeparateIndexedAMD GLEW_GET_FUN(__glewBlendFuncSeparateIndexedAMD)
+
+#define GLEW_AMD_draw_buffers_blend GLEW_GET_VAR(__GLEW_AMD_draw_buffers_blend)
+
+#endif /* GL_AMD_draw_buffers_blend */
+
+/* ------------------------- GL_AMD_name_gen_delete ------------------------ */
+
+#ifndef GL_AMD_name_gen_delete
+#define GL_AMD_name_gen_delete 1
+
+#define GL_DATA_BUFFER_AMD 0x9151
+#define GL_PERFORMANCE_MONITOR_AMD 0x9152
+#define GL_QUERY_OBJECT_AMD 0x9153
+#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154
+#define GL_SAMPLER_OBJECT_AMD 0x9155
+
+typedef void (GLAPIENTRY * PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint* names);
+typedef void (GLAPIENTRY * PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint* names);
+typedef GLboolean (GLAPIENTRY * PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name);
+
+#define glDeleteNamesAMD GLEW_GET_FUN(__glewDeleteNamesAMD)
+#define glGenNamesAMD GLEW_GET_FUN(__glewGenNamesAMD)
+#define glIsNameAMD GLEW_GET_FUN(__glewIsNameAMD)
+
+#define GLEW_AMD_name_gen_delete GLEW_GET_VAR(__GLEW_AMD_name_gen_delete)
+
+#endif /* GL_AMD_name_gen_delete */
+
+/* ----------------------- GL_AMD_performance_monitor ---------------------- */
+
+#ifndef GL_AMD_performance_monitor
+#define GL_AMD_performance_monitor 1
+
+#define GL_UNSIGNED_INT 0x1405
+#define GL_FLOAT 0x1406
+#define GL_COUNTER_TYPE_AMD 0x8BC0
+#define GL_COUNTER_RANGE_AMD 0x8BC1
+#define GL_UNSIGNED_INT64_AMD 0x8BC2
+#define GL_PERCENTAGE_AMD 0x8BC3
+#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4
+#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5
+#define GL_PERFMON_RESULT_AMD 0x8BC6
+
+typedef void (GLAPIENTRY * PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor);
+typedef void (GLAPIENTRY * PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors);
+typedef void (GLAPIENTRY * PFNGLENDPERFMONITORAMDPROC) (GLuint monitor);
+typedef void (GLAPIENTRY * PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint* monitors);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint* data, GLint *bytesWritten);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void* data);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei* length, char *counterString);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint* numCounters, GLint *maxActiveCounters, GLsizei countersSize, GLuint *counters);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei* length, char *groupString);
+typedef void (GLAPIENTRY * PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint* numGroups, GLsizei groupsSize, GLuint *groups);
+typedef void (GLAPIENTRY * PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint* counterList);
+
+#define glBeginPerfMonitorAMD GLEW_GET_FUN(__glewBeginPerfMonitorAMD)
+#define glDeletePerfMonitorsAMD GLEW_GET_FUN(__glewDeletePerfMonitorsAMD)
+#define glEndPerfMonitorAMD GLEW_GET_FUN(__glewEndPerfMonitorAMD)
+#define glGenPerfMonitorsAMD GLEW_GET_FUN(__glewGenPerfMonitorsAMD)
+#define glGetPerfMonitorCounterDataAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterDataAMD)
+#define glGetPerfMonitorCounterInfoAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterInfoAMD)
+#define glGetPerfMonitorCounterStringAMD GLEW_GET_FUN(__glewGetPerfMonitorCounterStringAMD)
+#define glGetPerfMonitorCountersAMD GLEW_GET_FUN(__glewGetPerfMonitorCountersAMD)
+#define glGetPerfMonitorGroupStringAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupStringAMD)
+#define glGetPerfMonitorGroupsAMD GLEW_GET_FUN(__glewGetPerfMonitorGroupsAMD)
+#define glSelectPerfMonitorCountersAMD GLEW_GET_FUN(__glewSelectPerfMonitorCountersAMD)
+
+#define GLEW_AMD_performance_monitor GLEW_GET_VAR(__GLEW_AMD_performance_monitor)
+
+#endif /* GL_AMD_performance_monitor */
+
+/* ------------------ GL_AMD_seamless_cubemap_per_texture ------------------ */
+
+#ifndef GL_AMD_seamless_cubemap_per_texture
+#define GL_AMD_seamless_cubemap_per_texture 1
+
+#define GL_TEXTURE_CUBE_MAP_SEAMLESS_ARB 0x884F
+
+#define GLEW_AMD_seamless_cubemap_per_texture GLEW_GET_VAR(__GLEW_AMD_seamless_cubemap_per_texture)
+
+#endif /* GL_AMD_seamless_cubemap_per_texture */
+
+/* ---------------------- GL_AMD_shader_stencil_export --------------------- */
+
+#ifndef GL_AMD_shader_stencil_export
+#define GL_AMD_shader_stencil_export 1
+
+#define GLEW_AMD_shader_stencil_export GLEW_GET_VAR(__GLEW_AMD_shader_stencil_export)
+
+#endif /* GL_AMD_shader_stencil_export */
+
+/* ------------------------ GL_AMD_texture_texture4 ------------------------ */
+
+#ifndef GL_AMD_texture_texture4
+#define GL_AMD_texture_texture4 1
+
+#define GLEW_AMD_texture_texture4 GLEW_GET_VAR(__GLEW_AMD_texture_texture4)
+
+#endif /* GL_AMD_texture_texture4 */
+
+/* --------------- GL_AMD_transform_feedback3_lines_triangles -------------- */
+
+#ifndef GL_AMD_transform_feedback3_lines_triangles
+#define GL_AMD_transform_feedback3_lines_triangles 1
+
+#define GLEW_AMD_transform_feedback3_lines_triangles GLEW_GET_VAR(__GLEW_AMD_transform_feedback3_lines_triangles)
+
+#endif /* GL_AMD_transform_feedback3_lines_triangles */
+
+/* -------------------- GL_AMD_vertex_shader_tessellator ------------------- */
+
+#ifndef GL_AMD_vertex_shader_tessellator
+#define GL_AMD_vertex_shader_tessellator 1
+
+#define GL_SAMPLER_BUFFER_AMD 0x9001
+#define GL_INT_SAMPLER_BUFFER_AMD 0x9002
+#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003
+#define GL_TESSELLATION_MODE_AMD 0x9004
+#define GL_TESSELLATION_FACTOR_AMD 0x9005
+#define GL_DISCRETE_AMD 0x9006
+#define GL_CONTINUOUS_AMD 0x9007
+
+typedef void (GLAPIENTRY * PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor);
+typedef void (GLAPIENTRY * PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode);
+
+#define glTessellationFactorAMD GLEW_GET_FUN(__glewTessellationFactorAMD)
+#define glTessellationModeAMD GLEW_GET_FUN(__glewTessellationModeAMD)
+
+#define GLEW_AMD_vertex_shader_tessellator GLEW_GET_VAR(__GLEW_AMD_vertex_shader_tessellator)
+
+#endif /* GL_AMD_vertex_shader_tessellator */
+
+/* ----------------------- GL_APPLE_aux_depth_stencil ---------------------- */
+
+#ifndef GL_APPLE_aux_depth_stencil
+#define GL_APPLE_aux_depth_stencil 1
+
+#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14
+
+#define GLEW_APPLE_aux_depth_stencil GLEW_GET_VAR(__GLEW_APPLE_aux_depth_stencil)
+
+#endif /* GL_APPLE_aux_depth_stencil */
+
/* ------------------------ GL_APPLE_client_storage ------------------------ */
#ifndef GL_APPLE_client_storage
@@ -2269,9 +2675,9 @@ typedef void (GLAPIENTRY * PFNGLTBUFFERMASK3DFXPROC) (GLuint mask);
#ifndef GL_APPLE_element_array
#define GL_APPLE_element_array 1
-#define GL_ELEMENT_ARRAY_APPLE 0x8768
-#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8769
-#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x876A
+#define GL_ELEMENT_ARRAY_APPLE 0x8A0C
+#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D
+#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E
typedef void (GLAPIENTRY * PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count);
typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count);
@@ -2361,6 +2767,30 @@ typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target,
#endif /* GL_APPLE_flush_buffer_range */
+/* ----------------------- GL_APPLE_object_purgeable ----------------------- */
+
+#ifndef GL_APPLE_object_purgeable
+#define GL_APPLE_object_purgeable 1
+
+#define GL_BUFFER_OBJECT_APPLE 0x85B3
+#define GL_RELEASED_APPLE 0x8A19
+#define GL_VOLATILE_APPLE 0x8A1A
+#define GL_RETAINED_APPLE 0x8A1B
+#define GL_UNDEFINED_APPLE 0x8A1C
+#define GL_PURGEABLE_APPLE 0x8A1D
+
+typedef void (GLAPIENTRY * PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint* params);
+typedef GLenum (GLAPIENTRY * PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);
+typedef GLenum (GLAPIENTRY * PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option);
+
+#define glGetObjectParameterivAPPLE GLEW_GET_FUN(__glewGetObjectParameterivAPPLE)
+#define glObjectPurgeableAPPLE GLEW_GET_FUN(__glewObjectPurgeableAPPLE)
+#define glObjectUnpurgeableAPPLE GLEW_GET_FUN(__glewObjectUnpurgeableAPPLE)
+
+#define GLEW_APPLE_object_purgeable GLEW_GET_VAR(__GLEW_APPLE_object_purgeable)
+
+#endif /* GL_APPLE_object_purgeable */
+
/* ------------------------- GL_APPLE_pixel_buffer ------------------------- */
#ifndef GL_APPLE_pixel_buffer
@@ -2372,6 +2802,31 @@ typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target,
#endif /* GL_APPLE_pixel_buffer */
+/* ---------------------------- GL_APPLE_rgb_422 --------------------------- */
+
+#ifndef GL_APPLE_rgb_422
+#define GL_APPLE_rgb_422 1
+
+#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA
+#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB
+#define GL_RGB_422_APPLE 0x8A1F
+
+#define GLEW_APPLE_rgb_422 GLEW_GET_VAR(__GLEW_APPLE_rgb_422)
+
+#endif /* GL_APPLE_rgb_422 */
+
+/* --------------------------- GL_APPLE_row_bytes -------------------------- */
+
+#ifndef GL_APPLE_row_bytes
+#define GL_APPLE_row_bytes 1
+
+#define GL_PACK_ROW_BYTES_APPLE 0x8A15
+#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16
+
+#define GLEW_APPLE_row_bytes GLEW_GET_VAR(__GLEW_APPLE_row_bytes)
+
+#endif /* GL_APPLE_row_bytes */
+
/* ------------------------ GL_APPLE_specular_vector ----------------------- */
#ifndef GL_APPLE_specular_vector
@@ -2447,6 +2902,7 @@ typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);
#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F
#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE 0x8520
#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521
+#define GL_STORAGE_CLIENT_APPLE 0x85B4
#define GL_STORAGE_CACHED_APPLE 0x85BE
#define GL_STORAGE_SHARED_APPLE 0x85BF
@@ -2462,6 +2918,42 @@ typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void
#endif /* GL_APPLE_vertex_array_range */
+/* ------------------- GL_APPLE_vertex_program_evaluators ------------------ */
+
+#ifndef GL_APPLE_vertex_program_evaluators
+#define GL_APPLE_vertex_program_evaluators 1
+
+#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00
+#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01
+#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02
+#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03
+#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04
+#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05
+#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06
+#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07
+#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08
+#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09
+
+typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);
+typedef void (GLAPIENTRY * PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname);
+typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname);
+typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble* points);
+typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat* points);
+typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble* points);
+typedef void (GLAPIENTRY * PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat* points);
+
+#define glDisableVertexAttribAPPLE GLEW_GET_FUN(__glewDisableVertexAttribAPPLE)
+#define glEnableVertexAttribAPPLE GLEW_GET_FUN(__glewEnableVertexAttribAPPLE)
+#define glIsVertexAttribEnabledAPPLE GLEW_GET_FUN(__glewIsVertexAttribEnabledAPPLE)
+#define glMapVertexAttrib1dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1dAPPLE)
+#define glMapVertexAttrib1fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib1fAPPLE)
+#define glMapVertexAttrib2dAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2dAPPLE)
+#define glMapVertexAttrib2fAPPLE GLEW_GET_FUN(__glewMapVertexAttrib2fAPPLE)
+
+#define GLEW_APPLE_vertex_program_evaluators GLEW_GET_VAR(__GLEW_APPLE_vertex_program_evaluators)
+
+#endif /* GL_APPLE_vertex_program_evaluators */
+
/* --------------------------- GL_APPLE_ycbcr_422 -------------------------- */
#ifndef GL_APPLE_ycbcr_422
@@ -2475,6 +2967,82 @@ typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void
#endif /* GL_APPLE_ycbcr_422 */
+/* ------------------------ GL_ARB_ES2_compatibility ----------------------- */
+
+#ifndef GL_ARB_ES2_compatibility
+#define GL_ARB_ES2_compatibility 1
+
+#define GL_FIXED 0x140C
+#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A
+#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B
+#define GL_LOW_FLOAT 0x8DF0
+#define GL_MEDIUM_FLOAT 0x8DF1
+#define GL_HIGH_FLOAT 0x8DF2
+#define GL_LOW_INT 0x8DF3
+#define GL_MEDIUM_INT 0x8DF4
+#define GL_HIGH_INT 0x8DF5
+#define GL_SHADER_BINARY_FORMATS 0x8DF8
+#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9
+#define GL_SHADER_COMPILER 0x8DFA
+#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB
+#define GL_MAX_VARYING_VECTORS 0x8DFC
+#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD
+
+typedef void (GLAPIENTRY * PFNGLCLEARDEPTHFPROC) (GLclampf d);
+typedef void (GLAPIENTRY * PFNGLDEPTHRANGEFPROC) (GLclampf n, GLclampf f);
+typedef void (GLAPIENTRY * PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint* range, GLint *precision);
+typedef void (GLAPIENTRY * PFNGLRELEASESHADERCOMPILERPROC) (void);
+typedef void (GLAPIENTRY * PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint* shaders, GLenum binaryformat, const GLvoid*binary, GLsizei length);
+
+#define glClearDepthf GLEW_GET_FUN(__glewClearDepthf)
+#define glDepthRangef GLEW_GET_FUN(__glewDepthRangef)
+#define glGetShaderPrecisionFormat GLEW_GET_FUN(__glewGetShaderPrecisionFormat)
+#define glReleaseShaderCompiler GLEW_GET_FUN(__glewReleaseShaderCompiler)
+#define glShaderBinary GLEW_GET_FUN(__glewShaderBinary)
+
+#define GLEW_ARB_ES2_compatibility GLEW_GET_VAR(__GLEW_ARB_ES2_compatibility)
+
+#endif /* GL_ARB_ES2_compatibility */
+
+/* ----------------------- GL_ARB_blend_func_extended ---------------------- */
+
+#ifndef GL_ARB_blend_func_extended
+#define GL_ARB_blend_func_extended 1
+
+#define GL_SRC1_COLOR 0x88F9
+#define GL_ONE_MINUS_SRC1_COLOR 0x88FA
+#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB
+#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC
+
+typedef void (GLAPIENTRY * PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const char * name);
+typedef GLint (GLAPIENTRY * PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const char * name);
+
+#define glBindFragDataLocationIndexed GLEW_GET_FUN(__glewBindFragDataLocationIndexed)
+#define glGetFragDataIndex GLEW_GET_FUN(__glewGetFragDataIndex)
+
+#define GLEW_ARB_blend_func_extended GLEW_GET_VAR(__GLEW_ARB_blend_func_extended)
+
+#endif /* GL_ARB_blend_func_extended */
+
+/* ---------------------------- GL_ARB_cl_event ---------------------------- */
+
+#ifndef GL_ARB_cl_event
+#define GL_ARB_cl_event 1
+
+#define GL_SYNC_CL_EVENT_ARB 0x8240
+#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241
+
+typedef struct _cl_context *cl_context;
+typedef struct _cl_event *cl_event;
+
+typedef GLsync (GLAPIENTRY * PFNGLCREATESYNCFROMCLEVENTARBPROC) (cl_context context, cl_event event, GLbitfield flags);
+
+#define glCreateSyncFromCLeventARB GLEW_GET_FUN(__glewCreateSyncFromCLeventARB)
+
+#define GLEW_ARB_cl_event GLEW_GET_VAR(__GLEW_ARB_cl_event)
+
+#endif /* GL_ARB_cl_event */
+
/* ----------------------- GL_ARB_color_buffer_float ----------------------- */
#ifndef GL_ARB_color_buffer_float
@@ -2494,6 +3062,75 @@ typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp)
#endif /* GL_ARB_color_buffer_float */
+/* -------------------------- GL_ARB_compatibility ------------------------- */
+
+#ifndef GL_ARB_compatibility
+#define GL_ARB_compatibility 1
+
+#define GLEW_ARB_compatibility GLEW_GET_VAR(__GLEW_ARB_compatibility)
+
+#endif /* GL_ARB_compatibility */
+
+/* --------------------------- GL_ARB_copy_buffer -------------------------- */
+
+#ifndef GL_ARB_copy_buffer
+#define GL_ARB_copy_buffer 1
+
+#define GL_COPY_READ_BUFFER 0x8F36
+#define GL_COPY_WRITE_BUFFER 0x8F37
+
+typedef void (GLAPIENTRY * PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readtarget, GLenum writetarget, GLintptr readoffset, GLintptr writeoffset, GLsizeiptr size);
+
+#define glCopyBufferSubData GLEW_GET_FUN(__glewCopyBufferSubData)
+
+#define GLEW_ARB_copy_buffer GLEW_GET_VAR(__GLEW_ARB_copy_buffer)
+
+#endif /* GL_ARB_copy_buffer */
+
+/* -------------------------- GL_ARB_debug_output -------------------------- */
+
+#ifndef GL_ARB_debug_output
+#define GL_ARB_debug_output 1
+
+#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242
+#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243
+#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244
+#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245
+#define GL_DEBUG_SOURCE_API_ARB 0x8246
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247
+#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248
+#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249
+#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A
+#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B
+#define GL_DEBUG_TYPE_ERROR_ARB 0x824C
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E
+#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F
+#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250
+#define GL_DEBUG_TYPE_OTHER_ARB 0x8251
+#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143
+#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144
+#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145
+#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146
+#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147
+#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148
+
+typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, GLvoid* userParam);
+
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, void* userParam);
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint* ids, GLboolean enabled);
+typedef void (GLAPIENTRY * PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char* buf);
+typedef GLuint (GLAPIENTRY * PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufsize, GLenum* sources, GLenum* types, GLuint* ids, GLenum* severities, GLsizei* lengths, char* messageLog);
+
+#define glDebugMessageCallbackARB GLEW_GET_FUN(__glewDebugMessageCallbackARB)
+#define glDebugMessageControlARB GLEW_GET_FUN(__glewDebugMessageControlARB)
+#define glDebugMessageInsertARB GLEW_GET_FUN(__glewDebugMessageInsertARB)
+#define glGetDebugMessageLogARB GLEW_GET_FUN(__glewGetDebugMessageLogARB)
+
+#define GLEW_ARB_debug_output GLEW_GET_VAR(__GLEW_ARB_debug_output)
+
+#endif /* GL_ARB_debug_output */
+
/* ----------------------- GL_ARB_depth_buffer_float ----------------------- */
#ifndef GL_ARB_depth_buffer_float
@@ -2507,6 +3144,17 @@ typedef void (GLAPIENTRY * PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp)
#endif /* GL_ARB_depth_buffer_float */
+/* --------------------------- GL_ARB_depth_clamp -------------------------- */
+
+#ifndef GL_ARB_depth_clamp
+#define GL_ARB_depth_clamp 1
+
+#define GL_DEPTH_CLAMP 0x864F
+
+#define GLEW_ARB_depth_clamp GLEW_GET_VAR(__GLEW_ARB_depth_clamp)
+
+#endif /* GL_ARB_depth_clamp */
+
/* -------------------------- GL_ARB_depth_texture ------------------------- */
#ifndef GL_ARB_depth_texture
@@ -2553,6 +3201,62 @@ typedef void (GLAPIENTRY * PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum* bu
#endif /* GL_ARB_draw_buffers */
+/* ----------------------- GL_ARB_draw_buffers_blend ----------------------- */
+
+#ifndef GL_ARB_draw_buffers_blend
+#define GL_ARB_draw_buffers_blend 1
+
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha);
+typedef void (GLAPIENTRY * PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
+typedef void (GLAPIENTRY * PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst);
+
+#define glBlendEquationSeparateiARB GLEW_GET_FUN(__glewBlendEquationSeparateiARB)
+#define glBlendEquationiARB GLEW_GET_FUN(__glewBlendEquationiARB)
+#define glBlendFuncSeparateiARB GLEW_GET_FUN(__glewBlendFuncSeparateiARB)
+#define glBlendFunciARB GLEW_GET_FUN(__glewBlendFunciARB)
+
+#define GLEW_ARB_draw_buffers_blend GLEW_GET_VAR(__GLEW_ARB_draw_buffers_blend)
+
+#endif /* GL_ARB_draw_buffers_blend */
+
+/* -------------------- GL_ARB_draw_elements_base_vertex ------------------- */
+
+#ifndef GL_ARB_draw_elements_base_vertex
+#define GL_ARB_draw_elements_base_vertex 1
+
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, void* indices, GLint basevertex);
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primcount, GLint basevertex);
+typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, void* indices, GLint basevertex);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei* count, GLenum type, GLvoid**indices, GLsizei primcount, GLint *basevertex);
+
+#define glDrawElementsBaseVertex GLEW_GET_FUN(__glewDrawElementsBaseVertex)
+#define glDrawElementsInstancedBaseVertex GLEW_GET_FUN(__glewDrawElementsInstancedBaseVertex)
+#define glDrawRangeElementsBaseVertex GLEW_GET_FUN(__glewDrawRangeElementsBaseVertex)
+#define glMultiDrawElementsBaseVertex GLEW_GET_FUN(__glewMultiDrawElementsBaseVertex)
+
+#define GLEW_ARB_draw_elements_base_vertex GLEW_GET_VAR(__GLEW_ARB_draw_elements_base_vertex)
+
+#endif /* GL_ARB_draw_elements_base_vertex */
+
+/* -------------------------- GL_ARB_draw_indirect ------------------------- */
+
+#ifndef GL_ARB_draw_indirect
+#define GL_ARB_draw_indirect 1
+
+#define GL_DRAW_INDIRECT_BUFFER 0x8F3F
+#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43
+
+typedef void (GLAPIENTRY * PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void* indirect);
+typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void* indirect);
+
+#define glDrawArraysIndirect GLEW_GET_FUN(__glewDrawArraysIndirect)
+#define glDrawElementsIndirect GLEW_GET_FUN(__glewDrawElementsIndirect)
+
+#define GLEW_ARB_draw_indirect GLEW_GET_VAR(__GLEW_ARB_draw_indirect)
+
+#endif /* GL_ARB_draw_indirect */
+
/* ------------------------- GL_ARB_draw_instanced ------------------------- */
#ifndef GL_ARB_draw_instanced
@@ -2568,6 +3272,24 @@ typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsi
#endif /* GL_ARB_draw_instanced */
+/* -------------------- GL_ARB_explicit_attrib_location -------------------- */
+
+#ifndef GL_ARB_explicit_attrib_location
+#define GL_ARB_explicit_attrib_location 1
+
+#define GLEW_ARB_explicit_attrib_location GLEW_GET_VAR(__GLEW_ARB_explicit_attrib_location)
+
+#endif /* GL_ARB_explicit_attrib_location */
+
+/* ------------------- GL_ARB_fragment_coord_conventions ------------------- */
+
+#ifndef GL_ARB_fragment_coord_conventions
+#define GL_ARB_fragment_coord_conventions 1
+
+#define GLEW_ARB_fragment_coord_conventions GLEW_GET_VAR(__GLEW_ARB_fragment_coord_conventions)
+
+#endif /* GL_ARB_fragment_coord_conventions */
+
/* ------------------------ GL_ARB_fragment_program ------------------------ */
#ifndef GL_ARB_fragment_program
@@ -2702,10 +3424,10 @@ typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers);
typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers);
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
-typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer);
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer);
+typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer);
typedef void (GLAPIENTRY * PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint* framebuffers);
typedef void (GLAPIENTRY * PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint* renderbuffers);
typedef void (GLAPIENTRY * PFNGLGENERATEMIPMAPPROC) (GLenum target);
@@ -2723,10 +3445,10 @@ typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum targ
#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers)
#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers)
#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer)
-#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer)
#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D)
#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D)
#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D)
+#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer)
#define glGenFramebuffers GLEW_GET_FUN(__glewGenFramebuffers)
#define glGenRenderbuffers GLEW_GET_FUN(__glewGenRenderbuffers)
#define glGenerateMipmap GLEW_GET_FUN(__glewGenerateMipmap)
@@ -2791,6 +3513,138 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenu
#endif /* GL_ARB_geometry_shader4 */
+/* ----------------------- GL_ARB_get_program_binary ----------------------- */
+
+#ifndef GL_ARB_get_program_binary
+#define GL_ARB_get_program_binary 1
+
+#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257
+#define GL_PROGRAM_BINARY_LENGTH 0x8741
+#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE
+#define GL_PROGRAM_BINARY_FORMATS 0x87FF
+
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum *binaryFormat, GLvoid*binary);
+typedef void (GLAPIENTRY * PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void* binary, GLsizei length);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value);
+
+#define glGetProgramBinary GLEW_GET_FUN(__glewGetProgramBinary)
+#define glProgramBinary GLEW_GET_FUN(__glewProgramBinary)
+#define glProgramParameteri GLEW_GET_FUN(__glewProgramParameteri)
+
+#define GLEW_ARB_get_program_binary GLEW_GET_VAR(__GLEW_ARB_get_program_binary)
+
+#endif /* GL_ARB_get_program_binary */
+
+/* --------------------------- GL_ARB_gpu_shader5 -------------------------- */
+
+#ifndef GL_ARB_gpu_shader5
+#define GL_ARB_gpu_shader5 1
+
+#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F
+#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C
+#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D
+#define GL_MAX_VERTEX_STREAMS 0x8E71
+
+#define GLEW_ARB_gpu_shader5 GLEW_GET_VAR(__GLEW_ARB_gpu_shader5)
+
+#endif /* GL_ARB_gpu_shader5 */
+
+/* ------------------------- GL_ARB_gpu_shader_fp64 ------------------------ */
+
+#ifndef GL_ARB_gpu_shader_fp64
+#define GL_ARB_gpu_shader_fp64 1
+
+#define GL_DOUBLE_MAT2 0x8F46
+#define GL_DOUBLE_MAT3 0x8F47
+#define GL_DOUBLE_MAT4 0x8F48
+#define GL_DOUBLE_MAT2x3 0x8F49
+#define GL_DOUBLE_MAT2x4 0x8F4A
+#define GL_DOUBLE_MAT3x2 0x8F4B
+#define GL_DOUBLE_MAT3x4 0x8F4C
+#define GL_DOUBLE_MAT4x2 0x8F4D
+#define GL_DOUBLE_MAT4x3 0x8F4E
+#define GL_DOUBLE_VEC2 0x8FFC
+#define GL_DOUBLE_VEC3 0x8FFD
+#define GL_DOUBLE_VEC4 0x8FFE
+
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1DPROC) (GLint location, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+
+#define glGetUniformdv GLEW_GET_FUN(__glewGetUniformdv)
+#define glProgramUniform1dEXT GLEW_GET_FUN(__glewProgramUniform1dEXT)
+#define glProgramUniform1dvEXT GLEW_GET_FUN(__glewProgramUniform1dvEXT)
+#define glProgramUniform2dEXT GLEW_GET_FUN(__glewProgramUniform2dEXT)
+#define glProgramUniform2dvEXT GLEW_GET_FUN(__glewProgramUniform2dvEXT)
+#define glProgramUniform3dEXT GLEW_GET_FUN(__glewProgramUniform3dEXT)
+#define glProgramUniform3dvEXT GLEW_GET_FUN(__glewProgramUniform3dvEXT)
+#define glProgramUniform4dEXT GLEW_GET_FUN(__glewProgramUniform4dEXT)
+#define glProgramUniform4dvEXT GLEW_GET_FUN(__glewProgramUniform4dvEXT)
+#define glProgramUniformMatrix2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2dvEXT)
+#define glProgramUniformMatrix2x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x3dvEXT)
+#define glProgramUniformMatrix2x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix2x4dvEXT)
+#define glProgramUniformMatrix3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3dvEXT)
+#define glProgramUniformMatrix3x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x2dvEXT)
+#define glProgramUniformMatrix3x4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix3x4dvEXT)
+#define glProgramUniformMatrix4dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4dvEXT)
+#define glProgramUniformMatrix4x2dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x2dvEXT)
+#define glProgramUniformMatrix4x3dvEXT GLEW_GET_FUN(__glewProgramUniformMatrix4x3dvEXT)
+#define glUniform1d GLEW_GET_FUN(__glewUniform1d)
+#define glUniform1dv GLEW_GET_FUN(__glewUniform1dv)
+#define glUniform2d GLEW_GET_FUN(__glewUniform2d)
+#define glUniform2dv GLEW_GET_FUN(__glewUniform2dv)
+#define glUniform3d GLEW_GET_FUN(__glewUniform3d)
+#define glUniform3dv GLEW_GET_FUN(__glewUniform3dv)
+#define glUniform4d GLEW_GET_FUN(__glewUniform4d)
+#define glUniform4dv GLEW_GET_FUN(__glewUniform4dv)
+#define glUniformMatrix2dv GLEW_GET_FUN(__glewUniformMatrix2dv)
+#define glUniformMatrix2x3dv GLEW_GET_FUN(__glewUniformMatrix2x3dv)
+#define glUniformMatrix2x4dv GLEW_GET_FUN(__glewUniformMatrix2x4dv)
+#define glUniformMatrix3dv GLEW_GET_FUN(__glewUniformMatrix3dv)
+#define glUniformMatrix3x2dv GLEW_GET_FUN(__glewUniformMatrix3x2dv)
+#define glUniformMatrix3x4dv GLEW_GET_FUN(__glewUniformMatrix3x4dv)
+#define glUniformMatrix4dv GLEW_GET_FUN(__glewUniformMatrix4dv)
+#define glUniformMatrix4x2dv GLEW_GET_FUN(__glewUniformMatrix4x2dv)
+#define glUniformMatrix4x3dv GLEW_GET_FUN(__glewUniformMatrix4x3dv)
+
+#define GLEW_ARB_gpu_shader_fp64 GLEW_GET_VAR(__GLEW_ARB_gpu_shader_fp64)
+
+#endif /* GL_ARB_gpu_shader_fp64 */
+
/* ------------------------ GL_ARB_half_float_pixel ------------------------ */
#ifndef GL_ARB_half_float_pixel
@@ -3206,6 +4060,17 @@ typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id);
#endif /* GL_ARB_occlusion_query */
+/* ------------------------ GL_ARB_occlusion_query2 ------------------------ */
+
+#ifndef GL_ARB_occlusion_query2
+#define GL_ARB_occlusion_query2 1
+
+#define GL_ANY_SAMPLES_PASSED 0x8C2F
+
+#define GLEW_ARB_occlusion_query2 GLEW_GET_VAR(__GLEW_ARB_occlusion_query2)
+
+#endif /* GL_ARB_occlusion_query2 */
+
/* ----------------------- GL_ARB_pixel_buffer_object ---------------------- */
#ifndef GL_ARB_pixel_buffer_object
@@ -3231,7 +4096,7 @@ typedef GLboolean (GLAPIENTRY * PFNGLISQUERYARBPROC) (GLuint id);
#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129
typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param);
-typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat* params);
#define glPointParameterfARB GLEW_GET_FUN(__glewPointParameterfARB)
#define glPointParameterfvARB GLEW_GET_FUN(__glewPointParameterfvARB)
@@ -3252,6 +4117,299 @@ typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, GLfloat*
#endif /* GL_ARB_point_sprite */
+/* ------------------------ GL_ARB_provoking_vertex ------------------------ */
+
+#ifndef GL_ARB_provoking_vertex
+#define GL_ARB_provoking_vertex 1
+
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C
+#define GL_FIRST_VERTEX_CONVENTION 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION 0x8E4E
+#define GL_PROVOKING_VERTEX 0x8E4F
+
+typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXPROC) (GLenum mode);
+
+#define glProvokingVertex GLEW_GET_FUN(__glewProvokingVertex)
+
+#define GLEW_ARB_provoking_vertex GLEW_GET_VAR(__GLEW_ARB_provoking_vertex)
+
+#endif /* GL_ARB_provoking_vertex */
+
+/* --------------------------- GL_ARB_robustness --------------------------- */
+
+#ifndef GL_ARB_robustness
+#define GL_ARB_robustness 1
+
+#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253
+#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254
+#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255
+#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define GL_NO_RESET_NOTIFICATION_ARB 0x8261
+
+typedef void (GLAPIENTRY * PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* table);
+typedef void (GLAPIENTRY * PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void* img);
+typedef void (GLAPIENTRY * PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void* image);
+typedef void (GLAPIENTRY * PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values);
+typedef void (GLAPIENTRY * PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat* v);
+typedef void (GLAPIENTRY * PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint* v);
+typedef void (GLAPIENTRY * PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void* values);
+typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat* values);
+typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint* values);
+typedef void (GLAPIENTRY * PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort* values);
+typedef void (GLAPIENTRY * PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte* pattern);
+typedef void (GLAPIENTRY * PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void* row, GLsizei columnBufSize, GLvoid*column, GLvoid*span);
+typedef void (GLAPIENTRY * PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* img);
+typedef void (GLAPIENTRY * PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void* data);
+
+#define glGetnColorTableARB GLEW_GET_FUN(__glewGetnColorTableARB)
+#define glGetnCompressedTexImageARB GLEW_GET_FUN(__glewGetnCompressedTexImageARB)
+#define glGetnConvolutionFilterARB GLEW_GET_FUN(__glewGetnConvolutionFilterARB)
+#define glGetnHistogramARB GLEW_GET_FUN(__glewGetnHistogramARB)
+#define glGetnMapdvARB GLEW_GET_FUN(__glewGetnMapdvARB)
+#define glGetnMapfvARB GLEW_GET_FUN(__glewGetnMapfvARB)
+#define glGetnMapivARB GLEW_GET_FUN(__glewGetnMapivARB)
+#define glGetnMinmaxARB GLEW_GET_FUN(__glewGetnMinmaxARB)
+#define glGetnPixelMapfvARB GLEW_GET_FUN(__glewGetnPixelMapfvARB)
+#define glGetnPixelMapuivARB GLEW_GET_FUN(__glewGetnPixelMapuivARB)
+#define glGetnPixelMapusvARB GLEW_GET_FUN(__glewGetnPixelMapusvARB)
+#define glGetnPolygonStippleARB GLEW_GET_FUN(__glewGetnPolygonStippleARB)
+#define glGetnSeparableFilterARB GLEW_GET_FUN(__glewGetnSeparableFilterARB)
+#define glGetnTexImageARB GLEW_GET_FUN(__glewGetnTexImageARB)
+#define glGetnUniformdvARB GLEW_GET_FUN(__glewGetnUniformdvARB)
+#define glGetnUniformfvARB GLEW_GET_FUN(__glewGetnUniformfvARB)
+#define glGetnUniformivARB GLEW_GET_FUN(__glewGetnUniformivARB)
+#define glGetnUniformuivARB GLEW_GET_FUN(__glewGetnUniformuivARB)
+#define glReadnPixelsARB GLEW_GET_FUN(__glewReadnPixelsARB)
+
+#define GLEW_ARB_robustness GLEW_GET_VAR(__GLEW_ARB_robustness)
+
+#endif /* GL_ARB_robustness */
+
+/* ------------------------- GL_ARB_sample_shading ------------------------- */
+
+#ifndef GL_ARB_sample_shading
+#define GL_ARB_sample_shading 1
+
+#define GL_SAMPLE_SHADING_ARB 0x8C36
+#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37
+
+typedef void (GLAPIENTRY * PFNGLMINSAMPLESHADINGARBPROC) (GLclampf value);
+
+#define glMinSampleShadingARB GLEW_GET_FUN(__glewMinSampleShadingARB)
+
+#define GLEW_ARB_sample_shading GLEW_GET_VAR(__GLEW_ARB_sample_shading)
+
+#endif /* GL_ARB_sample_shading */
+
+/* ------------------------- GL_ARB_sampler_objects ------------------------ */
+
+#ifndef GL_ARB_sampler_objects
+#define GL_ARB_sampler_objects 1
+
+#define GL_SAMPLER_BINDING 0x8919
+
+typedef void (GLAPIENTRY * PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
+typedef void (GLAPIENTRY * PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint * samplers);
+typedef void (GLAPIENTRY * PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint* samplers);
+typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISSAMPLERPROC) (GLuint sampler);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint* params);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint* params);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
+typedef void (GLAPIENTRY * PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint* params);
+
+#define glBindSampler GLEW_GET_FUN(__glewBindSampler)
+#define glDeleteSamplers GLEW_GET_FUN(__glewDeleteSamplers)
+#define glGenSamplers GLEW_GET_FUN(__glewGenSamplers)
+#define glGetSamplerParameterIiv GLEW_GET_FUN(__glewGetSamplerParameterIiv)
+#define glGetSamplerParameterIuiv GLEW_GET_FUN(__glewGetSamplerParameterIuiv)
+#define glGetSamplerParameterfv GLEW_GET_FUN(__glewGetSamplerParameterfv)
+#define glGetSamplerParameteriv GLEW_GET_FUN(__glewGetSamplerParameteriv)
+#define glIsSampler GLEW_GET_FUN(__glewIsSampler)
+#define glSamplerParameterIiv GLEW_GET_FUN(__glewSamplerParameterIiv)
+#define glSamplerParameterIuiv GLEW_GET_FUN(__glewSamplerParameterIuiv)
+#define glSamplerParameterf GLEW_GET_FUN(__glewSamplerParameterf)
+#define glSamplerParameterfv GLEW_GET_FUN(__glewSamplerParameterfv)
+#define glSamplerParameteri GLEW_GET_FUN(__glewSamplerParameteri)
+#define glSamplerParameteriv GLEW_GET_FUN(__glewSamplerParameteriv)
+
+#define GLEW_ARB_sampler_objects GLEW_GET_VAR(__GLEW_ARB_sampler_objects)
+
+#endif /* GL_ARB_sampler_objects */
+
+/* ------------------------ GL_ARB_seamless_cube_map ----------------------- */
+
+#ifndef GL_ARB_seamless_cube_map
+#define GL_ARB_seamless_cube_map 1
+
+#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
+
+#define GLEW_ARB_seamless_cube_map GLEW_GET_VAR(__GLEW_ARB_seamless_cube_map)
+
+#endif /* GL_ARB_seamless_cube_map */
+
+/* --------------------- GL_ARB_separate_shader_objects -------------------- */
+
+#ifndef GL_ARB_separate_shader_objects
+#define GL_ARB_separate_shader_objects 1
+
+#define GL_VERTEX_SHADER_BIT 0x00000001
+#define GL_FRAGMENT_SHADER_BIT 0x00000002
+#define GL_GEOMETRY_SHADER_BIT 0x00000004
+#define GL_TESS_CONTROL_SHADER_BIT 0x00000008
+#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010
+#define GL_PROGRAM_SEPARABLE 0x8258
+#define GL_ACTIVE_PROGRAM 0x8259
+#define GL_PROGRAM_PIPELINE_BINDING 0x825A
+#define GL_ALL_SHADER_BITS 0xFFFFFFFF
+
+typedef void (GLAPIENTRY * PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program);
+typedef void (GLAPIENTRY * PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const char ** strings);
+typedef void (GLAPIENTRY * PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint* pipelines);
+typedef void (GLAPIENTRY * PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint* pipelines);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei* length, char *infoLog);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint x, GLint y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint x, GLuint y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint x, GLint y, GLint z, GLint w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint x, GLuint y, GLuint z, GLuint w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
+typedef void (GLAPIENTRY * PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program);
+typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline);
+
+#define glActiveShaderProgram GLEW_GET_FUN(__glewActiveShaderProgram)
+#define glBindProgramPipeline GLEW_GET_FUN(__glewBindProgramPipeline)
+#define glCreateShaderProgramv GLEW_GET_FUN(__glewCreateShaderProgramv)
+#define glDeleteProgramPipelines GLEW_GET_FUN(__glewDeleteProgramPipelines)
+#define glGenProgramPipelines GLEW_GET_FUN(__glewGenProgramPipelines)
+#define glGetProgramPipelineInfoLog GLEW_GET_FUN(__glewGetProgramPipelineInfoLog)
+#define glGetProgramPipelineiv GLEW_GET_FUN(__glewGetProgramPipelineiv)
+#define glIsProgramPipeline GLEW_GET_FUN(__glewIsProgramPipeline)
+#define glProgramUniform1d GLEW_GET_FUN(__glewProgramUniform1d)
+#define glProgramUniform1dv GLEW_GET_FUN(__glewProgramUniform1dv)
+#define glProgramUniform1f GLEW_GET_FUN(__glewProgramUniform1f)
+#define glProgramUniform1fv GLEW_GET_FUN(__glewProgramUniform1fv)
+#define glProgramUniform1i GLEW_GET_FUN(__glewProgramUniform1i)
+#define glProgramUniform1iv GLEW_GET_FUN(__glewProgramUniform1iv)
+#define glProgramUniform1ui GLEW_GET_FUN(__glewProgramUniform1ui)
+#define glProgramUniform1uiv GLEW_GET_FUN(__glewProgramUniform1uiv)
+#define glProgramUniform2d GLEW_GET_FUN(__glewProgramUniform2d)
+#define glProgramUniform2dv GLEW_GET_FUN(__glewProgramUniform2dv)
+#define glProgramUniform2f GLEW_GET_FUN(__glewProgramUniform2f)
+#define glProgramUniform2fv GLEW_GET_FUN(__glewProgramUniform2fv)
+#define glProgramUniform2i GLEW_GET_FUN(__glewProgramUniform2i)
+#define glProgramUniform2iv GLEW_GET_FUN(__glewProgramUniform2iv)
+#define glProgramUniform2ui GLEW_GET_FUN(__glewProgramUniform2ui)
+#define glProgramUniform2uiv GLEW_GET_FUN(__glewProgramUniform2uiv)
+#define glProgramUniform3d GLEW_GET_FUN(__glewProgramUniform3d)
+#define glProgramUniform3dv GLEW_GET_FUN(__glewProgramUniform3dv)
+#define glProgramUniform3f GLEW_GET_FUN(__glewProgramUniform3f)
+#define glProgramUniform3fv GLEW_GET_FUN(__glewProgramUniform3fv)
+#define glProgramUniform3i GLEW_GET_FUN(__glewProgramUniform3i)
+#define glProgramUniform3iv GLEW_GET_FUN(__glewProgramUniform3iv)
+#define glProgramUniform3ui GLEW_GET_FUN(__glewProgramUniform3ui)
+#define glProgramUniform3uiv GLEW_GET_FUN(__glewProgramUniform3uiv)
+#define glProgramUniform4d GLEW_GET_FUN(__glewProgramUniform4d)
+#define glProgramUniform4dv GLEW_GET_FUN(__glewProgramUniform4dv)
+#define glProgramUniform4f GLEW_GET_FUN(__glewProgramUniform4f)
+#define glProgramUniform4fv GLEW_GET_FUN(__glewProgramUniform4fv)
+#define glProgramUniform4i GLEW_GET_FUN(__glewProgramUniform4i)
+#define glProgramUniform4iv GLEW_GET_FUN(__glewProgramUniform4iv)
+#define glProgramUniform4ui GLEW_GET_FUN(__glewProgramUniform4ui)
+#define glProgramUniform4uiv GLEW_GET_FUN(__glewProgramUniform4uiv)
+#define glProgramUniformMatrix2dv GLEW_GET_FUN(__glewProgramUniformMatrix2dv)
+#define glProgramUniformMatrix2fv GLEW_GET_FUN(__glewProgramUniformMatrix2fv)
+#define glProgramUniformMatrix2x3dv GLEW_GET_FUN(__glewProgramUniformMatrix2x3dv)
+#define glProgramUniformMatrix2x3fv GLEW_GET_FUN(__glewProgramUniformMatrix2x3fv)
+#define glProgramUniformMatrix2x4dv GLEW_GET_FUN(__glewProgramUniformMatrix2x4dv)
+#define glProgramUniformMatrix2x4fv GLEW_GET_FUN(__glewProgramUniformMatrix2x4fv)
+#define glProgramUniformMatrix3dv GLEW_GET_FUN(__glewProgramUniformMatrix3dv)
+#define glProgramUniformMatrix3fv GLEW_GET_FUN(__glewProgramUniformMatrix3fv)
+#define glProgramUniformMatrix3x2dv GLEW_GET_FUN(__glewProgramUniformMatrix3x2dv)
+#define glProgramUniformMatrix3x2fv GLEW_GET_FUN(__glewProgramUniformMatrix3x2fv)
+#define glProgramUniformMatrix3x4dv GLEW_GET_FUN(__glewProgramUniformMatrix3x4dv)
+#define glProgramUniformMatrix3x4fv GLEW_GET_FUN(__glewProgramUniformMatrix3x4fv)
+#define glProgramUniformMatrix4dv GLEW_GET_FUN(__glewProgramUniformMatrix4dv)
+#define glProgramUniformMatrix4fv GLEW_GET_FUN(__glewProgramUniformMatrix4fv)
+#define glProgramUniformMatrix4x2dv GLEW_GET_FUN(__glewProgramUniformMatrix4x2dv)
+#define glProgramUniformMatrix4x2fv GLEW_GET_FUN(__glewProgramUniformMatrix4x2fv)
+#define glProgramUniformMatrix4x3dv GLEW_GET_FUN(__glewProgramUniformMatrix4x3dv)
+#define glProgramUniformMatrix4x3fv GLEW_GET_FUN(__glewProgramUniformMatrix4x3fv)
+#define glUseProgramStages GLEW_GET_FUN(__glewUseProgramStages)
+#define glValidateProgramPipeline GLEW_GET_FUN(__glewValidateProgramPipeline)
+
+#define GLEW_ARB_separate_shader_objects GLEW_GET_VAR(__GLEW_ARB_separate_shader_objects)
+
+#endif /* GL_ARB_separate_shader_objects */
+
+/* ----------------------- GL_ARB_shader_bit_encoding ---------------------- */
+
+#ifndef GL_ARB_shader_bit_encoding
+#define GL_ARB_shader_bit_encoding 1
+
+#define GLEW_ARB_shader_bit_encoding GLEW_GET_VAR(__GLEW_ARB_shader_bit_encoding)
+
+#endif /* GL_ARB_shader_bit_encoding */
+
/* ------------------------- GL_ARB_shader_objects ------------------------- */
#ifndef GL_ARB_shader_objects
@@ -3379,6 +4537,70 @@ typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj)
#endif /* GL_ARB_shader_objects */
+/* ------------------------ GL_ARB_shader_precision ------------------------ */
+
+#ifndef GL_ARB_shader_precision
+#define GL_ARB_shader_precision 1
+
+#define GLEW_ARB_shader_precision GLEW_GET_VAR(__GLEW_ARB_shader_precision)
+
+#endif /* GL_ARB_shader_precision */
+
+/* ---------------------- GL_ARB_shader_stencil_export --------------------- */
+
+#ifndef GL_ARB_shader_stencil_export
+#define GL_ARB_shader_stencil_export 1
+
+#define GLEW_ARB_shader_stencil_export GLEW_GET_VAR(__GLEW_ARB_shader_stencil_export)
+
+#endif /* GL_ARB_shader_stencil_export */
+
+/* ------------------------ GL_ARB_shader_subroutine ----------------------- */
+
+#ifndef GL_ARB_shader_subroutine
+#define GL_ARB_shader_subroutine 1
+
+#define GL_ACTIVE_SUBROUTINES 0x8DE5
+#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6
+#define GL_MAX_SUBROUTINES 0x8DE7
+#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8
+#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47
+#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48
+#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49
+#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A
+#define GL_COMPATIBLE_SUBROUTINES 0x8E4B
+
+typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, char *name);
+typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufsize, GLsizei* length, char *name);
+typedef void (GLAPIENTRY * PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint* values);
+typedef void (GLAPIENTRY * PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint* values);
+typedef GLuint (GLAPIENTRY * PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const char* name);
+typedef GLint (GLAPIENTRY * PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const char* name);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint* params);
+typedef void (GLAPIENTRY * PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint* indices);
+
+#define glGetActiveSubroutineName GLEW_GET_FUN(__glewGetActiveSubroutineName)
+#define glGetActiveSubroutineUniformName GLEW_GET_FUN(__glewGetActiveSubroutineUniformName)
+#define glGetActiveSubroutineUniformiv GLEW_GET_FUN(__glewGetActiveSubroutineUniformiv)
+#define glGetProgramStageiv GLEW_GET_FUN(__glewGetProgramStageiv)
+#define glGetSubroutineIndex GLEW_GET_FUN(__glewGetSubroutineIndex)
+#define glGetSubroutineUniformLocation GLEW_GET_FUN(__glewGetSubroutineUniformLocation)
+#define glGetUniformSubroutineuiv GLEW_GET_FUN(__glewGetUniformSubroutineuiv)
+#define glUniformSubroutinesuiv GLEW_GET_FUN(__glewUniformSubroutinesuiv)
+
+#define GLEW_ARB_shader_subroutine GLEW_GET_VAR(__GLEW_ARB_shader_subroutine)
+
+#endif /* GL_ARB_shader_subroutine */
+
+/* ----------------------- GL_ARB_shader_texture_lod ----------------------- */
+
+#ifndef GL_ARB_shader_texture_lod
+#define GL_ARB_shader_texture_lod 1
+
+#define GLEW_ARB_shader_texture_lod GLEW_GET_VAR(__GLEW_ARB_shader_texture_lod)
+
+#endif /* GL_ARB_shader_texture_lod */
+
/* ---------------------- GL_ARB_shading_language_100 ---------------------- */
#ifndef GL_ARB_shading_language_100
@@ -3390,6 +4612,33 @@ typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj)
#endif /* GL_ARB_shading_language_100 */
+/* -------------------- GL_ARB_shading_language_include -------------------- */
+
+#ifndef GL_ARB_shading_language_include
+#define GL_ARB_shading_language_include 1
+
+#define GL_SHADER_INCLUDE_ARB 0x8DAE
+#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9
+#define GL_NAMED_STRING_TYPE_ARB 0x8DEA
+
+typedef void (GLAPIENTRY * PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const char ** path, const GLint *length);
+typedef void (GLAPIENTRY * PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const char* name);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const char* name, GLsizei bufSize, GLint *stringlen, char *string);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const char* name, GLenum pname, GLint *params);
+typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const char* name);
+typedef void (GLAPIENTRY * PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const char* name, GLint stringlen, const char *string);
+
+#define glCompileShaderIncludeARB GLEW_GET_FUN(__glewCompileShaderIncludeARB)
+#define glDeleteNamedStringARB GLEW_GET_FUN(__glewDeleteNamedStringARB)
+#define glGetNamedStringARB GLEW_GET_FUN(__glewGetNamedStringARB)
+#define glGetNamedStringivARB GLEW_GET_FUN(__glewGetNamedStringivARB)
+#define glIsNamedStringARB GLEW_GET_FUN(__glewIsNamedStringARB)
+#define glNamedStringARB GLEW_GET_FUN(__glewNamedStringARB)
+
+#define GLEW_ARB_shading_language_include GLEW_GET_VAR(__GLEW_ARB_shading_language_include)
+
+#endif /* GL_ARB_shading_language_include */
+
/* ----------------------------- GL_ARB_shadow ----------------------------- */
#ifndef GL_ARB_shadow
@@ -3414,6 +4663,95 @@ typedef void (GLAPIENTRY * PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj)
#endif /* GL_ARB_shadow_ambient */
+/* ------------------------------ GL_ARB_sync ------------------------------ */
+
+#ifndef GL_ARB_sync
+#define GL_ARB_sync 1
+
+#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001
+#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111
+#define GL_OBJECT_TYPE 0x9112
+#define GL_SYNC_CONDITION 0x9113
+#define GL_SYNC_STATUS 0x9114
+#define GL_SYNC_FLAGS 0x9115
+#define GL_SYNC_FENCE 0x9116
+#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117
+#define GL_UNSIGNALED 0x9118
+#define GL_SIGNALED 0x9119
+#define GL_ALREADY_SIGNALED 0x911A
+#define GL_TIMEOUT_EXPIRED 0x911B
+#define GL_CONDITION_SATISFIED 0x911C
+#define GL_WAIT_FAILED 0x911D
+#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF
+
+typedef GLenum (GLAPIENTRY * PFNGLCLIENTWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout);
+typedef void (GLAPIENTRY * PFNGLDELETESYNCPROC) (GLsync GLsync);
+typedef GLsync (GLAPIENTRY * PFNGLFENCESYNCPROC) (GLenum condition,GLbitfield flags);
+typedef void (GLAPIENTRY * PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64* params);
+typedef void (GLAPIENTRY * PFNGLGETSYNCIVPROC) (GLsync GLsync,GLenum pname,GLsizei bufSize,GLsizei* length, GLint *values);
+typedef GLboolean (GLAPIENTRY * PFNGLISSYNCPROC) (GLsync GLsync);
+typedef void (GLAPIENTRY * PFNGLWAITSYNCPROC) (GLsync GLsync,GLbitfield flags,GLuint64 timeout);
+
+#define glClientWaitSync GLEW_GET_FUN(__glewClientWaitSync)
+#define glDeleteSync GLEW_GET_FUN(__glewDeleteSync)
+#define glFenceSync GLEW_GET_FUN(__glewFenceSync)
+#define glGetInteger64v GLEW_GET_FUN(__glewGetInteger64v)
+#define glGetSynciv GLEW_GET_FUN(__glewGetSynciv)
+#define glIsSync GLEW_GET_FUN(__glewIsSync)
+#define glWaitSync GLEW_GET_FUN(__glewWaitSync)
+
+#define GLEW_ARB_sync GLEW_GET_VAR(__GLEW_ARB_sync)
+
+#endif /* GL_ARB_sync */
+
+/* ----------------------- GL_ARB_tessellation_shader ---------------------- */
+
+#ifndef GL_ARB_tessellation_shader
+#define GL_ARB_tessellation_shader 1
+
+#define GL_PATCHES 0xE
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1
+#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C
+#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D
+#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E
+#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F
+#define GL_PATCH_VERTICES 0x8E72
+#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73
+#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74
+#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75
+#define GL_TESS_GEN_MODE 0x8E76
+#define GL_TESS_GEN_SPACING 0x8E77
+#define GL_TESS_GEN_VERTEX_ORDER 0x8E78
+#define GL_TESS_GEN_POINT_MODE 0x8E79
+#define GL_ISOLINES 0x8E7A
+#define GL_FRACTIONAL_ODD 0x8E7B
+#define GL_FRACTIONAL_EVEN 0x8E7C
+#define GL_MAX_PATCH_VERTICES 0x8E7D
+#define GL_MAX_TESS_GEN_LEVEL 0x8E7E
+#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F
+#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80
+#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81
+#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82
+#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83
+#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84
+#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85
+#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86
+#define GL_TESS_EVALUATION_SHADER 0x8E87
+#define GL_TESS_CONTROL_SHADER 0x8E88
+#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89
+#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A
+
+typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat* values);
+typedef void (GLAPIENTRY * PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value);
+
+#define glPatchParameterfv GLEW_GET_FUN(__glewPatchParameterfv)
+#define glPatchParameteri GLEW_GET_FUN(__glewPatchParameteri)
+
+#define GLEW_ARB_tessellation_shader GLEW_GET_VAR(__GLEW_ARB_tessellation_shader)
+
+#endif /* GL_ARB_tessellation_shader */
+
/* ---------------------- GL_ARB_texture_border_clamp ---------------------- */
#ifndef GL_ARB_texture_border_clamp
@@ -3444,6 +4782,15 @@ typedef void (GLAPIENTRY * PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum interna
#endif /* GL_ARB_texture_buffer_object */
+/* ------------------- GL_ARB_texture_buffer_object_rgb32 ------------------ */
+
+#ifndef GL_ARB_texture_buffer_object_rgb32
+#define GL_ARB_texture_buffer_object_rgb32 1
+
+#define GLEW_ARB_texture_buffer_object_rgb32 GLEW_GET_VAR(__GLEW_ARB_texture_buffer_object_rgb32)
+
+#endif /* GL_ARB_texture_buffer_object_rgb32 */
+
/* ----------------------- GL_ARB_texture_compression ---------------------- */
#ifndef GL_ARB_texture_compression
@@ -3481,6 +4828,20 @@ typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GL
#endif /* GL_ARB_texture_compression */
+/* -------------------- GL_ARB_texture_compression_bptc -------------------- */
+
+#ifndef GL_ARB_texture_compression_bptc
+#define GL_ARB_texture_compression_bptc 1
+
+#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C
+#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D
+#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E
+#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F
+
+#define GLEW_ARB_texture_compression_bptc GLEW_GET_VAR(__GLEW_ARB_texture_compression_bptc)
+
+#endif /* GL_ARB_texture_compression_bptc */
+
/* -------------------- GL_ARB_texture_compression_rgtc -------------------- */
#ifndef GL_ARB_texture_compression_rgtc
@@ -3517,6 +4878,23 @@ typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GL
#endif /* GL_ARB_texture_cube_map */
+/* --------------------- GL_ARB_texture_cube_map_array --------------------- */
+
+#ifndef GL_ARB_texture_cube_map_array
+#define GL_ARB_texture_cube_map_array 1
+
+#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009
+#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A
+#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B
+#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C
+#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D
+#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E
+#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F
+
+#define GLEW_ARB_texture_cube_map_array GLEW_GET_VAR(__GLEW_ARB_texture_cube_map_array)
+
+#endif /* GL_ARB_texture_cube_map_array */
+
/* ------------------------- GL_ARB_texture_env_add ------------------------ */
#ifndef GL_ARB_texture_env_add
@@ -3609,6 +4987,19 @@ typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GL
#endif /* GL_ARB_texture_float */
+/* ------------------------- GL_ARB_texture_gather ------------------------- */
+
+#ifndef GL_ARB_texture_gather
+#define GL_ARB_texture_gather 1
+
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F
+
+#define GLEW_ARB_texture_gather GLEW_GET_VAR(__GLEW_ARB_texture_gather)
+
+#endif /* GL_ARB_texture_gather */
+
/* --------------------- GL_ARB_texture_mirrored_repeat -------------------- */
#ifndef GL_ARB_texture_mirrored_repeat
@@ -3620,6 +5011,47 @@ typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GL
#endif /* GL_ARB_texture_mirrored_repeat */
+/* ----------------------- GL_ARB_texture_multisample ---------------------- */
+
+#ifndef GL_ARB_texture_multisample
+#define GL_ARB_texture_multisample 1
+
+#define GL_SAMPLE_POSITION 0x8E50
+#define GL_SAMPLE_MASK 0x8E51
+#define GL_SAMPLE_MASK_VALUE 0x8E52
+#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59
+#define GL_TEXTURE_2D_MULTISAMPLE 0x9100
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101
+#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102
+#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
+#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
+#define GL_TEXTURE_SAMPLES 0x9106
+#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
+#define GL_SAMPLER_2D_MULTISAMPLE 0x9108
+#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
+#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B
+#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
+#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
+#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E
+#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F
+#define GL_MAX_INTEGER_SAMPLES 0x9110
+
+typedef void (GLAPIENTRY * PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat* val);
+typedef void (GLAPIENTRY * PFNGLSAMPLEMASKIPROC) (GLuint index, GLbitfield mask);
+typedef void (GLAPIENTRY * PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations);
+typedef void (GLAPIENTRY * PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations);
+
+#define glGetMultisamplefv GLEW_GET_FUN(__glewGetMultisamplefv)
+#define glSampleMaski GLEW_GET_FUN(__glewSampleMaski)
+#define glTexImage2DMultisample GLEW_GET_FUN(__glewTexImage2DMultisample)
+#define glTexImage3DMultisample GLEW_GET_FUN(__glewTexImage3DMultisample)
+
+#define GLEW_ARB_texture_multisample GLEW_GET_VAR(__GLEW_ARB_texture_multisample)
+
+#endif /* GL_ARB_texture_multisample */
+
/* -------------------- GL_ARB_texture_non_power_of_two -------------------- */
#ifndef GL_ARB_texture_non_power_of_two
@@ -3629,6 +5061,15 @@ typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GL
#endif /* GL_ARB_texture_non_power_of_two */
+/* ------------------------ GL_ARB_texture_query_lod ----------------------- */
+
+#ifndef GL_ARB_texture_query_lod
+#define GL_ARB_texture_query_lod 1
+
+#define GLEW_ARB_texture_query_lod GLEW_GET_VAR(__GLEW_ARB_texture_query_lod)
+
+#endif /* GL_ARB_texture_query_lod */
+
/* ------------------------ GL_ARB_texture_rectangle ----------------------- */
#ifndef GL_ARB_texture_rectangle
@@ -3651,6 +5092,8 @@ typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GL
#define GL_ARB_texture_rg 1
#define GL_RED 0x1903
+#define GL_COMPRESSED_RED 0x8225
+#define GL_COMPRESSED_RG 0x8226
#define GL_RG 0x8227
#define GL_RG_INTEGER 0x8228
#define GL_R8 0x8229
@@ -3678,6 +5121,104 @@ typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GL
#endif /* GL_ARB_texture_rg */
+/* ----------------------- GL_ARB_texture_rgb10_a2ui ----------------------- */
+
+#ifndef GL_ARB_texture_rgb10_a2ui
+#define GL_ARB_texture_rgb10_a2ui 1
+
+#define GL_RGB10_A2UI 0x906F
+
+#define GLEW_ARB_texture_rgb10_a2ui GLEW_GET_VAR(__GLEW_ARB_texture_rgb10_a2ui)
+
+#endif /* GL_ARB_texture_rgb10_a2ui */
+
+/* ------------------------- GL_ARB_texture_swizzle ------------------------ */
+
+#ifndef GL_ARB_texture_swizzle
+#define GL_ARB_texture_swizzle 1
+
+#define GL_TEXTURE_SWIZZLE_R 0x8E42
+#define GL_TEXTURE_SWIZZLE_G 0x8E43
+#define GL_TEXTURE_SWIZZLE_B 0x8E44
+#define GL_TEXTURE_SWIZZLE_A 0x8E45
+#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46
+
+#define GLEW_ARB_texture_swizzle GLEW_GET_VAR(__GLEW_ARB_texture_swizzle)
+
+#endif /* GL_ARB_texture_swizzle */
+
+/* --------------------------- GL_ARB_timer_query -------------------------- */
+
+#ifndef GL_ARB_timer_query
+#define GL_ARB_timer_query 1
+
+#define GL_TIME_ELAPSED 0x88BF
+#define GL_TIMESTAMP 0x8E28
+
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64* params);
+typedef void (GLAPIENTRY * PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64* params);
+typedef void (GLAPIENTRY * PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target);
+
+#define glGetQueryObjecti64v GLEW_GET_FUN(__glewGetQueryObjecti64v)
+#define glGetQueryObjectui64v GLEW_GET_FUN(__glewGetQueryObjectui64v)
+#define glQueryCounter GLEW_GET_FUN(__glewQueryCounter)
+
+#define GLEW_ARB_timer_query GLEW_GET_VAR(__GLEW_ARB_timer_query)
+
+#endif /* GL_ARB_timer_query */
+
+/* ----------------------- GL_ARB_transform_feedback2 ---------------------- */
+
+#ifndef GL_ARB_transform_feedback2
+#define GL_ARB_transform_feedback2 1
+
+#define GL_TRANSFORM_FEEDBACK 0x8E22
+#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23
+#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25
+
+typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id);
+typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint* ids);
+typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKPROC) (void);
+typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKPROC) (void);
+
+#define glBindTransformFeedback GLEW_GET_FUN(__glewBindTransformFeedback)
+#define glDeleteTransformFeedbacks GLEW_GET_FUN(__glewDeleteTransformFeedbacks)
+#define glDrawTransformFeedback GLEW_GET_FUN(__glewDrawTransformFeedback)
+#define glGenTransformFeedbacks GLEW_GET_FUN(__glewGenTransformFeedbacks)
+#define glIsTransformFeedback GLEW_GET_FUN(__glewIsTransformFeedback)
+#define glPauseTransformFeedback GLEW_GET_FUN(__glewPauseTransformFeedback)
+#define glResumeTransformFeedback GLEW_GET_FUN(__glewResumeTransformFeedback)
+
+#define GLEW_ARB_transform_feedback2 GLEW_GET_VAR(__GLEW_ARB_transform_feedback2)
+
+#endif /* GL_ARB_transform_feedback2 */
+
+/* ----------------------- GL_ARB_transform_feedback3 ---------------------- */
+
+#ifndef GL_ARB_transform_feedback3
+#define GL_ARB_transform_feedback3 1
+
+#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70
+#define GL_MAX_VERTEX_STREAMS 0x8E71
+
+typedef void (GLAPIENTRY * PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id);
+typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream);
+typedef void (GLAPIENTRY * PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index);
+typedef void (GLAPIENTRY * PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint* params);
+
+#define glBeginQueryIndexed GLEW_GET_FUN(__glewBeginQueryIndexed)
+#define glDrawTransformFeedbackStream GLEW_GET_FUN(__glewDrawTransformFeedbackStream)
+#define glEndQueryIndexed GLEW_GET_FUN(__glewEndQueryIndexed)
+#define glGetQueryIndexediv GLEW_GET_FUN(__glewGetQueryIndexediv)
+
+#define GLEW_ARB_transform_feedback3 GLEW_GET_VAR(__GLEW_ARB_transform_feedback3)
+
+#endif /* GL_ARB_transform_feedback3 */
+
/* ------------------------ GL_ARB_transpose_matrix ------------------------ */
#ifndef GL_ARB_transpose_matrix
@@ -3702,6 +5243,82 @@ typedef void (GLAPIENTRY * PFNGLMULTTRANSPOSEMATRIXFARBPROC) (GLfloat m[16]);
#endif /* GL_ARB_transpose_matrix */
+/* ---------------------- GL_ARB_uniform_buffer_object --------------------- */
+
+#ifndef GL_ARB_uniform_buffer_object
+#define GL_ARB_uniform_buffer_object 1
+
+#define GL_UNIFORM_BUFFER 0x8A11
+#define GL_UNIFORM_BUFFER_BINDING 0x8A28
+#define GL_UNIFORM_BUFFER_START 0x8A29
+#define GL_UNIFORM_BUFFER_SIZE 0x8A2A
+#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B
+#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C
+#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D
+#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E
+#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F
+#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30
+#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31
+#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32
+#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33
+#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34
+#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35
+#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36
+#define GL_UNIFORM_TYPE 0x8A37
+#define GL_UNIFORM_SIZE 0x8A38
+#define GL_UNIFORM_NAME_LENGTH 0x8A39
+#define GL_UNIFORM_BLOCK_INDEX 0x8A3A
+#define GL_UNIFORM_OFFSET 0x8A3B
+#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C
+#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D
+#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E
+#define GL_UNIFORM_BLOCK_BINDING 0x8A3F
+#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40
+#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42
+#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45
+#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46
+#define GL_INVALID_INDEX 0xFFFFFFFF
+
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, char* uniformBlockName);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei* length, char* uniformName);
+typedef void (GLAPIENTRY * PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint* data);
+typedef GLuint (GLAPIENTRY * PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const char* uniformBlockName);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const char** uniformNames, GLuint* uniformIndices);
+typedef void (GLAPIENTRY * PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
+
+#define glBindBufferBase GLEW_GET_FUN(__glewBindBufferBase)
+#define glBindBufferRange GLEW_GET_FUN(__glewBindBufferRange)
+#define glGetActiveUniformBlockName GLEW_GET_FUN(__glewGetActiveUniformBlockName)
+#define glGetActiveUniformBlockiv GLEW_GET_FUN(__glewGetActiveUniformBlockiv)
+#define glGetActiveUniformName GLEW_GET_FUN(__glewGetActiveUniformName)
+#define glGetActiveUniformsiv GLEW_GET_FUN(__glewGetActiveUniformsiv)
+#define glGetIntegeri_v GLEW_GET_FUN(__glewGetIntegeri_v)
+#define glGetUniformBlockIndex GLEW_GET_FUN(__glewGetUniformBlockIndex)
+#define glGetUniformIndices GLEW_GET_FUN(__glewGetUniformIndices)
+#define glUniformBlockBinding GLEW_GET_FUN(__glewUniformBlockBinding)
+
+#define GLEW_ARB_uniform_buffer_object GLEW_GET_VAR(__GLEW_ARB_uniform_buffer_object)
+
+#endif /* GL_ARB_uniform_buffer_object */
+
+/* ------------------------ GL_ARB_vertex_array_bgra ----------------------- */
+
+#ifndef GL_ARB_vertex_array_bgra
+#define GL_ARB_vertex_array_bgra 1
+
+#define GL_BGRA 0x80E1
+
+#define GLEW_ARB_vertex_array_bgra GLEW_GET_VAR(__GLEW_ARB_vertex_array_bgra)
+
+#endif /* GL_ARB_vertex_array_bgra */
+
/* ----------------------- GL_ARB_vertex_array_object ---------------------- */
#ifndef GL_ARB_vertex_array_object
@@ -3723,6 +5340,44 @@ typedef GLboolean (GLAPIENTRY * PFNGLISVERTEXARRAYPROC) (GLuint array);
#endif /* GL_ARB_vertex_array_object */
+/* ----------------------- GL_ARB_vertex_attrib_64bit ---------------------- */
+
+#ifndef GL_ARB_vertex_attrib_64bit
+#define GL_ARB_vertex_attrib_64bit 1
+
+#define GL_DOUBLE_MAT2 0x8F46
+#define GL_DOUBLE_MAT3 0x8F47
+#define GL_DOUBLE_MAT4 0x8F48
+#define GL_DOUBLE_VEC2 0x8FFC
+#define GL_DOUBLE_VEC3 0x8FFD
+#define GL_DOUBLE_VEC4 0x8FFE
+
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);
+
+#define glGetVertexAttribLdv GLEW_GET_FUN(__glewGetVertexAttribLdv)
+#define glVertexAttribL1d GLEW_GET_FUN(__glewVertexAttribL1d)
+#define glVertexAttribL1dv GLEW_GET_FUN(__glewVertexAttribL1dv)
+#define glVertexAttribL2d GLEW_GET_FUN(__glewVertexAttribL2d)
+#define glVertexAttribL2dv GLEW_GET_FUN(__glewVertexAttribL2dv)
+#define glVertexAttribL3d GLEW_GET_FUN(__glewVertexAttribL3d)
+#define glVertexAttribL3dv GLEW_GET_FUN(__glewVertexAttribL3dv)
+#define glVertexAttribL4d GLEW_GET_FUN(__glewVertexAttribL4d)
+#define glVertexAttribL4dv GLEW_GET_FUN(__glewVertexAttribL4dv)
+#define glVertexAttribLPointer GLEW_GET_FUN(__glewVertexAttribLPointer)
+
+#define GLEW_ARB_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_ARB_vertex_attrib_64bit)
+
+#endif /* GL_ARB_vertex_attrib_64bit */
+
/* -------------------------- GL_ARB_vertex_blend -------------------------- */
#ifndef GL_ARB_vertex_blend
@@ -3834,8 +5489,8 @@ typedef void (GLAPIENTRY * PFNGLWEIGHTUSVARBPROC) (GLint size, GLushort *weights
#define GL_DYNAMIC_READ_ARB 0x88E9
#define GL_DYNAMIC_COPY_ARB 0x88EA
-typedef ptrdiff_t GLsizeiptrARB;
typedef ptrdiff_t GLintptrARB;
+typedef ptrdiff_t GLsizeiptrARB;
typedef void (GLAPIENTRY * PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer);
typedef void (GLAPIENTRY * PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const GLvoid* data, GLenum usage);
@@ -4105,6 +5760,141 @@ typedef GLint (GLAPIENTRY * PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programO
#endif /* GL_ARB_vertex_shader */
+/* ------------------- GL_ARB_vertex_type_2_10_10_10_rev ------------------- */
+
+#ifndef GL_ARB_vertex_type_2_10_10_10_rev
+#define GL_ARB_vertex_type_2_10_10_10_rev 1
+
+#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368
+#define GL_INT_2_10_10_10_REV 0x8D9F
+
+typedef void (GLAPIENTRY * PFNGLCOLORP3UIPROC) (GLenum type, GLuint color);
+typedef void (GLAPIENTRY * PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint* color);
+typedef void (GLAPIENTRY * PFNGLCOLORP4UIPROC) (GLenum type, GLuint color);
+typedef void (GLAPIENTRY * PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint* color);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint* color);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint* coords);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint* value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value);
+typedef void (GLAPIENTRY * PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint* value);
+
+#define glColorP3ui GLEW_GET_FUN(__glewColorP3ui)
+#define glColorP3uiv GLEW_GET_FUN(__glewColorP3uiv)
+#define glColorP4ui GLEW_GET_FUN(__glewColorP4ui)
+#define glColorP4uiv GLEW_GET_FUN(__glewColorP4uiv)
+#define glMultiTexCoordP1ui GLEW_GET_FUN(__glewMultiTexCoordP1ui)
+#define glMultiTexCoordP1uiv GLEW_GET_FUN(__glewMultiTexCoordP1uiv)
+#define glMultiTexCoordP2ui GLEW_GET_FUN(__glewMultiTexCoordP2ui)
+#define glMultiTexCoordP2uiv GLEW_GET_FUN(__glewMultiTexCoordP2uiv)
+#define glMultiTexCoordP3ui GLEW_GET_FUN(__glewMultiTexCoordP3ui)
+#define glMultiTexCoordP3uiv GLEW_GET_FUN(__glewMultiTexCoordP3uiv)
+#define glMultiTexCoordP4ui GLEW_GET_FUN(__glewMultiTexCoordP4ui)
+#define glMultiTexCoordP4uiv GLEW_GET_FUN(__glewMultiTexCoordP4uiv)
+#define glNormalP3ui GLEW_GET_FUN(__glewNormalP3ui)
+#define glNormalP3uiv GLEW_GET_FUN(__glewNormalP3uiv)
+#define glSecondaryColorP3ui GLEW_GET_FUN(__glewSecondaryColorP3ui)
+#define glSecondaryColorP3uiv GLEW_GET_FUN(__glewSecondaryColorP3uiv)
+#define glTexCoordP1ui GLEW_GET_FUN(__glewTexCoordP1ui)
+#define glTexCoordP1uiv GLEW_GET_FUN(__glewTexCoordP1uiv)
+#define glTexCoordP2ui GLEW_GET_FUN(__glewTexCoordP2ui)
+#define glTexCoordP2uiv GLEW_GET_FUN(__glewTexCoordP2uiv)
+#define glTexCoordP3ui GLEW_GET_FUN(__glewTexCoordP3ui)
+#define glTexCoordP3uiv GLEW_GET_FUN(__glewTexCoordP3uiv)
+#define glTexCoordP4ui GLEW_GET_FUN(__glewTexCoordP4ui)
+#define glTexCoordP4uiv GLEW_GET_FUN(__glewTexCoordP4uiv)
+#define glVertexAttribP1ui GLEW_GET_FUN(__glewVertexAttribP1ui)
+#define glVertexAttribP1uiv GLEW_GET_FUN(__glewVertexAttribP1uiv)
+#define glVertexAttribP2ui GLEW_GET_FUN(__glewVertexAttribP2ui)
+#define glVertexAttribP2uiv GLEW_GET_FUN(__glewVertexAttribP2uiv)
+#define glVertexAttribP3ui GLEW_GET_FUN(__glewVertexAttribP3ui)
+#define glVertexAttribP3uiv GLEW_GET_FUN(__glewVertexAttribP3uiv)
+#define glVertexAttribP4ui GLEW_GET_FUN(__glewVertexAttribP4ui)
+#define glVertexAttribP4uiv GLEW_GET_FUN(__glewVertexAttribP4uiv)
+#define glVertexP2ui GLEW_GET_FUN(__glewVertexP2ui)
+#define glVertexP2uiv GLEW_GET_FUN(__glewVertexP2uiv)
+#define glVertexP3ui GLEW_GET_FUN(__glewVertexP3ui)
+#define glVertexP3uiv GLEW_GET_FUN(__glewVertexP3uiv)
+#define glVertexP4ui GLEW_GET_FUN(__glewVertexP4ui)
+#define glVertexP4uiv GLEW_GET_FUN(__glewVertexP4uiv)
+
+#define GLEW_ARB_vertex_type_2_10_10_10_rev GLEW_GET_VAR(__GLEW_ARB_vertex_type_2_10_10_10_rev)
+
+#endif /* GL_ARB_vertex_type_2_10_10_10_rev */
+
+/* ------------------------- GL_ARB_viewport_array ------------------------- */
+
+#ifndef GL_ARB_viewport_array
+#define GL_ARB_viewport_array 1
+
+#define GL_DEPTH_RANGE 0x0B70
+#define GL_VIEWPORT 0x0BA2
+#define GL_SCISSOR_BOX 0x0C10
+#define GL_SCISSOR_TEST 0x0C11
+#define GL_MAX_VIEWPORTS 0x825B
+#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C
+#define GL_VIEWPORT_BOUNDS_RANGE 0x825D
+#define GL_LAYER_PROVOKING_VERTEX 0x825E
+#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F
+#define GL_UNDEFINED_VERTEX 0x8260
+#define GL_FIRST_VERTEX_CONVENTION 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION 0x8E4E
+#define GL_PROVOKING_VERTEX 0x8E4F
+
+typedef void (GLAPIENTRY * PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLclampd * v);
+typedef void (GLAPIENTRY * PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLclampd n, GLclampd f);
+typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble* data);
+typedef void (GLAPIENTRY * PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat* data);
+typedef void (GLAPIENTRY * PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint * v);
+typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
+typedef void (GLAPIENTRY * PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint * v);
+typedef void (GLAPIENTRY * PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat * v);
+typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+typedef void (GLAPIENTRY * PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat * v);
+
+#define glDepthRangeArrayv GLEW_GET_FUN(__glewDepthRangeArrayv)
+#define glDepthRangeIndexed GLEW_GET_FUN(__glewDepthRangeIndexed)
+#define glGetDoublei_v GLEW_GET_FUN(__glewGetDoublei_v)
+#define glGetFloati_v GLEW_GET_FUN(__glewGetFloati_v)
+#define glScissorArrayv GLEW_GET_FUN(__glewScissorArrayv)
+#define glScissorIndexed GLEW_GET_FUN(__glewScissorIndexed)
+#define glScissorIndexedv GLEW_GET_FUN(__glewScissorIndexedv)
+#define glViewportArrayv GLEW_GET_FUN(__glewViewportArrayv)
+#define glViewportIndexedf GLEW_GET_FUN(__glewViewportIndexedf)
+#define glViewportIndexedfv GLEW_GET_FUN(__glewViewportIndexedfv)
+
+#define GLEW_ARB_viewport_array GLEW_GET_VAR(__GLEW_ARB_viewport_array)
+
+#endif /* GL_ARB_viewport_array */
+
/* --------------------------- GL_ARB_window_pos --------------------------- */
#ifndef GL_ARB_window_pos
@@ -4390,6 +6180,19 @@ typedef void (GLAPIENTRY * PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer);
#endif /* GL_ATI_map_object_buffer */
+/* ----------------------------- GL_ATI_meminfo ---------------------------- */
+
+#ifndef GL_ATI_meminfo
+#define GL_ATI_meminfo 1
+
+#define GL_VBO_FREE_MEMORY_ATI 0x87FB
+#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC
+#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD
+
+#define GLEW_ATI_meminfo GLEW_GET_VAR(__GLEW_ATI_meminfo)
+
+#endif /* GL_ATI_meminfo */
+
/* -------------------------- GL_ATI_pn_triangles -------------------------- */
#ifndef GL_ATI_pn_triangles
@@ -5007,6 +6810,10 @@ typedef void (GLAPIENTRY * PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint
#ifndef GL_EXT_cull_vertex
#define GL_EXT_cull_vertex 1
+#define GL_CULL_VERTEX_EXT 0x81AA
+#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB
+#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC
+
typedef void (GLAPIENTRY * PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble* params);
typedef void (GLAPIENTRY * PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params);
@@ -5068,7 +6875,14 @@ typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, G
typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (GLAPIENTRY * PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);
+typedef void (GLAPIENTRY * PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index);
+typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index);
+typedef void (GLAPIENTRY * PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array);
typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index);
+typedef void (GLAPIENTRY * PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index);
+typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index);
+typedef void (GLAPIENTRY * PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array);
+typedef void (GLAPIENTRY * PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length);
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum* bufs);
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode);
@@ -5076,8 +6890,10 @@ typedef void (GLAPIENTRY * PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit,
typedef void (GLAPIENTRY * PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target);
typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, void* img);
typedef void (GLAPIENTRY * PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, void* img);
-typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum pname, GLuint index, GLdouble* params);
-typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum pname, GLuint index, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat* params);
typedef void (GLAPIENTRY * PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint* param);
typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat* params);
typedef void (GLAPIENTRY * PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint* params);
@@ -5102,7 +6918,8 @@ typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint
typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void* string);
typedef void (GLAPIENTRY * PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint* params);
typedef void (GLAPIENTRY * PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint* params);
-typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum pname, GLuint index, GLvoid** params);
+typedef void (GLAPIENTRY * PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLvoid** params);
+typedef void (GLAPIENTRY * PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, GLvoid** params);
typedef void (GLAPIENTRY * PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void* pixels);
typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat* params);
typedef void (GLAPIENTRY * PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint* params);
@@ -5110,7 +6927,12 @@ typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture,
typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint* params);
typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat* params);
typedef void (GLAPIENTRY * PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint* param);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint* param);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLvoid** param);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, GLvoid** param);
typedef GLvoid * (GLAPIENTRY * PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access);
+typedef GLvoid * (GLAPIENTRY * PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access);
typedef void (GLAPIENTRY * PFNGLMATRIXFRUSTUMEXTPROC) (GLenum matrixMode, GLdouble l, GLdouble r, GLdouble b, GLdouble t, GLdouble n, GLdouble f);
typedef void (GLAPIENTRY * PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum matrixMode);
typedef void (GLAPIENTRY * PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum matrixMode, const GLdouble* m);
@@ -5157,6 +6979,7 @@ typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLen
typedef void (GLAPIENTRY * PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void* data, GLenum usage);
typedef void (GLAPIENTRY * PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void* data);
+typedef void (GLAPIENTRY * PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
typedef void (GLAPIENTRY * PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
@@ -5228,6 +7051,17 @@ typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenu
typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
typedef void (GLAPIENTRY * PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels);
typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset);
#define glBindMultiTextureEXT GLEW_GET_FUN(__glewBindMultiTextureEXT)
#define glCheckNamedFramebufferStatusEXT GLEW_GET_FUN(__glewCheckNamedFramebufferStatusEXT)
@@ -5255,7 +7089,14 @@ typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);
#define glCopyTextureSubImage2DEXT GLEW_GET_FUN(__glewCopyTextureSubImage2DEXT)
#define glCopyTextureSubImage3DEXT GLEW_GET_FUN(__glewCopyTextureSubImage3DEXT)
#define glDisableClientStateIndexedEXT GLEW_GET_FUN(__glewDisableClientStateIndexedEXT)
+#define glDisableClientStateiEXT GLEW_GET_FUN(__glewDisableClientStateiEXT)
+#define glDisableVertexArrayAttribEXT GLEW_GET_FUN(__glewDisableVertexArrayAttribEXT)
+#define glDisableVertexArrayEXT GLEW_GET_FUN(__glewDisableVertexArrayEXT)
#define glEnableClientStateIndexedEXT GLEW_GET_FUN(__glewEnableClientStateIndexedEXT)
+#define glEnableClientStateiEXT GLEW_GET_FUN(__glewEnableClientStateiEXT)
+#define glEnableVertexArrayAttribEXT GLEW_GET_FUN(__glewEnableVertexArrayAttribEXT)
+#define glEnableVertexArrayEXT GLEW_GET_FUN(__glewEnableVertexArrayEXT)
+#define glFlushMappedNamedBufferRangeEXT GLEW_GET_FUN(__glewFlushMappedNamedBufferRangeEXT)
#define glFramebufferDrawBufferEXT GLEW_GET_FUN(__glewFramebufferDrawBufferEXT)
#define glFramebufferDrawBuffersEXT GLEW_GET_FUN(__glewFramebufferDrawBuffersEXT)
#define glFramebufferReadBufferEXT GLEW_GET_FUN(__glewFramebufferReadBufferEXT)
@@ -5264,7 +7105,9 @@ typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);
#define glGetCompressedMultiTexImageEXT GLEW_GET_FUN(__glewGetCompressedMultiTexImageEXT)
#define glGetCompressedTextureImageEXT GLEW_GET_FUN(__glewGetCompressedTextureImageEXT)
#define glGetDoubleIndexedvEXT GLEW_GET_FUN(__glewGetDoubleIndexedvEXT)
+#define glGetDoublei_vEXT GLEW_GET_FUN(__glewGetDoublei_vEXT)
#define glGetFloatIndexedvEXT GLEW_GET_FUN(__glewGetFloatIndexedvEXT)
+#define glGetFloati_vEXT GLEW_GET_FUN(__glewGetFloati_vEXT)
#define glGetFramebufferParameterivEXT GLEW_GET_FUN(__glewGetFramebufferParameterivEXT)
#define glGetMultiTexEnvfvEXT GLEW_GET_FUN(__glewGetMultiTexEnvfvEXT)
#define glGetMultiTexEnvivEXT GLEW_GET_FUN(__glewGetMultiTexEnvivEXT)
@@ -5290,6 +7133,7 @@ typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);
#define glGetNamedProgramivEXT GLEW_GET_FUN(__glewGetNamedProgramivEXT)
#define glGetNamedRenderbufferParameterivEXT GLEW_GET_FUN(__glewGetNamedRenderbufferParameterivEXT)
#define glGetPointerIndexedvEXT GLEW_GET_FUN(__glewGetPointerIndexedvEXT)
+#define glGetPointeri_vEXT GLEW_GET_FUN(__glewGetPointeri_vEXT)
#define glGetTextureImageEXT GLEW_GET_FUN(__glewGetTextureImageEXT)
#define glGetTextureLevelParameterfvEXT GLEW_GET_FUN(__glewGetTextureLevelParameterfvEXT)
#define glGetTextureLevelParameterivEXT GLEW_GET_FUN(__glewGetTextureLevelParameterivEXT)
@@ -5297,7 +7141,12 @@ typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);
#define glGetTextureParameterIuivEXT GLEW_GET_FUN(__glewGetTextureParameterIuivEXT)
#define glGetTextureParameterfvEXT GLEW_GET_FUN(__glewGetTextureParameterfvEXT)
#define glGetTextureParameterivEXT GLEW_GET_FUN(__glewGetTextureParameterivEXT)
+#define glGetVertexArrayIntegeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayIntegeri_vEXT)
+#define glGetVertexArrayIntegervEXT GLEW_GET_FUN(__glewGetVertexArrayIntegervEXT)
+#define glGetVertexArrayPointeri_vEXT GLEW_GET_FUN(__glewGetVertexArrayPointeri_vEXT)
+#define glGetVertexArrayPointervEXT GLEW_GET_FUN(__glewGetVertexArrayPointervEXT)
#define glMapNamedBufferEXT GLEW_GET_FUN(__glewMapNamedBufferEXT)
+#define glMapNamedBufferRangeEXT GLEW_GET_FUN(__glewMapNamedBufferRangeEXT)
#define glMatrixFrustumEXT GLEW_GET_FUN(__glewMatrixFrustumEXT)
#define glMatrixLoadIdentityEXT GLEW_GET_FUN(__glewMatrixLoadIdentityEXT)
#define glMatrixLoadTransposedEXT GLEW_GET_FUN(__glewMatrixLoadTransposedEXT)
@@ -5344,6 +7193,7 @@ typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);
#define glMultiTexSubImage3DEXT GLEW_GET_FUN(__glewMultiTexSubImage3DEXT)
#define glNamedBufferDataEXT GLEW_GET_FUN(__glewNamedBufferDataEXT)
#define glNamedBufferSubDataEXT GLEW_GET_FUN(__glewNamedBufferSubDataEXT)
+#define glNamedCopyBufferSubDataEXT GLEW_GET_FUN(__glewNamedCopyBufferSubDataEXT)
#define glNamedFramebufferRenderbufferEXT GLEW_GET_FUN(__glewNamedFramebufferRenderbufferEXT)
#define glNamedFramebufferTexture1DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture1DEXT)
#define glNamedFramebufferTexture2DEXT GLEW_GET_FUN(__glewNamedFramebufferTexture2DEXT)
@@ -5415,6 +7265,17 @@ typedef GLboolean (GLAPIENTRY * PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer);
#define glTextureSubImage2DEXT GLEW_GET_FUN(__glewTextureSubImage2DEXT)
#define glTextureSubImage3DEXT GLEW_GET_FUN(__glewTextureSubImage3DEXT)
#define glUnmapNamedBufferEXT GLEW_GET_FUN(__glewUnmapNamedBufferEXT)
+#define glVertexArrayColorOffsetEXT GLEW_GET_FUN(__glewVertexArrayColorOffsetEXT)
+#define glVertexArrayEdgeFlagOffsetEXT GLEW_GET_FUN(__glewVertexArrayEdgeFlagOffsetEXT)
+#define glVertexArrayFogCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayFogCoordOffsetEXT)
+#define glVertexArrayIndexOffsetEXT GLEW_GET_FUN(__glewVertexArrayIndexOffsetEXT)
+#define glVertexArrayMultiTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayMultiTexCoordOffsetEXT)
+#define glVertexArrayNormalOffsetEXT GLEW_GET_FUN(__glewVertexArrayNormalOffsetEXT)
+#define glVertexArraySecondaryColorOffsetEXT GLEW_GET_FUN(__glewVertexArraySecondaryColorOffsetEXT)
+#define glVertexArrayTexCoordOffsetEXT GLEW_GET_FUN(__glewVertexArrayTexCoordOffsetEXT)
+#define glVertexArrayVertexAttribIOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribIOffsetEXT)
+#define glVertexArrayVertexAttribOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribOffsetEXT)
+#define glVertexArrayVertexOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexOffsetEXT)
#define GLEW_EXT_direct_state_access GLEW_GET_VAR(__GLEW_EXT_direct_state_access)
@@ -5463,8 +7324,8 @@ typedef void (GLAPIENTRY * PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsi
#ifndef GL_EXT_draw_range_elements
#define GL_EXT_draw_range_elements 1
-#define GL_MAX_ELEMENTS_VERTICES 0x80E8
-#define GL_MAX_ELEMENTS_INDICES 0x80E9
+#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8
+#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9
typedef void (GLAPIENTRY * PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices);
@@ -6002,7 +7863,7 @@ typedef void (GLAPIENTRY * PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mod
#ifndef GL_EXT_multi_draw_arrays
#define GL_EXT_multi_draw_arrays 1
-typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, GLint* first, GLsizei *count, GLsizei primcount);
+typedef void (GLAPIENTRY * PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint* first, const GLsizei *count, GLsizei primcount);
typedef void (GLAPIENTRY * PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, GLsizei* count, GLenum type, const GLvoid **indices, GLsizei primcount);
#define glMultiDrawArraysEXT GLEW_GET_FUN(__glewMultiDrawArraysEXT)
@@ -6197,7 +8058,7 @@ typedef void (GLAPIENTRY * PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target
#define GL_DISTANCE_ATTENUATION_EXT 0x8129
typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param);
-typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat* params);
#define glPointParameterfEXT GLEW_GET_FUN(__glewPointParameterfEXT)
#define glPointParameterfvEXT GLEW_GET_FUN(__glewPointParameterfvEXT)
@@ -6223,6 +8084,24 @@ typedef void (GLAPIENTRY * PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat b
#endif /* GL_EXT_polygon_offset */
+/* ------------------------ GL_EXT_provoking_vertex ------------------------ */
+
+#ifndef GL_EXT_provoking_vertex
+#define GL_EXT_provoking_vertex 1
+
+#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C
+#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D
+#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E
+#define GL_PROVOKING_VERTEX_EXT 0x8E4F
+
+typedef void (GLAPIENTRY * PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode);
+
+#define glProvokingVertexEXT GLEW_GET_FUN(__glewProvokingVertexEXT)
+
+#define GLEW_EXT_provoking_vertex GLEW_GET_VAR(__GLEW_EXT_provoking_vertex)
+
+#endif /* GL_EXT_provoking_vertex */
+
/* ------------------------- GL_EXT_rescale_normal ------------------------- */
#ifndef GL_EXT_rescale_normal
@@ -6278,7 +8157,7 @@ typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint gr
typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v);
typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue);
typedef void (GLAPIENTRY * PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v);
-typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLvoid *pointer);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
#define glSecondaryColor3bEXT GLEW_GET_FUN(__glewSecondaryColor3bEXT)
#define glSecondaryColor3bvEXT GLEW_GET_FUN(__glewSecondaryColor3bvEXT)
@@ -6302,6 +8181,25 @@ typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenu
#endif /* GL_EXT_secondary_color */
+/* --------------------- GL_EXT_separate_shader_objects -------------------- */
+
+#ifndef GL_EXT_separate_shader_objects
+#define GL_EXT_separate_shader_objects 1
+
+#define GL_ACTIVE_PROGRAM_EXT 0x8B8D
+
+typedef void (GLAPIENTRY * PFNGLACTIVEPROGRAMEXTPROC) (GLuint program);
+typedef GLuint (GLAPIENTRY * PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const char* string);
+typedef void (GLAPIENTRY * PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program);
+
+#define glActiveProgramEXT GLEW_GET_FUN(__glewActiveProgramEXT)
+#define glCreateShaderProgramEXT GLEW_GET_FUN(__glewCreateShaderProgramEXT)
+#define glUseShaderProgramEXT GLEW_GET_FUN(__glewUseShaderProgramEXT)
+
+#define GLEW_EXT_separate_shader_objects GLEW_GET_VAR(__GLEW_EXT_separate_shader_objects)
+
+#endif /* GL_EXT_separate_shader_objects */
+
/* --------------------- GL_EXT_separate_specular_color -------------------- */
#ifndef GL_EXT_separate_specular_color
@@ -6315,6 +8213,77 @@ typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenu
#endif /* GL_EXT_separate_specular_color */
+/* --------------------- GL_EXT_shader_image_load_store -------------------- */
+
+#ifndef GL_EXT_shader_image_load_store
+#define GL_EXT_shader_image_load_store 1
+
+#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001
+#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002
+#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004
+#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008
+#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020
+#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040
+#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080
+#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100
+#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200
+#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400
+#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800
+#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000
+#define GL_MAX_IMAGE_UNITS_EXT 0x8F38
+#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39
+#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A
+#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B
+#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C
+#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D
+#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E
+#define GL_IMAGE_1D_EXT 0x904C
+#define GL_IMAGE_2D_EXT 0x904D
+#define GL_IMAGE_3D_EXT 0x904E
+#define GL_IMAGE_2D_RECT_EXT 0x904F
+#define GL_IMAGE_CUBE_EXT 0x9050
+#define GL_IMAGE_BUFFER_EXT 0x9051
+#define GL_IMAGE_1D_ARRAY_EXT 0x9052
+#define GL_IMAGE_2D_ARRAY_EXT 0x9053
+#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054
+#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055
+#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056
+#define GL_INT_IMAGE_1D_EXT 0x9057
+#define GL_INT_IMAGE_2D_EXT 0x9058
+#define GL_INT_IMAGE_3D_EXT 0x9059
+#define GL_INT_IMAGE_2D_RECT_EXT 0x905A
+#define GL_INT_IMAGE_CUBE_EXT 0x905B
+#define GL_INT_IMAGE_BUFFER_EXT 0x905C
+#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D
+#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E
+#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F
+#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060
+#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061
+#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062
+#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063
+#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064
+#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065
+#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066
+#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067
+#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068
+#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069
+#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B
+#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C
+#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D
+#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E
+#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF
+
+typedef void (GLAPIENTRY * PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format);
+typedef void (GLAPIENTRY * PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers);
+
+#define glBindImageTextureEXT GLEW_GET_FUN(__glewBindImageTextureEXT)
+#define glMemoryBarrierEXT GLEW_GET_FUN(__glewMemoryBarrierEXT)
+
+#define GLEW_EXT_shader_image_load_store GLEW_GET_VAR(__GLEW_EXT_shader_image_load_store)
+
+#endif /* GL_EXT_shader_image_load_store */
+
/* -------------------------- GL_EXT_shadow_funcs -------------------------- */
#ifndef GL_EXT_shadow_funcs
@@ -6858,6 +8827,19 @@ typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode);
#endif /* GL_EXT_texture_sRGB */
+/* ----------------------- GL_EXT_texture_sRGB_decode ---------------------- */
+
+#ifndef GL_EXT_texture_sRGB_decode
+#define GL_EXT_texture_sRGB_decode 1
+
+#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48
+#define GL_DECODE_EXT 0x8A49
+#define GL_SKIP_DECODE_EXT 0x8A4A
+
+#define GLEW_EXT_texture_sRGB_decode GLEW_GET_VAR(__GLEW_EXT_texture_sRGB_decode)
+
+#endif /* GL_EXT_texture_sRGB_decode */
+
/* --------------------- GL_EXT_texture_shared_exponent -------------------- */
#ifndef GL_EXT_texture_shared_exponent
@@ -6871,6 +8853,41 @@ typedef void (GLAPIENTRY * PFNGLTEXTURENORMALEXTPROC) (GLenum mode);
#endif /* GL_EXT_texture_shared_exponent */
+/* -------------------------- GL_EXT_texture_snorm ------------------------- */
+
+#ifndef GL_EXT_texture_snorm
+#define GL_EXT_texture_snorm 1
+
+#define GL_RED_SNORM 0x8F90
+#define GL_RG_SNORM 0x8F91
+#define GL_RGB_SNORM 0x8F92
+#define GL_RGBA_SNORM 0x8F93
+#define GL_R8_SNORM 0x8F94
+#define GL_RG8_SNORM 0x8F95
+#define GL_RGB8_SNORM 0x8F96
+#define GL_RGBA8_SNORM 0x8F97
+#define GL_R16_SNORM 0x8F98
+#define GL_RG16_SNORM 0x8F99
+#define GL_RGB16_SNORM 0x8F9A
+#define GL_RGBA16_SNORM 0x8F9B
+#define GL_SIGNED_NORMALIZED 0x8F9C
+#define GL_ALPHA_SNORM 0x9010
+#define GL_LUMINANCE_SNORM 0x9011
+#define GL_LUMINANCE_ALPHA_SNORM 0x9012
+#define GL_INTENSITY_SNORM 0x9013
+#define GL_ALPHA8_SNORM 0x9014
+#define GL_LUMINANCE8_SNORM 0x9015
+#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016
+#define GL_INTENSITY8_SNORM 0x9017
+#define GL_ALPHA16_SNORM 0x9018
+#define GL_LUMINANCE16_SNORM 0x9019
+#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A
+#define GL_INTENSITY16_SNORM 0x901B
+
+#define GLEW_EXT_texture_snorm GLEW_GET_VAR(__GLEW_EXT_texture_snorm)
+
+#endif /* GL_EXT_texture_snorm */
+
/* ------------------------- GL_EXT_texture_swizzle ------------------------ */
#ifndef GL_EXT_texture_swizzle
@@ -6987,7 +9004,6 @@ typedef void (GLAPIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i);
typedef void (GLAPIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);
typedef void (GLAPIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count);
typedef void (GLAPIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean* pointer);
-typedef void (GLAPIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, void** params);
typedef void (GLAPIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer);
typedef void (GLAPIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void* pointer);
typedef void (GLAPIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void* pointer);
@@ -6997,7 +9013,6 @@ typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type,
#define glColorPointerEXT GLEW_GET_FUN(__glewColorPointerEXT)
#define glDrawArraysEXT GLEW_GET_FUN(__glewDrawArraysEXT)
#define glEdgeFlagPointerEXT GLEW_GET_FUN(__glewEdgeFlagPointerEXT)
-#define glGetPointervEXT GLEW_GET_FUN(__glewGetPointervEXT)
#define glIndexPointerEXT GLEW_GET_FUN(__glewIndexPointerEXT)
#define glNormalPointerEXT GLEW_GET_FUN(__glewNormalPointerEXT)
#define glTexCoordPointerEXT GLEW_GET_FUN(__glewTexCoordPointerEXT)
@@ -7018,6 +9033,52 @@ typedef void (GLAPIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type,
#endif /* GL_EXT_vertex_array_bgra */
+/* ----------------------- GL_EXT_vertex_attrib_64bit ---------------------- */
+
+#ifndef GL_EXT_vertex_attrib_64bit
+#define GL_EXT_vertex_attrib_64bit 1
+
+#define GL_DOUBLE_MAT2_EXT 0x8F46
+#define GL_DOUBLE_MAT3_EXT 0x8F47
+#define GL_DOUBLE_MAT4_EXT 0x8F48
+#define GL_DOUBLE_MAT2x3_EXT 0x8F49
+#define GL_DOUBLE_MAT2x4_EXT 0x8F4A
+#define GL_DOUBLE_MAT3x2_EXT 0x8F4B
+#define GL_DOUBLE_MAT3x4_EXT 0x8F4C
+#define GL_DOUBLE_MAT4x2_EXT 0x8F4D
+#define GL_DOUBLE_MAT4x3_EXT 0x8F4E
+#define GL_DOUBLE_VEC2_EXT 0x8FFC
+#define GL_DOUBLE_VEC3_EXT 0x8FFD
+#define GL_DOUBLE_VEC4_EXT 0x8FFE
+
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void* pointer);
+
+#define glGetVertexAttribLdvEXT GLEW_GET_FUN(__glewGetVertexAttribLdvEXT)
+#define glVertexArrayVertexAttribLOffsetEXT GLEW_GET_FUN(__glewVertexArrayVertexAttribLOffsetEXT)
+#define glVertexAttribL1dEXT GLEW_GET_FUN(__glewVertexAttribL1dEXT)
+#define glVertexAttribL1dvEXT GLEW_GET_FUN(__glewVertexAttribL1dvEXT)
+#define glVertexAttribL2dEXT GLEW_GET_FUN(__glewVertexAttribL2dEXT)
+#define glVertexAttribL2dvEXT GLEW_GET_FUN(__glewVertexAttribL2dvEXT)
+#define glVertexAttribL3dEXT GLEW_GET_FUN(__glewVertexAttribL3dEXT)
+#define glVertexAttribL3dvEXT GLEW_GET_FUN(__glewVertexAttribL3dvEXT)
+#define glVertexAttribL4dEXT GLEW_GET_FUN(__glewVertexAttribL4dEXT)
+#define glVertexAttribL4dvEXT GLEW_GET_FUN(__glewVertexAttribL4dvEXT)
+#define glVertexAttribLPointerEXT GLEW_GET_FUN(__glewVertexAttribLPointerEXT)
+
+#define GLEW_EXT_vertex_attrib_64bit GLEW_GET_VAR(__GLEW_EXT_vertex_attrib_64bit)
+
+#endif /* GL_EXT_vertex_attrib_64bit */
+
/* -------------------------- GL_EXT_vertex_shader ------------------------- */
#ifndef GL_EXT_vertex_shader
@@ -7645,6 +9706,21 @@ typedef void (GLAPIENTRY * PFNGLWINDOWPOS4SVMESAPROC) (const GLshort* p);
#endif /* GL_MESA_ycbcr_texture */
+/* ------------------------- GL_NVX_gpu_memory_info ------------------------ */
+
+#ifndef GL_NVX_gpu_memory_info
+#define GL_NVX_gpu_memory_info 1
+
+#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047
+#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048
+#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049
+#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A
+#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B
+
+#define GLEW_NVX_gpu_memory_info GLEW_GET_VAR(__GLEW_NVX_gpu_memory_info)
+
+#endif /* GL_NVX_gpu_memory_info */
+
/* --------------------------- GL_NV_blend_square -------------------------- */
#ifndef GL_NV_blend_square
@@ -7686,6 +9762,19 @@ typedef void (GLAPIENTRY * PFNGLENDCONDITIONALRENDERNVPROC) (void);
#endif /* GL_NV_copy_depth_to_color */
+/* ---------------------------- GL_NV_copy_image --------------------------- */
+
+#ifndef GL_NV_copy_image
+#define GL_NV_copy_image 1
+
+typedef void (GLAPIENTRY * PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
+
+#define glCopyImageSubDataNV GLEW_GET_FUN(__glewCopyImageSubDataNV)
+
+#define GLEW_NV_copy_image GLEW_GET_VAR(__GLEW_NV_copy_image)
+
+#endif /* GL_NV_copy_image */
+
/* ------------------------ GL_NV_depth_buffer_float ----------------------- */
#ifndef GL_NV_depth_buffer_float
@@ -8034,6 +10123,139 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum targe
#endif /* GL_NV_gpu_program4 */
+/* --------------------------- GL_NV_gpu_program5 -------------------------- */
+
+#ifndef GL_NV_gpu_program5
+#define GL_NV_gpu_program5 1
+
+#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A
+#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B
+#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C
+#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D
+#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E
+#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F
+
+#define GLEW_NV_gpu_program5 GLEW_GET_VAR(__GLEW_NV_gpu_program5)
+
+#endif /* GL_NV_gpu_program5 */
+
+/* ------------------------- GL_NV_gpu_program_fp64 ------------------------ */
+
+#ifndef GL_NV_gpu_program_fp64
+#define GL_NV_gpu_program_fp64 1
+
+#define GLEW_NV_gpu_program_fp64 GLEW_GET_VAR(__GLEW_NV_gpu_program_fp64)
+
+#endif /* GL_NV_gpu_program_fp64 */
+
+/* --------------------------- GL_NV_gpu_shader5 --------------------------- */
+
+#ifndef GL_NV_gpu_shader5
+#define GL_NV_gpu_shader5 1
+
+#define GL_INT64_NV 0x140E
+#define GL_UNSIGNED_INT64_NV 0x140F
+#define GL_INT8_NV 0x8FE0
+#define GL_INT8_VEC2_NV 0x8FE1
+#define GL_INT8_VEC3_NV 0x8FE2
+#define GL_INT8_VEC4_NV 0x8FE3
+#define GL_INT16_NV 0x8FE4
+#define GL_INT16_VEC2_NV 0x8FE5
+#define GL_INT16_VEC3_NV 0x8FE6
+#define GL_INT16_VEC4_NV 0x8FE7
+#define GL_INT64_VEC2_NV 0x8FE9
+#define GL_INT64_VEC3_NV 0x8FEA
+#define GL_INT64_VEC4_NV 0x8FEB
+#define GL_UNSIGNED_INT8_NV 0x8FEC
+#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED
+#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE
+#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF
+#define GL_UNSIGNED_INT16_NV 0x8FF0
+#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1
+#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2
+#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3
+#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5
+#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6
+#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7
+#define GL_FLOAT16_NV 0x8FF8
+#define GL_FLOAT16_VEC2_NV 0x8FF9
+#define GL_FLOAT16_VEC3_NV 0x8FFA
+#define GL_FLOAT16_VEC4_NV 0x8FFB
+
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x);
+typedef void (GLAPIENTRY * PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y);
+typedef void (GLAPIENTRY * PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+typedef void (GLAPIENTRY * PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+typedef void (GLAPIENTRY * PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
+
+#define glGetUniformi64vNV GLEW_GET_FUN(__glewGetUniformi64vNV)
+#define glGetUniformui64vNV GLEW_GET_FUN(__glewGetUniformui64vNV)
+#define glProgramUniform1i64NV GLEW_GET_FUN(__glewProgramUniform1i64NV)
+#define glProgramUniform1i64vNV GLEW_GET_FUN(__glewProgramUniform1i64vNV)
+#define glProgramUniform1ui64NV GLEW_GET_FUN(__glewProgramUniform1ui64NV)
+#define glProgramUniform1ui64vNV GLEW_GET_FUN(__glewProgramUniform1ui64vNV)
+#define glProgramUniform2i64NV GLEW_GET_FUN(__glewProgramUniform2i64NV)
+#define glProgramUniform2i64vNV GLEW_GET_FUN(__glewProgramUniform2i64vNV)
+#define glProgramUniform2ui64NV GLEW_GET_FUN(__glewProgramUniform2ui64NV)
+#define glProgramUniform2ui64vNV GLEW_GET_FUN(__glewProgramUniform2ui64vNV)
+#define glProgramUniform3i64NV GLEW_GET_FUN(__glewProgramUniform3i64NV)
+#define glProgramUniform3i64vNV GLEW_GET_FUN(__glewProgramUniform3i64vNV)
+#define glProgramUniform3ui64NV GLEW_GET_FUN(__glewProgramUniform3ui64NV)
+#define glProgramUniform3ui64vNV GLEW_GET_FUN(__glewProgramUniform3ui64vNV)
+#define glProgramUniform4i64NV GLEW_GET_FUN(__glewProgramUniform4i64NV)
+#define glProgramUniform4i64vNV GLEW_GET_FUN(__glewProgramUniform4i64vNV)
+#define glProgramUniform4ui64NV GLEW_GET_FUN(__glewProgramUniform4ui64NV)
+#define glProgramUniform4ui64vNV GLEW_GET_FUN(__glewProgramUniform4ui64vNV)
+#define glUniform1i64NV GLEW_GET_FUN(__glewUniform1i64NV)
+#define glUniform1i64vNV GLEW_GET_FUN(__glewUniform1i64vNV)
+#define glUniform1ui64NV GLEW_GET_FUN(__glewUniform1ui64NV)
+#define glUniform1ui64vNV GLEW_GET_FUN(__glewUniform1ui64vNV)
+#define glUniform2i64NV GLEW_GET_FUN(__glewUniform2i64NV)
+#define glUniform2i64vNV GLEW_GET_FUN(__glewUniform2i64vNV)
+#define glUniform2ui64NV GLEW_GET_FUN(__glewUniform2ui64NV)
+#define glUniform2ui64vNV GLEW_GET_FUN(__glewUniform2ui64vNV)
+#define glUniform3i64NV GLEW_GET_FUN(__glewUniform3i64NV)
+#define glUniform3i64vNV GLEW_GET_FUN(__glewUniform3i64vNV)
+#define glUniform3ui64NV GLEW_GET_FUN(__glewUniform3ui64NV)
+#define glUniform3ui64vNV GLEW_GET_FUN(__glewUniform3ui64vNV)
+#define glUniform4i64NV GLEW_GET_FUN(__glewUniform4i64NV)
+#define glUniform4i64vNV GLEW_GET_FUN(__glewUniform4i64vNV)
+#define glUniform4ui64NV GLEW_GET_FUN(__glewUniform4ui64NV)
+#define glUniform4ui64vNV GLEW_GET_FUN(__glewUniform4ui64vNV)
+
+#define GLEW_NV_gpu_shader5 GLEW_GET_VAR(__GLEW_NV_gpu_shader5)
+
+#endif /* GL_NV_gpu_shader5 */
+
/* ---------------------------- GL_NV_half_float --------------------------- */
#ifndef GL_NV_half_float
@@ -8153,6 +10375,18 @@ typedef void (GLAPIENTRY * PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalf* weight);
#endif /* GL_NV_light_max_exponent */
+/* ----------------------- GL_NV_multisample_coverage ---------------------- */
+
+#ifndef GL_NV_multisample_coverage
+#define GL_NV_multisample_coverage 1
+
+#define GL_COVERAGE_SAMPLES_NV 0x80A9
+#define GL_COLOR_SAMPLES_NV 0x8E20
+
+#define GLEW_NV_multisample_coverage GLEW_GET_VAR(__GLEW_NV_multisample_coverage)
+
+#endif /* GL_NV_multisample_coverage */
+
/* --------------------- GL_NV_multisample_filter_hint --------------------- */
#ifndef GL_NV_multisample_filter_hint
@@ -8229,6 +10463,15 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target,
#endif /* GL_NV_parameter_buffer_object */
+/* --------------------- GL_NV_parameter_buffer_object2 -------------------- */
+
+#ifndef GL_NV_parameter_buffer_object2
+#define GL_NV_parameter_buffer_object2 1
+
+#define GLEW_NV_parameter_buffer_object2 GLEW_GET_VAR(__GLEW_NV_parameter_buffer_object2)
+
+#endif /* GL_NV_parameter_buffer_object2 */
+
/* ------------------------- GL_NV_pixel_data_range ------------------------ */
#ifndef GL_NV_pixel_data_range
@@ -8295,7 +10538,6 @@ typedef void (GLAPIENTRY * PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLu
#define glGetVideouivNV GLEW_GET_FUN(__glewGetVideouivNV)
#define glPresentFrameDualFillNV GLEW_GET_FUN(__glewPresentFrameDualFillNV)
#define glPresentFrameKeyedNV GLEW_GET_FUN(__glewPresentFrameKeyedNV)
-#define glVideoParameterivNV GLEW_GET_FUN(__glewVideoParameterivNV)
#define GLEW_NV_present_video GLEW_GET_VAR(__GLEW_NV_present_video)
@@ -8425,6 +10667,62 @@ typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage
#endif /* GL_NV_register_combiners2 */
+/* ------------------------ GL_NV_shader_buffer_load ----------------------- */
+
+#ifndef GL_NV_shader_buffer_load
+#define GL_NV_shader_buffer_load 1
+
+#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D
+#define GL_GPU_ADDRESS_NV 0x8F34
+#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35
+
+typedef void (GLAPIENTRY * PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT* result);
+typedef void (GLAPIENTRY * PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT* params);
+typedef GLboolean (GLAPIENTRY * PFNGLISBUFFERRESIDENTNVPROC) (GLenum target);
+typedef GLboolean (GLAPIENTRY * PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target);
+typedef void (GLAPIENTRY * PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access);
+typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer);
+typedef void (GLAPIENTRY * PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value);
+typedef void (GLAPIENTRY * PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT* value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value);
+typedef void (GLAPIENTRY * PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT* value);
+
+#define glGetBufferParameterui64vNV GLEW_GET_FUN(__glewGetBufferParameterui64vNV)
+#define glGetIntegerui64vNV GLEW_GET_FUN(__glewGetIntegerui64vNV)
+#define glGetNamedBufferParameterui64vNV GLEW_GET_FUN(__glewGetNamedBufferParameterui64vNV)
+#define glIsBufferResidentNV GLEW_GET_FUN(__glewIsBufferResidentNV)
+#define glIsNamedBufferResidentNV GLEW_GET_FUN(__glewIsNamedBufferResidentNV)
+#define glMakeBufferNonResidentNV GLEW_GET_FUN(__glewMakeBufferNonResidentNV)
+#define glMakeBufferResidentNV GLEW_GET_FUN(__glewMakeBufferResidentNV)
+#define glMakeNamedBufferNonResidentNV GLEW_GET_FUN(__glewMakeNamedBufferNonResidentNV)
+#define glMakeNamedBufferResidentNV GLEW_GET_FUN(__glewMakeNamedBufferResidentNV)
+#define glProgramUniformui64NV GLEW_GET_FUN(__glewProgramUniformui64NV)
+#define glProgramUniformui64vNV GLEW_GET_FUN(__glewProgramUniformui64vNV)
+#define glUniformui64NV GLEW_GET_FUN(__glewUniformui64NV)
+#define glUniformui64vNV GLEW_GET_FUN(__glewUniformui64vNV)
+
+#define GLEW_NV_shader_buffer_load GLEW_GET_VAR(__GLEW_NV_shader_buffer_load)
+
+#endif /* GL_NV_shader_buffer_load */
+
+/* ---------------------- GL_NV_tessellation_program5 ---------------------- */
+
+#ifndef GL_NV_tessellation_program5
+#define GL_NV_tessellation_program5 1
+
+#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8
+#define GL_TESS_CONTROL_PROGRAM_NV 0x891E
+#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F
+#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74
+#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75
+
+#define GLEW_NV_tessellation_program5 GLEW_GET_VAR(__GLEW_NV_tessellation_program5)
+
+#endif /* GL_NV_tessellation_program5 */
+
/* -------------------------- GL_NV_texgen_emboss -------------------------- */
#ifndef GL_NV_texgen_emboss
@@ -8450,6 +10748,19 @@ typedef void (GLAPIENTRY * PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage
#endif /* GL_NV_texgen_reflection */
+/* ------------------------- GL_NV_texture_barrier ------------------------- */
+
+#ifndef GL_NV_texture_barrier
+#define GL_NV_texture_barrier 1
+
+typedef void (GLAPIENTRY * PFNGLTEXTUREBARRIERNVPROC) (void);
+
+#define glTextureBarrierNV GLEW_GET_FUN(__glewTextureBarrierNV)
+
+#define GLEW_NV_texture_barrier GLEW_GET_VAR(__GLEW_NV_texture_barrier)
+
+#endif /* GL_NV_texture_barrier */
+
/* --------------------- GL_NV_texture_compression_vtc --------------------- */
#ifndef GL_NV_texture_compression_vtc
@@ -8706,6 +11017,74 @@ typedef void (GLAPIENTRY * PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program
#endif /* GL_NV_transform_feedback */
+/* ----------------------- GL_NV_transform_feedback2 ----------------------- */
+
+#ifndef GL_NV_transform_feedback2
+#define GL_NV_transform_feedback2 1
+
+#define GL_TRANSFORM_FEEDBACK_NV 0x8E22
+#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23
+#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24
+#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25
+
+typedef void (GLAPIENTRY * PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id);
+typedef void (GLAPIENTRY * PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint* ids);
+typedef void (GLAPIENTRY * PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id);
+typedef void (GLAPIENTRY * PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint* ids);
+typedef GLboolean (GLAPIENTRY * PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id);
+typedef void (GLAPIENTRY * PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void);
+typedef void (GLAPIENTRY * PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void);
+
+#define glBindTransformFeedbackNV GLEW_GET_FUN(__glewBindTransformFeedbackNV)
+#define glDeleteTransformFeedbacksNV GLEW_GET_FUN(__glewDeleteTransformFeedbacksNV)
+#define glDrawTransformFeedbackNV GLEW_GET_FUN(__glewDrawTransformFeedbackNV)
+#define glGenTransformFeedbacksNV GLEW_GET_FUN(__glewGenTransformFeedbacksNV)
+#define glIsTransformFeedbackNV GLEW_GET_FUN(__glewIsTransformFeedbackNV)
+#define glPauseTransformFeedbackNV GLEW_GET_FUN(__glewPauseTransformFeedbackNV)
+#define glResumeTransformFeedbackNV GLEW_GET_FUN(__glewResumeTransformFeedbackNV)
+
+#define GLEW_NV_transform_feedback2 GLEW_GET_VAR(__GLEW_NV_transform_feedback2)
+
+#endif /* GL_NV_transform_feedback2 */
+
+/* -------------------------- GL_NV_vdpau_interop -------------------------- */
+
+#ifndef GL_NV_vdpau_interop
+#define GL_NV_vdpau_interop 1
+
+#define GL_SURFACE_STATE_NV 0x86EB
+#define GL_SURFACE_REGISTERED_NV 0x86FD
+#define GL_SURFACE_MAPPED_NV 0x8700
+#define GL_WRITE_DISCARD_NV 0x88BE
+
+typedef GLintptr GLvdpauSurfaceNV;
+
+typedef void (GLAPIENTRY * PFNGLVDPAUFININVPROC) (void);
+typedef void (GLAPIENTRY * PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei bufSize, GLsizei* length, GLint *values);
+typedef void (GLAPIENTRY * PFNGLVDPAUINITNVPROC) (const void* vdpDevice, const GLvoid*getProcAddress);
+typedef void (GLAPIENTRY * PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface);
+typedef void (GLAPIENTRY * PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV* surfaces);
+typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
+typedef GLvdpauSurfaceNV (GLAPIENTRY * PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void* vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames);
+typedef void (GLAPIENTRY * PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access);
+typedef void (GLAPIENTRY * PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV* surfaces);
+typedef void (GLAPIENTRY * PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface);
+
+#define glVDPAUFiniNV GLEW_GET_FUN(__glewVDPAUFiniNV)
+#define glVDPAUGetSurfaceivNV GLEW_GET_FUN(__glewVDPAUGetSurfaceivNV)
+#define glVDPAUInitNV GLEW_GET_FUN(__glewVDPAUInitNV)
+#define glVDPAUIsSurfaceNV GLEW_GET_FUN(__glewVDPAUIsSurfaceNV)
+#define glVDPAUMapSurfacesNV GLEW_GET_FUN(__glewVDPAUMapSurfacesNV)
+#define glVDPAURegisterOutputSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterOutputSurfaceNV)
+#define glVDPAURegisterVideoSurfaceNV GLEW_GET_FUN(__glewVDPAURegisterVideoSurfaceNV)
+#define glVDPAUSurfaceAccessNV GLEW_GET_FUN(__glewVDPAUSurfaceAccessNV)
+#define glVDPAUUnmapSurfacesNV GLEW_GET_FUN(__glewVDPAUUnmapSurfacesNV)
+#define glVDPAUUnregisterSurfaceNV GLEW_GET_FUN(__glewVDPAUUnregisterSurfaceNV)
+
+#define GLEW_NV_vdpau_interop GLEW_GET_VAR(__GLEW_NV_vdpau_interop)
+
+#endif /* GL_NV_vdpau_interop */
+
/* ------------------------ GL_NV_vertex_array_range ----------------------- */
#ifndef GL_NV_vertex_array_range
@@ -8738,6 +11117,119 @@ typedef void (GLAPIENTRY * PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, void* p
#endif /* GL_NV_vertex_array_range2 */
+/* ------------------- GL_NV_vertex_attrib_integer_64bit ------------------- */
+
+#ifndef GL_NV_vertex_attrib_integer_64bit
+#define GL_NV_vertex_attrib_integer_64bit 1
+
+#define GL_INT64_NV 0x140E
+#define GL_UNSIGNED_INT64_NV 0x140F
+
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT* params);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT* v);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);
+
+#define glGetVertexAttribLi64vNV GLEW_GET_FUN(__glewGetVertexAttribLi64vNV)
+#define glGetVertexAttribLui64vNV GLEW_GET_FUN(__glewGetVertexAttribLui64vNV)
+#define glVertexAttribL1i64NV GLEW_GET_FUN(__glewVertexAttribL1i64NV)
+#define glVertexAttribL1i64vNV GLEW_GET_FUN(__glewVertexAttribL1i64vNV)
+#define glVertexAttribL1ui64NV GLEW_GET_FUN(__glewVertexAttribL1ui64NV)
+#define glVertexAttribL1ui64vNV GLEW_GET_FUN(__glewVertexAttribL1ui64vNV)
+#define glVertexAttribL2i64NV GLEW_GET_FUN(__glewVertexAttribL2i64NV)
+#define glVertexAttribL2i64vNV GLEW_GET_FUN(__glewVertexAttribL2i64vNV)
+#define glVertexAttribL2ui64NV GLEW_GET_FUN(__glewVertexAttribL2ui64NV)
+#define glVertexAttribL2ui64vNV GLEW_GET_FUN(__glewVertexAttribL2ui64vNV)
+#define glVertexAttribL3i64NV GLEW_GET_FUN(__glewVertexAttribL3i64NV)
+#define glVertexAttribL3i64vNV GLEW_GET_FUN(__glewVertexAttribL3i64vNV)
+#define glVertexAttribL3ui64NV GLEW_GET_FUN(__glewVertexAttribL3ui64NV)
+#define glVertexAttribL3ui64vNV GLEW_GET_FUN(__glewVertexAttribL3ui64vNV)
+#define glVertexAttribL4i64NV GLEW_GET_FUN(__glewVertexAttribL4i64NV)
+#define glVertexAttribL4i64vNV GLEW_GET_FUN(__glewVertexAttribL4i64vNV)
+#define glVertexAttribL4ui64NV GLEW_GET_FUN(__glewVertexAttribL4ui64NV)
+#define glVertexAttribL4ui64vNV GLEW_GET_FUN(__glewVertexAttribL4ui64vNV)
+#define glVertexAttribLFormatNV GLEW_GET_FUN(__glewVertexAttribLFormatNV)
+
+#define GLEW_NV_vertex_attrib_integer_64bit GLEW_GET_VAR(__GLEW_NV_vertex_attrib_integer_64bit)
+
+#endif /* GL_NV_vertex_attrib_integer_64bit */
+
+/* ------------------- GL_NV_vertex_buffer_unified_memory ------------------ */
+
+#ifndef GL_NV_vertex_buffer_unified_memory
+#define GL_NV_vertex_buffer_unified_memory 1
+
+#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E
+#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F
+#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20
+#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21
+#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22
+#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23
+#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24
+#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25
+#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26
+#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27
+#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28
+#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29
+#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A
+#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B
+#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C
+#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D
+#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E
+#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F
+#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30
+#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31
+#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32
+#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33
+#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40
+#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41
+#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42
+
+typedef void (GLAPIENTRY * PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length);
+typedef void (GLAPIENTRY * PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT result[]);
+typedef void (GLAPIENTRY * PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride);
+typedef void (GLAPIENTRY * PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride);
+
+#define glBufferAddressRangeNV GLEW_GET_FUN(__glewBufferAddressRangeNV)
+#define glColorFormatNV GLEW_GET_FUN(__glewColorFormatNV)
+#define glEdgeFlagFormatNV GLEW_GET_FUN(__glewEdgeFlagFormatNV)
+#define glFogCoordFormatNV GLEW_GET_FUN(__glewFogCoordFormatNV)
+#define glGetIntegerui64i_vNV GLEW_GET_FUN(__glewGetIntegerui64i_vNV)
+#define glIndexFormatNV GLEW_GET_FUN(__glewIndexFormatNV)
+#define glNormalFormatNV GLEW_GET_FUN(__glewNormalFormatNV)
+#define glSecondaryColorFormatNV GLEW_GET_FUN(__glewSecondaryColorFormatNV)
+#define glTexCoordFormatNV GLEW_GET_FUN(__glewTexCoordFormatNV)
+#define glVertexAttribFormatNV GLEW_GET_FUN(__glewVertexAttribFormatNV)
+#define glVertexAttribIFormatNV GLEW_GET_FUN(__glewVertexAttribIFormatNV)
+#define glVertexFormatNV GLEW_GET_FUN(__glewVertexFormatNV)
+
+#define GLEW_NV_vertex_buffer_unified_memory GLEW_GET_VAR(__GLEW_NV_vertex_buffer_unified_memory)
+
+#endif /* GL_NV_vertex_buffer_unified_memory */
+
/* -------------------------- GL_NV_vertex_program ------------------------- */
#ifndef GL_NV_vertex_program
@@ -8847,8 +11339,8 @@ typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint
typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble* params);
typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat* params);
-typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLuint num, const GLdouble* params);
-typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLuint num, const GLfloat* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLdouble* params);
+typedef void (GLAPIENTRY * PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei num, const GLfloat* params);
typedef void (GLAPIENTRY * PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, GLuint* ids);
typedef void (GLAPIENTRY * PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform);
typedef void (GLAPIENTRY * PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x);
@@ -9007,6 +11499,8 @@ typedef void (GLAPIENTRY * PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei
#ifndef GL_NV_vertex_program4
#define GL_NV_vertex_program4 1
+#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD
+
#define GLEW_NV_vertex_program4 GLEW_GET_VAR(__GLEW_NV_vertex_program4)
#endif /* GL_NV_vertex_program4 */
@@ -10459,8 +12953,6 @@ GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv;
GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender;
GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback;
-GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase;
-GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange;
GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation;
GLEW_FUN_EXPORT PFNGLCLAMPCOLORPROC __glewClampColor;
GLEW_FUN_EXPORT PFNGLCLEARBUFFERFIPROC __glewClearBufferfi;
@@ -10474,7 +12966,6 @@ GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender;
GLEW_FUN_EXPORT PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback;
GLEW_FUN_EXPORT PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v;
GLEW_FUN_EXPORT PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation;
-GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v;
GLEW_FUN_EXPORT PFNGLGETSTRINGIPROC __glewGetStringi;
GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv;
GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv;
@@ -10516,8 +13007,54 @@ GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv;
GLEW_FUN_EXPORT PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv;
GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer;
+GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced;
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced;
+GLEW_FUN_EXPORT PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex;
+GLEW_FUN_EXPORT PFNGLTEXBUFFERPROC __glewTexBuffer;
+
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v;
+GLEW_FUN_EXPORT PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v;
+
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor;
+
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei;
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIPROC __glewBlendEquationi;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCIPROC __glewBlendFunci;
+GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading;
+
GLEW_FUN_EXPORT PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX;
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD;
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD;
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD;
+GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD;
+
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD;
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD;
+
+GLEW_FUN_EXPORT PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD;
+GLEW_FUN_EXPORT PFNGLGENNAMESAMDPROC __glewGenNamesAMD;
+GLEW_FUN_EXPORT PFNGLISNAMEAMDPROC __glewIsNameAMD;
+
+GLEW_FUN_EXPORT PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD;
+GLEW_FUN_EXPORT PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD;
+GLEW_FUN_EXPORT PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD;
+GLEW_FUN_EXPORT PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD;
+GLEW_FUN_EXPORT PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD;
+GLEW_FUN_EXPORT PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD;
+
+GLEW_FUN_EXPORT PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD;
+GLEW_FUN_EXPORT PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD;
+
GLEW_FUN_EXPORT PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE;
GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE;
GLEW_FUN_EXPORT PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE;
@@ -10536,6 +13073,10 @@ GLEW_FUN_EXPORT PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE;
GLEW_FUN_EXPORT PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE;
GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE;
+GLEW_FUN_EXPORT PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE;
+GLEW_FUN_EXPORT PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE;
+GLEW_FUN_EXPORT PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE;
+
GLEW_FUN_EXPORT PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE;
GLEW_FUN_EXPORT PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE;
@@ -10548,10 +13089,49 @@ GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeA
GLEW_FUN_EXPORT PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE;
GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE;
+GLEW_FUN_EXPORT PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE;
+GLEW_FUN_EXPORT PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE;
+GLEW_FUN_EXPORT PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE;
+GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE;
+GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE;
+GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE;
+GLEW_FUN_EXPORT PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE;
+
+GLEW_FUN_EXPORT PFNGLCLEARDEPTHFPROC __glewClearDepthf;
+GLEW_FUN_EXPORT PFNGLDEPTHRANGEFPROC __glewDepthRangef;
+GLEW_FUN_EXPORT PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat;
+GLEW_FUN_EXPORT PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler;
+GLEW_FUN_EXPORT PFNGLSHADERBINARYPROC __glewShaderBinary;
+
+GLEW_FUN_EXPORT PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed;
+GLEW_FUN_EXPORT PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex;
+
+GLEW_FUN_EXPORT PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB;
+
GLEW_FUN_EXPORT PFNGLCLAMPCOLORARBPROC __glewClampColorARB;
+GLEW_FUN_EXPORT PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData;
+
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB;
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB;
+GLEW_FUN_EXPORT PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB;
+GLEW_FUN_EXPORT PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB;
+
GLEW_FUN_EXPORT PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB;
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB;
+GLEW_FUN_EXPORT PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB;
+GLEW_FUN_EXPORT PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB;
+
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex;
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex;
+GLEW_FUN_EXPORT PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex;
+GLEW_FUN_EXPORT PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex;
+
+GLEW_FUN_EXPORT PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect;
+GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect;
+
GLEW_FUN_EXPORT PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB;
GLEW_FUN_EXPORT PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB;
@@ -10562,10 +13142,10 @@ GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus;
GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers;
GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers;
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer;
-GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer;
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D;
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D;
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D;
+GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer;
GLEW_FUN_EXPORT PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers;
GLEW_FUN_EXPORT PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers;
GLEW_FUN_EXPORT PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap;
@@ -10581,6 +13161,46 @@ GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceA
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB;
GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary;
+GLEW_FUN_EXPORT PFNGLPROGRAMBINARYPROC __glewProgramBinary;
+GLEW_FUN_EXPORT PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri;
+
+GLEW_FUN_EXPORT PFNGLGETUNIFORMDVPROC __glewGetUniformdv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT;
+GLEW_FUN_EXPORT PFNGLUNIFORM1DPROC __glewUniform1d;
+GLEW_FUN_EXPORT PFNGLUNIFORM1DVPROC __glewUniform1dv;
+GLEW_FUN_EXPORT PFNGLUNIFORM2DPROC __glewUniform2d;
+GLEW_FUN_EXPORT PFNGLUNIFORM2DVPROC __glewUniform2dv;
+GLEW_FUN_EXPORT PFNGLUNIFORM3DPROC __glewUniform3d;
+GLEW_FUN_EXPORT PFNGLUNIFORM3DVPROC __glewUniform3dv;
+GLEW_FUN_EXPORT PFNGLUNIFORM4DPROC __glewUniform4d;
+GLEW_FUN_EXPORT PFNGLUNIFORM4DVPROC __glewUniform4dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv;
+GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv;
+
GLEW_FUN_EXPORT PFNGLCOLORSUBTABLEPROC __glewColorSubTable;
GLEW_FUN_EXPORT PFNGLCOLORTABLEPROC __glewColorTable;
GLEW_FUN_EXPORT PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv;
@@ -10674,6 +13294,106 @@ GLEW_FUN_EXPORT PFNGLISQUERYARBPROC __glewIsQueryARB;
GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB;
GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB;
+GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex;
+
+GLEW_FUN_EXPORT PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB;
+GLEW_FUN_EXPORT PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB;
+GLEW_FUN_EXPORT PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB;
+GLEW_FUN_EXPORT PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB;
+GLEW_FUN_EXPORT PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB;
+GLEW_FUN_EXPORT PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB;
+GLEW_FUN_EXPORT PFNGLGETNMAPIVARBPROC __glewGetnMapivARB;
+GLEW_FUN_EXPORT PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB;
+GLEW_FUN_EXPORT PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB;
+GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB;
+GLEW_FUN_EXPORT PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB;
+GLEW_FUN_EXPORT PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB;
+GLEW_FUN_EXPORT PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB;
+GLEW_FUN_EXPORT PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB;
+GLEW_FUN_EXPORT PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB;
+GLEW_FUN_EXPORT PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB;
+GLEW_FUN_EXPORT PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB;
+GLEW_FUN_EXPORT PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB;
+GLEW_FUN_EXPORT PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB;
+
+GLEW_FUN_EXPORT PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB;
+
+GLEW_FUN_EXPORT PFNGLBINDSAMPLERPROC __glewBindSampler;
+GLEW_FUN_EXPORT PFNGLDELETESAMPLERSPROC __glewDeleteSamplers;
+GLEW_FUN_EXPORT PFNGLGENSAMPLERSPROC __glewGenSamplers;
+GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv;
+GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv;
+GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv;
+GLEW_FUN_EXPORT PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv;
+GLEW_FUN_EXPORT PFNGLISSAMPLERPROC __glewIsSampler;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri;
+GLEW_FUN_EXPORT PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv;
+
+GLEW_FUN_EXPORT PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram;
+GLEW_FUN_EXPORT PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline;
+GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv;
+GLEW_FUN_EXPORT PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines;
+GLEW_FUN_EXPORT PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv;
+GLEW_FUN_EXPORT PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv;
+GLEW_FUN_EXPORT PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages;
+GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline;
+
GLEW_FUN_EXPORT PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB;
GLEW_FUN_EXPORT PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB;
GLEW_FUN_EXPORT PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB;
@@ -10714,6 +13434,33 @@ GLEW_FUN_EXPORT PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB;
GLEW_FUN_EXPORT PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB;
GLEW_FUN_EXPORT PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB;
+GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName;
+GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName;
+GLEW_FUN_EXPORT PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv;
+GLEW_FUN_EXPORT PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv;
+GLEW_FUN_EXPORT PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex;
+GLEW_FUN_EXPORT PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv;
+GLEW_FUN_EXPORT PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv;
+
+GLEW_FUN_EXPORT PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB;
+GLEW_FUN_EXPORT PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB;
+GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB;
+GLEW_FUN_EXPORT PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB;
+GLEW_FUN_EXPORT PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB;
+GLEW_FUN_EXPORT PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB;
+
+GLEW_FUN_EXPORT PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync;
+GLEW_FUN_EXPORT PFNGLDELETESYNCPROC __glewDeleteSync;
+GLEW_FUN_EXPORT PFNGLFENCESYNCPROC __glewFenceSync;
+GLEW_FUN_EXPORT PFNGLGETINTEGER64VPROC __glewGetInteger64v;
+GLEW_FUN_EXPORT PFNGLGETSYNCIVPROC __glewGetSynciv;
+GLEW_FUN_EXPORT PFNGLISSYNCPROC __glewIsSync;
+GLEW_FUN_EXPORT PFNGLWAITSYNCPROC __glewWaitSync;
+
+GLEW_FUN_EXPORT PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv;
+GLEW_FUN_EXPORT PFNGLPATCHPARAMETERIPROC __glewPatchParameteri;
+
GLEW_FUN_EXPORT PFNGLTEXBUFFERARBPROC __glewTexBufferARB;
GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB;
@@ -10724,16 +13471,60 @@ GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2
GLEW_FUN_EXPORT PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB;
GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB;
+GLEW_FUN_EXPORT PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv;
+GLEW_FUN_EXPORT PFNGLSAMPLEMASKIPROC __glewSampleMaski;
+GLEW_FUN_EXPORT PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample;
+GLEW_FUN_EXPORT PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample;
+
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v;
+GLEW_FUN_EXPORT PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v;
+GLEW_FUN_EXPORT PFNGLQUERYCOUNTERPROC __glewQueryCounter;
+
+GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback;
+GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks;
+GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback;
+GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks;
+GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback;
+GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback;
+GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback;
+
+GLEW_FUN_EXPORT PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed;
+GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream;
+GLEW_FUN_EXPORT PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed;
+GLEW_FUN_EXPORT PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv;
+
GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB;
GLEW_FUN_EXPORT PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB;
GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB;
GLEW_FUN_EXPORT PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB;
+GLEW_FUN_EXPORT PFNGLBINDBUFFERBASEPROC __glewBindBufferBase;
+GLEW_FUN_EXPORT PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName;
+GLEW_FUN_EXPORT PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv;
+GLEW_FUN_EXPORT PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices;
+GLEW_FUN_EXPORT PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding;
+
GLEW_FUN_EXPORT PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray;
GLEW_FUN_EXPORT PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays;
GLEW_FUN_EXPORT PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays;
GLEW_FUN_EXPORT PFNGLISVERTEXARRAYPROC __glewIsVertexArray;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer;
+
GLEW_FUN_EXPORT PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB;
GLEW_FUN_EXPORT PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB;
GLEW_FUN_EXPORT PFNGLWEIGHTBVARBPROC __glewWeightbvARB;
@@ -10824,6 +13615,56 @@ GLEW_FUN_EXPORT PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB;
GLEW_FUN_EXPORT PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB;
GLEW_FUN_EXPORT PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB;
+GLEW_FUN_EXPORT PFNGLCOLORP3UIPROC __glewColorP3ui;
+GLEW_FUN_EXPORT PFNGLCOLORP3UIVPROC __glewColorP3uiv;
+GLEW_FUN_EXPORT PFNGLCOLORP4UIPROC __glewColorP4ui;
+GLEW_FUN_EXPORT PFNGLCOLORP4UIVPROC __glewColorP4uiv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui;
+GLEW_FUN_EXPORT PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv;
+GLEW_FUN_EXPORT PFNGLNORMALP3UIPROC __glewNormalP3ui;
+GLEW_FUN_EXPORT PFNGLNORMALP3UIVPROC __glewNormalP3uiv;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui;
+GLEW_FUN_EXPORT PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXP2UIPROC __glewVertexP2ui;
+GLEW_FUN_EXPORT PFNGLVERTEXP2UIVPROC __glewVertexP2uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXP3UIPROC __glewVertexP3ui;
+GLEW_FUN_EXPORT PFNGLVERTEXP3UIVPROC __glewVertexP3uiv;
+GLEW_FUN_EXPORT PFNGLVERTEXP4UIPROC __glewVertexP4ui;
+GLEW_FUN_EXPORT PFNGLVERTEXP4UIVPROC __glewVertexP4uiv;
+
+GLEW_FUN_EXPORT PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv;
+GLEW_FUN_EXPORT PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed;
+GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v;
+GLEW_FUN_EXPORT PFNGLGETFLOATI_VPROC __glewGetFloati_v;
+GLEW_FUN_EXPORT PFNGLSCISSORARRAYVPROC __glewScissorArrayv;
+GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDPROC __glewScissorIndexed;
+GLEW_FUN_EXPORT PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv;
+GLEW_FUN_EXPORT PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv;
+GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf;
+GLEW_FUN_EXPORT PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv;
+
GLEW_FUN_EXPORT PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB;
GLEW_FUN_EXPORT PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB;
GLEW_FUN_EXPORT PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB;
@@ -11003,7 +13844,14 @@ GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT
GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT;
GLEW_FUN_EXPORT PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT;
GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT;
+GLEW_FUN_EXPORT PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT;
+GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT;
+GLEW_FUN_EXPORT PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT;
GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT;
+GLEW_FUN_EXPORT PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT;
+GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT;
+GLEW_FUN_EXPORT PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT;
+GLEW_FUN_EXPORT PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT;
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT;
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT;
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT;
@@ -11012,7 +13860,9 @@ GLEW_FUN_EXPORT PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT
GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT;
GLEW_FUN_EXPORT PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT;
GLEW_FUN_EXPORT PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT;
+GLEW_FUN_EXPORT PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT;
GLEW_FUN_EXPORT PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT;
+GLEW_FUN_EXPORT PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT;
GLEW_FUN_EXPORT PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT;
GLEW_FUN_EXPORT PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT;
GLEW_FUN_EXPORT PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT;
@@ -11038,6 +13888,7 @@ GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT
GLEW_FUN_EXPORT PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT;
GLEW_FUN_EXPORT PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT;
GLEW_FUN_EXPORT PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT;
+GLEW_FUN_EXPORT PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT;
GLEW_FUN_EXPORT PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT;
GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT;
GLEW_FUN_EXPORT PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT;
@@ -11045,7 +13896,12 @@ GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivE
GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT;
GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT;
GLEW_FUN_EXPORT PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT;
GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT;
+GLEW_FUN_EXPORT PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT;
GLEW_FUN_EXPORT PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT;
GLEW_FUN_EXPORT PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT;
GLEW_FUN_EXPORT PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT;
@@ -11092,6 +13948,7 @@ GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT;
GLEW_FUN_EXPORT PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT;
GLEW_FUN_EXPORT PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT;
GLEW_FUN_EXPORT PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT;
+GLEW_FUN_EXPORT PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT;
GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT;
GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT;
GLEW_FUN_EXPORT PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT;
@@ -11163,6 +14020,17 @@ GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT;
GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT;
GLEW_FUN_EXPORT PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT;
GLEW_FUN_EXPORT PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT;
GLEW_FUN_EXPORT PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT;
GLEW_FUN_EXPORT PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT;
@@ -11308,6 +14176,8 @@ GLEW_FUN_EXPORT PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT;
GLEW_FUN_EXPORT PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT;
+GLEW_FUN_EXPORT PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT;
+
GLEW_FUN_EXPORT PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT;
GLEW_FUN_EXPORT PFNGLENDSCENEEXTPROC __glewEndSceneEXT;
@@ -11329,6 +14199,13 @@ GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT;
GLEW_FUN_EXPORT PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT;
GLEW_FUN_EXPORT PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT;
+GLEW_FUN_EXPORT PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT;
+GLEW_FUN_EXPORT PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT;
+GLEW_FUN_EXPORT PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT;
+
+GLEW_FUN_EXPORT PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT;
+GLEW_FUN_EXPORT PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT;
+
GLEW_FUN_EXPORT PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT;
GLEW_FUN_EXPORT PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT;
@@ -11370,12 +14247,23 @@ GLEW_FUN_EXPORT PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT;
GLEW_FUN_EXPORT PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT;
GLEW_FUN_EXPORT PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT;
GLEW_FUN_EXPORT PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT;
-GLEW_FUN_EXPORT PFNGLGETPOINTERVEXTPROC __glewGetPointervEXT;
GLEW_FUN_EXPORT PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT;
GLEW_FUN_EXPORT PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT;
GLEW_FUN_EXPORT PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT;
GLEW_FUN_EXPORT PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT;
+
GLEW_FUN_EXPORT PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT;
GLEW_FUN_EXPORT PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT;
GLEW_FUN_EXPORT PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT;
@@ -11490,6 +14378,8 @@ GLEW_FUN_EXPORT PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA;
GLEW_FUN_EXPORT PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV;
GLEW_FUN_EXPORT PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV;
+GLEW_FUN_EXPORT PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV;
+
GLEW_FUN_EXPORT PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV;
GLEW_FUN_EXPORT PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV;
GLEW_FUN_EXPORT PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV;
@@ -11540,6 +14430,41 @@ GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParamete
GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV;
GLEW_FUN_EXPORT PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV;
+GLEW_FUN_EXPORT PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV;
+
GLEW_FUN_EXPORT PFNGLCOLOR3HNVPROC __glewColor3hNV;
GLEW_FUN_EXPORT PFNGLCOLOR3HVNVPROC __glewColor3hvNV;
GLEW_FUN_EXPORT PFNGLCOLOR4HNVPROC __glewColor4hNV;
@@ -11632,6 +14557,22 @@ GLEW_FUN_EXPORT PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombin
GLEW_FUN_EXPORT PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV;
GLEW_FUN_EXPORT PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV;
+GLEW_FUN_EXPORT PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV;
+GLEW_FUN_EXPORT PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV;
+GLEW_FUN_EXPORT PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV;
+GLEW_FUN_EXPORT PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV;
+GLEW_FUN_EXPORT PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV;
+GLEW_FUN_EXPORT PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV;
+GLEW_FUN_EXPORT PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV;
+GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV;
+GLEW_FUN_EXPORT PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV;
+GLEW_FUN_EXPORT PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV;
+GLEW_FUN_EXPORT PFNGLUNIFORMUI64NVPROC __glewUniformui64NV;
+GLEW_FUN_EXPORT PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV;
+
+GLEW_FUN_EXPORT PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV;
+
GLEW_FUN_EXPORT PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV;
GLEW_FUN_EXPORT PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV;
GLEW_FUN_EXPORT PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV;
@@ -11644,9 +14585,61 @@ GLEW_FUN_EXPORT PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV;
GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV;
GLEW_FUN_EXPORT PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV;
+GLEW_FUN_EXPORT PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV;
+GLEW_FUN_EXPORT PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV;
+GLEW_FUN_EXPORT PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV;
+GLEW_FUN_EXPORT PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV;
+GLEW_FUN_EXPORT PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV;
+GLEW_FUN_EXPORT PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV;
+GLEW_FUN_EXPORT PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV;
+
+GLEW_FUN_EXPORT PFNGLVDPAUFININVPROC __glewVDPAUFiniNV;
+GLEW_FUN_EXPORT PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV;
+GLEW_FUN_EXPORT PFNGLVDPAUINITNVPROC __glewVDPAUInitNV;
+GLEW_FUN_EXPORT PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV;
+GLEW_FUN_EXPORT PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV;
+GLEW_FUN_EXPORT PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV;
+GLEW_FUN_EXPORT PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV;
+GLEW_FUN_EXPORT PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV;
+GLEW_FUN_EXPORT PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV;
+GLEW_FUN_EXPORT PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV;
+
GLEW_FUN_EXPORT PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV;
GLEW_FUN_EXPORT PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV;
+GLEW_FUN_EXPORT PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV;
+
+GLEW_FUN_EXPORT PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV;
+GLEW_FUN_EXPORT PFNGLCOLORFORMATNVPROC __glewColorFormatNV;
+GLEW_FUN_EXPORT PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV;
+GLEW_FUN_EXPORT PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV;
+GLEW_FUN_EXPORT PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV;
+GLEW_FUN_EXPORT PFNGLINDEXFORMATNVPROC __glewIndexFormatNV;
+GLEW_FUN_EXPORT PFNGLNORMALFORMATNVPROC __glewNormalFormatNV;
+GLEW_FUN_EXPORT PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV;
+GLEW_FUN_EXPORT PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV;
+GLEW_FUN_EXPORT PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV;
+GLEW_FUN_EXPORT PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV;
+
GLEW_FUN_EXPORT PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV;
GLEW_FUN_EXPORT PFNGLBINDPROGRAMNVPROC __glewBindProgramNV;
GLEW_FUN_EXPORT PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV;
@@ -11858,38 +14851,75 @@ struct GLEWContextStruct
GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_1;
GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_2_1;
GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_3;
GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_4;
GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_1_5;
GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_0;
GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_2_1;
GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_0;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_1;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_2;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_3_3;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_0;
+GLEW_VAR_EXPORT GLboolean __GLEW_VERSION_4_1;
GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_multisample;
GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_tbuffer;
GLEW_VAR_EXPORT GLboolean __GLEW_3DFX_texture_compression_FXT1;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_conservative_depth;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_debug_output;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_depth_clamp_separate;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_draw_buffers_blend;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_name_gen_delete;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_performance_monitor;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_seamless_cubemap_per_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_shader_stencil_export;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_texture_texture4;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_transform_feedback3_lines_triangles;
+GLEW_VAR_EXPORT GLboolean __GLEW_AMD_vertex_shader_tessellator;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_aux_depth_stencil;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_client_storage;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_element_array;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_fence;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_float_pixels;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_flush_buffer_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_object_purgeable;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_pixel_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_rgb_422;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_row_bytes;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_specular_vector;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_texture_range;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_transform_hint;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_object;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_array_range;
+GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_vertex_program_evaluators;
GLEW_VAR_EXPORT GLboolean __GLEW_APPLE_ycbcr_422;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_ES2_compatibility;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_blend_func_extended;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_cl_event;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_color_buffer_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_compatibility;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_copy_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_debug_output;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_buffer_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_clamp;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_depth_texture;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_buffers_blend;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_elements_base_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_indirect;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_draw_instanced;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_explicit_attrib_location;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_coord_conventions;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_program_shadow;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_fragment_shader;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_object;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_framebuffer_sRGB;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_geometry_shader4;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_get_program_binary;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader5;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_gpu_shader_fp64;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_pixel;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_half_float_vertex;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_imaging;
@@ -11899,33 +14929,64 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ARB_matrix_palette;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multisample;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_multitexture;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_occlusion_query2;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_pixel_buffer_object;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_parameters;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_point_sprite;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_provoking_vertex;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_robustness;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sample_shading;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sampler_objects;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_seamless_cube_map;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_separate_shader_objects;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_bit_encoding;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_objects;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_precision;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_stencil_export;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_subroutine;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shader_texture_lod;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_100;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shading_language_include;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_shadow_ambient;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_sync;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_tessellation_shader;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_border_clamp;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_buffer_object_rgb32;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_bptc;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_compression_rgtc;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_cube_map_array;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_add;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_combine;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_crossbar;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_env_dot3;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_float;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_gather;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_mirrored_repeat;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_multisample;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_non_power_of_two;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_query_lod;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rectangle;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rg;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_rgb10_a2ui;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_texture_swizzle;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_timer_query;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback2;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transform_feedback3;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_transpose_matrix;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_uniform_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_bgra;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_array_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_attrib_64bit;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_blend;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_buffer_object;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_program;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_shader;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev;
+GLEW_VAR_EXPORT GLboolean __GLEW_ARB_viewport_array;
GLEW_VAR_EXPORT GLboolean __GLEW_ARB_window_pos;
GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_point_sprites;
GLEW_VAR_EXPORT GLboolean __GLEW_ATIX_texture_env_combine3;
@@ -11936,6 +14997,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_ATI_element_array;
GLEW_VAR_EXPORT GLboolean __GLEW_ATI_envmap_bumpmap;
GLEW_VAR_EXPORT GLboolean __GLEW_ATI_fragment_shader;
GLEW_VAR_EXPORT GLboolean __GLEW_ATI_map_object_buffer;
+GLEW_VAR_EXPORT GLboolean __GLEW_ATI_meminfo;
GLEW_VAR_EXPORT GLboolean __GLEW_ATI_pn_triangles;
GLEW_VAR_EXPORT GLboolean __GLEW_ATI_separate_stencil;
GLEW_VAR_EXPORT GLboolean __GLEW_ATI_shader_texture_lod;
@@ -11998,10 +15060,13 @@ GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_pixel_transform_color_table;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_point_parameters;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_polygon_offset;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_provoking_vertex;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_rescale_normal;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_scene_marker;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_secondary_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_shader_objects;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_separate_specular_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shader_image_load_store;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shadow_funcs;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_shared_texture_palette;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_stencil_clear_tag;
@@ -12030,12 +15095,15 @@ GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_object;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_perturb_normal;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_rectangle;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_sRGB_decode;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_shared_exponent;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_snorm;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_texture_swizzle;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_timer_query;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_transform_feedback;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_array_bgra;
+GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_attrib_64bit;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_shader;
GLEW_VAR_EXPORT GLboolean __GLEW_EXT_vertex_weighting;
GLEW_VAR_EXPORT GLboolean __GLEW_GREMEDY_frame_terminator;
@@ -12060,9 +15128,11 @@ GLEW_VAR_EXPORT GLboolean __GLEW_MESA_pack_invert;
GLEW_VAR_EXPORT GLboolean __GLEW_MESA_resize_buffers;
GLEW_VAR_EXPORT GLboolean __GLEW_MESA_window_pos;
GLEW_VAR_EXPORT GLboolean __GLEW_MESA_ycbcr_texture;
+GLEW_VAR_EXPORT GLboolean __GLEW_NVX_gpu_memory_info;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_blend_square;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_conditional_render;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_depth_to_color;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_copy_image;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_buffer_float;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_clamp;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_depth_range_unclamped;
@@ -12079,20 +15149,28 @@ GLEW_VAR_EXPORT GLboolean __GLEW_NV_framebuffer_multisample_coverage;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_program4;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_geometry_shader4;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program4;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program5;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_program_fp64;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_gpu_shader5;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_half_float;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_light_max_exponent;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_coverage;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_multisample_filter_hint;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_occlusion_query;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_packed_depth_stencil;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_parameter_buffer_object2;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_pixel_data_range;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_point_sprite;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_present_video;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_primitive_restart;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_register_combiners2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_shader_buffer_load;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_tessellation_program5;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_emboss;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_texgen_reflection;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_barrier;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_compression_vtc;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_env_combine4;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_expand_normal;
@@ -12101,8 +15179,12 @@ GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader2;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_texture_shader3;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_transform_feedback2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vdpau_interop;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_array_range2;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_attrib_integer_64bit;
+GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_buffer_unified_memory;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program1_1;
GLEW_VAR_EXPORT GLboolean __GLEW_NV_vertex_program2;
@@ -12191,8 +15273,8 @@ GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint;
#define GLEW_OK 0
#define GLEW_NO_ERROR 0
#define GLEW_ERROR_NO_GL_VERSION 1 /* missing GL version */
-#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* GL 1.1 and up are not supported */
-#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* GLX 1.2 and up are not supported */
+#define GLEW_ERROR_GL_VERSION_10_ONLY 2 /* Need at least OpenGL 1.1 */
+#define GLEW_ERROR_GLX_VERSION_11_ONLY 3 /* Need at least GLX 1.2 */
/* string codes */
#define GLEW_VERSION 1
@@ -12205,7 +15287,7 @@ GLEW_VAR_EXPORT GLboolean __GLEW_WIN_swap_hint;
typedef struct GLEWContextStruct GLEWContext;
GLEWAPI GLenum glewContextInit (GLEWContext* ctx);
-GLEWAPI GLboolean glewContextIsSupported (GLEWContext* ctx, const char* name);
+GLEWAPI GLboolean glewContextIsSupported (const GLEWContext* ctx, const char* name);
#define glewInit() glewContextInit(glewGetContext())
#define glewIsSupported(x) glewContextIsSupported(glewGetContext(), x)
@@ -12242,6 +15324,7 @@ GLEWAPI const GLubyte* glewGetString (GLenum name);
#undef GLEW_APIENTRY_DEFINED
#undef APIENTRY
#undef GLAPIENTRY
+#define GLAPIENTRY
#endif
#ifdef GLEW_CALLBACK_DEFINED
diff --git a/extern/glew/include/GL/glxew.h b/extern/glew/include/GL/glxew.h
index a29030da3cb..68fcac295be 100644
--- a/extern/glew/include/GL/glxew.h
+++ b/extern/glew/include/GL/glxew.h
@@ -83,13 +83,16 @@
#ifdef __glxext_h_
#error glxext.h included before glxew.h
#endif
-#ifdef GLX_H
+
+#if defined(GLX_H) || defined(__GLX_glx_h__) || defined(__glx_h__)
#error glx.h included before glxew.h
#endif
#define __glxext_h_
-#define __GLX_glx_h__
+
#define GLX_H
+#define __GLX_glx_h__
+#define __glx_h__
#include <X11/Xlib.h>
#include <X11/Xutil.h>
@@ -255,8 +258,8 @@ typedef Display* ( * PFNGLXGETCURRENTDISPLAYPROC) (void);
#define GLX_DONT_CARE 0xFFFFFFFF
typedef XID GLXFBConfigID;
-typedef XID GLXWindow;
typedef XID GLXPbuffer;
+typedef XID GLXWindow;
typedef struct __GLXFBConfigRec *GLXFBConfig;
typedef struct {
@@ -343,6 +346,26 @@ extern void ( * glXGetProcAddress (const GLubyte *procName)) (void);
#endif /* GLX_3DFX_multisample */
+/* ------------------------ GLX_AMD_gpu_association ------------------------ */
+
+#ifndef GLX_AMD_gpu_association
+#define GLX_AMD_gpu_association 1
+
+#define GLX_GPU_VENDOR_AMD 0x1F00
+#define GLX_GPU_RENDERER_STRING_AMD 0x1F01
+#define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02
+#define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2
+#define GLX_GPU_RAM_AMD 0x21A3
+#define GLX_GPU_CLOCK_AMD 0x21A4
+#define GLX_GPU_NUM_PIPES_AMD 0x21A5
+#define GLX_GPU_NUM_SIMD_AMD 0x21A6
+#define GLX_GPU_NUM_RB_AMD 0x21A7
+#define GLX_GPU_NUM_SPI_AMD 0x21A8
+
+#define GLXEW_AMD_gpu_association GLXEW_GET_VAR(__GLXEW_AMD_gpu_association)
+
+#endif /* GLX_AMD_gpu_association */
+
/* ------------------------- GLX_ARB_create_context ------------------------ */
#ifndef GLX_ARB_create_context
@@ -362,6 +385,33 @@ typedef GLXContext ( * PFNGLXCREATECONTEXTATTRIBSARBPROC) (Display* dpy, GLXFBCo
#endif /* GLX_ARB_create_context */
+/* --------------------- GLX_ARB_create_context_profile -------------------- */
+
+#ifndef GLX_ARB_create_context_profile
+#define GLX_ARB_create_context_profile 1
+
+#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
+
+#define GLXEW_ARB_create_context_profile GLXEW_GET_VAR(__GLXEW_ARB_create_context_profile)
+
+#endif /* GLX_ARB_create_context_profile */
+
+/* ------------------- GLX_ARB_create_context_robustness ------------------- */
+
+#ifndef GLX_ARB_create_context_robustness
+#define GLX_ARB_create_context_robustness 1
+
+#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261
+
+#define GLXEW_ARB_create_context_robustness GLXEW_GET_VAR(__GLXEW_ARB_create_context_robustness)
+
+#endif /* GLX_ARB_create_context_robustness */
+
/* ------------------------- GLX_ARB_fbconfig_float ------------------------ */
#ifndef GLX_ARB_fbconfig_float
@@ -408,6 +458,17 @@ extern void ( * glXGetProcAddressARB (const GLubyte *procName)) (void);
#endif /* GLX_ARB_multisample */
+/* ---------------------- GLX_ARB_vertex_buffer_object --------------------- */
+
+#ifndef GLX_ARB_vertex_buffer_object
+#define GLX_ARB_vertex_buffer_object 1
+
+#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095
+
+#define GLXEW_ARB_vertex_buffer_object GLXEW_GET_VAR(__GLXEW_ARB_vertex_buffer_object)
+
+#endif /* GLX_ARB_vertex_buffer_object */
+
/* ----------------------- GLX_ATI_pixel_format_float ---------------------- */
#ifndef GLX_ATI_pixel_format_float
@@ -472,6 +533,17 @@ typedef void ( * PFNGLXRELEASETEXIMAGEATIPROC) (Display *dpy, GLXPbuffer pbuf, i
#endif /* GLX_ATI_render_texture */
+/* ------------------- GLX_EXT_create_context_es2_profile ------------------ */
+
+#ifndef GLX_EXT_create_context_es2_profile
+#define GLX_EXT_create_context_es2_profile 1
+
+#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
+
+#define GLXEW_EXT_create_context_es2_profile GLXEW_GET_VAR(__GLXEW_EXT_create_context_es2_profile)
+
+#endif /* GLX_EXT_create_context_es2_profile */
+
/* --------------------- GLX_EXT_fbconfig_packed_float --------------------- */
#ifndef GLX_EXT_fbconfig_packed_float
@@ -529,6 +601,22 @@ typedef int ( * PFNGLXQUERYCONTEXTINFOEXTPROC) (Display* dpy, GLXContext context
#endif /* GLX_EXT_scene_marker */
+/* -------------------------- GLX_EXT_swap_control ------------------------- */
+
+#ifndef GLX_EXT_swap_control
+#define GLX_EXT_swap_control 1
+
+#define GLX_SWAP_INTERVAL_EXT 0x20F1
+#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2
+
+typedef void ( * PFNGLXSWAPINTERVALEXTPROC) (Display* dpy, GLXDrawable drawable, int interval);
+
+#define glXSwapIntervalEXT GLXEW_GET_FUN(__glewXSwapIntervalEXT)
+
+#define GLXEW_EXT_swap_control GLXEW_GET_VAR(__GLXEW_EXT_swap_control)
+
+#endif /* GLX_EXT_swap_control */
+
/* ---------------------- GLX_EXT_texture_from_pixmap ---------------------- */
#ifndef GLX_EXT_texture_from_pixmap
@@ -615,6 +703,20 @@ typedef void ( * PFNGLXRELEASETEXIMAGEEXTPROC) (Display* display, GLXDrawable dr
#endif /* GLX_EXT_visual_rating */
+/* -------------------------- GLX_INTEL_swap_event ------------------------- */
+
+#ifndef GLX_INTEL_swap_event
+#define GLX_INTEL_swap_event 1
+
+#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180
+#define GLX_COPY_COMPLETE_INTEL 0x8181
+#define GLX_FLIP_COMPLETE_INTEL 0x8182
+#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000
+
+#define GLXEW_INTEL_swap_event GLXEW_GET_VAR(__GLXEW_INTEL_swap_event)
+
+#endif /* GLX_INTEL_swap_event */
+
/* -------------------------- GLX_MESA_agp_offset -------------------------- */
#ifndef GLX_MESA_agp_offset
@@ -683,6 +785,19 @@ typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode);
#endif /* GLX_MESA_set_3dfx_mode */
+/* --------------------------- GLX_NV_copy_image --------------------------- */
+
+#ifndef GLX_NV_copy_image
+#define GLX_NV_copy_image 1
+
+typedef void ( * PFNGLXCOPYIMAGESUBDATANVPROC) (Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
+
+#define glXCopyImageSubDataNV GLXEW_GET_FUN(__glewXCopyImageSubDataNV)
+
+#define GLXEW_NV_copy_image GLXEW_GET_VAR(__GLXEW_NV_copy_image)
+
+#endif /* GLX_NV_copy_image */
+
/* -------------------------- GLX_NV_float_buffer -------------------------- */
#ifndef GLX_NV_float_buffer
@@ -694,6 +809,18 @@ typedef GLboolean ( * PFNGLXSET3DFXMODEMESAPROC) (GLint mode);
#endif /* GLX_NV_float_buffer */
+/* ---------------------- GLX_NV_multisample_coverage ---------------------- */
+
+#ifndef GLX_NV_multisample_coverage
+#define GLX_NV_multisample_coverage 1
+
+#define GLX_COLOR_SAMPLES_NV 0x20B3
+#define GLX_COVERAGE_SAMPLES_NV 100001
+
+#define GLXEW_NV_multisample_coverage GLXEW_GET_VAR(__GLXEW_NV_multisample_coverage)
+
+#endif /* GLX_NV_multisample_coverage */
+
/* -------------------------- GLX_NV_present_video ------------------------- */
#ifndef GLX_NV_present_video
@@ -1137,7 +1264,7 @@ typedef int ( * PFNGLXSWAPINTERVALSGIPROC) (int interval);
#ifndef GLX_SGI_video_sync
#define GLX_SGI_video_sync 1
-typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (uint* count);
+typedef int ( * PFNGLXGETVIDEOSYNCSGIPROC) (unsigned int* count);
typedef int ( * PFNGLXWAITVIDEOSYNCSGIPROC) (int divisor, int remainder, unsigned int* count);
#define glXGetVideoSyncSGI GLXEW_GET_FUN(__glewXGetVideoSyncSGI)
@@ -1217,6 +1344,8 @@ extern PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT;
extern PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT;
extern PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT;
+extern PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT;
+
extern PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT;
extern PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT;
@@ -1230,6 +1359,8 @@ extern PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA;
extern PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA;
+extern PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV;
+
extern PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV;
extern PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV;
@@ -1317,26 +1448,35 @@ GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_2;
GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_3;
GLXEW_EXPORT GLboolean __GLXEW_VERSION_1_4;
GLXEW_EXPORT GLboolean __GLXEW_3DFX_multisample;
+GLXEW_EXPORT GLboolean __GLXEW_AMD_gpu_association;
GLXEW_EXPORT GLboolean __GLXEW_ARB_create_context;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_create_context_profile;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_create_context_robustness;
GLXEW_EXPORT GLboolean __GLXEW_ARB_fbconfig_float;
GLXEW_EXPORT GLboolean __GLXEW_ARB_framebuffer_sRGB;
GLXEW_EXPORT GLboolean __GLXEW_ARB_get_proc_address;
GLXEW_EXPORT GLboolean __GLXEW_ARB_multisample;
+GLXEW_EXPORT GLboolean __GLXEW_ARB_vertex_buffer_object;
GLXEW_EXPORT GLboolean __GLXEW_ATI_pixel_format_float;
GLXEW_EXPORT GLboolean __GLXEW_ATI_render_texture;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_create_context_es2_profile;
GLXEW_EXPORT GLboolean __GLXEW_EXT_fbconfig_packed_float;
GLXEW_EXPORT GLboolean __GLXEW_EXT_framebuffer_sRGB;
GLXEW_EXPORT GLboolean __GLXEW_EXT_import_context;
GLXEW_EXPORT GLboolean __GLXEW_EXT_scene_marker;
+GLXEW_EXPORT GLboolean __GLXEW_EXT_swap_control;
GLXEW_EXPORT GLboolean __GLXEW_EXT_texture_from_pixmap;
GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_info;
GLXEW_EXPORT GLboolean __GLXEW_EXT_visual_rating;
+GLXEW_EXPORT GLboolean __GLXEW_INTEL_swap_event;
GLXEW_EXPORT GLboolean __GLXEW_MESA_agp_offset;
GLXEW_EXPORT GLboolean __GLXEW_MESA_copy_sub_buffer;
GLXEW_EXPORT GLboolean __GLXEW_MESA_pixmap_colormap;
GLXEW_EXPORT GLboolean __GLXEW_MESA_release_buffers;
GLXEW_EXPORT GLboolean __GLXEW_MESA_set_3dfx_mode;
+GLXEW_EXPORT GLboolean __GLXEW_NV_copy_image;
GLXEW_EXPORT GLboolean __GLXEW_NV_float_buffer;
+GLXEW_EXPORT GLboolean __GLXEW_NV_multisample_coverage;
GLXEW_EXPORT GLboolean __GLXEW_NV_present_video;
GLXEW_EXPORT GLboolean __GLXEW_NV_swap_group;
GLXEW_EXPORT GLboolean __GLXEW_NV_vertex_array_range;
@@ -1371,7 +1511,7 @@ GLXEW_EXPORT GLboolean __GLXEW_SUN_video_resize;
typedef struct GLXEWContextStruct GLXEWContext;
extern GLenum glxewContextInit (GLXEWContext* ctx);
-extern GLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name);
+extern GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name);
#define glxewInit() glxewContextInit(glxewGetContext())
#define glxewIsSupported(x) glxewContextIsSupported(glxewGetContext(), x)
diff --git a/extern/glew/include/GL/wglew.h b/extern/glew/include/GL/wglew.h
index 2eaad3651ac..ab01d343a51 100644
--- a/extern/glew/include/GL/wglew.h
+++ b/extern/glew/include/GL/wglew.h
@@ -62,11 +62,12 @@
#define __wglext_h_
-#if !defined(APIENTRY) && !defined(__CYGWIN__)
+#if !defined(WINAPI)
# ifndef WIN32_LEAN_AND_MEAN
# define WIN32_LEAN_AND_MEAN 1
# endif
#include <windows.h>
+# undef WIN32_LEAN_AND_MEAN
#endif
/*
@@ -117,6 +118,46 @@ typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState
#endif /* WGL_3DL_stereo_control */
+/* ------------------------ WGL_AMD_gpu_association ------------------------ */
+
+#ifndef WGL_AMD_gpu_association
+#define WGL_AMD_gpu_association 1
+
+#define WGL_GPU_VENDOR_AMD 0x1F00
+#define WGL_GPU_RENDERER_STRING_AMD 0x1F01
+#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02
+#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2
+#define WGL_GPU_RAM_AMD 0x21A3
+#define WGL_GPU_CLOCK_AMD 0x21A4
+#define WGL_GPU_NUM_PIPES_AMD 0x21A5
+#define WGL_GPU_NUM_SIMD_AMD 0x21A6
+#define WGL_GPU_NUM_RB_AMD 0x21A7
+#define WGL_GPU_NUM_SPI_AMD 0x21A8
+
+typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id);
+typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList);
+typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc);
+typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc);
+typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void);
+typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids);
+//XXX-blender, added: typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data);
+typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc);
+
+#define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD)
+#define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD)
+#define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD)
+#define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD)
+#define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD)
+#define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD)
+#define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD)
+#define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD)
+#define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD)
+
+#define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association)
+
+#endif /* WGL_AMD_gpu_association */
+
/* ------------------------- WGL_ARB_buffer_region ------------------------- */
#ifndef WGL_ARB_buffer_region
@@ -161,6 +202,33 @@ typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShar
#endif /* WGL_ARB_create_context */
+/* --------------------- WGL_ARB_create_context_profile -------------------- */
+
+#ifndef WGL_ARB_create_context_profile
+#define WGL_ARB_create_context_profile 1
+
+#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
+
+#define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile)
+
+#endif /* WGL_ARB_create_context_profile */
+
+/* ------------------- WGL_ARB_create_context_robustness ------------------- */
+
+#ifndef WGL_ARB_create_context_robustness
+#define WGL_ARB_create_context_robustness 1
+
+#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261
+
+#define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness)
+
+#endif /* WGL_ARB_create_context_robustness */
+
/* ----------------------- WGL_ARB_extensions_string ----------------------- */
#ifndef WGL_ARB_extensions_string
@@ -400,6 +468,17 @@ typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, con
#endif /* WGL_ATI_render_texture_rectangle */
+/* ------------------- WGL_EXT_create_context_es2_profile ------------------ */
+
+#ifndef WGL_EXT_create_context_es2_profile
+#define WGL_EXT_create_context_es2_profile 1
+
+#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
+
+#define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile)
+
+#endif /* WGL_EXT_create_context_es2_profile */
+
/* -------------------------- WGL_EXT_depth_float -------------------------- */
#ifndef WGL_EXT_depth_float
@@ -752,6 +831,19 @@ typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWO
#endif /* WGL_I3D_swap_frame_usage */
+/* --------------------------- WGL_NV_copy_image --------------------------- */
+
+#ifndef WGL_NV_copy_image
+#define WGL_NV_copy_image 1
+
+typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
+
+#define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV)
+
+#define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image)
+
+#endif /* WGL_NV_copy_image */
+
/* -------------------------- WGL_NV_float_buffer -------------------------- */
#ifndef WGL_NV_float_buffer
@@ -804,6 +896,18 @@ typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu);
#endif /* WGL_NV_gpu_affinity */
+/* ---------------------- WGL_NV_multisample_coverage ---------------------- */
+
+#ifndef WGL_NV_multisample_coverage
+#define WGL_NV_multisample_coverage 1
+
+#define WGL_COVERAGE_SAMPLES_NV 0x2042
+#define WGL_COLOR_SAMPLES_NV 0x20B9
+
+#define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage)
+
+#endif /* WGL_NV_multisample_coverage */
+
/* -------------------------- WGL_NV_present_video ------------------------- */
#ifndef WGL_NV_present_video
@@ -863,7 +967,7 @@ typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrie
typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group);
typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count);
typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers);
-typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group);
+typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier);
typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC);
#define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV)
@@ -969,6 +1073,16 @@ struct WGLEWContextStruct
WGLEW_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL;
+WGLEW_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD;
+WGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD;
+WGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD;
+WGLEW_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD;
+WGLEW_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD;
+WGLEW_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD;
+WGLEW_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD;
+//XXX-blender, added: WGLEW_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD;
+WGLEW_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD;
+
WGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB;
WGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB;
WGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB;
@@ -1054,6 +1168,8 @@ WGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D;
WGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D;
WGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D;
+WGLEW_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV;
+
WGLEW_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV;
WGLEW_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV;
WGLEW_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV;
@@ -1089,8 +1205,11 @@ WGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML;
WGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML;
WGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample;
WGLEW_EXPORT GLboolean __WGLEW_3DL_stereo_control;
+WGLEW_EXPORT GLboolean __WGLEW_AMD_gpu_association;
WGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region;
WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_profile;
+WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_robustness;
WGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string;
WGLEW_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB;
WGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read;
@@ -1101,6 +1220,7 @@ WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float;
WGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture;
WGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float;
WGLEW_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle;
+WGLEW_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile;
WGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float;
WGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table;
WGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string;
@@ -1117,8 +1237,10 @@ WGLEW_EXPORT GLboolean __WGLEW_I3D_genlock;
WGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer;
WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock;
WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage;
+WGLEW_EXPORT GLboolean __WGLEW_NV_copy_image;
WGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer;
WGLEW_EXPORT GLboolean __WGLEW_NV_gpu_affinity;
+WGLEW_EXPORT GLboolean __WGLEW_NV_multisample_coverage;
WGLEW_EXPORT GLboolean __WGLEW_NV_present_video;
WGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture;
WGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle;
@@ -1137,7 +1259,7 @@ WGLEW_EXPORT GLboolean __WGLEW_OML_sync_control;
typedef struct WGLEWContextStruct WGLEWContext;
GLEWAPI GLenum wglewContextInit (WGLEWContext* ctx);
-GLEWAPI GLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name);
+GLEWAPI GLboolean wglewContextIsSupported (const WGLEWContext* ctx, const char* name);
#define wglewInit() wglewContextInit(wglewGetContext())
#define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x)
diff --git a/extern/glew/src/glew.c b/extern/glew/src/glew.c
index 1d947d364d3..ddc97d3b445 100644
--- a/extern/glew/src/glew.c
+++ b/extern/glew/src/glew.c
@@ -65,10 +65,57 @@
# define GLXEW_CONTEXT_ARG_DEF_LIST void
#endif /* GLEW_MX */
+#if defined(__sgi) || defined (__sun) || defined(GLEW_APPLE_GLX)
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+void* dlGetProcAddress (const GLubyte* name)
+{
+ static void* h = NULL;
+ static void* gpa;
+
+ if (h == NULL)
+ {
+ if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL;
+ gpa = dlsym(h, "glXGetProcAddress");
+ }
+
+ if (gpa != NULL)
+ return ((void*(*)(const GLubyte*))gpa)(name);
+ else
+ return dlsym(h, (const char*)name);
+}
+#endif /* __sgi || __sun || GLEW_APPLE_GLX */
+
#if defined(__APPLE__)
-#include <mach-o/dyld.h>
#include <stdlib.h>
#include <string.h>
+#include <AvailabilityMacros.h>
+
+#ifdef MAC_OS_X_VERSION_10_3
+
+#include <dlfcn.h>
+
+void* NSGLGetProcAddress (const GLubyte *name)
+{
+ static void* image = NULL;
+ if (NULL == image)
+ {
+ image = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_LAZY);
+ }
+ if( !image ) return NULL;
+ void* addr = dlsym(image, (const char*)name);
+ if( addr ) return addr;
+#ifdef GLEW_APPLE_GLX
+ return dlGetProcAddress( name ); // try next for glx symbols
+#else
+ return NULL;
+#endif
+}
+#else
+
+#include <mach-o/dyld.h>
void* NSGLGetProcAddress (const GLubyte *name)
{
@@ -88,33 +135,16 @@ void* NSGLGetProcAddress (const GLubyte *name)
symbol = NSLookupAndBindSymbol(symbolName); */
symbol = image ? NSLookupSymbolInImage(image, symbolName, NSLOOKUPSYMBOLINIMAGE_OPTION_BIND | NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR) : NULL;
free(symbolName);
- return symbol ? NSAddressOfSymbol(symbol) : NULL;
+ if( symbol ) return NSAddressOfSymbol(symbol);
+#ifdef GLEW_APPLE_GLX
+ return dlGetProcAddress( name ); // try next for glx symbols
+#else
+ return NULL;
+#endif
}
+#endif /* MAC_OS_X_VERSION_10_3 */
#endif /* __APPLE__ */
-#if defined(__sgi) || defined (__sun)
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-void* dlGetProcAddress (const GLubyte* name)
-{
- static void* h = NULL;
- static void* gpa;
-
- if (h == NULL)
- {
- if ((h = dlopen(NULL, RTLD_LAZY | RTLD_LOCAL)) == NULL) return NULL;
- gpa = dlsym(h, "glXGetProcAddress");
- }
-
- if (gpa != NULL)
- return ((void*(*)(const GLubyte*))gpa)(name);
- else
- return dlsym(h, (const char*)name);
-}
-#endif /* __sgi || __sun */
-
/*
* Define glewGetProcAddress.
*/
@@ -177,12 +207,12 @@ static GLboolean _glewStrSame1 (GLubyte** a, GLuint* na, const GLubyte* b, GLuin
{
GLuint i=0;
while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;
- if(i == nb)
- {
- *a = *a + nb;
- *na = *na - nb;
- return GL_TRUE;
- }
+ if(i == nb)
+ {
+ *a = *a + nb;
+ *na = *na - nb;
+ return GL_TRUE;
+ }
}
return GL_FALSE;
}
@@ -193,12 +223,12 @@ static GLboolean _glewStrSame2 (GLubyte** a, GLuint* na, const GLubyte* b, GLuin
{
GLuint i=0;
while (i < nb && (*a)+i != NULL && b+i != NULL && (*a)[i] == b[i]) i++;
- if(i == nb)
- {
- *a = *a + nb;
- *na = *na - nb;
- return GL_TRUE;
- }
+ if(i == nb)
+ {
+ *a = *a + nb;
+ *na = *na - nb;
+ return GL_TRUE;
+ }
}
return GL_FALSE;
}
@@ -444,8 +474,6 @@ PFNGLUNIFORMMATRIX4X3FVPROC __glewUniformMatrix4x3fv = NULL;
PFNGLBEGINCONDITIONALRENDERPROC __glewBeginConditionalRender = NULL;
PFNGLBEGINTRANSFORMFEEDBACKPROC __glewBeginTransformFeedback = NULL;
-PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL;
-PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL;
PFNGLBINDFRAGDATALOCATIONPROC __glewBindFragDataLocation = NULL;
PFNGLCLAMPCOLORPROC __glewClampColor = NULL;
PFNGLCLEARBUFFERFIPROC __glewClearBufferfi = NULL;
@@ -459,7 +487,6 @@ PFNGLENDCONDITIONALRENDERPROC __glewEndConditionalRender = NULL;
PFNGLENDTRANSFORMFEEDBACKPROC __glewEndTransformFeedback = NULL;
PFNGLGETBOOLEANI_VPROC __glewGetBooleani_v = NULL;
PFNGLGETFRAGDATALOCATIONPROC __glewGetFragDataLocation = NULL;
-PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL;
PFNGLGETSTRINGIPROC __glewGetStringi = NULL;
PFNGLGETTEXPARAMETERIIVPROC __glewGetTexParameterIiv = NULL;
PFNGLGETTEXPARAMETERIUIVPROC __glewGetTexParameterIuiv = NULL;
@@ -501,8 +528,54 @@ PFNGLVERTEXATTRIBI4UIVPROC __glewVertexAttribI4uiv = NULL;
PFNGLVERTEXATTRIBI4USVPROC __glewVertexAttribI4usv = NULL;
PFNGLVERTEXATTRIBIPOINTERPROC __glewVertexAttribIPointer = NULL;
+PFNGLDRAWARRAYSINSTANCEDPROC __glewDrawArraysInstanced = NULL;
+PFNGLDRAWELEMENTSINSTANCEDPROC __glewDrawElementsInstanced = NULL;
+PFNGLPRIMITIVERESTARTINDEXPROC __glewPrimitiveRestartIndex = NULL;
+PFNGLTEXBUFFERPROC __glewTexBuffer = NULL;
+
+PFNGLFRAMEBUFFERTEXTUREPROC __glewFramebufferTexture = NULL;
+PFNGLGETBUFFERPARAMETERI64VPROC __glewGetBufferParameteri64v = NULL;
+PFNGLGETINTEGER64I_VPROC __glewGetInteger64i_v = NULL;
+
+PFNGLVERTEXATTRIBDIVISORPROC __glewVertexAttribDivisor = NULL;
+
+PFNGLBLENDEQUATIONSEPARATEIPROC __glewBlendEquationSeparatei = NULL;
+PFNGLBLENDEQUATIONIPROC __glewBlendEquationi = NULL;
+PFNGLBLENDFUNCSEPARATEIPROC __glewBlendFuncSeparatei = NULL;
+PFNGLBLENDFUNCIPROC __glewBlendFunci = NULL;
+PFNGLMINSAMPLESHADINGPROC __glewMinSampleShading = NULL;
+
PFNGLTBUFFERMASK3DFXPROC __glewTbufferMask3DFX = NULL;
+PFNGLDEBUGMESSAGECALLBACKAMDPROC __glewDebugMessageCallbackAMD = NULL;
+PFNGLDEBUGMESSAGEENABLEAMDPROC __glewDebugMessageEnableAMD = NULL;
+PFNGLDEBUGMESSAGEINSERTAMDPROC __glewDebugMessageInsertAMD = NULL;
+PFNGLGETDEBUGMESSAGELOGAMDPROC __glewGetDebugMessageLogAMD = NULL;
+
+PFNGLBLENDEQUATIONINDEXEDAMDPROC __glewBlendEquationIndexedAMD = NULL;
+PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC __glewBlendEquationSeparateIndexedAMD = NULL;
+PFNGLBLENDFUNCINDEXEDAMDPROC __glewBlendFuncIndexedAMD = NULL;
+PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC __glewBlendFuncSeparateIndexedAMD = NULL;
+
+PFNGLDELETENAMESAMDPROC __glewDeleteNamesAMD = NULL;
+PFNGLGENNAMESAMDPROC __glewGenNamesAMD = NULL;
+PFNGLISNAMEAMDPROC __glewIsNameAMD = NULL;
+
+PFNGLBEGINPERFMONITORAMDPROC __glewBeginPerfMonitorAMD = NULL;
+PFNGLDELETEPERFMONITORSAMDPROC __glewDeletePerfMonitorsAMD = NULL;
+PFNGLENDPERFMONITORAMDPROC __glewEndPerfMonitorAMD = NULL;
+PFNGLGENPERFMONITORSAMDPROC __glewGenPerfMonitorsAMD = NULL;
+PFNGLGETPERFMONITORCOUNTERDATAAMDPROC __glewGetPerfMonitorCounterDataAMD = NULL;
+PFNGLGETPERFMONITORCOUNTERINFOAMDPROC __glewGetPerfMonitorCounterInfoAMD = NULL;
+PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC __glewGetPerfMonitorCounterStringAMD = NULL;
+PFNGLGETPERFMONITORCOUNTERSAMDPROC __glewGetPerfMonitorCountersAMD = NULL;
+PFNGLGETPERFMONITORGROUPSTRINGAMDPROC __glewGetPerfMonitorGroupStringAMD = NULL;
+PFNGLGETPERFMONITORGROUPSAMDPROC __glewGetPerfMonitorGroupsAMD = NULL;
+PFNGLSELECTPERFMONITORCOUNTERSAMDPROC __glewSelectPerfMonitorCountersAMD = NULL;
+
+PFNGLTESSELLATIONFACTORAMDPROC __glewTessellationFactorAMD = NULL;
+PFNGLTESSELLATIONMODEAMDPROC __glewTessellationModeAMD = NULL;
+
PFNGLDRAWELEMENTARRAYAPPLEPROC __glewDrawElementArrayAPPLE = NULL;
PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC __glewDrawRangeElementArrayAPPLE = NULL;
PFNGLELEMENTPOINTERAPPLEPROC __glewElementPointerAPPLE = NULL;
@@ -521,6 +594,10 @@ PFNGLTESTOBJECTAPPLEPROC __glewTestObjectAPPLE = NULL;
PFNGLBUFFERPARAMETERIAPPLEPROC __glewBufferParameteriAPPLE = NULL;
PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC __glewFlushMappedBufferRangeAPPLE = NULL;
+PFNGLGETOBJECTPARAMETERIVAPPLEPROC __glewGetObjectParameterivAPPLE = NULL;
+PFNGLOBJECTPURGEABLEAPPLEPROC __glewObjectPurgeableAPPLE = NULL;
+PFNGLOBJECTUNPURGEABLEAPPLEPROC __glewObjectUnpurgeableAPPLE = NULL;
+
PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC __glewGetTexParameterPointervAPPLE = NULL;
PFNGLTEXTURERANGEAPPLEPROC __glewTextureRangeAPPLE = NULL;
@@ -533,10 +610,49 @@ PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC __glewFlushVertexArrayRangeAPPLE = NULL;
PFNGLVERTEXARRAYPARAMETERIAPPLEPROC __glewVertexArrayParameteriAPPLE = NULL;
PFNGLVERTEXARRAYRANGEAPPLEPROC __glewVertexArrayRangeAPPLE = NULL;
+PFNGLDISABLEVERTEXATTRIBAPPLEPROC __glewDisableVertexAttribAPPLE = NULL;
+PFNGLENABLEVERTEXATTRIBAPPLEPROC __glewEnableVertexAttribAPPLE = NULL;
+PFNGLISVERTEXATTRIBENABLEDAPPLEPROC __glewIsVertexAttribEnabledAPPLE = NULL;
+PFNGLMAPVERTEXATTRIB1DAPPLEPROC __glewMapVertexAttrib1dAPPLE = NULL;
+PFNGLMAPVERTEXATTRIB1FAPPLEPROC __glewMapVertexAttrib1fAPPLE = NULL;
+PFNGLMAPVERTEXATTRIB2DAPPLEPROC __glewMapVertexAttrib2dAPPLE = NULL;
+PFNGLMAPVERTEXATTRIB2FAPPLEPROC __glewMapVertexAttrib2fAPPLE = NULL;
+
+PFNGLCLEARDEPTHFPROC __glewClearDepthf = NULL;
+PFNGLDEPTHRANGEFPROC __glewDepthRangef = NULL;
+PFNGLGETSHADERPRECISIONFORMATPROC __glewGetShaderPrecisionFormat = NULL;
+PFNGLRELEASESHADERCOMPILERPROC __glewReleaseShaderCompiler = NULL;
+PFNGLSHADERBINARYPROC __glewShaderBinary = NULL;
+
+PFNGLBINDFRAGDATALOCATIONINDEXEDPROC __glewBindFragDataLocationIndexed = NULL;
+PFNGLGETFRAGDATAINDEXPROC __glewGetFragDataIndex = NULL;
+
+PFNGLCREATESYNCFROMCLEVENTARBPROC __glewCreateSyncFromCLeventARB = NULL;
+
PFNGLCLAMPCOLORARBPROC __glewClampColorARB = NULL;
+PFNGLCOPYBUFFERSUBDATAPROC __glewCopyBufferSubData = NULL;
+
+PFNGLDEBUGMESSAGECALLBACKARBPROC __glewDebugMessageCallbackARB = NULL;
+PFNGLDEBUGMESSAGECONTROLARBPROC __glewDebugMessageControlARB = NULL;
+PFNGLDEBUGMESSAGEINSERTARBPROC __glewDebugMessageInsertARB = NULL;
+PFNGLGETDEBUGMESSAGELOGARBPROC __glewGetDebugMessageLogARB = NULL;
+
PFNGLDRAWBUFFERSARBPROC __glewDrawBuffersARB = NULL;
+PFNGLBLENDEQUATIONSEPARATEIARBPROC __glewBlendEquationSeparateiARB = NULL;
+PFNGLBLENDEQUATIONIARBPROC __glewBlendEquationiARB = NULL;
+PFNGLBLENDFUNCSEPARATEIARBPROC __glewBlendFuncSeparateiARB = NULL;
+PFNGLBLENDFUNCIARBPROC __glewBlendFunciARB = NULL;
+
+PFNGLDRAWELEMENTSBASEVERTEXPROC __glewDrawElementsBaseVertex = NULL;
+PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC __glewDrawElementsInstancedBaseVertex = NULL;
+PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC __glewDrawRangeElementsBaseVertex = NULL;
+PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC __glewMultiDrawElementsBaseVertex = NULL;
+
+PFNGLDRAWARRAYSINDIRECTPROC __glewDrawArraysIndirect = NULL;
+PFNGLDRAWELEMENTSINDIRECTPROC __glewDrawElementsIndirect = NULL;
+
PFNGLDRAWARRAYSINSTANCEDARBPROC __glewDrawArraysInstancedARB = NULL;
PFNGLDRAWELEMENTSINSTANCEDARBPROC __glewDrawElementsInstancedARB = NULL;
@@ -547,10 +663,10 @@ PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL;
PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL;
PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL;
PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL;
-PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL;
PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL;
PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL;
PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL;
+PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL;
PFNGLGENFRAMEBUFFERSPROC __glewGenFramebuffers = NULL;
PFNGLGENRENDERBUFFERSPROC __glewGenRenderbuffers = NULL;
PFNGLGENERATEMIPMAPPROC __glewGenerateMipmap = NULL;
@@ -566,6 +682,46 @@ PFNGLFRAMEBUFFERTEXTUREFACEARBPROC __glewFramebufferTextureFaceARB = NULL;
PFNGLFRAMEBUFFERTEXTURELAYERARBPROC __glewFramebufferTextureLayerARB = NULL;
PFNGLPROGRAMPARAMETERIARBPROC __glewProgramParameteriARB = NULL;
+PFNGLGETPROGRAMBINARYPROC __glewGetProgramBinary = NULL;
+PFNGLPROGRAMBINARYPROC __glewProgramBinary = NULL;
+PFNGLPROGRAMPARAMETERIPROC __glewProgramParameteri = NULL;
+
+PFNGLGETUNIFORMDVPROC __glewGetUniformdv = NULL;
+PFNGLPROGRAMUNIFORM1DEXTPROC __glewProgramUniform1dEXT = NULL;
+PFNGLPROGRAMUNIFORM1DVEXTPROC __glewProgramUniform1dvEXT = NULL;
+PFNGLPROGRAMUNIFORM2DEXTPROC __glewProgramUniform2dEXT = NULL;
+PFNGLPROGRAMUNIFORM2DVEXTPROC __glewProgramUniform2dvEXT = NULL;
+PFNGLPROGRAMUNIFORM3DEXTPROC __glewProgramUniform3dEXT = NULL;
+PFNGLPROGRAMUNIFORM3DVEXTPROC __glewProgramUniform3dvEXT = NULL;
+PFNGLPROGRAMUNIFORM4DEXTPROC __glewProgramUniform4dEXT = NULL;
+PFNGLPROGRAMUNIFORM4DVEXTPROC __glewProgramUniform4dvEXT = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC __glewProgramUniformMatrix2dvEXT = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC __glewProgramUniformMatrix2x3dvEXT = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC __glewProgramUniformMatrix2x4dvEXT = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC __glewProgramUniformMatrix3dvEXT = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC __glewProgramUniformMatrix3x2dvEXT = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC __glewProgramUniformMatrix3x4dvEXT = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC __glewProgramUniformMatrix4dvEXT = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC __glewProgramUniformMatrix4x2dvEXT = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC __glewProgramUniformMatrix4x3dvEXT = NULL;
+PFNGLUNIFORM1DPROC __glewUniform1d = NULL;
+PFNGLUNIFORM1DVPROC __glewUniform1dv = NULL;
+PFNGLUNIFORM2DPROC __glewUniform2d = NULL;
+PFNGLUNIFORM2DVPROC __glewUniform2dv = NULL;
+PFNGLUNIFORM3DPROC __glewUniform3d = NULL;
+PFNGLUNIFORM3DVPROC __glewUniform3dv = NULL;
+PFNGLUNIFORM4DPROC __glewUniform4d = NULL;
+PFNGLUNIFORM4DVPROC __glewUniform4dv = NULL;
+PFNGLUNIFORMMATRIX2DVPROC __glewUniformMatrix2dv = NULL;
+PFNGLUNIFORMMATRIX2X3DVPROC __glewUniformMatrix2x3dv = NULL;
+PFNGLUNIFORMMATRIX2X4DVPROC __glewUniformMatrix2x4dv = NULL;
+PFNGLUNIFORMMATRIX3DVPROC __glewUniformMatrix3dv = NULL;
+PFNGLUNIFORMMATRIX3X2DVPROC __glewUniformMatrix3x2dv = NULL;
+PFNGLUNIFORMMATRIX3X4DVPROC __glewUniformMatrix3x4dv = NULL;
+PFNGLUNIFORMMATRIX4DVPROC __glewUniformMatrix4dv = NULL;
+PFNGLUNIFORMMATRIX4X2DVPROC __glewUniformMatrix4x2dv = NULL;
+PFNGLUNIFORMMATRIX4X3DVPROC __glewUniformMatrix4x3dv = NULL;
+
PFNGLCOLORSUBTABLEPROC __glewColorSubTable = NULL;
PFNGLCOLORTABLEPROC __glewColorTable = NULL;
PFNGLCOLORTABLEPARAMETERFVPROC __glewColorTableParameterfv = NULL;
@@ -659,6 +815,106 @@ PFNGLISQUERYARBPROC __glewIsQueryARB = NULL;
PFNGLPOINTPARAMETERFARBPROC __glewPointParameterfARB = NULL;
PFNGLPOINTPARAMETERFVARBPROC __glewPointParameterfvARB = NULL;
+PFNGLPROVOKINGVERTEXPROC __glewProvokingVertex = NULL;
+
+PFNGLGETNCOLORTABLEARBPROC __glewGetnColorTableARB = NULL;
+PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC __glewGetnCompressedTexImageARB = NULL;
+PFNGLGETNCONVOLUTIONFILTERARBPROC __glewGetnConvolutionFilterARB = NULL;
+PFNGLGETNHISTOGRAMARBPROC __glewGetnHistogramARB = NULL;
+PFNGLGETNMAPDVARBPROC __glewGetnMapdvARB = NULL;
+PFNGLGETNMAPFVARBPROC __glewGetnMapfvARB = NULL;
+PFNGLGETNMAPIVARBPROC __glewGetnMapivARB = NULL;
+PFNGLGETNMINMAXARBPROC __glewGetnMinmaxARB = NULL;
+PFNGLGETNPIXELMAPFVARBPROC __glewGetnPixelMapfvARB = NULL;
+PFNGLGETNPIXELMAPUIVARBPROC __glewGetnPixelMapuivARB = NULL;
+PFNGLGETNPIXELMAPUSVARBPROC __glewGetnPixelMapusvARB = NULL;
+PFNGLGETNPOLYGONSTIPPLEARBPROC __glewGetnPolygonStippleARB = NULL;
+PFNGLGETNSEPARABLEFILTERARBPROC __glewGetnSeparableFilterARB = NULL;
+PFNGLGETNTEXIMAGEARBPROC __glewGetnTexImageARB = NULL;
+PFNGLGETNUNIFORMDVARBPROC __glewGetnUniformdvARB = NULL;
+PFNGLGETNUNIFORMFVARBPROC __glewGetnUniformfvARB = NULL;
+PFNGLGETNUNIFORMIVARBPROC __glewGetnUniformivARB = NULL;
+PFNGLGETNUNIFORMUIVARBPROC __glewGetnUniformuivARB = NULL;
+PFNGLREADNPIXELSARBPROC __glewReadnPixelsARB = NULL;
+
+PFNGLMINSAMPLESHADINGARBPROC __glewMinSampleShadingARB = NULL;
+
+PFNGLBINDSAMPLERPROC __glewBindSampler = NULL;
+PFNGLDELETESAMPLERSPROC __glewDeleteSamplers = NULL;
+PFNGLGENSAMPLERSPROC __glewGenSamplers = NULL;
+PFNGLGETSAMPLERPARAMETERIIVPROC __glewGetSamplerParameterIiv = NULL;
+PFNGLGETSAMPLERPARAMETERIUIVPROC __glewGetSamplerParameterIuiv = NULL;
+PFNGLGETSAMPLERPARAMETERFVPROC __glewGetSamplerParameterfv = NULL;
+PFNGLGETSAMPLERPARAMETERIVPROC __glewGetSamplerParameteriv = NULL;
+PFNGLISSAMPLERPROC __glewIsSampler = NULL;
+PFNGLSAMPLERPARAMETERIIVPROC __glewSamplerParameterIiv = NULL;
+PFNGLSAMPLERPARAMETERIUIVPROC __glewSamplerParameterIuiv = NULL;
+PFNGLSAMPLERPARAMETERFPROC __glewSamplerParameterf = NULL;
+PFNGLSAMPLERPARAMETERFVPROC __glewSamplerParameterfv = NULL;
+PFNGLSAMPLERPARAMETERIPROC __glewSamplerParameteri = NULL;
+PFNGLSAMPLERPARAMETERIVPROC __glewSamplerParameteriv = NULL;
+
+PFNGLACTIVESHADERPROGRAMPROC __glewActiveShaderProgram = NULL;
+PFNGLBINDPROGRAMPIPELINEPROC __glewBindProgramPipeline = NULL;
+PFNGLCREATESHADERPROGRAMVPROC __glewCreateShaderProgramv = NULL;
+PFNGLDELETEPROGRAMPIPELINESPROC __glewDeleteProgramPipelines = NULL;
+PFNGLGENPROGRAMPIPELINESPROC __glewGenProgramPipelines = NULL;
+PFNGLGETPROGRAMPIPELINEINFOLOGPROC __glewGetProgramPipelineInfoLog = NULL;
+PFNGLGETPROGRAMPIPELINEIVPROC __glewGetProgramPipelineiv = NULL;
+PFNGLISPROGRAMPIPELINEPROC __glewIsProgramPipeline = NULL;
+PFNGLPROGRAMUNIFORM1DPROC __glewProgramUniform1d = NULL;
+PFNGLPROGRAMUNIFORM1DVPROC __glewProgramUniform1dv = NULL;
+PFNGLPROGRAMUNIFORM1FPROC __glewProgramUniform1f = NULL;
+PFNGLPROGRAMUNIFORM1FVPROC __glewProgramUniform1fv = NULL;
+PFNGLPROGRAMUNIFORM1IPROC __glewProgramUniform1i = NULL;
+PFNGLPROGRAMUNIFORM1IVPROC __glewProgramUniform1iv = NULL;
+PFNGLPROGRAMUNIFORM1UIPROC __glewProgramUniform1ui = NULL;
+PFNGLPROGRAMUNIFORM1UIVPROC __glewProgramUniform1uiv = NULL;
+PFNGLPROGRAMUNIFORM2DPROC __glewProgramUniform2d = NULL;
+PFNGLPROGRAMUNIFORM2DVPROC __glewProgramUniform2dv = NULL;
+PFNGLPROGRAMUNIFORM2FPROC __glewProgramUniform2f = NULL;
+PFNGLPROGRAMUNIFORM2FVPROC __glewProgramUniform2fv = NULL;
+PFNGLPROGRAMUNIFORM2IPROC __glewProgramUniform2i = NULL;
+PFNGLPROGRAMUNIFORM2IVPROC __glewProgramUniform2iv = NULL;
+PFNGLPROGRAMUNIFORM2UIPROC __glewProgramUniform2ui = NULL;
+PFNGLPROGRAMUNIFORM2UIVPROC __glewProgramUniform2uiv = NULL;
+PFNGLPROGRAMUNIFORM3DPROC __glewProgramUniform3d = NULL;
+PFNGLPROGRAMUNIFORM3DVPROC __glewProgramUniform3dv = NULL;
+PFNGLPROGRAMUNIFORM3FPROC __glewProgramUniform3f = NULL;
+PFNGLPROGRAMUNIFORM3FVPROC __glewProgramUniform3fv = NULL;
+PFNGLPROGRAMUNIFORM3IPROC __glewProgramUniform3i = NULL;
+PFNGLPROGRAMUNIFORM3IVPROC __glewProgramUniform3iv = NULL;
+PFNGLPROGRAMUNIFORM3UIPROC __glewProgramUniform3ui = NULL;
+PFNGLPROGRAMUNIFORM3UIVPROC __glewProgramUniform3uiv = NULL;
+PFNGLPROGRAMUNIFORM4DPROC __glewProgramUniform4d = NULL;
+PFNGLPROGRAMUNIFORM4DVPROC __glewProgramUniform4dv = NULL;
+PFNGLPROGRAMUNIFORM4FPROC __glewProgramUniform4f = NULL;
+PFNGLPROGRAMUNIFORM4FVPROC __glewProgramUniform4fv = NULL;
+PFNGLPROGRAMUNIFORM4IPROC __glewProgramUniform4i = NULL;
+PFNGLPROGRAMUNIFORM4IVPROC __glewProgramUniform4iv = NULL;
+PFNGLPROGRAMUNIFORM4UIPROC __glewProgramUniform4ui = NULL;
+PFNGLPROGRAMUNIFORM4UIVPROC __glewProgramUniform4uiv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2DVPROC __glewProgramUniformMatrix2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2FVPROC __glewProgramUniformMatrix2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC __glewProgramUniformMatrix2x3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC __glewProgramUniformMatrix2x3fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC __glewProgramUniformMatrix2x4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC __glewProgramUniformMatrix2x4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3DVPROC __glewProgramUniformMatrix3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3FVPROC __glewProgramUniformMatrix3fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC __glewProgramUniformMatrix3x2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC __glewProgramUniformMatrix3x2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC __glewProgramUniformMatrix3x4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC __glewProgramUniformMatrix3x4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4DVPROC __glewProgramUniformMatrix4dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4FVPROC __glewProgramUniformMatrix4fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC __glewProgramUniformMatrix4x2dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC __glewProgramUniformMatrix4x2fv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC __glewProgramUniformMatrix4x3dv = NULL;
+PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC __glewProgramUniformMatrix4x3fv = NULL;
+PFNGLUSEPROGRAMSTAGESPROC __glewUseProgramStages = NULL;
+PFNGLVALIDATEPROGRAMPIPELINEPROC __glewValidateProgramPipeline = NULL;
+
PFNGLATTACHOBJECTARBPROC __glewAttachObjectARB = NULL;
PFNGLCOMPILESHADERARBPROC __glewCompileShaderARB = NULL;
PFNGLCREATEPROGRAMOBJECTARBPROC __glewCreateProgramObjectARB = NULL;
@@ -699,6 +955,33 @@ PFNGLUNIFORMMATRIX4FVARBPROC __glewUniformMatrix4fvARB = NULL;
PFNGLUSEPROGRAMOBJECTARBPROC __glewUseProgramObjectARB = NULL;
PFNGLVALIDATEPROGRAMARBPROC __glewValidateProgramARB = NULL;
+PFNGLGETACTIVESUBROUTINENAMEPROC __glewGetActiveSubroutineName = NULL;
+PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC __glewGetActiveSubroutineUniformName = NULL;
+PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC __glewGetActiveSubroutineUniformiv = NULL;
+PFNGLGETPROGRAMSTAGEIVPROC __glewGetProgramStageiv = NULL;
+PFNGLGETSUBROUTINEINDEXPROC __glewGetSubroutineIndex = NULL;
+PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC __glewGetSubroutineUniformLocation = NULL;
+PFNGLGETUNIFORMSUBROUTINEUIVPROC __glewGetUniformSubroutineuiv = NULL;
+PFNGLUNIFORMSUBROUTINESUIVPROC __glewUniformSubroutinesuiv = NULL;
+
+PFNGLCOMPILESHADERINCLUDEARBPROC __glewCompileShaderIncludeARB = NULL;
+PFNGLDELETENAMEDSTRINGARBPROC __glewDeleteNamedStringARB = NULL;
+PFNGLGETNAMEDSTRINGARBPROC __glewGetNamedStringARB = NULL;
+PFNGLGETNAMEDSTRINGIVARBPROC __glewGetNamedStringivARB = NULL;
+PFNGLISNAMEDSTRINGARBPROC __glewIsNamedStringARB = NULL;
+PFNGLNAMEDSTRINGARBPROC __glewNamedStringARB = NULL;
+
+PFNGLCLIENTWAITSYNCPROC __glewClientWaitSync = NULL;
+PFNGLDELETESYNCPROC __glewDeleteSync = NULL;
+PFNGLFENCESYNCPROC __glewFenceSync = NULL;
+PFNGLGETINTEGER64VPROC __glewGetInteger64v = NULL;
+PFNGLGETSYNCIVPROC __glewGetSynciv = NULL;
+PFNGLISSYNCPROC __glewIsSync = NULL;
+PFNGLWAITSYNCPROC __glewWaitSync = NULL;
+
+PFNGLPATCHPARAMETERFVPROC __glewPatchParameterfv = NULL;
+PFNGLPATCHPARAMETERIPROC __glewPatchParameteri = NULL;
+
PFNGLTEXBUFFERARBPROC __glewTexBufferARB = NULL;
PFNGLCOMPRESSEDTEXIMAGE1DARBPROC __glewCompressedTexImage1DARB = NULL;
@@ -709,16 +992,60 @@ PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC __glewCompressedTexSubImage2DARB = NULL;
PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC __glewCompressedTexSubImage3DARB = NULL;
PFNGLGETCOMPRESSEDTEXIMAGEARBPROC __glewGetCompressedTexImageARB = NULL;
+PFNGLGETMULTISAMPLEFVPROC __glewGetMultisamplefv = NULL;
+PFNGLSAMPLEMASKIPROC __glewSampleMaski = NULL;
+PFNGLTEXIMAGE2DMULTISAMPLEPROC __glewTexImage2DMultisample = NULL;
+PFNGLTEXIMAGE3DMULTISAMPLEPROC __glewTexImage3DMultisample = NULL;
+
+PFNGLGETQUERYOBJECTI64VPROC __glewGetQueryObjecti64v = NULL;
+PFNGLGETQUERYOBJECTUI64VPROC __glewGetQueryObjectui64v = NULL;
+PFNGLQUERYCOUNTERPROC __glewQueryCounter = NULL;
+
+PFNGLBINDTRANSFORMFEEDBACKPROC __glewBindTransformFeedback = NULL;
+PFNGLDELETETRANSFORMFEEDBACKSPROC __glewDeleteTransformFeedbacks = NULL;
+PFNGLDRAWTRANSFORMFEEDBACKPROC __glewDrawTransformFeedback = NULL;
+PFNGLGENTRANSFORMFEEDBACKSPROC __glewGenTransformFeedbacks = NULL;
+PFNGLISTRANSFORMFEEDBACKPROC __glewIsTransformFeedback = NULL;
+PFNGLPAUSETRANSFORMFEEDBACKPROC __glewPauseTransformFeedback = NULL;
+PFNGLRESUMETRANSFORMFEEDBACKPROC __glewResumeTransformFeedback = NULL;
+
+PFNGLBEGINQUERYINDEXEDPROC __glewBeginQueryIndexed = NULL;
+PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC __glewDrawTransformFeedbackStream = NULL;
+PFNGLENDQUERYINDEXEDPROC __glewEndQueryIndexed = NULL;
+PFNGLGETQUERYINDEXEDIVPROC __glewGetQueryIndexediv = NULL;
+
PFNGLLOADTRANSPOSEMATRIXDARBPROC __glewLoadTransposeMatrixdARB = NULL;
PFNGLLOADTRANSPOSEMATRIXFARBPROC __glewLoadTransposeMatrixfARB = NULL;
PFNGLMULTTRANSPOSEMATRIXDARBPROC __glewMultTransposeMatrixdARB = NULL;
PFNGLMULTTRANSPOSEMATRIXFARBPROC __glewMultTransposeMatrixfARB = NULL;
+PFNGLBINDBUFFERBASEPROC __glewBindBufferBase = NULL;
+PFNGLBINDBUFFERRANGEPROC __glewBindBufferRange = NULL;
+PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC __glewGetActiveUniformBlockName = NULL;
+PFNGLGETACTIVEUNIFORMBLOCKIVPROC __glewGetActiveUniformBlockiv = NULL;
+PFNGLGETACTIVEUNIFORMNAMEPROC __glewGetActiveUniformName = NULL;
+PFNGLGETACTIVEUNIFORMSIVPROC __glewGetActiveUniformsiv = NULL;
+PFNGLGETINTEGERI_VPROC __glewGetIntegeri_v = NULL;
+PFNGLGETUNIFORMBLOCKINDEXPROC __glewGetUniformBlockIndex = NULL;
+PFNGLGETUNIFORMINDICESPROC __glewGetUniformIndices = NULL;
+PFNGLUNIFORMBLOCKBINDINGPROC __glewUniformBlockBinding = NULL;
+
PFNGLBINDVERTEXARRAYPROC __glewBindVertexArray = NULL;
PFNGLDELETEVERTEXARRAYSPROC __glewDeleteVertexArrays = NULL;
PFNGLGENVERTEXARRAYSPROC __glewGenVertexArrays = NULL;
PFNGLISVERTEXARRAYPROC __glewIsVertexArray = NULL;
+PFNGLGETVERTEXATTRIBLDVPROC __glewGetVertexAttribLdv = NULL;
+PFNGLVERTEXATTRIBL1DPROC __glewVertexAttribL1d = NULL;
+PFNGLVERTEXATTRIBL1DVPROC __glewVertexAttribL1dv = NULL;
+PFNGLVERTEXATTRIBL2DPROC __glewVertexAttribL2d = NULL;
+PFNGLVERTEXATTRIBL2DVPROC __glewVertexAttribL2dv = NULL;
+PFNGLVERTEXATTRIBL3DPROC __glewVertexAttribL3d = NULL;
+PFNGLVERTEXATTRIBL3DVPROC __glewVertexAttribL3dv = NULL;
+PFNGLVERTEXATTRIBL4DPROC __glewVertexAttribL4d = NULL;
+PFNGLVERTEXATTRIBL4DVPROC __glewVertexAttribL4dv = NULL;
+PFNGLVERTEXATTRIBLPOINTERPROC __glewVertexAttribLPointer = NULL;
+
PFNGLVERTEXBLENDARBPROC __glewVertexBlendARB = NULL;
PFNGLWEIGHTPOINTERARBPROC __glewWeightPointerARB = NULL;
PFNGLWEIGHTBVARBPROC __glewWeightbvARB = NULL;
@@ -809,6 +1136,56 @@ PFNGLBINDATTRIBLOCATIONARBPROC __glewBindAttribLocationARB = NULL;
PFNGLGETACTIVEATTRIBARBPROC __glewGetActiveAttribARB = NULL;
PFNGLGETATTRIBLOCATIONARBPROC __glewGetAttribLocationARB = NULL;
+PFNGLCOLORP3UIPROC __glewColorP3ui = NULL;
+PFNGLCOLORP3UIVPROC __glewColorP3uiv = NULL;
+PFNGLCOLORP4UIPROC __glewColorP4ui = NULL;
+PFNGLCOLORP4UIVPROC __glewColorP4uiv = NULL;
+PFNGLMULTITEXCOORDP1UIPROC __glewMultiTexCoordP1ui = NULL;
+PFNGLMULTITEXCOORDP1UIVPROC __glewMultiTexCoordP1uiv = NULL;
+PFNGLMULTITEXCOORDP2UIPROC __glewMultiTexCoordP2ui = NULL;
+PFNGLMULTITEXCOORDP2UIVPROC __glewMultiTexCoordP2uiv = NULL;
+PFNGLMULTITEXCOORDP3UIPROC __glewMultiTexCoordP3ui = NULL;
+PFNGLMULTITEXCOORDP3UIVPROC __glewMultiTexCoordP3uiv = NULL;
+PFNGLMULTITEXCOORDP4UIPROC __glewMultiTexCoordP4ui = NULL;
+PFNGLMULTITEXCOORDP4UIVPROC __glewMultiTexCoordP4uiv = NULL;
+PFNGLNORMALP3UIPROC __glewNormalP3ui = NULL;
+PFNGLNORMALP3UIVPROC __glewNormalP3uiv = NULL;
+PFNGLSECONDARYCOLORP3UIPROC __glewSecondaryColorP3ui = NULL;
+PFNGLSECONDARYCOLORP3UIVPROC __glewSecondaryColorP3uiv = NULL;
+PFNGLTEXCOORDP1UIPROC __glewTexCoordP1ui = NULL;
+PFNGLTEXCOORDP1UIVPROC __glewTexCoordP1uiv = NULL;
+PFNGLTEXCOORDP2UIPROC __glewTexCoordP2ui = NULL;
+PFNGLTEXCOORDP2UIVPROC __glewTexCoordP2uiv = NULL;
+PFNGLTEXCOORDP3UIPROC __glewTexCoordP3ui = NULL;
+PFNGLTEXCOORDP3UIVPROC __glewTexCoordP3uiv = NULL;
+PFNGLTEXCOORDP4UIPROC __glewTexCoordP4ui = NULL;
+PFNGLTEXCOORDP4UIVPROC __glewTexCoordP4uiv = NULL;
+PFNGLVERTEXATTRIBP1UIPROC __glewVertexAttribP1ui = NULL;
+PFNGLVERTEXATTRIBP1UIVPROC __glewVertexAttribP1uiv = NULL;
+PFNGLVERTEXATTRIBP2UIPROC __glewVertexAttribP2ui = NULL;
+PFNGLVERTEXATTRIBP2UIVPROC __glewVertexAttribP2uiv = NULL;
+PFNGLVERTEXATTRIBP3UIPROC __glewVertexAttribP3ui = NULL;
+PFNGLVERTEXATTRIBP3UIVPROC __glewVertexAttribP3uiv = NULL;
+PFNGLVERTEXATTRIBP4UIPROC __glewVertexAttribP4ui = NULL;
+PFNGLVERTEXATTRIBP4UIVPROC __glewVertexAttribP4uiv = NULL;
+PFNGLVERTEXP2UIPROC __glewVertexP2ui = NULL;
+PFNGLVERTEXP2UIVPROC __glewVertexP2uiv = NULL;
+PFNGLVERTEXP3UIPROC __glewVertexP3ui = NULL;
+PFNGLVERTEXP3UIVPROC __glewVertexP3uiv = NULL;
+PFNGLVERTEXP4UIPROC __glewVertexP4ui = NULL;
+PFNGLVERTEXP4UIVPROC __glewVertexP4uiv = NULL;
+
+PFNGLDEPTHRANGEARRAYVPROC __glewDepthRangeArrayv = NULL;
+PFNGLDEPTHRANGEINDEXEDPROC __glewDepthRangeIndexed = NULL;
+PFNGLGETDOUBLEI_VPROC __glewGetDoublei_v = NULL;
+PFNGLGETFLOATI_VPROC __glewGetFloati_v = NULL;
+PFNGLSCISSORARRAYVPROC __glewScissorArrayv = NULL;
+PFNGLSCISSORINDEXEDPROC __glewScissorIndexed = NULL;
+PFNGLSCISSORINDEXEDVPROC __glewScissorIndexedv = NULL;
+PFNGLVIEWPORTARRAYVPROC __glewViewportArrayv = NULL;
+PFNGLVIEWPORTINDEXEDFPROC __glewViewportIndexedf = NULL;
+PFNGLVIEWPORTINDEXEDFVPROC __glewViewportIndexedfv = NULL;
+
PFNGLWINDOWPOS2DARBPROC __glewWindowPos2dARB = NULL;
PFNGLWINDOWPOS2DVARBPROC __glewWindowPos2dvARB = NULL;
PFNGLWINDOWPOS2FARBPROC __glewWindowPos2fARB = NULL;
@@ -988,7 +1365,14 @@ PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC __glewCopyTextureSubImage1DEXT = NULL;
PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC __glewCopyTextureSubImage2DEXT = NULL;
PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC __glewCopyTextureSubImage3DEXT = NULL;
PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC __glewDisableClientStateIndexedEXT = NULL;
+PFNGLDISABLECLIENTSTATEIEXTPROC __glewDisableClientStateiEXT = NULL;
+PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC __glewDisableVertexArrayAttribEXT = NULL;
+PFNGLDISABLEVERTEXARRAYEXTPROC __glewDisableVertexArrayEXT = NULL;
PFNGLENABLECLIENTSTATEINDEXEDEXTPROC __glewEnableClientStateIndexedEXT = NULL;
+PFNGLENABLECLIENTSTATEIEXTPROC __glewEnableClientStateiEXT = NULL;
+PFNGLENABLEVERTEXARRAYATTRIBEXTPROC __glewEnableVertexArrayAttribEXT = NULL;
+PFNGLENABLEVERTEXARRAYEXTPROC __glewEnableVertexArrayEXT = NULL;
+PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC __glewFlushMappedNamedBufferRangeEXT = NULL;
PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC __glewFramebufferDrawBufferEXT = NULL;
PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC __glewFramebufferDrawBuffersEXT = NULL;
PFNGLFRAMEBUFFERREADBUFFEREXTPROC __glewFramebufferReadBufferEXT = NULL;
@@ -997,7 +1381,9 @@ PFNGLGENERATETEXTUREMIPMAPEXTPROC __glewGenerateTextureMipmapEXT = NULL;
PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC __glewGetCompressedMultiTexImageEXT = NULL;
PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC __glewGetCompressedTextureImageEXT = NULL;
PFNGLGETDOUBLEINDEXEDVEXTPROC __glewGetDoubleIndexedvEXT = NULL;
+PFNGLGETDOUBLEI_VEXTPROC __glewGetDoublei_vEXT = NULL;
PFNGLGETFLOATINDEXEDVEXTPROC __glewGetFloatIndexedvEXT = NULL;
+PFNGLGETFLOATI_VEXTPROC __glewGetFloati_vEXT = NULL;
PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC __glewGetFramebufferParameterivEXT = NULL;
PFNGLGETMULTITEXENVFVEXTPROC __glewGetMultiTexEnvfvEXT = NULL;
PFNGLGETMULTITEXENVIVEXTPROC __glewGetMultiTexEnvivEXT = NULL;
@@ -1023,6 +1409,7 @@ PFNGLGETNAMEDPROGRAMSTRINGEXTPROC __glewGetNamedProgramStringEXT = NULL;
PFNGLGETNAMEDPROGRAMIVEXTPROC __glewGetNamedProgramivEXT = NULL;
PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC __glewGetNamedRenderbufferParameterivEXT = NULL;
PFNGLGETPOINTERINDEXEDVEXTPROC __glewGetPointerIndexedvEXT = NULL;
+PFNGLGETPOINTERI_VEXTPROC __glewGetPointeri_vEXT = NULL;
PFNGLGETTEXTUREIMAGEEXTPROC __glewGetTextureImageEXT = NULL;
PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC __glewGetTextureLevelParameterfvEXT = NULL;
PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC __glewGetTextureLevelParameterivEXT = NULL;
@@ -1030,7 +1417,12 @@ PFNGLGETTEXTUREPARAMETERIIVEXTPROC __glewGetTextureParameterIivEXT = NULL;
PFNGLGETTEXTUREPARAMETERIUIVEXTPROC __glewGetTextureParameterIuivEXT = NULL;
PFNGLGETTEXTUREPARAMETERFVEXTPROC __glewGetTextureParameterfvEXT = NULL;
PFNGLGETTEXTUREPARAMETERIVEXTPROC __glewGetTextureParameterivEXT = NULL;
+PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC __glewGetVertexArrayIntegeri_vEXT = NULL;
+PFNGLGETVERTEXARRAYINTEGERVEXTPROC __glewGetVertexArrayIntegervEXT = NULL;
+PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC __glewGetVertexArrayPointeri_vEXT = NULL;
+PFNGLGETVERTEXARRAYPOINTERVEXTPROC __glewGetVertexArrayPointervEXT = NULL;
PFNGLMAPNAMEDBUFFEREXTPROC __glewMapNamedBufferEXT = NULL;
+PFNGLMAPNAMEDBUFFERRANGEEXTPROC __glewMapNamedBufferRangeEXT = NULL;
PFNGLMATRIXFRUSTUMEXTPROC __glewMatrixFrustumEXT = NULL;
PFNGLMATRIXLOADIDENTITYEXTPROC __glewMatrixLoadIdentityEXT = NULL;
PFNGLMATRIXLOADTRANSPOSEDEXTPROC __glewMatrixLoadTransposedEXT = NULL;
@@ -1077,6 +1469,7 @@ PFNGLMULTITEXSUBIMAGE2DEXTPROC __glewMultiTexSubImage2DEXT = NULL;
PFNGLMULTITEXSUBIMAGE3DEXTPROC __glewMultiTexSubImage3DEXT = NULL;
PFNGLNAMEDBUFFERDATAEXTPROC __glewNamedBufferDataEXT = NULL;
PFNGLNAMEDBUFFERSUBDATAEXTPROC __glewNamedBufferSubDataEXT = NULL;
+PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC __glewNamedCopyBufferSubDataEXT = NULL;
PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC __glewNamedFramebufferRenderbufferEXT = NULL;
PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC __glewNamedFramebufferTexture1DEXT = NULL;
PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC __glewNamedFramebufferTexture2DEXT = NULL;
@@ -1148,6 +1541,17 @@ PFNGLTEXTURESUBIMAGE1DEXTPROC __glewTextureSubImage1DEXT = NULL;
PFNGLTEXTURESUBIMAGE2DEXTPROC __glewTextureSubImage2DEXT = NULL;
PFNGLTEXTURESUBIMAGE3DEXTPROC __glewTextureSubImage3DEXT = NULL;
PFNGLUNMAPNAMEDBUFFEREXTPROC __glewUnmapNamedBufferEXT = NULL;
+PFNGLVERTEXARRAYCOLOROFFSETEXTPROC __glewVertexArrayColorOffsetEXT = NULL;
+PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC __glewVertexArrayEdgeFlagOffsetEXT = NULL;
+PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC __glewVertexArrayFogCoordOffsetEXT = NULL;
+PFNGLVERTEXARRAYINDEXOFFSETEXTPROC __glewVertexArrayIndexOffsetEXT = NULL;
+PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC __glewVertexArrayMultiTexCoordOffsetEXT = NULL;
+PFNGLVERTEXARRAYNORMALOFFSETEXTPROC __glewVertexArrayNormalOffsetEXT = NULL;
+PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC __glewVertexArraySecondaryColorOffsetEXT = NULL;
+PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC __glewVertexArrayTexCoordOffsetEXT = NULL;
+PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC __glewVertexArrayVertexAttribIOffsetEXT = NULL;
+PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC __glewVertexArrayVertexAttribOffsetEXT = NULL;
+PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC __glewVertexArrayVertexOffsetEXT = NULL;
PFNGLCOLORMASKINDEXEDEXTPROC __glewColorMaskIndexedEXT = NULL;
PFNGLDISABLEINDEXEDEXTPROC __glewDisableIndexedEXT = NULL;
@@ -1293,6 +1697,8 @@ PFNGLPOINTPARAMETERFVEXTPROC __glewPointParameterfvEXT = NULL;
PFNGLPOLYGONOFFSETEXTPROC __glewPolygonOffsetEXT = NULL;
+PFNGLPROVOKINGVERTEXEXTPROC __glewProvokingVertexEXT = NULL;
+
PFNGLBEGINSCENEEXTPROC __glewBeginSceneEXT = NULL;
PFNGLENDSCENEEXTPROC __glewEndSceneEXT = NULL;
@@ -1314,6 +1720,13 @@ PFNGLSECONDARYCOLOR3USEXTPROC __glewSecondaryColor3usEXT = NULL;
PFNGLSECONDARYCOLOR3USVEXTPROC __glewSecondaryColor3usvEXT = NULL;
PFNGLSECONDARYCOLORPOINTEREXTPROC __glewSecondaryColorPointerEXT = NULL;
+PFNGLACTIVEPROGRAMEXTPROC __glewActiveProgramEXT = NULL;
+PFNGLCREATESHADERPROGRAMEXTPROC __glewCreateShaderProgramEXT = NULL;
+PFNGLUSESHADERPROGRAMEXTPROC __glewUseShaderProgramEXT = NULL;
+
+PFNGLBINDIMAGETEXTUREEXTPROC __glewBindImageTextureEXT = NULL;
+PFNGLMEMORYBARRIEREXTPROC __glewMemoryBarrierEXT = NULL;
+
PFNGLACTIVESTENCILFACEEXTPROC __glewActiveStencilFaceEXT = NULL;
PFNGLTEXSUBIMAGE1DEXTPROC __glewTexSubImage1DEXT = NULL;
@@ -1355,12 +1768,23 @@ PFNGLARRAYELEMENTEXTPROC __glewArrayElementEXT = NULL;
PFNGLCOLORPOINTEREXTPROC __glewColorPointerEXT = NULL;
PFNGLDRAWARRAYSEXTPROC __glewDrawArraysEXT = NULL;
PFNGLEDGEFLAGPOINTEREXTPROC __glewEdgeFlagPointerEXT = NULL;
-PFNGLGETPOINTERVEXTPROC __glewGetPointervEXT = NULL;
PFNGLINDEXPOINTEREXTPROC __glewIndexPointerEXT = NULL;
PFNGLNORMALPOINTEREXTPROC __glewNormalPointerEXT = NULL;
PFNGLTEXCOORDPOINTEREXTPROC __glewTexCoordPointerEXT = NULL;
PFNGLVERTEXPOINTEREXTPROC __glewVertexPointerEXT = NULL;
+PFNGLGETVERTEXATTRIBLDVEXTPROC __glewGetVertexAttribLdvEXT = NULL;
+PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC __glewVertexArrayVertexAttribLOffsetEXT = NULL;
+PFNGLVERTEXATTRIBL1DEXTPROC __glewVertexAttribL1dEXT = NULL;
+PFNGLVERTEXATTRIBL1DVEXTPROC __glewVertexAttribL1dvEXT = NULL;
+PFNGLVERTEXATTRIBL2DEXTPROC __glewVertexAttribL2dEXT = NULL;
+PFNGLVERTEXATTRIBL2DVEXTPROC __glewVertexAttribL2dvEXT = NULL;
+PFNGLVERTEXATTRIBL3DEXTPROC __glewVertexAttribL3dEXT = NULL;
+PFNGLVERTEXATTRIBL3DVEXTPROC __glewVertexAttribL3dvEXT = NULL;
+PFNGLVERTEXATTRIBL4DEXTPROC __glewVertexAttribL4dEXT = NULL;
+PFNGLVERTEXATTRIBL4DVEXTPROC __glewVertexAttribL4dvEXT = NULL;
+PFNGLVERTEXATTRIBLPOINTEREXTPROC __glewVertexAttribLPointerEXT = NULL;
+
PFNGLBEGINVERTEXSHADEREXTPROC __glewBeginVertexShaderEXT = NULL;
PFNGLBINDLIGHTPARAMETEREXTPROC __glewBindLightParameterEXT = NULL;
PFNGLBINDMATERIALPARAMETEREXTPROC __glewBindMaterialParameterEXT = NULL;
@@ -1475,6 +1899,8 @@ PFNGLWINDOWPOS4SVMESAPROC __glewWindowPos4svMESA = NULL;
PFNGLBEGINCONDITIONALRENDERNVPROC __glewBeginConditionalRenderNV = NULL;
PFNGLENDCONDITIONALRENDERNVPROC __glewEndConditionalRenderNV = NULL;
+PFNGLCOPYIMAGESUBDATANVPROC __glewCopyImageSubDataNV = NULL;
+
PFNGLCLEARDEPTHDNVPROC __glewClearDepthdNV = NULL;
PFNGLDEPTHBOUNDSDNVPROC __glewDepthBoundsdNV = NULL;
PFNGLDEPTHRANGEDNVPROC __glewDepthRangedNV = NULL;
@@ -1525,6 +1951,41 @@ PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC __glewProgramLocalParameterI4uivNV = NULL;
PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC __glewProgramLocalParametersI4ivNV = NULL;
PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC __glewProgramLocalParametersI4uivNV = NULL;
+PFNGLGETUNIFORMI64VNVPROC __glewGetUniformi64vNV = NULL;
+PFNGLGETUNIFORMUI64VNVPROC __glewGetUniformui64vNV = NULL;
+PFNGLPROGRAMUNIFORM1I64NVPROC __glewProgramUniform1i64NV = NULL;
+PFNGLPROGRAMUNIFORM1I64VNVPROC __glewProgramUniform1i64vNV = NULL;
+PFNGLPROGRAMUNIFORM1UI64NVPROC __glewProgramUniform1ui64NV = NULL;
+PFNGLPROGRAMUNIFORM1UI64VNVPROC __glewProgramUniform1ui64vNV = NULL;
+PFNGLPROGRAMUNIFORM2I64NVPROC __glewProgramUniform2i64NV = NULL;
+PFNGLPROGRAMUNIFORM2I64VNVPROC __glewProgramUniform2i64vNV = NULL;
+PFNGLPROGRAMUNIFORM2UI64NVPROC __glewProgramUniform2ui64NV = NULL;
+PFNGLPROGRAMUNIFORM2UI64VNVPROC __glewProgramUniform2ui64vNV = NULL;
+PFNGLPROGRAMUNIFORM3I64NVPROC __glewProgramUniform3i64NV = NULL;
+PFNGLPROGRAMUNIFORM3I64VNVPROC __glewProgramUniform3i64vNV = NULL;
+PFNGLPROGRAMUNIFORM3UI64NVPROC __glewProgramUniform3ui64NV = NULL;
+PFNGLPROGRAMUNIFORM3UI64VNVPROC __glewProgramUniform3ui64vNV = NULL;
+PFNGLPROGRAMUNIFORM4I64NVPROC __glewProgramUniform4i64NV = NULL;
+PFNGLPROGRAMUNIFORM4I64VNVPROC __glewProgramUniform4i64vNV = NULL;
+PFNGLPROGRAMUNIFORM4UI64NVPROC __glewProgramUniform4ui64NV = NULL;
+PFNGLPROGRAMUNIFORM4UI64VNVPROC __glewProgramUniform4ui64vNV = NULL;
+PFNGLUNIFORM1I64NVPROC __glewUniform1i64NV = NULL;
+PFNGLUNIFORM1I64VNVPROC __glewUniform1i64vNV = NULL;
+PFNGLUNIFORM1UI64NVPROC __glewUniform1ui64NV = NULL;
+PFNGLUNIFORM1UI64VNVPROC __glewUniform1ui64vNV = NULL;
+PFNGLUNIFORM2I64NVPROC __glewUniform2i64NV = NULL;
+PFNGLUNIFORM2I64VNVPROC __glewUniform2i64vNV = NULL;
+PFNGLUNIFORM2UI64NVPROC __glewUniform2ui64NV = NULL;
+PFNGLUNIFORM2UI64VNVPROC __glewUniform2ui64vNV = NULL;
+PFNGLUNIFORM3I64NVPROC __glewUniform3i64NV = NULL;
+PFNGLUNIFORM3I64VNVPROC __glewUniform3i64vNV = NULL;
+PFNGLUNIFORM3UI64NVPROC __glewUniform3ui64NV = NULL;
+PFNGLUNIFORM3UI64VNVPROC __glewUniform3ui64vNV = NULL;
+PFNGLUNIFORM4I64NVPROC __glewUniform4i64NV = NULL;
+PFNGLUNIFORM4I64VNVPROC __glewUniform4i64vNV = NULL;
+PFNGLUNIFORM4UI64NVPROC __glewUniform4ui64NV = NULL;
+PFNGLUNIFORM4UI64VNVPROC __glewUniform4ui64vNV = NULL;
+
PFNGLCOLOR3HNVPROC __glewColor3hNV = NULL;
PFNGLCOLOR3HVNVPROC __glewColor3hvNV = NULL;
PFNGLCOLOR4HNVPROC __glewColor4hNV = NULL;
@@ -1617,6 +2078,22 @@ PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC __glewGetFinalCombinerInputParameter
PFNGLCOMBINERSTAGEPARAMETERFVNVPROC __glewCombinerStageParameterfvNV = NULL;
PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC __glewGetCombinerStageParameterfvNV = NULL;
+PFNGLGETBUFFERPARAMETERUI64VNVPROC __glewGetBufferParameterui64vNV = NULL;
+PFNGLGETINTEGERUI64VNVPROC __glewGetIntegerui64vNV = NULL;
+PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC __glewGetNamedBufferParameterui64vNV = NULL;
+PFNGLISBUFFERRESIDENTNVPROC __glewIsBufferResidentNV = NULL;
+PFNGLISNAMEDBUFFERRESIDENTNVPROC __glewIsNamedBufferResidentNV = NULL;
+PFNGLMAKEBUFFERNONRESIDENTNVPROC __glewMakeBufferNonResidentNV = NULL;
+PFNGLMAKEBUFFERRESIDENTNVPROC __glewMakeBufferResidentNV = NULL;
+PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC __glewMakeNamedBufferNonResidentNV = NULL;
+PFNGLMAKENAMEDBUFFERRESIDENTNVPROC __glewMakeNamedBufferResidentNV = NULL;
+PFNGLPROGRAMUNIFORMUI64NVPROC __glewProgramUniformui64NV = NULL;
+PFNGLPROGRAMUNIFORMUI64VNVPROC __glewProgramUniformui64vNV = NULL;
+PFNGLUNIFORMUI64NVPROC __glewUniformui64NV = NULL;
+PFNGLUNIFORMUI64VNVPROC __glewUniformui64vNV = NULL;
+
+PFNGLTEXTUREBARRIERNVPROC __glewTextureBarrierNV = NULL;
+
PFNGLACTIVEVARYINGNVPROC __glewActiveVaryingNV = NULL;
PFNGLBEGINTRANSFORMFEEDBACKNVPROC __glewBeginTransformFeedbackNV = NULL;
PFNGLBINDBUFFERBASENVPROC __glewBindBufferBaseNV = NULL;
@@ -1629,9 +2106,61 @@ PFNGLGETVARYINGLOCATIONNVPROC __glewGetVaryingLocationNV = NULL;
PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC __glewTransformFeedbackAttribsNV = NULL;
PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC __glewTransformFeedbackVaryingsNV = NULL;
+PFNGLBINDTRANSFORMFEEDBACKNVPROC __glewBindTransformFeedbackNV = NULL;
+PFNGLDELETETRANSFORMFEEDBACKSNVPROC __glewDeleteTransformFeedbacksNV = NULL;
+PFNGLDRAWTRANSFORMFEEDBACKNVPROC __glewDrawTransformFeedbackNV = NULL;
+PFNGLGENTRANSFORMFEEDBACKSNVPROC __glewGenTransformFeedbacksNV = NULL;
+PFNGLISTRANSFORMFEEDBACKNVPROC __glewIsTransformFeedbackNV = NULL;
+PFNGLPAUSETRANSFORMFEEDBACKNVPROC __glewPauseTransformFeedbackNV = NULL;
+PFNGLRESUMETRANSFORMFEEDBACKNVPROC __glewResumeTransformFeedbackNV = NULL;
+
+PFNGLVDPAUFININVPROC __glewVDPAUFiniNV = NULL;
+PFNGLVDPAUGETSURFACEIVNVPROC __glewVDPAUGetSurfaceivNV = NULL;
+PFNGLVDPAUINITNVPROC __glewVDPAUInitNV = NULL;
+PFNGLVDPAUISSURFACENVPROC __glewVDPAUIsSurfaceNV = NULL;
+PFNGLVDPAUMAPSURFACESNVPROC __glewVDPAUMapSurfacesNV = NULL;
+PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC __glewVDPAURegisterOutputSurfaceNV = NULL;
+PFNGLVDPAUREGISTERVIDEOSURFACENVPROC __glewVDPAURegisterVideoSurfaceNV = NULL;
+PFNGLVDPAUSURFACEACCESSNVPROC __glewVDPAUSurfaceAccessNV = NULL;
+PFNGLVDPAUUNMAPSURFACESNVPROC __glewVDPAUUnmapSurfacesNV = NULL;
+PFNGLVDPAUUNREGISTERSURFACENVPROC __glewVDPAUUnregisterSurfaceNV = NULL;
+
PFNGLFLUSHVERTEXARRAYRANGENVPROC __glewFlushVertexArrayRangeNV = NULL;
PFNGLVERTEXARRAYRANGENVPROC __glewVertexArrayRangeNV = NULL;
+PFNGLGETVERTEXATTRIBLI64VNVPROC __glewGetVertexAttribLi64vNV = NULL;
+PFNGLGETVERTEXATTRIBLUI64VNVPROC __glewGetVertexAttribLui64vNV = NULL;
+PFNGLVERTEXATTRIBL1I64NVPROC __glewVertexAttribL1i64NV = NULL;
+PFNGLVERTEXATTRIBL1I64VNVPROC __glewVertexAttribL1i64vNV = NULL;
+PFNGLVERTEXATTRIBL1UI64NVPROC __glewVertexAttribL1ui64NV = NULL;
+PFNGLVERTEXATTRIBL1UI64VNVPROC __glewVertexAttribL1ui64vNV = NULL;
+PFNGLVERTEXATTRIBL2I64NVPROC __glewVertexAttribL2i64NV = NULL;
+PFNGLVERTEXATTRIBL2I64VNVPROC __glewVertexAttribL2i64vNV = NULL;
+PFNGLVERTEXATTRIBL2UI64NVPROC __glewVertexAttribL2ui64NV = NULL;
+PFNGLVERTEXATTRIBL2UI64VNVPROC __glewVertexAttribL2ui64vNV = NULL;
+PFNGLVERTEXATTRIBL3I64NVPROC __glewVertexAttribL3i64NV = NULL;
+PFNGLVERTEXATTRIBL3I64VNVPROC __glewVertexAttribL3i64vNV = NULL;
+PFNGLVERTEXATTRIBL3UI64NVPROC __glewVertexAttribL3ui64NV = NULL;
+PFNGLVERTEXATTRIBL3UI64VNVPROC __glewVertexAttribL3ui64vNV = NULL;
+PFNGLVERTEXATTRIBL4I64NVPROC __glewVertexAttribL4i64NV = NULL;
+PFNGLVERTEXATTRIBL4I64VNVPROC __glewVertexAttribL4i64vNV = NULL;
+PFNGLVERTEXATTRIBL4UI64NVPROC __glewVertexAttribL4ui64NV = NULL;
+PFNGLVERTEXATTRIBL4UI64VNVPROC __glewVertexAttribL4ui64vNV = NULL;
+PFNGLVERTEXATTRIBLFORMATNVPROC __glewVertexAttribLFormatNV = NULL;
+
+PFNGLBUFFERADDRESSRANGENVPROC __glewBufferAddressRangeNV = NULL;
+PFNGLCOLORFORMATNVPROC __glewColorFormatNV = NULL;
+PFNGLEDGEFLAGFORMATNVPROC __glewEdgeFlagFormatNV = NULL;
+PFNGLFOGCOORDFORMATNVPROC __glewFogCoordFormatNV = NULL;
+PFNGLGETINTEGERUI64I_VNVPROC __glewGetIntegerui64i_vNV = NULL;
+PFNGLINDEXFORMATNVPROC __glewIndexFormatNV = NULL;
+PFNGLNORMALFORMATNVPROC __glewNormalFormatNV = NULL;
+PFNGLSECONDARYCOLORFORMATNVPROC __glewSecondaryColorFormatNV = NULL;
+PFNGLTEXCOORDFORMATNVPROC __glewTexCoordFormatNV = NULL;
+PFNGLVERTEXATTRIBFORMATNVPROC __glewVertexAttribFormatNV = NULL;
+PFNGLVERTEXATTRIBIFORMATNVPROC __glewVertexAttribIFormatNV = NULL;
+PFNGLVERTEXFORMATNVPROC __glewVertexFormatNV = NULL;
+
PFNGLAREPROGRAMSRESIDENTNVPROC __glewAreProgramsResidentNV = NULL;
PFNGLBINDPROGRAMNVPROC __glewBindProgramNV = NULL;
PFNGLDELETEPROGRAMSNVPROC __glewDeleteProgramsNV = NULL;
@@ -1842,38 +2371,75 @@ PFNGLADDSWAPHINTRECTWINPROC __glewAddSwapHintRectWIN = NULL;
GLboolean __GLEW_VERSION_1_1 = GL_FALSE;
GLboolean __GLEW_VERSION_1_2 = GL_FALSE;
+GLboolean __GLEW_VERSION_1_2_1 = GL_FALSE;
GLboolean __GLEW_VERSION_1_3 = GL_FALSE;
GLboolean __GLEW_VERSION_1_4 = GL_FALSE;
GLboolean __GLEW_VERSION_1_5 = GL_FALSE;
GLboolean __GLEW_VERSION_2_0 = GL_FALSE;
GLboolean __GLEW_VERSION_2_1 = GL_FALSE;
GLboolean __GLEW_VERSION_3_0 = GL_FALSE;
+GLboolean __GLEW_VERSION_3_1 = GL_FALSE;
+GLboolean __GLEW_VERSION_3_2 = GL_FALSE;
+GLboolean __GLEW_VERSION_3_3 = GL_FALSE;
+GLboolean __GLEW_VERSION_4_0 = GL_FALSE;
+GLboolean __GLEW_VERSION_4_1 = GL_FALSE;
GLboolean __GLEW_3DFX_multisample = GL_FALSE;
GLboolean __GLEW_3DFX_tbuffer = GL_FALSE;
GLboolean __GLEW_3DFX_texture_compression_FXT1 = GL_FALSE;
+GLboolean __GLEW_AMD_conservative_depth = GL_FALSE;
+GLboolean __GLEW_AMD_debug_output = GL_FALSE;
+GLboolean __GLEW_AMD_depth_clamp_separate = GL_FALSE;
+GLboolean __GLEW_AMD_draw_buffers_blend = GL_FALSE;
+GLboolean __GLEW_AMD_name_gen_delete = GL_FALSE;
+GLboolean __GLEW_AMD_performance_monitor = GL_FALSE;
+GLboolean __GLEW_AMD_seamless_cubemap_per_texture = GL_FALSE;
+GLboolean __GLEW_AMD_shader_stencil_export = GL_FALSE;
+GLboolean __GLEW_AMD_texture_texture4 = GL_FALSE;
+GLboolean __GLEW_AMD_transform_feedback3_lines_triangles = GL_FALSE;
+GLboolean __GLEW_AMD_vertex_shader_tessellator = GL_FALSE;
+GLboolean __GLEW_APPLE_aux_depth_stencil = GL_FALSE;
GLboolean __GLEW_APPLE_client_storage = GL_FALSE;
GLboolean __GLEW_APPLE_element_array = GL_FALSE;
GLboolean __GLEW_APPLE_fence = GL_FALSE;
GLboolean __GLEW_APPLE_float_pixels = GL_FALSE;
GLboolean __GLEW_APPLE_flush_buffer_range = GL_FALSE;
+GLboolean __GLEW_APPLE_object_purgeable = GL_FALSE;
GLboolean __GLEW_APPLE_pixel_buffer = GL_FALSE;
+GLboolean __GLEW_APPLE_rgb_422 = GL_FALSE;
+GLboolean __GLEW_APPLE_row_bytes = GL_FALSE;
GLboolean __GLEW_APPLE_specular_vector = GL_FALSE;
GLboolean __GLEW_APPLE_texture_range = GL_FALSE;
GLboolean __GLEW_APPLE_transform_hint = GL_FALSE;
GLboolean __GLEW_APPLE_vertex_array_object = GL_FALSE;
GLboolean __GLEW_APPLE_vertex_array_range = GL_FALSE;
+GLboolean __GLEW_APPLE_vertex_program_evaluators = GL_FALSE;
GLboolean __GLEW_APPLE_ycbcr_422 = GL_FALSE;
+GLboolean __GLEW_ARB_ES2_compatibility = GL_FALSE;
+GLboolean __GLEW_ARB_blend_func_extended = GL_FALSE;
+GLboolean __GLEW_ARB_cl_event = GL_FALSE;
GLboolean __GLEW_ARB_color_buffer_float = GL_FALSE;
+GLboolean __GLEW_ARB_compatibility = GL_FALSE;
+GLboolean __GLEW_ARB_copy_buffer = GL_FALSE;
+GLboolean __GLEW_ARB_debug_output = GL_FALSE;
GLboolean __GLEW_ARB_depth_buffer_float = GL_FALSE;
+GLboolean __GLEW_ARB_depth_clamp = GL_FALSE;
GLboolean __GLEW_ARB_depth_texture = GL_FALSE;
GLboolean __GLEW_ARB_draw_buffers = GL_FALSE;
+GLboolean __GLEW_ARB_draw_buffers_blend = GL_FALSE;
+GLboolean __GLEW_ARB_draw_elements_base_vertex = GL_FALSE;
+GLboolean __GLEW_ARB_draw_indirect = GL_FALSE;
GLboolean __GLEW_ARB_draw_instanced = GL_FALSE;
+GLboolean __GLEW_ARB_explicit_attrib_location = GL_FALSE;
+GLboolean __GLEW_ARB_fragment_coord_conventions = GL_FALSE;
GLboolean __GLEW_ARB_fragment_program = GL_FALSE;
GLboolean __GLEW_ARB_fragment_program_shadow = GL_FALSE;
GLboolean __GLEW_ARB_fragment_shader = GL_FALSE;
GLboolean __GLEW_ARB_framebuffer_object = GL_FALSE;
GLboolean __GLEW_ARB_framebuffer_sRGB = GL_FALSE;
GLboolean __GLEW_ARB_geometry_shader4 = GL_FALSE;
+GLboolean __GLEW_ARB_get_program_binary = GL_FALSE;
+GLboolean __GLEW_ARB_gpu_shader5 = GL_FALSE;
+GLboolean __GLEW_ARB_gpu_shader_fp64 = GL_FALSE;
GLboolean __GLEW_ARB_half_float_pixel = GL_FALSE;
GLboolean __GLEW_ARB_half_float_vertex = GL_FALSE;
GLboolean __GLEW_ARB_imaging = GL_FALSE;
@@ -1883,33 +2449,64 @@ GLboolean __GLEW_ARB_matrix_palette = GL_FALSE;
GLboolean __GLEW_ARB_multisample = GL_FALSE;
GLboolean __GLEW_ARB_multitexture = GL_FALSE;
GLboolean __GLEW_ARB_occlusion_query = GL_FALSE;
+GLboolean __GLEW_ARB_occlusion_query2 = GL_FALSE;
GLboolean __GLEW_ARB_pixel_buffer_object = GL_FALSE;
GLboolean __GLEW_ARB_point_parameters = GL_FALSE;
GLboolean __GLEW_ARB_point_sprite = GL_FALSE;
+GLboolean __GLEW_ARB_provoking_vertex = GL_FALSE;
+GLboolean __GLEW_ARB_robustness = GL_FALSE;
+GLboolean __GLEW_ARB_sample_shading = GL_FALSE;
+GLboolean __GLEW_ARB_sampler_objects = GL_FALSE;
+GLboolean __GLEW_ARB_seamless_cube_map = GL_FALSE;
+GLboolean __GLEW_ARB_separate_shader_objects = GL_FALSE;
+GLboolean __GLEW_ARB_shader_bit_encoding = GL_FALSE;
GLboolean __GLEW_ARB_shader_objects = GL_FALSE;
+GLboolean __GLEW_ARB_shader_precision = GL_FALSE;
+GLboolean __GLEW_ARB_shader_stencil_export = GL_FALSE;
+GLboolean __GLEW_ARB_shader_subroutine = GL_FALSE;
+GLboolean __GLEW_ARB_shader_texture_lod = GL_FALSE;
GLboolean __GLEW_ARB_shading_language_100 = GL_FALSE;
+GLboolean __GLEW_ARB_shading_language_include = GL_FALSE;
GLboolean __GLEW_ARB_shadow = GL_FALSE;
GLboolean __GLEW_ARB_shadow_ambient = GL_FALSE;
+GLboolean __GLEW_ARB_sync = GL_FALSE;
+GLboolean __GLEW_ARB_tessellation_shader = GL_FALSE;
GLboolean __GLEW_ARB_texture_border_clamp = GL_FALSE;
GLboolean __GLEW_ARB_texture_buffer_object = GL_FALSE;
+GLboolean __GLEW_ARB_texture_buffer_object_rgb32 = GL_FALSE;
GLboolean __GLEW_ARB_texture_compression = GL_FALSE;
+GLboolean __GLEW_ARB_texture_compression_bptc = GL_FALSE;
GLboolean __GLEW_ARB_texture_compression_rgtc = GL_FALSE;
GLboolean __GLEW_ARB_texture_cube_map = GL_FALSE;
+GLboolean __GLEW_ARB_texture_cube_map_array = GL_FALSE;
GLboolean __GLEW_ARB_texture_env_add = GL_FALSE;
GLboolean __GLEW_ARB_texture_env_combine = GL_FALSE;
GLboolean __GLEW_ARB_texture_env_crossbar = GL_FALSE;
GLboolean __GLEW_ARB_texture_env_dot3 = GL_FALSE;
GLboolean __GLEW_ARB_texture_float = GL_FALSE;
+GLboolean __GLEW_ARB_texture_gather = GL_FALSE;
GLboolean __GLEW_ARB_texture_mirrored_repeat = GL_FALSE;
+GLboolean __GLEW_ARB_texture_multisample = GL_FALSE;
GLboolean __GLEW_ARB_texture_non_power_of_two = GL_FALSE;
+GLboolean __GLEW_ARB_texture_query_lod = GL_FALSE;
GLboolean __GLEW_ARB_texture_rectangle = GL_FALSE;
GLboolean __GLEW_ARB_texture_rg = GL_FALSE;
+GLboolean __GLEW_ARB_texture_rgb10_a2ui = GL_FALSE;
+GLboolean __GLEW_ARB_texture_swizzle = GL_FALSE;
+GLboolean __GLEW_ARB_timer_query = GL_FALSE;
+GLboolean __GLEW_ARB_transform_feedback2 = GL_FALSE;
+GLboolean __GLEW_ARB_transform_feedback3 = GL_FALSE;
GLboolean __GLEW_ARB_transpose_matrix = GL_FALSE;
+GLboolean __GLEW_ARB_uniform_buffer_object = GL_FALSE;
+GLboolean __GLEW_ARB_vertex_array_bgra = GL_FALSE;
GLboolean __GLEW_ARB_vertex_array_object = GL_FALSE;
+GLboolean __GLEW_ARB_vertex_attrib_64bit = GL_FALSE;
GLboolean __GLEW_ARB_vertex_blend = GL_FALSE;
GLboolean __GLEW_ARB_vertex_buffer_object = GL_FALSE;
GLboolean __GLEW_ARB_vertex_program = GL_FALSE;
GLboolean __GLEW_ARB_vertex_shader = GL_FALSE;
+GLboolean __GLEW_ARB_vertex_type_2_10_10_10_rev = GL_FALSE;
+GLboolean __GLEW_ARB_viewport_array = GL_FALSE;
GLboolean __GLEW_ARB_window_pos = GL_FALSE;
GLboolean __GLEW_ATIX_point_sprites = GL_FALSE;
GLboolean __GLEW_ATIX_texture_env_combine3 = GL_FALSE;
@@ -1920,6 +2517,7 @@ GLboolean __GLEW_ATI_element_array = GL_FALSE;
GLboolean __GLEW_ATI_envmap_bumpmap = GL_FALSE;
GLboolean __GLEW_ATI_fragment_shader = GL_FALSE;
GLboolean __GLEW_ATI_map_object_buffer = GL_FALSE;
+GLboolean __GLEW_ATI_meminfo = GL_FALSE;
GLboolean __GLEW_ATI_pn_triangles = GL_FALSE;
GLboolean __GLEW_ATI_separate_stencil = GL_FALSE;
GLboolean __GLEW_ATI_shader_texture_lod = GL_FALSE;
@@ -1982,10 +2580,13 @@ GLboolean __GLEW_EXT_pixel_transform = GL_FALSE;
GLboolean __GLEW_EXT_pixel_transform_color_table = GL_FALSE;
GLboolean __GLEW_EXT_point_parameters = GL_FALSE;
GLboolean __GLEW_EXT_polygon_offset = GL_FALSE;
+GLboolean __GLEW_EXT_provoking_vertex = GL_FALSE;
GLboolean __GLEW_EXT_rescale_normal = GL_FALSE;
GLboolean __GLEW_EXT_scene_marker = GL_FALSE;
GLboolean __GLEW_EXT_secondary_color = GL_FALSE;
+GLboolean __GLEW_EXT_separate_shader_objects = GL_FALSE;
GLboolean __GLEW_EXT_separate_specular_color = GL_FALSE;
+GLboolean __GLEW_EXT_shader_image_load_store = GL_FALSE;
GLboolean __GLEW_EXT_shadow_funcs = GL_FALSE;
GLboolean __GLEW_EXT_shared_texture_palette = GL_FALSE;
GLboolean __GLEW_EXT_stencil_clear_tag = GL_FALSE;
@@ -2014,12 +2615,15 @@ GLboolean __GLEW_EXT_texture_object = GL_FALSE;
GLboolean __GLEW_EXT_texture_perturb_normal = GL_FALSE;
GLboolean __GLEW_EXT_texture_rectangle = GL_FALSE;
GLboolean __GLEW_EXT_texture_sRGB = GL_FALSE;
+GLboolean __GLEW_EXT_texture_sRGB_decode = GL_FALSE;
GLboolean __GLEW_EXT_texture_shared_exponent = GL_FALSE;
+GLboolean __GLEW_EXT_texture_snorm = GL_FALSE;
GLboolean __GLEW_EXT_texture_swizzle = GL_FALSE;
GLboolean __GLEW_EXT_timer_query = GL_FALSE;
GLboolean __GLEW_EXT_transform_feedback = GL_FALSE;
GLboolean __GLEW_EXT_vertex_array = GL_FALSE;
GLboolean __GLEW_EXT_vertex_array_bgra = GL_FALSE;
+GLboolean __GLEW_EXT_vertex_attrib_64bit = GL_FALSE;
GLboolean __GLEW_EXT_vertex_shader = GL_FALSE;
GLboolean __GLEW_EXT_vertex_weighting = GL_FALSE;
GLboolean __GLEW_GREMEDY_frame_terminator = GL_FALSE;
@@ -2044,9 +2648,11 @@ GLboolean __GLEW_MESA_pack_invert = GL_FALSE;
GLboolean __GLEW_MESA_resize_buffers = GL_FALSE;
GLboolean __GLEW_MESA_window_pos = GL_FALSE;
GLboolean __GLEW_MESA_ycbcr_texture = GL_FALSE;
+GLboolean __GLEW_NVX_gpu_memory_info = GL_FALSE;
GLboolean __GLEW_NV_blend_square = GL_FALSE;
GLboolean __GLEW_NV_conditional_render = GL_FALSE;
GLboolean __GLEW_NV_copy_depth_to_color = GL_FALSE;
+GLboolean __GLEW_NV_copy_image = GL_FALSE;
GLboolean __GLEW_NV_depth_buffer_float = GL_FALSE;
GLboolean __GLEW_NV_depth_clamp = GL_FALSE;
GLboolean __GLEW_NV_depth_range_unclamped = GL_FALSE;
@@ -2063,20 +2669,28 @@ GLboolean __GLEW_NV_framebuffer_multisample_coverage = GL_FALSE;
GLboolean __GLEW_NV_geometry_program4 = GL_FALSE;
GLboolean __GLEW_NV_geometry_shader4 = GL_FALSE;
GLboolean __GLEW_NV_gpu_program4 = GL_FALSE;
+GLboolean __GLEW_NV_gpu_program5 = GL_FALSE;
+GLboolean __GLEW_NV_gpu_program_fp64 = GL_FALSE;
+GLboolean __GLEW_NV_gpu_shader5 = GL_FALSE;
GLboolean __GLEW_NV_half_float = GL_FALSE;
GLboolean __GLEW_NV_light_max_exponent = GL_FALSE;
+GLboolean __GLEW_NV_multisample_coverage = GL_FALSE;
GLboolean __GLEW_NV_multisample_filter_hint = GL_FALSE;
GLboolean __GLEW_NV_occlusion_query = GL_FALSE;
GLboolean __GLEW_NV_packed_depth_stencil = GL_FALSE;
GLboolean __GLEW_NV_parameter_buffer_object = GL_FALSE;
+GLboolean __GLEW_NV_parameter_buffer_object2 = GL_FALSE;
GLboolean __GLEW_NV_pixel_data_range = GL_FALSE;
GLboolean __GLEW_NV_point_sprite = GL_FALSE;
GLboolean __GLEW_NV_present_video = GL_FALSE;
GLboolean __GLEW_NV_primitive_restart = GL_FALSE;
GLboolean __GLEW_NV_register_combiners = GL_FALSE;
GLboolean __GLEW_NV_register_combiners2 = GL_FALSE;
+GLboolean __GLEW_NV_shader_buffer_load = GL_FALSE;
+GLboolean __GLEW_NV_tessellation_program5 = GL_FALSE;
GLboolean __GLEW_NV_texgen_emboss = GL_FALSE;
GLboolean __GLEW_NV_texgen_reflection = GL_FALSE;
+GLboolean __GLEW_NV_texture_barrier = GL_FALSE;
GLboolean __GLEW_NV_texture_compression_vtc = GL_FALSE;
GLboolean __GLEW_NV_texture_env_combine4 = GL_FALSE;
GLboolean __GLEW_NV_texture_expand_normal = GL_FALSE;
@@ -2085,8 +2699,12 @@ GLboolean __GLEW_NV_texture_shader = GL_FALSE;
GLboolean __GLEW_NV_texture_shader2 = GL_FALSE;
GLboolean __GLEW_NV_texture_shader3 = GL_FALSE;
GLboolean __GLEW_NV_transform_feedback = GL_FALSE;
+GLboolean __GLEW_NV_transform_feedback2 = GL_FALSE;
+GLboolean __GLEW_NV_vdpau_interop = GL_FALSE;
GLboolean __GLEW_NV_vertex_array_range = GL_FALSE;
GLboolean __GLEW_NV_vertex_array_range2 = GL_FALSE;
+GLboolean __GLEW_NV_vertex_attrib_integer_64bit = GL_FALSE;
+GLboolean __GLEW_NV_vertex_buffer_unified_memory = GL_FALSE;
GLboolean __GLEW_NV_vertex_program = GL_FALSE;
GLboolean __GLEW_NV_vertex_program1_1 = GL_FALSE;
GLboolean __GLEW_NV_vertex_program2 = GL_FALSE;
@@ -2183,6 +2801,10 @@ static GLboolean _glewInit_GL_VERSION_1_2 (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_VERSION_1_2 */
+#ifdef GL_VERSION_1_2_1
+
+#endif /* GL_VERSION_1_2_1 */
+
#ifdef GL_VERSION_1_3
static GLboolean _glewInit_GL_VERSION_1_3 (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -2462,8 +3084,6 @@ static GLboolean _glewInit_GL_VERSION_3_0 (GLEW_CONTEXT_ARG_DEF_INIT)
r = ((glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)glewGetProcAddress((const GLubyte*)"glBeginConditionalRender")) == NULL) || r;
r = ((glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBeginTransformFeedback")) == NULL) || r;
- r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r;
- r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r;
r = ((glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocation")) == NULL) || r;
r = ((glClampColor = (PFNGLCLAMPCOLORPROC)glewGetProcAddress((const GLubyte*)"glClampColor")) == NULL) || r;
r = ((glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)glewGetProcAddress((const GLubyte*)"glClearBufferfi")) == NULL) || r;
@@ -2477,7 +3097,6 @@ static GLboolean _glewInit_GL_VERSION_3_0 (GLEW_CONTEXT_ARG_DEF_INIT)
r = ((glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glEndTransformFeedback")) == NULL) || r;
r = ((glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)glewGetProcAddress((const GLubyte*)"glGetBooleani_v")) == NULL) || r;
r = ((glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataLocation")) == NULL) || r;
- r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r;
r = ((glGetStringi = (PFNGLGETSTRINGIPROC)glewGetProcAddress((const GLubyte*)"glGetStringi")) == NULL) || r;
r = ((glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIiv")) == NULL) || r;
r = ((glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetTexParameterIuiv")) == NULL) || r;
@@ -2524,6 +3143,71 @@ static GLboolean _glewInit_GL_VERSION_3_0 (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_VERSION_3_0 */
+#ifdef GL_VERSION_3_1
+
+static GLboolean _glewInit_GL_VERSION_3_1 (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysInstanced")) == NULL) || r;
+ r = ((glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstanced")) == NULL) || r;
+ r = ((glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)glewGetProcAddress((const GLubyte*)"glPrimitiveRestartIndex")) == NULL) || r;
+ r = ((glTexBuffer = (PFNGLTEXBUFFERPROC)glewGetProcAddress((const GLubyte*)"glTexBuffer")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_VERSION_3_1 */
+
+#ifdef GL_VERSION_3_2
+
+static GLboolean _glewInit_GL_VERSION_3_2 (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture")) == NULL) || r;
+ r = ((glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameteri64v")) == NULL) || r;
+ r = ((glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64i_v")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_VERSION_3_2 */
+
+#ifdef GL_VERSION_3_3
+
+static GLboolean _glewInit_GL_VERSION_3_3 (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribDivisor")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_VERSION_3_3 */
+
+#ifdef GL_VERSION_4_0
+
+static GLboolean _glewInit_GL_VERSION_4_0 (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparatei")) == NULL) || r;
+ r = ((glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationi")) == NULL) || r;
+ r = ((glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparatei")) == NULL) || r;
+ r = ((glBlendFunci = (PFNGLBLENDFUNCIPROC)glewGetProcAddress((const GLubyte*)"glBlendFunci")) == NULL) || r;
+ r = ((glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShading")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_VERSION_4_0 */
+
+#ifdef GL_VERSION_4_1
+
+#endif /* GL_VERSION_4_1 */
+
#ifdef GL_3DFX_multisample
#endif /* GL_3DFX_multisample */
@@ -2545,6 +3229,118 @@ static GLboolean _glewInit_GL_3DFX_tbuffer (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_3DFX_texture_compression_FXT1 */
+#ifdef GL_AMD_conservative_depth
+
+#endif /* GL_AMD_conservative_depth */
+
+#ifdef GL_AMD_debug_output
+
+static GLboolean _glewInit_GL_AMD_debug_output (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glDebugMessageCallbackAMD = (PFNGLDEBUGMESSAGECALLBACKAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackAMD")) == NULL) || r;
+ r = ((glDebugMessageEnableAMD = (PFNGLDEBUGMESSAGEENABLEAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageEnableAMD")) == NULL) || r;
+ r = ((glDebugMessageInsertAMD = (PFNGLDEBUGMESSAGEINSERTAMDPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertAMD")) == NULL) || r;
+ r = ((glGetDebugMessageLogAMD = (PFNGLGETDEBUGMESSAGELOGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogAMD")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_AMD_debug_output */
+
+#ifdef GL_AMD_depth_clamp_separate
+
+#endif /* GL_AMD_depth_clamp_separate */
+
+#ifdef GL_AMD_draw_buffers_blend
+
+static GLboolean _glewInit_GL_AMD_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBlendEquationIndexedAMD = (PFNGLBLENDEQUATIONINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationIndexedAMD")) == NULL) || r;
+ r = ((glBlendEquationSeparateIndexedAMD = (PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateIndexedAMD")) == NULL) || r;
+ r = ((glBlendFuncIndexedAMD = (PFNGLBLENDFUNCINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncIndexedAMD")) == NULL) || r;
+ r = ((glBlendFuncSeparateIndexedAMD = (PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateIndexedAMD")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_AMD_draw_buffers_blend */
+
+#ifdef GL_AMD_name_gen_delete
+
+static GLboolean _glewInit_GL_AMD_name_gen_delete (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glDeleteNamesAMD = (PFNGLDELETENAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamesAMD")) == NULL) || r;
+ r = ((glGenNamesAMD = (PFNGLGENNAMESAMDPROC)glewGetProcAddress((const GLubyte*)"glGenNamesAMD")) == NULL) || r;
+ r = ((glIsNameAMD = (PFNGLISNAMEAMDPROC)glewGetProcAddress((const GLubyte*)"glIsNameAMD")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_AMD_name_gen_delete */
+
+#ifdef GL_AMD_performance_monitor
+
+static GLboolean _glewInit_GL_AMD_performance_monitor (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBeginPerfMonitorAMD = (PFNGLBEGINPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glBeginPerfMonitorAMD")) == NULL) || r;
+ r = ((glDeletePerfMonitorsAMD = (PFNGLDELETEPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glDeletePerfMonitorsAMD")) == NULL) || r;
+ r = ((glEndPerfMonitorAMD = (PFNGLENDPERFMONITORAMDPROC)glewGetProcAddress((const GLubyte*)"glEndPerfMonitorAMD")) == NULL) || r;
+ r = ((glGenPerfMonitorsAMD = (PFNGLGENPERFMONITORSAMDPROC)glewGetProcAddress((const GLubyte*)"glGenPerfMonitorsAMD")) == NULL) || r;
+ r = ((glGetPerfMonitorCounterDataAMD = (PFNGLGETPERFMONITORCOUNTERDATAAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterDataAMD")) == NULL) || r;
+ r = ((glGetPerfMonitorCounterInfoAMD = (PFNGLGETPERFMONITORCOUNTERINFOAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterInfoAMD")) == NULL) || r;
+ r = ((glGetPerfMonitorCounterStringAMD = (PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCounterStringAMD")) == NULL) || r;
+ r = ((glGetPerfMonitorCountersAMD = (PFNGLGETPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorCountersAMD")) == NULL) || r;
+ r = ((glGetPerfMonitorGroupStringAMD = (PFNGLGETPERFMONITORGROUPSTRINGAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupStringAMD")) == NULL) || r;
+ r = ((glGetPerfMonitorGroupsAMD = (PFNGLGETPERFMONITORGROUPSAMDPROC)glewGetProcAddress((const GLubyte*)"glGetPerfMonitorGroupsAMD")) == NULL) || r;
+ r = ((glSelectPerfMonitorCountersAMD = (PFNGLSELECTPERFMONITORCOUNTERSAMDPROC)glewGetProcAddress((const GLubyte*)"glSelectPerfMonitorCountersAMD")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_AMD_performance_monitor */
+
+#ifdef GL_AMD_seamless_cubemap_per_texture
+
+#endif /* GL_AMD_seamless_cubemap_per_texture */
+
+#ifdef GL_AMD_shader_stencil_export
+
+#endif /* GL_AMD_shader_stencil_export */
+
+#ifdef GL_AMD_texture_texture4
+
+#endif /* GL_AMD_texture_texture4 */
+
+#ifdef GL_AMD_transform_feedback3_lines_triangles
+
+#endif /* GL_AMD_transform_feedback3_lines_triangles */
+
+#ifdef GL_AMD_vertex_shader_tessellator
+
+static GLboolean _glewInit_GL_AMD_vertex_shader_tessellator (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glTessellationFactorAMD = (PFNGLTESSELLATIONFACTORAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationFactorAMD")) == NULL) || r;
+ r = ((glTessellationModeAMD = (PFNGLTESSELLATIONMODEAMDPROC)glewGetProcAddress((const GLubyte*)"glTessellationModeAMD")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_AMD_vertex_shader_tessellator */
+
+#ifdef GL_APPLE_aux_depth_stencil
+
+#endif /* GL_APPLE_aux_depth_stencil */
+
#ifdef GL_APPLE_client_storage
#endif /* GL_APPLE_client_storage */
@@ -2604,10 +3400,33 @@ static GLboolean _glewInit_GL_APPLE_flush_buffer_range (GLEW_CONTEXT_ARG_DEF_INI
#endif /* GL_APPLE_flush_buffer_range */
+#ifdef GL_APPLE_object_purgeable
+
+static GLboolean _glewInit_GL_APPLE_object_purgeable (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetObjectParameterivAPPLE = (PFNGLGETOBJECTPARAMETERIVAPPLEPROC)glewGetProcAddress((const GLubyte*)"glGetObjectParameterivAPPLE")) == NULL) || r;
+ r = ((glObjectPurgeableAPPLE = (PFNGLOBJECTPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectPurgeableAPPLE")) == NULL) || r;
+ r = ((glObjectUnpurgeableAPPLE = (PFNGLOBJECTUNPURGEABLEAPPLEPROC)glewGetProcAddress((const GLubyte*)"glObjectUnpurgeableAPPLE")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_APPLE_object_purgeable */
+
#ifdef GL_APPLE_pixel_buffer
#endif /* GL_APPLE_pixel_buffer */
+#ifdef GL_APPLE_rgb_422
+
+#endif /* GL_APPLE_rgb_422 */
+
+#ifdef GL_APPLE_row_bytes
+
+#endif /* GL_APPLE_row_bytes */
+
#ifdef GL_APPLE_specular_vector
#endif /* GL_APPLE_specular_vector */
@@ -2661,10 +3480,73 @@ static GLboolean _glewInit_GL_APPLE_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INI
#endif /* GL_APPLE_vertex_array_range */
+#ifdef GL_APPLE_vertex_program_evaluators
+
+static GLboolean _glewInit_GL_APPLE_vertex_program_evaluators (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glDisableVertexAttribAPPLE = (PFNGLDISABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexAttribAPPLE")) == NULL) || r;
+ r = ((glEnableVertexAttribAPPLE = (PFNGLENABLEVERTEXATTRIBAPPLEPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexAttribAPPLE")) == NULL) || r;
+ r = ((glIsVertexAttribEnabledAPPLE = (PFNGLISVERTEXATTRIBENABLEDAPPLEPROC)glewGetProcAddress((const GLubyte*)"glIsVertexAttribEnabledAPPLE")) == NULL) || r;
+ r = ((glMapVertexAttrib1dAPPLE = (PFNGLMAPVERTEXATTRIB1DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1dAPPLE")) == NULL) || r;
+ r = ((glMapVertexAttrib1fAPPLE = (PFNGLMAPVERTEXATTRIB1FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib1fAPPLE")) == NULL) || r;
+ r = ((glMapVertexAttrib2dAPPLE = (PFNGLMAPVERTEXATTRIB2DAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2dAPPLE")) == NULL) || r;
+ r = ((glMapVertexAttrib2fAPPLE = (PFNGLMAPVERTEXATTRIB2FAPPLEPROC)glewGetProcAddress((const GLubyte*)"glMapVertexAttrib2fAPPLE")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_APPLE_vertex_program_evaluators */
+
#ifdef GL_APPLE_ycbcr_422
#endif /* GL_APPLE_ycbcr_422 */
+#ifdef GL_ARB_ES2_compatibility
+
+static GLboolean _glewInit_GL_ARB_ES2_compatibility (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glClearDepthf = (PFNGLCLEARDEPTHFPROC)glewGetProcAddress((const GLubyte*)"glClearDepthf")) == NULL) || r;
+ r = ((glDepthRangef = (PFNGLDEPTHRANGEFPROC)glewGetProcAddress((const GLubyte*)"glDepthRangef")) == NULL) || r;
+ r = ((glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)glewGetProcAddress((const GLubyte*)"glGetShaderPrecisionFormat")) == NULL) || r;
+ r = ((glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)glewGetProcAddress((const GLubyte*)"glReleaseShaderCompiler")) == NULL) || r;
+ r = ((glShaderBinary = (PFNGLSHADERBINARYPROC)glewGetProcAddress((const GLubyte*)"glShaderBinary")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_ES2_compatibility */
+
+#ifdef GL_ARB_blend_func_extended
+
+static GLboolean _glewInit_GL_ARB_blend_func_extended (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBindFragDataLocationIndexed")) == NULL) || r;
+ r = ((glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetFragDataIndex")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_blend_func_extended */
+
+#ifdef GL_ARB_cl_event
+
+static GLboolean _glewInit_GL_ARB_cl_event (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glCreateSyncFromCLeventARB = (PFNGLCREATESYNCFROMCLEVENTARBPROC)glewGetProcAddress((const GLubyte*)"glCreateSyncFromCLeventARB")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_cl_event */
+
#ifdef GL_ARB_color_buffer_float
static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -2678,10 +3560,47 @@ static GLboolean _glewInit_GL_ARB_color_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ARB_color_buffer_float */
+#ifdef GL_ARB_compatibility
+
+#endif /* GL_ARB_compatibility */
+
+#ifdef GL_ARB_copy_buffer
+
+static GLboolean _glewInit_GL_ARB_copy_buffer (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)glewGetProcAddress((const GLubyte*)"glCopyBufferSubData")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_copy_buffer */
+
+#ifdef GL_ARB_debug_output
+
+static GLboolean _glewInit_GL_ARB_debug_output (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glDebugMessageCallbackARB = (PFNGLDEBUGMESSAGECALLBACKARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageCallbackARB")) == NULL) || r;
+ r = ((glDebugMessageControlARB = (PFNGLDEBUGMESSAGECONTROLARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageControlARB")) == NULL) || r;
+ r = ((glDebugMessageInsertARB = (PFNGLDEBUGMESSAGEINSERTARBPROC)glewGetProcAddress((const GLubyte*)"glDebugMessageInsertARB")) == NULL) || r;
+ r = ((glGetDebugMessageLogARB = (PFNGLGETDEBUGMESSAGELOGARBPROC)glewGetProcAddress((const GLubyte*)"glGetDebugMessageLogARB")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_debug_output */
+
#ifdef GL_ARB_depth_buffer_float
#endif /* GL_ARB_depth_buffer_float */
+#ifdef GL_ARB_depth_clamp
+
+#endif /* GL_ARB_depth_clamp */
+
#ifdef GL_ARB_depth_texture
#endif /* GL_ARB_depth_texture */
@@ -2699,6 +3618,52 @@ static GLboolean _glewInit_GL_ARB_draw_buffers (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ARB_draw_buffers */
+#ifdef GL_ARB_draw_buffers_blend
+
+static GLboolean _glewInit_GL_ARB_draw_buffers_blend (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBlendEquationSeparateiARB = (PFNGLBLENDEQUATIONSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationSeparateiARB")) == NULL) || r;
+ r = ((glBlendEquationiARB = (PFNGLBLENDEQUATIONIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendEquationiARB")) == NULL) || r;
+ r = ((glBlendFuncSeparateiARB = (PFNGLBLENDFUNCSEPARATEIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFuncSeparateiARB")) == NULL) || r;
+ r = ((glBlendFunciARB = (PFNGLBLENDFUNCIARBPROC)glewGetProcAddress((const GLubyte*)"glBlendFunciARB")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_draw_buffers_blend */
+
+#ifdef GL_ARB_draw_elements_base_vertex
+
+static GLboolean _glewInit_GL_ARB_draw_elements_base_vertex (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsBaseVertex")) == NULL) || r;
+ r = ((glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsInstancedBaseVertex")) == NULL) || r;
+ r = ((glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glDrawRangeElementsBaseVertex")) == NULL) || r;
+ r = ((glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)glewGetProcAddress((const GLubyte*)"glMultiDrawElementsBaseVertex")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_draw_elements_base_vertex */
+
+#ifdef GL_ARB_draw_indirect
+
+static GLboolean _glewInit_GL_ARB_draw_indirect (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysIndirect")) == NULL) || r;
+ r = ((glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)glewGetProcAddress((const GLubyte*)"glDrawElementsIndirect")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_draw_indirect */
+
#ifdef GL_ARB_draw_instanced
static GLboolean _glewInit_GL_ARB_draw_instanced (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -2713,6 +3678,14 @@ static GLboolean _glewInit_GL_ARB_draw_instanced (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ARB_draw_instanced */
+#ifdef GL_ARB_explicit_attrib_location
+
+#endif /* GL_ARB_explicit_attrib_location */
+
+#ifdef GL_ARB_fragment_coord_conventions
+
+#endif /* GL_ARB_fragment_coord_conventions */
+
#ifdef GL_ARB_fragment_program
#endif /* GL_ARB_fragment_program */
@@ -2738,10 +3711,10 @@ static GLboolean _glewInit_GL_ARB_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r;
r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r;
r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r;
- r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r;
r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r;
r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r;
r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r;
+ r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r;
r = ((glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenFramebuffers")) == NULL) || r;
r = ((glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glGenRenderbuffers")) == NULL) || r;
r = ((glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)glewGetProcAddress((const GLubyte*)"glGenerateMipmap")) == NULL) || r;
@@ -2777,6 +3750,72 @@ static GLboolean _glewInit_GL_ARB_geometry_shader4 (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ARB_geometry_shader4 */
+#ifdef GL_ARB_get_program_binary
+
+static GLboolean _glewInit_GL_ARB_get_program_binary (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glGetProgramBinary")) == NULL) || r;
+ r = ((glProgramBinary = (PFNGLPROGRAMBINARYPROC)glewGetProcAddress((const GLubyte*)"glProgramBinary")) == NULL) || r;
+ r = ((glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glProgramParameteri")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_get_program_binary */
+
+#ifdef GL_ARB_gpu_shader5
+
+#endif /* GL_ARB_gpu_shader5 */
+
+#ifdef GL_ARB_gpu_shader_fp64
+
+static GLboolean _glewInit_GL_ARB_gpu_shader_fp64 (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetUniformdv = (PFNGLGETUNIFORMDVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformdv")) == NULL) || r;
+ r = ((glProgramUniform1dEXT = (PFNGLPROGRAMUNIFORM1DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dEXT")) == NULL) || r;
+ r = ((glProgramUniform1dvEXT = (PFNGLPROGRAMUNIFORM1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dvEXT")) == NULL) || r;
+ r = ((glProgramUniform2dEXT = (PFNGLPROGRAMUNIFORM2DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dEXT")) == NULL) || r;
+ r = ((glProgramUniform2dvEXT = (PFNGLPROGRAMUNIFORM2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dvEXT")) == NULL) || r;
+ r = ((glProgramUniform3dEXT = (PFNGLPROGRAMUNIFORM3DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dEXT")) == NULL) || r;
+ r = ((glProgramUniform3dvEXT = (PFNGLPROGRAMUNIFORM3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dvEXT")) == NULL) || r;
+ r = ((glProgramUniform4dEXT = (PFNGLPROGRAMUNIFORM4DEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dEXT")) == NULL) || r;
+ r = ((glProgramUniform4dvEXT = (PFNGLPROGRAMUNIFORM4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dvEXT")) == NULL) || r;
+ r = ((glProgramUniformMatrix2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dvEXT")) == NULL) || r;
+ r = ((glProgramUniformMatrix2x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dvEXT")) == NULL) || r;
+ r = ((glProgramUniformMatrix2x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dvEXT")) == NULL) || r;
+ r = ((glProgramUniformMatrix3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dvEXT")) == NULL) || r;
+ r = ((glProgramUniformMatrix3x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dvEXT")) == NULL) || r;
+ r = ((glProgramUniformMatrix3x4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dvEXT")) == NULL) || r;
+ r = ((glProgramUniformMatrix4dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dvEXT")) == NULL) || r;
+ r = ((glProgramUniformMatrix4x2dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dvEXT")) == NULL) || r;
+ r = ((glProgramUniformMatrix4x3dvEXT = (PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dvEXT")) == NULL) || r;
+ r = ((glUniform1d = (PFNGLUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glUniform1d")) == NULL) || r;
+ r = ((glUniform1dv = (PFNGLUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glUniform1dv")) == NULL) || r;
+ r = ((glUniform2d = (PFNGLUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glUniform2d")) == NULL) || r;
+ r = ((glUniform2dv = (PFNGLUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glUniform2dv")) == NULL) || r;
+ r = ((glUniform3d = (PFNGLUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glUniform3d")) == NULL) || r;
+ r = ((glUniform3dv = (PFNGLUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glUniform3dv")) == NULL) || r;
+ r = ((glUniform4d = (PFNGLUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glUniform4d")) == NULL) || r;
+ r = ((glUniform4dv = (PFNGLUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glUniform4dv")) == NULL) || r;
+ r = ((glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2dv")) == NULL) || r;
+ r = ((glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x3dv")) == NULL) || r;
+ r = ((glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix2x4dv")) == NULL) || r;
+ r = ((glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3dv")) == NULL) || r;
+ r = ((glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x2dv")) == NULL) || r;
+ r = ((glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix3x4dv")) == NULL) || r;
+ r = ((glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4dv")) == NULL) || r;
+ r = ((glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x2dv")) == NULL) || r;
+ r = ((glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glUniformMatrix4x3dv")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_gpu_shader_fp64 */
+
#ifdef GL_ARB_half_float_pixel
#endif /* GL_ARB_half_float_pixel */
@@ -2953,6 +3992,10 @@ static GLboolean _glewInit_GL_ARB_occlusion_query (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ARB_occlusion_query */
+#ifdef GL_ARB_occlusion_query2
+
+#endif /* GL_ARB_occlusion_query2 */
+
#ifdef GL_ARB_pixel_buffer_object
#endif /* GL_ARB_pixel_buffer_object */
@@ -2975,6 +4018,169 @@ static GLboolean _glewInit_GL_ARB_point_parameters (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ARB_point_sprite */
+#ifdef GL_ARB_provoking_vertex
+
+static GLboolean _glewInit_GL_ARB_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertex")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_provoking_vertex */
+
+#ifdef GL_ARB_robustness
+
+static GLboolean _glewInit_GL_ARB_robustness (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetnColorTableARB = (PFNGLGETNCOLORTABLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnColorTableARB")) == NULL) || r;
+ r = ((glGetnCompressedTexImageARB = (PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnCompressedTexImageARB")) == NULL) || r;
+ r = ((glGetnConvolutionFilterARB = (PFNGLGETNCONVOLUTIONFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnConvolutionFilterARB")) == NULL) || r;
+ r = ((glGetnHistogramARB = (PFNGLGETNHISTOGRAMARBPROC)glewGetProcAddress((const GLubyte*)"glGetnHistogramARB")) == NULL) || r;
+ r = ((glGetnMapdvARB = (PFNGLGETNMAPDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapdvARB")) == NULL) || r;
+ r = ((glGetnMapfvARB = (PFNGLGETNMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapfvARB")) == NULL) || r;
+ r = ((glGetnMapivARB = (PFNGLGETNMAPIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMapivARB")) == NULL) || r;
+ r = ((glGetnMinmaxARB = (PFNGLGETNMINMAXARBPROC)glewGetProcAddress((const GLubyte*)"glGetnMinmaxARB")) == NULL) || r;
+ r = ((glGetnPixelMapfvARB = (PFNGLGETNPIXELMAPFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapfvARB")) == NULL) || r;
+ r = ((glGetnPixelMapuivARB = (PFNGLGETNPIXELMAPUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapuivARB")) == NULL) || r;
+ r = ((glGetnPixelMapusvARB = (PFNGLGETNPIXELMAPUSVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPixelMapusvARB")) == NULL) || r;
+ r = ((glGetnPolygonStippleARB = (PFNGLGETNPOLYGONSTIPPLEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnPolygonStippleARB")) == NULL) || r;
+ r = ((glGetnSeparableFilterARB = (PFNGLGETNSEPARABLEFILTERARBPROC)glewGetProcAddress((const GLubyte*)"glGetnSeparableFilterARB")) == NULL) || r;
+ r = ((glGetnTexImageARB = (PFNGLGETNTEXIMAGEARBPROC)glewGetProcAddress((const GLubyte*)"glGetnTexImageARB")) == NULL) || r;
+ r = ((glGetnUniformdvARB = (PFNGLGETNUNIFORMDVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformdvARB")) == NULL) || r;
+ r = ((glGetnUniformfvARB = (PFNGLGETNUNIFORMFVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformfvARB")) == NULL) || r;
+ r = ((glGetnUniformivARB = (PFNGLGETNUNIFORMIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformivARB")) == NULL) || r;
+ r = ((glGetnUniformuivARB = (PFNGLGETNUNIFORMUIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetnUniformuivARB")) == NULL) || r;
+ r = ((glReadnPixelsARB = (PFNGLREADNPIXELSARBPROC)glewGetProcAddress((const GLubyte*)"glReadnPixelsARB")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_robustness */
+
+#ifdef GL_ARB_sample_shading
+
+static GLboolean _glewInit_GL_ARB_sample_shading (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glMinSampleShadingARB = (PFNGLMINSAMPLESHADINGARBPROC)glewGetProcAddress((const GLubyte*)"glMinSampleShadingARB")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_sample_shading */
+
+#ifdef GL_ARB_sampler_objects
+
+static GLboolean _glewInit_GL_ARB_sampler_objects (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBindSampler = (PFNGLBINDSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glBindSampler")) == NULL) || r;
+ r = ((glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteSamplers")) == NULL) || r;
+ r = ((glGenSamplers = (PFNGLGENSAMPLERSPROC)glewGetProcAddress((const GLubyte*)"glGenSamplers")) == NULL) || r;
+ r = ((glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIiv")) == NULL) || r;
+ r = ((glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterIuiv")) == NULL) || r;
+ r = ((glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameterfv")) == NULL) || r;
+ r = ((glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glGetSamplerParameteriv")) == NULL) || r;
+ r = ((glIsSampler = (PFNGLISSAMPLERPROC)glewGetProcAddress((const GLubyte*)"glIsSampler")) == NULL) || r;
+ r = ((glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIiv")) == NULL) || r;
+ r = ((glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterIuiv")) == NULL) || r;
+ r = ((glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterf")) == NULL) || r;
+ r = ((glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameterfv")) == NULL) || r;
+ r = ((glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteri")) == NULL) || r;
+ r = ((glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)glewGetProcAddress((const GLubyte*)"glSamplerParameteriv")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_sampler_objects */
+
+#ifdef GL_ARB_seamless_cube_map
+
+#endif /* GL_ARB_seamless_cube_map */
+
+#ifdef GL_ARB_separate_shader_objects
+
+static GLboolean _glewInit_GL_ARB_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)glewGetProcAddress((const GLubyte*)"glActiveShaderProgram")) == NULL) || r;
+ r = ((glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glBindProgramPipeline")) == NULL) || r;
+ r = ((glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramv")) == NULL) || r;
+ r = ((glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glDeleteProgramPipelines")) == NULL) || r;
+ r = ((glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)glewGetProcAddress((const GLubyte*)"glGenProgramPipelines")) == NULL) || r;
+ r = ((glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineInfoLog")) == NULL) || r;
+ r = ((glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramPipelineiv")) == NULL) || r;
+ r = ((glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glIsProgramPipeline")) == NULL) || r;
+ r = ((glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1d")) == NULL) || r;
+ r = ((glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1dv")) == NULL) || r;
+ r = ((glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1f")) == NULL) || r;
+ r = ((glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1fv")) == NULL) || r;
+ r = ((glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i")) == NULL) || r;
+ r = ((glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1iv")) == NULL) || r;
+ r = ((glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui")) == NULL) || r;
+ r = ((glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1uiv")) == NULL) || r;
+ r = ((glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2d")) == NULL) || r;
+ r = ((glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2dv")) == NULL) || r;
+ r = ((glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2f")) == NULL) || r;
+ r = ((glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2fv")) == NULL) || r;
+ r = ((glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i")) == NULL) || r;
+ r = ((glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2iv")) == NULL) || r;
+ r = ((glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui")) == NULL) || r;
+ r = ((glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2uiv")) == NULL) || r;
+ r = ((glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3d")) == NULL) || r;
+ r = ((glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3dv")) == NULL) || r;
+ r = ((glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3f")) == NULL) || r;
+ r = ((glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3fv")) == NULL) || r;
+ r = ((glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i")) == NULL) || r;
+ r = ((glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3iv")) == NULL) || r;
+ r = ((glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui")) == NULL) || r;
+ r = ((glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3uiv")) == NULL) || r;
+ r = ((glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4d")) == NULL) || r;
+ r = ((glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4dv")) == NULL) || r;
+ r = ((glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4f")) == NULL) || r;
+ r = ((glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4fv")) == NULL) || r;
+ r = ((glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i")) == NULL) || r;
+ r = ((glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4iv")) == NULL) || r;
+ r = ((glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui")) == NULL) || r;
+ r = ((glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4uiv")) == NULL) || r;
+ r = ((glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2dv")) == NULL) || r;
+ r = ((glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2fv")) == NULL) || r;
+ r = ((glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3dv")) == NULL) || r;
+ r = ((glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x3fv")) == NULL) || r;
+ r = ((glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4dv")) == NULL) || r;
+ r = ((glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix2x4fv")) == NULL) || r;
+ r = ((glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3dv")) == NULL) || r;
+ r = ((glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3fv")) == NULL) || r;
+ r = ((glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2dv")) == NULL) || r;
+ r = ((glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x2fv")) == NULL) || r;
+ r = ((glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4dv")) == NULL) || r;
+ r = ((glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix3x4fv")) == NULL) || r;
+ r = ((glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4dv")) == NULL) || r;
+ r = ((glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4fv")) == NULL) || r;
+ r = ((glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2dv")) == NULL) || r;
+ r = ((glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x2fv")) == NULL) || r;
+ r = ((glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3dv")) == NULL) || r;
+ r = ((glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformMatrix4x3fv")) == NULL) || r;
+ r = ((glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)glewGetProcAddress((const GLubyte*)"glUseProgramStages")) == NULL) || r;
+ r = ((glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)glewGetProcAddress((const GLubyte*)"glValidateProgramPipeline")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_separate_shader_objects */
+
+#ifdef GL_ARB_shader_bit_encoding
+
+#endif /* GL_ARB_shader_bit_encoding */
+
#ifdef GL_ARB_shader_objects
static GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -3026,10 +4232,60 @@ static GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ARB_shader_objects */
+#ifdef GL_ARB_shader_precision
+
+#endif /* GL_ARB_shader_precision */
+
+#ifdef GL_ARB_shader_stencil_export
+
+#endif /* GL_ARB_shader_stencil_export */
+
+#ifdef GL_ARB_shader_subroutine
+
+static GLboolean _glewInit_GL_ARB_shader_subroutine (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineName")) == NULL) || r;
+ r = ((glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformName")) == NULL) || r;
+ r = ((glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveSubroutineUniformiv")) == NULL) || r;
+ r = ((glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)glewGetProcAddress((const GLubyte*)"glGetProgramStageiv")) == NULL) || r;
+ r = ((glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineIndex")) == NULL) || r;
+ r = ((glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)glewGetProcAddress((const GLubyte*)"glGetSubroutineUniformLocation")) == NULL) || r;
+ r = ((glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformSubroutineuiv")) == NULL) || r;
+ r = ((glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)glewGetProcAddress((const GLubyte*)"glUniformSubroutinesuiv")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_shader_subroutine */
+
+#ifdef GL_ARB_shader_texture_lod
+
+#endif /* GL_ARB_shader_texture_lod */
+
#ifdef GL_ARB_shading_language_100
#endif /* GL_ARB_shading_language_100 */
+#ifdef GL_ARB_shading_language_include
+
+static GLboolean _glewInit_GL_ARB_shading_language_include (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glCompileShaderIncludeARB = (PFNGLCOMPILESHADERINCLUDEARBPROC)glewGetProcAddress((const GLubyte*)"glCompileShaderIncludeARB")) == NULL) || r;
+ r = ((glDeleteNamedStringARB = (PFNGLDELETENAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glDeleteNamedStringARB")) == NULL) || r;
+ r = ((glGetNamedStringARB = (PFNGLGETNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringARB")) == NULL) || r;
+ r = ((glGetNamedStringivARB = (PFNGLGETNAMEDSTRINGIVARBPROC)glewGetProcAddress((const GLubyte*)"glGetNamedStringivARB")) == NULL) || r;
+ r = ((glIsNamedStringARB = (PFNGLISNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glIsNamedStringARB")) == NULL) || r;
+ r = ((glNamedStringARB = (PFNGLNAMEDSTRINGARBPROC)glewGetProcAddress((const GLubyte*)"glNamedStringARB")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_shading_language_include */
+
#ifdef GL_ARB_shadow
#endif /* GL_ARB_shadow */
@@ -3038,6 +4294,39 @@ static GLboolean _glewInit_GL_ARB_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ARB_shadow_ambient */
+#ifdef GL_ARB_sync
+
+static GLboolean _glewInit_GL_ARB_sync (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glClientWaitSync")) == NULL) || r;
+ r = ((glDeleteSync = (PFNGLDELETESYNCPROC)glewGetProcAddress((const GLubyte*)"glDeleteSync")) == NULL) || r;
+ r = ((glFenceSync = (PFNGLFENCESYNCPROC)glewGetProcAddress((const GLubyte*)"glFenceSync")) == NULL) || r;
+ r = ((glGetInteger64v = (PFNGLGETINTEGER64VPROC)glewGetProcAddress((const GLubyte*)"glGetInteger64v")) == NULL) || r;
+ r = ((glGetSynciv = (PFNGLGETSYNCIVPROC)glewGetProcAddress((const GLubyte*)"glGetSynciv")) == NULL) || r;
+ r = ((glIsSync = (PFNGLISSYNCPROC)glewGetProcAddress((const GLubyte*)"glIsSync")) == NULL) || r;
+ r = ((glWaitSync = (PFNGLWAITSYNCPROC)glewGetProcAddress((const GLubyte*)"glWaitSync")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_sync */
+
+#ifdef GL_ARB_tessellation_shader
+
+static GLboolean _glewInit_GL_ARB_tessellation_shader (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)glewGetProcAddress((const GLubyte*)"glPatchParameterfv")) == NULL) || r;
+ r = ((glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)glewGetProcAddress((const GLubyte*)"glPatchParameteri")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_tessellation_shader */
+
#ifdef GL_ARB_texture_border_clamp
#endif /* GL_ARB_texture_border_clamp */
@@ -3055,6 +4344,10 @@ static GLboolean _glewInit_GL_ARB_texture_buffer_object (GLEW_CONTEXT_ARG_DEF_IN
#endif /* GL_ARB_texture_buffer_object */
+#ifdef GL_ARB_texture_buffer_object_rgb32
+
+#endif /* GL_ARB_texture_buffer_object_rgb32 */
+
#ifdef GL_ARB_texture_compression
static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -3074,6 +4367,10 @@ static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT
#endif /* GL_ARB_texture_compression */
+#ifdef GL_ARB_texture_compression_bptc
+
+#endif /* GL_ARB_texture_compression_bptc */
+
#ifdef GL_ARB_texture_compression_rgtc
#endif /* GL_ARB_texture_compression_rgtc */
@@ -3082,6 +4379,10 @@ static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT
#endif /* GL_ARB_texture_cube_map */
+#ifdef GL_ARB_texture_cube_map_array
+
+#endif /* GL_ARB_texture_cube_map_array */
+
#ifdef GL_ARB_texture_env_add
#endif /* GL_ARB_texture_env_add */
@@ -3102,14 +4403,38 @@ static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT
#endif /* GL_ARB_texture_float */
+#ifdef GL_ARB_texture_gather
+
+#endif /* GL_ARB_texture_gather */
+
#ifdef GL_ARB_texture_mirrored_repeat
#endif /* GL_ARB_texture_mirrored_repeat */
+#ifdef GL_ARB_texture_multisample
+
+static GLboolean _glewInit_GL_ARB_texture_multisample (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)glewGetProcAddress((const GLubyte*)"glGetMultisamplefv")) == NULL) || r;
+ r = ((glSampleMaski = (PFNGLSAMPLEMASKIPROC)glewGetProcAddress((const GLubyte*)"glSampleMaski")) == NULL) || r;
+ r = ((glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage2DMultisample")) == NULL) || r;
+ r = ((glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)glewGetProcAddress((const GLubyte*)"glTexImage3DMultisample")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_texture_multisample */
+
#ifdef GL_ARB_texture_non_power_of_two
#endif /* GL_ARB_texture_non_power_of_two */
+#ifdef GL_ARB_texture_query_lod
+
+#endif /* GL_ARB_texture_query_lod */
+
#ifdef GL_ARB_texture_rectangle
#endif /* GL_ARB_texture_rectangle */
@@ -3118,6 +4443,64 @@ static GLboolean _glewInit_GL_ARB_texture_compression (GLEW_CONTEXT_ARG_DEF_INIT
#endif /* GL_ARB_texture_rg */
+#ifdef GL_ARB_texture_rgb10_a2ui
+
+#endif /* GL_ARB_texture_rgb10_a2ui */
+
+#ifdef GL_ARB_texture_swizzle
+
+#endif /* GL_ARB_texture_swizzle */
+
+#ifdef GL_ARB_timer_query
+
+static GLboolean _glewInit_GL_ARB_timer_query (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjecti64v")) == NULL) || r;
+ r = ((glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)glewGetProcAddress((const GLubyte*)"glGetQueryObjectui64v")) == NULL) || r;
+ r = ((glQueryCounter = (PFNGLQUERYCOUNTERPROC)glewGetProcAddress((const GLubyte*)"glQueryCounter")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_timer_query */
+
+#ifdef GL_ARB_transform_feedback2
+
+static GLboolean _glewInit_GL_ARB_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedback")) == NULL) || r;
+ r = ((glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacks")) == NULL) || r;
+ r = ((glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedback")) == NULL) || r;
+ r = ((glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacks")) == NULL) || r;
+ r = ((glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedback")) == NULL) || r;
+ r = ((glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedback")) == NULL) || r;
+ r = ((glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedback")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_transform_feedback2 */
+
+#ifdef GL_ARB_transform_feedback3
+
+static GLboolean _glewInit_GL_ARB_transform_feedback3 (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glBeginQueryIndexed")) == NULL) || r;
+ r = ((glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackStream")) == NULL) || r;
+ r = ((glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glEndQueryIndexed")) == NULL) || r;
+ r = ((glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)glewGetProcAddress((const GLubyte*)"glGetQueryIndexediv")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_transform_feedback3 */
+
#ifdef GL_ARB_transpose_matrix
static GLboolean _glewInit_GL_ARB_transpose_matrix (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -3134,6 +4517,32 @@ static GLboolean _glewInit_GL_ARB_transpose_matrix (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ARB_transpose_matrix */
+#ifdef GL_ARB_uniform_buffer_object
+
+static GLboolean _glewInit_GL_ARB_uniform_buffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferBase")) == NULL) || r;
+ r = ((glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)glewGetProcAddress((const GLubyte*)"glBindBufferRange")) == NULL) || r;
+ r = ((glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockName")) == NULL) || r;
+ r = ((glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformBlockiv")) == NULL) || r;
+ r = ((glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformName")) == NULL) || r;
+ r = ((glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)glewGetProcAddress((const GLubyte*)"glGetActiveUniformsiv")) == NULL) || r;
+ r = ((glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)glewGetProcAddress((const GLubyte*)"glGetIntegeri_v")) == NULL) || r;
+ r = ((glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)glewGetProcAddress((const GLubyte*)"glGetUniformBlockIndex")) == NULL) || r;
+ r = ((glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)glewGetProcAddress((const GLubyte*)"glGetUniformIndices")) == NULL) || r;
+ r = ((glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)glewGetProcAddress((const GLubyte*)"glUniformBlockBinding")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_uniform_buffer_object */
+
+#ifdef GL_ARB_vertex_array_bgra
+
+#endif /* GL_ARB_vertex_array_bgra */
+
#ifdef GL_ARB_vertex_array_object
static GLboolean _glewInit_GL_ARB_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -3150,6 +4559,28 @@ static GLboolean _glewInit_GL_ARB_vertex_array_object (GLEW_CONTEXT_ARG_DEF_INIT
#endif /* GL_ARB_vertex_array_object */
+#ifdef GL_ARB_vertex_attrib_64bit
+
+static GLboolean _glewInit_GL_ARB_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdv")) == NULL) || r;
+ r = ((glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1d")) == NULL) || r;
+ r = ((glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dv")) == NULL) || r;
+ r = ((glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2d")) == NULL) || r;
+ r = ((glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dv")) == NULL) || r;
+ r = ((glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3d")) == NULL) || r;
+ r = ((glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dv")) == NULL) || r;
+ r = ((glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4d")) == NULL) || r;
+ r = ((glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dv")) == NULL) || r;
+ r = ((glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointer")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_vertex_attrib_64bit */
+
#ifdef GL_ARB_vertex_blend
static GLboolean _glewInit_GL_ARB_vertex_blend (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -3284,6 +4715,78 @@ static GLboolean _glewInit_GL_ARB_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ARB_vertex_shader */
+#ifdef GL_ARB_vertex_type_2_10_10_10_rev
+
+static GLboolean _glewInit_GL_ARB_vertex_type_2_10_10_10_rev (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glColorP3ui = (PFNGLCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glColorP3ui")) == NULL) || r;
+ r = ((glColorP3uiv = (PFNGLCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP3uiv")) == NULL) || r;
+ r = ((glColorP4ui = (PFNGLCOLORP4UIPROC)glewGetProcAddress((const GLubyte*)"glColorP4ui")) == NULL) || r;
+ r = ((glColorP4uiv = (PFNGLCOLORP4UIVPROC)glewGetProcAddress((const GLubyte*)"glColorP4uiv")) == NULL) || r;
+ r = ((glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1ui")) == NULL) || r;
+ r = ((glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP1uiv")) == NULL) || r;
+ r = ((glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2ui")) == NULL) || r;
+ r = ((glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP2uiv")) == NULL) || r;
+ r = ((glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3ui")) == NULL) || r;
+ r = ((glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP3uiv")) == NULL) || r;
+ r = ((glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4ui")) == NULL) || r;
+ r = ((glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glMultiTexCoordP4uiv")) == NULL) || r;
+ r = ((glNormalP3ui = (PFNGLNORMALP3UIPROC)glewGetProcAddress((const GLubyte*)"glNormalP3ui")) == NULL) || r;
+ r = ((glNormalP3uiv = (PFNGLNORMALP3UIVPROC)glewGetProcAddress((const GLubyte*)"glNormalP3uiv")) == NULL) || r;
+ r = ((glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3ui")) == NULL) || r;
+ r = ((glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorP3uiv")) == NULL) || r;
+ r = ((glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1ui")) == NULL) || r;
+ r = ((glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP1uiv")) == NULL) || r;
+ r = ((glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2ui")) == NULL) || r;
+ r = ((glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP2uiv")) == NULL) || r;
+ r = ((glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3ui")) == NULL) || r;
+ r = ((glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP3uiv")) == NULL) || r;
+ r = ((glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4ui")) == NULL) || r;
+ r = ((glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordP4uiv")) == NULL) || r;
+ r = ((glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1ui")) == NULL) || r;
+ r = ((glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP1uiv")) == NULL) || r;
+ r = ((glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2ui")) == NULL) || r;
+ r = ((glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP2uiv")) == NULL) || r;
+ r = ((glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3ui")) == NULL) || r;
+ r = ((glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP3uiv")) == NULL) || r;
+ r = ((glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4ui")) == NULL) || r;
+ r = ((glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribP4uiv")) == NULL) || r;
+ r = ((glVertexP2ui = (PFNGLVERTEXP2UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP2ui")) == NULL) || r;
+ r = ((glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP2uiv")) == NULL) || r;
+ r = ((glVertexP3ui = (PFNGLVERTEXP3UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP3ui")) == NULL) || r;
+ r = ((glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP3uiv")) == NULL) || r;
+ r = ((glVertexP4ui = (PFNGLVERTEXP4UIPROC)glewGetProcAddress((const GLubyte*)"glVertexP4ui")) == NULL) || r;
+ r = ((glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)glewGetProcAddress((const GLubyte*)"glVertexP4uiv")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_vertex_type_2_10_10_10_rev */
+
+#ifdef GL_ARB_viewport_array
+
+static GLboolean _glewInit_GL_ARB_viewport_array (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeArrayv")) == NULL) || r;
+ r = ((glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glDepthRangeIndexed")) == NULL) || r;
+ r = ((glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_v")) == NULL) || r;
+ r = ((glGetFloati_v = (PFNGLGETFLOATI_VPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_v")) == NULL) || r;
+ r = ((glScissorArrayv = (PFNGLSCISSORARRAYVPROC)glewGetProcAddress((const GLubyte*)"glScissorArrayv")) == NULL) || r;
+ r = ((glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexed")) == NULL) || r;
+ r = ((glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)glewGetProcAddress((const GLubyte*)"glScissorIndexedv")) == NULL) || r;
+ r = ((glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)glewGetProcAddress((const GLubyte*)"glViewportArrayv")) == NULL) || r;
+ r = ((glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedf")) == NULL) || r;
+ r = ((glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)glewGetProcAddress((const GLubyte*)"glViewportIndexedfv")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_ARB_viewport_array */
+
#ifdef GL_ARB_window_pos
static GLboolean _glewInit_GL_ARB_window_pos (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -3412,6 +4915,10 @@ static GLboolean _glewInit_GL_ATI_map_object_buffer (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_ATI_map_object_buffer */
+#ifdef GL_ATI_meminfo
+
+#endif /* GL_ATI_meminfo */
+
#ifdef GL_ATI_pn_triangles
static GLboolean _glewInit_GL_ATI_pn_triangles (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -3794,7 +5301,14 @@ static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT
r = ((glCopyTextureSubImage2DEXT = (PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage2DEXT")) == NULL) || r;
r = ((glCopyTextureSubImage3DEXT = (PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glCopyTextureSubImage3DEXT")) == NULL) || r;
r = ((glDisableClientStateIndexedEXT = (PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateIndexedEXT")) == NULL) || r;
+ r = ((glDisableClientStateiEXT = (PFNGLDISABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableClientStateiEXT")) == NULL) || r;
+ r = ((glDisableVertexArrayAttribEXT = (PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayAttribEXT")) == NULL) || r;
+ r = ((glDisableVertexArrayEXT = (PFNGLDISABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glDisableVertexArrayEXT")) == NULL) || r;
r = ((glEnableClientStateIndexedEXT = (PFNGLENABLECLIENTSTATEINDEXEDEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateIndexedEXT")) == NULL) || r;
+ r = ((glEnableClientStateiEXT = (PFNGLENABLECLIENTSTATEIEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableClientStateiEXT")) == NULL) || r;
+ r = ((glEnableVertexArrayAttribEXT = (PFNGLENABLEVERTEXARRAYATTRIBEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayAttribEXT")) == NULL) || r;
+ r = ((glEnableVertexArrayEXT = (PFNGLENABLEVERTEXARRAYEXTPROC)glewGetProcAddress((const GLubyte*)"glEnableVertexArrayEXT")) == NULL) || r;
+ r = ((glFlushMappedNamedBufferRangeEXT = (PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glFlushMappedNamedBufferRangeEXT")) == NULL) || r;
r = ((glFramebufferDrawBufferEXT = (PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBufferEXT")) == NULL) || r;
r = ((glFramebufferDrawBuffersEXT = (PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferDrawBuffersEXT")) == NULL) || r;
r = ((glFramebufferReadBufferEXT = (PFNGLFRAMEBUFFERREADBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glFramebufferReadBufferEXT")) == NULL) || r;
@@ -3803,7 +5317,9 @@ static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT
r = ((glGetCompressedMultiTexImageEXT = (PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedMultiTexImageEXT")) == NULL) || r;
r = ((glGetCompressedTextureImageEXT = (PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetCompressedTextureImageEXT")) == NULL) || r;
r = ((glGetDoubleIndexedvEXT = (PFNGLGETDOUBLEINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoubleIndexedvEXT")) == NULL) || r;
+ r = ((glGetDoublei_vEXT = (PFNGLGETDOUBLEI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetDoublei_vEXT")) == NULL) || r;
r = ((glGetFloatIndexedvEXT = (PFNGLGETFLOATINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloatIndexedvEXT")) == NULL) || r;
+ r = ((glGetFloati_vEXT = (PFNGLGETFLOATI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFloati_vEXT")) == NULL) || r;
r = ((glGetFramebufferParameterivEXT = (PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetFramebufferParameterivEXT")) == NULL) || r;
r = ((glGetMultiTexEnvfvEXT = (PFNGLGETMULTITEXENVFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvfvEXT")) == NULL) || r;
r = ((glGetMultiTexEnvivEXT = (PFNGLGETMULTITEXENVIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetMultiTexEnvivEXT")) == NULL) || r;
@@ -3829,6 +5345,7 @@ static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT
r = ((glGetNamedProgramivEXT = (PFNGLGETNAMEDPROGRAMIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedProgramivEXT")) == NULL) || r;
r = ((glGetNamedRenderbufferParameterivEXT = (PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetNamedRenderbufferParameterivEXT")) == NULL) || r;
r = ((glGetPointerIndexedvEXT = (PFNGLGETPOINTERINDEXEDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointerIndexedvEXT")) == NULL) || r;
+ r = ((glGetPointeri_vEXT = (PFNGLGETPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointeri_vEXT")) == NULL) || r;
r = ((glGetTextureImageEXT = (PFNGLGETTEXTUREIMAGEEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureImageEXT")) == NULL) || r;
r = ((glGetTextureLevelParameterfvEXT = (PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterfvEXT")) == NULL) || r;
r = ((glGetTextureLevelParameterivEXT = (PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureLevelParameterivEXT")) == NULL) || r;
@@ -3836,7 +5353,12 @@ static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT
r = ((glGetTextureParameterIuivEXT = (PFNGLGETTEXTUREPARAMETERIUIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterIuivEXT")) == NULL) || r;
r = ((glGetTextureParameterfvEXT = (PFNGLGETTEXTUREPARAMETERFVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterfvEXT")) == NULL) || r;
r = ((glGetTextureParameterivEXT = (PFNGLGETTEXTUREPARAMETERIVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetTextureParameterivEXT")) == NULL) || r;
+ r = ((glGetVertexArrayIntegeri_vEXT = (PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegeri_vEXT")) == NULL) || r;
+ r = ((glGetVertexArrayIntegervEXT = (PFNGLGETVERTEXARRAYINTEGERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayIntegervEXT")) == NULL) || r;
+ r = ((glGetVertexArrayPointeri_vEXT = (PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointeri_vEXT")) == NULL) || r;
+ r = ((glGetVertexArrayPointervEXT = (PFNGLGETVERTEXARRAYPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexArrayPointervEXT")) == NULL) || r;
r = ((glMapNamedBufferEXT = (PFNGLMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferEXT")) == NULL) || r;
+ r = ((glMapNamedBufferRangeEXT = (PFNGLMAPNAMEDBUFFERRANGEEXTPROC)glewGetProcAddress((const GLubyte*)"glMapNamedBufferRangeEXT")) == NULL) || r;
r = ((glMatrixFrustumEXT = (PFNGLMATRIXFRUSTUMEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixFrustumEXT")) == NULL) || r;
r = ((glMatrixLoadIdentityEXT = (PFNGLMATRIXLOADIDENTITYEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadIdentityEXT")) == NULL) || r;
r = ((glMatrixLoadTransposedEXT = (PFNGLMATRIXLOADTRANSPOSEDEXTPROC)glewGetProcAddress((const GLubyte*)"glMatrixLoadTransposedEXT")) == NULL) || r;
@@ -3883,6 +5405,7 @@ static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT
r = ((glMultiTexSubImage3DEXT = (PFNGLMULTITEXSUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glMultiTexSubImage3DEXT")) == NULL) || r;
r = ((glNamedBufferDataEXT = (PFNGLNAMEDBUFFERDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferDataEXT")) == NULL) || r;
r = ((glNamedBufferSubDataEXT = (PFNGLNAMEDBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedBufferSubDataEXT")) == NULL) || r;
+ r = ((glNamedCopyBufferSubDataEXT = (PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedCopyBufferSubDataEXT")) == NULL) || r;
r = ((glNamedFramebufferRenderbufferEXT = (PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferRenderbufferEXT")) == NULL) || r;
r = ((glNamedFramebufferTexture1DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture1DEXT")) == NULL) || r;
r = ((glNamedFramebufferTexture2DEXT = (PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glNamedFramebufferTexture2DEXT")) == NULL) || r;
@@ -3954,6 +5477,17 @@ static GLboolean _glewInit_GL_EXT_direct_state_access (GLEW_CONTEXT_ARG_DEF_INIT
r = ((glTextureSubImage2DEXT = (PFNGLTEXTURESUBIMAGE2DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage2DEXT")) == NULL) || r;
r = ((glTextureSubImage3DEXT = (PFNGLTEXTURESUBIMAGE3DEXTPROC)glewGetProcAddress((const GLubyte*)"glTextureSubImage3DEXT")) == NULL) || r;
r = ((glUnmapNamedBufferEXT = (PFNGLUNMAPNAMEDBUFFEREXTPROC)glewGetProcAddress((const GLubyte*)"glUnmapNamedBufferEXT")) == NULL) || r;
+ r = ((glVertexArrayColorOffsetEXT = (PFNGLVERTEXARRAYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayColorOffsetEXT")) == NULL) || r;
+ r = ((glVertexArrayEdgeFlagOffsetEXT = (PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayEdgeFlagOffsetEXT")) == NULL) || r;
+ r = ((glVertexArrayFogCoordOffsetEXT = (PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayFogCoordOffsetEXT")) == NULL) || r;
+ r = ((glVertexArrayIndexOffsetEXT = (PFNGLVERTEXARRAYINDEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayIndexOffsetEXT")) == NULL) || r;
+ r = ((glVertexArrayMultiTexCoordOffsetEXT = (PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayMultiTexCoordOffsetEXT")) == NULL) || r;
+ r = ((glVertexArrayNormalOffsetEXT = (PFNGLVERTEXARRAYNORMALOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayNormalOffsetEXT")) == NULL) || r;
+ r = ((glVertexArraySecondaryColorOffsetEXT = (PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArraySecondaryColorOffsetEXT")) == NULL) || r;
+ r = ((glVertexArrayTexCoordOffsetEXT = (PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayTexCoordOffsetEXT")) == NULL) || r;
+ r = ((glVertexArrayVertexAttribIOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribIOffsetEXT")) == NULL) || r;
+ r = ((glVertexArrayVertexAttribOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribOffsetEXT")) == NULL) || r;
+ r = ((glVertexArrayVertexOffsetEXT = (PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexOffsetEXT")) == NULL) || r;
return r;
}
@@ -4371,6 +5905,19 @@ static GLboolean _glewInit_GL_EXT_polygon_offset (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_EXT_polygon_offset */
+#ifdef GL_EXT_provoking_vertex
+
+static GLboolean _glewInit_GL_EXT_provoking_vertex (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glProvokingVertexEXT = (PFNGLPROVOKINGVERTEXEXTPROC)glewGetProcAddress((const GLubyte*)"glProvokingVertexEXT")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_EXT_provoking_vertex */
+
#ifdef GL_EXT_rescale_normal
#endif /* GL_EXT_rescale_normal */
@@ -4418,10 +5965,39 @@ static GLboolean _glewInit_GL_EXT_secondary_color (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_EXT_secondary_color */
+#ifdef GL_EXT_separate_shader_objects
+
+static GLboolean _glewInit_GL_EXT_separate_shader_objects (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glActiveProgramEXT = (PFNGLACTIVEPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glActiveProgramEXT")) == NULL) || r;
+ r = ((glCreateShaderProgramEXT = (PFNGLCREATESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glCreateShaderProgramEXT")) == NULL) || r;
+ r = ((glUseShaderProgramEXT = (PFNGLUSESHADERPROGRAMEXTPROC)glewGetProcAddress((const GLubyte*)"glUseShaderProgramEXT")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_EXT_separate_shader_objects */
+
#ifdef GL_EXT_separate_specular_color
#endif /* GL_EXT_separate_specular_color */
+#ifdef GL_EXT_shader_image_load_store
+
+static GLboolean _glewInit_GL_EXT_shader_image_load_store (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBindImageTextureEXT = (PFNGLBINDIMAGETEXTUREEXTPROC)glewGetProcAddress((const GLubyte*)"glBindImageTextureEXT")) == NULL) || r;
+ r = ((glMemoryBarrierEXT = (PFNGLMEMORYBARRIEREXTPROC)glewGetProcAddress((const GLubyte*)"glMemoryBarrierEXT")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_EXT_shader_image_load_store */
+
#ifdef GL_EXT_shadow_funcs
#endif /* GL_EXT_shadow_funcs */
@@ -4609,10 +6185,18 @@ static GLboolean _glewInit_GL_EXT_texture_perturb_normal (GLEW_CONTEXT_ARG_DEF_I
#endif /* GL_EXT_texture_sRGB */
+#ifdef GL_EXT_texture_sRGB_decode
+
+#endif /* GL_EXT_texture_sRGB_decode */
+
#ifdef GL_EXT_texture_shared_exponent
#endif /* GL_EXT_texture_shared_exponent */
+#ifdef GL_EXT_texture_snorm
+
+#endif /* GL_EXT_texture_snorm */
+
#ifdef GL_EXT_texture_swizzle
#endif /* GL_EXT_texture_swizzle */
@@ -4660,7 +6244,6 @@ static GLboolean _glewInit_GL_EXT_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT)
r = ((glColorPointerEXT = (PFNGLCOLORPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glColorPointerEXT")) == NULL) || r;
r = ((glDrawArraysEXT = (PFNGLDRAWARRAYSEXTPROC)glewGetProcAddress((const GLubyte*)"glDrawArraysEXT")) == NULL) || r;
r = ((glEdgeFlagPointerEXT = (PFNGLEDGEFLAGPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagPointerEXT")) == NULL) || r;
- r = ((glGetPointervEXT = (PFNGLGETPOINTERVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetPointervEXT")) == NULL) || r;
r = ((glIndexPointerEXT = (PFNGLINDEXPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glIndexPointerEXT")) == NULL) || r;
r = ((glNormalPointerEXT = (PFNGLNORMALPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glNormalPointerEXT")) == NULL) || r;
r = ((glTexCoordPointerEXT = (PFNGLTEXCOORDPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glTexCoordPointerEXT")) == NULL) || r;
@@ -4675,6 +6258,29 @@ static GLboolean _glewInit_GL_EXT_vertex_array (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_EXT_vertex_array_bgra */
+#ifdef GL_EXT_vertex_attrib_64bit
+
+static GLboolean _glewInit_GL_EXT_vertex_attrib_64bit (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetVertexAttribLdvEXT = (PFNGLGETVERTEXATTRIBLDVEXTPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLdvEXT")) == NULL) || r;
+ r = ((glVertexArrayVertexAttribLOffsetEXT = (PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexArrayVertexAttribLOffsetEXT")) == NULL) || r;
+ r = ((glVertexAttribL1dEXT = (PFNGLVERTEXATTRIBL1DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dEXT")) == NULL) || r;
+ r = ((glVertexAttribL1dvEXT = (PFNGLVERTEXATTRIBL1DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1dvEXT")) == NULL) || r;
+ r = ((glVertexAttribL2dEXT = (PFNGLVERTEXATTRIBL2DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dEXT")) == NULL) || r;
+ r = ((glVertexAttribL2dvEXT = (PFNGLVERTEXATTRIBL2DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2dvEXT")) == NULL) || r;
+ r = ((glVertexAttribL3dEXT = (PFNGLVERTEXATTRIBL3DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dEXT")) == NULL) || r;
+ r = ((glVertexAttribL3dvEXT = (PFNGLVERTEXATTRIBL3DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3dvEXT")) == NULL) || r;
+ r = ((glVertexAttribL4dEXT = (PFNGLVERTEXATTRIBL4DEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dEXT")) == NULL) || r;
+ r = ((glVertexAttribL4dvEXT = (PFNGLVERTEXATTRIBL4DVEXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4dvEXT")) == NULL) || r;
+ r = ((glVertexAttribLPointerEXT = (PFNGLVERTEXATTRIBLPOINTEREXTPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLPointerEXT")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_EXT_vertex_attrib_64bit */
+
#ifdef GL_EXT_vertex_shader
static GLboolean _glewInit_GL_EXT_vertex_shader (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -4966,6 +6572,10 @@ static GLboolean _glewInit_GL_MESA_window_pos (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_MESA_ycbcr_texture */
+#ifdef GL_NVX_gpu_memory_info
+
+#endif /* GL_NVX_gpu_memory_info */
+
#ifdef GL_NV_blend_square
#endif /* GL_NV_blend_square */
@@ -4988,6 +6598,19 @@ static GLboolean _glewInit_GL_NV_conditional_render (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_NV_copy_depth_to_color */
+#ifdef GL_NV_copy_image
+
+static GLboolean _glewInit_GL_NV_copy_image (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glCopyImageSubDataNV = (PFNGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glCopyImageSubDataNV")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_NV_copy_image */
+
#ifdef GL_NV_depth_buffer_float
static GLboolean _glewInit_GL_NV_depth_buffer_float (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -5158,6 +6781,60 @@ static GLboolean _glewInit_GL_NV_gpu_program4 (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_NV_gpu_program4 */
+#ifdef GL_NV_gpu_program5
+
+#endif /* GL_NV_gpu_program5 */
+
+#ifdef GL_NV_gpu_program_fp64
+
+#endif /* GL_NV_gpu_program_fp64 */
+
+#ifdef GL_NV_gpu_shader5
+
+static GLboolean _glewInit_GL_NV_gpu_shader5 (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetUniformi64vNV = (PFNGLGETUNIFORMI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformi64vNV")) == NULL) || r;
+ r = ((glGetUniformui64vNV = (PFNGLGETUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetUniformui64vNV")) == NULL) || r;
+ r = ((glProgramUniform1i64NV = (PFNGLPROGRAMUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64NV")) == NULL) || r;
+ r = ((glProgramUniform1i64vNV = (PFNGLPROGRAMUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1i64vNV")) == NULL) || r;
+ r = ((glProgramUniform1ui64NV = (PFNGLPROGRAMUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64NV")) == NULL) || r;
+ r = ((glProgramUniform1ui64vNV = (PFNGLPROGRAMUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform1ui64vNV")) == NULL) || r;
+ r = ((glProgramUniform2i64NV = (PFNGLPROGRAMUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64NV")) == NULL) || r;
+ r = ((glProgramUniform2i64vNV = (PFNGLPROGRAMUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2i64vNV")) == NULL) || r;
+ r = ((glProgramUniform2ui64NV = (PFNGLPROGRAMUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64NV")) == NULL) || r;
+ r = ((glProgramUniform2ui64vNV = (PFNGLPROGRAMUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform2ui64vNV")) == NULL) || r;
+ r = ((glProgramUniform3i64NV = (PFNGLPROGRAMUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64NV")) == NULL) || r;
+ r = ((glProgramUniform3i64vNV = (PFNGLPROGRAMUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3i64vNV")) == NULL) || r;
+ r = ((glProgramUniform3ui64NV = (PFNGLPROGRAMUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64NV")) == NULL) || r;
+ r = ((glProgramUniform3ui64vNV = (PFNGLPROGRAMUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform3ui64vNV")) == NULL) || r;
+ r = ((glProgramUniform4i64NV = (PFNGLPROGRAMUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64NV")) == NULL) || r;
+ r = ((glProgramUniform4i64vNV = (PFNGLPROGRAMUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4i64vNV")) == NULL) || r;
+ r = ((glProgramUniform4ui64NV = (PFNGLPROGRAMUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64NV")) == NULL) || r;
+ r = ((glProgramUniform4ui64vNV = (PFNGLPROGRAMUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniform4ui64vNV")) == NULL) || r;
+ r = ((glUniform1i64NV = (PFNGLUNIFORM1I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64NV")) == NULL) || r;
+ r = ((glUniform1i64vNV = (PFNGLUNIFORM1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1i64vNV")) == NULL) || r;
+ r = ((glUniform1ui64NV = (PFNGLUNIFORM1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64NV")) == NULL) || r;
+ r = ((glUniform1ui64vNV = (PFNGLUNIFORM1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform1ui64vNV")) == NULL) || r;
+ r = ((glUniform2i64NV = (PFNGLUNIFORM2I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64NV")) == NULL) || r;
+ r = ((glUniform2i64vNV = (PFNGLUNIFORM2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2i64vNV")) == NULL) || r;
+ r = ((glUniform2ui64NV = (PFNGLUNIFORM2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64NV")) == NULL) || r;
+ r = ((glUniform2ui64vNV = (PFNGLUNIFORM2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform2ui64vNV")) == NULL) || r;
+ r = ((glUniform3i64NV = (PFNGLUNIFORM3I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64NV")) == NULL) || r;
+ r = ((glUniform3i64vNV = (PFNGLUNIFORM3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3i64vNV")) == NULL) || r;
+ r = ((glUniform3ui64NV = (PFNGLUNIFORM3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64NV")) == NULL) || r;
+ r = ((glUniform3ui64vNV = (PFNGLUNIFORM3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform3ui64vNV")) == NULL) || r;
+ r = ((glUniform4i64NV = (PFNGLUNIFORM4I64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64NV")) == NULL) || r;
+ r = ((glUniform4i64vNV = (PFNGLUNIFORM4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4i64vNV")) == NULL) || r;
+ r = ((glUniform4ui64NV = (PFNGLUNIFORM4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64NV")) == NULL) || r;
+ r = ((glUniform4ui64vNV = (PFNGLUNIFORM4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniform4ui64vNV")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_NV_gpu_shader5 */
+
#ifdef GL_NV_half_float
static GLboolean _glewInit_GL_NV_half_float (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -5220,6 +6897,10 @@ static GLboolean _glewInit_GL_NV_half_float (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_NV_light_max_exponent */
+#ifdef GL_NV_multisample_coverage
+
+#endif /* GL_NV_multisample_coverage */
+
#ifdef GL_NV_multisample_filter_hint
#endif /* GL_NV_multisample_filter_hint */
@@ -5262,6 +6943,10 @@ static GLboolean _glewInit_GL_NV_parameter_buffer_object (GLEW_CONTEXT_ARG_DEF_I
#endif /* GL_NV_parameter_buffer_object */
+#ifdef GL_NV_parameter_buffer_object2
+
+#endif /* GL_NV_parameter_buffer_object2 */
+
#ifdef GL_NV_pixel_data_range
static GLboolean _glewInit_GL_NV_pixel_data_range (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -5361,6 +7046,35 @@ static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_NV_register_combiners2 */
+#ifdef GL_NV_shader_buffer_load
+
+static GLboolean _glewInit_GL_NV_shader_buffer_load (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetBufferParameterui64vNV = (PFNGLGETBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetBufferParameterui64vNV")) == NULL) || r;
+ r = ((glGetIntegerui64vNV = (PFNGLGETINTEGERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64vNV")) == NULL) || r;
+ r = ((glGetNamedBufferParameterui64vNV = (PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetNamedBufferParameterui64vNV")) == NULL) || r;
+ r = ((glIsBufferResidentNV = (PFNGLISBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsBufferResidentNV")) == NULL) || r;
+ r = ((glIsNamedBufferResidentNV = (PFNGLISNAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glIsNamedBufferResidentNV")) == NULL) || r;
+ r = ((glMakeBufferNonResidentNV = (PFNGLMAKEBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferNonResidentNV")) == NULL) || r;
+ r = ((glMakeBufferResidentNV = (PFNGLMAKEBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeBufferResidentNV")) == NULL) || r;
+ r = ((glMakeNamedBufferNonResidentNV = (PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferNonResidentNV")) == NULL) || r;
+ r = ((glMakeNamedBufferResidentNV = (PFNGLMAKENAMEDBUFFERRESIDENTNVPROC)glewGetProcAddress((const GLubyte*)"glMakeNamedBufferResidentNV")) == NULL) || r;
+ r = ((glProgramUniformui64NV = (PFNGLPROGRAMUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64NV")) == NULL) || r;
+ r = ((glProgramUniformui64vNV = (PFNGLPROGRAMUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glProgramUniformui64vNV")) == NULL) || r;
+ r = ((glUniformui64NV = (PFNGLUNIFORMUI64NVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64NV")) == NULL) || r;
+ r = ((glUniformui64vNV = (PFNGLUNIFORMUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glUniformui64vNV")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_NV_shader_buffer_load */
+
+#ifdef GL_NV_tessellation_program5
+
+#endif /* GL_NV_tessellation_program5 */
+
#ifdef GL_NV_texgen_emboss
#endif /* GL_NV_texgen_emboss */
@@ -5369,6 +7083,19 @@ static GLboolean _glewInit_GL_NV_register_combiners2 (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_NV_texgen_reflection */
+#ifdef GL_NV_texture_barrier
+
+static GLboolean _glewInit_GL_NV_texture_barrier (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glTextureBarrierNV = (PFNGLTEXTUREBARRIERNVPROC)glewGetProcAddress((const GLubyte*)"glTextureBarrierNV")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_NV_texture_barrier */
+
#ifdef GL_NV_texture_compression_vtc
#endif /* GL_NV_texture_compression_vtc */
@@ -5420,6 +7147,47 @@ static GLboolean _glewInit_GL_NV_transform_feedback (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_NV_transform_feedback */
+#ifdef GL_NV_transform_feedback2
+
+static GLboolean _glewInit_GL_NV_transform_feedback2 (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBindTransformFeedbackNV = (PFNGLBINDTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glBindTransformFeedbackNV")) == NULL) || r;
+ r = ((glDeleteTransformFeedbacksNV = (PFNGLDELETETRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glDeleteTransformFeedbacksNV")) == NULL) || r;
+ r = ((glDrawTransformFeedbackNV = (PFNGLDRAWTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glDrawTransformFeedbackNV")) == NULL) || r;
+ r = ((glGenTransformFeedbacksNV = (PFNGLGENTRANSFORMFEEDBACKSNVPROC)glewGetProcAddress((const GLubyte*)"glGenTransformFeedbacksNV")) == NULL) || r;
+ r = ((glIsTransformFeedbackNV = (PFNGLISTRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glIsTransformFeedbackNV")) == NULL) || r;
+ r = ((glPauseTransformFeedbackNV = (PFNGLPAUSETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glPauseTransformFeedbackNV")) == NULL) || r;
+ r = ((glResumeTransformFeedbackNV = (PFNGLRESUMETRANSFORMFEEDBACKNVPROC)glewGetProcAddress((const GLubyte*)"glResumeTransformFeedbackNV")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_NV_transform_feedback2 */
+
+#ifdef GL_NV_vdpau_interop
+
+static GLboolean _glewInit_GL_NV_vdpau_interop (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glVDPAUFiniNV = (PFNGLVDPAUFININVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUFiniNV")) == NULL) || r;
+ r = ((glVDPAUGetSurfaceivNV = (PFNGLVDPAUGETSURFACEIVNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUGetSurfaceivNV")) == NULL) || r;
+ r = ((glVDPAUInitNV = (PFNGLVDPAUINITNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUInitNV")) == NULL) || r;
+ r = ((glVDPAUIsSurfaceNV = (PFNGLVDPAUISSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUIsSurfaceNV")) == NULL) || r;
+ r = ((glVDPAUMapSurfacesNV = (PFNGLVDPAUMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUMapSurfacesNV")) == NULL) || r;
+ r = ((glVDPAURegisterOutputSurfaceNV = (PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterOutputSurfaceNV")) == NULL) || r;
+ r = ((glVDPAURegisterVideoSurfaceNV = (PFNGLVDPAUREGISTERVIDEOSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAURegisterVideoSurfaceNV")) == NULL) || r;
+ r = ((glVDPAUSurfaceAccessNV = (PFNGLVDPAUSURFACEACCESSNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUSurfaceAccessNV")) == NULL) || r;
+ r = ((glVDPAUUnmapSurfacesNV = (PFNGLVDPAUUNMAPSURFACESNVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnmapSurfacesNV")) == NULL) || r;
+ r = ((glVDPAUUnregisterSurfaceNV = (PFNGLVDPAUUNREGISTERSURFACENVPROC)glewGetProcAddress((const GLubyte*)"glVDPAUUnregisterSurfaceNV")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_NV_vdpau_interop */
+
#ifdef GL_NV_vertex_array_range
static GLboolean _glewInit_GL_NV_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -5438,6 +7206,61 @@ static GLboolean _glewInit_GL_NV_vertex_array_range (GLEW_CONTEXT_ARG_DEF_INIT)
#endif /* GL_NV_vertex_array_range2 */
+#ifdef GL_NV_vertex_attrib_integer_64bit
+
+static GLboolean _glewInit_GL_NV_vertex_attrib_integer_64bit (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glGetVertexAttribLi64vNV = (PFNGLGETVERTEXATTRIBLI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLi64vNV")) == NULL) || r;
+ r = ((glGetVertexAttribLui64vNV = (PFNGLGETVERTEXATTRIBLUI64VNVPROC)glewGetProcAddress((const GLubyte*)"glGetVertexAttribLui64vNV")) == NULL) || r;
+ r = ((glVertexAttribL1i64NV = (PFNGLVERTEXATTRIBL1I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64NV")) == NULL) || r;
+ r = ((glVertexAttribL1i64vNV = (PFNGLVERTEXATTRIBL1I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1i64vNV")) == NULL) || r;
+ r = ((glVertexAttribL1ui64NV = (PFNGLVERTEXATTRIBL1UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64NV")) == NULL) || r;
+ r = ((glVertexAttribL1ui64vNV = (PFNGLVERTEXATTRIBL1UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL1ui64vNV")) == NULL) || r;
+ r = ((glVertexAttribL2i64NV = (PFNGLVERTEXATTRIBL2I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64NV")) == NULL) || r;
+ r = ((glVertexAttribL2i64vNV = (PFNGLVERTEXATTRIBL2I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2i64vNV")) == NULL) || r;
+ r = ((glVertexAttribL2ui64NV = (PFNGLVERTEXATTRIBL2UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64NV")) == NULL) || r;
+ r = ((glVertexAttribL2ui64vNV = (PFNGLVERTEXATTRIBL2UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL2ui64vNV")) == NULL) || r;
+ r = ((glVertexAttribL3i64NV = (PFNGLVERTEXATTRIBL3I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64NV")) == NULL) || r;
+ r = ((glVertexAttribL3i64vNV = (PFNGLVERTEXATTRIBL3I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3i64vNV")) == NULL) || r;
+ r = ((glVertexAttribL3ui64NV = (PFNGLVERTEXATTRIBL3UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64NV")) == NULL) || r;
+ r = ((glVertexAttribL3ui64vNV = (PFNGLVERTEXATTRIBL3UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL3ui64vNV")) == NULL) || r;
+ r = ((glVertexAttribL4i64NV = (PFNGLVERTEXATTRIBL4I64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64NV")) == NULL) || r;
+ r = ((glVertexAttribL4i64vNV = (PFNGLVERTEXATTRIBL4I64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4i64vNV")) == NULL) || r;
+ r = ((glVertexAttribL4ui64NV = (PFNGLVERTEXATTRIBL4UI64NVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64NV")) == NULL) || r;
+ r = ((glVertexAttribL4ui64vNV = (PFNGLVERTEXATTRIBL4UI64VNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribL4ui64vNV")) == NULL) || r;
+ r = ((glVertexAttribLFormatNV = (PFNGLVERTEXATTRIBLFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribLFormatNV")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_NV_vertex_attrib_integer_64bit */
+
+#ifdef GL_NV_vertex_buffer_unified_memory
+
+static GLboolean _glewInit_GL_NV_vertex_buffer_unified_memory (GLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glBufferAddressRangeNV = (PFNGLBUFFERADDRESSRANGENVPROC)glewGetProcAddress((const GLubyte*)"glBufferAddressRangeNV")) == NULL) || r;
+ r = ((glColorFormatNV = (PFNGLCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glColorFormatNV")) == NULL) || r;
+ r = ((glEdgeFlagFormatNV = (PFNGLEDGEFLAGFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glEdgeFlagFormatNV")) == NULL) || r;
+ r = ((glFogCoordFormatNV = (PFNGLFOGCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glFogCoordFormatNV")) == NULL) || r;
+ r = ((glGetIntegerui64i_vNV = (PFNGLGETINTEGERUI64I_VNVPROC)glewGetProcAddress((const GLubyte*)"glGetIntegerui64i_vNV")) == NULL) || r;
+ r = ((glIndexFormatNV = (PFNGLINDEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glIndexFormatNV")) == NULL) || r;
+ r = ((glNormalFormatNV = (PFNGLNORMALFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glNormalFormatNV")) == NULL) || r;
+ r = ((glSecondaryColorFormatNV = (PFNGLSECONDARYCOLORFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glSecondaryColorFormatNV")) == NULL) || r;
+ r = ((glTexCoordFormatNV = (PFNGLTEXCOORDFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glTexCoordFormatNV")) == NULL) || r;
+ r = ((glVertexAttribFormatNV = (PFNGLVERTEXATTRIBFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribFormatNV")) == NULL) || r;
+ r = ((glVertexAttribIFormatNV = (PFNGLVERTEXATTRIBIFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexAttribIFormatNV")) == NULL) || r;
+ r = ((glVertexFormatNV = (PFNGLVERTEXFORMATNVPROC)glewGetProcAddress((const GLubyte*)"glVertexFormatNV")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GL_NV_vertex_buffer_unified_memory */
+
#ifdef GL_NV_vertex_program
static GLboolean _glewInit_GL_NV_vertex_program (GLEW_CONTEXT_ARG_DEF_INIT)
@@ -6151,86 +7974,50 @@ static
GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
{
const GLubyte* s;
- GLuint dot, major, minor;
+ GLuint dot;
+ GLint major, minor;
/* query opengl version */
s = glGetString(GL_VERSION);
dot = _glewStrCLen(s, '.');
- major = dot-1;
- minor = dot+1;
- if (dot == 0 || s[minor] == '\0')
+ if (dot == 0)
+ return GLEW_ERROR_NO_GL_VERSION;
+
+ major = s[dot-1]-'0';
+ minor = s[dot+1]-'0';
+
+ if (minor < 0 || minor > 9)
+ minor = 0;
+ if (major<0 || major>9)
return GLEW_ERROR_NO_GL_VERSION;
- if (s[major] == '1' && s[minor] == '0')
+
+
+ if (major == 1 && minor == 0)
{
- return GLEW_ERROR_GL_VERSION_10_ONLY;
+ return GLEW_ERROR_GL_VERSION_10_ONLY;
}
else
{
- CONST_CAST(GLEW_VERSION_1_1) = GL_TRUE;
- if (s[major] >= '2')
- {
- CONST_CAST(GLEW_VERSION_1_2) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_3) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_4) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_5) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_2_0) = GL_TRUE;
- if (s[minor] >= '1')
- {
- CONST_CAST(GLEW_VERSION_2_1) = GL_TRUE;
- }
- }
- else
- {
- if (s[minor] >= '5')
- {
- CONST_CAST(GLEW_VERSION_1_2) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_3) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_4) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_5) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_2_0) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_2_1) = GL_FALSE;
- }
- if (s[minor] == '4')
- {
- CONST_CAST(GLEW_VERSION_1_2) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_3) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_4) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_5) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_2_0) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_2_1) = GL_FALSE;
- }
- if (s[minor] == '3')
- {
- CONST_CAST(GLEW_VERSION_1_2) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_3) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_4) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_1_5) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_2_0) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_2_1) = GL_FALSE;
- }
- if (s[minor] == '2')
- {
- CONST_CAST(GLEW_VERSION_1_2) = GL_TRUE;
- CONST_CAST(GLEW_VERSION_1_3) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_1_4) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_1_5) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_2_0) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_2_1) = GL_FALSE;
- }
- if (s[minor] < '2')
- {
- CONST_CAST(GLEW_VERSION_1_2) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_1_3) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_1_4) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_1_5) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_2_0) = GL_FALSE;
- CONST_CAST(GLEW_VERSION_2_1) = GL_FALSE;
- }
- }
+ CONST_CAST(GLEW_VERSION_4_1) = ( major > 4 ) || ( major == 4 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_4_0) = GLEW_VERSION_4_1 == GL_TRUE || ( major == 4 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_3_3) = GLEW_VERSION_4_0 == GL_TRUE || ( major == 3 && minor >= 3 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_3_2) = GLEW_VERSION_3_3 == GL_TRUE || ( major == 3 && minor >= 2 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_3_1) = GLEW_VERSION_3_2 == GL_TRUE || ( major == 3 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_3_0) = GLEW_VERSION_3_1 == GL_TRUE || ( major == 3 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_2_1) = GLEW_VERSION_3_0 == GL_TRUE || ( major == 2 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_2_0) = GLEW_VERSION_2_1 == GL_TRUE || ( major == 2 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_1_5) = GLEW_VERSION_2_0 == GL_TRUE || ( major == 1 && minor >= 5 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_1_4) = GLEW_VERSION_1_5 == GL_TRUE || ( major == 1 && minor >= 4 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_1_3) = GLEW_VERSION_1_4 == GL_TRUE || ( major == 1 && minor >= 3 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_1_2_1) = GLEW_VERSION_1_3 == GL_TRUE ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_1_2) = GLEW_VERSION_1_2_1 == GL_TRUE || ( major == 1 && minor >= 2 ) ? GL_TRUE : GL_FALSE;
+ CONST_CAST(GLEW_VERSION_1_1) = GLEW_VERSION_1_2 == GL_TRUE || ( major == 1 && minor >= 1 ) ? GL_TRUE : GL_FALSE;
}
/* initialize extensions */
#ifdef GL_VERSION_1_2
if (glewExperimental || GLEW_VERSION_1_2) CONST_CAST(GLEW_VERSION_1_2) = !_glewInit_GL_VERSION_1_2(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_VERSION_1_2 */
+#ifdef GL_VERSION_1_2_1
+#endif /* GL_VERSION_1_2_1 */
#ifdef GL_VERSION_1_3
if (glewExperimental || GLEW_VERSION_1_3) CONST_CAST(GLEW_VERSION_1_3) = !_glewInit_GL_VERSION_1_3(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_VERSION_1_3 */
@@ -6249,6 +8036,20 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
#ifdef GL_VERSION_3_0
if (glewExperimental || GLEW_VERSION_3_0) CONST_CAST(GLEW_VERSION_3_0) = !_glewInit_GL_VERSION_3_0(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_VERSION_3_0 */
+#ifdef GL_VERSION_3_1
+ if (glewExperimental || GLEW_VERSION_3_1) CONST_CAST(GLEW_VERSION_3_1) = !_glewInit_GL_VERSION_3_1(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_VERSION_3_1 */
+#ifdef GL_VERSION_3_2
+ if (glewExperimental || GLEW_VERSION_3_2) CONST_CAST(GLEW_VERSION_3_2) = !_glewInit_GL_VERSION_3_2(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_VERSION_3_2 */
+#ifdef GL_VERSION_3_3
+ if (glewExperimental || GLEW_VERSION_3_3) CONST_CAST(GLEW_VERSION_3_3) = !_glewInit_GL_VERSION_3_3(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_VERSION_3_3 */
+#ifdef GL_VERSION_4_0
+ if (glewExperimental || GLEW_VERSION_4_0) CONST_CAST(GLEW_VERSION_4_0) = !_glewInit_GL_VERSION_4_0(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_VERSION_4_0 */
+#ifdef GL_VERSION_4_1
+#endif /* GL_VERSION_4_1 */
#ifdef GL_3DFX_multisample
CONST_CAST(GLEW_3DFX_multisample) = glewGetExtension("GL_3DFX_multisample");
#endif /* GL_3DFX_multisample */
@@ -6259,6 +8060,47 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
#ifdef GL_3DFX_texture_compression_FXT1
CONST_CAST(GLEW_3DFX_texture_compression_FXT1) = glewGetExtension("GL_3DFX_texture_compression_FXT1");
#endif /* GL_3DFX_texture_compression_FXT1 */
+#ifdef GL_AMD_conservative_depth
+ CONST_CAST(GLEW_AMD_conservative_depth) = glewGetExtension("GL_AMD_conservative_depth");
+#endif /* GL_AMD_conservative_depth */
+#ifdef GL_AMD_debug_output
+ CONST_CAST(GLEW_AMD_debug_output) = glewGetExtension("GL_AMD_debug_output");
+ if (glewExperimental || GLEW_AMD_debug_output) CONST_CAST(GLEW_AMD_debug_output) = !_glewInit_GL_AMD_debug_output(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_AMD_debug_output */
+#ifdef GL_AMD_depth_clamp_separate
+ CONST_CAST(GLEW_AMD_depth_clamp_separate) = glewGetExtension("GL_AMD_depth_clamp_separate");
+#endif /* GL_AMD_depth_clamp_separate */
+#ifdef GL_AMD_draw_buffers_blend
+ CONST_CAST(GLEW_AMD_draw_buffers_blend) = glewGetExtension("GL_AMD_draw_buffers_blend");
+ if (glewExperimental || GLEW_AMD_draw_buffers_blend) CONST_CAST(GLEW_AMD_draw_buffers_blend) = !_glewInit_GL_AMD_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_AMD_draw_buffers_blend */
+#ifdef GL_AMD_name_gen_delete
+ CONST_CAST(GLEW_AMD_name_gen_delete) = glewGetExtension("GL_AMD_name_gen_delete");
+ if (glewExperimental || GLEW_AMD_name_gen_delete) CONST_CAST(GLEW_AMD_name_gen_delete) = !_glewInit_GL_AMD_name_gen_delete(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_AMD_name_gen_delete */
+#ifdef GL_AMD_performance_monitor
+ CONST_CAST(GLEW_AMD_performance_monitor) = glewGetExtension("GL_AMD_performance_monitor");
+ if (glewExperimental || GLEW_AMD_performance_monitor) CONST_CAST(GLEW_AMD_performance_monitor) = !_glewInit_GL_AMD_performance_monitor(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_AMD_performance_monitor */
+#ifdef GL_AMD_seamless_cubemap_per_texture
+ CONST_CAST(GLEW_AMD_seamless_cubemap_per_texture) = glewGetExtension("GL_AMD_seamless_cubemap_per_texture");
+#endif /* GL_AMD_seamless_cubemap_per_texture */
+#ifdef GL_AMD_shader_stencil_export
+ CONST_CAST(GLEW_AMD_shader_stencil_export) = glewGetExtension("GL_AMD_shader_stencil_export");
+#endif /* GL_AMD_shader_stencil_export */
+#ifdef GL_AMD_texture_texture4
+ CONST_CAST(GLEW_AMD_texture_texture4) = glewGetExtension("GL_AMD_texture_texture4");
+#endif /* GL_AMD_texture_texture4 */
+#ifdef GL_AMD_transform_feedback3_lines_triangles
+ CONST_CAST(GLEW_AMD_transform_feedback3_lines_triangles) = glewGetExtension("GL_AMD_transform_feedback3_lines_triangles");
+#endif /* GL_AMD_transform_feedback3_lines_triangles */
+#ifdef GL_AMD_vertex_shader_tessellator
+ CONST_CAST(GLEW_AMD_vertex_shader_tessellator) = glewGetExtension("GL_AMD_vertex_shader_tessellator");
+ if (glewExperimental || GLEW_AMD_vertex_shader_tessellator) CONST_CAST(GLEW_AMD_vertex_shader_tessellator) = !_glewInit_GL_AMD_vertex_shader_tessellator(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_AMD_vertex_shader_tessellator */
+#ifdef GL_APPLE_aux_depth_stencil
+ CONST_CAST(GLEW_APPLE_aux_depth_stencil) = glewGetExtension("GL_APPLE_aux_depth_stencil");
+#endif /* GL_APPLE_aux_depth_stencil */
#ifdef GL_APPLE_client_storage
CONST_CAST(GLEW_APPLE_client_storage) = glewGetExtension("GL_APPLE_client_storage");
#endif /* GL_APPLE_client_storage */
@@ -6277,9 +8119,19 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_APPLE_flush_buffer_range) = glewGetExtension("GL_APPLE_flush_buffer_range");
if (glewExperimental || GLEW_APPLE_flush_buffer_range) CONST_CAST(GLEW_APPLE_flush_buffer_range) = !_glewInit_GL_APPLE_flush_buffer_range(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_APPLE_flush_buffer_range */
+#ifdef GL_APPLE_object_purgeable
+ CONST_CAST(GLEW_APPLE_object_purgeable) = glewGetExtension("GL_APPLE_object_purgeable");
+ if (glewExperimental || GLEW_APPLE_object_purgeable) CONST_CAST(GLEW_APPLE_object_purgeable) = !_glewInit_GL_APPLE_object_purgeable(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_APPLE_object_purgeable */
#ifdef GL_APPLE_pixel_buffer
CONST_CAST(GLEW_APPLE_pixel_buffer) = glewGetExtension("GL_APPLE_pixel_buffer");
#endif /* GL_APPLE_pixel_buffer */
+#ifdef GL_APPLE_rgb_422
+ CONST_CAST(GLEW_APPLE_rgb_422) = glewGetExtension("GL_APPLE_rgb_422");
+#endif /* GL_APPLE_rgb_422 */
+#ifdef GL_APPLE_row_bytes
+ CONST_CAST(GLEW_APPLE_row_bytes) = glewGetExtension("GL_APPLE_row_bytes");
+#endif /* GL_APPLE_row_bytes */
#ifdef GL_APPLE_specular_vector
CONST_CAST(GLEW_APPLE_specular_vector) = glewGetExtension("GL_APPLE_specular_vector");
#endif /* GL_APPLE_specular_vector */
@@ -6298,16 +8150,46 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_APPLE_vertex_array_range) = glewGetExtension("GL_APPLE_vertex_array_range");
if (glewExperimental || GLEW_APPLE_vertex_array_range) CONST_CAST(GLEW_APPLE_vertex_array_range) = !_glewInit_GL_APPLE_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_APPLE_vertex_array_range */
+#ifdef GL_APPLE_vertex_program_evaluators
+ CONST_CAST(GLEW_APPLE_vertex_program_evaluators) = glewGetExtension("GL_APPLE_vertex_program_evaluators");
+ if (glewExperimental || GLEW_APPLE_vertex_program_evaluators) CONST_CAST(GLEW_APPLE_vertex_program_evaluators) = !_glewInit_GL_APPLE_vertex_program_evaluators(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_APPLE_vertex_program_evaluators */
#ifdef GL_APPLE_ycbcr_422
CONST_CAST(GLEW_APPLE_ycbcr_422) = glewGetExtension("GL_APPLE_ycbcr_422");
#endif /* GL_APPLE_ycbcr_422 */
+#ifdef GL_ARB_ES2_compatibility
+ CONST_CAST(GLEW_ARB_ES2_compatibility) = glewGetExtension("GL_ARB_ES2_compatibility");
+ if (glewExperimental || GLEW_ARB_ES2_compatibility) CONST_CAST(GLEW_ARB_ES2_compatibility) = !_glewInit_GL_ARB_ES2_compatibility(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_ES2_compatibility */
+#ifdef GL_ARB_blend_func_extended
+ CONST_CAST(GLEW_ARB_blend_func_extended) = glewGetExtension("GL_ARB_blend_func_extended");
+ if (glewExperimental || GLEW_ARB_blend_func_extended) CONST_CAST(GLEW_ARB_blend_func_extended) = !_glewInit_GL_ARB_blend_func_extended(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_blend_func_extended */
+#ifdef GL_ARB_cl_event
+ CONST_CAST(GLEW_ARB_cl_event) = glewGetExtension("GL_ARB_cl_event");
+ if (glewExperimental || GLEW_ARB_cl_event) CONST_CAST(GLEW_ARB_cl_event) = !_glewInit_GL_ARB_cl_event(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_cl_event */
#ifdef GL_ARB_color_buffer_float
CONST_CAST(GLEW_ARB_color_buffer_float) = glewGetExtension("GL_ARB_color_buffer_float");
if (glewExperimental || GLEW_ARB_color_buffer_float) CONST_CAST(GLEW_ARB_color_buffer_float) = !_glewInit_GL_ARB_color_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_color_buffer_float */
+#ifdef GL_ARB_compatibility
+ CONST_CAST(GLEW_ARB_compatibility) = glewGetExtension("GL_ARB_compatibility");
+#endif /* GL_ARB_compatibility */
+#ifdef GL_ARB_copy_buffer
+ CONST_CAST(GLEW_ARB_copy_buffer) = glewGetExtension("GL_ARB_copy_buffer");
+ if (glewExperimental || GLEW_ARB_copy_buffer) CONST_CAST(GLEW_ARB_copy_buffer) = !_glewInit_GL_ARB_copy_buffer(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_copy_buffer */
+#ifdef GL_ARB_debug_output
+ CONST_CAST(GLEW_ARB_debug_output) = glewGetExtension("GL_ARB_debug_output");
+ if (glewExperimental || GLEW_ARB_debug_output) CONST_CAST(GLEW_ARB_debug_output) = !_glewInit_GL_ARB_debug_output(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_debug_output */
#ifdef GL_ARB_depth_buffer_float
CONST_CAST(GLEW_ARB_depth_buffer_float) = glewGetExtension("GL_ARB_depth_buffer_float");
#endif /* GL_ARB_depth_buffer_float */
+#ifdef GL_ARB_depth_clamp
+ CONST_CAST(GLEW_ARB_depth_clamp) = glewGetExtension("GL_ARB_depth_clamp");
+#endif /* GL_ARB_depth_clamp */
#ifdef GL_ARB_depth_texture
CONST_CAST(GLEW_ARB_depth_texture) = glewGetExtension("GL_ARB_depth_texture");
#endif /* GL_ARB_depth_texture */
@@ -6315,10 +8197,28 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_ARB_draw_buffers) = glewGetExtension("GL_ARB_draw_buffers");
if (glewExperimental || GLEW_ARB_draw_buffers) CONST_CAST(GLEW_ARB_draw_buffers) = !_glewInit_GL_ARB_draw_buffers(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_draw_buffers */
+#ifdef GL_ARB_draw_buffers_blend
+ CONST_CAST(GLEW_ARB_draw_buffers_blend) = glewGetExtension("GL_ARB_draw_buffers_blend");
+ if (glewExperimental || GLEW_ARB_draw_buffers_blend) CONST_CAST(GLEW_ARB_draw_buffers_blend) = !_glewInit_GL_ARB_draw_buffers_blend(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_draw_buffers_blend */
+#ifdef GL_ARB_draw_elements_base_vertex
+ CONST_CAST(GLEW_ARB_draw_elements_base_vertex) = glewGetExtension("GL_ARB_draw_elements_base_vertex");
+ if (glewExperimental || GLEW_ARB_draw_elements_base_vertex) CONST_CAST(GLEW_ARB_draw_elements_base_vertex) = !_glewInit_GL_ARB_draw_elements_base_vertex(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_draw_elements_base_vertex */
+#ifdef GL_ARB_draw_indirect
+ CONST_CAST(GLEW_ARB_draw_indirect) = glewGetExtension("GL_ARB_draw_indirect");
+ if (glewExperimental || GLEW_ARB_draw_indirect) CONST_CAST(GLEW_ARB_draw_indirect) = !_glewInit_GL_ARB_draw_indirect(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_draw_indirect */
#ifdef GL_ARB_draw_instanced
CONST_CAST(GLEW_ARB_draw_instanced) = glewGetExtension("GL_ARB_draw_instanced");
if (glewExperimental || GLEW_ARB_draw_instanced) CONST_CAST(GLEW_ARB_draw_instanced) = !_glewInit_GL_ARB_draw_instanced(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_draw_instanced */
+#ifdef GL_ARB_explicit_attrib_location
+ CONST_CAST(GLEW_ARB_explicit_attrib_location) = glewGetExtension("GL_ARB_explicit_attrib_location");
+#endif /* GL_ARB_explicit_attrib_location */
+#ifdef GL_ARB_fragment_coord_conventions
+ CONST_CAST(GLEW_ARB_fragment_coord_conventions) = glewGetExtension("GL_ARB_fragment_coord_conventions");
+#endif /* GL_ARB_fragment_coord_conventions */
#ifdef GL_ARB_fragment_program
CONST_CAST(GLEW_ARB_fragment_program) = glewGetExtension("GL_ARB_fragment_program");
#endif /* GL_ARB_fragment_program */
@@ -6339,6 +8239,17 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_ARB_geometry_shader4) = glewGetExtension("GL_ARB_geometry_shader4");
if (glewExperimental || GLEW_ARB_geometry_shader4) CONST_CAST(GLEW_ARB_geometry_shader4) = !_glewInit_GL_ARB_geometry_shader4(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_geometry_shader4 */
+#ifdef GL_ARB_get_program_binary
+ CONST_CAST(GLEW_ARB_get_program_binary) = glewGetExtension("GL_ARB_get_program_binary");
+ if (glewExperimental || GLEW_ARB_get_program_binary) CONST_CAST(GLEW_ARB_get_program_binary) = !_glewInit_GL_ARB_get_program_binary(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_get_program_binary */
+#ifdef GL_ARB_gpu_shader5
+ CONST_CAST(GLEW_ARB_gpu_shader5) = glewGetExtension("GL_ARB_gpu_shader5");
+#endif /* GL_ARB_gpu_shader5 */
+#ifdef GL_ARB_gpu_shader_fp64
+ CONST_CAST(GLEW_ARB_gpu_shader_fp64) = glewGetExtension("GL_ARB_gpu_shader_fp64");
+ if (glewExperimental || GLEW_ARB_gpu_shader_fp64) CONST_CAST(GLEW_ARB_gpu_shader_fp64) = !_glewInit_GL_ARB_gpu_shader_fp64(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_gpu_shader_fp64 */
#ifdef GL_ARB_half_float_pixel
CONST_CAST(GLEW_ARB_half_float_pixel) = glewGetExtension("GL_ARB_half_float_pixel");
#endif /* GL_ARB_half_float_pixel */
@@ -6373,6 +8284,9 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_ARB_occlusion_query) = glewGetExtension("GL_ARB_occlusion_query");
if (glewExperimental || GLEW_ARB_occlusion_query) CONST_CAST(GLEW_ARB_occlusion_query) = !_glewInit_GL_ARB_occlusion_query(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_occlusion_query */
+#ifdef GL_ARB_occlusion_query2
+ CONST_CAST(GLEW_ARB_occlusion_query2) = glewGetExtension("GL_ARB_occlusion_query2");
+#endif /* GL_ARB_occlusion_query2 */
#ifdef GL_ARB_pixel_buffer_object
CONST_CAST(GLEW_ARB_pixel_buffer_object) = glewGetExtension("GL_ARB_pixel_buffer_object");
#endif /* GL_ARB_pixel_buffer_object */
@@ -6383,19 +8297,70 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
#ifdef GL_ARB_point_sprite
CONST_CAST(GLEW_ARB_point_sprite) = glewGetExtension("GL_ARB_point_sprite");
#endif /* GL_ARB_point_sprite */
+#ifdef GL_ARB_provoking_vertex
+ CONST_CAST(GLEW_ARB_provoking_vertex) = glewGetExtension("GL_ARB_provoking_vertex");
+ if (glewExperimental || GLEW_ARB_provoking_vertex) CONST_CAST(GLEW_ARB_provoking_vertex) = !_glewInit_GL_ARB_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_provoking_vertex */
+#ifdef GL_ARB_robustness
+ CONST_CAST(GLEW_ARB_robustness) = glewGetExtension("GL_ARB_robustness");
+ if (glewExperimental || GLEW_ARB_robustness) CONST_CAST(GLEW_ARB_robustness) = !_glewInit_GL_ARB_robustness(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_robustness */
+#ifdef GL_ARB_sample_shading
+ CONST_CAST(GLEW_ARB_sample_shading) = glewGetExtension("GL_ARB_sample_shading");
+ if (glewExperimental || GLEW_ARB_sample_shading) CONST_CAST(GLEW_ARB_sample_shading) = !_glewInit_GL_ARB_sample_shading(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_sample_shading */
+#ifdef GL_ARB_sampler_objects
+ CONST_CAST(GLEW_ARB_sampler_objects) = glewGetExtension("GL_ARB_sampler_objects");
+ if (glewExperimental || GLEW_ARB_sampler_objects) CONST_CAST(GLEW_ARB_sampler_objects) = !_glewInit_GL_ARB_sampler_objects(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_sampler_objects */
+#ifdef GL_ARB_seamless_cube_map
+ CONST_CAST(GLEW_ARB_seamless_cube_map) = glewGetExtension("GL_ARB_seamless_cube_map");
+#endif /* GL_ARB_seamless_cube_map */
+#ifdef GL_ARB_separate_shader_objects
+ CONST_CAST(GLEW_ARB_separate_shader_objects) = glewGetExtension("GL_ARB_separate_shader_objects");
+ if (glewExperimental || GLEW_ARB_separate_shader_objects) CONST_CAST(GLEW_ARB_separate_shader_objects) = !_glewInit_GL_ARB_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_separate_shader_objects */
+#ifdef GL_ARB_shader_bit_encoding
+ CONST_CAST(GLEW_ARB_shader_bit_encoding) = glewGetExtension("GL_ARB_shader_bit_encoding");
+#endif /* GL_ARB_shader_bit_encoding */
#ifdef GL_ARB_shader_objects
CONST_CAST(GLEW_ARB_shader_objects) = glewGetExtension("GL_ARB_shader_objects");
if (glewExperimental || GLEW_ARB_shader_objects) CONST_CAST(GLEW_ARB_shader_objects) = !_glewInit_GL_ARB_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_shader_objects */
+#ifdef GL_ARB_shader_precision
+ CONST_CAST(GLEW_ARB_shader_precision) = glewGetExtension("GL_ARB_shader_precision");
+#endif /* GL_ARB_shader_precision */
+#ifdef GL_ARB_shader_stencil_export
+ CONST_CAST(GLEW_ARB_shader_stencil_export) = glewGetExtension("GL_ARB_shader_stencil_export");
+#endif /* GL_ARB_shader_stencil_export */
+#ifdef GL_ARB_shader_subroutine
+ CONST_CAST(GLEW_ARB_shader_subroutine) = glewGetExtension("GL_ARB_shader_subroutine");
+ if (glewExperimental || GLEW_ARB_shader_subroutine) CONST_CAST(GLEW_ARB_shader_subroutine) = !_glewInit_GL_ARB_shader_subroutine(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_shader_subroutine */
+#ifdef GL_ARB_shader_texture_lod
+ CONST_CAST(GLEW_ARB_shader_texture_lod) = glewGetExtension("GL_ARB_shader_texture_lod");
+#endif /* GL_ARB_shader_texture_lod */
#ifdef GL_ARB_shading_language_100
CONST_CAST(GLEW_ARB_shading_language_100) = glewGetExtension("GL_ARB_shading_language_100");
#endif /* GL_ARB_shading_language_100 */
+#ifdef GL_ARB_shading_language_include
+ CONST_CAST(GLEW_ARB_shading_language_include) = glewGetExtension("GL_ARB_shading_language_include");
+ if (glewExperimental || GLEW_ARB_shading_language_include) CONST_CAST(GLEW_ARB_shading_language_include) = !_glewInit_GL_ARB_shading_language_include(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_shading_language_include */
#ifdef GL_ARB_shadow
CONST_CAST(GLEW_ARB_shadow) = glewGetExtension("GL_ARB_shadow");
#endif /* GL_ARB_shadow */
#ifdef GL_ARB_shadow_ambient
CONST_CAST(GLEW_ARB_shadow_ambient) = glewGetExtension("GL_ARB_shadow_ambient");
#endif /* GL_ARB_shadow_ambient */
+#ifdef GL_ARB_sync
+ CONST_CAST(GLEW_ARB_sync) = glewGetExtension("GL_ARB_sync");
+ if (glewExperimental || GLEW_ARB_sync) CONST_CAST(GLEW_ARB_sync) = !_glewInit_GL_ARB_sync(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_sync */
+#ifdef GL_ARB_tessellation_shader
+ CONST_CAST(GLEW_ARB_tessellation_shader) = glewGetExtension("GL_ARB_tessellation_shader");
+ if (glewExperimental || GLEW_ARB_tessellation_shader) CONST_CAST(GLEW_ARB_tessellation_shader) = !_glewInit_GL_ARB_tessellation_shader(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_tessellation_shader */
#ifdef GL_ARB_texture_border_clamp
CONST_CAST(GLEW_ARB_texture_border_clamp) = glewGetExtension("GL_ARB_texture_border_clamp");
#endif /* GL_ARB_texture_border_clamp */
@@ -6403,16 +8368,25 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_ARB_texture_buffer_object) = glewGetExtension("GL_ARB_texture_buffer_object");
if (glewExperimental || GLEW_ARB_texture_buffer_object) CONST_CAST(GLEW_ARB_texture_buffer_object) = !_glewInit_GL_ARB_texture_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_texture_buffer_object */
+#ifdef GL_ARB_texture_buffer_object_rgb32
+ CONST_CAST(GLEW_ARB_texture_buffer_object_rgb32) = glewGetExtension("GL_ARB_texture_buffer_object_rgb32");
+#endif /* GL_ARB_texture_buffer_object_rgb32 */
#ifdef GL_ARB_texture_compression
CONST_CAST(GLEW_ARB_texture_compression) = glewGetExtension("GL_ARB_texture_compression");
if (glewExperimental || GLEW_ARB_texture_compression) CONST_CAST(GLEW_ARB_texture_compression) = !_glewInit_GL_ARB_texture_compression(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_texture_compression */
+#ifdef GL_ARB_texture_compression_bptc
+ CONST_CAST(GLEW_ARB_texture_compression_bptc) = glewGetExtension("GL_ARB_texture_compression_bptc");
+#endif /* GL_ARB_texture_compression_bptc */
#ifdef GL_ARB_texture_compression_rgtc
CONST_CAST(GLEW_ARB_texture_compression_rgtc) = glewGetExtension("GL_ARB_texture_compression_rgtc");
#endif /* GL_ARB_texture_compression_rgtc */
#ifdef GL_ARB_texture_cube_map
CONST_CAST(GLEW_ARB_texture_cube_map) = glewGetExtension("GL_ARB_texture_cube_map");
#endif /* GL_ARB_texture_cube_map */
+#ifdef GL_ARB_texture_cube_map_array
+ CONST_CAST(GLEW_ARB_texture_cube_map_array) = glewGetExtension("GL_ARB_texture_cube_map_array");
+#endif /* GL_ARB_texture_cube_map_array */
#ifdef GL_ARB_texture_env_add
CONST_CAST(GLEW_ARB_texture_env_add) = glewGetExtension("GL_ARB_texture_env_add");
#endif /* GL_ARB_texture_env_add */
@@ -6428,26 +8402,65 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
#ifdef GL_ARB_texture_float
CONST_CAST(GLEW_ARB_texture_float) = glewGetExtension("GL_ARB_texture_float");
#endif /* GL_ARB_texture_float */
+#ifdef GL_ARB_texture_gather
+ CONST_CAST(GLEW_ARB_texture_gather) = glewGetExtension("GL_ARB_texture_gather");
+#endif /* GL_ARB_texture_gather */
#ifdef GL_ARB_texture_mirrored_repeat
CONST_CAST(GLEW_ARB_texture_mirrored_repeat) = glewGetExtension("GL_ARB_texture_mirrored_repeat");
#endif /* GL_ARB_texture_mirrored_repeat */
+#ifdef GL_ARB_texture_multisample
+ CONST_CAST(GLEW_ARB_texture_multisample) = glewGetExtension("GL_ARB_texture_multisample");
+ if (glewExperimental || GLEW_ARB_texture_multisample) CONST_CAST(GLEW_ARB_texture_multisample) = !_glewInit_GL_ARB_texture_multisample(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_texture_multisample */
#ifdef GL_ARB_texture_non_power_of_two
CONST_CAST(GLEW_ARB_texture_non_power_of_two) = glewGetExtension("GL_ARB_texture_non_power_of_two");
#endif /* GL_ARB_texture_non_power_of_two */
+#ifdef GL_ARB_texture_query_lod
+ CONST_CAST(GLEW_ARB_texture_query_lod) = glewGetExtension("GL_ARB_texture_query_lod");
+#endif /* GL_ARB_texture_query_lod */
#ifdef GL_ARB_texture_rectangle
CONST_CAST(GLEW_ARB_texture_rectangle) = glewGetExtension("GL_ARB_texture_rectangle");
#endif /* GL_ARB_texture_rectangle */
#ifdef GL_ARB_texture_rg
CONST_CAST(GLEW_ARB_texture_rg) = glewGetExtension("GL_ARB_texture_rg");
#endif /* GL_ARB_texture_rg */
+#ifdef GL_ARB_texture_rgb10_a2ui
+ CONST_CAST(GLEW_ARB_texture_rgb10_a2ui) = glewGetExtension("GL_ARB_texture_rgb10_a2ui");
+#endif /* GL_ARB_texture_rgb10_a2ui */
+#ifdef GL_ARB_texture_swizzle
+ CONST_CAST(GLEW_ARB_texture_swizzle) = glewGetExtension("GL_ARB_texture_swizzle");
+#endif /* GL_ARB_texture_swizzle */
+#ifdef GL_ARB_timer_query
+ CONST_CAST(GLEW_ARB_timer_query) = glewGetExtension("GL_ARB_timer_query");
+ if (glewExperimental || GLEW_ARB_timer_query) CONST_CAST(GLEW_ARB_timer_query) = !_glewInit_GL_ARB_timer_query(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_timer_query */
+#ifdef GL_ARB_transform_feedback2
+ CONST_CAST(GLEW_ARB_transform_feedback2) = glewGetExtension("GL_ARB_transform_feedback2");
+ if (glewExperimental || GLEW_ARB_transform_feedback2) CONST_CAST(GLEW_ARB_transform_feedback2) = !_glewInit_GL_ARB_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_transform_feedback2 */
+#ifdef GL_ARB_transform_feedback3
+ CONST_CAST(GLEW_ARB_transform_feedback3) = glewGetExtension("GL_ARB_transform_feedback3");
+ if (glewExperimental || GLEW_ARB_transform_feedback3) CONST_CAST(GLEW_ARB_transform_feedback3) = !_glewInit_GL_ARB_transform_feedback3(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_transform_feedback3 */
#ifdef GL_ARB_transpose_matrix
CONST_CAST(GLEW_ARB_transpose_matrix) = glewGetExtension("GL_ARB_transpose_matrix");
if (glewExperimental || GLEW_ARB_transpose_matrix) CONST_CAST(GLEW_ARB_transpose_matrix) = !_glewInit_GL_ARB_transpose_matrix(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_transpose_matrix */
+#ifdef GL_ARB_uniform_buffer_object
+ CONST_CAST(GLEW_ARB_uniform_buffer_object) = glewGetExtension("GL_ARB_uniform_buffer_object");
+ if (glewExperimental || GLEW_ARB_uniform_buffer_object) CONST_CAST(GLEW_ARB_uniform_buffer_object) = !_glewInit_GL_ARB_uniform_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_uniform_buffer_object */
+#ifdef GL_ARB_vertex_array_bgra
+ CONST_CAST(GLEW_ARB_vertex_array_bgra) = glewGetExtension("GL_ARB_vertex_array_bgra");
+#endif /* GL_ARB_vertex_array_bgra */
#ifdef GL_ARB_vertex_array_object
CONST_CAST(GLEW_ARB_vertex_array_object) = glewGetExtension("GL_ARB_vertex_array_object");
if (glewExperimental || GLEW_ARB_vertex_array_object) CONST_CAST(GLEW_ARB_vertex_array_object) = !_glewInit_GL_ARB_vertex_array_object(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_vertex_array_object */
+#ifdef GL_ARB_vertex_attrib_64bit
+ CONST_CAST(GLEW_ARB_vertex_attrib_64bit) = glewGetExtension("GL_ARB_vertex_attrib_64bit");
+ if (glewExperimental || GLEW_ARB_vertex_attrib_64bit) CONST_CAST(GLEW_ARB_vertex_attrib_64bit) = !_glewInit_GL_ARB_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_vertex_attrib_64bit */
#ifdef GL_ARB_vertex_blend
CONST_CAST(GLEW_ARB_vertex_blend) = glewGetExtension("GL_ARB_vertex_blend");
if (glewExperimental || GLEW_ARB_vertex_blend) CONST_CAST(GLEW_ARB_vertex_blend) = !_glewInit_GL_ARB_vertex_blend(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -6464,6 +8477,14 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_ARB_vertex_shader) = glewGetExtension("GL_ARB_vertex_shader");
if (glewExperimental || GLEW_ARB_vertex_shader) CONST_CAST(GLEW_ARB_vertex_shader) = !_glewInit_GL_ARB_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ARB_vertex_shader */
+#ifdef GL_ARB_vertex_type_2_10_10_10_rev
+ CONST_CAST(GLEW_ARB_vertex_type_2_10_10_10_rev) = glewGetExtension("GL_ARB_vertex_type_2_10_10_10_rev");
+ if (glewExperimental || GLEW_ARB_vertex_type_2_10_10_10_rev) CONST_CAST(GLEW_ARB_vertex_type_2_10_10_10_rev) = !_glewInit_GL_ARB_vertex_type_2_10_10_10_rev(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_vertex_type_2_10_10_10_rev */
+#ifdef GL_ARB_viewport_array
+ CONST_CAST(GLEW_ARB_viewport_array) = glewGetExtension("GL_ARB_viewport_array");
+ if (glewExperimental || GLEW_ARB_viewport_array) CONST_CAST(GLEW_ARB_viewport_array) = !_glewInit_GL_ARB_viewport_array(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_ARB_viewport_array */
#ifdef GL_ARB_window_pos
CONST_CAST(GLEW_ARB_window_pos) = glewGetExtension("GL_ARB_window_pos");
if (glewExperimental || GLEW_ARB_window_pos) CONST_CAST(GLEW_ARB_window_pos) = !_glewInit_GL_ARB_window_pos(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -6500,6 +8521,9 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_ATI_map_object_buffer) = glewGetExtension("GL_ATI_map_object_buffer");
if (glewExperimental || GLEW_ATI_map_object_buffer) CONST_CAST(GLEW_ATI_map_object_buffer) = !_glewInit_GL_ATI_map_object_buffer(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_ATI_map_object_buffer */
+#ifdef GL_ATI_meminfo
+ CONST_CAST(GLEW_ATI_meminfo) = glewGetExtension("GL_ATI_meminfo");
+#endif /* GL_ATI_meminfo */
#ifdef GL_ATI_pn_triangles
CONST_CAST(GLEW_ATI_pn_triangles) = glewGetExtension("GL_ATI_pn_triangles");
if (glewExperimental || GLEW_ATI_pn_triangles) CONST_CAST(GLEW_ATI_pn_triangles) = !_glewInit_GL_ATI_pn_triangles(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -6725,6 +8749,10 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_EXT_polygon_offset) = glewGetExtension("GL_EXT_polygon_offset");
if (glewExperimental || GLEW_EXT_polygon_offset) CONST_CAST(GLEW_EXT_polygon_offset) = !_glewInit_GL_EXT_polygon_offset(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_EXT_polygon_offset */
+#ifdef GL_EXT_provoking_vertex
+ CONST_CAST(GLEW_EXT_provoking_vertex) = glewGetExtension("GL_EXT_provoking_vertex");
+ if (glewExperimental || GLEW_EXT_provoking_vertex) CONST_CAST(GLEW_EXT_provoking_vertex) = !_glewInit_GL_EXT_provoking_vertex(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_EXT_provoking_vertex */
#ifdef GL_EXT_rescale_normal
CONST_CAST(GLEW_EXT_rescale_normal) = glewGetExtension("GL_EXT_rescale_normal");
#endif /* GL_EXT_rescale_normal */
@@ -6736,9 +8764,17 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_EXT_secondary_color) = glewGetExtension("GL_EXT_secondary_color");
if (glewExperimental || GLEW_EXT_secondary_color) CONST_CAST(GLEW_EXT_secondary_color) = !_glewInit_GL_EXT_secondary_color(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_EXT_secondary_color */
+#ifdef GL_EXT_separate_shader_objects
+ CONST_CAST(GLEW_EXT_separate_shader_objects) = glewGetExtension("GL_EXT_separate_shader_objects");
+ if (glewExperimental || GLEW_EXT_separate_shader_objects) CONST_CAST(GLEW_EXT_separate_shader_objects) = !_glewInit_GL_EXT_separate_shader_objects(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_EXT_separate_shader_objects */
#ifdef GL_EXT_separate_specular_color
CONST_CAST(GLEW_EXT_separate_specular_color) = glewGetExtension("GL_EXT_separate_specular_color");
#endif /* GL_EXT_separate_specular_color */
+#ifdef GL_EXT_shader_image_load_store
+ CONST_CAST(GLEW_EXT_shader_image_load_store) = glewGetExtension("GL_EXT_shader_image_load_store");
+ if (glewExperimental || GLEW_EXT_shader_image_load_store) CONST_CAST(GLEW_EXT_shader_image_load_store) = !_glewInit_GL_EXT_shader_image_load_store(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_EXT_shader_image_load_store */
#ifdef GL_EXT_shadow_funcs
CONST_CAST(GLEW_EXT_shadow_funcs) = glewGetExtension("GL_EXT_shadow_funcs");
#endif /* GL_EXT_shadow_funcs */
@@ -6830,9 +8866,15 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
#ifdef GL_EXT_texture_sRGB
CONST_CAST(GLEW_EXT_texture_sRGB) = glewGetExtension("GL_EXT_texture_sRGB");
#endif /* GL_EXT_texture_sRGB */
+#ifdef GL_EXT_texture_sRGB_decode
+ CONST_CAST(GLEW_EXT_texture_sRGB_decode) = glewGetExtension("GL_EXT_texture_sRGB_decode");
+#endif /* GL_EXT_texture_sRGB_decode */
#ifdef GL_EXT_texture_shared_exponent
CONST_CAST(GLEW_EXT_texture_shared_exponent) = glewGetExtension("GL_EXT_texture_shared_exponent");
#endif /* GL_EXT_texture_shared_exponent */
+#ifdef GL_EXT_texture_snorm
+ CONST_CAST(GLEW_EXT_texture_snorm) = glewGetExtension("GL_EXT_texture_snorm");
+#endif /* GL_EXT_texture_snorm */
#ifdef GL_EXT_texture_swizzle
CONST_CAST(GLEW_EXT_texture_swizzle) = glewGetExtension("GL_EXT_texture_swizzle");
#endif /* GL_EXT_texture_swizzle */
@@ -6851,6 +8893,10 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
#ifdef GL_EXT_vertex_array_bgra
CONST_CAST(GLEW_EXT_vertex_array_bgra) = glewGetExtension("GL_EXT_vertex_array_bgra");
#endif /* GL_EXT_vertex_array_bgra */
+#ifdef GL_EXT_vertex_attrib_64bit
+ CONST_CAST(GLEW_EXT_vertex_attrib_64bit) = glewGetExtension("GL_EXT_vertex_attrib_64bit");
+ if (glewExperimental || GLEW_EXT_vertex_attrib_64bit) CONST_CAST(GLEW_EXT_vertex_attrib_64bit) = !_glewInit_GL_EXT_vertex_attrib_64bit(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_EXT_vertex_attrib_64bit */
#ifdef GL_EXT_vertex_shader
CONST_CAST(GLEW_EXT_vertex_shader) = glewGetExtension("GL_EXT_vertex_shader");
if (glewExperimental || GLEW_EXT_vertex_shader) CONST_CAST(GLEW_EXT_vertex_shader) = !_glewInit_GL_EXT_vertex_shader(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -6935,6 +8981,9 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
#ifdef GL_MESA_ycbcr_texture
CONST_CAST(GLEW_MESA_ycbcr_texture) = glewGetExtension("GL_MESA_ycbcr_texture");
#endif /* GL_MESA_ycbcr_texture */
+#ifdef GL_NVX_gpu_memory_info
+ CONST_CAST(GLEW_NVX_gpu_memory_info) = glewGetExtension("GL_NVX_gpu_memory_info");
+#endif /* GL_NVX_gpu_memory_info */
#ifdef GL_NV_blend_square
CONST_CAST(GLEW_NV_blend_square) = glewGetExtension("GL_NV_blend_square");
#endif /* GL_NV_blend_square */
@@ -6945,6 +8994,10 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
#ifdef GL_NV_copy_depth_to_color
CONST_CAST(GLEW_NV_copy_depth_to_color) = glewGetExtension("GL_NV_copy_depth_to_color");
#endif /* GL_NV_copy_depth_to_color */
+#ifdef GL_NV_copy_image
+ CONST_CAST(GLEW_NV_copy_image) = glewGetExtension("GL_NV_copy_image");
+ if (glewExperimental || GLEW_NV_copy_image) CONST_CAST(GLEW_NV_copy_image) = !_glewInit_GL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_NV_copy_image */
#ifdef GL_NV_depth_buffer_float
CONST_CAST(GLEW_NV_depth_buffer_float) = glewGetExtension("GL_NV_depth_buffer_float");
if (glewExperimental || GLEW_NV_depth_buffer_float) CONST_CAST(GLEW_NV_depth_buffer_float) = !_glewInit_GL_NV_depth_buffer_float(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -6981,7 +9034,7 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_NV_fragment_program2) = glewGetExtension("GL_NV_fragment_program2");
#endif /* GL_NV_fragment_program2 */
#ifdef GL_NV_fragment_program4
- CONST_CAST(GLEW_NV_fragment_program4) = glewGetExtension("GL_NV_fragment_program4");
+ CONST_CAST(GLEW_NV_fragment_program4) = glewGetExtension("GL_NV_gpu_program4");
#endif /* GL_NV_fragment_program4 */
#ifdef GL_NV_fragment_program_option
CONST_CAST(GLEW_NV_fragment_program_option) = glewGetExtension("GL_NV_fragment_program_option");
@@ -6991,7 +9044,7 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
if (glewExperimental || GLEW_NV_framebuffer_multisample_coverage) CONST_CAST(GLEW_NV_framebuffer_multisample_coverage) = !_glewInit_GL_NV_framebuffer_multisample_coverage(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_NV_framebuffer_multisample_coverage */
#ifdef GL_NV_geometry_program4
- CONST_CAST(GLEW_NV_geometry_program4) = glewGetExtension("GL_NV_geometry_program4");
+ CONST_CAST(GLEW_NV_geometry_program4) = glewGetExtension("GL_NV_gpu_program4");
if (glewExperimental || GLEW_NV_geometry_program4) CONST_CAST(GLEW_NV_geometry_program4) = !_glewInit_GL_NV_geometry_program4(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_NV_geometry_program4 */
#ifdef GL_NV_geometry_shader4
@@ -7001,6 +9054,16 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_NV_gpu_program4) = glewGetExtension("GL_NV_gpu_program4");
if (glewExperimental || GLEW_NV_gpu_program4) CONST_CAST(GLEW_NV_gpu_program4) = !_glewInit_GL_NV_gpu_program4(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_NV_gpu_program4 */
+#ifdef GL_NV_gpu_program5
+ CONST_CAST(GLEW_NV_gpu_program5) = glewGetExtension("GL_NV_gpu_program5");
+#endif /* GL_NV_gpu_program5 */
+#ifdef GL_NV_gpu_program_fp64
+ CONST_CAST(GLEW_NV_gpu_program_fp64) = glewGetExtension("GL_NV_gpu_program_fp64");
+#endif /* GL_NV_gpu_program_fp64 */
+#ifdef GL_NV_gpu_shader5
+ CONST_CAST(GLEW_NV_gpu_shader5) = glewGetExtension("GL_NV_gpu_shader5");
+ if (glewExperimental || GLEW_NV_gpu_shader5) CONST_CAST(GLEW_NV_gpu_shader5) = !_glewInit_GL_NV_gpu_shader5(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_NV_gpu_shader5 */
#ifdef GL_NV_half_float
CONST_CAST(GLEW_NV_half_float) = glewGetExtension("GL_NV_half_float");
if (glewExperimental || GLEW_NV_half_float) CONST_CAST(GLEW_NV_half_float) = !_glewInit_GL_NV_half_float(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -7008,6 +9071,9 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
#ifdef GL_NV_light_max_exponent
CONST_CAST(GLEW_NV_light_max_exponent) = glewGetExtension("GL_NV_light_max_exponent");
#endif /* GL_NV_light_max_exponent */
+#ifdef GL_NV_multisample_coverage
+ CONST_CAST(GLEW_NV_multisample_coverage) = glewGetExtension("GL_NV_multisample_coverage");
+#endif /* GL_NV_multisample_coverage */
#ifdef GL_NV_multisample_filter_hint
CONST_CAST(GLEW_NV_multisample_filter_hint) = glewGetExtension("GL_NV_multisample_filter_hint");
#endif /* GL_NV_multisample_filter_hint */
@@ -7022,6 +9088,9 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_NV_parameter_buffer_object) = glewGetExtension("GL_NV_parameter_buffer_object");
if (glewExperimental || GLEW_NV_parameter_buffer_object) CONST_CAST(GLEW_NV_parameter_buffer_object) = !_glewInit_GL_NV_parameter_buffer_object(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_NV_parameter_buffer_object */
+#ifdef GL_NV_parameter_buffer_object2
+ CONST_CAST(GLEW_NV_parameter_buffer_object2) = glewGetExtension("GL_NV_parameter_buffer_object2");
+#endif /* GL_NV_parameter_buffer_object2 */
#ifdef GL_NV_pixel_data_range
CONST_CAST(GLEW_NV_pixel_data_range) = glewGetExtension("GL_NV_pixel_data_range");
if (glewExperimental || GLEW_NV_pixel_data_range) CONST_CAST(GLEW_NV_pixel_data_range) = !_glewInit_GL_NV_pixel_data_range(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -7046,12 +9115,23 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_NV_register_combiners2) = glewGetExtension("GL_NV_register_combiners2");
if (glewExperimental || GLEW_NV_register_combiners2) CONST_CAST(GLEW_NV_register_combiners2) = !_glewInit_GL_NV_register_combiners2(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_NV_register_combiners2 */
+#ifdef GL_NV_shader_buffer_load
+ CONST_CAST(GLEW_NV_shader_buffer_load) = glewGetExtension("GL_NV_shader_buffer_load");
+ if (glewExperimental || GLEW_NV_shader_buffer_load) CONST_CAST(GLEW_NV_shader_buffer_load) = !_glewInit_GL_NV_shader_buffer_load(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_NV_shader_buffer_load */
+#ifdef GL_NV_tessellation_program5
+ CONST_CAST(GLEW_NV_tessellation_program5) = glewGetExtension("GL_NV_gpu_program5");
+#endif /* GL_NV_tessellation_program5 */
#ifdef GL_NV_texgen_emboss
CONST_CAST(GLEW_NV_texgen_emboss) = glewGetExtension("GL_NV_texgen_emboss");
#endif /* GL_NV_texgen_emboss */
#ifdef GL_NV_texgen_reflection
CONST_CAST(GLEW_NV_texgen_reflection) = glewGetExtension("GL_NV_texgen_reflection");
#endif /* GL_NV_texgen_reflection */
+#ifdef GL_NV_texture_barrier
+ CONST_CAST(GLEW_NV_texture_barrier) = glewGetExtension("GL_NV_texture_barrier");
+ if (glewExperimental || GLEW_NV_texture_barrier) CONST_CAST(GLEW_NV_texture_barrier) = !_glewInit_GL_NV_texture_barrier(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_NV_texture_barrier */
#ifdef GL_NV_texture_compression_vtc
CONST_CAST(GLEW_NV_texture_compression_vtc) = glewGetExtension("GL_NV_texture_compression_vtc");
#endif /* GL_NV_texture_compression_vtc */
@@ -7077,6 +9157,14 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_NV_transform_feedback) = glewGetExtension("GL_NV_transform_feedback");
if (glewExperimental || GLEW_NV_transform_feedback) CONST_CAST(GLEW_NV_transform_feedback) = !_glewInit_GL_NV_transform_feedback(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GL_NV_transform_feedback */
+#ifdef GL_NV_transform_feedback2
+ CONST_CAST(GLEW_NV_transform_feedback2) = glewGetExtension("GL_NV_transform_feedback2");
+ if (glewExperimental || GLEW_NV_transform_feedback2) CONST_CAST(GLEW_NV_transform_feedback2) = !_glewInit_GL_NV_transform_feedback2(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_NV_transform_feedback2 */
+#ifdef GL_NV_vdpau_interop
+ CONST_CAST(GLEW_NV_vdpau_interop) = glewGetExtension("GL_NV_vdpau_interop");
+ if (glewExperimental || GLEW_NV_vdpau_interop) CONST_CAST(GLEW_NV_vdpau_interop) = !_glewInit_GL_NV_vdpau_interop(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_NV_vdpau_interop */
#ifdef GL_NV_vertex_array_range
CONST_CAST(GLEW_NV_vertex_array_range) = glewGetExtension("GL_NV_vertex_array_range");
if (glewExperimental || GLEW_NV_vertex_array_range) CONST_CAST(GLEW_NV_vertex_array_range) = !_glewInit_GL_NV_vertex_array_range(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -7084,6 +9172,14 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
#ifdef GL_NV_vertex_array_range2
CONST_CAST(GLEW_NV_vertex_array_range2) = glewGetExtension("GL_NV_vertex_array_range2");
#endif /* GL_NV_vertex_array_range2 */
+#ifdef GL_NV_vertex_attrib_integer_64bit
+ CONST_CAST(GLEW_NV_vertex_attrib_integer_64bit) = glewGetExtension("GL_NV_vertex_attrib_integer_64bit");
+ if (glewExperimental || GLEW_NV_vertex_attrib_integer_64bit) CONST_CAST(GLEW_NV_vertex_attrib_integer_64bit) = !_glewInit_GL_NV_vertex_attrib_integer_64bit(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_NV_vertex_attrib_integer_64bit */
+#ifdef GL_NV_vertex_buffer_unified_memory
+ CONST_CAST(GLEW_NV_vertex_buffer_unified_memory) = glewGetExtension("GL_NV_vertex_buffer_unified_memory");
+ if (glewExperimental || GLEW_NV_vertex_buffer_unified_memory) CONST_CAST(GLEW_NV_vertex_buffer_unified_memory) = !_glewInit_GL_NV_vertex_buffer_unified_memory(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GL_NV_vertex_buffer_unified_memory */
#ifdef GL_NV_vertex_program
CONST_CAST(GLEW_NV_vertex_program) = glewGetExtension("GL_NV_vertex_program");
if (glewExperimental || GLEW_NV_vertex_program) CONST_CAST(GLEW_NV_vertex_program) = !_glewInit_GL_NV_vertex_program(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -7101,7 +9197,7 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLEW_NV_vertex_program3) = glewGetExtension("GL_NV_vertex_program3");
#endif /* GL_NV_vertex_program3 */
#ifdef GL_NV_vertex_program4
- CONST_CAST(GLEW_NV_vertex_program4) = glewGetExtension("GL_NV_vertex_program4");
+ CONST_CAST(GLEW_NV_vertex_program4) = glewGetExtension("GL_NV_gpu_program4");
#endif /* GL_NV_vertex_program4 */
#ifdef GL_OES_byte_coordinates
CONST_CAST(GLEW_OES_byte_coordinates) = glewGetExtension("GL_OES_byte_coordinates");
@@ -7350,6 +9446,16 @@ GLenum glewContextInit (GLEW_CONTEXT_ARG_DEF_LIST)
PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL = NULL;
+PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD = NULL;
+PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD = NULL;
+PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD = NULL;
+PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD = NULL;
+PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD = NULL;
+PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD = NULL;
+PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD = NULL;
+//XXX-blender, added: PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD = NULL;
+PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD = NULL;
+
PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB = NULL;
PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB = NULL;
PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB = NULL;
@@ -7435,6 +9541,8 @@ PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D = NULL;
PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D = NULL;
PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D = NULL;
+PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV = NULL;
+
PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV = NULL;
PFNWGLDELETEDCNVPROC __wglewDeleteDCNV = NULL;
PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV = NULL;
@@ -7470,8 +9578,11 @@ PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML = NULL;
PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML = NULL;
GLboolean __WGLEW_3DFX_multisample = GL_FALSE;
GLboolean __WGLEW_3DL_stereo_control = GL_FALSE;
+GLboolean __WGLEW_AMD_gpu_association = GL_FALSE;
GLboolean __WGLEW_ARB_buffer_region = GL_FALSE;
GLboolean __WGLEW_ARB_create_context = GL_FALSE;
+GLboolean __WGLEW_ARB_create_context_profile = GL_FALSE;
+GLboolean __WGLEW_ARB_create_context_robustness = GL_FALSE;
GLboolean __WGLEW_ARB_extensions_string = GL_FALSE;
GLboolean __WGLEW_ARB_framebuffer_sRGB = GL_FALSE;
GLboolean __WGLEW_ARB_make_current_read = GL_FALSE;
@@ -7482,6 +9593,7 @@ GLboolean __WGLEW_ARB_pixel_format_float = GL_FALSE;
GLboolean __WGLEW_ARB_render_texture = GL_FALSE;
GLboolean __WGLEW_ATI_pixel_format_float = GL_FALSE;
GLboolean __WGLEW_ATI_render_texture_rectangle = GL_FALSE;
+GLboolean __WGLEW_EXT_create_context_es2_profile = GL_FALSE;
GLboolean __WGLEW_EXT_depth_float = GL_FALSE;
GLboolean __WGLEW_EXT_display_color_table = GL_FALSE;
GLboolean __WGLEW_EXT_extensions_string = GL_FALSE;
@@ -7498,8 +9610,10 @@ GLboolean __WGLEW_I3D_genlock = GL_FALSE;
GLboolean __WGLEW_I3D_image_buffer = GL_FALSE;
GLboolean __WGLEW_I3D_swap_frame_lock = GL_FALSE;
GLboolean __WGLEW_I3D_swap_frame_usage = GL_FALSE;
+GLboolean __WGLEW_NV_copy_image = GL_FALSE;
GLboolean __WGLEW_NV_float_buffer = GL_FALSE;
GLboolean __WGLEW_NV_gpu_affinity = GL_FALSE;
+GLboolean __WGLEW_NV_multisample_coverage = GL_FALSE;
GLboolean __WGLEW_NV_present_video = GL_FALSE;
GLboolean __WGLEW_NV_render_depth_texture = GL_FALSE;
GLboolean __WGLEW_NV_render_texture_rectangle = GL_FALSE;
@@ -7527,6 +9641,27 @@ static GLboolean _glewInit_WGL_3DL_stereo_control (WGLEW_CONTEXT_ARG_DEF_INIT)
#endif /* WGL_3DL_stereo_control */
+#ifdef WGL_AMD_gpu_association
+
+static GLboolean _glewInit_WGL_AMD_gpu_association (WGLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)glewGetProcAddress((const GLubyte*)"wglBlitContextFramebufferAMD")) == NULL) || r;
+ r = ((wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAMD")) == NULL) || r;
+ r = ((wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)glewGetProcAddress((const GLubyte*)"wglCreateAssociatedContextAttribsAMD")) == NULL) || r;
+ r = ((wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglDeleteAssociatedContextAMD")) == NULL) || r;
+ r = ((wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetContextGPUIDAMD")) == NULL) || r;
+ r = ((wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetCurrentAssociatedContextAMD")) == NULL) || r;
+ r = ((wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUIDsAMD")) == NULL) || r;
+//XXX-blender, added: r = ((wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)glewGetProcAddress((const GLubyte*)"wglGetGPUInfoAMD")) == NULL) || r;
+ r = ((wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)glewGetProcAddress((const GLubyte*)"wglMakeAssociatedContextCurrentAMD")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* WGL_AMD_gpu_association */
+
#ifdef WGL_ARB_buffer_region
static GLboolean _glewInit_WGL_ARB_buffer_region (WGLEW_CONTEXT_ARG_DEF_INIT)
@@ -7556,6 +9691,14 @@ static GLboolean _glewInit_WGL_ARB_create_context (WGLEW_CONTEXT_ARG_DEF_INIT)
#endif /* WGL_ARB_create_context */
+#ifdef WGL_ARB_create_context_profile
+
+#endif /* WGL_ARB_create_context_profile */
+
+#ifdef WGL_ARB_create_context_robustness
+
+#endif /* WGL_ARB_create_context_robustness */
+
#ifdef WGL_ARB_extensions_string
static GLboolean _glewInit_WGL_ARB_extensions_string (WGLEW_CONTEXT_ARG_DEF_INIT)
@@ -7650,6 +9793,10 @@ static GLboolean _glewInit_WGL_ARB_render_texture (WGLEW_CONTEXT_ARG_DEF_INIT)
#endif /* WGL_ATI_render_texture_rectangle */
+#ifdef WGL_EXT_create_context_es2_profile
+
+#endif /* WGL_EXT_create_context_es2_profile */
+
#ifdef WGL_EXT_depth_float
#endif /* WGL_EXT_depth_float */
@@ -7857,6 +10004,19 @@ static GLboolean _glewInit_WGL_I3D_swap_frame_usage (WGLEW_CONTEXT_ARG_DEF_INIT)
#endif /* WGL_I3D_swap_frame_usage */
+#ifdef WGL_NV_copy_image
+
+static GLboolean _glewInit_WGL_NV_copy_image (WGLEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"wglCopyImageSubDataNV")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* WGL_NV_copy_image */
+
#ifdef WGL_NV_float_buffer
#endif /* WGL_NV_float_buffer */
@@ -7878,6 +10038,10 @@ static GLboolean _glewInit_WGL_NV_gpu_affinity (WGLEW_CONTEXT_ARG_DEF_INIT)
#endif /* WGL_NV_gpu_affinity */
+#ifdef WGL_NV_multisample_coverage
+
+#endif /* WGL_NV_multisample_coverage */
+
#ifdef WGL_NV_present_video
static GLboolean _glewInit_WGL_NV_present_video (WGLEW_CONTEXT_ARG_DEF_INIT)
@@ -8012,6 +10176,10 @@ GLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(WGLEW_3DL_stereo_control) = wglewGetExtension("WGL_3DL_stereo_control");
if (glewExperimental || WGLEW_3DL_stereo_control|| crippled) CONST_CAST(WGLEW_3DL_stereo_control)= !_glewInit_WGL_3DL_stereo_control(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* WGL_3DL_stereo_control */
+#ifdef WGL_AMD_gpu_association
+ CONST_CAST(WGLEW_AMD_gpu_association) = wglewGetExtension("WGL_AMD_gpu_association");
+ if (glewExperimental || WGLEW_AMD_gpu_association|| crippled) CONST_CAST(WGLEW_AMD_gpu_association)= !_glewInit_WGL_AMD_gpu_association(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* WGL_AMD_gpu_association */
#ifdef WGL_ARB_buffer_region
CONST_CAST(WGLEW_ARB_buffer_region) = wglewGetExtension("WGL_ARB_buffer_region");
if (glewExperimental || WGLEW_ARB_buffer_region|| crippled) CONST_CAST(WGLEW_ARB_buffer_region)= !_glewInit_WGL_ARB_buffer_region(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -8020,6 +10188,12 @@ GLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(WGLEW_ARB_create_context) = wglewGetExtension("WGL_ARB_create_context");
if (glewExperimental || WGLEW_ARB_create_context|| crippled) CONST_CAST(WGLEW_ARB_create_context)= !_glewInit_WGL_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* WGL_ARB_create_context */
+#ifdef WGL_ARB_create_context_profile
+ CONST_CAST(WGLEW_ARB_create_context_profile) = wglewGetExtension("WGL_ARB_create_context_profile");
+#endif /* WGL_ARB_create_context_profile */
+#ifdef WGL_ARB_create_context_robustness
+ CONST_CAST(WGLEW_ARB_create_context_robustness) = wglewGetExtension("WGL_ARB_create_context_robustness");
+#endif /* WGL_ARB_create_context_robustness */
#ifdef WGL_ARB_extensions_string
CONST_CAST(WGLEW_ARB_extensions_string) = wglewGetExtension("WGL_ARB_extensions_string");
if (glewExperimental || WGLEW_ARB_extensions_string|| crippled) CONST_CAST(WGLEW_ARB_extensions_string)= !_glewInit_WGL_ARB_extensions_string(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -8055,6 +10229,9 @@ GLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)
#ifdef WGL_ATI_render_texture_rectangle
CONST_CAST(WGLEW_ATI_render_texture_rectangle) = wglewGetExtension("WGL_ATI_render_texture_rectangle");
#endif /* WGL_ATI_render_texture_rectangle */
+#ifdef WGL_EXT_create_context_es2_profile
+ CONST_CAST(WGLEW_EXT_create_context_es2_profile) = wglewGetExtension("WGL_EXT_create_context_es2_profile");
+#endif /* WGL_EXT_create_context_es2_profile */
#ifdef WGL_EXT_depth_float
CONST_CAST(WGLEW_EXT_depth_float) = wglewGetExtension("WGL_EXT_depth_float");
#endif /* WGL_EXT_depth_float */
@@ -8115,6 +10292,10 @@ GLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(WGLEW_I3D_swap_frame_usage) = wglewGetExtension("WGL_I3D_swap_frame_usage");
if (glewExperimental || WGLEW_I3D_swap_frame_usage|| crippled) CONST_CAST(WGLEW_I3D_swap_frame_usage)= !_glewInit_WGL_I3D_swap_frame_usage(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* WGL_I3D_swap_frame_usage */
+#ifdef WGL_NV_copy_image
+ CONST_CAST(WGLEW_NV_copy_image) = wglewGetExtension("WGL_NV_copy_image");
+ if (glewExperimental || WGLEW_NV_copy_image|| crippled) CONST_CAST(WGLEW_NV_copy_image)= !_glewInit_WGL_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* WGL_NV_copy_image */
#ifdef WGL_NV_float_buffer
CONST_CAST(WGLEW_NV_float_buffer) = wglewGetExtension("WGL_NV_float_buffer");
#endif /* WGL_NV_float_buffer */
@@ -8122,6 +10303,9 @@ GLenum wglewContextInit (WGLEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(WGLEW_NV_gpu_affinity) = wglewGetExtension("WGL_NV_gpu_affinity");
if (glewExperimental || WGLEW_NV_gpu_affinity|| crippled) CONST_CAST(WGLEW_NV_gpu_affinity)= !_glewInit_WGL_NV_gpu_affinity(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* WGL_NV_gpu_affinity */
+#ifdef WGL_NV_multisample_coverage
+ CONST_CAST(WGLEW_NV_multisample_coverage) = wglewGetExtension("WGL_NV_multisample_coverage");
+#endif /* WGL_NV_multisample_coverage */
#ifdef WGL_NV_present_video
CONST_CAST(WGLEW_NV_present_video) = wglewGetExtension("WGL_NV_present_video");
if (glewExperimental || WGLEW_NV_present_video|| crippled) CONST_CAST(WGLEW_NV_present_video)= !_glewInit_WGL_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -8185,6 +10369,8 @@ PFNGLXGETCONTEXTIDEXTPROC __glewXGetContextIDEXT = NULL;
PFNGLXIMPORTCONTEXTEXTPROC __glewXImportContextEXT = NULL;
PFNGLXQUERYCONTEXTINFOEXTPROC __glewXQueryContextInfoEXT = NULL;
+PFNGLXSWAPINTERVALEXTPROC __glewXSwapIntervalEXT = NULL;
+
PFNGLXBINDTEXIMAGEEXTPROC __glewXBindTexImageEXT = NULL;
PFNGLXRELEASETEXIMAGEEXTPROC __glewXReleaseTexImageEXT = NULL;
@@ -8198,6 +10384,8 @@ PFNGLXRELEASEBUFFERSMESAPROC __glewXReleaseBuffersMESA = NULL;
PFNGLXSET3DFXMODEMESAPROC __glewXSet3DfxModeMESA = NULL;
+PFNGLXCOPYIMAGESUBDATANVPROC __glewXCopyImageSubDataNV = NULL;
+
PFNGLXBINDVIDEODEVICENVPROC __glewXBindVideoDeviceNV = NULL;
PFNGLXENUMERATEVIDEODEVICESNVPROC __glewXEnumerateVideoDevicesNV = NULL;
@@ -8282,26 +10470,35 @@ GLboolean __GLXEW_VERSION_1_2 = GL_FALSE;
GLboolean __GLXEW_VERSION_1_3 = GL_FALSE;
GLboolean __GLXEW_VERSION_1_4 = GL_FALSE;
GLboolean __GLXEW_3DFX_multisample = GL_FALSE;
+GLboolean __GLXEW_AMD_gpu_association = GL_FALSE;
GLboolean __GLXEW_ARB_create_context = GL_FALSE;
+GLboolean __GLXEW_ARB_create_context_profile = GL_FALSE;
+GLboolean __GLXEW_ARB_create_context_robustness = GL_FALSE;
GLboolean __GLXEW_ARB_fbconfig_float = GL_FALSE;
GLboolean __GLXEW_ARB_framebuffer_sRGB = GL_FALSE;
GLboolean __GLXEW_ARB_get_proc_address = GL_FALSE;
GLboolean __GLXEW_ARB_multisample = GL_FALSE;
+GLboolean __GLXEW_ARB_vertex_buffer_object = GL_FALSE;
GLboolean __GLXEW_ATI_pixel_format_float = GL_FALSE;
GLboolean __GLXEW_ATI_render_texture = GL_FALSE;
+GLboolean __GLXEW_EXT_create_context_es2_profile = GL_FALSE;
GLboolean __GLXEW_EXT_fbconfig_packed_float = GL_FALSE;
GLboolean __GLXEW_EXT_framebuffer_sRGB = GL_FALSE;
GLboolean __GLXEW_EXT_import_context = GL_FALSE;
GLboolean __GLXEW_EXT_scene_marker = GL_FALSE;
+GLboolean __GLXEW_EXT_swap_control = GL_FALSE;
GLboolean __GLXEW_EXT_texture_from_pixmap = GL_FALSE;
GLboolean __GLXEW_EXT_visual_info = GL_FALSE;
GLboolean __GLXEW_EXT_visual_rating = GL_FALSE;
+GLboolean __GLXEW_INTEL_swap_event = GL_FALSE;
GLboolean __GLXEW_MESA_agp_offset = GL_FALSE;
GLboolean __GLXEW_MESA_copy_sub_buffer = GL_FALSE;
GLboolean __GLXEW_MESA_pixmap_colormap = GL_FALSE;
GLboolean __GLXEW_MESA_release_buffers = GL_FALSE;
GLboolean __GLXEW_MESA_set_3dfx_mode = GL_FALSE;
+GLboolean __GLXEW_NV_copy_image = GL_FALSE;
GLboolean __GLXEW_NV_float_buffer = GL_FALSE;
+GLboolean __GLXEW_NV_multisample_coverage = GL_FALSE;
GLboolean __GLXEW_NV_present_video = GL_FALSE;
GLboolean __GLXEW_NV_swap_group = GL_FALSE;
GLboolean __GLXEW_NV_vertex_array_range = GL_FALSE;
@@ -8380,6 +10577,10 @@ static GLboolean _glewInit_GLX_VERSION_1_3 (GLXEW_CONTEXT_ARG_DEF_INIT)
#endif /* GLX_3DFX_multisample */
+#ifdef GLX_AMD_gpu_association
+
+#endif /* GLX_AMD_gpu_association */
+
#ifdef GLX_ARB_create_context
static GLboolean _glewInit_GLX_ARB_create_context (GLXEW_CONTEXT_ARG_DEF_INIT)
@@ -8393,6 +10594,14 @@ static GLboolean _glewInit_GLX_ARB_create_context (GLXEW_CONTEXT_ARG_DEF_INIT)
#endif /* GLX_ARB_create_context */
+#ifdef GLX_ARB_create_context_profile
+
+#endif /* GLX_ARB_create_context_profile */
+
+#ifdef GLX_ARB_create_context_robustness
+
+#endif /* GLX_ARB_create_context_robustness */
+
#ifdef GLX_ARB_fbconfig_float
#endif /* GLX_ARB_fbconfig_float */
@@ -8409,6 +10618,10 @@ static GLboolean _glewInit_GLX_ARB_create_context (GLXEW_CONTEXT_ARG_DEF_INIT)
#endif /* GLX_ARB_multisample */
+#ifdef GLX_ARB_vertex_buffer_object
+
+#endif /* GLX_ARB_vertex_buffer_object */
+
#ifdef GLX_ATI_pixel_format_float
#endif /* GLX_ATI_pixel_format_float */
@@ -8428,6 +10641,10 @@ static GLboolean _glewInit_GLX_ATI_render_texture (GLXEW_CONTEXT_ARG_DEF_INIT)
#endif /* GLX_ATI_render_texture */
+#ifdef GLX_EXT_create_context_es2_profile
+
+#endif /* GLX_EXT_create_context_es2_profile */
+
#ifdef GLX_EXT_fbconfig_packed_float
#endif /* GLX_EXT_fbconfig_packed_float */
@@ -8456,6 +10673,19 @@ static GLboolean _glewInit_GLX_EXT_import_context (GLXEW_CONTEXT_ARG_DEF_INIT)
#endif /* GLX_EXT_scene_marker */
+#ifdef GLX_EXT_swap_control
+
+static GLboolean _glewInit_GLX_EXT_swap_control (GLXEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)glewGetProcAddress((const GLubyte*)"glXSwapIntervalEXT")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GLX_EXT_swap_control */
+
#ifdef GLX_EXT_texture_from_pixmap
static GLboolean _glewInit_GLX_EXT_texture_from_pixmap (GLXEW_CONTEXT_ARG_DEF_INIT)
@@ -8478,6 +10708,10 @@ static GLboolean _glewInit_GLX_EXT_texture_from_pixmap (GLXEW_CONTEXT_ARG_DEF_IN
#endif /* GLX_EXT_visual_rating */
+#ifdef GLX_INTEL_swap_event
+
+#endif /* GLX_INTEL_swap_event */
+
#ifdef GLX_MESA_agp_offset
static GLboolean _glewInit_GLX_MESA_agp_offset (GLXEW_CONTEXT_ARG_DEF_INIT)
@@ -8543,10 +10777,27 @@ static GLboolean _glewInit_GLX_MESA_set_3dfx_mode (GLXEW_CONTEXT_ARG_DEF_INIT)
#endif /* GLX_MESA_set_3dfx_mode */
+#ifdef GLX_NV_copy_image
+
+static GLboolean _glewInit_GLX_NV_copy_image (GLXEW_CONTEXT_ARG_DEF_INIT)
+{
+ GLboolean r = GL_FALSE;
+
+ r = ((glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)glewGetProcAddress((const GLubyte*)"glXCopyImageSubDataNV")) == NULL) || r;
+
+ return r;
+}
+
+#endif /* GLX_NV_copy_image */
+
#ifdef GLX_NV_float_buffer
#endif /* GLX_NV_float_buffer */
+#ifdef GLX_NV_multisample_coverage
+
+#endif /* GLX_NV_multisample_coverage */
+
#ifdef GLX_NV_present_video
static GLboolean _glewInit_GLX_NV_present_video (GLXEW_CONTEXT_ARG_DEF_INIT)
@@ -8839,10 +11090,10 @@ GLboolean glxewGetExtension (const char* name)
{
GLubyte* p;
GLubyte* end;
- GLuint len = _glewStrLen((const GLubyte*)name);
-/* if (glXQueryExtensionsString == NULL || glXGetCurrentDisplay == NULL) return GL_FALSE; */
-/* p = (GLubyte*)glXQueryExtensionsString(glXGetCurrentDisplay(), DefaultScreen(glXGetCurrentDisplay())); */
- if (glXGetClientString == NULL || glXGetCurrentDisplay == NULL) return GL_FALSE;
+ GLuint len;
+
+ if (glXGetCurrentDisplay == NULL) return GL_FALSE;
+ len = _glewStrLen((const GLubyte*)name);
p = (GLubyte*)glXGetClientString(glXGetCurrentDisplay(), GLX_EXTENSIONS);
if (0 == p) return GL_FALSE;
end = p + _glewStrLen(p);
@@ -8891,10 +11142,19 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
#ifdef GLX_3DFX_multisample
CONST_CAST(GLXEW_3DFX_multisample) = glxewGetExtension("GLX_3DFX_multisample");
#endif /* GLX_3DFX_multisample */
+#ifdef GLX_AMD_gpu_association
+ CONST_CAST(GLXEW_AMD_gpu_association) = glxewGetExtension("GLX_AMD_gpu_association");
+#endif /* GLX_AMD_gpu_association */
#ifdef GLX_ARB_create_context
CONST_CAST(GLXEW_ARB_create_context) = glxewGetExtension("GLX_ARB_create_context");
if (glewExperimental || GLXEW_ARB_create_context) CONST_CAST(GLXEW_ARB_create_context) = !_glewInit_GLX_ARB_create_context(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GLX_ARB_create_context */
+#ifdef GLX_ARB_create_context_profile
+ CONST_CAST(GLXEW_ARB_create_context_profile) = glxewGetExtension("GLX_ARB_create_context_profile");
+#endif /* GLX_ARB_create_context_profile */
+#ifdef GLX_ARB_create_context_robustness
+ CONST_CAST(GLXEW_ARB_create_context_robustness) = glxewGetExtension("GLX_ARB_create_context_robustness");
+#endif /* GLX_ARB_create_context_robustness */
#ifdef GLX_ARB_fbconfig_float
CONST_CAST(GLXEW_ARB_fbconfig_float) = glxewGetExtension("GLX_ARB_fbconfig_float");
#endif /* GLX_ARB_fbconfig_float */
@@ -8907,6 +11167,9 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
#ifdef GLX_ARB_multisample
CONST_CAST(GLXEW_ARB_multisample) = glxewGetExtension("GLX_ARB_multisample");
#endif /* GLX_ARB_multisample */
+#ifdef GLX_ARB_vertex_buffer_object
+ CONST_CAST(GLXEW_ARB_vertex_buffer_object) = glxewGetExtension("GLX_ARB_vertex_buffer_object");
+#endif /* GLX_ARB_vertex_buffer_object */
#ifdef GLX_ATI_pixel_format_float
CONST_CAST(GLXEW_ATI_pixel_format_float) = glxewGetExtension("GLX_ATI_pixel_format_float");
#endif /* GLX_ATI_pixel_format_float */
@@ -8914,6 +11177,9 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLXEW_ATI_render_texture) = glxewGetExtension("GLX_ATI_render_texture");
if (glewExperimental || GLXEW_ATI_render_texture) CONST_CAST(GLXEW_ATI_render_texture) = !_glewInit_GLX_ATI_render_texture(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GLX_ATI_render_texture */
+#ifdef GLX_EXT_create_context_es2_profile
+ CONST_CAST(GLXEW_EXT_create_context_es2_profile) = glxewGetExtension("GLX_EXT_create_context_es2_profile");
+#endif /* GLX_EXT_create_context_es2_profile */
#ifdef GLX_EXT_fbconfig_packed_float
CONST_CAST(GLXEW_EXT_fbconfig_packed_float) = glxewGetExtension("GLX_EXT_fbconfig_packed_float");
#endif /* GLX_EXT_fbconfig_packed_float */
@@ -8927,6 +11193,10 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
#ifdef GLX_EXT_scene_marker
CONST_CAST(GLXEW_EXT_scene_marker) = glxewGetExtension("GLX_EXT_scene_marker");
#endif /* GLX_EXT_scene_marker */
+#ifdef GLX_EXT_swap_control
+ CONST_CAST(GLXEW_EXT_swap_control) = glxewGetExtension("GLX_EXT_swap_control");
+ if (glewExperimental || GLXEW_EXT_swap_control) CONST_CAST(GLXEW_EXT_swap_control) = !_glewInit_GLX_EXT_swap_control(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GLX_EXT_swap_control */
#ifdef GLX_EXT_texture_from_pixmap
CONST_CAST(GLXEW_EXT_texture_from_pixmap) = glxewGetExtension("GLX_EXT_texture_from_pixmap");
if (glewExperimental || GLXEW_EXT_texture_from_pixmap) CONST_CAST(GLXEW_EXT_texture_from_pixmap) = !_glewInit_GLX_EXT_texture_from_pixmap(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -8937,6 +11207,9 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
#ifdef GLX_EXT_visual_rating
CONST_CAST(GLXEW_EXT_visual_rating) = glxewGetExtension("GLX_EXT_visual_rating");
#endif /* GLX_EXT_visual_rating */
+#ifdef GLX_INTEL_swap_event
+ CONST_CAST(GLXEW_INTEL_swap_event) = glxewGetExtension("GLX_INTEL_swap_event");
+#endif /* GLX_INTEL_swap_event */
#ifdef GLX_MESA_agp_offset
CONST_CAST(GLXEW_MESA_agp_offset) = glxewGetExtension("GLX_MESA_agp_offset");
if (glewExperimental || GLXEW_MESA_agp_offset) CONST_CAST(GLXEW_MESA_agp_offset) = !_glewInit_GLX_MESA_agp_offset(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -8957,9 +11230,16 @@ GLenum glxewContextInit (GLXEW_CONTEXT_ARG_DEF_LIST)
CONST_CAST(GLXEW_MESA_set_3dfx_mode) = glxewGetExtension("GLX_MESA_set_3dfx_mode");
if (glewExperimental || GLXEW_MESA_set_3dfx_mode) CONST_CAST(GLXEW_MESA_set_3dfx_mode) = !_glewInit_GLX_MESA_set_3dfx_mode(GLEW_CONTEXT_ARG_VAR_INIT);
#endif /* GLX_MESA_set_3dfx_mode */
+#ifdef GLX_NV_copy_image
+ CONST_CAST(GLXEW_NV_copy_image) = glxewGetExtension("GLX_NV_copy_image");
+ if (glewExperimental || GLXEW_NV_copy_image) CONST_CAST(GLXEW_NV_copy_image) = !_glewInit_GLX_NV_copy_image(GLEW_CONTEXT_ARG_VAR_INIT);
+#endif /* GLX_NV_copy_image */
#ifdef GLX_NV_float_buffer
CONST_CAST(GLXEW_NV_float_buffer) = glxewGetExtension("GLX_NV_float_buffer");
#endif /* GLX_NV_float_buffer */
+#ifdef GLX_NV_multisample_coverage
+ CONST_CAST(GLXEW_NV_multisample_coverage) = glxewGetExtension("GLX_NV_multisample_coverage");
+#endif /* GLX_NV_multisample_coverage */
#ifdef GLX_NV_present_video
CONST_CAST(GLXEW_NV_present_video) = glxewGetExtension("GLX_NV_present_video");
if (glewExperimental || GLXEW_NV_present_video) CONST_CAST(GLXEW_NV_present_video) = !_glewInit_GLX_NV_present_video(GLEW_CONTEXT_ARG_VAR_INIT);
@@ -9074,10 +11354,10 @@ const GLubyte* glewGetString (GLenum name)
static const GLubyte* _glewString[] =
{
(const GLubyte*)NULL,
- (const GLubyte*)"1.5.1",
+ (const GLubyte*)"1.5.8",
(const GLubyte*)"1",
(const GLubyte*)"5",
- (const GLubyte*)"1"
+ (const GLubyte*)"8"
};
const int max_string = sizeof(_glewString)/sizeof(*_glewString) - 1;
return _glewString[(int)name > max_string ? 0 : (int)name];
@@ -9110,7 +11390,7 @@ GLenum glewInit ()
#endif /* !GLEW_MX */
#ifdef GLEW_MX
-GLboolean glewContextIsSupported (GLEWContext* ctx, const char* name)
+GLboolean glewContextIsSupported (const GLEWContext* ctx, const char* name)
#else
GLboolean glewIsSupported (const char* name)
#endif
@@ -9131,6 +11411,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_VERSION_1_2_1
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_2_1", 5))
+ {
+ ret = GLEW_VERSION_1_2_1;
+ continue;
+ }
+#endif
#ifdef GL_VERSION_1_3
if (_glewStrSame3(&pos, &len, (const GLubyte*)"1_3", 3))
{
@@ -9173,6 +11460,41 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_VERSION_3_1
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_1", 3))
+ {
+ ret = GLEW_VERSION_3_1;
+ continue;
+ }
+#endif
+#ifdef GL_VERSION_3_2
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_2", 3))
+ {
+ ret = GLEW_VERSION_3_2;
+ continue;
+ }
+#endif
+#ifdef GL_VERSION_3_3
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"3_3", 3))
+ {
+ ret = GLEW_VERSION_3_3;
+ continue;
+ }
+#endif
+#ifdef GL_VERSION_4_0
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_0", 3))
+ {
+ ret = GLEW_VERSION_4_0;
+ continue;
+ }
+#endif
+#ifdef GL_VERSION_4_1
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"4_1", 3))
+ {
+ ret = GLEW_VERSION_4_1;
+ continue;
+ }
+#endif
}
if (_glewStrSame2(&pos, &len, (const GLubyte*)"3DFX_", 5))
{
@@ -9198,8 +11520,95 @@ GLboolean glewIsSupported (const char* name)
}
#endif
}
+ if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4))
+ {
+#ifdef GL_AMD_conservative_depth
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"conservative_depth", 18))
+ {
+ ret = GLEW_AMD_conservative_depth;
+ continue;
+ }
+#endif
+#ifdef GL_AMD_debug_output
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12))
+ {
+ ret = GLEW_AMD_debug_output;
+ continue;
+ }
+#endif
+#ifdef GL_AMD_depth_clamp_separate
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp_separate", 20))
+ {
+ ret = GLEW_AMD_depth_clamp_separate;
+ continue;
+ }
+#endif
+#ifdef GL_AMD_draw_buffers_blend
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18))
+ {
+ ret = GLEW_AMD_draw_buffers_blend;
+ continue;
+ }
+#endif
+#ifdef GL_AMD_name_gen_delete
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"name_gen_delete", 15))
+ {
+ ret = GLEW_AMD_name_gen_delete;
+ continue;
+ }
+#endif
+#ifdef GL_AMD_performance_monitor
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"performance_monitor", 19))
+ {
+ ret = GLEW_AMD_performance_monitor;
+ continue;
+ }
+#endif
+#ifdef GL_AMD_seamless_cubemap_per_texture
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cubemap_per_texture", 28))
+ {
+ ret = GLEW_AMD_seamless_cubemap_per_texture;
+ continue;
+ }
+#endif
+#ifdef GL_AMD_shader_stencil_export
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21))
+ {
+ ret = GLEW_AMD_shader_stencil_export;
+ continue;
+ }
+#endif
+#ifdef GL_AMD_texture_texture4
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_texture4", 16))
+ {
+ ret = GLEW_AMD_texture_texture4;
+ continue;
+ }
+#endif
+#ifdef GL_AMD_transform_feedback3_lines_triangles
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3_lines_triangles", 35))
+ {
+ ret = GLEW_AMD_transform_feedback3_lines_triangles;
+ continue;
+ }
+#endif
+#ifdef GL_AMD_vertex_shader_tessellator
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader_tessellator", 25))
+ {
+ ret = GLEW_AMD_vertex_shader_tessellator;
+ continue;
+ }
+#endif
+ }
if (_glewStrSame2(&pos, &len, (const GLubyte*)"APPLE_", 6))
{
+#ifdef GL_APPLE_aux_depth_stencil
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"aux_depth_stencil", 17))
+ {
+ ret = GLEW_APPLE_aux_depth_stencil;
+ continue;
+ }
+#endif
#ifdef GL_APPLE_client_storage
if (_glewStrSame3(&pos, &len, (const GLubyte*)"client_storage", 14))
{
@@ -9235,6 +11644,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_APPLE_object_purgeable
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"object_purgeable", 16))
+ {
+ ret = GLEW_APPLE_object_purgeable;
+ continue;
+ }
+#endif
#ifdef GL_APPLE_pixel_buffer
if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer", 12))
{
@@ -9242,6 +11658,20 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_APPLE_rgb_422
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"rgb_422", 7))
+ {
+ ret = GLEW_APPLE_rgb_422;
+ continue;
+ }
+#endif
+#ifdef GL_APPLE_row_bytes
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"row_bytes", 9))
+ {
+ ret = GLEW_APPLE_row_bytes;
+ continue;
+ }
+#endif
#ifdef GL_APPLE_specular_vector
if (_glewStrSame3(&pos, &len, (const GLubyte*)"specular_vector", 15))
{
@@ -9277,6 +11707,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_APPLE_vertex_program_evaluators
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program_evaluators", 25))
+ {
+ ret = GLEW_APPLE_vertex_program_evaluators;
+ continue;
+ }
+#endif
#ifdef GL_APPLE_ycbcr_422
if (_glewStrSame3(&pos, &len, (const GLubyte*)"ycbcr_422", 9))
{
@@ -9287,6 +11724,27 @@ GLboolean glewIsSupported (const char* name)
}
if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4))
{
+#ifdef GL_ARB_ES2_compatibility
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"ES2_compatibility", 17))
+ {
+ ret = GLEW_ARB_ES2_compatibility;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_blend_func_extended
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"blend_func_extended", 19))
+ {
+ ret = GLEW_ARB_blend_func_extended;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_cl_event
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"cl_event", 8))
+ {
+ ret = GLEW_ARB_cl_event;
+ continue;
+ }
+#endif
#ifdef GL_ARB_color_buffer_float
if (_glewStrSame3(&pos, &len, (const GLubyte*)"color_buffer_float", 18))
{
@@ -9294,6 +11752,27 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_compatibility
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"compatibility", 13))
+ {
+ ret = GLEW_ARB_compatibility;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_copy_buffer
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_buffer", 11))
+ {
+ ret = GLEW_ARB_copy_buffer;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_debug_output
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"debug_output", 12))
+ {
+ ret = GLEW_ARB_debug_output;
+ continue;
+ }
+#endif
#ifdef GL_ARB_depth_buffer_float
if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18))
{
@@ -9301,6 +11780,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_depth_clamp
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_clamp", 11))
+ {
+ ret = GLEW_ARB_depth_clamp;
+ continue;
+ }
+#endif
#ifdef GL_ARB_depth_texture
if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_texture", 13))
{
@@ -9315,6 +11801,27 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_draw_buffers_blend
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_buffers_blend", 18))
+ {
+ ret = GLEW_ARB_draw_buffers_blend;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_draw_elements_base_vertex
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_elements_base_vertex", 25))
+ {
+ ret = GLEW_ARB_draw_elements_base_vertex;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_draw_indirect
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_indirect", 13))
+ {
+ ret = GLEW_ARB_draw_indirect;
+ continue;
+ }
+#endif
#ifdef GL_ARB_draw_instanced
if (_glewStrSame3(&pos, &len, (const GLubyte*)"draw_instanced", 14))
{
@@ -9322,6 +11829,20 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_explicit_attrib_location
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"explicit_attrib_location", 24))
+ {
+ ret = GLEW_ARB_explicit_attrib_location;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_fragment_coord_conventions
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_coord_conventions", 26))
+ {
+ ret = GLEW_ARB_fragment_coord_conventions;
+ continue;
+ }
+#endif
#ifdef GL_ARB_fragment_program
if (_glewStrSame3(&pos, &len, (const GLubyte*)"fragment_program", 16))
{
@@ -9364,6 +11885,27 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_get_program_binary
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"get_program_binary", 18))
+ {
+ ret = GLEW_ARB_get_program_binary;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_gpu_shader5
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11))
+ {
+ ret = GLEW_ARB_gpu_shader5;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_gpu_shader_fp64
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader_fp64", 15))
+ {
+ ret = GLEW_ARB_gpu_shader_fp64;
+ continue;
+ }
+#endif
#ifdef GL_ARB_half_float_pixel
if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float_pixel", 16))
{
@@ -9427,6 +11969,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_occlusion_query2
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"occlusion_query2", 16))
+ {
+ ret = GLEW_ARB_occlusion_query2;
+ continue;
+ }
+#endif
#ifdef GL_ARB_pixel_buffer_object
if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_buffer_object", 19))
{
@@ -9448,6 +11997,55 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_provoking_vertex
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16))
+ {
+ ret = GLEW_ARB_provoking_vertex;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_robustness
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"robustness", 10))
+ {
+ ret = GLEW_ARB_robustness;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_sample_shading
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"sample_shading", 14))
+ {
+ ret = GLEW_ARB_sample_shading;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_sampler_objects
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"sampler_objects", 15))
+ {
+ ret = GLEW_ARB_sampler_objects;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_seamless_cube_map
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"seamless_cube_map", 17))
+ {
+ ret = GLEW_ARB_seamless_cube_map;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_separate_shader_objects
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23))
+ {
+ ret = GLEW_ARB_separate_shader_objects;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_shader_bit_encoding
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_bit_encoding", 19))
+ {
+ ret = GLEW_ARB_shader_bit_encoding;
+ continue;
+ }
+#endif
#ifdef GL_ARB_shader_objects
if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_objects", 14))
{
@@ -9455,6 +12053,34 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_shader_precision
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_precision", 16))
+ {
+ ret = GLEW_ARB_shader_precision;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_shader_stencil_export
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_stencil_export", 21))
+ {
+ ret = GLEW_ARB_shader_stencil_export;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_shader_subroutine
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_subroutine", 17))
+ {
+ ret = GLEW_ARB_shader_subroutine;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_shader_texture_lod
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_texture_lod", 18))
+ {
+ ret = GLEW_ARB_shader_texture_lod;
+ continue;
+ }
+#endif
#ifdef GL_ARB_shading_language_100
if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_100", 20))
{
@@ -9462,6 +12088,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_shading_language_include
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"shading_language_include", 24))
+ {
+ ret = GLEW_ARB_shading_language_include;
+ continue;
+ }
+#endif
#ifdef GL_ARB_shadow
if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow", 6))
{
@@ -9476,6 +12109,20 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_sync
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"sync", 4))
+ {
+ ret = GLEW_ARB_sync;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_tessellation_shader
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_shader", 19))
+ {
+ ret = GLEW_ARB_tessellation_shader;
+ continue;
+ }
+#endif
#ifdef GL_ARB_texture_border_clamp
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_border_clamp", 20))
{
@@ -9490,6 +12137,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_texture_buffer_object_rgb32
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_buffer_object_rgb32", 27))
+ {
+ ret = GLEW_ARB_texture_buffer_object_rgb32;
+ continue;
+ }
+#endif
#ifdef GL_ARB_texture_compression
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression", 19))
{
@@ -9497,6 +12151,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_texture_compression_bptc
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_bptc", 24))
+ {
+ ret = GLEW_ARB_texture_compression_bptc;
+ continue;
+ }
+#endif
#ifdef GL_ARB_texture_compression_rgtc
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_rgtc", 24))
{
@@ -9511,6 +12172,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_texture_cube_map_array
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_cube_map_array", 22))
+ {
+ ret = GLEW_ARB_texture_cube_map_array;
+ continue;
+ }
+#endif
#ifdef GL_ARB_texture_env_add
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_env_add", 15))
{
@@ -9546,6 +12214,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_texture_gather
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_gather", 14))
+ {
+ ret = GLEW_ARB_texture_gather;
+ continue;
+ }
+#endif
#ifdef GL_ARB_texture_mirrored_repeat
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_mirrored_repeat", 23))
{
@@ -9553,6 +12228,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_texture_multisample
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_multisample", 19))
+ {
+ ret = GLEW_ARB_texture_multisample;
+ continue;
+ }
+#endif
#ifdef GL_ARB_texture_non_power_of_two
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_non_power_of_two", 24))
{
@@ -9560,6 +12242,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_texture_query_lod
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_query_lod", 17))
+ {
+ ret = GLEW_ARB_texture_query_lod;
+ continue;
+ }
+#endif
#ifdef GL_ARB_texture_rectangle
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rectangle", 17))
{
@@ -9574,6 +12263,41 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_texture_rgb10_a2ui
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_rgb10_a2ui", 18))
+ {
+ ret = GLEW_ARB_texture_rgb10_a2ui;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_texture_swizzle
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15))
+ {
+ ret = GLEW_ARB_texture_swizzle;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_timer_query
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"timer_query", 11))
+ {
+ ret = GLEW_ARB_timer_query;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_transform_feedback2
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19))
+ {
+ ret = GLEW_ARB_transform_feedback2;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_transform_feedback3
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback3", 19))
+ {
+ ret = GLEW_ARB_transform_feedback3;
+ continue;
+ }
+#endif
#ifdef GL_ARB_transpose_matrix
if (_glewStrSame3(&pos, &len, (const GLubyte*)"transpose_matrix", 16))
{
@@ -9581,6 +12305,20 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_uniform_buffer_object
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"uniform_buffer_object", 21))
+ {
+ ret = GLEW_ARB_uniform_buffer_object;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_vertex_array_bgra
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_bgra", 17))
+ {
+ ret = GLEW_ARB_vertex_array_bgra;
+ continue;
+ }
+#endif
#ifdef GL_ARB_vertex_array_object
if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_object", 19))
{
@@ -9588,6 +12326,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_vertex_attrib_64bit
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19))
+ {
+ ret = GLEW_ARB_vertex_attrib_64bit;
+ continue;
+ }
+#endif
#ifdef GL_ARB_vertex_blend
if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_blend", 12))
{
@@ -9616,6 +12361,20 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ARB_vertex_type_2_10_10_10_rev
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_type_2_10_10_10_rev", 26))
+ {
+ ret = GLEW_ARB_vertex_type_2_10_10_10_rev;
+ continue;
+ }
+#endif
+#ifdef GL_ARB_viewport_array
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"viewport_array", 14))
+ {
+ ret = GLEW_ARB_viewport_array;
+ continue;
+ }
+#endif
#ifdef GL_ARB_window_pos
if (_glewStrSame3(&pos, &len, (const GLubyte*)"window_pos", 10))
{
@@ -9692,6 +12451,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_ATI_meminfo
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"meminfo", 7))
+ {
+ ret = GLEW_ATI_meminfo;
+ continue;
+ }
+#endif
#ifdef GL_ATI_pn_triangles
if (_glewStrSame3(&pos, &len, (const GLubyte*)"pn_triangles", 12))
{
@@ -10129,6 +12895,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_EXT_provoking_vertex
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"provoking_vertex", 16))
+ {
+ ret = GLEW_EXT_provoking_vertex;
+ continue;
+ }
+#endif
#ifdef GL_EXT_rescale_normal
if (_glewStrSame3(&pos, &len, (const GLubyte*)"rescale_normal", 14))
{
@@ -10150,6 +12923,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_EXT_separate_shader_objects
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_shader_objects", 23))
+ {
+ ret = GLEW_EXT_separate_shader_objects;
+ continue;
+ }
+#endif
#ifdef GL_EXT_separate_specular_color
if (_glewStrSame3(&pos, &len, (const GLubyte*)"separate_specular_color", 23))
{
@@ -10157,6 +12937,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_EXT_shader_image_load_store
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_image_load_store", 23))
+ {
+ ret = GLEW_EXT_shader_image_load_store;
+ continue;
+ }
+#endif
#ifdef GL_EXT_shadow_funcs
if (_glewStrSame3(&pos, &len, (const GLubyte*)"shadow_funcs", 12))
{
@@ -10353,6 +13140,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_EXT_texture_sRGB_decode
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_sRGB_decode", 19))
+ {
+ ret = GLEW_EXT_texture_sRGB_decode;
+ continue;
+ }
+#endif
#ifdef GL_EXT_texture_shared_exponent
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_shared_exponent", 23))
{
@@ -10360,6 +13154,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_EXT_texture_snorm
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_snorm", 13))
+ {
+ ret = GLEW_EXT_texture_snorm;
+ continue;
+ }
+#endif
#ifdef GL_EXT_texture_swizzle
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_swizzle", 15))
{
@@ -10395,6 +13196,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_EXT_vertex_attrib_64bit
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_64bit", 19))
+ {
+ ret = GLEW_EXT_vertex_attrib_64bit;
+ continue;
+ }
+#endif
#ifdef GL_EXT_vertex_shader
if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_shader", 13))
{
@@ -10588,6 +13396,16 @@ GLboolean glewIsSupported (const char* name)
}
#endif
}
+ if (_glewStrSame2(&pos, &len, (const GLubyte*)"NVX_", 4))
+ {
+#ifdef GL_NVX_gpu_memory_info
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_memory_info", 15))
+ {
+ ret = GLEW_NVX_gpu_memory_info;
+ continue;
+ }
+#endif
+ }
if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3))
{
#ifdef GL_NV_blend_square
@@ -10611,6 +13429,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_NV_copy_image
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10))
+ {
+ ret = GLEW_NV_copy_image;
+ continue;
+ }
+#endif
#ifdef GL_NV_depth_buffer_float
if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_buffer_float", 18))
{
@@ -10723,6 +13548,27 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_NV_gpu_program5
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program5", 12))
+ {
+ ret = GLEW_NV_gpu_program5;
+ continue;
+ }
+#endif
+#ifdef GL_NV_gpu_program_fp64
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_program_fp64", 16))
+ {
+ ret = GLEW_NV_gpu_program_fp64;
+ continue;
+ }
+#endif
+#ifdef GL_NV_gpu_shader5
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_shader5", 11))
+ {
+ ret = GLEW_NV_gpu_shader5;
+ continue;
+ }
+#endif
#ifdef GL_NV_half_float
if (_glewStrSame3(&pos, &len, (const GLubyte*)"half_float", 10))
{
@@ -10737,6 +13583,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_NV_multisample_coverage
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20))
+ {
+ ret = GLEW_NV_multisample_coverage;
+ continue;
+ }
+#endif
#ifdef GL_NV_multisample_filter_hint
if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_filter_hint", 23))
{
@@ -10765,6 +13618,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_NV_parameter_buffer_object2
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"parameter_buffer_object2", 24))
+ {
+ ret = GLEW_NV_parameter_buffer_object2;
+ continue;
+ }
+#endif
#ifdef GL_NV_pixel_data_range
if (_glewStrSame3(&pos, &len, (const GLubyte*)"pixel_data_range", 16))
{
@@ -10807,6 +13667,20 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_NV_shader_buffer_load
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"shader_buffer_load", 18))
+ {
+ ret = GLEW_NV_shader_buffer_load;
+ continue;
+ }
+#endif
+#ifdef GL_NV_tessellation_program5
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"tessellation_program5", 21))
+ {
+ ret = GLEW_NV_tessellation_program5;
+ continue;
+ }
+#endif
#ifdef GL_NV_texgen_emboss
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texgen_emboss", 13))
{
@@ -10821,6 +13695,13 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_NV_texture_barrier
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_barrier", 15))
+ {
+ ret = GLEW_NV_texture_barrier;
+ continue;
+ }
+#endif
#ifdef GL_NV_texture_compression_vtc
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_compression_vtc", 23))
{
@@ -10877,6 +13758,20 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_NV_transform_feedback2
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"transform_feedback2", 19))
+ {
+ ret = GLEW_NV_transform_feedback2;
+ continue;
+ }
+#endif
+#ifdef GL_NV_vdpau_interop
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"vdpau_interop", 13))
+ {
+ ret = GLEW_NV_vdpau_interop;
+ continue;
+ }
+#endif
#ifdef GL_NV_vertex_array_range
if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_array_range", 18))
{
@@ -10891,6 +13786,20 @@ GLboolean glewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GL_NV_vertex_attrib_integer_64bit
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_attrib_integer_64bit", 27))
+ {
+ ret = GLEW_NV_vertex_attrib_integer_64bit;
+ continue;
+ }
+#endif
+#ifdef GL_NV_vertex_buffer_unified_memory
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_unified_memory", 28))
+ {
+ ret = GLEW_NV_vertex_buffer_unified_memory;
+ continue;
+ }
+#endif
#ifdef GL_NV_vertex_program
if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_program", 14))
{
@@ -11473,7 +14382,7 @@ GLboolean glewIsSupported (const char* name)
#if defined(_WIN32)
#if defined(GLEW_MX)
-GLboolean wglewContextIsSupported (WGLEWContext* ctx, const char* name)
+GLboolean wglewContextIsSupported (const WGLEWContext* ctx, const char* name)
#else
GLboolean wglewIsSupported (const char* name)
#endif
@@ -11505,6 +14414,16 @@ GLboolean wglewIsSupported (const char* name)
}
#endif
}
+ if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4))
+ {
+#ifdef WGL_AMD_gpu_association
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15))
+ {
+ ret = WGLEW_AMD_gpu_association;
+ continue;
+ }
+#endif
+ }
if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4))
{
#ifdef WGL_ARB_buffer_region
@@ -11521,6 +14440,20 @@ GLboolean wglewIsSupported (const char* name)
continue;
}
#endif
+#ifdef WGL_ARB_create_context_profile
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22))
+ {
+ ret = WGLEW_ARB_create_context_profile;
+ continue;
+ }
+#endif
+#ifdef WGL_ARB_create_context_robustness
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25))
+ {
+ ret = WGLEW_ARB_create_context_robustness;
+ continue;
+ }
+#endif
#ifdef WGL_ARB_extensions_string
if (_glewStrSame3(&pos, &len, (const GLubyte*)"extensions_string", 17))
{
@@ -11597,6 +14530,13 @@ GLboolean wglewIsSupported (const char* name)
}
if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4))
{
+#ifdef WGL_EXT_create_context_es2_profile
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26))
+ {
+ ret = WGLEW_EXT_create_context_es2_profile;
+ continue;
+ }
+#endif
#ifdef WGL_EXT_depth_float
if (_glewStrSame3(&pos, &len, (const GLubyte*)"depth_float", 11))
{
@@ -11715,6 +14655,13 @@ GLboolean wglewIsSupported (const char* name)
}
if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3))
{
+#ifdef WGL_NV_copy_image
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10))
+ {
+ ret = WGLEW_NV_copy_image;
+ continue;
+ }
+#endif
#ifdef WGL_NV_float_buffer
if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12))
{
@@ -11729,6 +14676,13 @@ GLboolean wglewIsSupported (const char* name)
continue;
}
#endif
+#ifdef WGL_NV_multisample_coverage
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20))
+ {
+ ret = WGLEW_NV_multisample_coverage;
+ continue;
+ }
+#endif
#ifdef WGL_NV_present_video
if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13))
{
@@ -11791,7 +14745,7 @@ GLboolean wglewIsSupported (const char* name)
#elif !defined(__APPLE__) || defined(GLEW_APPLE_GLX)
#if defined(GLEW_MX)
-GLboolean glxewContextIsSupported (GLXEWContext* ctx, const char* name)
+GLboolean glxewContextIsSupported (const GLXEWContext* ctx, const char* name)
#else
GLboolean glxewIsSupported (const char* name)
#endif
@@ -11837,6 +14791,16 @@ GLboolean glxewIsSupported (const char* name)
}
#endif
}
+ if (_glewStrSame2(&pos, &len, (const GLubyte*)"AMD_", 4))
+ {
+#ifdef GLX_AMD_gpu_association
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"gpu_association", 15))
+ {
+ ret = GLXEW_AMD_gpu_association;
+ continue;
+ }
+#endif
+ }
if (_glewStrSame2(&pos, &len, (const GLubyte*)"ARB_", 4))
{
#ifdef GLX_ARB_create_context
@@ -11846,6 +14810,20 @@ GLboolean glxewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GLX_ARB_create_context_profile
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_profile", 22))
+ {
+ ret = GLXEW_ARB_create_context_profile;
+ continue;
+ }
+#endif
+#ifdef GLX_ARB_create_context_robustness
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_robustness", 25))
+ {
+ ret = GLXEW_ARB_create_context_robustness;
+ continue;
+ }
+#endif
#ifdef GLX_ARB_fbconfig_float
if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_float", 14))
{
@@ -11874,6 +14852,13 @@ GLboolean glxewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GLX_ARB_vertex_buffer_object
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"vertex_buffer_object", 20))
+ {
+ ret = GLXEW_ARB_vertex_buffer_object;
+ continue;
+ }
+#endif
}
if (_glewStrSame2(&pos, &len, (const GLubyte*)"ATI_", 4))
{
@@ -11894,6 +14879,13 @@ GLboolean glxewIsSupported (const char* name)
}
if (_glewStrSame2(&pos, &len, (const GLubyte*)"EXT_", 4))
{
+#ifdef GLX_EXT_create_context_es2_profile
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"create_context_es2_profile", 26))
+ {
+ ret = GLXEW_EXT_create_context_es2_profile;
+ continue;
+ }
+#endif
#ifdef GLX_EXT_fbconfig_packed_float
if (_glewStrSame3(&pos, &len, (const GLubyte*)"fbconfig_packed_float", 21))
{
@@ -11922,6 +14914,13 @@ GLboolean glxewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GLX_EXT_swap_control
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_control", 12))
+ {
+ ret = GLXEW_EXT_swap_control;
+ continue;
+ }
+#endif
#ifdef GLX_EXT_texture_from_pixmap
if (_glewStrSame3(&pos, &len, (const GLubyte*)"texture_from_pixmap", 19))
{
@@ -11944,6 +14943,16 @@ GLboolean glxewIsSupported (const char* name)
}
#endif
}
+ if (_glewStrSame2(&pos, &len, (const GLubyte*)"INTEL_", 6))
+ {
+#ifdef GLX_INTEL_swap_event
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"swap_event", 10))
+ {
+ ret = GLXEW_INTEL_swap_event;
+ continue;
+ }
+#endif
+ }
if (_glewStrSame2(&pos, &len, (const GLubyte*)"MESA_", 5))
{
#ifdef GLX_MESA_agp_offset
@@ -11984,6 +14993,13 @@ GLboolean glxewIsSupported (const char* name)
}
if (_glewStrSame2(&pos, &len, (const GLubyte*)"NV_", 3))
{
+#ifdef GLX_NV_copy_image
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"copy_image", 10))
+ {
+ ret = GLXEW_NV_copy_image;
+ continue;
+ }
+#endif
#ifdef GLX_NV_float_buffer
if (_glewStrSame3(&pos, &len, (const GLubyte*)"float_buffer", 12))
{
@@ -11991,6 +15007,13 @@ GLboolean glxewIsSupported (const char* name)
continue;
}
#endif
+#ifdef GLX_NV_multisample_coverage
+ if (_glewStrSame3(&pos, &len, (const GLubyte*)"multisample_coverage", 20))
+ {
+ ret = GLXEW_NV_multisample_coverage;
+ continue;
+ }
+#endif
#ifdef GLX_NV_present_video
if (_glewStrSame3(&pos, &len, (const GLubyte*)"present_video", 13))
{
diff --git a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
index 078a10a68cb..0dc525b0e5a 100644
--- a/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
+++ b/intern/audaspace/ffmpeg/AUD_FFMPEGReader.cpp
@@ -253,7 +253,7 @@ void AUD_FFMPEGReader::seek(int position)
if(position >= 0)
{
uint64_t st_time = m_formatCtx->start_time;
- uint64_t seek_pos = position * AV_TIME_BASE / m_specs.rate;
+ uint64_t seek_pos = ((uint64_t)position) * ((uint64_t)AV_TIME_BASE) / ((uint64_t)m_specs.rate);
if (seek_pos < 0) {
seek_pos = 0;
diff --git a/intern/audaspace/intern/AUD_C-API.cpp b/intern/audaspace/intern/AUD_C-API.cpp
index 3fb11e31c37..0119bb105d8 100644
--- a/intern/audaspace/intern/AUD_C-API.cpp
+++ b/intern/audaspace/intern/AUD_C-API.cpp
@@ -864,7 +864,7 @@ AUD_Channel* AUD_pauseAfter(AUD_Channel* handle, float seconds)
}
}
-AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume)
+AUD_Sound* AUD_createSequencer(int muted, void* data, AUD_volumeFunction volume)
{
/* AUD_XXX should be this: but AUD_createSequencer is called before the device
* is initialized.
@@ -874,7 +874,7 @@ AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume)
AUD_Specs specs;
specs.channels = AUD_CHANNELS_STEREO;
specs.rate = AUD_RATE_44100;
- return new AUD_SequencerFactory(specs, data, volume);
+ return new AUD_SequencerFactory(specs, muted, data, volume);
}
void AUD_destroySequencer(AUD_Sound* sequencer)
@@ -882,6 +882,11 @@ void AUD_destroySequencer(AUD_Sound* sequencer)
delete ((AUD_SequencerFactory*)sequencer);
}
+void AUD_setSequencerMuted(AUD_Sound* sequencer, int muted)
+{
+ ((AUD_SequencerFactory*)sequencer)->mute(muted);
+}
+
AUD_SequencerEntry* AUD_addSequencer(AUD_Sound** sequencer, AUD_Sound* sound,
float begin, float end, float skip, void* data)
{
diff --git a/intern/audaspace/intern/AUD_C-API.h b/intern/audaspace/intern/AUD_C-API.h
index 04343bb9c4c..b2242f09547 100644
--- a/intern/audaspace/intern/AUD_C-API.h
+++ b/intern/audaspace/intern/AUD_C-API.h
@@ -459,10 +459,12 @@ extern float* AUD_readSoundBuffer(const char* filename, float low, float high,
*/
extern AUD_Channel* AUD_pauseAfter(AUD_Channel* handle, float seconds);
-extern AUD_Sound* AUD_createSequencer(void* data, AUD_volumeFunction volume);
+extern AUD_Sound* AUD_createSequencer(int muted, void* data, AUD_volumeFunction volume);
extern void AUD_destroySequencer(AUD_Sound* sequencer);
+extern void AUD_setSequencerMuted(AUD_Sound* sequencer, int muted);
+
extern AUD_SequencerEntry* AUD_addSequencer(AUD_Sound** sequencer, AUD_Sound* sound,
float begin, float end, float skip, void* data);
diff --git a/intern/audaspace/intern/AUD_SequencerFactory.cpp b/intern/audaspace/intern/AUD_SequencerFactory.cpp
index 77d83458c68..f49dd94fe11 100644
--- a/intern/audaspace/intern/AUD_SequencerFactory.cpp
+++ b/intern/audaspace/intern/AUD_SequencerFactory.cpp
@@ -34,9 +34,11 @@
typedef std::list<AUD_SequencerReader*>::iterator AUD_ReaderIterator;
-AUD_SequencerFactory::AUD_SequencerFactory(AUD_Specs specs, void* data,
+AUD_SequencerFactory::AUD_SequencerFactory(AUD_Specs specs, bool muted,
+ void* data,
AUD_volumeFunction volume) :
m_specs(specs),
+ m_muted(muted),
m_data(data),
m_volume(volume)
{
@@ -62,6 +64,16 @@ AUD_SequencerFactory::~AUD_SequencerFactory()
}
}
+void AUD_SequencerFactory::mute(bool muted)
+{
+ m_muted = muted;
+}
+
+bool AUD_SequencerFactory::getMute() const
+{
+ return m_muted;
+}
+
AUD_IReader* AUD_SequencerFactory::newReader()
{
AUD_SequencerReader* reader = new AUD_SequencerReader(this, m_entries,
diff --git a/intern/audaspace/intern/AUD_SequencerFactory.h b/intern/audaspace/intern/AUD_SequencerFactory.h
index 5eea95eb6ef..8f3466f75ce 100644
--- a/intern/audaspace/intern/AUD_SequencerFactory.h
+++ b/intern/audaspace/intern/AUD_SequencerFactory.h
@@ -63,6 +63,7 @@ private:
std::list<AUD_SequencerEntry*> m_entries;
std::list<AUD_SequencerReader*> m_readers;
+ bool m_muted;
void* m_data;
AUD_volumeFunction m_volume;
@@ -73,9 +74,11 @@ private:
AUD_SequencerFactory& operator=(const AUD_SequencerFactory&);
public:
- AUD_SequencerFactory(AUD_Specs specs, void* data, AUD_volumeFunction volume);
+ AUD_SequencerFactory(AUD_Specs specs, bool muted, void* data, AUD_volumeFunction volume);
~AUD_SequencerFactory();
+ void mute(bool muted);
+ bool getMute() const;
AUD_SequencerEntry* add(AUD_IFactory** sound, float begin, float end, float skip, void* data);
void remove(AUD_SequencerEntry* entry);
void move(AUD_SequencerEntry* entry, float begin, float end, float skip);
diff --git a/intern/audaspace/intern/AUD_SequencerReader.cpp b/intern/audaspace/intern/AUD_SequencerReader.cpp
index c02f9e02b33..95e0dca6323 100644
--- a/intern/audaspace/intern/AUD_SequencerReader.cpp
+++ b/intern/audaspace/intern/AUD_SequencerReader.cpp
@@ -182,55 +182,58 @@ void AUD_SequencerReader::read(int & length, sample_t* & buffer)
m_buffer.resize(size);
buffer = m_buffer.getBuffer();
- for(AUD_StripIterator i = m_strips.begin(); i != m_strips.end(); i++)
+ if(!m_factory->getMute())
{
- strip = *i;
- if(!strip->entry->muted)
+ for(AUD_StripIterator i = m_strips.begin(); i != m_strips.end(); i++)
{
- if(strip->old_sound != *strip->entry->sound)
+ strip = *i;
+ if(!strip->entry->muted)
{
- strip->old_sound = *strip->entry->sound;
- if(strip->reader)
- delete strip->reader;
-
- if(strip->old_sound)
+ if(strip->old_sound != *strip->entry->sound)
{
- try
+ strip->old_sound = *strip->entry->sound;
+ if(strip->reader)
+ delete strip->reader;
+
+ if(strip->old_sound)
{
- strip->reader = m_mixer->prepare(strip->old_sound->createReader());
+ try
+ {
+ strip->reader = m_mixer->prepare(strip->old_sound->createReader());
+ }
+ catch(AUD_Exception)
+ {
+ strip->reader = NULL;
+ }
}
- catch(AUD_Exception)
- {
+ else
strip->reader = NULL;
- }
}
- else
- strip->reader = NULL;
- }
- if(strip->reader)
- {
- end = floor(strip->entry->end * rate);
- if(m_position < end)
+ if(strip->reader)
{
- start = floor(strip->entry->begin * rate);
- if(m_position + length > start)
+ end = floor(strip->entry->end * rate);
+ if(m_position < end)
{
- current = m_position - start;
- if(current < 0)
+ start = floor(strip->entry->begin * rate);
+ if(m_position + length > start)
{
- skip = -current;
- current = 0;
+ current = m_position - start;
+ if(current < 0)
+ {
+ skip = -current;
+ current = 0;
+ }
+ else
+ skip = 0;
+ current += strip->entry->skip * rate;
+ len = length > end - m_position ? end - m_position : length;
+ len -= skip;
+ if(strip->reader->getPosition() != current)
+ strip->reader->seek(current);
+ strip->reader->read(len, buf);
+ m_mixer->add(buf, skip, len, m_volume(m_data, strip->entry->data, (float)m_position / (float)rate));
}
- else
- skip = 0;
- current += strip->entry->skip * rate;
- len = length > end - m_position ? end - m_position : length;
- len -= skip;
- if(strip->reader->getPosition() != current)
- strip->reader->seek(current);
- strip->reader->read(len, buf);
- m_mixer->add(buf, skip, len, m_volume(m_data, strip->entry->data, (float)m_position / (float)rate));
}
}
}
diff --git a/intern/ghost/CMakeLists.txt b/intern/ghost/CMakeLists.txt
index 33185a63d5b..0d7a64ddfa9 100644
--- a/intern/ghost/CMakeLists.txt
+++ b/intern/ghost/CMakeLists.txt
@@ -27,9 +27,9 @@
set(INC
.
../string
- ../../extern/glew/include
../../source/blender/imbuf
../../source/blender/makesdna
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
@@ -118,6 +118,11 @@ if(APPLE)
endif()
elseif(UNIX)
+
+ if(WITH_X11_XINPUT)
+ add_definitions(-DWITH_X11_XINPUT)
+ endif()
+
list(APPEND INC ${X11_X11_INCLUDE_PATH})
list(APPEND SRC
@@ -132,7 +137,9 @@ elseif(UNIX)
intern/GHOST_WindowX11.h
)
- add_definitions(-DPREFIX="${CMAKE_INSTALL_PREFIX}")
+ if(NOT WITH_INSTALL_PORTABLE)
+ add_definitions(-DPREFIX="${CMAKE_INSTALL_PREFIX}")
+ endif()
if(X11_XF86keysym_INCLUDE_PATH)
add_definitions(-DWITH_XF86KEYSYM)
diff --git a/intern/ghost/GHOST_C-api.h b/intern/ghost/GHOST_C-api.h
index d6a592e04e6..18a806278fe 100644
--- a/intern/ghost/GHOST_C-api.h
+++ b/intern/ghost/GHOST_C-api.h
@@ -263,7 +263,16 @@ extern int GHOST_DispatchEvents(GHOST_SystemHandle systemhandle);
*/
extern GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle,
GHOST_EventConsumerHandle consumerhandle);
-
+
+/**
+ * Remove the given event consumer to our list.
+ * @param systemhandle The handle to the system
+ * @param consumerhandle The event consumer to remove.
+ * @return Indication of success.
+ */
+extern GHOST_TSuccess GHOST_RemoveEventConsumer(GHOST_SystemHandle systemhandle,
+ GHOST_EventConsumerHandle consumerhandle);
+
/***************************************************************************************
** Progress bar functionality
***************************************************************************************/
diff --git a/intern/ghost/GHOST_IEvent.h b/intern/ghost/GHOST_IEvent.h
index aac732a83b7..0c718261a59 100644
--- a/intern/ghost/GHOST_IEvent.h
+++ b/intern/ghost/GHOST_IEvent.h
@@ -34,6 +34,7 @@
#ifndef _GHOST_IEVENT_H_
#define _GHOST_IEVENT_H_
+#include <stddef.h>
#include "GHOST_Types.h"
#include "GHOST_IWindow.h"
#include "intern/GHOST_ModifierKeys.h"
diff --git a/intern/ghost/GHOST_ISystem.h b/intern/ghost/GHOST_ISystem.h
index 0cfe643fd71..6047e24356e 100644
--- a/intern/ghost/GHOST_ISystem.h
+++ b/intern/ghost/GHOST_ISystem.h
@@ -297,7 +297,14 @@ public:
* @return Indication of success.
*/
virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer) = 0;
-
+
+ /**
+ * Removes the given event consumer to our list.
+ * @param consumer The event consumer to remove.
+ * @return Indication of success.
+ */
+ virtual GHOST_TSuccess removeEventConsumer(GHOST_IEventConsumer* consumer) = 0;
+
/***************************************************************************************
** N-degree of freedom device management functionality
***************************************************************************************/
diff --git a/intern/ghost/SConscript b/intern/ghost/SConscript
index 7aedc08ce96..b67545f216a 100644
--- a/intern/ghost/SConscript
+++ b/intern/ghost/SConscript
@@ -21,7 +21,8 @@ if window_system in ('linux2', 'openbsd3', 'sunos5', 'freebsd7', 'freebsd8', 'fr
sources.remove('intern' + os.sep + f + 'Carbon.cpp')
except ValueError:
pass
- defs += ['PREFIX=\\"/usr/local/\\"']
+ defs += ['PREFIX=\\"/usr/local/\\"'] # XXX, make an option
+ defs += ['WITH_X11_XINPUT'] # XXX, make an option
elif window_system in ('win32-vc', 'win32-mingw', 'cygwin', 'linuxcross', 'win64-vc'):
for f in pf:
diff --git a/intern/ghost/intern/GHOST_C-api.cpp b/intern/ghost/intern/GHOST_C-api.cpp
index 8fa6dbe7e6a..092b131ec57 100644
--- a/intern/ghost/intern/GHOST_C-api.cpp
+++ b/intern/ghost/intern/GHOST_C-api.cpp
@@ -286,6 +286,13 @@ GHOST_TSuccess GHOST_AddEventConsumer(GHOST_SystemHandle systemhandle, GHOST_Eve
return system->addEventConsumer((GHOST_CallbackEventConsumer*)consumerhandle);
}
+GHOST_TSuccess GHOST_RemoveEventConsumer(GHOST_SystemHandle systemhandle, GHOST_EventConsumerHandle consumerhandle)
+{
+ GHOST_ISystem* system = (GHOST_ISystem*) systemhandle;
+
+ return system->removeEventConsumer((GHOST_CallbackEventConsumer*)consumerhandle);
+}
+
GHOST_TSuccess GHOST_SetProgressBar(GHOST_WindowHandle windowhandle,float progress)
{
GHOST_IWindow* window = (GHOST_IWindow*) windowhandle;
diff --git a/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp b/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp
index da567bc4901..30d9aa31207 100644
--- a/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp
+++ b/intern/ghost/intern/GHOST_DisplayManagerWin32.cpp
@@ -28,15 +28,8 @@
/** \file ghost/intern/GHOST_DisplayManagerWin32.cpp
* \ingroup GHOST
- */
-
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date September 21, 2001
+ * \author Maarten Gribnau
+ * \date September 21, 2001
*/
#include "GHOST_DisplayManagerWin32.h"
diff --git a/intern/ghost/intern/GHOST_System.cpp b/intern/ghost/intern/GHOST_System.cpp
index a23188e52af..13f06aa2fe9 100644
--- a/intern/ghost/intern/GHOST_System.cpp
+++ b/intern/ghost/intern/GHOST_System.cpp
@@ -28,15 +28,8 @@
/** \file ghost/intern/GHOST_System.cpp
* \ingroup GHOST
- */
-
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date May 7, 2001
+ * \author Maarten Gribnau
+ * \date May 7, 2001
*/
#include "GHOST_System.h"
@@ -146,10 +139,10 @@ GHOST_TSuccess GHOST_System::beginFullScreen(const GHOST_DisplaySetting& setting
if (!m_windowManager->getFullScreen()) {
m_displayManager->getCurrentDisplaySetting(GHOST_DisplayManager::kMainDisplay, m_preFullScreenSetting);
- //GHOST_PRINT("GHOST_System::beginFullScreen(): activating new display settings\n");
+ //GHOST_PRINT("GHOST_System::beginFullScreen(): activating new display settings\n");
success = m_displayManager->setCurrentDisplaySetting(GHOST_DisplayManager::kMainDisplay, setting);
if (success == GHOST_kSuccess) {
- //GHOST_PRINT("GHOST_System::beginFullScreen(): creating full-screen window\n");
+ //GHOST_PRINT("GHOST_System::beginFullScreen(): creating full-screen window\n");
success = createFullScreenWindow((GHOST_Window**)window, stereoVisual);
if (success == GHOST_kSuccess) {
m_windowManager->beginFullScreen(*window, stereoVisual);
@@ -172,11 +165,11 @@ GHOST_TSuccess GHOST_System::endFullScreen(void)
GHOST_TSuccess success = GHOST_kFailure;
GHOST_ASSERT(m_windowManager, "GHOST_System::endFullScreen(): invalid window manager")
if (m_windowManager->getFullScreen()) {
- //GHOST_IWindow* window = m_windowManager->getFullScreenWindow();
- //GHOST_PRINT("GHOST_System::endFullScreen(): leaving window manager full-screen mode\n");
+ //GHOST_IWindow* window = m_windowManager->getFullScreenWindow();
+ //GHOST_PRINT("GHOST_System::endFullScreen(): leaving window manager full-screen mode\n");
success = m_windowManager->endFullScreen();
GHOST_ASSERT(m_displayManager, "GHOST_System::endFullScreen(): invalid display manager")
- //GHOST_PRINT("GHOST_System::endFullScreen(): leaving full-screen mode\n");
+ //GHOST_PRINT("GHOST_System::endFullScreen(): leaving full-screen mode\n");
success = m_displayManager->setCurrentDisplaySetting(GHOST_DisplayManager::kMainDisplay, m_preFullScreenSetting);
}
else {
@@ -226,6 +219,17 @@ GHOST_TSuccess GHOST_System::addEventConsumer(GHOST_IEventConsumer* consumer)
return success;
}
+GHOST_TSuccess GHOST_System::removeEventConsumer(GHOST_IEventConsumer* consumer)
+{
+ GHOST_TSuccess success;
+ if (m_eventManager) {
+ success = m_eventManager->removeConsumer(consumer);
+ }
+ else {
+ success = GHOST_kFailure;
+ }
+ return success;
+}
GHOST_TSuccess GHOST_System::beginRecord(FILE *file)
{
@@ -267,14 +271,14 @@ GHOST_TSuccess GHOST_System::pushEvent(GHOST_IEvent* event)
}
int GHOST_System::openNDOF(GHOST_IWindow* w,
- GHOST_NDOFLibraryInit_fp setNdofLibraryInit,
- GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown,
- GHOST_NDOFDeviceOpen_fp setNdofDeviceOpen)
+ GHOST_NDOFLibraryInit_fp setNdofLibraryInit,
+ GHOST_NDOFLibraryShutdown_fp setNdofLibraryShutdown,
+ GHOST_NDOFDeviceOpen_fp setNdofDeviceOpen)
{
- return m_ndofManager->deviceOpen(w,
- setNdofLibraryInit,
- setNdofLibraryShutdown,
- setNdofDeviceOpen);
+ return m_ndofManager->deviceOpen(w,
+ setNdofLibraryInit,
+ setNdofLibraryShutdown,
+ setNdofDeviceOpen);
}
@@ -308,7 +312,7 @@ GHOST_TSuccess GHOST_System::init()
m_timerManager = new GHOST_TimerManager ();
m_windowManager = new GHOST_WindowManager ();
m_eventManager = new GHOST_EventManager ();
- m_ndofManager = new GHOST_NDOFManager();
+ m_ndofManager = new GHOST_NDOFManager();
#if 0
if(m_ndofManager)
@@ -351,10 +355,10 @@ GHOST_TSuccess GHOST_System::exit()
delete m_eventManager;
m_eventManager = 0;
}
- if (m_ndofManager) {
- delete m_ndofManager;
- m_ndofManager = 0;
- }
+ if (m_ndofManager) {
+ delete m_ndofManager;
+ m_ndofManager = 0;
+ }
return GHOST_kSuccess;
}
@@ -367,7 +371,7 @@ GHOST_TSuccess GHOST_System::createFullScreenWindow(GHOST_Window** window, const
success = m_displayManager->getCurrentDisplaySetting(GHOST_DisplayManager::kMainDisplay, settings);
if (success) {
- //GHOST_PRINT("GHOST_System::createFullScreenWindow(): creating full-screen window\n");
+ //GHOST_PRINT("GHOST_System::createFullScreenWindow(): creating full-screen window\n");
*window = (GHOST_Window*)createWindow(
STR_String (""),
0, 0, settings.xPixels, settings.yPixels,
diff --git a/intern/ghost/intern/GHOST_System.h b/intern/ghost/intern/GHOST_System.h
index 198dc6b3f8b..20f9f7a8227 100644
--- a/intern/ghost/intern/GHOST_System.h
+++ b/intern/ghost/intern/GHOST_System.h
@@ -183,7 +183,12 @@ public:
*/
virtual GHOST_TSuccess addEventConsumer(GHOST_IEventConsumer* consumer);
-
+ /**
+ * Remove the given event consumer to our list.
+ * @param consumer The event consumer to remove.
+ * @return Indication of success.
+ */
+ virtual GHOST_TSuccess removeEventConsumer(GHOST_IEventConsumer* consumer);
/***************************************************************************************
** N-degree of freedom devcice management functionality
diff --git a/intern/ghost/intern/GHOST_SystemPathsX11.cpp b/intern/ghost/intern/GHOST_SystemPathsX11.cpp
index f38b2c99867..dd8935732c5 100644
--- a/intern/ghost/intern/GHOST_SystemPathsX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemPathsX11.cpp
@@ -43,11 +43,6 @@
#include <stdio.h> // for fprintf only
#include <cstdlib> // for exit
-#ifndef PREFIX
-# define PREFIX "/usr/local"
-#endif
-
-
using namespace std;
GHOST_SystemPathsX11::GHOST_SystemPathsX11()
@@ -60,12 +55,17 @@ GHOST_SystemPathsX11::~GHOST_SystemPathsX11()
const GHOST_TUns8* GHOST_SystemPathsX11::getSystemDir() const
{
+ /* no prefix assumes a portable build which only uses bundled scripts */
+#ifdef PREFIX
return (GHOST_TUns8*) PREFIX "/share";
+#else
+ return NULL;
+#endif
}
const GHOST_TUns8* GHOST_SystemPathsX11::getUserDir() const
{
- char* env = getenv("HOME");
+ const char* env = getenv("HOME");
if(env) {
return (GHOST_TUns8*) env;
} else {
diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp
index b1c79247265..dc16711b532 100644
--- a/intern/ghost/intern/GHOST_SystemWin32.cpp
+++ b/intern/ghost/intern/GHOST_SystemWin32.cpp
@@ -56,7 +56,7 @@
#ifdef WIN32
#ifndef GWL_USERDATA
#define GWL_USERDATA GWLP_USERDATA
-#define GWL_WNDPROC GWLP_WNDPROC
+#define GWL_WNDPROC GWLP_WNDPROC
#endif
#endif
@@ -154,6 +154,18 @@
#define VK_MEDIA_PLAY_PAUSE 0xB3
#endif // VK_MEDIA_PLAY_PAUSE
+/*
+ Initiates WM_INPUT messages from keyboard
+ That way GHOST can retrieve true keys
+*/
+GHOST_TInt32 GHOST_SystemWin32::initKeyboardRawInput(void)
+{
+ RAWINPUTDEVICE device = {0};
+ device.usUsagePage = 0x01; /* usUsagePage & usUsage for keyboard*/
+ device.usUsage = 0x06; /* http://msdn.microsoft.com/en-us/windows/hardware/gg487473.aspx */
+
+ return RegisterRawInputDevices(&device, 1, sizeof(device));
+};
GHOST_SystemWin32::GHOST_SystemWin32()
: m_hasPerformanceCounter(false), m_freq(0), m_start(0)
@@ -161,7 +173,7 @@ GHOST_SystemWin32::GHOST_SystemWin32()
m_displayManager = new GHOST_DisplayManagerWin32 ();
GHOST_ASSERT(m_displayManager, "GHOST_SystemWin32::GHOST_SystemWin32(): m_displayManager==0\n");
m_displayManager->initialize();
-
+
// Check if current keyboard layout uses AltGr and save keylayout ID for
// specialized handling if keys like VK_OEM_*. I.e. french keylayout
// generates VK_OEM_8 for their exclamation key (key left of right shift)
@@ -357,19 +369,23 @@ GHOST_TSuccess GHOST_SystemWin32::init()
{
GHOST_TSuccess success = GHOST_System::init();
- for(int i = 0; i < 255; i++) {
- m_prevKeyStatus[i] = false;
- m_curKeyStatus[i] = false;
- }
-
/* Disable scaling on high DPI displays on Vista */
- HMODULE user32 = ::LoadLibraryA("user32.dll");
+ user32 = ::LoadLibraryA("user32.dll");
typedef BOOL (WINAPI * LPFNSETPROCESSDPIAWARE)();
LPFNSETPROCESSDPIAWARE SetProcessDPIAware =
(LPFNSETPROCESSDPIAWARE)GetProcAddress(user32, "SetProcessDPIAware");
if (SetProcessDPIAware)
SetProcessDPIAware();
- FreeLibrary(user32);
+ #ifdef NEED_RAW_PROC
+ pRegisterRawInputDevices = (LPFNDLLRRID)GetProcAddress(user32, "RegisterRawInputDevices");
+ pGetRawInputData = (LPFNDLLGRID)GetProcAddress(user32, "GetRawInputData");
+ #else
+ FreeLibrary(user32);
+ #endif
+
+ /* Initiates WM_INPUT messages from keyboard */
+ initKeyboardRawInput();
+
// Determine whether this system has a high frequency performance counter. */
m_hasPerformanceCounter = ::QueryPerformanceFrequency((LARGE_INTEGER*)&m_freq) == TRUE;
@@ -402,9 +418,6 @@ GHOST_TSuccess GHOST_SystemWin32::init()
if (::RegisterClass(&wc) == 0) {
success = GHOST_kFailure;
}
-
- // Add low-level keyboard hook for our process.
- m_llKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, s_llKeyboardProc, wc.hInstance, 0);
}
return success;
@@ -413,170 +426,185 @@ GHOST_TSuccess GHOST_SystemWin32::init()
GHOST_TSuccess GHOST_SystemWin32::exit()
{
- // remove our low-level keyboard hook.
- UnhookWindowsHookEx(m_llKeyboardHook);
-
+ #ifdef NEED_RAW_PROC
+ FreeLibrary(user32);
+ #endif
+
return GHOST_System::exit();
}
-void GHOST_SystemWin32::triggerKey(GHOST_IWindow *window, bool down, GHOST_TKey key)
-{
- GHOST_Event *extra = new GHOST_EventKey(getSystem()->getMilliSeconds(), down ? GHOST_kEventKeyDown : GHOST_kEventKeyUp, window, key, '\0');
- ((GHOST_SystemWin32*)getSystem())->pushEvent(extra);
-}
-void GHOST_SystemWin32::handleModifierKeys(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam, GHOST_ModifierKeys &oldModifiers, GHOST_ModifierKeys &newModifiers) const
+GHOST_TKey GHOST_SystemWin32::hardKey(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam, int * keyDown, char * vk)
{
- switch(wParam) {
- case VK_SHIFT:
- {
- bool lchanged = oldModifiers.get(GHOST_kModifierKeyLeftAlt) != newModifiers.get(GHOST_kModifierKeyLeftAlt);
- if(lchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyLeftAlt), GHOST_kKeyLeftAlt);
- } else {
- bool rchanged = oldModifiers.get(GHOST_kModifierKeyRightAlt) != newModifiers.get(GHOST_kModifierKeyRightAlt);
- if (rchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyRightAlt), GHOST_kKeyRightAlt);
- }
- }
- lchanged = oldModifiers.get(GHOST_kModifierKeyLeftControl) != newModifiers.get(GHOST_kModifierKeyLeftControl);
- if(lchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyLeftControl), GHOST_kKeyLeftControl);
- } else {
- bool rchanged = oldModifiers.get(GHOST_kModifierKeyRightControl) != newModifiers.get(GHOST_kModifierKeyRightControl);
- if (rchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyRightControl), GHOST_kKeyRightControl);
- }
- }
- }
- break;
- case VK_CONTROL:
+ unsigned int size = 0;
+ char * data;
+ GHOST_TKey key = GHOST_kKeyUnknown;
+
+
+ if(!keyDown)
+ return GHOST_kKeyUnknown;
+
+ GetRawInputData((HRAWINPUT)lParam, RID_INPUT, 0, &size, sizeof(RAWINPUTHEADER));
+
+
+ if((data = (char*)malloc(size)) &&
+ GetRawInputData((HRAWINPUT)lParam, RID_INPUT, data, &size, sizeof(RAWINPUTHEADER)))
+ {
+ RAWINPUT ri;
+ memcpy(&ri,data,(size < sizeof(ri)) ? size : sizeof(ri));
+
+ if (ri.header.dwType == RIM_TYPEKEYBOARD)
+ {
+ GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem();
+
+ GHOST_ModifierKeys modifiers;
+ system->retrieveModifierKeys(modifiers);
+
+ *keyDown = !(ri.data.keyboard.Flags & RI_KEY_BREAK);
+ key = this->convertKey(window, ri.data.keyboard.VKey, ri.data.keyboard.MakeCode, (ri.data.keyboard.Flags&(RI_KEY_E1|RI_KEY_E0)));
+
+ // extra handling of modifier keys: don't send repeats out from GHOST
+ if(key >= GHOST_kKeyLeftShift && key <= GHOST_kKeyRightAlt)
{
- bool lchanged = oldModifiers.get(GHOST_kModifierKeyLeftAlt) != newModifiers.get(GHOST_kModifierKeyLeftAlt);
- if(lchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyLeftAlt), GHOST_kKeyLeftAlt);
- } else {
- bool rchanged = oldModifiers.get(GHOST_kModifierKeyRightAlt) != newModifiers.get(GHOST_kModifierKeyRightAlt);
- if (rchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyRightAlt), GHOST_kKeyRightAlt);
- }
+ bool changed = false;
+ GHOST_TModifierKeyMask modifier;
+ switch(key) {
+ case GHOST_kKeyLeftShift:
+ {
+ changed = (modifiers.get(GHOST_kModifierKeyLeftShift) != (bool)*keyDown);
+ modifier = GHOST_kModifierKeyLeftShift;
+ }
+ break;
+ case GHOST_kKeyRightShift:
+ {
+ changed = (modifiers.get(GHOST_kModifierKeyRightShift) != (bool)*keyDown);
+ modifier = GHOST_kModifierKeyRightShift;
+ }
+ break;
+ case GHOST_kKeyLeftControl:
+ {
+ changed = (modifiers.get(GHOST_kModifierKeyLeftControl) != (bool)*keyDown);
+ modifier = GHOST_kModifierKeyLeftControl;
+ }
+ break;
+ case GHOST_kKeyRightControl:
+ {
+ changed = (modifiers.get(GHOST_kModifierKeyRightControl) != (bool)*keyDown);
+ modifier = GHOST_kModifierKeyRightControl;
+ }
+ break;
+ case GHOST_kKeyLeftAlt:
+ {
+ changed = (modifiers.get(GHOST_kModifierKeyLeftAlt) != (bool)*keyDown);
+ modifier = GHOST_kModifierKeyLeftAlt;
+ }
+ break;
+ case GHOST_kKeyRightAlt:
+ {
+ changed = (modifiers.get(GHOST_kModifierKeyRightAlt) != (bool)*keyDown);
+ modifier = GHOST_kModifierKeyRightAlt;
+ }
+ break;
+ default: break;
}
- lchanged = oldModifiers.get(GHOST_kModifierKeyLeftShift) != newModifiers.get(GHOST_kModifierKeyLeftShift);
- if(lchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyLeftShift), GHOST_kKeyLeftShift);
- } else {
- bool rchanged = oldModifiers.get(GHOST_kModifierKeyRightShift) != newModifiers.get(GHOST_kModifierKeyRightShift);
- if (rchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyRightShift), GHOST_kKeyRightShift);
- }
+
+ if(changed)
+ {
+ modifiers.set(modifier, (bool)*keyDown);
+ system->storeModifierKeys(modifiers);
}
- }
- break;
- case VK_MENU:
- {
- bool lchanged = oldModifiers.get(GHOST_kModifierKeyLeftShift) != newModifiers.get(GHOST_kModifierKeyLeftShift);
- if(lchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyLeftShift), GHOST_kKeyLeftShift);
- } else {
- bool rchanged = oldModifiers.get(GHOST_kModifierKeyRightShift) != newModifiers.get(GHOST_kModifierKeyRightShift);
- if (rchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyRightShift), GHOST_kKeyRightShift);
- }
- }
- lchanged = oldModifiers.get(GHOST_kModifierKeyLeftControl) != newModifiers.get(GHOST_kModifierKeyLeftControl);
- if(lchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyLeftControl), GHOST_kKeyLeftControl);
- } else {
- bool rchanged = oldModifiers.get(GHOST_kModifierKeyRightControl) != newModifiers.get(GHOST_kModifierKeyRightControl);
- if (rchanged) {
- ((GHOST_SystemWin32*)getSystem())->triggerKey(window, newModifiers.get(GHOST_kModifierKeyRightControl), GHOST_kKeyRightControl);
- }
+ else
+ {
+ key = GHOST_kKeyUnknown;
}
}
- break;
- default:
- break;
- }
+
+
+ if(vk) *vk = ri.data.keyboard.VKey;
+ };
+
+ };
+ free(data);
+
+ return key;
}
//! note: this function can be extended to include other exotic cases as they arise.
// This function was added in response to bug [#25715]
-GHOST_TKey GHOST_SystemWin32::processSpecialKey(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam) const
+GHOST_TKey GHOST_SystemWin32::processSpecialKey(GHOST_IWindow *window, short vKey, short scanCode) const
{
GHOST_TKey key = GHOST_kKeyUnknown;
switch(PRIMARYLANGID(m_langId)) {
case LANG_FRENCH:
- if(wParam==VK_OEM_8) key = GHOST_kKey1; // on 'normal' shift + 1 to create '!' we also get GHOST_kKey1. ASCII will be '!'.
+ if(vKey==VK_OEM_8) key = GHOST_kKeyF13; // oem key; used purely for shortcuts .
break;
}
return key;
}
-GHOST_TKey GHOST_SystemWin32::convertKey(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam) const
+GHOST_TKey GHOST_SystemWin32::convertKey(GHOST_IWindow *window, short vKey, short scanCode, short extend) const
{
- GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem();
- bool isExtended = (lParam&(1<<24))?true:false;
-
GHOST_TKey key;
- GHOST_ModifierKeys oldModifiers, newModifiers;
- system->retrieveModifierKeys(oldModifiers);
- system->getModifierKeys(newModifiers);
-
- //std::cout << wParam << " " << system->m_curKeyStatus[wParam] << " shift pressed: " << system->shiftPressed() << std::endl;
- if ((wParam >= '0') && (wParam <= '9')) {
+ if ((vKey >= '0') && (vKey <= '9')) {
// VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39)
- key = (GHOST_TKey)(wParam - '0' + GHOST_kKey0);
+ key = (GHOST_TKey)(vKey - '0' + GHOST_kKey0);
}
- else if ((wParam >= 'A') && (wParam <= 'Z')) {
+ else if ((vKey >= 'A') && (vKey <= 'Z')) {
// VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A)
- key = (GHOST_TKey)(wParam - 'A' + GHOST_kKeyA);
+ key = (GHOST_TKey)(vKey - 'A' + GHOST_kKeyA);
}
- else if ((wParam >= VK_F1) && (wParam <= VK_F24)) {
- key = (GHOST_TKey)(wParam - VK_F1 + GHOST_kKeyF1);
+ else if ((vKey >= VK_F1) && (vKey <= VK_F24)) {
+ key = (GHOST_TKey)(vKey - VK_F1 + GHOST_kKeyF1);
}
else {
- switch (wParam) {
+ switch (vKey) {
case VK_RETURN:
- key = isExtended?GHOST_kKeyNumpadEnter:GHOST_kKeyEnter;
- break;
-
+ key = (extend)?GHOST_kKeyNumpadEnter : GHOST_kKeyEnter; break;
+
case VK_BACK: key = GHOST_kKeyBackSpace; break;
case VK_TAB: key = GHOST_kKeyTab; break;
case VK_ESCAPE: key = GHOST_kKeyEsc; break;
case VK_SPACE: key = GHOST_kKeySpace; break;
- case VK_PRIOR: key = GHOST_kKeyUpPage; break;
- case VK_NEXT: key = GHOST_kKeyDownPage; break;
- case VK_END: key = GHOST_kKeyEnd; break;
+
+ case VK_INSERT:
+ case VK_NUMPAD0:
+ key = (extend) ? GHOST_kKeyInsert : GHOST_kKeyNumpad0; break;
+ case VK_END:
+ case VK_NUMPAD1:
+ key = (extend) ? GHOST_kKeyEnd : GHOST_kKeyNumpad1; break;
+ case VK_DOWN:
+ case VK_NUMPAD2:
+ key = (extend) ? GHOST_kKeyDownArrow : GHOST_kKeyNumpad2; break;
+ case VK_NEXT:
+ case VK_NUMPAD3:
+ key = (extend) ? GHOST_kKeyDownPage : GHOST_kKeyNumpad3; break;
+ case VK_LEFT:
+ case VK_NUMPAD4:
+ key = (extend) ? GHOST_kKeyLeftArrow : GHOST_kKeyNumpad4; break;
+ case VK_CLEAR:
+ case VK_NUMPAD5:
+ key = (extend) ? GHOST_kKeyUnknown: GHOST_kKeyNumpad5; break;
+ case VK_RIGHT:
+ case VK_NUMPAD6:
+ key = (extend) ? GHOST_kKeyRightArrow : GHOST_kKeyNumpad6; break;
case VK_HOME:
- {
- if(system->m_curKeyStatus[VK_NUMPAD7] && system->shiftPressed())
- key = GHOST_kKeyNumpad7;
- else
- key = GHOST_kKeyHome;
- }
- break;
- case VK_INSERT: key = GHOST_kKeyInsert; break;
- case VK_DELETE: key = GHOST_kKeyDelete; break;
- case VK_LEFT: key = GHOST_kKeyLeftArrow; break;
- case VK_RIGHT: key = GHOST_kKeyRightArrow; break;
- case VK_UP: key = GHOST_kKeyUpArrow; break;
- case VK_DOWN: key = GHOST_kKeyDownArrow; break;
- case VK_NUMPAD0: key = GHOST_kKeyNumpad0; break;
- case VK_NUMPAD1: key = GHOST_kKeyNumpad1; break;
- case VK_NUMPAD2: key = GHOST_kKeyNumpad2; break;
- case VK_NUMPAD3: key = GHOST_kKeyNumpad3; break;
- case VK_NUMPAD4: key = GHOST_kKeyNumpad4; break;
- case VK_NUMPAD5: key = GHOST_kKeyNumpad5; break;
- case VK_NUMPAD6: key = GHOST_kKeyNumpad6; break;
- case VK_NUMPAD7: key = GHOST_kKeyNumpad7; break;
- case VK_NUMPAD8: key = GHOST_kKeyNumpad8; break;
- case VK_NUMPAD9: key = GHOST_kKeyNumpad9; break;
+ case VK_NUMPAD7:
+ key = (extend) ? GHOST_kKeyHome : GHOST_kKeyNumpad7; break;
+ case VK_UP:
+ case VK_NUMPAD8:
+ key = (extend) ? GHOST_kKeyUpArrow : GHOST_kKeyNumpad8; break;
+ case VK_PRIOR:
+ case VK_NUMPAD9:
+ key = (extend) ? GHOST_kKeyUpPage : GHOST_kKeyNumpad9; break;
+ case VK_DECIMAL:
+ case VK_DELETE:
+ key = (extend) ? GHOST_kKeyDelete : GHOST_kKeyNumpadPeriod; break;
+
case VK_SNAPSHOT: key = GHOST_kKeyPrintScreen; break;
case VK_PAUSE: key = GHOST_kKeyPause; break;
- case VK_MULTIPLY: key = GHOST_kKeyNumpadAsterisk; break;
+ case VK_MULTIPLY: key = GHOST_kKeyNumpadAsterisk; break;
case VK_SUBTRACT: key = GHOST_kKeyNumpadMinus; break;
- case VK_DECIMAL: key = GHOST_kKeyNumpadPeriod; break;
case VK_DIVIDE: key = GHOST_kKeyNumpadSlash; break;
case VK_ADD: key = GHOST_kKeyNumpadPlus; break;
@@ -594,59 +622,13 @@ GHOST_TKey GHOST_SystemWin32::convertKey(GHOST_IWindow *window, WPARAM wParam, L
case VK_GR_LESS: key = GHOST_kKeyGrLess; break;
case VK_SHIFT:
- {
- bool lchanged = oldModifiers.get(GHOST_kModifierKeyLeftShift) != newModifiers.get(GHOST_kModifierKeyLeftShift);
- if(lchanged) {
- key = GHOST_kKeyLeftShift;
- } else {
- bool rchanged = oldModifiers.get(GHOST_kModifierKeyRightShift) != newModifiers.get(GHOST_kModifierKeyRightShift);
- if(rchanged) {
- key = GHOST_kKeyRightShift;
- } else {
- key = GHOST_kKeyUnknown;
- }
- }
- }
+ key = (scanCode == 0x36)? GHOST_kKeyRightShift : GHOST_kKeyLeftShift;
break;
case VK_CONTROL:
- {
- bool lchanged = oldModifiers.get(GHOST_kModifierKeyLeftControl) != newModifiers.get(GHOST_kModifierKeyLeftControl);
- if(lchanged) {
- key = GHOST_kKeyLeftControl;
- } else {
- bool rchanged = oldModifiers.get(GHOST_kModifierKeyRightControl) != newModifiers.get(GHOST_kModifierKeyRightControl);
- if(rchanged) {
- key = GHOST_kKeyRightControl;
- } else {
- key = GHOST_kKeyUnknown;
- }
- }
- }
+ key = (extend)? GHOST_kKeyRightControl : GHOST_kKeyLeftControl;
break;
case VK_MENU:
- {
- if(m_hasAltGr && isExtended) {
- // We have here an extended RAlt, which is AltGr. The keyboard driver on Windows sends before this a LControl, so
- // to be able to input characters created with AltGr (normal on German, French, Finnish and other keyboards) we
- // push an extra LControl up event. This ensures we don't have a 'hanging' ctrl event in Blender windowmanager
- // when typing in Text editor or Console.
- GHOST_Event *extra = new GHOST_EventKey(getSystem()->getMilliSeconds(), GHOST_kEventKeyUp, window, GHOST_kKeyLeftControl, '\0');
- ((GHOST_SystemWin32*)getSystem())->pushEvent(extra);
- newModifiers.set(GHOST_kModifierKeyRightControl, false);
- newModifiers.set(GHOST_kModifierKeyLeftControl, false);
- }
- bool lchanged = oldModifiers.get(GHOST_kModifierKeyLeftAlt) != newModifiers.get(GHOST_kModifierKeyLeftAlt);
- if(lchanged) {
- key = GHOST_kKeyLeftAlt;
- } else {
- bool rchanged = oldModifiers.get(GHOST_kModifierKeyRightAlt) != newModifiers.get(GHOST_kModifierKeyRightAlt);
- if(rchanged) {
- key = GHOST_kKeyRightAlt;
- } else {
- key = GHOST_kKeyUnknown;
- }
- }
- }
+ key = (extend)? GHOST_kKeyRightAlt : GHOST_kKeyLeftAlt;
break;
case VK_LWIN:
case VK_RWIN:
@@ -656,7 +638,7 @@ GHOST_TKey GHOST_SystemWin32::convertKey(GHOST_IWindow *window, WPARAM wParam, L
case VK_SCROLL: key = GHOST_kKeyScrollLock; break;
case VK_CAPITAL: key = GHOST_kKeyCapsLock; break;
case VK_OEM_8:
- key = ((GHOST_SystemWin32*)getSystem())->processSpecialKey(window, wParam, lParam);
+ key = ((GHOST_SystemWin32*)getSystem())->processSpecialKey(window, vKey, scanCode);
break;
case VK_MEDIA_PLAY_PAUSE: key = GHOST_kKeyMediaPlay; break;
case VK_MEDIA_STOP: key = GHOST_kKeyMediaStop; break;
@@ -667,7 +649,7 @@ GHOST_TKey GHOST_SystemWin32::convertKey(GHOST_IWindow *window, WPARAM wParam, L
break;
}
}
- ((GHOST_SystemWin32*)getSystem())->storeModifierKeys(newModifiers);
+
return key;
}
@@ -745,21 +727,27 @@ GHOST_EventWheel* GHOST_SystemWin32::processWheelEvent(GHOST_IWindow *window, WP
}
-GHOST_EventKey* GHOST_SystemWin32::processKeyEvent(GHOST_IWindow *window, bool keyDown, WPARAM wParam, LPARAM lParam)
+GHOST_EventKey* GHOST_SystemWin32::processKeyEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam)
{
- GHOST_TKey key = ((GHOST_SystemWin32*)getSystem())->convertKey(window, wParam, lParam);
+ int keyDown=0;
+ char vk;
+ GHOST_SystemWin32 * system = (GHOST_SystemWin32 *)getSystem();
+ GHOST_TKey key = system->hardKey(window, wParam, lParam, &keyDown, &vk);
GHOST_EventKey* event;
if (key != GHOST_kKeyUnknown) {
- MSG keyMsg;
char ascii = '\0';
- /* Eat any character related messages */
- if (::PeekMessage(&keyMsg, NULL, WM_CHAR, WM_SYSDEADCHAR, PM_REMOVE)) {
- ascii = (char) keyMsg.wParam;
-
- }
+ unsigned short utf16[2]={0};
+ BYTE state[256];
+ GetKeyboardState((PBYTE)state);
+
+ if(ToAsciiEx(vk, 0, state, utf16, 0, system->m_keylayout))
+ WideCharToMultiByte(CP_ACP, 0x00000400,
+ (wchar_t*)utf16, 1,
+ (LPSTR) &ascii, 1,
+ NULL,NULL);
- event = new GHOST_EventKey(getSystem()->getMilliSeconds(), keyDown ? GHOST_kEventKeyDown: GHOST_kEventKeyUp, window, key, ascii);
+ event = new GHOST_EventKey(system->getMilliSeconds(), keyDown ? GHOST_kEventKeyDown: GHOST_kEventKeyUp, window, key, ascii);
#ifdef BF_GHOST_DEBUG
std::cout << ascii << std::endl;
@@ -797,53 +785,6 @@ void GHOST_SystemWin32::processMinMaxInfo(MINMAXINFO * minmax)
minmax->ptMinTrackSize.y=240;
}
-/* Note that this function gets *all* key events from the entire system (all
- * threads running in this desktop session. So when getting event here, don't assume
- * it's for Blender. Thus we only do status bookkeeping, so we can check
- * in s_wndProc and processKeyEvent what the real keyboard status is.
- * This is needed for proper handling of shift+numpad keys for instance.
- */
-LRESULT CALLBACK GHOST_SystemWin32::s_llKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
-{
- GHOST_SystemWin32* system = ((GHOST_SystemWin32*)getSystem());
-
- bool down = false;
- if(wParam==WM_KEYDOWN || wParam==WM_SYSKEYDOWN ){
- down = true;
- }
-
- if(nCode!=HC_ACTION)
- return CallNextHookEx(system->m_llKeyboardHook, nCode, wParam, lParam);
-
- KBDLLHOOKSTRUCT &keyb = *(PKBDLLHOOKSTRUCT)(lParam);
- system->m_prevKeyStatus[keyb.vkCode] = system->m_curKeyStatus[keyb.vkCode];
- //std::cout << "ll: " << keyb.vkCode << " " << down << " ||| ";
- if(keyb.flags) {
- if((keyb.flags & LLKHF_EXTENDED) == LLKHF_EXTENDED) {
- //std::cout << "extended ";
- }
- if((keyb.flags & LLKHF_ALTDOWN) == LLKHF_ALTDOWN) {
- //std::cout << "alt ";
- }
- if((keyb.flags & LLKHF_INJECTED)== LLKHF_INJECTED) {
- //std::cout << "injected ";
- }
- if((keyb.flags & LLKHF_UP) == LLKHF_UP) {
- system->m_curKeyStatus[keyb.vkCode] = false;
- //std::cout << "up" << std::endl;
- } else {
- system->m_curKeyStatus[keyb.vkCode] = true;
- //std::cout << "down" << std::endl;
- }
- }
- else {
- system->m_curKeyStatus[keyb.vkCode] = true;
- //std::cout << "down" << std::endl;
- }
-
- return CallNextHookEx(system->m_llKeyboardHook, nCode, wParam, lParam);
-}
-
LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
GHOST_Event* event = 0;
@@ -862,29 +803,22 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
////////////////////////////////////////////////////////////////////////
// Keyboard events, processed
////////////////////////////////////////////////////////////////////////
- case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- event = processKeyEvent(window, true, wParam, lParam);
- if (!event) {
- GHOST_PRINT("GHOST_SystemWin32::wndProc: key event ")
- GHOST_PRINT(msg)
- GHOST_PRINT(" key ignored\n")
- }
- break;
-
- case WM_KEYUP:
- case WM_SYSKEYUP:
- event = processKeyEvent(window, false, wParam, lParam);
+ case WM_INPUT:
+ event = processKeyEvent(window, wParam, lParam);
if (!event) {
GHOST_PRINT("GHOST_SystemWin32::wndProc: key event ")
GHOST_PRINT(msg)
GHOST_PRINT(" key ignored\n")
}
break;
-
////////////////////////////////////////////////////////////////////////
// Keyboard events, ignored
////////////////////////////////////////////////////////////////////////
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
+ case WM_KEYUP:
+ case WM_SYSKEYUP:
+ /* These functions were replaced by WM_INPUT*/
case WM_CHAR:
/* The WM_CHAR message is posted to the window with the keyboard focus when
* a WM_KEYDOWN message is translated by the TranslateMessage function. WM_CHAR
@@ -899,13 +833,21 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
* character (Ö) is generated by typing the dead key for the umlaut character, and
* then typing the O key.
*/
+ break;
case WM_SYSDEADCHAR:
/* The WM_SYSDEADCHAR message is sent to the window with the keyboard focus when
* a WM_SYSKEYDOWN message is translated by the TranslateMessage function.
* WM_SYSDEADCHAR specifies the character code of a system dead key - that is,
* a dead key that is pressed while holding down the alt key.
*/
- break;
+ case WM_SYSCHAR:
+ /* The WM_SYSCHAR message is sent to the window with the keyboard focus when
+ * a WM_SYSCHAR message is translated by the TranslateMessage function.
+ * WM_SYSCHAR specifies the character code of a dead key - that is,
+ * a dead key that is pressed while holding down the alt key.
+ * To prevent the sound, DefWindowProc must be avoided by return
+ */
+ return 0;
////////////////////////////////////////////////////////////////////////
// Tablet events, processed
////////////////////////////////////////////////////////////////////////
@@ -920,19 +862,19 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
// Mouse events, processed
////////////////////////////////////////////////////////////////////////
case WM_LBUTTONDOWN:
- window->registerMouseClickEvent(true);
+ window->registerMouseClickEvent(0);
event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskLeft);
break;
case WM_MBUTTONDOWN:
- window->registerMouseClickEvent(true);
+ window->registerMouseClickEvent(0);
event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskMiddle);
break;
case WM_RBUTTONDOWN:
- window->registerMouseClickEvent(true);
+ window->registerMouseClickEvent(0);
event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskRight);
break;
case WM_XBUTTONDOWN:
- window->registerMouseClickEvent(true);
+ window->registerMouseClickEvent(0);
if ((short) HIWORD(wParam) == XBUTTON1){
event = processButtonEvent(GHOST_kEventButtonDown, window, GHOST_kButtonMaskButton4);
}else if((short) HIWORD(wParam) == XBUTTON2){
@@ -940,19 +882,19 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
}
break;
case WM_LBUTTONUP:
- window->registerMouseClickEvent(false);
+ window->registerMouseClickEvent(1);
event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskLeft);
break;
case WM_MBUTTONUP:
- window->registerMouseClickEvent(false);
+ window->registerMouseClickEvent(1);
event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskMiddle);
break;
case WM_RBUTTONUP:
- window->registerMouseClickEvent(false);
+ window->registerMouseClickEvent(1);
event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskRight);
break;
case WM_XBUTTONUP:
- window->registerMouseClickEvent(false);
+ window->registerMouseClickEvent(1);
if ((short) HIWORD(wParam) == XBUTTON1){
event = processButtonEvent(GHOST_kEventButtonUp, window, GHOST_kButtonMaskButton4);
}else if((short) HIWORD(wParam) == XBUTTON2){
diff --git a/intern/ghost/intern/GHOST_SystemWin32.h b/intern/ghost/intern/GHOST_SystemWin32.h
index c3714b56832..d79b9a22b69 100644
--- a/intern/ghost/intern/GHOST_SystemWin32.h
+++ b/intern/ghost/intern/GHOST_SystemWin32.h
@@ -46,6 +46,93 @@
# define __int64 long long
#endif
+#ifndef WM_INPUT
+#define WM_INPUT 0x00FF
+#endif
+#ifndef RID_INPUT
+#define RID_INPUT 0x10000003
+#endif
+#ifndef RI_KEY_BREAK
+#define RI_KEY_BREAK 0x1
+#endif
+#ifndef RI_KEY_E0
+#define RI_KEY_E0 0x2
+#endif
+#ifndef RI_KEY_E1
+#define RI_KEY_E1 0x4
+#endif
+#ifndef RIM_TYPEMOUSE
+#define RIM_TYPEMOUSE 0x0
+#define RIM_TYPEKEYBOARD 0x1
+#define RIM_TYPEHID 0x2
+
+typedef struct tagRAWINPUTDEVICE {
+ USHORT usUsagePage;
+ USHORT usUsage;
+ DWORD dwFlags;
+ HWND hwndTarget;
+} RAWINPUTDEVICE;
+
+
+
+typedef struct tagRAWINPUTHEADER {
+ DWORD dwType;
+ DWORD dwSize;
+ HANDLE hDevice;
+ WPARAM wParam;
+} RAWINPUTHEADER;
+
+typedef struct tagRAWMOUSE {
+ USHORT usFlags;
+ union {
+ ULONG ulButtons;
+ struct {
+ USHORT usButtonFlags;
+ USHORT usButtonData;
+ };
+ };
+ ULONG ulRawButtons;
+ LONG lLastX;
+ LONG lLastY;
+ ULONG ulExtraInformation;
+} RAWMOUSE;
+
+typedef struct tagRAWKEYBOARD {
+ USHORT MakeCode;
+ USHORT Flags;
+ USHORT Reserved;
+ USHORT VKey;
+ UINT Message;
+ ULONG ExtraInformation;
+} RAWKEYBOARD;
+
+typedef struct tagRAWHID {
+ DWORD dwSizeHid;
+ DWORD dwCount;
+ BYTE bRawData[1];
+} RAWHID;
+
+typedef struct tagRAWINPUT {
+ RAWINPUTHEADER header;
+ union {
+ RAWMOUSE mouse;
+ RAWKEYBOARD keyboard;
+ RAWHID hid;
+ } data;
+} RAWINPUT;
+
+DECLARE_HANDLE(HRAWINPUT);
+#endif
+
+#ifdef FREE_WINDOWS
+#define NEED_RAW_PROC
+typedef BOOL (WINAPI * LPFNDLLRRID)(RAWINPUTDEVICE*,UINT, UINT);
+#define RegisterRawInputDevices(pRawInputDevices, uiNumDevices, cbSize) ((pRegisterRawInputDevices)?pRegisterRawInputDevices(pRawInputDevices, uiNumDevices, cbSize):0)
+
+
+typedef UINT (WINAPI * LPFNDLLGRID)(HRAWINPUT, UINT, LPVOID, PUINT, UINT);
+#define GetRawInputData(hRawInput, uiCommand, pData, pcbSize, cbSizeHeader) ((pGetRawInputData)?pGetRawInputData(hRawInput, uiCommand, pData, pcbSize, cbSizeHeader):(UINT)-1)
+#endif
class GHOST_EventButton;
class GHOST_EventCursor;
@@ -217,27 +304,23 @@ protected:
/**
* Converts raw WIN32 key codes from the wndproc to GHOST keys.
* @param window-> The window for this handling
- * @param wParam The wParam from the wndproc
- * @param lParam The lParam from the wndproc
+ * @param vKey The virtual key from hardKey
+ * @param ScanCode The ScanCode of pressed key (simular to PS/2 Set 1)
+ * @param extend Flag if key is not primerly (left or right)
* @return The GHOST key (GHOST_kKeyUnknown if no match).
*/
- virtual GHOST_TKey convertKey(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam) const;
+ virtual GHOST_TKey convertKey(GHOST_IWindow *window, short vKey, short ScanCode, short extend) const;
/**
- * @param window The window for this handling
+ * Catches raw WIN32 key codes from WM_INPUT in the wndproc.
+ * @param window-> The window for this handling
* @param wParam The wParam from the wndproc
* @param lParam The lParam from the wndproc
- * @param oldModifiers The old modifiers
- * @param newModifiers The new modifiers
- */
- virtual void handleModifierKeys(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam, GHOST_ModifierKeys &oldModifiers, GHOST_ModifierKeys &newModifiers) const;
- /**
- * Immediately push key event for given key
- * @param window The window for this handling
- * @param down Whether we send up or down event
- * @param key The key to send the event for
+ * @param keyDown Pointer flag that specify if a key is down
+ * @param vk Pointer to virtual key
+ * @return The GHOST key (GHOST_kKeyUnknown if no match).
*/
- virtual void triggerKey(GHOST_IWindow *window, bool down, GHOST_TKey key);
+ virtual GHOST_TKey hardKey(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam, int * keyDown, char * vk);
/**
* Creates modifier key event(s) and updates the key data stored locally (m_modifierKeys).
@@ -246,7 +329,7 @@ protected:
* events generated for both keys.
* @param window The window receiving the event (the active window).
*/
- //GHOST_EventKey* processModifierKeys(GHOST_IWindow *window);
+ GHOST_EventKey* processModifierKeys(GHOST_IWindow *window);
/**
* Creates mouse button event.
@@ -281,16 +364,16 @@ protected:
* @param wParam The wParam from the wndproc
* @param lParam The lParam from the wndproc
*/
- static GHOST_EventKey* processKeyEvent(GHOST_IWindow *window, bool keyDown, WPARAM wParam, LPARAM lParam);
+ static GHOST_EventKey* processKeyEvent(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam);
/**
* Process special keys (VK_OEM_*), to see if current key layout
* gives us anything special, like ! on french AZERTY.
* @param window The window receiving the event (the active window).
- * @param wParam The wParam from the wndproc
- * @param lParam The lParam from the wndproc
+ * @param vKey The virtual key from hardKey
+ * @param ScanCode The ScanCode of pressed key (simular to PS/2 Set 1)
*/
- virtual GHOST_TKey processSpecialKey(GHOST_IWindow *window, WPARAM wParam, LPARAM lParam) const;
+ virtual GHOST_TKey processSpecialKey(GHOST_IWindow *window, short vKey, short scanCode) const;
/**
* Creates a window event.
@@ -327,17 +410,12 @@ protected:
* Windows call back routine for our window class.
*/
static LRESULT WINAPI s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
-
+
/**
- * Low-level inspection of keyboard events
+ * Initiates WM_INPUT messages from keyboard
*/
- static LRESULT CALLBACK s_llKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
+ GHOST_TInt32 initKeyboardRawInput(void);
- /**
- * Check if any shiftkey is pressed
- */
- inline virtual bool shiftPressed(void);
-
/** The current state of the modifier keys. */
GHOST_ModifierKeys m_modifierKeys;
/** State variable set at initialization. */
@@ -350,10 +428,17 @@ protected:
bool m_hasAltGr;
/** language identifier. */
WORD m_langId;
- /** holding hook handle for low-level keyboard handling */
- HHOOK m_llKeyboardHook;
- bool m_prevKeyStatus[255]; /* VK_* codes 0x01-0xFF, with 0xFF reserved */
- bool m_curKeyStatus[255]; /* VK_* codes 0x01-0xFF, with 0xFF reserved */
+ /** stores keyboard layout. */
+ HKL m_keylayout;
+
+ /** handle for user32.dll*/
+ HMODULE user32;
+ #ifdef NEED_RAW_PROC
+ /* pointer to RegisterRawInputDevices function */
+ LPFNDLLRRID pRegisterRawInputDevices;
+ /* pointer to GetRawInputData function */
+ LPFNDLLGRID pGetRawInputData;
+ #endif
};
inline void GHOST_SystemWin32::retrieveModifierKeys(GHOST_ModifierKeys& keys) const
@@ -368,15 +453,15 @@ inline void GHOST_SystemWin32::storeModifierKeys(const GHOST_ModifierKeys& keys)
inline void GHOST_SystemWin32::handleKeyboardChange(void)
{
- HKL keylayout = GetKeyboardLayout(0); // get keylayout for current thread
+ m_keylayout = GetKeyboardLayout(0); // get keylayout for current thread
int i;
SHORT s;
// save the language identifier.
- m_langId = LOWORD(keylayout);
+ m_langId = LOWORD(m_keylayout);
for(m_hasAltGr = false, i = 32; i < 256; ++i) {
- s = VkKeyScanEx((char)i, keylayout);
+ s = VkKeyScanEx((char)i, m_keylayout);
// s == -1 means no key that translates passed char code
// high byte contains shift state. bit 2 ctrl pressed, bit 4 alt pressed
// if both are pressed, we have AltGr keycombo on keylayout
@@ -387,10 +472,5 @@ inline void GHOST_SystemWin32::handleKeyboardChange(void)
}
}
-inline bool GHOST_SystemWin32::shiftPressed(void)
-{
- return (m_curKeyStatus[VK_SHIFT] || m_curKeyStatus[VK_RSHIFT] || m_curKeyStatus[VK_LSHIFT]);
-}
-
#endif // _GHOST_SYSTEM_WIN32_H_
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index 09a4d9d4de2..3cacfbae4e6 100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
@@ -76,10 +76,6 @@
#include <stdio.h> // for fprintf only
#include <cstdlib> // for exit
-#ifndef PREFIX
-#error "PREFIX not defined"
-#endif
-
typedef struct NDOFPlatformInfo {
Display *display;
Window window;
diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp
index 9e3ae0f8d4c..5d21edb758d 100644
--- a/intern/ghost/intern/GHOST_WindowWin32.cpp
+++ b/intern/ghost/intern/GHOST_WindowWin32.cpp
@@ -105,6 +105,22 @@ static PIXELFORMATDESCRIPTOR sPreferredFormat = {
0, 0, 0 /* no layer, visible, damage masks */
};
+/* Intel videocards don't work fine with multiple contexts and
+ have to share the same context for all windows.
+ But if we just share context for all windows it could work incorrect
+ with multiple videocards configuration. Suppose, that Intel videocards
+ can't be in multiple-devices configuration. */
+static int is_crappy_intel_card(void)
+{
+ int crappy = 0;
+ const char *vendor = (const char*)glGetString(GL_VENDOR);
+
+ if (strstr(vendor, "Intel"))
+ crappy = 1;
+
+ return crappy;
+}
+
GHOST_WindowWin32::GHOST_WindowWin32(
GHOST_SystemWin32 * system,
const STR_String& title,
@@ -125,6 +141,7 @@ GHOST_WindowWin32::GHOST_WindowWin32(
m_hDC(0),
m_hGlRc(0),
m_hasMouseCaptured(false),
+ m_hasGrabMouse(false),
m_nPressedButtons(0),
m_customCursor(0),
m_wintab(NULL),
@@ -592,7 +609,12 @@ GHOST_TSuccess GHOST_WindowWin32::setOrder(GHOST_TWindowOrder order)
GHOST_TSuccess GHOST_WindowWin32::swapBuffers()
{
- return ::SwapBuffers(m_hDC) == TRUE ? GHOST_kSuccess : GHOST_kFailure;
+ HDC hDC = m_hDC;
+
+ if (is_crappy_intel_card())
+ hDC = ::wglGetCurrentDC();
+
+ return ::SwapBuffers(hDC) == TRUE ? GHOST_kSuccess : GHOST_kFailure;
}
@@ -708,19 +730,45 @@ GHOST_TSuccess GHOST_WindowWin32::installDrawingContext(GHOST_TDrawingContextTyp
// Create the context
m_hGlRc = ::wglCreateContext(m_hDC);
if (m_hGlRc) {
- if (s_firsthGLRc) {
- ::wglCopyContext(s_firsthGLRc, m_hGlRc, GL_ALL_ATTRIB_BITS);
- wglShareLists(s_firsthGLRc, m_hGlRc);
- } else {
- s_firsthGLRc = m_hGlRc;
- }
+ if (::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE) {
+ if (s_firsthGLRc) {
+ if (is_crappy_intel_card()) {
+ if (::wglMakeCurrent(NULL, NULL) == TRUE) {
+ ::wglDeleteContext(m_hGlRc);
+ m_hGlRc = s_firsthGLRc;
+ }
+ else {
+ ::wglDeleteContext(m_hGlRc);
+ m_hGlRc = NULL;
+ }
+ }
+ else {
+ ::wglCopyContext(s_firsthGLRc, m_hGlRc, GL_ALL_ATTRIB_BITS);
+ ::wglShareLists(s_firsthGLRc, m_hGlRc);
+ }
+ }
+ else {
+ s_firsthGLRc = m_hGlRc;
+ }
- success = ::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure;
+ if (m_hGlRc) {
+ success = ::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure;
+ }
+ else {
+ success = GHOST_kFailure;
+ }
+ }
+ else {
+ success = GHOST_kFailure;
+ }
}
else {
- printf("Failed to get a context....\n");
success = GHOST_kFailure;
}
+
+ if (success == GHOST_kFailure) {
+ printf("Failed to get a context....\n");
+ }
}
else
{
@@ -744,18 +792,44 @@ GHOST_TSuccess GHOST_WindowWin32::installDrawingContext(GHOST_TDrawingContextTyp
// Create the context
m_hGlRc = ::wglCreateContext(m_hDC);
if (m_hGlRc) {
- if (s_firsthGLRc) {
- ::wglShareLists(s_firsthGLRc, m_hGlRc);
- } else {
- s_firsthGLRc = m_hGlRc;
- }
+ if (::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE) {
+ if (s_firsthGLRc) {
+ if (is_crappy_intel_card()) {
+ if (::wglMakeCurrent(NULL, NULL) == TRUE) {
+ ::wglDeleteContext(m_hGlRc);
+ m_hGlRc = s_firsthGLRc;
+ }
+ else {
+ ::wglDeleteContext(m_hGlRc);
+ m_hGlRc = NULL;
+ }
+ }
+ else {
+ ::wglShareLists(s_firsthGLRc, m_hGlRc);
+ }
+ }
+ else {
+ s_firsthGLRc = m_hGlRc;
+ }
- success = ::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure;
+ if (m_hGlRc) {
+ success = ::wglMakeCurrent(m_hDC, m_hGlRc) == TRUE ? GHOST_kSuccess : GHOST_kFailure;
+ }
+ else {
+ success = GHOST_kFailure;
+ }
+ }
+ else {
+ success = GHOST_kFailure;
+ }
}
else {
- printf("Failed to get a context....\n");
success = GHOST_kFailure;
}
+
+ if (success == GHOST_kFailure) {
+ printf("Failed to get a context....\n");
+ }
// Attempt to enable multisample
if (m_multisample && WGL_ARB_multisample && !m_multisampleEnabled)
@@ -831,28 +905,34 @@ GHOST_TSuccess GHOST_WindowWin32::removeDrawingContext()
void GHOST_WindowWin32::lostMouseCapture()
{
- if (m_hasMouseCaptured) {
- m_hasMouseCaptured = false;
- m_nPressedButtons = 0;
- }
+ if(m_hasMouseCaptured)
+ { m_hasGrabMouse = false;
+ m_nPressedButtons = 0;
+ m_hasMouseCaptured = false;
+ };
}
-void GHOST_WindowWin32::registerMouseClickEvent(bool press)
+void GHOST_WindowWin32::registerMouseClickEvent(int press)
{
- if (press) {
- if (!m_hasMouseCaptured) {
+
+ switch(press)
+ {
+ case 0: m_nPressedButtons++; break;
+ case 1: if(m_nPressedButtons) m_nPressedButtons--; break;
+ case 2: m_hasGrabMouse=true; break;
+ case 3: m_hasGrabMouse=false; break;
+ }
+
+ if(!m_nPressedButtons && !m_hasGrabMouse && m_hasMouseCaptured)
+ {
+ ::ReleaseCapture();
+ m_hasMouseCaptured = false;
+ }
+ else if((m_nPressedButtons || m_hasGrabMouse) && !m_hasMouseCaptured)
+ {
::SetCapture(m_hWnd);
m_hasMouseCaptured = true;
- }
- m_nPressedButtons++;
- } else {
- if (m_nPressedButtons) {
- m_nPressedButtons--;
- if (!m_nPressedButtons) {
- ::ReleaseCapture();
- m_hasMouseCaptured = false;
- }
- }
+
}
}
@@ -924,7 +1004,7 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCursorGrab(GHOST_TGrabCursorMode mode
if(mode == GHOST_kGrabHide)
setWindowCursorVisibility(false);
}
- registerMouseClickEvent(true);
+ registerMouseClickEvent(2);
}
else {
if (m_cursorGrab==GHOST_kGrabHide) {
@@ -943,7 +1023,7 @@ GHOST_TSuccess GHOST_WindowWin32::setWindowCursorGrab(GHOST_TGrabCursorMode mode
/* Almost works without but important otherwise the mouse GHOST location can be incorrect on exit */
setCursorGrabAccum(0, 0);
m_cursorGrabBounds.m_l= m_cursorGrabBounds.m_r= -1; /* disable */
- registerMouseClickEvent(false);
+ registerMouseClickEvent(3);
}
return GHOST_kSuccess;
diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h
index 42cb25f1542..20212bbc2af 100644
--- a/intern/ghost/intern/GHOST_WindowWin32.h
+++ b/intern/ghost/intern/GHOST_WindowWin32.h
@@ -251,9 +251,13 @@ public:
* for any real button press, controls mouse
* capturing).
*
- * @param press True the event was a button press.
+ * @param press
+ * 0 - mouse pressed
+ * 1 - mouse released
+ * 2 - operator grab
+ * 3 - operator ungrab
*/
- void registerMouseClickEvent(bool press);
+ void registerMouseClickEvent(int press);
/**
* Inform the window that it has lost mouse capture,
@@ -342,6 +346,9 @@ protected:
static HDC s_firstHDC;
/** Flag for if window has captured the mouse */
bool m_hasMouseCaptured;
+ /** Flag if an operator grabs the mouse with WM_cursor_grab/ungrab()
+ * Multiple grabs must be realesed with a single ungrab*/
+ bool m_hasGrabMouse;
/** Count of number of pressed buttons */
int m_nPressedButtons;
/** HCURSOR structure of the custom cursor */
diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp
index 890c40f6f11..aea5b5156d9 100644
--- a/intern/ghost/intern/GHOST_WindowX11.cpp
+++ b/intern/ghost/intern/GHOST_WindowX11.cpp
@@ -439,7 +439,9 @@ GHOST_WindowX11(
setTitle(title);
+#ifdef WITH_X11_XINPUT
initXInputDevices();
+#endif
// now set up the rendering context.
if (installDrawingContext(type) == GHOST_kSuccess) {
@@ -453,6 +455,7 @@ GHOST_WindowX11(
XFlush(m_display);
}
+#ifdef WITH_X11_XINPUT
/*
Dummy function to get around IO Handler exiting if device invalid
Basically it will not crash blender now if you have a X device that
@@ -493,6 +496,7 @@ static bool match_token(const char *haystack, const char *needle)
return FALSE;
}
+
/* Determining if an X device is a Tablet style device is an imperfect science.
** We rely on common conventions around device names as well as the type reported
** by Wacom tablets. This code will likely need to be expanded for alternate tablet types
@@ -652,8 +656,9 @@ void GHOST_WindowX11::initXInputDevices()
}
XFree(version);
}
-}
+}
+#endif /* WITH_X11_XINPUT */
Window
GHOST_WindowX11::
@@ -1275,14 +1280,16 @@ GHOST_WindowX11::
if (m_custom_cursor) {
XFreeCursor(m_display, m_custom_cursor);
}
-
+
+#ifdef WITH_X11_XINPUT
/* close tablet devices */
if(m_xtablet.StylusDevice)
XCloseDevice(m_display, m_xtablet.StylusDevice);
if(m_xtablet.EraserDevice)
XCloseDevice(m_display, m_xtablet.EraserDevice);
-
+#endif /* WITH_X11_XINPUT */
+
if (m_context != s_firstContext) {
glXDestroyContext(m_display, m_context);
}
diff --git a/intern/guardedalloc/MEM_guardedalloc.h b/intern/guardedalloc/MEM_guardedalloc.h
index 8038a1fa0b7..07ff5d3241d 100644
--- a/intern/guardedalloc/MEM_guardedalloc.h
+++ b/intern/guardedalloc/MEM_guardedalloc.h
@@ -61,7 +61,7 @@
#ifndef MEM_MALLOCN_H
#define MEM_MALLOCN_H
-#include "stdio.h" /* needed for FILE* */
+#include <stdio.h> /* needed for FILE* */
#include "MEM_sys_types.h" /* needed for uintptr_t */
#ifndef WARN_UNUSED
diff --git a/intern/guardedalloc/intern/mallocn.c b/intern/guardedalloc/intern/mallocn.c
index 17fd16eb8af..60e7f0078d7 100644
--- a/intern/guardedalloc/intern/mallocn.c
+++ b/intern/guardedalloc/intern/mallocn.c
@@ -167,7 +167,7 @@ static void mem_unlock_thread(void)
thread_unlock_callback();
}
-int MEM_check_memory_integrity()
+int MEM_check_memory_integrity(void)
{
const char* err_val = NULL;
MemHead* listend;
@@ -177,7 +177,7 @@ int MEM_check_memory_integrity()
err_val = check_memlist(listend);
- if (err_val == 0) return 0;
+ if (err_val == NULL) return 0;
return 1;
}
@@ -258,7 +258,7 @@ static void make_memhead_header(MemHead *memh, size_t len, const char *str)
memh->tag1 = MEMTAG1;
memh->name = str;
- memh->nextname = 0;
+ memh->nextname = NULL;
memh->len = len;
memh->mmap = 0;
memh->tag2 = MEMTAG2;
@@ -315,7 +315,7 @@ void *MEM_callocN(size_t len, const char *str)
}
mem_unlock_thread();
print_error("Calloc returns null: len=" SIZET_FORMAT " in %s, total %u\n", SIZET_ARG(len), str, mem_in_use);
- return 0;
+ return NULL;
}
/* note; mmap returns zero'd memory */
@@ -339,7 +339,7 @@ void *MEM_mapallocN(size_t len, const char *str)
close(fd);
}
#else
- memh= mmap(0, len+sizeof(MemHead)+sizeof(MemTail),
+ memh= mmap(NULL, len+sizeof(MemHead)+sizeof(MemTail),
PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANON, -1, 0);
#endif
@@ -619,13 +619,14 @@ short _MEM_freeN(void *vmemh, const char *file, int line) /* anders compileerti
error = 2;
MemorY_ErroR(memh->name,"end corrupt");
name = check_memlist(memh);
- if (name != 0){
+ if (name != NULL){
sprintf(str1, "Error in %s on line %d: %s is also corrupt", file, line, name);
if (name != memh->name) MemorY_ErroR(name, str1);
}
} else{
error = -1;
name = check_memlist(memh);
+
if (name == 0) {
sprintf(str1, "Error in %s on line %d: pointer not in memlist", file, line);
MemorY_ErroR("free", str1);
@@ -651,14 +652,14 @@ static void addtail(volatile localListBase *listbase, void *vlink)
{
struct localLink *link= vlink;
- if (link == 0) return;
- if (listbase == 0) return;
+ if (link == NULL) return;
+ if (listbase == NULL) return;
- link->next = 0;
+ link->next = NULL;
link->prev = listbase->last;
if (listbase->last) ((struct localLink *)listbase->last)->next = link;
- if (listbase->first == 0) listbase->first = link;
+ if (listbase->first == NULL) listbase->first = link;
listbase->last = link;
}
@@ -666,8 +667,8 @@ static void remlink(volatile localListBase *listbase, void *vlink)
{
struct localLink *link= vlink;
- if (link == 0) return;
- if (listbase == 0) return;
+ if (link == NULL) return;
+ if (listbase == NULL) return;
if (link->next) link->next->prev = link->prev;
if (link->prev) link->prev->next = link->next;
@@ -713,50 +714,50 @@ static const char *check_memlist(MemHead *memh)
forw = membase->first;
if (forw) forw = MEMNEXT(forw);
- forwok = 0;
+ forwok = NULL;
while(forw){
if (forw->tag1 != MEMTAG1 || forw->tag2 != MEMTAG2) break;
forwok = forw;
if (forw->next) forw = MEMNEXT(forw->next);
- else forw = 0;
+ else forw = NULL;
}
back = (MemHead *) membase->last;
if (back) back = MEMNEXT(back);
- backok = 0;
+ backok = NULL;
while(back){
if (back->tag1 != MEMTAG1 || back->tag2 != MEMTAG2) break;
backok = back;
if (back->prev) back = MEMNEXT(back->prev);
- else back = 0;
+ else back = NULL;
}
if (forw != back) return ("MORE THAN 1 MEMORYBLOCK CORRUPT");
- if (forw == 0 && back == 0){
+ if (forw == NULL && back == NULL){
/* geen foute headers gevonden dan maar op zoek naar memblock*/
forw = membase->first;
if (forw) forw = MEMNEXT(forw);
- forwok = 0;
+ forwok = NULL;
while(forw){
if (forw == memh) break;
if (forw->tag1 != MEMTAG1 || forw->tag2 != MEMTAG2) break;
forwok = forw;
if (forw->next) forw = MEMNEXT(forw->next);
- else forw = 0;
+ else forw = NULL;
}
- if (forw == 0) return (0);
+ if (forw == NULL) return NULL;
back = (MemHead *) membase->last;
if (back) back = MEMNEXT(back);
- backok = 0;
+ backok = NULL;
while(back){
if (back == memh) break;
if (back->tag1 != MEMTAG1 || back->tag2 != MEMTAG2) break;
backok = back;
if (back->prev) back = MEMNEXT(back->prev);
- else back = 0;
+ else back = NULL;
}
}
@@ -771,16 +772,16 @@ static const char *check_memlist(MemHead *memh)
backok->prev = (MemHead *)&forwok->next;
forwok->nextname = backok->name;
} else{
- forwok->next = 0;
+ forwok->next = NULL;
membase->last = (struct localLink *) &forwok->next;
/* membase->last = (struct Link *) &forwok->next; */
}
} else{
if (backok){
- backok->prev = 0;
+ backok->prev = NULL;
membase->first = &backok->next;
} else{
- membase->first = membase->last = 0;
+ membase->first = membase->last = NULL;
}
}
} else{
diff --git a/intern/itasc/Scene.cpp b/intern/itasc/Scene.cpp
index d46e4da7900..0c5e00ec56f 100644
--- a/intern/itasc/Scene.cpp
+++ b/intern/itasc/Scene.cpp
@@ -292,7 +292,7 @@ bool Scene::update(double timestamp, double timestep, unsigned int numsubstep, b
return true;
}
- double maxqdot;
+ // double maxqdot; // UNUSED
e_scalar nlcoef;
SceneLock lockCallback(this);
Frame external_pose;
@@ -454,7 +454,7 @@ bool Scene::update(double timestamp, double timestep, unsigned int numsubstep, b
// We will pass the joint velocity to each object and they will recommend a maximum timestep
timesubstep = timeleft;
// get armature max joint velocity to estimate the maximum duration of integration
- maxqdot = m_qdot.cwise().abs().maxCoeff();
+ // maxqdot = m_qdot.cwise().abs().maxCoeff(); // UNUSED
double maxsubstep = nlcoef*m_maxstep;
if (maxsubstep < m_minstep)
maxsubstep = m_minstep;
diff --git a/intern/memutil/MEM_Allocator.h b/intern/memutil/MEM_Allocator.h
index 9e9ce47c84f..14d62a2434d 100644
--- a/intern/memutil/MEM_Allocator.h
+++ b/intern/memutil/MEM_Allocator.h
@@ -29,6 +29,7 @@
#ifndef MEM_ALLOCATOR_H
#define MEM_ALLOCATOR_H
+#include <stddef.h>
#include "guardedalloc/MEM_guardedalloc.h"
#include "guardedalloc/MEM_sys_types.h"
diff --git a/intern/mikktspace/mikktspace.c b/intern/mikktspace/mikktspace.c
index fcfd5edca8d..c05ada84773 100644
--- a/intern/mikktspace/mikktspace.c
+++ b/intern/mikktspace/mikktspace.c
@@ -243,7 +243,7 @@ tbool genTangSpace(const SMikkTSpaceContext * pContext, const float fAngularThre
int iNrActiveGroups = 0, index = 0;
const int iNrFaces = pContext->m_pInterface->m_getNumFaces(pContext);
tbool bRes = TFALSE;
- const float fThresCos = (const float) cos((fAngularThreshold*M_PI)/180);
+ const float fThresCos = (const float) cos((fAngularThreshold*(float)M_PI)/180.0f);
// verify all call-backs have been set
if( pContext->m_pInterface->m_getNumFaces==NULL ||
@@ -282,7 +282,6 @@ tbool genTangSpace(const SMikkTSpaceContext * pContext, const float fAngularThre
// Mark all degenerate triangles
iTotTris = iNrTrianglesIn;
- iNrTrianglesIn = 0;
iDegenTriangles = 0;
for(t=0; t<iTotTris; t++)
{
@@ -436,9 +435,9 @@ typedef struct
const int g_iCells = 2048;
#ifdef _MSC_VER
-#define NOINLINE __declspec(noinline)
+ #define NOINLINE __declspec(noinline)
#else
-#define NOINLINE __attribute__ ((noinline))
+ #define NOINLINE __attribute__ ((noinline))
#endif
// it is IMPORTANT that this function is called to evaluate the hash since
@@ -446,9 +445,9 @@ const int g_iCells = 2048;
// results for the same effective input value fVal.
NOINLINE int FindGridCell(const float fMin, const float fMax, const float fVal)
{
-const float fIndex = g_iCells * ((fVal-fMin)/(fMax-fMin));
-const int iIndex = fIndex<0?0:((int)fIndex);
-return iIndex<g_iCells?iIndex:(g_iCells-1);
+ const float fIndex = g_iCells * ((fVal-fMin)/(fMax-fMin));
+ const int iIndex = fIndex<0?0:((int)fIndex);
+ return iIndex<g_iCells?iIndex:(g_iCells-1);
}
void MergeVertsFast(int piTriList_in_and_out[], STmpVert pTmpVert[], const SMikkTSpaceContext * pContext, const int iL_in, const int iR_in);
@@ -646,7 +645,7 @@ void MergeVertsFast(int piTriList_in_and_out[], STmpVert pTmpVert[], const SMikk
int iL=iL_in, iR=iR_in;
assert((iR_in-iL_in)>0); // at least 2 entries
- // seperate (by fSep) all points between iL_in and iR_in in pTmpVert[]
+ // separate (by fSep) all points between iL_in and iR_in in pTmpVert[]
while(iL < iR)
{
tbool bReadyLeftSwap = TFALSE, bReadyRightSwap = TFALSE;
diff --git a/intern/opennl/CMakeLists.txt b/intern/opennl/CMakeLists.txt
index 7fbbfa633ce..699d2dec795 100644
--- a/intern/opennl/CMakeLists.txt
+++ b/intern/opennl/CMakeLists.txt
@@ -27,6 +27,10 @@
# External project, better not fix warnings.
remove_strict_flags()
+# remove debug flag here since this is not a blender maintained library
+# and debug gives a lot of prints on UV unwrapping. developers can enable if they need to.
+remove_flag("-DDEBUG")
+
set(INC
extern
superlu
diff --git a/release/datafiles/blenderbuttons b/release/datafiles/blenderbuttons
index 42e82430ca1..9872e53585e 100644
--- a/release/datafiles/blenderbuttons
+++ b/release/datafiles/blenderbuttons
Binary files differ
diff --git a/release/datafiles/splash.png b/release/datafiles/splash.png
index 9207b935271..cad2bc5f06c 100644
--- a/release/datafiles/splash.png
+++ b/release/datafiles/splash.png
Binary files differ
diff --git a/release/freedesktop/blender.desktop b/release/freedesktop/blender.desktop
index ba503f2f62e..34b2b9bb0af 100644
--- a/release/freedesktop/blender.desktop
+++ b/release/freedesktop/blender.desktop
@@ -8,7 +8,7 @@ GenericName[ru]=Редактор 3D-моделей
Comment=3D modeling, animation, rendering and post-production
Comment[es]=modelado 3D, animación, renderizado y post-producción
Exec=blender
-Icon=blender.svg
+Icon=blender
Terminal=false
Type=Application
Categories=Graphics;3DGraphics;
diff --git a/release/scripts/io/add_mesh_torus.py b/release/scripts/io/add_mesh_torus.py
deleted file mode 100644
index f413fe72e4d..00000000000
--- a/release/scripts/io/add_mesh_torus.py
+++ /dev/null
@@ -1,98 +0,0 @@
-
-import bpy, Mathutils
-from math import cos, sin, pi, radians
-
-
-def add_torus(PREF_MAJOR_RAD, PREF_MINOR_RAD, PREF_MAJOR_SEG, PREF_MINOR_SEG):
- Vector = Mathutils.Vector
- Quaternion = Mathutils.Quaternion
-
- PI_2= pi*2
- Z_AXIS = 0,0,1
-
- verts = []
- faces = []
- i1 = 0
- tot_verts = PREF_MAJOR_SEG * PREF_MINOR_SEG
- for major_index in range(PREF_MAJOR_SEG):
- verts_tmp = []
- quat = Quaternion( Z_AXIS, (major_index/PREF_MAJOR_SEG)*PI_2)
-
- for minor_index in range(PREF_MINOR_SEG):
- angle = 2*pi*minor_index/PREF_MINOR_SEG
-
- vec = Vector(PREF_MAJOR_RAD+(cos(angle)*PREF_MINOR_RAD), 0, (sin(angle)*PREF_MINOR_RAD)) * quat
- verts.extend([vec.x, vec.y, vec.z])
-
- if minor_index+1==PREF_MINOR_SEG:
- i2 = (major_index)*PREF_MINOR_SEG
- i3 = i1 + PREF_MINOR_SEG
- i4 = i2 + PREF_MINOR_SEG
-
- else:
- i2 = i1 + 1
- i3 = i1 + PREF_MINOR_SEG
- i4 = i3 + 1
-
- if i2>=tot_verts: i2 = i2-tot_verts
- if i3>=tot_verts: i3 = i3-tot_verts
- if i4>=tot_verts: i4 = i4-tot_verts
-
- # stupid eekadoodle
- if i2: faces.extend( [i1,i3,i4,i2] )
- else: faces.extend( [i2,i1,i3,i4] )
-
- i1+=1
-
- return verts, faces
-
-
-class MESH_OT_primitive_torus_add(bpy.types.Operator):
- '''Add a torus mesh.'''
- __idname__ = "mesh.primitive_torus_add"
- __label__ = "Add Torus"
- __register__ = True
- __undo__ = True
- __props__ = [
- bpy.props.FloatProperty(attr="major_radius", name="Major Radius", description="Number of segments for the main ring of the torus", default= 1.0, min= 0.01, max= 100.0),
- bpy.props.FloatProperty(attr="minor_radius", name="Minor Radius", description="Number of segments for the minor ring of the torus", default= 0.25, min= 0.01, max= 100.0),
- bpy.props.IntProperty(attr="major_segments", name="Major Segments", description="Number of segments for the main ring of the torus", default= 48, min= 3, max= 256),
- bpy.props.IntProperty(attr="minor_segments", name="Minor Segments", description="Number of segments for the minor ring of the torus", default= 16, min= 3, max= 256),
- ]
-
- def execute(self, context):
- verts_loc, faces = add_torus(self.major_radius, self.minor_radius, self.major_segments, self.minor_segments)
-
- me= bpy.data.add_mesh("Torus")
-
- me.add_geometry(int(len(verts_loc)/3), 0, int(len(faces)/4))
- me.verts.foreach_set("co", verts_loc)
- me.faces.foreach_set("verts_raw", faces)
-
- sce = context.scene
-
- # ugh
- for ob in sce.objects:
- ob.selected = False
-
- me.update()
- ob= bpy.data.add_object('MESH', "Torus")
- ob.data= me
- context.scene.add_object(ob)
- context.scene.active_object = ob
- ob.selected = True
-
- ob.location = tuple(context.scene.cursor_location)
-
- return ('FINISHED',)
-
-# Register the operator
-bpy.ops.add(MESH_OT_primitive_torus_add)
-
-# Add to a menu
-import dynamic_menu
-import space_info
-menu_item = dynamic_menu.add(bpy.types.INFO_MT_mesh_add, (lambda self, context: self.layout.itemO("mesh.primitive_torus_add", text="Torus", icon='ICON_MESH_DONUT')) )
-
-if __name__ == "__main__":
- bpy.ops.mesh.primitive_torus_add() \ No newline at end of file
diff --git a/release/scripts/io/export_mdd.py b/release/scripts/io/export_mdd.py
deleted file mode 100644
index b2eda13fc8f..00000000000
--- a/release/scripts/io/export_mdd.py
+++ /dev/null
@@ -1,208 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-# <pep8 compliant>
-
-__author__ = "Bill L.Nieuwendorp"
-__bpydoc__ = """\
-This script Exports Lightwaves MotionDesigner format.
-
-The .mdd format has become quite a popular Pipeline format<br>
-for moving animations from package to package.
-
-Be sure not to use modifiers that change the number or order of verts in the mesh
-"""
-#Please send any fixes,updates,bugs to Slow67_at_Gmail.com or cbarton_at_metavr.com
-#Bill Niewuendorp
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ***** END GPL LICENCE BLOCK *****
-
-import bpy
-import mathutils
-from struct import pack
-
-
-def zero_file(filepath):
- '''
- If a file fails, this replaces it with 1 char, better not remove it?
- '''
- file = open(filepath, 'w')
- file.write('\n') # apparently macosx needs some data in a blank file?
- file.close()
-
-
-def check_vertcount(mesh, vertcount):
- '''
- check and make sure the vertcount is consistent throughout the frame range
- '''
- if len(mesh.vertices) != vertcount:
- raise Exception('Error, number of verts has changed during animation, cannot export')
- f.close()
- zero_file(filepath)
- return
-
-
-def write(filename, sce, ob, PREF_STARTFRAME, PREF_ENDFRAME, PREF_FPS):
- """
- Blender.Window.WaitCursor(1)
-
- mesh_orig = Mesh.New()
- mesh_orig.getFromObject(ob.name)
- """
-
- bpy.ops.object.mode_set(mode='OBJECT')
-
- orig_frame = sce.frame_current
- sce.set_frame(PREF_STARTFRAME)
- me = ob.create_mesh(sce, True, 'PREVIEW')
-
- #Flip y and z
- mat_flip = mathutils.Matrix(\
- [1.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, 1.0],\
- )
-
- numverts = len(me.vertices)
-
- numframes = PREF_ENDFRAME - PREF_STARTFRAME + 1
- PREF_FPS = float(PREF_FPS)
- f = open(filename, 'wb') #no Errors yet:Safe to create file
-
- # Write the header
- f.write(pack(">2i", numframes, numverts))
-
- # Write the frame times (should we use the time IPO??)
- f.write(pack(">%df" % (numframes), *[frame / PREF_FPS for frame in range(numframes)])) # seconds
-
- #rest frame needed to keep frames in sync
- """
- Blender.Set('curframe', PREF_STARTFRAME)
- me_tmp.getFromObject(ob.name)
- """
-
- check_vertcount(me, numverts)
- me.transform(mat_flip * ob.matrix_world)
- f.write(pack(">%df" % (numverts * 3), *[axis for v in me.vertices for axis in v.co]))
-
- for frame in range(PREF_STARTFRAME, PREF_ENDFRAME + 1):#in order to start at desired frame
- """
- Blender.Set('curframe', frame)
- me_tmp.getFromObject(ob.name)
- """
-
- sce.set_frame(frame)
- me = ob.create_mesh(sce, True, 'PREVIEW')
- check_vertcount(me, numverts)
- me.transform(mat_flip * ob.matrix_world)
-
- # Write the vertex data
- f.write(pack(">%df" % (numverts * 3), *[axis for v in me.vertices for axis in v.co]))
-
- """
- me_tmp.vertices= None
- """
- f.close()
-
- print('MDD Exported: %s frames:%d\n' % (filename, numframes - 1))
- """
- Blender.Window.WaitCursor(0)
- Blender.Set('curframe', orig_frame)
- """
- sce.set_frame(orig_frame)
-
-from bpy.props import *
-
-
-class ExportMDD(bpy.types.Operator):
- '''Animated mesh to MDD vertex keyframe file'''
- bl_idname = "export.mdd"
- bl_label = "Export MDD"
-
- # get first scene to get min and max properties for frames, fps
-
- minframe = 1
- maxframe = 300000
- minfps = 1
- maxfps = 120
-
- # List of operator properties, the attributes will be assigned
- # to the class instance from the operator settings before calling.
- filepath = StringProperty(name="File Path", description="Filepath used for exporting the MDD file", maxlen=1024)
- check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
- fps = IntProperty(name="Frames Per Second", description="Number of frames/second", min=minfps, max=maxfps, default=25)
- frame_start = IntProperty(name="Start Frame", description="Start frame for baking", min=minframe, max=maxframe, default=1)
- frame_end = IntProperty(name="End Frame", description="End frame for baking", min=minframe, max=maxframe, default=250)
-
- @classmethod
- def poll(cls, context):
- ob = context.active_object
- return (ob and ob.type == 'MESH')
-
- def execute(self, context):
- filepath = self.properties.filepath
- filepath = bpy.path.ensure_ext(filepath, ".mdd")
-
- write(filepath,
- context.scene,
- context.active_object,
- self.properties.frame_start,
- self.properties.frame_end,
- self.properties.fps,
- )
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- import os
- if not self.properties.is_property_set("filepath"):
- self.properties.filepath = os.path.splitext(bpy.data.filepath)[0] + ".mdd"
-
- context.manager.add_fileselect(self)
- return {'RUNNING_MODAL'}
-
-
-def menu_func(self, context):
- self.layout.operator(ExportMDD.bl_idname, text="Lightwave Point Cache (.mdd)")
-
-
-def register():
- bpy.types.INFO_MT_file_export.append(menu_func)
-
-
-def unregister():
- bpy.types.INFO_MT_file_export.remove(menu_func)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/io/mesh_skin.py b/release/scripts/io/mesh_skin.py
deleted file mode 100644
index f6fafc41111..00000000000
--- a/release/scripts/io/mesh_skin.py
+++ /dev/null
@@ -1,647 +0,0 @@
-# import Blender
-import time, functools
-import bpy
-# from Blender import Window
-from Mathutils import MidpointVecs, Vector
-from Mathutils import AngleBetweenVecs as _AngleBetweenVecs_
-# import BPyMessages
-
-# from Blender.Draw import PupMenu
-
-BIG_NUM = 1<<30
-
-global CULL_METHOD
-CULL_METHOD = 0
-
-def AngleBetweenVecs(a1,a2):
- import math
- try:
- return math.degrees(_AngleBetweenVecs_(a1,a2))
- except:
- return 180.0
-
-class edge(object):
- __slots__ = 'v1', 'v2', 'co1', 'co2', 'length', 'removed', 'match', 'cent', 'angle', 'next', 'prev', 'normal', 'fake'
- def __init__(self, v1,v2):
- self.v1 = v1
- self.v2 = v2
- co1, co2= v1.co, v2.co
- self.co1= co1
- self.co2= co2
-
- # uv1 uv2 vcol1 vcol2 # Add later
- self.length = (co1 - co2).length
- self.removed = 0 # Have we been culled from the eloop
- self.match = None # The other edge were making a face with
-
- self.cent= MidpointVecs(co1, co2)
- self.angle= 0.0
- self.fake= False
-
-class edgeLoop(object):
- __slots__ = 'centre', 'edges', 'normal', 'closed', 'backup_edges'
- def __init__(self, loop, me, closed): # Vert loop
- # Use next and prev, nextDist, prevDist
-
- # Get Loops centre.
- fac= len(loop)
- verts = me.verts
- self.centre= functools.reduce(lambda a,b: a+verts[b].co/fac, loop, Vector())
-
- # Convert Vert loop to Edges.
- self.edges = [edge(verts[loop[vIdx-1]], verts[loop[vIdx]]) for vIdx in range(len(loop))]
-
- if not closed:
- self.edges[0].fake = True # fake edge option
-
- self.closed = closed
-
-
- # Assign linked list
- for eIdx in range(len(self.edges)-1):
- self.edges[eIdx].next = self.edges[eIdx+1]
- self.edges[eIdx].prev = self.edges[eIdx-1]
- # Now last
- self.edges[-1].next = self.edges[0]
- self.edges[-1].prev = self.edges[-2]
-
-
-
- # GENERATE AN AVERAGE NORMAL FOR THE WHOLE LOOP.
- self.normal = Vector()
- for e in self.edges:
- n = (self.centre-e.co1).cross(self.centre-e.co2)
- # Do we realy need tot normalize?
- n.normalize()
- self.normal += n
-
- # Generate the angle
- va= e.cent - e.prev.cent
- vb= e.next.cent - e.cent
-
- e.angle= AngleBetweenVecs(va, vb)
-
- # Blur the angles
- #for e in self.edges:
- # e.angle= (e.angle+e.next.angle)/2
-
- # Blur the angles
- #for e in self.edges:
- # e.angle= (e.angle+e.prev.angle)/2
-
- self.normal.normalize()
-
- # Generate a normal for each edge.
- for e in self.edges:
-
- n1 = e.co1
- n2 = e.co2
- n3 = e.prev.co1
-
- a = n1-n2
- b = n1-n3
- normal1 = a.cross(b)
- normal1.normalize()
-
- n1 = e.co2
- n3 = e.next.co2
- n2 = e.co1
-
- a = n1-n2
- b = n1-n3
-
- normal2 = a.cross(b)
- normal2.normalize()
-
- # Reuse normal1 var
- normal1 += normal1 + normal2
- normal1.normalize()
-
- e.normal = normal1
- #print e.normal
-
-
-
- def backup(self):
- # Keep a backup of the edges
- self.backup_edges = self.edges[:]
-
- def restore(self):
- self.edges = self.backup_edges[:]
- for e in self.edges:
- e.removed = 0
-
- def reverse(self):
- self.edges.reverse()
- self.normal.negate()
-
- for e in self.edges:
- e.normal.negate()
- e.v1, e.v2 = e.v2, e.v1
- e.co1, e.co2 = e.co2, e.co1
- e.next, e.prev = e.prev, e.next
-
-
- def removeSmallest(self, cullNum, otherLoopLen):
- '''
- Removes N Smallest edges and backs up the loop,
- this is so we can loop between 2 loops as if they are the same length,
- backing up and restoring incase the loop needs to be skinned with another loop of a different length.
- '''
- global CULL_METHOD
- if CULL_METHOD == 1: # Shortest edge
- eloopCopy = self.edges[:]
-
- # Length sort, smallest first
- try: eloopCopy.sort(key = lambda e1: e1.length)
- except: eloopCopy.sort(lambda e1, e2: cmp(e1.length, e2.length ))
-
- # Dont use atm
- #eloopCopy.sort(lambda e1, e2: cmp(e1.angle*e1.length, e2.angle*e2.length)) # Length sort, smallest first
- #eloopCopy.sort(lambda e1, e2: cmp(e1.angle, e2.angle)) # Length sort, smallest first
-
- remNum = 0
- for i, e in enumerate(eloopCopy):
- if not e.fake:
- e.removed = 1
- self.edges.remove( e ) # Remove from own list, still in linked list.
- remNum += 1
-
- if not remNum < cullNum:
- break
-
- else: # CULL METHOD is even
-
- culled = 0
-
- step = int(otherLoopLen / float(cullNum)) * 2
-
- currentEdge = self.edges[0]
- while culled < cullNum:
-
- # Get the shortest face in the next STEP
- step_count= 0
- bestAng= 360.0
- smallestEdge= None
- while step_count<=step or smallestEdge==None:
- step_count+=1
- if not currentEdge.removed: # 0 or -1 will not be accepted
- if currentEdge.angle<bestAng and not currentEdge.fake:
- smallestEdge= currentEdge
- bestAng= currentEdge.angle
-
- currentEdge = currentEdge.next
-
- # In that stepping length we have the smallest edge.remove it
- smallestEdge.removed = 1
- self.edges.remove(smallestEdge)
-
- # Start scanning from the edge we found? - result is over fanning- no good.
- #currentEdge= smallestEdge.next
-
- culled+=1
-
-
-# Returns face edges.
-# face must have edge data.
-
-# Utility funcs for 2.5, make into a module??
-def ord_ind(i1,i2):
- if i1<i2: return i1,i2
- return i2,i1
-
-def edge_key(ed):
- v1,v2 = tuple(ed.verts)
- return ord_ind(v1, v2)
-
-def face_edge_keys(f):
- verts = tuple(f.verts)
- if len(verts)==3:
- return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[0])
-
- return ord_ind(verts[0], verts[1]), ord_ind(verts[1], verts[2]), ord_ind(verts[2], verts[3]), ord_ind(verts[3], verts[0])
-
-def mesh_faces_extend(me, faces, mat_idx = 0):
- orig_facetot = len(me.faces)
- new_facetot = len(faces)
- me.add_geometry(0, 0, new_facetot)
- tot = orig_facetot+new_facetot
- me_faces = me.faces
- i= 0
- while i < new_facetot:
-
- f = [v.index for v in faces[i]]
- if len(f)==4 and f[3]==0:
- f = f[1], f[2], f[3], f[0]
-
- mf = me_faces[orig_facetot+i]
- mf.verts_raw = f
- mf.material_index = mat_idx
- i+=1
-# end utils
-
-
-def getSelectedEdges(context, me, ob):
- MESH_MODE= context.scene.tool_settings.mesh_selection_mode
-
- if MESH_MODE in ('EDGE', 'VERTEX'):
- context.scene.tool_settings.mesh_selection_mode = 'EDGE'
- edges= [ ed for ed in me.edges if ed.selected ]
- # print len(edges), len(me.edges)
- context.scene.tool_settings.mesh_selection_mode = MESH_MODE
- return edges
-
- if MESH_MODE == 'FACE':
- context.scene.tool_settings.mesh_selection_mode = 'EDGE'
- # value is [edge, face_sel_user_in]
- edge_dict= dict((edge_key(ed), [ed, 0]) for ed in me.edges)
-
- for f in me.faces:
- if f.sel:
- for edkey in face_edge_keys(f):
- edge_dict[edkey][1] += 1
-
- context.scene.tool_settings.mesh_selection_mode = MESH_MODE
- return [ ed_data[0] for ed_data in edge_dict.itervalues() if ed_data[1] == 1 ]
-
-
-
-def getVertLoops(selEdges, me):
- '''
- return a list of vert loops, closed and open [(loop, closed)...]
- '''
-
- mainVertLoops = []
- # second method
- tot = len(me.verts)
- vert_siblings = [[] for i in range(tot)]
- vert_used = [False] * tot
-
- for ed in selEdges:
- i1, i2 = edge_key(ed)
- vert_siblings[i1].append(i2)
- vert_siblings[i2].append(i1)
-
- # find the first used vert and keep looping.
- for i in range(tot):
- if vert_siblings[i] and not vert_used[i]:
- sbl = vert_siblings[i] # siblings
-
- if len(sbl) > 2:
- return None
-
- vert_used[i] = True
-
- # do an edgeloop seek
- if len(sbl) == 2:
- contextVertLoop= [sbl[0], i, sbl[1]] # start the vert loop
- vert_used[contextVertLoop[ 0]] = True
- vert_used[contextVertLoop[-1]] = True
- else:
- contextVertLoop= [i, sbl[0]]
- vert_used[contextVertLoop[ 1]] = True
-
- # Always seek up
- ok = True
- while ok:
- ok = False
- closed = False
- sbl = vert_siblings[contextVertLoop[-1]]
- if len(sbl) == 2:
- next = sbl[not sbl.index( contextVertLoop[-2] )]
- if vert_used[next]:
- closed = True
- # break
- else:
- contextVertLoop.append( next ) # get the vert that isnt the second last
- vert_used[next] = True
- ok = True
-
- # Seek down as long as the starting vert was not at the edge.
- if not closed and len(vert_siblings[i]) == 2:
-
- ok = True
- while ok:
- ok = False
- sbl = vert_siblings[contextVertLoop[0]]
- if len(sbl) == 2:
- next = sbl[not sbl.index( contextVertLoop[1] )]
- if vert_used[next]:
- closed = True
- else:
- contextVertLoop.insert(0, next) # get the vert that isnt the second last
- vert_used[next] = True
- ok = True
-
- mainVertLoops.append((contextVertLoop, closed))
-
-
- verts = me.verts
- # convert from indicies to verts
- # mainVertLoops = [([verts[i] for i in contextVertLoop], closed) for contextVertLoop, closed in mainVertLoops]
- # print len(mainVertLoops)
- return mainVertLoops
-
-
-
-def skin2EdgeLoops(eloop1, eloop2, me, ob, MODE):
-
- new_faces= [] #
-
- # Make sure e1 loops is bigger then e2
- if len(eloop1.edges) != len(eloop2.edges):
- if len(eloop1.edges) < len(eloop2.edges):
- eloop1, eloop2 = eloop2, eloop1
-
- eloop1.backup() # were about to cull faces
- CULL_FACES = len(eloop1.edges) - len(eloop2.edges)
- eloop1.removeSmallest(CULL_FACES, len(eloop1.edges))
- else:
- CULL_FACES = 0
- # First make sure poly vert loops are in sync with eachother.
-
- # The vector allong which we are skinning.
- skinVector = eloop1.centre - eloop2.centre
-
- loopDist = skinVector.length
-
- # IS THE LOOP FLIPPED, IF SO FLIP BACK. we keep it flipped, its ok,
- if eloop1.closed or eloop2.closed:
- angleBetweenLoopNormals = AngleBetweenVecs(eloop1.normal, eloop2.normal)
- if angleBetweenLoopNormals > 90:
- eloop2.reverse()
-
-
- DIR= eloop1.centre - eloop2.centre
-
- # if eloop2.closed:
- bestEloopDist = BIG_NUM
- bestOffset = 0
- # Loop rotation offset to test.1
- eLoopIdxs = list(range(len(eloop1.edges)))
- for offset in range(len(eloop1.edges)):
- totEloopDist = 0 # Measure this total distance for thsi loop.
-
- offsetIndexLs = eLoopIdxs[offset:] + eLoopIdxs[:offset] # Make offset index list
-
-
- # e1Idx is always from 0uu to N, e2Idx is offset.
- for e1Idx, e2Idx in enumerate(offsetIndexLs):
- e1= eloop1.edges[e1Idx]
- e2= eloop2.edges[e2Idx]
-
-
- # Include fan connections in the measurement.
- OK= True
- while OK or e1.removed:
- OK= False
-
- # Measure the vloop distance ===============
- diff= ((e1.cent - e2.cent).length) #/ nangle1
-
- ed_dir= e1.cent-e2.cent
- a_diff= AngleBetweenVecs(DIR, ed_dir)/18 # 0 t0 18
-
- totEloopDist += (diff * (1+a_diff)) / (1+loopDist)
-
- # Premeture break if where no better off
- if totEloopDist > bestEloopDist:
- break
-
- e1=e1.next
-
- if totEloopDist < bestEloopDist:
- bestOffset = offset
- bestEloopDist = totEloopDist
-
- # Modify V2 LS for Best offset
- eloop2.edges = eloop2.edges[bestOffset:] + eloop2.edges[:bestOffset]
-
- else:
- # Both are open loops, easier to calculate.
-
-
- # Make sure the fake edges are at the start.
- for i, edloop in enumerate((eloop1, eloop2)):
- # print "LOOPO"
- if edloop.edges[0].fake:
- # alredy at the start
- #print "A"
- pass
- elif edloop.edges[-1].fake:
- # put the end at the start
- edloop.edges.insert(0, edloop.edges.pop())
- #print "B"
-
- else:
- for j, ed in enumerate(edloop.edges):
- if ed.fake:
- #print "C"
- edloop.edges = edloop.edges = edloop.edges[j:] + edloop.edges[:j]
- break
- # print "DONE"
- ed1, ed2 = eloop1.edges[0], eloop2.edges[0]
-
- if not ed1.fake or not ed2.fake:
- raise "Error"
-
- # Find the join that isnt flipped (juts like detecting a bow-tie face)
- a1 = (ed1.co1 - ed2.co1).length + (ed1.co2 - ed2.co2).length
- a2 = (ed1.co1 - ed2.co2).length + (ed1.co2 - ed2.co1).length
-
- if a1 > a2:
- eloop2.reverse()
- # make the first edge the start edge still
- eloop2.edges.insert(0, eloop2.edges.pop())
-
-
-
-
- for loopIdx in range(len(eloop2.edges)):
- e1 = eloop1.edges[loopIdx]
- e2 = eloop2.edges[loopIdx]
-
- # Remember the pairs for fan filling culled edges.
- e1.match = e2; e2.match = e1
-
- if not (e1.fake or e2.fake):
- new_faces.append([e1.v1, e1.v2, e2.v2, e2.v1])
-
- # FAN FILL MISSING FACES.
- if CULL_FACES:
- # Culled edges will be in eloop1.
- FAN_FILLED_FACES = 0
-
- contextEdge = eloop1.edges[0] # The larger of teh 2
- while FAN_FILLED_FACES < CULL_FACES:
- while contextEdge.next.removed == 0:
- contextEdge = contextEdge.next
-
- vertFanPivot = contextEdge.match.v2
-
- while contextEdge.next.removed == 1:
- #if not contextEdge.next.fake:
- new_faces.append([contextEdge.next.v1, contextEdge.next.v2, vertFanPivot])
-
- # Should we use another var?, this will work for now.
- contextEdge.next.removed = 1
-
- contextEdge = contextEdge.next
- FAN_FILLED_FACES += 1
-
- # may need to fan fill backwards 1 for non closed loops.
-
- eloop1.restore() # Add culled back into the list.
-
- return new_faces
-
-def main(context):
- global CULL_METHOD
-
- ob = context.object
-
- is_editmode = (ob.mode=='EDIT')
- if is_editmode: bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
- if ob == None or ob.type != 'MESH':
- raise Exception("BPyMessages.Error_NoMeshActive()")
- return
-
- me = ob.data
-
- time1 = time.time()
- selEdges = getSelectedEdges(context, me, ob)
- vertLoops = getVertLoops(selEdges, me) # list of lists of edges.
- if vertLoops == None:
- raise Exception('Error%t|Selection includes verts that are a part of more then 1 loop')
- if is_editmode: bpy.ops.object.mode_set(mode='EDIT', toggle=False)
- return
- # print len(vertLoops)
-
-
- if len(vertLoops) > 2:
- choice = PupMenu('Loft '+str(len(vertLoops))+' edge loops%t|loop|segment')
- if choice == -1:
- if is_editmode: bpy.ops.object.mode_set(mode='EDIT', toggle=False)
- return
-
- elif len(vertLoops) < 2:
- raise Exception('Error%t|No Vertloops found!')
- if is_editmode: bpy.ops.object.mode_set(mode='EDIT', toggle=False)
- return
- else:
- choice = 2
-
-
- # The line below checks if any of the vert loops are differenyt in length.
- if False in [len(v[0]) == len(vertLoops[0][0]) for v in vertLoops]:
- CULL_METHOD = PupMenu('Small to large edge loop distrobution method%t|remove edges evenly|remove smallest edges')
- if CULL_METHOD == -1:
- if is_editmode: Window.EditMode(1)
- return
-
- if CULL_METHOD ==1: # RESET CULL_METHOD
- CULL_METHOD = 0 # shortest
- else:
- CULL_METHOD = 1 # even
-
-
- time1 = time.time()
- # Convert to special edge data.
- edgeLoops = []
- for vloop, closed in vertLoops:
- edgeLoops.append(edgeLoop(vloop, me, closed))
-
-
- # VERT LOOP ORDERING CODE
- # "Build a worm" list - grow from Both ends
- edgeOrderedList = [edgeLoops.pop()]
-
- # Find the closest.
- bestSoFar = BIG_NUM
- bestIdxSoFar = None
- for edLoopIdx, edLoop in enumerate(edgeLoops):
- l =(edgeOrderedList[-1].centre - edLoop.centre).length
- if l < bestSoFar:
- bestIdxSoFar = edLoopIdx
- bestSoFar = l
-
- edgeOrderedList.append( edgeLoops.pop(bestIdxSoFar) )
-
- # Now we have the 2 closest, append to either end-
- # Find the closest.
- while edgeLoops:
- bestSoFar = BIG_NUM
- bestIdxSoFar = None
- first_or_last = 0 # Zero is first
- for edLoopIdx, edLoop in enumerate(edgeLoops):
- l1 =(edgeOrderedList[-1].centre - edLoop.centre).length
-
- if l1 < bestSoFar:
- bestIdxSoFar = edLoopIdx
- bestSoFar = l1
- first_or_last = 1 # last
-
- l2 =(edgeOrderedList[0].centre - edLoop.centre).length
- if l2 < bestSoFar:
- bestIdxSoFar = edLoopIdx
- bestSoFar = l2
- first_or_last = 0 # last
-
- if first_or_last: # add closest Last
- edgeOrderedList.append( edgeLoops.pop(bestIdxSoFar) )
- else: # Add closest First
- edgeOrderedList.insert(0, edgeLoops.pop(bestIdxSoFar) ) # First
-
- faces = []
-
- for i in range(len(edgeOrderedList)-1):
- faces.extend( skin2EdgeLoops(edgeOrderedList[i], edgeOrderedList[i+1], me, ob, 0) )
- if choice == 1 and len(edgeOrderedList) > 2: # Loop
- faces.extend( skin2EdgeLoops(edgeOrderedList[0], edgeOrderedList[-1], me, ob, 0) )
-
- # REMOVE SELECTED FACES.
- MESH_MODE= ob.mode
- if MESH_MODE == 'EDGE' or MESH_MODE == 'VERTEX': pass
- elif MESH_MODE == 'FACE':
- try: me.faces.delete(1, [ f for f in me.faces if f.sel ])
- except: pass
-
- if 1: # 2.5
- mesh_faces_extend(me, faces, ob.active_material_index)
- me.update(calc_edges=True)
- else:
- me.faces.extend(faces, smooth = True)
-
- print('\nSkin done in %.4f sec.' % (time.time()-time1))
-
- if is_editmode: bpy.ops.object.mode_set(mode='EDIT', toggle=False)
-
-
-class MESH_OT_skin(bpy.types.Operator):
- '''Bridge face loops.'''
-
- __idname__ = "mesh.skin"
- __label__ = "Add Torus"
- __register__ = True
- __undo__ = True
-
- '''
- __props__ = [
- bpy.props.EnumProperty(attr="loft_method", items=[(), ()], description="", default= True),
- ]
- '''
-
- def execute(self, context):
- main(context)
- return ('FINISHED',)
-
-
-# Register the operator
-bpy.ops.add(MESH_OT_skin)
-
-# Add to a menu
-import dynamic_menu
-menu_item = dynamic_menu.add(bpy.types.VIEW3D_MT_edit_mesh_faces, (lambda self, context: self.layout.itemO("mesh.skin", text="Bridge Faces")) )
-
-if __name__ == "__main__":
- bpy.ops.mesh.skin()
diff --git a/release/scripts/io/netrender/__init__.py b/release/scripts/io/netrender/__init__.py
deleted file mode 100644
index c77894d4751..00000000000
--- a/release/scripts/io/netrender/__init__.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-# This directory is a Python package.
-
-# To support reload properly, try to access a package var, if it's there, reload everything
-if "init_data" in locals():
- import imp
- imp.reload(model)
- imp.reload(operators)
- imp.reload(client)
- imp.reload(slave)
- imp.reload(master)
- imp.reload(master_html)
- imp.reload(utils)
- imp.reload(balancing)
- imp.reload(ui)
- imp.reload(repath)
- imp.reload(versioning)
-else:
- from . import model
- from . import operators
- from . import client
- from . import slave
- from . import master
- from . import master_html
- from . import utils
- from . import balancing
- from . import ui
- from . import repath
- from . import versioning
-
-jobs = []
-slaves = []
-blacklist = []
-
-init_file = ""
-valid_address = False
-init_data = True
-
-
-def register():
- ui.addProperties()
-
- import bpy
- scene = bpy.context.scene
- if scene:
- netsettings = scene.network_render
- ui.init_data(netsettings)
-
- bpy.utils.register_module(__name__)
-
-
-def unregister():
- import bpy
- del bpy.types.Scene.network_render
-
- bpy.utils.unregister_module(__name__)
diff --git a/release/scripts/io/netrender/balancing.py b/release/scripts/io/netrender/balancing.py
deleted file mode 100644
index dde3ad53084..00000000000
--- a/release/scripts/io/netrender/balancing.py
+++ /dev/null
@@ -1,195 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import time
-
-from netrender.utils import *
-import netrender.model
-
-class RatingRule:
- def __init__(self):
- self.enabled = True
-
- def id(self):
- return str(id(self))
-
- def rate(self, job):
- return 0
-
-class ExclusionRule:
- def __init__(self):
- self.enabled = True
-
- def id(self):
- return str(id(self))
-
- def test(self, job):
- return False
-
-class PriorityRule:
- def __init__(self):
- self.enabled = True
-
- def id(self):
- return str(id(self))
-
- def test(self, job):
- return False
-
-class Balancer:
- def __init__(self):
- self.rules = []
- self.priorities = []
- self.exceptions = []
-
- def ruleByID(self, rule_id):
- for rule in self.rules:
- if rule.id() == rule_id:
- return rule
- for rule in self.priorities:
- if rule.id() == rule_id:
- return rule
- for rule in self.exceptions:
- if rule.id() == rule_id:
- return rule
-
- return None
-
- def addRule(self, rule):
- self.rules.append(rule)
-
- def addPriority(self, priority):
- self.priorities.append(priority)
-
- def addException(self, exception):
- self.exceptions.append(exception)
-
- def applyRules(self, job):
- return sum((rule.rate(job) for rule in self.rules if rule.enabled))
-
- def applyPriorities(self, job):
- for priority in self.priorities:
- if priority.enabled and priority.test(job):
- return True # priorities are first
-
- return False
-
- def applyExceptions(self, job):
- for exception in self.exceptions:
- if exception.enabled and exception.test(job):
- return True # exceptions are last
-
- return False
-
- def sortKey(self, job):
- return (1 if self.applyExceptions(job) else 0, # exceptions after
- 0 if self.applyPriorities(job) else 1, # priorities first
- self.applyRules(job))
-
- def balance(self, jobs):
- if jobs:
- # use inline copy to make sure the list is still accessible while sorting
- jobs[:] = sorted(jobs, key=self.sortKey)
- return jobs[0]
- else:
- return None
-
-# ==========================
-
-class RatingUsage(RatingRule):
- def __str__(self):
- return "Usage per job"
-
- def rate(self, job):
- # less usage is better
- return job.usage / job.priority
-
-class RatingUsageByCategory(RatingRule):
- def __init__(self, get_jobs):
- super().__init__()
- self.getJobs = get_jobs
-
- def __str__(self):
- return "Usage per category"
-
- def rate(self, job):
- total_category_usage = sum([j.usage for j in self.getJobs() if j.category == job.category])
- maximum_priority = max([j.priority for j in self.getJobs() if j.category == job.category])
-
- # less usage is better
- return total_category_usage / maximum_priority
-
-class NewJobPriority(PriorityRule):
- def __init__(self, limit = 1):
- super().__init__()
- self.limit = limit
-
- def setLimit(self, value):
- self.limit = int(value)
-
- def str_limit(self):
- return "less than %i frame%s done" % (self.limit, "s" if self.limit > 1 else "")
-
- def __str__(self):
- return "Priority to new jobs"
-
- def test(self, job):
- return job.countFrames(status = DONE) < self.limit
-
-class MinimumTimeBetweenDispatchPriority(PriorityRule):
- def __init__(self, limit = 10):
- super().__init__()
- self.limit = limit
-
- def setLimit(self, value):
- self.limit = int(value)
-
- def str_limit(self):
- return "more than %i minute%s since last" % (self.limit, "s" if self.limit > 1 else "")
-
- def __str__(self):
- return "Priority to jobs that haven't been dispatched recently"
-
- def test(self, job):
- return job.countFrames(status = DISPATCHED) == 0 and (time.time() - job.last_dispatched) / 60 > self.limit
-
-class ExcludeQueuedEmptyJob(ExclusionRule):
- def __str__(self):
- return "Exclude non queued or empty jobs"
-
- def test(self, job):
- return job.status != JOB_QUEUED or job.countFrames(status = QUEUED) == 0
-
-class ExcludeSlavesLimit(ExclusionRule):
- def __init__(self, count_jobs, count_slaves, limit = 0.75):
- super().__init__()
- self.count_jobs = count_jobs
- self.count_slaves = count_slaves
- self.limit = limit
-
- def setLimit(self, value):
- self.limit = float(value)
-
- def str_limit(self):
- return "more than %.0f%% of all slaves" % (self.limit * 100)
-
- def __str__(self):
- return "Exclude jobs that would use too many slaves"
-
- def test(self, job):
- return not ( self.count_jobs() == 1 or self.count_slaves() <= 1 or float(job.countSlaves() + 1) / self.count_slaves() <= self.limit )
diff --git a/release/scripts/io/netrender/client.py b/release/scripts/io/netrender/client.py
deleted file mode 100644
index bc43b8cfbb7..00000000000
--- a/release/scripts/io/netrender/client.py
+++ /dev/null
@@ -1,372 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import bpy
-import sys, os, re
-import http, http.client, http.server, urllib
-import subprocess, shutil, time, hashlib
-import json
-
-import netrender
-import netrender.model
-import netrender.slave as slave
-import netrender.master as master
-from netrender.utils import *
-
-def addFluidFiles(job, path):
- if os.path.exists(path):
- pattern = re.compile("fluidsurface_(final|preview)_([0-9]+)\.(bobj|bvel)\.gz")
-
- for fluid_file in sorted(os.listdir(path)):
- match = pattern.match(fluid_file)
-
- if match:
- # fluid frames starts at 0, which explains the +1
- # This is stupid
- current_frame = int(match.groups()[1]) + 1
- job.addFile(path + fluid_file, current_frame, current_frame)
-
-def addPointCache(job, ob, point_cache, default_path):
- if not point_cache.use_disk_cache:
- return
-
-
- name = point_cache.name
- if name == "":
- name = "".join(["%02X" % ord(c) for c in ob.name])
-
- cache_path = bpy.path.abspath(point_cache.filepath) if point_cache.use_external else default_path
-
- index = "%02i" % point_cache.index
-
- if os.path.exists(cache_path):
- pattern = re.compile(name + "_([0-9]+)_" + index + "\.bphys")
-
- cache_files = []
-
- for cache_file in sorted(os.listdir(cache_path)):
- match = pattern.match(cache_file)
-
- if match:
- cache_frame = int(match.groups()[0])
- cache_files.append((cache_frame, cache_file))
-
- cache_files.sort()
-
- if len(cache_files) == 1:
- cache_frame, cache_file = cache_files[0]
- job.addFile(cache_path + cache_file, cache_frame, cache_frame)
- else:
- for i in range(len(cache_files)):
- current_item = cache_files[i]
- next_item = cache_files[i+1] if i + 1 < len(cache_files) else None
- previous_item = cache_files[i - 1] if i > 0 else None
-
- current_frame, current_file = current_item
-
- if not next_item and not previous_item:
- job.addFile(cache_path + current_file, current_frame, current_frame)
- elif next_item and not previous_item:
- next_frame = next_item[0]
- job.addFile(cache_path + current_file, current_frame, next_frame - 1)
- elif not next_item and previous_item:
- previous_frame = previous_item[0]
- job.addFile(cache_path + current_file, previous_frame + 1, current_frame)
- else:
- next_frame = next_item[0]
- previous_frame = previous_item[0]
- job.addFile(cache_path + current_file, previous_frame + 1, next_frame - 1)
-
-def fillCommonJobSettings(job, job_name, netsettings):
- job.name = job_name
- job.category = netsettings.job_category
-
- for slave in netrender.blacklist:
- job.blacklist.append(slave.id)
-
- job.chunks = netsettings.chunks
- job.priority = netsettings.priority
-
- if netsettings.job_type == "JOB_BLENDER":
- job.type = netrender.model.JOB_BLENDER
- elif netsettings.job_type == "JOB_PROCESS":
- job.type = netrender.model.JOB_PROCESS
- elif netsettings.job_type == "JOB_VCS":
- job.type = netrender.model.JOB_VCS
-
-def clientSendJob(conn, scene, anim = False):
- netsettings = scene.network_render
- if netsettings.job_type == "JOB_BLENDER":
- return clientSendJobBlender(conn, scene, anim)
- elif netsettings.job_type == "JOB_VCS":
- return clientSendJobVCS(conn, scene, anim)
-
-def clientSendJobVCS(conn, scene, anim = False):
- netsettings = scene.network_render
- job = netrender.model.RenderJob()
-
- if anim:
- for f in range(scene.frame_start, scene.frame_end + 1):
- job.addFrame(f)
- else:
- job.addFrame(scene.frame_current)
-
- filename = bpy.data.filepath
-
- if not filename.startswith(netsettings.vcs_wpath):
- # this is an error, need better way to handle this
- return
-
- filename = filename[len(netsettings.vcs_wpath):]
-
- if filename[0] in (os.sep, os.altsep):
- filename = filename[1:]
-
- print("CREATING VCS JOB", filename)
-
- job.addFile(filename, signed=False)
-
- job_name = netsettings.job_name
- path, name = os.path.split(filename)
- if job_name == "[default]":
- job_name = name
-
-
- fillCommonJobSettings(job, job_name, netsettings)
-
- # VCS Specific code
- job.version_info = netrender.model.VersioningInfo()
- job.version_info.system = netsettings.vcs_system
- job.version_info.wpath = netsettings.vcs_wpath
- job.version_info.rpath = netsettings.vcs_rpath
- job.version_info.revision = netsettings.vcs_revision
-
- # try to send path first
- conn.request("POST", "/job", json.dumps(job.serialize()))
- response = conn.getresponse()
- response.read()
-
- job_id = response.getheader("job-id")
-
- # a VCS job is always good right now, need error handling
-
- return job_id
-
-def clientSendJobBlender(conn, scene, anim = False):
- netsettings = scene.network_render
- job = netrender.model.RenderJob()
-
- if anim:
- for f in range(scene.frame_start, scene.frame_end + 1):
- job.addFrame(f)
- else:
- job.addFrame(scene.frame_current)
-
- filename = bpy.data.filepath
- job.addFile(filename)
-
- job_name = netsettings.job_name
- path, name = os.path.split(filename)
- if job_name == "[default]":
- job_name = name
-
- ###########################
- # LIBRARIES
- ###########################
- for lib in bpy.data.libraries:
- file_path = bpy.path.abspath(lib.filepath)
- if os.path.exists(file_path):
- job.addFile(file_path)
-
- ###########################
- # IMAGES
- ###########################
- for image in bpy.data.images:
- if image.source == "FILE" and not image.packed_file:
- file_path = bpy.path.abspath(image.filepath)
- if os.path.exists(file_path):
- job.addFile(file_path)
-
- tex_path = os.path.splitext(file_path)[0] + ".tex"
- if os.path.exists(tex_path):
- job.addFile(tex_path)
-
- ###########################
- # FLUID + POINT CACHE
- ###########################
- root, ext = os.path.splitext(name)
- default_path = path + os.sep + "blendcache_" + root + os.sep # need an API call for that
-
- for object in bpy.data.objects:
- for modifier in object.modifiers:
- if modifier.type == 'FLUID_SIMULATION' and modifier.settings.type == "DOMAIN":
- addFluidFiles(job, bpy.path.abspath(modifier.settings.filepath))
- elif modifier.type == "CLOTH":
- addPointCache(job, object, modifier.point_cache, default_path)
- elif modifier.type == "SOFT_BODY":
- addPointCache(job, object, modifier.point_cache, default_path)
- elif modifier.type == "SMOKE" and modifier.smoke_type == "TYPE_DOMAIN":
- addPointCache(job, object, modifier.domain_settings.point_cache, default_path)
- elif modifier.type == "MULTIRES" and modifier.is_external:
- file_path = bpy.path.abspath(modifier.filepath)
- job.addFile(file_path)
-
- # particles modifier are stupid and don't contain data
- # we have to go through the object property
- for psys in object.particle_systems:
- addPointCache(job, object, psys.point_cache, default_path)
-
- #print(job.files)
-
- fillCommonJobSettings(job, job_name, netsettings)
-
- # try to send path first
- conn.request("POST", "/job", json.dumps(job.serialize()))
- response = conn.getresponse()
- response.read()
-
- job_id = response.getheader("job-id")
-
- # if not ACCEPTED (but not processed), send files
- if response.status == http.client.ACCEPTED:
- for rfile in job.files:
- f = open(rfile.filepath, "rb")
- conn.request("PUT", fileURL(job_id, rfile.index), f)
- f.close()
- response = conn.getresponse()
- response.read()
-
- # server will reply with ACCEPTED until all files are found
-
- return job_id
-
-def requestResult(conn, job_id, frame):
- conn.request("GET", renderURL(job_id, frame))
-
-class NetworkRenderEngine(bpy.types.RenderEngine):
- bl_idname = 'NET_RENDER'
- bl_label = "Network Render"
- bl_use_postprocess = False
- def render(self, scene):
- if scene.network_render.mode == "RENDER_CLIENT":
- self.render_client(scene)
- elif scene.network_render.mode == "RENDER_SLAVE":
- self.render_slave(scene)
- elif scene.network_render.mode == "RENDER_MASTER":
- self.render_master(scene)
- else:
- print("UNKNOWN OPERATION MODE")
-
- def render_master(self, scene):
- netsettings = scene.network_render
-
- address = "" if netsettings.server_address == "[default]" else netsettings.server_address
-
- master.runMaster((address, netsettings.server_port), netsettings.use_master_broadcast, netsettings.use_master_clear, bpy.path.abspath(netsettings.path), self.update_stats, self.test_break)
-
-
- def render_slave(self, scene):
- slave.render_slave(self, scene.network_render, scene.render.threads)
-
- def render_client(self, scene):
- netsettings = scene.network_render
- self.update_stats("", "Network render client initiation")
-
-
- conn = clientConnection(netsettings.server_address, netsettings.server_port)
-
- if conn:
- # Sending file
-
- self.update_stats("", "Network render exporting")
-
- new_job = False
-
- job_id = netsettings.job_id
-
- # reading back result
-
- self.update_stats("", "Network render waiting for results")
-
-
- requestResult(conn, job_id, scene.frame_current)
- response = conn.getresponse()
- buf = response.read()
-
- if response.status == http.client.NO_CONTENT:
- new_job = True
- netsettings.job_id = clientSendJob(conn, scene)
- job_id = netsettings.job_id
-
- requestResult(conn, job_id, scene.frame_current)
- response = conn.getresponse()
- buf = response.read()
-
- while response.status == http.client.ACCEPTED and not self.test_break():
- time.sleep(1)
- requestResult(conn, job_id, scene.frame_current)
- response = conn.getresponse()
- buf = response.read()
-
- # cancel new jobs (animate on network) on break
- if self.test_break() and new_job:
- conn.request("POST", cancelURL(job_id))
- response = conn.getresponse()
- response.read()
- print( response.status, response.reason )
- netsettings.job_id = 0
-
- if response.status != http.client.OK:
- conn.close()
- return
-
- r = scene.render
- x= int(r.resolution_x*r.resolution_percentage*0.01)
- y= int(r.resolution_y*r.resolution_percentage*0.01)
-
- result_path = os.path.join(bpy.path.abspath(netsettings.path), "output.exr")
-
- folder = os.path.split(result_path)[0]
-
- if not os.path.exists(folder):
- os.mkdir(folder)
-
- f = open(result_path, "wb")
-
- f.write(buf)
-
- f.close()
-
- result = self.begin_result(0, 0, x, y)
- result.load_from_file(result_path)
- self.end_result(result)
-
- conn.close()
-
-def compatible(module):
- module = __import__(module)
- for subclass in module.__dict__.values():
- try: subclass.COMPAT_ENGINES.add('NET_RENDER')
- except: pass
- del module
-
-compatible("properties_world")
-compatible("properties_material")
-compatible("properties_data_mesh")
-compatible("properties_data_camera")
-compatible("properties_texture")
diff --git a/release/scripts/io/netrender/master.py b/release/scripts/io/netrender/master.py
deleted file mode 100644
index 793e3bb51bf..00000000000
--- a/release/scripts/io/netrender/master.py
+++ /dev/null
@@ -1,1079 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import sys, os
-import http, http.client, http.server, urllib, socket, socketserver, threading
-import subprocess, shutil, time, hashlib
-import pickle
-import select # for select.error
-import json
-
-from netrender.utils import *
-import netrender.model
-import netrender.balancing
-import netrender.master_html
-import netrender.thumbnail as thumbnail
-
-class MRenderFile(netrender.model.RenderFile):
- def __init__(self, filepath, index, start, end, signature):
- super().__init__(filepath, index, start, end, signature)
- self.found = False
-
- def test(self):
- self.found = os.path.exists(self.filepath)
- if self.found and self.signature != None:
- found_signature = hashFile(self.filepath)
- self.found = self.signature == found_signature
-
- return self.found
-
-
-class MRenderSlave(netrender.model.RenderSlave):
- def __init__(self, name, address, stats):
- super().__init__()
- self.id = hashlib.md5(bytes(repr(name) + repr(address), encoding='utf8')).hexdigest()
- self.name = name
- self.address = address
- self.stats = stats
- self.last_seen = time.time()
-
- self.job = None
- self.job_frames = []
-
- netrender.model.RenderSlave._slave_map[self.id] = self
-
- def seen(self):
- self.last_seen = time.time()
-
- def finishedFrame(self, frame_number):
- self.job_frames.remove(frame_number)
- if not self.job_frames:
- self.job = None
-
-class MRenderJob(netrender.model.RenderJob):
- def __init__(self, job_id, job_info):
- super().__init__(job_info)
- self.id = job_id
- self.last_dispatched = time.time()
-
- # force one chunk for process jobs
- if self.type == netrender.model.JOB_PROCESS:
- self.chunks = 1
-
- # Force WAITING status on creation
- self.status = JOB_WAITING
-
- # special server properties
- self.last_update = 0
- self.save_path = ""
- self.files = [MRenderFile(rfile.filepath, rfile.index, rfile.start, rfile.end, rfile.signature) for rfile in job_info.files]
-
- def initInfo(self):
- if not self.resolution:
- self.resolution = tuple(getFileInfo(self.files[0].filepath, ["bpy.context.scene.render.resolution_x", "bpy.context.scene.render.resolution_y", "bpy.context.scene.render.resolution_percentage"]))
-
- def save(self):
- if self.save_path:
- f = open(os.path.join(self.save_path, "job.txt"), "w")
- f.write(json.dumps(self.serialize()))
- f.close()
-
- def edit(self, info_map):
- if "status" in info_map:
- self.status = info_map["status"]
-
- if "priority" in info_map:
- self.priority = info_map["priority"]
-
- if "chunks" in info_map:
- self.chunks = info_map["chunks"]
-
- def testStart(self):
- # Don't test files for versionned jobs
- if not self.version_info:
- for f in self.files:
- if not f.test():
- return False
-
- self.start()
- self.initInfo()
- return True
-
- def testFinished(self):
- for f in self.frames:
- if f.status == QUEUED or f.status == DISPATCHED:
- break
- else:
- self.status = JOB_FINISHED
-
- def pause(self, status = None):
- if self.status not in {JOB_PAUSED, JOB_QUEUED}:
- return
-
- if status is None:
- self.status = JOB_PAUSED if self.status == JOB_QUEUED else JOB_QUEUED
- elif status:
- self.status = JOB_QUEUED
- else:
- self.status = JOB_PAUSED
-
- def start(self):
- self.status = JOB_QUEUED
-
- def addLog(self, frames):
- log_name = "_".join(("%06d" % f for f in frames)) + ".log"
- log_path = os.path.join(self.save_path, log_name)
-
- for number in frames:
- frame = self[number]
- if frame:
- frame.log_path = log_path
-
- def addFrame(self, frame_number, command):
- frame = MRenderFrame(frame_number, command)
- self.frames.append(frame)
- return frame
-
- def reset(self, all):
- for f in self.frames:
- f.reset(all)
-
- def getFrames(self):
- frames = []
- for f in self.frames:
- if f.status == QUEUED:
- self.last_dispatched = time.time()
- frames.append(f)
- if len(frames) >= self.chunks:
- break
-
- return frames
-
-class MRenderFrame(netrender.model.RenderFrame):
- def __init__(self, frame, command):
- super().__init__()
- self.number = frame
- self.slave = None
- self.time = 0
- self.status = QUEUED
- self.command = command
-
- self.log_path = None
-
- def reset(self, all):
- if all or self.status == ERROR:
- self.log_path = None
- self.slave = None
- self.time = 0
- self.status = QUEUED
-
-
-# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-file_pattern = re.compile("/file_([a-zA-Z0-9]+)_([0-9]+)")
-render_pattern = re.compile("/render_([a-zA-Z0-9]+)_([0-9]+).exr")
-thumb_pattern = re.compile("/thumb_([a-zA-Z0-9]+)_([0-9]+).jpg")
-log_pattern = re.compile("/log_([a-zA-Z0-9]+)_([0-9]+).log")
-reset_pattern = re.compile("/reset(all|)_([a-zA-Z0-9]+)_([0-9]+)")
-cancel_pattern = re.compile("/cancel_([a-zA-Z0-9]+)")
-pause_pattern = re.compile("/pause_([a-zA-Z0-9]+)")
-edit_pattern = re.compile("/edit_([a-zA-Z0-9]+)")
-
-class RenderHandler(http.server.BaseHTTPRequestHandler):
- def log_message(self, format, *args):
- # override because the original calls self.address_string(), which
- # is extremely slow due to some timeout..
- sys.stderr.write("[%s] %s\n" % (self.log_date_time_string(), format%args))
-
- def getInfoMap(self):
- length = int(self.headers['content-length'])
-
- if length > 0:
- msg = str(self.rfile.read(length), encoding='utf8')
- return json.loads(msg)
- else:
- return {}
-
- def send_head(self, code = http.client.OK, headers = {}, content = "application/octet-stream"):
- self.send_response(code)
- self.send_header("Content-type", content)
-
- for key, value in headers.items():
- self.send_header(key, value)
-
- self.end_headers()
-
- def do_HEAD(self):
-
- if self.path == "/status":
- job_id = self.headers.get('job-id', "")
- job_frame = int(self.headers.get('job-frame', -1))
-
- job = self.server.getJobID(job_id)
- if job:
- frame = job[job_frame]
-
-
- if frame:
- self.send_head(http.client.OK)
- else:
- # no such frame
- self.send_head(http.client.NO_CONTENT)
- else:
- # no such job id
- self.send_head(http.client.NO_CONTENT)
-
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-
- def do_GET(self):
-
- if self.path == "/version":
- self.send_head()
- self.server.stats("", "Version check")
- self.wfile.write(VERSION)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path.startswith("/render"):
- match = render_pattern.match(self.path)
-
- if match:
- job_id = match.groups()[0]
- frame_number = int(match.groups()[1])
-
- job = self.server.getJobID(job_id)
-
- if job:
- frame = job[frame_number]
-
- if frame:
- if frame.status in (QUEUED, DISPATCHED):
- self.send_head(http.client.ACCEPTED)
- elif frame.status == DONE:
- self.server.stats("", "Sending result to client")
-
- filename = os.path.join(job.save_path, "%06d.exr" % frame_number)
-
- f = open(filename, 'rb')
- self.send_head(content = "image/x-exr")
- shutil.copyfileobj(f, self.wfile)
- f.close()
- elif frame.status == ERROR:
- self.send_head(http.client.PARTIAL_CONTENT)
- else:
- # no such frame
- self.send_head(http.client.NO_CONTENT)
- else:
- # no such job id
- self.send_head(http.client.NO_CONTENT)
- else:
- # invalid url
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path.startswith("/thumb"):
- match = thumb_pattern.match(self.path)
-
- if match:
- job_id = match.groups()[0]
- frame_number = int(match.groups()[1])
-
- job = self.server.getJobID(job_id)
-
- if job:
- frame = job[frame_number]
-
- if frame:
- if frame.status in (QUEUED, DISPATCHED):
- self.send_head(http.client.ACCEPTED)
- elif frame.status == DONE:
- filename = os.path.join(job.save_path, "%06d.exr" % frame_number)
-
- thumbname = thumbnail.generate(filename)
-
- if thumbname:
- f = open(thumbname, 'rb')
- self.send_head(content = "image/jpeg")
- shutil.copyfileobj(f, self.wfile)
- f.close()
- else: # thumbnail couldn't be generated
- self.send_head(http.client.PARTIAL_CONTENT)
- return
- elif frame.status == ERROR:
- self.send_head(http.client.PARTIAL_CONTENT)
- else:
- # no such frame
- self.send_head(http.client.NO_CONTENT)
- else:
- # no such job id
- self.send_head(http.client.NO_CONTENT)
- else:
- # invalid url
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path.startswith("/log"):
- match = log_pattern.match(self.path)
-
- if match:
- job_id = match.groups()[0]
- frame_number = int(match.groups()[1])
-
- job = self.server.getJobID(job_id)
-
- if job:
- frame = job[frame_number]
-
- if frame:
- if not frame.log_path or frame.status in (QUEUED, DISPATCHED):
- self.send_head(http.client.PROCESSING)
- else:
- self.server.stats("", "Sending log to client")
- f = open(frame.log_path, 'rb')
-
- self.send_head(content = "text/plain")
-
- shutil.copyfileobj(f, self.wfile)
-
- f.close()
- else:
- # no such frame
- self.send_head(http.client.NO_CONTENT)
- else:
- # no such job id
- self.send_head(http.client.NO_CONTENT)
- else:
- # invalid URL
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/status":
- job_id = self.headers.get('job-id', "")
- job_frame = int(self.headers.get('job-frame', -1))
-
- if job_id:
-
- job = self.server.getJobID(job_id)
- if job:
- if job_frame != -1:
- frame = job[frame]
-
- if frame:
- message = frame.serialize()
- else:
- # no such frame
- self.send_heat(http.client.NO_CONTENT)
- return
- else:
- message = job.serialize()
- else:
- # no such job id
- self.send_head(http.client.NO_CONTENT)
- return
- else: # status of all jobs
- message = []
-
- for job in self.server:
- message.append(job.serialize())
-
-
- self.server.stats("", "Sending status")
- self.send_head()
- self.wfile.write(bytes(json.dumps(message), encoding='utf8'))
-
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/job":
- self.server.balance()
-
- slave_id = self.headers['slave-id']
-
- slave = self.server.getSeenSlave(slave_id)
-
- if slave: # only if slave id is valid
- job, frames = self.server.newDispatch(slave_id)
-
- if job and frames:
- for f in frames:
- print("dispatch", f.number)
- f.status = DISPATCHED
- f.slave = slave
-
- slave.job = job
- slave.job_frames = [f.number for f in frames]
-
- self.send_head(headers={"job-id": job.id})
-
- message = job.serialize(frames)
-
- self.wfile.write(bytes(json.dumps(message), encoding='utf8'))
-
- self.server.stats("", "Sending job to slave")
- else:
- # no job available, return error code
- slave.job = None
- slave.job_frames = []
-
- self.send_head(http.client.ACCEPTED)
- else: # invalid slave id
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path.startswith("/file"):
- match = file_pattern.match(self.path)
-
- if match:
- slave_id = self.headers['slave-id']
- slave = self.server.getSeenSlave(slave_id)
-
- if not slave:
- # invalid slave id
- print("invalid slave id")
-
- job_id = match.groups()[0]
- file_index = int(match.groups()[1])
-
- job = self.server.getJobID(job_id)
-
- if job:
- render_file = job.files[file_index]
-
- if render_file:
- self.server.stats("", "Sending file to slave")
- f = open(render_file.filepath, 'rb')
-
- self.send_head()
- shutil.copyfileobj(f, self.wfile)
-
- f.close()
- else:
- # no such file
- self.send_head(http.client.NO_CONTENT)
- else:
- # no such job id
- self.send_head(http.client.NO_CONTENT)
- else: # invalid url
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/slaves":
- message = []
-
- self.server.stats("", "Sending slaves status")
-
- for slave in self.server.slaves:
- message.append(slave.serialize())
-
- self.send_head()
-
- self.wfile.write(bytes(json.dumps(message), encoding='utf8'))
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- else:
- # hand over the rest to the html section
- netrender.master_html.get(self)
-
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- def do_POST(self):
-
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- if self.path == "/job":
-
- length = int(self.headers['content-length'])
-
- job_info = netrender.model.RenderJob.materialize(json.loads(str(self.rfile.read(length), encoding='utf8')))
-
- job_id = self.server.nextJobID()
-
- job = MRenderJob(job_id, job_info)
-
- for frame in job_info.frames:
- frame = job.addFrame(frame.number, frame.command)
-
- self.server.addJob(job)
-
- headers={"job-id": job_id}
-
- if job.testStart():
- self.server.stats("", "New job, started")
- self.send_head(headers=headers)
- else:
- self.server.stats("", "New job, missing files (%i total)" % len(job.files))
- self.send_head(http.client.ACCEPTED, headers=headers)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path.startswith("/edit"):
- match = edit_pattern.match(self.path)
-
- if match:
- job_id = match.groups()[0]
-
- job = self.server.getJobID(job_id)
-
- if job:
- info_map = self.getInfoMap()
-
- job.edit(info_map)
- self.send_head()
- else:
- # no such job id
- self.send_head(http.client.NO_CONTENT)
- else:
- # invalid url
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/balance_limit":
- info_map = self.getInfoMap()
- for rule_id, limit in info_map.items():
- try:
- rule = self.server.balancer.ruleByID(rule_id)
- if rule:
- rule.setLimit(limit)
- except:
- pass # invalid type
-
- self.send_head()
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/balance_enable":
- info_map = self.getInfoMap()
- for rule_id, enabled in info_map.items():
- rule = self.server.balancer.ruleByID(rule_id)
- if rule:
- rule.enabled = enabled
-
- self.send_head()
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path.startswith("/cancel"):
- match = cancel_pattern.match(self.path)
-
- if match:
- info_map = self.getInfoMap()
- clear = info_map.get("clear", False)
-
- job_id = match.groups()[0]
-
- job = self.server.getJobID(job_id)
-
- if job:
- self.server.stats("", "Cancelling job")
- self.server.removeJob(job, clear)
- self.send_head()
- else:
- # no such job id
- self.send_head(http.client.NO_CONTENT)
- else:
- # invalid url
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path.startswith("/pause"):
- match = pause_pattern.match(self.path)
-
- if match:
- info_map = self.getInfoMap()
- status = info_map.get("status", None)
-
- job_id = match.groups()[0]
-
- job = self.server.getJobID(job_id)
-
- if job:
- self.server.stats("", "Pausing job")
- job.pause(status)
- self.send_head()
- else:
- # no such job id
- self.send_head(http.client.NO_CONTENT)
- else:
- # invalid url
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/clear":
- # cancel all jobs
- info_map = self.getInfoMap()
- clear = info_map.get("clear", False)
-
- self.server.stats("", "Clearing jobs")
- self.server.clear(clear)
-
- self.send_head()
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path.startswith("/reset"):
- match = reset_pattern.match(self.path)
-
- if match:
- all = match.groups()[0] == 'all'
- job_id = match.groups()[1]
- job_frame = int(match.groups()[2])
-
- job = self.server.getJobID(job_id)
-
- if job:
- if job_frame != 0:
-
- frame = job[job_frame]
- if frame:
- self.server.stats("", "Reset job frame")
- frame.reset(all)
- self.send_head()
- else:
- # no such frame
- self.send_head(http.client.NO_CONTENT)
-
- else:
- self.server.stats("", "Reset job")
- job.reset(all)
- self.send_head()
-
- else: # job not found
- self.send_head(http.client.NO_CONTENT)
- else: # invalid url
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/slave":
- length = int(self.headers['content-length'])
- job_frame_string = self.headers['job-frame']
-
- self.server.stats("", "New slave connected")
-
- slave_info = netrender.model.RenderSlave.materialize(json.loads(str(self.rfile.read(length), encoding='utf8')), cache = False)
-
- slave_id = self.server.addSlave(slave_info.name, self.client_address, slave_info.stats)
-
- self.send_head(headers = {"slave-id": slave_id})
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/log":
- length = int(self.headers['content-length'])
-
- log_info = netrender.model.LogFile.materialize(json.loads(str(self.rfile.read(length), encoding='utf8')))
-
- slave_id = log_info.slave_id
-
- slave = self.server.getSeenSlave(slave_id)
-
- if slave: # only if slave id is valid
- job = self.server.getJobID(log_info.job_id)
-
- if job:
- self.server.stats("", "Log announcement")
- job.addLog(log_info.frames)
- self.send_head(http.client.OK)
- else:
- # no such job id
- self.send_head(http.client.NO_CONTENT)
- else: # invalid slave id
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- def do_PUT(self):
-
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- if self.path.startswith("/file"):
- match = file_pattern.match(self.path)
-
- if match:
- self.server.stats("", "Receiving job")
-
- length = int(self.headers['content-length'])
- job_id = match.groups()[0]
- file_index = int(match.groups()[1])
-
- job = self.server.getJobID(job_id)
-
- if job:
-
- render_file = job.files[file_index]
-
- if render_file:
- main_file = job.files[0].filepath # filename of the first file
-
- main_path, main_name = os.path.split(main_file)
-
- if file_index > 0:
- file_path = prefixPath(job.save_path, render_file.filepath, main_path)
- else:
- file_path = os.path.join(job.save_path, main_name)
-
- buf = self.rfile.read(length)
-
- # add same temp file + renames as slave
-
- f = open(file_path, "wb")
- f.write(buf)
- f.close()
- del buf
-
- render_file.filepath = file_path # set the new path
-
- if job.testStart():
- self.server.stats("", "File upload, starting job")
- self.send_head(http.client.OK)
- else:
- self.server.stats("", "File upload, file missings")
- self.send_head(http.client.ACCEPTED)
- else: # invalid file
- print("file not found", job_id, file_index)
- self.send_head(http.client.NO_CONTENT)
- else: # job not found
- print("job not found", job_id, file_index)
- self.send_head(http.client.NO_CONTENT)
- else: # invalid url
- print("no match")
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/render":
- self.server.stats("", "Receiving render result")
-
- # need some message content here or the slave doesn't like it
- self.wfile.write(bytes("foo", encoding='utf8'))
-
- slave_id = self.headers['slave-id']
-
- slave = self.server.getSeenSlave(slave_id)
-
- if slave: # only if slave id is valid
- job_id = self.headers['job-id']
-
- job = self.server.getJobID(job_id)
-
- if job:
- job_frame = int(self.headers['job-frame'])
- job_result = int(self.headers['job-result'])
- job_time = float(self.headers['job-time'])
-
- frame = job[job_frame]
-
- if frame:
- if job.hasRenderResult():
- if job_result == DONE:
- length = int(self.headers['content-length'])
- buf = self.rfile.read(length)
- f = open(os.path.join(job.save_path, "%06d.exr" % job_frame), 'wb')
- f.write(buf)
- f.close()
-
- del buf
- elif job_result == ERROR:
- # blacklist slave on this job on error
- # slaves might already be in blacklist if errors on the whole chunk
- if not slave.id in job.blacklist:
- job.blacklist.append(slave.id)
-
- slave.finishedFrame(job_frame)
-
- frame.status = job_result
- frame.time = job_time
-
- job.testFinished()
-
- self.send_head()
- else: # frame not found
- self.send_head(http.client.NO_CONTENT)
- else: # job not found
- self.send_head(http.client.NO_CONTENT)
- else: # invalid slave id
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/thumb":
- self.server.stats("", "Receiving thumbnail result")
-
- # need some message content here or the slave doesn't like it
- self.wfile.write(bytes("foo", encoding='utf8'))
-
- slave_id = self.headers['slave-id']
-
- slave = self.server.getSeenSlave(slave_id)
-
- if slave: # only if slave id is valid
- job_id = self.headers['job-id']
-
- job = self.server.getJobID(job_id)
-
- if job:
- job_frame = int(self.headers['job-frame'])
-
- frame = job[job_frame]
-
- if frame:
- if job.hasRenderResult():
- length = int(self.headers['content-length'])
- buf = self.rfile.read(length)
- f = open(os.path.join(job.save_path, "%06d.jpg" % job_frame), 'wb')
- f.write(buf)
- f.close()
-
- del buf
-
- else: # frame not found
- self.send_head(http.client.NO_CONTENT)
- else: # job not found
- self.send_head(http.client.NO_CONTENT)
- else: # invalid slave id
- self.send_head(http.client.NO_CONTENT)
- # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path.startswith("/log"):
- self.server.stats("", "Receiving log file")
-
- match = log_pattern.match(self.path)
-
- if match:
- job_id = match.groups()[0]
-
- job = self.server.getJobID(job_id)
-
- if job:
- job_frame = int(match.groups()[1])
-
- frame = job[job_frame]
-
- if frame and frame.log_path:
- length = int(self.headers['content-length'])
- buf = self.rfile.read(length)
- f = open(frame.log_path, 'ab')
- f.write(buf)
- f.close()
-
- del buf
-
- self.server.getSeenSlave(self.headers['slave-id'])
-
- self.send_head()
- else: # frame not found
- self.send_head(http.client.NO_CONTENT)
- else: # job not found
- self.send_head(http.client.NO_CONTENT)
- else: # invalid url
- self.send_head(http.client.NO_CONTENT)
-
-class RenderMasterServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
- def __init__(self, address, handler_class, path, subdir=True):
- super().__init__(address, handler_class)
- self.jobs = []
- self.jobs_map = {}
- self.slaves = []
- self.slaves_map = {}
- self.job_id = 0
-
- if subdir:
- self.path = os.path.join(path, "master_" + str(os.getpid()))
- else:
- self.path = path
-
- self.slave_timeout = 5 # 5 mins: need a parameter for that
-
- self.balancer = netrender.balancing.Balancer()
- self.balancer.addRule(netrender.balancing.RatingUsageByCategory(self.getJobs))
- self.balancer.addRule(netrender.balancing.RatingUsage())
- self.balancer.addException(netrender.balancing.ExcludeQueuedEmptyJob())
- self.balancer.addException(netrender.balancing.ExcludeSlavesLimit(self.countJobs, self.countSlaves, limit = 0.9))
- self.balancer.addPriority(netrender.balancing.NewJobPriority())
- self.balancer.addPriority(netrender.balancing.MinimumTimeBetweenDispatchPriority(limit = 2))
-
- if not os.path.exists(self.path):
- os.mkdir(self.path)
-
- def restore(self, jobs, slaves, balancer = None):
- self.jobs = jobs
- self.jobs_map = {}
-
- for job in self.jobs:
- self.jobs_map[job.id] = job
- self.job_id = max(self.job_id, int(job.id))
-
- self.slaves = slaves
- for slave in self.slaves:
- self.slaves_map[slave.id] = slave
-
- if balancer:
- self.balancer = balancer
-
-
- def nextJobID(self):
- self.job_id += 1
- return str(self.job_id)
-
- def addSlave(self, name, address, stats):
- slave = MRenderSlave(name, address, stats)
- self.slaves.append(slave)
- self.slaves_map[slave.id] = slave
-
- return slave.id
-
- def removeSlave(self, slave):
- self.slaves.remove(slave)
- self.slaves_map.pop(slave.id)
-
- def getSlave(self, slave_id):
- return self.slaves_map.get(slave_id)
-
- def getSeenSlave(self, slave_id):
- slave = self.getSlave(slave_id)
- if slave:
- slave.seen()
-
- return slave
-
- def timeoutSlaves(self):
- removed = []
-
- t = time.time()
-
- for slave in self.slaves:
- if (t - slave.last_seen) / 60 > self.slave_timeout:
- removed.append(slave)
-
- if slave.job:
- for f in slave.job_frames:
- slave.job[f].status = ERROR
-
- for slave in removed:
- self.removeSlave(slave)
-
- def updateUsage(self):
- blend = 0.5
- for job in self.jobs:
- job.usage *= (1 - blend)
-
- if self.slaves:
- slave_usage = blend / self.countSlaves()
-
- for slave in self.slaves:
- if slave.job:
- slave.job.usage += slave_usage
-
-
- def clear(self, clear_files = False):
- removed = self.jobs[:]
-
- for job in removed:
- self.removeJob(job, clear_files)
-
- def balance(self):
- self.balancer.balance(self.jobs)
-
- def getJobs(self):
- return self.jobs
-
- def countJobs(self, status = JOB_QUEUED):
- total = 0
- for j in self.jobs:
- if j.status == status:
- total += 1
-
- return total
-
- def countSlaves(self):
- return len(self.slaves)
-
- def removeJob(self, job, clear_files = False):
- self.jobs.remove(job)
- self.jobs_map.pop(job.id)
-
- if clear_files:
- shutil.rmtree(job.save_path)
-
- for slave in self.slaves:
- if slave.job == job:
- slave.job = None
- slave.job_frames = []
-
- def addJob(self, job):
- self.jobs.append(job)
- self.jobs_map[job.id] = job
-
- # create job directory
- job.save_path = os.path.join(self.path, "job_" + job.id)
- if not os.path.exists(job.save_path):
- os.mkdir(job.save_path)
-
- job.save()
-
- def getJobID(self, id):
- return self.jobs_map.get(id)
-
- def __iter__(self):
- for job in self.jobs:
- yield job
-
- def newDispatch(self, slave_id):
- if self.jobs:
- for job in self.jobs:
- if not self.balancer.applyExceptions(job) and slave_id not in job.blacklist:
- return job, job.getFrames()
-
- return None, None
-
-def clearMaster(path):
- shutil.rmtree(path)
-
-def createMaster(address, clear, path):
- filepath = os.path.join(path, "blender_master.data")
-
- if not clear and os.path.exists(filepath):
- print("loading saved master:", filepath)
- with open(filepath, 'rb') as f:
- path, jobs, slaves = pickle.load(f)
-
- httpd = RenderMasterServer(address, RenderHandler, path, subdir=False)
- httpd.restore(jobs, slaves)
-
- return httpd
-
- return RenderMasterServer(address, RenderHandler, path)
-
-def saveMaster(path, httpd):
- filepath = os.path.join(path, "blender_master.data")
-
- with open(filepath, 'wb') as f:
- pickle.dump((httpd.path, httpd.jobs, httpd.slaves), f, pickle.HIGHEST_PROTOCOL)
-
-def runMaster(address, broadcast, clear, path, update_stats, test_break):
- httpd = createMaster(address, clear, path)
- httpd.timeout = 1
- httpd.stats = update_stats
-
- if broadcast:
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
-
- start_time = time.time() - 2
-
- while not test_break():
- try:
- httpd.handle_request()
- except select.error:
- pass
-
- if time.time() - start_time >= 2: # need constant here
- httpd.timeoutSlaves()
-
- httpd.updateUsage()
-
- if broadcast:
- print("broadcasting address")
- s.sendto(bytes("%i" % address[1], encoding='utf8'), 0, ('<broadcast>', 8000))
- start_time = time.time()
-
- httpd.server_close()
- if clear:
- clearMaster(httpd.path)
- else:
- saveMaster(path, httpd)
-
diff --git a/release/scripts/io/netrender/master_html.py b/release/scripts/io/netrender/master_html.py
deleted file mode 100644
index 877273207a8..00000000000
--- a/release/scripts/io/netrender/master_html.py
+++ /dev/null
@@ -1,315 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import os
-import re
-import shutil
-from netrender.utils import *
-import netrender.model
-
-src_folder = os.path.split(__file__)[0]
-
-def get(handler):
- def output(text):
- handler.wfile.write(bytes(text, encoding='utf8'))
-
- def head(title, refresh = False):
- output("<html><head>")
- if refresh:
- output("<meta http-equiv='refresh' content=5>")
- output("<script src='/html/netrender.js' type='text/javascript'></script>")
-# output("<script src='/html/json2.js' type='text/javascript'></script>")
- output("<title>")
- output(title)
- output("</title></head><body>")
- output("<link rel='stylesheet' href='/html/netrender.css' type='text/css'>")
-
-
- def link(text, url, script=""):
- return "<a href='%s' %s>%s</a>" % (url, script, text)
-
- def tag(name, text, attr=""):
- return "<%s %s>%s</%s>" % (name, attr, text, name)
-
- def startTable(border=1, class_style = None, caption = None):
- output("<table border='%i'" % border)
-
- if class_style:
- output(" class='%s'" % class_style)
-
- output(">")
-
- if caption:
- output("<caption>%s</caption>" % caption)
-
- def headerTable(*headers):
- output("<thead><tr>")
-
- for c in headers:
- output("<td>" + c + "</td>")
-
- output("</tr></thead>")
-
- def rowTable(*data, id = None, class_style = None, extra = None):
- output("<tr")
-
- if id:
- output(" id='%s'" % id)
-
- if class_style:
- output(" class='%s'" % class_style)
-
- if extra:
- output(" %s" % extra)
-
- output(">")
-
- for c in data:
- output("<td>" + str(c) + "</td>")
-
- output("</tr>")
-
- def endTable():
- output("</table>")
-
- def checkbox(title, value, script=""):
- return """<input type="checkbox" title="%s" %s %s>""" % (title, "checked" if value else "", ("onclick=\"%s\"" % script) if script else "")
-
- if handler.path == "/html/netrender.js":
- f = open(os.path.join(src_folder, "netrender.js"), 'rb')
-
- handler.send_head(content = "text/javascript")
- shutil.copyfileobj(f, handler.wfile)
-
- f.close()
- elif handler.path == "/html/netrender.css":
- f = open(os.path.join(src_folder, "netrender.css"), 'rb')
-
- handler.send_head(content = "text/css")
- shutil.copyfileobj(f, handler.wfile)
-
- f.close()
- elif handler.path == "/html" or handler.path == "/":
- handler.send_head(content = "text/html")
- head("NetRender", refresh = True)
-
- output("<h2>Jobs</h2>")
-
- startTable()
- headerTable(
- "&nbsp;",
- "id",
- "name",
- "category",
- "type",
- "chunks",
- "priority",
- "usage",
- "wait",
- "status",
- "length",
- "done",
- "dispatched",
- "error",
- "priority",
- "exception"
- )
-
- handler.server.balance()
-
- for job in handler.server.jobs:
- results = job.framesStatus()
- rowTable(
- """<button title="cancel job" onclick="cancel_job('%s');">X</button>""" % job.id +
- """<button title="pause job" onclick="request('/pause_%s', null);">P</button>""" % job.id +
- """<button title="reset all frames" onclick="request('/resetall_%s_0', null);">R</button>""" % job.id,
- job.id,
- link(job.name, "/html/job" + job.id),
- job.category if job.category else "<i>None</i>",
- netrender.model.JOB_TYPES[job.type],
- str(job.chunks) +
- """<button title="increase chunks size" onclick="request('/edit_%s', &quot;{'chunks': %i}&quot;);">+</button>""" % (job.id, job.chunks + 1) +
- """<button title="decrease chunks size" onclick="request('/edit_%s', &quot;{'chunks': %i}&quot;);" %s>-</button>""" % (job.id, job.chunks - 1, "disabled=True" if job.chunks == 1 else ""),
- str(job.priority) +
- """<button title="increase priority" onclick="request('/edit_%s', &quot;{'priority': %i}&quot;);">+</button>""" % (job.id, job.priority + 1) +
- """<button title="decrease priority" onclick="request('/edit_%s', &quot;{'priority': %i}&quot;);" %s>-</button>""" % (job.id, job.priority - 1, "disabled=True" if job.priority == 1 else ""),
- "%0.1f%%" % (job.usage * 100),
- "%is" % int(time.time() - job.last_dispatched),
- job.statusText(),
- len(job),
- results[DONE],
- results[DISPATCHED],
- str(results[ERROR]) +
- """<button title="reset error frames" onclick="request('/reset_%s_0', null);" %s>R</button>""" % (job.id, "disabled=True" if not results[ERROR] else ""),
- "yes" if handler.server.balancer.applyPriorities(job) else "no",
- "yes" if handler.server.balancer.applyExceptions(job) else "no"
- )
-
- endTable()
-
- output("<h2>Slaves</h2>")
-
- startTable()
- headerTable("name", "address", "last seen", "stats", "job")
-
- for slave in handler.server.slaves:
- rowTable(slave.name, slave.address[0], time.ctime(slave.last_seen), slave.stats, link(slave.job.name, "/html/job" + slave.job.id) if slave.job else "None")
-
- endTable()
-
- output("<h2>Configuration</h2>")
-
- output("""<button title="remove all jobs" onclick="clear_jobs();">CLEAR JOB LIST</button>""")
-
- startTable(caption = "Rules", class_style = "rules")
-
- headerTable("type", "enabled", "description", "limit")
-
- for rule in handler.server.balancer.rules:
- rowTable(
- "rating",
- checkbox("", rule.enabled, "balance_enable('%s', '%s')" % (rule.id(), str(not rule.enabled).lower())),
- rule,
- rule.str_limit() +
- """<button title="edit limit" onclick="balance_edit('%s', '%s');">edit</button>""" % (rule.id(), str(rule.limit)) if hasattr(rule, "limit") else "&nbsp;"
- )
-
- for rule in handler.server.balancer.priorities:
- rowTable(
- "priority",
- checkbox("", rule.enabled, "balance_enable('%s', '%s')" % (rule.id(), str(not rule.enabled).lower())),
- rule,
- rule.str_limit() +
- """<button title="edit limit" onclick="balance_edit('%s', '%s');">edit</button>""" % (rule.id(), str(rule.limit)) if hasattr(rule, "limit") else "&nbsp;"
- )
-
- for rule in handler.server.balancer.exceptions:
- rowTable(
- "exception",
- checkbox("", rule.enabled, "balance_enable('%s', '%s')" % (rule.id(), str(not rule.enabled).lower())),
- rule,
- rule.str_limit() +
- """<button title="edit limit" onclick="balance_edit('%s', '%s');">edit</button>""" % (rule.id(), str(rule.limit)) if hasattr(rule, "limit") else "&nbsp;"
- )
-
- endTable()
-
- output("</body></html>")
-
- elif handler.path.startswith("/html/job"):
- handler.send_head(content = "text/html")
- job_id = handler.path[9:]
-
- head("NetRender")
-
- job = handler.server.getJobID(job_id)
-
- if job:
- output("<h2>Render Information</h2>")
-
- job.initInfo()
-
- startTable()
-
- rowTable("resolution", "%ix%i at %i%%" % job.resolution)
-
- endTable()
-
-
- if job.type == netrender.model.JOB_BLENDER:
- output("<h2>Files</h2>")
-
- startTable()
- headerTable("path")
-
- tot_cache = 0
- tot_fluid = 0
-
- rowTable(job.files[0].filepath)
- rowTable("Other Files", class_style = "toggle", extra = "onclick='toggleDisplay(&quot;.other&quot;, &quot;none&quot;, &quot;table-row&quot;)'")
-
- for file in job.files:
- if file.filepath.endswith(".bphys"):
- tot_cache += 1
- elif file.filepath.endswith(".bobj.gz") or file.filepath.endswith(".bvel.gz"):
- tot_fluid += 1
- else:
- if file != job.files[0]:
- rowTable(file.filepath, class_style = "other")
-
- if tot_cache > 0:
- rowTable("%i physic cache files" % tot_cache, class_style = "toggle", extra = "onclick='toggleDisplay(&quot;.cache&quot;, &quot;none&quot;, &quot;table-row&quot;)'")
- for file in job.files:
- if file.filepath.endswith(".bphys"):
- rowTable(os.path.split(file.filepath)[1], class_style = "cache")
-
- if tot_fluid > 0:
- rowTable("%i fluid bake files" % tot_fluid, class_style = "toggle", extra = "onclick='toggleDisplay(&quot;.fluid&quot;, &quot;none&quot;, &quot;table-row&quot;)'")
- for file in job.files:
- if file.filepath.endswith(".bobj.gz") or file.filepath.endswith(".bvel.gz"):
- rowTable(os.path.split(file.filepath)[1], class_style = "fluid")
-
- endTable()
- elif job.type == netrender.model.JOB_VCS:
- output("<h2>Versioning</h2>")
-
- startTable()
-
- rowTable("System", job.version_info.system.name)
- rowTable("Remote Path", job.version_info.rpath)
- rowTable("Working Path", job.version_info.wpath)
- rowTable("Revision", job.version_info.revision)
- rowTable("Render File", job.files[0].filepath)
-
- endTable()
-
- if job.blacklist:
- output("<h2>Blacklist</h2>")
-
- startTable()
- headerTable("name", "address")
-
- for slave_id in job.blacklist:
- slave = handler.server.slaves_map[slave_id]
- rowTable(slave.name, slave.address[0])
-
- endTable()
-
- output("<h2>Frames</h2>")
-
- startTable()
- headerTable("no", "status", "render time", "slave", "log", "result", "")
-
- for frame in job.frames:
- rowTable(
- frame.number,
- frame.statusText(),
- "%.1fs" % frame.time,
- frame.slave.name if frame.slave else "&nbsp;",
- link("view log", logURL(job_id, frame.number)) if frame.log_path else "&nbsp;",
- link("view result", renderURL(job_id, frame.number)) + " [" +
- tag("span", "show", attr="class='thumb' onclick='showThumb(%s, %i)'" % (job.id, frame.number)) + "]" if frame.status == DONE else "&nbsp;",
- "<img name='thumb%i' title='hide thumbnails' src='' class='thumb' onclick='showThumb(%s, %i)'>" % (frame.number, job.id, frame.number)
- )
-
- endTable()
- else:
- output("no such job")
-
- output("</body></html>")
-
diff --git a/release/scripts/io/netrender/model.py b/release/scripts/io/netrender/model.py
deleted file mode 100644
index 5fc0bc2a0bb..00000000000
--- a/release/scripts/io/netrender/model.py
+++ /dev/null
@@ -1,360 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import sys, os
-import http, http.client, http.server, urllib
-import subprocess, shutil, time, hashlib
-
-import netrender.versioning as versioning
-from netrender.utils import *
-
-class LogFile:
- def __init__(self, job_id = 0, slave_id = 0, frames = []):
- self.job_id = job_id
- self.slave_id = slave_id
- self.frames = frames
-
- def serialize(self):
- return {
- "job_id": self.job_id,
- "slave_id": self.slave_id,
- "frames": self.frames
- }
-
- @staticmethod
- def materialize(data):
- if not data:
- return None
-
- logfile = LogFile()
- logfile.job_id = data["job_id"]
- logfile.slave_id = data["slave_id"]
- logfile.frames = data["frames"]
-
- return logfile
-
-class RenderSlave:
- _slave_map = {}
-
- def __init__(self):
- self.id = ""
- self.name = ""
- self.address = ("",0)
- self.stats = ""
- self.total_done = 0
- self.total_error = 0
- self.last_seen = 0.0
-
- def serialize(self):
- return {
- "id": self.id,
- "name": self.name,
- "address": self.address,
- "stats": self.stats,
- "total_done": self.total_done,
- "total_error": self.total_error,
- "last_seen": self.last_seen
- }
-
- @staticmethod
- def materialize(data, cache = True):
- if not data:
- return None
-
- slave_id = data["id"]
-
- if cache and slave_id in RenderSlave._slave_map:
- return RenderSlave._slave_map[slave_id]
-
- slave = RenderSlave()
- slave.id = slave_id
- slave.name = data["name"]
- slave.address = data["address"]
- slave.stats = data["stats"]
- slave.total_done = data["total_done"]
- slave.total_error = data["total_error"]
- slave.last_seen = data["last_seen"]
-
- if cache:
- RenderSlave._slave_map[slave_id] = slave
-
- return slave
-
-JOB_BLENDER = 1
-JOB_PROCESS = 2
-JOB_VCS = 3
-
-JOB_TYPES = {
- JOB_BLENDER: "Blender",
- JOB_PROCESS: "Process",
- JOB_VCS: "Versioned",
- }
-
-class VersioningInfo:
- def __init__(self, info = None):
- self._system = None
- self.wpath = ""
- self.rpath = ""
- self.revision = ""
-
- @property
- def system(self):
- return self._system
-
- @system.setter
- def system(self, value):
- self._system = versioning.SYSTEMS[value]
-
- def update(self):
- self.system.update(self)
-
- def serialize(self):
- return {
- "wpath": self.wpath,
- "rpath": self.rpath,
- "revision": self.revision,
- "system": self.system.name
- }
-
- @staticmethod
- def generate(system, path):
- vs = VersioningInfo()
- vs.wpath = path
- vs.system = system
-
- vs.rpath = vs.system.path(path)
- vs.revision = vs.system.revision(path)
-
- return vs
-
-
- @staticmethod
- def materialize(data):
- if not data:
- return None
-
- vs = VersioningInfo()
- vs.wpath = data["wpath"]
- vs.rpath = data["rpath"]
- vs.revision = data["revision"]
- vs.system = data["system"]
-
- return vs
-
-
-class RenderFile:
- def __init__(self, filepath = "", index = 0, start = -1, end = -1, signature=0):
- self.filepath = filepath
- self.original_path = filepath
- self.signature = signature
- self.index = index
- self.start = start
- self.end = end
-
- def serialize(self):
- return {
- "filepath": self.filepath,
- "original_path": self.original_path,
- "index": self.index,
- "start": self.start,
- "end": self.end,
- "signature": self.signature
- }
-
- @staticmethod
- def materialize(data):
- if not data:
- return None
-
- rfile = RenderFile(data["filepath"], data["index"], data["start"], data["end"], data["signature"])
- rfile.original_path = data["original_path"]
-
- return rfile
-
-class RenderJob:
- def __init__(self, job_info = None):
- self.id = ""
- self.type = JOB_BLENDER
- self.name = ""
- self.category = "None"
- self.status = JOB_WAITING
- self.files = []
- self.chunks = 0
- self.priority = 0
- self.blacklist = []
-
- self.version_info = None
-
- self.resolution = None
-
- self.usage = 0.0
- self.last_dispatched = 0.0
- self.frames = []
-
- if job_info:
- self.type = job_info.type
- self.name = job_info.name
- self.category = job_info.category
- self.status = job_info.status
- self.files = job_info.files
- self.chunks = job_info.chunks
- self.priority = job_info.priority
- self.blacklist = job_info.blacklist
- self.version_info = job_info.version_info
-
- def hasRenderResult(self):
- return self.type in (JOB_BLENDER, JOB_VCS)
-
- def rendersWithBlender(self):
- return self.type in (JOB_BLENDER, JOB_VCS)
-
- def addFile(self, file_path, start=-1, end=-1, signed=True):
- if signed:
- signature = hashFile(file_path)
- else:
- signature = None
- self.files.append(RenderFile(file_path, len(self.files), start, end, signature))
-
- def addFrame(self, frame_number, command = ""):
- frame = RenderFrame(frame_number, command)
- self.frames.append(frame)
- return frame
-
- def __len__(self):
- return len(self.frames)
-
- def countFrames(self, status=QUEUED):
- total = 0
- for f in self.frames:
- if f.status == status:
- total += 1
-
- return total
-
- def countSlaves(self):
- return len(set((frame.slave for frame in self.frames if frame.status == DISPATCHED)))
-
- def statusText(self):
- return JOB_STATUS_TEXT[self.status]
-
- def framesStatus(self):
- results = {
- QUEUED: 0,
- DISPATCHED: 0,
- DONE: 0,
- ERROR: 0
- }
-
- for frame in self.frames:
- results[frame.status] += 1
-
- return results
-
- def __contains__(self, frame_number):
- for f in self.frames:
- if f.number == frame_number:
- return True
- else:
- return False
-
- def __getitem__(self, frame_number):
- for f in self.frames:
- if f.number == frame_number:
- return f
- else:
- return None
-
- def serialize(self, frames = None):
- min_frame = min((f.number for f in frames)) if frames else -1
- max_frame = max((f.number for f in frames)) if frames else -1
- return {
- "id": self.id,
- "type": self.type,
- "name": self.name,
- "category": self.category,
- "status": self.status,
- "files": [f.serialize() for f in self.files if f.start == -1 or not frames or (f.start <= max_frame and f.end >= min_frame)],
- "frames": [f.serialize() for f in self.frames if not frames or f in frames],
- "chunks": self.chunks,
- "priority": self.priority,
- "usage": self.usage,
- "blacklist": self.blacklist,
- "last_dispatched": self.last_dispatched,
- "version_info": self.version_info.serialize() if self.version_info else None,
- "resolution": self.resolution
- }
-
- @staticmethod
- def materialize(data):
- if not data:
- return None
-
- job = RenderJob()
- job.id = data["id"]
- job.type = data["type"]
- job.name = data["name"]
- job.category = data["category"]
- job.status = data["status"]
- job.files = [RenderFile.materialize(f) for f in data["files"]]
- job.frames = [RenderFrame.materialize(f) for f in data["frames"]]
- job.chunks = data["chunks"]
- job.priority = data["priority"]
- job.usage = data["usage"]
- job.blacklist = data["blacklist"]
- job.last_dispatched = data["last_dispatched"]
- job.resolution = data["resolution"]
-
- version_info = data.get("version_info", None)
- if version_info:
- job.version_info = VersioningInfo.materialize(version_info)
-
- return job
-
-class RenderFrame:
- def __init__(self, number = 0, command = ""):
- self.number = number
- self.time = 0
- self.status = QUEUED
- self.slave = None
- self.command = command
-
- def statusText(self):
- return FRAME_STATUS_TEXT[self.status]
-
- def serialize(self):
- return {
- "number": self.number,
- "time": self.time,
- "status": self.status,
- "slave": None if not self.slave else self.slave.serialize(),
- "command": self.command
- }
-
- @staticmethod
- def materialize(data):
- if not data:
- return None
-
- frame = RenderFrame()
- frame.number = data["number"]
- frame.time = data["time"]
- frame.status = data["status"]
- frame.slave = RenderSlave.materialize(data["slave"])
- frame.command = data["command"]
-
- return frame
diff --git a/release/scripts/io/netrender/netrender.css b/release/scripts/io/netrender/netrender.css
deleted file mode 100644
index 0c54690e002..00000000000
--- a/release/scripts/io/netrender/netrender.css
+++ /dev/null
@@ -1,88 +0,0 @@
-body {
- background-color:#eee;
- font-size:12px;
- font-family: "Lucida Sans","Lucida Sans Unicode","Lucida Grande",Lucida,sans-serif;
-
-}
-a {
- /*text-decoration:none;*/
- color:#666;
-}
-a:hover {
- color:#000;
-}
-h2 {
- background-color:#ddd;
- font-size:120%;
- padding:5px;
-}
-
-h2 {
- background-color:#ddd;
- font-size:110%;
- padding:5px;
-}
-
-table {
- text-align:center;
- border:0;
- background-color:#ddd;
- padding: 0px;
- margin: 0px;
-}
-thead{
- font-size:90%;
- color:#555;
- background-color:#ccc;
-}
-td {
- border:0;
- padding:2px;
- padding-left:10px;
- padding-right:10px;
- margin-left:20px;
- background-color:#ddd;
-}
-td:hover {
- background-color:#ccc;
-}
-tr {
- border:0;
-}
-button {
- color: #111;
- width: auto;
- height: auto;
-}
-
-.toggle {
- text-decoration: underline;
- cursor: pointer;
-}
-
-.cache {
- display: none;
-}
-
-.fluid {
- display: none;
-}
-
-.other {
- display: none;
-}
-
-.rules {
- width: 60em;
- text-align: left;
-}
-
-img.thumb {
- display: none;
- cursor: pointer;
-}
-
-span.thumb {
- text-decoration: underline;
- cursor: pointer;
-}
diff --git a/release/scripts/io/netrender/netrender.js b/release/scripts/io/netrender/netrender.js
deleted file mode 100644
index 1024a169571..00000000000
--- a/release/scripts/io/netrender/netrender.js
+++ /dev/null
@@ -1,146 +0,0 @@
-lastFrame = -1
-maxFrame = -1
-minFrame = -1
-
-function request(url, data)
-{
- xmlhttp = new XMLHttpRequest();
- xmlhttp.open("POST", url, false);
- xmlhttp.send(data);
- window.location.reload()
-}
-
-function edit(id, info)
-{
- request("/edit_" + id, info)
-}
-
-function clear_jobs()
-{
- var r=confirm("Also delete files on master?");
-
- if (r==true) {
- request('/clear', '{"clear":true}');
- } else {
- request('/clear', '{"clear":false}');
- }
-}
-
-function cancel_job(id)
-{
- var r=confirm("Also delete files on master?");
-
- if (r==true) {
- request('/cancel_' + id, '{"clear":true}');
- } else {
- request('/cancel_' + id, '{"clear":false}');
- }
-}
-
-function balance_edit(id, old_value)
-{
- var new_value = prompt("New limit", old_value);
- if (new_value != null && new_value != "") {
- request("/balance_limit", '{"' + id + '":"' + new_value + '"}');
- }
-}
-
-function balance_enable(id, value)
-{
- request("/balance_enable", '{"' + id + '":' + value + "}");
-}
-
-function showThumb(job, frame)
-{
- if (lastFrame != -1) {
- if (maxFrame != -1 && minFrame != -1) {
- if (frame >= minFrame && frame <= maxFrame) {
- for(i = minFrame; i <= maxFrame; i=i+1) {
- toggleThumb(job, i);
- }
- minFrame = -1;
- maxFrame = -1;
- lastFrame = -1;
- } else if (frame > maxFrame) {
- for(i = maxFrame+1; i <= frame; i=i+1) {
- toggleThumb(job, i);
- }
- maxFrame = frame;
- lastFrame = frame;
- } else {
- for(i = frame; i <= minFrame-1; i=i+1) {
- toggleThumb(job, i);
- }
- minFrame = frame;
- lastFrame = frame;
- }
- } else if (frame == lastFrame) {
- toggleThumb(job, frame);
- } else if (frame < lastFrame) {
- minFrame = frame;
- maxFrame = lastFrame;
-
- for(i = minFrame; i <= maxFrame-1; i=i+1) {
- toggleThumb(job, i);
- }
- lastFrame = frame;
- } else {
- minFrame = lastFrame;
- maxFrame = frame;
-
- for(i = minFrame+1; i <= maxFrame; i=i+1) {
- toggleThumb(job, i);
- }
- lastFrame = frame;
- }
- } else {
- toggleThumb(job, frame);
- }
-}
-
-function toggleThumb(job, frame)
-{
- img = document.images["thumb" + frame];
- url = "/thumb_" + job + "_" + frame + ".jpg"
-
- if (img.style.display == "block") {
- img.style.display = "none";
- img.src = "";
- lastFrame = -1;
- } else {
- img.src = url;
- img.style.display = "block";
- lastFrame = frame;
- }
-}
-
-function returnObjById( id )
-{
- if (document.getElementById)
- var returnVar = document.getElementById(id);
- else if (document.all)
- var returnVar = document.all[id];
- else if (document.layers)
- var returnVar = document.layers[id];
- return returnVar;
-}
-
-function toggleDisplay( className, value1, value2 )
-{
- style = getStyle(className)
-
- if (style.style["display"] == value1) {
- style.style["display"] = value2;
- } else {
- style.style["display"] = value1;
- }
-}
-
-function getStyle(className) {
- var classes = document.styleSheets[0].rules || document.styleSheets[0].cssRules
- for(var x=0;x<classes.length;x++) {
- if(classes[x].selectorText==className) {
- return classes[x];
- }
- }
-} \ No newline at end of file
diff --git a/release/scripts/io/netrender/operators.py b/release/scripts/io/netrender/operators.py
deleted file mode 100644
index f2c2fda7bde..00000000000
--- a/release/scripts/io/netrender/operators.py
+++ /dev/null
@@ -1,564 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import bpy
-import sys, os
-import http, http.client, http.server, urllib, socket
-import webbrowser
-import json
-
-import netrender
-from netrender.utils import *
-import netrender.client as client
-import netrender.model
-import netrender.versioning as versioning
-
-class RENDER_OT_netslave_bake(bpy.types.Operator):
- '''NEED DESCRIPTION'''
- bl_idname = "render.netslavebake"
- bl_label = "Bake all in file"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- scene = context.scene
- netsettings = scene.network_render
-
- filename = bpy.data.filepath
- path, name = os.path.split(filename)
- root, ext = os.path.splitext(name)
- default_path = path + os.sep + "blendcache_" + root + os.sep # need an API call for that
- relative_path = os.sep + os.sep + "blendcache_" + root + os.sep
-
- # Force all point cache next to the blend file
- for object in bpy.data.objects:
- for modifier in object.modifiers:
- if modifier.type == 'FLUID_SIMULATION' and modifier.settings.type == "DOMAIN":
- modifier.settings.path = relative_path
- bpy.ops.fluid.bake({"active_object": object, "scene": scene})
- elif modifier.type == "CLOTH":
- modifier.point_cache.frame_step = 1
- modifier.point_cache.use_disk_cache = True
- modifier.point_cache.use_external = False
- elif modifier.type == "SOFT_BODY":
- modifier.point_cache.frame_step = 1
- modifier.point_cache.use_disk_cache = True
- modifier.point_cache.use_external = False
- elif modifier.type == "SMOKE" and modifier.smoke_type == "TYPE_DOMAIN":
- modifier.domain_settings.point_cache.use_step = 1
- modifier.domain_settings.point_cache.use_disk_cache = True
- modifier.domain_settings.point_cache.use_external = False
-
- # particles modifier are stupid and don't contain data
- # we have to go through the object property
- for psys in object.particle_systems:
- psys.point_cache.use_step = 1
- psys.point_cache.use_disk_cache = True
- psys.point_cache.use_external = False
- psys.point_cache.filepath = relative_path
-
- bpy.ops.ptcache.bake_all()
-
- #bpy.ops.wm.save_mainfile(filepath = path + os.sep + root + "_baked.blend")
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class RENDER_OT_netclientanim(bpy.types.Operator):
- '''Start rendering an animation on network'''
- bl_idname = "render.netclientanim"
- bl_label = "Animation on network"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- scene = context.scene
- netsettings = scene.network_render
-
- conn = clientConnection(netsettings.server_address, netsettings.server_port, self.report)
-
- if conn:
- # Sending file
- scene.network_render.job_id = client.clientSendJob(conn, scene, True)
- conn.close()
-
- bpy.ops.render.render('INVOKE_AREA', animation=True)
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class RENDER_OT_netclientrun(bpy.types.Operator):
- '''Start network rendering service'''
- bl_idname = "render.netclientstart"
- bl_label = "Start Service"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- bpy.ops.render.render('INVOKE_AREA', animation=True)
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class RENDER_OT_netclientsend(bpy.types.Operator):
- '''Send Render Job to the Network'''
- bl_idname = "render.netclientsend"
- bl_label = "Send job"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- scene = context.scene
- netsettings = scene.network_render
-
- try:
- conn = clientConnection(netsettings.server_address, netsettings.server_port, self.report)
-
- if conn:
- # Sending file
- scene.network_render.job_id = client.clientSendJob(conn, scene, True)
- conn.close()
- self.report('INFO', "Job sent to master")
- except Exception as err:
- self.report('ERROR', str(err))
-
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class RENDER_OT_netclientsendframe(bpy.types.Operator):
- '''Send Render Job with current frame to the Network'''
- bl_idname = "render.netclientsendframe"
- bl_label = "Send current frame job"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- scene = context.scene
- netsettings = scene.network_render
-
- try:
- conn = clientConnection(netsettings.server_address, netsettings.server_port, self.report)
-
- if conn:
- # Sending file
- scene.network_render.job_id = client.clientSendJob(conn, scene, False)
- conn.close()
- self.report('INFO', "Job sent to master")
- except Exception as err:
- self.report('ERROR', str(err))
-
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class RENDER_OT_netclientstatus(bpy.types.Operator):
- '''Refresh the status of the current jobs'''
- bl_idname = "render.netclientstatus"
- bl_label = "Client Status"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- netsettings = context.scene.network_render
- conn = clientConnection(netsettings.server_address, netsettings.server_port, self.report)
-
- if conn:
- conn.request("GET", "/status")
-
- response = conn.getresponse()
- content = response.read()
- print( response.status, response.reason )
-
- jobs = (netrender.model.RenderJob.materialize(j) for j in json.loads(str(content, encoding='utf8')))
-
- while(len(netsettings.jobs) > 0):
- netsettings.jobs.remove(0)
-
- netrender.jobs = []
-
- for j in jobs:
- netrender.jobs.append(j)
- netsettings.jobs.add()
- job = netsettings.jobs[-1]
-
- j.results = j.framesStatus() # cache frame status
-
- job.name = j.name
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class RENDER_OT_netclientblacklistslave(bpy.types.Operator):
- '''Operator documentation text, will be used for the operator tooltip and python docs.'''
- bl_idname = "render.netclientblacklistslave"
- bl_label = "Client Blacklist Slave"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- netsettings = context.scene.network_render
-
- if netsettings.active_slave_index >= 0:
-
- # deal with data
- slave = netrender.slaves.pop(netsettings.active_slave_index)
- netrender.blacklist.append(slave)
-
- # deal with rna
- netsettings.slaves_blacklist.add()
- netsettings.slaves_blacklist[-1].name = slave.name
-
- netsettings.slaves.remove(netsettings.active_slave_index)
- netsettings.active_slave_index = -1
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class RENDER_OT_netclientwhitelistslave(bpy.types.Operator):
- '''Operator documentation text, will be used for the operator tooltip and python docs.'''
- bl_idname = "render.netclientwhitelistslave"
- bl_label = "Client Whitelist Slave"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- netsettings = context.scene.network_render
-
- if netsettings.active_blacklisted_slave_index >= 0:
-
- # deal with data
- slave = netrender.blacklist.pop(netsettings.active_blacklisted_slave_index)
- netrender.slaves.append(slave)
-
- # deal with rna
- netsettings.slaves.add()
- netsettings.slaves[-1].name = slave.name
-
- netsettings.slaves_blacklist.remove(netsettings.active_blacklisted_slave_index)
- netsettings.active_blacklisted_slave_index = -1
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-
-class RENDER_OT_netclientslaves(bpy.types.Operator):
- '''Refresh status about available Render slaves'''
- bl_idname = "render.netclientslaves"
- bl_label = "Client Slaves"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- netsettings = context.scene.network_render
- conn = clientConnection(netsettings.server_address, netsettings.server_port, self.report)
-
- if conn:
- conn.request("GET", "/slaves")
-
- response = conn.getresponse()
- content = response.read()
- print( response.status, response.reason )
-
- slaves = (netrender.model.RenderSlave.materialize(s) for s in json.loads(str(content, encoding='utf8')))
-
- while(len(netsettings.slaves) > 0):
- netsettings.slaves.remove(0)
-
- netrender.slaves = []
-
- for s in slaves:
- for i in range(len(netrender.blacklist)):
- slave = netrender.blacklist[i]
- if slave.id == s.id:
- netrender.blacklist[i] = s
- netsettings.slaves_blacklist[i].name = s.name
- break
- else:
- netrender.slaves.append(s)
-
- netsettings.slaves.add()
- slave = netsettings.slaves[-1]
- slave.name = s.name
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class RENDER_OT_netclientcancel(bpy.types.Operator):
- '''Cancel the selected network rendering job.'''
- bl_idname = "render.netclientcancel"
- bl_label = "Client Cancel"
-
- @classmethod
- def poll(cls, context):
- netsettings = context.scene.network_render
- return netsettings.active_job_index >= 0 and len(netsettings.jobs) > 0
-
- def execute(self, context):
- netsettings = context.scene.network_render
- conn = clientConnection(netsettings.server_address, netsettings.server_port, self.report)
-
- if conn:
- job = netrender.jobs[netsettings.active_job_index]
-
- conn.request("POST", cancelURL(job.id), json.dumps({'clear':False}))
-
- response = conn.getresponse()
- response.read()
- print( response.status, response.reason )
-
- netsettings.jobs.remove(netsettings.active_job_index)
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class RENDER_OT_netclientcancelall(bpy.types.Operator):
- '''Cancel all running network rendering jobs.'''
- bl_idname = "render.netclientcancelall"
- bl_label = "Client Cancel All"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- netsettings = context.scene.network_render
- conn = clientConnection(netsettings.server_address, netsettings.server_port, self.report)
-
- if conn:
- conn.request("POST", "/clear", json.dumps({'clear':False}))
-
- response = conn.getresponse()
- response.read()
- print( response.status, response.reason )
-
- while(len(netsettings.jobs) > 0):
- netsettings.jobs.remove(0)
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class netclientdownload(bpy.types.Operator):
- '''Download render results from the network'''
- bl_idname = "render.netclientdownload"
- bl_label = "Client Download"
-
- @classmethod
- def poll(cls, context):
- netsettings = context.scene.network_render
- return netsettings.active_job_index >= 0 and len(netsettings.jobs) > netsettings.active_job_index
-
- def execute(self, context):
- netsettings = context.scene.network_render
- rd = context.scene.render
-
- conn = clientConnection(netsettings.server_address, netsettings.server_port, self.report)
-
- if conn:
- job_id = netrender.jobs[netsettings.active_job_index].id
-
- conn.request("GET", "/status", headers={"job-id":job_id})
-
- response = conn.getresponse()
-
- if response.status != http.client.OK:
- self.report('ERROR', "Job ID %i not defined on master" % job_id)
- return {'ERROR'}
-
- content = response.read()
-
- job = netrender.model.RenderJob.materialize(json.loads(str(content, encoding='utf8')))
-
- conn.close()
-
- finished_frames = []
-
- nb_error = 0
- nb_missing = 0
-
- for frame in job.frames:
- if frame.status == DONE:
- finished_frames.append(frame.number)
- elif frame.status == ERROR:
- nb_error += 1
- else:
- nb_missing += 1
-
- if not finished_frames:
- return
-
- frame_ranges = []
-
- first = None
- last = None
-
- for i in range(len(finished_frames)):
- current = finished_frames[i]
-
- if not first:
- first = current
- last = current
- elif last + 1 == current:
- last = current
-
- if last + 1 < current or i + 1 == len(finished_frames):
- if first < last:
- frame_ranges.append((first, last))
- else:
- frame_ranges.append((first,))
-
- first = current
- last = current
-
- getResults(netsettings.server_address, netsettings.server_port, job_id, job.resolution[0], job.resolution[1], job.resolution[2], frame_ranges)
-
- if nb_error and nb_missing:
- self.report('ERROR', "Results downloaded but skipped %i frames with errors and %i unfinished frames" % (nb_error, nb_missing))
- elif nb_error:
- self.report('ERROR', "Results downloaded but skipped %i frames with errors" % nb_error)
- elif nb_missing:
- self.report('WARNING', "Results downloaded but skipped %i unfinished frames" % nb_missing)
- else:
- self.report('INFO', "All results downloaded")
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class netclientscan(bpy.types.Operator):
- '''Listen on network for master server broadcasting its address and port.'''
- bl_idname = "render.netclientscan"
- bl_label = "Client Scan"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- address, port = clientScan(self.report)
-
- if address:
- scene = context.scene
- netsettings = scene.network_render
- netsettings.server_address = address
- netsettings.server_port = port
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-class netclientvcsguess(bpy.types.Operator):
- '''Guess VCS setting for the current file'''
- bl_idname = "render.netclientvcsguess"
- bl_label = "VCS Guess"
-
- @classmethod
- def poll(cls, context):
- return True
-
- def execute(self, context):
- netsettings = context.scene.network_render
-
- system = versioning.SYSTEMS.get(netsettings.vcs_system, None)
-
- if system:
- wpath, name = os.path.split(os.path.abspath(bpy.data.filepath))
-
- rpath = system.path(wpath)
- revision = system.revision(wpath)
-
- netsettings.vcs_wpath = wpath
- netsettings.vcs_rpath = rpath
- netsettings.vcs_revision = revision
-
-
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
-
-
-class netclientweb(bpy.types.Operator):
- '''Open new window with information about running rendering jobs'''
- bl_idname = "render.netclientweb"
- bl_label = "Open Master Monitor"
-
- @classmethod
- def poll(cls, context):
- netsettings = context.scene.network_render
- return netsettings.server_address != "[default]"
-
- def execute(self, context):
- netsettings = context.scene.network_render
-
-
- # open connection to make sure server exists
- conn = clientConnection(netsettings.server_address, netsettings.server_port, self.report)
-
- if conn:
- conn.close()
-
- webbrowser.open("http://%s:%i" % (netsettings.server_address, netsettings.server_port))
-
- return {'FINISHED'}
-
- def invoke(self, context, event):
- return self.execute(context)
diff --git a/release/scripts/io/netrender/repath.py b/release/scripts/io/netrender/repath.py
deleted file mode 100644
index 3ac9636b628..00000000000
--- a/release/scripts/io/netrender/repath.py
+++ /dev/null
@@ -1,150 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import sys, os
-import subprocess
-
-import bpy
-
-from netrender.utils import *
-import netrender.model
-
-BLENDER_PATH = sys.argv[0]
-
-def reset(job):
- main_file = job.files[0]
-
- job_full_path = main_file.filepath
-
- if os.path.exists(job_full_path + ".bak"):
- os.remove(job_full_path) # repathed file
- os.renames(job_full_path + ".bak", job_full_path)
-
-def update(job):
- paths = []
-
- main_file = job.files[0]
-
- job_full_path = main_file.filepath
-
-
- path, ext = os.path.splitext(job_full_path)
-
- new_path = path + ".remap" + ext
-
- # Disable for now. Partial repath should work anyway
- #all = main_file.filepath != main_file.original_path
- all = False
-
- for rfile in job.files[1:]:
- if all or rfile.original_path != rfile.filepath:
- paths.append(rfile.original_path)
- paths.append(rfile.filepath)
-
- # Only update if needed
- if paths:
- process = subprocess.Popen([BLENDER_PATH, "-b", "-noaudio", job_full_path, "-P", __file__, "--", new_path] + paths, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- process.wait()
-
- os.renames(job_full_path, job_full_path + ".bak")
- os.renames(new_path, job_full_path)
-
-def process(paths):
- def processPointCache(point_cache):
- point_cache.use_external = False
-
- def processFluid(fluid):
- new_path = path_map.get(fluid.filepath, None)
- if new_path:
- fluid.path = new_path
-
- path_map = {}
- for i in range(0, len(paths), 2):
- # special case for point cache
- if paths[i].endswith(".bphys"):
- pass # Don't need them in the map, they all use the default external path
- # NOTE: This is probably not correct all the time, need to be fixed.
- # special case for fluids
- elif paths[i].endswith(".bobj.gz"):
- path_map[os.path.split(paths[i])[0]] = os.path.split(paths[i+1])[0]
- else:
- path_map[os.path.split(paths[i])[1]] = paths[i+1]
-
- # TODO original paths aren't really the orignal path (they are the normalized path
- # so we repath using the filenames only.
-
- ###########################
- # LIBRARIES
- ###########################
- for lib in bpy.data.libraries:
- file_path = bpy.path.abspath(lib.filepath)
- new_path = path_map.get(os.path.split(file_path)[1], None)
- if new_path:
- lib.filepath = new_path
-
- ###########################
- # IMAGES
- ###########################
- for image in bpy.data.images:
- if image.source == "FILE" and not image.packed_file:
- file_path = bpy.path.abspath(image.filepath)
- new_path = path_map.get(os.path.split(file_path)[1], None)
- if new_path:
- image.filepath = new_path
-
-
- ###########################
- # FLUID + POINT CACHE
- ###########################
- for object in bpy.data.objects:
- for modifier in object.modifiers:
- if modifier.type == 'FLUID_SIMULATION' and modifier.settings.type == "DOMAIN":
- processFluid(settings)
- elif modifier.type == "CLOTH":
- processPointCache(modifier.point_cache)
- elif modifier.type == "SOFT_BODY":
- processPointCache(modifier.point_cache)
- elif modifier.type == "SMOKE" and modifier.smoke_type == "TYPE_DOMAIN":
- processPointCache(modifier.domain_settings.point_cache_low)
- if modifier.domain_settings.use_high_resolution:
- processPointCache(modifier.domain_settings.point_cache_high)
- elif modifier.type == "MULTIRES" and modifier.is_external:
- file_path = bpy.path.abspath(modifier.filepath)
- new_path = path_map.get(file_path, None)
- if new_path:
- modifier.filepath = new_path
-
- # particles modifier are stupid and don't contain data
- # we have to go through the object property
- for psys in object.particle_systems:
- processPointCache(psys.point_cache)
-
-
-if __name__ == "__main__":
- try:
- i = sys.argv.index("--")
- except:
- i = 0
-
- if i:
- new_path = sys.argv[i+1]
- args = sys.argv[i+2:]
-
- process(args)
-
- bpy.ops.wm.save_as_mainfile(filepath=new_path, check_existing=False)
diff --git a/release/scripts/io/netrender/slave.py b/release/scripts/io/netrender/slave.py
deleted file mode 100644
index b05de0afeb9..00000000000
--- a/release/scripts/io/netrender/slave.py
+++ /dev/null
@@ -1,349 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import sys, os, platform, shutil
-import http, http.client, http.server, urllib
-import subprocess, time
-import json
-
-import bpy
-
-from netrender.utils import *
-import netrender.model
-import netrender.repath
-import netrender.thumbnail as thumbnail
-
-BLENDER_PATH = sys.argv[0]
-
-CANCEL_POLL_SPEED = 2
-MAX_TIMEOUT = 10
-INCREMENT_TIMEOUT = 1
-MAX_CONNECT_TRY = 10
-try:
- system = platform.system()
-except UnicodeDecodeError:
- import sys
- system = sys.platform
-
-if system in ('Windows', 'win32') and platform.version() >= '5': # Error mode is only available on Win2k or higher, that's version 5
- import ctypes
- def SetErrorMode():
- val = ctypes.windll.kernel32.SetErrorMode(0x0002)
- ctypes.windll.kernel32.SetErrorMode(val | 0x0002)
- return val
-
- def RestoreErrorMode(val):
- ctypes.windll.kernel32.SetErrorMode(val)
-else:
- def SetErrorMode():
- return 0
-
- def RestoreErrorMode(val):
- pass
-
-def clearSlave(path):
- shutil.rmtree(path)
-
-def slave_Info():
- sysname, nodename, release, version, machine, processor = platform.uname()
- slave = netrender.model.RenderSlave()
- slave.name = nodename
- slave.stats = sysname + " " + release + " " + machine + " " + processor
- return slave
-
-def testCancel(conn, job_id, frame_number):
- conn.request("HEAD", "/status", headers={"job-id":job_id, "job-frame": str(frame_number)})
-
- # canceled if job isn't found anymore
- if responseStatus(conn) == http.client.NO_CONTENT:
- return True
- else:
- return False
-
-def testFile(conn, job_id, slave_id, rfile, JOB_PREFIX, main_path = None):
- job_full_path = prefixPath(JOB_PREFIX, rfile.filepath, main_path)
-
- found = os.path.exists(job_full_path)
-
- if found and rfile.signature != None:
- found_signature = hashFile(job_full_path)
- found = found_signature == rfile.signature
-
- if not found:
- print("Found file %s at %s but signature mismatch!" % (rfile.filepath, job_full_path))
- job_full_path = prefixPath(JOB_PREFIX, rfile.filepath, main_path, force = True)
-
- if not found:
- # Force prefix path if not found
- job_full_path = prefixPath(JOB_PREFIX, rfile.filepath, main_path, force = True)
- temp_path = os.path.join(JOB_PREFIX, "slave.temp")
- conn.request("GET", fileURL(job_id, rfile.index), headers={"slave-id":slave_id})
- response = conn.getresponse()
-
- if response.status != http.client.OK:
- return None # file for job not returned by server, need to return an error code to server
-
- f = open(temp_path, "wb")
- buf = response.read(1024)
-
- while buf:
- f.write(buf)
- buf = response.read(1024)
-
- f.close()
-
- os.renames(temp_path, job_full_path)
-
- rfile.filepath = job_full_path
-
- return job_full_path
-
-def breakable_timeout(timeout):
- for i in range(timeout):
- time.sleep(1)
- if engine.test_break():
- break
-
-def render_slave(engine, netsettings, threads):
- timeout = 1
-
- bisleep = BreakableIncrementedSleep(INCREMENT_TIMEOUT, 1, MAX_TIMEOUT, engine.test_break)
-
- engine.update_stats("", "Network render node initiation")
-
- conn = clientConnection(netsettings.server_address, netsettings.server_port)
-
- if not conn:
- timeout = 1
- print("Connection failed, will try connecting again at most %i times" % MAX_CONNECT_TRY)
- bisleep.reset()
-
- for i in range(MAX_CONNECT_TRY):
- bisleep.sleep()
-
- conn = clientConnection(netsettings.server_address, netsettings.server_port)
-
- if conn or engine.test_break():
- break
-
- print("Retry %i failed, waiting %is before retrying" % (i + 1, bisleep.current))
-
- if conn:
- conn.request("POST", "/slave", json.dumps(slave_Info().serialize()))
- response = conn.getresponse()
- response.read()
-
- slave_id = response.getheader("slave-id")
-
- NODE_PREFIX = os.path.join(bpy.path.abspath(netsettings.path), "slave_" + slave_id)
- if not os.path.exists(NODE_PREFIX):
- os.mkdir(NODE_PREFIX)
-
- engine.update_stats("", "Network render connected to master, waiting for jobs")
-
- while not engine.test_break():
- conn.request("GET", "/job", headers={"slave-id":slave_id})
- response = conn.getresponse()
-
- if response.status == http.client.OK:
- bisleep.reset()
-
- job = netrender.model.RenderJob.materialize(json.loads(str(response.read(), encoding='utf8')))
- engine.update_stats("", "Network render processing job from master")
-
- JOB_PREFIX = os.path.join(NODE_PREFIX, "job_" + job.id)
- if not os.path.exists(JOB_PREFIX):
- os.mkdir(JOB_PREFIX)
-
- # set tempdir for fsaa temp files
- # have to set environ var because render is done in a subprocess and that's the easiest way to propagate the setting
- os.environ["TMP"] = JOB_PREFIX
-
-
- if job.type == netrender.model.JOB_BLENDER:
- job_path = job.files[0].filepath # path of main file
- main_path, main_file = os.path.split(job_path)
-
- job_full_path = testFile(conn, job.id, slave_id, job.files[0], JOB_PREFIX)
- print("Fullpath", job_full_path)
- print("File:", main_file, "and %i other files" % (len(job.files) - 1,))
-
- for rfile in job.files[1:]:
- testFile(conn, job.id, slave_id, rfile, JOB_PREFIX, main_path)
- print("\t", rfile.filepath)
-
- netrender.repath.update(job)
-
- engine.update_stats("", "Render File "+ main_file+ " for job "+ job.id)
- elif job.type == netrender.model.JOB_VCS:
- if not job.version_info:
- # Need to return an error to server, incorrect job type
- pass
-
- job_path = job.files[0].filepath # path of main file
- main_path, main_file = os.path.split(job_path)
-
- job.version_info.update()
-
- # For VCS jobs, file path is relative to the working copy path
- job_full_path = os.path.join(job.version_info.wpath, job_path)
-
- engine.update_stats("", "Render File "+ main_file+ " for job "+ job.id)
-
- # announce log to master
- logfile = netrender.model.LogFile(job.id, slave_id, [frame.number for frame in job.frames])
- conn.request("POST", "/log", bytes(json.dumps(logfile.serialize()), encoding='utf8'))
- response = conn.getresponse()
- response.read()
-
-
- first_frame = job.frames[0].number
-
- # start render
- start_t = time.time()
-
- if job.rendersWithBlender():
- frame_args = []
-
- for frame in job.frames:
- print("frame", frame.number)
- frame_args += ["-f", str(frame.number)]
-
- val = SetErrorMode()
- process = subprocess.Popen([BLENDER_PATH, "-b", "-noaudio", job_full_path, "-t", str(threads), "-o", os.path.join(JOB_PREFIX, "######"), "-E", "BLENDER_RENDER", "-F", "MULTILAYER"] + frame_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- RestoreErrorMode(val)
- elif job.type == netrender.model.JOB_PROCESS:
- command = job.frames[0].command
- val = SetErrorMode()
- process = subprocess.Popen(command.split(" "), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- RestoreErrorMode(val)
-
- headers = {"slave-id":slave_id}
-
- cancelled = False
- stdout = bytes()
- run_t = time.time()
- while not cancelled and process.poll() is None:
- stdout += process.stdout.read(1024)
- current_t = time.time()
- cancelled = engine.test_break()
- if current_t - run_t > CANCEL_POLL_SPEED:
-
- # update logs if needed
- if stdout:
- # (only need to update on one frame, they are linked
- conn.request("PUT", logURL(job.id, first_frame), stdout, headers=headers)
- response = conn.getresponse()
- response.read()
-
- # Also output on console
- if netsettings.use_slave_output_log:
- print(str(stdout, encoding='utf8'), end="")
-
- stdout = bytes()
-
- run_t = current_t
- if testCancel(conn, job.id, first_frame):
- cancelled = True
-
- if job.type == netrender.model.JOB_BLENDER:
- netrender.repath.reset(job)
-
- # read leftovers if needed
- stdout += process.stdout.read()
-
- if cancelled:
- # kill process if needed
- if process.poll() is None:
- try:
- process.terminate()
- except OSError:
- pass
- continue # to next frame
-
- # flush the rest of the logs
- if stdout:
- # Also output on console
- if netsettings.use_slave_thumb:
- print(str(stdout, encoding='utf8'), end="")
-
- # (only need to update on one frame, they are linked
- conn.request("PUT", logURL(job.id, first_frame), stdout, headers=headers)
- if responseStatus(conn) == http.client.NO_CONTENT:
- continue
-
- total_t = time.time() - start_t
-
- avg_t = total_t / len(job.frames)
-
- status = process.returncode
-
- print("status", status)
-
- headers = {"job-id":job.id, "slave-id":slave_id, "job-time":str(avg_t)}
-
-
- if status == 0: # non zero status is error
- headers["job-result"] = str(DONE)
- for frame in job.frames:
- headers["job-frame"] = str(frame.number)
- if job.hasRenderResult():
- # send image back to server
-
- filename = os.path.join(JOB_PREFIX, "%06d.exr" % frame.number)
-
- # thumbnail first
- if netsettings.use_slave_thumb:
- thumbname = thumbnail.generate(filename)
-
- if thumbname:
- f = open(thumbname, 'rb')
- conn.request("PUT", "/thumb", f, headers=headers)
- f.close()
- responseStatus(conn)
-
- f = open(filename, 'rb')
- conn.request("PUT", "/render", f, headers=headers)
- f.close()
- if responseStatus(conn) == http.client.NO_CONTENT:
- continue
-
- elif job.type == netrender.model.JOB_PROCESS:
- conn.request("PUT", "/render", headers=headers)
- if responseStatus(conn) == http.client.NO_CONTENT:
- continue
- else:
- headers["job-result"] = str(ERROR)
- for frame in job.frames:
- headers["job-frame"] = str(frame.number)
- # send error result back to server
- conn.request("PUT", "/render", headers=headers)
- if responseStatus(conn) == http.client.NO_CONTENT:
- continue
-
- engine.update_stats("", "Network render connected to master, waiting for jobs")
- else:
- bisleep.sleep()
-
- conn.close()
-
- if netsettings.use_slave_clear:
- clearSlave(NODE_PREFIX)
-
-if __name__ == "__main__":
- pass
diff --git a/release/scripts/io/netrender/thumbnail.py b/release/scripts/io/netrender/thumbnail.py
deleted file mode 100644
index 2ead6e82745..00000000000
--- a/release/scripts/io/netrender/thumbnail.py
+++ /dev/null
@@ -1,81 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import sys, os
-import subprocess
-
-import bpy
-
-def generate(filename, external=True):
- if external:
- process = subprocess.Popen([sys.argv[0], "-b", "-noaudio", "-P", __file__, "--", filename], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- while process.poll() is None:
- process.stdout.read(1024) # empty buffer to be sure
- process.stdout.read()
-
- return _thumbname(filename)
- else:
- return _internal(filename)
-
-def _thumbname(filename):
- root = os.path.splitext(filename)[0]
- return root + ".jpg"
-
-def _internal(filename):
- imagename = os.path.split(filename)[1]
- thumbname = _thumbname(filename)
-
- if os.path.exists(thumbname):
- return thumbname
-
- if bpy:
- scene = bpy.data.scenes[0] # FIXME, this is dodgy!
- scene.render.file_format = "JPEG"
- scene.render.file_quality = 90
-
- # remove existing image, if there's a leftover (otherwise open changes the name)
- if imagename in bpy.data.images:
- img = bpy.data.images[imagename]
- bpy.data.images.remove(img)
-
- bpy.ops.image.open(filepath=filename)
- img = bpy.data.images[imagename]
-
- img.save_render(thumbname, scene=scene)
-
- img.user_clear()
- bpy.data.images.remove(img)
-
- try:
- process = subprocess.Popen(["convert", thumbname, "-resize", "300x300", thumbname])
- process.wait()
- return thumbname
- except Exception as exp:
- print("Error while generating thumbnail")
- print(exp)
-
- return None
-
-if __name__ == "__main__":
- import bpy
- try:
- start = sys.argv.index("--") + 1
- except ValueError:
- start = 0
- for filename in sys.argv[start:]:
- generate(filename, external=False)
diff --git a/release/scripts/io/netrender/ui.py b/release/scripts/io/netrender/ui.py
deleted file mode 100644
index 5894ff691be..00000000000
--- a/release/scripts/io/netrender/ui.py
+++ /dev/null
@@ -1,550 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import bpy
-import sys, os
-import http, http.client, http.server, urllib
-import subprocess, shutil, time, hashlib
-
-import netrender
-import netrender.slave as slave
-import netrender.master as master
-
-from netrender.utils import *
-
-VERSION = b"0.3"
-
-PATH_PREFIX = "/tmp/"
-
-QUEUED = 0
-DISPATCHED = 1
-DONE = 2
-ERROR = 3
-
-LAST_ADDRESS_TEST = 0
-
-def base_poll(cls, context):
- rd = context.scene.render
- return (rd.use_game_engine==False) and (rd.engine in cls.COMPAT_ENGINES)
-
-
-def init_file():
- if netrender.init_file != bpy.data.filepath:
- netrender.init_file = bpy.data.filepath
- netrender.init_data = True
- netrender.valid_address = False
-
-def init_data(netsettings):
- init_file()
-
- if netrender.init_data:
- netrender.init_data = False
-
- netsettings.active_slave_index = 0
- while(len(netsettings.slaves) > 0):
- netsettings.slaves.remove(0)
-
- netsettings.active_blacklisted_slave_index = 0
- while(len(netsettings.slaves_blacklist) > 0):
- netsettings.slaves_blacklist.remove(0)
-
- netsettings.active_job_index = 0
- while(len(netsettings.jobs) > 0):
- netsettings.jobs.remove(0)
-
-def verify_address(netsettings):
- global LAST_ADDRESS_TEST
- init_file()
-
- if LAST_ADDRESS_TEST + 30 < time.time():
- LAST_ADDRESS_TEST = time.time()
-
- try:
- conn = clientConnection(netsettings.server_address, netsettings.server_port, scan = False, timeout = 1)
- except:
- conn = None
-
- if conn:
- netrender.valid_address = True
- conn.close()
- else:
- netrender.valid_address = False
-
- return netrender.valid_address
-
-class NeedValidAddress():
- @classmethod
- def poll(cls, context):
- return super().poll(context) and verify_address(context.scene.network_render)
-
-class NetRenderButtonsPanel():
- bl_space_type = "PROPERTIES"
- bl_region_type = "WINDOW"
- bl_context = "render"
- # COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
-
- @classmethod
- def poll(cls, context):
- rd = context.scene.render
- return rd.engine == 'NET_RENDER' and rd.use_game_engine == False
-
-# Setting panel, use in the scene for now.
-class RENDER_PT_network_settings(NetRenderButtonsPanel, bpy.types.Panel):
- bl_label = "Network Settings"
- COMPAT_ENGINES = {'NET_RENDER'}
-
- @classmethod
- def poll(cls, context):
- return super().poll(context)
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
- netsettings = scene.network_render
-
- verify_address(netsettings)
-
- layout.prop(netsettings, "mode", expand=True)
-
- if netsettings.mode in ("RENDER_MASTER", "RENDER_SLAVE"):
- layout.operator("render.netclientstart", icon='PLAY')
-
- layout.prop(netsettings, "path")
-
- split = layout.split(percentage=0.7)
-
- col = split.column()
- col.label(text="Server Address:")
- col.prop(netsettings, "server_address", text="")
-
- col = split.column()
- col.label(text="Port:")
- col.prop(netsettings, "server_port", text="")
-
- if netsettings.mode != "RENDER_MASTER":
- layout.operator("render.netclientscan", icon='FILE_REFRESH', text="")
-
- if not netrender.valid_address:
- layout.label(text="No master at specified address")
-
- layout.operator("render.netclientweb", icon='QUESTION')
-
-class RENDER_PT_network_slave_settings(NetRenderButtonsPanel, bpy.types.Panel):
- bl_label = "Slave Settings"
- COMPAT_ENGINES = {'NET_RENDER'}
-
- @classmethod
- def poll(cls, context):
- scene = context.scene
- return super().poll(context) and scene.network_render.mode == "RENDER_SLAVE"
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
- rd = scene.render
- netsettings = scene.network_render
-
- layout.prop(netsettings, "use_slave_clear")
- layout.prop(netsettings, "use_slave_thumb")
- layout.prop(netsettings, "use_slave_output_log")
- layout.label(text="Threads:")
- layout.prop(rd, "threads_mode", expand=True)
- sub = layout.column()
- sub.enabled = rd.threads_mode == 'FIXED'
- sub.prop(rd, "threads")
-
-class RENDER_PT_network_master_settings(NetRenderButtonsPanel, bpy.types.Panel):
- bl_label = "Master Settings"
- COMPAT_ENGINES = {'NET_RENDER'}
-
- @classmethod
- def poll(cls, context):
- scene = context.scene
- return super().poll(context) and scene.network_render.mode == "RENDER_MASTER"
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
- netsettings = scene.network_render
-
- layout.prop(netsettings, "use_master_broadcast")
- layout.prop(netsettings, "use_master_clear")
-
-class RENDER_PT_network_job(NetRenderButtonsPanel, bpy.types.Panel):
- bl_label = "Job Settings"
- COMPAT_ENGINES = {'NET_RENDER'}
-
- @classmethod
- def poll(cls, context):
- scene = context.scene
- return super().poll(context) and scene.network_render.mode == "RENDER_CLIENT"
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
- netsettings = scene.network_render
-
- verify_address(netsettings)
-
- if netsettings.server_address != "[default]":
- layout.operator("render.netclientanim", icon='RENDER_ANIMATION')
- layout.operator("render.netclientsend", icon='FILE_BLEND')
- layout.operator("render.netclientsendframe", icon='RENDER_STILL')
- if netsettings.job_id:
- row = layout.row()
- row.operator("render.render", text="Get Image", icon='RENDER_STILL')
- row.operator("render.render", text="Get Animation", icon='RENDER_ANIMATION').animation = True
-
- split = layout.split(percentage=0.3)
-
- col = split.column()
- col.label(text="Type:")
- col.label(text="Name:")
- col.label(text="Category:")
-
- col = split.column()
- col.prop(netsettings, "job_type", text="")
- col.prop(netsettings, "job_name", text="")
- col.prop(netsettings, "job_category", text="")
-
- row = layout.row()
- row.prop(netsettings, "priority")
- row.prop(netsettings, "chunks")
-
-class RENDER_PT_network_job_vcs(NetRenderButtonsPanel, bpy.types.Panel):
- bl_label = "VCS Job Settings"
- COMPAT_ENGINES = {'NET_RENDER'}
-
- @classmethod
- def poll(cls, context):
- scene = context.scene
- return (super().poll(context)
- and scene.network_render.mode == "RENDER_CLIENT"
- and scene.network_render.job_type == "JOB_VCS")
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
- netsettings = scene.network_render
-
- layout.operator("render.netclientvcsguess", icon='FILE_REFRESH', text="")
-
- layout.prop(netsettings, "vcs_system")
- layout.prop(netsettings, "vcs_revision")
- layout.prop(netsettings, "vcs_rpath")
- layout.prop(netsettings, "vcs_wpath")
-
-class RENDER_PT_network_slaves(NeedValidAddress, NetRenderButtonsPanel, bpy.types.Panel):
- bl_label = "Slaves Status"
- COMPAT_ENGINES = {'NET_RENDER'}
-
- @classmethod
- def poll(cls, context):
- netsettings = context.scene.network_render
- return super().poll(context) and netsettings.mode == "RENDER_CLIENT"
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
- netsettings = scene.network_render
-
- row = layout.row()
- row.template_list(netsettings, "slaves", netsettings, "active_slave_index", rows=2)
-
- sub = row.column(align=True)
- sub.operator("render.netclientslaves", icon='FILE_REFRESH', text="")
- sub.operator("render.netclientblacklistslave", icon='ZOOMOUT', text="")
-
- if len(netrender.slaves) > netsettings.active_slave_index >= 0:
- layout.separator()
-
- slave = netrender.slaves[netsettings.active_slave_index]
-
- layout.label(text="Name: " + slave.name)
- layout.label(text="Address: " + slave.address[0])
- layout.label(text="Seen: " + time.ctime(slave.last_seen))
- layout.label(text="Stats: " + slave.stats)
-
-class RENDER_PT_network_slaves_blacklist(NeedValidAddress, NetRenderButtonsPanel, bpy.types.Panel):
- bl_label = "Slaves Blacklist"
- COMPAT_ENGINES = {'NET_RENDER'}
-
- @classmethod
- def poll(cls, context):
- netsettings = context.scene.network_render
- return super().poll(context) and netsettings.mode == "RENDER_CLIENT"
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
- netsettings = scene.network_render
-
- row = layout.row()
- row.template_list(netsettings, "slaves_blacklist", netsettings, "active_blacklisted_slave_index", rows=2)
-
- sub = row.column(align=True)
- sub.operator("render.netclientwhitelistslave", icon='ZOOMOUT', text="")
-
- if len(netrender.blacklist) > netsettings.active_blacklisted_slave_index >= 0:
- layout.separator()
-
- slave = netrender.blacklist[netsettings.active_blacklisted_slave_index]
-
- layout.label(text="Name: " + slave.name)
- layout.label(text="Address: " + slave.address[0])
- layout.label(text="Seen: " + time.ctime(slave.last_seen))
- layout.label(text="Stats: " + slave.stats)
-
-class RENDER_PT_network_jobs(NeedValidAddress, NetRenderButtonsPanel, bpy.types.Panel):
- bl_label = "Jobs"
- COMPAT_ENGINES = {'NET_RENDER'}
-
- @classmethod
- def poll(cls, context):
- netsettings = context.scene.network_render
- return super().poll(context) and netsettings.mode == "RENDER_CLIENT"
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
- netsettings = scene.network_render
-
- row = layout.row()
- row.template_list(netsettings, "jobs", netsettings, "active_job_index", rows=2)
-
- sub = row.column(align=True)
- sub.operator("render.netclientstatus", icon='FILE_REFRESH', text="")
- sub.operator("render.netclientcancel", icon='ZOOMOUT', text="")
- sub.operator("render.netclientcancelall", icon='PANEL_CLOSE', text="")
- sub.operator("render.netclientdownload", icon='RENDER_ANIMATION', text="")
-
- if len(netrender.jobs) > netsettings.active_job_index >= 0:
- layout.separator()
-
- job = netrender.jobs[netsettings.active_job_index]
-
- layout.label(text="Name: %s" % job.name)
- layout.label(text="Length: %04i" % len(job))
- layout.label(text="Done: %04i" % job.results[DONE])
- layout.label(text="Error: %04i" % job.results[ERROR])
-
-import properties_render
-class RENDER_PT_network_output(NeedValidAddress, NetRenderButtonsPanel, bpy.types.Panel):
- bl_label = "Output"
- COMPAT_ENGINES = {'NET_RENDER'}
-
- @classmethod
- def poll(cls, context):
- netsettings = context.scene.network_render
- return super().poll(context) and netsettings.mode == "RENDER_CLIENT"
-
- draw = properties_render.RENDER_PT_output.draw
-
-
-def addProperties():
- class NetRenderSettings(bpy.types.PropertyGroup):
- pass
-
- class NetRenderSlave(bpy.types.PropertyGroup):
- pass
-
- class NetRenderJob(bpy.types.PropertyGroup):
- pass
-
- bpy.utils.register_class(NetRenderSettings)
- bpy.utils.register_class(NetRenderSlave)
- bpy.utils.register_class(NetRenderJob)
-
- from bpy.props import PointerProperty, StringProperty, BoolProperty, EnumProperty, IntProperty, CollectionProperty
- bpy.types.Scene.network_render = PointerProperty(type=NetRenderSettings, name="Network Render", description="Network Render Settings")
-
- NetRenderSettings.server_address = StringProperty(
- name="Server address",
- description="IP or name of the master render server",
- maxlen = 128,
- default = "[default]")
-
- NetRenderSettings.server_port = IntProperty(
- name="Server port",
- description="port of the master render server",
- default = 8000,
- min=1,
- max=65535)
-
- NetRenderSettings.use_master_broadcast = BoolProperty(
- name="Broadcast",
- description="broadcast master server address on local network",
- default = True)
-
- NetRenderSettings.use_slave_clear = BoolProperty(
- name="Clear on exit",
- description="delete downloaded files on exit",
- default = True)
-
- NetRenderSettings.use_slave_thumb = BoolProperty(
- name="Generate thumbnails",
- description="Generate thumbnails on slaves instead of master",
- default = False)
-
- NetRenderSettings.use_slave_output_log = BoolProperty(
- name="Output render log on console",
- description="Output render text log to console as well as sending it to the master",
- default = True)
-
- NetRenderSettings.use_master_clear = BoolProperty(
- name="Clear on exit",
- description="delete saved files on exit",
- default = False)
-
- default_path = os.environ.get("TEMP")
-
- if not default_path:
- if os.name == 'nt':
- default_path = "c:/tmp/"
- else:
- default_path = "/tmp/"
- elif not default_path.endswith(os.sep):
- default_path += os.sep
-
- NetRenderSettings.path = StringProperty(
- name="Path",
- description="Path for temporary files",
- maxlen = 128,
- default = default_path,
- subtype='FILE_PATH')
-
- NetRenderSettings.job_type = EnumProperty(
- items=(
- ("JOB_BLENDER", "Blender", "Standard Blender Job"),
- ("JOB_PROCESS", "Process", "Custom Process Job"),
- ("JOB_VCS", "VCS", "Version Control System Managed Job"),
- ),
- name="Job Type",
- description="Type of render job",
- default="JOB_BLENDER")
-
- NetRenderSettings.job_name = StringProperty(
- name="Job name",
- description="Name of the job",
- maxlen = 128,
- default = "[default]")
-
- NetRenderSettings.job_category = StringProperty(
- name="Job category",
- description="Category of the job",
- maxlen = 128,
- default = "")
-
- NetRenderSettings.chunks = IntProperty(
- name="Chunks",
- description="Number of frame to dispatch to each slave in one chunk",
- default = 5,
- min=1,
- max=65535)
-
- NetRenderSettings.priority = IntProperty(
- name="Priority",
- description="Priority of the job",
- default = 1,
- min=1,
- max=10)
-
- NetRenderSettings.vcs_wpath = StringProperty(
- name="Working Copy",
- description="Path of the local working copy",
- maxlen = 1024,
- default = "")
-
- NetRenderSettings.vcs_rpath = StringProperty(
- name="Remote Path",
- description="Path of the server copy (protocol specific)",
- maxlen = 1024,
- default = "")
-
- NetRenderSettings.vcs_revision = StringProperty(
- name="Revision",
- description="Revision for this job",
- maxlen = 256,
- default = "")
-
- NetRenderSettings.vcs_system = StringProperty(
- name="VCS",
- description="Version Control System",
- maxlen = 64,
- default = "Subversion")
-
- NetRenderSettings.job_id = StringProperty(
- name="Network job id",
- description="id of the last sent render job",
- maxlen = 64,
- default = "")
-
- NetRenderSettings.active_slave_index = IntProperty(
- name="Index of the active slave",
- description="",
- default = -1,
- min= -1,
- max=65535)
-
- NetRenderSettings.active_blacklisted_slave_index = IntProperty(
- name="Index of the active slave",
- description="",
- default = -1,
- min= -1,
- max=65535)
-
- NetRenderSettings.active_job_index = IntProperty(
- name="Index of the active job",
- description="",
- default = -1,
- min= -1,
- max=65535)
-
- NetRenderSettings.mode = EnumProperty(
- items=(
- ("RENDER_CLIENT", "Client", "Act as render client"),
- ("RENDER_MASTER", "Master", "Act as render master"),
- ("RENDER_SLAVE", "Slave", "Act as render slave"),
- ),
- name="Network mode",
- description="Mode of operation of this instance",
- default="RENDER_CLIENT")
-
- NetRenderSettings.slaves = CollectionProperty(type=NetRenderSlave, name="Slaves", description="")
- NetRenderSettings.slaves_blacklist = CollectionProperty(type=NetRenderSlave, name="Slaves Blacklist", description="")
- NetRenderSettings.jobs = CollectionProperty(type=NetRenderJob, name="Job List", description="")
-
- NetRenderSlave.name = StringProperty(
- name="Name of the slave",
- description="",
- maxlen = 64,
- default = "")
-
- NetRenderJob.name = StringProperty(
- name="Name of the job",
- description="",
- maxlen = 128,
- default = "")
diff --git a/release/scripts/io/netrender/utils.py b/release/scripts/io/netrender/utils.py
deleted file mode 100644
index ed9fb2de812..00000000000
--- a/release/scripts/io/netrender/utils.py
+++ /dev/null
@@ -1,313 +0,0 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-import sys, os
-import re
-import http, http.client, http.server, urllib, socket
-import subprocess, shutil, time, hashlib, zlib
-
-import netrender.model
-
-try:
- import bpy
-except:
- bpy = None
-
-VERSION = bytes("1.3", encoding='utf8')
-
-# Jobs status
-JOB_WAITING = 0 # before all data has been entered
-JOB_PAUSED = 1 # paused by user
-JOB_FINISHED = 2 # finished rendering
-JOB_QUEUED = 3 # ready to be dispatched
-
-JOB_STATUS_TEXT = {
- JOB_WAITING: "Waiting",
- JOB_PAUSED: "Paused",
- JOB_FINISHED: "Finished",
- JOB_QUEUED: "Queued"
- }
-
-
-# Frames status
-QUEUED = 0
-DISPATCHED = 1
-DONE = 2
-ERROR = 3
-
-FRAME_STATUS_TEXT = {
- QUEUED: "Queued",
- DISPATCHED: "Dispatched",
- DONE: "Done",
- ERROR: "Error"
- }
-
-class DirectoryContext:
- def __init__(self, path):
- self.path = path
-
- def __enter__(self):
- self.curdir = os.path.abspath(os.curdir)
- os.chdir(self.path)
-
- def __exit__(self, exc_type, exc_value, traceback):
- os.chdir(self.curdir)
-
-class BreakableIncrementedSleep:
- def __init__(self, increment, default_timeout, max_timeout, break_fct):
- self.increment = increment
- self.default = default_timeout
- self.max = max_timeout
- self.current = self.default
- self.break_fct = break_fct
-
- def reset(self):
- self.current = self.default
-
- def increase(self):
- self.current = min(self.current + self.increment, self.max)
-
- def sleep(self):
- for i in range(self.current):
- time.sleep(1)
- if self.break_fct():
- break
-
- self.increase()
-
-def responseStatus(conn):
- response = conn.getresponse()
- response.read()
- return response.status
-
-def reporting(report, message, errorType = None):
- if errorType:
- t = 'ERROR'
- else:
- t = 'INFO'
-
- if report:
- report(t, message)
- return None
- elif errorType:
- raise errorType(message)
- else:
- return None
-
-def clientScan(report = None):
- try:
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
- s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
- s.settimeout(30)
-
- s.bind(('', 8000))
-
- buf, address = s.recvfrom(64)
-
- address = address[0]
- port = int(str(buf, encoding='utf8'))
-
- reporting(report, "Master server found")
-
- return (address, port)
- except socket.timeout:
- reporting(report, "No master server on network", IOError)
-
- return ("", 8000) # return default values
-
-def clientConnection(address, port, report = None, scan = True, timeout = 5):
- if address == "[default]":
-# calling operator from python is fucked, scene isn't in context
-# if bpy:
-# bpy.ops.render.netclientscan()
-# else:
- if not scan:
- return None
-
- address, port = clientScan()
- if address == "":
- return None
-
- try:
- conn = http.client.HTTPConnection(address, port, timeout = timeout)
-
- if conn:
- if clientVerifyVersion(conn):
- return conn
- else:
- conn.close()
- reporting(report, "Incorrect master version", ValueError)
- except BaseException as err:
- if report:
- report('ERROR', str(err))
- return None
- else:
- print(err)
- return None
-
-def clientVerifyVersion(conn):
- conn.request("GET", "/version")
- response = conn.getresponse()
-
- if response.status != http.client.OK:
- conn.close()
- return False
-
- server_version = response.read()
-
- if server_version != VERSION:
- print("Incorrect server version!")
- print("expected", str(VERSION, encoding='utf8'), "received", str(server_version, encoding='utf8'))
- return False
-
- return True
-
-def fileURL(job_id, file_index):
- return "/file_%s_%i" % (job_id, file_index)
-
-def logURL(job_id, frame_number):
- return "/log_%s_%i.log" % (job_id, frame_number)
-
-def renderURL(job_id, frame_number):
- return "/render_%s_%i.exr" % (job_id, frame_number)
-
-def cancelURL(job_id):
- return "/cancel_%s" % (job_id)
-
-def hashFile(path):
- f = open(path, "rb")
- value = hashData(f.read())
- f.close()
- return value
-
-def hashData(data):
- m = hashlib.md5()
- m.update(data)
- return m.hexdigest()
-
-
-def prefixPath(prefix_directory, file_path, prefix_path, force = False):
- if (os.path.isabs(file_path) or
- len(file_path) >= 3 and (file_path[1:3] == ":/" or file_path[1:3] == ":\\") or # Windows absolute path don't count as absolute on unix, have to handle them myself
- file_path[0] == "/" or file_path[0] == "\\"): # and vice versa
-
- # if an absolute path, make sure path exists, if it doesn't, use relative local path
- full_path = file_path
- if force or not os.path.exists(full_path):
- p, n = os.path.split(os.path.normpath(full_path))
-
- if prefix_path and p.startswith(prefix_path):
- if len(prefix_path) < len(p):
- directory = os.path.join(prefix_directory, p[len(prefix_path)+1:]) # +1 to remove separator
- if not os.path.exists(directory):
- os.mkdir(directory)
- else:
- directory = prefix_directory
- full_path = os.path.join(directory, n)
- else:
- full_path = os.path.join(prefix_directory, n)
- else:
- full_path = os.path.join(prefix_directory, file_path)
-
- return full_path
-
-def getResults(server_address, server_port, job_id, resolution_x, resolution_y, resolution_percentage, frame_ranges):
- if bpy.app.debug:
- print("=============================================")
- print("============= FETCHING RESULTS ==============")
-
- frame_arguments = []
- for r in frame_ranges:
- if len(r) == 2:
- frame_arguments.extend(["-s", str(r[0]), "-e", str(r[1]), "-a"])
- else:
- frame_arguments.extend(["-f", str(r[0])])
-
- filepath = os.path.join(bpy.app.tempdir, "netrender_temp.blend")
- bpy.ops.wm.save_as_mainfile(filepath=filepath, copy=True, check_existing=False)
-
- arguments = [sys.argv[0], "-b", "-noaudio", filepath, "-o", bpy.path.abspath(bpy.context.scene.render.filepath), "-P", __file__] + frame_arguments + ["--", "GetResults", server_address, str(server_port), job_id, str(resolution_x), str(resolution_y), str(resolution_percentage)]
- if bpy.app.debug:
- print("Starting subprocess:")
- print(" ".join(arguments))
-
- process = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- while process.poll() is None:
- stdout = process.stdout.read(1024)
- if bpy.app.debug:
- print(str(stdout, encoding='utf-8'), end="")
-
-
- # read leftovers if needed
- stdout = process.stdout.read()
- if bpy.app.debug:
- print(str(stdout, encoding='utf-8'))
-
- os.remove(filepath)
-
- if bpy.app.debug:
- print("=============================================")
- return
-
-def _getResults(server_address, server_port, job_id, resolution_x, resolution_y, resolution_percentage):
- render = bpy.context.scene.render
-
- netsettings = bpy.context.scene.network_render
-
- netsettings.server_address = server_address
- netsettings.server_port = int(server_port)
- netsettings.job_id = job_id
-
- render.engine = 'NET_RENDER'
- render.resolution_x = int(resolution_x)
- render.resolution_y = int(resolution_y)
- render.resolution_percentage = int(resolution_percentage)
-
- render.use_full_sample = False
- render.use_compositing = False
- render.use_border = False
-
-
-def getFileInfo(filepath, infos):
- process = subprocess.Popen([sys.argv[0], "-b", "-noaudio", filepath, "-P", __file__, "--", "FileInfo"] + infos, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- stdout = bytes()
- while process.poll() is None:
- stdout += process.stdout.read(1024)
-
- # read leftovers if needed
- stdout += process.stdout.read()
-
- stdout = str(stdout, encoding="utf8")
-
- values = [eval(v[1:].strip()) for v in stdout.split("\n") if v.startswith("$")]
-
- return values
-
-
-if __name__ == "__main__":
- try:
- start = sys.argv.index("--") + 1
- except ValueError:
- start = 0
- action, *args = sys.argv[start:]
-
- if action == "FileInfo":
- for info in args:
- print("$", eval(info))
- elif action == "GetResults":
- _getResults(args[0], args[1], args[2], args[3], args[4], args[5])
diff --git a/release/scripts/io/netrender/versioning.py b/release/scripts/io/netrender/versioning.py
deleted file mode 100644
index d4f8522cce8..00000000000
--- a/release/scripts/io/netrender/versioning.py
+++ /dev/null
@@ -1,72 +0,0 @@
-import sys, os
-import re
-import subprocess
-
-from netrender.utils import *
-
-class AbstractVCS:
- name = "ABSTRACT VCS"
- def __init__(self):
- pass
-
- def update(self, info):
- """update(info)
- Update a working copy to the specified revision.
- If working copy doesn't exist, do a full get from server to create it.
- [info] model.VersioningInfo instance, specifies the working path, remote path and version number."""
- pass
-
- def revision(self, path):
- """revision(path)
- return the current revision of the specified working copy path"""
- pass
-
- def path(self, path):
- """path(path)
- return the remote path of the specified working copy path"""
- pass
-
-class Subversion(AbstractVCS):
- name = "Subversion"
- def __init__(self):
- super().__init__()
- self.version_exp = re.compile("([0-9]*)")
- self.path_exp = re.compile("URL: (.*)")
-
- def update(self, info):
- if not os.path.exists(info.wpath):
- base, folder = os.path.split(info.wpath)
-
- with DirectoryContext(base):
- subprocess.call(["svn", "co", "%s@%s" % (info.rpath, str(info.revision)), folder])
- else:
- with DirectoryContext(info.wpath):
- subprocess.call(["svn", "up", "--accept", "theirs-full", "-r", str(info.revision)])
-
- def revision(self, path):
- if not os.path.exists(path):
- return
-
- with DirectoryContext(path):
- stdout = subprocess.check_output(["svnversion"])
-
- match = self.version_exp.match(str(stdout, encoding="utf-8"))
-
- if match:
- return match.group(1)
-
- def path(self, path):
- if not os.path.exists(path):
- return
-
- with DirectoryContext(path):
- stdout = subprocess.check_output(["svn", "info"])
-
- match = self.path_exp.search(str(stdout, encoding="utf-8"))
-
- if match:
- return match.group(1)
-
-SYSTEMS = {
- Subversion.name: Subversion()
- }
diff --git a/release/scripts/keyingsets/keyingsets_utils.py b/release/scripts/keyingsets/keyingsets_utils.py
deleted file mode 100644
index 901aa715296..00000000000
--- a/release/scripts/keyingsets/keyingsets_utils.py
+++ /dev/null
@@ -1,159 +0,0 @@
-# This file defines a set of methods that are useful for various
-# Relative Keying Set (RKS) related operations, such as: callbacks
-# for polling, iterator callbacks, and also generate callbacks.
-# All of these can be used in conjunction with the others.
-
-import bpy
-
-###########################
-# General Utilities
-
-# Append the specified property name on the the existing path
-def path_add_property(path, prop):
- if len(path):
- return path + "." + prop;
- else:
- return prop;
-
-###########################
-# Poll Callbacks
-
-# selected objects
-def RKS_POLL_selected_objects(ksi, context):
- return context.active_object or len(context.selected_objects);
-
-# selected bones
-def RKS_POLL_selected_bones(ksi, context):
- # we must be in Pose Mode, and there must be some bones selected
- if (context.active_object) and (context.active_object.mode == 'POSE'):
- if context.active_pose_bone or len(context.selected_pose_bones):
- return True;
-
- # nothing selected
- return False;
-
-
-# selected bones or objects
-def RKS_POLL_selected_items(ksi, context):
- return RKS_POLL_selected_bones(ksi, context) or RKS_POLL_selected_objects(ksi, context);
-
-###########################
-# Iterator Callbacks
-
-# all selected objects or pose bones, depending on which we've got
-def RKS_ITER_selected_item(ksi, context, ks):
- if (context.active_object) and (context.active_object.mode == 'POSE'):
- for bone in context.selected_pose_bones:
- ksi.generate(context, ks, bone)
- else:
- for ob in context.selected_objects:
- ksi.generate(context, ks, ob)
-
-###########################
-# Generate Callbacks
-
-# 'Available' F-Curves
-def RKS_GEN_available(ksi, context, ks, data):
- # try to get the animation data associated with the closest
- # ID-block to the data (neither of which may exist/be easy to find)
- id_block = data.id_data
- adt = getattr(id_block, "animation_data", None)
-
- # there must also be an active action...
- if adt is None or adt.action is None:
- return;
-
- # for each F-Curve, include an path to key it
- # NOTE: we don't need to set the group settings here
- for fcu in adt.action.fcurves:
- ks.paths.add(id_block, fcu.data_path, index=fcu.array_index)
-
-# ------
-
-# get ID block and based ID path for transform generators
-def get_transform_generators_base_info(data):
- # ID-block for the data
- id_block = data.id_data
-
- # get base path and grouping method/name
- if isinstance(data, bpy.types.ID):
- # no path in this case
- path = ""
-
- # data on ID-blocks directly should get grouped by the KeyingSet
- grouping = None
- else:
- # get the path to the ID-block
- path = data.path_from_id()
-
- # try to use the name of the data element to group the F-Curve
- # else fallback on the KeyingSet name
- grouping = getattr(data, "name", None)
-
- # return the ID-block and the path
- return id_block, path, grouping
-
-# Location
-def RKS_GEN_location(ksi, context, ks, data):
- # get id-block and path info
- id_block, base_path, grouping = get_transform_generators_base_info(data)
-
- # add the property name to the base path
- path = path_add_property(base_path, "location")
-
- # add Keying Set entry for this...
- if grouping:
- ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
- else:
- ks.paths.add(id_block, path)
-
-# Rotation
-def RKS_GEN_rotation(ksi, context, ks, data):
- # get id-block and path info
- id_block, base_path, grouping= get_transform_generators_base_info(data)
-
- # add the property name to the base path
- # rotation mode affects the property used
- if data.rotation_mode == 'QUATERNION':
- path = path_add_property(base_path, "rotation_quaternion")
- elif data.rotation_mode == 'AXIS_ANGLE':
- path = path_add_property(base_path, "rotation_axis_angle")
- else:
- path = path_add_property(base_path, "rotation_euler")
-
- # add Keying Set entry for this...
- if grouping:
- ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
- else:
- ks.paths.add(id_block, path)
-
-# Scaling
-def RKS_GEN_scaling(ksi, context, ks, data):
- # get id-block and path info
- id_block, base_path, grouping= get_transform_generators_base_info(data)
-
- # add the property name to the base path
- path = path_add_property(base_path, "scale")
-
- # add Keying Set entry for this...
- if grouping:
- ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
- else:
- ks.paths.add(id_block, path)
-
-###########################
-# Un-needed stuff which is here to just shut up the warnings...
-
-classes = []
-
-def register():
- pass
-
-
-def unregister():
- pass
-
-if __name__ == "__main__":
- register()
-
-###########################
diff --git a/release/scripts/modules/addon_utils.py b/release/scripts/modules/addon_utils.py
index d2001087f13..3877f711b7f 100644
--- a/release/scripts/modules/addon_utils.py
+++ b/release/scripts/modules/addon_utils.py
@@ -97,10 +97,17 @@ def modules(module_cache):
break
if body_info:
- mod = ModuleType(mod_name)
- mod.bl_info = ast.literal_eval(body.value)
- mod.__file__ = mod_path
- mod.__time__ = os.path.getmtime(mod_path)
+ try:
+ mod = ModuleType(mod_name)
+ mod.bl_info = ast.literal_eval(body.value)
+ mod.__file__ = mod_path
+ mod.__time__ = os.path.getmtime(mod_path)
+ except:
+ print("AST error in module %s" % mod_name)
+ import traceback
+ traceback.print_exc()
+ raise
+
return mod
else:
return None
@@ -239,7 +246,6 @@ def disable(module_name, default_set=True):
:type module_name: string
"""
import sys
- import traceback
import bpy_types as _bpy_types
mod = sys.modules.get(module_name)
@@ -252,6 +258,7 @@ def disable(module_name, default_set=True):
try:
mod.unregister()
except:
+ import traceback
traceback.print_exc()
else:
print("addon_utils.disable", module_name, "not loaded")
diff --git a/release/scripts/modules/animsys_refactor.py b/release/scripts/modules/animsys_refactor.py
index 464df870e87..5336a8b2b35 100644
--- a/release/scripts/modules/animsys_refactor.py
+++ b/release/scripts/modules/animsys_refactor.py
@@ -28,6 +28,12 @@ The main function to use is: update_data_paths(...)
IS_TESTING = False
+def drepr(string):
+ # is there a less crappy way to do this in python?, re.escape also escapes
+ # single quotes strings so cant use it.
+ return '"%s"' % repr(string)[1:-1].replace("\"", "\\\"").replace("\\'", "'")
+
+
class DataPathBuilder(object):
__slots__ = ("data_path", )
""" Dummy class used to parse fcurve and driver data paths.
@@ -40,7 +46,12 @@ class DataPathBuilder(object):
return DataPathBuilder(self.data_path + (str_value, ))
def __getitem__(self, key):
- str_value = '["%s"]' % key
+ if type(key) is int:
+ str_value = '[%d]' % key
+ elif type(key) is str:
+ str_value = '[%s]' % drepr(key)
+ else:
+ raise Exception("unsupported accessor %r of type %r (internal error)" % (key, type(key)))
return DataPathBuilder(self.data_path + (str_value, ))
def resolve(self, real_base, rna_update_from_map=None):
@@ -170,6 +181,15 @@ def update_data_paths(rna_update):
continue
for fcurve in anim_data.drivers:
+ data_path = fcurve.data_path
+ data_path_new = find_path_new(anim_data_base, data_path, rna_update_dict, rna_update_from_map)
+ # print(data_path_new)
+ if data_path_new != data_path:
+ if not IS_TESTING:
+ fcurve.data_path = data_path_new
+ fcurve.driver.is_valid = True # reset to allow this to work again
+ print("driver-fcurve (%s): %s -> %s" % (id_data.name, data_path, data_path_new))
+
for var in fcurve.driver.variables:
if var.type == 'SINGLE_PROP':
for tar in var.targets:
diff --git a/release/scripts/modules/bpy/__init__.py b/release/scripts/modules/bpy/__init__.py
index 5c636d3a0df..1df8e9e5588 100644
--- a/release/scripts/modules/bpy/__init__.py
+++ b/release/scripts/modules/bpy/__init__.py
@@ -18,6 +18,10 @@
# <pep8 compliant>
+"""
+Give access to blender data and utility functions.
+"""
+
# internal blender C module
import _bpy
from _bpy import types, props, app
@@ -37,18 +41,6 @@ import sys as _sys
def _main():
- ## security issue, dont allow the $CWD in the path.
- ## note: this removes "" but not "." which are the same, security
- ## people need to explain how this is even a fix.
- # _sys.path[:] = filter(None, _sys.path)
-
- # because of how the console works. we need our own help() pager func.
- # replace the bold function because it adds crazy chars
- import pydoc
- pydoc.getpager = lambda: pydoc.plainpager
- pydoc.Helper.getline = lambda self, prompt: None
- pydoc.TextDoc.use_bold = lambda self, text: text
-
# Possibly temp. addons path
from os.path import join, dirname, normpath
_sys.path.append(normpath(join(dirname(__file__), "..", "..", "addons", "modules")))
diff --git a/release/scripts/modules/bpy/utils.py b/release/scripts/modules/bpy/utils.py
index 76278ca8fa1..eee98bdca37 100644
--- a/release/scripts/modules/bpy/utils.py
+++ b/release/scripts/modules/bpy/utils.py
@@ -23,10 +23,7 @@ This module contains utility functions specific to blender but
not assosiated with blenders internal data.
"""
-from _bpy import register_class
-from _bpy import unregister_class
-
-from _bpy import blend_paths
+from _bpy import register_class, unregister_class, blend_paths, resource_path
from _bpy import script_paths as _bpy_script_paths
from _bpy import user_resource as _user_resource
@@ -34,26 +31,30 @@ import bpy as _bpy
import os as _os
import sys as _sys
-import addon_utils
+import addon_utils as _addon_utils
def _test_import(module_name, loaded_modules):
- import traceback
- import time
+ use_time = _bpy.app.debug
+
if module_name in loaded_modules:
return None
if "." in module_name:
print("Ignoring '%s', can't import files containing multiple periods." % module_name)
return None
- t = time.time()
+ if use_time:
+ import time
+ t = time.time()
+
try:
mod = __import__(module_name)
except:
+ import traceback
traceback.print_exc()
return None
- if _bpy.app.debug:
+ if use_time:
print("time %s %.4f" % (module_name, time.time() - t))
loaded_modules.add(mod.__name__) # should match mod.__name__ too
@@ -99,10 +100,11 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
:arg refresh_scripts: only load scripts which are not already loaded as modules.
:type refresh_scripts: bool
"""
- import traceback
- import time
+ use_time = _bpy.app.debug
- t_main = time.time()
+ if use_time:
+ import time
+ t_main = time.time()
loaded_modules = set()
@@ -116,7 +118,7 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
# note that they will only actually reload of the modification time changes.
# this `wont` work for packages so... its not perfect.
for module_name in [ext.module for ext in _bpy.context.user_preferences.addons]:
- addon_utils.disable(module_name, default_set=False)
+ _addon_utils.disable(module_name, default_set=False)
def register_module_call(mod):
register = getattr(mod, "register", None)
@@ -124,6 +126,7 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
try:
register()
except:
+ import traceback
traceback.print_exc()
else:
print("\nWarning! '%s' has no register function, this is now a requirement for registerable scripts." % mod.__file__)
@@ -134,6 +137,7 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
try:
unregister()
except:
+ import traceback
traceback.print_exc()
def test_reload(mod):
@@ -147,6 +151,7 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
try:
return imp.reload(mod)
except:
+ import traceback
traceback.print_exc()
def test_register(mod):
@@ -177,10 +182,8 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
_global_loaded_modules[:] = []
- user_path = user_script_path()
-
for base_path in script_paths():
- for path_subdir in ("", "ui", "op", "io", "keyingsets", "modules"):
+ for path_subdir in ("startup", "modules"):
path = _os.path.join(base_path, path_subdir)
if _os.path.isdir(path):
_sys_path_ensure(path)
@@ -189,14 +192,11 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
if path_subdir == "modules":
continue
- if user_path != base_path and path_subdir == "":
- continue # avoid loading 2.4x scripts
-
for mod in modules_from_path(path, loaded_modules):
test_register(mod)
- # deal with addons seperately
- addon_utils.reset_all(reload_scripts)
+ # deal with addons separately
+ _addon_utils.reset_all(reload_scripts)
# run the active integration preset
filepath = preset_find(_bpy.context.user_preferences.inputs.active_keyconfig, "keyconfig")
@@ -207,7 +207,7 @@ def load_scripts(reload_scripts=False, refresh_scripts=False):
import gc
print("gc.collect() -> %d" % gc.collect())
- if _bpy.app.debug:
+ if use_time:
print("Python Script Load Time %.4f" % (time.time() - t_main))
@@ -347,12 +347,13 @@ def keyconfig_set(filepath):
print("loading preset:", filepath)
keyconfigs = _bpy.context.window_manager.keyconfigs
- kc_orig = keyconfigs.active
keyconfigs_old = keyconfigs[:]
try:
- exec(compile(open(filepath).read(), filepath, 'exec'), {"__file__": filepath})
+ file = open(filepath)
+ exec(compile(file.read(), filepath, 'exec'), {"__file__": filepath})
+ file.close()
except:
import traceback
traceback.print_exc()
@@ -412,48 +413,47 @@ def _bpy_module_classes(module, is_registered=False):
typemap_list = _bpy_types.TypeMap.get(module, ())
i = 0
while i < len(typemap_list):
- cls_weakref, path, line = typemap_list[i]
+ cls_weakref = typemap_list[i]
cls = cls_weakref()
if cls is None:
del typemap_list[i]
else:
if is_registered == cls.is_registered:
- yield (cls, path, line)
+ yield cls
i += 1
def register_module(module, verbose=False):
- import traceback
if verbose:
print("bpy.utils.register_module(%r): ..." % module)
- for cls, path, line in _bpy_module_classes(module, is_registered=False):
+ cls = None
+ for cls in _bpy_module_classes(module, is_registered=False):
if verbose:
- print(" %s of %s:%s" % (cls, path, line))
+ print(" %r" % cls)
try:
register_class(cls)
except:
- print("bpy.utils.register_module(): failed to registering class '%s.%s'" % (cls.__module__, cls.__name__))
- print("\t", path, "line", line)
+ print("bpy.utils.register_module(): failed to registering class %r" % cls)
+ import traceback
traceback.print_exc()
if verbose:
print("done.\n")
- if "cls" not in locals():
+ if cls is None:
raise Exception("register_module(%r): defines no classes" % module)
def unregister_module(module, verbose=False):
- import traceback
if verbose:
print("bpy.utils.unregister_module(%r): ..." % module)
- for cls, path, line in _bpy_module_classes(module, is_registered=True):
+ for cls in _bpy_module_classes(module, is_registered=True):
if verbose:
- print(" %s of %s:%s" % (cls, path, line))
+ print(" %r" % cls)
try:
unregister_class(cls)
except:
- print("bpy.utils.unregister_module(): failed to unregistering class '%s.%s'" % (cls.__module__, cls.__name__))
- print("\t", path, "line", line)
+ print("bpy.utils.unregister_module(): failed to unregistering class %r" % cls)
+ import traceback
traceback.print_exc()
if verbose:
print("done.\n")
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index f7429474b06..c3352dd33ad 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -26,6 +26,8 @@ StructRNA = bpy_types.Struct.__bases__[0]
StructMetaPropGroup = _bpy.StructMetaPropGroup
# StructRNA = bpy_types.Struct
+bpy_types.BlendDataLibraries.load = _bpy._library_load
+
class Context(StructRNA):
__slots__ = ()
@@ -567,18 +569,15 @@ TypeMap = {}
class RNAMeta(type):
def __new__(cls, name, bases, classdict, **args):
result = type.__new__(cls, name, bases, classdict)
- if bases and bases[0] != StructRNA:
- import traceback
- import weakref
+ if bases and bases[0] is not StructRNA:
+ from _weakref import ref as ref
module = result.__module__
# first part of packages only
if "." in module:
module = module[:module.index(".")]
- sf = traceback.extract_stack(limit=2)[0]
-
- TypeMap.setdefault(module, []).append((weakref.ref(result), sf[0], sf[1]))
+ TypeMap.setdefault(module, []).append(ref(result))
return result
@@ -586,7 +585,20 @@ class RNAMeta(type):
def is_registered(cls):
return "bl_rna" in cls.__dict__
-import collections
+
+class OrderedDictMini(dict):
+ def __init__(self, *args):
+ self.order = []
+ dict.__init__(self, args)
+
+ def __setitem__(self, key, val):
+ dict.__setitem__(self, key, val)
+ if key not in self.order:
+ self.order.append(key)
+
+ def __delitem__(self, key):
+ dict.__delitem__(self, key)
+ self.order.remove(key)
class RNAMetaPropGroup(RNAMeta, StructMetaPropGroup):
@@ -594,13 +606,12 @@ class RNAMetaPropGroup(RNAMeta, StructMetaPropGroup):
class OrderedMeta(RNAMeta):
-
def __init__(cls, name, bases, attributes):
- super(OrderedMeta, cls).__init__(name, bases, attributes)
- cls.order = list(attributes.keys())
+ if attributes.__class__ is OrderedDictMini:
+ cls.order = attributes.order
def __prepare__(name, bases, **kwargs):
- return collections.OrderedDict()
+ return OrderedDictMini() # collections.OrderedDict()
# Only defined so operators members can be used by accessing self.order
@@ -669,6 +680,9 @@ class _GenericUI:
if draw_funcs is None:
def draw_ls(self, context):
+ # ensure menus always get default context
+ operator_context_default = self.layout.operator_context
+
for func in draw_ls._draw_funcs:
# so bad menu functions dont stop the entire menu from drawing.
try:
@@ -677,6 +691,8 @@ class _GenericUI:
import traceback
traceback.print_exc()
+ self.layout.operator_context = operator_context_default
+
draw_funcs = draw_ls._draw_funcs = [cls.draw]
cls.draw = draw_ls
diff --git a/release/scripts/modules/bpyml.py b/release/scripts/modules/bpyml.py
index f1f72d50fd2..fdf5172a0b3 100644
--- a/release/scripts/modules/bpyml.py
+++ b/release/scripts/modules/bpyml.py
@@ -160,9 +160,9 @@ if __name__ == "__main__":
from bpyml_test import *
draw = [
- ui() [
- split() [
- column() [
+ ui()[
+ split()[
+ column()[
prop(data='context.scene.render', property='use_stamp_time', text='Time'),
prop(data='context.scene.render', property='use_stamp_date', text='Date'),
prop(data='context.scene.render', property='use_stamp_render_time', text='RenderTime'),
@@ -173,7 +173,7 @@ if __name__ == "__main__":
prop(data='context.scene.render', property='use_stamp_marker', text='Marker'),
prop(data='context.scene.render', property='use_stamp_sequencer_strip', text='Seq. Strip')
],
- column() [
+ column()[
active(expr='context.scene.render.use_stamp'),
prop(data='context.scene.render', property='stamp_foreground', slider=True),
prop(data='context.scene.render', property='stamp_background', slider=True),
@@ -181,9 +181,9 @@ if __name__ == "__main__":
prop(data='context.scene.render', property='stamp_font_size', text='Font Size')
]
],
- split(percentage=0.2) [
+ split(percentage=0.2)[
prop(data='context.scene.render', property='use_stamp_note', text='Note'),
- row() [
+ row()[
active(expr='context.scene.render.use_stamp_note'),
prop(data='context.scene.render', property='stamp_note_text', text='')
]
diff --git a/release/scripts/modules/bpyml_ui.py b/release/scripts/modules/bpyml_ui.py
index 2462dd60e3e..1e0522974d1 100644
--- a/release/scripts/modules/bpyml_ui.py
+++ b/release/scripts/modules/bpyml_ui.py
@@ -65,7 +65,7 @@ def _parse_rna_args(base, py_node):
def _call_recursive(context, base, py_node):
- prop = base.bl_rna.properties.get(py_node[TAG])
+ # prop = base.bl_rna.properties.get(py_node[TAG])
if py_node[TAG] in base.bl_rna.properties:
value = py_node[ARGS].get("expr")
if value:
@@ -73,7 +73,7 @@ def _call_recursive(context, base, py_node):
setattr(base, py_node[TAG], value)
else:
value = py_node[ARGS]['value'] # have to have this
- setattr(base, name, value)
+ setattr(base, py_node[TAG], value)
else:
args = _parse_rna_args(base, py_node)
func_new = getattr(base, py_node[TAG])
diff --git a/release/scripts/modules/console_python.py b/release/scripts/modules/console_python.py
new file mode 100644
index 00000000000..3048fa1d597
--- /dev/null
+++ b/release/scripts/modules/console_python.py
@@ -0,0 +1,306 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+import sys
+import bpy
+
+language_id = 'python'
+
+# store our own __main__ module, not 100% needed
+# but python expects this in some places
+_BPY_MAIN_OWN = True
+
+
+def add_scrollback(text, text_type):
+ for l in text.split('\n'):
+ bpy.ops.console.scrollback_append(text=l.replace('\t', ' '),
+ type=text_type)
+
+
+def replace_help(namespace):
+ def _help(*args):
+ # because of how the console works. we need our own help() pager func.
+ # replace the bold function because it adds crazy chars
+ import pydoc
+ pydoc.getpager = lambda: pydoc.plainpager
+ pydoc.Helper.getline = lambda self, prompt: None
+ pydoc.TextDoc.use_bold = lambda self, text: text
+
+ pydoc.help(*args)
+
+ namespace["help"] = _help
+
+
+def get_console(console_id):
+ '''
+ helper function for console operators
+ currently each text datablock gets its own
+ console - code.InteractiveConsole()
+ ...which is stored in this function.
+
+ console_id can be any hashable type
+ '''
+ from code import InteractiveConsole
+
+ consoles = getattr(get_console, "consoles", None)
+ hash_next = hash(bpy.context.window_manager)
+
+ if consoles is None:
+ consoles = get_console.consoles = {}
+ get_console.consoles_namespace_hash = hash_next
+ else:
+ # check if clearning the namespace is needed to avoid a memory leak.
+ # the window manager is normally loaded with new blend files
+ # so this is a reasonable way to deal with namespace clearing.
+ # bpy.data hashing is reset by undo so cant be used.
+ hash_prev = getattr(get_console, "consoles_namespace_hash", 0)
+
+ if hash_prev != hash_next:
+ get_console.consoles_namespace_hash = hash_next
+ consoles.clear()
+
+ console_data = consoles.get(console_id)
+
+ if console_data:
+ console, stdout, stderr = console_data
+
+ # XXX, bug in python 3.1.2 ? (worked in 3.1.1)
+ # seems there is no way to clear StringIO objects for writing, have to make new ones each time.
+ import io
+ stdout = io.StringIO()
+ stderr = io.StringIO()
+ else:
+ if _BPY_MAIN_OWN:
+ import types
+ bpy_main_mod = types.ModuleType("__main__")
+ namespace = bpy_main_mod.__dict__
+ else:
+ namespace = {}
+
+ namespace["__builtins__"] = sys.modules["builtins"]
+ namespace["bpy"] = bpy
+ namespace["C"] = bpy.context
+
+ replace_help(namespace)
+
+ console = InteractiveConsole(locals=namespace, filename="<blender_console>")
+
+ console.push("from mathutils import *")
+ console.push("from math import *")
+
+ if _BPY_MAIN_OWN:
+ console._bpy_main_mod = bpy_main_mod
+
+ import io
+ stdout = io.StringIO()
+ stderr = io.StringIO()
+
+ consoles[console_id] = console, stdout, stderr
+
+ return console, stdout, stderr
+
+
+# Both prompts must be the same length
+PROMPT = '>>> '
+PROMPT_MULTI = '... '
+
+
+def execute(context):
+ sc = context.space_data
+
+ try:
+ line_object = sc.history[-1]
+ except:
+ return {'CANCELLED'}
+
+ console, stdout, stderr = get_console(hash(context.region))
+
+ # redirect output
+ sys.stdout = stdout
+ sys.stderr = stderr
+
+ # dont allow the stdin to be used, can lock blender.
+ stdin_backup = sys.stdin
+ sys.stdin = None
+
+ if _BPY_MAIN_OWN:
+ main_mod_back = sys.modules["__main__"]
+ sys.modules["__main__"] = console._bpy_main_mod
+
+ # incase exception happens
+ line = "" # incase of encodingf error
+ is_multiline = False
+
+ try:
+ line = line_object.body
+
+ # run the console, "\n" executes a multiline statement
+ line_exec = line if line.strip() else "\n"
+
+ is_multiline = console.push(line_exec)
+ except:
+ # unlikely, but this can happen with unicode errors for example.
+ import traceback
+ stderr.write(traceback.format_exc())
+
+ if _BPY_MAIN_OWN:
+ sys.modules["__main__"] = main_mod_back
+
+ stdout.seek(0)
+ stderr.seek(0)
+
+ output = stdout.read()
+ output_err = stderr.read()
+
+ # cleanup
+ sys.stdout = sys.__stdout__
+ sys.stderr = sys.__stderr__
+ sys.last_traceback = None
+
+ # So we can reuse, clear all data
+ stdout.truncate(0)
+ stderr.truncate(0)
+
+ # special exception. its possible the command loaded a new user interface
+ if hash(sc) != hash(context.space_data):
+ return
+
+ bpy.ops.console.scrollback_append(text=sc.prompt + line, type='INPUT')
+
+ if is_multiline:
+ sc.prompt = PROMPT_MULTI
+ else:
+ sc.prompt = PROMPT
+
+ # insert a new blank line
+ bpy.ops.console.history_append(text="", current_character=0,
+ remove_duplicates=True)
+
+ # Insert the output into the editor
+ # not quite correct because the order might have changed,
+ # but ok 99% of the time.
+ if output:
+ add_scrollback(output, 'OUTPUT')
+ if output_err:
+ add_scrollback(output_err, 'ERROR')
+
+ # restore the stdin
+ sys.stdin = stdin_backup
+
+ # execute any hooks
+ for func, args in execute.hooks:
+ func(*args)
+
+ return {'FINISHED'}
+
+execute.hooks = []
+
+
+def autocomplete(context):
+ from console import intellisense
+
+ sc = context.space_data
+
+ console = get_console(hash(context.region))[0]
+
+ if not console:
+ return {'CANCELLED'}
+
+ # dont allow the stdin to be used, can lock blender.
+ # note: unlikely stdin would be used for autocomp. but its possible.
+ stdin_backup = sys.stdin
+ sys.stdin = None
+
+ scrollback = ""
+ scrollback_error = ""
+
+ if _BPY_MAIN_OWN:
+ main_mod_back = sys.modules["__main__"]
+ sys.modules["__main__"] = console._bpy_main_mod
+
+ try:
+ current_line = sc.history[-1]
+ line = current_line.body
+
+ # This function isnt aware of the text editor or being an operator
+ # just does the autocomp then copy its results back
+ result = intellisense.expand(
+ line=line,
+ cursor=current_line.current_character,
+ namespace=console.locals,
+ private=bpy.app.debug)
+
+ line_new = result[0]
+ current_line.body, current_line.current_character, scrollback = result
+ del result
+
+ # update sel. setting body should really do this!
+ ofs = len(line_new) - len(line)
+ sc.select_start += ofs
+ sc.select_end += ofs
+ except:
+ # unlikely, but this can happen with unicode errors for example.
+ # or if the api attribute access its self causes an error.
+ import traceback
+ scrollback_error = traceback.format_exc()
+
+ if _BPY_MAIN_OWN:
+ sys.modules["__main__"] = main_mod_back
+
+ # Separate automplete output by command prompts
+ if scrollback != '':
+ bpy.ops.console.scrollback_append(text=sc.prompt + current_line.body, type='INPUT')
+
+ # Now we need to copy back the line from blender back into the
+ # text editor. This will change when we dont use the text editor
+ # anymore
+ if scrollback:
+ add_scrollback(scrollback, 'INFO')
+
+ if scrollback_error:
+ add_scrollback(scrollback_error, 'ERROR')
+
+ # restore the stdin
+ sys.stdin = stdin_backup
+
+ context.area.tag_redraw()
+
+ return {'FINISHED'}
+
+
+def banner(context):
+ sc = context.space_data
+ version_string = sys.version.strip().replace('\n', ' ')
+
+ add_scrollback("PYTHON INTERACTIVE CONSOLE %s" % version_string, 'OUTPUT')
+ add_scrollback("", 'OUTPUT')
+ add_scrollback("Command History: Up/Down Arrow", 'OUTPUT')
+ add_scrollback("Cursor: Left/Right Home/End", 'OUTPUT')
+ add_scrollback("Remove: Backspace/Delete", 'OUTPUT')
+ add_scrollback("Execute: Enter", 'OUTPUT')
+ add_scrollback("Autocomplete: Ctrl+Space", 'OUTPUT')
+ add_scrollback("Ctrl +/- Wheel: Zoom", 'OUTPUT')
+ add_scrollback("Builtin Modules: bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.context, bpy.utils, bgl, blf, mathutils", 'OUTPUT')
+ add_scrollback("Convenience Imports: from mathutils import *; from math import *", 'OUTPUT')
+ add_scrollback("", 'OUTPUT')
+ # add_scrollback(" WARNING!!! Blender 2.5 API is subject to change, see API reference for more info.", 'ERROR')
+ # add_scrollback("", 'OUTPUT')
+ sc.prompt = PROMPT
+
+ return {'FINISHED'}
diff --git a/release/scripts/modules/console_shell.py b/release/scripts/modules/console_shell.py
new file mode 100644
index 00000000000..7a6f45c426f
--- /dev/null
+++ b/release/scripts/modules/console_shell.py
@@ -0,0 +1,78 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+import os
+import bpy
+
+language_id = 'shell'
+
+
+def add_scrollback(text, text_type):
+ for l in text.split('\n'):
+ bpy.ops.console.scrollback_append(text=l.replace('\t', ' '),
+ type=text_type)
+
+
+def shell_run(text):
+ import subprocess
+ val, output = subprocess.getstatusoutput(text)
+
+ if not val:
+ style = 'OUTPUT'
+ else:
+ style = 'ERROR'
+
+ add_scrollback(output, style)
+
+PROMPT = '$ '
+
+
+def execute(context):
+ sc = context.space_data
+
+ try:
+ line = sc.history[-1].body
+ except:
+ return {'CANCELLED'}
+
+ bpy.ops.console.scrollback_append(text=sc.prompt + line, type='INPUT')
+
+ shell_run(line)
+
+ # insert a new blank line
+ bpy.ops.console.history_append(text="", current_character=0,
+ remove_duplicates=True)
+
+ sc.prompt = os.getcwd() + PROMPT
+ return {'FINISHED'}
+
+
+def autocomplete(context):
+ # sc = context.space_data
+ # TODO
+ return {'CANCELLED'}
+
+
+def banner(context):
+ sc = context.space_data
+
+ shell_run("bash --version")
+ sc.prompt = os.getcwd() + PROMPT
+
+ return {'FINISHED'}
diff --git a/release/scripts/modules/image_utils.py b/release/scripts/modules/image_utils.py
index d74c89ac173..39e49ee1f96 100644
--- a/release/scripts/modules/image_utils.py
+++ b/release/scripts/modules/image_utils.py
@@ -23,5 +23,5 @@ def image_load(filepath, dirpath, place_holder=False, recursive=False, convert_c
import bpy
try:
return bpy.data.images.load(filepath)
- except SystemError:
+ except RuntimeError:
return bpy.data.images.new("Untitled", 128, 128)
diff --git a/release/scripts/modules/io_utils.py b/release/scripts/modules/io_utils.py
index 39b38669188..10729c465b7 100644
--- a/release/scripts/modules/io_utils.py
+++ b/release/scripts/modules/io_utils.py
@@ -19,13 +19,17 @@
# <pep8 compliant>
import bpy
-from bpy.props import *
+from bpy.props import StringProperty, BoolProperty
class ExportHelper:
filepath = StringProperty(name="File Path", description="Filepath used for exporting the file", maxlen=1024, default="", subtype='FILE_PATH')
check_existing = BoolProperty(name="Check Existing", description="Check and warn on overwriting existing files", default=True, options={'HIDDEN'})
+ # subclasses can override with decorator
+ # True == use ext, False == no ext, None == do nothing.
+ check_extension = True
+
def invoke(self, context, event):
import os
if not self.filepath:
@@ -41,12 +45,18 @@ class ExportHelper:
return {'RUNNING_MODAL'}
def check(self, context):
- filepath = bpy.path.ensure_ext(self.filepath, self.filename_ext)
+ check_extension = self.check_extension
+
+ if check_extension is None:
+ return False
+
+ filepath = bpy.path.ensure_ext(self.filepath, self.filename_ext if check_extension else "")
+
if filepath != self.filepath:
self.filepath = filepath
return True
- else:
- return False
+
+ return False
class ImportHelper:
@@ -81,14 +91,14 @@ def create_derived_objects(scene, ob):
return False, None
if ob.dupli_type != 'NONE':
- ob.create_dupli_list(scene)
+ ob.dupli_list_create(scene)
return True, [(dob.object, dob.matrix) for dob in ob.dupli_list]
else:
return False, [(ob, ob.matrix_world)]
def free_derived_objects(ob):
- ob.free_dupli_list()
+ ob.dupli_list_clear()
def unpack_list(list_of_tuples):
diff --git a/release/scripts/modules/keyingsets_utils.py b/release/scripts/modules/keyingsets_utils.py
index 00ad45cf9bb..dc61ce2a4af 100644
--- a/release/scripts/modules/keyingsets_utils.py
+++ b/release/scripts/modules/keyingsets_utils.py
@@ -43,7 +43,7 @@ import bpy
# Append the specified property name on the the existing path
def path_add_property(path, prop):
- if len(path):
+ if path:
return path + "." + prop
else:
return prop
@@ -52,16 +52,21 @@ def path_add_property(path, prop):
# Poll Callbacks
-# selected objects
+# selected objects (active object must be in object mode)
def RKS_POLL_selected_objects(ksi, context):
- return context.active_object or len(context.selected_objects)
+ ob = context.active_object
+ if ob:
+ return ob.mode == 'OBJECT'
+ else:
+ return bool(context.selected_objects)
# selected bones
def RKS_POLL_selected_bones(ksi, context):
# we must be in Pose Mode, and there must be some bones selected
- if (context.active_object) and (context.active_object.mode == 'POSE'):
- if context.active_pose_bone or len(context.selected_pose_bones):
+ ob = context.active_object
+ if ob and ob.mode == 'POSE':
+ if context.active_pose_bone or context.selected_pose_bones:
return True
# nothing selected
@@ -78,13 +83,20 @@ def RKS_POLL_selected_items(ksi, context):
# all selected objects or pose bones, depending on which we've got
def RKS_ITER_selected_item(ksi, context, ks):
- if (context.active_object) and (context.active_object.mode == 'POSE'):
+ ob = context.active_object
+ if ob and ob.mode == 'POSE':
for bone in context.selected_pose_bones:
ksi.generate(context, ks, bone)
else:
for ob in context.selected_objects:
ksi.generate(context, ks, ob)
+
+# all select objects only
+def RKS_ITER_selected_objects(ksi, context, ks):
+ for ob in context.selected_objects:
+ ksi.generate(context, ks, ob)
+
###########################
# Generate Callbacks
diff --git a/release/scripts/modules/mesh_utils.py b/release/scripts/modules/mesh_utils.py
new file mode 100644
index 00000000000..5bacff7b0cc
--- /dev/null
+++ b/release/scripts/modules/mesh_utils.py
@@ -0,0 +1,69 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+
+def mesh_linked_faces(mesh):
+ '''
+ Splits the mesh into connected parts,
+ these parts are returned as lists of faces.
+ used for seperating cubes from other mesh elements in the 1 mesh
+ '''
+
+ # Build vert face connectivity
+ vert_faces = [[] for i in range(len(mesh.vertices))]
+ for f in mesh.faces:
+ for v in f.vertices:
+ vert_faces[v].append(f)
+
+ # sort faces into connectivity groups
+ face_groups = [[f] for f in mesh.faces]
+ face_mapping = list(range(len(mesh.faces))) # map old, new face location
+
+ # Now clump faces iterativly
+ ok = True
+ while ok:
+ ok = False
+
+ for i, f in enumerate(mesh.faces):
+ mapped_index = face_mapping[f.index]
+ mapped_group = face_groups[mapped_index]
+
+ for v in f.vertices:
+ for nxt_f in vert_faces[v]:
+ if nxt_f != f:
+ nxt_mapped_index = face_mapping[nxt_f.index]
+
+ # We are not a part of the same group
+ if mapped_index != nxt_mapped_index:
+ ok = True
+
+ # Assign mapping to this group so they all map to this group
+ for grp_f in face_groups[nxt_mapped_index]:
+ face_mapping[grp_f.index] = mapped_index
+
+ # Move faces into this group
+ mapped_group.extend(face_groups[nxt_mapped_index])
+
+ # remove reference to the list
+ face_groups[nxt_mapped_index] = None
+
+ # return all face groups that are not null
+ # this is all the faces that are connected in their own lists.
+ return [fg for fg in face_groups if fg]
diff --git a/release/scripts/modules/rna_info.py b/release/scripts/modules/rna_info.py
index 201665cfda5..93a344f4b09 100644
--- a/release/scripts/modules/rna_info.py
+++ b/release/scripts/modules/rna_info.py
@@ -152,6 +152,14 @@ class InfoStructRNA:
functions.append((identifier, attr))
return functions
+ def get_py_c_functions(self):
+ import types
+ functions = []
+ for identifier, attr in self._get_py_visible_attrs():
+ if type(attr) in (types.BuiltinMethodType, types.BuiltinFunctionType):
+ functions.append((identifier, attr))
+ return functions
+
def __str__(self):
txt = ""
@@ -199,7 +207,7 @@ class InfoPropertyRNA:
self.fixed_type = None
if self.type == "enum":
- self.enum_items[:] = rna_prop.items.keys()
+ self.enum_items[:] = rna_prop.enum_items.keys()
self.is_enum_flag = rna_prop.is_enum_flag
else:
self.is_enum_flag = False
@@ -245,7 +253,7 @@ class InfoPropertyRNA:
return "%s=%s" % (self.identifier, default)
return self.identifier
- def get_type_description(self, as_ret=False, as_arg=False, class_fmt="%s"):
+ def get_type_description(self, as_ret=False, as_arg=False, class_fmt="%s", collection_id="Collection"):
type_str = ""
if self.fixed_type is None:
type_str += self.type
@@ -269,9 +277,9 @@ class InfoPropertyRNA:
else:
if self.type == "collection":
if self.collection_type:
- collection_str = (class_fmt % self.collection_type.identifier) + " collection of "
+ collection_str = (class_fmt % self.collection_type.identifier) + (" %s of " % collection_id)
else:
- collection_str = "Collection of "
+ collection_str = "%s of " % collection_id
else:
collection_str = ""
diff --git a/release/scripts/modules/sys_info.py b/release/scripts/modules/sys_info.py
index 16dfbf1bb3d..1272d81872d 100644
--- a/release/scripts/modules/sys_info.py
+++ b/release/scripts/modules/sys_info.py
@@ -51,8 +51,8 @@ def textWrap(text, length=70):
def write_sysinfo(op):
output_filename = "system-info.txt"
- if output_filename in bpy.data.texts.keys():
- output = bpy.data.texts[output_filename]
+ output = bpy.data.texts.get(output_filename)
+ if output:
output.clear()
else:
output = bpy.data.texts.new(name=output_filename)
@@ -94,16 +94,19 @@ def write_sysinfo(op):
output.write('autosave: {}\n'.format(bpy.utils.user_resource('AUTOSAVE')))
output.write('tempdir: {}\n'.format(bpy.app.tempdir))
- output.write('\nOpenGL\n')
- output.write(lilies)
- output.write('renderer:\t{}\n'.format(bgl.glGetString(bgl.GL_RENDERER)))
- output.write('vendor:\t\t{}\n'.format(bgl.glGetString(bgl.GL_VENDOR)))
- output.write('version:\t{}\n'.format(bgl.glGetString(bgl.GL_VERSION)))
- output.write('extensions:\n')
-
- glext = bgl.glGetString(bgl.GL_EXTENSIONS)
- glext = textWrap(glext, 70)
- for l in glext:
- output.write('\t\t{}\n'.format(l))
+ if bpy.app.background:
+ output.write('\nOpenGL: missing, background mode\n')
+ else:
+ output.write('\nOpenGL\n')
+ output.write(lilies)
+ output.write('renderer:\t{}\n'.format(bgl.glGetString(bgl.GL_RENDERER)))
+ output.write('vendor:\t\t{}\n'.format(bgl.glGetString(bgl.GL_VENDOR)))
+ output.write('version:\t{}\n'.format(bgl.glGetString(bgl.GL_VERSION)))
+ output.write('extensions:\n')
+
+ glext = bgl.glGetString(bgl.GL_EXTENSIONS)
+ glext = textWrap(glext, 70)
+ for l in glext:
+ output.write('\t\t{}\n'.format(l))
op.report({'INFO'}, "System information generated in 'system-info.txt'")
diff --git a/release/scripts/presets/interaction/blender.py b/release/scripts/presets/interaction/blender.py
index 7ac9cd1eb0b..603158ed936 100644
--- a/release/scripts/presets/interaction/blender.py
+++ b/release/scripts/presets/interaction/blender.py
@@ -1,9 +1,6 @@
# Configuration Blender
import bpy
-wm = bpy.context.window_manager
-wm.keyconfigs.active = wm.keyconfigs['Blender']
-
bpy.context.user_preferences.view.use_mouse_auto_depth = False
bpy.context.user_preferences.view.use_zoom_to_mouse = False
bpy.context.user_preferences.view.use_rotate_around_active = False
diff --git a/release/scripts/presets/keyconfig/maya.py b/release/scripts/presets/keyconfig/maya.py
index 120597cdd2a..87f4791ec51 100644
--- a/release/scripts/presets/keyconfig/maya.py
+++ b/release/scripts/presets/keyconfig/maya.py
@@ -7,380 +7,372 @@ kc = wm.keyconfigs.new('maya')
# Map 3D View
km = kc.keymaps.new('3D View', space_type='VIEW_3D', region_type='WINDOW', modal=False)
-kmi = km.items.new('view3d.manipulator', 'LEFTMOUSE', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.manipulator', 'LEFTMOUSE', 'PRESS', any=True)
kmi.properties.release_confirm = True
-kmi = km.items.new('view3d.cursor3d', 'ACTIONMOUSE', 'PRESS')
-kmi = km.items.new('view3d.rotate', 'LEFTMOUSE', 'PRESS', alt=True)
-kmi = km.items.new('view3d.move', 'MIDDLEMOUSE', 'PRESS', alt=True)
-kmi = km.items.new('view3d.zoom', 'RIGHTMOUSE', 'PRESS', alt=True)
-kmi = km.items.new('view3d.view_selected', 'NUMPAD_PERIOD', 'PRESS')
-kmi = km.items.new('view3d.view_center_cursor', 'NUMPAD_PERIOD', 'PRESS', ctrl=True)
-kmi = km.items.new('view3d.fly', 'F', 'PRESS', shift=True)
-kmi = km.items.new('view3d.smoothview', 'TIMER1', 'ANY', any=True)
-kmi = km.items.new('view3d.rotate', 'TRACKPADPAN', 'ANY', alt=True)
-kmi = km.items.new('view3d.rotate', 'MOUSEROTATE', 'ANY')
-kmi = km.items.new('view3d.move', 'TRACKPADPAN', 'ANY')
-kmi = km.items.new('view3d.zoom', 'TRACKPADZOOM', 'ANY')
-kmi = km.items.new('view3d.zoom', 'NUMPAD_PLUS', 'PRESS')
+kmi = km.keymap_items.new('view3d.cursor3d', 'ACTIONMOUSE', 'PRESS')
+kmi = km.keymap_items.new('view3d.rotate', 'LEFTMOUSE', 'PRESS', alt=True)
+kmi = km.keymap_items.new('view3d.move', 'MIDDLEMOUSE', 'PRESS', alt=True)
+kmi = km.keymap_items.new('view3d.zoom', 'RIGHTMOUSE', 'PRESS', alt=True)
+kmi = km.keymap_items.new('view3d.view_selected', 'NUMPAD_PERIOD', 'PRESS')
+kmi = km.keymap_items.new('view3d.view_center_cursor', 'NUMPAD_PERIOD', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.fly', 'F', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.smoothview', 'TIMER1', 'ANY', any=True)
+kmi = km.keymap_items.new('view3d.rotate', 'TRACKPADPAN', 'ANY', alt=True)
+kmi = km.keymap_items.new('view3d.rotate', 'MOUSEROTATE', 'ANY')
+kmi = km.keymap_items.new('view3d.move', 'TRACKPADPAN', 'ANY')
+kmi = km.keymap_items.new('view3d.zoom', 'TRACKPADZOOM', 'ANY')
+kmi = km.keymap_items.new('view3d.zoom', 'NUMPAD_PLUS', 'PRESS')
kmi.properties.delta = 1
-kmi = km.items.new('view3d.zoom', 'NUMPAD_MINUS', 'PRESS')
+kmi = km.keymap_items.new('view3d.zoom', 'NUMPAD_MINUS', 'PRESS')
kmi.properties.delta = -1
-kmi = km.items.new('view3d.zoom', 'EQUAL', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.zoom', 'EQUAL', 'PRESS', ctrl=True)
kmi.properties.delta = 1
-kmi = km.items.new('view3d.zoom', 'MINUS', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.zoom', 'MINUS', 'PRESS', ctrl=True)
kmi.properties.delta = -1
-kmi = km.items.new('view3d.zoom', 'WHEELINMOUSE', 'PRESS')
+kmi = km.keymap_items.new('view3d.zoom', 'WHEELINMOUSE', 'PRESS')
kmi.properties.delta = 1
-kmi = km.items.new('view3d.zoom', 'WHEELOUTMOUSE', 'PRESS')
+kmi = km.keymap_items.new('view3d.zoom', 'WHEELOUTMOUSE', 'PRESS')
kmi.properties.delta = -1
-kmi = km.items.new('view3d.view_all', 'HOME', 'PRESS')
+kmi = km.keymap_items.new('view3d.view_all', 'HOME', 'PRESS')
kmi.properties.center = False
-kmi = km.items.new('view3d.view_all', 'C', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.view_all', 'C', 'PRESS', shift=True)
kmi.properties.center = True
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_0', 'PRESS')
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_0', 'PRESS')
kmi.properties.type = 'CAMERA'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS')
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS')
kmi.properties.type = 'FRONT'
-kmi = km.items.new('view3d.view_orbit', 'NUMPAD_2', 'PRESS')
+kmi = km.keymap_items.new('view3d.view_orbit', 'NUMPAD_2', 'PRESS')
kmi.properties.type = 'ORBITDOWN'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS')
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS')
kmi.properties.type = 'RIGHT'
-kmi = km.items.new('view3d.view_orbit', 'NUMPAD_4', 'PRESS')
+kmi = km.keymap_items.new('view3d.view_orbit', 'NUMPAD_4', 'PRESS')
kmi.properties.type = 'ORBITLEFT'
-kmi = km.items.new('view3d.view_persportho', 'NUMPAD_5', 'PRESS')
-kmi = km.items.new('view3d.view_orbit', 'NUMPAD_6', 'PRESS')
+kmi = km.keymap_items.new('view3d.view_persportho', 'NUMPAD_5', 'PRESS')
+kmi = km.keymap_items.new('view3d.view_orbit', 'NUMPAD_6', 'PRESS')
kmi.properties.type = 'ORBITRIGHT'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS')
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS')
kmi.properties.type = 'TOP'
-kmi = km.items.new('view3d.view_orbit', 'NUMPAD_8', 'PRESS')
+kmi = km.keymap_items.new('view3d.view_orbit', 'NUMPAD_8', 'PRESS')
kmi.properties.type = 'ORBITUP'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', ctrl=True)
kmi.properties.type = 'BACK'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', ctrl=True)
kmi.properties.type = 'LEFT'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', ctrl=True)
kmi.properties.type = 'BOTTOM'
-kmi = km.items.new('view3d.view_pan', 'NUMPAD_2', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.view_pan', 'NUMPAD_2', 'PRESS', ctrl=True)
kmi.properties.type = 'PANDOWN'
-kmi = km.items.new('view3d.view_pan', 'NUMPAD_4', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.view_pan', 'NUMPAD_4', 'PRESS', ctrl=True)
kmi.properties.type = 'PANLEFT'
-kmi = km.items.new('view3d.view_pan', 'NUMPAD_6', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.view_pan', 'NUMPAD_6', 'PRESS', ctrl=True)
kmi.properties.type = 'PANRIGHT'
-kmi = km.items.new('view3d.view_pan', 'NUMPAD_8', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.view_pan', 'NUMPAD_8', 'PRESS', ctrl=True)
kmi.properties.type = 'PANUP'
-kmi = km.items.new('view3d.view_pan', 'WHEELUPMOUSE', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.view_pan', 'WHEELUPMOUSE', 'PRESS', ctrl=True)
kmi.properties.type = 'PANRIGHT'
-kmi = km.items.new('view3d.view_pan', 'WHEELDOWNMOUSE', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.view_pan', 'WHEELDOWNMOUSE', 'PRESS', ctrl=True)
kmi.properties.type = 'PANLEFT'
-kmi = km.items.new('view3d.view_pan', 'WHEELUPMOUSE', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.view_pan', 'WHEELUPMOUSE', 'PRESS', shift=True)
kmi.properties.type = 'PANUP'
-kmi = km.items.new('view3d.view_pan', 'WHEELDOWNMOUSE', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.view_pan', 'WHEELDOWNMOUSE', 'PRESS', shift=True)
kmi.properties.type = 'PANDOWN'
-kmi = km.items.new('view3d.view_orbit', 'WHEELUPMOUSE', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('view3d.view_orbit', 'WHEELUPMOUSE', 'PRESS', ctrl=True, alt=True)
kmi.properties.type = 'ORBITLEFT'
-kmi = km.items.new('view3d.view_orbit', 'WHEELDOWNMOUSE', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('view3d.view_orbit', 'WHEELDOWNMOUSE', 'PRESS', ctrl=True, alt=True)
kmi.properties.type = 'ORBITRIGHT'
-kmi = km.items.new('view3d.view_orbit', 'WHEELUPMOUSE', 'PRESS', shift=True, alt=True)
+kmi = km.keymap_items.new('view3d.view_orbit', 'WHEELUPMOUSE', 'PRESS', shift=True, alt=True)
kmi.properties.type = 'ORBITUP'
-kmi = km.items.new('view3d.view_orbit', 'WHEELDOWNMOUSE', 'PRESS', shift=True, alt=True)
+kmi = km.keymap_items.new('view3d.view_orbit', 'WHEELDOWNMOUSE', 'PRESS', shift=True, alt=True)
kmi.properties.type = 'ORBITDOWN'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', shift=True)
kmi.properties.align_active = True
kmi.properties.type = 'FRONT'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', shift=True)
kmi.properties.align_active = True
kmi.properties.type = 'RIGHT'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', shift=True)
kmi.properties.align_active = True
kmi.properties.type = 'TOP'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_1', 'PRESS', shift=True, ctrl=True)
kmi.properties.align_active = True
kmi.properties.type = 'BACK'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_3', 'PRESS', shift=True, ctrl=True)
kmi.properties.align_active = True
kmi.properties.type = 'LEFT'
-kmi = km.items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('view3d.viewnumpad', 'NUMPAD_7', 'PRESS', shift=True, ctrl=True)
kmi.properties.align_active = True
kmi.properties.type = 'BOTTOM'
-kmi = km.items.new('view3d.localview', 'NUMPAD_SLASH', 'PRESS')
-kmi = km.items.new('view3d.layers', 'ACCENT_GRAVE', 'PRESS')
+kmi = km.keymap_items.new('view3d.localview', 'NUMPAD_SLASH', 'PRESS')
+kmi = km.keymap_items.new('view3d.layers', 'ACCENT_GRAVE', 'PRESS')
kmi.properties.nr = 0
-kmi = km.items.new('view3d.layers', 'ONE', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.layers', 'ONE', 'PRESS', any=True)
kmi.properties.nr = 1
-kmi = km.items.new('view3d.layers', 'TWO', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.layers', 'TWO', 'PRESS', any=True)
kmi.properties.nr = 2
-kmi = km.items.new('view3d.layers', 'THREE', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.layers', 'THREE', 'PRESS', any=True)
kmi.properties.nr = 3
-kmi = km.items.new('view3d.layers', 'FOUR', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.layers', 'FOUR', 'PRESS', any=True)
kmi.properties.nr = 4
-kmi = km.items.new('view3d.layers', 'FIVE', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.layers', 'FIVE', 'PRESS', any=True)
kmi.properties.nr = 5
-kmi = km.items.new('view3d.layers', 'SIX', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.layers', 'SIX', 'PRESS', any=True)
kmi.properties.nr = 6
-kmi = km.items.new('view3d.layers', 'SEVEN', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.layers', 'SEVEN', 'PRESS', any=True)
kmi.properties.nr = 7
-kmi = km.items.new('view3d.layers', 'EIGHT', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.layers', 'EIGHT', 'PRESS', any=True)
kmi.properties.nr = 8
-kmi = km.items.new('view3d.layers', 'NINE', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.layers', 'NINE', 'PRESS', any=True)
kmi.properties.nr = 9
-kmi = km.items.new('view3d.layers', 'ZERO', 'PRESS', any=True)
+kmi = km.keymap_items.new('view3d.layers', 'ZERO', 'PRESS', any=True)
kmi.properties.nr = 10
-kmi = km.items.new('wm.context_toggle_enum', 'Z', 'PRESS')
+kmi = km.keymap_items.new('wm.context_toggle_enum', 'Z', 'PRESS')
kmi.properties.data_path = 'space_data.viewport_shade'
kmi.properties.value_1 = 'SOLID'
kmi.properties.value_2 = 'WIREFRAME'
-kmi = km.items.new('wm.context_toggle_enum', 'Z', 'PRESS', alt=True)
+kmi = km.keymap_items.new('wm.context_toggle_enum', 'Z', 'PRESS', alt=True)
kmi.properties.data_path = 'space_data.viewport_shade'
kmi.properties.value_1 = 'TEXTURED'
kmi.properties.value_2 = 'SOLID'
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS')
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.select', 'SELECTMOUSE', 'PRESS')
+kmi = km.keymap_items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True)
kmi.properties.extend = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.select', 'SELECTMOUSE', 'PRESS', ctrl=True)
kmi.properties.center = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', alt=True)
+kmi = km.keymap_items.new('view3d.select', 'SELECTMOUSE', 'PRESS', alt=True)
kmi.properties.enumerate = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True)
kmi.properties.center = True
kmi.properties.extend = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('view3d.select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True)
kmi.properties.center = True
kmi.properties.enumerate = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, alt=True)
+kmi = km.keymap_items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, alt=True)
kmi.properties.enumerate = True
kmi.properties.extend = True
-kmi = km.items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
+kmi = km.keymap_items.new('view3d.select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
kmi.properties.center = True
kmi.properties.enumerate = True
kmi.properties.extend = True
-kmi = km.items.new('view3d.select_border', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('view3d.select_border', 'EVT_TWEAK_S', 'ANY')
kmi.properties.extend = False
-kmi = km.items.new('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', ctrl=True)
-kmi = km.items.new('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', shift=True, ctrl=True)
+kmi = km.keymap_items.new('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', ctrl=True)
+kmi = km.keymap_items.new('view3d.select_lasso', 'EVT_TWEAK_A', 'ANY', shift=True, ctrl=True)
kmi.properties.deselect = True
-kmi = km.items.new('view3d.select_circle', 'C', 'PRESS')
-kmi = km.items.new('view3d.clip_border', 'B', 'PRESS', alt=True)
-kmi = km.items.new('view3d.zoom_border', 'B', 'PRESS', shift=True)
-kmi = km.items.new('view3d.render_border', 'B', 'PRESS', shift=True)
-kmi = km.items.new('view3d.camera_to_view', 'NUMPAD_0', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('view3d.object_as_camera', 'NUMPAD_0', 'PRESS', ctrl=True)
-kmi = km.items.new('wm.call_menu', 'S', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.select_circle', 'C', 'PRESS')
+kmi = km.keymap_items.new('view3d.clip_border', 'B', 'PRESS', alt=True)
+kmi = km.keymap_items.new('view3d.zoom_border', 'B', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.render_border', 'B', 'PRESS', shift=True)
+kmi = km.keymap_items.new('view3d.camera_to_view', 'NUMPAD_0', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('view3d.object_as_camera', 'NUMPAD_0', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.call_menu', 'S', 'PRESS', shift=True)
kmi.properties.name = 'VIEW3D_MT_snap'
-kmi = km.items.new('wm.context_set_enum', 'COMMA', 'PRESS')
+kmi = km.keymap_items.new('wm.context_set_enum', 'COMMA', 'PRESS')
kmi.properties.data_path = 'space_data.pivot_point'
kmi.properties.value = 'BOUNDING_BOX_CENTER'
-kmi = km.items.new('wm.context_set_enum', 'COMMA', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.context_set_enum', 'COMMA', 'PRESS', ctrl=True)
kmi.properties.data_path = 'space_data.pivot_point'
kmi.properties.value = 'MEDIAN_POINT'
-kmi = km.items.new('wm.context_toggle', 'COMMA', 'PRESS', alt=True)
+kmi = km.keymap_items.new('wm.context_toggle', 'COMMA', 'PRESS', alt=True)
kmi.properties.data_path = 'space_data.use_pivot_point'
-kmi = km.items.new('wm.context_toggle', 'Q', 'PRESS')
+kmi = km.keymap_items.new('wm.context_toggle', 'Q', 'PRESS')
kmi.properties.data_path = 'space_data.show_manipulator'
-kmi = km.items.new('wm.context_set_enum', 'PERIOD', 'PRESS')
+kmi = km.keymap_items.new('wm.context_set_enum', 'PERIOD', 'PRESS')
kmi.properties.data_path = 'space_data.pivot_point'
kmi.properties.value = 'CURSOR'
-kmi = km.items.new('wm.context_set_enum', 'PERIOD', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.context_set_enum', 'PERIOD', 'PRESS', ctrl=True)
kmi.properties.data_path = 'space_data.pivot_point'
kmi.properties.value = 'INDIVIDUAL_ORIGINS'
-kmi = km.items.new('wm.context_set_enum', 'PERIOD', 'PRESS', alt=True)
+kmi = km.keymap_items.new('wm.context_set_enum', 'PERIOD', 'PRESS', alt=True)
kmi.properties.data_path = 'space_data.pivot_point'
kmi.properties.value = 'ACTIVE_ELEMENT'
-kmi = km.items.new('transform.translate', 'G', 'PRESS', shift=True)
-kmi = km.items.new('transform.translate', 'EVT_TWEAK_S', 'ANY')
-kmi = km.items.new('transform.rotate', 'R', 'PRESS', shift=True)
-kmi = km.items.new('transform.resize', 'S', 'PRESS', shift=True)
-kmi = km.items.new('transform.warp', 'W', 'PRESS', shift=True)
-kmi = km.items.new('transform.tosphere', 'S', 'PRESS', shift=True, alt=True)
-kmi = km.items.new('transform.shear', 'S', 'PRESS', shift=True, ctrl=True, alt=True)
-kmi = km.items.new('transform.select_orientation', 'SPACE', 'PRESS', alt=True)
-kmi = km.items.new('transform.create_orientation', 'SPACE', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('transform.translate', 'G', 'PRESS', shift=True)
+kmi = km.keymap_items.new('transform.translate', 'EVT_TWEAK_S', 'ANY')
+kmi = km.keymap_items.new('transform.rotate', 'R', 'PRESS', shift=True)
+kmi = km.keymap_items.new('transform.resize', 'S', 'PRESS', shift=True)
+kmi = km.keymap_items.new('transform.warp', 'W', 'PRESS', shift=True)
+kmi = km.keymap_items.new('transform.tosphere', 'S', 'PRESS', shift=True, alt=True)
+kmi = km.keymap_items.new('transform.shear', 'S', 'PRESS', shift=True, ctrl=True, alt=True)
+kmi = km.keymap_items.new('transform.select_orientation', 'SPACE', 'PRESS', alt=True)
+kmi = km.keymap_items.new('transform.create_orientation', 'SPACE', 'PRESS', ctrl=True, alt=True)
kmi.properties.use = True
-kmi = km.items.new('transform.mirror', 'M', 'PRESS', ctrl=True)
-kmi = km.items.new('wm.context_toggle', 'TAB', 'PRESS', shift=True)
+kmi = km.keymap_items.new('transform.mirror', 'M', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.context_toggle', 'TAB', 'PRESS', shift=True)
kmi.properties.data_path = 'tool_settings.use_snap'
-kmi = km.items.new('transform.snap_type', 'TAB', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('view3d.enable_manipulator', 'W', 'PRESS')
+kmi = km.keymap_items.new('transform.snap_type', 'TAB', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('view3d.enable_manipulator', 'W', 'PRESS')
kmi.properties.translate = True
-kmi = km.items.new('view3d.enable_manipulator', 'E', 'PRESS')
+kmi = km.keymap_items.new('view3d.enable_manipulator', 'E', 'PRESS')
kmi.properties.rotate = True
-kmi = km.items.new('view3d.enable_manipulator', 'R', 'PRESS')
+kmi = km.keymap_items.new('view3d.enable_manipulator', 'R', 'PRESS')
kmi.properties.scale = True
-kmi = km.items.new('view3d.select_border', 'EVT_TWEAK_S', 'ANY', shift=True)
+kmi = km.keymap_items.new('view3d.select_border', 'EVT_TWEAK_S', 'ANY', shift=True)
kmi.properties.extend = True
# Map Object Mode
km = kc.keymaps.new('Object Mode', space_type='EMPTY', region_type='WINDOW', modal=False)
-kmi = km.items.new('wm.context_cycle_enum', 'O', 'PRESS', shift=True)
+kmi = km.keymap_items.new('wm.context_cycle_enum', 'O', 'PRESS', shift=True)
kmi.properties.data_path = 'tool_settings.proportional_edit_falloff'
-kmi = km.items.new('wm.context_toggle_enum', 'O', 'PRESS')
+kmi = km.keymap_items.new('wm.context_toggle_enum', 'O', 'PRESS')
kmi.properties.data_path = 'tool_settings.proportional_edit'
kmi.properties.value_1 = 'DISABLED'
kmi.properties.value_2 = 'ENABLED'
-kmi = km.items.new('view3d.game_start', 'P', 'PRESS')
-kmi = km.items.new('object.select_all', 'A', 'PRESS')
-kmi = km.items.new('object.select_inverse', 'I', 'PRESS', ctrl=True)
-kmi = km.items.new('object.select_linked', 'L', 'PRESS', shift=True)
-kmi = km.items.new('object.select_grouped', 'G', 'PRESS', shift=True)
-kmi = km.items.new('object.select_mirror', 'M', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('object.select_hierarchy', 'LEFT_BRACKET', 'PRESS')
+kmi = km.keymap_items.new('view3d.game_start', 'P', 'PRESS')
+kmi = km.keymap_items.new('object.select_all', 'A', 'PRESS')
+kmi = km.keymap_items.new('object.select_inverse', 'I', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.select_linked', 'L', 'PRESS', shift=True)
+kmi = km.keymap_items.new('object.select_grouped', 'G', 'PRESS', shift=True)
+kmi = km.keymap_items.new('object.select_mirror', 'M', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('object.select_hierarchy', 'LEFT_BRACKET', 'PRESS')
kmi.properties.direction = 'PARENT'
-kmi = km.items.new('object.select_hierarchy', 'LEFT_BRACKET', 'PRESS', shift=True)
+kmi = km.keymap_items.new('object.select_hierarchy', 'LEFT_BRACKET', 'PRESS', shift=True)
kmi.properties.direction = 'PARENT'
kmi.properties.extend = True
-kmi = km.items.new('object.select_hierarchy', 'RIGHT_BRACKET', 'PRESS')
+kmi = km.keymap_items.new('object.select_hierarchy', 'RIGHT_BRACKET', 'PRESS')
kmi.properties.direction = 'CHILD'
-kmi = km.items.new('object.select_hierarchy', 'RIGHT_BRACKET', 'PRESS', shift=True)
+kmi = km.keymap_items.new('object.select_hierarchy', 'RIGHT_BRACKET', 'PRESS', shift=True)
kmi.properties.direction = 'CHILD'
kmi.properties.extend = True
-kmi = km.items.new('object.parent_set', 'P', 'PRESS', ctrl=True)
-kmi = km.items.new('object.parent_no_inverse_set', 'P', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('object.parent_clear', 'P', 'PRESS', alt=True)
-kmi = km.items.new('object.track_set', 'T', 'PRESS', ctrl=True)
-kmi = km.items.new('object.track_clear', 'T', 'PRESS', alt=True)
-kmi = km.items.new('object.constraint_add_with_targets', 'C', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('object.constraints_clear', 'C', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('object.location_clear', 'G', 'PRESS', alt=True)
-kmi = km.items.new('object.rotation_clear', 'R', 'PRESS', alt=True)
-kmi = km.items.new('object.scale_clear', 'S', 'PRESS', alt=True)
-kmi = km.items.new('object.origin_clear', 'O', 'PRESS', alt=True)
-kmi = km.items.new('object.hide_view_clear', 'H', 'PRESS', alt=True)
-kmi = km.items.new('object.hide_view_set', 'H', 'PRESS')
-kmi = km.items.new('object.hide_view_set', 'H', 'PRESS', shift=True)
+kmi = km.keymap_items.new('object.parent_set', 'P', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.parent_no_inverse_set', 'P', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('object.parent_clear', 'P', 'PRESS', alt=True)
+kmi = km.keymap_items.new('object.track_set', 'T', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.track_clear', 'T', 'PRESS', alt=True)
+kmi = km.keymap_items.new('object.constraint_add_with_targets', 'C', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('object.constraints_clear', 'C', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('object.location_clear', 'G', 'PRESS', alt=True)
+kmi = km.keymap_items.new('object.rotation_clear', 'R', 'PRESS', alt=True)
+kmi = km.keymap_items.new('object.scale_clear', 'S', 'PRESS', alt=True)
+kmi = km.keymap_items.new('object.origin_clear', 'O', 'PRESS', alt=True)
+kmi = km.keymap_items.new('object.hide_view_clear', 'H', 'PRESS', alt=True)
+kmi = km.keymap_items.new('object.hide_view_set', 'H', 'PRESS')
+kmi = km.keymap_items.new('object.hide_view_set', 'H', 'PRESS', shift=True)
kmi.properties.unselected = True
-kmi = km.items.new('object.move_to_layer', 'M', 'PRESS')
-kmi = km.items.new('object.delete', 'X', 'PRESS')
-kmi = km.items.new('object.delete', 'DEL', 'PRESS')
-kmi = km.items.new('wm.call_menu', 'A', 'PRESS', shift=True)
+kmi = km.keymap_items.new('object.move_to_layer', 'M', 'PRESS')
+kmi = km.keymap_items.new('object.delete', 'X', 'PRESS')
+kmi = km.keymap_items.new('object.delete', 'DEL', 'PRESS')
+kmi = km.keymap_items.new('wm.call_menu', 'A', 'PRESS', shift=True)
kmi.properties.name = 'INFO_MT_add'
-kmi = km.items.new('object.duplicates_make_real', 'A', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('wm.call_menu', 'A', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.duplicates_make_real', 'A', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('wm.call_menu', 'A', 'PRESS', ctrl=True)
kmi.properties.name = 'VIEW3D_MT_object_apply'
-kmi = km.items.new('wm.call_menu', 'U', 'PRESS')
+kmi = km.keymap_items.new('wm.call_menu', 'U', 'PRESS')
kmi.properties.name = 'VIEW3D_MT_make_single_user'
-kmi = km.items.new('wm.call_menu', 'L', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.call_menu', 'L', 'PRESS', ctrl=True)
kmi.properties.name = 'VIEW3D_MT_make_links'
-kmi = km.items.new('object.duplicate_move', 'D', 'PRESS', shift=True)
-kmi = km.items.new('object.duplicate_move_linked', 'D', 'PRESS', alt=True)
-kmi = km.items.new('object.join', 'J', 'PRESS', ctrl=True)
-kmi = km.items.new('object.convert', 'C', 'PRESS', alt=True)
-kmi = km.items.new('object.proxy_make', 'P', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('object.make_local', 'L', 'PRESS')
-kmi = km.items.new('anim.keyframe_insert_menu', 'I', 'PRESS')
-kmi = km.items.new('anim.keyframe_delete_v3d', 'I', 'PRESS', alt=True)
-kmi = km.items.new('anim.keying_set_active_set', 'I', 'PRESS', shift=True, ctrl=True, alt=True)
-kmi = km.items.new('group.create', 'G', 'PRESS', ctrl=True)
-kmi = km.items.new('group.objects_remove', 'G', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('group.objects_add_active', 'G', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('group.objects_remove_active', 'G', 'PRESS', shift=True, alt=True)
-kmi = km.items.new('wm.call_menu', 'W', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.duplicate_move', 'D', 'PRESS', shift=True)
+kmi = km.keymap_items.new('object.duplicate_move_linked', 'D', 'PRESS', alt=True)
+kmi = km.keymap_items.new('object.join', 'J', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.convert', 'C', 'PRESS', alt=True)
+kmi = km.keymap_items.new('object.proxy_make', 'P', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('object.make_local', 'L', 'PRESS')
+kmi = km.keymap_items.new('anim.keyframe_insert_menu', 'I', 'PRESS')
+kmi = km.keymap_items.new('anim.keyframe_delete_v3d', 'I', 'PRESS', alt=True)
+kmi = km.keymap_items.new('anim.keying_set_active_set', 'I', 'PRESS', shift=True, ctrl=True, alt=True)
+kmi = km.keymap_items.new('group.create', 'G', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('group.objects_remove', 'G', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('group.objects_add_active', 'G', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('group.objects_remove_active', 'G', 'PRESS', shift=True, alt=True)
+kmi = km.keymap_items.new('wm.call_menu', 'W', 'PRESS', ctrl=True)
kmi.properties.name = 'VIEW3D_MT_object_specials'
-kmi = km.items.new('object.subdivision_set', 'ZERO', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.subdivision_set', 'ZERO', 'PRESS', ctrl=True)
kmi.properties.level = 0
-kmi = km.items.new('object.subdivision_set', 'ONE', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.subdivision_set', 'ONE', 'PRESS', ctrl=True)
kmi.properties.level = 1
-kmi = km.items.new('object.subdivision_set', 'TWO', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.subdivision_set', 'TWO', 'PRESS', ctrl=True)
kmi.properties.level = 2
-kmi = km.items.new('object.subdivision_set', 'THREE', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.subdivision_set', 'THREE', 'PRESS', ctrl=True)
kmi.properties.level = 3
-kmi = km.items.new('object.subdivision_set', 'FOUR', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.subdivision_set', 'FOUR', 'PRESS', ctrl=True)
kmi.properties.level = 4
-kmi = km.items.new('object.subdivision_set', 'FIVE', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.subdivision_set', 'FIVE', 'PRESS', ctrl=True)
kmi.properties.level = 5
-kmi = km.items.new('object.select_all', 'SELECTMOUSE', 'CLICK')
+kmi = km.keymap_items.new('object.select_all', 'SELECTMOUSE', 'CLICK')
kmi.properties.action = 'DESELECT'
# Map Mesh
km = kc.keymaps.new('Mesh', space_type='EMPTY', region_type='WINDOW', modal=False)
-kmi = km.items.new('mesh.loopcut_slide', 'R', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.loop_select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('mesh.loop_select', 'SELECTMOUSE', 'PRESS', shift=True, alt=True)
+kmi = km.keymap_items.new('mesh.loopcut_slide', 'R', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('mesh.loop_select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('mesh.loop_select', 'SELECTMOUSE', 'PRESS', shift=True, alt=True)
kmi.properties.extend = True
-kmi = km.items.new('mesh.edgering_select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('mesh.edgering_select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
+kmi = km.keymap_items.new('mesh.edgering_select', 'SELECTMOUSE', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('mesh.edgering_select', 'SELECTMOUSE', 'PRESS', shift=True, ctrl=True, alt=True)
kmi.properties.extend = True
-kmi = km.items.new('mesh.select_shortest_path', 'SELECTMOUSE', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.select_all', 'A', 'PRESS')
-kmi = km.items.new('mesh.select_more', 'NUMPAD_PLUS', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.select_less', 'NUMPAD_MINUS', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.select_inverse', 'I', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.select_non_manifold', 'M', 'PRESS', shift=True, ctrl=True, alt=True)
-kmi = km.items.new('mesh.select_linked', 'L', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.select_linked_pick', 'L', 'PRESS')
-kmi = km.items.new('mesh.select_linked_pick', 'L', 'PRESS', shift=True)
+kmi = km.keymap_items.new('mesh.select_shortest_path', 'SELECTMOUSE', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('mesh.select_all', 'A', 'PRESS')
+kmi = km.keymap_items.new('mesh.select_more', 'NUMPAD_PLUS', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('mesh.select_less', 'NUMPAD_MINUS', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('mesh.select_inverse', 'I', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('mesh.select_non_manifold', 'M', 'PRESS', shift=True, ctrl=True, alt=True)
+kmi = km.keymap_items.new('mesh.select_linked', 'L', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('mesh.select_linked_pick', 'L', 'PRESS')
+kmi = km.keymap_items.new('mesh.select_linked_pick', 'L', 'PRESS', shift=True)
kmi.properties.deselect = True
-kmi = km.items.new('mesh.faces_select_linked_flat', 'F', 'PRESS', shift=True, ctrl=True, alt=True)
+kmi = km.keymap_items.new('mesh.faces_select_linked_flat', 'F', 'PRESS', shift=True, ctrl=True, alt=True)
kmi.properties.sharpness = 135.0
-kmi = km.items.new('mesh.select_similar', 'G', 'PRESS', shift=True)
-kmi = km.items.new('wm.call_menu', 'TAB', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('mesh.select_similar', 'G', 'PRESS', shift=True)
+kmi = km.keymap_items.new('wm.call_menu', 'TAB', 'PRESS', ctrl=True)
kmi.properties.name = 'VIEW3D_MT_edit_mesh_select_mode'
-kmi = km.items.new('mesh.hide', 'H', 'PRESS')
-kmi = km.items.new('mesh.hide', 'H', 'PRESS', shift=True)
+kmi = km.keymap_items.new('mesh.hide', 'H', 'PRESS')
+kmi = km.keymap_items.new('mesh.hide', 'H', 'PRESS', shift=True)
kmi.properties.unselected = True
-kmi = km.items.new('mesh.reveal', 'H', 'PRESS', alt=True)
-kmi = km.items.new('mesh.normals_make_consistent', 'N', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.normals_make_consistent', 'N', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('mesh.reveal', 'H', 'PRESS', alt=True)
+kmi = km.keymap_items.new('mesh.normals_make_consistent', 'N', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('mesh.normals_make_consistent', 'N', 'PRESS', shift=True, ctrl=True)
kmi.properties.inside = True
-kmi = km.items.new('view3d.edit_mesh_extrude_move_normal', 'E', 'PRESS', ctrl=True)
-kmi = km.items.new('view3d.edit_mesh_extrude_individual_move', 'E', 'PRESS', shift=True)
-kmi = km.items.new('wm.call_menu', 'E', 'PRESS', alt=True)
+kmi = km.keymap_items.new('view3d.edit_mesh_extrude_move_normal', 'E', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('view3d.edit_mesh_extrude_individual_move', 'E', 'PRESS', shift=True)
+kmi = km.keymap_items.new('wm.call_menu', 'E', 'PRESS', alt=True)
kmi.properties.name = 'VIEW3D_MT_edit_mesh_extrude'
-kmi = km.items.new('mesh.spin', 'R', 'PRESS', alt=True)
-kmi = km.items.new('mesh.fill', 'F', 'PRESS', alt=True)
-kmi = km.items.new('mesh.beautify_fill', 'F', 'PRESS', shift=True, alt=True)
-kmi = km.items.new('mesh.quads_convert_to_tris', 'T', 'PRESS', ctrl=True)
-kmi = km.items.new('mesh.tris_convert_to_quads', 'J', 'PRESS', alt=True)
-kmi = km.items.new('mesh.edge_flip', 'F', 'PRESS', shift=True, ctrl=True)
-kmi = km.items.new('mesh.rip_move', 'V', 'PRESS')
-kmi = km.items.new('mesh.merge', 'M', 'PRESS', alt=True)
-kmi = km.items.new('transform.shrink_fatten', 'S', 'PRESS', ctrl=True, alt=True)
-kmi = km.items.new('mesh.edge_face_add', 'F', 'PRESS')
-kmi = km.items.new('mesh.duplicate_move', 'D', 'PRESS', shift=True)
-kmi = km.items.new('wm.call_menu', 'A', 'PRESS', shift=True)
+kmi = km.keymap_items.new('mesh.spin', 'R', 'PRESS', alt=True)
+kmi = km.keymap_items.new('mesh.fill', 'F', 'PRESS', alt=True)
+kmi = km.keymap_items.new('mesh.beautify_fill', 'F', 'PRESS', shift=True, alt=True)
+kmi = km.keymap_items.new('mesh.quads_convert_to_tris', 'T', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('mesh.tris_convert_to_quads', 'J', 'PRESS', alt=True)
+kmi = km.keymap_items.new('mesh.edge_flip', 'F', 'PRESS', shift=True, ctrl=True)
+kmi = km.keymap_items.new('mesh.rip_move', 'V', 'PRESS')
+kmi = km.keymap_items.new('mesh.merge', 'M', 'PRESS', alt=True)
+kmi = km.keymap_items.new('transform.shrink_fatten', 'S', 'PRESS', ctrl=True, alt=True)
+kmi = km.keymap_items.new('mesh.edge_face_add', 'F', 'PRESS')
+kmi = km.keymap_items.new('mesh.duplicate_move', 'D', 'PRESS', shift=True)
+kmi = km.keymap_items.new('wm.call_menu', 'A', 'PRESS', shift=True)
kmi.properties.name = 'INFO_MT_mesh_add'
-kmi = km.items.new('mesh.separate', 'P', 'PRESS')
-kmi = km.items.new('mesh.split', 'Y', 'PRESS')
-kmi = km.items.new('mesh.dupli_extrude_cursor', 'ACTIONMOUSE', 'CLICK', ctrl=True)
-kmi = km.items.new('mesh.delete', 'X', 'PRESS')
-kmi = km.items.new('mesh.delete', 'DEL', 'PRESS')
-kmi = km.items.new('mesh.knife_cut', 'LEFTMOUSE', 'PRESS', key_modifier='K')
-kmi = km.items.new('mesh.knife_cut', 'LEFTMOUSE', 'PRESS', shift=True, key_modifier='K')
+kmi = km.keymap_items.new('mesh.separate', 'P', 'PRESS')
+kmi = km.keymap_items.new('mesh.split', 'Y', 'PRESS')
+kmi = km.keymap_items.new('mesh.dupli_extrude_cursor', 'ACTIONMOUSE', 'CLICK', ctrl=True)
+kmi = km.keymap_items.new('mesh.delete', 'X', 'PRESS')
+kmi = km.keymap_items.new('mesh.delete', 'DEL', 'PRESS')
+kmi = km.keymap_items.new('mesh.knife_cut', 'LEFTMOUSE', 'PRESS', key_modifier='K')
+kmi = km.keymap_items.new('mesh.knife_cut', 'LEFTMOUSE', 'PRESS', shift=True, key_modifier='K')
kmi.properties.type = 'MIDPOINTS'
-kmi = km.items.new('object.vertex_parent_set', 'P', 'PRESS', ctrl=True)
-kmi = km.items.new('wm.call_menu', 'W', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('object.vertex_parent_set', 'P', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.call_menu', 'W', 'PRESS', ctrl=True)
kmi.properties.name = 'VIEW3D_MT_edit_mesh_specials'
-kmi = km.items.new('wm.call_menu', 'F', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.call_menu', 'F', 'PRESS', ctrl=True)
kmi.properties.name = 'VIEW3D_MT_edit_mesh_faces'
-kmi = km.items.new('wm.call_menu', 'E', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.call_menu', 'E', 'PRESS', ctrl=True)
kmi.properties.name = 'VIEW3D_MT_edit_mesh_edges'
-kmi = km.items.new('wm.call_menu', 'V', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.call_menu', 'V', 'PRESS', ctrl=True)
kmi.properties.name = 'VIEW3D_MT_edit_mesh_vertices'
-kmi = km.items.new('wm.call_menu', 'H', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.call_menu', 'H', 'PRESS', ctrl=True)
kmi.properties.name = 'VIEW3D_MT_hook'
-kmi = km.items.new('wm.call_menu', 'U', 'PRESS')
+kmi = km.keymap_items.new('wm.call_menu', 'U', 'PRESS')
kmi.properties.name = 'VIEW3D_MT_uv_map'
-kmi = km.items.new('wm.call_menu', 'G', 'PRESS', ctrl=True)
+kmi = km.keymap_items.new('wm.call_menu', 'G', 'PRESS', ctrl=True)
kmi.properties.name = 'VIEW3D_MT_vertex_group'
-kmi = km.items.new('wm.context_cycle_enum', 'O', 'PRESS', shift=True)
+kmi = km.keymap_items.new('wm.context_cycle_enum', 'O', 'PRESS', shift=True)
kmi.properties.data_path = 'tool_settings.proportional_edit_falloff'
-kmi = km.items.new('wm.context_toggle_enum', 'O', 'PRESS')
+kmi = km.keymap_items.new('wm.context_toggle_enum', 'O', 'PRESS')
kmi.properties.data_path = 'tool_settings.proportional_edit'
kmi.properties.value_1 = 'DISABLED'
kmi.properties.value_2 = 'ENABLED'
-kmi = km.items.new('wm.context_toggle_enum', 'O', 'PRESS', alt=True)
+kmi = km.keymap_items.new('wm.context_toggle_enum', 'O', 'PRESS', alt=True)
kmi.properties.data_path = 'tool_settings.proportional_edit'
kmi.properties.value_1 = 'DISABLED'
kmi.properties.value_2 = 'CONNECTED'
-kmi = km.items.new('mesh.select_all', 'SELECTMOUSE', 'CLICK')
+kmi = km.keymap_items.new('mesh.select_all', 'SELECTMOUSE', 'CLICK')
kmi.properties.action = 'DESELECT'
wm.keyconfigs.active = kc
-
-bpy.context.user_preferences.edit.use_drag_immediately = True
-bpy.context.user_preferences.edit.use_insertkey_xyz_to_rgb = False
-bpy.context.user_preferences.inputs.select_mouse = 'LEFT'
-bpy.context.user_preferences.inputs.view_zoom_method = 'DOLLY'
-bpy.context.user_preferences.inputs.view_zoom_axis = 'HORIZONTAL'
-bpy.context.user_preferences.inputs.view_rotate_method = 'TURNTABLE'
-bpy.context.user_preferences.inputs.invert_mouse_wheel_zoom = True
diff --git a/release/scripts/startup/bl_operators/__init__.py b/release/scripts/startup/bl_operators/__init__.py
new file mode 100644
index 00000000000..d5f7a63366a
--- /dev/null
+++ b/release/scripts/startup/bl_operators/__init__.py
@@ -0,0 +1,58 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#,
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+if "bpy" in locals():
+ from imp import reload as _reload
+ for val in _modules_loaded.values():
+ _reload(val)
+_modules = (
+ "add_mesh_torus",
+ "animsys_update",
+ "image",
+ "mesh",
+ "nla",
+ "object_align",
+ "object",
+ "object_randomize_transform",
+ "object_quick_effects",
+ "presets",
+ "screen_play_rendered_anim",
+ "sequencer",
+ "uvcalc_follow_active",
+ "uvcalc_lightmap",
+ "uvcalc_smart_project",
+ "vertexpaint_dirt",
+ "wm",
+)
+__import__(name=__name__, fromlist=_modules)
+_namespace = globals()
+_modules_loaded = {name: _namespace[name] for name in _modules}
+del _namespace
+
+
+import bpy
+
+
+def register():
+ bpy.utils.register_module(__name__)
+
+
+def unregister():
+ bpy.utils.unregister_module(__name__)
diff --git a/release/scripts/startup/bl_operators/add_mesh_torus.py b/release/scripts/startup/bl_operators/add_mesh_torus.py
new file mode 100644
index 00000000000..460330a56a1
--- /dev/null
+++ b/release/scripts/startup/bl_operators/add_mesh_torus.py
@@ -0,0 +1,138 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+import bpy
+import mathutils
+
+
+def add_torus(major_rad, minor_rad, major_seg, minor_seg):
+ from math import cos, sin, pi
+
+ Vector = mathutils.Vector
+ Quaternion = mathutils.Quaternion
+
+ PI_2 = pi * 2.0
+ z_axis = 0.0, 0.0, 1.0
+
+ verts = []
+ faces = []
+ i1 = 0
+ tot_verts = major_seg * minor_seg
+ for major_index in range(major_seg):
+ quat = Quaternion(z_axis, (major_index / major_seg) * PI_2)
+
+ for minor_index in range(minor_seg):
+ angle = 2 * pi * minor_index / minor_seg
+
+ vec = Vector((major_rad + (cos(angle) * minor_rad), 0.0,
+ (sin(angle) * minor_rad))) * quat
+
+ verts.extend(vec[:])
+
+ if minor_index + 1 == minor_seg:
+ i2 = (major_index) * minor_seg
+ i3 = i1 + minor_seg
+ i4 = i2 + minor_seg
+
+ else:
+ i2 = i1 + 1
+ i3 = i1 + minor_seg
+ i4 = i3 + 1
+
+ if i2 >= tot_verts:
+ i2 = i2 - tot_verts
+ if i3 >= tot_verts:
+ i3 = i3 - tot_verts
+ if i4 >= tot_verts:
+ i4 = i4 - tot_verts
+
+ # stupid eekadoodle
+ if i2:
+ faces.extend([i1, i3, i4, i2])
+ else:
+ faces.extend([i2, i1, i3, i4])
+
+ i1 += 1
+
+ return verts, faces
+
+from bpy.props import FloatProperty, IntProperty, BoolProperty, FloatVectorProperty
+
+
+class AddTorus(bpy.types.Operator):
+ '''Add a torus mesh'''
+ bl_idname = "mesh.primitive_torus_add"
+ bl_label = "Add Torus"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ major_radius = FloatProperty(name="Major Radius",
+ description="Radius from the origin to the center of the cross sections",
+ default=1.0, min=0.01, max=100.0)
+ minor_radius = FloatProperty(name="Minor Radius",
+ description="Radius of the torus' cross section",
+ default=0.25, min=0.01, max=100.0)
+ major_segments = IntProperty(name="Major Segments",
+ description="Number of segments for the main ring of the torus",
+ default=48, min=3, max=256)
+ minor_segments = IntProperty(name="Minor Segments",
+ description="Number of segments for the minor ring of the torus",
+ default=12, min=3, max=256)
+ use_abso = BoolProperty(name="Use Int+Ext Controls",
+ description="Use the Int / Ext controls for torus dimensions",
+ default=False)
+ abso_major_rad = FloatProperty(name="Exterior Radius",
+ description="Total Exterior Radius of the torus",
+ default=1.0, min=0.01, max=100.0)
+ abso_minor_rad = FloatProperty(name="Inside Radius",
+ description="Total Interior Radius of the torus",
+ default=0.5, min=0.01, max=100.0)
+
+ # generic transform props
+ view_align = BoolProperty(name="Align to View",
+ default=False)
+ location = FloatVectorProperty(name="Location",
+ subtype='TRANSLATION')
+ rotation = FloatVectorProperty(name="Rotation",
+ subtype='EULER')
+
+ def execute(self, context):
+
+ if self.use_abso == True:
+ extra_helper = (self.abso_major_rad - self.abso_minor_rad) * 0.5
+ self.major_radius = self.abso_minor_rad + extra_helper
+ self.minor_radius = extra_helper
+
+ verts_loc, faces = add_torus(self.major_radius,
+ self.minor_radius,
+ self.major_segments,
+ self.minor_segments)
+
+ mesh = bpy.data.meshes.new("Torus")
+
+ mesh.vertices.add(len(verts_loc) // 3)
+ mesh.faces.add(len(faces) // 4)
+
+ mesh.vertices.foreach_set("co", verts_loc)
+ mesh.faces.foreach_set("vertices_raw", faces)
+ mesh.update()
+
+ import add_object_utils
+ add_object_utils.object_data_add(context, mesh, operator=self)
+
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/animsys_update.py b/release/scripts/startup/bl_operators/animsys_update.py
new file mode 100644
index 00000000000..8fa7d5cd93e
--- /dev/null
+++ b/release/scripts/startup/bl_operators/animsys_update.py
@@ -0,0 +1,699 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+data_path_update = [
+ ("ClothCollisionSettings", "min_distance", "distance_min"),
+ ("ClothCollisionSettings", "self_min_distance", "self_distance_min"),
+ ("ClothCollisionSettings", "enable_collision", "use_collision"),
+ ("ClothCollisionSettings", "enable_self_collision", "use_self_collision"),
+ ("ClothSettings", "pin_cloth", "use_pin_cloth"),
+ ("ClothSettings", "stiffness_scaling", "use_stiffness_scale"),
+ ("CollisionSettings", "random_damping", "damping_random"),
+ ("CollisionSettings", "random_friction", "friction_random"),
+ ("CollisionSettings", "inner_thickness", "thickness_inner"),
+ ("CollisionSettings", "outer_thickness", "thickness_outer"),
+ ("CollisionSettings", "kill_particles", "use_particle_kill"),
+ ("Constraint", "proxy_local", "is_proxy_local"),
+ ("ActionConstraint", "maximum", "max"),
+ ("ActionConstraint", "minimum", "min"),
+ ("FollowPathConstraint", "use_fixed_position", "use_fixed_location"),
+ ("KinematicConstraint", "chain_length", "chain_count"),
+ ("KinematicConstraint", "pos_lock_x", "lock_location_x"),
+ ("KinematicConstraint", "pos_lock_y", "lock_location_y"),
+ ("KinematicConstraint", "pos_lock_z", "lock_location_z"),
+ ("KinematicConstraint", "rot_lock_x", "lock_rotation_x"),
+ ("KinematicConstraint", "rot_lock_y", "lock_rotation_y"),
+ ("KinematicConstraint", "rot_lock_z", "lock_rotation_z"),
+ ("KinematicConstraint", "axis_reference", "reference_axis"),
+ ("KinematicConstraint", "use_position", "use_location"),
+ ("LimitLocationConstraint", "maximum_x", "max_x"),
+ ("LimitLocationConstraint", "maximum_y", "max_y"),
+ ("LimitLocationConstraint", "maximum_z", "max_z"),
+ ("LimitLocationConstraint", "minimum_x", "min_x"),
+ ("LimitLocationConstraint", "minimum_y", "min_y"),
+ ("LimitLocationConstraint", "minimum_z", "min_z"),
+ ("LimitLocationConstraint", "use_maximum_x", "use_max_x"),
+ ("LimitLocationConstraint", "use_maximum_y", "use_max_y"),
+ ("LimitLocationConstraint", "use_maximum_z", "use_max_z"),
+ ("LimitLocationConstraint", "use_minimum_x", "use_min_x"),
+ ("LimitLocationConstraint", "use_minimum_y", "use_min_y"),
+ ("LimitLocationConstraint", "use_minimum_z", "use_min_z"),
+ ("LimitLocationConstraint", "limit_transform", "use_transform_limit"),
+ ("LimitRotationConstraint", "maximum_x", "max_x"),
+ ("LimitRotationConstraint", "maximum_y", "max_y"),
+ ("LimitRotationConstraint", "maximum_z", "max_z"),
+ ("LimitRotationConstraint", "minimum_x", "min_x"),
+ ("LimitRotationConstraint", "minimum_y", "min_y"),
+ ("LimitRotationConstraint", "minimum_z", "min_z"),
+ ("LimitRotationConstraint", "limit_transform", "use_transform_limit"),
+ ("LimitScaleConstraint", "maximum_x", "max_x"),
+ ("LimitScaleConstraint", "maximum_y", "max_y"),
+ ("LimitScaleConstraint", "maximum_z", "max_z"),
+ ("LimitScaleConstraint", "minimum_x", "min_x"),
+ ("LimitScaleConstraint", "minimum_y", "min_y"),
+ ("LimitScaleConstraint", "minimum_z", "min_z"),
+ ("LimitScaleConstraint", "use_maximum_x", "use_max_x"),
+ ("LimitScaleConstraint", "use_maximum_y", "use_max_y"),
+ ("LimitScaleConstraint", "use_maximum_z", "use_max_z"),
+ ("LimitScaleConstraint", "use_minimum_x", "use_min_x"),
+ ("LimitScaleConstraint", "use_minimum_y", "use_min_y"),
+ ("LimitScaleConstraint", "use_minimum_z", "use_min_z"),
+ ("LimitScaleConstraint", "limit_transform", "use_transform_limit"),
+ ("PivotConstraint", "enabled_rotation_range", "rotation_range"),
+ ("PivotConstraint", "use_relative_position", "use_relative_location"),
+ ("PythonConstraint", "number_of_targets", "target_count"),
+ ("SplineIKConstraint", "chain_length", "chain_count"),
+ ("SplineIKConstraint", "chain_offset", "use_chain_offset"),
+ ("SplineIKConstraint", "even_divisions", "use_even_divisions"),
+ ("SplineIKConstraint", "y_stretch", "use_y_stretch"),
+ ("SplineIKConstraint", "xz_scaling_mode", "xz_scale_mode"),
+ ("StretchToConstraint", "original_length", "rest_length"),
+ ("TrackToConstraint", "target_z", "use_target_z"),
+ ("TransformConstraint", "extrapolate_motion", "use_motion_extrapolate"),
+ ("FieldSettings", "do_location", "apply_to_location"),
+ ("FieldSettings", "do_rotation", "apply_to_rotation"),
+ ("FieldSettings", "maximum_distance", "distance_max"),
+ ("FieldSettings", "minimum_distance", "distance_min"),
+ ("FieldSettings", "radial_maximum", "radial_max"),
+ ("FieldSettings", "radial_minimum", "radial_min"),
+ ("FieldSettings", "force_2d", "use_2d_force"),
+ ("FieldSettings", "do_absorption", "use_absorption"),
+ ("FieldSettings", "global_coordinates", "use_global_coords"),
+ ("FieldSettings", "guide_path_add", "use_guide_path_add"),
+ ("FieldSettings", "multiple_springs", "use_multiple_springs"),
+ ("FieldSettings", "use_coordinates", "use_object_coords"),
+ ("FieldSettings", "root_coordinates", "use_root_coords"),
+ ("ControlFluidSettings", "reverse_frames", "use_reverse_frames"),
+ ("DomainFluidSettings", "real_world_size", "simulation_scale"),
+ ("DomainFluidSettings", "surface_smoothing", "surface_smooth"),
+ ("DomainFluidSettings", "reverse_frames", "use_reverse_frames"),
+ ("DomainFluidSettings", "generate_speed_vectors", "use_speed_vectors"),
+ ("DomainFluidSettings", "override_time", "use_time_override"),
+ ("FluidFluidSettings", "export_animated_mesh", "use_animated_mesh"),
+ ("InflowFluidSettings", "export_animated_mesh", "use_animated_mesh"),
+ ("InflowFluidSettings", "local_coordinates", "use_local_coords"),
+ ("ObstacleFluidSettings", "export_animated_mesh", "use_animated_mesh"),
+ ("OutflowFluidSettings", "export_animated_mesh", "use_animated_mesh"),
+ ("ParticleFluidSettings", "drops", "use_drops"),
+ ("ParticleFluidSettings", "floats", "use_floats"),
+ ("Armature", "drawtype", "draw_type"),
+ ("Armature", "layer_protection", "layers_protected"),
+ ("Armature", "auto_ik", "use_auto_ik"),
+ ("Armature", "delay_deform", "use_deform_delay"),
+ ("Armature", "deform_envelope", "use_deform_envelopes"),
+ ("Armature", "deform_quaternion", "use_deform_preserve_volume"),
+ ("Armature", "deform_vertexgroups", "use_deform_vertex_groups"),
+ ("Armature", "x_axis_mirror", "use_mirror_x"),
+ ("Curve", "width", "offset"),
+ ("Image", "animation_speed", "fps"),
+ ("Image", "animation_end", "frame_end"),
+ ("Image", "animation_start", "frame_start"),
+ ("Image", "animated", "use_animation"),
+ ("Image", "clamp_x", "use_clamp_x"),
+ ("Image", "clamp_y", "use_clamp_y"),
+ ("Image", "premultiply", "use_premultiply"),
+ ("AreaLamp", "shadow_ray_sampling_method", "shadow_ray_sample_method"),
+ ("AreaLamp", "only_shadow", "use_only_shadow"),
+ ("AreaLamp", "shadow_layer", "use_shadow_layer"),
+ ("AreaLamp", "umbra", "use_umbra"),
+ ("PointLamp", "shadow_ray_sampling_method", "shadow_ray_sample_method"),
+ ("PointLamp", "only_shadow", "use_only_shadow"),
+ ("PointLamp", "shadow_layer", "use_shadow_layer"),
+ ("PointLamp", "sphere", "use_sphere"),
+ ("SpotLamp", "shadow_ray_sampling_method", "shadow_ray_sample_method"),
+ ("SpotLamp", "auto_clip_end", "use_auto_clip_end"),
+ ("SpotLamp", "auto_clip_start", "use_auto_clip_start"),
+ ("SpotLamp", "only_shadow", "use_only_shadow"),
+ ("SpotLamp", "shadow_layer", "use_shadow_layer"),
+ ("SpotLamp", "sphere", "use_sphere"),
+ ("SunLamp", "only_shadow", "use_only_shadow"),
+ ("SunLamp", "shadow_layer", "use_shadow_layer"),
+ ("Material", "z_offset", "offset_z"),
+ ("Material", "shadow_casting_alpha", "shadow_cast_alpha"),
+ ("Material", "cast_approximate", "use_cast_approximate"),
+ ("Material", "cast_buffer_shadows", "use_cast_buffer_shadows"),
+ ("Material", "cast_shadows_only", "use_cast_shadows_only"),
+ ("Material", "face_texture", "use_face_texture"),
+ ("Material", "face_texture_alpha", "use_face_texture_alpha"),
+ ("Material", "full_oversampling", "use_full_oversampling"),
+ ("Material", "light_group_exclusive", "use_light_group_exclusive"),
+ ("Material", "object_color", "use_object_color"),
+ ("Material", "only_shadow", "use_only_shadow"),
+ ("Material", "ray_shadow_bias", "use_ray_shadow_bias"),
+ ("Material", "traceable", "use_raytrace"),
+ ("Material", "shadeless", "use_shadeless"),
+ ("Material", "tangent_shading", "use_tangent_shading"),
+ ("Material", "transparency", "use_transparency"),
+ ("Material", "receive_transparent_shadows", "use_transparent_shadows"),
+ ("Material", "vertex_color_light", "use_vertex_color_light"),
+ ("Material", "vertex_color_paint", "use_vertex_color_paint"),
+ ("Mesh", "autosmooth_angle", "auto_smooth_angle"),
+ ("Mesh", "autosmooth", "use_auto_smooth"),
+ ("Object", "max_draw_type", "draw_type"),
+ ("Object", "use_dupli_verts_rotation", "use_dupli_vertices_rotation"),
+ ("Object", "shape_key_edit_mode", "use_shape_key_edit_mode"),
+ ("Object", "slow_parent", "use_slow_parent"),
+ ("Object", "time_offset_add_parent", "use_time_offset_add_parent"),
+ ("Object", "time_offset_edit", "use_time_offset_edit"),
+ ("Object", "time_offset_parent", "use_time_offset_parent"),
+ ("Object", "time_offset_particle", "use_time_offset_particle"),
+ ("ParticleSettings", "adaptive_pix", "adaptive_pixel"),
+ ("ParticleSettings", "child_effector", "apply_effector_to_children"),
+ ("ParticleSettings", "child_guide", "apply_guide_to_children"),
+ ("ParticleSettings", "billboard_split_offset", "billboard_offset_split"),
+ ("ParticleSettings", "billboard_random_tilt", "billboard_tilt_random"),
+ ("ParticleSettings", "child_length_thres", "child_length_threshold"),
+ ("ParticleSettings", "child_random_size", "child_size_random"),
+ ("ParticleSettings", "clumppow", "clump_shape"),
+ ("ParticleSettings", "damp_factor", "damping"),
+ ("ParticleSettings", "draw_as", "draw_method"),
+ ("ParticleSettings", "random_factor", "factor_random"),
+ ("ParticleSettings", "grid_invert", "invert_grid"),
+ ("ParticleSettings", "random_length", "length_random"),
+ ("ParticleSettings", "random_lifetime", "lifetime_random"),
+ ("ParticleSettings", "billboard_lock", "lock_billboard"),
+ ("ParticleSettings", "boids_2d", "lock_boids_to_surface"),
+ ("ParticleSettings", "object_aligned_factor", "object_align_factor"),
+ ("ParticleSettings", "random_phase_factor", "phase_factor_random"),
+ ("ParticleSettings", "ren_as", "render_type"),
+ ("ParticleSettings", "rendered_child_nbr", "rendered_child_count"),
+ ("ParticleSettings", "random_rotation_factor", "rotation_factor_random"),
+ ("ParticleSettings", "rough1", "roughness_1"),
+ ("ParticleSettings", "rough1_size", "roughness_1_size"),
+ ("ParticleSettings", "rough2", "roughness_2"),
+ ("ParticleSettings", "rough2_size", "roughness_2_size"),
+ ("ParticleSettings", "rough2_thres", "roughness_2_threshold"),
+ ("ParticleSettings", "rough_end_shape", "roughness_end_shape"),
+ ("ParticleSettings", "rough_endpoint", "roughness_endpoint"),
+ ("ParticleSettings", "random_size", "size_random"),
+ ("ParticleSettings", "abs_path_time", "use_absolute_path_time"),
+ ("ParticleSettings", "animate_branching", "use_animate_branching"),
+ ("ParticleSettings", "branching", "use_branching"),
+ ("ParticleSettings", "died", "use_dead"),
+ ("ParticleSettings", "die_on_collision", "use_die_on_collision"),
+ ("ParticleSettings", "rotation_dynamic", "use_dynamic_rotation"),
+ ("ParticleSettings", "even_distribution", "use_even_distribution"),
+ ("ParticleSettings", "rand_group", "use_group_pick_random"),
+ ("ParticleSettings", "hair_bspline", "use_hair_bspline"),
+ ("ParticleSettings", "sizemass", "use_multiply_size_mass"),
+ ("ParticleSettings", "react_multiple", "use_react_multiple"),
+ ("ParticleSettings", "react_start_end", "use_react_start_end"),
+ ("ParticleSettings", "render_adaptive", "use_render_adaptive"),
+ ("ParticleSettings", "self_effect", "use_self_effect"),
+ ("ParticleSettings", "enable_simplify", "use_simplify"),
+ ("ParticleSettings", "size_deflect", "use_size_deflect"),
+ ("ParticleSettings", "render_strand", "use_strand_primitive"),
+ ("ParticleSettings", "symmetric_branching", "use_symmetric_branching"),
+ ("ParticleSettings", "velocity_length", "use_velocity_length"),
+ ("ParticleSettings", "whole_group", "use_whole_group"),
+ ("CloudsTexture", "noise_size", "noise_scale"),
+ ("DistortedNoiseTexture", "noise_size", "noise_scale"),
+ ("EnvironmentMapTexture", "filter_size_minimum", "use_filter_size_min"),
+ ("EnvironmentMapTexture", "mipmap_gauss", "use_mipmap_gauss"),
+ ("ImageTexture", "calculate_alpha", "use_calculate_alpha"),
+ ("ImageTexture", "checker_even", "use_checker_even"),
+ ("ImageTexture", "checker_odd", "use_checker_odd"),
+ ("ImageTexture", "filter_size_minimum", "use_filter_size_min"),
+ ("ImageTexture", "flip_axis", "use_flip_axis"),
+ ("ImageTexture", "mipmap_gauss", "use_mipmap_gauss"),
+ ("ImageTexture", "mirror_x", "use_mirror_x"),
+ ("ImageTexture", "mirror_y", "use_mirror_y"),
+ ("ImageTexture", "normal_map", "use_normal_map"),
+ ("MarbleTexture", "noise_size", "noise_scale"),
+ ("MarbleTexture", "noisebasis2", "noise_basis_2"),
+ ("MarbleTexture", "noisebasis_2", "noise_basis_2"),
+ ("MusgraveTexture", "highest_dimension", "dimension_max"),
+ ("MusgraveTexture", "noise_size", "noise_scale"),
+ ("StucciTexture", "noise_size", "noise_scale"),
+ ("VoronoiTexture", "coloring", "color_mode"),
+ ("VoronoiTexture", "noise_size", "noise_scale"),
+ ("WoodTexture", "noise_size", "noise_scale"),
+ ("WoodTexture", "noisebasis2", "noise_basis_2"),
+ ("WoodTexture", "noisebasis_2", "noise_basis_2"),
+ ("World", "blend_sky", "use_sky_blend"),
+ ("World", "paper_sky", "use_sky_paper"),
+ ("World", "real_sky", "use_sky_real"),
+ ("ImageUser", "auto_refresh", "use_auto_refresh"),
+ ("MaterialHalo", "flares_sub", "flare_subflare_count"),
+ ("MaterialHalo", "flare_subsize", "flare_subflare_size"),
+ ("MaterialHalo", "line_number", "line_count"),
+ ("MaterialHalo", "rings", "ring_count"),
+ ("MaterialHalo", "star_tips", "star_tip_count"),
+ ("MaterialHalo", "xalpha", "use_extreme_alpha"),
+ ("MaterialHalo", "flare_mode", "use_flare_mode"),
+ ("MaterialHalo", "vertex_normal", "use_vertex_normal"),
+ ("MaterialPhysics", "align_to_normal", "use_normal_align"),
+ ("MaterialStrand", "min_size", "size_min"),
+ ("MaterialStrand", "blender_units", "use_blender_units"),
+ ("MaterialStrand", "surface_diffuse", "use_surface_diffuse"),
+ ("MaterialStrand", "tangent_shading", "use_tangent_shading"),
+ ("MaterialSubsurfaceScattering", "error_tolerance", "error_threshold"),
+ ("MaterialVolume", "depth_cutoff", "depth_threshold"),
+ ("MaterialVolume", "lighting_mode", "light_method"),
+ ("MaterialVolume", "step_calculation", "step_method"),
+ ("MaterialVolume", "external_shadows", "use_external_shadows"),
+ ("MaterialVolume", "light_cache", "use_light_cache"),
+ ("ArmatureModifier", "multi_modifier", "use_multi_modifier"),
+ ("ArrayModifier", "constant_offset_displacement", "constant_offset_displace"),
+ ("ArrayModifier", "merge_distance", "merge_threshold"),
+ ("ArrayModifier", "relative_offset_displacement", "relative_offset_displace"),
+ ("ArrayModifier", "constant_offset", "use_constant_offset"),
+ ("ArrayModifier", "merge_adjacent_vertices", "use_merge_vertices"),
+ ("ArrayModifier", "merge_end_vertices", "use_merge_vertices_cap"),
+ ("ArrayModifier", "add_offset_object", "use_object_offset"),
+ ("ArrayModifier", "relative_offset", "use_relative_offset"),
+ ("BevelModifier", "only_vertices", "use_only_vertices"),
+ ("CastModifier", "from_radius", "use_radius_as_size"),
+ ("DisplaceModifier", "midlevel", "mid_level"),
+ ("DisplaceModifier", "texture_coordinates", "texture_coords"),
+ ("EdgeSplitModifier", "use_sharp", "use_edge_sharp"),
+ ("ExplodeModifier", "split_edges", "use_edge_split"),
+ ("MirrorModifier", "merge_limit", "merge_threshold"),
+ ("MirrorModifier", "mirror_u", "use_mirror_u"),
+ ("MirrorModifier", "mirror_v", "use_mirror_v"),
+ ("MirrorModifier", "mirror_vertex_groups", "use_mirror_vertex_groups"),
+ ("ParticleInstanceModifier", "particle_system_number", "particle_system_index"),
+ ("ParticleInstanceModifier", "keep_shape", "use_preserve_shape"),
+ ("ShrinkwrapModifier", "cull_back_faces", "use_cull_back_faces"),
+ ("ShrinkwrapModifier", "cull_front_faces", "use_cull_front_faces"),
+ ("ShrinkwrapModifier", "keep_above_surface", "use_keep_above_surface"),
+ ("SimpleDeformModifier", "lock_x_axis", "lock_x"),
+ ("SimpleDeformModifier", "lock_y_axis", "lock_y"),
+ ("SmokeModifier", "smoke_type", "type"),
+ ("SubsurfModifier", "subsurf_uv", "use_subsurf_uv"),
+ ("UVProjectModifier", "num_projectors", "projector_count"),
+ ("UVProjectModifier", "override_image", "use_image_override"),
+ ("WaveModifier", "texture_coordinates", "texture_coords"),
+ ("WaveModifier", "x_normal", "use_normal_x"),
+ ("WaveModifier", "y_normal", "use_normal_y"),
+ ("WaveModifier", "z_normal", "use_normal_z"),
+ ("NlaStrip", "blending", "blend_type"),
+ ("NlaStrip", "animated_influence", "use_animated_influence"),
+ ("NlaStrip", "animated_time", "use_animated_time"),
+ ("NlaStrip", "animated_time_cyclic", "use_animated_time_cyclic"),
+ ("NlaStrip", "auto_blending", "use_auto_blend"),
+ ("CompositorNodeAlphaOver", "convert_premul", "use_premultiply"),
+ ("CompositorNodeBlur", "sizex", "size_x"),
+ ("CompositorNodeBlur", "sizey", "size_y"),
+ ("CompositorNodeChannelMatte", "algorithm", "limit_method"),
+ ("CompositorNodeChromaMatte", "acceptance", "tolerance"),
+ ("CompositorNodeColorBalance", "correction_formula", "correction_method"),
+ ("CompositorNodeColorSpill", "algorithm", "limit_method"),
+ ("CompositorNodeColorSpill", "unspill", "use_unspill"),
+ ("CompositorNodeCrop", "x2", "max_x"),
+ ("CompositorNodeCrop", "y2", "max_y"),
+ ("CompositorNodeCrop", "x1", "min_x"),
+ ("CompositorNodeCrop", "y1", "min_y"),
+ ("CompositorNodeCrop", "crop_size", "use_crop_size"),
+ ("CompositorNodeDefocus", "max_blur", "blur_max"),
+ ("CompositorNodeDefocus", "gamma_correction", "use_gamma_correction"),
+ ("CompositorNodeGlare", "rotate_45", "use_rotate_45"),
+ ("CompositorNodeImage", "auto_refresh", "use_auto_refresh"),
+ ("CompositorNodeLensdist", "projector", "use_projector"),
+ ("CompositorNodeVecBlur", "max_speed", "speed_max"),
+ ("CompositorNodeVecBlur", "min_speed", "speed_min"),
+ ("ShaderNodeMapping", "maximum", "max"),
+ ("ShaderNodeMapping", "minimum", "min"),
+ ("ShaderNodeMapping", "clamp_maximum", "use_max"),
+ ("ShaderNodeMapping", "clamp_minimum", "use_min"),
+ ("VertexPaint", "all_faces", "use_all_faces"),
+ ("VertexPaint", "spray", "use_spray"),
+ ("ParticleEdit", "add_keys", "default_key_count"),
+ ("ParticleEdit", "selection_mode", "select_mode"),
+ ("ParticleEdit", "auto_velocity", "use_auto_velocity"),
+ ("ParticleEdit", "add_interpolate", "use_default_interpolate"),
+ ("ParticleEdit", "emitter_deflect", "use_emitter_deflect"),
+ ("ParticleEdit", "fade_time", "use_fade_time"),
+ ("ParticleEdit", "keep_lengths", "use_preserve_length"),
+ ("ParticleEdit", "keep_root", "use_preserve_root"),
+ ("ParticleSystem", "vertex_group_clump_negate", "invert_vertex_group_clump"),
+ ("ParticleSystem", "vertex_group_density_negate", "invert_vertex_group_density"),
+ ("ParticleSystem", "vertex_group_field_negate", "invert_vertex_group_field"),
+ ("ParticleSystem", "vertex_group_kink_negate", "invert_vertex_group_kink"),
+ ("ParticleSystem", "vertex_group_length_negate", "invert_vertex_group_length"),
+ ("ParticleSystem", "vertex_group_rotation_negate", "invert_vertex_group_rotation"),
+ ("ParticleSystem", "vertex_group_roughness1_negate", "invert_vertex_group_roughness_1"),
+ ("ParticleSystem", "vertex_group_roughness2_negate", "invert_vertex_group_roughness_2"),
+ ("ParticleSystem", "vertex_group_roughness_end_negate", "invert_vertex_group_roughness_end"),
+ ("ParticleSystem", "vertex_group_size_negate", "invert_vertex_group_size"),
+ ("ParticleSystem", "vertex_group_tangent_negate", "invert_vertex_group_tangent"),
+ ("ParticleSystem", "vertex_group_velocity_negate", "invert_vertex_group_velocity"),
+ ("ParticleSystem", "hair_dynamics", "use_hair_dynamics"),
+ ("ParticleSystem", "keyed_timing", "use_keyed_timing"),
+ ("PointDensity", "falloff_softness", "falloff_soft"),
+ ("PointDensity", "particle_cache", "particle_cache_space"),
+ ("PointDensity", "turbulence_size", "turbulence_scale"),
+ ("PointDensity", "turbulence", "use_turbulence"),
+ ("PointDensity", "vertices_cache", "vertex_cache_space"),
+ ("PoseBone", "ik_lin_weight", "ik_linear_weight"),
+ ("PoseBone", "ik_rot_weight", "ik_rotation_weight"),
+ ("PoseBone", "ik_limit_x", "use_ik_limit_x"),
+ ("PoseBone", "ik_limit_y", "use_ik_limit_y"),
+ ("PoseBone", "ik_limit_z", "use_ik_limit_z"),
+ ("PoseBone", "ik_lin_control", "use_ik_linear_control"),
+ ("PoseBone", "ik_rot_control", "use_ik_rotation_control"),
+ ("Bone", "use_hinge", "use_inherit_rotation"),
+ ("SPHFluidSettings", "spring_k", "spring_force"),
+ ("SPHFluidSettings", "stiffness_k", "stiffness"),
+ ("SPHFluidSettings", "stiffness_knear", "stiffness_near"),
+ ("SceneGameData", "framing_color", "frame_color"),
+ ("SceneGameData", "framing_type", "frame_type"),
+ ("SceneGameData", "eye_separation", "stereo_eye_separation"),
+ ("SceneGameData", "activity_culling", "use_activity_culling"),
+ ("SceneGameData", "auto_start", "use_auto_start"),
+ ("SceneGameData", "glsl_extra_textures", "use_glsl_extra_textures"),
+ ("SceneGameData", "glsl_lights", "use_glsl_lights"),
+ ("SceneGameData", "glsl_nodes", "use_glsl_nodes"),
+ ("SceneGameData", "glsl_ramps", "use_glsl_ramps"),
+ ("SceneGameData", "glsl_shaders", "use_glsl_shaders"),
+ ("SceneGameData", "glsl_shadows", "use_glsl_shadows"),
+ ("Sequence", "blend_opacity", "blend_alpha"),
+ ("Sequence", "blend_mode", "blend_type"),
+ ("Sequence", "frame_final_length", "frame_final_duration"),
+ ("Sequence", "use_effect_default_fade", "use_default_fade"),
+ ("SequenceColorBalance", "inverse_gain", "invert_gain"),
+ ("SequenceColorBalance", "inverse_gamma", "invert_gamma"),
+ ("SequenceColorBalance", "inverse_lift", "invert_lift"),
+ ("EffectSequence", "multiply_colors", "color_multiply"),
+ ("EffectSequence", "de_interlace", "use_deinterlace"),
+ ("EffectSequence", "flip_x", "use_flip_x"),
+ ("EffectSequence", "flip_y", "use_flip_y"),
+ ("EffectSequence", "convert_float", "use_float"),
+ ("EffectSequence", "premultiply", "use_premultiply"),
+ ("EffectSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("EffectSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("EffectSequence", "reverse_frames", "use_reverse_frames"),
+ ("GlowSequence", "blur_distance", "blur_radius"),
+ ("GlowSequence", "only_boost", "use_only_boost"),
+ ("SpeedControlSequence", "curve_compress_y", "use_curve_compress_y"),
+ ("SpeedControlSequence", "curve_velocity", "use_curve_velocity"),
+ ("SpeedControlSequence", "frame_blending", "use_frame_blend"),
+ ("TransformSequence", "uniform_scale", "use_uniform_scale"),
+ ("ImageSequence", "animation_end_offset", "animation_offset_end"),
+ ("ImageSequence", "animation_start_offset", "animation_offset_start"),
+ ("ImageSequence", "multiply_colors", "color_multiply"),
+ ("ImageSequence", "de_interlace", "use_deinterlace"),
+ ("ImageSequence", "flip_x", "use_flip_x"),
+ ("ImageSequence", "flip_y", "use_flip_y"),
+ ("ImageSequence", "convert_float", "use_float"),
+ ("ImageSequence", "premultiply", "use_premultiply"),
+ ("ImageSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("ImageSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("ImageSequence", "reverse_frames", "use_reverse_frames"),
+ ("MetaSequence", "animation_end_offset", "animation_offset_end"),
+ ("MetaSequence", "animation_start_offset", "animation_offset_start"),
+ ("MetaSequence", "multiply_colors", "color_multiply"),
+ ("MetaSequence", "de_interlace", "use_deinterlace"),
+ ("MetaSequence", "flip_x", "use_flip_x"),
+ ("MetaSequence", "flip_y", "use_flip_y"),
+ ("MetaSequence", "convert_float", "use_float"),
+ ("MetaSequence", "premultiply", "use_premultiply"),
+ ("MetaSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("MetaSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("MetaSequence", "reverse_frames", "use_reverse_frames"),
+ ("MovieSequence", "animation_end_offset", "animation_offset_end"),
+ ("MovieSequence", "animation_start_offset", "animation_offset_start"),
+ ("MovieSequence", "multiply_colors", "color_multiply"),
+ ("MovieSequence", "de_interlace", "use_deinterlace"),
+ ("MovieSequence", "flip_x", "use_flip_x"),
+ ("MovieSequence", "flip_y", "use_flip_y"),
+ ("MovieSequence", "convert_float", "use_float"),
+ ("MovieSequence", "premultiply", "use_premultiply"),
+ ("MovieSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("MovieSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("MovieSequence", "reverse_frames", "use_reverse_frames"),
+ ("MulticamSequence", "animation_end_offset", "animation_offset_end"),
+ ("MulticamSequence", "animation_start_offset", "animation_offset_start"),
+ ("MulticamSequence", "multiply_colors", "color_multiply"),
+ ("MulticamSequence", "de_interlace", "use_deinterlace"),
+ ("MulticamSequence", "flip_x", "use_flip_x"),
+ ("MulticamSequence", "flip_y", "use_flip_y"),
+ ("MulticamSequence", "convert_float", "use_float"),
+ ("MulticamSequence", "premultiply", "use_premultiply"),
+ ("MulticamSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("MulticamSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("MulticamSequence", "reverse_frames", "use_reverse_frames"),
+ ("SceneSequence", "animation_end_offset", "animation_offset_end"),
+ ("SceneSequence", "animation_start_offset", "animation_offset_start"),
+ ("SceneSequence", "multiply_colors", "color_multiply"),
+ ("SceneSequence", "de_interlace", "use_deinterlace"),
+ ("SceneSequence", "flip_x", "use_flip_x"),
+ ("SceneSequence", "flip_y", "use_flip_y"),
+ ("SceneSequence", "convert_float", "use_float"),
+ ("SceneSequence", "premultiply", "use_premultiply"),
+ ("SceneSequence", "proxy_custom_directory", "use_proxy_custom_directory"),
+ ("SceneSequence", "proxy_custom_file", "use_proxy_custom_file"),
+ ("SceneSequence", "reverse_frames", "use_reverse_frames"),
+ ("SoundSequence", "animation_end_offset", "animation_offset_end"),
+ ("SoundSequence", "animation_start_offset", "animation_offset_start"),
+ ("SmokeDomainSettings", "smoke_domain_colli", "collision_extents"),
+ ("SmokeDomainSettings", "smoke_cache_high_comp", "point_cache_compress_high_type"),
+ ("SmokeDomainSettings", "smoke_cache_comp", "point_cache_compress_type"),
+ ("SmokeDomainSettings", "maxres", "resolution_max"),
+ ("SmokeDomainSettings", "smoothemitter", "smooth_emitter"),
+ ("SmokeDomainSettings", "dissolve_smoke", "use_dissolve_smoke"),
+ ("SmokeDomainSettings", "dissolve_smoke_log", "use_dissolve_smoke_log"),
+ ("SmokeDomainSettings", "highres", "use_high_resolution"),
+ ("SoftBodySettings", "bending", "bend"),
+ ("SoftBodySettings", "error_limit", "error_threshold"),
+ ("SoftBodySettings", "lcom", "location_mass_center"),
+ ("SoftBodySettings", "lrot", "rotation_estimate"),
+ ("SoftBodySettings", "lscale", "scale_estimate"),
+ ("SoftBodySettings", "maxstep", "step_max"),
+ ("SoftBodySettings", "minstep", "step_min"),
+ ("SoftBodySettings", "diagnose", "use_diagnose"),
+ ("SoftBodySettings", "edge_collision", "use_edge_collision"),
+ ("SoftBodySettings", "estimate_matrix", "use_estimate_matrix"),
+ ("SoftBodySettings", "face_collision", "use_face_collision"),
+ ("SoftBodySettings", "self_collision", "use_self_collision"),
+ ("SoftBodySettings", "stiff_quads", "use_stiff_quads"),
+ ("TexMapping", "maximum", "max"),
+ ("TexMapping", "minimum", "min"),
+ ("TexMapping", "has_maximum", "use_max"),
+ ("TexMapping", "has_minimum", "use_min"),
+ ("TextCharacterFormat", "bold", "use_bold"),
+ ("TextCharacterFormat", "italic", "use_italic"),
+ ("TextCharacterFormat", "underline", "use_underline"),
+ ("TextureSlot", "rgb_to_intensity", "use_rgb_to_intensity"),
+ ("TextureSlot", "stencil", "use_stencil"),
+ ("LampTextureSlot", "texture_coordinates", "texture_coords"),
+ ("LampTextureSlot", "map_color", "use_map_color"),
+ ("LampTextureSlot", "map_shadow", "use_map_shadow"),
+ ("MaterialTextureSlot", "coloremission_factor", "color_emission_factor"),
+ ("MaterialTextureSlot", "colordiff_factor", "diffuse_color_factor"),
+ ("MaterialTextureSlot", "x_mapping", "mapping_x"),
+ ("MaterialTextureSlot", "y_mapping", "mapping_y"),
+ ("MaterialTextureSlot", "z_mapping", "mapping_z"),
+ ("MaterialTextureSlot", "colorreflection_factor", "reflection_color_factor"),
+ ("MaterialTextureSlot", "colorspec_factor", "specular_color_factor"),
+ ("MaterialTextureSlot", "texture_coordinates", "texture_coords"),
+ ("MaterialTextureSlot", "colortransmission_factor", "transmission_color_factor"),
+ ("MaterialTextureSlot", "from_dupli", "use_from_dupli"),
+ ("MaterialTextureSlot", "from_original", "use_from_original"),
+ ("MaterialTextureSlot", "map_alpha", "use_map_alpha"),
+ ("MaterialTextureSlot", "map_ambient", "use_map_ambient"),
+ ("MaterialTextureSlot", "map_colordiff", "use_map_color_diff"),
+ ("MaterialTextureSlot", "map_coloremission", "use_map_color_emission"),
+ ("MaterialTextureSlot", "map_colorreflection", "use_map_color_reflection"),
+ ("MaterialTextureSlot", "map_colorspec", "use_map_color_spec"),
+ ("MaterialTextureSlot", "map_colortransmission", "use_map_color_transmission"),
+ ("MaterialTextureSlot", "map_density", "use_map_density"),
+ ("MaterialTextureSlot", "map_diffuse", "use_map_diffuse"),
+ ("MaterialTextureSlot", "map_displacement", "use_map_displacement"),
+ ("MaterialTextureSlot", "map_emission", "use_map_emission"),
+ ("MaterialTextureSlot", "map_emit", "use_map_emit"),
+ ("MaterialTextureSlot", "map_hardness", "use_map_hardness"),
+ ("MaterialTextureSlot", "map_mirror", "use_map_mirror"),
+ ("MaterialTextureSlot", "map_normal", "use_map_normal"),
+ ("MaterialTextureSlot", "map_raymir", "use_map_raymir"),
+ ("MaterialTextureSlot", "map_reflection", "use_map_reflect"),
+ ("MaterialTextureSlot", "map_scattering", "use_map_scatter"),
+ ("MaterialTextureSlot", "map_specular", "use_map_specular"),
+ ("MaterialTextureSlot", "map_translucency", "use_map_translucency"),
+ ("MaterialTextureSlot", "map_warp", "use_map_warp"),
+ ("WorldTextureSlot", "texture_coordinates", "texture_coords"),
+ ("WorldTextureSlot", "map_blend", "use_map_blend"),
+ ("WorldTextureSlot", "map_horizon", "use_map_horizon"),
+ ("WorldTextureSlot", "map_zenith_down", "use_map_zenith_down"),
+ ("WorldTextureSlot", "map_zenith_up", "use_map_zenith_up"),
+ ("VoxelData", "still_frame_number", "still_frame"),
+ ("WorldLighting", "ao_blend_mode", "ao_blend_type"),
+ ("WorldLighting", "error_tolerance", "error_threshold"),
+ ("WorldLighting", "use_ambient_occlusion", "use_ambient_occlusian"),
+ ("WorldLighting", "pixel_cache", "use_cache"),
+ ("WorldLighting", "use_environment_lighting", "use_environment_light"),
+ ("WorldLighting", "use_indirect_lighting", "use_indirect_light"),
+ ("WorldStarsSettings", "color_randomization", "color_random"),
+ ("WorldStarsSettings", "min_distance", "distance_min"),
+ ("WorldLighting", "falloff", "use_falloff"),
+ ("Constraint", "disabled", "is_valid"),
+ ("ClampToConstraint", "cyclic", "use_cyclic"),
+ ("ImageTexture", "filter", "filter_type"),
+ ("ImageTexture", "interpolation", "use_interpolation"),
+ ("ImageTexture", "mipmap", "use_mipmap"),
+ ("ImageUser", "frames", "frame_duration"),
+ ("ImageUser", "offset", "frame_offset"),
+ ("ImageUser", "cyclic", "use_cyclic"),
+ ("ArmatureModifier", "invert", "invert_vertex_group"),
+ ("ArmatureModifier", "quaternion", "use_deform_preserve_volume"),
+ ("ArrayModifier", "length", "fit_length"),
+ ("BevelModifier", "angle", "angle_limit"),
+ ("BuildModifier", "length", "frame_duration"),
+ ("BuildModifier", "randomize", "use_random_order"),
+ ("CastModifier", "x", "use_x"),
+ ("CastModifier", "y", "use_y"),
+ ("CastModifier", "z", "use_z"),
+ ("ExplodeModifier", "size", "use_size"),
+ ("MaskModifier", "invert", "invert_vertex_group"),
+ ("MeshDeformModifier", "invert", "invert_vertex_group"),
+ ("MeshDeformModifier", "dynamic", "use_dynamic_bind"),
+ ("MirrorModifier", "clip", "use_clip"),
+ ("MirrorModifier", "x", "use_x"),
+ ("MirrorModifier", "y", "use_y"),
+ ("MirrorModifier", "z", "use_z"),
+ ("ParticleInstanceModifier", "children", "use_children"),
+ ("ParticleInstanceModifier", "normal", "use_normal"),
+ ("ParticleInstanceModifier", "size", "use_size"),
+ ("ShrinkwrapModifier", "negative", "use_negative_direction"),
+ ("ShrinkwrapModifier", "positive", "use_positive_direction"),
+ ("ShrinkwrapModifier", "x", "use_project_x"),
+ ("ShrinkwrapModifier", "y", "use_project_y"),
+ ("ShrinkwrapModifier", "z", "use_project_z"),
+ ("ShrinkwrapModifier", "mode", "wrap_method"),
+ ("SimpleDeformModifier", "mode", "deform_method"),
+ ("SimpleDeformModifier", "relative", "use_relative"),
+ ("SmoothModifier", "repeat", "iterations"),
+ ("SmoothModifier", "x", "use_x"),
+ ("SmoothModifier", "y", "use_y"),
+ ("SmoothModifier", "z", "use_z"),
+ ("SolidifyModifier", "invert", "invert_vertex_group"),
+ ("WaveModifier", "cyclic", "use_cyclic"),
+ ("WaveModifier", "normals", "use_normal"),
+ ("WaveModifier", "x", "use_x"),
+ ("WaveModifier", "y", "use_y"),
+ ("DampedTrackConstraint", "track", "track_axis"),
+ ("FloorConstraint", "sticky", "use_sticky"),
+ ("FollowPathConstraint", "forward", "forward_axis"),
+ ("FollowPathConstraint", "up", "up_axis"),
+ ("LockedTrackConstraint", "lock", "lock_axis"),
+ ("LockedTrackConstraint", "track", "track_axis"),
+ ("MaintainVolumeConstraint", "axis", "free_axis"),
+ ("TrackToConstraint", "track", "track_axis"),
+ ("TrackToConstraint", "up", "up_axis"),
+ ("GameProperty", "debug", "show_debug"),
+ ("Image", "tiles", "use_tiles"),
+ ("Lamp", "diffuse", "use_diffuse"),
+ ("Lamp", "negative", "use_negative"),
+ ("Lamp", "layer", "use_own_layer"),
+ ("Lamp", "specular", "use_specular"),
+ ("AreaLamp", "dither", "use_dither"),
+ ("AreaLamp", "jitter", "use_jitter"),
+ ("SpotLamp", "square", "use_square"),
+ ("Material", "cubic", "use_cubic"),
+ ("Material", "shadows", "use_shadows"),
+ ("ParticleSettings", "amount", "count"),
+ ("ParticleSettings", "display", "draw_percentage"),
+ ("ParticleSettings", "velocity", "show_velocity"),
+ ("ParticleSettings", "trand", "use_emit_random"),
+ ("ParticleSettings", "parent", "use_parent_particles"),
+ ("ParticleSettings", "emitter", "use_render_emitter"),
+ ("ParticleSettings", "viewport", "use_simplify_viewport"),
+ ("Texture", "brightness", "intensity"),
+ ("CloudsTexture", "stype", "cloud_type"),
+ ("EnvironmentMapTexture", "filter", "filter_type"),
+ ("EnvironmentMapTexture", "mipmap", "use_mipmap"),
+ ("MarbleTexture", "stype", "marble_type"),
+ ("StucciTexture", "stype", "stucci_type"),
+ ("WoodTexture", "stype", "wood_type"),
+ ("World", "range", "color_range"),
+ ("World", "lighting", "light_settings"),
+ ("World", "mist", "mist_settings"),
+ ("World", "stars", "star_settings"),
+ ("MaterialHalo", "lines", "use_lines"),
+ ("MaterialHalo", "ring", "use_ring"),
+ ("MaterialHalo", "soft", "use_soft"),
+ ("MaterialHalo", "star", "use_star"),
+ ("MaterialHalo", "texture", "use_texture"),
+ ("MaterialPhysics", "damp", "damping"),
+ ("MaterialRaytraceTransparency", "limit", "depth_max"),
+ ("NlaStrip", "reversed", "use_reverse"),
+ ("CompositorNodeBlur", "bokeh", "use_bokeh"),
+ ("CompositorNodeBlur", "gamma", "use_gamma_correction"),
+ ("CompositorNodeBlur", "relative", "use_relative"),
+ ("CompositorNodeChannelMatte", "high", "limit_max"),
+ ("CompositorNodeChannelMatte", "low", "limit_min"),
+ ("CompositorNodeChannelMatte", "channel", "matte_channel"),
+ ("CompositorNodeChromaMatte", "cutoff", "threshold"),
+ ("CompositorNodeColorMatte", "h", "color_hue"),
+ ("CompositorNodeColorMatte", "s", "color_saturation"),
+ ("CompositorNodeColorMatte", "v", "color_value"),
+ ("CompositorNodeDBlur", "wrap", "use_wrap"),
+ ("CompositorNodeDefocus", "preview", "use_preview"),
+ ("CompositorNodeHueSat", "hue", "color_hue"),
+ ("CompositorNodeHueSat", "sat", "color_saturation"),
+ ("CompositorNodeHueSat", "val", "color_value"),
+ ("CompositorNodeImage", "frames", "frame_duration"),
+ ("CompositorNodeImage", "offset", "frame_offset"),
+ ("CompositorNodeImage", "start", "frame_start"),
+ ("CompositorNodeImage", "cyclic", "use_cyclic"),
+ ("CompositorNodeInvert", "alpha", "invert_alpha"),
+ ("CompositorNodeInvert", "rgb", "invert_rgb"),
+ ("CompositorNodeLensdist", "fit", "use_fit"),
+ ("CompositorNodeLensdist", "jitter", "use_jitter"),
+ ("CompositorNodeMixRGB", "alpha", "use_alpha"),
+ ("CompositorNodeRotate", "filter", "filter_type"),
+ ("CompositorNodeTime", "end", "frame_end"),
+ ("CompositorNodeTime", "start", "frame_start"),
+ ("CompositorNodeVecBlur", "curved", "use_curved"),
+ ("ShaderNodeExtendedMaterial", "diffuse", "use_diffuse"),
+ ("ShaderNodeExtendedMaterial", "specular", "use_specular"),
+ ("ShaderNodeMaterial", "diffuse", "use_diffuse"),
+ ("ShaderNodeMaterial", "specular", "use_specular"),
+ ("ShaderNodeMixRGB", "alpha", "use_alpha"),
+ ("TextureNodeCurveTime", "end", "frame_end"),
+ ("TextureNodeCurveTime", "start", "frame_start"),
+ ("TextureNodeMixRGB", "alpha", "use_alpha"),
+ ("TextureSlot", "negate", "invert"),
+ ("TextureSlot", "size", "scale"),
+ ("SoftBodySettings", "damp", "damping"),
+ ("SequenceCrop", "right", "max_x"),
+ ("SequenceCrop", "top", "max_y"),
+ ("SequenceCrop", "bottom", "min_x"),
+ ("SequenceCrop", "left", "min_y"),
+ ("Sequence", "speed_fader", "speed_factor"),
+ ("SpeedControlSequence", "global_speed", "multiply_speed"),
+ ("SpeedControlSequence", "use_curve_velocity", "use_as_speed"),
+ ("SpeedControlSequence", "use_curve_compress_y", "scale_to_length"),
+ ("Key", "keys", "key_blocks"),
+ ]
+
+
+import bpy
+
+
+class UpdateAnimData(bpy.types.Operator):
+ '''Update data paths from 2.53 to edited data paths of drivers and fcurves'''
+ bl_idname = "anim.update_data_paths"
+ bl_label = "Update Animation Data"
+
+ def execute(self, context):
+ import animsys_refactor
+ animsys_refactor.update_data_paths(data_path_update)
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/image.py b/release/scripts/startup/bl_operators/image.py
new file mode 100644
index 00000000000..462db3a2c5e
--- /dev/null
+++ b/release/scripts/startup/bl_operators/image.py
@@ -0,0 +1,202 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+from bpy.props import StringProperty
+
+
+class EditExternally(bpy.types.Operator):
+ '''Edit image in an external application'''
+ bl_idname = "image.external_edit"
+ bl_label = "Image Edit Externally"
+ bl_options = {'REGISTER'}
+
+ filepath = StringProperty(name="File Path", description="Path to an image file", maxlen=1024, default="")
+
+ def _editor_guess(self, context):
+ import sys
+
+ image_editor = context.user_preferences.filepaths.image_editor
+
+ # use image editor in the preferences when available.
+ if not image_editor:
+ if sys.platform[:3] == "win":
+ image_editor = ["start"] # not tested!
+ elif sys.platform == "darwin":
+ image_editor = ["open"]
+ else:
+ image_editor = ["gimp"]
+ else:
+ if sys.platform == "darwin":
+ # blender file selector treats .app as a folder
+ # and will include a trailing backslash, so we strip it.
+ image_editor.rstrip('\\')
+ image_editor = ["open", "-a", image_editor]
+ else:
+ image_editor = [image_editor]
+
+ return image_editor
+
+ def execute(self, context):
+ import os
+ import subprocess
+ filepath = bpy.path.abspath(self.filepath)
+
+ if not os.path.exists(filepath):
+ self.report({'ERROR'}, "Image path %r not found." % filepath)
+ return {'CANCELLED'}
+
+ cmd = self._editor_guess(context) + [filepath]
+
+ try:
+ subprocess.Popen(cmd)
+ except:
+ import traceback
+ traceback.print_exc()
+ self.report({'ERROR'}, "Image editor not found, please specify in User Preferences > File")
+ return {'CANCELLED'}
+
+ return {'FINISHED'}
+
+ def invoke(self, context, event):
+ try:
+ filepath = context.space_data.image.filepath
+ except:
+ import traceback
+ traceback.print_exc()
+ self.report({'ERROR'}, "Image not found on disk")
+ return {'CANCELLED'}
+
+ self.filepath = filepath
+ self.execute(context)
+
+ return {'FINISHED'}
+
+
+class SaveDirty(bpy.types.Operator):
+ """Save all modified textures"""
+ bl_idname = "image.save_dirty"
+ bl_label = "Save Dirty"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ def execute(self, context):
+ unique_paths = set()
+ for image in bpy.data.images:
+ if image.is_dirty:
+ filepath = bpy.path.abspath(image.filepath)
+ if "\\" not in filepath and "/" not in filepath:
+ self.report({'WARNING'}, "Invalid path: " + filepath)
+ elif filepath in unique_paths:
+ self.report({'WARNING'}, "Path used by more then one image: " + filepath)
+ else:
+ unique_paths.add(filepath)
+ image.save()
+ return {'FINISHED'}
+
+
+class ProjectEdit(bpy.types.Operator):
+ """Edit a snapshot of the viewport in an external image editor"""
+ bl_idname = "image.project_edit"
+ bl_label = "Project Edit"
+ bl_options = {'REGISTER'}
+
+ _proj_hack = [""]
+
+ def execute(self, context):
+ import os
+ import subprocess
+
+ EXT = "png" # could be made an option but for now ok
+
+ for image in bpy.data.images:
+ image.tag = True
+
+ if 'FINISHED' not in bpy.ops.paint.image_from_view():
+ return {'CANCELLED'}
+
+ image_new = None
+ for image in bpy.data.images:
+ if not image.tag:
+ image_new = image
+ break
+
+ if not image_new:
+ self.report({'ERROR'}, "Could not make new image")
+ return {'CANCELLED'}
+
+ filepath = os.path.basename(bpy.data.filepath)
+ filepath = os.path.splitext(filepath)[0]
+ # filepath = bpy.path.clean_name(filepath) # fixes <memory> rubbish, needs checking
+
+ if filepath.startswith(".") or filepath == "":
+ # TODO, have a way to check if the file is saved, assume startup.blend
+ tmpdir = context.user_preferences.filepaths.temporary_directory
+ filepath = os.path.join(tmpdir, "project_edit")
+ else:
+ filepath = "//" + filepath
+
+ obj = context.object
+
+ if obj:
+ filepath += "_" + bpy.path.clean_name(obj.name)
+
+ filepath_final = filepath + "." + EXT
+ i = 0
+
+ while os.path.exists(bpy.path.abspath(filepath_final)):
+ filepath_final = filepath + ("%.3d.%s" % (i, EXT))
+ i += 1
+
+ image_new.name = os.path.basename(filepath_final)
+ ProjectEdit._proj_hack[0] = image_new.name
+
+ image_new.filepath_raw = filepath_final # TODO, filepath raw is crummy
+ image_new.file_format = 'PNG'
+ image_new.save()
+
+ try:
+ bpy.ops.image.external_edit(filepath=filepath_final)
+ except RuntimeError as re:
+ self.report({'ERROR'}, str(re))
+
+ return {'FINISHED'}
+
+
+class ProjectApply(bpy.types.Operator):
+ """Project edited image back onto the object"""
+ bl_idname = "image.project_apply"
+ bl_label = "Project Apply"
+ bl_options = {'REGISTER'}
+
+ def execute(self, context):
+ image_name = ProjectEdit._proj_hack[0] # TODO, deal with this nicer
+
+ try:
+ image = bpy.data.images[image_name]
+ except KeyError:
+ import traceback
+ traceback.print_exc()
+ self.report({'ERROR'}, "Could not find image '%s'" % image_name)
+ return {'CANCELLED'}
+
+ image.reload()
+ bpy.ops.paint.project_image(image=image_name)
+
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/mesh.py b/release/scripts/startup/bl_operators/mesh.py
new file mode 100644
index 00000000000..a37a83f0f09
--- /dev/null
+++ b/release/scripts/startup/bl_operators/mesh.py
@@ -0,0 +1,172 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+
+
+class MeshSelectInteriorFaces(bpy.types.Operator):
+ '''Select faces where all edges have more then 2 face users.'''
+
+ bl_idname = "mesh.faces_select_interior"
+ bl_label = "Select Interior Faces"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ @classmethod
+ def poll(cls, context):
+ ob = context.active_object
+ return (ob and ob.type == 'MESH')
+
+ def execute(self, context):
+ ob = context.active_object
+ context.tool_settings.mesh_select_mode = False, False, True
+ is_editmode = (ob.mode == 'EDIT')
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+ mesh = ob.data
+
+ face_list = mesh.faces[:]
+ face_edge_keys = [face.edge_keys for face in face_list]
+
+ edge_face_count = mesh.edge_face_count_dict
+
+ def test_interior(index):
+ for key in face_edge_keys[index]:
+ if edge_face_count[key] < 3:
+ return False
+ return True
+
+ for index, face in enumerate(face_list):
+ if(test_interior(index)):
+ face.select = True
+ else:
+ face.select = False
+
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='EDIT', toggle=False)
+ return {'FINISHED'}
+
+
+class MeshMirrorUV(bpy.types.Operator):
+ '''Copy mirror UV coordinates on the X axis based on a mirrored mesh'''
+ bl_idname = "mesh.faces_miror_uv"
+ bl_label = "Copy Mirrored UV coords"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ @classmethod
+ def poll(cls, context):
+ ob = context.active_object
+ return (ob and ob.type == 'MESH')
+
+ def execute(self, context):
+ DIR = 1 # TODO, make an option
+
+ from mathutils import Vector
+
+ ob = context.active_object
+ is_editmode = (ob.mode == 'EDIT')
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+ mesh = ob.data
+
+ # mirror lookups
+ mirror_gt = {}
+ mirror_lt = {}
+
+ vcos = [v.co.to_tuple(5) for v in mesh.vertices]
+
+ for i, co in enumerate(vcos):
+ if co[0] > 0.0:
+ mirror_gt[co] = i
+ elif co[0] < 0.0:
+ mirror_lt[co] = i
+ else:
+ mirror_gt[co] = i
+ mirror_lt[co] = i
+
+ #for i, v in enumerate(mesh.vertices):
+ vmap = {}
+ for mirror_a, mirror_b in (mirror_gt, mirror_lt), (mirror_lt, mirror_gt):
+ for co, i in mirror_a.items():
+ nco = (-co[0], co[1], co[2])
+ j = mirror_b.get(nco)
+ if j is not None:
+ vmap[i] = j
+
+ active_uv_layer = None
+ for lay in mesh.uv_textures:
+ if lay.active:
+ active_uv_layer = lay.data
+ break
+
+ fuvs = [(uv.uv1, uv.uv2, uv.uv3, uv.uv4) for uv in active_uv_layer]
+ fuvs_cpy = [(uv[0].copy(), uv[1].copy(), uv[2].copy(), uv[3].copy()) for uv in fuvs]
+
+ # as a list
+ faces = mesh.faces[:]
+
+ fuvsel = [(False not in uv.select_uv) for uv in active_uv_layer]
+ fcents = [f.center for f in faces]
+
+ # find mirror faces
+ mirror_fm = {}
+ for i, f in enumerate(faces):
+ verts = list(f.vertices)
+ verts.sort()
+ verts = tuple(verts)
+ mirror_fm[verts] = i
+
+ fmap = {}
+ for i, f in enumerate(faces):
+ verts = [vmap.get(j) for j in f.vertices]
+ if None not in verts:
+ verts.sort()
+ j = mirror_fm.get(tuple(verts))
+ if j is not None:
+ fmap[i] = j
+
+ done = [False] * len(faces)
+ for i, j in fmap.items():
+
+ if not fuvsel[i] or not fuvsel[j]:
+ continue
+ elif DIR == 0 and fcents[i][0] < 0.0:
+ continue
+ elif DIR == 1 and fcents[i][0] > 0.0:
+ continue
+
+ # copy UVs
+ uv1 = fuvs[i]
+ uv2 = fuvs_cpy[j]
+
+ # get the correct rotation
+ v1 = faces[j].vertices[:]
+ v2 = [vmap[k] for k in faces[i].vertices[:]]
+
+ for k in range(len(uv1)):
+ k_map = v1.index(v2[k])
+ uv1[k].x = - (uv2[k_map].x - 0.5) + 0.5
+ uv1[k].y = uv2[k_map].y
+
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='EDIT', toggle=False)
+
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/nla.py b/release/scripts/startup/bl_operators/nla.py
new file mode 100644
index 00000000000..923ca92a162
--- /dev/null
+++ b/release/scripts/startup/bl_operators/nla.py
@@ -0,0 +1,170 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+
+
+def pose_info():
+ from mathutils import Matrix
+
+ info = {}
+
+ obj = bpy.context.object
+ pose = obj.pose
+
+ pose_items = pose.bones.items()
+
+ for name, pbone in pose_items:
+ binfo = {}
+ bone = pbone.bone
+
+ binfo["parent"] = getattr(bone.parent, "name", None)
+ binfo["bone"] = bone
+ binfo["pbone"] = pbone
+ binfo["matrix_local"] = bone.matrix_local.copy()
+ try:
+ binfo["matrix_local_inv"] = binfo["matrix_local"].inverted()
+ except:
+ binfo["matrix_local_inv"] = Matrix()
+
+ binfo["matrix"] = bone.matrix.copy()
+ binfo["matrix_pose"] = pbone.matrix.copy()
+ try:
+ binfo["matrix_pose_inv"] = binfo["matrix_pose"].inverted()
+ except:
+ binfo["matrix_pose_inv"] = Matrix()
+
+ print(binfo["matrix_pose"])
+ info[name] = binfo
+
+ for name, pbone in pose_items:
+ binfo = info[name]
+ binfo_parent = binfo.get("parent", None)
+ if binfo_parent:
+ binfo_parent = info[binfo_parent]
+
+ matrix = binfo["matrix_pose"]
+ rest_matrix = binfo["matrix_local"]
+
+ if binfo_parent:
+ matrix = binfo_parent["matrix_pose_inv"] * matrix
+ rest_matrix = binfo_parent["matrix_local_inv"] * rest_matrix
+
+ matrix = rest_matrix.inverted() * matrix
+
+ binfo["matrix_key"] = matrix.copy()
+
+ return info
+
+
+def bake(frame_start, frame_end, step=1, only_selected=False):
+ scene = bpy.context.scene
+ obj = bpy.context.object
+ pose = obj.pose
+
+ info_ls = []
+
+ frame_range = range(frame_start, frame_end + 1, step)
+
+ # could spped this up by applying steps here too...
+ for f in frame_range:
+ scene.frame_set(f)
+
+ info = pose_info()
+ info_ls.append(info)
+ f += 1
+
+ action = bpy.data.actions.new("Action")
+
+ bpy.context.object.animation_data.action = action
+
+ pose_items = pose.bones.items()
+
+ for name, pbone in pose_items:
+ if only_selected and not pbone.bone.select:
+ continue
+
+ for f in frame_range:
+ matrix = info_ls[int((f - frame_start) / step)][name]["matrix_key"]
+
+ #pbone.location = matrix.to_translation()
+ #pbone.rotation_quaternion = matrix.to_quaternion()
+ pbone.matrix_basis = matrix
+
+ pbone.keyframe_insert("location", -1, f, name)
+
+ rotation_mode = pbone.rotation_mode
+
+ if rotation_mode == 'QUATERNION':
+ pbone.keyframe_insert("rotation_quaternion", -1, f, name)
+ elif rotation_mode == 'AXIS_ANGLE':
+ pbone.keyframe_insert("rotation_axis_angle", -1, f, name)
+ else: # euler, XYZ, ZXY etc
+ pbone.keyframe_insert("rotation_euler", -1, f, name)
+
+ pbone.keyframe_insert("scale", -1, f, name)
+
+ return action
+
+
+from bpy.props import IntProperty, BoolProperty
+
+
+class BakeAction(bpy.types.Operator):
+ '''Bake animation to an Action'''
+ bl_idname = "nla.bake"
+ bl_label = "Bake Action"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ frame_start = IntProperty(name="Start Frame",
+ description="Start frame for baking",
+ default=1, min=1, max=300000)
+ frame_end = IntProperty(name="End Frame",
+ description="End frame for baking",
+ default=250, min=1, max=300000)
+ step = IntProperty(name="Frame Step",
+ description="Frame Step",
+ default=1, min=1, max=120)
+ only_selected = BoolProperty(name="Only Selected",
+ default=True)
+
+ def execute(self, context):
+
+ action = bake(self.frame_start, self.frame_end, self.step, self.only_selected)
+
+ # basic cleanup, could move elsewhere
+ for fcu in action.fcurves:
+ keyframe_points = fcu.keyframe_points
+ i = 1
+ while i < len(fcu.keyframe_points) - 1:
+ val_prev = keyframe_points[i - 1].co[1]
+ val_next = keyframe_points[i + 1].co[1]
+ val = keyframe_points[i].co[1]
+
+ if abs(val - val_prev) + abs(val - val_next) < 0.0001:
+ keyframe_points.remove(keyframe_points[i])
+ else:
+ i += 1
+
+ return {'FINISHED'}
+
+ def invoke(self, context, event):
+ wm = context.window_manager
+ return wm.invoke_props_dialog(self)
diff --git a/release/scripts/startup/bl_operators/object.py b/release/scripts/startup/bl_operators/object.py
new file mode 100644
index 00000000000..d19de50ea6a
--- /dev/null
+++ b/release/scripts/startup/bl_operators/object.py
@@ -0,0 +1,563 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+from bpy.props import StringProperty, BoolProperty, EnumProperty, IntProperty
+
+
+class SelectPattern(bpy.types.Operator):
+ '''Select object matching a naming pattern'''
+ bl_idname = "object.select_pattern"
+ bl_label = "Select Pattern"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ pattern = StringProperty(name="Pattern", description="Name filter using '*' and '?' wildcard chars", maxlen=32, default="*")
+ case_sensitive = BoolProperty(name="Case Sensitive", description="Do a case sensitive compare", default=False)
+ extend = BoolProperty(name="Extend", description="Extend the existing selection", default=True)
+
+ def execute(self, context):
+
+ import fnmatch
+
+ if self.case_sensitive:
+ pattern_match = fnmatch.fnmatchcase
+ else:
+ pattern_match = lambda a, b: fnmatch.fnmatchcase(a.upper(), b.upper())
+
+ obj = context.object
+ if obj and obj.mode == 'POSE':
+ items = obj.data.bones
+ elif obj and obj.type == 'ARMATURE' and obj.mode == 'EDIT':
+ items = obj.data.edit_bones
+ else:
+ items = context.visible_objects
+
+ # Can be pose bones or objects
+ for item in items:
+ if pattern_match(item.name, self.pattern):
+ item.select = True
+ elif not self.extend:
+ item.select = False
+
+ return {'FINISHED'}
+
+ def invoke(self, context, event):
+ wm = context.window_manager
+ return wm.invoke_props_popup(self, event)
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.prop(self, "pattern")
+ row = layout.row()
+ row.prop(self, "case_sensitive")
+ row.prop(self, "extend")
+
+
+class SelectCamera(bpy.types.Operator):
+ '''Select object matching a naming pattern'''
+ bl_idname = "object.select_camera"
+ bl_label = "Select Camera"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ @classmethod
+ def poll(cls, context):
+ return context.scene.camera is not None
+
+ def execute(self, context):
+ scene = context.scene
+ camera = scene.camera
+ if camera.name not in scene.objects:
+ self.report({'WARNING'}, "Active camera is not in this scene")
+
+ context.scene.objects.active = camera
+ camera.select = True
+ return {'FINISHED'}
+
+
+class SelectHierarchy(bpy.types.Operator):
+ '''Select object relative to the active objects position in the hierarchy'''
+ bl_idname = "object.select_hierarchy"
+ bl_label = "Select Hierarchy"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ direction = EnumProperty(items=(
+ ('PARENT', "Parent", ""),
+ ('CHILD', "Child", "")),
+ name="Direction",
+ description="Direction to select in the hierarchy",
+ default='PARENT')
+
+ extend = BoolProperty(name="Extend", description="Extend the existing selection", default=False)
+
+ @classmethod
+ def poll(cls, context):
+ return context.object
+
+ def execute(self, context):
+ select_new = []
+ act_new = None
+
+ selected_objects = context.selected_objects
+ obj_act = context.object
+
+ if context.object not in selected_objects:
+ selected_objects.append(context.object)
+
+ if self.direction == 'PARENT':
+ for obj in selected_objects:
+ parent = obj.parent
+
+ if parent:
+ if obj_act == obj:
+ act_new = parent
+
+ select_new.append(parent)
+
+ else:
+ for obj in selected_objects:
+ select_new.extend(obj.children)
+
+ if select_new:
+ select_new.sort(key=lambda obj_iter: obj_iter.name)
+ act_new = select_new[0]
+
+ # dont edit any object settings above this
+ if select_new:
+ if not self.extend:
+ bpy.ops.object.select_all(action='DESELECT')
+
+ for obj in select_new:
+ obj.select = True
+
+ context.scene.objects.active = act_new
+ return {'FINISHED'}
+
+ return {'CANCELLED'}
+
+
+class SubdivisionSet(bpy.types.Operator):
+ '''Sets a Subdivision Surface Level (1-5)'''
+
+ bl_idname = "object.subdivision_set"
+ bl_label = "Subdivision Set"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ level = IntProperty(name="Level",
+ default=1, min=-100, max=100, soft_min=-6, soft_max=6)
+
+ relative = BoolProperty(name="Relative", description="Apply the subsurf level as an offset relative to the current level", default=False)
+
+ @classmethod
+ def poll(cls, context):
+ obs = context.selected_editable_objects
+ return (obs is not None)
+
+ def execute(self, context):
+ level = self.level
+ relative = self.relative
+
+ if relative and level == 0:
+ return {'CANCELLED'} # nothing to do
+
+ def set_object_subd(obj):
+ for mod in obj.modifiers:
+ if mod.type == 'MULTIRES':
+ if not relative:
+ if level <= mod.total_levels:
+ if obj.mode == 'SCULPT':
+ if mod.sculpt_levels != level:
+ mod.sculpt_levels = level
+ elif obj.mode == 'OBJECT':
+ if mod.levels != level:
+ mod.levels = level
+ return
+ else:
+ if obj.mode == 'SCULPT':
+ if mod.sculpt_levels + level <= mod.total_levels:
+ mod.sculpt_levels += level
+ elif obj.mode == 'OBJECT':
+ if mod.levels + level <= mod.total_levels:
+ mod.levels += level
+ return
+
+ elif mod.type == 'SUBSURF':
+ if relative:
+ mod.levels += level
+ else:
+ if mod.levels != level:
+ mod.levels = level
+
+ return
+
+ # add a new modifier
+ try:
+ mod = obj.modifiers.new("Subsurf", 'SUBSURF')
+ mod.levels = level
+ except:
+ self.report({'WARNING'}, "Modifiers cannot be added to object: " + obj.name)
+
+ for obj in context.selected_editable_objects:
+ set_object_subd(obj)
+
+ return {'FINISHED'}
+
+
+class ShapeTransfer(bpy.types.Operator):
+ '''Copy another selected objects active shape to this one by applying the relative offsets'''
+
+ bl_idname = "object.shape_key_transfer"
+ bl_label = "Transfer Shape Key"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ mode = EnumProperty(items=(
+ ('OFFSET', "Offset", "Apply the relative positional offset"),
+ ('RELATIVE_FACE', "Relative Face", "Calculate the geometricly relative position (using faces)."),
+ ('RELATIVE_EDGE', "Relative Edge", "Calculate the geometricly relative position (using edges).")),
+ name="Transformation Mode",
+ description="Method to apply relative shape positions to the new shape",
+ default='OFFSET')
+
+ use_clamp = BoolProperty(name="Clamp Offset",
+ description="Clamp the transformation to the distance each vertex moves in the original shape.",
+ default=False)
+
+ def _main(self, ob_act, objects, mode='OFFSET', use_clamp=False):
+
+ def me_nos(verts):
+ return [v.normal.copy() for v in verts]
+
+ def me_cos(verts):
+ return [v.co.copy() for v in verts]
+
+ def ob_add_shape(ob, name):
+ me = ob.data
+ key = ob.shape_key_add(from_mix=False)
+ if len(me.shape_keys.key_blocks) == 1:
+ key.name = "Basis"
+ key = ob.shape_key_add(from_mix=False) # we need a rest
+ key.name = name
+ ob.active_shape_key_index = len(me.shape_keys.key_blocks) - 1
+ ob.show_only_shape_key = True
+
+ from mathutils.geometry import barycentric_transform
+ from mathutils import Vector
+
+ if use_clamp and mode == 'OFFSET':
+ use_clamp = False
+
+ me = ob_act.data
+ orig_key_name = ob_act.active_shape_key.name
+
+ orig_shape_coords = me_cos(ob_act.active_shape_key.data)
+
+ orig_normals = me_nos(me.vertices)
+ # orig_coords = me_cos(me.vertices) # the actual mverts location isnt as relyable as the base shape :S
+ orig_coords = me_cos(me.shape_keys.key_blocks[0].data)
+
+ for ob_other in objects:
+ me_other = ob_other.data
+ if len(me_other.vertices) != len(me.vertices):
+ self.report({'WARNING'}, "Skipping '%s', vertex count differs" % ob_other.name)
+ continue
+
+ target_normals = me_nos(me_other.vertices)
+ if me_other.shape_keys:
+ target_coords = me_cos(me_other.shape_keys.key_blocks[0].data)
+ else:
+ target_coords = me_cos(me_other.vertices)
+
+ ob_add_shape(ob_other, orig_key_name)
+
+ # editing the final coords, only list that stores wrapped coords
+ target_shape_coords = [v.co for v in ob_other.active_shape_key.data]
+
+ median_coords = [[] for i in range(len(me.vertices))]
+
+ # Method 1, edge
+ if mode == 'OFFSET':
+ for i, vert_cos in enumerate(median_coords):
+ vert_cos.append(target_coords[i] + (orig_shape_coords[i] - orig_coords[i]))
+
+ elif mode == 'RELATIVE_FACE':
+ for face in me.faces:
+ i1, i2, i3, i4 = face.vertices_raw
+ if i4 != 0:
+ pt = barycentric_transform(orig_shape_coords[i1],
+ orig_coords[i4], orig_coords[i1], orig_coords[i2],
+ target_coords[i4], target_coords[i1], target_coords[i2])
+ median_coords[i1].append(pt)
+
+ pt = barycentric_transform(orig_shape_coords[i2],
+ orig_coords[i1], orig_coords[i2], orig_coords[i3],
+ target_coords[i1], target_coords[i2], target_coords[i3])
+ median_coords[i2].append(pt)
+
+ pt = barycentric_transform(orig_shape_coords[i3],
+ orig_coords[i2], orig_coords[i3], orig_coords[i4],
+ target_coords[i2], target_coords[i3], target_coords[i4])
+ median_coords[i3].append(pt)
+
+ pt = barycentric_transform(orig_shape_coords[i4],
+ orig_coords[i3], orig_coords[i4], orig_coords[i1],
+ target_coords[i3], target_coords[i4], target_coords[i1])
+ median_coords[i4].append(pt)
+
+ else:
+ pt = barycentric_transform(orig_shape_coords[i1],
+ orig_coords[i3], orig_coords[i1], orig_coords[i2],
+ target_coords[i3], target_coords[i1], target_coords[i2])
+ median_coords[i1].append(pt)
+
+ pt = barycentric_transform(orig_shape_coords[i2],
+ orig_coords[i1], orig_coords[i2], orig_coords[i3],
+ target_coords[i1], target_coords[i2], target_coords[i3])
+ median_coords[i2].append(pt)
+
+ pt = barycentric_transform(orig_shape_coords[i3],
+ orig_coords[i2], orig_coords[i3], orig_coords[i1],
+ target_coords[i2], target_coords[i3], target_coords[i1])
+ median_coords[i3].append(pt)
+
+ elif mode == 'RELATIVE_EDGE':
+ for ed in me.edges:
+ i1, i2 = ed.vertices
+ v1, v2 = orig_coords[i1], orig_coords[i2]
+ edge_length = (v1 - v2).length
+ n1loc = v1 + orig_normals[i1] * edge_length
+ n2loc = v2 + orig_normals[i2] * edge_length
+
+ # now get the target nloc's
+ v1_to, v2_to = target_coords[i1], target_coords[i2]
+ edlen_to = (v1_to - v2_to).length
+ n1loc_to = v1_to + target_normals[i1] * edlen_to
+ n2loc_to = v2_to + target_normals[i2] * edlen_to
+
+ pt = barycentric_transform(orig_shape_coords[i1],
+ v2, v1, n1loc,
+ v2_to, v1_to, n1loc_to)
+ median_coords[i1].append(pt)
+
+ pt = barycentric_transform(orig_shape_coords[i2],
+ v1, v2, n2loc,
+ v1_to, v2_to, n2loc_to)
+ median_coords[i2].append(pt)
+
+ # apply the offsets to the new shape
+ from functools import reduce
+ VectorAdd = Vector.__add__
+
+ for i, vert_cos in enumerate(median_coords):
+ if vert_cos:
+ co = reduce(VectorAdd, vert_cos) / len(vert_cos)
+
+ if use_clamp:
+ # clamp to the same movement as the original
+ # breaks copy between different scaled meshes.
+ len_from = (orig_shape_coords[i] - orig_coords[i]).length
+ ofs = co - target_coords[i]
+ ofs.length = len_from
+ co = target_coords[i] + ofs
+
+ target_shape_coords[i][:] = co
+
+ return {'FINISHED'}
+
+ @classmethod
+ def poll(cls, context):
+ obj = context.active_object
+ return (obj and obj.mode != 'EDIT')
+
+ def execute(self, context):
+ C = bpy.context
+ ob_act = C.active_object
+ objects = [ob for ob in C.selected_editable_objects if ob != ob_act]
+
+ if 1: # swap from/to, means we cant copy to many at once.
+ if len(objects) != 1:
+ self.report({'ERROR'}, "Expected one other selected mesh object to copy from")
+ return {'CANCELLED'}
+ ob_act, objects = objects[0], [ob_act]
+
+ if ob_act.type != 'MESH':
+ self.report({'ERROR'}, "Other object is not a mesh.")
+ return {'CANCELLED'}
+
+ if ob_act.active_shape_key is None:
+ self.report({'ERROR'}, "Other object has no shape key")
+ return {'CANCELLED'}
+ return self._main(ob_act, objects, self.mode, self.use_clamp)
+
+
+class JoinUVs(bpy.types.Operator):
+ '''Copy UV Layout to objects with matching geometry'''
+ bl_idname = "object.join_uvs"
+ bl_label = "Join as UVs"
+
+ @classmethod
+ def poll(cls, context):
+ obj = context.active_object
+ return (obj and obj.type == 'MESH')
+
+ def _main(self, context):
+ import array
+ obj = context.active_object
+ mesh = obj.data
+
+ is_editmode = (obj.mode == 'EDIT')
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+ if not mesh.uv_textures:
+ self.report({'WARNING'}, "Object: %s, Mesh: '%s' has no UVs\n" % (obj.name, mesh.name))
+ else:
+ len_faces = len(mesh.faces)
+
+ uv_array = array.array('f', [0.0] * 8) * len_faces # seems to be the fastest way to create an array
+ mesh.uv_textures.active.data.foreach_get("uv_raw", uv_array)
+
+ objects = context.selected_editable_objects[:]
+
+ for obj_other in objects:
+ if obj_other.type == 'MESH':
+ obj_other.data.tag = False
+
+ for obj_other in objects:
+ if obj_other != obj and obj_other.type == 'MESH':
+ mesh_other = obj_other.data
+ if mesh_other != mesh:
+ if mesh_other.tag == False:
+ mesh_other.tag = True
+
+ if len(mesh_other.faces) != len_faces:
+ self.report({'WARNING'}, "Object: %s, Mesh: '%s' has %d faces, expected %d\n" % (obj_other.name, mesh_other.name, len(mesh_other.faces), len_faces))
+ else:
+ uv_other = mesh_other.uv_textures.active
+ if not uv_other:
+ uv_other = mesh_other.uv_textures.new() # should return the texture it adds
+
+ # finally do the copy
+ uv_other.data.foreach_set("uv_raw", uv_array)
+
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='EDIT', toggle=False)
+
+ def execute(self, context):
+ self._main(context)
+ return {'FINISHED'}
+
+
+class MakeDupliFace(bpy.types.Operator):
+ '''Make linked objects into dupli-faces'''
+ bl_idname = "object.make_dupli_face"
+ bl_label = "Make Dupli-Face"
+
+ @classmethod
+ def poll(cls, context):
+ obj = context.active_object
+ return (obj and obj.type == 'MESH')
+
+ def _main(self, context):
+ from mathutils import Vector
+
+ SCALE_FAC = 0.01
+ offset = 0.5 * SCALE_FAC
+ base_tri = Vector((-offset, -offset, 0.0)), Vector((offset, -offset, 0.0)), Vector((offset, offset, 0.0)), Vector((-offset, offset, 0.0))
+
+ def matrix_to_quat(matrix):
+ # scale = matrix.median_scale
+ trans = matrix.to_translation()
+ rot = matrix.to_3x3() # also contains scale
+
+ return [(b * rot) + trans for b in base_tri]
+ scene = bpy.context.scene
+ linked = {}
+ for obj in bpy.context.selected_objects:
+ data = obj.data
+ if data:
+ linked.setdefault(data, []).append(obj)
+
+ for data, objects in linked.items():
+ face_verts = [axis for obj in objects for v in matrix_to_quat(obj.matrix_world) for axis in v]
+ faces = list(range(len(face_verts) // 3))
+
+ mesh = bpy.data.meshes.new(data.name + "_dupli")
+
+ mesh.vertices.add(len(face_verts) // 3)
+ mesh.faces.add(len(face_verts) // 12)
+
+ mesh.vertices.foreach_set("co", face_verts)
+ mesh.faces.foreach_set("vertices_raw", faces)
+ mesh.update() # generates edge data
+
+ # pick an object to use
+ obj = objects[0]
+
+ ob_new = bpy.data.objects.new(mesh.name, mesh)
+ base = scene.objects.link(ob_new)
+ base.layers[:] = obj.layers
+
+ ob_inst = bpy.data.objects.new(data.name, data)
+ base = scene.objects.link(ob_inst)
+ base.layers[:] = obj.layers
+
+ for obj in objects:
+ scene.objects.unlink(obj)
+
+ ob_new.dupli_type = 'FACES'
+ ob_inst.parent = ob_new
+ ob_new.use_dupli_faces_scale = True
+ ob_new.dupli_faces_scale = 1.0 / SCALE_FAC
+
+ def execute(self, context):
+ self._main(context)
+ return {'FINISHED'}
+
+
+class IsolateTypeRender(bpy.types.Operator):
+ '''Hide unselected render objects of same type as active by setting the hide render flag'''
+ bl_idname = "object.isolate_type_render"
+ bl_label = "Restrict Render Unselected"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ def execute(self, context):
+ act_type = context.object.type
+
+ for obj in context.visible_objects:
+
+ if obj.select:
+ obj.hide_render = False
+ else:
+ if obj.type == act_type:
+ obj.hide_render = True
+
+ return {'FINISHED'}
+
+
+class ClearAllRestrictRender(bpy.types.Operator):
+ '''Reveal all render objects by setting the hide render flag'''
+ bl_idname = "object.hide_render_clear_all"
+ bl_label = "Clear All Restrict Render"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ def execute(self, context):
+ for obj in context.scene.objects:
+ obj.hide_render = False
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/object_align.py b/release/scripts/startup/bl_operators/object_align.py
new file mode 100644
index 00000000000..644f30a4745
--- /dev/null
+++ b/release/scripts/startup/bl_operators/object_align.py
@@ -0,0 +1,280 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+from mathutils import Vector
+
+
+def align_objects(align_x, align_y, align_z, align_mode, relative_to):
+
+ cursor = bpy.context.scene.cursor_location
+
+ Left_Up_Front_SEL = [0.0, 0.0, 0.0]
+ Right_Down_Back_SEL = [0.0, 0.0, 0.0]
+
+ flag_first = True
+
+ objs = []
+
+ for obj in bpy.context.selected_objects:
+ matrix_world = obj.matrix_world
+ bb_world = [Vector(v[:]) * matrix_world for v in obj.bound_box]
+ objs.append((obj, bb_world))
+
+ if not objs:
+ return False
+
+ for obj, bb_world in objs:
+ Left_Up_Front = bb_world[1]
+ Right_Down_Back = bb_world[7]
+
+ # Active Center
+
+ if obj == bpy.context.active_object:
+
+ center_active_x = (Left_Up_Front[0] + Right_Down_Back[0]) / 2.0
+ center_active_y = (Left_Up_Front[1] + Right_Down_Back[1]) / 2.0
+ center_active_z = (Left_Up_Front[2] + Right_Down_Back[2]) / 2.0
+
+ size_active_x = (Right_Down_Back[0] - Left_Up_Front[0]) / 2.0
+ size_active_y = (Right_Down_Back[1] - Left_Up_Front[1]) / 2.0
+ size_active_z = (Left_Up_Front[2] - Right_Down_Back[2]) / 2.0
+
+ # Selection Center
+
+ if flag_first:
+ flag_first = False
+
+ Left_Up_Front_SEL[0] = Left_Up_Front[0]
+ Left_Up_Front_SEL[1] = Left_Up_Front[1]
+ Left_Up_Front_SEL[2] = Left_Up_Front[2]
+
+ Right_Down_Back_SEL[0] = Right_Down_Back[0]
+ Right_Down_Back_SEL[1] = Right_Down_Back[1]
+ Right_Down_Back_SEL[2] = Right_Down_Back[2]
+
+ else:
+ # X axis
+ if Left_Up_Front[0] < Left_Up_Front_SEL[0]:
+ Left_Up_Front_SEL[0] = Left_Up_Front[0]
+ # Y axis
+ if Left_Up_Front[1] < Left_Up_Front_SEL[1]:
+ Left_Up_Front_SEL[1] = Left_Up_Front[1]
+ # Z axis
+ if Left_Up_Front[2] > Left_Up_Front_SEL[2]:
+ Left_Up_Front_SEL[2] = Left_Up_Front[2]
+
+ # X axis
+ if Right_Down_Back[0] > Right_Down_Back_SEL[0]:
+ Right_Down_Back_SEL[0] = Right_Down_Back[0]
+ # Y axis
+ if Right_Down_Back[1] > Right_Down_Back_SEL[1]:
+ Right_Down_Back_SEL[1] = Right_Down_Back[1]
+ # Z axis
+ if Right_Down_Back[2] < Right_Down_Back_SEL[2]:
+ Right_Down_Back_SEL[2] = Right_Down_Back[2]
+
+ center_sel_x = (Left_Up_Front_SEL[0] + Right_Down_Back_SEL[0]) / 2.0
+ center_sel_y = (Left_Up_Front_SEL[1] + Right_Down_Back_SEL[1]) / 2.0
+ center_sel_z = (Left_Up_Front_SEL[2] + Right_Down_Back_SEL[2]) / 2.0
+
+ # Main Loop
+
+ for obj, bb_world in objs:
+
+ loc_world = obj.location
+ bb_world = [Vector(v[:]) * obj.matrix_world for v in obj.bound_box]
+
+ Left_Up_Front = bb_world[1]
+ Right_Down_Back = bb_world[7]
+
+ center_x = (Left_Up_Front[0] + Right_Down_Back[0]) / 2.0
+ center_y = (Left_Up_Front[1] + Right_Down_Back[1]) / 2.0
+ center_z = (Left_Up_Front[2] + Right_Down_Back[2]) / 2.0
+
+ positive_x = Right_Down_Back[0]
+ positive_y = Right_Down_Back[1]
+ positive_z = Left_Up_Front[2]
+
+ negative_x = Left_Up_Front[0]
+ negative_y = Left_Up_Front[1]
+ negative_z = Right_Down_Back[2]
+
+ obj_loc = obj.location
+
+ if align_x:
+
+ # Align Mode
+
+ if relative_to == 'OPT_4': # Active relative
+ if align_mode == 'OPT_1':
+ obj_x = obj_loc[0] - negative_x - size_active_x
+
+ elif align_mode == 'OPT_3':
+ obj_x = obj_loc[0] - positive_x + size_active_x
+
+ else: # Everything else relative
+ if align_mode == 'OPT_1':
+ obj_x = obj_loc[0] - negative_x
+
+ elif align_mode == 'OPT_3':
+ obj_x = obj_loc[0] - positive_x
+
+ if align_mode == 'OPT_2': # All relative
+ obj_x = obj_loc[0] - center_x
+
+ # Relative To
+
+ if relative_to == 'OPT_1':
+ loc_x = obj_x
+
+ elif relative_to == 'OPT_2':
+ loc_x = obj_x + cursor[0]
+
+ elif relative_to == 'OPT_3':
+ loc_x = obj_x + center_sel_x
+
+ elif relative_to == 'OPT_4':
+ loc_x = obj_x + center_active_x
+
+ obj.location[0] = loc_x
+
+ if align_y:
+ # Align Mode
+
+ if relative_to == 'OPT_4': # Active relative
+ if align_mode == 'OPT_1':
+ obj_y = obj_loc[1] - negative_y - size_active_y
+
+ elif align_mode == 'OPT_3':
+ obj_y = obj_loc[1] - positive_y + size_active_y
+
+ else: # Everything else relative
+ if align_mode == 'OPT_1':
+ obj_y = obj_loc[1] - negative_y
+
+ elif align_mode == 'OPT_3':
+ obj_y = obj_loc[1] - positive_y
+
+ if align_mode == 'OPT_2': # All relative
+ obj_y = obj_loc[1] - center_y
+
+ # Relative To
+
+ if relative_to == 'OPT_1':
+ loc_y = obj_y
+
+ elif relative_to == 'OPT_2':
+ loc_y = obj_y + cursor[1]
+
+ elif relative_to == 'OPT_3':
+ loc_y = obj_y + center_sel_y
+
+ elif relative_to == 'OPT_4':
+ loc_y = obj_y + center_active_y
+
+ obj.location[1] = loc_y
+
+ if align_z:
+ # Align Mode
+ if relative_to == 'OPT_4': # Active relative
+ if align_mode == 'OPT_1':
+ obj_z = obj_loc[2] - negative_z - size_active_z
+
+ elif align_mode == 'OPT_3':
+ obj_z = obj_loc[2] - positive_z + size_active_z
+
+ else: # Everything else relative
+ if align_mode == 'OPT_1':
+ obj_z = obj_loc[2] - negative_z
+
+ elif align_mode == 'OPT_3':
+ obj_z = obj_loc[2] - positive_z
+
+ if align_mode == 'OPT_2': # All relative
+ obj_z = obj_loc[2] - center_z
+
+ # Relative To
+
+ if relative_to == 'OPT_1':
+ loc_z = obj_z
+
+ elif relative_to == 'OPT_2':
+ loc_z = obj_z + cursor[2]
+
+ elif relative_to == 'OPT_3':
+ loc_z = obj_z + center_sel_z
+
+ elif relative_to == 'OPT_4':
+ loc_z = obj_z + center_active_z
+
+ obj.location[2] = loc_z
+
+ return True
+
+
+from bpy.props import EnumProperty
+
+
+class AlignObjects(bpy.types.Operator):
+ '''Align Objects'''
+ bl_idname = "object.align"
+ bl_label = "Align Objects"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ align_mode = EnumProperty(items=(
+ ('OPT_1', "Negative Sides", ""),
+ ('OPT_2', "Centers", ""),
+ ('OPT_3', "Positive Sides", "")),
+ name="Align Mode:",
+ description="",
+ default='OPT_2')
+
+ relative_to = EnumProperty(items=(
+ ('OPT_1', "Scene Origin", ""),
+ ('OPT_2', "3D Cursor", ""),
+ ('OPT_3', "Selection", ""),
+ ('OPT_4', "Active", "")),
+ name="Relative To:",
+ description="",
+ default='OPT_4')
+
+ align_axis = EnumProperty(items=(
+ ('X', "X", ""),
+ ('Y', "Y", ""),
+ ('Z', "Z", ""),
+ ),
+ name="Align",
+ description="Align to axis",
+ options={'ENUM_FLAG'})
+
+ @classmethod
+ def poll(cls, context):
+ return context.mode == 'OBJECT'
+
+ def execute(self, context):
+ align_axis = self.align_axis
+ ret = align_objects('X' in align_axis, 'Y' in align_axis, 'Z' in align_axis, self.align_mode, self.relative_to)
+
+ if not ret:
+ self.report({'WARNING'}, "No objects with bound-box selected")
+ return {'CANCELLED'}
+ else:
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py
new file mode 100644
index 00000000000..94074a52cd6
--- /dev/null
+++ b/release/scripts/startup/bl_operators/object_quick_effects.py
@@ -0,0 +1,292 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+from mathutils import Vector
+import bpy
+from bpy.props import BoolProperty, EnumProperty, IntProperty, FloatProperty, FloatVectorProperty
+
+
+class MakeFur(bpy.types.Operator):
+ bl_idname = "object.make_fur"
+ bl_label = "Make Fur"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ density = EnumProperty(items=(
+ ('LIGHT', "Light", ""),
+ ('MEDIUM', "Medium", ""),
+ ('HEAVY', "Heavy", "")),
+ name="Fur Density",
+ description="",
+ default='MEDIUM')
+
+ view_percentage = IntProperty(name="View %",
+ default=10, min=1, max=100, soft_min=1, soft_max=100)
+
+ length = FloatProperty(name="Length",
+ default=0.1, min=0.001, max=100, soft_min=0.01, soft_max=10)
+
+ def execute(self, context):
+ fake_context = bpy.context.copy()
+ mesh_objects = [obj for obj in context.selected_objects if obj.type == 'MESH']
+
+ if not mesh_objects:
+ self.report({'ERROR'}, "Select at least one mesh object.")
+ return {'CANCELLED'}
+
+ mat = bpy.data.materials.new("Fur Material")
+ mat.strand.tip_size = 0.25
+ mat.strand.blend_distance = 0.5
+
+ for obj in mesh_objects:
+ fake_context["active_object"] = obj
+ bpy.ops.object.particle_system_add(fake_context)
+
+ psys = obj.particle_systems[-1]
+ psys.settings.type = 'HAIR'
+
+ if self.density == 'LIGHT':
+ psys.settings.count = 100
+ elif self.density == 'MEDIUM':
+ psys.settings.count = 1000
+ elif self.density == 'HEAVY':
+ psys.settings.count = 10000
+
+ psys.settings.child_nbr = self.view_percentage
+ psys.settings.hair_length = self.length
+ psys.settings.use_strand_primitive = True
+ psys.settings.use_hair_bspline = True
+ psys.settings.child_type = 'INTERPOLATED'
+
+ obj.data.materials.append(mat)
+ obj.particle_systems[-1].settings.material = len(obj.data.materials)
+
+ return {'FINISHED'}
+
+
+def obj_bb_minmax(obj, min_co, max_co):
+ for i in range(0, 8):
+ bb_vec = Vector((obj.bound_box[i][0], obj.bound_box[i][1], obj.bound_box[i][2])) * obj.matrix_world
+
+ min_co[0] = min(bb_vec[0], min_co[0])
+ min_co[1] = min(bb_vec[1], min_co[1])
+ min_co[2] = min(bb_vec[2], min_co[2])
+ max_co[0] = max(bb_vec[0], max_co[0])
+ max_co[1] = max(bb_vec[1], max_co[1])
+ max_co[2] = max(bb_vec[2], max_co[2])
+
+
+class MakeSmoke(bpy.types.Operator):
+ bl_idname = "object.make_smoke"
+ bl_label = "Make Smoke"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ style = EnumProperty(items=(
+ ('STREAM', "Stream", ""),
+ ('PUFF', "Puff", ""),
+ ('FIRE', "Fire", "")),
+ name="Smoke Style",
+ description="",
+ default='STREAM')
+
+ show_flows = BoolProperty(name="Render Smoke Objects",
+ description="Keep the smoke objects visible during rendering.",
+ default=False)
+
+ def execute(self, context):
+ mesh_objects = [obj for obj in context.selected_objects if obj.type == 'MESH']
+ min_co = Vector((100000, 100000, 100000))
+ max_co = Vector((-100000, -100000, -100000))
+
+ if not mesh_objects:
+ self.report({'ERROR'}, "Select at least one mesh object.")
+ return {'CANCELLED'}
+
+ for obj in mesh_objects:
+ # make each selected object a smoke flow
+ bpy.ops.object.modifier_add({"object": obj}, type='SMOKE')
+ obj.modifiers[-1].smoke_type = 'FLOW'
+
+ psys = obj.particle_systems[-1]
+ if self.style == 'PUFF':
+ psys.settings.frame_end = psys.settings.frame_start
+ psys.settings.emit_from = 'VOLUME'
+ psys.settings.distribution = 'RAND'
+ elif self.style == 'FIRE':
+ psys.settings.effector_weights.gravity = -1
+ psys.settings.lifetime = 5
+ psys.settings.count = 100000
+
+ obj.modifiers[-2].flow_settings.initial_velocity = True
+ obj.modifiers[-2].flow_settings.temperature = 2
+
+ psys.settings.use_render_emitter = self.show_flows
+ if not self.show_flows:
+ obj.draw_type = 'WIRE'
+
+ # store bounding box min/max for the domain object
+ obj_bb_minmax(obj, min_co, max_co)
+
+ # add the smoke domain object
+ bpy.ops.mesh.primitive_cube_add()
+ obj = context.active_object
+ obj.name = "Smoke Domain"
+
+ # give the smoke some room above the flows
+ obj.location = 0.5 * (max_co + min_co) + Vector((0.0, 0.0, 1.0))
+ obj.scale = 0.5 * (max_co - min_co) + Vector((1.0, 1.0, 2.0))
+
+ # setup smoke domain
+ bpy.ops.object.modifier_add({"object": obj}, type='SMOKE')
+ obj.modifiers[-1].smoke_type = 'DOMAIN'
+ if self.style == 'FIRE':
+ obj.modifiers[-1].domain_settings.use_dissolve_smoke = True
+ obj.modifiers[-1].domain_settings.dissolve_speed = 20
+ obj.modifiers[-1].domain_settings.use_high_resolution = True
+
+ # create a volume material with a voxel data texture for the domain
+ bpy.ops.object.material_slot_add({"object": obj})
+
+ mat = bpy.data.materials.new("Smoke Domain Material")
+ obj.material_slots[0].material = mat
+ mat.type = 'VOLUME'
+ mat.volume.density = 0
+ mat.volume.density_scale = 5
+
+ mat.texture_slots.add()
+ mat.texture_slots[0].texture = bpy.data.textures.new("Smoke Density", 'VOXEL_DATA')
+ mat.texture_slots[0].texture.voxel_data.domain_object = obj
+ mat.texture_slots[0].use_map_color_emission = False
+ mat.texture_slots[0].use_map_density = True
+
+ # for fire add a second texture for emission and emission color
+ if self.style == 'FIRE':
+ mat.volume.emission = 5
+ mat.texture_slots.add()
+ mat.texture_slots[1].texture = bpy.data.textures.new("Smoke Heat", 'VOXEL_DATA')
+ mat.texture_slots[1].texture.voxel_data.domain_object = obj
+ mat.texture_slots[1].texture.use_color_ramp = True
+
+ ramp = mat.texture_slots[1].texture.color_ramp
+
+ elem = ramp.elements.new(0.333)
+ elem.color[0] = elem.color[3] = 1
+ elem.color[1] = elem.color[2] = 0
+
+ elem = ramp.elements.new(0.666)
+ elem.color[0] = elem.color[1] = elem.color[3] = 1
+ elem.color[2] = 0
+
+ mat.texture_slots[1].use_map_emission = True
+ mat.texture_slots[1].blend_type = 'MULTIPLY'
+
+ return {'FINISHED'}
+
+
+class MakeFluid(bpy.types.Operator):
+ bl_idname = "object.make_fluid"
+ bl_label = "Make Fluid"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ style = EnumProperty(items=(
+ ('INFLOW', "Inflow", ""),
+ ('BASIC', "Basic", "")),
+ name="Fluid Style",
+ description="",
+ default='BASIC')
+
+ initial_velocity = FloatVectorProperty(name="Initial Velocity",
+ description="Initial velocity of the fluid",
+ default=(0.0, 0.0, 0.0), min=-100.0, max=100.0, subtype='VELOCITY')
+
+ show_flows = BoolProperty(name="Render Fluid Objects",
+ description="Keep the fluid objects visible during rendering.",
+ default=False)
+
+ start_baking = BoolProperty(name="Start Fluid Bake",
+ description="Start baking the fluid immediately after creating the domain object.",
+ default=False)
+
+ def execute(self, context):
+ mesh_objects = [obj for obj in context.selected_objects if (obj.type == 'MESH' and not 0 in obj.dimensions)]
+ min_co = Vector((100000, 100000, 100000))
+ max_co = Vector((-100000, -100000, -100000))
+
+ if not mesh_objects:
+ self.report({'ERROR'}, "Select at least one mesh object.")
+ return {'CANCELLED'}
+
+ for obj in mesh_objects:
+ # make each selected object a fluid
+ bpy.ops.object.modifier_add({"object": obj}, type='FLUID_SIMULATION')
+
+ # fluid has to be before constructive modifiers, so it might not be the last modifier
+ for mod in obj.modifiers:
+ if mod.type == 'FLUID_SIMULATION':
+ break
+
+ if self.style == 'INFLOW':
+ mod.settings.type = 'INFLOW'
+ mod.settings.inflow_velocity = self.initial_velocity.copy()
+ else:
+ mod.settings.type = 'FLUID'
+ mod.settings.initial_velocity = self.initial_velocity.copy()
+
+ obj.hide_render = not self.show_flows
+ if not self.show_flows:
+ obj.draw_type = 'WIRE'
+
+ # store bounding box min/max for the domain object
+ obj_bb_minmax(obj, min_co, max_co)
+
+ # add the fluid domain object
+ bpy.ops.mesh.primitive_cube_add()
+ obj = context.active_object
+ obj.name = "Fluid Domain"
+
+ # give the fluid some room below the flows and scale with initial velocity
+ v = 0.5 * self.initial_velocity
+ obj.location = 0.5 * (max_co + min_co) + Vector((0.0, 0.0, -1.0)) + v
+ obj.scale = 0.5 * (max_co - min_co) + Vector((1.0, 1.0, 2.0)) + Vector((abs(v[0]), abs(v[1]), abs(v[2])))
+
+ # setup smoke domain
+ bpy.ops.object.modifier_add({"object": obj}, type='FLUID_SIMULATION')
+ obj.modifiers[-1].settings.type = 'DOMAIN'
+
+ # make the domain smooth so it renders nicely
+ bpy.ops.object.shade_smooth()
+
+ # create a ray-transparent material for the domain
+ bpy.ops.object.material_slot_add({"object": obj})
+
+ mat = bpy.data.materials.new("Fluid Domain Material")
+ obj.material_slots[0].material = mat
+
+ mat.specular_intensity = 1
+ mat.specular_hardness = 100
+ mat.use_transparency = True
+ mat.alpha = 0.0
+ mat.transparency_method = 'RAYTRACE'
+ mat.raytrace_transparency.ior = 1.33
+ mat.raytrace_transparency.depth = 4
+
+ if self.start_baking:
+ bpy.ops.fluid.bake()
+
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/object_randomize_transform.py b/release/scripts/startup/bl_operators/object_randomize_transform.py
new file mode 100644
index 00000000000..9dc5086086f
--- /dev/null
+++ b/release/scripts/startup/bl_operators/object_randomize_transform.py
@@ -0,0 +1,147 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+
+
+def randomize_selected(seed, delta, loc, rot, scale, scale_even):
+
+ import random
+ from random import uniform
+ from mathutils import Vector
+
+ random.seed(seed)
+
+ def rand_vec(vec_range):
+ return Vector(uniform(-val, val) for val in vec_range)
+
+ for obj in bpy.context.selected_objects:
+
+ if loc:
+ if delta:
+ obj.delta_location += rand_vec(loc)
+ else:
+ obj.location += rand_vec(loc)
+ else: # otherwise the values change under us
+ uniform(0.0, 0.0), uniform(0.0, 0.0), uniform(0.0, 0.0)
+
+ if rot: # TODO, non euler's
+ vec = rand_vec(rot)
+ if delta:
+ obj.delta_rotation_euler[0] += vec[0]
+ obj.delta_rotation_euler[1] += vec[1]
+ obj.delta_rotation_euler[2] += vec[2]
+ else:
+ obj.rotation_euler[0] += vec[0]
+ obj.rotation_euler[1] += vec[1]
+ obj.rotation_euler[2] += vec[2]
+ else:
+ uniform(0.0, 0.0), uniform(0.0, 0.0), uniform(0.0, 0.0)
+
+ if scale:
+ if delta:
+ org_sca_x, org_sca_y, org_sca_z = obj.delta_scale
+ else:
+ org_sca_x, org_sca_y, org_sca_z = obj.scale
+
+ if scale_even:
+ sca_x = sca_y = sca_z = uniform(scale[0], - scale[0])
+ uniform(0.0, 0.0), uniform(0.0, 0.0)
+ else:
+ sca_x, sca_y, sca_z = rand_vec(scale)
+
+ if scale_even:
+ aX = -(sca_x * org_sca_x) + org_sca_x
+ aY = -(sca_x * org_sca_y) + org_sca_y
+ aZ = -(sca_x * org_sca_z) + org_sca_z
+ else:
+ aX = sca_x + org_sca_x
+ aY = sca_y + org_sca_y
+ aZ = sca_z + org_sca_z
+
+ if delta:
+ obj.delta_scale = aX, aY, aZ
+ else:
+ obj.scale = aX, aY, aZ
+ else:
+ uniform(0.0, 0.0), uniform(0.0, 0.0), uniform(0.0, 0.0)
+
+
+from bpy.props import IntProperty, BoolProperty, FloatVectorProperty
+
+
+class RandomizeLocRotSize(bpy.types.Operator):
+ '''Randomize objects loc/rot/scale'''
+ bl_idname = "object.randomize_transform"
+ bl_label = "Randomize Transform"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ random_seed = IntProperty(name="Random Seed",
+ description="Seed value for the random generator",
+ default=0, min=0, max=1000)
+
+ use_delta = BoolProperty(name="Transform Delta",
+ description="Randomize delta transform values instead of regular transform", default=False)
+
+ use_loc = BoolProperty(name="Randomize Location",
+ description="Randomize the location values", default=True)
+
+ loc = FloatVectorProperty(name="Location",
+ description="Maximun distance the objects can spread over each axis",
+ default=(0.0, 0.0, 0.0), min=-100.0, max=100.0, subtype='TRANSLATION')
+
+ use_rot = BoolProperty(name="Randomize Rotation",
+ description="Randomize the rotation values", default=True)
+
+ rot = FloatVectorProperty(name="Rotation",
+ description="Maximun rotation over each axis",
+ default=(0.0, 0.0, 0.0), min=-180.0, max=180.0, subtype='TRANSLATION')
+
+ use_scale = BoolProperty(name="Randomize Scale",
+ description="Randomize the scale values", default=True)
+
+ scale_even = BoolProperty(name="Scale Even",
+ description="Use the same scale value for all axis", default=False)
+
+ '''scale_min = FloatProperty(name="Minimun Scale Factor",
+ description="Lowest scale percentage possible",
+ default=0.15, min=-1.0, max=1.0, precision=3)'''
+
+ scale = FloatVectorProperty(name="Scale",
+ description="Maximum scale randomization over each axis",
+ default=(0.0, 0.0, 0.0), min=-100.0, max=100.0, subtype='TRANSLATION')
+
+ def execute(self, context):
+ from math import radians
+
+ seed = self.random_seed
+
+ delta = self.use_delta
+
+ loc = None if not self.use_loc else self.loc
+ rot = None if not self.use_rot else self.rot * radians(1.0)
+ scale = None if not self.use_scale else self.scale
+
+ scale_even = self.scale_even
+ #scale_min = self.scale_min
+
+ randomize_selected(seed, delta, loc, rot, scale, scale_even)
+
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
new file mode 100644
index 00000000000..1cef67dc710
--- /dev/null
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -0,0 +1,352 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+
+
+class AddPresetBase():
+ '''Base preset class, only for subclassing
+ subclasses must define
+ - preset_values
+ - preset_subdir '''
+ # bl_idname = "script.preset_base_add"
+ # bl_label = "Add a Python Preset"
+ bl_options = {'REGISTER'} # only because invoke_props_popup requires.
+
+ name = bpy.props.StringProperty(name="Name", description="Name of the preset, used to make the path name", maxlen=64, default="")
+ remove_active = bpy.props.BoolProperty(default=False, options={'HIDDEN'})
+
+ @staticmethod
+ def as_filename(name): # could reuse for other presets
+ for char in " !@#$%^&*(){}:\";'[]<>,.\\/?":
+ name = name.replace(char, '_')
+ return name.lower().strip()
+
+ def execute(self, context):
+ import os
+
+ if hasattr(self, "pre_cb"):
+ self.pre_cb(context)
+
+ preset_menu_class = getattr(bpy.types, self.preset_menu)
+
+ if not self.remove_active:
+
+ if not self.name:
+ return {'FINISHED'}
+
+ filename = self.as_filename(self.name)
+
+ target_path = bpy.utils.user_resource('SCRIPTS', os.path.join("presets", self.preset_subdir), create=True)
+
+ if not target_path:
+ self.report({'WARNING'}, "Failed to create presets path")
+ return {'CANCELLED'}
+
+ filepath = os.path.join(target_path, filename) + ".py"
+
+ if hasattr(self, "add"):
+ self.add(context, filepath)
+ else:
+ file_preset = open(filepath, 'w')
+ file_preset.write("import bpy\n")
+
+ if hasattr(self, "preset_defines"):
+ for rna_path in self.preset_defines:
+ exec(rna_path)
+ file_preset.write("%s\n" % rna_path)
+ file_preset.write("\n")
+
+ for rna_path in self.preset_values:
+ value = eval(rna_path)
+ # convert thin wrapped sequences to simple lists to repr()
+ try:
+ value = value[:]
+ except:
+ pass
+
+ file_preset.write("%s = %r\n" % (rna_path, value))
+
+ file_preset.close()
+
+ preset_menu_class.bl_label = bpy.path.display_name(filename)
+
+ else:
+ preset_active = preset_menu_class.bl_label
+
+ # fairly sloppy but convenient.
+ filepath = bpy.utils.preset_find(preset_active, self.preset_subdir)
+
+ if not filepath:
+ filepath = bpy.utils.preset_find(preset_active, self.preset_subdir, display_name=True)
+
+ if not filepath:
+ return {'CANCELLED'}
+
+ if hasattr(self, "remove"):
+ self.remove(context, filepath)
+ else:
+ try:
+ os.remove(filepath)
+ except:
+ import traceback
+ traceback.print_exc()
+
+ # XXX, stupid!
+ preset_menu_class.bl_label = "Presets"
+
+ if hasattr(self, "post_cb"):
+ self.post_cb(context)
+
+ return {'FINISHED'}
+
+ def check(self, context):
+ self.name = self.as_filename(self.name)
+
+ def invoke(self, context, event):
+ if not self.remove_active:
+ wm = context.window_manager
+ return wm.invoke_props_dialog(self)
+ else:
+ return self.execute(context)
+
+
+class ExecutePreset(bpy.types.Operator):
+ ''' Executes a preset '''
+ bl_idname = "script.execute_preset"
+ bl_label = "Execute a Python Preset"
+
+ filepath = bpy.props.StringProperty(name="Path", description="Path of the Python file to execute", maxlen=512, default="")
+ menu_idname = bpy.props.StringProperty(name="Menu ID Name", description="ID name of the menu this was called from", default="")
+
+ def execute(self, context):
+ from os.path import basename
+ filepath = self.filepath
+
+ # change the menu title to the most recently chosen option
+ preset_class = getattr(bpy.types, self.menu_idname)
+ preset_class.bl_label = bpy.path.display_name(basename(filepath))
+
+ # execute the preset using script.python_file_run
+ bpy.ops.script.python_file_run(filepath=filepath)
+ return {'FINISHED'}
+
+
+class AddPresetRender(AddPresetBase, bpy.types.Operator):
+ '''Add a Render Preset'''
+ bl_idname = "render.preset_add"
+ bl_label = "Add Render Preset"
+ preset_menu = "RENDER_MT_presets"
+
+ preset_defines = [
+ "scene = bpy.context.scene"
+ ]
+
+ preset_values = [
+ "scene.render.field_order",
+ "scene.render.fps",
+ "scene.render.fps_base",
+ "scene.render.pixel_aspect_x",
+ "scene.render.pixel_aspect_y",
+ "scene.render.resolution_percentage",
+ "scene.render.resolution_x",
+ "scene.render.resolution_y",
+ "scene.render.use_fields",
+ "scene.render.use_fields_still",
+ ]
+
+ preset_subdir = "render"
+
+
+class AddPresetSSS(AddPresetBase, bpy.types.Operator):
+ '''Add a Subsurface Scattering Preset'''
+ bl_idname = "material.sss_preset_add"
+ bl_label = "Add SSS Preset"
+ preset_menu = "MATERIAL_MT_sss_presets"
+
+ preset_defines = [
+ "material = (bpy.context.material.active_node_material if bpy.context.material.active_node_material else bpy.context.material)"
+ ]
+
+ preset_values = [
+ "material.subsurface_scattering.back",
+ "material.subsurface_scattering.color",
+ "material.subsurface_scattering.color_factor",
+ "material.subsurface_scattering.error_threshold",
+ "material.subsurface_scattering.front",
+ "material.subsurface_scattering.ior",
+ "material.subsurface_scattering.radius",
+ "material.subsurface_scattering.scale",
+ "material.subsurface_scattering.texture_factor",
+ ]
+
+ preset_subdir = "sss"
+
+
+class AddPresetCloth(AddPresetBase, bpy.types.Operator):
+ '''Add a Cloth Preset'''
+ bl_idname = "cloth.preset_add"
+ bl_label = "Add Cloth Preset"
+ preset_menu = "CLOTH_MT_presets"
+
+ preset_defines = [
+ "cloth = bpy.context.cloth"
+ ]
+
+ preset_values = [
+ "cloth.settings.air_damping",
+ "cloth.settings.bending_stiffness",
+ "cloth.settings.mass",
+ "cloth.settings.quality",
+ "cloth.settings.spring_damping",
+ "cloth.settings.structural_stiffness",
+ ]
+
+ preset_subdir = "cloth"
+
+
+class AddPresetSunSky(AddPresetBase, bpy.types.Operator):
+ '''Add a Sky & Atmosphere Preset'''
+ bl_idname = "lamp.sunsky_preset_add"
+ bl_label = "Add Sunsky Preset"
+ preset_menu = "LAMP_MT_sunsky_presets"
+
+ preset_defines = [
+ "sky = bpy.context.object.data.sky"
+ ]
+
+ preset_values = [
+ "sky.atmosphere_extinction",
+ "sky.atmosphere_inscattering",
+ "sky.atmosphere_turbidity",
+ "sky.backscattered_light",
+ "sky.horizon_brightness",
+ "sky.spread",
+ "sky.sun_brightness",
+ "sky.sun_intensity",
+ "sky.sun_size",
+ "sky.use_sky_blend",
+ "sky.use_sky_blend_type",
+ "sky.use_sky_color_space",
+ "sky.use_sky_exposure",
+ ]
+
+ preset_subdir = "sunsky"
+
+
+class AddPresetInteraction(AddPresetBase, bpy.types.Operator):
+ '''Add an Application Interaction Preset'''
+ bl_idname = "wm.interaction_preset_add"
+ bl_label = "Add Interaction Preset"
+ preset_menu = "USERPREF_MT_interaction_presets"
+
+ preset_defines = [
+ "user_preferences = bpy.context.user_preferences"
+ ]
+
+ preset_values = [
+ "user_preferences.edit.use_drag_immediately",
+ "user_preferences.edit.use_insertkey_xyz_to_rgb",
+ "user_preferences.inputs.invert_mouse_wheel_zoom",
+ "user_preferences.inputs.select_mouse",
+ "user_preferences.inputs.use_emulate_numpad",
+ "user_preferences.inputs.use_mouse_continuous",
+ "user_preferences.inputs.use_mouse_emulate_3_button",
+ "user_preferences.inputs.view_rotate_method",
+ "user_preferences.inputs.view_zoom_axis",
+ "user_preferences.inputs.view_zoom_method",
+ ]
+
+ preset_subdir = "interaction"
+
+
+class AddPresetKeyconfig(AddPresetBase, bpy.types.Operator):
+ '''Add a Keyconfig Preset'''
+ bl_idname = "wm.keyconfig_preset_add"
+ bl_label = "Add Keyconfig Preset"
+ preset_menu = "USERPREF_MT_keyconfigs"
+ preset_subdir = "keyconfig"
+
+ def add(self, context, filepath):
+ bpy.ops.wm.keyconfig_export(filepath=filepath)
+ bpy.utils.keyconfig_set(filepath)
+
+ def pre_cb(self, context):
+ keyconfigs = bpy.context.window_manager.keyconfigs
+ if self.remove_active:
+ preset_menu_class = getattr(bpy.types, self.preset_menu)
+ preset_menu_class.bl_label = keyconfigs.active.name
+
+ def post_cb(self, context):
+ keyconfigs = bpy.context.window_manager.keyconfigs
+ if self.remove_active:
+ keyconfigs.remove(keyconfigs.active)
+
+
+class AddPresetOperator(AddPresetBase, bpy.types.Operator):
+ '''Add an Application Interaction Preset'''
+ bl_idname = "wm.operator_preset_add"
+ bl_label = "Operator Preset"
+ preset_menu = "WM_MT_operator_presets"
+
+ operator = bpy.props.StringProperty(name="Operator", maxlen=64, options={'HIDDEN'})
+
+ # XXX, not ideal
+ preset_defines = [
+ "op = bpy.context.space_data.operator",
+ ]
+
+ @property
+ def preset_subdir(self):
+ return __class__.operator_path(self.operator)
+
+ @property
+ def preset_values(self):
+ properties_blacklist = bpy.types.Operator.bl_rna.properties.keys()
+
+ prefix, suffix = self.operator.split("_OT_", 1)
+ operator_rna = getattr(getattr(bpy.ops, prefix.lower()), suffix).get_rna().bl_rna
+
+ ret = []
+ for prop_id, prop in operator_rna.properties.items():
+ if (not prop.is_hidden) and prop_id not in properties_blacklist:
+ ret.append("op.%s" % prop_id)
+
+ return ret
+
+ @staticmethod
+ def operator_path(operator):
+ import os
+ prefix, suffix = operator.split("_OT_", 1)
+ return os.path.join("operator", "%s.%s" % (prefix.lower(), suffix))
+
+
+class WM_MT_operator_presets(bpy.types.Menu):
+ bl_label = "Operator Presets"
+
+ def draw(self, context):
+ self.operator = context.space_data.operator.bl_idname
+ bpy.types.Menu.draw_preset(self, context)
+
+ @property
+ def preset_subdir(self):
+ return AddPresetOperator.operator_path(self.operator)
+
+ preset_operator = "script.execute_preset"
diff --git a/release/scripts/startup/bl_operators/screen_play_rendered_anim.py b/release/scripts/startup/bl_operators/screen_play_rendered_anim.py
new file mode 100644
index 00000000000..64af25e7b0f
--- /dev/null
+++ b/release/scripts/startup/bl_operators/screen_play_rendered_anim.py
@@ -0,0 +1,142 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# Script copyright (C) Campbell J Barton
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+
+# <pep8 compliant>
+
+# History
+#
+# Originally written by Matt Ebb
+
+import bpy
+import os
+
+
+def guess_player_path(preset):
+ import sys
+
+ if preset == 'BLENDER24':
+ player_path = "blender"
+
+ if sys.platform == "darwin":
+ test_path = "/Applications/blender 2.49.app/Contents/MacOS/blender"
+ elif sys.platform[:3] == "win":
+ test_path = "/Program Files/Blender Foundation/Blender/blender.exe"
+
+ if os.path.exists(test_path):
+ player_path = test_path
+
+ elif preset == 'DJV':
+ player_path = "djv_view"
+
+ if sys.platform == "darwin":
+ # TODO, crummy supporting only 1 version, could find the newest installed version
+ test_path = '/Applications/djv-0.8.2.app/Contents/Resources/bin/djv_view'
+ if os.path.exists(test_path):
+ player_path = test_path
+
+ elif preset == 'FRAMECYCLER':
+ player_path = "framecycler"
+
+ elif preset == 'RV':
+ player_path = "rv"
+
+ elif preset == 'MPLAYER':
+ player_path = "mplayer"
+
+ return player_path
+
+
+class PlayRenderedAnim(bpy.types.Operator):
+ '''Plays back rendered frames/movies using an external player.'''
+ bl_idname = "render.play_rendered_anim"
+ bl_label = "Play Rendered Animation"
+ bl_options = {'REGISTER'}
+
+ def execute(self, context):
+ import subprocess
+
+ scene = context.scene
+ rd = scene.render
+ prefs = context.user_preferences
+
+ preset = prefs.filepaths.animation_player_preset
+ player_path = prefs.filepaths.animation_player
+ file_path = bpy.path.abspath(rd.filepath)
+ is_movie = rd.is_movie_format
+
+ # try and guess a command line if it doesn't exist
+ if player_path == '':
+ player_path = guess_player_path(preset)
+
+ if is_movie == False and preset in ('FRAMECYCLER', 'RV', 'MPLAYER'):
+ # replace the number with '#'
+ file_a = rd.frame_path(frame=0)
+
+ # TODO, make an api call for this
+ frame_tmp = 9
+ file_b = rd.frame_path(frame=frame_tmp)
+
+ while len(file_a) == len(file_b):
+ frame_tmp = (frame_tmp * 10) + 9
+ print(frame_tmp)
+ file_b = rd.frame_path(frame=frame_tmp)
+ file_b = rd.frame_path(frame=int(frame_tmp / 10))
+
+ file = "".join((c if file_b[i] == c else "#") for i, c in enumerate(file_a))
+ else:
+ # works for movies and images
+ file = rd.frame_path(frame=scene.frame_start)
+
+ file = bpy.path.abspath(file) # expand '//'
+
+ cmd = [player_path]
+ # extra options, fps controls etc.
+ if preset == 'BLENDER24':
+ opts = ["-a", "-f", str(rd.fps), str(rd.fps_base), file]
+ cmd.extend(opts)
+ elif preset == 'DJV':
+ opts = [file, "-playback_speed", str(rd.fps)]
+ cmd.extend(opts)
+ elif preset == 'FRAMECYCLER':
+ opts = [file, "%d-%d" % (scene.frame_start, scene.frame_end)]
+ cmd.extend(opts)
+ elif preset == 'RV':
+ opts = ["-fps", str(rd.fps), "-play", "[ %s ]" % file]
+ cmd.extend(opts)
+ elif preset == 'MPLAYER':
+ opts = []
+ if is_movie:
+ opts.append(file)
+ else:
+ opts.append("mf://%s" % file.replace("#", "?"))
+ opts += ["-mf", "fps=%.4f" % (rd.fps / rd.fps_base)]
+ opts += ["-loop", "0", "-really-quiet", "-fs"]
+ cmd.extend(opts)
+ else: # 'CUSTOM'
+ cmd.append(file)
+
+ # launch it
+ try:
+ process = subprocess.Popen(cmd)
+ except:
+ pass
+ #raise OSError("Couldn't find an external animation player.")
+
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/sequencer.py b/release/scripts/startup/bl_operators/sequencer.py
new file mode 100644
index 00000000000..16b72406c49
--- /dev/null
+++ b/release/scripts/startup/bl_operators/sequencer.py
@@ -0,0 +1,134 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+
+from bpy.props import IntProperty
+
+
+class SequencerCrossfadeSounds(bpy.types.Operator):
+ '''Do crossfading volume animation of two selected sound strips.'''
+
+ bl_idname = "sequencer.crossfade_sounds"
+ bl_label = "Crossfade sounds"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ @classmethod
+ def poll(cls, context):
+ if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip:
+ return context.scene.sequence_editor.active_strip.type == 'SOUND'
+ else:
+ return False
+
+ def execute(self, context):
+ seq1 = None
+ seq2 = None
+ for s in context.scene.sequence_editor.sequences:
+ if s.select and s.type == 'SOUND':
+ if seq1 is None:
+ seq1 = s
+ elif seq2 is None:
+ seq2 = s
+ else:
+ seq2 = None
+ break
+ if seq2 is None:
+ self.report({'ERROR'}, "Select 2 sound strips.")
+ return {'CANCELLED'}
+ if seq1.frame_final_start > seq2.frame_final_start:
+ s = seq1
+ seq1 = seq2
+ seq2 = s
+ if seq1.frame_final_end > seq2.frame_final_start:
+ tempcfra = context.scene.frame_current
+ context.scene.frame_current = seq2.frame_final_start
+ seq1.keyframe_insert('volume')
+ context.scene.frame_current = seq1.frame_final_end
+ seq1.volume = 0
+ seq1.keyframe_insert('volume')
+ seq2.keyframe_insert('volume')
+ context.scene.frame_current = seq2.frame_final_start
+ seq2.volume = 0
+ seq2.keyframe_insert('volume')
+ context.scene.frame_current = tempcfra
+ return {'FINISHED'}
+ else:
+ self.report({'ERROR'}, "The selected strips don't overlap.")
+ return {'CANCELLED'}
+
+
+class SequencerCutMulticam(bpy.types.Operator):
+ '''Cut multicam strip and select camera.'''
+
+ bl_idname = "sequencer.cut_multicam"
+ bl_label = "Cut multicam"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ camera = IntProperty(name="Camera",
+ default=1, min=1, max=32, soft_min=1, soft_max=32)
+
+ @classmethod
+ def poll(cls, context):
+ if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip:
+ return context.scene.sequence_editor.active_strip.type == 'MULTICAM'
+ else:
+ return False
+
+ def execute(self, context):
+ camera = self.camera
+
+ s = context.scene.sequence_editor.active_strip
+
+ if s.multicam_source == camera or camera >= s.channel:
+ return {'FINISHED'}
+
+ if not s.select:
+ s.select = True
+
+ cfra = context.scene.frame_current
+ bpy.ops.sequencer.cut(frame=cfra, type='SOFT', side='RIGHT')
+ for s in context.scene.sequence_editor.sequences_all:
+ if s.select and s.type == 'MULTICAM' and s.frame_final_start <= cfra and cfra < s.frame_final_end:
+ context.scene.sequence_editor.active_strip = s
+
+ context.scene.sequence_editor.active_strip.multicam_source = camera
+ return {'FINISHED'}
+
+
+class SequencerDeinterlaceSelectedMovies(bpy.types.Operator):
+ '''Deinterlace all selected movie sources.'''
+
+ bl_idname = "sequencer.deinterlace_selected_movies"
+ bl_label = "Deinterlace Movies"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ @classmethod
+ def poll(cls, context):
+ if context.scene and context.scene.sequence_editor:
+ return True
+ else:
+ return False
+
+ def execute(self, context):
+ for s in context.scene.sequence_editor.sequences_all:
+ if s.select and s.type == 'MOVIE':
+ s.use_deinterlace = True
+
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/uvcalc_follow_active.py b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
new file mode 100644
index 00000000000..ad5ec15ff80
--- /dev/null
+++ b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
@@ -0,0 +1,250 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+#for full docs see...
+# http://mediawiki.blender.org/index.php/Scripts/Manual/UV_Calculate/Follow_active_quads
+
+import bpy
+
+
+def extend(obj, operator, EXTEND_MODE):
+ me = obj.data
+ me_verts = me.vertices
+ # script will fail without UVs
+ if not me.uv_textures:
+ me.uv_textures.new()
+
+ # Toggle Edit mode
+ is_editmode = (obj.mode == 'EDIT')
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='OBJECT')
+
+ #t = sys.time()
+ edge_average_lengths = {}
+
+ OTHER_INDEX = 2, 3, 0, 1
+ FAST_INDICIES = 0, 2, 1, 3 # order is faster
+
+ def extend_uvs(face_source, face_target, edge_key):
+ '''
+ Takes 2 faces,
+ Projects its extends its UV coords onto the face next to it.
+ Both faces must share an edge
+ '''
+
+ def face_edge_vs(vi):
+ # assume a quad
+ return [(vi[0], vi[1]), (vi[1], vi[2]), (vi[2], vi[3]), (vi[3], vi[0])]
+
+ vidx_source = face_source.vertices
+ vidx_target = face_target.vertices
+
+ faceUVsource = me.uv_textures.active.data[face_source.index]
+ uvs_source = [faceUVsource.uv1, faceUVsource.uv2, faceUVsource.uv3, faceUVsource.uv4]
+
+ faceUVtarget = me.uv_textures.active.data[face_target.index]
+ uvs_target = [faceUVtarget.uv1, faceUVtarget.uv2, faceUVtarget.uv3, faceUVtarget.uv4]
+
+ # vertex index is the key, uv is the value
+
+ uvs_vhash_source = {vindex: uvs_source[i] for i, vindex in enumerate(vidx_source)}
+
+ uvs_vhash_target = {vindex: uvs_target[i] for i, vindex in enumerate(vidx_target)}
+
+ edge_idxs_source = face_edge_vs(vidx_source)
+ edge_idxs_target = face_edge_vs(vidx_target)
+
+ source_matching_edge = -1
+ target_matching_edge = -1
+
+ edge_key_swap = edge_key[1], edge_key[0]
+
+ try:
+ source_matching_edge = edge_idxs_source.index(edge_key)
+ except:
+ source_matching_edge = edge_idxs_source.index(edge_key_swap)
+ try:
+ target_matching_edge = edge_idxs_target.index(edge_key)
+ except:
+ target_matching_edge = edge_idxs_target.index(edge_key_swap)
+
+ edgepair_inner_source = edge_idxs_source[source_matching_edge]
+ edgepair_inner_target = edge_idxs_target[target_matching_edge]
+ edgepair_outer_source = edge_idxs_source[OTHER_INDEX[source_matching_edge]]
+ edgepair_outer_target = edge_idxs_target[OTHER_INDEX[target_matching_edge]]
+
+ if edge_idxs_source[source_matching_edge] == edge_idxs_target[target_matching_edge]:
+ iA = 0 # Flipped, most common
+ iB = 1
+ else: # The normals of these faces must be different
+ iA = 1
+ iB = 0
+
+ # Set the target UV's touching source face, no tricky calc needed,
+ uvs_vhash_target[edgepair_inner_target[0]][:] = uvs_vhash_source[edgepair_inner_source[iA]]
+ uvs_vhash_target[edgepair_inner_target[1]][:] = uvs_vhash_source[edgepair_inner_source[iB]]
+
+ # Set the 2 UV's on the target face that are not touching
+ # for this we need to do basic expaning on the source faces UV's
+ if EXTEND_MODE == 'LENGTH':
+
+ try: # divide by zero is possible
+ '''
+ measure the length of each face from the middle of each edge to the opposite
+ allong the axis we are copying, use this
+ '''
+ i1a = edgepair_outer_target[iB]
+ i2a = edgepair_inner_target[iA]
+ if i1a > i2a:
+ i1a, i2a = i2a, i1a
+
+ i1b = edgepair_outer_source[iB]
+ i2b = edgepair_inner_source[iA]
+ if i1b > i2b:
+ i1b, i2b = i2b, i1b
+ # print edge_average_lengths
+ factor = edge_average_lengths[i1a, i2a][0] / edge_average_lengths[i1b, i2b][0]
+ except:
+ # Div By Zero?
+ factor = 1.0
+
+ uvs_vhash_target[edgepair_outer_target[iB]][:] = uvs_vhash_source[edgepair_inner_source[0]] + factor * (uvs_vhash_source[edgepair_inner_source[0]] - uvs_vhash_source[edgepair_outer_source[1]])
+ uvs_vhash_target[edgepair_outer_target[iA]][:] = uvs_vhash_source[edgepair_inner_source[1]] + factor * (uvs_vhash_source[edgepair_inner_source[1]] - uvs_vhash_source[edgepair_outer_source[0]])
+
+ else:
+ # same as above but with no factors
+ uvs_vhash_target[edgepair_outer_target[iB]][:] = uvs_vhash_source[edgepair_inner_source[0]] + (uvs_vhash_source[edgepair_inner_source[0]] - uvs_vhash_source[edgepair_outer_source[1]])
+ uvs_vhash_target[edgepair_outer_target[iA]][:] = uvs_vhash_source[edgepair_inner_source[1]] + (uvs_vhash_source[edgepair_inner_source[1]] - uvs_vhash_source[edgepair_outer_source[0]])
+
+ if not me.uv_textures:
+ me.uv_textures.new()
+
+ face_act = me.faces.active
+ if face_act == -1:
+ operator.report({'ERROR'}, "No active face.")
+ return
+
+ face_sel = [f for f in me.faces if len(f.vertices) == 4 and f.select]
+
+ face_act_local_index = -1
+ for i, f in enumerate(face_sel):
+ if f.index == face_act:
+ face_act_local_index = i
+ break
+
+ if face_act_local_index == -1:
+ operator.report({'ERROR'}, "Active face not selected.")
+ return
+
+ # Modes
+ # 0 unsearched
+ # 1:mapped, use search from this face. - removed!!
+ # 2:all siblings have been searched. dont search again.
+ face_modes = [0] * len(face_sel)
+ face_modes[face_act_local_index] = 1 # extend UV's from this face.
+
+ # Edge connectivty
+ edge_faces = {}
+ for i, f in enumerate(face_sel):
+ for edkey in f.edge_keys:
+ try:
+ edge_faces[edkey].append(i)
+ except:
+ edge_faces[edkey] = [i]
+
+ if EXTEND_MODE == 'LENGTH':
+ edge_loops = me.edge_loops_from_faces(face_sel, [ed.key for ed in me.edges if ed.use_seam])
+ me_verts = me.vertices
+ for loop in edge_loops:
+ looplen = [0.0]
+ for ed in loop:
+ edge_average_lengths[ed] = looplen
+ looplen[0] += (me_verts[ed[0]].co - me_verts[ed[1]].co).length
+ looplen[0] = looplen[0] / len(loop)
+
+ # remove seams, so we dont map accross seams.
+ for ed in me.edges:
+ if ed.use_seam:
+ # remove the edge pair if we can
+ try:
+ del edge_faces[ed.key]
+ except:
+ pass
+ # Done finding seams
+
+ # face connectivity - faces around each face
+ # only store a list of indices for each face.
+ face_faces = [[] for i in range(len(face_sel))]
+
+ for edge_key, faces in edge_faces.items():
+ if len(faces) == 2: # Only do edges with 2 face users for now
+ face_faces[faces[0]].append((faces[1], edge_key))
+ face_faces[faces[1]].append((faces[0], edge_key))
+
+ # Now we know what face is connected to what other face, map them by connectivity
+ ok = True
+ while ok:
+ ok = False
+ for i in range(len(face_sel)):
+ if face_modes[i] == 1: # searchable
+ for f_sibling, edge_key in face_faces[i]:
+ if face_modes[f_sibling] == 0:
+ face_modes[f_sibling] = 1 # mapped and search from.
+ extend_uvs(face_sel[i], face_sel[f_sibling], edge_key)
+ face_modes[i] = 1 # we can map from this one now.
+ ok = True # keep searching
+
+ face_modes[i] = 2 # dont search again
+
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='EDIT')
+ else:
+ me.update_tag()
+
+
+def main(context, operator):
+ obj = context.active_object
+
+ extend(obj, operator, operator.properties.mode)
+
+
+class FollowActiveQuads(bpy.types.Operator):
+ '''Follow UVs from active quads along continuous face loops'''
+ bl_idname = "uv.follow_active_quads"
+ bl_label = "Follow Active Quads"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ mode = bpy.props.EnumProperty(items=(("EVEN", "Even", "Space all UVs evently"), ("LENGTH", "Length", "Average space UVs edge length of each loop")),
+ name="Edge Length Mode",
+ description="Method to space UV edge loops",
+ default="LENGTH")
+
+ @classmethod
+ def poll(cls, context):
+ obj = context.active_object
+ return (obj is not None and obj.type == 'MESH')
+
+ def execute(self, context):
+ main(context, self)
+ return {'FINISHED'}
+
+ def invoke(self, context, event):
+ wm = context.window_manager
+ return wm.invoke_props_dialog(self)
diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
new file mode 100644
index 00000000000..3893612437a
--- /dev/null
+++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
@@ -0,0 +1,582 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+import mathutils
+
+
+class prettyface(object):
+ __slots__ = "uv", "width", "height", "children", "xoff", "yoff", "has_parent", "rot"
+
+ def __init__(self, data):
+ self.has_parent = False
+ self.rot = False # only used for triables
+ self.xoff = 0
+ self.yoff = 0
+
+ if type(data) == list: # list of data
+ self.uv = None
+
+ # join the data
+ if len(data) == 2:
+ # 2 vertical blocks
+ data[1].xoff = data[0].width
+ self.width = data[0].width * 2
+ self.height = data[0].height
+
+ elif len(data) == 4:
+ # 4 blocks all the same size
+ d = data[0].width # dimension x/y are the same
+
+ data[1].xoff += d
+ data[2].yoff += d
+
+ data[3].xoff += d
+ data[3].yoff += d
+
+ self.width = self.height = d * 2
+
+ #else:
+ # print(len(data), data)
+ # raise "Error"
+
+ for pf in data:
+ pf.has_parent = True
+
+ self.children = data
+
+ elif type(data) == tuple:
+ # 2 blender faces
+ # f, (len_min, len_mid, len_max)
+ self.uv = data
+
+ f1, lens1, lens1ord = data[0]
+ if data[1]:
+ f2, lens2, lens2ord = data[1]
+ self.width = (lens1[lens1ord[0]] + lens2[lens2ord[0]]) / 2.0
+ self.height = (lens1[lens1ord[1]] + lens2[lens2ord[1]]) / 2.0
+ else: # 1 tri :/
+ self.width = lens1[0]
+ self.height = lens1[1]
+
+ self.children = []
+
+ else: # blender face
+ # self.uv = data.uv
+ self.uv = data.id_data.uv_textures.active.data[data.index].uv # XXX25
+
+ # cos = [v.co for v in data]
+ cos = [data.id_data.vertices[v].co for v in data.vertices] # XXX25
+
+ self.width = ((cos[0] - cos[1]).length + (cos[2] - cos[3]).length) / 2.0
+ self.height = ((cos[1] - cos[2]).length + (cos[0] - cos[3]).length) / 2.0
+
+ self.children = []
+
+ def spin(self):
+ if self.uv and len(self.uv) == 4:
+ self.uv = self.uv[1], self.uv[2], self.uv[3], self.uv[0]
+
+ self.width, self.height = self.height, self.width
+ self.xoff, self.yoff = self.yoff, self.xoff # not needed?
+ self.rot = not self.rot # only for tri pairs.
+ # print("spinning")
+ for pf in self.children:
+ pf.spin()
+
+ def place(self, xoff, yoff, xfac, yfac, margin_w, margin_h):
+ from math import pi
+
+ xoff += self.xoff
+ yoff += self.yoff
+
+ for pf in self.children:
+ pf.place(xoff, yoff, xfac, yfac, margin_w, margin_h)
+
+ uv = self.uv
+ if not uv:
+ return
+
+ x1 = xoff
+ y1 = yoff
+ x2 = xoff + self.width
+ y2 = yoff + self.height
+
+ # Scale the values
+ x1 = x1 / xfac + margin_w
+ x2 = x2 / xfac - margin_w
+ y1 = y1 / yfac + margin_h
+ y2 = y2 / yfac - margin_h
+
+ # 2 Tri pairs
+ if len(uv) == 2:
+ # match the order of angle sizes of the 3d verts with the UV angles and rotate.
+ def get_tri_angles(v1, v2, v3):
+ a1 = (v2 - v1).angle(v3 - v1, pi)
+ a2 = (v1 - v2).angle(v3 - v2, pi)
+ a3 = pi - (a1 + a2) # a3= (v2 - v3).angle(v1 - v3)
+
+ return [(a1, 0), (a2, 1), (a3, 2)]
+
+ def set_uv(f, p1, p2, p3):
+
+ # cos =
+ #v1 = cos[0]-cos[1]
+ #v2 = cos[1]-cos[2]
+ #v3 = cos[2]-cos[0]
+
+ # angles_co = get_tri_angles(*[v.co for v in f])
+ angles_co = get_tri_angles(*[f.id_data.vertices[v].co for v in f.vertices]) # XXX25
+
+ angles_co.sort()
+ I = [i for a, i in angles_co]
+
+ # fuv = f.uv
+ fuv = f.id_data.uv_textures.active.data[f.index].uv # XXX25
+
+ if self.rot:
+ fuv[I[2]] = p1
+ fuv[I[1]] = p2
+ fuv[I[0]] = p3
+ else:
+ fuv[I[2]] = p1
+ fuv[I[0]] = p2
+ fuv[I[1]] = p3
+
+ f, lens, lensord = uv[0]
+
+ set_uv(f, (x1, y1), (x1, y2 - margin_h), (x2 - margin_w, y1))
+
+ if uv[1]:
+ f, lens, lensord = uv[1]
+ set_uv(f, (x2, y2), (x2, y1 + margin_h), (x1 + margin_w, y2))
+
+ else: # 1 QUAD
+ uv[1][0], uv[1][1] = x1, y1
+ uv[2][0], uv[2][1] = x1, y2
+ uv[3][0], uv[3][1] = x2, y2
+ uv[0][0], uv[0][1] = x2, y1
+
+ def __hash__(self):
+ # None unique hash
+ return self.width, self.height
+
+
+def lightmap_uvpack(meshes,
+ PREF_SEL_ONLY=True,
+ PREF_NEW_UVLAYER=False,
+ PREF_PACK_IN_ONE=False,
+ PREF_APPLY_IMAGE=False,
+ PREF_IMG_PX_SIZE=512,
+ PREF_BOX_DIV=8,
+ PREF_MARGIN_DIV=512
+ ):
+ '''
+ BOX_DIV if the maximum division of the UV map that
+ a box may be consolidated into.
+ Basicly, a lower value will be slower but waist less space
+ and a higher value will have more clumpy boxes but more waisted space
+ '''
+ import time
+ from math import sqrt
+
+ if not meshes:
+ return
+
+ t = time.time()
+
+ if PREF_PACK_IN_ONE:
+ if PREF_APPLY_IMAGE:
+ image = bpy.data.images.new(name="lightmap", width=PREF_IMG_PX_SIZE, height=PREF_IMG_PX_SIZE, alpha=False)
+ face_groups = [[]]
+ else:
+ face_groups = []
+
+ for me in meshes:
+ # Add face UV if it does not exist.
+ # All new faces are selected.
+ if not me.uv_textures:
+ me.uv_textures.new()
+
+ if PREF_SEL_ONLY:
+ faces = [f for f in me.faces if f.select]
+ else:
+ faces = me.faces[:]
+
+ if PREF_PACK_IN_ONE:
+ face_groups[0].extend(faces)
+ else:
+ face_groups.append(faces)
+
+ if PREF_NEW_UVLAYER:
+ me.uv_textures.new()
+
+ for face_sel in face_groups:
+ print("\nStarting unwrap")
+
+ if len(face_sel) < 4:
+ print("\tWarning, less then 4 faces, skipping")
+ continue
+
+ pretty_faces = [prettyface(f) for f in face_sel if len(f.vertices) == 4]
+
+ # Do we have any tri's
+ if len(pretty_faces) != len(face_sel):
+
+ # Now add tri's, not so simple because we need to pair them up.
+ def trylens(f):
+ # f must be a tri
+
+ # cos = [v.co for v in f]
+ cos = [f.id_data.vertices[v].co for v in f.vertices] # XXX25
+
+ lens = [(cos[0] - cos[1]).length, (cos[1] - cos[2]).length, (cos[2] - cos[0]).length]
+
+ lens_min = lens.index(min(lens))
+ lens_max = lens.index(max(lens))
+ for i in range(3):
+ if i != lens_min and i != lens_max:
+ lens_mid = i
+ break
+ lens_order = lens_min, lens_mid, lens_max
+
+ return f, lens, lens_order
+
+ tri_lengths = [trylens(f) for f in face_sel if len(f.vertices) == 3]
+ del trylens
+
+ def trilensdiff(t1, t2):
+ return\
+ abs(t1[1][t1[2][0]] - t2[1][t2[2][0]]) + \
+ abs(t1[1][t1[2][1]] - t2[1][t2[2][1]]) + \
+ abs(t1[1][t1[2][2]] - t2[1][t2[2][2]])
+
+ while tri_lengths:
+ tri1 = tri_lengths.pop()
+
+ if not tri_lengths:
+ pretty_faces.append(prettyface((tri1, None)))
+ break
+
+ best_tri_index = -1
+ best_tri_diff = 100000000.0
+
+ for i, tri2 in enumerate(tri_lengths):
+ diff = trilensdiff(tri1, tri2)
+ if diff < best_tri_diff:
+ best_tri_index = i
+ best_tri_diff = diff
+
+ pretty_faces.append(prettyface((tri1, tri_lengths.pop(best_tri_index))))
+
+ # Get the min, max and total areas
+ max_area = 0.0
+ min_area = 100000000.0
+ tot_area = 0
+ for f in face_sel:
+ area = f.area
+ if area > max_area:
+ max_area = area
+ if area < min_area:
+ min_area = area
+ tot_area += area
+
+ max_len = sqrt(max_area)
+ min_len = sqrt(min_area)
+ side_len = sqrt(tot_area)
+
+ # Build widths
+
+ curr_len = max_len
+
+ print("\tGenerating lengths...", end="")
+
+ lengths = []
+ while curr_len > min_len:
+ lengths.append(curr_len)
+ curr_len = curr_len / 2.0
+
+ # Dont allow boxes smaller then the margin
+ # since we contract on the margin, boxes that are smaller will create errors
+ # print(curr_len, side_len/MARGIN_DIV)
+ if curr_len / 4.0 < side_len / PREF_MARGIN_DIV:
+ break
+
+ if not lengths:
+ lengths.append(curr_len)
+
+ # convert into ints
+ lengths_to_ints = {}
+
+ l_int = 1
+ for l in reversed(lengths):
+ lengths_to_ints[l] = l_int
+ l_int *= 2
+
+ lengths_to_ints = list(lengths_to_ints.items())
+ lengths_to_ints.sort()
+ print("done")
+
+ # apply quantized values.
+
+ for pf in pretty_faces:
+ w = pf.width
+ h = pf.height
+ bestw_diff = 1000000000.0
+ besth_diff = 1000000000.0
+ new_w = 0.0
+ new_h = 0.0
+ for l, i in lengths_to_ints:
+ d = abs(l - w)
+ if d < bestw_diff:
+ bestw_diff = d
+ new_w = i # assign the int version
+
+ d = abs(l - h)
+ if d < besth_diff:
+ besth_diff = d
+ new_h = i # ditto
+
+ pf.width = new_w
+ pf.height = new_h
+
+ if new_w > new_h:
+ pf.spin()
+
+ print("...done")
+
+ # Since the boxes are sized in powers of 2, we can neatly group them into bigger squares
+ # this is done hierarchily, so that we may avoid running the pack function
+ # on many thousands of boxes, (under 1k is best) because it would get slow.
+ # Using an off and even dict us usefull because they are packed differently
+ # where w/h are the same, their packed in groups of 4
+ # where they are different they are packed in pairs
+ #
+ # After this is done an external pack func is done that packs the whole group.
+
+ print("\tConsolidating Boxes...", end="")
+ even_dict = {} # w/h are the same, the key is an int (w)
+ odd_dict = {} # w/h are different, the key is the (w,h)
+
+ for pf in pretty_faces:
+ w, h = pf.width, pf.height
+ if w == h:
+ even_dict.setdefault(w, []).append(pf)
+ else:
+ odd_dict.setdefault((w, h), []).append(pf)
+
+ # Count the number of boxes consolidated, only used for stats.
+ c = 0
+
+ # This is tricky. the total area of all packed boxes, then squt that to get an estimated size
+ # this is used then converted into out INT space so we can compare it with
+ # the ints assigned to the boxes size
+ # and divided by BOX_DIV, basicly if BOX_DIV is 8
+ # ...then the maximum box consolidataion (recursive grouping) will have a max width & height
+ # ...1/8th of the UV size.
+ # ...limiting this is needed or you end up with bug unused texture spaces
+ # ...however if its too high, boxpacking is way too slow for high poly meshes.
+ float_to_int_factor = lengths_to_ints[0][0]
+ if float_to_int_factor > 0:
+ max_int_dimension = int(((side_len / float_to_int_factor)) / PREF_BOX_DIV)
+ ok = True
+ else:
+ max_int_dimension = 0.0 # wont be used
+ ok = False
+
+ # RECURSIVE prettyface grouping
+ while ok:
+ ok = False
+
+ # Tall boxes in groups of 2
+ for d, boxes in odd_dict.items():
+ if d[1] < max_int_dimension:
+ #\boxes.sort(key = lambda a: len(a.children))
+ while len(boxes) >= 2:
+ # print("foo", len(boxes))
+ ok = True
+ c += 1
+ pf_parent = prettyface([boxes.pop(), boxes.pop()])
+ pretty_faces.append(pf_parent)
+
+ w, h = pf_parent.width, pf_parent.height
+
+ if w > h:
+ raise "error"
+
+ if w == h:
+ even_dict.setdefault(w, []).append(pf_parent)
+ else:
+ odd_dict.setdefault((w, h), []).append(pf_parent)
+
+ # Even boxes in groups of 4
+ for d, boxes in even_dict.items():
+ if d < max_int_dimension:
+ boxes.sort(key=lambda a: len(a.children))
+
+ while len(boxes) >= 4:
+ # print("bar", len(boxes))
+ ok = True
+ c += 1
+
+ pf_parent = prettyface([boxes.pop(), boxes.pop(), boxes.pop(), boxes.pop()])
+ pretty_faces.append(pf_parent)
+ w = pf_parent.width # width and weight are the same
+ even_dict.setdefault(w, []).append(pf_parent)
+
+ del even_dict
+ del odd_dict
+
+ orig = len(pretty_faces)
+
+ pretty_faces = [pf for pf in pretty_faces if not pf.has_parent]
+
+ # spin every second prettyface
+ # if there all vertical you get less efficiently used texture space
+ i = len(pretty_faces)
+ d = 0
+ while i:
+ i -= 1
+ pf = pretty_faces[i]
+ if pf.width != pf.height:
+ d += 1
+ if d % 2: # only pack every second
+ pf.spin()
+ # pass
+
+ print("Consolidated", c, "boxes, done")
+ # print("done", orig, len(pretty_faces))
+
+ # boxes2Pack.append([islandIdx, w,h])
+ print("\tPacking Boxes", len(pretty_faces), end="...")
+ boxes2Pack = [[0.0, 0.0, pf.width, pf.height, i] for i, pf in enumerate(pretty_faces)]
+ packWidth, packHeight = mathutils.geometry.box_pack_2d(boxes2Pack)
+
+ # print(packWidth, packHeight)
+
+ packWidth = float(packWidth)
+ packHeight = float(packHeight)
+
+ margin_w = ((packWidth) / PREF_MARGIN_DIV) / packWidth
+ margin_h = ((packHeight) / PREF_MARGIN_DIV) / packHeight
+
+ # print(margin_w, margin_h)
+ print("done")
+
+ # Apply the boxes back to the UV coords.
+ print("\twriting back UVs", end="")
+ for i, box in enumerate(boxes2Pack):
+ pretty_faces[i].place(box[0], box[1], packWidth, packHeight, margin_w, margin_h)
+ # pf.place(box[1][1], box[1][2], packWidth, packHeight, margin_w, margin_h)
+ print("done")
+
+ if PREF_APPLY_IMAGE:
+ if not PREF_PACK_IN_ONE:
+ image = Image.New("lightmap", PREF_IMG_PX_SIZE, PREF_IMG_PX_SIZE, 24)
+
+ for f in face_sel:
+ # f.image = image
+ f.id_data.uv_textures.active.data[f.index].image = image # XXX25
+
+ for me in meshes:
+ me.update()
+
+ print("finished all %.2f " % (time.time() - t))
+
+ # Window.RedrawAll()
+
+
+def unwrap(operator, context, **kwargs):
+
+ is_editmode = (bpy.context.object.mode == 'EDIT')
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
+
+ PREF_ACT_ONLY = kwargs.pop("PREF_ACT_ONLY")
+
+ meshes = []
+ if PREF_ACT_ONLY:
+ obj = context.scene.objects.active
+ if obj and obj.type == 'MESH':
+ meshes = [obj.data]
+ else:
+ meshes = {me.name: me for obj in context.selected_objects if obj.type == 'MESH' for me in (obj.data,) if not me.library if len(me.faces)}.values()
+
+ if not meshes:
+ operator.report({'ERROR'}, "No mesh object.")
+ return {'CANCELLED'}
+
+ lightmap_uvpack(meshes, **kwargs)
+
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='EDIT', toggle=False)
+
+ return {'FINISHED'}
+
+from bpy.props import BoolProperty, FloatProperty, IntProperty, EnumProperty
+
+
+class LightMapPack(bpy.types.Operator):
+ '''Follow UVs from active quads along continuous face loops'''
+ bl_idname = "uv.lightmap_pack"
+ bl_label = "Lightmap Pack"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ PREF_CONTEXT = bpy.props.EnumProperty(
+ items=(("SEL_FACES", "Selected Faces", "Space all UVs evently"),
+ ("ALL_FACES", "All Faces", "Average space UVs edge length of each loop"),
+ ("ALL_OBJECTS", "Selected Mesh Object", "Average space UVs edge length of each loop")
+ ),
+ name="Selection",
+ description="")
+
+ # Image & UVs...
+ PREF_PACK_IN_ONE = BoolProperty(name="Share Tex Space", default=True, description="Objects Share texture space, map all objects into 1 uvmap")
+ PREF_NEW_UVLAYER = BoolProperty(name="New UV Layer", default=False, description="Create a new UV layer for every mesh packed")
+ PREF_APPLY_IMAGE = BoolProperty(name="New Image", default=False, description="Assign new images for every mesh (only one if shared tex space enabled)")
+ PREF_IMG_PX_SIZE = IntProperty(name="Image Size", min=64, max=5000, default=512, description="Width and Height for the new image")
+
+ # UV Packing...
+ PREF_BOX_DIV = IntProperty(name="Pack Quality", min=1, max=48, default=12, description="Pre Packing before the complex boxpack")
+ PREF_MARGIN_DIV = FloatProperty(name="Margin", min=0.001, max=1.0, default=0.1, description="Size of the margin as a division of the UV")
+
+ def execute(self, context):
+ kwargs = self.as_keywords()
+ PREF_CONTEXT = kwargs.pop("PREF_CONTEXT")
+
+ if PREF_CONTEXT == 'SEL_FACES':
+ kwargs["PREF_ACT_ONLY"] = True
+ kwargs["PREF_SEL_ONLY"] = True
+ elif PREF_CONTEXT == 'ALL_FACES':
+ kwargs["PREF_ACT_ONLY"] = True
+ kwargs["PREF_SEL_ONLY"] = False
+ elif PREF_CONTEXT == 'ALL_OBJECTS':
+ kwargs["PREF_ACT_ONLY"] = False
+ kwargs["PREF_SEL_ONLY"] = False
+ else:
+ raise Exception("invalid context")
+
+ kwargs["PREF_MARGIN_DIV"] = int(1.0 / (kwargs["PREF_MARGIN_DIV"] / 100.0))
+
+ return unwrap(self, context, **kwargs)
+
+ def invoke(self, context, event):
+ wm = context.window_manager
+ return wm.invoke_props_dialog(self)
diff --git a/release/scripts/startup/bl_operators/uvcalc_smart_project.py b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
new file mode 100644
index 00000000000..4f5b1d8b233
--- /dev/null
+++ b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
@@ -0,0 +1,1141 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+from mathutils import Matrix, Vector, geometry
+import bpy
+
+DEG_TO_RAD = 0.017453292519943295 # pi/180.0
+SMALL_NUM = 0.000000001
+BIG_NUM = 1e15
+
+global USER_FILL_HOLES
+global USER_FILL_HOLES_QUALITY
+USER_FILL_HOLES = None
+USER_FILL_HOLES_QUALITY = None
+
+def pointInTri2D(v, v1, v2, v3):
+ key = v1.x, v1.y, v2.x, v2.y, v3.x, v3.y
+
+ # Commented because its slower to do the bounds check, we should realy cache the bounds info for each face.
+ '''
+ # BOUNDS CHECK
+ xmin= 1000000
+ ymin= 1000000
+
+ xmax= -1000000
+ ymax= -1000000
+
+ for i in (0,2,4):
+ x= key[i]
+ y= key[i+1]
+
+ if xmax<x: xmax= x
+ if ymax<y: ymax= y
+ if xmin>x: xmin= x
+ if ymin>y: ymin= y
+
+ x= v.x
+ y= v.y
+
+ if x<xmin or x>xmax or y < ymin or y > ymax:
+ return False
+ # Done with bounds check
+ '''
+ try:
+ mtx = dict_matrix[key]
+ if not mtx:
+ return False
+ except:
+ side1 = v2 - v1
+ side2 = v3 - v1
+
+ nor = side1.cross(side2)
+
+ mtx = Matrix((side1, side2, nor))
+
+ # Zero area 2d tri, even tho we throw away zerop area faces
+ # the projection UV can result in a zero area UV.
+ if not mtx.determinant():
+ dict_matrix[key] = None
+ return False
+
+ mtx.invert()
+
+ dict_matrix[key] = mtx
+
+ uvw = (v - v1) * mtx
+ return 0 <= uvw[0] and 0 <= uvw[1] and uvw[0] + uvw[1] <= 1
+
+
+def boundsIsland(faces):
+ minx = maxx = faces[0].uv[0][0] # Set initial bounds.
+ miny = maxy = faces[0].uv[0][1]
+ # print len(faces), minx, maxx, miny , maxy
+ for f in faces:
+ for uv in f.uv:
+ x= uv.x
+ y= uv.y
+ if x<minx: minx= x
+ if y<miny: miny= y
+ if x>maxx: maxx= x
+ if y>maxy: maxy= y
+
+ return minx, miny, maxx, maxy
+
+"""
+def boundsEdgeLoop(edges):
+ minx = maxx = edges[0][0] # Set initial bounds.
+ miny = maxy = edges[0][1]
+ # print len(faces), minx, maxx, miny , maxy
+ for ed in edges:
+ for pt in ed:
+ print 'ass'
+ x= pt[0]
+ y= pt[1]
+ if x<minx: x= minx
+ if y<miny: y= miny
+ if x>maxx: x= maxx
+ if y>maxy: y= maxy
+
+ return minx, miny, maxx, maxy
+"""
+
+# Turns the islands into a list of unpordered edges (Non internal)
+# Onlt for UV's
+# only returns outline edges for intersection tests. and unique points.
+
+def island2Edge(island):
+
+ # Vert index edges
+ edges = {}
+
+ unique_points= {}
+
+ for f in island:
+ f_uvkey= map(tuple, f.uv)
+
+
+ for vIdx, edkey in enumerate(f.edge_keys):
+ unique_points[f_uvkey[vIdx]] = f.uv[vIdx]
+
+ if f.v[vIdx].index > f.v[vIdx-1].index:
+ i1= vIdx-1; i2= vIdx
+ else:
+ i1= vIdx; i2= vIdx-1
+
+ try: edges[ f_uvkey[i1], f_uvkey[i2] ] *= 0 # sets eny edge with more then 1 user to 0 are not returned.
+ except: edges[ f_uvkey[i1], f_uvkey[i2] ] = (f.uv[i1] - f.uv[i2]).length,
+
+ # If 2 are the same then they will be together, but full [a,b] order is not correct.
+
+ # Sort by length
+
+
+ length_sorted_edges = [(Vector(key[0]), Vector(key[1]), value) for key, value in edges.items() if value != 0]
+
+ try: length_sorted_edges.sort(key = lambda A: -A[2]) # largest first
+ except: length_sorted_edges.sort(lambda A, B: cmp(B[2], A[2]))
+
+ # Its okay to leave the length in there.
+ #for e in length_sorted_edges:
+ # e.pop(2)
+
+ # return edges and unique points
+ return length_sorted_edges, [v.to_3d() for v in unique_points.values()]
+
+# ========================= NOT WORKING????
+# Find if a points inside an edge loop, un-orderd.
+# pt is and x/y
+# edges are a non ordered loop of edges.
+# #offsets are the edge x and y offset.
+"""
+def pointInEdges(pt, edges):
+ #
+ x1 = pt[0]
+ y1 = pt[1]
+
+ # Point to the left of this line.
+ x2 = -100000
+ y2 = -10000
+ intersectCount = 0
+ for ed in edges:
+ xi, yi = lineIntersection2D(x1,y1, x2,y2, ed[0][0], ed[0][1], ed[1][0], ed[1][1])
+ if xi != None: # Is there an intersection.
+ intersectCount+=1
+
+ return intersectCount % 2
+"""
+
+def pointInIsland(pt, island):
+ vec1, vec2, vec3 = Vector(), Vector(), Vector()
+ for f in island:
+ vec1.x, vec1.y = f.uv[0]
+ vec2.x, vec2.y = f.uv[1]
+ vec3.x, vec3.y = f.uv[2]
+
+ if pointInTri2D(pt, vec1, vec2, vec3):
+ return True
+
+ if len(f.v) == 4:
+ vec1.x, vec1.y = f.uv[0]
+ vec2.x, vec2.y = f.uv[2]
+ vec3.x, vec3.y = f.uv[3]
+ if pointInTri2D(pt, vec1, vec2, vec3):
+ return True
+ return False
+
+
+# box is (left,bottom, right, top)
+def islandIntersectUvIsland(source, target, SourceOffset):
+ # Is 1 point in the box, inside the vertLoops
+ edgeLoopsSource = source[6] # Pretend this is offset
+ edgeLoopsTarget = target[6]
+
+ # Edge intersect test
+ for ed in edgeLoopsSource:
+ for seg in edgeLoopsTarget:
+ i = geometry.intersect_line_line_2d(\
+ seg[0], seg[1], SourceOffset+ed[0], SourceOffset+ed[1])
+ if i:
+ return 1 # LINE INTERSECTION
+
+ # 1 test for source being totally inside target
+ SourceOffset.resize_3d()
+ for pv in source[7]:
+ if pointInIsland(pv+SourceOffset, target[0]):
+ return 2 # SOURCE INSIDE TARGET
+
+ # 2 test for a part of the target being totaly inside the source.
+ for pv in target[7]:
+ if pointInIsland(pv-SourceOffset, source[0]):
+ return 3 # PART OF TARGET INSIDE SOURCE.
+
+ return 0 # NO INTERSECTION
+
+
+
+
+# Returns the X/y Bounds of a list of vectors.
+def testNewVecLs2DRotIsBetter(vecs, mat=-1, bestAreaSoFar = -1):
+
+ # UV's will never extend this far.
+ minx = miny = BIG_NUM
+ maxx = maxy = -BIG_NUM
+
+ for i, v in enumerate(vecs):
+
+ # Do this allong the way
+ if mat != -1:
+ v = vecs[i] = v*mat
+ x= v.x
+ y= v.y
+ if x<minx: minx= x
+ if y<miny: miny= y
+ if x>maxx: maxx= x
+ if y>maxy: maxy= y
+
+ # Spesific to this algo, bail out if we get bigger then the current area
+ if bestAreaSoFar != -1 and (maxx-minx) * (maxy-miny) > bestAreaSoFar:
+ return (BIG_NUM, None), None
+ w = maxx-minx
+ h = maxy-miny
+ return (w*h, w,h), vecs # Area, vecs
+
+def optiRotateUvIsland(faces):
+ global currentArea
+
+ # Bestfit Rotation
+ def best2dRotation(uvVecs, MAT1, MAT2):
+ global currentArea
+
+ newAreaPos, newfaceProjectionGroupListPos =\
+ testNewVecLs2DRotIsBetter(uvVecs[:], MAT1, currentArea[0])
+
+
+ # Why do I use newpos here? May as well give the best area to date for an early bailout
+ # some slight speed increase in this.
+ # If the new rotation is smaller then the existing, we can
+ # avoid copying a list and overwrite the old, crappy one.
+
+ if newAreaPos[0] < currentArea[0]:
+ newAreaNeg, newfaceProjectionGroupListNeg =\
+ testNewVecLs2DRotIsBetter(uvVecs, MAT2, newAreaPos[0]) # Reuse the old bigger list.
+ else:
+ newAreaNeg, newfaceProjectionGroupListNeg =\
+ testNewVecLs2DRotIsBetter(uvVecs[:], MAT2, currentArea[0]) # Cant reuse, make a copy.
+
+
+ # Now from the 3 options we need to discover which to use
+ # we have cerrentArea/newAreaPos/newAreaNeg
+ bestArea = min(currentArea[0], newAreaPos[0], newAreaNeg[0])
+
+ if currentArea[0] == bestArea:
+ return uvVecs
+ elif newAreaPos[0] == bestArea:
+ uvVecs = newfaceProjectionGroupListPos
+ currentArea = newAreaPos
+ elif newAreaNeg[0] == bestArea:
+ uvVecs = newfaceProjectionGroupListNeg
+ currentArea = newAreaNeg
+
+ return uvVecs
+
+
+ # Serialized UV coords to Vectors
+ uvVecs = [uv for f in faces for uv in f.uv]
+
+ # Theres a small enough number of these to hard code it
+ # rather then a loop.
+
+ # Will not modify anything
+ currentArea, dummy =\
+ testNewVecLs2DRotIsBetter(uvVecs)
+
+
+ # Try a 45d rotation
+ newAreaPos, newfaceProjectionGroupListPos = testNewVecLs2DRotIsBetter(uvVecs[:], ROTMAT_2D_POS_45D, currentArea[0])
+
+ if newAreaPos[0] < currentArea[0]:
+ uvVecs = newfaceProjectionGroupListPos
+ currentArea = newAreaPos
+ # 45d done
+
+ # Testcase different rotations and find the onfe that best fits in a square
+ for ROTMAT in RotMatStepRotation:
+ uvVecs = best2dRotation(uvVecs, ROTMAT[0], ROTMAT[1])
+
+ # Only if you want it, make faces verticle!
+ if currentArea[1] > currentArea[2]:
+ # Rotate 90d
+ # Work directly on the list, no need to return a value.
+ testNewVecLs2DRotIsBetter(uvVecs, ROTMAT_2D_POS_90D)
+
+
+ # Now write the vectors back to the face UV's
+ i = 0 # count the serialized uv/vectors
+ for f in faces:
+ #f.uv = [uv for uv in uvVecs[i:len(f)+i] ]
+ for j, k in enumerate(range(i, len(f.v)+i)):
+ f.uv[j][:] = uvVecs[k]
+ i += len(f.v)
+
+
+# Takes an island list and tries to find concave, hollow areas to pack smaller islands into.
+def mergeUvIslands(islandList):
+ global USER_FILL_HOLES
+ global USER_FILL_HOLES_QUALITY
+
+
+ # Pack islands to bottom LHS
+ # Sync with island
+
+ #islandTotFaceArea = [] # A list of floats, each island area
+ #islandArea = [] # a list of tuples ( area, w,h)
+
+
+ decoratedIslandList = []
+
+ islandIdx = len(islandList)
+ while islandIdx:
+ islandIdx-=1
+ minx, miny, maxx, maxy = boundsIsland(islandList[islandIdx])
+ w, h = maxx-minx, maxy-miny
+
+ totFaceArea = 0
+ offset= Vector((minx, miny))
+ for f in islandList[islandIdx]:
+ for uv in f.uv:
+ uv -= offset
+
+ totFaceArea += f.area
+
+ islandBoundsArea = w*h
+ efficiency = abs(islandBoundsArea - totFaceArea)
+
+ # UV Edge list used for intersections as well as unique points.
+ edges, uniqueEdgePoints = island2Edge(islandList[islandIdx])
+
+ decoratedIslandList.append([islandList[islandIdx], totFaceArea, efficiency, islandBoundsArea, w,h, edges, uniqueEdgePoints])
+
+
+ # Sort by island bounding box area, smallest face area first.
+ # no.. chance that to most simple edge loop first.
+ decoratedIslandListAreaSort =decoratedIslandList[:]
+
+ decoratedIslandListAreaSort.sort(key = lambda A: A[3])
+
+ # sort by efficiency, Least Efficient first.
+ decoratedIslandListEfficSort = decoratedIslandList[:]
+ # decoratedIslandListEfficSort.sort(lambda A, B: cmp(B[2], A[2]))
+
+ decoratedIslandListEfficSort.sort(key = lambda A: -A[2])
+
+ # ================================================== THESE CAN BE TWEAKED.
+ # This is a quality value for the number of tests.
+ # from 1 to 4, generic quality value is from 1 to 100
+ USER_STEP_QUALITY = ((USER_FILL_HOLES_QUALITY - 1) / 25.0) + 1
+
+ # If 100 will test as long as there is enough free space.
+ # this is rarely enough, and testing takes a while, so lower quality speeds this up.
+
+ # 1 means they have the same quality
+ USER_FREE_SPACE_TO_TEST_QUALITY = 1 + (((100 - USER_FILL_HOLES_QUALITY)/100.0) *5)
+
+ #print 'USER_STEP_QUALITY', USER_STEP_QUALITY
+ #print 'USER_FREE_SPACE_TO_TEST_QUALITY', USER_FREE_SPACE_TO_TEST_QUALITY
+
+ removedCount = 0
+
+ areaIslandIdx = 0
+ ctrl = Window.Qual.CTRL
+ BREAK= False
+ while areaIslandIdx < len(decoratedIslandListAreaSort) and not BREAK:
+ sourceIsland = decoratedIslandListAreaSort[areaIslandIdx]
+ # Alredy packed?
+ if not sourceIsland[0]:
+ areaIslandIdx+=1
+ else:
+ efficIslandIdx = 0
+ while efficIslandIdx < len(decoratedIslandListEfficSort) and not BREAK:
+
+ if Window.GetKeyQualifiers() & ctrl:
+ BREAK= True
+ break
+
+ # Now we have 2 islands, is the efficience of the islands lowers theres an
+ # increasing likely hood that we can fit merge into the bigger UV island.
+ # this ensures a tight fit.
+
+ # Just use figures we have about user/unused area to see if they might fit.
+
+ targetIsland = decoratedIslandListEfficSort[efficIslandIdx]
+
+
+ if sourceIsland[0] == targetIsland[0] or\
+ not targetIsland[0] or\
+ not sourceIsland[0]:
+ pass
+ else:
+
+ # ([island, totFaceArea, efficiency, islandArea, w,h])
+ # Waisted space on target is greater then UV bounding island area.
+
+
+ # if targetIsland[3] > (sourceIsland[2]) and\ #
+ # print USER_FREE_SPACE_TO_TEST_QUALITY
+ if targetIsland[2] > (sourceIsland[1] * USER_FREE_SPACE_TO_TEST_QUALITY) and\
+ targetIsland[4] > sourceIsland[4] and\
+ targetIsland[5] > sourceIsland[5]:
+
+ # DEBUG # print '%.10f %.10f' % (targetIsland[3], sourceIsland[1])
+
+ # These enough spare space lets move the box until it fits
+
+ # How many times does the source fit into the target x/y
+ blockTestXUnit = targetIsland[4]/sourceIsland[4]
+ blockTestYUnit = targetIsland[5]/sourceIsland[5]
+
+ boxLeft = 0
+
+
+ # Distllllance we can move between whilst staying inside the targets bounds.
+ testWidth = targetIsland[4] - sourceIsland[4]
+ testHeight = targetIsland[5] - sourceIsland[5]
+
+ # Increment we move each test. x/y
+ xIncrement = (testWidth / (blockTestXUnit * ((USER_STEP_QUALITY/50)+0.1)))
+ yIncrement = (testHeight / (blockTestYUnit * ((USER_STEP_QUALITY/50)+0.1)))
+
+ # Make sure were not moving less then a 3rg of our width/height
+ if xIncrement<sourceIsland[4]/3:
+ xIncrement= sourceIsland[4]
+ if yIncrement<sourceIsland[5]/3:
+ yIncrement= sourceIsland[5]
+
+
+ boxLeft = 0 # Start 1 back so we can jump into the loop.
+ boxBottom= 0 #-yIncrement
+
+ ##testcount= 0
+
+ while boxBottom <= testHeight:
+ # Should we use this? - not needed for now.
+ #if Window.GetKeyQualifiers() & ctrl:
+ # BREAK= True
+ # break
+
+ ##testcount+=1
+ #print 'Testing intersect'
+ Intersect = islandIntersectUvIsland(sourceIsland, targetIsland, Vector((boxLeft, boxBottom)))
+ #print 'Done', Intersect
+ if Intersect == 1: # Line intersect, dont bother with this any more
+ pass
+
+ if Intersect == 2: # Source inside target
+ '''
+ We have an intersection, if we are inside the target
+ then move us 1 whole width accross,
+ Its possible this is a bad idea since 2 skinny Angular faces
+ could join without 1 whole move, but its a lot more optimal to speed this up
+ since we have already tested for it.
+
+ It gives about 10% speedup with minimal errors.
+ '''
+ #print 'ass'
+ # Move the test allong its width + SMALL_NUM
+ #boxLeft += sourceIsland[4] + SMALL_NUM
+ boxLeft += sourceIsland[4]
+ elif Intersect == 0: # No intersection?? Place it.
+ # Progress
+ removedCount +=1
+#XXX Window.DrawProgressBar(0.0, 'Merged: %i islands, Ctrl to finish early.' % removedCount)
+
+ # Move faces into new island and offset
+ targetIsland[0].extend(sourceIsland[0])
+ offset= Vector((boxLeft, boxBottom))
+
+ for f in sourceIsland[0]:
+ for uv in f.uv:
+ uv+= offset
+
+ sourceIsland[0][:] = [] # Empty
+
+
+ # Move edge loop into new and offset.
+ # targetIsland[6].extend(sourceIsland[6])
+ #while sourceIsland[6]:
+ targetIsland[6].extend( [ (\
+ (e[0]+offset, e[1]+offset, e[2])\
+ ) for e in sourceIsland[6] ] )
+
+ sourceIsland[6][:] = [] # Empty
+
+ # Sort by edge length, reverse so biggest are first.
+
+ try: targetIsland[6].sort(key = lambda A: A[2])
+ except: targetIsland[6].sort(lambda B,A: cmp(A[2], B[2] ))
+
+
+ targetIsland[7].extend(sourceIsland[7])
+ offset= Vector((boxLeft, boxBottom, 0.0))
+ for p in sourceIsland[7]:
+ p+= offset
+
+ sourceIsland[7][:] = []
+
+
+ # Decrement the efficiency
+ targetIsland[1]+=sourceIsland[1] # Increment totFaceArea
+ targetIsland[2]-=sourceIsland[1] # Decrement efficiency
+ # IF we ever used these again, should set to 0, eg
+ sourceIsland[2] = 0 # No area if anyone wants to know
+
+ break
+
+
+ # INCREMENR NEXT LOCATION
+ if boxLeft > testWidth:
+ boxBottom += yIncrement
+ boxLeft = 0.0
+ else:
+ boxLeft += xIncrement
+ ##print testcount
+
+ efficIslandIdx+=1
+ areaIslandIdx+=1
+
+ # Remove empty islands
+ i = len(islandList)
+ while i:
+ i-=1
+ if not islandList[i]:
+ del islandList[i] # Can increment islands removed here.
+
+# Takes groups of faces. assumes face groups are UV groups.
+def getUvIslands(faceGroups, me):
+
+ # Get seams so we dont cross over seams
+ edge_seams = {} # shoudl be a set
+ for ed in me.edges:
+ if ed.use_seam:
+ edge_seams[ed.key] = None # dummy var- use sets!
+ # Done finding seams
+
+
+ islandList = []
+
+#XXX Window.DrawProgressBar(0.0, 'Splitting %d projection groups into UV islands:' % len(faceGroups))
+ #print '\tSplitting %d projection groups into UV islands:' % len(faceGroups),
+ # Find grouped faces
+
+ faceGroupIdx = len(faceGroups)
+
+ while faceGroupIdx:
+ faceGroupIdx-=1
+ faces = faceGroups[faceGroupIdx]
+
+ if not faces:
+ continue
+
+ # Build edge dict
+ edge_users = {}
+
+ for i, f in enumerate(faces):
+ for ed_key in f.edge_keys:
+ if ed_key in edge_seams: # DELIMIT SEAMS! ;)
+ edge_users[ed_key] = [] # so as not to raise an error
+ else:
+ try: edge_users[ed_key].append(i)
+ except: edge_users[ed_key] = [i]
+
+ # Modes
+ # 0 - face not yet touched.
+ # 1 - added to island list, and need to search
+ # 2 - touched and searched - dont touch again.
+ face_modes = [0] * len(faces) # initialize zero - untested.
+
+ face_modes[0] = 1 # start the search with face 1
+
+ newIsland = []
+
+ newIsland.append(faces[0])
+
+
+ ok = True
+ while ok:
+
+ ok = True
+ while ok:
+ ok= False
+ for i in range(len(faces)):
+ if face_modes[i] == 1: # search
+ for ed_key in faces[i].edge_keys:
+ for ii in edge_users[ed_key]:
+ if i != ii and face_modes[ii] == 0:
+ face_modes[ii] = ok = 1 # mark as searched
+ newIsland.append(faces[ii])
+
+ # mark as searched, dont look again.
+ face_modes[i] = 2
+
+ islandList.append(newIsland)
+
+ ok = False
+ for i in range(len(faces)):
+ if face_modes[i] == 0:
+ newIsland = []
+ newIsland.append(faces[i])
+
+ face_modes[i] = ok = 1
+ break
+ # if not ok will stop looping
+
+#XXX Window.DrawProgressBar(0.1, 'Optimizing Rotation for %i UV Islands' % len(islandList))
+
+ for island in islandList:
+ optiRotateUvIsland(island)
+
+ return islandList
+
+
+def packIslands(islandList):
+ if USER_FILL_HOLES:
+#XXX Window.DrawProgressBar(0.1, 'Merging Islands (Ctrl: skip merge)...')
+ mergeUvIslands(islandList) # Modify in place
+
+
+ # Now we have UV islands, we need to pack them.
+
+ # Make a synchronised list with the islands
+ # so we can box pak the islands.
+ packBoxes = []
+
+ # Keep a list of X/Y offset so we can save time by writing the
+ # uv's and packed data in one pass.
+ islandOffsetList = []
+
+ islandIdx = 0
+
+ while islandIdx < len(islandList):
+ minx, miny, maxx, maxy = boundsIsland(islandList[islandIdx])
+
+ w, h = maxx-minx, maxy-miny
+
+ if USER_ISLAND_MARGIN:
+ minx -= USER_ISLAND_MARGIN# *w
+ miny -= USER_ISLAND_MARGIN# *h
+ maxx += USER_ISLAND_MARGIN# *w
+ maxy += USER_ISLAND_MARGIN# *h
+
+ # recalc width and height
+ w, h = maxx-minx, maxy-miny
+
+ if w < 0.00001 or h < 0.00001:
+ del islandList[islandIdx]
+ islandIdx -=1
+ continue
+
+ '''Save the offset to be applied later,
+ we could apply to the UVs now and allign them to the bottom left hand area
+ of the UV coords like the box packer imagines they are
+ but, its quicker just to remember their offset and
+ apply the packing and offset in 1 pass '''
+ islandOffsetList.append((minx, miny))
+
+ # Add to boxList. use the island idx for the BOX id.
+ packBoxes.append([0, 0, w, h])
+ islandIdx+=1
+
+ # Now we have a list of boxes to pack that syncs
+ # with the islands.
+
+ #print '\tPacking UV Islands...'
+#XXX Window.DrawProgressBar(0.7, 'Packing %i UV Islands...' % len(packBoxes) )
+
+ # time1 = time.time()
+ packWidth, packHeight = geometry.box_pack_2d(packBoxes)
+
+ # print 'Box Packing Time:', time.time() - time1
+
+ #if len(pa ckedLs) != len(islandList):
+ # raise "Error packed boxes differes from original length"
+
+ #print '\tWriting Packed Data to faces'
+#XXX Window.DrawProgressBar(0.8, 'Writing Packed Data to faces')
+
+ # Sort by ID, so there in sync again
+ islandIdx = len(islandList)
+ # Having these here avoids devide by 0
+ if islandIdx:
+
+ if USER_STRETCH_ASPECT:
+ # Maximize to uv area?? Will write a normalize function.
+ xfactor = 1.0 / packWidth
+ yfactor = 1.0 / packHeight
+ else:
+ # Keep proportions.
+ xfactor = yfactor = 1.0 / max(packWidth, packHeight)
+
+ while islandIdx:
+ islandIdx -=1
+ # Write the packed values to the UV's
+
+ xoffset = packBoxes[islandIdx][0] - islandOffsetList[islandIdx][0]
+ yoffset = packBoxes[islandIdx][1] - islandOffsetList[islandIdx][1]
+
+ for f in islandList[islandIdx]: # Offsetting the UV's so they fit in there packed box
+ for uv in f.uv:
+ uv.x= (uv.x+xoffset) * xfactor
+ uv.y= (uv.y+yoffset) * yfactor
+
+
+
+def VectoQuat(vec):
+ vec = vec.normalized()
+ if abs(vec.x) > 0.5:
+ return vec.to_track_quat('Z', 'X')
+ else:
+ return vec.to_track_quat('Z', 'Y')
+
+
+class thickface(object):
+ __slost__= 'v', 'uv', 'no', 'area', 'edge_keys'
+ def __init__(self, face, uvface, mesh_verts):
+ self.v = [mesh_verts[i] for i in face.vertices]
+ if len(self.v)==4:
+ self.uv = uvface.uv1, uvface.uv2, uvface.uv3, uvface.uv4
+ else:
+ self.uv = uvface.uv1, uvface.uv2, uvface.uv3
+
+ self.no = face.normal
+ self.area = face.area
+ self.edge_keys = face.edge_keys
+
+
+def main_consts():
+ from math import radians
+
+ global ROTMAT_2D_POS_90D
+ global ROTMAT_2D_POS_45D
+ global RotMatStepRotation
+
+ ROTMAT_2D_POS_90D = Matrix.Rotation( radians(90.0), 2)
+ ROTMAT_2D_POS_45D = Matrix.Rotation( radians(45.0), 2)
+
+ RotMatStepRotation = []
+ rot_angle = 22.5 #45.0/2
+ while rot_angle > 0.1:
+ RotMatStepRotation.append([\
+ Matrix.Rotation( radians(rot_angle), 2),\
+ Matrix.Rotation( radians(-rot_angle), 2)])
+
+ rot_angle = rot_angle/2.0
+
+
+global ob
+ob = None
+def main(context, island_margin, projection_limit):
+ global USER_FILL_HOLES
+ global USER_FILL_HOLES_QUALITY
+ global USER_STRETCH_ASPECT
+ global USER_ISLAND_MARGIN
+
+ from math import cos
+ import time
+
+ global dict_matrix
+ dict_matrix = {}
+
+
+ # Constants:
+ # Takes a list of faces that make up a UV island and rotate
+ # until they optimally fit inside a square.
+ global ROTMAT_2D_POS_90D
+ global ROTMAT_2D_POS_45D
+ global RotMatStepRotation
+ main_consts()
+
+#XXX objects= bpy.data.scenes.active.objects
+ objects = context.selected_editable_objects
+
+
+ # we can will tag them later.
+ obList = [ob for ob in objects if ob.type == 'MESH']
+
+ # Face select object may not be selected.
+#XXX ob = objects.active
+ ob= objects[0]
+
+ if ob and (not ob.select) and ob.type == 'MESH':
+ # Add to the list
+ obList =[ob]
+ del objects
+
+ if not obList:
+ raise('error, no selected mesh objects')
+
+ # Create the variables.
+ USER_PROJECTION_LIMIT = projection_limit
+ USER_ONLY_SELECTED_FACES = (1)
+ USER_SHARE_SPACE = (1) # Only for hole filling.
+ USER_STRETCH_ASPECT = (1) # Only for hole filling.
+ USER_ISLAND_MARGIN = island_margin # Only for hole filling.
+ USER_FILL_HOLES = (0)
+ USER_FILL_HOLES_QUALITY = (50) # Only for hole filling.
+ USER_VIEW_INIT = (0) # Only for hole filling.
+ USER_AREA_WEIGHT = (1) # Only for hole filling.
+
+ # Reuse variable
+ if len(obList) == 1:
+ ob = "Unwrap %i Selected Mesh"
+ else:
+ ob = "Unwrap %i Selected Meshes"
+
+ # HACK, loop until mouse is lifted.
+ '''
+ while Window.GetMouseButtons() != 0:
+ time.sleep(10)
+ '''
+
+#XXX if not Draw.PupBlock(ob % len(obList), pup_block):
+#XXX return
+#XXX del ob
+
+ # Convert from being button types
+
+ USER_PROJECTION_LIMIT_CONVERTED = cos(USER_PROJECTION_LIMIT * DEG_TO_RAD)
+ USER_PROJECTION_LIMIT_HALF_CONVERTED = cos((USER_PROJECTION_LIMIT/2) * DEG_TO_RAD)
+
+
+ # Toggle Edit mode
+ is_editmode = (context.active_object.mode == 'EDIT')
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='OBJECT')
+ # Assume face select mode! an annoying hack to toggle face select mode because Mesh dosent like faceSelectMode.
+
+ if USER_SHARE_SPACE:
+ # Sort by data name so we get consistant results
+ obList.sort(key = lambda ob: ob.data.name)
+ collected_islandList= []
+
+#XXX Window.WaitCursor(1)
+
+ time1 = time.time()
+
+ # Tag as False se we dont operate on the same mesh twice.
+#XXX bpy.data.meshes.tag = False
+ for me in bpy.data.meshes:
+ me.tag = False
+
+
+ for ob in obList:
+ me = ob.data
+
+ if me.tag or me.library:
+ continue
+
+ # Tag as used
+ me.tag = True
+
+ if not me.uv_textures: # Mesh has no UV Coords, dont bother.
+ me.uv_textures.new()
+
+ uv_layer = me.uv_textures.active.data
+ me_verts = list(me.vertices)
+
+ if USER_ONLY_SELECTED_FACES:
+ meshFaces = [thickface(f, uv_layer[i], me_verts) for i, f in enumerate(me.faces) if f.select]
+ #else:
+ # meshFaces = map(thickface, me.faces)
+
+ if not meshFaces:
+ continue
+
+#XXX Window.DrawProgressBar(0.1, 'SmartProj UV Unwrapper, mapping "%s", %i faces.' % (me.name, len(meshFaces)))
+
+ # =======
+ # Generate a projection list from face normals, this is ment to be smart :)
+
+ # make a list of face props that are in sync with meshFaces
+ # Make a Face List that is sorted by area.
+ # meshFaces = []
+
+ # meshFaces.sort( lambda a, b: cmp(b.area , a.area) ) # Biggest first.
+ meshFaces.sort( key = lambda a: -a.area )
+
+ # remove all zero area faces
+ while meshFaces and meshFaces[-1].area <= SMALL_NUM:
+ # Set their UV's to 0,0
+ for uv in meshFaces[-1].uv:
+ uv.zero()
+ meshFaces.pop()
+
+ # Smallest first is slightly more efficient, but if the user cancels early then its better we work on the larger data.
+
+ # Generate Projection Vecs
+ # 0d is 1.0
+ # 180 IS -0.59846
+
+
+ # Initialize projectVecs
+ if USER_VIEW_INIT:
+ # Generate Projection
+ projectVecs = [Vector(Window.GetViewVector()) * ob.matrix_world.inverted().to_3x3()] # We add to this allong the way
+ else:
+ projectVecs = []
+
+ newProjectVec = meshFaces[0].no
+ newProjectMeshFaces = [] # Popping stuffs it up.
+
+
+ # Predent that the most unique angke is ages away to start the loop off
+ mostUniqueAngle = -1.0
+
+ # This is popped
+ tempMeshFaces = meshFaces[:]
+
+
+
+ # This while only gathers projection vecs, faces are assigned later on.
+ while 1:
+ # If theres none there then start with the largest face
+
+ # add all the faces that are close.
+ for fIdx in range(len(tempMeshFaces)-1, -1, -1):
+ # Use half the angle limit so we dont overweight faces towards this
+ # normal and hog all the faces.
+ if newProjectVec.dot(tempMeshFaces[fIdx].no) > USER_PROJECTION_LIMIT_HALF_CONVERTED:
+ newProjectMeshFaces.append(tempMeshFaces.pop(fIdx))
+
+ # Add the average of all these faces normals as a projectionVec
+ averageVec = Vector((0.0, 0.0, 0.0))
+ if USER_AREA_WEIGHT:
+ for fprop in newProjectMeshFaces:
+ averageVec += (fprop.no * fprop.area)
+ else:
+ for fprop in newProjectMeshFaces:
+ averageVec += fprop.no
+
+ if averageVec.x != 0 or averageVec.y != 0 or averageVec.z != 0: # Avoid NAN
+ projectVecs.append(averageVec.normalized())
+
+
+ # Get the next vec!
+ # Pick the face thats most different to all existing angles :)
+ mostUniqueAngle = 1.0 # 1.0 is 0d. no difference.
+ mostUniqueIndex = 0 # dummy
+
+ for fIdx in range(len(tempMeshFaces)-1, -1, -1):
+ angleDifference = -1.0 # 180d difference.
+
+ # Get the closest vec angle we are to.
+ for p in projectVecs:
+ temp_angle_diff= p.dot(tempMeshFaces[fIdx].no)
+
+ if angleDifference < temp_angle_diff:
+ angleDifference= temp_angle_diff
+
+ if angleDifference < mostUniqueAngle:
+ # We have a new most different angle
+ mostUniqueIndex = fIdx
+ mostUniqueAngle = angleDifference
+
+ if mostUniqueAngle < USER_PROJECTION_LIMIT_CONVERTED:
+ #print 'adding', mostUniqueAngle, USER_PROJECTION_LIMIT, len(newProjectMeshFaces)
+ # Now weight the vector to all its faces, will give a more direct projection
+ # if the face its self was not representive of the normal from surrounding faces.
+
+ newProjectVec = tempMeshFaces[mostUniqueIndex].no
+ newProjectMeshFaces = [tempMeshFaces.pop(mostUniqueIndex)]
+
+
+ else:
+ if len(projectVecs) >= 1: # Must have at least 2 projections
+ break
+
+
+ # If there are only zero area faces then its possible
+ # there are no projectionVecs
+ if not len(projectVecs):
+ Draw.PupMenu('error, no projection vecs where generated, 0 area faces can cause this.')
+ return
+
+ faceProjectionGroupList =[[] for i in range(len(projectVecs)) ]
+
+ # MAP and Arrange # We know there are 3 or 4 faces here
+
+ for fIdx in range(len(meshFaces)-1, -1, -1):
+ fvec = meshFaces[fIdx].no
+ i = len(projectVecs)
+
+ # Initialize first
+ bestAng = fvec.dot(projectVecs[0])
+ bestAngIdx = 0
+
+ # Cycle through the remaining, first already done
+ while i-1:
+ i-=1
+
+ newAng = fvec.dot(projectVecs[i])
+ if newAng > bestAng: # Reverse logic for dotvecs
+ bestAng = newAng
+ bestAngIdx = i
+
+ # Store the area for later use.
+ faceProjectionGroupList[bestAngIdx].append(meshFaces[fIdx])
+
+ # Cull faceProjectionGroupList,
+
+
+ # Now faceProjectionGroupList is full of faces that face match the project Vecs list
+ for i in range(len(projectVecs)):
+ # Account for projectVecs having no faces.
+ if not faceProjectionGroupList[i]:
+ continue
+
+ # Make a projection matrix from a unit length vector.
+ MatQuat = VectoQuat(projectVecs[i])
+
+ # Get the faces UV's from the projected vertex.
+ for f in faceProjectionGroupList[i]:
+ f_uv = f.uv
+ for j, v in enumerate(f.v):
+ # XXX - note, between mathutils in 2.4 and 2.5 the order changed.
+ f_uv[j][:] = (v.co * MatQuat)[:2]
+
+
+ if USER_SHARE_SPACE:
+ # Should we collect and pack later?
+ islandList = getUvIslands(faceProjectionGroupList, me)
+ collected_islandList.extend(islandList)
+
+ else:
+ # Should we pack the islands for this 1 object?
+ islandList = getUvIslands(faceProjectionGroupList, me)
+ packIslands(islandList)
+
+
+ # update the mesh here if we need to.
+
+ # We want to pack all in 1 go, so pack now
+ if USER_SHARE_SPACE:
+#XXX Window.DrawProgressBar(0.9, "Box Packing for all objects...")
+ packIslands(collected_islandList)
+
+ print("Smart Projection time: %.2f" % (time.time() - time1))
+ # Window.DrawProgressBar(0.9, "Smart Projections done, time: %.2f sec." % (time.time() - time1))
+
+ if is_editmode:
+ bpy.ops.object.mode_set(mode='EDIT')
+
+ dict_matrix.clear()
+
+#XXX Window.DrawProgressBar(1.0, "")
+#XXX Window.WaitCursor(0)
+#XXX Window.RedrawAll()
+
+"""
+ pup_block = [\
+ 'Projection',\
+* ('Angle Limit:', USER_PROJECTION_LIMIT, 1, 89, ''),\
+ ('Selected Faces Only', USER_ONLY_SELECTED_FACES, 'Use only selected faces from all selected meshes.'),\
+ ('Init from view', USER_VIEW_INIT, 'The first projection will be from the view vector.'),\
+ ('Area Weight', USER_AREA_WEIGHT, 'Weight projections vector by face area.'),\
+ '',\
+ '',\
+ '',\
+ 'UV Layout',\
+ ('Share Tex Space', USER_SHARE_SPACE, 'Objects Share texture space, map all objects into 1 uvmap.'),\
+ ('Stretch to bounds', USER_STRETCH_ASPECT, 'Stretch the final output to texture bounds.'),\
+* ('Island Margin:', USER_ISLAND_MARGIN, 0.0, 0.5, ''),\
+ 'Fill in empty areas',\
+ ('Fill Holes', USER_FILL_HOLES, 'Fill in empty areas reduced texture waistage (slow).'),\
+ ('Fill Quality:', USER_FILL_HOLES_QUALITY, 1, 100, 'Depends on fill holes, how tightly to fill UV holes, (higher is slower)'),\
+ ]
+"""
+
+from bpy.props import FloatProperty
+
+
+class SmartProject(bpy.types.Operator):
+ '''This script projection unwraps the selected faces of a mesh. it operates on all selected mesh objects, and can be used unwrap selected faces, or all faces.'''
+ bl_idname = "uv.smart_project"
+ bl_label = "Smart UV Project"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ angle_limit = FloatProperty(name="Angle Limit",
+ description="lower for more projection groups, higher for less distortion.",
+ default=66.0, min=1.0, max=89.0)
+
+ island_margin = FloatProperty(name="Island Margin",
+ description="Margin to reduce bleed from adjacent islands.",
+ default=0.0, min=0.0, max=1.0)
+
+ @classmethod
+ def poll(cls, context):
+ return context.active_object != None
+
+ def execute(self, context):
+ main(context, self.island_margin, self.angle_limit)
+ return {'FINISHED'}
+
+ def invoke(self, context, event):
+ wm = context.window_manager
+ return wm.invoke_props_dialog(self)
diff --git a/release/scripts/startup/bl_operators/vertexpaint_dirt.py b/release/scripts/startup/bl_operators/vertexpaint_dirt.py
new file mode 100644
index 00000000000..672db71e361
--- /dev/null
+++ b/release/scripts/startup/bl_operators/vertexpaint_dirt.py
@@ -0,0 +1,176 @@
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# Script copyright (C) Campbell J Barton
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+# --------------------------------------------------------------------------
+
+# <pep8 compliant>
+
+# History
+#
+# Originally written by Campbell Barton aka ideasman42
+#
+# 2009-11-01: * 2.5 port by Keith "Wahooney" Boshoff
+# * Replaced old method with my own, speed is similar (about 0.001 sec on Suzanne)
+# but results are far more accurate
+#
+
+
+def applyVertexDirt(me, blur_iterations, blur_strength, clamp_dirt, clamp_clean, dirt_only):
+ from mathutils import Vector
+ from math import acos
+
+ #BPyMesh.meshCalcNormals(me)
+
+ vert_tone = [0.0] * len(me.vertices)
+
+ min_tone = 180.0
+ max_tone = 0.0
+
+ # create lookup table for each vertex's connected vertices (via edges)
+ con = []
+
+ con = [[] for i in range(len(me.vertices))]
+
+ # add connected verts
+ for e in me.edges:
+ con[e.vertices[0]].append(e.vertices[1])
+ con[e.vertices[1]].append(e.vertices[0])
+
+ for i, v in enumerate(me.vertices):
+ vec = Vector()
+ no = v.normal
+ co = v.co
+
+ # get the direction of the vectors between the vertex and it's connected vertices
+ for c in con[i]:
+ vec += (me.vertices[c].co - co).normalized()
+
+ # normalize the vector by dividing by the number of connected verts
+ tot_con = len(con[i])
+
+ if tot_con == 0:
+ continue
+
+ vec /= tot_con
+
+ # angle is the acos of the dot product between vert and connected verts normals
+ ang = acos(no.dot(vec))
+
+ # enforce min/max
+ ang = max(clamp_dirt, ang)
+
+ if not dirt_only:
+ ang = min(clamp_clean, ang)
+
+ vert_tone[i] = ang
+
+ # blur tones
+ for i in range(blur_iterations):
+ # backup the original tones
+ orig_vert_tone = list(vert_tone)
+
+ # use connected verts look up for blurring
+ for j, c in enumerate(con):
+ for v in c:
+ vert_tone[j] += blur_strength * orig_vert_tone[v]
+
+ vert_tone[j] /= len(c) * blur_strength + 1
+
+ min_tone = min(vert_tone)
+ max_tone = max(vert_tone)
+
+ # debug information
+ # print(min_tone * 2 * math.pi)
+ # print(max_tone * 2 * math.pi)
+ # print(clamp_clean)
+ # print(clamp_dirt)
+
+ tone_range = max_tone - min_tone
+
+ if not tone_range:
+ return
+
+ active_col_layer = None
+
+ if len(me.vertex_colors):
+ for lay in me.vertex_colors:
+ if lay.active:
+ active_col_layer = lay.data
+ else:
+ bpy.ops.mesh.vertex_color_add()
+ me.vertex_colors[0].active = True
+ active_col_layer = me.vertex_colors[0].data
+
+ if not active_col_layer:
+ return('CANCELLED', )
+
+ for i, f in enumerate(me.faces):
+ if not me.use_paint_mask or f.select:
+
+ f_col = active_col_layer[i]
+
+ f_col = [f_col.color1, f_col.color2, f_col.color3, f_col.color4]
+
+ for j, v in enumerate(f.vertices):
+ col = f_col[j]
+ tone = vert_tone[me.vertices[v].index]
+ tone = (tone - min_tone) / tone_range
+
+ if dirt_only:
+ tone = min(tone, 0.5)
+ tone *= 2
+
+ col[0] = tone * col[0]
+ col[1] = tone * col[1]
+ col[2] = tone * col[2]
+
+
+import bpy
+from bpy.props import FloatProperty, IntProperty, BoolProperty
+
+
+class VertexPaintDirt(bpy.types.Operator):
+ bl_idname = "paint.vertex_color_dirt"
+ bl_label = "Dirty Vertex Colors"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ blur_strength = FloatProperty(name="Blur Strength", description="Blur strength per iteration", default=1.0, min=0.01, max=1.0)
+ blur_iterations = IntProperty(name="Blur Iterations", description="Number times to blur the colors. (higher blurs more)", default=1, min=0, max=40)
+ clean_angle = FloatProperty(name="Highlight Angle", description="Less then 90 limits the angle used in the tonal range", default=180.0, min=0.0, max=180.0)
+ dirt_angle = FloatProperty(name="Dirt Angle", description="Less then 90 limits the angle used in the tonal range", default=0.0, min=0.0, max=180.0)
+ dirt_only = BoolProperty(name="Dirt Only", description="Dont calculate cleans for convex areas", default=False)
+
+ def execute(self, context):
+ import time
+ from math import radians
+ obj = context.object
+
+ if not obj or obj.type != 'MESH':
+ self.report({'ERROR'}, "Error, no active mesh object, aborting")
+ return {'CANCELLED'}
+
+ mesh = obj.data
+
+ t = time.time()
+
+ applyVertexDirt(mesh, self.blur_iterations, self.blur_strength, radians(self.dirt_angle), radians(self.clean_angle), self.dirt_only)
+
+ print('Dirt calculated in %.6f' % (time.time() - t))
+
+ return {'FINISHED'}
diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
new file mode 100644
index 00000000000..adcd9c7c45a
--- /dev/null
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -0,0 +1,1000 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+import bpy
+from bpy.props import StringProperty, BoolProperty, IntProperty, FloatProperty
+from rna_prop_ui import rna_idprop_ui_prop_get, rna_idprop_ui_prop_clear
+
+
+class MESH_OT_delete_edgeloop(bpy.types.Operator):
+ '''Delete an edge loop by merging the faces on each side to a single face loop'''
+ bl_idname = "mesh.delete_edgeloop"
+ bl_label = "Delete Edge Loop"
+
+ def execute(self, context):
+ if 'FINISHED' in bpy.ops.transform.edge_slide(value=1.0):
+ bpy.ops.mesh.select_more()
+ bpy.ops.mesh.remove_doubles()
+ return {'FINISHED'}
+
+ return {'CANCELLED'}
+
+rna_path_prop = StringProperty(name="Context Attributes",
+ description="rna context string", maxlen=1024, default="")
+
+rna_reverse_prop = BoolProperty(name="Reverse",
+ description="Cycle backwards", default=False)
+
+rna_relative_prop = BoolProperty(name="Relative",
+ description="Apply relative to the current value (delta)",
+ default=False)
+
+
+def context_path_validate(context, data_path):
+ import sys
+ try:
+ value = eval("context.%s" % data_path) if data_path else Ellipsis
+ except AttributeError:
+ if "'NoneType'" in str(sys.exc_info()[1]):
+ # One of the items in the rna path is None, just ignore this
+ value = Ellipsis
+ else:
+ # We have a real error in the rna path, dont ignore that
+ raise
+
+ return value
+
+
+def execute_context_assign(self, context):
+ if context_path_validate(context, self.data_path) is Ellipsis:
+ return {'PASS_THROUGH'}
+
+ if getattr(self, "relative", False):
+ exec("context.%s+=self.value" % self.data_path)
+ else:
+ exec("context.%s=self.value" % self.data_path)
+
+ return {'FINISHED'}
+
+
+class BRUSH_OT_active_index_set(bpy.types.Operator):
+ '''Set active sculpt/paint brush from it's number'''
+ bl_idname = "brush.active_index_set"
+ bl_label = "Set Brush Number"
+
+ mode = StringProperty(name="mode",
+ description="Paint mode to set brush for", maxlen=1024)
+ index = IntProperty(name="number",
+ description="Brush number")
+
+ _attr_dict = {"sculpt": "use_paint_sculpt",
+ "vertex_paint": "use_paint_vertex",
+ "weight_paint": "use_paint_weight",
+ "image_paint": "use_paint_image"}
+
+ def execute(self, context):
+ attr = self._attr_dict.get(self.mode)
+ if attr is None:
+ return {'CANCELLED'}
+
+ for i, brush in enumerate((cur for cur in bpy.data.brushes if getattr(cur, attr))):
+ if i == self.index:
+ getattr(context.tool_settings, self.mode).brush = brush
+ return {'FINISHED'}
+
+ return {'CANCELLED'}
+
+
+class WM_OT_context_set_boolean(bpy.types.Operator):
+ '''Set a context value.'''
+ bl_idname = "wm.context_set_boolean"
+ bl_label = "Context Set Boolean"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ value = BoolProperty(name="Value",
+ description="Assignment value", default=True)
+
+ execute = execute_context_assign
+
+
+class WM_OT_context_set_int(bpy.types.Operator): # same as enum
+ '''Set a context value.'''
+ bl_idname = "wm.context_set_int"
+ bl_label = "Context Set"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ value = IntProperty(name="Value", description="Assign value", default=0)
+ relative = rna_relative_prop
+
+ execute = execute_context_assign
+
+
+class WM_OT_context_scale_int(bpy.types.Operator):
+ '''Scale an int context value.'''
+ bl_idname = "wm.context_scale_int"
+ bl_label = "Context Set"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ value = FloatProperty(name="Value", description="Assign value", default=1.0)
+ always_step = BoolProperty(name="Always Step",
+ description="Always adjust the value by a minimum of 1 when 'value' is not 1.0.",
+ default=True)
+
+ def execute(self, context):
+ if context_path_validate(context, self.data_path) is Ellipsis:
+ return {'PASS_THROUGH'}
+
+ value = self.value
+ data_path = self.data_path
+
+ if value == 1.0: # nothing to do
+ return {'CANCELLED'}
+
+ if getattr(self, "always_step", False):
+ if value > 1.0:
+ add = "1"
+ func = "max"
+ else:
+ add = "-1"
+ func = "min"
+ exec("context.%s = %s(round(context.%s * value), context.%s + %s)" % (data_path, func, data_path, data_path, add))
+ else:
+ exec("context.%s *= value" % self.data_path)
+
+ return {'FINISHED'}
+
+
+class WM_OT_context_set_float(bpy.types.Operator): # same as enum
+ '''Set a context value.'''
+ bl_idname = "wm.context_set_float"
+ bl_label = "Context Set Float"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ value = FloatProperty(name="Value",
+ description="Assignment value", default=0.0)
+ relative = rna_relative_prop
+
+ execute = execute_context_assign
+
+
+class WM_OT_context_set_string(bpy.types.Operator): # same as enum
+ '''Set a context value.'''
+ bl_idname = "wm.context_set_string"
+ bl_label = "Context Set String"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ value = StringProperty(name="Value",
+ description="Assign value", maxlen=1024, default="")
+
+ execute = execute_context_assign
+
+
+class WM_OT_context_set_enum(bpy.types.Operator):
+ '''Set a context value.'''
+ bl_idname = "wm.context_set_enum"
+ bl_label = "Context Set Enum"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ value = StringProperty(name="Value",
+ description="Assignment value (as a string)",
+ maxlen=1024, default="")
+
+ execute = execute_context_assign
+
+
+class WM_OT_context_set_value(bpy.types.Operator):
+ '''Set a context value.'''
+ bl_idname = "wm.context_set_value"
+ bl_label = "Context Set Value"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ value = StringProperty(name="Value",
+ description="Assignment value (as a string)",
+ maxlen=1024, default="")
+
+ def execute(self, context):
+ if context_path_validate(context, self.data_path) is Ellipsis:
+ return {'PASS_THROUGH'}
+ exec("context.%s=%s" % (self.data_path, self.value))
+ return {'FINISHED'}
+
+
+class WM_OT_context_toggle(bpy.types.Operator):
+ '''Toggle a context value.'''
+ bl_idname = "wm.context_toggle"
+ bl_label = "Context Toggle"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+
+ def execute(self, context):
+
+ if context_path_validate(context, self.data_path) is Ellipsis:
+ return {'PASS_THROUGH'}
+
+ exec("context.%s=not (context.%s)" %
+ (self.data_path, self.data_path))
+
+ return {'FINISHED'}
+
+
+class WM_OT_context_toggle_enum(bpy.types.Operator):
+ '''Toggle a context value.'''
+ bl_idname = "wm.context_toggle_enum"
+ bl_label = "Context Toggle Values"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ value_1 = StringProperty(name="Value", \
+ description="Toggle enum", maxlen=1024, default="")
+
+ value_2 = StringProperty(name="Value", \
+ description="Toggle enum", maxlen=1024, default="")
+
+ def execute(self, context):
+
+ if context_path_validate(context, self.data_path) is Ellipsis:
+ return {'PASS_THROUGH'}
+
+ exec("context.%s = ['%s', '%s'][context.%s!='%s']" % \
+ (self.data_path, self.value_1,\
+ self.value_2, self.data_path,
+ self.value_2))
+
+ return {'FINISHED'}
+
+
+class WM_OT_context_cycle_int(bpy.types.Operator):
+ '''Set a context value. Useful for cycling active material, '''
+ '''vertex keys, groups' etc.'''
+ bl_idname = "wm.context_cycle_int"
+ bl_label = "Context Int Cycle"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ reverse = rna_reverse_prop
+
+ def execute(self, context):
+ data_path = self.data_path
+ value = context_path_validate(context, data_path)
+ if value is Ellipsis:
+ return {'PASS_THROUGH'}
+
+ if self.reverse:
+ value -= 1
+ else:
+ value += 1
+
+ exec("context.%s=value" % data_path)
+
+ if value != eval("context.%s" % data_path):
+ # relies on rna clamping int's out of the range
+ if self.reverse:
+ value = (1 << 31) - 1
+ else:
+ value = -1 << 31
+
+ exec("context.%s=value" % data_path)
+
+ return {'FINISHED'}
+
+
+class WM_OT_context_cycle_enum(bpy.types.Operator):
+ '''Toggle a context value.'''
+ bl_idname = "wm.context_cycle_enum"
+ bl_label = "Context Enum Cycle"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ reverse = rna_reverse_prop
+
+ def execute(self, context):
+
+ value = context_path_validate(context, self.data_path)
+ if value is Ellipsis:
+ return {'PASS_THROUGH'}
+
+ orig_value = value
+
+ # Have to get rna enum values
+ rna_struct_str, rna_prop_str = self.data_path.rsplit('.', 1)
+ i = rna_prop_str.find('[')
+
+ # just incse we get "context.foo.bar[0]"
+ if i != -1:
+ rna_prop_str = rna_prop_str[0:i]
+
+ rna_struct = eval("context.%s.rna_type" % rna_struct_str)
+
+ rna_prop = rna_struct.properties[rna_prop_str]
+
+ if type(rna_prop) != bpy.types.EnumProperty:
+ raise Exception("expected an enum property")
+
+ enums = rna_struct.properties[rna_prop_str].enum_items.keys()
+ orig_index = enums.index(orig_value)
+
+ # Have the info we need, advance to the next item
+ if self.reverse:
+ if orig_index == 0:
+ advance_enum = enums[-1]
+ else:
+ advance_enum = enums[orig_index - 1]
+ else:
+ if orig_index == len(enums) - 1:
+ advance_enum = enums[0]
+ else:
+ advance_enum = enums[orig_index + 1]
+
+ # set the new value
+ exec("context.%s=advance_enum" % self.data_path)
+ return {'FINISHED'}
+
+
+class WM_OT_context_cycle_array(bpy.types.Operator):
+ '''Set a context array value.
+ Useful for cycling the active mesh edit mode.'''
+ bl_idname = "wm.context_cycle_array"
+ bl_label = "Context Array Cycle"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ reverse = rna_reverse_prop
+
+ def execute(self, context):
+ data_path = self.data_path
+ value = context_path_validate(context, data_path)
+ if value is Ellipsis:
+ return {'PASS_THROUGH'}
+
+ def cycle(array):
+ if self.reverse:
+ array.insert(0, array.pop())
+ else:
+ array.append(array.pop(0))
+ return array
+
+ exec("context.%s=cycle(context.%s[:])" % (data_path, data_path))
+
+ return {'FINISHED'}
+
+
+class WM_MT_context_menu_enum(bpy.types.Menu):
+ bl_label = ""
+ data_path = "" # BAD DESIGN, set from operator below.
+
+ def draw(self, context):
+ data_path = self.data_path
+ value = context_path_validate(bpy.context, data_path)
+ if value is Ellipsis:
+ return {'PASS_THROUGH'}
+ base_path, prop_string = data_path.rsplit(".", 1)
+ value_base = context_path_validate(context, base_path)
+
+ values = [(i.name, i.identifier) for i in value_base.bl_rna.properties[prop_string].items]
+
+ for name, identifier in values:
+ prop = self.layout.operator("wm.context_set_enum", text=name)
+ prop.data_path = data_path
+ prop.value = identifier
+
+
+class WM_OT_context_menu_enum(bpy.types.Operator):
+ bl_idname = "wm.context_menu_enum"
+ bl_label = "Context Enum Menu"
+ bl_options = {'UNDO'}
+ data_path = rna_path_prop
+
+ def execute(self, context):
+ data_path = self.data_path
+ WM_MT_context_menu_enum.data_path = data_path
+ bpy.ops.wm.call_menu(name="WM_MT_context_menu_enum")
+ return {'PASS_THROUGH'}
+
+
+class WM_OT_context_set_id(bpy.types.Operator):
+ '''Toggle a context value.'''
+ bl_idname = "wm.context_set_id"
+ bl_label = "Set Library ID"
+ bl_options = {'UNDO'}
+
+ data_path = rna_path_prop
+ value = StringProperty(name="Value",
+ description="Assign value", maxlen=1024, default="")
+
+ def execute(self, context):
+ value = self.value
+ data_path = self.data_path
+
+ # match the pointer type from the target property to bpy.data.*
+ # so we lookup the correct list.
+ data_path_base, data_path_prop = data_path.rsplit(".", 1)
+ data_prop_rna = eval("context.%s" % data_path_base).rna_type.properties[data_path_prop]
+ data_prop_rna_type = data_prop_rna.fixed_type
+
+ id_iter = None
+
+ for prop in bpy.data.rna_type.properties:
+ if prop.rna_type.identifier == "CollectionProperty":
+ if prop.fixed_type == data_prop_rna_type:
+ id_iter = prop.identifier
+ break
+
+ if id_iter:
+ value_id = getattr(bpy.data, id_iter).get(value)
+ exec("context.%s=value_id" % data_path)
+
+ return {'FINISHED'}
+
+
+doc_id = StringProperty(name="Doc ID",
+ description="", maxlen=1024, default="", options={'HIDDEN'})
+
+doc_new = StringProperty(name="Edit Description",
+ description="", maxlen=1024, default="")
+
+
+class WM_OT_context_modal_mouse(bpy.types.Operator):
+ '''Adjust arbitrary values with mouse input'''
+ bl_idname = "wm.context_modal_mouse"
+ bl_label = "Context Modal Mouse"
+
+ data_path_iter = StringProperty(description="The data path relative to the context, must point to an iterable.")
+ data_path_item = StringProperty(description="The data path from each iterable to the value (int or float)")
+ input_scale = FloatProperty(default=0.01, description="Scale the mouse movement by this value before applying the delta")
+ invert = BoolProperty(default=False, description="Invert the mouse input")
+ initial_x = IntProperty(options={'HIDDEN'})
+
+ def _values_store(self, context):
+ data_path_iter = self.data_path_iter
+ data_path_item = self.data_path_item
+
+ self._values = values = {}
+
+ for item in getattr(context, data_path_iter):
+ try:
+ value_orig = eval("item." + data_path_item)
+ except:
+ continue
+
+ # check this can be set, maybe this is library data.
+ try:
+ exec("item.%s = %s" % (data_path_item, value_orig))
+ except:
+ continue
+
+ values[item] = value_orig
+
+ def _values_delta(self, delta):
+ delta *= self.input_scale
+ if self.invert:
+ delta = - delta
+
+ data_path_item = self.data_path_item
+ for item, value_orig in self._values.items():
+ if type(value_orig) == int:
+ exec("item.%s = int(%d)" % (data_path_item, round(value_orig + delta)))
+ else:
+ exec("item.%s = %f" % (data_path_item, value_orig + delta))
+
+ def _values_restore(self):
+ data_path_item = self.data_path_item
+ for item, value_orig in self._values.items():
+ exec("item.%s = %s" % (data_path_item, value_orig))
+
+ self._values.clear()
+
+ def _values_clear(self):
+ self._values.clear()
+
+ def modal(self, context, event):
+ event_type = event.type
+
+ if event_type == 'MOUSEMOVE':
+ delta = event.mouse_x - self.initial_x
+ self._values_delta(delta)
+
+ elif 'LEFTMOUSE' == event_type:
+ self._values_clear()
+ return {'FINISHED'}
+
+ elif event_type in ('RIGHTMOUSE', 'ESC'):
+ self._values_restore()
+ return {'FINISHED'}
+
+ return {'RUNNING_MODAL'}
+
+ def invoke(self, context, event):
+ self._values_store(context)
+
+ if not self._values:
+ self.report({'WARNING'}, "Nothing to operate on: %s[ ].%s" %
+ (self.data_path_iter, self.data_path_item))
+
+ return {'CANCELLED'}
+ else:
+ self.initial_x = event.mouse_x
+
+ context.window_manager.modal_handler_add(self)
+ return {'RUNNING_MODAL'}
+
+
+class WM_OT_url_open(bpy.types.Operator):
+ "Open a website in the Webbrowser"
+ bl_idname = "wm.url_open"
+ bl_label = ""
+
+ url = StringProperty(name="URL", description="URL to open")
+
+ def execute(self, context):
+ import webbrowser
+ _webbrowser_bug_fix()
+ webbrowser.open(self.url)
+ return {'FINISHED'}
+
+
+class WM_OT_path_open(bpy.types.Operator):
+ "Open a path in a file browser"
+ bl_idname = "wm.path_open"
+ bl_label = ""
+
+ filepath = StringProperty(name="File Path", maxlen=1024, subtype='FILE_PATH')
+
+ def execute(self, context):
+ import sys
+ import os
+ import subprocess
+
+ filepath = bpy.path.abspath(self.filepath)
+ filepath = os.path.normpath(filepath)
+
+ if not os.path.exists(filepath):
+ self.report({'ERROR'}, "File '%s' not found" % filepath)
+ return {'CANCELLED'}
+
+ if sys.platform[:3] == "win":
+ subprocess.Popen(['start', filepath], shell=True)
+ elif sys.platform == 'darwin':
+ subprocess.Popen(['open', filepath])
+ else:
+ try:
+ subprocess.Popen(['xdg-open', filepath])
+ except OSError:
+ # xdg-open *should* be supported by recent Gnome, KDE, Xfce
+ pass
+
+ return {'FINISHED'}
+
+
+class WM_OT_doc_view(bpy.types.Operator):
+ '''Load online reference docs'''
+ bl_idname = "wm.doc_view"
+ bl_label = "View Documentation"
+
+ doc_id = doc_id
+ if bpy.app.version_cycle == "release":
+ _prefix = "http://www.blender.org/documentation/blender_python_api_%s%s_release" % ("_".join(str(v) for v in bpy.app.version[:2]), bpy.app.version_char)
+ else:
+ _prefix = "http://www.blender.org/documentation/blender_python_api_%s" % "_".join(str(v) for v in bpy.app.version)
+
+ def _nested_class_string(self, class_string):
+ ls = []
+ class_obj = getattr(bpy.types, class_string, None).bl_rna
+ while class_obj:
+ ls.insert(0, class_obj)
+ class_obj = class_obj.nested
+ return '.'.join(class_obj.identifier for class_obj in ls)
+
+ def execute(self, context):
+ id_split = self.doc_id.split('.')
+ if len(id_split) == 1: # rna, class
+ url = '%s/bpy.types.%s.html' % (self._prefix, id_split[0])
+ elif len(id_split) == 2: # rna, class.prop
+ class_name, class_prop = id_split
+
+ if hasattr(bpy.types, class_name.upper() + '_OT_' + class_prop):
+ url = '%s/bpy.ops.%s.html#bpy.ops.%s.%s' % \
+ (self._prefix, class_name, class_name, class_prop)
+ else:
+
+ # detect if this is a inherited member and use that name instead
+ rna_parent = getattr(bpy.types, class_name).bl_rna
+ rna_prop = rna_parent.properties[class_prop]
+ rna_parent = rna_parent.base
+ while rna_parent and rna_prop == rna_parent.properties.get(class_prop):
+ class_name = rna_parent.identifier
+ rna_parent = rna_parent.base
+
+ # It so happens that epydoc nests these, not sphinx
+ # class_name_full = self._nested_class_string(class_name)
+ url = '%s/bpy.types.%s.html#bpy.types.%s.%s' % \
+ (self._prefix, class_name, class_name, class_prop)
+
+ else:
+ return {'PASS_THROUGH'}
+
+ import webbrowser
+ _webbrowser_bug_fix()
+ webbrowser.open(url)
+
+ return {'FINISHED'}
+
+
+class WM_OT_doc_edit(bpy.types.Operator):
+ '''Load online reference docs'''
+ bl_idname = "wm.doc_edit"
+ bl_label = "Edit Documentation"
+
+ doc_id = doc_id
+ doc_new = doc_new
+
+ _url = "http://www.mindrones.com/blender/svn/xmlrpc.php"
+
+ def _send_xmlrpc(self, data_dict):
+ print("sending data:", data_dict)
+
+ import xmlrpc.client
+ user = 'blenderuser'
+ pwd = 'blender>user'
+
+ docblog = xmlrpc.client.ServerProxy(self._url)
+ docblog.metaWeblog.newPost(1, user, pwd, data_dict, 1)
+
+ def execute(self, context):
+
+ doc_id = self.doc_id
+ doc_new = self.doc_new
+
+ class_name, class_prop = doc_id.split('.')
+
+ if not doc_new:
+ self.report({'ERROR'}, "No input given for '%s'" % doc_id)
+ return {'CANCELLED'}
+
+ # check if this is an operator
+ op_name = class_name.upper() + '_OT_' + class_prop
+ op_class = getattr(bpy.types, op_name, None)
+
+ # Upload this to the web server
+ upload = {}
+
+ if op_class:
+ rna = op_class.bl_rna
+ doc_orig = rna.description
+ if doc_orig == doc_new:
+ return {'RUNNING_MODAL'}
+
+ print("op - old:'%s' -> new:'%s'" % (doc_orig, doc_new))
+ upload["title"] = 'OPERATOR %s:%s' % (doc_id, doc_orig)
+ else:
+ rna = getattr(bpy.types, class_name).bl_rna
+ doc_orig = rna.properties[class_prop].description
+ if doc_orig == doc_new:
+ return {'RUNNING_MODAL'}
+
+ print("rna - old:'%s' -> new:'%s'" % (doc_orig, doc_new))
+ upload["title"] = 'RNA %s:%s' % (doc_id, doc_orig)
+
+ upload["description"] = doc_new
+
+ self._send_xmlrpc(upload)
+
+ return {'FINISHED'}
+
+ def draw(self, context):
+ layout = self.layout
+ layout.label(text="Descriptor ID: '%s'" % self.doc_id)
+ layout.prop(self, "doc_new", text="")
+
+ def invoke(self, context, event):
+ wm = context.window_manager
+ return wm.invoke_props_dialog(self, width=600)
+
+
+rna_path = StringProperty(name="Property Edit",
+ description="Property data_path edit", maxlen=1024, default="", options={'HIDDEN'})
+
+rna_value = StringProperty(name="Property Value",
+ description="Property value edit", maxlen=1024, default="")
+
+rna_property = StringProperty(name="Property Name",
+ description="Property name edit", maxlen=1024, default="")
+
+rna_min = FloatProperty(name="Min", default=0.0, precision=3)
+rna_max = FloatProperty(name="Max", default=1.0, precision=3)
+
+
+class WM_OT_properties_edit(bpy.types.Operator):
+ '''Internal use (edit a property data_path)'''
+ bl_idname = "wm.properties_edit"
+ bl_label = "Edit Property"
+ bl_options = {'REGISTER'} # only because invoke_props_popup requires.
+
+ data_path = rna_path
+ property = rna_property
+ value = rna_value
+ min = rna_min
+ max = rna_max
+ description = StringProperty(name="Tip", default="")
+
+ def execute(self, context):
+ data_path = self.data_path
+ value = self.value
+ prop = self.property
+
+ prop_old = getattr(self, "_last_prop", [None])[0]
+
+ if prop_old is None:
+ self.report({'ERROR'}, "Direct execution not supported")
+ return {'CANCELLED'}
+
+ try:
+ value_eval = eval(value)
+ except:
+ value_eval = value
+
+ # First remove
+ item = eval("context.%s" % data_path)
+
+ rna_idprop_ui_prop_clear(item, prop_old)
+ exec_str = "del item['%s']" % prop_old
+ # print(exec_str)
+ exec(exec_str)
+
+ # Reassign
+ exec_str = "item['%s'] = %s" % (prop, repr(value_eval))
+ # print(exec_str)
+ exec(exec_str)
+ self._last_prop[:] = [prop]
+
+ prop_type = type(item[prop])
+
+ prop_ui = rna_idprop_ui_prop_get(item, prop)
+
+ if prop_type in (float, int):
+
+ prop_ui['soft_min'] = prop_ui['min'] = prop_type(self.min)
+ prop_ui['soft_max'] = prop_ui['max'] = prop_type(self.max)
+
+ prop_ui['description'] = self.description
+
+ # otherwise existing buttons which reference freed
+ # memory may crash blender [#26510]
+ # context.area.tag_redraw()
+ for win in context.window_manager.windows:
+ for area in win.screen.areas:
+ area.tag_redraw()
+
+ return {'FINISHED'}
+
+ def invoke(self, context, event):
+
+ if not self.data_path:
+ self.report({'ERROR'}, "Data path not set")
+ return {'CANCELLED'}
+
+ self._last_prop = [self.property]
+
+ item = eval("context.%s" % self.data_path)
+
+ # setup defaults
+ prop_ui = rna_idprop_ui_prop_get(item, self.property, False) # dont create
+ if prop_ui:
+ self.min = prop_ui.get("min", -1000000000)
+ self.max = prop_ui.get("max", 1000000000)
+ self.description = prop_ui.get("description", "")
+
+ wm = context.window_manager
+ return wm.invoke_props_dialog(self)
+
+
+class WM_OT_properties_add(bpy.types.Operator):
+ '''Internal use (edit a property data_path)'''
+ bl_idname = "wm.properties_add"
+ bl_label = "Add Property"
+
+ data_path = rna_path
+
+ def execute(self, context):
+ item = eval("context.%s" % self.data_path)
+
+ def unique_name(names):
+ prop = 'prop'
+ prop_new = prop
+ i = 1
+ while prop_new in names:
+ prop_new = prop + str(i)
+ i += 1
+
+ return prop_new
+
+ property = unique_name(item.keys())
+
+ item[property] = 1.0
+ return {'FINISHED'}
+
+
+class WM_OT_properties_remove(bpy.types.Operator):
+ '''Internal use (edit a property data_path)'''
+ bl_idname = "wm.properties_remove"
+ bl_label = "Remove Property"
+
+ data_path = rna_path
+ property = rna_property
+
+ def execute(self, context):
+ item = eval("context.%s" % self.data_path)
+ del item[self.property]
+ return {'FINISHED'}
+
+
+class WM_OT_keyconfig_activate(bpy.types.Operator):
+ bl_idname = "wm.keyconfig_activate"
+ bl_label = "Activate Keyconfig"
+
+ filepath = StringProperty(name="File Path", maxlen=1024)
+
+ def execute(self, context):
+ bpy.utils.keyconfig_set(self.filepath)
+ return {'FINISHED'}
+
+
+class WM_OT_appconfig_default(bpy.types.Operator):
+ bl_idname = "wm.appconfig_default"
+ bl_label = "Default Application Configuration"
+
+ def execute(self, context):
+ import os
+
+ context.window_manager.keyconfigs.active = context.window_manager.keyconfigs.default
+
+ filepath = os.path.join(bpy.utils.preset_paths("interaction")[0], "blender.py")
+
+ if os.path.exists(filepath):
+ bpy.ops.script.execute_preset(filepath=filepath, menu_idname="USERPREF_MT_interaction_presets")
+
+ return {'FINISHED'}
+
+
+class WM_OT_appconfig_activate(bpy.types.Operator):
+ bl_idname = "wm.appconfig_activate"
+ bl_label = "Activate Application Configuration"
+
+ filepath = StringProperty(name="File Path", maxlen=1024)
+
+ def execute(self, context):
+ import os
+ bpy.utils.keyconfig_set(self.filepath)
+
+ filepath = self.filepath.replace("keyconfig", "interaction")
+
+ if os.path.exists(filepath):
+ bpy.ops.script.execute_preset(filepath=filepath, menu_idname="USERPREF_MT_interaction_presets")
+
+ return {'FINISHED'}
+
+
+class WM_OT_sysinfo(bpy.types.Operator):
+ '''Generate System Info'''
+ bl_idname = "wm.sysinfo"
+ bl_label = "System Info"
+
+ def execute(self, context):
+ import sys_info
+ sys_info.write_sysinfo(self)
+ return {'FINISHED'}
+
+
+class WM_OT_copy_prev_settings(bpy.types.Operator):
+ '''Copy settings from previous version'''
+ bl_idname = "wm.copy_prev_settings"
+ bl_label = "Copy Previous Settings"
+
+ def execute(self, context):
+ import os
+ import shutil
+ ver = bpy.app.version
+ ver_old = ((ver[0] * 100) + ver[1]) - 1
+ path_src = bpy.utils.resource_path('USER', ver_old // 100, ver_old % 100)
+ path_dst = bpy.utils.resource_path('USER')
+
+ if os.path.isdir(path_dst):
+ self.report({'ERROR'}, "Target path %r exists" % path_dst)
+ elif not os.path.isdir(path_src):
+ self.report({'ERROR'}, "Source path %r exists" % path_src)
+ else:
+ shutil.copytree(path_src, path_dst)
+ # dont loose users work if they open the splash later.
+ if bpy.data.is_saved is bpy.data.is_dirty is False:
+ bpy.ops.wm.read_homefile()
+ else:
+ self.report({'INFO'}, "Reload Start-Up file to restore settings.")
+ return {'FINISHED'}
+
+ return {'CANCELLED'}
+
+
+def _webbrowser_bug_fix():
+ # test for X11
+ import os
+
+ if os.environ.get("DISPLAY"):
+
+ # BSD licenced code copied from python, temp fix for bug
+ # http://bugs.python.org/issue11432, XXX == added code
+ def _invoke(self, args, remote, autoraise):
+ # XXX, added imports
+ import io
+ import subprocess
+ import time
+
+ raise_opt = []
+ if remote and self.raise_opts:
+ # use autoraise argument only for remote invocation
+ autoraise = int(autoraise)
+ opt = self.raise_opts[autoraise]
+ if opt:
+ raise_opt = [opt]
+
+ cmdline = [self.name] + raise_opt + args
+
+ if remote or self.background:
+ inout = io.open(os.devnull, "r+")
+ else:
+ # for TTY browsers, we need stdin/out
+ inout = None
+ # if possible, put browser in separate process group, so
+ # keyboard interrupts don't affect browser as well as Python
+ setsid = getattr(os, 'setsid', None)
+ if not setsid:
+ setsid = getattr(os, 'setpgrp', None)
+
+ p = subprocess.Popen(cmdline, close_fds=True, # XXX, stdin=inout,
+ stdout=(self.redirect_stdout and inout or None),
+ stderr=inout, preexec_fn=setsid)
+ if remote:
+ # wait five secons. If the subprocess is not finished, the
+ # remote invocation has (hopefully) started a new instance.
+ time.sleep(1)
+ rc = p.poll()
+ if rc is None:
+ time.sleep(4)
+ rc = p.poll()
+ if rc is None:
+ return True
+ # if remote call failed, open() will try direct invocation
+ return not rc
+ elif self.background:
+ if p.poll() is None:
+ return True
+ else:
+ return False
+ else:
+ return not p.wait()
+
+ import webbrowser
+ webbrowser.UnixBrowser._invoke = _invoke
diff --git a/release/scripts/startup/bl_ui/__init__.py b/release/scripts/startup/bl_ui/__init__.py
new file mode 100644
index 00000000000..5c565fbd300
--- /dev/null
+++ b/release/scripts/startup/bl_ui/__init__.py
@@ -0,0 +1,121 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# note, properties_animviz is a helper module only.
+
+if "bpy" in locals():
+ from imp import reload as _reload
+ for val in _modules_loaded.values():
+ _reload(val)
+_modules = (
+ "properties_animviz",
+ "properties_data_armature",
+ "properties_data_bone",
+ "properties_data_camera",
+ "properties_data_curve",
+ "properties_data_empty",
+ "properties_data_lamp",
+ "properties_data_lattice",
+ "properties_data_mesh",
+ "properties_data_metaball",
+ "properties_data_modifier",
+ "properties_game",
+ "properties_material",
+ "properties_object_constraint",
+ "properties_object",
+ "properties_particle",
+ "properties_physics_cloth",
+ "properties_physics_common",
+ "properties_physics_field",
+ "properties_physics_fluid",
+ "properties_physics_smoke",
+ "properties_physics_softbody",
+ "properties_render",
+ "properties_scene",
+ "properties_texture",
+ "properties_world",
+ "space_console",
+ "space_dopesheet",
+ "space_filebrowser",
+ "space_graph",
+ "space_image",
+ "space_info",
+ "space_logic",
+ "space_nla",
+ "space_node",
+ "space_outliner",
+ "space_sequencer",
+ "space_text",
+ "space_time",
+ "space_userpref_keymap",
+ "space_userpref",
+ "space_view3d",
+ "space_view3d_toolbar",
+)
+__import__(name=__name__, fromlist=_modules)
+_namespace = globals()
+_modules_loaded = {name: _namespace[name] for name in _modules}
+del _namespace
+
+
+import bpy
+
+
+def register():
+ bpy.utils.register_module(__name__)
+
+ # space_userprefs.py
+ from bpy.props import StringProperty, EnumProperty
+ WindowManager = bpy.types.WindowManager
+
+ WindowManager.addon_search = StringProperty(name="Search", description="Search within the selected filter")
+ WindowManager.addon_filter = EnumProperty(
+ items=[('All', "All", ""),
+ ('Enabled', "Enabled", ""),
+ ('Disabled', "Disabled", ""),
+ ('3D View', "3D View", ""),
+ ('Add Curve', "Add Curve", ""),
+ ('Add Mesh', "Add Mesh", ""),
+ ('Animation', "Animation", ""),
+ ('Development', "Development", ""),
+ ('Game Engine', "Game Engine", ""),
+ ('Import-Export', "Import-Export", ""),
+ ('Mesh', "Mesh", ""),
+ ('Object', "Object", ""),
+ ('Render', "Render", ""),
+ ('Rigging', "Rigging", ""),
+ ('Text Editor', "Text Editor", ""),
+ ('System', "System", "")
+ ],
+ name="Category",
+ description="Filter add-ons by category",
+ )
+
+ WindowManager.addon_support = EnumProperty(
+ items=[('OFFICIAL', "Official", ""),
+ ('COMMUNITY', 'Community', ""),
+ ],
+ name="Support",
+ description="Display support level", default={'OFFICIAL', 'COMMUNITY'}, options={'ENUM_FLAG'})
+ # done...
+
+
+def unregister():
+ bpy.utils.unregister_module(__name__)
diff --git a/release/scripts/ui/properties_animviz.py b/release/scripts/startup/bl_ui/properties_animviz.py
index 5f5684f5c89..eb1bbfd2fb1 100644
--- a/release/scripts/ui/properties_animviz.py
+++ b/release/scripts/startup/bl_ui/properties_animviz.py
@@ -17,11 +17,13 @@
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
-import bpy
-
# Generic Panels (Independent of DataType)
+# NOTE:
+# The specialised panel types are derived in their respective UI modules
+# dont register these classes since they are only helpers.
+
class MotionPathButtonsPanel():
bl_space_type = 'PROPERTIES'
@@ -91,16 +93,5 @@ class OnionSkinButtonsPanel():
col.label(text="Display:")
col.prop(arm, "show_only_ghost_selected", text="Selected Only")
-
-# NOTE:
-# The specialised panel types are derived in their respective UI modules
-# dont register these classes since they are only helpers.
-def register():
- pass # bpy.utils.register_module(__name__)
-
-
-def unregister():
- pass # bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
+if __name__ == "__main__": # only for live edit.
+ bpy.utils.register_module(__name__)
diff --git a/release/scripts/ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py
index 2dc23fd3493..9477dc866ab 100644
--- a/release/scripts/ui/properties_data_armature.py
+++ b/release/scripts/startup/bl_ui/properties_data_armature.py
@@ -58,24 +58,17 @@ class DATA_PT_skeleton(ArmatureButtonsPanel, bpy.types.Panel):
layout.prop(arm, "pose_position", expand=True)
- split = layout.split()
-
- col = split.column()
+ col = layout.column()
col.label(text="Layers:")
col.prop(arm, "layers", text="")
col.label(text="Protected Layers:")
col.prop(arm, "layers_protected", text="")
- col.label(text="Deform:")
-
- split = layout.split()
-
- col = split.column()
- col.prop(arm, "use_deform_vertex_groups", text="Vertex Groups")
- col.prop(arm, "use_deform_envelopes", text="Envelopes")
-
- col = split.column()
- col.prop(arm, "use_deform_preserve_volume", text="Quaternion")
+ layout.label(text="Deform:")
+ flow = layout.column_flow()
+ flow.prop(arm, "use_deform_vertex_groups", text="Vertex Groups")
+ flow.prop(arm, "use_deform_envelopes", text="Envelopes")
+ flow.prop(arm, "use_deform_preserve_volume", text="Quaternion")
class DATA_PT_display(ArmatureButtonsPanel, bpy.types.Panel):
@@ -87,7 +80,7 @@ class DATA_PT_display(ArmatureButtonsPanel, bpy.types.Panel):
ob = context.object
arm = context.armature
- layout.row().prop(arm, "draw_type", expand=True)
+ layout.prop(arm, "draw_type", expand=True)
split = layout.split()
@@ -137,10 +130,10 @@ class DATA_PT_bone_groups(ArmatureButtonsPanel, bpy.types.Panel):
col.prop(group, "color_set")
if group.color_set:
col = split.column()
- subrow = col.row(align=True)
- subrow.prop(group.colors, "normal", text="")
- subrow.prop(group.colors, "select", text="")
- subrow.prop(group.colors, "active", text="")
+ sub = col.row(align=True)
+ sub.prop(group.colors, "normal", text="")
+ sub.prop(group.colors, "select", text="")
+ sub.prop(group.colors, "active", text="")
row = layout.row()
row.active = (ob.proxy is None)
@@ -168,8 +161,7 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, bpy.types.Panel):
ob = context.object
poselib = ob.pose_library
- row = layout.row()
- row.template_ID(ob, "pose_library", new="poselib.new", unlink="poselib.unlink")
+ layout.template_ID(ob, "pose_library", new="poselib.new", unlink="poselib.unlink")
if poselib:
row = layout.row()
@@ -190,8 +182,7 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, bpy.types.Panel):
col.operator("poselib.pose_remove", icon='ZOOMOUT', text="").pose = pose_marker_active.name
col.operator("poselib.apply_pose", icon='ZOOM_SELECTED', text="").pose_index = poselib.pose_markers.active_index
- row = layout.row()
- row.operator("poselib.action_sanitise")
+ layout.operator("poselib.action_sanitise")
# TODO: this panel will soon be depreceated too
@@ -207,16 +198,15 @@ class DATA_PT_ghost(ArmatureButtonsPanel, bpy.types.Panel):
split = layout.split()
- col = split.column()
+ col = split.column(align=True)
- sub = col.column(align=True)
if arm.ghost_type == 'RANGE':
- sub.prop(arm, "ghost_frame_start", text="Start")
- sub.prop(arm, "ghost_frame_end", text="End")
- sub.prop(arm, "ghost_size", text="Step")
+ col.prop(arm, "ghost_frame_start", text="Start")
+ col.prop(arm, "ghost_frame_end", text="End")
+ col.prop(arm, "ghost_size", text="Step")
elif arm.ghost_type == 'CURRENT_FRAME':
- sub.prop(arm, "ghost_step", text="Range")
- sub.prop(arm, "ghost_size", text="Step")
+ col.prop(arm, "ghost_step", text="Range")
+ col.prop(arm, "ghost_size", text="Step")
col = split.column()
col.label(text="Display:")
@@ -236,11 +226,9 @@ class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, bpy.types.Panel):
layout = self.layout
ob = context.object
-
itasc = ob.pose.ik_param
- row = layout.row()
- row.prop(ob.pose, "ik_solver")
+ layout.prop(ob.pose, "ik_solver")
if itasc:
layout.prop(itasc, "mode", expand=True)
@@ -249,13 +237,10 @@ class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, bpy.types.Panel):
layout.label(text="Reiteration:")
layout.prop(itasc, "reiteration_method", expand=True)
- split = layout.split()
- split.active = not simulation or itasc.reiteration_method != 'NEVER'
- col = split.column()
- col.prop(itasc, "precision")
-
- col = split.column()
- col.prop(itasc, "iterations")
+ row = layout.row()
+ row.active = not simulation or itasc.reiteration_method != 'NEVER'
+ row.prop(itasc, "precision")
+ row.prop(itasc, "iterations")
if simulation:
layout.prop(itasc, "use_auto_step")
@@ -275,7 +260,10 @@ class DATA_PT_iksolver_itasc(ArmatureButtonsPanel, bpy.types.Panel):
row.prop(itasc, "damping_max", text="Damp", slider=True)
row.prop(itasc, "damping_epsilon", text="Eps", slider=True)
-from properties_animviz import MotionPathButtonsPanel, OnionSkinButtonsPanel
+from bl_ui.properties_animviz import (
+ MotionPathButtonsPanel,
+ OnionSkinButtonsPanel,
+ )
class DATA_PT_motion_paths(MotionPathButtonsPanel, bpy.types.Panel):
@@ -297,12 +285,8 @@ class DATA_PT_motion_paths(MotionPathButtonsPanel, bpy.types.Panel):
layout.separator()
split = layout.split()
-
- col = split.column()
- col.operator("pose.paths_calculate", text="Calculate Paths")
-
- col = split.column()
- col.operator("pose.paths_clear", text="Clear Paths")
+ split.operator("pose.paths_calculate", text="Calculate Paths")
+ split.operator("pose.paths_clear", text="Clear Paths")
class DATA_PT_onion_skinning(OnionSkinButtonsPanel): # , bpy.types.Panel): # inherit from panel when ready
@@ -327,13 +311,5 @@ class DATA_PT_custom_props_arm(ArmatureButtonsPanel, PropertyPanel, bpy.types.Pa
_context_path = "object.data"
_property_type = bpy.types.Armature
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_data_bone.py b/release/scripts/startup/bl_ui/properties_data_bone.py
index feca4fc2502..9fc055e9343 100644
--- a/release/scripts/ui/properties_data_bone.py
+++ b/release/scripts/startup/bl_ui/properties_data_bone.py
@@ -17,6 +17,7 @@
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
+
import bpy
from rna_prop_ui import PropertyPanel
@@ -123,7 +124,7 @@ class BONE_PT_transform_locks(BoneButtonsPanel, bpy.types.Panel):
col.active = not (bone.parent and bone.use_connect)
col = row.column()
- if pchan.rotation_mode in ('QUATERNION', 'AXIS_ANGLE'):
+ if pchan.rotation_mode in {'QUATERNION', 'AXIS_ANGLE'}:
col.prop(pchan, "lock_rotations_4d", text="Lock Rotation")
if pchan.lock_rotations_4d:
col.prop(pchan, "lock_rotation_w", text="W")
@@ -368,13 +369,5 @@ class BONE_PT_custom_props(BoneButtonsPanel, PropertyPanel, bpy.types.Panel):
else:
return "active_bone"
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index 5096af42db3..24163dc1f30 100644
--- a/release/scripts/ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -135,13 +135,5 @@ class DATA_PT_custom_props_camera(CameraButtonsPanel, PropertyPanel, bpy.types.P
_context_path = "object.data"
_property_type = bpy.types.Camera
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_data_curve.py b/release/scripts/startup/bl_ui/properties_data_curve.py
index b26b7140fd2..623daffac93 100644
--- a/release/scripts/ui/properties_data_curve.py
+++ b/release/scripts/startup/bl_ui/properties_data_curve.py
@@ -28,7 +28,7 @@ class CurveButtonsPanel():
@classmethod
def poll(cls, context):
- return (context.object and context.object.type in ('CURVE', 'SURFACE', 'FONT') and context.curve)
+ return (context.object and context.object.type in {'CURVE', 'SURFACE', 'FONT'} and context.curve)
class CurveButtonsPanelCurve(CurveButtonsPanel):
@@ -106,12 +106,12 @@ class DATA_PT_shape_curve(CurveButtonsPanel, bpy.types.Panel):
sub.prop(curve, "render_resolution_v", text="Render V")
if (is_curve or is_text):
+ col.label(text="Fill:")
sub = col.column()
sub.active = (curve.bevel_object is None)
- sub.label(text="Fill:")
sub.prop(curve, "use_fill_front")
sub.prop(curve, "use_fill_back")
- sub.prop(curve, "use_fill_deform", text="Fill Deformed")
+ col.prop(curve, "use_fill_deform", text="Fill Deformed")
col.label(text="Textures:")
col.prop(curve, "use_uv_as_generated")
@@ -312,12 +312,9 @@ class DATA_PT_font(CurveButtonsPanel, bpy.types.Panel):
col.prop(char, "use_italic")
col.prop(char, "use_underline")
- split = layout.split()
- col = split.column()
- col.prop(text, "small_caps_scale", text="Small Caps")
-
- col = split.column()
- col.prop(char, "use_small_caps")
+ row = layout.row()
+ row.prop(text, "small_caps_scale", text="Small Caps")
+ row.prop(char, "use_small_caps")
class DATA_PT_paragraph(CurveButtonsPanel, bpy.types.Panel):
@@ -394,13 +391,5 @@ class DATA_PT_custom_props_curve(CurveButtonsPanel, PropertyPanel, bpy.types.Pan
_context_path = "object.data"
_property_type = bpy.types.Curve
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_data_empty.py b/release/scripts/startup/bl_ui/properties_data_empty.py
index bb0028efec5..e46cd1270ad 100644
--- a/release/scripts/ui/properties_data_empty.py
+++ b/release/scripts/startup/bl_ui/properties_data_empty.py
@@ -39,16 +39,7 @@ class DATA_PT_empty(DataButtonsPanel, bpy.types.Panel):
ob = context.object
layout.prop(ob, "empty_draw_type", text="Display")
-
layout.prop(ob, "empty_draw_size", text="Size")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_data_lamp.py b/release/scripts/startup/bl_ui/properties_data_lamp.py
index 55781434763..36010c8b511 100644
--- a/release/scripts/ui/properties_data_lamp.py
+++ b/release/scripts/startup/bl_ui/properties_data_lamp.py
@@ -91,7 +91,7 @@ class DATA_PT_lamp(DataButtonsPanel, bpy.types.Panel):
sub.prop(lamp, "color", text="")
sub.prop(lamp, "energy")
- if lamp.type in ('POINT', 'SPOT'):
+ if lamp.type in {'POINT', 'SPOT'}:
sub.label(text="Falloff:")
sub.prop(lamp, "falloff_type", text="")
sub.prop(lamp, "distance")
@@ -195,7 +195,7 @@ class DATA_PT_shadow(DataButtonsPanel, bpy.types.Panel):
def poll(cls, context):
lamp = context.lamp
engine = context.scene.render.engine
- return (lamp and lamp.type in ('POINT', 'SUN', 'SPOT', 'AREA')) and (engine in cls.COMPAT_ENGINES)
+ return (lamp and lamp.type in {'POINT', 'SUN', 'SPOT', 'AREA'}) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -234,7 +234,7 @@ class DATA_PT_shadow(DataButtonsPanel, bpy.types.Panel):
col = split.column()
col.label(text="Sampling:")
- if lamp.type in ('POINT', 'SUN', 'SPOT'):
+ if lamp.type in {'POINT', 'SUN', 'SPOT'}:
sub = col.row()
sub.prop(lamp, "shadow_ray_samples", text="Samples")
@@ -251,26 +251,21 @@ class DATA_PT_shadow(DataButtonsPanel, bpy.types.Panel):
col.row().prop(lamp, "shadow_ray_sample_method", expand=True)
- split = layout.split()
- col = split.column()
-
if lamp.shadow_ray_sample_method == 'ADAPTIVE_QMC':
- col.prop(lamp, "shadow_adaptive_threshold", text="Threshold")
- col = split.column()
+ layout.prop(lamp, "shadow_adaptive_threshold", text="Threshold")
if lamp.type == 'AREA' and lamp.shadow_ray_sample_method == 'CONSTANT_JITTERED':
- col = split.column()
- col = split.column()
- col.prop(lamp, "use_umbra")
- col.prop(lamp, "use_dither")
- col.prop(lamp, "use_jitter")
+ row = layout.row()
+ row.prop(lamp, "use_umbra")
+ row.prop(lamp, "use_dither")
+ row.prop(lamp, "use_jitter")
elif lamp.shadow_method == 'BUFFER_SHADOW':
col = layout.column()
col.label(text="Buffer Type:")
col.row().prop(lamp, "shadow_buffer_type", expand=True)
- if lamp.shadow_buffer_type in ('REGULAR', 'HALFWAY', 'DEEP'):
+ if lamp.shadow_buffer_type in {'REGULAR', 'HALFWAY', 'DEEP'}:
split = layout.split()
col = split.column()
@@ -318,13 +313,11 @@ class DATA_PT_area(DataButtonsPanel, bpy.types.Panel):
return (lamp and lamp.type == 'AREA') and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
- lamp = context.lamp
-
layout = self.layout
- split = layout.split()
- col = split.column()
+ lamp = context.lamp
+ col = layout.column()
col.row().prop(lamp, "shape", expand=True)
sub = col.row(align=True)
@@ -379,7 +372,7 @@ class DATA_PT_falloff_curve(DataButtonsPanel, bpy.types.Panel):
lamp = context.lamp
engine = context.scene.render.engine
- return (lamp and lamp.type in ('POINT', 'SPOT') and lamp.falloff_type == 'CUSTOM_CURVE') and (engine in cls.COMPAT_ENGINES)
+ return (lamp and lamp.type in {'POINT', 'SPOT'} and lamp.falloff_type == 'CUSTOM_CURVE') and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
lamp = context.lamp
@@ -392,13 +385,5 @@ class DATA_PT_custom_props_lamp(DataButtonsPanel, PropertyPanel, bpy.types.Panel
_context_path = "object.data"
_property_type = bpy.types.Lamp
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_data_lattice.py b/release/scripts/startup/bl_ui/properties_data_lattice.py
index 6bdb36d3520..cd719b6fe84 100644
--- a/release/scripts/ui/properties_data_lattice.py
+++ b/release/scripts/startup/bl_ui/properties_data_lattice.py
@@ -59,23 +59,17 @@ class DATA_PT_lattice(DataButtonsPanel, bpy.types.Panel):
lat = context.lattice
- split = layout.split()
- col = split.column()
- col.prop(lat, "points_u")
- col = split.column()
- col.prop(lat, "interpolation_type_u", text="")
-
- split = layout.split()
- col = split.column()
- col.prop(lat, "points_v")
- col = split.column()
- col.prop(lat, "interpolation_type_v", text="")
-
- split = layout.split()
- col = split.column()
- col.prop(lat, "points_w")
- col = split.column()
- col.prop(lat, "interpolation_type_w", text="")
+ row = layout.row()
+ row.prop(lat, "points_u")
+ row.prop(lat, "interpolation_type_u", text="")
+
+ row = layout.row()
+ row.prop(lat, "points_v")
+ row.prop(lat, "interpolation_type_v", text="")
+
+ row = layout.row()
+ row.prop(lat, "points_w")
+ row.prop(lat, "interpolation_type_w", text="")
row = layout.row()
row.prop(lat, "use_outside")
@@ -87,13 +81,5 @@ class DATA_PT_custom_props_lattice(DataButtonsPanel, PropertyPanel, bpy.types.Pa
_context_path = "object.data"
_property_type = bpy.types.Lattice
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index 5c160a577e4..b1d1789fadd 100644
--- a/release/scripts/ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -94,9 +94,7 @@ class DATA_PT_normals(MeshButtonsPanel, bpy.types.Panel):
sub.active = mesh.use_auto_smooth
sub.prop(mesh, "auto_smooth_angle", text="Angle")
- col = split.column()
-
- col.prop(mesh, "show_double_sided")
+ split.prop(mesh, "show_double_sided")
class DATA_PT_settings(MeshButtonsPanel, bpy.types.Panel):
@@ -120,7 +118,7 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, bpy.types.Panel):
def poll(cls, context):
engine = context.scene.render.engine
obj = context.object
- return (obj and obj.type in ('MESH', 'LATTICE') and (engine in cls.COMPAT_ENGINES))
+ return (obj and obj.type in {'MESH', 'LATTICE'} and (engine in cls.COMPAT_ENGINES))
def draw(self, context):
layout = self.layout
@@ -169,7 +167,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, bpy.types.Panel):
def poll(cls, context):
engine = context.scene.render.engine
obj = context.object
- return (obj and obj.type in ('MESH', 'LATTICE', 'CURVE', 'SURFACE') and (engine in cls.COMPAT_ENGINES))
+ return (obj and obj.type in {'MESH', 'LATTICE', 'CURVE', 'SURFACE'} and (engine in cls.COMPAT_ENGINES))
def draw(self, context):
layout = self.layout
@@ -190,7 +188,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, bpy.types.Panel):
rows = 2
if kb:
rows = 5
- row.template_list(key, "keys", ob, "active_shape_key_index", rows=rows)
+ row.template_list(key, "key_blocks", ob, "active_shape_key_index", rows=rows)
col = row.column()
@@ -245,7 +243,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, bpy.types.Panel):
col.active = enable_edit_value
col.label(text="Blend:")
col.prop_search(kb, "vertex_group", ob, "vertex_groups", text="")
- col.prop_search(kb, "relative_key", key, "keys", text="")
+ col.prop_search(kb, "relative_key", key, "key_blocks", text="")
else:
row = layout.row()
@@ -352,13 +350,5 @@ class DATA_PT_custom_props_mesh(MeshButtonsPanel, PropertyPanel, bpy.types.Panel
_context_path = "object.data"
_property_type = bpy.types.Mesh
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_data_metaball.py b/release/scripts/startup/bl_ui/properties_data_metaball.py
index cf7aa8c08fd..81ba15d6f40 100644
--- a/release/scripts/ui/properties_data_metaball.py
+++ b/release/scripts/startup/bl_ui/properties_data_metaball.py
@@ -96,7 +96,7 @@ class DATA_PT_metaball_element(DataButtonsPanel, bpy.types.Panel):
col = split.column(align=True)
- if metaelem.type in ('CUBE', 'ELLIPSOID'):
+ if metaelem.type in {'CUBE', 'ELLIPSOID'}:
col.label(text="Size:")
col.prop(metaelem, "size_x", text="X")
col.prop(metaelem, "size_y", text="Y")
@@ -117,13 +117,5 @@ class DATA_PT_custom_props_metaball(DataButtonsPanel, PropertyPanel, bpy.types.P
_context_path = "object.data"
_property_type = bpy.types.MetaBall
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index c84584831a6..0e1bd870e7d 100644
--- a/release/scripts/ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -59,23 +59,16 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
col.prop(md, "use_vertex_groups", text="Vertex Groups")
col.prop(md, "use_bone_envelopes", text="Bone Envelopes")
- split = layout.split()
+ layout.separator()
- col = split.split()
- col.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
- sub = col.column()
+ row = layout.row()
+ row.prop_search(md, "vertex_group", ob, "vertex_groups", text="")
+ sub = row.row()
sub.active = bool(md.vertex_group)
sub.prop(md, "invert_vertex_group")
- col = layout.column()
- col.prop(md, "use_multi_modifier")
-
- def NGONINTERP(self, layout, ob, md):
- split = layout.split()
-
- col = split.column()
- col.prop(md, "resolution", text="Res")
-
+ layout.prop(md, "use_multi_modifier")
+
def ARRAY(self, layout, ob, md):
layout.prop(md, "fit_type")
@@ -119,9 +112,8 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
layout.separator()
- col = layout.column()
- col.prop(md, "start_cap")
- col.prop(md, "end_cap")
+ layout.prop(md, "start_cap")
+ layout.prop(md, "end_cap")
def BEVEL(self, layout, ob, md):
split = layout.split()
@@ -236,13 +228,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
layout.separator()
- split = layout.split()
-
- col = split.column()
- col.prop(md, "mid_level")
-
- col = split.column()
- col.prop(md, "strength")
+ row = layout.row()
+ row.prop(md, "mid_level")
+ row.prop(md, "strength")
def EDGE_SPLIT(self, layout, ob, md):
split = layout.split()
@@ -253,8 +241,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
sub.active = md.use_edge_angle
sub.prop(md, "split_angle")
- col = split.column()
- col.prop(md, "use_edge_sharp", text="Sharp Edges")
+ split.prop(md, "use_edge_sharp", text="Sharp Edges")
def EXPLODE(self, layout, ob, md):
split = layout.split()
@@ -342,6 +329,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
def MESH_DEFORM(self, layout, ob, md):
split = layout.split()
+
col = split.column()
sub = col.column()
sub.label(text="Object:")
@@ -362,13 +350,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
else:
layout.operator("object.meshdeform_bind", text="Bind")
- split = layout.split()
-
- col = split.column()
- col.prop(md, "precision")
-
- col = split.column()
- col.prop(md, "use_dynamic_bind")
+ row = layout.row()
+ row.prop(md, "precision")
+ row.prop(md, "use_dynamic_bind")
def MIRROR(self, layout, ob, md):
split = layout.split(percentage=0.25)
@@ -552,7 +536,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
col.label(text="Deform:")
col.prop(md, "factor")
col.prop(md, "limits", slider=True)
- if md.deform_method in ('TAPER', 'STRETCH'):
+ if md.deform_method in {'TAPER', 'STRETCH'}:
col.prop(md, "lock_x")
col.prop(md, "lock_y")
@@ -589,6 +573,7 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
col.prop(md, "edge_crease_inner", text="Inner")
col.prop(md, "edge_crease_outer", text="Outer")
col.prop(md, "edge_crease_rim", text="Rim")
+ col.label(text="Material Index Offset:")
col = split.column()
@@ -602,8 +587,13 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
col.prop(md, "use_rim")
colsub = col.column()
+
+ colsub.label()
+ rowsub = colsub.split(align=True, percentage=0.4)
+ rowsub.prop(md, "material_offset", text="")
+ colsub = rowsub.row()
colsub.active = md.use_rim
- colsub.prop(md, "use_rim_material")
+ colsub.prop(md, "material_offset_rim", text="Rim")
def SUBSURF(self, layout, ob, md):
layout.row().prop(md, "subdivision_type", expand=True)
@@ -710,13 +700,5 @@ class DATA_PT_modifiers(ModifierButtonsPanel, bpy.types.Panel):
col.prop(md, "width", slider=True)
col.prop(md, "narrowness", slider=True)
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py
index 2717e315ee8..a151234e184 100644
--- a/release/scripts/ui/properties_game.py
+++ b/release/scripts/startup/bl_ui/properties_game.py
@@ -47,7 +47,7 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel, bpy.types.Panel):
layout.separator()
#if game.physics_type == 'DYNAMIC':
- if game.physics_type in ('DYNAMIC', 'RIGID_BODY'):
+ if game.physics_type in {'DYNAMIC', 'RIGID_BODY'}:
split = layout.split()
col = split.column()
@@ -56,7 +56,7 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel, bpy.types.Panel):
col.prop(ob, "hide_render", text="Invisible") # out of place but useful
col = split.column()
- col.prop(game, "use_material_physics")
+ col.prop(game, "use_material_physics_fh")
col.prop(game, "use_rotate_from_normal")
col.prop(game, "use_sleep")
@@ -163,7 +163,7 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel, bpy.types.Panel):
subsub.active = game.use_anisotropic_friction
subsub.prop(game, "friction_coefficients", text="", slider=True)
- elif game.physics_type in ('SENSOR', 'INVISIBLE', 'NO_COLLISION', 'OCCLUDE'):
+ elif game.physics_type in {'SENSOR', 'INVISIBLE', 'NO_COLLISION', 'OCCLUDE'}:
layout.prop(ob, "hide_render", text="Invisible")
@@ -175,7 +175,7 @@ class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, bpy.types.Panel):
def poll(cls, context):
game = context.object.game
rd = context.scene.render
- return (game.physics_type in ('DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC')) and (rd.engine in cls.COMPAT_ENGINES)
+ return (game.physics_type in {'DYNAMIC', 'RIGID_BODY', 'SENSOR', 'SOFT_BODY', 'STATIC'}) and (rd.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
game = context.active_object.game
@@ -190,13 +190,9 @@ class PHYSICS_PT_game_collision_bounds(PhysicsButtonsPanel, bpy.types.Panel):
layout.active = game.use_collision_bounds
layout.prop(game, "collision_bounds_type", text="Bounds")
- split = layout.split()
-
- col = split.column()
- col.prop(game, "collision_margin", text="Margin", slider=True)
-
- col = split.column()
- col.prop(game, "use_collision_compound", text="Compound")
+ row = layout.row()
+ row.prop(game, "collision_margin", text="Margin", slider=True)
+ row.prop(game, "use_collision_compound", text="Compound")
class RenderButtonsPanel():
@@ -360,7 +356,7 @@ class RENDER_PT_game_display(RenderButtonsPanel, bpy.types.Panel):
flow.prop(gs, "show_framerate_profile", text="Framerate and Profile")
flow.prop(gs, "show_physics_visualization", text="Physics Visualization")
flow.prop(gs, "use_deprecation_warnings")
- flow.prop(gs, "show_mouse")
+ flow.prop(gs, "show_mouse", text="Mouse Cursor")
class RENDER_PT_game_sound(RenderButtonsPanel, bpy.types.Panel):
@@ -422,13 +418,9 @@ class WORLD_PT_game_world(WorldButtonsPanel, bpy.types.Panel):
world = context.world
- split = layout.split()
-
- col = split.column()
- col.prop(world, "horizon_color")
-
- col = split.column()
- col.prop(world, "ambient_color")
+ row = layout.row()
+ row.column().prop(world, "horizon_color")
+ row.column().prop(world, "ambient_color")
class WORLD_PT_game_mist(WorldButtonsPanel, bpy.types.Panel):
@@ -451,13 +443,10 @@ class WORLD_PT_game_mist(WorldButtonsPanel, bpy.types.Panel):
world = context.world
layout.active = world.mist_settings.use_mist
- split = layout.split()
- col = split.column()
- col.prop(world.mist_settings, "start")
-
- col = split.column()
- col.prop(world.mist_settings, "depth")
+ row = layout.row()
+ row.prop(world.mist_settings, "start")
+ row.prop(world.mist_settings, "depth")
class WORLD_PT_game_physics(WorldButtonsPanel, bpy.types.Panel):
@@ -508,13 +497,5 @@ class WORLD_PT_game_physics(WorldButtonsPanel, bpy.types.Panel):
col.label(text="Logic Steps:")
col.prop(gs, "logic_step_max", text="Max")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py
index 272862c3187..0443a351afa 100644
--- a/release/scripts/ui/properties_material.py
+++ b/release/scripts/startup/bl_ui/properties_material.py
@@ -161,13 +161,13 @@ class MATERIAL_PT_pipeline(MaterialButtonsPanel, bpy.types.Panel):
def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return mat and (not simple_material(mat)) and (mat.type in ('SURFACE', 'WIRE', 'VOLUME')) and (engine in cls.COMPAT_ENGINES)
+ return mat and (not simple_material(mat)) and (mat.type in {'SURFACE', 'WIRE', 'VOLUME'}) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self. layout
mat = context.material
- mat_type = mat.type in ('SURFACE', 'WIRE')
+ mat_type = mat.type in {'SURFACE', 'WIRE'}
row = layout.row()
row.active = mat_type
@@ -209,7 +209,7 @@ class MATERIAL_PT_diffuse(MaterialButtonsPanel, bpy.types.Panel):
def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return check_material(mat) and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -249,15 +249,11 @@ class MATERIAL_PT_diffuse(MaterialButtonsPanel, bpy.types.Panel):
layout.template_color_ramp(mat, "diffuse_ramp", expand=True)
layout.separator()
- split = layout.split()
-
- col = split.column()
- col.prop(mat, "diffuse_ramp_input", text="Input")
-
- col = split.column()
- col.prop(mat, "diffuse_ramp_blend", text="Blend")
row = layout.row()
- row.prop(mat, "diffuse_ramp_factor", text="Factor")
+ row.prop(mat, "diffuse_ramp_input", text="Input")
+ row.prop(mat, "diffuse_ramp_blend", text="Blend")
+
+ layout.prop(mat, "diffuse_ramp_factor", text="Factor")
class MATERIAL_PT_specular(MaterialButtonsPanel, bpy.types.Panel):
@@ -268,7 +264,7 @@ class MATERIAL_PT_specular(MaterialButtonsPanel, bpy.types.Panel):
def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return check_material(mat) and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -288,7 +284,7 @@ class MATERIAL_PT_specular(MaterialButtonsPanel, bpy.types.Panel):
col.prop(mat, "use_specular_ramp", text="Ramp")
col = layout.column()
- if mat.specular_shader in ('COOKTORR', 'PHONG'):
+ if mat.specular_shader in {'COOKTORR', 'PHONG'}:
col.prop(mat, "specular_hardness", text="Hardness")
elif mat.specular_shader == 'BLINN':
row = col.row()
@@ -305,16 +301,12 @@ class MATERIAL_PT_specular(MaterialButtonsPanel, bpy.types.Panel):
layout.separator()
layout.template_color_ramp(mat, "specular_ramp", expand=True)
layout.separator()
- split = layout.split()
-
- col = split.column()
- col.prop(mat, "specular_ramp_input", text="Input")
-
- col = split.column()
- col.prop(mat, "specular_ramp_blend", text="Blend")
row = layout.row()
- row.prop(mat, "specular_ramp_factor", text="Factor")
+ row.prop(mat, "specular_ramp_input", text="Input")
+ row.prop(mat, "specular_ramp_blend", text="Blend")
+
+ layout.prop(mat, "specular_ramp_factor", text="Factor")
class MATERIAL_PT_shading(MaterialButtonsPanel, bpy.types.Panel):
@@ -325,14 +317,14 @@ class MATERIAL_PT_shading(MaterialButtonsPanel, bpy.types.Panel):
def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return check_material(mat) and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
mat = active_node_mat(context.material)
- if mat.type in ('SURFACE', 'WIRE'):
+ if mat.type in {'SURFACE', 'WIRE'}:
split = layout.split()
col = split.column()
@@ -360,7 +352,7 @@ class MATERIAL_PT_transp(MaterialButtonsPanel, bpy.types.Panel):
def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return check_material(mat) and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
mat = context.material
@@ -381,11 +373,12 @@ class MATERIAL_PT_transp(MaterialButtonsPanel, bpy.types.Panel):
row.prop(mat, "transparency_method", expand=True)
split = layout.split()
+ split.active = base_mat.use_transparency
col = split.column()
col.prop(mat, "alpha")
row = col.row()
- row.active = base_mat.use_transparency and (not mat.use_shadeless)
+ row.active = (base_mat.transparency_method != 'MASK') and (not mat.use_shadeless)
row.prop(mat, "specular_alpha", text="Specular")
col = split.column()
@@ -425,7 +418,7 @@ class MATERIAL_PT_mirror(MaterialButtonsPanel, bpy.types.Panel):
def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return check_material(mat) and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
raym = active_node_mat(context.material).raytrace_mirror
@@ -483,7 +476,7 @@ class MATERIAL_PT_sss(MaterialButtonsPanel, bpy.types.Panel):
def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return check_material(mat) and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
mat = active_node_mat(context.material)
@@ -627,16 +620,20 @@ class MATERIAL_PT_physics(MaterialButtonsPanel, bpy.types.Panel):
phys = context.material.physics # dont use node material
split = layout.split()
+ row = split.row()
+ row.prop(phys, "friction")
+ row.prop(phys, "elasticity", slider=True)
- col = split.column()
- col.prop(phys, "distance")
- col.prop(phys, "friction")
- col.prop(phys, "use_normal_align")
+ row = layout.row()
+ row.label(text="Force Field:")
- col = split.column()
- col.prop(phys, "force", slider=True)
- col.prop(phys, "elasticity", slider=True)
- col.prop(phys, "damping", slider=True)
+ row = layout.row()
+ row.prop(phys, "fh_force")
+ row.prop(phys, "fh_damping", slider=True)
+
+ row = layout.row()
+ row.prop(phys, "fh_distance")
+ row.prop(phys, "use_fh_normal")
class MATERIAL_PT_strand(MaterialButtonsPanel, bpy.types.Panel):
@@ -648,7 +645,7 @@ class MATERIAL_PT_strand(MaterialButtonsPanel, bpy.types.Panel):
def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return mat and (mat.type in ('SURFACE', 'WIRE', 'HALO')) and (engine in cls.COMPAT_ENGINES)
+ return mat and (mat.type in {'SURFACE', 'WIRE', 'HALO'}) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -694,7 +691,7 @@ class MATERIAL_PT_options(MaterialButtonsPanel, bpy.types.Panel):
def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return check_material(mat) and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -742,7 +739,7 @@ class MATERIAL_PT_shadow(MaterialButtonsPanel, bpy.types.Panel):
def poll(cls, context):
mat = context.material
engine = context.scene.render.engine
- return check_material(mat) and (mat.type in ('SURFACE', 'WIRE')) and (engine in cls.COMPAT_ENGINES)
+ return check_material(mat) and (mat.type in {'SURFACE', 'WIRE'}) and (engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
@@ -755,10 +752,13 @@ class MATERIAL_PT_shadow(MaterialButtonsPanel, bpy.types.Panel):
col = split.column()
col.prop(mat, "use_shadows", text="Receive")
col.prop(mat, "use_transparent_shadows", text="Receive Transparent")
- col.prop(mat, "use_only_shadow", text="Shadows Only")
if simple_material(base_mat):
col.prop(mat, "use_cast_shadows_only", text="Cast Only")
col.prop(mat, "shadow_cast_alpha", text="Casting Alpha")
+ col.prop(mat, "use_only_shadow", text="Shadows Only")
+ sub = col.column()
+ sub.active = mat.use_only_shadow
+ sub.prop(mat, "shadow_only_type", text="")
col = split.column()
if simple_material(base_mat):
@@ -826,12 +826,9 @@ class MATERIAL_PT_volume_density(VolumeButtonsPanel, bpy.types.Panel):
vol = context.material.volume # dont use node material
- split = layout.split()
- col = split.column()
- col.prop(vol, "density")
-
- col = split.column()
- col.prop(vol, "density_scale")
+ row = layout.row()
+ row.prop(vol, "density")
+ row.prop(vol, "density_scale")
class MATERIAL_PT_volume_shading(VolumeButtonsPanel, bpy.types.Panel):
@@ -881,7 +878,7 @@ class MATERIAL_PT_volume_lighting(VolumeButtonsPanel, bpy.types.Panel):
sub = col.column()
sub.active = vol.use_light_cache
sub.prop(vol, "cache_resolution")
- elif vol.light_method in ('MULTIPLE_SCATTERING', 'SHADED_PLUS_MULTIPLE_SCATTERING'):
+ elif vol.light_method in {'MULTIPLE_SCATTERING', 'SHADED_PLUS_MULTIPLE_SCATTERING'}:
sub = col.column()
sub.enabled = True
sub.active = False
@@ -971,13 +968,5 @@ class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, bpy.types.Pa
_context_path = "material"
_property_type = bpy.types.Material
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py
index 46455888e7b..ae66642e903 100644
--- a/release/scripts/ui/properties_object.py
+++ b/release/scripts/startup/bl_ui/properties_object.py
@@ -40,8 +40,7 @@ class OBJECT_PT_context_object(ObjectButtonsPanel, bpy.types.Panel):
layout.template_ID(space, "pin_id")
else:
row = layout.row()
- row.label(text="", icon='OBJECT_DATA')
- row.prop(ob, "name", text="")
+ row.template_ID(context.scene.objects, "active")
class OBJECT_PT_transform(ObjectButtonsPanel, bpy.types.Panel):
@@ -111,7 +110,7 @@ class OBJECT_PT_transform_locks(ObjectButtonsPanel, bpy.types.Panel):
col.prop(ob, "lock_location", text="Location")
col = row.column()
- if ob.rotation_mode in ('QUATERNION', 'AXIS_ANGLE'):
+ if ob.rotation_mode in {'QUATERNION', 'AXIS_ANGLE'}:
col.prop(ob, "lock_rotations_4d", text="Rotation")
if ob.lock_rotations_4d:
col.prop(ob, "lock_rotation_w", text="W")
@@ -249,13 +248,10 @@ class OBJECT_PT_duplication(ObjectButtonsPanel, bpy.types.Panel):
layout.prop(ob, "use_dupli_vertices_rotation", text="Rotation")
elif ob.dupli_type == 'FACES':
- split = layout.split()
-
- col = split.column()
- col.prop(ob, "use_dupli_faces_scale", text="Scale")
- col = split.column()
- col.prop(ob, "dupli_faces_scale", text="Inherit Scale")
+ row = layout.row()
+ row.prop(ob, "use_dupli_faces_scale", text="Scale")
+ row.prop(ob, "dupli_faces_scale", text="Inherit Scale")
elif ob.dupli_type == 'GROUP':
layout.prop(ob, "dupli_group", text="Group")
@@ -291,7 +287,11 @@ class OBJECT_PT_animation(ObjectButtonsPanel, bpy.types.Panel):
col.prop(ob, "track_axis", text="Axis")
col.prop(ob, "up_axis", text="Up Axis")
-from properties_animviz import MotionPathButtonsPanel, OnionSkinButtonsPanel
+
+from bl_ui.properties_animviz import (
+ MotionPathButtonsPanel,
+ OnionSkinButtonsPanel,
+ )
class OBJECT_PT_motion_paths(MotionPathButtonsPanel, bpy.types.Panel):
@@ -311,13 +311,9 @@ class OBJECT_PT_motion_paths(MotionPathButtonsPanel, bpy.types.Panel):
layout.separator()
- split = layout.split()
-
- col = split.column()
- col.operator("object.paths_calculate", text="Calculate Paths")
-
- col = split.column()
- col.operator("object.paths_clear", text="Clear Paths")
+ row = layout.row()
+ row.operator("object.paths_calculate", text="Calculate Paths")
+ row.operator("object.paths_clear", text="Clear Paths")
class OBJECT_PT_onion_skinning(OnionSkinButtonsPanel): # , bpy.types.Panel): # inherit from panel when ready
@@ -339,13 +335,5 @@ class OBJECT_PT_custom_props(ObjectButtonsPanel, PropertyPanel, bpy.types.Panel)
_context_path = "object"
_property_type = bpy.types.Object
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_object_constraint.py b/release/scripts/startup/bl_ui/properties_object_constraint.py
index 4b9c2885277..59f9ca16d1a 100644
--- a/release/scripts/ui/properties_object_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_object_constraint.py
@@ -34,7 +34,7 @@ class ConstraintButtonsPanel():
# match enum type to our functions, avoids a lookup table.
getattr(self, con.type)(context, box, con)
- if con.type not in ('RIGID_BODY_JOINT', 'NULL'):
+ if con.type not in {'RIGID_BODY_JOINT', 'NULL'}:
box.prop(con, "influence")
def space_template(self, layout, con, target=True, owner=True):
@@ -65,7 +65,7 @@ class ConstraintButtonsPanel():
row = layout.row()
row.label(text="Head/Tail:")
row.prop(con, "head_tail", text="")
- elif con.target.type in ('MESH', 'LATTICE'):
+ elif con.target.type in {'MESH', 'LATTICE'}:
layout.prop_search(con, "subtarget", con.target, "vertex_groups", text="Vertex Group")
def ik_template(self, layout, con):
@@ -112,13 +112,9 @@ class ConstraintButtonsPanel():
col.prop(con, "use_scale_y", text="Y")
col.prop(con, "use_scale_z", text="Z")
- split = layout.split()
-
- col = split.column()
- col.operator("constraint.childof_set_inverse")
-
- col = split.column()
- col.operator("constraint.childof_clear_inverse")
+ row = layout.row()
+ row.operator("constraint.childof_set_inverse")
+ row.operator("constraint.childof_clear_inverse")
def TRACK_TO(self, context, layout, con):
self.target_template(layout, con)
@@ -127,13 +123,9 @@ class ConstraintButtonsPanel():
row.label(text="To:")
row.prop(con, "track_axis", expand=True)
- split = layout.split()
-
- col = split.column()
- col.prop(con, "up_axis", text="Up")
-
- col = split.column()
- col.prop(con, "use_target_z")
+ row = layout.row()
+ row.prop(con, "up_axis", text="Up")
+ row.prop(con, "use_target_z")
self.space_template(layout, con)
@@ -212,6 +204,7 @@ class ConstraintButtonsPanel():
self.ik_template(layout, con)
layout.prop(con, "limit_mode")
+
row = layout.row()
row.prop(con, "weight", text="Weight", slider=True)
row.prop(con, "distance", text="Distance", slider=True)
@@ -486,16 +479,11 @@ class ConstraintButtonsPanel():
def STRETCH_TO(self, context, layout, con):
self.target_template(layout, con)
- split = layout.split()
-
- col = split.column()
- col.prop(con, "rest_length", text="Rest Length")
-
- col = split.column()
- col.operator("constraint.stretchto_reset", text="Reset")
+ row = layout.row()
+ row.prop(con, "rest_length", text="Rest Length")
+ row.operator("constraint.stretchto_reset", text="Reset")
- col = layout.column()
- col.prop(con, "bulge", text="Volume Variation")
+ layout.prop(con, "bulge", text="Volume Variation")
row = layout.row()
row.label(text="Volume:")
@@ -507,13 +495,9 @@ class ConstraintButtonsPanel():
def FLOOR(self, context, layout, con):
self.target_template(layout, con)
- split = layout.split()
-
- col = split.column()
- col.prop(con, "use_sticky")
-
- col = split.column()
- col.prop(con, "use_rotation")
+ row = layout.row()
+ row.prop(con, "use_sticky")
+ row.prop(con, "use_rotation")
layout.prop(con, "offset")
@@ -529,13 +513,9 @@ class ConstraintButtonsPanel():
layout.prop(con, "pivot_type")
layout.prop(con, "child")
- split = layout.split()
-
- col = split.column()
- col.prop(con, "use_linked_collision", text="Linked Collision")
-
- col = split.column()
- col.prop(con, "show_pivot", text="Display Pivot")
+ row = layout.row()
+ row.prop(con, "use_linked_collision", text="Linked Collision")
+ row.prop(con, "show_pivot", text="Display Pivot")
split = layout.split()
@@ -555,15 +535,23 @@ class ConstraintButtonsPanel():
layout.label(text="Limits:")
split = layout.split()
- col = split.column(align=True)
- col.prop(con, "use_angular_limit_x", text="Angular X")
- col.prop(con, "use_angular_limit_y", text="Angular Y")
- col.prop(con, "use_angular_limit_z", text="Angular Z")
+ col = split.column()
+ col.prop(con, "use_angular_limit_x", text="Angle X")
+ sub = col.column()
+ sub.active = con.use_angular_limit_x
+ sub.prop(con, "limit_angle_max_x", text="")
col = split.column()
- col.prop(con, "limit_cone_min", text="")
+ col.prop(con, "use_angular_limit_y", text="Angle Y")
+ sub = col.column()
+ sub.active = con.use_angular_limit_y
+ sub.prop(con, "limit_angle_max_y", text="")
+
col = split.column()
- col.prop(con, "limit_cone_max", text="")
+ col.prop(con, "use_angular_limit_z", text="Angle Z")
+ sub = col.column()
+ sub.active = con.use_angular_limit_z
+ sub.prop(con, "limit_angle_max_z", text="")
elif con.pivot_type == 'GENERIC_6_DOF':
layout.label(text="Limits:")
@@ -571,16 +559,62 @@ class ConstraintButtonsPanel():
col = split.column(align=True)
col.prop(con, "use_limit_x", text="X")
+ sub = col.column()
+ sub.active = con.use_limit_x
+ sub.prop(con, "limit_min_x", text="Min")
+ sub.prop(con, "limit_max_x", text="Max")
+
+ col = split.column(align=True)
col.prop(con, "use_limit_y", text="Y")
+ sub = col.column()
+ sub.active = con.use_limit_y
+ sub.prop(con, "limit_min_y", text="Min")
+ sub.prop(con, "limit_max_y", text="Max")
+
+ col = split.column(align=True)
col.prop(con, "use_limit_z", text="Z")
- col.prop(con, "use_angular_limit_x", text="Angular X")
- col.prop(con, "use_angular_limit_y", text="Angular Y")
- col.prop(con, "use_angular_limit_z", text="Angular Z")
+ sub = col.column()
+ sub.active = con.use_limit_z
+ sub.prop(con, "limit_min_z", text="Min")
+ sub.prop(con, "limit_max_z", text="Max")
- col = split.column()
- col.prop(con, "limit_generic_min", text="")
- col = split.column()
- col.prop(con, "limit_generic_max", text="")
+ split = layout.split()
+
+ col = split.column(align=True)
+ col.prop(con, "use_angular_limit_x", text="Angle X")
+ sub = col.column()
+ sub.active = con.use_angular_limit_x
+ sub.prop(con, "limit_angle_min_x", text="Min")
+ sub.prop(con, "limit_angle_max_x", text="Max")
+
+ col = split.column(align=True)
+ col.prop(con, "use_angular_limit_y", text="Angle Y")
+ sub = col.column()
+ sub.active = con.use_angular_limit_y
+ sub.prop(con, "limit_angle_min_y", text="Min")
+ sub.prop(con, "limit_angle_max_y", text="Max")
+
+ col = split.column(align=True)
+ col.prop(con, "use_angular_limit_z", text="Angle Z")
+ sub = col.column()
+ sub.active = con.use_angular_limit_z
+ sub.prop(con, "limit_angle_min_z", text="Min")
+ sub.prop(con, "limit_angle_max_z", text="Max")
+
+ elif con.pivot_type == 'HINGE':
+ layout.label(text="Limits:")
+ split = layout.split()
+
+ row = split.row(align=True)
+ col = row.column()
+ col.prop(con, "use_angular_limit_x", text="Angle X")
+
+ col = row.column()
+ col.active = con.use_angular_limit_x
+ col.prop(con, "limit_angle_min_x", text="Min")
+ col = row.column()
+ col.active = con.use_angular_limit_x
+ col.prop(con, "limit_angle_max_x", text="Max")
def CLAMP_TO(self, context, layout, con):
self.target_template(layout, con)
@@ -589,8 +623,7 @@ class ConstraintButtonsPanel():
row.label(text="Main Axis:")
row.prop(con, "main_axis", expand=True)
- row = layout.row()
- row.prop(con, "use_cyclic")
+ layout.prop(con, "use_cyclic")
def TRANSFORM(self, context, layout, con):
self.target_template(layout, con)
@@ -747,13 +780,5 @@ class BONE_PT_constraints(ConstraintButtonsPanel, bpy.types.Panel):
for con in context.pose_bone.constraints:
self.draw_constraint(context, con)
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py
index 34dd6ab77de..5037308c6fd 100644
--- a/release/scripts/ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -20,17 +20,19 @@
import bpy
from rna_prop_ui import PropertyPanel
-from properties_physics_common import point_cache_ui
-from properties_physics_common import effector_weights_ui
-from properties_physics_common import basic_force_field_settings_ui
-from properties_physics_common import basic_force_field_falloff_ui
+from bl_ui.properties_physics_common import (
+ point_cache_ui,
+ effector_weights_ui,
+ basic_force_field_settings_ui,
+ basic_force_field_falloff_ui,
+ )
def particle_panel_enabled(context, psys):
- if psys == None:
+ if psys is None:
return True
phystype = psys.settings.physics_type
- if psys.settings.type in ('EMITTER', 'REACTOR') and phystype in ('NO', 'KEYED'):
+ if psys.settings.type in {'EMITTER', 'REACTOR'} and phystype in {'NO', 'KEYED'}:
return True
else:
return (psys.point_cache.is_baked is False) and (not psys.is_edited) and (not context.particle_system_editable)
@@ -96,10 +98,10 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, bpy.types.Panel):
col.operator("object.particle_system_add", icon='ZOOMIN', text="")
col.operator("object.particle_system_remove", icon='ZOOMOUT', text="")
- if psys == None:
+ if psys is None:
part = particle_get_settings(context)
- if part == None:
+ if part is None:
return
layout.template_ID(context.space_data, "pin_id")
@@ -190,7 +192,7 @@ class PARTICLE_PT_emission(ParticleButtonsPanel, bpy.types.Panel):
if settings.is_fluid:
return False
if particle_panel_poll(PARTICLE_PT_emission, context):
- return psys == None or not context.particle_system.point_cache.use_external
+ return psys is None or not context.particle_system.point_cache.use_external
return False
def draw(self, context):
@@ -199,7 +201,7 @@ class PARTICLE_PT_emission(ParticleButtonsPanel, bpy.types.Panel):
psys = context.particle_system
part = particle_get_settings(context)
- layout.enabled = particle_panel_enabled(context, psys) and (psys == None or not psys.has_multiple_caches)
+ layout.enabled = particle_panel_enabled(context, psys) and (psys is None or not psys.has_multiple_caches)
row = layout.row()
row.active = part.distribution != 'GRID'
@@ -220,10 +222,8 @@ class PARTICLE_PT_emission(ParticleButtonsPanel, bpy.types.Panel):
col.prop(part, "lifetime")
col.prop(part, "lifetime_random", slider=True)
- layout.row().label(text="Emit From:")
-
- row = layout.row()
- row.prop(part, "emit_from", expand=True)
+ layout.label(text="Emit From:")
+ layout.prop(part, "emit_from", expand=True)
row = layout.row()
if part.emit_from == 'VERT':
@@ -236,12 +236,9 @@ class PARTICLE_PT_emission(ParticleButtonsPanel, bpy.types.Panel):
row.prop(part, "use_even_distribution")
if part.emit_from == 'FACE' or part.emit_from == 'VOLUME':
- row = layout.row()
-
- row.prop(part, "distribution", expand=True)
+ layout.prop(part, "distribution", expand=True)
row = layout.row()
-
if part.distribution == 'JIT':
row.prop(part, "userjit", text="Particles/Face")
row.prop(part, "jitter_factor", text="Jittering Amount", slider=True)
@@ -281,7 +278,6 @@ class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel, bpy.types.Panel):
if not psys.cloth:
return
- #part = psys.settings
cloth = psys.cloth.settings
layout.enabled = psys.use_hair_dynamics and psys.point_cache.is_baked == False
@@ -298,7 +294,6 @@ class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel, bpy.types.Panel):
sub.prop(cloth, "collider_friction", slider=True)
col = split.column()
-
col.label(text="Damping:")
sub = col.column(align=True)
sub.prop(cloth, "spring_damping", text="Spring")
@@ -326,7 +321,7 @@ class PARTICLE_PT_cache(ParticleButtonsPanel, bpy.types.Panel):
phystype = psys.settings.physics_type
if phystype == 'NO' or phystype == 'KEYED':
return False
- return (psys.settings.type in ('EMITTER', 'REACTOR') or (psys.settings.type == 'HAIR' and (psys.use_hair_dynamics or psys.point_cache.is_baked))) and engine in cls.COMPAT_ENGINES
+ return (psys.settings.type in {'EMITTER', 'REACTOR'} or (psys.settings.type == 'HAIR' and (psys.use_hair_dynamics or psys.point_cache.is_baked))) and engine in cls.COMPAT_ENGINES
def draw(self, context):
psys = context.particle_system
@@ -346,7 +341,7 @@ class PARTICLE_PT_velocity(ParticleButtonsPanel, bpy.types.Panel):
if settings.type == 'HAIR' and not settings.use_advanced_hair:
return False
- return settings.physics_type != 'BOIDS' and (psys == None or not psys.point_cache.use_external)
+ return settings.physics_type != 'BOIDS' and (psys is None or not psys.point_cache.use_external)
else:
return False
@@ -360,26 +355,24 @@ class PARTICLE_PT_velocity(ParticleButtonsPanel, bpy.types.Panel):
split = layout.split()
- sub = split.column()
- sub.label(text="Emitter Geometry:")
- sub.prop(part, "normal_factor")
- subsub = sub.column(align=True)
- subsub.prop(part, "tangent_factor")
- subsub.prop(part, "tangent_phase", slider=True)
+ col = split.column()
+ col.label(text="Emitter Geometry:")
+ col.prop(part, "normal_factor")
+ sub = col.column(align=True)
+ sub.prop(part, "tangent_factor")
+ sub.prop(part, "tangent_phase", slider=True)
- sub = split.column()
- sub.label(text="Emitter Object")
- sub.prop(part, "object_align_factor", text="")
+ col = split.column()
+ col.label(text="Emitter Object:")
+ col.prop(part, "object_align_factor", text="")
- layout.row().label(text="Other:")
- split = layout.split()
- sub = split.column()
+ layout.label(text="Other:")
+ row = layout.row()
if part.emit_from == 'PARTICLE':
- sub.prop(part, "particle_factor")
+ row.prop(part, "particle_factor")
else:
- sub.prop(part, "object_factor", slider=True)
- sub = split.column()
- sub.prop(part, "factor_random")
+ row.prop(part, "object_factor", slider=True)
+ row.prop(part, "factor_random")
#if part.type=='REACTOR':
# sub.prop(part, "reactor_factor")
@@ -398,7 +391,7 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel, bpy.types.Panel):
if settings.type == 'HAIR' and not settings.use_advanced_hair:
return False
- return settings.physics_type != 'BOIDS' and (psys == None or not psys.point_cache.use_external)
+ return settings.physics_type != 'BOIDS' and (psys is None or not psys.point_cache.use_external)
else:
return False
@@ -413,27 +406,26 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel, bpy.types.Panel):
layout.enabled = particle_panel_enabled(context, psys)
- split = layout.split()
- split.label(text="Initial Rotation:")
- split.prop(part, "use_dynamic_rotation")
- split = layout.split()
+ row = layout.row()
+ row.label(text="Initial Rotation:")
+ row.prop(part, "use_dynamic_rotation")
- sub = split.column(align=True)
- sub.prop(part, "rotation_mode", text="")
- sub.prop(part, "rotation_factor_random", slider=True, text="Random")
+ split = layout.split()
- sub = split.column(align=True)
- sub.prop(part, "phase_factor", slider=True)
- sub.prop(part, "phase_factor_random", text="Random", slider=True)
+ col = split.column(align=True)
+ col.prop(part, "rotation_mode", text="")
+ col.prop(part, "rotation_factor_random", slider=True, text="Random")
- layout.row().label(text="Angular Velocity:")
- layout.row().prop(part, "angular_velocity_mode", expand=True)
- split = layout.split()
+ col = split.column(align=True)
+ col.prop(part, "phase_factor", slider=True)
+ col.prop(part, "phase_factor_random", text="Random", slider=True)
- sub = split.column()
+ col = layout.column()
+ col.label(text="Angular Velocity:")
+ col.row().prop(part, "angular_velocity_mode", expand=True)
if part.angular_velocity_mode != 'NONE':
- sub.prop(part, "angular_velocity_factor", text="")
+ col.prop(part, "angular_velocity_factor", text="")
class PARTICLE_PT_physics(ParticleButtonsPanel, bpy.types.Panel):
@@ -448,7 +440,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, bpy.types.Panel):
if settings.type == 'HAIR' and not settings.use_advanced_hair:
return False
- return psys == None or not psys.point_cache.use_external
+ return psys is None or not psys.point_cache.use_external
else:
return False
@@ -460,8 +452,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, bpy.types.Panel):
layout.enabled = particle_panel_enabled(context, psys)
- row = layout.row()
- row.prop(part, "physics_type", expand=True)
+ layout.prop(part, "physics_type", expand=True)
row = layout.row()
col = row.column(align=True)
@@ -473,70 +464,76 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, bpy.types.Panel):
col.prop(part, "mass")
col.prop(part, "use_multiply_size_mass", text="Multiply mass with size")
- if part.physics_type == 'NEWTON':
+ if part.physics_type in ('NEWTON', 'FLUID'):
split = layout.split()
- sub = split.column()
- sub.label(text="Forces:")
- sub.prop(part, "brownian_factor")
- sub.prop(part, "drag_factor", slider=True)
- sub.prop(part, "damping", slider=True)
- sub = split.column()
- sub.label(text="Integration:")
- sub.prop(part, "integrator", text="")
- sub.prop(part, "time_tweak")
- sub.prop(part, "subframes")
- sub = layout.row()
- sub.prop(part, "use_size_deflect")
- sub.prop(part, "use_die_on_collision")
-
- elif part.physics_type == 'FLUID':
- fluid = part.fluid
- split = layout.split()
- sub = split.column()
+ col = split.column()
+ col.label(text="Forces:")
+ col.prop(part, "brownian_factor")
+ col.prop(part, "drag_factor", slider=True)
+ col.prop(part, "damping", slider=True)
- sub.label(text="Forces:")
- sub.prop(part, "brownian_factor")
- sub.prop(part, "drag_factor", slider=True)
- sub.prop(part, "damping", slider=True)
- sub = split.column()
- sub.label(text="Integration:")
- sub.prop(part, "integrator", text="")
- sub.prop(part, "time_tweak")
- sub.prop(part, "subframes")
- sub = layout.row()
- sub.prop(part, "use_size_deflect")
- sub.prop(part, "use_die_on_collision")
+ col = split.column()
+ col.label(text="Integration:")
+ col.prop(part, "integrator", text="")
+ col.prop(part, "timestep")
+ col.prop(part, "subframes")
- split = layout.split()
- sub = split.column()
- sub.label(text="Fluid Interaction:")
- sub.prop(fluid, "fluid_radius")
- sub.prop(fluid, "repulsion_force")
- subsub = sub.column(align=True)
- subsub.prop(fluid, "rest_density")
- subsub.prop(fluid, "density_force", text="Force")
+ row = layout.row()
+ row.prop(part, "use_size_deflect")
+ row.prop(part, "use_die_on_collision")
- sub.label(text="Viscosity:")
- subsub = sub.column(align=True)
- subsub.prop(fluid, "linear_viscosity", text="Linear")
- subsub.prop(fluid, "square_viscosity", text="Square")
+ if part.physics_type == 'FLUID':
+ fluid = part.fluid
- sub = split.column()
+ split = layout.split()
- sub.label(text="Springs:")
- sub.prop(fluid, "spring_force", text="Force")
- #Hidden to make ui a bit lighter, can be unhidden for a bit more control
- #sub.prop(fluid, "rest_length", slider=True)
- sub.prop(fluid, "use_viscoelastic_springs")
- subsub = sub.column(align=True)
- subsub.active = fluid.use_viscoelastic_springs
- subsub.prop(fluid, "yield_ratio", slider=True)
- subsub.prop(fluid, "plasticity", slider=True)
- subsub.prop(fluid, "use_initial_rest_length")
+ col = split.column()
+ col.label(text="Fluid properties:")
+ col.prop(fluid, "stiffness", text="Stiffness")
+ col.prop(fluid, "linear_viscosity", text="Viscosity")
+ col.prop(fluid, "buoyancy", text="Buoancy", slider=True)
- sub.label(text="Buoyancy:")
- sub.prop(fluid, "buoyancy", text="Strength", slider=True)
+ col = split.column()
+ col.label(text="Advanced:")
+
+ sub = col.row()
+ sub.prop(fluid, "repulsion", slider=fluid.factor_repulsion)
+ sub.prop(fluid, "factor_repulsion", text="")
+
+ sub = col.row()
+ sub.prop(fluid, "stiff_viscosity", slider=fluid.factor_stiff_viscosity)
+ sub.prop(fluid, "factor_stiff_viscosity", text="")
+
+ sub = col.row()
+ sub.prop(fluid, "fluid_radius", slider=fluid.factor_radius)
+ sub.prop(fluid, "factor_radius", text="")
+
+ sub = col.row()
+ sub.prop(fluid, "rest_density", slider=fluid.factor_density)
+ sub.prop(fluid, "factor_density", text="")
+
+ split = layout.split()
+
+ col = split.column()
+ col.label(text="Springs:")
+ col.prop(fluid, "spring_force", text="Force")
+ col.prop(fluid, "use_viscoelastic_springs")
+ sub = col.column(align=True)
+ sub.active = fluid.use_viscoelastic_springs
+ sub.prop(fluid, "yield_ratio", slider=True)
+ sub.prop(fluid, "plasticity", slider=True)
+
+ col = split.column()
+ col.label(text="Advanced:")
+ sub = col.row()
+ sub.prop(fluid, "rest_length", slider=fluid.factor_rest_length)
+ sub.prop(fluid, "factor_rest_length", text="")
+ col.label(text="")
+ sub = col.column()
+ sub.active = fluid.use_viscoelastic_springs
+ sub.prop(fluid, "use_initial_rest_length")
+ sub.prop(fluid, "spring_frames", text="Frames")
elif part.physics_type == 'KEYED':
split = layout.split()
@@ -598,7 +595,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, bpy.types.Panel):
col.prop(boids, "pitch", slider=True)
col.prop(boids, "height", slider=True)
- if psys and part.physics_type in ('KEYED', 'BOIDS', 'FLUID'):
+ if psys and part.physics_type in {'KEYED', 'BOIDS', 'FLUID'}:
if part.physics_type == 'BOIDS':
layout.label(text="Relations:")
elif part.physics_type == 'FLUID':
@@ -753,65 +750,65 @@ class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel):
@classmethod
def poll(cls, context):
- psys = context.particle_system
+ settings = particle_get_settings(context)
engine = context.scene.render.engine
- if psys is None:
- return False
- if psys.settings is None:
+ if settings is None:
return False
+
return engine in cls.COMPAT_ENGINES
def draw(self, context):
layout = self.layout
psys = context.particle_system
- part = psys.settings
+ part = particle_get_settings(context)
row = layout.row()
row.prop(part, "material")
- row.prop(psys, "parent")
+ if psys:
+ row.prop(psys, "parent")
split = layout.split()
- sub = split.column()
- sub.prop(part, "use_render_emitter")
- sub.prop(part, "use_parent_particles")
- sub = split.column()
- sub.prop(part, "show_unborn")
- sub.prop(part, "use_dead")
+ col = split.column()
+ col.prop(part, "use_render_emitter")
+ col.prop(part, "use_parent_particles")
+
+ col = split.column()
+ col.prop(part, "show_unborn")
+ col.prop(part, "use_dead")
- row = layout.row()
- row.prop(part, "render_type", expand=True)
+ layout.prop(part, "render_type", expand=True)
split = layout.split()
- sub = split.column()
+ col = split.column()
if part.render_type == 'LINE':
- sub.prop(part, "line_length_tail")
- sub.prop(part, "line_length_head")
- sub = split.column()
- sub.prop(part, "use_velocity_length")
+ col.prop(part, "line_length_tail")
+ col.prop(part, "line_length_head")
+
+ split.prop(part, "use_velocity_length")
elif part.render_type == 'PATH':
- sub.prop(part, "use_strand_primitive")
- subsub = sub.column()
- subsub.active = (part.use_strand_primitive is False)
- subsub.prop(part, "use_render_adaptive")
- subsub = sub.column()
- subsub.active = part.use_render_adaptive or part.use_strand_primitive == True
- subsub.prop(part, "adaptive_angle")
- subsub = sub.column()
- subsub.active = (part.use_render_adaptive is True and part.use_strand_primitive is False)
- subsub.prop(part, "adaptive_pixel")
- sub.prop(part, "use_hair_bspline")
- sub.prop(part, "render_step", text="Steps")
+ col.prop(part, "use_strand_primitive")
+ sub = col.column()
+ sub.active = (part.use_strand_primitive is False)
+ sub.prop(part, "use_render_adaptive")
+ sub = col.column()
+ sub.active = part.use_render_adaptive or part.use_strand_primitive == True
+ sub.prop(part, "adaptive_angle")
+ sub = col.column()
+ sub.active = (part.use_render_adaptive is True and part.use_strand_primitive is False)
+ sub.prop(part, "adaptive_pixel")
+ col.prop(part, "use_hair_bspline")
+ col.prop(part, "render_step", text="Steps")
- sub = split.column()
- sub.label(text="Timing:")
- sub.prop(part, "use_absolute_path_time")
- sub.prop(part, "path_start", text="Start", slider=not part.use_absolute_path_time)
- sub.prop(part, "path_end", text="End", slider=not part.use_absolute_path_time)
- sub.prop(part, "length_random", text="Random", slider=True)
+ col = split.column()
+ col.label(text="Timing:")
+ col.prop(part, "use_absolute_path_time")
+ col.prop(part, "path_start", text="Start", slider=not part.use_absolute_path_time)
+ col.prop(part, "path_end", text="End", slider=not part.use_absolute_path_time)
+ col.prop(part, "length_random", text="Random", slider=True)
row = layout.row()
col = row.column()
@@ -830,22 +827,23 @@ class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel):
sub.prop(part, "simplify_viewport")
elif part.render_type == 'OBJECT':
- sub.prop(part, "dupli_object")
- sub.prop(part, "use_global_dupli")
+ col.prop(part, "dupli_object")
+ col.prop(part, "use_global_dupli")
elif part.render_type == 'GROUP':
- sub.prop(part, "dupli_group")
+ col.prop(part, "dupli_group")
split = layout.split()
- sub = split.column()
- sub.prop(part, "use_whole_group")
- subsub = sub.column()
- subsub.active = (part.use_whole_group is False)
- subsub.prop(part, "use_group_count")
- sub = split.column()
- subsub = sub.column()
- subsub.active = (part.use_whole_group is False)
- subsub.prop(part, "use_global_dupli")
- subsub.prop(part, "use_group_pick_random")
+ col = split.column()
+ col.prop(part, "use_whole_group")
+ sub = col.column()
+ sub.active = (part.use_whole_group is False)
+ sub.prop(part, "use_group_count")
+
+ col = split.column()
+ sub = col.column()
+ sub.active = (part.use_whole_group is False)
+ sub.prop(part, "use_global_dupli")
+ sub.prop(part, "use_group_pick_random")
if part.use_group_count and not part.use_whole_group:
row = layout.row()
@@ -867,7 +865,7 @@ class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel):
elif part.render_type == 'BILLBOARD':
ob = context.object
- sub.label(text="Align:")
+ col.label(text="Align:")
row = layout.row()
row.prop(part, "billboard_align", expand=True)
@@ -883,16 +881,19 @@ class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel):
col = row.column()
col.prop(part, "billboard_offset")
- col = layout.column()
- col.prop_search(psys, "billboard_normal_uv", ob.data, "uv_textures")
- col.prop_search(psys, "billboard_time_index_uv", ob.data, "uv_textures")
+ if psys:
+ col = layout.column()
+ col.prop_search(psys, "billboard_normal_uv", ob.data, "uv_textures")
+ col.prop_search(psys, "billboard_time_index_uv", ob.data, "uv_textures")
split = layout.split(percentage=0.33)
split.label(text="Split uv's:")
split.prop(part, "billboard_uv_split", text="Number of splits")
- col = layout.column()
- col.active = part.billboard_uv_split > 1
- col.prop_search(psys, "billboard_split_uv", ob.data, "uv_textures")
+
+ if psys:
+ col = layout.column()
+ col.active = part.billboard_uv_split > 1
+ col.prop_search(psys, "billboard_split_uv", ob.data, "uv_textures")
row = col.row()
row.label(text="Animate:")
@@ -913,6 +914,11 @@ class PARTICLE_PT_render(ParticleButtonsPanel, bpy.types.Panel):
col = row.column()
col.label(text="")
+ if part.render_type in ('OBJECT', 'GROUP') and not part.use_advanced_hair:
+ row = layout.row(align=True)
+ row.prop(part, "particle_size")
+ row.prop(part, "size_random", slider=True)
+
class PARTICLE_PT_draw(ParticleButtonsPanel, bpy.types.Panel):
bl_label = "Display"
@@ -921,11 +927,9 @@ class PARTICLE_PT_draw(ParticleButtonsPanel, bpy.types.Panel):
@classmethod
def poll(cls, context):
- psys = context.particle_system
+ settings = particle_get_settings(context)
engine = context.scene.render.engine
- if psys is None:
- return False
- if psys.settings is None:
+ if settings is None:
return False
return engine in cls.COMPAT_ENGINES
@@ -950,7 +954,7 @@ class PARTICLE_PT_draw(ParticleButtonsPanel, bpy.types.Panel):
else:
row.label(text="")
- if part.draw_percentage != 100:
+ if part.draw_percentage != 100 and psys is not None:
if part.type == 'HAIR':
if psys.use_hair_dynamics and psys.point_cache.is_baked == False:
layout.row().label(text="Display percentage makes dynamics inaccurate without baking!")
@@ -967,16 +971,15 @@ class PARTICLE_PT_draw(ParticleButtonsPanel, bpy.types.Panel):
if part.physics_type == 'BOIDS':
col.prop(part, "show_health")
- col = row.column()
- col.prop(part, "show_material_color", text="Use material color")
+ col = row.column(align=True)
+ col.label(text="Color:")
+ col.prop(part, "draw_color", text="")
+ sub = col.row()
+ sub.active = part.draw_color in ('VELOCITY', 'ACCELERATION')
+ sub.prop(part, "color_maximum", text="Max")
if (path):
col.prop(part, "draw_step")
- else:
- sub = col.column()
- sub.active = (part.show_material_color is False)
- #sub.label(text="color")
- #sub.label(text="Override material color")
class PARTICLE_PT_children(ParticleButtonsPanel, bpy.types.Panel):
@@ -1141,7 +1144,7 @@ class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, bpy.types.Panel):
@classmethod
def poll(cls, context):
- if context.particle_system == None:
+ if context.particle_system is None:
return False
return particle_panel_poll(cls, context)
@@ -1150,9 +1153,6 @@ class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, bpy.types.Panel):
ob = context.object
psys = context.particle_system
- # part = psys.settings
-
- # layout.label(text="Nothing here yet.")
row = layout.row()
row.label(text="Vertex Group")
@@ -1213,13 +1213,5 @@ class PARTICLE_PT_custom_props(ParticleButtonsPanel, PropertyPanel, bpy.types.Pa
_context_path = "particle_system.settings"
_property_type = bpy.types.ParticleSettings
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_physics_cloth.py b/release/scripts/startup/bl_ui/properties_physics_cloth.py
index 0ac4429c71a..5c7882e9722 100644
--- a/release/scripts/ui/properties_physics_cloth.py
+++ b/release/scripts/startup/bl_ui/properties_physics_cloth.py
@@ -20,8 +20,10 @@
import bpy
-from properties_physics_common import point_cache_ui
-from properties_physics_common import effector_weights_ui
+from bl_ui.properties_physics_common import (
+ point_cache_ui,
+ effector_weights_ui,
+ )
def cloth_panel_enabled(md):
@@ -112,7 +114,7 @@ class PHYSICS_PT_cloth(PhysicButtonsPanel, bpy.types.Panel):
if key:
col.label(text="Rest Shape Key:")
- col.prop_search(cloth, "rest_shape_key", key, "keys", text="")
+ col.prop_search(cloth, "rest_shape_key", key, "key_blocks", text="")
class PHYSICS_PT_cloth_cache(PhysicButtonsPanel, bpy.types.Panel):
@@ -215,13 +217,5 @@ class PHYSICS_PT_cloth_field_weights(PhysicButtonsPanel, bpy.types.Panel):
cloth = context.cloth.settings
effector_weights_ui(self, context, cloth.effector_weights)
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_physics_common.py b/release/scripts/startup/bl_ui/properties_physics_common.py
index e6900b162ba..f7cf8da1840 100644
--- a/release/scripts/ui/properties_physics_common.py
+++ b/release/scripts/startup/bl_ui/properties_physics_common.py
@@ -89,7 +89,7 @@ def point_cache_ui(self, context, cache, enabled, cachetype):
col.operator("ptcache.remove", icon='ZOOMOUT', text="")
row = layout.row()
- if cachetype in ('PSYS', 'HAIR', 'SMOKE'):
+ if cachetype in {'PSYS', 'HAIR', 'SMOKE'}:
row.prop(cache, "use_external")
if cache.use_external:
@@ -106,7 +106,7 @@ def point_cache_ui(self, context, cache, enabled, cachetype):
layout.label(text=cache.info)
else:
if cachetype == 'SMOKE':
- if bpy.data.is_dirty:
+ if not bpy.data.is_saved:
layout.label(text="Cache is disabled until the file is saved")
layout.enabled = False
@@ -121,7 +121,7 @@ def point_cache_ui(self, context, cache, enabled, cachetype):
row.enabled = enabled
row.prop(cache, "frame_start")
row.prop(cache, "frame_end")
- if cachetype not in ('SMOKE', 'CLOTH'):
+ if cachetype not in {'SMOKE', 'CLOTH'}:
row.prop(cache, "frame_step")
row.prop(cache, "use_quick_cache")
if cachetype != 'SMOKE':
@@ -129,7 +129,7 @@ def point_cache_ui(self, context, cache, enabled, cachetype):
if cachetype != 'SMOKE':
split = layout.split()
- split.enabled = enabled and (not bpy.data.is_dirty)
+ split.enabled = enabled and bpy.data.is_saved
col = split.column()
col.prop(cache, "use_disk_cache")
@@ -139,7 +139,7 @@ def point_cache_ui(self, context, cache, enabled, cachetype):
col.prop(cache, "use_library_path", "Use Lib Path")
row = layout.row()
- row.enabled = enabled and (not bpy.data.is_dirty)
+ row.enabled = enabled and bpy.data.is_saved
row.active = cache.use_disk_cache
row.label(text="Compression:")
row.prop(cache, "compression", expand=True)
@@ -255,8 +255,6 @@ def basic_force_field_settings_ui(self, context, field):
def basic_force_field_falloff_ui(self, context, field):
layout = self.layout
- # XXX: This doesn't update for some reason.
- #split = layout.split()
split = layout.split(percentage=0.35)
if not field or field.type == 'NONE':
@@ -283,13 +281,5 @@ def basic_force_field_falloff_ui(self, context, field):
sub.active = field.use_max_distance
sub.prop(field, "distance_max", text="Maximum")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_physics_field.py b/release/scripts/startup/bl_ui/properties_physics_field.py
index 8a697806aa1..9f96f0a5b9f 100644
--- a/release/scripts/ui/properties_physics_field.py
+++ b/release/scripts/startup/bl_ui/properties_physics_field.py
@@ -20,8 +20,10 @@
import bpy
-from properties_physics_common import basic_force_field_settings_ui
-from properties_physics_common import basic_force_field_falloff_ui
+from bl_ui.properties_physics_common import (
+ basic_force_field_settings_ui,
+ basic_force_field_falloff_ui,
+ )
class PhysicButtonsPanel():
@@ -55,7 +57,7 @@ class PHYSICS_PT_field(PhysicButtonsPanel, bpy.types.Panel):
split.prop(field, "type", text="")
- if field.type not in ('NONE', 'GUIDE', 'TEXTURE'):
+ if field.type not in {'NONE', 'GUIDE', 'TEXTURE'}:
split = layout.split(percentage=0.2)
split.label(text="Shape:")
split.prop(field, "shape", text="")
@@ -112,7 +114,7 @@ class PHYSICS_PT_field(PhysicButtonsPanel, bpy.types.Panel):
else:
basic_force_field_settings_ui(self, context, field)
- if field.type not in ('NONE', 'GUIDE'):
+ if field.type not in {'NONE', 'GUIDE'}:
layout.label(text="Falloff:")
layout.prop(field, "falloff_type", expand=True)
@@ -215,13 +217,5 @@ class PHYSICS_PT_collision(PhysicButtonsPanel, bpy.types.Panel):
col.label(text="Force Fields:")
col.prop(settings, "absorption", text="Absorption")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py
index 6385a535a44..5da89d0090a 100644
--- a/release/scripts/ui/properties_physics_fluid.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py
@@ -49,11 +49,11 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, bpy.types.Panel):
return
row.prop(fluid, "type")
- if fluid.type not in ('NONE', 'DOMAIN', 'PARTICLE', 'FLUID'):
+ if fluid.type not in {'NONE', 'DOMAIN', 'PARTICLE', 'FLUID'}:
row.prop(fluid, "use", text="")
layout = layout.column()
- if fluid.type not in ('NONE', 'DOMAIN', 'PARTICLE', 'FLUID'):
+ if fluid.type not in {'NONE', 'DOMAIN', 'PARTICLE', 'FLUID'}:
layout.active = fluid.use
if fluid.type == 'DOMAIN':
@@ -123,7 +123,9 @@ class PHYSICS_PT_fluid(PhysicButtonsPanel, bpy.types.Panel):
col.label(text="Volume Initialization:")
col.prop(fluid, "volume_initialization", text="")
col.prop(fluid, "use_animated_mesh")
- col.prop(fluid, "use_local_coords")
+ row = col.row()
+ row.active = not fluid.use_animated_mesh
+ row.prop(fluid, "use_local_coords")
col = split.column()
col.label(text="Inflow Velocity:")
@@ -280,13 +282,5 @@ class PHYSICS_PT_domain_particles(PhysicButtonsPanel, bpy.types.Panel):
col.prop(fluid, "tracer_particles")
col.prop(fluid, "generate_particles")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_physics_smoke.py b/release/scripts/startup/bl_ui/properties_physics_smoke.py
index 56ddff292d9..61d8d2e3825 100644
--- a/release/scripts/ui/properties_physics_smoke.py
+++ b/release/scripts/startup/bl_ui/properties_physics_smoke.py
@@ -20,8 +20,10 @@
import bpy
-from properties_physics_common import point_cache_ui
-from properties_physics_common import effector_weights_ui
+from bl_ui.properties_physics_common import (
+ point_cache_ui,
+ effector_weights_ui,
+ )
class PhysicButtonsPanel():
@@ -100,9 +102,6 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel, bpy.types.Panel):
sub.prop(flow, "density")
sub.prop(flow, "temperature")
- #elif md.smoke_type == 'COLLISION':
- # layout.separator()
-
class PHYSICS_PT_smoke_groups(PhysicButtonsPanel, bpy.types.Panel):
bl_label = "Smoke Groups"
@@ -203,13 +202,5 @@ class PHYSICS_PT_smoke_field_weights(PhysicButtonsPanel, bpy.types.Panel):
domain = context.smoke.domain_settings
effector_weights_ui(self, context, domain.effector_weights)
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_physics_softbody.py b/release/scripts/startup/bl_ui/properties_physics_softbody.py
index 7d3fa66ed02..61115a0590e 100644
--- a/release/scripts/ui/properties_physics_softbody.py
+++ b/release/scripts/startup/bl_ui/properties_physics_softbody.py
@@ -20,8 +20,10 @@
import bpy
-from properties_physics_common import point_cache_ui
-from properties_physics_common import effector_weights_ui
+from bl_ui.properties_physics_common import (
+ point_cache_ui,
+ effector_weights_ui,
+ )
def softbody_panel_enabled(md):
@@ -260,13 +262,5 @@ class PHYSICS_PT_softbody_field_weights(PhysicButtonsPanel, bpy.types.Panel):
effector_weights_ui(self, context, softbody.effector_weights)
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 4916ba226c3..a3b10702fa7 100644
--- a/release/scripts/ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -299,13 +299,13 @@ class RENDER_PT_output(RenderButtonsPanel, bpy.types.Panel):
col.prop(rd, "use_overwrite")
col.prop(rd, "use_placeholder")
- if file_format in ('AVI_JPEG', 'JPEG'):
+ if file_format in {'AVI_JPEG', 'JPEG'}:
layout.prop(rd, "file_quality", slider=True)
if file_format == 'PNG':
layout.prop(rd, "file_quality", slider=True, text="Compression")
- if file_format in ('OPEN_EXR', 'MULTILAYER'):
+ if file_format in {'OPEN_EXR', 'MULTILAYER'}:
row = layout.row()
row.prop(rd, "exr_codec", text="Codec")
@@ -325,7 +325,7 @@ class RENDER_PT_output(RenderButtonsPanel, bpy.types.Panel):
col.prop(rd, "jpeg2k_preset", text="")
col.prop(rd, "jpeg2k_ycc")
- elif file_format in ('CINEON', 'DPX'):
+ elif file_format in {'CINEON', 'DPX'}:
split = layout.split()
split.label("FIXME: hard coded Non-Linear, Gamma:1.0")
@@ -384,7 +384,7 @@ class RENDER_PT_encoding(RenderButtonsPanel, bpy.types.Panel):
@classmethod
def poll(cls, context):
rd = context.scene.render
- return rd.file_format in ('FFMPEG', 'XVID', 'H264', 'THEORA')
+ return rd.file_format in {'FFMPEG', 'XVID', 'H264', 'THEORA'}
def draw(self, context):
layout = self.layout
@@ -395,7 +395,7 @@ class RENDER_PT_encoding(RenderButtonsPanel, bpy.types.Panel):
split = layout.split()
split.prop(rd, "ffmpeg_format")
- if rd.ffmpeg_format in ('AVI', 'QUICKTIME', 'MKV', 'OGG'):
+ if rd.ffmpeg_format in {'AVI', 'QUICKTIME', 'MKV', 'OGG'}:
split.prop(rd, "ffmpeg_codec")
else:
split.label()
@@ -421,7 +421,7 @@ class RENDER_PT_encoding(RenderButtonsPanel, bpy.types.Panel):
layout.separator()
# Audio:
- if rd.ffmpeg_format not in ('MP3', ):
+ if rd.ffmpeg_format not in {'MP3'}:
layout.prop(rd, "ffmpeg_audio_codec", text="Audio Codec")
split = layout.split()
@@ -535,10 +535,7 @@ class RENDER_PT_dimensions(RenderButtonsPanel, bpy.types.Panel):
fps_rate = round(rd.fps / rd.fps_base, 2)
# TODO: Change the following to iterate over existing presets
- if (fps_rate in (23.98, 24, 25, 29.97, 30, 50, 59.94, 60)):
- custom_framerate = False
- else:
- custom_framerate = True
+ custom_framerate = (fps_rate not in {23.98, 24, 25, 29.97, 30, 50, 59.94, 60})
if custom_framerate == True:
fps_label_text = "Custom (" + str(fps_rate) + " fps)"
@@ -547,7 +544,7 @@ class RENDER_PT_dimensions(RenderButtonsPanel, bpy.types.Panel):
sub.menu("RENDER_MT_framerate_presets", text=fps_label_text)
- if (bpy.types.RENDER_MT_framerate_presets.bl_label == "Custom") or (custom_framerate == True):
+ if custom_framerate or (bpy.types.RENDER_MT_framerate_presets.bl_label == "Custom"):
sub.prop(rd, "fps")
sub.prop(rd, "fps_base", text="/")
subrow = sub.row(align=True)
@@ -618,7 +615,7 @@ class RENDER_PT_bake(RenderButtonsPanel, bpy.types.Panel):
if rd.bake_type == 'NORMALS':
layout.prop(rd, "bake_normal_space")
- elif rd.bake_type in ('DISPLACEMENT', 'AO'):
+ elif rd.bake_type in {'DISPLACEMENT', 'AO'}:
layout.prop(rd, "use_bake_normalize")
# col.prop(rd, "bake_aa_mode")
@@ -640,13 +637,5 @@ class RENDER_PT_bake(RenderButtonsPanel, bpy.types.Panel):
sub.prop(rd, "bake_distance")
sub.prop(rd, "bake_bias")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index d3586c645e6..7725f661693 100644
--- a/release/scripts/ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -55,14 +55,10 @@ class SCENE_PT_unit(SceneButtonsPanel, bpy.types.Panel):
col.row().prop(unit, "system", expand=True)
col.row().prop(unit, "system_rotation", expand=True)
- split = layout.split()
- split.active = (unit.system != 'NONE')
-
- col = split.column()
- col.prop(unit, "scale_length", text="Scale")
-
- col = split.column()
- col.prop(unit, "use_separate")
+ row = layout.row()
+ row.active = (unit.system != 'NONE')
+ row.prop(unit, "scale_length", text="Scale")
+ row.prop(unit, "use_separate")
class SCENE_PT_keying_sets(SceneButtonsPanel, bpy.types.Panel):
@@ -199,9 +195,6 @@ class SCENE_PT_custom_props(SceneButtonsPanel, PropertyPanel, bpy.types.Panel):
_context_path = "scene"
_property_type = bpy.types.Scene
-
-from bpy.props import *
-
# XXX, move operator to op/ dir
@@ -309,13 +302,5 @@ class ANIM_OT_keying_set_export(bpy.types.Operator):
wm.fileselect_add(self)
return {'RUNNING_MODAL'}
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py
index 04edf8ea7e8..bc0dbc3c170 100644
--- a/release/scripts/ui/properties_texture.py
+++ b/release/scripts/startup/bl_ui/properties_texture.py
@@ -43,7 +43,7 @@ class TEXTURE_MT_envmap_specials(bpy.types.Menu):
layout.operator("texture.envmap_clear", icon='FILE_REFRESH')
layout.operator("texture.envmap_clear_all", icon='FILE_REFRESH')
-from properties_material import active_node_mat
+from bl_ui.properties_material import active_node_mat
def context_tex_datablock(context):
@@ -244,8 +244,7 @@ class TEXTURE_PT_clouds(TextureTypePanel, bpy.types.Panel):
col.prop(tex, "noise_scale", text="Size")
col.prop(tex, "noise_depth", text="Depth")
- col = split.column()
- col.prop(tex, "nabla", text="Nabla")
+ split.prop(tex, "nabla", text="Nabla")
class TEXTURE_PT_wood(TextureTypePanel, bpy.types.Panel):
@@ -258,24 +257,23 @@ class TEXTURE_PT_wood(TextureTypePanel, bpy.types.Panel):
tex = context.texture
- layout.prop(tex, "noisebasis_2", expand=True)
+ layout.prop(tex, "noise_basis_2", expand=True)
layout.prop(tex, "wood_type", expand=True)
col = layout.column()
- col.active = tex.wood_type in ('RINGNOISE', 'BANDNOISE')
+ col.active = tex.wood_type in {'RINGNOISE', 'BANDNOISE'}
col.label(text="Noise:")
col.row().prop(tex, "noise_type", text="Type", expand=True)
layout.prop(tex, "noise_basis", text="Basis")
split = layout.split()
- split.active = tex.wood_type in ('RINGNOISE', 'BANDNOISE')
+ split.active = tex.wood_type in {'RINGNOISE', 'BANDNOISE'}
col = split.column()
col.prop(tex, "noise_scale", text="Size")
col.prop(tex, "turbulence")
- col = split.column()
- col.prop(tex, "nabla")
+ split.prop(tex, "nabla")
class TEXTURE_PT_marble(TextureTypePanel, bpy.types.Panel):
@@ -289,7 +287,7 @@ class TEXTURE_PT_marble(TextureTypePanel, bpy.types.Panel):
tex = context.texture
layout.prop(tex, "marble_type", expand=True)
- layout.prop(tex, "noisebasis_2", expand=True)
+ layout.prop(tex, "noise_basis_2", expand=True)
layout.label(text="Noise:")
layout.prop(tex, "noise_type", text="Type", expand=True)
layout.prop(tex, "noise_basis", text="Basis")
@@ -315,13 +313,9 @@ class TEXTURE_PT_magic(TextureTypePanel, bpy.types.Panel):
tex = context.texture
- split = layout.split()
-
- col = split.column()
- col.prop(tex, "noise_depth", text="Depth")
-
- col = split.column()
- col.prop(tex, "turbulence")
+ row = layout.row()
+ row.prop(tex, "noise_depth", text="Depth")
+ row.prop(tex, "turbulence")
class TEXTURE_PT_blend(TextureTypePanel, bpy.types.Panel):
@@ -338,7 +332,7 @@ class TEXTURE_PT_blend(TextureTypePanel, bpy.types.Panel):
sub = layout.row()
- sub.active = (tex.progression in ('LINEAR', 'QUADRATIC', 'EASING', 'RADIAL'))
+ sub.active = (tex.progression in {'LINEAR', 'QUADRATIC', 'EASING', 'RADIAL'})
sub.prop(tex, "use_flip_axis", expand=True)
@@ -357,13 +351,9 @@ class TEXTURE_PT_stucci(TextureTypePanel, bpy.types.Panel):
layout.prop(tex, "noise_type", text="Type", expand=True)
layout.prop(tex, "noise_basis", text="Basis")
- split = layout.split()
-
- col = split.column()
- col.prop(tex, "noise_scale", text="Size")
-
- col = split.column()
- col.prop(tex, "turbulence")
+ row = layout.row()
+ row.prop(tex, "noise_scale", text="Size")
+ row.prop(tex, "turbulence")
class TEXTURE_PT_image(TextureTypePanel, bpy.types.Panel):
@@ -382,7 +372,7 @@ class TEXTURE_PT_image(TextureTypePanel, bpy.types.Panel):
def texture_filter_common(tex, layout):
layout.label(text="Filter:")
layout.prop(tex, "filter_type", text="")
- if tex.use_mipmap and tex.filter_type in ('AREA', 'EWA', 'FELINE'):
+ if tex.use_mipmap and tex.filter_type in {'AREA', 'EWA', 'FELINE'}:
if tex.filter_type == 'FELINE':
layout.prop(tex, "filter_probes", text="Probes")
else:
@@ -562,24 +552,20 @@ class TEXTURE_PT_musgrave(TextureTypePanel, bpy.types.Panel):
musgrave_type = tex.musgrave_type
col = split.column()
- if musgrave_type in ('HETERO_TERRAIN', 'RIDGED_MULTIFRACTAL', 'HYBRID_MULTIFRACTAL'):
+ if musgrave_type in {'HETERO_TERRAIN', 'RIDGED_MULTIFRACTAL', 'HYBRID_MULTIFRACTAL'}:
col.prop(tex, "offset")
- if musgrave_type in ('MULTIFRACTAL', 'RIDGED_MULTIFRACTAL', 'HYBRID_MULTIFRACTAL'):
+ if musgrave_type in {'MULTIFRACTAL', 'RIDGED_MULTIFRACTAL', 'HYBRID_MULTIFRACTAL'}:
col.prop(tex, "noise_intensity", text="Intensity")
- if musgrave_type in ('RIDGED_MULTIFRACTAL', 'HYBRID_MULTIFRACTAL'):
+ if musgrave_type in {'RIDGED_MULTIFRACTAL', 'HYBRID_MULTIFRACTAL'}:
col.prop(tex, "gain")
layout.label(text="Noise:")
layout.prop(tex, "noise_basis", text="Basis")
- split = layout.split()
-
- col = split.column()
- col.prop(tex, "noise_scale", text="Size")
-
- col = split.column()
- col.prop(tex, "nabla")
+ row = layout.row()
+ row.prop(tex, "noise_scale", text="Size")
+ row.prop(tex, "nabla")
class TEXTURE_PT_voronoi(TextureTypePanel, bpy.types.Panel):
@@ -613,14 +599,9 @@ class TEXTURE_PT_voronoi(TextureTypePanel, bpy.types.Panel):
sub.prop(tex, "weight_4", text="4", slider=True)
layout.label(text="Noise:")
-
- split = layout.split()
-
- col = split.column()
- col.prop(tex, "noise_scale", text="Size")
-
- col = split.column()
- col.prop(tex, "nabla")
+ row = layout.row()
+ row.prop(tex, "noise_scale", text="Size")
+ row.prop(tex, "nabla")
class TEXTURE_PT_distortednoise(TextureTypePanel, bpy.types.Panel):
@@ -642,8 +623,7 @@ class TEXTURE_PT_distortednoise(TextureTypePanel, bpy.types.Panel):
col.prop(tex, "distortion", text="Distortion")
col.prop(tex, "noise_scale", text="Size")
- col = split.column()
- col.prop(tex, "nabla")
+ split.prop(tex, "nabla")
class TEXTURE_PT_voxeldata(TextureButtonsPanel, bpy.types.Panel):
@@ -663,7 +643,7 @@ class TEXTURE_PT_voxeldata(TextureButtonsPanel, bpy.types.Panel):
vd = tex.voxel_data
layout.prop(vd, "file_format")
- if vd.file_format in ('BLENDER_VOXEL', 'RAW_8BIT'):
+ if vd.file_format in {'BLENDER_VOXEL', 'RAW_8BIT'}:
layout.prop(vd, "filepath")
if vd.file_format == 'RAW_8BIT':
layout.prop(vd, "resolution")
@@ -675,7 +655,7 @@ class TEXTURE_PT_voxeldata(TextureButtonsPanel, bpy.types.Panel):
layout.template_image(tex, "image", tex.image_user, compact=True)
#layout.prop(vd, "frame_duration")
- if vd.file_format in ('BLENDER_VOXEL', 'RAW_8BIT'):
+ if vd.file_format in {'BLENDER_VOXEL', 'RAW_8BIT'}:
layout.prop(vd, "use_still_frame")
row = layout.row()
row.active = vd.use_still_frame
@@ -726,12 +706,13 @@ class TEXTURE_PT_pointdensity(TextureButtonsPanel, bpy.types.Panel):
col.separator()
- col.label(text="Color Source:")
- col.prop(pd, "color_source", text="")
- if pd.color_source in ('PARTICLE_SPEED', 'PARTICLE_VELOCITY'):
- col.prop(pd, "speed_scale")
- if pd.color_source in ('PARTICLE_SPEED', 'PARTICLE_AGE'):
- layout.template_color_ramp(pd, "color_ramp", expand=True)
+ if pd.point_source == 'PARTICLE_SYSTEM':
+ col.label(text="Color Source:")
+ col.prop(pd, "color_source", text="")
+ if pd.color_source in {'PARTICLE_SPEED', 'PARTICLE_VELOCITY'}:
+ col.prop(pd, "speed_scale")
+ if pd.color_source in {'PARTICLE_SPEED', 'PARTICLE_AGE'}:
+ layout.template_color_ramp(pd, "color_ramp", expand=True)
col = split.column()
col.label()
@@ -753,12 +734,9 @@ class TEXTURE_PT_pointdensity_turbulence(TextureButtonsPanel, bpy.types.Panel):
return tex and (tex.type == 'POINT_DENSITY' and (engine in cls.COMPAT_ENGINES))
def draw_header(self, context):
- layout = self.layout
+ pd = context.texture.point_density
- tex = context.texture
- pd = tex.point_density
-
- layout.prop(pd, "use_turbulence", text="")
+ self.layout.prop(pd, "use_turbulence", text="")
def draw(self, context):
layout = self.layout
@@ -841,7 +819,7 @@ class TEXTURE_PT_mapping(TextureSlotPanel, bpy.types.Panel):
layout.prop(tex, "map_mode", expand=True)
row = layout.row()
- row.active = tex.map_mode in ('FIXED', 'TILED')
+ row.active = tex.map_mode in {'FIXED', 'TILED'}
row.prop(tex, "angle")
else:
if isinstance(idblock, bpy.types.Material):
@@ -852,7 +830,7 @@ class TEXTURE_PT_mapping(TextureSlotPanel, bpy.types.Panel):
split = layout.split()
col = split.column()
- if tex.texture_coords in ('ORCO', 'UV'):
+ if tex.texture_coords in {'ORCO', 'UV'}:
col.prop(tex, "use_from_dupli")
elif tex.texture_coords == 'OBJECT':
col.prop(tex, "use_from_original")
@@ -865,14 +843,9 @@ class TEXTURE_PT_mapping(TextureSlotPanel, bpy.types.Panel):
row.prop(tex, "mapping_y", text="")
row.prop(tex, "mapping_z", text="")
- split = layout.split()
-
- col = split.column()
- col.prop(tex, "offset")
-
- col = split.column()
-
- col.prop(tex, "scale")
+ row = layout.row()
+ row.column().prop(tex, "offset")
+ row.column().prop(tex, "scale")
class TEXTURE_PT_influence(TextureSlotPanel, bpy.types.Panel):
@@ -909,7 +882,7 @@ class TEXTURE_PT_influence(TextureSlotPanel, bpy.types.Panel):
return sub # XXX, temp. use_map_normal needs to override.
if isinstance(idblock, bpy.types.Material):
- if idblock.type in ('SURFACE', 'WIRE'):
+ if idblock.type in {'SURFACE', 'WIRE'}:
split = layout.split()
col = split.column()
@@ -1038,19 +1011,17 @@ class TEXTURE_PT_influence(TextureSlotPanel, bpy.types.Panel):
col.prop(tex, "default_value", text="DVar", slider=True)
if isinstance(idblock, bpy.types.Material):
- row = layout.row()
- row.label(text="Bump Mapping:")
+ layout.label(text="Bump Mapping:")
- row = layout.row()
# only show bump settings if activated but not for normalmap images
- row.active = tex.use_map_normal and not (tex.texture.type == 'IMAGE' and tex.texture.use_normal_map)
+ row = layout.row()
+ row.active = (tex.use_map_normal or tex.use_map_warp) and not (tex.texture.type == 'IMAGE' and tex.texture.use_normal_map)
- col = row.column()
- col.prop(tex, "bump_method", text="Method")
+ row.prop(tex, "bump_method", text="Method")
- col = row.column()
- col.prop(tex, "bump_objectspace", text="Space")
- col.active = tex.bump_method in ('BUMP_DEFAULT', 'BUMP_BEST_QUALITY')
+ sub = row.row()
+ sub.active = tex.bump_method in {'BUMP_DEFAULT', 'BUMP_BEST_QUALITY'}
+ sub.prop(tex, "bump_objectspace", text="Space")
class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, bpy.types.Panel):
@@ -1058,13 +1029,5 @@ class TEXTURE_PT_custom_props(TextureButtonsPanel, PropertyPanel, bpy.types.Pane
_context_path = "texture"
_property_type = bpy.types.Texture
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/properties_world.py b/release/scripts/startup/bl_ui/properties_world.py
index fd11f299f34..4f398c9fbd9 100644
--- a/release/scripts/ui/properties_world.py
+++ b/release/scripts/startup/bl_ui/properties_world.py
@@ -266,13 +266,5 @@ class WORLD_PT_custom_props(WorldButtonsPanel, PropertyPanel, bpy.types.Panel):
_context_path = "world"
_property_type = bpy.types.World
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_console.py b/release/scripts/startup/bl_ui/space_console.py
index 97720947e37..da6c102100b 100644
--- a/release/scripts/ui/space_console.py
+++ b/release/scripts/startup/bl_ui/space_console.py
@@ -18,15 +18,13 @@
# <pep8 compliant>
import bpy
-from bpy.props import *
+from bpy.props import StringProperty
class CONSOLE_HT_header(bpy.types.Header):
bl_space_type = 'CONSOLE'
def draw(self, context):
- # sc = context.space_data
- # text = sc.text
layout = self.layout
row = layout.row(align=True)
@@ -161,13 +159,5 @@ class ConsoleLanguage(bpy.types.Operator):
return {'FINISHED'}
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py
index 3a3f3f4033e..930a2029d32 100644
--- a/release/scripts/ui/space_dopesheet.py
+++ b/release/scripts/startup/bl_ui/space_dopesheet.py
@@ -33,48 +33,52 @@ def dopesheet_filter(layout, context, genericFiltersOnly=False):
row.prop(dopesheet, "show_only_selected", text="")
row.prop(dopesheet, "show_hidden", text="")
- if genericFiltersOnly:
- return
-
- row = layout.row(align=True)
- row.prop(dopesheet, "show_transforms", text="")
+ if not genericFiltersOnly:
+ row = layout.row(align=True)
+ row.prop(dopesheet, "show_transforms", text="")
- if is_nla:
- row.prop(dopesheet, "show_missing_nla", text="")
+ if is_nla:
+ row.prop(dopesheet, "show_missing_nla", text="")
- row = layout.row(align=True)
- row.prop(dopesheet, "show_scenes", text="")
- row.prop(dopesheet, "show_worlds", text="")
- row.prop(dopesheet, "show_nodes", text="")
-
- if bpy.data.meshes:
- row.prop(dopesheet, "show_meshes", text="")
- if bpy.data.shape_keys:
- row.prop(dopesheet, "show_shapekeys", text="")
- if bpy.data.materials:
- row.prop(dopesheet, "show_materials", text="")
- if bpy.data.lamps:
- row.prop(dopesheet, "show_lamps", text="")
- if bpy.data.textures:
- row.prop(dopesheet, "show_textures", text="")
- if bpy.data.cameras:
- row.prop(dopesheet, "show_cameras", text="")
- if bpy.data.curves:
- row.prop(dopesheet, "show_curves", text="")
- if bpy.data.metaballs:
- row.prop(dopesheet, "show_metaballs", text="")
- if bpy.data.lattices:
- row.prop(dopesheet, "show_lattices", text="")
- if bpy.data.armatures:
- row.prop(dopesheet, "show_armatures", text="")
- if bpy.data.particles:
- row.prop(dopesheet, "show_particles", text="")
-
- if bpy.data.groups:
row = layout.row(align=True)
- row.prop(dopesheet, "show_only_group_objects", text="")
- if dopesheet.show_only_group_objects:
- row.prop(dopesheet, "filter_group", text="")
+ row.prop(dopesheet, "show_scenes", text="")
+ row.prop(dopesheet, "show_worlds", text="")
+ row.prop(dopesheet, "show_nodes", text="")
+
+ if bpy.data.meshes:
+ row.prop(dopesheet, "show_meshes", text="")
+ if bpy.data.shape_keys:
+ row.prop(dopesheet, "show_shapekeys", text="")
+ if bpy.data.materials:
+ row.prop(dopesheet, "show_materials", text="")
+ if bpy.data.lamps:
+ row.prop(dopesheet, "show_lamps", text="")
+ if bpy.data.textures:
+ row.prop(dopesheet, "show_textures", text="")
+ if bpy.data.cameras:
+ row.prop(dopesheet, "show_cameras", text="")
+ if bpy.data.curves:
+ row.prop(dopesheet, "show_curves", text="")
+ if bpy.data.metaballs:
+ row.prop(dopesheet, "show_metaballs", text="")
+ if bpy.data.lattices:
+ row.prop(dopesheet, "show_lattices", text="")
+ if bpy.data.armatures:
+ row.prop(dopesheet, "show_armatures", text="")
+ if bpy.data.particles:
+ row.prop(dopesheet, "show_particles", text="")
+
+ if bpy.data.groups:
+ row = layout.row(align=True)
+ row.prop(dopesheet, "show_only_group_objects", text="")
+ if dopesheet.show_only_group_objects:
+ row.prop(dopesheet, "filter_group", text="")
+
+ if not is_nla:
+ row = layout.row(align=True)
+ row.prop(dopesheet, "show_only_matching_fcurves", text="")
+ if dopesheet.show_only_matching_fcurves:
+ row.prop(dopesheet, "filter_fcurve_name", text="")
#######################################
@@ -118,7 +122,7 @@ class DOPESHEET_HT_header(bpy.types.Header):
# filters which will work here and are useful (especially for character animation)
dopesheet_filter(layout, context, genericFiltersOnly=True)
- if st.mode in ('ACTION', 'SHAPEKEY'):
+ if st.mode in {'ACTION', 'SHAPEKEY'}:
layout.template_ID(st, "action", new="action.new")
# Grease Pencil mode doesn't need snapping, as it's frame-aligned only
@@ -159,6 +163,7 @@ class DOPESHEET_MT_view(bpy.types.Menu):
layout.separator()
layout.operator("action.frame_jump")
layout.operator("action.view_all")
+ layout.operator("action.view_selected")
layout.separator()
layout.operator("screen.area_dupli")
@@ -221,10 +226,13 @@ class DOPESHEET_MT_marker(bpy.types.Menu):
layout.operator("marker.rename", text="Rename Marker")
layout.operator("marker.move", text="Grab/Move Marker")
- if st.mode in ('ACTION', 'SHAPEKEY') and st.action:
+ if st.mode in {'ACTION', 'SHAPEKEY'} and st.action:
layout.separator()
layout.prop(st, "show_pose_markers")
+ if st.show_pose_markers is False:
+ layout.operator("action.markers_make_local")
+
#######################################
# Keyframe Editing
@@ -357,13 +365,5 @@ class DOPESHEET_MT_gpencil_frame(bpy.types.Menu):
#layout.operator("action.copy")
#layout.operator("action.paste")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index 2d66bb38637..73fe1a97252 100644
--- a/release/scripts/ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -43,7 +43,7 @@ class FILEBROWSER_HT_header(bpy.types.Header):
row.separator()
row = layout.row(align=True)
- row.operator("file.directory_new", text="", icon='NEWFOLDER')
+ row.operator("file.directory_new", icon='NEWFOLDER')
params = st.params
@@ -73,13 +73,5 @@ class FILEBROWSER_HT_header(bpy.types.Header):
row.prop(params, "use_filter_sound", text="")
row.prop(params, "use_filter_text", text="")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_graph.py b/release/scripts/startup/bl_ui/space_graph.py
index 6bc47ffce86..bfc1a0e3a23 100644
--- a/release/scripts/ui/space_graph.py
+++ b/release/scripts/startup/bl_ui/space_graph.py
@@ -25,7 +25,7 @@ class GRAPH_HT_header(bpy.types.Header):
bl_space_type = 'GRAPH_EDITOR'
def draw(self, context):
- from space_dopesheet import dopesheet_filter
+ from bl_ui.space_dopesheet import dopesheet_filter
layout = self.layout
@@ -100,6 +100,7 @@ class GRAPH_MT_view(bpy.types.Menu):
layout.separator()
layout.operator("graph.frame_jump")
layout.operator("graph.view_all")
+ layout.operator("graph.view_selected")
layout.separator()
layout.operator("screen.area_dupli")
@@ -209,6 +210,7 @@ class GRAPH_MT_key(bpy.types.Menu):
layout.separator()
layout.operator("graph.keyframe_insert")
layout.operator("graph.fmodifier_add")
+ layout.operator("graph.sound_bake")
layout.separator()
layout.operator("graph.duplicate")
@@ -244,13 +246,5 @@ class GRAPH_MT_key_transform(bpy.types.Menu):
layout.operator("transform.rotate", text="Rotate")
layout.operator("transform.resize", text="Scale")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index c0ef692a2d0..f3b78de813c 100644
--- a/release/scripts/ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -92,7 +92,7 @@ class IMAGE_MT_select(bpy.types.Menu):
layout.operator("uv.select_all")
layout.operator("uv.select_inverse")
- layout.operator("uv.unlink_selection")
+ layout.operator("uv.unlink_selected")
layout.separator()
@@ -143,7 +143,7 @@ class IMAGE_MT_image(bpy.types.Menu):
# only for dirty && specific image types, perhaps
# this could be done in operator poll too
if ima.is_dirty:
- if ima.source in ('FILE', 'GENERATED') and ima.type != 'MULTILAYER':
+ if ima.source in {'FILE', 'GENERATED'} and ima.type != 'MULTILAYER':
layout.operator("image.pack", text="Pack As PNG").as_png = True
layout.separator()
@@ -206,14 +206,14 @@ class IMAGE_MT_uvs_snap(bpy.types.Menu):
layout = self.layout
layout.operator_context = 'EXEC_REGION_WIN'
- layout.operator("uv.snap_selection", text="Selected to Pixels").target = 'PIXELS'
- layout.operator("uv.snap_selection", text="Selected to Cursor").target = 'CURSOR'
- layout.operator("uv.snap_selection", text="Selected to Adjacent Unselected").target = 'ADJACENT_UNSELECTED'
+ layout.operator("uv.snap_selected", text="Selected to Pixels").target = 'PIXELS'
+ layout.operator("uv.snap_selected", text="Selected to Cursor").target = 'CURSOR'
+ layout.operator("uv.snap_selected", text="Selected to Adjacent Unselected").target = 'ADJACENT_UNSELECTED'
layout.separator()
layout.operator("uv.snap_cursor", text="Cursor to Pixels").target = 'PIXELS'
- layout.operator("uv.snap_cursor", text="Cursor to Selection").target = 'SELECTION'
+ layout.operator("uv.snap_cursor", text="Cursor to Selected").target = 'SELECTED'
class IMAGE_MT_uvs_mirror(bpy.types.Menu):
@@ -387,8 +387,8 @@ class IMAGE_HT_header(bpy.types.Header):
row.prop(toolsettings, "use_snap", text="")
row.prop(toolsettings, "snap_element", text="", icon_only=True)
- # mesh = context.edit_object.data
- # row.prop_search(mesh.uv_textures, "active", mesh, "uv_textures")
+ mesh = context.edit_object.data
+ layout.prop_search(mesh.uv_textures, "active", mesh, "uv_textures", text="")
if ima:
# layers
@@ -404,7 +404,7 @@ class IMAGE_HT_header(bpy.types.Header):
row = layout.row(align=True)
if ima.type == 'COMPOSITE':
row.operator("image.record_composite", icon='REC')
- if ima.type == 'COMPOSITE' and ima.source in ('MOVIE', 'SEQUENCE'):
+ if ima.type == 'COMPOSITE' and ima.source in {'MOVIE', 'SEQUENCE'}:
row.operator("image.play_composite", icon='PLAY')
if show_uvedit or sima.use_image_paint:
@@ -425,7 +425,6 @@ class IMAGE_PT_image_properties(bpy.types.Panel):
layout = self.layout
sima = context.space_data
- # ima = sima.image
iuser = sima.image_user
layout.template_image(sima, "image", iuser)
@@ -608,7 +607,9 @@ class IMAGE_PT_view_properties(bpy.types.Panel):
if show_uvedit:
col = layout.column()
- col.prop(uvedit, "cursor_location")
+ col.label("Cursor Location")
+ row = col.row()
+ row.prop(uvedit, "cursor_location", text="")
col = layout.column()
col.label(text="UVs:")
@@ -668,7 +669,7 @@ class IMAGE_PT_paint(bpy.types.Panel):
col.prop(brush, "blend", text="Blend")
- if brush.imagepaint_tool == 'CLONE':
+ if brush.image_tool == 'CLONE':
col.separator()
col.prop(brush, "clone_image", text="Image")
col.prop(brush, "clone_alpha", text="Alpha")
@@ -684,11 +685,9 @@ class IMAGE_PT_tools_brush_texture(BrushButtonsPanel, bpy.types.Panel):
toolsettings = context.tool_settings.image_paint
brush = toolsettings.brush
-# tex_slot = brush.texture_slot
-
col = layout.column()
-
col.template_ID_preview(brush, "texture", new="texture.new", rows=3, cols=8)
+ col.prop(brush, "use_fixed_texture")
class IMAGE_PT_tools_brush_tool(BrushButtonsPanel, bpy.types.Panel):
@@ -702,13 +701,13 @@ class IMAGE_PT_tools_brush_tool(BrushButtonsPanel, bpy.types.Panel):
col = layout.column(align=True)
- col.prop(brush, "imagepaint_tool", expand=False, text="")
+ col.prop(brush, "image_tool", expand=False, text="")
row = layout.row(align=True)
row.prop(brush, "use_paint_sculpt", text="", icon='SCULPTMODE_HLT')
row.prop(brush, "use_paint_vertex", text="", icon='VPAINT_HLT')
row.prop(brush, "use_paint_weight", text="", icon='WPAINT_HLT')
- row.prop(brush, "use_paint_texture", text="", icon='TPAINT_HLT')
+ row.prop(brush, "use_paint_image", text="", icon='TPAINT_HLT')
class IMAGE_PT_paint_stroke(BrushButtonsPanel, bpy.types.Panel):
@@ -755,13 +754,5 @@ class IMAGE_PT_paint_curve(BrushButtonsPanel, bpy.types.Panel):
row.operator("brush.curve_preset", icon="LINCURVE", text="").shape = 'LINE'
row.operator("brush.curve_preset", icon="NOCURVE", text="").shape = 'MAX'
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py
index c19321a198b..49f8e890856 100644
--- a/release/scripts/ui/space_info.py
+++ b/release/scripts/startup/bl_ui/space_info.py
@@ -202,6 +202,7 @@ class INFO_MT_mesh_add(bpy.types.Menu):
layout.separator()
layout.operator("mesh.primitive_grid_add", icon='MESH_GRID', text="Grid")
layout.operator("mesh.primitive_monkey_add", icon='MESH_MONKEY', text="Monkey")
+ layout.operator("mesh.primitive_torus_add", text="Torus", icon='MESH_TORUS')
class INFO_MT_curve_add(bpy.types.Menu):
@@ -326,8 +327,6 @@ class INFO_MT_render(bpy.types.Menu):
def draw(self, context):
layout = self.layout
- # rd = context.scene.render
-
layout.operator("render.render", text="Render Image", icon='RENDER_STILL')
layout.operator("render.render", text="Render Animation", icon='RENDER_ANIMATION').animation = True
@@ -351,7 +350,7 @@ class INFO_MT_help(bpy.types.Menu):
layout = self.layout
layout.operator("wm.url_open", text="Manual", icon='HELP').url = 'http://wiki.blender.org/index.php/Doc:Manual'
- layout.operator("wm.url_open", text="Release Log", icon='URL').url = 'http://www.blender.org/development/release-logs/blender-256-beta/'
+ layout.operator("wm.url_open", text="Release Log", icon='URL').url = 'http://www.blender.org/development/release-logs/blender-257/'
layout.separator()
@@ -366,12 +365,12 @@ class INFO_MT_help(bpy.types.Menu):
layout.operator("help.operator_cheat_sheet", icon='TEXT')
layout.operator("wm.sysinfo", icon='TEXT')
layout.separator()
- if sys.platform == "win32":
- layout.operator("wm.toggle_console", icon='CONSOLE')
+ if sys.platform[:3] == "win":
+ layout.operator("wm.console_toggle", icon='CONSOLE')
layout.separator()
- layout.operator("anim.update_data_paths", text="FCurve/Driver 2.54 fix", icon='HELP')
+ layout.operator("anim.update_data_paths", text="FCurve/Driver Version fix", icon='HELP')
layout.separator()
- layout.operator("wm.splash")
+ layout.operator("wm.splash", icon='BLENDER')
# Help operators
@@ -401,13 +400,5 @@ class HELP_OT_operator_cheat_sheet(bpy.types.Operator):
self.report({'INFO'}, "See OperatorList.txt textblock")
return {'FINISHED'}
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_logic.py b/release/scripts/startup/bl_ui/space_logic.py
index 3c55853e2e2..7f7aba71a46 100644
--- a/release/scripts/ui/space_logic.py
+++ b/release/scripts/startup/bl_ui/space_logic.py
@@ -86,13 +86,5 @@ class LOGIC_MT_view(bpy.types.Menu):
layout.operator("logic.properties", icon='MENU_PANEL')
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_nla.py b/release/scripts/startup/bl_ui/space_nla.py
index 7388a839d6d..717adb3baa8 100644
--- a/release/scripts/ui/space_nla.py
+++ b/release/scripts/startup/bl_ui/space_nla.py
@@ -25,7 +25,7 @@ class NLA_HT_header(bpy.types.Header):
bl_space_type = 'NLA_EDITOR'
def draw(self, context):
- from space_dopesheet import dopesheet_filter
+ from bl_ui.space_dopesheet import dopesheet_filter
layout = self.layout
@@ -188,15 +188,7 @@ class NLA_MT_edit_transform(bpy.types.Menu):
layout.column()
layout.operator("transform.translate", text="Grab/Move")
layout.operator("transform.transform", text="Extend").mode = 'TIME_EXTEND'
- layout.operator("transform.resize", text="Scale")
+ layout.operator("transform.transform", text="Scale").mode = 'TIME_SCALE'
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py
index aaf14813ee5..fed1cc49c4c 100644
--- a/release/scripts/ui/space_node.py
+++ b/release/scripts/startup/bl_ui/space_node.py
@@ -156,9 +156,6 @@ class NODE_MT_node(bpy.types.Menu):
layout.operator("node.preview_toggle")
layout.operator("node.hide_socket_toggle")
- # XXX
- # layout.operator("node.rename")
-
layout.separator()
layout.operator("node.show_cyclic_dependencies")
@@ -195,13 +192,5 @@ class NODE_PT_properties(bpy.types.Panel):
col.prop(snode, "backdrop_y", text="Y")
col.operator("node.backimage_move", text="Move")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py
index 219dd1de117..1f196cbd191 100644
--- a/release/scripts/ui/space_outliner.py
+++ b/release/scripts/startup/bl_ui/space_outliner.py
@@ -72,7 +72,7 @@ class OUTLINER_MT_view(bpy.types.Menu):
space = context.space_data
col = layout.column()
- if space.display_mode not in ('DATABLOCKS', 'USER_PREFERENCES', 'KEYMAPS'):
+ if space.display_mode not in {'DATABLOCKS', 'USER_PREFERENCES', 'KEYMAPS'}:
col.prop(space, "show_restrict_columns")
col.separator()
col.operator("outliner.show_active")
@@ -116,13 +116,5 @@ class OUTLINER_MT_edit_datablocks(bpy.types.Menu):
col.operator("outliner.drivers_add_selected")
col.operator("outliner.drivers_delete_selected")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index 937ccf6a8a3..2079aef6402 100644
--- a/release/scripts/ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -101,34 +101,6 @@ class SEQUENCER_MT_view(bpy.types.Menu):
layout.separator()
- """
- uiBlock *block= uiBeginBlock(C, ar, "seq_viewmenu", UI_EMBOSSP);
- short yco= 0, menuwidth=120;
-
- if (sseq->mainb == SEQ_DRAW_SEQUENCE) {
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Play Back Animation "
- "in all Sequence Areas|Alt A", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- }
- else {
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL,
- "Grease Pencil...", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
- uiDefMenuSep(block);
-
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Play Back Animation "
- "in this window|Alt A", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- }
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Play Back Animation in all "
- "3D Views and Sequence Areas|Alt Shift A",
- 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
-
- """
if (st.view_type == 'SEQUENCER') or (st.view_type == 'SEQUENCER_PREVIEW'):
layout.operator("sequencer.view_all", text='View all Sequences')
if (st.view_type == 'PREVIEW') or (st.view_type == 'SEQUENCER_PREVIEW'):
@@ -415,11 +387,11 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, bpy.types.Panel):
if not strip:
return False
- return strip.type in ('ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
+ return strip.type in {'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
'PLUGIN',
'WIPE', 'GLOW', 'TRANSFORM', 'COLOR', 'SPEED',
- 'MULTICAM')
+ 'MULTICAM'}
def draw(self, context):
layout = self.layout
@@ -445,7 +417,7 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, bpy.types.Panel):
col = layout.column()
col.prop(strip, "blur_width", slider=True)
- if strip.transition_type in ('SINGLE', 'DOUBLE'):
+ if strip.transition_type in {'SINGLE', 'DOUBLE'}:
col.prop(strip, "angle")
elif strip.type == 'GLOW':
@@ -491,7 +463,7 @@ class SEQUENCER_PT_effect(SequencerButtonsPanel, bpy.types.Panel):
col = layout.column(align=True)
if strip.type == 'SPEED':
col.prop(strip, "multiply_speed")
- elif strip.type in ('CROSS', 'GAMMA_CROSS', 'PLUGIN', 'WIPE'):
+ elif strip.type in {'CROSS', 'GAMMA_CROSS', 'PLUGIN', 'WIPE'}:
col.prop(strip, "use_default_fade", "Default fade")
if not strip.use_default_fade:
col.prop(strip, "effect_fader", text="Effect fader")
@@ -553,12 +525,12 @@ class SEQUENCER_PT_input(SequencerButtonsPanel, bpy.types.Panel):
if not strip:
return False
- return strip.type in ('MOVIE', 'IMAGE', 'SCENE', 'META',
+ return strip.type in {'MOVIE', 'IMAGE', 'SCENE', 'META',
'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
'PLUGIN',
'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
- 'MULTICAM', 'SPEED')
+ 'MULTICAM', 'SPEED'}
def draw(self, context):
layout = self.layout
@@ -703,12 +675,12 @@ class SEQUENCER_PT_filter(SequencerButtonsPanel, bpy.types.Panel):
if not strip:
return False
- return strip.type in ('MOVIE', 'IMAGE', 'SCENE', 'META',
+ return strip.type in {'MOVIE', 'IMAGE', 'SCENE', 'META',
'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
'CROSS', 'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP',
'PLUGIN',
'WIPE', 'GLOW', 'TRANSFORM', 'COLOR',
- 'MULTICAM', 'SPEED')
+ 'MULTICAM', 'SPEED'}
def draw(self, context):
layout = self.layout
@@ -765,7 +737,7 @@ class SEQUENCER_PT_proxy(SequencerButtonsPanel, bpy.types.Panel):
if not strip:
return False
- return strip.type in ('MOVIE', 'IMAGE', 'SCENE', 'META', 'MULTICAM')
+ return strip.type in {'MOVIE', 'IMAGE', 'SCENE', 'META', 'MULTICAM'}
def draw_header(self, context):
strip = act_strip(context)
@@ -828,13 +800,5 @@ class SEQUENCER_PT_view(SequencerButtonsPanel_Output, bpy.types.Panel):
col.prop(st, "show_separate_color")
col.prop(st, "proxy_render_size")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_text.py b/release/scripts/startup/bl_ui/space_text.py
index d1ccdf2acbb..3d3fc8499af 100644
--- a/release/scripts/ui/space_text.py
+++ b/release/scripts/startup/bl_ui/space_text.py
@@ -298,13 +298,5 @@ class TEXT_MT_toolbox(bpy.types.Menu):
layout.operator("text.run_script")
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_time.py b/release/scripts/startup/bl_ui/space_time.py
index 046274abc89..7e62465d1ee 100644
--- a/release/scripts/ui/space_time.py
+++ b/release/scripts/startup/bl_ui/space_time.py
@@ -141,7 +141,6 @@ class TIME_MT_frame(bpy.types.Menu):
def draw(self, context):
layout = self.layout
- # tools = context.tool_settings
layout.operator("marker.add", text="Add Marker")
layout.operator("marker.duplicate", text="Duplicate Marker")
@@ -198,13 +197,5 @@ class TIME_MT_autokey(bpy.types.Menu):
layout.prop_enum(tools, "auto_keying_mode", 'ADD_REPLACE_KEYS')
layout.prop_enum(tools, "auto_keying_mode", 'REPLACE_KEYS')
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index a1fb82b8930..13ff09d7f23 100644
--- a/release/scripts/ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -19,7 +19,6 @@
# <pep8 compliant>
import bpy
import os
-import shutil
import addon_utils
from bpy.props import StringProperty, BoolProperty, EnumProperty
@@ -121,6 +120,18 @@ class USERPREF_MT_interaction_presets(bpy.types.Menu):
draw = bpy.types.Menu.draw_preset
+class USERPREF_MT_appconfigs(bpy.types.Menu):
+ bl_label = "AppPresets"
+ preset_subdir = "keyconfig"
+ preset_operator = "wm.appconfig_activate"
+
+ def draw(self, context):
+ props = self.layout.operator("wm.appconfig_default", text="Blender (default)")
+
+ # now draw the presets
+ bpy.types.Menu.draw_preset(self, context)
+
+
class USERPREF_MT_splash(bpy.types.Menu):
bl_label = "Splash"
@@ -135,7 +146,7 @@ class USERPREF_MT_splash(bpy.types.Menu):
# text = bpy.path.display_name(context.window_manager.keyconfigs.active.name)
# if not text:
# text = "Blender (default)"
- row.menu("USERPREF_MT_keyconfigs", text="Preset")
+ row.menu("USERPREF_MT_appconfigs", text="Preset")
class USERPREF_PT_interface(bpy.types.Panel):
@@ -638,7 +649,7 @@ class USERPREF_PT_theme(bpy.types.Panel):
layout.separator()
layout.separator()
- elif theme.theme_area == 'COLOR_SETS':
+ elif theme.theme_area == 'BONE_COLOR_SETS':
col = split.column()
for i, ui in enumerate(theme.bone_color_sets):
@@ -738,7 +749,7 @@ class USERPREF_PT_file(bpy.types.Panel):
sub.active = paths.use_auto_save_temporary_files
sub.prop(paths, "auto_save_time", text="Timer (mins)")
-from space_userpref_keymap import InputKeyMapPanel
+from bl_ui.space_userpref_keymap import InputKeyMapPanel
class USERPREF_PT_input(InputKeyMapPanel):
@@ -854,8 +865,6 @@ class USERPREF_PT_addons(bpy.types.Panel):
bl_region_type = 'WINDOW'
bl_options = {'HIDE_HEADER'}
- _addons_cats = None
- _addons_sups = None
_addons_fake_modules = {}
@classmethod
@@ -876,22 +885,6 @@ class USERPREF_PT_addons(bpy.types.Panel):
# collect the categories that can be filtered on
addons = [(mod, addon_utils.module_bl_info(mod)) for mod in addon_utils.modules(USERPREF_PT_addons._addons_fake_modules)]
- cats = {info["category"] for mod, info in addons}
- cats.discard("")
-
- if USERPREF_PT_addons._addons_cats != cats:
- bpy.types.WindowManager.addon_filter = EnumProperty(items=[(cat, cat, "") for cat in ["All", "Enabled", "Disabled"] + sorted(cats)], name="Category", description="Filter add-ons by category")
- bpy.types.WindowManager.addon_search = StringProperty(name="Search", description="Search within the selected filter")
- USERPREF_PT_addons._addons_cats = cats
-
- sups_default = {'OFFICIAL', 'COMMUNITY'}
- sups = sups_default | {info["support"] for mod, info in addons}
- sups.discard("")
-
- if USERPREF_PT_addons._addons_sups != sups:
- bpy.types.WindowManager.addon_support = EnumProperty(items=[(sup, sup.title(), "") for sup in reversed(sorted(sups))], name="Support", description="Display support level", default=sups_default, options={'ENUM_FLAG'})
- USERPREF_PT_addons._addons_sups = sups
-
split = layout.split(percentage=0.2)
col = split.column()
col.prop(context.window_manager, "addon_search", text="", icon='VIEWZOOM')
@@ -994,7 +987,7 @@ class USERPREF_PT_addons(bpy.types.Panel):
module_names = {mod.__name__ for mod, info in addons}
missing_modules = {ext for ext in used_ext if ext not in module_names}
- if missing_modules and filter in ("All", "Enabled"):
+ if missing_modules and filter in {"All", "Enabled"}:
col.column().separator()
col.column().label(text="Missing script files")
@@ -1051,6 +1044,10 @@ class WM_OT_addon_install(bpy.types.Operator):
bl_label = "Install Add-On..."
overwrite = BoolProperty(name="Overwrite", description="Remove existing addons with the same ID", default=True)
+ target = EnumProperty(
+ name="Target Path",
+ items=(('DEFAULT', "Default", ""),
+ ('PREFS', "User Prefs", "")))
filepath = StringProperty(name="File Path", description="File path to write file to")
filter_folder = BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'})
@@ -1073,15 +1070,26 @@ class WM_OT_addon_install(bpy.types.Operator):
def execute(self, context):
import traceback
import zipfile
+ import shutil
+
pyfile = self.filepath
- # dont use bpy.utils.script_paths("addons") because we may not be able to write to it.
- path_addons = bpy.utils.user_resource('SCRIPTS', "addons", create=True)
+ if self.target == 'DEFAULT':
+ # dont use bpy.utils.script_paths("addons") because we may not be able to write to it.
+ path_addons = bpy.utils.user_resource('SCRIPTS', "addons", create=True)
+ else:
+ path_addons = bpy.context.user_preferences.filepaths.script_directory
+ if path_addons:
+ path_addons = os.path.join(path_addons, "addons")
if not path_addons:
self.report({'ERROR'}, "Failed to get addons path")
return {'CANCELLED'}
+ # create dir is if missing.
+ if not os.path.exists(path_addons):
+ os.makedirs(path_addons)
+
# Check if we are installing from a target path,
# doing so causes 2+ addons of same name or when the same from/to
# location is used, removal of the file!
@@ -1117,6 +1125,12 @@ class WM_OT_addon_install(bpy.types.Operator):
try: # extract the file to "addons"
file_to_extract.extractall(path_addons)
+
+ # zip files can create this dir with metadata, don't need it
+ macosx_dir = os.path.join(path_addons, '__MACOSX')
+ if os.path.isdir(macosx_dir):
+ shutil.rmtree(macosx_dir)
+
except:
traceback.print_exc()
return {'CANCELLED'}
@@ -1188,13 +1202,5 @@ class WM_OT_addon_expand(bpy.types.Operator):
info["show_expanded"] = not info["show_expanded"]
return {'FINISHED'}
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_userpref_keymap.py b/release/scripts/startup/bl_ui/space_userpref_keymap.py
index 34d461fbef2..2fbaae499e7 100644
--- a/release/scripts/ui/space_userpref_keymap.py
+++ b/release/scripts/startup/bl_ui/space_userpref_keymap.py
@@ -206,7 +206,7 @@ class InputKeyMapPanel(bpy.types.Panel):
# Key Map items
if km.show_expanded_items:
- for kmi in km.items:
+ for kmi in km.keymap_items:
self.draw_kmi(display_keymaps, kc, km, kmi, col, level + 1)
# "Add New" at end of keymap item list
@@ -292,7 +292,7 @@ class InputKeyMapPanel(bpy.types.Panel):
box.enabled = km.is_user_defined
- if map_type not in ('TEXTINPUT', 'TIMER'):
+ if map_type not in {'TEXTINPUT', 'TIMER'}:
split = box.split(percentage=0.4)
sub = split.row()
@@ -339,7 +339,7 @@ class InputKeyMapPanel(bpy.types.Panel):
km = km.active()
layout.context_pointer_set("keymap", km)
- filtered_items = [kmi for kmi in km.items if filter_text in kmi.name.lower()]
+ filtered_items = [kmi for kmi in km.keymap_items if filter_text in kmi.name.lower()]
if len(filtered_items) != 0:
col = layout.column()
@@ -404,7 +404,7 @@ class InputKeyMapPanel(bpy.types.Panel):
self.draw_hierarchy(display_keymaps, col)
-from bpy.props import *
+from bpy.props import StringProperty, BoolProperty, IntProperty
def export_properties(prefix, properties, lines=None):
@@ -433,9 +433,9 @@ class WM_OT_keyconfig_test(bpy.types.Operator):
def kmistr(kmi):
if km.is_modal:
- s = ["kmi = km.items.new_modal(\'%s\', \'%s\', \'%s\'" % (kmi.propvalue, kmi.type, kmi.value)]
+ s = ["kmi = km.keymap_items.new_modal(\'%s\', \'%s\', \'%s\'" % (kmi.propvalue, kmi.type, kmi.value)]
else:
- s = ["kmi = km.items.new(\'%s\', \'%s\', \'%s\'" % (kmi.idname, kmi.type, kmi.value)]
+ s = ["kmi = km.keymap_items.new(\'%s\', \'%s\', \'%s\'" % (kmi.idname, kmi.type, kmi.value)]
if kmi.any:
s.append(", any=True")
@@ -468,7 +468,7 @@ class WM_OT_keyconfig_test(bpy.types.Operator):
km = km.active()
if src:
- for item in km.items:
+ for item in km.keymap_items:
if src.compare(item):
print("===========")
print(parent.name)
@@ -481,15 +481,15 @@ class WM_OT_keyconfig_test(bpy.types.Operator):
if self.testEntry(kc, child, src, parent):
result = True
else:
- for i in range(len(km.items)):
- src = km.items[i]
+ for i in range(len(km.keymap_items)):
+ src = km.keymap_items[i]
for child in children:
if self.testEntry(kc, child, src, km):
result = True
- for j in range(len(km.items) - i - 1):
- item = km.items[j + i + 1]
+ for j in range(len(km.keymap_items) - i - 1):
+ item = km.keymap_items[j + i + 1]
if src.compare(item):
print("===========")
print(km.name)
@@ -633,11 +633,11 @@ class WM_OT_keyconfig_export(bpy.types.Operator):
f.write("# Map %s\n" % km.name)
f.write("km = kc.keymaps.new('%s', space_type='%s', region_type='%s', modal=%s)\n\n" % (km.name, km.space_type, km.region_type, km.is_modal))
- for kmi in km.items:
+ for kmi in km.keymap_items:
if km.is_modal:
- f.write("kmi = km.items.new_modal('%s', '%s', '%s'" % (kmi.propvalue, kmi.type, kmi.value))
+ f.write("kmi = km.keymap_items.new_modal('%s', '%s', '%s'" % (kmi.propvalue, kmi.type, kmi.value))
else:
- f.write("kmi = km.items.new('%s', '%s', '%s'" % (kmi.idname, kmi.type, kmi.value))
+ f.write("kmi = km.keymap_items.new('%s', '%s', '%s'" % (kmi.idname, kmi.type, kmi.value))
if kmi.any:
f.write(", any=True")
else:
@@ -710,12 +710,12 @@ class WM_OT_keyitem_restore(bpy.types.Operator):
@classmethod
def poll(cls, context):
- km = context.keymap
- return km.is_user_defined
+ keymap = getattr(context, "keymap", None)
+ return keymap and keymap.is_user_defined
def execute(self, context):
km = context.keymap
- kmi = km.items.from_id(self.item_id)
+ kmi = km.keymap_items.from_id(self.item_id)
if not kmi.is_user_defined:
km.restore_item_to_default(kmi)
@@ -734,9 +734,9 @@ class WM_OT_keyitem_add(bpy.types.Operator):
kc = wm.keyconfigs.default
if km.is_modal:
- km.items.new_modal("", 'A', 'PRESS') # kmi
+ km.keymap_items.new_modal("", 'A', 'PRESS') # kmi
else:
- km.items.new("none", 'A', 'PRESS') # kmi
+ km.keymap_items.new("none", 'A', 'PRESS') # kmi
# clear filter and expand keymap so we can see the newly added item
if context.space_data.filter_text != "":
@@ -756,13 +756,12 @@ class WM_OT_keyitem_remove(bpy.types.Operator):
@classmethod
def poll(cls, context):
- km = context.keymap
- return km.is_user_defined
+ return hasattr(context, "keymap") and context.keymap.is_user_defined
def execute(self, context):
km = context.keymap
- kmi = km.items.from_id(self.item_id)
- km.items.remove(kmi)
+ kmi = km.keymap_items.from_id(self.item_id)
+ km.keymap_items.remove(kmi)
return {'FINISHED'}
@@ -774,7 +773,8 @@ class WM_OT_keyconfig_remove(bpy.types.Operator):
@classmethod
def poll(cls, context):
wm = context.window_manager
- return wm.keyconfigs.active.is_user_defined
+ keyconf = wm.keyconfigs.active
+ return keyconf and keyconf.is_user_defined
def execute(self, context):
wm = context.window_manager
@@ -782,13 +782,5 @@ class WM_OT_keyconfig_remove(bpy.types.Operator):
wm.keyconfigs.remove(keyconfig)
return {'FINISHED'}
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index cb10d6a3570..3cb39736290 100644
--- a/release/scripts/ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -42,13 +42,13 @@ class VIEW3D_HT_header(bpy.types.Header):
sub.menu("VIEW3D_MT_view")
# Select Menu
- if mode_string not in ('EDIT_TEXT', 'SCULPT', 'PAINT_WEIGHT', 'PAINT_VERTEX', 'PAINT_TEXTURE'):
+ if mode_string not in {'EDIT_TEXT', 'SCULPT', 'PAINT_WEIGHT', 'PAINT_VERTEX', 'PAINT_TEXTURE'}:
sub.menu("VIEW3D_MT_select_%s" % mode_string.lower())
if edit_object:
sub.menu("VIEW3D_MT_edit_%s" % edit_object.type.lower())
elif obj:
- if mode_string not in ('PAINT_TEXTURE'):
+ if mode_string not in {'PAINT_TEXTURE'}:
sub.menu("VIEW3D_MT_%s" % mode_string.lower())
else:
sub.menu("VIEW3D_MT_object")
@@ -71,11 +71,11 @@ class VIEW3D_HT_header(bpy.types.Header):
row.prop(toolsettings.particle_edit, "select_mode", text="", expand=True, toggle=True)
# Occlude geometry
- if view.viewport_shade in ('SOLID', 'SHADED', 'TEXTURED') and (obj.mode == 'PARTICLE_EDIT' or (obj.mode == 'EDIT' and obj.type == 'MESH')):
+ if view.viewport_shade in {'SOLID', 'SHADED', 'TEXTURED'} and (obj.mode == 'PARTICLE_EDIT' or (obj.mode == 'EDIT' and obj.type == 'MESH')):
row.prop(view, "use_occlude_geometry", text="")
# Proportional editing
- if obj.mode in ('EDIT', 'PARTICLE_EDIT'):
+ if obj.mode in {'EDIT', 'PARTICLE_EDIT'}:
row = layout.row(align=True)
row.prop(toolsettings, "proportional_edit", text="", icon_only=True)
if toolsettings.proportional_edit != 'DISABLED':
@@ -160,7 +160,7 @@ class VIEW3D_MT_transform(bpy.types.Menu):
layout.separator()
obj = context.object
- if obj.type == 'ARMATURE' and obj.mode in ('EDIT', 'POSE') and obj.data.draw_type in ('BBONE', 'ENVELOPE'):
+ if obj.type == 'ARMATURE' and obj.mode in {'EDIT', 'POSE'} and obj.data.draw_type in {'BBONE', 'ENVELOPE'}:
layout.operator("transform.transform", text="Scale Envelope/BBone").mode = 'BONE_SIZE'
if context.edit_object and context.edit_object.type == 'ARMATURE':
@@ -177,6 +177,11 @@ class VIEW3D_MT_transform(bpy.types.Menu):
layout.operator("object.origin_set", text="Origin to Geometry").type = 'ORIGIN_GEOMETRY'
layout.operator("object.origin_set", text="Origin to 3D Cursor").type = 'ORIGIN_CURSOR'
+ layout.separator()
+
+ layout.operator("object.randomize_transform")
+ layout.operator("object.align")
+
class VIEW3D_MT_mirror(bpy.types.Menu):
bl_label = "Mirror"
@@ -240,9 +245,21 @@ class VIEW3D_MT_uv_map(bpy.types.Menu):
layout = self.layout
layout.operator("uv.unwrap")
+
+ layout.operator_context = 'INVOKE_DEFAULT'
+ layout.operator("uv.smart_project")
+ layout.operator("uv.lightmap_pack")
+ layout.operator("uv.follow_active_quads")
+
+ layout.separator()
+
+ layout.operator_context = 'EXEC_DEFAULT'
layout.operator("uv.cube_project")
layout.operator("uv.cylinder_project")
layout.operator("uv.sphere_project")
+
+ layout.separator()
+
layout.operator("uv.project_from_view")
layout.operator("uv.project_from_view", text="Project from View (Bounds)").scale_to_bounds = True
@@ -250,6 +267,7 @@ class VIEW3D_MT_uv_map(bpy.types.Menu):
layout.operator("uv.reset")
+
# ********** View menus **********
@@ -557,7 +575,7 @@ class VIEW3D_MT_select_edit_curve(bpy.types.Menu):
layout.operator("curve.select_less")
-class sVIEW3D_MT_select_edit_surface(bpy.types.Menu):
+class VIEW3D_MT_select_edit_surface(bpy.types.Menu):
bl_label = "Select"
def draw(self, context):
@@ -716,7 +734,6 @@ class VIEW3D_MT_object(bpy.types.Menu):
class VIEW3D_MT_object_animation(bpy.types.Menu):
- bl_context = "objectmode"
bl_label = "Animation"
def draw(self, context):
@@ -766,7 +783,7 @@ class VIEW3D_MT_object_specials(bpy.types.Menu):
props.data_path_item = "data.dof_distance"
props.input_scale = 0.02
- if obj.type in ('CURVE', 'FONT'):
+ if obj.type in {'CURVE', 'FONT'}:
layout.operator_context = 'INVOKE_REGION_WIN'
props = layout.operator("wm.context_modal_mouse", text="Extrude Size")
@@ -794,7 +811,7 @@ class VIEW3D_MT_object_specials(bpy.types.Menu):
props.data_path_iter = "selected_editable_objects"
props.data_path_item = "data.energy"
- if obj.data.type in ('SPOT', 'AREA', 'POINT'):
+ if obj.data.type in {'SPOT', 'AREA', 'POINT'}:
props = layout.operator("wm.context_modal_mouse", text="Falloff Distance")
props.data_path_iter = "selected_editable_objects"
props.data_path_item = "data.distance"
@@ -1041,6 +1058,10 @@ class VIEW3D_MT_paint_weight(bpy.types.Menu):
layout.operator("object.vertex_group_clean", text="Clean")
layout.operator("object.vertex_group_levels", text="Levels")
+ layout.separator()
+
+ layout.operator("paint.weight_set")
+
# ********** Sculpt menu **********
@@ -1075,7 +1096,7 @@ class VIEW3D_MT_sculpt(bpy.types.Menu):
if sculpt_tool != 'GRAB':
layout.prop_menu_enum(brush, "stroke_method")
- if sculpt_tool in ('DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'):
+ if sculpt_tool in {'DRAW', 'PINCH', 'INFLATE', 'LAYER', 'CLAY'}:
layout.prop_menu_enum(brush, "direction")
if sculpt_tool == 'LAYER':
@@ -1160,23 +1181,20 @@ class VIEW3D_MT_pose(bpy.types.Menu):
layout.separator()
layout.menu("VIEW3D_MT_transform")
- layout.menu("VIEW3D_MT_snap")
layout.menu("VIEW3D_MT_pose_transform")
+ layout.menu("VIEW3D_MT_pose_apply")
- layout.separator()
-
- layout.operator("anim.keyframe_insert_menu", text="Insert Keyframe...")
- layout.operator("anim.keyframe_delete_v3d", text="Delete Keyframe...")
- layout.operator("anim.keying_set_active_set", text="Change Keying Set...")
+ layout.menu("VIEW3D_MT_snap")
layout.separator()
- layout.operator("pose.relax")
+ layout.menu("VIEW3D_MT_object_animation")
layout.separator()
- layout.menu("VIEW3D_MT_pose_apply")
+ layout.menu("VIEW3D_MT_pose_slide")
+ layout.menu("VIEW3D_MT_pose_propagate")
layout.separator()
@@ -1186,7 +1204,7 @@ class VIEW3D_MT_pose(bpy.types.Menu):
layout.separator()
- layout.menu("VIEW3D_MT_pose_pose")
+ layout.menu("VIEW3D_MT_pose_library")
layout.menu("VIEW3D_MT_pose_motion")
layout.menu("VIEW3D_MT_pose_group")
@@ -1234,7 +1252,36 @@ class VIEW3D_MT_pose_transform(bpy.types.Menu):
layout.label(text="Origin")
-class VIEW3D_MT_pose_pose(bpy.types.Menu):
+class VIEW3D_MT_pose_slide(bpy.types.Menu):
+ bl_label = "In-Betweens"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator("pose.push")
+ layout.operator("pose.relax")
+ layout.operator("pose.breakdown")
+
+
+class VIEW3D_MT_pose_propagate(bpy.types.Menu):
+ bl_label = "Propagate"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.operator("pose.propagate")
+
+ layout.separator()
+
+ layout.operator("pose.propagate", text="To Next Keyframe").mode = 'NEXT_KEY'
+ layout.operator("pose.propagate", text="To Last Keyframe (Make Cyclic)").mode = 'LAST_KEY'
+
+ layout.separator()
+
+ layout.operator("pose.propagate", text="On Selected Markers").mode = 'SELECTED_MARKERS'
+
+
+class VIEW3D_MT_pose_library(bpy.types.Menu):
bl_label = "Pose Library"
def draw(self, context):
@@ -1373,7 +1420,7 @@ class VIEW3D_MT_edit_mesh_specials(bpy.types.Menu):
layout.operator("mesh.select_inverse")
layout.operator("mesh.flip_normals")
layout.operator("mesh.vertices_smooth", text="Smooth")
- # layout.operator("mesh.bevel", text="Bevel")
+ layout.operator("mesh.bevel", text="Bevel")
layout.operator("mesh.faces_shade_smooth")
layout.operator("mesh.faces_shade_flat")
layout.operator("mesh.blend_from_shape")
@@ -2001,7 +2048,7 @@ class VIEW3D_PT_view3d_name(bpy.types.Panel):
row.label(text="", icon='OBJECT_DATA')
row.prop(ob, "name", text="")
- if ob.type == 'ARMATURE' and ob.mode in ('EDIT', 'POSE'):
+ if ob.type == 'ARMATURE' and ob.mode in {'EDIT', 'POSE'}:
bone = context.active_bone
if bone:
row = layout.row()
@@ -2311,3 +2358,6 @@ def unregister():
if __name__ == "__main__":
register()
+
+if __name__ == "__main__": # only for live edit.
+ bpy.utils.register_module(__name__)
diff --git a/release/scripts/ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index c1235f7d3e2..b021dbb4160 100644
--- a/release/scripts/ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -113,10 +113,6 @@ class VIEW3D_PT_tools_meshedit(View3DPanel, bpy.types.Panel):
layout = self.layout
col = layout.column(align=True)
- col.label(text="Modify:")
- col.operator("mesh.bevel")
-
- col = layout.column(align=True)
col.label(text="Transform:")
col.operator("transform.translate")
col.operator("transform.rotate")
@@ -177,11 +173,18 @@ class VIEW3D_PT_tools_meshedit_options(View3DPanel, bpy.types.Panel):
ob = context.active_object
if ob:
- mesh = context.active_object.data
+ mesh = ob.data
col = layout.column(align=True)
col.prop(mesh, "use_mirror_x")
- col.prop(mesh, "use_mirror_topology")
- col.prop(context.tool_settings, "edge_path_mode")
+ sub = col.column()
+ sub.active = ob.data.use_mirror_x
+ sub.prop(mesh, "use_mirror_topology")
+
+ ts = context.tool_settings
+
+ col.label("Edge Select Mode")
+ col.prop(ts, "edge_path_mode", text="")
+ col.prop(context.tool_settings, "edge_path_live_unwrap")
# ********** default tools for editmode_curve ****************
@@ -328,12 +331,9 @@ class VIEW3D_PT_tools_armatureedit_options(View3DPanel, bpy.types.Panel):
bl_label = "Armature Options"
def draw(self, context):
- layout = self.layout
-
arm = context.active_object.data
- col = layout.column(align=True)
- col.prop(arm, "use_mirror_x")
+ self.layout.prop(arm, "use_mirror_x")
# ********** default tools for editmode_mball ****************
@@ -428,12 +428,9 @@ class VIEW3D_PT_tools_posemode_options(View3DPanel, bpy.types.Panel):
bl_label = "Pose Options"
def draw(self, context):
- layout = self.layout
-
arm = context.active_object.data
- col = layout.column(align=True)
- col.prop(arm, "use_auto_ik")
+ self.layout.prop(arm, "use_auto_ik")
# ********** default tools for paint modes ****************
@@ -452,7 +449,7 @@ class PaintPanel():
return ts.vertex_paint
elif context.weight_paint_object:
return ts.weight_paint
- elif context.texture_paint_object:
+ elif context.image_paint_object:
return ts.image_paint
elif context.particle_edit_object:
return ts.particle_edit
@@ -519,16 +516,16 @@ class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
row.prop(brush, "unprojected_radius", text="Radius", slider=True)
else:
row.prop(brush, "use_locked_size", toggle=True, text="", icon='UNLOCKED')
- row.prop(brush, "size", text="Radius", slider=True)
+ row.prop(brush, "size", slider=True)
row.prop(brush, "use_pressure_size", toggle=True, text="")
- if brush.sculpt_tool not in ('SNAKE_HOOK', 'GRAB', 'ROTATE'):
+ if brush.sculpt_tool not in {'SNAKE_HOOK', 'GRAB', 'ROTATE'}:
col.separator()
row = col.row(align=True)
- if brush.use_space and brush.sculpt_tool not in ('SMOOTH'):
+ if brush.use_space and brush.sculpt_tool not in {'SMOOTH'}:
if brush.use_space_atten:
row.prop(brush, "use_space_atten", toggle=True, text="", icon='LOCKED')
else:
@@ -537,26 +534,26 @@ class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
row.prop(brush, "strength", text="Strength", slider=True)
row.prop(brush, "use_pressure_strength", text="")
- if brush.sculpt_tool not in ('SMOOTH'):
+ if brush.sculpt_tool not in {'SMOOTH'}:
col.separator()
row = col.row(align=True)
row.prop(brush, "auto_smooth_factor", slider=True)
row.prop(brush, "use_inverse_smooth_pressure", toggle=True, text="")
- if brush.sculpt_tool in ('GRAB', 'SNAKE_HOOK'):
+ if brush.sculpt_tool in {'GRAB', 'SNAKE_HOOK'}:
col.separator()
row = col.row(align=True)
row.prop(brush, "normal_weight", slider=True)
- if brush.sculpt_tool in ('CREASE', 'BLOB'):
+ if brush.sculpt_tool in {'CREASE', 'BLOB'}:
col.separator()
row = col.row(align=True)
row.prop(brush, "crease_pinch_factor", slider=True, text="Pinch")
- if brush.sculpt_tool not in ('PINCH', 'INFLATE', 'SMOOTH'):
+ if brush.sculpt_tool not in {'PINCH', 'INFLATE', 'SMOOTH'}:
row = col.row(align=True)
col.separator()
@@ -568,8 +565,8 @@ class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
row.prop(brush, "sculpt_plane", text="")
- #if brush.sculpt_tool in ('CLAY', 'CLAY_TUBES', 'FLATTEN', 'FILL', 'SCRAPE'):
- if brush.sculpt_tool in ('CLAY', 'FLATTEN', 'FILL', 'SCRAPE'):
+ #if brush.sculpt_tool in {'CLAY', 'CLAY_TUBES', 'FLATTEN', 'FILL', 'SCRAPE'}:
+ if brush.sculpt_tool in {'CLAY', 'FLATTEN', 'FILL', 'SCRAPE'}:
row = col.row(align=True)
row.prop(brush, "plane_offset", slider=True)
row.prop(brush, "use_offset_pressure", text="")
@@ -594,7 +591,7 @@ class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
col.separator()
col.row().prop(brush, "direction", expand=True)
- if brush.sculpt_tool in ('DRAW', 'CREASE', 'BLOB', 'INFLATE', 'LAYER', 'CLAY'):
+ if brush.sculpt_tool in {'DRAW', 'CREASE', 'BLOB', 'INFLATE', 'LAYER', 'CLAY'}:
col.separator()
col.prop(brush, "use_accumulate")
@@ -616,13 +613,13 @@ class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
# Texture Paint Mode #
- elif context.texture_paint_object and brush:
+ elif context.image_paint_object and brush:
col = layout.column()
col.template_color_wheel(brush, "color", value_slider=True)
col.prop(brush, "color", text="")
row = col.row(align=True)
- row.prop(brush, "size", text="Radius", slider=True)
+ row.prop(brush, "size", slider=True)
row.prop(brush, "use_pressure_size", toggle=True, text="")
row = col.row(align=True)
@@ -636,7 +633,7 @@ class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
col.prop(brush, "blend", text="Blend")
col = layout.column()
- col.active = (brush.blend not in ('ERASE_ALPHA', 'ADD_ALPHA'))
+ col.active = (brush.blend not in {'ERASE_ALPHA', 'ADD_ALPHA'})
col.prop(brush, "use_alpha")
# Weight Paint Mode #
@@ -647,7 +644,7 @@ class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
col = layout.column()
row = col.row(align=True)
- row.prop(brush, "size", text="Radius", slider=True)
+ row.prop(brush, "size", slider=True)
row.prop(brush, "use_pressure_size", toggle=True, text="")
row = col.row(align=True)
@@ -665,7 +662,7 @@ class VIEW3D_PT_tools_brush(PaintPanel, bpy.types.Panel):
col.prop(brush, "color", text="")
row = col.row(align=True)
- row.prop(brush, "size", text="Radius", slider=True)
+ row.prop(brush, "size", slider=True)
row.prop(brush, "use_pressure_size", toggle=True, text="")
row = col.row(align=True)
@@ -686,7 +683,7 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, bpy.types.Panel):
def poll(cls, context):
settings = cls.paint_settings(context)
return (settings and settings.brush and (context.sculpt_object or
- context.texture_paint_object))
+ context.image_paint_object))
def draw(self, context):
layout = self.layout
@@ -698,6 +695,8 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, bpy.types.Panel):
col = layout.column()
col.template_ID_preview(brush, "texture", new="texture.new", rows=3, cols=8)
+ if brush.use_paint_image:
+ col.prop(brush, "use_fixed_texture")
if context.sculpt_object:
#XXX duplicated from properties_texture.py
@@ -711,32 +710,32 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, bpy.types.Panel):
col.separator()
col = layout.column()
- col.active = tex_slot.map_mode in ('FIXED', )
+ col.active = tex_slot.map_mode in {'FIXED'}
col.label(text="Angle:")
col = layout.column()
- if not brush.use_anchor and brush.sculpt_tool not in ('GRAB', 'SNAKE_HOOK', 'THUMB', 'ROTATE') and tex_slot.map_mode in ('FIXED'):
+ if not brush.use_anchor and brush.sculpt_tool not in {'GRAB', 'SNAKE_HOOK', 'THUMB', 'ROTATE'} and tex_slot.map_mode in {'FIXED'}:
col.prop(brush, "texture_angle_source_random", text="")
else:
col.prop(brush, "texture_angle_source_no_random", text="")
#row = col.row(align=True)
#row.label(text="Angle:")
- #row.active = tex_slot.map_mode in ('FIXED', 'TILED')
+ #row.active = tex_slot.map_mode in {'FIXED', 'TILED'}
#row = col.row(align=True)
#col = row.column()
- #col.active = tex_slot.map_mode in ('FIXED')
+ #col.active = tex_slot.map_mode in {'FIXED'}
#col.prop(brush, "use_rake", toggle=True, icon='PARTICLEMODE', text="")
col = layout.column()
col.prop(tex_slot, "angle", text="")
- col.active = tex_slot.map_mode in ('FIXED', 'TILED')
+ col.active = tex_slot.map_mode in {'FIXED', 'TILED'}
#col = layout.column()
#col.prop(brush, "use_random_rotation")
- #col.active = (not brush.use_rake) and (not brush.use_anchor) and brush.sculpt_tool not in ('GRAB', 'SNAKE_HOOK', 'THUMB', 'ROTATE') and tex_slot.map_mode in ('FIXED')
+ #col.active = (not brush.use_rake) and (not brush.use_anchor) and (brush.sculpt_tool not in {'GRAB', 'SNAKE_HOOK', 'THUMB', 'ROTATE'}) and tex_slot.map_mode in {'FIXED'}
split = layout.split()
@@ -756,7 +755,7 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, bpy.types.Panel):
row = col.row(align=True)
row.label(text="Overlay:")
- row.active = tex_slot.map_mode in ('FIXED', 'TILED')
+ row.active = tex_slot.map_mode in {'FIXED', 'TILED'}
row = col.row(align=True)
@@ -767,11 +766,11 @@ class VIEW3D_PT_tools_brush_texture(PaintPanel, bpy.types.Panel):
else:
col.prop(brush, "use_texture_overlay", toggle=True, text="", icon='MUTE_IPO_ON')
- col.active = tex_slot.map_mode in ('FIXED', 'TILED')
+ col.active = tex_slot.map_mode in {'FIXED', 'TILED'}
col = row.column()
col.prop(brush, "texture_overlay_alpha", text="Alpha")
- col.active = tex_slot.map_mode in ('FIXED', 'TILED') and brush.use_texture_overlay
+ col.active = tex_slot.map_mode in {'FIXED', 'TILED'} and brush.use_texture_overlay
class VIEW3D_PT_tools_brush_tool(PaintPanel, bpy.types.Panel):
@@ -782,7 +781,7 @@ class VIEW3D_PT_tools_brush_tool(PaintPanel, bpy.types.Panel):
def poll(cls, context):
settings = cls.paint_settings(context)
return (settings and settings.brush and
- (context.sculpt_object or context.texture_paint_object or
+ (context.sculpt_object or context.image_paint_object or
context.vertex_paint_object or context.weight_paint_object))
def draw(self, context):
@@ -790,25 +789,22 @@ class VIEW3D_PT_tools_brush_tool(PaintPanel, bpy.types.Panel):
settings = __class__.paint_settings(context)
brush = settings.brush
- ## Unused
- # texture_paint = context.texture_paint_object
- # sculpt = context.sculpt_object
col = layout.column(align=True)
if context.sculpt_object:
col.prop(brush, "sculpt_tool", expand=False, text="")
col.operator("brush.reset")
- elif context.texture_paint_object:
- col.prop(brush, "imagepaint_tool", expand=False, text="")
+ elif context.image_paint_object:
+ col.prop(brush, "image_tool", expand=False, text="")
elif context.vertex_paint_object or context.weight_paint_object:
- col.prop(brush, "vertexpaint_tool", expand=False, text="")
+ col.prop(brush, "vertex_tool", expand=False, text="")
row = layout.row(align=True)
row.prop(brush, "use_paint_sculpt", text="", icon='SCULPTMODE_HLT')
row.prop(brush, "use_paint_vertex", text="", icon='VPAINT_HLT')
row.prop(brush, "use_paint_weight", text="", icon='WPAINT_HLT')
- row.prop(brush, "use_paint_texture", text="", icon='TPAINT_HLT')
+ row.prop(brush, "use_paint_image", text="", icon='TPAINT_HLT')
class VIEW3D_PT_tools_brush_stroke(PaintPanel, bpy.types.Panel):
@@ -821,14 +817,14 @@ class VIEW3D_PT_tools_brush_stroke(PaintPanel, bpy.types.Panel):
return (settings and settings.brush and (context.sculpt_object or
context.vertex_paint_object or
context.weight_paint_object or
- context.texture_paint_object))
+ context.image_paint_object))
def draw(self, context):
layout = self.layout
settings = __class__.paint_settings(context)
brush = settings.brush
- texture_paint = context.texture_paint_object
+ image_paint = context.image_paint_object
col = layout.column()
@@ -852,7 +848,7 @@ class VIEW3D_PT_tools_brush_stroke(PaintPanel, bpy.types.Panel):
row.active = brush.use_space
row.prop(brush, "spacing", text="Spacing")
- if brush.sculpt_tool not in ('GRAB', 'THUMB', 'SNAKE_HOOK', 'ROTATE') and (not brush.use_anchor) and (not brush.use_restore_mesh):
+ if (brush.sculpt_tool not in {'GRAB', 'THUMB', 'SNAKE_HOOK', 'ROTATE'}) and (not brush.use_anchor) and (not brush.use_restore_mesh):
col = layout.column()
col.separator()
@@ -879,7 +875,7 @@ class VIEW3D_PT_tools_brush_stroke(PaintPanel, bpy.types.Panel):
col.separator()
- if not texture_paint:
+ if not image_paint:
row = col.row()
row.prop(brush, "use_smooth_stroke")
@@ -891,7 +887,7 @@ class VIEW3D_PT_tools_brush_stroke(PaintPanel, bpy.types.Panel):
col.separator()
col = layout.column()
- col.active = (not brush.use_anchor) and (brush.sculpt_tool not in ('GRAB', 'THUMB', 'ROTATE', 'SNAKE_HOOK'))
+ col.active = (not brush.use_anchor) and (brush.sculpt_tool not in {'GRAB', 'THUMB', 'ROTATE', 'SNAKE_HOOK'})
row = col.row()
row.prop(brush, "use_space")
@@ -905,7 +901,7 @@ class VIEW3D_PT_tools_brush_stroke(PaintPanel, bpy.types.Panel):
#col.separator()
- #if texture_paint:
+ #if image_paint:
# row.prop(brush, "use_pressure_spacing", toggle=True, text="")
@@ -981,7 +977,6 @@ class VIEW3D_PT_sculpt_symmetry(PaintPanel, bpy.types.Panel):
return (context.sculpt_object and context.tool_settings.sculpt)
def draw(self, context):
-
layout = self.layout
sculpt = context.tool_settings.sculpt
@@ -990,21 +985,16 @@ class VIEW3D_PT_sculpt_symmetry(PaintPanel, bpy.types.Panel):
split = layout.split()
col = split.column()
-
col.label(text="Mirror:")
col.prop(sculpt, "use_symmetry_x", text="X")
col.prop(sculpt, "use_symmetry_y", text="Y")
col.prop(sculpt, "use_symmetry_z", text="Z")
- col = split.column()
-
- col.prop(sculpt, "radial_symmetry", text="Radial")
-
- col = layout.column()
+ split.prop(sculpt, "radial_symmetry", text="Radial")
- col.separator()
+ layout.separator()
- col.prop(sculpt, "use_symmetry_feather", text="Feather")
+ layout.prop(sculpt, "use_symmetry_feather", text="Feather")
class VIEW3D_PT_tools_brush_appearance(PaintPanel, bpy.types.Panel):
@@ -1013,7 +1003,7 @@ class VIEW3D_PT_tools_brush_appearance(PaintPanel, bpy.types.Panel):
@classmethod
def poll(cls, context):
- return (context.sculpt_object and context.tool_settings.sculpt) or (context.vertex_paint_object and context.tool_settings.vertex_paint) or (context.weight_paint_object and context.tool_settings.weight_paint) or (context.texture_paint_object and context.tool_settings.image_paint)
+ return (context.sculpt_object and context.tool_settings.sculpt) or (context.vertex_paint_object and context.tool_settings.vertex_paint) or (context.weight_paint_object and context.tool_settings.weight_paint) or (context.image_paint_object and context.tool_settings.image_paint)
def draw(self, context):
layout = self.layout
@@ -1024,8 +1014,8 @@ class VIEW3D_PT_tools_brush_appearance(PaintPanel, bpy.types.Panel):
col = layout.column()
if context.sculpt_object and context.tool_settings.sculpt:
- #if brush.sculpt_tool in ('DRAW', 'INFLATE', 'CLAY', 'PINCH', 'CREASE', 'BLOB', 'FLATTEN', 'FILL', 'SCRAPE', 'CLAY_TUBES'):
- if brush.sculpt_tool in ('DRAW', 'INFLATE', 'CLAY', 'PINCH', 'CREASE', 'BLOB', 'FLATTEN', 'FILL', 'SCRAPE'):
+ #if brush.sculpt_tool in {'DRAW', 'INFLATE', 'CLAY', 'PINCH', 'CREASE', 'BLOB', 'FLATTEN', 'FILL', 'SCRAPE', 'CLAY_TUBES'}:
+ if brush.sculpt_tool in {'DRAW', 'INFLATE', 'CLAY', 'PINCH', 'CREASE', 'BLOB', 'FLATTEN', 'FILL', 'SCRAPE'}:
col.prop(brush, "cursor_color_add", text="Add Color")
col.prop(brush, "cursor_color_subtract", text="Subtract Color")
else:
@@ -1130,13 +1120,13 @@ class VIEW3D_PT_tools_vertexpaint(View3DPanel, bpy.types.Panel):
class VIEW3D_PT_tools_projectpaint(View3DPanel, bpy.types.Panel):
- bl_context = "texturepaint"
+ bl_context = "imagepaint"
bl_label = "Project Paint"
@classmethod
def poll(cls, context):
brush = context.tool_settings.image_paint.brush
- return (brush and brush.imagepaint_tool != 'SOFTEN')
+ return (brush and brush.image_tool != 'SOFTEN')
def draw_header(self, context):
ipaint = context.tool_settings.image_paint
@@ -1146,6 +1136,8 @@ class VIEW3D_PT_tools_projectpaint(View3DPanel, bpy.types.Panel):
def draw(self, context):
layout = self.layout
+ ob = context.active_object
+ mesh = ob.data
ipaint = context.tool_settings.image_paint
settings = context.tool_settings.image_paint
use_projection = ipaint.use_projection
@@ -1173,16 +1165,16 @@ class VIEW3D_PT_tools_projectpaint(View3DPanel, bpy.types.Panel):
row2 = row.row(align=False)
row2.active = (use_projection and ipaint.use_stencil_layer)
- row2.menu("VIEW3D_MT_tools_projectpaint_stencil", text=context.active_object.data.uv_texture_stencil.name)
+ row2.menu("VIEW3D_MT_tools_projectpaint_stencil", text=mesh.uv_texture_stencil.name)
row2.prop(ipaint, "invert_stencil", text="", icon='IMAGE_ALPHA')
col = layout.column()
sub = col.column()
row = sub.row()
- row.active = (settings.brush.imagepaint_tool == 'CLONE')
+ row.active = (settings.brush.image_tool == 'CLONE')
row.prop(ipaint, "use_clone_layer", text="Layer")
- row.menu("VIEW3D_MT_tools_projectpaint_clone", text=context.active_object.data.uv_texture_clone.name)
+ row.menu("VIEW3D_MT_tools_projectpaint_clone", text=mesh.uv_texture_clone.name)
sub = col.column()
sub.prop(ipaint, "seam_bleed")
@@ -1206,14 +1198,14 @@ class VIEW3D_PT_imagepaint_options(PaintPanel):
@classmethod
def poll(cls, context):
- return (context.texture_paint_object and context.tool_settings.image_paint)
+ return (context.image_paint_object and context.tool_settings.image_paint)
def draw(self, context):
layout = self.layout
- col = layout.column()
-
tool_settings = context.tool_settings
+
+ col = layout.column()
col.label(text="Unified Settings:")
col.prop(tool_settings, "sculpt_paint_use_unified_size", text="Size")
col.prop(tool_settings, "sculpt_paint_use_unified_strength", text="Strength")
@@ -1306,13 +1298,5 @@ class VIEW3D_PT_tools_particlemode(View3DPanel, bpy.types.Panel):
sub.active = pe.use_fade_time
sub.prop(pe, "fade_frames", slider=True)
-
-def register():
+if __name__ == "__main__": # only for live edit.
bpy.utils.register_module(__name__)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
-
-if __name__ == "__main__":
- register()
diff --git a/release/scripts/keyingsets/keyingsets_builtins.py b/release/scripts/startup/keyingsets_builtins.py
index cff4aecac54..0775d38c437 100644
--- a/release/scripts/keyingsets/keyingsets_builtins.py
+++ b/release/scripts/startup/keyingsets_builtins.py
@@ -23,10 +23,15 @@ Built-In Keying Sets
None of these Keying Sets should be removed, as these
are needed by various parts of Blender in order for them
to work correctly.
+
+Beware also about changing the order that these are defined
+here, since this can result in old files referring to the
+wrong Keying Set as the active one, potentially resulting
+in lost (i.e. unkeyed) animation.
"""
import bpy
-from keyingsets_utils import *
+import keyingsets_utils
###############################
# Built-In KeyingSets
@@ -37,13 +42,13 @@ class BUILTIN_KSI_Location(bpy.types.KeyingSetInfo):
bl_label = "Location"
# poll - use predefined callback for selected bones/objects
- poll = RKS_POLL_selected_items
+ poll = keyingsets_utils.RKS_POLL_selected_items
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator - use callback for location
- generate = RKS_GEN_location
+ generate = keyingsets_utils.RKS_GEN_location
# Rotation
@@ -51,13 +56,13 @@ class BUILTIN_KSI_Rotation(bpy.types.KeyingSetInfo):
bl_label = "Rotation"
# poll - use predefined callback for selected bones/objects
- poll = RKS_POLL_selected_items
+ poll = keyingsets_utils.RKS_POLL_selected_items
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator - use callback for location
- generate = RKS_GEN_rotation
+ generate = keyingsets_utils.RKS_GEN_rotation
# Scale
@@ -65,13 +70,13 @@ class BUILTIN_KSI_Scaling(bpy.types.KeyingSetInfo):
bl_label = "Scaling"
# poll - use predefined callback for selected bones/objects
- poll = RKS_POLL_selected_items
+ poll = keyingsets_utils.RKS_POLL_selected_items
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator - use callback for location
- generate = RKS_GEN_scaling
+ generate = keyingsets_utils.RKS_GEN_scaling
# ------------
@@ -81,17 +86,17 @@ class BUILTIN_KSI_LocRot(bpy.types.KeyingSetInfo):
bl_label = "LocRot"
# poll - use predefined callback for selected bones/objects
- poll = RKS_POLL_selected_items
+ poll = keyingsets_utils.RKS_POLL_selected_items
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator
def generate(self, context, ks, data):
# location
- RKS_GEN_location(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_location(self, context, ks, data)
# rotation
- RKS_GEN_rotation(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_rotation(self, context, ks, data)
# LocScale
@@ -99,17 +104,17 @@ class BUILTIN_KSI_LocScale(bpy.types.KeyingSetInfo):
bl_label = "LocScale"
# poll - use predefined callback for selected bones/objects
- poll = RKS_POLL_selected_items
+ poll = keyingsets_utils.RKS_POLL_selected_items
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator
def generate(self, context, ks, data):
# location
- RKS_GEN_location(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_location(self, context, ks, data)
# scale
- RKS_GEN_scaling(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_scaling(self, context, ks, data)
# LocRotScale
@@ -117,19 +122,19 @@ class BUILTIN_KSI_LocRotScale(bpy.types.KeyingSetInfo):
bl_label = "LocRotScale"
# poll - use predefined callback for selected bones/objects
- poll = RKS_POLL_selected_items
+ poll = keyingsets_utils.RKS_POLL_selected_items
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator
def generate(self, context, ks, data):
# location
- RKS_GEN_location(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_location(self, context, ks, data)
# rotation
- RKS_GEN_rotation(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_rotation(self, context, ks, data)
# scale
- RKS_GEN_scaling(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_scaling(self, context, ks, data)
# RotScale
@@ -137,17 +142,17 @@ class BUILTIN_KSI_RotScale(bpy.types.KeyingSetInfo):
bl_label = "RotScale"
# poll - use predefined callback for selected bones/objects
- poll = RKS_POLL_selected_items
+ poll = keyingsets_utils.RKS_POLL_selected_items
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator
def generate(self, context, ks, data):
# rotation
- RKS_GEN_rotation(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_rotation(self, context, ks, data)
# scaling
- RKS_GEN_scaling(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_scaling(self, context, ks, data)
# ------------
@@ -159,13 +164,13 @@ class BUILTIN_KSI_VisualLoc(bpy.types.KeyingSetInfo):
bl_options = {'INSERTKEY_VISUAL'}
# poll - use predefined callback for selected bones/objects
- poll = RKS_POLL_selected_items
+ poll = keyingsets_utils.RKS_POLL_selected_items
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator - use callback for location
- generate = RKS_GEN_location
+ generate = keyingsets_utils.RKS_GEN_location
# Rotation
@@ -175,13 +180,13 @@ class BUILTIN_KSI_VisualRot(bpy.types.KeyingSetInfo):
bl_options = {'INSERTKEY_VISUAL'}
# poll - use predefined callback for selected bones/objects
- poll = RKS_POLL_selected_items
+ poll = keyingsets_utils.RKS_POLL_selected_items
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator - use callback for rotation
- generate = RKS_GEN_rotation
+ generate = keyingsets_utils.RKS_GEN_rotation
# VisualLocRot
@@ -191,17 +196,17 @@ class BUILTIN_KSI_VisualLocRot(bpy.types.KeyingSetInfo):
bl_options = {'INSERTKEY_VISUAL'}
# poll - use predefined callback for selected bones/objects
- poll = RKS_POLL_selected_items
+ poll = keyingsets_utils.RKS_POLL_selected_items
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator
def generate(self, context, ks, data):
# location
- RKS_GEN_location(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_location(self, context, ks, data)
# rotation
- RKS_GEN_rotation(self, context, ks, data)
+ keyingsets_utils.RKS_GEN_rotation(self, context, ks, data)
# ------------
@@ -213,13 +218,13 @@ class BUILTIN_KSI_Available(bpy.types.KeyingSetInfo):
# poll - use predefined callback for selected objects
# TODO: this should really check whether the selected object (or datablock)
# has any animation data defined yet
- poll = RKS_POLL_selected_objects
+ poll = keyingsets_utils.RKS_POLL_selected_objects
# iterator - use callback for selected bones/objects
- iterator = RKS_ITER_selected_item
+ iterator = keyingsets_utils.RKS_ITER_selected_item
# generator - use callback for doing this
- generate = RKS_GEN_available
+ generate = keyingsets_utils.RKS_GEN_available
###############################
@@ -278,7 +283,7 @@ class BUILTIN_KSI_WholeCharacter(bpy.types.KeyingSetInfo):
path = id_path + prop
else:
# standard transforms/properties
- path = path_add_property(id_path, prop)
+ path = keyingsets_utils.path_add_property(id_path, prop)
# add Keying Set entry for this...
if use_groups:
@@ -352,6 +357,93 @@ class BUILTIN_KSI_WholeCharacter(bpy.types.KeyingSetInfo):
# for now, just add all of 'em
ksi.addProp(ks, bone, '["%s"]' % (prop))
+###############################
+
+
+# Delta Location
+class BUILTIN_KSI_DeltaLocation(bpy.types.KeyingSetInfo):
+ bl_label = "Delta Location"
+
+ # poll - selected objects only (and only if active object in object mode)
+ poll = keyingsets_utils.RKS_POLL_selected_objects
+
+ # iterator - selected objects only
+ iterator = keyingsets_utils.RKS_ITER_selected_objects
+
+ # generator - delta location channels only
+ def generate(ksi, context, ks, data):
+ # get id-block and path info
+ id_block, base_path, grouping = keyingsets_utils.get_transform_generators_base_info(data)
+
+ # add the property name to the base path
+ path = keyingsets_utils.path_add_property(base_path, "delta_location")
+
+ # add Keying Set entry for this...
+ if grouping:
+ ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
+ else:
+ ks.paths.add(id_block, path)
+
+
+# Delta Rotation
+class BUILTIN_KSI_DeltaRotation(bpy.types.KeyingSetInfo):
+ bl_label = "Delta Rotation"
+
+ # poll - selected objects only (and only if active object in object mode)
+ poll = keyingsets_utils.RKS_POLL_selected_objects
+
+ # iterator - selected objects only
+ iterator = keyingsets_utils.RKS_ITER_selected_objects
+
+ # generator - delta location channels only
+ def generate(ksi, context, ks, data):
+ # get id-block and path info
+ id_block, base_path, grouping = keyingsets_utils.get_transform_generators_base_info(data)
+
+ # add the property name to the base path
+ # rotation mode affects the property used
+ if data.rotation_mode == 'QUATERNION':
+ path = path_add_property(base_path, "delta_rotation_quaternion")
+ elif data.rotation_mode == 'AXIS_ANGLE':
+ # XXX: for now, this is not available yet
+ #path = path_add_property(base_path, "delta_rotation_axis_angle")
+ return
+ else:
+ path = keyingsets_utils.path_add_property(base_path, "delta_rotation_euler")
+
+ # add Keying Set entry for this...
+ if grouping:
+ ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
+ else:
+ ks.paths.add(id_block, path)
+
+
+# Delta Scale
+class BUILTIN_KSI_DeltaScale(bpy.types.KeyingSetInfo):
+ bl_label = "Delta Scale"
+
+ # poll - selected objects only (and only if active object in object mode)
+ poll = keyingsets_utils.RKS_POLL_selected_objects
+
+ # iterator - selected objects only
+ iterator = keyingsets_utils.RKS_ITER_selected_objects
+
+ # generator - delta location channels only
+ def generate(ksi, context, ks, data):
+ # get id-block and path info
+ id_block, base_path, grouping = keyingsets_utils.get_transform_generators_base_info(data)
+
+ # add the property name to the base path
+ path = keyingsets_utils.path_add_property(base_path, "delta_scale")
+
+ # add Keying Set entry for this...
+ if grouping:
+ ks.paths.add(id_block, path, group_method='NAMED', group_name=grouping)
+ else:
+ ks.paths.add(id_block, path)
+
+###############################
+
def register():
bpy.utils.register_module(__name__)
@@ -363,5 +455,3 @@ def unregister():
if __name__ == "__main__":
register()
-
-###############################
diff --git a/release/scripts/templates/addon_add_object.py b/release/scripts/templates/addon_add_object.py
index f4f1185e282..67e033271f4 100644
--- a/release/scripts/templates/addon_add_object.py
+++ b/release/scripts/templates/addon_add_object.py
@@ -31,8 +31,10 @@ def add_object(self, context):
edges = []
faces = [[0, 1, 2, 3]]
- mesh_data = bpy.data.meshes.new(name='New Object Mesh')
- mesh_data.from_pydata(verts, edges, faces)
+ mesh = bpy.data.meshes.new(name='New Object Mesh')
+ mesh.from_pydata(verts, edges, faces)
+ # useful for development when the mesh may be invalid.
+ # mesh.validate(verbose=True)
add_object_data(context, mesh_data, operator=self)
@@ -55,7 +57,7 @@ class OBJECT_OT_add_object(bpy.types.Operator, AddObjectHelper):
return {'FINISHED'}
-#### REGISTER ####
+# Registration
def add_object_button(self, context):
self.layout.operator(
diff --git a/release/scripts/templates/background_job.py b/release/scripts/templates/background_job.py
index 0337f8f4922..11b51e5a9b5 100644
--- a/release/scripts/templates/background_job.py
+++ b/release/scripts/templates/background_job.py
@@ -1,12 +1,18 @@
-# This script is an example of how you can run blender from the command line (in background mode with no interface)
-# to automate tasks, in this example it creates a text object, camera and light, then renders and/or saves it.
-# This example also shows how you can parse command line options to python scripts.
+# This script is an example of how you can run blender from the command line
+# (in background mode with no interface) to automate tasks, in this example it
+# creates a text object, camera and light, then renders and/or saves it.
+# This example also shows how you can parse command line options to scripts.
#
# Example usage for this test.
-# blender --background --factory-startup --python $HOME/background_job.py -- --text="Hello World" --render="/tmp/hello" --save="/tmp/hello.blend"
+# blender --background --factory-startup --python $HOME/background_job.py -- \
+# --text="Hello World" \
+# --render="/tmp/hello" \
+# --save="/tmp/hello.blend"
#
# Notice:
-# '--factory-startup' is used to avoid the user default settings from interfearing with automated scene generation.
+# '--factory-startup' is used to avoid the user default settings from
+# interfearing with automated scene generation.
+#
# '--' causes blender to ignore all following arguments so python can use them.
#
# See blender --help for details.
@@ -14,7 +20,7 @@
import bpy
-def example_function(body_text, save_path, render_path):
+def example_function(text, save_path, render_path):
scene = bpy.context.scene
@@ -27,15 +33,15 @@ def example_function(body_text, save_path, render_path):
# Text Object
txt_ob = bpy.data.objects.new(name="MyText", object_data=txt_data)
- scene.objects.link(txt_ob) # add the data to the scene as an object
- txt_data.body = body_text # set the body text to the command line arg given
- txt_data.align = 'CENTER' # center text
+ scene.objects.link(txt_ob) # add the data to the scene as an object
+ txt_data.body = text # the body text to the command line arg given
+ txt_data.align = 'CENTER' # center text
# Camera
- cam_data = bpy.data.cameras.new("MyCam") # create new camera data
+ cam_data = bpy.data.cameras.new("MyCam")
cam_ob = bpy.data.objects.new(name="MyCam", object_data=cam_data)
- scene.objects.link(cam_ob) # add the camera data to the scene (creating a new object)
- scene.camera = cam_ob # set the active camera
+ scene.objects.link(cam_ob) # instance the camera object in the scene
+ scene.camera = cam_ob # set the active camera
cam_ob.location = 0.0, 0.0, 10.0
# Lamp
@@ -65,14 +71,12 @@ def example_function(body_text, save_path, render_path):
bpy.ops.render.render(write_still=True)
-import sys # to get command line args
-import optparse # to parse options for us and print a nice help message
-
-
def main():
+ import sys # to get command line args
+ import argparse # to parse options for us and print a nice help message
- # get the args passed to blender after "--", all of which are ignored by blender specifically
- # so python may receive its own arguments
+ # get the args passed to blender after "--", all of which are ignored by
+ # blender so scripts may receive their own arguments
argv = sys.argv
if "--" not in argv:
@@ -81,31 +85,35 @@ def main():
argv = argv[argv.index("--") + 1:] # get all args after "--"
# When --help or no args are given, print this help
- usage_text = "Run blender in background mode with this script:"
- usage_text += " blender --background --python " + __file__ + " -- [options]"
+ usage_text = \
+ "Run blender in background mode with this script:"
+ " blender --background --python " + __file__ + " -- [options]"
- parser = optparse.OptionParser(usage=usage_text)
+ parser = argparse.ArgumentParser(description=usage_text)
- # Example background utility, add some text and renders or saves it (with options)
+ # Example utility, add some text and renders or saves it (with options)
# Possible types are: string, int, long, choice, float and complex.
- parser.add_option("-t", "--text", dest="body_text", help="This text will be used to render an image", type="string")
+ parser.add_argument("-t", "--text", dest="text", type=str, required=True,
+ help="This text will be used to render an image")
- parser.add_option("-s", "--save", dest="save_path", help="Save the generated file to the specified path", metavar='FILE')
- parser.add_option("-r", "--render", dest="render_path", help="Render an image to the specified path", metavar='FILE')
+ parser.add_argument("-s", "--save", dest="save_path", metavar='FILE',
+ help="Save the generated file to the specified path")
+ parser.add_argument("-r", "--render", dest="render_path", metavar='FILE',
+ help="Render an image to the specified path")
- options, args = parser.parse_args(argv) # In this example we wont use the args
+ args = parser.parse_args(argv) # In this example we wont use the args
if not argv:
parser.print_help()
return
- if not options.body_text:
+ if not args.text:
print("Error: --text=\"some string\" argument not given, aborting.")
parser.print_help()
return
# Run the example function
- example_function(options.body_text, options.save_path, options.render_path)
+ example_function(args.text, args.save_path, args.render_path)
print("batch job finished, exiting")
diff --git a/release/scripts/templates/builtin_keyingset.py b/release/scripts/templates/builtin_keyingset.py
index 0b808e9cd26..19f92dc75e7 100644
--- a/release/scripts/templates/builtin_keyingset.py
+++ b/release/scripts/templates/builtin_keyingset.py
@@ -1,5 +1,4 @@
import bpy
-from keyingsets_utils import *
class BUILTIN_KSI_hello(bpy.types.KeyingSetInfo):
@@ -7,7 +6,7 @@ class BUILTIN_KSI_hello(bpy.types.KeyingSetInfo):
# poll - test for whether Keying Set can be used at all
def poll(ksi, context):
- return (context.active_object) or (context.selected_objects)
+ return context.active_object or context.selected_objects
# iterator - go over all relevant data, calling generate()
def iterator(ksi, context, ks):
diff --git a/release/scripts/templates/operator_export.py b/release/scripts/templates/operator_export.py
index 5390d32aeff..af359517e40 100644
--- a/release/scripts/templates/operator_export.py
+++ b/release/scripts/templates/operator_export.py
@@ -13,8 +13,7 @@ def write_some_data(context, filepath, use_some_setting):
# ExportHelper is a helper class, defines filename and
# invoke() function which calls the file selector.
from io_utils import ExportHelper
-
-from bpy.props import *
+from bpy.props import StringProperty, BoolProperty, EnumProperty
class ExportSomeData(bpy.types.Operator, ExportHelper):
@@ -31,7 +30,9 @@ class ExportSomeData(bpy.types.Operator, ExportHelper):
# to the class instance from the operator settings before calling.
use_setting = BoolProperty(name="Example Boolean", description="Example Tooltip", default=True)
- type = bpy.props.EnumProperty(items=(('OPT_A', "First Option", "Description one"), ('OPT_B', "Second Option", "Description two.")),
+ type = EnumProperty(items=(('OPT_A', "First Option", "Description one"),
+ ('OPT_B', "Second Option", "Description two."),
+ ),
name="Example Enum",
description="Choose between two items",
default='OPT_A')
diff --git a/release/scripts/templates/operator_mesh_add.py b/release/scripts/templates/operator_mesh_add.py
index 77d172b3068..65b08eebb4e 100644
--- a/release/scripts/templates/operator_mesh_add.py
+++ b/release/scripts/templates/operator_mesh_add.py
@@ -34,7 +34,7 @@ def add_box(width, height, depth):
return vertices, faces
-from bpy.props import *
+from bpy.props import FloatProperty, BoolProperty, FloatVectorProperty
class AddBox(bpy.types.Operator):
diff --git a/release/scripts/templates/operator_modal.py b/release/scripts/templates/operator_modal.py
index 6eb3843d6a6..78dbd4c6b43 100644
--- a/release/scripts/templates/operator_modal.py
+++ b/release/scripts/templates/operator_modal.py
@@ -1,5 +1,5 @@
import bpy
-from bpy.props import *
+from bpy.props import IntProperty, FloatProperty
class ModalOperator(bpy.types.Operator):
diff --git a/release/scripts/templates/operator_modal_timer.py b/release/scripts/templates/operator_modal_timer.py
new file mode 100644
index 00000000000..d2267191cf5
--- /dev/null
+++ b/release/scripts/templates/operator_modal_timer.py
@@ -0,0 +1,45 @@
+import bpy
+
+
+class ModalTimerOperator(bpy.types.Operator):
+ '''Operator which runs its self from a timer.'''
+ bl_idname = "wm.modal_timer_operator"
+ bl_label = "Modal Timer Operator"
+
+ _timer = None
+
+ def modal(self, context, event):
+ if event.type == 'ESC':
+ return self.cancel()
+
+ if event.type == 'TIMER':
+ # change theme color, silly!
+ color = context.user_preferences.themes[0].view_3d.back
+ color.s = 1.0
+ color.h += 0.01
+
+ return {'PASS_THROUGH'}
+
+ def execute(self, context):
+ context.window_manager.modal_handler_add(self)
+ self._timer = context.window_manager.event_timer_add(0.1, context.window)
+ return {'RUNNING_MODAL'}
+
+ def cancel(self, context):
+ context.window_manager.event_timer_remove(self._timer)
+ return {'CANCELLED'}
+
+
+def register():
+ bpy.utils.register_class(ModalTimerOperator)
+
+
+def unregister():
+ bpy.utils.unregister_class(ModalTimerOperator)
+
+
+if __name__ == "__main__":
+ register()
+
+ # test call
+ bpy.ops.wm.modal_timer_operator()
diff --git a/release/text/readme.html b/release/text/readme.html
index af6f2092f0f..1014d8ef80a 100644
--- a/release/text/readme.html
+++ b/release/text/readme.html
@@ -12,28 +12,27 @@
</style>
</head>
<body>
-<p class="title"><b>Blender 2.56 Beta</b></p>
+<p class="title"><b>Blender 2.57</b></p>
<p><br></p>
<p class="header"><b>About</b></p>
<p class="body">Welcome to Blender, the free, open source 3D application for modeling, animation, rendering, compositing, video editing and game creation. Blender is available for Linux, Mac OS X, Windows, Solaris and FreeBSD and has a large world-wide community.</p>
<p class="body">Blender can be used freely for any purpose, including commercial use and distribution. It's free and open-source software, released under the GNU GPL licence. The entire source code is available on our website.</p>
<p class="body">For more information, visit <a href="http://www.blender.org">blender.org</a>.</p>
<p><br></p>
-<p class="header"><b>2.56 Beta</b></p>
-<p class="body">The Blender Foundation and online developer community is proud to present Blender 2.56 Beta. This release is the fourth official beta release of the Blender 2.5 series, and represents the culmination of many years of redesign and development work. <a href="http://www.blender.org/development/release-logs/blender-256-beta/">More information about this release</a>.</p>
+<p class="header"><b>2.57</b></p>
+<p class="body">The Blender Foundation and online developer community is proud to present Blender 2.57. This release is the first official stable release of the Blender 2.5 series, and represents the culmination of many years of redesign and development work. <a href="http://www.blender.org/development/release-logs/blender-256-beta/">More information about this release</a>.</p>
<p class="body">What to Expect:</p>
<p class="body"> • Big improvements - This is our most exciting version to date, already a significant improvement in many ways over 2.49</p>
<p class="body"> • Missing/Incomplete Features - Although most of it is there, not all functionality from pre-2.5 versions has been restored yet. Some functionality may be re-implemented a different way.</p>
-<p class="body"> • Bugs - We've fixed a lot lately, but there are still quite a few bugs. This is beta software, we're still working on it!</p>
<p class="body"> • Changes - If you're used to the old Blenders, Blender 2.5 may seem quite different at first, but it won't be long before it grows on you even more than before.</p>
<p><br></p>
<p class="header"><b>Bugs</b></p>
-<p class="body">Blender 2.56 Beta is unfinished software. If you encounter a bug, please help us by posting it in the bug tracker or using Help → Report a Bug from inside Blender 2.56. If it wasn’t reported yet, please log in (or register) and fill in detailed information about the error. Please post detailed instructions on how to reproduce it or post a .blend file showcasing the bug.</p>
+<p class="body">Although Blender 2.57 is considered a stable release, you may encounter a bug. If you do, please help us by posting it in the bug tracker or using Help → Report a Bug from inside Blender 2.57. If it wasn’t reported yet, please log in (or register) and fill in detailed information about the error. Please post detailed instructions on how to reproduce it or post a .blend file showcasing the bug.</p>
<p><br></p>
<p class="header"><b>Package Contents</b></p>
<p class="body">The downloaded Blender package includes:</p>
<p class="body"> • The Blender application for the chosen operating system.</p>
-<p class="body"> • Scripts for importing and exporters to other 3d formats.</p>
+<p class="body"> • Scripts for importing and exporting to other 3d formats.</p>
<p class="body"> • Readme and copyright files.</p>
<p><br></p>
<p class="header"><b>Installation</b></p>
@@ -52,7 +51,7 @@
<p class="header"><b>Links</b></p>
<p class="body">Users:</p>
<p class="body"> General information <a href="http://www.blender.org">www.blender.org</a> <br>
- Full release log <a href="http://www.blender.org/development/release-logs/blender-254-beta/">www.blender.org/development/release-logs/blender-256-beta/</a><br>
+ Full release log <a href="http://www.blender.org/development/release-logs/blender-257/">www.blender.org/development/release-logs/blender-257/</a><br>
Tutorials <a href="http://www.blender.org/education-help/">www.blender.org/education-help/</a> <br>
Manual <a href="http://wiki.blender.org/index.php/Doc:Manual">wiki.blender.org/index.php/Doc:Manual</a><br>
User Forum <a href="http://www.blenderartists.org">www.blenderartists.org</a><br>
diff --git a/release/windows/installer/00.sconsblender.nsi b/release/windows/installer/00.sconsblender.nsi
index e5ebf8b2f64..2a37f7f6ba6 100644
--- a/release/windows/installer/00.sconsblender.nsi
+++ b/release/windows/installer/00.sconsblender.nsi
@@ -3,8 +3,12 @@
;
; Blender Self-Installer for Windows (NSIS - http://nsis.sourceforge.net)
;
-; Requires the MoreInfo plugin - http://nsis.sourceforge.net/MoreInfo_plug-in
-;
+
+SetCompressor /SOLID lzma
+
+Name "Blender [VERSION]"
+
+RequestExecutionLevel admin
!include "MUI.nsh"
!include "WinVer.nsh"
@@ -13,12 +17,6 @@
!include "nsDialogs.nsh"
!include "x64.nsh"
-RequestExecutionLevel user
-
-SetCompressor /SOLID lzma
-
-Name "Blender [VERSION]"
-
!define MUI_ABORTWARNING
!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Blender. It is recommended that you close all other applications before starting Setup."
@@ -60,21 +58,17 @@ UninstallIcon "[RELDIR]\00.installer.ico"
;Language Strings
;Description
- LangString DESC_SecCopyUI ${LANG_ENGLISH} "Copy all required files to the application folder."
- LangString DESC_Section2 ${LANG_ENGLISH} "Add shortcut items to the Start Menu. (Recommended)"
- LangString DESC_Section3 ${LANG_ENGLISH} "Add a shortcut to Blender on your desktop."
- LangString DESC_Section4 ${LANG_ENGLISH} "Blender can register itself with .blend files to allow double-clicking from Windows Explorer, etc."
+ LangString DESC_InstallFiles ${LANG_ENGLISH} "Copy all required files to the application folder."
+ LangString DESC_StartMenu ${LANG_ENGLISH} "Add shortcut items to the Start Menu. (Recommended)"
+ LangString DESC_DesktopShortcut ${LANG_ENGLISH} "Add a shortcut to Blender on your desktop."
+ LangString DESC_BlendRegister ${LANG_ENGLISH} "Blender can register itself with .blend files to allow double-clicking from Windows Explorer, etc."
LangString TEXT_IO_TITLE ${LANG_ENGLISH} "Specify User Data Location"
;--------------------------------
;Data
Caption "Blender [VERSION] Installer"
OutFile "[DISTDIR]\..\blender-[VERSION]-windows[BITNESS].exe"
-;InstallDir "$PROGRAMFILES[BITNESS]\Blender Foundation\Blender"
-; Install to user profile dir. While it is non-standard, it allows
-; users to install without having to have the installer run in elevated mode.
-InstallDir "$PROFILE\Blender Foundation\Blender"
-
+InstallDir $INSTDIR ; $INSTDIR is set inside .onInit
BrandingText "Blender Foundation | http://www.blender.org"
ComponentText "This will install Blender [VERSION] on your computer."
@@ -85,7 +79,7 @@ SilentUnInstall normal
Var BLENDERHOME
Var SHORTVERSION ; This is blender_version_decimal() from path_util.c
-; custom controls
+; Custom controls
Var HWND
Var HWND_APPDATA
@@ -95,6 +89,20 @@ Var HWND_HOMEDIR
Function .onInit
ClearErrors
StrCpy $SHORTVERSION "[SHORTVERSION]"
+
+ ${If} ${RunningX64}
+ ${If} "[BITNESS]" == "32"
+ ${OrIf} "[BITNESS]" == "-mingw"
+ StrCpy $INSTDIR "$PROGRAMFILES32\Blender Foundation\Blender" ; Can't use InstallDir inside Section
+ ${ElseIf} "[BITNESS]" == "64"
+ StrCpy $INSTDIR "$PROGRAMFILES64\Blender Foundation\Blender"
+ ${EndIf}
+ ${Else}
+ StrCpy $INSTDIR "$PROGRAMFILES\Blender Foundation\Blender"
+ ${EndIf}
+FunctionEnd
+
+Function un.onInit
FunctionEnd
Function DataLocation
@@ -105,12 +113,12 @@ Function DataLocation
Abort
${EndIf}
- ${NSD_CreateLabel} 0 0 100% 12u "Please specify where you wish to install Blender's user data files."
- ${NSD_CreateRadioButton} 0 20 100% 12u "Use the Application Data directory"
+ ${NSD_CreateLabel} 0 0 100% 24u "Please specify where you wish to install Blender's user data files. Be aware that if you choose to use your Application Data directory, your preferences and scripts will only be accessible by the current user account."
+ ${NSD_CreateRadioButton} 0 50 100% 12u "Use Application Data directory (recommended)"
Pop $HWND_APPDATA
- ${NSD_CreateRadioButton} 0 50 100% 12u "Use the installation directory (ie. location chosen to install blender.exe)."
+ ${NSD_CreateRadioButton} 0 80 100% 12u "Use installation directory"
Pop $HWND_INSTDIR
- ${NSD_CreateRadioButton} 0 80 100% 12u "I have defined a %HOME% variable, please install files here."
+ ${NSD_CreateRadioButton} 0 110 100% 12u "I have defined a %HOME% variable, please install files there"
Pop $HWND_HOMEDIR
${If} ${AtMostWinME}
@@ -128,7 +136,9 @@ FunctionEnd
Function DataLocationOnLeave
${NSD_GetState} $HWND_APPDATA $R0
${If} $R0 == "1"
+ SetShellVarContext current
StrCpy $BLENDERHOME "$APPDATA\Blender Foundation\Blender"
+ SetShellVarContext all
${Else}
${NSD_GetState} $HWND_INSTDIR $R0
${If} $R0 == "1"
@@ -142,15 +152,15 @@ Function DataLocationOnLeave
${EndIf}
FunctionEnd
-Section "Blender-[VERSION] (required)" SecCopyUI
+Section "Blender [VERSION] (required)" InstallFiles
SectionIn RO
; Set output path to the installation directory.
SetOutPath $INSTDIR
- ; the contents of Blender installation root dir
+ ; The contents of Blender installation root dir
[ROOTDIRCONTS]
- ; all datafiles (python, scripts, config)
+ ; All datafiles (python, scripts, config)
[DODATAFILES]
SetOutPath $INSTDIR
@@ -162,13 +172,19 @@ Section "Blender-[VERSION] (required)" SecCopyUI
WriteRegStr HKLM "SOFTWARE\BlenderFoundation" "ConfigData_Dir" "$BLENDERHOME"
WriteRegStr HKLM "SOFTWARE\BlenderFoundation" "ShortVersion" "[SHORTVERSION]"
; Write the uninstall keys for Windows
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "DisplayName" "Blender (remove only)"
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "UninstallString" '"$INSTDIR\uninstall.exe"'
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "DisplayName" "Blender"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "Publisher" "Blender Foundation"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "URLInfoAbout" "http://www.blender.org/"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "DisplayVersion" "[VERSION]"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "DisplayIcon" "$INSTDIR\blender.exe"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "UninstallString" '"$INSTDIR\uninstall.exe"'
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "NoModify" 1
+ WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender" "NoRepair " 1
WriteUninstaller "uninstall.exe"
SectionEnd
-Section "Add Start Menu shortcuts" Section2
+Section "Add Start Menu Shortcuts" StartMenu
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\Blender Foundation\Blender\"
CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
@@ -176,45 +192,38 @@ Section "Add Start Menu shortcuts" Section2
CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\Readme.lnk" "$INSTDIR\readme.html" "" "" 0
CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\Copyright.lnk" "$INSTDIR\Copyright.txt" "" "$INSTDIR\copyright.txt" 0
CreateShortCut "$SMPROGRAMS\Blender Foundation\Blender\GPL-license.lnk" "$INSTDIR\GPL-license.txt" "" "$INSTDIR\GPL-license.txt" 0
+ System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' ; refresh icons
SectionEnd
-Section "Add Desktop Blender-[VERSION] shortcut" Section3
+Section "Add Desktop Shortcut" DesktopShortcut
CreateShortCut "$DESKTOP\Blender.lnk" "$INSTDIR\blender.exe" "" "$INSTDIR\blender.exe" 0
+ System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' ; refresh icons
SectionEnd
-Section "Open .blend files with Blender-[VERSION]" Section4
-
- ${If} ${RunningX64}
- SetRegView 64
- ${EndIf}
- WriteRegStr HKCR ".blend" "" "blendfile"
- WriteRegStr HKCR "blendfile" "" "Blender .blend File"
- WriteRegStr HKCR "blendfile\shell" "" "open"
- WriteRegStr HKCR "blendfile\DefaultIcon" "" $INSTDIR\blender.exe,1
- WriteRegStr HKCR "blendfile\shell\open\command" "" \
- '"$INSTDIR\blender.exe" "%1"'
-
+Section "Open .blend files with Blender" BlendRegister
+ ExecWait '"$INSTDIR\blender.exe" -r'
SectionEnd
-UninstallText "This will uninstall Blender [VERSION], and all installed files. Before continuing make sure you have created backup of all the files you may want to keep: startup.blend, bookmarks.txt, recent-files.txt. Hit next to continue."
+UninstallText "This will uninstall Blender [VERSION], and all installed files. Before continuing make sure you have created backup of all the files you may want to keep: startup.blend, bookmarks.txt, recent-files.txt. Hit 'Uninstall' to continue."
Section "Uninstall"
- ; remove registry keys
+ ; Remove registry keys
${If} ${RunningX64}
SetRegView 64
${EndIf}
+
ReadRegStr $BLENDERHOME HKLM "SOFTWARE\BlenderFoundation" "ConfigData_Dir"
ReadRegStr $SHORTVERSION HKLM "SOFTWARE\BlenderFoundation" "ShortVersion"
- DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Blender"
+ DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Blender"
DeleteRegKey HKLM "SOFTWARE\BlenderFoundation"
+ DeleteRegKey HKCR ".blend"
+ DeleteRegKey HKCR "blendfile"
+ DeleteRegKey HKCR "CLSID\{D45F043D-F17F-4e8a-8435-70971D9FA46D}"
SetShellVarContext all
- ; remove files
+ ; Remove files
[DELROOTDIRCONTS]
- ; remove bundled python
- RmDir /r $INSTDIR\$SHORTVERSION\python
-
Delete "$INSTDIR\uninstall.exe"
MessageBox MB_YESNO "Recursively erase contents of $BLENDERHOME\$SHORTVERSION\scripts? NOTE: This includes all installed scripts and *any* file and directory you have manually created, installed later or copied. This also including .blend files." IDNO NextNoScriptRemove
@@ -226,26 +235,27 @@ NextNoConfigRemove:
MessageBox MB_YESNO "Recursively erase contents from $BLENDERHOME\$SHORTVERSION\plugins? NOTE: This includes files and subdirectories in this directory" IDNO NextNoPluginRemove
RMDir /r "$BLENDERHOME\$SHORTVERSION\plugins"
NextNoPluginRemove:
- ; try to remove dirs, but leave them if they contain anything
+ ; Try to remove dirs, but leave them if they contain anything
RMDir "$BLENDERHOME\$SHORTVERSION\plugins"
RMDir "$BLENDERHOME\$SHORTVERSION\config"
RMDir "$BLENDERHOME\$SHORTVERSION\scripts"
RMDir "$BLENDERHOME\$SHORTVERSION"
RMDir "$BLENDERHOME"
- ; remove shortcuts
+ ; Remove shortcuts
Delete "$SMPROGRAMS\Blender Foundation\Blender\*.*"
Delete "$DESKTOP\Blender.lnk"
- ; remove all link related directories and files
- RMDir "$SMPROGRAMS\Blender Foundation\Blender"
- RMDir "$SMPROGRAMS\Blender Foundation"
+ ; Remove all link related directories and files
+ RMDir /r "$SMPROGRAMS\Blender Foundation"
; Clear out installation dir
- RMDir "$INSTDIR"
+ RMDir /r "$INSTDIR"
+
+ System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v (0x08000000, 0, 0, 0)' ; Refresh icons
SectionEnd
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
- !insertmacro MUI_DESCRIPTION_TEXT ${SecCopyUI} $(DESC_SecCopyUI)
- !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)
- !insertmacro MUI_DESCRIPTION_TEXT ${Section3} $(DESC_Section3)
- !insertmacro MUI_DESCRIPTION_TEXT ${Section4} $(DESC_Section4)
+ !insertmacro MUI_DESCRIPTION_TEXT ${InstallFiles} $(DESC_InstallFiles)
+ !insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} $(DESC_StartMenu)
+ !insertmacro MUI_DESCRIPTION_TEXT ${DesktopShortcut} $(DESC_DesktopShortcut)
+ !insertmacro MUI_DESCRIPTION_TEXT ${BlendRegister} $(DESC_BlendRegister)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c
index b23c1f83714..ce414cd15fe 100644
--- a/source/blender/avi/intern/avi.c
+++ b/source/blender/avi/intern/avi.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/avi/intern/avi.c
+ * \ingroup avi
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
@@ -211,7 +216,7 @@ int AVI_is_avi (char *name) {
int AVI_is_avi (const char *name) {
int temp, fcca, j;
- AviMovie movie= {0};
+ AviMovie movie= {NULL};
AviMainHeader header;
AviBitmapInfoHeader bheader;
int movie_tracks = 0;
diff --git a/source/blender/avi/intern/avi_intern.h b/source/blender/avi/intern/avi_intern.h
index d8595005b46..ecf4c5a529a 100644
--- a/source/blender/avi/intern/avi_intern.h
+++ b/source/blender/avi/intern/avi_intern.h
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/avi/intern/avi_intern.h
+ * \ingroup avi
+ */
+
#ifndef AVI_INTERN_H
#define AVI_INTERN_H
diff --git a/source/blender/avi/intern/avirgb.c b/source/blender/avi/intern/avirgb.c
index c081960481f..b7f6a58b6d7 100644
--- a/source/blender/avi/intern/avirgb.c
+++ b/source/blender/avi/intern/avirgb.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/avi/intern/avirgb.c
+ * \ingroup avi
+ */
+
+
#include "AVI_avi.h"
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/avi/intern/avirgb.h b/source/blender/avi/intern/avirgb.h
index 87998c42690..88338b55106 100644
--- a/source/blender/avi/intern/avirgb.h
+++ b/source/blender/avi/intern/avirgb.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/avi/intern/avirgb.h
+ * \ingroup avi
+ */
+
+
void *avi_converter_from_avi_rgb (AviMovie *movie, int stream, unsigned char *buffer, int *size);
void *avi_converter_to_avi_rgb (AviMovie *movie, int stream, unsigned char *buffer, int *size);
diff --git a/source/blender/avi/intern/codecs.c b/source/blender/avi/intern/codecs.c
index 3652c7294b5..47a5fc192fd 100644
--- a/source/blender/avi/intern/codecs.c
+++ b/source/blender/avi/intern/codecs.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/avi/intern/codecs.c
+ * \ingroup avi
+ */
+
+
#include "AVI_avi.h"
#include "avi_intern.h"
diff --git a/source/blender/avi/intern/endian.c b/source/blender/avi/intern/endian.c
index 2312aec2686..a985e8c3d5e 100644
--- a/source/blender/avi/intern/endian.c
+++ b/source/blender/avi/intern/endian.c
@@ -31,6 +31,11 @@
*
*/
+/** \file blender/avi/intern/endian.c
+ * \ingroup avi
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/avi/intern/endian.h b/source/blender/avi/intern/endian.h
index 6f81463b6da..6516df74116 100644
--- a/source/blender/avi/intern/endian.h
+++ b/source/blender/avi/intern/endian.h
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/avi/intern/endian.h
+ * \ingroup avi
+ */
+
+
#ifndef AVI_ENDIAN_H
#define AVI_ENDIAN_H
diff --git a/source/blender/avi/intern/mjpeg.c b/source/blender/avi/intern/mjpeg.c
index c6295e2e49e..80057ff4216 100644
--- a/source/blender/avi/intern/mjpeg.c
+++ b/source/blender/avi/intern/mjpeg.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/avi/intern/mjpeg.c
+ * \ingroup avi
+ */
+
+
#include "AVI_avi.h"
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/avi/intern/mjpeg.h b/source/blender/avi/intern/mjpeg.h
index fa3b4dc8d0c..ce10388a466 100644
--- a/source/blender/avi/intern/mjpeg.h
+++ b/source/blender/avi/intern/mjpeg.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/avi/intern/mjpeg.h
+ * \ingroup avi
+ */
+
+
void *avi_converter_from_mjpeg (AviMovie *movie, int stream, unsigned char *buffer, int *size);
void *avi_converter_to_mjpeg (AviMovie *movie, int stream, unsigned char *buffer, int *size);
diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c
index fdfdfab9722..533bce2c8ea 100644
--- a/source/blender/avi/intern/options.c
+++ b/source/blender/avi/intern/options.c
@@ -31,6 +31,11 @@
*
*/
+/** \file blender/avi/intern/options.c
+ * \ingroup avi
+ */
+
+
#include "AVI_avi.h"
#include "avi_intern.h"
#include "endian.h"
diff --git a/source/blender/avi/intern/rgb32.c b/source/blender/avi/intern/rgb32.c
index 1b1703a3cec..ba4bf2d524b 100644
--- a/source/blender/avi/intern/rgb32.c
+++ b/source/blender/avi/intern/rgb32.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/avi/intern/rgb32.c
+ * \ingroup avi
+ */
+
+
#include "AVI_avi.h"
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/avi/intern/rgb32.h b/source/blender/avi/intern/rgb32.h
index 460080eaa99..70fe33c9138 100644
--- a/source/blender/avi/intern/rgb32.h
+++ b/source/blender/avi/intern/rgb32.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/avi/intern/rgb32.h
+ * \ingroup avi
+ */
+
+
void *avi_converter_from_rgb32 (AviMovie *movie, int stream, unsigned char *buffer, int *size);
void *avi_converter_to_rgb32 (AviMovie *movie, int stream, unsigned char *buffer, int *size);
diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h
index e2245a9f049..93b9cbc0bdf 100644
--- a/source/blender/blenfont/BLF_api.h
+++ b/source/blender/blenfont/BLF_api.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenfont/BLF_api.h
+ * \ingroup blf
+ */
+
+
#ifndef BLF_API_H
#define BLF_API_H
diff --git a/source/blender/blenfont/CMakeLists.txt b/source/blender/blenfont/CMakeLists.txt
index 4f211bdda17..15fbfaa2de2 100644
--- a/source/blender/blenfont/CMakeLists.txt
+++ b/source/blender/blenfont/CMakeLists.txt
@@ -29,7 +29,7 @@ set(INC
../editors/include
../blenkernel
../../../intern/guardedalloc
- ../../../extern/glew/include
+ ${GLEW_INCLUDE_PATH}
${FREETYPE_INCLUDE_DIRS}
)
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c
index 2a135b1fb84..930f55a48fa 100644
--- a/source/blender/blenfont/intern/blf.c
+++ b/source/blender/blenfont/intern/blf.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenfont/intern/blf.c
+ * \ingroup blf
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c
index 8f816fac3ee..857ead0b7cd 100644
--- a/source/blender/blenfont/intern/blf_dir.c
+++ b/source/blender/blenfont/intern/blf_dir.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenfont/intern/blf_dir.c
+ * \ingroup blf
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -55,7 +60,7 @@ static DirBLF *blf_dir_find(const char *path)
p= global_font_dir.first;
while (p) {
- if (!strcmp(p->path, path))
+ if (BLI_path_cmp(p->path, path) == 0)
return(p);
p= p->next;
}
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index 733352286b9..80d0a48954a 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenfont/intern/blf_font.c
+ * \ingroup blf
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c
index b1cc4ba3084..e165012f43e 100644
--- a/source/blender/blenfont/intern/blf_glyph.c
+++ b/source/blender/blenfont/intern/blf_glyph.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenfont/intern/blf_glyph.c
+ * \ingroup blf
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -130,6 +135,8 @@ void blf_glyph_cache_clear(FontBLF *font)
}
}
}
+
+ memset(font->glyph_ascii_table, 0, sizeof(font->glyph_ascii_table));
}
void blf_glyph_cache_free(GlyphCacheBLF *gc)
diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h
index d07b2605575..34df8d72103 100644
--- a/source/blender/blenfont/intern/blf_internal.h
+++ b/source/blender/blenfont/intern/blf_internal.h
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenfont/intern/blf_internal.h
+ * \ingroup blf
+ */
+
+
#ifndef BLF_INTERNAL_H
#define BLF_INTERNAL_H
diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h
index d12487b5c8b..deb13006eaf 100644
--- a/source/blender/blenfont/intern/blf_internal_types.h
+++ b/source/blender/blenfont/intern/blf_internal_types.h
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenfont/intern/blf_internal_types.h
+ * \ingroup blf
+ */
+
+
#ifndef BLF_INTERNAL_TYPES_H
#define BLF_INTERNAL_TYPES_H
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c
index da0b767f64d..e7f9d1746ad 100644
--- a/source/blender/blenfont/intern/blf_lang.c
+++ b/source/blender/blenfont/intern/blf_lang.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenfont/intern/blf_lang.c
+ * \ingroup blf
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/blenfont/intern/blf_util.c b/source/blender/blenfont/intern/blf_util.c
index 640876954ab..ab6b516787e 100644
--- a/source/blender/blenfont/intern/blf_util.c
+++ b/source/blender/blenfont/intern/blf_util.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenfont/intern/blf_util.c
+ * \ingroup blf
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index ea5b9e8367f..ecf62d49da6 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -295,7 +295,7 @@ struct DerivedMesh {
/* Fill the array (of length .getNumVerts()) with all vertex locations */
void (*getVertCos)(DerivedMesh *dm, float (*cos_r)[3]);
- /* Get vertex normal, undefined if index is not valid */
+ /* Get smooth vertex normal, undefined if index is not valid */
void (*getVertNo)(DerivedMesh *dm, int index, float no_r[3]);
/* Get a map of vertices to faces
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h
index 59da97d8b09..698f0f0fecf 100644
--- a/source/blender/blenkernel/BKE_action.h
+++ b/source/blender/blenkernel/BKE_action.h
@@ -82,9 +82,15 @@ typedef enum eAction_TransformFlags {
ACT_TRANS_ROT = (1<<1),
/* scaling */
ACT_TRANS_SCALE = (1<<2),
+
+ /* strictly not a transform, but custom properties are also
+ * quite often used in modern rigs
+ */
+ ACT_TRANS_PROP = (1<<3),
/* all flags */
- ACT_TRANS_ALL = (ACT_TRANS_LOC|ACT_TRANS_ROT|ACT_TRANS_SCALE),
+ ACT_TRANS_ONLY = (ACT_TRANS_LOC|ACT_TRANS_ROT|ACT_TRANS_SCALE),
+ ACT_TRANS_ALL = (ACT_TRANS_ONLY|ACT_TRANS_PROP)
} eAction_TransformFlags;
/* Return flags indicating which transforms the given object/posechannel has
diff --git a/source/blender/blenkernel/BKE_animsys.h b/source/blender/blenkernel/BKE_animsys.h
index a469d05ee26..348b967f9c4 100644
--- a/source/blender/blenkernel/BKE_animsys.h
+++ b/source/blender/blenkernel/BKE_animsys.h
@@ -72,6 +72,9 @@ void BKE_copy_animdata_id_action(struct ID *id);
/* Make Local */
void BKE_animdata_make_local(struct AnimData *adt);
+/* Re-Assign ID's */
+void BKE_relink_animdata(struct AnimData *adt);
+
/* ************************************* */
/* KeyingSets API */
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 44ce6060f1b..eae75d58a0a 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -43,17 +43,17 @@ extern "C" {
/* these lines are grep'd, watch out for our not-so-awesome regex
* and keep comment above the defines.
* Use STRINGIFY() rather then defining with quotes */
-#define BLENDER_VERSION 256
-#define BLENDER_SUBVERSION 2
+#define BLENDER_VERSION 257
+#define BLENDER_SUBVERSION 0
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
/* used by packaging tools */
/* can be left blank, otherwise a,b,c... etc with no quotes */
-#define BLENDER_VERSION_CHAR a
- /* alpha/beta/rc/releases */
-#define BLENDER_VERSION_CYCLE beta
+#define BLENDER_VERSION_CHAR
+ /* alpha/beta/rc/release, docs use this */
+#define BLENDER_VERSION_CYCLE release
struct ListBase;
struct MemFile;
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index f0c58e0a511..0491116d199 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -51,7 +51,7 @@ struct BevList;
#define SEGMENTSV(nu) ( ((nu)->flagv & CU_NURB_CYCLIC) ? (nu)->pntsv : (nu)->pntsv-1 )
#define CU_DO_TILT(cu, nu) (((nu->flag & CU_2D) && (cu->flag & CU_3D)==0) ? 0 : 1)
-#define CU_DO_RADIUS(cu, nu) ((CU_DO_TILT(cu, nu) || ((cu)->flag & CU_PATH_RADIUS) || (cu)->bevobj || (cu)->ext1!=0.0 || (cu)->ext2!=0.0) ? 1:0)
+#define CU_DO_RADIUS(cu, nu) ((CU_DO_TILT(cu, nu) || ((cu)->flag & CU_PATH_RADIUS) || (cu)->bevobj || (cu)->ext1!=0.0f || (cu)->ext2!=0.0f) ? 1:0)
void unlink_curve( struct Curve *cu);
diff --git a/source/blender/blenkernel/BKE_customdata_file.h b/source/blender/blenkernel/BKE_customdata_file.h
index f97565f23a1..030d46fc1a6 100644
--- a/source/blender/blenkernel/BKE_customdata_file.h
+++ b/source/blender/blenkernel/BKE_customdata_file.h
@@ -44,12 +44,12 @@ void cdf_free(CDataFile *cdf);
int cdf_read_open(CDataFile *cdf, char *filename);
int cdf_read_layer(CDataFile *cdf, CDataFileLayer *blay);
-int cdf_read_data(CDataFile *cdf, int size, void *data);
+int cdf_read_data(CDataFile *cdf, unsigned int size, void *data);
void cdf_read_close(CDataFile *cdf);
int cdf_write_open(CDataFile *cdf, char *filename);
int cdf_write_layer(CDataFile *cdf, CDataFileLayer *blay);
-int cdf_write_data(CDataFile *cdf, int size, void *data);
+int cdf_write_data(CDataFile *cdf, unsigned int size, void *data);
void cdf_write_close(CDataFile *cdf);
void cdf_remove(char *filename);
diff --git a/source/blender/blenkernel/BKE_depsgraph.h b/source/blender/blenkernel/BKE_depsgraph.h
index f78a957cbab..14251fb1762 100644
--- a/source/blender/blenkernel/BKE_depsgraph.h
+++ b/source/blender/blenkernel/BKE_depsgraph.h
@@ -112,7 +112,7 @@ void DAG_scene_update_flags(struct Main *bmain, struct Scene *sce, unsigned int
/* flushes all recalc flags in objects down the dependency tree */
void DAG_scene_flush_update(struct Main *bmain, struct Scene *sce, unsigned int lay, const short do_time);
/* tag objects for update on file load */
-void DAG_on_load_update(struct Main *bmain, const short do_time);
+void DAG_on_visible_update(struct Main *bmain, const short do_time);
/* when setting manual RECALC flags, call this afterwards */
void DAG_ids_flush_update(struct Main *bmain, int time);
diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h
index f81acf4b11e..b791e29a38e 100644
--- a/source/blender/blenkernel/BKE_fcurve.h
+++ b/source/blender/blenkernel/BKE_fcurve.h
@@ -215,10 +215,10 @@ struct FCurve *rna_get_fcurve(struct PointerRNA *ptr, struct PropertyRNA *prop,
int binarysearch_bezt_index(struct BezTriple array[], float frame, int arraylen, short *replace);
/* get the time extents for F-Curve */
-void calc_fcurve_range(struct FCurve *fcu, float *min, float *max);
+void calc_fcurve_range(struct FCurve *fcu, float *min, float *max, const short selOnly);
/* get the bounding-box extents for F-Curve */
-void calc_fcurve_bounds(struct FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax);
+void calc_fcurve_bounds(struct FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax, const short selOnly);
/* .............. */
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index d83e0e5bc4c..0360acbea32 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -111,6 +111,7 @@ typedef struct Global {
#define G_DEBUG (1 << 12)
#define G_SCRIPT_AUTOEXEC (1 << 13)
+#define G_SCRIPT_OVERRIDE_PREF (1 << 14) /* when this flag is set ignore the userprefs */
/* #define G_NOFROZEN (1 << 17) also removed */
#define G_GREASEPENCIL (1 << 17)
diff --git a/source/blender/blenkernel/BKE_idcode.h b/source/blender/blenkernel/BKE_idcode.h
index 1b2b3d2ee95..e46ad450c31 100755
--- a/source/blender/blenkernel/BKE_idcode.h
+++ b/source/blender/blenkernel/BKE_idcode.h
@@ -76,4 +76,12 @@ int BKE_idcode_is_linkable(int code);
*/
int BKE_idcode_is_valid(int code);
+/**
+ * Return an ID code and steps the index forward 1.
+ *
+ * @param index, start as 0.
+ * @return the code, 0 when all codes have been returned.
+ */
+int BKE_idcode_iter_step(int *index);
+
#endif
diff --git a/source/blender/blenkernel/BKE_idprop.h b/source/blender/blenkernel/BKE_idprop.h
index e71ad5c8a24..2ba23d4a944 100644
--- a/source/blender/blenkernel/BKE_idprop.h
+++ b/source/blender/blenkernel/BKE_idprop.h
@@ -88,19 +88,19 @@ void IDP_UnlinkID(struct IDProperty *prop);
/*-------- Group Functions -------*/
-/* Sync values from one group to another, only where they match */
+/** Sync values from one group to another, only where they match */
void IDP_SyncGroupValues(struct IDProperty *dest, struct IDProperty *src);
-/*
+/**
replaces all properties with the same name in a destination group from a source group.
*/
void IDP_ReplaceGroupInGroup(struct IDProperty *dest, struct IDProperty *src);
-/*checks if a property with the same name as prop exists, and if so replaces it.
+/** checks if a property with the same name as prop exists, and if so replaces it.
Use this to preserve order!*/
void IDP_ReplaceInGroup(struct IDProperty *group, struct IDProperty *prop);
-/*
+/**
This function has a sanity check to make sure ID properties with the same name don't
get added to the group.
@@ -117,12 +117,12 @@ be reorganized to work properly.
*/
int IDP_AddToGroup(struct IDProperty *group, struct IDProperty *prop);
-/*this is the same as IDP_AddToGroup, only you pass an item
+/** this is the same as IDP_AddToGroup, only you pass an item
in the group list to be inserted after.*/
int IDP_InsertToGroup(struct IDProperty *group, struct IDProperty *previous,
struct IDProperty *pnew);
-/*NOTE: this does not free the property!!
+/** \note this does not free the property!!
To free the property, you have to do:
IDP_FreeProperty(prop); //free all subdata
@@ -132,27 +132,27 @@ int IDP_InsertToGroup(struct IDProperty *group, struct IDProperty *previous,
void IDP_RemFromGroup(struct IDProperty *group, struct IDProperty *prop);
IDProperty *IDP_GetPropertyFromGroup(struct IDProperty *prop, const char *name);
-/* same as above but ensure type match */
+/** same as above but ensure type match */
IDProperty *IDP_GetPropertyTypeFromGroup(struct IDProperty *prop, const char *name, const char type);
-/*Get an iterator to iterate over the members of an id property group.
+/** Get an iterator to iterate over the members of an id property group.
Note that this will automatically free the iterator once iteration is complete;
if you stop the iteration before hitting the end, make sure to call
IDP_FreeIterBeforeEnd().*/
void *IDP_GetGroupIterator(struct IDProperty *prop);
-/*Returns the next item in the iteration. To use, simple for a loop like the following:
+/** Returns the next item in the iteration. To use, simple for a loop like the following:
while (IDP_GroupIterNext(iter) != NULL) {
. . .
}*/
IDProperty *IDP_GroupIterNext(void *vself);
-/*Frees the iterator pointed to at vself, only use this if iteration is stopped early;
+/** Frees the iterator pointed to at vself, only use this if iteration is stopped early;
when the iterator hits the end of the list it'll automatially free itself.*/
void IDP_FreeIterBeforeEnd(void *vself);
/*-------- Main Functions --------*/
-/*Get the Group property that contains the id properties for ID id. Set create_if_needed
+/** Get the Group property that contains the id properties for ID id. Set create_if_needed
to create the Group property and attach it to id if it doesn't exist; otherwise
the function will return NULL if there's no Group property attached to the ID.*/
struct IDProperty *IDP_GetProperties(struct ID *id, int create_if_needed);
@@ -160,7 +160,7 @@ struct IDProperty *IDP_CopyProperty(struct IDProperty *prop);
int IDP_EqualsProperties(struct IDProperty *prop1, struct IDProperty *prop2);
-/*
+/**
Allocate a new ID.
This function takes three arguments: the ID property type, a union which defines
@@ -186,13 +186,13 @@ IDP_AddToGroup or MEM_freeN the property, doing anything else might result in
a memory leak.
*/
struct IDProperty *IDP_New(int type, IDPropertyTemplate val, const char *name);
-\
-/*NOTE: this will free all child properties of list arrays and groups!
+
+/** \note this will free all child properties of list arrays and groups!
Also, note that this does NOT unlink anything! Plus it doesn't free
the actual struct IDProperty struct either.*/
void IDP_FreeProperty(struct IDProperty *prop);
-/*Unlinks any struct IDProperty<->ID linkage that might be going on.*/
+/** Unlinks any struct IDProperty<->ID linkage that might be going on.*/
void IDP_UnlinkProperty(struct IDProperty *prop);
#define IDP_Int(prop) ((prop)->data.val)
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 151bb45f663..42c4cb47388 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -61,8 +61,6 @@ struct Scene;
extern "C" {
#endif
-struct EditMesh *BKE_mesh_get_editmesh(struct Mesh *me);
-void BKE_mesh_end_editmesh(struct Mesh *me, struct EditMesh *em);
struct BMesh *BKE_mesh_to_bmesh(struct Mesh *me, struct Object *ob);
/*
@@ -106,17 +104,20 @@ int test_index_face(struct MFace *mface, struct CustomData *mfdata, int mfindex,
struct Mesh *get_mesh(struct Object *ob);
void set_mesh(struct Object *ob, struct Mesh *me);
void mball_to_mesh(struct ListBase *lb, struct Mesh *me);
-int nurbs_to_mdata(struct Object *ob, struct MVert **allvert, int *_totvert,
- struct MEdge **alledge, int *_totedge, struct MFace **allface, int *_totface);
-int nurbs_to_mdata_customdb(struct Object *ob, struct ListBase *dispbase,
- struct MVert **allvert, int *_totvert, struct MEdge **alledge, int *_totedge,
- struct MFace **allface, int *_totface);
+int nurbs_to_mdata(struct Object *ob, struct MVert **allvert, int *totvert,
+ struct MEdge **alledge, int *totedge, struct MFace **allface, struct MLoop **allloop, struct MPoly **allpoly,
+ int *totface, int *totloop, int *totpoly);
+int nurbs_to_mdata_customdb(struct Object *ob, struct ListBase *dispbase, struct MVert **allvert, int *_totvert,
+ struct MEdge **alledge, int *_totedge, struct MFace **allface, struct MLoop **allloop, struct MPoly **allpoly,
+ int *_totface, int *_totloop, int *_totpoly);
void nurbs_to_mesh(struct Object *ob);
void mesh_to_curve(struct Scene *scene, struct Object *ob);
void free_dverts(struct MDeformVert *dvert, int totvert);
void copy_dverts(struct MDeformVert *dst, struct MDeformVert *src, int totvert); /* __NLA */
void mesh_delete_material_index(struct Mesh *me, int index);
void mesh_set_smooth_flag(struct Object *meshOb, int enableSmooth);
+void convert_mfaces_to_mpolys(struct Mesh *mesh);
+void mesh_calc_tessface_normals(struct MVert *mverts, int numVerts,struct MFace *mfaces, int numFaces, float (*faceNors_r)[3]);
/*used for unit testing; compares two meshes, checking only
differences we care about. should be usable with leaf's
@@ -136,7 +137,9 @@ void mesh_strip_loose_edges(struct Mesh *me);
/* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL
* and vertex normals are stored in actual mverts.
*/
-void mesh_calc_normals(struct MVert *mverts, int numVerts, struct MFace *mfaces, int numFaces, float **faceNors_r);
+void mesh_calc_normals(struct MVert *mverts, int numVerts, struct MLoop *mloop,
+ struct MPoly *mpolys, int numLoops, int numPolys, float (*polyNors_r)[3],
+ struct MFace *mfaces, int numFaces, int *origIndexFace, float (*faceNors_r)[3]);
/* Return a newly MEM_malloc'd array of all the mesh vertex locations
* (_numVerts_r_ may be NULL) */
@@ -192,7 +195,7 @@ int mesh_center_bounds(struct Mesh *me, float cent[3]);
void mesh_translate(struct Mesh *me, float offset[3], int do_keys);
/* mesh_validate.c */
-int BKE_mesh_validate_arrays(struct Mesh *me, struct MVert *mverts, int totvert, struct MEdge *medges, int totedge, struct MFace *mfaces, int totface, const short do_verbose, const short do_fixes);
+int BKE_mesh_validate_arrays(struct Mesh *me, struct MVert *mverts, unsigned int totvert, struct MEdge *medges, unsigned int totedge, struct MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes);
int BKE_mesh_validate(struct Mesh *me, int do_verbose);
int BKE_mesh_validate_dm(struct DerivedMesh *dm);
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index 5f6120509f0..513ee68a101 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -306,7 +306,7 @@ int modifier_sameTopology(ModifierData *md);
int modifier_isEnabled(struct Scene *scene, struct ModifierData *md, int required_mode);
void modifier_setError(struct ModifierData *md, const char *format, ...)
#ifdef __GNUC__
-__attribute__ ((format (printf, 2, 3)));
+__attribute__ ((format (printf, 2, 3)))
#endif
;
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 41e41eab78f..a126f405d09 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -168,7 +168,7 @@ void ntreeLocalMerge(struct bNodeTree *localtree, struct bNodeTree *ntree);
void nodeVerifyType(struct bNodeTree *ntree, struct bNode *node);
-void nodeAddToPreview(struct bNode *, float *, int, int);
+void nodeAddToPreview(struct bNode *, float *, int, int, int);
void nodeUnlinkNode(struct bNodeTree *ntree, struct bNode *node);
void nodeUniqueName(struct bNodeTree *ntree, struct bNode *node);
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 3d32ba5a30a..cacfa702f7f 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -136,11 +136,15 @@ int object_insert_ptcache(struct Object *ob);
// void object_delete_ptcache(struct Object *ob, int index);
struct KeyBlock *object_insert_shape_key(struct Scene *scene, struct Object *ob, const char *name, int from_mix);
+int object_is_modified(struct Scene *scene, struct Object *ob);
+
void object_camera_matrix(
struct RenderData *rd, struct Object *camera, int winx, int winy, short field_second,
float winmat[][4], struct rctf *viewplane, float *clipsta, float *clipend, float *lens, float *ycor,
float *viewdx, float *viewdy);
+void object_relink(struct Object *ob);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index e6caae7a954..76f89b5e890 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -32,8 +32,6 @@
* \ingroup bke
*/
-#include "DNA_vec_types.h"
-
struct Brush;
struct MFace;
struct MultireModifierData;
@@ -65,15 +63,12 @@ int paint_facesel_test(struct Object *ob);
/* Session data (mode-specific) */
typedef struct SculptSession {
- struct ProjVert *projverts;
-
/* Mesh data (not copied) can come either directly from a Mesh, or from a MultiresDM */
struct MultiresModifierData *multires; /* Special handling for multires meshes */
struct MVert *mvert;
struct MFace *mface;
int totvert, totface;
float *face_normals;
- struct Object *ob;
struct KeyBlock *kb;
/* Mesh connectivity */
@@ -99,10 +94,6 @@ typedef struct SculptSession {
struct SculptStroke *stroke;
struct StrokeCache *cache;
-
- struct GPUDrawObject *drawobject;
-
- rcti previous_r;
} SculptSession;
void free_sculptsession(struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
index 507adcc5f2d..4dfc53e1734 100644
--- a/source/blender/blenkernel/BKE_particle.h
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -155,19 +155,58 @@ typedef struct ParticleBillboardData
short align, uv_split, anim, split_offset;
} ParticleBillboardData;
+typedef struct ParticleCollisionElement
+{
+ /* pointers to original data */
+ float *x[4], *v[4];
+
+ /* values interpolated from original data*/
+ float x0[3], x1[3], x2[3], p[3];
+
+ /* results for found intersection point */
+ float nor[3], vel[3], uv[2];
+
+ /* count of original data (1-4) */
+ int tot;
+
+ /* index of the collision face */
+ int index;
+
+ /* flags for inversed normal / particle already inside element at start */
+ short inv_nor, inside;
+} ParticleCollisionElement;
+
/* container for moving data between deflet_particle and particle_intersect_face */
typedef struct ParticleCollision
{
- struct Object *ob, *hit_ob; // collided and current objects
- struct CollisionModifierData *md, *hit_md; // collision modifiers for current and hit object;
- float nor[3]; // normal at collision point
- float vel[3]; // velocity of collision point
- float co1[3], co2[3]; // ray start and end points
- float ve1[3], ve2[3]; // particle velocities
- float ray_len; // original length of co2-co1, needed for collision time evaluation
+ struct Object *current;
+ struct Object *hit;
+ struct Object *prev;
+ struct Object *skip;
+ struct Object *emitter;
+
+ struct CollisionModifierData *md; // collision modifier for current object;
+
float f; // time factor of previous collision, needed for substracting face velocity
- float cfra; // start of the timestep (during frame change, since previous integer frame)
- float dfra; // duration of timestep in frames
+ float fac1, fac2;
+
+ float cfra, old_cfra;
+
+ float original_ray_length; //original length of co2-co1, needed for collision time evaluation
+
+ int prev_index;
+
+ ParticleCollisionElement pce;
+
+ float total_time, inv_timestep;
+
+ float radius;
+ float co1[3], co2[3];
+ float ve1[3], ve2[3];
+
+ float acc[3], boid_z;
+
+ int boid;
} ParticleCollision;
typedef struct ParticleDrawData {
@@ -242,7 +281,7 @@ void psys_get_particle_on_path(struct ParticleSimulationData *sim, int pa_num, s
int psys_get_particle_state(struct ParticleSimulationData *sim, int p, struct ParticleKey *state, int always);
/* for anim.c */
-void psys_get_dupli_texture(struct Object *ob, struct ParticleSettings *part, struct ParticleSystemModifierData *psmd, struct ParticleData *pa, struct ChildParticle *cpa, float *uv, float *orco);
+void psys_get_dupli_texture(struct ParticleSystem *psys, struct ParticleSettings *part, struct ParticleSystemModifierData *psmd, struct ParticleData *pa, struct ChildParticle *cpa, float *uv, float *orco);
void psys_get_dupli_path_transform(struct ParticleSimulationData *sim, struct ParticleData *pa, struct ChildParticle *cpa, struct ParticleCacheKey *cache, float mat[][4], float *scale);
ParticleThread *psys_threads_create(struct ParticleSimulationData *sim);
@@ -289,10 +328,8 @@ void psys_interpolate_face(struct MVert *mvert, struct MFace *mface, struct MTFa
float psys_particle_value_from_verts(struct DerivedMesh *dm, short from, struct ParticleData *pa, float *values);
void psys_get_from_key(struct ParticleKey *key, float *loc, float *vel, float *rot, float *time);
-/* only in edisparticle.c*/
-int psys_intersect_dm(struct Scene *scene, struct Object *ob, struct DerivedMesh *dm, float *vert_cos, float *co1, float* co2, float *min_d, int *min_face, float *min_uv, float *face_minmax, float *pa_minmax, float radius, float *ipoint);
/* BLI_bvhtree_ray_cast callback */
-void particle_intersect_face(void *userdata, int index, const struct BVHTreeRay *ray, struct BVHTreeRayHit *hit);
+void BKE_psys_collision_neartest_cb(void *userdata, int index, const struct BVHTreeRay *ray, struct BVHTreeRayHit *hit);
void psys_particle_on_dm(struct DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, float *vec, float *nor, float *utan, float *vtan, float *orco, float *ornor);
/* particle_system.c */
diff --git a/source/blender/blenkernel/BKE_report.h b/source/blender/blenkernel/BKE_report.h
index 397c96422a5..253f3ea9ac1 100644
--- a/source/blender/blenkernel/BKE_report.h
+++ b/source/blender/blenkernel/BKE_report.h
@@ -51,7 +51,7 @@ void BKE_reports_clear(ReportList *reports);
void BKE_report(ReportList *reports, ReportType type, const char *message);
void BKE_reportf(ReportList *reports, ReportType type, const char *format, ...)
#ifdef __GNUC__
-__attribute__ ((format (printf, 3, 4)));
+__attribute__ ((format (printf, 3, 4)))
#endif
;
diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index ac85f91bf46..943712167c6 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -50,10 +50,11 @@ struct Scene;
struct Text;
struct Text;
-#define SCE_COPY_EMPTY 0
-#define SCE_COPY_LINK_OB 1
-#define SCE_COPY_LINK_DATA 2
-#define SCE_COPY_FULL 3
+#define SCE_COPY_NEW 0
+#define SCE_COPY_EMPTY 1
+#define SCE_COPY_LINK_OB 2
+#define SCE_COPY_LINK_DATA 3
+#define SCE_COPY_FULL 4
#define SETLOOPER(_sce_basis, _sce_iter, _base) _sce_iter= _sce_basis, _base= _setlooper_base_step(&_sce_iter, NULL); _base; _base= _setlooper_base_step(&_sce_iter, _base)
struct Base *_setlooper_base_step(struct Scene **sce_iter, struct Base *base);
@@ -78,9 +79,6 @@ int scene_camera_switch_update(struct Scene *scene);
char *scene_find_marker_name(struct Scene *scene, int frame);
char *scene_find_last_marker_name(struct Scene *scene, int frame);
-int scene_marker_tfm_translate(struct Scene *scene, int delta, int flag);
-int scene_marker_tfm_extend(struct Scene *scene, int delta, int flag, int frame, char side);
-int scene_marker_tfm_scale(struct Scene *scene, float value, int flag);
struct Base *scene_add_base(struct Scene *sce, struct Object *ob);
void scene_deselect_all(struct Scene *sce);
diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index 0a7d9780a6b..56b0cd63e01 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -112,7 +112,7 @@ typedef struct SpaceType {
typedef struct ARegionType {
struct ARegionType *next, *prev;
- int regionid; /* unique identifier within this space */
+ int regionid; /* unique identifier within this space, defines RGN_TYPE_xxxx */
/* add handlers, stuff you only do once or on area/region type/size changes */
void (*init)(struct wmWindowManager *, struct ARegion *);
@@ -152,6 +152,8 @@ typedef struct ARegionType {
int prefsizex, prefsizey;
/* default keymaps to add */
int keymapflag;
+ /* return without drawing. lock is set by region definition, and copied to do_lock by render. can become flag */
+ short do_lock, lock;
} ARegionType;
/* panel types */
@@ -231,6 +233,7 @@ void BKE_spacetypes_free(void); /* only for quitting blender */
/* spacedata */
void BKE_spacedata_freelist(ListBase *lb);
void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2);
+void BKE_spacedata_draw_locks(int set);
/* area/regions */
struct ARegion *BKE_area_region_copy(struct SpaceType *st, struct ARegion *ar);
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index cc1d8537cbd..33bff1cd6a7 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -258,6 +258,7 @@ int seq_single_check(struct Sequence *seq);
void seq_single_fix(struct Sequence *seq);
int seq_test_overlap(struct ListBase * seqbasep, struct Sequence *test);
void seq_translate(struct Scene *scene, struct Sequence *seq, int delta);
+void seq_sound_init(struct Scene *scene, struct Sequence *seq);
struct Sequence *seq_foreground_frame_get(struct Scene *scene, int frame);
struct ListBase *seq_seqbase(struct ListBase *seqbase, struct Sequence *seq);
void seq_offset_animdata(struct Scene *scene, struct Sequence *seq, int ofs);
@@ -322,7 +323,7 @@ struct Sequence *sequencer_add_sound_strip(struct bContext *C, ListBase *seqbase
struct Sequence *sequencer_add_movie_strip(struct bContext *C, ListBase *seqbasep, struct SeqLoadInfo *seq_load);
/* view3d draw callback, run when not in background view */
-typedef struct ImBuf *(*SequencerDrawView)(struct Scene *, int, int, unsigned int, int);
+typedef struct ImBuf *(*SequencerDrawView)(struct Scene *, int, int, unsigned int, int, char[256]);
extern SequencerDrawView sequencer_view3d_cb;
/* copy/paste */
diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h
index acd4718a65a..04597fd666e 100644
--- a/source/blender/blenkernel/BKE_sound.h
+++ b/source/blender/blenkernel/BKE_sound.h
@@ -78,6 +78,8 @@ void sound_create_scene(struct Scene *scene);
void sound_destroy_scene(struct Scene *scene);
+void sound_mute_scene(struct Scene *scene, int muted);
+
void* sound_scene_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip);
void* sound_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip);
diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h
index e6a21ec3966..c8fa7a5e81f 100644
--- a/source/blender/blenkernel/BKE_texture.h
+++ b/source/blender/blenkernel/BKE_texture.h
@@ -81,6 +81,7 @@ void default_mtex(struct MTex *mtex);
struct MTex *add_mtex(void);
struct MTex *add_mtex_id(struct ID *id, int slot);
struct Tex *copy_texture(struct Tex *tex);
+struct Tex *localize_texture(struct Tex *tex);
void make_local_texture(struct Tex *tex);
void autotexname(struct Tex *tex);
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index dc485f5dc5f..a5a4f72523c 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -39,7 +39,6 @@ set(INC
../nodes
../editors/include
../render/extern/include
- ../../../extern/glew/include
../../../intern/audaspace/intern
../../../intern/bsp/extern ../blenfont
../../../intern/decimation/extern
@@ -51,6 +50,7 @@ set(INC
../../../intern/smoke/extern
../../../intern/mikktspace
../../../source/blender/windowmanager # XXX - BAD LEVEL CALL WM_api.h
+ ${GLEW_INCLUDE_PATH}
${ZLIB_INCLUDE_DIRS}
)
diff --git a/source/blender/blenkernel/depsgraph_private.h b/source/blender/blenkernel/depsgraph_private.h
index 4f99dacbc08..1fed115893c 100644
--- a/source/blender/blenkernel/depsgraph_private.h
+++ b/source/blender/blenkernel/depsgraph_private.h
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenkernel/depsgraph_private.h
+ * \ingroup bke
+ */
+
#ifndef DEPSGRAPH_PRIVATE
#define DEPSGRAPH_PRIVATE
diff --git a/source/blender/blenkernel/intern/BME_Customdata.c b/source/blender/blenkernel/intern/BME_Customdata.c
index f8b432ed384..503470bb89a 100644
--- a/source/blender/blenkernel/intern/BME_Customdata.c
+++ b/source/blender/blenkernel/intern/BME_Customdata.c
@@ -36,6 +36,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/BME_Customdata.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenkernel/intern/BME_conversions.c b/source/blender/blenkernel/intern/BME_conversions.c
index 8c399e88d67..65b0c3797d9 100644
--- a/source/blender/blenkernel/intern/BME_conversions.c
+++ b/source/blender/blenkernel/intern/BME_conversions.c
@@ -34,6 +34,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/BME_conversions.c
+ * \ingroup bke
+ */
+
+
#include "MEM_guardedalloc.h"
#include "DNA_meshdata_types.h"
diff --git a/source/blender/blenkernel/intern/BME_eulers.c b/source/blender/blenkernel/intern/BME_eulers.c
index 6897b0c8990..85007889e0a 100644
--- a/source/blender/blenkernel/intern/BME_eulers.c
+++ b/source/blender/blenkernel/intern/BME_eulers.c
@@ -34,6 +34,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/BME_eulers.c
+ * \ingroup bke
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
diff --git a/source/blender/blenkernel/intern/BME_mesh.c b/source/blender/blenkernel/intern/BME_mesh.c
index 1097b9da2bc..171b818ec49 100644
--- a/source/blender/blenkernel/intern/BME_mesh.c
+++ b/source/blender/blenkernel/intern/BME_mesh.c
@@ -34,6 +34,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/BME_mesh.c
+ * \ingroup bke
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BKE_bmesh.h"
diff --git a/source/blender/blenkernel/intern/BME_structure.c b/source/blender/blenkernel/intern/BME_structure.c
index f79b8edc866..de6ee53f048 100644
--- a/source/blender/blenkernel/intern/BME_structure.c
+++ b/source/blender/blenkernel/intern/BME_structure.c
@@ -34,6 +34,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
#if 0
+/** \file blender/blenkernel/intern/BME_structure.c
+ * \ingroup bke
+ */
+
+
#include <limits.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenkernel/intern/BME_tools.c b/source/blender/blenkernel/intern/BME_tools.c
index 8efc2d0e955..653330d03f4 100644
--- a/source/blender/blenkernel/intern/BME_tools.c
+++ b/source/blender/blenkernel/intern/BME_tools.c
@@ -33,6 +33,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/BME_tools.c
+ * \ingroup bke
+ */
+
+
#include <math.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.c b/source/blender/blenkernel/intern/CCGSubSurf.c
index 3564c93681a..a311ca15e5e 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.c
+++ b/source/blender/blenkernel/intern/CCGSubSurf.c
@@ -1,3 +1,6 @@
+/** \file blender/blenkernel/intern/CCGSubSurf.c
+ * \ingroup bke
+ */
/* $Id$ */
#include <stdlib.h>
@@ -226,9 +229,9 @@ static int VertDataEqual(float *a, float *b) {
#define VertDataAvg4(tv, av, bv, cv, dv) \
{ \
float *_t = (float*) tv, *_a = (float*) av, *_b = (float*) bv, *_c = (float*) cv, *_d = (float*) dv; \
- _t[0] = (_a[0]+_b[0]+_c[0]+_d[0])*.25; \
- _t[1] = (_a[1]+_b[1]+_c[1]+_d[1])*.25; \
- _t[2] = (_a[2]+_b[2]+_c[2]+_d[2])*.25; \
+ _t[0] = (_a[0]+_b[0]+_c[0]+_d[0])*.25f; \
+ _t[1] = (_a[1]+_b[1]+_c[1]+_d[1])*.25f; \
+ _t[2] = (_a[2]+_b[2]+_c[2]+_d[2])*.25f; \
}
#define NormZero(av) { float *_a = (float*) av; _a[0] = _a[1] = _a[2] = 0.0f; }
#define NormCopy(av, bv) { float *_a = (float*) av, *_b = (float*) bv; _a[0] =_b[0]; _a[1] =_b[1]; _a[2] =_b[2]; }
@@ -504,9 +507,9 @@ static float EDGE_getSharpness(CCGEdge *e, int lvl) {
if (!lvl)
return e->crease;
else if (!e->crease)
- return 0.0;
- else if (e->crease - lvl < 0.0)
- return 0.0;
+ return 0.0f;
+ else if (e->crease - lvl < 0.0f)
+ return 0.0f;
else
return e->crease - lvl;
}
@@ -1339,6 +1342,17 @@ static void ccgSubSurf__calcVertNormals(CCGSubSurf *ss,
NormCopy(EDGE_getNo(e, lvl, x),
_face_getIFNoEdge(f, e, lvl, x, 0, subdivLevels, vertDataSize, normalDataOffset));
}
+ else {
+ /* set to zero here otherwise the normals are uninitialized memory
+ * render: tests/animation/knight.blend with valgrind.
+ * we could be more clever and interpolate vertex normals but these are
+ * most likely not used so just zero out. */
+ int x;
+
+ for (x=0; x<edgeSize; x++) {
+ NormZero(EDGE_getNo(e, lvl, x));
+ }
+ }
}
}
#undef FACE_getIFNo
@@ -1444,7 +1458,7 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
float sharpness = EDGE_getSharpness(e, curLvl);
int x, j;
- if (_edge_isBoundary(e) || sharpness>1.0) {
+ if (_edge_isBoundary(e) || sharpness > 1.0f) {
for (x=0; x<edgeSize-1; x++) {
int fx = x*2 + 1;
void *co0 = EDGE_getCo(e, curLvl, x+0);
@@ -1453,7 +1467,7 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
VertDataCopy(co, co0);
VertDataAdd(co, co1);
- VertDataMulN(co, 0.5);
+ VertDataMulN(co, 0.5f);
}
} else {
for (x=0; x<edgeSize-1; x++) {
@@ -1476,7 +1490,7 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
VertDataCopy(r, co0);
VertDataAdd(r, co1);
- VertDataMulN(r, 0.5);
+ VertDataMulN(r, 0.5f);
VertDataCopy(co, q);
VertDataSub(r, q);
@@ -1516,8 +1530,8 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
if(sharpCount) {
avgSharpness /= sharpCount;
- if (avgSharpness>1.0) {
- avgSharpness = 1.0;
+ if (avgSharpness > 1.0f) {
+ avgSharpness = 1.0f;
}
}
@@ -1539,7 +1553,7 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
}
VertDataCopy(nCo, co);
- VertDataMulN(nCo, 0.75);
+ VertDataMulN(nCo, 0.75f);
VertDataMulN(r, 0.25f/numBoundary);
VertDataAdd(nCo, r);
} else {
@@ -1584,7 +1598,7 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
if (seam) {
if (_edge_isBoundary(e))
VertDataAdd(q, _edge_getCoVert(e, v, curLvl, 1, vertDataSize));
- } else if (sharpness != 0.0) {
+ } else if (sharpness != 0.0f) {
VertDataAdd(q, _edge_getCoVert(e, v, curLvl, 1, vertDataSize));
}
}
@@ -1601,8 +1615,8 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
// r = co*.75 + q*.25
VertDataCopy(r, co);
- VertDataMulN(r, .75);
- VertDataMulN(q, .25);
+ VertDataMulN(r, .75f);
+ VertDataMulN(q, .25f);
VertDataAdd(r, q);
// nCo = nCo + (r-nCo)*avgSharpness
@@ -1628,8 +1642,8 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
sharpCount = 2;
avgSharpness += sharpness;
- if (avgSharpness>1.0) {
- avgSharpness = 1.0;
+ if (avgSharpness > 1.0f) {
+ avgSharpness = 1.0f;
}
} else {
sharpCount = 0;
@@ -1643,10 +1657,10 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
void *nCo = EDGE_getCo(e, nextLvl, fx);
VertDataCopy(r, EDGE_getCo(e, curLvl, x-1));
VertDataAdd(r, EDGE_getCo(e, curLvl, x+1));
- VertDataMulN(r, 0.5);
+ VertDataMulN(r, 0.5f);
VertDataCopy(nCo, co);
- VertDataMulN(nCo, 0.75);
- VertDataMulN(r, 0.25);
+ VertDataMulN(nCo, 0.75f);
+ VertDataMulN(r, 0.25f);
VertDataAdd(nCo, r);
}
} else {
@@ -1668,8 +1682,8 @@ static void ccgSubSurf__calcSubdivLevel(CCGSubSurf *ss,
VertDataAdd(r, _face_getIFCoEdge(f, e, curLvl, x, 1, subdivLevels, vertDataSize));
numFaces++;
}
- VertDataMulN(q, 1.0/(numFaces*2.0f));
- VertDataMulN(r, 1.0/(2.0f + numFaces));
+ VertDataMulN(q, 1.0f/(numFaces*2.0f));
+ VertDataMulN(r, 1.0f/(2.0f + numFaces));
VertDataCopy(nCo, co);
VertDataMulN(nCo, (float) numFaces);
@@ -1892,7 +1906,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
void *co = EDGE_getCo(e, nextLvl, 1);
float sharpness = EDGE_getSharpness(e, curLvl);
- if (_edge_isBoundary(e) || sharpness>=1.0) {
+ if (_edge_isBoundary(e) || sharpness >= 1.0f) {
VertDataCopy(co, VERT_getCo(e->v0, curLvl));
VertDataAdd(co, VERT_getCo(e->v1, curLvl));
VertDataMulN(co, 0.5f);
@@ -1944,8 +1958,8 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
if(sharpCount) {
avgSharpness /= sharpCount;
- if (avgSharpness>1.0) {
- avgSharpness = 1.0;
+ if (avgSharpness > 1.0f) {
+ avgSharpness = 1.0f;
}
}
@@ -1966,7 +1980,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
}
}
VertDataCopy(nCo, co);
- VertDataMulN(nCo, 0.75);
+ VertDataMulN(nCo, 0.75f);
VertDataMulN(r, 0.25f/numBoundary);
VertDataAdd(nCo, r);
} else {
@@ -2012,7 +2026,7 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
CCGVert *oV = _edge_getOtherVert(e, v);
VertDataAdd(q, VERT_getCo(oV, curLvl));
}
- } else if (sharpness != 0.0) {
+ } else if (sharpness != 0.0f) {
CCGVert *oV = _edge_getOtherVert(e, v);
VertDataAdd(q, VERT_getCo(oV, curLvl));
}
@@ -2030,8 +2044,8 @@ static void ccgSubSurf__sync(CCGSubSurf *ss) {
// r = co*.75 + q*.25
VertDataCopy(r, co);
- VertDataMulN(r, .75);
- VertDataMulN(q, .25);
+ VertDataMulN(r, 0.75f);
+ VertDataMulN(q, 0.25f);
VertDataAdd(r, q);
// nCo = nCo + (r-nCo)*avgSharpness
diff --git a/source/blender/blenkernel/intern/CCGSubSurf.h b/source/blender/blenkernel/intern/CCGSubSurf.h
index 34d684221b0..363d1e01f98 100644
--- a/source/blender/blenkernel/intern/CCGSubSurf.h
+++ b/source/blender/blenkernel/intern/CCGSubSurf.h
@@ -1,3 +1,6 @@
+/** \file blender/blenkernel/intern/CCGSubSurf.h
+ * \ingroup bke
+ */
/* $Id$ */
typedef void* CCGMeshHDL;
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 3ed8c0f091a..6a6a56baff6 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/DerivedMesh.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
@@ -827,12 +832,12 @@ void weight_to_rgb(float input, float *fr, float *fg, float *fb)
*fg= blend;
*fb= blend*(1.0f-((input-0.25f)*4.0f));
}
- else if (input<=0.75){ // green->yellow
+ else if (input <= 0.75f){ // green->yellow
*fr= blend * ((input-0.50f)*4.0f);
*fg= blend;
*fb= 0.0f;
}
- else if (input<=1.0){ // yellow->red
+ else if (input <= 1.0f){ // yellow->red
*fr= blend;
*fg= blend * (1.0f-((input-0.75f)*4.0f));
*fb= 0.0f;
@@ -1840,11 +1845,9 @@ static void GetNormal(const SMikkTSpaceContext * pContext, float fNorm[], const
}
else
{
- int i=0;
- short * no = pMesh->mvert[indices[vert_index]].no;
- for(i=0; i<3; i++)
- fNorm[i]=no[i]/32767.0f;
- normalize_v3(fNorm);
+ short *no = pMesh->mvert[indices[vert_index]].no;
+ normal_short_to_float_v3(fNorm, no);
+ normalize_v3(fNorm); /* XXX, is this needed */
}
}
static void SetTSpace(const SMikkTSpaceContext * pContext, const float fvTangent[], const float fSign, const int face_num, const int iVert)
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index 14a0f71f824..5b42948072f 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/action.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <math.h>
#include <stdlib.h>
@@ -862,7 +867,8 @@ void calc_action_range(const bAction *act, float *start, float *end, short incl_
float nmin, nmax;
/* get extents for this curve */
- calc_fcurve_range(fcu, &nmin, &nmax);
+ // TODO: allow enabling/disabling this?
+ calc_fcurve_range(fcu, &nmin, &nmax, FALSE);
/* compare to the running tally */
min= MIN2(min, nmin);
@@ -968,6 +974,11 @@ short action_get_item_transforms (bAction *act, Object *ob, bPoseChannel *pchan,
bPtr= strstr(fcu->rna_path, basePath);
if (bPtr) {
+ /* we must add len(basePath) bytes to the match so that we are at the end of the
+ * base path so that we don't get false positives with these strings in the names
+ */
+ bPtr += strlen(basePath);
+
/* step 2: check for some property with transforms
* - to speed things up, only check for the ones not yet found
* unless we're getting the curves too
@@ -976,8 +987,8 @@ short action_get_item_transforms (bAction *act, Object *ob, bPoseChannel *pchan,
* - once a match has been found, the curve cannot possibly be any other one
*/
if ((curves) || (flags & ACT_TRANS_LOC) == 0) {
- pPtr= strstr(fcu->rna_path, "location");
- if ((pPtr) && (pPtr >= bPtr)) {
+ pPtr= strstr(bPtr, "location");
+ if (pPtr) {
flags |= ACT_TRANS_LOC;
if (curves)
@@ -987,8 +998,8 @@ short action_get_item_transforms (bAction *act, Object *ob, bPoseChannel *pchan,
}
if ((curves) || (flags & ACT_TRANS_SCALE) == 0) {
- pPtr= strstr(fcu->rna_path, "scale");
- if ((pPtr) && (pPtr >= bPtr)) {
+ pPtr= strstr(bPtr, "scale");
+ if (pPtr) {
flags |= ACT_TRANS_SCALE;
if (curves)
@@ -998,8 +1009,8 @@ short action_get_item_transforms (bAction *act, Object *ob, bPoseChannel *pchan,
}
if ((curves) || (flags & ACT_TRANS_ROT) == 0) {
- pPtr= strstr(fcu->rna_path, "rotation");
- if ((pPtr) && (pPtr >= bPtr)) {
+ pPtr= strstr(bPtr, "rotation");
+ if (pPtr) {
flags |= ACT_TRANS_ROT;
if (curves)
@@ -1007,6 +1018,18 @@ short action_get_item_transforms (bAction *act, Object *ob, bPoseChannel *pchan,
continue;
}
}
+
+ if ((curves) || (flags & ACT_TRANS_PROP) == 0) {
+ /* custom properties only */
+ pPtr= strstr(bPtr, "[\""); /* extra '"' comment here to keep my texteditor functionlist working :) */
+ if (pPtr) {
+ flags |= ACT_TRANS_PROP;
+
+ if (curves)
+ BLI_addtail(curves, BLI_genericNodeN(fcu));
+ continue;
+ }
+ }
}
}
@@ -1066,7 +1089,7 @@ void copy_pose_result(bPose *to, bPose *from)
bPoseChannel *pchanto, *pchanfrom;
if(to==NULL || from==NULL) {
- printf("pose result copy error to:%p from:%p\n", to, from); // debug temp
+ printf("pose result copy error to:%p from:%p\n", (void *)to, (void *)from); // debug temp
return;
}
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 5842197da48..ec74391533b 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/anim.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <math.h>
#include <string.h>
@@ -1119,7 +1124,7 @@ static void face_duplilist(ListBase *lb, ID *id, Scene *scene, Object *par, floa
/* scale */
if(par->transflag & OB_DUPLIFACES_SCALE) {
float size= v4? area_quad_v3(v1, v2, v3, v4): area_tri_v3(v1, v2, v3);
- size= sqrt(size) * par->dupfacesca;
+ size= sqrtf(size) * par->dupfacesca;
mul_m3_fl(mat, size);
}
@@ -1340,8 +1345,6 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
/* for groups, pick the object based on settings */
if(part->draw&PART_DRAW_RAND_GR)
b= BLI_rand() % totgroup;
- else if(part->from==PART_FROM_PARTICLE)
- b= pa_num % totgroup;
else
b= a % totgroup;
@@ -1396,7 +1399,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
dob= new_dupli_object(lb, go->ob, mat, par->lay, counter, OB_DUPLIPARTS, animated);
copy_m4_m4(dob->omat, obcopylist[b].obmat);
if(G.rendering)
- psys_get_dupli_texture(par, part, sim.psmd, pa, cpa, dob->uv, dob->orco);
+ psys_get_dupli_texture(psys, part, sim.psmd, pa, cpa, dob->uv, dob->orco);
}
}
else {
@@ -1428,7 +1431,7 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
dob= new_dupli_object(lb, ob, mat, ob->lay, counter, GS(id->name) == ID_GR ? OB_DUPLIGROUP : OB_DUPLIPARTS, animated);
copy_m4_m4(dob->omat, oldobmat);
if(G.rendering)
- psys_get_dupli_texture(par, part, sim.psmd, pa, cpa, dob->uv, dob->orco);
+ psys_get_dupli_texture(psys, part, sim.psmd, pa, cpa, dob->uv, dob->orco);
}
}
diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c
index 77d0f008c2b..2708239a4c3 100644
--- a/source/blender/blenkernel/intern/anim_sys.c
+++ b/source/blender/blenkernel/intern/anim_sys.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/anim_sys.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <string.h>
#include <stddef.h>
@@ -277,6 +282,40 @@ void BKE_animdata_make_local(AnimData *adt)
make_local_strips(&nlt->strips);
}
+
+/* When duplicating data (i.e. objects), drivers referring to the original data will
+ * get updated to point to the duplicated data (if drivers belong to the new data)
+ */
+void BKE_relink_animdata (AnimData *adt)
+{
+ /* sanity check */
+ if (adt == NULL)
+ return;
+
+ /* drivers */
+ if (adt->drivers.first) {
+ FCurve *fcu;
+
+ /* check each driver against all the base paths to see if any should go */
+ for (fcu= adt->drivers.first; fcu; fcu=fcu->next) {
+ ChannelDriver *driver= fcu->driver;
+ DriverVar *dvar;
+
+ /* driver variables */
+ for (dvar= driver->variables.first; dvar; dvar=dvar->next) {
+ /* only change the used targets, since the others will need fixing manually anyway */
+ DRIVER_TARGETS_USED_LOOPER(dvar)
+ {
+ if (dtar->id && dtar->id->newid) {
+ dtar->id= dtar->id->newid;
+ }
+ }
+ DRIVER_TARGETS_LOOPER_END
+ }
+ }
+ }
+}
+
/* Sub-ID Regrouping ------------------------------------------- */
/* helper heuristic for determining if a path is compatible with the basepath
@@ -304,7 +343,7 @@ void action_move_fcurves_by_basepath (bAction *srcAct, bAction *dstAct, const ch
if ELEM3(NULL, srcAct, dstAct, basepath) {
if (G.f & G_DEBUG) {
printf("ERROR: action_partition_fcurves_by_basepath(%p, %p, %p) has insufficient info to work with\n",
- srcAct, dstAct, basepath);
+ (void *)srcAct, (void *)dstAct, (void *)basepath);
}
return;
}
@@ -557,7 +596,7 @@ static void drivers_path_rename_fix (ID *owner_id, const char *prefix, char *old
DRIVER_TARGETS_USED_LOOPER(dvar)
{
/* rename RNA path */
- if (dtar->rna_path)
+ if (dtar->rna_path && dtar->id)
dtar->rna_path= rna_path_rename_fix(dtar->id, prefix, oldKey, newKey, dtar->rna_path, verify_paths);
/* also fix the bone-name (if applicable) */
@@ -1808,23 +1847,19 @@ void nladata_flush_channels (ListBase *channels)
/* ---------------------- */
-/* NLA Evaluation function (mostly for use through do_animdata)
- * - All channels that will be affected are not cleared anymore. Instead, we just evaluate into
- * some temp channels, where values can be accumulated in one go.
+/* NLA Evaluation function - values are calculated and stored in temporary "NlaEvalChannels"
+ * ! This is exported so that keyframing code can use this for make use of it for anim layers support
+ * > echannels: (list<NlaEvalChannels>) evaluation channels with calculated values
*/
-static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
+static void animsys_evaluate_nla (ListBase *echannels, PointerRNA *ptr, AnimData *adt, float ctime)
{
NlaTrack *nlt;
short track_index=0;
short has_strips = 0;
ListBase estrips= {NULL, NULL};
- ListBase echannels= {NULL, NULL};
NlaEvalStrip *nes;
- // TODO: need to zero out all channels used, otherwise we have problems with threadsafety
- // and also when the user jumps between different times instead of moving sequentially...
-
/* 1. get the stack of strips to evaluate at current time (influence calculated here) */
for (nlt=adt->nla_tracks.first; nlt; nlt=nlt->next, track_index++) {
/* stop here if tweaking is on and this strip is the tweaking track (it will be the first one that's 'disabled')... */
@@ -1874,7 +1909,7 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
/* action range is calculated taking F-Modifiers into account (which making new strips doesn't do due to the troublesome nature of that) */
calc_action_range(dummy_strip.act, &dummy_strip.actstart, &dummy_strip.actend, 1);
dummy_strip.start = dummy_strip.actstart;
- dummy_strip.end = (IS_EQ(dummy_strip.actstart, dummy_strip.actend)) ? (dummy_strip.actstart + 1.0f): (dummy_strip.actend);
+ dummy_strip.end = (IS_EQF(dummy_strip.actstart, dummy_strip.actend)) ? (dummy_strip.actstart + 1.0f): (dummy_strip.actend);
dummy_strip.blendmode= adt->act_blendmode;
dummy_strip.extendmode= adt->act_extendmode;
@@ -1899,13 +1934,30 @@ static void animsys_evaluate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
/* 2. for each strip, evaluate then accumulate on top of existing channels, but don't set values yet */
for (nes= estrips.first; nes; nes= nes->next)
- nlastrip_evaluate(ptr, &echannels, NULL, nes);
+ nlastrip_evaluate(ptr, echannels, NULL, nes);
+
+ /* 3. free temporary evaluation data that's not used elsewhere */
+ BLI_freelistN(&estrips);
+}
+
+/* NLA Evaluation function (mostly for use through do_animdata)
+ * - All channels that will be affected are not cleared anymore. Instead, we just evaluate into
+ * some temp channels, where values can be accumulated in one go.
+ */
+static void animsys_calculate_nla (PointerRNA *ptr, AnimData *adt, float ctime)
+{
+ ListBase echannels= {NULL, NULL};
- /* 3. flush effects of accumulating channels in NLA to the actual data they affect */
+ // TODO: need to zero out all channels used, otherwise we have problems with threadsafety
+ // and also when the user jumps between different times instead of moving sequentially...
+
+ /* evaluate the NLA stack, obtaining a set of values to flush */
+ animsys_evaluate_nla(&echannels, ptr, adt, ctime);
+
+ /* flush effects of accumulating channels in NLA to the actual data they affect */
nladata_flush_channels(&echannels);
- /* 4. free temporary evaluation data */
- BLI_freelistN(&estrips);
+ /* free temp data */
BLI_freelistN(&echannels);
}
@@ -1999,7 +2051,7 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re
/* evaluate NLA-stack
* - active action is evaluated as part of the NLA stack as the last item
*/
- animsys_evaluate_nla(&id_ptr, adt, ctime);
+ animsys_calculate_nla(&id_ptr, adt, ctime);
}
/* evaluate Active Action only */
else if (adt->action)
@@ -2041,7 +2093,7 @@ void BKE_animsys_evaluate_animdata (ID *id, AnimData *adt, float ctime, short re
void BKE_animsys_evaluate_all_animation (Main *main, float ctime)
{
ID *id;
-
+
if (G.f & G_DEBUG)
printf("Evaluate all animation - %f \n", ctime);
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index b9ff4c2a30b..6a5cc53ef23 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/armature.c
+ * \ingroup bke
+ */
+
+
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
@@ -434,7 +439,7 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
scale[1]= len_v3(pchan->pose_mat[1]);
scale[2]= len_v3(pchan->pose_mat[2]);
- if(fabs(scale[0] - scale[1]) > 1e-6f || fabs(scale[1] - scale[2]) > 1e-6f) {
+ if(fabsf(scale[0] - scale[1]) > 1e-6f || fabsf(scale[1] - scale[2]) > 1e-6f) {
unit_m4(scalemat);
scalemat[0][0]= scale[0];
scalemat[1][1]= scale[1];
@@ -730,11 +735,11 @@ static float dist_bone_deform(bPoseChannel *pchan, bPoseChanDeform *pdef_info, f
fac= distfactor_to_bone(cop, bone->arm_head, bone->arm_tail, bone->rad_head, bone->rad_tail, bone->dist);
- if (fac>0.0) {
+ if (fac > 0.0f) {
fac*=bone->weight;
contrib= fac;
- if(contrib>0.0) {
+ if(contrib > 0.0f) {
if(vec) {
if(bone->segments>1)
// applies on cop and bbonemat
@@ -1273,7 +1278,7 @@ void BKE_rotMode_change_values (float quat[4], float eul[3], float axis[3], floa
}
/* when converting to axis-angle, we need a special exception for the case when there is no axis */
- if (IS_EQ(axis[0], axis[1]) && IS_EQ(axis[1], axis[2])) {
+ if (IS_EQF(axis[0], axis[1]) && IS_EQF(axis[1], axis[2])) {
/* for now, rotate around y-axis then (so that it simply becomes the roll) */
axis[1]= 1.0f;
}
@@ -1332,7 +1337,7 @@ void vec_roll_to_mat3(float *vec, float roll, float mat[][3])
/* was 0.0000000000001, caused bug [#23954], smaller values give unstable
* roll when toggling editmode */
- if (dot_v3v3(axis,axis) > 0.00001) {
+ if (dot_v3v3(axis,axis) > 0.00001f) {
/* if nor is *not* a multiple of target ... */
normalize_v3(axis);
@@ -1375,7 +1380,7 @@ void where_is_armature_bone(Bone *bone, Bone *prevbone)
bone->length= len_v3v3(bone->head, bone->tail);
/* this is called on old file reading too... */
- if(bone->xwidth==0.0) {
+ if(bone->xwidth==0.0f) {
bone->xwidth= 0.1f;
bone->zwidth= 0.1f;
bone->segments= 1;
@@ -1966,12 +1971,12 @@ static void splineik_evaluate_bone(tSplineIK_Tree *tree, Scene *scene, Object *o
/* calculate volume preservation factor which is
* basically the inverse of the y-scaling factor
*/
- if (fabs(scaleFac) != 0.0f) {
- scale= 1.0 / fabs(scaleFac);
+ if (fabsf(scaleFac) != 0.0f) {
+ scale= 1.0f / fabsf(scaleFac);
/* we need to clamp this within sensible values */
// NOTE: these should be fine for now, but should get sanitised in future
- scale= MIN2(MAX2(scale, 0.0001) , 100000);
+ CLAMP(scale, 0.0001f, 100000.0f);
}
else
scale= 1.0f;
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index 0556acbdece..c314d476535 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/blender.c
+ * \ingroup bke
+ */
+
+
#ifndef _WIN32
#include <unistd.h> // for read close
#else
@@ -266,12 +271,11 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filename
}
/* special cases, override loaded flags: */
- if (G.f & G_DEBUG) bfd->globalf |= G_DEBUG;
- else bfd->globalf &= ~G_DEBUG;
- if (G.f & G_SWAP_EXCHANGE) bfd->globalf |= G_SWAP_EXCHANGE;
- else bfd->globalf &= ~G_SWAP_EXCHANGE;
- if (G.f & G_SCRIPT_AUTOEXEC) bfd->globalf |= G_SCRIPT_AUTOEXEC;
- else bfd->globalf &= ~G_SCRIPT_AUTOEXEC;
+ if(G.f != bfd->globalf) {
+ const int flags_keep= (G_DEBUG | G_SWAP_EXCHANGE | G_SCRIPT_AUTOEXEC | G_SCRIPT_OVERRIDE_PREF);
+ bfd->globalf= (bfd->globalf & ~flags_keep) | (G.f & flags_keep);
+ }
+
G.f= bfd->globalf;
@@ -348,20 +352,20 @@ void BKE_userdef_free(void)
int BKE_read_file(bContext *C, const char *dir, ReportList *reports)
{
BlendFileData *bfd;
- int retval= 1;
+ int retval= BKE_READ_FILE_OK;
if(strstr(dir, BLENDER_STARTUP_FILE)==NULL) /* dont print user-pref loading */
printf("read blend: %s\n", dir);
bfd= BLO_read_from_file(dir, reports);
if (bfd) {
- if(bfd->user) retval= 2;
+ if(bfd->user) retval= BKE_READ_FILE_OK_USERPREFS;
if(0==handle_subversion_warning(bfd->main)) {
free_main(bfd->main);
MEM_freeN(bfd);
bfd= NULL;
- retval= 0;
+ retval= BKE_READ_FILE_FAIL;
}
else
setup_app_data(C, bfd, dir); // frees BFD
@@ -369,7 +373,7 @@ int BKE_read_file(bContext *C, const char *dir, ReportList *reports)
else
BKE_reports_prependf(reports, "Loading %s failed: ", dir);
- return (bfd?retval:0);
+ return (bfd?retval:BKE_READ_FILE_FAIL);
}
int BKE_read_file_from_memory(bContext *C, char* filebuf, int filelength, ReportList *reports)
@@ -464,7 +468,7 @@ static int read_undosave(bContext *C, UndoElem *uel)
if(success) {
/* important not to update time here, else non keyed tranforms are lost */
- DAG_on_load_update(G.main, FALSE);
+ DAG_on_visible_update(G.main, FALSE);
}
return success;
diff --git a/source/blender/blenkernel/intern/bmesh_private.h b/source/blender/blenkernel/intern/bmesh_private.h
index b14383378ab..d2b1d9fd566 100644
--- a/source/blender/blenkernel/intern/bmesh_private.h
+++ b/source/blender/blenkernel/intern/bmesh_private.h
@@ -34,6 +34,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/bmesh_private.h
+ * \ingroup bke
+ */
+
+
#ifndef BMESH_PRIVATE
#define BMESH_PRIVATE
diff --git a/source/blender/blenkernel/intern/bmfont.c b/source/blender/blenkernel/intern/bmfont.c
index 1d4bdf8bf44..6b1f313d88d 100644
--- a/source/blender/blenkernel/intern/bmfont.c
+++ b/source/blender/blenkernel/intern/bmfont.c
@@ -32,6 +32,11 @@
*
*/
+/** \file blender/blenkernel/intern/bmfont.c
+ * \ingroup bke
+ */
+
+
/**
* Two external functions:
*
diff --git a/source/blender/blenkernel/intern/boids.c b/source/blender/blenkernel/intern/boids.c
index ae4882b0eca..11ea3384c96 100644
--- a/source/blender/blenkernel/intern/boids.c
+++ b/source/blender/blenkernel/intern/boids.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/boids.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <math.h>
@@ -208,10 +213,8 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *
sub_v3_v3v3(ray_dir, col.co2, col.co1);
mul_v3_fl(ray_dir, acbr->look_ahead);
col.f = 0.0f;
- col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f);
- col.dfra = bbd->dfra;
hit.index = -1;
- hit.dist = col.ray_len = len_v3(ray_dir);
+ hit.dist = col.original_ray_length = len_v3(ray_dir);
/* find out closest deflector object */
for(coll = bbd->sim->colliders->first; coll; coll=coll->next) {
@@ -219,18 +222,18 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *
if(coll->ob == bpa->ground)
continue;
- col.ob = coll->ob;
+ col.current = coll->ob;
col.md = coll->collmd;
if(col.md && col.md->bvhtree)
- BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col);
+ BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, BKE_psys_collision_neartest_cb, &col);
}
/* then avoid that object */
if(hit.index>=0) {
- t = hit.dist/col.ray_len;
+ t = hit.dist/col.original_ray_length;
/* avoid head-on collision */
- if(dot_v3v3(col.nor, pa->prev_state.ave) < -0.99) {
+ if(dot_v3v3(col.pce.nor, pa->prev_state.ave) < -0.99f) {
/* don't know why, but uneven range [0.0,1.0] */
/* works much better than even [-1.0,1.0] */
bbd->wanted_co[0] = BLI_frand();
@@ -238,7 +241,7 @@ static int rule_avoid_collision(BoidRule *rule, BoidBrainData *bbd, BoidValues *
bbd->wanted_co[2] = BLI_frand();
}
else {
- VECCOPY(bbd->wanted_co, col.nor);
+ copy_v3_v3(bbd->wanted_co, col.pce.nor);
}
mul_v3_fl(bbd->wanted_co, (1.0f - t) * val->personal_space * pa->size);
@@ -436,7 +439,7 @@ static int rule_follow_leader(BoidRule *rule, BoidBrainData *bbd, BoidValues *va
mul = dot_v3v3(vec, vec);
/* leader is not moving */
- if(mul < 0.01) {
+ if(mul < 0.01f) {
len = len_v3(loc);
/* too close to leader */
if(len < 2.0f * val->personal_space * pa->size) {
@@ -473,7 +476,7 @@ static int rule_follow_leader(BoidRule *rule, BoidBrainData *bbd, BoidValues *va
else {
VECCOPY(loc, flbr->oloc);
sub_v3_v3v3(vec, flbr->loc, flbr->oloc);
- mul_v3_fl(vec, 1.0/bbd->timestep);
+ mul_v3_fl(vec, 1.0f/bbd->timestep);
}
/* fac is seconds behind leader */
@@ -496,7 +499,7 @@ static int rule_follow_leader(BoidRule *rule, BoidBrainData *bbd, BoidValues *va
mul = dot_v3v3(vec, vec);
/* leader is not moving */
- if(mul < 0.01) {
+ if(mul < 0.01f) {
len = len_v3(loc);
/* too close to leader */
if(len < 2.0f * val->personal_space * pa->size) {
@@ -727,7 +730,7 @@ static void set_boid_values(BoidValues *val, BoidSettings *boids, ParticleData *
if(ELEM(bpa->data.mode, eBoidMode_OnLand, eBoidMode_Climbing)) {
val->max_speed = boids->land_max_speed * bpa->data.health/boids->health;
val->max_acc = boids->land_max_acc * val->max_speed;
- val->max_ave = boids->land_max_ave * M_PI * bpa->data.health/boids->health;
+ val->max_ave = boids->land_max_ave * (float)M_PI * bpa->data.health/boids->health;
val->min_speed = 0.0f; /* no minimum speed on land */
val->personal_space = boids->land_personal_space;
val->jump_speed = boids->land_jump_speed * bpa->data.health/boids->health;
@@ -735,7 +738,7 @@ static void set_boid_values(BoidValues *val, BoidSettings *boids, ParticleData *
else {
val->max_speed = boids->air_max_speed * bpa->data.health/boids->health;
val->max_acc = boids->air_max_acc * val->max_speed;
- val->max_ave = boids->air_max_ave * M_PI * bpa->data.health/boids->health;
+ val->max_ave = boids->air_max_ave * (float)M_PI * bpa->data.health/boids->health;
val->min_speed = boids->air_min_speed * boids->air_max_speed;
val->personal_space = boids->air_personal_space;
val->jump_speed = 0.0f; /* no jumping in air */
@@ -774,27 +777,26 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro
/* first try to find below boid */
copy_v3_v3(col.co1, pa->state.co);
sub_v3_v3v3(col.co2, pa->state.co, zvec);
- sub_v3_v3(col.co2, zvec);
sub_v3_v3v3(ray_dir, col.co2, col.co1);
col.f = 0.0f;
- col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f);
- col.dfra = bbd->dfra;
hit.index = -1;
- hit.dist = col.ray_len = len_v3(ray_dir);
+ hit.dist = col.original_ray_length = len_v3(ray_dir);
+ col.pce.inside = 0;
for(coll = bbd->sim->colliders->first; coll; coll = coll->next){
- col.ob = coll->ob;
+ col.current = coll->ob;
col.md = coll->collmd;
+ col.fac1 = col.fac2 = 0.f;
if(col.md && col.md->bvhtree)
- BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col);
+ BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, BKE_psys_collision_neartest_cb, &col);
}
/* then use that object */
if(hit.index>=0) {
- t = hit.dist/col.ray_len;
+ t = hit.dist/col.original_ray_length;
interp_v3_v3v3(ground_co, col.co1, col.co2, t);
- normalize_v3_v3(ground_nor, col.nor);
- return col.hit_ob;
+ normalize_v3_v3(ground_nor, col.pce.nor);
+ return col.hit;
}
/* couldn't find below, so find upmost deflector object */
@@ -803,24 +805,22 @@ static Object *boid_find_ground(BoidBrainData *bbd, ParticleData *pa, float *gro
sub_v3_v3(col.co2, zvec);
sub_v3_v3v3(ray_dir, col.co2, col.co1);
col.f = 0.0f;
- col.cfra = fmod(bbd->cfra-bbd->dfra, 1.0f);
- col.dfra = bbd->dfra;
hit.index = -1;
- hit.dist = col.ray_len = len_v3(ray_dir);
+ hit.dist = col.original_ray_length = len_v3(ray_dir);
for(coll = bbd->sim->colliders->first; coll; coll = coll->next){
- col.ob = coll->ob;
+ col.current = coll->ob;
col.md = coll->collmd;
if(col.md && col.md->bvhtree)
- BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col);
+ BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, BKE_psys_collision_neartest_cb, &col);
}
/* then use that object */
if(hit.index>=0) {
- t = hit.dist/col.ray_len;
+ t = hit.dist/col.original_ray_length;
interp_v3_v3v3(ground_co, col.co1, col.co2, t);
- normalize_v3_v3(ground_nor, col.nor);
- return col.hit_ob;
+ normalize_v3_v3(ground_nor, col.pce.nor);
+ return col.hit;
}
/* default to z=0 */
@@ -872,7 +872,7 @@ static void boid_climb(BoidSettings *boids, ParticleData *pa, float *surface_co,
VECCOPY(nor, surface_nor);
/* gather apparent gravity */
- VECADDFAC(bpa->gravity, bpa->gravity, surface_nor, -1.0);
+ VECADDFAC(bpa->gravity, bpa->gravity, surface_nor, -1.0f);
normalize_v3(bpa->gravity);
/* raise boid it's size from surface */
@@ -1010,7 +1010,7 @@ void boid_brain(BoidBrainData *bbd, int p, ParticleData *pa)
/* decide on jumping & liftoff */
if(bpa->data.mode == eBoidMode_OnLand) {
/* fuzziness makes boids capable of misjudgement */
- float mul = 1.0 + state->rule_fuzziness;
+ float mul = 1.0f + state->rule_fuzziness;
if(boids->options & BOID_ALLOW_FLIGHT && bbd->wanted_co[2] > 0.0f) {
float cvel[3], dir[3];
@@ -1021,7 +1021,7 @@ void boid_brain(BoidBrainData *bbd, int p, ParticleData *pa)
VECCOPY(cvel, bbd->wanted_co);
normalize_v2(cvel);
- if(dot_v2v2(cvel, dir) > 0.95 / mul)
+ if(dot_v2v2(cvel, dir) > 0.95f / mul)
bpa->data.mode = eBoidMode_Liftoff;
}
else if(val.jump_speed > 0.0f) {
@@ -1129,7 +1129,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
bpa->ground = boid_find_ground(bbd, pa, ground_co, ground_nor);
/* level = how many particle sizes above ground */
- level = (pa->prev_state.co[2] - ground_co[2])/(2.0f * pa->size) - 0.5;
+ level = (pa->prev_state.co[2] - ground_co[2])/(2.0f * pa->size) - 0.5f;
landing_level = - boids->landing_smoothness * pa->prev_state.vel[2] * pa_mass;
@@ -1328,7 +1328,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
boid_climb(boids, pa, ground_co, ground_nor);
}
/* land boid when really near ground */
- else if(pa->state.co[2] <= ground_co[2] + 1.01 * pa->size * boids->height){
+ else if(pa->state.co[2] <= ground_co[2] + 1.01f * pa->size * boids->height){
pa->state.co[2] = ground_co[2] + pa->size * boids->height;
pa->state.vel[2] = 0.0f;
bpa->data.mode = eBoidMode_OnLand;
@@ -1370,7 +1370,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
boid_climb(boids, pa, ground_co, ground_nor);
}
/* ground is too far away so boid falls */
- else if(pa->state.co[2]-ground_co[2] > 1.1 * pa->size * boids->height)
+ else if(pa->state.co[2]-ground_co[2] > 1.1f * pa->size * boids->height)
bpa->data.mode = eBoidMode_Falling;
else {
/* constrain to surface */
@@ -1402,7 +1402,7 @@ void boid_body(BoidBrainData *bbd, ParticleData *pa)
/* save direction to state.ave unless the boid is falling */
/* (boids can't effect their direction when falling) */
- if(bpa->data.mode!=eBoidMode_Falling && len_v3(pa->state.vel) > 0.1*pa->size) {
+ if(bpa->data.mode!=eBoidMode_Falling && len_v3(pa->state.vel) > 0.1f*pa->size) {
copy_v3_v3(pa->state.ave, pa->state.vel);
pa->state.ave[2] *= bbd->part->boids->pitch;
normalize_v3(pa->state.ave);
diff --git a/source/blender/blenkernel/intern/booleanops_mesh.c b/source/blender/blenkernel/intern/booleanops_mesh.c
index dd595fc98b6..4e8a3b33827 100644
--- a/source/blender/blenkernel/intern/booleanops_mesh.c
+++ b/source/blender/blenkernel/intern/booleanops_mesh.c
@@ -1,6 +1,6 @@
#if 0
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -28,6 +28,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenkernel/intern/booleanops_mesh.c
+ * \ingroup bke
+ */
+
#include "CSG_BooleanOps.h"
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 15404acc105..96b6ec357f9 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/brush.c
+ * \ingroup bke
+ */
+
+
#include <math.h>
#include <string.h>
@@ -588,7 +593,7 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int bufsize, ImBuf
dst[2]= FTOCHAR(rgba[2]);
dst[3]= FTOCHAR(rgba[3]);
}
- else {
+ else if (texfall == 2) {
dist = sqrt(xy[0]*xy[0] + xy[1]*xy[1]);
brush_sample_tex(brush, xy, rgba, 0);
@@ -596,6 +601,14 @@ void brush_imbuf_new(Brush *brush, short flt, short texfall, int bufsize, ImBuf
dst[1] = FTOCHAR(rgba[1]*brush->rgb[1]);
dst[2] = FTOCHAR(rgba[2]*brush->rgb[2]);
dst[3] = FTOCHAR(rgba[3]*alpha*brush_curve_strength_clamp(brush, dist, radius));
+ } else {
+ dist = sqrt(xy[0]*xy[0] + xy[1]*xy[1]);
+
+ brush_sample_tex(brush, xy, rgba, 0);
+ dst[0]= crgb[0];
+ dst[1]= crgb[1];
+ dst[2]= crgb[2];
+ dst[3] = FTOCHAR(rgba[3]*alpha*brush_curve_strength_clamp(brush, dist, radius));
}
}
}
@@ -719,6 +732,12 @@ static void brush_painter_do_partial(BrushPainter *painter, ImBuf *oldtexibuf, i
dotexold = (oldtexibuf != NULL);
+ /* not sure if it's actually needed or it's a mistake in coords/sizes
+ calculation in brush_painter_fixed_tex_partial_update(), but without this
+ limitation memory gets corrupted at fast strokes with quite big spacing (sergey) */
+ w = MIN2(w, ibuf->x);
+ h = MIN2(h, ibuf->y);
+
if (painter->cache.flt) {
for (; y < h; y++) {
bf = ibuf->rect_float + (y*ibuf->x + origx)*4;
@@ -865,11 +884,8 @@ static void brush_painter_refresh_cache(BrushPainter *painter, float *pos)
flt= cache->flt;
size= (cache->size)? cache->size: diameter;
- if (!(mtex && mtex->tex) || (mtex->tex->type==0)) {
- brush_imbuf_new(brush, flt, 0, size, &cache->ibuf);
- }
- else if (brush->flag & BRUSH_FIXED_TEX) {
- brush_imbuf_new(brush, flt, 0, size, &cache->maskibuf);
+ if (brush->flag & BRUSH_FIXED_TEX) {
+ brush_imbuf_new(brush, flt, 3, size, &cache->maskibuf);
brush_painter_fixed_tex_partial_update(painter, pos);
}
else
@@ -896,13 +912,13 @@ void brush_painter_break_stroke(BrushPainter *painter)
static void brush_apply_pressure(BrushPainter *painter, Brush *brush, float pressure)
{
if (brush_use_alpha_pressure(brush))
- brush_set_alpha(brush, MAX2(0.0, painter->startalpha*pressure));
+ brush_set_alpha(brush, MAX2(0.0f, painter->startalpha*pressure));
if (brush_use_size_pressure(brush))
- brush_set_size(brush, MAX2(1.0, painter->startsize*pressure));
+ brush_set_size(brush, MAX2(1.0f, painter->startsize*pressure));
if (brush->flag & BRUSH_JITTER_PRESSURE)
- brush->jitter = MAX2(0.0, painter->startjitter*pressure);
+ brush->jitter = MAX2(0.0f, painter->startjitter*pressure);
if (brush->flag & BRUSH_SPACING_PRESSURE)
- brush->spacing = MAX2(1.0, painter->startspacing*(1.5f-pressure));
+ brush->spacing = MAX2(1.0f, painter->startspacing*(1.5f-pressure));
}
void brush_jitter_pos(Brush *brush, float *pos, float *jitterpos)
@@ -1008,29 +1024,42 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
len= normalize_v2(dmousepos);
painter->accumdistance += len;
- /* do paint op over unpainted distance */
- while ((len > 0.0f) && (painter->accumdistance >= spacing)) {
- step= spacing - startdistance;
- paintpos[0]= painter->lastmousepos[0] + dmousepos[0]*step;
- paintpos[1]= painter->lastmousepos[1] + dmousepos[1]*step;
+ if (brush->flag & BRUSH_SPACE) {
+ /* do paint op over unpainted distance */
+ while ((len > 0.0f) && (painter->accumdistance >= spacing)) {
+ step= spacing - startdistance;
+ paintpos[0]= painter->lastmousepos[0] + dmousepos[0]*step;
+ paintpos[1]= painter->lastmousepos[1] + dmousepos[1]*step;
+
+ t = step/len;
+ press= (1.0f-t)*painter->lastpressure + t*pressure;
+ brush_apply_pressure(painter, brush, press);
+ spacing= MAX2(1.0f, radius)*brush->spacing*0.01f;
+
+ brush_jitter_pos(brush, paintpos, finalpos);
+
+ if (painter->cache.enabled)
+ brush_painter_refresh_cache(painter, finalpos);
- t = step/len;
- press= (1.0f-t)*painter->lastpressure + t*pressure;
- brush_apply_pressure(painter, brush, press);
- spacing= MAX2(1.0f, radius)*brush->spacing*0.01f;
+ totpaintops +=
+ func(user, painter->cache.ibuf, painter->lastpaintpos, finalpos);
- brush_jitter_pos(brush, paintpos, finalpos);
+ painter->lastpaintpos[0]= paintpos[0];
+ painter->lastpaintpos[1]= paintpos[1];
+ painter->accumdistance -= spacing;
+ startdistance -= spacing;
+ }
+ } else {
+ brush_jitter_pos(brush, pos, finalpos);
if (painter->cache.enabled)
brush_painter_refresh_cache(painter, finalpos);
- totpaintops +=
- func(user, painter->cache.ibuf, painter->lastpaintpos, finalpos);
+ totpaintops += func(user, painter->cache.ibuf, pos, finalpos);
- painter->lastpaintpos[0]= paintpos[0];
- painter->lastpaintpos[1]= paintpos[1];
- painter->accumdistance -= spacing;
- startdistance -= spacing;
+ painter->lastpaintpos[0]= pos[0];
+ painter->lastpaintpos[1]= pos[1];
+ painter->accumdistance= 0;
}
/* do airbrush paint ops, based on the number of paint ops left over
@@ -1046,7 +1075,7 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
else
painter->accumtime -= painttime;
- while (painter->accumtime >= brush->rate) {
+ while (painter->accumtime >= (double)brush->rate) {
brush_apply_pressure(painter, brush, pressure);
brush_jitter_pos(brush, pos, finalpos);
@@ -1056,7 +1085,7 @@ int brush_painter_paint(BrushPainter *painter, BrushFunc func, float *pos, doubl
totpaintops +=
func(user, painter->cache.ibuf, painter->lastmousepos, finalpos);
- painter->accumtime -= brush->rate;
+ painter->accumtime -= (double)brush->rate;
}
painter->lasttime= curtime;
@@ -1082,7 +1111,7 @@ float brush_curve_strength_clamp(Brush *br, float p, const float len)
else p= p/len;
p= curvemapping_evaluateF(br->curve, 0, p);
- if(p < 0.0) p= 0.0f;
+ if(p < 0.0f) p= 0.0f;
else if(p > 1.0f) p= 1.0f;
return p;
}
@@ -1129,10 +1158,10 @@ unsigned int *brush_gen_texture_cache(Brush *br, int half_side)
* if the texture didn't give an RGB value, copy the intensity across
*/
if(hasrgb & TEX_RGB)
- texres.tin = (0.35 * texres.tr + 0.45 *
- texres.tg + 0.2 * texres.tb);
+ texres.tin = (0.35f * texres.tr + 0.45f *
+ texres.tg + 0.2f * texres.tb);
- texres.tin = texres.tin * 255.0;
+ texres.tin = texres.tin * 255.0f;
((char*)texcache)[(iy*side+ix)*4] = (char)texres.tin;
((char*)texcache)[(iy*side+ix)*4+1] = (char)texres.tin;
((char*)texcache)[(iy*side+ix)*4+2] = (char)texres.tin;
@@ -1181,7 +1210,7 @@ static struct ImBuf *brush_gen_radial_control_imbuf(Brush *br)
void brush_radial_control_invoke(wmOperator *op, Brush *br, float size_weight)
{
- int mode = RNA_int_get(op->ptr, "mode");
+ int mode = RNA_enum_get(op->ptr, "mode");
float original_value= 0;
if(mode == WM_RADIALCONTROL_SIZE)
@@ -1200,7 +1229,7 @@ void brush_radial_control_invoke(wmOperator *op, Brush *br, float size_weight)
int brush_radial_control_exec(wmOperator *op, Brush *br, float size_weight)
{
- int mode = RNA_int_get(op->ptr, "mode");
+ int mode = RNA_enum_get(op->ptr, "mode");
float new_value = RNA_float_get(op->ptr, "new_value");
const float conv = 0.017453293;
diff --git a/source/blender/blenkernel/intern/bullet.c b/source/blender/blenkernel/intern/bullet.c
index 238d3e7f682..72f5e907800 100644
--- a/source/blender/blenkernel/intern/bullet.c
+++ b/source/blender/blenkernel/intern/bullet.c
@@ -28,6 +28,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/bullet.c
+ * \ingroup bke
+ */
+
+
#include "MEM_guardedalloc.h"
/* types */
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index 1a5458323d8..941f377ab42 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -27,6 +27,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenkernel/intern/bvhutils.c
+ * \ingroup bke
+ */
+
#include <stdio.h>
#include <string.h>
#include <math.h>
@@ -126,7 +131,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const
}
else
{
- if(fabs(A00) > FLT_EPSILON)
+ if(fabsf(A00) > FLT_EPSILON)
S = -B0/A00;
else
S = 0.0f;
@@ -151,7 +156,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const
}
else
{
- if(fabs(A11) > FLT_EPSILON)
+ if(fabsf(A11) > FLT_EPSILON)
T = -B1 / A11;
else
T = 0.0f;
@@ -177,7 +182,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const
}
else
{
- if(fabs(A11) > FLT_EPSILON)
+ if(fabsf(A11) > FLT_EPSILON)
T = -B1 / A11;
else
T = 0.0;
@@ -203,7 +208,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const
}
else
{
- if(fabs(A00) > FLT_EPSILON)
+ if(fabsf(A00) > FLT_EPSILON)
S = -B0 / A00;
else
S = 0.0f;
@@ -215,7 +220,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const
{
// Minimum at interior lv
float invDet;
- if(fabs(Det) > FLT_EPSILON)
+ if(fabsf(Det) > FLT_EPSILON)
invDet = 1.0f / Det;
else
invDet = 0.0f;
@@ -246,7 +251,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const
}
else
{
- if(fabs(denom) > FLT_EPSILON)
+ if(fabsf(denom) > FLT_EPSILON)
S = numer / denom;
else
S = 0.0f;
@@ -273,7 +278,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const
}
else
{
- if(fabs(A11) > FLT_EPSILON)
+ if(fabsf(A11) > FLT_EPSILON)
T = -B1 / A11;
else
T = 0.0f;
@@ -299,7 +304,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const
}
else
{
- if(fabs(denom) > FLT_EPSILON)
+ if(fabsf(denom) > FLT_EPSILON)
T = numer / denom;
else
T = 0.0f;
@@ -326,7 +331,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const
}
else
{
- if(fabs(A00) > FLT_EPSILON)
+ if(fabsf(A00) > FLT_EPSILON)
S = -B0 / A00;
else
S = 0.0f;
@@ -357,7 +362,7 @@ static float nearest_point_in_tri_surface(const float *v0,const float *v1,const
}
else
{
- if(fabs(denom) > FLT_EPSILON)
+ if(fabsf(denom) > FLT_EPSILON)
S = numer / denom;
else
S = 0.0f;
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 8c22ea02ce6..cba4053ad3a 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -30,7 +30,12 @@
*
* BKE_cdderivedmesh.h contains the function prototypes for this file.
*
-*/
+*/
+
+/** \file blender/blenkernel/intern/cdderivedmesh.c
+ * \ingroup bke
+ */
+
/* TODO maybe BIF_gl.h should include string.h? */
#include <string.h>
@@ -1684,9 +1689,7 @@ DerivedMesh *disabled__CDDM_from_editmesh(EditMesh *em, Mesh *UNUSED(me))
VECCOPY(mv->co, eve->co);
- mv->no[0] = eve->no[0] * 32767.0;
- mv->no[1] = eve->no[1] * 32767.0;
- mv->no[2] = eve->no[2] * 32767.0;
+ normal_float_to_short_v3(mv->no, eve->no);
mv->bweight = (unsigned char) (eve->bweight * 255.0f);
mv->flag = 0;
@@ -1749,15 +1752,17 @@ DerivedMesh *CDDM_from_curve_customDB(Object *ob, ListBase *dispbase)
MVert *allvert;
MEdge *alledge;
MFace *allface;
- int totvert, totedge, totface;
+ MLoop *allloop;
+ MPoly *allpoly;
+ int totvert, totedge, totface, totloop, totpoly;
if (nurbs_to_mdata_customdb(ob, dispbase, &allvert, &totvert, &alledge,
- &totedge, &allface, &totface) != 0) {
+ &totedge, &allface, &allloop, &allpoly, &totface, &totloop, &totpoly) != 0) {
/* Error initializing mdata. This often happens when curve is empty */
return CDDM_new(0, 0, 0, 0, 0);
}
- dm = CDDM_new(totvert, totedge, totface, totface*4, totface);
+ dm = CDDM_new(totvert, totedge, totface, totloop, totpoly);
dm->deformedOnly = 1;
cddm = (CDDerivedMesh*)dm;
@@ -1765,10 +1770,14 @@ DerivedMesh *CDDM_from_curve_customDB(Object *ob, ListBase *dispbase)
memcpy(cddm->mvert, allvert, totvert*sizeof(MVert));
memcpy(cddm->medge, alledge, totedge*sizeof(MEdge));
memcpy(cddm->mface, allface, totface*sizeof(MFace));
+ memcpy(cddm->mloop, allloop, totloop*sizeof(MLoop));
+ memcpy(cddm->mpoly, allpoly, totpoly*sizeof(MPoly));
MEM_freeN(allvert);
MEM_freeN(alledge);
MEM_freeN(allface);
+ MEM_freeN(allloop);
+ MEM_freeN(allpoly);
return dm;
}
@@ -2227,73 +2236,27 @@ void CDDM_apply_vert_normals(DerivedMesh *dm, short (*vertNormals)[3])
void CDDM_calc_normals(DerivedMesh *dm)
{
CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
- float (*temp_nors)[3];
- float (*face_nors)[3];
- float (*vert_nors)[3];
- int i, j, *origIndex;
- int numVerts = dm->numVertData;
- int numFaces = dm->numFaceData;
- MFace *mf;
- MPoly *mp;
- MVert *mv;
- MLoop *ml;
-
- if(numVerts == 0) return;
-
- if (CustomData_has_layer(&dm->faceData, CD_NORMAL))
- CustomData_free_layer(&dm->faceData, CD_NORMAL, dm->numFaceData, 0);
+ float (*face_nors)[3] = NULL;
+
+ if(dm->numVertData == 0) return;
- /*recalc tesselation to ensure we have valid origindex values
- for mface->mpoly lookups.*/
+ /* we don't want to overwrite any referenced layers */
+ cddm->mvert = CustomData_duplicate_referenced_layer(&dm->vertData, CD_MVERT);
+
+ /*set tesselation origindex values to map to poly indices, rather then poly
+ poly origindex values*/
cdDM_recalcTesselation2(dm);
-
- numFaces = dm->numFaceData;
-
- /*first go through and calculate normals for all the polys*/
- temp_nors = MEM_callocN(sizeof(float)*3*dm->numPolyData, "temp_nors cdderivedmesh.c");
- vert_nors = MEM_callocN(sizeof(float)*3*dm->numVertData, "vert_nors cdderivedmesh.c");
- mp = cddm->mpoly;
- for (i=0; i<dm->numPolyData; i++, mp++) {
- mesh_calc_poly_normal(mp, cddm->mloop+mp->loopstart, cddm->mvert, temp_nors[i]);
-
- ml = cddm->mloop + mp->loopstart;
- for (j=0; j<mp->totloop; j++, ml++) {
- VECADD(vert_nors[ml->v], vert_nors[ml->v], temp_nors[i]);
- }
- }
-
- face_nors = MEM_callocN(sizeof(float)*3*dm->numFaceData, "face_nors cdderivedmesh.c");
- origIndex = CustomData_get_layer(&dm->faceData, CD_ORIGINDEX);
-
- mf = cddm->mface;
- for (i=0; i<dm->numFaceData; i++, mf++, origIndex++) {
- VECCOPY(face_nors[i], temp_nors[*origIndex]);
- }
-
- mv = cddm->mvert;
- for (i=0; i<dm->numVertData; i++, mv++) {
- float *no = vert_nors[i];
-
- if (normalize_v3(no) == 0.0) {
- VECCOPY(no, mv->co);
- if (normalize_v3(no) == 0.0) {
- no[0] = 0.0f;
- no[1] = 0.0f;
- no[2] = 1.0f;
- }
- }
-
- normal_float_to_short_v3(mv->no, no);
- }
-
- MEM_freeN(temp_nors);
- MEM_freeN(vert_nors);
-
- /*this restores original poly origindex -> tessface origindex mapping,
- instead of the poly index -> tessface origindex one we generated
- with cdDM_recalcTesselation2*/
+ face_nors = MEM_mallocN(sizeof(float)*3*dm->numFaceData, "face_nors");
+
+ /* calculate face normals */
+ mesh_calc_normals(cddm->mvert, dm->numVertData, CDDM_get_loops(dm), CDDM_get_polys(dm),
+ dm->numLoopData, dm->numPolyData, NULL, cddm->mface, dm->numFaceData,
+ CustomData_get_layer(&dm->faceData, CD_ORIGINDEX), face_nors);
+
+ /*restore tesselation origindex indices to poly origindex indices*/
cdDM_recalcTesselation(dm);
+
CustomData_add_layer(&dm->faceData, CD_NORMAL, CD_ASSIGN,
face_nors, dm->numFaceData);
}
@@ -2433,7 +2396,7 @@ DerivedMesh *CDDM_merge_verts(DerivedMesh *dm, int *vtargetmap)
}
/*create new cddm*/
- cddm2 = (CDDerivedMesh*) CDDM_from_template(cddm, BLI_array_count(mvert), BLI_array_count(medge), 0, BLI_array_count(mloop), BLI_array_count(mpoly));
+ cddm2 = (CDDerivedMesh*) CDDM_from_template((DerivedMesh*)cddm, BLI_array_count(mvert), BLI_array_count(medge), 0, BLI_array_count(mloop), BLI_array_count(mpoly));
/*update edge indices and copy customdata*/
me = medge;
@@ -2476,7 +2439,7 @@ DerivedMesh *CDDM_merge_verts(DerivedMesh *dm, int *vtargetmap)
memcpy(cddm2->mpoly, mpoly, sizeof(MPoly)*BLI_array_count(mpoly));
BLI_array_free(mvert); BLI_array_free(medge); BLI_array_free(mloop); BLI_array_free(mpoly);
- CDDM_recalc_tesselation(cddm2, 1);
+ CDDM_recalc_tesselation((DerivedMesh*)cddm2, 1);
if (newv)
MEM_freeN(newv);
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index c115f6aa470..9fabf1d52cf 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/cloth.c
+ * \ingroup bke
+ */
+
+
#include "MEM_guardedalloc.h"
#include "DNA_cloth_types.h"
diff --git a/source/blender/blenkernel/intern/collision.c b/source/blender/blenkernel/intern/collision.c
index 623ba26e86d..88b6ca296c7 100644
--- a/source/blender/blenkernel/intern/collision.c
+++ b/source/blender/blenkernel/intern/collision.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/collision.c
+ * \ingroup bke
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BKE_cloth.h"
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index 7cf6b21e2f1..46f3e124bcc 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -27,6 +27,11 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/colortools.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <math.h>
#include <stdlib.h>
@@ -416,14 +421,14 @@ static void calchandle_curvemap(BezTriple *bezt, BezTriple *prev, BezTriple *nex
}
if(bezt->h1==HD_VECT) { /* vector */
- dx/=3.0;
- dy/=3.0;
+ dx/=3.0f;
+ dy/=3.0f;
*(p2-3)= *p2-dx;
*(p2-2)= *(p2+1)-dy;
}
if(bezt->h2==HD_VECT) {
- dx1/=3.0;
- dy1/=3.0;
+ dx1/=3.0f;
+ dy1/=3.0f;
*(p2+3)= *p2+dx1;
*(p2+4)= *(p2+1)+dy1;
}
@@ -695,7 +700,7 @@ void curvemapping_changed(CurveMapping *cumap, int rem_doubles)
for(a=0; a<cuma->totpoint-1; a++) {
dx= cmp[a].x - cmp[a+1].x;
dy= cmp[a].y - cmp[a+1].y;
- if( sqrt(dx*dx + dy*dy) < thresh ) {
+ if( sqrtf(dx*dx + dy*dy) < thresh ) {
if(a==0) {
cmp[a+1].flag|= 2;
if(cmp[a+1].flag & CUMA_SELECT)
@@ -957,7 +962,7 @@ void curvemapping_table_RGBA(CurveMapping *cumap, float **array, int *size)
DO_INLINE int get_bin_float(float f)
{
- int bin= (int)((f*255) + 0.5); /* 0.5 to prevent quantisation differences */
+ int bin= (int)((f*255.0f) + 0.5f); /* 0.5 to prevent quantisation differences */
/* note: clamp integer instead of float to avoid problems with NaN */
CLAMP(bin, 0, 255);
@@ -1049,7 +1054,7 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
bin_lum = MEM_callocN(256 * sizeof(unsigned int), "temp historgram bins");
/* convert to number of lines with logarithmic scale */
- scopes->sample_lines = (scopes->accuracy*0.01) * (scopes->accuracy*0.01) * ibuf->y;
+ scopes->sample_lines = (scopes->accuracy*0.01f) * (scopes->accuracy*0.01f) * ibuf->y;
if (scopes->sample_full)
scopes->sample_lines = ibuf->y;
@@ -1100,7 +1105,7 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
}
/* we still need luma for histogram */
- luma = 0.299*rgb[0] + 0.587*rgb[1] + 0.114 * rgb[2];
+ luma = 0.299f * rgb[0] + 0.587f * rgb[1] + 0.114f * rgb[2];
/* check for min max */
if(ycc_mode == -1 ) {
@@ -1150,8 +1155,8 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, int use_color_management)
if (bin_lum[x] > nl)
nl = bin_lum[x];
}
- div = 1.f/(double)n;
- divl = 1.f/(double)nl;
+ div = 1.0/(double)n;
+ divl = 1.0/(double)nl;
for (x=0; x<256; x++) {
scopes->hist.data_r[x] = bin_r[x] * div;
scopes->hist.data_g[x] = bin_g[x] * div;
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 2527831319e..7956da5da80 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/constraint.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <stddef.h>
#include <string.h>
@@ -618,7 +623,7 @@ static void constraint_target_to_mat4 (Scene *scene, Object *ob, const char *sub
* PoseChannel by the Armature Object's Matrix to get a worldspace
* matrix.
*/
- if (headtail < 0.000001) {
+ if (headtail < 0.000001f) {
/* skip length interpolation if set to head */
mul_m4_m4m4(mat, pchan->pose_mat, ob->obmat);
}
@@ -991,10 +996,10 @@ static void vectomat (float *vec, float *target_up, short axis, short upflag, sh
float neg = -1;
int right_index;
- if (normalize_v3_v3(n, vec) == 0.0) {
- n[0] = 0.0;
- n[1] = 0.0;
- n[2] = 1.0;
+ if (normalize_v3_v3(n, vec) == 0.0f) {
+ n[0] = 0.0f;
+ n[1] = 0.0f;
+ n[2] = 1.0f;
}
if (axis > 2) axis -= 3;
else negate_v3(n);
@@ -1016,10 +1021,10 @@ static void vectomat (float *vec, float *target_up, short axis, short upflag, sh
sub_v3_v3v3(proj, u, proj); /* then onto the plane */
/* proj specifies the transformation of the up axis */
- if (normalize_v3(proj) == 0.0) { /* degenerate projection */
- proj[0] = 0.0;
- proj[1] = 1.0;
- proj[2] = 0.0;
+ if (normalize_v3(proj) == 0.0f) { /* degenerate projection */
+ proj[0] = 0.0f;
+ proj[1] = 1.0f;
+ proj[2] = 0.0f;
}
/* Normalized cross product of n and proj specifies transformation of the right axis */
@@ -1275,7 +1280,7 @@ static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstr
* factor, which then gets clamped to lie within 0.0 - 1.0 range
*/
curvetime /= cu->pathlen;
- CLAMP(curvetime, 0.0, 1.0);
+ CLAMP(curvetime, 0.0f, 1.0f);
}
else {
/* fixed position along curve */
@@ -1922,7 +1927,7 @@ static void samevolume_evaluate (bConstraint *con, bConstraintOb *cob, ListBase
/* calculate normalising scale factor for non-essential values */
if (obsize[data->flag] != 0)
- fac = sqrt(volume / obsize[data->flag]) / obsize[data->flag];
+ fac = sqrtf(volume / obsize[data->flag]) / obsize[data->flag];
/* apply scaling factor to the channels not being kept */
switch (data->flag) {
@@ -2173,9 +2178,7 @@ static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraint
if (data->type < 10) {
/* extract rotation (is in whatever space target should be in) */
mat4_to_eul(vec, tempmat);
- vec[0] *= (float)(180.0/M_PI);
- vec[1] *= (float)(180.0/M_PI);
- vec[2] *= (float)(180.0/M_PI);
+ mul_v3_fl(vec, (float)(180.0/M_PI)); /* rad -> deg */
axis= data->type;
}
else if (data->type < 20) {
@@ -2666,7 +2669,7 @@ static void distlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
else if (data->flag & LIMITDIST_USESOFT) {
// FIXME: there's a problem with "jumping" when this kicks in
if (dist >= (data->dist - data->soft)) {
- sfac = (float)( data->soft*(1.0 - exp(-(dist - data->dist)/data->soft)) + data->dist );
+ sfac = (float)( data->soft*(1.0f - expf(-(dist - data->dist)/data->soft)) + data->dist );
sfac /= dist;
clamp_surf= 1;
@@ -2674,7 +2677,7 @@ static void distlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
}
}
else {
- if (IS_EQ(dist, data->dist)==0) {
+ if (IS_EQF(dist, data->dist)==0) {
clamp_surf= 1;
sfac= data->dist / dist;
}
@@ -3071,7 +3074,7 @@ static void rbj_flush_tars (bConstraint *con, ListBase *list, short nocopy)
static bConstraintTypeInfo CTI_RIGIDBODYJOINT = {
CONSTRAINT_TYPE_RIGIDBODYJOINT, /* type */
sizeof(bRigidBodyJointConstraint), /* size */
- "RigidBody Joint", /* name */
+ "Rigid Body Joint", /* name */
"bRigidBodyJointConstraint", /* struct name */
NULL, /* free data */
NULL, /* relink data */
@@ -3333,8 +3336,7 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
break;
case 1: /* rotation (convert to degrees first) */
mat4_to_eulO(dvec, cob->rotOrder, ct->matrix);
- for (i=0; i<3; i++)
- dvec[i] = (float)(dvec[i] / M_PI * 180);
+ mul_v3_fl(dvec, (float)(180.0/M_PI)); /* rad -> deg */
break;
default: /* location */
copy_v3_v3(dvec, ct->matrix[3]);
@@ -3384,7 +3386,7 @@ static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *
eul[i]= tmin + (sval[(int)data->map[i]] * (tmax - tmin));
/* now convert final value back to radians */
- eul[i] = (float)(eul[i] / 180 * M_PI);
+ eul[i] = DEG2RADF(eul[i]);
}
break;
default: /* location */
@@ -4462,9 +4464,11 @@ void solve_constraints (ListBase *conlist, bConstraintOb *cob, float ctime)
*/
enf = con->enforce;
+ /* make copy of worldspace matrix pre-constraint for use with blending later */
+ copy_m4_m4(oldmat, cob->matrix);
+
/* move owner matrix into right space */
constraint_mat_convertspace(cob->ob, cob->pchan, cob->matrix, CONSTRAINT_SPACE_WORLD, con->ownspace);
- copy_m4_m4(oldmat, cob->matrix);
/* prepare targets for constraint solving */
if (cti->get_constraint_targets) {
@@ -4500,16 +4504,20 @@ void solve_constraints (ListBase *conlist, bConstraintOb *cob, float ctime)
cti->flush_constraint_targets(con, &targets, 1);
}
- /* Interpolate the enforcement, to blend result of constraint into final owner transform */
+ /* move owner back into worldspace for next constraint/other business */
+ if ((con->flag & CONSTRAINT_SPACEONCE) == 0)
+ constraint_mat_convertspace(cob->ob, cob->pchan, cob->matrix, con->ownspace, CONSTRAINT_SPACE_WORLD);
+
+ /* Interpolate the enforcement, to blend result of constraint into final owner transform
+ * - all this happens in worldspace to prevent any weirdness creeping in ([#26014] and [#25725]),
+ * since some constraints may not convert the solution back to the input space before blending
+ * but all are guaranteed to end up in good "worldspace" result
+ */
/* Note: all kind of stuff here before (caused trouble), much easier to just interpolate, or did I miss something? -jahka */
- if (enf < 1.0) {
+ if (enf < 1.0f) {
float solution[4][4];
copy_m4_m4(solution, cob->matrix);
blend_m4_m4m4(cob->matrix, oldmat, solution, enf);
}
-
- /* move owner back into worldspace for next constraint/other business */
- if ((con->flag & CONSTRAINT_SPACEONCE) == 0)
- constraint_mat_convertspace(cob->ob, cob->pchan, cob->matrix, con->ownspace, CONSTRAINT_SPACE_WORLD);
}
}
diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c
index 6f7188115e0..2a44c942865 100644
--- a/source/blender/blenkernel/intern/context.c
+++ b/source/blender/blenkernel/intern/context.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/context.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <stddef.h>
@@ -114,7 +119,7 @@ bContext *CTX_copy(const bContext *C)
return newC;
}
-#ifdef EVENT_RECORDER
+#if defined(EVENT_RECORDER) && !defined(BUILDING_GAMEPLAYER)
extern GHOST_SystemHandle g_system;
int CTX_rec_events(bContext *C)
@@ -854,7 +859,7 @@ static const char *data_mode_strings[] = {
"sculpt_mode",
"weightpaint",
"vertexpaint",
- "texturepaint",
+ "imagepaint",
"particlemode",
"objectmode",
NULL
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 67e988249f5..b374727b87c 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/curve.c
+ * \ingroup bke
+ */
+
+
#include <math.h> // floor
#include <string.h>
#include <stdlib.h>
@@ -329,19 +334,19 @@ void tex_space_curve(Curve *cu)
cu->size[1]= (max[1]-min[1])/2.0f;
cu->size[2]= (max[2]-min[2])/2.0f;
- cu->rot[0]= cu->rot[1]= cu->rot[2]= 0.0;
+ cu->rot[0]= cu->rot[1]= cu->rot[2]= 0.0f;
- if(cu->size[0]==0.0) cu->size[0]= 1.0;
- else if(cu->size[0]>0.0 && cu->size[0]<0.00001) cu->size[0]= 0.00001;
- else if(cu->size[0]<0.0 && cu->size[0]> -0.00001) cu->size[0]= -0.00001;
+ if(cu->size[0]==0.0f) cu->size[0]= 1.0f;
+ else if(cu->size[0]>0.0f && cu->size[0]<0.00001f) cu->size[0]= 0.00001f;
+ else if(cu->size[0]<0.0f && cu->size[0]> -0.00001f) cu->size[0]= -0.00001f;
- if(cu->size[1]==0.0) cu->size[1]= 1.0;
- else if(cu->size[1]>0.0 && cu->size[1]<0.00001) cu->size[1]= 0.00001;
- else if(cu->size[1]<0.0 && cu->size[1]> -0.00001) cu->size[1]= -0.00001;
+ if(cu->size[1]==0.0f) cu->size[1]= 1.0f;
+ else if(cu->size[1]>0.0f && cu->size[1]<0.00001f) cu->size[1]= 0.00001f;
+ else if(cu->size[1]<0.0f && cu->size[1]> -0.00001f) cu->size[1]= -0.00001f;
- if(cu->size[2]==0.0) cu->size[2]= 1.0;
- else if(cu->size[2]>0.0 && cu->size[2]<0.00001) cu->size[2]= 0.00001;
- else if(cu->size[2]<0.0 && cu->size[2]> -0.00001) cu->size[2]= -0.00001;
+ if(cu->size[2]==0.0f) cu->size[2]= 1.0f;
+ else if(cu->size[2]>0.0f && cu->size[2]<0.00001f) cu->size[2]= 0.00001f;
+ else if(cu->size[2]<0.0f && cu->size[2]> -0.00001f) cu->size[2]= -0.00001f;
}
}
@@ -586,7 +591,7 @@ static void calcknots(float *knots, short aantal, short order, short type)
k= 0.0;
for(a=1;a<=t;a++) {
knots[a-1]= k;
- if(a>=order && a<=aantal) k+= 1.0;
+ if(a>=order && a<=aantal) k+= 1.0f;
}
}
else if(type==2) {
@@ -594,15 +599,15 @@ static void calcknots(float *knots, short aantal, short order, short type)
if(order==4) {
k= 0.34;
for(a=0;a<t;a++) {
- knots[a]= (float)floor(k);
- k+= (1.0/3.0);
+ knots[a]= floorf(k);
+ k+= (1.0f/3.0f);
}
}
else if(order==3) {
- k= 0.6;
+ k= 0.6f;
for(a=0;a<t;a++) {
- if(a>=order && a<=aantal) k+= (0.5);
- knots[a]= (float)floor(k);
+ if(a>=order && a<=aantal) k+= 0.5f;
+ knots[a]= floorf(k);
}
}
else {
@@ -626,7 +631,7 @@ static void makecyclicknots(float *knots, short pnts, short order)
for(a=1; a<order2; a++) {
if(knots[b]!= knots[b-a]) break;
}
- if(a==order2) knots[pnts+order-2]+= 1.0;
+ if(a==order2) knots[pnts+order-2]+= 1.0f;
}
b= order;
@@ -718,12 +723,12 @@ static void basisNurb(float t, short order, short pnts, float *knots, float *bas
if(i2+j>= orderpluspnts) i2= opp2-j;
for(i= i1; i<=i2; i++) {
- if(basis[i]!=0.0)
+ if(basis[i]!=0.0f)
d= ((t-knots[i])*basis[i]) / (knots[i+j-1]-knots[i]);
else
- d= 0.0;
+ d= 0.0f;
- if(basis[i+1]!=0.0)
+ if(basis[i+1] != 0.0f)
e= ((knots[i+j]-t)*basis[i+1]) / (knots[i+j]-knots[i+1]);
else
e= 0.0;
@@ -736,7 +741,7 @@ static void basisNurb(float t, short order, short pnts, float *knots, float *bas
*end= 0;
for(i=i1; i<=i2; i++) {
- if(basis[i]>0.0) {
+ if(basis[i] > 0.0f) {
*end= i;
if(*start==1000) *start= i;
}
@@ -778,7 +783,7 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride, int resolu, int
i= nu->pntsu*nu->pntsv;
ratcomp=0;
while(i--) {
- if(bp->vec[3]!=1.0) {
+ if(bp->vec[3] != 1.0f) {
ratcomp= 1;
break;
}
@@ -884,7 +889,7 @@ void makeNurbfaces(Nurb *nu, float *coord_array, int rowstride, int resolu, int
}
else bp++;
- if(*fp!=0.0) {
+ if(*fp != 0.0f) {
in[0]+= (*fp) * bp->vec[0];
in[1]+= (*fp) * bp->vec[1];
in[2]+= (*fp) * bp->vec[2];
@@ -960,7 +965,7 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu
*fp= basisu[i]*bp->vec[3];
sumdiv+= *fp;
}
- if(sumdiv!=0.0) if(sumdiv<0.999 || sumdiv>1.001) {
+ if(sumdiv != 0.0f) if(sumdiv < 0.999f || sumdiv > 1.001f) {
/* is normalizing needed? */
fp= sum;
for(i= istart; i<=iend; i++, fp++) {
@@ -976,7 +981,7 @@ void makeNurbcurve(Nurb *nu, float *coord_array, float *tilt_array, float *radiu
if(i>=nu->pntsu) bp= nu->bp+(i - nu->pntsu);
else bp++;
- if(*fp!=0.0) {
+ if(*fp != 0.0f) {
coord_fp[0]+= (*fp) * bp->vec[0];
coord_fp[1]+= (*fp) * bp->vec[1];
@@ -1260,7 +1265,7 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
if (cu->bevobj->type!=OB_CURVE) return;
bevcu= cu->bevobj->data;
- if(bevcu->ext1==0.0 && bevcu->ext2==0.0) {
+ if(bevcu->ext1==0.0f && bevcu->ext2==0.0f) {
ListBase bevdisp= {NULL, NULL};
facx= cu->bevobj->size[0];
facy= cu->bevobj->size[1];
@@ -1301,10 +1306,10 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
freedisplist(&bevdisp);
}
}
- else if(cu->ext1==0.0 && cu->ext2==0.0) {
+ else if(cu->ext1==0.0f && cu->ext2==0.0f) {
;
}
- else if(cu->ext2==0.0) {
+ else if(cu->ext2==0.0f) {
dl= MEM_callocN(sizeof(DispList), "makebevelcurve2");
dl->verts= MEM_mallocN(2*3*sizeof(float), "makebevelcurve2");
BLI_addtail(disp, dl);
@@ -1333,13 +1338,13 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
/* a circle */
fp= dl->verts;
- dangle= (2.0f*M_PI/(nr));
+ dangle= (2.0f*(float)M_PI/(nr));
angle= -(nr-1)*dangle;
for(a=0; a<nr; a++) {
fp[0]= 0.0;
- fp[1]= (float)(cos(angle)*(cu->ext2));
- fp[2]= (float)(sin(angle)*(cu->ext2)) - cu->ext1;
+ fp[1]= (cosf(angle)*(cu->ext2));
+ fp[2]= (sinf(angle)*(cu->ext2)) - cu->ext1;
angle+= dangle;
fp+= 3;
}
@@ -1370,15 +1375,15 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
for(a=0; a<nr; a++) {
fp[0]= 0.0;
- fp[1]= (float)(cos(angle)*(cu->ext2));
- fp[2]= (float)(sin(angle)*(cu->ext2)) - cu->ext1;
+ fp[1]= (float)(cosf(angle)*(cu->ext2));
+ fp[2]= (float)(sinf(angle)*(cu->ext2)) - cu->ext1;
angle+= dangle;
fp+= 3;
}
}
/* part 2, sidefaces */
- if(cu->ext1!=0.0) {
+ if(cu->ext1!=0.0f) {
nr= 2;
dl= MEM_callocN(sizeof(DispList), "makebevelcurve p2");
@@ -1428,8 +1433,8 @@ void makebevelcurve(Scene *scene, Object *ob, ListBase *disp, int forRender)
for(a=0; a<nr; a++) {
fp[0]= 0.0;
- fp[1]= (float)(cos(angle)*(cu->ext2));
- fp[2]= (float)(sin(angle)*(cu->ext2)) + cu->ext1;
+ fp[1]= (float)(cosf(angle)*(cu->ext2));
+ fp[2]= (float)(sinf(angle)*(cu->ext2)) + cu->ext1;
angle+= dangle;
fp+= 3;
}
@@ -1448,7 +1453,7 @@ static int cu_isectLL(float *v1, float *v2, float *v3, float *v4, short cox, sho
float deler;
deler= (v1[cox]-v2[cox])*(v3[coy]-v4[coy])-(v3[cox]-v4[cox])*(v1[coy]-v2[coy]);
- if(deler==0.0) return -1;
+ if(deler==0.0f) return -1;
*labda= (v1[coy]-v3[coy])*(v3[cox]-v4[cox])-(v1[cox]-v3[cox])*(v3[coy]-v4[coy]);
*labda= -(*labda/deler);
@@ -1463,8 +1468,8 @@ static int cu_isectLL(float *v1, float *v2, float *v3, float *v4, short cox, sho
vec[cox]= *labda*(v2[cox]-v1[cox])+v1[cox];
vec[coy]= *labda*(v2[coy]-v1[coy])+v1[coy];
- if(*labda>=0.0 && *labda<=1.0 && *mu>=0.0 && *mu<=1.0) {
- if(*labda==0.0 || *labda==1.0 || *mu==0.0 || *mu==1.0) return 1;
+ if(*labda>=0.0f && *labda<=1.0f && *mu>=0.0f && *mu<=1.0f) {
+ if(*labda==0.0f || *labda==1.0f || *mu==0.0f || *mu==1.0f) return 1;
return 2;
}
return 0;
@@ -1509,7 +1514,7 @@ static short bevelinside(BevList *bl1,BevList *bl2)
/* if lab==0.0 or lab==1.0 then the edge intersects exactly a transition
only allow for one situation: we choose lab= 1.0
*/
- if(mode>=0 && lab!=0.0) {
+ if(mode >= 0 && lab != 0.0f) {
if(vec[0]<hvec1[0]) links++;
else rechts++;
}
@@ -1547,8 +1552,8 @@ static void calc_bevel_sin_cos(float x1, float y1, float x2, float y2, float *si
t01= (float)sqrt(x1*x1+y1*y1);
t02= (float)sqrt(x2*x2+y2*y2);
- if(t01==0.0) t01= 1.0;
- if(t02==0.0) t02= 1.0;
+ if(t01==0.0f) t01= 1.0f;
+ if(t02==0.0f) t02= 1.0f;
x1/=t01;
y1/=t01;
@@ -1560,7 +1565,7 @@ static void calc_bevel_sin_cos(float x1, float y1, float x2, float y2, float *si
else t02= (saacos(t02))/2.0f;
t02= (float)sin(t02);
- if(t02==0.0) t02= 1.0;
+ if(t02==0.0f) t02= 1.0f;
x3= x1-x2;
y3= y1-y2;
@@ -1697,7 +1702,7 @@ static void bevel_list_flip_tangents(BevList *bl)
nr= bl->nr;
while(nr--) {
- if(RAD2DEG(angle_v2v2(bevp0->tan, bevp1->tan)) > 90)
+ if(RAD2DEGF(angle_v2v2(bevp0->tan, bevp1->tan)) > 90.0f)
negate_v3(bevp1->tan);
bevp0= bevp1;
@@ -1708,13 +1713,12 @@ static void bevel_list_flip_tangents(BevList *bl)
/* apply user tilt */
static void bevel_list_apply_tilt(BevList *bl)
{
- BevPoint *bevp2, *bevp1, *bevp0;
+ BevPoint *bevp2, *bevp1;
int nr;
float q[4];
bevp2= (BevPoint *)(bl+1);
bevp1= bevp2+(bl->nr-1);
- bevp0= bevp1-1;
nr= bl->nr;
while(nr--) {
@@ -1722,7 +1726,6 @@ static void bevel_list_apply_tilt(BevList *bl)
mul_qt_qtqt(bevp1->quat, q, bevp1->quat);
normalize_qt(bevp1->quat);
- bevp0= bevp1;
bevp1= bevp2;
bevp2++;
}
@@ -1887,7 +1890,7 @@ static void make_bevel_list_3D_minimum_twist(BevList *bl)
/* flip rotation if needs be */
cross_v3_v3v3(cross_tmp, vec_1, vec_2);
normalize_v3(cross_tmp);
- if(angle_normalized_v3v3(bevp_first->dir, cross_tmp) < 90/(180.0/M_PI))
+ if(angle_normalized_v3v3(bevp_first->dir, cross_tmp) < 90.0f/(float)(180.0/M_PI))
angle = -angle;
bevp2= (BevPoint *)(bl+1);
@@ -2281,7 +2284,7 @@ void makeBevelList(Object *ob)
inp= (bevp1->vec[0]- bevp0->vec[0]) * (bevp0->vec[1]- bevp2->vec[1]) + (bevp0->vec[1]- bevp1->vec[1]) * (bevp0->vec[0]- bevp2->vec[0]);
- if(inp>0.0) sd->dir= 1;
+ if(inp > 0.0f) sd->dir= 1;
else sd->dir= 0;
sd++;
@@ -2481,11 +2484,11 @@ void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
if(mode==2 && next && prev) { // keep horizontal if extrema
float ydiff1= prev->vec[1][1] - bezt->vec[1][1];
float ydiff2= next->vec[1][1] - bezt->vec[1][1];
- if( (ydiff1<=0.0 && ydiff2<=0.0) || (ydiff1>=0.0 && ydiff2>=0.0) ) {
+ if( (ydiff1 <= 0.0f && ydiff2 <= 0.0f) || (ydiff1 >= 0.0f && ydiff2 >= 0.0f) ) {
bezt->vec[0][1]= bezt->vec[1][1];
}
else { // handles should not be beyond y coord of two others
- if(ydiff1<=0.0) {
+ if(ydiff1 <= 0.0f) {
if(prev->vec[1][1] > bezt->vec[0][1]) {
bezt->vec[0][1]= prev->vec[1][1];
leftviolate= 1;
@@ -2509,11 +2512,11 @@ void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
if(mode==2 && next && prev) { // keep horizontal if extrema
float ydiff1= prev->vec[1][1] - bezt->vec[1][1];
float ydiff2= next->vec[1][1] - bezt->vec[1][1];
- if( (ydiff1<=0.0 && ydiff2<=0.0) || (ydiff1>=0.0 && ydiff2>=0.0) ) {
+ if( (ydiff1 <= 0.0f && ydiff2 <= 0.0f) || (ydiff1 >= 0.0f && ydiff2 >= 0.0f) ) {
bezt->vec[2][1]= bezt->vec[1][1];
}
else { // handles should not be beyond y coord of two others
- if(ydiff1<=0.0) {
+ if(ydiff1 <= 0.0f) {
if(next->vec[1][1] < bezt->vec[2][1]) {
bezt->vec[2][1]= next->vec[1][1];
rightviolate= 1;
@@ -2554,17 +2557,17 @@ void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
}
if(bezt->h1==HD_VECT) { /* vector */
- dx/=3.0;
- dy/=3.0;
- dz/=3.0;
+ dx/=3.0f;
+ dy/=3.0f;
+ dz/=3.0f;
*(p2-3)= *p2-dx;
*(p2-2)= *(p2+1)-dy;
*(p2-1)= *(p2+2)-dz;
}
if(bezt->h2==HD_VECT) {
- dx1/=3.0;
- dy1/=3.0;
- dz1/=3.0;
+ dx1/=3.0f;
+ dy1/=3.0f;
+ dz1/=3.0f;
*(p2+3)= *p2+dx1;
*(p2+4)= *(p2+1)+dy1;
*(p2+5)= *(p2+2)+dz1;
@@ -2572,8 +2575,8 @@ void calchandleNurb(BezTriple *bezt, BezTriple *prev, BezTriple *next, int mode)
len2= len_v3v3(p2, p2+3);
len1= len_v3v3(p2, p2-3);
- if(len1==0.0) len1=1.0;
- if(len2==0.0) len2=1.0;
+ if(len1==0.0f) len1= 1.0f;
+ if(len2==0.0f) len2= 1.0f;
if(bezt->f1 & SELECT) { /* order of calculation */
if(bezt->h2==HD_ALIGN) { /* aligned */
@@ -2698,18 +2701,18 @@ void autocalchandlesNurb(Nurb *nu, int flag)
if(flag==0 || (bezt1->f1 & flag) ) {
bezt1->h1= 0;
/* distance too short: vectorhandle */
- if( len_v3v3( bezt1->vec[1], bezt0->vec[1] ) < 0.0001) {
+ if( len_v3v3( bezt1->vec[1], bezt0->vec[1] ) < 0.0001f) {
bezt1->h1= HD_VECT;
leftsmall= 1;
}
else {
/* aligned handle? */
- if(dist_to_line_v2(bezt1->vec[1], bezt1->vec[0], bezt1->vec[2]) < 0.0001) {
+ if(dist_to_line_v2(bezt1->vec[1], bezt1->vec[0], bezt1->vec[2]) < 0.0001f) {
align= 1;
bezt1->h1= HD_ALIGN;
}
/* or vector handle? */
- if(dist_to_line_v2(bezt1->vec[0], bezt1->vec[1], bezt0->vec[1]) < 0.0001)
+ if(dist_to_line_v2(bezt1->vec[0], bezt1->vec[1], bezt0->vec[1]) < 0.0001f)
bezt1->h1= HD_VECT;
}
@@ -2718,7 +2721,7 @@ void autocalchandlesNurb(Nurb *nu, int flag)
if(flag==0 || (bezt1->f3 & flag) ) {
bezt1->h2= 0;
/* distance too short: vectorhandle */
- if( len_v3v3( bezt1->vec[1], bezt2->vec[1] ) < 0.0001) {
+ if( len_v3v3( bezt1->vec[1], bezt2->vec[1] ) < 0.0001f) {
bezt1->h2= HD_VECT;
rightsmall= 1;
}
@@ -2727,7 +2730,7 @@ void autocalchandlesNurb(Nurb *nu, int flag)
if(align) bezt1->h2= HD_ALIGN;
/* or vector handle? */
- if(dist_to_line_v2(bezt1->vec[2], bezt1->vec[1], bezt2->vec[1]) < 0.0001)
+ if(dist_to_line_v2(bezt1->vec[2], bezt1->vec[1], bezt2->vec[1]) < 0.0001f)
bezt1->h2= HD_VECT;
}
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 98d33e208bc..b29a669ed05 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -30,7 +30,12 @@
*
* BKE_customdata.h contains the function prototypes for this file.
*
-*/
+*/
+
+/** \file blender/blenkernel/intern/customdata.c
+ * \ingroup bke
+ */
+
#include <math.h>
#include <string.h>
@@ -453,13 +458,6 @@ static void layerInterp_mdisps(void **sources, float *UNUSED(weights),
float *sub_weights, int count, void *dest)
{
MDisps *d = dest;
- MDisps *s = NULL;
- int st, stl;
- int i, x, y;
- int side, S, dst_corners, src_corners;
- float crn_weight[4][2];
- float (*sw)[4] = (void*)sub_weights;
- float (*disps)[3], (*out)[3];
/* happens when flipping normals of newly created mesh */
if(!d->totdisp) {
@@ -468,104 +466,6 @@ static void layerInterp_mdisps(void **sources, float *UNUSED(weights),
if (!d->disps && d->totdisp)
d->disps = BLI_cellalloc_calloc(sizeof(float)*3*d->totdisp, "blank mdisps in layerInterp_mdisps");
-#if 0
- s = sources[0];
- dst_corners = multires_mdisp_corners(d);
- src_corners = multires_mdisp_corners(s);
-
- if(sub_weights && count == 2 && src_corners == 3) {
- src_corners = multires_mdisp_corners(sources[1]);
-
- /* special case -- converting two triangles to quad */
- if(src_corners == 3 && dst_corners == 4) {
- MDisps tris[2];
- int vindex[4] = {0};
-
- S = 0;
- for(i = 0; i < 2; i++)
- for(y = 0; y < 4; y++)
- for(x = 0; x < 4; x++)
- if(sw[x+i*4][y])
- vindex[x] = y;
-
- for(i = 0; i < 2; i++) {
- float sw_m4[4][4] = {{0}};
- int a = 7 & ~(1 << vindex[i*2] | 1 << vindex[i*2+1]);
-
- sw_m4[0][vindex[i*2+1]] = 1;
- sw_m4[1][vindex[i*2]] = 1;
-
- for(x = 0; x < 3; x++)
- if(a & (1 << x))
- sw_m4[2][x] = 1;
-
- tris[i] = *((MDisps*)sources[i]);
- tris[i].disps = BLI_cellalloc_dupalloc(tris[i].disps);
- layerInterp_mdisps(&sources[i], NULL, (float*)sw_m4, 1, &tris[i]);
- }
-
- mdisp_join_tris(d, &tris[0], &tris[1]);
-
- for(i = 0; i < 2; i++)
- BLI_cellalloc_free(tris[i].disps);
-
- return;
- }
- }
-
- /* For now, some restrictions on the input */
- if(count != 1 || !sub_weights) {
- for(i = 0; i < d->totdisp; ++i)
- zero_v3(d->disps[i]);
-
- return;
- }
-
- /* Initialize the destination */
- out = disps = BLI_cellalloc_calloc(3*d->totdisp*sizeof(float), "iterp disps");
-
- side = sqrt(d->totdisp / dst_corners);
- st = (side<<1)-1;
- stl = st - 1;
-
- sw= (void*)sub_weights;
- for(i = 0; i < 4; ++i) {
- crn_weight[i][0] = 0 * sw[i][0] + stl * sw[i][1] + stl * sw[i][2] + 0 * sw[i][3];
- crn_weight[i][1] = 0 * sw[i][0] + 0 * sw[i][1] + stl * sw[i][2] + stl * sw[i][3];
- }
-
- multires_mdisp_smooth_bounds(s);
-
- out = disps;
- for(S = 0; S < dst_corners; S++) {
- float base[2], axis_x[2], axis_y[2];
-
- mdisp_apply_weight(S, dst_corners, 0, 0, st, crn_weight, &base[0], &base[1]);
- mdisp_apply_weight(S, dst_corners, side-1, 0, st, crn_weight, &axis_x[0], &axis_x[1]);
- mdisp_apply_weight(S, dst_corners, 0, side-1, st, crn_weight, &axis_y[0], &axis_y[1]);
-
- sub_v2_v2(axis_x, base);
- sub_v2_v2(axis_y, base);
- normalize_v2(axis_x);
- normalize_v2(axis_y);
-
- for(y = 0; y < side; ++y) {
- for(x = 0; x < side; ++x, ++out) {
- int crn;
- float face_u, face_v, crn_u, crn_v;
-
- mdisp_apply_weight(S, dst_corners, x, y, st, crn_weight, &face_u, &face_v);
- crn = mdisp_rot_face_to_crn(src_corners, st, face_u, face_v, &crn_u, &crn_v);
-
- old_mdisps_bilinear((*out), &s->disps[crn*side*side], side, crn_u, crn_v);
- mdisp_flip_disp(crn, dst_corners, axis_x, axis_y, *out);
- }
- }
- }
-
- BLI_cellalloc_free(d->disps);
- d->disps = disps;
-#endif
}
static void layerCopy_mdisps(const void *source, void *dest, int count)
diff --git a/source/blender/blenkernel/intern/customdata_file.c b/source/blender/blenkernel/intern/customdata_file.c
index 6fb79a0df28..ab639897866 100644
--- a/source/blender/blenkernel/intern/customdata_file.c
+++ b/source/blender/blenkernel/intern/customdata_file.c
@@ -20,6 +20,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/customdata_file.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -310,11 +315,11 @@ int cdf_read_layer(CDataFile *cdf, CDataFileLayer *blay)
return (fseek(cdf->readf, offset, SEEK_SET) == 0);
}
-int cdf_read_data(CDataFile *cdf, int size, void *data)
+int cdf_read_data(CDataFile *cdf, unsigned int size, void *data)
{
float *fdata;
- int a;
-
+ unsigned int a;
+
/* read data */
if(!fread(data, size, 1, cdf->readf))
return 0;
@@ -385,7 +390,7 @@ int cdf_write_layer(CDataFile *UNUSED(cdf), CDataFileLayer *UNUSED(blay))
return 1;
}
-int cdf_write_data(CDataFile *cdf, int size, void *data)
+int cdf_write_data(CDataFile *cdf, unsigned int size, void *data)
{
/* write data */
if(!fwrite(data, size, 1, cdf->writef))
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index 616bcb17f90..a0f8a0f13ee 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -32,6 +32,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/deform.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <math.h>
#include "ctype.h"
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index c437c4fe61f..ff49c64ebf4 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenkernel/intern/depsgraph.c
+ * \ingroup bke
+ */
+
#include <stdio.h>
#include <string.h>
@@ -1551,10 +1556,9 @@ void graph_print_queue(DagNodeQueue *nqueue)
void graph_print_queue_dist(DagNodeQueue *nqueue)
{
DagNodeQueueElem *queueElem;
- int max, count;
+ int count;
queueElem = nqueue->first;
- max = queueElem->node->DFS_fntm;
count = 0;
while(queueElem) {
fprintf(stderr,"** %25s %2.2i-%2.2i ",((ID *) queueElem->node->ob)->name,queueElem->node->DFS_dvtm,queueElem->node->DFS_fntm);
@@ -2266,7 +2270,7 @@ void DAG_ids_flush_update(Main *bmain, int time)
DAG_scene_flush_update(bmain, sce, lay, time);
}
-void DAG_on_load_update(Main *bmain, const short do_time)
+void DAG_on_visible_update(Main *bmain, const short do_time)
{
Scene *scene;
Base *base;
@@ -2291,7 +2295,7 @@ void DAG_on_load_update(Main *bmain, const short do_time)
node= (sce_iter->theDag)? dag_get_node(sce_iter->theDag, ob): NULL;
oblay= (node)? node->lay: ob->lay;
- if(oblay & lay) {
+ if((oblay & lay) & ~scene->lay_updated) {
if(ELEM6(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL, OB_LATTICE))
ob->recalc |= OB_RECALC_DATA;
if(ob->dup_group)
@@ -2314,6 +2318,7 @@ void DAG_on_load_update(Main *bmain, const short do_time)
/* now tag update flags, to ensure deformers get calculated on redraw */
DAG_scene_update_flags(bmain, scene, lay, do_time);
+ scene->lay_updated |= lay;
}
}
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 59e5aa7ade6..1610b510dac 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/displist.c
+ * \ingroup bke
+ */
+
+
#include <math.h>
#include <stdio.h>
#include <string.h>
@@ -173,8 +178,8 @@ void addnormalsDispList(ListBase *lb)
if(dl->type==DL_INDEX3) {
if(dl->nors==NULL) {
dl->nors= MEM_callocN(sizeof(float)*3, "dlnors");
- if(dl->verts[2]<0.0) dl->nors[2]= -1.0;
- else dl->nors[2]= 1.0;
+ if(dl->verts[2] < 0.0f) dl->nors[2]= -1.0f;
+ else dl->nors[2]= 1.0f;
}
}
else if(dl->type==DL_SURF) {
@@ -408,10 +413,10 @@ static void fastshade(float *co, float *nor, float *orco, Material *ma, char *co
VECCOPY(shi.orn, shi.vn);
}
if(ma->texco & TEXCO_REFL) {
- float inp= 2.0*(shi.vn[2]);
+ float inp= 2.0f * (shi.vn[2]);
shi.ref[0]= (inp*shi.vn[0]);
shi.ref[1]= (inp*shi.vn[1]);
- shi.ref[2]= (-1.0+inp*shi.vn[2]);
+ shi.ref[2]= (-1.0f + inp*shi.vn[2]);
}
}
@@ -584,9 +589,7 @@ static void mesh_create_shadedColors(Render *re, Object *ob, int onlyForMesh, un
mul_v3_m4v3(vec, mat, mv->co);
- vec[0]+= 0.001*vn[0];
- vec[1]+= 0.001*vn[1];
- vec[2]+= 0.001*vn[2];
+ mul_v3_v3fl(vec, vn, 0.001f);
fastshade_customdata(&dm->faceData, i, j, ma);
fastshade(vec, vn, orco?&orco[vidx[j]*3]:mv->co, ma, col1, col2);
@@ -1155,7 +1158,7 @@ float calc_taper(Scene *scene, Object *taperobj, int cur, int tot)
/* horizontal size */
minx= dl->verts[0];
dx= dl->verts[3*(dl->nr-1)] - minx;
- if(dx>0.0) {
+ if(dx > 0.0f) {
fp= dl->verts;
for(a=0; a<dl->nr; a++, fp+=3) {
@@ -1736,7 +1739,7 @@ static void do_makeDispListCurveTypes(Scene *scene, Object *ob, ListBase *dispba
if (!dlbev.first && cu->width==1.0f) {
curve_to_displist(cu, nubase, dispbase, forRender);
} else {
- float widfac= cu->width-1.0;
+ float widfac= cu->width - 1.0f;
BevList *bl= cu->bev.first;
Nurb *nu= nubase->first;
diff --git a/source/blender/blenkernel/intern/editderivedbmesh.c b/source/blender/blenkernel/intern/editderivedbmesh.c
index 1479cb20a05..e60179101de 100644
--- a/source/blender/blenkernel/intern/editderivedbmesh.c
+++ b/source/blender/blenkernel/intern/editderivedbmesh.c
@@ -488,7 +488,7 @@ static void bmDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *us
}
}
-static void bmDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
+static void bmDM_drawEdges(DerivedMesh *dm, int drawLooseEdges, int drawAllEdges)
{
bmDM_drawMappedEdges(dm, NULL, NULL);
}
@@ -622,7 +622,10 @@ static void bmDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *use
}
}
-static void bmDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors)
+static void bmDM_drawMappedFaces(DerivedMesh *dm,
+ int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r),
+ void *userData, int useColors,
+ int (*setMaterial)(int, void *attribs))
{
EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm;
BMFace *efa;
@@ -1492,9 +1495,9 @@ DMLoopIter *bmDM_newLoopsIter(void *faceiter)
return (DMLoopIter*) iter;
}
-static DMFaceIter *bmDM_getFaceIter(void *dm)
+static DMFaceIter *bmDM_getFaceIter(DerivedMesh *dm)
{
- EditDerivedBMesh *bmdm= dm;
+ EditDerivedBMesh *bmdm= (EditDerivedBMesh*)dm;
bmDM_faceIter *iter = MEM_callocN(sizeof(bmDM_faceIter), "bmDM_faceIter");
BMIter biter;
BMVert *v;
@@ -1528,9 +1531,9 @@ static DMFaceIter *bmDM_getFaceIter(void *dm)
return (DMFaceIter*) iter;
}
-static void bmDM_release(void *dm)
+static void bmDM_release(DerivedMesh *dm)
{
- EditDerivedBMesh *bmdm= dm;
+ EditDerivedBMesh *bmdm= (EditDerivedBMesh *)dm;
if (DM_release(dm)) {
if (bmdm->vertexCos) {
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 5d8401d7a43..ab69196e8b6 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/effect.c
+ * \ingroup bke
+ */
+
+
#include <stddef.h>
#include "BLI_storage.h" /* _LARGEFILE_SOURCE */
@@ -356,12 +361,18 @@ void pdEndEffectors(ListBase **effectors)
void pd_point_from_particle(ParticleSimulationData *sim, ParticleData *pa, ParticleKey *state, EffectedPoint *point)
{
+ ParticleSettings *part = sim->psys->part;
point->loc = state->co;
point->vel = state->vel;
point->index = pa - sim->psys->particles;
point->size = pa->size;
- /* TODO: point->charge */
- point->charge = 1.0f;
+ point->charge = 0.0f;
+
+ if(part->pd && part->pd->forcefield == PFIELD_CHARGE)
+ point->charge += part->pd->f_strength;
+
+ if(part->pd2 && part->pd2->forcefield == PFIELD_CHARGE)
+ point->charge += part->pd2->f_strength;
point->vel_to_sec = 1.0f;
point->vel_to_frame = psys_get_timestep(sim);
@@ -484,7 +495,7 @@ static float wind_func(struct RNG *rng, float strength)
float ret;
float sign = 0;
- sign = ((float)random > 64.0) ? 1.0: -1.0; // dividing by 2 is not giving equal sign distribution
+ sign = ((float)random > 64.0f) ? 1.0f: -1.0f; // dividing by 2 is not giving equal sign distribution
ret = sign*((float)random / force)*strength/128.0f;
@@ -506,7 +517,7 @@ static float falloff_func(float fac, int usemin, float mindist, int usemax, floa
if(!usemin)
mindist = 0.0;
- return pow((double)1.0+fac-mindist, (double)-power);
+ return pow((double)(1.0f+fac-mindist), (double)(-power));
}
static float falloff_func_dist(PartDeflect *pd, float fac)
@@ -642,7 +653,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
sim.psys= eff->psys;
/* TODO: time from actual previous calculated frame (step might not be 1) */
- state.time = cfra - 1.0;
+ state.time = cfra - 1.0f;
ret = psys_get_particle_state(&sim, *efd->index, &state, 0);
/* TODO */
@@ -676,13 +687,16 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
/* use z-axis as normal*/
normalize_v3_v3(efd->nor, ob->obmat[2]);
- /* for vortex the shape chooses between old / new force */
if(eff->pd && eff->pd->shape == PFIELD_SHAPE_PLANE) {
- /* efd->loc is closes point on effector xy-plane */
float temp[3], translate[3];
sub_v3_v3v3(temp, point->loc, ob->obmat[3]);
project_v3_v3v3(translate, temp, efd->nor);
- add_v3_v3v3(efd->loc, ob->obmat[3], translate);
+
+ /* for vortex the shape chooses between old / new force */
+ if(eff->pd->forcefield == PFIELD_VORTEX)
+ add_v3_v3v3(efd->loc, ob->obmat[3], translate);
+ else /* normally efd->loc is closest point on effector xy-plane */
+ sub_v3_v3v3(efd->loc, point->loc, translate);
}
else {
VECCOPY(efd->loc, ob->obmat[3]);
@@ -691,7 +705,7 @@ int get_effector_data(EffectorCache *eff, EffectorData *efd, EffectedPoint *poin
if(real_velocity) {
VECCOPY(efd->vel, ob->obmat[3]);
- where_is_object_time(eff->scene, ob, cfra - 1.0);
+ where_is_object_time(eff->scene, ob, cfra - 1.0f);
sub_v3_v3v3(efd->vel, efd->vel, ob->obmat[3]);
}
@@ -917,10 +931,10 @@ static void do_physical_effector(EffectorCache *eff, EffectorData *efd, Effected
case PFIELD_LENNARDJ:
fac = pow((efd->size + point->size) / efd->distance, 6.0);
- fac = - fac * (1.0 - fac) / efd->distance;
+ fac = - fac * (1.0f - fac) / efd->distance;
/* limit the repulsive term drastically to avoid huge forces */
- fac = ((fac>2.0) ? 2.0 : fac);
+ fac = ((fac>2.0f) ? 2.0f : fac);
mul_v3_fl(force, strength * fac);
break;
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index 4afce1e56c4..53384d790e0 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -31,6 +31,11 @@
* ***** END GPL LICENSE BLOCK ****
*/
+/** \file blender/blenkernel/intern/exotic.c
+ * \ingroup bke
+ */
+
+
#include <stddef.h>
#include "BLI_storage.h"
@@ -177,12 +182,10 @@ static void mesh_add_normals_flags(Mesh *me)
v2= me->mvert+mface->v2;
v3= me->mvert+mface->v3;
v4= me->mvert+mface->v4;
-
+
normal_tri_v3( nor,v1->co, v2->co, v3->co);
- sno[0]= 32767.0*nor[0];
- sno[1]= 32767.0*nor[1];
- sno[2]= 32767.0*nor[2];
-
+ normal_float_to_short_v3(sno, nor);
+
simple_vertex_normal_blend(v1->no, sno);
simple_vertex_normal_blend(v2->no, sno);
simple_vertex_normal_blend(v3->no, sno);
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index b50943ba9f1..b1272ee2d53 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenkernel/intern/fcurve.c
+ * \ingroup bke
+ */
+
#include <math.h>
@@ -421,8 +426,52 @@ int binarysearch_bezt_index (BezTriple array[], float frame, int arraylen, short
return start;
}
+/* ...................................... */
+
+/* helper for calc_fcurve_* functions -> find first and last BezTriple to be used */
+static void get_fcurve_end_keyframes (FCurve *fcu, BezTriple **first, BezTriple **last, const short selOnly)
+{
+ /* init outputs */
+ *first = NULL;
+ *last = NULL;
+
+ /* sanity checks */
+ if (fcu->bezt == NULL)
+ return;
+
+ /* only include selected items? */
+ if (selOnly) {
+ BezTriple *bezt;
+ unsigned int i;
+
+ /* find first selected */
+ bezt = fcu->bezt;
+ for (i=0; i < fcu->totvert; bezt++, i++) {
+ if (BEZSELECTED(bezt)) {
+ *first= bezt;
+ break;
+ }
+ }
+
+ /* find last selected */
+ bezt = ARRAY_LAST_ITEM(fcu->bezt, BezTriple, sizeof(BezTriple), fcu->totvert);
+ for (i=0; i < fcu->totvert; bezt--, i++) {
+ if (BEZSELECTED(bezt)) {
+ *last= bezt;
+ break;
+ }
+ }
+ }
+ else {
+ /* just full array */
+ *first = fcu->bezt;
+ *last = ARRAY_LAST_ITEM(fcu->bezt, BezTriple, sizeof(BezTriple), fcu->totvert);
+ }
+}
+
+
/* Calculate the extents of F-Curve's data */
-void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax)
+void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, float *ymax, const short selOnly)
{
float xminv=999999999.0f, xmaxv=-999999999.0f;
float yminv=999999999.0f, ymaxv=-999999999.0f;
@@ -431,21 +480,31 @@ void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, flo
if (fcu->totvert) {
if (fcu->bezt) {
- /* frame range can be directly calculated from end verts */
+ BezTriple *bezt_first= NULL, *bezt_last= NULL;
+
if (xmin || xmax) {
- xminv= MIN2(xminv, fcu->bezt[0].vec[1][0]);
- xmaxv= MAX2(xmaxv, fcu->bezt[fcu->totvert-1].vec[1][0]);
+ /* get endpoint keyframes */
+ get_fcurve_end_keyframes(fcu, &bezt_first, &bezt_last, selOnly);
+
+ if (bezt_first) {
+ BLI_assert(bezt_last != NULL);
+
+ xminv= MIN2(xminv, bezt_first->vec[1][0]);
+ xmaxv= MAX2(xmaxv, bezt_last->vec[1][0]);
+ }
}
/* only loop over keyframes to find extents for values if needed */
- if (ymin || ymax) {
+ if (ymin || ymax) {
BezTriple *bezt;
for (bezt=fcu->bezt, i=0; i < fcu->totvert; bezt++, i++) {
- if (bezt->vec[1][1] < yminv)
- yminv= bezt->vec[1][1];
- if (bezt->vec[1][1] > ymaxv)
- ymaxv= bezt->vec[1][1];
+ if ((selOnly == 0) || BEZSELECTED(bezt)) {
+ if (bezt->vec[1][1] < yminv)
+ yminv= bezt->vec[1][1];
+ if (bezt->vec[1][1] > ymaxv)
+ ymaxv= bezt->vec[1][1];
+ }
}
}
}
@@ -492,15 +551,24 @@ void calc_fcurve_bounds (FCurve *fcu, float *xmin, float *xmax, float *ymin, flo
}
/* Calculate the extents of F-Curve's keyframes */
-void calc_fcurve_range (FCurve *fcu, float *start, float *end)
+void calc_fcurve_range (FCurve *fcu, float *start, float *end, const short selOnly)
{
float min=999999999.0f, max=-999999999.0f;
short foundvert=0;
if (fcu->totvert) {
if (fcu->bezt) {
- min= MIN2(min, fcu->bezt[0].vec[1][0]);
- max= MAX2(max, fcu->bezt[fcu->totvert-1].vec[1][0]);
+ BezTriple *bezt_first= NULL, *bezt_last= NULL;
+
+ /* get endpoint keyframes */
+ get_fcurve_end_keyframes(fcu, &bezt_first, &bezt_last, selOnly);
+
+ if (bezt_first) {
+ BLI_assert(bezt_last != NULL);
+
+ min= MIN2(min, bezt_first->vec[1][0]);
+ max= MAX2(max, bezt_last->vec[1][0]);
+ }
}
else if (fcu->fpt) {
min= MIN2(min, fcu->fpt[0].vec[0]);
@@ -1051,7 +1119,7 @@ static float dvar_eval_rotDiff (ChannelDriver *driver, DriverVar *dvar)
angle = 2.0f * (saacos(quat[0]));
angle= ABS(angle);
- return (angle > M_PI) ? (float)((2.0f * M_PI) - angle) : (float)(angle);
+ return (angle > (float)M_PI) ? (float)((2.0f * (float)M_PI) - angle) : (float)(angle);
}
/* evaluate 'location difference' driver variable */
@@ -1584,9 +1652,9 @@ static int findzero (float x, float q0, float q1, float q2, float q3, float *o)
int nr= 0;
c0= q0 - x;
- c1= 3.0 * (q1 - q0);
- c2= 3.0 * (q0 - 2.0*q1 + q2);
- c3= q3 - q0 + 3.0 * (q1 - q2);
+ c1= 3.0f * (q1 - q0);
+ c2= 3.0f * (q0 - 2.0f*q1 + q2);
+ c3= q3 - q0 + 3.0f * (q1 - q2);
if (c3 != 0.0) {
a= c2/c3;
@@ -1602,17 +1670,17 @@ static int findzero (float x, float q0, float q1, float q2, float q3, float *o)
t= sqrt(d);
o[0]= (float)(sqrt3d(-q+t) + sqrt3d(-q-t) - a);
- if ((o[0] >= SMALL) && (o[0] <= 1.000001)) return 1;
+ if ((o[0] >= (float)SMALL) && (o[0] <= 1.000001f)) return 1;
else return 0;
}
else if (d == 0.0) {
t= sqrt3d(-q);
o[0]= (float)(2*t - a);
- if ((o[0] >= SMALL) && (o[0] <= 1.000001)) nr++;
+ if ((o[0] >= (float)SMALL) && (o[0] <= 1.000001f)) nr++;
o[nr]= (float)(-t-a);
- if ((o[nr] >= SMALL) && (o[nr] <= 1.000001)) return nr+1;
+ if ((o[nr] >= (float)SMALL) && (o[nr] <= 1.000001f)) return nr+1;
else return nr;
}
else {
@@ -1622,13 +1690,13 @@ static int findzero (float x, float q0, float q1, float q2, float q3, float *o)
q= sqrt(3 - 3*p*p);
o[0]= (float)(2*t*p - a);
- if ((o[0] >= SMALL) && (o[0] <= 1.000001)) nr++;
+ if ((o[0] >= (float)SMALL) && (o[0] <= 1.000001f)) nr++;
o[nr]= (float)(-t * (p + q) - a);
- if ((o[nr] >= SMALL) && (o[nr] <= 1.000001)) nr++;
+ if ((o[nr] >= (float)SMALL) && (o[nr] <= 1.000001f)) nr++;
o[nr]= (float)(-t * (p - q) - a);
- if ((o[nr] >= SMALL) && (o[nr] <= 1.000001)) return nr+1;
+ if ((o[nr] >= (float)SMALL) && (o[nr] <= 1.000001f)) return nr+1;
else return nr;
}
}
@@ -1645,22 +1713,22 @@ static int findzero (float x, float q0, float q1, float q2, float q3, float *o)
p= sqrt(p);
o[0]= (float)((-b-p) / (2 * a));
- if ((o[0] >= SMALL) && (o[0] <= 1.000001)) nr++;
+ if ((o[0] >= (float)SMALL) && (o[0] <= 1.000001f)) nr++;
o[nr]= (float)((-b+p)/(2*a));
- if ((o[nr] >= SMALL) && (o[nr] <= 1.000001)) return nr+1;
+ if ((o[nr] >= (float)SMALL) && (o[nr] <= 1.000001f)) return nr+1;
else return nr;
}
else if (p == 0) {
o[0]= (float)(-b / (2 * a));
- if ((o[0] >= SMALL) && (o[0] <= 1.000001)) return 1;
+ if ((o[0] >= (float)SMALL) && (o[0] <= 1.000001f)) return 1;
else return 0;
}
}
else if (b != 0.0) {
o[0]= (float)(-c/b);
- if ((o[0] >= SMALL) && (o[0] <= 1.000001)) return 1;
+ if ((o[0] >= (float)SMALL) && (o[0] <= 1.000001f)) return 1;
else return 0;
}
else if (c == 0.0) {
diff --git a/source/blender/blenkernel/intern/fluidsim.c b/source/blender/blenkernel/intern/fluidsim.c
index 810c56dbe5d..fb15f0bffdb 100644
--- a/source/blender/blenkernel/intern/fluidsim.c
+++ b/source/blender/blenkernel/intern/fluidsim.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/fluidsim.c
+ * \ingroup bke
+ */
+
+
#include <stddef.h>
#include "BLI_storage.h" /* _LARGEFILE_SOURCE */
diff --git a/source/blender/blenkernel/intern/fmodifier.c b/source/blender/blenkernel/intern/fmodifier.c
index 804c26295bd..b5a877a7261 100644
--- a/source/blender/blenkernel/intern/fmodifier.c
+++ b/source/blender/blenkernel/intern/fmodifier.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/fmodifier.c
+ * \ingroup bke
+ */
+
+
#include <math.h>
#include <stdio.h>
@@ -341,7 +346,7 @@ static void fcm_fn_generator_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, floa
case FCM_GENERATOR_FN_LN: /* natural log */
{
/* check that value is greater than 1? */
- if (arg > 1.0f) {
+ if (arg > 1.0) {
fn= log;
}
else {
@@ -353,7 +358,7 @@ static void fcm_fn_generator_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, floa
case FCM_GENERATOR_FN_SQRT: /* square root */
{
/* no negative numbers */
- if (arg > 0.0f) {
+ if (arg > 0.0) {
fn= sqrt;
}
else {
@@ -369,7 +374,7 @@ static void fcm_fn_generator_evaluate (FCurve *UNUSED(fcu), FModifier *fcm, floa
/* execute function callback to set value if appropriate */
if (fn) {
- float value= (float)(data->amplitude*fn(arg) + data->value_offset);
+ float value= (float)(data->amplitude*(float)fn(arg) + data->value_offset);
if (data->flag & FCM_GENERATOR_ADDITIVE)
*cvalue += value;
diff --git a/source/blender/blenkernel/intern/font.c b/source/blender/blenkernel/intern/font.c
index 05988605b4c..f8003c656bf 100644
--- a/source/blender/blenkernel/intern/font.c
+++ b/source/blender/blenkernel/intern/font.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/font.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <string.h>
#include <math.h>
@@ -485,19 +490,19 @@ static void build_underline(Curve *cu, float x1, float y1, float x2, float y2, i
nu2->bp[0].vec[0] = x1;
nu2->bp[0].vec[1] = y1;
nu2->bp[0].vec[2] = 0;
- nu2->bp[0].vec[3] = 1.0;
+ nu2->bp[0].vec[3] = 1.0f;
nu2->bp[1].vec[0] = x2;
nu2->bp[1].vec[1] = y1;
nu2->bp[1].vec[2] = 0;
- nu2->bp[1].vec[3] = 1.0;
+ nu2->bp[1].vec[3] = 1.0f;
nu2->bp[2].vec[0] = x2;
nu2->bp[2].vec[1] = y2;
nu2->bp[2].vec[2] = 0;
- nu2->bp[2].vec[3] = 1.0;
+ nu2->bp[2].vec[3] = 1.0f;
nu2->bp[3].vec[0] = x1;
nu2->bp[3].vec[1] = y2;
nu2->bp[3].vec[2] = 0;
- nu2->bp[3].vec[3] = 1.0;
+ nu2->bp[3].vec[3] = 1.0f;
BLI_addtail(&(cu->nurb), nu2);
@@ -569,7 +574,7 @@ static void buildchar(Curve *cu, unsigned long character, CharInfo *info, float
memcpy(bezt2, bezt1, i * sizeof(struct BezTriple));
nu2->bezt = bezt2;
- if (shear != 0.0) {
+ if (shear != 0.0f) {
bezt2 = nu2->bezt;
for (i= nu2->pntsu; i > 0; i--) {
@@ -579,7 +584,7 @@ static void buildchar(Curve *cu, unsigned long character, CharInfo *info, float
bezt2++;
}
}
- if(rot!=0.0) {
+ if(rot != 0.0f) {
bezt2= nu2->bezt;
for (i=nu2->pntsu; i > 0; i--) {
fp= bezt2->vec[0];
@@ -704,8 +709,8 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
// Count the wchar_t string length
slen = wcslen(mem);
- if (cu->ulheight == 0.0)
- cu->ulheight = 0.05;
+ if (cu->ulheight == 0.0f)
+ cu->ulheight = 0.05f;
if (cu->strinfo==NULL) /* old file */
cu->strinfo = MEM_callocN((slen+4) * sizeof(CharInfo), "strinfo compat");
@@ -810,7 +815,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
twidth = char_width(cu, che, info);
// Calculate positions
- if((tb->w != 0.0) && (ct->dobreak==0) && ((xof-(tb->x/cu->fsize)+twidth)*cu->fsize) > tb->w + cu->xof*cu->fsize) {
+ if((tb->w != 0.0f) && (ct->dobreak==0) && ((xof-(tb->x/cu->fsize)+twidth)*cu->fsize) > tb->w + cu->xof*cu->fsize) {
// fprintf(stderr, "linewidth exceeded: %c%c%c...\n", mem[i], mem[i+1], mem[i+2]);
for (j=i; j && (mem[j] != '\n') && (mem[j] != '\r') && (chartransdata[j].dobreak==0); j--) {
if (mem[j]==' ' || mem[j]=='-') {
@@ -850,7 +855,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
linedata3[lnr]= tb->w/cu->fsize;
linedata4[lnr]= wsnr;
- if ( (tb->h != 0.0) &&
+ if ( (tb->h != 0.0f) &&
((-(yof-(tb->y/cu->fsize))) > ((tb->h/cu->fsize)-(linedist*cu->fsize)) - cu->yof) &&
(cu->totbox > (curbox+1)) ) {
maxlen= 0;
@@ -881,7 +886,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
ct->charnr= cnr++;
tabfac= (xof-cu->xof+0.01f);
- tabfac= (float)(2.0*ceil(tabfac/2.0));
+ tabfac= 2.0f*ceilf(tabfac/2.0f);
xof= cu->xof+tabfac;
}
else {
@@ -895,7 +900,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
if (cu->selboxes && (i>=selstart) && (i<=selend)) {
sb = &(cu->selboxes[i-selstart]);
- sb->y = yof*cu->fsize-linedist*cu->fsize*0.1;
+ sb->y = yof*cu->fsize-linedist*cu->fsize*0.1f;
sb->h = linedist*cu->fsize;
sb->w = xof*cu->fsize;
}
@@ -904,12 +909,12 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
wsfac = cu->wordspace;
wsnr++;
}
- else wsfac = 1.0;
+ else wsfac = 1.0f;
// Set the width of the character
twidth = char_width(cu, che, info);
- xof += (twidth*wsfac*(1.0+(info->kern/40.0)) ) + xtrax;
+ xof += (twidth*wsfac*(1.0f+(info->kern/40.0f)) ) + xtrax;
if (sb)
sb->w = (xof*cu->fsize) - sb->w;
@@ -946,7 +951,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
ct++;
}
} else if((cu->spacemode==CU_FLUSH) &&
- (cu->tb[0].w != 0.0)) {
+ (cu->tb[0].w != 0.0f)) {
for(i=0;i<lnr;i++)
if(linedata2[i]>1)
linedata[i]= (linedata3[i]-linedata[i])/(linedata2[i]-1);
@@ -959,7 +964,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
ct++;
}
}
- else if((cu->spacemode==CU_JUSTIFY) && (cu->tb[0].w != 0.0)) {
+ else if((cu->spacemode==CU_JUSTIFY) && (cu->tb[0].w != 0.0f)) {
float curofs= 0.0f;
for (i=0; i<=slen; i++) {
for (j=i; (mem[j]) && (mem[j]!='\n') &&
@@ -1010,9 +1015,9 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
/* length correction */
distfac= sizefac*cucu->path->totdist/(maxx-minx);
- timeofs= 0.0;
+ timeofs= 0.0f;
- if(distfac > 1.0) {
+ if(distfac > 1.0f) {
/* path longer than text: spacemode involves */
distfac= 1.0f/distfac;
@@ -1046,7 +1051,7 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
dtime= distfac*0.5f*twidth;
ctime= timeofs + distfac*( ct->xof - minx);
- CLAMP(ctime, 0.0, 1.0);
+ CLAMP(ctime, 0.0f, 1.0f);
/* calc the right loc AND the right rot separately */
/* vec, tvec need 4 items */
@@ -1168,17 +1173,17 @@ struct chartrans *BKE_text_to_curve(Scene *scene, Object *ob, int mode)
if ( (i<(slen-1)) && (mem[i+1] != '\n') && (mem[i+1] != '\r') &&
((mem[i+1] != ' ') || (custrinfo[i+1].flag & CU_CHINFO_UNDERLINE)) && ((custrinfo[i+1].flag & CU_CHINFO_WRAP)==0)
) {
- uloverlap = xtrax + 0.1;
+ uloverlap = xtrax + 0.1f;
}
// Find the character, the characters has to be in the memory already
// since character checking has been done earlier already.
che= find_vfont_char(vfd, cha);
twidth = char_width(cu, che, info);
- ulwidth = cu->fsize * ((twidth* (1.0+(info->kern/40.0)))+uloverlap);
- build_underline(cu, ct->xof*cu->fsize, ct->yof*cu->fsize + (cu->ulpos-0.05)*cu->fsize,
+ ulwidth = cu->fsize * ((twidth* (1.0f+(info->kern/40.0f)))+uloverlap);
+ build_underline(cu, ct->xof*cu->fsize, ct->yof*cu->fsize + (cu->ulpos-0.05f)*cu->fsize,
ct->xof*cu->fsize + ulwidth,
- ct->yof*cu->fsize + (cu->ulpos-0.05)*cu->fsize - cu->ulheight*cu->fsize,
+ ct->yof*cu->fsize + (cu->ulpos-0.05f)*cu->fsize - cu->ulheight*cu->fsize,
i, info->mat_nr);
}
ct++;
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index abd7c12ff70..db0c9d2735f 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenkernel/intern/gpencil.c
+ * \ingroup bke
+ */
+
#include <stdio.h>
#include <string.h>
diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c
index e48ec8ac288..d96b00f7990 100644
--- a/source/blender/blenkernel/intern/group.c
+++ b/source/blender/blenkernel/intern/group.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/group.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <string.h>
#include <math.h>
diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index 8ce3847bf08..09c189a8847 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -28,6 +28,11 @@
*
*/
+/** \file blender/blenkernel/intern/icons.c
+ * \ingroup bke
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/blenkernel/intern/idcode.c b/source/blender/blenkernel/intern/idcode.c
index 6c8b5329711..8c8a693e6e7 100755
--- a/source/blender/blenkernel/intern/idcode.c
+++ b/source/blender/blenkernel/intern/idcode.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
* return info about ID types
*/
+
+/** \file blender/blenkernel/intern/idcode.c
+ * \ingroup bke
+ */
+
#include <stdlib.h>
#include <string.h>
@@ -128,3 +133,8 @@ const char *BKE_idcode_to_name_plural(int code)
return idt?idt->plural:NULL;
}
+
+int BKE_idcode_iter_step(int *index)
+{
+ return (*index < nidtypes) ? idtypes[(*index)++].code : 0;
+}
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index b3119f317a5..67be3e71101 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenkernel/intern/idprop.c
+ * \ingroup bke
+ */
+
#include <stdio.h>
#include <stdlib.h>
@@ -235,7 +240,7 @@ void IDP_ResizeArray(IDProperty *prop, int newlen)
else {
/* newlen is smaller*/
idp_resize_group_array(prop, newlen, newarr);
- memcpy(newarr, prop->data.pointer, newlen*prop->len*idp_size_table[(int)prop->subtype]);
+ memcpy(newarr, prop->data.pointer, newlen*idp_size_table[(int)prop->subtype]);
}
MEM_freeN(prop->data.pointer);
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 8a15f63243c..c44634fed34 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/image.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
@@ -845,9 +850,15 @@ int BKE_add_image_extension(char *string, int imtype)
if(extension) {
/* prefer this in many cases to avoid .png.tga, but in certain cases it breaks */
- /* return BLI_replace_extension(string, FILE_MAX, extension); */
- strcat(string, extension);
- return TRUE;
+ /* remove any other known image extension */
+ if(BLI_testextensie_array(string, imb_ext_image)
+ || (G.have_quicktime && BLI_testextensie_array(string, imb_ext_image_qt))) {
+ return BLI_replace_extension(string, FILE_MAX, extension);
+ } else {
+ strcat(string, extension);
+ return TRUE;
+ }
+
}
else {
return FALSE;
@@ -1238,8 +1249,8 @@ int BKE_write_ibuf(Scene *scene, ImBuf *ibuf, const char *name, int imtype, int
int ok;
(void)subimtype; /* quies unused warnings */
- if(imtype==0) {
- /* pass */
+ if(imtype == -1) {
+ /* use whatever existing image type is set by 'ibuf' */
}
else if(imtype== R_IRIS) {
ibuf->ftype= IMAGIC;
diff --git a/source/blender/blenkernel/intern/image_gen.c b/source/blender/blenkernel/intern/image_gen.c
index c21e347d6d8..8f6408f1939 100644
--- a/source/blender/blenkernel/intern/image_gen.c
+++ b/source/blender/blenkernel/intern/image_gen.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/image_gen.c
+ * \ingroup bke
+ */
+
+
#include <math.h>
#include <stdlib.h>
@@ -156,8 +161,8 @@ void BKE_image_buf_fill_checker(unsigned char *rect, float *rect_float, int widt
/* Utility functions for BKE_image_buf_fill_checker_color */
-#define BLEND_FLOAT(real, add) (real+add <= 1.0) ? (real+add) : 1.0
-#define BLEND_CHAR(real, add) ((real + (char)(add * 255.0)) <= 255) ? (real + (char)(add * 255.0)) : 255
+#define BLEND_FLOAT(real, add) (real+add <= 1.0f) ? (real+add) : 1.0f
+#define BLEND_CHAR(real, add) ((real + (char)(add * 255.0f)) <= 255) ? (real + (char)(add * 255.0f)) : 255
static int is_pow2(int n)
{
diff --git a/source/blender/blenkernel/intern/implicit.c b/source/blender/blenkernel/intern/implicit.c
index 207c667f335..7f0292b2f22 100644
--- a/source/blender/blenkernel/intern/implicit.c
+++ b/source/blender/blenkernel/intern/implicit.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/implicit.c
+ * \ingroup bke
+ */
+
+
#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 329058b3115..08e0ad4f3ff 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -28,6 +28,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/ipo.c
+ * \ingroup bke
+ */
+
+
/* NOTE:
*
* This file is no longer used to provide tools for the depreceated IPO system. Instead, it
@@ -326,7 +331,7 @@ static char *shapekey_adrcodes_to_paths (int adrcode, int *UNUSED(array_index))
if (adrcode == 0)
sprintf(buf, "speed");
else
- sprintf(buf, "keys[%d].value", adrcode);
+ sprintf(buf, "key_blocks[%d].value", adrcode);
return buf;
}
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 5c10c14c4e2..06145f09488 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/key.c
+ * \ingroup bke
+ */
+
+
#include <math.h>
#include <string.h>
#include <stddef.h>
@@ -461,7 +466,7 @@ static int setkeys(float fac, ListBase *lb, KeyBlock *k[], float *t, int cycl)
t[3]= k1->pos+ofs;
k[3]= k1;
- if(ofs>2.1+lastpos) break;
+ if(ofs > 2.1f + lastpos) break;
}
bsplinetype= 0;
@@ -487,7 +492,7 @@ static int setkeys(float fac, ListBase *lb, KeyBlock *k[], float *t, int cycl)
}
d= t[2]-t[1];
- if(d==0.0) {
+ if(d == 0.0f) {
if(bsplinetype==0) {
return 1; /* both keys equal */
}
@@ -691,8 +696,8 @@ static void cp_key(const int start, int end, const int tot, char *poin, Key *key
/* are we going to be nasty? */
if(flagflo) {
ktot+= kd;
- while(ktot>=1.0) {
- ktot-= 1.0;
+ while(ktot >= 1.0f) {
+ ktot -= 1.0f;
k1+= elemsize;
kref+= elemsize;
}
@@ -995,8 +1000,8 @@ static void do_key(const int start, int end, const int tot, char *poin, Key *key
if(flagdo & 1) {
if(flagflo & 1) {
k1tot+= k1d;
- while(k1tot>=1.0) {
- k1tot-= 1.0;
+ while(k1tot >= 1.0f) {
+ k1tot -= 1.0f;
k1+= elemsize;
}
}
@@ -1005,8 +1010,8 @@ static void do_key(const int start, int end, const int tot, char *poin, Key *key
if(flagdo & 2) {
if(flagflo & 2) {
k2tot+= k2d;
- while(k2tot>=1.0) {
- k2tot-= 1.0;
+ while(k2tot >= 1.0f) {
+ k2tot -= 1.0f;
k2+= elemsize;
}
}
@@ -1015,8 +1020,8 @@ static void do_key(const int start, int end, const int tot, char *poin, Key *key
if(flagdo & 4) {
if(flagflo & 4) {
k3tot+= k3d;
- while(k3tot>=1.0) {
- k3tot-= 1.0;
+ while(k3tot >= 1.0f) {
+ k3tot -= 1.0f;
k3+= elemsize;
}
}
@@ -1025,8 +1030,8 @@ static void do_key(const int start, int end, const int tot, char *poin, Key *key
if(flagdo & 8) {
if(flagflo & 8) {
k4tot+= k4d;
- while(k4tot>=1.0) {
- k4tot-= 1.0;
+ while(k4tot >= 1.0f) {
+ k4tot -= 1.0f;
k4+= elemsize;
}
}
@@ -1518,7 +1523,7 @@ KeyBlock *add_keyblock(Key *key, const char *name)
// XXX kb->pos is the confusing old horizontal-line RVK crap in old IPO Editor...
if(key->type == KEY_RELATIVE)
- kb->pos= curpos+0.1;
+ kb->pos= curpos + 0.1f;
else {
#if 0 // XXX old animation system
curpos= bsystem_time(scene, 0, (float)CFRA, 0.0);
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 70eba3903d0..a32ae68efdd 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/lattice.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <string.h>
@@ -408,7 +413,7 @@ void calc_latt_deform(Object *ob, float *co, float weight)
for(ww= wi-1; ww<=wi+2; ww++) {
w= tw[ww-wi+1];
- if(w!=0.0) {
+ if(w != 0.0f) {
if(ww>0) {
if(ww<lt->pntsw) idx_w= ww*lt->pntsu*lt->pntsv;
else idx_w= (lt->pntsw-1)*lt->pntsu*lt->pntsv;
@@ -418,7 +423,7 @@ void calc_latt_deform(Object *ob, float *co, float weight)
for(vv= vi-1; vv<=vi+2; vv++) {
v= w*tv[vv-vi+1];
- if(v!=0.0) {
+ if(v != 0.0f) {
if(vv>0) {
if(vv<lt->pntsv) idx_v= idx_w + vv*lt->pntsu;
else idx_v= idx_w + (lt->pntsv-1)*lt->pntsu;
@@ -428,7 +433,7 @@ void calc_latt_deform(Object *ob, float *co, float weight)
for(uu= ui-1; uu<=ui+2; uu++) {
u= weight*v*tu[uu-ui+1];
- if(u!=0.0) {
+ if(u != 0.0f) {
if(uu>0) {
if(uu<lt->pntsu) idx_u= idx_v + uu;
else idx_u= idx_v + (lt->pntsu-1);
@@ -504,7 +509,7 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir,
if(bl && bl->poly> -1) cycl= 1;
if(cycl==0) {
- ctime1= CLAMPIS(ctime, 0.0, 1.0);
+ ctime1= CLAMPIS(ctime, 0.0f, 1.0f);
}
else ctime1= ctime;
@@ -515,16 +520,16 @@ static int where_on_path_deform(Object *ob, float ctime, float *vec, float *dir,
Path *path= cu->path;
float dvec[3];
- if(ctime < 0.0) {
+ if(ctime < 0.0f) {
sub_v3_v3v3(dvec, path->data[1].vec, path->data[0].vec);
mul_v3_fl(dvec, ctime*(float)path->len);
add_v3_v3(vec, dvec);
if(quat) copy_qt_qt(quat, path->data[0].quat);
if(radius) *radius= path->data[0].radius;
}
- else if(ctime > 1.0) {
+ else if(ctime > 1.0f) {
sub_v3_v3v3(dvec, path->data[path->len-1].vec, path->data[path->len-2].vec);
- mul_v3_fl(dvec, (ctime-1.0)*(float)path->len);
+ mul_v3_fl(dvec, (ctime-1.0f)*(float)path->len);
add_v3_v3(vec, dvec);
if(quat) copy_qt_qt(quat, path->data[path->len-1].quat);
if(radius) *radius= path->data[path->len-1].radius;
@@ -1027,13 +1032,8 @@ void lattice_calc_modifiers(Scene *scene, Object *ob)
struct MDeformVert* lattice_get_deform_verts(struct Object *oblatt)
{
- if(oblatt->type == OB_LATTICE)
- {
- Lattice *lt = (Lattice*)oblatt->data;
- if(lt->editlatt) lt= lt->editlatt->latt;
- return lt->dvert;
- }
-
- return NULL;
+ Lattice *lt = (Lattice*)oblatt->data;
+ BLI_assert(oblatt->type == OB_LATTICE);
+ if(lt->editlatt) lt= lt->editlatt->latt;
+ return lt->dvert;
}
-
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index cb96f549829..e3b0a342b3a 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/library.c
+ * \ingroup bke
+ */
+
+
/*
* Contains management of ID's and libraries
* allocate and free of all library data
@@ -104,6 +109,10 @@
#include "BKE_gpencil.h"
#include "BKE_fcurve.h"
+#ifdef WITH_PYTHON
+#include "BPY_extern.h"
+#endif
+
#define MAX_IDPUP 60 /* was 24 */
/* GS reads the memory pointed at in a specific ordering.
@@ -716,7 +725,11 @@ static void animdata_dtar_clear_cb(ID *UNUSED(id), AnimData *adt, void *userdata
void free_libblock(ListBase *lb, void *idv)
{
ID *id= idv;
-
+
+#ifdef WITH_PYTHON
+ BPY_id_release(id);
+#endif
+
switch( GS(id->name) ) { /* GetShort from util.h */
case ID_SCE:
free_scene((Scene *)id);
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 0b1cbd60432..fa7709e3b33 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/material.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <math.h>
@@ -240,12 +245,11 @@ Material *localize_material(Material *ma)
man= copy_libblock(ma);
BLI_remlink(&G.main->mat, man);
+ /* no increment for texture ID users, in previewrender.c it prevents decrement */
for(a=0; a<MAX_MTEX; a++) {
if(ma->mtex[a]) {
man->mtex[a]= MEM_mallocN(sizeof(MTex), "copymaterial");
memcpy(man->mtex[a], ma->mtex[a], sizeof(MTex));
- /* free_material decrements! */
- id_us_plus((ID *)man->mtex[a]->tex);
}
}
@@ -683,6 +687,10 @@ void assign_material(Object *ob, Material *ma, int act)
if(act>MAXMAT) return;
if(act<1) act= 1;
+ /* prevent crashing when using accidentally */
+ BLI_assert(ob->id.lib == NULL);
+ if(ob->id.lib) return;
+
/* test arraylens */
totcolp= give_totcolp(ob);
@@ -780,21 +788,10 @@ int find_material_index(Object *ob, Material *ma)
int object_add_material_slot(Object *ob)
{
- Material *ma;
-
if(ob==NULL) return FALSE;
if(ob->totcol>=MAXMAT) return FALSE;
- ma= give_current_material(ob, ob->actcol);
-
- if(ma == NULL)
- ma= add_material("Material");
- else
- ma= copy_material(ma);
-
- id_us_min(&ma->id);
-
- assign_material(ob, ma, ob->totcol+1);
+ assign_material(ob, NULL, ob->totcol+1);
ob->actcol= ob->totcol;
return TRUE;
}
@@ -1001,9 +998,9 @@ void automatname(Material *ma)
if(ma->mode & MA_SHLESS) ref= 1.0;
else ref= ma->ref;
- r= (int)(4.99*(ref*ma->r));
- g= (int)(4.99*(ref*ma->g));
- b= (int)(4.99*(ref*ma->b));
+ r= (int)(4.99f*(ref*ma->r));
+ g= (int)(4.99f*(ref*ma->g));
+ b= (int)(4.99f*(ref*ma->b));
nr= r + 5*g + 25*b;
if(nr>124) nr= 124;
new_id(&G.main->mat, (ID *)ma, colname_array[nr]);
@@ -1169,10 +1166,10 @@ void ramp_blend(int type, float *r, float *g, float *b, float fac, float *col)
}
break;
case MA_RAMP_DIFF:
- *r = facm*(*r) + fac*fabs(*r-col[0]);
+ *r = facm*(*r) + fac*fabsf(*r-col[0]);
if(g) {
- *g = facm*(*g) + fac*fabs(*g-col[1]);
- *b = facm*(*b) + fac*fabs(*b-col[2]);
+ *g = facm*(*g) + fac*fabsf(*g-col[1]);
+ *b = facm*(*b) + fac*fabsf(*b-col[2]);
}
break;
case MA_RAMP_DARK:
diff --git a/source/blender/blenkernel/intern/mball.c b/source/blender/blenkernel/intern/mball.c
index 4f44875b7ea..e6e32be9634 100644
--- a/source/blender/blenkernel/intern/mball.c
+++ b/source/blender/blenkernel/intern/mball.c
@@ -32,6 +32,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/mball.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <string.h>
#include <math.h>
@@ -582,13 +587,13 @@ float densfunc(MetaElem *ball, float x, float y, float z)
if(ball->flag & MB_NEGATIVE) {
dist2= 1.0f-(dist2/ball->rad2);
- if(dist2 < 0.0) return 0.5f;
+ if(dist2 < 0.0f) return 0.5f;
return 0.5f-ball->s*dist2*dist2*dist2;
}
else {
dist2= 1.0f-(dist2/ball->rad2);
- if(dist2 < 0.0) return -0.5f;
+ if(dist2 < 0.0f) return -0.5f;
return ball->s*dist2*dist2*dist2 -0.5f;
}
@@ -680,8 +685,8 @@ float metaball(float x, float y, float z)
ml_p= ml_p->next;
}
- dens+= -0.5*(metaball_tree->pos - node->pos);
- dens+= 0.5*(metaball_tree->neg - node->neg);
+ dens+= -0.5f*(metaball_tree->pos - node->pos);
+ dens+= 0.5f*(metaball_tree->neg - node->neg);
}
else{
for(a=0; a<totelem; a++) {
@@ -827,7 +832,7 @@ void docube(CUBE *cube, PROCESS *p, MetaBall *mb)
CORNER *c1, *c2;
int i, index = 0, count, indexar[8];
- for (i = 0; i < 8; i++) if (cube->corners[i]->value > 0.0) index += (1<<i);
+ for (i = 0; i < 8; i++) if (cube->corners[i]->value > 0.0f) index += (1<<i);
for (polys = cubetable[index]; polys; polys = polys->next) {
INTLIST *edges;
@@ -901,7 +906,7 @@ void testface(int i, int j, int k, CUBE* old, int bit, int c1, int c2, int c3, i
corn3= old->corners[c3];
corn4= old->corners[c4];
- pos = corn1->value > 0.0 ? 1 : 0;
+ pos = corn1->value > 0.0f ? 1 : 0;
/* test if no surface crossing */
if( (corn2->value > 0) == pos && (corn3->value > 0) == pos && (corn4->value > 0) == pos) return;
@@ -1214,9 +1219,9 @@ void vnormal (MB_POINT *point, PROCESS *p, MB_POINT *v)
v->x = p->function(point->x+delta, point->y, point->z)-f;
v->y = p->function(point->x, point->y+delta, point->z)-f;
v->z = p->function(point->x, point->y, point->z+delta)-f;
- f = (float)sqrt(v->x*v->x + v->y*v->y + v->z*v->z);
+ f = sqrtf(v->x*v->x + v->y*v->y + v->z*v->z);
- if (f != 0.0) {
+ if (f != 0.0f) {
v->x /= f;
v->y /= f;
v->z /= f;
@@ -1225,16 +1230,16 @@ void vnormal (MB_POINT *point, PROCESS *p, MB_POINT *v)
if(FALSE) {
MB_POINT temp;
- delta*= 2.0;
+ delta *= 2.0f;
f = p->function(point->x, point->y, point->z);
temp.x = p->function(point->x+delta, point->y, point->z)-f;
temp.y = p->function(point->x, point->y+delta, point->z)-f;
temp.z = p->function(point->x, point->y, point->z+delta)-f;
- f = (float)sqrt(temp.x*temp.x + temp.y*temp.y + temp.z*temp.z);
+ f = sqrtf(temp.x*temp.x + temp.y*temp.y + temp.z*temp.z);
- if (f != 0.0) {
+ if (f != 0.0f) {
temp.x /= f;
temp.y /= f;
temp.z /= f;
@@ -1243,9 +1248,9 @@ void vnormal (MB_POINT *point, PROCESS *p, MB_POINT *v)
v->y+= temp.y;
v->z+= temp.z;
- f = (float)sqrt(v->x*v->x + v->y*v->y + v->z*v->z);
+ f = sqrtf(v->x*v->x + v->y*v->y + v->z*v->z);
- if (f != 0.0) {
+ if (f != 0.0f) {
v->x /= f;
v->y /= f;
v->z /= f;
@@ -1312,7 +1317,7 @@ void converge (MB_POINT *p1, MB_POINT *p2, float v1, float v2,
/* Aproximation by linear interpolation is faster then binary subdivision,
* but it results sometimes (mb->thresh < 0.2) into the strange results */
- if((mb->thresh >0.2) && (f==1)){
+ if((mb->thresh > 0.2f) && (f==1)){
if((dy == 0.0f) && (dz == 0.0f)){
p->x = neg.x - negative*dx/(positive-negative);
p->y = neg.y;
@@ -1339,7 +1344,7 @@ void converge (MB_POINT *p1, MB_POINT *p2, float v1, float v2,
while (1) {
if (i++ == RES) return;
p->x = 0.5f*(pos.x + neg.x);
- if ((function(p->x,p->y,p->z)) > 0.0) pos.x = p->x; else neg.x = p->x;
+ if ((function(p->x,p->y,p->z)) > 0.0f) pos.x = p->x; else neg.x = p->x;
}
}
@@ -1349,7 +1354,7 @@ void converge (MB_POINT *p1, MB_POINT *p2, float v1, float v2,
while (1) {
if (i++ == RES) return;
p->y = 0.5f*(pos.y + neg.y);
- if ((function(p->x,p->y,p->z)) > 0.0) pos.y = p->y; else neg.y = p->y;
+ if ((function(p->x,p->y,p->z)) > 0.0f) pos.y = p->y; else neg.y = p->y;
}
}
@@ -1359,7 +1364,7 @@ void converge (MB_POINT *p1, MB_POINT *p2, float v1, float v2,
while (1) {
if (i++ == RES) return;
p->z = 0.5f*(pos.z + neg.z);
- if ((function(p->x,p->y,p->z)) > 0.0) pos.z = p->z; else neg.z = p->z;
+ if ((function(p->x,p->y,p->z)) > 0.0f) pos.z = p->z; else neg.z = p->z;
}
}
@@ -1371,7 +1376,7 @@ void converge (MB_POINT *p1, MB_POINT *p2, float v1, float v2,
if (i++ == RES) return;
- if ((function(p->x, p->y, p->z)) > 0.0){
+ if ((function(p->x, p->y, p->z)) > 0.0f){
pos.x = p->x;
pos.y = p->y;
pos.z = p->z;
@@ -1432,7 +1437,7 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a)
/* Skip, when Stiffness of MetaElement is too small ... MetaElement can't be
* visible alone ... but still can influence others MetaElements :-) */
- if(f > 0.0) {
+ if(f > 0.0f) {
OUT.x = IN.x = in.x= 0.0;
OUT.y = IN.y = in.y= 0.0;
OUT.z = IN.z = in.z= 0.0;
@@ -1490,7 +1495,7 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a)
workp.y = in.y;
workp.z = in.z;
workp_v = in_v;
- max_len = sqrt((out.x-in.x)*(out.x-in.x) + (out.y-in.y)*(out.y-in.y) + (out.z-in.z)*(out.z-in.z));
+ max_len = sqrtf((out.x-in.x)*(out.x-in.x) + (out.y-in.y)*(out.y-in.y) + (out.z-in.z)*(out.z-in.z));
nx = abs((out.x - in.x)/mbproc->size);
ny = abs((out.y - in.y)/mbproc->size);
@@ -1510,7 +1515,7 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a)
/* compute value of implicite function */
tmp_v = mbproc->function(workp.x, workp.y, workp.z);
/* add cube to the stack, when value of implicite function crosses zero value */
- if((tmp_v<0.0 && workp_v>=0.0)||(tmp_v>0.0 && workp_v<=0.0)) {
+ if((tmp_v<0.0f && workp_v>=0.0f)||(tmp_v>0.0f && workp_v<=0.0f)) {
/* indexes of CUBE, which includes "first point" */
c_i= (int)floor(workp.x/mbproc->size);
@@ -1524,7 +1529,7 @@ void find_first_points(PROCESS *mbproc, MetaBall *mb, int a)
else
add_cube(mbproc, c_i, c_j, c_k, 1);
}
- len = sqrt((workp.x-in.x)*(workp.x-in.x) + (workp.y-in.y)*(workp.y-in.y) + (workp.z-in.z)*(workp.z-in.z));
+ len = sqrtf((workp.x-in.x)*(workp.x-in.x) + (workp.y-in.y)*(workp.y-in.y) + (workp.z-in.z)*(workp.z-in.z));
workp_v = tmp_v;
}
@@ -1622,13 +1627,13 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
/* when metaball object hase zero scale, then MetaElem ot this MetaBall
* will not be put to mainb array */
- if(bob->size[0]==0.0 || bob->size[1]==0.0 || bob->size[2]==0.0) {
+ if(bob->size[0]==0.0f || bob->size[1]==0.0f || bob->size[2]==0.0f) {
zero_size= 1;
}
else if(bob->parent) {
struct Object *pob=bob->parent;
while(pob) {
- if(pob->size[0]==0.0 || pob->size[1]==0.0 || pob->size[2]==0.0) {
+ if(pob->size[0]==0.0f || pob->size[1]==0.0f || pob->size[2]==0.0f) {
zero_size= 1;
break;
}
@@ -1657,7 +1662,7 @@ float init_meta(Scene *scene, Object *ob) /* return totsize */
/* too big stiffness seems only ugly due to linear interpolation
* no need to have possibility for too big stiffness */
- if(ml->s > 10.0) ml->s = 10.0;
+ if(ml->s > 10.0f) ml->s = 10.0f;
/* Rotation of MetaElem is stored in quat */
quat_to_mat4( temp3,ml->quat);
@@ -2223,7 +2228,7 @@ void metaball_polygonize(Scene *scene, Object *ob, ListBase *dispbase)
if(G.moving && mb->flag==MB_UPDATE_HALFRES) width*= 2;
}
/* nr_cubes is just for safety, minimum is totsize */
- nr_cubes= (int)(0.5+totsize/width);
+ nr_cubes= (int)(0.5f+totsize/width);
/* init process */
mbproc.function = metaball;
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index ced9a3d9e7d..3cc1f58f6d6 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/mesh.c
+ * \ingroup bke
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
@@ -711,9 +716,9 @@ void tex_space_mesh(Mesh *me)
if(me->texflag & AUTOSPACE) {
for (a=0; a<3; a++) {
- if(size[a]==0.0) size[a]= 1.0;
- else if(size[a]>0.0 && size[a]<0.00001) size[a]= 0.00001;
- else if(size[a]<0.0 && size[a]> -0.00001) size[a]= -0.00001;
+ if(size[a]==0.0f) size[a]= 1.0f;
+ else if(size[a]>0.0f && size[a]<0.00001f) size[a]= 0.00001f;
+ else if(size[a]<0.0f && size[a]> -0.00001f) size[a]= -0.00001f;
}
copy_v3_v3(me->loc, loc);
@@ -941,13 +946,17 @@ static void mfaces_strip_loose(MFace *mface, int *totface)
}
/* Create edges based on known verts and faces */
-static void make_edges_mdata(MVert *UNUSED(allvert), MFace *allface, int UNUSED(totvert), int totface,
+static void make_edges_mdata(MVert *UNUSED(allvert), MFace *allface, MLoop *allloop,
+ MPoly *allpoly, int UNUSED(totvert), int totface, int totloop, int totpoly,
int old, MEdge **alledge, int *_totedge)
{
+ MPoly *mpoly;
+ MLoop *mloop;
MFace *mface;
MEdge *medge;
+ EdgeHash *hash = BLI_edgehash_new();
struct edgesort *edsort, *ed;
- int a, totedge=0, final=0;
+ int a, b, totedge=0, final=0;
/* we put all edges in array, sort them, and detect doubles that way */
@@ -1019,6 +1028,26 @@ static void make_edges_mdata(MVert *UNUSED(allvert), MFace *allface, int UNUSED(
medge->flag |= ME_EDGERENDER;
MEM_freeN(edsort);
+
+ /*set edge members of mloops*/
+ medge= *alledge;
+ for (a=0; a<*_totedge; a++, medge++) {
+ BLI_edgehash_insert(hash, medge->v1, medge->v2, SET_INT_IN_POINTER(a));
+ }
+
+ mpoly = allpoly;
+ for (a=0; a<totpoly; a++, mpoly++) {
+ mloop = allloop + mpoly->loopstart;
+ for (b=0; b<mpoly->totloop; b++) {
+ int v1, v2;
+
+ v1 = mloop[b].v;
+ v2 = mloop[(b+1)%mpoly->loopstart].v;
+ mloop[b].e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(hash, v1, v2));
+ }
+ }
+
+ BLI_edgehash_free(hash, NULL);
}
void make_edges(Mesh *me, int old)
@@ -1026,7 +1055,7 @@ void make_edges(Mesh *me, int old)
MEdge *medge;
int totedge=0;
- make_edges_mdata(me->mvert, me->mface, me->totvert, me->totface, old, &medge, &totedge);
+ make_edges_mdata(me->mvert, me->mface, me->mloop, me->mpoly, me->totvert, me->totface, me->totloop, me->totpoly, old, &medge, &totedge);
if(totedge==0) {
/* flag that mesh has edges */
me->medge = medge;
@@ -1100,9 +1129,7 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
verts= dl->verts;
while(a--) {
VECCOPY(mvert->co, verts);
- mvert->no[0]= (short int)(nors[0]*32767.0);
- mvert->no[1]= (short int)(nors[1]*32767.0);
- mvert->no[2]= (short int)(nors[2]*32767.0);
+ normal_float_to_short_v3(mvert->no, nors);
mvert++;
nors+= 3;
verts+= 3;
@@ -1124,31 +1151,37 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
}
make_edges(me, 0); // all edges
- }
+ convert_mfaces_to_mpolys(me);
+ }
}
/* Initialize mverts, medges and, faces for converting nurbs to mesh and derived mesh */
/* return non-zero on error */
int nurbs_to_mdata(Object *ob, MVert **allvert, int *totvert,
- MEdge **alledge, int *totedge, MFace **allface, int *totface)
+ MEdge **alledge, int *totedge, MFace **allface, MLoop **allloop, MPoly **allpoly,
+ int *totface, int *totloop, int *totpoly)
{
return nurbs_to_mdata_customdb(ob, &ob->disp,
- allvert, totvert, alledge, totedge, allface, totface);
+ allvert, totvert, alledge, totedge, allface, allloop, allpoly, totface, totloop, totpoly);
}
/* Initialize mverts, medges and, faces for converting nurbs to mesh and derived mesh */
/* use specified dispbase */
int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int *_totvert,
- MEdge **alledge, int *_totedge, MFace **allface, int *_totface)
+ MEdge **alledge, int *_totedge, MFace **allface, MLoop **allloop, MPoly **allpoly,
+ int *_totface, int *_totloop, int *_totpoly)
{
DispList *dl;
Curve *cu;
MVert *mvert;
MFace *mface;
+ MPoly *mpoly;
+ MLoop *mloop;
float *data;
int a, b, ofs, vertcount, startvert, totvert=0, totvlak=0;
int p1, p2, p3, p4, *index;
int conv_polys= 0;
+ int i, j;
cu= ob->data;
@@ -1186,8 +1219,10 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
}
*allvert= mvert= MEM_callocN(sizeof (MVert) * totvert, "nurbs_init mvert");
- *allface= mface= MEM_callocN(sizeof (MVert) * totvlak, "nurbs_init mface");
-
+ *allface= mface= MEM_callocN(sizeof (MFace) * totvlak, "nurbs_init mface");
+ *allloop = mloop = MEM_callocN(sizeof(MLoop) * totvlak * 4, "nurbs_init mloop");
+ *allpoly = mpoly = MEM_callocN(sizeof(MPoly) * totvlak * 4, "nurbs_init mloop");
+
/* verts and faces */
vertcount= 0;
@@ -1325,11 +1360,34 @@ int nurbs_to_mdata_customdb(Object *ob, ListBase *dispbase, MVert **allvert, int
dl= dl->next;
}
-
+
+ mface= *allface;
+ j = 0;
+ for (i=0; i<totvert; i++, mpoly++, mface++) {
+ int k;
+
+ if (!mface->v3) {
+ mpoly--;
+ i--;
+ continue;
+ }
+
+ if (mface >= *allface + totvlak)
+ break;
+
+ mpoly->loopstart= j;
+ mpoly->totloop= mface->v4 ? 4 : 3;
+ for (k=0; k<mpoly->totloop; k++, mloop++) {
+ mloop->v = (&mface->v1)[k];
+ }
+ }
+
+ *_totpoly= i;
+ *_totloop= j;
*_totvert= totvert;
*_totface= totvlak;
- make_edges_mdata(*allvert, *allface, totvert, totvlak, 0, alledge, _totedge);
+ make_edges_mdata(*allvert, *allface, *allloop, *allpoly, totvert, totvlak, *_totloop, *_totpoly, 0, alledge, _totedge);
mfaces_strip_loose(*allface, _totface);
return 0;
@@ -1346,12 +1404,14 @@ void nurbs_to_mesh(Object *ob)
MVert *allvert= NULL;
MEdge *alledge= NULL;
MFace *allface= NULL;
- int totvert, totedge, totface;
+ MLoop *allloop = NULL;
+ MPoly *allpoly = NULL;
+ int totvert, totedge, totface, totloop, totpoly;
cu= ob->data;
if (dm == NULL) {
- if (nurbs_to_mdata (ob, &allvert, &totvert, &alledge, &totedge, &allface, &totface) != 0) {
+ if (nurbs_to_mdata (ob, &allvert, &totvert, &alledge, &totedge, &allface, &allloop, &allpoly, &totface, &totloop, &totpoly) != 0) {
/* Error initializing */
return;
}
@@ -1361,12 +1421,16 @@ void nurbs_to_mesh(Object *ob)
me->totvert= totvert;
me->totface= totface;
me->totedge= totedge;
+ me->totloop = totloop;
+ me->totpoly = totpoly;
me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_ASSIGN, allvert, me->totvert);
- me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, allface, me->totface);
me->medge= CustomData_add_layer(&me->edata, CD_MEDGE, CD_ASSIGN, alledge, me->totedge);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_ASSIGN, allface, me->totface);
+ me->mloop= CustomData_add_layer(&me->ldata, CD_MLOOP, CD_ASSIGN, allloop, me->totloop);
+ me->mpoly= CustomData_add_layer(&me->pdata, CD_MPOLY, CD_ASSIGN, allpoly, me->totpoly);
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+ mesh_calc_normals(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
} else {
me= add_mesh("Mesh");
DM_to_mesh(dm, me);
@@ -1619,34 +1683,112 @@ void mesh_set_smooth_flag(Object *meshOb, int enableSmooth)
mf->flag &= ~ME_SMOOTH;
}
}
+
+ mesh_calc_normals(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop,
+ me->totpoly, NULL, NULL, 0, NULL, NULL);
}
-void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, float **faceNors_r)
+void mesh_calc_normals(MVert *mverts, int numVerts, MLoop *mloop, MPoly *mpolys,
+ int UNUSED(numLoops), int numPolys, float (*polyNors_r)[3], MFace *mfaces, int numFaces,
+ int *origIndexFace, float (*faceNors_r)[3])
+{
+ float (*pnors)[3] = polyNors_r, (*fnors)[3] = faceNors_r;
+ float (*tnorms)[3] = NULL;
+ int i, j, *origIndex;
+ MFace *mf;
+ MPoly *mp;
+ MLoop *ml;
+
+ if(numPolys == 0) return;
+
+ /*first go through and calculate normals for all the polys*/
+ tnorms = MEM_callocN(sizeof(float)*3*numVerts, "tnorms cdderivedmesh.c");
+ if (!pnors)
+ pnors = MEM_callocN(sizeof(float)*3*numPolys, "poly_nors cdderivedmesh.c");
+ if (!fnors)
+ fnors = MEM_callocN(sizeof(float)*3*numFaces, "face nors cdderivedmesh.c");
+
+ mp = mpolys;
+ for (i=0; i<numPolys; i++, mp++) {
+ mesh_calc_poly_normal(mp, mloop+mp->loopstart, mverts, pnors[i]);
+
+ ml = mloop + mp->loopstart;
+ /*this is kindof hackish, probably need to calculate quads around face center for
+ ngons, not this weird quad-fitting thing I've got going here*/
+ for (j=0; j<mp->totloop; j += 4, ml++) {
+ int v1, v2, v3, v4;
+
+ v1 = ml->v;
+ v2 = mloop[mp->loopstart+(j+1)%mp->totloop].v;
+ v3 = mloop[mp->loopstart+(j+2)%mp->totloop].v;
+ v4 = mloop[mp->loopstart+(j+3)%mp->totloop].v;
+
+ accumulate_vertex_normals(tnorms[v1], tnorms[v2], tnorms[v3], v4 != v1 ? tnorms[v4] : NULL,
+ pnors[i], mverts[v1].co, mverts[v2].co, mverts[v3].co, v4!=v1 ? mverts[v4].co : NULL);
+
+ }
+ }
+
+ /* following Mesh convention; we use vertex coordinate itself for normal in this case */
+ for(i=0; i<numVerts; i++) {
+ MVert *mv= &mverts[i];
+ float *no= tnorms[i];
+
+ if(normalize_v3(no) == 0.0f)
+ normalize_v3_v3(no, mv->co);
+
+ normal_float_to_short_v3(mv->no, no);
+ }
+
+ if (origIndexFace && fnors==faceNors_r && numFaces) {
+ mf = mfaces;
+ for (i=0; i<numFaces; i++, mf++, origIndexFace++) {
+ if (origIndex < numPolys) {
+ VECCOPY(fnors[i], tnorms[*origIndexFace]);
+ } else {
+ /*eek, we're not corrusponding to polys*/
+ printf("error in mesh_calc_normals; tesselation face indices are incorrect. normals may look bad.\n");
+ }
+ }
+ }
+
+ MEM_freeN(tnorms);
+ if (fnors != faceNors_r)
+ MEM_freeN(fnors);
+ if (pnors != polyNors_r)
+ MEM_freeN(pnors);
+
+ fnors = pnors = NULL;
+
+}
+
+void mesh_calc_tessface_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces, float (*faceNors_r)[3])
{
float (*tnorms)[3]= MEM_callocN(numVerts*sizeof(*tnorms), "tnorms");
- float *fnors= MEM_callocN(sizeof(*fnors)*3*numFaces, "meshnormals");
+ float (*fnors)[3]= (faceNors_r)? faceNors_r: MEM_callocN(sizeof(*fnors)*numFaces, "meshnormals");
int i;
- for (i=0; i<numFaces; i++) {
+ for(i=0; i<numFaces; i++) {
MFace *mf= &mfaces[i];
- float *f_no= &fnors[i*3];
+ float *f_no= fnors[i];
+ float *n4 = (mf->v4)? tnorms[mf->v4]: NULL;
+ float *c4 = (mf->v4)? mverts[mf->v4].co: NULL;
- if (mf->v4)
- normal_quad_v3( f_no,mverts[mf->v1].co, mverts[mf->v2].co, mverts[mf->v3].co, mverts[mf->v4].co);
+ if(mf->v4)
+ normal_quad_v3(f_no, mverts[mf->v1].co, mverts[mf->v2].co, mverts[mf->v3].co, mverts[mf->v4].co);
else
- normal_tri_v3( f_no,mverts[mf->v1].co, mverts[mf->v2].co, mverts[mf->v3].co);
-
- add_v3_v3(tnorms[mf->v1], f_no);
- add_v3_v3(tnorms[mf->v2], f_no);
- add_v3_v3(tnorms[mf->v3], f_no);
- if (mf->v4)
- add_v3_v3(tnorms[mf->v4], f_no);
+ normal_tri_v3(f_no, mverts[mf->v1].co, mverts[mf->v2].co, mverts[mf->v3].co);
+
+ accumulate_vertex_normals(tnorms[mf->v1], tnorms[mf->v2], tnorms[mf->v3], n4,
+ f_no, mverts[mf->v1].co, mverts[mf->v2].co, mverts[mf->v3].co, c4);
}
- for (i=0; i<numVerts; i++) {
+
+ /* following Mesh convention; we use vertex coordinate itself for normal in this case */
+ for(i=0; i<numVerts; i++) {
MVert *mv= &mverts[i];
float *no= tnorms[i];
- if (normalize_v3(no)==0.0)
+ if(normalize_v3(no) == 0.0f)
normalize_v3_v3(no, mv->co);
normal_float_to_short_v3(mv->no, no);
@@ -1654,11 +1796,147 @@ void mesh_calc_normals(MVert *mverts, int numVerts, MFace *mfaces, int numFaces,
MEM_freeN(tnorms);
- if (faceNors_r) {
- *faceNors_r = fnors;
- } else {
+ if(fnors != faceNors_r)
MEM_freeN(fnors);
+}
+
+
+void bmesh_corners_to_loops(Mesh *me, int findex, int loopstart, int numTex, int numCol)
+{
+ MTFace *texface;
+ MTexPoly *texpoly;
+ MCol *mcol;
+ MLoopCol *mloopcol;
+ MLoopUV *mloopuv;
+ MFace *mf;
+ int i;
+
+ for(i=0; i < numTex; i++){
+ texface = CustomData_get_n(&me->fdata, CD_MTFACE, findex, i);
+ texpoly = CustomData_get_n(&me->pdata, CD_MTEXPOLY, findex, i);
+ mf = me->mface + findex;
+
+ texpoly->tpage = texface->tpage;
+ texpoly->flag = texface->flag;
+ texpoly->transp = texface->transp;
+ texpoly->mode = texface->mode;
+ texpoly->tile = texface->tile;
+ texpoly->unwrap = texface->unwrap;
+
+ mloopuv = CustomData_get_n(&me->ldata, CD_MLOOPUV, loopstart, i);
+ mloopuv->uv[0] = texface->uv[0][0]; mloopuv->uv[1] = texface->uv[0][1]; mloopuv++;
+ mloopuv->uv[0] = texface->uv[1][0]; mloopuv->uv[1] = texface->uv[1][1]; mloopuv++;
+ mloopuv->uv[0] = texface->uv[2][0]; mloopuv->uv[1] = texface->uv[2][1]; mloopuv++;
+
+ if (mf->v4) {
+ mloopuv->uv[0] = texface->uv[3][0]; mloopuv->uv[1] = texface->uv[3][1]; mloopuv++;
+ }
}
+
+ for(i=0; i < numCol; i++){
+ mf = me->mface + findex;
+ mloopcol = CustomData_get_n(&me->ldata, CD_MLOOPCOL, loopstart, i);
+ mcol = CustomData_get_n(&me->fdata, CD_MCOL, findex, i);
+
+ mloopcol->r = mcol[0].r; mloopcol->g = mcol[0].g; mloopcol->b = mcol[0].b; mloopcol->a = mcol[0].a; mloopcol++;
+ mloopcol->r = mcol[1].r; mloopcol->g = mcol[1].g; mloopcol->b = mcol[1].b; mloopcol->a = mcol[1].a; mloopcol++;
+ mloopcol->r = mcol[2].r; mloopcol->g = mcol[2].g; mloopcol->b = mcol[2].b; mloopcol->a = mcol[2].a; mloopcol++;
+ if (mf->v4) {
+ mloopcol->r = mcol[3].r; mloopcol->g = mcol[3].g; mloopcol->b = mcol[3].b; mloopcol->a = mcol[3].a; mloopcol++;
+ }
+ }
+
+ if (CustomData_has_layer(&me->fdata, CD_MDISPS)) {
+ MDisps *ld = CustomData_get(&me->ldata, loopstart, CD_MDISPS);
+ MDisps *fd = CustomData_get(&me->fdata, findex, CD_MDISPS);
+ float (*disps)[3] = fd->disps;
+ int i, tot = mf->v4 ? 4 : 3;
+ int side, corners;
+
+ corners = multires_mdisp_corners(fd);
+ side = sqrt(fd->totdisp / corners);
+
+ for (i=0; i<tot; i++, disps += side*side, ld++) {
+ ld->totdisp = side*side;
+
+ if (ld->disps)
+ BLI_cellalloc_free(ld->disps);
+
+ ld->disps = BLI_cellalloc_malloc(sizeof(float)*3*side*side, "converted loop mdisps");
+ memcpy(ld->disps, disps, sizeof(float)*3*side*side);
+ }
+ }
+}
+
+void convert_mfaces_to_mpolys(Mesh *mesh)
+{
+ MFace *mf;
+ MLoop *ml;
+ MPoly *mp;
+ MEdge *me;
+ EdgeHash *eh;
+ int numTex, numCol;
+ int i, j, totloop;
+
+ mesh->totpoly = mesh->totface;
+ mesh->mpoly = MEM_callocN(sizeof(MPoly)*mesh->totpoly, "mpoly converted");
+ CustomData_add_layer(&mesh->pdata, CD_MPOLY, CD_ASSIGN, mesh->mpoly, mesh->totpoly);
+
+ numTex = CustomData_number_of_layers(&mesh->fdata, CD_MTFACE);
+ numCol = CustomData_number_of_layers(&mesh->fdata, CD_MCOL);
+
+ totloop = 0;
+ mf = mesh->mface;
+ for (i=0; i<mesh->totface; i++, mf++) {
+ totloop += mf->v4 ? 4 : 3;
+ }
+
+ mesh->totloop = totloop;
+ mesh->mloop = MEM_callocN(sizeof(MLoop)*mesh->totloop, "mloop converted");
+
+ CustomData_add_layer(&mesh->ldata, CD_MLOOP, CD_ASSIGN, mesh->mloop, totloop);
+ CustomData_to_bmeshpoly(&mesh->fdata, &mesh->pdata, &mesh->ldata,
+ mesh->totloop, mesh->totpoly);
+
+ eh = BLI_edgehash_new();
+
+ /*build edge hash*/
+ me = mesh->medge;
+ for (i=0; i<mesh->totedge; i++, me++) {
+ BLI_edgehash_insert(eh, me->v1, me->v2, SET_INT_IN_POINTER(i));
+ }
+
+ j = 0; /*current loop index*/
+ ml = mesh->mloop;
+ mf = mesh->mface;
+ mp = mesh->mpoly;
+ for (i=0; i<mesh->totface; i++, mf++, mp++) {
+ mp->loopstart = j;
+
+ mp->totloop = mf->v4 ? 4 : 3;
+
+ mp->mat_nr = mf->mat_nr;
+ mp->flag = mf->flag;
+
+ #define ML(v1, v2) {ml->v = mf->v1; ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, mf->v1, mf->v2)); ml++; j++;}
+
+ ML(v1, v2);
+ ML(v2, v3);
+ if (mf->v4) {
+ ML(v3, v4);
+ ML(v4, v1);
+ } else {
+ ML(v3, v1);
+ }
+
+ #undef ML
+
+ bmesh_corners_to_loops(mesh, i, mp->loopstart, numTex, numCol);
+ }
+
+ /*BMESH_TODO now to deal with fgons*/
+
+ BLI_edgehash_free(eh, NULL);
}
float (*mesh_getVertexCos(Mesh *me, int *numVerts_r))[3]
@@ -1747,7 +2025,7 @@ UvVertMap *make_uv_vert_map(struct MFace *mface, struct MTFace *tface, unsigned
sub_v2_v2v2(uvdiff, uv2, uv);
- if(fabs(uv[0]-uv2[0]) < limit[0] && fabs(uv[1]-uv2[1]) < limit[1]) {
+ if(fabsf(uv[0]-uv2[0]) < limit[0] && fabsf(uv[1]-uv2[1]) < limit[1]) {
if(lastv) lastv->next= next;
else vlist= next;
iterv->next= newvlist;
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c
index 0821b4188fe..70928ab7bbb 100644
--- a/source/blender/blenkernel/intern/mesh_validate.c
+++ b/source/blender/blenkernel/intern/mesh_validate.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/mesh_validate.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -112,7 +117,7 @@ static int search_face_cmp(const void *v1, const void *v2)
}
-int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), int totvert, MEdge *medges, int totedge, MFace *mfaces, int totface, const short do_verbose, const short do_fixes)
+int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), unsigned int totvert, MEdge *medges, unsigned int totedge, MFace *mfaces, unsigned int totface, const short do_verbose, const short do_fixes)
{
# define PRINT if(do_verbose) printf
# define REMOVE_EDGE_TAG(_med) { _med->v2= _med->v1; do_edge_free= 1; }
@@ -122,7 +127,7 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), int totvert, MEdge
MEdge *med;
MFace *mf;
MFace *mf_prev;
- int i;
+ unsigned int i;
int do_face_free= FALSE;
int do_edge_free= FALSE;
@@ -134,7 +139,7 @@ int BKE_mesh_validate_arrays(Mesh *me, MVert *UNUSED(mverts), int totvert, MEdge
SortFace *sort_faces= MEM_callocN(sizeof(SortFace) * totface, "search faces");
SortFace *sf;
SortFace *sf_prev;
- int totsortface= 0;
+ unsigned int totsortface= 0;
BLI_assert(!(do_fixes && me == NULL));
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 631e5fe2cb3..372eb1fe6f1 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -34,6 +34,11 @@
*
*/
+/** \file blender/blenkernel/intern/modifier.c
+ * \ingroup bke
+ */
+
+
#include <stddef.h>
#include <string.h>
#include <stdarg.h>
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index fc1b43e882e..14af46ff927 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/multires.c
+ * \ingroup bke
+ */
+
+
#include "MEM_guardedalloc.h"
#include "DNA_mesh_types.h"
@@ -916,7 +921,7 @@ static void multiresModifier_update(DerivedMesh *dm)
void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to)
{
- CCGDerivedMesh *ccgdm, *subsurf=NULL;
+ DerivedMesh *ccgdm, *subsurf=NULL;
DMGridData **gridData, **subGridData=NULL;
MPoly *mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
MDisps *mdisps;
@@ -934,14 +939,14 @@ void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to)
}
totlvl = mmd->totlvl;
- ccgdm = (CCGDerivedMesh*)multires_dm_create_local(ob, dm, totlvl, totlvl, mmd->simple);
+ ccgdm = multires_dm_create_local(ob, dm, totlvl, totlvl, mmd->simple);
subsurf = subsurf_dm_create_local(ob, dm, totlvl,
mmd->simple, mmd->flags & eMultiresModifierFlag_ControlEdges);
- numGrids = subsurf->dm.getNumGrids(subsurf);
- gridSize = subsurf->dm.getGridSize(subsurf);
- gridData = subsurf->dm.getGridData(subsurf);
+ numGrids = subsurf->getNumGrids(subsurf);
+ gridSize = subsurf->getGridSize(subsurf);
+ gridData = subsurf->getGridData(subsurf);
subGridData = MEM_callocN(sizeof(DMGridData*)*numGrids, "subGridData*");
@@ -951,9 +956,9 @@ void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to)
}
/*numGrids = ccgdm->dm->getNumGrids((DerivedMesh*)ccgdm);*/ /*UNUSED*/
- gridSize = ccgdm->dm.getGridSize((DerivedMesh*)ccgdm);
- gridData = ccgdm->dm.getGridData((DerivedMesh*)ccgdm);
- gridOffset = ccgdm->dm.getGridOffset((DerivedMesh*)ccgdm);
+ gridSize = ccgdm->getGridSize((DerivedMesh*)ccgdm);
+ gridData = ccgdm->getGridData((DerivedMesh*)ccgdm);
+ gridOffset = ccgdm->getGridOffset((DerivedMesh*)ccgdm);
dGridSize = multires_side_tot[totlvl];
dSkip = (dGridSize-1)/(gridSize-1);
@@ -1026,12 +1031,12 @@ void multires_set_space(DerivedMesh *dm, Object *ob, int from, int to)
cleanup:
if (subsurf) {
- subsurf->dm.needsFree = 1;
- subsurf->dm.release(subsurf);
+ subsurf->needsFree = 1;
+ subsurf->release(subsurf);
}
- ccgdm->dm.needsFree = 1;
- ccgdm->dm.release((DerivedMesh*)ccgdm);
+ ccgdm->needsFree = 1;
+ ccgdm->release(ccgdm);
}
void multires_stitch_grids(Object *ob)
diff --git a/source/blender/blenkernel/intern/nla.c b/source/blender/blenkernel/intern/nla.c
index df012c47f66..c02b5dda9ce 100644
--- a/source/blender/blenkernel/intern/nla.c
+++ b/source/blender/blenkernel/intern/nla.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/nla.c
+ * \ingroup bke
+ */
+
+
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
@@ -291,7 +296,7 @@ NlaStrip *add_nlastrip (bAction *act)
calc_action_range(strip->act, &strip->actstart, &strip->actend, 0);
strip->start = strip->actstart;
- strip->end = (IS_EQ(strip->actstart, strip->actend)) ? (strip->actstart + 1.0f): (strip->actend);
+ strip->end = (IS_EQF(strip->actstart, strip->actend)) ? (strip->actstart + 1.0f): (strip->actend);
/* strip should be referenced as-is */
strip->scale= 1.0f;
@@ -342,19 +347,20 @@ NlaStrip *add_nlastrip_to_stack (AnimData *adt, bAction *act)
*/
static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short mode)
{
- float actlength, repeat, scale;
+ float actlength, scale;
+ // float repeat; // UNUSED
/* get number of repeats */
- if (IS_EQ(strip->repeat, 0.0f)) strip->repeat = 1.0f;
- repeat = strip->repeat;
+ if (IS_EQF(strip->repeat, 0.0f)) strip->repeat = 1.0f;
+ // repeat = strip->repeat; // UNUSED
/* scaling */
- if (IS_EQ(strip->scale, 0.0f)) strip->scale= 1.0f;
+ if (IS_EQF(strip->scale, 0.0f)) strip->scale= 1.0f;
scale = (float)fabs(strip->scale); /* scale must be positive - we've got a special flag for reversing */
/* length of referenced action */
actlength = strip->actend - strip->actstart;
- if (IS_EQ(actlength, 0.0f)) actlength = 1.0f;
+ if (IS_EQF(actlength, 0.0f)) actlength = 1.0f;
/* reversed = play strip backwards */
if (strip->flag & NLASTRIP_FLAG_REVERSE) {
@@ -366,7 +372,7 @@ static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short
return (strip->end + (strip->actstart * scale - cframe)) / scale;
}
else /* if (mode == NLATIME_CONVERT_EVAL) */{
- if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, ((int)strip->repeat))) {
+ if (IS_EQF(cframe, strip->end) && IS_EQF(strip->repeat, ((int)strip->repeat))) {
/* this case prevents the motion snapping back to the first frame at the end of the strip
* by catching the case where repeats is a whole number, which means that the end of the strip
* could also be interpreted as the end of the start of a repeat
@@ -377,7 +383,7 @@ static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short
/* - the 'fmod(..., actlength*scale)' is needed to get the repeats working
* - the '/ scale' is needed to ensure that scaling influences the timing within the repeat
*/
- return strip->actend - fmod(cframe - strip->start, actlength*scale) / scale;
+ return strip->actend - fmodf(cframe - strip->start, actlength*scale) / scale;
}
}
}
@@ -389,7 +395,7 @@ static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short
return strip->actstart + (cframe - strip->start) / scale;
}
else /* if (mode == NLATIME_CONVERT_EVAL) */{
- if (IS_EQ(cframe, strip->end) && IS_EQ(strip->repeat, ((int)strip->repeat))) {
+ if (IS_EQF(cframe, strip->end) && IS_EQF(strip->repeat, ((int)strip->repeat))) {
/* this case prevents the motion snapping back to the first frame at the end of the strip
* by catching the case where repeats is a whole number, which means that the end of the strip
* could also be interpreted as the end of the start of a repeat
@@ -400,7 +406,7 @@ static float nlastrip_get_frame_actionclip (NlaStrip *strip, float cframe, short
/* - the 'fmod(..., actlength*scale)' is needed to get the repeats working
* - the '/ scale' is needed to ensure that scaling influences the timing within the repeat
*/
- return strip->actstart + fmod(cframe - strip->start, actlength*scale) / scale;
+ return strip->actstart + fmodf(cframe - strip->start, actlength*scale) / scale;
}
}
}
@@ -502,7 +508,7 @@ short BKE_nlastrips_has_space (ListBase *strips, float start, float end)
NlaStrip *strip;
/* sanity checks */
- if ((strips == NULL) || IS_EQ(start, end))
+ if ((strips == NULL) || IS_EQF(start, end))
return 0;
if (start > end) {
puts("BKE_nlastrips_has_space() error... start and end arguments swapped");
@@ -795,13 +801,13 @@ void BKE_nlameta_flush_transforms (NlaStrip *mstrip)
* don't flush if nothing changed yet
* TODO: maybe we need a flag to say always flush?
*/
- if (IS_EQ(oStart, mstrip->start) && IS_EQ(oEnd, mstrip->end))
+ if (IS_EQF(oStart, mstrip->start) && IS_EQF(oEnd, mstrip->end))
return;
/* check if scale changed */
oLen = oEnd - oStart;
nLen = mstrip->end - mstrip->start;
- if (IS_EQ(nLen, oLen) == 0)
+ if (IS_EQF(nLen, oLen) == 0)
scaleChanged= 1;
/* for each child-strip, calculate new start/end points based on this new info */
@@ -922,7 +928,7 @@ short BKE_nlatrack_has_space (NlaTrack *nlt, float start, float end)
* - track must be editable
* - bounds cannot be equal (0-length is nasty)
*/
- if ((nlt == NULL) || (nlt->flag & NLATRACK_PROTECTED) || IS_EQ(start, end))
+ if ((nlt == NULL) || (nlt->flag & NLATRACK_PROTECTED) || IS_EQF(start, end))
return 0;
if (start > end) {
@@ -1039,7 +1045,7 @@ short BKE_nlastrip_within_bounds (NlaStrip *strip, float min, float max)
const float boundsLen= (float)fabs(max - min);
/* sanity checks */
- if ((strip == NULL) || IS_EQ(stripLen, 0.0f) || IS_EQ(boundsLen, 0.0f))
+ if ((strip == NULL) || IS_EQF(stripLen, 0.0f) || IS_EQF(boundsLen, 0.0f))
return 0;
/* only ok if at least part of the strip is within the bounding window
@@ -1079,12 +1085,12 @@ void BKE_nlastrip_recalculate_bounds (NlaStrip *strip)
/* calculate new length factors */
actlen= strip->actend - strip->actstart;
- if (IS_EQ(actlen, 0.0f)) actlen= 1.0f;
+ if (IS_EQF(actlen, 0.0f)) actlen= 1.0f;
mapping= strip->scale * strip->repeat;
/* adjust endpoint of strip in response to this */
- if (IS_EQ(mapping, 0.0f) == 0)
+ if (IS_EQF(mapping, 0.0f) == 0)
strip->end = (actlen * mapping) + strip->start;
}
@@ -1308,11 +1314,11 @@ static void nlastrip_get_endpoint_overlaps (NlaStrip *strip, NlaTrack *track, fl
/* if this strip is not part of an island of continuous strips, it can be used
* - this check needs to be done for each end of the strip we try and use...
*/
- if ((nls->next == NULL) || IS_EQ(nls->next->start, nls->end)==0) {
+ if ((nls->next == NULL) || IS_EQF(nls->next->start, nls->end)==0) {
if ((nls->end > strip->start) && (nls->end < strip->end))
*start= &nls->end;
}
- if ((nls->prev == NULL) || IS_EQ(nls->prev->end, nls->start)==0) {
+ if ((nls->prev == NULL) || IS_EQF(nls->prev->end, nls->start)==0) {
if ((nls->start < strip->end) && (nls->start > strip->start))
*end= &nls->start;
}
@@ -1344,7 +1350,7 @@ static void BKE_nlastrip_validate_autoblends (NlaTrack *nlt, NlaStrip *nls)
* is directly followed/preceeded by another strip, forming an
* 'island' of continuous strips
*/
- if ( (ps || ns) && ((nls->prev == NULL) || IS_EQ(nls->prev->end, nls->start)==0) )
+ if ( (ps || ns) && ((nls->prev == NULL) || IS_EQF(nls->prev->end, nls->start)==0) )
{
/* start overlaps - pick the largest overlap */
if ( ((ps && ns) && (*ps > *ns)) || (ps) )
@@ -1355,7 +1361,7 @@ static void BKE_nlastrip_validate_autoblends (NlaTrack *nlt, NlaStrip *nls)
else /* no overlap allowed/needed */
nls->blendin= 0.0f;
- if ( (pe || ne) && ((nls->next == NULL) || IS_EQ(nls->next->start, nls->end)==0) )
+ if ( (pe || ne) && ((nls->next == NULL) || IS_EQF(nls->next->start, nls->end)==0) )
{
/* end overlaps - pick the largest overlap */
if ( ((pe && ne) && (*pe > *ne)) || (pe) )
@@ -1494,7 +1500,7 @@ short BKE_nla_tweakmode_enter (AnimData *adt)
if ELEM3(NULL, activeTrack, activeStrip, activeStrip->act) {
if (G.f & G_DEBUG) {
printf("NLA tweakmode enter - neither active requirement found \n");
- printf("\tactiveTrack = %p, activeStrip = %p \n", activeTrack, activeStrip);
+ printf("\tactiveTrack = %p, activeStrip = %p \n", (void *)activeTrack, (void *)activeStrip);
}
return 0;
}
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index 53bac9171ae..03fdcdd0c91 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/node.c
+ * \ingroup bke
+ */
+
+
#ifdef WITH_PYTHON
#include <Python.h>
#endif
@@ -897,6 +902,7 @@ void nodeGroupRemoveSocket(bNodeTree *ngroup, bNodeSocket *gsock, int in_out)
case SOCK_IN: BLI_remlink(&ngroup->inputs, gsock); break;
case SOCK_OUT: BLI_remlink(&ngroup->outputs, gsock); break;
}
+ MEM_freeN(gsock);
}
/* ************** Add stuff ********** */
@@ -1183,6 +1189,12 @@ bNodeTree *ntreeCopyTree(bNodeTree *ntree)
newtree= MEM_dupallocN(ntree);
copy_libblock_data(&newtree->id, &ntree->id, TRUE); /* copy animdata and ID props */
}
+
+ /* in case a running nodetree is copied */
+ newtree->init &= ~(NTREE_EXEC_INIT);
+ newtree->threadstack= NULL;
+ newtree->stack= NULL;
+
newtree->nodes.first= newtree->nodes.last= NULL;
newtree->links.first= newtree->links.last= NULL;
@@ -1314,7 +1326,7 @@ void ntreeClearPreview(bNodeTree *ntree)
/* hack warning! this function is only used for shader previews, and
since it gets called multiple times per pixel for Ztransp we only
add the color once. Preview gets cleared before it starts render though */
-void nodeAddToPreview(bNode *node, float *col, int x, int y)
+void nodeAddToPreview(bNode *node, float *col, int x, int y, int do_manage)
{
bNodePreview *preview= node->preview;
if(preview) {
@@ -1322,7 +1334,7 @@ void nodeAddToPreview(bNode *node, float *col, int x, int y)
if(x<preview->xsize && y<preview->ysize) {
unsigned char *tar= preview->rect+ 4*((preview->xsize*y) + x);
- if(TRUE) {
+ if(do_manage) {
tar[0]= FTOCHAR(linearrgb_to_srgb(col[0]));
tar[1]= FTOCHAR(linearrgb_to_srgb(col[1]));
tar[2]= FTOCHAR(linearrgb_to_srgb(col[2]));
@@ -1748,32 +1760,29 @@ void ntreeSocketUseFlags(bNodeTree *ntree)
/* ************** dependency stuff *********** */
/* node is guaranteed to be not checked before */
-static int node_recurs_check(bNode *node, bNode ***nsort, int level)
+static int node_recurs_check(bNode *node, bNode ***nsort)
{
bNode *fromnode;
bNodeSocket *sock;
- int has_inputlinks= 0;
+ int level = 0xFFF;
node->done= 1;
- level++;
for(sock= node->inputs.first; sock; sock= sock->next) {
if(sock->link) {
- has_inputlinks= 1;
fromnode= sock->link->fromnode;
- if(fromnode && fromnode->done==0) {
- fromnode->level= node_recurs_check(fromnode, nsort, level);
+ if(fromnode) {
+ if (fromnode->done==0)
+ fromnode->level= node_recurs_check(fromnode, nsort);
+ if (fromnode->level <= level)
+ level = fromnode->level - 1;
}
}
}
-// printf("node sort %s level %d\n", node->name, level);
**nsort= node;
(*nsort)++;
- if(has_inputlinks)
- return level;
- else
- return 0xFFF;
+ return level;
}
@@ -1862,7 +1871,7 @@ void ntreeSolveOrder(bNodeTree *ntree)
/* recursive check */
for(node= ntree->nodes.first; node; node= node->next) {
if(node->done==0) {
- node->level= node_recurs_check(node, &nsort, 0);
+ node->level= node_recurs_check(node, &nsort);
}
}
@@ -2318,8 +2327,15 @@ void ntreeBeginExecTree(bNodeTree *ntree)
for(sock= node->inputs.first; sock; sock= sock->next) {
ns = get_socket_stack(ntree->stack, sock, NULL);
- if (ns)
+ if (ns) {
ns->hasoutput = 1;
+
+ /* sock type is needed to detect rgba or value or vector types */
+ if(sock->link && sock->link->fromsock)
+ ns->sockettype= sock->link->fromsock->type;
+ else
+ sock->ns.sockettype= sock->type;
+ }
if(sock->link) {
bNodeLink *link= sock->link;
@@ -2450,7 +2466,7 @@ static int node_only_value(bNode *node)
if(node->inputs.first && node->type==CMP_NODE_MAP_VALUE) {
int retval= 1;
for(sock= node->inputs.first; sock; sock= sock->next) {
- if(sock->link)
+ if(sock->link && sock->link->fromnode)
retval &= node_only_value(sock->link->fromnode);
}
return retval;
@@ -2608,7 +2624,7 @@ static void freeExecutableNode(bNodeTree *ntree)
for(node= ntree->nodes.first; node; node= node->next) {
if((node->exec & NODE_FINISHED)==0) {
for(sock= node->inputs.first; sock; sock= sock->next)
- if(sock->link)
+ if(sock->link && sock->link->fromnode)
sock->link->fromnode->exec &= ~NODE_FREEBUFS;
}
}
@@ -2709,7 +2725,7 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
node= getExecutableNode(ntree);
if(node) {
if(ntree->progress && totnode)
- ntree->progress(ntree->prh, (1.0 - curnode/(float)totnode));
+ ntree->progress(ntree->prh, (1.0f - curnode/(float)totnode));
if(ntree->stats_draw) {
char str[64];
sprintf(str, "Compositing %d %s", curnode, node->name);
@@ -2759,8 +2775,8 @@ void ntreeCompositExecTree(bNodeTree *ntree, RenderData *rd, int do_preview)
/* ********** copy composite tree entirely, to allow threaded exec ******************* */
/* ***************** do NOT execute this in a thread! ****************** */
-/* returns localized composite tree for execution in threads */
-/* local tree then owns all compbufs */
+/* returns localized tree for execution in threads */
+/* local tree then owns all compbufs (for composite) */
bNodeTree *ntreeLocalize(bNodeTree *ntree)
{
bNodeTree *ltree;
@@ -2797,16 +2813,17 @@ bNodeTree *ntreeLocalize(bNodeTree *ntree)
/* end animdata uglyness */
/* ensures only a single output node is enabled */
- ntreeSetOutput(ntree);
+ ntreeSetOutput(ltree);
for(node= ntree->nodes.first; node; node= node->next) {
/* store new_node pointer to original */
node->new_node->new_node= node;
- /* ensure new user input gets handled ok */
- node->need_exec= 0;
if(ntree->type==NTREE_COMPOSIT) {
+ /* ensure new user input gets handled ok, only composites (texture nodes will break, for painting since it uses no tags) */
+ node->need_exec= 0;
+
/* move over the compbufs */
/* right after ntreeCopyTree() oldsock pointers are valid */
@@ -2874,7 +2891,7 @@ void ntreeLocalSync(bNodeTree *localtree, bNodeTree *ntree)
}
}
}
- else if(ntree->type==NTREE_SHADER) {
+ else if(ELEM(ntree->type, NTREE_SHADER, NTREE_TEXTURE)) {
/* copy over contents of previews */
for(lnode= localtree->nodes.first; lnode; lnode= lnode->next) {
if(node_exists(ntree, lnode->new_node)) {
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 9910392e2d0..fae65a366d1 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/object.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <math.h>
#include <stdio.h>
@@ -1407,7 +1412,7 @@ void make_local_object(Object *ob)
if(ob->id.us==1) {
ob->id.lib= NULL;
ob->id.flag= LIB_LOCAL;
- new_id(0, (ID *)ob, 0);
+ new_id(NULL, (ID *)ob, NULL);
}
else {
@@ -1426,9 +1431,9 @@ void make_local_object(Object *ob)
}
if(local && lib==0) {
- ob->id.lib= 0;
+ ob->id.lib= NULL;
ob->id.flag= LIB_LOCAL;
- new_id(0, (ID *)ob, 0);
+ new_id(NULL, (ID *)ob, NULL);
}
else if(local && lib) {
obn= copy_object(ob);
@@ -1436,7 +1441,7 @@ void make_local_object(Object *ob)
sce= bmain->scene.first;
while(sce) {
- if(sce->id.lib==0) {
+ if(sce->id.lib==NULL) {
base= sce->base.first;
while(base) {
if(base->object==ob) {
@@ -1559,6 +1564,9 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
if(gob) {
ob->rotmode= target->rotmode;
mul_m4_m4m4(ob->obmat, target->obmat, gob->obmat);
+ if(gob->dup_group) { /* should always be true */
+ sub_v3_v3(ob->obmat[3], gob->dup_group->dupli_ofs);
+ }
object_apply_mat4(ob, ob->obmat, FALSE, TRUE);
}
else {
@@ -1810,19 +1818,19 @@ static void ob_parcurve(Scene *scene, Object *ob, Object *par, float mat[][4])
* we divide the curvetime calculated in the previous step by the length of the path, to get a time
* factor, which then gets clamped to lie within 0.0 - 1.0 range
*/
- if (IS_EQ(cu->pathlen, 0.0f) == 0)
+ if (IS_EQF(cu->pathlen, 0.0f) == 0)
ctime= cu->ctime / cu->pathlen;
else
ctime= cu->ctime;
-
- CLAMP(ctime, 0.0, 1.0);
+
+ CLAMP(ctime, 0.0f, 1.0f);
}
else {
ctime= scene->r.cfra - give_timeoffset(ob);
- if (IS_EQ(cu->pathlen, 0.0f) == 0)
+ if (IS_EQF(cu->pathlen, 0.0f) == 0)
ctime /= cu->pathlen;
- CLAMP(ctime, 0.0, 1.0);
+ CLAMP(ctime, 0.0f, 1.0f);
}
/* time calculus is correct, now apply distance offset */
@@ -2340,9 +2348,9 @@ void object_get_dimensions(Object *ob, float *value)
mat4_to_size( scale,ob->obmat);
- value[0] = fabs(scale[0]) * (bb->vec[4][0] - bb->vec[0][0]);
- value[1] = fabs(scale[1]) * (bb->vec[2][1] - bb->vec[0][1]);
- value[2] = fabs(scale[2]) * (bb->vec[1][2] - bb->vec[0][2]);
+ value[0] = fabsf(scale[0]) * (bb->vec[4][0] - bb->vec[0][0]);
+ value[1] = fabsf(scale[1]) * (bb->vec[2][1] - bb->vec[0][1]);
+ value[2] = fabsf(scale[2]) * (bb->vec[1][2] - bb->vec[0][2]);
} else {
value[0] = value[1] = value[2] = 0.f;
}
@@ -2564,6 +2572,9 @@ void object_handle_update(Scene *scene, Object *ob)
Object *obg= ob->proxy_from->proxy_group;
invert_m4_m4(obg->imat, obg->obmat);
mul_m4_m4m4(ob->obmat, ob->proxy_from->obmat, obg->imat);
+ if(obg->dup_group) { /* should always be true */
+ add_v3_v3(ob->obmat[3], obg->dup_group->dupli_ofs);
+ }
}
else
copy_m4_m4(ob->obmat, ob->proxy_from->obmat);
@@ -2862,18 +2873,18 @@ void object_camera_matrix(
}
else if(camera->type==OB_LAMP) {
Lamp *la= camera->data;
- float fac= cos( M_PI*la->spotsize/360.0 );
+ float fac= cosf((float)M_PI*la->spotsize/360.0f);
float phi= acos(fac);
- (*lens)= 16.0*fac/sin(phi);
+ (*lens)= 16.0f*fac/sinf(phi);
if((*lens)==0.0f)
- (*lens)= 35.0;
+ (*lens)= 35.0f;
(*clipsta)= la->clipsta;
(*clipend)= la->clipend;
}
else { /* envmap exception... */;
if((*lens)==0.0f)
- (*lens)= 16.0;
+ (*lens)= 16.0f;
if((*clipsta)==0.0f || (*clipend)==0.0f) {
(*clipsta)= 0.1f;
@@ -2893,8 +2904,8 @@ void object_camera_matrix(
pixsize= cam->ortho_scale/viewfac;
}
else {
- if(rd->xasp*winx >= rd->yasp*winy) viewfac= ((*lens) * winx)/32.0;
- else viewfac= (*ycor) * ((*lens) * winy)/32.0;
+ if(rd->xasp*winx >= rd->yasp*winy) viewfac= ((*lens) * winx)/32.0f;
+ else viewfac= (*ycor) * ((*lens) * winy)/32.0f;
pixsize= (*clipsta) / viewfac;
}
@@ -2907,12 +2918,12 @@ void object_camera_matrix(
if(field_second) {
if(rd->mode & R_ODDFIELD) {
- viewplane->ymin-= 0.5 * (*ycor);
- viewplane->ymax-= 0.5 * (*ycor);
+ viewplane->ymin-= 0.5f * (*ycor);
+ viewplane->ymax-= 0.5f * (*ycor);
}
else {
- viewplane->ymin+= 0.5 * (*ycor);
- viewplane->ymax+= 0.5 * (*ycor);
+ viewplane->ymin+= 0.5f * (*ycor);
+ viewplane->ymax+= 0.5f * (*ycor);
}
}
/* the window matrix is used for clipping, and not changed during OSA steps */
@@ -3070,3 +3081,53 @@ KeyBlock *object_insert_shape_key(Scene *scene, Object *ob, const char *name, in
else return NULL;
}
+/* most important if this is modified it should _always_ return True, in certain
+ * cases false positives are hard to avoid (shape keys for eg)
+ */
+int object_is_modified(Scene *scene, Object *ob)
+{
+ int flag= 0;
+
+ if(ob_get_key(ob)) {
+ flag |= eModifierMode_Render | eModifierMode_Render;
+ }
+ else {
+ ModifierData *md;
+ /* cloth */
+ for(md=modifiers_getVirtualModifierList(ob); md && (flag != (eModifierMode_Render | eModifierMode_Realtime)); md=md->next) {
+ if((flag & eModifierMode_Render) == 0 && modifier_isEnabled(scene, md, eModifierMode_Render)) flag |= eModifierMode_Render;
+ if((flag & eModifierMode_Realtime) == 0 && modifier_isEnabled(scene, md, eModifierMode_Realtime)) flag |= eModifierMode_Realtime;
+ }
+ }
+
+ return flag;
+}
+
+static void copy_object__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob), ID **idpoin)
+{
+ /* this is copied from ID_NEW; it might be better to have a macro */
+ if(*idpoin && (*idpoin)->newid) *idpoin = (*idpoin)->newid;
+}
+
+void object_relink(Object *ob)
+{
+ if(ob->id.lib)
+ return;
+
+ relink_constraints(&ob->constraints);
+ if (ob->pose){
+ bPoseChannel *chan;
+ for (chan = ob->pose->chanbase.first; chan; chan=chan->next){
+ relink_constraints(&chan->constraints);
+ }
+ }
+ modifiers_foreachIDLink(ob, copy_object__forwardModifierLinks, NULL);
+
+ if(ob->adt)
+ BKE_relink_animdata(ob->adt);
+
+ ID_NEW(ob->parent);
+
+ ID_NEW(ob->proxy);
+ ID_NEW(ob->proxy_group);
+}
diff --git a/source/blender/blenkernel/intern/packedFile.c b/source/blender/blenkernel/intern/packedFile.c
index 981b3b31e71..ed729d819b7 100644
--- a/source/blender/blenkernel/intern/packedFile.c
+++ b/source/blender/blenkernel/intern/packedFile.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/packedFile.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index e53888127f2..5be492d1108 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/paint.c
+ * \ingroup bke
+ */
+
+
#include "DNA_object_types.h"
#include "DNA_mesh_types.h"
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index 4b3b30e6cd2..e5d77355d5d 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/particle.c
+ * \ingroup bke
+ */
+
+
#include <stdlib.h>
#include <math.h>
#include <string.h>
@@ -568,6 +573,7 @@ void psys_free(Object *ob, ParticleSystem * psys)
BLI_freelistN(&psys->targets);
+ BLI_bvhtree_free(psys->bvhtree);
BLI_kdtree_free(psys->tree);
if(psys->fluid_springs)
@@ -656,7 +662,7 @@ static float psys_render_projected_area(ParticleSystem *psys, float *center, flo
}
/* screen space radius */
- radius= sqrt(area/M_PI);
+ radius= sqrt(area/(float)M_PI);
/* make smaller using fallof once over screen edge */
*viewport= 1.0f;
@@ -865,7 +871,7 @@ int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
powrate= log(0.5f)/log(part->simplify_rate*0.5f);
if(part->simplify_flag & PART_SIMPLIFY_VIEWPORT)
- vprate= pow(1.0 - part->simplify_viewport, 5.0);
+ vprate= pow(1.0f - part->simplify_viewport, 5.0);
else
vprate= 1.0;
@@ -876,7 +882,7 @@ int psys_render_simplify_distribution(ParticleThreadContext *ctx, int tot)
if((arearatio < 1.0f || viewport < 1.0f) && elem->totchild) {
/* lambda is percentage of elements to keep */
- lambda= (arearatio < 1.0f)? pow(arearatio, powrate): 1.0f;
+ lambda= (arearatio < 1.0f)? powf(arearatio, powrate): 1.0f;
lambda *= viewport;
lambda= MAX2(lambda, 1.0f/elem->totchild);
@@ -1207,7 +1213,7 @@ static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData
PTCacheEditPoint *point = pind->epoint;
ParticleKey keys[4];
int point_vel = (point && point->keys->vel);
- float real_t, dfra, keytime, invdt;
+ float real_t, dfra, keytime, invdt = 1.f;
/* billboards wont fill in all of these, so start cleared */
memset(keys, 0, sizeof(keys));
@@ -1346,10 +1352,10 @@ static void do_particle_interpolation(ParticleSystem *psys, int p, ParticleData
dfra = keys[2].time - keys[1].time;
keytime = (real_t - keys[1].time) / dfra;
- invdt = dfra * 0.04f * psys->part->timetweak;
/* convert velocity to timestep size */
if(pind->keyed || pind->cache || point_vel){
+ invdt = dfra * 0.04f * (psys ? psys->part->timetweak : 1.f);
mul_v3_fl(keys[1].vel, invdt);
mul_v3_fl(keys[2].vel, invdt);
interp_qt_qtqt(result->rot,keys[1].rot,keys[2].rot,keytime);
@@ -1986,25 +1992,25 @@ static void do_kink(ParticleKey *state, ParticleKey *par, float *par_rot, float
inp_y=dot_v3v3(y_vec, vec_one);
inp_z=dot_v3v3(z_vec, vec_one);
- if(inp_y>0.5){
+ if(inp_y > 0.5f){
copy_v3_v3(state_co, y_vec);
mul_v3_fl(y_vec, amplitude*(float)cos(t));
mul_v3_fl(z_vec, amplitude/2.f*(float)sin(2.f*t));
}
- else if(inp_z>0.0){
- mul_v3_v3fl(state_co, z_vec, (float)sin(M_PI/3.f));
+ else if(inp_z > 0.0f){
+ mul_v3_v3fl(state_co, z_vec, (float)sin((float)M_PI/3.f));
VECADDFAC(state_co,state_co,y_vec,-0.5f);
- mul_v3_fl(y_vec, -amplitude * (float)cos(t + M_PI/3.f));
- mul_v3_fl(z_vec, amplitude/2.f * (float)cos(2.f*t + M_PI/6.f));
+ mul_v3_fl(y_vec, -amplitude * (float)cos(t + (float)M_PI/3.f));
+ mul_v3_fl(z_vec, amplitude/2.f * (float)cos(2.f*t + (float)M_PI/6.f));
}
else{
- mul_v3_v3fl(state_co, z_vec, -(float)sin(M_PI/3.f));
+ mul_v3_v3fl(state_co, z_vec, -(float)sin((float)M_PI/3.f));
madd_v3_v3fl(state_co, y_vec, -0.5f);
- mul_v3_fl(y_vec, amplitude * (float)-sin(t + M_PI/6.f));
- mul_v3_fl(z_vec, amplitude/2.f * (float)-sin(2.f*t + M_PI/3.f));
+ mul_v3_fl(y_vec, amplitude * (float)-sin(t + (float)M_PI/6.f));
+ mul_v3_fl(z_vec, amplitude/2.f * (float)-sin(2.f*t + (float)M_PI/3.f));
}
mul_v3_fl(state_co, amplitude);
@@ -2043,15 +2049,15 @@ static float do_clump(ParticleKey *state, ParticleKey *par, float time, float cl
{
float clump = 0.f;
- if(par && clumpfac!=0.0){
+ if(par && clumpfac!=0.0f){
float cpow;
- if(clumppow<0.0)
+ if(clumppow < 0.0f)
cpow=1.0f+clumppow;
else
cpow=1.0f+9.0f*clumppow;
- if(clumpfac<0.0) /* clump roots instead of tips */
+ if(clumpfac < 0.0f) /* clump roots instead of tips */
clump = -clumpfac*pa_clump*(float)pow(1.0-(double)time,(double)cpow);
else
clump = clumpfac*pa_clump*(float)pow((double)time,(double)cpow);
@@ -2125,7 +2131,7 @@ int do_guides(ListBase *effectors, ParticleKey *state, int index, float time)
if(data->strength <= 0.0f)
continue;
- guidetime = time / (1.0 - pd->free_end);
+ guidetime = time / (1.0f - pd->free_end);
if(guidetime>1.0f)
continue;
@@ -2148,7 +2154,7 @@ int do_guides(ListBase *effectors, ParticleKey *state, int index, float time)
VECCOPY(vec_to_point, data->vec_to_point);
- if(guidetime != 0.0){
+ if(guidetime != 0.0f) {
/* curve direction */
cross_v3_v3v3(temp, eff->guide_dir, guidedir);
angle = dot_v3v3(eff->guide_dir, guidedir)/(len_v3(eff->guide_dir));
@@ -2163,7 +2169,7 @@ int do_guides(ListBase *effectors, ParticleKey *state, int index, float time)
/* curve taper */
if(cu->taperobj)
- mul_v3_fl(vec_to_point, calc_taper(eff->scene, cu->taperobj, (int)(data->strength*guidetime*100.0), 100));
+ mul_v3_fl(vec_to_point, calc_taper(eff->scene, cu->taperobj, (int)(data->strength*guidetime*100.0f), 100));
else{ /* curve size*/
if(cu->flag & CU_PATH_RADIUS) {
@@ -2187,10 +2193,10 @@ int do_guides(ListBase *effectors, ParticleKey *state, int index, float time)
totstrength *= weight;
}
- if(totstrength != 0.0){
- if(totstrength > 1.0)
+ if(totstrength != 0.0f){
+ if(totstrength > 1.0f)
mul_v3_fl(effect, 1.0f / totstrength);
- CLAMP(totstrength, 0.0, 1.0);
+ CLAMP(totstrength, 0.0f, 1.0f);
//VECADD(effect,effect,pa_zero);
interp_v3_v3v3(state->co, state->co, effect, totstrength);
@@ -2206,8 +2212,8 @@ static void do_rough(float *loc, float mat[4][4], float t, float fac, float size
float rough[3];
float rco[3];
- if(thres!=0.0)
- if((float)fabs((float)(-1.5+loc[0]+loc[1]+loc[2]))<1.5f*thres) return;
+ if(thres != 0.0f)
+ if((float)fabs((float)(-1.5f+loc[0]+loc[1]+loc[2]))<1.5f*thres) return;
VECCOPY(rco,loc);
mul_v3_fl(rco,t);
@@ -2250,7 +2256,7 @@ static void do_path_effectors(ParticleSimulationData *sim, int i, ParticleCacheK
pd_point_from_particle(sim, sim->psys->particles+i, &eff_key, &epoint);
pdDoEffectors(sim->psys->effectors, sim->colliders, sim->psys->part->effector_weights, &epoint, force, NULL);
- mul_v3_fl(force, effector*pow((float)k / (float)steps, 100.0f * sim->psys->part->eff_hair) / (float)steps);
+ mul_v3_fl(force, effector*powf((float)k / (float)steps, 100.0f * sim->psys->part->eff_hair) / (float)steps);
add_v3_v3(force, vec);
@@ -2329,7 +2335,7 @@ void psys_find_parents(ParticleSimulationData *sim)
int p, totparent,totchild=sim->psys->totchild;
float co[3], orco[3];
int from=PART_FROM_FACE;
- totparent=(int)(totchild*part->parents*0.3);
+ totparent=(int)(totchild*part->parents*0.3f);
if(G.rendering && part->child_nbr && part->ren_child_nbr)
totparent*=(float)part->child_nbr/(float)part->ren_child_nbr;
@@ -2404,8 +2410,8 @@ static int psys_threads_init_path(ParticleThread *threads, Scene *scene, float c
steps = (int)pow(2.0, (double)pset->draw_step);
}
- if(totchild && part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
- totparent=(int)(totchild*part->parents*0.3);
+ if(totchild && part->childtype==PART_CHILD_FACES){
+ totparent=(int)(totchild*part->parents*0.3f);
if(G.rendering && part->child_nbr && part->ren_child_nbr)
totparent*=(float)part->child_nbr/(float)part->ren_child_nbr;
@@ -2446,16 +2452,14 @@ static int psys_threads_init_path(ParticleThread *threads, Scene *scene, float c
psys->lattice = psys_get_lattice(&ctx->sim);
/* cache all relevant vertex groups if they exist */
- if(part->from!=PART_FROM_PARTICLE){
- ctx->vg_length = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_LENGTH);
- ctx->vg_clump = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_CLUMP);
- ctx->vg_kink = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_KINK);
- ctx->vg_rough1 = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGH1);
- ctx->vg_rough2 = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGH2);
- ctx->vg_roughe = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGHE);
- if(psys->part->flag & PART_CHILD_EFFECT)
- ctx->vg_effector = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_EFFECTOR);
- }
+ ctx->vg_length = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_LENGTH);
+ ctx->vg_clump = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_CLUMP);
+ ctx->vg_kink = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_KINK);
+ ctx->vg_rough1 = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGH1);
+ ctx->vg_rough2 = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGH2);
+ ctx->vg_roughe = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_ROUGHE);
+ if(psys->part->flag & PART_CHILD_EFFECT)
+ ctx->vg_effector = psys_cache_vgroup(ctx->dm,psys,PSYS_VG_EFFECTOR);
/* set correct ipo timing */
#if 0 // XXX old animation system
@@ -2547,7 +2551,7 @@ static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle
normalize_v3(v1);
normalize_v3(v2);
- d = saacos(dot_v3v3(v1, v2)) * 180.f / M_PI;
+ d = saacos(dot_v3v3(v1, v2)) * 180.0f/(float)M_PI;
}
if(p_max > p_min)
@@ -2702,7 +2706,7 @@ static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle
sub_v3_v3v3((child-1)->vel, child->co, (child-2)->co);
mul_v3_fl((child-1)->vel, 0.5);
- if(ctx->ma && (part->draw & PART_DRAW_MAT_COL))
+ if(ctx->ma && (part->draw_col == PART_DRAW_COL_MAT))
get_strand_normal(ctx->ma, ornor, cur_length, (child-1)->vel);
}
@@ -2721,7 +2725,7 @@ static void psys_thread_create_path(ParticleThread *thread, struct ChildParticle
cur_length = 0.0f;
}
- if(ctx->ma && (part->draw & PART_DRAW_MAT_COL)) {
+ if(ctx->ma && (part->draw_col == PART_DRAW_COL_MAT)) {
VECCOPY(child->col, &ctx->ma->r)
get_strand_normal(ctx->ma, ornor, cur_length, child->vel);
}
@@ -2906,11 +2910,11 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra)
psys->lattice = psys_get_lattice(sim);
ma= give_current_material(sim->ob, psys->part->omat);
- if(ma && (psys->part->draw & PART_DRAW_MAT_COL))
+ if(ma && (psys->part->draw_col == PART_DRAW_COL_MAT))
VECCOPY(col, &ma->r)
- if(psys->part->from!=PART_FROM_PARTICLE && !(psys->flag & PSYS_GLOBAL_HAIR)) {
- if(!(psys->part->flag & PART_CHILD_EFFECT))
+ if((psys->flag & PSYS_GLOBAL_HAIR)==0) {
+ if((psys->part->flag & PART_CHILD_EFFECT)==0)
vg_effector = psys_cache_vgroup(psmd->dm, psys, PSYS_VG_EFFECTOR);
if(!psys->totchild)
@@ -3061,8 +3065,8 @@ void psys_cache_edit_paths(Scene *scene, Object *ob, PTCacheEdit *edit, float cf
ParticleInterpolationData pind;
ParticleKey result;
- float birthtime = 0.0, dietime = 0.0;
- float t, time = 0.0, keytime = 0.0, frs_sec;
+ float birthtime = 0.0f, dietime = 0.0f;
+ float t, time = 0.0f, keytime = 0.0f, frs_sec;
float hairmat[4][4], rotmat[3][3], prev_tangent[3] = {0.0f, 0.0f, 0.0f};
int k, i;
int steps = (int)pow(2.0, (double)pset->draw_step);
@@ -3344,7 +3348,8 @@ static void psys_face_mat(Object *ob, DerivedMesh *dm, ParticleData *pa, float m
/* ugly hack to use non-transformed orcos, since only those
* give symmetric results for mirroring in particle mode */
- transform_mesh_orco_verts(ob->data, v, 3, 1);
+ if(DM_get_vert_data_layer(dm, CD_ORIGINDEX))
+ transform_mesh_orco_verts(ob->data, v, 3, 1);
}
else {
dm->getVertCo(dm,mface->v1,v[0]);
@@ -3372,7 +3377,8 @@ void psys_mat_hair_to_orco(Object *ob, DerivedMesh *dm, short from, ParticleData
psys_particle_on_dm(dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0, orco, 0);
/* see psys_face_mat for why this function is called */
- transform_mesh_orco_verts(ob->data, &orco, 1, 1);
+ if(DM_get_vert_data_layer(dm, CD_ORIGINDEX))
+ transform_mesh_orco_verts(ob->data, &orco, 1, 1);
VECCOPY(hairmat[3],orco);
}
@@ -3532,16 +3538,15 @@ static void default_particle_settings(ParticleSettings *part)
part->clength=1.0f;
part->clength_thres=0.0f;
- part->draw= PART_DRAW_EMITTER|PART_DRAW_MAT_COL;
+ part->draw= PART_DRAW_EMITTER;
part->draw_line[0]=0.5;
part->path_start = 0.0f;
part->path_end = 1.0f;
part->keyed_loops = 1;
-#if 0 // XXX old animation system
- part->ipo = NULL;
-#endif // XXX old animation system
+ part->color_vec_max = 1.f;
+ part->draw_col = PART_DRAW_COL_MAT;
part->simplify_refsize= 1920;
part->simplify_rate= 1.0f;
@@ -3587,6 +3592,8 @@ ParticleSettings *psys_copy_settings(ParticleSettings *part)
id_us_plus((ID *)partn->mtex[a]->tex);
}
}
+
+ BLI_duplicatelist(&partn->dupliweights, &part->dupliweights);
return partn;
}
@@ -3694,8 +3701,8 @@ static int get_particle_uv(DerivedMesh *dm, ParticleData *pa, int face_index, fl
}
#define SET_PARTICLE_TEXTURE(type, pvalue, texfac) if((event & mtex->mapto) & type) {pvalue = texture_value_blend(def, pvalue, value, texfac, blend);}
-#define CLAMP_PARTICLE_TEXTURE_POS(type, pvalue) if(event & type) { if(pvalue < 0.f) pvalue = 1.f+pvalue; CLAMP(pvalue, 0.0, 1.0); }
-#define CLAMP_PARTICLE_TEXTURE_POSNEG(type, pvalue) if(event & type) { CLAMP(pvalue, -1.0, 1.0); }
+#define CLAMP_PARTICLE_TEXTURE_POS(type, pvalue) if(event & type) { if(pvalue < 0.f) pvalue = 1.f+pvalue; CLAMP(pvalue, 0.0f, 1.0f); }
+#define CLAMP_PARTICLE_TEXTURE_POSNEG(type, pvalue) if(event & type) { CLAMP(pvalue, -1.0f, 1.0f); }
static void get_cpa_texture(DerivedMesh *dm, ParticleSystem *psys, ParticleSettings *part, ParticleData *par, int child_index, int face_index, float *fw, float *orco, ParticleTexture *ptex, int event, float cfra)
{
@@ -3895,7 +3902,7 @@ float psys_get_child_size(ParticleSystem *psys, ChildParticle *cpa, float UNUSED
size*=part->childsize;
- if(part->childrandsize!=0.0)
+ if(part->childrandsize != 0.0f)
size *= 1.0f - part->childrandsize * PSYS_FRAND(cpa - psys->child + 26);
return size;
@@ -3999,7 +4006,7 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
memset(keys, 0, 4*sizeof(ParticleKey));
t=state->time;
- CLAMP(t, 0.0, 1.0);
+ CLAMP(t, 0.0f, 1.0f);
if(p<totpart){
pa = psys->particles + p;
@@ -4037,7 +4044,7 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, int p, ParticleKey *
if(state->time < 0.0f)
t = psys_get_child_time(psys, cpa, -state->time, NULL, NULL);
- if(totchild && part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
+ if(totchild && part->childtype==PART_CHILD_FACES){
/* part->parents could still be 0 so we can't test with totparent */
between=1;
}
@@ -4187,7 +4194,7 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
if(!psys->totchild)
return 0;
- if(part->from != PART_FROM_PARTICLE && part->childtype == PART_CHILD_FACES){
+ if(part->childtype == PART_CHILD_FACES){
if(!(psys->flag & PSYS_KEYED))
return 0;
@@ -4196,8 +4203,8 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
state->time = psys_get_child_time(psys, cpa, cfra, NULL, NULL);
if(!always)
- if((state->time < 0.0 && !(part->flag & PART_UNBORN))
- || (state->time > 1.0 && !(part->flag & PART_DIED)))
+ if((state->time < 0.0f && !(part->flag & PART_UNBORN))
+ || (state->time > 1.0f && !(part->flag & PART_DIED)))
return 0;
state->time= (cfra - (part->sta + (part->end - part->sta) * PSYS_FRAND(p + 23))) / (part->lifetime * PSYS_FRAND(p + 24));
@@ -4237,7 +4244,7 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
key1=&pa->state;
offset_child(cpa, key1, key1->rot, state, part->childflat, part->childrad);
- CLAMP(t,0.0,1.0);
+ CLAMP(t, 0.0f, 1.0f);
unit_m4(mat);
do_child_modifiers(sim, NULL, key1, key1->rot, cpa, cpa->fuv, mat, state, t);
@@ -4309,13 +4316,15 @@ int psys_get_particle_state(ParticleSimulationData *sim, int p, ParticleKey *sta
}
}
-void psys_get_dupli_texture(Object *UNUSED(ob), ParticleSettings *part, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, float *uv, float *orco)
+void psys_get_dupli_texture(ParticleSystem *psys, ParticleSettings *part, ParticleSystemModifierData *psmd, ParticleData *pa, ChildParticle *cpa, float *uv, float *orco)
{
MFace *mface;
MTFace *mtface;
float loc[3];
int num;
+ uv[0] = uv[1] = 0.f;
+
if(cpa) {
if(part->childtype == PART_CHILD_FACES) {
mtface= CustomData_get_layer(&psmd->dm->faceData, CD_MTFACE);
@@ -4324,43 +4333,36 @@ void psys_get_dupli_texture(Object *UNUSED(ob), ParticleSettings *part, Particle
mtface += cpa->num;
psys_interpolate_uvs(mtface, mface->v4, cpa->fuv, uv);
}
- else
- uv[0]= uv[1]= 0.0f;
+
+ psys_particle_on_emitter(psmd,PART_FROM_FACE,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,0,0,0,orco,0);
+ return;
+ }
+ else {
+ pa = psys->particles + cpa->pa[0];
}
- else
- uv[0]= uv[1]= 0.0f;
-
- psys_particle_on_emitter(psmd,
- (part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE,
- cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,0,0,0,orco,0);
}
- else {
- if(part->from == PART_FROM_FACE) {
- mtface= CustomData_get_layer(&psmd->dm->faceData, CD_MTFACE);
- num= pa->num_dmcache;
- if(num == DMCACHE_NOTFOUND)
- num= pa->num;
+ if(part->from == PART_FROM_FACE) {
+ mtface= CustomData_get_layer(&psmd->dm->faceData, CD_MTFACE);
+ num= pa->num_dmcache;
- if (num >= psmd->dm->getNumTessFaces(psmd->dm)) {
- /* happens when simplify is enabled
- * gives invalid coords but would crash otherwise */
- num= DMCACHE_NOTFOUND;
- }
+ if(num == DMCACHE_NOTFOUND)
+ num= pa->num;
- if(mtface && num != DMCACHE_NOTFOUND) {
- mface= psmd->dm->getTessFaceData(psmd->dm, num, CD_MFACE);
- mtface += num;
- psys_interpolate_uvs(mtface, mface->v4, pa->fuv, uv);
- }
- else
- uv[0]= uv[1]= 0.0f;
+ if (num >= psmd->dm->getNumTessFaces(psmd->dm)) {
+ /* happens when simplify is enabled
+ * gives invalid coords but would crash otherwise */
+ num= DMCACHE_NOTFOUND;
}
- else
- uv[0]= uv[1]= 0.0f;
- psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,orco,0);
+ if(mtface && num != DMCACHE_NOTFOUND) {
+ mface= psmd->dm->getTessFaceData(psmd->dm, num, CD_MFACE);
+ mtface += num;
+ psys_interpolate_uvs(mtface, mface->v4, pa->fuv, uv);
+ }
}
+
+ psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0,orco,0);
}
void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa, ChildParticle *cpa, ParticleCacheKey *cache, float mat[][4], float *scale)
@@ -4375,7 +4377,7 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa
len= normalize_v3(vec);
if(psys->part->rotmode) {
- if(!pa)
+ if(pa == NULL)
pa= psys->particles+cpa->pa[0];
vec_to_quat( q,xvec, ob->trackflag, ob->upflag);
@@ -4386,12 +4388,13 @@ void psys_get_dupli_path_transform(ParticleSimulationData *sim, ParticleData *pa
mul_m4_m4m4(mat, obrotmat, qmat);
}
else {
+ if(pa == NULL && psys->part->childflat != PART_CHILD_FACES)
+ pa = psys->particles + cpa->pa[0];
+
if(pa)
psys_particle_on_emitter(psmd,sim->psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,nor,0,0,0,0);
else
- psys_particle_on_emitter(psmd,
- (psys->part->childtype == PART_CHILD_FACES)? PART_FROM_FACE: PART_FROM_PARTICLE,
- cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0);
+ psys_particle_on_emitter(psmd,PART_FROM_FACE,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,loc,nor,0,0,0,0);
copy_m3_m4(nmat, ob->imat);
transpose_m3(nmat);
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index b4900553814..dbf2803ec18 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/particle_system.c
+ * \ingroup bke
+ */
+
+
#include <stddef.h>
#include "BLI_storage.h" /* _LARGEFILE_SOURCE */
@@ -324,6 +329,10 @@ static void alloc_child_particles(ParticleSystem *psys, int tot)
}
}
+/************************************************/
+/* Distribution */
+/************************************************/
+
void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
{
/* use for building derived mesh mapping info:
@@ -400,7 +409,36 @@ void psys_calc_dmcache(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
}
}
-static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
+static void distribute_simple_children(Scene *scene, Object *ob, DerivedMesh *finaldm, ParticleSystem *psys)
+{
+ ChildParticle *cpa = NULL;
+ int i, p;
+ int child_nbr= get_psys_child_number(scene, psys);
+ int totpart= get_psys_tot_child(scene, psys);
+
+ alloc_child_particles(psys, totpart);
+
+ cpa = psys->child;
+ for(i=0; i<child_nbr; i++){
+ for(p=0; p<psys->totpart; p++,cpa++){
+ float length=2.0;
+ cpa->parent=p;
+
+ /* create even spherical distribution inside unit sphere */
+ while(length>=1.0f){
+ cpa->fuv[0]=2.0f*BLI_frand()-1.0f;
+ cpa->fuv[1]=2.0f*BLI_frand()-1.0f;
+ cpa->fuv[2]=2.0f*BLI_frand()-1.0f;
+ length=len_v3(cpa->fuv);
+ }
+
+ cpa->num=-1;
+ }
+ }
+ /* dmcache must be updated for parent particles if children from faces is used */
+ psys_calc_dmcache(ob, finaldm, psys);
+}
+static void distribute_grid(DerivedMesh *dm, ParticleSystem *psys)
{
ParticleData *pa=NULL;
float min[3], max[3], delta[3], d;
@@ -597,8 +635,8 @@ static void hammersley_create(float *out, int n, int seed, float amount)
int k, kk;
rng = rng_new(31415926 + n + seed);
- offs[0]= rng_getDouble(rng) + amount;
- offs[1]= rng_getDouble(rng) + amount;
+ offs[0]= rng_getDouble(rng) + (double)amount;
+ offs[1]= rng_getDouble(rng) + (double)amount;
rng_free(rng);
for (k = 0; k < n; k++) {
@@ -621,8 +659,8 @@ static void init_mv_jit(float *jit, int num, int seed2, float amount)
if(num==0) return;
- rad1= (float)(1.0/sqrt((float)num));
- rad2= (float)(1.0/((float)num));
+ rad1= (float)(1.0f/sqrtf((float)num));
+ rad2= (float)(1.0f/((float)num));
rad3= (float)sqrt((float)num)/((float)num);
rng = rng_new(31415926 + num + seed2);
@@ -681,7 +719,7 @@ static void psys_uv_to_w(float u, float v, int quad, float *w)
}
/* Find the index in "sum" array before "value" is crossed. */
-static int binary_search_distribution(float *sum, int n, float value)
+static int distribute_binary_search(float *sum, int n, float value)
{
int mid, low=0, high=n;
@@ -711,13 +749,11 @@ static int binary_search_distribution(float *sum, int n, float value)
/* note: this function must be thread safe, for from == PART_FROM_CHILD */
#define ONLY_WORKING_WITH_PA_VERTS 0
-static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData *pa, ChildParticle *cpa, int p)
+static void distribute_threads_exec(ParticleThread *thread, ParticleData *pa, ChildParticle *cpa, int p)
{
ParticleThreadContext *ctx= thread->ctx;
Object *ob= ctx->sim.ob;
DerivedMesh *dm= ctx->dm;
- ParticleData *tpa;
-/* ParticleSettings *part= ctx->sim.psys->part; */
float *v1, *v2, *v3, *v4, nor[3], orco1[3], co1[3], co2[3], nor1[3];
float cur_d, min_d, randu, randv;
int from= ctx->from;
@@ -755,9 +791,17 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
switch(distr){
case PART_DISTR_JIT:
- ctx->jitoff[i] = fmod(ctx->jitoff[i],(float)ctx->jitlevel);
- psys_uv_to_w(ctx->jit[2*(int)ctx->jitoff[i]], ctx->jit[2*(int)ctx->jitoff[i]+1], mface->v4, pa->fuv);
- ctx->jitoff[i]++;
+ if(ctx->jitlevel == 1) {
+ if(mface->v4)
+ psys_uv_to_w(0.5f, 0.5f, mface->v4, pa->fuv);
+ else
+ psys_uv_to_w(0.33333f, 0.33333f, mface->v4, pa->fuv);
+ }
+ else {
+ ctx->jitoff[i] = fmod(ctx->jitoff[i],(float)ctx->jitlevel);
+ psys_uv_to_w(ctx->jit[2*(int)ctx->jitoff[i]], ctx->jit[2*(int)ctx->jitoff[i]+1], mface->v4, pa->fuv);
+ ctx->jitoff[i]++;
+ }
break;
case PART_DISTR_RAND:
randu= rng_getFloat(thread->rng);
@@ -823,15 +867,6 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
}
}
}
- else if(from == PART_FROM_PARTICLE) {
- tpa=ctx->tpars+ctx->index[p];
- pa->num=ctx->index[p];
- pa->fuv[0]=tpa->fuv[0];
- pa->fuv[1]=tpa->fuv[1];
- /* abusing foffset a little for timing in near reaction */
- pa->foffset=ctx->weight[ctx->index[p]];
- ctx->weight[ctx->index[p]]+=ctx->maxweight;
- }
else if(from == PART_FROM_CHILD) {
MFace *mf;
@@ -855,7 +890,7 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
if(ctx->tree){
KDTreeNearest ptn[10];
int w,maxw;//, do_seams;
- float maxd,mind,/*dd,*/totw=0.0;
+ float maxd,mind,/*dd,*/totw= 0.0f;
int parent[10];
float pweight[10];
@@ -865,7 +900,6 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
maxd=ptn[maxw-1].dist;
mind=ptn[0].dist;
- /*dd=maxd-mind;*/ /*UNUSED*/
/* the weights here could be done better */
for(w=0; w<maxw; w++){
@@ -901,7 +935,7 @@ static void psys_thread_distribute_particle(ParticleThread *thread, ParticleData
rng_skip(thread->rng, rng_skip_tot);
}
-static void *exec_distribution(void *data)
+static void *distribute_threads_exec_cb(void *data)
{
ParticleThread *thread= (ParticleThread*)data;
ParticleSystem *psys= thread->ctx->sim.psys;
@@ -918,7 +952,7 @@ static void *exec_distribution(void *data)
rng_skip(thread->rng, PSYS_RND_DIST_SKIP * thread->ctx->skip[p]);
if((p+thread->num) % thread->tot == 0)
- psys_thread_distribute_particle(thread, NULL, cpa, p);
+ distribute_threads_exec(thread, NULL, cpa, p);
else /* thread skip */
rng_skip(thread->rng, PSYS_RND_DIST_SKIP);
}
@@ -927,7 +961,7 @@ static void *exec_distribution(void *data)
totpart= psys->totpart;
pa= psys->particles + thread->num;
for(p=thread->num; p<totpart; p+=thread->tot, pa+=thread->tot)
- psys_thread_distribute_particle(thread, pa, NULL, p);
+ distribute_threads_exec(thread, pa, NULL, p);
}
return 0;
@@ -935,7 +969,7 @@ static void *exec_distribution(void *data)
/* not thread safe, but qsort doesn't take userdata argument */
static int *COMPARE_ORIG_INDEX = NULL;
-static int compare_orig_index(const void *p1, const void *p2)
+static int distribute_compare_orig_index(const void *p1, const void *p2)
{
int index1 = COMPARE_ORIG_INDEX[*(const int*)p1];
int index2 = COMPARE_ORIG_INDEX[*(const int*)p2];
@@ -956,44 +990,53 @@ static int compare_orig_index(const void *p1, const void *p2)
return 1;
}
-/* creates a distribution of coordinates on a DerivedMesh */
-/* */
-/* 1. lets check from what we are emitting */
-/* 2. now we know that we have something to emit from so */
-/* let's calculate some weights */
-/* 2.1 from even distribution */
-/* 2.2 and from vertex groups */
-/* 3. next we determine the indexes of emitting thing that */
-/* the particles will have */
-/* 4. let's do jitter if we need it */
-/* 5. now we're ready to set the indexes & distributions to */
-/* the particles */
-/* 6. and we're done! */
+static void distribute_invalid(Scene *scene, ParticleSystem *psys, int from)
+{
+ if(from == PART_FROM_CHILD) {
+ ChildParticle *cpa;
+ int p, totchild = get_psys_tot_child(scene, psys);
+
+ if(psys->child && totchild) {
+ for(p=0,cpa=psys->child; p<totchild; p++,cpa++){
+ cpa->fuv[0]=cpa->fuv[1]=cpa->fuv[2]=cpa->fuv[3]= 0.0;
+ cpa->foffset= 0.0f;
+ cpa->parent=0;
+ cpa->pa[0]=cpa->pa[1]=cpa->pa[2]=cpa->pa[3]=0;
+ cpa->num= -1;
+ }
+ }
+ }
+ else {
+ PARTICLE_P;
+ LOOP_PARTICLES {
+ pa->fuv[0]=pa->fuv[1]=pa->fuv[2]= pa->fuv[3]= 0.0;
+ pa->foffset= 0.0f;
+ pa->num= -1;
+ }
+ }
+}
+/* Creates a distribution of coordinates on a DerivedMesh */
/* This is to denote functionality that does not yet work with mesh - only derived mesh */
-static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene, DerivedMesh *finaldm, int from)
+static int distribute_threads_init_data(ParticleThread *threads, Scene *scene, DerivedMesh *finaldm, int from)
{
ParticleThreadContext *ctx= threads[0].ctx;
Object *ob= ctx->sim.ob;
ParticleSystem *psys= ctx->sim.psys;
- Object *tob;
ParticleData *pa=0, *tpars= 0;
ParticleSettings *part;
- ParticleSystem *tpsys;
ParticleSeam *seams= 0;
- ChildParticle *cpa=0;
KDTree *tree=0;
DerivedMesh *dm= NULL;
float *jit= NULL;
int i, seed, p=0, totthread= threads[0].tot;
- int /*no_distr=0,*/ cfrom=0;
- int tot=0, totpart, *index=0, children=0, totseam=0;
- //int *vertpart=0;
+ int cfrom=0;
+ int totelem=0, totpart, *particle_element=0, children=0, totseam=0;
int jitlevel= 1, distr;
- float *weight=0,*sum=0,*jitoff=0;
- float cur, maxweight=0.0, tweight, totweight, co[3], nor[3], orco[3], ornor[3];
+ float *element_weight=NULL,*element_sum=NULL,*jitter_offset=NULL, *vweight=NULL;
+ float cur, maxweight=0.0, tweight, totweight, inv_totweight, co[3], nor[3], orco[3], ornor[3];
- if(ob==0 || psys==0 || psys->part==0)
+ if(ELEM3(NULL, ob, psys, psys->part))
return 0;
part=psys->part;
@@ -1007,81 +1050,63 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
return 0;
}
- BLI_srandom(31415926 + psys->seed);
+ /* First handle special cases */
+ if(from == PART_FROM_CHILD) {
+ /* Simple children */
+ if(part->childtype != PART_CHILD_FACES) {
+ BLI_srandom(31415926 + psys->seed + psys->child_seed);
+ distribute_simple_children(scene, ob, finaldm, psys);
+ return 0;
+ }
+ }
+ else {
+ /* Grid distribution */
+ if(part->distr==PART_DISTR_GRID && from != PART_FROM_VERT){
+ BLI_srandom(31415926 + psys->seed);
+ dm= CDDM_from_mesh((Mesh*)ob->data, ob);
+ distribute_grid(dm,psys);
+ dm->release(dm);
+ return 0;
+ }
+ }
- if(from==PART_FROM_CHILD){
+ /* Create trees and original coordinates if needed */
+ if(from == PART_FROM_CHILD) {
distr=PART_DISTR_RAND;
BLI_srandom(31415926 + psys->seed + psys->child_seed);
+ dm= finaldm;
+ children=1;
- if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
- dm= finaldm;
- children=1;
-
- tree=BLI_kdtree_new(totpart);
+ tree=BLI_kdtree_new(totpart);
- for(p=0,pa=psys->particles; p<totpart; p++,pa++){
- psys_particle_on_dm(dm,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco,ornor);
- transform_mesh_orco_verts((Mesh*)ob->data, &orco, 1, 1);
- BLI_kdtree_insert(tree, p, orco, ornor);
- }
-
- BLI_kdtree_balance(tree);
-
- totpart=get_psys_tot_child(scene, psys);
- cfrom=from=PART_FROM_FACE;
+ for(p=0,pa=psys->particles; p<totpart; p++,pa++){
+ psys_particle_on_dm(dm,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0,orco,ornor);
+ transform_mesh_orco_verts((Mesh*)ob->data, &orco, 1, 1);
+ BLI_kdtree_insert(tree, p, orco, ornor);
}
- else{
- /* no need to figure out distribution */
- int child_nbr= get_psys_child_number(scene, psys);
-
- totpart= get_psys_tot_child(scene, psys);
- alloc_child_particles(psys, totpart);
- cpa=psys->child;
- for(i=0; i<child_nbr; i++){
- for(p=0; p<psys->totpart; p++,cpa++){
- float length=2.0;
- cpa->parent=p;
-
- /* create even spherical distribution inside unit sphere */
- while(length>=1.0f){
- cpa->fuv[0]=2.0f*BLI_frand()-1.0f;
- cpa->fuv[1]=2.0f*BLI_frand()-1.0f;
- cpa->fuv[2]=2.0f*BLI_frand()-1.0f;
- length=len_v3(cpa->fuv);
- }
- cpa->num=-1;
- }
- }
- /* dmcache must be updated for parent particles if children from faces is used */
- psys_calc_dmcache(ob, finaldm, psys);
+ BLI_kdtree_balance(tree);
- return 0;
- }
+ totpart = get_psys_tot_child(scene, psys);
+ cfrom = from = PART_FROM_FACE;
}
- else{
+ else {
+ distr = part->distr;
+ BLI_srandom(31415926 + psys->seed);
+
dm= CDDM_from_mesh((Mesh*)ob->data, ob);
- /* special handling of grid distribution */
- if(part->distr==PART_DISTR_GRID && from != PART_FROM_VERT){
- distribute_particles_in_grid(dm,psys);
- dm->release(dm);
- return 0;
- }
-
/* we need orco for consistent distributions */
DM_add_vert_layer(dm, CD_ORCO, CD_ASSIGN, get_mesh_orco_verts(ob));
- distr=part->distr;
-
- if(from==PART_FROM_VERT){
+ if(from == PART_FROM_VERT) {
MVert *mv= dm->getVertDataArray(dm, CD_MVERT);
float (*orcodata)[3]= dm->getVertDataArray(dm, CD_ORCO);
int totvert = dm->getNumVerts(dm);
tree=BLI_kdtree_new(totvert);
- for(p=0; p<totvert; p++){
+ for(p=0; p<totvert; p++) {
if(orcodata) {
VECCOPY(co,orcodata[p])
transform_mesh_orco_verts((Mesh*)ob->data, &co, 1, 1);
@@ -1095,73 +1120,33 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
}
}
- /* 1. */
- switch(from){
- case PART_FROM_VERT:
- tot = dm->getNumVerts(dm);
- break;
- case PART_FROM_VOLUME:
- case PART_FROM_FACE:
- tot = dm->getNumTessFaces(dm);
- break;
- case PART_FROM_PARTICLE:
- if(psys->target_ob)
- tob=psys->target_ob;
- else
- tob=ob;
+ /* Get total number of emission elements and allocate needed arrays */
+ totelem = (from == PART_FROM_VERT) ? dm->getNumVerts(dm) : dm->getNumTessFaces(dm);
- if((tpsys=BLI_findlink(&tob->particlesystem,psys->target_psys-1))){
- tpars=tpsys->particles;
- tot=tpsys->totpart;
- }
- break;
- }
+ if(totelem == 0){
+ distribute_invalid(scene, psys, children ? PART_FROM_CHILD : 0);
- if(tot==0){
- /*no_distr=1;*/ /*UNUSED*/
- if(children){
- if(G.f & G_DEBUG)
- fprintf(stderr,"Particle child distribution error: Nothing to emit from!\n");
- if(psys->child) {
- for(p=0,cpa=psys->child; p<totpart; p++,cpa++){
- cpa->fuv[0]=cpa->fuv[1]=cpa->fuv[2]=cpa->fuv[3]= 0.0;
- cpa->foffset= 0.0f;
- cpa->parent=0;
- cpa->pa[0]=cpa->pa[1]=cpa->pa[2]=cpa->pa[3]=0;
- cpa->num= -1;
- }
- }
- }
- else {
- if(G.f & G_DEBUG)
- fprintf(stderr,"Particle distribution error: Nothing to emit from!\n");
- for(p=0,pa=psys->particles; p<totpart; p++,pa++){
- pa->fuv[0]=pa->fuv[1]=pa->fuv[2]= pa->fuv[3]= 0.0;
- pa->foffset= 0.0f;
- pa->num= -1;
- }
- }
+ if(G.f & G_DEBUG)
+ fprintf(stderr,"Particle distribution error: Nothing to emit from!\n");
if(dm != finaldm) dm->release(dm);
return 0;
}
- /* 2. */
-
- weight=MEM_callocN(sizeof(float)*tot, "particle_distribution_weights");
- index=MEM_callocN(sizeof(int)*totpart, "particle_distribution_indexes");
- sum=MEM_callocN(sizeof(float)*(tot+1), "particle_distribution_sum");
- jitoff=MEM_callocN(sizeof(float)*tot, "particle_distribution_jitoff");
+ element_weight = MEM_callocN(sizeof(float)*totelem, "particle_distribution_weights");
+ particle_element= MEM_callocN(sizeof(int)*totpart, "particle_distribution_indexes");
+ element_sum = MEM_callocN(sizeof(float)*(totelem+1), "particle_distribution_sum");
+ jitter_offset = MEM_callocN(sizeof(float)*totelem, "particle_distribution_jitoff");
- /* 2.1 */
- if((part->flag&PART_EDISTR || children) && ELEM(from,PART_FROM_PARTICLE,PART_FROM_VERT)==0){
+ /* Calculate weights from face areas */
+ if((part->flag&PART_EDISTR || children) && from != PART_FROM_VERT){
MVert *v1, *v2, *v3, *v4;
- float totarea=0.0, co1[3], co2[3], co3[3], co4[3];
+ float totarea=0.f, co1[3], co2[3], co3[3], co4[3];
float (*orcodata)[3];
orcodata= dm->getVertDataArray(dm, CD_ORCO);
- for(i=0; i<tot; i++){
+ for(i=0; i<totelem; i++){
MFace *mf=dm->getTessFaceData(dm,i,CD_MFACE);
if(orcodata) {
@@ -1171,6 +1156,10 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
transform_mesh_orco_verts((Mesh*)ob->data, &co1, 1, 1);
transform_mesh_orco_verts((Mesh*)ob->data, &co2, 1, 1);
transform_mesh_orco_verts((Mesh*)ob->data, &co3, 1, 1);
+ if(mf->v4) {
+ VECCOPY(co4, orcodata[mf->v4]);
+ transform_mesh_orco_verts((Mesh*)ob->data, &co4, 1, 1);
+ }
}
else {
v1= (MVert*)dm->getVertData(dm,mf->v1,CD_MVERT);
@@ -1179,156 +1168,133 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
VECCOPY(co1, v1->co);
VECCOPY(co2, v2->co);
VECCOPY(co3, v3->co);
- }
-
- if (mf->v4){
- if(orcodata) {
- VECCOPY(co4, orcodata[mf->v4]);
- transform_mesh_orco_verts((Mesh*)ob->data, &co4, 1, 1);
- }
- else {
+ if(mf->v4) {
v4= (MVert*)dm->getVertData(dm,mf->v4,CD_MVERT);
VECCOPY(co4, v4->co);
}
- cur= area_quad_v3(co1, co2, co3, co4);
}
- else
- cur= area_tri_v3(co1, co2, co3);
+
+ cur = mf->v4 ? area_quad_v3(co1, co2, co3, co4) : area_tri_v3(co1, co2, co3);
- if(cur>maxweight)
- maxweight=cur;
+ if(cur > maxweight)
+ maxweight = cur;
- weight[i]= cur;
- totarea+=cur;
+ element_weight[i] = cur;
+ totarea += cur;
}
- for(i=0; i<tot; i++)
- weight[i] /= totarea;
+ for(i=0; i<totelem; i++)
+ element_weight[i] /= totarea;
maxweight /= totarea;
}
- else if(from==PART_FROM_PARTICLE){
- float val=(float)tot/(float)totpart;
- for(i=0; i<tot; i++)
- weight[i]=val;
- maxweight=val;
- }
else{
- float min=1.0f/(float)(MIN2(tot,totpart));
- for(i=0; i<tot; i++)
- weight[i]=min;
+ float min=1.0f/(float)(MIN2(totelem,totpart));
+ for(i=0; i<totelem; i++)
+ element_weight[i]=min;
maxweight=min;
}
- /* 2.2 */
- if(ELEM3(from,PART_FROM_VERT,PART_FROM_FACE,PART_FROM_VOLUME)){
- float *vweight= psys_cache_vgroup(dm,psys,PSYS_VG_DENSITY);
+ /* Calculate weights from vgroup */
+ vweight = psys_cache_vgroup(dm,psys,PSYS_VG_DENSITY);
- if(vweight){
- if(from==PART_FROM_VERT) {
- for(i=0;i<tot; i++)
- weight[i]*=vweight[i];
- }
- else { /* PART_FROM_FACE / PART_FROM_VOLUME */
- for(i=0;i<tot; i++){
- MFace *mf=dm->getTessFaceData(dm,i,CD_MFACE);
- tweight = vweight[mf->v1] + vweight[mf->v2] + vweight[mf->v3];
+ if(vweight){
+ if(from==PART_FROM_VERT) {
+ for(i=0;i<totelem; i++)
+ element_weight[i]*=vweight[i];
+ }
+ else { /* PART_FROM_FACE / PART_FROM_VOLUME */
+ for(i=0;i<totelem; i++){
+ MFace *mf=dm->getTessFaceData(dm,i,CD_MFACE);
+ tweight = vweight[mf->v1] + vweight[mf->v2] + vweight[mf->v3];
- if(mf->v4) {
- tweight += vweight[mf->v4];
- tweight /= 4.0;
- }
- else {
- tweight /= 3.0;
- }
-
- weight[i]*=tweight;
+ if(mf->v4) {
+ tweight += vweight[mf->v4];
+ tweight /= 4.0f;
+ }
+ else {
+ tweight /= 3.0f;
}
+
+ element_weight[i]*=tweight;
}
- MEM_freeN(vweight);
}
+ MEM_freeN(vweight);
}
- /* 3. */
+ /* Calculate total weight of all elements */
totweight= 0.0f;
- for(i=0;i<tot; i++)
- totweight += weight[i];
+ for(i=0;i<totelem; i++)
+ totweight += element_weight[i];
- if(totweight > 0.0f)
- totweight= 1.0f/totweight;
+ inv_totweight = (totweight > 0.f ? 1.f/totweight : 0.f);
- sum[0]= 0.0f;
- for(i=0;i<tot; i++)
- sum[i+1]= sum[i]+weight[i]*totweight;
+ /* Calculate cumulative weights */
+ element_sum[0]= 0.0f;
+ for(i=0; i<totelem; i++)
+ element_sum[i+1]= element_sum[i] + element_weight[i] * inv_totweight;
+ /* Finally assign elements to particles */
if((part->flag&PART_TRAND) || (part->simplify_flag&PART_SIMPLIFY_ENABLE)) {
float pos;
for(p=0; p<totpart; p++) {
- /* In theory sys[tot] should be 1.0, but due to float errors this is not necessarily always true, so scale pos accordingly. */
- pos= BLI_frand() * sum[tot];
- index[p]= binary_search_distribution(sum, tot, pos);
- index[p]= MIN2(tot-1, index[p]);
- jitoff[index[p]]= pos;
+ /* In theory element_sum[totelem] should be 1.0, but due to float errors this is not necessarily always true, so scale pos accordingly. */
+ pos= BLI_frand() * element_sum[totelem];
+ particle_element[p]= distribute_binary_search(element_sum, totelem, pos);
+ particle_element[p]= MIN2(totelem-1, particle_element[p]);
+ jitter_offset[particle_element[p]]= pos;
}
}
else {
double step, pos;
- step= (totpart <= 1)? 0.5: 1.0/(totpart-1);
- pos= 1e-16f; /* tiny offset to avoid zero weight face */
+ step= (totpart < 2) ? 0.5 : 1.0/(double)totpart;
+ pos= 1e-16; /* tiny offset to avoid zero weight face */
i= 0;
for(p=0; p<totpart; p++, pos+=step) {
- while((i < tot) && (pos > sum[i+1]))
+ while((i < totelem) && (pos > element_sum[i+1]))
i++;
- index[p]= MIN2(tot-1, i);
+ particle_element[p]= MIN2(totelem-1, i);
/* avoid zero weight face */
- if(p == totpart-1 && weight[index[p]] == 0.0f)
- index[p]= index[p-1];
+ if(p == totpart-1 && element_weight[particle_element[p]] == 0.0f)
+ particle_element[p]= particle_element[p-1];
- jitoff[index[p]]= pos;
+ jitter_offset[particle_element[p]]= pos;
}
}
- MEM_freeN(sum);
-
- /* for hair, sort by origindex, allows optimizations in rendering */
- /* however with virtual parents the children need to be in random order */
- if(part->type == PART_HAIR && !(part->childtype==PART_CHILD_FACES && part->parents!=0.0)) {
- if(from != PART_FROM_PARTICLE) {
- COMPARE_ORIG_INDEX = NULL;
+ MEM_freeN(element_sum);
- if(from == PART_FROM_VERT) {
- if(dm->numVertData)
- COMPARE_ORIG_INDEX= dm->getVertDataArray(dm, CD_ORIGINDEX);
- }
- else {
- if(dm->numFaceData)
- COMPARE_ORIG_INDEX= dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
- }
+ /* For hair, sort by origindex (allows optimizations in rendering), */
+ /* however with virtual parents the children need to be in random order. */
+ if(part->type == PART_HAIR && !(part->childtype==PART_CHILD_FACES && part->parents!=0.0f)) {
+ COMPARE_ORIG_INDEX = NULL;
- if(COMPARE_ORIG_INDEX) {
- qsort(index, totpart, sizeof(int), compare_orig_index);
- COMPARE_ORIG_INDEX = NULL;
- }
+ if(from == PART_FROM_VERT) {
+ if(dm->numVertData)
+ COMPARE_ORIG_INDEX= dm->getVertDataArray(dm, CD_ORIGINDEX);
+ }
+ else {
+ if(dm->numFaceData)
+ COMPARE_ORIG_INDEX= dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
}
- }
- /* weights are no longer used except for FROM_PARTICLE, which needs them zeroed for indexing */
- if(from==PART_FROM_PARTICLE){
- for(i=0; i<tot; i++)
- weight[i]=0.0f;
+ if(COMPARE_ORIG_INDEX) {
+ qsort(particle_element, totpart, sizeof(int), distribute_compare_orig_index);
+ COMPARE_ORIG_INDEX = NULL;
+ }
}
- /* 4. */
+ /* Create jittering if needed */
if(distr==PART_DISTR_JIT && ELEM(from,PART_FROM_FACE,PART_FROM_VOLUME)) {
jitlevel= part->userjit;
if(jitlevel == 0) {
- jitlevel= totpart/tot;
+ jitlevel= totpart/totelem;
if(part->flag & PART_EDISTR) jitlevel*= 2; /* looks better in general, not very scietific */
if(jitlevel<3) jitlevel= 3;
}
@@ -1345,16 +1311,16 @@ static int psys_threads_init_distribution(ParticleThread *threads, Scene *scene,
BLI_array_randomize(jit, 2*sizeof(float), jitlevel, psys->seed); /* for custom jit or even distribution */
}
- /* 5. */
+ /* Setup things for threaded distribution */
ctx->tree= tree;
ctx->seams= seams;
ctx->totseam= totseam;
ctx->sim.psys= psys;
- ctx->index= index;
+ ctx->index= particle_element;
ctx->jit= jit;
ctx->jitlevel= jitlevel;
- ctx->jitoff= jitoff;
- ctx->weight= weight;
+ ctx->jitoff= jitter_offset;
+ ctx->weight= element_weight;
ctx->maxweight= maxweight;
ctx->from= (children)? PART_FROM_CHILD: from;
ctx->cfrom= cfrom;
@@ -1389,14 +1355,14 @@ static void distribute_particles_on_dm(ParticleSimulationData *sim, int from)
pthreads= psys_threads_create(sim);
- if(!psys_threads_init_distribution(pthreads, sim->scene, finaldm, from)) {
+ if(!distribute_threads_init_data(pthreads, sim->scene, finaldm, from)) {
psys_threads_free(pthreads);
return;
}
totthread= pthreads[0].tot;
if(totthread > 1) {
- BLI_init_threads(&threads, exec_distribution, totthread);
+ BLI_init_threads(&threads, distribute_threads_exec_cb, totthread);
for(i=0; i<totthread; i++)
BLI_insert_thread(&threads, &pthreads[i]);
@@ -1404,7 +1370,7 @@ static void distribute_particles_on_dm(ParticleSimulationData *sim, int from)
BLI_end_threads(&threads);
}
else
- exec_distribution(&pthreads[0]);
+ distribute_threads_exec_cb(&pthreads[0]);
psys_calc_dmcache(sim->ob, finaldm, sim->psys);
@@ -1418,17 +1384,11 @@ static void distribute_particles_on_dm(ParticleSimulationData *sim, int from)
/* ready for future use, to emit particles without geometry */
static void distribute_particles_on_shape(ParticleSimulationData *sim, int UNUSED(from))
{
- ParticleSystem *psys = sim->psys;
- PARTICLE_P;
+ distribute_invalid(sim->scene, sim->psys, 0);
fprintf(stderr,"Shape emission not yet possible!\n");
-
- LOOP_PARTICLES {
- pa->fuv[0]=pa->fuv[1]=pa->fuv[2]=pa->fuv[3]= 0.0;
- pa->foffset= 0.0f;
- pa->num= -1;
- }
}
+
static void distribute_particles(ParticleSimulationData *sim, int from)
{
PARTICLE_PSMD;
@@ -1444,16 +1404,9 @@ static void distribute_particles(ParticleSimulationData *sim, int from)
distribute_particles_on_shape(sim, from);
if(distr_error){
- ParticleSystem *psys = sim->psys;
- PARTICLE_P;
+ distribute_invalid(sim->scene, sim->psys, from);
fprintf(stderr,"Particle distribution error!\n");
-
- LOOP_PARTICLES {
- pa->fuv[0]=pa->fuv[1]=pa->fuv[2]=pa->fuv[3]= 0.0;
- pa->foffset= 0.0f;
- pa->num= -1;
- }
}
}
@@ -1542,7 +1495,7 @@ void initialize_particle(ParticleSimulationData *sim, ParticleData *pa, int p)
pa->flag &= ~PARS_UNEXIST;
- if(part->from != PART_FROM_PARTICLE && part->type != PART_FLUID) {
+ if(part->type != PART_FLUID) {
psys_get_texture(sim, pa, &ptex, PAMAP_INIT, 0.f);
if(ptex.exist < PSYS_FRAND(p+125))
@@ -1623,39 +1576,15 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
int p = pa - psys->particles;
part=psys->part;
-#if 0 /* deprecated code */
- if(part->from==PART_FROM_PARTICLE){
- float speed;
- ParticleSimulationData tsim= {0};
- tsim.scene= sim->scene;
- tsim.ob= psys->target_ob ? psys->target_ob : ob;
- tsim.psys = BLI_findlink(&tsim.ob->particlesystem, sim->psys->target_psys-1);
-
- state.time = pa->time;
- if(pa->num == -1)
- memset(&state, 0, sizeof(state));
- else
- psys_get_particle_state(&tsim, pa->num, &state, 1);
- psys_get_from_key(&state, loc, nor, rot, 0);
-
- mul_qt_v3(rot, vtan);
- mul_qt_v3(rot, utan);
-
- speed= normalize_v3_v3(p_vel, state.vel);
- mul_v3_fl(p_vel, dot_v3v3(r_vel, p_vel));
- VECSUB(p_vel, r_vel, p_vel);
- normalize_v3(p_vel);
- mul_v3_fl(p_vel, speed);
-
- VECCOPY(pa->fuv, loc); /* abusing pa->fuv (not used for "from particle") for storing emit location */
- }
- else{
-#endif
/* get precise emitter matrix if particle is born */
- if(part->type!=PART_HAIR && pa->time < cfra && pa->time >= sim->psys->cfra) {
+ if(part->type!=PART_HAIR && dtime > 0.f && pa->time < cfra && pa->time >= sim->psys->cfra) {
/* we have to force RECALC_ANIM here since where_is_objec_time only does drivers */
- BKE_animsys_evaluate_animdata(&sim->ob->id, sim->ob->adt, pa->time, ADT_RECALC_ANIM);
- where_is_object_time(sim->scene, sim->ob, pa->time);
+ while(ob) {
+ BKE_animsys_evaluate_animdata(&ob->id, ob->adt, pa->time, ADT_RECALC_ANIM);
+ ob = ob->parent;
+ }
+ ob = sim->ob;
+ where_is_object_time(sim->scene, ob, pa->time);
}
/* get birth location from object */
@@ -1677,11 +1606,11 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
normalize_v3(nor);
/* -tangent */
- if(part->tanfac!=0.0){
+ if(part->tanfac!=0.0f){
//float phase=vg_rot?2.0f*(psys_particle_value_from_verts(sim->psmd->dm,part->from,pa,vg_rot)-0.5f):0.0f;
float phase=0.0f;
- mul_v3_fl(vtan,-(float)cos(M_PI*(part->tanphase+phase)));
- fac=-(float)sin(M_PI*(part->tanphase+phase));
+ mul_v3_fl(vtan,-(float)cos((float)M_PI*(part->tanphase+phase)));
+ fac=-(float)sin((float)M_PI*(part->tanphase+phase));
VECADDFAC(vtan,vtan,utan,fac);
mul_mat3_m4_v3(ob->obmat,vtan);
@@ -1695,7 +1624,7 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
/* -velocity */
- if(part->randfac!=0.0){
+ if(part->randfac != 0.0f){
r_vel[0] = 2.0f * (PSYS_FRAND(p + 10) - 0.5f);
r_vel[1] = 2.0f * (PSYS_FRAND(p + 11) - 0.5f);
r_vel[2] = 2.0f * (PSYS_FRAND(p + 12) - 0.5f);
@@ -1739,7 +1668,7 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
zero_v3(pa->state.vel);
/* boids store direction in ave */
- if(fabs(nor[2])==1.0f) {
+ if(fabsf(nor[2])==1.0f) {
sub_v3_v3v3(pa->state.ave, loc, ob->obmat[3]);
normalize_v3(pa->state.ave);
}
@@ -1891,7 +1820,7 @@ void reset_particle(ParticleSimulationData *sim, ParticleData *pa, float dtime,
else{
pa->lifetime = part->lifetime * ptex.life;
- if(part->randlife != 0.0)
+ if(part->randlife != 0.0f)
pa->lifetime *= 1.0f - part->randlife * PSYS_FRAND(p + 21);
}
@@ -2031,112 +1960,7 @@ static void set_keyed_keys(ParticleSimulationData *sim)
psys->flag |= PSYS_KEYED;
}
-/************************************************/
-/* Reactors */
-/************************************************/
-//static void push_reaction(ParticleSimulationData *sim, int pa_num, int event, ParticleKey *state)
-//{
-// Object *rob;
-// ParticleSystem *rpsys;
-// ParticleSettings *rpart;
-// ParticleData *pa;
-// ListBase *lb=&sim->psys->effectors;
-// ParticleEffectorCache *ec;
-// ParticleReactEvent *re;
-//
-// if(lb->first) for(ec = lb->first; ec; ec= ec->next){
-// if(ec->type & PSYS_EC_REACTOR){
-// /* all validity checks already done in add_to_effectors */
-// rob=ec->ob;
-// rpsys=BLI_findlink(&rob->particlesystem,ec->psys_nbr);
-// rpart=rpsys->part;
-// if(rpsys->part->reactevent==event){
-// pa=sim->psys->particles+pa_num;
-// re= MEM_callocN(sizeof(ParticleReactEvent), "react event");
-// re->event=event;
-// re->pa_num = pa_num;
-// re->ob = sim->ob;
-// re->psys = sim->psys;
-// re->size = pa->size;
-// copy_particle_key(&re->state,state,1);
-//
-// switch(event){
-// case PART_EVENT_DEATH:
-// re->time=pa->dietime;
-// break;
-// case PART_EVENT_COLLIDE:
-// re->time=state->time;
-// break;
-// case PART_EVENT_NEAR:
-// re->time=state->time;
-// break;
-// }
-//
-// BLI_addtail(&rpsys->reactevents, re);
-// }
-// }
-// }
-//}
-//static void react_to_events(ParticleSystem *psys, int pa_num)
-//{
-// ParticleSettings *part=psys->part;
-// ParticleData *pa=psys->particles+pa_num;
-// ParticleReactEvent *re=psys->reactevents.first;
-// int birth=0;
-// float dist=0.0f;
-//
-// for(re=psys->reactevents.first; re; re=re->next){
-// birth=0;
-// if(part->from==PART_FROM_PARTICLE){
-// if(pa->num==re->pa_num && pa->alive==PARS_UNBORN){
-// if(re->event==PART_EVENT_NEAR){
-// ParticleData *tpa = re->psys->particles+re->pa_num;
-// float pa_time=tpa->time + pa->foffset*tpa->lifetime;
-// if(re->time >= pa_time){
-// pa->time=pa_time;
-// pa->dietime=pa->time+pa->lifetime;
-// }
-// }
-// else{
-// pa->time=re->time;
-// pa->dietime=pa->time+pa->lifetime;
-// }
-// }
-// }
-// else{
-// dist=len_v3v3(pa->state.co, re->state.co);
-// if(dist <= re->size){
-// if(pa->alive==PARS_UNBORN){
-// pa->time=re->time;
-// pa->dietime=pa->time+pa->lifetime;
-// birth=1;
-// }
-// if(birth || part->flag&PART_REACT_MULTIPLE){
-// float vec[3];
-// VECSUB(vec,pa->state.co, re->state.co);
-// if(birth==0)
-// mul_v3_fl(vec,(float)pow(1.0f-dist/re->size,part->reactshape));
-// VECADDFAC(pa->state.vel,pa->state.vel,vec,part->reactfac);
-// VECADDFAC(pa->state.vel,pa->state.vel,re->state.vel,part->partfac);
-// }
-// if(birth)
-// mul_v3_fl(pa->state.vel,(float)pow(1.0f-dist/re->size,part->reactshape));
-// }
-// }
-// }
-//}
-//void psys_get_reactor_target(ParticleSimulationData *sim, Object **target_ob, ParticleSystem **target_psys)
-//{
-// Object *tob;
-//
-// tob = sim->psys->target_ob ? sim->psys->target_ob : sim->ob;
-//
-// *target_psys = BLI_findlink(&tob->particlesystem, sim->psys->target_psys-1);
-// if(*target_psys)
-// *target_ob=tob;
-// else
-// *target_ob=0;
-//}
+
/************************************************/
/* Point Cache */
/************************************************/
@@ -2162,23 +1986,54 @@ void psys_get_pointcache_start_end(Scene *scene, ParticleSystem *psys, int *sfra
ParticleSettings *part = psys->part;
*sfra = MAX2(1, (int)part->sta);
- *efra = MIN2((int)(part->end + part->lifetime + 1.0), scene->r.efra);
+ *efra = MIN2((int)(part->end + part->lifetime + 1.0f), scene->r.efra);
}
/************************************************/
/* Effectors */
/************************************************/
+static void psys_update_particle_bvhtree(ParticleSystem *psys, float cfra)
+{
+ if(psys) {
+ PARTICLE_P;
+ int totpart = 0;
+
+ if(!psys->bvhtree || psys->bvhtree_frame != cfra) {
+ LOOP_SHOWN_PARTICLES {
+ totpart++;
+ }
+
+ BLI_bvhtree_free(psys->bvhtree);
+ psys->bvhtree = BLI_bvhtree_new(totpart, 0.0, 4, 6);
+
+ LOOP_SHOWN_PARTICLES {
+ if(pa->alive == PARS_ALIVE) {
+ if(pa->state.time == cfra)
+ BLI_bvhtree_insert(psys->bvhtree, p, pa->prev_state.co, 1);
+ else
+ BLI_bvhtree_insert(psys->bvhtree, p, pa->state.co, 1);
+ }
+ }
+ BLI_bvhtree_balance(psys->bvhtree);
+
+ psys->bvhtree_frame = cfra;
+ }
+ }
+}
void psys_update_particle_tree(ParticleSystem *psys, float cfra)
{
if(psys) {
PARTICLE_P;
+ int totpart = 0;
if(!psys->tree || psys->tree_frame != cfra) {
-
- BLI_kdtree_free(psys->tree);
+ LOOP_SHOWN_PARTICLES {
+ totpart++;
+ }
+ BLI_kdtree_free(psys->tree);
psys->tree = BLI_kdtree_new(psys->totpart);
-
+
LOOP_SHOWN_PARTICLES {
if(pa->alive == PARS_ALIVE) {
if(pa->state.time == cfra)
@@ -2189,7 +2044,7 @@ void psys_update_particle_tree(ParticleSystem *psys, float cfra)
}
BLI_kdtree_balance(psys->tree);
- psys->tree_frame = psys->cfra;
+ psys->tree_frame = cfra;
}
}
}
@@ -2201,6 +2056,133 @@ static void psys_update_effectors(ParticleSimulationData *sim)
precalc_guides(sim, sim->psys->effectors);
}
+static void integrate_particle(ParticleSettings *part, ParticleData *pa, float dtime, float *external_acceleration, void (*force_func)(void *forcedata, ParticleKey *state, float *force, float *impulse), void *forcedata)
+{
+ ParticleKey states[5];
+ float force[3],acceleration[3],impulse[3],dx[4][3],dv[4][3],oldpos[3];
+ float pa_mass= (part->flag & PART_SIZEMASS ? part->mass * pa->size : part->mass);
+ int i, steps=1;
+ int integrator = part->integrator;
+
+ copy_v3_v3(oldpos, pa->state.co);
+
+ /* Verlet integration behaves strangely with moving emitters, so do first step with euler. */
+ if(pa->prev_state.time < 0.f && integrator == PART_INT_VERLET)
+ integrator = PART_INT_EULER;
+
+ switch(integrator){
+ case PART_INT_EULER:
+ steps=1;
+ break;
+ case PART_INT_MIDPOINT:
+ steps=2;
+ break;
+ case PART_INT_RK4:
+ steps=4;
+ break;
+ case PART_INT_VERLET:
+ steps=1;
+ break;
+ }
+
+ copy_particle_key(states, &pa->state, 1);
+
+ states->time = 0.f;
+
+ for(i=0; i<steps; i++){
+ zero_v3(force);
+ zero_v3(impulse);
+
+ force_func(forcedata, states+i, force, impulse);
+
+ /* force to acceleration*/
+ mul_v3_v3fl(acceleration, force, 1.0f/pa_mass);
+
+ if(external_acceleration)
+ add_v3_v3(acceleration, external_acceleration);
+
+ /* calculate next state */
+ add_v3_v3(states[i].vel, impulse);
+
+ switch(integrator){
+ case PART_INT_EULER:
+ madd_v3_v3v3fl(pa->state.co, states->co, states->vel, dtime);
+ madd_v3_v3v3fl(pa->state.vel, states->vel, acceleration, dtime);
+ break;
+ case PART_INT_MIDPOINT:
+ if(i==0){
+ madd_v3_v3v3fl(states[1].co, states->co, states->vel, dtime*0.5f);
+ madd_v3_v3v3fl(states[1].vel, states->vel, acceleration, dtime*0.5f);
+ states[1].time = dtime*0.5f;
+ /*fra=sim->psys->cfra+0.5f*dfra;*/
+ }
+ else{
+ madd_v3_v3v3fl(pa->state.co, states->co, states[1].vel, dtime);
+ madd_v3_v3v3fl(pa->state.vel, states->vel, acceleration, dtime);
+ }
+ break;
+ case PART_INT_RK4:
+ switch(i){
+ case 0:
+ copy_v3_v3(dx[0], states->vel);
+ mul_v3_fl(dx[0], dtime);
+ copy_v3_v3(dv[0], acceleration);
+ mul_v3_fl(dv[0], dtime);
+
+ madd_v3_v3v3fl(states[1].co, states->co, dx[0], 0.5f);
+ madd_v3_v3v3fl(states[1].vel, states->vel, dv[0], 0.5f);
+ states[1].time = dtime*0.5f;
+ /*fra=sim->psys->cfra+0.5f*dfra;*/
+ break;
+ case 1:
+ madd_v3_v3v3fl(dx[1], states->vel, dv[0], 0.5f);
+ mul_v3_fl(dx[1], dtime);
+ copy_v3_v3(dv[1], acceleration);
+ mul_v3_fl(dv[1], dtime);
+
+ madd_v3_v3v3fl(states[2].co, states->co, dx[1], 0.5f);
+ madd_v3_v3v3fl(states[2].vel, states->vel, dv[1], 0.5f);
+ states[2].time = dtime*0.5f;
+ break;
+ case 2:
+ madd_v3_v3v3fl(dx[2], states->vel, dv[1], 0.5f);
+ mul_v3_fl(dx[2], dtime);
+ copy_v3_v3(dv[2], acceleration);
+ mul_v3_fl(dv[2], dtime);
+
+ add_v3_v3v3(states[3].co, states->co, dx[2]);
+ add_v3_v3v3(states[3].vel, states->vel, dv[2]);
+ states[3].time = dtime;
+ /*fra=cfra;*/
+ break;
+ case 3:
+ add_v3_v3v3(dx[3], states->vel, dv[2]);
+ mul_v3_fl(dx[3], dtime);
+ copy_v3_v3(dv[3], acceleration);
+ mul_v3_fl(dv[3], dtime);
+
+ madd_v3_v3v3fl(pa->state.co, states->co, dx[0], 1.0f/6.0f);
+ madd_v3_v3fl(pa->state.co, dx[1], 1.0f/3.0f);
+ madd_v3_v3fl(pa->state.co, dx[2], 1.0f/3.0f);
+ madd_v3_v3fl(pa->state.co, dx[3], 1.0f/6.0f);
+
+ madd_v3_v3v3fl(pa->state.vel, states->vel, dv[0], 1.0f/6.0f);
+ madd_v3_v3fl(pa->state.vel, dv[1], 1.0f/3.0f);
+ madd_v3_v3fl(pa->state.vel, dv[2], 1.0f/3.0f);
+ madd_v3_v3fl(pa->state.vel, dv[3], 1.0f/6.0f);
+ }
+ break;
+ case PART_INT_VERLET: /* Verlet integration */
+ madd_v3_v3v3fl(pa->state.vel, pa->prev_state.vel, acceleration, dtime);
+ madd_v3_v3v3fl(pa->state.co, pa->prev_state.co, pa->state.vel, dtime);
+
+ sub_v3_v3v3(pa->state.vel, pa->state.co, oldpos);
+ mul_v3_fl(pa->state.vel, 1.0f/dtime);
+ break;
+ }
+ }
+}
+
/*********************************************************************************************************
SPH fluid physics
@@ -2216,7 +2198,7 @@ static void psys_update_effectors(ParticleSimulationData *sim)
***********************************************************************************************************/
#define PSYS_FLUID_SPRINGS_INITIAL_SIZE 256
-static ParticleSpring *add_fluid_spring(ParticleSystem *psys, ParticleSpring *spring)
+static ParticleSpring *sph_spring_add(ParticleSystem *psys, ParticleSpring *spring)
{
/* Are more refs required? */
if(psys->alloc_fluidsprings == 0 || psys->fluid_springs == NULL) {
@@ -2234,8 +2216,7 @@ static ParticleSpring *add_fluid_spring(ParticleSystem *psys, ParticleSpring *sp
return psys->fluid_springs + psys->tot_fluidsprings - 1;
}
-
-static void delete_fluid_spring(ParticleSystem *psys, int j)
+static void sph_spring_delete(ParticleSystem *psys, int j)
{
if (j != psys->tot_fluidsprings - 1)
psys->fluid_springs[j] = psys->fluid_springs[psys->tot_fluidsprings - 1];
@@ -2247,8 +2228,52 @@ static void delete_fluid_spring(ParticleSystem *psys, int j)
psys->fluid_springs = (ParticleSpring*)MEM_reallocN(psys->fluid_springs, psys->alloc_fluidsprings * sizeof(ParticleSpring));
}
}
+static void sph_springs_modify(ParticleSystem *psys, float dtime){
+ SPHFluidSettings *fluid = psys->part->fluid;
+ ParticleData *pa1, *pa2;
+ ParticleSpring *spring = psys->fluid_springs;
+
+ float h, d, Rij[3], rij, Lij;
+ int i;
+
+ float yield_ratio = fluid->yield_ratio;
+ float plasticity = fluid->plasticity_constant;
+ /* scale things according to dtime */
+ float timefix = 25.f * dtime;
+
+ if((fluid->flag & SPH_VISCOELASTIC_SPRINGS)==0 || fluid->spring_k == 0.f)
+ return;
-static EdgeHash *build_fluid_springhash(ParticleSystem *psys)
+ /* Loop through the springs */
+ for(i=0; i<psys->tot_fluidsprings; i++, spring++) {
+ pa1 = psys->particles + spring->particle_index[0];
+ pa2 = psys->particles + spring->particle_index[1];
+
+ sub_v3_v3v3(Rij, pa2->prev_state.co, pa1->prev_state.co);
+ rij = normalize_v3(Rij);
+
+ /* adjust rest length */
+ Lij = spring->rest_length;
+ d = yield_ratio * timefix * Lij;
+
+ if (rij > Lij + d) // Stretch
+ spring->rest_length += plasticity * (rij - Lij - d) * timefix;
+ else if(rij < Lij - d) // Compress
+ spring->rest_length -= plasticity * (Lij - d - rij) * timefix;
+
+ h = 4.f*pa1->size;
+
+ if(spring->rest_length > h)
+ spring->delete_flag = 1;
+ }
+
+ /* Loop through springs backwaqrds - for efficient delete function */
+ for (i=psys->tot_fluidsprings-1; i >= 0; i--) {
+ if(psys->fluid_springs[i].delete_flag)
+ sph_spring_delete(psys, i);
+ }
+}
+static EdgeHash *sph_springhash_build(ParticleSystem *psys)
{
EdgeHash *springhash = NULL;
ParticleSpring *spring;
@@ -2261,351 +2286,279 @@ static EdgeHash *build_fluid_springhash(ParticleSystem *psys)
return springhash;
}
-static void particle_fluidsim(ParticleSystem *psys, int own_psys, ParticleData *pa, float dtime, float mass, float *gravity, EdgeHash *springhash)
+
+typedef struct SPHNeighbor
{
- SPHFluidSettings *fluid = psys->part->fluid;
- KDTreeNearest *ptn = NULL;
- ParticleData *npa;
- ParticleSpring *spring = NULL;
+ ParticleSystem *psys;
+ int index;
+} SPHNeighbor;
+typedef struct SPHRangeData
+{
+ SPHNeighbor neighbors[128];
+ int tot_neighbors;
- float temp[3];
- float q, q1, u, I, D, rij, d, Lij;
- float pressure_near, pressure;
- float p=0, pnear=0;
-
- float omega = fluid->viscosity_omega;
- float beta = fluid->viscosity_beta;
- float massfactor = 1.0f/mass;
- float spring_k = fluid->spring_k;
- float h = fluid->radius;
- float L = fluid->rest_length * fluid->radius;
-
- int n, neighbours = BLI_kdtree_range_search(psys->tree, h, pa->prev_state.co, NULL, &ptn);
- int spring_index = 0, index = own_psys ? pa - psys->particles : -1;
-
- /* pressure and near pressure */
- for(n=own_psys?1:0; n<neighbours; n++) {
- /* disregard particles at the exact same location */
- if(ptn[n].dist < FLT_EPSILON)
- continue;
+ float density, near_density;
+ float h;
- sub_v3_v3(ptn[n].co, pa->prev_state.co);
- mul_v3_fl(ptn[n].co, 1.f/ptn[n].dist);
- q = ptn[n].dist/h;
+ ParticleSystem *npsys;
+ ParticleData *pa;
- if(q < 1.f) {
- q1 = 1.f - q;
+ float massfac;
+ int use_size;
+} SPHRangeData;
+typedef struct SPHData {
+ ParticleSystem *psys[10];
+ ParticleData *pa;
+ float mass;
+ EdgeHash *eh;
+ float *gravity;
+}SPHData;
+static void sph_density_accum_cb(void *userdata, int index, float squared_dist)
+{
+ SPHRangeData *pfr = (SPHRangeData *)userdata;
+ ParticleData *npa = pfr->npsys->particles + index;
+ float q;
- p += q1*q1;
- pnear += q1*q1*q1;
- }
- }
+ if(npa == pfr->pa || squared_dist < FLT_EPSILON)
+ return;
- p *= mass;
- pnear *= mass;
- pressure = fluid->stiffness_k * (p - fluid->rest_density);
- pressure_near = fluid->stiffness_knear * pnear;
+ /* Ugh! One particle has over 128 neighbors! Really shouldn't happen,
+ * but even if it does it shouldn't do any terrible harm if all are
+ * not taken into account - jahka
+ */
+ if(pfr->tot_neighbors >= 128)
+ return;
+
+ pfr->neighbors[pfr->tot_neighbors].index = index;
+ pfr->neighbors[pfr->tot_neighbors].psys = pfr->npsys;
+ pfr->tot_neighbors++;
- /* main calculations */
- for(n=own_psys?1:0; n<neighbours; n++) {
- /* disregard particles at the exact same location */
- if(ptn[n].dist < FLT_EPSILON)
- continue;
+ q = (1.f - sqrtf(squared_dist)/pfr->h) * pfr->massfac;
- npa = psys->particles + ptn[n].index;
+ if(pfr->use_size)
+ q *= npa->size;
- rij = ptn[n].dist;
- q = rij/h;
- q1 = 1.f-q;
+ pfr->density += q*q;
+ pfr->near_density += q*q*q;
+}
+static void sph_force_cb(void *sphdata_v, ParticleKey *state, float *force, float *UNUSED(impulse))
+{
+ SPHData *sphdata = (SPHData *)sphdata_v;
+ ParticleSystem **psys = sphdata->psys;
+ ParticleData *pa = sphdata->pa;
+ SPHFluidSettings *fluid = psys[0]->part->fluid;
+ ParticleSpring *spring = NULL;
+ SPHRangeData pfr;
+ SPHNeighbor *pfn;
+ float mass = sphdata->mass;
+ float *gravity = sphdata->gravity;
+ EdgeHash *springhash = sphdata->eh;
- /* Double Density Relaxation - Algorithm 2 (can't be thread safe!)*/
- D = dtime * dtime * (pressure + pressure_near*q1)*q1 * 0.5f;
- madd_v3_v3fl(pa->state.co, ptn[n].co, -D * massfactor);
- if(own_psys)
- madd_v3_v3fl(npa->state.co, ptn[n].co, D * massfactor);
+ float q, u, rij, dv[3];
+ float pressure, near_pressure;
- if(index < ptn[n].index) {
- /* Viscosity - Algorithm 5 */
- if(omega > 0.f || beta > 0.f) {
- sub_v3_v3v3(temp, pa->state.vel, npa->state.vel);
- u = dot_v3v3(ptn[n].co, temp);
+ float visc = fluid->viscosity_omega;
+ float stiff_visc = fluid->viscosity_beta * (fluid->flag & SPH_FAC_VISCOSITY ? fluid->viscosity_omega : 1.f);
- if (u > 0){
- I = dtime * (q1 * (omega * u + beta * u*u)) * 0.5f;
- madd_v3_v3fl(pa->state.vel, ptn[n].co, -I * massfactor);
+ float inv_mass = 1.0f/mass;
+ float spring_constant = fluid->spring_k;
+
+ float h = fluid->radius * (fluid->flag & SPH_FAC_RADIUS ? 4.f*pa->size : 1.f); /* 4.0 seems to be a pretty good value */
+ float rest_density = fluid->rest_density * (fluid->flag & SPH_FAC_DENSITY ? 4.77f : 1.f); /* 4.77 is an experimentally determined density factor */
+ float rest_length = fluid->rest_length * (fluid->flag & SPH_FAC_REST_LENGTH ? 2.588f * pa->size : 1.f);
- if(own_psys)
- madd_v3_v3fl(npa->state.vel, ptn[n].co, I * massfactor);
- }
- }
+ float stiffness = fluid->stiffness_k;
+ float stiffness_near_fac = fluid->stiffness_knear * (fluid->flag & SPH_FAC_REPULSION ? fluid->stiffness_k : 1.f);
- if(spring_k > 0.f) {
- /* Viscoelastic spring force - Algorithm 4*/
- if (fluid->flag & SPH_VISCOELASTIC_SPRINGS && springhash){
- spring_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(springhash, index, ptn[n].index));
+ ParticleData *npa;
+ float vec[3];
+ float vel[3];
+ float co[3];
- if(spring_index) {
- spring = psys->fluid_springs + spring_index - 1;
- }
- else {
- ParticleSpring temp_spring;
- temp_spring.particle_index[0] = index;
- temp_spring.particle_index[1] = ptn[n].index;
- temp_spring.rest_length = (fluid->flag & SPH_CURRENT_REST_LENGTH) ? rij : L;
- temp_spring.delete_flag = 0;
-
- spring = add_fluid_spring(psys, &temp_spring);
- }
+ int i, spring_index, index = pa - psys[0]->particles;
- Lij = spring->rest_length;
- d = fluid->yield_ratio * Lij;
+ pfr.tot_neighbors = 0;
+ pfr.density = pfr.near_density = 0.f;
+ pfr.h = h;
+ pfr.pa = pa;
- if (rij > Lij + d) // Stretch, 25 is just a multiplier for plasticity_constant value to counter default dtime of 1/25
- spring->rest_length += dtime * 25.f * fluid->plasticity_constant * (rij - Lij - d);
- else if(rij < Lij - d) // Compress
- spring->rest_length -= dtime * 25.f * fluid->plasticity_constant * (Lij - d - rij);
- }
- else { /* PART_SPRING_HOOKES - Hooke's spring force */
- /* L is a factor of radius */
- D = 0.5 * dtime * dtime * 10.f * fluid->spring_k * (1.f - L/h) * (L - rij);
-
- madd_v3_v3fl(pa->state.co, ptn[n].co, -D * massfactor);
- if(own_psys)
- madd_v3_v3fl(npa->state.co, ptn[n].co, D * massfactor);
- }
- }
- }
- }
+ for(i=0; i<10 && psys[i]; i++) {
+ pfr.npsys = psys[i];
+ pfr.massfac = psys[i]->part->mass*inv_mass;
+ pfr.use_size = psys[i]->part->flag & PART_SIZEMASS;
- /* Artificial buoyancy force in negative gravity direction */
- if (fluid->buoyancy >= 0.f && gravity) {
- float B = -dtime * dtime * fluid->buoyancy * (p - fluid->rest_density) * 0.5f;
- madd_v3_v3fl(pa->state.co, gravity, -B * massfactor);
+ BLI_bvhtree_range_query(psys[i]->bvhtree, state->co, h, sph_density_accum_cb, &pfr);
}
- if(ptn)
- MEM_freeN(ptn);
-}
+ pressure = stiffness * (pfr.density - rest_density);
+ near_pressure = stiffness_near_fac * pfr.near_density;
-static void apply_particle_fluidsim(Object *ob, ParticleSystem *psys, ParticleData *pa, float dtime, float *gravity, EdgeHash *springhash){
- ParticleTarget *pt;
+ pfn = pfr.neighbors;
+ for(i=0; i<pfr.tot_neighbors; i++, pfn++) {
+ npa = pfn->psys->particles + pfn->index;
- particle_fluidsim(psys, 1, pa, dtime, psys->part->mass, gravity, springhash);
-
- /*----check other SPH systems (Multifluids) , each fluid has its own parameters---*/
- for(pt=psys->targets.first; pt; pt=pt->next) {
- ParticleSystem *epsys = psys_get_target_system(ob, pt);
+ madd_v3_v3v3fl(co, npa->prev_state.co, npa->prev_state.vel, state->time);
- if(epsys)
- particle_fluidsim(epsys, 0, pa, dtime, psys->part->mass, gravity, NULL);
- }
- /*----------------------------------------------------------------*/
-}
+ sub_v3_v3v3(vec, co, state->co);
+ rij = normalize_v3(vec);
-static void apply_fluid_springs(ParticleSystem *psys, float timestep){
- SPHFluidSettings *fluid = psys->part->fluid;
- ParticleData *pa1, *pa2;
- ParticleSpring *spring = psys->fluid_springs;
-
- float h = fluid->radius;
- float massfactor = 1.0f/psys->part->mass;
- float D, Rij[3], rij, Lij;
- int i;
+ q = (1.f - rij/h) * pfn->psys->part->mass * inv_mass;
- if((fluid->flag & SPH_VISCOELASTIC_SPRINGS)==0 || fluid->spring_k == 0.f)
- return;
+ if(pfn->psys->part->flag & PART_SIZEMASS)
+ q *= npa->size;
- /* Loop through the springs */
- for(i=0; i<psys->tot_fluidsprings; i++, spring++) {
- Lij = spring->rest_length;
+ copy_v3_v3(vel, npa->prev_state.vel);
- if (Lij > h) {
- spring->delete_flag = 1;
- }
- else {
- pa1 = psys->particles + spring->particle_index[0];
- pa2 = psys->particles + spring->particle_index[1];
+ /* Double Density Relaxation */
+ madd_v3_v3fl(force, vec, -(pressure + near_pressure*q)*q);
- sub_v3_v3v3(Rij, pa2->prev_state.co, pa1->prev_state.co);
- rij = normalize_v3(Rij);
+ /* Viscosity */
+ if(visc > 0.f || stiff_visc > 0.f) {
+ sub_v3_v3v3(dv, vel, state->vel);
+ u = dot_v3v3(vec, dv);
- /* Calculate displacement and apply value */
- D = 0.5f * timestep * timestep * 10.f * fluid->spring_k * (1.f - Lij/h) * (Lij - rij);
+ if(u < 0.f && visc > 0.f)
+ madd_v3_v3fl(force, vec, 0.5f * q * visc * u );
- madd_v3_v3fl(pa1->state.co, Rij, -D * pa1->state.time * pa1->state.time * massfactor);
- madd_v3_v3fl(pa2->state.co, Rij, D * pa2->state.time * pa2->state.time * massfactor);
+ if(u > 0.f && stiff_visc > 0.f)
+ madd_v3_v3fl(force, vec, 0.5f * q * stiff_visc * u );
}
- }
- /* Loop through springs backwaqrds - for efficient delete function */
- for (i=psys->tot_fluidsprings-1; i >= 0; i--) {
- if(psys->fluid_springs[i].delete_flag)
- delete_fluid_spring(psys, i);
+ if(spring_constant > 0.f) {
+ /* Viscoelastic spring force */
+ if (pfn->psys == psys[0] && fluid->flag & SPH_VISCOELASTIC_SPRINGS && springhash) {
+ spring_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(springhash, index, pfn->index));
+
+ if(spring_index) {
+ spring = psys[0]->fluid_springs + spring_index - 1;
+
+ madd_v3_v3fl(force, vec, -10.f * spring_constant * (1.f - rij/h) * (spring->rest_length - rij));
+ }
+ else if(fluid->spring_frames == 0 || (pa->prev_state.time-pa->time) <= fluid->spring_frames){
+ ParticleSpring temp_spring;
+ temp_spring.particle_index[0] = index;
+ temp_spring.particle_index[1] = pfn->index;
+ temp_spring.rest_length = (fluid->flag & SPH_CURRENT_REST_LENGTH) ? rij : rest_length;
+ temp_spring.delete_flag = 0;
+
+ sph_spring_add(psys[0], &temp_spring);
+ }
+ }
+ else {/* PART_SPRING_HOOKES - Hooke's spring force */
+ madd_v3_v3fl(force, vec, -10.f * spring_constant * (1.f - rij/h) * (rest_length - rij));
+ }
+ }
}
+
+ /* Artificial buoyancy force in negative gravity direction */
+ if (fluid->buoyancy > 0.f && gravity)
+ madd_v3_v3fl(force, gravity, fluid->buoyancy * (pfr.density-rest_density));
}
-/************************************************/
-/* Newtonian physics */
-/************************************************/
-/* gathers all forces that effect particles and calculates a new state for the particle */
-static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra, float cfra)
-{
+static void sph_integrate(ParticleSimulationData *sim, ParticleData *pa, float dfra, float *gravity, EdgeHash *springhash){
+ ParticleTarget *pt;
+ int i;
+
ParticleSettings *part = sim->psys->part;
- ParticleData *pa = sim->psys->particles + p;
- EffectedPoint epoint;
- ParticleKey states[5], tkey;
- float timestep = psys_get_timestep(sim);
- float force[3],impulse[3],dx[4][3],dv[4][3],oldpos[3];
- float dtime=dfra*timestep, time, pa_mass=part->mass, fac /*, fra=sim->psys->cfra*/;
- int i, steps=1;
- ParticleTexture ptex;
+ // float timestep = psys_get_timestep(sim); // UNUSED
+ float pa_mass = part->mass * (part->flag & PART_SIZEMASS ? pa->size : 1.f);
+ float dtime = dfra*psys_get_timestep(sim);
+ // int steps = 1; // UNUSED
+ float effector_acceleration[3];
+ SPHData sphdata;
- psys_get_texture(sim, pa, &ptex, PAMAP_PHYSICS, cfra);
-
- /* maintain angular velocity */
- VECCOPY(pa->state.ave,pa->prev_state.ave);
- VECCOPY(oldpos,pa->state.co);
+ sphdata.psys[0] = sim->psys;
+ for(i=1, pt=sim->psys->targets.first; i<10; i++, pt=(pt?pt->next:NULL))
+ sphdata.psys[i] = pt ? psys_get_target_system(sim->ob, pt) : NULL;
- if(part->flag & PART_SIZEMASS)
- pa_mass*=pa->size;
+ sphdata.pa = pa;
+ sphdata.gravity = gravity;
+ sphdata.mass = pa_mass;
+ sphdata.eh = springhash;
- switch(part->integrator){
- case PART_INT_EULER:
- steps=1;
- break;
- case PART_INT_MIDPOINT:
- steps=2;
- break;
- case PART_INT_RK4:
- steps=4;
- break;
- case PART_INT_VERLET:
- steps=1;
- break;
- }
+ /* restore previous state and treat gravity & effectors as external acceleration*/
+ sub_v3_v3v3(effector_acceleration, pa->state.vel, pa->prev_state.vel);
+ mul_v3_fl(effector_acceleration, 1.f/dtime);
- copy_particle_key(states,&pa->state,1);
+ copy_particle_key(&pa->state, &pa->prev_state, 0);
- for(i=0; i<steps; i++){
- force[0]=force[1]=force[2]=0.0;
- impulse[0]=impulse[1]=impulse[2]=0.0;
- /* add effectors */
- pd_point_from_particle(sim, pa, states+i, &epoint);
- if(part->type != PART_HAIR || part->effector_weights->flag & EFF_WEIGHT_DO_HAIR)
- pdDoEffectors(sim->psys->effectors, sim->colliders, part->effector_weights, &epoint, force, impulse);
-
- mul_v3_fl(force, ptex.field);
- mul_v3_fl(impulse, ptex.field);
-
- /* calculate air-particle interaction */
- if(part->dragfac!=0.0f){
- fac=-part->dragfac*pa->size*pa->size*len_v3(states[i].vel);
- VECADDFAC(force,force,states[i].vel,fac);
- }
+ integrate_particle(part, pa, dtime, effector_acceleration, sph_force_cb, &sphdata);
+}
- /* brownian force */
- if(part->brownfac!=0.0){
- force[0]+=(BLI_frand()-0.5f)*part->brownfac;
- force[1]+=(BLI_frand()-0.5f)*part->brownfac;
- force[2]+=(BLI_frand()-0.5f)*part->brownfac;
- }
+/************************************************/
+/* Basic physics */
+/************************************************/
+typedef struct EfData
+{
+ ParticleTexture ptex;
+ ParticleSimulationData *sim;
+ ParticleData *pa;
+} EfData;
+static void basic_force_cb(void *efdata_v, ParticleKey *state, float *force, float *impulse)
+{
+ EfData *efdata = (EfData *)efdata_v;
+ ParticleSimulationData *sim = efdata->sim;
+ ParticleSettings *part = sim->psys->part;
+ ParticleData *pa = efdata->pa;
+ EffectedPoint epoint;
- /* force to acceleration*/
- mul_v3_fl(force,1.0f/pa_mass);
+ /* add effectors */
+ pd_point_from_particle(efdata->sim, efdata->pa, state, &epoint);
+ if(part->type != PART_HAIR || part->effector_weights->flag & EFF_WEIGHT_DO_HAIR)
+ pdDoEffectors(sim->psys->effectors, sim->colliders, part->effector_weights, &epoint, force, impulse);
- /* add global acceleration (gravitation) */
- if(psys_uses_gravity(sim)
- /* normal gravity is too strong for hair so it's disabled by default */
- && (part->type != PART_HAIR || part->effector_weights->flag & EFF_WEIGHT_DO_HAIR)) {
- madd_v3_v3fl(force, sim->scene->physics_settings.gravity, part->effector_weights->global_gravity * ptex.gravity);
- }
-
- /* calculate next state */
- VECADD(states[i].vel,states[i].vel,impulse);
+ mul_v3_fl(force, efdata->ptex.field);
+ mul_v3_fl(impulse, efdata->ptex.field);
- switch(part->integrator){
- case PART_INT_EULER:
- VECADDFAC(pa->state.co,states->co,states->vel,dtime);
- VECADDFAC(pa->state.vel,states->vel,force,dtime);
- break;
- case PART_INT_MIDPOINT:
- if(i==0){
- VECADDFAC(states[1].co,states->co,states->vel,dtime*0.5f);
- VECADDFAC(states[1].vel,states->vel,force,dtime*0.5f);
- /*fra=sim->psys->cfra+0.5f*dfra;*/
- }
- else{
- VECADDFAC(pa->state.co,states->co,states[1].vel,dtime);
- VECADDFAC(pa->state.vel,states->vel,force,dtime);
- }
- break;
- case PART_INT_RK4:
- switch(i){
- case 0:
- VECCOPY(dx[0],states->vel);
- mul_v3_fl(dx[0],dtime);
- VECCOPY(dv[0],force);
- mul_v3_fl(dv[0],dtime);
+ /* calculate air-particle interaction */
+ if(part->dragfac != 0.0f)
+ madd_v3_v3fl(force, state->vel, -part->dragfac * pa->size * pa->size * len_v3(state->vel));
- VECADDFAC(states[1].co,states->co,dx[0],0.5f);
- VECADDFAC(states[1].vel,states->vel,dv[0],0.5f);
- /*fra=sim->psys->cfra+0.5f*dfra;*/
- break;
- case 1:
- VECADDFAC(dx[1],states->vel,dv[0],0.5f);
- mul_v3_fl(dx[1],dtime);
- VECCOPY(dv[1],force);
- mul_v3_fl(dv[1],dtime);
+ /* brownian force */
+ if(part->brownfac != 0.0f){
+ force[0] += (BLI_frand()-0.5f) * part->brownfac;
+ force[1] += (BLI_frand()-0.5f) * part->brownfac;
+ force[2] += (BLI_frand()-0.5f) * part->brownfac;
+ }
+}
+/* gathers all forces that effect particles and calculates a new state for the particle */
+static void basic_integrate(ParticleSimulationData *sim, int p, float dfra, float cfra)
+{
+ ParticleSettings *part = sim->psys->part;
+ ParticleData *pa = sim->psys->particles + p;
+ ParticleKey tkey;
+ float dtime=dfra*psys_get_timestep(sim), time;
+ float *gravity = NULL, gr[3];
+ EfData efdata;
- VECADDFAC(states[2].co,states->co,dx[1],0.5f);
- VECADDFAC(states[2].vel,states->vel,dv[1],0.5f);
- break;
- case 2:
- VECADDFAC(dx[2],states->vel,dv[1],0.5f);
- mul_v3_fl(dx[2],dtime);
- VECCOPY(dv[2],force);
- mul_v3_fl(dv[2],dtime);
+ psys_get_texture(sim, pa, &efdata.ptex, PAMAP_PHYSICS, cfra);
- VECADD(states[3].co,states->co,dx[2]);
- VECADD(states[3].vel,states->vel,dv[2]);
- /*fra=cfra;*/
- break;
- case 3:
- VECADD(dx[3],states->vel,dv[2]);
- mul_v3_fl(dx[3],dtime);
- VECCOPY(dv[3],force);
- mul_v3_fl(dv[3],dtime);
-
- VECADDFAC(pa->state.co,states->co,dx[0],1.0f/6.0f);
- VECADDFAC(pa->state.co,pa->state.co,dx[1],1.0f/3.0f);
- VECADDFAC(pa->state.co,pa->state.co,dx[2],1.0f/3.0f);
- VECADDFAC(pa->state.co,pa->state.co,dx[3],1.0f/6.0f);
-
- VECADDFAC(pa->state.vel,states->vel,dv[0],1.0f/6.0f);
- VECADDFAC(pa->state.vel,pa->state.vel,dv[1],1.0f/3.0f);
- VECADDFAC(pa->state.vel,pa->state.vel,dv[2],1.0f/3.0f);
- VECADDFAC(pa->state.vel,pa->state.vel,dv[3],1.0f/6.0f);
- }
- break;
- case PART_INT_VERLET: /* Verlet integration */
- VECADDFAC(pa->state.vel,pa->state.vel,force,dtime);
- VECADDFAC(pa->state.co,pa->state.co,pa->state.vel,dtime);
+ efdata.pa = pa;
+ efdata.sim = sim;
- VECSUB(pa->state.vel,pa->state.co,oldpos);
- mul_v3_fl(pa->state.vel,1.0f/dtime);
- break;
- }
+ /* add global acceleration (gravitation) */
+ if(psys_uses_gravity(sim)
+ /* normal gravity is too strong for hair so it's disabled by default */
+ && (part->type != PART_HAIR || part->effector_weights->flag & EFF_WEIGHT_DO_HAIR)) {
+ zero_v3(gr);
+ madd_v3_v3fl(gr, sim->scene->physics_settings.gravity, part->effector_weights->global_gravity * efdata.ptex.gravity);
+ gravity = gr;
}
+ /* maintain angular velocity */
+ copy_v3_v3(pa->state.ave, pa->prev_state.ave);
+
+ integrate_particle(part, pa, dtime, gravity, basic_force_cb, &efdata);
+
/* damp affects final velocity */
if(part->dampfac != 0.f)
- mul_v3_fl(pa->state.vel, 1.f - part->dampfac * ptex.damp);
+ mul_v3_fl(pa->state.vel, 1.f - part->dampfac * efdata.ptex.damp);
- VECCOPY(pa->state.ave, states->ave);
+ //VECCOPY(pa->state.ave, states->ave);
/* finally we do guides */
time=(cfra-pa->time)/pa->lifetime;
- CLAMP(time,0.0,1.0);
+ CLAMP(time, 0.0f, 1.0f);
VECCOPY(tkey.co,pa->state.co);
VECCOPY(tkey.vel,pa->state.vel);
@@ -2621,7 +2574,7 @@ static void apply_particle_forces(ParticleSimulationData *sim, int p, float dfra
}
}
}
-static void rotate_particle(ParticleSettings *part, ParticleData *pa, float dfra, float timestep)
+static void basic_rotate(ParticleSettings *part, ParticleData *pa, float dfra, float timestep)
{
float rotfac, rot1[4], rot2[4]={1.0,0.0,0.0,0.0}, dtime=dfra*timestep;
@@ -2645,8 +2598,8 @@ static void rotate_particle(ParticleSettings *part, ParticleData *pa, float dfra
}
rotfac=len_v3(pa->state.ave);
- if(rotfac==0.0){ /* unit_qt(in VecRotToQuat) doesn't give unit quat [1,0,0,0]?? */
- rot1[0]=1.0;
+ if(rotfac == 0.0f){ /* unit_qt(in VecRotToQuat) doesn't give unit quat [1,0,0,0]?? */
+ rot1[0]=1.0f;
rot1[1]=rot1[2]=rot1[3]=0;
}
else{
@@ -2659,466 +2612,696 @@ static void rotate_particle(ParticleSettings *part, ParticleData *pa, float dfra
normalize_qt(pa->state.rot);
}
-/* convert from triangle barycentric weights to quad mean value weights */
-static void intersect_dm_quad_weights(float *v1, float *v2, float *v3, float *v4, float *w)
+/************************************************/
+/* Collisions */
+/************************************************/
+#define COLLISION_MAX_COLLISIONS 10
+#define COLLISION_MIN_RADIUS 0.001f
+#define COLLISION_MIN_DISTANCE 0.0001f
+#define COLLISION_ZERO 0.00001f
+typedef float (*NRDistanceFunc)(float *p, float radius, ParticleCollisionElement *pce, float *nor);
+static float nr_signed_distance_to_plane(float *p, float radius, ParticleCollisionElement *pce, float *nor)
{
- float co[3], vert[4][3];
+ float p0[3], e1[3], e2[3], d;
- VECCOPY(vert[0], v1);
- VECCOPY(vert[1], v2);
- VECCOPY(vert[2], v3);
- VECCOPY(vert[3], v4);
+ sub_v3_v3v3(e1, pce->x1, pce->x0);
+ sub_v3_v3v3(e2, pce->x2, pce->x0);
+ sub_v3_v3v3(p0, p, pce->x0);
- co[0]= v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2] + v4[0]*w[3];
- co[1]= v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2] + v4[1]*w[3];
- co[2]= v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2] + v4[2]*w[3];
+ cross_v3_v3v3(nor, e1, e2);
+ normalize_v3(nor);
- interp_weights_poly_v3( w,vert, 4, co);
-}
+ d = dot_v3v3(p0, nor);
+
+ if(pce->inv_nor == -1) {
+ if(d < 0.f)
+ pce->inv_nor = 1;
+ else
+ pce->inv_nor = 0;
+ }
-/* check intersection with a derivedmesh */
-int psys_intersect_dm(Scene *scene, Object *ob, DerivedMesh *dm, float *vert_cos, float *co1, float* co2, float *min_d, int *min_face, float *min_w,
- float *face_minmax, float *pa_minmax, float radius, float *ipoint)
+ if(pce->inv_nor == 1) {
+ mul_v3_fl(nor, -1.f);
+ d = -d;
+ }
+
+ return d - radius;
+}
+static float nr_distance_to_edge(float *p, float radius, ParticleCollisionElement *pce, float *UNUSED(nor))
{
- MFace *mface=0;
- MVert *mvert=0;
- int i, totface, intersect=0;
- float cur_d, cur_uv[2], v1[3], v2[3], v3[3], v4[3], min[3], max[3], p_min[3],p_max[3];
- float cur_ipoint[3];
-
- if(dm==0){
- psys_disable_all(ob);
+ float v0[3], v1[3], v2[3], c[3];
- dm=mesh_get_derived_final(scene, ob, 0);
- if(dm==0)
- dm=mesh_get_derived_deform(scene, ob, 0);
+ sub_v3_v3v3(v0, pce->x1, pce->x0);
+ sub_v3_v3v3(v1, p, pce->x0);
+ sub_v3_v3v3(v2, p, pce->x1);
- psys_enable_all(ob);
+ cross_v3_v3v3(c, v1, v2);
- if(dm==0)
- return 0;
+ return fabsf(len_v3(c)/len_v3(v0)) - radius;
+}
+static float nr_distance_to_vert(float *p, float radius, ParticleCollisionElement *pce, float *UNUSED(nor))
+{
+ return len_v3v3(p, pce->x0) - radius;
+}
+static void collision_interpolate_element(ParticleCollisionElement *pce, float t, float fac, ParticleCollision *col)
+{
+ /* t is the current time for newton rhapson */
+ /* fac is the starting factor for current collision iteration */
+ /* the col->fac's are factors for the particle subframe step start and end during collision modifier step */
+ float f = fac + t*(1.f-fac);
+ float mul = col->fac1 + f * (col->fac2-col->fac1);
+ if(pce->tot > 0) {
+ madd_v3_v3v3fl(pce->x0, pce->x[0], pce->v[0], mul);
+
+ if(pce->tot > 1) {
+ madd_v3_v3v3fl(pce->x1, pce->x[1], pce->v[1], mul);
+
+ if(pce->tot > 2)
+ madd_v3_v3v3fl(pce->x2, pce->x[2], pce->v[2], mul);
+ }
}
+}
+static void collision_point_velocity(ParticleCollisionElement *pce)
+{
+ float v[3];
-
+ copy_v3_v3(pce->vel, pce->v[0]);
+
+ if(pce->tot > 1) {
+ sub_v3_v3v3(v, pce->v[1], pce->v[0]);
+ madd_v3_v3fl(pce->vel, v, pce->uv[0]);
- if(pa_minmax==0){
- INIT_MINMAX(p_min,p_max);
- DO_MINMAX(co1,p_min,p_max);
- DO_MINMAX(co2,p_min,p_max);
+ if(pce->tot > 2) {
+ sub_v3_v3v3(v, pce->v[2], pce->v[0]);
+ madd_v3_v3fl(pce->vel, v, pce->uv[1]);
+ }
}
- else{
- VECCOPY(p_min,pa_minmax);
- VECCOPY(p_max,pa_minmax+3);
+}
+static float collision_point_distance_with_normal(float p[3], ParticleCollisionElement *pce, float fac, ParticleCollision *col, float *nor)
+{
+ if(fac >= 0.f)
+ collision_interpolate_element(pce, 0.f, fac, col);
+
+ switch(pce->tot) {
+ case 1:
+ {
+ sub_v3_v3v3(nor, p, pce->x0);
+ return normalize_v3(nor);
+ }
+ case 2:
+ {
+ float u, e[3], vec[3];
+ sub_v3_v3v3(e, pce->x1, pce->x0);
+ sub_v3_v3v3(vec, p, pce->x0);
+ u = dot_v3v3(vec, e) / dot_v3v3(e, e);
+
+ madd_v3_v3v3fl(nor, vec, e, -u);
+ return normalize_v3(nor);
+ }
+ case 3:
+ return nr_signed_distance_to_plane(p, 0.f, pce, nor);
}
+ return 0;
+}
+static void collision_point_on_surface(float p[3], ParticleCollisionElement *pce, float fac, ParticleCollision *col, float *co)
+{
+ collision_interpolate_element(pce, 0.f, fac, col);
- totface=dm->getNumTessFaces(dm);
- mface=dm->getTessFaceDataArray(dm,CD_MFACE);
- mvert=dm->getVertDataArray(dm,CD_MVERT);
-
- /* lets intersect the faces */
- for(i=0; i<totface; i++,mface++){
- if(vert_cos){
- VECCOPY(v1,vert_cos+3*mface->v1);
- VECCOPY(v2,vert_cos+3*mface->v2);
- VECCOPY(v3,vert_cos+3*mface->v3);
- if(mface->v4)
- VECCOPY(v4,vert_cos+3*mface->v4)
+ switch(pce->tot) {
+ case 1:
+ {
+ sub_v3_v3v3(co, p, pce->x0);
+ normalize_v3(co);
+ madd_v3_v3v3fl(co, pce->x0, co, col->radius);
+ break;
}
- else{
- VECCOPY(v1,mvert[mface->v1].co);
- VECCOPY(v2,mvert[mface->v2].co);
- VECCOPY(v3,mvert[mface->v3].co);
- if(mface->v4)
- VECCOPY(v4,mvert[mface->v4].co)
+ case 2:
+ {
+ float u, e[3], vec[3], nor[3];
+ sub_v3_v3v3(e, pce->x1, pce->x0);
+ sub_v3_v3v3(vec, p, pce->x0);
+ u = dot_v3v3(vec, e) / dot_v3v3(e, e);
+
+ madd_v3_v3v3fl(nor, vec, e, -u);
+ normalize_v3(nor);
+
+ madd_v3_v3v3fl(co, pce->x0, e, pce->uv[0]);
+ madd_v3_v3fl(co, nor, col->radius);
+ break;
}
+ case 3:
+ {
+ float p0[3], e1[3], e2[3], nor[3];
- if(face_minmax==0){
- INIT_MINMAX(min,max);
- DO_MINMAX(v1,min,max);
- DO_MINMAX(v2,min,max);
- DO_MINMAX(v3,min,max);
- if(mface->v4)
- DO_MINMAX(v4,min,max)
- if(isect_aabb_aabb_v3(min,max,p_min,p_max)==0)
- continue;
+ sub_v3_v3v3(e1, pce->x1, pce->x0);
+ sub_v3_v3v3(e2, pce->x2, pce->x0);
+ sub_v3_v3v3(p0, p, pce->x0);
+
+ cross_v3_v3v3(nor, e1, e2);
+ normalize_v3(nor);
+
+ if(pce->inv_nor == 1)
+ mul_v3_fl(nor, -1.f);
+
+ madd_v3_v3v3fl(co, pce->x0, nor, col->radius);
+ madd_v3_v3fl(co, e1, pce->uv[0]);
+ madd_v3_v3fl(co, e2, pce->uv[1]);
+ break;
}
- else{
- VECCOPY(min, face_minmax+6*i);
- VECCOPY(max, face_minmax+6*i+3);
- if(isect_aabb_aabb_v3(min,max,p_min,p_max)==0)
- continue;
+ }
+}
+/* find first root in range [0-1] starting from 0 */
+static float collision_newton_rhapson(ParticleCollision *col, float radius, ParticleCollisionElement *pce, NRDistanceFunc distance_func)
+{
+ float t0, t1, d0, d1, dd, n[3];
+ int iter;
+
+ pce->inv_nor = -1;
+
+ /* start from the beginning */
+ t0 = 0.f;
+ collision_interpolate_element(pce, t0, col->f, col);
+ d0 = distance_func(col->co1, radius, pce, n);
+ t1 = 0.001f;
+ d1 = 0.f;
+
+ for(iter=0; iter<10; iter++) {//, itersum++) {
+ /* get current location */
+ collision_interpolate_element(pce, t1, col->f, col);
+ interp_v3_v3v3(pce->p, col->co1, col->co2, t1);
+
+ d1 = distance_func(pce->p, radius, pce, n);
+
+ /* no movement, so no collision */
+ if(d1 == d0) {
+ return -1.f;
}
- if(radius>0.0f){
- if(isect_sweeping_sphere_tri_v3(co1, co2, radius, v2, v3, v1, &cur_d, cur_ipoint)){
- if(cur_d<*min_d){
- *min_d=cur_d;
- VECCOPY(ipoint,cur_ipoint);
- *min_face=i;
- intersect=1;
- }
- }
- if(mface->v4){
- if(isect_sweeping_sphere_tri_v3(co1, co2, radius, v4, v1, v3, &cur_d, cur_ipoint)){
- if(cur_d<*min_d){
- *min_d=cur_d;
- VECCOPY(ipoint,cur_ipoint);
- *min_face=i;
- intersect=1;
- }
- }
- }
+ /* particle already inside face, so report collision */
+ if(iter == 0 && d0 < 0.f && d0 > -radius) {
+ copy_v3_v3(pce->p, col->co1);
+ copy_v3_v3(pce->nor, n);
+ pce->inside = 1;
+ return 0.f;
}
- else{
- if(isect_line_tri_v3(co1, co2, v1, v2, v3, &cur_d, cur_uv)){
- if(cur_d<*min_d){
- *min_d=cur_d;
- min_w[0]= 1.0 - cur_uv[0] - cur_uv[1];
- min_w[1]= cur_uv[0];
- min_w[2]= cur_uv[1];
- min_w[3]= 0.0f;
- if(mface->v4)
- intersect_dm_quad_weights(v1, v2, v3, v4, min_w);
- *min_face=i;
- intersect=1;
- }
- }
- if(mface->v4){
- if(isect_line_tri_v3(co1, co2, v1, v3, v4, &cur_d, cur_uv)){
- if(cur_d<*min_d){
- *min_d=cur_d;
- min_w[0]= 1.0 - cur_uv[0] - cur_uv[1];
- min_w[1]= 0.0f;
- min_w[2]= cur_uv[0];
- min_w[3]= cur_uv[1];
- intersect_dm_quad_weights(v1, v2, v3, v4, min_w);
- *min_face=i;
- intersect=1;
- }
- }
+
+ dd = (t1-t0)/(d1-d0);
+
+ t0 = t1;
+ d0 = d1;
+
+ t1 -= d1*dd;
+
+ /* particle movin away from plane could also mean a strangely rotating face, so check from end */
+ if(iter == 0 && t1 < 0.f) {
+ t0 = 1.f;
+ collision_interpolate_element(pce, t0, col->f, col);
+ d0 = distance_func(col->co2, radius, pce, n);
+ t1 = 0.999f;
+ d1 = 0.f;
+
+ continue;
+ }
+ else if(iter == 1 && (t1 < -COLLISION_ZERO || t1 > 1.f))
+ return -1.f;
+
+ if(d1 <= COLLISION_ZERO && d1 >= -COLLISION_ZERO) {
+ if(t1 >= -COLLISION_ZERO && t1 <= 1.f) {
+ if(distance_func == nr_signed_distance_to_plane)
+ copy_v3_v3(pce->nor, n);
+
+ CLAMP(t1, 0.f, 1.f);
+
+ return t1;
}
+ else
+ return -1.f;
+ }
+ }
+ return -1.0;
+}
+static int collision_sphere_to_tri(ParticleCollision *col, float radius, ParticleCollisionElement *pce, float *t)
+{
+ ParticleCollisionElement *result = &col->pce;
+ float ct, u, v;
+
+ pce->inv_nor = -1;
+ pce->inside = 0;
+
+ ct = collision_newton_rhapson(col, radius, pce, nr_signed_distance_to_plane);
+
+ if(ct >= 0.f && ct < *t && (result->inside==0 || pce->inside==1) ) {
+ float e1[3], e2[3], p0[3];
+ float e1e1, e1e2, e1p0, e2e2, e2p0, inv;
+
+ sub_v3_v3v3(e1, pce->x1, pce->x0);
+ sub_v3_v3v3(e2, pce->x2, pce->x0);
+ /* XXX: add radius correction here? */
+ sub_v3_v3v3(p0, pce->p, pce->x0);
+
+ e1e1 = dot_v3v3(e1, e1);
+ e1e2 = dot_v3v3(e1, e2);
+ e1p0 = dot_v3v3(e1, p0);
+ e2e2 = dot_v3v3(e2, e2);
+ e2p0 = dot_v3v3(e2, p0);
+
+ inv = 1.f/(e1e1 * e2e2 - e1e2 * e1e2);
+ u = (e2e2 * e1p0 - e1e2 * e2p0) * inv;
+ v = (e1e1 * e2p0 - e1e2 * e1p0) * inv;
+
+ if(u>=0.f && u<=1.f && v>=0.f && u+v<=1.f) {
+ *result = *pce;
+
+ /* normal already calculated in pce */
+
+ result->uv[0] = u;
+ result->uv[1] = v;
+
+ *t = ct;
+ return 1;
}
}
- return intersect;
+ return 0;
}
+static int collision_sphere_to_edges(ParticleCollision *col, float radius, ParticleCollisionElement *pce, float *t)
+{
+ ParticleCollisionElement edge[3], *cur = NULL, *hit = NULL;
+ ParticleCollisionElement *result = &col->pce;
+
+ float ct;
+ int i;
+
+ for(i=0; i<3; i++) {
+ /* in case of a quad, no need to check "edge" that goes through face twice */
+ if((pce->x[3] && i==2))
+ continue;
+
+ cur = edge+i;
+ cur->x[0] = pce->x[i]; cur->x[1] = pce->x[(i+1)%3];
+ cur->v[0] = pce->v[i]; cur->v[1] = pce->v[(i+1)%3];
+ cur->tot = 2;
+ cur->inside = 0;
+
+ ct = collision_newton_rhapson(col, radius, cur, nr_distance_to_edge);
+
+ if(ct >= 0.f && ct < *t) {
+ float u, e[3], vec[3];
+
+ sub_v3_v3v3(e, cur->x1, cur->x0);
+ sub_v3_v3v3(vec, cur->p, cur->x0);
+ u = dot_v3v3(vec, e) / dot_v3v3(e, e);
+
+ if(u < 0.f || u > 1.f)
+ break;
+
+ *result = *cur;
+
+ madd_v3_v3v3fl(result->nor, vec, e, -u);
+ normalize_v3(result->nor);
+
+ result->uv[0] = u;
+
+
+ hit = cur;
+ *t = ct;
+ }
+
+ }
-void particle_intersect_face(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
+ return hit != NULL;
+}
+static int collision_sphere_to_verts(ParticleCollision *col, float radius, ParticleCollisionElement *pce, float *t)
+{
+ ParticleCollisionElement vert[3], *cur = NULL, *hit = NULL;
+ ParticleCollisionElement *result = &col->pce;
+
+ float ct;
+ int i;
+
+ for(i=0; i<3; i++) {
+ /* in case of quad, only check one vert the first time */
+ if(pce->x[3] && i != 1)
+ continue;
+
+ cur = vert+i;
+ cur->x[0] = pce->x[i];
+ cur->v[0] = pce->v[i];
+ cur->tot = 1;
+ cur->inside = 0;
+
+ ct = collision_newton_rhapson(col, radius, cur, nr_distance_to_vert);
+
+ if(ct >= 0.f && ct < *t) {
+ *result = *cur;
+
+ sub_v3_v3v3(result->nor, cur->p, cur->x0);
+ normalize_v3(result->nor);
+
+ hit = cur;
+ *t = ct;
+ }
+
+ }
+
+ return hit != NULL;
+}
+/* Callback for BVHTree near test */
+void BKE_psys_collision_neartest_cb(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit)
{
ParticleCollision *col = (ParticleCollision *) userdata;
+ ParticleCollisionElement pce;
MFace *face = col->md->mfaces + index;
MVert *x = col->md->x;
MVert *v = col->md->current_v;
- float vel[3], co1[3], co2[3], uv[2], ipoint[3], temp[3], t;
- float x0[3], x1[3], x2[3], x3[3];
- float *t0=x0, *t1=x1, *t2=x2, *t3=(face->v4 ? x3 : NULL);
-
- /* move collision face to start of timestep */
- madd_v3_v3v3fl(t0, x[face->v1].co, v[face->v1].co, col->cfra);
- madd_v3_v3v3fl(t1, x[face->v2].co, v[face->v2].co, col->cfra);
- madd_v3_v3v3fl(t2, x[face->v3].co, v[face->v3].co, col->cfra);
- if(t3)
- madd_v3_v3v3fl(t3, x[face->v4].co, v[face->v4].co, col->cfra);
-
- /* calculate average velocity of face */
- copy_v3_v3(vel, v[ face->v1 ].co);
- add_v3_v3(vel, v[ face->v2 ].co);
- add_v3_v3(vel, v[ face->v3 ].co);
- mul_v3_fl(vel, 0.33334f*col->dfra);
-
- /* substract face velocity, in other words convert to
- a coordinate system where only the particle moves */
- madd_v3_v3v3fl(co1, col->co1, vel, -col->f);
- sub_v3_v3v3(co2, col->co2, vel);
+ float t = hit->dist/col->original_ray_length;
+ int collision = 0;
+
+ pce.x[0] = x[face->v1].co;
+ pce.x[1] = x[face->v2].co;
+ pce.x[2] = x[face->v3].co;
+ pce.x[3] = face->v4 ? x[face->v4].co : NULL;
+
+ pce.v[0] = v[face->v1].co;
+ pce.v[1] = v[face->v2].co;
+ pce.v[2] = v[face->v3].co;
+ pce.v[3] = face->v4 ? v[face->v4].co : NULL;
+
+ pce.tot = 3;
+ pce.inside = 0;
+ pce.index = index;
+
+ /* don't collide with same face again */
+ if(col->hit == col->current && col->pce.index == index && col->pce.tot == 3)
+ return;
do
{
- if(ray->radius == 0.0f) {
- if(isect_line_tri_v3(co1, co2, t0, t1, t2, &t, uv)) {
- if(t >= 0.0f && t < hit->dist/col->ray_len) {
- hit->dist = col->ray_len * t;
- hit->index = index;
-
- /* calculate normal that's facing the particle */
- normal_tri_v3( col->nor,t0, t1, t2);
- VECSUB(temp, co2, co1);
- if(dot_v3v3(col->nor, temp) > 0.0f)
- negate_v3(col->nor);
-
- VECCOPY(col->vel,vel);
-
- col->hit_ob = col->ob;
- col->hit_md = col->md;
- }
- }
+ collision = collision_sphere_to_tri(col, ray->radius, &pce, &t);
+ if(col->pce.inside == 0) {
+ collision += collision_sphere_to_edges(col, ray->radius, &pce, &t);
+ collision += collision_sphere_to_verts(col, ray->radius, &pce, &t);
}
- else {
- if(isect_sweeping_sphere_tri_v3(co1, co2, ray->radius, t0, t1, t2, &t, ipoint)) {
- if(t >=0.0f && t < hit->dist/col->ray_len) {
- hit->dist = col->ray_len * t;
- hit->index = index;
- interp_v3_v3v3(temp, co1, co2, t);
-
- VECSUB(col->nor, temp, ipoint);
- normalize_v3(col->nor);
-
- VECCOPY(col->vel,vel);
+ if(collision) {
+ hit->dist = col->original_ray_length * t;
+ hit->index = index;
+
+ collision_point_velocity(&col->pce);
- col->hit_ob = col->ob;
- col->hit_md = col->md;
- }
- }
+ col->hit = col->current;
}
- t1 = t2;
- t2 = t3;
- t3 = NULL;
+ pce.x[1] = pce.x[2];
+ pce.x[2] = pce.x[3];
+ pce.x[3] = NULL;
- } while(t2);
+ pce.v[1] = pce.v[2];
+ pce.v[2] = pce.v[3];
+ pce.v[3] = NULL;
+
+ } while(pce.x[2]);
}
-/* Particle - Mesh collision code
- * Features:
- * - point and swept sphere to mesh surface collisions
- * - moving colliders (but not yet rotating or deforming colliders)
- * - friction & damping
- * - angular momentum <-> linear momentum
- * - high accuracy by re-applying particle acceleration after collision
- * - behaves relatively well even if limit of 10 collisions per simulation step is exceeded
- * Main parts:
- * 1. check for all possible deflectors for closest intersection on particle path
- * 2. if deflection was found calculate new coordinates or kill the particle
- */
-static void deflect_particle(ParticleSimulationData *sim, int p, float dfra, float cfra){
- Object *ground_ob = NULL;
- ParticleSettings *part = sim->psys->part;
- ParticleData *pa = sim->psys->particles + p;
- ParticleCollision col;
+static int collision_detect(ParticleData *pa, ParticleCollision *col, BVHTreeRayHit *hit, ListBase *colliders)
+{
ColliderCache *coll;
- BVHTreeRayHit hit;
- float ray_dir[3], acc[3];
- float radius = ((part->flag & PART_SIZE_DEFL)?pa->size:0.0f), boid_z = 0.0f;
- float timestep = psys_get_timestep(sim) * dfra;
- float inv_timestep = 1.0f/timestep;
- int deflections=0, max_deflections=10;
+ float ray_dir[3];
- /* get acceleration (from gravity, forcefields etc. to be re-applied after collision) */
- sub_v3_v3v3(acc, pa->state.vel, pa->prev_state.vel);
- mul_v3_fl(acc, inv_timestep);
+ if(colliders->first == NULL)
+ return 0;
- /* set values for first iteration */
- copy_v3_v3(col.co1, pa->prev_state.co);
- copy_v3_v3(col.co2, pa->state.co);
- copy_v3_v3(col.ve1, pa->prev_state.vel);
- copy_v3_v3(col.ve2, pa->state.vel);
- col.f = 0.0f;
+ sub_v3_v3v3(ray_dir, col->co2, col->co1);
+ hit->index = -1;
+ hit->dist = col->original_ray_length = len_v3(ray_dir);
+ col->pce.inside = 0;
- /* override for boids */
- if(part->phystype == PART_PHYS_BOIDS) {
- BoidParticle *bpa = pa->boid;
- radius = pa->size;
- boid_z = pa->state.co[2];
- ground_ob = bpa->ground;
+ /* even if particle is stationary we want to check for moving colliders */
+ /* if hit.dist is zero the bvhtree_ray_cast will just ignore everything */
+ if(hit->dist == 0.0f)
+ hit->dist = col->original_ray_length = 0.000001f;
+
+ for(coll = colliders->first; coll; coll=coll->next){
+ /* for boids: don't check with current ground object */
+ if(coll->ob == col->skip)
+ continue;
+
+ /* particles should not collide with emitter at birth */
+ if(coll->ob == col->emitter && pa->time < col->cfra && pa->time >= col->old_cfra)
+ continue;
+
+ col->current = coll->ob;
+ col->md = coll->collmd;
+ col->fac1 = (col->old_cfra - coll->collmd->time_x) / (coll->collmd->time_xnew - coll->collmd->time_x);
+ col->fac2 = (col->cfra - coll->collmd->time_x) / (coll->collmd->time_xnew - coll->collmd->time_x);
+
+ if(col->md && col->md->bvhtree)
+ BLI_bvhtree_ray_cast(col->md->bvhtree, col->co1, ray_dir, col->radius, hit, BKE_psys_collision_neartest_cb, col);
}
- /* 10 iterations to catch multiple deflections */
- if(sim->colliders) while(deflections < max_deflections){
- /* 1. */
+ return hit->index >= 0;
+}
+static int collision_response(ParticleData *pa, ParticleCollision *col, BVHTreeRayHit *hit, int kill, int dynamic_rotation)
+{
+ ParticleCollisionElement *pce = &col->pce;
+ PartDeflect *pd = col->hit->pd;
+ float co[3]; /* point of collision */
+ float x = hit->dist/col->original_ray_length; /* location factor of collision between this iteration */
+ float f = col->f + x * (1.0f - col->f); /* time factor of collision between timestep */
+ float dt1 = (f - col->f) * col->total_time; /* time since previous collision (in seconds) */
+ float dt2 = (1.0f - f) * col->total_time; /* time left after collision (in seconds) */
+ int through = (BLI_frand() < pd->pdef_perm) ? 1 : 0; /* did particle pass through the collision surface? */
+
+ /* calculate exact collision location */
+ interp_v3_v3v3(co, col->co1, col->co2, x);
+
+ /* particle dies in collision */
+ if(through == 0 && (kill || pd->flag & PDEFLE_KILL_PART)) {
+ pa->alive = PARS_DYING;
+ pa->dietime = col->old_cfra + (col->cfra - col->old_cfra) * f;
+
+ copy_v3_v3(pa->state.co, co);
+ interp_v3_v3v3(pa->state.vel, pa->prev_state.vel, pa->state.vel, f);
+ interp_qt_qtqt(pa->state.rot, pa->prev_state.rot, pa->state.rot, f);
+ interp_v3_v3v3(pa->state.ave, pa->prev_state.ave, pa->state.ave, f);
+
+ /* particle is dead so we don't need to calculate further */
+ return 0;
+ }
+ /* figure out velocity and other data after collision */
+ else {
+ float v0[3]; /* velocity directly before collision to be modified into velocity directly after collision */
+ float v0_nor[3];/* normal component of v0 */
+ float v0_tan[3];/* tangential component of v0 */
+ float vc_tan[3];/* tangential component of collision surface velocity */
+ float v0_dot, vc_dot;
+ float damp = pd->pdef_damp + pd->pdef_rdamp * 2 * (BLI_frand() - 0.5f);
+ float frict = pd->pdef_frict + pd->pdef_rfrict * 2 * (BLI_frand() - 0.5f);
+ float distance, nor[3], dot;
+
+ CLAMP(damp,0.0f, 1.0f);
+ CLAMP(frict,0.0f, 1.0f);
+
+ /* get exact velocity right before collision */
+ madd_v3_v3v3fl(v0, col->ve1, col->acc, dt1);
+
+ /* convert collider velocity from 1/framestep to 1/s TODO: here we assume 1 frame step for collision modifier */
+ mul_v3_fl(pce->vel, col->inv_timestep);
+
+ /* calculate tangential particle velocity */
+ v0_dot = dot_v3v3(pce->nor, v0);
+ madd_v3_v3v3fl(v0_tan, v0, pce->nor, -v0_dot);
+
+ /* calculate tangential collider velocity */
+ vc_dot = dot_v3v3(pce->nor, pce->vel);
+ madd_v3_v3v3fl(vc_tan, pce->vel, pce->nor, -vc_dot);
+
+ /* handle friction effects (tangential and angular velocity) */
+ if(frict > 0.0f) {
+ /* angular <-> linear velocity */
+ if(dynamic_rotation) {
+ float vr_tan[3], v1_tan[3], ave[3];
+
+ /* linear velocity of particle surface */
+ cross_v3_v3v3(vr_tan, pce->nor, pa->state.ave);
+ mul_v3_fl(vr_tan, pa->size);
- sub_v3_v3v3(ray_dir, col.co2, col.co1);
- hit.index = -1;
- hit.dist = col.ray_len = len_v3(ray_dir);
+ /* change to coordinates that move with the collision plane */
+ sub_v3_v3v3(v1_tan, v0_tan, vc_tan);
+
+ /* The resulting velocity is a weighted average of particle cm & surface
+ * velocity. This weight (related to particle's moment of inertia) could
+ * be made a parameter for angular <-> linear conversion.
+ */
+ madd_v3_v3fl(v1_tan, vr_tan, -0.4);
+ mul_v3_fl(v1_tan, 1.0f/1.4f); /* 1/(1+0.4) */
- col.cfra = fmod(cfra-dfra, 1.0f);
- col.dfra = dfra;
+ /* rolling friction is around 0.01 of sliding friction (could be made a parameter) */
+ mul_v3_fl(v1_tan, 1.0f - 0.01f * frict);
- /* even if particle is stationary we want to check for moving colliders */
- /* if hit.dist is zero the bvhtree_ray_cast will just ignore everything */
- if(hit.dist == 0.0f)
- hit.dist = col.ray_len = 0.000001f;
+ /* surface_velocity is opposite to cm velocity */
+ mul_v3_v3fl(vr_tan, v1_tan, -1.0f);
- for(coll = sim->colliders->first; coll; coll=coll->next){
- /* for boids: don't check with current ground object */
- if(coll->ob == ground_ob)
- continue;
+ /* get back to global coordinates */
+ add_v3_v3(v1_tan, vc_tan);
- /* particles should not collide with emitter at birth */
- if(coll->ob == sim->ob && pa->time < cfra && pa->time >= sim->psys->cfra)
- continue;
+ /* convert to angular velocity*/
+ cross_v3_v3v3(ave, vr_tan, pce->nor);
+ mul_v3_fl(ave, 1.0f/MAX2(pa->size, 0.001f));
- col.ob = coll->ob;
- col.md = coll->collmd;
+ /* only friction will cause change in linear & angular velocity */
+ interp_v3_v3v3(pa->state.ave, pa->state.ave, ave, frict);
+ interp_v3_v3v3(v0_tan, v0_tan, v1_tan, frict);
+ }
+ else {
+ /* just basic friction (unphysical due to the friction model used in Blender) */
+ interp_v3_v3v3(v0_tan, v0_tan, vc_tan, frict);
+ }
+ }
- if(col.md && col.md->bvhtree)
- BLI_bvhtree_ray_cast(col.md->bvhtree, col.co1, ray_dir, radius, &hit, particle_intersect_face, &col);
+ /* stickness was possibly added before, so cancel that before calculating new normal velocity */
+ /* otherwise particles go flying out of the surface because of high reversed sticky velocity */
+ if(v0_dot < 0.0f) {
+ v0_dot += pd->pdef_stickness;
+ if(v0_dot > 0.0f)
+ v0_dot = 0.0f;
}
- /* 2. */
- if(hit.index>=0) {
- PartDeflect *pd = col.hit_ob->pd;
- float co[3]; /* point of collision */
- float x = hit.dist/col.ray_len; /* location factor of collision between this iteration */
- float f = col.f + x * (1.0f - col.f); /* time factor of collision between timestep */
- float dt1 = (f - col.f) * timestep; /* time since previous collision (in seconds) */
- float dt2 = (1.0f - f) * timestep; /* time left after collision (in seconds) */
- int through = (BLI_frand() < pd->pdef_perm) ? 1 : 0; /* did particle pass through the collision surface? */
-
- deflections++;
-
- interp_v3_v3v3(co, col.co1, col.co2, x);
-
- /* make sure we don't hit the current face again */
- /* TODO: could/should this be proportional to pa->size? */
- madd_v3_v3fl(co, col.nor, (through ? -0.0001f : 0.0001f));
+ /* damping and flipping of velocity around normal */
+ v0_dot *= 1.0f - damp;
+ vc_dot *= through ? damp : 1.0f;
- /* particle dies in collision */
- if(through == 0 && (part->flag & PART_DIE_ON_COL || pd->flag & PDEFLE_KILL_PART)) {
- pa->alive = PARS_DYING;
- pa->dietime = sim->psys->cfra + (cfra - sim->psys->cfra) * f;
+ /* calculate normal particle velocity */
+ /* special case for object hitting the particle from behind */
+ if(through==0 && ((vc_dot>0.0f && v0_dot>0.0f && vc_dot>v0_dot) || (vc_dot<0.0f && v0_dot<0.0f && vc_dot<v0_dot)))
+ mul_v3_v3fl(v0_nor, pce->nor, vc_dot);
+ else if(v0_dot > 0.f)
+ mul_v3_v3fl(v0_nor, pce->nor, vc_dot + (through ? -1.0f : 1.0f) * v0_dot);
+ else
+ mul_v3_v3fl(v0_nor, pce->nor, vc_dot + (through ? 1.0f : -1.0f) * v0_dot);
- copy_v3_v3(pa->state.co, co);
- interp_v3_v3v3(pa->state.vel, pa->prev_state.vel, pa->state.vel, f);
- interp_qt_qtqt(pa->state.rot, pa->prev_state.rot, pa->state.rot, f);
- interp_v3_v3v3(pa->state.ave, pa->prev_state.ave, pa->state.ave, f);
+ /* combine components together again */
+ add_v3_v3v3(v0, v0_nor, v0_tan);
- /* particle is dead so we don't need to calculate further */
- return;
+ if(col->boid) {
+ /* keep boids above ground */
+ BoidParticle *bpa = pa->boid;
+ if(bpa->data.mode == eBoidMode_OnLand || co[2] <= col->boid_z) {
+ co[2] = col->boid_z;
+ v0[2] = 0.0f;
}
- /* figure out velocity and other data after collision */
- else {
- float v0[3]; /* velocity directly before collision to be modified into velocity directly after collision */
- float v0_nor[3];/* normal component of v0 */
- float v0_tan[3];/* tangential component of v0 */
- float vc_tan[3];/* tangential component of collision surface velocity */
- float check[3];
- float v0_dot, vc_dot, check_dot;
- float damp, frict;
-
- /* get exact velocity right before collision */
- madd_v3_v3v3fl(v0, col.ve1, acc, dt1);
-
- /* convert collider velocity from 1/framestep to 1/s */
- mul_v3_fl(col.vel, inv_timestep);
-
- /* get damping & friction factors */
- damp = pd->pdef_damp + pd->pdef_rdamp * 2 * (BLI_frand() - 0.5f);
- CLAMP(damp,0.0,1.0);
+ }
+
+ /* re-apply acceleration to final location and velocity */
+ madd_v3_v3v3fl(pa->state.co, co, v0, dt2);
+ madd_v3_v3fl(pa->state.co, col->acc, 0.5f*dt2*dt2);
+ madd_v3_v3v3fl(pa->state.vel, v0, col->acc, dt2);
+
+ /* make sure particle stays on the right side of the surface */
+ if(!through) {
+ distance = collision_point_distance_with_normal(co, pce, -1.f, col, nor);
+
+ if(distance < col->radius + COLLISION_MIN_DISTANCE)
+ madd_v3_v3fl(co, nor, col->radius + COLLISION_MIN_DISTANCE - distance);
- frict = pd->pdef_frict + pd->pdef_rfrict * 2 * (BLI_frand() - 0.5f);
- CLAMP(frict,0.0,1.0);
+ dot = dot_v3v3(nor, v0);
+ if(dot < 0.f)
+ madd_v3_v3fl(v0, nor, -dot);
- /* treat normal & tangent components separately */
- v0_dot = dot_v3v3(col.nor, v0);
- madd_v3_v3v3fl(v0_tan, v0, col.nor, -v0_dot);
+ distance = collision_point_distance_with_normal(pa->state.co, pce, 1.f, col, nor);
- vc_dot = dot_v3v3(col.nor, col.vel);
- madd_v3_v3v3fl(vc_tan, col.vel, col.nor, -vc_dot);
+ if(distance < col->radius + COLLISION_MIN_DISTANCE)
+ madd_v3_v3fl(pa->state.co, nor, col->radius + COLLISION_MIN_DISTANCE - distance);
- /* handle friction effects (tangential and angular velocity) */
- if(frict > 0.0f) {
- /* angular <-> linear velocity */
- if(part->flag & PART_ROT_DYN) {
- float vr_tan[3], v1_tan[3], ave[3];
-
- /* linear velocity of particle surface */
- cross_v3_v3v3(vr_tan, col.nor, pa->state.ave);
- mul_v3_fl(vr_tan, pa->size);
+ dot = dot_v3v3(nor, pa->state.vel);
+ if(dot < 0.f)
+ madd_v3_v3fl(pa->state.vel, nor, -dot);
+ }
- /* change to coordinates that move with the collision plane */
- sub_v3_v3v3(v1_tan, v0_tan, vc_tan);
-
- /* The resulting velocity is a weighted average of particle cm & surface
- * velocity. This weight (related to particle's moment of inertia) could
- * be made a parameter for angular <-> linear conversion.
- */
- madd_v3_v3fl(v1_tan, vr_tan, -0.4);
- mul_v3_fl(v1_tan, 1.0f/1.4f); /* 1/(1+0.4) */
+ /* add stickness to surface */
+ madd_v3_v3fl(pa->state.vel, pce->nor, -pd->pdef_stickness);
- /* rolling friction is around 0.01 of sliding friction (could be made a parameter) */
- mul_v3_fl(v1_tan, 1.0f - 0.01f * frict);
+ /* set coordinates for next iteration */
+ copy_v3_v3(col->co1, co);
+ copy_v3_v3(col->co2, pa->state.co);
- /* surface_velocity is opposite to cm velocity */
- mul_v3_v3fl(vr_tan, v1_tan, -1.0f);
+ copy_v3_v3(col->ve1, v0);
+ copy_v3_v3(col->ve2, pa->state.vel);
- /* get back to global coordinates */
- add_v3_v3(v1_tan, vc_tan);
+ col->f = f;
+ }
- /* convert to angular velocity*/
- cross_v3_v3v3(ave, vr_tan, col.nor);
- mul_v3_fl(ave, 1.0f/MAX2(pa->size, 0.001));
+ col->prev = col->hit;
+ col->prev_index = hit->index;
- /* only friction will cause change in linear & angular velocity */
- interp_v3_v3v3(pa->state.ave, pa->state.ave, ave, frict);
- interp_v3_v3v3(v0_tan, v0_tan, v1_tan, frict);
- }
- else {
- /* just basic friction (unphysical due to the friction model used in Blender) */
- interp_v3_v3v3(v0_tan, v0_tan, vc_tan, frict);
- }
- }
+ return 1;
+}
+static void collision_fail(ParticleData *pa, ParticleCollision *col)
+{
+ /* final chance to prevent total failure, so stick to the surface and hope for the best */
+ collision_point_on_surface(col->co1, &col->pce, 1.f, col, pa->state.co);
- /* stickness was possibly added before, so cancel that before calculating new normal velocity */
- /* otherwise particles go flying out of the surface because of high reversed sticky velocity */
- if(v0_dot < 0.0f) {
- v0_dot += pd->pdef_stickness;
- if(v0_dot > 0.0f)
- v0_dot = 0.0f;
- }
+ copy_v3_v3(pa->state.vel, col->pce.vel);
+ mul_v3_fl(pa->state.vel, col->inv_timestep);
- /* damping and flipping of velocity around normal */
- v0_dot *= 1.0f - damp;
- vc_dot *= through ? damp : 1.0f;
- /* special case for object hitting the particle from behind */
- if(through==0 && ((vc_dot>0.0f && v0_dot>0.0f && vc_dot>v0_dot) || (vc_dot<0.0f && v0_dot<0.0f && vc_dot<v0_dot)))
- mul_v3_v3fl(v0_nor, col.nor, vc_dot);
- else
- mul_v3_v3fl(v0_nor, col.nor, vc_dot + (through ? 1.0f : -1.0f) * v0_dot);
+ /* printf("max iterations\n"); */
+}
- /* combine components together again */
- add_v3_v3v3(v0, v0_nor, v0_tan);
+/* Particle - Mesh collision detection and response
+ * Features:
+ * -friction and damping
+ * -angular momentum <-> linear momentum
+ * -high accuracy by re-applying particle acceleration after collision
+ * -handles moving, rotating and deforming meshes
+ * -uses Newton-Rhapson iteration to find the collisions
+ * -handles spherical particles and (nearly) point like particles
+ */
+static void collision_check(ParticleSimulationData *sim, int p, float dfra, float cfra){
+ ParticleSettings *part = sim->psys->part;
+ ParticleData *pa = sim->psys->particles + p;
+ ParticleCollision col;
+ BVHTreeRayHit hit;
+ int collision_count=0;
- /* keep boids above ground */
- if(part->phystype == PART_PHYS_BOIDS && part->boids->options & BOID_ALLOW_LAND) {
- BoidParticle *bpa = pa->boid;
- if(bpa->data.mode == eBoidMode_OnLand || co[2] <= boid_z) {
- co[2] = boid_z;
- v0[2] = 0.0f;
- }
- }
-
- if(deflections < max_deflections) {
- /* re-apply acceleration to final velocity and location */
- madd_v3_v3v3fl(pa->state.vel, v0, acc, dt2);
- madd_v3_v3v3fl(pa->state.co, co, v0, dt2);
- madd_v3_v3fl(pa->state.co, acc, 0.5f*dt2*dt2);
+ float timestep = psys_get_timestep(sim);
- /* make sure particle stays on the right side of the surface */
- sub_v3_v3v3(check, pa->state.co, co);
- /* (collision surface has moved during the time too) */
- madd_v3_v3fl(check, col.vel, -dt2);
+ memset(&col, 0, sizeof(ParticleCollision));
- check_dot = dot_v3v3(check, col.nor);
- if((!through && check_dot < 0.0f) || (through && check_dot > 0.0f))
- madd_v3_v3fl(pa->state.co, col.nor, (through ? -0.0001f : 0.0001f) - check_dot);
+ col.total_time = timestep * dfra;
+ col.inv_timestep = 1.0f/timestep;
- /* Stickness to surface */
- madd_v3_v3fl(pa->state.vel, col.nor, -pd->pdef_stickness);
+ col.cfra = cfra;
+ col.old_cfra = sim->psys->cfra;
- /* set coordinates for next iteration */
- copy_v3_v3(col.co1, co);
- copy_v3_v3(col.co2, pa->state.co);
+ /* get acceleration (from gravity, forcefields etc. to be re-applied in collision response) */
+ sub_v3_v3v3(col.acc, pa->state.vel, pa->prev_state.vel);
+ mul_v3_fl(col.acc, 1.f/col.total_time);
- copy_v3_v3(col.ve1, v0);
- copy_v3_v3(col.ve2, pa->state.vel);
+ /* set values for first iteration */
+ copy_v3_v3(col.co1, pa->prev_state.co);
+ copy_v3_v3(col.co2, pa->state.co);
+ copy_v3_v3(col.ve1, pa->prev_state.vel);
+ copy_v3_v3(col.ve2, pa->state.vel);
+ col.f = 0.0f;
- col.f = f;
- }
- else {
- /* final chance to prevent failure, so stick to the surface and hope for the best */
- madd_v3_v3v3fl(pa->state.co, co, col.vel, dt2);
- copy_v3_v3(pa->state.vel, v0);
- }
- }
+ col.radius = ((part->flag & PART_SIZE_DEFL) || (part->phystype == PART_PHYS_BOIDS)) ? pa->size : COLLISION_MIN_RADIUS;
+
+ /* override for boids */
+ if(part->phystype == PART_PHYS_BOIDS && part->boids->options & BOID_ALLOW_LAND) {
+ col.boid = 1;
+ col.boid_z = pa->state.co[2];
+ col.skip = pa->boid->ground;
+ }
+
+ /* 10 iterations to catch multiple collisions */
+ while(collision_count < COLLISION_MAX_COLLISIONS){
+ if(collision_detect(pa, &col, &hit, sim->colliders)) {
+
+ collision_count++;
+
+ if(collision_count == COLLISION_MAX_COLLISIONS)
+ collision_fail(pa, &col);
+ else if(collision_response(pa, &col, &hit, part->flag & PART_DIE_ON_COL, part->flag & PART_ROT_DYN)==0)
+ return;
}
else
return;
@@ -3150,7 +3333,7 @@ static void psys_update_path_cache(ParticleSimulationData *sim, float cfra)
if(!(psys->part->type == PART_HAIR) || (psys->flag & PSYS_HAIR_DONE)) {
distribute_particles(sim, PART_FROM_CHILD);
- if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES && part->parents!=0.0)
+ if(part->childtype==PART_CHILD_FACES && part->parents != 0.0f)
psys_find_parents(sim);
}
}
@@ -3403,11 +3586,11 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
timestep = psys_get_timestep(sim);
dtime= dfra*timestep;
- if(dfra<0.0){
+ if(dfra < 0.0f) {
LOOP_EXISTING_PARTICLES {
psys_get_texture(sim, pa, &ptex, PAMAP_SIZE, cfra);
pa->size = part->size*ptex.size;
- if(part->randsize > 0.0)
+ if(part->randsize > 0.0f)
pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
reset_particle(sim, pa, dtime, cfra);
@@ -3446,11 +3629,11 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
case PART_PHYS_FLUID:
{
ParticleTarget *pt = psys->targets.first;
- psys_update_particle_tree(psys, cfra);
+ psys_update_particle_bvhtree(psys, psys->cfra);
for(; pt; pt=pt->next) { /* Updating others systems particle tree for fluid-fluid interaction */
if(pt->ob)
- psys_update_particle_tree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), cfra);
+ psys_update_particle_bvhtree(BLI_findlink(&pt->ob->particlesystem, pt->psys-1), psys->cfra);
}
break;
}
@@ -3462,7 +3645,7 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
psys_get_texture(sim, pa, &ptex, PAMAP_SIZE, cfra);
pa->size = part->size*ptex.size;
- if(part->randsize > 0.0)
+ if(part->randsize > 0.0f)
pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
birthtime = pa->time;
@@ -3502,14 +3685,14 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
{
LOOP_DYNAMIC_PARTICLES {
/* do global forces & effectors */
- apply_particle_forces(sim, p, pa->state.time, cfra);
+ basic_integrate(sim, p, pa->state.time, cfra);
/* deflection */
if(sim->colliders)
- deflect_particle(sim, p, pa->state.time, cfra);
+ collision_check(sim, p, pa->state.time, cfra);
/* rotations */
- rotate_particle(part, pa, pa->state.time, timestep);
+ basic_rotate(part, pa, pa->state.time, timestep);
}
break;
}
@@ -3525,50 +3708,35 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra)
/* deflection */
if(sim->colliders)
- deflect_particle(sim, p, pa->state.time, cfra);
+ collision_check(sim, p, pa->state.time, cfra);
}
}
break;
}
case PART_PHYS_FLUID:
{
- EdgeHash *springhash = build_fluid_springhash(psys);
+ EdgeHash *springhash = sph_springhash_build(psys);
float *gravity = NULL;
if(psys_uses_gravity(sim))
gravity = sim->scene->physics_settings.gravity;
- /* do global forces & effectors */
- LOOP_DYNAMIC_PARTICLES {
- apply_particle_forces(sim, p, pa->state.time, cfra);
- /* in fluids forces only effect velocity */
- copy_v3_v3(pa->state.co, pa->prev_state.co);
- }
-
- /* actual fluids calculations (not threadsafe!) */
- LOOP_DYNAMIC_PARTICLES {
- apply_particle_fluidsim(sim->ob, psys, pa, pa->state.time*timestep, gravity, springhash);
- }
-
- /* Apply springs to particles */
- apply_fluid_springs(psys, timestep);
-
- /* apply velocity, collisions and rotation */
LOOP_DYNAMIC_PARTICLES {
- /* velocity holds forces and viscosity, so apply them before collisions */
- madd_v3_v3fl(pa->state.co, pa->state.vel, pa->state.time*timestep);
+ /* do global forces & effectors */
+ basic_integrate(sim, p, pa->state.time, cfra);
- /* calculate new velocity based on new-old location */
- sub_v3_v3v3(pa->state.vel, pa->state.co, pa->prev_state.co);
- mul_v3_fl(pa->state.vel, 1.f/(pa->state.time*timestep));
+ /* actual fluids calculations */
+ sph_integrate(sim, pa, pa->state.time, gravity, springhash);
if(sim->colliders)
- deflect_particle(sim, p, pa->state.time, cfra);
+ collision_check(sim, p, pa->state.time, cfra);
/* SPH particles are not physical particles, just interpolation particles, thus rotation has not a direct sense for them */
- rotate_particle(part, pa, pa->state.time, timestep);
+ basic_rotate(part, pa, pa->state.time, timestep);
}
+ sph_springs_modify(psys, timestep);
+
if(springhash) {
BLI_edgehash_free(springhash, NULL);
springhash = NULL;
@@ -3621,7 +3789,7 @@ static void cached_step(ParticleSimulationData *sim, float cfra)
LOOP_PARTICLES {
psys_get_texture(sim, pa, &ptex, PAMAP_SIZE, cfra);
pa->size = part->size*ptex.size;
- if(part->randsize > 0.0)
+ if(part->randsize > 0.0f)
pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
psys->lattice= psys_get_lattice(sim);
@@ -3917,13 +4085,6 @@ static void psys_changed_type(ParticleSimulationData *sim)
BKE_ptcache_id_from_particles(&pid, sim->ob, sim->psys);
- if(part->from == PART_FROM_PARTICLE) {
- //if(part->type != PART_REACTOR)
- part->from = PART_FROM_FACE;
- if(part->distr == PART_DISTR_GRID && part->from != PART_FROM_VERT)
- part->distr = PART_DISTR_JIT;
- }
-
if(part->phystype != PART_PHYS_KEYED)
sim->psys->flag &= ~PSYS_KEYED;
@@ -3931,6 +4092,9 @@ static void psys_changed_type(ParticleSimulationData *sim)
if(ELEM4(part->ren_as, PART_DRAW_NOT, PART_DRAW_PATH, PART_DRAW_OB, PART_DRAW_GR)==0)
part->ren_as = PART_DRAW_PATH;
+ if(part->distr == PART_DISTR_GRID)
+ part->distr = PART_DISTR_JIT;
+
if(ELEM3(part->draw_as, PART_DRAW_NOT, PART_DRAW_REND, PART_DRAW_PATH)==0)
part->draw_as = PART_DRAW_REND;
@@ -3976,17 +4140,18 @@ void psys_check_boid_data(ParticleSystem *psys)
static void fluid_default_settings(ParticleSettings *part){
SPHFluidSettings *fluid = part->fluid;
- fluid->radius = 0.5f;
fluid->spring_k = 0.f;
fluid->plasticity_constant = 0.1f;
fluid->yield_ratio = 0.1f;
- fluid->rest_length = 0.5f;
+ fluid->rest_length = 1.f;
fluid->viscosity_omega = 2.f;
- fluid->viscosity_beta = 0.f;
- fluid->stiffness_k = 0.1f;
- fluid->stiffness_knear = 0.05f;
- fluid->rest_density = 10.f;
+ fluid->viscosity_beta = 0.1f;
+ fluid->stiffness_k = 1.f;
+ fluid->stiffness_knear = 1.f;
+ fluid->rest_density = 1.f;
fluid->buoyancy = 0.f;
+ fluid->radius = 1.f;
+ fluid->flag |= SPH_FAC_REPULSION|SPH_FAC_DENSITY|SPH_FAC_RADIUS|SPH_FAC_VISCOSITY|SPH_FAC_REST_LENGTH;
}
static void psys_prepare_physics(ParticleSimulationData *sim)
@@ -4105,7 +4270,8 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
for(i=0; i<=part->hair_step; i++){
hcfra=100.0f*(float)i/(float)psys->part->hair_step;
- BKE_animsys_evaluate_animdata(&part->id, part->adt, hcfra, ADT_RECALC_ANIM);
+ if((part->flag & PART_HAIR_REGROW)==0)
+ BKE_animsys_evaluate_animdata(&part->id, part->adt, hcfra, ADT_RECALC_ANIM);
system_step(&sim, hcfra);
psys->cfra = hcfra;
psys->recalc = 0;
@@ -4144,11 +4310,14 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
free_keyed_keys(psys);
distribute_particles(&sim, part->from);
initialize_all_particles(&sim);
+
+ /* flag for possible explode modifiers after this system */
+ sim.psmd->flag |= eParticleSystemFlag_Pars;
}
LOOP_EXISTING_PARTICLES {
pa->size = part->size;
- if(part->randsize > 0.0)
+ if(part->randsize > 0.0f)
pa->size *= 1.0f - part->randsize * PSYS_FRAND(p + 1);
reset_particle(&sim, pa, 0.0, cfra);
@@ -4177,6 +4346,16 @@ void particle_system_update(Scene *scene, Object *ob, ParticleSystem *psys)
}
}
+ if(psys->cfra < cfra) {
+ /* make sure emitter is left at correct time (particle emission can change this) */
+ while(ob) {
+ BKE_animsys_evaluate_animdata(&ob->id, ob->adt, cfra, ADT_RECALC_ANIM);
+ ob = ob->parent;
+ }
+ ob = sim.ob;
+ where_is_object_time(scene, ob, cfra);
+ }
+
psys->cfra = cfra;
psys->recalc = 0;
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 6ea14606660..a8447e2a12a 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/pointcache.c
+ * \ingroup bke
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -1023,7 +1028,6 @@ static int ptcache_file_compressed_read(PTCacheFile *pf, unsigned char *result,
size_t in_len;
#ifdef WITH_LZO
size_t out_len = len;
- size_t sizeOfIt = 5;
#endif
unsigned char *in;
unsigned char *props = MEM_callocN(16*sizeof(char), "tmp");
@@ -1046,6 +1050,7 @@ static int ptcache_file_compressed_read(PTCacheFile *pf, unsigned char *result,
#ifdef WITH_LZMA
if(compressed == 2)
{
+ size_t sizeOfIt;
size_t leni = in_len, leno = out_len;
ptcache_file_read(pf, &size, 1, sizeof(unsigned int));
sizeOfIt = (size_t)size;
@@ -1393,7 +1398,7 @@ static PTCacheMem *ptcache_disk_frame_to_mem(PTCacheID *pid, int cfra)
unsigned int i, error = 0;
if(pf == NULL)
- return 0;
+ return NULL;
if(!ptcache_file_header_begin_read(pf))
error = 1;
@@ -2512,14 +2517,55 @@ typedef struct {
Scene *scene;
} ptcache_bake_data;
+static void ptcache_dt_to_str(char *str, double dtime)
+{
+ if(dtime > 60.0) {
+ if(dtime > 3600.0)
+ sprintf(str, "%ih %im %is", (int)(dtime/3600), ((int)(dtime/60))%60, ((int)dtime) % 60);
+ else
+ sprintf(str, "%im %is", ((int)(dtime/60))%60, ((int)dtime) % 60);
+ }
+ else
+ sprintf(str, "%is", ((int)dtime) % 60);
+}
+
static void *ptcache_bake_thread(void *ptr) {
+ int usetimer = 0, sfra, efra;
+ double stime, ptime, ctime, fetd;
+ char run[32], cur[32], etd[32];
+
ptcache_bake_data *data = (ptcache_bake_data*)ptr;
+ stime = ptime = PIL_check_seconds_timer();
+ sfra = *data->cfra_ptr;
+ efra = data->endframe;
+
for(; (*data->cfra_ptr <= data->endframe) && !data->break_operation; *data->cfra_ptr+=data->step) {
scene_update_for_newframe(data->main, data->scene, data->scene->lay);
if(G.background) {
printf("bake: frame %d :: %d\n", (int)*data->cfra_ptr, data->endframe);
}
+ else {
+ ctime = PIL_check_seconds_timer();
+
+ fetd = (ctime-ptime)*(efra-*data->cfra_ptr)/data->step;
+
+ if(usetimer || fetd > 60.0) {
+ usetimer = 1;
+
+ ptcache_dt_to_str(cur, ctime-ptime);
+ ptcache_dt_to_str(run, ctime-stime);
+ ptcache_dt_to_str(etd, fetd);
+
+ printf("Baked for %s, current frame: %i/%i (%.3fs), ETC: %s \r", run, *data->cfra_ptr-sfra+1, efra-sfra+1, ctime-ptime, etd);
+ }
+ ptime = ctime;
+ }
+ }
+
+ if(usetimer) {
+ ptcache_dt_to_str(run, PIL_check_seconds_timer()-stime);
+ printf("Bake %s %s (%i frames simulated). \n", (data->break_operation ? "canceled after" : "finished in"), run, *data->cfra_ptr-sfra);
}
data->thread_ended = TRUE;
diff --git a/source/blender/blenkernel/intern/property.c b/source/blender/blenkernel/intern/property.c
index e907b628242..d0e4832889b 100644
--- a/source/blender/blenkernel/intern/property.c
+++ b/source/blender/blenkernel/intern/property.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/property.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
diff --git a/source/blender/blenkernel/intern/report.c b/source/blender/blenkernel/intern/report.c
index fa2e867d483..ed3739e897d 100644
--- a/source/blender/blenkernel/intern/report.c
+++ b/source/blender/blenkernel/intern/report.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/report.c
+ * \ingroup bke
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
diff --git a/source/blender/blenkernel/intern/sca.c b/source/blender/blenkernel/intern/sca.c
index c8a855c8156..ceafb06fce6 100644
--- a/source/blender/blenkernel/intern/sca.c
+++ b/source/blender/blenkernel/intern/sca.c
@@ -29,6 +29,11 @@
* all data is 'direct data', not Blender lib data.
*/
+/** \file blender/blenkernel/intern/sca.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <string.h>
#include <float.h>
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 1611116f0af..c4eefb16348 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/scene.c
+ * \ingroup bke
+ */
+
+
#include <stddef.h>
#include <stdio.h>
#include <string.h>
@@ -827,54 +832,6 @@ char *scene_find_last_marker_name(Scene *scene, int frame)
return best_marker ? best_marker->name : NULL;
}
-/* markers need transforming from different parts of the code so have
- * a generic function to do this */
-int scene_marker_tfm_translate(Scene *scene, int delta, int flag)
-{
- TimeMarker *marker;
- int tot= 0;
-
- for (marker= scene->markers.first; marker; marker= marker->next) {
- if ((marker->flag & flag) == flag) {
- marker->frame += delta;
- tot++;
- }
- }
-
- return tot;
-}
-
-int scene_marker_tfm_extend(Scene *scene, int delta, int flag, int frame, char side)
-{
- TimeMarker *marker;
- int tot= 0;
-
- for (marker= scene->markers.first; marker; marker= marker->next) {
- if ((marker->flag & flag) == flag) {
- if((side=='L' && marker->frame < frame) || (side=='R' && marker->frame >= frame)) {
- marker->frame += delta;
- tot++;
- }
- }
- }
-
- return tot;
-}
-
-int scene_marker_tfm_scale(struct Scene *scene, float value, int flag)
-{
- TimeMarker *marker;
- int tot= 0;
-
- for (marker= scene->markers.first; marker; marker= marker->next) {
- if ((marker->flag & flag) == flag) {
- marker->frame= CFRA + (int)floorf(((float)(marker->frame - CFRA) * value) + 0.5f);
- tot++;
- }
- }
-
- return tot;
-}
Base *scene_add_base(Scene *sce, Object *ob)
{
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 58900e603e3..63e35408381 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/screen.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -231,6 +236,26 @@ void BKE_spacedata_copylist(ListBase *lb1, ListBase *lb2)
}
}
+/* facility to set locks for drawing to survive (render) threads accessing drawing data */
+/* lock can become bitflag too */
+/* should be replaced in future by better local data handling for threads */
+void BKE_spacedata_draw_locks(int set)
+{
+ SpaceType *st;
+
+ for(st= spacetypes.first; st; st= st->next) {
+ ARegionType *art;
+
+ for(art= st->regiontypes.first; art; art= art->next) {
+ if(set)
+ art->do_lock= art->lock;
+ else
+ art->do_lock= 0;
+ }
+ }
+}
+
+
/* not region itself */
void BKE_area_region_free(SpaceType *st, ARegion *ar)
{
@@ -390,3 +415,4 @@ void BKE_screen_view3d_main_sync(ListBase *screen_lb, Scene *scene)
BKE_screen_view3d_sync((View3D*)sl, scene);
}
}
+
diff --git a/source/blender/blenkernel/intern/script.c b/source/blender/blenkernel/intern/script.c
index 6ffac09e843..77153fc37ba 100644
--- a/source/blender/blenkernel/intern/script.c
+++ b/source/blender/blenkernel/intern/script.c
@@ -31,6 +31,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/script.c
+ * \ingroup bke
+ */
+
+
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenkernel/intern/seqcache.c b/source/blender/blenkernel/intern/seqcache.c
index 000d08e4df2..42beb055140 100755
--- a/source/blender/blenkernel/intern/seqcache.c
+++ b/source/blender/blenkernel/intern/seqcache.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/seqcache.c
+ * \ingroup bke
+ */
+
+
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/blenkernel/intern/seqeffects.c b/source/blender/blenkernel/intern/seqeffects.c
index 7ddd1fbd6bb..3dfef2e9d78 100644
--- a/source/blender/blenkernel/intern/seqeffects.c
+++ b/source/blender/blenkernel/intern/seqeffects.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/seqeffects.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <math.h>
#include <stdlib.h>
@@ -411,8 +416,8 @@ static void do_alphaover_effect_byte(float facf0, float facf1, int x, int y,
rt2= (char *)rect2;
rt= (char *)out;
- fac2= (int)(256.0*facf0);
- fac4= (int)(256.0*facf1);
+ fac2= (int)(256.0f*facf0);
+ fac4= (int)(256.0f*facf1);
while(y--) {
@@ -488,9 +493,9 @@ static void do_alphaover_effect_float(float facf0, float facf1, int x, int y,
/* rt = rt1 over rt2 (alpha from rt1) */
fac= fac2;
- mfac= 1.0 - (fac2*rt1[3]) ;
+ mfac= 1.0f - (fac2*rt1[3]) ;
- if(fac <= 0.0) {
+ if(fac <= 0.0f) {
memcpy(rt, rt2, 4 * sizeof(float));
} else if(mfac <=0) {
memcpy(rt, rt1, 4 * sizeof(float));
@@ -510,11 +515,11 @@ static void do_alphaover_effect_float(float facf0, float facf1, int x, int y,
while(x--) {
fac= fac4;
- mfac= 1.0 - (fac4*rt1[3]);
+ mfac= 1.0f - (fac4*rt1[3]);
- if(fac <= 0.0) {
+ if(fac <= 0.0f) {
memcpy(rt, rt2, 4 * sizeof(float));
- } else if(mfac <= 0.0) {
+ } else if(mfac <= 0.0f) {
memcpy(rt, rt1, 4 * sizeof(float));
} else {
rt[0] = fac*rt1[0] + mfac*rt2[0];
@@ -567,8 +572,8 @@ static void do_alphaunder_effect_byte(
rt2= rect2;
rt= out;
- fac2= (int)(256.0*facf0);
- fac4= (int)(256.0*facf1);
+ fac2= (int)(256.0f*facf0);
+ fac4= (int)(256.0f*facf1);
while(y--) {
@@ -649,13 +654,13 @@ static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y,
/* this complex optimalisation is because the
* 'skybuf' can be crossed in
*/
- if( rt2[3]<=0 && fac2>=1.0) {
+ if( rt2[3]<=0 && fac2 >= 1.0f) {
memcpy(rt, rt1, 4 * sizeof(float));
- } else if(rt2[3]>=1.0) {
+ } else if(rt2[3] >= 1.0f) {
memcpy(rt, rt2, 4 * sizeof(float));
} else {
mfac = rt2[3];
- fac = fac2 * (1.0 - mfac);
+ fac = fac2 * (1.0f - mfac);
if(fac == 0) {
memcpy(rt, rt2, 4 * sizeof(float));
@@ -675,14 +680,14 @@ static void do_alphaunder_effect_float(float facf0, float facf1, int x, int y,
x= xo;
while(x--) {
- if(rt2[3]<=0 && fac4 >= 1.0) {
+ if(rt2[3]<=0 && fac4 >= 1.0f) {
memcpy(rt, rt1, 4 * sizeof(float));
- } else if(rt2[3]>=1.0) {
+ } else if(rt2[3]>=1.0f) {
memcpy(rt, rt2, 4 * sizeof(float));
} else {
mfac= rt2[3];
- fac= fac4*(1.0-mfac);
+ fac= fac4*(1.0f-mfac);
if(fac == 0) {
memcpy(rt, rt2, 4 * sizeof(float));
@@ -739,9 +744,9 @@ static void do_cross_effect_byte(float facf0, float facf1, int x, int y,
rt2= rect2;
rt= out;
- fac2= (int)(256.0*facf0);
+ fac2= (int)(256.0f*facf0);
fac1= 256-fac2;
- fac4= (int)(256.0*facf1);
+ fac4= (int)(256.0f*facf1);
fac3= 256-fac4;
while(y--) {
@@ -787,9 +792,9 @@ static void do_cross_effect_float(float facf0, float facf1, int x, int y,
rt= out;
fac2= facf0;
- fac1= 1.0 - fac2;
+ fac1= 1.0f - fac2;
fac4= facf1;
- fac3= 1.0 - fac4;
+ fac3= 1.0f - fac4;
while(y--) {
@@ -874,8 +879,8 @@ static void makeGammaTables(float gamma)
int i;
valid_gamma = gamma;
- valid_inv_gamma = 1.0 / gamma;
- color_step = 1.0 / RE_GAMMA_TABLE_SIZE;
+ valid_inv_gamma = 1.0f / gamma;
+ color_step = 1.0f / RE_GAMMA_TABLE_SIZE;
inv_color_step = (float) RE_GAMMA_TABLE_SIZE;
/* We could squeeze out the two range tables to gain some memory. */
@@ -951,19 +956,19 @@ static void gamtabs(float gamma)
/* gamtab: in short, out short */
for(a=0; a<65536; a++) {
val= a;
- val/= 65535.0;
+ val/= 65535.0f;
- if(gamma==2.0) val= sqrt(val);
- else if(gamma!=1.0) val= pow(val, igamma);
+ if(gamma==2.0f) val= sqrt(val);
+ else if(gamma!=1.0f) val= pow(val, igamma);
- gamtab[a]= (65535.99*val);
+ gamtab[a]= (65535.99f*val);
}
/* inverse gamtab1 : in byte, out short */
for(a=1; a<=256; a++) {
- if(gamma==2.0) igamtab1[a-1]= a*a-1;
- else if(gamma==1.0) igamtab1[a-1]= 256*a-1;
+ if(gamma==2.0f) igamtab1[a-1]= a*a-1;
+ else if(gamma==1.0f) igamtab1[a-1]= 256*a-1;
else {
- val= a/256.0;
+ val= a/256.0f;
igamtab1[a-1]= (65535.0*pow(val, gamma)) -1 ;
}
}
@@ -1006,7 +1011,7 @@ static void do_gammacross_effect_byte(float facf0, float UNUSED(facf1),
rt2= (unsigned char *)rect2;
rt= (unsigned char *)out;
- fac2= (int)(256.0*facf0);
+ fac2= (int)(256.0f*facf0);
fac1= 256-fac2;
while(y--) {
@@ -1062,7 +1067,7 @@ static void do_gammacross_effect_float(float facf0, float UNUSED(facf1),
rt= out;
fac2= facf0;
- fac1= 1.0 - fac2;
+ fac1= 1.0f - fac2;
while(y--) {
@@ -1132,8 +1137,8 @@ static void do_add_effect_byte(float facf0, float facf1, int x, int y,
rt2= (char *)rect2;
rt= (char *)out;
- fac1= (int)(256.0*facf0);
- fac3= (int)(256.0*facf1);
+ fac1= (int)(256.0f*facf0);
+ fac3= (int)(256.0f*facf1);
while(y--) {
@@ -1248,8 +1253,8 @@ static void do_sub_effect_byte(float facf0, float facf1,
rt2= (char *)rect2;
rt= (char *)out;
- fac1= (int)(256.0*facf0);
- fac3= (int)(256.0*facf1);
+ fac1= (int)(256.0f*facf0);
+ fac3= (int)(256.0f*facf1);
while(y--) {
@@ -1366,8 +1371,8 @@ static void do_drop_effect_byte(float facf0, float facf1, int x, int y,
width= x;
height= y;
- fac1= (int)(70.0*facf0);
- fac2= (int)(70.0*facf1);
+ fac1= (int)(70.0f*facf0);
+ fac2= (int)(70.0f*facf1);
rt2= (char*) (rect2i + YOFF*width);
rt1= (char*) rect1i;
@@ -1407,8 +1412,8 @@ static void do_drop_effect_float(float facf0, float facf1, int x, int y,
width= x;
height= y;
- fac1= 70.0*facf0;
- fac2= 70.0*facf1;
+ fac1= 70.0f*facf0;
+ fac2= 70.0f*facf1;
rt2= (rect2i + YOFF*width);
rt1= rect1i;
@@ -1425,10 +1430,10 @@ static void do_drop_effect_float(float facf0, float facf1, int x, int y,
for (x=XOFF; x<width; x++) {
temp= fac * rt2[3];
- *(out++)= MAX2(0.0, *rt1 - temp); rt1++;
- *(out++)= MAX2(0.0, *rt1 - temp); rt1++;
- *(out++)= MAX2(0.0, *rt1 - temp); rt1++;
- *(out++)= MAX2(0.0, *rt1 - temp); rt1++;
+ *(out++)= MAX2(0.0f, *rt1 - temp); rt1++;
+ *(out++)= MAX2(0.0f, *rt1 - temp); rt1++;
+ *(out++)= MAX2(0.0f, *rt1 - temp); rt1++;
+ *(out++)= MAX2(0.0f, *rt1 - temp); rt1++;
rt2+=4;
}
rt2+=XOFF*4;
@@ -1452,8 +1457,8 @@ static void do_mul_effect_byte(float facf0, float facf1, int x, int y,
rt2= (char *)rect2;
rt= (char *)out;
- fac1= (int)(256.0*facf0);
- fac3= (int)(256.0*facf1);
+ fac1= (int)(256.0f*facf0);
+ fac3= (int)(256.0f*facf1);
/* formula:
* fac*(a*b) + (1-fac)*a => fac*a*(b-1)+axaux= c*px + py*s ;//+centx
@@ -1514,10 +1519,10 @@ static void do_mul_effect_float(float facf0, float facf1, int x, int y,
x= xo;
while(x--) {
- rt[0]= rt1[0] + fac1*rt1[0]*(rt2[0]-1.0);
- rt[1]= rt1[1] + fac1*rt1[1]*(rt2[1]-1.0);
- rt[2]= rt1[2] + fac1*rt1[2]*(rt2[2]-1.0);
- rt[3]= rt1[3] + fac1*rt1[3]*(rt2[3]-1.0);
+ rt[0]= rt1[0] + fac1*rt1[0]*(rt2[0]-1.0f);
+ rt[1]= rt1[1] + fac1*rt1[1]*(rt2[1]-1.0f);
+ rt[2]= rt1[2] + fac1*rt1[2]*(rt2[2]-1.0f);
+ rt[3]= rt1[3] + fac1*rt1[3]*(rt2[3]-1.0f);
rt1+= 4; rt2+= 4; rt+= 4;
}
@@ -1528,10 +1533,10 @@ static void do_mul_effect_float(float facf0, float facf1, int x, int y,
x= xo;
while(x--) {
- rt[0]= rt1[0] + fac3*rt1[0]*(rt2[0]-1.0);
- rt[1]= rt1[1] + fac3*rt1[1]*(rt2[1]-1.0);
- rt[2]= rt1[2] + fac3*rt1[2]*(rt2[2]-1.0);
- rt[3]= rt1[3] + fac3*rt1[3]*(rt2[3]-1.0);
+ rt[0]= rt1[0] + fac3*rt1[0]*(rt2[0]-1.0f);
+ rt[1]= rt1[1] + fac3*rt1[1]*(rt2[1]-1.0f);
+ rt[2]= rt1[2] + fac3*rt1[2]*(rt2[2]-1.0f);
+ rt[3]= rt1[3] + fac3*rt1[3]*(rt2[3]-1.0f);
rt1+= 4; rt2+= 4; rt+= 4;
}
@@ -1577,11 +1582,11 @@ typedef struct WipeZone {
static void precalc_wipe_zone(WipeZone *wipezone, WipeVars *wipe, int xo, int yo)
{
wipezone->flip = (wipe->angle < 0);
- wipezone->angle = pow(fabs(wipe->angle)/45.0f, log(xo)/log(2.0f));
+ wipezone->angle = pow(fabsf(wipe->angle)/45.0f, log(xo)/log(2.0f));
wipezone->xo = xo;
wipezone->yo = yo;
wipezone->width = (int)(wipe->edgeWidth*((xo+yo)/2.0f));
- wipezone->pythangle = 1.0f/sqrt(wipe->angle*wipe->angle + 1.0f);
+ wipezone->pythangle = 1.0f/sqrtf(wipe->angle*wipe->angle + 1.0f);
if(wipe->wipetype == DO_SINGLE_WIPE)
wipezone->invwidth = 1.0f/wipezone->width;
@@ -1656,7 +1661,7 @@ float hyp3,hyp4,b4,b5
else {
b1 = posy - (-angle)*posx;
b2 = y - (-angle)*x;
- hyp = fabs(angle*x+y+(-posy-angle*posx))*wipezone->pythangle;
+ hyp = fabsf(angle*x+y+(-posy-angle*posx))*wipezone->pythangle;
}
if(angle < 0) {
@@ -2132,7 +2137,7 @@ static void do_transform(Scene *scene, Sequence *seq, float UNUSED(facf0), int x
}
// Rotate
- rotate_radians = (M_PI*transform->rotIni)/180.0f;
+ rotate_radians = ((float)M_PI*transform->rotIni)/180.0f;
transform_image(x,y, ibuf1, out, scale_x, scale_y, translate_x, translate_y, rotate_radians, transform->interpolation);
}
@@ -2198,8 +2203,7 @@ static void RVBlurBitmap2_byte ( unsigned char* map, int width,int height,
/* posted to comp.graphics.algorithms by */
/* Blancmange (bmange@airdmhor.gen.nz) */
- k = -1.0/(2.0*3.14159*blur*blur);
- fval=0;
+ k = -1.0f/(2.0f*(float)M_PI*blur*blur);
for (ix = 0;ix< halfWidth;ix++){
weight = (float)exp(k*(ix*ix));
filter[halfWidth - ix] = weight;
@@ -2368,7 +2372,7 @@ static void RVBlurBitmap2_float ( float* map, int width,int height,
/* posted to comp.graphics.algorithms by */
/* Blancmange (bmange@airdmhor.gen.nz) */
- k = -1.0/(2.0*3.14159*blur*blur);
+ k = -1.0f/(2.0f*(float)M_PI*blur*blur);
fval=0;
for (ix = 0;ix< halfWidth;ix++){
weight = (float)exp(k*(ix*ix));
@@ -2525,10 +2529,10 @@ static void RVAddBitmaps_float (float* a, float* b, float* c,
for (y=0;y<height;y++){
for (x=0;x<width;x++){
index=(x+y*width)*4;
- c[index+GlowR]=MIN2(1.0,a[index+GlowR]+b[index+GlowR]);
- c[index+GlowG]=MIN2(1.0,a[index+GlowG]+b[index+GlowG]);
- c[index+GlowB]=MIN2(1.0,a[index+GlowB]+b[index+GlowB]);
- c[index+GlowA]=MIN2(1.0,a[index+GlowA]+b[index+GlowA]);
+ c[index+GlowR]= MIN2(1.0f, a[index+GlowR]+b[index+GlowR]);
+ c[index+GlowG]= MIN2(1.0f, a[index+GlowG]+b[index+GlowG]);
+ c[index+GlowB]= MIN2(1.0f, a[index+GlowB]+b[index+GlowB]);
+ c[index+GlowA]= MIN2(1.0f, a[index+GlowA]+b[index+GlowA]);
}
}
}
@@ -3069,9 +3073,9 @@ static int early_out_noop(struct Sequence *UNUSED(seq),
static int early_out_fade(struct Sequence *UNUSED(seq),
float facf0, float facf1)
{
- if (facf0 == 0.0 && facf1 == 0.0) {
+ if (facf0 == 0.0f && facf1 == 0.0f) {
return 1;
- } else if (facf0 == 1.0 && facf1 == 1.0) {
+ } else if (facf0 == 1.0f && facf1 == 1.0f) {
return 2;
}
return 0;
@@ -3080,7 +3084,7 @@ static int early_out_fade(struct Sequence *UNUSED(seq),
static int early_out_mul_input2(struct Sequence *UNUSED(seq),
float facf0, float facf1)
{
- if (facf0 == 0.0 && facf1 == 0.0) {
+ if (facf0 == 0.0f && facf1 == 0.0f) {
return 1;
}
return 0;
@@ -3102,7 +3106,7 @@ static void get_default_fac_fade(struct Sequence *seq, float cfra,
float * facf0, float * facf1)
{
*facf0 = (float)(cfra - seq->startdisp);
- *facf1 = (float)(*facf0 + 0.5);
+ *facf1 = (float)(*facf0 + 0.5f);
*facf0 /= seq->len;
*facf1 /= seq->len;
}
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index 83e28db771a..7a6eb1adc9f 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/sequencer.c
+ * \ingroup bke
+ */
+
+
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
@@ -213,13 +218,25 @@ Editing *seq_give_editing(Scene *scene, int alloc)
return scene->ed;
}
+static void seq_free_clipboard_recursive(Sequence *seq_parent)
+{
+ Sequence *seq, *nseq;
+
+ for(seq= seq_parent->seqbase.first; seq; seq= nseq) {
+ nseq= seq->next;
+ seq_free_clipboard_recursive(seq);
+ }
+
+ seq_free_sequence(NULL, seq_parent);
+}
+
void seq_free_clipboard(void)
{
Sequence *seq, *nseq;
for(seq= seqbase_clipboard.first; seq; seq= nseq) {
nseq= seq->next;
- seq_free_sequence(NULL, seq);
+ seq_free_clipboard_recursive(seq);
}
seqbase_clipboard.first= seqbase_clipboard.last= NULL;
}
@@ -328,7 +345,7 @@ unsigned int seq_hash_render_data(const SeqRenderData * a)
rval ^= a->preview_render_size;
rval ^= ((intptr_t) a->bmain) << 6;
rval ^= ((intptr_t) a->scene) << 6;
- rval ^= (int) (a->motion_blur_shutter * 100.0) << 10;
+ rval ^= (int) (a->motion_blur_shutter * 100.0f) << 10;
rval ^= a->motion_blur_samples << 24;
return rval;
@@ -957,7 +974,7 @@ static void multibuf(ImBuf *ibuf, float fmul)
int a, mul, icol;
- mul= (int)(256.0*fmul);
+ mul= (int)(256.0f * fmul);
rt= (char *)ibuf->rect;
rt_float = ibuf->rect_float;
@@ -1009,10 +1026,10 @@ static float give_stripelem_index(Sequence *seq, float cfra)
else nr= cfra - sta;
}
- if (seq->strobe < 1.0) seq->strobe = 1.0;
+ if (seq->strobe < 1.0f) seq->strobe = 1.0f;
- if (seq->strobe > 1.0) {
- nr -= fmod((double)nr, (double)seq->strobe);
+ if (seq->strobe > 1.0f) {
+ nr -= fmodf((double)nr, (double)seq->strobe);
}
return nr;
@@ -1365,7 +1382,7 @@ static StripColorBalance calc_cb(StripColorBalance * cb_)
/* tweak to give more subtle results
* values above 1.0 are scaled */
if(cb.lift[c] > 1.0f)
- cb.lift[c] = pow(cb.lift[c] - 1.0f, 2.0f) + 1.0f;
+ cb.lift[c] = pow(cb.lift[c] - 1.0f, 2.0) + 1.0;
cb.lift[c] = 2.0f - cb.lift[c];
}
@@ -1373,8 +1390,8 @@ static StripColorBalance calc_cb(StripColorBalance * cb_)
if (cb.flag & SEQ_COLOR_BALANCE_INVERSE_GAIN) {
for (c = 0; c < 3; c++) {
- if (cb.gain[c] != 0.0) {
- cb.gain[c] = 1.0/cb.gain[c];
+ if (cb.gain[c] != 0.0f) {
+ cb.gain[c] = 1.0f / cb.gain[c];
} else {
cb.gain[c] = 1000000; /* should be enough :) */
}
@@ -1383,8 +1400,8 @@ static StripColorBalance calc_cb(StripColorBalance * cb_)
if (!(cb.flag & SEQ_COLOR_BALANCE_INVERSE_GAMMA)) {
for (c = 0; c < 3; c++) {
- if (cb.gamma[c] != 0.0) {
- cb.gamma[c] = 1.0/cb.gamma[c];
+ if (cb.gamma[c] != 0.0f) {
+ cb.gamma[c] = 1.0f/cb.gamma[c];
} else {
cb.gamma[c] = 1000000; /* should be enough :) */
}
@@ -1411,7 +1428,7 @@ static void make_cb_table_byte(float lift, float gain, float gamma,
int y;
for (y = 0; y < 256; y++) {
- float v= color_balance_fl((float)y * (1.0 / 255.0f), lift, gain, gamma, mul);
+ float v= color_balance_fl((float)y * (1.0f / 255.0f), lift, gain, gamma, mul);
CLAMP(v, 0.0f, 1.0f);
table[y] = v * 255;
}
@@ -1423,7 +1440,7 @@ static void make_cb_table_float(float lift, float gain, float gamma,
int y;
for (y = 0; y < 256; y++) {
- float v= color_balance_fl((float)y * (1.0 / 255.0f), lift, gain, gamma, mul);
+ float v= color_balance_fl((float)y * (1.0f / 255.0f), lift, gain, gamma, mul);
table[y] = v;
}
}
@@ -1542,14 +1559,14 @@ int input_have_to_preprocess(
mul = seq->mul;
if(seq->blend_mode == SEQ_BLEND_REPLACE) {
- mul *= seq->blend_opacity / 100.0;
+ mul *= seq->blend_opacity / 100.0f;
}
- if (mul != 1.0) {
+ if (mul != 1.0f) {
return TRUE;
}
- if (seq->sat != 1.0) {
+ if (seq->sat != 1.0f) {
return TRUE;
}
@@ -1638,7 +1655,7 @@ static ImBuf * input_preprocess(
mul = seq->mul;
if(seq->blend_mode == SEQ_BLEND_REPLACE) {
- mul *= seq->blend_opacity / 100.0;
+ mul *= seq->blend_opacity / 100.0f;
}
if(seq->flag & SEQ_USE_COLOR_BALANCE && seq->strip->color_balance) {
@@ -1655,7 +1672,7 @@ static ImBuf * input_preprocess(
}
}
- if(mul != 1.0) {
+ if(mul != 1.0f) {
multibuf(ibuf, mul);
}
@@ -1760,7 +1777,7 @@ static ImBuf* seq_render_effect_strip_impl(
if (fcu) {
fac = facf = evaluate_fcurve(fcu, cfra);
if( context.scene->r.mode & R_FIELDS ) {
- facf = evaluate_fcurve(fcu, cfra + 0.5);
+ facf = evaluate_fcurve(fcu, cfra + 0.5f);
}
} else {
fac = facf = seq->effect_fader;
@@ -1901,13 +1918,17 @@ static ImBuf * seq_render_scene_strip_impl(
#endif
if(sequencer_view3d_cb && BLI_thread_is_main() && doseq_gl && (seq->scene == context.scene || have_seq==0) && seq->scene->camera) {
+ char err_out[256]= "unknown";
/* for old scened this can be uninitialized, should probably be added to do_versions at some point if the functionality stays */
if(context.scene->r.seq_prev_type==0)
context.scene->r.seq_prev_type = 3 /* ==OB_SOLID */;
/* opengl offscreen render */
scene_update_for_newframe(context.bmain, seq->scene, seq->scene->lay);
- ibuf= sequencer_view3d_cb(seq->scene, context.rectx, context.recty, IB_rect, context.scene->r.seq_prev_type);
+ ibuf= sequencer_view3d_cb(seq->scene, context.rectx, context.recty, IB_rect, context.scene->r.seq_prev_type, err_out);
+ if(ibuf == NULL) {
+ fprintf(stderr, "seq_render_scene_strip_impl failed to get opengl buffer: %s\n", err_out);
+ }
}
else {
Render *re = RE_GetRender(sce->id.name);
@@ -2135,7 +2156,7 @@ static int seq_must_swap_input_in_blend_mode(Sequence * seq)
static int seq_get_early_out_for_blend_mode(Sequence * seq)
{
struct SeqEffectHandle sh = get_sequence_blend(seq);
- float facf = seq->blend_opacity / 100.0;
+ float facf = seq->blend_opacity / 100.0f;
int early_out = sh.early_out(seq, facf, facf);
if (ELEM(early_out, EARLY_DO_EFFECT, EARLY_NO_INPUT)) {
@@ -2243,7 +2264,7 @@ static ImBuf* seq_render_strip_stack(
ImBuf * ibuf1 = out;
ImBuf * ibuf2 = seq_render_strip(context, seq, cfra);
- float facf = seq->blend_opacity / 100.0;
+ float facf = seq->blend_opacity / 100.0f;
int swap_input = seq_must_swap_input_in_blend_mode(seq);
if (swap_input) {
@@ -2965,6 +2986,24 @@ void seq_translate(Scene *evil_scene, Sequence *seq, int delta)
calc_sequence_disp(evil_scene, seq);
}
+void seq_sound_init(Scene *scene, Sequence *seq)
+{
+ if(seq->type==SEQ_META) {
+ Sequence *seq_child;
+ for(seq_child= seq->seqbase.first; seq_child; seq_child= seq_child->next) {
+ seq_sound_init(scene, seq_child);
+ }
+ }
+ else {
+ if(seq->sound) {
+ seq->scene_sound = sound_add_scene_sound(scene, seq, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
+ }
+ if(seq->scene) {
+ sound_scene_add_scene_sound(scene, seq, seq->startdisp, seq->enddisp, seq->startofs + seq->anim_startofs);
+ }
+ }
+}
+
Sequence *seq_foreground_frame_get(Scene *scene, int frame)
{
Editing *ed= seq_give_editing(scene, FALSE);
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index 1db15188dff..ce956fcb236 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenkernel/intern/shrinkwrap.c
+ * \ingroup bke
+ */
+
#include <string.h>
#include <float.h>
#include <math.h>
@@ -556,7 +561,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedM
//Using vertexs positions/normals as if a subsurface was applied
if(smd->subsurfLevels)
{
- SubsurfModifierData ssmd= {{0}};
+ SubsurfModifierData ssmd= {{NULL}};
ssmd.subdivType = ME_CC_SUBSURF; //catmull clark
ssmd.levels = smd->subsurfLevels; //levels
diff --git a/source/blender/blenkernel/intern/sketch.c b/source/blender/blenkernel/intern/sketch.c
index 8917d2946bd..6e234a9d115 100644
--- a/source/blender/blenkernel/intern/sketch.c
+++ b/source/blender/blenkernel/intern/sketch.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/sketch.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <math.h>
#include <float.h>
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index b2f8831cced..fbde1aeae22 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/smoke.c
+ * \ingroup bke
+ */
+
+
/* Part of the code copied from elbeem fluid library, copyright by Nils Thuerey */
#include <GL/glew.h>
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index d197541c620..c44136f523d 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -28,6 +28,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/softbody.c
+ * \ingroup bke
+ */
+
+
/*
******
variables on the UI for now
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 88ca0c33624..1756227260f 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -1,3 +1,6 @@
+/** \file blender/blenkernel/intern/sound.c
+ * \ingroup bke
+ */
/**
* sound.c (mar-2001 nzc)
*
@@ -326,7 +329,7 @@ static float sound_get_volume(Scene* scene, Sequence* sequence, float time)
fcu= list_find_fcurve(&adt->action->curves, buf, 0);
if(fcu)
- return evaluate_fcurve(fcu, time * FPS);
+ return evaluate_fcurve(fcu, time * (float)FPS);
else
return sequence->volume;
}
@@ -344,7 +347,7 @@ AUD_Device* sound_mixdown(struct Scene *scene, AUD_DeviceSpecs specs, int start,
void sound_create_scene(struct Scene *scene)
{
- scene->sound_scene = AUD_createSequencer(scene, (AUD_volumeFunction)&sound_get_volume);
+ scene->sound_scene = AUD_createSequencer(scene->audio.flag & AUDIO_MUTE, scene, (AUD_volumeFunction)&sound_get_volume);
}
void sound_destroy_scene(struct Scene *scene)
@@ -355,6 +358,12 @@ void sound_destroy_scene(struct Scene *scene)
AUD_destroySequencer(scene->sound_scene);
}
+void sound_mute_scene(struct Scene *scene, int muted)
+{
+ if(scene->sound_scene)
+ AUD_setSequencerMuted(scene->sound_scene, muted);
+}
+
void* sound_scene_add_scene_sound(struct Scene *scene, struct Sequence* sequence, int startframe, int endframe, int frameskip)
{
if(scene != sequence->scene)
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index ffea719264b..13748bf10ca 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/subsurf_ccg.c
+ * \ingroup bke
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
@@ -383,49 +388,6 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result,
MEM_freeN(faceMap);
}
-static void calc_ss_weights(int gridFaces,
- FaceVertWeight **qweight, FaceVertWeight **tweight)
-{
- FaceVertWeight *qw, *tw;
- int x, y, j;
- int numWeights = gridFaces * gridFaces;
-
- *tweight = MEM_mallocN(sizeof(**tweight) * numWeights, "ssTriWeight");
- *qweight = MEM_mallocN(sizeof(**qweight) * numWeights, "ssQuadWeight");
-
- qw = *qweight;
- tw = *tweight;
-
- for (y = 0; y < gridFaces; y++) {
- for (x = 0; x < gridFaces; x++) {
- for (j = 0; j < 4; j++) {
- int fx = x + (j == 2 || j == 3);
- int fy = y + (j == 1 || j == 2);
- float x_v = (float) fx / gridFaces;
- float y_v = (float) fy / gridFaces;
- float tx_v = (1.0f - x_v), ty_v = (1.0f - y_v);
- float center = (1.0f / 3.0f) * tx_v * ty_v;
-
- (*tw)[j][0] = center + 0.5f * tx_v * y_v;
- (*tw)[j][2] = center + 0.5f * x_v * ty_v;
- (*tw)[j][1] = 1.0f - (*tw)[j][0] - (*tw)[j][2];
- (*tw)[j][3] = 0.0f;
-
- tx_v *= 0.5f;
- ty_v *= 0.5f;
-
- (*qw)[j][3] = tx_v * ty_v;
- (*qw)[j][0] = (*qw)[j][3] + tx_v * y_v;
- (*qw)[j][2] = (*qw)[j][3] + x_v * ty_v;
- (*qw)[j][1] = 1.0f - (*qw)[j][0] - (*qw)[j][2] - (*qw)[j][3];
-
- }
- tw++;
- qw++;
- }
- }
-}
-
/* face weighting */
typedef struct FaceVertWeightEntry {
FaceVertWeight *weight;
@@ -502,6 +464,7 @@ void free_ss_weights(WeightTable *wtable)
MEM_freeN(wtable->weight_table);
}
+#if 0
static DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
int drawInteriorEdges, int useSubsurfUv,
DerivedMesh *dm, struct MultiresSubsurf *ms)
@@ -521,6 +484,7 @@ static DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
return result;
}
+#endif
static int ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
float (*vertexCos)[3], int useFlatSubdiv)
@@ -960,7 +924,11 @@ static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert)
for(x = 1; x < edgeSize - 1; x++, i++) {
vd= ccgSubSurf_getEdgeData(ss, e, x);
copy_v3_v3(mvert[i].co, vd->co);
- /* XXX, This gives errors with -fpe, the normals dont seem to be unit length - campbell */
+ /* This gives errors with -debug-fpe
+ * the normals dont seem to be unit length.
+ * this is most likely caused by edges with no
+ * faces which are now zerod out, see comment in:
+ * ccgSubSurf__calcVertNormals(), - campbell */
normal_float_to_short_v3(mvert[i].no, vd->no);
}
}
@@ -1636,7 +1604,7 @@ static void cgdm_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo
CCGSubSurf *ss = cgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
GPUVertexAttribs gattribs;
- DMVertexAttribs attribs= {{{0}}};
+ DMVertexAttribs attribs= {{{NULL}}};
MTFace *tf = dm->getTessFaceDataArray(dm, CD_MTFACE);
int gridSize = ccgSubSurf_getGridSize(ss);
int gridFaces = gridSize - 1;
diff --git a/source/blender/blenkernel/intern/suggestions.c b/source/blender/blenkernel/intern/suggestions.c
index 052b545cfb4..8a8bb6dd76a 100644
--- a/source/blender/blenkernel/intern/suggestions.c
+++ b/source/blender/blenkernel/intern/suggestions.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/suggestions.c
+ * \ingroup bke
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index 1bd41c7aa86..376f3fb031f 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/text.c
+ * \ingroup bke
+ */
+
+
#include <string.h> /* strstr */
#include <sys/types.h>
#include <sys/stat.h>
@@ -373,7 +378,6 @@ Text *add_text(const char *file, const char *relpath)
ta->mtime= st.st_mtime;
ta->nlines=0;
- i=0;
llen=0;
for(i=0; i<len; i++) {
if (buffer[i]=='\n') {
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index c22b1d32849..a5412c6269e 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/texture.c
+ * \ingroup bke
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -218,9 +223,9 @@ void init_mapping(TexMapping *texmap)
size_to_mat3( smat,texmap->size);
- eul[0]= (M_PI/180.0f)*texmap->rot[0];
- eul[1]= (M_PI/180.0f)*texmap->rot[1];
- eul[2]= (M_PI/180.0f)*texmap->rot[2];
+ eul[0]= DEG2RADF(texmap->rot[0]);
+ eul[1]= DEG2RADF(texmap->rot[1]);
+ eul[2]= DEG2RADF(texmap->rot[2]);
eul_to_mat3( rmat,eul);
mul_m3_m3m3(mat, rmat, smat);
@@ -337,8 +342,11 @@ int do_colorband(ColorBand *coba, float in, float out[4])
if(cbd2->pos!=cbd1->pos)
fac= (in-cbd1->pos)/(cbd2->pos-cbd1->pos);
- else
- fac= 0.0f;
+ else {
+ /* was setting to 0.0 in 2.56 & previous, but this
+ * is incorrect for the last element, see [#26732] */
+ fac= (a != coba->tot) ? 0.0f : 1.0f;
+ }
if (coba->ipotype==4) {
/* constant */
@@ -368,10 +376,10 @@ int do_colorband(ColorBand *coba, float in, float out[4])
out[1]= t[3]*cbd3->g +t[2]*cbd2->g +t[1]*cbd1->g +t[0]*cbd0->g;
out[2]= t[3]*cbd3->b +t[2]*cbd2->b +t[1]*cbd1->b +t[0]*cbd0->b;
out[3]= t[3]*cbd3->a +t[2]*cbd2->a +t[1]*cbd1->a +t[0]*cbd0->a;
- CLAMP(out[0], 0.0, 1.0);
- CLAMP(out[1], 0.0, 1.0);
- CLAMP(out[2], 0.0, 1.0);
- CLAMP(out[3], 0.0, 1.0);
+ CLAMP(out[0], 0.0f, 1.0f);
+ CLAMP(out[1], 0.0f, 1.0f);
+ CLAMP(out[2], 0.0f, 1.0f);
+ CLAMP(out[3], 0.0f, 1.0f);
}
else {
@@ -475,11 +483,13 @@ int colorband_element_remove(struct ColorBand *coba, int index)
void free_texture(Tex *tex)
{
free_plugin_tex(tex->plugin);
+
if(tex->coba) MEM_freeN(tex->coba);
if(tex->env) BKE_free_envmap(tex->env);
if(tex->pd) BKE_free_pointdensity(tex->pd);
if(tex->vd) BKE_free_voxeldata(tex->vd);
BKE_free_animdata((struct ID *)tex);
+
BKE_previewimg_free(&tex->preview);
BKE_icon_delete((struct ID*)tex);
tex->id.icon_id = 0;
@@ -745,10 +755,6 @@ Tex *copy_texture(Tex *tex)
if(texn->type==TEX_IMAGE) id_us_plus((ID *)texn->ima);
else texn->ima= NULL;
-#if 0 // XXX old animation system
- id_us_plus((ID *)texn->ipo);
-#endif // XXX old animation system
-
if(texn->plugin) {
texn->plugin= MEM_dupallocN(texn->plugin);
open_plugin_tex(texn->plugin);
@@ -763,12 +769,56 @@ Tex *copy_texture(Tex *tex)
if(tex->nodetree) {
ntreeEndExecTree(tex->nodetree);
- texn->nodetree= ntreeCopyTree(tex->nodetree); /* 0 == full new tree */
+ texn->nodetree= ntreeCopyTree(tex->nodetree);
}
return texn;
}
+/* texture copy without adding to main dbase */
+Tex *localize_texture(Tex *tex)
+{
+ Tex *texn;
+
+ texn= copy_libblock(tex);
+ BLI_remlink(&G.main->tex, texn);
+
+ /* image texture: free_texture also doesn't decrease */
+
+ if(texn->plugin) {
+ texn->plugin= MEM_dupallocN(texn->plugin);
+ open_plugin_tex(texn->plugin);
+ }
+
+ if(texn->coba) texn->coba= MEM_dupallocN(texn->coba);
+ if(texn->env) {
+ texn->env= BKE_copy_envmap(texn->env);
+ id_us_min(&texn->env->ima->id);
+ }
+ if(texn->pd) {
+ texn->pd= MEM_dupallocN(texn->pd);
+ if(texn->pd->coba) {
+ texn->pd->point_tree = NULL;
+ texn->pd->coba= MEM_dupallocN(texn->pd->coba);
+ }
+
+ }
+ if(texn->vd) {
+ texn->vd= MEM_dupallocN(texn->vd);
+ if(texn->vd->dataset)
+ texn->vd->dataset= MEM_dupallocN(texn->vd->dataset);
+ }
+
+ texn->preview = NULL;
+
+ if(tex->nodetree) {
+ texn->nodetree= ntreeLocalize(tex->nodetree);
+ }
+
+ return texn;
+}
+
+
/* ------------------------------------------------------------------------- */
void make_local_texture(Tex *tex)
@@ -1342,7 +1392,10 @@ void BKE_free_pointdensitydata(PointDensity *pd)
MEM_freeN(pd->point_data);
pd->point_data = NULL;
}
- if(pd->coba) MEM_freeN(pd->coba);
+ if(pd->coba) {
+ MEM_freeN(pd->coba);
+ pd->coba = NULL;
+ }
}
void BKE_free_pointdensity(PointDensity *pd)
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index b071f2c9da5..37e604fa0cb 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenkernel/intern/unit.c
+ * \ingroup bke
+ */
+
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
@@ -339,9 +344,7 @@ static int unit_as_string(char *str, int len_max, double value, int prec, bUnitC
/* Convert to a string */
{
- char conv_str[6] = {'%', '.', '0', 'l', 'f', '\0'}; /* "%.2lf" when prec is 2, must be under 10 */
- conv_str[2] += prec;
- len= snprintf(str, len_max, conv_str, (float)value_conv);
+ len= snprintf(str, len_max, "%.*lf", prec, value_conv);
if(len >= len_max)
len= len_max;
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index 5412e44f0eb..ff58e8bd0a4 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/intern/world.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include <math.h>
#include "MEM_guardedalloc.h"
@@ -155,7 +160,7 @@ void make_local_world(World *wrld)
}
if(local && lib==0) {
- wrld->id.lib= 0;
+ wrld->id.lib= NULL;
wrld->id.flag= LIB_LOCAL;
new_id(NULL, (ID *)wrld, NULL);
}
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index 1c1febf2609..73e23bd2a05 100644
--- a/source/blender/blenkernel/intern/writeavi.c
+++ b/source/blender/blenkernel/intern/writeavi.c
@@ -31,6 +31,11 @@
*
*/
+/** \file blender/blenkernel/intern/writeavi.c
+ * \ingroup bke
+ */
+
+
#include <string.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index f3b759113ff..9b1c3b2ddb8 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -1,3 +1,6 @@
+/** \file blender/blenkernel/intern/writeffmpeg.c
+ * \ingroup bke
+ */
/*
* $Id$
*
diff --git a/source/blender/blenkernel/intern/writeframeserver.c b/source/blender/blenkernel/intern/writeframeserver.c
index 3cb3d7e038b..2239f6d3147 100644
--- a/source/blender/blenkernel/intern/writeframeserver.c
+++ b/source/blender/blenkernel/intern/writeframeserver.c
@@ -1,3 +1,6 @@
+/** \file blender/blenkernel/intern/writeframeserver.c
+ * \ingroup bke
+ */
/*
* $Id$
*
diff --git a/source/blender/blenkernel/nla_private.h b/source/blender/blenkernel/nla_private.h
index bd760646053..367cbd90915 100644
--- a/source/blender/blenkernel/nla_private.h
+++ b/source/blender/blenkernel/nla_private.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenkernel/nla_private.h
+ * \ingroup bke
+ */
+
+
#ifndef NLA_PRIVATE
#define NLA_PRIVATE
diff --git a/source/blender/blenlib/BLI_array.h b/source/blender/blenlib/BLI_array.h
index b1db2538e6f..bc8a1222ba6 100644
--- a/source/blender/blenlib/BLI_array.h
+++ b/source/blender/blenlib/BLI_array.h
@@ -89,7 +89,7 @@ behaviour, though it may not be the best in practice.
#define BLI_array_growitems(arr, num) {int _i; for (_i=0; _i<(num); _i++) {BLI_array_growone(arr);}}
#define BLI_array_free(arr) if (arr && arr != _##arr##_static) MEM_freeN(arr)
-#define BLI_array_pop(arr) ((arr&&_##arr##_count) ? arr[--_##arr##_count] : NULL)
+#define BLI_array_pop(arr) ((arr&&_##arr##_count) ? arr[--_##arr##_count] : 0)
/*resets the logical size of an array to zero, but doesn't
free the memory.*/
#define BLI_array_empty(arr) _##arr##_count=0
diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h
index 59d5b5cdef8..ba5d04f3021 100644
--- a/source/blender/blenlib/BLI_blenlib.h
+++ b/source/blender/blenlib/BLI_blenlib.h
@@ -50,10 +50,6 @@
* platform dependencies. (There are other platform-dependent
* fixes as well.)
* - The file i/o has some redundant code. It should be cleaned.
- * - arithb.c is a very messy matrix library. We need a better
- * solution.
- * - vectorops.c is close to superfluous. It may disappear in the
- * near future.
*
* \subsection dependencies Dependencies
*
diff --git a/source/blender/blenlib/BLI_bpath.h b/source/blender/blenlib/BLI_bpath.h
index 2200ec70789..cfe5d7f2084 100644
--- a/source/blender/blenlib/BLI_bpath.h
+++ b/source/blender/blenlib/BLI_bpath.h
@@ -44,7 +44,7 @@ void BLI_bpathIterator_free (struct BPathIterator *bpi);
const char* BLI_bpathIterator_getLib (struct BPathIterator *bpi);
const char* BLI_bpathIterator_getName (struct BPathIterator *bpi);
int BLI_bpathIterator_getType (struct BPathIterator *bpi);
-int BLI_bpathIterator_getPathMaxLen (struct BPathIterator *bpi);
+unsigned int BLI_bpathIterator_getPathMaxLen (struct BPathIterator *bpi);
const char* BLI_bpathIterator_getBasePath (struct BPathIterator *bpi);
void BLI_bpathIterator_step (struct BPathIterator *bpi);
int BLI_bpathIterator_isDone (struct BPathIterator *bpi);
diff --git a/source/blender/blenlib/BLI_dynstr.h b/source/blender/blenlib/BLI_dynstr.h
index ed7a76daa92..2cbc19f56f0 100644
--- a/source/blender/blenlib/BLI_dynstr.h
+++ b/source/blender/blenlib/BLI_dynstr.h
@@ -79,7 +79,7 @@ void BLI_dynstr_nappend (DynStr *ds, const char *cstr, int len);
*/
void BLI_dynstr_appendf (DynStr *ds, const char *format, ...)
#ifdef __GNUC__
-__attribute__ ((format (printf, 2, 3)));
+__attribute__ ((format (printf, 2, 3)))
#endif
;
void BLI_dynstr_vappendf (DynStr *ds, const char *format, va_list args);
diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h
index a4fd26d1274..d94d3cd0652 100644
--- a/source/blender/blenlib/BLI_editVert.h
+++ b/source/blender/blenlib/BLI_editVert.h
@@ -61,6 +61,7 @@ typedef struct EditVert
void *p;
intptr_t l;
float fp;
+ int t;
} tmp;
float no[3]; /*vertex normal */
float co[3]; /*vertex location */
diff --git a/source/blender/blenlib/BLI_math_geom.h b/source/blender/blenlib/BLI_math_geom.h
index 8d2f9ffa38b..3174c65beac 100644
--- a/source/blender/blenlib/BLI_math_geom.h
+++ b/source/blender/blenlib/BLI_math_geom.h
@@ -169,6 +169,12 @@ void box_minmax_bounds_m4(float min[3], float max[3],
void map_to_tube(float *u, float *v, float x, float y, float z);
void map_to_sphere(float *u, float *v, float x, float y, float z);
+/********************************** Normals **********************************/
+
+void accumulate_vertex_normals(float n1[3], float n2[3], float n3[3],
+ float n4[3], const float f_no[3], const float co1[3], const float co2[3],
+ const float co3[3], const float co4[3]);
+
/********************************* Tangents **********************************/
typedef struct VertexTangent {
diff --git a/source/blender/blenlib/BLI_math_rotation.h b/source/blender/blenlib/BLI_math_rotation.h
index d1f5fa89c3d..ee8c3d5e10c 100644
--- a/source/blender/blenlib/BLI_math_rotation.h
+++ b/source/blender/blenlib/BLI_math_rotation.h
@@ -39,6 +39,10 @@ extern "C" {
#define RAD2DEG(_rad) ((_rad)*(180.0/M_PI))
#define DEG2RAD(_deg) ((_deg)*(M_PI/180.0))
+
+#define RAD2DEGF(_rad) ((_rad)*(float)(180.0/M_PI))
+#define DEG2RADF(_deg) ((_deg)*(float)(M_PI/180.0))
+
/******************************** Quaternions ********************************/
/* stored in (w, x, y, z) order */
@@ -85,7 +89,7 @@ void rotation_between_quats_to_quat(float q[4], const float q1[4], const float q
void mat3_to_quat_is_ok(float q[4], float mat[3][3]);
/* other */
-void print_qt(char *str, float q[4]);
+void print_qt(const char *str, const float q[4]);
/******************************** Axis Angle *********************************/
@@ -181,6 +185,9 @@ void vec_apply_track(float vec[3], short axis);
float lens_to_angle(float lens);
float angle_to_lens(float angle);
+float angle_wrap_rad(float angle);
+float angle_wrap_deg(float angle);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenlib/BLI_path_util.h b/source/blender/blenlib/BLI_path_util.h
index b3d657b7323..3e86079dcad 100644
--- a/source/blender/blenlib/BLI_path_util.h
+++ b/source/blender/blenlib/BLI_path_util.h
@@ -40,11 +40,12 @@ extern "C" {
struct ListBase;
struct direntry;
-char *BLI_getDefaultDocumentFolder(void);
+const char *BLI_getDefaultDocumentFolder(void);
char *BLI_get_folder(int folder_id, const char *subfolder);
char *BLI_get_folder_create(int folder_id, const char *subfolder);
char *BLI_get_user_folder_notest(int folder_id, const char *subfolder);
+char *BLI_get_folder_version(const int id, const int ver, const int do_check);
/* folder_id */
@@ -73,6 +74,11 @@ char *BLI_get_user_folder_notest(int folder_id, const char *subfolder);
#define BLENDER_USERFOLDER(id) (id >= BLENDER_USER_CONFIG && id <= BLENDER_USER_PLUGINS)
+/* for BLI_get_folder_version only */
+#define BLENDER_RESOURCE_PATH_USER 0
+#define BLENDER_RESOURCE_PATH_LOCAL 1
+#define BLENDER_RESOURCE_PATH_SYSTEM 2
+
#define BLENDER_STARTUP_FILE "startup.blend"
#define BLENDER_BOOKMARK_FILE "bookmarks.txt"
#define BLENDER_HISTORY_FILE "recent-files.txt"
@@ -115,7 +121,7 @@ void BLI_getlastdir(const char* dir, char *last, int maxlen);
int BLI_testextensie(const char *str, const char *ext);
int BLI_testextensie_array(const char *str, const char **ext_array);
int BLI_testextensie_glob(const char *str, const char *ext_fnmatch);
-int BLI_replace_extension(char *path, int maxlen, const char *ext);
+int BLI_replace_extension(char *path, size_t maxlen, const char *ext);
void BLI_uniquename(struct ListBase *list, void *vlink, const char defname[], char delim, short name_offs, short len);
int BLI_uniquename_cb(int (*unique_check)(void *, const char *), void *arg, const char defname[], char delim, char *name, short name_len);
void BLI_newname(char * name, int add);
@@ -132,8 +138,9 @@ void BLI_clean(char *path);
* converts it to a regular full path.
* Also removes garbage from directory paths, like /../ or double slashes etc
*/
-void BLI_cleanup_file(const char *relabase, char *dir);
+void BLI_cleanup_file(const char *relabase, char *dir); /* removes trailing slash */
void BLI_cleanup_dir(const char *relabase, char *dir); /* same as above but adds a trailing slash */
+void BLI_cleanup_path(const char *relabase, char *dir); /* doesn't touch trailing slash */
/* go back one directory */
int BLI_parent_dir(char *path);
@@ -157,9 +164,16 @@ int BLI_path_abs(char *path, const char *basepath);
int BLI_path_frame(char *path, int frame, int digits);
int BLI_path_frame_range(char *path, int sta, int end, int digits);
int BLI_path_cwd(char *path);
-
void BLI_path_rel(char *file, const char *relfile);
+#ifdef WIN32
+# define BLI_path_cmp BLI_strcasecmp
+# define BLI_path_ncmp BLI_strncasecmp
+#else
+# define BLI_path_cmp strcmp
+# define BLI_path_ncmp strncmp
+#endif
+
/**
* Change every @a from in @a string into @a to. The
* result will be in @a string
diff --git a/source/blender/blenlib/BLI_pbvh.h b/source/blender/blenlib/BLI_pbvh.h
index bde6bc3ced4..89dcf9bf02d 100644
--- a/source/blender/blenlib/BLI_pbvh.h
+++ b/source/blender/blenlib/BLI_pbvh.h
@@ -122,7 +122,7 @@ void BLI_pbvh_update(PBVH *bvh, int flags, float (*face_nors)[3]);
void BLI_pbvh_redraw_BB(PBVH *bvh, float bb_min[3], float bb_max[3]);
void BLI_pbvh_get_grid_updates(PBVH *bvh, int clear, void ***gridfaces, int *totface);
void BLI_pbvh_grids_update(PBVH *bvh, struct DMGridData **grids,
- struct DMGridAdjacency *gridadj, void **gridfaces);;
+ struct DMGridAdjacency *gridadj, void **gridfaces);
/* vertex deformer */
float (*BLI_pbvh_get_vertCos(struct PBVH *pbvh))[3];
diff --git a/source/blender/blenlib/BLI_storage_types.h b/source/blender/blenlib/BLI_storage_types.h
index 0b8746b4c50..07c0ceffeb5 100644
--- a/source/blender/blenlib/BLI_storage_types.h
+++ b/source/blender/blenlib/BLI_storage_types.h
@@ -54,7 +54,7 @@ struct direntry{
#else
struct stat s;
#endif
- unsigned int flags;
+ unsigned int flags;
char size[16];
char mode1[4];
char mode2[4];
@@ -66,6 +66,7 @@ struct direntry{
void *poin;
int nr;
struct ImBuf *image;
+ unsigned int selflag; /* selection flag */
};
struct dirlink
diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h
index 36835e0c9ca..635c38e1d13 100644
--- a/source/blender/blenlib/BLI_string.h
+++ b/source/blender/blenlib/BLI_string.h
@@ -58,7 +58,7 @@ char *BLI_strdup(const char *str);
* @param len The number of bytes to duplicate
* @retval Returns the duplicated string
*/
-char *BLI_strdupn(const char *str, int len);
+char *BLI_strdupn(const char *str, const size_t len);
/**
* Appends the two strings, and returns new mallocN'ed string
@@ -78,7 +78,7 @@ char *BLI_strdupcat(const char *str1, const char *str2);
* the size of dst)
* @retval Returns dst
*/
-char *BLI_strncpy(char *dst, const char *src, const int maxncpy);
+char *BLI_strncpy(char *dst, const char *src, const size_t maxncpy);
/* Makes a copy of the text within the "" that appear after some text 'blahblah'
* i.e. for string 'pose["apples"]' with prefix 'pose[', it should grab "apples"
@@ -106,9 +106,9 @@ char *BLI_replacestr(char *str, const char *oldText, const char *newText);
/*
* Replacement for snprintf
*/
-int BLI_snprintf(char *buffer, size_t count, const char *format, ...)
+size_t BLI_snprintf(char *buffer, size_t len, const char *format, ...)
#ifdef __GNUC__
-__attribute__ ((format (printf, 3, 4)));
+__attribute__ ((format (printf, 3, 4)))
#endif
;
@@ -118,7 +118,7 @@ __attribute__ ((format (printf, 3, 4)));
*/
char *BLI_sprintfN(const char *format, ...)
#ifdef __GNUC__
-__attribute__ ((format (printf, 1, 2)));
+__attribute__ ((format (printf, 1, 2)))
#endif
;
@@ -138,7 +138,7 @@ int BLI_strcaseeq(const char *a, const char *b);
char *BLI_strcasestr(const char *s, const char *find);
int BLI_strcasecmp(const char *s1, const char *s2);
-int BLI_strncasecmp(const char *s1, const char *s2, int n);
+int BLI_strncasecmp(const char *s1, const char *s2, size_t len);
int BLI_natstrcmp(const char *s1, const char *s2);
size_t BLI_strnlen(const char *str, size_t maxlen);
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
index 6bf19010980..2a2583b1cc2 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -126,11 +126,15 @@
#define CLAMPTEST(a, b, c) if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
#define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
+#define IS_EQF(a,b) ((fabsf((float)(a)-(b)) >= (float) FLT_EPSILON) ? 0 : 1)
#define IS_EQT(a, b, c) ((a > b)? (((a-b) <= c)? 1:0) : ((((b-a) <= c)? 1:0)))
#define IN_RANGE(a, b, c) ((b < c)? ((b<a && a<c)? 1:0) : ((c<a && a<b)? 1:0))
#define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0))
+/* array helpers */
+#define ARRAY_LAST_ITEM(arr_start, arr_dtype, elem_size, tot) (arr_dtype *)((char*)arr_start + (elem_size*(tot - 1)))
+#define ARRAY_HAS_ITEM(item, arr_start, arr_dtype, elem_size, tot) ((item >= arr_start) && (item <= ARRAY_LAST_ITEM(arr_start, arr_dtype, elem_size, tot)))
/* This one rotates the bytes in an int64, int (32) and short (16) */
#define SWITCH_INT64(a) { \
@@ -203,7 +207,7 @@
# ifdef __GNUC__ /* just want to check if __func__ is available */
# define BLI_assert(a) \
do { \
- if (0 == (a)) { \
+ if (!(a)) { \
fprintf(stderr, \
"BLI_assert failed: %s, %s(), %d at \'%s\'\n", \
__FILE__, __func__, __LINE__, STRINGIFY(a)); \
diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h
index 0248a6a6b4d..176e7319bf7 100644
--- a/source/blender/blenlib/BLI_winstuff.h
+++ b/source/blender/blenlib/BLI_winstuff.h
@@ -75,7 +75,7 @@
#undef small
-// These definitions are also in arithb for simplicity
+// These definitions are also in BLI_math for simplicity
#ifdef __cplusplus
extern "C" {
@@ -127,7 +127,8 @@ typedef struct _DIR {
struct dirent direntry;
} DIR;
-void RegisterBlendExtension(char * str);
+int IsConsoleEmpty(void);
+void RegisterBlendExtension(void);
DIR *opendir (const char *path);
struct dirent *readdir(DIR *dp);
int closedir (DIR *dp);
diff --git a/source/blender/blenlib/PIL_dynlib.h b/source/blender/blenlib/PIL_dynlib.h
index 87eda213fd8..5569954c116 100644
--- a/source/blender/blenlib/PIL_dynlib.h
+++ b/source/blender/blenlib/PIL_dynlib.h
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenlib/PIL_dynlib.h
+ * \ingroup bli
+ */
+
#ifndef __PIL_DYNLIB_H__
#define __PIL_DYNLIB_H__
diff --git a/source/blender/blenlib/PIL_time.h b/source/blender/blenlib/PIL_time.h
index 6cb4cf6ffcf..82869035d50 100644
--- a/source/blender/blenlib/PIL_time.h
+++ b/source/blender/blenlib/PIL_time.h
@@ -29,6 +29,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenlib/PIL_time.h
+ * \ingroup bli
+ */
+
#ifndef PIL_TIME_H
#define PIL_TIME_H
@@ -51,9 +56,29 @@ double PIL_check_seconds_timer (void);
*/
void PIL_sleep_ms (int ms);
+/** Utility defines for timing.
+ * requires BLI_utildefines.h for 'AT'
+ * TIMEIT_VALUE returns the time since TIMEIT_START was called.
+ */
+#define TIMEIT_START(var) \
+{ \
+ double _timeit_##var= PIL_check_seconds_timer(); \
+ printf("time start (" #var "): " AT "\n"); \
+ fflush(stdout); \
+ { \
+
+
+#define TIMEIT_VALUE(var) (float)(PIL_check_seconds_timer() - _timeit_##var)
+
+
+#define TIMEIT_END(var) \
+ } \
+ printf("time end (" #var "): %.6f" " " AT "\n", TIMEIT_VALUE(var)); \
+ fflush(stdout); \
+} \
+
#ifdef __cplusplus
}
#endif
-#endif
-
+#endif /* !PIL_TIME_H */
diff --git a/source/blender/blenlib/intern/BLI_args.c b/source/blender/blenlib/intern/BLI_args.c
index 4c059c62475..7bc93a3d3a0 100644
--- a/source/blender/blenlib/intern/BLI_args.c
+++ b/source/blender/blenlib/intern/BLI_args.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/BLI_args.c
+ * \ingroup bli
+ */
+
+
#include <ctype.h> /* for tolower */
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenlib/intern/BLI_callbacks.h b/source/blender/blenlib/intern/BLI_callbacks.h
index 71f68d33f2f..ad09339e61a 100644
--- a/source/blender/blenlib/intern/BLI_callbacks.h
+++ b/source/blender/blenlib/intern/BLI_callbacks.h
@@ -31,6 +31,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/BLI_callbacks.h
+ * \ingroup bli
+ */
+
+
#ifndef BLI_CALLBACKS_H
#define BLI_CALLBACKS_H
diff --git a/source/blender/blenlib/intern/BLI_dynstr.c b/source/blender/blenlib/intern/BLI_dynstr.c
index dcda7daacb3..7587a5195a2 100644
--- a/source/blender/blenlib/intern/BLI_dynstr.c
+++ b/source/blender/blenlib/intern/BLI_dynstr.c
@@ -28,6 +28,11 @@
* Dynamically sized string ADT
*/
+/** \file blender/blenlib/intern/BLI_dynstr.c
+ * \ingroup bli
+ */
+
+
#include <stdarg.h>
#include <string.h>
diff --git a/source/blender/blenlib/intern/BLI_ghash.c b/source/blender/blenlib/intern/BLI_ghash.c
index 9148e356e2a..f4a47ae4bf0 100644
--- a/source/blender/blenlib/intern/BLI_ghash.c
+++ b/source/blender/blenlib/intern/BLI_ghash.c
@@ -28,6 +28,11 @@
* A general (pointer -> pointer) hash table ADT
*/
+/** \file blender/blenlib/intern/BLI_ghash.c
+ * \ingroup bli
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
diff --git a/source/blender/blenlib/intern/BLI_heap.c b/source/blender/blenlib/intern/BLI_heap.c
index 027d3da6499..a0b71dbde0e 100644
--- a/source/blender/blenlib/intern/BLI_heap.c
+++ b/source/blender/blenlib/intern/BLI_heap.c
@@ -28,6 +28,11 @@
* A heap / priority queue ADT.
*/
+/** \file blender/blenlib/intern/BLI_heap.c
+ * \ingroup bli
+ */
+
+
#include <string.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenlib/intern/BLI_kdopbvh.c b/source/blender/blenlib/intern/BLI_kdopbvh.c
index 01f2ab4436c..f8a85c8ba76 100644
--- a/source/blender/blenlib/intern/BLI_kdopbvh.c
+++ b/source/blender/blenlib/intern/BLI_kdopbvh.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/BLI_kdopbvh.c
+ * \ingroup bli
+ */
+
+
#include <assert.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenlib/intern/BLI_kdtree.c b/source/blender/blenlib/intern/BLI_kdtree.c
index 24fe4c081d9..713bfde3417 100644
--- a/source/blender/blenlib/intern/BLI_kdtree.c
+++ b/source/blender/blenlib/intern/BLI_kdtree.c
@@ -28,6 +28,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/BLI_kdtree.c
+ * \ingroup bli
+ */
+
+
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenlib/intern/BLI_linklist.c b/source/blender/blenlib/intern/BLI_linklist.c
index deb4ee79157..2de1689713e 100644
--- a/source/blender/blenlib/intern/BLI_linklist.c
+++ b/source/blender/blenlib/intern/BLI_linklist.c
@@ -28,6 +28,11 @@
* Support for linked lists.
*/
+/** \file blender/blenlib/intern/BLI_linklist.c
+ * \ingroup bli
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_linklist.h"
#include "BLI_memarena.h"
diff --git a/source/blender/blenlib/intern/BLI_memarena.c b/source/blender/blenlib/intern/BLI_memarena.c
index 52638158b18..6ce5621e30d 100644
--- a/source/blender/blenlib/intern/BLI_memarena.c
+++ b/source/blender/blenlib/intern/BLI_memarena.c
@@ -28,6 +28,11 @@
* Efficient memory allocation for lots of similar small chunks.
*/
+/** \file blender/blenlib/intern/BLI_memarena.c
+ * \ingroup bli
+ */
+
+
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenlib/intern/BLI_mempool.c b/source/blender/blenlib/intern/BLI_mempool.c
index 60882e7f1b6..abf7e074a15 100644
--- a/source/blender/blenlib/intern/BLI_mempool.c
+++ b/source/blender/blenlib/intern/BLI_mempool.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/BLI_mempool.c
+ * \ingroup bli
+ */
+
+
/*
Simple, fast memory allocator for allocating many elements of the same size.
*/
diff --git a/source/blender/blenlib/intern/DLRB_tree.c b/source/blender/blenlib/intern/DLRB_tree.c
index fa2edac0897..590425a8f06 100644
--- a/source/blender/blenlib/intern/DLRB_tree.c
+++ b/source/blender/blenlib/intern/DLRB_tree.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/DLRB_tree.c
+ * \ingroup bli
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
diff --git a/source/blender/blenlib/intern/boxpack2d.c b/source/blender/blenlib/intern/boxpack2d.c
index 643dcb6efca..4c16363f6d3 100644
--- a/source/blender/blenlib/intern/boxpack2d.c
+++ b/source/blender/blenlib/intern/boxpack2d.c
@@ -21,6 +21,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/boxpack2d.c
+ * \ingroup bli
+ */
+
+
#include <stdlib.h> /* for qsort */
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenlib/intern/bpath.c b/source/blender/blenlib/intern/bpath.c
index 7fa88704f2e..a56b1392b69 100644
--- a/source/blender/blenlib/intern/bpath.c
+++ b/source/blender/blenlib/intern/bpath.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/bpath.c
+ * \ingroup bli
+ */
+
+
#include <sys/stat.h>
#include <string.h>
@@ -194,7 +199,7 @@ const char* BLI_bpathIterator_getName(struct BPathIterator *bpi) {
int BLI_bpathIterator_getType(struct BPathIterator *bpi) {
return bpi->type;
}
-int BLI_bpathIterator_getPathMaxLen(struct BPathIterator *bpi) {
+unsigned int BLI_bpathIterator_getPathMaxLen(struct BPathIterator *bpi) {
return bpi->len;
}
const char* BLI_bpathIterator_getBasePath(struct BPathIterator *bpi) {
diff --git a/source/blender/blenlib/intern/cpu.c b/source/blender/blenlib/intern/cpu.c
index 644b4e72025..860a0cae2d1 100644
--- a/source/blender/blenlib/intern/cpu.c
+++ b/source/blender/blenlib/intern/cpu.c
@@ -21,6 +21,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/cpu.c
+ * \ingroup bli
+ */
+
+
#include "BLI_cpu.h"
int BLI_cpu_support_sse2(void)
diff --git a/source/blender/blenlib/intern/dynamiclist.h b/source/blender/blenlib/intern/dynamiclist.h
index 03ccca576ff..7b496a5fed5 100644
--- a/source/blender/blenlib/intern/dynamiclist.h
+++ b/source/blender/blenlib/intern/dynamiclist.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/dynamiclist.h
+ * \ingroup bli
+ */
+
+
#ifndef B_DYNAMIC_LIST_H
#define B_DYNAMIC_LIST_H
diff --git a/source/blender/blenlib/intern/dynlib.c b/source/blender/blenlib/intern/dynlib.c
index eb769d19210..855fa2dfbf9 100644
--- a/source/blender/blenlib/intern/dynlib.c
+++ b/source/blender/blenlib/intern/dynlib.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/dynlib.c
+ * \ingroup bli
+ */
+
+
#include <stdlib.h>
#include "../PIL_dynlib.h"
diff --git a/source/blender/blenlib/intern/edgehash.c b/source/blender/blenlib/intern/edgehash.c
index f885f7e5b22..3d6734d5368 100644
--- a/source/blender/blenlib/intern/edgehash.c
+++ b/source/blender/blenlib/intern/edgehash.c
@@ -28,6 +28,11 @@
* A general (pointer -> pointer) hash table ADT
*/
+/** \file blender/blenlib/intern/edgehash.c
+ * \ingroup bli
+ */
+
+
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index 5ee652264c0..2407078fc76 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/fileops.c
+ * \ingroup bli
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -220,7 +225,8 @@ int BLI_copy_fileops(const char *file, const char *to) {
int BLI_link(const char *file, const char *to) {
callLocalErrorCallBack("Linking files is unsupported on Windows");
-
+ (void)file;
+ (void)to;
return 1;
}
diff --git a/source/blender/blenlib/intern/fnmatch.c b/source/blender/blenlib/intern/fnmatch.c
index c44ee754110..ae04075bda6 100644
--- a/source/blender/blenlib/intern/fnmatch.c
+++ b/source/blender/blenlib/intern/fnmatch.c
@@ -1,3 +1,6 @@
+/** \file blender/blenlib/intern/fnmatch.c
+ * \ingroup bli
+ */
/* Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
diff --git a/source/blender/blenlib/intern/freetypefont.c b/source/blender/blenlib/intern/freetypefont.c
index 1b569cf794f..0fe028eb3c0 100644
--- a/source/blender/blenlib/intern/freetypefont.c
+++ b/source/blender/blenlib/intern/freetypefont.c
@@ -30,6 +30,11 @@
* Code that uses exotic character maps is present but commented out.
*/
+/** \file blender/blenlib/intern/freetypefont.c
+ * \ingroup bli
+ */
+
+
#ifdef WIN32
#pragma warning (disable:4244)
#endif
@@ -83,10 +88,10 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
// adjust font size
height= ((double) face->bbox.yMax - (double) face->bbox.yMin);
- if(height != 0.0)
- scale = 1.0 / height;
+ if(height != 0.0f)
+ scale = 1.0f / height;
else
- scale = 1.0 / 1000.0;
+ scale = 1.0f / 1000.0f;
//
// Generate the character 3D data
@@ -162,20 +167,20 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
if(k < npoints[j] - 1 )
{
if( ftoutline.tags[l] == FT_Curve_Tag_Conic && ftoutline.tags[l+1] == FT_Curve_Tag_Conic) {
- dx = (ftoutline.points[l].x + ftoutline.points[l+1].x)* scale / 2.0;
- dy = (ftoutline.points[l].y + ftoutline.points[l+1].y)* scale / 2.0;
+ dx = (ftoutline.points[l].x + ftoutline.points[l+1].x)* scale / 2.0f;
+ dy = (ftoutline.points[l].y + ftoutline.points[l+1].y)* scale / 2.0f;
//left handle
- bezt->vec[0][0] = (dx + (2 * ftoutline.points[l].x)* scale) / 3.0;
- bezt->vec[0][1] = (dy + (2 * ftoutline.points[l].y)* scale) / 3.0;
+ bezt->vec[0][0] = (dx + (2 * ftoutline.points[l].x)* scale) / 3.0f;
+ bezt->vec[0][1] = (dy + (2 * ftoutline.points[l].y)* scale) / 3.0f;
//midpoint (virtual on-curve point)
bezt->vec[1][0] = dx;
bezt->vec[1][1] = dy;
//right handle
- bezt->vec[2][0] = (dx + (2 * ftoutline.points[l+1].x)* scale) / 3.0;
- bezt->vec[2][1] = (dy + (2 * ftoutline.points[l+1].y)* scale) / 3.0;
+ bezt->vec[2][0] = (dx + (2 * ftoutline.points[l+1].x)* scale) / 3.0f;
+ bezt->vec[2][1] = (dy + (2 * ftoutline.points[l+1].y)* scale) / 3.0f;
bezt->h1= bezt->h2= HD_ALIGN;
bezt->radius= 1.0f;
@@ -192,12 +197,12 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
bezt->vec[0][1] = ftoutline.points[l-1].y* scale;
bezt->h1= HD_FREE;
} else if(ftoutline.tags[l - 1] == FT_Curve_Tag_Conic) {
- bezt->vec[0][0] = (ftoutline.points[l].x + (2 * ftoutline.points[l - 1].x))* scale / 3.0;
- bezt->vec[0][1] = (ftoutline.points[l].y + (2 * ftoutline.points[l - 1].y))* scale / 3.0;
+ bezt->vec[0][0] = (ftoutline.points[l].x + (2 * ftoutline.points[l - 1].x))* scale / 3.0f;
+ bezt->vec[0][1] = (ftoutline.points[l].y + (2 * ftoutline.points[l - 1].y))* scale / 3.0f;
bezt->h1= HD_FREE;
} else {
- bezt->vec[0][0] = ftoutline.points[l].x* scale - (ftoutline.points[l].x - ftoutline.points[l-1].x)* scale / 3.0;
- bezt->vec[0][1] = ftoutline.points[l].y* scale - (ftoutline.points[l].y - ftoutline.points[l-1].y)* scale / 3.0;
+ bezt->vec[0][0] = ftoutline.points[l].x* scale - (ftoutline.points[l].x - ftoutline.points[l-1].x)* scale / 3.0f;
+ bezt->vec[0][1] = ftoutline.points[l].y* scale - (ftoutline.points[l].y - ftoutline.points[l-1].y)* scale / 3.0f;
bezt->h1= HD_VECT;
}
} else { //first point on curve
@@ -206,12 +211,12 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
bezt->vec[0][1] = ftoutline.points[ftoutline.contours[j]].y * scale;
bezt->h1= HD_FREE;
} else if(ftoutline.tags[ftoutline.contours[j]] == FT_Curve_Tag_Conic) {
- bezt->vec[0][0] = (ftoutline.points[l].x + (2 * ftoutline.points[ftoutline.contours[j]].x))* scale / 3.0 ;
- bezt->vec[0][1] = (ftoutline.points[l].y + (2 * ftoutline.points[ftoutline.contours[j]].y))* scale / 3.0 ;
+ bezt->vec[0][0] = (ftoutline.points[l].x + (2 * ftoutline.points[ftoutline.contours[j]].x))* scale / 3.0f;
+ bezt->vec[0][1] = (ftoutline.points[l].y + (2 * ftoutline.points[ftoutline.contours[j]].y))* scale / 3.0f;
bezt->h1= HD_FREE;
} else {
- bezt->vec[0][0] = ftoutline.points[l].x* scale - (ftoutline.points[l].x - ftoutline.points[ftoutline.contours[j]].x)* scale / 3.0;
- bezt->vec[0][1] = ftoutline.points[l].y* scale - (ftoutline.points[l].y - ftoutline.points[ftoutline.contours[j]].y)* scale / 3.0;
+ bezt->vec[0][0] = ftoutline.points[l].x* scale - (ftoutline.points[l].x - ftoutline.points[ftoutline.contours[j]].x)* scale / 3.0f;
+ bezt->vec[0][1] = ftoutline.points[l].y* scale - (ftoutline.points[l].y - ftoutline.points[ftoutline.contours[j]].y)* scale / 3.0f;
bezt->h1= HD_VECT;
}
}
@@ -227,12 +232,12 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
bezt->vec[2][1] = ftoutline.points[l+1].y* scale;
bezt->h2= HD_FREE;
} else if(ftoutline.tags[l+1] == FT_Curve_Tag_Conic) {
- bezt->vec[2][0] = (ftoutline.points[l].x + (2 * ftoutline.points[l+1].x))* scale / 3.0;
- bezt->vec[2][1] = (ftoutline.points[l].y + (2 * ftoutline.points[l+1].y))* scale / 3.0;
+ bezt->vec[2][0] = (ftoutline.points[l].x + (2 * ftoutline.points[l+1].x))* scale / 3.0f;
+ bezt->vec[2][1] = (ftoutline.points[l].y + (2 * ftoutline.points[l+1].y))* scale / 3.0f;
bezt->h2= HD_FREE;
} else {
- bezt->vec[2][0] = ftoutline.points[l].x* scale - (ftoutline.points[l].x - ftoutline.points[l+1].x)* scale / 3.0;
- bezt->vec[2][1] = ftoutline.points[l].y* scale - (ftoutline.points[l].y - ftoutline.points[l+1].y)* scale / 3.0;
+ bezt->vec[2][0] = ftoutline.points[l].x* scale - (ftoutline.points[l].x - ftoutline.points[l+1].x)* scale / 3.0f;
+ bezt->vec[2][1] = ftoutline.points[l].y* scale - (ftoutline.points[l].y - ftoutline.points[l+1].y)* scale / 3.0f;
bezt->h2= HD_VECT;
}
} else { //last point on curve
@@ -241,12 +246,12 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
bezt->vec[2][1] = ftoutline.points[m].y* scale;
bezt->h2= HD_FREE;
} else if(ftoutline.tags[m] == FT_Curve_Tag_Conic) {
- bezt->vec[2][0] = (ftoutline.points[l].x + (2 * ftoutline.points[m].x))* scale / 3.0 ;
- bezt->vec[2][1] = (ftoutline.points[l].y + (2 * ftoutline.points[m].y))* scale / 3.0 ;
+ bezt->vec[2][0] = (ftoutline.points[l].x + (2 * ftoutline.points[m].x))* scale / 3.0f;
+ bezt->vec[2][1] = (ftoutline.points[l].y + (2 * ftoutline.points[m].y))* scale / 3.0f;
bezt->h2= HD_FREE;
} else {
- bezt->vec[2][0] = ftoutline.points[l].x* scale - (ftoutline.points[l].x - ftoutline.points[m].x)* scale / 3.0;
- bezt->vec[2][1] = ftoutline.points[l].y* scale - (ftoutline.points[l].y - ftoutline.points[m].y)* scale / 3.0;
+ bezt->vec[2][0] = ftoutline.points[l].x* scale - (ftoutline.points[l].x - ftoutline.points[m].x)* scale / 3.0f;
+ bezt->vec[2][1] = ftoutline.points[l].y* scale - (ftoutline.points[l].y - ftoutline.points[m].y)* scale / 3.0f;
bezt->h2= HD_VECT;
}
}
@@ -256,10 +261,10 @@ static void freetypechar_to_vchar(FT_Face face, FT_ULong charcode, VFontData *vf
// len_squared_v2v2, see if there's a distance between the three points
// len_squared_v2v2 again, to check the angle between the handles
// finally, check if one of them is a vector handle
- if((dist_to_line_v2(bezt->vec[0],bezt->vec[1],bezt->vec[2]) < 0.001) &&
- (len_squared_v2v2(bezt->vec[0], bezt->vec[1]) > 0.0001*0.0001) &&
- (len_squared_v2v2(bezt->vec[1], bezt->vec[2]) > 0.0001*0.0001) &&
- (len_squared_v2v2(bezt->vec[0], bezt->vec[2]) > 0.0002*0.0001) &&
+ if((dist_to_line_v2(bezt->vec[0],bezt->vec[1],bezt->vec[2]) < 0.001f) &&
+ (len_squared_v2v2(bezt->vec[0], bezt->vec[1]) > 0.0001f*0.0001f) &&
+ (len_squared_v2v2(bezt->vec[1], bezt->vec[2]) > 0.0001f*0.0001f) &&
+ (len_squared_v2v2(bezt->vec[0], bezt->vec[2]) > 0.0002f*0.0001f) &&
(len_squared_v2v2(bezt->vec[0], bezt->vec[2]) > MAX2(len_squared_v2v2(bezt->vec[0], bezt->vec[1]), len_squared_v2v2(bezt->vec[1], bezt->vec[2]))) &&
bezt->h1 != HD_VECT && bezt->h2 != HD_VECT)
{
diff --git a/source/blender/blenlib/intern/graph.c b/source/blender/blenlib/intern/graph.c
index 050effdf5b4..51e639d1c75 100644
--- a/source/blender/blenlib/intern/graph.c
+++ b/source/blender/blenlib/intern/graph.c
@@ -23,6 +23,11 @@
* graph.c: Common graph interface and methods
*/
+/** \file blender/blenlib/intern/graph.c
+ * \ingroup bli
+ */
+
+
#include <float.h>
#include <math.h>
diff --git a/source/blender/blenlib/intern/gsqueue.c b/source/blender/blenlib/intern/gsqueue.c
index 0936759b680..e6f27c78bf1 100644
--- a/source/blender/blenlib/intern/gsqueue.c
+++ b/source/blender/blenlib/intern/gsqueue.c
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/blenlib/intern/gsqueue.c
+ * \ingroup bli
+ */
+
#include <string.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenlib/intern/jitter.c b/source/blender/blenlib/intern/jitter.c
index f4305d45735..16f0c86c449 100644
--- a/source/blender/blenlib/intern/jitter.c
+++ b/source/blender/blenlib/intern/jitter.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/jitter.c
+ * \ingroup bli
+ */
+
+
#include <math.h>
#include <string.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenlib/intern/listbase.c b/source/blender/blenlib/intern/listbase.c
index 975479a3875..15bdb4a446f 100644
--- a/source/blender/blenlib/intern/listbase.c
+++ b/source/blender/blenlib/intern/listbase.c
@@ -32,6 +32,11 @@
*
*/
+/** \file blender/blenlib/intern/listbase.c
+ * \ingroup bli
+ */
+
+
#include <string.h>
#include <stdlib.h>
diff --git a/source/blender/blenlib/intern/math_base.c b/source/blender/blenlib/intern/math_base.c
index 4f0d4bbeba0..0e122a23faa 100644
--- a/source/blender/blenlib/intern/math_base.c
+++ b/source/blender/blenlib/intern/math_base.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
* */
+/** \file blender/blenlib/intern/math_base.c
+ * \ingroup bli
+ */
+
+
#include "BLI_math.h"
diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c
index 099c14a6556..d37f1d6c5f0 100644
--- a/source/blender/blenlib/intern/math_base_inline.c
+++ b/source/blender/blenlib/intern/math_base_inline.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
* */
+/** \file blender/blenlib/intern/math_base_inline.c
+ * \ingroup bli
+ */
+
+
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
@@ -40,7 +45,7 @@
MINLINE float sqrt3f(float f)
{
- if(f==0.0) return 0;
+ if(f==0.0f) return 0.0f;
if(f<0) return (float)(-exp(log(-f)/3));
else return (float)(exp(log(f)/3));
}
@@ -68,7 +73,7 @@ MINLINE float saasin(float fac)
MINLINE float sasqrt(float fac)
{
- if(fac<=0.0) return 0.0;
+ if(fac<=0.0f) return 0.0f;
return (float)sqrt(fac);
}
@@ -88,7 +93,7 @@ MINLINE float saasinf(float fac)
MINLINE float sasqrtf(float fac)
{
- if(fac<=0.0) return 0.0;
+ if(fac<=0.0f) return 0.0f;
return (float)sqrtf(fac);
}
@@ -103,7 +108,7 @@ MINLINE float interpf(float target, float origin, float fac)
* the distance gets very high, 180d would be inf, but this case isn't valid */
MINLINE float shell_angle_to_dist(const float angle)
{
- return (angle < SMALL_NUMBER) ? 1.0f : fabsf(1.0f / cosf(angle));
+ return (angle < (float)SMALL_NUMBER) ? 1.0f : fabsf(1.0f / cosf(angle));
}
/* used for zoom values*/
diff --git a/source/blender/blenlib/intern/math_color.c b/source/blender/blenlib/intern/math_color.c
index 2f2e8d6fc61..85636d23f6f 100644
--- a/source/blender/blenlib/intern/math_color.c
+++ b/source/blender/blenlib/intern/math_color.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
* */
+/** \file blender/blenlib/intern/math_color.c
+ * \ingroup bli
+ */
+
+
#include <assert.h>
#include "BLI_math.h"
@@ -40,9 +45,9 @@ void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b)
*b = v;
}
else {
- h= (h - floor(h))*6.0f;
+ h= (h - floorf(h))*6.0f;
- i = (int)floor(h);
+ i = (int)floorf(h);
f = h - i;
p = v*(1.0f-s);
q = v*(1.0f-(s*f));
@@ -303,11 +308,11 @@ unsigned int rgb_to_cpack(float r, float g, float b)
{
int ir, ig, ib;
- ir= (int)floor(255.0*r);
+ ir= (int)floor(255.0f*r);
if(ir<0) ir= 0; else if(ir>255) ir= 255;
- ig= (int)floor(255.0*g);
+ ig= (int)floor(255.0f*g);
if(ig<0) ig= 0; else if(ig>255) ig= 255;
- ib= (int)floor(255.0*b);
+ ib= (int)floor(255.0f*b);
if(ib<0) ib= 0; else if(ib>255) ib= 255;
return (ir+ (ig*256) + (ib*256*256));
@@ -337,9 +342,9 @@ void rgb_float_to_byte(const float *in, unsigned char *out)
{
int r, g, b;
- r= (int)(in[0] * 255.0);
- g= (int)(in[1] * 255.0);
- b= (int)(in[2] * 255.0);
+ r= (int)(in[0] * 255.0f);
+ g= (int)(in[1] * 255.0f);
+ b= (int)(in[2] * 255.0f);
out[0]= (char)((r <= 0)? 0 : (r >= 255)? 255 : r);
out[1]= (char)((g <= 0)? 0 : (g >= 255)? 255 : g);
@@ -504,8 +509,8 @@ void rgb_float_set_hue_float_offset(float rgb[3], float hue_offset)
rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
hsv[0]+= hue_offset;
- if(hsv[0]>1.0) hsv[0]-=1.0;
- else if(hsv[0]<0.0) hsv[0]+= 1.0;
+ if(hsv[0] > 1.0f) hsv[0] -= 1.0f;
+ else if(hsv[0] < 0.0f) hsv[0] += 1.0f;
hsv_to_rgb(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2);
}
diff --git a/source/blender/blenlib/intern/math_geom.c b/source/blender/blenlib/intern/math_geom.c
index b92d631373d..75e8892f4b7 100644
--- a/source/blender/blenlib/intern/math_geom.c
+++ b/source/blender/blenlib/intern/math_geom.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
* */
+/** \file blender/blenlib/intern/math_geom.c
+ * \ingroup bli
+ */
+
+
#include "MEM_guardedalloc.h"
@@ -89,12 +94,12 @@ float normal_quad_v3(float n[3], const float v1[3], const float v2[3], const flo
float area_tri_v2(const float v1[2], const float v2[2], const float v3[2])
{
- return (float)(0.5f*fabs((v1[0]-v2[0])*(v2[1]-v3[1]) + (v1[1]-v2[1])*(v3[0]-v2[0])));
+ return 0.5f * fabsf((v1[0]-v2[0])*(v2[1]-v3[1]) + (v1[1]-v2[1])*(v3[0]-v2[0]));
}
float area_tri_signed_v2(const float v1[2], const float v2[2], const float v3[2])
{
- return (float)(0.5f*((v1[0]-v2[0])*(v2[1]-v3[1]) + (v1[1]-v2[1])*(v3[0]-v2[0])));
+ return 0.5f * ((v1[0]-v2[0])*(v2[1]-v3[1]) + (v1[1]-v2[1])*(v3[0]-v2[0]));
}
float area_quad_v3(const float v1[3], const float v2[3], const float v3[3], const float v4[3]) /* only convex Quadrilaterals */
@@ -153,7 +158,7 @@ float area_poly_v3(int nr, float verts[][3], float *normal)
cur= verts[a+1];
}
- return (float)fabs(0.5*area/max);
+ return fabsf(0.5f * area / max);
}
/********************************* Distance **********************************/
@@ -169,7 +174,7 @@ float dist_to_line_v2(float *v1, float *v2, float *v3)
deler= (float)sqrt(a[0]*a[0]+a[1]*a[1]);
if(deler== 0.0f) return 0;
- return (float)(fabs((v1[0]-v2[0])*a[0]+(v1[1]-v2[1])*a[1])/deler);
+ return fabsf((v1[0]-v2[0])*a[0]+(v1[1]-v2[1])*a[1])/deler;
}
@@ -181,18 +186,18 @@ float dist_to_line_segment_v2(float *v1, float *v2, float *v3)
rc[0]= v3[0]-v2[0];
rc[1]= v3[1]-v2[1];
len= rc[0]*rc[0]+ rc[1]*rc[1];
- if(len==0.0) {
+ if(len==0.0f) {
rc[0]= v1[0]-v2[0];
rc[1]= v1[1]-v2[1];
return (float)(sqrt(rc[0]*rc[0]+ rc[1]*rc[1]));
}
labda= (rc[0]*(v1[0]-v2[0]) + rc[1]*(v1[1]-v2[1]))/len;
- if(labda<=0.0) {
+ if(labda <= 0.0f) {
pt[0]= v2[0];
pt[1]= v2[1];
}
- else if(labda>=1.0) {
+ else if(labda >= 1.0f) {
pt[0]= v3[0];
pt[1]= v3[1];
}
@@ -258,14 +263,14 @@ int isect_line_line_v2(const float *v1, const float *v2, const float *v3, const
float div, labda, mu;
div= (v2[0]-v1[0])*(v4[1]-v3[1])-(v2[1]-v1[1])*(v4[0]-v3[0]);
- if(div==0.0) return ISECT_LINE_LINE_COLINEAR;
+ if(div==0.0f) return ISECT_LINE_LINE_COLINEAR;
labda= ((float)(v1[1]-v3[1])*(v4[0]-v3[0])-(v1[0]-v3[0])*(v4[1]-v3[1]))/div;
mu= ((float)(v1[1]-v3[1])*(v2[0]-v1[0])-(v1[0]-v3[0])*(v2[1]-v1[1]))/div;
- if(labda>=0.0 && labda<=1.0 && mu>=0.0 && mu<=1.0) {
- if(labda==0.0 || labda==1.0 || mu==0.0 || mu==1.0) return ISECT_LINE_LINE_EXACT;
+ if(labda>=0.0f && labda<=1.0f && mu>=0.0f && mu<=1.0f) {
+ if(labda==0.0f || labda==1.0f || mu==0.0f || mu==1.0f) return ISECT_LINE_LINE_EXACT;
return ISECT_LINE_LINE_CROSS;
}
return ISECT_LINE_LINE_NONE;
@@ -402,15 +407,15 @@ static short IsectLLPt2Df(float x0,float y0,float x1,float y1,
int isect_point_tri_v2(float pt[2], float v1[2], float v2[2], float v3[2])
{
- if (line_point_side_v2(v1,v2,pt)>=0.0) {
- if (line_point_side_v2(v2,v3,pt)>=0.0) {
- if (line_point_side_v2(v3,v1,pt)>=0.0) {
+ if (line_point_side_v2(v1,v2,pt)>=0.0f) {
+ if (line_point_side_v2(v2,v3,pt)>=0.0f) {
+ if (line_point_side_v2(v3,v1,pt)>=0.0f) {
return 1;
}
}
} else {
- if (! (line_point_side_v2(v2,v3,pt)>=0.0)) {
- if (! (line_point_side_v2(v3,v1,pt)>=0.0)) {
+ if (! (line_point_side_v2(v2,v3,pt)>=0.0f)) {
+ if (! (line_point_side_v2(v3,v1,pt)>=0.0f)) {
return -1;
}
}
@@ -421,18 +426,18 @@ int isect_point_tri_v2(float pt[2], float v1[2], float v2[2], float v3[2])
/* point in quad - only convex quads */
int isect_point_quad_v2(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2])
{
- if (line_point_side_v2(v1,v2,pt)>=0.0) {
- if (line_point_side_v2(v2,v3,pt)>=0.0) {
- if (line_point_side_v2(v3,v4,pt)>=0.0) {
- if (line_point_side_v2(v4,v1,pt)>=0.0) {
+ if (line_point_side_v2(v1,v2,pt)>=0.0f) {
+ if (line_point_side_v2(v2,v3,pt)>=0.0f) {
+ if (line_point_side_v2(v3,v4,pt)>=0.0f) {
+ if (line_point_side_v2(v4,v1,pt)>=0.0f) {
return 1;
}
}
}
} else {
- if (! (line_point_side_v2(v2,v3,pt)>=0.0)) {
- if (! (line_point_side_v2(v3,v4,pt)>=0.0)) {
- if (! (line_point_side_v2(v4,v1,pt)>=0.0)) {
+ if (! (line_point_side_v2(v2,v3,pt)>=0.0f)) {
+ if (! (line_point_side_v2(v3,v4,pt)>=0.0f)) {
+ if (! (line_point_side_v2(v4,v1,pt)>=0.0f)) {
return -1;
}
}
@@ -458,21 +463,21 @@ int isect_line_tri_v3(float p1[3], float p2[3], float v0[3], float v1[3], float
cross_v3_v3v3(p, d, e2);
a = dot_v3v3(e1, p);
- if ((a > -0.000001) && (a < 0.000001)) return 0;
+ if ((a > -0.000001f) && (a < 0.000001f)) return 0;
f = 1.0f/a;
sub_v3_v3v3(s, p1, v0);
u = f * dot_v3v3(s, p);
- if ((u < 0.0)||(u > 1.0)) return 0;
+ if ((u < 0.0f)||(u > 1.0f)) return 0;
cross_v3_v3v3(q, s, e1);
v = f * dot_v3v3(d, q);
- if ((v < 0.0)||((u + v) > 1.0)) return 0;
+ if ((v < 0.0f)||((u + v) > 1.0f)) return 0;
*lambda = f * dot_v3v3(e2, q);
- if ((*lambda < 0.0)||(*lambda > 1.0)) return 0;
+ if ((*lambda < 0.0f)||(*lambda > 1.0f)) return 0;
if(uv) {
uv[0]= u;
@@ -498,21 +503,21 @@ int isect_ray_tri_v3(float p1[3], float d[3], float v0[3], float v1[3], float v2
a = dot_v3v3(e1, p);
/* note: these values were 0.000001 in 2.4x but for projection snapping on
* a human head (1BU==1m), subsurf level 2, this gave many errors - campbell */
- if ((a > -0.00000001) && (a < 0.00000001)) return 0;
+ if ((a > -0.00000001f) && (a < 0.00000001f)) return 0;
f = 1.0f/a;
sub_v3_v3v3(s, p1, v0);
u = f * dot_v3v3(s, p);
- if ((u < 0.0)||(u > 1.0)) return 0;
-
+ if ((u < 0.0f)||(u > 1.0f)) return 0;
+
cross_v3_v3v3(q, s, e1);
v = f * dot_v3v3(d, q);
- if ((v < 0.0)||((u + v) > 1.0)) return 0;
+ if ((v < 0.0f)||((u + v) > 1.0f)) return 0;
*lambda = f * dot_v3v3(e2, q);
- if ((*lambda < 0.0)) return 0;
+ if ((*lambda < 0.0f)) return 0;
if(uv) {
uv[0]= u;
@@ -567,14 +572,14 @@ int isect_ray_tri_threshold_v3(float p1[3], float d[3], float v0[3], float v1[3]
cross_v3_v3v3(p, d, e2);
a = dot_v3v3(e1, p);
- if ((a > -0.000001) && (a < 0.000001)) return 0;
+ if ((a > -0.000001f) && (a < 0.000001f)) return 0;
f = 1.0f/a;
sub_v3_v3v3(s, p1, v0);
cross_v3_v3v3(q, s, e1);
*lambda = f * dot_v3v3(e2, q);
- if ((*lambda < 0.0)) return 0;
+ if ((*lambda < 0.0f)) return 0;
u = f * dot_v3v3(s, p);
v = f * dot_v3v3(d, q);
@@ -668,10 +673,9 @@ int isect_sweeping_sphere_tri_v3(float p1[3], float p2[3], float radius, float v
a=dot_v3v3(p1,nor)-dot_v3v3(v0,nor);
nordotv=dot_v3v3(nor,vel);
- if (fabs(nordotv) < 0.000001)
+ if (fabsf(nordotv) < 0.000001f)
{
- if(fabs(a)>=radius)
- {
+ if(fabsf(a) >= radius) {
return 0;
}
}
@@ -865,25 +869,25 @@ int isect_axial_line_tri_v3(int axis, float p1[3], float p2[3], float v0[3], flo
sub_v3_v3v3(p,v0,p1);
f= (e2[a1]*e1[a2]-e2[a2]*e1[a1]);
- if ((f > -0.000001) && (f < 0.000001)) return 0;
+ if ((f > -0.000001f) && (f < 0.000001f)) return 0;
v= (p[a2]*e1[a1]-p[a1]*e1[a2])/f;
- if ((v < 0.0)||(v > 1.0)) return 0;
+ if ((v < 0.0f)||(v > 1.0f)) return 0;
f= e1[a1];
- if((f > -0.000001) && (f < 0.000001)){
+ if((f > -0.000001f) && (f < 0.000001f)){
f= e1[a2];
- if((f > -0.000001) && (f < 0.000001)) return 0;
+ if((f > -0.000001f) && (f < 0.000001f)) return 0;
u= (-p[a2]-v*e2[a2])/f;
}
else
u= (-p[a1]-v*e2[a1])/f;
- if ((u < 0.0)||((u + v) > 1.0)) return 0;
+ if ((u < 0.0f) || ((u + v) > 1.0f)) return 0;
*lambda = (p[a0]+u*e1[a0]+v*e2[a0])/(p2[a0]-p1[a0]);
- if ((*lambda < 0.0)||(*lambda > 1.0)) return 0;
+ if ((*lambda < 0.0f) || (*lambda > 1.0f)) return 0;
return 1;
}
@@ -1450,7 +1454,7 @@ static int barycentric_weights(float *v1, float *v2, float *v3, float *co, float
asum= a1 + a2 + a3;
- if (fabs(asum) < FLT_EPSILON) {
+ if (fabsf(asum) < FLT_EPSILON) {
/* zero area triangle */
w[0]= w[1]= w[2]= 1.0f/3.0f;
return 1;
@@ -1745,7 +1749,7 @@ void orthographic_m4(float matrix[][4],float left, float right, float bottom, fl
Xdelta = right - left;
Ydelta = top - bottom;
Zdelta = farClip - nearClip;
- if (Xdelta == 0.0 || Ydelta == 0.0 || Zdelta == 0.0) {
+ if (Xdelta == 0.0f || Ydelta == 0.0f || Zdelta == 0.0f) {
return;
}
unit_m4(matrix);
@@ -1765,7 +1769,7 @@ void perspective_m4(float mat[][4],float left, float right, float bottom, float
Ydelta = top - bottom;
Zdelta = farClip - nearClip;
- if (Xdelta == 0.0 || Ydelta == 0.0 || Zdelta == 0.0) {
+ if (Xdelta == 0.0f || Ydelta == 0.0f || Zdelta == 0.0f) {
return;
}
mat[0][0] = nearClip * 2.0f/Xdelta;
@@ -1852,7 +1856,7 @@ void lookat_m4(float mat[][4],float vx, float vy, float vz, float px, float py,
hyp1 = (float)sqrt(dy*dy + hyp);
hyp = (float)sqrt(hyp); /* the real hyp */
- if (hyp1 != 0.0) { /* rotate X */
+ if (hyp1 != 0.0f) { /* rotate X */
sine = -dy / hyp1;
cosine = hyp /hyp1;
} else {
@@ -1966,7 +1970,7 @@ void map_to_sphere(float *u, float *v,float x, float y, float z)
len= (float)sqrt(x*x+y*y+z*z);
if(len > 0.0f) {
if(x==0.0f && y==0.0f) *u= 0.0f; /* othwise domain error */
- else *u = (float)((1.0 - (float)atan2(x,y) / M_PI) / 2.0);
+ else *u = (1.0f - atan2f(x,y) / (float)M_PI) / 2.0f;
z/=len;
*v = 1.0f - (float)saacos(z)/(float)M_PI;
@@ -1975,6 +1979,49 @@ void map_to_sphere(float *u, float *v,float x, float y, float z)
}
}
+/********************************* Normals **********************************/
+
+void accumulate_vertex_normals(float n1[3], float n2[3], float n3[3],
+ float n4[3], const float f_no[3], const float co1[3], const float co2[3],
+ const float co3[3], const float co4[3])
+{
+ float vdiffs[4][3];
+ const int nverts= (n4!=NULL && co4!=NULL)? 4: 3;
+
+ /* compute normalized edge vectors */
+ sub_v3_v3v3(vdiffs[0], co2, co1);
+ sub_v3_v3v3(vdiffs[1], co3, co2);
+
+ if(nverts==3) {
+ sub_v3_v3v3(vdiffs[2], co1, co3);
+ }
+ else {
+ sub_v3_v3v3(vdiffs[2], co4, co3);
+ sub_v3_v3v3(vdiffs[3], co1, co4);
+ normalize_v3(vdiffs[3]);
+ }
+
+ normalize_v3(vdiffs[0]);
+ normalize_v3(vdiffs[1]);
+ normalize_v3(vdiffs[2]);
+
+ /* accumulate angle weighted face normal */
+ {
+ float *vn[]= {n1, n2, n3, n4};
+ const float *prev_edge = vdiffs[nverts-1];
+ int i;
+
+ for(i=0; i<nverts; i++) {
+ const float *cur_edge= vdiffs[i];
+ const float fac= saacos(-dot_v3v3(cur_edge, prev_edge));
+
+ // accumulate
+ madd_v3_v3fl(vn[i], f_no, fac);
+ prev_edge = cur_edge;
+ }
+ }
+}
+
/********************************* Tangents **********************************/
/* For normal map tangents we need to detect uv boundaries, and only average
@@ -1992,7 +2039,7 @@ void sum_or_add_vertex_tangent(void *arena, VertexTangent **vtang, float *tang,
/* find a tangent with connected uvs */
for(vt= *vtang; vt; vt=vt->next) {
- if(fabs(uv[0]-vt->uv[0]) < STD_UV_CONNECT_LIMIT && fabs(uv[1]-vt->uv[1]) < STD_UV_CONNECT_LIMIT) {
+ if(fabsf(uv[0]-vt->uv[0]) < STD_UV_CONNECT_LIMIT && fabsf(uv[1]-vt->uv[1]) < STD_UV_CONNECT_LIMIT) {
add_v3_v3(vt->tang, tang);
return;
}
@@ -2015,7 +2062,7 @@ float *find_vertex_tangent(VertexTangent *vtang, float *uv)
static float nulltang[3] = {0.0f, 0.0f, 0.0f};
for(vt= vtang; vt; vt=vt->next)
- if(fabs(uv[0]-vt->uv[0]) < STD_UV_CONNECT_LIMIT && fabs(uv[1]-vt->uv[1]) < STD_UV_CONNECT_LIMIT)
+ if(fabsf(uv[0]-vt->uv[0]) < STD_UV_CONNECT_LIMIT && fabsf(uv[1]-vt->uv[1]) < STD_UV_CONNECT_LIMIT)
return vt->tang;
return nulltang; /* shouldn't happen, except for nan or so */
diff --git a/source/blender/blenlib/intern/math_geom_inline.c b/source/blender/blenlib/intern/math_geom_inline.c
index 11310f25075..48fcbcfe140 100644
--- a/source/blender/blenlib/intern/math_geom_inline.c
+++ b/source/blender/blenlib/intern/math_geom_inline.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
* */
+/** \file blender/blenlib/intern/math_geom_inline.c
+ * \ingroup bli
+ */
+
+
#include "BLI_math.h"
#ifndef BLI_MATH_GEOM_INLINE_H
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index 413ac57dea5..9fde87d734f 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/math_matrix.c
+ * \ingroup bli
+ */
+
+
#include <assert.h>
#include "BLI_math.h"
@@ -530,7 +535,7 @@ int invert_m4_m4(float inverse[4][4], float mat[4][4])
max = fabs(tempmat[i][i]);
maxj = i;
for(j = i + 1; j < 4; j++) {
- if(fabs(tempmat[j][i]) > max) {
+ if(fabsf(tempmat[j][i]) > max) {
max = fabs(tempmat[j][i]);
maxj = j;
}
@@ -755,13 +760,13 @@ void orthogonalize_m4(float mat[][4], int axis)
int is_orthogonal_m3(float mat[][3])
{
- if (fabs(dot_v3v3(mat[0], mat[1])) > 1.5 * FLT_EPSILON)
+ if (fabsf(dot_v3v3(mat[0], mat[1])) > 1.5f * FLT_EPSILON)
return 0;
- if (fabs(dot_v3v3(mat[1], mat[2])) > 1.5 * FLT_EPSILON)
+ if (fabsf(dot_v3v3(mat[1], mat[2])) > 1.5f * FLT_EPSILON)
return 0;
- if (fabs(dot_v3v3(mat[0], mat[2])) > 1.5 * FLT_EPSILON)
+ if (fabsf(dot_v3v3(mat[0], mat[2])) > 1.5f * FLT_EPSILON)
return 0;
return 1;
@@ -769,13 +774,13 @@ int is_orthogonal_m3(float mat[][3])
int is_orthogonal_m4(float mat[][4])
{
- if (fabs(dot_v3v3(mat[0], mat[1])) > 1.5 * FLT_EPSILON)
+ if (fabsf(dot_v3v3(mat[0], mat[1])) > 1.5f * FLT_EPSILON)
return 0;
- if (fabs(dot_v3v3(mat[1], mat[2])) > 1.5 * FLT_EPSILON)
+ if (fabsf(dot_v3v3(mat[1], mat[2])) > 1.5f * FLT_EPSILON)
return 0;
- if (fabs(dot_v3v3(mat[0], mat[2])) > 1.5 * FLT_EPSILON)
+ if (fabsf(dot_v3v3(mat[0], mat[2])) > 1.5f * FLT_EPSILON)
return 0;
return 1;
@@ -801,11 +806,11 @@ void normalize_m4(float mat[][4])
float len;
len= normalize_v3(mat[0]);
- if(len!=0.0) mat[0][3]/= len;
+ if(len!=0.0f) mat[0][3]/= len;
len= normalize_v3(mat[1]);
- if(len!=0.0) mat[1][3]/= len;
+ if(len!=0.0f) mat[1][3]/= len;
len= normalize_v3(mat[2]);
- if(len!=0.0) mat[2][3]/= len;
+ if(len!=0.0f) mat[2][3]/= len;
}
void normalize_m4_m4(float rmat[][4], float mat[][4])
@@ -813,11 +818,11 @@ void normalize_m4_m4(float rmat[][4], float mat[][4])
float len;
len= normalize_v3_v3(rmat[0], mat[0]);
- if(len!=0.0) rmat[0][3]= mat[0][3] / len;
+ if(len!=0.0f) rmat[0][3]= mat[0][3] / len;
len= normalize_v3_v3(rmat[1], mat[1]);
- if(len!=0.0) rmat[1][3]= mat[1][3] / len;
+ if(len!=0.0f) rmat[1][3]= mat[1][3] / len;
len= normalize_v3_v3(rmat[2], mat[2]);
- if(len!=0.0) rmat[2][3]= mat[2][3] / len;;
+ if(len!=0.0f) rmat[2][3]= mat[2][3] / len;;
}
void adjoint_m3_m3(float m1[][3], float m[][3])
diff --git a/source/blender/blenlib/intern/math_rotation.c b/source/blender/blenlib/intern/math_rotation.c
index 1160ec9fc3a..dfd715ccbf2 100644
--- a/source/blender/blenlib/intern/math_rotation.c
+++ b/source/blender/blenlib/intern/math_rotation.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
* */
+/** \file blender/blenlib/intern/math_rotation.c
+ * \ingroup bli
+ */
+
+
#include <assert.h>
#include "BLI_math.h"
@@ -162,10 +167,10 @@ static void quat_to_mat3_no_error(float m[][3], const float q[4])
{
double q0, q1, q2, q3, qda,qdb,qdc,qaa,qab,qac,qbb,qbc,qcc;
- q0= M_SQRT2 * q[0];
- q1= M_SQRT2 * q[1];
- q2= M_SQRT2 * q[2];
- q3= M_SQRT2 * q[3];
+ q0= M_SQRT2 * (double)q[0];
+ q1= M_SQRT2 * (double)q[1];
+ q2= M_SQRT2 * (double)q[2];
+ q3= M_SQRT2 * (double)q[3];
qda= q0*q1;
qdb= q0*q2;
@@ -195,7 +200,7 @@ void quat_to_mat3(float m[][3], const float q[4])
{
#ifdef DEBUG
float f;
- if(!((f=dot_qtqt(q, q))==0.0 || (fabs(f-1.0) < QUAT_EPSILON))) {
+ if(!((f=dot_qtqt(q, q))==0.0f || (fabsf(f-1.0f) < (float)QUAT_EPSILON))) {
fprintf(stderr, "Warning! quat_to_mat3() called with non-normalized: size %.8f *** report a bug ***\n", f);
}
#endif
@@ -208,15 +213,15 @@ void quat_to_mat4(float m[][4], const float q[4])
double q0, q1, q2, q3, qda,qdb,qdc,qaa,qab,qac,qbb,qbc,qcc;
#ifdef DEBUG
- if(!((q0=dot_qtqt(q, q))==0.0 || (fabs(q0-1.0) < QUAT_EPSILON))) {
+ if(!((q0=dot_qtqt(q, q))==0.0f || (fabsf(q0-1.0f) < (float)QUAT_EPSILON))) {
fprintf(stderr, "Warning! quat_to_mat4() called with non-normalized: size %.8f *** report a bug ***\n", (float)q0);
}
#endif
- q0= M_SQRT2 * q[0];
- q1= M_SQRT2 * q[1];
- q2= M_SQRT2 * q[2];
- q3= M_SQRT2 * q[3];
+ q0= M_SQRT2 * (double)q[0];
+ q1= M_SQRT2 * (double)q[1];
+ q2= M_SQRT2 * (double)q[2];
+ q3= M_SQRT2 * (double)q[3];
qda= q0*q1;
qdb= q0*q2;
@@ -256,9 +261,9 @@ void mat3_to_quat(float *q, float wmat[][3])
copy_m3_m3(mat, wmat);
normalize_m3(mat); /* this is needed AND a NormalQuat in the end */
- tr= 0.25*(1.0+mat[0][0]+mat[1][1]+mat[2][2]);
+ tr= 0.25* (double)(1.0f+mat[0][0]+mat[1][1]+mat[2][2]);
- if(tr>FLT_EPSILON) {
+ if(tr>(double)FLT_EPSILON) {
s= sqrt(tr);
q[0]= (float)s;
s= 1.0/(4.0*s);
@@ -268,7 +273,7 @@ void mat3_to_quat(float *q, float wmat[][3])
}
else {
if(mat[0][0] > mat[1][1] && mat[0][0] > mat[2][2]) {
- s= 2.0*sqrtf(1.0 + mat[0][0] - mat[1][1] - mat[2][2]);
+ s= 2.0*sqrtf(1.0f + mat[0][0] - mat[1][1] - mat[2][2]);
q[1]= (float)(0.25*s);
s= 1.0/s;
@@ -277,7 +282,7 @@ void mat3_to_quat(float *q, float wmat[][3])
q[3]= (float)((mat[2][0] + mat[0][2])*s);
}
else if(mat[1][1] > mat[2][2]) {
- s= 2.0*sqrtf(1.0 + mat[1][1] - mat[0][0] - mat[2][2]);
+ s= 2.0*sqrtf(1.0f + mat[1][1] - mat[0][0] - mat[2][2]);
q[2]= (float)(0.25*s);
s= 1.0/s;
@@ -356,7 +361,7 @@ float normalize_qt(float *q)
float len;
len= (float)sqrt(dot_qtqt(q, q));
- if(len!=0.0) {
+ if(len!=0.0f) {
mul_qt_fl(q, 1.0f/len);
}
else {
@@ -423,7 +428,7 @@ void vec_to_quat(float q[4], const float vec[3], short axis, const short upflag)
q[1]=q[2]=q[3]= 0.0;
len1= (float)sqrt(x2*x2+y2*y2+z2*z2);
- if(len1 == 0.0) return;
+ if(len1 == 0.0f) return;
/* nasty! I need a good routine for this...
* problem is a rotation of an Y axis to the negative Y-axis for example.
@@ -626,11 +631,11 @@ void tri_to_quat(float quat[4], const float v1[3], const float v2[3], const floa
q2[1]= 0.0f;
q2[2]= 0.0f;
q2[3]= si;
-
+
mul_qt_qtqt(quat, q1, q2);
}
-void print_qt(char *str, float q[4])
+void print_qt(const char *str, const float q[4])
{
printf("%s: %.3f %.3f %.3f %.3f\n", str, q[0], q[1], q[2], q[3]);
}
@@ -662,7 +667,7 @@ void quat_to_axis_angle(float axis[3], float *angle, const float q[4])
float ha, si;
#ifdef DEBUG
- if(!((ha=dot_qtqt(q, q))==0.0 || (fabs(ha-1.0) < QUAT_EPSILON))) {
+ if(!((ha=dot_qtqt(q, q))==0.0f || (fabsf(ha-1.0f) < (float)QUAT_EPSILON))) {
fprintf(stderr, "Warning! quat_to_axis_angle() called with non-normalized: size %.8f *** report a bug ***\n", ha);
}
#endif
@@ -841,8 +846,8 @@ void vec_rot_to_quat(float *quat, const float vec[3], const float phi)
unit_qt(quat);
}
else {
- quat[0]= (float)cos(phi/2.0);
- si= (float)sin(phi/2.0);
+ quat[0]= (float)cos((double)phi/2.0);
+ si= (float)sin((double)phi/2.0);
quat[1] *= si;
quat[2] *= si;
quat[3] *= si;
@@ -923,7 +928,7 @@ static void mat3_to_eul2(float tmat[][3], float eul1[3], float eul2[3])
cy = (float)sqrt(mat[0][0]*mat[0][0] + mat[0][1]*mat[0][1]);
- if (cy > 16.0*FLT_EPSILON) {
+ if (cy > 16.0f*FLT_EPSILON) {
eul1[0] = (float)atan2(mat[1][2], mat[2][2]);
eul1[1] = (float)atan2(-mat[0][2], cy);
@@ -1040,13 +1045,13 @@ void compatible_eul(float eul[3], const float oldrot[3])
/* is 1 of the axis rotations larger than 180 degrees and the other small? NO ELSE IF!! */
if(fabs(dx) > 3.2 && fabs(dy)<1.6 && fabs(dz)<1.6) {
- if(dx > 0.0) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI;
+ if(dx > 0.0f) eul[0] -= 2.0f*(float)M_PI; else eul[0]+= 2.0f*(float)M_PI;
}
if(fabs(dy) > 3.2 && fabs(dz)<1.6 && fabs(dx)<1.6) {
- if(dy > 0.0) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI;
+ if(dy > 0.0f) eul[1] -= 2.0f*(float)M_PI; else eul[1]+= 2.0f*(float)M_PI;
}
if(fabs(dz) > 3.2 && fabs(dx)<1.6 && fabs(dy)<1.6) {
- if(dz > 0.0) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI;
+ if(dz > 0.0f) eul[2] -= 2.0f*(float)M_PI; else eul[2]+= 2.0f*(float)M_PI;
}
/* the method below was there from ancient days... but why! probably because the code sucks :)
@@ -1217,7 +1222,7 @@ static void mat3_to_eulo2(float M[3][3], float *e1, float *e2, short order)
cy= sqrt(m[i][i]*m[i][i] + m[i][j]*m[i][j]);
- if (cy > 16*FLT_EPSILON) {
+ if (cy > 16.0*(double)FLT_EPSILON) {
e1[i] = atan2(m[j][k], m[k][k]);
e1[j] = atan2(-m[i][k], cy);
e1[k] = atan2(m[i][j], m[i][i]);
@@ -1412,7 +1417,7 @@ void mat4_to_dquat(DualQuat *dq,float basemat[][4], float mat[][4])
copy_v3_v3(dscale, scale);
dscale[0] -= 1.0f; dscale[1] -= 1.0f; dscale[2] -= 1.0f;
- if((determinant_m4(mat) < 0.0f) || len_v3(dscale) > 1e-4) {
+ if((determinant_m4(mat) < 0.0f) || len_v3(dscale) > 1e-4f) {
/* extract R and S */
float tmp[4][4];
@@ -1663,10 +1668,26 @@ void vec_apply_track(float vec[3], short axis)
/* lens/angle conversion (radians) */
float lens_to_angle(float lens)
{
- return 2.0f * atan(16.0f/lens);
+ return 2.0f * atanf(16.0f/lens);
}
float angle_to_lens(float angle)
{
- return 16.0f / tan(angle * 0.5f);
+ return 16.0f / tanf(angle * 0.5f);
+}
+
+/* 'mod_inline(-3,4)= 1', 'fmod(-3,4)= -3' */
+static float mod_inline(float a, float b)
+{
+ return a - (b * floorf(a / b));
+}
+
+float angle_wrap_rad(float angle)
+{
+ return mod_inline(angle + (float)M_PI, (float)M_PI*2.0f) - (float)M_PI;
+}
+
+float angle_wrap_deg(float angle)
+{
+ return mod_inline(angle + 180.0f, 360.0f) - 180.0f;
}
diff --git a/source/blender/blenlib/intern/math_vector.c b/source/blender/blenlib/intern/math_vector.c
index 6c4000c6142..15d671e38d7 100644
--- a/source/blender/blenlib/intern/math_vector.c
+++ b/source/blender/blenlib/intern/math_vector.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
* */
+/** \file blender/blenlib/intern/math_vector.c
+ * \ingroup bli
+ */
+
+
#include "BLI_math.h"
@@ -202,10 +207,10 @@ void angle_tri_v3(float angles[3], const float v1[3], const float v2[3], const f
normalize_v3(ed2);
normalize_v3(ed3);
- angles[0]= M_PI - angle_normalized_v3v3(ed1, ed2);
- angles[1]= M_PI - angle_normalized_v3v3(ed2, ed3);
+ angles[0]= (float)M_PI - angle_normalized_v3v3(ed1, ed2);
+ angles[1]= (float)M_PI - angle_normalized_v3v3(ed2, ed3);
// face_angles[2] = M_PI - angle_normalized_v3v3(ed3, ed1);
- angles[2]= M_PI - (angles[0] + angles[1]);
+ angles[2]= (float)M_PI - (angles[0] + angles[1]);
}
void angle_quad_v3(float angles[4], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
@@ -222,10 +227,10 @@ void angle_quad_v3(float angles[4], const float v1[3], const float v2[3], const
normalize_v3(ed3);
normalize_v3(ed4);
- angles[0]= M_PI - angle_normalized_v3v3(ed1, ed2);
- angles[1]= M_PI - angle_normalized_v3v3(ed2, ed3);
- angles[2]= M_PI - angle_normalized_v3v3(ed3, ed4);
- angles[3]= M_PI - angle_normalized_v3v3(ed4, ed1);
+ angles[0]= (float)M_PI - angle_normalized_v3v3(ed1, ed2);
+ angles[1]= (float)M_PI - angle_normalized_v3v3(ed2, ed3);
+ angles[2]= (float)M_PI - angle_normalized_v3v3(ed3, ed4);
+ angles[3]= (float)M_PI - angle_normalized_v3v3(ed4, ed1);
}
/********************************* Geometry **********************************/
diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c
index 52d55ab948b..3470ec92664 100644
--- a/source/blender/blenlib/intern/math_vector_inline.c
+++ b/source/blender/blenlib/intern/math_vector_inline.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
* */
+/** \file blender/blenlib/intern/math_vector_inline.c
+ * \ingroup bli
+ */
+
+
#include "BLI_math.h"
#ifndef BLI_MATH_VECTOR_INLINE_H
@@ -490,9 +495,9 @@ MINLINE int equals_v4v4(const float *v1, const float *v2)
MINLINE int compare_v3v3(const float *v1, const float *v2, const float limit)
{
- if(fabs(v1[0]-v2[0])<limit)
- if(fabs(v1[1]-v2[1])<limit)
- if(fabs(v1[2]-v2[2])<limit)
+ if(fabsf(v1[0]-v2[0])<limit)
+ if(fabsf(v1[1]-v2[1])<limit)
+ if(fabsf(v1[2]-v2[2])<limit)
return 1;
return 0;
@@ -511,10 +516,10 @@ MINLINE int compare_len_v3v3(const float *v1, const float *v2, const float limit
MINLINE int compare_v4v4(const float *v1, const float *v2, const float limit)
{
- if(fabs(v1[0]-v2[0])<limit)
- if(fabs(v1[1]-v2[1])<limit)
- if(fabs(v1[2]-v2[2])<limit)
- if(fabs(v1[3]-v2[3])<limit)
+ if(fabsf(v1[0]-v2[0])<limit)
+ if(fabsf(v1[1]-v2[1])<limit)
+ if(fabsf(v1[2]-v2[2])<limit)
+ if(fabsf(v1[3]-v2[3])<limit)
return 1;
return 0;
diff --git a/source/blender/blenlib/intern/noise.c b/source/blender/blenlib/intern/noise.c
index 9af1532ce4b..49a09dd7b15 100644
--- a/source/blender/blenlib/intern/noise.c
+++ b/source/blender/blenlib/intern/noise.c
@@ -29,6 +29,11 @@
*
*/
+/** \file blender/blenlib/intern/noise.c
+ * \ingroup bli
+ */
+
+
#ifdef _WIN32
#pragma warning (disable : 4244) // "conversion from double to float"
#pragma warning (disable : 4305) // "truncation from const double to float"
diff --git a/source/blender/blenlib/intern/path_util.c b/source/blender/blenlib/intern/path_util.c
index 2359a858d51..f7115b4d46f 100644
--- a/source/blender/blenlib/intern/path_util.c
+++ b/source/blender/blenlib/intern/path_util.c
@@ -29,6 +29,11 @@
* various string, file, list operations.
*/
+/** \file blender/blenlib/intern/path_util.c
+ * \ingroup bli
+ */
+
+
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
@@ -53,8 +58,10 @@
#if defined WIN32 && !defined _LIBC
# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */
#else
-# define _GNU_SOURCE
-# include <fnmatch.h>
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+# endif
+# include <fnmatch.h>
#endif
#ifdef WIN32
@@ -83,7 +90,7 @@
extern char bprogname[];
static int add_win32_extension(char *name);
-static char *blender_version_decimal(void);
+static char *blender_version_decimal(const int ver);
/* implementation */
@@ -199,7 +206,7 @@ void BLI_newname(char *name, int add)
int BLI_uniquename_cb(int (*unique_check)(void *, const char *), void *arg, const char defname[], char delim, char *name, short name_len)
{
- if(name == '\0') {
+ if(name[0] == '\0') {
BLI_strncpy(name, defname, name_len);
}
@@ -289,14 +296,7 @@ void BLI_uniquename(ListBase *list, void *vlink, const char defname[], char deli
* If relbase is NULL then its ignored
*/
-void BLI_cleanup_dir(const char *relabase, char *dir)
-{
- BLI_cleanup_file(relabase, dir);
- BLI_add_slash(dir);
-
-}
-
-void BLI_cleanup_file(const char *relabase, char *dir)
+void BLI_cleanup_path(const char *relabase, char *dir)
{
short a;
char *start, *eind;
@@ -351,13 +351,6 @@ void BLI_cleanup_file(const char *relabase, char *dir)
eind = start + strlen("\\\\") - 1;
memmove( start, eind, strlen(eind)+1 );
}
-
- if((a = strlen(dir))){ /* remove the '\\' at the end */
- while(a>0 && dir[a-1] == '\\'){
- a--;
- dir[a] = 0;
- }
- }
#else
if(dir[0]=='.') { /* happens, for example in FILE_MAIN */
dir[0]= '/';
@@ -395,17 +388,21 @@ void BLI_cleanup_file(const char *relabase, char *dir)
eind = start + (2 - 1) /* strlen("//") - 1 */;
memmove( start, eind, strlen(eind)+1 );
}
-
- if( (a = strlen(dir)) ){ /* remove all '/' at the end */
- while(dir[a-1] == '/'){
- a--;
- dir[a] = 0;
- if (a<=0) break;
- }
- }
#endif
}
+void BLI_cleanup_dir(const char *relabase, char *dir)
+{
+ BLI_cleanup_path(relabase, dir);
+ BLI_add_slash(dir);
+
+}
+
+void BLI_cleanup_file(const char *relabase, char *dir)
+{
+ BLI_cleanup_path(relabase, dir);
+ BLI_del_slash(dir);
+}
void BLI_path_rel(char *file, const char *relfile)
{
@@ -446,8 +443,8 @@ void BLI_path_rel(char *file, const char *relfile)
BLI_char_switch(file, '\\', '/');
/* remove /./ which confuse the following slash counting... */
- BLI_cleanup_file(NULL, file);
- BLI_cleanup_file(NULL, temp);
+ BLI_cleanup_path(NULL, file);
+ BLI_cleanup_path(NULL, temp);
/* the last slash in the file indicates where the path part ends */
lslash = BLI_last_slash(temp);
@@ -459,7 +456,12 @@ void BLI_path_rel(char *file, const char *relfile)
char *p= temp;
char *q= file;
- while (*p == *q) {
+#ifdef WIN32
+ while (tolower(*p) == tolower(*q))
+#else
+ while (*p == *q)
+#endif
+ {
++p; ++q;
/* dont search beyond the end of the string
* in the rare case they match */
@@ -590,19 +592,7 @@ int BLI_path_frame(char *path, int frame, int digits)
if (stringframe_chars(path, &ch_sta, &ch_end)) { /* warning, ch_end is the last # +1 */
char tmp[FILE_MAX];
-#if 0 // neat but breaks on non ascii strings.
- char format[64];
- sprintf(format, "%%.%ds%%.%dd%%s", ch_sta, ch_end-ch_sta); /* example result: "%.12s%.5d%s" */
- sprintf(tmp, format, path, frame, path+ch_end);
-#else
- char format[8];
- char *p;
- sprintf(format, "%%.%dd", ch_end-ch_sta); /* example result: "%.5d" */
- memcpy(tmp, path, sizeof(char) * ch_sta);
- p= tmp + ch_sta;
- p += sprintf(p, format, frame);
- memcpy(p, path + ch_end, strlen(path + ch_end));
-#endif
+ sprintf(tmp, "%.*s%.*d%s", ch_sta, path, ch_end-ch_sta, frame, path+ch_end);
strcpy(path, tmp);
return 1;
}
@@ -617,19 +607,9 @@ int BLI_path_frame_range(char *path, int sta, int end, int digits)
ensure_digits(path, digits);
if (stringframe_chars(path, &ch_sta, &ch_end)) { /* warning, ch_end is the last # +1 */
- char tmp[FILE_MAX], format[64];
-#if 0 // neat but breaks on non ascii strings.
- sprintf(format, "%%.%ds%%.%dd_%%.%dd%%s", ch_sta, ch_end-ch_sta, ch_end-ch_sta); /* example result: "%.12s%.5d-%.5d%s" */
- sprintf(tmp, format, path, sta, end, path+ch_end);
+ char tmp[FILE_MAX];
+ sprintf(tmp, "%.*s%.*d-%.*d%s", ch_sta, path, ch_end-ch_sta, sta, ch_end-ch_sta, end, path+ch_end);
strcpy(path, tmp);
-#else
- char *tmp_pt;
- BLI_snprintf(format, sizeof(format), "%%.%dd-%%.%dd%%s", digits, digits);
- memcpy(tmp, path, ch_sta * sizeof(char));
- tmp_pt = &tmp[ch_sta];
- tmp_pt += BLI_snprintf(tmp_pt, sizeof(tmp)-ch_sta, format, sta, end, &path[ch_end]);
- memcpy(path, tmp, (int)(tmp_pt - tmp) + 1);
-#endif
return 1;
}
return 0;
@@ -679,8 +659,9 @@ int BLI_path_abs(char *path, const char *basepath)
#endif
BLI_strncpy(base, basepath, sizeof(base));
-
- BLI_cleanup_file(NULL, base);
+
+ /* file component is ignored, so dont bother with the trailing slash */
+ BLI_cleanup_path(NULL, base);
/* push slashes into unix mode - strings entering this part are
potentially messed up: having both back- and forward slashes.
@@ -709,17 +690,9 @@ int BLI_path_abs(char *path, const char *basepath)
} else {
BLI_strncpy(path, tmp, FILE_MAX);
}
-
- if (path[0]!='\0') {
- if ( path[strlen(path)-1]=='/') {
- /* remove the '/' so we avoid BLI_cleanup_dir adding an extra \ in WIN32 */
- path[strlen(path)-1] = '\0';
- BLI_cleanup_dir(NULL, path);
- } else {
- BLI_cleanup_file(NULL, path);
- }
- }
-
+
+ BLI_cleanup_path(NULL, path);
+
#ifdef WIN32
/* skip first two chars, which in case of
absolute path will be drive:/blabla and
@@ -812,12 +785,12 @@ void BLI_getlastdir(const char* dir, char *last, int maxlen)
/* This is now only used to really get the user's default document folder */
/* On Windows I chose the 'Users/<MyUserName>/Documents' since it's used
as default location to save documents */
-char *BLI_getDefaultDocumentFolder(void) {
+const char *BLI_getDefaultDocumentFolder(void) {
#if !defined(WIN32)
return getenv("HOME");
#else /* Windows */
- char * ret;
+ const char * ret;
static char documentfolder[MAXPATHLEN];
HRESULT hResult;
@@ -850,10 +823,10 @@ char *BLI_getDefaultDocumentFolder(void) {
// #define PATH_DEBUG2
-static char *blender_version_decimal(void)
+static char *blender_version_decimal(const int ver)
{
static char version_str[5];
- sprintf(version_str, "%d.%02d", BLENDER_VERSION/100, BLENDER_VERSION%100);
+ sprintf(version_str, "%d.%02d", ver/100, ver%100);
return version_str;
}
@@ -863,9 +836,13 @@ static int test_path(char *targetpath, const char *path_base, const char *path_s
if(path_sep) BLI_join_dirfile(tmppath, sizeof(tmppath), path_base, path_sep);
else BLI_strncpy(tmppath, path_base, sizeof(tmppath));
-
- BLI_make_file_string("/", targetpath, tmppath, folder_name);
-
+
+ /* rare cases folder_name is omitted (when looking for ~/.blender/2.xx dir only) */
+ if(folder_name)
+ BLI_make_file_string("/", targetpath, tmppath, folder_name);
+ else
+ BLI_strncpy(targetpath, tmppath, sizeof(tmppath));
+
if (BLI_is_dir(targetpath)) {
#ifdef PATH_DEBUG2
printf("\tpath found: %s\n", targetpath);
@@ -883,7 +860,7 @@ static int test_path(char *targetpath, const char *path_base, const char *path_s
static int test_env_path(char *path, const char *envvar)
{
- char *env = envvar?getenv(envvar):NULL;
+ const char *env = envvar?getenv(envvar):NULL;
if (!env) return 0;
if (BLI_is_dir(env)) {
@@ -895,7 +872,7 @@ static int test_env_path(char *path, const char *envvar)
}
}
-static int get_path_local(char *targetpath, const char *folder_name, const char *subfolder_name)
+static int get_path_local(char *targetpath, const char *folder_name, const char *subfolder_name, const int ver)
{
char bprogdir[FILE_MAX];
char relfolder[FILE_MAX];
@@ -903,24 +880,29 @@ static int get_path_local(char *targetpath, const char *folder_name, const char
#ifdef PATH_DEBUG2
printf("get_path_local...\n");
#endif
-
- if (subfolder_name) {
- BLI_join_dirfile(relfolder, sizeof(relfolder), folder_name, subfolder_name);
- } else {
- BLI_strncpy(relfolder, folder_name, sizeof(relfolder));
+
+ if(folder_name) {
+ if (subfolder_name) {
+ BLI_join_dirfile(relfolder, sizeof(relfolder), folder_name, subfolder_name);
+ } else {
+ BLI_strncpy(relfolder, folder_name, sizeof(relfolder));
+ }
+ }
+ else {
+ relfolder[0]= '\0';
}
/* use argv[0] (bprogname) to get the path to the executable */
BLI_split_dirfile(bprogname, bprogdir, NULL);
/* try EXECUTABLE_DIR/2.5x/folder_name - new default directory for local blender installed files */
- if(test_path(targetpath, bprogdir, blender_version_decimal(), relfolder))
+ if(test_path(targetpath, bprogdir, blender_version_decimal(ver), relfolder))
return 1;
return 0;
}
-static int get_path_user(char *targetpath, const char *folder_name, const char *subfolder_name, const char *envvar)
+static int get_path_user(char *targetpath, const char *folder_name, const char *subfolder_name, const char *envvar, const int ver)
{
char user_path[FILE_MAX];
const char *user_base_path;
@@ -938,7 +920,7 @@ static int get_path_user(char *targetpath, const char *folder_name, const char *
user_base_path = (const char *)GHOST_getUserDir();
if (user_base_path) {
- BLI_snprintf(user_path, FILE_MAX, BLENDER_USER_FORMAT, user_base_path, blender_version_decimal());
+ BLI_snprintf(user_path, FILE_MAX, BLENDER_USER_FORMAT, user_base_path, blender_version_decimal(ver));
}
if(!user_path[0])
@@ -957,7 +939,7 @@ static int get_path_user(char *targetpath, const char *folder_name, const char *
}
}
-static int get_path_system(char *targetpath, const char *folder_name, const char *subfolder_name, const char *envvar)
+static int get_path_system(char *targetpath, const char *folder_name, const char *subfolder_name, const char *envvar, const int ver)
{
char system_path[FILE_MAX];
const char *system_base_path;
@@ -972,10 +954,15 @@ static int get_path_system(char *targetpath, const char *folder_name, const char
/* use argv[0] (bprogname) to get the path to the executable */
BLI_split_dirfile(bprogname, bprogdir, NULL);
- if (subfolder_name) {
- BLI_join_dirfile(relfolder, sizeof(relfolder), folder_name, subfolder_name);
- } else {
- BLI_strncpy(relfolder, folder_name, sizeof(relfolder));
+ if(folder_name) {
+ if (subfolder_name) {
+ BLI_join_dirfile(relfolder, sizeof(relfolder), folder_name, subfolder_name);
+ } else {
+ BLI_strncpy(relfolder, folder_name, sizeof(relfolder));
+ }
+ }
+ else {
+ relfolder[0]= '\0';
}
/* try CWD/release/folder_name */
@@ -1005,7 +992,7 @@ static int get_path_system(char *targetpath, const char *folder_name, const char
system_base_path = (const char *)GHOST_getSystemDir();
if (system_base_path) {
- BLI_snprintf(system_path, FILE_MAX, BLENDER_SYSTEM_FORMAT, system_base_path, blender_version_decimal());
+ BLI_snprintf(system_path, FILE_MAX, BLENDER_SYSTEM_FORMAT, system_base_path, blender_version_decimal(ver));
}
if(!system_path[0])
@@ -1028,70 +1015,71 @@ static int get_path_system(char *targetpath, const char *folder_name, const char
/* returns the path if found, NULL string if not */
char *BLI_get_folder(int folder_id, const char *subfolder)
{
+ const int ver= BLENDER_VERSION;
static char path[FILE_MAX] = "";
switch (folder_id) {
case BLENDER_DATAFILES: /* general case */
- if (get_path_local(path, "datafiles", subfolder)) break;
- if (get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES")) break;
- if (get_path_system(path, "datafiles", subfolder, "BLENDER_SYSTEM_DATAFILES")) break;
+ if (get_path_local(path, "datafiles", subfolder, ver)) break;
+ if (get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES", ver)) break;
+ if (get_path_system(path, "datafiles", subfolder, "BLENDER_SYSTEM_DATAFILES", ver)) break;
return NULL;
case BLENDER_USER_DATAFILES:
- if (get_path_local(path, "datafiles", subfolder)) break;
- if (get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES")) break;
+ if (get_path_local(path, "datafiles", subfolder, ver)) break;
+ if (get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES", ver)) break;
return NULL;
case BLENDER_SYSTEM_DATAFILES:
- if (get_path_local(path, "datafiles", subfolder)) break;
- if (get_path_system(path, "datafiles", subfolder, "BLENDER_SYSTEM_DATAFILES")) break;
+ if (get_path_local(path, "datafiles", subfolder, ver)) break;
+ if (get_path_system(path, "datafiles", subfolder, "BLENDER_SYSTEM_DATAFILES", ver)) break;
return NULL;
case BLENDER_USER_AUTOSAVE:
- if (get_path_local(path, "autosave", subfolder)) break;
- if (get_path_user(path, "autosave", subfolder, "BLENDER_USER_DATAFILES")) break;
+ if (get_path_local(path, "autosave", subfolder, ver)) break;
+ if (get_path_user(path, "autosave", subfolder, "BLENDER_USER_DATAFILES", ver)) break;
return NULL;
case BLENDER_CONFIG: /* general case */
- if (get_path_local(path, "config", subfolder)) break;
- if (get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG")) break;
- if (get_path_system(path, "config", subfolder, "BLENDER_SYSTEM_CONFIG")) break;
+ if (get_path_local(path, "config", subfolder, ver)) break;
+ if (get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG", ver)) break;
+ if (get_path_system(path, "config", subfolder, "BLENDER_SYSTEM_CONFIG", ver)) break;
return NULL;
case BLENDER_USER_CONFIG:
- if (get_path_local(path, "config", subfolder)) break;
- if (get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG")) break;
+ if (get_path_local(path, "config", subfolder, ver)) break;
+ if (get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG", ver)) break;
return NULL;
case BLENDER_SYSTEM_CONFIG:
- if (get_path_local(path, "config", subfolder)) break;
- if (get_path_system(path, "config", subfolder, "BLENDER_SYSTEM_CONFIG")) break;
+ if (get_path_local(path, "config", subfolder, ver)) break;
+ if (get_path_system(path, "config", subfolder, "BLENDER_SYSTEM_CONFIG", ver)) break;
return NULL;
case BLENDER_SCRIPTS: /* general case */
- if (get_path_local(path, "scripts", subfolder)) break;
- if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS")) break;
- if (get_path_system(path, "scripts", subfolder, "BLENDER_SYSTEM_SCRIPTS")) break;
+ if (get_path_local(path, "scripts", subfolder, ver)) break;
+ if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver)) break;
+ if (get_path_system(path, "scripts", subfolder, "BLENDER_SYSTEM_SCRIPTS", ver)) break;
return NULL;
case BLENDER_USER_SCRIPTS:
- if (get_path_local(path, "scripts", subfolder)) break;
- if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS")) break;
+ if (get_path_local(path, "scripts", subfolder, ver)) break;
+ if (get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver)) break;
return NULL;
case BLENDER_SYSTEM_SCRIPTS:
- if (get_path_local(path, "scripts", subfolder)) break;
- if (get_path_system(path, "scripts", subfolder, "BLENDER_SYSTEM_SCRIPTS")) break;
+ if (get_path_local(path, "scripts", subfolder, ver)) break;
+ if (get_path_system(path, "scripts", subfolder, "BLENDER_SYSTEM_SCRIPTS", ver)) break;
return NULL;
case BLENDER_PYTHON: /* general case */
- if (get_path_local(path, "python", subfolder)) break;
- if (get_path_system(path, "python", subfolder, "BLENDER_SYSTEM_PYTHON")) break;
+ if (get_path_local(path, "python", subfolder, ver)) break;
+ if (get_path_system(path, "python", subfolder, "BLENDER_SYSTEM_PYTHON", ver)) break;
return NULL;
case BLENDER_SYSTEM_PYTHON:
- if (get_path_local(path, "python", subfolder)) break;
- if (get_path_system(path, "python", subfolder, "BLENDER_SYSTEM_PYTHON")) break;
+ if (get_path_local(path, "python", subfolder, ver)) break;
+ if (get_path_system(path, "python", subfolder, "BLENDER_SYSTEM_PYTHON", ver)) break;
return NULL;
}
@@ -1100,20 +1088,21 @@ char *BLI_get_folder(int folder_id, const char *subfolder)
char *BLI_get_user_folder_notest(int folder_id, const char *subfolder)
{
+ const int ver= BLENDER_VERSION;
static char path[FILE_MAX] = "";
switch (folder_id) {
case BLENDER_USER_DATAFILES:
- get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES");
+ get_path_user(path, "datafiles", subfolder, "BLENDER_USER_DATAFILES", ver);
break;
case BLENDER_USER_CONFIG:
- get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG");
+ get_path_user(path, "config", subfolder, "BLENDER_USER_CONFIG", ver);
break;
case BLENDER_USER_AUTOSAVE:
- get_path_user(path, "autosave", subfolder, "BLENDER_USER_AUTOSAVE");
+ get_path_user(path, "autosave", subfolder, "BLENDER_USER_AUTOSAVE", ver);
break;
case BLENDER_USER_SCRIPTS:
- get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS");
+ get_path_user(path, "scripts", subfolder, "BLENDER_USER_SCRIPTS", ver);
break;
}
if ('\0' == path[0]) {
@@ -1140,6 +1129,30 @@ char *BLI_get_folder_create(int folder_id, const char *subfolder)
return path;
}
+char *BLI_get_folder_version(const int id, const int ver, const int do_check)
+{
+ static char path[FILE_MAX] = "";
+ int ok;
+ switch(id) {
+ case BLENDER_RESOURCE_PATH_USER:
+ ok= get_path_user(path, NULL, NULL, NULL, ver);
+ break;
+ case BLENDER_RESOURCE_PATH_LOCAL:
+ ok= get_path_local(path, NULL, NULL, ver);
+ break;
+ case BLENDER_RESOURCE_PATH_SYSTEM:
+ ok= get_path_system(path, NULL, NULL, NULL, ver);
+ break;
+ default:
+ BLI_assert(!"incorrect ID");
+ }
+
+ if((ok == FALSE) && do_check) {
+ return NULL;
+ }
+
+ return path;
+}
/* End new stuff */
/* ************************************************************* */
@@ -1184,7 +1197,7 @@ void BLI_setenv_if_new(const char *env, const char* val)
void BLI_clean(char *path)
{
- if(path==0) return;
+ if(path==NULL) return;
#ifdef WIN32
if(path && BLI_strnlen(path, 3) > 2) {
@@ -1197,7 +1210,7 @@ void BLI_clean(char *path)
void BLI_char_switch(char *string, char from, char to)
{
- if(string==0) return;
+ if(string==NULL) return;
while (*string != 0) {
if (*string == from) *string = to;
string++;
@@ -1380,13 +1393,16 @@ int BLI_testextensie_glob(const char *str, const char *ext_fnmatch)
}
-int BLI_replace_extension(char *path, int maxlen, const char *ext)
+int BLI_replace_extension(char *path, size_t maxlen, const char *ext)
{
- unsigned int a;
+ size_t a;
- for(a=strlen(path)-1; a>=0; a--)
- if(path[a] == '.' || path[a] == '/' || path[a] == '\\')
+ for(a=strlen(path); a>0; a--) {
+ if(path[a-1] == '.' || path[a-1] == '/' || path[a-1] == '\\') {
+ a--;
break;
+ }
+ }
if(path[a] != '.')
a= strlen(path);
@@ -1510,7 +1526,7 @@ int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char
if (!strncmp(path, blend_dir, len)) {
/* if image is _in_ current .blend file directory */
- if (!strcmp(dir, blend_dir)) {
+ if (BLI_path_cmp(dir, blend_dir) == 0) {
BLI_join_dirfile(dest_path, sizeof(dest_path), dest_dir, base);
}
/* "below" */
@@ -1537,7 +1553,7 @@ int BKE_rebase_path(char *abs, int abs_size, char *rel, int rel_size, const char
}
/* return 2 if src=dest */
- if (!strcmp(path, dest_path)) {
+ if (BLI_path_cmp(path, dest_path) == 0) {
// if (G.f & G_DEBUG) printf("%s and %s are the same file\n", path, dest_path);
return 2;
}
@@ -1617,7 +1633,7 @@ static int add_win32_extension(char *name)
#ifdef _WIN32
char filename[FILE_MAXDIR+FILE_MAXFILE];
char ext[FILE_MAXDIR+FILE_MAXFILE];
- char *extensions = getenv("PATHEXT");
+ const char *extensions = getenv("PATHEXT");
if (extensions) {
char *temp;
do {
@@ -1652,7 +1668,7 @@ static int add_win32_extension(char *name)
void BLI_where_am_i(char *fullname, const int maxlen, const char *name)
{
char filename[FILE_MAXDIR+FILE_MAXFILE];
- char *path = NULL, *temp;
+ const char *path = NULL, *temp;
#ifdef _WIN32
const char *separator = ";";
@@ -1666,7 +1682,7 @@ void BLI_where_am_i(char *fullname, const int maxlen, const char *name)
path = br_find_exe( NULL );
if (path) {
BLI_strncpy(fullname, path, maxlen);
- free(path);
+ free((void *)path);
return;
}
#endif
@@ -1749,7 +1765,7 @@ void BLI_where_is_temp(char *fullname, const int maxlen, int usertemp)
#ifdef WIN32
if (fullname[0] == '\0') {
- char *tmp = getenv("TEMP"); /* Windows */
+ const char *tmp = getenv("TEMP"); /* Windows */
if (tmp && BLI_is_dir(tmp)) {
BLI_strncpy(fullname, tmp, maxlen);
}
@@ -1757,14 +1773,14 @@ void BLI_where_is_temp(char *fullname, const int maxlen, int usertemp)
#else
/* Other OS's - Try TMP and TMPDIR */
if (fullname[0] == '\0') {
- char *tmp = getenv("TMP");
+ const char *tmp = getenv("TMP");
if (tmp && BLI_is_dir(tmp)) {
BLI_strncpy(fullname, tmp, maxlen);
}
}
if (fullname[0] == '\0') {
- char *tmp = getenv("TMPDIR");
+ const char *tmp = getenv("TMPDIR");
if (tmp && BLI_is_dir(tmp)) {
BLI_strncpy(fullname, tmp, maxlen);
}
diff --git a/source/blender/blenlib/intern/pbvh.c b/source/blender/blenlib/intern/pbvh.c
index 3393a2674e9..025c5560764 100644
--- a/source/blender/blenlib/intern/pbvh.c
+++ b/source/blender/blenlib/intern/pbvh.c
@@ -20,6 +20,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/pbvh.c
+ * \ingroup bli
+ */
+
+
#include "DNA_meshdata_types.h"
@@ -1531,7 +1536,7 @@ void BLI_pbvh_apply_vertCos(PBVH *pbvh, float (*vertCos)[3])
}
/* coordinates are new -- normals should also be updated */
- mesh_calc_normals(pbvh->verts, pbvh->totvert, pbvh->faces, pbvh->totprim, NULL);
+ mesh_calc_tessface_normals(pbvh->verts, pbvh->totvert, pbvh->faces, pbvh->totprim, NULL);
for (a= 0; a < pbvh->totnode; ++a)
BLI_pbvh_node_mark_update(&pbvh->nodes[a]);
diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c
index 8afb9bec3dd..d889c1b9bf2 100644
--- a/source/blender/blenlib/intern/rand.c
+++ b/source/blender/blenlib/intern/rand.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/rand.c
+ * \ingroup bli
+ */
+
+
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/blenlib/intern/rct.c b/source/blender/blenlib/intern/rct.c
index 5fb9842b7a2..c520375945f 100644
--- a/source/blender/blenlib/intern/rct.c
+++ b/source/blender/blenlib/intern/rct.c
@@ -34,6 +34,11 @@
* ***** END GPL LICENSE BLOCK *****
*
*/
+
+/** \file blender/blenlib/intern/rct.c
+ * \ingroup bli
+ */
+
#include <stdio.h>
#include <math.h>
@@ -238,10 +243,10 @@ void BLI_copy_rcti_rctf(rcti *tar, const rctf *src)
void print_rctf(const char *str, rctf *rect)
{
- printf("%s: xmin %.3f, xmax %.3f, ymin %.3f, ymax %.3f\n", str, rect->xmin, rect->xmax, rect->ymin, rect->ymax);
+ printf("%s: xmin %.3f, xmax %.3f, ymin %.3f, ymax %.3f (%.3fx%.3f)\n", str, rect->xmin, rect->xmax, rect->ymin, rect->xmax, rect->xmax - rect->xmin, rect->ymax - rect->ymin);
}
void print_rcti(const char *str, rcti *rect)
{
- printf("%s: xmin %d, xmax %d, ymin %d, ymax %d\n", str, rect->xmin, rect->xmax, rect->ymin, rect->ymax);
+ printf("%s: xmin %d, xmax %d, ymin %d, ymax %d (%dx%d)\n", str, rect->xmin, rect->xmax, rect->ymin, rect->ymax, rect->xmax - rect->xmin, rect->ymax - rect->ymin);
}
diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c
index 4e6e19abe49..2ad3d4e930e 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -27,6 +27,9 @@
* ***** END GPL LICENSE BLOCK *****
* (uit traces) maart 95
*/
+/** \file blender/blenlib/intern/scanfill.c
+ * \ingroup bli
+ */
#include <stdio.h>
#include <math.h>
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index b7ac571f856..e9db148e992 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -29,6 +29,11 @@
* Some really low-level file thingies.
*/
+/** \file blender/blenlib/intern/storage.c
+ * \ingroup bli
+ */
+
+
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
@@ -95,8 +100,7 @@
static int totnum,actnum;
static struct direntry *files;
-static struct ListBase dirbase_={
- 0,0};
+static struct ListBase dirbase_={NULL, NULL};
static struct ListBase *dirbase = &dirbase_;
/* can return NULL when the size is not big enough */
@@ -395,7 +399,7 @@ unsigned int BLI_getdir(const char *dirname, struct direntry **filelist)
// filesel.c:freefilelist()
actnum = totnum = 0;
- files = 0;
+ files = NULL;
BLI_builddir(dirname,"");
BLI_adddirstrings();
diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c
index d6331d6eeb8..d626ca4bf09 100644
--- a/source/blender/blenlib/intern/string.c
+++ b/source/blender/blenlib/intern/string.c
@@ -32,6 +32,11 @@
*
*/
+/** \file blender/blenlib/intern/string.c
+ * \ingroup bli
+ */
+
+
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
@@ -42,7 +47,7 @@
#include "BLI_dynstr.h"
#include "BLI_string.h"
-char *BLI_strdupn(const char *str, int len) {
+char *BLI_strdupn(const char *str, const size_t len) {
char *n= MEM_mallocN(len+1, "strdup");
memcpy(n, str, len);
n[len]= '\0';
@@ -55,7 +60,7 @@ char *BLI_strdup(const char *str) {
char *BLI_strdupcat(const char *str1, const char *str2)
{
- int len;
+ size_t len;
char *n;
len= strlen(str1)+strlen(str2);
@@ -66,9 +71,9 @@ char *BLI_strdupcat(const char *str1, const char *str2)
return n;
}
-char *BLI_strncpy(char *dst, const char *src, const int maxncpy) {
- int srclen= strlen(src);
- int cpylen= (srclen>(maxncpy-1))?(maxncpy-1):srclen;
+char *BLI_strncpy(char *dst, const char *src, const size_t maxncpy) {
+ size_t srclen= strlen(src);
+ size_t cpylen= (srclen>(maxncpy-1))?(maxncpy-1):srclen;
memcpy(dst, src, cpylen);
dst[cpylen]= '\0';
@@ -76,9 +81,9 @@ char *BLI_strncpy(char *dst, const char *src, const int maxncpy) {
return dst;
}
-int BLI_snprintf(char *buffer, size_t count, const char *format, ...)
+size_t BLI_snprintf(char *buffer, size_t count, const char *format, ...)
{
- int n;
+ size_t n;
va_list arg;
va_start(arg, format);
@@ -123,7 +128,7 @@ char *BLI_sprintfN(const char *format, ...)
*/
char *BLI_getQuotedStr (const char *str, const char *prefix)
{
- int prefixLen = strlen(prefix);
+ size_t prefixLen = strlen(prefix);
char *startMatch, *endMatch;
/* get the starting point (i.e. where prefix starts, and add prefixLen+1 to it to get be after the first " */
@@ -133,7 +138,7 @@ char *BLI_getQuotedStr (const char *str, const char *prefix)
endMatch= strchr(startMatch, '"'); // " NOTE: this comment here is just so that my text editor still shows the functions ok...
/* return the slice indicated */
- return BLI_strdupn(startMatch, (int)(endMatch-startMatch));
+ return BLI_strdupn(startMatch, (size_t)(endMatch-startMatch));
}
/* Replaces all occurances of oldText with newText in str, returning a new string that doesn't
@@ -144,7 +149,7 @@ char *BLI_getQuotedStr (const char *str, const char *prefix)
char *BLI_replacestr(char *str, const char *oldText, const char *newText)
{
DynStr *ds= NULL;
- int lenOld= strlen(oldText);
+ size_t lenOld= strlen(oldText);
char *match;
/* sanity checks */
@@ -258,10 +263,10 @@ int BLI_strcasecmp(const char *s1, const char *s2) {
return 0;
}
-int BLI_strncasecmp(const char *s1, const char *s2, int n) {
+int BLI_strncasecmp(const char *s1, const char *s2, size_t len) {
int i;
- for (i=0; i<n; i++) {
+ for (i=0; i<len; i++) {
char c1 = tolower(s1[i]);
char c2 = tolower(s2[i]);
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index f57f6f969ae..7b59a7905aa 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -28,6 +28,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/threads.c
+ * \ingroup bli
+ */
+
+
#include <errno.h>
#include <string.h>
diff --git a/source/blender/blenlib/intern/time.c b/source/blender/blenlib/intern/time.c
index a14f73968bf..5bc7ca3609c 100644
--- a/source/blender/blenlib/intern/time.c
+++ b/source/blender/blenlib/intern/time.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/time.c
+ * \ingroup bli
+ */
+
+
#include "PIL_time.h"
#ifdef WIN32
diff --git a/source/blender/blenlib/intern/uvproject.c b/source/blender/blenlib/intern/uvproject.c
index 81fe6b26ba4..d139fb1ab71 100644
--- a/source/blender/blenlib/intern/uvproject.c
+++ b/source/blender/blenlib/intern/uvproject.c
@@ -20,6 +20,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/uvproject.c
+ * \ingroup bli
+ */
+
+
#include <math.h>
#include "MEM_guardedalloc.h"
@@ -55,7 +60,7 @@ void project_from_camera(float target[2], float source[3], UvCameraInfo *uci)
mul_m4_v4(uci->caminv, pv4);
if(uci->do_pano) {
- float angle= atan2f(pv4[0], -pv4[2]) / (M_PI * 2.0); /* angle around the camera */
+ float angle= atan2f(pv4[0], -pv4[2]) / ((float)M_PI * 2.0f); /* angle around the camera */
if (uci->do_persp==0) {
target[0]= angle; /* no correct method here, just map to 0-1 */
target[1]= pv4[1] / uci->camsize;
@@ -64,7 +69,7 @@ void project_from_camera(float target[2], float source[3], UvCameraInfo *uci)
float vec2d[2]; /* 2D position from the camera */
vec2d[0]= pv4[0];
vec2d[1]= pv4[2];
- target[0]= angle * (M_PI / uci->camangle);
+ target[0]= angle * ((float)M_PI / uci->camangle);
target[1]= pv4[1] / (len_v2(vec2d) * uci->camsize);
}
}
@@ -104,23 +109,23 @@ void project_from_view(float target[2], float source[3], float persmat[4][4], fl
/* almost project_short */
mul_m4_v4(persmat, pv4);
- if(fabs(pv4[3]) > 0.00001) { /* avoid division by zero */
- target[0] = winx/2.0 + (winx/2.0) * pv4[0] / pv4[3];
- target[1] = winy/2.0 + (winy/2.0) * pv4[1] / pv4[3];
+ if(fabsf(pv4[3]) > 0.00001f) { /* avoid division by zero */
+ target[0] = winx/2.0f + (winx/2.0f) * pv4[0] / pv4[3];
+ target[1] = winy/2.0f + (winy/2.0f) * pv4[1] / pv4[3];
}
else {
/* scaling is lost but give a valid result */
- target[0] = winx/2.0 + (winx/2.0) * pv4[0];
- target[1] = winy/2.0 + (winy/2.0) * pv4[1];
+ target[0] = winx/2.0f + (winx/2.0f) * pv4[0];
+ target[1] = winy/2.0f + (winy/2.0f) * pv4[1];
}
/* v3d->persmat seems to do this funky scaling */
if(winx > winy) {
- y= (winx - winy)/2.0;
+ y= (winx - winy)/2.0f;
winy = winx;
}
else {
- x= (winy - winx)/2.0;
+ x= (winy - winx)/2.0f;
winx = winy;
}
diff --git a/source/blender/blenlib/intern/voxel.c b/source/blender/blenlib/intern/voxel.c
index 966bf754d69..d11386ff606 100644
--- a/source/blender/blenlib/intern/voxel.c
+++ b/source/blender/blenlib/intern/voxel.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenlib/intern/voxel.c
+ * \ingroup bli
+ */
+
+
#include "BLI_voxel.h"
#include "BLI_utildefines.h"
diff --git a/source/blender/blenlib/intern/winstuff.c b/source/blender/blenlib/intern/winstuff.c
index 71eac3c86c4..90754e7d2bb 100644
--- a/source/blender/blenlib/intern/winstuff.c
+++ b/source/blender/blenlib/intern/winstuff.c
@@ -28,16 +28,23 @@
* Windows-posix compatibility layer, windows-specific functions.
*/
+/** \file blender/blenlib/intern/winstuff.c
+ * \ingroup bli
+ */
+
+
#ifdef WIN32
#include <stdlib.h>
#include <stdio.h>
+#include <conio.h>
#include "MEM_guardedalloc.h"
#include "BLI_path_util.h"
#include "BLI_string.h"
#include "BKE_utildefines.h"
+#include "BKE_global.h"
#define WIN32_SKIP_HKEY_PROTECTION // need to use HKEY
#include "BLI_winstuff.h"
@@ -59,39 +66,116 @@ int BLI_getInstallationDir( char * str ) {
return 1;
}
+int IsConsoleEmpty(void)
+{
+ CONSOLE_SCREEN_BUFFER_INFO csbi = {{0}};
+ HANDLE hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
+
+ return GetConsoleScreenBufferInfo(hStdOutput, &csbi) && csbi.dwCursorPosition.X == 0 && csbi.dwCursorPosition.Y == 0;
+}
-void RegisterBlendExtension(char * str) {
+void RegisterBlendExtension_Fail(HKEY root)
+{
+ printf("failed\n");
+ if (root)
+ RegCloseKey(root);
+ if (!G.background)
+ MessageBox(0,"Could not register file extension.","Blender error",MB_OK|MB_ICONERROR);
+ TerminateProcess(GetCurrentProcess(),1);
+}
+
+void RegisterBlendExtension(void) {
LONG lresult;
HKEY hkey = 0;
+ HKEY root = 0;
+ BOOL usr_mode = FALSE;
DWORD dwd = 0;
- char buffer[128];
-
- lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, "blendfile\\shell\\open\\command", 0,
- "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
+ char buffer[256];
+
+ char BlPath[MAX_PATH];
+ char InstallDir[FILE_MAXDIR];
+ char SysDir[FILE_MAXDIR];
+ const char* ThumbHandlerDLL;
+ char RegCmd[MAX_PATH*2];
+ char MBox[256];
+ BOOL IsWOW64;
+ printf("Registering file extension...");
+ GetModuleFileName(0,BlPath,MAX_PATH);
+
+ // root is HKLM by default
+ lresult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Classes", 0, KEY_ALL_ACCESS, &root);
+ if (lresult != ERROR_SUCCESS)
+ {
+ // try HKCU on failure
+ usr_mode = TRUE;
+ lresult = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Classes", 0, KEY_ALL_ACCESS, &root);
+ if (lresult != ERROR_SUCCESS)
+ RegisterBlendExtension_Fail(0);
+ }
+
+ lresult = RegCreateKeyEx(root, "blendfile", 0,
+ NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
if (lresult == ERROR_SUCCESS) {
- sprintf(buffer, "\"%s\" \"%%1\"", str);
- lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
+ sprintf(buffer,"%s","Blender File");
+ lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, (BYTE*)buffer, strlen(buffer) + 1);
RegCloseKey(hkey);
}
+ if (lresult != ERROR_SUCCESS)
+ RegisterBlendExtension_Fail(root);
- lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, "blendfile\\DefaultIcon", 0,
- "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
-
+ lresult = RegCreateKeyEx(root, "blendfile\\shell\\open\\command", 0,
+ NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
if (lresult == ERROR_SUCCESS) {
- sprintf(buffer, "\"%s\",1", str);
- lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
+ sprintf(buffer, "\"%s\" \"%%1\"", BlPath);
+ lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, (BYTE*)buffer, strlen(buffer) + 1);
RegCloseKey(hkey);
}
+ if (lresult != ERROR_SUCCESS)
+ RegisterBlendExtension_Fail(root);
- lresult = RegCreateKeyEx(HKEY_CLASSES_ROOT, ".blend", 0,
- "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
+ lresult = RegCreateKeyEx(root, "blendfile\\DefaultIcon", 0,
+ NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
+ if (lresult == ERROR_SUCCESS) {
+ sprintf(buffer, "\"%s\",1", BlPath);
+ lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, (BYTE*)buffer, strlen(buffer) + 1);
+ RegCloseKey(hkey);
+ }
+ if (lresult != ERROR_SUCCESS)
+ RegisterBlendExtension_Fail(root);
+ lresult = RegCreateKeyEx(root, ".blend", 0,
+ NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwd);
if (lresult == ERROR_SUCCESS) {
sprintf(buffer, "%s", "blendfile");
- lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, buffer, strlen(buffer) + 1);
+ lresult = RegSetValueEx(hkey, NULL, 0, REG_SZ, (BYTE*)buffer, strlen(buffer) + 1);
RegCloseKey(hkey);
}
+ if (lresult != ERROR_SUCCESS)
+ RegisterBlendExtension_Fail(root);
+
+ BLI_getInstallationDir(InstallDir);
+ GetSystemDirectory(SysDir,FILE_MAXDIR);
+#ifdef WIN64
+ ThumbHandlerDLL = "BlendThumb64.dll";
+#else
+ IsWow64Process(GetCurrentProcess(),&IsWOW64);
+ if (IsWOW64 == TRUE)
+ ThumbHandlerDLL = "BlendThumb64.dll";
+ else
+ ThumbHandlerDLL = "BlendThumb.dll";
+#endif
+ snprintf(RegCmd,MAX_PATH*2,"%s\\regsvr32 /s \"%s\\%s\"",SysDir,InstallDir,ThumbHandlerDLL);
+ system(RegCmd);
+
+ RegCloseKey(root);
+ printf("success (%s)\n",usr_mode ? "user" : "system");
+ if (!G.background)
+ {
+ sprintf(MBox,"File extension registered for %s.",usr_mode ? "the current user. To register for all users, run as an administrator" : "all users");
+ MessageBox(0,MBox,"Blender",MB_OK|MB_ICONINFORMATION);
+ }
+ TerminateProcess(GetCurrentProcess(),0);
}
DIR *opendir (const char *path) {
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index 024bff98c0f..891dc47b4ae 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -30,7 +30,7 @@
#define BLO_READFILE_H
/** \file BLO_readfile.h
- * \ingroup readwrite
+ * \ingroup blenloader
* \brief external readfile function prototypes.
*/
@@ -120,11 +120,13 @@ BLO_blendfiledata_free(
* Open a blendhandle from a file path.
*
* @param file The file path to open.
+ * @param reports Report errors in opening the file (can be NULL).
* @return A handle on success, or NULL on failure.
*/
BlendHandle*
BLO_blendhandle_from_file(
- char *file);
+ char *file,
+ struct ReportList *reports);
/**
* Open a blendhandle from memory.
@@ -146,13 +148,15 @@ BLO_blendhandle_from_memory(
*
* @param bh The blendhandle to access.
* @param ofblocktype The type of names to get.
+ * @param totnames The length of the returned list.
* @return A BLI_linklist of strings. The string links
* should be freed with malloc.
*/
struct LinkNode*
BLO_blendhandle_get_datablock_names(
BlendHandle *bh,
- int ofblocktype);
+ int ofblocktype,
+ int *totnames);
/**
* Gets the previews of all the datablocks in a file
@@ -204,7 +208,19 @@ int BLO_has_bfile_extension(char *str);
int BLO_is_a_library(const char *path, char *dir, char *group);
struct Main* BLO_library_append_begin(const struct bContext *C, BlendHandle** bh, char *dir);
-void BLO_library_append_named_part(const struct bContext *C, struct Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag);
+
+/**
+ * Link/Append a named datablock from an external blend file.
+ *
+ * @param C The context, when NULL instancing object in the scene isnt done.
+ * @param mainl The main database to link from (not the active one).
+ * @param bh The blender file handle.
+ * @param name The name of the datablock (without the 2 char ID prefix)
+ * @param idcode The kind of datablock to link.
+ * @param flag Options for linking, used for instancing.
+ * @return Boolean, 0 when the datablock could not be found.
+ */
+int BLO_library_append_named_part(const struct bContext *C, struct Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag);
void BLO_library_append_end(const struct bContext *C, struct Main *mainl, BlendHandle** bh, int idcode, short flag);
/* deprecated */
diff --git a/source/blender/blenloader/BLO_soundfile.h b/source/blender/blenloader/BLO_soundfile.h
index ae6b4138e03..9db299e0a9f 100644
--- a/source/blender/blenloader/BLO_soundfile.h
+++ b/source/blender/blenloader/BLO_soundfile.h
@@ -30,7 +30,7 @@
#define BLO_SOUNDFILE_H
/** \file BLO_soundfile.h
- * \ingroup readwrite
+ * \ingroup blenloader
*/
#include "DNA_sound_types.h"
diff --git a/source/blender/blenloader/BLO_sys_types.h b/source/blender/blenloader/BLO_sys_types.h
index b230b0e5624..d56723ec1c5 100644
--- a/source/blender/blenloader/BLO_sys_types.h
+++ b/source/blender/blenloader/BLO_sys_types.h
@@ -27,8 +27,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file BLO_sys_types.h
- * \ingroup readwrite
+/** \file blenloader/BLO_sys_types.h
+ * \ingroup blenloader
*
* A platform-independent definition of [u]intXX_t
* Plus the accompanying header include for htonl/ntohl
diff --git a/source/blender/blenloader/BLO_undofile.h b/source/blender/blenloader/BLO_undofile.h
index c7f0f7f0d1f..c4465341d27 100644
--- a/source/blender/blenloader/BLO_undofile.h
+++ b/source/blender/blenloader/BLO_undofile.h
@@ -32,7 +32,7 @@
#define BLO_UNDOFILE_H
/** \file BLO_undofile.h
- * \ingroup readwrite
+ * \ingroup blenloader
*/
typedef struct {
diff --git a/source/blender/blenloader/BLO_writefile.h b/source/blender/blenloader/BLO_writefile.h
index 7fdc136980e..651928aa6a1 100644
--- a/source/blender/blenloader/BLO_writefile.h
+++ b/source/blender/blenloader/BLO_writefile.h
@@ -31,7 +31,7 @@
#define BLO_WRITEFILE_H
/** \file BLO_writefile.h
- * \ingroup readwrite
+ * \ingroup blenloader
* \brief external writefile function prototypes.
*/
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c
index 834d36c924f..ae4ba6629a6 100644
--- a/source/blender/blenloader/intern/readblenentry.c
+++ b/source/blender/blenloader/intern/readblenentry.c
@@ -28,6 +28,11 @@
* .blend file reading entry point
*/
+/** \file blender/blenloader/intern/readblenentry.c
+ * \ingroup blenloader
+ */
+
+
#include <stddef.h>
#include "BLI_storage.h" /* _LARGEFILE_SOURCE */
@@ -70,11 +75,11 @@ void BLO_blendhandle_print_sizes(BlendHandle *, void *);
/* Access routines used by filesel. */
-BlendHandle *BLO_blendhandle_from_file(char *file)
+BlendHandle *BLO_blendhandle_from_file(char *file, ReportList *reports)
{
BlendHandle *bh;
- bh= (BlendHandle*)blo_openblenderfile(file, NULL);
+ bh= (BlendHandle*)blo_openblenderfile(file, reports);
return bh;
}
@@ -118,21 +123,24 @@ void BLO_blendhandle_print_sizes(BlendHandle *bh, void *fp)
fprintf(fp, "]\n");
}
-LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, int ofblocktype)
+LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, int ofblocktype, int *tot_names)
{
FileData *fd= (FileData*) bh;
LinkNode *names= NULL;
BHead *bhead;
+ int tot= 0;
for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
if (bhead->code==ofblocktype) {
char *idname= bhead_id_name(fd, bhead);
-
+
BLI_linklist_prepend(&names, strdup(idname+2));
+ tot++;
} else if (bhead->code==ENDB)
break;
}
-
+
+ *tot_names= tot;
return names;
}
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index dc3e749fbc8..85e98a5f6e6 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -27,6 +27,11 @@
*
*/
+/** \file blender/blenloader/intern/readfile.c
+ * \ingroup blenloader
+ */
+
+
#include "zlib.h"
#include <limits.h>
@@ -231,7 +236,7 @@ typedef struct OldNewMap {
/* local prototypes */
static void *read_struct(FileData *fd, BHead *bh, const char *blockname);
-static void convert_mfaces_to_mpolys(Mesh *mesh);
+static void direct_link_modifiers(FileData *fd, ListBase *lb);
static OldNewMap *oldnewmap_new(void)
{
@@ -497,7 +502,7 @@ static Main *blo_find_main(FileData *fd, ListBase *mainlist, const char *name, c
for (m= mainlist->first; m; m= m->next) {
char *libname= (m->curlib)?m->curlib->filepath:m->name;
- if (BLI_streq(name1, libname)) {
+ if (BLI_path_cmp(name1, libname) == 0) {
if(G.f & G_DEBUG) printf("blo_find_main: found library %s\n", libname);
return m;
}
@@ -947,7 +952,7 @@ FileData *blo_openblenderfile(const char *name, ReportList *reports)
gzfile= gzopen(name, "rb");
if (gzfile == (gzFile)Z_NULL) {
- BKE_reportf(reports, RPT_ERROR, "Unable to open \"%s\": %s.", name, errno ? strerror(errno) : "Unknown erro reading file");
+ BKE_reportf(reports, RPT_ERROR, "Unable to open \"%s\": %s.", name, errno ? strerror(errno) : "Unknown error reading file");
return NULL;
} else {
FileData *fd = filedata_new();
@@ -1197,7 +1202,7 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain)
OldNew *entry= fd->imamap->entries;
Image *ima= oldmain->image.first;
Scene *sce= oldmain->scene.first;
- int i, a;
+ int i;
/* used entries were restored, so we put them to zero */
for (i=0; i<fd->imamap->nentries; i++, entry++) {
@@ -1217,10 +1222,10 @@ void blo_end_image_pointer_map(FileData *fd, Main *oldmain)
ima->gputexture= NULL;
}
}
+ for(i=0; i<IMA_MAX_RENDER_SLOT; i++)
+ ima->renders[i]= newimaadr(fd, ima->renders[i]);
ima->gputexture= newimaadr(fd, ima->gputexture);
- for(a=0; a<IMA_MAX_RENDER_SLOT; a++)
- ima->renders[a]= newimaadr(fd, ima->renders[a]);
}
for(; sce; sce= sce->id.next) {
if(sce->nodetree) {
@@ -1891,7 +1896,7 @@ static void direct_link_nladata_strips(FileData *fd, ListBase *list)
/* strip's F-Modifiers */
link_list(fd, &strip->modifiers);
- direct_link_fcurves(fd, &strip->modifiers);
+ direct_link_modifiers(fd, &strip->modifiers);
}
}
@@ -2780,8 +2785,18 @@ static void direct_link_image(FileData *fd, Image *ima)
ima->anim= NULL;
ima->rr= NULL;
ima->repbind= NULL;
- memset(ima->renders, 0, sizeof(ima->renders));
- ima->last_render_slot= ima->render_slot;
+
+ /* undo system, try to restore render buffers */
+ if(fd->imamap) {
+ int a;
+
+ for(a=0; a<IMA_MAX_RENDER_SLOT; a++)
+ ima->renders[a]= newimaadr(fd, ima->renders[a]);
+ }
+ else {
+ memset(ima->renders, 0, sizeof(ima->renders));
+ ima->last_render_slot= ima->render_slot;
+ }
ima->packedfile = direct_link_packedfile(fd, ima->packedfile);
ima->preview = direct_link_preview_image(fd, ima->preview);
@@ -2868,7 +2883,7 @@ static void direct_link_curve(FileData *fd, Curve *cu)
cu->tb = tb;
cu->tb[0].w = cu->linewidth;
}
- if (cu->wordspace == 0.0) cu->wordspace = 1.0;
+ if (cu->wordspace == 0.0f) cu->wordspace = 1.0f;
}
cu->bev.first=cu->bev.last= NULL;
@@ -3327,6 +3342,7 @@ static void direct_link_particlesystems(FileData *fd, ListBase *particles)
}
psys->tree = NULL;
+ psys->bvhtree = NULL;
}
return;
}
@@ -3507,145 +3523,6 @@ static void direct_link_customdata(FileData *fd, CustomData *data, int count)
customData_update_typemap(data);
}
-
-void bmesh_corners_to_loops(Mesh *me, int findex, int loopstart, int numTex, int numCol)
-{
- MTFace *texface;
- MTexPoly *texpoly;
- MCol *mcol;
- MLoopCol *mloopcol;
- MLoopUV *mloopuv;
- MFace *mf;
- int i;
-
- for(i=0; i < numTex; i++){
- texface = CustomData_get_n(&me->fdata, CD_MTFACE, findex, i);
- texpoly = CustomData_get_n(&me->pdata, CD_MTEXPOLY, findex, i);
- mf = me->mface + findex;
-
- texpoly->tpage = texface->tpage;
- texpoly->flag = texface->flag;
- texpoly->transp = texface->transp;
- texpoly->mode = texface->mode;
- texpoly->tile = texface->tile;
- texpoly->unwrap = texface->unwrap;
-
- mloopuv = CustomData_get_n(&me->ldata, CD_MLOOPUV, loopstart, i);
- mloopuv->uv[0] = texface->uv[0][0]; mloopuv->uv[1] = texface->uv[0][1]; mloopuv++;
- mloopuv->uv[0] = texface->uv[1][0]; mloopuv->uv[1] = texface->uv[1][1]; mloopuv++;
- mloopuv->uv[0] = texface->uv[2][0]; mloopuv->uv[1] = texface->uv[2][1]; mloopuv++;
-
- if (mf->v4) {
- mloopuv->uv[0] = texface->uv[3][0]; mloopuv->uv[1] = texface->uv[3][1]; mloopuv++;
- }
- }
-
- for(i=0; i < numCol; i++){
- mf = me->mface + findex;
- mloopcol = CustomData_get_n(&me->ldata, CD_MLOOPCOL, loopstart, i);
- mcol = CustomData_get_n(&me->fdata, CD_MCOL, findex, i);
-
- mloopcol->r = mcol[0].r; mloopcol->g = mcol[0].g; mloopcol->b = mcol[0].b; mloopcol->a = mcol[0].a; mloopcol++;
- mloopcol->r = mcol[1].r; mloopcol->g = mcol[1].g; mloopcol->b = mcol[1].b; mloopcol->a = mcol[1].a; mloopcol++;
- mloopcol->r = mcol[2].r; mloopcol->g = mcol[2].g; mloopcol->b = mcol[2].b; mloopcol->a = mcol[2].a; mloopcol++;
- if (mf->v4) {
- mloopcol->r = mcol[3].r; mloopcol->g = mcol[3].g; mloopcol->b = mcol[3].b; mloopcol->a = mcol[3].a; mloopcol++;
- }
- }
-
- if (CustomData_has_layer(&me->fdata, CD_MDISPS)) {
- MDisps *ld = CustomData_get(&me->ldata, loopstart, CD_MDISPS);
- MDisps *fd = CustomData_get(&me->fdata, findex, CD_MDISPS);
- float (*disps)[3] = fd->disps;
- int i, tot = mf->v4 ? 4 : 3;
- int side, corners;
-
- corners = multires_mdisp_corners(fd);
- side = sqrt(fd->totdisp / corners);
-
- for (i=0; i<tot; i++, disps += side*side, ld++) {
- ld->totdisp = side*side;
-
- if (ld->disps)
- BLI_cellalloc_free(ld->disps);
-
- ld->disps = BLI_cellalloc_malloc(sizeof(float)*3*side*side, "converted loop mdisps");
- memcpy(ld->disps, disps, sizeof(float)*3*side*side);
- }
- }
-}
-
-static void convert_mfaces_to_mpolys(Mesh *mesh)
-{
- MFace *mf;
- MLoop *ml;
- MPoly *mp;
- MEdge *me;
- EdgeHash *eh;
- int numTex, numCol;
- int i, j, totloop;
-
- mesh->totpoly = mesh->totface;
- mesh->mpoly = MEM_callocN(sizeof(MPoly)*mesh->totpoly, "mpoly converted");
- CustomData_add_layer(&mesh->pdata, CD_MPOLY, CD_ASSIGN, mesh->mpoly, mesh->totpoly);
-
- numTex = CustomData_number_of_layers(&mesh->fdata, CD_MTFACE);
- numCol = CustomData_number_of_layers(&mesh->fdata, CD_MCOL);
-
- totloop = 0;
- mf = mesh->mface;
- for (i=0; i<mesh->totface; i++, mf++) {
- totloop += mf->v4 ? 4 : 3;
- }
-
- mesh->totloop = totloop;
- mesh->mloop = MEM_callocN(sizeof(MLoop)*mesh->totloop, "mloop converted");
-
- CustomData_add_layer(&mesh->ldata, CD_MLOOP, CD_ASSIGN, mesh->mloop, totloop);
- CustomData_to_bmeshpoly(&mesh->fdata, &mesh->pdata, &mesh->ldata,
- mesh->totloop, mesh->totpoly);
-
- eh = BLI_edgehash_new();
-
- /*build edge hash*/
- me = mesh->medge;
- for (i=0; i<mesh->totedge; i++, me++) {
- BLI_edgehash_insert(eh, me->v1, me->v2, SET_INT_IN_POINTER(i));
- }
-
- j = 0; /*current loop index*/
- ml = mesh->mloop;
- mf = mesh->mface;
- mp = mesh->mpoly;
- for (i=0; i<mesh->totface; i++, mf++, mp++) {
- mp->loopstart = j;
-
- mp->totloop = mf->v4 ? 4 : 3;
-
- mp->mat_nr = mf->mat_nr;
- mp->flag = mf->flag;
-
- #define ML(v1, v2) {ml->v = mf->v1; ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, mf->v1, mf->v2)); ml++; j++;}
-
- ML(v1, v2);
- ML(v2, v3);
- if (mf->v4) {
- ML(v3, v4);
- ML(v4, v1);
- } else {
- ML(v3, v1);
- }
-
- #undef ML
-
- bmesh_corners_to_loops(mesh, i, mp->loopstart, numTex, numCol);
- }
-
- /*BMESH_TODO now to deal with fgons*/
-
- BLI_edgehash_free(eh, NULL);
-}
-
static void direct_link_mesh(FileData *fd, Mesh *mesh)
{
mesh->mat= newdataadr(fd, mesh->mat);
@@ -4230,7 +4107,7 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
collmd->current_x = NULL;
collmd->current_xnew = NULL;
collmd->current_v = NULL;
- collmd->time = -1000;
+ collmd->time_x = collmd->time_xnew = -1000;
collmd->numverts = 0;
collmd->bvhtree = NULL;
collmd->mfaces = NULL;
@@ -4515,7 +4392,6 @@ static void direct_link_object(FileData *fd, Object *ob)
if(ob->sculpt) {
ob->sculpt= MEM_callocN(sizeof(SculptSession), "reload sculpt session");
- ob->sculpt->ob= ob;
}
}
@@ -4665,6 +4541,8 @@ static void direct_link_scene(FileData *fd, Scene *sce)
sce->obedit= NULL;
sce->stats= NULL;
sce->fps_info= NULL;
+ sce->customdata_mask_modal= 0;
+ sce->lay_updated = 0;
sound_create_scene(sce);
@@ -5107,6 +4985,8 @@ static void lib_link_screen(FileData *fd, Main *main)
else if(GS(snode->id->name)==ID_TE)
snode->nodetree= ((Tex *)snode->id)->nodetree;
}
+
+ snode->linkdrag.first = snode->linkdrag.last = NULL;
}
}
sa= sa->next;
@@ -5362,7 +5242,6 @@ static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)
rv3d->clipbb= newdataadr(fd, rv3d->clipbb);
rv3d->depths= NULL;
- rv3d->retopo_view_data= NULL;
rv3d->ri= NULL;
rv3d->sms= NULL;
rv3d->smooth_timer= NULL;
@@ -5547,10 +5426,12 @@ static void direct_link_screen(FileData *fd, bScreen *sc)
/* WARNING: gpencil data is no longer stored directly in sima after 2.5
* so sacrifice a few old files for now to avoid crashes with new files!
- */
- //sima->gpd= newdataadr(fd, sima->gpd);
- //if (sima->gpd)
- // direct_link_gpencil(fd, sima->gpd);
+ * committed: r28002 */
+#if 0
+ sima->gpd= newdataadr(fd, sima->gpd);
+ if (sima->gpd)
+ direct_link_gpencil(fd, sima->gpd);
+#endif
}
else if(sl->spacetype==SPACE_NODE) {
SpaceNode *snode= (SpaceNode *)sl;
@@ -5642,7 +5523,7 @@ static void direct_link_library(FileData *fd, Library *lib, Main *main)
for(newmain= fd->mainlist.first; newmain; newmain= newmain->next) {
if(newmain->curlib) {
- if(strcmp(newmain->curlib->filepath, lib->filepath)==0) {
+ if(BLI_path_cmp(newmain->curlib->filepath, lib->filepath) == 0) {
printf("Fixed error in file; multiple instances of lib:\n %s\n", lib->filepath);
BKE_reportf(fd->reports, RPT_WARNING, "Library '%s', '%s' had multiple instances, save and reload!", lib->name, lib->filepath);
@@ -6017,8 +5898,8 @@ static BHead *read_global(BlendFileData *bfd, FileData *fd, BHead *bhead)
static void link_global(FileData *fd, BlendFileData *bfd)
{
- bfd->curscreen= newlibadr(fd, 0, bfd->curscreen);
- bfd->curscene= newlibadr(fd, 0, bfd->curscene);
+ bfd->curscreen= newlibadr(fd, NULL, bfd->curscreen);
+ bfd->curscene= newlibadr(fd, NULL, bfd->curscene);
// this happens in files older than 2.35
if(bfd->curscene==NULL) {
if(bfd->curscreen) bfd->curscene= bfd->curscreen->scene;
@@ -6031,7 +5912,7 @@ static void vcol_to_fcol(Mesh *me)
unsigned int *mcol, *mcoln, *mcolmain;
int a;
- if(me->totface==0 || me->mcol==0) return;
+ if(me->totface==0 || me->mcol==NULL) return;
mcoln= mcolmain= MEM_mallocN(4*sizeof(int)*me->totface, "mcoln");
mcol = (unsigned int *)me->mcol;
@@ -6842,10 +6723,14 @@ static void do_versions_gpencil_2_50(Main *main, bScreen *screen)
}
else if (sl->spacetype==SPACE_IMAGE) {
SpaceImage *sima= (SpaceImage *)sl;
+#if 0 /* see comment on r28002 */
if(sima->gpd) {
versions_gpencil_add_main(&main->gpencil, (ID *)sima->gpd, "GPencil Image");
sima->gpd= NULL;
}
+#else
+ sima->gpd= NULL;
+#endif
}
}
}
@@ -7008,7 +6893,7 @@ static void do_version_bone_roll_256(Bone *bone)
float submat[3][3];
copy_m3_m4(submat, bone->arm_mat);
- mat3_to_vec_roll(submat, 0, &bone->arm_roll);
+ mat3_to_vec_roll(submat, NULL, &bone->arm_roll);
for(child = bone->childbase.first; child; child = child->next)
do_version_bone_roll_256(child);
@@ -7134,19 +7019,12 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
sc= sc->id.next;
}
}
- if(main->versionfile <= 112) {
- Mesh *me = main->mesh.first;
- while(me) {
- me->cubemapsize= 1.0;
- me= me->id.next;
- }
- }
if(main->versionfile <= 113) {
Material *ma = main->mat.first;
while(ma) {
- if(ma->flaresize==0.0) ma->flaresize= 1.0;
- ma->subsize= 1.0;
- ma->flareboost= 1.0;
+ if(ma->flaresize==0.0f) ma->flaresize= 1.0f;
+ ma->subsize= 1.0f;
+ ma->flareboost= 1.0f;
ma= ma->id.next;
}
}
@@ -7154,13 +7032,13 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(main->versionfile <= 134) {
Tex *tex = main->tex.first;
while (tex) {
- if ((tex->rfac == 0.0) &&
- (tex->gfac == 0.0) &&
- (tex->bfac == 0.0)) {
- tex->rfac = 1.0;
- tex->gfac = 1.0;
- tex->bfac = 1.0;
- tex->filtersize = 1.0;
+ if ((tex->rfac == 0.0f) &&
+ (tex->gfac == 0.0f) &&
+ (tex->bfac == 0.0f)) {
+ tex->rfac = 1.0f;
+ tex->gfac = 1.0f;
+ tex->bfac = 1.0f;
+ tex->filtersize = 1.0f;
}
tex = tex->id.next;
}
@@ -7169,13 +7047,13 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* r-g-b-fac in texture */
Tex *tex = main->tex.first;
while (tex) {
- if ((tex->rfac == 0.0) &&
- (tex->gfac == 0.0) &&
- (tex->bfac == 0.0)) {
- tex->rfac = 1.0;
- tex->gfac = 1.0;
- tex->bfac = 1.0;
- tex->filtersize = 1.0;
+ if ((tex->rfac == 0.0f) &&
+ (tex->gfac == 0.0f) &&
+ (tex->bfac == 0.0f)) {
+ tex->rfac = 1.0f;
+ tex->gfac = 1.0f;
+ tex->bfac = 1.0f;
+ tex->filtersize = 1.0f;
}
tex = tex->id.next;
}
@@ -7183,7 +7061,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(main->versionfile <= 153) {
Scene *sce = main->scene.first;
while(sce) {
- if(sce->r.blurfac==0.0) sce->r.blurfac= 1.0;
+ if(sce->r.blurfac==0.0f) sce->r.blurfac= 1.0f;
sce= sce->id.next;
}
}
@@ -7304,8 +7182,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
TFace *tface= me->tface;
for(a=0; a<me->totface; a++, tface++) {
for(b=0; b<4; b++) {
- tface->uv[b][0]/= 32767.0;
- tface->uv[b][1]/= 32767.0;
+ tface->uv[b][0]/= 32767.0f;
+ tface->uv[b][1]/= 32767.0f;
}
}
}
@@ -7442,13 +7320,13 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(act->type==ACT_OBJECT) {
oa= act->data;
- oa->forceloc[0]*= 25.0;
- oa->forceloc[1]*= 25.0;
- oa->forceloc[2]*= 25.0;
+ oa->forceloc[0]*= 25.0f;
+ oa->forceloc[1]*= 25.0f;
+ oa->forceloc[2]*= 25.0f;
- oa->forcerot[0]*= 10.0;
- oa->forcerot[1]*= 10.0;
- oa->forcerot[2]*= 10.0;
+ oa->forcerot[0]*= 10.0f;
+ oa->forcerot[1]*= 10.0f;
+ oa->forcerot[2]*= 10.0f;
}
act= act->next;
}
@@ -7457,8 +7335,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
sound = main->sound.first;
while (sound) {
- if (sound->volume < 0.01) {
- sound->volume = 1.0;
+ if (sound->volume < 0.01f) {
+ sound->volume = 1.0f;
}
sound = sound->id.next;
}
@@ -7554,18 +7432,18 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if (act->type==ACT_OBJECT) {
/* multiply velocity with 50 in old files */
oa= act->data;
- if (fabs(oa->linearvelocity[0]) >= 0.01f)
- oa->linearvelocity[0] *= 50.0;
- if (fabs(oa->linearvelocity[1]) >= 0.01f)
- oa->linearvelocity[1] *= 50.0;
- if (fabs(oa->linearvelocity[2]) >= 0.01f)
- oa->linearvelocity[2] *= 50.0;
- if (fabs(oa->angularvelocity[0])>=0.01f)
- oa->angularvelocity[0] *= 50.0;
- if (fabs(oa->angularvelocity[1])>=0.01f)
- oa->angularvelocity[1] *= 50.0;
- if (fabs(oa->angularvelocity[2])>=0.01f)
- oa->angularvelocity[2] *= 50.0;
+ if (fabsf(oa->linearvelocity[0]) >= 0.01f)
+ oa->linearvelocity[0] *= 50.0f;
+ if (fabsf(oa->linearvelocity[1]) >= 0.01f)
+ oa->linearvelocity[1] *= 50.0f;
+ if (fabsf(oa->linearvelocity[2]) >= 0.01f)
+ oa->linearvelocity[2] *= 50.0f;
+ if (fabsf(oa->angularvelocity[0])>=0.01f)
+ oa->angularvelocity[0] *= 50.0f;
+ if (fabsf(oa->angularvelocity[1])>=0.01f)
+ oa->angularvelocity[1] *= 50.0f;
+ if (fabsf(oa->angularvelocity[2])>=0.01f)
+ oa->angularvelocity[2] *= 50.0f;
}
act= act->next;
}
@@ -7587,7 +7465,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
sound->min_gain = 0.0;
sound->distance = 1.0;
- if (sound->attenuation > 0.0)
+ if (sound->attenuation > 0.0f)
sound->flags |= SOUND_FLAGS_3D;
else
sound->flags &= ~SOUND_FLAGS_3D;
@@ -7645,7 +7523,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
ob->formfactor = 0.4f;
/* patch form factor , note that inertia equiv radius
* of a rotation symmetrical obj */
- if (ob->inertia != 1.0) {
+ if (ob->inertia != 1.0f) {
ob->formfactor /= ob->inertia * ob->inertia;
}
ob = ob->id.next;
@@ -8007,7 +7885,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
SpaceLink *sl;
for (sl= sa->spacedata.first; sl; sl= sl->next) {
- if(sl->blockscale==0.0) sl->blockscale= 0.7f;
+ if(sl->blockscale==0.0f) sl->blockscale= 0.7f;
/* added: 5x better zoom in for action */
if(sl->spacetype==SPACE_ACTION) {
SpaceAction *sac= (SpaceAction *)sl;
@@ -8051,8 +7929,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* introduction of raytrace */
while(ma) {
- if(ma->fresnel_tra_i==0.0) ma->fresnel_tra_i= 1.25;
- if(ma->fresnel_mir_i==0.0) ma->fresnel_mir_i= 1.25;
+ if(ma->fresnel_tra_i==0.0f) ma->fresnel_tra_i= 1.25f;
+ if(ma->fresnel_mir_i==0.0f) ma->fresnel_mir_i= 1.25f;
ma->ang= 1.0;
ma->ray_depth= 2;
@@ -8064,23 +7942,23 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
sce= main->scene.first;
while(sce) {
- if(sce->r.gauss==0.0) sce->r.gauss= 1.0;
+ if(sce->r.gauss==0.0f) sce->r.gauss= 1.0f;
sce= sce->id.next;
}
la= main->lamp.first;
while(la) {
- if(la->k==0.0) la->k= 1.0;
+ if(la->k==0.0f) la->k= 1.0;
if(la->ray_samp==0) la->ray_samp= 1;
if(la->ray_sampy==0) la->ray_sampy= 1;
if(la->ray_sampz==0) la->ray_sampz= 1;
- if(la->area_size==0.0) la->area_size= 1.0;
- if(la->area_sizey==0.0) la->area_sizey= 1.0;
- if(la->area_sizez==0.0) la->area_sizez= 1.0;
+ if(la->area_size==0.0f) la->area_size= 1.0f;
+ if(la->area_sizey==0.0f) la->area_sizey= 1.0f;
+ if(la->area_sizez==0.0f) la->area_sizez= 1.0f;
la= la->id.next;
}
wrld= main->world.first;
while(wrld) {
- if(wrld->range==0.0) {
+ if(wrld->range==0.0f) {
wrld->range= 1.0f/wrld->exposure;
}
wrld= wrld->id.next;
@@ -8121,7 +7999,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
tex->flag |= TEX_CHECKER_ODD;
}
/* copied from kernel texture.c */
- if(tex->ns_outscale==0.0) {
+ if(tex->ns_outscale==0.0f) {
/* musgrave */
tex->mg_H = 1.0f;
tex->mg_lacunarity = 2.0f;
@@ -8139,12 +8017,12 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
while(wrld) {
- if(wrld->aodist==0.0) {
+ if(wrld->aodist==0.0f) {
wrld->aodist= 10.0f;
wrld->aobias= 0.05f;
}
- if(wrld->aosamp==0.0) wrld->aosamp= 5;
- if(wrld->aoenergy==0.0) wrld->aoenergy= 1.0;
+ if(wrld->aosamp==0) wrld->aosamp= 5;
+ if(wrld->aoenergy==0.0f) wrld->aoenergy= 1.0f;
wrld= wrld->id.next;
}
@@ -8156,7 +8034,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for (sa= sc->areabase.first; sa; sa= sa->next) {
SpaceLink *sl;
for (sl= sa->spacedata.first; sl; sl= sl->next) {
- if(sl->blockscale==0.0) sl->blockscale= 0.7f;
+ if(sl->blockscale==0.0f) sl->blockscale= 0.7f;
/* added: 5x better zoom in for nla */
if(sl->spacetype==SPACE_NLA) {
@@ -8179,8 +8057,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
Object *ob= main->object.first;
while(ma) {
- if(ma->rampfac_col==0.0) ma->rampfac_col= 1.0;
- if(ma->rampfac_spec==0.0) ma->rampfac_spec= 1.0;
+ if(ma->rampfac_col==0.0f) ma->rampfac_col= 1.0;
+ if(ma->rampfac_spec==0.0f) ma->rampfac_spec= 1.0;
if(ma->pr_lamp==0) ma->pr_lamp= 3;
ma= ma->id.next;
}
@@ -8241,7 +8119,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
Editing *ed;
while(tex) {
- if(tex->nabla==0.0) tex->nabla= 0.025f;
+ if(tex->nabla==0.0f) tex->nabla= 0.025f;
tex= tex->id.next;
}
while(sce) {
@@ -8264,7 +8142,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
bScreen *sc;
while(cam) {
- if(cam->ortho_scale==0.0) {
+ if(cam->ortho_scale==0.0f) {
cam->ortho_scale= 256.0f/cam->lens;
if(cam->type==CAM_ORTHO) printf("NOTE: ortho render has changed, tweak new Camera 'scale' value.\n");
}
@@ -8292,7 +8170,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
// init new shader vars
for (ma= main->mat.first; ma; ma= ma->id.next) {
- if(ma->darkness==0.0) {
+ if(ma->darkness==0.0f) {
ma->rms=0.1f;
ma->darkness=1.0f;
}
@@ -8301,8 +8179,8 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
/* softbody init new vars */
for(ob= main->object.first; ob; ob= ob->id.next) {
if(ob->soft) {
- if(ob->soft->defgoal==0.0) ob->soft->defgoal= 0.7f;
- if(ob->soft->physics_speed==0.0) ob->soft->physics_speed= 1.0f;
+ if(ob->soft->defgoal==0.0f) ob->soft->defgoal= 0.7f;
+ if(ob->soft->physics_speed==0.0f) ob->soft->physics_speed= 1.0f;
if(ob->soft->interval==0) {
ob->soft->interval= 2;
@@ -8414,7 +8292,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
for (lt=main->latt.first; lt; lt=lt->id.next) {
- if (lt->fu==0.0 && lt->fv==0.0 && lt->fw==0.0) {
+ if (lt->fu==0.0f && lt->fv==0.0f && lt->fw==0.0f) {
calc_lat_fudu(lt->flag, lt->pntsu, &lt->fu, &lt->du);
calc_lat_fudu(lt->flag, lt->pntsv, &lt->fv, &lt->dv);
calc_lat_fudu(lt->flag, lt->pntsw, &lt->fw, &lt->dw);
@@ -8636,7 +8514,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
ntree_version_241(sce->nodetree);
/* uv calculation options moved to toolsettings */
- if (sce->toolsettings->uvcalc_radius == 0.0) {
+ if (sce->toolsettings->uvcalc_radius == 0.0f) {
sce->toolsettings->uvcalc_radius = 1.0f;
sce->toolsettings->uvcalc_cubesize = 1.0f;
sce->toolsettings->uvcalc_mapdir = 1;
@@ -8692,7 +8570,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
/* transmissivity defaults */
- if(ma->tx_falloff==0.0) ma->tx_falloff= 1.0;
+ if(ma->tx_falloff==0.0f) ma->tx_falloff= 1.0f;
}
/* during 2.41 images with this name were used for viewer node output, lets fix that */
@@ -9219,7 +9097,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
strcpy (simasel->dir, U.textudir); /* TON */
strcpy (simasel->file, "");
- simasel->returnfunc = 0;
+ simasel->returnfunc = NULL;
simasel->title[0] = 0;
}
}
@@ -9509,7 +9387,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 8)) {
Scene *sce;
Object *ob;
- PartEff *paf=0;
+ PartEff *paf=NULL;
for(ob = main->object.first; ob; ob= ob->id.next) {
if(ob->soft && ob->soft->keys) {
@@ -9795,7 +9673,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
fluidmd->fss->lastgoodframe = INT_MAX;
fluidmd->fss->flag = 0;
- fluidmd->fss->meshSurfNormals = 0;
+ fluidmd->fss->meshSurfNormals = NULL;
}
}
}
@@ -9913,7 +9791,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
Lamp *la;
for(la=main->lamp.first; la; la= la->id.next) {
- if(la->atm_turbidity == 0.0) {
+ if(la->atm_turbidity == 0.0f) {
la->sun_effect_type = 0;
la->horizon_brightness = 1.0f;
la->spread = 1.0f;
@@ -10385,7 +10263,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for(sce = main->scene.first; sce; sce = sce->id.next) {
ts= sce->toolsettings;
- if(ts->normalsize == 0.0 || !ts->uv_selectmode || ts->vgroup_weight == 0.0) {
+ if(ts->normalsize == 0.0f || !ts->uv_selectmode || ts->vgroup_weight == 0.0f) {
ts->normalsize= 0.1f;
ts->selectmode= SCE_SELECT_VERTEX;
@@ -11642,7 +11520,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
KeyBlock *kb;
for (kb = key->block.first; kb; kb = kb->next) {
- if (IS_EQ(kb->slidermin, kb->slidermax) && IS_EQ(kb->slidermax, 0))
+ if (IS_EQF(kb->slidermin, kb->slidermax) && IS_EQ(kb->slidermax, 0))
kb->slidermax = kb->slidermin + 1.0f;
}
}
@@ -11685,12 +11563,31 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
- /* put compatibility code here until next subversion bump */
-
- {
+ if (main->versionfile < 256 || (main->versionfile == 256 && main->subversionfile <3)){
bScreen *sc;
Brush *brush;
+ Object *ob;
+ ParticleSettings *part;
+ Material *mat;
+ int tex_nr, transp_tex;
+ for(mat = main->mat.first; mat; mat = mat->id.next){
+ if(!(mat->mode & MA_TRANSP) && !(mat->material_type & MA_TYPE_VOLUME)){
+
+ transp_tex= 0;
+
+ for(tex_nr=0; tex_nr<MAX_MTEX; tex_nr++){
+ if(!mat->mtex[tex_nr]) continue;
+ if(mat->mtex[tex_nr]->mapto & MAP_ALPHA) transp_tex= 1;
+ }
+
+ if(mat->alpha < 1.0f || mat->fresnel_tra > 0.0f || transp_tex){
+ mat->mode |= MA_TRANSP;
+ mat->mode &= ~(MA_ZTRANSP|MA_RAYTRANSP);
+ }
+ }
+ }
+
/* redraws flag in SpaceTime has been moved to Screen level */
for (sc = main->screen.first; sc; sc= sc->id.next) {
if (sc->redraws_flag == 0) {
@@ -11702,8 +11599,55 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
for (brush= main->brush.first; brush; brush= brush->id.next) {
if(brush->height == 0)
- brush->height= 0.4;
+ brush->height= 0.4f;
}
+
+ /* replace 'rim material' option for in offset*/
+ for(ob = main->object.first; ob; ob = ob->id.next) {
+ ModifierData *md;
+ for(md= ob->modifiers.first; md; md= md->next) {
+ if (md->type == eModifierType_Solidify) {
+ SolidifyModifierData *smd = (SolidifyModifierData *)md;
+ if(smd->flag & MOD_SOLIDIFY_RIM_MATERIAL) {
+ smd->mat_ofs_rim= 1;
+ smd->flag &= ~MOD_SOLIDIFY_RIM_MATERIAL;
+ }
+ }
+ }
+ }
+
+ /* particle draw color from material */
+ for(part = main->particle.first; part; part = part->id.next) {
+ if(part->draw & PART_DRAW_MAT_COL)
+ part->draw_col = PART_DRAW_COL_MAT;
+ }
+ }
+
+ if (main->versionfile < 256 || (main->versionfile == 256 && main->subversionfile < 6)){
+ Mesh *me;
+
+ for(me= main->mesh.first; me; me= me->id.next)
+ mesh_calc_tessface_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+ }
+
+ if (main->versionfile < 256 || (main->versionfile == 256 && main->subversionfile < 2)){
+ /* update blur area sizes from 0..1 range to 0..100 percentage */
+ Scene *scene;
+ bNode *node;
+ for (scene=main->scene.first; scene; scene=scene->id.next)
+ if (scene->nodetree)
+ for (node=scene->nodetree->nodes.first; node; node=node->next)
+ if (node->type==CMP_NODE_BLUR) {
+ NodeBlurData *nbd= node->storage;
+ nbd->percentx *= 100.0f;
+ nbd->percenty *= 100.0f;
+ }
+ }
+
+ /* put compatibility code here until next subversion bump */
+
+ {
+
}
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
@@ -12159,6 +12103,8 @@ static void expand_animdata(FileData *fd, Main *mainvar, AnimData *adt)
static void expand_particlesettings(FileData *fd, Main *mainvar, ParticleSettings *part)
{
+ int a;
+
expand_doit(fd, mainvar, part->dup_ob);
expand_doit(fd, mainvar, part->dup_group);
expand_doit(fd, mainvar, part->eff_group);
@@ -12166,6 +12112,13 @@ static void expand_particlesettings(FileData *fd, Main *mainvar, ParticleSetting
if(part->adt)
expand_animdata(fd, mainvar, part->adt);
+
+ for(a=0; a<MAX_MTEX; a++) {
+ if(part->mtex[a]) {
+ expand_doit(fd, mainvar, part->mtex[a]->tex);
+ expand_doit(fd, mainvar, part->mtex[a]->object);
+ }
+ }
}
static void expand_group(FileData *fd, Main *mainvar, Group *group)
@@ -12419,50 +12372,19 @@ static void expand_armature(FileData *fd, Main *mainvar, bArmature *arm)
}
}
-static void expand_modifier(FileData *fd, Main *mainvar, ModifierData *md)
+static void expand_object_expandModifiers(void *userData, Object *UNUSED(ob),
+ ID **idpoin)
{
- if (md->type==eModifierType_Lattice) {
- LatticeModifierData *lmd = (LatticeModifierData*) md;
-
- expand_doit(fd, mainvar, lmd->object);
- }
- else if (md->type==eModifierType_Curve) {
- CurveModifierData *cmd = (CurveModifierData*) md;
-
- expand_doit(fd, mainvar, cmd->object);
- }
- else if (md->type==eModifierType_Array) {
- ArrayModifierData *amd = (ArrayModifierData*) md;
-
- expand_doit(fd, mainvar, amd->curve_ob);
- expand_doit(fd, mainvar, amd->offset_ob);
- }
- else if (md->type==eModifierType_Mirror) {
- MirrorModifierData *mmd = (MirrorModifierData*) md;
-
- expand_doit(fd, mainvar, mmd->mirror_ob);
- }
- else if (md->type==eModifierType_Displace) {
- DisplaceModifierData *dmd = (DisplaceModifierData*) md;
-
- expand_doit(fd, mainvar, dmd->map_object);
- expand_doit(fd, mainvar, dmd->texture);
- }
- else if (md->type==eModifierType_Smoke) {
- SmokeModifierData *smd = (SmokeModifierData*) md;
-
- if(smd->type==MOD_SMOKE_TYPE_DOMAIN && smd->domain)
- {
- expand_doit(fd, mainvar, smd->domain->coll_group);
- expand_doit(fd, mainvar, smd->domain->fluid_group);
- expand_doit(fd, mainvar, smd->domain->eff_group);
- }
- }
+ struct { FileData *fd; Main *mainvar; } *data= userData;
+
+ FileData *fd= data->fd;
+ Main *mainvar= data->mainvar;
+
+ expand_doit(fd, mainvar, *idpoin);
}
static void expand_object(FileData *fd, Main *mainvar, Object *ob)
{
- ModifierData *md;
ParticleSystem *psys;
bSensor *sens;
bController *cont;
@@ -12472,9 +12394,14 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob)
int a;
expand_doit(fd, mainvar, ob->data);
-
- for (md=ob->modifiers.first; md; md=md->next) {
- expand_modifier(fd, mainvar, md);
+
+ /* expand_object_expandModifier() */
+ if(ob->modifiers.first) {
+ struct { FileData *fd; Main *mainvar; } data;
+ data.fd= fd;
+ data.mainvar= mainvar;
+
+ modifiers_foreachIDLink(ob, expand_object_expandModifiers, (void *)&data);
}
expand_pose(fd, mainvar, ob->pose);
@@ -12682,7 +12609,7 @@ static void expand_main(FileData *fd, Main *mainvar)
ID *id;
int a, doit= 1;
- if(fd==0) return;
+ if(fd==NULL) return;
while(doit) {
doit= 0;
@@ -12850,7 +12777,9 @@ static void give_base_to_groups(Main *mainvar, Scene *scene)
}
}
-static void append_named_part(const bContext *C, Main *mainl, FileData *fd, const char *name, int idcode, short flag)
+/* returns true if the item was found
+ * but it may already have already been appended/linked */
+static int append_named_part(const bContext *C, Main *mainl, FileData *fd, const char *name, int idcode, short flag)
{
Scene *scene= CTX_data_scene(C);
Object *ob;
@@ -12858,6 +12787,7 @@ static void append_named_part(const bContext *C, Main *mainl, FileData *fd, cons
BHead *bhead;
ID *id;
int endloop=0;
+ int found=0;
bhead = blo_firstbhead(fd);
while(bhead && endloop==0) {
@@ -12867,7 +12797,7 @@ static void append_named_part(const bContext *C, Main *mainl, FileData *fd, cons
char *idname= bhead_id_name(fd, bhead);
if(strcmp(idname+2, name)==0) {
-
+ found= 1;
id= is_yet_read(fd, mainl, bhead);
if(id==NULL) {
read_libblock(fd, mainl, bhead, LIB_TESTEXT, NULL);
@@ -12914,12 +12844,14 @@ static void append_named_part(const bContext *C, Main *mainl, FileData *fd, cons
bhead = blo_nextbhead(fd, bhead);
}
+
+ return found;
}
-void BLO_library_append_named_part(const bContext *C, Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag)
+int BLO_library_append_named_part(const bContext *C, Main *mainl, BlendHandle** bh, const char *name, int idcode, short flag)
{
FileData *fd= (FileData*)(*bh);
- append_named_part(C, mainl, fd, name, idcode, flag);
+ return append_named_part(C, mainl, fd, name, idcode, flag);
}
static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r)
diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h
index c6526f2c7af..b409e456fe6 100644
--- a/source/blender/blenloader/intern/readfile.h
+++ b/source/blender/blenloader/intern/readfile.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
* blenloader readfile private function prototypes
*/
+
+/** \file blender/blenloader/intern/readfile.h
+ * \ingroup blenloader
+ */
+
#ifndef READFILE_H
#define READFILE_H
diff --git a/source/blender/blenloader/intern/undofile.c b/source/blender/blenloader/intern/undofile.c
index 7306db08430..80c4127b214 100644
--- a/source/blender/blenloader/intern/undofile.c
+++ b/source/blender/blenloader/intern/undofile.c
@@ -28,6 +28,11 @@
* .blend file reading entry point
*/
+/** \file blender/blenloader/intern/undofile.c
+ * \ingroup blenloader
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 2f8feb9b9da..bc91a5604c8 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/blenloader/intern/writefile.c
+ * \ingroup blenloader
+ */
+
+
/*
FILEFORMAT: IFF-style structure (but not IFF compatible!)
@@ -463,7 +468,7 @@ static void write_fmodifiers(WriteData *wd, ListBase *fmodifiers)
/* write envelope data */
if (data->data)
- writedata(wd, DATA, sizeof(FCM_EnvelopeData)*(data->totvert), data->data);
+ writestruct(wd, DATA, "FCM_EnvelopeData", data->totvert, data->data);
}
break;
case FMODIFIER_TYPE_PYTHON:
@@ -2544,7 +2549,7 @@ int BLO_write_file(Main *mainvar, char *dir, int write_flags, ReportList *report
}
BLI_make_file_string(G.main->name, userfilename, BLI_get_folder_create(BLENDER_USER_CONFIG, NULL), BLENDER_STARTUP_FILE);
- write_user_block= BLI_streq(dir, userfilename);
+ write_user_block= (BLI_path_cmp(dir, userfilename) == 0);
if(write_flags & G_FILE_RELATIVE_REMAP)
makeFilesRelative(mainvar, dir, NULL); /* note, making relative to something OTHER then G.main->name */
diff --git a/source/blender/blenpluginapi/documentation.h b/source/blender/blenpluginapi/documentation.h
index 3bf43a6bc9b..136306e9088 100644
--- a/source/blender/blenpluginapi/documentation.h
+++ b/source/blender/blenpluginapi/documentation.h
@@ -67,3 +67,8 @@
* define some useful variables.
* */
+/** \file blender/blenpluginapi/documentation.h
+ * \ingroup blpluginapi
+ */
+
+
diff --git a/source/blender/blenpluginapi/externdef.h b/source/blender/blenpluginapi/externdef.h
index 14a3115ce33..28239d117cd 100644
--- a/source/blender/blenpluginapi/externdef.h
+++ b/source/blender/blenpluginapi/externdef.h
@@ -1,3 +1,6 @@
+/** \file blender/blenpluginapi/externdef.h
+ * \ingroup blpluginapi
+ */
/* Copyright (c) 1999, Not a Number / NeoGeo b.v.
*
* All rights reserved.
diff --git a/source/blender/blenpluginapi/floatpatch.h b/source/blender/blenpluginapi/floatpatch.h
index 8e6fab8a363..22e956ab8f8 100644
--- a/source/blender/blenpluginapi/floatpatch.h
+++ b/source/blender/blenpluginapi/floatpatch.h
@@ -1,3 +1,6 @@
+/** \file blender/blenpluginapi/floatpatch.h
+ * \ingroup blpluginapi
+ */
/* Copyright (c) 1999, Not a Number / NeoGeo b.v.
* $Id$
*
diff --git a/source/blender/blenpluginapi/iff.h b/source/blender/blenpluginapi/iff.h
index 668d14508ec..bccc7bdb769 100644
--- a/source/blender/blenpluginapi/iff.h
+++ b/source/blender/blenpluginapi/iff.h
@@ -1,3 +1,6 @@
+/** \file blender/blenpluginapi/iff.h
+ * \ingroup blpluginapi
+ */
/* Copyright (c) 1999, Not a Number / NeoGeo b.v.
* $Id$
*
diff --git a/source/blender/blenpluginapi/intern/pluginapi.c b/source/blender/blenpluginapi/intern/pluginapi.c
index ab21e5a96fc..6e1ab447659 100644
--- a/source/blender/blenpluginapi/intern/pluginapi.c
+++ b/source/blender/blenpluginapi/intern/pluginapi.c
@@ -28,6 +28,11 @@
* Wrappers for the plugin api. This api is up for removal.
*/
+/** \file blender/blenpluginapi/intern/pluginapi.c
+ * \ingroup blenpluginapi
+ */
+
+
/* There are four headers making up the plugin api:
* - floatpatch.h : Wraps math functions for mips platforms, no code
* required.
diff --git a/source/blender/blenpluginapi/plugin.h b/source/blender/blenpluginapi/plugin.h
index da044cf7317..174fd54462a 100644
--- a/source/blender/blenpluginapi/plugin.h
+++ b/source/blender/blenpluginapi/plugin.h
@@ -1,3 +1,6 @@
+/** \file blender/blenpluginapi/plugin.h
+ * \ingroup blpluginapi
+ */
/* Copyright (c) 1999, Not a Number / NeoGeo b.v.
* $Id$
*
diff --git a/source/blender/blenpluginapi/util.h b/source/blender/blenpluginapi/util.h
index b0b5f3aae54..9c6d4e8a4e5 100644
--- a/source/blender/blenpluginapi/util.h
+++ b/source/blender/blenpluginapi/util.h
@@ -1,3 +1,6 @@
+/** \file blender/blenpluginapi/util.h
+ * \ingroup blpluginapi
+ */
/* Copyright (c) 1999, Not a Number / NeoGeo b.v.
* $Id$
*
diff --git a/source/blender/bmesh/operators/bevel.c b/source/blender/bmesh/operators/bevel.c
index a48faa1e9f3..d74ffc7ea8b 100644
--- a/source/blender/bmesh/operators/bevel.c
+++ b/source/blender/bmesh/operators/bevel.c
@@ -32,41 +32,6 @@ typedef struct EdgeTag {
BMVert *newv1, *newv2;
} EdgeTag;
-
-/* "Projects" a vector perpendicular to vec2 against vec1, such that
- * the projected vec1 + vec2 has a min distance of 1 from the "edge" defined by vec2.
- * note: the direction, is_forward, is used in conjunction with up_vec to determine
- * whether this is a convex or concave corner. If it is a concave corner, it will
- * be projected "backwards." If vec1 is before vec2, is_forward should be 0 (we are projecting backwards).
- * vec1 is the vector to project onto (expected to be normalized)
- * vec2 is the direction of projection (pointing away from vec1)
- * up_vec is used for orientation (expected to be normalized)
- * returns the length of the projected vector that lies along vec1 */
-static float BM_bevel_project_vec(float *vec1, float *vec2, float *up_vec, int is_forward) {
- float factor, vec3[3], tmp[3],c1,c2;
-
- cross_v3_v3v3(tmp,vec1,vec2);
- normalize_v3(tmp);
- factor = dot_v3v3(up_vec,tmp);
- if ((factor > 0 && is_forward) || (factor < 0 && !is_forward)) {
- cross_v3_v3v3(vec3,vec2,tmp); /* hmm, maybe up_vec should be used instead of tmp */
- }
- else {
- cross_v3_v3v3(vec3,tmp,vec2); /* hmm, maybe up_vec should be used instead of tmp */
- }
- normalize_v3(vec3);
- c1 = dot_v3v3(vec3,vec1);
- c2 = dot_v3v3(vec1,vec1);
- if (fabs(c1) < 0.000001f || fabs(c2) < 0.000001f) {
- factor = 0.0f;
- }
- else {
- factor = c2/c1;
- }
-
- return factor;
-}
-
void calc_corner_co(BMesh *UNUSED(bm), BMLoop *l, float *co, float fac)
{
float /* no[3], tan[3], */ vec1[3], vec2[3], v1[3], v2[3], v3[3], v4[3];
diff --git a/source/blender/collada/AnimationImporter.cpp b/source/blender/collada/AnimationImporter.cpp
index 21cd71a90dc..a166324bde7 100644
--- a/source/blender/collada/AnimationImporter.cpp
+++ b/source/blender/collada/AnimationImporter.cpp
@@ -22,6 +22,12 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/AnimationImporter.cpp
+ * \ingroup collada
+ */
+
+#include <stddef.h>
+
/* COLLADABU_ASSERT, may be able to remove later */
#include "COLLADABUPlatform.h"
@@ -400,6 +406,9 @@ bool AnimationImporter::write_animation_list(const COLLADAFW::AnimationList* ani
return true;
}
+// \todo refactor read_node_transform to not automatically apply anything,
+// but rather return the transform matrix, so caller can do with it what is
+// necessary. Same for \ref get_node_mat
void AnimationImporter::read_node_transform(COLLADAFW::Node *node, Object *ob)
{
float mat[4][4];
diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
index e8335173d50..90c3cfbb001 100644
--- a/source/blender/collada/ArmatureExporter.cpp
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/ArmatureExporter.cpp
+ * \ingroup collada
+ */
+
+
#include "COLLADASWBaseInputElement.h"
#include "COLLADASWInstanceController.h"
#include "COLLADASWPrimitves.h"
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp
index bf51e64b0bd..8987e4ffaf7 100644
--- a/source/blender/collada/ArmatureImporter.cpp
+++ b/source/blender/collada/ArmatureImporter.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/ArmatureImporter.cpp
+ * \ingroup collada
+ */
+
+
/* COLLADABU_ASSERT, may be able to remove later */
#include "COLLADABUPlatform.h"
diff --git a/source/blender/collada/CMakeLists.txt b/source/blender/collada/CMakeLists.txt
index 3f8abb7ed5d..5241bbc4ee9 100644
--- a/source/blender/collada/CMakeLists.txt
+++ b/source/blender/collada/CMakeLists.txt
@@ -43,7 +43,8 @@ if(APPLE)
${OPENCOLLADA_INC}/COLLADAStreamWriter
${OPENCOLLADA_INC}/COLLADABaseUtils
${OPENCOLLADA_INC}/COLLADAFramework
- ${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader
+ ${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader
+ ${OPENCOLLADA_INC}/GeneratedSaxParser
)
else()
list(APPEND INC
@@ -51,6 +52,7 @@ else()
${OPENCOLLADA_INC}/COLLADABaseUtils/include
${OPENCOLLADA_INC}/COLLADAFramework/include
${OPENCOLLADA_INC}/COLLADASaxFrameworkLoader/include
+ ${OPENCOLLADA_INC}/GeneratedSaxParser/include
)
endif()
@@ -62,6 +64,8 @@ set(SRC
DocumentExporter.cpp
DocumentImporter.cpp
EffectExporter.cpp
+ ExtraHandler.cpp
+ ExtraTags.cpp
GeometryExporter.cpp
ImageExporter.cpp
InstanceWriter.cpp
@@ -82,6 +86,8 @@ set(SRC
DocumentExporter.h
DocumentImporter.h
EffectExporter.h
+ ExtraHandler.h
+ ExtraTags.h
GeometryExporter.h
ImageExporter.h
InstanceWriter.h
diff --git a/source/blender/collada/CameraExporter.cpp b/source/blender/collada/CameraExporter.cpp
index b2c9dd9a7c8..f8fa0fd55c0 100644
--- a/source/blender/collada/CameraExporter.cpp
+++ b/source/blender/collada/CameraExporter.cpp
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/CameraExporter.cpp
+ * \ingroup collada
+ */
+
+
#include <string>
#include "COLLADASWCamera.h"
diff --git a/source/blender/collada/DocumentExporter.cpp b/source/blender/collada/DocumentExporter.cpp
index 1a648f43097..e497a13258f 100644
--- a/source/blender/collada/DocumentExporter.cpp
+++ b/source/blender/collada/DocumentExporter.cpp
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/collada/DocumentExporter.cpp
+ * \ingroup collada
+ */
+
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
@@ -742,15 +747,19 @@ public:
AnimationExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryAnimations(sw) { this->sw = sw; }
+
+
void exportAnimations(Scene *sce)
{
- this->scene = sce;
+ if(hasAnimations(sce)) {
+ this->scene = sce;
- openLibrary();
-
- forEachObjectInScene(sce, *this);
-
- closeLibrary();
+ openLibrary();
+
+ forEachObjectInScene(sce, *this);
+
+ closeLibrary();
+ }
}
// called for each exported object
@@ -1340,6 +1349,24 @@ protected:
}
}
}
+
+ bool hasAnimations(Scene *sce)
+ {
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ FCurve *fcu = 0;
+ if(ob->adt && ob->adt->action)
+ fcu = (FCurve*)ob->adt->action->curves.first;
+
+ if ((ob->type == OB_ARMATURE && ob->data) || fcu) {
+ return true;
+ }
+ base= base->next;
+ }
+ return false;
+ }
};
void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
@@ -1434,12 +1461,16 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
asset.add();
// <library_cameras>
- CamerasExporter ce(&sw);
- ce.exportCameras(sce);
+ if(has_object_type(sce, OB_CAMERA)) {
+ CamerasExporter ce(&sw);
+ ce.exportCameras(sce);
+ }
// <library_lights>
- LightsExporter le(&sw);
- le.exportLights(sce);
+ if(has_object_type(sce, OB_LAMP)) {
+ LightsExporter le(&sw);
+ le.exportLights(sce);
+ }
// <library_images>
ImagesExporter ie(&sw, filename);
@@ -1454,8 +1485,10 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
me.exportMaterials(sce);
// <library_geometries>
- GeometryExporter ge(&sw);
- ge.exportGeom(sce);
+ if(has_object_type(sce, OB_MESH)) {
+ GeometryExporter ge(&sw);
+ ge.exportGeom(sce);
+ }
// <library_animations>
AnimationExporter ae(&sw);
@@ -1463,7 +1496,9 @@ void DocumentExporter::exportCurrentScene(Scene *sce, const char* filename)
// <library_controllers>
ArmatureExporter arm_exporter(&sw);
- arm_exporter.export_controllers(sce);
+ if(has_object_type(sce, OB_ARMATURE)) {
+ arm_exporter.export_controllers(sce);
+ }
// <library_visual_scenes>
SceneExporter se(&sw, &arm_exporter);
diff --git a/source/blender/collada/DocumentImporter.cpp b/source/blender/collada/DocumentImporter.cpp
index 2267cf747b1..72341e1caa2 100644
--- a/source/blender/collada/DocumentImporter.cpp
+++ b/source/blender/collada/DocumentImporter.cpp
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/collada/DocumentImporter.cpp
+ * \ingroup collada
+ */
+
// TODO:
// * name imported objects
// * import object rotation as euler
@@ -44,6 +49,7 @@
#include "COLLADAFWLight.h"
#include "COLLADASaxFWLLoader.h"
+#include "COLLADASaxFWLIExtraDataCallbackHandler.h"
#include "BLI_listbase.h"
#include "BLI_math.h"
@@ -69,9 +75,11 @@
#include "MEM_guardedalloc.h"
+#include "ExtraHandler.h"
#include "DocumentImporter.h"
-#include "collada_internal.h"
+#include "TransformReader.h"
+#include "collada_internal.h"
#include "collada_utils.h"
@@ -84,589 +92,587 @@
// creates empties for each imported bone on layer 2, for debugging
// #define ARMATURE_TEST
-/** Class that needs to be implemented by a writer.
- IMPORTANT: The write functions are called in arbitrary order.*/
-/*
-private:
- std::string mFilename;
+DocumentImporter::DocumentImporter(bContext *C, const char *filename) :
+ mImportStage(General),
+ mFilename(filename),
+ mContext(C),
+ armature_importer(&unit_converter, &mesh_importer, &anim_importer, CTX_data_scene(C)),
+ mesh_importer(&unit_converter, &armature_importer, CTX_data_scene(C)),
+ anim_importer(&unit_converter, &armature_importer, CTX_data_scene(C))
+{}
+
+DocumentImporter::~DocumentImporter()
+{
+ TagsMap::iterator etit;
+ etit = uid_tags_map.begin();
+ while(etit!=uid_tags_map.end()) {
+ delete etit->second;
+ etit++;
+ }
+}
+
+bool DocumentImporter::import()
+{
+ /** TODO Add error handler (implement COLLADASaxFWL::IErrorHandler */
+ COLLADASaxFWL::Loader loader;
+ COLLADAFW::Root root(&loader, this);
+ ExtraHandler *ehandler = new ExtraHandler(this);
- bContext *mContext;
-
- UnitConverter unit_converter;
- ArmatureImporter armature_importer;
- MeshImporter mesh_importer;
- AnimationImporter anim_importer;
-
- std::map<COLLADAFW::UniqueId, Image*> uid_image_map;
- std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
- std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
- std::map<COLLADAFW::UniqueId, Camera*> uid_camera_map;
- std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
- std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
- std::map<COLLADAFW::UniqueId, Object*> object_map;
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> node_map;
- std::vector<const COLLADAFW::VisualScene*> vscenes;
- std::vector<Object*> libnode_ob;
-
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map;
- */
- // find root joint by child joint uid, for bone tree evaluation during resampling
-
- // animation
- // std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > uid_fcurve_map;
- // Nodes don't share AnimationLists (Arystan)
- // std::map<COLLADAFW::UniqueId, Animation> uid_animated_map; // AnimationList->uniqueId to AnimatedObject map
-
-//public:
-
- /** Constructor. */
- DocumentImporter::DocumentImporter(bContext *C, const char *filename) :
- mImportStage(General),
- mFilename(filename),
- mContext(C),
- armature_importer(&unit_converter, &mesh_importer, &anim_importer, CTX_data_scene(C)),
- mesh_importer(&unit_converter, &armature_importer, CTX_data_scene(C)),
- anim_importer(&unit_converter, &armature_importer, CTX_data_scene(C))
- {}
-
- /** Destructor. */
- DocumentImporter::~DocumentImporter() {}
-
- bool DocumentImporter::import()
- {
- /** TODO Add error handler (implement COLLADASaxFWL::IErrorHandler */
- COLLADASaxFWL::Loader loader;
- COLLADAFW::Root root(&loader, this);
-
- if (!root.loadDocument(mFilename))
- return false;
-
- /** TODO set up scene graph and such here */
+ loader.registerExtraDataCallbackHandler(ehandler);
+
+
+ if (!root.loadDocument(mFilename))
+ return false;
+
+ /** TODO set up scene graph and such here */
+
+ mImportStage = Controller;
+
+ COLLADASaxFWL::Loader loader2;
+ COLLADAFW::Root root2(&loader2, this);
+
+ if (!root2.loadDocument(mFilename))
+ return false;
+
+
+ delete ehandler;
+
+ return true;
+}
+
+void DocumentImporter::cancel(const COLLADAFW::String& errorMessage)
+{
+ // TODO: if possible show error info
+ //
+ // Should we get rid of invisible Meshes that were created so far
+ // or maybe create objects at coordinate space origin?
+ //
+ // The latter sounds better.
+}
+
+void DocumentImporter::start(){}
+
+void DocumentImporter::finish()
+{
+ if(mImportStage!=General)
+ return;
- mImportStage = Controller;
+ /** TODO Break up and put into 2-pass parsing of DAE */
+ std::vector<const COLLADAFW::VisualScene*>::iterator it;
+ for (it = vscenes.begin(); it != vscenes.end(); it++) {
+ PointerRNA sceneptr, unit_settings;
+ PropertyRNA *system, *scale;
+ // TODO: create a new scene except the selected <visual_scene> - use current blender scene for it
+ Scene *sce = CTX_data_scene(mContext);
- COLLADASaxFWL::Loader loader2;
- COLLADAFW::Root root2(&loader2, this);
+ // for scene unit settings: system, scale_length
+ RNA_id_pointer_create(&sce->id, &sceneptr);
+ unit_settings = RNA_pointer_get(&sceneptr, "unit_settings");
+ system = RNA_struct_find_property(&unit_settings, "system");
+ scale = RNA_struct_find_property(&unit_settings, "scale_length");
- if (!root2.loadDocument(mFilename))
- return false;
+ switch(unit_converter.isMetricSystem()) {
+ case UnitConverter::Metric:
+ RNA_property_enum_set(&unit_settings, system, USER_UNIT_METRIC);
+ break;
+ case UnitConverter::Imperial:
+ RNA_property_enum_set(&unit_settings, system, USER_UNIT_IMPERIAL);
+ break;
+ default:
+ RNA_property_enum_set(&unit_settings, system, USER_UNIT_NONE);
+ break;
+ }
+ RNA_property_float_set(&unit_settings, scale, unit_converter.getLinearMeter());
+ const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes();
- return true;
- }
-
- void DocumentImporter::cancel(const COLLADAFW::String& errorMessage)
- {
- // TODO: if possible show error info
- //
- // Should we get rid of invisible Meshes that were created so far
- // or maybe create objects at coordinate space origin?
- //
- // The latter sounds better.
- }
-
- void DocumentImporter::start(){}
-
- /** This method is called after the last write* method. No other methods will be called after this.*/
- void DocumentImporter::finish()
- {
- if(mImportStage!=General)
- return;
-
- /** TODO Break up and put into 2-pass parsing of DAE */
- std::vector<const COLLADAFW::VisualScene*>::iterator it;
- for (it = vscenes.begin(); it != vscenes.end(); it++) {
- PointerRNA sceneptr, unit_settings;
- PropertyRNA *system, *scale;
- // TODO: create a new scene except the selected <visual_scene> - use current blender scene for it
- Scene *sce = CTX_data_scene(mContext);
-
- // for scene unit settings: system, scale_length
- RNA_id_pointer_create(&sce->id, &sceneptr);
- unit_settings = RNA_pointer_get(&sceneptr, "unit_settings");
- system = RNA_struct_find_property(&unit_settings, "system");
- scale = RNA_struct_find_property(&unit_settings, "scale_length");
-
- switch(unit_converter.isMetricSystem()) {
- case UnitConverter::Metric:
- RNA_property_enum_set(&unit_settings, system, USER_UNIT_METRIC);
- break;
- case UnitConverter::Imperial:
- RNA_property_enum_set(&unit_settings, system, USER_UNIT_IMPERIAL);
- break;
- default:
- RNA_property_enum_set(&unit_settings, system, USER_UNIT_NONE);
- break;
- }
- RNA_property_float_set(&unit_settings, scale, unit_converter.getLinearMeter());
-
- const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes();
-
- for (unsigned int i = 0; i < roots.getCount(); i++) {
- write_node(roots[i], NULL, sce, NULL, false);
- }
+ for (unsigned int i = 0; i < roots.getCount(); i++) {
+ write_node(roots[i], NULL, sce, NULL, false);
}
+ }
- armature_importer.make_armatures(mContext);
+ armature_importer.make_armatures(mContext);
#if 0
- armature_importer.fix_animation();
+ armature_importer.fix_animation();
#endif
- for (std::vector<const COLLADAFW::VisualScene*>::iterator it = vscenes.begin(); it != vscenes.end(); it++) {
- const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes();
-
- for (unsigned int i = 0; i < roots.getCount(); i++)
- translate_anim_recursive(roots[i],NULL,NULL);
- }
+ for (std::vector<const COLLADAFW::VisualScene*>::iterator it = vscenes.begin(); it != vscenes.end(); it++) {
+ const COLLADAFW::NodePointerArray& roots = (*it)->getRootNodes();
- if (libnode_ob.size()) {
- Scene *sce = CTX_data_scene(mContext);
-
- fprintf(stderr, "got %d library nodes to free\n", (int)libnode_ob.size());
- // free all library_nodes
- std::vector<Object*>::iterator it;
- for (it = libnode_ob.begin(); it != libnode_ob.end(); it++) {
- Object *ob = *it;
-
- Base *base = object_in_scene(ob, sce);
- if (base) {
- BLI_remlink(&sce->base, base);
- free_libblock_us(&G.main->object, base->object);
- if (sce->basact==base)
- sce->basact= NULL;
- MEM_freeN(base);
- }
- }
- libnode_ob.clear();
-
- DAG_scene_sort(CTX_data_main(mContext), sce);
- DAG_ids_flush_update(CTX_data_main(mContext), 0);
- }
+ for (unsigned int i = 0; i < roots.getCount(); i++)
+ translate_anim_recursive(roots[i],NULL,NULL);
}
+ if (libnode_ob.size()) {
+ Scene *sce = CTX_data_scene(mContext);
- void DocumentImporter::translate_anim_recursive(COLLADAFW::Node *node, COLLADAFW::Node *par = NULL, Object *parob = NULL)
- {
- if (par && par->getType() == COLLADAFW::Node::JOINT) {
- // par is root if there's no corresp. key in root_map
- if (root_map.find(par->getUniqueId()) == root_map.end())
- root_map[node->getUniqueId()] = par;
- else
- root_map[node->getUniqueId()] = root_map[par->getUniqueId()];
+ fprintf(stderr, "got %d library nodes to free\n", (int)libnode_ob.size());
+ // free all library_nodes
+ std::vector<Object*>::iterator it;
+ for (it = libnode_ob.begin(); it != libnode_ob.end(); it++) {
+ Object *ob = *it;
+
+ Base *base = object_in_scene(ob, sce);
+ if (base) {
+ BLI_remlink(&sce->base, base);
+ free_libblock_us(&G.main->object, base->object);
+ if (sce->basact==base)
+ sce->basact= NULL;
+ MEM_freeN(base);
+ }
}
+ libnode_ob.clear();
- COLLADAFW::Transformation::TransformationType types[] = {
- COLLADAFW::Transformation::ROTATE,
- COLLADAFW::Transformation::SCALE,
- COLLADAFW::Transformation::TRANSLATE,
- COLLADAFW::Transformation::MATRIX
- };
-
- unsigned int i;
- Object *ob;
+ DAG_scene_sort(CTX_data_main(mContext), sce);
+ DAG_ids_flush_update(CTX_data_main(mContext), 0);
+ }
+}
- for (i = 0; i < 4; i++)
- ob = anim_importer.translate_animation(node, object_map, root_map, types[i]);
- COLLADAFW::NodePointerArray &children = node->getChildNodes();
- for (i = 0; i < children.getCount(); i++) {
- translate_anim_recursive(children[i], node, ob);
- }
+void DocumentImporter::translate_anim_recursive(COLLADAFW::Node *node, COLLADAFW::Node *par = NULL, Object *parob = NULL)
+{
+ if (par && par->getType() == COLLADAFW::Node::JOINT) {
+ // par is root if there's no corresp. key in root_map
+ if (root_map.find(par->getUniqueId()) == root_map.end())
+ root_map[node->getUniqueId()] = par;
+ else
+ root_map[node->getUniqueId()] = root_map[par->getUniqueId()];
}
- /** When this method is called, the writer must write the global document asset.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- bool DocumentImporter::writeGlobalAsset ( const COLLADAFW::FileInfo* asset )
- {
- unit_converter.read_asset(asset);
+ COLLADAFW::Transformation::TransformationType types[] = {
+ COLLADAFW::Transformation::ROTATE,
+ COLLADAFW::Transformation::SCALE,
+ COLLADAFW::Transformation::TRANSLATE,
+ COLLADAFW::Transformation::MATRIX
+ };
- return true;
- }
+ unsigned int i;
+ Object *ob;
- /** When this method is called, the writer must write the scene.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- bool DocumentImporter::writeScene ( const COLLADAFW::Scene* scene )
- {
- // XXX could store the scene id, but do nothing for now
- return true;
+ for (i = 0; i < 4; i++)
+ ob = anim_importer.translate_animation(node, object_map, root_map, types[i]);
+
+ COLLADAFW::NodePointerArray &children = node->getChildNodes();
+ for (i = 0; i < children.getCount(); i++) {
+ translate_anim_recursive(children[i], node, ob);
}
- Object* DocumentImporter::create_camera_object(COLLADAFW::InstanceCamera *camera, Scene *sce)
- {
- const COLLADAFW::UniqueId& cam_uid = camera->getInstanciatedObjectId();
- if (uid_camera_map.find(cam_uid) == uid_camera_map.end()) {
- fprintf(stderr, "Couldn't find camera by UID.\n");
- return NULL;
- }
- Object *ob = add_object(sce, OB_CAMERA);
- Camera *cam = uid_camera_map[cam_uid];
- Camera *old_cam = (Camera*)ob->data;
- ob->data = cam;
- old_cam->id.us--;
- if (old_cam->id.us == 0)
- free_libblock(&G.main->camera, old_cam);
- return ob;
+}
+
+/** When this method is called, the writer must write the global document asset.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+bool DocumentImporter::writeGlobalAsset ( const COLLADAFW::FileInfo* asset )
+{
+ unit_converter.read_asset(asset);
+
+ return true;
+}
+
+/** When this method is called, the writer must write the scene.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+bool DocumentImporter::writeScene ( const COLLADAFW::Scene* scene )
+{
+ // XXX could store the scene id, but do nothing for now
+ return true;
+}
+Object* DocumentImporter::create_camera_object(COLLADAFW::InstanceCamera *camera, Scene *sce)
+{
+ const COLLADAFW::UniqueId& cam_uid = camera->getInstanciatedObjectId();
+ if (uid_camera_map.find(cam_uid) == uid_camera_map.end()) {
+ fprintf(stderr, "Couldn't find camera by UID.\n");
+ return NULL;
}
-
- Object* DocumentImporter::create_lamp_object(COLLADAFW::InstanceLight *lamp, Scene *sce)
- {
- const COLLADAFW::UniqueId& lamp_uid = lamp->getInstanciatedObjectId();
- if (uid_lamp_map.find(lamp_uid) == uid_lamp_map.end()) {
- fprintf(stderr, "Couldn't find lamp by UID. \n");
- return NULL;
- }
- Object *ob = add_object(sce, OB_LAMP);
- Lamp *la = uid_lamp_map[lamp_uid];
- Lamp *old_lamp = (Lamp*)ob->data;
- ob->data = la;
- old_lamp->id.us--;
- if (old_lamp->id.us == 0)
- free_libblock(&G.main->lamp, old_lamp);
- return ob;
- }
-
- Object* DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Node *source_node, COLLADAFW::Node *instance_node, Scene *sce, bool is_library_node)
- {
- Object *obn = copy_object(source_ob);
- obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
- scene_add_base(sce, obn);
-
- if (instance_node)
- anim_importer.read_node_transform(instance_node, obn);
- else
- anim_importer.read_node_transform(source_node, obn);
-
- DAG_scene_sort(CTX_data_main(mContext), sce);
- DAG_ids_flush_update(CTX_data_main(mContext), 0);
-
- COLLADAFW::NodePointerArray &children = source_node->getChildNodes();
- if (children.getCount()) {
- for (unsigned int i = 0; i < children.getCount(); i++) {
- COLLADAFW::Node *child_node = children[i];
- const COLLADAFW::UniqueId& child_id = child_node->getUniqueId();
- if (object_map.find(child_id) == object_map.end())
- continue;
- COLLADAFW::InstanceNodePointerArray &inodes = child_node->getInstanceNodes();
- Object *new_child = NULL;
- if (inodes.getCount()) {
- const COLLADAFW::UniqueId& id = inodes[0]->getInstanciatedObjectId();
- new_child = create_instance_node(object_map[id], node_map[id], child_node, sce, is_library_node);
- }
- else {
- new_child = create_instance_node(object_map[child_id], child_node, NULL, sce, is_library_node);
+ Object *ob = add_object(sce, OB_CAMERA);
+ Camera *cam = uid_camera_map[cam_uid];
+ Camera *old_cam = (Camera*)ob->data;
+ ob->data = cam;
+ old_cam->id.us--;
+ if (old_cam->id.us == 0)
+ free_libblock(&G.main->camera, old_cam);
+ return ob;
+}
+
+Object* DocumentImporter::create_lamp_object(COLLADAFW::InstanceLight *lamp, Scene *sce)
+{
+ const COLLADAFW::UniqueId& lamp_uid = lamp->getInstanciatedObjectId();
+ if (uid_lamp_map.find(lamp_uid) == uid_lamp_map.end()) {
+ fprintf(stderr, "Couldn't find lamp by UID. \n");
+ return NULL;
+ }
+ Object *ob = add_object(sce, OB_LAMP);
+ Lamp *la = uid_lamp_map[lamp_uid];
+ Lamp *old_lamp = (Lamp*)ob->data;
+ ob->data = la;
+ old_lamp->id.us--;
+ if (old_lamp->id.us == 0)
+ free_libblock(&G.main->lamp, old_lamp);
+ return ob;
+}
+
+Object* DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Node *source_node, COLLADAFW::Node *instance_node, Scene *sce, bool is_library_node)
+{
+ Object *obn = copy_object(source_ob);
+ obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
+ scene_add_base(sce, obn);
+
+ if (instance_node) {
+ anim_importer.read_node_transform(instance_node, obn);
+ // if we also have a source_node (always ;), take its
+ // transformation matrix and apply it to the newly instantiated
+ // object to account for node hierarchy transforms in
+ // .dae
+ if(source_node) {
+ COLLADABU::Math::Matrix4 mat4 = source_node->getTransformationMatrix();
+ COLLADABU::Math::Matrix4 bmat4 = mat4.transpose(); // transpose to get blender row-major order
+ float mat[4][4];
+ for (int i = 0; i < 4; i++) {
+ for (int j = 0; j < 4; j++) {
+ mat[i][j] = bmat4[i][j];
}
- bc_set_parent(new_child, obn, mContext, true);
-
- if (is_library_node)
- libnode_ob.push_back(new_child);
}
+ // calc new matrix and apply
+ mul_m4_m4m4(obn->obmat, mat, obn->obmat);
+ object_apply_mat4(obn, obn->obmat, 0, 0);
}
-
- return obn;
}
-
- void DocumentImporter::write_node (COLLADAFW::Node *node, COLLADAFW::Node *parent_node, Scene *sce, Object *par, bool is_library_node)
- {
- Object *ob = NULL;
- bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
-
- if (is_joint) {
- armature_importer.add_joint(node, parent_node == NULL || parent_node->getType() != COLLADAFW::Node::JOINT, par);
- }
- else {
- COLLADAFW::InstanceGeometryPointerArray &geom = node->getInstanceGeometries();
- COLLADAFW::InstanceCameraPointerArray &camera = node->getInstanceCameras();
- COLLADAFW::InstanceLightPointerArray &lamp = node->getInstanceLights();
- COLLADAFW::InstanceControllerPointerArray &controller = node->getInstanceControllers();
- COLLADAFW::InstanceNodePointerArray &inst_node = node->getInstanceNodes();
- int geom_done = 0;
- int camera_done = 0;
- int lamp_done = 0;
- int controller_done = 0;
- int inst_done = 0;
-
- // XXX linking object with the first <instance_geometry>, though a node may have more of them...
- // maybe join multiple <instance_...> meshes into 1, and link object with it? not sure...
- // <instance_geometry>
- while (geom_done < geom.getCount()) {
- ob = mesh_importer.create_mesh_object(node, geom[geom_done], false, uid_material_map,
- material_texture_mapping_map);
- ++geom_done;
- }
- while (camera_done < camera.getCount()) {
- ob = create_camera_object(camera[camera_done], sce);
- ++camera_done;
- }
- while (lamp_done < lamp.getCount()) {
- ob = create_lamp_object(lamp[lamp_done], sce);
- ++lamp_done;
- }
- while (controller_done < controller.getCount()) {
- COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry*)controller[controller_done];
- ob = mesh_importer.create_mesh_object(node, geom, true, uid_material_map, material_texture_mapping_map);
- ++controller_done;
- }
- // XXX instance_node is not supported yet
- while (inst_done < inst_node.getCount()) {
- const COLLADAFW::UniqueId& node_id = inst_node[inst_done]->getInstanciatedObjectId();
- if (object_map.find(node_id) == object_map.end()) {
- fprintf(stderr, "Cannot find node to instanciate.\n");
- ob = NULL;
- }
- else {
- Object *source_ob = object_map[node_id];
- COLLADAFW::Node *source_node = node_map[node_id];
+ else {
+ anim_importer.read_node_transform(source_node, obn);
+ }
- ob = create_instance_node(source_ob, source_node, node, sce, is_library_node);
- }
- ++inst_done;
+ DAG_scene_sort(CTX_data_main(mContext), sce);
+ DAG_ids_flush_update(CTX_data_main(mContext), 0);
+
+ COLLADAFW::NodePointerArray &children = source_node->getChildNodes();
+ if (children.getCount()) {
+ for (unsigned int i = 0; i < children.getCount(); i++) {
+ COLLADAFW::Node *child_node = children[i];
+ const COLLADAFW::UniqueId& child_id = child_node->getUniqueId();
+ if (object_map.find(child_id) == object_map.end())
+ continue;
+ COLLADAFW::InstanceNodePointerArray &inodes = child_node->getInstanceNodes();
+ Object *new_child = NULL;
+ if (inodes.getCount()) { // \todo loop through instance nodes
+ const COLLADAFW::UniqueId& id = inodes[0]->getInstanciatedObjectId();
+ new_child = create_instance_node(object_map[id], node_map[id], child_node, sce, is_library_node);
}
- // if node is empty - create empty object
- // XXX empty node may not mean it is empty object, not sure about this
- if ( (geom_done + camera_done + lamp_done + controller_done + inst_done) < 1) {
- ob = add_object(sce, OB_EMPTY);
+ else {
+ new_child = create_instance_node(object_map[child_id], child_node, NULL, sce, is_library_node);
}
-
- // check if object is not NULL
- if (!ob) return;
-
- rename_id(&ob->id, (char*)node->getOriginalId().c_str());
-
- object_map[node->getUniqueId()] = ob;
- node_map[node->getUniqueId()] = node;
+ bc_set_parent(new_child, obn, mContext, true);
if (is_library_node)
- libnode_ob.push_back(ob);
+ libnode_ob.push_back(new_child);
}
+ }
- anim_importer.read_node_transform(node, ob);
+ // when we have an instance_node, don't return the object, because otherwise
+ // its correct location gets overwritten in write_node(). Fixes bug #26012.
+ if(instance_node) return NULL;
+ else return obn;
+}
- if (!is_joint) {
- // if par was given make this object child of the previous
- if (par && ob)
- bc_set_parent(ob, par, mContext);
+void DocumentImporter::write_node (COLLADAFW::Node *node, COLLADAFW::Node *parent_node, Scene *sce, Object *par, bool is_library_node)
+{
+ Object *ob = NULL;
+ bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
+
+ if (is_joint) {
+ armature_importer.add_joint(node, parent_node == NULL || parent_node->getType() != COLLADAFW::Node::JOINT, par);
+ }
+ else {
+ COLLADAFW::InstanceGeometryPointerArray &geom = node->getInstanceGeometries();
+ COLLADAFW::InstanceCameraPointerArray &camera = node->getInstanceCameras();
+ COLLADAFW::InstanceLightPointerArray &lamp = node->getInstanceLights();
+ COLLADAFW::InstanceControllerPointerArray &controller = node->getInstanceControllers();
+ COLLADAFW::InstanceNodePointerArray &inst_node = node->getInstanceNodes();
+ int geom_done = 0;
+ int camera_done = 0;
+ int lamp_done = 0;
+ int controller_done = 0;
+ int inst_done = 0;
+
+ // XXX linking object with the first <instance_geometry>, though a node may have more of them...
+ // maybe join multiple <instance_...> meshes into 1, and link object with it? not sure...
+ // <instance_geometry>
+ while (geom_done < geom.getCount()) {
+ ob = mesh_importer.create_mesh_object(node, geom[geom_done], false, uid_material_map,
+ material_texture_mapping_map);
+ ++geom_done;
+ }
+ while (camera_done < camera.getCount()) {
+ ob = create_camera_object(camera[camera_done], sce);
+ ++camera_done;
+ }
+ while (lamp_done < lamp.getCount()) {
+ ob = create_lamp_object(lamp[lamp_done], sce);
+ ++lamp_done;
}
+ while (controller_done < controller.getCount()) {
+ COLLADAFW::InstanceGeometry *geom = (COLLADAFW::InstanceGeometry*)controller[controller_done];
+ ob = mesh_importer.create_mesh_object(node, geom, true, uid_material_map, material_texture_mapping_map);
+ ++controller_done;
+ }
+ // XXX instance_node is not supported yet
+ while (inst_done < inst_node.getCount()) {
+ const COLLADAFW::UniqueId& node_id = inst_node[inst_done]->getInstanciatedObjectId();
+ if (object_map.find(node_id) == object_map.end()) {
+ fprintf(stderr, "Cannot find node to instanciate.\n");
+ ob = NULL;
+ }
+ else {
+ Object *source_ob = object_map[node_id];
+ COLLADAFW::Node *source_node = node_map[node_id];
- // if node has child nodes write them
- COLLADAFW::NodePointerArray &child_nodes = node->getChildNodes();
- for (unsigned int i = 0; i < child_nodes.getCount(); i++) {
- write_node(child_nodes[i], node, sce, ob, is_library_node);
+ ob = create_instance_node(source_ob, source_node, node, sce, is_library_node);
+ }
+ ++inst_done;
}
- }
+ // if node is empty - create empty object
+ // XXX empty node may not mean it is empty object, not sure about this
+ if ( (geom_done + camera_done + lamp_done + controller_done + inst_done) < 1) {
+ ob = add_object(sce, OB_EMPTY);
+ }
+
+ // check if object is not NULL
+ if (!ob) return;
+
+ rename_id(&ob->id, (char*)node->getOriginalId().c_str());
- /** When this method is called, the writer must write the entire visual scene.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- bool DocumentImporter::writeVisualScene ( const COLLADAFW::VisualScene* visualScene )
- {
- if(mImportStage!=General)
- return true;
-
- // this method called on post process after writeGeometry, writeMaterial, etc.
+ object_map[node->getUniqueId()] = ob;
+ node_map[node->getUniqueId()] = node;
- // for each <node> in <visual_scene>:
- // create an Object
- // if Mesh (previously created in writeGeometry) to which <node> corresponds exists, link Object with that mesh
+ if (is_library_node)
+ libnode_ob.push_back(ob);
+ }
- // update: since we cannot link a Mesh with Object in
- // writeGeometry because <geometry> does not reference <node>,
- // we link Objects with Meshes here
+ anim_importer.read_node_transform(node, ob); // overwrites location set earlier
- vscenes.push_back(visualScene);
-
- return true;
+ if (!is_joint) {
+ // if par was given make this object child of the previous
+ if (par && ob)
+ bc_set_parent(ob, par, mContext);
}
- /** When this method is called, the writer must handle all nodes contained in the
- library nodes.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- bool DocumentImporter::writeLibraryNodes ( const COLLADAFW::LibraryNodes* libraryNodes )
- {
- if(mImportStage!=General)
- return true;
-
- Scene *sce = CTX_data_scene(mContext);
+ // if node has child nodes write them
+ COLLADAFW::NodePointerArray &child_nodes = node->getChildNodes();
+ for (unsigned int i = 0; i < child_nodes.getCount(); i++) {
+ write_node(child_nodes[i], node, sce, ob, is_library_node);
+ }
+}
- const COLLADAFW::NodePointerArray& nodes = libraryNodes->getNodes();
+/** When this method is called, the writer must write the entire visual scene.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+bool DocumentImporter::writeVisualScene ( const COLLADAFW::VisualScene* visualScene )
+{
+ if(mImportStage!=General)
+ return true;
+
+ // this method called on post process after writeGeometry, writeMaterial, etc.
- for (unsigned int i = 0; i < nodes.getCount(); i++) {
- write_node(nodes[i], NULL, sce, NULL, true);
- }
+ // for each <node> in <visual_scene>:
+ // create an Object
+ // if Mesh (previously created in writeGeometry) to which <node> corresponds exists, link Object with that mesh
+
+ // update: since we cannot link a Mesh with Object in
+ // writeGeometry because <geometry> does not reference <node>,
+ // we link Objects with Meshes here
+ vscenes.push_back(visualScene);
+
+ return true;
+}
+
+/** When this method is called, the writer must handle all nodes contained in the
+ library nodes.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+bool DocumentImporter::writeLibraryNodes ( const COLLADAFW::LibraryNodes* libraryNodes )
+{
+ if(mImportStage!=General)
return true;
+
+ Scene *sce = CTX_data_scene(mContext);
+
+ const COLLADAFW::NodePointerArray& nodes = libraryNodes->getNodes();
+
+ for (unsigned int i = 0; i < nodes.getCount(); i++) {
+ write_node(nodes[i], NULL, sce, NULL, true);
}
- /** When this method is called, the writer must write the geometry.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- bool DocumentImporter::writeGeometry ( const COLLADAFW::Geometry* geom )
- {
- if(mImportStage!=General)
- return true;
-
- return mesh_importer.write_geometry(geom);
- }
-
- /** When this method is called, the writer must write the material.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- bool DocumentImporter::writeMaterial( const COLLADAFW::Material* cmat )
- {
- if(mImportStage!=General)
- return true;
-
- const std::string& str_mat_id = cmat->getOriginalId();
- Material *ma = add_material((char*)str_mat_id.c_str());
-
- this->uid_effect_map[cmat->getInstantiatedEffect()] = ma;
- this->uid_material_map[cmat->getUniqueId()] = ma;
-
+ return true;
+}
+
+/** When this method is called, the writer must write the geometry.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+bool DocumentImporter::writeGeometry ( const COLLADAFW::Geometry* geom )
+{
+ if(mImportStage!=General)
return true;
- }
-
- // create mtex, create texture, set texture image
- MTex* DocumentImporter::create_texture(COLLADAFW::EffectCommon *ef, COLLADAFW::Texture &ctex, Material *ma,
- int i, TexIndexTextureArrayMap &texindex_texarray_map)
- {
- COLLADAFW::SamplerPointerArray& samp_array = ef->getSamplerPointerArray();
- COLLADAFW::Sampler *sampler = samp_array[ctex.getSamplerId()];
-
- const COLLADAFW::UniqueId& ima_uid = sampler->getSourceImage();
-
- if (uid_image_map.find(ima_uid) == uid_image_map.end()) {
- fprintf(stderr, "Couldn't find an image by UID.\n");
- return NULL;
- }
- ma->mtex[i] = add_mtex();
- ma->mtex[i]->texco = TEXCO_UV;
- ma->mtex[i]->tex = add_texture("Texture");
- ma->mtex[i]->tex->type = TEX_IMAGE;
- ma->mtex[i]->tex->imaflag &= ~TEX_USEALPHA;
- ma->mtex[i]->tex->ima = uid_image_map[ima_uid];
+ return mesh_importer.write_geometry(geom);
+}
+
+/** When this method is called, the writer must write the material.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+bool DocumentImporter::writeMaterial( const COLLADAFW::Material* cmat )
+{
+ if(mImportStage!=General)
+ return true;
- texindex_texarray_map[ctex.getTextureMapId()].push_back(ma->mtex[i]);
+ const std::string& str_mat_id = cmat->getOriginalId();
+ Material *ma = add_material((char*)str_mat_id.c_str());
+
+ this->uid_effect_map[cmat->getInstantiatedEffect()] = ma;
+ this->uid_material_map[cmat->getUniqueId()] = ma;
+
+ return true;
+}
+
+// create mtex, create texture, set texture image
+MTex* DocumentImporter::create_texture(COLLADAFW::EffectCommon *ef, COLLADAFW::Texture &ctex, Material *ma,
+ int i, TexIndexTextureArrayMap &texindex_texarray_map)
+{
+ COLLADAFW::SamplerPointerArray& samp_array = ef->getSamplerPointerArray();
+ COLLADAFW::Sampler *sampler = samp_array[ctex.getSamplerId()];
- return ma->mtex[i];
+ const COLLADAFW::UniqueId& ima_uid = sampler->getSourceImage();
+
+ if (uid_image_map.find(ima_uid) == uid_image_map.end()) {
+ fprintf(stderr, "Couldn't find an image by UID.\n");
+ return NULL;
}
- void DocumentImporter::write_profile_COMMON(COLLADAFW::EffectCommon *ef, Material *ma)
- {
- COLLADAFW::EffectCommon::ShaderType shader = ef->getShaderType();
-
- // blinn
- if (shader == COLLADAFW::EffectCommon::SHADER_BLINN) {
- ma->spec_shader = MA_SPEC_BLINN;
- ma->spec = ef->getShininess().getFloatValue();
- }
- // phong
- else if (shader == COLLADAFW::EffectCommon::SHADER_PHONG) {
- ma->spec_shader = MA_SPEC_PHONG;
- ma->har = ef->getShininess().getFloatValue();
- }
- // lambert
- else if (shader == COLLADAFW::EffectCommon::SHADER_LAMBERT) {
- ma->diff_shader = MA_DIFF_LAMBERT;
- }
- // default - lambert
- else {
- ma->diff_shader = MA_DIFF_LAMBERT;
- fprintf(stderr, "Current shader type is not supported.\n");
- }
- // reflectivity
- ma->ray_mirror = ef->getReflectivity().getFloatValue();
- // index of refraction
- ma->ang = ef->getIndexOfRefraction().getFloatValue();
-
- int i = 0;
- COLLADAFW::Color col;
- MTex *mtex = NULL;
- TexIndexTextureArrayMap texindex_texarray_map;
-
- // DIFFUSE
- // color
- if (ef->getDiffuse().isColor()) {
- col = ef->getDiffuse().getColor();
- ma->r = col.getRed();
- ma->g = col.getGreen();
- ma->b = col.getBlue();
- }
- // texture
- else if (ef->getDiffuse().isTexture()) {
- COLLADAFW::Texture ctex = ef->getDiffuse().getTexture();
- mtex = create_texture(ef, ctex, ma, i, texindex_texarray_map);
- if (mtex != NULL) {
- mtex->mapto = MAP_COL;
- ma->texact = (int)i;
- i++;
- }
- }
- // AMBIENT
- // color
- if (ef->getAmbient().isColor()) {
- col = ef->getAmbient().getColor();
- ma->ambr = col.getRed();
- ma->ambg = col.getGreen();
- ma->ambb = col.getBlue();
- }
- // texture
- else if (ef->getAmbient().isTexture()) {
- COLLADAFW::Texture ctex = ef->getAmbient().getTexture();
- mtex = create_texture(ef, ctex, ma, i, texindex_texarray_map);
- if (mtex != NULL) {
- mtex->mapto = MAP_AMB;
- i++;
- }
- }
- // SPECULAR
- // color
- if (ef->getSpecular().isColor()) {
- col = ef->getSpecular().getColor();
- ma->specr = col.getRed();
- ma->specg = col.getGreen();
- ma->specb = col.getBlue();
- }
- // texture
- else if (ef->getSpecular().isTexture()) {
- COLLADAFW::Texture ctex = ef->getSpecular().getTexture();
- mtex = create_texture(ef, ctex, ma, i, texindex_texarray_map);
- if (mtex != NULL) {
- mtex->mapto = MAP_SPEC;
- i++;
- }
+ ma->mtex[i] = add_mtex();
+ ma->mtex[i]->texco = TEXCO_UV;
+ ma->mtex[i]->tex = add_texture("Texture");
+ ma->mtex[i]->tex->type = TEX_IMAGE;
+ ma->mtex[i]->tex->imaflag &= ~TEX_USEALPHA;
+ ma->mtex[i]->tex->ima = uid_image_map[ima_uid];
+
+ texindex_texarray_map[ctex.getTextureMapId()].push_back(ma->mtex[i]);
+
+ return ma->mtex[i];
+}
+
+void DocumentImporter::write_profile_COMMON(COLLADAFW::EffectCommon *ef, Material *ma)
+{
+ COLLADAFW::EffectCommon::ShaderType shader = ef->getShaderType();
+
+ // blinn
+ if (shader == COLLADAFW::EffectCommon::SHADER_BLINN) {
+ ma->spec_shader = MA_SPEC_BLINN;
+ ma->spec = ef->getShininess().getFloatValue();
+ }
+ // phong
+ else if (shader == COLLADAFW::EffectCommon::SHADER_PHONG) {
+ ma->spec_shader = MA_SPEC_PHONG;
+ ma->har = ef->getShininess().getFloatValue();
+ }
+ // lambert
+ else if (shader == COLLADAFW::EffectCommon::SHADER_LAMBERT) {
+ ma->diff_shader = MA_DIFF_LAMBERT;
+ }
+ // default - lambert
+ else {
+ ma->diff_shader = MA_DIFF_LAMBERT;
+ fprintf(stderr, "Current shader type is not supported, default to lambert.\n");
+ }
+ // reflectivity
+ ma->ray_mirror = ef->getReflectivity().getFloatValue();
+ // index of refraction
+ ma->ang = ef->getIndexOfRefraction().getFloatValue();
+
+ int i = 0;
+ COLLADAFW::Color col;
+ MTex *mtex = NULL;
+ TexIndexTextureArrayMap texindex_texarray_map;
+
+ // DIFFUSE
+ // color
+ if (ef->getDiffuse().isColor()) {
+ col = ef->getDiffuse().getColor();
+ ma->r = col.getRed();
+ ma->g = col.getGreen();
+ ma->b = col.getBlue();
+ }
+ // texture
+ else if (ef->getDiffuse().isTexture()) {
+ COLLADAFW::Texture ctex = ef->getDiffuse().getTexture();
+ mtex = create_texture(ef, ctex, ma, i, texindex_texarray_map);
+ if (mtex != NULL) {
+ mtex->mapto = MAP_COL;
+ ma->texact = (int)i;
+ i++;
}
- // REFLECTIVE
- // color
- if (ef->getReflective().isColor()) {
- col = ef->getReflective().getColor();
- ma->mirr = col.getRed();
- ma->mirg = col.getGreen();
- ma->mirb = col.getBlue();
+ }
+ // AMBIENT
+ // color
+ if (ef->getAmbient().isColor()) {
+ col = ef->getAmbient().getColor();
+ ma->ambr = col.getRed();
+ ma->ambg = col.getGreen();
+ ma->ambb = col.getBlue();
+ }
+ // texture
+ else if (ef->getAmbient().isTexture()) {
+ COLLADAFW::Texture ctex = ef->getAmbient().getTexture();
+ mtex = create_texture(ef, ctex, ma, i, texindex_texarray_map);
+ if (mtex != NULL) {
+ mtex->mapto = MAP_AMB;
+ i++;
}
- // texture
- else if (ef->getReflective().isTexture()) {
- COLLADAFW::Texture ctex = ef->getReflective().getTexture();
- mtex = create_texture(ef, ctex, ma, i, texindex_texarray_map);
- if (mtex != NULL) {
- mtex->mapto = MAP_REF;
- i++;
- }
+ }
+ // SPECULAR
+ // color
+ if (ef->getSpecular().isColor()) {
+ col = ef->getSpecular().getColor();
+ ma->specr = col.getRed();
+ ma->specg = col.getGreen();
+ ma->specb = col.getBlue();
+ }
+ // texture
+ else if (ef->getSpecular().isTexture()) {
+ COLLADAFW::Texture ctex = ef->getSpecular().getTexture();
+ mtex = create_texture(ef, ctex, ma, i, texindex_texarray_map);
+ if (mtex != NULL) {
+ mtex->mapto = MAP_SPEC;
+ i++;
}
- // EMISSION
- // color
- if (ef->getEmission().isColor()) {
- // XXX there is no emission color in blender
- // but I am not sure
+ }
+ // REFLECTIVE
+ // color
+ if (ef->getReflective().isColor()) {
+ col = ef->getReflective().getColor();
+ ma->mirr = col.getRed();
+ ma->mirg = col.getGreen();
+ ma->mirb = col.getBlue();
+ }
+ // texture
+ else if (ef->getReflective().isTexture()) {
+ COLLADAFW::Texture ctex = ef->getReflective().getTexture();
+ mtex = create_texture(ef, ctex, ma, i, texindex_texarray_map);
+ if (mtex != NULL) {
+ mtex->mapto = MAP_REF;
+ i++;
}
- // texture
- else if (ef->getEmission().isTexture()) {
- COLLADAFW::Texture ctex = ef->getEmission().getTexture();
- mtex = create_texture(ef, ctex, ma, i, texindex_texarray_map);
- if (mtex != NULL) {
- mtex->mapto = MAP_EMIT;
- i++;
- }
+ }
+ // EMISSION
+ // color
+ if (ef->getEmission().isColor()) {
+ // XXX there is no emission color in blender
+ // but I am not sure
+ }
+ // texture
+ else if (ef->getEmission().isTexture()) {
+ COLLADAFW::Texture ctex = ef->getEmission().getTexture();
+ mtex = create_texture(ef, ctex, ma, i, texindex_texarray_map);
+ if (mtex != NULL) {
+ mtex->mapto = MAP_EMIT;
+ i++;
}
- // TRANSPARENT
- // color
- // if (ef->getOpacity().isColor()) {
+ }
+ // TRANSPARENT
+ // color
+// if (ef->getOpacity().isColor()) {
// // XXX don't know what to do here
// }
// // texture
@@ -678,323 +684,401 @@ private:
// if (mtex != NULL) mtex->mapto = MAP_ALPHA;
// }
// }
- material_texture_mapping_map[ma] = texindex_texarray_map;
+ material_texture_mapping_map[ma] = texindex_texarray_map;
+}
+
+/** When this method is called, the writer must write the effect.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+
+bool DocumentImporter::writeEffect( const COLLADAFW::Effect* effect )
+{
+ if(mImportStage!=General)
+ return true;
+
+ const COLLADAFW::UniqueId& uid = effect->getUniqueId();
+ if (uid_effect_map.find(uid) == uid_effect_map.end()) {
+ fprintf(stderr, "Couldn't find a material by UID.\n");
+ return true;
}
- /** When this method is called, the writer must write the effect.
- @return The writer should return true, if writing succeeded, false otherwise.*/
+ Material *ma = uid_effect_map[uid];
- bool DocumentImporter::writeEffect( const COLLADAFW::Effect* effect )
- {
- if(mImportStage!=General)
- return true;
-
- const COLLADAFW::UniqueId& uid = effect->getUniqueId();
- if (uid_effect_map.find(uid) == uid_effect_map.end()) {
- fprintf(stderr, "Couldn't find a material by UID.\n");
- return true;
- }
-
- Material *ma = uid_effect_map[uid];
-
- COLLADAFW::CommonEffectPointerArray common_efs = effect->getCommonEffects();
- if (common_efs.getCount() < 1) {
- fprintf(stderr, "Couldn't find <profile_COMMON>.\n");
- return true;
- }
- // XXX TODO: Take all <profile_common>s
- // Currently only first <profile_common> is supported
- COLLADAFW::EffectCommon *ef = common_efs[0];
- write_profile_COMMON(ef, ma);
-
+ COLLADAFW::CommonEffectPointerArray common_efs = effect->getCommonEffects();
+ if (common_efs.getCount() < 1) {
+ fprintf(stderr, "Couldn't find <profile_COMMON>.\n");
return true;
}
+ // XXX TODO: Take all <profile_common>s
+ // Currently only first <profile_common> is supported
+ COLLADAFW::EffectCommon *ef = common_efs[0];
+ write_profile_COMMON(ef, ma);
-
- /** When this method is called, the writer must write the camera.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- bool DocumentImporter::writeCamera( const COLLADAFW::Camera* camera )
- {
- if(mImportStage!=General)
- return true;
-
- Camera *cam = NULL;
- std::string cam_id, cam_name;
-
- cam_id = camera->getOriginalId();
- cam_name = camera->getName();
- if (cam_name.size()) cam = (Camera*)add_camera((char*)cam_name.c_str());
- else cam = (Camera*)add_camera((char*)cam_id.c_str());
+ return true;
+}
+
+
+/** When this method is called, the writer must write the camera.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+bool DocumentImporter::writeCamera( const COLLADAFW::Camera* camera )
+{
+ if(mImportStage!=General)
+ return true;
- if (!cam) {
- fprintf(stderr, "Cannot create camera. \n");
- return true;
+ Camera *cam = NULL;
+ std::string cam_id, cam_name;
+
+ cam_id = camera->getOriginalId();
+ cam_name = camera->getName();
+ if (cam_name.size()) cam = (Camera*)add_camera((char*)cam_name.c_str());
+ else cam = (Camera*)add_camera((char*)cam_id.c_str());
+
+ if (!cam) {
+ fprintf(stderr, "Cannot create camera. \n");
+ return true;
+ }
+ cam->clipsta = camera->getNearClippingPlane().getValue();
+ cam->clipend = camera->getFarClippingPlane().getValue();
+
+ COLLADAFW::Camera::CameraType type = camera->getCameraType();
+ switch(type) {
+ case COLLADAFW::Camera::ORTHOGRAPHIC:
+ {
+ cam->type = CAM_ORTHO;
}
- cam->clipsta = camera->getNearClippingPlane().getValue();
- cam->clipend = camera->getFarClippingPlane().getValue();
-
- COLLADAFW::Camera::CameraType type = camera->getCameraType();
- switch(type) {
- case COLLADAFW::Camera::ORTHOGRAPHIC:
- {
- cam->type = CAM_ORTHO;
- }
- break;
- case COLLADAFW::Camera::PERSPECTIVE:
- {
- cam->type = CAM_PERSP;
- }
- break;
- case COLLADAFW::Camera::UNDEFINED_CAMERATYPE:
- {
- fprintf(stderr, "Current camera type is not supported. \n");
- cam->type = CAM_PERSP;
- }
- break;
+ break;
+ case COLLADAFW::Camera::PERSPECTIVE:
+ {
+ cam->type = CAM_PERSP;
}
-
- switch(camera->getDescriptionType()) {
- case COLLADAFW::Camera::ASPECTRATIO_AND_Y:
- {
- switch(cam->type) {
- case CAM_ORTHO:
- {
- double ymag = camera->getYMag().getValue();
- double aspect = camera->getAspectRatio().getValue();
- double xmag = aspect*ymag;
- cam->ortho_scale = (float)xmag;
- }
- break;
- case CAM_PERSP:
- default:
- {
- double yfov = camera->getYFov().getValue();
- double aspect = camera->getAspectRatio().getValue();
- double xfov = aspect*yfov;
- // xfov is in degrees, cam->lens is in millimiters
- cam->lens = angle_to_lens((float)xfov*(M_PI/180.0f));
- }
- break;
- }
+ break;
+ case COLLADAFW::Camera::UNDEFINED_CAMERATYPE:
+ {
+ fprintf(stderr, "Current camera type is not supported. \n");
+ cam->type = CAM_PERSP;
+ }
+ break;
+ }
+
+ switch(camera->getDescriptionType()) {
+ case COLLADAFW::Camera::ASPECTRATIO_AND_Y:
+ {
+ switch(cam->type) {
+ case CAM_ORTHO:
+ {
+ double ymag = camera->getYMag().getValue();
+ double aspect = camera->getAspectRatio().getValue();
+ double xmag = aspect*ymag;
+ cam->ortho_scale = (float)xmag;
+ }
+ break;
+ case CAM_PERSP:
+ default:
+ {
+ double yfov = camera->getYFov().getValue();
+ double aspect = camera->getAspectRatio().getValue();
+ double xfov = aspect*yfov;
+ // xfov is in degrees, cam->lens is in millimiters
+ cam->lens = angle_to_lens((float)xfov*(M_PI/180.0f));
+ }
+ break;
}
- break;
- /* XXX correct way to do following four is probably to get also render
- size and determine proper settings from that somehow */
- case COLLADAFW::Camera::ASPECTRATIO_AND_X:
- case COLLADAFW::Camera::SINGLE_X:
- case COLLADAFW::Camera::X_AND_Y:
- {
- switch(cam->type) {
- case CAM_ORTHO:
- cam->ortho_scale = (float)camera->getXMag().getValue();
- break;
- case CAM_PERSP:
- default:
- {
- double x = camera->getXFov().getValue();
- // x is in degrees, cam->lens is in millimiters
- cam->lens = angle_to_lens((float)x*(M_PI/180.0f));
- }
- break;
- }
+ }
+ break;
+ /* XXX correct way to do following four is probably to get also render
+ size and determine proper settings from that somehow */
+ case COLLADAFW::Camera::ASPECTRATIO_AND_X:
+ case COLLADAFW::Camera::SINGLE_X:
+ case COLLADAFW::Camera::X_AND_Y:
+ {
+ switch(cam->type) {
+ case CAM_ORTHO:
+ cam->ortho_scale = (float)camera->getXMag().getValue();
+ break;
+ case CAM_PERSP:
+ default:
+ {
+ double x = camera->getXFov().getValue();
+ // x is in degrees, cam->lens is in millimiters
+ cam->lens = angle_to_lens((float)x*(M_PI/180.0f));
+ }
+ break;
}
- break;
- case COLLADAFW::Camera::SINGLE_Y:
- {
- switch(cam->type) {
- case CAM_ORTHO:
- cam->ortho_scale = (float)camera->getYMag().getValue();
- break;
- case CAM_PERSP:
- default:
- {
- double yfov = camera->getYFov().getValue();
- // yfov is in degrees, cam->lens is in millimiters
- cam->lens = angle_to_lens((float)yfov*(M_PI/180.0f));
- }
- break;
- }
+ }
+ break;
+ case COLLADAFW::Camera::SINGLE_Y:
+ {
+ switch(cam->type) {
+ case CAM_ORTHO:
+ cam->ortho_scale = (float)camera->getYMag().getValue();
+ break;
+ case CAM_PERSP:
+ default:
+ {
+ double yfov = camera->getYFov().getValue();
+ // yfov is in degrees, cam->lens is in millimiters
+ cam->lens = angle_to_lens((float)yfov*(M_PI/180.0f));
+ }
+ break;
}
- break;
- case COLLADAFW::Camera::UNDEFINED:
- // read nothing, use blender defaults.
- break;
}
+ break;
+ case COLLADAFW::Camera::UNDEFINED:
+ // read nothing, use blender defaults.
+ break;
+ }
+
+ this->uid_camera_map[camera->getUniqueId()] = cam;
+ // XXX import camera options
+ return true;
+}
+
+/** When this method is called, the writer must write the image.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+bool DocumentImporter::writeImage( const COLLADAFW::Image* image )
+{
+ if(mImportStage!=General)
+ return true;
- this->uid_camera_map[camera->getUniqueId()] = cam;
- // XXX import camera options
+ // XXX maybe it is necessary to check if the path is absolute or relative
+ const std::string& filepath = image->getImageURI().toNativePath();
+ const char *filename = (const char*)mFilename.c_str();
+ char dir[FILE_MAX];
+ char full_path[FILE_MAX];
+
+ BLI_split_dirfile(filename, dir, NULL);
+ BLI_join_dirfile(full_path, sizeof(full_path), dir, filepath.c_str());
+ Image *ima = BKE_add_image_file(full_path);
+ if (!ima) {
+ fprintf(stderr, "Cannot create image. \n");
return true;
}
+ this->uid_image_map[image->getUniqueId()] = ima;
+
+ return true;
+}
+
+/** When this method is called, the writer must write the light.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+bool DocumentImporter::writeLight( const COLLADAFW::Light* light )
+{
+ if(mImportStage!=General)
+ return true;
- /** When this method is called, the writer must write the image.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- bool DocumentImporter::writeImage( const COLLADAFW::Image* image )
- {
- if(mImportStage!=General)
- return true;
-
- // XXX maybe it is necessary to check if the path is absolute or relative
- const std::string& filepath = image->getImageURI().toNativePath();
- const char *filename = (const char*)mFilename.c_str();
- char dir[FILE_MAX];
- char full_path[FILE_MAX];
-
- BLI_split_dirfile(filename, dir, NULL);
- BLI_join_dirfile(full_path, sizeof(full_path), dir, filepath.c_str());
- Image *ima = BKE_add_image_file(full_path);
- if (!ima) {
- fprintf(stderr, "Cannot create image. \n");
- return true;
- }
- this->uid_image_map[image->getUniqueId()] = ima;
-
+ Lamp *lamp = NULL;
+ std::string la_id, la_name;
+
+ TagsMap::iterator etit;
+ ExtraTags *et = 0;
+ etit = uid_tags_map.find(light->getUniqueId().toAscii());
+ if(etit != uid_tags_map.end())
+ et = etit->second;
+
+ la_id = light->getOriginalId();
+ la_name = light->getName();
+ if (la_name.size()) lamp = (Lamp*)add_lamp((char*)la_name.c_str());
+ else lamp = (Lamp*)add_lamp((char*)la_id.c_str());
+
+ if (!lamp) {
+ fprintf(stderr, "Cannot create lamp. \n");
return true;
}
- /** When this method is called, the writer must write the light.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- bool DocumentImporter::writeLight( const COLLADAFW::Light* light )
- {
- if(mImportStage!=General)
- return true;
-
- Lamp *lamp = NULL;
- std::string la_id, la_name;
-
- la_id = light->getOriginalId();
- la_name = light->getName();
- if (la_name.size()) lamp = (Lamp*)add_lamp((char*)la_name.c_str());
- else lamp = (Lamp*)add_lamp((char*)la_id.c_str());
-
- if (!lamp) {
- fprintf(stderr, "Cannot create lamp. \n");
- return true;
- }
- if (light->getColor().isValid()) {
- COLLADAFW::Color col = light->getColor();
- lamp->r = col.getRed();
- lamp->g = col.getGreen();
- lamp->b = col.getBlue();
- }
+ // if we find an ExtraTags for this, use that instead.
+ if(et && et->isProfile("blender")) {
+ et->setData("type", &(lamp->type));
+ et->setData("flag", &(lamp->flag));
+ et->setData("mode", &(lamp->mode));
+ et->setData("gamma", &(lamp->k));
+ et->setData("red", &(lamp->r));
+ et->setData("green", &(lamp->g));
+ et->setData("blue", &(lamp->b));
+ et->setData("shadow_r", &(lamp->shdwr));
+ et->setData("shadow_g", &(lamp->shdwg));
+ et->setData("shadow_b", &(lamp->shdwb));
+ et->setData("energy", &(lamp->energy));
+ et->setData("dist", &(lamp->dist));
+ et->setData("spotsize", &(lamp->spotsize));
+ et->setData("spotblend", &(lamp->spotblend));
+ et->setData("halo_intensity", &(lamp->haint));
+ et->setData("att1", &(lamp->att1));
+ et->setData("att2", &(lamp->att2));
+ et->setData("falloff_type", &(lamp->falloff_type));
+ et->setData("clipsta", &(lamp->clipsta));
+ et->setData("clipend", &(lamp->clipend));
+ et->setData("shadspotsize", &(lamp->shadspotsize));
+ et->setData("bias", &(lamp->bias));
+ et->setData("soft", &(lamp->soft));
+ et->setData("compressthresh", &(lamp->compressthresh));
+ et->setData("bufsize", &(lamp->bufsize));
+ et->setData("samp", &(lamp->samp));
+ et->setData("buffers", &(lamp->buffers));
+ et->setData("filtertype", &(lamp->filtertype));
+ et->setData("bufflag", &(lamp->bufflag));
+ et->setData("buftype", &(lamp->buftype));
+ et->setData("ray_samp", &(lamp->ray_samp));
+ et->setData("ray_sampy", &(lamp->ray_sampy));
+ et->setData("ray_sampz", &(lamp->ray_sampz));
+ et->setData("ray_samp_type", &(lamp->ray_samp_type));
+ et->setData("area_shape", &(lamp->area_shape));
+ et->setData("area_size", &(lamp->area_size));
+ et->setData("area_sizey", &(lamp->area_sizey));
+ et->setData("area_sizez", &(lamp->area_sizez));
+ et->setData("adapt_thresh", &(lamp->adapt_thresh));
+ et->setData("ray_samp_method", &(lamp->ray_samp_method));
+ et->setData("shadhalostep", &(lamp->shadhalostep));
+ et->setData("sun_effect_type", &(lamp->shadhalostep));
+ et->setData("skyblendtype", &(lamp->skyblendtype));
+ et->setData("horizon_brightness", &(lamp->horizon_brightness));
+ et->setData("spread", &(lamp->spread));
+ et->setData("sun_brightness", &(lamp->sun_brightness));
+ et->setData("sun_size", &(lamp->sun_size));
+ et->setData("backscattered_light", &(lamp->backscattered_light));
+ et->setData("sun_intensity", &(lamp->sun_intensity));
+ et->setData("atm_turbidity", &(lamp->atm_turbidity));
+ et->setData("atm_extinction_factor", &(lamp->atm_extinction_factor));
+ et->setData("atm_distance_factor", &(lamp->atm_distance_factor));
+ et->setData("skyblendfac", &(lamp->skyblendfac));
+ et->setData("sky_exposure", &(lamp->sky_exposure));
+ et->setData("sky_colorspace", &(lamp->sky_colorspace));
+ }
+ else {
float constatt = light->getConstantAttenuation().getValue();
float linatt = light->getLinearAttenuation().getValue();
float quadatt = light->getQuadraticAttenuation().getValue();
float d = 25.0f;
float att1 = 0.0f;
float att2 = 0.0f;
-
- float e = 1.0f/constatt;
-
- /* NOTE: We assume for now that inv square is used for quadratic light
- * and inv linear for linear light. Exported blender lin/quad weighted
- * most likely will result in wrong import. */
- /* quadratic light */
+ float e = 1.0f;
+
+ if (light->getColor().isValid()) {
+ COLLADAFW::Color col = light->getColor();
+ lamp->r = col.getRed();
+ lamp->g = col.getGreen();
+ lamp->b = col.getBlue();
+ }
+
if(IS_EQ(linatt, 0.0f) && quadatt > 0.0f) {
- //quadatt = att2/(d*d*(e*2));
- float invquadatt = 1.0f/quadatt;
- float d2 = invquadatt / (2 * e);
- d = sqrtf(d2);
+ att2 = quadatt;
+ d = (1.0f/quadatt) * 2;
}
// linear light
else if(IS_EQ(quadatt, 0.0f) && linatt > 0.0f) {
- //linatt = att1/(d*e);
- float invlinatt = 1.0f/linatt;
- d = invlinatt / e;
+ att1 = linatt;
+ d = (1.0f/linatt) * 2;
+ } else if (IS_EQ(constatt, 1.0f)) {
+ att1 = 1.0f;
} else {
- printf("no linear nor quad light, using defaults for attenuation, import will be incorrect: Lamp %s\n", lamp->id.name);
- att2 = 1.0f;
+ // assuming point light (const att = 1.0);
+ att1 = 1.0f;
}
- lamp->dist = d;
+ d *= ( 1.0f / unit_converter.getLinearMeter());
+
lamp->energy = e;
-
+ lamp->dist = d;
+
COLLADAFW::Light::LightType type = light->getLightType();
switch(type) {
- case COLLADAFW::Light::AMBIENT_LIGHT:
- {
- lamp->type = LA_HEMI;
- }
- break;
- case COLLADAFW::Light::SPOT_LIGHT:
- {
- lamp->type = LA_SPOT;
- lamp->falloff_type = LA_FALLOFF_INVSQUARE;
- lamp->att1 = att1;
- lamp->att2 = att2;
- lamp->spotsize = light->getFallOffAngle().getValue();
- lamp->spotblend = light->getFallOffExponent().getValue();
- }
- break;
- case COLLADAFW::Light::DIRECTIONAL_LIGHT:
- {
- lamp->type = LA_SUN;
- }
- break;
- case COLLADAFW::Light::POINT_LIGHT:
- {
- lamp->type = LA_LOCAL;
- lamp->falloff_type = LA_FALLOFF_INVSQUARE;
- lamp->att1 = att1;
- lamp->att2 = att2;
- }
- break;
- case COLLADAFW::Light::UNDEFINED:
- {
- fprintf(stderr, "Current lamp type is not supported. \n");
- lamp->type = LA_LOCAL;
- }
- break;
+ case COLLADAFW::Light::AMBIENT_LIGHT:
+ {
+ lamp->type = LA_HEMI;
+ }
+ break;
+ case COLLADAFW::Light::SPOT_LIGHT:
+ {
+ lamp->type = LA_SPOT;
+ lamp->falloff_type = LA_FALLOFF_INVSQUARE;
+ lamp->att1 = att1;
+ lamp->att2 = att2;
+ lamp->spotsize = light->getFallOffAngle().getValue();
+ lamp->spotblend = light->getFallOffExponent().getValue();
+ }
+ break;
+ case COLLADAFW::Light::DIRECTIONAL_LIGHT:
+ {
+ /* our sun is very strong, so pick a smaller energy level */
+ lamp->type = LA_SUN;
+ lamp->mode |= LA_NO_SPEC;
+ }
+ break;
+ case COLLADAFW::Light::POINT_LIGHT:
+ {
+ lamp->type = LA_LOCAL;
+ lamp->falloff_type = LA_FALLOFF_INVSQUARE;
+ lamp->att1 = att1;
+ lamp->att2 = att2;
+ }
+ break;
+ case COLLADAFW::Light::UNDEFINED:
+ {
+ fprintf(stderr, "Current lamp type is not supported. \n");
+ lamp->type = LA_LOCAL;
+ }
+ break;
}
-
- this->uid_lamp_map[light->getUniqueId()] = lamp;
- return true;
- }
-
- // this function is called only for animations that pass COLLADAFW::validate
- bool DocumentImporter::writeAnimation( const COLLADAFW::Animation* anim )
- {
- if(mImportStage!=General)
- return true;
-
- // return true;
- return anim_importer.write_animation(anim);
- }
-
- // called on post-process stage after writeVisualScenes
- bool DocumentImporter::writeAnimationList( const COLLADAFW::AnimationList* animationList )
- {
- if(mImportStage!=General)
- return true;
-
- // return true;
- return anim_importer.write_animation_list(animationList);
- }
-
- /** When this method is called, the writer must write the skin controller data.
- @return The writer should return true, if writing succeeded, false otherwise.*/
- bool DocumentImporter::writeSkinControllerData( const COLLADAFW::SkinControllerData* skin )
- {
- return armature_importer.write_skin_controller_data(skin);
}
- // this is called on postprocess, before writeVisualScenes
- bool DocumentImporter::writeController( const COLLADAFW::Controller* controller )
- {
- if(mImportStage!=General)
- return true;
-
- return armature_importer.write_controller(controller);
- }
+ this->uid_lamp_map[light->getUniqueId()] = lamp;
+ return true;
+}
- bool DocumentImporter::writeFormulas( const COLLADAFW::Formulas* formulas )
- {
+// this function is called only for animations that pass COLLADAFW::validate
+bool DocumentImporter::writeAnimation( const COLLADAFW::Animation* anim )
+{
+ if(mImportStage!=General)
return true;
- }
-
- bool DocumentImporter::writeKinematicsScene( const COLLADAFW::KinematicsScene* kinematicsScene )
- {
+
+ // return true;
+ return anim_importer.write_animation(anim);
+}
+
+// called on post-process stage after writeVisualScenes
+bool DocumentImporter::writeAnimationList( const COLLADAFW::AnimationList* animationList )
+{
+ if(mImportStage!=General)
+ return true;
+
+ // return true;
+ return anim_importer.write_animation_list(animationList);
+}
+
+/** When this method is called, the writer must write the skin controller data.
+ @return The writer should return true, if writing succeeded, false otherwise.*/
+bool DocumentImporter::writeSkinControllerData( const COLLADAFW::SkinControllerData* skin )
+{
+ return armature_importer.write_skin_controller_data(skin);
+}
+
+// this is called on postprocess, before writeVisualScenes
+bool DocumentImporter::writeController( const COLLADAFW::Controller* controller )
+{
+ if(mImportStage!=General)
return true;
+
+ return armature_importer.write_controller(controller);
+}
+
+bool DocumentImporter::writeFormulas( const COLLADAFW::Formulas* formulas )
+{
+ return true;
+}
+
+bool DocumentImporter::writeKinematicsScene( const COLLADAFW::KinematicsScene* kinematicsScene )
+{
+ return true;
+}
+
+ExtraTags* DocumentImporter::getExtraTags(const COLLADAFW::UniqueId &uid)
+{
+ if(uid_tags_map.find(uid.toAscii())==uid_tags_map.end()) {
+ return NULL;
}
-
-
+ return uid_tags_map[uid.toAscii()];
+}
+
+bool DocumentImporter::addExtraTags( const COLLADAFW::UniqueId &uid, ExtraTags *extra_tags)
+{
+ uid_tags_map[uid.toAscii()] = extra_tags;
+ return true;
+}
diff --git a/source/blender/collada/DocumentImporter.h b/source/blender/collada/DocumentImporter.h
index e312268c458..e57d621eeef 100644
--- a/source/blender/collada/DocumentImporter.h
+++ b/source/blender/collada/DocumentImporter.h
@@ -45,6 +45,7 @@
#include "AnimationImporter.h"
#include "ArmatureImporter.h"
#include "MeshImporter.h"
+#include "ExtraTags.h"
struct Main;
@@ -53,7 +54,7 @@ struct bContext;
/** Importer class. */
class DocumentImporter : COLLADAFW::IWriter
{
- public:
+public:
//! Enumeration to denote the stage of import
enum ImportStage {
General, //!< First pass to collect all data except controller
@@ -78,8 +79,8 @@ class DocumentImporter : COLLADAFW::IWriter
void translate_anim_recursive(COLLADAFW::Node*, COLLADAFW::Node*, Object*);
/** This method will be called if an error in the loading process occurred and the loader cannot
- continue to load. The writer should undo all operations that have been performed.
- @param errorMessage A message containing informations about the error that occurred.
+ continue to load. The writer should undo all operations that have been performed.
+ @param errorMessage A message containing informations about the error that occurred.
*/
void cancel(const COLLADAFW::String& errorMessage);
@@ -88,7 +89,7 @@ class DocumentImporter : COLLADAFW::IWriter
/** This method is called after the last write* method. No other methods will be called after this.*/
void finish();
-
+
bool writeGlobalAsset(const COLLADAFW::FileInfo*);
bool writeScene(const COLLADAFW::Scene*);
@@ -121,31 +122,41 @@ class DocumentImporter : COLLADAFW::IWriter
bool writeKinematicsScene(const COLLADAFW::KinematicsScene*);
- private:
-
+ /** Add element and data for UniqueId */
+ bool addExtraTags(const COLLADAFW::UniqueId &uid, ExtraTags *extra_tags);
+ /** Get an extisting ExtraTags for uid */
+ ExtraTags* getExtraTags(const COLLADAFW::UniqueId &uid);
+
+private:
+
/** Current import stage we're in. */
ImportStage mImportStage;
std::string mFilename;
- bContext *mContext;
-
- UnitConverter unit_converter;
- ArmatureImporter armature_importer;
- MeshImporter mesh_importer;
- AnimationImporter anim_importer;
-
- std::map<COLLADAFW::UniqueId, Image*> uid_image_map;
- std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
- std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
- std::map<COLLADAFW::UniqueId, Camera*> uid_camera_map;
- std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
- std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
- std::map<COLLADAFW::UniqueId, Object*> object_map;
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> node_map;
- std::vector<const COLLADAFW::VisualScene*> vscenes;
- std::vector<Object*> libnode_ob;
-
- std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map; // find root joint by child joint uid, for bone tree evaluation during resampling
+ bContext *mContext;
+
+ UnitConverter unit_converter;
+ ArmatureImporter armature_importer;
+ MeshImporter mesh_importer;
+ AnimationImporter anim_importer;
+
+ /** TagsMap typedef for uid_tags_map. */
+ typedef std::map<std::string, ExtraTags*> TagsMap;
+ /** Tags map of unique id as a string and ExtraTags instance. */
+ TagsMap uid_tags_map;
+
+ std::map<COLLADAFW::UniqueId, Image*> uid_image_map;
+ std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
+ std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
+ std::map<COLLADAFW::UniqueId, Camera*> uid_camera_map;
+ std::map<COLLADAFW::UniqueId, Lamp*> uid_lamp_map;
+ std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
+ std::map<COLLADAFW::UniqueId, Object*> object_map;
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> node_map;
+ std::vector<const COLLADAFW::VisualScene*> vscenes;
+ std::vector<Object*> libnode_ob;
+
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> root_map; // find root joint by child joint uid, for bone tree evaluation during resampling
};
diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp
index d20cb74ba9f..ff714533199 100644
--- a/source/blender/collada/EffectExporter.cpp
+++ b/source/blender/collada/EffectExporter.cpp
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/EffectExporter.cpp
+ * \ingroup collada
+ */
+
+
#include <map>
#include "COLLADASWEffectProfile.h"
@@ -50,15 +55,66 @@ static std::string getActiveUVLayerName(Object *ob)
return "";
}
-
EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryEffects(sw){}
+
+bool EffectsExporter::hasEffects(Scene *sce)
+{
+ Base *base = (Base *)sce->base.first;
+
+ while(base) {
+ Object *ob= base->object;
+ int a;
+ for(a = 0; a < ob->totcol; a++)
+ {
+ Material *ma = give_current_material(ob, a+1);
+
+ // no material, but check all of the slots
+ if (!ma) continue;
+
+ return true;
+ }
+ base= base->next;
+ }
+ return false;
+}
+
void EffectsExporter::exportEffects(Scene *sce)
{
- openLibrary();
- MaterialFunctor mf;
- mf.forEachMaterialInScene<EffectsExporter>(sce, *this);
+ if(hasEffects(sce)) {
+ openLibrary();
+ MaterialFunctor mf;
+ mf.forEachMaterialInScene<EffectsExporter>(sce, *this);
+
+ closeLibrary();
+ }
+}
+
+void EffectsExporter::writeBlinn(COLLADASW::EffectProfile &ep, Material *ma)
+{
+ COLLADASW::ColorOrTexture cot;
+ ep.setShaderType(COLLADASW::EffectProfile::BLINN);
+ // shininess
+ ep.setShininess(ma->har);
+ // specular
+ cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f);
+ ep.setSpecular(cot);
+}
- closeLibrary();
+void EffectsExporter::writeLambert(COLLADASW::EffectProfile &ep, Material *ma)
+{
+ COLLADASW::ColorOrTexture cot;
+ ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
+}
+
+void EffectsExporter::writePhong(COLLADASW::EffectProfile &ep, Material *ma)
+{
+ COLLADASW::ColorOrTexture cot;
+ ep.setShaderType(COLLADASW::EffectProfile::PHONG);
+ // shininess
+ ep.setShininess(ma->har);
+ // specular
+ cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f);
+ ep.setSpecular(cot);
}
void EffectsExporter::operator()(Material *ma, Object *ob)
@@ -73,20 +129,25 @@ void EffectsExporter::operator()(Material *ma, Object *ob)
ep.setProfileType(COLLADASW::EffectProfile::COMMON);
ep.openProfile();
// set shader type - one of three blinn, phong or lambert
- if (ma->spec_shader == MA_SPEC_BLINN) {
- ep.setShaderType(COLLADASW::EffectProfile::BLINN);
- // shininess
- ep.setShininess(ma->har);
- }
- else if (ma->spec_shader == MA_SPEC_PHONG) {
- ep.setShaderType(COLLADASW::EffectProfile::PHONG);
- // shininess
- ep.setShininess(ma->har);
- }
- else {
- // XXX write warning "Current shader type is not supported"
- ep.setShaderType(COLLADASW::EffectProfile::LAMBERT);
+ if(ma->spec>0.0f) {
+ if (ma->spec_shader == MA_SPEC_BLINN) {
+ writeBlinn(ep, ma);
+ }
+ else {
+ // \todo figure out handling of all spec+diff shader combos blender has, for now write phong
+ // for now set phong in case spec shader is not blinn
+ writePhong(ep, ma);
+ }
+ } else {
+ if(ma->diff_shader == MA_DIFF_LAMBERT) {
+ writeLambert(ep, ma);
+ }
+ else {
+ // \todo figure out handling of all spec+diff shader combos blender has, for now write phong
+ writePhong(ep, ma);
+ }
}
+
// index of refraction
if (ma->mode & MA_RAYTRANSP) {
ep.setIndexOfRefraction(ma->ang);
@@ -258,7 +319,7 @@ void EffectsExporter::operator()(Material *ma, Object *ob)
twoSided = true;
}
if (twoSided)
- ep.addExtraTechniqueParameter("GOOGLEEARTH", "show_double_sided", 1);
+ ep.addExtraTechniqueParameter("GOOGLEEARTH", "double_sided", 1);
ep.addExtraTechniques(mSW);
ep.closeProfile();
diff --git a/source/blender/collada/EffectExporter.h b/source/blender/collada/EffectExporter.h
index 3a3de95458b..2b25d1b889f 100644
--- a/source/blender/collada/EffectExporter.h
+++ b/source/blender/collada/EffectExporter.h
@@ -57,10 +57,15 @@ public:
/*COLLADASW::Surface *surface*/);
COLLADASW::ColorOrTexture getcol(float r, float g, float b, float a);
-
- //returns the array of mtex indices which have image
- //need this for exporting textures
+private:
+ /** Fills the array of mtex indices which have image. Used for exporting images. */
void createTextureIndices(Material *ma, std::vector<int> &indices);
+
+ void writeBlinn(COLLADASW::EffectProfile &ep, Material *ma);
+ void writeLambert(COLLADASW::EffectProfile &ep, Material *ma);
+ void writePhong(COLLADASW::EffectProfile &ep, Material *ma);
+
+ bool hasEffects(Scene *sce);
};
#endif
diff --git a/source/blender/collada/ExtraHandler.cpp b/source/blender/collada/ExtraHandler.cpp
new file mode 100644
index 00000000000..9999a61a470
--- /dev/null
+++ b/source/blender/collada/ExtraHandler.cpp
@@ -0,0 +1,81 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ExtraHandler.cpp
+ * \ingroup collada
+ */
+
+#include <stddef.h>
+#include "BLI_string.h"
+
+#include "ExtraHandler.h"
+
+ExtraHandler::ExtraHandler(DocumentImporter *dimp) : currentExtraTags(0)
+{
+ this->dimp = dimp;
+}
+
+ExtraHandler::~ExtraHandler() {}
+
+bool ExtraHandler::elementBegin( const char* elementName, const char** attributes)
+{
+ // \todo attribute handling for profile tags
+ currentElement = std::string(elementName);
+ return true;
+}
+
+bool ExtraHandler::elementEnd(const char* elementName )
+{
+ return true;
+}
+
+bool ExtraHandler::textData(const char* text, size_t textLength)
+{
+ char buf[1024];
+
+ if(currentElement.length() == 0) return false;
+
+ BLI_snprintf(buf, textLength+1, "%s", text);
+ currentExtraTags->addTag(currentElement, std::string(buf));
+ return true;
+}
+
+bool ExtraHandler::parseElement (
+ const char* profileName,
+ const unsigned long& elementHash,
+ const COLLADAFW::UniqueId& uniqueId ) {
+ if(BLI_strcaseeq(profileName, "blender")) {
+ //printf("In parseElement for supported profile %s for id %s\n", profileName, uniqueId.toAscii().c_str());
+ currentUid = uniqueId;
+ ExtraTags *et = dimp->getExtraTags(uniqueId);
+ if(!et) {
+ et = new ExtraTags(std::string(profileName));
+ dimp->addExtraTags(uniqueId, et);
+ }
+ currentExtraTags = et;
+ return true;
+ }
+ //printf("In parseElement for unsupported profile %s for id %s\n", profileName, uniqueId.toAscii().c_str());
+ return false;
+}
diff --git a/source/blender/collada/ExtraHandler.h b/source/blender/collada/ExtraHandler.h
new file mode 100644
index 00000000000..de3b063290d
--- /dev/null
+++ b/source/blender/collada/ExtraHandler.h
@@ -0,0 +1,77 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ExtraHandler.h
+ * \ingroup collada
+ */
+
+#include <string>
+#include <map>
+#include <vector>
+#include <algorithm> // sort()
+
+#include "COLLADASaxFWLIExtraDataCallbackHandler.h"
+
+#include "DocumentImporter.h"
+
+/** \brief Handler class for <extra> data, through which different
+ * profiles can be handled
+ */
+class ExtraHandler : public COLLADASaxFWL::IExtraDataCallbackHandler
+{
+public:
+ /** Constructor. */
+ ExtraHandler(DocumentImporter *dimp);
+
+ /** Destructor. */
+ virtual ~ExtraHandler();
+
+ /** Handle the beginning of an element. */
+ bool elementBegin( const char* elementName, const char** attributes);
+
+ /** Handle the end of an element. */
+ bool elementEnd(const char* elementName );
+
+ /** Receive the data in text format. */
+ bool textData(const char* text, size_t textLength);
+
+ /** Method to ask, if the current callback handler want to read the data of the given extra element. */
+ bool parseElement (
+ const char* profileName,
+ const unsigned long& elementHash,
+ const COLLADAFW::UniqueId& uniqueId );
+private:
+ /** Disable default copy constructor. */
+ ExtraHandler( const ExtraHandler& pre );
+ /** Disable default assignment operator. */
+ const ExtraHandler& operator= ( const ExtraHandler& pre );
+
+ /** Handle to DocumentImporter for interface to extra element data saving. */
+ DocumentImporter* dimp;
+ /** Holds Id of element for which <extra> XML elements are handled. */
+ COLLADAFW::UniqueId currentUid;
+ ExtraTags* currentExtraTags;
+ std::string currentElement;
+};
+
diff --git a/source/blender/collada/ExtraTags.cpp b/source/blender/collada/ExtraTags.cpp
new file mode 100644
index 00000000000..653d4a377cd
--- /dev/null
+++ b/source/blender/collada/ExtraTags.cpp
@@ -0,0 +1,122 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ExtraTags.cpp
+ * \ingroup collada
+ */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include "BLI_string.h"
+
+#include <iostream>
+
+#include "ExtraTags.h"
+
+ExtraTags::ExtraTags( std::string profile)
+{
+ this->profile = profile;
+ this->tags = std::map<std::string, std::string>();
+}
+
+ExtraTags::~ExtraTags()
+{
+}
+
+bool ExtraTags::isProfile( std::string profile)
+{
+ return this->profile == profile;
+}
+
+bool ExtraTags::addTag( std::string tag, std::string data)
+{
+ tags[tag] = data;
+
+ return true;
+}
+
+int ExtraTags::asInt( std::string tag, bool *ok)
+{
+ if(tags.find(tag) == tags.end()) {
+ *ok = false;
+ return -1;
+ }
+ *ok = true;
+ return atoi(tags[tag].c_str());
+}
+
+float ExtraTags::asFloat( std::string tag, bool *ok)
+{
+ if(tags.find(tag) == tags.end()) {
+ *ok = false;
+ return -1.0f;
+ }
+ *ok = true;
+ return (float)atof(tags[tag].c_str());
+}
+
+std::string ExtraTags::asString( std::string tag, bool *ok)
+{
+ if(tags.find(tag) == tags.end()) {
+ *ok = false;
+ return "";
+ }
+ *ok = true;
+ return tags[tag];
+}
+
+
+void ExtraTags::setData(std::string tag, short *data)
+{
+ bool ok = false;
+ int tmp = 0;
+ tmp = asInt(tag, &ok);
+ if(ok)
+ *data = (short)tmp;
+}
+void ExtraTags::setData(std::string tag, int *data)
+{
+ bool ok = false;
+ int tmp = 0;
+ tmp = asInt(tag, &ok);
+ if(ok)
+ *data = tmp;
+}
+void ExtraTags::setData(std::string tag, float *data)
+{
+ bool ok = false;
+ float tmp = 0.0f;
+ tmp = asFloat(tag, &ok);
+ if(ok)
+ *data = tmp;
+}
+void ExtraTags::setData(std::string tag, char *data)
+{
+ bool ok = false;
+ int tmp = 0;
+ tmp = asInt(tag, &ok);
+ if(ok)
+ *data = (char)tmp;
+}
+
diff --git a/source/blender/collada/ExtraTags.h b/source/blender/collada/ExtraTags.h
new file mode 100644
index 00000000000..710d26e8cad
--- /dev/null
+++ b/source/blender/collada/ExtraTags.h
@@ -0,0 +1,80 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Nathan Letwory.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/ExtraTags.h
+ * \ingroup collada
+ */
+
+#include <string>
+#include <map>
+#include <vector>
+
+/** \brief Class for saving <extra> tags for a specific UniqueId.
+ */
+class ExtraTags
+{
+public:
+ /** Constructor. */
+ ExtraTags(const std::string profile);
+
+ /** Destructor. */
+ virtual ~ExtraTags();
+
+ /** Handle the beginning of an element. */
+ bool addTag(std::string tag, std::string data);
+
+ /** Set given short pointer to value of tag, if it exists. */
+ void setData(std::string tag, short *data);
+
+ /** Set given int pointer to value of tag, if it exists. */
+ void setData(std::string tag, int *data);
+
+ /** Set given float pointer to value of tag, if it exists. */
+ void setData(std::string tag, float *data);
+
+ /** Set given char pointer to value of tag, if it exists. */
+ void setData(std::string tag, char *data);
+
+ /** Return true if the extra tags is for specified profile. */
+ bool isProfile(std::string profile);
+
+private:
+ /** Disable default copy constructor. */
+ ExtraTags( const ExtraTags& pre );
+ /** Disable default assignment operator. */
+ const ExtraTags& operator= ( const ExtraTags& pre );
+
+ /** The profile for which the tags are. */
+ std::string profile;
+
+ /** Map of tag and text pairs. */
+ std::map<std::string, std::string> tags;
+
+ /** Get text data for tag as an int. */
+ int asInt(std::string tag, bool *ok);
+ /** Get text data for tag as a float. */
+ float asFloat(std::string tag, bool *ok);
+ /** Get text data for tag as a string. */
+ std::string asString(std::string tag, bool *ok);
+};
diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp
index a637bdc5155..5df5ab99b91 100644
--- a/source/blender/collada/GeometryExporter.cpp
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -23,6 +23,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/GeometryExporter.cpp
+ * \ingroup collada
+ */
+
+
+#include <sstream>
+
#include "COLLADASWPrimitves.h"
#include "COLLADASWSource.h"
#include "COLLADASWVertices.h"
@@ -109,6 +116,11 @@ void GeometryExporter::operator()(Object *ob)
}
closeMesh();
+
+ if (me->flag & ME_TWOSIDED) {
+ mSW->appendTextBlock("<extra><technique profile=\"MAYA\"><double_sided>1</double_sided></technique></extra>");
+ }
+
closeGeometry();
#if 0
@@ -162,7 +174,9 @@ void GeometryExporter::createPolylist(int material_index,
// sets material name
if (ma) {
- polylist.setMaterial(translate_id(id_name(ma)));
+ std::ostringstream ostr;
+ ostr << translate_id(id_name(ma)) << material_index+1;
+ polylist.setMaterial(ostr.str());
}
COLLADASW::InputList &til = polylist.getInputList();
diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp
index e87f6208d59..b7a5ef4c4e4 100644
--- a/source/blender/collada/ImageExporter.cpp
+++ b/source/blender/collada/ImageExporter.cpp
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/ImageExporter.cpp
+ * \ingroup collada
+ */
+
+
#include "COLLADABUURI.h"
#include "COLLADASWImage.h"
@@ -41,13 +46,40 @@
ImagesExporter::ImagesExporter(COLLADASW::StreamWriter *sw, const char* filename) : COLLADASW::LibraryImages(sw), mfilename(filename)
{}
+bool ImagesExporter::hasImages(Scene *sce)
+{
+ Base *base = (Base *)sce->base.first;
+
+ while(base) {
+ Object *ob= base->object;
+ int a;
+ for(a = 0; a < ob->totcol; a++)
+ {
+ Material *ma = give_current_material(ob, a+1);
+
+ // no material, but check all of the slots
+ if (!ma) continue;
+ int b;
+ for (b = 0; b < MAX_MTEX; b++) {
+ MTex *mtex = ma->mtex[b];
+ if (mtex && mtex->tex && mtex->tex->ima) return true;
+ }
+
+ }
+ base= base->next;
+ }
+ return false;
+}
+
void ImagesExporter::exportImages(Scene *sce)
{
- openLibrary();
- MaterialFunctor mf;
- mf.forEachMaterialInScene<ImagesExporter>(sce, *this);
+ if(hasImages(sce)) {
+ openLibrary();
+ MaterialFunctor mf;
+ mf.forEachMaterialInScene<ImagesExporter>(sce, *this);
- closeLibrary();
+ closeLibrary();
+ }
}
void ImagesExporter::operator()(Material *ma, Object *ob)
diff --git a/source/blender/collada/ImageExporter.h b/source/blender/collada/ImageExporter.h
index 901e6be3ecb..04e3010dc7a 100644
--- a/source/blender/collada/ImageExporter.h
+++ b/source/blender/collada/ImageExporter.h
@@ -49,6 +49,8 @@ public:
void exportImages(Scene *sce);
void operator()(Material *ma, Object *ob);
+private:
+ bool hasImages(Scene *sce);
};
#endif
diff --git a/source/blender/collada/InstanceWriter.cpp b/source/blender/collada/InstanceWriter.cpp
index a135b51f025..a069e72fbbd 100644
--- a/source/blender/collada/InstanceWriter.cpp
+++ b/source/blender/collada/InstanceWriter.cpp
@@ -23,7 +23,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/InstanceWriter.cpp
+ * \ingroup collada
+ */
+
+
#include <string>
+#include <sstream>
#include "COLLADASWInstanceMaterial.h"
@@ -45,9 +51,11 @@ void InstanceWriter::add_material_bindings(COLLADASW::BindMaterial& bind_materia
COLLADASW::InstanceMaterialList& iml = bind_material.getInstanceMaterialList();
if (ma) {
- std::string matid(id_name(ma));
+ std::string matid(get_material_id(ma));
matid = translate_id(matid);
- COLLADASW::InstanceMaterial im(matid, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid));
+ std::ostringstream ostr;
+ ostr << translate_id(id_name(ma)) << a+1;
+ COLLADASW::InstanceMaterial im(ostr.str(), COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, matid));
// create <bind_vertex_input> for each uv layer
Mesh *me = (Mesh*)ob->data;
diff --git a/source/blender/collada/LightExporter.cpp b/source/blender/collada/LightExporter.cpp
index d13a053b8fe..89599c62768 100644
--- a/source/blender/collada/LightExporter.cpp
+++ b/source/blender/collada/LightExporter.cpp
@@ -23,13 +23,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/LightExporter.cpp
+ * \ingroup collada
+ */
+
#include <string>
#include "COLLADASWColor.h"
#include "COLLADASWLight.h"
-#include "DNA_lamp_types.h"
-
#include "BLI_math.h"
#include "LightExporter.h"
@@ -64,32 +66,22 @@ void LightsExporter::operator()(Object *ob)
Lamp *la = (Lamp*)ob->data;
std::string la_id(get_light_id(ob));
std::string la_name(id_name(la));
- COLLADASW::Color col(la->r, la->g, la->b);
- float att1, att2;
+ COLLADASW::Color col(la->r * la->energy, la->g * la->energy, la->b * la->energy);
float e, d, constatt, linatt, quadatt;
- att1 = att2 = 0.0f;
+ float r;
- if(la->falloff_type==LA_FALLOFF_INVLINEAR) {
- att1 = 1.0f;
- att2 = 0.0f;
- }
- else if(la->falloff_type==LA_FALLOFF_INVSQUARE) {
- att1 = 0.0f;
- att2 = 1.0f;
- }
- else if(la->falloff_type==LA_FALLOFF_SLIDERS) {
- att1 = la->att1;
- att2 = la->att2;
- }
-
- e = la->energy;
d = la->dist;
+ r = d/2.0f;
+
+ constatt = 1.0f;
- constatt = linatt = quadatt = MAXFLOAT;
- if(e > 0.0f) {
- constatt = 1.0f/e;
- linatt = att1/(d*e);
- quadatt = att2/(d*d*(e*2));
+ if(la->falloff_type==LA_FALLOFF_INVLINEAR) {
+ linatt = 1.0f / r;
+ quadatt = 0.0f;
+ }
+ else {
+ linatt = 0.0f;
+ quadatt = 1.0f / r;
}
// sun
@@ -97,6 +89,7 @@ void LightsExporter::operator()(Object *ob)
COLLADASW::DirectionalLight cla(mSW, la_id, la_name, e);
cla.setColor(col);
cla.setConstantAttenuation(constatt);
+ exportBlenderProfile(cla, la);
addLight(cla);
}
// hemi
@@ -104,6 +97,7 @@ void LightsExporter::operator()(Object *ob)
COLLADASW::AmbientLight cla(mSW, la_id, la_name, e);
cla.setColor(col);
cla.setConstantAttenuation(constatt);
+ exportBlenderProfile(cla, la);
addLight(cla);
}
// spot
@@ -115,6 +109,7 @@ void LightsExporter::operator()(Object *ob)
cla.setConstantAttenuation(constatt);
cla.setLinearAttenuation(linatt);
cla.setQuadraticAttenuation(quadatt);
+ exportBlenderProfile(cla, la);
addLight(cla);
}
// lamp
@@ -124,6 +119,7 @@ void LightsExporter::operator()(Object *ob)
cla.setConstantAttenuation(constatt);
cla.setLinearAttenuation(linatt);
cla.setQuadraticAttenuation(quadatt);
+ exportBlenderProfile(cla, la);
addLight(cla);
}
// area lamp is not supported
@@ -134,6 +130,70 @@ void LightsExporter::operator()(Object *ob)
cla.setConstantAttenuation(constatt);
cla.setLinearAttenuation(linatt);
cla.setQuadraticAttenuation(quadatt);
+ exportBlenderProfile(cla, la);
addLight(cla);
}
+
+}
+
+bool LightsExporter::exportBlenderProfile(COLLADASW::Light &cla, Lamp *la)
+{
+ cla.addExtraTechniqueParameter("blender", "type", la->type);
+ cla.addExtraTechniqueParameter("blender", "flag", la->flag);
+ cla.addExtraTechniqueParameter("blender", "mode", la->mode);
+ cla.addExtraTechniqueParameter("blender", "gamma", la->k);
+ cla.addExtraTechniqueParameter("blender", "red", la->r);
+ cla.addExtraTechniqueParameter("blender", "green", la->g);
+ cla.addExtraTechniqueParameter("blender", "blue", la->b);
+ cla.addExtraTechniqueParameter("blender", "shadow_r", la->shdwr);
+ cla.addExtraTechniqueParameter("blender", "shadow_g", la->shdwg);
+ cla.addExtraTechniqueParameter("blender", "shadow_b", la->shdwb);
+ cla.addExtraTechniqueParameter("blender", "energy", la->energy);
+ cla.addExtraTechniqueParameter("blender", "dist", la->dist);
+ cla.addExtraTechniqueParameter("blender", "spotsize", la->spotsize);
+ cla.addExtraTechniqueParameter("blender", "spotblend", la->spotblend);
+ cla.addExtraTechniqueParameter("blender", "halo_intensity", la->haint);
+ cla.addExtraTechniqueParameter("blender", "att1", la->att1);
+ cla.addExtraTechniqueParameter("blender", "att2", la->att2);
+ // \todo figure out how we can have falloff curve supported here
+ cla.addExtraTechniqueParameter("blender", "falloff_type", la->falloff_type);
+ cla.addExtraTechniqueParameter("blender", "clipsta", la->clipsta);
+ cla.addExtraTechniqueParameter("blender", "clipend", la->clipend);
+ cla.addExtraTechniqueParameter("blender", "shadspotsize", la->shadspotsize);
+ cla.addExtraTechniqueParameter("blender", "bias", la->bias);
+ cla.addExtraTechniqueParameter("blender", "soft", la->soft);
+ cla.addExtraTechniqueParameter("blender", "compressthresh", la->compressthresh);
+ cla.addExtraTechniqueParameter("blender", "bufsize", la->bufsize);
+ cla.addExtraTechniqueParameter("blender", "samp", la->samp);
+ cla.addExtraTechniqueParameter("blender", "buffers", la->buffers);
+ cla.addExtraTechniqueParameter("blender", "filtertype", la->filtertype);
+ cla.addExtraTechniqueParameter("blender", "bufflag", la->bufflag);
+ cla.addExtraTechniqueParameter("blender", "buftype", la->buftype);
+ cla.addExtraTechniqueParameter("blender", "ray_samp", la->ray_samp);
+ cla.addExtraTechniqueParameter("blender", "ray_sampy", la->ray_sampy);
+ cla.addExtraTechniqueParameter("blender", "ray_sampz", la->ray_sampz);
+ cla.addExtraTechniqueParameter("blender", "ray_samp_type", la->ray_samp_type);
+ cla.addExtraTechniqueParameter("blender", "area_shape", la->area_shape);
+ cla.addExtraTechniqueParameter("blender", "area_size", la->area_size);
+ cla.addExtraTechniqueParameter("blender", "area_sizey", la->area_sizey);
+ cla.addExtraTechniqueParameter("blender", "area_sizez", la->area_sizez);
+ cla.addExtraTechniqueParameter("blender", "adapt_thresh", la->adapt_thresh);
+ cla.addExtraTechniqueParameter("blender", "ray_samp_method", la->ray_samp_method);
+ cla.addExtraTechniqueParameter("blender", "shadhalostep", la->shadhalostep);
+ cla.addExtraTechniqueParameter("blender", "sun_effect_type", la->shadhalostep);
+ cla.addExtraTechniqueParameter("blender", "skyblendtype", la->skyblendtype);
+ cla.addExtraTechniqueParameter("blender", "horizon_brightness", la->horizon_brightness);
+ cla.addExtraTechniqueParameter("blender", "spread", la->spread);
+ cla.addExtraTechniqueParameter("blender", "sun_brightness", la->sun_brightness);
+ cla.addExtraTechniqueParameter("blender", "sun_size", la->sun_size);
+ cla.addExtraTechniqueParameter("blender", "backscattered_light", la->backscattered_light);
+ cla.addExtraTechniqueParameter("blender", "sun_intensity", la->sun_intensity);
+ cla.addExtraTechniqueParameter("blender", "atm_turbidity", la->atm_turbidity);
+ cla.addExtraTechniqueParameter("blender", "atm_extinction_factor", la->atm_extinction_factor);
+ cla.addExtraTechniqueParameter("blender", "atm_distance_factor", la->atm_distance_factor);
+ cla.addExtraTechniqueParameter("blender", "skyblendfac", la->skyblendfac);
+ cla.addExtraTechniqueParameter("blender", "sky_exposure", la->sky_exposure);
+ cla.addExtraTechniqueParameter("blender", "sky_colorspace", la->sky_colorspace);
+
+ return true;
}
diff --git a/source/blender/collada/LightExporter.h b/source/blender/collada/LightExporter.h
index 685a50ff17e..3706582e52c 100644
--- a/source/blender/collada/LightExporter.h
+++ b/source/blender/collada/LightExporter.h
@@ -33,6 +33,7 @@
#include "COLLADASWStreamWriter.h"
#include "COLLADASWLibraryLights.h"
+#include "DNA_lamp_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -42,6 +43,8 @@ public:
LightsExporter(COLLADASW::StreamWriter *sw);
void exportLights(Scene *sce);
void operator()(Object *ob);
+private:
+ bool exportBlenderProfile(COLLADASW::Light &cla, Lamp *la);
};
#endif
diff --git a/source/blender/collada/MaterialExporter.cpp b/source/blender/collada/MaterialExporter.cpp
index a0d66e6467d..0030f2a6285 100644
--- a/source/blender/collada/MaterialExporter.cpp
+++ b/source/blender/collada/MaterialExporter.cpp
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/MaterialExporter.cpp
+ * \ingroup collada
+ */
+
+
#include "MaterialExporter.h"
#include "COLLADABUUtils.h"
@@ -44,7 +49,7 @@ void MaterialsExporter::operator()(Material *ma, Object *ob)
{
std::string name(id_name(ma));
- openMaterial(translate_id(name), name);
+ openMaterial(get_material_id(ma), name);
std::string efid = translate_id(name) + "-effect";
addInstanceEffect(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, efid));
diff --git a/source/blender/collada/MeshImporter.cpp b/source/blender/collada/MeshImporter.cpp
index d458b47885f..b6576858c51 100644
--- a/source/blender/collada/MeshImporter.cpp
+++ b/source/blender/collada/MeshImporter.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/MeshImporter.cpp
+ * \ingroup collada
+ */
+
+
#include <algorithm>
#if !defined(WIN32) || defined(FREE_WINDOWS)
@@ -160,7 +165,7 @@ void UVDataWrapper::getUV(int uv_index[2], float *uv)
}
break;
- case COLLADAFW::MeshVertexData::DATA_TYPE_UNKNOWN:
+ case COLLADAFW::MeshVertexData::DATA_TYPE_UNKNOWN:
default:
fprintf(stderr, "MeshImporter.getUV(): unknown data type\n");
}
@@ -273,7 +278,7 @@ void MeshImporter::print_index_list(COLLADAFW::IndexList& index_list)
}
#endif
-bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh)
+bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh) // checks if mesh has supported primitive types: polylist, triangles, triangle_fans
{
COLLADAFW::MeshPrimitiveArray& prim_arr = mesh->getMeshPrimitives();
@@ -302,7 +307,7 @@ bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh)
}
}
- else if(type != COLLADAFW::MeshPrimitive::TRIANGLES) {
+ else if(type != COLLADAFW::MeshPrimitive::TRIANGLES && type!= COLLADAFW::MeshPrimitive::TRIANGLE_FANS) {
fprintf(stderr, "Primitive type %s is not supported.\n", type_str);
return false;
}
@@ -421,7 +426,7 @@ int MeshImporter::count_new_tris(COLLADAFW::Mesh *mesh, Mesh *me)
}
// TODO: import uv set names
-void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris)
+void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris) //TODO:: Refactor. Possibly replace by iterators
{
unsigned int i;
@@ -473,6 +478,12 @@ void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris)
size_t prim_totface = mp->getFaceCount();
unsigned int *indices = mp->getPositionIndices().getData();
unsigned int *nind = mp->getNormalIndices().getData();
+
+ if (has_normals && mp->getPositionIndices().getCount() != mp->getNormalIndices().getCount()) {
+ fprintf(stderr, "Warning: Number of normals is different from the number of vertcies, skipping normals\n");
+ has_normals = false;
+ }
+
unsigned int j, k;
int type = mp->getPrimitiveType();
int index = 0;
@@ -527,6 +538,43 @@ void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris)
prim.totface++;
}
}
+
+ // If MeshPrimitive is TRIANGLE_FANS we split it into triangles
+ // The first trifan vertex will be the first vertex in every triangle
+ if (type == COLLADAFW::MeshPrimitive::TRIANGLE_FANS) {
+ unsigned grouped_vertex_count = mp->getGroupedVertexElementsCount();
+ for (unsigned int group_index = 0; group_index < grouped_vertex_count; group_index++){
+ unsigned int first_vertex = indices[0]; // Store first trifan vertex
+ unsigned int first_normal = nind[0]; // Store first trifan vertex normal
+ unsigned int vertex_count = mp->getGroupedVerticesVertexCount(group_index);
+
+ for (unsigned int vertex_index = 0; vertex_index < vertex_count - 2; vertex_index++){
+ // For each triangle store indeces of its 3 vertices
+ unsigned int triangle_vertex_indices[3]={first_vertex, indices[1], indices[2]};
+ set_face_indices(mface, triangle_vertex_indices, false);
+ test_index_face(mface, &me->fdata, face_index, 3);
+
+ if (has_normals) { // vertex normals, same inplementation as for the triangles
+ // the same for vertces normals
+ unsigned int vertex_normal_indices[3]={first_normal, nind[1], nind[2]};
+ if (!flat_face(vertex_normal_indices, nor, 3))
+ mface->flag |= ME_SMOOTH;
+ nind++;
+ }
+
+ mface++; // same inplementation as for the triangles
+ indices++;
+ face_index++;
+ prim.totface++;
+ }
+
+ // Moving cursor to the next triangle fan.
+ if (has_normals)
+ nind += 2;
+
+ indices += 2;
+ }
+ }
else if (type == COLLADAFW::MeshPrimitive::POLYLIST || type == COLLADAFW::MeshPrimitive::POLYGONS) {
COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
COLLADAFW::Polygons::VertexCountArray& vcounta = mpvc->getGroupedVerticesVertexCountArray();
@@ -755,6 +803,18 @@ MTFace *MeshImporter::assign_material_to_geom(COLLADAFW::MaterialBinding cmateri
return NULL;
}
+ // different nodes can point to same geometry, but still also specify the same materials
+ // again. Make sure we don't overwrite them on the next occurrences, so keep list of
+ // what we already have handled.
+ std::multimap<COLLADAFW::UniqueId, COLLADAFW::UniqueId>::iterator it;
+ it=materials_mapped_to_geom.find(*geom_uid);
+ while(it!=materials_mapped_to_geom.end()) {
+ if(it->second == ma_uid) return NULL; // do nothing if already found
+ it++;
+ }
+ // first time we get geom_uid, ma_uid pair. Save for later check.
+ materials_mapped_to_geom.insert(std::pair<COLLADAFW::UniqueId, COLLADAFW::UniqueId>(*geom_uid, ma_uid));
+
Material *ma = uid_material_map[ma_uid];
assign_material(ob, ma, ob->totcol + 1);
@@ -864,9 +924,13 @@ Object *MeshImporter::create_mesh_object(COLLADAFW::Node *node, COLLADAFW::Insta
// loop through geom's materials
for (unsigned int i = 0; i < mat_array.getCount(); i++) {
- texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, geom_uid,
- &color_texture, layername, texture_face,
- material_texture_mapping_map, i);
+ if(mat_array[i].getReferencedMaterial().isValid()) {
+ texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, geom_uid,
+ &color_texture, layername, texture_face,
+ material_texture_mapping_map, i);
+ } else {
+ fprintf(stderr, "invalid referenced material for %s\n", mat_array[i].getName().c_str());
+ }
}
return ob;
diff --git a/source/blender/collada/MeshImporter.h b/source/blender/collada/MeshImporter.h
index 1a9f698a7ce..20fdb0dcc6e 100644
--- a/source/blender/collada/MeshImporter.h
+++ b/source/blender/collada/MeshImporter.h
@@ -91,6 +91,7 @@ private:
};
typedef std::map<COLLADAFW::MaterialId, std::vector<Primitive> > MaterialIdPrimitiveArrayMap;
std::map<COLLADAFW::UniqueId, MaterialIdPrimitiveArrayMap> geom_uid_mat_mapping_map; // crazy name!
+ std::multimap<COLLADAFW::UniqueId, COLLADAFW::UniqueId> materials_mapped_to_geom; //< materials that have already been mapped to a geometry. A pair of geom uid and mat uid, one geometry can have several materials
void set_face_indices(MFace *mface, unsigned int *indices, bool quad);
diff --git a/source/blender/collada/SConscript b/source/blender/collada/SConscript
index 10c3fcaeb96..3dd6160c445 100644
--- a/source/blender/collada/SConscript
+++ b/source/blender/collada/SConscript
@@ -33,9 +33,9 @@ defs = []
# TODO sanitize inc path building
# relative paths to include dirs, space-separated, string
if env['OURPLATFORM']=='darwin':
- incs = '../blenlib ../blenkernel ../windowmanager ../blenloader ../makesdna ../makesrna ../editors/include ../../../intern/guardedalloc [OPENCOLLADA]/COLLADAStreamWriter [OPENCOLLADA]/COLLADABaseUtils [OPENCOLLADA]/COLLADAFramework [OPENCOLLADA]/COLLADASaxFrameworkLoader '.replace('[OPENCOLLADA]', env['BF_OPENCOLLADA_INC'])
+ incs = '../blenlib ../blenkernel ../windowmanager ../blenloader ../makesdna ../makesrna ../editors/include ../../../intern/guardedalloc [OPENCOLLADA]/COLLADAStreamWriter [OPENCOLLADA]/COLLADABaseUtils [OPENCOLLADA]/COLLADAFramework [OPENCOLLADA]/COLLADASaxFrameworkLoader [OPENCOLLADA]/GeneratedSaxParser '.replace('[OPENCOLLADA]', env['BF_OPENCOLLADA_INC'])
else:
- incs = '../blenlib ../blenkernel ../windowmanager ../makesdna ../blenloader ../makesrna ../editors/include ../../../intern/guardedalloc [OPENCOLLADA]/COLLADAStreamWriter/include [OPENCOLLADA]/COLLADABaseUtils/include [OPENCOLLADA]/COLLADAFramework/include [OPENCOLLADA]/COLLADASaxFrameworkLoader/include '.replace('[OPENCOLLADA]', env['BF_OPENCOLLADA_INC'])
+ incs = '../blenlib ../blenkernel ../windowmanager ../makesdna ../blenloader ../makesrna ../editors/include ../../../intern/guardedalloc [OPENCOLLADA]/COLLADAStreamWriter/include [OPENCOLLADA]/COLLADABaseUtils/include [OPENCOLLADA]/COLLADAFramework/include [OPENCOLLADA]/COLLADASaxFrameworkLoader/include [OPENCOLLADA]/GeneratedSaxParser/include '.replace('[OPENCOLLADA]', env['BF_OPENCOLLADA_INC'])
if env['BF_BUILDINFO']:
defs.append('NAN_BUILDINFO')
diff --git a/source/blender/collada/SkinInfo.cpp b/source/blender/collada/SkinInfo.cpp
index 3e778e09ddf..10780de2e70 100644
--- a/source/blender/collada/SkinInfo.cpp
+++ b/source/blender/collada/SkinInfo.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/SkinInfo.cpp
+ * \ingroup collada
+ */
+
+
#include <algorithm>
#if !defined(WIN32) || defined(FREE_WINDOWS)
diff --git a/source/blender/collada/TransformReader.cpp b/source/blender/collada/TransformReader.cpp
index 04711775f14..3d624520e53 100644
--- a/source/blender/collada/TransformReader.cpp
+++ b/source/blender/collada/TransformReader.cpp
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/collada/TransformReader.cpp
+ * \ingroup collada
+ */
+
/* COLLADABU_ASSERT, may be able to remove later */
#include "COLLADABUPlatform.h"
diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp
index c74f23599e8..8638e16e1c2 100644
--- a/source/blender/collada/TransformWriter.cpp
+++ b/source/blender/collada/TransformWriter.cpp
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/TransformWriter.cpp
+ * \ingroup collada
+ */
+
+
#include "BKE_object.h"
#include "TransformWriter.h"
diff --git a/source/blender/collada/collada.cpp b/source/blender/collada/collada.cpp
index e285197f8f7..0d822c63094 100644
--- a/source/blender/collada/collada.cpp
+++ b/source/blender/collada/collada.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/collada.cpp
+ * \ingroup collada
+ */
+
+
/* COLLADABU_ASSERT, may be able to remove later */
#include "COLLADABUPlatform.h"
diff --git a/source/blender/collada/collada_internal.cpp b/source/blender/collada/collada_internal.cpp
index b3ac62bb6a4..4f4d16d3b0d 100644
--- a/source/blender/collada/collada_internal.cpp
+++ b/source/blender/collada/collada_internal.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/collada_internal.cpp
+ * \ingroup collada
+ */
+
+
/* COLLADABU_ASSERT, may be able to remove later */
#include "COLLADABUPlatform.h"
@@ -267,3 +272,22 @@ std::string get_camera_id(Object *ob)
{
return translate_id(id_name(ob)) + "-camera";
}
+
+std::string get_material_id(Material *mat)
+{
+ return translate_id(id_name(mat)) + "-material";
+}
+
+bool has_object_type(Scene *sce, short obtype)
+{
+ Base *base= (Base*) sce->base.first;
+ while(base) {
+ Object *ob = base->object;
+
+ if (ob->type == obtype && ob->data) {
+ return true;
+ }
+ base= base->next;
+ }
+ return false;
+}
diff --git a/source/blender/collada/collada_internal.h b/source/blender/collada/collada_internal.h
index 815113400b4..70912dde457 100644
--- a/source/blender/collada/collada_internal.h
+++ b/source/blender/collada/collada_internal.h
@@ -37,7 +37,9 @@
#include "Math/COLLADABUMathMatrix4.h"
#include "DNA_armature_types.h"
+#include "DNA_material_types.h"
#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
#include "BLI_math.h"
class UnitConverter
@@ -94,4 +96,8 @@ extern std::string get_joint_id(Bone *bone, Object *ob_arm);
extern std::string get_camera_id(Object *ob);
+extern std::string get_material_id(Material *mat);
+
+extern bool has_object_type(Scene* sce, short obtype);
+
#endif /* COLLADA_INTERNAL_H */
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp
index 31ef8064b1f..d85be814102 100644
--- a/source/blender/collada/collada_utils.cpp
+++ b/source/blender/collada/collada_utils.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/collada/collada_utils.cpp
+ * \ingroup collada
+ */
+
+
/* COLLADABU_ASSERT, may be able to remove later */
#include "COLLADABUPlatform.h"
diff --git a/source/blender/editors/animation/CMakeLists.txt b/source/blender/editors/animation/CMakeLists.txt
index f506d278cae..8fc1ec429cc 100644
--- a/source/blender/editors/animation/CMakeLists.txt
+++ b/source/blender/editors/animation/CMakeLists.txt
@@ -28,6 +28,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/animation/anim_channels_defines.c b/source/blender/editors/animation/anim_channels_defines.c
index 1e2112bf82f..383e35a5760 100644
--- a/source/blender/editors/animation/anim_channels_defines.c
+++ b/source/blender/editors/animation/anim_channels_defines.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/anim_channels_defines.c
+ * \ingroup edanimation
+ */
+
+
#include <stdio.h>
#include "MEM_guardedalloc.h"
@@ -3364,7 +3369,7 @@ void ANIM_channel_draw_widgets (bAnimContext *ac, bAnimListElem *ale, uiBlock *b
uiBut *but;
/* create the slider button, and assign relevant callback to ensure keyframes are inserted... */
- but= uiDefAutoButR(block, &ptr, prop, array_index, "", ICON_NULL, (int)v2d->cur.xmax-offset, ymid, SLIDER_WIDTH, (int)ymaxc-yminc);
+ but= uiDefAutoButR(block, &ptr, prop, array_index, "", ICON_NONE, (int)v2d->cur.xmax-offset, ymid, SLIDER_WIDTH, (int)ymaxc-yminc);
/* assign keyframing function according to slider type */
if (ale->type == ANIMTYPE_SHAPEKEY)
diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c
index aa09cd0ac01..0845014c99e 100644
--- a/source/blender/editors/animation/anim_channels_edit.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/anim_channels_edit.c
+ * \ingroup edanimation
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -1682,7 +1687,16 @@ static int animchannels_enable_exec (bContext *C, wmOperator *UNUSED(op))
/* loop through filtered data and clean curves */
for (ale= anim_data.first; ale; ale= ale->next) {
FCurve *fcu = (FCurve *)ale->data;
+
+ /* remove disabled flags from F-Curves */
fcu->flag &= ~FCURVE_DISABLED;
+
+ /* for drivers, let's do the same too */
+ if (fcu->driver)
+ fcu->driver->flag &= ~DRIVER_FLAG_INVALID;
+
+ /* tag everything for updates - in particular, this is needed to get drivers working again */
+ ANIM_list_elem_update(ac.scene, ale);
}
/* free temp data */
diff --git a/source/blender/editors/animation/anim_deps.c b/source/blender/editors/animation/anim_deps.c
index be4110c68b9..b5a1781064c 100644
--- a/source/blender/editors/animation/anim_deps.c
+++ b/source/blender/editors/animation/anim_deps.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/anim_deps.c
+ * \ingroup edanimation
+ */
+
+
#include <string.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/editors/animation/anim_draw.c b/source/blender/editors/animation/anim_draw.c
index 9b307b92bec..9c923d3492b 100644
--- a/source/blender/editors/animation/anim_draw.c
+++ b/source/blender/editors/animation/anim_draw.c
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/animation/anim_draw.c
+ * \ingroup edanimation
+ */
+
#include "BLO_sys_types.h"
#include "DNA_anim_types.h"
@@ -95,7 +100,7 @@ void ANIM_timecode_string_from_frame (char *str, Scene *scene, int power, short
* to cope with 'half' frames, etc., which should be fine in most cases
*/
seconds= (int)cfra;
- frames= (int)floor( ((cfra - seconds) * FPS) + 0.5f );
+ frames= (int)floor( (((double)cfra - (double)seconds) * FPS) + 0.5 );
}
else {
/* seconds (with pixel offset rounding) */
@@ -394,9 +399,9 @@ float ANIM_unit_mapping_get_factor (Scene *scene, ID *id, FCurve *fcu, short res
/* if the radians flag is not set, default to using degrees which need conversions */
if ((scene) && (scene->unit.system_rotation == USER_UNIT_ROT_RADIANS) == 0) {
if (restore)
- return M_PI / 180.0f; /* degrees to radians */
+ return M_PI / 180.0; /* degrees to radians */
else
- return 180.0f / M_PI; /* radians to degrees */
+ return 180.0 / M_PI; /* radians to degrees */
}
}
@@ -465,7 +470,7 @@ void ANIM_unit_mapping_apply_fcurve (Scene *scene, ID *id, FCurve *fcu, short fl
// TODO: only sel?
if (fcu->fpt) {
FPoint *fpt;
- int i;
+ unsigned int i;
for (i=0, fpt=fcu->fpt; i < fcu->totvert; i++, fpt++) {
/* apply unit mapping */
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index dd406acff79..cca4fdbe331 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/anim_filter.c
+ * \ingroup edanimation
+ */
+
+
/* This file contains a system used to provide a layer of abstraction between sources
* of animation data and tools in Animation Editors. The method used here involves
* generating a list of edit structures which enable tools to naively perform the actions
@@ -799,7 +804,9 @@ static bAnimListElem *make_new_animlistelem (void *data, short datatype, void *o
/* ----------------------------------------- */
-/* NOTE: when this function returns true, the F-Curve is to be skipped */
+/* 'Only Selected' selected data filtering
+ * NOTE: when this function returns true, the F-Curve is to be skipped
+ */
static int skip_fcurve_selected_data (bDopeSheet *ads, FCurve *fcu, ID *owner_id, int filter_mode)
{
if (GS(owner_id->name) == ID_OB) {
@@ -871,6 +878,37 @@ static int skip_fcurve_selected_data (bDopeSheet *ads, FCurve *fcu, ID *owner_id
return 0;
}
+/* (Display-)Name-based F-Curve filtering
+ * NOTE: when this function returns true, the F-Curve is to be skipped
+ */
+static short skip_fcurve_with_name (bDopeSheet *ads, FCurve *fcu, ID *owner_id)
+{
+ bAnimListElem ale_dummy = {0};
+ bAnimChannelType *acf;
+
+ /* create a dummy wrapper for the F-Curve */
+ ale_dummy.type = ANIMTYPE_FCURVE;
+ ale_dummy.id = owner_id;
+ ale_dummy.data = fcu;
+
+ /* get type info for channel */
+ acf = ANIM_channel_get_typeinfo(&ale_dummy);
+ if (acf && acf->name) {
+ char name[256]; /* hopefully this will be enough! */
+
+ /* get name */
+ acf->name(&ale_dummy, name);
+
+ /* check for partial match with the match string, assuming case insensitive filtering
+ * if match, this channel shouldn't be ignored!
+ */
+ return BLI_strcasestr(name, ads->searchstr) == NULL;
+ }
+
+ /* just let this go... */
+ return 1;
+}
+
/* find the next F-Curve that is usable for inclusion */
static FCurve *animdata_filter_fcurve_next (bDopeSheet *ads, FCurve *first, bActionGroup *grp, int filter_mode, ID *owner_id)
{
@@ -880,7 +918,7 @@ static FCurve *animdata_filter_fcurve_next (bDopeSheet *ads, FCurve *first, bAct
* NOTE: we need to check if the F-Curves belong to the same group, as this gets called for groups too...
*/
for (fcu= first; ((fcu) && (fcu->grp==grp)); fcu= fcu->next) {
- /* special exception for Pose-Channel Based F-Curves:
+ /* special exception for Pose-Channel/Sequence-Strip/Node Based F-Curves:
* - the 'Only Selected' data filter should be applied to Pose-Channel data too, but those are
* represented as F-Curves. The way the filter for objects worked was to be the first check
* after 'normal' visibility, so this is done first here too...
@@ -892,7 +930,7 @@ static FCurve *animdata_filter_fcurve_next (bDopeSheet *ads, FCurve *first, bAct
if (skip_fcurve_selected_data(ads, fcu, owner_id, filter_mode))
continue;
}
-
+
/* only include if visible (Graph Editor check, not channels check) */
if (!(filter_mode & ANIMFILTER_CURVEVISIBLE) || (fcu->flag & FCURVE_VISIBLE)) {
/* only work with this channel and its subchannels if it is editable */
@@ -901,6 +939,12 @@ static FCurve *animdata_filter_fcurve_next (bDopeSheet *ads, FCurve *first, bAct
if ( ANIMCHANNEL_SELOK(SEL_FCU(fcu)) && ANIMCHANNEL_SELEDITOK(SEL_FCU(fcu)) ) {
/* only include if this curve is active */
if (!(filter_mode & ANIMFILTER_ACTIVE) || (fcu->flag & FCURVE_ACTIVE)) {
+ /* name based filtering... */
+ if ( ((ads) && (ads->filterflag & ADS_FILTER_BY_FCU_NAME)) && (owner_id) ) {
+ if (skip_fcurve_with_name(ads, fcu, owner_id))
+ continue;
+ }
+
/* this F-Curve can be used, so return it */
return fcu;
}
diff --git a/source/blender/editors/animation/anim_intern.h b/source/blender/editors/animation/anim_intern.h
index 4f88f3ed194..7818e8118a3 100644
--- a/source/blender/editors/animation/anim_intern.h
+++ b/source/blender/editors/animation/anim_intern.h
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/animation/anim_intern.h
+ * \ingroup edanimation
+ */
+
#ifndef ANIM_INTERN_H
#define ANIM_INTERN_H
diff --git a/source/blender/editors/animation/anim_ipo_utils.c b/source/blender/editors/animation/anim_ipo_utils.c
index a9ff27e970a..209210435e6 100644
--- a/source/blender/editors/animation/anim_ipo_utils.c
+++ b/source/blender/editors/animation/anim_ipo_utils.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/anim_ipo_utils.c
+ * \ingroup edanimation
+ */
+
+
/* This file contains code for presenting F-Curves and other animation data
* in the UI (especially for use in the Animation Editors).
*
diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c
index 6aa8e010cc2..c802ba621f1 100644
--- a/source/blender/editors/animation/anim_markers.c
+++ b/source/blender/editors/animation/anim_markers.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/anim_markers.c
+ * \ingroup edanimation
+ */
+
+
#include <math.h>
#include "MEM_guardedalloc.h"
@@ -63,6 +68,7 @@
#include "ED_util.h"
#include "ED_numinput.h"
#include "ED_object.h"
+#include "ED_transform.h"
#include "ED_types.h"
/* ************* Marker API **************** */
@@ -109,6 +115,57 @@ ListBase *ED_animcontext_get_markers(const bAnimContext *ac)
/* --------------------------------- */
+/* Apply some transformation to markers after the fact
+ * < markers: list of markers to affect - this may or may not be the scene markers list, so don't assume anything
+ * < scene: current scene (for getting current frame)
+ * < mode: (TfmMode) transform mode that this transform is for
+ * < value: from the transform code, this is t->vec[0] (which is delta transform for grab/extend, and scale factor for scale)
+ * < side: (B/L/R) for 'extend' functionality, which side of current frame to use
+ */
+int ED_markers_post_apply_transform (ListBase *markers, Scene *scene, int mode, float value, char side)
+{
+ TimeMarker *marker;
+ float cfra = (float)CFRA;
+ int changed = 0;
+
+ /* sanity check */
+ if (markers == NULL)
+ return changed;
+
+ /* affect selected markers - it's unlikely that we will want to affect all in this way? */
+ for (marker = markers->first; marker; marker = marker->next) {
+ if (marker->flag & SELECT) {
+ switch (mode) {
+ case TFM_TIME_TRANSLATE:
+ case TFM_TIME_EXTEND:
+ {
+ /* apply delta if marker is on the right side of the current frame */
+ if ((side=='B') ||
+ (side=='L' && marker->frame < cfra) ||
+ (side=='R' && marker->frame >= cfra))
+ {
+ marker->frame += (int)floorf(value + 0.5f);
+ changed++;
+ }
+ }
+ break;
+
+ case TFM_TIME_SCALE:
+ {
+ /* rescale the distance between the marker and the current frame */
+ marker->frame= cfra + (int)floorf(((float)(marker->frame - cfra) * value) + 0.5f);
+ changed++;
+ }
+ break;
+ }
+ }
+ }
+
+ return changed;
+}
+
+/* --------------------------------- */
+
/* Get the marker that is closest to this point */
/* XXX for select, the min_dist should be small */
TimeMarker *ED_markers_find_nearest_marker (ListBase *markers, float x)
@@ -281,7 +338,7 @@ void debug_markers_print_list(ListBase *markers)
printf("List of markers follows: -----\n");
for (marker = markers->first; marker; marker = marker->next) {
- printf("\t'%s' on %d at %p with %d\n", marker->name, marker->frame, marker, marker->flag);
+ printf("\t'%s' on %d at %p with %d\n", marker->name, marker->frame, (void *)marker, marker->flag);
}
printf("End of list ------------------\n");
@@ -365,7 +422,7 @@ static void draw_marker(View2D *v2d, TimeMarker *marker, int cfra, int flag)
}
#ifdef DURIAN_CAMERA_SWITCH
- if(marker->camera && marker->camera->restrictflag & OB_RESTRICT_RENDER) {
+ if(marker->camera && (marker->camera->restrictflag & OB_RESTRICT_RENDER)) {
float col[4];
glGetFloatv(GL_CURRENT_COLOR, col);
col[3]= 0.4;
@@ -408,9 +465,6 @@ void draw_markers_time(const bContext *C, int flag)
* primary operations of those editors.
*/
-/* maximum y-axis value (in region screen-space) that marker events should still be accepted for */
-#define ANIMEDIT_MARKER_YAXIS_MAX 40
-
/* ------------------------ */
/* special poll() which checks if there are selected markers first */
@@ -455,15 +509,7 @@ static int ed_markers_opwrap_invoke_custom(bContext *C, wmOperator *op, wmEvent
ScrArea *sa = CTX_wm_area(C);
int retval = OPERATOR_PASS_THROUGH;
- /* only timeline view doesn't need calling-location validation as it's the only dedicated view */
- if (sa->spacetype != SPACE_TIME) {
- /* restrict y-values to within ANIMEDIT_MARKER_YAXIS_MAX of the view's vertical extents, including scrollbars */
- if (evt->mval[1] > ANIMEDIT_MARKER_YAXIS_MAX) {
- /* not ok... "pass-through" to let normal editor's operators have a chance at tackling this event... */
- //printf("MARKER-WRAPPER-DEBUG: event mval[1] = %d, so over accepted tolerance\n", evt->mval[1]);
- return OPERATOR_CANCELLED|OPERATOR_PASS_THROUGH;
- }
- }
+ /* removed check for Y coord of event, keymap has bounbox now */
/* allow operator to run now */
if (invoke_func)
@@ -697,18 +743,24 @@ static int ed_marker_move_modal(bContext *C, wmOperator *op, wmEvent *evt)
ed_marker_move_cancel(C, op);
return OPERATOR_CANCELLED;
+ case RIGHTMOUSE:
+ /* press = user manually demands transform to be cancelled */
+ if (evt->val == KM_PRESS) {
+ ed_marker_move_cancel(C, op);
+ return OPERATOR_CANCELLED;
+ }
+ /* else continue; <--- see if release event should be caught for tweak-end */
+
case RETKEY:
case PADENTER:
case LEFTMOUSE:
case MIDDLEMOUSE:
- case RIGHTMOUSE:
if (WM_modal_tweak_exit(evt, mm->event_type)) {
ed_marker_move_exit(C, op);
WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
return OPERATOR_FINISHED;
}
-
break;
case MOUSEMOVE:
if (hasNumInput(&mm->num))
diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index c08b902a13e..ff9521f1ebd 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/anim_ops.c
+ * \ingroup edanimation
+ */
+
+
#include <stdlib.h>
#include <math.h>
@@ -37,6 +42,7 @@
#include "DNA_scene_types.h"
#include "BKE_context.h"
+#include "BKE_global.h"
#include "BKE_sound.h"
#include "UI_view2d.h"
@@ -59,6 +65,9 @@ static int change_frame_poll(bContext *C)
{
ScrArea *curarea= CTX_wm_area(C);
+ /* XXX temp? prevent changes during render */
+ if(G.rendering) return 0;
+
/* as long as there is an active area, and it isn't a Graph Editor
* (since the Graph Editor has its own version which does extra stuff),
* we're fine
diff --git a/source/blender/editors/animation/drivers.c b/source/blender/editors/animation/drivers.c
index 11795b76905..75b54a7529a 100644
--- a/source/blender/editors/animation/drivers.c
+++ b/source/blender/editors/animation/drivers.c
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/animation/drivers.c
+ * \ingroup edanimation
+ */
+
#include <stdio.h>
#include <string.h>
diff --git a/source/blender/editors/animation/fmodifier_ui.c b/source/blender/editors/animation/fmodifier_ui.c
index 0b8619c1f6e..954928fc486 100644
--- a/source/blender/editors/animation/fmodifier_ui.c
+++ b/source/blender/editors/animation/fmodifier_ui.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/fmodifier_ui.c
+ * \ingroup edanimation
+ */
+
+
/* User-Interface Stuff for F-Modifiers:
* This file defines the (C-Coded) templates + editing callbacks needed
* by the interface stuff or F-Modifiers, as used by F-Curves in the Graph Editor,
@@ -57,6 +62,7 @@
#include "UI_resources.h"
#include "ED_anim_api.h"
+#include "ED_util.h"
/* ********************************************** */
/* UI STUFF */
@@ -94,6 +100,8 @@ static void delete_fmodifier_cb (bContext *C, void *fmods_v, void *fcm_v)
/* remove the given F-Modifier from the active modifier-stack */
remove_fmodifier(modifiers, fcm);
+
+ ED_undo_push(C, "Delete F-Curve Modifier");
/* send notifiers */
// XXX for now, this is the only way to get updates in all the right places... but would be nice to have a special one in this case
@@ -227,14 +235,14 @@ static void draw_modifier__fn_generator(uiLayout *layout, ID *id, FModifier *fcm
/* add the settings */
col= uiLayoutColumn(layout, 1);
- uiItemR(col, &ptr, "function_type", 0, "", ICON_NULL);
- uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "function_type", 0, "", ICON_NONE);
+ uiItemR(col, &ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
col= uiLayoutColumn(layout, 0); // no grouping for now
- uiItemR(col, &ptr, "amplitude", 0, NULL, ICON_NULL);
- uiItemR(col, &ptr, "phase_multiplier", 0, NULL, ICON_NULL);
- uiItemR(col, &ptr, "phase_offset", 0, NULL, ICON_NULL);
- uiItemR(col, &ptr, "value_offset", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "amplitude", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "phase_multiplier", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "phase_offset", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "value_offset", 0, NULL, ICON_NONE);
}
/* --------------- */
@@ -255,15 +263,15 @@ static void draw_modifier__cycles(uiLayout *layout, ID *id, FModifier *fcm, shor
/* before range */
col= uiLayoutColumn(split, 1);
- uiItemL(col, "Before:", ICON_NULL);
- uiItemR(col, &ptr, "mode_before", 0, "", ICON_NULL);
- uiItemR(col, &ptr, "cycles_before", 0, NULL, ICON_NULL);
+ uiItemL(col, "Before:", ICON_NONE);
+ uiItemR(col, &ptr, "mode_before", 0, "", ICON_NONE);
+ uiItemR(col, &ptr, "cycles_before", 0, NULL, ICON_NONE);
/* after range */
col= uiLayoutColumn(split, 1);
- uiItemL(col, "After:", ICON_NULL);
- uiItemR(col, &ptr, "mode_after", 0, "", ICON_NULL);
- uiItemR(col, &ptr, "cycles_after", 0, NULL, ICON_NULL);
+ uiItemL(col, "After:", ICON_NONE);
+ uiItemR(col, &ptr, "mode_after", 0, "", ICON_NONE);
+ uiItemR(col, &ptr, "cycles_after", 0, NULL, ICON_NONE);
}
/* --------------- */
@@ -278,25 +286,25 @@ static void draw_modifier__noise(uiLayout *layout, ID *id, FModifier *fcm, short
RNA_pointer_create(id, &RNA_FModifierNoise, fcm, &ptr);
/* blending mode */
- uiItemR(layout, &ptr, "blend_type", 0, NULL, ICON_NULL);
+ uiItemR(layout, &ptr, "blend_type", 0, NULL, ICON_NONE);
/* split into 2 columns */
split= uiLayoutSplit(layout, 0.5f, 0);
/* col 1 */
col= uiLayoutColumn(split, 0);
- uiItemR(col, &ptr, "scale", 0, NULL, ICON_NULL);
- uiItemR(col, &ptr, "strength", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "scale", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "strength", 0, NULL, ICON_NONE);
/* col 2 */
col= uiLayoutColumn(split, 0);
- uiItemR(col, &ptr, "phase", 0, NULL, ICON_NULL);
- uiItemR(col, &ptr, "depth", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "phase", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "depth", 0, NULL, ICON_NONE);
}
/* --------------- */
-#define BINARYSEARCH_FRAMEEQ_THRESH 0.0001
+#define BINARYSEARCH_FRAMEEQ_THRESH 0.0001f
/* Binary search algorithm for finding where to insert Envelope Data Point.
* Returns the index to insert at (data already at that index will be offset if replace is 0)
@@ -438,9 +446,9 @@ static void fmod_envelope_deletepoint_cb (bContext *UNUSED(C), void *fcm_dv, voi
if (env->totvert > 1) {
/* allocate a new smaller array */
fedn= MEM_callocN(sizeof(FCM_EnvelopeData)*(env->totvert-1), "FCM_EnvelopeData");
-
- memcpy(fedn, &env->data, sizeof(FCM_EnvelopeData)*(index));
- memcpy(&fedn[index], &env->data[index+1], sizeof(FCM_EnvelopeData)*(env->totvert-index-1));
+
+ memcpy(fedn, env->data, sizeof(FCM_EnvelopeData)*(index));
+ memcpy(fedn + index, env->data + (index + 1), sizeof(FCM_EnvelopeData)*((env->totvert - index)-1));
/* free old array, and set the new */
MEM_freeN(env->data);
@@ -449,8 +457,10 @@ static void fmod_envelope_deletepoint_cb (bContext *UNUSED(C), void *fcm_dv, voi
}
else {
/* just free array, since the only vert was deleted */
- if (env->data)
+ if (env->data) {
MEM_freeN(env->data);
+ env->data= NULL;
+ }
env->totvert= 0;
}
}
@@ -471,12 +481,12 @@ static void draw_modifier__envelope(uiLayout *layout, ID *id, FModifier *fcm, sh
/* general settings */
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Envelope:", ICON_NULL);
- uiItemR(col, &ptr, "reference_value", 0, NULL, ICON_NULL);
+ uiItemL(col, "Envelope:", ICON_NONE);
+ uiItemR(col, &ptr, "reference_value", 0, NULL, ICON_NONE);
row= uiLayoutRow(col, 1);
- uiItemR(row, &ptr, "default_min", 0, "Min", ICON_NULL);
- uiItemR(row, &ptr, "default_max", 0, "Max", ICON_NULL);
+ uiItemR(row, &ptr, "default_min", 0, "Min", ICON_NONE);
+ uiItemR(row, &ptr, "default_max", 0, "Max", ICON_NONE);
/* control points header */
// TODO: move this control-point control stuff to using the new special widgets for lists
@@ -528,13 +538,13 @@ static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, shor
/* x-minimum */
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_min_x", 0, NULL, ICON_NULL);
- uiItemR(col, &ptr, "min_x", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "use_min_x", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "min_x", 0, NULL, ICON_NONE);
/* y-minimum*/
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_min_y", 0, NULL, ICON_NULL);
- uiItemR(col, &ptr, "min_y", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "use_min_y", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "min_y", 0, NULL, ICON_NONE);
}
/* row 2: maximum */
@@ -546,13 +556,13 @@ static void draw_modifier__limits(uiLayout *layout, ID *id, FModifier *fcm, shor
/* x-minimum */
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_max_x", 0, NULL, ICON_NULL);
- uiItemR(col, &ptr, "max_x", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "use_max_x", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "max_x", 0, NULL, ICON_NONE);
/* y-minimum*/
col= uiLayoutColumn(split, 1);
- uiItemR(col, &ptr, "use_max_y", 0, NULL, ICON_NULL);
- uiItemR(col, &ptr, "max_y", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "use_max_y", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "max_y", 0, NULL, ICON_NONE);
}
}
@@ -569,24 +579,24 @@ static void draw_modifier__stepped(uiLayout *layout, ID *id, FModifier *fcm, sho
/* block 1: "stepping" settings */
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &ptr, "frame_step", 0, NULL, ICON_NULL);
- uiItemR(col, &ptr, "frame_offset", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "frame_step", 0, NULL, ICON_NONE);
+ uiItemR(col, &ptr, "frame_offset", 0, NULL, ICON_NONE);
/* block 2: start range settings */
col= uiLayoutColumn(layout, 1);
- uiItemR(col, &ptr, "use_frame_start", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "use_frame_start", 0, NULL, ICON_NONE);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&ptr, "use_frame_start"));
- uiItemR(subcol, &ptr, "frame_start", 0, NULL, ICON_NULL);
+ uiItemR(subcol, &ptr, "frame_start", 0, NULL, ICON_NONE);
/* block 3: end range settings */
col= uiLayoutColumn(layout, 1);
- uiItemR(col, &ptr, "use_frame_end", 0, NULL, ICON_NULL);
+ uiItemR(col, &ptr, "use_frame_end", 0, NULL, ICON_NONE);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&ptr, "use_frame_end"));
- uiItemR(subcol, &ptr, "frame_end", 0, NULL, ICON_NULL);
+ uiItemR(subcol, &ptr, "frame_end", 0, NULL, ICON_NONE);
}
/* --------------- */
@@ -618,16 +628,16 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie
uiBlockSetEmboss(block, UI_EMBOSSN);
/* expand */
- uiItemR(subrow, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(subrow, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
/* checkbox for 'active' status (for now) */
- uiItemR(subrow, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(subrow, &ptr, "active", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
/* name */
if (fmi)
- uiItemL(subrow, fmi->name, ICON_NULL);
+ uiItemL(subrow, fmi->name, ICON_NONE);
else
- uiItemL(subrow, "<Unknown Modifier>", ICON_NULL);
+ uiItemL(subrow, "<Unknown Modifier>", ICON_NONE);
/* right-align ------------------------------------------- */
subrow= uiLayoutRow(row, 0);
@@ -635,7 +645,7 @@ void ANIM_uiTemplate_fmodifier_draw (uiLayout *layout, ID *id, ListBase *modifie
/* 'mute' button */
- uiItemR(subrow, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(subrow, &ptr, "mute", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
uiBlockSetEmboss(block, UI_EMBOSSN);
diff --git a/source/blender/editors/animation/keyframes_draw.c b/source/blender/editors/animation/keyframes_draw.c
index fb09b8d5c85..c4108e0ce33 100644
--- a/source/blender/editors/animation/keyframes_draw.c
+++ b/source/blender/editors/animation/keyframes_draw.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/keyframes_draw.c
+ * \ingroup edanimation
+ */
+
+
/* System includes ----------------------------------------------------- */
#include <math.h>
@@ -75,7 +80,7 @@
/* ActKeyColumns (Keyframe Columns) ------------------------------------------ */
/* Comparator callback used for ActKeyColumns and cframe float-value pointer */
-// NOTE: this is exported to other modules that use the ActKeyColumns for finding keyframes
+/* NOTE: this is exported to other modules that use the ActKeyColumns for finding keyframes */
short compare_ak_cfraPtr (void *node, void *data)
{
ActKeyColumn *ak= (ActKeyColumn *)node;
@@ -306,6 +311,23 @@ static BezTriple *abk_get_bezt_with_value (ActBeztColumn *abk, float value)
/* ActKeyBlocks (Long Keyframes) ------------------------------------------ */
+/* Comparator callback used for ActKeyBlock and cframe float-value pointer */
+/* NOTE: this is exported to other modules that use the ActKeyBlocks for finding long-keyframes */
+short compare_ab_cfraPtr (void *node, void *data)
+{
+ ActKeyBlock *ab= (ActKeyBlock *)node;
+ float *cframe= data;
+
+ if (*cframe < ab->start)
+ return -1;
+ else if (*cframe > ab->start)
+ return 1;
+ else
+ return 0;
+}
+
+/* --------------- */
+
/* Create a ActKeyColumn for a pair of BezTriples */
static ActKeyBlock *bezts_to_new_actkeyblock(BezTriple *prev, BezTriple *beztn)
{
@@ -338,9 +360,9 @@ static void add_bezt_to_keyblocks_list(DLRBT_Tree *blocks, DLRBT_Tree *beztTree,
* -> secondly, handles which control that section of the curve must be constant
*/
if ((!prev) || (!beztn)) return;
- if (IS_EQ(beztn->vec[1][1], prev->vec[1][1])==0) return;
- if (IS_EQ(beztn->vec[1][1], beztn->vec[0][1])==0) return;
- if (IS_EQ(prev->vec[1][1], prev->vec[2][1])==0) return;
+ if (IS_EQF(beztn->vec[1][1], prev->vec[1][1])==0) return;
+ if (IS_EQF(beztn->vec[1][1], beztn->vec[0][1])==0) return;
+ if (IS_EQF(prev->vec[1][1], prev->vec[2][1])==0) return;
/* if there are no blocks already, just add as root */
@@ -435,6 +457,33 @@ static void set_touched_actkeyblock (ActKeyBlock *ab)
set_touched_actkeyblock(ab->right);
}
+/* --------- */
+
+/* Checks if ActKeyBlock should exist... */
+short actkeyblock_is_valid (ActKeyBlock *ab, DLRBT_Tree *keys)
+{
+ ActKeyColumn *ak;
+ short startCurves, endCurves, totCurves;
+
+ /* check that block is valid */
+ if (ab == NULL)
+ return 0;
+
+ /* find out how many curves occur at each keyframe */
+ ak= (ActKeyColumn *)BLI_dlrbTree_search_exact(keys, compare_ak_cfraPtr, &ab->start);
+ startCurves = (ak)? ak->totcurve: 0;
+
+ ak= (ActKeyColumn *)BLI_dlrbTree_search_exact(keys, compare_ak_cfraPtr, &ab->end);
+ endCurves = (ak)? ak->totcurve: 0;
+
+ /* only draw keyblock if it appears in at all of the keyframes at lowest end */
+ if (!startCurves && !endCurves)
+ return 0;
+
+ totCurves = (startCurves>endCurves)? endCurves: startCurves;
+ return (ab->totcurve >= totCurves);
+}
+
/* *************************** Keyframe Drawing *************************** */
/* coordinates for diamond shape */
@@ -554,22 +603,7 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
/* draw keyblocks */
if (blocks) {
for (ab= blocks->first; ab; ab= ab->next) {
- short startCurves, endCurves, totCurves;
-
- /* find out how many curves occur at each keyframe */
- ak= (ActKeyColumn *)BLI_dlrbTree_search_exact(keys, compare_ak_cfraPtr, &ab->start);
- startCurves = (ak)? ak->totcurve: 0;
-
- ak= (ActKeyColumn *)BLI_dlrbTree_search_exact(keys, compare_ak_cfraPtr, &ab->end);
- endCurves = (ak)? ak->totcurve: 0;
-
- /* only draw keyblock if it appears in at all of the keyframes at lowest end */
- if (!startCurves && !endCurves)
- continue;
- else
- totCurves = (startCurves>endCurves)? endCurves: startCurves;
-
- if (ab->totcurve >= totCurves) {
+ if (actkeyblock_is_valid(ab, keys)) {
/* draw block */
if (ab->sel)
UI_ThemeColor4(TH_STRIP_SELECT);
@@ -902,8 +936,8 @@ void fcurve_to_keylist(AnimData *adt, FCurve *fcu, DLRBT_Tree *keys, DLRBT_Tree
{
DLRBT_Tree *beztTree = NULL;
BezTriple *bezt;
- int v;
-
+ unsigned int v;
+
if (fcu && fcu->totvert && fcu->bezt) {
/* apply NLA-mapping (if applicable) */
if (adt)
diff --git a/source/blender/editors/animation/keyframes_edit.c b/source/blender/editors/animation/keyframes_edit.c
index 23c2a5a013b..1ce05573e85 100644
--- a/source/blender/editors/animation/keyframes_edit.c
+++ b/source/blender/editors/animation/keyframes_edit.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/keyframes_edit.c
+ * \ingroup edanimation
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <math.h>
@@ -90,7 +95,7 @@ short ANIM_fcurve_keyframes_loop(KeyframeEditData *ked, FCurve *fcu, KeyframeEdi
{
BezTriple *bezt;
short ok = 0;
- int i;
+ unsigned int i;
/* sanity check */
if (ELEM(NULL, fcu, fcu->bezt))
@@ -532,7 +537,7 @@ static short ok_bezier_frame(KeyframeEditData *ked, BezTriple *bezt)
short ok = 0;
/* frame is stored in f1 property (this float accuracy check may need to be dropped?) */
- #define KEY_CHECK_OK(_index) IS_EQ(bezt->vec[_index][0], ked->f1)
+ #define KEY_CHECK_OK(_index) IS_EQF(bezt->vec[_index][0], ked->f1)
KEYFRAME_OK_CHECKS(KEY_CHECK_OK);
#undef KEY_CHECK_OK
@@ -572,7 +577,7 @@ static short ok_bezier_value(KeyframeEditData *ked, BezTriple *bezt)
* - this float accuracy check may need to be dropped?
* - should value be stored in f2 instead so that we won't have conflicts when using f1 for frames too?
*/
- #define KEY_CHECK_OK(_index) IS_EQ(bezt->vec[_index][1], ked->f1)
+ #define KEY_CHECK_OK(_index) IS_EQF(bezt->vec[_index][1], ked->f1)
KEYFRAME_OK_CHECKS(KEY_CHECK_OK);
#undef KEY_CHECK_OK
@@ -692,7 +697,7 @@ void bezt_remap_times(KeyframeEditData *ked, BezTriple *bezt)
static short snap_bezier_nearest(KeyframeEditData *UNUSED(ked), BezTriple *bezt)
{
if (bezt->f2 & SELECT)
- bezt->vec[1][0]= (float)(floor(bezt->vec[1][0]+0.5));
+ bezt->vec[1][0]= (float)(floorf(bezt->vec[1][0]+0.5f));
return 0;
}
diff --git a/source/blender/editors/animation/keyframes_general.c b/source/blender/editors/animation/keyframes_general.c
index aea8c2407b4..07069a69c40 100644
--- a/source/blender/editors/animation/keyframes_general.c
+++ b/source/blender/editors/animation/keyframes_general.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/animation/keyframes_general.c
+ * \ingroup edanimation
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <math.h>
@@ -274,28 +279,21 @@ void clean_fcurve(FCurve *fcu, float thresh)
/* temp struct used for smooth_fcurve */
typedef struct tSmooth_Bezt {
float *h1, *h2, *h3; /* bezt->vec[0,1,2][1] */
+ float y1, y2, y3; /* averaged before/new/after y-values */
} tSmooth_Bezt;
/* Use a weighted moving-means method to reduce intensity of fluctuations */
+// TODO: introduce scaling factor for weighting falloff
void smooth_fcurve (FCurve *fcu)
{
BezTriple *bezt;
int i, x, totSel = 0;
- /* first loop through - count how many verts are selected, and fix up handles
- * this is done for both modes
- */
+ /* first loop through - count how many verts are selected */
bezt= fcu->bezt;
for (i=0; i < fcu->totvert; i++, bezt++) {
- if (BEZSELECTED(bezt)) {
- /* line point's handles up with point's vertical position */
- bezt->vec[0][1]= bezt->vec[2][1]= bezt->vec[1][1];
- if ((bezt->h1==HD_AUTO) || (bezt->h1==HD_VECT)) bezt->h1= HD_ALIGN;
- if ((bezt->h2==HD_AUTO) || (bezt->h2==HD_VECT)) bezt->h2= HD_ALIGN;
-
- /* add value to total */
+ if (BEZSELECTED(bezt))
totSel++;
- }
}
/* if any points were selected, allocate tSmooth_Bezt points to work on */
@@ -315,7 +313,7 @@ void smooth_fcurve (FCurve *fcu)
tsb->h3 = &bezt->vec[2][1];
/* advance to the next tsb to populate */
- if (x < totSel- 1)
+ if (x < totSel-1)
tsb++;
else
break;
@@ -323,16 +321,16 @@ void smooth_fcurve (FCurve *fcu)
}
/* calculate the new smoothed F-Curve's with weighted averages:
- * - this is done with two passes
+ * - this is done with two passes to avoid progressive corruption errors
* - uses 5 points for each operation (which stores in the relevant handles)
* - previous: w/a ratio = 3:5:2:1:1
* - next: w/a ratio = 1:1:2:5:3
*/
- /* round 1: calculate previous and next */
+ /* round 1: calculate smoothing deltas and new values */
tsb= tarray;
for (i=0; i < totSel; i++, tsb++) {
- /* don't touch end points (otherwise, curves slowly explode) */
+ /* don't touch end points (otherwise, curves slowly explode, as we don't have enough data there) */
if (ELEM(i, 0, (totSel-1)) == 0) {
const tSmooth_Bezt *tP1 = tsb - 1;
const tSmooth_Bezt *tP2 = (i-2 > 0) ? (tsb - 2) : (NULL);
@@ -345,21 +343,26 @@ void smooth_fcurve (FCurve *fcu)
const float n1 = *tN1->h2;
const float n2 = (tN2) ? (*tN2->h2) : (*tN1->h2);
- /* calculate previous and next */
- *tsb->h1= (3*p2 + 5*p1 + 2*c1 + n1 + n2) / 12;
- *tsb->h3= (p2 + p1 + 2*c1 + 5*n1 + 3*n2) / 12;
+ /* calculate previous and next, then new position by averaging these */
+ tsb->y1= (3*p2 + 5*p1 + 2*c1 + n1 + n2) / 12;
+ tsb->y3= (p2 + p1 + 2*c1 + 5*n1 + 3*n2) / 12;
+
+ tsb->y2 = (tsb->y1 + tsb->y3) / 2;
}
}
- /* round 2: calculate new values and reset handles */
+ /* round 2: apply new values */
tsb= tarray;
for (i=0; i < totSel; i++, tsb++) {
- /* calculate new position by averaging handles */
- *tsb->h2 = (*tsb->h1 + *tsb->h3) / 2;
-
- /* reset handles now */
- *tsb->h1 = *tsb->h2;
- *tsb->h3 = *tsb->h2;
+ /* don't touch end points, as their values were't touched above */
+ if (ELEM(i, 0, (totSel-1)) == 0) {
+ /* y2 takes the average of the 2 points */
+ *tsb->h2 = tsb->y2;
+
+ /* handles are weighted between their original values and the averaged values */
+ *tsb->h1 = ((*tsb->h1) * 0.7f) + (tsb->y1 * 0.3f);
+ *tsb->h3 = ((*tsb->h3) * 0.7f) + (tsb->y3 * 0.3f);
+ }
}
/* free memory required for tarray */
diff --git a/source/blender/editors/animation/keyframing.c b/source/blender/editors/animation/keyframing.c
index adc580c253d..278fa4ccab4 100644
--- a/source/blender/editors/animation/keyframing.c
+++ b/source/blender/editors/animation/keyframing.c
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/animation/keyframing.c
+ * \ingroup edanimation
+ */
+
#include <stdio.h>
#include <stddef.h>
@@ -295,6 +300,7 @@ int insert_bezt_fcurve (FCurve *fcu, BezTriple *bezt, short flag)
int insert_vert_fcurve (FCurve *fcu, float x, float y, short flag)
{
BezTriple beztr= {{{0}}};
+ unsigned int oldTot = fcu->totvert;
int a;
/* set all three points, for nicer start position
@@ -330,10 +336,16 @@ int insert_vert_fcurve (FCurve *fcu, float x, float y, short flag)
if ((fcu->totvert > 2) && (flag & INSERTKEY_REPLACE)==0) {
BezTriple *bezt= (fcu->bezt + a);
- /* set interpolation from previous (if available) */
- // FIXME: this doesn't work if user tweaked the interpolation specifically, and they were just overwriting some existing key in the process...
- if (a > 0) bezt->ipo= (bezt-1)->ipo;
- else if (a < fcu->totvert-1) bezt->ipo= (bezt+1)->ipo;
+ /* set interpolation from previous (if available), but only if we didn't just replace some keyframe
+ * - replacement is indicated by no-change in number of verts
+ * - when replacing, the user may have specified some interpolation that should be kept
+ */
+ if (fcu->totvert > oldTot) {
+ if (a > 0)
+ bezt->ipo= (bezt-1)->ipo;
+ else if (a < fcu->totvert-1)
+ bezt->ipo= (bezt+1)->ipo;
+ }
/* don't recalculate handles if fast is set
* - this is a hack to make importers faster
@@ -391,14 +403,14 @@ static short new_key_needed (FCurve *fcu, float cFrame, float nValue)
prevVal= prev->vec[1][1];
/* keyframe to be added at point where there are already two similar points? */
- if (IS_EQ(prevPosi, cFrame) && IS_EQ(beztPosi, cFrame) && IS_EQ(beztPosi, prevPosi)) {
+ if (IS_EQF(prevPosi, cFrame) && IS_EQF(beztPosi, cFrame) && IS_EQF(beztPosi, prevPosi)) {
return KEYNEEDED_DONTADD;
}
/* keyframe between prev+current points ? */
if ((prevPosi <= cFrame) && (cFrame <= beztPosi)) {
/* is the value of keyframe to be added the same as keyframes on either side ? */
- if (IS_EQ(prevVal, nValue) && IS_EQ(beztVal, nValue) && IS_EQ(prevVal, beztVal)) {
+ if (IS_EQF(prevVal, nValue) && IS_EQF(beztVal, nValue) && IS_EQF(prevVal, beztVal)) {
return KEYNEEDED_DONTADD;
}
else {
@@ -408,7 +420,7 @@ static short new_key_needed (FCurve *fcu, float cFrame, float nValue)
realVal= evaluate_fcurve(fcu, cFrame);
/* compare whether it's the same as proposed */
- if (IS_EQ(realVal, nValue))
+ if (IS_EQF(realVal, nValue))
return KEYNEEDED_DONTADD;
else
return KEYNEEDED_JUSTADD;
@@ -421,7 +433,7 @@ static short new_key_needed (FCurve *fcu, float cFrame, float nValue)
* stays around or not depends on whether the values of previous/current
* beztriples and new keyframe are the same.
*/
- if (IS_EQ(prevVal, nValue) && IS_EQ(beztVal, nValue) && IS_EQ(prevVal, beztVal))
+ if (IS_EQF(prevVal, nValue) && IS_EQF(beztVal, nValue) && IS_EQF(prevVal, beztVal))
return KEYNEEDED_DELNEXT;
else
return KEYNEEDED_JUSTADD;
@@ -459,7 +471,7 @@ static short new_key_needed (FCurve *fcu, float cFrame, float nValue)
else
valB= bezt->vec[1][1] + 1.0f;
- if (IS_EQ(valA, nValue) && IS_EQ(valA, valB))
+ if (IS_EQF(valA, nValue) && IS_EQF(valA, valB))
return KEYNEEDED_DELPREV;
else
return KEYNEEDED_JUSTADD;
@@ -904,7 +916,7 @@ short insert_keyframe (ReportList *reports, ID *id, bAction *act, const char gro
/* for Loc/Rot/Scale and also Color F-Curves, the color of the F-Curve in the Graph Editor,
* is determined by the array index for the F-Curve
*/
- if (ELEM4(RNA_property_subtype(prop), PROP_TRANSLATION, PROP_XYZ, PROP_EULER, PROP_COLOR)) {
+ if (ELEM5(RNA_property_subtype(prop), PROP_TRANSLATION, PROP_XYZ, PROP_EULER, PROP_COLOR, PROP_COORDS)) {
fcu->color_mode= FCURVE_COLOR_AUTO_RGB;
}
}
@@ -1320,7 +1332,7 @@ static int delete_key_v3d_exec (bContext *C, wmOperator *op)
short success= 0;
/* loop through all curves in animdata and delete keys on this frame */
- if (ob->adt) {
+ if ((ob->adt) && (ob->adt->action)) {
AnimData *adt= ob->adt;
bAction *act= adt->action;
@@ -1330,7 +1342,7 @@ static int delete_key_v3d_exec (bContext *C, wmOperator *op)
}
}
- BKE_reportf(op->reports, RPT_INFO, "Ob '%s' - Successfully removed %d keyframes \n", id->name+2, success);
+ BKE_reportf(op->reports, RPT_INFO, "Ob '%s' - Successfully had %d keyframes removed", id->name+2, success);
ob->recalc |= OB_RECALC_OB;
}
diff --git a/source/blender/editors/animation/keyingsets.c b/source/blender/editors/animation/keyingsets.c
index d71c494705e..04565b4c236 100644
--- a/source/blender/editors/animation/keyingsets.c
+++ b/source/blender/editors/animation/keyingsets.c
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/animation/keyingsets.c
+ * \ingroup edanimation
+ */
+
#include <stdio.h>
#include <stddef.h>
@@ -54,6 +59,7 @@
#include "ED_screen.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -760,14 +766,14 @@ void ANIM_keying_sets_menu_setup (bContext *C, const char title[], const char op
uiLayout *layout;
int i = 0;
- pup= uiPupMenuBegin(C, title, ICON_NULL);
+ pup= uiPupMenuBegin(C, title, ICON_NONE);
layout= uiPupMenuLayout(pup);
/* active Keying Set
* - only include entry if it exists
*/
if (scene->active_keyingset) {
- uiItemIntO(layout, "Active Keying Set", ICON_NULL, op_name, "type", i++);
+ uiItemIntO(layout, "Active Keying Set", ICON_NONE, op_name, "type", i++);
uiItemS(layout);
}
else
@@ -779,7 +785,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, const char title[], const char op
if (scene->keyingsets.first) {
for (ks= scene->keyingsets.first; ks; ks= ks->next) {
if (ANIM_keyingset_context_ok_poll(C, ks))
- uiItemIntO(layout, ks->name, ICON_NULL, op_name, "type", i++);
+ uiItemIntO(layout, ks->name, ICON_NONE, op_name, "type", i++);
}
uiItemS(layout);
}
@@ -789,7 +795,7 @@ void ANIM_keying_sets_menu_setup (bContext *C, const char title[], const char op
for (ks= builtin_keyingsets.first; ks; ks= ks->next) {
/* only show KeyingSet if context is suitable */
if (ANIM_keyingset_context_ok_poll(C, ks))
- uiItemIntO(layout, ks->name, ICON_NULL, op_name, "type", i--);
+ uiItemEnumO_value(layout, ks->name, ICON_NONE, op_name, "type", i--);
}
uiPupMenuEnd(C, pup);
diff --git a/source/blender/editors/armature/BIF_generate.h b/source/blender/editors/armature/BIF_generate.h
index 3c9f517726f..0614bd26c00 100644
--- a/source/blender/editors/armature/BIF_generate.h
+++ b/source/blender/editors/armature/BIF_generate.h
@@ -19,6 +19,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/armature/BIF_generate.h
+ * \ingroup edarmature
+ */
+
#ifndef BIF_GENERATE_H
#define BIF_GENERATE_H
diff --git a/source/blender/editors/armature/BIF_retarget.h b/source/blender/editors/armature/BIF_retarget.h
index fe0ac53cfaf..e0604f3cefb 100644
--- a/source/blender/editors/armature/BIF_retarget.h
+++ b/source/blender/editors/armature/BIF_retarget.h
@@ -20,6 +20,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/armature/BIF_retarget.h
+ * \ingroup edarmature
+ */
+
+
#ifndef BIF_RETARGET_H
#define BIF_RETARGET_H
@@ -160,5 +165,9 @@ void RIG_freeRigGraph(BGraph *rg);
/* UNUSED */
void BIF_retargetArmature(bContext *C);
void BIF_adjustRetarget(bContext *C);
+/* UNUSED / print funcs */
+void RIG_printArc(struct RigGraph *rg, struct RigArc *arc);
+void RIG_printGraph(struct RigGraph *rg);
+void RIG_printArcBones(struct RigArc *arc);
#endif /* BIF_RETARGET_H */
diff --git a/source/blender/editors/armature/CMakeLists.txt b/source/blender/editors/armature/CMakeLists.txt
index 8bbfc3465e3..3234254f745 100644
--- a/source/blender/editors/armature/CMakeLists.txt
+++ b/source/blender/editors/armature/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
../../windowmanager
../../../../intern/guardedalloc
../../../../intern/opennl/extern
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/armature/armature_intern.h b/source/blender/editors/armature/armature_intern.h
index 2a1185f99c0..7a6141540bd 100644
--- a/source/blender/editors/armature/armature_intern.h
+++ b/source/blender/editors/armature/armature_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/armature/armature_intern.h
+ * \ingroup edarmature
+ */
+
#ifndef ED_ARMATURE_INTERN_H
#define ED_ARMATURE_INTERN_H
@@ -145,16 +150,19 @@ void SKETCH_OT_select(struct wmOperatorType *ot);
typedef struct tPChanFCurveLink {
struct tPChanFCurveLink *next, *prev;
- ListBase fcurves; /* F-Curves for this PoseChannel (wrapped with LinkData) */
- struct bPoseChannel *pchan; /* Pose Channel which data is attached to */
+ ListBase fcurves; /* F-Curves for this PoseChannel (wrapped with LinkData) */
+ struct bPoseChannel *pchan; /* Pose Channel which data is attached to */
- char *pchan_path; /* RNA Path to this Pose Channel (needs to be freed when we're done) */
+ char *pchan_path; /* RNA Path to this Pose Channel (needs to be freed when we're done) */
- // TODO: need to include axis-angle here at some stage
- float oldloc[3]; /* transform values at start of operator (to be restored before each modal step) */
+ float oldloc[3]; /* transform values at start of operator (to be restored before each modal step) */
float oldrot[3];
float oldscale[3];
float oldquat[4];
+ float oldangle;
+ float oldaxis[3];
+
+ struct IDProperty *oldprops; /* copy of custom properties at start of operator (to be restored before each modal step) */
} tPChanFCurveLink;
/* ----------- */
@@ -192,6 +200,8 @@ void POSE_OT_push(struct wmOperatorType *ot);
void POSE_OT_relax(struct wmOperatorType *ot);
void POSE_OT_breakdown(struct wmOperatorType *ot);
+void POSE_OT_propagate(struct wmOperatorType *ot);
+
/* ******************************************************* */
/* editarmature.c */
diff --git a/source/blender/editors/armature/armature_ops.c b/source/blender/editors/armature/armature_ops.c
index 26414e59a3c..545cff82483 100644
--- a/source/blender/editors/armature/armature_ops.c
+++ b/source/blender/editors/armature/armature_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/armature/armature_ops.c
+ * \ingroup edarmature
+ */
+
+
#include <stdlib.h>
#include <math.h>
@@ -141,6 +146,8 @@ void ED_operatortypes_armature(void)
WM_operatortype_append(POSE_OT_armature_layers);
WM_operatortype_append(POSE_OT_bone_layers);
+ WM_operatortype_append(POSE_OT_propagate);
+
/* POSELIB */
WM_operatortype_append(POSELIB_OT_browse_interactive);
WM_operatortype_append(POSELIB_OT_apply_pose);
@@ -175,7 +182,7 @@ void ED_operatormacros_armature(void)
ot= WM_operatortype_append_macro("ARMATURE_OT_extrude_move", "Extrude", OPTYPE_UNDO|OPTYPE_REGISTER);
if(ot) {
otmacro=WM_operatortype_macro_define(ot, "ARMATURE_OT_extrude");
- RNA_enum_set(otmacro->ptr, "forked", 0);
+ RNA_boolean_set(otmacro->ptr, "forked", 0);
otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
RNA_enum_set(otmacro->ptr, "proportional", 0);
}
@@ -185,7 +192,7 @@ void ED_operatormacros_armature(void)
ot= WM_operatortype_append_macro("ARMATURE_OT_extrude_forked", "Extrude Forked", OPTYPE_UNDO|OPTYPE_REGISTER);
if(ot) {
otmacro=WM_operatortype_macro_define(ot, "ARMATURE_OT_extrude");
- RNA_enum_set(otmacro->ptr, "forked", 1);
+ RNA_boolean_set(otmacro->ptr, "forked", 1);
otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
RNA_enum_set(otmacro->ptr, "proportional", 0);
}
diff --git a/source/blender/editors/armature/editarmature.c b/source/blender/editors/armature/editarmature.c
index 5616a3424ba..41595913c51 100644
--- a/source/blender/editors/armature/editarmature.c
+++ b/source/blender/editors/armature/editarmature.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/armature/editarmature.c
+ * \ingroup edarmature
+ */
+
+
#include <ctype.h>
#include <stdlib.h>
#include <stddef.h>
@@ -82,6 +87,7 @@
#include "ED_view3d.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "armature_intern.h"
#include "meshlaplacian.h"
@@ -632,6 +638,8 @@ static int apply_armature_pose2bones_exec (bContext *C, wmOperator *op)
/* helpful warnings... */
// TODO: add warnings to be careful about actions, applying deforms first, etc.
+ if (ob->adt && ob->adt->action)
+ BKE_report(op->reports, RPT_WARNING, "Actions on this armature will be destroyed by this new rest pose as the transforms stored are relative to the old rest pose");
/* Get editbones of active armature to alter */
ED_armature_to_edit(ob);
@@ -2119,7 +2127,7 @@ float ED_rollBoneToVector(EditBone *bone, const float align_axis[3], const short
sub_v3_v3v3(align_axis_proj, align_axis, vec);
if(axis_only) {
- if(angle_v3v3(align_axis_proj, mat[2]) > M_PI/2) {
+ if(angle_v3v3(align_axis_proj, mat[2]) > (float)(M_PI/2.0)) {
negate_v3(align_axis_proj);
}
}
@@ -2304,7 +2312,7 @@ static void undoBones_to_editBones(void *uarmv, void *armv, void *data)
}
}
-static void *editBones_to_undoBones(void *armv, void *obdata)
+static void *editBones_to_undoBones(void *armv, void *UNUSED(obdata))
{
bArmature *arm= armv;
UndoArmature *uarm;
@@ -4000,7 +4008,7 @@ static int armature_parent_set_exec(bContext *C, wmOperator *op)
static int armature_parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
EditBone *actbone = CTX_data_active_bone(C);
- uiPopupMenu *pup= uiPupMenuBegin(C, "Make Parent ", ICON_NULL);
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Make Parent ", ICON_NONE);
uiLayout *layout= uiPupMenuLayout(pup);
int allchildbones = 0;
@@ -4697,14 +4705,14 @@ static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], i
bone->rad_head * scale, bone->rad_tail * scale, bone->dist * scale);
/* add the vert to the deform group if weight!=0.0 */
- if (distance!=0.0)
+ if (distance != 0.0f)
ED_vgroup_vert_add (ob, dgroup, i, distance, WEIGHT_REPLACE);
else
ED_vgroup_vert_remove (ob, dgroup, i);
/* do same for mirror */
if (dgroupflip && dgroupflip[j] && iflip >= 0) {
- if (distance!=0.0)
+ if (distance != 0.0f)
ED_vgroup_vert_add (ob, dgroupflip[j], iflip, distance,
WEIGHT_REPLACE);
else
@@ -4953,7 +4961,7 @@ static void pchan_clear_rot(bPoseChannel *pchan)
pchan->rotAxis[2]= 0.0f;
/* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
- if (IS_EQ(pchan->rotAxis[0], pchan->rotAxis[1]) && IS_EQ(pchan->rotAxis[1], pchan->rotAxis[2]))
+ if (IS_EQF(pchan->rotAxis[0], pchan->rotAxis[1]) && IS_EQF(pchan->rotAxis[1], pchan->rotAxis[2]))
pchan->rotAxis[1] = 1.0f;
}
else if (pchan->rotmode == ROT_MODE_QUAT) {
diff --git a/source/blender/editors/armature/editarmature_generate.c b/source/blender/editors/armature/editarmature_generate.c
index dfab2db5307..17bd43ff2d8 100644
--- a/source/blender/editors/armature/editarmature_generate.c
+++ b/source/blender/editors/armature/editarmature_generate.c
@@ -28,6 +28,11 @@
* editarmature.c: Interface for creating and posing armature objects
*/
+/** \file blender/editors/armature/editarmature_generate.c
+ * \ingroup edarmature
+ */
+
+
#include <string.h>
#include <math.h>
#include <float.h>
diff --git a/source/blender/editors/armature/editarmature_retarget.c b/source/blender/editors/armature/editarmature_retarget.c
index 86df851424c..bd05f7f6581 100644
--- a/source/blender/editors/armature/editarmature_retarget.c
+++ b/source/blender/editors/armature/editarmature_retarget.c
@@ -23,6 +23,11 @@
* autoarmature.c: Interface for automagically manipulating armature (retarget, created, ...)
*/
+/** \file blender/editors/armature/editarmature_retarget.c
+ * \ingroup edarmature
+ */
+
+
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
@@ -1429,7 +1434,7 @@ static void RIG_printNode(RigNode *node, const char name[])
}
}
-static void RIG_printArcBones(RigArc *arc)
+void RIG_printArcBones(RigArc *arc)
{
RigEdge *edge;
@@ -1480,7 +1485,7 @@ static void RIG_printLinkedCtrl(RigGraph *rg, EditBone *bone, int tabs)
}
}
-static void RIG_printArc(RigGraph *rg, RigArc *arc)
+void RIG_printArc(RigGraph *rg, RigArc *arc)
{
RigEdge *edge;
@@ -1502,7 +1507,7 @@ static void RIG_printArc(RigGraph *rg, RigArc *arc)
RIG_printNode((RigNode*)arc->tail, "tail");
}
-static void RIG_printGraph(RigGraph *rg)
+void RIG_printGraph(RigGraph *rg)
{
RigArc *arc;
diff --git a/source/blender/editors/armature/editarmature_sketch.c b/source/blender/editors/armature/editarmature_sketch.c
index c11263810cb..4b83af30799 100644
--- a/source/blender/editors/armature/editarmature_sketch.c
+++ b/source/blender/editors/armature/editarmature_sketch.c
@@ -20,6 +20,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/armature/editarmature_sketch.c
+ * \ingroup edarmature
+ */
+
+
#include <string.h>
#include <math.h>
#include <float.h>
diff --git a/source/blender/editors/armature/meshlaplacian.c b/source/blender/editors/armature/meshlaplacian.c
index d06464c486b..46f702b69b2 100644
--- a/source/blender/editors/armature/meshlaplacian.c
+++ b/source/blender/editors/armature/meshlaplacian.c
@@ -28,6 +28,11 @@
* meshlaplacian.c: Algorithms using the mesh laplacian.
*/
+/** \file blender/editors/armature/meshlaplacian.c
+ * \ingroup edarmature
+ */
+
+
#include <math.h>
#include <string.h>
@@ -177,16 +182,16 @@ static void laplacian_triangle_area(LaplacianSystem *sys, int i1, int i2, int i3
t2= cotan_weight(v2, v3, v1);
t3= cotan_weight(v3, v1, v2);
- if(RAD2DEG(angle_v3v3v3(v2, v1, v3)) > 90) obtuse= 1;
- else if(RAD2DEG(angle_v3v3v3(v1, v2, v3)) > 90) obtuse= 2;
- else if(RAD2DEG(angle_v3v3v3(v1, v3, v2)) > 90) obtuse= 3;
+ if(RAD2DEGF(angle_v3v3v3(v2, v1, v3)) > 90) obtuse= 1;
+ else if(RAD2DEGF(angle_v3v3v3(v1, v2, v3)) > 90) obtuse= 2;
+ else if(RAD2DEGF(angle_v3v3v3(v1, v3, v2)) > 90) obtuse= 3;
if (obtuse > 0) {
area= area_tri_v3(v1, v2, v3);
- varea[i1] += (obtuse == 1)? area: area*0.5;
- varea[i2] += (obtuse == 2)? area: area*0.5;
- varea[i3] += (obtuse == 3)? area: area*0.5;
+ varea[i1] += (obtuse == 1)? area: area*0.5f;
+ varea[i2] += (obtuse == 2)? area: area*0.5f;
+ varea[i3] += (obtuse == 3)? area: area*0.5f;
}
else {
len1= len_v3v3(v2, v3);
@@ -487,7 +492,7 @@ static int heat_ray_source_visible(LaplacianSystem *sys, int vertex, int source)
sub_v3_v3v3(data.vec, end, data.start);
madd_v3_v3v3fl(data.start, data.start, data.vec, 1e-5);
- mul_v3_fl(data.vec, 1.0f - 2e-5);
+ mul_v3_fl(data.vec, 1.0f - 2e-5f);
/* pass normalized vec + distance to bvh */
hit.index = -1;
@@ -1040,9 +1045,9 @@ void rigid_deform_end(int cancel)
#define MESHDEFORM_TAG_INTERIOR 2
#define MESHDEFORM_TAG_EXTERIOR 3
-#define MESHDEFORM_LEN_THRESHOLD 1e-6
+#define MESHDEFORM_LEN_THRESHOLD 1e-6f
-#define MESHDEFORM_MIN_INFLUENCE 0.0005
+#define MESHDEFORM_MIN_INFLUENCE 0.0005f
static int MESHDEFORM_OFFSET[7][3] =
{{0,0,0}, {1,0,0}, {-1,0,0}, {0,1,0}, {0,-1,0}, {0,0,1}, {0,0,-1}};
@@ -1145,7 +1150,7 @@ static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3],
isectco[1]= (1.0f - u - v)*vert0[1] + u*vert1[1] + v*vert2[1];
isectco[2]= (1.0f - u - v)*vert0[2] + u*vert1[2] + v*vert2[2];
- uvw[0]= 1.0 - u - v;
+ uvw[0]= 1.0f - u - v;
uvw[1]= u;
uvw[2]= v;
diff --git a/source/blender/editors/armature/meshlaplacian.h b/source/blender/editors/armature/meshlaplacian.h
index 74de015e12e..45c539b8ef5 100644
--- a/source/blender/editors/armature/meshlaplacian.h
+++ b/source/blender/editors/armature/meshlaplacian.h
@@ -28,6 +28,11 @@
* BIF_meshlaplacian.h: Algorithms using the mesh laplacian.
*/
+/** \file blender/editors/armature/meshlaplacian.h
+ * \ingroup edarmature
+ */
+
+
#ifndef BIF_MESHLAPLACIAN_H
#define BIF_MESHLAPLACIAN_H
diff --git a/source/blender/editors/armature/poseSlide.c b/source/blender/editors/armature/poseSlide.c
index 5a7c7ffcaf9..203d76086b3 100644
--- a/source/blender/editors/armature/poseSlide.c
+++ b/source/blender/editors/armature/poseSlide.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/armature/poseSlide.c
+ * \ingroup edarmature
+ */
+
#include <stdlib.h>
#include <stdio.h>
@@ -56,10 +61,9 @@
#include "WM_api.h"
#include "WM_types.h"
-
-
#include "ED_armature.h"
#include "ED_keyframes_draw.h"
+#include "ED_markers.h"
#include "ED_screen.h"
#include "armature_intern.h"
@@ -72,7 +76,13 @@
* for interactively controlling the spacing of poses, but also
* for 'pushing' and/or 'relaxing' extremes as they see fit.
*
- * B) Pose Sculpting
+ * B) Propagate
+ * This tool copies elements of the selected pose to successive
+ * keyframes, allowing the animator to go back and modify the poses
+ * for some "static" pose controls, without having to repeatedly
+ * doing a "next paste" dance.
+ *
+ * C) Pose Sculpting
* This is yet to be implemented, but the idea here is to use
* sculpting techniques to make it easier to pose rigs by allowing
* rigs to be manipulated using a familiar paint-based interface.
@@ -187,102 +197,163 @@ static void pose_slide_refresh (bContext *C, tPoseSlideOp *pso)
poseAnim_mapping_refresh(C, pso->scene, pso->ob);
}
+/* helper for apply() - perform sliding for some value */
+static void pose_slide_apply_val (tPoseSlideOp *pso, FCurve *fcu, float *val)
+{
+ float cframe = (float)pso->cframe;
+ float sVal, eVal;
+ float w1, w2;
+
+ /* get keyframe values for endpoint poses to blend with */
+ /* previous/start */
+ sVal= evaluate_fcurve(fcu, (float)pso->prevFrame);
+ /* next/end */
+ eVal= evaluate_fcurve(fcu, (float)pso->nextFrame);
+
+ /* calculate the relative weights of the endpoints */
+ if (pso->mode == POSESLIDE_BREAKDOWN) {
+ /* get weights from the percentage control */
+ w1= pso->percentage; /* this must come second */
+ w2= 1.0f - w1; /* this must come first */
+ }
+ else {
+ /* - these weights are derived from the relative distance of these
+ * poses from the current frame
+ * - they then get normalised so that they only sum up to 1
+ */
+ float wtot;
+
+ w1 = cframe - (float)pso->prevFrame;
+ w2 = (float)pso->nextFrame - cframe;
+
+ wtot = w1 + w2;
+ w1 = (w1/wtot);
+ w2 = (w2/wtot);
+ }
+
+ /* depending on the mode, calculate the new value
+ * - in all of these, the start+end values are multiplied by w2 and w1 (respectively),
+ * since multiplication in another order would decrease the value the current frame is closer to
+ */
+ switch (pso->mode) {
+ case POSESLIDE_PUSH: /* make the current pose more pronounced */
+ {
+ /* perform a weighted average here, favouring the middle pose
+ * - numerator should be larger than denominator to 'expand' the result
+ * - perform this weighting a number of times given by the percentage...
+ */
+ int iters= (int)ceil(10.0f*pso->percentage); // TODO: maybe a sensitivity ctrl on top of this is needed
+
+ while (iters-- > 0) {
+ (*val)= ( -((sVal * w2) + (eVal * w1)) + ((*val) * 6.0f) ) / 5.0f;
+ }
+ }
+ break;
+
+ case POSESLIDE_RELAX: /* make the current pose more like its surrounding ones */
+ {
+ /* perform a weighted average here, favouring the middle pose
+ * - numerator should be smaller than denominator to 'relax' the result
+ * - perform this weighting a number of times given by the percentage...
+ */
+ int iters= (int)ceil(10.0f*pso->percentage); // TODO: maybe a sensitivity ctrl on top of this is needed
+
+ while (iters-- > 0) {
+ (*val)= ( ((sVal * w2) + (eVal * w1)) + ((*val) * 5.0f) ) / 6.0f;
+ }
+ }
+ break;
+
+ case POSESLIDE_BREAKDOWN: /* make the current pose slide around between the endpoints */
+ {
+ /* perform simple linear interpolation - coefficient for start must come from pso->percentage... */
+ // TODO: make this use some kind of spline interpolation instead?
+ (*val)= ((sVal * w2) + (eVal * w1));
+ }
+ break;
+ }
+}
+
/* helper for apply() - perform sliding for some 3-element vector */
-static void pose_slide_apply_vec3 (tPoseSlideOp *pso, tPChanFCurveLink *pfl, float vec[3], const char *propName)
+static void pose_slide_apply_vec3 (tPoseSlideOp *pso, tPChanFCurveLink *pfl, float vec[3], const char propName[])
{
LinkData *ld=NULL;
char *path=NULL;
- float cframe;
/* get the path to use... */
path= BLI_sprintfN("%s.%s", pfl->pchan_path, propName);
- /* get the current frame number */
- cframe= (float)pso->cframe;
-
/* using this path, find each matching F-Curve for the variables we're interested in */
while ( (ld= poseAnim_mapping_getNextFCurve(&pfl->fcurves, ld, path)) ) {
FCurve *fcu= (FCurve *)ld->data;
- float sVal, eVal;
- float w1, w2;
- int ch;
- /* get keyframe values for endpoint poses to blend with */
- /* previous/start */
- sVal= evaluate_fcurve(fcu, (float)pso->prevFrame);
- /* next/end */
- eVal= evaluate_fcurve(fcu, (float)pso->nextFrame);
+ /* just work on these channels one by one... there's no interaction between values */
+ pose_slide_apply_val(pso, fcu, &vec[fcu->array_index]);
+ }
+
+ /* free the temp path we got */
+ MEM_freeN(path);
+}
+
+/* helper for apply() - perform sliding for custom properties */
+static void pose_slide_apply_props (tPoseSlideOp *pso, tPChanFCurveLink *pfl)
+{
+ PointerRNA ptr = {{NULL}};
+ LinkData *ld;
+ int len = strlen(pfl->pchan_path);
+
+ /* setup pointer RNA for resolving paths */
+ RNA_pointer_create(NULL, &RNA_PoseBone, pfl->pchan, &ptr);
+
+ /* custom properties are just denoted using ["..."][etc.] after the end of the base path,
+ * so just check for opening pair after the end of the path
+ */
+ for (ld = pfl->fcurves.first; ld; ld = ld->next) {
+ FCurve *fcu = (FCurve *)ld->data;
+ char *bPtr, *pPtr;
- /* get channel index */
- ch= fcu->array_index;
+ if (fcu->rna_path == NULL)
+ continue;
- /* calculate the relative weights of the endpoints */
- if (pso->mode == POSESLIDE_BREAKDOWN) {
- /* get weights from the percentage control */
- w1= pso->percentage; /* this must come second */
- w2= 1.0f - w1; /* this must come first */
- }
- else {
- /* - these weights are derived from the relative distance of these
- * poses from the current frame
- * - they then get normalised so that they only sum up to 1
+ /* do we have a match?
+ * - bPtr is the RNA Path with the standard part chopped off
+ * - pPtr is the chunk of the path which is left over
+ */
+ bPtr = strstr(fcu->rna_path, pfl->pchan_path) + len;
+ pPtr = strstr(bPtr, "[\""); /* dummy " for texteditor bugs */
+
+ if (pPtr) {
+ /* use RNA to try and get a handle on this property, then, assuming that it is just
+ * numerical, try and grab the value as a float for temp editing before setting back
*/
- float wtot;
+ PropertyRNA *prop = RNA_struct_find_property(&ptr, pPtr);
- w1 = cframe - (float)pso->prevFrame;
- w2 = (float)pso->nextFrame - cframe;
-
- wtot = w1 + w2;
- w1 = (w1/wtot);
- w2 = (w2/wtot);
- }
-
- /* depending on the mode, calculate the new value
- * - in all of these, the start+end values are multiplied by w2 and w1 (respectively),
- * since multiplication in another order would decrease the value the current frame is closer to
- */
- switch (pso->mode) {
- case POSESLIDE_PUSH: /* make the current pose more pronounced */
- {
- /* perform a weighted average here, favouring the middle pose
- * - numerator should be larger than denominator to 'expand' the result
- * - perform this weighting a number of times given by the percentage...
- */
- int iters= (int)ceil(10.0f*pso->percentage); // TODO: maybe a sensitivity ctrl on top of this is needed
-
- while (iters-- > 0) {
- vec[ch]= ( -((sVal * w2) + (eVal * w1)) + (vec[ch] * 6.0f) ) / 5.0f;
- }
- }
- break;
-
- case POSESLIDE_RELAX: /* make the current pose more like its surrounding ones */
- {
- /* perform a weighted average here, favouring the middle pose
- * - numerator should be smaller than denominator to 'relax' the result
- * - perform this weighting a number of times given by the percentage...
- */
- int iters= (int)ceil(10.0f*pso->percentage); // TODO: maybe a sensitivity ctrl on top of this is needed
-
- while (iters-- > 0) {
- vec[ch]= ( ((sVal * w2) + (eVal * w1)) + (vec[ch] * 5.0f) ) / 6.0f;
+ if (prop) {
+ switch (RNA_property_type(prop)) {
+ case PROP_FLOAT:
+ {
+ float tval = RNA_property_float_get(&ptr, prop);
+ pose_slide_apply_val(pso, fcu, &tval);
+ RNA_property_float_set(&ptr, prop, tval);
+ }
+ break;
+ case PROP_BOOLEAN:
+ case PROP_ENUM:
+ case PROP_INT:
+ {
+ float tval = (float)RNA_property_int_get(&ptr, prop);
+ pose_slide_apply_val(pso, fcu, &tval);
+ RNA_property_int_set(&ptr, prop, (int)tval);
+ }
+ break;
+ default:
+ /* cannot handle */
+ //printf("Cannot Pose Slide non-numerical property\n");
+ break;
}
}
- break;
-
- case POSESLIDE_BREAKDOWN: /* make the current pose slide around between the endpoints */
- {
- /* perform simple linear interpolation - coefficient for start must come from pso->percentage... */
- // TODO: make this use some kind of spline interpolation instead?
- vec[ch]= ((sVal * w2) + (eVal * w1));
- }
- break;
}
-
}
-
- /* free the temp path we got */
- MEM_freeN(path);
}
/* helper for apply() - perform sliding for quaternion rotations (using quat blending) */
@@ -421,6 +492,11 @@ static void pose_slide_apply(bContext *C, tPoseSlideOp *pso)
pose_slide_apply_quat(pso, pfl);
}
}
+
+ if (pfl->oldprops) {
+ /* not strictly a transform, but contributes to the pose produced in many rigs */
+ pose_slide_apply_props(pso, pfl);
+ }
}
/* depsgraph updates + redraws */
@@ -497,6 +573,7 @@ static int pose_slide_invoke_common (bContext *C, wmOperator *op, tPoseSlideOp *
}
else {
BKE_report(op->reports, RPT_ERROR, "No keyframes to slide between.");
+ pose_slide_exit(op);
return OPERATOR_CANCELLED;
}
@@ -782,3 +859,361 @@ void POSE_OT_breakdown (wmOperatorType *ot)
}
/* **************************************************** */
+/* B) Pose Propagate */
+
+/* "termination conditions" - i.e. when we stop */
+typedef enum ePosePropagate_Termination {
+ /* stop after the current hold ends */
+ POSE_PROPAGATE_SMART_HOLDS = 0,
+ /* only do on the last keyframe */
+ POSE_PROPAGATE_LAST_KEY,
+ /* stop after the next keyframe */
+ POSE_PROPAGATE_NEXT_KEY,
+ /* stop after the specified frame */
+ POSE_PROPAGATE_BEFORE_FRAME,
+ /* stop when we run out of keyframes */
+ POSE_PROPAGATE_BEFORE_END,
+
+ /* only do on the frames where markers are selected */
+ POSE_PROPAGATE_SELECTED_MARKERS
+} ePosePropagate_Termination;
+
+/* termination data needed for some modes - assumes only one of these entries will be needed at a time */
+typedef union tPosePropagate_ModeData {
+ /* smart holds + before frame: frame number to stop on */
+ float end_frame;
+
+ /* selected markers: listbase for CfraElem's marking these frames */
+ ListBase sel_markers;
+} tPosePropagate_ModeData;
+
+/* --------------------------------- */
+
+/* get frame on which the "hold" for the bone ends
+ * XXX: this may not really work that well if a bone moves on some channels and not others
+ * if this happens to be a major issue, scrap this, and just make this happen
+ * independently per F-Curve
+ */
+static float pose_propagate_get_boneHoldEndFrame (Object *ob, tPChanFCurveLink *pfl, float startFrame)
+{
+ DLRBT_Tree keys, blocks;
+ ActKeyBlock *ab;
+
+ AnimData *adt= ob->adt;
+ LinkData *ld;
+ float endFrame = startFrame;
+
+ /* set up optimised data-structures for searching for relevant keyframes + holds */
+ BLI_dlrbTree_init(&keys);
+ BLI_dlrbTree_init(&blocks);
+
+ for (ld = pfl->fcurves.first; ld; ld = ld->next) {
+ FCurve *fcu = (FCurve *)ld->data;
+ fcurve_to_keylist(adt, fcu, &keys, &blocks);
+ }
+
+ BLI_dlrbTree_linkedlist_sync(&keys);
+ BLI_dlrbTree_linkedlist_sync(&blocks);
+
+ /* find the long keyframe (i.e. hold), and hence obtain the endFrame value
+ * - the best case would be one that starts on the frame itself
+ */
+ ab = (ActKeyBlock *)BLI_dlrbTree_search_exact(&blocks, compare_ab_cfraPtr, &startFrame);
+
+ if (actkeyblock_is_valid(ab, &keys) == 0) {
+ /* There are only two cases for no-exact match:
+ * 1) the current frame is just before another key but not on a key itself
+ * 2) the current frame is on a key, but that key doesn't link to the next
+ *
+ * If we've got the first case, then we can search for another block,
+ * otherwise forget it, as we'd be overwriting some valid data.
+ */
+ if (BLI_dlrbTree_search_exact(&keys, compare_ak_cfraPtr, &startFrame) == NULL) {
+ /* we've got case 1, so try the one after */
+ ab = (ActKeyBlock *)BLI_dlrbTree_search_next(&blocks, compare_ab_cfraPtr, &startFrame);
+
+ if (actkeyblock_is_valid(ab, &keys) == 0) {
+ /* try the block before this frame then as last resort */
+ ab = (ActKeyBlock *)BLI_dlrbTree_search_prev(&blocks, compare_ab_cfraPtr, &startFrame);
+
+ /* whatever happens, stop searching now... */
+ if (actkeyblock_is_valid(ab, &keys) == 0) {
+ /* restrict range to just the frame itself
+ * i.e. everything is in motion, so no holds to safely overwrite
+ */
+ ab = NULL;
+ }
+ }
+ }
+ else {
+ /* we've got case 2 - set ab to NULL just in case, since we shouldn't do anything in this case */
+ ab = NULL;
+ }
+ }
+
+ /* check if we can go any further than we've already gone */
+ if (ab) {
+ /* go to next if it is also valid and meets "extension" criteria */
+ while (ab->next) {
+ ActKeyBlock *abn = (ActKeyBlock *)ab->next;
+
+ /* must be valid */
+ if (actkeyblock_is_valid(abn, &keys) == 0)
+ break;
+ /* should start on the same frame that the last ended on */
+ if (ab->end != abn->start)
+ break;
+ /* should have the same number of curves */
+ if (ab->totcurve != abn->totcurve)
+ break;
+ /* should have the same value
+ * XXX: this may be a bit fuzzy on larger data sets, so be careful
+ */
+ if (ab->val != abn->val)
+ break;
+
+ /* we can extend the bounds to the end of this "next" block now */
+ ab = abn;
+ }
+
+ /* end frame can now take the value of the end of the block */
+ endFrame = ab->end;
+ }
+
+ /* free temp memory */
+ BLI_dlrbTree_free(&keys);
+ BLI_dlrbTree_free(&blocks);
+
+ /* return the end frame we've found */
+ return endFrame;
+}
+
+/* get reference value from F-Curve using RNA */
+static float pose_propagate_get_refVal (Object *ob, FCurve *fcu)
+{
+ PointerRNA id_ptr, ptr;
+ PropertyRNA *prop;
+ float value;
+
+ /* base pointer is always the object -> id_ptr */
+ RNA_id_pointer_create(&ob->id, &id_ptr);
+
+ /* resolve the property... */
+ if (RNA_path_resolve(&id_ptr, fcu->rna_path, &ptr, &prop)) {
+ if (RNA_property_array_check(&ptr, prop)) {
+ /* array */
+ if (fcu->array_index < RNA_property_array_length(&ptr, prop)) {
+ switch (RNA_property_type(prop)) {
+ case PROP_BOOLEAN:
+ value= (float)RNA_property_boolean_get_index(&ptr, prop, fcu->array_index);
+ break;
+ case PROP_INT:
+ value= (float)RNA_property_int_get_index(&ptr, prop, fcu->array_index);
+ break;
+ case PROP_FLOAT:
+ value= RNA_property_float_get_index(&ptr, prop, fcu->array_index);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ else {
+ /* not an array */
+ switch (RNA_property_type(prop)) {
+ case PROP_BOOLEAN:
+ value= (float)RNA_property_boolean_get(&ptr, prop);
+ break;
+ case PROP_INT:
+ value= (float)RNA_property_int_get(&ptr, prop);
+ break;
+ case PROP_ENUM:
+ value= (float)RNA_property_enum_get(&ptr, prop);
+ break;
+ case PROP_FLOAT:
+ value= RNA_property_float_get(&ptr, prop);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ return value;
+}
+
+/* propagate just works along each F-Curve in turn */
+static void pose_propagate_fcurve (wmOperator *op, Object *ob, FCurve *fcu,
+ float startFrame, tPosePropagate_ModeData modeData)
+{
+ const int mode = RNA_enum_get(op->ptr, "mode");
+
+ BezTriple *bezt;
+ float refVal = 0.0f;
+ short keyExists;
+ int i, match;
+ short first=1;
+
+ /* skip if no keyframes to edit */
+ if ((fcu->bezt == NULL) || (fcu->totvert < 2))
+ return;
+
+ /* find the reference value from bones directly, which means that the user
+ * doesn't need to firstly keyframe the pose (though this doesn't mean that
+ * they can't either)
+ */
+ refVal = pose_propagate_get_refVal(ob, fcu);
+
+ /* find the first keyframe to start propagating from
+ * - if there's a keyframe on the current frame, we probably want to save this value there too
+ * since it may be as of yet unkeyed
+ * - if starting before the starting frame, don't touch the key, as it may have had some valid
+ * values
+ */
+ match = binarysearch_bezt_index(fcu->bezt, startFrame, fcu->totvert, &keyExists);
+
+ if (fcu->bezt[match].vec[1][0] < startFrame)
+ i = match + 1;
+ else
+ i = match;
+
+ for (bezt = &fcu->bezt[i]; i < fcu->totvert; i++, bezt++) {
+ /* additional termination conditions based on the operator 'mode' property go here... */
+ if (ELEM(mode, POSE_PROPAGATE_BEFORE_FRAME, POSE_PROPAGATE_SMART_HOLDS)) {
+ /* stop if keyframe is outside the accepted range */
+ if (bezt->vec[1][0] > modeData.end_frame)
+ break;
+ }
+ else if (mode == POSE_PROPAGATE_NEXT_KEY) {
+ /* stop after the first keyframe has been processed */
+ if (first == 0)
+ break;
+ }
+ else if (mode == POSE_PROPAGATE_LAST_KEY) {
+ /* only affect this frame if it will be the last one */
+ if (i != (fcu->totvert-1))
+ continue;
+ }
+ else if (mode == POSE_PROPAGATE_SELECTED_MARKERS) {
+ /* only allow if there's a marker on this frame */
+ CfraElem *ce = NULL;
+
+ /* stop on matching marker if there is one */
+ for (ce = modeData.sel_markers.first; ce; ce = ce->next) {
+ if (ce->cfra == (int)(floor(bezt->vec[1][0] + 0.5f)))
+ break;
+ }
+
+ /* skip this keyframe if no marker */
+ if (ce == NULL)
+ continue;
+ }
+
+ /* just flatten handles, since values will now be the same either side... */
+ // TODO: perhaps a fade-out modulation of the value is required here (optional once again)?
+ bezt->vec[0][1] = bezt->vec[1][1] = bezt->vec[2][1] = refVal;
+
+ /* select keyframe to indicate that it's been changed */
+ bezt->f2 |= SELECT;
+ first = 0;
+ }
+}
+
+/* --------------------------------- */
+
+static int pose_propagate_exec (bContext *C, wmOperator *op)
+{
+ Scene *scene = CTX_data_scene(C);
+ Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
+ bAction *act= (ob && ob->adt)? ob->adt->action : NULL;
+
+ ListBase pflinks = {NULL, NULL};
+ tPChanFCurveLink *pfl;
+
+ tPosePropagate_ModeData modeData;
+ const int mode = RNA_enum_get(op->ptr, "mode");
+
+ /* sanity checks */
+ if (ob == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No object to propagate poses for");
+ return OPERATOR_CANCELLED;
+ }
+ if (act == NULL) {
+ BKE_report(op->reports, RPT_ERROR, "No keyframed poses to propagate to");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* isolate F-Curves related to the selected bones */
+ poseAnim_mapping_get(C, &pflinks, ob, act);
+
+ /* mode-specific data preprocessing (requiring no access to curves) */
+ if (mode == POSE_PROPAGATE_SELECTED_MARKERS) {
+ /* get a list of selected markers */
+ ED_markers_make_cfra_list(&scene->markers, &modeData.sel_markers, SELECT);
+ }
+ else {
+ /* assume everything else wants endFrame */
+ modeData.end_frame = RNA_float_get(op->ptr, "end_frame");
+ }
+
+ /* for each bone, perform the copying required */
+ for (pfl = pflinks.first; pfl; pfl = pfl->next) {
+ LinkData *ld;
+
+ /* mode-specific data preprocessing (requiring access to all curves) */
+ if (mode == POSE_PROPAGATE_SMART_HOLDS) {
+ /* we store in endFrame the end frame of the "long keyframe" (i.e. a held value) starting
+ * from the keyframe that occurs after the current frame
+ */
+ modeData.end_frame = pose_propagate_get_boneHoldEndFrame(ob, pfl, (float)CFRA);
+ }
+
+ /* go through propagating pose to keyframes, curve by curve */
+ for (ld = pfl->fcurves.first; ld; ld= ld->next)
+ pose_propagate_fcurve(op, ob, (FCurve *)ld->data, (float)CFRA, modeData);
+ }
+
+ /* free temp data */
+ poseAnim_mapping_free(&pflinks);
+
+ if (mode == POSE_PROPAGATE_SELECTED_MARKERS)
+ BLI_freelistN(&modeData.sel_markers);
+
+ /* updates + notifiers */
+ poseAnim_mapping_refresh(C, scene, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+/* --------------------------------- */
+
+void POSE_OT_propagate (wmOperatorType *ot)
+{
+ static EnumPropertyItem terminate_items[]= {
+ {POSE_PROPAGATE_SMART_HOLDS, "WHILE_HELD", 0, "While Held", "Propagate pose to all keyframes after current frame that don't change (Default behaviour)"},
+ {POSE_PROPAGATE_NEXT_KEY, "NEXT_KEY", 0, "To Next Keyframe", "Propagate pose to first keyframe following the current frame only"},
+ {POSE_PROPAGATE_LAST_KEY, "LAST_KEY", 0, "To Last Keyframe", "Propagate pose to the last keyframe only (i.e. making action cyclic)"},
+ {POSE_PROPAGATE_BEFORE_FRAME, "BEFORE_FRAME", 0, "Before Frame", "Propagate pose to all keyframes between current frame and 'Frame' property"},
+ {POSE_PROPAGATE_BEFORE_END, "BEFORE_END", 0, "Before Last Keyframe", "Propagate pose to all keyframes from current frame until no more are found"},
+ {POSE_PROPAGATE_SELECTED_MARKERS, "SELECTED_MARKERS", 0, "On Selected Markers", "Propagate pose to all keyframes occurring on frames with Scene Markers after the current frame"},
+ {0, NULL, 0, NULL, NULL}};
+
+ /* identifiers */
+ ot->name= "Propagate Pose";
+ ot->idname= "POSE_OT_propagate";
+ ot->description= "Copy selected aspects of the current pose to subsequent poses already keyframed";
+
+ /* callbacks */
+ ot->exec= pose_propagate_exec;
+ ot->poll= ED_operator_posemode; // XXX: needs selected bones!
+
+ /* flag */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* properties */
+ // TODO: add "fade out" control for tapering off amount of propagation as time goes by?
+ ot->prop= RNA_def_enum(ot->srna, "mode", terminate_items, POSE_PROPAGATE_SMART_HOLDS, "Terminate Mode", "Method used to determine when to stop propagating pose to keyframes");
+ RNA_def_float(ot->srna, "end_frame", 250.0, FLT_MIN, FLT_MAX, "End Frame", "Frame to stop propagating frames to (for 'Before Frame' mode)", 1.0, 250.0);
+}
+
+/* **************************************************** */
diff --git a/source/blender/editors/armature/poseUtils.c b/source/blender/editors/armature/poseUtils.c
index c9ba7583689..7ade93076e5 100644
--- a/source/blender/editors/armature/poseUtils.c
+++ b/source/blender/editors/armature/poseUtils.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/armature/poseUtils.c
+ * \ingroup edarmature
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
@@ -48,6 +53,7 @@
#include "BKE_action.h"
#include "BKE_armature.h"
#include "BKE_depsgraph.h"
+#include "BKE_idprop.h"
#include "BKE_context.h"
@@ -107,17 +113,21 @@ static void fcurves_to_pchan_links_get (ListBase *pfLinks, Object *ob, bAction *
pchan->flag |= POSE_SIZE;
/* store current transforms */
- // TODO: store axis-angle too?
VECCOPY(pfl->oldloc, pchan->loc);
VECCOPY(pfl->oldrot, pchan->eul);
VECCOPY(pfl->oldscale, pchan->size);
QUATCOPY(pfl->oldquat, pchan->quat);
+ VECCOPY(pfl->oldaxis, pchan->rotAxis);
+ pfl->oldangle = pchan->rotAngle;
+
+ /* make copy of custom properties */
+ if (transFlags & ACT_TRANS_PROP)
+ pfl->oldprops = IDP_CopyProperty(pchan->prop);
}
}
/* get sets of F-Curves providing transforms for the bones in the Pose */
-// TODO: separate the inner workings out to another helper func, since we need option of whether to take selected or visible bones...
void poseAnim_mapping_get (bContext *C, ListBase *pfLinks, Object *ob, bAction *act)
{
/* for each Pose-Channel which gets affected, get the F-Curves for that channel
@@ -128,6 +138,17 @@ void poseAnim_mapping_get (bContext *C, ListBase *pfLinks, Object *ob, bAction *
fcurves_to_pchan_links_get(pfLinks, ob, act, pchan);
}
CTX_DATA_END;
+
+ /* if no PoseChannels were found, try a second pass, doing visible ones instead
+ * i.e. if nothing selected, do whole pose
+ */
+ if (pfLinks->first == NULL) {
+ CTX_DATA_BEGIN(C, bPoseChannel*, pchan, visible_pose_bones)
+ {
+ fcurves_to_pchan_links_get(pfLinks, ob, act, pchan);
+ }
+ CTX_DATA_END;
+ }
}
/* free F-Curve <-> PoseChannel links */
@@ -139,6 +160,12 @@ void poseAnim_mapping_free (ListBase *pfLinks)
for (pfl= pfLinks->first; pfl; pfl= pfln) {
pfln= pfl->next;
+ /* free custom properties */
+ if (pfl->oldprops) {
+ IDP_FreeProperty(pfl->oldprops);
+ MEM_freeN(pfl->oldprops);
+ }
+
/* free list of F-Curve reference links */
BLI_freelistN(&pfl->fcurves);
@@ -180,59 +207,46 @@ void poseAnim_mapping_reset (ListBase *pfLinks)
bPoseChannel *pchan= pfl->pchan;
/* just copy all the values over regardless of whether they changed or not */
- // TODO; include axis-angle here too?
VECCOPY(pchan->loc, pfl->oldloc);
VECCOPY(pchan->eul, pfl->oldrot);
VECCOPY(pchan->size, pfl->oldscale);
QUATCOPY(pchan->quat, pfl->oldquat);
+ VECCOPY(pchan->rotAxis, pfl->oldaxis);
+ pchan->rotAngle = pfl->oldangle;
+
+ /* just overwrite values of properties from the stored copies (there should be some) */
+ if (pfl->oldprops)
+ IDP_SyncGroupValues(pfl->pchan->prop, pfl->oldprops);
}
}
/* perform autokeyframing after changes were made + confirmed */
void poseAnim_mapping_autoKeyframe (bContext *C, Scene *scene, Object *ob, ListBase *pfLinks, float cframe)
{
- static short keyingsets_need_init = 1;
- static KeyingSet *ks_loc = NULL;
- static KeyingSet *ks_rot = NULL;
- static KeyingSet *ks_scale = NULL;
-
- /* get keyingsets the first time this is run?
- * NOTE: it should be safe to store these static, since they're currently builtin ones
- * but maybe later this may change, in which case this code needs to be revised!
- */
- if (keyingsets_need_init) {
- ks_loc= ANIM_builtin_keyingset_get_named(NULL, "Location");
- ks_rot= ANIM_builtin_keyingset_get_named(NULL, "Rotation");
- ks_scale= ANIM_builtin_keyingset_get_named(NULL, "Scaling");
-
- keyingsets_need_init = 0;
- }
-
/* insert keyframes as necessary if autokeyframing */
if (autokeyframe_cfra_can_key(scene, &ob->id)) {
+ KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, "Whole Character");
+ ListBase dsources = {NULL, NULL};
tPChanFCurveLink *pfl;
- /* iterate over each pose-channel affected, applying the changes */
+ /* iterate over each pose-channel affected, tagging bones to be keyed */
+ /* XXX: here we already have the information about what transforms exist, though
+ * it might be easier to just overwrite all using normal mechanisms
+ */
for (pfl= pfLinks->first; pfl; pfl= pfl->next) {
- ListBase dsources = {NULL, NULL};
bPoseChannel *pchan= pfl->pchan;
- /* add datasource override for the PoseChannel so KeyingSet will do right thing */
+ /* add datasource override for the PoseChannel, to be used later */
ANIM_relative_keyingset_add_source(&dsources, &ob->id, &RNA_PoseBone, pchan);
- /* insert keyframes
- * - these keyingsets here use dsources, since we need to specify exactly which keyframes get affected
- */
- if (pchan->flag & POSE_LOC)
- ANIM_apply_keyingset(C, &dsources, NULL, ks_loc, MODIFYKEY_MODE_INSERT, cframe);
- if (pchan->flag & POSE_ROT)
- ANIM_apply_keyingset(C, &dsources, NULL, ks_rot, MODIFYKEY_MODE_INSERT, cframe);
- if (pchan->flag & POSE_SIZE)
- ANIM_apply_keyingset(C, &dsources, NULL, ks_scale, MODIFYKEY_MODE_INSERT, cframe);
-
- /* free the temp info */
- BLI_freelistN(&dsources);
+ /* clear any unkeyed tags */
+ if (pchan->bone)
+ pchan->bone->flag &= ~BONE_UNKEYED;
}
+
+ /* insert keyframes for all relevant bones in one go */
+ ANIM_apply_keyingset(C, &dsources, NULL, ks, MODIFYKEY_MODE_INSERT, cframe);
+ BLI_freelistN(&dsources);
}
}
diff --git a/source/blender/editors/armature/poselib.c b/source/blender/editors/armature/poselib.c
index 13a8cef3d07..5897da97f85 100644
--- a/source/blender/editors/armature/poselib.c
+++ b/source/blender/editors/armature/poselib.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/armature/poselib.c
+ * \ingroup edarmature
+ */
+
#include <stdlib.h>
#include <stdio.h>
@@ -293,7 +298,7 @@ static int poselib_sanitise_exec (bContext *C, wmOperator *op)
/* check if any pose matches this */
// TODO: don't go looking through the list like this every time...
for (marker= act->markers.first; marker; marker= marker->next) {
- if (IS_EQ(marker->frame, ak->cfra)) {
+ if (IS_EQ(marker->frame, (double)ak->cfra)) {
marker->flag = -1;
break;
}
@@ -349,7 +354,7 @@ void POSELIB_OT_action_sanitise (wmOperatorType *ot)
static void poselib_add_menu_invoke__replacemenu (bContext *C, uiLayout *layout, void *UNUSED(arg))
{
Object *ob= get_poselib_object(C);
- bAction *act= (ob) ? ob->poselib : NULL;
+ bAction *act= ob->poselib; /* never NULL */
TimeMarker *marker;
/* set the operator execution context correctly */
@@ -381,17 +386,17 @@ static int poselib_add_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED
return OPERATOR_CANCELLED;
/* start building */
- pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NONE);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
/* add new (adds to the first unoccupied frame) */
- uiItemIntO(layout, "Add New", ICON_NULL, "POSELIB_OT_pose_add", "frame", poselib_get_free_index(ob->poselib));
+ uiItemIntO(layout, "Add New", ICON_NONE, "POSELIB_OT_pose_add", "frame", poselib_get_free_index(ob->poselib));
/* check if we have any choices to add a new pose in any other way */
if ((ob->poselib) && (ob->poselib->markers.first)) {
/* add new (on current frame) */
- uiItemIntO(layout, "Add New (Current Frame)", ICON_NULL, "POSELIB_OT_pose_add", "frame", CFRA);
+ uiItemIntO(layout, "Add New (Current Frame)", ICON_NONE, "POSELIB_OT_pose_add", "frame", CFRA);
/* replace existing - submenu */
uiItemMenuF(layout, "Replace Existing...", 0, poselib_add_menu_invoke__replacemenu, NULL);
@@ -531,7 +536,7 @@ static int poselib_remove_exec (bContext *C, wmOperator *op)
/* remove relevant keyframes */
for (fcu= act->curves.first; fcu; fcu= fcu->next) {
BezTriple *bezt;
- int i;
+ unsigned int i;
if (fcu->bezt) {
for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, bezt++) {
@@ -815,7 +820,7 @@ static void poselib_apply_pose (tPoseLib_PreviewData *pld)
bAction *act= pld->act;
bActionGroup *agrp;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
KeyframeEditFunc group_ok_cb;
int frame= 1;
@@ -1450,7 +1455,7 @@ static void poselib_preview_cleanup (bContext *C, wmOperator *op)
/* change active pose setting */
act->active_marker= BLI_findindex(&act->markers, marker) + 1;
- action_set_activemarker(act, marker, 0);
+ action_set_activemarker(act, marker, NULL);
/* Update event for pose and deformation children */
DAG_id_tag_update(&ob->id, OB_RECALC_DATA);
diff --git a/source/blender/editors/armature/poseobject.c b/source/blender/editors/armature/poseobject.c
index c5ae60e982b..7f681ce25c0 100644
--- a/source/blender/editors/armature/poseobject.c
+++ b/source/blender/editors/armature/poseobject.c
@@ -27,6 +27,11 @@
* support for animation modes - Reevan McKay
*/
+/** \file blender/editors/armature/poseobject.c
+ * \ingroup edarmature
+ */
+
+
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
@@ -52,6 +57,7 @@
#include "BKE_constraint.h"
#include "BKE_deform.h"
#include "BKE_depsgraph.h"
+#include "BKE_fcurve.h"
#include "BKE_modifier.h"
#include "BKE_report.h"
@@ -68,6 +74,7 @@
#include "ED_screen.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "armature_intern.h"
@@ -1275,20 +1282,20 @@ static int pose_groups_menu_invoke (bContext *C, wmOperator *op, wmEvent *UNUSED
/* if there's no active group (or active is invalid), create a new menu to find it */
if (pose->active_group <= 0) {
/* create a new menu, and start populating it with group names */
- pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NONE);
layout= uiPupMenuLayout(pup);
/* special entry - allow to create new group, then use that
* (not to be used for removing though)
*/
if (strstr(op->idname, "assign")) {
- uiItemIntO(layout, "New Group", ICON_NULL, op->idname, "type", 0);
+ uiItemIntO(layout, "New Group", ICON_NONE, op->idname, "type", 0);
uiItemS(layout);
}
/* add entries for each group */
for (grp= pose->agroups.first, i=1; grp; grp=grp->next, i++)
- uiItemIntO(layout, grp->name, ICON_NULL, op->idname, "type", i);
+ uiItemIntO(layout, grp->name, ICON_NONE, op->idname, "type", i);
/* finish building the menu, and process it (should result in calling self again) */
uiPupMenuEnd(C, pup);
@@ -1594,7 +1601,7 @@ static int pose_autoside_names_exec (bContext *C, wmOperator *op)
void POSE_OT_autoside_names (wmOperatorType *ot)
{
static EnumPropertyItem axis_items[]= {
- {0, "XAXIS", 0, "X-Axis", "Left/Right"},
+ {0, "XAXIS", 0, "X-Axis", "Left/Right"},
{1, "YAXIS", 0, "Y-Axis", "Front/Back"},
{2, "ZAXIS", 0, "Z-Axis", "Top/Bottom"},
{0, NULL, 0, NULL, NULL}};
@@ -1701,20 +1708,23 @@ static int pose_armature_layers_invoke (bContext *C, wmOperator *op, wmEvent *ev
static int pose_armature_layers_exec (bContext *C, wmOperator *op)
{
Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
- bArmature *arm= (ob)? ob->data : NULL;
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
-
+
+ if(ob==NULL || ob->data==NULL) {
+ return OPERATOR_CANCELLED;
+ }
+
/* get the values set in the operator properties */
RNA_boolean_get_array(op->ptr, "layers", layers);
-
+
/* get pointer for armature, and write data there... */
- RNA_id_pointer_create((ID *)arm, &ptr);
+ RNA_id_pointer_create((ID *)ob->data, &ptr);
RNA_boolean_set_array(&ptr, "layers", layers);
-
+
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
-
+
return OPERATOR_FINISHED;
}
@@ -1788,25 +1798,28 @@ static int pose_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
static int pose_bone_layers_exec (bContext *C, wmOperator *op)
{
Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
- bArmature *arm= (ob)? ob->data : NULL;
PointerRNA ptr;
int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
-
+
+ if(ob==NULL || ob->data==NULL) {
+ return OPERATOR_CANCELLED;
+ }
+
/* get the values set in the operator properties */
RNA_boolean_get_array(op->ptr, "layers", layers);
-
+
/* set layers of pchans based on the values set in the operator props */
- CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pose_bones)
+ CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pose_bones)
{
/* get pointer for pchan, and write flags this way */
- RNA_pointer_create((ID *)arm, &RNA_Bone, pchan->bone, &ptr);
+ RNA_pointer_create((ID *)ob->data, &RNA_Bone, pchan->bone, &ptr);
RNA_boolean_set_array(&ptr, "layers", layers);
}
CTX_DATA_END;
-
+
/* note, notifier might evolve */
WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
-
+
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/armature/reeb.c b/source/blender/editors/armature/reeb.c
index 3def3dbf611..12a913d2854 100644
--- a/source/blender/editors/armature/reeb.c
+++ b/source/blender/editors/armature/reeb.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/armature/reeb.c
+ * \ingroup edarmature
+ */
+
#include <math.h>
#include <string.h> // for memcpy
diff --git a/source/blender/editors/armature/reeb.h b/source/blender/editors/armature/reeb.h
index 05fba609041..3ef33c4e2c4 100644
--- a/source/blender/editors/armature/reeb.h
+++ b/source/blender/editors/armature/reeb.h
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/armature/reeb.h
+ * \ingroup edarmature
+ */
+
#ifndef REEB_H_
#define REEB_H_
diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h
index 551c03b0ae5..63ba8ded7e6 100644
--- a/source/blender/editors/curve/curve_intern.h
+++ b/source/blender/editors/curve/curve_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/curve/curve_intern.h
+ * \ingroup edcurve
+ */
+
+
#ifndef ED_CURVE_INTERN_H
#define ED_CURVE_INTERN_H
diff --git a/source/blender/editors/curve/curve_ops.c b/source/blender/editors/curve/curve_ops.c
index 43df7fa3528..1c9ad8fe247 100644
--- a/source/blender/editors/curve/curve_ops.c
+++ b/source/blender/editors/curve/curve_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/curve/curve_ops.c
+ * \ingroup edcurve
+ */
+
+
#include <stdlib.h>
#include <math.h>
@@ -151,6 +156,7 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_SEL);
RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_SEL);
+ RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", DEL_PREV_SEL); /* same as above [#26623] */
RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_ALL);
RNA_enum_set(WM_keymap_add_item(keymap, "FONT_OT_move", HOMEKEY, KM_PRESS, 0, 0)->ptr, "type", LINE_BEGIN);
@@ -226,7 +232,7 @@ void ED_keymap_curve(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "CURVE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, 0, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "CURVE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
WM_keymap_add_item(keymap, "OBJECT_OT_vertex_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 86d344d566a..449ff3a0a9d 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/curve/editcurve.c
+ * \ingroup edcurve
+ */
+
+
#include <math.h>
#include <string.h>
@@ -78,9 +83,11 @@
#include "curve_intern.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
/* Undo stuff */
typedef struct {
@@ -1063,7 +1070,7 @@ static void curve_rename_fcurves(Object *obedit, ListBase *orig_curves)
CVKeyIndex *keyIndex;
char rna_path[64], orig_rna_path[64];
AnimData *ad= BKE_animdata_from_id(&cu->id);
- ListBase curves= {0, 0};
+ ListBase curves= {NULL, NULL};
FCurve *fcu, *next;
while(nu) {
@@ -2161,8 +2168,8 @@ static int smooth_exec(bContext *C, wmOperator *UNUSED(op))
if(bezt->f2 & SELECT) {
for(i=0; i<3; i++) {
val = bezt->vec[1][i];
- newval = ((beztOrig+(a-1))->vec[1][i] * 0.5) + ((beztOrig+(a+1))->vec[1][i] * 0.5);
- offset = (val*((1.0/6.0)*5)) + (newval*(1.0/6.0)) - val;
+ newval = ((beztOrig+(a-1))->vec[1][i] * 0.5f) + ((beztOrig+(a+1))->vec[1][i] * 0.5f);
+ offset = (val*((1.0f/6.0f)*5.0f)) + (newval*(1.0f/6.0f)) - val;
/* offset handles */
bezt->vec[1][i] += offset;
bezt->vec[0][i] += offset;
@@ -2181,8 +2188,8 @@ static int smooth_exec(bContext *C, wmOperator *UNUSED(op))
if(bp->f1 & SELECT) {
for(i=0; i<3; i++) {
val = bp->vec[i];
- newval = ((bpOrig+(a-1))->vec[i] * 0.5) + ((bpOrig+(a+1))->vec[i] * 0.5);
- offset = (val*((1.0/6.0)*5)) + (newval*(1.0/6.0)) - val;
+ newval = ((bpOrig+(a-1))->vec[i] * 0.5f) + ((bpOrig+(a+1))->vec[i] * 0.5f);
+ offset = (val*((1.0f/6.0f)*5.0f)) + (newval*(1.0f/6.0f)) - val;
bp->vec[i] += offset;
}
@@ -2266,9 +2273,9 @@ static int smooth_radius_exec(bContext *C, wmOperator *UNUSED(op))
if (start_sel>0) start_rad = (nu->bezt+start_sel-1)->radius;
if (end_sel!=-1 && end_sel < nu->pntsu) end_rad = (nu->bezt+start_sel+1)->radius;
- if (start_rad >= 0.0 && end_rad >= 0.0) (nu->bezt+start_sel)->radius = (start_rad + end_rad)/2;
- else if (start_rad >= 0.0) (nu->bezt+start_sel)->radius = start_rad;
- else if (end_rad >= 0.0) (nu->bezt+start_sel)->radius = end_rad;
+ if (start_rad >= 0.0f && end_rad >= 0.0f) (nu->bezt+start_sel)->radius = (start_rad + end_rad)/2;
+ else if (start_rad >= 0.0f) (nu->bezt+start_sel)->radius = start_rad;
+ else if (end_rad >= 0.0f) (nu->bezt+start_sel)->radius = end_rad;
} else {
/* if endpoints selected, then use them */
if (start_sel==0) {
@@ -2288,7 +2295,7 @@ static int smooth_radius_exec(bContext *C, wmOperator *UNUSED(op))
range = (float)(end_sel - start_sel) + 2.0f;
for(bezt=nu->bezt+start_sel, a=start_sel; a<=end_sel; a++, bezt++) {
fac = (float)(1+a-start_sel) / range;
- bezt->radius = start_rad*(1.0-fac) + end_rad*fac;
+ bezt->radius = start_rad*(1.0f-fac) + end_rad*fac;
}
}
}
@@ -2328,9 +2335,9 @@ static int smooth_radius_exec(bContext *C, wmOperator *UNUSED(op))
if (start_sel>0) start_rad = (nu->bp+start_sel-1)->radius;
if (end_sel!=-1 && end_sel < nu->pntsu) end_rad = (nu->bp+start_sel+1)->radius;
- if (start_rad >= 0.0 && end_rad >= 0.0) (nu->bp+start_sel)->radius = (start_rad + end_rad)/2;
- else if (start_rad >= 0.0) (nu->bp+start_sel)->radius = start_rad;
- else if (end_rad >= 0.0) (nu->bp+start_sel)->radius = end_rad;
+ if (start_rad >= 0.0f && end_rad >= 0.0f) (nu->bp+start_sel)->radius = (start_rad + end_rad)/2;
+ else if (start_rad >= 0.0f) (nu->bp+start_sel)->radius = start_rad;
+ else if (end_rad >= 0.0f) (nu->bp+start_sel)->radius = end_rad;
} else {
/* if endpoints selected, then use them */
if (start_sel==0) {
@@ -2350,7 +2357,7 @@ static int smooth_radius_exec(bContext *C, wmOperator *UNUSED(op))
range = (float)(end_sel - start_sel) + 2.0f;
for(bp=nu->bp+start_sel, a=start_sel; a<=end_sel; a++, bp++) {
fac = (float)(1+a-start_sel) / range;
- bp->radius = start_rad*(1.0-fac) + end_rad*fac;
+ bp->radius = start_rad*(1.0f-fac) + end_rad*fac;
}
}
}
@@ -2460,7 +2467,7 @@ void selectend_nurb(Object *obedit, short selfirst, short doswap, short selstatu
int a;
short sel;
- if(obedit==0) return;
+ if(obedit==NULL) return;
cu= (Curve*)obedit->data;
cu->lastsel= NULL;
@@ -3309,7 +3316,7 @@ static short findnearestNurbvert(ViewContext *vc, short sel, int mval[2], Nurb *
/* sel==1: selected gets a disadvantage */
/* in nurb and bezt or bp the nearest is written */
/* return 0 1 2: handlepunt */
- struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; int dist, hpoint, select, mval[2]; } data = {0};
+ struct { BPoint *bp; BezTriple *bezt; Nurb *nurb; int dist, hpoint, select, mval[2]; } data = {NULL};
data.dist = 100;
data.hpoint = 0;
@@ -3336,24 +3343,24 @@ static void findselectedNurbvert(ListBase *editnurb, Nurb **nu, BezTriple **bezt
BPoint *bp1;
int a;
- *nu= 0;
- *bezt= 0;
- *bp= 0;
+ *nu= NULL;
+ *bezt= NULL;
+ *bp= NULL;
for(nu1= editnurb->first; nu1; nu1= nu1->next) {
if(nu1->type == CU_BEZIER) {
bezt1= nu1->bezt;
a= nu1->pntsu;
while(a--) {
if( (bezt1->f1 & SELECT) || (bezt1->f2 & SELECT) || (bezt1->f3 & SELECT) ) {
- if(*nu!=0 && *nu!= nu1) {
- *nu= 0;
- *bp= 0;
- *bezt= 0;
+ if(*nu != NULL && *nu != nu1) {
+ *nu= NULL;
+ *bp= NULL;
+ *bezt= NULL;
return;
}
else if(*bezt || *bp) {
- *bp= 0;
- *bezt= 0;
+ *bp= NULL;
+ *bezt= NULL;
}
else {
*bezt= bezt1;
@@ -3368,15 +3375,15 @@ static void findselectedNurbvert(ListBase *editnurb, Nurb **nu, BezTriple **bezt
a= nu1->pntsu*nu1->pntsv;
while(a--) {
if( bp1->f1 & 1 ) {
- if(*nu!=0 && *nu!= nu1) {
- *bp= 0;
- *bezt= 0;
- *nu= 0;
+ if(*nu != NULL && *nu != nu1) {
+ *bp= NULL;
+ *bezt= NULL;
+ *nu= NULL;
return;
}
else if(*bezt || *bp) {
- *bp= 0;
- *bezt= 0;
+ *bp= NULL;
+ *bezt= NULL;
}
else {
*bp= bp1;
@@ -3415,7 +3422,7 @@ static int convertspline(short type, Nurb *nu)
bezt++;
}
MEM_freeN(nu->bp);
- nu->bp= 0;
+ nu->bp= NULL;
nu->pntsu= nr;
nu->type = CU_BEZIER;
calchandlesNurb(nu);
@@ -3515,7 +3522,7 @@ static int convertspline(short type, Nurb *nu)
bezt++;
}
MEM_freeN(nu->bp);
- nu->bp= 0;
+ nu->bp= NULL;
MEM_freeN(nu->knotsu);
nu->knotsu= NULL;
nu->pntsu= nr;
@@ -3574,6 +3581,7 @@ void CURVE_OT_spline_type_set(wmOperatorType *ot)
/* identifiers */
ot->name= "Set Spline Type";
+ ot->description = "Set type of actibe spline";
ot->idname= "CURVE_OT_spline_type_set";
/* api callbacks */
@@ -3616,6 +3624,7 @@ void CURVE_OT_handle_type_set(wmOperatorType *ot)
/* identifiers */
ot->name= "Set Handle Type";
+ ot->description = "Set type of handles for selected control points";
ot->idname= "CURVE_OT_handle_type_set";
/* api callbacks */
@@ -3720,12 +3729,12 @@ typedef struct NurbSort {
float vec[3];
} NurbSort;
-static ListBase nsortbase= {0, 0};
+static ListBase nsortbase= {NULL, NULL};
/* static NurbSort *nusmain; */ /* this var seems to go unused... at least in this file */
static void make_selection_list_nurb(ListBase *editnurb)
{
- ListBase nbase= {0, 0};
+ ListBase nbase= {NULL, NULL};
NurbSort *nus, *nustest, *headdo, *taildo;
Nurb *nu;
BPoint *bp;
@@ -3745,7 +3754,7 @@ static void make_selection_list_nurb(ListBase *editnurb)
add_v3_v3(nus->vec, bp->vec);
bp++;
}
- mul_v3_fl(nus->vec, 1.0/(float)nu->pntsu);
+ mul_v3_fl(nus->vec, 1.0f/(float)nu->pntsu);
}
@@ -3760,7 +3769,7 @@ static void make_selection_list_nurb(ListBase *editnurb)
while(nbase.first) {
headdist= taildist= 1.0e30;
- headdo= taildo= 0;
+ headdo= taildo= NULL;
nustest= nbase.first;
while(nustest) {
@@ -3971,7 +3980,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
ListBase *nubase= curve_get_editcurve(obedit);
- Nurb *nu, *nu1=0, *nu2=0;
+ Nurb *nu, *nu1=NULL, *nu2=NULL;
BPoint *bp;
float *fp, offset;
int a, ok= 0;
@@ -4006,7 +4015,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
if((nu->flagu & CU_NURB_CYCLIC)==0) { /* not cyclic */
if(nu->type == CU_BEZIER) {
- if(nu1==0) {
+ if(nu1==NULL) {
if( BEZSELECTED_HIDDENHANDLES(cu, nu->bezt) ) nu1= nu;
else {
if( BEZSELECTED_HIDDENHANDLES(cu, &(nu->bezt[nu->pntsu-1])) ) {
@@ -4016,7 +4025,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
}
}
}
- else if(nu2==0) {
+ else if(nu2==NULL) {
if( BEZSELECTED_HIDDENHANDLES(cu, nu->bezt) ) {
nu2= nu;
switchdirectionNurb(nu);
@@ -4032,7 +4041,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
}
else if(nu->pntsv==1) {
bp= nu->bp;
- if(nu1==0) {
+ if(nu1==NULL) {
if( bp->f1 & SELECT) nu1= nu;
else {
bp= bp+(nu->pntsu-1);
@@ -4043,7 +4052,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
}
}
}
- else if(nu2==0) {
+ else if(nu2==NULL) {
if( bp->f1 & SELECT ) {
nu2= nu;
switchdirectionNurb(nu);
@@ -4101,7 +4110,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
nu1->knotsu= fp;
- offset= nu1->knotsu[a-1] +1.0;
+ offset= nu1->knotsu[a-1] + 1.0f;
fp= nu1->knotsu+a;
for(a=0; a<nu2->pntsu; a++, fp++) {
if(nu2->knotsu)
@@ -4169,8 +4178,8 @@ int mouse_nurb(bContext *C, short mval[2], int extend)
ListBase *editnurb= curve_get_editcurve(obedit);
ViewContext vc;
Nurb *nu;
- BezTriple *bezt=0;
- BPoint *bp=0;
+ BezTriple *bezt=NULL;
+ BPoint *bp=NULL;
int location[2];
short hand;
@@ -4286,8 +4295,8 @@ static int spin_nurb(float viewmat[][4], Object *obedit, float *axis, float *cen
mul_m3_m3m3(scalemat1,imat,tmat);
unit_m3(scalemat2);
- scalemat2[0][0]/= M_SQRT2;
- scalemat2[1][1]/= M_SQRT2;
+ scalemat2[0][0]/= (float)M_SQRT2;
+ scalemat2[1][1]/= (float)M_SQRT2;
mul_m3_m3m3(tmat,persmat,bmat);
mul_m3_m3m3(cmat,scalemat2,tmat);
@@ -4469,7 +4478,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
mul_m3_v3(imat,newbp->vec);
newbp->vec[3]= 1.0;
- newnu->knotsu= newnu->knotsv= 0;
+ newnu->knotsu= newnu->knotsv= NULL;
nurbs_knot_calc_u(newnu);
ok= 1;
@@ -4535,7 +4544,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
bezt= newbezt;
ok= 1;
}
- else bezt= 0;
+ else bezt= NULL;
if(bezt) {
if(!newnu) nu->pntsu++;
@@ -4606,7 +4615,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
bp= newbp;
ok= 1;
}
- else bp= 0;
+ else bp= NULL;
if(bp) {
if(mode=='e') {
@@ -4725,7 +4734,7 @@ static int extrude_exec(bContext *C, wmOperator *UNUSED(op))
static int extrude_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
if(extrude_exec(C, op) == OPERATOR_FINISHED) {
- RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
+ RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION);
WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
return OPERATOR_FINISHED;
@@ -4738,6 +4747,7 @@ void CURVE_OT_extrude(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Extrude";
+ ot->description = "Extrude selected control point(s) and move";
ot->idname= "CURVE_OT_extrude";
/* api callbacks */
@@ -4749,7 +4759,7 @@ void CURVE_OT_extrude(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+ RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
}
/***************** make cyclic operator **********************/
@@ -4844,7 +4854,7 @@ static int toggle_cyclic_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(eve
for(nu= editnurb->first; nu; nu= nu->next) {
if(nu->pntsu>1 || nu->pntsv>1) {
if(nu->type==CU_NURBS) {
- pup= uiPupMenuBegin(C, "Direction", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Direction", ICON_NONE);
layout= uiPupMenuLayout(pup);
uiItemsEnumO(layout, op->type->idname, "direction");
uiPupMenuEnd(C, pup);
@@ -4866,6 +4876,7 @@ void CURVE_OT_cyclic_toggle(wmOperatorType *ot)
/* identifiers */
ot->name= "Toggle Cyclic";
+ ot->description = "Make active spline closed/opened loop";
ot->idname= "CURVE_OT_cyclic_toggle";
/* api callbacks */
@@ -5025,13 +5036,13 @@ static int select_row_exec(bContext *C, wmOperator *UNUSED(op))
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
ListBase *editnurb= curve_get_editcurve(obedit);
- static BPoint *last=0;
+ static BPoint *last= NULL;
static int direction=0;
Nurb *nu;
BPoint *bp;
int u = 0, v = 0, a, b, ok=0;
- if(editnurb->first==0)
+ if(editnurb->first == NULL)
return OPERATOR_CANCELLED;
if(cu->lastsel==NULL)
return OPERATOR_CANCELLED;
@@ -5602,7 +5613,7 @@ static int duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
duplicate_exec(C, op);
- RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
+ RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION);
WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
return OPERATOR_FINISHED;
@@ -5612,6 +5623,7 @@ void CURVE_OT_duplicate(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Duplicate";
+ ot->description = "Duplicate selected control points and segments between them";
ot->idname= "CURVE_OT_duplicate";
/* api callbacks */
@@ -5623,7 +5635,7 @@ void CURVE_OT_duplicate(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+ RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
}
/********************** delete operator *********************/
@@ -5951,14 +5963,14 @@ static int delete_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
uiLayout *layout;
if(obedit->type==OB_SURF) {
- pup= uiPupMenuBegin(C, "Delete", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Delete", ICON_NONE);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, NULL, 0, "type", 0);
uiItemEnumO(layout, op->type->idname, NULL, 0, "type", 2);
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "Delete", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Delete", ICON_NONE);
layout= uiPupMenuLayout(pup);
uiItemsEnumO(layout, op->type->idname, "type");
uiPupMenuEnd(C, pup);
@@ -5977,6 +5989,7 @@ void CURVE_OT_delete(wmOperatorType *ot)
/* identifiers */
ot->name= "Delete";
+ ot->description = "Delete selected control points or segments";
ot->idname= "CURVE_OT_delete";
/* api callbacks */
@@ -6059,7 +6072,7 @@ int join_curve_exec(bContext *C, wmOperator *UNUSED(op))
float imat[4][4], cmat[4][4];
int a;
- tempbase.first= tempbase.last= 0;
+ tempbase.first= tempbase.last= NULL;
/* trasnform all selected curves inverse in obact */
invert_m4_m4(imat, ob->obmat);
@@ -6212,10 +6225,10 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob)
bezt->radius = 1.0;
bezt->vec[1][0]+= -grid;
- bezt->vec[0][0]+= -1.5*grid;
- bezt->vec[0][1]+= -0.5*grid;
- bezt->vec[2][0]+= -0.5*grid;
- bezt->vec[2][1]+= 0.5*grid;
+ bezt->vec[0][0]+= -1.5f*grid;
+ bezt->vec[0][1]+= -0.5f*grid;
+ bezt->vec[2][0]+= -0.5f*grid;
+ bezt->vec[2][1]+= 0.5f*grid;
for(a=0;a<3;a++) mul_m4_v3(mat, bezt->vec[a]);
bezt++;
@@ -6248,7 +6261,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob)
}
bp= nu->bp;
- bp->vec[0]+= -1.5*grid;
+ bp->vec[0]+= -1.5f*grid;
bp++;
bp->vec[0]+= -grid;
bp->vec[1]+= grid;
@@ -6256,7 +6269,7 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob)
bp->vec[0]+= grid;
bp->vec[1]+= grid;
bp++;
- bp->vec[0]+= 1.5*grid;
+ bp->vec[0]+= 1.5f*grid;
bp= nu->bp;
for(a=0;a<4;a++, bp++) mul_m4_v3(mat,bp->vec);
@@ -6284,13 +6297,13 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob)
}
bp= nu->bp;
- bp->vec[0]+= -2.0*grid;
+ bp->vec[0]+= -2.0f*grid;
bp++;
bp->vec[0]+= -grid;
bp++; bp++;
bp->vec[0]+= grid;
bp++;
- bp->vec[0]+= 2.0*grid;
+ bp->vec[0]+= 2.0f*grid;
bp= nu->bp;
for(a=0;a<5;a++, bp++) mul_m4_v3(mat,bp->vec);
@@ -6355,8 +6368,8 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob)
bp->vec[1]+= nurbcircle[a][1]*grid;
}
else {
- bp->vec[0]+= 0.25*nurbcircle[a][0]*grid-.75*grid;
- bp->vec[2]+= 0.25*nurbcircle[a][1]*grid;
+ bp->vec[0]+= 0.25f*nurbcircle[a][0]*grid-0.75f*grid;
+ bp->vec[2]+= 0.25f*nurbcircle[a][1]*grid;
}
if(a & 1) bp->vec[3]= 0.25*M_SQRT2;
else bp->vec[3]= 1.0;
@@ -6385,9 +6398,9 @@ Nurb *add_nurbs_primitive(bContext *C, float mat[4][4], int type, int newob)
for(a=0; a<4; a++) {
for(b=0; b<4; b++) {
bp->f1= SELECT;
- fac= (float)a -1.5;
+ fac= (float)a -1.5f;
bp->vec[0]+= fac*grid;
- fac= (float)b -1.5;
+ fac= (float)b -1.5f;
bp->vec[1]+= fac*grid;
if(a==1 || a==2) if(b==1 || b==2) {
bp->vec[2]+= grid;
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index ef1c53c9f5d..37cc135a6a8 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/curve/editfont.c
+ * \ingroup edcurve
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
@@ -611,7 +616,7 @@ static EnumPropertyItem style_items[]= {
{CU_CHINFO_SMALLCAPS, "SMALL_CAPS", 0, "Small Caps", ""},
{0, NULL, 0, NULL, NULL}};
-static int set_style(bContext *C, int style, int clear)
+static int set_style(bContext *C, const int style, const int clear)
{
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
@@ -636,10 +641,8 @@ static int set_style(bContext *C, int style, int clear)
static int set_style_exec(bContext *C, wmOperator *op)
{
- int style, clear;
-
- style= RNA_enum_get(op->ptr, "style");
- clear= RNA_enum_get(op->ptr, "clear");
+ const int style= RNA_enum_get(op->ptr, "style");
+ const int clear= RNA_boolean_get(op->ptr, "clear");
return set_style(C, style, clear);
}
@@ -1090,7 +1093,7 @@ static int line_break_exec(bContext *C, wmOperator *op)
Object *obedit= CTX_data_edit_object(C);
Curve *cu= obedit->data;
EditFont *ef= cu->editfont;
- int ctrl= RNA_enum_get(op->ptr, "ctrl");
+ const int ctrl= RNA_boolean_get(op->ptr, "ctrl");
if(ctrl) {
insert_into_textbuf(obedit, 1);
@@ -1368,16 +1371,6 @@ void FONT_OT_text_insert(wmOperatorType *ot)
/*********************** textbox add operator *************************/
-static int textbox_poll(bContext *C)
-{
- Object *ob = CTX_data_active_object(C);
-
- if (!ED_operator_object_active_editable(C) ) return 0;
- if (ob->type != OB_FONT) return 0;
-
- return 1;
-}
-
static int textbox_add_exec(bContext *C, wmOperator *UNUSED(op))
{
Object *obedit= CTX_data_active_object(C);
@@ -1404,8 +1397,8 @@ void FONT_OT_textbox_add(wmOperatorType *ot)
/* api callbacks */
ot->exec= textbox_add_exec;
- ot->poll= textbox_poll;
-
+ ot->poll= ED_operator_object_active_editable_font;
+
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1447,7 +1440,7 @@ void FONT_OT_textbox_remove(wmOperatorType *ot)
/* api callbacks */
ot->exec= textbox_remove_exec;
- ot->poll= textbox_poll;
+ ot->poll= ED_operator_object_active_editable_font;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
diff --git a/source/blender/editors/curve/lorem.c b/source/blender/editors/curve/lorem.c
index 1c86acf7b1b..bd65cdddec4 100644
--- a/source/blender/editors/curve/lorem.c
+++ b/source/blender/editors/curve/lorem.c
@@ -20,6 +20,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/curve/lorem.c
+ * \ingroup edcurve
+ */
+
+
#include "curve_intern.h"
const char ED_lorem[]= {
diff --git a/source/blender/editors/datafiles/Bfont.c b/source/blender/editors/datafiles/Bfont.c
index 1dcf9f72af4..6f8adae5f3f 100644
--- a/source/blender/editors/datafiles/Bfont.c
+++ b/source/blender/editors/datafiles/Bfont.c
@@ -28,6 +28,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/datafiles/Bfont.c
+ * \ingroup eddatafiles
+ */
+
+
int datatoc_Bfont_size= 25181;
char datatoc_Bfont[25181]= {128, 1, 228, 1, 0, 0, 37, 33, 80, 83, 45, 65, 100, 111, 98, 101, 70, 111, 110, 116, 45, 49, 46, 48, 58, 32, 66, 102, 111, 110, 116, 32, 48, 48, 49, 46, 48, 48, 49, 10, 49, 49, 32, 100, 105, 99, 116, 32, 98, 101, 103, 105, 110, 10, 47, 70, 111, 110, 116, 73, 110, 102, 111, 32, 49, 48, 32, 100, 105, 99, 116, 32, 100, 117, 112, 32, 98, 101, 103, 105, 110, 10, 47, 118, 101, 114, 115, 105, 111, 110, 32, 40, 48, 48, 49, 46, 48, 48, 49, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 70, 117, 108, 108, 78, 97, 109, 101, 32, 40, 66, 102, 111, 110, 116, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 70, 97, 109, 105, 108, 121, 78, 97, 109, 101, 32, 40, 66, 102, 111, 110, 116, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 87, 101, 105, 103, 104, 116, 32, 40, 82, 101, 103, 117, 108, 97, 114, 41, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 73, 116, 97, 108, 105, 99, 65, 110, 103, 108, 101, 32, 48, 32, 100, 101, 102, 10, 47, 105, 115, 70, 105, 120, 101, 100, 80, 105, 116, 99, 104, 32, 102, 97, 108, 115, 101, 32, 100, 101, 102, 10, 47, 85, 110, 100, 101, 114, 108, 105, 110, 101, 80, 111, 115, 105, 116, 105, 111, 110, 32, 45, 49, 48, 48, 32, 100, 101, 102, 10, 47, 85, 110, 100, 101, 114, 108, 105, 110, 101, 84, 104, 105, 99, 107, 110, 101, 115, 115, 32, 53, 48, 32, 100, 101, 102, 10, 101, 110, 100, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 47, 70, 111, 110, 116, 78, 97, 109, 101, 32, 47, 66, 102, 111, 110, 116, 32, 100, 101, 102, 10, 47, 69, 110, 99, 111, 100, 105, 110, 103, 32, 83, 116, 97, 110, 100, 97, 114, 100, 69, 110, 99, 111, 100, 105, 110, 103, 32, 100, 101, 102, 10, 47, 80, 97, 105, 110, 116, 84, 121, 112, 101, 32, 48, 32, 100, 101, 102, 10, 47, 70, 111, 110, 116, 84, 121, 112, 101, 32, 49, 32, 100, 101, 102, 10, 47, 70, 111, 110, 116, 77, 97, 116, 114, 105, 120, 32, 91, 48, 46, 48, 48, 49, 32, 48, 32, 48, 32, 48, 46, 48, 48, 49, 32, 48, 32, 48, 93, 32, 114, 101, 97, 100, 111, 110, 108, 121, 32, 100, 101, 102, 10, 99, 117, 114, 114, 101, 110, 116, 100, 105, 99, 116, 32, 101, 110, 100, 10, 99, 117, 114, 114, 101, 110, 116, 102, 105, 108, 101, 32, 101, 101, 120, 101, 99, 10, 128, 2, 146, 94, 0, 0, 217, 214, 111, 99, 59, 132, 106, 152, 155, 153, 116, 176, 23, 159, 198, 204, 68, 91, 194, 192, 49, 3, 198, 133, 112, 167, 179, 84, 164, 162, 128, 174, 111, 191, 127, 152, 247, 90, 132, 186, 206, 45, 3, 106, 107, 81, 184, 72, 73, 49, 89, 29, 146, 229, 6, 158, 98, 38, 213, 173, 204, 93, 228, 248, 16, 122, 166, 154, 53, 181, 95, 106, 155, 75, 79, 147, 197, 108, 35, 188, 198, 29, 215, 191, 143, 50, 242, 29, 88, 228, 26, 95, 121, 12, 238, 47, 2, 175, 73, 134, 149, 233, 12, 29, 11, 210, 89, 231, 91, 2, 25, 48, 11, 15, 105, 44, 51, 119, 156, 42, 166, 122, 232, 81, 122, 190, 18, 48, 8, 69, 34, 74, 246, 173, 93, 169, 219, 154, 26, 58, 64, 251, 6, 179, 106, 156, 205, 105, 18, 85, 7, 252, 45, 233, 208, 65, 132, 199, 96, 66, 240, 63, 207, 209, 83, 132, 0, 35, 151, 42, 129, 42, 185, 179, 203, 86, 112, 193, 206, 39, 89, 113, 28, 117, 41, 66, 98, 214, 242, 145, 175, 155, 124, 118, 7, 30, 218, 126, 122, 208, 38, 33, 98, 50, 34, 185, 54, 8, 122, 178, 127, 254, 95, 7, 134, 71, 6, 101, 146, 24, 61, 195, 71, 174, 146, 230, 191, 86, 177, 123, 237, 206, 19, 104, 70, 246, 162, 163, 118, 171, 140, 11, 192, 255, 78, 52, 125, 32, 253, 14, 199, 126, 250, 177, 240, 99, 49, 0, 20, 141, 42, 125, 47, 210, 31, 18, 90, 170, 205, 143, 219, 153, 121, 131, 43, 103, 13, 138, 170, 118, 210, 18, 186, 181, 97, 70, 25, 144, 150, 12, 53, 110, 184, 216, 233, 243, 198, 93, 157, 254, 127, 140, 44, 138, 123, 43, 233, 158, 99, 255, 108, 134, 136, 60, 29, 229, 7, 141, 163, 185, 30, 3, 228, 132, 13, 221, 109, 48, 227, 60, 227, 135, 117, 220, 128, 67, 195, 147, 32, 118, 71, 190, 131, 11, 245, 200, 93, 30, 226, 32, 114, 26, 39, 232, 138, 33, 109, 232, 1, 11, 233, 212, 78, 221, 88, 158, 135, 95, 159, 14, 38, 31, 12, 106, 255, 51, 147, 42, 139, 254, 210, 119, 6, 96, 221, 226, 140, 183, 213, 222, 5, 205, 13, 140, 253, 214, 125, 103, 227, 52, 60, 102, 31, 250, 163, 147, 228, 167, 58, 207, 156, 68, 166, 150, 167, 169, 116, 83, 194, 150, 104, 152, 31, 7, 157, 38, 76, 29, 10, 247, 63, 57, 194, 106, 230, 183, 120, 135, 187, 201, 211, 82, 234, 168, 182, 167, 90, 56, 37, 109, 160, 144, 13, 48, 204, 190, 14, 169, 103, 127, 136, 102, 24, 81, 61, 32, 233, 228, 158, 18, 235, 189, 28, 0, 222, 67, 17, 110, 143, 71, 223, 181, 33, 17, 66, 81, 210, 7, 23, 186, 245, 229, 198, 143, 62, 113, 33, 80, 236, 87, 148, 65, 42, 27, 111, 128, 223, 196, 140, 45, 32, 91, 123, 158, 136, 153, 166, 144, 126, 115, 133, 220, 254, 234, 192, 123, 14, 239, 75, 199, 116, 28, 241, 25, 30, 66, 226, 248, 159, 142, 46, 41, 10, 237, 111, 205, 31, 230, 72, 196, 49, 200, 50, 29, 115, 153, 141, 198, 225, 218, 157, 86, 56, 67, 249, 99, 50, 25, 151, 14, 200, 35, 186, 250, 204, 151, 187, 209, 51, 129, 161, 68, 118, 130, 31, 25, 134, 255, 75, 170, 240, 225, 113, 144, 5, 178, 133, 45, 85, 242, 66, 10, 10, 65, 138, 93, 147, 72, 210, 250, 209, 123, 148, 135, 12, 156, 94, 13, 250, 31, 211, 157, 82, 128, 132, 143, 11, 155, 47, 211, 151, 232, 142, 253, 82, 104, 234, 231, 190, 169, 78, 32, 90, 2, 41, 201, 122, 142, 205, 144, 234, 204, 198, 227, 56, 57, 6, 63, 8, 237, 89, 199, 30, 226, 169, 48, 198, 191, 38, 114, 87, 135, 189, 98, 251, 224, 210, 154, 58, 87, 26, 56, 41, 219, 119, 124, 109, 83, 182, 169, 166, 123, 255, 190, 35, 121, 177, 37, 92, 128, 242, 247, 132, 218, 149, 140, 116, 184, 163, 13, 248, 138, 68, 124, 229, 211, 89, 210, 101, 172, 149, 221, 182, 113, 36, 182, 46, 5, 141, 127, 147, 54, 118, 67, 107, 105, 187, 40, 53, 208, 170, 25, 45, 113, 216, 110, 135, 56, 7, 26, 14, 225, 61, 79, 228, 72, 30, 39, 220, 195, 227, 229, 153, 196, 28, 6, 107, 240, 54, 67, 6, 94, 143, 0, 34, 180, 49, 14, 41, 111, 9, 41, 94, 203, 184, 139, 142, 34, 140, 138, 90, 25, 216, 89, 252, 45, 46, 132, 169, 154, 230, 131, 15, 20, 100, 99, 235, 106, 73, 185, 89, 6, 66, 230, 171, 202, 22, 213, 227, 183, 32, 138, 116, 253, 208, 230, 121, 16, 63, 238, 132, 69, 28, 135, 88, 115, 18, 21, 11, 102, 172, 200, 37, 222, 255, 100, 221, 80, 173, 218, 53, 210, 250, 148, 211, 241, 97, 150, 185, 43, 250, 138, 14, 122, 133, 30, 191, 54, 158, 118, 22, 12, 232, 25, 228, 60, 101, 206, 119, 29, 57, 12, 99, 36, 167, 182, 153, 86, 195, 21, 70, 154, 102, 106, 45, 236, 70, 151, 143, 185, 207, 252, 106, 46, 168, 80, 216, 206, 157, 171, 118, 77, 82, 153, 24, 54, 165, 128, 160, 27, 195, 117, 241, 141, 93, 151, 233, 239, 244, 73, 123, 133, 42, 138, 123, 68, 159, 225, 209, 171, 242, 70, 212, 6, 168, 19, 116, 228, 0, 14, 148, 191, 132, 10, 254, 83, 125, 20, 17, 71, 126, 142, 56, 80, 55, 48, 125, 184, 172, 156, 163, 161, 72, 249, 105, 204, 207, 179, 217, 115, 177, 2, 82, 220, 142, 14, 180, 138, 254, 83, 139, 36, 70, 203, 91, 81, 82, 229, 20, 253, 78, 132, 213, 64, 154, 163, 59, 93, 245, 168, 38, 148, 48, 228, 13, 186, 204, 95, 140, 184, 118, 22, 130, 111, 27, 38, 139, 127, 106, 172, 161, 254, 136, 187, 166, 48, 162, 152, 124, 69, 27, 186, 50, 126, 7, 144, 43, 75, 176, 145, 159, 202, 244, 7, 78, 203, 250, 32, 42, 195, 71, 186, 90, 92, 162, 126, 98, 44, 195, 163, 47, 88, 124, 43, 177, 122, 251, 254, 29, 161, 70, 98, 235, 133, 52, 12, 28, 184, 67, 145, 73, 88, 99, 69, 60, 227, 142, 15, 218, 82, 167, 57, 225, 230, 218, 131, 251, 171, 11, 63, 191, 65, 236, 178, 63, 159, 213, 211, 114, 64, 200, 85, 73, 40, 94, 123, 108, 171, 89, 169, 206, 99, 196, 31, 15, 152, 138, 77, 137, 210, 197, 228, 255, 73, 126, 120, 249, 214, 170, 212, 168, 73, 54, 125, 113, 78, 226, 37, 137, 249, 188, 239, 33, 231, 244, 125, 116, 137, 126, 187, 31, 193, 194, 118, 121, 19, 80, 250, 87, 48, 80, 62, 246, 29, 121, 247, 135, 198, 193, 253, 148, 211, 17, 210, 17, 247, 44, 205, 91, 1, 190, 195, 236, 66, 95, 144, 58, 235, 2, 42, 79, 25, 82, 164, 167, 244, 114, 188, 192, 101, 23, 55, 69, 141, 168, 28, 89, 60, 116, 91, 162, 121, 28, 123, 96, 252, 165, 180, 69, 56, 232, 54, 122, 138, 223, 158, 131, 94, 171, 82, 4, 112, 13, 160, 117, 170, 146, 28, 241, 154, 211, 119, 16, 233, 141, 96, 94, 167, 13, 37, 118, 105, 73, 211, 97, 109, 148, 131, 190, 119, 45, 124, 208, 225, 39, 94, 48, 62, 33, 188, 248, 154, 233, 46, 158, 7, 144, 1, 121, 0, 235, 71, 25, 52, 13, 46, 1, 25, 171, 27, 179, 170, 164, 231, 2, 25, 182, 226, 250, 96, 192, 23, 185, 218, 218, 16, 140, 36, 180, 216, 59, 95, 49, 165, 162, 134, 252, 47, 168, 65, 242, 178, 211, 62, 10, 239, 153, 65, 219, 247, 72, 17, 105, 49, 254, 85, 136, 211, 117, 240, 218, 77, 221, 166, 41, 145, 198, 4, 104, 136, 241, 48, 0, 158, 210, 236, 207, 26, 145, 140, 95, 164, 117, 198, 0, 183, 104, 161, 59, 9, 189, 8, 32, 44, 26, 255, 157, 119, 245, 250, 49, 176, 156, 227, 102, 228, 105, 83, 24, 153, 85, 196, 129, 133, 128, 208, 129, 202, 62, 204, 173, 137, 91, 223, 112, 208, 243, 87, 180, 109, 82, 141, 56, 239, 210, 40, 86, 200, 173, 31, 32, 230, 140, 202, 61, 220, 176, 92, 108, 207, 177, 213, 169, 238, 172, 158, 254, 38, 242, 141, 6, 115, 217, 193, 134, 166, 227, 36, 208, 119, 86, 44, 34, 195, 71, 119, 94, 234, 241, 122, 79, 169, 173, 36, 221, 120, 68, 23, 3, 44, 125, 38, 78, 72, 230, 25, 62, 18, 205, 206, 66, 140, 79, 125, 229, 223, 0, 92, 25, 118, 253, 161, 219, 51, 228, 229, 212, 13, 155, 26, 50, 54, 105, 54, 38, 85, 152, 49, 150, 233, 88, 191, 111, 0, 122, 147, 95, 215, 50, 33, 176, 209, 77, 136, 198, 6, 71, 97, 100, 152, 0, 159, 94, 91, 202, 7, 148, 125, 254, 58, 38, 107, 49, 101, 14, 194, 163, 12, 79, 253, 153, 150, 54, 30, 37, 140, 189, 241, 141, 47, 57, 139, 145, 74, 88, 15, 178, 179, 63, 241, 91, 129, 30, 79, 19, 104, 72, 56, 215, 37, 124, 242, 77, 81, 109, 155, 0, 233, 122, 186, 107, 91, 145, 92, 162, 90, 4, 113, 170, 84, 211, 132, 142, 64, 27, 93, 152, 248, 107, 94, 93, 160, 109, 249, 241, 251, 102, 130, 66, 96, 51, 112, 140, 245, 151, 65, 45, 189, 157, 117, 188, 91, 97, 49, 138, 107, 106, 135, 204, 203, 38, 119, 33, 149, 87, 122, 158, 198, 8, 142, 218, 3, 56, 249, 80, 86, 253, 82, 246, 203, 231, 57, 160, 50, 52, 187, 24, 108, 130, 253, 193, 24, 51, 201, 50, 3, 67, 176, 187, 124, 165, 172, 142, 252, 156, 155, 220, 252, 51, 237, 105, 94, 48, 44, 233, 187, 188, 123, 100, 218, 223, 36, 114, 54, 219, 223, 39, 156, 112, 206, 46, 19, 10, 213, 139, 69, 12, 138, 134, 44, 130, 94, 136, 4, 111, 77, 21, 115, 225, 162, 15, 38, 159, 218, 138, 102, 171, 2, 142, 48, 158, 57, 94, 59, 182, 17, 127, 190, 223, 196, 66, 238, 107, 50, 154, 2, 142, 167, 152, 18, 25, 226, 1, 253, 251, 17, 102, 20, 111, 28, 97, 136, 15, 60, 65, 230, 39, 49, 25, 166, 31, 18, 54, 4, 24, 89, 211, 226, 250, 74, 226, 185, 67, 138, 29, 18, 85, 156, 124, 145, 84, 17, 175, 167, 51, 13, 54, 82, 97, 64, 206, 201, 111, 199, 214, 210, 235, 148, 55, 181, 241, 136, 86, 254, 219, 122, 64, 103, 179, 79, 113, 163, 126, 75, 107, 79, 102, 244, 21, 147, 198, 210, 251, 35, 136, 73, 15, 32, 45, 150, 134, 253, 113, 83, 111, 161, 110, 212, 242, 33, 12, 12, 16, 143, 194, 199, 37, 228, 251, 110, 7, 213, 198, 55, 80, 32, 209, 140, 34, 47, 102, 249, 217, 166, 118, 31, 106, 2, 18, 106, 46, 146, 148, 125, 0, 208, 89, 209, 247, 55, 143, 177, 19, 183, 127, 71, 118, 20, 136, 3, 233, 109, 119, 181, 115, 223, 110, 139, 182, 171, 109, 104, 72, 62, 152, 143, 14, 157, 82, 154, 253, 142, 215, 59, 1, 11, 98, 107, 140, 12, 240, 144, 56, 38, 14, 220, 237, 154, 174, 151, 179, 207, 104, 234, 222, 84, 126, 157, 90, 52, 118, 126, 96, 23, 203, 135, 134, 41, 16, 196, 210, 44, 125, 68, 145, 232, 236, 52, 222, 102, 131, 80, 101, 237, 218, 244, 215, 205, 95, 58, 96, 18, 66, 213, 91, 247, 58, 44, 57, 150, 193, 139, 135, 36, 143, 236, 94, 209, 236, 213, 227, 42, 176, 173, 206, 87, 151, 240, 145, 185, 45, 209, 177, 201, 123, 32, 196, 44, 158, 83, 203, 202, 6, 106, 54, 93, 43, 209, 12, 114, 76, 100, 242, 104, 165, 138, 15, 143, 5, 33, 228, 195, 243, 111, 81, 249, 174, 15, 167, 40, 165, 51, 97, 185, 215, 150, 118, 253, 22, 103, 9, 21, 185, 238, 189, 94, 49, 104, 100, 98, 165, 196, 31, 148, 112, 125, 199, 46, 103, 252, 79, 100, 165, 112, 104, 82, 249, 219, 205, 34, 198, 31, 198, 191, 181, 72, 212, 182, 62, 87, 13, 53, 171, 84, 222, 156, 131, 201, 162, 173, 47, 44, 187, 105, 119, 132, 47, 228, 184, 36, 85, 218, 11, 251, 242, 124, 205, 168, 252, 24, 245, 49, 84, 161, 107, 211, 21, 63, 219, 89, 15, 116, 192, 18, 208, 86, 95, 75, 71, 239, 247, 105, 124, 85, 174, 144, 220, 24, 188, 94, 40, 209, 132, 234, 225, 53, 69, 240, 42, 47, 92, 18, 240, 120, 210, 140, 168, 218, 105, 60, 246, 247, 238, 188, 247, 10, 162, 24, 136, 226, 91, 107, 157, 168, 51, 186, 15, 79, 68, 154, 225, 52, 41, 228, 127, 35, 41, 224, 97, 225, 44, 85, 16, 225, 99, 198, 48, 182, 98, 235, 255, 178, 24, 210, 58, 14, 200, 84, 18, 132, 137, 35, 171, 63, 195, 238, 195, 167, 167, 8, 207, 232, 214, 100, 91, 195, 90, 233, 86, 98, 207, 185, 229, 196, 140, 253, 236, 219, 150, 62, 62, 2, 15, 51, 232, 157, 44, 234, 107, 188, 220, 214, 209, 42, 165, 18, 94, 143, 235, 241, 192, 254, 106, 155, 48, 246, 239, 123, 17, 140, 12, 101, 251, 102, 156, 126, 130, 2, 38, 62, 255, 27, 134, 182, 120, 23, 158, 103, 4, 48, 154, 78, 236, 14, 254, 222, 239, 42, 228, 224, 138, 87, 211, 236, 78, 212, 1, 107, 139, 81, 5, 238, 185, 84, 205, 51, 83, 67, 52, 42, 135, 255, 244, 123, 157, 185, 116, 114, 160, 116, 246, 30, 147, 127, 129, 156, 51, 229, 39, 122, 2, 122, 145, 229, 25, 122, 2, 151, 7, 125, 246, 76, 129, 209, 110, 138, 246, 211, 33, 183, 60, 192, 108, 167, 161, 157, 173, 188, 134, 192, 179, 203, 195, 136, 84, 41, 110, 193, 122, 131, 11, 75, 124, 83, 139, 80, 12, 71, 93, 214, 179, 43, 70, 139, 91, 53, 228, 97, 105, 67, 230, 118, 92, 183, 131, 114, 231, 74, 140, 48, 135, 180, 10, 184, 148, 46, 75, 182, 205, 83, 47, 151, 206, 84, 243, 232, 233, 126, 142, 30, 11, 113, 219, 252, 153, 18, 16, 215, 238, 121, 155, 255, 21, 214, 89, 6, 196, 3, 201, 131, 48, 187, 159, 235, 14, 27, 155, 245, 77, 229, 130, 112, 168, 164, 253, 69, 23, 253, 242, 175, 19, 232, 155, 161, 27, 158, 95, 160, 90, 79, 109, 133, 203, 42, 70, 181, 120, 247, 244, 85, 191, 167, 255, 36, 251, 115, 54, 191, 78, 211, 182, 252, 5, 12, 100, 32, 48, 200, 26, 234, 123, 25, 161, 253, 134, 168, 60, 15, 187, 62, 24, 239, 177, 98, 92, 109, 195, 112, 78, 242, 161, 250, 224, 210, 94, 111, 34, 100, 196, 71, 103, 74, 123, 216, 217, 180, 160, 33, 64, 105, 123, 183, 125, 84, 77, 80, 99, 109, 247, 173, 168, 239, 122, 88, 233, 117, 237, 148, 43, 144, 195, 255, 222, 124, 214, 133, 156, 117, 244, 7, 73, 13, 100, 164, 68, 175, 191, 93, 225, 252, 128, 96, 77, 231, 196, 150, 223, 120, 56, 23, 101, 94, 23, 50, 76, 38, 27, 89, 184, 93, 140, 37, 79, 249, 66, 199, 27, 220, 230, 114, 176, 179, 228, 201, 12, 56, 113, 1, 25, 207, 104, 177, 191, 79, 237, 143, 226, 104, 92, 21, 249, 98, 205, 22, 105, 215, 184, 142, 178, 107, 8, 194, 13, 32, 156, 84, 109, 146, 152, 57, 241, 72, 62, 74, 122, 212, 88, 179, 57, 23, 186, 74, 73, 82, 37, 80, 182, 165, 40, 89, 30, 244, 209, 110, 163, 24, 182, 201, 139, 145, 225, 148, 219, 184, 1, 109, 99, 156, 37, 247, 177, 111, 50, 209, 221, 208, 78, 0, 72, 6, 236, 76, 79, 63, 132, 26, 227, 72, 142, 229, 248, 120, 160, 148, 155, 91, 51, 61, 40, 22, 192, 96, 139, 193, 192, 41, 116, 79, 140, 116, 158, 248, 64, 168, 227, 174, 56, 114, 92, 160, 31, 200, 94, 82, 99, 139, 67, 95, 47, 76, 180, 152, 43, 131, 149, 177, 4, 212, 56, 209, 190, 209, 102, 122, 224, 72, 234, 244, 111, 175, 138, 120, 23, 203, 9, 146, 234, 239, 94, 241, 28, 21, 170, 51, 2, 176, 125, 179, 217, 99, 83, 17, 16, 113, 123, 111, 68, 94, 156, 200, 90, 117, 30, 174, 131, 42, 161, 91, 76, 85, 199, 44, 75, 199, 0, 159, 111, 158, 236, 63, 252, 73, 67, 220, 113, 169, 158, 74, 7, 81, 214, 149, 155, 222, 129, 91, 63, 169, 196, 168, 208, 230, 83, 168, 4, 19, 27, 176, 157, 146, 56, 42, 254, 143, 171, 119, 60, 127, 57, 37, 107, 84, 255, 246, 76, 159, 38, 176, 233, 13, 97, 107, 64, 55, 206, 201, 204, 218, 3, 139, 123, 150, 151, 110, 28, 198, 99, 247, 167, 155, 37, 184, 253, 214, 21, 253, 250, 179, 26, 233, 98, 205, 117, 109, 94, 222, 15, 151, 184, 119, 219, 159, 26, 52, 234, 55, 66, 100, 108, 175, 174, 17, 111, 135, 189, 244, 238, 173, 23, 17, 241, 136, 78, 124, 75, 203, 114, 135, 228, 221, 79, 244, 180, 84, 215, 120, 58, 193, 234, 17, 21, 132, 110, 10, 93, 93, 0, 183, 245, 134, 61, 95, 68, 191, 141, 237, 95, 126, 87, 58, 149, 134, 213, 110, 116, 216, 192, 10, 112, 38, 232, 50, 35, 120, 57, 45, 172, 232, 37, 77, 226, 153, 110, 131, 253, 210, 168, 180, 83, 56, 51, 56, 189, 222, 97, 193, 136, 138, 42, 148, 50, 111, 24, 19, 254, 177, 109, 42, 4, 65, 172, 96, 251, 160, 54, 58, 165, 202, 64, 75, 38, 58, 75, 176, 216, 98, 146, 125, 118, 248, 14, 106, 228, 226, 81, 241, 251, 127, 27, 23, 92, 157, 140, 12, 59, 86, 252, 122, 13, 128, 14, 184, 55, 155, 44, 253, 29, 47, 123, 191, 185, 154, 163, 114, 250, 216, 48, 218, 24, 41, 137, 186, 200, 209, 147, 86, 234, 11, 251, 42, 56, 181, 243, 238, 166, 135, 92, 151, 86, 174, 89, 79, 71, 14, 24, 5, 179, 87, 131, 135, 102, 59, 186, 66, 1, 6, 72, 5, 28, 79, 49, 186, 194, 62, 179, 53, 186, 31, 143, 15, 105, 32, 251, 188, 138, 11, 244, 36, 100, 101, 80, 187, 253, 53, 90, 154, 212, 181, 126, 209, 58, 10, 55, 168, 27, 236, 115, 101, 224, 193, 103, 231, 231, 76, 130, 169, 64, 247, 143, 160, 6, 12, 187, 62, 115, 85, 133, 97, 131, 157, 164, 5, 18, 51, 69, 53, 226, 170, 32, 248, 133, 194, 58, 114, 243, 156, 53, 219, 228, 37, 51, 150, 240, 227, 74, 100, 66, 140, 115, 100, 103, 47, 160, 145, 39, 160, 75, 222, 218, 28, 108, 232, 107, 91, 0, 57, 250, 136, 6, 33, 118, 115, 103, 179, 221, 108, 40, 142, 175, 185, 2, 12, 192, 66, 213, 152, 41, 233, 223, 41, 212, 85, 17, 52, 58, 211, 181, 46, 211, 206, 189, 26, 8, 90, 115, 224, 151, 195, 224, 213, 34, 162, 189, 222, 218, 155, 78, 201, 101, 242, 9, 56, 215, 152, 239, 247, 121, 3, 16, 221, 56, 45, 35, 243, 146, 128, 44, 114, 215, 132, 101, 220, 233, 180, 2, 29, 87, 203, 185, 144, 16, 37, 113, 60, 244, 214, 140, 191, 24, 192, 37, 255, 161, 147, 216, 30, 40, 155, 88, 60, 186, 135, 11, 23, 228, 43, 157, 203, 102, 196, 197, 1, 1, 87, 218, 126, 80, 76, 30, 182, 207, 153, 135, 248, 6, 181, 215, 77, 128, 200, 10, 19, 107, 138, 202, 84, 120, 191, 140, 117, 50, 32, 27, 105, 174, 224, 170, 123, 53, 76, 48, 210, 6, 227, 195, 114, 235, 87, 145, 150, 26, 21, 17, 214, 198, 245, 125, 109, 156, 170, 204, 143, 228, 62, 196, 128, 21, 243, 153, 91, 71, 164, 113, 164, 255, 48, 36, 238, 105, 220, 163, 93, 3, 33, 47, 150, 241, 211, 190, 111, 157, 234, 189, 25, 58, 247, 75, 118, 247, 167, 171, 118, 223, 1, 180, 98, 83, 0, 2, 109, 17, 255, 116, 244, 107, 101, 220, 100, 70, 21, 133, 179, 90, 210, 116, 32, 197, 24, 82, 114, 120, 218, 14, 147, 80, 194, 80, 69, 78, 223, 157, 183, 130, 49, 139, 162, 34, 12, 176, 45, 242, 103, 232, 128, 68, 88, 225, 181, 149, 3, 210, 20, 38, 155, 6, 206, 136, 22, 170, 92, 156, 165, 116, 142, 250, 72, 203, 235, 193, 116, 244, 4, 209, 55, 186, 29, 8, 33, 193, 221, 73, 27, 212, 204, 22, 197, 179, 8, 122, 134, 8, 255, 96, 51, 2, 169, 193, 96, 128, 178, 109, 143, 131, 50, 219, 208, 58, 159, 103, 233, 100, 26, 2, 177, 129, 122, 168, 120, 71, 39, 115, 228, 108, 114, 161, 243, 24, 10, 221, 105, 0, 32, 230, 75, 208, 233, 4, 70, 249, 98, 37, 46, 87, 158, 145, 60, 85, 229, 199, 236, 126, 80, 183, 181, 12, 68, 3, 15, 23, 36, 92, 146, 109, 61, 24, 128, 78, 239, 88, 230, 215, 204, 90, 147, 118, 171, 51, 168, 95, 93, 23, 90, 244, 164, 172, 201, 222, 112, 143, 193, 209, 130, 201, 207, 118, 175, 51, 3, 83, 144, 53, 7, 2, 223, 146, 50, 101, 168, 159, 133, 28, 66, 29, 64, 233, 76, 182, 133, 172, 68, 223, 114, 254, 236, 111, 30, 73, 137, 130, 164, 131, 196, 189, 111, 155, 147, 217, 64, 194, 115, 143, 201, 77, 22, 153, 228, 83, 191, 53, 210, 87, 234, 21, 34, 187, 184, 28, 63, 179, 214, 83, 14, 112, 32, 169, 159, 133, 207, 19, 169, 188, 147, 111, 186, 114, 43, 118, 152, 25, 71, 184, 247, 239, 62, 39, 125, 8, 176, 91, 46, 127, 37, 169, 247, 186, 170, 231, 106, 124, 93, 82, 203, 135, 50, 177, 85, 74, 115, 219, 76, 96, 173, 44, 242, 38, 163, 171, 14, 0, 95, 76, 99, 75, 14, 39, 213, 116, 182, 72, 2, 234, 176, 65, 98, 150, 36, 70, 86, 137, 151, 218, 245, 141, 17, 24, 233, 41, 185, 58, 178, 56, 54, 122, 148, 231, 151, 41, 214, 96, 4, 243, 46, 63, 200, 233, 128, 161, 95, 138, 244, 183, 141, 145, 14, 25, 91, 197, 70, 3, 227, 187, 203, 223, 48, 120, 113, 7, 0, 130, 193, 160, 67, 108, 185, 71, 237, 171, 101, 159, 96, 98, 34, 4, 142, 114, 155, 160, 147, 193, 170, 48, 115, 253, 172, 245, 59, 145, 176, 55, 203, 245, 60, 24, 247, 235, 79, 12, 117, 74, 18, 151, 14, 208, 7, 227, 230, 138, 182, 107, 33, 172, 211, 232, 244, 91, 86, 80, 237, 55, 154, 175, 32, 221, 17, 151, 79, 104, 238, 25, 226, 76, 155, 72, 39, 90, 209, 93, 119, 54, 17, 9, 222, 62, 18, 136, 25, 15, 59, 194, 203, 57, 150, 0, 52, 122, 104, 84, 199, 104, 180, 154, 180, 177, 141, 173, 169, 154, 113, 35, 75, 198, 157, 150, 80, 44, 212, 248, 174, 232, 251, 140, 74, 214, 189, 41, 120, 113, 156, 65, 16, 15, 201, 18, 45, 16, 210, 104, 247, 38, 33, 40, 249, 61, 119, 153, 179, 72, 88, 122, 109, 208, 91, 186, 231, 246, 201, 154, 26, 36, 115, 126, 217, 44, 194, 140, 103, 229, 15, 250, 227, 140, 106, 204, 118, 169, 157, 84, 150, 31, 128, 194, 254, 144, 221, 84, 79, 211, 148, 33, 60, 107, 211, 170, 159, 248, 105, 63, 114, 0, 23, 234, 92, 230, 240, 118, 6, 250, 181, 184, 227, 64, 186, 40, 94, 67, 225, 133, 89, 15, 16, 174, 144, 165, 59, 6, 73, 13, 18, 29, 10, 46, 237, 23, 51, 33, 27, 193, 212, 63, 194, 5, 79, 66, 177, 81, 200, 84, 254, 225, 36, 110, 208, 225, 202, 213, 89, 214, 140, 142, 227, 223, 60, 214, 19, 145, 92, 92, 164, 207, 222, 158, 250, 12, 146, 150, 67, 204, 120, 211, 109, 95, 186, 40, 167, 178, 90, 34, 46, 234, 28, 109, 171, 182, 83, 197, 36, 51, 69, 152, 168, 121, 48, 71, 179, 22, 218, 168, 182, 160, 147, 195, 177, 176, 201, 234, 213, 209, 135, 222, 9, 1, 157, 170, 240, 175, 246, 218, 255, 92, 53, 102, 171, 22, 235, 180, 248, 118, 10, 85, 14, 24, 218, 184, 132, 191, 225, 112, 66, 3, 231, 36, 235, 34, 214, 181, 57, 104, 151, 76, 69, 101, 83, 20, 39, 170, 108, 161, 239, 236, 126, 9, 144, 27, 117, 209, 174, 173, 92, 16, 185, 25, 8, 65, 29, 134, 67, 1, 248, 62, 221, 239, 134, 12, 15, 252, 203, 140, 179, 52, 247, 3, 230, 34, 184, 102, 82, 118, 76, 218, 254, 242, 24, 115, 22, 119, 90, 4, 149, 236, 176, 116, 68, 77, 123, 201, 192, 255, 188, 107, 195, 3, 217, 184, 106, 219, 116, 81, 207, 193, 227, 101, 41, 29, 232, 72, 85, 236, 151, 74, 93, 150, 166, 171, 155, 81, 131, 81, 109, 171, 184, 37, 190, 114, 106, 113, 144, 234, 76, 143, 92, 98, 190, 112, 151, 198, 151, 181, 99, 7, 182, 50, 190, 157, 141, 17, 199, 148, 230, 14, 240, 95, 238, 139, 161, 96, 85, 137, 154, 79, 67, 168, 101, 253, 126, 23, 165, 143, 47, 33, 157, 100, 6, 130, 253, 188, 66, 21, 205, 243, 116, 62, 241, 161, 177, 199, 234, 61, 135, 55, 113, 25, 153, 27, 129, 149, 189, 140, 112, 211, 49, 176, 38, 44, 110, 29, 135, 178, 122, 233, 3, 166, 97, 175, 61, 159, 98, 61, 54, 46, 62, 246, 137, 17, 150, 249, 165, 99, 211, 172, 76, 7, 104, 39, 106, 119, 221, 159, 210, 96, 33, 236, 87, 164, 112, 47, 226, 247, 236, 140, 185, 182, 20, 201, 51, 88, 97, 52, 198, 70, 49, 248, 96, 51, 82, 115, 169, 78, 73, 112, 123, 106, 120, 113, 184, 93, 194, 224, 68, 211, 200, 237, 209, 41, 160, 127, 89, 163, 55, 9, 27, 252, 78, 93, 147, 141, 12, 156, 44, 226, 106, 126, 159, 181, 106, 84, 25, 39, 220, 41, 134, 184, 173, 69, 141, 128, 221, 57, 194, 56, 41, 148, 107, 242, 241, 174, 129, 152, 123, 81, 101, 1, 204, 9, 109, 154, 97, 169, 63, 167, 52, 96, 239, 63, 116, 163, 122, 158, 94, 221, 35, 90, 184, 69, 186, 220, 155, 205, 65, 191, 31, 209, 62, 120, 156, 77, 154, 212, 58, 165, 208, 254, 65, 204, 148, 200, 121, 78, 129, 79, 121, 39, 34, 3, 169, 118, 120, 52, 35, 119, 142, 29, 15, 144, 156, 90, 134, 101, 105, 11, 112, 32, 74, 0, 219, 159, 132, 100, 7, 106, 88, 142, 42, 159, 159, 133, 11, 175, 92, 88, 144, 12, 55, 185, 47, 142, 31, 43, 39, 16, 83, 122, 54, 7, 150, 158, 215, 14, 143, 136, 147, 141, 231, 157, 67, 152, 119, 164, 114, 159, 71, 210, 144, 98, 127, 44, 132, 218, 170, 183, 6, 185, 210, 94, 95, 99, 240, 116, 30, 126, 76, 115, 212, 246, 102, 92, 96, 159, 252, 177, 173, 238, 87, 145, 120, 239, 83, 103, 148, 111, 193, 200, 157, 199, 84, 245, 167, 68, 43, 9, 69, 55, 83, 164, 109, 90, 46, 101, 215, 36, 23, 74, 170, 73, 31, 151, 63, 13, 233, 151, 107, 248, 28, 92, 35, 70, 5, 235, 85, 219, 20, 213, 153, 157, 249, 176, 37, 255, 191, 49, 221, 195, 243, 205, 150, 238, 234, 168, 137, 153, 201, 222, 205, 199, 162, 119, 146, 41, 89, 105, 114, 144, 27, 194, 167, 15, 17, 102, 155, 81, 20, 64, 25, 235, 217, 63, 154, 242, 225, 13, 33, 182, 38, 116, 47, 107, 50, 207, 110, 29, 136, 55, 33, 139, 136, 214, 63, 92, 125, 90, 118, 202, 7, 13, 45, 43, 162, 106, 53, 143, 13, 190, 171, 226, 196, 144, 17, 49, 136, 120, 246, 99, 28, 219, 184, 171, 145, 232, 242, 225, 86, 216, 29, 251, 249, 41, 244, 144, 111, 2, 13, 67, 69, 97, 59, 202, 92, 254, 71, 189, 6, 119, 180, 186, 203, 34, 18, 85, 115, 103, 178, 15, 139, 42, 154, 39, 24, 0, 19, 22, 240, 255, 252, 93, 217, 151, 118, 89, 76, 228, 117, 200, 137, 13, 190, 247, 255, 24, 253, 162, 24, 184, 20, 70, 173, 242, 65, 255, 14, 85, 235, 99, 103, 131, 181, 84, 80, 63, 156, 184, 204, 191, 61, 156, 252, 59, 37, 109, 229, 102, 139, 94, 178, 178, 164, 231, 49, 155, 35, 56, 196, 15, 169, 144, 251, 215, 89, 129, 230, 72, 219, 139, 197, 78, 109, 102, 25, 48, 44, 123, 211, 216, 106, 185, 237, 124, 133, 39, 37, 162, 20, 211, 134, 155, 168, 11, 222, 152, 143, 211, 112, 133, 136, 21, 169, 89, 187, 92, 61, 144, 126, 142, 165, 91, 64, 45, 41, 56, 164, 108, 49, 241, 137, 99, 44, 191, 100, 11, 225, 166, 244, 183, 14, 69, 141, 184, 193, 220, 72, 211, 67, 223, 16, 43, 227, 34, 87, 91, 32, 229, 84, 162, 113, 251, 125, 218, 118, 31, 254, 16, 33, 170, 201, 209, 49, 30, 113, 104, 193, 212, 82, 64, 80, 214, 32, 149, 217, 244, 237, 193, 223, 104, 77, 128, 228, 140, 55, 252, 204, 229, 187, 36, 99, 153, 241, 138, 135, 171, 169, 62, 250, 184, 63, 167, 139, 183, 57, 170, 36, 217, 201, 129, 169, 222, 78, 153, 65, 153, 195, 211, 229, 159, 191, 0, 145, 12, 209, 25, 247, 122, 19, 108, 173, 163, 187, 235, 254, 87, 80, 25, 110, 179, 158, 48, 232, 20, 138, 81, 198, 78, 18, 44, 75, 181, 18, 238, 96, 61, 247, 229, 254, 2, 55, 169, 32, 180, 136, 177, 161, 213, 132, 128, 108, 93, 159, 201, 212, 238, 223, 233, 186, 243, 4, 248, 5, 33, 214, 193, 214, 95, 51, 141, 60, 72, 63, 142, 184, 37, 122, 118, 136, 97, 93, 142, 245, 8, 147, 224, 126, 67, 93, 170, 105, 121, 231, 171, 85, 105, 191, 126, 88, 57, 42, 253, 179, 85, 251, 193, 163, 112, 71, 28, 137, 104, 199, 121, 13, 122, 58, 231, 160, 176, 50, 200, 80, 65, 99, 25, 67, 129, 91, 97, 178, 131, 195, 111, 148, 134, 71, 57, 145, 113, 209, 177, 51, 154, 29, 28, 180, 74, 13, 69, 147, 96, 210, 108, 176, 89, 248, 238, 64, 140, 85, 196, 169, 20, 251, 238, 194, 41, 56, 39, 59, 226, 189, 130, 178, 90, 176, 226, 46, 108, 156, 204, 174, 85, 118, 165, 137, 184, 160, 133, 89, 170, 184, 37, 48, 65, 241, 224, 117, 164, 248, 213, 112, 143, 128, 23, 130, 133, 216, 66, 190, 63, 238, 179, 84, 71, 27, 50, 83, 199, 91, 126, 164, 192, 76, 107, 100, 229, 6, 25, 164, 89, 235, 117, 247, 61, 109, 205, 76, 128, 230, 41, 243, 85, 58, 189, 128, 216, 21, 53, 68, 80, 1, 25, 171, 203, 71, 176, 46, 6, 84, 35, 150, 95, 144, 144, 253, 210, 78, 10, 31, 218, 179, 248, 95, 81, 244, 79, 215, 63, 196, 100, 165, 120, 54, 14, 180, 125, 152, 106, 173, 125, 14, 108, 211, 161, 131, 229, 114, 56, 252, 16, 221, 16, 242, 74, 87, 168, 121, 127, 247, 212, 200, 71, 204, 116, 246, 255, 154, 24, 137, 127, 45, 177, 212, 17, 212, 102, 236, 29, 88, 177, 166, 135, 107, 210, 230, 219, 124, 71, 98, 50, 230, 107, 222, 79, 222, 190, 37, 241, 242, 167, 27, 117, 253, 201, 76, 251, 186, 18, 135, 96, 191, 207, 15, 107, 67, 146, 251, 105, 102, 25, 200, 71, 209, 165, 125, 192, 18, 228, 162, 238, 214, 221, 138, 49, 40, 100, 122, 249, 20, 121, 57, 199, 11, 0, 243, 76, 57, 23, 211, 110, 212, 250, 218, 95, 154, 145, 179, 173, 45, 233, 155, 246, 67, 35, 203, 93, 5, 2, 91, 121, 116, 93, 64, 69, 31, 182, 179, 74, 59, 198, 41, 19, 102, 51, 76, 126, 224, 153, 65, 254, 186, 90, 16, 91, 220, 154, 130, 20, 187, 103, 141, 248, 188, 245, 250, 139, 191, 48, 138, 40, 199, 201, 155, 147, 83, 62, 254, 80, 3, 107, 104, 36, 103, 186, 94, 186, 225, 107, 167, 118, 230, 199, 85, 241, 219, 139, 20, 28, 233, 5, 131, 144, 101, 21, 228, 236, 249, 115, 82, 62, 147, 175, 251, 174, 128, 176, 255, 248, 142, 239, 113, 165, 254, 238, 22, 99, 162, 202, 108, 79, 235, 246, 32, 220, 11, 51, 239, 109, 4, 204, 179, 212, 86, 38, 5, 232, 170, 76, 151, 131, 165, 206, 122, 105, 124, 107, 28, 137, 196, 99, 194, 6, 122, 29, 75, 178, 26, 232, 70, 33, 231, 24, 73, 33, 187, 181, 240, 75, 22, 114, 163, 98, 114, 6, 93, 2, 32, 16, 79, 93, 119, 219, 153, 15, 182, 129, 123, 242, 162, 182, 152, 200, 24, 14, 95, 48, 35, 60, 237, 71, 183, 152, 92, 134, 31, 82, 174, 53, 155, 170, 96, 221, 93, 137, 90, 31, 128, 20, 131, 15, 86, 154, 93, 190, 178, 124, 214, 130, 43, 64, 134, 249, 0, 48, 215, 92, 236, 202, 24, 47, 60, 232, 190, 124, 3, 71, 145, 183, 215, 240, 1, 100, 235, 203, 185, 205, 122, 222, 41, 199, 127, 4, 74, 57, 92, 80, 227, 109, 81, 197, 32, 38, 35, 53, 94, 245, 9, 141, 245, 223, 223, 95, 42, 175, 157, 209, 215, 90, 64, 0, 248, 244, 246, 25, 60, 7, 169, 138, 246, 184, 96, 155, 68, 94, 155, 22, 15, 241, 169, 20, 49, 215, 209, 111, 239, 200, 144, 5, 33, 153, 142, 239, 148, 110, 117, 109, 248, 67, 98, 109, 157, 187, 172, 160, 169, 85, 54, 0, 153, 129, 217, 150, 67, 124, 151, 101, 106, 131, 207, 134, 5, 255, 139, 146, 192, 0, 115, 91, 6, 129, 58, 60, 103, 106, 223, 52, 211, 102, 252, 153, 7, 36, 34, 32, 136, 111, 24, 231, 218, 101, 114, 49, 128, 185, 58, 235, 26, 108, 148, 216, 2, 109, 127, 76, 170, 230, 167, 77, 230, 144, 120, 234, 183, 78, 246, 204, 228, 134, 249, 88, 100, 196, 198, 168, 113, 216, 42, 35, 193, 234, 34, 195, 152, 125, 79, 79, 24, 161, 173, 16, 174, 46, 67, 170, 131, 156, 232, 86, 89, 173, 30, 39, 209, 177, 50, 137, 84, 109, 203, 25, 179, 105, 42, 151, 141, 56, 47, 146, 109, 175, 225, 243, 210, 206, 81, 196, 237, 159, 201, 165, 55, 181, 153, 69, 153, 117, 118, 217, 130, 65, 139, 68, 118, 59, 201, 202, 82, 129, 162, 23, 102, 61, 155, 109, 206, 125, 41, 111, 139, 83, 174, 133, 242, 44, 2, 235, 186, 58, 247, 99, 136, 173, 106, 250, 248, 34, 152, 133, 3, 208, 170, 129, 23, 60, 73, 212, 46, 191, 190, 88, 207, 221, 164, 178, 45, 215, 131, 204, 225, 117, 173, 138, 180, 3, 0, 15, 14, 221, 73, 184, 22, 167, 83, 216, 31, 137, 254, 108, 90, 21, 235, 5, 68, 143, 236, 218, 177, 170, 239, 180, 8, 168, 140, 226, 189, 16, 145, 62, 163, 225, 93, 205, 37, 120, 98, 129, 249, 129, 253, 213, 174, 200, 19, 143, 140, 9, 177, 50, 105, 134, 69, 113, 244, 133, 6, 120, 25, 155, 132, 254, 226, 207, 43, 56, 168, 69, 169, 95, 83, 166, 34, 69, 213, 187, 98, 243, 119, 143, 121, 249, 119, 129, 165, 103, 146, 140, 13, 136, 238, 160, 170, 253, 171, 212, 98, 239, 172, 195, 249, 68, 207, 60, 24, 130, 128, 167, 163, 178, 130, 220, 6, 139, 198, 201, 110, 26, 91, 155, 144, 143, 212, 85, 106, 50, 198, 74, 210, 168, 146, 232, 172, 30, 152, 206, 69, 44, 47, 88, 165, 180, 221, 45, 252, 248, 47, 26, 33, 142, 189, 77, 77, 20, 185, 247, 249, 88, 67, 117, 249, 151, 118, 57, 18, 137, 128, 189, 134, 148, 85, 7, 47, 60, 142, 110, 105, 252, 45, 165, 187, 134, 50, 255, 180, 56, 130, 137, 76, 189, 218, 152, 46, 148, 44, 1, 239, 47, 72, 192, 70, 14, 74, 90, 136, 245, 35, 40, 171, 29, 17, 97, 77, 184, 32, 38, 38, 252, 12, 0, 226, 11, 222, 132, 183, 121, 209, 83, 3, 164, 243, 32, 111, 109, 145, 203, 57, 241, 192, 5, 107, 164, 128, 3, 218, 69, 178, 200, 222, 45, 65, 105, 110, 115, 184, 75, 243, 221, 49, 226, 170, 189, 49, 246, 129, 33, 150, 38, 203, 3, 214, 111, 206, 150, 168, 137, 162, 228, 3, 96, 105, 184, 27, 106, 81, 32, 147, 230, 60, 219, 199, 176, 74, 100, 18, 80, 140, 70, 128, 115, 119, 111, 82, 172, 8, 6, 168, 188, 56, 197, 112, 159, 169, 216, 200, 90, 251, 104, 112, 19, 179, 71, 59, 181, 138, 224, 158, 252, 148, 50, 65, 55, 33, 120, 142, 137, 108, 20, 142, 236, 144, 89, 197, 190, 188, 19, 102, 227, 240, 38, 170, 129, 123, 69, 123, 193, 13, 37, 133, 44, 167, 210, 141, 172, 154, 208, 42, 156, 35, 126, 176, 1, 98, 193, 135, 102, 235, 229, 22, 34, 187, 18, 111, 64, 83, 107, 17, 157, 241, 117, 59, 8, 211, 60, 200, 87, 184, 89, 132, 249, 60, 18, 81, 237, 225, 53, 221, 131, 255, 218, 64, 239, 194, 7, 181, 40, 3, 46, 108, 220, 52, 108, 62, 254, 140, 37, 116, 15, 40, 169, 90, 47, 136, 102, 253, 7, 223, 132, 207, 60, 234, 21, 134, 155, 63, 112, 37, 72, 222, 55, 59, 20, 34, 167, 71, 222, 221, 164, 161, 92, 131, 244, 235, 243, 237, 184, 129, 77, 165, 160, 139, 171, 234, 234, 69, 113, 128, 93, 215, 9, 84, 41, 213, 35, 164, 24, 120, 204, 180, 178, 153, 47, 245, 57, 22, 175, 206, 12, 175, 203, 129, 39, 93, 127, 18, 12, 55, 43, 36, 252, 1, 104, 116, 59, 135, 193, 145, 183, 41, 62, 78, 165, 189, 232, 128, 224, 11, 142, 255, 2, 223, 95, 80, 219, 87, 249, 121, 31, 181, 50, 241, 31, 127, 174, 99, 238, 176, 116, 65, 220, 160, 189, 25, 204, 103, 20, 231, 42, 195, 34, 180, 105, 121, 110, 99, 149, 139, 1, 221, 124, 67, 172, 47, 189, 207, 14, 229, 79, 158, 187, 203, 126, 236, 14, 53, 121, 243, 132, 78, 39, 72, 7, 165, 22, 78, 41, 101, 128, 20, 168, 136, 198, 109, 226, 32, 135, 168, 104, 155, 115, 57, 50, 66, 17, 72, 245, 124, 70, 188, 194, 144, 89, 140, 85, 8, 10, 129, 227, 167, 15, 15, 201, 54, 239, 194, 154, 204, 129, 27, 190, 245, 102, 166, 178, 201, 7, 197, 78, 149, 69, 245, 4, 143, 4, 84, 13, 217, 59, 242, 223, 226, 199, 231, 118, 188, 55, 115, 56, 15, 217, 3, 0, 181, 190, 3, 162, 127, 120, 206, 181, 8, 225, 155, 148, 202, 117, 70, 96, 81, 246, 165, 253, 115, 148, 217, 138, 44, 203, 36, 44, 221, 59, 122, 68, 170, 248, 235, 88, 242, 209, 42, 71, 31, 117, 5, 149, 221, 216, 154, 116, 41, 231, 138, 123, 85, 128, 71, 109, 111, 17, 72, 163, 225, 109, 7, 40, 133, 74, 76, 155, 107, 34, 193, 114, 240, 61, 31, 24, 46, 215, 197, 96, 114, 213, 18, 214, 57, 119, 50, 18, 5, 175, 254, 21, 246, 64, 145, 171, 217, 243, 159, 250, 231, 228, 64, 164, 97, 61, 150, 9, 230, 11, 138, 132, 95, 209, 138, 97, 87, 139, 190, 171, 135, 158, 170, 99, 198, 18, 127, 44, 102, 1, 236, 90, 73, 214, 135, 116, 107, 247, 175, 46, 238, 51, 79, 163, 249, 5, 137, 145, 92, 138, 23, 207, 158, 50, 109, 131, 84, 61, 184, 252, 232, 20, 67, 107, 189, 61, 198, 27, 6, 189, 119, 34, 236, 94, 105, 65, 140, 181, 248, 32, 12, 119, 126, 0, 14, 226, 78, 7, 121, 111, 47, 30, 49, 206, 187, 125, 247, 235, 6, 229, 34, 161, 174, 72, 154, 37, 94, 8, 88, 125, 54, 182, 100, 46, 84, 144, 213, 251, 62, 71, 177, 120, 255, 194, 14, 105, 206, 151, 179, 144, 140, 191, 167, 248, 44, 70, 227, 154, 142, 32, 174, 159, 199, 154, 78, 165, 68, 96, 73, 8, 13, 246, 162, 155, 48, 7, 121, 90, 173, 40, 226, 166, 189, 35, 87, 225, 45, 209, 220, 70, 22, 156, 216, 39, 126, 84, 142, 207, 100, 219, 155, 166, 43, 253, 161, 255, 143, 148, 93, 17, 7, 109, 176, 112, 14, 87, 147, 186, 123, 32, 159, 252, 83, 111, 182, 250, 28, 239, 207, 92, 64, 17, 26, 216, 0, 41, 24, 142, 246, 19, 172, 32, 137, 234, 69, 147, 251, 234, 207, 95, 6, 113, 209, 107, 69, 122, 198, 148, 13, 18, 28, 238, 191, 168, 205, 144, 234, 181, 247, 192, 151, 176, 95, 157, 60, 224, 26, 120, 24, 16, 66, 102, 51, 185, 111, 39, 6, 205, 187, 16, 1, 141, 45, 234, 48, 144, 26, 92, 155, 213, 218, 88, 151, 0, 111, 109, 28, 44, 172, 24, 215, 205, 186, 42, 119, 124, 48, 41, 199, 85, 81, 244, 24, 170, 71, 156, 141, 249, 234, 193, 174, 77, 184, 47, 107, 112, 235, 124, 254, 7, 163, 156, 71, 59, 122, 224, 196, 215, 71, 81, 145, 207, 178, 97, 118, 45, 154, 109, 190, 143, 63, 83, 135, 110, 166, 174, 47, 195, 33, 0, 234, 212, 223, 11, 248, 210, 158, 17, 139, 239, 15, 57, 133, 185, 152, 71, 56, 2, 62, 10, 103, 243, 247, 182, 81, 10, 38, 49, 7, 131, 10, 202, 184, 79, 149, 84, 213, 122, 133, 208, 24, 141, 132, 12, 244, 251, 160, 41, 56, 219, 123, 120, 23, 240, 40, 29, 32, 213, 222, 36, 49, 173, 176, 11, 209, 145, 104, 154, 154, 182, 183, 5, 60, 131, 70, 224, 47, 125, 110, 47, 246, 180, 222, 125, 243, 251, 55, 25, 147, 77, 164, 116, 218, 152, 191, 244, 47, 199, 68, 208, 209, 49, 90, 197, 176, 2, 191, 127, 198, 48, 16, 168, 243, 41, 195, 50, 175, 33, 172, 92, 185, 254, 96, 221, 65, 24, 36, 187, 10, 104, 242, 101, 185, 176, 206, 215, 166, 82, 189, 245, 208, 62, 38, 207, 97, 192, 45, 46, 98, 66, 201, 69, 95, 206, 211, 204, 225, 137, 204, 100, 110, 58, 84, 29, 112, 144, 51, 15, 1, 170, 79, 41, 239, 77, 1, 208, 209, 80, 208, 214, 27, 168, 153, 229, 188, 40, 250, 13, 240, 23, 96, 54, 235, 23, 202, 165, 215, 109, 143, 163, 161, 136, 101, 109, 98, 102, 54, 231, 141, 157, 22, 5, 201, 89, 10, 241, 113, 225, 185, 234, 128, 212, 206, 186, 59, 114, 79, 69, 43, 171, 208, 219, 63, 219, 112, 54, 77, 156, 116, 150, 140, 113, 186, 79, 131, 109, 231, 205, 170, 253, 131, 97, 141, 107, 242, 5, 238, 167, 32, 135, 194, 143, 151, 71, 22, 81, 254, 84, 120, 103, 131, 61, 86, 126, 66, 51, 201, 0, 170, 70, 18, 38, 152, 225, 3, 117, 98, 100, 141, 114, 39, 161, 189, 146, 148, 43, 55, 189, 18, 157, 181, 185, 7, 117, 77, 56, 229, 91, 80, 233, 79, 165, 140, 24, 98, 197, 130, 50, 70, 44, 111, 230, 241, 92, 204, 246, 78, 19, 18, 231, 219, 201, 207, 84, 205, 137, 138, 113, 45, 4, 72, 145, 204, 3, 86, 230, 200, 208, 166, 218, 183, 217, 21, 89, 23, 40, 107, 161, 68, 230, 96, 236, 91, 106, 15, 38, 255, 132, 13, 248, 98, 106, 177, 223, 54, 247, 114, 82, 147, 161, 42, 43, 10, 192, 12, 94, 200, 248, 200, 85, 231, 247, 246, 201, 221, 180, 217, 113, 12, 222, 88, 53, 21, 6, 26, 214, 220, 152, 253, 92, 56, 158, 17, 233, 218, 95, 234, 91, 97, 71, 148, 11, 3, 226, 199, 250, 201, 132, 92, 244, 18, 210, 248, 212, 89, 182, 96, 73, 121, 250, 222, 59, 121, 118, 19, 28, 221, 126, 48, 119, 190, 217, 72, 194, 91, 4, 213, 17, 137, 34, 246, 7, 6, 143, 245, 97, 192, 252, 55, 145, 82, 10, 77, 111, 31, 80, 74, 156, 14, 68, 111, 82, 76, 168, 203, 9, 220, 54, 233, 175, 186, 169, 104, 243, 2, 143, 109, 213, 247, 163, 196, 181, 37, 16, 50, 218, 28, 129, 118, 162, 187, 98, 202, 226, 244, 39, 27, 90, 255, 235, 125, 98, 206, 155, 179, 211, 58, 135, 80, 97, 220, 32, 136, 18, 226, 60, 251, 51, 170, 165, 47, 4, 63, 160, 41, 105, 85, 23, 122, 32, 145, 69, 85, 159, 147, 73, 209, 201, 169, 25, 225, 164, 6, 151, 92, 9, 223, 55, 137, 202, 67, 221, 100, 161, 248, 10, 209, 195, 27, 146, 4, 219, 227, 190, 203, 134, 228, 10, 160, 34, 221, 250, 110, 203, 33, 186, 60, 136, 185, 235, 72, 45, 105, 176, 161, 36, 169, 185, 174, 168, 146, 23, 57, 128, 198, 162, 194, 197, 62, 254, 102, 200, 154, 140, 98, 40, 208, 128, 95, 151, 77, 40, 190, 88, 75, 156, 47, 207, 220, 11, 125, 159, 24, 89, 142, 60, 2, 156, 25, 44, 203, 39, 222, 166, 122, 93, 215, 91, 87, 57, 199, 69, 211, 244, 140, 241, 106, 43, 193, 10, 150, 65, 226, 163, 202, 165, 155, 93, 219, 207, 28, 174, 157, 201, 199, 169, 174, 28, 36, 117, 106, 155, 87, 209, 223, 171, 104, 72, 76, 180, 101, 196, 248, 163, 252, 150, 33, 224, 118, 128, 130, 145, 211, 28, 80, 17, 174, 33, 156, 108, 139, 120, 225, 111, 9, 46, 228, 79, 112, 121, 35, 181, 170, 12, 131, 173, 169, 4, 40, 8, 101, 34, 154, 227, 200, 57, 50, 118, 220, 128, 21, 208, 62, 131, 68, 193, 52, 163, 35, 96, 45, 225, 26, 219, 50, 194, 44, 22, 181, 83, 21, 82, 35, 100, 10, 241, 218, 12, 104, 240, 254, 190, 54, 48, 213, 87, 65, 183, 27, 232, 23, 246, 169, 179, 164, 55, 66, 70, 219, 7, 214, 128, 58, 244, 120, 52, 255, 213, 170, 81, 235, 16, 46, 18, 229, 186, 139, 118, 127, 12, 74, 173, 106, 171, 161, 3, 108, 3, 113, 211, 2, 88, 90, 227, 202, 196, 195, 69, 88, 168, 40, 87, 247, 210, 5, 26, 117, 159, 42, 3, 73, 148, 247, 236, 110, 16, 236, 169, 179, 22, 198, 32, 79, 138, 96, 70, 6, 161, 27, 71, 155, 241, 112, 60, 188, 51, 134, 154, 0, 207, 203, 43, 102, 88, 180, 139, 239, 72, 26, 46, 174, 76, 65, 14, 135, 202, 211, 124, 201, 4, 227, 40, 119, 46, 102, 23, 71, 143, 167, 164, 77, 192, 135, 16, 27, 148, 127, 123, 191, 209, 160, 49, 93, 138, 94, 161, 181, 205, 80, 80, 33, 73, 203, 45, 36, 194, 173, 86, 7, 234, 200, 138, 20, 62, 20, 110, 84, 16, 238, 207, 123, 175, 233, 40, 135, 51, 85, 136, 64, 204, 198, 207, 151, 162, 133, 207, 58, 246, 187, 201, 91, 185, 76, 46, 209, 173, 153, 71, 158, 241, 109, 66, 129, 109, 19, 70, 30, 186, 76, 249, 125, 197, 243, 223, 219, 16, 93, 134, 232, 59, 188, 42, 4, 155, 129, 236, 145, 166, 244, 222, 103, 3, 166, 145, 150, 57, 129, 19, 253, 157, 242, 66, 97, 165, 107, 87, 180, 245, 247, 47, 19, 34, 135, 219, 94, 76, 118, 156, 247, 148, 44, 142, 164, 20, 184, 96, 179, 138, 54, 39, 212, 235, 96, 215, 39, 45, 51, 215, 39, 47, 119, 120, 22, 197, 166, 158, 26, 115, 21, 16, 110, 23, 166, 132, 209, 232, 103, 248, 200, 133, 238, 224, 13, 50, 110, 33, 211, 154, 5, 239, 137, 226, 87, 131, 152, 225, 59, 208, 49, 204, 237, 81, 149, 34, 167, 46, 181, 121, 110, 31, 108, 226, 10, 80, 6, 47, 84, 180, 176, 86, 70, 171, 221, 85, 143, 172, 227, 120, 229, 75, 140, 133, 195, 176, 173, 92, 82, 179, 97, 115, 116, 236, 224, 70, 44, 166, 206, 23, 99, 0, 213, 47, 203, 153, 221, 178, 246, 196, 30, 74, 208, 100, 245, 85, 136, 132, 6, 213, 73, 199, 248, 61, 206, 141, 74, 61, 100, 181, 157, 51, 131, 95, 116, 217, 218, 162, 32, 136, 10, 115, 221, 65, 16, 223, 19, 163, 172, 73, 140, 97, 69, 67, 199, 116, 137, 251, 188, 106, 68, 78, 25, 225, 202, 40, 117, 161, 114, 10, 208, 29, 48, 217, 82, 234, 75, 134, 156, 9, 253, 241, 144, 22, 186, 139, 101, 111, 37, 72, 95, 33, 177, 20, 246, 210, 132, 1, 255, 84, 153, 171, 140, 222, 57, 86, 34, 181, 228, 39, 13, 158, 35, 57, 113, 16, 61, 97, 111, 39, 48, 192, 88, 102, 201, 83, 73, 113, 227, 116, 20, 73, 169, 135, 107, 8, 96, 250, 23, 25, 242, 51, 166, 29, 160, 169, 43, 239, 90, 254, 198, 209, 54, 249, 31, 217, 23, 118, 57, 192, 20, 69, 77, 50, 24, 34, 190, 166, 28, 181, 49, 126, 222, 133, 171, 0, 85, 212, 226, 94, 35, 11, 186, 253, 42, 162, 231, 111, 41, 53, 21, 0, 196, 211, 17, 73, 180, 211, 43, 10, 11, 169, 42, 217, 100, 220, 106, 211, 8, 68, 44, 65, 124, 214, 103, 198, 30, 191, 25, 71, 54, 175, 38, 179, 199, 70, 138, 97, 108, 255, 138, 125, 40, 227, 161, 76, 237, 137, 181, 151, 130, 199, 147, 50, 202, 63, 204, 201, 210, 176, 96, 34, 56, 67, 123, 183, 1, 76, 154, 235, 179, 216, 12, 117, 188, 46, 156, 252, 113, 160, 233, 197, 85, 136, 30, 248, 140, 12, 94, 134, 65, 86, 195, 234, 246, 91, 169, 22, 246, 179, 50, 9, 114, 221, 181, 117, 75, 248, 250, 178, 13, 27, 17, 253, 242, 46, 217, 38, 173, 41, 199, 29, 74, 40, 35, 68, 210, 208, 58, 180, 133, 244, 138, 113, 207, 34, 225, 122, 92, 111, 221, 183, 24, 150, 49, 7, 21, 66, 56, 58, 165, 114, 83, 27, 31, 48, 14, 6, 160, 66, 45, 64, 87, 184, 7, 29, 123, 248, 231, 76, 1, 133, 82, 122, 54, 198, 43, 143, 135, 5, 173, 90, 234, 193, 11, 13, 158, 200, 210, 235, 34, 16, 147, 34, 12, 162, 125, 17, 42, 120, 178, 254, 70, 247, 98, 239, 253, 121, 6, 228, 136, 142, 224, 84, 181, 244, 122, 130, 165, 247, 26, 40, 7, 194, 75, 69, 109, 154, 8, 69, 73, 19, 187, 93, 141, 133, 163, 142, 102, 230, 167, 64, 60, 82, 140, 73, 205, 221, 44, 139, 106, 67, 75, 232, 192, 201, 199, 198, 3, 138, 228, 140, 161, 212, 57, 55, 51, 94, 38, 89, 225, 92, 37, 239, 56, 35, 50, 203, 123, 145, 140, 62, 37, 78, 17, 223, 236, 211, 3, 152, 48, 200, 73, 18, 202, 203, 100, 185, 171, 51, 254, 143, 39, 141, 125, 28, 236, 179, 45, 234, 126, 20, 65, 174, 97, 241, 242, 45, 63, 49, 10, 137, 234, 137, 186, 225, 132, 36, 54, 195, 173, 21, 185, 163, 118, 125, 244, 66, 172, 145, 124, 242, 5, 21, 230, 51, 165, 24, 71, 157, 116, 172, 183, 147, 176, 148, 136, 88, 84, 10, 83, 22, 173, 67, 228, 17, 37, 136, 248, 234, 77, 233, 145, 111, 253, 31, 77, 212, 111, 222, 215, 46, 77, 29, 10, 192, 121, 17, 173, 70, 252, 53, 136, 16, 177, 162, 28, 113, 124, 181, 146, 235, 248, 80, 80, 242, 94, 21, 192, 162, 236, 21, 163, 244, 217, 15, 167, 84, 195, 43, 216, 220, 177, 69, 99, 35, 58, 217, 252, 195, 102, 13, 196, 105, 6, 217, 48, 209, 199, 143, 139, 51, 227, 180, 80, 148, 206, 183, 153, 31, 245, 60, 182, 205, 199, 153, 244, 232, 251, 209, 169, 42, 163, 67, 217, 181, 27, 57, 115, 107, 78, 192, 254, 236, 183, 230, 114, 42, 155, 19, 142, 83, 207, 172, 53, 20, 250, 2, 150, 37, 214, 186, 35, 8, 179, 170, 90, 214, 160, 218, 251, 130, 197, 24, 191, 23, 236, 227, 157, 3, 96, 32, 168, 173, 248, 215, 41, 14, 14, 80, 134, 34, 65, 108, 106, 46, 195, 150, 150, 123, 103, 56, 121, 202, 213, 107, 245, 191, 129, 192, 40, 90, 5, 30, 100, 119, 156, 208, 22, 206, 119, 48, 69, 54, 22, 230, 217, 97, 167, 114, 105, 155, 188, 78, 3, 170, 226, 209, 167, 147, 154, 90, 126, 193, 12, 253, 228, 165, 3, 31, 102, 106, 2, 235, 18, 39, 152, 173, 182, 194, 126, 183, 114, 202, 209, 32, 68, 98, 99, 185, 55, 21, 116, 89, 224, 79, 160, 166, 171, 39, 179, 173, 146, 79, 167, 36, 75, 195, 22, 248, 177, 97, 122, 14, 86, 234, 99, 20, 138, 252, 2, 31, 47, 191, 187, 136, 224, 233, 172, 28, 59, 77, 231, 124, 86, 67, 25, 9, 222, 119, 157, 29, 30, 166, 111, 107, 138, 153, 254, 26, 105, 243, 91, 208, 2, 249, 188, 40, 34, 138, 91, 32, 171, 246, 64, 57, 7, 145, 243, 155, 93, 228, 228, 158, 94, 185, 149, 63, 236, 176, 186, 35, 145, 171, 209, 213, 214, 1, 158, 143, 185, 33, 248, 84, 1, 91, 201, 0, 174, 112, 52, 165, 202, 24, 20, 234, 125, 255, 142, 35, 138, 21, 87, 157, 40, 87, 150, 222, 226, 114, 119, 127, 190, 123, 25, 10, 175, 20, 66, 35, 8, 253, 203, 17, 79, 239, 79, 49, 92, 111, 62, 64, 94, 150, 95, 50, 246, 19, 78, 89, 247, 4, 25, 146, 142, 201, 101, 137, 36, 179, 93, 80, 158, 144, 34, 248, 173, 20, 245, 180, 30, 132, 241, 10, 120, 205, 10, 200, 119, 195, 193, 48, 205, 143, 48, 53, 155, 242, 50, 99, 181, 154, 182, 44, 243, 5, 18, 121, 140, 60, 56, 141, 213, 156, 158, 122, 28, 125, 42, 152, 83, 47, 132, 16, 54, 246, 164, 123, 68, 237, 151, 20, 161, 128, 24, 251, 153, 36, 9, 100, 227, 235, 15, 204, 33, 69, 90, 175, 71, 200, 215, 24, 28, 136, 123, 224, 112, 205, 183, 171, 130, 119, 157, 87, 155, 55, 89, 50, 121, 143, 12, 118, 51, 131, 109, 111, 39, 194, 206, 119, 150, 89, 9, 199, 86, 88, 207, 32, 241, 141, 106, 11, 19, 241, 140, 74, 19, 241, 116, 186, 224, 216, 139, 83, 35, 186, 189, 122, 64, 168, 121, 63, 182, 101, 232, 152, 96, 4, 162, 191, 152, 73, 12, 240, 55, 51, 112, 218, 216, 129, 30, 39, 49, 209, 132, 24, 140, 22, 17, 216, 218, 120, 221, 248, 40, 169, 24, 78, 198, 219, 99, 86, 225, 233, 255, 239, 118, 13, 44, 190, 145, 152, 207, 101, 102, 168, 204, 212, 179, 109, 54, 101, 48, 155, 91, 170, 10, 87, 131, 49, 95, 165, 199, 62, 162, 187, 239, 186, 7, 225, 128, 178, 201, 39, 223, 213, 194, 202, 65, 216, 188, 204, 161, 53, 103, 200, 108, 56, 119, 205, 152, 227, 105, 8, 55, 99, 100, 226, 227, 206, 104, 172, 249, 126, 39, 185, 1, 243, 134, 226, 104, 36, 176, 242, 51, 27, 83, 252, 250, 219, 2, 201, 197, 64, 156, 102, 171, 172, 59, 35, 60, 154, 112, 32, 14, 252, 78, 91, 162, 54, 139, 223, 154, 97, 157, 236, 49, 33, 253, 67, 60, 100, 127, 204, 83, 235, 7, 217, 215, 136, 85, 76, 172, 161, 180, 54, 61, 43, 187, 207, 125, 50, 157, 246, 96, 159, 203, 17, 61, 26, 184, 206, 206, 232, 73, 32, 222, 252, 64, 156, 78, 140, 41, 121, 73, 222, 133, 72, 98, 45, 161, 172, 42, 230, 164, 248, 139, 255, 140, 84, 5, 244, 131, 158, 185, 177, 5, 27, 201, 68, 69, 37, 32, 11, 79, 15, 218, 201, 41, 61, 220, 82, 102, 143, 137, 93, 161, 93, 184, 133, 140, 9, 118, 220, 217, 184, 157, 227, 184, 1, 219, 35, 183, 183, 154, 195, 123, 59, 124, 166, 251, 151, 248, 83, 199, 158, 163, 206, 4, 131, 32, 69, 137, 93, 52, 213, 84, 219, 225, 85, 146, 26, 21, 122, 138, 108, 189, 93, 29, 36, 19, 127, 185, 251, 186, 134, 1, 139, 130, 148, 24, 147, 113, 153, 18, 156, 113, 220, 136, 99, 207, 16, 224, 118, 5, 125, 247, 223, 187, 255, 176, 45, 225, 100, 65, 230, 94, 247, 106, 236, 139, 48, 170, 135, 188, 110, 72, 245, 77, 229, 119, 121, 221, 117, 80, 161, 11, 83, 111, 104, 7, 16, 215, 200, 76, 70, 30, 235, 109, 255, 108, 51, 22, 39, 118, 166, 185, 10, 201, 25, 135, 139, 123, 47, 231, 94, 237, 44, 205, 224, 101, 159, 219, 52, 75, 219, 117, 127, 94, 37, 98, 166, 26, 218, 182, 135, 79, 97, 128, 47, 80, 11, 129, 232, 199, 73, 238, 20, 96, 73, 8, 13, 246, 150, 113, 16, 93, 29, 63, 99, 184, 127, 48, 184, 15, 201, 41, 8, 73, 20, 254, 186, 190, 85, 57, 106, 219, 50, 222, 245, 19, 1, 224, 126, 204, 176, 212, 46, 202, 253, 246, 139, 139, 157, 165, 224, 100, 16, 48, 50, 146, 146, 189, 215, 105, 250, 219, 7, 105, 27, 195, 58, 185, 223, 24, 132, 199, 121, 183, 28, 15, 242, 170, 196, 120, 116, 16, 197, 209, 226, 57, 221, 6, 20, 154, 98, 50, 100, 209, 68, 35, 57, 77, 168, 139, 101, 179, 73, 182, 158, 237, 54, 140, 39, 181, 108, 154, 139, 112, 185, 112, 88, 51, 125, 93, 26, 202, 77, 157, 48, 88, 66, 74, 64, 55, 153, 78, 123, 156, 171, 59, 43, 11, 142, 249, 137, 25, 136, 219, 244, 210, 117, 44, 156, 136, 80, 224, 236, 213, 190, 71, 252, 135, 37, 95, 7, 5, 28, 172, 241, 27, 217, 140, 19, 42, 138, 107, 71, 12, 75, 179, 112, 29, 129, 191, 9, 141, 179, 255, 1, 162, 7, 118, 105, 47, 49, 105, 44, 20, 86, 185, 2, 125, 146, 241, 159, 105, 176, 221, 115, 213, 14, 66, 202, 95, 250, 213, 43, 248, 176, 4, 46, 39, 84, 19, 186, 80, 242, 53, 182, 156, 3, 43, 8, 79, 88, 156, 127, 11, 247, 179, 199, 208, 251, 37, 217, 22, 207, 191, 128, 53, 160, 16, 159, 197, 19, 214, 240, 29, 193, 212, 73, 191, 244, 27, 189, 229, 99, 251, 254, 50, 42, 191, 199, 15, 149, 141, 81, 60, 25, 135, 120, 231, 40, 84, 127, 59, 150, 127, 45, 154, 135, 124, 109, 252, 186, 204, 98, 148, 162, 133, 10, 234, 232, 152, 88, 216, 54, 242, 206, 78, 160, 12, 78, 10, 228, 2, 238, 50, 9, 230, 116, 204, 206, 160, 9, 199, 12, 12, 224, 13, 153, 81, 51, 253, 140, 197, 148, 47, 192, 14, 187, 255, 216, 110, 141, 198, 35, 212, 244, 67, 77, 48, 87, 46, 46, 113, 205, 220, 81, 105, 109, 9, 248, 194, 100, 71, 187, 160, 9, 221, 178, 176, 119, 196, 36, 136, 12, 68, 34, 113, 221, 250, 250, 4, 251, 20, 137, 70, 241, 172, 178, 185, 214, 23, 55, 196, 31, 160, 76, 214, 230, 139, 192, 144, 120, 188, 225, 215, 132, 33, 105, 178, 83, 69, 92, 192, 112, 123, 221, 34, 7, 73, 145, 233, 56, 12, 67, 106, 152, 77, 143, 77, 217, 102, 6, 199, 53, 14, 162, 12, 134, 91, 59, 169, 181, 18, 47, 11, 206, 69, 65, 66, 27, 160, 98, 149, 22, 24, 53, 196, 119, 231, 84, 211, 246, 231, 218, 99, 120, 197, 151, 30, 153, 192, 120, 253, 70, 234, 253, 239, 34, 74, 6, 233, 149, 155, 214, 12, 127, 57, 92, 225, 201, 233, 116, 48, 226, 94, 159, 212, 78, 222, 99, 116, 29, 187, 3, 59, 167, 68, 108, 162, 146, 125, 6, 178, 230, 60, 158, 60, 85, 94, 113, 93, 2, 75, 195, 234, 66, 200, 148, 128, 50, 56, 58, 205, 79, 226, 11, 189, 189, 88, 32, 67, 83, 84, 188, 31, 180, 79, 252, 9, 177, 199, 53, 163, 66, 54, 110, 245, 174, 113, 225, 204, 180, 149, 6, 141, 18, 250, 150, 168, 229, 99, 107, 110, 108, 63, 70, 43, 146, 216, 64, 42, 3, 227, 146, 223, 233, 6, 140, 108, 238, 21, 245, 70, 14, 152, 92, 109, 138, 104, 200, 195, 248, 125, 230, 8, 4, 138, 125, 228, 221, 225, 98, 146, 230, 91, 225, 247, 207, 29, 112, 185, 202, 157, 218, 18, 193, 45, 54, 47, 215, 162, 29, 92, 95, 13, 88, 40, 129, 1, 150, 106, 203, 117, 76, 176, 157, 169, 61, 45, 201, 67, 35, 238, 149, 21, 174, 50, 162, 150, 120, 22, 144, 195, 187, 214, 239, 178, 231, 165, 200, 167, 170, 107, 98, 242, 205, 72, 113, 166, 163, 6, 197, 57, 210, 106, 231, 192, 17, 112, 77, 83, 171, 216, 127, 73, 143, 182, 224, 111, 104, 137, 123, 119, 52, 153, 42, 205, 161, 145, 174, 167, 38, 117, 130, 82, 31, 228, 102, 234, 30, 199, 194, 207, 73, 109, 64, 231, 55, 221, 65, 225, 203, 28, 113, 2, 120, 201, 22, 125, 211, 76, 82, 58, 75, 181, 33, 121, 189, 138, 70, 122, 155, 252, 133, 51, 35, 241, 193, 121, 148, 48, 44, 155, 123, 240, 9, 169, 145, 15, 79, 213, 180, 160, 30, 198, 225, 209, 186, 124, 186, 53, 240, 246, 13, 188, 52, 211, 221, 181, 212, 140, 143, 187, 178, 11, 181, 202, 78, 50, 55, 119, 228, 113, 120, 231, 184, 165, 122, 121, 94, 181, 222, 248, 225, 204, 245, 174, 205, 63, 219, 192, 246, 82, 101, 109, 115, 160, 153, 82, 131, 38, 219, 229, 58, 114, 205, 138, 141, 137, 237, 89, 94, 245, 84, 177, 166, 0, 38, 16, 173, 56, 248, 67, 55, 114, 252, 89, 251, 146, 93, 24, 104, 113, 181, 37, 164, 37, 158, 96, 137, 191, 214, 21, 51, 215, 58, 123, 111, 161, 116, 157, 112, 211, 188, 210, 52, 105, 219, 91, 213, 191, 133, 171, 47, 102, 174, 51, 170, 180, 10, 30, 181, 17, 43, 76, 13, 242, 136, 41, 45, 155, 24, 45, 79, 146, 218, 6, 107, 47, 142, 32, 141, 94, 165, 12, 149, 84, 170, 122, 202, 67, 130, 126, 39, 129, 244, 187, 19, 227, 22, 108, 234, 94, 98, 61, 155, 251, 228, 212, 43, 37, 254, 81, 222, 41, 67, 5, 225, 124, 53, 203, 111, 24, 212, 64, 17, 85, 194, 255, 56, 190, 115, 192, 203, 55, 170, 152, 187, 166, 116, 85, 66, 167, 213, 247, 129, 15, 118, 86, 104, 224, 195, 108, 109, 6, 200, 191, 34, 138, 117, 74, 182, 209, 18, 204, 182, 139, 184, 27, 107, 175, 14, 145, 155, 197, 251, 53, 141, 209, 98, 130, 230, 2, 91, 91, 90, 254, 131, 252, 91, 85, 39, 212, 73, 90, 57, 184, 144, 26, 163, 6, 32, 243, 234, 162, 234, 236, 167, 234, 73, 113, 50, 77, 165, 129, 122, 211, 6, 34, 194, 184, 29, 135, 226, 91, 114, 14, 96, 246, 243, 22, 200, 242, 220, 174, 227, 244, 168, 199, 197, 55, 114, 62, 215, 172, 58, 60, 82, 41, 205, 8, 107, 253, 62, 108, 122, 249, 78, 137, 39, 167, 14, 35, 153, 136, 62, 193, 211, 120, 49, 237, 232, 22, 215, 190, 132, 161, 250, 249, 174, 253, 90, 93, 210, 35, 222, 35, 62, 60, 204, 107, 63, 198, 121, 147, 68, 213, 75, 49, 50, 3, 5, 74, 30, 92, 119, 11, 223, 133, 222, 29, 233, 248, 93, 87, 194, 139, 84, 52, 214, 44, 146, 19, 241, 82, 204, 163, 154, 253, 130, 159, 88, 148, 116, 207, 29, 114, 117, 150, 154, 24, 81, 78, 95, 1, 208, 84, 197, 172, 141, 3, 107, 18, 192, 120, 196, 91, 30, 82, 90, 232, 163, 10, 142, 96, 198, 62, 126, 212, 153, 100, 207, 146, 122, 233, 92, 188, 147, 27, 9, 102, 204, 119, 209, 242, 71, 222, 108, 114, 249, 173, 59, 14, 67, 26, 104, 240, 136, 199, 70, 131, 39, 134, 18, 1, 152, 79, 224, 130, 104, 195, 179, 215, 90, 186, 244, 238, 12, 90, 181, 145, 75, 238, 84, 158, 111, 63, 187, 121, 152, 132, 167, 150, 138, 62, 203, 40, 70, 138, 154, 210, 37, 50, 226, 69, 253, 143, 26, 0, 243, 131, 5, 139, 79, 48, 48, 115, 122, 61, 71, 41, 1, 232, 239, 4, 96, 74, 209, 253, 128, 224, 222, 158, 97, 150, 16, 30, 132, 240, 199, 197, 118, 13, 71, 56, 160, 190, 35, 215, 110, 165, 254, 26, 69, 43, 195, 163, 30, 245, 138, 48, 80, 140, 245, 89, 83, 165, 65, 39, 20, 83, 115, 119, 111, 90, 202, 101, 172, 91, 178, 35, 17, 120, 45, 118, 91, 60, 189, 180, 133, 34, 19, 137, 152, 143, 16, 186, 214, 4, 46, 242, 23, 179, 229, 204, 55, 218, 22, 188, 5, 222, 140, 69, 195, 43, 31, 34, 159, 131, 53, 28, 83, 208, 158, 112, 163, 16, 61, 175, 3, 69, 113, 134, 174, 21, 125, 162, 91, 182, 251, 120, 17, 94, 100, 252, 199, 118, 35, 248, 64, 206, 179, 38, 121, 176, 84, 197, 9, 2, 45, 111, 244, 161, 250, 199, 130, 208, 167, 250, 0, 155, 57, 0, 95, 39, 206, 237, 5, 23, 58, 142, 137, 77, 164, 152, 219, 94, 57, 237, 16, 219, 119, 57, 58, 101, 189, 104, 205, 228, 28, 237, 119, 143, 99, 241, 5, 160, 115, 91, 215, 246, 198, 153, 60, 186, 64, 248, 126, 67, 56, 155, 179, 55, 102, 3, 47, 68, 145, 41, 209, 45, 148, 106, 11, 71, 191, 171, 245, 33, 6, 133, 216, 1, 109, 128, 56, 120, 247, 17, 169, 150, 173, 61, 111, 0, 65, 2, 95, 229, 63, 59, 185, 148, 213, 149, 140, 190, 57, 151, 163, 73, 9, 231, 250, 76, 126, 211, 12, 175, 14, 38, 146, 30, 102, 22, 124, 58, 137, 239, 181, 99, 176, 2, 184, 48, 196, 132, 248, 140, 90, 194, 95, 6, 90, 242, 171, 254, 189, 235, 8, 68, 244, 115, 89, 217, 10, 61, 172, 252, 75, 186, 117, 212, 216, 62, 253, 98, 156, 233, 96, 139, 55, 91, 251, 168, 221, 67, 231, 18, 140, 250, 38, 232, 143, 65, 220, 234, 129, 106, 184, 63, 171, 119, 96, 32, 9, 45, 151, 74, 71, 81, 162, 109, 58, 194, 125, 191, 169, 244, 9, 190, 37, 38, 98, 36, 238, 176, 38, 150, 30, 227, 0, 191, 60, 189, 0, 4, 178, 196, 238, 182, 233, 8, 126, 14, 236, 73, 100, 16, 150, 49, 26, 104, 152, 197, 132, 53, 229, 100, 196, 206, 7, 74, 91, 143, 23, 206, 120, 252, 52, 73, 161, 148, 41, 160, 137, 29, 207, 222, 13, 128, 144, 191, 162, 60, 24, 226, 187, 250, 73, 76, 246, 240, 31, 254, 109, 144, 102, 248, 207, 215, 44, 182, 29, 202, 54, 141, 107, 124, 239, 205, 243, 54, 158, 0, 148, 202, 98, 65, 233, 201, 60, 169, 34, 64, 81, 62, 205, 225, 228, 233, 250, 23, 146, 53, 104, 120, 68, 71, 179, 26, 156, 230, 25, 225, 235, 138, 20, 196, 223, 72, 176, 237, 67, 107, 202, 211, 32, 31, 184, 26, 178, 64, 134, 225, 115, 8, 227, 9, 200, 33, 31, 31, 58, 82, 251, 249, 54, 46, 60, 12, 233, 66, 222, 144, 243, 111, 110, 25, 117, 77, 108, 223, 211, 209, 23, 78, 162, 154, 77, 84, 251, 166, 89, 207, 45, 78, 51, 85, 18, 51, 14, 56, 9, 131, 186, 111, 229, 230, 11, 197, 196, 201, 184, 134, 147, 52, 14, 185, 145, 14, 9, 164, 157, 82, 3, 252, 42, 244, 140, 207, 189, 77, 13, 232, 248, 139, 10, 137, 30, 189, 91, 92, 202, 63, 249, 97, 212, 139, 39, 155, 251, 253, 10, 249, 13, 115, 238, 203, 112, 147, 186, 185, 46, 239, 51, 143, 148, 251, 163, 208, 254, 121, 240, 243, 22, 162, 47, 196, 44, 249, 0, 59, 127, 144, 82, 11, 69, 124, 76, 131, 231, 236, 169, 97, 172, 168, 157, 24, 17, 61, 108, 229, 182, 153, 0, 196, 23, 118, 40, 70, 167, 178, 79, 47, 113, 75, 93, 46, 135, 148, 121, 57, 20, 150, 28, 66, 210, 141, 142, 91, 131, 112, 239, 188, 35, 5, 181, 128, 2, 59, 120, 6, 228, 206, 130, 132, 104, 30, 219, 147, 82, 12, 48, 9, 98, 51, 34, 196, 135, 236, 115, 178, 10, 25, 8, 205, 28, 231, 140, 199, 224, 224, 162, 123, 88, 194, 202, 218, 116, 49, 233, 137, 112, 72, 235, 157, 125, 137, 74, 132, 49, 69, 232, 249, 247, 241, 47, 8, 112, 5, 72, 138, 149, 121, 2, 148, 204, 93, 231, 44, 129, 140, 149, 206, 104, 37, 208, 181, 86, 67, 122, 167, 114, 166, 200, 134, 180, 179, 139, 120, 16, 106, 171, 93, 58, 179, 175, 179, 244, 148, 36, 83, 171, 157, 182, 146, 111, 22, 0, 144, 110, 105, 47, 90, 236, 177, 47, 44, 35, 250, 237, 111, 141, 89, 6, 186, 22, 196, 32, 166, 23, 143, 17, 96, 127, 58, 139, 137, 29, 250, 164, 52, 141, 1, 13, 117, 82, 93, 241, 254, 120, 139, 165, 1, 114, 105, 7, 135, 180, 57, 252, 202, 233, 69, 253, 38, 11, 88, 223, 17, 203, 64, 162, 170, 127, 59, 163, 90, 8, 58, 149, 20, 214, 159, 26, 160, 120, 244, 123, 91, 203, 31, 86, 237, 20, 242, 66, 14, 182, 206, 127, 54, 119, 36, 182, 41, 129, 128, 193, 81, 19, 182, 120, 85, 23, 210, 220, 177, 202, 204, 102, 143, 81, 243, 233, 15, 67, 183, 157, 96, 122, 120, 130, 79, 154, 118, 36, 78, 152, 24, 123, 90, 86, 169, 200, 20, 29, 57, 210, 133, 16, 52, 24, 202, 20, 173, 101, 230, 61, 47, 105, 94, 244, 47, 217, 207, 87, 87, 93, 204, 138, 110, 8, 150, 200, 248, 129, 139, 134, 225, 34, 34, 150, 247, 70, 194, 144, 167, 21, 98, 161, 7, 38, 78, 3, 36, 42, 134, 161, 157, 203, 87, 34, 171, 28, 199, 64, 186, 130, 223, 103, 121, 88, 130, 50, 174, 10, 50, 79, 13, 92, 162, 99, 1, 85, 168, 122, 61, 132, 80, 85, 112, 238, 6, 179, 207, 162, 53, 16, 198, 250, 218, 206, 202, 242, 248, 31, 74, 86, 197, 133, 193, 36, 99, 133, 160, 223, 55, 36, 153, 101, 165, 188, 184, 179, 189, 36, 198, 254, 51, 199, 13, 116, 24, 10, 135, 101, 208, 166, 54, 107, 1, 166, 97, 38, 201, 45, 86, 218, 44, 163, 60, 173, 129, 69, 17, 204, 55, 85, 141, 80, 100, 88, 127, 108, 205, 65, 73, 159, 204, 216, 250, 240, 17, 121, 196, 196, 121, 46, 64, 25, 215, 88, 102, 221, 244, 35, 248, 96, 114, 66, 125, 134, 7, 83, 97, 0, 80, 166, 224, 216, 22, 213, 18, 42, 242, 126, 182, 81, 224, 10, 37, 193, 43, 174, 74, 159, 147, 58, 65, 217, 147, 110, 214, 95, 122, 174, 125, 121, 74, 66, 144, 74, 99, 52, 132, 104, 105, 139, 225, 128, 62, 1, 188, 7, 43, 185, 222, 134, 6, 216, 52, 211, 213, 83, 109, 176, 166, 152, 161, 48, 211, 124, 198, 241, 52, 237, 139, 155, 20, 233, 140, 55, 147, 68, 77, 166, 106, 81, 213, 250, 74, 125, 165, 213, 65, 147, 92, 31, 208, 242, 169, 90, 30, 239, 165, 143, 196, 85, 247, 121, 147, 38, 181, 170, 75, 30, 224, 105, 121, 27, 197, 246, 172, 39, 109, 6, 209, 42, 208, 13, 148, 153, 97, 247, 38, 168, 185, 76, 42, 102, 145, 166, 27, 242, 37, 136, 45, 245, 32, 200, 177, 225, 248, 154, 117, 172, 184, 37, 156, 208, 100, 151, 64, 16, 193, 254, 213, 205, 140, 207, 153, 64, 155, 57, 47, 237, 59, 231, 10, 130, 204, 72, 30, 17, 60, 76, 115, 161, 237, 104, 5, 38, 254, 90, 152, 208, 49, 194, 160, 243, 106, 78, 41, 251, 143, 104, 130, 180, 241, 98, 211, 238, 194, 224, 36, 242, 39, 109, 180, 67, 130, 210, 44, 8, 162, 150, 16, 76, 83, 40, 86, 97, 87, 187, 42, 50, 63, 35, 98, 192, 23, 138, 236, 90, 3, 157, 19, 5, 252, 228, 211, 239, 1, 85, 190, 54, 144, 218, 221, 184, 19, 89, 75, 138, 53, 115, 206, 31, 100, 99, 187, 80, 162, 222, 134, 167, 238, 117, 84, 36, 62, 178, 224, 147, 119, 160, 65, 244, 245, 157, 188, 184, 222, 42, 53, 188, 84, 51, 5, 22, 214, 229, 92, 249, 17, 78, 6, 79, 145, 92, 201, 53, 58, 45, 87, 90, 19, 194, 253, 18, 68, 87, 58, 48, 206, 85, 241, 173, 40, 0, 38, 75, 210, 227, 254, 150, 117, 168, 88, 41, 180, 31, 77, 239, 136, 37, 106, 222, 33, 63, 239, 217, 245, 29, 11, 255, 94, 181, 132, 91, 80, 152, 15, 224, 253, 187, 104, 191, 95, 180, 55, 108, 24, 65, 32, 27, 147, 201, 102, 102, 64, 245, 14, 196, 154, 169, 133, 191, 117, 49, 108, 75, 133, 72, 95, 48, 126, 1, 166, 187, 129, 223, 94, 96, 39, 225, 222, 196, 210, 129, 35, 24, 186, 145, 6, 173, 82, 67, 130, 97, 167, 138, 167, 57, 181, 228, 249, 247, 44, 29, 9, 140, 245, 49, 164, 210, 119, 91, 176, 15, 31, 206, 88, 229, 155, 23, 72, 114, 224, 237, 190, 194, 147, 133, 233, 170, 22, 64, 241, 162, 204, 52, 208, 138, 159, 29, 94, 25, 117, 103, 132, 232, 65, 198, 90, 183, 113, 6, 76, 52, 141, 199, 166, 170, 128, 199, 251, 60, 137, 86, 78, 52, 16, 72, 64, 112, 174, 67, 54, 73, 63, 55, 183, 30, 11, 48, 131, 7, 94, 151, 17, 166, 115, 62, 5, 221, 71, 30, 137, 35, 181, 250, 187, 68, 26, 187, 51, 202, 249, 76, 162, 63, 10, 144, 123, 119, 217, 155, 15, 214, 212, 52, 39, 208, 109, 210, 206, 230, 242, 186, 254, 170, 138, 52, 40, 130, 7, 102, 67, 28, 38, 106, 152, 122, 172, 184, 166, 81, 30, 236, 149, 213, 236, 174, 130, 140, 44, 143, 199, 9, 118, 58, 11, 30, 126, 139, 39, 128, 92, 83, 242, 207, 200, 157, 245, 147, 84, 207, 140, 120, 59, 56, 228, 145, 177, 130, 48, 139, 78, 101, 124, 42, 228, 129, 172, 14, 248, 144, 142, 189, 38, 158, 58, 85, 84, 75, 136, 180, 175, 13, 184, 0, 26, 128, 234, 151, 167, 40, 6, 163, 8, 23, 57, 69, 42, 89, 174, 50, 0, 216, 186, 166, 7, 143, 123, 95, 23, 26, 134, 127, 125, 199, 117, 26, 215, 129, 212, 119, 83, 2, 66, 96, 247, 126, 241, 49, 171, 186, 222, 146, 234, 115, 199, 123, 112, 79, 147, 53, 210, 95, 192, 166, 49, 137, 245, 80, 120, 14, 184, 242, 237, 131, 27, 141, 100, 178, 185, 54, 245, 152, 55, 243, 88, 45, 122, 48, 229, 214, 55, 118, 105, 222, 26, 189, 68, 42, 21, 34, 57, 165, 246, 109, 35, 84, 45, 76, 196, 116, 127, 88, 180, 10, 179, 103, 226, 208, 33, 91, 111, 12, 231, 221, 166, 64, 199, 93, 87, 58, 164, 108, 23, 126, 169, 216, 119, 68, 104, 24, 51, 156, 71, 175, 181, 93, 184, 124, 171, 34, 72, 115, 95, 148, 72, 166, 241, 178, 223, 36, 10, 12, 219, 50, 172, 139, 152, 26, 232, 185, 249, 95, 249, 8, 244, 20, 78, 136, 141, 145, 169, 168, 2, 208, 9, 30, 37, 50, 149, 47, 50, 17, 64, 214, 168, 32, 23, 228, 232, 31, 78, 219, 77, 8, 80, 253, 41, 79, 8, 123, 65, 234, 36, 78, 151, 23, 68, 18, 70, 10, 9, 9, 33, 142, 129, 115, 143, 191, 127, 209, 141, 202, 189, 55, 120, 16, 148, 184, 122, 178, 77, 10, 149, 18, 30, 6, 101, 53, 90, 155, 239, 253, 82, 57, 11, 125, 84, 7, 175, 116, 62, 210, 232, 112, 130, 253, 105, 153, 203, 31, 120, 251, 241, 45, 41, 127, 96, 146, 11, 187, 180, 115, 21, 63, 182, 213, 196, 175, 255, 162, 31, 233, 65, 197, 110, 42, 136, 54, 118, 234, 176, 3, 252, 83, 4, 107, 133, 19, 226, 34, 163, 232, 31, 39, 171, 178, 242, 36, 69, 64, 33, 167, 139, 81, 184, 160, 207, 119, 37, 137, 40, 165, 50, 167, 243, 188, 82, 142, 91, 2, 0, 209, 16, 166, 152, 134, 113, 185, 236, 253, 161, 120, 90, 94, 189, 81, 201, 224, 60, 66, 82, 23, 12, 199, 197, 86, 198, 16, 54, 174, 237, 121, 186, 244, 141, 50, 26, 152, 120, 78, 52, 71, 115, 40, 94, 156, 22, 162, 241, 219, 90, 212, 236, 21, 153, 170, 142, 20, 200, 251, 49, 98, 192, 173, 14, 167, 199, 167, 176, 235, 111, 61, 243, 30, 215, 35, 113, 127, 122, 250, 79, 162, 40, 130, 81, 31, 51, 177, 240, 9, 31, 192, 210, 151, 171, 78, 201, 50, 102, 227, 75, 196, 239, 232, 175, 240, 119, 205, 191, 180, 209, 68, 123, 86, 244, 114, 244, 209, 7, 35, 17, 16, 89, 133, 89, 42, 9, 18, 124, 21, 252, 101, 244, 88, 79, 214, 234, 145, 140, 52, 118, 47, 44, 121, 43, 14, 6, 157, 26, 16, 172, 252, 85, 94, 84, 59, 134, 19, 119, 10, 70, 91, 157, 246, 8, 74, 32, 15, 23, 230, 2, 205, 188, 103, 237, 92, 19, 88, 21, 147, 135, 117, 124, 107, 140, 39, 152, 51, 56, 246, 122, 153, 174, 106, 145, 140, 146, 78, 180, 243, 212, 62, 46, 3, 131, 137, 78, 56, 79, 160, 252, 117, 84, 126, 199, 194, 240, 227, 23, 188, 40, 206, 72, 68, 40, 58, 91, 183, 80, 40, 31, 65, 9, 70, 23, 34, 64, 199, 213, 138, 80, 140, 58, 202, 215, 115, 223, 92, 181, 218, 116, 252, 210, 190, 210, 54, 166, 241, 66, 132, 62, 98, 109, 158, 51, 52, 89, 69, 24, 171, 176, 235, 116, 175, 18, 111, 80, 167, 209, 170, 150, 194, 152, 23, 96, 162, 41, 244, 232, 80, 85, 76, 226, 126, 240, 196, 214, 81, 40, 183, 225, 102, 10, 166, 57, 231, 230, 232, 149, 164, 116, 112, 122, 0, 182, 53, 199, 252, 55, 50, 111, 243, 200, 64, 191, 29, 240, 86, 187, 126, 133, 121, 249, 249, 37, 58, 174, 209, 39, 152, 103, 151, 131, 127, 207, 154, 14, 188, 239, 28, 107, 33, 10, 57, 82, 158, 116, 63, 225, 29, 103, 80, 134, 84, 245, 37, 13, 1, 70, 95, 180, 82, 191, 0, 67, 243, 67, 218, 148, 30, 248, 160, 133, 92, 83, 190, 197, 251, 150, 117, 28, 178, 121, 17, 16, 209, 4, 188, 155, 55, 82, 134, 128, 3, 104, 142, 132, 144, 32, 101, 0, 223, 166, 79, 49, 108, 64, 231, 162, 6, 27, 94, 116, 68, 235, 168, 36, 115, 39, 191, 151, 28, 202, 228, 35, 90, 53, 172, 170, 173, 151, 236, 174, 197, 19, 85, 216, 192, 158, 128, 35, 6, 88, 21, 25, 158, 92, 18, 213, 22, 136, 119, 149, 124, 213, 103, 197, 6, 206, 174, 36, 196, 199, 208, 68, 57, 84, 28, 218, 251, 214, 75, 157, 254, 46, 61, 228, 188, 87, 93, 125, 155, 38, 175, 4, 36, 160, 31, 177, 70, 222, 245, 85, 246, 69, 109, 45, 77, 151, 175, 202, 23, 17, 139, 66, 77, 166, 155, 251, 82, 156, 11, 77, 102, 222, 20, 170, 255, 232, 162, 41, 73, 26, 89, 118, 58, 126, 212, 207, 108, 55, 5, 136, 150, 240, 223, 185, 103, 231, 115, 182, 189, 39, 164, 162, 182, 112, 113, 11, 93, 250, 108, 247, 231, 143, 172, 67, 223, 221, 224, 24, 116, 128, 119, 232, 143, 90, 27, 149, 49, 226, 195, 238, 66, 233, 15, 97, 137, 170, 155, 236, 124, 185, 95, 192, 121, 36, 82, 76, 249, 31, 46, 102, 185, 14, 243, 30, 244, 217, 184, 156, 156, 207, 35, 38, 89, 107, 212, 139, 75, 161, 16, 78, 232, 76, 209, 7, 92, 94, 80, 159, 58, 162, 138, 216, 206, 231, 93, 85, 198, 140, 90, 200, 170, 79, 118, 26, 52, 168, 111, 165, 224, 91, 45, 85, 42, 162, 142, 55, 0, 19, 167, 142, 86, 74, 235, 43, 230, 3, 162, 93, 33, 239, 43, 181, 253, 155, 106, 28, 48, 150, 43, 234, 102, 187, 247, 187, 40, 43, 158, 33, 48, 242, 214, 95, 182, 126, 3, 25, 218, 47, 163, 140, 217, 6, 221, 199, 57, 76, 182, 244, 110, 49, 168, 240, 129, 31, 226, 185, 35, 18, 185, 189, 2, 17, 190, 134, 137, 29, 76, 118, 48, 216, 33, 188, 103, 160, 66, 143, 23, 230, 255, 24, 238, 6, 111, 18, 214, 163, 244, 30, 36, 4, 216, 31, 162, 60, 127, 235, 203, 67, 34, 69, 20, 227, 220, 56, 107, 78, 81, 10, 160, 169, 19, 255, 211, 126, 46, 77, 46, 152, 46, 114, 135, 139, 23, 3, 172, 52, 80, 86, 11, 5, 190, 51, 86, 190, 67, 0, 75, 17, 160, 229, 12, 254, 152, 221, 3, 213, 220, 213, 244, 51, 157, 73, 251, 206, 213, 43, 113, 247, 245, 189, 52, 226, 250, 109, 212, 4, 168, 132, 24, 137, 160, 175, 219, 204, 156, 32, 253, 121, 8, 209, 200, 96, 88, 93, 66, 243, 84, 76, 148, 142, 229, 86, 31, 106, 10, 23, 136, 200, 132, 152, 150, 51, 125, 202, 13, 202, 63, 110, 38, 125, 12, 113, 17, 162, 92, 217, 24, 108, 235, 209, 81, 65, 202, 179, 60, 176, 11, 91, 62, 45, 126, 96, 9, 66, 153, 134, 11, 40, 231, 205, 66, 5, 249, 92, 99, 119, 206, 105, 108, 207, 79, 44, 61, 10, 179, 18, 7, 33, 15, 68, 204, 40, 214, 171, 223, 177, 98, 94, 176, 243, 165, 152, 231, 154, 1, 67, 226, 236, 109, 137, 202, 72, 234, 243, 23, 156, 41, 105, 118, 40, 72, 112, 147, 53, 76, 126, 158, 255, 145, 213, 214, 43, 241, 194, 125, 227, 104, 241, 196, 244, 237, 140, 214, 62, 210, 249, 207, 143, 58, 106, 182, 10, 75, 247, 114, 19, 127, 210, 217, 102, 190, 200, 149, 36, 59, 137, 204, 222, 223, 123, 63, 215, 84, 249, 49, 149, 83, 137, 205, 224, 192, 44, 166, 101, 109, 181, 98, 219, 17, 169, 186, 35, 11, 108, 131, 75, 185, 220, 58, 214, 129, 67, 15, 106, 220, 67, 76, 7, 247, 154, 201, 146, 25, 224, 51, 169, 180, 61, 73, 169, 216, 163, 64, 179, 144, 61, 184, 163, 163, 8, 113, 40, 42, 53, 46, 80, 50, 199, 156, 6, 138, 44, 86, 130, 12, 195, 251, 191, 99, 122, 127, 116, 155, 248, 205, 86, 172, 49, 197, 132, 101, 124, 32, 23, 225, 78, 252, 23, 182, 27, 10, 93, 135, 220, 98, 246, 62, 157, 134, 102, 1, 113, 244, 65, 39, 3, 106, 168, 22, 142, 16, 64, 140, 15, 80, 99, 35, 22, 179, 165, 166, 85, 100, 233, 90, 229, 18, 78, 92, 204, 255, 218, 224, 121, 218, 149, 146, 101, 90, 237, 209, 141, 172, 71, 193, 90, 175, 189, 165, 169, 88, 27, 15, 197, 225, 132, 32, 122, 215, 89, 92, 130, 175, 160, 186, 201, 20, 61, 64, 162, 133, 3, 43, 242, 1, 253, 252, 181, 136, 253, 218, 163, 130, 111, 36, 14, 133, 7, 219, 204, 145, 34, 32, 170, 193, 236, 151, 74, 74, 147, 76, 138, 107, 121, 122, 117, 158, 28, 246, 50, 255, 135, 138, 164, 17, 38, 164, 210, 75, 174, 116, 208, 146, 145, 163, 54, 161, 142, 104, 242, 253, 76, 97, 186, 92, 131, 69, 189, 217, 241, 225, 157, 78, 37, 78, 96, 220, 194, 3, 246, 214, 121, 178, 93, 26, 46, 165, 137, 4, 223, 97, 14, 94, 50, 52, 234, 50, 86, 69, 141, 165, 121, 202, 152, 37, 85, 22, 135, 212, 233, 30, 106, 208, 152, 10, 196, 23, 144, 2, 199, 18, 43, 47, 236, 83, 30, 54, 249, 7, 145, 116, 239, 36, 191, 115, 171, 101, 77, 39, 102, 167, 249, 152, 234, 193, 141, 24, 143, 254, 132, 241, 49, 221, 223, 189, 103, 12, 245, 20, 240, 213, 121, 152, 82, 69, 179, 192, 186, 6, 66, 56, 22, 22, 144, 240, 125, 87, 13, 248, 93, 108, 229, 245, 148, 14, 62, 131, 45, 100, 201, 63, 68, 118, 249, 66, 98, 132, 141, 74, 140, 20, 220, 81, 134, 141, 172, 190, 199, 149, 205, 93, 57, 45, 113, 240, 15, 161, 4, 122, 228, 28, 150, 220, 183, 88, 226, 51, 117, 6, 107, 122, 39, 165, 25, 15, 197, 199, 149, 157, 131, 214, 44, 253, 240, 247, 241, 139, 229, 232, 212, 218, 113, 23, 188, 132, 147, 250, 252, 14, 145, 7, 246, 101, 27, 190, 155, 27, 224, 20, 37, 63, 2, 54, 38, 5, 34, 186, 2, 107, 221, 161, 66, 248, 217, 63, 79, 202, 83, 53, 253, 127, 87, 252, 108, 133, 175, 14, 82, 140, 132, 150, 94, 234, 120, 120, 214, 32, 234, 53, 81, 60, 107, 255, 166, 188, 89, 153, 9, 173, 234, 85, 244, 11, 76, 217, 190, 22, 16, 147, 80, 23, 113, 126, 241, 84, 57, 134, 84, 152, 42, 97, 158, 176, 247, 138, 249, 54, 110, 103, 112, 170, 52, 238, 109, 27, 131, 137, 84, 37, 53, 162, 45, 12, 135, 228, 179, 197, 44, 163, 143, 33, 0, 125, 198, 45, 122, 93, 252, 148, 208, 163, 242, 99, 126, 195, 122, 247, 103, 141, 22, 208, 148, 113, 236, 210, 223, 57, 241, 128, 9, 40, 105, 207, 109, 69, 229, 204, 238, 98, 124, 100, 227, 17, 185, 226, 18, 119, 192, 50, 24, 98, 196, 187, 230, 224, 60, 191, 157, 41, 179, 95, 76, 153, 6, 217, 232, 93, 2, 110, 41, 148, 140, 203, 9, 156, 225, 174, 26, 16, 1, 182, 20, 242, 221, 114, 72, 21, 141, 226, 213, 200, 17, 198, 16, 100, 176, 216, 73, 240, 76, 6, 237, 78, 200, 119, 77, 39, 240, 158, 31, 148, 131, 187, 63, 232, 210, 64, 179, 250, 232, 53, 78, 40, 18, 89, 33, 39, 140, 209, 56, 112, 249, 146, 222, 7, 127, 161, 65, 146, 33, 146, 127, 56, 114, 32, 84, 80, 24, 112, 229, 230, 213, 94, 91, 148, 244, 109, 13, 157, 111, 51, 201, 173, 173, 66, 136, 150, 6, 111, 111, 154, 11, 17, 116, 13, 27, 209, 242, 59, 99, 21, 169, 222, 68, 72, 222, 164, 61, 217, 201, 53, 205, 33, 15, 141, 10, 80, 10, 215, 82, 125, 43, 165, 54, 184, 26, 151, 71, 203, 206, 50, 58, 57, 161, 52, 168, 22, 242, 179, 125, 111, 43, 91, 87, 3, 7, 126, 177, 54, 163, 148, 93, 255, 55, 124, 43, 141, 72, 166, 34, 147, 163, 135, 0, 50, 126, 152, 165, 1, 244, 118, 95, 96, 80, 4, 187, 206, 110, 239, 214, 183, 209, 125, 252, 40, 182, 126, 134, 2, 45, 182, 138, 179, 2, 102, 138, 101, 19, 92, 134, 39, 69, 120, 57, 190, 57, 130, 245, 73, 221, 23, 174, 183, 93, 28, 157, 42, 231, 217, 206, 139, 115, 38, 188, 129, 124, 12, 110, 89, 108, 132, 51, 142, 244, 135, 245, 251, 68, 128, 56, 218, 26, 248, 129, 34, 157, 167, 84, 138, 245, 95, 64, 172, 74, 9, 252, 17, 188, 73, 110, 229, 78, 230, 153, 231, 44, 191, 46, 126, 39, 241, 123, 223, 46, 47, 39, 69, 139, 118, 7, 184, 183, 166, 171, 61, 112, 200, 111, 196, 61, 123, 217, 188, 193, 102, 212, 105, 92, 0, 159, 27, 176, 74, 50, 250, 107, 68, 26, 196, 203, 239, 0, 42, 184, 35, 143, 14, 106, 172, 76, 147, 112, 100, 25, 215, 41, 170, 126, 95, 108, 218, 82, 36, 9, 116, 177, 182, 123, 254, 190, 56, 53, 125, 239, 66, 243, 145, 10, 61, 102, 57, 109, 197, 80, 159, 97, 253, 120, 48, 249, 97, 177, 2, 185, 153, 14, 201, 121, 165, 107, 133, 118, 248, 220, 68, 206, 96, 137, 154, 121, 215, 217, 189, 74, 76, 204, 222, 35, 222, 227, 83, 52, 77, 180, 122, 123, 184, 249, 212, 240, 22, 200, 136, 194, 206, 111, 120, 162, 253, 186, 155, 213, 149, 39, 97, 252, 132, 95, 70, 241, 47, 54, 19, 143, 188, 149, 148, 238, 161, 194, 121, 17, 93, 111, 133, 242, 201, 212, 183, 138, 152, 178, 37, 230, 140, 107, 137, 122, 163, 75, 5, 135, 225, 186, 32, 50, 131, 104, 197, 16, 87, 163, 180, 251, 170, 27, 181, 241, 85, 179, 126, 116, 219, 206, 79, 242, 5, 101, 41, 165, 80, 223, 66, 32, 68, 71, 88, 53, 117, 216, 209, 172, 112, 212, 129, 152, 49, 109, 61, 236, 79, 222, 156, 11, 239, 31, 202, 61, 123, 205, 58, 128, 7, 95, 27, 139, 135, 91, 119, 192, 187, 13, 99, 165, 103, 254, 140, 195, 234, 100, 79, 231, 154, 176, 233, 82, 214, 191, 60, 193, 53, 143, 213, 250, 131, 91, 40, 145, 225, 212, 106, 77, 201, 106, 185, 120, 141, 225, 195, 5, 110, 132, 235, 189, 95, 42, 90, 55, 194, 116, 222, 147, 91, 172, 175, 220, 232, 23, 95, 201, 4, 150, 102, 250, 23, 196, 86, 120, 28, 42, 188, 48, 46, 144, 66, 85, 124, 42, 187, 137, 212, 196, 230, 245, 111, 147, 204, 161, 63, 35, 100, 22, 144, 232, 208, 88, 101, 151, 10, 31, 210, 90, 1, 4, 202, 135, 120, 102, 81, 121, 189, 201, 44, 222, 209, 48, 188, 152, 108, 250, 65, 173, 13, 240, 1, 123, 109, 36, 163, 137, 172, 69, 250, 162, 10, 75, 89, 57, 102, 147, 77, 18, 93, 4, 104, 216, 225, 207, 229, 24, 57, 187, 228, 99, 218, 204, 58, 115, 44, 120, 209, 99, 200, 214, 156, 221, 139, 17, 131, 159, 164, 233, 160, 6, 2, 27, 15, 60, 204, 219, 18, 190, 164, 210, 203, 188, 34, 116, 36, 134, 101, 193, 75, 88, 189, 222, 245, 174, 203, 0, 199, 161, 57, 22, 4, 219, 77, 24, 36, 141, 70, 215, 219, 31, 92, 105, 10, 70, 102, 169, 244, 215, 230, 169, 88, 240, 157, 190, 5, 130, 186, 232, 76, 117, 45, 230, 181, 115, 67, 35, 172, 15, 165, 30, 125, 180, 57, 245, 25, 97, 244, 170, 182, 180, 107, 24, 231, 195, 140, 97, 50, 220, 220, 193, 196, 144, 49, 32, 90, 62, 206, 109, 85, 35, 135, 220, 249, 255, 78, 103, 207, 98, 156, 228, 213, 254, 22, 231, 247, 191, 152, 250, 37, 8, 172, 204, 136, 181, 30, 75, 9, 174, 226, 175, 172, 238, 237, 107, 27, 230, 46, 197, 240, 140, 162, 225, 65, 165, 249, 209, 49, 152, 19, 102, 96, 96, 206, 145, 40, 39, 155, 68, 8, 228, 176, 0, 112, 6, 27, 164, 12, 220, 185, 140, 95, 71, 202, 125, 234, 15, 246, 52, 206, 5, 103, 198, 6, 65, 12, 209, 87, 223, 121, 239, 124, 120, 128, 156, 194, 250, 239, 133, 247, 227, 76, 107, 73, 38, 228, 241, 33, 19, 61, 138, 70, 37, 45, 58, 239, 13, 176, 27, 17, 41, 202, 233, 62, 223, 175, 157, 36, 234, 192, 23, 180, 64, 61, 231, 103, 173, 83, 169, 241, 51, 201, 81, 67, 217, 79, 246, 203, 247, 233, 117, 253, 153, 252, 50, 54, 251, 120, 254, 215, 105, 168, 47, 128, 61, 139, 243, 91, 142, 166, 179, 26, 97, 65, 171, 167, 244, 114, 188, 192, 101, 23, 55, 115, 205, 222, 209, 59, 111, 83, 147, 188, 26, 163, 123, 244, 252, 98, 148, 104, 110, 81, 27, 167, 67, 200, 85, 251, 80, 163, 117, 36, 78, 137, 95, 34, 59, 163, 172, 164, 89, 247, 72, 64, 181, 41, 86, 255, 184, 158, 238, 185, 226, 70, 112, 123, 179, 3, 73, 1, 111, 110, 161, 49, 29, 112, 124, 244, 110, 238, 247, 14, 14, 76, 199, 159, 197, 179, 250, 244, 247, 85, 172, 56, 98, 70, 232, 99, 204, 226, 75, 121, 73, 239, 205, 191, 210, 74, 92, 4, 0, 234, 193, 196, 194, 173, 68, 44, 15, 40, 155, 166, 205, 197, 52, 207, 169, 123, 143, 5, 179, 234, 31, 202, 86, 56, 24, 233, 62, 121, 211, 133, 19, 209, 88, 32, 158, 85, 70, 85, 248, 249, 48, 225, 47, 86, 13, 128, 6, 140, 36, 31, 128, 58, 215, 176, 81, 129, 125, 172, 224, 209, 207, 246, 173, 207, 193, 22, 97, 60, 173, 183, 77, 253, 155, 18, 178, 36, 113, 186, 216, 70, 53, 47, 176, 176, 110, 88, 134, 81, 218, 164, 230, 45, 241, 27, 80, 100, 97, 7, 241, 118, 72, 200, 165, 187, 155, 190, 94, 40, 30, 205, 153, 71, 104, 141, 15, 220, 15, 153, 177, 200, 155, 239, 120, 101, 136, 17, 153, 255, 88, 163, 185, 221, 199, 216, 98, 69, 95, 59, 175, 164, 233, 253, 133, 225, 2, 156, 121, 93, 233, 11, 172, 164, 252, 66, 25, 59, 141, 195, 114, 131, 224, 50, 139, 227, 135, 240, 4, 171, 14, 206, 140, 207, 55, 211, 159, 135, 8, 193, 239, 233, 207, 53, 244, 238, 84, 19, 73, 1, 94, 104, 42, 148, 26, 3, 101, 198, 153, 239, 239, 34, 230, 253, 108, 6, 54, 59, 54, 252, 49, 86, 67, 90, 174, 196, 140, 239, 181, 64, 85, 11, 44, 9, 229, 249, 136, 72, 125, 199, 191, 242, 156, 145, 81, 70, 193, 44, 181, 133, 36, 211, 242, 30, 144, 244, 7, 89, 97, 98, 244, 61, 184, 3, 174, 101, 173, 221, 239, 145, 166, 225, 182, 82, 202, 76, 76, 150, 198, 93, 120, 100, 254, 47, 21, 168, 61, 38, 165, 48, 31, 76, 59, 37, 89, 106, 87, 203, 179, 248, 156, 162, 64, 50, 76, 5, 123, 113, 9, 215, 226, 23, 205, 44, 245, 117, 179, 251, 160, 106, 205, 130, 187, 253, 151, 224, 24, 32, 107, 210, 221, 62, 9, 133, 192, 119, 143, 232, 69, 204, 98, 5, 86, 121, 17, 245, 180, 249, 233, 48, 185, 56, 62, 20, 215, 140, 6, 220, 139, 44, 46, 180, 236, 215, 250, 81, 195, 254, 101, 135, 40, 135, 235, 141, 22, 183, 1, 31, 3, 89, 252, 87, 207, 58, 24, 161, 225, 28, 217, 174, 122, 71, 46, 100, 25, 85, 189, 177, 45, 185, 53, 210, 109, 222, 240, 244, 82, 75, 188, 17, 191, 45, 184, 220, 132, 105, 75, 151, 12, 5, 236, 148, 150, 10, 22, 199, 26, 143, 142, 159, 137, 87, 142, 70, 241, 67, 5, 15, 235, 87, 20, 224, 207, 210, 38, 60, 245, 34, 238, 108, 193, 204, 194, 179, 7, 131, 158, 63, 245, 255, 95, 34, 247, 63, 100, 39, 85, 51, 182, 220, 69, 125, 88, 223, 39, 160, 176, 115, 100, 232, 150, 20, 40, 205, 132, 231, 201, 97, 40, 66, 207, 53, 195, 39, 59, 4, 191, 140, 210, 66, 46, 104, 196, 64, 35, 22, 151, 210, 88, 220, 108, 96, 95, 175, 97, 70, 25, 90, 111, 112, 123, 106, 204, 22, 59, 106, 248, 232, 178, 149, 32, 36, 16, 254, 191, 202, 95, 177, 177, 116, 95, 213, 205, 170, 254, 96, 184, 233, 166, 10, 156, 95, 254, 105, 205, 55, 158, 61, 129, 215, 98, 230, 107, 3, 63, 157, 155, 207, 247, 157, 79, 254, 138, 189, 94, 248, 244, 152, 167, 111, 16, 202, 234, 81, 38, 253, 1, 180, 210, 24, 89, 184, 252, 85, 6, 35, 223, 9, 34, 83, 254, 224, 69, 138, 199, 37, 90, 24, 21, 136, 15, 51, 50, 30, 54, 216, 227, 156, 117, 242, 100, 52, 163, 89, 33, 164, 98, 17, 89, 176, 21, 155, 15, 146, 216, 86, 117, 168, 3, 121, 75, 252, 116, 80, 199, 162, 215, 74, 4, 31, 118, 186, 206, 249, 116, 221, 99, 65, 54, 33, 13, 78, 210, 35, 210, 53, 122, 190, 198, 221, 183, 134, 204, 79, 8, 25, 210, 188, 253, 85, 201, 46, 250, 3, 232, 208, 37, 12, 223, 72, 151, 148, 238, 168, 204, 252, 31, 1, 28, 118, 248, 170, 149, 73, 59, 32, 202, 101, 151, 15, 8, 189, 163, 217, 141, 150, 116, 65, 129, 166, 147, 54, 1, 66, 214, 228, 77, 76, 12, 105, 1, 82, 129, 123, 28, 50, 106, 239, 115, 189, 81, 165, 89, 64, 162, 72, 173, 162, 12, 143, 161, 42, 195, 52, 49, 79, 130, 231, 207, 125, 113, 21, 43, 184, 120, 97, 79, 162, 36, 125, 204, 253, 23, 235, 22, 87, 250, 129, 46, 51, 140, 184, 122, 5, 176, 91, 77, 121, 99, 94, 246, 217, 247, 181, 100, 190, 81, 43, 71, 97, 216, 82, 144, 50, 215, 72, 88, 136, 202, 167, 146, 20, 108, 111, 48, 8, 128, 77, 59, 179, 227, 116, 102, 106, 170, 123, 183, 150, 15, 20, 226, 177, 244, 199, 210, 225, 96, 11, 232, 230, 107, 230, 92, 88, 7, 200, 250, 162, 143, 245, 215, 194, 174, 126, 31, 145, 211, 158, 210, 125, 222, 86, 80, 105, 207, 96, 197, 240, 16, 121, 229, 16, 43, 32, 18, 97, 116, 249, 105, 53, 10, 109, 163, 226, 90, 43, 205, 27, 190, 20, 75, 5, 119, 97, 81, 100, 236, 30, 13, 42, 30, 148, 237, 225, 149, 35, 17, 17, 5, 142, 35, 250, 215, 197, 155, 17, 111, 145, 129, 53, 57, 0, 200, 249, 89, 176, 189, 1, 116, 36, 15, 140, 182, 95, 214, 143, 116, 235, 82, 165, 53, 192, 181, 183, 131, 106, 5, 142, 35, 31, 235, 177, 90, 203, 121, 167, 216, 165, 33, 47, 225, 21, 227, 222, 235, 82, 74, 195, 197, 215, 79, 205, 108, 145, 185, 88, 224, 207, 185, 43, 148, 199, 55, 206, 55, 53, 36, 83, 228, 15, 155, 240, 52, 139, 36, 169, 202, 140, 11, 148, 201, 100, 116, 5, 4, 93, 209, 255, 14, 104, 27, 30, 138, 224, 182, 136, 68, 27, 18, 127, 61, 231, 13, 79, 211, 129, 170, 83, 133, 121, 42, 201, 91, 161, 157, 93, 92, 228, 230, 85, 42, 72, 252, 142, 85, 49, 49, 90, 248, 105, 64, 101, 17, 183, 104, 71, 66, 88, 231, 243, 185, 127, 109, 96, 16, 144, 67, 137, 142, 51, 15, 176, 229, 195, 244, 121, 225, 235, 1, 47, 26, 187, 199, 29, 84, 42, 209, 192, 23, 24, 66, 139, 105, 59, 42, 98, 42, 59, 121, 42, 19, 252, 216, 83, 170, 15, 153, 227, 209, 242, 192, 84, 127, 225, 7, 106, 52, 122, 11, 197, 13, 114, 196, 194, 67, 217, 106, 201, 9, 33, 188, 44, 80, 156, 138, 13, 234, 189, 29, 240, 190, 247, 231, 194, 113, 145, 182, 63, 184, 81, 203, 88, 173, 43, 148, 126, 63, 55, 30, 179, 169, 8, 4, 211, 7, 73, 48, 152, 169, 65, 139, 239, 39, 42, 66, 67, 209, 4, 20, 102, 193, 58, 22, 155, 229, 248, 233, 99, 238, 62, 173, 71, 56, 43, 153, 129, 253, 161, 69, 87, 94, 50, 53, 1, 18, 167, 179, 253, 232, 5, 244, 180, 73, 202, 206, 199, 177, 156, 168, 144, 156, 112, 247, 187, 93, 121, 233, 149, 16, 80, 145, 67, 175, 57, 252, 185, 218, 56, 13, 0, 164, 160, 84, 19, 68, 168, 14, 89, 77, 225, 2, 14, 83, 124, 56, 55, 162, 229, 39, 196, 249, 27, 240, 90, 133, 241, 237, 79, 169, 233, 173, 143, 255, 36, 249, 166, 116, 116, 177, 216, 149, 224, 26, 64, 44, 177, 25, 5, 253, 13, 50, 65, 237, 15, 138, 43, 95, 108, 20, 129, 184, 138, 121, 110, 240, 91, 12, 102, 187, 183, 232, 196, 253, 140, 90, 174, 171, 9, 150, 159, 88, 97, 56, 227, 158, 92, 227, 209, 227, 137, 248, 248, 182, 167, 229, 110, 188, 85, 30, 74, 7, 72, 99, 106, 178, 181, 90, 248, 101, 59, 184, 64, 26, 188, 1, 76, 145, 191, 118, 78, 161, 90, 157, 108, 121, 235, 154, 90, 112, 236, 204, 226, 67, 193, 204, 136, 84, 224, 47, 165, 0, 44, 46, 226, 144, 113, 146, 133, 73, 73, 101, 61, 49, 183, 45, 136, 209, 10, 185, 207, 24, 241, 253, 134, 113, 248, 233, 113, 75, 161, 177, 2, 66, 216, 62, 176, 59, 4, 163, 90, 175, 96, 238, 243, 195, 62, 32, 61, 225, 75, 178, 126, 96, 109, 122, 231, 239, 180, 196, 203, 20, 193, 0, 203, 49, 146, 34, 127, 250, 192, 204, 89, 255, 86, 9, 155, 120, 161, 237, 64, 148, 50, 54, 120, 95, 190, 121, 93, 65, 125, 191, 202, 190, 16, 112, 191, 77, 28, 125, 90, 84, 128, 7, 218, 251, 177, 71, 144, 162, 60, 43, 217, 255, 49, 53, 101, 131, 42, 192, 64, 123, 188, 33, 217, 147, 248, 63, 75, 61, 69, 149, 248, 90, 112, 148, 132, 15, 114, 114, 66, 235, 198, 222, 166, 108, 140, 172, 248, 14, 252, 63, 158, 153, 145, 61, 115, 160, 194, 30, 202, 34, 18, 158, 139, 132, 175, 73, 77, 36, 10, 85, 156, 180, 44, 92, 245, 67, 124, 21, 55, 3, 181, 208, 16, 78, 144, 45, 150, 153, 171, 99, 203, 120, 102, 144, 205, 149, 16, 168, 245, 60, 67, 171, 105, 163, 74, 101, 197, 243, 77, 206, 187, 79, 125, 54, 232, 50, 99, 60, 209, 21, 224, 203, 240, 54, 5, 64, 190, 113, 52, 43, 114, 153, 57, 24, 246, 249, 67, 5, 116, 108, 167, 24, 152, 157, 145, 145, 184, 135, 9, 21, 19, 40, 208, 87, 254, 48, 249, 255, 162, 39, 75, 119, 20, 188, 245, 166, 23, 134, 69, 64, 7, 242, 184, 89, 17, 166, 36, 158, 76, 105, 235, 212, 75, 14, 179, 168, 51, 204, 42, 50, 187, 5, 118, 76, 173, 58, 155, 172, 195, 168, 44, 28, 129, 9, 188, 8, 114, 79, 57, 233, 150, 175, 36, 213, 59, 176, 207, 25, 10, 148, 80, 3, 116, 14, 120, 161, 233, 250, 36, 212, 116, 26, 203, 37, 129, 42, 24, 65, 190, 157, 65, 193, 132, 195, 181, 27, 125, 161, 237, 17, 53, 203, 32, 29, 134, 120, 218, 120, 84, 139, 39, 121, 244, 190, 167, 179, 165, 113, 169, 219, 31, 137, 86, 15, 43, 237, 99, 71, 43, 151, 167, 221, 182, 112, 157, 111, 40, 91, 133, 17, 87, 222, 83, 221, 39, 188, 149, 51, 45, 135, 104, 27, 148, 246, 248, 28, 160, 219, 125, 198, 41, 151, 206, 26, 167, 167, 94, 41, 105, 251, 4, 35, 251, 166, 1, 111, 156, 209, 126, 39, 93, 105, 234, 197, 64, 185, 177, 48, 182, 153, 99, 34, 27, 109, 126, 192, 183, 20, 117, 131, 209, 93, 37, 71, 96, 87, 4, 183, 52, 16, 4, 125, 12, 53, 9, 76, 104, 151, 170, 9, 186, 74, 152, 140, 173, 231, 52, 113, 11, 115, 6, 75, 62, 208, 192, 102, 71, 112, 204, 74, 206, 20, 82, 5, 153, 16, 194, 186, 179, 190, 170, 219, 251, 109, 24, 88, 223, 137, 185, 190, 217, 168, 80, 101, 210, 105, 223, 115, 124, 71, 91, 192, 48, 42, 206, 220, 14, 48, 3, 232, 99, 51, 247, 39, 146, 151, 148, 230, 92, 113, 123, 184, 124, 169, 55, 5, 249, 226, 156, 86, 81, 167, 144, 164, 169, 73, 241, 61, 56, 20, 247, 116, 172, 147, 170, 3, 6, 80, 189, 3, 220, 11, 62, 56, 129, 179, 145, 205, 91, 46, 65, 29, 114, 184, 208, 118, 239, 103, 33, 224, 177, 109, 150, 19, 19, 100, 136, 166, 97, 101, 168, 9, 7, 29, 143, 169, 93, 186, 76, 23, 3, 227, 93, 240, 235, 94, 195, 2, 46, 188, 75, 37, 252, 60, 62, 186, 250, 143, 133, 96, 127, 208, 127, 55, 176, 247, 232, 99, 196, 99, 197, 107, 162, 234, 47, 109, 27, 121, 66, 73, 160, 1, 52, 29, 72, 89, 252, 231, 65, 236, 250, 198, 186, 129, 21, 102, 98, 57, 20, 184, 221, 174, 48, 37, 11, 185, 123, 187, 102, 78, 92, 3, 69, 161, 222, 33, 150, 250, 117, 85, 118, 111, 4, 145, 242, 62, 255, 27, 48, 72, 87, 253, 32, 157, 130, 68, 63, 224, 223, 227, 29, 217, 177, 173, 61, 206, 34, 14, 205, 70, 161, 224, 28, 131, 197, 203, 105, 33, 178, 131, 144, 186, 147, 119, 167, 172, 7, 116, 52, 214, 52, 191, 16, 20, 138, 241, 150, 60, 17, 30, 90, 22, 144, 187, 227, 163, 134, 176, 66, 121, 14, 1, 232, 99, 93, 57, 25, 113, 177, 243, 126, 46, 49, 0, 67, 207, 198, 255, 38, 164, 52, 221, 52, 220, 90, 196, 191, 73, 33, 136, 99, 74, 195, 31, 231, 194, 199, 182, 140, 82, 157, 188, 8, 12, 81, 84, 107, 2, 2, 35, 89, 168, 58, 130, 16, 60, 88, 163, 212, 87, 132, 194, 194, 63, 187, 98, 243, 115, 64, 245, 175, 9, 218, 0, 32, 210, 197, 40, 166, 44, 15, 234, 238, 33, 153, 224, 250, 120, 51, 0, 227, 120, 219, 44, 30, 86, 64, 104, 234, 171, 137, 78, 125, 204, 253, 60, 134, 211, 218, 47, 15, 145, 50, 231, 108, 143, 126, 99, 80, 109, 242, 211, 146, 142, 83, 22, 234, 150, 48, 123, 227, 52, 208, 213, 137, 83, 217, 82, 43, 155, 212, 230, 162, 139, 107, 243, 220, 45, 253, 220, 250, 97, 103, 239, 54, 14, 22, 131, 74, 171, 99, 219, 98, 40, 216, 176, 158, 82, 250, 106, 254, 2, 99, 49, 56, 168, 119, 184, 140, 182, 116, 186, 29, 103, 223, 20, 9, 95, 6, 36, 28, 134, 90, 8, 57, 65, 158, 33, 238, 155, 61, 210, 236, 126, 109, 144, 252, 222, 44, 104, 106, 212, 140, 195, 31, 222, 141, 131, 55, 1, 160, 236, 52, 155, 170, 173, 154, 85, 238, 6, 154, 93, 244, 172, 20, 207, 3, 249, 143, 52, 22, 77, 100, 14, 227, 254, 35, 66, 27, 37, 222, 98, 7, 22, 145, 202, 214, 116, 214, 33, 222, 138, 32, 154, 51, 86, 104, 119, 28, 107, 68, 13, 217, 155, 196, 223, 205, 180, 94, 22, 149, 156, 167, 202, 45, 125, 37, 105, 207, 145, 26, 162, 155, 167, 7, 155, 51, 201, 3, 72, 182, 154, 209, 14, 197, 215, 140, 114, 186, 121, 172, 94, 77, 16, 142, 0, 103, 184, 23, 29, 55, 101, 211, 60, 229, 54, 78, 121, 246, 79, 212, 96, 239, 52, 182, 132, 42, 214, 208, 28, 48, 252, 79, 113, 145, 90, 110, 46, 145, 190, 80, 63, 166, 210, 77, 34, 111, 125, 51, 102, 10, 3, 194, 209, 9, 160, 15, 155, 36, 235, 142, 252, 125, 174, 44, 186, 78, 171, 54, 62, 14, 227, 191, 192, 234, 43, 84, 99, 96, 201, 1, 12, 101, 98, 237, 12, 249, 186, 148, 221, 17, 209, 11, 181, 148, 166, 177, 44, 162, 16, 85, 35, 214, 85, 114, 100, 249, 76, 82, 74, 70, 30, 146, 99, 230, 15, 157, 117, 154, 219, 131, 163, 193, 175, 216, 30, 147, 176, 224, 116, 82, 144, 224, 131, 249, 50, 247, 196, 237, 65, 178, 102, 105, 252, 20, 31, 166, 17, 217, 207, 140, 216, 254, 123, 59, 77, 17, 111, 98, 168, 210, 237, 76, 110, 107, 16, 100, 40, 46, 208, 81, 201, 160, 52, 137, 25, 180, 136, 37, 214, 173, 172, 95, 113, 210, 195, 95, 222, 172, 118, 119, 189, 98, 253, 123, 107, 18, 98, 111, 201, 224, 197, 109, 136, 150, 149, 5, 87, 124, 188, 37, 201, 73, 198, 26, 6, 62, 134, 188, 136, 206, 126, 101, 46, 234, 17, 202, 47, 135, 223, 57, 59, 53, 114, 38, 89, 31, 1, 76, 76, 238, 143, 11, 190, 30, 76, 230, 46, 162, 51, 0, 186, 207, 126, 107, 219, 156, 18, 104, 247, 158, 244, 145, 20, 84, 31, 68, 141, 55, 190, 221, 105, 102, 56, 81, 154, 125, 71, 123, 126, 236, 179, 81, 231, 220, 167, 119, 206, 115, 106, 59, 166, 166, 3, 137, 43, 56, 32, 5, 45, 215, 145, 162, 47, 148, 234, 114, 18, 3, 166, 248, 209, 117, 192, 103, 35, 83, 79, 19, 212, 230, 12, 128, 214, 142, 148, 173, 234, 212, 62, 78, 144, 8, 141, 63, 252, 255, 188, 27, 191, 132, 53, 215, 220, 19, 191, 75, 253, 145, 230, 122, 156, 115, 250, 73, 171, 210, 22, 233, 244, 91, 58, 47, 75, 68, 116, 182, 98, 182, 75, 66, 36, 159, 64, 205, 176, 102, 50, 237, 38, 107, 148, 58, 61, 64, 1, 249, 68, 75, 235, 104, 25, 228, 147, 233, 46, 25, 190, 118, 196, 34, 39, 1, 60, 201, 67, 77, 64, 9, 43, 0, 150, 41, 73, 57, 254, 211, 96, 93, 129, 231, 63, 12, 177, 106, 238, 70, 73, 87, 251, 7, 254, 51, 212, 34, 34, 137, 127, 209, 207, 70, 60, 68, 71, 74, 208, 119, 211, 153, 100, 173, 21, 178, 95, 113, 6, 103, 244, 204, 200, 141, 58, 156, 13, 21, 109, 169, 215, 206, 184, 10, 248, 214, 219, 2, 22, 108, 37, 247, 157, 102, 167, 253, 142, 139, 177, 62, 243, 59, 147, 69, 231, 150, 123, 177, 231, 224, 33, 29, 75, 184, 115, 143, 218, 4, 10, 125, 35, 50, 201, 143, 44, 175, 108, 206, 247, 152, 81, 249, 135, 221, 23, 132, 80, 104, 24, 6, 10, 208, 155, 97, 45, 9, 52, 29, 232, 152, 176, 75, 242, 241, 111, 128, 127, 144, 96, 159, 171, 73, 250, 52, 163, 43, 158, 232, 89, 227, 65, 219, 151, 153, 227, 61, 46, 232, 177, 170, 203, 237, 9, 253, 225, 222, 224, 200, 86, 146, 180, 104, 8, 15, 189, 184, 94, 177, 36, 57, 170, 206, 62, 47, 152, 67, 77, 106, 10, 26, 180, 44, 124, 175, 5, 81, 96, 215, 143, 142, 152, 61, 2, 81, 216, 66, 142, 216, 71, 8, 175, 245, 51, 144, 186, 166, 28, 230, 64, 159, 150, 90, 249, 65, 151, 10, 136, 91, 38, 146, 1, 243, 23, 141, 224, 125, 108, 4, 166, 186, 241, 55, 10, 202, 251, 230, 96, 252, 248, 197, 48, 29, 239, 129, 204, 184, 15, 10, 89, 130, 175, 144, 59, 155, 33, 171, 121, 32, 19, 252, 109, 220, 191, 115, 237, 37, 243, 233, 121, 122, 90, 250, 66, 142, 44, 35, 203, 218, 145, 243, 140, 28, 161, 213, 153, 231, 76, 138, 76, 251, 151, 7, 11, 64, 193, 73, 230, 191, 196, 153, 83, 5, 94, 107, 104, 1, 65, 203, 149, 153, 209, 76, 82, 60, 0, 21, 153, 63, 172, 119, 106, 223, 51, 212, 244, 144, 25, 25, 126, 216, 9, 93, 42, 46, 188, 134, 154, 195, 84, 46, 126, 128, 136, 111, 21, 90, 103, 219, 198, 39, 161, 53, 255, 151, 213, 105, 135, 115, 226, 94, 28, 48, 252, 80, 33, 60, 213, 206, 247, 191, 175, 195, 227, 118, 54, 185, 205, 195, 248, 11, 238, 202, 13, 236, 38, 182, 1, 1, 51, 111, 190, 234, 249, 87, 189, 234, 35, 148, 226, 72, 131, 77, 249, 214, 48, 36, 116, 58, 228, 77, 168, 222, 190, 115, 193, 157, 174, 213, 105, 120, 23, 98, 134, 22, 205, 150, 192, 202, 128, 65, 128, 85, 254, 99, 135, 227, 170, 80, 96, 234, 225, 173, 172, 156, 179, 234, 81, 185, 34, 227, 155, 41, 242, 244, 138, 148, 58, 255, 232, 63, 146, 184, 233, 157, 105, 206, 181, 53, 42, 165, 59, 77, 71, 206, 219, 169, 168, 246, 61, 114, 171, 147, 22, 101, 218, 92, 93, 58, 103, 80, 240, 152, 80, 137, 179, 181, 175, 203, 245, 111, 231, 4, 41, 158, 94, 224, 189, 172, 122, 97, 92, 93, 126, 47, 229, 239, 52, 225, 102, 38, 25, 61, 196, 121, 227, 94, 27, 148, 133, 61, 98, 247, 7, 82, 187, 159, 106, 74, 51, 245, 171, 42, 69, 188, 227, 34, 178, 136, 210, 137, 62, 86, 101, 8, 204, 106, 6, 234, 105, 133, 51, 69, 50, 164, 84, 182, 73, 94, 107, 10, 134, 19, 165, 111, 191, 145, 238, 0, 8, 188, 57, 123, 185, 132, 9, 169, 43, 215, 92, 74, 108, 176, 219, 88, 26, 227, 255, 172, 198, 175, 40, 106, 120, 227, 148, 24, 151, 195, 121, 182, 70, 177, 251, 105, 27, 168, 16, 142, 207, 176, 74, 47, 217, 161, 139, 28, 60, 228, 196, 246, 233, 249, 184, 212, 36, 196, 96, 125, 79, 197, 37, 17, 133, 251, 89, 226, 187, 232, 38, 238, 158, 183, 92, 96, 35, 3, 28, 247, 68, 111, 103, 174, 110, 81, 164, 146, 165, 195, 219, 114, 27, 207, 83, 255, 253, 126, 88, 242, 198, 111, 102, 218, 249, 114, 9, 153, 221, 223, 176, 188, 88, 17, 208, 46, 178, 238, 36, 253, 109, 224, 222, 79, 154, 125, 18, 200, 101, 116, 57, 1, 129, 97, 201, 151, 111, 183, 222, 140, 135, 114, 156, 95, 84, 178, 241, 159, 177, 112, 62, 25, 125, 115, 232, 102, 251, 62, 203, 14, 5, 150, 92, 99, 241, 219, 53, 250, 69, 48, 65, 141, 243, 130, 124, 225, 30, 176, 59, 17, 175, 145, 254, 49, 241, 235, 137, 226, 136, 42, 0, 251, 160, 205, 156, 192, 10, 9, 85, 55, 14, 59, 38, 172, 192, 24, 221, 66, 54, 237, 238, 147, 90, 228, 189, 22, 9, 220, 164, 100, 218, 76, 176, 128, 184, 136, 152, 252, 67, 162, 227, 119, 133, 5, 15, 108, 130, 165, 211, 24, 19, 34, 74, 234, 209, 206, 203, 5, 232, 5, 133, 92, 251, 111, 242, 81, 57, 100, 12, 116, 139, 189, 113, 167, 141, 181, 174, 47, 10, 105, 237, 10, 170, 195, 140, 245, 184, 206, 44, 7, 175, 182, 148, 159, 209, 239, 141, 192, 194, 7, 189, 225, 93, 37, 161, 90, 81, 167, 97, 32, 161, 12, 147, 110, 81, 128, 14, 78, 146, 252, 19, 252, 221, 57, 196, 233, 98, 192, 166, 49, 199, 150, 96, 30, 247, 169, 183, 252, 210, 201, 226, 23, 114, 193, 229, 123, 251, 93, 187, 191, 44, 195, 214, 222, 243, 9, 180, 215, 34, 89, 67, 220, 162, 195, 200, 67, 126, 247, 59, 142, 35, 82, 238, 128, 25, 51, 135, 152, 238, 100, 52, 59, 118, 152, 147, 111, 133, 138, 41, 196, 210, 24, 241, 10, 35, 73, 163, 94, 97, 181, 32, 144, 24, 172, 191, 205, 12, 25, 230, 108, 130, 138, 248, 164, 98, 141, 92, 99, 56, 180, 192, 55, 63, 70, 173, 164, 57, 26, 95, 135, 243, 255, 159, 211, 163, 47, 128, 71, 155, 98, 187, 81, 159, 191, 1, 55, 225, 241, 16, 174, 240, 168, 122, 37, 40, 97, 207, 157, 157, 176, 7, 252, 81, 133, 214, 128, 83, 249, 33, 72, 143, 4, 87, 8, 197, 231, 21, 222, 74, 138, 132, 149, 108, 102, 24, 221, 154, 83, 187, 80, 31, 7, 63, 116, 180, 169, 84, 202, 18, 188, 14, 118, 98, 166, 75, 244, 10, 1, 219, 79, 105, 163, 0, 249, 253, 96, 86, 201, 39, 97, 83, 83, 174, 48, 249, 73, 39, 191, 208, 168, 34, 67, 151, 254, 16, 18, 135, 92, 157, 224, 225, 41, 254, 45, 203, 41, 197, 216, 141, 15, 210, 33, 219, 67, 189, 220, 69, 50, 19, 79, 43, 75, 122, 1, 93, 44, 65, 197, 15, 29, 234, 39, 175, 233, 136, 5, 65, 123, 116, 109, 136, 63, 92, 59, 31, 158, 1, 40, 219, 158, 94, 39, 236, 207, 198, 124, 247, 209, 150, 168, 146, 27, 164, 80, 109, 251, 220, 101, 150, 29, 142, 44, 199, 71, 232, 27, 36, 118, 69, 230, 84, 26, 172, 252, 227, 46, 19, 35, 168, 239, 5, 15, 220, 128, 95, 212, 106, 205, 242, 56, 128, 9, 20, 28, 24, 33, 11, 177, 244, 110, 237, 131, 233, 183, 223, 121, 115, 90, 225, 223, 160, 83, 66, 136, 70, 58, 153, 13, 104, 136, 207, 39, 234, 129, 140, 247, 219, 176, 72, 120, 211, 185, 133, 118, 131, 212, 59, 186, 178, 199, 228, 54, 231, 97, 187, 224, 97, 237, 206, 215, 9, 22, 12, 12, 147, 21, 38, 165, 78, 149, 245, 145, 118, 103, 245, 129, 120, 5, 142, 49, 0, 211, 224, 239, 77, 114, 48, 172, 158, 171, 19, 224, 201, 82, 218, 78, 168, 91, 134, 15, 40, 187, 114, 42, 26, 8, 142, 211, 61, 233, 8, 155, 177, 147, 149, 232, 160, 1, 177, 135, 245, 144, 69, 22, 157, 156, 200, 109, 133, 201, 157, 212, 254, 134, 213, 191, 255, 101, 255, 20, 235, 105, 62, 221, 210, 159, 64, 246, 136, 181, 60, 41, 149, 129, 224, 46, 79, 173, 136, 105, 125, 192, 244, 16, 236, 172, 194, 247, 136, 160, 191, 219, 24, 101, 151, 204, 189, 254, 69, 160, 79, 84, 149, 43, 108, 90, 65, 16, 75, 49, 182, 29, 211, 188, 135, 145, 131, 108, 143, 97, 95, 38, 38, 244, 117, 92, 157, 91, 38, 118, 118, 134, 108, 123, 83, 215, 239, 228, 186, 45, 112, 202, 166, 127, 199, 80, 183, 251, 112, 113, 237, 49, 148, 92, 31, 54, 242, 208, 12, 47, 101, 74, 79, 19, 78, 122, 60, 125, 85, 133, 3, 52, 123, 236, 60, 62, 178, 101, 111, 91, 89, 228, 63, 62, 116, 53, 148, 71, 46, 153, 133, 244, 59, 87, 117, 171, 67, 182, 119, 3, 204, 215, 205, 128, 248, 11, 59, 34, 15, 115, 249, 177, 240, 198, 58, 52, 23, 101, 132, 118, 39, 181, 199, 49, 39, 98, 196, 23, 179, 199, 62, 65, 165, 246, 218, 161, 150, 163, 253, 94, 124, 215, 10, 245, 71, 135, 168, 59, 251, 229, 157, 39, 75, 179, 211, 83, 33, 172, 81, 2, 30, 222, 174, 66, 80, 11, 196, 187, 123, 255, 127, 187, 208, 236, 106, 88, 54, 93, 253, 37, 33, 155, 82, 26, 156, 57, 87, 148, 130, 44, 84, 207, 171, 200, 131, 82, 28, 61, 122, 155, 114, 160, 253, 29, 177, 50, 168, 100, 73, 18, 132, 92, 136, 67, 24, 156, 149, 164, 120, 109, 130, 170, 156, 164, 248, 104, 83, 152, 231, 211, 100, 78, 59, 170, 147, 101, 86, 254, 127, 143, 124, 178, 232, 35, 35, 243, 3, 220, 198, 182, 146, 71, 250, 50, 61, 152, 253, 101, 219, 219, 159, 58, 34, 239, 111, 144, 29, 8, 99, 24, 212, 123, 176, 171, 0, 132, 253, 35, 140, 166, 157, 68, 215, 217, 105, 78, 224, 18, 118, 216, 79, 227, 101, 59, 153, 27, 217, 243, 250, 193, 213, 100, 184, 69, 78, 229, 7, 144, 107, 5, 214, 223, 139, 123, 44, 140, 165, 131, 215, 65, 77, 181, 143, 101, 218, 198, 87, 47, 191, 10, 102, 231, 0, 239, 23, 128, 83, 11, 218, 62, 104, 185, 73, 211, 216, 40, 70, 231, 92, 187, 172, 255, 66, 159, 93, 156, 35, 172, 123, 2, 230, 123, 236, 241, 154, 88, 136, 179, 147, 174, 89, 50, 5, 158, 169, 128, 127, 215, 231, 82, 83, 159, 66, 241, 205, 103, 143, 20, 248, 239, 143, 31, 210, 249, 39, 25, 8, 8, 242, 111, 111, 188, 35, 190, 251, 17, 114, 164, 49, 24, 113, 159, 50, 115, 56, 190, 180, 91, 125, 237, 99, 116, 211, 36, 208, 115, 12, 73, 61, 99, 110, 81, 64, 83, 163, 131, 154, 211, 9, 165, 11, 30, 177, 177, 43, 241, 7, 108, 203, 224, 75, 25, 246, 160, 33, 148, 32, 131, 183, 190, 0, 219, 28, 208, 242, 134, 174, 91, 92, 51, 36, 240, 43, 139, 147, 101, 183, 51, 216, 249, 42, 166, 52, 133, 115, 249, 6, 240, 23, 27, 23, 77, 180, 40, 175, 240, 173, 104, 70, 137, 83, 82, 171, 155, 215, 136, 131, 4, 172, 19, 100, 255, 146, 160, 199, 128, 177, 130, 163, 56, 104, 107, 102, 44, 178, 196, 187, 0, 38, 53, 230, 191, 148, 218, 207, 105, 66, 106, 103, 52, 241, 119, 233, 63, 63, 182, 45, 101, 61, 210, 89, 175, 101, 98, 89, 172, 252, 236, 36, 54, 143, 131, 55, 35, 189, 128, 57, 73, 34, 229, 250, 206, 253, 43, 37, 53, 136, 172, 73, 221, 27, 205, 207, 21, 120, 92, 6, 220, 166, 66, 95, 45, 241, 209, 112, 72, 22, 31, 221, 232, 220, 157, 248, 78, 105, 214, 230, 41, 193, 211, 46, 249, 26, 11, 242, 42, 225, 116, 207, 166, 141, 116, 185, 223, 86, 218, 190, 255, 185, 250, 199, 181, 56, 188, 132, 37, 27, 85, 248, 112, 161, 182, 164, 153, 129, 40, 37, 13, 8, 67, 236, 36, 182, 151, 130, 96, 131, 65, 26, 103, 239, 65, 243, 234, 162, 7, 90, 237, 24, 99, 145, 47, 181, 99, 65, 38, 36, 112, 157, 239, 225, 127, 161, 168, 6, 66, 231, 252, 142, 154, 225, 138, 189, 243, 66, 142, 71, 61, 239, 55, 230, 59, 40, 224, 134, 104, 100, 189, 166, 249, 66, 91, 146, 154, 28, 67, 78, 138, 40, 114, 71, 172, 3, 168, 233, 9, 106, 228, 143, 56, 193, 227, 243, 144, 51, 222, 94, 224, 43, 79, 149, 212, 245, 52, 68, 200, 17, 235, 45, 164, 147, 62, 118, 52, 216, 195, 78, 13, 66, 190, 188, 241, 142, 234, 182, 85, 48, 148, 214, 123, 57, 223, 188, 229, 119, 169, 180, 193, 70, 250, 215, 249, 29, 88, 123, 88, 226, 210, 171, 170, 32, 80, 85, 3, 26, 219, 109, 97, 134, 11, 96, 118, 71, 130, 86, 182, 77, 116, 137, 214, 28, 140, 242, 227, 178, 167, 200, 214, 175, 107, 96, 132, 33, 40, 64, 93, 206, 90, 129, 132, 221, 170, 242, 113, 235, 251, 172, 193, 35, 58, 85, 70, 9, 75, 104, 71, 161, 99, 214, 6, 33, 204, 250, 172, 199, 33, 183, 246, 250, 109, 251, 50, 106, 114, 16, 134, 150, 19, 219, 21, 60, 63, 251, 204, 157, 45, 106, 233, 133, 154, 145, 135, 201, 77, 59, 178, 176, 217, 109, 236, 19, 19, 200, 5, 165, 235, 81, 14, 42, 153, 40, 189, 86, 92, 90, 239, 77, 53, 136, 65, 112, 94, 130, 104, 71, 55, 79, 22, 250, 34, 178, 14, 91, 24, 145, 250, 4, 197, 96, 72, 118, 142, 31, 83, 137, 14, 57, 115, 36, 202, 144, 10, 19, 123, 176, 23, 93, 35, 90, 145, 73, 163, 124, 66, 156, 8, 82, 243, 22, 204, 59, 77, 49, 222, 1, 246, 7, 75, 15, 234, 110, 9, 232, 29, 156, 239, 250, 88, 24, 244, 123, 15, 169, 66, 180, 254, 210, 233, 134, 27, 100, 162, 103, 158, 223, 149, 226, 167, 140, 53, 34, 57, 105, 221, 112, 116, 72, 207, 169, 98, 200, 189, 33, 72, 181, 162, 166, 4, 29, 98, 157, 184, 244, 188, 127, 186, 35, 186, 202, 24, 21, 185, 160, 63, 17, 112, 78, 96, 49, 87, 60, 154, 215, 49, 196, 179, 122, 60, 253, 154, 86, 177, 227, 70, 1, 80, 205, 58, 66, 103, 146, 170, 108, 34, 134, 149, 134, 160, 225, 152, 63, 18, 199, 101, 158, 199, 235, 124, 98, 105, 8, 62, 100, 92, 248, 81, 59, 108, 190, 156, 216, 106, 103, 90, 69, 199, 160, 21, 66, 203, 125, 157, 189, 8, 115, 15, 158, 77, 105, 124, 171, 180, 227, 134, 50, 208, 245, 254, 35, 231, 215, 231, 193, 218, 216, 68, 204, 229, 233, 95, 120, 177, 105, 108, 92, 9, 181, 119, 196, 19, 97, 5, 145, 254, 112, 156, 70, 9, 68, 39, 84, 33, 80, 2, 21, 228, 184, 145, 218, 19, 202, 231, 144, 3, 29, 22, 14, 146, 193, 90, 216, 63, 95, 197, 70, 198, 68, 235, 132, 16, 31, 100, 179, 19, 105, 19, 178, 210, 222, 118, 148, 37, 202, 50, 222, 84, 246, 89, 36, 25, 183, 80, 175, 79, 154, 38, 119, 89, 125, 133, 56, 21, 61, 187, 123, 80, 224, 187, 15, 84, 46, 19, 1, 24, 246, 250, 32, 226, 193, 49, 118, 252, 1, 47, 172, 161, 175, 60, 113, 56, 248, 198, 100, 117, 78, 138, 154, 40, 231, 118, 120, 23, 223, 8, 239, 145, 51, 43, 82, 146, 83, 129, 43, 146, 75, 171, 20, 186, 157, 174, 137, 205, 187, 198, 37, 10, 108, 65, 154, 212, 207, 63, 178, 11, 51, 5, 62, 172, 122, 219, 147, 16, 223, 243, 134, 146, 161, 173, 118, 113, 185, 212, 199, 29, 83, 5, 241, 42, 54, 160, 57, 100, 116, 111, 218, 193, 39, 66, 67, 141, 161, 179, 141, 54, 87, 16, 43, 15, 93, 41, 240, 62, 66, 231, 59, 42, 48, 46, 207, 141, 27, 160, 156, 247, 138, 129, 130, 68, 34, 66, 69, 177, 45, 108, 26, 36, 50, 109, 46, 238, 82, 187, 219, 166, 225, 115, 204, 121, 228, 122, 92, 65, 67, 69, 162, 104, 10, 117, 17, 33, 113, 110, 10, 9, 2, 41, 24, 227, 173, 49, 10, 2, 147, 115, 197, 93, 133, 139, 86, 38, 138, 102, 92, 17, 94, 115, 74, 101, 5, 12, 222, 186, 229, 16, 126, 16, 234, 105, 191, 184, 182, 27, 59, 152, 118, 179, 114, 78, 65, 15, 21, 43, 215, 7, 215, 110, 207, 152, 128, 14, 106, 188, 73, 230, 183, 23, 101, 92, 95, 250, 115, 245, 40, 58, 167, 157, 201, 1, 229, 233, 39, 243, 103, 253, 104, 135, 248, 219, 74, 127, 91, 135, 224, 240, 42, 6, 70, 70, 48, 23, 52, 78, 12, 212, 203, 55, 134, 108, 107, 185, 237, 129, 120, 234, 54, 243, 252, 231, 19, 190, 190, 46, 48, 115, 200, 145, 119, 195, 140, 122, 21, 85, 120, 189, 33, 208, 59, 39, 181, 57, 55, 128, 144, 149, 120, 65, 77, 113, 75, 203, 194, 251, 217, 77, 110, 56, 54, 93, 240, 101, 219, 52, 174, 163, 153, 193, 24, 16, 112, 103, 178, 252, 57, 2, 7, 55, 184, 80, 176, 248, 128, 236, 73, 250, 66, 218, 63, 16, 230, 149, 32, 149, 237, 199, 168, 81, 147, 63, 211, 251, 112, 223, 62, 92, 60, 114, 156, 203, 12, 225, 232, 250, 166, 123, 194, 227, 56, 82, 4, 104, 168, 170, 38, 93, 122, 232, 207, 228, 68, 58, 247, 162, 96, 128, 20, 249, 114, 93, 37, 199, 229, 152, 134, 168, 14, 212, 153, 137, 31, 241, 189, 163, 223, 247, 196, 22, 67, 27, 105, 10, 235, 28, 24, 177, 249, 230, 19, 247, 145, 228, 151, 195, 17, 201, 93, 226, 167, 76, 227, 85, 207, 200, 139, 37, 148, 40, 243, 214, 60, 55, 241, 183, 126, 160, 97, 6, 129, 104, 182, 207, 250, 77, 123, 235, 211, 158, 171, 52, 171, 186, 53, 121, 24, 137, 105, 164, 247, 172, 132, 201, 31, 135, 123, 0, 164, 164, 235, 167, 103, 63, 40, 54, 102, 46, 197, 185, 194, 14, 195, 159, 182, 120, 4, 36, 14, 194, 219, 155, 23, 233, 148, 169, 113, 158, 92, 103, 68, 247, 133, 214, 252, 9, 220, 50, 198, 251, 75, 34, 10, 115, 209, 172, 147, 168, 185, 81, 70, 174, 155, 80, 111, 246, 78, 199, 155, 192, 2, 241, 162, 123, 123, 77, 228, 101, 22, 241, 89, 245, 63, 3, 235, 76, 162, 20, 12, 81, 228, 254, 50, 146, 76, 149, 112, 226, 88, 231, 167, 229, 27, 250, 21, 98, 84, 235, 251, 213, 238, 209, 111, 34, 144, 181, 190, 22, 60, 112, 244, 98, 241, 19, 51, 163, 4, 198, 8, 50, 194, 200, 241, 155, 192, 97, 95, 173, 49, 94, 169, 112, 21, 87, 23, 229, 226, 75, 60, 134, 126, 21, 10, 86, 84, 238, 113, 19, 77, 205, 3, 158, 105, 241, 98, 86, 237, 233, 190, 97, 136, 202, 234, 147, 121, 253, 156, 176, 238, 222, 71, 35, 185, 127, 212, 211, 0, 86, 129, 131, 93, 111, 167, 121, 138, 69, 251, 4, 90, 229, 43, 48, 144, 138, 0, 48, 249, 202, 203, 46, 117, 175, 27, 96, 230, 119, 93, 156, 129, 186, 122, 133, 114, 160, 196, 50, 81, 97, 63, 13, 188, 146, 63, 4, 220, 222, 165, 9, 236, 124, 117, 145, 91, 244, 186, 233, 35, 78, 241, 45, 38, 127, 179, 165, 20, 253, 131, 171, 41, 230, 158, 162, 83, 50, 19, 23, 83, 128, 121, 67, 248, 17, 145, 98, 112, 190, 250, 237, 243, 248, 64, 146, 41, 16, 44, 154, 33, 60, 162, 161, 156, 229, 176, 172, 49, 42, 240, 235, 85, 90, 162, 151, 170, 183, 27, 21, 183, 40, 134, 187, 193, 75, 183, 76, 63, 235, 27, 90, 133, 26, 138, 83, 150, 77, 206, 233, 166, 204, 90, 125, 211, 133, 229, 10, 166, 12, 146, 184, 152, 107, 242, 245, 52, 145, 154, 34, 249, 13, 102, 253, 209, 20, 3, 225, 88, 156, 137, 30, 182, 206, 211, 255, 149, 39, 64, 133, 16, 125, 5, 115, 220, 51, 122, 242, 121, 222, 212, 239, 237, 208, 31, 72, 98, 36, 131, 185, 9, 124, 14, 55, 236, 196, 38, 68, 82, 17, 197, 255, 168, 199, 158, 94, 52, 58, 126, 100, 57, 118, 184, 214, 42, 65, 249, 156, 128, 82, 139, 234, 63, 119, 55, 89, 108, 207, 209, 226, 34, 198, 134, 54, 131, 154, 87, 96, 31, 11, 241, 1, 11, 97, 61, 167, 20, 223, 188, 163, 31, 250, 189, 13, 29, 196, 209, 218, 119, 102, 13, 172, 149, 149, 219, 251, 64, 238, 211, 212, 136, 82, 237, 150, 140, 188, 201, 123, 191, 83, 133, 193, 253, 25, 27, 246, 72, 60, 212, 227, 241, 209, 206, 142, 29, 11, 11, 146, 182, 203, 214, 25, 192, 236, 197, 176, 6, 216, 105, 145, 191, 115, 161, 107, 170, 194, 121, 148, 205, 65, 116, 157, 96, 173, 217, 30, 96, 174, 239, 178, 151, 121, 46, 3, 86, 65, 32, 120, 195, 66, 86, 144, 206, 91, 36, 148, 42, 216, 208, 164, 203, 149, 69, 230, 49, 78, 224, 177, 23, 175, 103, 191, 111, 181, 130, 255, 215, 189, 173, 134, 189, 64, 36, 226, 134, 89, 116, 138, 92, 81, 246, 202, 10, 243, 21, 81, 165, 210, 235, 49, 99, 217, 19, 184, 54, 71, 102, 132, 49, 135, 228, 156, 67, 170, 38, 173, 200, 239, 244, 255, 65, 211, 100, 161, 118, 111, 218, 219, 87, 23, 57, 9, 246, 102, 252, 157, 205, 98, 12, 97, 198, 183, 141, 223, 154, 23, 180, 123, 80, 156, 144, 231, 95, 42, 135, 31, 244, 164, 121, 138, 116, 154, 207, 222, 138, 32, 84, 185, 56, 114, 9, 244, 11, 213, 237, 166, 91, 31, 217, 20, 179, 168, 121, 139, 237, 181, 221, 90, 174, 2, 176, 34, 210, 130, 241, 130, 240, 178, 89, 176, 130, 185, 243, 52, 101, 116, 112, 6, 60, 84, 6, 110, 29, 246, 66, 10, 164, 130, 46, 75, 163, 179, 45, 250, 32, 57, 48, 74, 169, 133, 44, 167, 241, 103, 31, 119, 243, 74, 208, 4, 162, 17, 11, 72, 126, 10, 81, 117, 188, 103, 222, 163, 78, 206, 72, 216, 73, 2, 221, 230, 122, 107, 141, 126, 1, 236, 63, 51, 169, 160, 14, 165, 208, 174, 9, 91, 74, 252, 146, 198, 79, 238, 175, 39, 102, 75, 150, 40, 109, 143, 117, 77, 153, 234, 82, 38, 162, 23, 242, 107, 124, 217, 13, 51, 55, 92, 1, 28, 138, 62, 209, 69, 222, 63, 62, 150, 221, 74, 232, 220, 181, 21, 36, 203, 182, 193, 183, 173, 113, 157, 241, 208, 131, 172, 0, 176, 55, 229, 63, 54, 84, 197, 105, 196, 154, 60, 52, 50, 191, 230, 202, 129, 85, 235, 75, 245, 172, 58, 230, 0, 251, 250, 104, 123, 247, 224, 120, 118, 30, 50, 223, 144, 233, 243, 213, 58, 228, 124, 24, 168, 194, 24, 192, 4, 63, 107, 39, 55, 202, 196, 254, 149, 141, 189, 136, 218, 108, 203, 100, 198, 121, 240, 252, 208, 200, 230, 178, 117, 199, 2, 55, 165, 214, 210, 246, 142, 178, 63, 86, 249, 156, 100, 172, 202, 197, 148, 222, 76, 185, 221, 248, 71, 7, 231, 224, 158, 236, 27, 44, 53, 58, 181, 65, 176, 146, 223, 254, 5, 249, 207, 218, 160, 212, 245, 14, 114, 246, 153, 139, 55, 230, 89, 143, 125, 133, 103, 249, 123, 91, 229, 195, 214, 65, 251, 219, 11, 48, 167, 72, 9, 131, 110, 207, 244, 197, 159, 23, 51, 161, 135, 251, 220, 52, 242, 122, 199, 21, 231, 34, 185, 84, 140, 112, 3, 164, 231, 64, 162, 192, 103, 182, 162, 112, 2, 142, 22, 148, 62, 71, 79, 232, 85, 38, 15, 87, 230, 232, 112, 203, 94, 230, 172, 233, 219, 158, 246, 87, 61, 155, 22, 14, 157, 23, 61, 99, 196, 97, 70, 216, 173, 236, 211, 120, 197, 28, 231, 47, 215, 66, 71, 46, 66, 28, 29, 223, 77, 173, 144, 82, 220, 222, 99, 229, 74, 53, 88, 116, 123, 162, 240, 168, 216, 142, 205, 144, 183, 127, 135, 4, 162, 91, 176, 78, 26, 178, 249, 104, 195, 76, 105, 206, 143, 20, 158, 220, 22, 67, 201, 237, 78, 241, 56, 111, 63, 160, 240, 168, 131, 253, 62, 8, 51, 88, 43, 174, 217, 235, 243, 71, 50, 210, 7, 235, 56, 63, 128, 111, 32, 244, 187, 217, 170, 77, 152, 65, 7, 200, 30, 47, 83, 126, 139, 170, 142, 219, 184, 156, 54, 102, 249, 94, 32, 2, 204, 206, 77, 230, 60, 184, 143, 167, 110, 241, 203, 60, 44, 174, 128, 150, 186, 215, 218, 189, 87, 107, 216, 84, 76, 166, 171, 91, 23, 16, 208, 211, 181, 234, 61, 203, 224, 172, 128, 129, 66, 7, 249, 0, 75, 157, 235, 49, 244, 154, 157, 107, 205, 70, 146, 38, 188, 6, 218, 133, 231, 204, 168, 234, 133, 17, 245, 85, 253, 163, 242, 168, 56, 9, 99, 142, 236, 237, 67, 20, 226, 60, 4, 86, 83, 208, 243, 19, 127, 168, 6, 156, 67, 179, 66, 170, 242, 211, 170, 199, 188, 71, 231, 191, 67, 42, 109, 37, 117, 154, 231, 116, 63, 232, 206, 107, 141, 17, 127, 143, 79, 247, 160, 62, 151, 234, 116, 126, 14, 223, 8, 5, 52, 82, 8, 99, 17, 9, 7, 4, 208, 106, 11, 208, 156, 157, 85, 51, 236, 128, 41, 66, 99, 243, 220, 153, 131, 111, 78, 189, 95, 219, 51, 100, 41, 150, 188, 218, 35, 37, 176, 31, 122, 252, 207, 222, 214, 142, 95, 19, 136, 159, 195, 209, 39, 182, 19, 97, 185, 72, 83, 165, 208, 249, 83, 4, 244, 230, 30, 7, 13, 161, 90, 200, 121, 138, 67, 151, 252, 197, 165, 44, 215, 9, 81, 118, 179, 159, 15, 3, 156, 105, 151, 104, 109, 161, 202, 143, 199, 41, 187, 172, 154, 64, 105, 69, 67, 173, 226, 34, 234, 111, 69, 244, 45, 230, 49, 11, 18, 158, 56, 184, 55, 124, 46, 252, 215, 109, 236, 124, 156, 172, 148, 159, 44, 147, 129, 50, 49, 230, 128, 213, 137, 161, 125, 140, 222, 36, 90, 117, 223, 146, 237, 122, 39, 118, 188, 93, 11, 40, 49, 114, 230, 80, 31, 221, 58, 199, 174, 192, 112, 31, 236, 98, 56, 76, 27, 199, 78, 28, 48, 62, 246, 207, 30, 85, 50, 31, 4, 143, 58, 241, 131, 83, 203, 70, 241, 124, 150, 160, 88, 30, 227, 177, 213, 75, 139, 122, 83, 83, 41, 97, 140, 78, 157, 188, 172, 85, 52, 202, 76, 47, 145, 76, 126, 144, 228, 49, 239, 103, 196, 149, 203, 133, 159, 201, 215, 241, 71, 245, 114, 49, 125, 228, 22, 192, 235, 230, 246, 247, 100, 110, 76, 74, 214, 226, 221, 120, 140, 250, 108, 9, 203, 40, 92, 19, 184, 136, 86, 76, 250, 177, 64, 76, 214, 79, 190, 86, 8, 131, 178, 0, 200, 171, 245, 144, 94, 2, 236, 11, 187, 119, 165, 83, 130, 252, 49, 126, 254, 131, 38, 43, 245, 170, 53, 7, 183, 205, 84, 71, 16, 127, 86, 249, 31, 169, 65, 33, 207, 146, 111, 155, 43, 145, 85, 250, 216, 38, 95, 18, 129, 186, 14, 3, 158, 43, 183, 44, 205, 90, 37, 141, 27, 130, 115, 4, 121, 67, 113, 43, 109, 251, 71, 103, 32, 129, 163, 73, 116, 252, 32, 149, 17, 150, 117, 168, 218, 56, 163, 173, 125, 84, 103, 136, 195, 89, 46, 27, 45, 153, 6, 184, 81, 93, 131, 28, 42, 171, 87, 177, 135, 109, 24, 78, 80, 103, 110, 168, 3, 251, 165, 139, 171, 25, 77, 166, 250, 193, 166, 168, 195, 160, 12, 25, 110, 36, 0, 132, 247, 199, 195, 30, 177, 14, 176, 197, 58, 142, 93, 43, 151, 126, 28, 184, 231, 179, 113, 227, 26, 165, 98, 180, 183, 218, 182, 150, 125, 231, 102, 231, 206, 39, 57, 121, 193, 43, 11, 254, 173, 29, 251, 45, 171, 106, 87, 114, 38, 58, 153, 72, 84, 193, 36, 2, 142, 215, 121, 147, 160, 11, 37, 243, 213, 217, 181, 152, 112, 191, 155, 217, 136, 117, 175, 182, 125, 134, 218, 58, 212, 239, 39, 250, 119, 220, 113, 214, 143, 204, 124, 11, 153, 200, 158, 215, 253, 40, 35, 17, 232, 45, 217, 47, 191, 159, 199, 82, 41, 106, 158, 244, 222, 254, 133, 109, 151, 43, 187, 203, 165, 61, 163, 205, 7, 217, 12, 252, 123, 90, 255, 255, 88, 221, 122, 76, 173, 185, 85, 185, 33, 228, 226, 161, 72, 217, 34, 197, 140, 190, 18, 7, 142, 177, 203, 49, 93, 91, 12, 12, 29, 35, 100, 136, 58, 22, 174, 49, 71, 209, 218, 199, 125, 51, 110, 117, 45, 205, 141, 81, 192, 148, 211, 238, 218, 84, 227, 191, 160, 49, 110, 207, 190, 8, 156, 184, 167, 148, 228, 69, 19, 39, 3, 210, 204, 196, 230, 123, 64, 123, 133, 115, 33, 85, 15, 45, 144, 218, 31, 192, 34, 60, 208, 166, 113, 151, 122, 249, 171, 207, 8, 164, 207, 138, 246, 217, 251, 34, 27, 145, 144, 57, 60, 165, 203, 117, 199, 80, 141, 218, 36, 65, 24, 115, 33, 152, 139, 152, 34, 72, 99, 192, 219, 49, 65, 187, 217, 14, 208, 56, 62, 143, 12, 51, 225, 187, 38, 19, 114, 83, 118, 117, 17, 249, 224, 185, 225, 237, 71, 79, 67, 75, 51, 0, 92, 123, 155, 122, 154, 105, 101, 235, 17, 160, 35, 152, 108, 45, 151, 154, 92, 149, 63, 255, 77, 153, 104, 98, 208, 251, 112, 189, 38, 102, 205, 117, 255, 232, 150, 109, 51, 70, 5, 11, 224, 41, 141, 200, 227, 170, 1, 220, 34, 103, 112, 185, 169, 207, 141, 183, 172, 61, 129, 113, 126, 200, 59, 197, 93, 245, 240, 58, 232, 40, 90, 125, 37, 134, 210, 82, 118, 234, 200, 115, 169, 124, 188, 1, 172, 236, 31, 79, 211, 213, 146, 195, 206, 105, 57, 241, 59, 237, 145, 32, 6, 24, 253, 23, 60, 211, 2, 94, 42, 190, 180, 213, 177, 23, 167, 104, 3, 226, 171, 208, 95, 96, 57, 53, 141, 115, 88, 174, 10, 206, 234, 150, 182, 157, 242, 93, 97, 80, 9, 154, 152, 166, 94, 141, 238, 212, 68, 231, 244, 0, 36, 167, 2, 9, 169, 16, 151, 170, 33, 51, 1, 105, 210, 194, 224, 146, 221, 227, 137, 63, 144, 14, 5, 140, 30, 193, 203, 47, 90, 20, 233, 169, 66, 192, 91, 252, 161, 140, 67, 202, 12, 24, 190, 242, 46, 208, 121, 8, 194, 164, 164, 125, 216, 194, 242, 125, 131, 35, 5, 45, 18, 152, 157, 240, 35, 56, 246, 144, 175, 2, 7, 123, 13, 158, 168, 115, 221, 195, 54, 236, 35, 132, 246, 7, 100, 108, 120, 17, 23, 210, 61, 238, 38, 73, 149, 28, 249, 29, 5, 232, 28, 131, 84, 79, 155, 26, 82, 96, 150, 219, 122, 167, 231, 56, 233, 176, 154, 213, 126, 14, 155, 13, 68, 157, 25, 236, 244, 64, 125, 74, 247, 241, 123, 177, 102, 43, 244, 122, 173, 75, 132, 244, 248, 236, 246, 161, 138, 68, 86, 2, 52, 121, 232, 96, 100, 207, 238, 219, 64, 197, 162, 8, 97, 144, 89, 121, 66, 146, 166, 233, 7, 145, 217, 223, 51, 254, 128, 1, 211, 1, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 10, 99, 108, 101, 97, 114, 116, 111, 109, 97, 114, 107, 10, 128, 3};
diff --git a/source/blender/editors/datafiles/add.png.c b/source/blender/editors/datafiles/add.png.c
index 14492cfac24..c8c54411f20 100644
--- a/source/blender/editors/datafiles/add.png.c
+++ b/source/blender/editors/datafiles/add.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/add.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <add_png> */
int datatoc_add_png_size= 10948;
diff --git a/source/blender/editors/datafiles/bfont.ttf.c b/source/blender/editors/datafiles/bfont.ttf.c
index a52d6ded28a..3ebd06a47df 100644
--- a/source/blender/editors/datafiles/bfont.ttf.c
+++ b/source/blender/editors/datafiles/bfont.ttf.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/bfont.ttf.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <bfont_ttf> */
int datatoc_bfont_ttf_size= 191532;
diff --git a/source/blender/editors/datafiles/blenderbuttons.c b/source/blender/editors/datafiles/blenderbuttons.c
index 27f5dd23d5a..7525015bca9 100644
--- a/source/blender/editors/datafiles/blenderbuttons.c
+++ b/source/blender/editors/datafiles/blenderbuttons.c
@@ -1,6579 +1,6582 @@
+/** \file blender/editors/datafiles/blenderbuttons.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <blenderbuttons> */
-int datatoc_blenderbuttons_size= 210319;
+int datatoc_blenderbuttons_size= 210335;
char datatoc_blenderbuttons[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68,
- 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,214,163, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,
-104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,
-136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4,
- 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,
-188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,
-196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,
-120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,
-122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,
-128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48,
- 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133,
- 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185,
- 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129,
- 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34,
- 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94,
- 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,
-196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,
-224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227,
- 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62,
- 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,
-119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,
-176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96,
- 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250,
- 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4,
- 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,
-200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143,
- 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,
-195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192,
- 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,
-147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137,
- 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178,
- 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,
-106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,
-135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,
-151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,
-152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149,
- 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,
-150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79,
- 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,
-187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231,
- 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,
-235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,
-167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,
-121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60,
- 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,
-227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,
-205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228,
- 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147,
- 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,
-195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,
-238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,
-131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,
-194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,
-149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246,
- 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,
-255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237,
- 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,
-232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,
-223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,
-204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200,
- 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,
-119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121,
- 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,
-144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,
-172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,
-179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,
-219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,
-202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,
-138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,
-230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,
-131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,
-209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,
-174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,
-143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247,
- 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,
-204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,
-149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,
-206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,
-185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,
-111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,
-213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,
-203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,
-126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120,
- 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147,
- 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0,
- 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1, 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 9, 30,
- 17, 28, 2,215, 58, 34, 2, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236, 93,119,120, 20,213,226, 61, 51, 59,179,187,217,146, 77,
- 35, 61,144, 66, 9, 96, 0, 67, 81,130, 84, 65, 80,140,138, 10, 86,132,167,207,103,197,134, 5, 84, 68, 68, 32, 54, 64,240, 39,
-242,208,167,128,160,128, 5, 4,164, 68, 74,232, 29,233, 9,144, 4, 18, 66, 58,201, 38,219,203,220,223, 31,217, 89, 55,203,182,
- 64, 98,129,123,190,111,190,221,157,157, 57,115,239,157,123,239,156, 57,183, 1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
- 20, 20, 20, 20, 20, 20,215, 52, 86,175, 94, 77,154,112,248,144, 64, 57, 29,219,128,191, 59,103, 11,198,157, 52, 35,231, 0, 7,
-231,187,255,144,112, 14,248,187,114,138,241,109, 2,239,144,166,228,163,230, 74, 79,151,112,146,230, 14,103, 75,113, 54, 87, 57,
-242, 16, 78,210, 2,247,253,221,127, 72, 56, 7,252,221, 56,221,243, 79,128,188, 77,226, 12, 48, 79, 53, 53,156,164,185,195,217,
- 82,156, 87, 91,142,124,132,147, 92,109, 94,242,114,239,223,197,117, 4,174, 5, 69, 86,192,200,204,204,100, 92,248,153,191, 43,
-167,107, 58,136,252,205, 25,214,102,196,150,230,230,116, 75,207,230,194,187,153,153,153,204,234,213,171,183, 2, 24,208,156,113,
-111,142,251,238, 22,215,102,225,189, 2,145,213, 36,206,230,202,247, 45,205,217, 92,101,201,157,179, 57,242,189,167,251,222,130,
-247,168,185,194,217, 44,101,169, 37,242,188,135,252,115,213,188,238,156,205, 81,150,220, 57,155, 35,223,255, 25,156,205, 81,150,
- 60,113, 54, 71,190,247,118,239,175, 55,131,138,253,139, 5,129,123, 1, 31,248,119, 22, 68, 45, 37, 54,155,224,192,252,229,156,
-205,124,143,222,117,112, 54,231,219,205,192,230,186, 71, 45,145,223, 93, 57,155,139,223,157,167, 57,238,147, 39,206,171, 13,175,
-151,112, 54,123,220,175, 54,223,255, 89,156,205,124,143,154,165, 44,185,113, 14,108,230,151,129,129, 46,191,223,109, 78,206,230,
- 42, 75, 30,194,121,213,247,201, 19,231,213,134,215, 75, 56,155, 61,238,205,241, 12,105, 41,222,107, 26, 45,213,124,214,220,156,
- 77,228,190,166, 56,155,216, 60, 51,164, 5,238,253, 95, 26,206,230,228,116, 15, 99,115, 54,247,180,100, 56,155,147,179, 9, 97,
-189,230, 56,255,105,247,253,239,152,158,222,248,174,166, 89,202,155, 59,218, 18,225,108, 78,206, 0,185,175, 9,206,171,184,247,
-215, 28,184,191, 75, 64,196,132,111,230, 55, 19, 52,179, 3,211,146,194,181, 57,195, 57,176, 37, 28,194, 22, 64,179,135,211,241,
-166, 60,185, 5,226,254, 79, 73, 83, 90,150,104, 89,250,219,149, 37,183, 60, 57,176, 25,157,162,102,117,158,221, 57,155,227, 26,
-174, 28,205,149, 71, 91, 58,238,205, 89,150, 90,226,222, 83, 92,133, 11, 65, 57, 41, 39,229,164,156,148,147,114, 82,206,235,150,
-243,154, 4, 75,147,128,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,226, 31, 5,175,237,187,113,113,113,171,
-149, 74,101, 59,111,255,235,116,186,139, 23, 47, 94, 28, 68,147,240,175, 3,189, 71, 20,255, 32,176,248,195, 65, 23, 0, 16,199,
- 70, 65, 65, 65,113, 77,195,107,103,120,185, 92,158,114,242,228,201, 14,130, 32,192,110,183,195,102,179, 57, 63,205,102, 51,250,
-247,239,223,228,142,244,209,209,209, 57, 18,137, 36,169, 41,231,216,237,246,243,101,101,101,125,125, 28,178, 19, 64, 10,195,252,
-161, 25,197,239,222, 62, 1,148, 88,173,214,238,190, 56, 25,134, 73,113,231,243,194, 37,126,247,201, 25, 18, 18,178,159,227,184,
- 4, 79, 92,222,190, 11,130,144, 95, 81, 81,209,231,207,188, 71,215, 51,162,163,163,115, 56,142,107,114,254, 44, 45, 45,245,154,
- 63, 99, 99, 99, 15,177, 44, 27,215, 4, 74,137, 32, 8,185, 23, 47, 94,236,235, 67,136,236, 4,144,226,243, 13,202, 45, 63, 49,
- 12, 83,108,183,219,123,250, 43, 71,190,184, 60,228, 81,127,156, 78,145,197,113, 92, 86, 84, 84,212, 51,122,189,222, 8,128, 72,
- 36, 18,226, 18, 54, 0,128,205,102,171,168,169,169,233, 66,115, 34, 5, 5,197,117, 33,180, 4, 65, 96, 77, 38, 19,242,242,242,
- 64,136,199,250,222,126, 5,215,235,112,224,183,141, 81,193, 81,209,176, 89, 44, 80,181,138,116,114,151,157, 56, 6,155,213, 2,
-155,217,140, 54,189,122,139, 97, 64,231,206,157, 37,126, 56, 19, 62,248,224,131,168,224,224, 96, 24,141, 70, 24,141, 70,152, 76,
- 38, 24,141, 70,152,205,102,152,205,102, 88, 44, 22, 88, 44, 22,216,108, 54,152, 76, 38,100,103,103,219,173, 86,171, 79,206,105,
-211,166, 69,105, 52, 26, 39,159,184,137,156, 34,175,213,106,133,209,104,196,166, 77,155,124,114,114, 28,151, 80, 82, 82, 18, 37,
-149, 74, 65, 8,129, 32, 8, 32,132, 52,218,220,209,182,109, 91,139,175, 64,182,208, 61,186,158,209, 97,218,210, 53, 81, 33, 10,
- 57,108,130,128,204,110,109,157,127,228,127,185, 28,196,102,135, 96,179,161,253,243,163,157,251, 59,117,234,228, 51,127, 18, 66,
- 18,167, 45, 93, 19, 26, 40,103, 85, 85,149,161, 99,199,142, 37,104,112,155,189, 9,173, 4,131,193, 16,229,224,191, 76, 16,177,
- 44,219,104, 91,191,126, 61, 50, 51, 51,253,197, 61,225,229,151, 95,142,178, 90,173, 48,155,205, 48,153, 76,176, 90,173,176,217,
-108,206,205,110,183, 59, 55,179,217,140, 61,123,246, 4,234,100,125,112,219,109,183, 61,190,102,205, 26,213,207, 63,255,172, 74,
- 74, 74,130, 84, 42,133, 68, 34,129, 68, 34, 1,203,178,224, 56, 14, 55,223,124, 51, 67,179, 32, 5, 5,197,117, 35,180, 76, 38,
- 83, 65,122,122, 58,113,124,143,151,203,229, 82,183,183,220,184,246,237,219,231,186,159,231,175,185, 42, 56, 42, 26, 19, 91,135,
- 3, 0,222, 57, 87,229,124, 64,124,216,231, 70,231, 49,239, 93,168, 5, 0, 40, 20, 10, 48,174,175,209, 94,160, 82,169,112,219,
-109,183, 65, 38,147,161,103,207,158,224,121,222,227, 38,149, 74,193,243,188,223, 68, 97, 24, 6,106,181, 26, 83,166, 76, 17, 69,
- 18, 84, 65,114,140,235,211, 19, 65, 32,248,239,177,211, 48, 11, 4, 28,199, 57,183, 64, 56,165, 82, 41,142, 30, 61, 10,142,227,
- 32,145, 72,156,159,226,247, 85,171, 86, 97,228,200,145,224, 56, 14, 10,133, 2,240, 51,115,176,235, 61, 50,155,205,177, 50,153,
-204, 2, 64, 20,103, 82,134, 97, 98,174,228, 30, 93,207, 8, 81,200, 49,102,222, 79, 0,128,162, 89,207, 59,239,221,158,103,223,
-113, 30,147,248,159, 7,192, 48, 12,120,158, 7,203,178,205,198, 89, 93, 93,109,120,232,161,135,182, 7, 7, 7,175,215,106,181,
-240, 35,224, 80, 84, 84, 4,142,227,188,230,119,150,101, 49,115,230, 76,156, 57,115, 38,160,184, 27,141, 70, 44, 88,176, 0,118,
-187,189, 17,175,248,221,125, 95,128, 34,235,253,161, 67,135,142, 94,179,102, 77, 24,195, 48,248,236,179,207, 32,149, 74, 49,124,
-248,112, 68, 68, 68, 96,195,134, 13,144, 74,165,120,253,245,215,105,230,163,160,160,240, 85,231,241, 0,110, 4, 16,233, 48, 17,
-234, 0,132,186, 28, 82,225,248,140, 20,127, 51, 12,179,207, 3, 79, 47,199, 49, 21, 12,195,236,115,249,109, 6, 32,243,176,191,
- 10,128,194,177,153,208,224,254,167,185, 92, 71, 60, 15,222,174,203, 1, 13,235, 15, 1,216, 2, 96, 96,102,102,230, 86, 0, 40,
- 45, 45,189,163,180,180, 20, 0,144,146,146,114, 50, 55, 55,183,163,168,121, 28,205, 83, 82,155,205,214, 65,108,170, 18,221,162,
- 33, 67,134,248,124,195,183, 89, 44,151, 9, 16, 79, 90,202, 83,115,133, 55, 1, 99,177, 88,240,192, 3, 15, 0,128,215,135,142,
-235, 22,128,118,131,217,108, 6,199,113, 72,109, 29,137, 73,195,210,113, 19,177, 66, 87,207,192, 86,171,195, 61,106, 43, 78,118,
-238,142,249,231, 43,112, 78, 91, 15,142,227, 2,226, 20, 4,193,171,200,146, 72, 36,152, 55,111, 30, 30,122,232, 33, 72, 36,146,
-128,248, 92,239, 81,114,114,242,154,220,220,220, 8,134, 97, 76,142,123, 36,183,217,108, 26,155,205, 22, 97,183,219, 35,154,114,
-143,174,103,216, 4,193, 99, 62,244,150,103, 3,185, 79,129,112, 86, 87, 87, 27, 50, 51, 51,119,203,229,242,133,209,209,209, 37,
-197,197,197,126,133,150,187,248,113,127,169,248,228,147, 79, 48,103,206, 28, 12, 26, 52, 40,160,112,154, 76, 38, 48, 12,131,249,
-243,231, 95,246,223,212,169, 83, 47,187,158, 31, 78, 6, 0, 27, 23, 23,247,236,186,117,235, 52,226,177,173, 90,181, 2,207,243,
-232,210,165, 11,130,131,131,177,125,251,118,216,237,246,128,203, 37, 5, 5,197,181, 11, 79, 90,196, 5,253, 39, 78,156,216, 51,
- 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106,151, 58, 49,211, 81,191,174, 22,127, 19, 66,122,185,138, 30,135,
- 88,139,100, 24,102,181,120,188,235,111,241,147, 16, 50, 4,128, 76,252, 61,113,226,196,180,172,172,172,233, 19, 38, 76,120,115,
-198,140, 25,210,137, 19, 39,118,205,202,202,154, 46, 94,199, 83, 56, 60, 57, 90, 62,215,158, 18,155,168, 78,157, 58,229,173,137,
-202,245, 1,224,179,182, 84,181,138,116, 58, 89,239, 37, 70, 56,247, 79, 41,174,113, 62,192,230,246,104, 7,149, 74,133, 97,239,
-125, 20,144, 83,100, 54,155, 81, 94, 94,238,116, 25,252,109,129,114, 42, 21, 65,200,126,185, 11,138,170,100,120,119, 87, 53,214,
- 28, 62, 3,158,231,113,123,231, 46,184, 67, 26,140,183, 19,101,120,249,116, 33,172, 36,176, 62,189,132, 16,143, 2, 75,252, 46,
- 54,161, 4, 42,180,220,238, 81,145,209,104,172,202,203,203, 51, 8, 13, 15,118, 5, 33, 36,140, 97,152, 58,135,203, 21, 27,232,
- 61,186,158,145,217,173,173,211,117,218, 19, 60,216,185,127,164,238,168,243,158,140,159,247, 33, 0, 96, 80,247,155,253,150,135,
- 64, 56,171,170,170, 12,125, 7, 15,220,106, 55,152,191, 25, 61,122,116,193,230,205,155, 21,129,132,213,147,208, 18, 93, 91, 81,
-100,113, 28, 7,179,217, 28, 80,220,205,102,179,215,242, 33,149, 74,175,196,209,130, 78,167, 51,175, 92,185, 18,115,231,206, 69,
- 68, 68, 4,134, 14, 29,138,216,216, 88, 44, 95,190, 28,132, 16, 60,255,252,243, 80, 40, 20,162,123, 77, 51, 32, 5,197,245, 13,
- 95, 90, 68,158,149,149, 53,221, 93,200,184,254,118, 21, 80,110, 98,202, 85,172,165,249,121,254,175,118, 23, 79,226,117, 25,134,
- 89, 61, 99,198,140, 76, 63,225,168,240, 38,180,124, 78,137,111, 50,153, 10,186,117,235, 22,144,154,208,235,245,165,254,196,134,
-167,183,122, 87,151, 64,173, 86, 67,165, 81,131, 13,176,222,181, 90,173, 78,161,178,113,227, 70, 40, 20, 10, 12, 31, 62,252,170,
- 28, 45,139,197, 2,153,148, 7,219, 42, 26, 99,102,109, 70, 85,157,193,249,128,217,146, 95,128,131,101,229,120, 57, 99, 48, 84,
-138,114,212,155,205, 1, 57,111,130, 32, 92, 38,178, 56,142,195, 3, 15, 60,224,116, 19, 92,251,173,192, 71,211, 97, 68, 68,196,
-126,142,227, 18, 92,238, 81, 80, 74, 74, 10,240, 71,191, 30, 70, 16,132,250,208,208,208, 31, 1,196, 17, 66, 18, 0, 4, 7,114,
-143, 40, 60,231, 79,247,253,130,155, 83,117, 37,156, 85, 85, 85,134,204,204,204,221,118,131,249,155, 11, 23, 46,236, 6, 16,116,
-211, 77, 55, 53, 89,104,137, 2,139,231,121,204,156, 57, 19,115,230,204,113,254, 31,168,208,178,217,108,141, 4,212,233,211,167,
- 27, 93,203, 93,216,249,105, 54, 37,104, 24, 93, 40,164,164,164, 56,207,137,137,137, 65,104,104, 40, 4, 65,128, 32, 8, 8, 10,
- 10,130, 66,161,128, 84, 42,165,153,142,130,130,194,151, 22, 49, 76,152, 48,225, 77,134, 97, 86, 59,156,165, 99, 62, 4,149, 39,
-237,209,203, 77,172, 85,120, 57, 46,211,147,216,114,253, 46, 98,226,196,137,105,238,225,240,212, 92,233,172, 85,221,166,221,111,
- 4,215, 38,170,230,122,136,249,122,144,169, 67, 53, 80,168, 84,144, 72, 88, 48, 12, 67,252,113, 89, 44, 22,103,197,255,204, 51,
-207,248,236,183, 18,104,127, 42,139,197, 2,150,147,224, 98, 76, 50,236,236, 54,231,185,226,198,114, 60,206,197,116,132,228,212,
- 33,240, 1, 62,112,221, 29,173,231,159,127, 30, 11, 22, 44, 0,203,178,206, 52,225, 56, 14,237,219,183, 71, 65, 65,129, 79, 46,
-142,227, 18,206,157, 59, 23,229,154,142,162,136, 37,132,192,110,183,163,109,219,182,198,188,188,188, 23,105,209,189, 58,145,229,
-109,191,221, 46, 4,236,194,120, 58,174,170,170,202, 48,106,212,168,173,181,181,181,223,220,112,195, 13,167,209,120, 10, 4,191,
-124, 28,199, 53, 18, 88,162,200,250,244,211, 79, 27,137, 34,171,213, 26,208,139,128,213,106,189, 76,240,124,252,241,199,141, 62,
- 1,160, 79,159, 62, 1, 57,195, 0, 8,203,178, 68, 42,149,226,182,219,110, 67,215,174, 93,241,243,207, 63, 67, 16, 4, 60,247,
-220,115, 80, 40, 20,152, 61,123, 54,108, 54, 27, 62,248,224, 3,234,104, 81, 80, 80,248,210, 34,166, 25, 51,102, 28,155, 49, 99,
-134,211, 89,114,119,180,188, 60,119,239,116,136,170, 72, 81,164, 1, 48,121, 18, 68,158, 92, 50,119, 1,230,186, 47, 43, 43,107,
-186,123, 56,220,155, 43, 27, 9,173, 63, 11,165,199,143,226,163, 91,210, 1, 52,110, 46,156,119,115, 71,168,212, 42,168,130,213,
- 24,181,106, 27, 0, 56, 42,253, 9, 1, 57, 90,162,208,170,170,170,242, 41,178,154,226,104,177, 50, 14, 43, 18, 46,129,200,120,
-112,102,107, 35,161, 37,225,120, 20, 69, 36,131,229,165,224,236,182,128, 56, 9, 33,151, 53, 21,142, 29, 59, 22, 12,195, 56, 71,
-136,117,235,214,205,149,139,241,247,112,124, 45,188,161, 15,158,123,115,236, 7,149, 70, 90, 98,175, 36,127,238,255, 18, 39,127,
-120, 22, 0,208, 87,167,115,222,139,105,221,254, 24, 59, 48,235,232, 86,167,251,248, 30, 94,189, 34,206,170,170, 42,195, 77,157,
-210,118, 75,195, 67,190, 57,127,254,252,110, 0,236,131, 15, 62, 24,218,173, 91,183,128,202,164, 56,184,194, 93,100,185, 58, 89,
-226,167,159, 17,182, 46,194,209, 30,144,128, 18,155, 17, 3,200,243, 68,204,219, 26,141, 6,106,181,218, 57,226, 54, 40, 40, 8,
- 74,165,210,217,191, 51, 64,225, 70, 65, 65,113,253, 34, 76, 20, 58, 14,177,212,200,105,114,244,173,202,116,253,237,201,241,114,
- 56, 80, 57,126,234,215, 53, 14,129,230, 17,162,179,230,118,206,106,111, 34,141, 19, 21,164,235,103, 76, 76,204,175,106,181, 58,
- 57,208,216, 55,101, 20,155,221,106,185,204,217, 98, 24, 6,234, 96, 53, 20,106, 21, 20,193,106,175,174,151, 47,161, 37, 58, 69,
-226, 67,103,225,194,133, 80,171,213,248,215,191,254,213,228, 62, 90, 78,161, 37,101,177, 65,190, 9, 18, 25,215, 72,100,113, 28,
- 7, 9,207,163, 84, 29, 11,150,231,193,217, 2,115,201,106,107,107,193,113, 28, 38, 77,154,228,124,131,119, 21, 89, 77,137,179,
- 47,176, 12, 35,186, 91,242,118,237,218,189,202, 48, 76, 34,128, 36,157, 78, 39,191,120,241,226,173,180,188,250, 80, 6,118,235,
-101, 46,148, 55,247,245, 74, 57, 69, 39, 75, 26, 30,242, 77,199,142, 29,157, 78,150, 82,169, 20, 71,155,250,191,199, 44,235, 81,
-100,185,143, 16,228, 56,174, 33, 47,251, 25, 29,233,234,104,205,152, 49,195,201,235,234,100,137,104, 74, 57, 18,195,186,117,235,
- 86, 28, 60,120, 16,207, 60,243, 12, 20, 10, 5,230,204,153, 3,155,205,134,169, 83,167, 66,161, 80, 64, 38,147,209,204, 71, 65,
- 65,221,172, 70, 90,196, 13, 21,110,253,160, 24, 55, 81, 83,225, 73, 96,185, 54, 19,138,223, 25,134,177,122,224, 53,187, 53, 41,
-186,239, 23, 63,171,102,204,152,177, 89,116,178, 92,246, 55, 10,135, 95, 71, 75, 46,151, 39,231,229,229, 57, 39,194,244,245,105,
- 54,155, 49,104,208,160,128,157, 49,113,212, 33,199, 73, 26, 9, 11,101,176, 26, 74, 77, 48, 20,106,181,187,224, 96,252, 85,226,
-226, 27,177,171,208,154, 60,121, 50, 56,142,195,130, 5, 11, 0, 0,175,190,250,106,192,125,180, 68, 78,216, 25, 20,147,179, 72,
-159, 53, 18,230,111,173, 40,219,241, 59, 56,142, 67, 84,239, 59, 32,220, 52, 18,122,133, 26,156,221, 22,240,168,195,234,234,106,
- 20, 20, 20, 64, 34,145,224,149, 87, 94,105, 52,215,145,251, 72,182,141, 27, 55,250,141,187, 39, 39,107,242,249,106, 39,143, 66,
-161, 96,127,255,253,247,100, 65, 16, 82, 12, 6, 67,187, 62,125,250, 8,180, 40,251, 17, 69,130, 45, 32, 81, 21,104,254,116,231,
- 20,251,100,213,214,214,126,115,254,252,249, 61, 0,216,209,163, 71,135, 42,149, 74,124,245,213, 87,122, 0,178,229,203,151, 43,
-252,137, 34, 49,223,248, 19, 89, 60,207, 55,228,229, 64,226, 78, 26, 79, 89,226,175, 99,124, 32,121, 94, 12, 43,195, 48,176,219,
-237, 80, 40, 20,141,156,172,160,160, 32,200,229,114,154,241, 40, 40, 40,252,213, 37,251, 2,174,199, 9,233,229, 34,170,246, 93,
- 9,111, 83,174,231, 15,156, 55,161, 97, 50,153,112,226,196,137, 64,121, 2,158, 24,179,117,207,155,241,222,133, 90, 48, 12,131,
-255,246,185, 1, 42,141, 26, 74,149, 10,247,255,188,213, 89,113, 31,157,254, 42,228, 42, 53,226,250, 13, 13,168, 34, 23,155, 14,
- 93,133, 86, 77, 77, 13,120,158,199,251,239,191, 15,150,101,241,193, 7, 31, 32, 62, 62, 30, 23, 47, 94,196,242,229,203, 3,114,
-180, 36,118, 9, 98, 31,235, 4,229,216, 16,104, 30,235,143,176,219, 38,227,130,153,195, 78,163, 18,253,141,199, 33,219,240, 41,
-204,130, 61,224, 17, 88, 54,155, 13, 91,183,110,117,239,240,238,236, 83,101,179,217, 96,181, 90, 97,177, 88,240,193, 7, 31, 4,
- 50,194,243,178,251, 38,166,161, 99, 18, 84, 73,110,110,110, 36, 33, 36, 28, 64, 8,128, 74, 90, 92,125, 35,182,247,243,136,236,
-249, 52, 0, 96,213,140, 39,156,251, 39, 29,253, 35,127,206,252,182, 97, 1,128,142, 73, 67,155,196, 89, 85, 85,101,184,125, 80,
-159, 28,163,192,127,221,165, 75,151, 70, 78, 86, 80, 80, 16,227,248, 29,144, 93,198,178, 44, 36, 18,201,101,205,133,222,196, 86,
- 32,125,180,108, 54,155,115, 34, 81, 95,253, 25,175,196,209,122,226,137, 39, 16, 27, 27,235,116,178,222,123,239, 61, 40, 20, 10,
- 76,156, 56, 17, 86,171, 21,159,126,250, 41,205,124, 20, 20, 20,127,186, 40,251, 51,224,177, 38, 53, 26,141,133, 93,187,118,133,
-151,255,226,131,130,130,120,183, 72,197,181,111,223, 62,215, 67, 19,226, 16, 0,217,158, 42,117,134, 97, 16,172, 9, 70,144, 90,
- 5,165,155,139, 21, 20,172,129, 92,173, 6, 43,245, 88,153, 95,198, 41,246, 45,113, 21, 90,226, 86, 91, 91, 11,158,231, 49,119,
-238, 92,104, 52, 26,152, 76, 38,191,156,226, 67, 71, 34,145, 64, 95, 84,135,147,211,179, 33, 11,218,137,118, 67, 31, 66, 44,175,
-128,116,251,143, 48,216,173,254, 38, 44,189,140,179, 67,135, 14,120,231,157,119, 46,155,214,193, 27,226,227,227,253,198,221,221,
-201,154,121, 67, 27, 72,101, 82,140, 63, 94, 4,147,201,196, 60,244,208, 67, 2, 0, 3,128, 10,131,193,112, 62,144,244,108, 6,
-252,227, 57,125,141,138, 21, 33, 16,187, 39, 1,227,145, 83,116,178,140, 2,255,117, 65, 65,129,232,100,133, 40,149, 74,124,241,
-197, 23,122, 0,236,212,169, 83,149,137,137,137,146, 64,242,146, 68, 34,193,172, 89,179, 60,246,201,242, 36,186,154, 82,142, 92,
-207, 29, 48, 96,128,199, 9, 75,189,136,183,203, 56,197,176, 70, 68, 68, 56,157, 44,187,221,238, 28,109, 40,206, 62,239,227,165,
-130,230, 79,202, 73, 57,175, 31,206,107, 18, 30,107,224,139, 23, 47,222,238,237,132,182,109,219,230,229,229,229,181, 23,151,226,
-112, 84,156, 82,163,209,216,161, 79,159, 62,126,173, 29, 65, 16, 32,151,203, 65, 8,193,173,239,100,129, 97, 1, 22,141, 31, 98,
- 81,183, 12,134, 68,194, 65,104, 88,234,195,239,168, 67,131,193,208,232,225,224,105,171,175,175,135,201,100, 10,120, 54,111,163,
-209,216,104, 10, 6,134, 8, 56,247,219,178,203, 70, 31,138, 91,160,253,118,130,130,130, 26, 53,253,248,113,172,152, 64, 28, 45,
-215,166, 71,169, 76, 10, 78,202,139,142, 86,221,233,211,167, 71,209,108, 30, 56,196, 1, 11, 0,144,218,103, 56, 4,193, 14, 98,
-183, 55, 90, 38,169, 83,242,237, 16,136, 29, 22,171, 30, 38,147,201,223,180, 39, 76,101,101,165, 97,212,168, 81, 91, 1,252,239,
-158,123,238,201, 69,195,236,194, 68,173, 86,203,121,158, 23, 0, 84, 3, 32,151, 46, 93, 10,185,112,225,130, 96, 52, 26,219,248,
- 11,231,154, 53,107,112,226,196, 9,244,235,215,175,209,114, 80,162, 43,234, 58,187,123, 32,249, 83,108, 46,247, 52, 35,188, 55,
- 33, 23, 40, 36, 18, 9, 66, 66, 66, 32,149, 74,241,254,251,239, 67, 42,149, 66,169, 84, 2, 0, 62,253,244, 83,231,228,171, 20,
- 20, 20, 20,215,141,208,242, 87,111,250,104, 86,244,217,132,104,179,217,138, 19, 19, 19,155,116, 49,187,221, 94,230, 71,184, 21,
- 47, 95,190, 92,234,234, 66,248,251, 36,132,148,249,121,216, 22,175, 90,181, 74,234,201,221,240,182,192,180, 63, 78,187,221, 94,
-156,148,148,228,213, 49,241, 4,171,213,122,193,159,104,205,170, 48, 52, 18, 9,227,143, 23,121, 93, 59,145,194,111, 94,243,145,
- 63,223,186,210,252,121, 58, 53, 53,245, 66,104,104,232,218,232,232,232,170, 29, 59,118, 68,244,234,213, 43,194,245,152, 94,189,
-122,197,186,157,102,134,247,117, 14,193, 48, 76,241, 61,247,220,227, 49,207,139,162,201, 67,254, 44,246,151,231,247,238,221, 43,
-117, 61,223, 27,191, 75, 57, 42, 14, 64,184,158, 75, 79, 79,103, 93,121,188,229,125,171,213, 90, 65,115, 33, 5, 5,197,117, 47,
-180, 12, 6, 67, 81,215,174, 93,109, 94,254, 59,239,235,220,170,170,170,158,205, 29, 1,171,213,218,231,159,192, 89, 89, 89,217,
-172,113,183,217,108,197,142, 9, 74,125, 30, 67,179,248, 95,119,143, 0,160,188,188,252, 38, 0,208,233,116,240,183,172, 78, 19,
- 4, 97,179,231, 79,155,205,214,167, 37,210,180,186,186, 58,131,230, 44, 10, 10, 10, 42,180,154, 0,186, 24,241,223, 3, 45, 33,
- 90, 41, 40, 40, 40, 40, 40, 40,154, 23, 44, 77, 2, 10, 10, 10, 10, 10, 10, 10,138,150, 1,131,134,145, 3,158,208,148,209, 4,
- 67,174,224,218,217,148,147,114, 82, 78,202, 73, 57, 41, 39,229,188,238, 56,253,113,211,209,140, 45, 44,192, 40, 39,229,164,156,
-148,147,114, 82, 78,202,121,253,113, 94,147,160, 77,135, 20, 20, 20, 20, 20, 20, 20, 20, 45, 4,142, 38,193, 95, 6, 9,154, 48,
-163,190, 63, 16, 66,194, 0,120, 91, 48,206,204, 48,204,165, 43,224,100, 0, 72, 29,155, 56,209,145, 21,128, 5,128,133, 97, 24,
-226,159,227, 93,182,164, 36, 44,141,216,249, 94,132, 97,120, 65,192,225, 54,109, 90, 31, 98,152, 59,204, 0,160,138,238,212, 89,
-173, 82, 12, 49, 89,204,201,114, 94,118,162, 70, 87,191,209, 84,158, 87, 72,179, 7, 5,197, 95,130,187, 0, 76, 65, 67,183,146,
- 25, 0,150,209, 36,161,160,104, 33,161,165, 86,171,247,179, 44,155,224,111,126, 30, 17,142,181,204,138, 47, 93,186,212,179, 9,
-215, 30,165, 86,171, 7,241, 60,127, 11, 0, 88,173,214, 29,245,245,245,155, 1, 44, 7, 96,187,194, 56,105, 0, 60, 0,224, 17,
-199,239, 37,142,202, 66,123,133,124, 93, 67, 66, 66,126,224,121,158, 84, 86, 86,246, 6,128,136,136,136,221, 86,171,149,209,106,
-181,247, 3, 56,210, 68, 62,150,231,249,153,189,123,247,238,191,109,219,182,255, 1,152,219, 76,247, 82,206,178,172, 71,129, 34,
- 8, 66,210, 21,136, 44, 41,128,144,185,115,231, 70, 44, 94,188, 56,189,184,184,184, 11, 0, 36, 36, 36, 28, 29, 61,122,244,161,
-113,227,198, 85, 17, 66,106, 25,134,177,248,226, 41, 41, 9, 75, 43, 47,205,127,166,172,252,196, 3, 0, 16, 19,219,101,153, 68,
-194, 74, 9, 57,176, 75,217,234,145, 86,237,219, 37, 61,253,221, 87,115,165, 73,201,173,177,105,231,193, 27,199,189,248,102,218,
- 5,224, 19, 42,182,254, 60, 4, 7, 7,239,103, 89, 54,193, 87, 25,247, 84,230,237,118,123,113,117,117,117, 79,111,156, 28,199,
- 37,248,170, 47, 60,237, 19, 4, 33,191,178,178,210,227, 84, 19, 26,141,102, 23,199,113,201,129,114,137,159, 54,155,173,216,219,
- 40, 93,141, 70,179, 95, 34,145, 36,248,138,167,167,255, 4, 65,200,175,168,168,240, 22,206,203,226,222, 28,225,188, 18, 78, 95,
-225, 20,235, 35, 0,159, 70, 68, 68,220, 92, 85, 85,245, 40,128, 55,181, 90,109, 55,137, 68,130,240,240,240, 55,205,102,243,153,
-144,144,144, 47,107,107,107,119, 2,120, 17, 0, 93, 47,149,130,162,185,160,209,104,202,234,235,235,137, 8, 65, 16,136,213,106,
- 37, 38,147,137, 24, 12, 6,162,211,233, 72,125,125, 61,209,106,181,164,182,182,150, 84, 85, 85,145,200,200, 72,247,201, 27,189,
-181,225,118,209,104, 52,121, 89, 89, 89,166,130,130, 2, 98,177, 88,136,197, 98, 33,133,133,133,228,163,143, 62, 50,105, 52,154,
- 60, 0, 93,188,156, 59,196, 75,101,113, 27,128,165,233,233,233,230, 53,107,214, 16,163,209, 72,116, 58, 29, 89,182,108, 25,185,
-225,134, 27,204, 0,150, 58,142, 97, 3,228, 4,128,190, 49, 49, 49,197,103,207,158,181,111,220,184,209, 18, 18, 18,146, 29, 18,
- 18,146, 93, 88, 88,104, 63,123,246,172,208,170, 85,171, 98, 0,125,155, 16, 78, 0, 24, 57,126,252,248,178,194,194, 66, 50, 96,
-192,128,195, 46,251, 25,248, 95,231,110,136, 39, 39,139, 16, 18, 67, 8,137, 69,195, 36,151,151,109,132,144, 88,199, 49, 97, 1,
-114,170,242,243,243, 91, 71, 71, 71,103, 49, 12, 99,118,231, 99, 24,198, 28, 29, 29,157,149,159,159,223,154, 16,162,242,197, 89,
-124,126,222,147,107,215, 12,174,209, 93, 58, 69,116,151, 78,145,255,125, 61, 80,251,212,184, 71,151,198,182,237,190, 32, 52, 33,
-109,238,137, 83,167,231, 19, 66,230,111,222,151, 55,127,242,231,191,206,191,119,220,236, 47, 34, 18,211,159,106, 66,122, 94, 13,
- 40, 39,128,208,208,208, 82,157, 78, 71, 8, 33,196,110,183, 19,139,197, 66, 76, 38, 19,209,235,245,164,190,190,158,212,213,213,
- 57,203,121,109,109,173,243,123, 84, 84,148,215,242, 30, 22, 22, 86,102, 48, 24, 26,213, 29,102,179,217, 89,127,232,245,122,162,
-215,235,137, 78,167,115,110,245,245,245, 36, 46, 46,174,200, 71, 56, 47,138,225, 20, 4,129,216,108, 54, 98,177, 88,156,188, 70,
-163,177,209,102, 50,153,136,201,100, 34,137,137,137, 1,135, 51, 16, 78,163,209, 72, 18, 18, 18, 74,188,113,134,135,135,151, 25,
-141,198, 70,156,174,241,119,231, 21,127,199,196,196,148, 54,133, 51,144,112,250, 74, 79, 7,230,230,230,230, 18,131,193, 64,226,
-227,227,171,238,191,255,126,171,221,110, 39,107,214,172, 33,233,233,233,194,192,129, 3, 45,149,149,149,228, 95,255,250, 23,241,
-241, 82, 72,203, 17,229,164,184, 18, 71,139, 97, 24,168, 84, 42,124,255,253,247, 94,151,227,112,253,222,166, 77,155, 64,175,217,
- 51, 57, 57,121,235,246,237,219, 21,177,177,127, 76,136,109, 54,155, 17, 22, 22,134,231,158,123, 78,118,215, 93,119,181, 31, 58,
-116,232,238,115,231,206, 13, 0,176,223, 15,223,125,145,145,145,159, 77,154, 52, 41,250,193, 7, 31, 68, 68, 68,163, 73,183, 49,
-106,212, 40,220,127,255,253,210,220,220,220,135, 22, 46, 92,248,208,188,121,243, 74,235,235,235,199, 1,248,209, 23,169, 66,161,
-184, 39, 46, 46,238,139,237,219,183, 71, 69, 69, 69, 33, 37, 37,133,125,253,245,215,219,119,232,208, 65,145,144,144,192, 94,188,
-120, 17, 63,255,252,115,252,195, 15, 63,188,162,172,172,236,105,139,197,178, 50,128,184,203, 34, 34, 34,222,124,250,233,167, 91,
-105,181, 90,219,129, 3, 7,242,196,253, 50,153,108,106, 70, 70, 70,175, 45, 91,182,124, 11,224,203, 43,113,178, 8, 33, 90,252,
-209,196, 39,194, 42,254, 31,136,179, 69, 8,145, 29, 62,124, 56, 60, 35, 35,227, 71,147,201,212,253,153,103,158, 57, 63,125,250,
-116,133, 70,163,209, 0, 96,180, 90,237,165, 41, 83,166,152,103,207,158,253, 70,231,206,157, 7,239,218,181,235, 62, 66,136,213,
- 33,200, 46,231, 99, 24,103,120,138, 46, 84, 96,235, 78, 65,246,206,196, 87, 19, 62,156,150,124,110,223,241, 34,129, 83,104,240,
- 75,206, 49,148, 85,213,227,215, 93,199, 17, 19, 17,204, 72,229,124, 90, 72,252, 13, 3,106, 47, 28,207,129,143, 25,210, 41,154,
- 7, 12,195, 64,169, 84,226,151, 95,126,185,108,233, 42, 79,203, 90,113, 28,135,208,208, 80,191,171, 27, 4, 5, 5, 97,227,198,
-141, 30,215, 94,244,180,164, 79, 72, 72, 8,124,189,108, 48, 12,131,160,160, 32,236,216,177, 3, 44,203,122, 92, 26,200,125,159,
- 74,165, 2,235, 99,173, 43,145, 51, 39, 39,199, 47,151,248,169, 86,171,129,134,166,127,239,133, 82, 46,199,246,237,219,189,198,
-217,253,187,218,177,222,171, 63,206, 29, 59,118, 52, 90,250,203,125, 73, 48,215,223, 42,149, 10,140, 31,210,176,176,176,222, 9,
- 9, 9,216,187,119, 47,150, 47, 95, 30,158,150,150,134,211,167, 79,131, 97, 24, 76,159, 62,157,185,225,134, 27,248,210,210, 82,
-244,235,215, 15, 63,253,244, 83, 31,173, 86, 75, 11, 12,197, 95, 2, 66, 8, 15,224, 70, 0,145,104,232,118, 83, 7, 32, 20, 13,
- 43,105,200, 0, 84, 1, 80, 56, 54, 19,128,122, 0,173, 28,167, 87, 58,234, 22, 87,129, 80,225,186,248, 52, 33,164,151,131, 91,
- 92,161, 34,210,229, 88,241, 26,238,191,221, 63, 61,114,115, 0,176,122,245,106,241, 97, 54, 48, 51, 51,115,171,107,228, 2, 17,
- 89,226, 58,101, 30,202,180,251, 16, 77,185, 74,165,250, 97,247,238,221,138,200,200, 63,226, 96, 50,153, 80, 87, 87,135,250,250,
-122,212,213,213, 33, 56, 56, 24,203,151, 47, 87, 12, 30, 60,248,135,186,186,186, 14,142, 68,243,198, 57,235,226,197,139,209, 54,
-155, 13, 50,153,231, 46, 74, 44,203,162, 83,167, 78,120,243,205, 55, 49,108,216,176,152, 65,131, 6,205,114, 19, 90,151, 13, 37,
- 85, 42,149, 95, 28, 56,112, 32, 74,169, 84, 34, 47, 47, 15,197,197,197, 24, 63,126,124,107, 65, 16, 80, 84, 84,132,211,167, 79,
-227,194,133, 11, 88,184,112, 97,212,136, 17, 35,190,240, 32,180, 60, 13, 79,125,230,229,151, 95,238, 24, 22, 22,198,126,244,209,
- 71, 53, 58,157,238,255, 28,251,223,153, 51,103,206, 99,253,251,247,143,250,247,191,255, 77,118,236,216,177,216,113,227,188,166,
-167,107,159, 44, 71, 51, 31, 28,153,239,164,219, 57,157, 92,254, 7, 33, 36, 6,128,137, 97,152, 26, 15,156, 12,128,144,161, 67,
-135,190, 98, 50,153,186,111,223,190,253,204, 45,183,220,146, 8,224,162,152,249, 66, 66, 66, 84,179,102,205,138,206,204,204,204,
-189,245,214, 91,187, 15, 29, 58,244,149,138,138,138,233,132,144, 10,151, 62, 91, 78, 78, 65,192,225,152,216, 46,203,114,118,141,
-123, 96,203, 14,179,244,213, 23, 39,159,111,211, 58,169,246,112, 94,181,253,120,126, 5,234, 12, 54,220,123,107,195, 2,230,189,
-187,180,193,103,223,111,199,115, 47,189,197,255,184,108,209,253,103, 8, 84,245, 37,199,215,248, 72,207,171, 5,229,132,179,137,
- 9, 60,207,227,142, 59,238, 0,195, 48,151,173,229,201,243, 60,118,237,218,133, 91,111,189, 21, 60,207,227,137, 39,158, 8,136,
-147,227, 56, 12, 29, 58,212,185,142,162, 43,159,187,104,240,162, 9,178,221, 42, 91,112, 28, 7,150,101,189, 46,164,237,206,233,
-175, 94, 18,195,233,139,203,245, 63,127,225,116, 44,121, 20,176,200, 10,148, 83, 12, 39,199,113,232,211,167, 15, 14, 29, 58,228,
- 83,116,121,209,151,141,226,126,233,210,165, 49, 29, 58,116,200,153, 59,119,110, 56, 0, 84, 85, 85, 57, 23,188,151, 72, 36, 56,
-117,234, 20,204,102, 51,222,125,247, 93,139, 86,171,253, 55, 45, 71,148,179, 37, 57,125,105, 17, 0,253, 39, 78,156,216, 51, 43,
- 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106, 66, 72,166,248, 57,113,226,196,180,172,172,172,233, 19, 38, 76,120,
-115,198,140, 25,199, 24,134, 89, 13, 0,238,191, 29,117, 73,166,155,136,139, 20,121, 28,101,174,209,177,158,126,187,127,122,226,
-110,228,104,101,102,102, 50,142, 72, 50,174,149, 90,160, 66, 43,144,181,251, 56,142,123,126,250,244,233,209,190, 68, 86,125,125,
- 61, 74, 74, 74,144,152,152,136, 39,158,120, 34,122,238,220,185,207,219,108,182,143,125,208, 74, 37, 18, 9,246,238,221,139,242,
-242,114,116,237,218, 21,201,201,201,141, 14, 56,123,246, 44,214,174, 93,139,154,154, 26,244,232,209, 3,104,232,220,237, 17,221,
-186,117,123,183, 83,167, 78, 67, 89,150,181, 41, 20, 10, 28, 62,124, 24,221,187,119,199,247,223,127,143, 54,109,218, 64,169, 84,
- 34, 55, 55, 23, 93,187,118,197,214,173, 91, 17, 25, 25,137,244,244,116,155, 86,171,221, 86, 93, 93,189,249,220,185,115,239,122,
- 11,103,124,124,252,228,167,158,122, 74, 86, 82, 82, 34,124,243,205, 55,219, 1,108, 7,240,252, 91,111,189,245,248,176, 97,195,
-162, 14, 30, 60, 88,187,111,223,190, 61, 94, 68, 86, 32, 78,150,205,253,161,100,183,219, 77, 6,131,193,108, 50,153,172, 44,203,
- 22, 50, 12, 99,182,219,237, 29,188,153, 16, 99,199,142,109, 91, 89, 89,249,220, 75, 47,189, 84,224, 16, 89,167,208,208, 1, 30,
- 0, 96,179,217, 76,245,245,245,218,140,140,140,196,135, 31,126,248,204,210,165, 75,159, 27, 59,118,236,242,111,190,249,166, 30,
-128,193,157,176, 77,155,214,135, 36, 18, 86,170,171, 11,207, 95,177,252,203,151,215,174,122,190,117, 81,209,133,246, 17,173, 34,
-117, 82,117,100,201,242, 37, 95,239, 7, 96, 46,169,208,226,200,217, 82,240,188, 4, 39,138,106,209,255,246, 81,252,153,188,105,
-125, 1,172,161,239,114, 45,255,178, 40, 46, 66,189,101,203, 22,159,142,214,174, 93,187,192,243, 60, 20, 10, 5,102,207,158,237,
-147, 84, 20, 6,162, 91,228, 79,204,136,139,163,251,114,159, 4, 65,112, 46,244,238,190,253,223,255,253, 31, 94,122,233,165, 70,
-215,112,136, 13,198, 31,167,183,240, 37, 38, 37,161,188,172,172,209,190, 64, 22,165,183,219,237,224,121, 30, 11, 22, 44, 64,102,
-102, 38, 86,175, 94,237,243,243,142, 59,238, 0,203,178, 36,144,244,236,211,167, 15, 44, 22,139, 51,204,167, 78,157,242,200, 59,
-111,222, 60,127,193,188, 11,192,148,238,221,187,107, 6, 13, 26,132,156,156, 28,220,127,255,253, 38,139,197,146, 7, 0,119,222,
-121,103,234,220,185,115,101, 7, 14, 28, 64, 68, 68, 4,127,254,252,249,255,129,118,144,167,104, 97,120,210, 34,226, 51, 47, 43,
- 43,107,186,187,136,113,133,248, 63,195, 48,171,103,204,152,145,233, 42,138, 92,127,139,174,147,155,136, 75,115,117,164, 92, 69,
-148, 55, 1,229,246,188,117, 61,190,194,163,208,114, 68,108,160,171, 11, 36, 86,190,254, 68,150,143, 55,199, 70, 8, 9, 9, 25,
-126,239,189,247, 58, 69,142,209,104,116, 10, 44, 81,100,137,191,115,115,115,209,179,103, 79,105, 72, 72,200,240,170,170,170,143,
- 3, 16,113,136,139,139, 67,101,101, 37,142, 30, 61,138,196,196, 68, 88,173, 86,172, 95,191, 30,181,181,181,224,121, 30, 82,169,
- 20, 22,139,207,190,219,232,212,169,211, 29,139, 23, 47,238,185,104,209,162, 75,226, 27,221,146, 37, 75, 64, 8, 65,100,100, 36,
-244,122, 61,202,202,202,176,121,243,102,216,108, 54,168,213,106,164,164,164,200,238,185,231,158,190, 83,166, 76,225,125, 8,173,
- 62,247,223,127,127,136, 70,163,193,139, 47,190, 72, 44, 22,203, 12,199,190,201,227,198,141,139, 40, 44, 44, 52, 63,249,228,147,
-123, 45, 22,203, 71,162,153,232, 42,112,188,220, 88,175, 78,150,213,106, 21,211,180,160,190,190, 30,173, 90,181, 74,116,117,182,
-188,137,193, 29, 59,118,244, 1, 32,153, 58,117,106, 16,128, 50,215, 48,152,205,102,212,215,215, 67,167,211, 89,107,107,107,203,
- 95,123,237, 53,219,210,165, 75, 37,142,115, 78,120, 18, 90, 12,115,135, 89,163, 81,202, 8,145,188, 53,127,254,124,245,176, 97,
-195, 88,181, 90,141,186,186, 58,205,175,235,214,169, 7, 15,234,155, 50, 61,235,195, 13,154,132,174,101, 59, 14,231,227, 66,105,
- 45,204, 86, 43, 82, 98, 67, 26,252, 48,138, 22,135, 99, 32,139,211,209,114, 21, 21, 57, 57, 57,184,253,246,219,157,101, 93, 42,
-149, 54,114,190,252,113,114, 28,135,219,111,191,253, 50,135,103,203,150, 45, 30,221, 39,127,112, 21, 69,238,226,200,147, 0, 99,
- 89,214,239, 2,235,162,155,231, 73,108,185,186,250,110,226,205, 95, 51, 7, 56,142,195,184,113,227,192,243, 60, 94,127,253,117,
-112, 28,135,244,244,116,112, 28,135,140,140, 12,240, 60,143, 91,111,189,181,201,113,223,189,123, 55,186,119,239,238, 12, 83,122,
-122, 58,122,245,234, 5,142,227,208,175, 95, 63,240, 60,143,161, 67,135, 6,194,249,102, 93, 93, 93, 55,181, 90,141,220,220, 92,
- 72, 36, 18, 48, 12,115, 26, 64, 55, 0,136,141,141, 61,163, 6,111,130,189, 0, 0, 32, 0, 73, 68, 65, 84,215,235,219, 26,141,
- 70, 60,245,212, 83,140,217,108,238,250,250,235,175,191,101, 52, 26,169,208,162,104, 49,184,107, 17, 23, 24, 38, 76,152,240, 38,
-195, 48,171, 69,135,202,221,121,242,244,219, 67,221, 36, 58, 80,251, 28,101,181,151,155,136,171, 96, 24,102, 31, 33,228, 78,111,
-231, 2, 48,187, 9,171, 70, 77,135,174,205,134,126, 29, 45,177,242, 13, 84,104,249,131,209,104,188, 49, 42, 42,202,171,200,114,
-253, 52,155,205, 72, 78, 78,134,209,104,188,177,169, 15,141,216,216, 88, 88, 44, 22,124,249,229,151,144, 74,165,144, 74,255,208,
- 23,102,179,111,179,232,248,241,227, 5,187,119,239,238,222,163, 71,143,176,159,126,250,169, 98,192,128, 1,145,195,134, 13,131,
- 66,161,128,193, 96,128,213,106, 69,239,222,189,209,169, 83, 39, 20, 23, 23,227,215, 95,127,173,236,208,161, 67,171, 61,123,246,
- 8,165,165,165,231,124, 80,223, 54,120,240, 96, 48, 12,131,117,235,214, 85, 2,216, 39,151,203,215, 78,155, 54, 45,204,108, 54,
- 11,163, 71,143, 62, 95, 93, 93,253, 18, 0,139, 76, 38,155, 51, 96,192,128,140,236,236,236,111, 5, 65,152,221,212,140,234,158,
-182, 58,157, 14, 65, 65, 65,129, 76, 37,193, 87, 87, 87,119, 1, 0,149, 74, 21, 14,224,140, 51,135, 27, 12,141,196,176,217,108,
- 54,134,135,135,171, 0,192,113, 14,239,133, 51,210,102,195,138,115,231,242,131, 93,251,207,133,134,134,226,145,135, 31,102,111,
-233,211, 71,214,237,198, 27,135,190,253,201,162,239,227, 34, 52,230,148,184, 8, 88,237, 86,100,111, 88, 47, 16,193,186,129, 86,
- 59,127,142,208, 18,197,134,187,163,197,243, 60,182,110,221,122,217, 62,169, 84,138,255,254,247,191, 1, 9, 3, 81, 84,121,107,
- 58,115,107,234, 98,252, 9, 24,158,231, 33,145, 72,176, 96,193, 2, 8,130,128,151, 95,126,185, 81,115,162, 43,127, 64,118,158,
-139, 8,236, 52, 89, 0, 96, 70,241, 76,185,243,124,247,240, 58,206, 9,200, 37,155, 59,119,110, 64,142,214,157,119,222,233, 87,
-184,186,182, 48,184,134,235,208,161, 67, 30,121,231,207,159,239, 55, 61,237,118, 59,214,172, 89,227, 20,169, 34,222,126,251,237,
-167,100, 50, 89,244,182,109,219, 80, 90, 90, 10,157, 78,135,250,250,122,244,238,221, 59,133,101,217,195,165,165,165,133, 39, 78,
-156,184,151,150, 30,138, 63,209,209, 50,205,152, 49,227,216,140, 25, 51, 60, 58, 86,238,206,146, 47,231, 73, 20, 88, 14, 65, 20,
- 41,138, 55, 52,116,171,217,231,239, 92, 0, 50,247,166, 67,159, 70,144,155,138,156,226,169,242, 13,164,249, 48, 64, 59,157, 99,
- 24, 6, 70,163,209,163,192,114, 21, 7, 22,139, 5,213,213,213,176,219,237, 87, 60,215,151,167, 55, 89,127, 66,235,232,209,163,
-255,122,252,241,199, 75, 66, 66, 66,186, 85, 84, 84,148, 11,130,112,235,174, 93,187, 34, 57,142,131, 70,163,129, 70,163,193,218,
-181,107,161, 84, 42, 49,110,220,184,114,187,221,158, 19, 28, 28, 28, 97, 48, 24,126, 47, 45, 45,125,219,171,130,225,249,161,253,
-250,245,195,129, 3, 7,112,233,210,165,141, 0,210, 31,125,244,209,219, 91,183,110,205, 76,155, 54,205,120,246,236,217,217, 0,
-202, 85, 42,213,226,197,139, 23, 15,234,209,163, 71,240,232,209,163,177,117,235,214,249, 0,140,129,198, 89,167,211, 53, 18, 88,
- 90,173, 22,117,117,117, 80,169, 84,182, 0,211,140,199, 31, 35, 12, 65, 8,113,222, 27,135,155, 37,222, 31,194,113,156, 56,170,
-209,155,200,130, 74,165,154,186,104,209, 34,133,251, 32, 5,187,221,142,178,178, 50,104, 52, 26, 76,122,251,109,233,123,227,255,
-221, 93,162,142,222,197,178, 12,204, 22, 82, 67, 4,243,122, 93,217,131,219,128,119,105,205,243, 39, 64, 20, 6,119,223,125,247,
-101,205,133, 82,169, 20, 27, 55,110,196,136, 17, 35,156, 47, 46, 61,122,244,240,251,114, 37, 10,131,187,238,186,203,233, 12,173,
- 95,191,222, 99,179,159,232, 72, 5, 34, 8,197, 99, 95,120,225, 5,112, 28,135,207, 62,251, 12,175,188,242, 10, 88,150,197,204,
-153, 51,193,178, 44,222,121,231,157,128, 69,166,171,128, 41,252,176,225, 51,225, 21, 45,170,230, 69, 3, 0,130, 53, 26, 49, 66,
- 77,170,123, 56,142,115, 58, 89, 55,222,120, 35,120,158, 71, 70, 70, 6, 56,142,115, 58, 89,195,135, 15,119, 77, 71, 18, 8, 39,
-199,113,200,203,203,115,134, 57, 35, 35,163,145,147,197,113, 28,238,188,243,206, 64,130, 57, 61, 52, 52,116, 74,167, 78,157, 58,
-207,154, 53,139,151, 72, 36, 24, 60,120,112,106, 76, 76,204, 57,155,205, 22, 49,117,234, 84,165,135,115, 20, 0,186,117,238,220,
- 89, 69, 75, 13, 69, 11, 58, 90, 83, 60,252, 21,230,218,231,170, 9, 47,146,171, 93,143, 23, 57,220,197,145,195, 33,203,241,199,
-229,233, 92,127,224, 68, 5,233,203, 82, 15, 68,104, 57,108,103,159, 23, 83, 42,149, 71,202,203,203, 51, 20, 10, 69, 35,145,229,
- 73,112, 73, 36, 18,148,150,150, 66,169, 84, 30, 49,153, 76,205,118, 19,253, 53, 29, 2, 48,158, 62,125,122,188,203,239, 33,195,
-135, 15,255,102,227,198,141,177,217,217,217,216,179,103, 15, 34, 35, 35, 49,119,238,220,139,101,101,101,255, 2,176,177,178,178,
-210,239,117,219,182,109,219, 69,173, 86, 99,199,142, 29, 0,176, 21,192,191,159,123,238, 57,198,106,181, 98,222,188,121, 58, 0,
-235, 66, 67, 67,215, 44, 95,190,188,123,183,110,221,100,217,217,217,218, 61,123,246,252, 22,160,200,178, 11,130,112,153,192,114,
- 77,211,224,224,224, 64, 28, 45,107, 72, 72,200, 81,173, 86, 59,202, 96, 48,104,229,114,121,176, 86,171, 53,185, 10, 44,145,159,
-227, 56, 62, 47, 47,175, 4, 64, 74, 72, 72,200, 81,120,105,230,228, 56,110,240,224,193,131, 57,247,123, 80, 86, 86,134,210,210,
- 82, 88, 44, 22,244,232,209,131,145, 48, 86,201,165,162, 35,110,211, 58, 80,145,245, 39, 57, 90, 68, 44,235,226, 40, 65, 79, 35,
- 13,215,175, 95,239,252,205,178, 44,190,254,250,235,128, 68,209,198,141, 27,125,118, 88,119,107, 58,244,107,141,139,199,127,254,
-249,231, 32,132, 56,157, 44,150,101, 49, 97,194, 4,200,229,114, 76,155, 54, 13, 19, 38, 76, 0,199,113,126,155, 14, 93, 5, 76,
-210,235,122,215,151,163,134, 66,225,232, 15,197, 48,140,171,216, 98, 2, 21,111,190,220,188, 64, 90, 2, 92, 57,197,243,130,130,
-130,188,118,132,119,227,244,117,129, 95, 0,228,199,198,198,238,200,200,200, 8,217,191,127, 63,102,206,156, 41, 53,153, 76,109,
-178,179,179,157,215,245,148, 94, 58,157, 78, 65, 75, 14, 69, 75,184, 89, 62,254,174,112,235, 95,197,184, 54,227,249,248,116, 63,
- 30, 46,251, 92,121, 43, 24,134,177,122,184, 94,133, 7,113,229,126, 13,215, 99, 42,188, 58, 90,254, 42, 11,127,130, 43, 16, 71,
- 75,175,215,255,182,110,221,186, 94, 15, 63,252, 48,231,171,217, 80,167,211, 33, 58, 58, 26,199,142, 29,179,233,245,250,223, 2,
-112,202,154, 83,104,185, 35,187,188,188, 92, 98,181, 90,209,190,125,123,196,199,199,195,104, 52,162,166,166, 70, 2, 96, 99,128,
- 28, 82,149, 74, 37, 1,128,154,154, 26,160, 97,168,105,106,135, 14, 29,112,224,192, 1, 84, 87, 87,255, 8, 96,216,148, 41, 83,
-122,244,238,221, 91,250,253,247,223,235,159,121,230,153, 31,173, 86,107, 64, 74, 67, 16, 4,179,205,102, 75,102, 89,214, 82, 83,
- 83,115,193, 53, 61,163,163,163,195, 85, 42, 21, 83, 86, 86,102, 13, 68,104,117,235,214,109,239,249,243,231, 49,117,234,212,138,
-233,211,167,119,168,171,171,187, 84, 91, 91,107,115, 21, 91, 70,163,145,109,213,170,149,124,222,188,121, 10, 0,232,214,173,219,
- 94,111, 66, 75,167,211,181, 86, 42,255,120, 49, 54,153, 76, 40, 45, 45, 69,105,105, 41,202,202,202, 80, 87, 87,135,148,148, 20,
-232,245,250, 68, 90,205,252,101, 66,171, 81,243,153,107,249,118,125,144, 55,165,172,187, 10,152,187,239,190,219,217,183, 75,116,
-200,196,109,197,138, 21,238, 29,204, 3, 18, 90,159,127,254, 57, 94,120,225, 5, 4, 5, 5, 97,214,172, 89,141,154, 14,221,197,
-129, 32, 8, 76, 32,113, 79,126,195,128,210, 57,225,224,121, 30, 17,207,148, 53,106,162,243, 32, 56, 2, 10,231,244,233,211,155,
-165,233,208,149, 51, 49,177,161,168, 44, 88,176, 0,163, 70,141,194,182,109,219,174,184,233, 48, 45, 45,109,201,234,213,171, 67,
-142, 31, 63, 14,173, 86,139,138,138, 10,152, 76, 38, 20, 23, 23,123,109, 21,112,212,229, 65,180,228, 80,252,201,245,212,190, 63,
-147,183, 57,175,199,249,121,128, 7, 44,180, 2,113,180, 76, 38,211,172, 23, 95,124,241,185, 33, 67,134,132, 7, 7, 7,163,164,
-164,228, 50,145, 85, 95, 95, 15,181, 90, 13,131,193,128, 85,171, 86,105, 77, 38,211, 44,127,226,192,106,181, 34, 42, 42, 10,149,
-149,149, 16,188,244,159,102, 89, 22, 10,133, 2,245,245,245,128,159, 78,230,158, 30, 24, 22,139, 5, 86,171, 21, 86,171, 21, 22,
-139,197,239, 91,178,187,153,167, 82,169, 68,225, 1, 0,186,184,184,184,246, 65, 65, 65, 40, 40, 40, 0, 26, 70,246, 13,185,253,
-246,219,249,170,170, 42,242,228,147, 79,110, 39,132, 60, 5,223,179,227,155,115,114,114,146, 1, 64,161, 80,228, 2, 64,113,113,
-177,181,166,166,166,145, 83,168, 84, 42,201,136, 17, 35, 98, 9, 33,200,201,201, 73,150, 74,165, 4,222, 71, 53, 26, 87,174, 92,
-121, 60, 36, 36,100,105, 86, 86,214,195,153,153,153,199,186,116,233,146,172,211,233,202, 13, 6,131,193,104, 52, 18,137, 68, 34,
- 13, 11, 11, 11,218,176, 97,195,153, 93,187,118, 13,209,104, 52, 75, 87,174, 92,121,220,155,243,166, 82,169,138,245,122,125,146,
-120, 79, 93, 69, 86,105,105, 41, 8, 33,200,207,207,135, 82,169, 60,239,175, 89,151,162,229, 32,190, 84,185, 59, 47,238,251, 2,
- 21, 89,174,194, 96,195,134, 13, 62,231,208, 10,148,211, 85, 20,189,242,202, 43,152, 51,103,206,101,142,214,180,105,211, 0, 0,
-111,191,253,118,192,125,180, 68,247,170,116, 78, 56, 98, 94,168,110, 20,118, 0, 96,196,240, 53,173,204,131,227, 56, 76,157, 58,
-245,178, 78,234,174, 77,123, 1, 54,241, 53, 10,103,121,121, 57, 56,142, 67,120,120, 56, 30,121,228, 17, 12, 29, 58,212,217, 4,
-217, 84,222,147, 39, 79,238,120,227,141, 55,186,166,165,165,225,253,247,223,175, 14, 13, 13, 13,254,207,127,254,195,213,212,212,
- 48,190, 28, 45, 42,180, 40, 40,154, 65,104,137, 5, 44,208, 81,135, 94, 42,203, 33,104, 60,215, 70,173, 94,175,127,228,182,219,
-110,251,105,217,178,101,138,182,109,219,226,228,201,147,168,174,174,134,217,108,134, 84, 42, 69,108,108, 44,106,106,106,240,245,
-215, 95, 27,244,122,253, 35, 0,106,253,112,190,213,179,103,207, 47, 62,254,248,227,160,244,244,116, 84, 87, 87,163,190,190,222,
- 41,132, 24,134,129, 70,163,129, 66,161,192,222,189,123,177,126,253,122, 3,128,183,252,112,122, 82,115,176, 88, 44, 78,193, 21,
-128,208,114,229, 84,137,174,142, 94,175, 7, 0,107,235,214,173, 99, 0, 32, 63, 63, 31, 0, 10, 83, 82, 82,166,180,109,219,150,
- 89,188,120, 49, 33,132,172,247, 34,178,156,156, 12,195, 84, 19, 66, 46, 1,136, 49,155,205, 82, 0,168,173,173,181,180,106,213,
- 42, 74, 46,151, 11, 10,133, 66, 8, 10, 10, 18, 74, 74, 74,108, 54,155, 77, 10, 0,253,250,245, 51, 3, 40,117, 91,163,208,149,
- 83, 32,132,104,231,207,159, 63,101,244,232,209, 25,125,250,244, 73,123,246,217,103,143, 62,249,228,147,108,124,124,124, 88, 93,
- 93,157,241,244,233,211,151, 62,249,228,147,186,221,187,119, 15,225,121,254,220,252,249,243,167, 0,208, 50, 12, 35,120,226,180,
-217,108,191,101,103,103,255, 43, 51, 51,147,187,112,225, 2,202,202,202,156, 34,171,172,172, 12,157, 58,117,194,174, 93,187,236,
- 22,139, 37,187, 9,233,217, 92,160,156, 13, 47, 33, 68, 44,235,222, 4,150,248, 50, 21, 40,167,171, 40, 26, 53,106, 84, 35, 23,
- 75, 42,149,226,135, 31,126,240, 88,111,120, 40, 87,141,226,238, 58,199,215, 27,111,188,209, 72,180, 77,154, 52,201,107,117,230,
- 47, 61, 69,158,218, 5,241,141, 71, 29,122, 41,231,190,194, 41,214,157, 60,207, 99,210,164, 73, 1, 59, 90,184,188,143,214,101,
-156, 98,220, 7, 12, 24, 0,189, 94,239, 20,178,222, 28, 45,127,233,105,183,219, 95,152, 51,103, 14,209,104, 52, 55,107,181,218,
- 71,207,159, 63,191, 80,175,215,223, 84, 91, 91,235,211,209, 50,153, 76,114, 90,142, 40, 39, 90,102,126,174,235, 71,104, 57, 30,
-146,104,221,186,117,163,181,179, 88,150,109,180, 53,165,159,129, 3, 27,242,242,242,238,187,229,150, 91,190,125,225,133, 23,130,
-211,211,211,249,164,164, 36,232,116, 58, 20, 20, 20,224,216,177, 99,182,149, 43, 87,106,245,122,253,163, 0, 2, 25,117,182,232,
-248,241,227,235,135, 13, 27,246, 78,239,222,189,159,158, 60,121,178, 36, 53, 53, 21,181,181,181, 8, 11, 11, 67, 84, 84, 20, 78,
-157, 58,133, 85,171, 86,217, 43, 43, 43,191, 0,240, 30, 60,180,161,250,123,225,183, 88, 44,120,232,161,135, 32, 8, 2,102,207,
-158,141, 64, 22, 84,118,129,197, 98,177, 16, 0,140,163, 63,151,222, 49,187, 52, 78,159, 62, 13, 0,231,146,147,147,131, 1, 32,
- 59, 59,155, 65,195,252, 90,129,188,225, 19, 66,136,211,217,234,212,169, 83,129,123,229, 40, 58, 89,162, 11,230, 47,220, 12,195,
- 24, 9, 33,229,122,189,126,216, 43,175,188,242,206,231,159,127,254,240,231,159,127,126,217,113, 26,141,102,233,204,153, 51,223,
-123,224,129, 7,202, 25,134,241,218,143, 76,167,211,189, 61,102,204,152, 7,142, 28, 57, 18, 28, 20, 20, 4,157, 78,135,170,170,
- 42, 88, 44, 22,164,164,164,160,188,188, 28,139, 22, 45,170, 51, 24, 12,239,210,226,248,215,192, 85, 24,120,115,181, 2, 16, 89,
- 94, 93,157, 95,126,249,197,227, 28, 85, 77,229,116, 23, 27,129,206,109,229,235,165, 72,156,150,198,211,148, 17, 77,172,215, 46,
-227,229, 56, 14, 31,125,244,145,115,210, 86, 79, 78, 86, 83, 28, 45,145, 51, 60, 60,188,193, 38, 87, 42, 33, 8, 2,238,188,243,
-206,171,225, 21, 0,140,115,153,241,125,250,107,175,189, 54,165, 83,167, 78,169, 0,228,174,105,208, 68, 23,159,130,130,194,159,
-208,178,219,237,197, 29, 59,118,108, 84,193,249, 91,204,212,106,181, 22, 7,120,221,245, 58,157, 46,101,230,204,153, 47,170, 84,
-170, 33,122,189,190,171,163,226, 56,162,211,233,178, 77, 38,211,167,104,218, 34,208, 21, 0,158,223,189,123,247,236, 97,195,134,
- 77,187,245,214, 91, 71,142, 31, 63,158, 33,132, 96,222,188,121,228,236,217,179, 43, 28, 46,214,217, 43, 73,164,240,240,240,227,
- 95,127,253,117,244, 79, 63,253, 4,171,213,138, 79, 63,253, 20,193,193,193,199,171,171,171, 3,165, 40,223,180,105,211, 55,125,
-250,244,121,108,215,174, 93,139, 0,252,190,117,235,214,133,125,251,246, 29,179,107,215,174, 37, 0,142,109,222,188,121, 97,239,
-222,189,199,236,219,183,111, 57,128, 67, 77,168,124,157,206,150,205,230,185,165,209,139,147,229,139, 83, 75, 8,177, 60,254,248,
-227,227, 31,120,224,129, 47,247,237,219,119, 83, 77, 77, 77, 87, 0, 8, 13, 13, 61,210,171, 87,175,189,203,150, 45, 59,229,112,
-178,252,117,214,175,208,233,116, 35,186,118,237,250,227,251,239,191,175, 74, 75, 75,227,218,183,111,143,194,194, 66, 28, 61,122,
-212,246,191,255,253,175,222, 96, 48,220, 13,224, 18, 45,142,127,157,208, 34,132, 32, 52, 52,180,209, 75,148, 56,228,191,169,205,
-133,174, 15,102,113,169, 30,119, 94,111,156,190,166, 77, 16,161, 86,171,157,147,155, 6,210,101, 65, 16,124,207,199, 70, 8,113,
-114,138, 91, 0, 34,203,239, 8, 65,199, 18, 56, 1,115, 6, 50,189,131, 74,165,130,213,106,117,242, 6, 48,242,179,169,106,241,
- 23, 0,191, 88,173,214,211, 0,218, 81,113, 69, 65,209,130, 66,235,210,165, 75, 61, 91,248,218, 90,147,201,244,158,201,100,122,
- 79,220, 97, 52, 26,175,150,243, 44,128, 7, 54,109,218,244,241,166, 77,155,196,118,132,169,240,191, 94,162, 79,156, 60,121, 50,
-147,231,249,255, 46, 93,186,180, 55, 33, 4, 33, 33, 33,187, 11, 11, 11,255,211, 20, 14,187,221,254,248,174, 93,187,158,131,163,
- 47,147,197, 98,121,124,199,142, 29, 47,162, 97, 61, 38,216,237,246,199,247,236,217,227,252,221,196, 7, 37, 33,132,152, 8, 33,
-113, 94, 14, 49, 53,209,129, 19,157, 45,243,178,101,203,234, 1, 28,198, 31,243,100, 89, 29,155,209,173,185,208, 23, 54,235,116,
-186,246,147, 38, 77,154, 46,145, 72, 6,235,116,186,120,149, 74, 85,100,179,217,126,211,235,245,111,161, 97,141, 42,138,191, 8,
-102,179,249, 66,199,142, 29, 57, 79, 47, 80,190, 30,228,190, 94,172,236,118,123,113,135, 14, 29,252,190,156,121,224,188,224, 67,
- 52,156, 75, 73, 73, 97, 3,229, 18, 97,177, 88,202,125,133, 51, 37, 37, 5, 77,229,244, 23,247,228,228,100,143,113,247, 35, 8,
-189,198,221,102,179, 93, 17,167,175,244,244, 5,131,193,112, 41, 50, 50,178,222,104, 52,242, 38,147,137,183,217,108,141,236, 71,
-133, 66, 81, 97, 48, 24,104,225,161,160,184, 26,161,245, 15,199,126, 52, 44, 47,209, 92, 48, 29, 57,114,228, 49,167, 61, 85, 94,
-126,165, 60,238, 74,178,222,207,239,166, 8,163,102,119,132, 28, 66, 74,223, 76,116,149,245,245,245, 79,138, 63,196, 62, 32, 20,
-127, 61,170,170,170,110,110,110,206,234,234,234,102,127, 81,171,172,172,204,104,129,184,247,188, 94, 57,125,161,164,164,228,102,
- 63, 66,140, 22, 28, 10,138, 0,193,210, 36,160,160,160,160,160,160,160,160,104, 25, 48,104, 24, 57,224, 9, 77, 25, 77, 48,228,
- 10,174,157, 77, 57, 41, 39,229,164,156,148,147,114, 82,206,235,142,211, 31, 55, 29,205,216,194, 2,140,114, 82, 78,202, 73, 57,
- 41, 39,229,164,156,215, 31,231, 53, 9,218,116, 72, 65, 65, 65, 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 21,
- 90, 20, 20, 20, 20,174, 72,109,221,186,245,137,212,212,212, 11, 0,198,182,240,181, 30,233,221,187,119,149, 92, 46,223, 0, 32,
-149, 38, 61, 5, 5, 5, 21, 90, 20, 20, 20,215,180,200,234,218,181,235,246,147, 39, 79,118,202,206,206,142,139,143,143,255,176,
- 37, 47,214,179,103,207, 15,182,109,219, 22,190,110,221,186,219, 98, 98, 98,114,174, 80,108,165,182,105,211,230, 68,106,106,106,
- 49,128, 71,154, 57,136, 99, 51, 50, 50,170,101, 50,217,122, 42, 4, 41,174, 3,116, 1,208,149, 10, 45, 10, 10, 10,138, 22, 20,
- 89, 59,119,238,140, 48, 26,141, 56,121,242, 36, 42, 42, 42, 14,181,228, 5,115,115,115, 47,237,220,185, 19, 9, 9, 9, 88,178,
-100, 73,100,114,114,242,182, 38, 10,154,212,174, 93,187,110, 63,113,226, 68,167,236,236,236,248,168,168,168, 79,154, 51,124, 55,
-221,116,211,180,109,219,182,133,109,216,176, 97,104,100,100,228,149, 10, 65, 10,138,191, 51,228, 0, 30, 99, 24,102,111,151, 46,
- 93,142,164,165,165,253,206, 48,204, 46, 0,163,112,237,206,221, 25, 24, 86,175, 94,189,117,245,234,213, 91,105, 30,161,160,160,
-104, 6,164,165,165,165,233,116, 58, 29,169,168,168, 32,159,125,246, 25, 9, 15, 15,183, 0,248, 13,192, 74, 15,219,155, 0, 52,
- 1,114,107, 28,199,123,226,249, 45, 60, 60,220,242,217,103,159,145,252,252,124,114,252,248,113,146,154,154,106, 8, 80,208,164,
-118,237,218,181, 82, 12,243,218,181,107, 9,199,113,235,155, 51, 81, 52, 26,205,177,156,156, 28,114,246,236, 89,178, 97,195, 6,
- 18, 29, 29, 93, 78,197, 22,197, 53,130, 36, 0, 31,168,213,234,234,187,238,186,139,124,245,213, 87,100,213,170, 85,228,199, 31,
-127, 36,179,102,205, 34,131, 6, 13, 34, 50,153,236, 2,128,215, 1,132, 94, 79, 90,132,113, 68,140, 0, 24, 8, 0,153,153,153,
- 84,108, 81, 80, 80, 92, 45,118,234,245,250, 12,189, 94,143,186,186, 58,180,110,221, 26, 60,207,123, 60,176,188,188, 28, 59,118,
-236,192,184,113,227,142,151,150,150,246,135,239,117, 47,195,186,119,239,190,115,243,230,205,169,193,193,193,206,157,130, 32,192,
- 98,177,192,106,181,194, 98,177,192,100, 50,193,100, 50, 65, 38,147, 65,161, 80, 32, 60, 60,252, 40,124, 55, 97, 56,221, 55,131,
-193,128,131, 7, 15, 98,244,232,209, 21, 85, 85, 85,253, 1,228, 54, 99,186,164, 70, 69, 69,229, 44, 90,180, 40, 50, 37, 37, 5,
-231,207,159,199, 19, 79, 60, 81,121,238,220,185,126,205,124, 29, 10,138, 63, 19, 19,238,187,239,190,105,209,209,209,108,151, 46,
- 93, 16, 27, 27, 11,147,201, 4,131,193, 0, 66, 8, 56,142, 3, 33, 4,181,181,181,200,201,201,193,230,205,155, 77,151, 46, 93,
-250, 26,192,167, 0,242, 92, 68,214, 53,169, 69,156, 66, 43, 51, 51,147,161,121,133,130,130,162,153,112,164,182,182,182,139,201,
-100,130, 78,167, 11,232,132,252,252,124,140, 29, 59,246,120,105,105,233, 45,240,188,168,188,166,123,247,238,123,114,114,114, 82,
-141, 70, 35,180, 90,255,235,206,203,100, 50, 4, 5, 5, 33, 34, 34, 98, 23,128, 62,222,222,196,187,116,233,178,127,215,174, 93,
-225, 6,131, 1,135, 14, 29,194, 35,143, 60, 98,169,174,174,222, 14,192, 91,224,171,209,176,142,234, 57, 15,255, 37, 2,120,209,
-241,134,239, 9,170,200,200,200,190,139, 23, 47,150,182,109,219, 22,122,189, 30,163, 70,141,170,206,205,205,237, 5,160,128,102,
- 29,138,127, 32,114, 79,158, 60,217,193,110,183,163,178,178, 18, 38,147, 9,122,189,222, 41,180, 36, 18, 9, 8, 33,176,217,108,
-206, 23,163, 3, 7, 14, 32, 59, 59,155,228,231,231, 79,118,148,165,107, 86,139, 80,161, 69, 65, 65,209, 18, 72,237,208,161,195,
-161, 95,127,253, 53, 72, 42,149, 98,213,170, 85,152, 60,121,178,181,186,186,122,155,187,120,137,142,142, 78, 91,184,112, 97,114,
- 74, 74, 10,126,255,253,119,220,127,255,253,111, 1,152,238,129,243, 77,173, 86, 59,205, 98,177,224,208,161, 67, 24, 51,102, 76,
- 65, 89, 89,217, 49,119, 17,147,156,156,220,239,147, 79, 62,225,123,244,232, 1,173, 86,139,145, 35, 71,234, 79,157, 58,213, 27,
-192, 49, 47, 97,253,164,186,186,250, 21,187,221,142,186,186, 58, 36, 36, 36, 64, 42,149,250,140,156,193, 96, 64, 82, 82,210,174,
-138,138,138,203,196, 91, 68, 68,196,166,243,231,207, 15, 82, 40, 20, 62, 57, 44, 22, 11,138,139,139, 33,147,201, 96, 50,153,208,
-174, 93,187,175, 1, 60, 78,179, 14,197, 63, 81,104, 29, 62,124,184,195,119,223,125,135,238,221,187,163,115,231,206,168,175,175,
-119,138, 46,179,217, 12,171,213,122,217, 73, 90,173, 22, 47,191,252,114, 30, 28,205,231,215,170, 22, 17, 59,166, 77, 17,219, 68,
- 51, 51, 51, 7,208, 60, 67, 65, 65,113,181, 21,111, 94, 94, 94,250,144, 33, 67,182,173, 88,177,162,213,240,225,195,209,174, 93,
- 59,254,222,123,239,141,212,235,245,131, 93, 15, 44, 43, 43, 11, 27, 51,102,204,254,162,162,162,100,199,174, 94, 94, 56,123, 5,
- 7, 7, 35, 63, 63, 95, 20, 89, 61,225,214,204, 40,147,201,214, 31, 62,124,152,151,201,100,216,183,111, 31,198,142, 29, 91, 89,
- 80, 80,224,175, 89, 46,212,108, 54, 67, 34,145, 0, 0,138,139,139,253, 70,238,252,249,243, 16, 4,193,228,233, 63,150,101,229,
- 7, 14, 28, 64, 92, 92,156, 79, 14,150,101,221, 5, 93, 13,205, 54, 20,255, 80, 88,205,102, 51,122,246,236,137,130,130, 2, 28,
- 56,112,192, 41,184, 42, 43, 43, 81, 82, 82,210,232,224,189,123,247,226,224,193,131,232,223,191,191, 59,207, 53,169, 69,156,202,
-113,245,234,213, 3, 28,145,219, 74,243, 12, 5, 5, 69, 51, 33, 53, 46, 46, 46,103,209,162, 69,145,177,177,177, 24, 52,104, 80,
- 81,105,105,105, 27, 15,199,173, 36,132,220,157,159,159,143,182,109,219,174, 2,112,207,149, 28,147,152,152, 88,177,111,223,190,
- 86,199,143, 31,199, 35,143, 60, 82,225,232,243,229,175,239, 83,114,167, 78,157,246,109,216,176, 33,156,101, 89, 28, 59,118, 44,
-144,166,195, 66, 52,244, 47, 57,231,225,191, 68, 0,147, 0,132,123, 57, 87,213,161, 67,135,190,251,247,239,151, 50, 12,131,194,
-194, 66,177,233,176,167,131,151,130,226,159,134, 17,113,113,113,255,123,238,185,231, 66,122,247,238,141,226,226, 98, 92,184,112,
- 1,151, 46, 93, 66,122,122, 58,210,210,210,112,246,236, 89,172, 95,191, 30, 7, 15, 30,132, 92, 46, 71, 66, 66, 2,212, 75,191,
-195,127, 25, 28, 7,144, 70,181, 8, 5, 5, 5,197, 85,136, 45,169, 84,186, 62, 62, 62,190, 28,158,231,165, 10, 27, 57,114,100,
-137,221,110, 39,103,207,158, 37,104, 24, 61, 8, 47, 66,139,156, 61,123,150, 68, 71, 71,231, 3, 8,243,112,204,216,152,152,152,
- 34,165, 82,121, 20, 77,156,214,161,125,251,246, 21,167, 78,157, 34, 69, 69, 69,100,221,186,117, 36, 34, 34,162, 37, 70, 4,166,
-118,236,216,177,178,174,174,142, 24,141, 70,146,147,147, 67, 18, 19, 19, 43, 64, 71, 30, 82,252,243, 17, 12, 96,106, 74, 74,138,
-241,227,143, 63, 38,235,215,175, 39, 11, 22, 44, 32,211,166, 77, 35,227,199,143, 39, 25, 25, 25, 36, 35, 35,131,140, 26, 53,138,
-188,242,202, 43,228,246,219,111, 39,106,181,186, 22,192,189, 52,233, 40, 40, 40, 40,154, 23,137, 0,102, 57, 4,213,202,145, 35,
- 71,150,152, 76, 38,114,225,194, 5,242,195, 15, 63, 16, 52, 76,221,224, 9,111,150,150,150,146,210,210, 82,113,106,132,124,252,
- 49,173,195, 87, 14,222,171, 18, 65, 73, 73, 73, 21,251,247,239, 39,133,133,133,100,237,218,181,196, 33,216,154, 13, 10,133, 98,
-131, 86,171, 37, 70,163,145,108,218,180,137, 78,239, 64,113, 45, 34, 10,192,220, 27,110,184,193, 58,123,246,108,178,114,229, 74,
-242,217,103,159,145, 17, 35, 70,144,215, 95,127,157, 60,248,224,131, 36, 50, 50,210, 4, 32, 11, 64, 8, 77,174,171, 7, 93,217,
-156,114, 82, 78,202,233,142,245,199,143, 31, 39, 34,236,118, 59,185,112,225, 2,217,176, 97, 3,137,137,137, 57,134,198,243,105,
-185,114,106, 58,119,238,124,242,212,169, 83,228,252,249,243,196, 98,177, 56, 57, 78,158, 60, 73, 0,108,109,134,112,166,198,199,
-199,151,111,217,178,133,156, 58,117,138,196,196,196, 20, 53,103,220,147,146,146,202, 43, 42, 42,200,166, 77,155, 72,100,100,164,
- 63,145, 69,243, 18,229,252, 39,115, 38, 1, 88,220,163, 71, 15,251,156, 57,115,200,211, 79, 63, 77, 18, 19, 19,237,142,151,162,
-248,235, 73, 8, 93,223,179,180, 82, 80, 80,252, 21,144,239,222,189, 27,114,185,220,185,227,247,223,127,119,157, 71,203,219,188,
- 13,218, 19, 39, 78,220, 50,124,248,240,109,115,230,204,233,236, 58,138,105,203,150, 45, 0, 96,106,134,176,229, 94,184,112,161,
-255,176, 97,195, 62,141,136,136,184,177,180,180,244,157,230,140,120, 97, 97,225, 43, 93,187,118,157, 94, 87, 87,167,213,235,245,
-163, 64,231,206,162,184,118, 81, 8, 96,244,129, 3, 7, 62, 60,112,224,192, 91, 0, 8,128,247, 1,156,184,222, 18,130, 10, 45,
- 10, 10,138, 63, 27, 99,159,124,242, 73,247,206,226,251, 0,252,159, 15,145, 37,226, 82, 65, 65, 65,159, 59,239,188,243, 57, 52,
- 30,157, 40,118, 78,111, 14,228,154,205,230,161,238, 35,165,154, 9, 75, 74, 75, 75,151,208, 44, 64,113, 29,225, 24,128, 7,175,
-231, 4,160, 66,139,130,130,226,207,198, 57, 0, 79, 92,197,249, 90,120,158,103,139,130,130,130,226,111, 7,186,168, 52, 5, 5,
- 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20,255, 44, 48,240, 62,114, 32,187, 9, 60, 87, 50,162, 33,155,114,
- 82, 78,202, 73, 57, 41, 39,229,164,156,215, 29,167, 63,238,108, 80,180,168, 0,163,156,148,147,114, 82, 78,202,249,207,230,100,
- 28, 27,235,216,196,223,127,231,184, 51,127,227,184, 95, 47,156,215, 36,254,170,206,240,226,141, 16,208, 48,228,147,226,239, 7,
-215, 2, 66,232,125,162,160,160,104, 98,221, 33,113,121,216,218, 29, 27,254,134,117,137,171, 40, 16,174,242,185,212, 18,113,191,
-158, 57,175,121,161,117,163, 74,165,154, 44,147,201, 82, 24,134,177,235,116,186, 35, 38,147,105, 62,128, 93, 87,121,205,175,162,
-163,163,199, 86, 85, 85, 9, 44,203,130,101, 89, 48, 12, 3,150,101,193,243,188,161,182,182, 86,115, 37,164,145, 93, 70,188,202,
- 49,204, 11,118, 98,159, 95,126,116,213, 52,127,251, 41,124, 23, 24,169, 84,122, 95,120,120,120,104, 69, 69, 5, 97,217,134,174,
-124, 18,137, 68, 92, 8,215, 86, 91, 91,251, 77,160,100, 97, 97, 97,123,195,195,195, 67,197,243, 25,134, 65, 85, 85, 85, 77,121,
-121,249, 77, 0, 16, 20, 20,180, 67,165, 82, 69,112, 28, 7,137, 68, 2,137, 68, 2,189, 94, 95, 85, 85, 85,117, 11,189, 21,255,
- 76, 44, 95,190, 92, 50, 44,254,137,118, 28, 49,116, 99, 89, 18, 34, 8, 76,173,141, 81,252,190,254,194, 87,103, 2, 57,127,212,
-168, 81,118,154,138,127, 30,100, 50,217,236,232,232,232,127,215,215,215,235, 25,134, 33, 12,195,128, 97, 26,222,179,220, 63,237,
-118,123,113, 85, 85, 85, 79, 63, 15, 91, 94, 38,147,205,140,137,137, 25,163,215,235,245, 14, 62,143,188, 0, 96,181, 90,139, 43,
- 43, 43,123, 6, 84,215, 71, 70,206, 87, 40, 20,143,234,245,122, 29,195, 48,130,235,127,132, 16,215,135,249,217,202,202,202,126,
-254,132,129, 76, 38,251, 52, 58, 58,250, 95,142,184, 59,195,121,181,113,143,142,142, 30,163,211,233, 2,226,244, 17,247,203, 56,
- 91, 34,156,127, 83,206,107, 95,104,165,167,167,127,183,103,207,158, 14, 60,207, 3, 0,140, 70, 99,215,185,115,231, 62,246,198,
- 27,111,100, 1,152,120,133,215, 91,216,175, 95,191,135,114,114,114,216,149, 43, 87,178,189,122,245, 2,195, 48,176,219,237,176,
-219,237,232,210,165,139,226, 74, 35, 18,162, 82, 78, 56,184,241,191, 65, 55, 14,121,242,133,114, 96,154,191,253,190, 4, 38,128,
-183, 1,164, 52, 49, 8, 21,142,116, 57,232, 69,108,236,100, 89,182, 73,156,130, 32,228, 95,186,116,169,143, 15, 1,211,236,156,
- 14,145,117,127,191,126,253, 66,178,179,179,153,162,162, 34, 70,161, 80, 64, 16, 4,216,237,118, 88,173, 86,220,112,195, 13, 77,
-114, 66, 67, 67, 67, 53, 19, 38, 76,104,119,199, 29,119,224,135, 31,126,192, 99,143, 61,134,190,125,251,230,149,151,151, 3, 0,
- 84, 42, 85,196,241,227,199, 59,132,135,135, 67,175,215,163,182,182, 22,183,221,118, 27,170,170,170,254,209,133,235,230,244,132,
-247, 25,150,113,206, 21, 69,108,246,234, 61,191,151,188,125,181,188,225,225,225, 7,229,114,121,180, 95,181,236,242, 32, 51, 26,
-141,101,213,213,213,221,253,156,146, 4,224, 46,137, 68,210,158,227,184,142, 0,146,108, 54, 91, 52, 0, 72,165,210, 50,137, 68,
- 82,104,181, 90, 79,153,205,230,211, 0,126,129,143, 5,144,135,197, 63,209,142,177,233, 71,214,153,132,225,202,182, 89,169,250,
-179, 19,114,149,114,253,218, 97,241, 79,172, 8, 84,108,253,133, 72, 5,176, 12, 13, 11, 74, 63,141,134,121,128,174, 6,241, 0,
-238, 70,195,154,143,201, 22,139,165, 18,192, 1, 52,244, 67,201, 3,144, 24, 25, 25,185, 68, 16, 4, 83, 85, 85,213, 19,240,176,
- 80,117,239, 30,173,247,179, 44,155, 32,122, 2, 2,177, 23,239, 62, 80,220, 44, 15, 40,150,101, 63,205,204,204,252,215,138, 21,
- 43,148, 7, 14, 28, 80,118,238,220,217,249, 66, 36, 8, 2, 26,107, 23, 32, 57, 57,217,159,171,193,177, 44, 59,123,228,200,145,
- 15, 47, 94,188, 88,121,238,220, 57,101, 92, 92,156,147,211, 85,108,137,136,139,139, 11, 52,239,127, 53,116,232,208,209,139, 22,
- 45,226, 87,173, 90,165,104,213,170, 21, 34, 34, 34, 32,149, 74, 47, 59,246,150, 91,110, 17,252, 71,157,253,244,158,123,238, 25,
-253,253,247,223, 43,247,236,217,163,236,210,165, 11, 36, 18,201, 85,199,125,196,136, 17, 15,127,247,221,119,202, 35, 71,142, 40,
-219,183,111, 15,209, 84,112,231, 99, 89, 22,173, 91,183, 14,136,243,238,187,239,126,120,217,178,101,202,131, 7, 15, 42, 59,118,
-236,232, 76, 79, 66,200, 21,135,243,111,206,121, 93, 56, 90, 50,139,197,130,173, 91,183,130,101, 89,132,135,135, 99,236,216,177,
-216,184,113,227,132, 77,155, 54,173,190, 2,103,235, 43,135,200,226, 1,224,199, 71, 71, 32,159, 7,198,149,155, 33,149, 74,113,
-246,236, 89, 72, 36,146, 38, 91,139,114,185,124, 12, 33,100,146,254,194, 62,185,193, 96,133,177,100,191, 82,161, 80, 56, 31, 0,
-250, 18,199,254,139,251,149, 10,133,226,172, 68, 34,153, 90, 95, 95,191,208, 27, 95,251,246,237,191, 61,118,236, 88, 39, 79, 5,
-215, 23,244,122, 61,218,180,105,147, 88, 93, 93,221,222,211,255, 60,207, 39,156, 59,119, 46, 74, 38,147,129, 16,226, 44,196,238,
-159,226,119,139,197,130, 27,110,184,193,226,235,154,190, 56,109, 54, 27,130,130,130, 32,186, 81,102,179, 25,245,245,245,254, 56,
- 25,169, 84,122,159, 40,178, 0, 96,233,210,165,136,137,137, 65, 84, 84, 20, 84, 42, 21, 20, 10,133,147, 51, 80, 72, 36, 18, 12,
- 27, 54, 12,239,190,251, 46,178,178,178,240,218,107,175, 53,170,104,121,158, 71,120,120, 56,214,173, 91, 7,141, 70,131,196,196,
- 68,136, 2,255, 31,109, 11,178, 76,248,174,253,231,157, 14,237,237,183,118,226,110,238,206,125,238,120, 84,130,101, 1, 65,104,
-120,116, 50, 12,136,205, 42, 92,218,127,164,228,157, 0,210, 51,174,176,176, 48, 42,208, 52,178,217,108,136,139,139,147,248, 57,
-108,120, 90, 90,218,143,207, 62,251,172,180,125,251,246,140, 84, 42, 5,199,113,224, 56, 78, 20,232,137,132,144, 68, 65, 16, 6,
-150,149,149,145,185,115,231,126,184,101,203,150,123, 1,172,245, 88,177, 16, 67,183, 58,147, 48,124,219, 33,220, 52,114,200, 27,
- 88,183,124,194, 77,253,210, 5, 4, 43, 13,103, 0,252,157,133, 86,106, 90, 90,218,161, 61,123,246, 4, 89, 44, 22,244,238,221,
-123,119,110,110,110, 15, 92,217, 12,238, 97, 0, 62,153, 56,113,226,232,103,159,125, 86, 18, 26, 26, 10,153, 76,134,186,186, 58,
-156, 57,115,102,204, 55,223,124, 67,190,248,226,139,255, 3, 16, 92, 88, 88,152,177,119,239, 94, 12, 26, 52,232, 69, 0, 47, 95,
-174, 8, 36, 9, 59,246, 22, 68,137,191,239, 30,214, 85,154,209,147, 45,107,112,113,220,143, 38, 16,236, 66,241,222,195, 23, 2,
- 17, 98, 31,142, 24, 49,226,145, 21, 43, 86,168, 1, 96,222,188,121,184,239,190,251, 16, 30, 30, 14,165, 82, 9,169, 84, 10,158,
-231, 27,125,250,121,216, 74, 0,124,248,224,131, 15,142, 92,188,120,113, 48, 0, 44, 94,188, 24, 35, 70,140, 64, 68, 68, 4,130,
-131,131, 33,147,201, 32,145, 72,154,156,152,225,225,225, 95,245,189,233,166,199, 23, 45, 90, 4, 0,120,235,165,151,112,199,205,
- 55, 67,173, 84, 64,169,144, 65, 76, 11,153,132,199,237,227, 94,240,171, 47, 1,124,124,223,125,247, 61,240,253,247,223, 7, 3,
-192,129, 3, 7, 80, 94, 94,142,232,232,104, 40, 20, 10,200,100, 50,103,156, 25,134,129, 66,161, 8, 40,238,247,221,119,223,200,
-239,190,251, 46, 24, 0, 22, 46, 92,136, 97,195,134, 57,227, 46,151,203, 33,149, 74, 27,109,238,162,211, 19,231,189,247,222, 59,
-114,217,178,101,193, 0,240,205, 55,223, 96,200,144, 33, 8, 11, 11,115,166,167,200,213,148,123,244, 55,231,188, 62,132,214,161,
- 67,135,238, 87,169, 84, 51, 0, 68,202,100,178,208,135, 31,126,184,245,227,143, 63,142, 7, 31,124, 16,155, 54,109,122,170,137,
- 66,139,137,142,142, 30,155,147,147,227,124, 66,155,201,101,130,169,201, 15,112, 7, 38,237,127,234,169,152,172, 51,245,216,189,
-247, 20,130,192, 50,123, 63,254, 56,210,120,250, 52,236,102, 51,222, 59, 91,215,176,223, 70,152,173,175,140,139,185,113,246,255,
- 77, 2,176,208,135, 11, 32, 55,153, 76,200,203,203,107, 82, 32,138,138,138, 32, 8,130,201,151,187, 32,149, 74,113,244,232,209,
-203, 84,189, 39, 36, 38, 38,250, 42,128,126, 57,215,175, 95,143,241,227,199,227,212,169, 83, 16,151, 42, 9,128,147, 9, 15, 15,
- 15, 21, 69,150, 40,130, 20, 10, 5,120,158,103, 56,142, 99,196,166, 61, 71,225, 10, 72, 24,179, 44,139,111,191,253, 22, 31,124,
-240, 1, 94,127,253,117,204,159, 63, 31,221,186,117,251, 35, 19,114, 28,180, 90, 45,194,194,194, 16, 22, 22,214, 72, 32,254,147,
-225,126,155,103,206,154,163,132, 64, 26, 58,129, 16, 1, 16, 0, 2, 2,129, 8, 40,187,112, 6,147,223,253, 40,224,167, 15,207,
-243, 56,125,250,180, 51, 31,136,206,176, 40,140, 92, 93,131,164,164, 36,191,121, 73, 42,149, 78,249,249,231,159,101,223,126,251,
- 45,190,255,254,123, 48, 12, 3,185, 92, 14,149, 74,133,208,208, 80, 68, 68, 68, 56,183,132,132, 4,230,127, 61,184,254,121, 0,
- 0, 32, 0, 73, 68, 65, 84,255,251,159,180, 91,183,110, 83,180, 90,237, 90,207,247,156,132, 40,219,102,165,142, 28,242, 6, 0,
- 96,228, 27, 4,151,242,166,221,200,214,188,243,119, 94, 68, 54,181,107,215,174,219,119,238,220, 25,164,215,235, 33, 8, 2,214,
-174, 93,171, 28, 50,100,200,182,130,130,130,126, 77, 21, 91, 73, 73, 73,171,118,238,220,121, 75,100,100, 36,106,107,107,161,213,
-106, 97,181, 90, 33,145, 72,144,152,152,136, 15, 63,252,144,185,231,158,123,158, 31, 51,102,140, 81,161, 80,136,206, 70,146,231,
-188,212, 56, 51,205,253,236,243, 80, 66, 26,242, 15, 17, 72,163,207,234,242, 66,188,244,202,228,128,194,216,186,117,235,167,127,
-248,225, 7,181,171,179,228, 42, 2, 92, 69,150,184,249, 17, 6,108,155, 54,109, 30, 95,178,100,137,147,179, 85,171, 86,224, 56,
- 14, 60,207,131,227, 56,176, 44,139,109,219,182, 97,198,148,137, 8,139,140,195,156,207,230,249, 13,103,100,100,228,252, 97,195,
-134, 61,186,112,225, 31, 85,119,215,182,109,113,231, 45, 55, 35,170,149, 6,173,194,130, 27,210, 73, 96,240,251,169, 2,191,207,
- 35, 0,108,235,214,173,159, 88,190,124,185,218,245,133, 80,140,171,248,242, 44,186,248,102,179, 25, 61,123,246, 12, 40,238,174,
-156,162,219, 38,138, 54, 49, 61,197,235,136,229,213, 79, 56, 31, 23,133,176, 67,112, 54,226,224,121, 30,203,215, 45,242,234,102,
- 95, 41,103, 83,239,187, 59,103, 97, 97, 33,166, 79,159, 14,241,165,205,181,171, 80,124,124, 60,230,204,153,227,183, 94,114, 43,
- 3,189, 0, 68,186,236, 50, 3,144,185,124, 86, 48, 12,179,207,195,113,226,126,222,209, 98, 21,137,134,126, 99,117, 0, 66, 61,
-240,121,227,169,116, 60,243, 34,221,142,111,116, 29,175, 66,107,245,234,213, 98, 41, 30,152,153,153,185,213,241,189, 70, 46,151,
- 23, 41,149,202, 24, 0,117,107,215,174,197,127,254,243, 31, 56,172,213,187, 67, 66, 66,142,121,112,117, 14,153, 76,166, 55, 0,
-148, 57,118,137, 67, 52,217,234,234,106, 97,227,198,141,236,226,123,135,194, 76,128,244, 73, 51, 48, 44, 51, 19,235,227,101,144,
- 0,184,233,100, 37,148, 74, 37,167,213,106,173,174,253,182, 60,244,221,202,118,203, 80,146, 32,142, 67,239,237,107, 48,126,251,
- 26,220,164,146,161,106,197, 50,212,237,200, 1,203, 50,232,175,106,133,215, 30,217,136, 62, 26, 57,100, 38, 29, 88,150,245,148,
-179,157,156,121,121,121,163, 52, 26,205, 12,183, 4, 14, 4,249,104, 88,199, 9, 94,194, 9, 66, 8,186,117,235, 6,134, 97,156,
-110,129,184,137,133, 78,220, 14, 30,244,216, 2,233,149,211,209, 4, 7,149, 74,133,223,126,251,205,121,204,224,193,131, 97, 52,
- 26, 17, 30, 30, 30, 16,103, 69, 69, 5, 41, 41, 41, 97, 22, 47, 94, 12,158,231, 17, 17, 17, 1,165, 82,201, 44, 90,180,104,162,
- 84, 42, 77, 48, 26,141,130,217,108,134, 76, 38,155, 35,222, 31,142,227,116, 90,173, 54,194, 27,167, 68, 34,193,179,207, 62,139,
- 87, 95,125, 21,243,231,207,199, 83, 79, 61,117,153,227,101, 52, 26,209,170, 85, 43,167,216,242, 80, 0, 91, 98,184,111,203,114,
- 10, 4,199, 14,174,199,241, 35,217, 16,236, 2,236, 2, 1, 33,118, 8, 54,224,192,198,221, 29, 46,230,151,196, 19,144,134,174,
-183, 0,228,181,245,182, 1, 17,178,142, 0, 86,110,173, 50,207,246, 23, 78,142,227, 96, 52, 26,241,243,207, 63,227,228,201,147,
- 88,187,118, 45, 12, 6, 3, 90,181,106,133,208,208, 80,220,124,243,205, 24, 51,102, 12,146,146,146,252,198,157, 16,178,176,168,
-168, 40,189,111,223,190, 76, 77, 77, 13,106,106,106, 96, 48, 24, 96,183,219, 97,179,217,192,113, 28,130,130,130,160, 80, 40, 16,
- 29, 29, 13,163,209, 72, 76, 38,211, 66,111,156,130,192,212,234,207, 78,200, 93,183,124,194, 77, 35,223, 32, 88,241, 1,131,118,
-109,228,250,223,246, 7, 63,190,114,251,107,183, 1, 32, 2,113, 90, 11,196,106, 23, 42, 95,157,248,201,243,127,250, 61,186, 92,
-100, 69, 24, 12, 6,212,213,213, 53,216,250, 50, 25, 86,172, 88,209,234,174,187,238,202, 41, 41, 41,233,239, 67,108, 93,198, 25,
- 28, 28,156, 40,145, 72,112,244,232, 81,124,241,197, 23,248,237,183,223, 80, 86, 86,118, 41, 46, 46, 46,100,224,192,129,236, 75,
- 47,189,132,244,244,116,124,253,245,215, 65,254, 56, 9, 33, 40,204,219,134,194,211,219, 33, 8, 13,174,117,195,230,249, 59, 9,
- 48,238, 58,157,206,120,232,208, 33,245,151, 95,126,137,168,168, 40, 36, 39, 39, 67,169, 84, 34, 40, 40,168,209, 67,214,245,193,
-235,175,108, 26, 12, 6, 99, 97, 97,161,250,187,239,190, 67, 68, 68, 4,146,146,146,160, 84, 42, 33,147,201,192,113, 28, 24,134,
-193,226,197,139,177,244,221, 71, 80,120,234, 8, 70,220,121,155,223,112, 42,149,202, 71, 23, 46, 92,216,200, 2,137, 14, 11, 3,
-199,179,144,240, 12,194, 6,223, 11, 0,184,180,233, 39, 95,179, 67,186,114, 50,117,117,117,198, 61,123,246,168,247,239,223, 15,
- 65, 16,144,148,148, 4,189, 94, 15,141, 70,227,140,255,198,141, 27,113,207, 61,247,224,219,111,191, 69, 70, 70,134,223,184,215,
-215,215, 27,143, 28, 57,162, 94,178,100, 9,194,195,195,209,186,117,107,103,220,197,141,231,121, 72, 36, 18,164,164,164,160,182,
-182, 22,106,181,218,239, 61, 58,112,224,128,122,201,146, 37, 8, 11, 11, 67, 66, 66,130,211,113, 19,197,209, 7,159,191,219,136,
- 32,136,137,189,106,206,166,222,119,119,206, 17, 35, 70,160, 93,187,118,208,104, 52, 80,169, 84, 78,110, 95,156, 94,180,136, 83,
-111, 51, 12,179,218,165, 76,100, 50, 12,179,218,245,211,219,113,142,175,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119,
- 59,119,238, 92,234,141,207, 27,207,196,137, 19,211,178,178,178,166,187, 30,239,225, 58,222, 29,173,204,204, 76,198, 17, 73, 6,
- 64,114,143, 30, 61,246,109,218,180, 41, 60, 56, 56,216,121,240,249,243,231, 81, 83, 83,131,224,224, 96,205,204,153, 51, 53, 3,
- 7, 14, 68,116,116,180,243, 13, 32, 47, 47,239,134,212,212, 84, 45, 0,119,223, 86, 96, 89, 22,125,250,244,193, 49, 71,107,199,
-176,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,249,231,159,103,198,143, 31,207,137,110, 6, 33, 4, 6,131, 1,177,177,177,
- 10, 95,174, 14, 0,164, 25, 42,241,211,192,254, 96, 25, 64,127,112, 47,164, 50, 6,172,132, 65,119, 82,133, 95, 7,245, 7, 3,
-192,124,120, 23, 2,112, 97, 14, 2,184,173,101, 28, 14,130, 51,103,206, 4,228,104, 57,226,197, 92, 41,167,232,104,236,220,185,
- 19,118,187, 61, 80, 78,194,178, 44, 84, 42, 21, 98, 98, 98,160, 80, 40,160, 84, 42,153,239,190,251,238,237,228,228,228,216,241,
-227,199,179, 90,173,150,237,211,167, 15,238,187,239, 62, 78,108,226, 76, 75, 75,243, 27,151,173, 91,183,226,139, 47,190,192, 83,
- 79, 61,229,209,209, 98, 24, 6,145,145,145,208,104, 52,184, 86, 32, 0,176,216,172,208,215, 27,156, 77,186,118,187, 29, 71,182,
- 28,238,144,127, 56, 47,109,245,119,223,242, 0, 96,220,242,147,235,105,177,247,125,190, 44,117, 64, 24,191,103,235, 37,235, 30,
- 95,121,158,227, 56,140, 29, 59, 22, 89, 89, 89,120,244,209, 71,177,118,237, 90,188,243,206, 59,248,247,191,255,125,153,171,229,
-239,205,209,106,181,254,247,177,199, 30,123,106,197,138, 21, 29,223,120,227, 13, 86,116,180,148, 74, 37, 24,134,129,209,104,132,
-201,100,130,193, 96,192,169, 83,167,132, 39,159,124, 50,215,108, 54,255,215,107,115, 37,163,248, 93, 41,215,175,109,155,192,182,
-211, 21,124, 20,220,247,230, 36, 3,163,232, 81,123,111,234, 16, 50,124,108, 82, 24, 8, 1, 17, 0,129, 0, 38,147, 14,207, 63,
-255,162,228, 47,188, 85, 78,145,101, 52, 26,113,232,208, 33, 12, 26, 52, 8, 69, 69, 69, 56,113,226, 4, 58,116,232,128, 69,139,
- 22, 69, 62,252,240,195, 57,229,229,229,253, 3,117,182,142, 28, 57, 50,241,198, 27,111,252,180,190,190,190,186,190,190,254, 83,
- 0, 75, 1,212,156, 57,115,166,243,153, 51,103,230,174, 95,191,190,223,228,201,147, 37,110,125,116, 36,222,236, 81,171,213, 6,
-131,193,228, 83, 96,137,191, 9, 17, 2,138, 56,195, 48,164, 99,199,142,184,235,174,187,192,243, 60,148, 74, 37,212,106,117,163,
-102, 51,119,193,229,171,254, 0, 32, 48, 12,131,184,184, 56, 12, 31, 62, 28, 82,169,180, 17,167,152, 15,135, 15, 31,142, 23,222,
-155,132,255,190,112, 43,190,120,172, 3,134,188, 95,230, 51,156,122,189,190,126,243,230,205,138, 87,159,122, 10, 55,182,111,143,
- 86, 26, 13,218, 68, 71, 66, 33,151, 65,234, 26, 38, 38, 32,147,157, 0, 16, 36, 18, 9,186,116,233,130,178,178, 50, 20, 20, 20,
-160,160,160, 0, 44,203,162,111,223,190, 78, 23,230,244,233,211,120,239,189,247, 96, 50,153, 2,142,123,251,246,237,113,235,173,
-183, 66, 38,147, 65,169, 84, 54,106, 50, 20,211,180,174,174, 14,237,218,181,195,202,149, 43,145,154,154,234,151,179, 83,167, 78,
- 24, 48, 96, 64,163,244, 84, 40, 20, 78, 81, 4, 0, 69,123,234,157,215,136,143,143,111, 18,231,134,189,231,241,229,198,205, 48,
-153, 5,104,245,214, 70, 39,196,182,210, 96,251,146, 55, 2,138,187,200,185, 96,193, 2,212,212,212, 56,141, 3,241,165, 92, 52,
- 81, 90,183,110,141,121,243, 60, 59,153,110, 90,196,211, 51, 47, 51,192,231,173,120,156,152,185,228, 89, 89, 89,211,221,207,247,
-199,231,250,191,219,249,102, 55,113, 86,214,164,166, 67,185, 92,254,230,230,205,155,195,107,107,107,113,250,244,105,176, 44,235,
-108, 83,231, 56, 14, 22,139, 5,103,207,158, 69,120,120, 56,202,203,203, 33,151,203, 33,145, 72, 96, 54,155, 1,160,187,183, 7,
- 56, 33, 4, 47, 84, 52,116, 17, 90, 23, 39, 69, 33,128, 59, 43, 26, 10,134,216, 33,254,135, 31,126,128, 90,173, 70,112,112,176,
-243,211, 95, 51,210,145,130, 51, 40,227, 25,176,187,182,129, 97, 1,150, 1, 24, 9,192,178, 4, 44,195,128,221,149, 3,134, 1,
- 84, 17, 97, 77,173,128,253,117,140,247,217, 1,222,155,251,228,201,197,114,255,190,101,203, 22, 4,202,217,174, 93, 59,168,213,
-106,231,182,126,253,250, 70,142,150,221,110, 71, 68, 68, 68, 32,156,164,193,141, 16, 16, 21, 21, 5,158,231,153, 69,139, 22, 77,
- 76,249,127,246,174, 59, 60,138,106,125,191, 51,219,119,147,108, 54, 61, 33, 33,148, 0, 82, 34, 77,225,194,165,151, 0, 66,104,
- 34, 69, 46, 4, 17, 81,138,168, 40, 17,129, 31, 42, 32,161, 73,147, 42,200, 37, 32, 72,151, 46, 69,164,131, 5, 20, 36,129, 64,
- 8, 9,164,111,234,246, 50,237,247, 71,118,227,102,179, 73, 54, 33,194, 5,231,125,158,121,118,167,189,115,206,156, 51,103,222,
-243,157,239,124,211,176, 97,200,244,233,211, 73,129, 64,128,235,215,175, 35, 33, 33, 1,245,235,215,119,219,103,171,168,168, 40,
-235,147, 79, 62, 97, 62,249,164,100, 14, 69,100,100, 36,138,138,138,114,237,251, 53, 26, 77,126,159, 62,125,202,248,109,228,229,
-229, 61,219,158,240,182,251, 72, 91,105, 24, 76, 38,232,180,134, 82,235, 80,110,102,142,234,227, 15, 63, 16, 45,155,250, 6, 0,
-224,195,149,107,160,221,248, 87, 67,118,224,195, 81,129, 67,191,220, 53, 19,192,224,202,248,117, 58, 29, 76, 38, 19, 34, 34, 34,
-112,249,242,101,104,181, 90,244,235,215, 15, 4, 65,148,206, 16,173, 6, 44, 25, 25, 25,157,162,163,163,127, 93,177, 98, 69, 68,
-243,230,205, 9,189, 94, 15,131,193, 0,199,223,155, 55,111,114, 59,119,238, 76, 49, 24, 12,255,182,153,206, 93,226, 68,198, 55,
-201,125, 67,223,220,251,227,117, 65,116, 96,163, 36,101, 70, 97, 4,157,159, 33,213,107,140,119, 76, 12,151, 0,142, 1, 24,176,
-224,104, 22,140,109,216,235,105, 65, 46,151,127,117,241,226, 69, 63,147,201,132,107,215,174, 97,204,152, 49,150,188,188, 60, 9,
- 0,252,231, 63,255,177,108,223,190, 93,210,168, 81, 35,108,219,182, 45,224,213, 87, 95,221,163,215,235, 95,116,147,250,219,172,
-172,172,111,157, 55,250,249,249,173,126,248,240, 97,119, 71,159, 31,154,166, 75,147,227,242,193,100, 1,138,162, 96, 52,154, 81,
- 92,172,133,197, 74,217,218, 76, 22, 12, 67,219,126, 89,208,182,118, 84, 34, 22,122,181,125, 49, 88,199,113, 28, 72,130, 40,186,
-246,103,118,221,202, 68,187,171, 33, 46, 55,173, 89,206, 96,236,179,204,252,252,252, 32, 18,137,240,237,183,223,226,198,165, 19,
-144, 8, 56, 48, 52, 5,154,178,130,161, 44, 16, 9, 4,248,241,250, 3, 68, 53,243,114, 75, 16,250,251,251, 99, 64,199,142,136,
-238,216,177,100,122,155, 80, 8, 79,169, 20, 10,177,172,196,146, 5,128, 99, 72,119,131, 8,176,246,116, 6, 5, 5,225,183,223,
-126,195,180,105,211,176,120,241, 98,200,229,242,210,217,207,183,111,223,198,238,221,187, 17, 21, 21, 85,237,188,219, 45,120, 51,
-103,206, 68,102,102, 38, 86,174, 92,137,151, 94,122, 9, 34,145, 8, 69, 69, 69,248,247,191,255,141,156,156, 28,183, 56, 29,135,
-247, 36, 18, 73, 25,235,147, 93, 0, 86,183,140, 28, 57,223, 24, 18,130, 67,151,118,130, 0,129,171, 59, 62, 40, 35, 10,215,239,
-186, 80,109,206,185,115,231,150, 73,167, 59,214, 44,119,225,100,117,170,242, 56,130, 32,174,217,141,173, 51,103,206,156, 69, 16,
-196,145,153, 51,103,206,138,139,139,187,229, 14,159,171,253, 4, 65, 28,181,137,176, 1, 14,219,174, 85, 75,104, 41, 20,138,246,
-158,158,158,184,119,239, 30,250,245,235,103,201,207,207, 79, 18,137, 68, 77,242,242,242,164,185,185,185, 48, 24, 12,186,249,243,
-231, 63, 0, 32,239,208,161, 67,163, 31,127,252, 17,143, 30, 61,194,246,237,219, 1,224,128,107,159, 13, 18, 44,203,150, 86, 10,
-231,110,155, 64, 32,192,149, 43, 87,112,229, 74, 89,215,175,205,155, 55, 87,249,194,120,245,251,195,184,126,253, 58, 28,195, 3,
-216,255, 59,110,147,201,100, 64,229, 51, 60,202,160, 42,199,248,170, 28,224, 93,193, 93,223, 47, 87, 51,115, 42, 66, 70, 70, 70,
-133,231, 95,185,114,165,140, 69,171, 42, 78,129, 64, 0,134, 97, 32,151,203, 9,177, 88, 76,136,197,226, 48,187,200, 18, 8, 4,
-165, 15,140, 84, 42,133, 84, 42, 45,211, 75,173, 8,153,153,153, 61, 50, 51, 51, 43,220,175, 86,171, 59,169,213,106, 60,143,176,
- 82, 20,140, 6, 11,180, 58, 35, 62,143,251,111,201,198,207,241, 51,128,159, 59,189, 51, 13,147,251, 70,245,172,238, 48,181,253,
-126, 7, 6, 6,226,220,185,115, 32, 8, 2,123,246,236,129,183,183, 55,250,246,237, 11,165, 82,137,153, 51,103, 98,248,240,225,
-213,109,204,138,243,243,243, 59,189,255,254,251,191, 46, 93,186, 52,188,110,221,186,176, 88, 44,176, 90,173,176, 88, 44, 72, 78,
- 78,198,206,157, 59, 31, 25, 12,134, 78, 0,138,171, 34, 59,145,241, 77,242,254,243, 31,102,246, 30,249,170,241,118,206, 15,200,
-206,206, 7, 77,103,128,101,104, 88,105,166,196,194, 71,211,160,105, 6, 98,177, 64,185,244,139, 15, 78,177,224, 64,146,132, 5,
-192, 43, 79,170,140, 84, 42, 85,164, 90,173,198,221,187,119, 17, 19, 19,147,157,159,159,159, 8,160, 23, 0,228,231,231, 95, 28,
- 51,102, 76,243,248,248,248,224, 6, 13, 26,192,211,211, 83,169,215,235,171,162,244, 4, 48, 25, 64, 31,148,248,129,216, 81, 0,
- 96, 62, 73,146,210,107,215,174,149,155,105,119,254,252,121, 0,248,217,117, 15,200,102,209, 50,153,160,206, 47,196,132,119,230,
-252,213, 51, 2, 87, 70, 92,112,224, 48,233, 93,200, 0, 32, 47, 39, 25,111, 76,152, 38,173,170, 67,224,234, 69, 88, 13, 31,157,
- 50, 29, 53,123, 29,245,244,244, 44, 25,126, 59,184, 19, 71,191,124, 7, 96,172,224, 40, 35, 96, 53, 0, 86, 29, 88,139, 1,132,
- 88, 14, 80, 70,183,132,150,167,167, 39, 60,229,114, 4,170, 84,224, 56, 14, 66,129, 0, 34,145, 16, 44, 5, 16, 12, 81, 42, 72,
- 89,247, 2,131,148,118, 42,229,114, 57, 82, 83, 83, 49,121,242,100, 88,173, 86, 12, 25, 50, 4, 22,139, 5, 38,147, 9, 70,163,
- 17, 13, 27, 54,132,193, 96,112,139,207, 62, 91,209,211,211, 19, 98,177, 24, 31,124,240, 1, 94,126,249,101,204,155, 55, 15,177,
-177,177,104,216,176, 33, 38, 77,154,132,157, 59,119, 34, 50, 50,178, 42, 94,206,177,140,236,247,211, 46,182, 28,135,248, 0, 84,
-187,140,156, 57, 9,130, 44, 35,216,236,203,123, 99,123, 85,155,115,209,162, 69, 80,171,213,229, 44, 89,246,255,161,161,161, 88,
-183,110, 93, 77, 71,134,236,214,163, 32, 23,251, 6, 56, 91,162, 56,142,107,103,243,157, 50,199,197,197,221,138,139,139,139, 38,
- 8,226, 72, 92, 92, 92,116, 69, 22, 45, 87, 60, 46,246,187,253,210, 18, 58,141,141,118,119,220,105,191,209,190,190,190,130,240,
-240,112, 82,169, 84,162,168,168, 8, 1, 1, 1,156, 90,173, 30,169, 80, 40, 62,251,238,187,239, 26,233,116, 58,220,190,125, 27,
-171, 87,175,254, 25,192,170,202,132,214,177, 0,155,233,216,102,201,114, 92, 31, 56,112, 32, 26, 52,104, 80,198,154, 37,151,203,
- 43,173, 60,246,125,118,139,144, 64, 32,192, 11, 47,188, 32, 79, 73, 73, 49,138,197, 98,132,133,133,201,179,179,179,141, 98,177,
-184,218, 51, 93,170,114,140,175,202, 1,222,149,240,105,215,174, 93, 25, 11,150,227,175,227,255, 67,135, 14, 85, 57,116,104,231,
-108,222,188,121,233,253,242,242,242,178,159, 11, 0,232,215,175, 31, 88,150,133,191,191,191, 91,156,118, 81,107,115,128,135,201,
-100, 98,181, 90, 45,121,237,218, 53, 72, 36, 18,120,121,121,149,250,234,200,100,178, 82,107, 38, 15, 87, 13, 2, 11, 11, 69,193,
-104, 52, 66,167,211, 1, 0,146,255,220, 87, 86,136,153, 53, 53,230,183, 55,176, 5, 5, 5, 56,113,226, 4,126,248,225, 7,188,
-252,242,203, 46, 69,117, 53, 4,151,186,160,160,160,243,140, 25, 51,174, 46, 88,176,160,142,175,175, 47,172, 86, 43, 30, 62,124,
-136, 45, 91,182,100, 26, 12,134,206,213,105, 96,192, 1, 20, 69,195,100, 48,163, 88,163,197,103, 95,108,173,176,234, 1, 64, 65,
-238, 29, 12, 28, 52, 92,242, 36,203, 41, 51, 51,115,122,231,206,157,191,208,106,181, 69, 6,131, 97, 56,128,101,142,253,169,252,
-252,252, 46,131, 6, 13, 90,225,235,235,251, 82,110,110,238, 44, 55, 40,103,166,166,166,206,170, 87,175, 94,153,141,102,179, 25,
-245,234,213,123, 33, 55, 55,119,116,215,174, 93,255, 15,128,175,195,110, 47, 0, 39, 1,172,171,168, 46,217,135, 14,117, 58, 35,
-148,170, 16,100, 60, 56, 87,101, 66,196, 2, 19, 56,150,173,180, 13,177,119,128, 43, 90,170,152, 25, 87, 46,169,246, 99,237, 47,
-236, 87,134,141,197, 43,147, 23, 65, 33, 2, 22,190,209, 9, 13, 85, 0,228,190, 16,119,253, 24,132,202,118,143, 38, 31,118,139,
- 60,118,195, 6, 92,183,181,199, 97, 1, 1,152, 49,114, 36, 56, 10,184,156,144,128, 93, 63,253,132,145, 61,122, 64, 33,147,185,
-221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,124,249, 50,154, 53,107,134,123,247,238,149, 9, 67,193,113,156,187,249, 47,205,
-187, 84, 42,133, 72, 36, 66,118,118, 54,162,163,163, 33, 22,139,177,117,235, 86,156, 59,119, 14, 51,102,204,192,248,241,227,209,
-189,123,119, 36, 38, 38,186,197,201,113, 92,185,217,138,206,195,185,213, 45, 35,103, 78,231,247,126, 77,202,221,206,185, 96,193,
- 2,151, 19, 42,220,225,116,165, 69, 92,148,221, 53, 71, 49,100,183, 60, 57, 10, 35,231,117, 0, 62,246,109, 51,103,206,156,229,
-238,121,142,235,118,139, 88,117,134, 48, 75,133, 86,116,116,116,153,156, 23, 20, 20, 92,189,122,245,106, 11, 15, 15, 15,220,185,
-115, 71,162, 84, 42, 91,216, 27,116,146, 36,177,103,207, 30,175,254,253,251,159, 90,182,108, 89, 24,203,178,200,201,201,193, 71,
- 31,125,164,163,105,122, 20, 0,186,162, 23,120, 85,150,169,195,135,203, 63,108, 7, 15, 30,116,107, 8,196, 46,164,132, 66, 33,
-124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193, 0, 15, 15, 15,251, 88, 49,137,191,102, 42, 84,101,125,170,202,
- 49,222,217, 1,190, 74, 36, 36, 36,184,117,156,109,168,213,173, 90,158,154,154, 90, 97, 67,114,238,220, 57,176,182,134,214, 93,
- 78, 91, 47,143,179, 11, 63,133, 66, 1, 95, 95, 95, 72,165, 82,200,229,242, 50, 34, 75, 42,149, 86,249,224, 84, 21,144, 84, 38,
-147,253,226,225,225,161,178,239, 23,137, 68,208,106,181, 69, 5, 5, 5,237,159,233,161, 67,112,160,173, 52,140, 70, 19,116, 90,
- 99,173,243, 91, 44, 22, 72,165, 82,236,220,185, 19,157, 58,117, 66,135, 14, 29,202,137,172, 26,154,231,211, 11, 10, 10,186,175,
- 90,181,234,231,229,203,151,251,232,116, 58,252,247,191,255, 45,214,233,116,221, 1,164, 87, 75,108,178, 28, 40,171, 21, 6,147,
- 25,122, 93,201, 61,184,127,107,223,255, 90, 81,237,204,206,206,222, 89,201,254,251, 52, 77, 71,219,227,190,185,129,127,213,171,
- 87, 15,217,217,217,101, 54,166,165,165,129, 97, 24, 51, 74,226,100,189,233,104, 72,198, 95,209,179, 43,234,197,151, 88, 71,141,
-102,232,116, 37, 86, 16,147, 62,175,118,234,169, 77,108, 84,228,147, 85,147, 58, 68, 16, 68,169,211,247,212,169, 83,113,243,198,
- 13,244,170,163, 65,195, 96, 47,112,154, 12,136,123,126,138, 63,212,114, 44, 91,113,172,218,220,187, 29, 92, 32,150,237,222,237,
-114,223,253,193,131,171,149,247,164,164, 36,200,229,114, 48, 12, 83,238,125, 83,221,252, 59, 10,152, 21, 43, 86, 96,198,140, 25,
-216,186,117, 43,110,222,188,137,214,173, 91,163,119,239,222,200,205,205,197,141, 27, 55, 96, 54,155,221, 78,167,163,223, 92, 82,
- 74, 2, 78, 95, 62,142,180,244, 7,200,204,126, 84,227,114,119,228,116, 22, 90,251, 79,255,142, 97, 81,109,107,196,249,217,103,
-159, 33, 55, 55,183,140, 37,203,177, 93,170,200,162,229,172, 69,156,144,231,228, 11,101, 95,183, 56,137, 30,231,117,231,227, 1,
- 32, 23,128,160,138,243,156,215,243,226,226,226,206,218, 45, 97, 54, 94, 65, 85,254, 89,101, 44, 90, 78, 88, 52,120,240,224, 65,
-171, 87,175, 14,144,201,100,165, 51,144,102,206,156,137, 25, 51,102, 32, 34, 34, 2,254,254,254,161, 42,149, 10,249,249,249, 88,
-188,120, 49, 82, 83, 83, 39,194, 69,160, 61,103,161,213, 37, 69, 11,137,228,175, 14,171,221,178, 5, 0,227,199,143, 47,103,209,
-178, 23, 80,101,160, 40, 10,126,126,126, 48, 24, 12, 16, 8, 4, 24, 50,100,136,224,207, 63,255,100,250,246,237,139,161, 67,135,
- 10,110,220,184,193, 12, 24, 48, 0, 2,129, 0, 61,123,246,212,236,223,191,255, 67, 0, 95,186, 33,182,106,205, 49,222, 94,201,
-220,141,125,228,142,184,172,140,147, 32, 8, 24, 12, 6, 8,133,194, 82, 71,121,119, 56,237, 67,135,142, 15, 32, 73,146, 80,169,
- 84,165,141,135,221,162,101, 23, 90, 85,241, 86, 21,144, 84,161, 80, 40,239,220,185,211,200, 62,241, 34, 47, 47, 15, 61,123,246,
-188, 91, 80, 80,240,108,155,180, 88,192, 74, 51,208, 25, 77,208, 25, 13,181, 70,107,127, 30, 54,110,220,136,196,196, 68,152, 76,
- 38,124,245,213, 87,165,147, 10, 28, 69,214, 99, 8,174,100,185, 92,206,246,235,215, 15, 87,175, 94,133, 84, 42,165, 80,131,248,
- 87, 44,199,194, 74,211, 48, 25,141,208, 85, 61,228,246,188,160, 84, 85, 39, 38, 38,194, 98,177, 96,222,188,121,204,175,191,254,
-122, 22, 37, 1, 80,237, 22,188,209,221,186,117,155,239,225,225,161, 58,122,244,232,123, 0,182, 86,246,242,166,104,155,104,175,
-197,251,232, 56, 34,224,202, 39,171, 38, 97, 86, 28, 95,172, 44,203, 98,226, 91,111,161,119, 29, 13,134,190, 20, 0,125,214, 93,
- 40,188, 3, 64,168,234, 99,217,138, 99,184,149,226,182, 43, 38, 7, 0,253,186, 13, 70,171,102,229,195,131,117,238, 85,210, 39,
-187,248,227, 47,200,201,203,172,118,222,245,122,125,133,150,171,106, 88,180, 74,159, 57,251,253,107,211,166, 13,154, 52,105,130,
-179,103,207,162,109,219,182,184,119,239, 30,238,221,187,135,212,212, 84,220,188,121, 19,133,133,133,213, 46,163,239, 79,238, 66,
-161,182, 0, 18,177, 4, 5, 69,121, 72,203,120,128, 32,191,224,199, 46,119, 59,154, 14,248, 12, 0, 80, 39,192,187, 90, 66,203,
-145,115,201,146, 37,229,196,251,227,134,236, 33, 8,226,151,202,214,171,123,254,147, 68, 69, 66,235,129, 90,173,238, 48,114,228,
-200,153, 0,218,217,182, 21, 3,216,125,234,212,169,193,129,129,129, 61, 58,118,236, 40,148, 72, 36,184,124,249, 50,246,239,223,
-191, 21,192,174,202, 46, 36,145, 72,140,245,235,215,151,219, 43,162,253, 65, 84, 42,149,130,197,139, 23, 19,155, 55,111,174,208,
-202, 85, 85, 1, 21, 23, 23, 67,175,215,195,219,219, 27, 86,171, 21,253,250,245, 99, 18, 19, 19, 33, 22,139, 49,104,208, 32, 38,
- 33, 33,161,180,160, 55,109,218, 20,102, 52, 26,255,253,195, 15, 63,244, 1,208,181, 26,247,202,238, 24,239, 9, 55, 29,224, 43,
-234,229,185, 3,119,135,227, 42,226,156, 54,109, 90,141, 56,197, 98, 49,109,143,252, 78,146, 36,172, 86, 43,218,182,109,139,220,
-220,220,210,135,198,195,195,163, 84,100,185, 35,180,170, 10, 72, 42, 20, 10, 97,177, 88,208,181,107, 87, 16, 4,129, 53,107,214,
- 60, 31,195,145, 44, 75,120,122,250,161, 78,157, 23, 16, 16,104, 2,203,214,238, 87,101, 98, 99, 99,203,136, 41, 87,145,151,237,
-247,191, 38,176,115,185, 51, 75,182,178,183,163,125,200, 75,175, 55, 61,115, 69, 24, 24, 24,216, 33, 55, 55,247,160,211,230, 2,
- 0,243, 43,233, 88,150, 22,244,163, 71,143,208,183,111, 95, 28, 63,126, 92,112,224,192,129, 94,135, 14, 29, 74,184,123,247,238,
-163,182,109,219,214,125,251,237,183,165, 93,187,118, 69, 94, 94, 30, 94,122,233,165,207, 51, 50, 50, 42, 17, 90,182,251,104, 50,
- 67,175,175,125,235,168, 43,107,214,227,188, 24,237,117,114,238,220,255, 67,239,144, 34, 12,105,237,141,248, 35,151, 48,186,141,
- 28,176, 72,171,205,103, 79,139,111,157, 6,168, 31,217,161,220,126,169,178, 36,150,107,253,200, 14, 32, 31,221,171,118,222, 29,
-211,236, 44,170,106, 98,209,115,188,159, 19, 38, 76,192,199, 31,127,140, 62,125,250,224,222,189,123, 56,127,254, 60,238,221,187,
-135,105,211,166, 33, 50, 50, 18,173, 91,183,174, 22,231,161,211,123,161,209, 21,131, 36, 72, 20, 20,231,195,100, 54, 34,118,210,
-220,199, 46,247,210,151,255,233, 56, 0,192,190, 83,215,107,204, 57,123,246,108,100,103,103,151,177,100, 61,142, 95,214,179,142,
-202,162,165, 61, 0, 48,209,121,163,197, 98,241,154, 55,111, 94,148,191,191, 63, 8,130,192,138, 21, 43,224,235,235,219, 9,192,
- 45,139,197,146,167,215,235,103, 56,136,144,222,176,197,218,200,201,201,113, 57,111, 95,175,215, 91,163,162,162, 68, 33, 33, 33,
-101,102, 27,122,120,120, 84,100,221, 41,229,180,239,163,105, 26,177,177,177, 88,184,112, 33,194,195,195, 49, 96,192, 0, 68, 71,
- 71,131, 32, 8,244,235,215, 15, 3, 6,252, 53,148,171, 82,169,196,199,143, 31,239, 70,146,100,130,195, 11,164, 12,167, 43,216,
- 29,227, 41,138,114,215, 1,190, 12,167,189,178, 77,155, 54, 13, 11, 23, 46,196,172, 89,149,187,122,108,216,176, 1, 40,239, 79,
-245,183,115, 22, 20, 20,148,105,236, 21, 10,197,154,161, 67,135, 10, 31, 61,122, 84, 70, 92, 57, 46, 46, 26,162, 50,156, 85, 5,
- 36, 21, 8, 4, 8, 10, 10,194,130, 5, 11,224,231,231,135,224,224, 96, 87,129,252,170, 44,163, 26,224,111,229,100, 56,246,218,
-210, 69,255,215,249,191,219, 15,137,164, 18,224,202,249,125,208, 20,150, 29, 78, 50, 91,255,154, 74, 45,105,219, 11,150,235, 63,
-186, 85,151,236, 98,250,179,207, 62,195,103,159,125, 86,105,130, 54,110,220,248,216,121,119, 83,108,149,231,100, 57, 66,225,225,
- 3,153, 71, 29,180,136,244, 1,203,209,255, 83,101, 84, 1,126,253,229,151, 95, 6,249,249,249, 33, 61, 61, 61, 64, 36, 18, 13,
- 42, 99,174, 50, 26, 81,191,126,253, 23,212,106,245,191,171,226,156, 54,109,154,121,206,156, 57,210, 81,163, 70, 97,232,208,161,
- 24, 53,106,148, 84, 44, 22, 55,230, 56, 14, 86,171, 21,233,233,233,248,241,199, 31,161, 86,171,111, 87,150, 78,150,227, 8,185,
- 66, 5,153, 71, 8, 90,188,168, 2,203,210,181,146,119, 71,171,184,163, 53,171,154, 34,203,101,253, 4,128, 95,127, 60,136,185,
- 31,188,136,173, 71,127,198,234, 95,128, 86,170, 92,180, 8, 80,131, 85,223,198, 71,163, 95,198,178, 29,191, 1, 0,206,159,171,
-178,140,184,202,234,160,201,104,125,172,188, 59, 90,174, 28,175,227,134,143, 86, 57, 78,123, 39, 81,171,213,162,168,168, 8,241,
-241,241,120,227,141, 55,144,155,155,139,212,212, 84,220,189,123, 23,223,125,247, 29, 20, 10, 69,141,202,232,195,183,102, 99,206,
-178,233,224,192,161,105,163, 22,152, 57,249, 51,180,107,213,241,177,203,221, 25,110, 88,179, 42,228, 92,185,114,101, 77,235,210,
- 63, 78,104,185,132,191,191,255,168,110,221,186,193,100, 50, 33, 32, 32, 0,169,169,169, 32, 73, 50, 2, 40, 25,194, 11, 13, 13,
-221,173, 86,171, 35,220,229, 19, 8, 4,160,105,186,212,247,199,190, 0,192,192,129, 3,113,248,240,225, 42,123, 20,193,193,193,
-168, 91,183, 46,222,127,255,253,114,179, 28, 28,103, 58,200,229,114, 28, 61,122, 52,187,160,160,160,128,227,184,106, 77,115,179,
- 59,198, 95,188,120,209,109, 7,120, 71, 88,173,214, 71,119,239,222, 13,217,184,113,163,160,146,151, 95, 41,206,159, 63, 79,163,
-138,161,154,191,131,211, 85,207,148,227,184, 10, 69,150, 59, 97, 4,170, 10, 72, 42, 20, 10,145,148,148,132,185,115,231,130, 32,
- 8,236,219,183,239,185,120,184,254,188,147,191,153, 36, 73,159,129,175,116,110, 9,130,128,213, 82,126,164,218,179, 80, 87, 42,
-178,134,126,185, 11, 7, 62, 28,233,142,232, 73,190,112,225,130,239,198,141, 27,133,238,148,251,133, 11, 23,104,142,227,170, 61,
-236,103,127,225, 88,173, 86, 24,141, 53,179,162,112, 28,119, 57,238,139, 57, 81,219,190, 61, 38, 34, 8, 11,174,156,219,135,226,
- 34,215,238, 12, 18,145, 16,155,227,247,211, 98,145,224,209, 83, 46,186,181, 67,134, 12, 25,245,213, 87, 95,181,112,181,211,141,
- 73, 48,169, 38,147, 9, 25, 25, 25, 48, 24, 12,123, 63,249,228, 19,235,177, 99,199,222,124,245,213, 87,209,186,117,107,132,132,
-132, 32, 43, 43, 11,201,201,201,136,143,143,231, 46, 93,186,180, 23,192,148, 42,238,227,193, 69, 95,204,137,137,223,113, 76, 66,
- 18, 86, 92, 57,191, 15,197, 78,162,189,188,117, 90,132,111,182,238,183,138,197,162, 59, 85, 89,139, 28,173, 89,181,249, 98, 28,
- 52,102, 50,134,174, 90,141,136,118,125,177,104,113,111,124,243,197,112, 44,239, 39,134,117,207,104,180,122,109, 27,118,206,235,
- 15, 0,168,243,141,155,214, 18,161, 24, 15, 93, 88,172,138,138,101, 54,113, 83, 61,171,169, 61,239,149, 89,174,170,107,209, 34,
- 73, 18, 13, 26, 52, 64, 68, 68, 4, 58,117,234,132,182,109,219,162, 71,143, 30,184,113,227, 6,110,220,184,129,105,211,166, 85,
- 38,178,170, 44,163,238,255,142,194,207, 93,238, 60,118,217, 56,151,123,109,192,157,186, 52,121,242,100, 0,248, 71, 89,183,170,
- 45,180, 52, 26,205, 13,150,101, 91,122,123,123,219, 45, 82,165,251,210,210,210,192,178,172,161,186, 5, 99,177, 88,236,193, 49,
-203,196,101,178, 59,199, 87,246,224,115, 28,199, 20, 20, 20,160, 91,183,110,232,210,165, 75,233,240,137,227,226, 32, 76,112,224,
-192, 1,112, 28, 87,109, 39,107, 7,199,120, 29,170,233, 0, 15, 0,185,185,185,125,187,118,237,122, 74, 40, 20,186,245, 21, 77,
-150,101, 83,115,114,114, 94,121,210,156,174,202,135,101,217, 10, 69,150, 59, 13, 81, 85, 1, 73,133, 66, 33, 60, 60, 60,240,253,
-247,223,195,223,223,255,185,122,192,110, 36,170,151, 84,182,191,155,159,228, 28,128,128,161, 95,238,122,120, 46,223, 90,111,232,
-151,187,210, 14,124, 56, 50,188,178,115,178,179,179,251,140, 28, 57,242,184,187,229, 78,211,244,131,236,236,236,106,135, 75,224,
- 56, 14,119,238,220, 97, 39, 76,152,144,167, 86,171,135,215, 36,255, 51,231,174, 94,190,240,243,169,126,253,162, 58,180, 3, 9,
- 88, 42,118,254,229, 8,128, 19,138, 4,143,102,204, 90,249,214,240,225,195,159,102,177,105,178,179,179, 59, 13, 27, 54,108, 10,
-254,114,157, 40, 35,164, 80,193,236,106, 27, 86,213,173, 91,247, 69,129, 64, 32, 5, 48, 23, 64,218,165, 75,151,214, 94,186,116,
-169, 15,128,127, 9, 4,130, 16,134, 97, 50,108,157,158, 93, 0,254,168,186, 30,229,190, 13,142, 13,235,215,251, 95,125, 65, 16,
-156,197, 98,174,162,131, 4, 14, 28,199,137,197,162, 59,191,222,200,106, 85, 89, 71,202,225, 11, 28,181, 62,100, 63,101,202, 20,
- 76,153, 50,165,180, 62,173, 89,211, 5,123,255,188,136,215, 90,165,195,252,117,103, 16,202,112,183, 59,124, 0, 48,251,255, 38,
-212, 90,218, 28,243,238,104,209,114,245, 28, 84,199, 71, 75, 32, 16, 32, 47, 47, 15, 73, 73, 73,200,201,201,129,193, 96, 64, 98,
- 98, 34,172, 86, 43, 10, 11, 11,241,226,139, 47,214, 56,157,181, 85, 70, 79,147,243,159, 56,124, 88,109,161,101,181, 90, 63,109,
-208,160,129, 72, 38,147,181, 96, 24, 6, 28,199,129, 97, 24,206, 38,106,170, 61, 11, 79, 36, 18,153,154, 52,105, 66,184,154,157,
- 96,255,239,225,225, 97,172,196, 90, 18, 87,191,126,253, 79, 8,130, 16, 84,212, 11,177,255,103, 89,150, 17, 10,133,113, 53,188,
- 87,143,235, 24,175, 87,171,213, 29,107,185,252,254, 14, 78,231,242,209, 55,107,214,172,244,139,246,206, 49, 81,108, 31, 91,213,
- 87, 33,206, 43, 13, 72,170,215,235,179,250,246,237,203, 56,238,119, 12,104,250, 92,131,224,210,250,143,122,179,222,185,124,107,
- 61, 0,176,139, 45,112, 92, 90, 37,103, 25,179,179,179,187,253,221, 73, 75, 73, 73,177,252,235, 95,255,250, 86,171,213, 78, 6,
- 80, 99,111,254, 89,159,174,153,245, 12,150,140, 6,192,194, 26,158,155,150,159,159,223,211,105,219, 31,118, 65,101,143,107, 87,
-109,209,126, 59,175,214, 99,139,209, 52,157, 30, 17, 17, 81, 45,203, 13, 69, 81,233, 85,237,119,142, 17,230,136, 91,240,198,172,
-171, 64,201,228,239,124,183, 56, 77, 38, 83, 65,199,142, 29, 69,213,204, 91,174,187,121, 15, 9, 9, 65,157, 58,117, 74,127,237,
-112,222, 94, 85, 58,105,154, 78, 15, 11, 11,131,191,191,127,133, 17,223,157,125,178,220,225,172,237, 50,170,140,179, 78,157,109,
-181,206, 89,211,116,242,112, 15,189,121, 78,158,147,231,124,102, 57, 5,252,253,228, 57,121, 78,158,243, 9,114, 62,151,224,189,
-212,120,240,224, 81, 17, 24,254, 22,240,224,193,131,199,227,129,168, 68,149, 86,103,166, 79, 77,148,237,105,158,147,231,228, 57,
-121, 78,158,147,231,228, 57,255,113,156, 85,113,215,246, 76,227,231, 26,188, 89,149,231,228, 57,121, 78,158,147,231,228, 57,121,
-206,127, 44,248,161, 67, 30, 60,120,240,224,193,131, 7, 15, 94,104,241,224,193,131, 7, 15, 30, 60,120,240, 66,139, 7, 15, 30,
- 60,120,240,224,193,131, 7, 47,180,120,240,224,193,131, 7, 15, 30, 60,120,161,197,131, 7, 15, 30, 60,120,240,224,193,131, 7,
- 15, 30, 60,120,240,224,193,131, 71, 9, 8, 0, 56,114,228, 72,233, 7, 1,163,163,163, 9,254,182,240,224,193,131, 7, 15, 30,
- 60,158, 36,158,107, 45,226,152, 57, 30, 60,120,240,224,193,131, 7, 15, 94,139,212, 14, 72, 94,108,241,224,193,131, 7, 15, 30,
- 60,120,177,197,103,140, 7, 15, 30, 60,120,240,224,193,139,172,103, 10,101, 44, 90,188,224,226,193,131, 7, 15, 30, 60,120, 60,
- 77,177,245,140,106, 17,206,182, 56,174,243,224,193,131, 7, 15, 30, 60,120,240,120, 76,129, 85,217, 47, 15, 30, 60,120,240,224,
-193,131, 7,143, 90, 18, 92,246,255, 79, 76,104,241, 95, 54,231, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31, 11, 33,127,
- 11,120,240,224,193,131, 7, 15, 30, 60, 30, 27,142, 86, 44,130, 23, 90, 60,120,240,224,193,131, 7, 15, 30,181, 39,178, 8, 87,
-235,252,183, 14,121,240,224,193,131, 7, 15, 30, 60,254, 38,240, 22, 45, 30, 60,120,240,224,193,131, 7,143,199, 3, 1,126,232,
-144, 7, 15, 30, 60,120,240,224,193,227,111, 21, 91, 46, 55, 86, 52,115,224,116, 53,200,107, 50,251,224, 52,207,201,115,242,156,
- 60, 39,207,201,115,242,156,255, 56,206,170,184, 79,227,217, 67, 55, 0,103, 1,116,183,253, 86, 40,188,106, 27,252,212, 87,158,
-147,231,228, 57,121, 78,158,147,231,228, 57,159,119, 84, 24,168,148,119,134,231, 81, 21,132,168,124,136,185,170,253, 60,120,240,
-224,193,131,199, 63, 77,108, 17,225, 72,218, 0, 0, 32, 0, 73, 68, 65, 84,113,142, 47, 73, 87,104, 12, 96, 22, 0,111,135,109,
-191, 0,136,115, 58,110, 7, 0,133,195,186, 30,192, 60, 0,247,170, 76, 13,199,137,109,252, 82,219,194, 2, 48, 1, 48, 3,208,
- 18, 4, 65,241,101,246,212,209, 17, 64,180,237,255, 17, 0, 87,170,185,255,185, 66, 72, 72,136,220,199,199,167,207,245,235,215,
- 37,137,137,137,184,112,225, 2,183,121,243,102,107, 97, 97,225,201,172,172, 44, 35, 95, 93,158, 11,244, 5, 48,211,246,127, 17,
-128, 19,143,201, 71, 40, 20,138,105, 30, 30, 30,253,165, 82,105, 29,154,166, 9,131,193,144,169,215,235, 79,209, 52,253,165,173,
-221,171, 46, 6,251,250,250,190,217,180,105,211,198,169,169,169, 25,153,153,153, 59, 0,236, 1, 48,188, 78,157, 58,163,235,215,
-175, 31,122,231,206,157,123, 5, 5, 5,223, 0, 56,248, 20,211,201,131,199, 63, 9, 68,101,214, 8, 87,152,203,113,220,232, 50,
- 12, 68,121,142,158, 61,123, 14, 58,121,242,164,130,101, 89,216, 23,185, 92, 78, 3, 24, 87,133,200,242,187,124,249,114,189,201,
-147, 39, 15,205,204,204,124, 89,171,213,182, 7, 0,133, 66,241,115, 96, 96,224,175,171, 86,173,250,142,227,184,116,130, 32,180,
-213,204,168, 80, 36, 18,189,225,227,227,211,159,166,233,182, 28,199, 65, 36, 18, 93, 47, 44, 44, 60, 65, 81,212, 55, 0,106, 34,
-222, 36, 66,161,112,138, 84, 42,237, 75,211,116, 75, 0, 16, 10,133, 55,205,102,243, 9,154,166,215, 2,176,212,128, 83, 38,145,
- 72,166, 40,149,202, 40,139,197,210, 18, 0, 36, 18,201, 77,141, 70,115,202, 98,177,172,181, 9,206,167, 13, 33,128,104,142,227,
- 68, 0, 32, 16, 8, 6,183,111,223,190, 30, 65, 16, 44, 65, 16, 28,199,113,196,207, 63,255,220,134, 97, 24,210, 86, 63,162, 1,
-252, 10,128,126, 22,159, 16,127,127,255,133, 44,203,214,169,180,208,100,178,151,175, 95,191,222,116,247,238,221,204,215, 95,127,
- 93, 52,126,252,120,207,201,147, 39, 11,215,172, 89,179, 54, 43, 43,235, 61,231,227,253,252,252,150,147, 36,233,239,206,245, 89,
-150,205,203,207,207,159,254,180,242, 31, 19, 99, 42, 99,238,142,143,151, 53, 2,144, 94,195,250,253,247,113,154, 98, 56, 0,136,
-151,197, 55,138, 49,197, 36,219,255, 63, 46,175, 3,102,174, 59,173,237,202,113,192,148, 40, 47,242,113,133, 86,104,104,104,124,
- 76, 76,204,168,150, 45, 91, 10, 57,142, 3, 69, 81, 48,155,205, 77,175, 92,185,210,125,223,190,125, 47,107,181,218,225,213,164,
-124,235,227,143, 63, 94, 48,127,254,124,127,145, 72, 68, 80, 20,213,104,247,238,221,109,223,126,251,237,247, 55,110,220, 88,119,
-196,136, 17, 94,246,237,115,231,206,109,183,104,209,162,134, 0,190,124, 10,233,228,193,227,159,134,110, 40,235,163,245, 57,128,
-207, 42, 19, 90, 30,182,151,103,142,205,146, 5,135,223, 82,156, 57,115,230,144, 80, 40,180, 91,180,218,235,245,250, 32, 39, 43,
-152, 43,145, 85,127,204,152, 49, 29,247,238,221,187,112,196,136, 17,217, 10,133,162,201,171,175,190,170, 37, 8, 66,176,123,247,
-238, 54, 17, 17, 17,242,129, 3, 7,142,233,217,179,231,135, 28,199, 93, 32, 8, 66,237,102, 38, 91,248,250,250,238, 95,178,100,
- 73,189,190,125,251,138,253,253,253,193,113, 28, 50, 51, 51, 67,143, 30, 61,218,239,243,207, 63,255,176,160,160, 96, 8,128,132,
-106,220,184,118,114,185,124,239,231,159,127, 30,210,175, 95, 63, 97,112,112, 48, 76, 38, 19, 18, 19, 19,123,159, 56,113,162,235,
-198,141, 27,223, 51, 26,141,175,217, 4,134,187,104,239,237,237,189,239,191, 31,127, 28,212,225,141, 55,132,190,190,190,224, 56,
- 14,106,181,186,247,197,109,219,186, 79, 90,178,228,189,226,226,226, 97,174,238,247,211,132, 68, 34, 33,183,111,223,222, 90, 34,
-145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,229, 9, 33, 8, 34, 44, 51, 51,211, 91, 44, 22,187,220,207, 48, 12,186,118,237,218,
- 64, 44, 22,227,203, 47,191,164,242,242,242,218,124,245,213, 87,215,119,238,220,233,191,118,237,218,215, 0,148, 19, 90, 36, 73,
-250,167,167,167,187,228,100, 24, 6, 86,171, 21, 52, 77,195, 98,177,160,121,243,230, 79, 53,255,241,241,178, 48, 0,211, 99, 98,
- 76, 31,216, 54,125, 9,224, 67, 0, 41,168,225, 55,187,254, 6, 78,199,250,182,220,225,255, 99,167,213, 1,245, 0,224,216, 13,
- 19, 0,248, 62,238,125,245,240,240,104,246,250,235,175, 11,213,106, 53, 68, 34, 17,172, 86, 43,178,179,179, 17, 25, 25, 41,248,
-246,219,111, 95,168, 46, 95,163, 70,141,198, 47, 90,180, 40,224,216,177, 99,214,237,219,183, 91,162,162,162, 68,227,199,143, 87,
-118,237,218,181,121, 88, 88, 24,185,101,203, 22,243,169, 83,167,168, 49, 99,198, 72,226,226,226, 2,142, 30, 61, 58, 48, 33, 33,
-225,203, 39,157, 78, 30, 60,254,129, 56,139,191, 66, 60,216,127, 43, 21, 90,112, 16, 87,131, 1, 64, 36, 18,181, 9, 10, 10,138,
-167,105, 58,216,102,213,201,206,201,201,249,146,162,168,223,109,199, 30,100, 89,118, 80, 85,150,172, 49, 99,198,116, 60,126,252,
-248,178, 43, 87,174, 20,231,231,231, 7, 31, 58,116,200,244,225,135, 31,166, 2, 64, 74, 74, 74,195,129, 3, 7,134, 78,157, 58,
- 53,189, 79,159, 62,171,122,244,232,241, 46,199,113,167, 8,130,208, 87, 37,178, 34, 35, 35, 47,159, 63,127,222, 75,165, 82,149,
-217, 81,191,126,125,188,251,238,187,226, 65,131, 6, 69,244,234,213,235, 82,114,114,114, 23, 0,127,186, 35,136, 26, 55,110,124,
-250,204,153, 51,158, 62, 62, 62, 40, 42, 42, 66,118,118, 54, 12, 6, 3,148, 74, 37, 70,140, 24, 33,238,214,185, 83,221,169,211,
-222, 59,157,158,145,209,219, 77,177,213,190, 83,139, 22,167,119,198,197,121, 82, 15, 31, 66, 46,151, 67,167,211, 1, 0,188,188,
-188,240,114,131, 6,194,223,182,109, 11, 29, 29, 27,123,250,215,164,164,222, 79, 73,108, 73,109,191,102, 0, 71, 4, 2,193, 96,
-137, 68, 66, 14, 30, 60, 24,167, 79,159, 38, 76, 38,147,208,102,221,161, 7, 15, 30, 12,185, 92, 14,139,197,194,162,100,232,144,
-126,150,159, 18,137, 68,130,228,228,228, 50,219,180, 90, 45,212,106, 53,242,243,243, 97, 54,155, 81, 84, 84, 4,150,101, 9,185,
- 92,174,102, 89, 22, 36, 73, 58, 11,128, 50, 16,139,197, 72, 74, 74, 42,179,141,166,105,232,245,122,152,205,102, 88,173, 86,104,
-181, 90,185,151,151, 87, 99,127,127,255,116, 0, 7, 11, 10, 10,190,204,201,201, 73,123,194,217,207,179, 11,162,248,120,217,125,
- 0,146,255, 69, 78, 7, 75, 86,168,109,253,143, 90, 74,171, 29, 15,143,252,110, 10,183, 89,199, 30,212, 2, 31, 11, 0, 23, 46,
- 92, 64, 78, 78, 14,242,242,242,160, 86,171, 17, 22, 22, 6,142,227,170, 61, 28,151,156,156,188,238,197, 23, 95, 36,110,221,186,
-117, 2,192,154,221,187,119,143, 43, 40, 40,152, 57, 99,198, 12,223,165, 75,151, 22,196,198,198, 46, 2,176,117,247,238,221,239,
- 52,107,214,172,255,237,219,183, 55, 62,141,116,242,224, 81,219,224, 56,174, 29,128, 0,123,219, 98,107,119,253, 28,214,111, 16,
- 4, 97,113, 56,206, 98,107, 27,156,127,237,176,175,171, 9,130,248,213,225, 60, 53, 65, 16,191,214, 52,153, 78,191, 37,157,110,
- 0, 56,114,228, 8,103, 95, 92,157, 25, 24, 24, 56,173,103,207,158,203,174, 93,187,214, 60, 43, 43,203, 39, 43, 43,203,231,218,
-181,107,205,123,246,236,185, 44, 48, 48,112,154,195,141,112, 62,245,180,195, 62,241,229,203,151,235,237,223,191,127,209,233,211,
-167,139,219,180,105, 99, 57,115,230, 12,221,167, 79,159, 92,219, 11,154,238,211,167, 79,238, 79, 63,253,196,116,232,208, 65,126,
-252,248,241, 71,151, 46, 93, 90,190,119,239,222, 32,142,227, 4,174, 56,109, 16,169, 84,170,239,207,157, 59, 87, 78,100, 57,162,
-110,221,186, 56,114,228,136, 82,165, 82, 29, 4, 32,174, 40,157, 54,200,100, 50,217,190,159,126,250,201,211,203,203, 11,185,185,
-185, 16,137, 68, 8, 12, 12, 68,113,113, 49,178,179,178,144,118,247, 46, 72,139, 5, 43,190,152,239, 37,151,203,247,186,104,236,
-203,113,122,123,123,239,219,185,112,161,103,254,233,211,248, 99,193, 2, 88,173,214,210, 33, 87,171,213,138, 75,147, 39, 67,253,
-227,143,216, 50,119,174,167,183,183,247, 62, 0,178, 42, 56,107, 3,142,156,147, 1, 20,216,150,201, 0,174, 68, 70, 70, 94, 75,
- 76, 76, 68,151, 46, 93,176,103,207,158, 86, 51,102,204,152, 60, 99,198,140,201,123,246,236,105,213,165, 75, 23, 36, 38, 38, 34,
- 50, 50,242, 26,202,250,103,253,221,233,252,219, 56, 25,134, 41,179,176,236, 95,239,152, 58,117,234,228,238,223,191, 31, 35, 70,
-140, 32, 37, 18, 73,214,200,145, 35,165, 23, 47, 94,228,108, 34,211,237,116,154, 76, 38, 24,141, 70,232,245,122,164,164,164,200,
-151, 44, 89,210,249,179,207, 62,107,116,250,244,233,208, 89,179,102, 77, 10, 8, 8,184, 30, 20, 20, 84,239, 9,231,221,234,244,
-127, 5,128,140,106, 90,136,254,110, 78,206,118, 62, 98, 76, 49,173, 29, 26,216,234,242, 86,118, 63,179,109,105,213, 3, 72,123,
-156,186,212,179,103,207, 23, 27, 53,106, 20,180,251,150, 15, 10,197, 77,193,138, 85, 96,197, 42, 48,126,237,144, 44,121, 5,225,
-225,225, 65,158,158,158, 29,171,153,206,237,183,110,221,250,151,173,167,156, 15, 96, 89,108,108,236,231, 4, 65, 92,136,141,141,
-157, 15, 96,153,109,251,130,219,183,111,119, 0,176,243, 41,165,243,153,120,222,121,206,255, 45,206, 42,180, 72, 0, 65, 16, 71,
- 8,130, 56,242,201, 39,159,244, 0,224,231,180,254,111,199,227, 0, 72, 92,253,218, 23,135,237, 1, 28,199, 13,112, 56, 47,160,
-134,201, 39, 92, 44,127, 9, 45, 0,136,142,142, 38,162,163,163,237, 59,126, 33, 8,226, 16,128, 95, 68, 34, 81,155,214,173, 91,
- 15,254,225,135, 31,188, 2, 2,254,186,126, 64, 64, 0,246,238,221,235,213,162, 69,139,193, 34,145,168, 13,128, 95,148, 74,229,
-161, 74,172, 48,170,201,147, 39, 15, 29, 59,118,172,166, 77,155, 54, 0, 80,148,144,144,160,232,208,161,131,158,166,105,130,166,
-105,162, 67,135, 14,250,132,132, 4, 5, 69, 81,218,118,237,218,121,244,234,213, 43,117,250,244,233, 99, 92, 8, 14, 71,188,190,
-120,241,226, 48, 31, 31,159,202,148, 48,180, 90, 45,130,130,130, 48,121,242,228, 96,145, 72,244,102,101,119, 75, 40, 20, 78, 89,
-188,120,113,160, 74,165, 66, 97, 97, 33,194,194,194, 96,177, 88,144,148,148, 4,147, 94, 7, 74,171, 1,165, 41,130,250,254, 61,
-168, 68, 66,140, 25, 20, 29, 36, 20, 10,167, 84, 97, 45,153,242, 77,108,108,144, 37, 53, 21, 41,123,246,128,161,203, 27,127,104,
-171, 21, 55, 55,109,130, 41, 61, 29,139, 38, 76, 8,146, 72, 36, 83,158,176, 37,107, 41,199,113,114,142,227,228, 4, 65,172,234,
-216,177,227,183,114,185,124,114, 92, 92, 92,223,147, 39, 79,246, 59,127,254,124,119,154,166, 69, 52, 77,139, 46, 92,184,208,197,
-100, 50, 9,165, 82, 41,132, 66, 33,135,231, 20, 34,145, 8, 98,177, 24,114,185, 28,157, 59,119,190,191,121,243,102, 42, 44, 44,
- 76,180,111,223, 62,159, 58,117,234,120,172, 89,179,166, 72,171,213, 46,118,151,207,106,181,194,108, 54,195,104, 52,194,100, 50,
-225,204,153, 51, 13,166, 78,157, 42, 52,153, 76,204,192,129, 3, 11, 40,138, 50,199,198,198, 42,125,125,125, 63,124,146,249,140,
-137, 49,177, 54,203,211,109,155,104,121,128,199,244,121,250, 59, 56, 1, 88,108, 62, 89,118,248,219,184, 45,181,116, 43,104, 0,
- 58,155,208, 50, 59, 61, 31, 45, 29, 44,190, 85,162,168,168,104,227, 55,223,124, 19, 70, 74, 85,184,104,233,143,239,216,207,113,
-210,123, 13,114,235,125,132,192,176, 70, 24, 53,106, 84, 32,199,113,107,106, 33,205, 95, 1,232, 10, 96, 85, 77, 78,126, 2,233,
-172,231,225,225,177,199,203,203,235,162,135,135,199, 30,216,134,103, 31, 7, 81,141,208,123, 80, 51, 50, 61, 42, 2,220,160,102,
-100,122, 84, 35, 62,212,192,243, 2, 39, 45,226, 8, 53,199,113,209, 28,199, 69, 47, 90,180,104,161,195,251,221,190, 46,119,211,
- 50, 22,205,113, 92,116, 25,133, 84, 34,176, 30,219,232,230, 98, 41,209, 20,142, 74,210, 33,115,165,179, 11,131,130,130,226,227,
-227,227,189,156, 25,179,178,178,160,209,104, 48,103,206, 28,175,177, 99,199,190,151,158,158, 30, 83, 69, 34, 36,217,217,217,109,
- 71,143, 30, 45,179, 90,173,133, 44,203,146, 26,141, 70,232,237,237,205,216, 15,240,246,246,102,138,139,139, 69,122,189, 94,192,
- 48,140,121,236,216,177,146, 9, 19, 38,188, 12, 64, 80, 17,105, 64, 64, 64, 84,255,254,253, 43, 28, 58,160, 40, 10,122,189, 30,
-122,189, 30, 86,171, 21,157, 59,119,150,110,222,188,185, 79,110,110,238,250, 10, 21,135, 84, 26, 21, 21, 21, 37, 42, 40, 40,128,
-183,183, 55,210,210,210,240,224,193, 3,152,117, 58, 88,117, 26, 88,117, 90,208, 90, 13, 56, 77, 49,242,239,221, 65,135,102, 77,
-197, 59,164,210,190,122,189,126,121, 69,156, 74,165, 50,170,195,184,113, 66, 15, 15, 15,116, 31, 93, 50,207,224,120,179,102,224,
- 24, 6, 44,195,128,161,105,244, 77, 74, 2, 69, 81, 32, 73, 18,237, 10, 10,132,202,109,219,162,212,106,245,178,167, 81,217,165,
- 82,169,112,251,246,237,175, 75, 36, 18,112, 28, 71, 88, 44, 22,156, 60,121,242, 31,247,208, 75, 36, 18,200,100, 50, 88,173, 86,
-212,175, 95,223, 56,122,244,232,203, 95,124,241, 69, 56, 73,146, 30, 98,177,248,135,252,252,252,133, 89, 89, 89, 41,238,242, 81,
- 20, 5,139,197, 2,139,197, 2,163,209,136,251,247,239, 7, 55,104,208,128,152, 60,121, 50, 99, 48, 24, 26,174, 94,189, 58,249,
-228,201,147,138,197,139, 23,191, 10,224,221, 39,157,223,152, 24, 83, 51, 0,205,226,227,101, 98,155,229,215,242, 63,198,201,161,
-196,241, 29,241,178,248, 68, 0,234, 90, 20, 89, 18, 0,222,225,126, 66,189, 72, 0, 29, 0, 47,155, 40,120,149, 32,136, 14,205,
-155, 55,247, 73, 76, 76, 44,228, 56,238, 42,128,239, 0,100, 85, 70,198,178, 44,193,178, 44,222,110, 95,132,201, 29, 5,160,168,
- 98, 20, 23, 23, 35, 45, 45, 13, 9, 9, 9,248,249,231,132,154, 62,155,111,122,122,122,246,145,201,100,245,105,154, 38,117, 58,
- 93,154,193, 96, 56,205,178,236, 70,212,192, 71,237,239, 74,167, 29, 30, 30, 30, 75,102,205,154,213,201,219,219, 27,191,255,254,
-123,195, 93,187,118, 45,209,235,245,143,229, 92, 47, 19,145, 91,150,175, 92, 19, 26, 26,168,194,141,243,135, 67, 23,110,216,189,
- 5, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142, 27, 64, 16,196, 17,103,161, 84, 45,179,211, 99,158, 95,133, 69,
-203,249,195,210,101,133, 86, 5, 10, 18, 52, 77, 7, 59, 90,178, 56,142, 67, 86, 86, 22, 50, 50, 50,160, 86,171,225,227,227, 3,
-171,213, 26,236, 78,251,160,213,106,219,251,249,249, 25, 68, 34,145,217,104, 52, 66,161, 80,176, 34,145,136,179, 93,135,176,205,
- 90,100,204,102, 51, 33, 20, 10, 41, 47, 47, 47, 79,179,217,220, 20,149,248,146,113, 28,215,222,207,207,207,229, 62,179,217, 12,
-157, 78, 7,189, 94, 15,157, 78, 7,179,217,140,160,160, 32,208, 52,221,182,210, 46, 45, 77,183, 12, 8, 8, 64,102,102, 38,228,
-114, 57,210,211,211, 97,209,105, 97,213,106, 65,235, 53, 96,138,139,193,106, 52, 96,245, 26, 80, 22, 3, 66,155, 52,131,125, 70,
- 98,133,221,112,139,165,165,159,159, 31,244,250,191,220,205, 56,155,192,162,105, 26,180,205, 57,218, 62,156,232,239,239, 15,251,
-140,196, 39, 4, 51,128, 25, 36, 73,174,146, 74,165,194, 73,147, 38, 33, 43, 43,171, 76,157,152, 52,105, 82,169, 79, 86,215,174,
- 93, 47,200,100, 50, 90,173, 86,195,108, 54,139,158,215,135,158, 32, 8, 16, 4, 81, 82, 70, 52, 13,127,127,127,125, 94, 94,222,
-207, 69, 69, 69,175,215,132,143,162, 40,251,140, 46, 24,141, 70,112, 28,135,223,127,255, 29, 50,153, 76,196, 48,204, 45,154,166,
- 21, 34,145, 8,164,205,249,235, 73,193, 54, 35,240, 75, 0, 97, 54, 11,209,155, 40,113, 56,207,112,209,144,184,117,235,220,228,
-172,190,112, 51,197,216, 45, 77, 25,168,217,112,164, 43,116,111,170,146, 44,143,235, 16,168,106, 61,208, 67,175,144, 8,244,108,
- 90,235,250,255, 93,154,176,107,236,152, 55,189,230,205,155, 87,207,223,223, 95,150,156,156,108,154, 63,127,126,131,237,219,183,
- 19, 40, 25,166,171, 16, 15, 31, 62, 60, 48,107,214, 44,223,254,253,251, 55,148, 74,165, 68,113,113, 49,212,106, 53,114,114,114,
-240,224,193, 3,238,198,141, 27,247,205,102,243,158,234, 36, 50, 36, 36,100,243,235,175,191, 62,246,165,151, 94, 18,217, 45,164,
-122,189,190,205,185,115,231, 6, 29, 63,126,188,139, 94,175,175,118,189,124,244,232,209,158,217,179,103,123,188,242,202, 43, 77,
-165, 82, 41, 89, 27,233,116, 4, 73,146, 65,158,158,158, 56,125,250, 52, 84, 42, 21, 72,146, 12,122,220,250,106,178,178,161,117,
-130,253, 96,186,180, 28, 77, 3,234,193,100,101, 67,121,137,242,252, 88,180, 42,120,215,183,179, 91,164,170, 16, 75,198,153, 51,
-103,206, 34, 8,226,200,204,153, 51,103,185,178,104,217,254, 50,142,199, 57, 28,111,174,109,177, 85,173, 64,147, 44,203, 34, 35,
- 35, 3,153,153,153,200,200,200, 64,126,126, 62, 72,146, 4,199,113,238,204, 62,227, 8,130, 96, 79,157, 58,229,115,249,242,101,
-125,187,118,237,138,236,254, 47, 52, 77, 19, 20, 69, 17, 54,191, 24, 34, 45, 45, 77,124,241,226, 69,213,237,219,183,131,108,189,
- 85,182, 10, 83, 96,185,109,118,129,229,184,152, 76, 38,200,100, 50,247, 84,135,237, 69,248,251,181,107, 37, 34, 75,167,181, 13,
- 25, 22,131,209, 20,131,211,107, 33, 97, 40, 72,192,129, 48, 25,220,190,127,142,176,139, 44,171, 77,104, 89, 44, 22, 80, 20, 5,
-150,101, 65,211, 79,197,175,124, 93,171, 86,173,218, 30, 56,112, 96,124, 70, 70,249,119,225,144, 33, 67,240,238,187,239, 98,234,
-212,169,183, 7, 12, 24,112,227,240,225,195,152, 50,101, 10, 88,150,109, 13,160, 24,192,241,231,237,161, 55,155,205,165, 22, 40,
-147,201, 4,171,213, 10, 84,227,179, 10,206,117,211, 94,182, 52, 77,219,185,137, 3, 7,246,227,194,133, 11,100, 66,194,173,176,
- 73,147, 38,219, 29,238,159,116, 86,211, 81, 50,115, 79, 98,107, 40, 44, 40,241,127,170, 40,164, 66, 4, 42, 31,178,227, 42,227,
-124, 28,180,218,208,106,196, 7, 31,124, 16,133,146, 25,206, 41,143,105,209,122, 69, 66, 18, 95, 79,107,233, 43,251,176,149,159,
- 94, 34, 36,116, 73, 95,207,210, 61, 8, 87,234,131,234, 42, 44, 97, 13, 84,117, 22, 46,252, 34,228,246,237, 59,230, 57,115,230,
- 36,142, 28, 57, 50,240,195, 15, 63,108,190,111,223,190, 46, 38,147,233, 27, 0, 69, 21, 25, 93, 6, 13, 26,116, 53, 48, 48,176,
-193,134, 13, 27,114, 31, 61,122,228, 67, 81,148,135,213,106,101,245,122,253, 3,163,209,120,218,106,181,158, 6,112,173, 58,137,
-245,242,242,106, 53,110,220, 56, 81, 81, 81, 17,132, 66, 33,172, 86, 43,114,115,115,209,169, 83, 39,193,161, 67,135, 90,212,228,
- 6, 20, 22, 22, 46,255,230,155,111,206,238,220,185,179,143, 82,169,124, 73, 42,149, 6, 3, 96,180, 90,109,142, 94,175,255,163,
- 38,233, 44,211,206, 49, 76,206,181,107,215, 34,148, 74, 37, 30, 62,124, 8,134, 97,114, 30,183, 14,200,196,228,163,155,231, 15,
-213,109,230,223, 0, 23, 47, 95,133, 76, 76, 62,226, 67,125, 61,247,176,251, 80,193, 81, 64,185, 16, 72,151,227,226,226,228,139,
- 22, 45, 66, 92, 92,220, 45, 87, 22, 45,187,224,138,139,139,187,101, 63,206,225,248,243,143,145,198,138, 45, 90, 21, 41, 72,160,
-100,118,161, 90,173,246, 81,169, 84,165, 2, 43, 51, 51, 19,153,153,153,144, 72, 36, 72, 75, 75,131, 68, 34,201,114,167, 19, 34,
-151,203,127,107,211,166,205, 11, 41, 41, 41,226,249,243,231,215,189,118,237,154,178, 83,167, 78, 47,202,229,114,134,227, 56,152,
- 76, 38, 50, 49, 49,209,115,217,178,101,161,237,219,183,183,180,111,223,254,250,238,221,187,141,168, 36,254, 21, 65, 16,191,100,
-101,101, 53,172, 95,191,190, 93,180,149, 17, 87,142,130, 11, 40, 25,242, 20, 10,133,215, 43, 75,168, 80, 40,188,153,148,148,212,
- 91, 33,147,194,162,213,192,170,211,128,214,106,193,104,139,193, 20, 23, 3,122, 13, 36, 52, 13, 17, 67, 65, 46,147, 33, 35, 61,
- 29, 66,161,240,102,101,156, 18,137,228,102, 78, 78, 78,111,149, 74, 85,250, 18,165,104,186,100, 97, 24, 88,104,186,212,162, 37,
- 18,137,240,232,209, 35, 72, 36,146,155, 79,186, 38,147, 36,201,216, 67, 56, 84,144, 15, 4, 5, 5,177, 29, 58,116,192,148, 41,
- 83,192, 48,140,173, 24,136,238, 0, 46,162,196,191,229,153,132, 43,113,107,119, 90, 55, 26,141,208,233,116, 40, 44, 44, 20,202,
-229,242, 23, 66, 67, 67,175, 90, 44,150, 61, 52, 77,111,121,240,224,129,166, 34, 78,155, 48, 43, 21, 93, 44,203,130,227, 56, 48,
- 12, 3,138,162, 32, 22,139,217,115,231,206, 99,217,138, 37,136,223,178,157, 27, 52,104, 16,113,232,208, 33,176, 44,155,254,132,
-179,111,177,137,150,202, 26, 13,231,144, 10, 31,161,242,144, 10, 21,113, 58,246,254, 28,183, 17, 46,142, 41,135, 15, 62,248,224,
- 4, 74,134, 12,243,108, 98,238,113, 56,191, 44,250,238, 11, 25,104, 70,111, 62,183, 83,247,237, 93,141,126,222,183, 43,127,179,
- 72, 4,154,151,187, 5,181,108,216,224, 5,129, 74,229, 67,174,223,184, 42,127,199,246,189,201, 15, 31, 62,212,172, 93,187,182,
-227, 11, 47,188,224,253,199, 31,127,132, 86, 36,180, 20, 10, 69,227, 55,223,124,115, 92, 97, 97,161, 56, 62, 62,126,119, 86, 86,
-214,111, 40, 9, 45,227, 56,131,122, 0,128,173, 54, 33, 26,100,107,231, 46, 2,152, 95, 89,127,141, 32, 8,252,244,211, 79,229,
-102, 7,178,143,167,206, 85,141, 26, 53, 26,145,146,146,114, 33, 39, 39,103,152,243, 78,177, 88, 60,175, 73,147, 38,125,111,221,
-186,245, 57,128, 99,213, 33, 54, 24, 12,177,123,247,238, 93, 42, 16, 8,234, 48, 12,147,105, 52, 26, 99, 31,219,162, 69,177, 19,
-226,214,239,218,100,180, 48,225,114,137,224,161,137, 98,223,226,117,200,243,107,205,178, 65,237, 96,141, 82, 3, 32,156,214,255,
-176,189,140, 44, 28,199,217,143, 85, 59, 88,177, 44, 78, 86, 48, 87,251,212,143, 17, 44,157,171,168,141,171,200,162,245, 9,128,
-246, 0,126,201,201,201, 89, 53,118,236,216,101, 59,118,236,240,210,104, 52,200,201,201, 65,110,110, 46,132, 66, 33,148, 74, 37,
-214,173, 91,103,204,201,201, 89,229,120, 14,202, 71,144, 7, 0,147,191,191,255,111,219,183,111, 15,254,250,235,175,133, 49, 49,
- 49,105, 3, 6, 12,104,186,110,221,186, 20,177, 88,204, 49, 12, 67,152,205,102,226,237,183,223,142, 88,177, 98, 69,170, 64, 32,
- 80,140, 24, 49,130,240,240,240,248, 5,149,132, 13, 80,171,213,167,190,255,254,251,161,211,167, 79,151, 90, 44, 22,151,150, 44,
-251, 54,149, 74,133, 75,151, 46, 89, 10, 11, 11, 79, 86, 97,197, 56,245,195,177,163, 93,255, 51,114,164,152,210,106, 64,105, 53,
-160, 53, 26, 48,218, 34, 16, 58, 13, 68, 12, 13,185,152, 69,112,152, 12,180,209, 19, 71,127,253,131, 50,155,205,149, 6, 54,212,
-104, 52,167, 46,198,199,119,111, 95,175,158,240,210,180,105,176, 82, 20, 94, 73, 74, 42, 21, 87, 86,171, 21, 7, 91,182, 4, 67,
- 16,104, 61,113, 34,238,209, 52,173,209,104, 78,253, 47, 62, 12, 55,110,220,200, 29, 61,122,244, 53,150,101,219,226, 9,125, 52,
-243, 73,128,162,168,114,214, 40,134, 97, 74,172,142, 37,150, 3,201,209,163, 71,187, 38, 38, 38,138,255,252,243, 79, 92,184,112,
-161,245,142, 29, 59, 62, 9, 15, 15,111,249,240,225,195,236,170,196,155,171,160,191,176,249, 31,238,222,185, 7,239,188,243, 14,
-145,157,157,141,239,190,251, 14, 85, 5, 79,253, 59, 16, 19, 99, 98,227,227,101,117,225,228,247,228, 34,164,194,239,112, 51,164,
- 66, 69,156,166,152, 18, 43,153, 44,190, 36,216,168, 41,166,100, 56, 80, 22, 95,165,165, 12, 49,166, 24,141,205, 33, 62,171, 22,
- 56,245,160, 25,185,229,220, 78,221,128, 99, 15,181, 87,178,140,243, 1,156,128,137,225,238, 93,231,110,188,244,146,143, 63, 0,
-152, 77, 76,112,227,198,141,187, 9,133, 66, 9, 0,120,122,122,190,228,231,231,183, 46, 63, 63,191,179,171, 50,141,142,142,238,
- 16, 24, 24,216,230,248,241,227,127,100,101,101,221, 2,240,179,243, 65, 17, 17, 17,115,110,223,190,221, 78, 36, 18, 17, 85,212,
- 17, 0, 64,183,110,221, 94,144, 74,165,126,199,238,122, 67, 35,110, 4, 78, 80, 12, 8,101, 96, 84,173,144, 38,110,142,176,176,
-171,126,133,133,133,173,139,139,139,255,168,102,209,247, 24, 58,116,232,150,248,248,248,176,110,221,186,113,215,175, 95, 39,157,
- 71, 17, 34, 34, 34,250, 92,185,114,165,237, 91,111,189,181, 97,215,174, 93,147, 81,118,166,109, 85, 72,179,197, 27,172, 53,156,
- 74,198,105,128,169,103,179,153,241, 10,229, 31,128,234,132, 92,120,140,240, 12,143,149,196, 10, 13, 24, 21,108,111,111,139,137,
-213,158,162,168,223,111,220,184,113,112,196,136, 17,186,252,252,124,248,249,249,161,126,253,250, 32, 8, 2,235,214,173, 51, 62,
-120,240, 96,159, 45,150, 86,251,204,204,204, 65, 54,177,229, 10,218,213,171, 87,239,218,182,109,155,234,218,181,107, 2,154,166,
-149, 77,155, 54, 53, 92,190,124,217, 83, 36, 18,113, 98,177,152,189,118,237,154, 34, 34, 34,194, 68, 16,132,244,199, 31,127,204,
-191,122,245,106,248,140, 25, 51,190, 65,217,105,226,206,216,185, 96,193,130,140,148,148, 20,152,205,102,104, 52, 26, 20, 23, 23,
-151, 46, 69, 69, 69, 40, 46, 46,134, 72, 36, 66,118,118, 54,246,239,223,159,101,139, 18, 95,153,101, 99,237,154,117,235,213, 89,
- 15,211,160, 84,200, 65,107,138,192, 20,231, 3,218, 98, 72, 40, 43, 60, 68, 12,234, 54,146, 67,166, 80, 34, 71,163, 67,252,229,
- 95,179,109, 81,226, 43, 54, 23, 88, 44,107,223, 93,177, 34,135, 22,139, 81,111,248,112, 88,109, 67,133,142, 66,139, 33, 8,132,
-247,234, 5,210,219, 27, 11,247,237,203,177, 69,137,127,162, 96, 89, 86, 96,177, 88, 42,203, 7, 88,150, 77, 79, 76, 76,220, 5,
-224, 44, 65, 16, 28, 65, 16, 28, 74,130,181,233,158,229, 7,153,162, 40,204,157, 59, 23, 98,177, 24,115,231,206,197,167,159,126,
-138,101,203,150, 97,253,250,245,248,246,219,111,113,244,232,209, 6, 23, 47, 94, 20,159, 63,127,158,139,139,139,203,139,136,136,
- 16, 76,156, 56, 81, 37,151,203, 63,168,140, 51, 54, 54, 22, 94, 94, 94,136,141,141,197,146, 37, 75,176,121,243,102, 28, 60,120,
- 16,151, 46, 93,130, 64, 32, 96,211,211, 31,193,100, 50,113,171, 87,175,206, 56,120,240,160,113,213,170, 85, 16, 10,133,196, 83,
-106, 36, 62,176, 9, 42, 71, 75,144,115, 72,133,124, 0, 43, 81,181,111, 84, 69,156,144,197,199,215,181,137,163,100, 7, 65,116,
- 24,192,116, 84, 62,189,218,206, 49, 25, 64,112, 45,112,206,150,143,254,191, 68,213,166, 59,247,175,100, 25,103, 3,248,193,158,
- 39,165, 82, 41, 63,112,224,123, 33, 0,236,219,187, 95,148,148,148,228,253,253,247,223,203, 2, 3, 3,241,237,183,223,202,228,
-114,121, 96, 5,156,204,193,131, 7,205, 18,137,196,111,194,132, 9,253,218,181,107,247,190,173, 35,218, 11, 64, 11,148,204, 94,
-140,186,127,255,126,130,191,191,255,221,147, 39, 79,234,221, 41, 32,173, 86,251,205,214,173, 91,235, 23, 48,190, 56,166, 31,138,
-120,118, 41,142,170,182, 32,173,222,167, 80,212,121, 25,175,191,254,122, 29,134, 97, 54, 85,179,220, 95, 31, 50,100,200,214,248,
-248,248,176, 9, 19, 38,100, 95,191,126, 61, 7, 64, 60,128,237,142,203,237,219,183,243,198,142, 29,155,181,105,211,166,144, 17,
- 35, 70,172, 7, 48,140,127,245,243,224, 81,182, 47,132,170,102, 29,186,120,225,150,254,207,205,205, 93, 93, 88, 88,120,233,222,
-189,123,239, 89, 44,150, 16,130, 32, 56,177, 88,156,157,147,147,179,202, 33, 96,169, 43,191,146,222,176,197,218, 32, 8,130,226,
- 56, 46,189, 71,143, 30, 31,244,234,213,235,171, 35, 71,142,152,186,119,239,142,189,123,247,250,247,232,209,195,192,178, 44,119,
-236,216, 49,255,190,125,251, 26,206,158, 61,171,127,251,237,183,155, 54,105,210,100, 98,108,108,172,154, 32, 8,214, 21,167,253,
- 93, 86, 84, 84, 52,164, 95,191,126,151,246,237,219,167, 84,169, 84,160,105, 26, 6,131, 1, 6,131, 1, 28,199,193,219,219, 27,
-106,181, 26,243,231,207,215, 20, 23, 23, 15,118, 33,220,156, 57, 77, 38,147,105,216,228,247,167,159, 90,245,249, 92,175,240, 6,
- 13,144,127,199, 4,218,100,128,136, 35, 81,247, 5,111,136, 37,114,220, 75,210,226,163, 93, 7,180, 70,147,233, 53, 23,189,229,
-114,156,197,197,197,195, 98, 62,253,244,244,134, 25, 51, 60,219, 4, 5, 65, 32, 16,192,108, 54,131, 97, 24,136, 68, 34, 68,198,
-196, 64, 28, 16,128, 57,187,118,233, 53, 26,205, 48,148,255, 20,143, 51,103,109,192,145,115,242,141, 27, 55,198, 54,107,214, 12,
-147, 38, 77,194,144, 33, 67,202, 28,248,253,247,223, 99,253,250,245, 48,155,205, 99, 1, 92, 7,176, 14, 37, 67, 29,112, 18, 89,
-127,119, 58,107,157,147, 97,152,194,164,164, 36,229,210,165, 75, 9,171,213,138,207, 63,255, 28,118,193,105,175,215, 83,166, 76,
-169,227,229,229,133,207, 62,251,204,146,151,151,215,115,201,146, 37,103,182,111,223,238,255,205, 55,223,188, 14, 32,214,153,147,
-101,217,220,155, 55,111,122,109,216,176,129,164,105, 26,203,151, 47, 47, 55, 60, 57,126,252,120, 88,173, 20, 4, 2,161,197,100,
- 50,183,144,203,229,201,126,126,126,114,174,172,115,215,147,188,159,161, 40, 9, 97,224,232,248,110,113,244,207, 66,197, 33, 21,
-170,195,169,150,197,199,119, 55,197,196,156,181, 9,162, 68,219, 49,123,237, 38,253,106,112,218, 5, 97, 77, 56, 79,217,150, 42,
- 97, 50,153,160, 86,171,145,151,151, 7,149, 74, 5,129, 64, 64, 84,148, 78,179,217,252,231, 71, 31,125,116, 99,211,166, 77,189,
-175, 92,185, 50,240,252,249,243, 61, 78,159, 62,109, 74, 75, 75,163, 41,138,226, 66, 66, 66,132,157, 59,119,150,245,239,223,223,
- 67, 42,149,146,179,103,207,206,251,226,139, 47,252, 81,214,135,205, 57,239, 2,130, 32,240, 97, 87, 45, 98,123, 8, 96,177, 88,
- 81, 84, 84,132,140,140,116, 36, 36, 36,224,202,149, 59,224, 56,142,172, 70,185,251, 1,152,253,221,119,223,133, 74, 36, 18, 98,
-215,174, 93,117,118,237,218, 85,165, 37,117,199,142, 29,117,118,239,222, 61,207, 54,122,145,254, 44, 62,239, 60,231,255, 44,231,
-179, 12,231,200,240,168, 82,104,217,218,249,246,176,125,148,148,162,168, 95, 92,132,112,248, 4,192, 92, 7, 43, 88, 85,230, 60,
- 13,199,113, 23,122,247,238, 61,165, 87,175, 94, 43,250,244,233,147,149,149,149,213,112,249,242,229, 97, 52, 77, 91, 19, 18, 18,
-200,228,228,228,180,223,126,251,173, 81,147, 38, 77, 38,222,190,125,251, 28, 65, 16, 86, 55, 50,152,144,156,156,220,169, 71,143,
- 30,251, 39, 78,156, 24,222,161, 67, 7,137, 74,165,130, 80, 40, 68, 74, 74, 10,254,248,227, 15,203,238,221,187,211,139,138,138,
-170,243, 9,158, 95, 82, 51, 50,162, 70, 76,125,111,223,196, 33, 3,253,255,213,244, 5, 73, 72, 72, 8, 96, 52,226,206,195,108,
- 92,189,243,135,117,243,133,171,106,179,217, 60, 12,238,127,130,231,151,223,238,221,235,221,115,198,140,125,243,254,243,159, 32,
-100,101, 9, 67, 66, 66, 32,145, 72,240,224,193, 3, 36,179, 44,189,120,227,198, 28,155,200,122,210, 81,225,165, 0,150,178, 44,
- 43, 4, 0,185, 92,142,119,223,125, 23,142,159,220, 89,191,126, 61,140, 70, 35, 0, 8, 9,130, 88, 10, 96,203,179,110,197,178,
-163,160,160, 96,206, 43,175,188, 18, 39, 20, 10, 43,140,122,235,227,227, 3,173, 86, 11,154,166,153,140,140,140, 59, 62, 62, 62,
- 16,137, 68,224, 56,206,229,115,148,159,159, 63,103,216,176, 97, 11, 72,146,172,200,242, 1,165, 82,153,118,230,204,153,198,111,
-189,245, 22,249,223,255,254, 55,101,194,132, 9,210, 51,103,206, 48, 28,199,237,127,210,247,160, 75,151,157,192,134,152,215, 0,
-188, 6,148,115,120,207,176,109,171, 86, 72,133, 46, 93,118, 98, 3,254,226,116, 28,198,179, 11, 34,155, 21,170,185, 44, 62,126,
- 5, 74,252, 44, 42,229,238,178,179, 11, 54,196,160, 86, 57,221,129,163,246,213,235,245, 96, 24,166, 50,107,222,239,123,247,238,
- 93,241,219,111,191, 5, 76,153, 50,165,225,127,254,243, 31,101,143, 30, 61, 60, 29, 15, 48, 26,141,236,225,195,135,245,235,215,
-175, 47,190,112,225, 66,234,248,241,227, 59, 84,150,206,135, 15, 31, 30, 93,184,112,161,119,255,254,253,155, 0, 40,245,207, 82,
-171,213, 72, 75, 75,195,159,127,254,153,102,181, 90, 15, 85, 35, 75,249, 0,230,141, 26, 53,106,233,182,109,219,234, 76,152, 48,
- 33,123,247,238,221,127,162, 36, 96,177, 51, 84, 67,134, 12,105,185,109,219,182,144, 9, 19, 38,100,163,196,143, 44, 29, 60,120,
-240,176,163, 59,202,251,105, 85, 58, 50,177,213, 98,177,112, 38,147,137, 51, 24, 12,156, 78,167,227,224,250, 43,240, 7, 51, 51,
- 51,185,244,244,116,238,225,195,135, 92,106,106, 42, 7,224, 91, 39,197,235,170,193,242,216,177, 99, 71,163,208,208,208,207, 21,
- 10,197, 9,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159,223,167,139, 23, 47, 14,229, 56, 78, 92,137,138,174, 8, 66,145,
- 72,244, 86, 96, 96,224, 65, 95, 95,223,116, 31, 31,159,244,192,192,192,131, 34,145,232, 29, 0,162, 42,148,121, 69,144, 9,133,
-194,143, 60, 60, 60, 78, 73,165,210, 92,169, 84,154,235,225,225,113, 74, 40, 20,126,132,202, 3,169, 86,202, 41,145, 72, 62, 10,
- 8, 8, 56,165, 84, 42,115,149, 74,101,110, 64, 64,192, 41,137, 68,242, 56,156,143,211, 43,177, 11, 45, 3,103, 3, 65, 16, 84,
-235,214,173, 55,180,109,219,118, 93,219,182,109,215,181,106,213,234,107,155, 85,146,179, 89, 91, 12,168, 56,120,227,223,153,206,
-167,198, 25, 25, 25,185,125,219,182,109,236,156, 57,115, 52, 77,154, 52, 41,152, 51,103,142,102,219,182,109,108,100,100,228,246,
-154,114, 6, 5, 5,213,139,140,140, 44,216,180,105, 19,157,148,148,196,109,218,180,137,142,140,140, 44,112,138, 12,255, 36,242,
- 78, 0,136,176, 89,127, 14, 1,216,131, 18,231,247, 80, 0, 68,140, 41,134,179,205, 62, 60, 1,160, 79, 5,101,239, 46,103,152,
- 41, 38,134,179,249, 84,157, 4,144,232,176,222, 13,101,253,191,158, 4,167, 75,180,104,209,226, 30,231, 0,139,197,194,169,213,
-106, 46, 41, 41,137,187,112,225, 2, 23, 22, 22,118,207, 13, 78, 63, 0,111, 3, 56, 28, 28, 28,124,187, 99,199,142, 15, 59,117,
-234,244,176, 94,189,122, 41, 34,145,232, 10, 74, 34,188, 71,218,150,165, 0,154, 84,193,217, 81,165, 82, 45, 12, 11, 11, 59,212,
-184,113,227, 75,245,235,215,191,226,235,235,123, 68, 38,147, 45,194, 95,145,177,171, 91,231,123, 12, 29, 58, 52, 77,167,211, 49,
- 47,189,244,210,109, 87, 39, 53,107,214,236,162, 78,167, 99, 70,142, 28,153, 14, 32,250,159,240,188,243,156, 79,133,243, 31,133,
-198, 54,193,116,208, 97,249,196,197,113,159, 56, 29,179,213,118,110,149, 5,193,113,156,128,227, 56, 15,142,227,188, 57,142,243,
-229, 56, 78,197,113,156, 39,199,113,210, 42,204,223,124,197,254,251, 56, 39,219, 4,148,193,246,223, 25, 85,237,127,174,239,103,
-104,104,168, 79,187,118,237,166, 30, 56,112,224,163,251,247,239,127,116,224,192,129,143,218,181,107, 55, 53, 52, 52,212,231,113,
-210, 25, 20, 20, 84,175,121,243,230, 95, 53,107,214, 44,189,121,243,230, 95, 57,137,172, 39,153,119,137, 77,196, 52,179, 45, 13,
-109,219, 8,148,196,194, 90,107, 19, 54, 17, 21,244,212,170,195,105,231, 59, 4,160,175,109, 57,100,219, 22,246, 20, 56,203,161,
- 65,131, 6,199, 91,182,108,121,175, 85,171, 86,201,173, 90,181,186,215,162, 69,139,123, 77,155, 54,189, 23, 17, 17,113,175,110,
-221,186,247,252,253,253,143,215,160,140,124, 1,132,160,252,103,192,158,118,157,239, 30, 25, 25,121, 85, 38,147,185,140, 13, 38,
- 20, 10,231,181,106,213,234, 38, 74,102, 74,242,237, 39,207,201, 11,173,255, 33,240,149,240,217,227,148,162,242,207,140, 84,181,
-159,191,159,207, 54,167,203,111,117,217,132, 76, 67,155,192,145,212, 2,167, 35,159,189, 78, 69, 56,136,166,167,193,201,215, 37,
-158,147,231,228,133, 86,173, 67,200,223, 2, 30, 78, 48, 63,230,126, 30,207,197,104, 60,126, 0, 0, 32, 0, 73, 68, 65, 84, 54,
-170, 19, 19,235,113, 56, 93,241,221,127,202,156, 60,120,240,224, 81, 91,109,103,119, 0,231,236,189,194,138, 84,105,117,102, 19,
-212, 68,217,158,230, 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31,199,105,199,138, 10,182,223,113, 90,255,250, 25, 21, 94,
- 79, 36, 76, 15,111, 86,229, 57,121, 78,158,147,231,228, 57,121, 78,158,179,166,152,248,140,138,172,110,246, 21,126,232,144, 7,
- 15, 30, 60,120,240,224,193,163,246, 80,117, 28,173, 61,123,246, 8,236,255, 71,141, 26, 53,158, 97,152,169,246,117,129, 64,176,
-230,187,239,190,219, 82,217, 21,134, 15, 31,206, 84,198,233, 10, 85, 93,199, 21,103,139, 38,202, 73,126,222,138,247,138,138, 13,
- 43, 83, 50,153, 11, 38,147,169,185,125,159, 76, 38, 75,220,178,101,203,221,218, 78,231,248,241,227,155, 56, 95,167,126,152,168,
-187,175,151,236,221,130, 34,221,242, 91,247,116, 95,243,117,236,169,192, 31, 64,180,151, 76, 60,168,133, 74,220,241,207,124,211,
-101,189,149, 57,140,146,217,176,133,207, 99,134,131,131,131,155, 42,149,202, 49, 0, 90, 24, 12,134, 64,133, 66,145, 11, 32, 65,
-163,209,108,207,206,206,190,227, 46, 79,183,250, 72, 3, 16,110, 91,125,120, 46, 21,245,220,217, 87, 21,250, 68,192,196, 1, 82,
-130,128,245,100,242, 95,206,232,125, 27,193,196,114,229,183,247,105, 4, 11,199, 65, 76, 0,230,147,247, 33,123,142,138, 74, 9,
- 32, 10, 37, 33, 28,110,160, 36,252,132,129,127,100,121,240,120,174,224, 60, 84, 88,186, 46,172, 64, 76,116, 21, 11,137,175, 56,
-112, 42,128,243, 51,155,205, 34,137, 68, 2,139,197, 2,133, 66,190,246,237, 9,227, 63, 7,137, 34,138,198,187, 91,182,108,169,
-241,151,174,171,115, 29, 0, 63, 57,159,239,163,148, 47, 56,123,248, 99,159,174, 3, 22, 47,178, 60,200,139,213,106,181,164, 84,
- 42,133,217,108,134,183,183,119,167, 73, 19, 39,190, 68,138, 56,139, 88,236,113,121,197,138, 21,217, 53, 77,231, 7, 31,124, 16,
-108,181,154,254,205,178,172,196, 98,177, 72,157,175,227,173,240, 88,124,246,240,199,138,110,209,139, 62, 7,120,161,245, 20, 32,
-169,231,227,113,110,229,168,238,205, 58,182,104, 12, 54,225, 60, 76, 22,235,160,179,233,186, 65,159, 94,201,156,158,174,179,182,
- 69, 45, 4,172,252, 31,130,160, 97,195,134, 83, 2, 2, 2, 70,110,220,184, 81,220,176, 97, 67,200,100, 50, 24,141,198,144,251,
-247,239,135, 76,154, 52,169,155, 92, 46,223,149,146,146,178, 22,238,125, 8, 46,252,236,214,255, 3, 0,116, 26, 51, 63, 28, 37,
- 31,139, 54, 56,239,235, 62,110,126, 56,128, 25, 40,251, 97,228, 44,148,132, 80,112,213,234, 72,142,108, 91,134, 65, 99, 63, 18,
- 2,152, 84,154,120, 18,248,225,219, 85,232, 55,234,189, 50,219, 9, 14,194,195,219,150, 33,122,236, 71, 21,126, 71,177,111, 99,
-130, 98, 89,174, 66, 75, 60, 73, 18,244,137,123,156,171, 15, 12,231,160, 36, 6, 88, 57, 74,148,124,208,217,229,241, 3,154, 10,
-114,172, 20,227, 50,224,172, 88, 36,200, 61,122,135, 41,119,110, 76, 27, 80, 20, 83,210,182,138,133, 96, 14,166,120,159,157, 61,
-123,182, 48, 58, 58, 26,155, 55,111,238,252,245,215, 95, 79,212,106,181, 63,218,238, 91, 50,255,248,242,224,241, 92, 11, 46,215,
- 66, 75, 40,192,134, 67,251,182, 52,202,201,205, 67,204, 91, 31, 98,231,206,157, 40, 44, 44,132,143,143, 15, 36, 98,177,104,229,
-210,255, 11, 86, 42, 61,130, 99, 38,198,110, 0,208,180,166,169,169,230,117, 26, 59,159, 79,216, 62,165, 35, 20,144, 34,137, 68,
- 66,238,218,181, 11, 69, 69, 69, 80,169, 84,144, 72, 68,228,138, 69,159,200,149, 74, 79,249,155,147,103,118, 70, 73,252,159, 26,
-193, 98,209,117, 62,176,115,139, 82,173, 86, 99,220, 59,177,112,190,142, 88, 44,102,236, 47, 22,190,142, 61, 21,204,222,248,238,
-216,102, 47,122, 1,214, 91,151, 32, 18, 8,160,240,246, 65,148, 80, 0, 1,129,230, 49, 39, 82,103, 1,248,244,121,201,108,195,
-134, 13,167, 12, 31, 62,124,228,130, 5, 11,196, 36, 89, 18,114, 78,175,215,195,104, 52, 34, 52, 52, 20,103,207,158, 21,207,153,
- 51,103,228,247,223,127,143,148,148,148,213,213,229,191,117,235, 86,253,240,240,112, 19, 0, 12,108,233,229,188,175,158,125, 31,
- 0,120,121,121, 85,201,231,167,242, 48,223,186,117,181,133,253,188, 41,189, 66,153, 10,182,155, 0, 40, 42,227, 98, 89, 78,120,
-242,171, 73, 21,238,127,107,193, 14,250,198,158, 11, 77, 27, 54,108,104,116,220,238,233,233, 89,209, 41, 65, 58,157, 46,220,121,
-163,253,120, 43,197, 4, 86,116,189, 62,239,174,119, 41,192, 40, 6,194, 29, 59,118, 0, 0,190,252,104,180, 96,211,207,121, 66,
-161,176,164,169, 93,186,116, 41,230,205,155, 39, 57,113,226, 68,255,109,219,182,245, 63,120,240,224,202,138,132, 42, 15, 30, 60,
-158, 73,145,229,248, 91,177,208, 34, 9,194, 75,233,229,137,215, 94,127, 27,199,143,255,128,174, 93,187,150,238,107,208,160, 1,
-134, 15, 27,140,239,182,174, 0, 0,175,199, 73,209,227, 94,167,176, 88,255,105,191,145, 95,205,127,152,173,187,114,228,200, 17,
-116,233,210,165,204,249,175,143,120, 13,223,126,179, 20,149, 68,153,119, 11, 4, 71,138,189,148, 30, 24, 21,243, 14, 92, 93,103,
-226,184, 33, 71,250, 14, 95,213, 59, 39, 95,191,130,175,103, 79, 30,141,130,253,250,180,108,214, 20,133,251,215,226,143, 34, 19,
-142,103,154,240,102,212,191, 16,233, 43, 71, 23,154, 65,176,135,168,103,182,158,122, 46,132, 86,112,112,112,211,128,128,128, 50,
- 34, 75,171,213, 66,167,211, 65,163,209, 64,171,213,130, 36, 73,196,198,198,138,207,157, 59, 55, 50, 56, 56,248,180, 27,195,136,
- 15,109,150, 44, 64, 32,210,205,157, 59,215, 28, 24, 24,104, 86, 40, 20,156, 80, 44,213,118, 31, 55,223, 11, 0, 72,161, 88,187,
-114,229, 74, 75,104,104,168, 73, 40, 20, 74,222,123,239, 61,210,157, 52,155,205,102,206,145,211, 98, 49,151,110, 95,188,120,177,
- 37, 40, 40,200,172, 80, 40, 56,171,213,125,163,227,205, 7, 5,144,138, 5,144,138, 5,144, 73, 68,240,170,223, 14,210,194, 63,
- 65,211, 52,150, 44, 89, 98, 13, 14, 14,182, 40, 20, 10, 78, 34,145,136,167, 77,155, 86,101, 58,199,143, 31,207,169, 84, 42,171,
- 66,161, 16,207,155, 55,175,220, 76,161, 51, 55, 50, 32,151,136,160,144, 10,209,184, 65, 24,164,156,209,237,180, 10, 4,101,189,
- 17,164, 82, 41, 58,119,238,140, 22, 45, 90,224,224,193,131,221,121,161,197,131,199,115,129, 10,103, 24, 10, 1,224,200,145, 35,
-221, 80,242, 65, 68, 68, 71, 71, 19, 37,103,112,152, 49,101, 24,222, 28, 55, 10, 12,195,150,126,231,139, 32, 9, 76,126,163, 63,
- 88,214,157, 17,137,170,167,120,214,224, 58,165,156, 28, 65, 10, 0,160, 81,189, 16,110,226,155,255, 1,195,178,127, 13,148, 8,
-128,183,199,245, 43,217, 86, 11,233, 20,128,193,135,147, 94,133,171,235, 52,109, 84,135,164,173, 38, 16,101, 63,246,248,119,124,
-108,147,231,116,129, 22,117, 67, 34, 40,163, 17, 38, 19,133,248, 59, 5,198, 83, 25,250, 64, 82,149,170, 94,245, 90, 7,153, 64,
-157,137,122, 94,146,198,217,122,234,185,200,187, 82,169, 28,179,113,227,198,114, 34, 43, 39, 39,135,212,233,116,176, 90,173,172,
- 86,171, 5,195, 48,152, 57,115,166,104,206,156, 57, 99,178,179,179,231,217, 53,143, 43, 78,155,223,213,140, 91,183,110,213,155,
- 61,123,182,181,103,207,158, 15, 27, 52,104,160, 23, 8, 4, 8, 9, 9, 89, 21, 21, 21,229,187, 96,193, 2,107,255,254,253, 83,
- 5, 2, 1, 26, 55,110,172,255,243,207, 63,235, 1,144,187,155,119, 71,206, 45,103,214,112, 0, 64, 16, 4,162,162,162,210, 26,
- 55,110,172, 23, 8, 4,184,123,120, 49,231,238,253, 20, 9, 73, 52, 9,245,182, 53, 34, 4, 32,247, 44,245,196,139,138,138, 74,
-111,218,180,169,142, 36, 73,220,188,121, 51, 12,229, 63,107, 85,142, 83, 46,151, 83,175,191,254,250,195, 59,119,238,184, 58, 30,
- 66, 1,137, 14, 77,109, 6,172,208,182, 64,250,197, 10,211, 41, 18,128,158, 51,101,180, 80, 37, 3,164, 94,254,102,141, 70, 3,
-165, 82, 89, 98, 33,179, 90,241,251,239,191,163, 99,199,142,221,246,236,217,115,142,127,222,121, 78,158,243, 47,184,210, 34,207,
-160, 53,203,241, 67,247,101,124,180,206, 58,103,138, 97,104, 52, 8, 15,194,226,255, 27, 15,134, 97,193, 48, 12,104,219, 47,195,
- 48,160,172,214, 90, 73,217,227, 92,199, 71, 41, 95,240,195,174,119,125,122, 14, 89,218, 43,110,246,184, 83, 12, 3,176, 44, 5,
-138, 2, 24,150, 2,203, 48,160,168,218,113,205,161, 88, 22,245,194,130, 17, 55,123, 28,156,175,179,253,187, 61, 3,207, 28,138,
- 85,116,141, 94,244,225,221, 52,195, 18, 94,216, 63, 89,200,196, 82, 33, 39,148,193, 98,161,161,181,176, 22, 0,122, 19,197, 90,
- 57, 15,127, 25, 0, 8, 73,226,121,154, 93,219,162, 97,195,134,101, 68,214,178,101,203,252,215,173, 91, 23, 10, 0,195,134, 13,
-203,232,213,171, 87, 94, 82, 82, 18, 66, 66, 66,136,188,188,188, 1, 0,222,179,157, 59, 3,192,186, 10,120,245,225,225,225,166,
-128,128, 0,179, 93, 16,145, 36, 9,161, 80,136,240,240,112, 83, 96, 96,160,185,113,227,198,122,177, 88, 12,146, 36, 97, 23,122,
-110,117,243, 8, 2, 2,129, 0,118, 78,103,107,143,157,179, 58, 16, 9,201,242,205,155, 3, 39, 73,146, 46,175, 87, 97, 29,146,
-201, 56, 0, 21, 30, 47, 32, 29,154, 71, 97,229, 30, 2,241,191, 67, 4,224, 44,199,113,184,126,253, 58, 82, 82, 82, 32, 22,139,
- 17, 28, 28,140,121,243,230,193,108, 46,209,187,195,135, 15,239, 6,224, 38,255, 4,243,224, 81,138,179,207,160,192,114,182,106,
- 85,238,163,117,228,200,145,110,209,209,209,231,236, 2,168, 68,236,184, 16, 63, 20, 13,138,178, 2, 28, 87, 43, 66,171,162,235,
- 48, 12, 91,233,117,236, 62, 90, 44,203, 9, 93,138, 44,150, 5, 77, 81,181,114,247, 88,134, 2,203, 82,112,117, 29,130, 32, 25,
- 91,131, 47,230,159,147, 39,143,224,240,122, 36, 21,222, 0, 23,104, 19, 66,253,164, 18,228, 25,209,240,133,102,130,223, 13, 20,
- 46,221, 72,132,191,167,242,185, 41, 23,131,193, 16, 40,147,201,160,215,235, 75, 45, 89,235,214,173, 11,181, 88, 44, 36, 0, 8,
-133,162, 48, 53, 27, 42, 99, 88,192, 91,153,133,194,194, 98, 63,142,227, 8,155,224, 89, 10, 96, 11, 42,137,238, 47, 22,139, 75,
- 5,138,163, 0,146, 74,165, 53, 18, 48,118,216,197,153, 88, 44,118,185,221,121,120,173, 42,136, 29,133, 22,184, 18,171,150,147,
-216, 18, 8, 4,176,251, 70, 85, 5,137, 68, 82,154,119, 87, 16, 10, 28,174, 39,168,190, 43,166,213,106,133, 78,167, 67, 81, 81,
- 17,100,178, 18,131, 25,199,113, 32, 8,226, 61, 0,239,243, 79, 49, 15, 30,174,181,200, 51, 44,182, 92, 11, 45,148,152,236, 8,
- 0,160, 41,171, 75,241,179,231,240, 37, 60,204,214, 35,216,255, 23,112,213,140,122, 58,114,228,200,173, 33, 33, 33, 29,236,235,
- 82,185,167,223,196,119, 63, 3, 77, 91,225, 37, 39,241,214,152,126,101, 68, 86,137, 69,203, 82,225, 55, 65, 10,139,245,159,246,
- 27,190,122,190,183,210,239,138,179,248,137,139,191,246, 90,161,198, 28, 70,146,191,162,144, 8, 97,134,191,253,217,120,135,198,
-253,198,174,245,115,167,187,109, 15, 36, 72,209,107,147, 86, 77,228,132,158,205, 21,164,246,252,199,227,254,117,192, 81,204,249,
-250,250, 30,233,243,218,202,222, 57, 5,188,143,214,211,128,151,183,138, 12,123,185, 59, 94,126,239, 43,156,249,228, 99, 14, 40,
-132, 95, 72, 40,217, 99,202, 23,240,124,121, 32,174,190, 53,134, 5, 10,158,139,188, 42, 20,138, 92,131,193, 16, 98, 52, 26,161,
-209,104,160,209,104,202, 10, 2,145,136,152,248,206, 84,127,145, 88, 2,202,106,193,241,237, 95, 84,201,105, 15,225, 48,176,165,
- 23, 4, 34,137, 54,161, 97,195, 85, 66,161, 16, 36, 73,226,240,218,143,223,219,191,252, 93, 47, 0,184,113,100,173,102, 84,236,
-154,213, 36, 73,194,108, 54, 75,171,147,238, 71,143, 30,133,153,205,102,147, 77,160,217,133, 31, 30, 60,120, 80,215,108, 54, 27,
- 29,183,187, 3,185,194, 11, 80, 53, 0, 20,129,229,172,103,169,169,169,117, 40,138, 50, 8,133, 66, 88, 44, 22,183, 84, 17, 73,
-146,226,155, 55,111,134,177, 44,235,242,248, 22, 17,117,128,224,150,128,196,219,237, 60,115,110,116, 68,109, 98,235,137, 69,144,
-230,193,227, 89,177,108, 61,131,207, 4, 81,193,255, 82,161,213,253,200,145, 35,156, 99, 15,145,166, 40,155,200,250, 75,244, 48,
- 12,139, 76,181, 9, 73, 73,119,177,114,229, 74, 92,186,250,145,247,130, 5, 11,164,115,230,204, 49,143, 28, 57,114, 57,203,178,
-173, 72,146,188,129,191,134, 42,202, 90,133, 88,182,238,181,107,215, 26,218,215, 41,138,130,151,151, 23,188,188,188,208,180,113,
- 88, 57,145,197, 48, 12,172,149, 12, 29,218,125,180, 8,142,229, 40,138, 1,195,178,165,226,167, 80, 99, 14, 59,116,250,122, 35,
-135,195, 95,176,255,233,220,174,121,197, 98,112,210,188,210,124,236, 90, 63,119,250,130,205,155,165,133, 76,192,180, 81,175,189,
- 25, 57,124,212, 24,188,254,234, 43,221,204, 22,203, 65, 1,201,177, 84,233,245, 64,130,131,179,143, 22,143, 39,132,228, 34, 61,
- 37,146,202,225, 25, 92, 31,119,117,140, 88, 32, 16,252,114,191,200, 32, 38, 5, 66,144, 66, 49, 18, 10, 77,212,115,148,221,132,
-228,228,228,144,186,117,235, 66,163,209,128,166,105,118,216,176, 97, 25, 66,161, 40, 76, 40, 18, 17,209,163,166,178,217,217,153,
- 20, 73, 10,192,113, 12, 94, 25, 62,137,144,202,228, 98,171,197, 66,163,100,232,208,149, 53,203, 49,132,131, 87, 84, 84,148,175,
-125, 38,224,254,229,239,122, 57,236, 83,190,244,210, 75,190,142,179, 14,221,180, 22, 17, 35, 71,142,148,135,135,135, 19, 0,240,
-235,246,217,118,235, 25, 49,112,224, 64, 89,120,120,137, 31,254,143,107,223,117,155,211, 95,193, 1,197, 15,128,226,212,114,150,
-172,129, 3, 7, 74, 27, 54,108, 88,173,103,209,230, 0, 95, 97,236, 46, 15, 33, 13,100, 95,119,139, 43,166, 13,168, 80, 79, 8,
-151,191, 66, 66,226,233,103,238,240,241,137,159,121,177,197,131,135, 91,112,210, 34,207, 20,186,217, 4, 98,119,219,111,169,224,
- 18, 2,128,205, 68, 71, 56,232, 44, 80,180,181,156,200, 98, 24, 6, 34,194,140,149, 43, 87,226,253,247,223, 7, 0,241,244,233,
-211, 15, 44, 88,176, 96, 40,203,178,173, 56,142,235, 66, 16, 68,101,189,198,179, 33, 33, 33, 57, 28,199,137, 72,146,236,178,118,
-237, 90,223,254,253,251,195,203,203, 11, 28,203,149, 19, 89, 12,195,194,106,181, 84,248,153, 91, 31,165,124,193, 15,123,166,249,
-244, 28,188,180, 23,195,178,167,236, 34,139,101, 24,128, 45, 57, 41, 63, 55, 3, 39,143, 31,196,134,245, 27, 10, 65,112,183,193,
-129,181,137, 65, 84, 32, 6, 91, 93,252, 53,177, 75,231,118,205,177, 96,243,102,233,173,107, 89, 7,166,126, 48, 43,114,248,168,
- 49,216,243,221,118,144,116,209,117, 71,145,197, 80, 44,138, 11,243, 6,254,196,251,104, 61, 45,248,158, 60,117,138, 24, 51,102,
- 12,171,213,106, 33,150, 72, 88,138,162, 4,255,254,247,191,153,247,223,127,159,204,206,206,134, 70,171, 19, 2,240,197,115, 96,
-214,210,104, 52,219, 39, 77,154,212,237,252,249,243, 98,146, 36,161,209,104,208,163, 71,143, 60, 53, 27, 42,155,248,206, 84,255,
-204,204, 12, 90, 41, 23,154,197, 98, 17,114,115,115,217,110,253, 71, 27, 71,141,127,191,206,251,179,227, 54,102, 93, 94,191,206,
-157,107, 56,206, 4,116,222,183,105,211, 38, 75,104,104,168, 73, 42,149, 74,198,141, 27,231,214,248,161,197, 98,225, 22, 47, 94,
-108,118,158, 93,104,177, 88,184,149, 43, 87, 90,194,194,194,204,114,185,156,163,168,170,253, 62, 73,146,160,223, 90,176,131,166,
-105,186,140, 21,203, 46,178, 40,150,208,125,245,213, 87,214,176,176, 48,139, 66,161,224,164, 82,169,216,157,116, 78,157, 58,149,
-243,241,241,177,122,120,120,136, 99, 99, 99, 31,107,214, 33,197, 64,184, 96,109,105,120, 7,169,151,151, 23,180, 90,109,105, 90,
- 67, 66, 66,120,177,197,131,135, 11,148,211, 34,207,166, 21,206,189, 56, 90, 44,160,203,201,205, 11,244, 15,170, 15,154,166,109,
- 11, 5,154,162, 48,237,237, 81, 88,190,254, 43, 0,176,139,173,168,233,211,167, 31, 0, 80,101, 99,182,107,215,174,249,211,167,
- 79, 87,230,228,228,156,216,186,117,171,239,232,209,163, 49, 99,198, 12, 44, 93,186, 20, 34,137, 12,190, 1,117, 75,175, 99,191,
-110,158,186, 0, 28, 56, 93, 5,118, 58,107, 73, 35, 5,161, 95, 64, 61, 80, 12, 5,150,162, 64, 81, 20, 8, 65, 73,214, 78, 30,
- 63,136,209,111, 76,133, 72,170,244, 89,179,114,137, 49,242,229,144,161,115, 38, 76, 48,187, 97, 4, 36,111, 93,203, 58, 48,245,
-253,216, 40,187,200,218,183,125,253,237, 47,103, 14,222, 41,149, 8, 75,175, 67,177, 44, 72, 82,192,251,104, 61, 37,145, 37,149,
- 74,247, 30, 59,118,236, 94,219,182,109, 9,189, 94, 15,138,162,144,151,151,135, 3, 7, 14, 36,112, 28, 7, 31, 31, 31, 28, 59,
-118,140, 29, 61,122,244, 94,179,217,252,218,179, 46,182,178,179,179,239,200,229,242, 93,179,102,205, 26, 53,115,230, 76, 17,203,
-178, 72, 74, 74, 2, 8,130, 19,137, 37, 32, 73, 18, 34,145, 16,197,197, 26, 86,225,169,202,178,114, 2,133, 72, 44, 1, 41, 16,
- 87, 54, 77,248,161, 45, 24, 41, 72,161, 88,107,159, 9, 40, 22,139,113,117,207, 50, 77,247,113,243,149, 0, 32,150,202, 11,251,
-244,233,147,214,188,121,115,253,111,191,253, 86, 15,229,103, 29, 58, 63,159,244,144,113,177, 2,133, 92,166,143,138,138,122,104,
-231, 76, 61,181, 70, 51,102,242,108,130, 16, 72,244,209,209,209,105,145,145,145,122,129, 64,128,196,131, 75, 52, 67,198,197,202,
-136, 74,130,172,158,184,199,189,117, 99,207,133,166, 95,124,241, 5,213,191,127,255, 71,118,127,177,212,212,212, 58, 3, 6, 12,
-144,174, 88,177,130, 26, 48, 96, 64,250,139,255,207,222,117,199, 53,113,254,225,231, 46,155,189, 71, 16, 68, 69, 81, 20,112,139,
- 11,197, 58,107, 29,173,226,194,189, 71,157,173,179, 14,220, 74,221,168,117,214, 90,220, 84,171,162,214, 81, 23, 42, 46, 16, 7,
- 67, 69, 1, 25, 97, 67,128,144,157,187,223, 31, 36, 52, 32, 35, 65, 91,107,127,121, 62,159,124,146,220,189,247,220,123,251,185,
-239,251, 29, 94, 94,197, 36, 73, 34, 50, 50,210,185, 58, 75,149, 6, 70, 70, 70,138, 9, 19, 38,188,123,254,252,121,109,163, 14,
-171,133,139,139, 11, 40,138, 66,183,110,221, 32,145, 72, 12,150, 45, 3, 12,248,111,162, 98, 30,173,170, 51,195, 43,148,138,111,
-167,204, 94,185, 19, 32, 76,181,238, 2,127, 25,150,104, 16,223,127,255,157, 9, 0, 35,141,216,154, 59,119,110,141,101, 78,180,
- 68, 86,155,128,128, 0, 44, 94,188, 24,155, 55,111, 86,253,248,227,143,140,248, 87,137,242,177,211, 87, 20, 84, 88, 15,104,208,
-197,148,130,250,182, 50,190,124,161,104,133,239, 87, 27, 86,166,101,150,220, 25, 59,109,105,217,221, 75, 5,160,144,224,171, 0,
- 96,207, 79, 63,137, 88, 92,115,147, 33,195, 71, 1, 64,207,157,219,130,206,172,193,129,154,197, 22, 77,120,124, 59,119,129,149,
- 70,100,237,218,186,246,185, 5,145, 25, 60,243,187, 24,133,246,122, 0,192,218, 12,103,124,191,218,208, 59, 43, 79,180,221,112,
-158,253,115,224,112, 56,171,175, 95,191,110,226,237,237, 77,228,230,230, 66,165, 42, 61, 34,114,185, 28, 66,161, 16, 69, 69, 69,
-144, 74,165,104,221,186, 53,185, 99,199, 14,147,153, 51,103,174,150,201,100,211, 63,247,237,126,251,246,237,174,115,231,206,225,
-214,173, 91,195, 22, 45, 90,196,114,116,116, 36, 44, 44, 50, 9,133, 92, 6,128,166,179,179,179, 41, 99, 83, 75,129,173,131,243,
-187,244,140, 44, 15,133, 92, 6, 74, 37,175,210,219, 92,157,222,225,251, 23, 47, 94,212,219,180,105,147, 76, 59, 18,112,248,130,
-157, 59, 90,183,110,109, 29, 28, 28, 44,235,215,175, 95,178,198,121, 93, 23,103,248, 43,111, 48,251,197,139,103,205, 42,114,250,
- 77,222,116, 80,195,169, 29,141,216,255,187,189, 7, 27, 53,106,100,237,233,233,153, 92, 29,111,131, 6, 13,196,124, 62, 95,214,
-164, 73,147, 98, 22,139, 85,106,201, 82, 40, 74, 26, 52,104, 64, 57, 56, 56,200,154, 54,109, 90,172,175,211,190,145,145, 17,173,
-177,138, 85, 6,125,162, 14, 89, 12, 40, 3, 2, 2,202, 50,195,127,223,168,145, 96,212,168, 81,252,121,243,230,225,224,193,131,
-184,123,247,238,123, 98,191,107,215,174,184,125,251,246, 74,252,135, 18,235, 26, 96,192,255, 25,170,207,163, 85, 17,135, 14,133,
-252, 9, 45,159,166,202,176,102,205, 26,174,218,146,213,115,206,156, 57, 16,139,197, 86,149, 52,235, 1,117,174,141,202, 68, 86,
- 80, 80,208, 49,154,166,157, 1,116, 86,169,168, 7,251, 15, 28,234, 86,213,250,134, 12, 25,242, 30, 39, 77,144, 12,146, 36,138,
- 57, 44,250,201, 79,251, 14, 30, 41,215,190,212,249,189, 49, 8, 60,221,185, 45, 72, 12,160,103, 69,177,133,191,202,140,148,113,
-106, 48,117,218,212, 50,145,181,115, 91,208, 85,207, 54,117,191, 89, 58,113,117,165,226,108,245,138, 41, 38, 36, 73,116,172,224,
-163,245, 30,231, 71,128,129,243, 47,116, 11, 8, 8,104,238,227,227, 67,106,139, 44,153, 76, 86,150,184, 83,227, 44,158,150,150,
-134,174, 93,187,146,205,155, 55,247,122,248,240, 97, 55,252, 85,206,233,115,221,118,213,219,183,111,119, 56, 58, 58, 94, 91,190,
-124,249,168,156,156,156,175,242,243, 11,108,194, 14,173, 70,159, 33,211,136,174,125, 71,136,100, 52,147,151, 42,200,108,114,243,
-226, 81,235, 75, 39,118, 65, 46,147, 77, 1, 16,135,191,210, 59, 84,228, 44,209,164,113,104,210,164,137, 72, 91,168,212,173, 91,
- 87,226,228,228, 36,245,244,244, 44,155, 94, 69, 52,223,123,219,174, 47,167,218,255, 75, 84,211,254,212,136,182,138,105, 35,140,
-141,141,161, 17, 95,250,244, 83, 59,218,178,210, 27,101,205, 81,135,101,156,234,244, 14,229,116, 90, 72, 72, 72,143,144,144,144,
- 54, 0,158,160,180,214,161, 2, 40, 29, 74,212,114,154, 15, 84,127, 12,215,187,129,243,255,149,243,115, 70, 87,252,229,155, 5,
-148,250,106,221,170, 82,104,213, 4,141,227, 59, 0,114,238,220,185,249, 98,177,216,106,212,168, 81,213, 46,147,145,145,113,240,
-240,225,195,229, 68,214,160, 65,131,198,133,134,134, 94,203,202,202,170,213, 86, 89,153, 27,173,185,117,126,161, 85,215,126, 27,
-230, 0,248,177, 10, 67, 30,229,217,134,255,205,206,109, 65,103, 42,136,173, 95, 1, 12,170, 74,149,246,250,114, 32,142, 30,218,
-169,241,237, 50,122,254, 56,237,210,176,168, 85,149, 70, 43, 90,154,114, 87,169,251, 49,207,224,163,245,207,128,205,102,251, 45,
- 90,180,136, 45, 18,137,222, 19, 89, 21,133, 86, 97, 97, 33,158, 62,125,138,177, 99,199,114,163,163,163,253,228,114,249,141,255,
-194, 62,200,200,200,136, 87, 39, 35,157,173, 73,225,192,229, 25,177, 71,140,159,227, 92, 22,117,120, 98, 23,164, 18, 49, 0, 48,
-117, 73,239,192,100, 50,217,209,209,209,174, 26,171,149, 92, 46,231,106,166, 63,126,252,216, 85,147, 91, 75, 34,145,232, 28,117,
-248,119,113, 62,123,246,204, 89, 19, 29,169,137, 46,100, 50,153,236,200,200, 72,103, 13,167, 84, 42,213, 41,234,144,195,225,176,
-163,163,163,157, 85, 42,213, 71,139, 58,212, 22,198, 40,173,179, 88,174,214,162,218,183,140, 32, 8,130, 54, 12, 27, 26, 96,192,
-103,143,138,145,146,213, 23,149,174, 9, 26,199,119, 61, 22, 97,186,184,184,244, 26, 62,124,120, 57,145,229,239,239,175, 58,125,
-250,244, 77, 62,159,159, 73,146,100,188,190,253, 40,243,209,194,123,111,144, 32, 73,242,105,231,182, 77, 65,146,228,211,165, 19,
- 39, 74,215,224, 64, 57,177,117,246,204,201,222,169,249, 49,149, 75, 51, 0, 54,246,117, 16, 48,238, 91, 4,140,251,214, 10, 64,
- 39,160,234,104,197,234,250, 97,192,223, 3,130, 32, 56, 78, 78, 78,207, 37, 18, 9, 8,130,128, 84, 42, 45, 19, 88, 69, 69, 69,
- 16, 10,133,101,255,229,114, 57,178,179,179, 81,183,110, 93, 16, 4,241,159,246,163,147,203,229,202, 69, 43, 55, 29,102, 48,217,
- 74,138,146, 19,114,185,124,188, 62,215,249,162, 69,139, 72, 84,226,123, 53,115,230,204, 74,167,127, 42,206, 37, 75,150, 84, 26,
- 37, 56,115,230,204,106,163, 7,171,194,119,223,125,247,209,162, 14,117,191,125, 25, 96,128, 1,255, 49, 84, 26,186, 87, 43,161,
- 69,146,228,211, 74,162, 11, 9, 0, 52, 73,146, 79, 43,201,114,160,124,247,238,221, 74, 75, 75,203, 41, 34,145,232,143, 65,131,
- 6,205,245,247,247, 87, 1,165, 14,242,181,221,162,124,161,104,133, 95,255,141,243, 10,138,165,193, 21,231, 85,180, 60,105,196,
-214,174,237, 65,187,207,132, 30,247,207, 72, 79,221, 93,213,182, 85, 37,168,170,138, 86, 20, 22,138, 87,250,245,223, 56, 39,191,
- 80,108,240,209,250,135,160, 82,169,174, 24, 25, 25, 17,154, 98,202,218,214,171,194,194, 66,148,148,148, 64, 93,146, 6, 0, 80,
- 92, 92, 12, 11, 11, 11,168, 84, 42,250, 63,182, 43,164, 0,230,171,173, 85, 0, 48, 63,241,230, 14,237,115,251,153,246,188,106,
-172, 89, 2, 93, 10, 68, 87,182, 92,117,243,254, 6,206,204,106, 10, 68, 87,135, 76, 61,249, 50, 1,128,205, 98,100, 85, 85, 60,
-154,205, 98,100, 85,227,183,175,231,123, 3, 65, 3, 88,105,184,178, 13, 48,224,243,125,255,255, 84, 43,238, 97,224, 52,112, 26,
- 56,255, 17, 78,174,250,163,235, 60,195,254, 52,112, 26, 56, 13,156,255, 54,206,202, 48,249, 51, 17, 90,116, 37, 31, 0,181,180,
-104, 25, 96,128, 1,255, 58, 72,107, 57,207, 0, 3, 12, 48,192,128, 15,199,123,197,164,181,103, 84,165, 74,245,137, 38,168,141,
-178,189,102,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243,255,142,179, 38,110,237,229, 39, 3,216,247,153,136,173, 79, 18,
-208, 98, 48,171, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,172, 45, 12, 67,135, 6, 24, 96,128, 1, 6, 24, 96,128, 1,
-255,231,208, 47, 97,169, 1,149,160,238,192,165,160,176, 68,189, 59,131,144,114, 54,240,191,182,137,254,254,254, 12,125,218, 39,
- 38, 90,146, 81,224,111, 54, 55, 97,247, 47, 22, 41, 54, 83, 81, 43,130,107, 58, 17,109, 27,180, 26,109,204, 51,158, 46,147,201,
-234,155,154,153,101,229,229,102,239,201,123,247,108,151, 86, 27,243, 7, 15, 30,240,125,124,124,210, 1, 20,105,189, 41, 24, 96,
-128, 1, 31, 19,150, 77, 93, 64, 16,227, 1,250,175,176, 75,138,142,129, 48,238, 80,185,118, 22, 30,227, 64, 18,205,180,166,136,
- 65, 99, 63, 10, 98, 83,106,120,224, 88, 38, 36, 36,184, 54,108,216, 48, 25, 64, 65,197,181, 87, 50,207,112,157, 27,240, 57,163,
- 43,202, 39, 44, 45,187, 22, 62, 92,104, 53, 26, 84, 31, 74,114, 12,104,140, 4,129,104, 36,134, 14,174, 21,143,219, 55,117, 64,
- 49,219, 1,104, 5,208,173, 76,140,120, 45,197, 50,121, 22, 69,211,163,241,230,228, 19,189,249,234,251, 79, 67,213,229, 44, 86,
- 34, 49,244, 39,189,248, 40,250,135, 71,183, 79,115, 45,141, 9, 52,108, 61,104, 1,202,103,112,174, 45, 56, 0,124, 73,146,108,
-102,108,108,204, 47, 41, 41,201,166, 40, 42, 5,165,227,211,249,181,228, 36, 1, 76, 48, 53, 49,233,227,106,198,105,245, 46, 71,
-152, 86,164, 80,133,163, 52,161,107,254,199, 58,163, 74, 69,150,227,190, 57, 35,124,198, 6,205,234, 1, 75,191,141, 11, 74,128,
-234,132, 22,225,220,184,227,217, 97,195,135,248,205,152, 60,214,180,142,157, 41, 4, 57, 34,155,159, 14,134,108, 10, 9, 57,218,
-111,226,176,158,125, 0, 96,245,234,213, 95,187,184,184,212, 99, 48, 24,137,203,150, 45,251,117,197,138, 21, 52, 81,117,165,114,
-190,250, 28,214,220,240, 77, 0,120, 2,104, 0,224, 45,128, 23, 40,159,101,188, 54,248, 44, 56,235,212,169,227, 68, 81,212, 68,
- 7, 7,135,175, 50, 51, 51, 47,144, 36,121, 32, 45, 45, 45,253, 83,222,117,104,154,222, 75, 16,196,100,154,166,247,233,241, 61,
- 69,159,117,240,120,188, 76,137, 68, 98,175,254,157, 37,145, 72, 28,254,174,237,249, 39,215,245, 15,189,127, 79,186,114,231, 69,
- 31,237, 73,189, 58, 55,171,228,142, 66, 52,187,114, 39,166, 75,249,118,158,170, 42,238,129, 4, 77,211, 88,185,114, 37,177,106,
-213,170,113,110,110,110,141, 72,146,124,185,124,249,242,114,169,111, 42,206,211,186,206, 13, 98,203,128,207, 21,250, 21,149,174,
- 17, 77,253, 77, 32,161,253, 1, 98,108,215,182, 45, 59, 79, 25,221,159,160, 25, 60,140,152,180, 80,169, 55,151,235, 88, 46, 24,
-226, 53,222,205, 26,207, 29,210,191, 7,217,198,179, 30,248,118, 22, 0,201,194,222,139, 73, 54,193, 65,203,118, 3,240,169, 69,
- 47, 87,188,137, 56,102, 47, 40, 80,129, 32, 0,130, 0, 72, 2, 40,150, 80,232,245,245,152, 21, 0,126,210,243,174, 68, 90, 26,
- 19,152,123, 76, 2, 0,140,143,112, 80,234,217,217,217,141,155, 61,123,182,137,167,167,167, 37,143,199,227, 72, 36, 18,135,132,
-132, 4,187,101,203,150,121,138,197,226,243, 0, 30,233,201, 89,183,161,179,211,201,224,185, 19,218, 53,111,224, 10,150,172, 24,
-148, 84,228,242, 42,225,117,135,169,187, 79, 77,138,201,147, 12, 71, 45, 74, 38,228,228,228, 16, 0, 96,107,107, 75,151, 23, 89,
-237,199,110,157,215, 11,115,183, 92, 65,137, 68,118,164, 58, 14,235,122, 45, 70,125,243,205, 64,191,181, 63,204, 52, 77,203,149,
- 35, 58, 81, 12,107, 83, 54, 86,204,159,198,145, 74, 21, 29,118,255, 26, 50,121,231,134,133,251, 85, 42,213, 23, 0,218,168, 84,
-170,199, 0,126, 93,185,114,101, 85, 55,223, 85, 0,150,168, 79,232,163, 12, 6,227,106,183,110,221,234, 79,156, 56,145,104,221,
-186, 53, 34, 35, 35, 27, 28, 59,118,172,199,133, 11, 23, 18, 85, 42,213, 51, 0, 47,161, 46,123,162, 3, 88, 0, 26, 51, 24, 12,
-239,127, 51, 39,159,207, 55,146,201,100, 99,156,157,157, 39,119,236,216,209,187,127,255,254, 68,227,198,141, 17, 31, 31,223,250,
-210,165, 75, 43,194,195,195,159,165,166,166,238,227,112, 56,135, 5, 2,129,248, 31,127,142, 19,196,100, 0, 78,106,157,188, 82,
-135,239,116,148,230,146, 18,232,186, 14,137, 68, 98,175, 41, 97, 67, 16,132,253,223,185, 61,122,174, 43,150, 32, 8,107,117, 91,
- 84,247, 77,146, 36,148, 74,165, 72,165, 82,185,213,192,217, 88,253, 34,165,179,214, 5, 80, 93, 34,104, 35, 0,232,213,169, 89,
- 30, 8,196,148, 89,180,222,127,201,140, 41, 19, 96, 52,154, 93,185, 27, 99, 93,206, 10, 86,241, 45,118,229, 74, 98,197,138, 21,
- 8, 12, 12,236, 15,192,151,162,168,112, 15, 15,143, 29,229, 40, 41,170,108,222,138, 21, 43,182, 87,115,157, 27, 96,192,231, 2,
- 63,232, 83, 84,186,202,247, 31,183,193, 93,160,194, 88, 87, 27,123,255, 89, 19,135, 26,121,122, 52,132, 4,166, 72,202, 81,225,
- 98,216, 37, 0, 56,161,159,213,105,104, 27, 38, 83,114, 56, 40,112,126, 19,223,118,158,120,158,166,192,227, 52, 21, 74, 18, 21,
- 96,144, 10,168, 40, 26,160, 33,169,237, 86,167,230, 43,113,231,165, 12, 36, 1, 48, 72,128, 36, 9, 48,200, 90,146, 81,178, 87,
-171, 15, 69,121,230,100, 82, 0, 37,123,245,129, 7,164,153,187,187,251,168, 85,171, 86, 89,102,100,100,152, 68, 70, 70,130,203,
-229,194,202,202,138,193,231,243,157,182,108,217, 34,158, 53,107,214, 87,114,185, 60, 9, 64,142,142,156, 30,125,219,120,223,219,
- 23,180,218, 66,241,224, 18, 10,142,255, 6, 6, 73,131,109, 98,138,250, 70, 70,184,244, 77, 67,107,255,176,196,211, 15, 51, 69,
- 30, 0,210,106, 34,139,139,139, 99, 72,165,210,225,230,230,230,237, 89, 44,150, 3,207,170, 30,149,206,108,147,155, 77, 52,120,
-155,101, 95,210,101, 94, 15,135, 62,155,231,116,195,220, 45, 87,176,237,216,253, 95, 90, 33, 99,121,117,121,179,141,141, 77,167,
-204,154, 62,209, 52, 53, 71,142, 53,167,115,112,232,118, 33,198,248,154, 97,238,151, 22, 8, 24, 49,204,228,212,111,161, 83, 0,
-236,215, 90, 36,222,195,195,131,136,139,139,171,236,230,107, 5, 96,161, 76, 38, 35,217,108, 54,193,227,241, 70,173, 93,187, 86,
- 62, 98,196,136, 84, 77, 3, 95, 95, 95,248,250,250, 18, 69, 69, 69, 13,110,220,184,209, 32, 36, 36, 68, 25, 17, 17, 17, 11,224,
-108,213, 22, 11,163,119, 18,137,216,133,103,100, 84,242,211,238,221,155,187,116,233, 66,113,185,127,165,159,170, 13, 39, 0, 88,
- 88, 88,236,183,183,183, 39, 22, 47, 94,156,254,177, 56,235,213,171,119,165, 93,187,118,221,122,245,234,197,236,212,169, 19,156,
-156,156,202,230,217,218,218,194,215,215,151, 72, 73, 73,105, 30, 30, 30,190,251,202,149, 43, 59,158, 60,121,114, 35, 41, 41,169,
-215, 63,108,209,218,167, 22, 19, 2, 61,219,127,246, 32, 8,194,116,239,222,189,246,154,154,140, 10,133, 2, 42,149,170,236, 91,
-243,161, 40, 10, 42,149, 10,107,215,174, 85,137, 68, 34, 93,246,145, 72,235,173, 89,243,161, 42,251,230,112, 56,182,154,132,189,
- 53,220,217, 99,248,220,130,166, 38, 38, 38,174, 0,250,194,174,209,194,242, 13, 74,223,159, 69, 34, 81,178, 64,106, 25, 3,160,
- 75, 53,108,150,171, 86,173, 26, 19, 24, 24, 56, 80,203, 74,235, 61,100,200,144,138,101,175,188,213,223, 34,130, 32,110,146, 36,
-121, 30,192, 33,124, 68,171,187, 1,255, 45,208, 52,221, 22,128,157,214, 36, 25, 74, 71,133,160,126, 78, 18, 0,108, 42, 76,215,
-110,167,249,206, 86, 79,183, 83, 47, 71,107,241,102, 19, 4,241,168,150, 93,188,133, 42,252,180,152, 0, 16, 22, 22, 70,247,235,
-215,143,208,124, 87, 46,138,252, 47, 78, 24, 49,160,207, 87,221, 59,130,228, 89,225, 85, 22, 16,241,142, 6,147, 84,128, 4,141,
- 7,119,111,208, 96, 82,135, 43, 44, 85,181,245,164,222,224,239,188, 61, 61, 54, 30, 8,154,205,136,205, 98,226, 80,120, 9,228,
-146, 98,100,103,188, 67, 86,122, 50, 4,169,111,145,246,238,237, 51,128, 88,161, 51,231,123, 7, 6, 80, 81,234,119, 64, 10,168,
- 38,242,178,102, 78,185, 40,174, 65, 99, 79,207,124,142, 10,144,139,226,116, 88,125, 85,156, 94,141, 26, 53, 26,241,195, 15, 63,
- 88,191,120,241,194,168,164,164, 68,122,233,210,165,248,164,164, 36,115, 62,159,159, 55,109,218,180, 70, 78, 78, 78,230,131, 6,
- 13,226, 28, 63,126,252,107,148, 15,107,173,138,211,115, 64,251,150, 17, 7,119,108, 53,201, 61, 21, 12, 89,194, 83, 92, 20,136,
-112, 55,179,132,110, 96,193, 37,190,109,110, 7, 83, 46, 19,171, 59, 57,153,246, 61,147,176, 81, 65, 81, 1,213,113,222,187,119,
-143,111,108,108,188,101,228,200,145,252,153, 51,103,114, 85, 76, 75,102,104, 68,174,197,194,221, 17, 78, 37, 82, 57, 99, 68,183,
-122,152, 55,210, 27,243,182, 93,215,136,172,201,245,235, 23, 80, 81, 81, 85,115, 42,228,242,250,206,246,230,136, 78, 18,227,208,
-237, 66,252,249,131, 19,186,175, 77,199,160, 86, 76,120,212, 53,133, 82,174,104, 60,100,200,144,195,234,183,246, 71, 0,190, 30,
- 50,100, 72, 19, 6,131,113, 29,192,239, 53, 29, 35, 30,175,242,234, 41, 86, 86, 86,232,218,181, 43, 60, 60, 60,152, 93,186,116,
-241,174, 32, 96,202,113,202,229, 50, 62, 69,209, 48, 51, 51, 51,178,177,177,177, 50, 51, 51,203,173,236, 65,165, 15, 39, 0, 88,
- 91, 91, 15,238,218,181, 43,243,216,177, 99, 57,137,137,137, 15, 70,140, 24,241,214,220,220,188,156,245,215,196,196, 4,141, 26,
- 53,194,178,101,203,152,125,250,244,169,145,211,193,193,161,103, 72, 72, 8, 8,130, 40,123,104,191,103, 44,118,117,133,163,163,
- 35,250,246,237,203, 28, 60,120,112,207,164,164,164, 90, 93, 71,122,224, 90, 37, 22,173,149, 21,142, 83,149,195,111,149,181,215,
-225,184,103,105,172, 75,106, 62,124,192,181, 89,237,112, 39,143,199, 43,179, 66, 85,178,174,247, 56, 73,146,196,210,165, 75, 65,
- 16, 4, 88, 44, 22,216,108,118,165,223,126,126,126,250,246, 51,133, 32, 8,146,205,102, 47,100, 50,153, 19,165, 82,169, 51,143,
-199, 75, 87,169, 84,191, 72,165,210,181, 0, 20, 52, 77, 91, 86, 33,178, 42,229, 52, 49, 49,113,125,245,234,149,123, 85, 29,145,
- 74,165,240,246,246, 6,164,136,173,142, 51, 33, 33,193,213,205,205,173, 49, 0, 77,137,182,219, 52, 77,119,209,250,175,141,219,
- 52, 77,127,169,254,253,242,205,155, 55,174, 13, 27, 54,204,255,167,206, 79, 3,231,191,143,179, 6, 45, 98, 71, 16, 68,152,113,
- 48, 25,151, 0, 0, 32, 0, 73, 68, 65, 84,214,181,218, 79,243,127,209,162, 69, 75,214,175, 95,255,130, 32,136, 48,237,233,218,
-237,180,191,213,247,155, 48,154,166,251, 45, 94,188,216,115,195,134, 13,235, 52,109,255, 14,145,168,143, 69,203, 60, 91, 98,130,
-240,119,230, 96, 50, 84, 96,146, 4,152, 12, 0, 52,129,228,164, 4, 20, 21, 22,220, 65,226,233, 68,221, 44, 89,254,157, 90,180,
-240, 10, 58,186,109, 1,249,115,120, 9, 10, 68, 18,196, 61,185,137, 71, 55,127,207, 80, 41, 85,191,131,160, 31, 3,100, 36,222,
- 82,241, 64,104,237,106, 92, 16, 52,179, 84,104,169,197, 85, 57,177,245,201,208,188, 73,147, 38,195,150, 45, 91,102, 27, 21, 21,
-197, 19, 10,133, 69, 71,143, 30, 77,151, 74,165, 73, 0, 46, 39, 39, 39, 55,217,190,125, 59, 39, 40, 40,200,203,203,203,139,127,
-242,228, 73, 89, 37,229,140,222,227,156, 63, 54, 32, 98,226,172, 57,188,216,147,187,192,137,141,196,210,167, 57,170, 63, 5, 37,
- 63, 0,216,134,148,226, 78,217, 18,229,213,173, 93, 93,200,122,102,108, 52,180,228,248,197,229, 73,170,181,100, 25, 27, 27,111,
- 9, 9, 9,113,109,219,182, 45, 9, 0,225, 47,149,220,133,187, 35,156, 46,175,239, 68,116,106,102,131,172, 2, 41,102,239,138,
-198,165,136,172, 63, 52, 34,171,166, 78,154,153,153,101,167,102, 21, 58,216,152,242, 48,186,179, 41,186,175, 77,135,127, 27, 46,
-184,108, 2,241,137, 25,104,232, 86,143,136,190,115,182,141, 90,100,181, 21, 8, 4, 0,208, 6, 64, 98, 74, 74, 10,223,199,199,
- 71,168, 69,151, 15, 96, 35,135,195, 89, 74, 16, 4,221,182,109,219,104, 47, 47,175, 98, 43, 43, 43,136,197, 98, 72,165, 82,176,
-217,108,136,197, 98, 36, 39, 39,227,193,131, 7,176,178,178,210,235, 64, 21, 23, 23,195,204,204, 12, 20, 69,125, 48,167, 74,165,
- 34,246,236,217, 99,242,226,197, 11,147,208,208, 80,135,185,115,231,230, 54,109,218,244,241,176, 97,195, 94,219,219,219, 75,159,
- 62,125,138,123,247,238, 33, 63, 63, 31,237,219,183,215,137, 83, 38,147,129,201,100, 66, 44, 22,131,203,229,130,201,100, 66,169,
- 84,130,162,168, 50,241, 85, 92, 92,140,188,188, 60,176,217,108,200,100,178, 79,241, 6,250,158,133,170,186,225,183,218, 88,180,
-180,133,154,142, 34,171, 38, 75, 84,149,195,157, 5, 5, 5, 70,150,150,150, 11, 1, 8,106, 90, 23, 65, 16, 96, 48, 24, 96,179,
-217, 32, 8, 2, 93,186,116,193,132, 9, 19,208,170, 85, 43, 36, 36, 36,224,248,241,227,120,244,232, 17, 88, 44, 86, 89,123,157,
-199, 39,252,252, 24, 60, 30,239,222,128, 1, 3, 60,127,248,225, 7, 94,189,122,245, 16, 27, 27, 91,119,195,134, 13, 11,175, 93,
-187, 54, 80, 36, 18,181,209,220,237,170,183,210,171,135, 4, 75,135, 11,251, 74,165, 82,196,198,198,234,179,204,123,104,216,176,
- 97, 50, 73,146,175, 41,138, 10, 7,224, 77,211,116, 23,130, 32, 46,161,212, 47, 81, 27, 34,154,166,191, 36, 8,162, 16,192, 51,
-146, 36, 95, 82, 20,149,108,176,219, 24,160,195,125,165, 95,197,255, 4, 65,132,173, 95,191,190, 95,101,226,170,146,107,179,220,
-244, 13, 27, 54,172,211,250,255, 33, 22,213,174, 40,239, 12,239,167,182,114,253, 37,180,194,194,194,170, 87, 32, 20, 6,133,157,
- 62,118,191,187, 28,174,158,173,125,181,172, 67, 52, 34, 31,220, 3, 64,255,162, 83, 87,248,253,140, 72, 6,243,151, 61,235,102,
-146,123,111,150, 32, 37, 61, 11,247, 46,254,130,108, 65,210, 33,128,158,139,196,208,194, 15, 62, 18,245, 6,121,217,219,216, 90,
- 74,228, 52, 40, 26,192,123, 98,235,147,160, 85,227,198,141, 7, 71, 68, 68,216, 74, 36, 18,222,157, 59,119, 74, 66, 66, 66, 50,
-228,114,249, 77, 0,119,213,109,162,178,179,179,135,168,133, 9,131,201,100,114,228,114,121,117,190, 11,173,230, 79, 28,115,103,
-227,158,131,188,215,207,163,177, 61,244, 34, 10, 74, 74, 84, 55,179,196, 95, 3,208, 40,250,235, 81, 57,226, 52, 26,180, 11,139,
- 36,192, 55, 97, 57,198,229, 73,120, 64,229, 67,178, 82,169,116,196,200,145, 35,249, 26,145, 5, 0, 57, 69, 10,102,137, 84,193,
-232,212,204, 6,173,187, 13, 65,228,141, 83, 56,121, 59, 13,110,118,198,183,235,155, 20,232,180, 71,179,179, 4,123,182, 6,239,
-221,186,113,229,124,206,188,190, 22,240,111,195, 2,143, 77,192,220,152,133,181, 59,246, 43,162, 30,220,126,202,231,243,195, 0,
-124, 45, 16, 8,192,231,243,139, 1,188,100, 48, 24,137, 42,149,170, 50,167,238,229, 0, 28, 14, 31, 62, 76, 42, 20,138,226,132,
-132, 4, 56, 58, 58,194,193,193, 1, 22, 22, 22,136,139,139,195,159,127,254,137,248,248,120, 80, 20,133, 22, 45, 90,232,117,176,
-114,115,115,241,244,233, 83,244,237,251,213,220,236,236, 44,115, 43,107, 27,209,157,240,219,155,106,195, 73, 81, 20, 1, 0,158,
-158,158,240,244,244,228,165,165,165, 57,135,133,133,217,175, 89,179,230,157,171,171,235, 81,177, 88, 92,206,114,160,171,208,210,
-136, 11,141, 8,228,241,120, 96,179,217, 40, 44, 44, 68,102,102, 38,138,138, 74,131, 54, 45, 45, 45, 63,137,208,170,194, 66,245,
-209,218,255,205,226,240,189,225, 78, 75, 75,203,145, 0, 22,234,184, 45, 80, 42,149, 96,179,217,240,241,241, 65,112,112, 48, 30,
- 61,122,132,223,127,255, 29,117,235,214,197,216,177, 99, 65,146, 36, 94,188,120,161,111, 23,169,136,136,136,133, 95,127,253,181,
-231,225,195,135,121,201,201,201,136,143,143,135,165,165, 37,130,131,131,185,147, 39, 79,110,120,227,198,141,229, 40, 13,126,169,
- 30, 90,209,133, 34, 35,254, 80,111,111,239,247,154, 56, 58, 58, 90, 92,190,124,217,190, 76,128, 85,140, 72,124, 31, 5,203,151,
- 47,223,234,225,225,177, 77, 61, 92,232, 11,192,132,166,105,191,208,208, 80, 2, 0,252,253,253,105,130, 32, 52, 15,164,103,167,
- 78,157,234, 22, 23, 23, 71, 7, 6, 6, 26,124,180, 12,168, 74,139, 76,214, 92,147, 85, 9, 40,125,132,154,182,197, 75,131,197,
-139, 23,123,174, 95,191,254,225, 7,138, 44,237, 55, 38, 90, 35,182,202, 30,166, 85, 14, 25,150,217,190, 72,190,163,189,141,245,
-162,177,157, 64, 81,128, 82, 5, 40, 85, 52, 68, 37, 98,196, 62,127, 84, 2, 30, 17,170, 83,119,184,156,160, 53, 63,204,105, 16,
-157, 74, 34, 61, 95,142, 91,103,247,210,217,130,164,193, 72, 60, 53,254,227,136,172,161,222,142, 14,246,183,142,237, 93, 77, 62,
-122, 43,131,138, 42,213, 89, 20, 69,151,253,254, 4,112,180,179,179, 11,184,127,255,190, 29,151,203,229,189,122,245,138, 58,117,
-234, 84,190, 92, 46,191,166, 37,178, 0,160, 83,155, 54,109,148,166,166,166, 16,137, 68,114,185, 92, 46,169, 70,100, 57,251,181,
-106,126,123,227,158,131, 60,137, 76, 6,161, 88, 10,134,141,125, 69,145, 5, 0, 29,187,185,215,169, 67,240,204, 64, 3, 72, 42,
-148,167, 87, 37,178, 0,128,203,229,246,152, 57,115,102,185,186,120,182,102, 44,165, 49,151,165,186, 27,147, 67, 69,222, 56,133,
-240, 23, 57, 20,143,205, 80,217,209,111, 27,232,186, 3, 10, 82, 99,246,252,126, 46,236,234,119,203,130,138, 75, 68, 69,112,115,
- 50, 66,113,145, 16,107,215,111, 84, 68, 68,132,223, 92, 56,119,106,135, 83,167, 78,109, 64,169, 51, 56, 0,188, 60,117,234,212,
-152,101,203,150,253,138,191,210, 60, 84, 68,122, 64, 64, 64,106,179,102,205,132, 30, 30, 30,194,220,220, 92,196,196,196, 32, 63,
- 63, 31,219,183,111, 71,108,108, 44, 52, 22, 65,157,124, 85,222, 23, 72,200,207,207, 51,165,105, 26,249,121,185, 38, 63,252,240,
-131, 69,109, 56, 85, 42, 85,185,107,171, 78,157, 58,152, 54,109, 26,187,164,164,196,242,221,187,119,230,218,243,116,229,148,201,
-100,208, 88,134,104,154,134, 76, 38,131, 80, 40,132, 76, 38,195,235,215,175,203, 68,150,122,253,159,204,162,165,249,205,227,241,
- 50, 53,231,178,102, 8,142,199,227,101, 85,213,254, 67,160,181, 46, 90,253, 91, 95,113, 88,227,246,232,120,220,193,102,179, 49,
- 97,194, 4, 60,124,248, 16, 9, 9, 9, 96, 48, 24, 16,137, 68, 40, 41, 41, 65,207,158, 61,193,225,112,244,181,104,209,108, 54,
-123,228,146, 37, 75,120,137,137,137,200,201,201,209, 56,211, 67,165, 82, 97,238,220,185, 70, 92, 46,119,164,190,166,123,129, 64,
-208,251,245,235,215,141, 43,126, 50, 50, 50,132,218, 62,133,181, 69,104,104, 40,225,239,239, 79,251,251,251,211, 26,193,101,128,
- 1,149,161, 10, 45,178,175, 42,139,214,199,176,138,105, 44, 91, 80, 7,136,212, 2, 26,145,213, 85, 75,120, 17, 26, 11,151,110,
- 67,135,110, 67, 91, 58,216, 88,223, 56,188,107,149,105,216,115, 2,169, 41, 73,200, 22, 36,163, 77, 7, 63,196, 62,143, 6,165,
- 80,157,198,235,208,154, 61, 57,235,249,187,123,120, 52,157,222,181,131, 23,130,194,138,241, 42,242, 50, 10,178, 5, 59,145,116,
-234,244, 71, 57, 66,174,254,205, 29,236,173,111,252,186,107,149,229,165, 24, 18, 41, 41, 73, 56,251,235, 86, 90, 33,151, 22,160,
-124, 36,151,222,111,205, 70,148,140, 83, 92,144, 9, 89,145, 10, 60,178,132,167,231, 32, 69, 6,128,240,173, 91,183,118,111,223,
-190, 61, 39, 32, 32, 32, 35, 63, 63,255, 44,128,251, 90,109,154,185,187,187,247, 13, 14, 14,118, 72, 73, 73,193,181,107,215, 50,
- 80, 26,250, 95, 21, 82,111, 71, 63,223,253,231,175,251,231, 27, 53,104,130,237, 75,190, 83,134, 62,138, 25, 0,224,146, 86, 27,
-143, 30,222,238, 97,107,190,159, 65, 82, 81,127,224,105,114, 38,222, 10,165,127, 86, 69,152,147,147, 67,148,148,148,184, 90, 90,
- 90,106,159,144,224,155,136,164, 11,134,186,167,247, 92,120,199, 73, 34, 87,129,203, 34,233,217, 3, 93,211, 31,158, 13,181,201,
-145,228, 16,154,104,196,154, 48,105, 88,143,129,187, 66,206,140, 14, 11,187, 48, 93, 46,149,120, 53,105,210,152,126, 28,113,227,
-233,194,185, 83,251,212,242,136,155, 62,124,248,144,100, 48, 24,229, 4,186,182,133, 72, 95, 75,145, 62,208,149,179,162,208,210,
- 64,169, 84, 18,181,229,148, 74,165,101, 66,171,226,195,189, 50,193,248,119,108,191, 62, 22, 42,237, 33, 67,141, 63,157, 68, 34,
-177, 87,251,108, 57,124, 76,139,214,135, 68, 34, 86, 55,124,169, 79,255, 72,146, 4, 69, 81, 96,179,217,104,209,162, 5,194,194,
-194, 96,109,109, 13,115,115,115,152,155,155,195,200,200, 8, 54, 54, 54,101, 66,139, 36,117,142,210,161,165, 82,105,221,186,117,
-235,226,245,235,215,224,241,120,101, 31, 46,151, 11, 79, 79, 79,136, 68,162, 58,248,148,182,123, 3, 12,248,123,239, 43, 97,218,
- 98,137, 32,136,176, 69,139, 22, 45,169, 45,223,162, 69,139,150, 84,102,225,250, 64,193, 85,206,186,197,212, 86,144,149, 42, 73,
-181,200, 58,180,115,165,249,153, 39, 64,106,106, 34,174,158,220, 81,164,144,203,242, 41, 74,225,250, 54, 62, 26, 32,241,139, 78,
- 93, 32,233,118, 3,251,118, 35,174,190,144,161,176, 32, 27, 47, 31, 95, 78,130,152,179,248,163,137, 44, 7,219, 27,135,119,173,
-180, 60,255,156, 64, 74, 74, 18, 46, 29,219, 94,168,144,203,123, 32, 49,244,241,135, 80,143,100,179, 7,178, 93,222,245,155,232,
-155, 14, 21,161,194,200,216,184, 47,179, 50, 48, 80,112,167,250,200, 48,109,100,103,103,159,221,186,117, 43,241,227,143, 63,118,
-149, 72, 36,191, 1,208, 54, 81,122,185,185,185, 13,223,183,111,159,117, 74, 74, 10,235,206,157, 59,162, 27, 55,110,208, 0,206,
-215, 96,113, 89,208,115,252, 52, 70,171,122,117,102, 70, 37,165, 13, 0,240,135,214,108,207,126,173,155,221, 61,184,126,185,153,
-226,110, 40,138, 5, 41, 88,124, 55,181, 16,128,206,251, 91,161, 80, 64, 40, 20, 66, 81,156,171,108,195, 23, 9, 3,135,216, 75,
- 51,243, 37, 76, 22, 85,162,244, 48,207,146,222,200,125,203, 48, 54, 54,214,107, 95,238, 90, 63, 63, 4, 64,200,144, 33, 67, 14,
- 63,139,184,208,134,207,231, 95,240,240,240, 32, 0,160,138, 8,195,170,176, 10,192,220,142, 29, 59, 18, 62, 62, 62, 15,182,109,
-219,118,165, 58,177, 82, 27,139, 86, 77,208,149,147,162, 40,178,138,253, 75,212,150, 83,219,162, 85,147,208,250,148, 22,173,202,
- 68,139,182, 72,212, 22, 66,255,134,168,195,234,196,148, 62,253,211,248,201,177,217,108, 68, 71, 71,195,197,197, 5,114,185, 28,
-102,102,102, 48, 51, 51,131,169,169, 41,138,138,138,192, 98,177,160,231, 54, 83, 60, 30,239, 93, 76, 76, 76, 99, 59, 59, 59,168,
- 84,170,114, 98,235,213,171, 87, 48, 49, 49, 73,211,215,162,197,231,243, 47,171,163, 14,203,193,209,209,209,226, 99,236, 87,109,
- 75,150,191,191,191, 97,136,208,128,106,173, 89, 85, 88,181,178, 43, 88,162,100, 90,255,179, 81,154,195,173,159,250, 55, 42,249,
- 45,171,100, 90,238,250,245,235,111,104,249,119,101,127,224, 38,104, 82, 60,148,139,112, 97,214,100,201,178,183,182,186,113, 96,
-123,160,249,201, 72, 32, 45, 37, 17,183, 78, 7, 11,149, 42,249, 23,160,104, 65,196,181,211,161, 32, 80,130,183,161,183,116,187,
- 69,160, 85,171,166,174,248,253,133, 2,217,169,175, 64,211,212, 33,100,133,148,124,240,209,113, 27,212,194,222,218,246,198,161,
-224, 64,139, 51,209, 4, 82, 83, 18,113,245,100,112,161, 82, 81,210, 29,137,167, 35,107, 75, 59, 1,176, 98,152,240,118, 15,246,
-107, 53,212,213,205, 25, 20,173, 0,197,166, 49,104,129, 45,243,101, 84,201,239,225, 60,225, 73,170,152,154,158,118, 95, 55, 7,
-186,226,226,226,223, 1, 60, 70,249,244, 10,205, 27, 53,106, 52,116,247,238,221,118,169,169,169,188,168,168, 40,241,222,189,123,
-179, 40,138, 58, 3, 64,151,161,212,239,162,146,210, 14,160,124,190,156,230,243,199, 7, 68, 4,140,155,200, 75,188, 22, 2,171,
-196, 88,124,127, 55, 93,245, 50, 95, 54, 66,109, 93,171, 20,182,182,182,116, 78, 78, 78,114, 65, 65, 65, 99, 19, 19, 19,228,230,
-230, 34, 47, 47, 15, 66,161, 16,210,194, 60,165,141,170, 64, 68, 40,243,192, 98,177,144,149,162,128, 74,165,202,208,213,154, 5,
-192,106,213,170, 85,147, 40,138,210,100, 68, 44, 23, 93,168,213, 78,115, 62, 52, 30, 50,100,200, 97,173,168, 67,109,103,120, 77,
-122, 7, 66,157,222,161,253, 31,127,252, 17,215,167, 79,159,212,202,196, 10,151,203,213,219, 81,186,170, 40,198,218,112, 86,101,
-209,170, 56, 93, 31, 78,205,240,165,198, 9,190,226,116, 13, 24, 12, 6, 40,138,130, 14, 65, 21,127,171,104,209,142, 14,172,141,
-200,169,112,108,170, 77, 28, 90,203, 72,196,143,106,209,210, 28, 11, 54,155,141,115,231,206, 97,220,184,113, 80,169, 84, 48, 54,
- 54,134,169,169, 41, 76, 76, 76,112,250,244,105,104,210, 63,232,163, 95, 21, 10,197,145,245,235,215, 47,217,179,103,143, 17, 77,
-211,224,112, 56,101, 66, 43, 48, 48, 80, 44,151,203,143,232, 36,180, 52, 25,223, 41, 58,198,196, 68, 89,109,212, 97,101,203, 84,
-225,175,101,185,106,213,170, 49, 20, 69, 13, 68,133, 20, 14, 21,218,149, 75,253, 96, 72,239, 96,128, 14,247,147, 71,255,226,238,
-105, 4, 22,161,101,201, 42, 19, 92,100,117,226,197,206,202,242,198,254,237,129,230, 71, 31, 17, 72,124,251, 22, 55,127,219, 81,
- 42,178,222,156,124,130,228,208, 76, 36,134,118,198,219,208,222, 58,191, 61, 17, 68, 43, 39,123, 75,228,137, 40, 20,230,188, 3,
-104, 68,125, 12,145,101,103,101,119,227,231,224, 64,139, 83, 79, 72, 36, 38, 38,226,234,201, 29, 66,165, 82,242,197,135,136,172,
-145,108,246,192, 70,238,206, 9, 75, 39, 13, 28,234,211,208, 17, 54,239,226,112,126,236, 80,172, 62,254, 13,204,236, 24,104,215,
-215, 12, 19,214, 58, 14,229,123,114, 95,243, 59, 99,160, 30,212,218, 34,171, 85,253,250,245,135,222,191,127,223,214,219,219,155,
- 23, 31, 31, 47,217,187,119,111,150, 88, 44,190, 2, 32, 90, 15, 78,109,145,213,106,209,228,177, 17, 27,247, 31,230,145,108, 14,
-130,142,156,199,172,219,169,170, 11,201,133, 67, 80,126, 88,177, 82, 72,165,210,107,193,193,193, 82,146, 36,145,151,151,135,156,
-156, 28,100,101,101,149,125, 23, 20, 20,128,193, 96,224,250,245,235,178,194,194,194,251,186,118,240,222,189,123,245,211,210,210,
- 60, 4, 2, 65, 27,245, 39, 30,165,209,133,166, 90,211,218, 8, 4,130,174, 0, 30,105,166,167,166,166,214,123,240,224, 1,191,
- 38,126, 51, 51, 51,176,217,236,114, 22, 45, 46,151, 11, 7, 7, 7, 40,149, 74,156, 56,113, 2, 0,242,170,227, 96,179, 57, 2,
-146, 36, 64,209,148,148,199,227, 81,124, 62,191, 82,129,165, 15,167, 26,169, 95,126,249,165, 36, 50, 50,178, 82,139, 86,109, 56,
-105,154, 46,233,213,171, 23,210,211,211,193,227,241,202, 30,214, 26, 65, 69,146, 36,184, 92, 46, 50, 50, 50, 48,101,202, 20,208,
- 52, 93,242, 79,223,121,180,125,154,212, 98,136, 0, 64,168,133,208,123,126, 90,186,250, 64,105,134, 6,105,154,134, 70,112, 85,
-152, 95,182, 46, 93,178,183, 87,240,233,154, 92, 80, 80,176,177,180, 59,244,222, 10,223,251,244,120, 40,148, 9,173,216,216, 88,
- 28, 62,124, 24, 5, 5, 5,224,112, 56,200,207,207,199,193,131, 7, 17, 19, 19, 3, 14,135, 3,205,190,208, 85,191,249,248,248,
-108, 12, 15, 15,143, 25, 49, 98,132, 56, 58, 58, 26, 98,177, 24,209,209,209,232,221,187,183,228,238,221,187, 9, 98,177,120, 21,
-116, 25, 58,212,100,124, 87,151,215,145, 74,165,136,138,138,170,244, 83,213, 50, 21,145,144,144,224,170, 82,169, 26,211, 52,237,
- 75,211,180, 57,212, 41, 28,212,255,181, 63, 95,170,231,153,211, 52,237,171, 82,169, 26, 37, 36, 36,184, 26,228,132, 1,159, 41,
-110,105,137, 45, 90, 75,100,221,170,222,162, 69,145,193, 7,118,172, 52, 63,242,144, 68, 74,114, 2, 30, 95,220, 45, 84, 81,138,
- 47,244, 44,135,211, 3, 90,185, 54,120, 70, 38, 94, 20, 81, 26,206, 92,152,147, 2,208,140,218, 8,173,114,156,160,200,224,131,
- 59, 2, 45,142, 61, 38,144,158,242, 6,119,207,238, 18, 42,149,210,238,120, 27, 26, 85, 27,206,145,108,246, 50, 22,131, 88,218,
-171, 83, 75,118,231,150,238, 48,201, 74, 66, 70,106, 58, 78,196,102,231, 37,228, 75, 39,222, 37,228, 72,126, 35, 61,208,119,146,
-181,181,149, 35, 11,253,166,218, 88,223, 63, 95,248, 59,193, 18,201,105, 57,189, 94,112,183,172, 44, 69,249,126,190, 15, 71, 51,
- 51,179, 17,143, 31, 63, 54,231,241,120, 70,143, 31, 63,166,246,238,221,155, 43, 22,139, 47, 2,136,208,105,219,223,135,115, 91,
-119,183, 91,235,118,237,231, 21,139, 74, 32,146,201,193,117,224,171,206, 68, 60, 31,140,170, 19, 96,150,227,228,114,185,199,142,
- 29, 59,214,183, 75,151, 46,174, 94, 94, 94,100, 94, 94, 30,138,139,139,203,156,171,237,236,236, 16, 27, 27, 75, 37, 38, 38,166,
-115,185,220,227,186,246,179, 99,199,142,137, 36, 73,198,171,135,209,226, 81, 33,186, 80,171,105, 99,129, 64,208,150,207,231,223,
- 2, 96,172, 21,117,168,205,169, 73,239,176, 4, 0, 73, 16,196,163,232,232,232,226, 62,125,250,192,200,200, 8, 34,145, 8,117,
-235,214,133, 82,169,196,197,139, 23, 17, 25, 25, 41,162, 40,234, 86, 37,226,181, 92, 63, 37, 18,113, 93, 0,164,184,164,164,197,
-152, 49, 99,186,206,155, 55,175, 92, 72,186,189,189, 61,172,173,173,245,226, 4,128,188,188,188,166,127,252,241,199,156,232,232,
-232,239,250,246,237,107,177,100,201, 18,110,253,250,245,161, 82,169,200,218,114,230,231,231, 91, 68, 69, 69,109,234,220,185,243,
-140, 62,125,250, 48,215,173, 91, 7, 11, 11, 11,168, 84, 42, 24, 25, 25,161,176,176, 16,171, 86,173,194,157, 59,119,148, 52, 77,
-239, 18, 10,133,223,235,121, 46,225, 67,175,205,170, 44, 64, 85,165,100,168,162,253,223,222,207, 10, 62, 93, 80,167,112, 88, 88,
- 69, 6,123,232,122,206,107,132, 22,131,193, 64, 82, 82, 18,246,238,221,251, 94, 30, 45, 77,250,135, 42,184, 43,219,118,250,230,
-205,155, 42,130, 32, 58, 60,126,252,120,225,232,209,163, 39,138, 68, 34,103, 19, 19,147,116,133, 66,241,139, 88, 44, 94,139, 82,
-127, 84,182, 62,247, 16,145, 72,148, 92, 89,212, 97,197, 54,128,101,181,156, 21,210, 59,148, 75,225, 80, 97,153,114,169, 31, 42,
- 73,239,240,183, 31,119, 3,231,191,146,243,115, 23, 91, 85, 39, 44,125, 15,173, 38,179, 88, 98,133,119,120, 2,241, 33, 34,235,
-125,107,137,164, 36, 97,249,177,119, 45,101, 82, 9, 68,194,204,151, 72, 58,145,245, 65,155,165,238,231,237, 4, 2, 73,137,111,
-240, 48,108, 87,105, 63,223,134,214,186,159, 4,176,248,167, 75,161,108,194,194, 26, 79,231,140, 67,122,129, 8,151,222,230,159,
-164, 75,164,211,143, 0,249,184, 3,144, 74,105,248,193, 31, 50,118,251, 14,178, 24,106, 91,135,133, 45,243,127, 1,111,145, 13,
-187, 93,247, 46,250,212, 64,204,224,241,120,225,219,183,111,239,225,235,235,203, 29, 50,100, 72,101, 14,242,250, 34,245,209,171,
- 55, 63, 93,216,179,121,190,141,119,123,236, 92,182, 64,117, 44,226,121,197, 40,196,106,225,225,225,161,186,119,239,222,188, 41,
- 83,166,108,233,209,163,135,211,128, 1, 3, 56,117,235,214, 5,151,203,197,155, 55,111, 16, 30, 30, 46,123,251,246,109,122, 73,
- 73,201,188,230,205,155,235,147,227, 44,127,249,242,229, 27,213,235, 32,212,195,133,109,160,142, 46,212, 52, 82, 39, 45,109, 3,
-192, 56, 48, 48,112, 52, 0, 84, 17,246,189, 28,192, 30, 0, 76,154,166, 51, 66, 66, 66, 58,156, 61,123,182,195,220,185,115,217,
-125,251,246,197,253,251,247,113,245,234, 85,185, 92, 46,143, 80, 11, 87, 93, 75,229, 80, 0,162,148, 74,229,243,160,160,160, 14,
- 12, 6, 99,185,102, 70, 76, 76, 12, 14, 29, 58, 84, 27, 78, 37,128, 77,153,153,153, 63,133,132,132, 44,191,118,237,218,248, 49,
- 99,198,152, 43, 20, 10,196,198,198,226,231,159,127,174, 21,167, 80, 40,156, 99,107,107,187,244,226,197,139,191, 92,185,114,229,
-235, 81,163, 70,145,179,102,205, 66,112,112, 48,126,251,237, 55, 74,165, 82,157,101,177, 88, 99,114,114,114, 68,159,226,174,163,
- 30,134, 75,215,179,214, 97,141,188, 31, 50, 52,168, 35, 4, 31, 74,160,217, 14, 63, 63,191, 50, 43,163,198, 10,167,221,134, 32,
- 8,189,135, 14, 1, 88,210, 52, 77, 1,216,133,210,250,162,218, 89,225, 25,248, 43,115,188,174,140,205, 4, 82,203, 24, 72, 17,
- 91,125, 81,105, 75,128, 70,179, 26,216, 10,150, 47, 95,190,117,197,138, 21, 91, 43,166,112,208,110, 84, 49,245,195,202,149, 43,
- 97, 72,239, 96,192,127, 21,149, 11,173,168,125, 10, 69,131,193, 75,182,175, 91,176, 66,169,144, 9,105,200,253,241,230,116,244,
-135,174,140,166,232, 69,215,143, 6, 6,131, 70, 62,173, 82, 46,252,224,222,255, 77,253, 36, 44,172, 81,180,106, 26,126,123,145,
- 78,103,136, 20,223, 28,145,203,203, 89,131, 74,125,178,168, 97, 55, 36,249, 39,172,156, 88,103,230,124, 97, 67, 92,200, 27,173,
-247,122,178,178,178,206,109,221,186,149,220,188,121,115,215,146,146,146,138, 14,242,181,197,130,254, 51, 23, 49,218, 53,114,157,
-249,240,117,242, 64,232, 48, 92, 88, 17, 29, 59,118, 20,196,197,197, 5, 92,185,114,101,196,237,219,183,123,136, 68, 34, 87,130,
- 32, 96,108,108,156, 44,149, 74,175,113,185,220, 99,122,138, 44, 0,192,138, 21, 43,232,149, 43, 87, 18,113,113,113, 52,131,193,
-248, 19, 64, 34,131,193, 72,210,118,130,215,158,174, 89, 38, 48, 48, 80,151, 7,226,237,226,226,226,200, 85,171, 86,117, 89,181,
-106, 85, 11,181, 85,232, 54,254,242,249,210, 23, 10, 0,183,217,108, 78, 58, 65, 16,206,108, 14, 87,116,239,222,189,107, 31,200,
- 89, 34,151,203, 23,166,164,164,108,217,178,101,203, 90, 19, 19,147,182, 49, 49, 49,127,126, 8,167, 90, 68, 13,182,182,182,118,
- 58,124,248,240,169,131, 7, 15,182,103, 50,153,247, 9,130, 24, 34, 20, 10, 63,105, 81,105,117,129,232,149,122,212, 58,212,137,
-247, 99, 39, 41,253, 59,132,155, 74,165, 42, 94,186,116,105, 86, 69,225, 85,209,122,165,249,175, 78,229,162,203, 62,213, 39,138,
-178, 6,225, 66, 20, 3, 64,105,237,194,210,178, 58,186, 22,149, 6, 32,174,233, 58, 39, 73,242, 44,128,151, 36, 73,190,174, 24,
-232,162, 61,111,229,202,149, 53, 93,231, 6, 24,240, 89, 67,135, 59, 91, 32, 9, 4,214,214,147,246, 31, 52, 87,126,156,126, 6,
-176,217, 43, 73, 96, 62, 0,130, 6,182, 28,145,203,127,168,110, 65,199,142, 88, 75, 19,152,171,222,153,235, 50,238, 98, 77, 45,
-182,189, 14,116,168, 63,168, 39,103, 19, 84, 95, 80,246, 61, 78,127,127,127, 70, 21, 15,243,114, 69,165,171, 66,104,104, 89, 22,
-255,170,250,169,125,190,153, 61,120,240,192,201,199,199, 71,128,242, 78,255,149, 77,167,245,220,118, 6, 0,213, 71,222,159,159,
- 5,167,155,155, 27,231,205,155, 55,178,127,215,181,105,224,252, 87,114, 90, 54,117, 1,129, 73,208,206, 29, 84,173, 69, 75, 75,
-160,209,244,207, 40,136, 77,169,162,159,154,235,220, 50, 33, 33,193,181, 97,195,134,201, 0, 10, 42,244,163,178,121,180,225, 24,
-253,223,115, 86,134,201, 40, 95,138,206,128, 74, 14,132,129,211,192,105,224, 52,112, 26, 56, 13,156, 6, 78, 3,103,109,133,214,
-103, 13, 18, 6, 24, 96,128, 1, 6, 24, 96,128, 1, 6,252, 45, 32,170, 81,165,250,152, 4,107,163,108,175, 25, 56, 13,156, 6,
- 78, 3,167,129,211,192,105,224,252,191,227,172,137, 91,123,249,207,117,232,240, 31,235,183,193,172,106,224, 52,112, 26, 56, 13,
-156, 6, 78, 3,167,129,243, 67, 4,203,103, 13, 38, 12, 48,192, 0, 3, 12, 48,192,128,207, 6, 61,220,193,103,170, 64,254,241,
- 70,167, 32,170, 26,209,199, 13,117, 0,224, 99,241,253,159,130, 15,224, 43,173,255, 23,160,142,140, 55, 8,173,207, 23,141, 0,
- 44, 1,160, 93,139,236, 33,128,245, 21,218, 29, 5,160, 93,144, 80,132,210, 58,129,175,245, 89, 25, 73,146,235,187,116,233, 50,
-253,206,157, 59,155,149, 74,229,170, 90,244,215,149,207,231,111, 36, 8,162, 53, 0, 22, 65, 16,111, 50, 51, 51,215, 43,149,202,
- 15,137, 90,105,224,232,232,184, 1, 64, 75,146, 36, 89, 4, 65, 36,100,102,102,174, 81, 42,149, 55, 63,128,211,204,193,193,161,
- 19, 77,211,142, 0, 24, 44, 22, 43, 55, 45, 45,237, 1,106,153, 91,201, 63, 48,150, 93, 40, 82,178, 0,192,220,132,169, 8, 13,
-108, 42,215,117,154,225, 20, 55,192,128,255,111,208,165,145,201,229,208,219, 13,107,105, 37,190, 87, 1, 68,175,250,216,113, 57,
- 17,223, 87,181, 60, 81, 73, 84,115, 69,206,222,110, 88,171,162, 75, 57,122,185, 97,211,229, 55,168, 54,210, 94, 23, 78, 13,246,
- 1,228,100, 29,170, 20, 16,186, 69, 95,255,219,241, 21,202, 15, 21,150, 13, 29, 86, 43,180,134,185,131,175, 98,130, 25, 26, 11,
- 77, 24,175, 25,128, 22,234,135,252,107,148,230, 42, 42,250,192,206,125, 46,156,255, 54, 44,167,105, 58,160,220,201, 90, 73, 30,
-162, 47,190,248, 98,192,149, 43, 87,140, 53,245,238, 40,138,130,145,145,145, 18,192, 88, 61,214,101, 63,108,216,176, 69, 7, 14,
- 28,192,208,161, 67,151,134,133,133,109, 5, 80,172,235,194, 86, 86, 86,254,150,150,150,193,251,247,239,183,107,223,190, 3,193,
-225,112,240,230, 77,130,243,148, 41, 83,188,226,226,226,206,102,101,101, 77,212,119,227,173,173,173, 71, 90, 90, 90,110,217,187,
-119,175,109,231,206,157, 65, 16, 4, 34, 35, 35,157,231,204,153,211,226,221,187,119,199, 51, 51, 51,103,232,203,105, 99, 99,227,
-110, 97, 97,209,109,231,206,157, 70,157, 58,117, 2,143,199, 67,116,116,180,233,212,169, 83, 29,211,210,210, 98, 51, 51, 51,111,
-233, 43,178,158, 69,158,255, 90, 41,151, 6, 1, 0,147,205, 93,208,126, 75,196,249,103, 55,206,247,175,105,154,127, 96,236,239,
- 6,177,101,128, 1, 6,104, 99,164, 19, 28,105, 26,243,175,252,188,140, 4,128, 94,227, 87,207, 26,233,132,205, 71,210,171,174,
- 97,171, 39,223,247, 99,234, 32,248,112, 26, 50, 63,164,159,251, 0,114, 14,147, 57,171,157,143,143,237,183,119,239, 38,200,129,
- 95,254, 79, 14, 81,165,195,156, 85, 10,173,193, 77,177, 74, 89,106, 49, 33,250, 52,196,241,171,137,140,240, 47,190,248,162,225,
-132, 9, 19,136, 86,173, 90, 33, 50, 50,210,253,248,241,227, 95, 93,184,112, 33, 65,165, 82, 69, 2,120, 1,221,179, 90,179, 0,
-120, 50, 24,140,214,255,114,206,127, 51, 76,212,226, 42, 19,127, 37, 58,125, 47,225,233,245,235,215,207, 49,153, 76,141, 69,171,
-157, 72, 36,114,168, 96, 5,211, 5,245, 20, 10, 5,226,227,227, 65,146, 36, 11, 64,125,188, 95, 82,163, 42, 56, 27, 27, 27,239,
-142,120, 24,105, 67, 48,141,144, 47, 1, 32,145,131, 99,234,128, 3,135, 66,172,231,205,158, 49,248,230,205,155,225, 69, 69, 69,
-191,234,209,159,250, 38, 38, 38, 91,159, 62,125,106, 99,108,108, 12,138,162, 80, 84, 84, 4, 71, 71, 71,236,223,191,223,114,222,
-188,121, 1,133,133,133, 55, 37, 18,201,111,250,136,115, 11, 11,139,110,207,159, 63, 55,210, 20,148,150,201,100,112,118,118,198,
-209,163, 71,185,179,102,205,106, 90, 80, 80,144, 42,147,201,222,234, 74, 88, 40, 82,178,148,114,105,208,225, 93,129, 46, 0, 48,
-102, 70, 96, 16,167,200,252,162, 46,211, 10, 69,202, 11, 0, 12, 66,203,128,127, 26,173,109,109,109, 67,115,114,114,110, 1,152,
-136,143, 99,105,112,231,241,120,205, 41,138,114, 36, 73, 18, 12, 6, 35, 67, 36, 18, 61, 5,240,170,182,132, 54,110,126,253,193,
- 53, 30, 7,154,106, 65, 2, 32, 72, 50, 90, 37, 47, 57,148,251,234,230,249, 15,226,228, 24,141, 7,232, 22, 36, 64, 17, 36,249,
-148, 82,150,236,207,137,191,121,233,223,114,112,238, 11,209,216,205, 81,247,194,152, 31,131,111,120, 3,240, 73, 10,228,209, 36,
-221,135, 21,103, 2,125,103,207,158,237, 56, 99,250,116, 98,220,216,177,141,110,221,185, 67,116,213,167, 90,193,231,137, 42, 29,
-223, 43, 21, 90,254, 77, 97, 69, 3, 11,143, 7, 47, 33,153, 12, 6, 49, 98,246,250,128,131,187, 54,145, 61,251, 15, 41, 27, 62,
-241,245,245,133,175,175, 47, 17, 20, 20,212,232,207, 63,255,108,116,244,232, 81,101, 68, 68,196, 83, 0, 39,170, 90, 89,111, 55,
-136, 41,128,199,102, 49, 69, 35,150,253,186,215,199,199, 7, 92, 46, 23, 31,194, 9, 0, 61, 27,146,111, 89,214, 13,158,142,152,
-185, 60,185,125,251,142,244,199,224,252,140,240, 16, 40, 43,106,109,229,226,226,210, 73,169, 84,242, 0,128,201,100, 74, 82, 82,
- 82,102,162,180, 54, 32, 0,156,165, 40,106,128, 30,220, 36,128, 21, 3, 6, 12, 88,250,237,183,223,162,110,221,186,152, 53,107,
- 22, 20, 10, 69,228,165, 75,151,150, 3,216,128, 26, 46, 30,123,123,251,229,187,119,239,182,102,114, 76,208,106, 97, 34, 4, 5,
- 74, 0,128, 41, 23, 56, 55,141,198,172, 89,179,204, 31, 63,126,188, 70, 31,161,101,111,111,191,106,255,254,253,214,198,198,198,
-160,105,186,172, 22, 99,113,113, 49,138,139,139, 49, 99,198, 12,243,216,216,216,141,250, 8, 45, 7, 7,135, 78, 59,119,238, 52,
-226,241,120, 40, 46, 46,102,203,229,114,162,168,168, 8, 37, 37, 37,180, 76, 38,147,207,156, 57,147,251,226,197, 11, 63,129, 64,
-240, 22, 6,252, 91,192, 0,240, 13,139,197, 26,212,176, 97,195, 54,175, 95,191,126,162, 84, 42, 79, 3, 56,253, 17, 94,166,186,
- 59, 57, 57,173, 77, 79, 79,223, 9, 32,228,255,101,135, 58, 56, 56,156,190,119,239,158,203,238,221,187,199,110,222,188,249, 34,
-128,223, 62,128,142,205,102,179, 7,119,237,218,213,101,204,152, 49, 28, 7, 7, 7, 72,165, 82, 36, 38, 38,154,159, 60,121,210,
- 53, 58, 58, 58, 85, 93, 17, 67,231, 23, 10, 27,247,142,166, 96,154, 31,239,208,177, 83,231,161,131,191, 49,115,176,177,128, 88,
-166,194,235,100, 65,221, 63, 46,158,235, 26,199, 54,186, 39,151, 11,135,231,190,186, 87,172, 47,103,183,110,221, 59,247,232,222,
-221,204,194,210, 2, 66,145, 28,111,146,210, 92,111, 92, 61,239,203,100, 26,221,166, 8,197,168,172,231, 87, 75, 62,229,177,153,
- 5, 48, 69, 60,155,230, 45, 58,182,122,220,107,194,154, 54, 52, 77,131,164,177,163,162, 53,107, 22,192,220, 81, 90,246, 75, 47,
- 62,208, 52, 77, 16,216,164,109,205,234,237,134,181, 52,141,239, 65,130,232, 93,195, 48,165, 6,189, 0,174,165,181,181,207,212,
-201,147,137,162,194, 66, 68, 71, 71,151, 84, 20, 89, 91,235,128,125,155, 68,189,179, 41,181, 23,219,255, 82,107, 86,165, 67,135,
- 58,231,209, 50, 54, 54,174,116,186,133,133, 5,186,117,235,134,245,235,215, 51, 1,180,174, 48,187,124,145, 85,128, 27,182,103,
- 49, 44, 76,184,100,221,186,117,205,204,205,205, 63,152, 19, 0, 64, 83,245, 59,214,165,191,124,244,235,146,177,215,142,110,241,
- 20, 21, 21,176, 42, 54, 49, 53, 53, 69,227,198,141,177,116,233, 82,221, 56, 63, 28,255, 40,167,163,163, 99, 19, 95, 95,223,214,
-215,111,221,178, 76, 79, 79,231,166,167,167,115,175, 92,191,110,217,161, 67,135,214,142,142,142, 77,202,118, 21, 77,235,211,207,
-213,187,118,237, 90,126,246,236, 89,210,215,215, 23, 86, 86, 86,232,214,173, 27, 46, 94,188,200,220,188,121,243, 58, 0, 75,107,
-234, 39, 73,146,157,125,125,125, 9,208, 52, 50,132, 74, 60, 88,223, 4,209,155, 60, 80, 36,161,145, 39, 44,132, 88, 44,129,177,
-177, 49, 15,165,195,189,186,110,123,199, 14, 29, 58, 16, 0,202,196, 85, 81, 81,233,167,184, 88, 4,153, 76, 14, 46,151,107, 6,
-128,167, 43, 39, 77,211,142,157, 58,117, 2, 0,200,229,242,178, 55,188,130,130, 2, 66, 40, 20, 66, 38,147,129,197, 98,177, 81,
-179, 95, 99, 25,167,185, 9, 83,193,100,115, 23,140,153, 17,152, 50,102, 70, 96, 10,147,205, 93, 32, 51, 43, 84,233, 50,205,220,
-132,169,248,196,231,167, 29, 73,146, 63,187,185,185,197,146, 36,121, 24,128,227, 7,114,182, 5,176,206,200,200,232,154,135,135,
- 71,138,177,177,241,117,181, 80,239, 80, 75, 78,142,177,177,241,245,117,235,214,157,122,242,228,201,208, 63,255,252,179,254,179,
-103,207, 6, 7, 5, 5, 29, 55, 53, 53, 13, 71,121,191, 68,189,175,205,250,245,235, 31,124,240,224, 65,219,142, 29, 59, 30, 0,
-192,253, 72,215, 59, 3, 64, 75,232, 84,145,227,147, 28,119,167, 86,173, 90,185,240,120, 60,244,232,209, 3, 0,252, 62,132,147,
-205,102, 15, 94,186,116,169,219,178,101,203, 56, 2,129, 0,215,175, 95,199,195,135, 15,161, 84, 42, 49,109,218, 52,238,152, 49,
- 99, 26,152,153,153, 13,214,171,159, 76,243,227,179,231,204,237, 51,127,214, 36,179,167,239,228, 56,116,237, 29,126,143, 16, 32,
-171,132,131,254,131,199, 88,244, 30, 56,172, 55,135,107,113, 92, 95,206, 69, 11, 23,246,153, 60, 62,192, 44, 70, 64,225,220,253,
- 12,220,143, 23, 66,201,178, 68,223,193, 19,173, 90,116,234,243, 21, 19,172, 95, 62,245, 49,218, 15,180,159, 61,123,182,221,130,
- 77, 71,238, 58,181,253,102, 71,118, 62,124,181,133,143, 59, 96,105,109, 98,242, 77,124,215,174,147,140, 74,235,197, 86,203, 89,
-142,175,245,192,224,172,124,116,209,246,207,234, 98,141, 70,234, 97, 69,198,149,159,151,145, 52,129, 89, 35,157,202,221, 7, 42,
-237,231, 77, 96,232,236,185,115, 89, 22, 86, 86,216,181,107, 23,164, 34, 81, 57,159,217,238, 46,232,115,205,152,153,218,192,195,
- 57,182,155, 43, 17,254, 31,124, 95,153, 92,165, 69, 43, 44, 44,140,238,215,175, 31, 1, 0,161,177,200, 31,220, 20, 27,135,125,
-187,110, 41, 65, 18,116, 61,207,142, 49,117,220,154,137,108,108,108, 80, 82, 82, 2,169, 84, 10, 54,155, 13,137, 68,130,119,239,
-222,225,254,253,251,176,178,178,210,171, 39,133,133,133, 48, 53, 53,133,169,169,233, 71,225, 92, 60,182, 7,247, 77, 74, 54,247,
-242,253,155, 93,183, 79,255,173,189, 91, 75,191,103,221,135,205,122,110,110,231, 36,121,246,236, 25,238,221,187,135,252,252,124,
-248,248,248,252, 87, 14,230, 67,181, 79,214, 67, 0, 86, 13, 27, 54,116,190,124,237,182, 85,177,132, 50, 79,202, 84,176, 40,138,
-130,177, 49, 95,121, 34,244,156,112,232,224,254, 68, 70, 70, 70, 22,128,135,106,113, 91, 83, 77, 69, 30,128, 38,254,254,254,139,
-166, 79,159,142,132,132, 4, 76,154, 52, 73,252,240,225,195,220,142, 29, 59,218,236,223,191,223,104,222,188,121,184,117,235,214,
-138,176,176,176, 51, 0, 18, 1, 84, 90,171,141,166,105, 54,155,205,134, 82, 45, 27,228, 42,170, 76,223, 23, 22, 22,130, 22,231,
-131,205,102, 51, 0,216, 65, 71, 63, 58,138,162,216, 44, 22,171, 76,100,189,203, 44,196,187,172, 18, 20, 22,203, 32, 22, 43, 33,
- 19,211, 96, 24,219, 48,129, 36, 7, 0, 73, 80,170, 87, 0, 0, 0, 32, 0, 73, 68, 65, 84,186, 90, 71,120, 60, 30,148, 74, 37,
-138,138, 74,187,161,177,148,201,100, 50, 8,133, 66, 48, 24, 12, 83, 0,230, 0,242,116, 33, 84, 59,185,255,174, 30, 6,196,163,
- 35, 3,108, 95, 95, 88, 92,110,154,185, 9, 83, 17, 58,175, 41,195,198,185,197,157,150, 67,127,241, 40,155,246,105,253,179,184,
-118,118,118, 55, 78,157, 58,213,180, 81,163, 70, 72, 76, 76,244, 24, 50,100,136,143, 64, 32,104, 9,253,107, 50, 26,147, 36,185,
-113,204,152, 49,211, 71,140, 24, 65,184,187,187,131,201,100, 66,169, 84, 58, 39, 36, 36,116, 59,121,242,228,194,131, 7, 15,238,
- 87,169, 84,223, 65,119,191, 63,146,195,225,156,216,187,119,111, 23, 31, 31, 31, 28, 62,124, 24, 15, 31, 62,164,218,182,109, 75,
-142, 30, 61, 26,174,174,174, 62,163, 71,143,254, 93, 42,149,246,173,165,101,203,181, 67,135, 14, 46, 12, 6, 3, 29, 59,118,100,
-223,187,119,175, 21,128,123, 31,184, 79, 77,157,157,157,111,249,249,249,181,188,118,237, 90, 84, 70, 70,134,159, 30,219, 11, 0,
- 3,157,156,156,130, 44, 44, 44,172,244,184,199,150,164,165,165,125, 15, 32, 84,199, 69,218,183,110,221, 26,201,201,201,104,210,
-164, 9,216,108,118, 7,185, 92, 62, 5, 64, 31, 0, 63, 0,136,213,163,191,238,221,187,119,119,241,243,243, 35, 66, 67, 67,203,
-252, 67, 73,146,132, 82,169, 4,155,205, 70,251,246,237,201,200,200,200, 58,143, 30, 61,114,135, 14,195,136, 54,110,126,253, 59,
-118,238,218,185,139, 79,115,114,115,232,107,168, 40, 21, 24,132, 18, 76,130, 2,165,224,130,203,102,192,221,179, 13, 35,254,197,
- 83, 31,153, 84,222, 63,247,213,181,243,186,112,246,233,213,211,183,105, 19,119,114,251,239,111, 80,144, 22,171, 74,139,187,157,
- 67, 50, 72, 52,109,253,133,173,123,179,150,140,150, 62,126,172,244,196, 23,221, 36,146, 46, 61,242, 19,110, 95,251, 20, 23,228,
- 74,128,225, 92,199,246,155,126, 61,253,216,130,244,116,209,201,208,243,207, 75, 20,184, 15, 0,183, 0,162, 47,208,220,187, 93,
-187,174,251, 55,108,176,225,243,249,172, 81, 35, 70, 40,247, 69, 69, 69,161,138,161,223,149, 0,195,214,209,177,199,212,169, 83,
- 25,130,244,116,250,228,233, 11,207, 52,124, 40,125, 75,241,110,238,236,209, 15,162,120,189,134, 41,251, 3, 28, 7, 71,199,166,
- 83,166, 76, 65, 70,122, 58, 14,135,132, 20, 75,128, 8,141, 21,235, 28, 3, 59,155,185, 57,142, 91, 48,113, 0,225,194,183,197,
-212, 21,251, 58,116,147,103,185, 65,240,215,241,215,214, 34,159,177,200,154, 92,169,208,170,136,223, 98,177,220,140,141,250, 39,
- 79, 30, 35,179,139,228,162,132,132, 4,216,218,218,130,207,231,195,194,194, 2, 49, 49, 49,184,126,253, 58, 94,190,124, 9,138,
-162,208,162, 69, 11,189,122,147,147,147,131,167, 79,159,194,202,202,234,163,113,186,185,216,225, 91, 23, 59,118,102,110, 33,251,
-218,195,151, 62,251, 22, 15,110, 70,122, 12, 62,168, 93, 36, 86, 38,147,225, 63,130,178,232, 66, 23, 23,151, 78,135, 14, 29, 98,
- 75,149, 48,115,159, 18,241,163, 72,162, 50, 1, 0, 19, 30, 67, 20, 25,212,248,187,213,171, 87,139,198,143, 31,239,145,146,146,
-178, 94, 7, 91,255,218,238,221,187,207,167,105,154, 53,123,246,108, 0,192,152, 49, 99, 10,239,223,191,239, 14, 32,235,250,245,
-235, 78, 19, 38, 76,120,117,227,198, 13,227,185,115,231, 50,148, 74,101, 12,147,201,164,195,194,194, 86, 1, 8,124,239,137, 72,
-146,143,163,162,162,234, 57,185, 54,134,171, 13, 9,223,165, 47, 75,111,112,198, 20, 82,147,222, 32,238,217, 67, 56, 58, 58, 90,
-240,249,252,216,212,212, 84,121, 90, 90,218, 66,145, 72,180,187,134, 62, 70, 71, 70, 70,242, 93, 93, 93, 81, 92, 92,140,212,236,
- 18,204, 58,109,140, 66,113,169, 17,131, 5, 49, 90,186, 52, 54, 51, 34,101, 15,179,178,178,228, 50,153,108,153, 80, 40, 60, 84,
- 29, 39,139,197,202,125,246,236,153,105,221,186,117, 33,145, 72,232,188,188, 60, 66, 36, 18,161,168,168,136,184,112,225,194,215,
- 2,129,160,109,253,250,245, 9,103,103,231, 85, 2,129, 64,156,150,150, 54, 73,151,161, 73,181, 96, 82, 49,153,204,205,147, 39,
- 79, 30,122,230,204,153,199,161,129, 77, 7,106, 13,151, 88,120,122,122, 94,110,222,188,153, 83,200, 38,239, 29, 0,126,252, 23,
-156, 91,227,150, 44, 89,210,212,218,218, 26, 83,167, 78,197,202,149, 43,177,124,249,242, 70, 83,167, 78,157, 12, 96,171, 30, 60,
- 70,142,142,142,143,182,111,223,238,209,169, 83, 39, 92,188,120, 17,199,142, 29,195,219,183,111,149,245,235,215,103,250,248,248,
- 96,197,138, 21,232,221,187,247,164,153, 51,103,118, 77, 79, 79,111,165,163,248, 24,191, 98,197,138,129,157, 59,119,198,216,177,
- 99,165, 55,111,222, 28, 10,224,202,213,171, 87,191,184,117,235, 86,232,145, 35, 71,140,214,173, 91,215, 99,222,188,121, 83, 1,
- 4,215, 98,251,191,238,210,165,180,134,114,231,206,157, 17, 20, 20,212,251, 3,133, 22,199,198,198,230,194,225,195,135, 91, 54,
-110,220, 24,163, 70,141,106, 53,116,232,208, 11,249,249,249, 61, 1,232,116, 67,170, 83,167,206,198,179,103,207, 54,172,106,100,
-161, 50, 72,165, 82,235,111,190,249,102, 67, 82, 82,146, 94, 66,235,232,209,163,248,254,251,239,209,162, 69,139,230,237,219,183,
-223, 51,101,202, 20,248,251,251,119,143,137,137,113, 64,105,212,114,141,224,241,120,205,135, 15, 31,206,121,240,224, 1, 0,192,
-211,211, 19, 45, 91,182, 68,114,114, 50, 30, 63,126, 12,169, 84, 10, 7, 7, 7, 12, 26, 52,136,151,148,148,212, 60, 39, 39,167,
- 70,161, 69,114,141,199, 13,236,215,215,236,220,125, 1, 84,148, 18,109, 26,154,195,199,195, 30,241,169,133,136,140, 77,133, 74,
-198,134,185,181, 13, 58,116,237,101,157,145,246,118, 92, 46, 80,179,191, 22,215,120,220,160,129, 95,153,158,139, 72, 71, 65,122,
- 28,253,250,225,153,235, 10,137,104, 18, 0, 60,254,243,248, 30, 71, 27,163,158,238,173,219, 48,252,122, 14,176, 58,125, 44, 99,
- 92,254, 63, 83,219,239, 61,220,114,193, 94, 87, 86,206,152, 5, 1,190, 52,203,202,249,161,153, 66,177, 83, 51,175, 55,208,107,
-225,146, 37,237, 39, 78,158,204,163, 40, 10, 71,126,253,181,240,105, 84, 84,252,100,128,154, 82, 5,223, 78,192,117,232,192,129,
- 92, 51,115,115,204,153, 53, 11,102, 10,197,141,178, 93, 2,116,159, 51,127,126,167, 25, 51,102, 24,237, 89, 53,253,113,239, 9,
-107, 90, 83, 52, 77,104,134, 41,143, 86,111,138,107, 59, 97,224, 64,152,153,155, 99,246,236,217, 32,228,242,203,101, 2,138,137,
- 27,227,191,246,245, 9,232,223, 25, 4, 8, 28, 11,187,131,215,201,217,207,110, 8,240,230,115, 85, 85, 21, 80,165,143, 86,181,
- 67,135, 69,114,100,118,255,106,176,192,221,221,189,168, 81,163, 70, 69,185,185,185,120,254,252, 57,242,243,243, 17, 28, 28,140,
-184,184, 56, 80, 20, 85,107, 1, 67, 81, 20, 62, 54, 39, 0, 56,216,152, 99, 84,223,118, 76,169, 68,196,203,206,206, 46, 55,124,
-244, 31, 18, 90,101, 80, 42,149,188,250,245,235,131, 4, 8, 97,137,194, 52,227,104, 23, 34,227,104, 23, 66, 88,162, 48,149,201,
-100,164,169,169, 41,164, 82, 41, 79, 7, 42,214,151, 95,126, 57,255,204,153, 51,172,181,107,215,194,203,203, 11,114,185, 28,247,
-239,223, 79, 5,144,165,110,147,126,251,246,237,116,141, 16, 94,191,126, 61, 78,159, 62, 77,244,232,209, 99, 97,101,231,147, 64,
- 32,216, 56,101,202,148,188,146,162, 60,236, 29, 38, 70,232,168,108,252, 60,240, 45, 70,216,156, 66, 94,230, 59,236,219,183, 15,
- 87,175, 94, 35,174, 92,185,202,190,121,243,166,201, 87, 95,125,181,163, 78,157, 58, 97,213,117, 50, 61, 61,125,237,140, 25, 51,
- 10,138,138,138, 80, 84, 84, 4,177, 88,130, 60, 17,240,108, 75, 83, 60,219,210, 20, 18,202, 8,187,118,238, 38,159, 61,123,102,
-251,246,237, 91,167,254,253,251,111,225,243,249, 7,171,227, 76, 75, 75,123,240,237,183,223, 74, 10, 11, 11, 33,147,201,228, 42,
-149, 74, 38, 22,139, 21,199,143, 31,159,107, 99, 99,211,225,226,197,139,172,171, 87,175, 49,111,222,188,197,190,126,253,186, 69,
-183,110,221, 78, 56, 56, 56,252,162,139,165,140,193, 96,108, 11, 9, 9, 25,183,107,215, 46, 7, 31, 31,159,102, 21,134,162,248,
- 61,123,246,172,247,235,175,191,214, 9, 10, 10, 90,136,210, 0,148, 79, 10, 91, 91,219,153, 3, 7, 14,196,174, 93,187,112,254,
-252,249,121, 59,118,236,192,151, 95,126, 9, 39, 39,167,111,161,251,176, 23, 0,252,184,117,235, 86, 15, 15, 15, 15,140, 25, 51,
- 70, 54,105,210,164,239, 14, 29, 58, 84, 63, 60, 60,156,253,203, 47,191,212,155, 58,117,234,236,128,128, 0, 73,131, 6, 13, 16,
- 28, 28,220,144, 36,201,109, 58, 93,223, 14, 14,115, 71,140, 24,129, 77,155, 54,225,230,205,155,131, 81,250, 64,149, 1,184,116,
-247,238,221,254,235,214,173,195,224,193,131,225,236,236, 60,187, 54,150,167,166, 77,155, 46,235,211,167, 15,194,195,195,209,170,
- 85, 43,116,232,208, 97, 30, 0,219, 90,238, 78,210,212,212,244,196,161, 67,135,124,235,213,171,135, 53,107,214,192,205,205, 13,
- 7, 15, 30,244, 53, 49, 49, 57, 1, 29,221, 55, 44, 44, 44, 76,141,141,141,177,112,225, 66,122,240,224,193,121, 53,125,230,205,
-155, 71,115,185, 92, 88, 89, 89,233, 26,248, 98,196,227,241, 58,122,121,121,225,254,253,251,184,122,245, 42,150, 46, 93,138,185,
-115,231, 34, 59, 59, 27,195,135, 15, 55, 6,224,175,199,118,219,219,217,217,161,176,176,180, 46,188,151,151, 23,158, 60,121,130,
-236,236,108, 56, 59, 59, 35, 35, 35, 3, 54, 54, 54,104,220,184, 49, 40,138,178,215,141,146,246,178,181,182, 64, 86,190, 20, 76,
- 40,209,218,221, 22, 55,158,231,226, 93,182, 12,246, 54,150,200,200,202, 70, 29, 27, 30, 92, 92,234,130,166, 41, 47,157, 20, 48,
-131,108,205,229, 25, 33,175, 72,142,180,216,155,185,114,149,116, 74, 65,226,221,148,130,196,187, 41,114,169,100,202,227, 59, 87,
-115,235, 57, 24,193,197,197, 5, 4, 77,181,251, 20,215,227,144,186,112, 49, 49, 98,142,185,250,243, 50, 34,108,255, 98, 66,154,
-251,174,109, 31,135, 82,203,178, 29, 80,127,200,240,225, 29,191,251,238, 59, 94,102,102, 38, 21, 48,108, 88,222,218,192,192,107,
-127,212,240, 98, 80, 12, 52,234,217,179, 39, 72, 0,127, 92,185, 34,202, 0, 82, 1,192, 1,112, 25,240,205, 55, 93,150, 44, 90,
-100,148,147,155, 75,221, 79, 40, 62, 23,151, 69, 15,178, 86,161,190, 46,254, 89, 42,192, 91,195,123,249,242,101, 90, 12, 60, 6,
- 0, 63, 23,124,219,171,147,167,207,232,129, 93, 32,200,202,199,236,181, 63, 99,207,201, 91,151, 45, 20,244, 23,255,161, 71,241,
-228, 90, 9, 45,245,208,207,123,211, 74, 74,222, 31, 61,248, 80, 1,243,119,112, 86,134,255,162,208,210, 64,161, 40, 29, 37,145,
- 41, 40,200, 20,148,230,173, 22, 98,177, 88,103,138,203,151, 47, 31,158, 53,107, 22,182,108,217,130, 87,175, 94,129,205,102,195,
-203,203,139, 15,192, 84,115,207,111,221,186,181, 61, 73,146,136,143,143,199,230,205,155, 49,126,252,120,250,222,189,123, 7, 81,
-121,190,148, 39,121,121,121, 59,167, 76, 26, 95,144,159,249, 14, 10,113, 62,178,210,222, 64, 42, 42,192,154,245, 27, 81,162, 96,
- 34, 67, 40, 71,134, 80, 14,146,107,141, 61,251, 15, 49,154, 54,109,218,135,193, 96,244,171,166,159,247, 51, 51, 51,247, 79,155,
- 54,173, 32, 35, 35,163,108,251,100, 10, 26, 50, 69,249,243,213,216,216, 24,219,182,109,179,112,119,119, 31,200,100, 50,187, 85,
-195, 41, 72, 73, 73,137,155, 54,109,154, 44, 51, 51, 19, 66,161, 16,231,206,157,235, 95,175, 94, 61,171, 13, 63,110, 33, 68,114,
- 38, 50, 10,228,200, 40,144,131, 99,106,143, 19,161,103, 24,141, 27, 55, 14, 96, 50,153, 29,106, 18, 89, 71,142, 28, 25, 61,108,
-216, 48,179, 31,127,252, 49,239,236,217,179,187, 0,104, 31,144,248,109,219,182,157, 60,113,226, 68,209,252,249,243,173,131,130,
-130,230,125, 98,177,213,109,216,176, 97, 77, 40,138,194,169, 83,167,158, 1,216,122,230,204,153, 71, 82,169, 20,195,135, 15,175,
-175, 30, 70,210, 5,109, 3, 2, 2,166,251,250,250, 98,206,156, 57,242,107,215,174,181, 6,176, 5,165, 67,185, 52,128,100, 0,
- 59,110,221,186,213, 98,230,204,153,210,118,237,218, 97,236,216,177,227, 1,248,214,192,219,113,196,136, 17, 30, 20, 69,225,248,
-241,227, 79, 1, 92,172, 48,255,122,104,104,232,125,153, 76,134,145, 35, 71, 54, 0,160,207,141,156,205,229,114, 79,173, 94,189,
-218, 50, 45, 45, 13,163, 71,143,150,198,199,199, 35, 48, 48,208,200,194,194,226,162,214, 53,160, 51,184, 92,238,190,159,126,250,
-105,160,183,183, 55,166, 77,155, 38,219,189,123,247,172,233,211,167,203, 90,183,110,141, 93,187,118, 13,228,112, 56,122,149,232,
- 72, 79, 79, 47,136,141,141,181,169,233,147,154,154,170,107,120,190,177,169,169,105,132,167,167,103,161,151,151, 87, 27,165, 82,
-137,152,152,152, 55,135, 15, 31,166,188,188,188,176,115,231, 78, 4, 5, 5,161, 95,191,126, 96, 48, 24, 58, 11, 45, 6,131, 1,
-185, 92, 14, 99, 99, 99, 48,153, 76,188,121,243, 70,147, 90, 6,108, 54, 27, 0, 96, 98, 98, 2, 35, 35, 35,144, 36,169, 83, 52,
- 26, 65,128, 46, 44, 81,128,197, 34,193, 36, 41,196, 37, 11, 33, 87, 80,224,177, 25, 96, 49, 9,128,166, 96,105,194, 2,143,195,
- 0, 73, 16,148,142,156, 16,138,228,224,176, 73,176,216, 28,130, 84,170,140,202, 30,142, 76,149,145,145, 17,135,176, 53,231,130,
-199,254, 23,149, 5, 38, 74, 29,203,199, 1, 44,147,186,117,135,110,218,188,153, 83, 88, 92,140,193,131, 7,231, 37, 61,122, 20,
- 34, 6, 30,117,173, 33, 72,137,100, 50,221,253,186,118, 69,100, 84, 20,138,242,243, 95, 3,165,206,241, 28, 39,167, 97,219,182,
-109,227,136, 37, 18, 12, 30, 52,168,224,213,157, 59, 71, 82,138, 17,118, 60,185, 84,136,213,120,220,217,108, 71, 13,175, 48, 63,
- 63, 31, 40, 77, 33,225, 96,103,186, 97, 70, 64,111, 20,149, 72,176, 96, 99, 8, 21, 21, 39,248, 54, 60, 21, 95,157, 73,135,240,
- 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98, 69, 42,149,126,116, 1,244,161,156,149,137,196, 15,229,252, 55,
-130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249,245,198,223,177, 0, 0,107, 83,166, 80,174, 82, 80,233,233,233,
-224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76, 38, 51,236,208,161, 67, 68, 72, 72,136,213,136, 17, 35, 18, 98,
- 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236,160, 79,156, 56,209, 27,165, 41, 51,170,204,227,146,153,153, 25,
-152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196, 38, 60, 60,156,144,200,105,180, 93,146, 92, 22,137,104,110, 68,
-226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45,172, 26,206,133, 5, 5, 5,225,175, 94,189,218, 98,225,220,210,
-206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190, 88, 80, 80,128,236,236,108, 76,159, 62,221, 42, 33, 33, 97, 97,
- 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225,199, 98,177, 56, 38, 38, 38,109, 35, 34, 34, 8,137,140, 66,243,
-133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111,191,101,190,126,253,122,163, 64, 32,232, 92,233,205,140, 36,131,
-180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82, 17, 35, 71,142,124, 14,192,107,254,252,249,214, 52, 77,207, 91,
-184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148, 41, 56,113,226, 4,242,243,243,183, 1, 64, 97, 97,225,214,163,
- 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127,160,230, 80,237, 47,135, 15, 31,142, 75,151, 46,225,207, 63,255,
- 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251,136, 17, 35,240,243,207, 63,247, 1, 80,157,131,108,207,222,189,
-123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221,231,206,157,107,223,187,119,111,172, 95,191,190, 39,128,235, 58,
-108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64, 64,128, 68, 46,151,247,153, 63,127,254,249, 99,199,142,153, 29,
- 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69,146,235, 54,111,222, 60,193,207,207, 15,243,230,205, 83, 94,190,
-124,121, 0,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222,188,153,177,105,211,166, 9,179,103,207,206,166, 40,234, 83,137,
-235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239,223,135, 92, 46,255, 53, 34, 34,226,118,163, 70,141, 86,203,100,
-178,243, 38, 38, 38, 99,204,204,204, 60, 91,182,108,249,197,227,199,143,141,161,155,159, 94,102, 98, 98,162,165,133,133, 5,148,
- 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183,240,246,246, 6,155,205, 70,102,102, 38,180,172,229, 53,136, 34,
-242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216,217, 90, 65, 69,144,200,200, 16,160,101, 19,103, 16, 4,129,130,
-220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99, 99,198,133,119,251, 94, 54, 17,127,100,135,152, 55,232, 52,153,
-201, 32, 24, 28,174,233,222, 9, 99,199,218, 82, 20,141,130,220, 76, 48, 73,242,225,167, 56, 64,167,222, 33,165,171, 27,239, 73,
-175, 9,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208,114,199, 15, 63, 88,218,216,218, 34, 32, 32,128,202, 77, 75,187,
- 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187, 96,148,250,216,226, 32,224, 17,180, 96,129,141,189,163, 35,198,
- 79,152, 64,101,190,123,119, 93, 12,164,235,211,215, 6,110,110, 44, 13, 47,169,230, 21, 48, 48,107,254, 0, 95,174,137, 17, 23,
-235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125,213, 90,180,170,114, 62, 43,117,170, 54,174, 86,172,240,120,188,
- 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139, 1,156, 5,176, 56, 37, 37, 37,110,194,132, 9,114,165, 92, 90,
-116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150,197,162, 18, 97, 94,209,142, 29, 59, 20, 41, 41, 41,113,218,203,
-212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229,229,133,152,152, 24,123,145, 72,212,234,249,243,231,214, 30, 30,
- 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64,169, 84, 94,203,200,200,104,156,156,156,220,208,210,210, 82, 97,
-105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192,220,220,188,190, 14,226,252, 98, 70, 70,134, 59,101,213,164,139,
-123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91,114,144,159,159,143,236,236,108,100,103,103,131, 32, 8, 40, 20,
-138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193, 1,102,102,102,160, 1,100, 20, 40, 16,189,201, 3,209,155, 60,
-144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134, 40,200, 58,117,234,244, 29, 54,108,152, 25, 0,168, 5, 84,119,
-154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247,214, 0,122,255,195,231, 19, 3,192,140, 73,147, 38,181,225,241,
-120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3,192,172, 89,179, 60, 1,204, 67, 21,153,160,203, 76, 67,108,118,
-235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247,238,161, 81,163, 70,224,241,120,109,107,104, 91,223,197,197, 5,
-241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8,162,190, 14,219, 62,176, 87,175, 94,207,110,220,184,209,182, 99,
-199,142,152, 48, 97,130,236,193,131, 7,125, 1,220,126,242,228, 73,183,145, 35, 71,138,220,221,221,113,235,214, 45,143,145, 35,
- 71,222, 35, 73,114,141, 14,156,227, 87,173, 90,181,248,235,175,191,198,170, 85,171,232,147, 39, 79, 6, 0,184,162,158,119,249,
-248,241,227,163,215,174, 93, 75, 15, 26, 52, 8, 43, 87,174, 92, 12, 96, 90,117,100, 34,145, 72,168, 82,169, 32, 18,137,116, 50,
-201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168, 83,167, 14,206,159, 63, 79, 3, 8, 3, 16, 46,147,201,186, 0,
-216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98,164,186,245, 63, 59,122,244,168,212,194,194, 2,174,174,174,104,
-208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221, 26, 74,165, 18, 7, 14, 28,144, 20, 21, 21,233,148,147, 79, 41,
- 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99,141,226,130, 28,100,103,164,163,117,211,186,232,218,186, 30,114,
-132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228,208,181, 63,206, 11,173,204,216,104,220,196, 19, 35, 39,204,106,
-217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59, 52, 37, 82,115, 36,184, 20,118, 38, 95, 88, 88,120,232, 83,220,
-232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233, 64, 92, 42,182, 1,128,130,193,240,232,251,229,151, 72, 77, 77,
-197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16, 10,133,224,170,253,238,148, 64,147,175,190,250, 10,217, 57, 57,
- 56,122,228, 72,246, 37, 32, 74,159,126,246, 7, 56,198, 70,165, 6, 65,161, 80, 8, 2, 40, 4, 0,130,137,190,237,188, 26, 33,
- 59,175, 16, 55, 30,198, 21,215, 19, 99,122,117, 60,159,177, 35,124,237,124,180, 0,228,204,155, 55, 15, 92, 46, 23,124, 62,191,
- 76, 28,105,196, 10,135,195, 1,159,207,135, 82,169,196,241,227,199, 1, 32,167,218, 55, 60, 64, 58, 96,218,122, 74,170,160, 75,
- 88, 44,214, 71,225, 84,191, 57, 74, 7, 47,248,153,250,227, 94,229, 65, 49,181,225,252, 12,208, 78,157, 19,171, 29,128,252,164,
-164,164,212,161,131, 7, 8,147, 19, 94,100,136, 10,210, 5,133,185, 41,130,148,183,207, 51,150, 44,156, 39, 76, 77, 77, 77, 65,
-105, 46,173,118,233,233,233,154,101,116,193,188,161, 67,135,254, 52,105,210, 36, 58, 58, 58, 26, 0, 16, 25, 25,137,177, 99,199,
-210,163, 71,143,222, 6, 96, 81, 45,250, 45, 18,139,197,229,172, 33,114, 21, 85, 54,228, 87, 88, 88,136,244,244,116,200,100, 50,
-157, 21,241,171,203,155, 94,230, 37, 61, 86,120,186,154,192,211,213, 4, 30, 46,198, 32,148,197,101, 34, 43, 59, 59, 91,243,230,
- 44,209,163,159,133, 82,169,180, 92, 63,181,135, 38, 11, 11, 11,145,145,145, 1,149, 74, 85,213,131,140, 74, 75, 75,187,124,226,
-196,137, 34, 0,248,241,199, 31,243, 8,130,248,147, 32,136,159, 42,249,236, 97, 50,153,119, 53,109, 55,109,218,148,135,247,135,
-196,254, 78,124,237,237,237,157,191,120,241,226,157,179,103,207,198,158, 61,123, 32, 16, 8, 22,225,175, 92, 60, 84, 78, 78,206,
-130, 93,187,118, 97,220,184,113, 88,190,124,249,166, 86,173, 90, 21, 2, 24, 89, 21,161,157,157,157, 51,147,201, 68, 84, 84, 84,
- 33,128, 55, 53,172, 63, 35, 42, 42, 42,147, 32, 8,240,249,124,183,234, 26, 90, 91, 91, 55, 52, 51, 51, 67, 90, 90, 26,160,126,
- 99,174, 4, 73,233,233,233, 52,135,195,129,147,147, 83,163,154, 54,222,202,202,106,193,129, 3, 7,152, 47, 94,188, 64,247,238,
-221, 83,111,221,186,213, 19,128, 38, 36, 61, 42, 50, 50,210,183, 91,183,110, 47,175, 94,189,138,141, 27, 55, 18, 45, 90,180,152,
- 86, 19,167,171,171,235,212,241,227,199, 35, 56, 56, 24,123,247,238,157, 6,224, 84,133, 38,199,118,237,218, 53,107,239,222,189,
-152, 48, 97, 2,234,215,175, 63,178, 58,190,228,228,228,133,126,126,126,145,175, 94,189,210,169,226,129,142,237,187,249,248,248,
- 52, 20,139,197, 56,116,232,208,155,134, 13, 27, 62, 58,117,234,212, 60,188,255,192,254,253,244,233,211, 24, 53,106, 20, 90,180,
-104,113, 8,192, 8, 93, 46,203,216,216,216,148,235,215,175, 83,108, 54, 27,174,174,174,232,215,175, 31, 2, 2, 2,208,188,121,
-115,200,229,114,156, 62,125,154,122,254,252,121,170, 76, 38,211, 41,151, 82,238,171,155,231, 19, 19,255,199,222,121,135, 71, 81,
-181, 81,252,204,246,190,155,186, 73, 72, 72, 8, 45,149,142, 84,233,161, 72, 23, 81, 68, 16, 43,162,130, 72,177,125, 34, 86, 4,
-105, 34,136, 20, 69, 65, 4, 20, 69, 90,164,136, 40,145, 78, 2,132, 0, 33,129,244,186,233,101,179,125,103,238,247, 71,138, 33,
-164,236, 38, 40,150,251,123,158,121, 38,185,179,115,246,206,157,118,246,189, 45,225,212,197,115, 81, 54, 1,159, 7,127, 31, 55,
- 60, 24,209, 13,207, 76,238,143, 30, 33,190, 72,203, 51,226,248,241,159,109, 41, 41, 73,103, 28,233,113, 88,173, 25,127, 45,246,
-244,213,139, 39,237, 66, 1,131,144,224,142, 88,244,191, 87, 93,151,188,253,154, 75,199,118,254,136, 77, 46,197,207, 71, 15,217,
-178, 51, 51,126,189, 87, 61, 14, 79, 0, 34,165,132, 81,240,121, 60,176, 60, 73, 5,191,170, 35, 77,167,176,176, 32, 47,111,111,
- 68, 70, 70,130,231, 68,143,208, 19,128, 72,169,172,172, 5,215,235,245,168,214,107, 31, 28, 28,236, 31, 16,128,159, 34, 35,193,
-231,184,235,131,156, 28, 96,244, 70,101, 53,116,141, 46, 3,152, 94,104, 13, 85,251,214,218, 96, 87,141, 2,231, 98,111,194,108,
- 35,231,191, 41,198, 61, 29,143,236, 79,100, 38,154, 89,117,184, 98,227,198,141,189,190,248,226,139,225,243,231,207, 87,206,152,
- 49, 3, 82,169, 20, 6,131, 1,126,126,126, 96, 89, 22,135, 15, 31, 70,116,116,180,158,227,184,159,113,231,176, 1, 17,168,213,
- 75,227, 72, 18,100,149,126,203,208,107,223,195, 15,223, 21, 77, 0, 80,222,228,212,133,109, 44,219,215,238, 62, 57,105,199,145,
-139,204,203, 83, 7,241,122, 4,183, 6, 0,120,121,121, 65,173, 86, 59,173,121, 23,248,211, 53,107, 87,235,230,230,230,222,200,
-205,205,205,123,246,217,103, 67,170, 27,190, 75, 36, 18, 83, 85, 36,171,184,190,125, 28,200,167, 21,192, 11, 95,124,241,197,254,
-210,210,210, 35,175,188,242, 10,150, 44, 89,130, 3, 7, 14, 12, 0,112,170,153,199,206, 22, 23, 23,151,156, 63,127,222,171, 67,
-104,119,180,213, 10, 49,240,173, 68, 16, 66,224, 46, 39, 40, 47, 41,194,165, 75, 23, 81, 94, 94,126,206,153,124, 90,173,214,146,
-188,188, 60, 15,173, 86,139,162,162, 34, 20, 20, 20,212,152,172,226,226, 98, 20, 21, 21, 17,134,185, 99,204,150,198, 52, 43,242,
-242,242, 12,241,241,241, 98,175,214, 29,208, 78, 43, 66,239,255,221, 0, 8,129,191, 27, 15,229,101, 37, 56,115,230, 12, 74, 75,
- 75,127,107, 72,147,227,184, 5,211,166, 77,227, 3,120,252,149, 87, 94,113, 3,208,245,213, 87, 95,253, 25,117,122, 22, 10, 4,
-130,143,183,111,223,222,169,186,138,241,181,215, 94, 91, 13,224,139,191,234, 90,114,119,119, 95, 16, 25, 25,169,178, 90,173, 88,
-187,118, 45, 86,175, 94,189, 5,119, 14, 84, 25,249,233,167,159,174,231,241,120, 47,206,158, 61, 27,207, 61,247,156,188,103,207,
-158,243,115,114,114,190,169, 79, 51, 43, 43,107, 81,143, 30, 61, 22,231,229,229,125,232,144, 89, 78, 76,156,217,163, 71,143, 69,
-121,121,121,203, 27, 59, 71, 10,133, 66,193,178, 44, 82, 82, 82,138,129, 6,219,119,152, 82, 82, 82,178, 88,150,245,147,203,229,
-110, 77, 93,159,197,197,197, 31,246,236,217,243, 29,157, 78,119, 20,192, 7,245, 24,242,203, 57, 57, 57,225,115,231,206,157,179,
-108,217,178, 73,185,185,185,187,154,210, 76, 75, 75,251,112,200,144, 33,111, 37, 36, 36,108, 69,195, 85,192,159,190,251,238,187,
-214,237,219,183, 63,159,146,146,178,180, 9,205,131, 5, 5, 5, 7,157, 56,191, 13,125,190, 70,147,207,231,191,186,108,217, 50,
-222,198,141, 27, 65, 8, 89,201,178,108, 67,249,140,221,187,119,239,182,254,253,251,207,216,189,123,183, 52, 60, 60,252, 57,179,
-217,188,179,169,235,211, 96, 48,236,217,189,123,247,164,216,216, 88,191, 25, 51,102, 72,131,130,130, 96,181, 90,145,147,147,131,
-141, 27, 55,154,226,226,226, 50, 75, 74, 74,246, 56,243, 12,177, 91,202,166,158, 62,190,111,103,106, 98, 92,223,193,163, 38,184,
- 90,172,126,144, 20,242, 81, 82,152,139,195, 7,247, 20,167,164, 36,157, 49, 24, 74,166, 58,163,105, 53,151, 62,122,230,215,253,
-187, 50, 83,226,251, 12, 28, 50,218,213,100, 9,128, 68,196, 67,161, 46, 11,135, 35,247, 21,165,164, 36,255,110,178,153,159,184,
- 87,207,121,126, 32, 62,224,231, 70, 63, 59,107, 92, 55,200, 92,253, 46, 9,129,181,253, 1,153,135,151,151,168,234,222,129,178,
-178,205,163, 67,154, 58, 64,220,161,170,150,202, 96, 48, 64, 8, 88,158, 4,132,158,158,158, 50, 0, 72, 72, 72,128,188,178, 86,
-195,169,124,234, 1,133,188,150, 46, 15, 48, 20, 10,224,219, 94,173, 96, 0, 32, 51,183, 16, 22, 91,163,239,141,127, 58,155,107,
- 25,174,205,205, 17, 16, 1,136, 80, 42,149, 75, 22, 47, 94,188,242,220,185,115, 43,199,142, 29,187, 82, 34,145, 44,169, 42,108,
- 81, 35, 39,226, 47,211,188,175, 21,220,134,180, 99,162, 70,180,103,184, 89, 3, 92,217, 39,122, 43, 44, 67,135, 14, 93,223,194,
-124,182,228,102,249, 51, 53,247,217,108, 54,130,202,106,187,125,104,184, 74,240,141, 90,219,115,211,211,211, 73,213,223,206,228,
-211, 99,202,148, 41, 92,121,121, 57,121,228,145, 71, 8,154,158,194,167, 81, 77,137, 68, 50,100,224,192,129, 54, 93,126, 17,185,
-145,156, 69,206,198, 92, 35, 71,142,159, 38,187,246, 68,146,117,235, 55,145, 46, 93,186, 88, 0, 4, 56,163, 41, 16, 8,134, 14,
- 25, 50,164, 80,167,211,145,248,248,120, 18, 21, 21, 69,190,255,254,123,178,105,211, 38,178, 97,195, 6,210,186,117,107, 29, 0,
- 47,103, 52,101, 50,217,132, 7, 30,120,192, 86, 82,102, 32, 41, 89,133,228, 74,124, 10, 57,117,254, 10, 57,124,252, 20,249,102,
-231,110, 18, 22, 22,102,114, 64,147,207,231,243,215,237,218,181,171,140, 16, 66, 38, 76,152,144,137,219, 7, 82,109,187, 96,193,
-130, 60, 66, 8, 89,190,124,121, 33,234,111, 8,255,103, 95, 75,163,124,125,125,111,136, 68,162, 72, 0,143, 55,177,223,163, 2,
-129,224,128,183,183,247, 5, 0, 15,222,131,251,104,172, 86,171, 61, 11,160,169, 25, 14,170, 63, 55,241, 95,114,191,255, 25,154,
- 67, 5, 2, 65, 20,208,248, 36,194,181,158,215,239,243,249,252,159, 0, 12,115, 50,159, 29, 61, 60, 60, 30,113,117,117,125,217,
-213,213,245,101,173, 86,251,136, 88, 44,238,216,146, 99,119,239, 24, 49,206,191,251,248,189,173,187,142, 73,243,239, 54, 54, 45,
-176,199,132,189,238, 29, 35,198,181, 84, 51,160,199,132,125,254,221,198,166,251,119, 27,151,218,246,190, 9,123, 61,130, 35, 30,
-184,151,231,232,113, 95,180, 26,222, 22,118, 18,245, 22, 33, 81,111,145,136,182,224,250,186, 32,172, 23,160, 26, 25, 17,177,138,
-176,236,170, 73, 19, 39,174,234, 0,184, 19,128, 95,119,169, 79,179, 59,160,174,217,119,194,132, 85,237, 0,143,225,128,124,208,
-128, 1, 43, 9,203,174,154,246,232,163,171,252, 1,239,250,244, 26,210, 36, 0,223, 23,104, 85, 91,215, 3,104, 63, 57, 16,225,
-111,140, 11, 36, 36,234, 45,242,238,195, 65,164,135, 23, 30,111, 66,179,161, 72,209, 63, 58,162,229, 44,138,170,135,235,210,170,
-181,226, 46, 92,132,119, 93,179,143, 15,130, 34,218, 51,241,163,131, 5, 69,168,236,146,172,248, 23, 62, 36,183, 90, 44, 22, 98,
- 50,153,136,193, 96, 32,122,189,190,174,129,170, 49,100,217,217,217, 36, 51, 51,147,164,167,167,147,212,212, 84,130, 63,218,222,
- 56,156, 79,181, 90,253,197,195, 15, 63,204, 10,133,194,117,119,227,216,221,220,220,150,246,238,221,219,250,201, 39,159,144,189,
-123,247,146,207, 63,255,156,204,158, 61,155,116,234,212,201,236,226,226, 50,181, 57,154,222,222,222,139,130,131,131, 11,183,108,
-217, 66,190,249,230, 27,178,102,205, 26,242,230,155,111,178,126,126,126,185, 42,149,106,100,115, 52,181, 90,237,230,251,239,191,
-223,186,121,243,102,242,243,207, 63,147, 29, 59,118,144, 5, 11, 22,144,144,144, 16,179, 66,161,120,200, 65, 77,190, 64, 32, 88,
- 53,107,214,172,220, 86,173, 90, 69,214,217, 38, 15, 11, 11,187, 48,109,218,180,108, 0,175,253,139,174, 79,170, 73, 53,169,230,
-159, 96,180, 30,107, 5, 95, 2,240,229, 34,209,163,131, 6, 12, 88, 41, 2, 30,117,214, 20, 73,249,252,201,253,123,247, 94, 41,
- 2,166, 86,127, 86,202,231, 79, 30, 52, 96,192, 74, 33,159, 63,189, 33,189,198, 52, 9,192, 23, 9, 4,175,245,239,219,119,149,
- 0,248, 95,117,218,208,182,204,245, 5,163, 90,147, 1, 1,204,205,233, 90,200,255,197, 70,235,174, 35,248, 19, 46,194,127,138,
-230,223,229,166,238, 80,101,152,246, 57, 17,209,218,135,202, 89,212, 59, 52, 51,159,178,187,124,236,157, 61, 60, 60, 14,117,232,
-208, 33,191, 77,155, 54,217,174,174,174, 59, 1,248,181, 80, 51,220,219,219,251,107, 47, 47,175, 68, 31, 31,159, 88, 15, 15,143,
-143, 81, 57,234,124,179, 53,133, 66, 97,111, 47, 47,175,223, 2, 3, 3, 75, 2, 2, 2,116, 30, 30, 30,187,234,137,100, 57,162,
-233,131,250, 31, 42,162,170,109,244,165, 67, 53,169, 38,213,188,205,192,140,104,135,101,195,219,194, 62,188, 45,216, 17,129,248,
-184,182, 65, 25, 11,200,154,107,138,158, 0, 36,117, 63,223,148, 94, 83,154, 4,224,247, 3,148,117,247, 25,237,135, 48, 7, 53,
-255,233, 17,173,234,231,188,115,195, 59, 52,128,253, 79,200,228, 63, 69,243,239,194, 77, 52,210, 24,185, 22, 75,239,226,119, 26,
-239,242, 49, 92, 41, 40, 40,120,160,160,224,174,246, 77,184,154,155,155,251,248,221, 20,180,217,108,231,116, 58,221,224,187, 32,
-213, 80,215,107, 43, 28,236,150, 77,161, 80,254, 59, 48, 0,139, 36,188, 30,209, 17,107, 5, 44,120,135,147,145, 85,167, 75,158,
-145,105,142,102, 37,236,214,122,158,241, 76,115,243,249, 7,250, 59, 52, 50,113,141,249,239,156,182, 28, 84,182,209,106,177,209,
-162, 80, 40, 20, 10,133,242, 23,112, 44,145,254, 16,251, 7, 16,137,219,163,111,145,181,140,104,131,161, 79,103,122, 82, 52, 39,
-124,122,140,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,205,106, 26,154, 59,245, 70,157,255,155,213,139,239,191, 2,173,
-103,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,102,143,163, 69,161, 80, 40, 20, 10,133, 66,105,156, 6,163,110,212,
-104, 81, 40, 20, 10,133, 66,161,180, 12, 31, 84, 78, 81, 21,137, 63,166,170,218, 76,141, 22,133, 66,161, 80, 40, 20, 74,203, 25,
-131, 63,122, 27,222, 22,221,226,209,178,161, 80, 40, 20, 10,133, 66,105, 49, 51,107,173,105, 27, 45, 10,133, 66,161, 80, 40,148,
-187,132, 99, 61, 35, 15, 30, 60, 72,104, 89, 81, 40, 20, 10,133, 66,185, 87,252, 67,189, 72,117, 20,235,142, 89, 62,104, 68,139,
- 66,161, 80, 40, 20, 10,165,101,108,174,101,184,110, 75,163, 70,139, 66,161, 80, 40, 20, 10,165,101, 84, 27,172, 72,212,153, 82,
-141, 7,208, 42, 67, 10,133, 66,161, 80, 40,247,150,127,184, 23,217, 92,181,220, 49, 93, 82,117,175,195,193, 85, 7, 56,152,158,
-106, 10,133, 66,161, 80, 40,247,128,127,178, 23,241, 65, 3,109,180, 40, 20, 10,133, 66,161, 80, 40, 45, 99,102,157,117, 13, 12,
- 45, 27, 10,133, 66,161, 80, 40,148,187, 98,180,106, 67, 39,195,166, 80, 40, 20, 10,133, 66,249, 39, 67,103, 54,167,154, 84,147,
-106, 82, 77,170, 73, 53,169,230,127,129,153,168, 51, 42, 60, 64,135,119,160, 80, 40, 20, 10,133, 66,185, 27, 38,107,115,125,255,
-211,185, 14, 41, 20, 10,133, 66,161, 80,254, 36,104, 68,139, 66,161, 80, 40, 20, 10,165,101,108, 70, 61,163,194, 83,163, 69,161,
- 80, 40, 20, 10,133,114,247,204,214, 29,208,170, 67, 10,133, 66,161, 80, 40,148,150, 49,179,161,255, 25, 52,220,115,224,152, 19,
- 95,208,156,222, 7,199,168, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211,108, 74,251, 24,254,121, 52,216, 24,254,207,134,
-118,125,165,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,234, 41,120,170,151,154,169,120,104, 27, 45, 10,229, 31, 14,217,
- 13, 62,138,131, 3, 65, 72, 43,240,197, 57,200,185,146,196,188, 3,174,197,154,186,176, 0,200,108, 94,176, 75,243,161,139, 77,
-110,169, 38,133, 66,161,252,139,201, 65, 3, 17, 44,106,180, 40,148,127, 58,249, 33, 65, 16, 96, 41,120,240, 1,177,222,130,103,
-216, 82,224, 90, 92,139, 53, 69,220, 7, 96,121,126, 32,214, 4,104,131,151, 1, 55,174,209,112,241,142,135, 0, 0, 32, 0, 73,
- 68, 65, 84,194,166, 80, 40, 20,231,248,203, 27,195, 11,133, 66, 29, 0, 78, 42,149,238, 1,157,229,154,242,231,226, 83,117,157,
-113, 85,215,157, 51, 40, 5, 2,193, 98,185, 92,254,171, 68, 34,201,147, 72, 36,121, 10,133,226, 87,129, 64,176, 24,128,242,239,
-114,128,228,235, 78,114,240,216, 7, 44, 54,206,247,240,149, 18,173,193,204, 6,129,103, 31, 77,182,116, 84,182, 72, 83,192,140,
- 48, 89, 57,255,111,206, 27,188, 42, 44,246, 80, 16,180, 72,179, 22, 46, 34,145,232, 48, 0, 15,122,121,254, 59, 9, 5,122,246,
- 20, 8, 22,134, 0, 67, 65,231,211,165, 80,254,122,163,101,179,217,180, 5, 5, 5,204,182,109,219,198,107, 52,154, 91, 2,129,
-224, 13, 0,162,255, 74,129, 43,149,202,211,106,181, 90,167,209,104,116,106,181,250, 98, 83,233,255, 82,130, 60, 61, 61,211,220,
-220,220, 18,106, 39,122,118,121,176, 95,135,254,143,191,237, 30, 54, 97, 80, 11,245, 69, 2,129,224, 13,141, 70,115,107,219,182,
-109,227,179,178,178, 24,155,205,166,117, 98,255,129,174,174,174,215,207,157, 59,247, 86, 65, 65,193,160,140,179, 91, 60,115,207,
-109,242, 76,251,109,213,224,232,159,214,189,229,226,162,185, 6, 96,224,223,162, 36, 77,156, 23,120,252, 33, 87,115, 12,242,156,
- 50,155, 87, 76,170, 65, 5,240, 7,195,210,130, 31, 49,165,156, 23, 64,134, 94,206, 52, 42, 78, 23,121,122,253,158,100, 86,131,
-199, 27, 2, 19,227,221,226, 7, 14,143,247, 60,199,113,195, 69, 34,209,203,244,241,251,239, 68,204,227,245, 63, 61,126,252, 7,
-175,117,233, 50, 39, 4, 24,215,128,217, 98, 0,188, 20, 18, 18,114, 8,192,163,119,241,235, 63, 10, 14, 14,206, 2, 48,151,158,
- 9,202, 95, 76,247,234, 31,248,168,211, 70,203, 97,163, 53, 57, 16,253,167,182,197,137, 71, 2, 81, 62,165, 45,244,211,219,226,
-228, 67,129, 24,218,156,220,184,187,187, 99,224,192,129,252,172,172, 44,217,130, 5, 11,222,150, 74,165, 41, 0, 70, 54, 71, 75,
- 38,147, 69,203,229,242, 12,129, 64,112, 91, 94,228,114,121,180, 66,161,200, 16, 8, 4,195,106,167,171, 84,170,211,106,181, 90,
-167, 82,169, 46, 54, 96,132,162,213,106,181, 78,169, 84, 70,215, 78, 23, 8, 4,195,148, 74,101,166, 74,165,170,155, 62, 84,165,
- 82,101,212, 77,111, 8,161, 80,232,151,145,145,161,205,204,204,212,138,197, 98,175,218,233,233,233,233,218,140,140,140,219,210,
-157, 65, 32, 16, 12, 85, 40, 20, 25,114,185, 60,186,190,244,186,199,212, 16,181,202,110,168, 35,233,206,154,172, 17, 35, 70,156,
-204,201,201,241,119,113,113,113,169,189,193, 77,227, 50,242,235, 45,235,231, 79, 24, 61,226,121,207,208,137,157,155,169, 63, 82,
- 42,149,166, 44, 88,176,224,237,172,172, 44, 89,223,190,125,249, 60,158, 83,191, 39, 34, 38, 76,152,176, 79,167,211,249,118,237,
-218,149,111,183,219,113,117,255, 98,200, 99, 95,134, 52,101, 35, 90,203,242, 5,183,126, 94,230, 55, 98,112,207,125,184,199,141,
- 65,201,238, 80, 17, 24,110, 32, 71,136,231,245, 44,147,231,152,241, 15, 11, 46,101, 24, 61,109, 44,235, 6,240, 7,147,175, 2,
- 36,205,210, 20,216, 6,112,132,120,253,146, 42,244, 28,242,200, 28,254,241, 84,129,167,141,101,221,193,195,160,230,104,214,190,
-252,249,124,254,252, 85,171, 86,241, 0,204, 6, 32,254, 47, 61,133,123,181,130,239,208,246,252,243,221,125,208,255, 46,202,134,
- 87,221,239, 65,127,151,227,180,112,220,141, 93,201,201, 71,166,183,111, 63,246,181, 46, 93,158,172,199,108, 49, 0, 94, 91,182,
-108,217,227, 87,175, 94,245,108,219,182,237,115,119,233, 71,255,154,101,203,150,189,122,245,234,213, 86,129,129,129,239,130, 14,
- 95,244,175,130, 16, 34, 38,132, 12, 33,132,140, 33,132, 12, 35,132,244,170,250,251,190,170,101, 12, 33, 36,162,206,250,190,170,
-125,171,183,247,110, 64, 99, 76,221,253,106,237, 83,247,255,219,254,174,199,104,141, 65,101, 91,173, 49,183, 29,192,193,131, 7,
- 73,237,117, 93,166, 4,226,157, 57,253,124, 13,215, 15,236, 32,250,140,100, 82, 28,127,137, 92,218,252, 33,153,115,159,167,225,
-177,182,248,200,249,242, 34,228,212,169, 83,228,234,213,171, 68,175,215,147,196,196, 68,210,187,119,111,163, 92, 46,255, 5, 64,
-160, 51, 98, 42,149, 74,247,203, 47,191,144, 17, 35, 70,148, 42,149,202,149,213, 55,151, 90,173,214,157, 58,117,138,140, 24, 49,
-162, 84,165, 82,173, 1,192, 7,128,135, 30,122, 40,143, 16, 66, 60, 61, 61,179,235,211,155, 48, 97, 66, 49, 33,132,104, 52,154,
-234,170, 38,190, 74,165, 90,243,226,139, 47,234, 47, 92,184, 64, 92, 93, 93,171,211,121,106,181,122,229,236,217,179,245, 49, 49,
- 49,181,211, 27,197,205,205, 45,131,101, 89,114,224,192, 1,162,213,106,107,242,224,234,234,154,193,178, 44,217,183,111, 95,131,
-121,107, 44, 80,160, 84, 42, 87, 76,159, 62,189, 60, 53, 53,149,184,187,187,235,106,165,175,156, 49, 99, 70,121,122,122, 58,241,
-240,240,112, 40,143,238,238,238,186,211,167, 79,147, 73,147, 38,149,213, 46, 83,119,119,119,221,153, 51,103,170,211, 87, 56,242,
- 32,107,213,170,213,115, 90,173, 54, 91,171,213,102,187,184,184, 44,241,241,241,201,205,207,207, 39,132, 16,210,174, 93,187,188,
-218,145, 44,109,248,248,121, 27,119,159, 57, 23, 21, 87,152,223,101,248,243, 43, 52, 93, 38,104,156, 40,131, 64,185, 92,254,203,
-160, 65,131,140, 25, 25, 25,164,162,162,130,196,198,198,146, 83,167, 78,145,155, 55,111, 18, 0,196,145,203, 73,169, 84,102,153,
-205,102,206,108, 54,115,249,249,249,108, 94, 94, 30, 27,191,210,135,144, 47,133, 53, 75,201,190,113, 36, 55,106, 41,167, 86,202,
- 51, 1,168,238,217,131,103,125,152, 31,217, 20,188,235,218, 98,255,248,168,101,163,108, 36,245, 56,217,241,164,167,237,196, 60,
-223, 91,100, 67,200, 15,100, 83,104,235,102,105,110, 8,221, 17,251,166,255,141,117,239,190,100, 75, 75, 75, 35, 11,103,140,178,
- 31,157,227,155, 68, 54,134,236,110,142,102, 45,166, 62,248,224,131,250,244,244,116, 18, 22, 22, 86,193,231,243,159,254, 47,153,
-172,136, 32,113, 86,236, 55, 11,185,113,225,242,194,187,100,182,194,181, 90,109,193,214,173, 91,137, 74,165,202,251, 27,153, 45,
- 38, 4, 24,191,173, 75,151,125,220,228,201,236,182, 46, 93,246,133, 0,227,171, 12, 22, 3,224,245,229,203,151,199,216,108,182,
-152,175,190,250, 42,102,252,248,241, 49, 0, 22,182,240, 59, 63,249,232,163,143,136,205,102, 35, 95,125,245, 21, 25, 63,126, 60,
- 1,176,214,209,157,149, 74,101,135,206,157, 59,111, 15, 11, 11, 75,239,218,181,171, 37, 52, 52,212, 20, 20, 20,148, 26, 30, 30,
-190, 85, 34,145, 4,130,242,151,208,152, 23, 33,132,244,122,253,245,215,223, 0, 64, 94,127,253,245, 55, 8, 33, 99,170,252,196,
-152,218,127,215, 93, 87,155,167,234,255,235,211,168, 94,234,211,172,239, 59,234,124, 15, 26,136,100,205,188,227,224, 14, 30, 60,
- 56,232,224,193,131, 39,234, 30,220,195,109,209,111, 78, 63, 95,163, 49, 63,135,196,125,248, 50,249,117,136, 31, 57, 53,216,155,
- 36,204,127,144,228,124,179,134,188,208,205,213, 48,185, 45,134, 56,107,180, 98, 98, 98, 72, 76, 76, 12,185,120,241, 34, 73, 73,
- 73, 33,165,165,165,228,219,111,191,101,221,221,221,141, 18,137,100, 25, 0,153, 35, 98,106,181, 90, 71, 8, 33,102,179,153, 44,
- 89,178,196, 84, 21,169,242,210,104, 52, 58, 66, 8, 41, 41, 41, 33,203,150, 45, 51,105, 52,154, 88, 0,173, 60, 60, 60, 50,146,
-147,147,137,151,151, 87,189,102,198,213,213, 85,119,227,198,141,106,227,228,235,234,234, 26,183,127,255,126, 43, 33,132,100,102,
-102, 18, 55, 55, 55, 29, 0, 47,119,119,247, 75, 7, 15, 30,180, 18, 66, 72,118,118,118,117,186, 67, 70,203,104, 52,146,163, 71,
-143,222,150,135,234,244, 67,135, 14,221,102,192, 28,192, 75,163,209,196,124,251,237,183, 22,150,101, 73, 92, 92, 92,181, 73,244,
-114,113,113,185,184,123,247,110, 11,203,178, 36, 62, 62,222, 97, 51,216,166, 77,155, 60, 66, 8,177,219,237,100,227,198,141,230,
-234, 50,173, 78,183, 88, 44,228,179,207, 62, 51,171,213,234, 24, 0,141, 70,223, 60, 60, 60,178, 45, 22, 11, 41, 41, 41, 33,189,
-123,247,214,159, 58,117,138,148,149,149, 17, 66, 8,105,211,166, 77, 30, 0, 4, 15,122,250,253,115,137,250,178,167, 94, 93,255,
- 93, 96,175,199, 62, 60,114, 62, 43,243,139,189,209, 49, 30,225, 19, 70, 57, 18,212,148, 72, 36,203,124,124,124, 76,191,255,254,
- 59,107,181, 90, 73,122,122, 58,185,120,241, 98,205, 53,118,229,202, 21,135,140,150, 64, 32, 88,124,238,220, 57, 43,203,178, 92,
- 65, 65, 1,155,151,151,199,230,229,229,217,235, 26, 45,242,165,144, 20, 28,122,150, 68,110,158,107, 17,137, 68,139,239, 77, 52,
- 11,124,178, 41,120, 2,217, 20, 28,179,117,186, 71, 65,249,197,157,132,252, 60,151, 36,189,223,150, 44, 30,165, 42,231, 54, 5,
-199,144, 77, 33,147,201, 59,131, 4, 78,105,110, 14, 29, 71, 54, 5,199,124,244,112, 64,225,165,152, 11,228,196,137, 19,228,179,
- 53,203,201,156, 8,223, 10,110, 83,112, 12,217, 16, 58,201, 25,205,218, 72, 36,146,196,147, 39, 79,146,168,168, 40,242,238,187,
-239, 18,185, 92,158,126, 55,162,122,100, 67, 80, 0,249, 60,104, 16,217,210,209,135,252, 54,232,111,215,193,167, 87, 43,248, 14,
- 15, 18,103, 22, 92,218, 75, 72,209, 77,146,187, 50,140,140, 10, 22,182,212,108,133,107,181,218,252,212,212, 84,146,155,155, 75,
- 86,175, 94, 77,212,106,245,223,218,108, 5, 3, 19, 0,188,177, 98,197,138, 26,147,181,126,253,250,152, 43, 87,174,196,248,251,
-251,255,212,130,239, 90,187, 98,197,138, 26,147,181,126,253,122,114,229,202, 21, 18, 16, 16,144,209,212,142,211,167, 79,151,247,
-235,215, 47,102,218,180,105,134,173, 91,183,146,212,212, 84, 18, 27, 27, 75, 86,172, 88, 65,222,126,251,109,242,229,151, 95,146,
- 73,147, 38, 85,244,238,221,251,220,228,201,147,165, 78, 70, 20, 4, 85, 81, 24, 49, 33, 68, 72, 8,169, 54,154, 2, 0,194,234,
- 31,255, 20,199,188, 72, 67,102,170, 33,131, 85,119, 91, 35, 70,172, 81,195,230,192,247,221,105,170,234, 70, 66,106,253,253,219,
-216,177, 99, 7,221,241,242, 33,120,111,230,130,247,165, 41, 91, 87, 67,247,237,167,224,151,232, 32, 44, 47,132,249,100, 36,108,
- 39,247,227,241,190,125,101, 50,134,249,192,217, 2, 21,139,197, 16,139,197, 16,137, 68, 48, 24, 12,200,206,206,198,253,247,223,
-207,187,120,241,162,244,185,231,158,155, 43,147,201,210, 1, 76,108,242,110,102, 42, 35,210,167, 79,159,198,179,207, 62, 43,217,
-190,125,123, 87, 79, 79,207,203, 44,203,138, 1, 32, 62, 62, 30, 83,166, 76,145,236,220,185,179, 83,171, 86,173, 46, 90,173, 86,
-185, 68, 34, 1,159,207,111, 80, 79, 44, 22,195,102,179, 73, 58,118,236, 24,123,249,242,229,240,177, 99,199, 10,211,210,210,144,
-156,156, 12,155,205, 38, 14, 10, 10,186,114,241,226,197,174, 99,198,140, 17,102,100,100, 32, 45, 45,173, 38, 31,142,228,215, 98,
-177, 64, 34,145,160,118,149, 22,195, 48, 48,155,205, 16,139,197, 14,107, 9, 4,130,161, 33, 33, 33, 87, 46, 95,190,220,125,194,
-132, 9,162, 11, 23, 46, 32, 51, 51, 19, 44,203,138, 67, 67, 67,175, 92,190,124,185,219,248,241,227, 69,177,177,177,208,233,116,
-112,180, 10,173,250,115,151, 47, 95,198,180,105,211,196,135, 15, 31,238,230,227,227, 19,107,183,219,197, 0,112,229,202, 21, 76,
-153, 50, 69,124,228,200,145,238,173, 91,183,142,109,162, 42,145, 15, 0, 54,155, 13,207, 61,247,156, 66,173, 86, 35, 35, 35, 3,
- 28,199,129,101, 89, 0, 64, 97,113,225,149,203, 87,226,226, 31,159,250,240, 32,163,213,108, 62,115, 62,250,122,187, 54, 1,126,
- 12, 67,218, 52,145,213,137, 10,133, 34,125,229,202,149,243, 82, 83, 83, 37, 33, 33, 33,188,164,164, 36,148,151,151, 67, 36, 18,
-213, 92, 99,142, 30,183, 88, 44, 30, 28, 22, 22, 38, 48,153, 76,224, 56, 14, 0, 8,143,199,171,247,100, 72, 75, 78, 34,212,203,
- 46,148,201,100,131,239,201, 19,169, 44,204, 29, 28,134,167,229, 91, 36, 18, 23, 63,149,210, 39, 8, 72,143, 66, 91, 79, 9,248,
- 60,190,244, 66,178, 65, 1,144,225,240, 47,112,119, 78,147, 27,158,156,103,145,216,220, 58, 41, 91,249,249,163,176,176, 16,173,
-219,133,192, 36,246, 20,159,190, 89,161, 4,227,164,230, 31, 12,232,216,177,163,119,135, 14, 29, 80, 80, 80,128,238,221,187,195,
-213,213,213, 21,192,240,102,155,172,175, 2, 36, 40, 67,127,128,183, 18, 44,243, 46,108,130,165,184,153,223,157,108,234, 46,252,
- 59,153, 44,181, 82,124,118,231,174,111,125,221,253, 67,129,200,167,224,229, 34,193,150,231,187,187,121,106, 36,251,154,105,182,
-194,189,188,188,142,159, 59,119,206, 67, 42,149,226,226,197,139, 8, 11, 11,195,234,213,171, 61, 93, 93, 93,163,254, 38,102,139,
-196, 3, 7, 62,138,141,253,106,251,173, 91, 7,167,183,111, 63,118, 90, 80,208,146, 89,143, 62,250,244, 75, 47,189,132,229,203,
-151, 99,223,190,125,232,223,191, 63,102,206,156,105, 75, 79, 79,223,214,204,239,249,116,229,202,149,115,230,206,157, 91, 87,211,
-154,150,150,214,104,109, 75, 88, 88,152, 95, 98, 98, 98,214,252,249,243,187,111,223,190, 93, 38,151,203, 81, 82, 82,130,207, 63,
-255, 28,111,188,241, 6, 24,134, 1, 33, 4, 95,126,249,165,252,201, 39,159,236,117,235,214,173,172,128,128,128, 38,155,117, 16,
- 66, 24, 66,136, 20,128,188,106, 81, 0,144,239,220,185, 83, 51, 97,194, 4,117, 85,154,172,106,145,128, 82,151,122,189, 72,173,
-119,229,193, 58,229, 61,182,110, 90,221,109,132,144,177,141,105, 56,105,160,235,251,190,200,198,204, 86,237, 55,208,224,122, 93,
- 36,208,197, 59, 48, 24,165, 63,239,134, 76,192, 64,198,175, 90, 4, 12,120, 73, 87,208, 90, 42,132,141,144,240,230, 26,173,234,
- 69, 40, 20,194, 96, 48,128,101, 89,188,241,198, 27,146,163, 71,143,186,243,120,188, 31,154,210,169,109,152, 18, 18, 18, 16, 26,
- 26,202, 28, 56,112,192,107,246,236,217,178,234,239, 41, 45, 45, 69,135, 14, 29,152, 67,135, 14,105,223,124,243, 77,101, 99,102,
-134, 97, 24,136, 68, 34,204,157, 59, 87,118,254,252,121,183, 86,173, 90, 33, 41, 41, 9, 69, 69, 69, 80, 42,149,152, 59,119,174,
-236,220,185,115,158,173, 90,181, 66,106,106, 42, 74, 75, 75,161, 84, 42,157, 54, 90, 34,145,232,182,125, 24,134,129,213,106,117,
-202, 24,104, 52,154, 29, 49, 49, 49,158, 26,141, 6,177,177,177,176,219,237,208,104, 52,152, 51,103,142, 44, 38, 38,198,211,197,
-197, 5,241,241,241, 32,132, 64,173, 86, 59,149, 71, 0,224, 56, 14,241,241,241,104,211,166, 13,162,162,162,180,179,102,205,146,
- 86,167,223,188,121, 19,126,126,126,136,138,138,210, 42, 20,138, 29, 13,105,113, 28,135,156,156, 28, 92,189,122, 21, 73, 73, 73,
-200,207,207, 71, 65, 65, 1,202,203,203, 97,183,219, 1, 0,242,242,178,200,157,223, 29,184, 44,147,201,228, 97, 65, 29,253,175,
-196, 93,203,147,201,100,242, 0,127,255, 32,224, 29, 94, 35,134,240,135,180,180, 52,247, 39,159,124, 82,148,155,155,139,226,226,
- 98, 8, 4,130, 59,174, 45,177,216,177,166, 64,118,187, 61, 84, 42,149, 50, 86,171,181, 38, 2, 38, 22,139, 49,111,135, 1, 97,
-139,113,219,242,232,154, 60, 16,214, 6,139,197, 18,250,151,191,193, 0, 6,140,165, 35, 24,166,251,217,164, 10,183, 1, 99,167,
-138,144,124, 24,224,108, 0, 79,128,193, 93,252, 4,251,174, 84,120,129,160, 11,204, 8, 33,164,233,158, 95, 4, 96, 0,107, 7,
-128,233,121, 52,209,238,222,255,193,231, 69, 89, 89, 89, 16,137, 68,144, 72, 36,232, 62,244, 33,193,206,203, 54,111, 48,232, 10,
- 43,130, 29,209,188, 45,236, 40,147,189,245,246,219,111, 43,106,107, 62,253,244,211, 10,141, 70,243,118,179, 77, 86,133,188, 47,
-236,100,238,213, 44, 67,155, 37,145,185,161,183,242,140,193, 32,100, 62, 96,235,118, 23,204,214, 96,137, 68,146, 12,224,254, 22,
-153, 44,149,248,204,174, 93,223,250,186,181,174, 52, 89,176,155, 0,161, 12,222,158, 46,216, 50,111,136,155,167,139,204, 89,179,
- 21,238,229,229,245,203,217,179,103, 61,164, 82, 41, 98, 98, 98, 32, 18,137, 32,149, 74,209,185,115,103,108,218,180,201,211,205,
-205,237,111,101,182,150,197,198,110, 93,122,245,106,194,235,225,225, 33, 19, 21, 10,183, 23,167, 77,211,188,249,230,155, 7,247,
-239,223,255,213,152, 49, 99, 10,206,159, 63,255, 49,128,221,206, 70,204, 0,172, 95,181,106,213,139,213,198,237,205, 55,223,252,
-114,255,254,253, 75,199,140, 25,147,115,254,252,249,249, 0,214, 55, 38,160,215,235,247, 47, 90,180, 72,243,224,131, 15, 86,255,
-143,147, 39, 79, 98,219,182,109, 80, 40, 20,183,125,118,252,248,241,120,246,217,103, 93, 45, 22, 75,163,239, 36,173, 86, 59,236,
-236,217,179, 97,168,236,224, 37,169, 54, 90,113,113,113, 46,101,101,101, 46, 74,165,210,197,199,199, 71, 85,109,182, 30,124,240,
- 65, 23,129, 64,112, 63, 40,104,202,139,212, 54, 58,142,164, 53,247,243,142,154,173, 58, 73, 13,142,161,117,155,209, 26, 59,118,
-236, 9, 52,208,147,202, 90,164,131, 4, 44,100,124, 6,114,126, 45,179, 5, 14,130,210, 60, 48,205,232,192, 91,223,203, 80, 44,
- 22,131,207,231,195, 98,177,160,176,176,208, 41, 83,160, 86,171,161, 84, 42, 97, 52, 26, 97,183,219, 33,149, 74,171,205, 8,212,
-106, 53,132, 66, 33,132, 66, 33,164, 82,233, 29,209,164,186,209, 28,145, 72, 4,133, 66,129,156,156, 28,164,165,165,129,227, 56,
- 40,149, 74, 40, 20, 10,136,197, 98,100,103,103, 35, 59, 59, 27,132, 16, 40, 20, 10, 40, 20, 10, 56,211,224,154,101,217,122, 95,
-254, 54,155,205,169,136,150,221,110,199,245,235,215,145,158,158, 14,169, 84, 90,115,172, 18,137, 4, 55,111,222, 68,110,110, 46,
-228,114, 57,212,106, 53, 52, 26,141,195,186,213,199,162, 82,169, 32,147,201, 80, 92, 92, 12,131,193, 80, 83,166,106,181, 26, 10,
-133, 2,165,165,165,200,203,203,107,244,216, 89,150, 69,118,118, 54,242,243,243,145,145,145,129,130,130,130, 26,179, 85, 21, 53,
-106, 89, 96,167,172, 12,133,133,133, 53,145,200,134, 22, 71,224, 56, 14,229,229,229, 56,123,246, 44,195,113, 28, 74, 74, 74,184,
-252,220, 92,246,133,108, 49,246,189,179,129,124,123,248,146,105,231, 79, 49,198, 61,191, 92, 53,174,223,115,197, 40,237,253,174,
-253,158, 60,134, 62, 11,215,192, 38, 28, 81,160,183, 73,242,173, 34,141, 87,120, 4,144,124, 8,224, 9, 0,169, 43,250,116,106,
-139,180, 98, 86,113, 67,103,145,130,193, 72,172, 15,114,117, 72,147, 21, 14,207, 47,183, 73, 82,173,158,234,208, 46, 61,160,211,
-233, 32,145, 72, 32,145, 72,208,179,127, 4,146, 11, 89,249,181, 44,163, 28, 4, 35, 28,210,252,131,118, 74,165,178,239,253,247,
-223,207,212,214, 28, 61,122, 52, 24,134,233, 12, 32,196,169,135,220,218,118, 98, 88,229,125, 32, 32,115,175,229, 24, 90,237,139,
- 51, 5,141,155,248,144,219, 39,199,242, 66,175,231,154, 3, 65,108, 11, 64,172, 61, 90, 96,182, 6,169, 84,170,131,235,214,173,
- 11,148, 74,165,135, 0, 12,104,142,136, 82,198,223,248,214,139, 83,125, 93,171, 77,150,205, 0, 8,100,128, 80, 6, 8,100,240,
-214,122,224,131,103,135,187,201,165,194, 61, 78, 24,214,157,235,215,175,247,172,107,178,170,151,238,221,187, 99,241,226,197,158,
-110,110,110, 59,238,241,203,114,132, 70,163,217, 30, 17, 17,113, 54, 91,165,122, 54,167, 71, 15,241, 47, 26, 77,233,176,210, 82,
- 77, 64, 92,156, 53, 24,184, 2,224,179,204,204,204, 81, 78,152,172, 71,213,106,117,204,176, 97,195,172, 42,149, 42,125,245,234,
-213, 47,204,158, 61, 27,203,151, 47,199,162, 69,139, 62, 7,240, 12,128,255,101,102,102,182,106,202,100, 1, 64,110,110,238, 99,
-175,189,246, 90, 65, 65, 65, 1, 0,160,115,231,206, 40, 41, 41,193,194,133, 11,241,242,203,149,157, 98,187,117,235, 6, 66, 8,
-116, 58, 29, 86,174, 92,169,203,205,205,125,162,137,103,123,198,238,221,187,123, 89,173, 86, 63, 84, 86, 15, 74, 74, 74, 74,212,
- 69, 69, 69, 42,171,213,170,224, 56, 78,225,226,226,162, 4, 32,127,252,241,199, 5,215,174, 93, 11,181,219,237, 89,212, 91,253,
- 65, 99, 94,164, 57, 48, 12, 19,217,146,200, 85,125, 17,177, 6,104, 60,162, 53,118,236, 88,166,246,250,182,136, 17,131,216,244,
-232, 40,184,133,247,184, 45,154, 37,231, 51,144,169, 53, 72,206, 72,131, 8,204,213,187,101,180,138,139,139,241,194, 11, 47, 24,
- 31,123,236,177, 66,142,227, 30,114,212, 20,104, 52, 26,104, 52, 26, 92,187,118,141, 76,154, 52, 73,183,122,245,106, 99,109,163,
-149,144,144, 64, 70,140, 24,145,247,246,219,111,235, 27, 51, 90,213, 17,173,101,203,150, 25, 7, 15, 30,156,127,245,234, 85, 82,
-109,166,148, 74, 37, 86,174, 92,105, 28, 50,100,136,238,194,133, 11,164, 58,205,153,136, 22,143,199,171, 49, 90,181,247,225,241,
-120,224, 56,206, 41,163, 85, 81, 81,241,216,152, 49, 99,116,241,241,241,164,250, 56, 53, 26, 13, 86,175, 94,109, 28, 62,124,184,
-238,234,213,171,164, 58, 77,173, 86, 59,108, 6,171,191, 95,165, 82, 65,173, 86,227,218,181,107,100,196,136, 17,186,181,107,215,
-154,106,167, 95,191,126,157,140, 31, 63, 94, 87, 94, 94,254, 88, 99,230,165,186, 58,207,110,183,195,100, 50,161,160,160, 0, 25,
- 25, 25, 53, 85,135, 70,133,122,212,212, 71,198,117, 53, 26,141,134,107, 9,137,233,157, 59,133,105,141, 70,163, 33, 45, 61, 61,
- 1,120,135,107, 68,251,161,240,240,240,194, 23, 94,120,193, 88, 92, 92,220, 98,163, 37, 22,139,227, 5, 2, 1, 25, 48, 96, 0,
-177, 88, 44, 36, 35, 35,195, 86, 80, 92,108, 15,249,240, 67,114,117,222, 60, 70, 22, 29, 45, 81, 42,149, 76,149, 38, 47, 41, 41,
-137,147,201,100,241,127,249,147,136,199,121,131, 33,247,255,158,168,119, 25, 62,110,138,152,201, 61, 15, 88,245,128,196, 21,144,
-184, 66,160,112,199, 3, 3,186,241,183,158, 45,243, 6,225,250, 65, 36,241,107, 82, 83, 72,188, 0,110,192,207, 9, 38,215,251,
- 39,207, 17, 23, 21, 21,129,207,231,215,152, 34,185, 66,129, 97, 19, 31,231,125,121,222,236, 13,144,254, 96,248,126, 78,220,235,
-175,190,245,214, 91,162,226,226, 98,240,120,188, 63, 52,229,114,204,154, 53, 75,162, 86,171, 23, 57,252,240,219, 29, 42,130, 80,
-210, 7, 32, 47,223,200, 53,181,218,127,197, 24,188, 96,217, 22, 89,120,183, 94,120,110,176, 86,182, 44, 50, 47,252,114,134,177,
- 45,192,206,131,221,210,179, 25,102,107,128, 74,165,138,140,142,142,150,143, 30, 61, 26, 43, 87,174, 84,200,100,178, 67,205,121,
-240, 87,232,217,217,239,173,253, 90, 23,251,241, 72,192, 90, 81,105,176,106, 45,121,122, 14,139,183, 28, 47,181,217,200, 84, 71,
- 53,141, 70,227,140,103,158,121,166,112,207,158, 61,119,152, 44,169, 84,138,148,148, 20, 44, 89,178,164,168,168,168,232,137,123,
-105,178,102,207,158,189, 36, 51, 51, 51,248,231,159,127, 22,228,231,231,107, 87,125,241, 69,233,247,165,165, 69, 75,227,226,110,
-252,175, 83,167,142,175,119,233,242, 68, 35, 67, 63,212,107,178, 94,124,241,197,157,153,153,153,221,143, 29, 59, 38,204,207,207,
-247,123,241,197, 23,177, 98,197, 10, 44, 90,180,104, 19,128,231,224, 88,135,151, 63, 2, 8, 86,235,141,226,226,226,177, 35, 71,
-142, 44, 41, 46, 46, 70,151, 46, 93, 48,110,220, 56,120,123,123,163, 85,171, 86,152, 48, 97, 2,130,130,130, 80, 88, 88,136,169,
- 83,167, 22,229,231,231,143, 4,144,212,152,102, 97, 97,225,173, 29, 59,118, 36,204,153, 51,167,123,102,102,102, 40, 0,247,242,
-242,114, 69,121,121,185,196, 98,177,200, 92, 93, 93, 93,187,117,235,230, 49,115,230, 76,229,165, 75,151, 66, 51, 51, 51,245, 0,
-210,168,189,170, 49, 89, 13,122, 17, 0,249, 85,134,199, 82,103,157,223,196, 54, 71,247,173,247,111, 7, 62, 87,215,108,213, 94,
-238,168, 58,172,255, 98, 4, 22,111,219,189,213, 36,246,239, 0, 77,112, 87,200,165, 82,200,196, 98,200, 92,221, 97,230, 56,124,
-145,146,107,168, 32,100,145,179, 5, 90,247, 69,200, 48, 12, 62,253,244, 83,123,223,190,125, 77,199,143, 31, 95,103, 52, 26,253,
- 1,236,117,198, 20,172, 93,187,214, 48,119,238,220,203,121,121,121, 93,165, 82,169,165, 58,125,221,186,117,134,199, 31,127, 60,
- 46, 51, 51,179,187, 92, 46, 55, 52,212, 62,171,182,209,146, 72, 36,230,188,188,188, 94, 79, 63,253,116,252,103,159,125, 86, 33,
-151,203,161, 80, 40, 32,145, 72, 44,121,121,121, 93, 95,120,225,133,203, 43, 86,172, 48,200,100, 50, 40, 20, 10,167,170,229, 8,
- 33,119, 24,170,218,233,142, 98,183,219,143,231,229,229,117,157, 59,119,238,165, 79, 62,249,164,162,218, 0,213,206,227,170, 85,
-171, 12, 74,165,210,169,136, 86,245,231, 20, 10, 5,214,172, 89, 99,152, 51,103,206,229,188,188,188,174, 18,137,196, 82, 43,189,
- 98,246,236,217,151,242,242,242,186,218,237,246,227,141,252,194, 99,203,202,202, 32, 16, 8, 16, 23, 23,103, 22,137, 68,224,241,
-120,184,121,243,102,141,209,114,115,115, 11,235,218,185, 83,200,215, 59,119,159,144,137, 36,146,190,189,122,134, 38,165,166,101,
- 18,194,164, 54,145,213,189, 70,163,209,255,248,241,227,235,250,246,237,107,250,244,211, 79,237, 13, 69,182, 28,193,108, 54,159,
-184,120,241,162, 77, 42,149, 50, 57, 57, 57,118, 62,159, 15,150,101,137,185, 87, 47,115,231, 79, 62, 33,215, 94,127,157, 81, 43,
- 20, 2,145, 72, 4,185, 92,206, 28, 62,124,216, 98, 48, 24, 78,252,245, 70, 11,114, 48,144, 37,230,153, 85, 82,158,157, 65,194,
-222, 74,147, 37,117, 1,164,174,128,212, 21,190,190,126, 56,159, 98, 80,129, 7, 49, 88, 7,198, 16, 35, 68, 1, 6,242, 56, 29,
- 84, 66,177,140,201,205,205,173, 49, 68,213, 75, 96,135, 80, 92, 76,211, 43,193, 16, 9,248,112,102, 8,146,177,238,238,238,130,
-156,156,156, 59, 52,195,194,194,248, 54,155,205,241,161, 93,178, 89, 31,128,123, 49, 33,215,228,243,227,229,138,224,121, 75,191,
-148,201,216, 18, 32,122, 45,194,219,181,194,188,201,221,196,111,238,207, 15,191,144,106,104, 7, 62,121, 14,156,222,211,137,124,
-222,175, 82,169, 14, 93,184,112, 65,174, 82,169,144,148,148,132, 94,189,122, 97,243,230,205,114,185, 92,254, 19, 0,167,218,227,
-157,211, 33, 77, 95,206,246,125,117,119,122,110,108,142,253, 54,147,149, 95, 65,240,204, 71,251, 75,138,203, 76, 15,157,205,104,
-248,254,169,135, 75, 37, 37, 37, 35, 22, 45, 90, 84,152,159,159,127,155,201, 74, 75, 75,171, 54, 4,131, 1, 92,189, 87, 47, 75,
-141, 70, 51,109,233,210,165,184,112,225, 2, 70,143, 30,141,168,168, 40, 20, 21, 21, 97,215,161, 67,137, 59, 18, 19,255, 87,221,
-102,171,129,161, 31,234, 69,173, 86, 47, 88,186,116, 41,162,163,163,107, 52, 11, 11, 11,177,116,233,210, 76, 0,207, 59,107,178,
-170,201,203,203, 59,127,227,198,141,145, 93,186,116,185,190,110,221,186, 76, 31, 31, 31,110,230,204,153,120,230,153,103,224,233,
-233,201,174, 89,179, 38,125,192,128, 1,113,183,110,221,138, 48, 24, 12, 87, 28,249, 45, 80, 80, 80,112,122,243,230,205,103,135,
- 14, 29, 42,159, 49, 99,134,231,190,125,251,220, 13, 6, 67, 43,137, 68,162,181, 88, 44,226,235,215,175,243,191,255,254,123,239,
-107,215,174,165,152, 76,166,243,205,205,251,127, 13,134, 97, 46, 48, 12, 19,201, 48,204,177, 58,235, 11,141,109,115, 98,223,134,
-254,110,244,115,117,178,185,185,206,226, 56,211,218,225,157, 89,157, 84,134,211,211,251,144,220,153,247, 19,221,148, 80,114,114,
-144, 27,121,186, 61, 83, 49,163,153,195, 59, 24,141,198,154,101,207,158, 61,196,219,219,187, 66,165, 82, 57, 61,188,131,183,183,
-183,174,172,172,140,220,119,223,125, 69,158,158,158, 53, 67, 17,248,248,248,232, 42, 42, 42, 72,159, 62,125,138,180, 90,109,205,
-240, 14,126,126,126, 25,132, 16, 18, 16, 16,144,221,144,158,221,110, 39,222,222,222,213, 61,244,132,110,110,110, 27,122,247,238,
- 93,164,211,233,136,143,143, 79,205,208, 9,158,158,158, 43,123,245,234, 85, 55,189,169,252,102,100,102,102,146,204,204, 76,210,
-186,117,235,236,218,233,105,105,105, 36, 45, 45,141,248,249,249, 57, 61,188,131,167,167,231,138,122,242,210,172, 60,250,251,251,
-235,140, 70, 35,233,215,175,223,109,101,234,239,239,175, 51,153, 76,213,233, 14, 13,239, 32,147,201,158,147, 74,165,217, 82,169,
- 52, 91, 34,145, 44,105,211,166, 77,222,119,223,125, 71,214,172, 89, 83,221, 37, 29,158, 97,227,251,118,232,247,196,255, 60,195,
- 38, 44,104,201,240, 14, 42,149,234, 23,111,111,239,138, 61,123,246,220,118,125, 25,141, 70,135,135,119,144,201,100,153,122,189,
-158,211,233,116,182, 83,167, 78, 25,162,163,163, 13,113,113,113,134,148,148, 20, 99, 97, 94,158, 85,167,211, 25, 75, 75, 75,205,
-151, 47, 95, 54,203,229,247,102,120, 7,178, 57,168, 3,217, 16,178,255,214,123,129,215,230, 14,148,155,174,124,208,149,144, 31,
- 30, 36,228,167,103, 8, 57,254, 42, 57,191,105, 38,233, 23, 40, 97, 79, 45,108,157, 64, 54, 6,255,232,200,144, 12,100,115,231,
- 14,100, 67,200, 79,137,239, 6, 94,155, 49,160,149,233,139,207,214,144,115,231,206,145,184,184, 56,146,148,148, 68,126,218,251,
- 29,233,215, 78, 94,169,185, 33,100,191,147,195, 60,244,151, 72, 36,250,213,171, 87,147,179,103,207,214,104,238,223,191,159,200,
-229,114, 3,224, 88,175,101, 2, 48,100, 67,216, 68,251,103,193,191,191, 57, 92, 89, 94,120,240, 85, 66,174,108, 37,100,115, 56,
- 33, 95,245, 38,228,187, 49,132, 28,120,130,156, 93, 51,153,244, 15, 20,217,200,198,224, 40,178, 41,204,225,198,246, 66,161,176,
-108,207,158, 61, 36, 59, 59,155, 68, 69, 69,145,232,232,104, 18, 31, 31, 79,210,211,211, 73,100,100, 36, 17, 10,133, 38, 52, 99,
-218,178,222, 94, 8,136,232, 40,202,185,188,172, 63, 33,251,166,146,252, 29,211,200,216, 78,170,162, 62,173, 91, 52, 30, 93, 55,
-119,119,247,130,200,200, 72,146,146,146, 66, 78,156, 56, 65,180, 90,109, 1,128,240,123,253, 66,140,136,136, 56, 71, 8,137, 25,
- 61,122,116, 12,128,195, 17, 17, 17, 49,201,201,201, 49,189,122,245, 58,139,198,135,126,104,144, 97,195,134, 89, 9, 33,100,244,
-232,209, 4, 64,118, 68, 68, 4, 73, 78, 78, 38,189,122,245,178,220,165,108,243, 1, 60, 33, 20, 10,191,112,115,115,251,213,213,
-213,245, 56,159,207,223, 12, 96, 58,154, 63, 30, 23, 31, 64, 43, 0, 97, 0,122, 86, 45,161, 85,105,180,199, 33,229, 78, 38, 7,
-162,255,147,237,152, 19,143,181, 69,249,212,182,208, 63,213,158,113,100,192,210,136,134,140, 22,199,113, 36, 33, 33,129, 12, 25,
- 50,164, 66,161, 80,100,193,241, 1, 75,111,211,244,240,240,136,214,106,181,119, 12,162, 89, 43,253,182, 1, 75,181, 90,237,105,
- 31, 31, 31,157,167,167,231,197,250, 52, 61, 60, 60,162,125,124,124,116, 30, 30, 30,183, 13,238,201,231,243, 71,123,120,120,100,
-213, 77, 23, 8, 4, 67,181, 90,109, 70,221,244, 6,142, 29,222,222,222, 25,217,217,217, 36, 63, 63,159,248,251,251,103,215, 53,
- 96,185,185,185,183, 25, 48, 71, 52,155,202, 75, 35,121,172, 87,211,129, 50,109,206,121,175, 38,200,215,215, 55,111,213,170, 85,
- 68,169, 84,230,213,222, 16, 60,240,169,183,206, 37,234,203,158,121,109,195,119,245, 12, 88,234,232,224,160, 35, 21, 10, 69,214,
-144, 33, 67, 42, 18, 18, 18, 8,199,113,132,227,184,134,140, 86,125,154,163,122,246,236, 89, 88, 80, 80,192,150,151,151,219, 51,
- 50, 50,204,201,201,201,198, 15, 62,248,192,154,159,159,111,210,235,245,150,216,216, 88,179,143,143, 79, 62,128, 81,206,158,163,
-230,190,187,234, 86,159,145, 77,161,253,201,198,208,200,248,183, 3,174, 63,209, 91, 97,142, 89, 53,154,144,227,175,146,179, 27,
-158, 33,125, 3,197,149,134,104, 83,200, 33,242,101,208, 64,178,182,157,216, 33,205, 47,218, 15, 32,155, 66, 14, 93, 91, 28,112,
-253,193, 30,158,150,157, 91, 55,145,155, 55,111,146,253,223,239, 32,125,218, 86,153,172,141,161, 71,201,134,208, 33,142,104,214,
-103,182,182,108,217, 66,110,222,188, 73,126,252,241, 71, 71, 77, 86, 68,125, 70,235,141, 8,101,201, 51,189,165,230,169,221,196,
-150, 9,225, 34,235,136, 14, 34,123,191, 0, 1,219,213,135,199,133,122,130,140, 8,150,153,201,198,224, 40,178, 49,116,164,163,
-249, 20,139,197,233,168, 53,166, 78,221, 69, 34,145,228, 55, 98,180, 34,154, 52, 91, 65,146,156, 95,222, 27, 74,198,117, 81, 21,
- 58,104,178,154,186,150,186,121,120,120, 20,124,245,213, 87,196,203,203, 43,223, 65,147,245,167, 95,159, 26,141,102,187, 94,175,
-143, 57,114,228, 72, 76, 68, 68, 68,204,246,237,219, 99, 78,158, 60, 25, 35,151,203,183, 87, 7, 39,234,154,173,208, 59,159,255,
- 17,117, 34, 90, 49,229,229,229,228,200,145, 35, 36, 34, 34,130,108,223,190,157,156, 60,121,146,200,229,242,152,230,230,243,207,
- 56,118,170,249,159,102, 38, 26,168, 58,252,211,127,220,212,103,180, 76, 38, 19, 89,184,112,161, 69, 42,149, 26, 68, 34,145,179,
- 83,240,252,163, 47, 66, 15, 15,143,211, 94, 94, 94, 58, 47, 47,175,219,204, 94,237,116, 15, 15,143,139,255,242, 27, 48, 72, 36,
- 18,165, 9,133,194,219,167,224, 9, 27,223,183,125,255, 25,139,188,194,199, 63,208,194,124,138, 68, 34,209, 27, 82,169,212,176,
-112,225, 66,139, 94,175,119,198,104, 1,192,112,185, 92,158,181,109,219, 54, 99, 98, 98,162,173,168,168,200,126,238,220, 57, 91,
-116,116,180,229,157,119,222, 41,151,203,229, 89,104,120, 88,130,191,164, 60,201,218,118,226,106,179,117,101, 81, 64,252,184, 78,
-114,235,230,249, 35, 72,223, 54,117, 76, 86,195, 35,185,215,175, 89,101,182, 46,189,233, 31, 63, 36, 72,105, 95,186,104, 30,233,
-211, 86,118,187,201,114, 66,179,174,217,146,203,229,229,111,191,253,182, 51,145,172,219, 13,225, 23,193,254,100, 83,200,246, 74,
- 19,213,196,178, 33,248,115,242,105,176,255,223,229, 62,234,237,133,128, 97, 65,146,171, 78, 68,178, 28,201,103, 55, 87, 87,215,
-235, 78, 68,178,254,138, 99, 31, 49,107,214,172,152,228,228,228,152,164,164,164,152,147, 39, 79,198, 76,156, 56, 49, 6,192,136,
- 90,159,169, 49, 91,214, 73,147,204,221,120,188,121, 77,104, 62, 58,107,214, 44,146,156,156, 76,146,146,146,200,201,147, 39,201,
-196,137, 19, 9,156,155,190,135,154, 34,106,180,238, 9,127,246,132,159, 17, 0,142,213, 78,144, 74,165, 58,147,201,228,169, 84,
- 42,247,234,245,250, 57,168,236, 22,217, 34,205, 63, 35,159, 84,243, 95,161,233,163, 84, 42,215,233,245,250,137, 82,169, 52,223,
-100, 50,121, 57,161,233, 34,145, 72,230, 73,165,210, 33, 6,131, 33, 8, 0, 20, 10, 69,130,217,108,254,213,104, 52,126, 12,160,
-228, 94, 31, 59, 89,219, 78, 12,177,184, 39, 8, 94,143, 73,175,104,187,244, 72, 81,192,252,161,174,233,253,218, 43, 82, 32,228,
- 62, 2, 99, 62,207, 60,153,102,118, 90, 83,198,244, 2, 43,124,253,124,170,161,205, 71, 63,151, 7, 44, 24,162, 76,239,215, 78,
-153, 14,130,143, 32, 49,156,113, 86,179,174,217, 82, 40, 20,219, 42, 42, 42,158, 5,240,171,179,199, 78,118,135,138, 80, 97,243,
-133,141,223, 9,164,145, 41,124, 8, 49,128,199,143, 67, 46,116,204, 59,215,173,244, 62,250,203, 53, 71, 40,149,202,105, 33, 33,
- 33,237,174, 93,187,150,100, 48, 24,190, 1,112,180,238,251, 39, 4, 24, 34, 23, 8,186, 26,237,246,168,235, 64,116, 19,154,143,
- 42,149,202, 5, 33, 33, 33,225,215,174, 93,187,106, 48, 24, 86, 1,216, 69,207,209,191, 74,243, 95,201, 95, 62,138,114,245,203,
- 78,175,215,211,210,167,252,217,228,232,245,250, 73, 85,215,157,179,251,150,152,205,230,197,102,179,121,113,245, 15,146,226,226,
-226,191, 85,163, 85,230,165, 36, 11, 89,219, 46, 26, 98,241,178, 30,254,178, 57,123,102,201, 12, 32, 76, 38,132,220,154, 38, 76,
- 86, 83,154,231, 33,179, 45,235, 21, 32,123,249,199,231,100, 6, 16,228,130,224,227, 38, 76,150,163,156,170,168,168,104,219,236,
- 99,126,248,186, 21, 64, 10, 1, 82,241, 78, 35, 63, 20,223, 1, 97,104, 35,227,123,201, 81,189, 94,127,244,252,249,243,141,125,
-134,196, 3, 4,249, 91,179, 0, 0, 32, 0, 73, 68, 65, 84,199, 97,119,184, 51,192, 46,189, 94,191,171, 9, 77, 10,133, 26, 45,
- 10,229, 31,200,223,246,133,205,188,148,100, 33,187, 67, 47,160,128,191, 16, 60,180, 5,236,105,168,176,231, 50, 47,165, 89, 90,
-168,121, 14, 5,204, 92,240, 17, 4,177,253, 22,244,150, 92,230,249, 52,203,223,230,184, 1,130,119,168,145,162, 80, 40,127, 27,
-102,226,246,158,134, 53,255, 83,163, 69,161,252,195,169,138,242,100, 86, 45,127, 91, 77, 10,133, 66,249, 15, 26, 46, 48,104,184,
- 65,155, 51,117,175,205,105, 20,119,140,106, 54, 75,147, 15, 64, 3,192, 5,149,211, 56, 84,119, 19,110,106,152,141, 7, 0,216,
-104,121, 82, 77,170, 73, 53,169, 38,213,188,199,154, 77,105,255, 19,219,126,213,215,203,112,243, 95,241,197,180, 71,198,221,101,
- 36, 45, 79,170, 73, 53,169, 38,213,164,154,255, 82,205,127, 37, 60, 90, 4,255, 40,164,180, 8, 40, 20, 10,133, 66,249,219,209,
-189,106,237,131,202,232,150, 79,245,134,123,218, 70, 75,230,222,209, 7, 2, 94, 23,134, 35, 33, 0, 64,120, 76, 60,236, 92,172,
-177, 48, 49,167,165,218,202, 86, 65,110, 4,226,221, 12, 44, 15,235,179, 19,138, 90,170,215, 41, 72, 61,201,203, 67, 53, 45,183,
-176,116,219,213, 27,250,125,206,236,171,209, 4,104,164,110,174,147,205, 86, 91, 39,177, 72,148,110, 45, 41,219, 92, 92,156, 84,
-222,140,108,184, 53,182,241,157,119, 8,115, 48,231, 34, 35,146, 91,121,238,106, 17,163,135,158,232,115,148, 92, 96, 73, 10,249,
-254,251,135,137,179,231,134,225, 97,176, 66,165,234, 33,145,202,123,201, 85,174, 29, 57, 2, 20,233,178, 82, 45, 54,251, 73,214,
- 98,136, 33, 28,126,187, 27,231,138, 66,161, 80, 40,148,127,129,209,186, 8, 96, 12, 42,171, 12,155,110, 12, 31, 16,118,255, 5,
-169, 84, 22, 8, 0, 28, 33,224, 8, 80, 81, 86, 18,147,155, 20, 61, 18, 0, 60,218,116, 63, 34,148,170,123,112,164,114, 59,203,
- 1,118,171, 41,165, 44,237,220,125,142,228, 72,225, 25,244,224,208,136, 97,147,198,142, 29, 19,220,185, 83,231,246, 0,112, 37,
-238,202,173,131, 7, 35,111, 28, 63,198,236,169,200, 79,248,177, 37, 71, 76, 32,125,191,103,207,110,247, 71, 71, 95,124, 15,192,
-139, 45, 45, 65,119,119,229,156,163, 63, 44, 28, 56,108,210, 74, 5,224,156,209,146,186,185, 78,158, 48,110, 84,183, 87, 94,154,
-197,123,102,225,135,129, 23, 78,253,182, 92,233, 19, 94, 66, 56,219,209, 10,221,148,223, 27,155, 56,185,174,127,108,200, 96,125,
- 83,116,152,183,230,171,190,174,198,162, 91, 83, 8,199, 78, 97, 24, 6,124,177,252,123,207,118,247,127,231, 50,120,126, 49, 0,
-135,123,140,169,125,194, 34,180, 62,126,123,166, 60, 53, 79, 42,215,120, 9,192, 23, 1, 96,144,157,122, 29,199,119, 45,117,125,
-249,221, 45,221, 79,197,166,217,127,249, 97,189,137, 17, 9, 39, 25,114,174,209,177, 84, 40, 20, 10,133,242, 95, 38,178,202, 92,
- 69,214,221,208,160,209,146, 74,101,129,103,127, 59,232,246,227,201, 12, 0, 64, 68,119,111,252,239,131,117, 35,182,175,141,190,
- 1, 0,125,135,142, 13,122,239,141,151,112,250,106, 30, 8, 33,232,214,193, 29, 15, 76,120,216, 49,227,225, 21,122,223,228,201,
- 15, 61,182,112,225,130,241, 55,111,222, 76,221,185,115,231,239, 0, 48, 96,224,192, 14, 31,126,248,225, 35, 43, 93,221, 36,223,
-126,255, 67,150, 73,119,253, 66,115,142, 86,218,170,157,111,112,199,182,211,190,253,114, 29,111,240,200,135,166,166,162, 98,169,
- 41, 59, 41,203,145,125, 61, 60, 60,230, 10,133, 66, 13, 0,112,220, 31,254,199,106, 37,222, 0, 96,103, 57,149,107,171,224,114,
-190, 72,202, 74, 36,162,107,229,122,253,182,178,172,235, 95, 52,166,105,182,217,194, 95,126,254, 73,222,165,164, 66, 4,134, 15,
-224,175, 89,250, 38, 56,214,230, 58,239,141, 15, 38, 71,159,251, 22, 21, 58,156,112,240,208,132,117, 19,124,125,251,240,223, 95,
-170, 28,206, 48,120, 34,160,239, 83, 19,223,219,250,189,176,103, 7, 53,204, 54, 14,135, 98, 10,251,110,248,248,253, 21,167, 54,
-140, 57, 0, 96, 19,128, 95, 0, 52,105,234,220,220,221,190,153,187,232, 99,101,133,229,143, 97,138,170, 76, 22, 62,223,182, 27,
-151, 51, 56,132, 4,135, 8,188,231, 46, 87,110,250, 96,230, 86, 67,229,220, 93, 20, 10,133, 66,161,252, 87,201,193,237,141,223,
- 55, 55,105,180, 0, 64, 41, 19,224, 70,114, 46, 0,192, 69, 6,204,121,110, 6, 10, 11,242,131, 44,118, 14, 79,205,152,142,139,
-241, 57,184,145,146, 15, 66, 8,130,252,228, 14,231,134, 15,174,231, 83, 79, 63, 53,232,200,209,163,231,223, 90,244,214,215, 12,
-131, 51, 0,176,105,243,231,125, 23,191,189,248,217,233, 51,166, 15,255,254,251,239,175, 2,104,150,209, 18, 48,170,117, 43,150,
- 45, 17,103, 22,152, 76,115, 23,190,206, 45,152, 63,119, 13,128,135, 28,114, 50, 66,161, 38, 51, 51, 83,201,227,221,222,124,237,
-163, 37,175, 71, 13,159,180, 50, 49, 53,189,228,210,145,253,251,239, 11, 11, 11, 67,102, 86,110,255,229,159,108,236,122,232,136,
-236,201,242, 50,227, 36, 67,193,245,122, 39,109,150, 8,133, 87,223, 93,190,161, 27,231,210,129,247,191,103, 71, 35,188,125, 43,
-100,229,149, 96,224,200,241,130,152, 11, 23, 70, 0, 14, 27,173,186, 3, 52, 78,182,112,121, 93, 63,220,118,110,216,196,126,173,
-122,242,120,124,232,141, 54,228,151,154,193,114,192,128, 80, 13, 70,109,255, 68, 80, 84, 97,123,240,131, 31, 50, 30, 60,179,118,
-172,206, 84,154, 61, 27,192,158,198,191,134,184,249,105,213,184,145, 81, 94,175,201,170, 48,217, 1, 0, 34, 62, 11, 6,196,157,
-222, 95, 20, 10,133, 66,249,143,211, 96,175, 67, 30, 0, 28, 60,120,176,222,246, 59, 44, 75,112, 35, 37, 7, 55, 82,114,112, 62,
- 62, 31, 86, 34,196,154,229,239, 98,213,210,183, 81,100,228,225,199,211, 25, 72, 72,201, 69, 66, 74, 46, 10,138,235, 29,233,253,
-182, 42,165,149, 75,101,221, 63,254, 88,189, 98,196, 64,197, 96, 55, 87, 87,215,196,171, 95, 87, 44,158,175, 11,125,247,229, 12,
-145,208, 34,201, 84, 40, 21,253,118,239,254, 46,204,203, 83,171, 80, 42, 85,175,202,125,187,110,209,104,186,104, 26,211,172,139,
- 76, 27, 50,126,252,152, 81, 67,189,189,189,184, 89,107, 98,226, 59,133,134,216, 58,118,232,216, 95,166,237, 56,190,145,221,106,
- 52, 57,142, 3,143,199,131, 78,167, 67,118,118, 54,146,147,147,145,144,144,128,140,140, 84, 29, 71,136,144, 5,199,243,241,241,
-131, 64, 32, 70, 96,155, 0,108, 88,179, 84,254,193, 59,255,235, 37, 85,136,247,213, 49, 66, 53,154,166,162,226,239,127, 58,124,
- 52,235,208,206, 13, 44, 0,228, 21,235,113,252,194, 77, 92,188,150,225,236,137,172, 59,132, 67,155,172,180,155,101,246,148, 72,
-254,123,111, 46,200, 56,121,242, 84,106,105,185, 5,229, 6, 43, 12, 38, 27,204, 22, 22, 54,150, 67,128,167, 20,123, 95,239,132,
-253,191,198,122, 49, 12,243,113, 83,229,105, 54,219,216,251, 67, 20,152, 58,164, 53, 66,252, 20,200,186,113, 6,115, 23,125,140,
-232,100, 51,138,139, 75, 96,171, 40, 0,167,207, 68, 65,202, 69,216, 89,150, 52,117,222,239, 18, 84,147,106, 82, 77,170, 73, 53,
-255,197,154, 13,121,145,127, 8,155,235, 89, 80, 99,180, 26,226, 86, 70, 17,110, 36,231,162, 71,136, 47,218,183,241,193,249,132,
- 98,124,115, 60, 3, 91,142,164,225,248,229,124,112, 2, 21,114,203,128,196, 84, 29, 18,211, 10,154, 28, 63,155, 47, 17, 78,121,
-249,229,210,133,157,195,202,250,252,118,104, 14,124, 61, 19,195, 94,123,173,100, 14, 95, 34,156,226,218, 90,181,243,245,133,243,
-166,169,228,114,177,197,108, 65,187,182, 1,210,151,102,207,121,146,113,149,236,116,244, 40, 85,190,161,174, 18,153,236,139, 15,
-222,121, 85,242,241,143,137,233, 21, 22, 84,236, 57,163, 75, 90,240,250,226, 34,129, 80,186, 65,229, 27,234,234,168,150,205,102,
-131,217,108,134,197, 98,129,213,106, 69, 86,198,245,241,191,252,248,202,200,182,173,221, 70, 74,164, 82, 16, 0,101, 70, 59,146,
-115, 12, 24, 50,108, 56,191, 71,247,238,225, 74,159,208,167,235,211, 42, 45, 77, 43,229, 8, 95,117,112,239, 14,254,119, 63, 95,
-194,215, 7, 47, 96,223,175,151,112,254,196, 33, 59,225,108, 53,243,127, 41,125, 58, 4, 41,125, 58,167, 41, 91,117,209,213, 44,
-190,157,162, 27, 45, 83, 62,143, 12, 25, 22,113,236,185, 23, 95,250,205, 80, 94,152,247,197,186,119,179,242,179, 83,175, 75, 68,
-140, 93, 46,225, 67,111,178, 99,235, 47,217,152,188,244, 50,174,165,235, 65, 8,105,114, 2,111, 14,152, 63,229,233, 87, 88,155,
-213,138, 96,127, 37,118,108, 94,134,241, 67,186, 98,104,103, 87,220,215, 94, 1,185,192,140,171,241, 55,176,107,199, 86, 59,199,
-241, 22,208, 31, 50, 20, 10,133, 66,161, 17,173,154,197,167,246,134, 6,171, 14, 77, 38, 99,202, 67, 83,166,195, 71,235,173,156,
- 48,248, 9, 81,204,173, 18,228,231,164,225,102, 66, 28, 12, 38, 27, 68,174,109, 1,169, 55,218, 4, 6, 32,246,198, 62,235,218,
- 21,145,122,206,110, 78,105, 72,111,252,120, 31,191,155,241, 12,111,197,114,255,179, 9, 55,138,123,236, 88,244, 21, 30,123, 76,
-233,177, 98,185,255,217,212, 36, 5, 79, 46, 37,253,158,156, 49,149,225, 49, 4,175,189,182, 16, 19,198,142,194, 83, 79, 62,206,
-108,219,182,181, 79,137,131, 71,201, 65,248,233, 27,111,190, 43,214,149,216, 45,231, 19,244,102,185, 66, 38, 59,149,168,175, 8,
- 15,244,151,141,158,244, 68,118,228,238, 47, 62, 6, 48,195, 17,173,106,131,101,179,217, 96,181, 90, 1,128, 5, 0, 30,175,114,
- 93, 88,110, 65, 94,137, 25,186, 18, 51,236, 44,135, 73, 83,102,200, 46, 68, 95,158, 1,160,129,246, 90, 28,103,179,219,176,231,
-231,139,200,186,240, 61,199,240,248,165,181, 26,195, 67,233,211, 33,200,219,219, 63,106,236,164,199, 61,197,210,202,106,216,242,
- 10, 51,182,109, 92,222,104, 62,121, 12, 67, 56,214, 94, 98,183,217, 42,218,181,109,151, 21, 18,214, 85,122,242,183, 35,227, 79,
- 29,219,163,183,183,123,220,229, 86,106, 14,248, 66, 9,248, 34, 41,204, 86,199,126, 44,232,110,158, 93, 15,128,121,250,133,133,
-107,230,189,242, 63,254,252,181,191,195, 98, 50,192,108,172, 64, 89,105, 49,100, 2, 27,174,158,222,111, 39,172,109, 94, 69,206,
-165,245,244,254,162, 80, 40, 20,202,127,156,186,211,239,212,164, 53,104,180,210,174,157,188, 15, 0,130,122,142, 40, 84, 74, 5,
-110, 2, 30, 3, 93,230, 45,108, 91, 57, 23, 28, 71, 48,250,217, 21, 80, 5,122, 67, 38,226,195,172, 47,212, 23,221, 58,209,104,
- 91, 29,134,177, 13, 95,191, 41, 43,240,133,231,219,169,119,236,208, 11, 1, 96,199, 14,189,240,249, 89,173,213,159,109, 74, 9,
-236,125,127, 15, 16,150,197,216, 9, 15, 97,202,163, 83,144,154,107,192, 15, 81,233,168, 48, 90, 28,234, 45, 39,243, 8,233,234,
-225,238, 57,234,229, 39, 70, 41, 4,124,134,233, 24,160,225,103,228,219,236,124,190,144, 61,112,161, 52,123,210,164, 71, 61,142,
-255,244,221, 80,214, 35,164,171,177, 32,254,114, 83,122,102,179, 25, 44,203,194,108, 54,195,102,179,193,205,163,237, 79,195, 31,
- 90,153,153,147, 91, 30,153, 91,108,234, 93, 97,179, 67, 87, 98, 70, 94,137, 25, 37, 21, 86,120,171, 92, 97,183, 89, 58, 55,164,
- 71, 8,249,122,226, 67,211, 31, 7,192, 99,120,246,175,244, 57,241, 9,149, 91,254, 48, 89,163, 38, 60,230, 25, 21,115, 11, 55,
-163, 15, 21, 19,206, 94, 57,138, 59,195,101, 54, 94,174, 32,124, 6,156, 72,192,216,248, 60, 30,103,181,234,109, 90,173,231,241,
- 19,199, 15,143, 51,217,147,192, 23, 73,106, 62,107,180,176, 14, 95, 49,186,155,103, 63, 5,128, 79,214,174, 89,213,111,248, 99,
-162, 19, 23, 83, 96,180, 1,125,187, 7, 97,239,183,159,155, 9,177,189, 82,145,115,233, 83,122,111, 81, 40, 20, 10,133,114,155,
-193,138, 68,101,227,248,219, 35, 90,213,117,163, 99,199,142,173,219,224, 26, 89,186, 34,184, 43, 5,240,108, 21,136,105,115, 87,
-225,235,143,231,131,101,109, 32, 4,176,179,142,141, 76, 64,136,240,231, 23,159, 15, 12,105, 19,200,247,156,246,152,220,248,205,
- 14,131,108,218, 99,114, 99,167,206,238,165, 47, 62, 31,152, 82,110,242,239,111,103, 89,156,186,154,135,184,148, 82,196,165,150,
- 65, 41,115,124,152, 47,190, 88,244,252,242,101, 75, 69, 2, 62,195, 92, 77,211,235, 51, 11,237,122,190, 80,104,149,203,196,196,
- 66, 4,230,212, 2, 82, 56,108,226,147,198, 3,219, 63,121, 26,192,236,134,116,170,123, 26, 86, 71,178,170,215,132, 16,194, 0,
- 28,199,176,108,102,129, 9,122,171, 13,186,226, 63,140, 22, 99,111,184,230, 84,233,211, 33, 72,173, 82, 30,230,243,249, 18, 66,
- 0,155,213,254, 8,124, 58,140,212,231,220, 76,168,109,178,206, 94,205,198,173, 75,199,116,172,213, 48,221,144,119,227, 23, 71,
-143,157, 97, 64,248,124,112,124, 30,195, 49, 12, 56, 33,143, 88, 64, 8, 87, 55, 71, 6, 39,140, 86,181,217, 18, 11,249,139,142,
-238,250, 88,251,212,152, 80,124, 27, 85,233,249, 76,229,249,101, 21, 89,212,100, 81, 40, 20, 10,229,238,210,152, 23,249, 7, 69,
-181,238,140,104, 53,118, 64,132, 0,137,105, 5,104,227,231, 9,191, 54,237,145,112, 61,246,143,109, 0,236,172, 99,213, 81,251,
-247,231,100,174, 90,165,230,230,207, 47,237,187,124,185,255,153,231,103,181,214,116,234,236, 94,250,234,171,233,125, 87,175,214,
-156,249,249,172,144, 37, 85,227,117, 85,143,205, 69,136, 51,237,226,120,189,186,134,181,229,191,187, 35, 49,253,151, 43,229,121,
- 34,145,200,230,237, 42,101, 84, 74, 49,159,207, 19,138,205, 54,158, 57, 40,188, 59,255, 0,143,233,222,152, 74,181,209,170, 91,
-117, 88,152,127,107,252,209, 31, 22,118, 26, 60,113,133, 91, 86,190, 17,165, 22,126, 77,213, 33,159,199,224,202,245, 52,128, 47,
-138,171, 79, 83,173,114, 59,178,243,155,175,253, 87, 47, 95, 2,171,157,197,139,243,223,194,147, 51,166, 31,129, 79,135,145,254,
-129,193, 49,191, 31,248, 74, 62,114,214, 6,164,221,136,206,181,155,203,118, 57, 99,178,106,204, 22, 64, 88,194,241,138,138,203,
-148,102, 59,164,168,199,247,153,173, 92,179,174, 28,189,209,142, 3,231,114,113,240,199, 93,208,168, 20,244, 73, 64,161, 80, 40,
-148,187,206, 63,212, 92,161,142,185, 2, 26,138,104, 53, 70,128,159, 23,206,197,165,160,115, 72, 91,104,212, 42,196,223,202, 4,
-159, 39, 4,143, 1,108,118,199,205, 16,177,218,190, 93,189, 90,131,180, 20, 5,239,179, 13, 41,129, 47, 62, 31,152,178,122,181,
-230, 12,177,218,190, 5, 48,157, 16,160,210,108, 85, 26, 46,214, 9, 95, 64, 56, 91,107, 47, 55, 57, 63, 58,169,162,144,199,227,
-155,221, 53, 82,206, 93, 35,225,185,171,196, 66,145,144,207,217, 9,207,234,167, 13, 52, 17,142,235,234,136, 94,237,170, 67,150,
-101,193, 48, 60,182,202,136, 41, 50, 10,141, 40, 53,241,161, 43, 49,163,184,220,138,142,190, 10, 28, 59,254,189,129,181, 25,119,
-212,167,197, 23,138, 52,237, 3,253,240,191,247, 87,195,104,102,145,152,165,135, 72, 34,241,246,242, 14,191, 60,253,133,215, 37,
- 47,109,190,133,167,135,186, 99,254,239,183,178, 12, 58,233,235,206,156, 89,150,101, 97, 52, 89, 68,186,130, 98,215,178,242, 10,
-181, 76, 42, 49,122,186,105, 10,234,251,172,201,201,136, 86, 53,114,169, 0,227,250,120,195,100,157, 10,163,217,142,211,191,236,
-161, 79, 4, 10,133, 66,161, 80,254,160,193, 9,164, 29, 50, 90, 74,185, 20,132, 47,197,239, 49,183, 16, 28,214, 5, 91,247,159,
- 71,135,206,125,144, 83,110, 7, 1,175,201,222,134,213, 44,124,195,120, 17,192,197,241,227,229,126, 15, 62,232, 59,156, 16,225,
-207, 27, 54,149,101, 2, 64,219, 78,149, 50, 28, 71, 64, 8, 64,184, 74,195,229, 48,140, 32, 45, 37,167,172, 77,160,183, 2,215,
- 50,173,102,133, 68,196,115, 85,136,249,158, 26,177, 72, 36, 16,128, 37,140, 57, 39,231,150,153, 1, 82, 29,145,171, 91,117, 40,
- 87,250,252, 52,108,226,138,252,212,244,210,232,142, 69,134,174,165, 86, 49, 8, 1, 58,250, 42, 16,119, 54,146,213,101,221, 76,
- 52,234,110,108,172, 79,139,227,192,183,218, 57, 92, 78, 42, 69, 73,133, 13, 37,122, 43,250, 15, 25, 39,234, 31, 49, 30,191,199,
- 21,128,179,219,176,252,243,200,114,150,216,166, 0,215,109, 78, 28, 52,239,220,197,171,126,249,197, 21, 18,161, 64, 80, 18,210,
- 33, 32, 89, 44, 18,218,203,202,202,196,183,127,138, 15,133, 76,140, 34,189, 13, 0,108,206, 94, 61,165, 21, 54,236, 63,155,139,
- 3,123,118, 66, 38,147,129,208, 27,138, 66,161, 80, 40,148,218,248,160,114,250,157,200,170,117,141,249,114,104, 82,105,150, 35,
-240,112,119,131, 84,161, 70,138,206,138,114, 70,139, 98, 3, 1,203, 86, 70,180, 26, 9, 60,213, 59,187,247,254,253, 57,153,251,
-246, 21,108,217,191, 63,167, 86, 67,239, 63, 34, 89, 53,107,142, 56,172,201, 16,246,216,254, 67,191,149,142,239,237,233,202,227,
-243,141, 34, 33,207, 44, 16,241,173, 34, 1,207, 38, 18,240, 44, 94,106, 33,255,183, 3,187,196,132,193,111, 77,105,154, 76, 38,
- 68, 68, 68, 96,244,232,209,152, 48, 97, 2, 30,126,248, 97, 4, 5,133,106,121,124,198, 66, 24,142,243, 20,151,163,189, 39, 3,
-129, 41, 3,191,236,250,200, 16,119,106,239,101,214,108, 26,135,219, 45,231, 31,154,132,112, 69,165,102,152,172, 44,138,245, 86,
- 20, 87, 88, 97,247,236,139,189,167,179, 97,180,176, 72,139,249,222,152,159,155, 57,215,156,119, 51,165,137, 83,241,218,237,255,
-146,204,103,158,154,145,175,146,242,110, 14,232,119, 95,190,135,187,155,157, 97,254,136,188, 50, 12, 3,169, 90, 11, 87, 23, 21,
- 82, 46, 30,194,209,229,195,140, 0,222,116,164, 60,107,163,150, 11, 48,190,183, 55,198, 77,154,138,206,125, 70, 58, 98,172,233,
-140,246, 84,147,106, 82, 77,170, 73, 53,255, 75, 84,207,113, 88,189,118,108,100,248,106, 3,212,206, 71,129, 14,190, 10,152,172,
- 90,152, 44, 44, 42, 76, 44,202, 12, 86,148, 25,108, 72,201, 53, 32,110,127,203,115, 88, 25,197,170, 28,241,147, 16, 0, 76,165,
-193,115, 52,122, 34,182, 90,222, 95,181,252,195, 71,118,117,239,102,121,105,140, 79,235,216, 20, 75, 54,195,240,140, 60,190,192,
-230,166, 18, 8,227,227, 99,243,207, 68,253, 52, 80,106,103, 31, 55, 52,162, 99,183,219, 75,125,125,125, 1,220, 62, 5, 79,104,
-123,217,132, 83,145,175,181, 29, 52,126,185,231,199, 75, 22, 26,120,124, 17,199, 8, 68,113,172,205,184,211,168,187,177, 1,141,
-216, 15,158, 72,122,253,220,165,107,125, 92,220, 90,227,102, 86, 5, 42, 76,118, 88,237, 28, 92,149, 34,100, 94, 57, 98, 77,137,
-143,254, 78,159, 29,187,181, 25,197,182, 35,225,122,156,223,168, 81, 35, 31,234,211,167, 47,127,241,226,183, 16, 28, 28, 12,163,
-209, 8, 30,143,135,214,109,218, 35, 37,225, 18,206, 70,190,207, 26, 10, 83, 55, 2,120, 15, 64,190,179, 95, 82, 80,102,193,161,
-232, 60, 68,254,248, 45,248, 66, 49,189,157, 40, 20, 10,133, 66,185,147,153,117,214,155, 29, 50, 90, 38,147, 41,229,254,136,113,
-224, 56, 2,150, 0, 28, 91, 21,121,226,254,136, 62,177, 54, 83, 74, 75,115,199,113,236,249, 79, 55,111, 25,221,189,215, 32,126,
-152,191, 18,101,133,185, 56,123,234, 87, 59, 56,114,198,145,253, 11, 11, 19,245, 50,175, 14, 15, 61, 50,249,193,221, 51,158,154,
- 85, 50,112,200, 16,133, 86,235,109,206,204,202, 52,124,185,253, 27,219,145,159,246, 13,228, 96,127,180,176,240,166,190, 49,157,
-210,210,210, 79,234, 75,151,136,149,253, 1,180,229, 11, 24,139, 49, 63,209,169, 22,225, 5, 89, 25,147, 62,124,255,157,212,199,
-158,157, 39,110,231,219, 30,121,165,124,164,100,230, 34, 62,106,159, 57, 43,225,194,143,101,153, 23,159,118, 80, 42,167,158,180,
- 76, 0, 31,159, 61,123, 38,124,212,168, 81, 35,135, 14, 29, 74,102,206,156, 9, 66,128, 95, 54, 63, 79,138, 82,206,126,143,202,
- 40, 86, 82, 51,207, 75, 90,212,153, 75,110, 15, 15,236, 41,112, 87, 61,141, 45,223,254,100, 3,225,210,232,253, 68,161, 80, 40,
- 20, 74, 13,205,111,163,149,113,189,114, 60,173, 63,155,242,220,188,233, 91,183,126,253,193,215,219,119,245, 55, 89, 44,190, 4,
-162, 12,214,110, 57,161,103,177,216, 81, 13,163,238,102,180,187,123,199, 78, 95,126,254,233,155, 95,110,249,108, 16, 56, 54,132,
- 1, 82, 9,131,223,164, 54,118, 70, 83, 38,171, 81,179, 84, 80,190,105,248, 67, 43,141,133,133,250,175,157,221,215, 88,120, 35,
-151,199,183,182,222,180,230,253, 21, 60, 30,127, 4,203,114, 66,142,181,221,100,173,166,143,140,249, 55,246,195,225, 86,110, 40,
-106,100,219, 85, 0, 87,143, 31, 63, 62,224,248,241,227,189, 0,124,130,202, 57, 20,163, 91,114, 94,204,133,229,195, 94, 89,248,
-202, 47, 11,192, 4,112, 28,129,157,229,210, 68, 70,195, 48,122, 79, 81, 40, 20, 10,133, 82,195, 76,220, 57,104,169, 99, 17,173,
-191,138,226,226,164,114, 20,227,165,150,234, 20, 22, 38,234, 1,220,209,115,207,208, 66,221,184,196,178, 31,144, 88,246, 67,115,
-247,175,200, 75,206, 7,146,103,180, 48, 27,142, 52,100,255,189,106,185, 43, 20, 20, 92,175, 64, 1,122,211,123,136, 66,161, 80,
- 40, 20,167, 13,151, 99,141,225, 41, 20, 10,133, 66,161, 80, 40, 77,154,172,218,107, 0,149,109,207, 27,234, 57,224,204,204,220,
-205,233,125,112,140,106,182, 88, 83, 8, 64, 12, 64, 9,160,169, 42,205,145,168,154,175,145,150, 39,213,164,154, 84,147,106, 82,
-205,123,168,217,148,246, 49, 80,254, 84, 3, 70, 53,169, 38,213,164,154, 84,147,106, 82,205,255,158,230, 63,153,153,245, 44, 0,
-254, 70,109,180, 40, 20, 10,133, 66,249,171,112,119,239,168, 4,106,218,245, 54,137,220, 35,212, 11, 0, 12, 5,215,117,180,244,
- 40,245, 80,123,158,195,187,210, 70, 75,200, 19,136, 95,145,171,220,175, 43, 52,238, 89,255,241,194,101,130,218, 40,230, 12, 31,
- 24,184, 55,184,173,108,130, 51, 59,202, 61,131,190,242,110,223, 59, 93,161, 13,154, 3,159,238,178,150,100, 66,161,109,235,169,
-108,221,243,148,202, 55,252,129, 63,225, 24, 37, 97, 97, 97,125,195,194,194,250, 2,144,220, 13, 65,185, 54,104,170, 95,135, 62,
- 81,218,118,221,126, 85,120,117,156,124,183, 51,172,244,233,224,174,108,221,227, 7,101,171, 46,197, 74,159, 46,101, 74,191, 30,
- 39, 84, 30,161,237,154,218,175,245,248, 15, 67,222,221, 25,183,179,245,248, 15, 67,234,219,238, 58,106,173,234,237, 93,137, 75,
-220,199,125,164,164,207,149,230,209,186,255, 84, 23,159, 65, 11,220,157,221,207, 55,168,207,213, 54,225, 3,242, 90,117,236, 29,
-231,232, 62,126,193,125, 47, 6,132,245,215,249, 5,245,141,166, 37,239, 24, 82,207,182,125,165,174,254,145, 18, 87,255,159, 36,
-110,109,135,180, 84,207,199,199, 71, 22, 18, 18, 50,170, 79,159, 62,207, 13, 27, 54,236,229,110,221,186,205, 12, 8, 8, 24,113,
- 47,127,232,203,181, 65,111,152,133, 76,129, 89,200, 20,200,181, 65,111, 52,253,124, 13,254,128,225,177,217, 12,143,205, 86,104,
-131, 63,248,187,156, 43,137, 87, 80,128, 92, 27,180, 90,229, 29,118, 94,166,237, 56,206,217,253, 93, 93, 93, 71,120,122,122, 78,
-172, 94, 92, 93, 93, 71,208, 59,160,217,212,142, 98,181, 56,162,197, 23, 74,228, 39, 31,123,234,197, 78,203,222,121, 93,186,102,
-203, 94,172, 89,178,240,154,185,162, 36,236,239,120,228, 30,109,123, 69,243,121,124,191,218,105, 44,199,102, 22, 36,159,239,121,
- 55,244,131,219,200,158,126,243,213,233,243,167, 62, 18, 17, 16, 49,118, 46,115, 35,217,184,207,113,139,134,174,223,253,240, 99,
-235,168,223,126, 93,187,101,203,230,247,242,237,193,171,133, 18,193,167,101, 25, 87, 75,156,201,131,218,179, 93, 91,129,194, 35,
-234,254, 9, 47,122,199, 28,251,102, 43,107,225,134, 27, 10,106,205,254,221,124, 60,219,183,111,127, 31,159,207,119,159, 51,103,
-142, 8, 0, 62,254,248,227, 14, 44,203, 22,222,186,117,235, 2,154, 49,248,105,165,193, 12,158,254,201,138,119,191,126,224,129,
-209,200, 46,168,192,242,213,235, 7, 31, 62,248,221,195, 21,186,196,239,239,198, 57,113,113, 9, 84, 67,164,186, 50,247,213,247,
-180,163, 6,223,199,215,155,236, 56, 28,117,105,192, 55,235,223, 59, 15,132,246, 42, 47,184,222,224,152, 98,156,161,116,145,151,
-146,140,226, 12,165, 0, 48,245,142,151,189,210, 22,225, 41, 99, 71,249, 72, 4,151, 10,129, 38, 39,125,116,105,211,255,136, 80,
- 34, 9,224,241,120,224, 49, 0,143,199,128,207, 48,149,243,132, 90,141,105, 89,241,191,143,252, 59,220, 39, 42,255, 94,185,224,
- 11,220,121,204, 31,249, 99,120, 85,107, 66,202,114, 19, 79,186,223,133,175,209,116,234,224, 18,222,191, 67,197,151, 39,146,139,
- 20,130,129, 47, 71, 50,132,247, 89,250,239,171, 47, 59,100, 0,164, 82,215, 3, 7, 14,120,142, 26, 53, 74,163, 13,159,112,194,
-145,125,196,124,125,216,193,131,251, 69,163, 70,141,116,226,250, 12, 26, 14, 30,111, 59, 3, 8, 57,142,124,204,231,200,119,250,
-194,132, 91,128,115,179, 79,201,180,193, 79,243, 64, 28,126,206,112, 96,162,141,121, 55,182, 52,183,112, 5, 18,245, 48,161, 72,
-244,114,219,160,206,221,179, 82,111, 70, 87,232,203, 87,219,205,165, 39,156, 22,178,217, 95, 57,246,123,204, 3, 2,161,144, 25,
- 53,172, 55,223, 12,252,218,146,147,238,229,229, 53,113,221,186,117,237,250,246,237, 11, 0,176,219,237,234,221,187,119,123,191,
-255,254,251,138,132,132,132,230, 78,156,234,235,233,233,233, 47, 22,139,125, 1,192, 98,177,100,229,231,231,167, 3,104,242,135,
-191,194,171,157, 7, 8,222,251, 61, 42, 74, 0, 0, 3, 6, 12,252,192,255,254,217,174,124,145,210, 88,111,113, 88,202, 21, 37,
-183,126,157,119,246,220, 25, 6, 0,250,244,238,251,186,220, 35,244,211,123, 25,217,146,106,131,123,243,128,249,125, 6, 68, 76,
-154,242,232,116, 94,120, 71,127,140, 24, 62,244, 53, 35,112,192,169,107, 70, 32,144,157, 63,127,190, 61,143,199,227,219,237,118,
- 83,159, 62,125,210, 91,146,175, 86, 65,125, 79, 51,224,181,182,218, 45,159,231, 39, 69,127, 0,220, 49,113, 12, 95,211,186,251,
-155,224, 11,158,229, 56, 46,163, 60, 61,186,223,191, 48,162,117,103, 57, 59,171,196, 19,136, 95,158,250,228, 11,157,230, 45,248,
-159,116,238,154,227,136, 92,255,122,193,223,213,100, 1, 0,159,199,247, 59,114,244,136, 86, 46,230, 3, 0,244, 38, 59, 30, 24,
- 53,170,233, 55, 66,155, 94,191,241, 24, 38,184,122, 66, 27,214,110,149, 10,132, 98, 19, 83,105,144,192, 0,240,104,213,230,184,
-151,253,164,124,234, 35, 17, 1,219,119,253,156,153,158, 89,232,244, 67,141,225,139,208,103,224, 8, 68, 12, 31,169, 57,127,238,
-244,123,155, 55,110,120,195,110,181,109,224,108,220,106, 83,209,205,236, 38, 31,230,222, 29,123,136,149, 30,135, 39, 61,247,190,
-187,137,231,134,197, 75, 62,241,136, 58,180,227, 68, 86, 70, 87, 46, 45, 45,195, 68, 24,230, 90,113, 81,206,203, 21,185,183,110,
- 56, 90,100, 74,165,178,157, 82,169,236,218,165, 75, 23,233,194,133, 11,133,131, 7, 15,254,195,178,207,156, 41,250,237,183,223,
-124, 86,174, 92, 57, 58, 54, 54,214,164,215,235, 47,235,245,250, 36, 56,209,208,222,219,219,115,246, 67, 15,142,195,208, 73, 47,
-130,229, 24,204,124, 97, 30,142, 28,218, 51, 11,192, 93, 49, 90, 54,185,250,253,103,159, 91,232,217,231,190,110,252,247,118,220,
-128, 76, 44,192,200,158,193,204,147,115, 22,185,108, 89,251,222, 23, 40,192,160,250, 34, 89,156,161,116, 81, 39, 15,203,163,227,
-251,182,197,254,157,150, 71, 49,236, 85,240,228,154, 15, 50,246,255, 47, 30, 0,218,141,154,163,146,176,249,235, 90,185,240,181,
- 18, 54,127, 93,187, 81,115,142, 37, 29, 94, 87,222, 88, 94,132, 18, 73,192,206, 29, 59, 58,186,170, 68, 16,240, 24,240,249, 12,
- 4,124, 30, 76, 22, 22, 15, 63,242,232, 93,187,204,101,218,142,163,121,192,147,149, 47,108,124,101,204, 75,252,201,153,115,194,
-240, 69,238, 7,247,255, 40,208,106, 36,224,243, 25,240,121, 0,159,199, 32, 85,103,196,211, 79, 63,169,105,169, 97,127,160,191,
-246,190, 87,166, 4,143,236,211,201,173,203,183,103, 24, 77,159, 7,166,184, 23,152,228, 79,236,218,247,235,163,100,192,188,115,
-132,112, 43, 50, 79,126,114,180, 49, 17,179,217,172, 27, 57,234, 1, 53, 35, 80,200,143,237,221, 58, 80,192, 99, 96, 99, 9,236,
- 44, 1, 91, 53, 55, 42, 83,245, 11,134,199, 99, 64, 56,130,103,159,125, 26, 35, 71, 61, 96,224,236, 92,166,227, 15, 57,222,246,
-195,199, 78,121,154,109, 28, 86,174,219,242, 94, 69,105,254,123,201,241,238,169,250,210,130,121,198,188, 68,135,231,193,224,129,
-244,204, 72,138,123,110,199,193,179,232, 20, 22, 10,150,171,204,103,176,159, 2, 59, 34,207, 34, 36, 56,164, 50,223, 28,249, 63,
-123,103, 29, 29,197,245,183,241,103,214, 53,238, 9,193, 3,193, 18,220,221,139,107,209, 66,113, 90, 74,141, 34, 45, 45, 80,180,
- 20,167, 64, 11,148, 82,160,184, 7, 11, 14,165,104,128,144, 0, 73,136, 19,223,216,186,239,220,247,143, 77, 40, 18,217, 0,125,
-251,107,123, 63,231,236,217,204,100,247,217, 59,115,103,238, 60,247,123, 13,181, 3,229,104,214,180, 25, 0,188,150,209,226,137,
-156,190,233,208,123,244,130, 62, 67,199,193,219,203, 11, 28, 98,233,115,238,196,111,125,126,217,248,253, 23, 86,131,106, 69,133,
-196,136,237,217,115,129,176,236, 27, 71,157,252,253,253,189,154, 53,251,115, 58, 70,171,213,138,106,213,170, 33, 61, 61, 61,248,
-117,234,105,126,126,126,189,231,205,155,231,221,171, 87, 47,190,175,175, 47, 0, 32, 43, 43, 43,224,244,233,211,141,231,205,155,
-151,147,153,153,121, 2,101,204,232, 99,179,112, 4, 28, 30,184, 98,177,212,126,140, 96, 56, 51,166,189, 23,234,227,231,111, 44,
-233,243, 10, 69,150,112,230,135, 23, 25, 30, 79, 80,244,121,112, 8, 97,153, 50,162, 68, 93,249,124,126,137, 45, 20,102,174,115,
- 75,194,119,153,192,225,114,236, 23,171,213,162, 40, 72,189, 91,183, 2,145,184,250,124,161, 96,211,224, 97,227, 90, 15, 25,212,
- 31,126, 94, 46, 56,247,123, 36,166, 76,251,204, 98, 53, 91, 86,189, 86,225,193,229,242,114,114,114,146,221,220,220,124,223,252,
-121,203, 84, 63,123,230,148,247,185,243, 23,102,175, 92,179,110,170,217,100,181,176,132, 60, 91,199, 88, 34, 17,241,187,245,121,
-215,217,187,102, 75,241,186,121, 19,248,255,194,136,214,230,183, 98,180,132, 18,167,119,191,158,249,145,120,225,174, 27, 56,177,
- 97, 74,174, 78,149,235,245,172,166,224,236,122, 87,171, 42,108,252, 58, 41,148,123,213,110,197,112,121,147, 25, 46, 87,198,112,
- 24, 33,107, 99,159, 90, 77,166, 69,250,188,184,204, 55, 61,122,150, 37, 56,248, 71, 78,197, 12, 16, 65,208,206,189,135,189,125,
- 92, 69, 48,152,109, 24, 54, 98, 52,118,236,216,225,228,229, 34,132,193,100,197,247, 43, 87,170, 53,201, 39,188,147,159, 22,164,
-119,237,251, 89,120, 66, 82, 78, 84,106,166, 97, 95, 69,211,102, 52,219,160,210, 89,161, 51,114, 80,171,126, 51,124,191,170,142,
- 56, 53, 37,241,179,237,191,108,157,254,240, 33,119, 7,203,229, 44, 48,100, 62,122, 90,226, 77,231,219,160,135,179,155,199,238,
-129,147, 23,187,198,229,240, 64, 96, 70,188,179, 24,239,142,157,238, 92,195, 87, 2,153,152,235,154,152,146,238, 55,227,139, 47,
-126, 79,176,145,230, 42, 69, 66, 98,121,233,169, 90,181,234,160, 62,125,250, 72, 63,255,252,115,126, 96, 96, 32,126,249,109,127,
-149,118, 61,134,246,205,200,204, 14, 36,132,192,199,219,251,233,196,247,135, 30, 63,121,242,100,202,211,167, 79,249,203,151, 47,
-111,113,248,240,225,122, 89, 89, 89, 14,215, 76,109,132,192, 96,180,193, 86,244,128, 84, 40,141, 21,246,167, 1, 1, 1,162,244,
-244,116,227,115, 81, 6,230,207, 64, 33,211,163, 75,135, 22,188,159, 78, 37, 65, 99,176, 65, 38,230, 35, 41, 91,135,166,141, 66,
-152, 45, 54,107,195,146, 4,199,191,219,123,174,143,156,244,236,215,170, 58,188,221,164,216,246,195, 98, 28,187,158,216, 51, 91,
-195, 96, 61,225, 78,246, 19,241,186,201,216,204,245, 29,155,214,244,237,220,164, 10,110, 55,173,233,123, 37, 34, 38, 86, 50,116,
-229, 71,233, 26,254,185,130,211,211,213, 37, 23, 60, 28,184, 59, 9,240,243,153, 20, 72,197, 60,200,196, 60,200, 68,246,119, 14,
-135,121,179, 90,173, 95,221, 64, 46,107, 27,207,229,242,198, 15,127,119,168,255,200,225, 67, 9,184, 28,236, 63,120,188,255,174,
- 93, 59, 51, 45,102,211, 86, 27,135,251,115,105,215,207, 11, 39,148, 3,120,187, 8,241,197,214, 40, 56, 75,248,112,146,242,225,
- 44,229,163,115,168, 23,184,175, 63, 9,140,219,148,254, 53,122, 77, 25, 88,181, 83,112,101,121,173,251,241,202,135,227, 23,221,
- 89,115,169,176,211, 39, 63,172,174,231,161, 41, 52,241,190,153, 49,145,151,150,145,209,105,255,241,203,157,109,166,113, 49, 86,
-179,246, 75, 69,228,254, 18,163,194,105, 49,215, 27, 7,180, 28, 34, 54,107, 44, 15,238,199,164,213, 44, 48,138, 16,157,172,130,
- 76,204,131,188,248,220,138,121,144,137,249,144,139,121,200, 72, 75, 66,190,150,251,123,186, 7,167, 19, 46, 95,183, 86, 36,225,
- 6,179, 13,247, 18, 53,168, 26,220, 8,126,126,254, 48,245, 26, 85,245,230,133,131, 71,111, 93, 62,178, 84,151,245,248, 75, 71,
-117,126, 11,187,129,217,159, 78,142, 96,128,187, 69, 15,233,198,223, 44,219,208,228,219,217, 31,190,176,111,198,130,117, 77, 94,
- 63,146,229, 52,183,243,192, 15, 22,180,235, 54, 16,234,252,108,252, 17,190, 15, 61,250, 12,198,168,113, 31,195,213,213,243,251,
- 85,139,102,222,183, 26, 85, 23, 94, 41,115,125,235,180, 13,105, 80,119, 87,128,191,127, 32,203,218, 87,249, 32, 4,208,168,149,
-152,249,201, 68,176,132,160, 97,227,230,157,197,237,186, 17, 82,180, 26, 72,110, 94,174, 54,230,241,195,174,134,156,152,155, 14,
-159, 75,131,193,162, 80, 40,112,239,222, 61,196,198,198, 34, 58, 58, 26,121,121,121,112,113,113,209,104,181,218, 10, 5,239, 67,
- 67, 67, 71, 94,184,112, 65,236,230,230,246,108,167,201,100,130,147,147, 19, 70,142, 28,201,239,222,189,123, 64,239,222,189,199,
- 68, 69, 69,253, 6, 64, 85, 98,122,242,159,100, 56,249, 4,255,216,161, 99,135,169, 0, 32,113,246, 75, 92,255,203,241,232, 50,
- 43,180, 46,254, 85, 90,183,110, 83, 19,132,128, 1, 89,171,203,139,205, 42, 35, 74, 36,187,113,227, 70, 13, 46,151,203,251,243,
- 25,196, 98,227,182,189,117,206, 94,125, 48,104,217,247, 43,196,206, 50, 17, 20, 74, 19, 38,140, 26,232,240, 51, 88,226, 19,220,
-171,117,235,246, 71,191, 93,240, 53, 79, 46,147, 33,252,102, 2, 62,250,228, 11, 67,102,114,212, 10,194,242, 55,232, 20,177, 57,
-111,248,168, 36,120, 11,212,170, 36,135, 83,191, 30,226, 41,239,245, 19,155, 44, 54, 20,106, 45, 48,154,109,176,177, 4, 74,173,
- 5, 15, 83,213,240,116,174,248, 82,110,132,144,102, 0,188, 0, 40, 24,134,185,253,252,118,113,133,174,216, 27,191,180,157, 91,
-244,124,240, 0, 96,130,125,164,254,179,203,167,104,187,180,253,197,223,127, 8,160,110,145,166, 13,192, 45,134, 97, 10, 74, 49,
- 91,175, 68,185,120, 97, 97, 97,164, 79,159, 62,207, 74,252,151,183, 95, 70, 36,224,251,203, 92,188, 64,200, 35, 60,191,128,177,
-183,111, 64,222,138, 85,107,220,167,125, 48, 57, 69, 85,152, 95,165,104,247, 57, 71, 30, 22, 60,134,187,170, 67,155,150,221,167,
-126,240, 1,130,107, 84, 18,216,108, 54, 18, 21,155,104,217,254,243,182,177, 87,174, 11,215,168,210,162,230, 62, 23,130,172,208,
-176, 79, 27,107, 75,123, 57,130,101, 99,109, 47,215,110, 95,209,100, 24,192, 85, 46,196,143,167,146, 64, 8,192,128,192, 69,198,
-199,158, 75,105, 72,140, 56,164,234,211, 80,165, 29,185,108,126,231, 78,189,166, 95,120, 24,111,216,151,147, 99, 56, 3, 32,171,
- 44,205,146, 11,116, 22, 70,179, 13, 22,171, 21, 7,142, 31, 71,207,206, 45,208,186,117, 11,180,111,215,154,119, 39, 34,114,220,
- 7, 83, 39, 6,226,207,209, 29,207, 52,197, 62, 65,205,228, 46,158,251, 6, 77, 93,238,244, 32,205, 10, 30, 23,168,238, 43,129,
-187,147, 0, 38, 43,131,100,133,185,232,206,113,197, 71, 51,218, 68,194,144, 0, 0, 32, 0, 73, 68, 65, 84, 22,184,207,254,108,
-234, 73,149, 66,216, 0,120,100, 46,235,216,117, 58,157,112,244,232,209,124,139,197, 98, 30, 57,225,227,238, 89, 89,138,254, 27,
-215,126, 39,242,246,246,129,206, 96, 69, 68,244,147,186,223,126,187,160,250,241,211,151,142,204,255, 98,202,209,158, 61,123,186,
-236,221,187,151, 45,239,124,190, 80, 67,204,206,253, 97,219,174, 3, 59, 86,175, 88,130,152,148, 2,252,252,211, 6, 16,155,245,
-199,114, 78,213,243,154,100,244,232,209,146, 35, 71,142, 84, 74, 75, 75, 83,233,116, 58,197, 11,241, 8, 14,195,203,206,215,193,
-211, 73, 8, 1,143, 3, 31, 55, 49,188, 93, 68,224,115, 1, 14,195,216, 74,210,252,121,223,137, 69,172, 78,137, 99,187, 77,195,
-183,253,176, 24,227,166,125,133,168, 92,225,105,142,212,101,209,135,195, 7,205,246,146,216,122,250,187,114,188, 59, 55,169, 10,
-153, 88,128, 57,211, 71,163,121, 68,178,119,122, 33,251,149, 66,207,109,180,224,244,179,197,186,207,189, 24, 28,177, 71,176,156,
-164,124,156,222,245,125,142, 86,169, 80, 22, 55,201,153,140,134, 20, 7, 47,227,115, 37,212,108,103, 55, 10,169,191,120,234,164,
-241,156, 54,173,154, 19, 14,135,143, 92,181,137, 33, 4,248,228,163, 41,248,112,202, 68,223,167, 25, 57,223,108,216,240,227,220,
- 11,103,201, 66,173,226,241,252,178, 52, 57,140, 61, 10, 36, 23,243, 32,151,216,141,139, 92,204,131,193,100, 3,195,128,235, 90,
-185,177,146,177, 71,114, 51,242, 83, 74,173,129,191,160,233, 94,185,254,249,179,137, 78,117, 10,246, 21, 92, 79,202,136, 94, 20,
- 17,153,125, 11, 64,126, 96,123,215, 49,102, 43,129,198, 96, 69, 82,182, 14, 86, 51, 97,198,189, 83, 5,213,134, 48,193, 75,182,
-221,221,113, 42, 18,206,207, 21,250, 47,104,166,223, 56, 96,240,104, 48,112,216,234,117, 63,221, 94,177,248, 43,110,174,210, 4,
-150, 16,136,133, 92, 72,132,188,162, 23, 23,122,173, 18, 27, 54,109,201,178,130, 25,132,203,151,173, 21,185, 62,193,146, 81, 3,
-123,181,223,195, 0, 66,134, 35, 72,243,175, 82,181, 74,151,190, 99,197, 93,250,141,134,205,106,154, 29,113,149, 92,212,229,196,
-156,119, 68,179, 65,189,186, 96,128,187,218,156,216, 41, 0, 32,243,174,253, 99,157,224, 58, 77, 94,222, 23, 20, 20,220,196,145,
-124,127, 22, 41, 21, 59, 77,115,115,247,250, 42,184,126, 35,239,236, 2, 35,227,228, 81, 9, 73,113,247,176,123,211, 55, 59, 89,
-131,105,193,249, 19,251, 22,175,249,249,240,187, 93,122, 14,196,182,141,223,205,201,203,124,102,180,206, 61, 23,173, 26,181,125,
-235,230, 64,190, 80, 4,139,149,133,197, 70,236,239, 86, 27,242,243, 11, 96,177,178, 16, 75,157, 96,101, 25, 88,108, 44, 44, 86,
- 22, 70,147, 85, 54,101,116,239, 15, 12,192,205,146,210, 25, 80,167,195, 25,129, 72, 84,133,192,190,118, 45, 33, 4, 73, 89,122,
-142,159,159,223,111, 0, 32, 18,137, 32, 18,137,192,178, 44, 34, 98, 20,211, 60,131,107, 79, 69,145,193,179,153, 77, 41,133,201,
-215,122,148,118,236,190,190,190,125, 95, 54, 89, 6,131, 1, 26,141, 6, 87,175,223,118,217,186,227, 64,207,164,148,180, 26, 44,
-113, 49, 58,121,215,232,161,206, 73,232, 91,218,249, 84,103,199,124,224,220,114, 34,231,243, 15,199, 4,173,219, 30,118,235,201,
-153, 69,101,246,211,170,214,101,150,233,243,201,131,155, 46, 91,251,115, 92,193,181, 31, 63, 45, 47,143,120, 60, 30, 95,161, 80,
- 60,187,191,215,111,217,221,244,110, 76,250,128, 53,171,215,136, 35, 18,212,120,144,148,129, 49, 93, 43,219,107, 56, 14,228,187,
-204,167,134,103,245,154, 53,127,219,176,118, 25, 47, 46,195,128, 31, 14,221,194,133,163, 63, 94,205,202,185,217, 19,217,153,250,
-215, 41, 67,222,130,209, 42, 85,243, 98,100, 46, 52, 6, 43,140, 38, 43, 44, 44,129, 74,103, 65, 78,161, 9, 42,157, 25, 26,189,
- 21, 99,186, 85, 46,241,123,229,248, 17, 47,134, 97,194, 8, 33,125, 8, 33, 93, 1, 8,139,183,237,207,108, 38,172,200,144,189,
-176, 61,123,246,236, 47,151, 46, 93, 26, 93,252,217,226,253,197,159, 45,107,255,115,223,247,152, 51,103, 78,131,101,203,150, 45,
-105,213,170,213,158, 63,254,248, 35, 17, 64,129,163,205,135,188,231, 15, 38, 44, 44,172,188, 19, 93,195,108, 49,139,156, 37,124,
- 84,175, 86, 25,239,127,185,205,243,215,101,227,115,196, 66, 30,247,212,169, 83,238,121, 38, 57, 56, 28,174,195, 85, 20,185, 87,
-173,214, 2,129,240,196,202,149, 43, 49,188,111, 59, 73,106,174, 69, 19,153,170,207,214,154, 96,245,246,170, 45, 92,180,100,153,
-124,217,242,239, 63, 12, 59,198, 22,106,178, 31,126, 95,114, 19, 95,211, 59, 92,230,185, 62, 88, 12, 3,194,218,210, 10,146,111,
- 55, 5,128, 55,233,139,165, 49, 88,192, 45,234, 91,195, 48,128,206, 96, 5,151,203,228, 20,198,236,123, 56,114,225,162,206, 59,
-247,156,205, 32, 28, 87,181, 86,155, 36,133,125,205,193, 10, 99, 48,217, 96,180,216, 16,125, 63, 2,237, 91,214, 67,235,166,117,
-160, 51,216,160, 51, 90, 81,173,102, 48, 0,120,150,152,113, 92, 78, 34,177, 89, 12,132,216,156,250, 52,243,130,183,171, 16,126,
-110, 34,136,132, 60, 88,172,128,222,196,194, 96,178, 33, 57, 71, 15,181, 94,130,144, 14, 67,171,123,248,221, 49,102, 37, 75,142,
-228,167,222, 25, 84,166, 57,181,217,176,253,183, 3, 65, 25, 25,217,253, 79, 30,217, 37, 82,168, 44,136, 76,214, 34,167,208, 8,
-112,189, 48,111,201, 15,162, 89,159, 78, 26,176,125,247,193,148, 46,237, 90,164, 84,244,152,117,138,152,157,251,246, 31,248,177,
- 79,159, 1,146,232,155, 39, 17,119,239,252, 98,109, 78,133,250,103,113, 26, 54,108,104,157, 52,105,146,122,201,146, 37,129,199,
-142, 29,171,166, 80, 40,238, 1,176,184,186,186,214,169, 29, 84,229,126,248,233, 83, 1,189, 7, 12,229,167,229,234,225, 34, 21,
-160,138,183, 20,215,175,158,177, 8,133,252, 18,251,155, 20, 53, 15,142, 64,151,153, 56,118, 61,177,103,116,158,248,210,196,241,
- 99, 82,194,175,196,228,173,223, 17,254, 93,128,220,114, 79,204, 42,214,223,105, 90,211,119,246, 71,163,177,116,221, 78, 92,142,
-136,201,209,114,252, 22,103, 26,173,103, 75, 15,165, 3, 60, 46, 3, 39, 9, 31, 90,149, 66, 25,127,247,116,237,183, 20,166, 30,
- 19,126,100, 39, 39, 95,109,193,211, 92, 3,147,145,175,134,141, 37,112,149, 10, 96,101, 9, 10,243,115,153, 93, 59,119,224,246,
-237,235, 28,112, 57, 19, 0,204, 47,243,132, 50,246,166, 66,185,152,111,143, 8, 73,236,239, 22, 27,139,224,160,154,216,188,126,
-149,179,167,183, 15,218,182,119,188,111,180,147, 71,149,134,123,126, 89,143, 75,127,220,237,120,121,205, 15,205,228,254, 94,235,
- 24,198,182, 2, 4, 6,163,217, 6,101, 97, 1,132,166,167,104, 30,160,128,187,212,134,100,149, 31,162,178,226,228,229, 21,248,
-121, 81,135,239, 49,100,192,220, 3,199, 47, 44,237,209,173, 35,162,146, 85,144, 8,121, 16, 11,185, 16, 11,185,224, 51, 54,172,
-218,244,163,165, 64,169,238,147, 23,125, 52,247, 53,174,207,115, 69,181, 95,187,185,179,105,188,118,174,155,251,235,196,153,203,
-123,244, 28, 56,150,137,186,125,241, 75, 29,112,222,177,138, 30,113,104, 31,203, 58,254,140, 19, 59,121,174,157, 62,107,209,244,
-238,125,134,130,203,229,193, 98,177,224,224,222,157,248,229,135,121,143, 77,154,188,177, 0, 88, 83, 14,119,210,190,157,155,134,
-206,252,102, 21,211,160, 97,243, 22, 23, 51, 95, 93,142,150,229, 50, 63,189, 55,126,242, 48, 31, 31, 31,167, 63, 35, 90, 4,181,
-131,235,161, 87,191,193, 56,115,244, 48, 30, 70, 71,130, 37,118,195,196,178, 4,133, 5,121, 89, 86,139,105,123,169, 45, 30, 98,
-113,149,109,191,236,168,197,225, 48, 48, 91, 88,152,172, 44, 62,253,224,125,211,148, 79,190,108,219,171,123,135,104, 33, 23,170,
-228,212, 76,215,235,119, 31,133,176,124,121,224,248, 25,171, 4, 6,163, 13, 74,157, 5, 39,127, 46,221,235,136,221, 42,183,170,
-218,164,215,248, 41, 95,111, 22,137,184, 28,115,253,218,129,137, 29, 90,214,127, 90,217,223, 83,253,237,178, 31,154,255,126,243,
-110,175,119, 71,142, 23,143,169,211,132,241,247,144, 56,189, 63,114, 96,168,205,106,126, 79,151,255,180,212,249, 5,249, 82,183,
-194,202,213,130,116,127, 70,140,106, 31, 98, 8,170,191,224, 60, 24, 36,234,179, 99, 7, 1,128,159,127,101, 3, 95,228,172,174,
- 64, 4,134, 0,192,186, 45,187,155,222,143,205,152,184,122,245, 26,105, 68,130, 26,247, 18,148, 16, 9, 56, 48, 91, 88, 48, 14,
- 6,181, 89,194,157,252,213,156,217,206, 5, 90, 27, 46, 69, 42, 16,125,231, 34, 49,105, 12, 35,165, 86,231, 65,240,118,122, 15,
- 64, 77, 0,241, 12, 67,126,210,102,251, 30, 5, 46, 91, 43,122,221,179,172,189,190,236,236, 85,163,186,141, 39,234,197, 23,202,
- 90, 49, 12,169,207, 16,184, 1, 36, 61,191,232,153,234,168, 83,211,102,199, 98,249,146,111,176,118,235, 97,100,228, 25,224, 98,
-123,138,163, 63, 47,194,231, 75,127,131,222, 88,122,175,134,242,252, 72, 73,198,232,101,195, 85,252,119,241,231,150, 46, 93,218,
-231,165,188,233, 83, 74,158,189,242,185,226,239, 47, 91,182,108,201,115,255,215, 57,106,178,158, 25,173,226,131, 42,199,108,213,
-246,242,171,242,199,209, 35,135,220, 10, 52,102,136, 5, 92, 84,174, 22,132,249,235,143,122,189,211,212, 19,185,102, 23,236,222,
-188, 34,223,160, 83,239,117,168,176,240, 14,110, 33,145,203, 78, 30, 58,120, 24, 53, 42,123, 11,118, 93,205, 79,186,155,168,127,
- 22,234, 85, 41, 82,132,213,156,117,188, 65, 3, 7, 74,207, 95,184,248,137, 6, 40,209,104,113, 25,110,165, 45, 59, 14,122, 59,
- 73,248, 96, 24, 64,173,183, 98,226,123,131,223,252, 49, 70, 88,238,248,177, 99,192, 20,153, 44, 85, 94, 22,190,156,245,129, 65,
-102,137,123,152,154,156,154,222,181,239,231,231, 85, 26,198, 48,108,244, 7,183, 31,198, 46, 45,208,233, 94,111,145, 31,163,201,
- 6,163,153, 69, 66, 66, 60, 62, 29,211, 13,124, 46, 7, 92, 46,107,239, 44,109, 45,253, 98,212,100,196,230,195, 87, 48,100,231,
-202,105, 91,252,125,188, 61,228, 50, 9,145, 75, 69, 76,253, 58,181, 4, 45, 91,182, 22, 86, 11, 14, 21, 92,125,164, 71,170, 66,
-143,196, 12, 37, 68, 62,141,120,195, 59,191,131,157,107,102,116,204, 79,189,195,193,171,157, 20, 95,224,236,165, 27,125,183,110,
- 90, 45,202, 46, 52,227,113,170, 6, 89, 5, 6,100, 22, 24,145,149,111,128, 92,194, 71,251,126,147, 68, 39,142,254,212,183, 75,
-187, 22,235, 94,231,184, 19, 19,147, 78, 36,167,103, 14, 13,109,220, 28, 59,127,253,165,157,171,107, 53,231,194,194, 36,149,163,
-185,179,104,209, 34,225,178,101,203,120,235,215,175, 87,181,108,217,210,119,206,156, 57, 61,114,114,114,110, 85,173, 90, 53,248,
-204,161,237, 23, 26,181,239,223, 12,172,217,171, 93,135, 78, 2, 17,203, 67,120, 88,152,121,223,222, 93,121,122,189,122, 74,153,
-134, 67,234,178, 40, 91,195,192, 43, 32, 32, 90, 46,180,117,227,113, 10, 99, 11, 78, 79,223, 81, 0, 28,170,209,243,163,115, 23,
-239,196,196, 54,141, 72,246,190, 16,241, 36, 39, 95,103,174,157,112,250,243, 50, 11, 94, 46,195,128,207,229,192, 73,194, 3,167,
-168, 84,149,251,135, 62, 1,195,120, 21, 71, 78, 25, 48, 69,239, 0,195, 32,163, 32,245,158, 3,125, 54, 24,194, 18, 32, 38, 77,
- 11,141,193, 30,154,175,228, 41,133, 34, 59, 13, 27,215,109,199,221, 59,183,209,253,157,126,216,176,101, 23, 38,190, 55,212, 80,
- 94,237,135,195, 41,138,104, 61, 23,205,146, 75,120, 0, 24, 20,106, 45, 56,248,251, 83,212,172,206,113,248,193, 0, 0, 78,114,
- 41,148,106, 61, 56, 2, 39,196, 71,156,148,158,186,120,115,206,220,133,171,191, 40,200,140, 76,125,242,224, 42,130, 61,149,168,
- 30, 96, 70,116,150, 51,238,228, 85, 67,112, 80, 13,112, 4,183, 29,210,206,141, 14, 89,126,148,115,176, 79,211, 70,245, 90, 85,
-241,118,133,222,100, 43,138,106,113,241,203,182, 29, 72, 78, 74, 27,159,247,240,232,221,183,225,104,181, 57,137, 10,145,119,208,
-135, 15,110,158, 79, 28, 56,242, 67,248, 5, 84,110, 88,152,122,207,225,110, 11,142,236,179, 57,104,180, 4, 82,215, 57,159,126,
-245,221,244,238,189,135,224,198,213,243,184, 23, 29,143, 22, 45,154,225,157, 1,195,161, 86,229,215,217,191, 99, 77, 55,171, 78,
-125,134, 39,178, 78,111,222,186, 51,195,218,108,136,123, 28, 21, 95,146,150, 62, 51,230,222,245,204, 24,231, 23,154,167, 60,235,
- 52,148,187,184,223, 51,154,109, 72, 79, 79,195,181, 63, 46, 53,214,103,198,220,171,200,249, 18, 9,184, 8,191,155, 3,179,133,
-133,217,202,162,125,135,110, 38, 1,199,216,110,241,234,109, 45, 51, 51, 50, 57, 50,103, 79,214, 61,160,174,192, 79,100, 54,222,
- 79, 80, 10,204, 22, 22, 53,252,101,101,106,122,249, 7, 45,153, 49,227,211,186, 92,129, 4,106,173,209,148,153,145,238,187,121,
-247, 69,205,163,199, 15, 2, 42,121,187, 56,127,183,230, 39,129,202,192, 32, 71,105, 68,190, 90,197,140,156, 60,211,127,235, 15,
- 75, 71,149,101,180, 74,232, 46, 82,253, 68,248,213, 58,110, 78, 2, 70, 99,176,178,121, 42,179,109,228,128, 55, 27,116, 89,100,
-178, 38,173, 94,181, 70,122, 55, 65,141,251, 9, 74,136, 5, 92, 8, 5, 28,152, 44, 44, 28,188,157, 56,190,222,190, 83, 90, 55,
- 13,193,153,123,185,224,114, 57,208,171, 11,116, 60,228,197, 54,237,216, 93,218,164,121, 75,116,234,216, 1, 79, 98, 99, 42,135,
- 29, 59,216,229,250,181,203, 89, 86,115,237,105, 90, 69,236,225, 10, 5, 22,116, 58,174, 69,232,251,190, 95, 64,213, 54,131,134,
-191,239, 82,165,114, 0,227,237,233, 1, 43,225, 97,210,123,131, 29,190,243,237,198, 28, 88,182,112, 14,140, 70, 19,188, 92,133,
- 32, 4,216,182,110, 62, 76, 38, 19,252, 61, 68, 80,106, 75, 95, 77,174, 60, 63, 82, 90, 20,170, 66,125, 79,158, 51, 99,101,237,
-103, 24, 38,108,246,236,217, 95, 2, 32,179,103,207,254,178,120,123,233,210,165,122, 0, 25,229, 52, 29,110,126,193,104, 21, 31,
- 92,233,119,183, 32,216,211,195,239,122,248,153,211, 46, 71,238,179,184,113,248, 14,122,183,240,131,128,199,129,212,197, 31,247,
-147,148, 56,113,104, 83,225,209, 61, 63,165, 27,141,198,239,203,111,107, 14,106, 42,151,202,206,252,186,115, 47,235,233,225,193,
-217, 24,174, 72,200, 83, 91,159, 53,105,197,222, 60,198,222, 57,179,217,143,128, 57, 45, 22,139,131, 76, 38,147, 91,121, 25,187,
- 45, 60,165,168, 19, 47,243, 54,202, 86, 48, 92,174,109,231,174,157,240,116, 22,194,104, 97, 49,251,139,143,245, 99,186,203, 11,
- 71,190, 59,188,115,167, 94,211, 47,240,101,181,206,183,110, 92,139, 52,106,212,168,144,203,229, 58,212,149,194,219,219,123, 62,
-135,195, 25, 33, 20, 10,157, 76, 38,147,218,196, 26,164, 90,131, 9, 6, 51,160,211, 25,192, 23,216,205, 34,159,203, 64,111, 48,
- 65,167, 55,149,125, 99,100, 69,253, 14,160,182,234,185,152,210,249, 71, 53,132,191,237, 63,250,241,144,119,135,205, 13,104, 56,
- 64,158,148,169,132,128, 49,163, 89, 93, 63, 92, 60,125,152,164, 37,199,126, 90,158,201, 2,128, 28, 69,126,160,151,151, 15,238,
- 38,106,144,158,167, 71, 86,145,201,202, 44, 48, 66,173, 87, 35,180,138, 63, 10,149,202,192,215, 62,191,192,225, 51,103,206, 12,
-237,213,127, 24,166,127,177,160,237,207,155, 86, 68,202,132,252,113,218,236,184, 75,142, 24,173,168,168,168,252, 89,179,102,213,
-220,178,101, 11,103,212,168, 81,250,144,144, 16,241,232,209,163,219,238,216,177, 67, 44,149,138,245,247,175, 30,155, 59,225,163,
-217,253, 55,175, 93,212,176,160,160,128,177, 90, 44,167,204, 5, 5,179, 53,229,152,185,167,199,190,124, 60, 47,193, 60,182, 91,
- 59,175, 99,238, 82, 78,125, 17, 49, 13, 71,221,249,123,241,104,190, 57,225,244,122,181,100,232,202,143, 50, 10,217,175, 12, 28,
-239,197,229,153, 44, 0,224,112, 25,152,172, 54, 56, 73,248,224,112, 56,197, 38,222,239,151,189,167,164, 94, 46, 66,240,185, 28,
-240,184, 12, 84, 58, 11,114, 85,102,124,248,190,163, 51,132, 16,214,106, 35,208,155,172,208, 21,213, 14,213,170, 92,204,249,226,
- 51,188,211,119, 32, 38, 76,249, 12, 5,122,224, 78,162, 26,102,139,165,220,155,130,195,112,160, 51, 90, 49,174,123, 21,228,107,
-204,208,234,173, 48, 89, 89, 72,133, 60,240,121, 28,200,196, 60, 56, 75,249, 0, 33,130,226,194,132,207,231, 27, 44, 22,203,206,
- 50,106,244,168, 22,232, 3,189,133,131,230,195, 86,160,107,171,218,136,254,253, 32,239,242,141, 7,213, 63,249,226, 43,124, 60,
-177, 47, 14, 60,174, 9,119,239, 42,144,203, 36,176, 16, 14, 0,226, 96,135,189,249, 44,199, 60,112,196,143, 91,182,197,124,251,
-205,108,113,161,150,129, 72,192,197,133,243,231,112,253,230,157,181,185, 15,143,238,196, 91,132, 79, 56, 62,206,206,206, 16, 11,
-185, 48,153,141, 38,199,187, 46, 16, 16,160,177,204,187,246,143, 69, 53,254,198, 54, 22, 37,236, 43,223,104,241,196,206,179,167,
-125,241,237,146,238,189,135, 32, 60,236, 0,246, 31,216,107,107,213,115, 60,119,215, 47,155,208,182,107, 63,180,237, 62, 12,167,
- 14,239,248, 76,203, 50,245, 38, 77,159,187,176,125,231, 94, 8, 63,113, 0,217, 89,105, 43, 29, 77, 47,151,207, 76,239,220,173,
- 47, 12, 38, 27,218,117,233,131,211,199, 15,127,132,162, 65, 22,142, 63,196, 94, 42,159,193,177,126,246,233,116,126, 78,161,137,
-175, 80,153,144,166,208, 33, 41, 91,135,163,123,126, 38,142,151, 23,166,102,237, 67, 43,241, 39, 45,191,240, 52,176,146,159,145,
-111,212, 75, 98,227, 19,234, 76,120,127, 12,191,122, 80, 29, 78,142,210, 8,133,210,136, 92,165, 17, 26,131, 21, 65,149,106,113,
- 44, 86,166, 85, 69,243,217,211, 69,200,223,112, 60, 17,206, 50, 62, 90,215,121,253,129,182, 44,203,254,105,178, 86,219, 77, 86,
-100,162, 18, 34, 1, 23, 34, 1, 7, 34, 1, 23, 86, 27,113,168,226, 34,241,174,221,235,195,105, 31,248,155,172, 64,158,210, 4,
- 30,151,129,183,167,155,172, 89,195, 17,216,182,226, 35, 0,192,196, 89, 27, 49, 97,220,104,212,173, 31,130,194,130, 2,223, 17,
- 67,122,173, 6,112,216,209,180,158, 12,191, 84, 57,252,202,221, 89, 31,206,152, 39,127,183,111, 39,238,189, 4, 37, 50,243,141,
-136,143, 85, 87, 40,242, 6, 0, 86, 27, 11, 2,130,237,123,195, 32, 17,242,160, 80,154, 65, 8,193,162,245,251,224, 36,225, 35,
-179,192,222,220, 95, 22,101,250,145, 50, 34, 82, 21,136, 54,246,129,189, 47,151,151,163, 17,173,165, 75,151, 70, 47, 93,186,180,
-196, 8,217,115, 38,235,245, 22,149, 22, 8,100,117,156, 61, 60,111,132,159, 62,233,116,248,190, 13, 23,239,231, 97, 72,187, 74,
-208,228,167,226,251, 47,222,205,103, 64, 76, 28, 46,183,208,168,215, 29,210,235,181,139, 1,152,203,188,104,124,107, 55,150,137,
-229,231, 54,108,254,213,234,233,237,141,157, 87,243,211, 10,180, 86,203,159,205, 86, 22,230,206,153,205,213,173,172,165,167, 33,
-251,201,237,242,106,226, 44,129, 96,233,166,163, 0, 8, 88,150, 5, 97, 89,240,197,114,153,103,141,150,217, 69, 5,157,152,199,
- 97, 12,207,151, 0,132,181,166,229, 38,150, 29, 6,101, 0,184, 72,249,216,123, 57, 29, 0,178,185,234,136, 71, 35,223,181, 55,
- 23, 26, 76, 98, 85,253,154, 53, 73,179,102,205, 10, 37, 18,135,166,191,226,250,248,248,220,154, 59,119,110,157, 9, 19, 38,136,
-132, 66, 33,172, 86,171,251, 79,155, 55,179,155, 23, 79,196,160,143, 54, 64, 32, 20, 65,111, 48,131,207,231,161, 64,169, 65,161,
- 74, 7,181,206, 82,241, 43, 40, 33,193,164, 0,150, 31, 57, 44, 28,216, 67, 30,218, 92,200, 17,160, 73,176, 31, 46,158, 57, 66,
-110,156,222, 54, 81,159, 19,251,171,131, 23, 34, 52, 6, 11, 50,242, 12, 72,207, 51, 32,171,192,128,172,124, 35,178, 10, 12, 96,
- 24, 6, 6,147,245,141, 30, 92,218,156,152,253, 59,127,221,218,207,104,198,240,246,221, 7,226,179,121, 27,170,236,252,113,217,
-185, 68,194,105,227, 96, 71, 91, 91,116,116,116,242,251,239,191,223,112,247,238,221,220, 6, 13, 26,232, 31, 61,122, 36, 45, 50,
-145,102,185, 92, 42,249,249,135,165,103,154, 55,111,190, 39, 61,246,241,133,162,246,244,114, 11,246, 42, 29,198,138, 36,230,187,
-147, 42,203, 90,247,168,225, 43, 69,101,153,186, 71, 29,249,253,239,243, 58,127,188, 68,113, 97,109, 78,166,209,122, 86,161,231,
- 54, 74,215,240, 29,234,131,103, 49, 26, 82, 6, 13, 25, 14, 46,195,129,217,160, 75, 41,190,184,188, 93,132,152,191,235, 49,228,
- 98, 62,156, 36, 60,200, 37,124,180,173,231,142, 10,148,103,196, 98, 99,161, 51,218,160, 55, 90, 97, 48, 89,225, 25,232,134, 45,
- 59,247, 35, 53, 71,143,163,183,115, 17,147,162, 70,173, 74, 50, 16, 82,126, 49,201,218, 44,218,190,131, 71, 57,113, 57, 12,184,
- 28,134, 83,175, 78,109,228,107,204, 16,240, 56, 16,136, 37,144,137,120,112,150,240, 33, 16,240,145,147,147, 3,163,209,136,202,
-149, 43,139,203,182,130, 4, 78,114, 9,106, 85,247,135,217, 98,197,201, 43, 15,177,248,211, 65,232,214,190, 41, 24,190, 28,143,
-141,141,225,228,238, 4,150,195,129,217,202,194,100,182, 1,224, 24, 74,211, 11, 12, 12,236, 44,147,201,100, 58,157, 78,157,154,
-154,122, 41, 43,230,112,170,141,219,127,210,233,240, 11, 59,251,188,211, 13,119, 35,163,113,224,240,177,171,185, 30,202, 25,197,
-223,169, 95,191,126, 75, 79, 79, 79,121, 94, 94,158, 42, 42, 42,234,214,235,214, 11, 8,135,243, 73,171,182, 29,161, 41,204, 65,
-246,211, 36,135,107,209,117,171, 56,225,235,165, 27,154, 4,215, 14,110, 98, 35,118,227, 85,175,178, 19, 62,159,183,174, 73,205,
- 90,181,155, 20, 15, 8,169, 91,185,236,105,217,120, 82,167,238,239, 77,248,108,105,191, 33, 99,113, 33,252, 24, 86, 45,254, 98,
-167,204,197,171,174,187,155, 75,163, 6, 45,187,227,234,185, 99, 16, 59,249,194,205,195,183,237,168,113,211,186, 14, 25, 53, 25,
-215,175,158,195,218,101, 95,238,176, 25,213,191, 57,146, 86,153,119,117,175,134,141,155,143,116,114,247, 65,161, 82, 13, 39, 55,
-111,212, 13,109, 54,242,225,125,227, 44,109, 78,162,226,181, 77, 7, 33, 48,154, 9, 10, 52,102, 60, 85,232,145,156,101, 55, 90,
- 44, 91,129, 62, 65, 54,150,145,139,121, 60,119,203,147,202, 15,206, 93, 32, 85, 2,125,152,229, 11,191,224,154, 33,134,162,208,
-110,178, 20, 42, 19, 20, 74, 19, 52, 6, 11,220,101, 60,176, 54,182,194,181,238, 2,141, 25, 78, 82, 62, 92,164, 2,135,163,140,
- 37,177,233,151,189,193,247, 99, 51, 6,172, 90,181, 70,122, 47,241, 57,147,197,183, 71,179, 68, 2, 46,108, 44, 11, 56,112,199,
-243,121,252,233,253,123,117,197,211, 92,189,125,212, 50,135, 65,173,144,230,240,148,176,232, 50,108, 54, 0,160,111, 47,123,215,
-182,196, 76, 45,142,223, 80, 0, 47,118,236, 46,187, 44,214,235,185,155,119,157,248,100,255,190, 61, 46, 6, 27, 15, 63,157, 74,
-134,206,104,133, 88,192,133, 72,192,133, 68,192,125,161, 63,118,249, 70,203,222,231, 46, 53,215, 2,157,193, 0,149,222, 2, 2,
-224,214, 19, 13,244, 38, 43,148, 90, 11, 90,214,113,123,179, 64, 8,195,156, 32,132,244,126,217, 16,189,108,150,158,139, 72,149,
-164,113,251,121,141,226,207,151,102,228,158,239,179, 5,160, 66, 35,184,120, 47, 59,199,231,183, 5, 50,183,186, 46, 78, 46, 55,
- 78,159, 10,147, 31,190,207,226, 82,164,221,100, 89,244,185, 88, 57,107, 68,154,170, 48,183, 19,128, 4, 71,127, 76,234, 89, 55,
- 84, 44, 20, 93,248,110,205, 79,102,111,159, 0,246,208,141,194, 28,165,206,246,130,155,176, 25,141, 28,194, 18,129, 33,251,137,
- 67,109, 8, 28, 14, 99,158,247,209, 64,176,132, 96,254,154,253, 88, 50, 99, 24,228,146, 81, 82,134, 97,164, 90,131, 21,159, 46,
-216,138,149, 95,143,119,146,138,120, 96, 24,123,159,168,247,134, 15,116,236, 2, 52, 88, 17,127,115,183, 70,157, 24,246,232,249,
-230,194, 22,109,223,185,211,162, 69,139, 66, 55, 55, 55, 72, 36,146, 63, 35, 21,165,224,227,227,243,245,188,121,243,130,167, 76,
-153,242,108,178, 79, 30,143,135, 15, 63,248,128, 99,179, 17,156, 58,181, 13, 94, 85, 27,227,216,217, 27,232,217,185, 25, 52, 58,
- 3,242, 11,213, 96,193,125,237, 11, 81, 93,152,123, 33, 43,249, 65,243, 54,157,250,226,210,153, 35,228,198,169,159, 39, 86,100,
-142, 30, 55,119,183,167, 17, 15,226,235, 50,140,187, 61,162, 85,100,178, 76, 22, 22, 85,124,164,120,154, 28, 15, 87, 23,151,167,
-142,234, 73,188,130,251, 51, 28, 50,133, 1,217,166,205,142,219, 15,128,104, 51, 31,141,216,255,219,230,200,232,168,123,139,251,
-140,156,206,235, 62,228, 3,238,143, 75,167,125, 9,192,209,137,247,204, 49, 49, 49, 15,199,143, 31,223,250,250,245,235, 54, 0,
- 58,134, 97, 44, 92, 46, 87,106, 50,153, 4,157, 58,117, 82, 62,126,252,248, 50, 74,238,180,248, 2,109,223,223,239,201,136,212,
-239, 8, 89,243,136, 42, 78,234,110,157,218,181, 66,171,250,129,120,218,174, 21, 0, 76, 79,209,200,131, 13, 53,183,238,181, 88,
- 37, 39,127,252,229,248,146,137,195,186,126,186,147, 55,127, 85,102,216,252, 50, 59,162, 62,125,116,185, 71, 73, 54,158,199,229,
-192, 73,194,135, 92,194,131,147,132, 15, 39, 49, 31, 22, 43,169, 72,205,145, 88,172,172, 61,162,101,178, 66,163,183,226,194,189,
-108,100, 41, 77, 40, 84,155,161, 55,219, 64, 64,236,181, 81, 7, 74,115,197,147,107,174,197, 79, 82,215,202,141,149,155,215,175,
-112, 62,248,123,218,179, 17,125, 46, 82, 33,156,164,246,209,216, 87,174, 92,129,135, 71,249,181,125,150,101,113,224,244, 45,172,
-218,126, 1,167,183,205,132, 88,192, 69,104,255, 5, 24, 59,160, 5, 88,194, 34, 62, 38, 58,187, 86,189,134, 62, 28,142, 4, 28,
-134,129,209,194, 2, 32,165,158, 79,147,201,228,145,154,154,170, 10, 10, 10,242,245,247,247, 31,194,229,114, 9,212,247,140, 71,
-246,228,235,206,135,253, 38,213,234,141, 54,169, 85,185, 45, 40, 83,223, 27, 65, 65, 96, 24,134, 56, 59, 59, 11, 46, 92,184,160,
- 9, 9, 9,241,122,205, 91,137, 35,241,174,189,118,194,212, 79,134,212,172, 81, 3,251,127,219, 6, 66,152,131,142,126,121,215,
-241,235, 88, 56,231,197, 17,134,159,207, 91,215,100,229,130,233, 47,236,155, 58,103, 85,153,163, 14, 37, 34,249,140, 65, 35, 38,
-225,206,173, 63,240,253,130,207,247, 24, 53,249, 99, 45, 86,203,208,252,204,196, 61,213,235,181, 0, 49,171, 17,190,111, 5,134,
-141,158, 40,234,222,103, 8,174, 95, 61,135, 37, 95, 78,221,165, 43,204,121, 31, 14,118,114,102, 9,127, 74,167, 30, 3,248,122,
-163, 25,235,150,127,131,201, 51, 22,163,101,231,190,252,168,123, 55,166, 0,248,214,225,238, 16,102, 27, 58,133,120,218,205,179,
-133,197,177, 68, 46,175,164, 43,144,199,101, 56,141,106,184, 66,111,178, 66, 85, 78,165,146, 39,224,103, 21, 42, 85, 85,127, 88,
-242, 9, 87,107,176, 66,161, 52, 33, 71,105, 68,110,225,159, 6, 43, 87,105,132, 66,105, 2,159,199, 32, 54, 33, 5, 28, 62,175,
-194,253,243, 10, 52, 22, 52,175,237,102,191, 71, 95,179,117,196,194,115,110,113,250,242,253, 65,171, 86,173, 22,223, 79, 82, 35,
- 50, 81, 85, 20,201,226, 66,196,231, 64, 88,244,183,141,181,247,141, 44, 11,103,175, 26,213,199,188, 55,170,139,179, 92,130,140,
-184, 28,240,184,246, 41, 98, 92,188, 3,225, 34, 50, 96,218,212, 73,240,244,112, 69,106,174, 17,107, 15,199, 34,242,225, 19,176,
-250,138, 29,246,186,159,246,244,156,240,225,231,174, 28,190, 16, 59,206, 36,217,211,201,181,225,241,141,227,134,140,248, 7, 90,
-141, 42,143,128,216, 28,236,131,204, 16,171,205,126,185, 45,153, 63, 27,123,182,111,196,153,136,156,103, 87,224,239, 7, 87,226,
-147, 57,139,144,171, 50,161,164,235,178, 44, 63, 2, 64,241, 92, 36,234,149,237,231,204, 81, 73,219, 76,209,182,169, 20, 13,211,
- 75,230,202,244,210,126,211, 75,122, 37,205,253,183,185,220,166,195, 87, 76,145,171, 87, 3,169, 88,246,199,169, 83,199,101, 71,
- 34,201, 51,147,101,214,229,146,197,211,251,166,169, 10, 21,221, 43,100,178,188,106, 53, 16, 73, 69,151,231, 46, 90,107,244, 9,
-168,106, 61,121, 79,149,167, 54,216,172,175,246, 65,144,217,100, 46, 94, 6,158, 80,180,138,175, 55,125,147,155,251, 72, 91, 94,
-228,137, 37, 4, 97, 55,179, 64,136,189,138,180,239, 74, 58,138,106,230,176,177,246,102,149,179,247,114,192, 43,234,135,226,104,
-248,123,211, 79, 27, 85,189, 67,148,218,145, 75,230, 63,107, 46,108,217,208, 30,201,114,118,118,134,171,171, 43,228,114, 57,202,
-107, 58,100, 24,230,189, 9, 19, 38,188, 82,251,207,201,201, 65,215, 46,157,176,126,227, 22, 52,236, 50, 6,103,175,157,129,217,
-194, 34,180, 94, 13, 84,245,119,195,211,108,245,107,221,232, 50,159,224, 15,155,119, 26,240,101,219,206,125,113,225,244, 33,114,
-227,244, 47,147, 42, 58, 17, 98,239,174,173,143, 47, 92, 56,191,250,220,197, 63,136,156,196, 60, 60,210,152,192, 97, 24, 84,241,
-145,194, 67,198,193,165, 35, 59, 12,195,250,182,118,120,114,188,192,192,128,157, 43,215,111,150,173, 92,182,160,211,157, 8,230,
-130, 38, 35, 54, 31, 0,116,217, 49,203, 31, 3, 15, 43,253, 17,126,178, 97,135,129,240,241,175,209, 45, 49,251,177,195,102, 3,
-128, 46, 33, 33, 33,113,238,220,185,193,203,150, 45, 35, 92, 46,151, 5, 32, 90,179,102,141, 46, 46, 46,238, 30,236, 67,115, 81,
-222,195,166, 75,183,250,159,202,133,182,150,238, 82, 78,253, 26,190, 82,180,170,111,111, 21, 29,214,187, 45, 2, 43, 87, 70, 66,
-150,174, 81,190,142,229,107, 76,220, 26, 27,126,138,188, 93,205,147, 59,209,170, 55, 61, 4,112,180,162,249,195,224,207, 14,242,
-197,209, 44, 39, 9, 31,172,253, 90,169,144,209, 50,154,109,208, 27,109,208,155,172,208,154,108,208,153,108, 96,137,253,158, 96,
- 24, 6,102, 43, 11,135,170,205, 47, 93,251,206,238,158,168, 81,141,129,179,212,158, 54,231,162,233, 30, 24, 0, 30, 30, 30,240,
-246,246,118, 40, 42,106, 50,219,111,113,147,133,125,214,172,111, 50, 91, 65, 8, 65,108,108,204,204,228,196,196,254, 65,181,130,
-218,215, 11,109,232, 46, 21,113, 0,160, 84,163,165,211,233,108, 78, 78, 78,222,238,238,238,156,244,244,244,103,230, 57,168, 81,
- 39,235,225, 67, 7, 49,104,208, 64,205,163, 91,247,159, 13,113,215,235,245, 76,155, 54,109,156, 3, 3, 3, 57, 70,163, 81, 85,
-209,108,146,121,213, 30,224,230,225,190,248,189,247, 39,215,238,212,181, 39, 46,158, 15,199,209, 67,187,127,213, 41, 98,195, 29,
- 21, 9, 14,174,243,202,168,195,154,181,106,191, 50,234,176,106,245, 90,101, 26,173,122,161,205, 90, 16,134,135, 51, 97,251,136,
-129, 99,158, 10,128,181, 25,212,251,246,110,250,250,219, 17, 83,230,212,236,213,111, 4,222, 27, 61, 22, 60, 30, 23,151,206, 30,
-199,202, 5,159,157,208, 40,115,198, 56,210, 77,192, 30,122,171, 43, 8,144, 4,126, 92,185,102, 3, 68,220,184,138,248,216,168,
-232,251,183,175,215, 15, 10,105, 9, 47,255, 42, 31,167,120,114,151,225,209, 35,115,121, 50, 38,131, 33,101,236,152,209,120,126,
-212, 97,171,198,193, 30,204,203, 55, 0, 0,157, 58,199,252,243,138, 79,227,138, 71, 29,178,102, 83, 74,105,186,202, 2,197,129,
- 75,215,110,206,232,223,187, 39, 39, 87,101,178, 71,176,148,166,162,151, 17,185,197,127,171,140,168,229, 47, 71, 76,116, 4,107,
- 80,230, 30,172,224,125,105, 24, 59,180,199,195,226,107,151,101, 9, 24,192, 80,225,102, 41,190,243,164,229,223,175, 18,223, 79,
-212, 32, 50, 73,101,111, 42,228,115,237, 6,139,207,121,102,186,236,163,217,203,137, 14, 49,220, 37,227,198, 12, 71,174,202, 12,
-150, 5,120, 92, 78,209, 75,128, 84, 53,131,167,106, 29,114, 11, 20, 72, 76, 78, 65, 97, 86, 60, 56, 28, 14, 60,253,107, 59, 60,
-147,180,141, 8,253,116, 38, 18, 50,164,119,123,222,161, 63, 50, 33, 21,241, 96, 84,103,227,212,222, 21, 10,163, 70,181, 88,175,
-211, 28,114,100, 62,199, 63,187, 32, 48, 10,149,198,224, 35,226,115,177,127,251, 15, 24, 58,118,234, 11,165,239,204,175, 22, 2,
- 28, 6,249, 5,106, 48, 12,163,168, 88,185,196,220, 46,107,251, 53, 35, 99,111,172, 81,130,217,122,181,162, 80,122,109,148,156,
- 10, 63,125, 92,246,123,178, 8,183, 98, 50,139, 76,150,130, 93,244, 81,239, 52,181, 50,191, 7,128,216,138,213, 11, 57, 61,134,
-141,155, 17, 93,163,118, 61,227,197, 40, 77, 82,161,214, 82,106, 63,135, 86, 67,230, 70,223, 57,177,190,151,210,146,240,129,204,
-175,158,141,181, 90,151,235, 21,177, 11, 74,105, 58, 20, 46, 88,187,255, 89,179,225,172,101, 59,236,127,219,108,176, 17, 22,132,
- 5,166,125,189, 9, 86,214, 6,214,102, 3,107, 35,176,216,136,180,188,228,122,251, 87, 61, 84,240,120, 95,157,145,223,190,218,
- 92,232,234,234, 10, 15, 15, 15,120,120,120,192,217,217,185, 92,163,197,231,243,229, 60,222,139,167, 58, 37, 37, 5,201,201,201,
-112,118,118, 6, 97, 45, 48, 89,128, 6, 45,187,227, 65,124, 20,206,253,126, 15,132,181, 65, 38,175,248, 42, 47, 50,159,224, 15,
-154,117,236,255, 67,231,126,227,113,246,208, 79,228,246,149,227,147,245, 57,177, 91, 29,142,208,219,108,140,197, 98, 65,239,238,
- 29, 83,238, 70, 63, 57,253,213,140, 41, 61, 91,247,153, 44,106, 21, 28, 0,131,201,134,180,228,120, 92, 58,242,139,161,118,117,
-191, 51, 93,218,181, 72,177, 88, 44,176,217,108,229, 62,200, 13, 38,115, 46,151, 47,145, 13, 31, 62,146,127,251,214,173,131, 50,
-175, 90,251,109, 12,231, 62, 67,216, 80,134,144, 65,161,161,117, 97,182,176,208,233, 84, 5, 21, 61,102,181, 90,157,184,109,219,
-182,234, 99,198,140,145,214,171, 87,143, 31, 31, 31,143,149, 43, 87,230,169,213,234, 68, 71, 53,194,175,196,172,225, 49, 5,113,
-197, 17,173,212,182,173, 48,188, 79, 91,236, 57,241, 59, 46, 93,189,142, 20,141,252,158,198,202, 59,242, 52, 37,195, 88,223, 93,
-117,176, 95,171,170,220,253,219, 11, 14, 70,119,156,253, 46, 33,162,240,220,203,243,181,142,223,220,128, 90,111,129,179,212, 62,
-223, 83,113,100,139,203, 48, 14, 59, 34, 6, 72,188,122, 61,162, 65,211, 90,245,112, 55, 81,137,156, 66, 35,244, 70, 43, 88,150,
-128, 5,129,135,147, 16, 98, 1, 7,169,201,137, 96,137, 57,169,130,143, 10, 69,135,246, 29,120, 0, 3,134, 33, 60, 62,143, 7,
- 2,251,252,138, 18,137, 68,227,237,237,237, 80, 68,203,108,181, 98, 80,207, 22,104,217, 44, 20,253, 39,219,231,204, 60,255,235,
-108,184,201,249,216,179,115, 43,158, 94, 89,179,179,122,171, 41,225, 81, 15,162, 7, 71,223,253, 99,228, 59, 77, 36,141,124,121,
- 25,130,210,194,164, 90,173,246, 32, 0,161, 64, 32,232,217,190,125,123,247,131, 7, 15, 22,122,122,122,178, 66,129, 64,209,175,
-111, 31,150, 47, 16,228, 23,127,246,218,181,107,252,201,147, 39, 59, 21, 20, 20,164,102,103,103, 95, 7, 96, 41,187, 34, 24,220,
- 21, 28,236, 6,195,136,229, 18,105, 74,181,106, 53,252,155,181,108,225, 50, 96,208, 80,136,132, 34,156, 13, 63,141,117,171,151,
-237,211,100, 62, 26, 87,145, 51,249,182, 70, 29,166,165, 38, 37,234,244,198,144, 6, 77, 59, 50, 87,195,143, 76, 55,195,115, 53,
- 87,100, 94,209,117,208,212,154,137, 25, 26,172, 91, 58, 19,110, 46, 50, 36,197, 63,214,199, 61,122,176,201, 98, 80,205,116,216,
-100, 1,144,230,217, 6,183, 26,221,211,205,104,182,225,202,133, 19, 6,214,202,246,188,126,249,100,124,165,218,205,196, 13,154,
-117,113,203, 61,186,117,144, 14,216, 83,158, 78,250,227, 87, 35,184,196, 84,152,116,254,194, 57, 23,159, 42,245,185, 12, 24,152,
-141, 6, 40, 18,110, 91,117,217,143, 85,170,244, 40,135, 70,225,230, 61,197,215,115,230,125,247, 65,179,166, 77,101, 4,226, 23,
- 34, 88,197, 6, 43, 87,101,130,167,147, 16,122,149, 2,113,183, 79, 27,116, 10,110,153,243,157, 89, 77, 90,105,110, 78,182,240,
-207,238, 12,177, 45,203,250,124,110, 78,182,208,106,210, 74,203,127,212,113,225, 44, 19,226, 65, 82,250,179,142,239, 34,190,189,
-111,150,144,207,125,214, 79,171,184, 44, 40,135,142, 2,177, 43,210,243, 12, 96, 64,192,218,172,176, 90, 76,221, 61,207,163, 0,
- 0, 32, 0, 73, 68, 65, 84, 80,171, 84, 72,207,200, 66,118, 86, 54,212,234, 66, 72,229,110,104,208,168, 57,156,100, 98,220,191,
-180, 15,132, 16,135,230, 53,180, 48,252,224,102, 45,219,137,162,146,237,125,177,196,124,130,227,187,151,229,105, 84, 57,237, 52,
-153,113,113, 21, 45,139,173, 54,219,185,200,135,113,245, 43,249, 85, 99,238,197, 43,177,115,203,122,152,138, 34,155, 22,139, 13,
- 81,169, 90,100,230,235,144,154,240,136,176, 54,219, 57,252, 71,224,149, 30, 0, 4, 47,180, 65, 93,116, 31, 53, 0, 27, 55,110,
- 66, 66, 98, 50,187,120,122,175, 84,141,186,240,157, 10,152,172,174, 40,154,107, 67,151, 29,179, 92,239,214, 44,237,216,221,124,
-142,222, 68,202,236,224, 35,246,170,130,118,227, 86,158,209,171,243,133, 54,163,142,119,124,231,184,221, 37,105,218, 29, 52, 76,
-139, 63, 31, 6,185,132, 7,134, 97, 80,220, 92,184, 97,225, 36, 72, 69,246,182,101,189,209,138, 81,159,174,194,206, 85,159,129,
- 0, 24, 49,244,119, 93,105,233,132,125,237,194,105,126,184, 85, 41, 37, 57, 39,189,107,223,207,207, 27,204, 34, 99,159,129, 99,
-238, 52,109,218,180, 80, 34,145, 64, 34,145,192,217,217, 25,110,110,110,112,117,117, 45,247,216, 45, 22,139,198,100, 50,121, 8,
-133, 66,176, 44,139,164,164, 36, 36, 37, 37, 65,169, 84, 66,161, 80, 64,171, 81, 89,111,157,223,207,107,208,170, 23,252,107,132,
-160, 74,173,134,224,115, 25,240,120, 28, 92, 58,182,165,180,116,150,108,178, 58,244,219,208,165,255, 4,156, 61,180,153,220,190,
-114,124,138, 62, 39,118,139,163,121, 84,212,220,115,127,208,160, 65, 33,147, 39, 79, 22,204,155, 49,249,204,137,240, 75,177,251,
-195, 54,247, 45, 40, 40, 12, 36,132,192,213,197,229,233,176,190,173,143,119,106,211, 44,229,252,249,243,236,238,221,187,141, 12,
-195, 60, 40, 75,211, 94, 72,229,252,122,254,220,133,249,237, 58,116,196,214,237,187, 59, 68, 63,124,212, 33, 62, 62, 14,129, 85,
-106,160, 90,245, 90,208, 49,110,184,112,249, 42, 52,133, 57,191, 58,146,206,151,162, 90, 76, 65, 65,193, 31,195,134, 13,235,254,
-251,239,191,115,134, 13, 27,166,203,205,205,189,246, 92, 20,139,148,167,121,253,199,129, 10, 0,191, 86,233, 48,118, 95,186,185,
-240, 99, 0,203, 42, 87,169,140, 75, 87,175,227,250,239, 55, 55,229, 74, 43, 47, 24, 55,234,253, 73, 85,251,113, 39,244,107, 85,
-149,235,237, 38,197,111,155, 87,114,143, 93, 79, 94,149,156,103,219,186,236,242,252,133,142,228,209,179, 7,135,218,140, 54,117,
-221, 97,177, 17,176,196, 94,224, 58,137,249,165, 21,188,175,104,242, 76,162,113, 83, 38, 79,142,111, 16,218,232,147, 81,239, 79,
- 17, 52,170, 17,136, 91, 79, 10, 1,134,129,187,175, 12,153,153,153,184,114, 96,179,181, 32,253,241, 38, 46,151,253,182, 2,231,
- 19, 5, 41,247,130,158,219,156,148,155,155,139, 75,151, 46,161,216, 96,121,121,121,149,102,180, 94,208,204,203,206,184,182,240,
-251,159,218, 76,124,111, 32,250,116,172,143,203,183,227, 97, 42,154,175,169,120, 40,121,226,245, 31,133, 31, 15,171, 97,250, 96,
- 80,109,149,222, 34, 76,254, 58, 73,121, 5,246, 53, 88,217, 82,210,105,202,207,207, 63, 22, 19, 19,211,182, 97,195,134, 85, 79,
-158, 60,153, 31,125,243,204,244,231, 19,241,249,231,159,203, 55,110,220, 40, 37,132, 92, 51,153, 76, 9, 14, 29, 59, 7,191, 69,
-220,185,227, 97,182,176,184,122,243,126,221, 46,109, 26,129, 37,192,237,219,183,177,245,231,173,134, 7,145,247, 86,104,179,125,
-191, 45,195,188,148,120, 62,109,111, 54,234,240,153,102,102,122,242,138,179, 39, 14,236,108,214,161, 47, 70, 78,251,246,219, 75,
- 39,118,207,111,210,174, 15,167,110,179,238,136,184,126, 1,231, 78,158,254,206,172,201,159,143,242,251,142,148,152, 78,145, 68,
-250, 81,189, 38, 29,144,154,146,140,164,184,168, 95, 13,249, 79, 50, 82,226,185,191,102,164,165, 76,169, 94,191, 13,126, 63,179,
-103,122, 25, 70,171,204,107, 62,208, 75,178,249,100,216,177,225,105,105, 63,250,106,245, 6, 17, 33,196, 32, 18,242,178,228, 28,
-245, 94,149,195,233,124,100, 86,100, 84, 29, 52,116,212,148, 19,235,214,173,230,251,184, 74,145, 85, 96,128, 74,111,134, 90,103,
- 6,135, 97, 16,228, 47,131, 78,157,143,203, 7,190,183,152, 52, 5,195,128,120,115,105,154, 50,239,224, 69, 5, 79, 46, 76,251,
-124,234, 69, 8, 93, 2,253,171,117,158, 83,102,180, 78,157,126,175,239,231, 83,143, 7, 19, 66,186,200,188,131,213,218,156,152,
-185,165, 29, 59,195,216,239,239,145,157, 2, 97,182,218,231, 31,179,178,128,141,101,139,162,124, 0,121,214,158,207,148,115,236,
- 12,187,247,196, 53,100,100, 23, 66,111,178,192,104,178,194,108,177,129,195,229,194,213,205, 21,181,170, 53,134,139,171, 51,178,
-179, 50,112,253,252, 49,196, 70, 94,190,198, 16, 44,208, 43,226,206, 59,146, 71, 2,137,107,176,159,191, 47, 39, 83,101,130, 68,
-200,197,189,203, 39,205, 22,147,113,133,131, 38,235, 21,205,194,188,252, 85,159,204,248, 98,196, 47,219,182,251,134, 84,119, 70,
- 90,174, 30,105, 10, 3,212, 6, 75,145, 17, 99, 97,212,228, 34,242,194,246, 44,155, 65,189, 10,255, 17, 74, 53, 90, 86,179, 65,
-125,240,244, 45,143,217,243,191,231, 62,137, 79,176, 44,250,184,119,154, 94,163,234, 85,225, 72,214,115,252,242, 97,245, 61,127,
-197, 65,188,210, 92, 72, 88,176,132,224,248,205,172,103,205,133,108, 81,207,203,187,241,101, 47, 35,248,252,218,133, 29,123, 77,
- 63, 27, 25,163,222,165,215,103,187, 60,126,178,162, 0, 0,184, 92,238,179, 87,113,223, 44,131,193, 96, 42,167, 9,101,199,150,
- 45, 91,102, 77,153, 50, 69,244,244,233, 83,196,199,199,163,176,176, 16, 98,177, 24,167, 79,159,182,128,181,174,136,252,253,112,
- 82, 76, 68,248, 55,193, 77,187, 87, 10,105,213, 11, 82,169, 12, 60,226,120,103, 76,169,119,237,225, 77, 59,244,251,161,203,128,
-137, 56,119,120, 11,185,125,249,216, 84,189, 34,118,115, 69,207,101, 97, 97, 97, 52,128,184, 21, 43, 86, 52,218,186,117,107,245,
- 25, 51,102, 36,236,248, 97,254, 58, 0,200,203,203, 3, 0,220,189,123,151, 76,157, 58,213,104, 48, 24, 18, 11, 10, 10, 34, 80,
-206, 0, 8, 0,208, 43,164, 75,182,110, 88,214,224,105,122,230,192, 26, 13,154,195,171,122,115,248, 6,181, 64,129,218,140, 91,
- 79, 50,144,240,232, 60, 30, 93, 61,112, 82, 39,183,206, 71, 5,231, 55,110,216,176, 97, 32,135,195,169,166,209,104,124,235,213,
-171,215, 80, 38,147,221,109,216,176, 97, 99, 30,143,151,118,231,206,157,228,138,104,165, 92,222,110,172,210, 97,236,218, 20,181,
- 83,167,132, 44, 93,227, 20,181,211, 93,157,200,229, 51,197,133,181,198, 95,184, 1,171,136, 57, 55,122,255,118,213,193,223, 54,
-175,228,142,154,244,185, 45, 74,233,246, 49, 79, 34, 60, 91,177,112, 53, 39,243,131, 49,253,255,156,222,161, 40,146, 85,244,183,
- 67, 97,122,165, 50, 82, 9, 96, 86,228, 67,254, 15, 81, 31, 79, 94, 24,218,172,205,232,246,239, 12,227, 88, 5,114,156, 57,252,
- 35, 73,140,188,176,159, 71,108, 95,233, 29, 88, 13,160,220,230, 32,147,201, 17,147,245,106, 26,159,202, 58,238,223,253,243,216,
-131,135, 15, 45, 29,208,175,191,199,134,175,223,197,247, 63, 29,129, 76, 34, 2, 97, 89,188,219, 41,112,200, 55, 19,234,244, 13,
-244, 17, 7, 28,188,152,118,101,218,234,168, 89, 58,157, 57,214,129, 72, 12,201,205,205,189, 42,151,203, 21,109,219,182,109, 41,
- 18,137,152,220,220, 92,158,183,183,183,213,197,197,197,148,150,150,166, 51, 26,141, 7, 1, 84,104,218,113,179,133, 69, 82,182,
- 1, 71, 15, 29,196,253,155,231,241,232, 81,140,250,209,195, 71,235, 25, 30, 89,173,205,142,203, 7, 42, 92,193, 7, 91,226,168,
- 67, 82,225, 81,135, 54,163,250,183, 29,155, 22,117,214, 25,140, 99, 27,182,238,141,170,117,219,112,204, 22, 27, 30,220,190,136,
-139, 7, 86,127,111,214,228,207,126,147, 60,246,175, 84,189, 22,225, 10,241,199,165, 19, 32, 44,187, 9, 0, 8,203,110,186,251,
-251,201, 41, 45,122, 77,128,187,119,213,134,133,169,119, 25,188,198,236,225, 2, 30, 71,123,234,224, 47,135,147,146,146,240,248,
-241, 99, 60,121,242, 4,249,249,249,248,237,183,164, 10,229,143,174, 32,249,108,236, 67, 78,143,193,239,142, 60, 62,100,248,123,
-226,234,181, 66, 56,193,149,220,224, 33,231, 33,230, 73, 50, 98,239, 68,178, 49,183, 78, 26,204,170,156, 1,250,130,228, 82,141,
-159,212,179,174, 15, 96,155, 93,188,118, 97,171, 86,109,130,191, 88,188,180,165,135,151,119,137,229,120,158, 34, 71, 56,115,218,
-177,224,235, 55,254,112,104,173, 67,214,102,203,155, 52,118, 24,203,181, 47, 20,138,103,113,234,162,179,103,175, 76,217,247, 19,
-214, 90,110, 4,255,253,129,237, 96,101, 89,104,245,102,168,180, 70, 40,213, 6,100,230,228,225,126,100, 36, 46, 31, 63,134,248,
-152,251,137, 22,147, 41,156,195, 97, 14,232,179, 99, 47, 87,172,165,137, 87,221,195,221, 29,137,249, 26,136,133, 60, 36,199,222,
- 49,106, 85,202, 93,175,123, 29,233,243,226, 50,115,184, 76,247, 97,195,134,159,238,220,163,159, 75,179,214, 93,165,158,206,174,
- 16,240, 8,226,146, 50, 16,113,237,180, 54,225,254, 21,149,197,164,233,249, 54, 86,125,249, 31,167,252, 81,135,102,163,182,239,
-136,254, 29, 14,113,185, 60, 33,203, 90,141,102,147,113,240,155,152,172,191, 10, 66,108,105, 99, 71, 12,124,161,110, 96,101,137,
-100,196,208, 51,250,231,235, 10, 22, 27,145,142, 24,122, 77,103, 47, 64, 74,239,216,231,231,231,222,187,120,237,194,148,148,188,
-219,249,249,198,139, 0,210, 12, 6,195,107,167, 49, 59, 59,123,225,226,197,139,251,232,116,186, 58, 29, 59,118, 20, 57, 59, 59,
- 35, 47, 47, 15,225,225,225,150,176,176,176,135, 57, 57, 57,223, 0, 57, 86, 61, 26,255, 26,105, 56, 60, 38,230, 78,248, 55,117,
-154,246,168, 20,210,186,151,227,133,153, 72, 50,177,115,191,241,204,185, 35, 91,200,173, 75, 71, 62,208, 43,226,126,122,131,211,
-106, 54, 24, 12, 55, 13, 6, 67,212, 87, 95,125,213,204,199,199,199,231,155,111,190, 17,171, 84, 42,254,134, 13, 27, 12,185,185,
-185, 89, 42,149,234, 58,202,232, 79,243, 42,119, 45,202,116, 12, 58,117,112, 75, 39,114,112, 75, 55, 87,207,128,238, 46, 94,149,
-106, 22, 42,210, 19,149,138,140,112, 0,231,138, 38,138,172, 16,141, 26, 53,170,193, 48,204, 48, 0, 13,100, 50, 89,144, 92, 46,
- 23, 17, 66,234, 48, 12, 19,205,178,108,100,189,122,245,194, 30, 62,124, 88,161,201,100, 83, 46,111, 55, 6, 6,183,217,157,175,
- 99, 5, 38,142, 96,119,202,229,237, 70, 0,200, 57,251,133, 14,192,209,135, 29,103, 13, 58,118, 61,121, 93,116,129,203,116,197,
-165,165,199, 42,154,102,101,218,253,160,183,117,253, 27, 50, 31,166, 1, 24, 27,121, 7, 43, 31,220,189, 62,143, 33,224,219, 96,
- 93,164,207,121,114,231,109,232,243,249,124, 67, 64, 64, 64,137,163, 11, 69, 34,145,193,104, 44, 43,128,114,217,170,201,196, 86,
-160,195,246, 67,251,182,143, 61,114,236,232,210,246, 93, 6,120,136, 43, 85, 66, 53,111, 6,219,103, 55,153,126,254,174,226, 86,
-191, 47,174,108, 76,200, 48, 68,162,130,253, 97, 52, 26, 77, 44,128, 2,141, 70,211,159, 16,242,148, 97,152,192,130,130,130,123,
- 22,139,229, 65,133, 13, 1,139,145,173, 90, 53,255,141, 97, 24, 30,177,178,203,175,243,185,187, 13,153,143,210,240,134,203,146,
-132, 84,115,198,167,223,172,109, 82, 51,168,118,147,226,181, 14,235, 87,117,194,228, 89, 43,155, 84,173, 94,171,201,159,235, 31,
-150,219, 77,128, 88,116, 5,227, 14,253,188,252,202,221, 27, 23,191,244,244,171, 90, 53, 43, 45,225,209,211, 39,247, 22,218, 12,
-170, 67,111,154,207, 73, 79,162, 87,111, 93, 49,107, 70,102,122,226, 86,157, 34, 46, 10, 0,116,138,184,168, 71, 17,248, 58, 55,
- 43,109, 70, 94, 78,194,138,215, 61, 23, 90,173, 54, 99,215,174, 93,174,109,218,180,225,248,248,248, 64,161, 80,224,226,197,139,
- 44,203,178,233, 21,214,202, 79,188,168,205,103,220,127,253,233,135,229, 2,153, 83, 47,171,213,234, 79, 8,192,227,241, 50, 77,
- 58,213,105, 53, 71,246, 5, 10,146, 13,101, 63, 51, 88, 6, 0,167,120,237, 66,150,101,153,229,235,182, 39,243,197, 78, 37, 78,
-134,104, 49,168,165, 44,203, 58,188,214, 97, 97,106, 68,205,183,117,127, 51,132, 44,104,216,180,229,151, 22,139,217, 80,116,127,
- 24, 0, 24, 8, 65, 30,135,195, 92,230,178,150, 51,170, 55,168, 76, 49, 12,156, 9,195,131,147,132, 7, 6, 12, 52,202,124, 82,
-145, 62, 89, 37, 26,226,156,216,104, 93, 78,135, 42,167, 76,251,198, 92, 56,123,114,168,205,102,171, 86, 20, 51, 72, 50,234,181,
-251, 53,153,110,191, 2,119,172,248,247,115,162,216,108, 49,127,241, 15, 57,212,140,242,191,164, 25, 92, 93,210,191, 82,128,207,
-152,164,228,156, 91, 9, 79,117,191,226,197,101,117,222, 36,157, 92, 31, 31,159,175, 25,134, 25, 45, 20, 10,229, 38,147, 73, 75,
- 8,217,145,157,157,189, 16,175, 44,254,219,152, 47,241,214,143, 17,138,165,115,205, 6,237, 31,186,156,216,145,229, 29,187,212,
-171,118,119,177, 76, 54,203,160,215,238,208,101,199,110,127,203,231,211, 69, 36, 18, 53,150,203,229,252,220,220,220,155, 0,148,
-255, 75,249,222,176, 97,195,202, 28, 14,167, 26,203,178, 62, 0, 92, 96, 31, 21,146,203,227,241,210,139, 34, 90,164,162,154,109,
-223,223,239,217,165, 91,253, 79,195,175,196,172, 41,106, 86,124, 70,192,144, 85,226,209,189, 58,125,254,235,161,163, 37,141, 58,
-252,199, 93,243,255,127,154, 29,120,114,191,220,177, 28,161,203,162, 46,193, 6, 93,110, 70,250,212,171, 15, 20, 55, 1,168,223,
- 36,157, 2,129, 96,148,217,108,150, 8, 4, 2,189,217,108,222,245,191,114,236, 18,239,224,241, 28, 16,135, 87,166, 96,193,220,
-121,105,208,202,191,229, 90,226,134,132,132,180, 19, 8, 4,149,109, 54,155,212,100, 50,233,244,122,125, 82,114,114,242, 31, 40,
-125,225,243,191, 52,157, 50,239, 90,171, 5, 2,209,199, 0, 96, 54, 27,215,106,115,226, 62, 45,235,139,101,124,254, 31,157, 71,
-158,213,154,198,241,184,124, 47, 20, 77,204,205, 90,173,138,236,196,219,181,254,198,116, 82, 94, 51,115,169, 38,213,164,154, 84,
-243,101, 56,244,124, 82,205,191, 83, 83,236, 87, 55, 80,236, 87,215,225, 73,151, 75,249, 60, 61,159,148, 98, 38,149,240, 2,224,
-192,132,165, 20, 10,133,242, 23,192,210, 83, 64,249, 59, 49,100, 62,122,250, 87,126,158,242,159,163,212, 62,209, 76, 25,174,180,
- 34, 33,193,215,113,182,231,168, 38,213,164,154, 84,147,106, 82, 77,170,249,159,211, 44, 79,251,159,216, 36, 57,233,165,237, 19,
- 0,254, 95, 58,252,211,176, 42,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,107, 60, 51, 94, 28,122, 46, 40, 20, 10,133, 66,
-161, 80,254, 26,104, 31, 45, 10,133, 66,161, 80, 40,148, 55,163,164,166, 67,106,180, 40, 20, 10,133, 66,161, 80,222, 2,165,118,
-134,167, 77,135, 20, 10,133, 66,161, 80, 40,111, 70,113, 68,203, 15, 47, 77,239, 64,141, 22,133, 66,161, 80, 40, 20,202,219, 33,
- 19, 37, 69,183,194,194,194, 72, 73,127, 83, 40, 20, 10,133, 66,161,252,127,240, 15,247, 34,207, 71,178, 38, 21,109, 3,120, 46,
-162, 69, 13, 22,133, 66,161, 80, 40,148,255, 21,179,245, 15,163, 56,146, 85,252,202,124,197,104,245,233,211,135,161,102,139, 66,
-161, 80, 40, 20,202,223,197,191,209,139,112, 94, 62, 64,154,205, 20, 10,133, 66,161, 80,254, 78,179,245,111, 58, 30, 58,189, 3,
-133, 66,161, 80, 40, 20,202,155,225, 7,160,247,115,219,255,111, 75,240, 80, 40, 20, 10,133, 66,161,252,219,153, 84,218, 54,141,
-104, 81, 40, 20, 10,133, 66,161,188,125,179, 69,161, 80, 40, 20, 10,133, 66,249, 39, 67, 87, 54,167,154, 84,147,106, 82, 77,170,
- 73, 53,169,230,191,157,226,121,180,128,210,230,209,162, 80, 40, 20, 10,133, 66,161,188, 22,189, 97,159, 63,107, 82,209,123,111,
-106,180, 40, 20, 10,133, 66,161, 80,222, 46,175, 44,191, 67,141, 22,133, 66,161, 80, 40, 20,202,219, 53, 88,155,169,209,162, 80,
- 40, 20, 10,133, 66,249,139,161, 70,139, 66,161, 80, 40, 20, 10,229, 47,130, 65,233, 35, 7,206, 85, 64,231,117, 70, 31,156,163,
-154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 60,237,115,248,231, 81, 60, 51,252, 9,252,217, 17,126,243,255,199, 15,
-211,161,175, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,183, 51,233,165,247,103,208,166, 67, 10,133, 66,161, 80, 40,148,183,
-107,182,232, 18, 60, 20, 10,133, 66,161, 80, 40,111,137, 82,155, 9,105, 68,139, 66,161, 80, 40, 20, 10,229,205, 40,117, 81,105,
-106,180, 40, 20, 10,133, 66,161, 80,254, 26,195, 69,141, 22,133, 66,161, 80, 40, 20,202, 91, 52, 89,147, 74,252,111, 88, 88, 24,
-161,231,136, 66,161, 80, 40, 20,202,223,197,191,214,139, 20, 31, 24, 53, 91, 20, 10,133, 66,161, 80,168, 23,169, 48,126,248,115,
-180,225,164,162,109, 0,116,212, 33,133, 66,161, 80, 40, 20,202,155,210, 27, 47,142, 60,156, 84,188, 77,141, 22,133, 66,161, 80,
- 40, 20,202,155, 51,169,204,255,210,102, 67, 10,133, 66,161, 80, 40,127, 39,255, 70, 47,194,208,108,165, 80, 40, 20, 10,133, 66,
-121, 35, 74,138,102,109,166,167,133, 66,161, 80, 40, 20, 10,229,175, 53, 92, 20, 10,133, 66,161, 80, 40,148,191,194,100,253,213,
- 19,150,210,149,205,169, 38,213,164,154, 84,147,106, 82, 77,170,249, 95, 49, 89,207, 79,241, 0,128,142, 58,164, 80, 40, 20, 10,
-133, 66,121, 83,232,162,210, 20, 10,133, 66,161, 80, 40,127, 17,116, 81,105, 10,133, 66,161, 80, 40,148,255,103,195, 69,141, 22,
-133, 66,161, 80, 40, 20,202, 91, 52, 89, 47,152, 45,218, 71,139, 66,161, 80, 40, 20, 10,229,205, 40,181,143, 22,131,210, 71, 14,
-156,171,192, 15,188,206,232,131,115, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,207,105,150,167,125, 14,255,124, 38,225,255,
-105,194, 82, 58,244,149,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 53,232,244, 14, 20, 10,133, 66,161, 80, 40,111,219, 88,
-189, 12, 53, 90, 20, 10,133, 66,161, 80, 40,111, 6,157, 71,139, 66,161, 80, 40, 20, 10,229, 47,194, 15,246,168, 86,241,123, 99,
-106,180, 40, 20, 10,133, 66,161, 80,222, 14,189, 97,143,106, 21,191, 83,163, 69,161, 80, 40, 20, 10,133,242, 22, 41,113, 30, 45,
- 6, 0,194,194,194, 72,209,118,199, 62,125,250, 92,166,231,138, 66,161, 80, 40, 20,202,255, 39,255, 86, 47,242, 44,162,213,167,
- 79, 31, 6,192, 37,154,213, 20, 10,133, 66,161, 80,254, 14,254,141, 94,132,243,146,147,236, 72,179,153, 66,161, 80, 40, 20,202,
-223,193,191,209,139,240, 94,114,145, 20, 10,133, 66,161, 80, 40,127, 11,255, 96, 47,226, 7,123, 71,248, 19, 69,239, 64,209,148,
- 15,116, 30, 45, 10,133, 66,161, 80, 40,148, 55,163,120,180,225, 43, 75,239,208, 40, 22,133, 66,161, 80, 40, 20,202,155, 81,210,
-204,240,155,233,105,161, 80, 40, 20, 10,133, 66,249, 11,161, 17, 45, 10,133, 66,161, 80, 40,148, 55,231,249,168,214,255, 91, 52,
-139,174,108, 78, 53,169, 38,213,164,154, 84,147,106, 82,205,255,146,201,122, 97,155,206, 12, 79,161, 80, 40, 20, 10,133,242, 23,
- 65, 71, 29, 82, 40, 20, 10,133, 66,161,188, 25,197, 35, 14,159,223,166, 70,139, 66,161, 80, 40, 20, 10,229, 45,154,173, 87,160,
- 77,135, 20, 10,133, 66,161, 80, 40,111,198,164,210,254, 65,141, 22,133, 66,161, 80, 40, 20,202, 95,100,184, 24,148, 62,114,224,
- 92, 5,132, 95,103,244,193, 57,170, 73, 53,169, 38,213,164,154, 84,147,106,254,231, 52,203,211, 62,135,127, 30,127,219,132,165,
-116,232, 43,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,179,208,166, 67, 10,133, 66,161, 80, 40,148,255, 1,163,229,197,227,
-241,190,148, 72, 36, 27, 37, 18,201, 79, 60, 30,111, 5, 0,183,138,254,160, 76, 38,155,238,235,235,251,216,215,215, 55,173,114,
-229,202, 39,157,156,164,159,212, 16,161, 61, 0,254, 91, 58,158, 96, 0,159, 72, 36,146, 71, 98,177, 56, 25,192, 78, 0,159, 0,
-240,124, 19,225,133,254, 24, 28,245,113,255, 35, 11,253, 49,248,165,127,245,246,241,241,185, 10,160,251,219,202,148,225, 82,116,
- 29, 34, 67,234, 16, 25, 82,135, 75, 95,191,214,224,228,228, 52,218,207,207,239,186,135,135, 71,186,159,159,223, 53,177, 88, 60,
-164,130, 18,222, 62, 62, 62,223, 7, 6, 6,198,250,251,251,175,129,125,117,242,255, 89,218,137,208,174,165, 8,138, 86, 66,168,
-219, 8,177,177,149, 16,221,186, 1,210,215,148,107, 11,224,128,179,179,243, 61, 30,143, 23, 6, 96, 80,209,245, 53,136,199,227,
-133, 57, 59, 59,223, 3,112,160,232,115,175,115,157,126, 15, 32, 29,192,146,162,237,143, 2, 3, 3,213,161,161,161,201,161,161,
-161,191, 4, 5, 5,189,231,168,152, 84, 42,237, 22, 24, 24,120,176,114,229,202,201,173, 90,181,202, 15, 8, 8,136,169, 84,169,
-210,118,145, 72,212,145, 22,113, 20, 10,133,242,191, 79, 95, 0, 75, 1,172,143,140,140,140, 32,132, 68, 16, 66, 34, 34, 35, 35,
- 35, 0,108, 4,176, 12,165,135, 16, 95,216,239,225,225,177, 96,209,162, 69,134,204,204, 76,162, 80, 40, 72,108,108, 44, 89, 61,
-119, 22,219,195,157, 71,106,120,185,233,252,252,252,226,171, 84,170,180,167,190,156, 51, 11, 64, 77, 71, 52,159,195, 77, 34,145,
-220,156, 59,119,174,230,234,213,171, 26,147,201,164, 97, 89, 86,147,145,145,161, 57,119,238,156,166, 77,155, 54, 26, 0,159, 2,
-224, 86, 64,243, 25,223,250,227, 50,249,249,107,242,173, 63, 46, 63,191,191, 78,157, 58, 15, 89,150, 37,131, 7, 15, 54, 2, 8,
-168,136,230,203, 4, 0,226,250,206,112, 29, 34, 71,182,117,251, 66, 66, 54,204, 32, 67,100, 72,125, 29, 77,111,111,239,163,211,
-167, 79, 87,165,167,167, 19,163,209, 72, 82, 83, 83,201,228,201,147,149,222,222,222,187, 28, 60,118,143,144,144,144,236,235,215,
-175,179,133,133,133,228,210,165, 75,108,131, 6, 13,178, 29, 52, 91, 93, 95, 74,203,102,127,127,255,147, 21,121,121,123,123,111,
-173,104, 30,181, 16, 33,213, 28,113,145,144,219,225,228,216,224, 86,100,117,211, 74,100,144,187,176,176,173, 16, 31,117, 40,121,
- 42,147,210, 52,135,118,232,208, 65,251,224,193, 3, 91, 94, 94, 30,121,248,240, 33, 59,113,226, 68, 3,128,232,137, 19, 39, 26,
- 30, 62,124,200,230,229,229,145, 7, 15, 30,216, 58,116,232,160, 5, 48,161, 2,233,228, 0,216, 54,127,254,124, 66, 8, 33,139,
- 22, 45, 34,161,161,161,164,115,231,206, 68,163,209, 16, 66, 72, 50, 33,228, 23,171,213, 58,214, 17, 77, 23, 23,151,209,211,167,
- 79,215,232,116, 58, 82, 12,203,178,164,176,176,144,172, 95,191, 94,235,235,235,123,178,148, 74, 6,109,242,160,154, 84,147,106,
-254,175,105,254,147,241,131,189,159, 86,241,203,225,192,196,136, 89,179,102, 21,155,170, 83,109,219,182,189, 53,118,236,216,136,
-177, 99,199, 70,180,109,219,246, 18,128, 51,119,238,220,137,152, 57,115,102, 4,128, 17,229,100,132, 91,235,214,173, 11,179,178,
-178, 72,173, 90,181, 72,213,170, 85, 73, 86, 86, 22, 33,132,144,219, 67,155,144,243,117, 65,158, 94, 57, 69,194, 15, 31, 32, 19,
-253,120,164,157,159,139,197,207,215, 55,207,211,211,115, 49, 94, 92,147,177,164,204, 29, 88,183,110, 93,117,116,116,180, 38, 46,
- 46, 78,179, 96,193, 2, 77,231,206,157, 53, 33, 33, 33,154, 65,131, 6,105,214,173, 91,167, 49,155,205,154,173, 91,183,106,156,
-157,157,163, 75, 48, 91,175,109,180,120, 60,222,218,200,200, 72, 18, 31, 31, 79,138,162, 20,165,105,186,184,186,186,246,116,115,
-115,251,212,213,213,181, 39, 0, 23, 0,168, 5,200, 27,186,160,242, 71, 13,107,212, 9, 27,209,181,230,250,174,205,154, 12,113,
-226, 20, 90,126,152, 65,200,224,202,175,101,180, 92, 92, 92, 70,127,242,201, 39,106,163,209, 72,116, 58, 29,209,104, 52, 68,167,
-211, 17,181, 90, 77, 70,140, 24,161, 18,139,197, 3,203,211,244,244,244, 92,120,229,202, 21,107, 86, 86, 22,185,114,229, 10, 57,
-121,242, 36,217,176, 97, 3,235,237,237,189,170,162, 55,160,175,175,239,217,240,240,240,136,187,119,239, 70,220,188,121, 51,194,
- 98,177, 68,152,205,230, 8,179,217, 28, 17, 22, 22, 22,113,232,208,161,136,189,123,247, 70,152, 76,166, 8,147,201, 20, 97, 52,
- 26, 35,170, 87,175,126,186,162,121,212, 92,132,167,166,171,199, 8, 89,245, 33, 81,126, 55,149, 20,126,214,139,228, 76,110, 79,
- 54, 54,171, 68,218, 75,112, 28,175,174,237, 89,162, 38,159,207,191,156,156,156,204,206,153, 51,199, 84,175, 94, 61,229,184,113,
-227, 12, 70,163,145, 16, 66,136,209,104, 36,227,198,141, 51,212,171, 87, 79, 57,103,206, 28, 83, 82, 82, 18,203,227,241,206, 85,
- 32,157,203,138, 77,214,229,203,151,201,243,104, 52, 26,210,185,115,231,228,208,208,208, 95,170, 85,171, 54,178, 60, 77,185, 92,
-222,127,246,236,217, 26, 82, 2, 22,139,133,168,213,106,146,148,148,196, 86,173, 90, 53, 3,128, 7, 45,204,169, 38,213,164,154,
-212,104,253,101, 76, 42,103,187,228,147, 56,115,230,204, 8, 66, 72,196, 87, 95,125, 21, 81, 20,217, 18, 0,144, 23,189,120, 0,
-134,207,158, 61, 59,130, 16, 18, 49,107,214,172,226,207,148,150, 17,125,247,239,223,111, 94,179,102, 13,241,241,241, 33,190,190,
-190,100,237,218,181,132,101, 89,146, 21,182,139,156,175, 11,242,232,203, 49,132, 16, 66, 98, 23, 79, 35,231,235,130, 36,108,250,
-150,140, 26, 53, 74, 39,149, 74, 71,148,145,185,238, 77,154, 52, 81,235,245,122,205,246,237,219, 53, 82,169,244, 54,128,122,176,
- 55, 69, 50, 69,105,125,175, 94,189,122,170,168,168, 40,205,238,221,187, 53, 0, 22, 56,120,193,212, 4,208, 73, 38,147, 13,154,
- 29,192,143, 35, 63,127, 77,102,251,224, 1,128, 6, 0,188,138, 62,227, 63,107,214, 44, 66, 8, 33,129,129,129, 87, 74,209,116,
- 9, 9, 9,153, 21, 23, 23, 55,207, 98,177,204,187,123,247,238,188,218,181,107,207,233, 87,221,175,213,145, 17,221, 26, 43,191,
-157,218,152,172,252, 44,100,197, 59,205,187,238, 25,214,113,196,251,213, 60,175,142,243, 22,235,222,117,225,170, 95,106, 58,116,
-232,194, 14, 8, 8,184,153,154,154,250,204, 92,169,213,106,146,158,158, 78, 18, 19, 19,201,213,171, 87,137,159,159,223,249,242,
- 52,125,125,125, 31,166,166,166,146, 77,171, 87,147,193, 13,234,144,246,174, 78,164,131,155, 19,105, 42, 23,107,235, 2, 77, 43,
-106,180,238,221,187, 23, 1, 32, 2, 64, 68, 94, 94, 94, 68, 94, 94, 94, 68, 65, 65,193,179,125, 0, 34,148, 74,101,132, 82,169,
-140, 48,153, 76, 17, 53,106,212,168,176,209,106, 35, 70,155, 22, 98,228,183, 18, 65,223, 55,192, 51, 99,106,117, 79,219,141, 17,
-173, 72,193,135,157,201,154,198, 1,164,173, 16, 31, 57,168,217, 87, 40, 20, 94, 2, 48,163,200,148,143,233,217,179,167,142, 16,
- 66,122,246,236,169, 3, 48,166,104,255, 39, 69, 38,171,167,131,233,228, 4, 5, 5,105,139, 35, 89, 0,254, 8, 10, 10,210,134,
-134,134,146,208,208, 80, 18, 24, 24,168, 46,210,118,168, 64,171, 89,179,102,172, 94,175,127,102, 0, 11, 11, 11, 73, 70, 70, 6,
- 73, 72, 72, 32,209,209,209,228,246,237,219, 36, 57, 57,153,236,219,183,207,230,234,234,122,130, 22,230, 84,147,106, 82, 77,106,
-180,254, 82,163,245,242,235, 69,194,194,194,200, 75,187,190,187,115,231, 78,196,236,217,179, 35,202,113,102,147,190,250,234,171,
-226,168,215,210, 50, 30,254, 91, 99, 99, 99,201,152, 49, 99, 72,112,112, 48, 9, 14, 14, 38, 99,199,142, 37, 74,165,146,104,158,
- 68,145,243,117, 65,110,191,219,148, 16, 66,136,250,209, 93,114,190, 46, 72,196,168,214,228,254,253,251,164, 82,165, 74,225,101,
-252,254,241,107,215,174, 41,118,237,218,149, 5,123,127, 44, 62,128,150, 0,214, 74, 36,146,109,176, 55, 23, 86, 5,224, 86,171,
- 86,173,124,157, 78,167, 25, 60,120,176, 6, 64,229, 50, 52, 59, 4, 7, 7,199,111,221,186,149,228,228,228,144,252,252,124,178,
-188, 77,109, 66,126,254,154, 44,106, 90,149,221,180,105,147,113,198,140, 25, 90,119,119,247, 48, 0,254,131, 7, 15,182, 18, 66,
- 72,251,246,237,179, 75, 18,115,117,117,237, 25, 23, 23, 55,207, 96, 48,204, 43, 44, 44,156,151,159,159, 63,239,216,145, 35,243,
-122, 52,168, 61, 70,249,237,212,198, 71, 70,116,107,252, 78,128,219,160, 85,221,155, 77, 73,159, 51, 97,240, 87,173,235, 61, 50,
- 44,251,248,226,208,234, 62,223,191, 78,110,123,121,121,101, 26,141, 70, 2,224,149, 87,124,124, 60,241,240,240, 72, 45, 79,195,
-221,221,253,171, 79,134, 15,179, 13,172, 26, 64,226,215,204, 37,150,179,187,137,229,228,118,242,228,187,207, 72, 63, 95, 79, 85,
- 75, 1,103,182,163,233,241,245,245, 61,123,243,230,205, 23,140, 86, 65, 65, 65,137, 70, 75,165, 82, 69,152, 76,166,136,160,160,
-160,211,111,122,213,183, 20,162, 70, 7, 9,247,246,221, 49,237,136, 98,106,103,210,211,133,159,252, 6,114,195, 1, 92, 2, 48,
-170,130,223,227, 0, 88, 86,108,168,190,251,238, 59, 66, 8, 33, 65, 65, 65, 90,188,217, 96, 20,151, 58,117,234, 36, 78,152, 48,
-193, 90,183,110,221,156, 54,109,218, 20,222,186,117,139, 92,190,124,153,156, 60,121,146, 28, 56,112,128, 68, 69, 69,145,244,244,
-116, 18, 27, 27, 75,122,247,238, 93, 8,160, 3, 45, 11, 41, 20,202,255, 50, 37,120,145,127, 60,156,226, 3,235,211,167, 15,243,
-220, 1,186, 0, 16, 55,109,218, 84,177,108,217,178,149,176,207, 5,193,132,112, 49,180,179,132,119,191,179,132,119, 63,132,139,
-161, 69, 17,163,205,139, 23, 47, 94, 24, 26, 26,154, 9, 64, 2,192,183,164, 31, 34,132,180,243,240,240, 64,106,106, 42, 92, 92,
- 92,224,226,226,130,212,212, 84, 16, 66, 96, 37,128,133, 0, 70,179, 25,122,189, 30, 6,150, 64,207, 2, 42,141, 6,190,190,190,
- 48,155,205, 53, 74, 73,127,195,119,223,125,183, 70, 72, 72,136, 98,230,204,153, 25,176,247,149,217, 54,126,252,248,179,127,252,
-241, 71,136, 70,163,201,143,142,142, 54, 52,104,208,160, 39, 0,223,184,184,184,209,235,215,175,199,152, 49, 99, 80,198, 67,167,
- 65,239,222,189, 79, 70, 69, 69,213, 24, 53,106, 20, 46, 93,186,132,229,203,151, 35, 55, 55,151, 0,128,209,104, 36, 54,155,205,
-220,186,117,107,243,154, 53,107,154,183,111,223,254,102,245,234,213,185, 0,144,152,152,248,164, 36, 65,134, 97,106, 87,169, 82,
- 5, 70,163, 17, 10,133, 2, 81, 81, 81,112,114,113, 65,100, 70,174, 79,199, 85,155,242,190, 60,114,150, 63,188,121,136,251,167,
-221,218, 24,151,132, 95,170, 85,207,223,199,199,100,182,248,198,102,102,103,188, 78,166, 10, 4,130,212,220,220, 92,152, 76, 38,
-232,245,122,168, 84, 42,228,229,229, 33, 55, 55, 23, 25, 25, 25, 16, 8, 4,241,229,105, 56,231,231, 95, 73,188,118,153,217,247,
-227,119,168, 97,205, 7,239,224, 90,240,142,110, 68, 77,147, 2, 63,205,157,236,100,242,240,154,239,236,228, 84,224,234,234,186,
- 25, 64, 80,121,122,141, 27, 55, 70, 94, 94, 30,242,242,242,224,225,225, 1, 55, 55, 55,184,185,185,161,176,176, 16, 74,165, 18,
- 42,149, 10,181,106,213, 66,195,134, 13,177, 99,199,142,183,114,113,223, 48, 33,193, 10,219,212,179, 49, 25, 16,200,100,168,238,
- 38,175,210, 76, 14,247, 50,190,210,153,207,231,239,119,119,119, 15, 7,240, 33, 0, 25,128, 15,221,221,221,195,249,124,254, 0,
- 0,139, 0,236,170, 96, 50,150,204,159, 63,127, 86, 92, 92,156,244,254,253,251,152, 57,115, 38, 22, 44, 88,128, 39, 79,158,252,
- 0,128, 45,250,204, 7, 30, 30, 30, 97, 28, 14,103, 11,128, 94, 0,122,250,249,249,117, 41, 71,119,192,140, 25, 51, 12, 77,154,
- 52,137,125,244,232,209,128,107,215,174, 53,253,236,179,207,148, 41, 41, 41,136,141,141,133,159,159, 31, 2, 3, 3,161,209,104,
- 80, 80, 80,128, 1, 3, 6,184, 56, 59, 59,143,160,197, 56,133, 66,249, 95, 54, 89, 47,121,145,127, 90, 68,171,196,237, 18,107,
-212, 82,169,116,126, 68, 68, 68,171,208,208, 80, 30,128,125, 0, 16,194,197,144, 1,173, 27,109, 59,178,249,187,208, 67,107,230,
-134,246, 8,173,181, 45,132,139,226, 81,108, 97, 77,155, 54,117,139,136,136,104, 45, 18,137, 62, 42, 37, 17, 4, 0,220,220,220,
-224,226,226, 2, 87, 87, 87,184,185,185,129,101, 89,104,116, 6,104,109,128,218, 96,130, 82,169,132,186,104, 91, 99, 52, 67,171,
-213, 62,251,110, 9,116,156, 48, 97,130, 98,253,250,245, 57,153,153,153,223, 1,104, 48,102,204,152,254,235,214,173,195,133, 11,
- 23, 12,189,130,107,122, 44,110,215,104, 97,189,204, 39,243,130,249,152, 8,224,202,149, 43, 87,208,186,117,107, 48, 12, 51,172,
- 36, 65,137, 68,178,113,207,158, 61,146,232,232,104,212,172, 89, 51,122,216,176, 97, 67,191,251,238,187, 26, 50, 77,254,239, 0,
- 96,205,203,138,158, 54,109,218,215,139, 23, 47, 86, 40, 20, 10,179, 78,167,251, 63,246,190, 59, 44,138,171,125,251,158,237,203,
-238,210,219,210, 85,138, 96, 65,197,222,176,183,136,157,216, 53,246, 88,162,209, 24, 99, 11,197,168,177, 68,141, 26, 19, 77,108,
- 17,141, 5, 81, 17, 99,195,222, 21, 80, 84, 4, 65,144, 38,101,105,203, 22,182,176,229,124,127, 32, 4, 13,213,188,239,239,123,
-147,204,125, 93,123, 45,236,156,185,231,156,153,115,102,238,121,206,115,158,199,110,248,240,225,200,204,204,196,155, 55,111,238,
-214, 34, 50, 95,198,197,197,145,210,210, 82,164,166,166, 34, 46, 46,206,228,235,175,191,238,100, 96, 48, 70,100,195,116,218,212,
-238, 29, 58, 77,234,210, 14,135,239, 61,225,220, 74, 74,179,232,208,196,201,242,113, 86,110, 83, 29,133, 87, 31,114,181,229,114,
-249,246,111,190,249, 70,161, 80, 40,144,157,157,141,167, 79,159,226,197,139, 23, 72, 79, 79,199,166, 77,155, 20,197,197,197, 59,
-234,227,112,228,179,190,216,188,100, 6,197, 74,184, 11, 60,185, 1,148,201, 1,149, 2,154,196, 88, 28, 72,204,195,174,147,167,
-184, 25,153,153, 22,199,142, 29,155,233,234,234, 26, 11,192,171, 46, 62, 66, 42, 46, 33,131,193,120, 95,132,130,193, 96,200, 1,
-228, 9,133,194, 44, 83, 83,211, 44, 6,131,145, 71, 8, 81,254, 71,222, 36,244, 40, 7,147, 9,112, 77,192, 96,215,153,218,243,
-227,113,227,198, 29,205,202,202, 26,148,154,154,218,117,199,142, 29,223,240,249,252,248, 29, 59,118,124,147,154,154,218, 53, 43,
- 43,107,208,184,113,227,142, 2,152,210,152,227,123,122,122, 46, 8, 14, 14,198,166, 77,155,208,182,109, 91,120,121,121,149,133,
-132,132,108, 7,176, 26,192,103,158,158,158,183, 23, 44, 88, 48, 93, 34,145,136,179,179,179,219,254,240,195, 15,115,182,111,223,
-222, 49, 39, 39,135, 95, 15,117,143,129, 3, 7,226,252,249,243, 0,144, 11, 32,181,168,168, 72,159,147,147, 3, 31, 31, 31,116,
-234,212, 9, 10,133, 2, 10,133, 2, 82,169, 20,110,110,110, 48, 26,141, 93,233, 91, 57, 13, 26, 52,104,252,159, 10,174,154,133,
- 22,159,207,183,244,243,243, 67,179,102,205, 44,241,118,181,150, 53,151,181, 98,241,204,241, 2, 81,236, 5, 80,113, 87, 48,174,
-103, 43,129, 53,151,181,226,237, 46, 44, 55, 55, 55,158,159,159, 31,132, 66,161, 83, 45, 7,191,158,151,151, 7, 63, 63, 63, 88,
- 88, 88,192,220,220, 28,126,126,126, 40, 47, 47, 71,169, 92, 14,165, 1, 40,211, 25, 81, 90, 90,138,226,130,124,148, 25, 0,189,
-169, 53,210,211,211,193,100, 50,211,106,225,116,240,240,240, 40,136,143,143, 47, 0,112, 19,192,167,161,161,161, 88,190,124, 57,
-130,130,130,142, 10,114, 95, 15, 60,122,254,140,245,145,144,121,182, 94, 92,106, 60,128,242,172,172, 44, 88, 88, 88, 64, 40, 20,
-214, 40, 12,252,253,253,219, 11,133, 66, 28, 60,120,144,100,103,103,119, 71,197, 18,254, 52,138,170, 16,123, 38, 12,148, 2,216,
- 30, 27, 27,219,249,235,175,191, 78,234,223,191, 63,187, 75,151, 46, 88,187,118, 45, 0, 68,213,196, 41,149, 74,239, 79,153, 50,
- 69,123,237,218, 53, 36, 38, 38, 10, 79,159, 62, 29,184,118,237,218, 86, 25, 25, 25,188,179,191, 95, 24, 18,150, 37, 11,220,120,
-233, 22,127,221,197,235,247,109,204,132, 45,155,218, 88, 33, 46,227, 13,199,192,196,195,250,174,104,103, 54,115,102,111, 62, 43,
-174, 39,143,145,219,155,207, 66,159, 74, 59, 0, 0, 32, 0, 73, 68, 65, 84,138,237,200,102,206,144,203,229,199, 34, 35, 35, 47,
- 46, 89,178, 68, 33,145, 72, 96,106,106,138,162,162, 34,172, 95,191, 94, 17, 23, 23,119, 82,171,213,158,173,143,215, 96, 36,237,
- 93,154,184, 2,175,226,171,126, 43, 55, 18, 60,212,114, 16,240,233, 34,120,251,248, 64,171,213,162,117,235,214, 84,104,104,168,
-208,220,220,252,203,122, 69, 15,227, 79,221, 77, 79, 81, 84, 30, 33,228,141, 66,161,200, 54, 49, 49,201,224,112, 56, 25,197,197,
-197,217,132,144,252,255,132,206, 34, 12,124,209,173,181, 39,192, 51, 65, 70,145, 34,231,145, 2,197, 53, 21, 52, 53, 53,157,177,
-107,215, 46,254,190,125,251,116, 11, 22, 44,208,204,153, 51,135,173, 82,169,236,230,204,153,195, 94,176, 96,129,102,223,190,125,
-186, 93,187,118,241, 69, 34,209,232, 15,169,136, 78,167, 67,124,124,252,198,148,148, 20, 33, 42,194,141, 44, 10, 9, 9,153,154,
-156,156,204,223,185,115, 39,194,195,195, 17, 30, 30,142, 17, 35, 70, 96,225,194,133, 8, 14, 14,174,139, 78,208,166, 77, 27, 63,
-107,107,107,220,184,113, 35, 7, 64, 6,128,246, 34,145,200,116,196,136, 17, 24, 52,104, 16,212,106, 53,202,203,203,171,132, 22,
-147,201,132,133,133,133, 53,125, 15,164, 65,131, 6,141,255,186,200,122, 71,108,177, 0,160,210, 84, 23, 16, 16, 64,213,245, 96,
- 52,148, 72, 32, 85,150, 33,189,180, 12,153, 37,198,119,182, 25,141,198, 58,143,158,147,147,115,246,222,189,123, 51,252,252,252,
- 88, 57, 57, 21, 51, 98,126,126,126, 40, 43, 43, 67,206,147, 7, 80, 26, 1,161,135, 47,148, 74, 37, 74, 94, 60,134,168, 77, 87,
- 88, 15,157,132,173, 59,119,106,138,138,138,118,215,196,201,229,114,217,206,206,206, 5,105,105,105,122, 0,197,230,230,230, 3,
- 93, 93, 93,113,253,250,117, 0, 56, 76,128,205,136,187, 6,220,136, 0,169, 48,169,136,220,220,220, 32,145, 72,160, 80, 40,174,
-215,196,121,239,222,189,100,157, 78,215,122,248,240,225,212,175,191,254,122, 92, 38,147, 5, 1,120,170, 49,130,249, 36, 43, 31,
- 74, 3,248, 0, 6, 88, 90, 90,126, 30, 28, 28,220,111,193,130, 5,136,140,140,196,165, 75,151,202, 81,225, 11,118,175, 6,218,
-210,212,212,212, 61, 75,151, 46,237,194, 96, 48, 62,189,124,249,178,222,203,203, 75, 86, 94, 94,110,104,238,237,205, 8, 10, 93,
-195,153,255,233,108,139,162, 50, 36, 12,106,238,208,141,162,128,132, 55,146,140, 20, 5,138,234, 58,167,254, 92,102,212,200,238,
-109,252,103,140, 27, 38, 18,122,180,132,242,217, 3,241,158, 19,191,111, 53,137, 75, 14,184, 33,145,140,136,140,140, 12,188,126,
-253,250,124,173, 86,219,140,199,227,189,146, 74,165,223, 43, 20,138,122, 69, 22,147,201, 28,170,113,112,182,148, 22, 23,131,255,
-214, 18, 37,211, 25, 81,168,209, 35,209,194, 11, 19,156, 93,170,166, 65,243,242,242, 32, 22,139, 41,131,193, 48,172, 46,206, 75,
-151, 46, 33, 32, 32,160, 82,120,130,162, 40, 80, 20, 85,232,237,237,157,207,227,241,138, 56, 28,142,108,243,230,205,106,181, 90,
- 13, 22,139,197, 55, 24, 12,204,191,210,219, 59, 9, 96,199, 35,212,143,115,134,247,233,223,182,165, 15,185,249,232, 9, 85, 82,
-166, 62, 80,135, 21,240, 7, 79, 79, 79, 86,113,113,241, 89, 0,137, 58,157,238,200,241,227,199,249,147, 39, 79, 86,159, 56,113,
- 98, 34, 0,247, 45, 91,182, 4, 42, 20,138, 70,165, 84, 72, 73, 73,249, 97,221,186,117, 95,173, 90,181, 10,135, 14, 29, 90,144,
-146,146,178,252,173,165,107, 68,112,112, 48, 54,111,222,140, 67,135, 14, 25, 19, 19, 19,127, 55, 26,141, 41, 75,150, 44,105, 99,
-111,111, 95,152,155,155,155, 82, 7,109,135,193,131, 7,107,110,223,190,205,149,203,229,183, 0,124, 62,119,238,220,153,157, 59,
-119,150,141, 27, 55, 78, 84, 92, 92, 44, 21, 8, 4,220,189,123,247, 90,178, 88, 44, 40,149, 74, 80, 20, 5,185, 92,174,165,239,
-131, 52,104,208,248, 95, 69,109, 90,228,111,130, 90,159, 13,172,154, 26, 88, 86, 86,150,159,153,153,233,243,230,205, 27, 61, 0,
- 61, 0, 20,105,245,223,174,219, 27,177,111,116, 23, 79, 97,174, 78,135,211,143,158,151, 21,105,245,149,206,239,250, 55,111,222,
-200, 51, 50, 50, 76, 85, 42,149,162,150, 99,221,253,241,199, 31, 85,215,174, 93, 51, 77, 77, 77,133,193, 96, 64,251,246,237,241,
-242,229, 75,148, 36,198, 67,232,211, 30,194, 94, 1,120, 30,251, 8,113,151,162,241, 90,161,213, 39,173, 94, 87,170, 80, 42,131,
-203,203,203, 79,215, 68,200,102,179,139, 1, 16, 66,136, 1, 0,100, 50,217, 83,133, 66,209,211,222,222, 30, 9, 9, 9, 66,165,
- 1, 11, 3, 87,108,221, 65, 8, 49,112, 42, 86,115, 45, 30, 55,110, 28, 98, 98, 98, 0, 32,166, 38, 78,153, 76,182, 96,214,172,
- 89,215, 14, 30, 60,200, 74, 77, 77, 29,180,111,223,190, 65, 73, 73, 73,132, 42,206, 52,220, 46, 99,195,125,234,194,142, 63,185,
-121, 95, 10, 8, 8,128,131,131, 3,246,238,221,139,239,191,255, 94, 55,111,222,188,228,239,191,255,190,163, 68, 34, 57, 82, 75,
-251, 75,165, 82,233, 5,107,107,235,249,173, 90,181,146, 43,149, 74, 20, 21, 21, 33, 39, 39, 7, 86,214,214, 12, 61, 24,221,108,
- 45, 44,142,156,205,147, 11, 89, 23,238,227, 65,118,110,157,214,172, 46,108,230,148,209,254,237,252, 63, 91,181, 66,132,219,167,
- 65,205, 10, 6,217,247, 13, 22,125, 18,104,170,214, 28,233,165,124,146, 62, 57, 86, 38, 11,147,201,100,225,141,236, 44,131,187,
-117,235,118,116,221,186,117, 38, 43, 55,173,195, 22, 31, 39,232,139,138, 80,160, 49,160, 80,163,135,172, 36, 17, 9, 9,207, 97,
-109,109,131,215,175, 95, 67,173, 86,227,197,139, 23,132,201,100,158,173,207,162, 83,137,106,211,133, 82, 30,143, 87,196,102,179,
-243, 89, 44, 86,113,106,106,170, 82,173, 86,131,193, 96, 8, 13, 6,131, 73, 3,234,234,108, 99, 99,179, 4, 21,193, 68, 35,229,
-133,133,219,253,216,176, 0, 11,189,221,108,172,135,172,158, 51,217,198,213,209, 78,154,154,252, 74,183,251,226,157, 66,181,166,
-246,197, 26, 0,162,138,139,139,171, 44,146, 39, 78,156, 88,116,226,196,137,153, 0,246,163, 34,239, 86,180, 84, 42,253,233, 3,
- 6,223,234,147, 39, 79,126,181,106,213, 42,152,152,152, 84, 5, 79, 53, 49, 49,225, 3,192,111,191,253,134,132,132,132,206,120,
-235,175,101, 52, 26,143,230,230,230,214,199,233,238,235,235,155, 26, 17, 17,193, 5,224, 56,119,238,220,174, 59,118,236,192, 39,
-159,124, 82,240,252,249,243, 46, 0,210, 0,184,127,250,233,167, 15, 15, 29, 58,100,105, 52, 26, 81, 82, 82, 2,173, 86,155, 70,
-223,202,105,208,160, 65,139,173,255, 10,252, 0,196,161, 34,126,214, 80, 0,231, 80,225,214, 81, 43, 92,222,170,179,139, 0,134,
- 87, 62, 31,107,113,134, 7, 42, 86,100, 93, 0,240, 11, 0,251,218, 72,173,173,173,191,156, 58,117,170, 46, 59, 59,155,228,229,
-229,145,240,240,112,178,120,198, 84,195, 0, 15, 71,163,135,163,189,210,214,214,246,165,131,141,213,129,118, 2, 44, 6,224,220,
-128,134, 77, 77, 74, 74,154, 61,117,234,212, 25,111,143, 59,227,232,209,163,138,203,151, 47, 43,152, 76,102, 20, 42, 66, 59, 84,
- 10,202, 41,195,134, 13, 83,104, 52, 26,133,183,183,119, 49, 42, 28,247,107, 67, 96,239,222,189, 75,206,159, 63, 79, 12, 6,195,
-159, 98, 20, 21, 20, 20,144, 75,151, 46,145,238,221,187, 75, 1, 76,238,215,175,223,245, 59,119,238, 92,239,209,163,199,201,250,
- 42,108, 99, 99,179,226,201,147, 39, 49,233,233,233,177,231,206,157,139, 61,114,228, 72,236,167,159,126,250,180, 77,155, 54,170,
-228,228,100,163, 94,175, 39, 79, 30, 63, 38,222,205,155, 43, 1,184,213,198,211,215,132,245, 80,182,247, 27,162, 94,251, 9, 81,
-143,116, 33, 0,136,124,235,151, 36,127, 65,127,242,114,254, 16,210,135,207,188,247, 33, 61,197,202,202,234, 98, 76, 76, 12,145,
-203,229,228,217,179,103,100, 74,192, 32,114,111,102,127,114, 97,144, 39, 57,212,171, 41,217, 58,176, 13, 25,212,171, 39,249,241,
-199, 31, 73, 68, 68, 4, 89,177, 98,133,209,198,198, 70,142, 58,124,180,196, 98,241,229,227,199,143,199, 2,136,101, 50,153,177,
- 50,153, 44, 86, 46,151,159,205,202,202,218,229,237,237,253, 85,171, 86,173, 38,250,248,248,244,237,211,212,237,171,126,166,188,
-151,253,205,248,175,154,139, 4, 91,241,231,184, 87, 85, 48, 7,220, 60,220,221,229, 55,110,220, 48,106, 52, 26,114,235,214, 45,
- 99,139,230, 94,234, 45, 99, 7,159,124,189,119,195, 73,245,249, 95, 47,150,157,249,249,206,137,105, 1,241,189, 5,140, 95,187,
- 10,171,194,113,124, 40,198, 3, 56,141, 63, 86, 29, 78, 5,112, 6,117,175, 66,100, 0,216,191,118,237,218,234, 43, 13, 1,128,
-209,166, 77,155, 88, 66, 72,108,155, 54,109, 98, 27, 91, 17,129, 64,176, 36, 50, 50, 50,196,213,213,117,211,184,113,227,246, 74,
-165,210,115, 19, 39, 78,140, 71,197, 98, 16, 10, 21,217, 17,134, 57, 59, 59, 23,196,197,197,145,235,215,175,147, 49, 99,198,200,
- 57, 28,206, 36,250, 54, 78,131, 6, 13, 26,255, 21,204,174,229,187, 78,172,139,143,143,175,140,161, 53,183, 46,242,229,203,151,
-199,198,196,196,196,162, 34, 74,124,157, 96,177, 88,167,230,205,155, 71,236,237,237, 21,118,118,118,167,216, 76,230, 76, 23, 19,
-248,225,195,150,186,247, 12, 11, 11, 27,241,195, 15, 63, 12, 5,208, 25, 0,219,201,201, 41, 39, 47, 47, 79,113,231,206, 29, 69,
-247,238,221, 21, 54, 54, 54, 18, 95, 95, 95,197,150, 45, 91, 20, 58,157, 78,177,100,201, 18, 5,254, 28,239,171, 38,240, 1,204,
-231,114,185,167, 90,180,104, 17,191,122,120, 95,221,166,133, 51,201, 84, 79, 91, 5,128, 31, 0,204, 3, 96, 1,128, 29, 24, 24,
-120,229,197,139, 23, 23,125,125,125,247, 52,128,215,177, 85,171, 86, 87,143, 30, 61, 26, 19, 17, 17, 17,251,229,151, 95,198, 88,
- 91, 91,103, 39, 39, 39, 27,213,106, 53, 41, 41, 41, 33, 82,169,148,156, 59,119,206, 96,101,101,181,179,214,134,243,152,185,228,
-210,225, 26, 67, 56,100,173,154, 68,186,115, 25,111, 62,164,167, 8,133,194,226,162,162, 34,146,151,151, 71, 82, 83, 83,201,201,
-147, 39,201,224,110,157,200,177, 79, 71,147,195, 51, 70,144,205,131, 59,145,206,166,124,165,216, 84, 20, 99,106,106, 42,105,200,
-170, 67,177, 88,124, 89,163,209, 84,133,111,112,118,118,142,245,246,246,142,240,245,245,221, 26, 25, 25,185,104,219,182,109, 35,
-250, 52,117,251,106,253,160,110,170,178,232, 19, 68,126,252, 7,178,188,189,151,250,173,152,175, 17, 78,214, 86, 97, 55,174, 95,
- 55, 86,138, 95,189, 94, 79, 78,159, 58, 69,198, 14, 25, 16, 95,122,225,183, 95,110, 5, 47, 56,186,164,189,215,233,238,124,140,
-175, 75,176, 85,189,138,136, 96,237,111,198,216,245,145,171, 85,110, 79,115,198, 15, 93, 76,223, 73, 47, 53,214,203,203, 43,149,
- 16,146,235,227,227,147, 10,224,176,143,143, 79,245,255,167,213, 66, 91, 21,156, 52, 36, 36,132,188, 29, 31, 12, 0, 65,235,214,
-173,139, 37,132,196,122,122,122,222, 6,128,182, 66,216,244, 50,103,252, 50,220,221,190,168,151, 57,227,151,182,194,154, 83, 70,
-185,113,208,188,167,173,224,214, 8, 79, 7,121,111, 39,243,155,135, 15,236,219,244,209, 71, 31,237, 5,176, 19,192, 55,214,214,
-214,183,198,143, 31,159,112,232,208,161,132, 45, 91,182,148, 39, 39, 39,147,233,211,167, 43,121, 60,222, 55,244,125,144, 6, 13,
- 26, 52,254,107,168,140, 12,239,208, 24,161, 53,236,171,175,190,138, 37,132, 84,198,210,154, 92, 67,153,225,171, 86,173,138, 37,
-132, 84, 70,135,127, 63,128, 89, 77, 1,205, 66,118,237,218, 69,120, 60,222, 47, 31,216,152,234,156,226,145, 35, 71,118,145,201,
-100, 29,237,237,237, 59,190,181, 92,185,216,216,216,164, 30, 57,114, 68,161, 82,169, 20,132, 16,133, 94,175, 87,196,196,196, 40,
-122,247,238,173,168,246,214, 95, 95, 61,223,193, 74, 49,110, 63, 90, 61,131,172, 20,227,246,123,155, 38,237,223,191,255,124, 90,
- 90,218, 89, 51, 51,179,101, 13,228,116,177,181,181, 13,178,178,178,186,104, 99, 99,179,210,202,202, 42,183,188,188,156,148,148,
-148,144,151, 47, 95,146,235,215,175,147,123,247,238, 17, 43, 43,171,236,218,234,217,207,132,117,191,100,211,124, 98,220,191,142,
-104,119,172, 32, 0,136,116,219,114, 82,248, 99, 40,121, 52,107, 16,233,205,103,222,253,128,243, 9, 11, 11,139,159, 79,157, 58,
-101, 76, 73, 73, 33, 81, 81, 81,228,220,185,115,100,225,194,133,164,185,163,131,166, 11,151,145,223,147,199,186,248, 33, 1, 75,
- 53, 26, 77,172, 76, 38,139, 85, 40, 20,177, 45, 90,180,136,237,212,169, 83, 68,151, 46, 93,182,158, 56,113, 98,209,250,245,235,
- 71,244, 51,229,189, 44,139, 62, 65,200,151, 67, 8,153,223,131,188,154,217,155,244, 53, 97, 61,169,149,211,222, 62,187, 50, 90,
-187, 82,169, 36, 55,111,222, 36, 87,175, 94, 37, 98, 27, 27,153,191, 9,115,118,119, 30,122,117, 55,131, 69, 67,235,217,199,156,
-113,224,254,143,223, 26, 84,231, 15,145,223,166, 14,209,247,182, 96,236,170, 86,238, 24, 33, 36,119,204,152, 49,175, 9, 33,185,
- 39, 79,158,204, 34,132,228,142, 30, 61,250, 53, 33, 36, 23,192,209,154, 56,223, 11, 78,186,255,173,200,154, 31, 18, 18, 18, 75,
- 8,137, 13, 9, 9,137, 5, 42,130,168,246, 50,103, 28,124,176,103,179, 81,115,238, 32, 57, 49,125,168,161,151, 57,227, 96,141,
-245,180, 96,157,141,219,191,141,104, 47, 30, 38,167, 22, 78, 52,244, 16,155,221,240,242,242,218,188,104,209,162,136,123,247,238,
- 61, 53, 24, 12, 9,169,169,169, 9, 59,119,238, 76,232,218,181,235,109,107,107,235,120, 46,151, 59,175,190,107,244, 31, 2,205,
- 73,115,210,156, 52, 39,141,247, 13, 76,117,108, 59,187,113,227, 70, 33, 33,100, 73, 96, 96, 32, 54,108,216, 48,182, 85,171, 86,
-227,157,156,156,108, 1, 32, 39, 39,167,236,217,179,103,178,192,192, 64, 4, 5, 5, 97,211,166, 77, 91, 81,225,203,242,127,137,
-188,211,167, 79, 59, 47, 88,176, 64,178,126,253,122,227,244,233,211,125, 0, 60, 43, 44, 44,108, 62,113,226,196,249, 44, 22, 43,
-208,205,205,205, 55, 55, 55,183, 64,165, 82, 29, 6,176, 7,245,204,153,214, 6, 30, 3,134, 14, 77, 28,112,145, 1, 67,181,159,
-135, 4, 5, 5,141, 27, 61,122,116,249,182,109,219,244, 50,153, 44,178,129,116, 89, 5, 5, 5,107, 42,255,177,178,178, 18, 63,
-121,242,100,158,157,157, 29, 35, 53, 53, 21, 26,141, 6, 41, 41, 41, 70, 84, 76, 77,213, 8,133,158,108,255,233,228,101,239, 37,
-147, 2,204,202, 18, 31,131,195,100, 66,199,230, 34,239,254, 69,236,191,153, 40, 83,150, 99,199,135,180, 83, 42,149,126,183,112,
-225,194,137,203,150, 45,227,187,185,185, 81,119,239,222,197,241,227,199, 53, 18,137,100, 48,128, 27,127,132,126,106, 28,140, 70,
- 35,184, 92, 46, 0, 96,249,242,229, 96, 48, 24,108,137, 68,194,165, 40,138, 71, 81,148,128,162, 40,166, 46, 45, 1, 70, 89, 9,
-242, 75,164,200,202,151,214,201,103, 48, 26,143, 63,120,240, 96,113,187,118,237, 24,143, 30, 61, 66, 65, 65, 1, 82, 82, 82,136,
-129,144,163, 55, 85,134, 10,167, 68, 77,195,235, 39,176,178, 30,217,214,146,199,224, 30, 8,130,191,150,193,220,109,196, 24, 84,
-196,210, 2,128,253, 20, 69,113, 0, 20,181,104,209,162,207,139, 23, 47, 76, 90,180,104,161, 74, 76, 76, 60, 79, 81,148, 19,128,
-131, 53,113,154,152,152, 20, 2, 40, 60,121,242, 36, 0,204, 66,197,201,107, 31, 28, 28,156,123,243,230, 77,132,132,132,228, 3,
-216, 5, 0, 34, 75,235,225,190,230, 28,138,251,107, 8,186,106,192,216, 97, 36, 53, 90, 93, 69,118,246,125, 91, 9, 25, 96,239,
-251, 26, 29,197,222, 12,174,190,188,117,104,104,232, 77,133, 66,161, 57,118,236,152,118,218,180,105,204,228,228,228,135, 0,110,
- 1, 56,137,183, 62,150, 52,104,208,160, 65,227,191,138,247, 45, 88,245,250,104,189,175, 90, 55, 0,248, 41, 41, 41,169, 42,169,
-116, 82, 82, 82, 44,128,221,168,136, 6, 63,172, 17,138,119,245, 91,139,214,158, 15,108,204,251,156,124, 63, 63, 63,147, 23, 47,
- 94,112, 80,115, 18, 71,234, 3, 56,255,132,154,114, 29,122,121,121,125,175,211,233, 34,118,239,222,125,130,201,100, 78,252, 11,
-106,223,205,211,211,179,228,200,145, 35,198,168,168, 40,178,122,245,106,131,131,131, 67, 9,254,236,163,245, 14,167, 63,151, 25,
-190,212,199, 73, 22, 51,185, 7,121,181,104, 56,185, 53,169, 55,153,237, 36,146,249,243,153,199,255,226, 91,137,167,185,185,249,
-126, 19, 19, 19,153,153,153,217,101, 0,221,254,202, 53,178,182,182, 62, 36, 22,139, 47, 87,255,216,219,219, 71,216,218,218,254,
- 96, 99, 99,179,218,194,194, 98,142, 59,159,187,109, 81,115, 71,117,252,200, 22, 36,186,187, 45,153,100,195,125,127,234,240,253,
-122, 58,184,187,187, 23,133,133,133, 25,207,158, 61, 75, 86,172, 88, 97,108,210,164,137, 12,117,248,181,213,105,209,178, 96, 30,
- 15, 31,221,197,152, 63,212,137,108,240, 49, 53,246,177,100,214,182, 66,113,210, 91, 1, 60,181, 62, 78, 15, 15,143,221,132,144,
- 3,107,215,174, 61,128, 63,114,129, 14, 8, 13, 13, 13, 38,132, 4,135,134,134, 6, 3, 24, 4, 0,254,230,140,176,195, 35, 58,
- 24,114, 62,114, 36,223,250,136, 12,254,230,140,176, 26, 45,153, 86,172,211,103,102, 14, 53,230,206,236, 78,130, 60,133,134, 46,
- 86,188, 43, 92, 46,119, 17, 42, 44,206,157, 0,112,233,183,102,154,147,230,164, 57,105,139,214,255,156,240,106, 16,196, 86, 86,
- 86,251,155, 53,107,118,194,205,205,237,132, 72, 36,218,138, 10,167,249,198, 94, 8,247,117,235,214,201,204,205,205,219,254, 7,
- 47,174, 29, 0, 39,252, 57,113,238,127,172,195,172,113,192,130,228,101, 99,159,172,113,192,130,106, 63,119,242,241,241,249, 22,
- 21,209,188,255,106, 39,116,179,178,178,218,105,101,101,149,253,214, 55,203,173, 33,156, 29,152,204,137,125,248,204,187,221,184,
-140,188, 62,124,214,157,142, 76,230,132,191,233, 0,172,107,177, 69,109,156,206, 54, 54, 54,219,172,172,172,114,108,108,108,118,
- 54, 82,100,189,195,217,214, 4, 14,125, 45,152,167,187,153, 82,202,190,230,204,147, 29, 4,181, 47,234,104, 68,219,253, 66, 66,
- 66, 62, 33,132,124,226,232,232, 24, 88, 77,248,251, 6, 5, 5, 5, 16, 66, 2, 42, 35,192,119, 18,192,174,183, 5,243, 72,119,
- 51, 74,218,219,130,121,164,147, 0,118,181,213,179,143, 5,243,120,119, 51, 74,234,111,198, 56,226,202, 67, 19,250,102, 78,115,
-210,156, 52, 39, 45,180,254, 25, 66,139,238, 48, 52, 39,205, 73,115,210,156, 52, 39,205, 73,115,210, 66,171,102, 97, 85,253, 83,
- 53,195,198,162,207, 13, 13, 26, 52,104,208,160, 65,131,198, 95, 66,173, 1, 75,169, 58, 84,105, 99, 28,219, 63, 68,217, 70,211,
-156, 52, 39,205, 73,115,210,156, 52, 39,205,249,175,227,172,143,251,255,122, 97,221,223, 26,180, 89,149,230,164, 57,105, 78,154,
-147,230,164, 57,105,206,127, 45, 24,244, 41,160, 65,131, 6, 13, 26, 52,104,208,248, 75,240,123,251,253,126,224,210,154,125,180,
- 88,157,214,230,235,245,122, 59, 0, 96,177, 88, 18,221,195,213, 14,117,177,179,129,126,250,138,244, 59, 96, 1,179,244,192,229,
- 26, 56, 47,235,245,122,203,183,156, 37,186,135,171, 7,213,201,217,105,237,197,234,229,245, 15, 87, 15,120,191, 12, 1,152,236,
- 78,107,115,222,171,171, 99, 67,207, 10,133,119, 98, 98,253,215,234,249,119,225,252, 55,131,221,121,109,190, 78, 87,209,143,216,
-108,150,164,252, 65,221,253,136,211,121,109, 78,245,242,186, 7,171,237,235,226, 20,152,240,138, 60,156,108,183,214,197,153,154,
- 83,184, 68, 89,166,182,174,139,179,177, 99,211,197,193,161,159,225,237,216,100, 2,179,178,115,115, 47,255,143,245,165, 14, 0,
- 86, 3, 48,171,246, 91, 60,128,207,233, 94, 73,131, 6,141,191,153,208,138, 67, 69,158,195,159,223,138,173,159,107, 21, 90,122,
-189,222, 46,246, 84, 48,148, 26,160,223,148,181,118,238, 35,247,252, 41, 81,178, 94, 93,194,149, 62, 63,230,203,212,201, 44,109,
- 89,229,102, 57, 57, 57, 20, 0, 80, 20,245, 11, 0,215, 26, 56, 45, 99, 79, 5,163, 76, 11,248,143, 15,181,116, 5,204, 10, 56,
-156, 47, 76,132,194, 62, 42,149,170, 21, 0,152,152,152, 60, 87, 41,149,215,108,203,203,183,188, 95,190,182,150, 85,175,107,223,
-201,107,237,124, 70,238, 89,104, 48, 26,185,111, 30,237,246, 87, 23, 38,179,216,122,205,174,149,192,249,224, 26, 68, 85, 45,124,
-127, 28,247,227, 21,214,108,160, 47,151,207,111,107, 97,105,217,211, 72, 72, 11,163,209, 72, 25,244,250, 4, 89,105,233, 45,163,
- 94,255, 68,175, 85, 90,199, 70,126,107,172,171,158,239,183,229, 99,128,117, 10, 8, 20,138, 68,125,152,108,118, 55, 0, 48,232,
-116,119,149, 10,197,181, 81, 64,120, 67,218,222,208,243,243,161,229,255,109,208,233,244,118,105, 23,131,161,209, 1,126, 99,190,
-181,107, 51,241,215, 35, 0,160,149, 60,177, 87, 36, 71,118, 6, 0,161, 71,192, 3,158,216, 47, 31, 0, 88, 25,185,118, 47,163,
- 86, 65,163, 3, 90, 4,132,218,213,199, 57, 45,232,184,245,178,217,163,121, 0,112,233,228, 15,205,175, 70,252, 52, 4, 0,250,
-142,158,123,126,224,152, 5, 47, 1, 96,211,207, 17,214, 71,191, 29, 91, 39,103,195,198,102, 41,167, 52, 57,202, 83, 43,203,181,
-112, 17,178,196,201,201,201, 12, 0,112,116,116,108,208,216,116, 6,204,115,129,249, 12, 38,179,167,135,167,167, 31, 0,146,250,
-234, 85,156, 65,175,191,237, 0,236,250, 15,247,165,133,132,188, 27,156,149,162, 40,186, 67,210,160, 65,227,239,134,115,111,197,
-213,185, 63,189,204,214,182,135, 82, 3,220, 72, 1,122,117,105,131,217, 19, 63, 18, 85,223, 22,190, 39,212, 53,249,209, 25,159,
-125,191,110, 97,180,105,211, 6,105,105,105, 13,170, 69,153, 22,184,158, 12, 64,250,194,180, 68, 40,124,181,109,243,102,179, 1,
- 3, 6,176, 28, 29, 29, 65, 81, 20,242,242,242,186, 68, 71, 71,119, 88,188,120,241,167,144,190, 40, 41,211, 66,126, 61,185,126,
-222,202,186,182,106,222, 4,171, 23,140, 53, 7,128,149, 83,118,117,120,148,148,111,245,234,213,171,126, 95,125,245, 85, 17,243,
-218,181,159,108,128, 3,249, 64, 86, 67,234,121,232,236, 3,190,121,238,111,238,147, 22, 44, 56,233,233,233, 41,114,115,115,163,
- 76, 77, 77,193,100, 50, 81, 82, 82,226,250,236,217,179, 33, 15, 31, 62, 84, 70,223,248,133, 27,243,112,120,170,132,223, 89,221,
-160,182,171,114,248,151, 76, 77,159, 79, 30, 53,202,121,236,216,177,124, 15, 15, 15, 0,192,171, 87,175,188,194,195,195,199,159,
- 60,121, 50, 8,170, 28,125,153, 22,234,250,218, 94,197, 9,128, 15,116,179,176,179,155,196,100,179, 91,233,245,122,167,183,214,
-134, 55, 6,157,238,185, 84, 34, 57,252,126,121, 26,127,134, 70, 7,188,200, 5,250,247,244,195,228,209,253,133, 0,240,213,184,
-117, 93, 50, 94,167,112,180, 90, 45,154,123,183,232,254,205,183, 91, 47,130,193, 64, 88, 68,116, 85,249,134,112,198,191, 72, 67,
-240, 55,219,144,243, 52,188,139,161, 52,165,143, 92, 86,202, 4, 0, 51,115,243,209,225,199,126,187,230,232, 27,120, 63,165,176,
-188, 65,156,117,141,205, 11,199,118, 58,100, 63,187,214,242,199, 75,251,217,174,174,174,120,250,244,105,227,198,102,105,146,169,
-209,193, 33, 97,203,151, 95,138,253,253,253, 33, 18,137,192, 98,177,160,215,235,251,223,190,125,187,127,112,112,240, 92,148, 38,
- 41, 27, 58, 54, 27,128, 45, 20, 69,245,153, 54,123,161,195, 71, 35, 2, 49,122,112,119,186, 35,210,160, 65,227,239,134, 74,235,
- 85,245,149,135, 63,215, 41,180, 88, 44,150,100,192,212,245,118, 61, 59,183,198,163, 39, 47, 75,211, 51,115, 21,149,219,138,159,
-135, 55, 31,209,221,169,229,205,155, 55,160,209,104,112,247,238, 93, 60,121,242, 4,175, 95,191,198,156, 57,115, 52,111,167, 14,
-107,226, 44,241, 31, 31,106,137,210,100,145, 23, 55,169,105,116, 98, 34, 83,173, 86,227,230,205,155, 40, 41, 41, 1,151,203,133,
-179,179, 51, 6, 14, 28,200, 74, 76, 76,180,234, 55, 96,176,185,255,224, 9,105, 48,247, 82,176, 88,172,146,218,242,136,176, 88,
- 44, 73,191, 41,107,237, 90,122, 53,193,171,244,156,210,213,223,238, 83, 24,141,132,149,250, 58,163,252,198,141, 27,240,243,243,
-195,229,203,151,173,139,139,139,191,222,181,107,215,106,246,198, 31,183,235,180, 69, 75, 81, 59, 95,137,255,248, 80, 75,107,201,
- 9,183,171, 23, 78,115,158, 63,127,206,217,189,123, 55,138,138,138,192,229,114, 97, 97, 97, 1,177, 88,140,230,205,155, 83, 43,
- 87,174, 20, 5, 4, 60,199,103,179, 2,221,202,221,103, 38,213, 86,207,170,182, 43, 50, 4, 54,178, 75, 30, 17,231,206, 49,122,
-244,232,241,206,107,123,179,102,205, 48,104,208, 32,254,164, 73,147, 60,198,142,159,104,244, 31, 58,237, 21, 68,110,101,245,114,
- 42,179, 76,172,203,238, 57,246, 31, 63, 62, 50, 52, 52,212, 66, 44, 22, 67, 40, 20, 2, 0, 74, 75, 75,157,211,211,211,187, 4,
- 5, 5,141,121, 16,127,140,229, 31,144,149, 3,161,139,170,174,243,249,111, 5,155,205,146, 84, 90,145, 76,133, 38, 37, 89,217,
-249, 74, 0,208,106,181,208,106,181,208,104, 52,152, 55,119, 14,115,214,152, 78,158,110, 61, 23, 62,126,253, 38,191,184, 69,244,
-125,171,202,125,117,245,112,178,202, 94, 75,165,153, 87,102, 5,127,249,165,216,222,254,143, 25,193,176, 67,135,152,197,197,197,
-253,131,131,131, 91, 18, 65,111,105,139,128, 80,139,186, 56,235, 26,155,210,151,231,154,126,179, 96, 80,219, 61,223, 70,193, 96,
- 48,224,222,189,123,184,121,243, 38,182,110,221, 74,206,159, 63, 95,106, 38, 20,206, 66,157, 99, 51,201,180,135, 67,158,251,198,
-141, 39, 41, 30,143,135, 51,103,206, 32, 49, 49, 17, 12, 6, 3,109,218,180,193,228,201,147,209,191,127,127,241,236,217,115,136,
-255,224,113,169, 48,247,150,255,197,190,196, 0,176,112, 69,240, 70,135, 41, 51,231, 99,211, 55, 43,105,161, 69,131, 6,141,191,
-179, 53,171,214, 16, 15,136,138,138, 34,111, 63,189, 0,128, 0,140,102, 35,247, 28, 61, 17, 99, 60,215,108,228,158,163, 4, 96,
- 16,128, 97, 6, 52,105,215,174,157, 78, 42,149,146,135, 15, 31,146,121,243,230, 41,183,111,223,126,237,220,185,115,225,250,242,
-242,189,142, 14, 14,223,145, 90, 28,236, 9,192,112, 3,204, 5, 2, 65, 65,102,102, 38,249,253,247,223, 73, 72, 72, 8, 57,124,
-248, 48, 57,127,254, 60,137,142,142, 38,231,207,159, 39, 71,143, 30, 37,241,241,241,228,229,203,151, 68, 40, 20, 22,184, 1,230,
-117,112, 50, 9,192,108, 62,114,247,210,147,143,116,161,222, 35,247, 44, 38, 0,211, 18,240,105,215,174,157, 33, 60, 60,156,132,
-133,133,145, 95,127,253,149,196,199,199,147,194,194, 66,194,226, 9, 11, 42,247,171,173,158, 4, 96, 56, 57, 57, 21, 72,165, 82,
-226,226,226, 66,184, 92, 46,177,183,183, 39,205,155, 55, 39, 93,186,116, 33, 67,134, 12, 33, 19, 39, 78, 36, 95,127,253, 53,145,
- 74,165,132,207,231,231, 87,238, 87, 27,167, 31, 96, 34, 20, 10, 51, 99, 99, 99, 73,109, 80,169, 84,164,176,176,144, 92,188,120,
-145, 8,133,194, 76, 63,192,164, 46, 78, 19,160,189,175,175,111, 65, 97, 97, 33, 41, 47, 47, 39,153,153,153,228,217,179,103, 36,
- 49, 49,145,100,102,102, 18,149, 74, 85,197,253,242,229, 75,226,238,238, 94, 96, 2,180, 39,244, 34,136, 90,251,210,251, 31, 87,
-123,251, 33, 98,177, 88,117,242,228, 73,242,230,205, 27,114,240,224, 65,194, 0,214,189, 95,174, 46, 78, 46, 48,176, 71,143, 30,
-134,123,247,238,145,199,143, 31,147,229,203,151,147, 65,131, 6,145,193,131, 7,147,224,224, 96,146,157,157, 77,178,179,179,201,
-144, 33, 67, 12, 92, 96, 96,125,253,179,166,177,105, 14,184, 6, 4, 4,168,202,203,203, 73,106,106, 42,105,213,170, 85, 54, 19,
-152, 36, 4, 90,246, 2,120,245,245, 79, 39,192,210,193,193, 33,247,222,189,123, 36, 34, 34,130,184,185,185, 21, 48,129,105,102,
- 64, 51, 51,160, 25, 19,152,214,172, 89,179,130,123,247,238,145,162,162, 34,226,234,234,154,235, 4, 88,254,133,190,196, 0,176,
-127, 69,240, 70,146,148,173, 36, 43,130, 55, 18, 0,153,132, 16,130, 26,124, 60,105,208,160,241,207,199,251, 90,228,159,130,170,
-155,100, 64, 64, 0, 5,224,122, 93,133, 85, 76,230,250, 77,155, 54,177,212,106, 53,246,237,219, 39,255,120,204,152, 19,189,122,
-246, 76,109,234,230, 38,165, 24,140,122,179, 13, 23,240,120,139, 54,109,218,100,161,213,106, 17, 19, 19,131, 14, 29, 58, 64, 44,
- 22, 67, 36, 18, 65, 36, 18,193,206,206, 14,222,222,222,144, 72, 36, 48, 53, 53,197,178,101,203,204, 11,120,188, 69,245,241, 26,
-141,132, 5, 0, 6,163,145,203, 1,102,187,119,236, 24, 19, 20, 20,196,176,182,182,134,149,149, 21, 68, 34, 17, 18, 19, 19,161,
-213,106, 33, 48, 17, 52, 40, 72, 43,131,193, 96,136, 68, 34, 92,189,122, 21, 11, 23, 46, 68,183,110,221, 96, 97, 97, 1, 83, 83,
- 83,180,106,213, 10, 3, 7, 14,196,172, 89,179,144,154,154, 10,170, 1, 78, 37, 9, 44,214,252, 89,179,102,217,249,249,249,213,
-184, 93,173, 86, 67, 42,149,162,160,160, 0,206,206,206, 8, 12, 12,180, 75, 96,177,230,215,198,103, 13,136,157,189,188, 34, 31,
- 62,124,104, 35, 20, 10, 17, 22, 22,134,211,167, 79,227,194,133, 11,248,253,247,223, 17, 21, 21,133, 51,103,206,160,160,160, 0,
- 0,224,229,229,133,227,199,143,219,136,236,236,162,172, 1, 49, 61,164, 27,134,140,252,252, 75,173,242,242,108, 38, 77,156,120,
- 75,161, 80, 96,210,164, 73, 88,191, 97,195, 74, 54,176,184, 33,251,123, 3,230, 86, 14, 14, 7, 54,110,220,200,200,203,203,195,
-168, 81,163, 10,183,108,216, 48, 35,238,226, 69,143,216, 11, 23, 60,214,135,134,206,232,213,171, 87, 97,118,118, 54, 14, 29, 58,
-196,176,119,117, 61,224, 13,152, 55,182,158,114, 96,225,247,223,127,207, 87,171,213, 24, 48, 96, 64,170,241,249,115,111, 61,240,
-155, 2, 72,188, 14,148,215,183,127, 46, 48,127,217,178,101, 98, 30,143,135, 47,190,248,162,176, 44, 35,163,181, 30,248,181, 20,
- 72, 47, 5,210,245,192,175,242,180,180,214, 83,166, 76, 41,228,241,120,216,182,109,155, 56,247,143,164,219, 13, 69, 7, 0,145,
- 0,110, 0,200,153, 54,123,225, 52,191, 78, 93,113,104,239, 46,124, 27,250,213, 1, 0, 31, 83, 20,117, 24,192, 82,186,231,209,
-160,241,239, 68, 67,180,200,255, 40,106, 77,185,195,170,174, 36, 1,244,174,139,197,210,218,186, 67,235,214,173,113,243,230, 77,
-248,250,250, 62,180,176,176,208,115,120, 60,176,217,108, 16, 99,189, 58, 11, 38, 66, 97,191,254,253,251,179,238,223,191, 15,119,
-119,119,152,152,152,128,205,102,191,243,225,112, 56,112,112,112,128, 76, 38, 67,191,126,253,216, 59,118,236,232, 7,141,230,155,
-122, 31,136,201,207, 68, 5,247, 55, 78,252,229,224,129,102,254,254,254, 40, 45,149,193,104, 52, 66, 32, 16, 64,171,213,130,197,
- 98, 85, 76, 1,233,136,172, 33,103,204, 96, 48, 24,152, 76, 38,220,221,221,177,126,253,122,168,213,106,112, 56, 28, 0,128, 76,
- 38,131, 84, 42,197,179,103,207,144,158,158,142,183,111,225,117,194,212,220,252,163,177, 99,199,214,152,240, 87,163,209,160,180,
-180, 20,165,165,165,144, 74,165, 80,171,213,232,218,181, 43,247, 92, 84,212, 71, 40, 42,218, 82,227, 62,124,254,152, 67,135, 14,
-217,113,185, 92,168, 84, 42,200,229,114,100,101,101, 33, 35, 35, 67, 45,145, 72,244,166,166,166, 12, 55, 55, 55, 6,143,199,227,
-141, 28, 57,146,146,201,100,160, 40, 10, 1, 1, 1,214, 71,194,194,198, 66,171,221, 74, 15,233,134,225, 18,160,105,175,213, 14,
-235,220,169,211,213,135,143, 30,249, 45, 90,180, 8,241,241,241, 27, 5,199,142,221, 40, 3,158,212,181,111, 42, 48,255,187,106,
- 2,134,100,100,248,150, 3, 5,213,138,164,187,165,165, 93,152, 50,101,202,211,248,248,120,155,109,219,182,137, 63, 30, 53,106,
- 62,128,117,141,169,163,169,185,121, 71, 7, 7, 7,156, 63,127, 30,153,175, 95,127,165, 7, 84,141,122,227, 98, 50,123,248,251,
-251,227,204,153, 51,200,206,200,248, 74,255,110, 29, 43, 94,148,128, 2, 86,106,234, 87, 7, 14, 28,216, 63,125,250,116, 48, 89,
-172, 30,208, 55,106,226,240, 79,142,239,211,231, 44,194,129,159,119, 28, 0, 48, 19,128, 17,192, 67,186,199,209,160,241,239,182,
-106,213,167, 69,254, 70, 98,235,231, 70, 91,180,236,236,236,156, 68, 34, 17,114,114,114,208,194,199, 71,194,227,241,192,101,179,
-193,231,114, 27, 84,131,178,178, 50, 95, 71, 71, 71,148,150,150,194,198,198, 6, 28, 14,167,234,195,229,114,171,254, 54, 53, 53,
- 5,131,193,128,171,171, 43,202,202,202,124,235,229,205,127,102,119,108,199,220,121,247,110,156,111, 54,106,212,104, 88, 90, 90,
-193,197,197, 25,118,118,118, 48, 49, 49,129,139,139, 11, 60, 60, 60,200,150, 45, 91, 32,176,107,211,160, 27,121,117,241,196, 98,
-177, 96, 48, 24,144,159,159,143,164,164, 36,196,199,199,227,222,189,123,120,252,248, 49,228,114, 57, 26,160,179, 80,166, 82,181,
-101,177, 88, 53,138, 44,169, 84, 10,169, 84, 90, 37,180, 10, 10, 10,144,158,158, 14,133, 82,217,174, 14,209, 59,186,117,235,214,
- 76, 0, 48, 49, 49, 65,187,118,237,176,103,207, 30,253,217,211,167,199,181,188,119,207,202,229,226, 69,139, 95,118,239, 30, 23,
- 24, 24,104,184,127,255, 62,100, 50, 25, 94,188,120, 1, 91, 91, 91, 22,151,207, 31, 75, 15,231,198, 33, 22, 80,218,200,229,131,
-187,117,235,150, 86, 90, 90,138,205,155, 55, 51,216,166,166, 63,135,214, 50,197, 87, 5, 38,179,187,191,191, 63, 34, 35, 35,145,
-147,145,177, 60,163, 6, 1,147, 1, 20,100,166,166, 46, 63,112,224, 0, 6, 14, 28, 8,138,197,106,180,163, 82,151, 46, 93, 90,
- 27,141, 70, 60,125,250, 20, 22,192,131,198,238,239,225,233,233, 87,105,249, 21, 2,183,106, 43, 39, 4,110,197,197,197,193,196,
-196, 4, 45, 90,182,108,223,200,195,108,161, 40, 42,119,250,156, 69,136,184,112, 7, 0,112,224,231, 29,249,213, 68, 22, 13, 26,
- 52,104,139,214,223,213,162, 85, 41,172,170,127,240,142,208,106,160,248, 0, 0,176,217,108,112,121, 60,112,185,220, 10,129,196,
-227, 53,152,131,162, 40,240,249,252, 42, 97, 85, 93, 96, 85,255, 91, 32, 16, 52, 72,192, 0, 64, 73,202,133,158, 51,103, 76,231,
-242,120, 60,104,181, 26, 16, 66,192,227,241, 97, 97, 97, 1,119,119,119,200,100, 50,116,235,222, 75,147, 37,229, 68, 89,183, 24,
- 25,255, 33,103, 79,175,215, 67,169, 84,162,164,164, 4,197,197,197,144,201,100, 80,169, 84, 13, 94,138,110, 52, 26,153, 89, 89,
- 89,248,237,183,223, 80, 84, 84, 4,160,194,209,186, 82, 92, 85,126,167,165,165, 33, 44, 44, 12,175, 95,191,110,212,245,233,217,
-179, 39,162,162,162,152,189,251,245,219,123,217,205, 45,231,178,155, 91, 78,239,126,253,246, 70, 70, 70, 50,157,156,156,144,158,
-158,142,152,152, 24,148,148,148,128, 16, 66,175,159,255, 0,188, 2, 74,202,138,139,167,175, 92,185,146,136, 68, 34,108,254,238,
-187,182,235,128, 9, 13, 21, 48,230,117, 8, 24,243,191, 38, 96, 64, 8,129,209,104,132,193, 96,248,160,182, 81, 20, 69,177,217,
-236,198,134, 86,104, 76,225, 42,199,247,101, 95,175,199,239,103,194, 43,127, 79,166, 69, 22, 13, 26, 52,254, 1,168,213, 17,158,
- 85, 77, 65, 86,125,215,134,252,252,252, 55, 74,165,178,153,155,155, 27,178,179,179,237, 92, 93, 93, 51,184,108, 54, 56, 92, 46,
- 40, 70,253,154, 64, 32, 16, 60,205,201,201,233,238,228,228, 4,189, 94, 95, 37,170,222,159, 58,172,180,210, 60,126,252, 24, 2,
-129,224, 41,212,117, 70, 78,128, 65, 91,210,164,125,251,246, 85,150, 33, 11, 11, 11, 88, 88,152,131,199,227, 99,213,170, 85,198,
-109, 91,182,236,114,237, 27, 90,250,201,226,149,100,229,186,189,255,209, 51,219,208, 7,147, 64, 32,120,234,226,226,210,213,220,
-220, 28, 17, 17, 17, 72, 79, 79, 71, 73, 73, 9,202,202,202,160,209,104, 80, 86, 86, 6,173, 86, 11, 62,159,143,150, 45, 91,194,
-204,204, 12,209,209,209, 79,161,209,212, 44, 46,139,138, 34,158, 62,125,218,181, 83,167, 78, 85, 22,149, 62,125,250, 80,125,250,
-244,177,169,178,162,149,149,161,176,176, 16, 15, 31, 62, 68,116,116, 52, 40,148, 28,221,209, 0, 0, 32, 0, 73, 68, 65, 84,138,
- 66,114,114,178, 65,163, 82, 29,165,199,196,135, 65, 13,220,101, 30, 56,176,255,211, 79, 63,157,209,189,123,119, 24,128, 33, 0,
-194,254, 63, 10, 24, 0,192,189,123,247,158, 25, 12,134,238,205,155, 55,135, 20,232, 12,224, 76,163, 68,100, 74, 74,156, 94,175,
-239,215,182,109, 91, 68,156, 56,209, 19, 64,122, 77,229,148, 64, 79, 63, 63, 63,168, 84, 42,188, 72, 72,136,109,132,200,218,187,
- 34,120,227,180, 41, 51,231,227,208,222, 93, 56,240,243,142,172,253,123,182,187,160, 1,254, 99, 52,104,208,248, 87, 89,179,234,
-213, 34,255,163,152, 93,155,248, 98, 53,134,165,180,164, 36, 54, 46, 46,174, 89,251,246,237,177,119,239,222, 78,221,186,118,125,
-195,225,114,245, 92, 14, 7,140, 6, 60, 72, 84, 74,229,149, 43, 87,174,116, 30, 57,114, 36,235,254,253,251, 16,139,197, 85, 66,
-171,242,155,197, 98,129, 16, 2,129, 64,128, 83,167, 78,149,171,148,202, 43,245, 90,139, 12, 70, 3,227,173,208, 35,132, 64, 42,
-149,130,195,225, 96,235,214,109,216,185,101,203, 68, 3, 16,238, 37,180,253, 18, 0,255,255,219, 3,186,172,236,234,239,191,255,
-222, 33, 40, 40,136,237,236,236, 12,169, 84,138,146,146, 18, 20, 21, 21, 65, 38,147, 65, 38,147,161,164,164, 4, 82,169, 20,124,
- 62, 31,241,241,241, 58,117, 89,217,213,218,248,120,106,245,201,169, 83,167, 46,139,139,139,115, 96,177, 88,208,233,116, 48, 26,
-141, 48, 26,141, 40, 47, 47, 71, 74, 74, 10,158, 63,127,142,196,196, 68, 20, 23, 23,131,205,102,131,201,100,226,241,227,199, 37,
- 66,157,238,132,150, 30,211, 31, 12, 54, 16,113,251,246,237, 25,147, 39, 79,134,163,179,115, 47,100,103, 55, 72,192,156,174, 67,
-192,148,126,152,128,249, 67, 0,201,229,143,210,210,210,186,247,238,221, 27, 14,206,206, 27, 91,102,103, 95, 78,104,132,159,150,
- 65,175,191,117,251,246,237,126, 83,166, 76,193,222,189,123, 55,218,166,165, 93, 40,120,111,154,211, 22,176,109,234,225,177,113,
-218,180,105,184,116,233, 18, 12,122,253,173, 58, 40,171, 71,124,111, 50,109,246, 66,151,247, 28,223,247, 80, 20,181, 0,192,102,
-186, 71,209,160, 65,227,159,108,209,106,212,212,161,137,193,176, 98,233,210,165, 58, 6,131,129,209,163, 71,155,158,137,140, 12,
-124,252,228,137,187, 68, 34,177, 48, 24, 12,245,114,217,106, 52,219,151, 46, 93, 42,213,106,181,240,246,246, 70,113,113, 49, 12,
- 6, 3, 88, 44, 22, 88, 44, 22, 40,138, 2,131,193,128, 72, 36, 66, 92, 92, 28,246,239,223, 47,179,213,104,182,215,251,144, 48,
- 24,158,134,133,133,129,201,100, 18, 62,159, 15,138,162,192, 98,177,176,109,219, 54,201, 78, 32, 2, 0,152, 12,134, 22, 0, 24,
- 12,170,161,222,187,245,206, 91,114,185, 92, 24, 43, 22, 1,212, 91,214, 82,163,249,126,211,166, 77,242, 23, 47, 94, 64,169, 84,
- 86, 89,223, 20, 10, 69,149,115,189, 84, 42, 5, 69, 81, 80, 42,149,136,140,140,148, 91,106, 52,223,215,198, 87, 4,228,101, 39,
- 39, 15,239,212,169, 83, 81, 90, 90, 26, 74, 75, 75,241,244,233, 83, 68, 71, 71,227,248,241,227,184,116,233, 18, 82, 82, 82,160,
-215,235,225,228,228, 4, 66, 8, 78,159, 62, 93,170,151,203,135, 20, 1,121,244,152,168, 29, 77,196,226,126,246,118,118,153,182,
- 54, 54,217, 77,196,226,126,239,111, 55, 7, 94,190,124,249, 18,122,189, 30,238,238,238, 86,117,249,105, 17,189,254,246,237,219,
-183, 49,101,202, 20,184, 52,107,182,193, 13,176,125,191,140, 27, 96,235,230,225,177,161, 82,192, 16,189,254,118, 99,235,108, 10,
-236,248,242,203, 47, 85, 28, 14, 7,199,142, 29,115,215,121,122, 38,178,128, 9, 34,192,167, 55,192,169,111,127, 7, 96,215,215,
- 95,127,157, 71, 81, 20, 14, 31, 62,108, 99,238,225,241,140, 5, 76, 53, 7,154,152, 3, 77, 88,192, 84,115, 15,143,103,199,142,
- 29,179,209,235,245, 88,188,120,113,158, 3,176,171, 14,202,133,132,144, 97,132, 16,127, 66,136,203,254, 61,219,241,251,153,240,
- 74,145, 53, 19, 21, 78,239,147, 1, 60,163,123, 28, 13, 26, 52,254,201,168,209, 12,197,234,180, 54, 31, 32,118,189,186,180,193,
-163, 39, 73,165, 54,150,102, 23, 43,183, 21, 63, 15,111,222,215,215,172,205,143, 63,254, 8, 54,155,141,172,172, 44, 36, 36, 36,
-192,204,204, 12, 19, 39, 78,212,168,228,242,225,213,114, 29,246, 7, 16,253,150,179, 34,159, 90,105,178,200,131, 21,223,236,194,
-239, 81, 76,115,115,115, 40, 20, 10, 48, 24, 12,240,249,124, 8, 4, 2,152,152,152, 32, 38, 38, 6, 67,135,141, 48, 20, 8,252,
-255, 8, 88,250, 71, 62,181, 42,206,202, 88, 67,157, 1, 65, 28,240,133,157,163,227,210,213,171, 87,155, 12, 26, 52, 8, 28, 14,
- 7,206, 77,188,242,220, 7,111,222,193, 96, 80,250,236, 34,217, 42,143, 38,142,230, 9,201,233, 0, 40,137,238,225,106,199,106,
-185, 14,255, 84, 79, 87,237, 13,247, 83,191,110, 49,107,215,174,194, 31, 93, 42,149, 34, 63, 63, 31, 18,137, 4, 82,169, 20, 74,
-165, 18, 0, 16, 21, 21,133,223,111, 38,202, 84,206,129,169,181,213,243,143,182, 39,153, 58,150, 63,104,122, 36,236, 87,166,173,
-173, 45,242,243,243, 81, 80, 80, 0,169, 84, 10,149, 74, 5,131,193,128,226,226, 98,236, 59,240,171,161, 72,228,255,186, 42, 32,
-100, 93,156,202, 44, 19, 43,197, 29, 39,191,150,110,100,198,140, 25,166,102,102,102, 48, 26,141, 40, 41, 41, 65,102,102, 38,210,
-210,210,112,243,230, 77,165, 68,170,133,210,102, 64,118, 85,192,210, 26, 56,255,131,248,219,113, 86,143, 91,229,232,224,144,147,
-145,145, 97,103, 48, 24,224,228,228,164,151, 22, 23,111,224, 2,151, 76,129, 92, 0,164, 16, 88,253,253,142, 29,211, 71,140, 24,
-129,142, 29, 59,102,229,229,231, 55,173,169, 47, 17,128,233, 13,152,151, 57, 59, 63,127,248,240,161, 56, 51, 51, 19, 83,166, 76,
- 41,204,120,245,106,121,165,191, 86, 41,208,211,205,195, 99,195,177, 99,199,108,154, 53,107, 6, 95, 95,223, 60,126,102,102,171,
- 36,160,180,150,254, 89,235,216,148,190, 60,215,116,238,168,214, 29,231,205,155, 7,189, 94,143,155, 55,111,226,193,131, 7,200,
-200,200,192,157, 59,119,164,102, 66,225,184,106,185, 14,107,236,159, 67,188,148,238,135, 15,135, 81, 28, 14, 7, 7, 14, 28, 64,
- 92, 92, 28, 0,192,207,207, 15,211,166, 77,131, 94,175,199,164, 73,147,201,185, 36,147,212,186,250, 39,128,214, 0,190, 67,133,
-200,235, 72, 8,225, 83, 20,149, 3,192, 5,141,243,201,162,251, 39,205, 73,115,254,123, 56,255,145,168, 55,215,225,218,159, 96,
-254,110,154,143, 89, 57,225,123, 66, 89, 61,122,250,251,132,134, 4, 51, 58,117,234, 4, 23, 23, 23,248,249,249, 33, 51, 51,147,
-103, 97, 97, 81, 95, 62, 53,133,255,224, 9,105,109,218,180,177, 88,190,124,185,249,192,129, 3,217, 46, 46, 46, 32,132, 32, 46,
- 46, 14, 17, 17, 17,229,123,247,238,149,149,217, 15,147,198, 94,251, 77,209,144,124,106, 15,128, 50, 0,107,156,115,114,126,158,
- 63,119,110,112,187,246,237,103,132,132,132, 48, 68, 2, 19,246,250, 85, 51,249, 0,176,246,135,227,230, 35, 2, 39,226,123, 79,
-160,215,132,154,243,200, 85,175,103,102,246,172,140,143, 70,245,243,252, 98,193,116,195,216,177, 99,133,102,102,102,112,113,113,
-129,165,165, 37, 82, 83, 83,145,157,157, 77,206,158, 61,171,184,247,248, 37,251,244,165, 71, 25,124,115,135,134,228, 37,148,251,
- 15,250,248,245, 71, 31,125,100, 57,117,234, 84,211, 14, 29, 58,176,121, 60, 30,120, 60, 30,242,243,243,145,146,146, 82,126,246,
-236, 89, 69,153,221,144,146,216,107,199,228, 13,204,117,168,242, 31, 31,154,114,235,114,200,226,231, 79,159, 78, 54, 2,109,203,
-203,203,157, 12, 6, 3,197, 96, 48,114,141, 70,227,211,114,185,124,191,198, 47,100, 27,157,235,176, 97, 48, 24, 12, 28,131,193,
- 0,169, 84,138,203,151, 47,179, 94,189,122,181,250,201,147, 39,171,115,114,114,160,211,233, 48,102,204, 24,248,249,249,225,218,
-181,107, 40,200,207, 63, 91, 23, 87, 18, 80,202,203,206,158, 54,107,214,172,243, 97, 97, 97,140, 39, 79,158,216, 28, 56,112, 96,
- 95, 77, 2,102,242,228,201,198,252,204,204,105, 26,160,180,142,254, 89,215,216, 44,188,112,108,231,147,145,163, 3, 91,134, 4,
-173,102,119,235,214, 13, 54, 54, 54,232,217,179, 39,202,203,203, 45, 90,180,104, 81,223,216,148,251, 15, 30,151,218,182,109, 91,
-225,182,109,219,196,211,167, 79,199,130, 5, 11, 0, 0, 42,149, 10,151, 46, 93,194,226,197,139,243, 50, 89,157,149,245,245,207,
-183,150,170, 74, 1,118, 3,128, 63,128, 84,208,142,239, 52,104,208,248,103,162, 50,169,180, 3, 42, 18, 75,159, 67,197,203,121,
-253,185, 14,111, 61,120,134,234,105, 62, 42,224,144,160,119,157,250,106,206,210, 13,190, 76,157,204,146, 77,169,205,146, 95,190,
-164,234,203,121, 88,149, 79,205,220, 75, 97,157,118,180,211,250,181,107, 23,125,255,253,247,253, 42, 67, 56, 8, 4,130,167, 42,
-165,242,138,173, 70,179,189,204,220,235, 74, 99,115,243,101, 3,249, 0,230, 90,198,198,238, 8, 24, 49,102, 19,223,202,157,189,
-114,221, 94, 53,147,193,208,166,228, 20,224,123, 79, 64,216,128, 5,146,101, 90,224,185,212, 65,159,111, 29,152,244,245,151, 95,
-126,177,118,205,154, 78, 34,145,168, 87,185, 94,239,101, 52, 26, 1,163, 49,185, 76,169,188, 65,202,203, 31,106,252,130,182,240,
-205, 29, 72,131,243, 18, 90,180,144, 91,189, 14,239,116,112,255,254,133, 39, 78,156,248, 83,219,173, 53,154, 29,101, 22, 45,162,
- 27,210,246,234,101,212,192, 93, 72, 36,119,235, 50, 93,210,185, 14, 27,248,246, 97, 52,206,182,180,180, 60,212,175, 95, 63,126,
-255,254,253, 49,116,232, 80,116,235,214, 13, 70,163, 17,132, 16,200,229,114, 28, 63,126, 28,155, 54,109, 74,110, 10,172,169,143,
- 79, 3, 92,225,253,254,251,144,182,109,219, 30,168, 75,192,188, 21, 89,245,250, 36,214, 61, 54,121,201,122,243,225,233,227,231,
-175,247,212,202,114, 45,172, 5,122,241,243,103, 79, 25, 13, 31,155,222,114, 67,220,241,206, 99, 70,141,154,207,100,177,122,190,
- 93, 1, 73, 94, 36, 36,196, 86, 38,149,134,223,180,203,141,236, 75,149,177,235,104,199,119, 26, 52,104,252,211,133,214, 80, 84,
-248,107, 85,165,228,169, 53,215, 97,165,213,135,197, 98, 73, 82, 79,207,153, 88, 23, 59, 27,232,247,214,146,133,122,115, 29,190,
-253, 59, 29,144, 67,163,249,230,157, 96,164,213, 86, 23,178,223, 43,223,152,176,136, 37, 64, 18,244,154, 0, 72, 18,128,200,185,
- 21,124,157,214,126, 85,189, 77,181, 62,100,223, 57, 46,167, 88, 13,220,130, 66,113, 11, 10, 69,141, 78,187,108, 22,167,184,190,
-122,190,223,246, 76, 64,246, 87,219,254, 62,103,189,226,225, 47,156,207,127, 27,222, 20, 22,158, 6, 32,114,142,138,178,191, 16,
- 21, 53,246,139, 37, 75,198, 56, 56, 58,122,216,216,216, 88,154,154,154, 50,238,223,191,159,166, 87,171,119,180, 3, 14,190,181,
-166,214, 11, 13,112,197, 59, 51,179,213,199,163, 70,205,167, 88,172, 30,213, 5, 12,209,235,239,184, 3,187,234,178,100,125,232,
-216,116,225, 57,244,123,107,201, 2, 19,152,213,144,190,145, 93, 81,143,117,208,235,215, 33, 62,190,134, 62,223,232,190,180,150,
-162, 40, 57,104,199,119, 26, 52,104,252,115, 81,153,239,240,220,255,245,129,251,211,156, 52,231, 63,136,147,137,138, 85,116,244,
-249,164, 57,105, 78,154,147,230,164,209, 32,176,232, 83, 64,131, 70,131, 97,192, 31,211, 96, 52,104,208,160, 65,131, 70, 37, 42,
-125,179,170,227,103,160,194,117,167, 54, 85,218,152,213, 4, 31,162,108,163,105, 78,154,147,230,164, 57,105, 78,154,147,230,252,
-215,113,214,199,253,119, 92,205, 88,233,147, 85,229,155,245,127, 5,218,172, 74,115,210,156, 52, 39,205, 73,115,210,156, 52,231,
- 63, 29, 14,111, 69, 86,245, 15,128, 70, 6, 44,165, 65,131, 6,141,127, 42, 66, 66,192, 32, 4, 20, 33, 33, 12, 66, 78, 48, 9,
- 9,100, 18,130,191,148, 10, 36, 48,176,230, 96,182,159, 77,180, 52,165,207, 56, 13, 26,255, 40,228,162,150,164,210,180,143,214,
-255, 95,184,138,197,226, 61, 0,168,188,188,188,217, 0, 50,233, 83,242,191, 7, 43, 43,171,126,122,189, 30, 50,153,236,202, 63,
-177,125, 45, 61, 48,138, 48,208,162,234, 7,130,204, 23, 41, 56, 84, 83,217, 22,158,152, 2,234,143, 88, 92,148, 17, 47, 18, 94,
-225, 84, 35, 14,199, 24,210,223,101, 23, 0,156,143,206,154,143,255, 78, 92,173,230,182,182,182, 23, 89, 44, 22,203, 96, 48,204,
-149, 72, 36, 81,181, 11,161, 64, 38, 0,176,201,181, 21,210, 60,187,229,159,127, 74,177,203, 52,251,165, 26,149,178,148,201,102,
-190,230,177,197,183,231, 76,103,156, 47, 81,116, 77,168,105,255,240,240,240, 90,179,120,183,242,196, 16,134,161,229, 48,191,214,
-105,169,223,109,239,244,125, 47,119, 27,118, 90,214, 99,209,198,221,165,123,184, 22,110,195,166,140,165,162, 88, 2,106,242,254,
-253, 69, 10,122,148, 53, 28,235, 1,171,114,192,151,205,227,185, 24,244,122,123, 10, 32, 76, 22, 43, 95,167,209,100,113,128,248,
- 21,128,244,159,206,201,225,241,156, 13,122,189, 61, 0,252, 47,214,147,198,187,168, 85,104,137, 68,162, 24, 6,131,225, 92, 61,
- 25,110,101, 62,193,202,223,170,111,163, 40, 10, 6,131, 33,187,164,164,164, 67, 35,142,111, 6, 96, 44,128,202, 37,234, 71, 0,
- 28,199,135, 59, 28,155,113, 56,156,165, 66,161,176,175, 74,165,106, 5, 0, 38, 38, 38,207,149, 74,229,213,242,242,242,239, 62,
-144,151, 5,224, 99,145, 72,212,135,193, 96,244, 33,132, 80,132,144,107, 10,133,226, 42,128, 19, 0, 62, 36, 82,130,137,157,157,
-221, 58, 43, 43,171, 9, 43, 86,172, 40,178,182,182,246, 94,188,120,241,163,226,226,226,223, 10, 11, 11, 87,161, 17, 57,234,254,
-203,240, 16,139,197, 71,216,108, 54, 51, 43, 43,171, 15, 0,184,184,184, 92,211,106,181, 6,137, 68, 50, 17,192,171, 70,242, 9,
- 1,116, 17,137, 68, 29, 68, 34,145,191,193, 96,104,241, 54, 63,227, 11,133, 66,113,179,188,188, 60, 6,192,125, 0,202,255,161,
- 49, 98,202, 98,177,194,222,246,117, 47, 0,242,127,218, 77,128, 48,208, 34,225,121,162,119,149,240,106,229, 83,123, 97, 10,174,
- 53,148,109,176,208,234,219,203, 97,216,240,225, 3, 24, 0,160,213,157, 31,118,245, 70,238,153,255,112,115,154,143, 30, 61,250,
-110, 88, 88,152,165, 70,163,193,236,217,179,143, 68, 71, 71,239,146,201,100, 43,234,188,113,136, 44, 23,111,222,118, 73, 64, 81,
- 12, 0,176, 51, 26, 13,118,111,222,188,242, 74,120,118,119,240,243,231,247,214,171, 18,175,222, 55, 82,236, 57,229,232,153,216,
-144, 74,180,112, 71,192,176, 49,163,134,174, 89, 19,130, 9,227, 38, 52,121,254, 92,109,226,100,150,202, 45, 86, 9, 61,173,109,
-237,134,175, 89, 27, 78,221,190,117,122,120,216,129,208,171,211,167, 91,247,165,197, 86,131, 64,173,101,177,186,152,123,122,250,
-143, 59,125, 26, 34, 23, 23, 22,139,199, 99, 0,128, 94,163,113, 81,100,101, 57, 28, 27, 62,188,115,200,203,151,215, 67,128, 7,
- 52,231,255, 23, 78, 26,141, 17, 90, 12, 6,195,249,205,155, 55,118, 66,161,176,226,102, 76, 8, 12, 6, 3, 12, 6, 67, 85,242,
- 98, 66, 72,213,183, 94,175,135,143,143, 79,131,222,104, 1,244, 5,240, 73,239,222,189, 3,191,251,238, 59,182,175,175,111,101,
-202,144,158, 43, 87,174,252, 33, 46, 46,238, 36,128,131,168, 8,222,216,208, 55,222, 65, 66,161,240,240,230,205,155,205, 6, 12,
- 24,192,114,116,116, 4, 69, 81,200,203,203,235, 18, 29, 29,221, 97,241,226,197,115,149, 74,229, 36, 0, 23, 27,113,126, 90,155,
-154,154,134,143, 26, 53,202,185, 87,175, 94,252,150, 45, 91,194, 96, 48,224,241,227,199,211, 99, 98, 98,198,159, 60,121, 50, 88,
- 46,151, 7,162,225,249,218, 40,145, 72, 52,213,204,204,108, 93, 80, 80,144,213,164, 73,147,184,207,158, 61, 43,113,119,119,167,
-110,223,190,109,123,252,248,241,185, 27, 54,108,248, 88, 38,147,173, 82, 40, 20,191,162, 1, 57, 20, 77, 77, 77, 99, 24, 12,134,
-115, 67,132, 48,128,198,136,225,118, 77,155, 54, 61,126,235,214,173,166,233,233,233,134,145, 35, 71, 30, 2,128,171, 87,175,250,
-234,116, 58,106,224,192,129,231,179,179,179,199, 2,120,220,192,182,183,177,178,178, 58, 51, 97,194, 4, 43, 15, 15, 15, 65,211,
-166, 77, 41,161, 80, 8, 38,147,137,210,210, 82,199,103,207,158,245,127,240,224,129, 42, 58, 58,186, 88,163,209, 12, 7, 16,223,
-136,235,212,205,206,206,110, 50,155,205,110,173,215,235,157, 0,128,197, 98,189,209,233,116,207, 36, 18, 73, 24,128,187, 31, 58,
- 64,236,237,237,119,174, 91,183,206, 70, 34,145,144, 13, 27, 54,236,148,203,229, 83,255,169, 55,131, 35,191,157, 64,204,163, 7,
- 64, 69,218, 28,170,134,254, 71, 1,224,124,254,249, 18,116,232,216, 25, 19, 39,124, 92, 47,231, 71,253,156, 55,179,185, 28,107,
-181, 90,125,183,180, 76,115, 66, 40,224,143,157, 48, 62, 32, 25, 0,206, 95,184, 62,182, 83, 39,203,107,230, 2,222,199,124, 62,
-191,155, 78, 91, 94,244,251,149,236, 47, 27, 35,170,156,156,156, 46, 90, 90, 90, 10,138,139,139,243, 10, 10, 10,126, 26, 54,108,
-216,218,131, 7, 15, 90,166,165,165, 33, 43, 43, 11,139, 22, 45, 18,101,103,103,207,143,143,143,191,167,213,106,107,181,108,201,
-229,197,219, 87, 46, 31, 17,100,110,110,195, 20, 10,204, 96,106,110, 5,119,143,182,232,210,109, 24,134, 12,157,129,148,228,184,
- 46, 7, 15,172,137,123,243, 38,250, 91,145, 85,179,181, 82,105,211, 90,239, 75, 45,155,163,215,240, 81, 21, 34, 43, 40, 40, 4,
- 47, 19, 19,229,233,175, 25,159,157, 59,205, 18, 12,233,231,195,211,107,243,210,111,223, 58,221,180, 71,207,145, 0,208, 33,236,
- 64,232,213,207, 38, 90,246,219,121,164, 68, 78, 63,146,106,191,119,174, 97,179,167, 14,218,182,205,206,111,238, 92,142,226,245,
-235,242,212,221,187,203,242,111,222, 52,176,120, 60,226, 50,120, 48,101,219,167, 15,127,238,139, 23,156, 59, 27, 54,248,179, 67,
- 67,221, 87,149,151, 31,166, 57,255, 79, 57,255,237,168,116,130,175,190,250,240,231, 58,133, 22, 69, 81, 16, 10,133, 56,118,236,
- 24,216,108, 54, 88, 44, 22,216,108,118,173,127,187,186,186, 54,164, 34,163,197, 98,241, 15,187,118,237,178, 31, 52,104, 16,248,
-124,126,213, 6, 38,147,137, 1, 3, 6,160,127,255,254,236,156,156,156,241,199,142, 29, 27,191,126,253,250,124,169, 84,186, 0,
-111, 19, 67,215,129, 62,222,222,222, 17,151, 46, 93, 50, 81,171,213,184,121,243, 38, 74, 74, 74,192,229,114,225,236,236,140,129,
- 3, 7,178, 18, 19, 19,173, 6, 12, 24, 16,241,242,229,203, 0, 0,215, 26, 80,215, 14,118,118,118, 55, 78,156, 56,193,111,219,
-182, 45,149,146,146, 2, 63, 63, 63, 0, 64,105,105, 41, 70,142, 28,201,159, 52,105,146,199,248,241,227,239, 75, 36,146, 94, 0,
- 98,234,225,107, 47, 22,139,127, 29, 53,106,148,227,250,245,235,205, 76, 77, 77,145,158,158,158, 43, 22,139,189, 42,207,247,248,
-241,227,185,195,134, 13,115,216,180,105,211,246,240,240,240, 47, 37, 18,201, 84, 0,177,117,170,214,183,130, 88, 32, 16, 32, 63,
- 63, 31, 71,142, 28,193,252,249,243,193,100, 50, 33,145, 72,112,252,248,113,124,246,217,103,149,130,166, 65, 98, 88, 32, 16,244,
-247,244,244,220,119,245,234, 85,103, 11, 11, 11, 56, 58, 58, 50,190,254,250,235,214,238,238,238, 38, 77,154, 52, 97,230,230,230,
- 34, 34, 34,194,125,242,228,201,103, 50, 51, 51,167,107, 52,154,122,167,212,236,237,237,247,159, 59,119,206,245,249,243,231,216,
-189,123, 55,138,139,139,193,229,114, 97, 97, 97, 1,177, 88, 12, 47, 47, 47,106,249,242,229,130, 97,195,134, 9, 22, 44, 88,176,
- 95,171,213,182,107,192, 53,106,107,103,103,183,167, 79,159, 62,238,161,161,161, 22, 98,177, 24,149, 47, 6,165,165,165,206,233,
-233,233, 93,130,130,130, 2, 99, 98, 98,210, 36, 18,201, 28, 0, 79, 26, 57,112,218,181,108,217, 50, 96,228,200,145,204,220,220,
- 92,132,133,133, 5,200,229,242,118,141, 16,151,127, 43,196, 60,122,128,217,243, 22, 41, 28, 93, 92, 56,151, 46,238, 27, 29,126,
-170,249, 35, 11,147,138,132,212, 82, 21,202, 3, 71,189,236, 56,112,208, 12,206, 71, 67, 71, 42,126,254,113,187,168, 33, 66,139,
-205,229, 88, 31, 57,188, 53,243,214,237,152,214,151,163, 31, 12, 30, 61,124, 56,225,112, 44,220, 1,224,203,197,159,179, 35, 34,
- 35, 15, 12,232,223, 57,167,103,143, 14,153, 19, 39, 45,113,109, 68,117,155, 55,111,222,252,122, 92, 92,156, 61,143,199, 67,113,
-113,177,245,207, 63,255,188,181, 71,143, 30,140,212,212, 84, 36, 38, 38,226,245,235,215, 40, 45, 45,197,128, 1, 3, 68,177,177,
-177, 63, 1,168, 85,104,149, 51,250,174,115,108,162,219, 97,109, 34,108, 90,110,144,217, 17, 93,110,203,203,231, 46,183, 57, 26,
-166,242,179,119,240,241,250,100, 90, 48,214,172, 61,201,254,237,200,198,160, 43,209, 71, 1, 70,211,218, 51, 2, 16,116, 91,185,
-106, 5,100,114, 13, 38, 77,152,133,201, 19,102, 89, 19,104, 29,136, 65, 45,212,170, 74, 44, 76, 57, 47,162,118,237,221, 58, 10,
-128,115, 53,177,117,133, 22, 91,181, 99, 13,139,213, 57,224,135, 31,108, 91,207,156,201,123, 18, 26,170, 44,188,121, 83,229,249,
-209, 71, 37,126,159,126,170, 1, 0,249,235,215,156,151,193,193, 2, 91,127,127,147,174, 75,151, 90, 26,180, 90,241,154, 53,107,
- 58, 5, 85, 36, 47,111, 20,167,235,216,177,134,160, 3, 7, 58,222, 92,178,164, 55,165,211, 49, 7,119,237,250,120, 67, 88,216,
-155,191,194,249,159,172,103,206,141, 27,154, 98,119,119,248,141, 28, 89,228,106,103,167,249, 79,182,253,175,212,147, 70, 21, 42,
-125,181,102, 87,127, 67, 69, 84, 84, 84, 47, 0,215, 1,132, 6, 4, 4,132, 0,128,185,185,121,190, 84, 42,181,139,136,136,168,
- 87,100,177,217,108, 56, 56, 56,192,203,203, 75, 34,145, 72,236,235,168, 64,150,209,104,116, 38,132, 84, 89, 95,106,131, 70,163,
- 65,114,114, 50,218,180,105,147,141,138, 68,180,181, 26,117, 4, 2, 65,106, 98, 98,162, 77, 66, 66, 2, 98, 98, 98,224,238,238,
- 14, 75, 75, 75,176,217,108,232,116, 58,200,100, 50,120,123,123,131,199,227,161,125,251,246,133, 74,165,210,189,158, 41, 32,158,
- 80, 40, 76,190,113,227,134,139,159,159, 31, 30, 62,124, 8, 23, 23, 23,136,197, 98, 0,192,235,215,175,113,251,246,109,124,244,
-209, 71,136,139,139,195,152, 49, 99,178,148, 74,165, 23, 0, 77,109,132, 86, 86, 86,185, 87,175, 94,205,246,245,245, 85, 43,149,
- 74, 70,126,126, 62,251,230,205,155,122,185, 92, 46, 42, 45, 45,101, 75,165, 82,182, 76, 38, 99, 41,149, 74, 54,131,193,224,168,
- 84, 42,246,149, 43, 87,152,229,229,229,117, 6,200,172,188, 78,145,145,145,240,245,245, 69, 68, 68, 4,190,248,226, 11,220,185,
-115, 7, 46, 46, 46, 56,113,226, 4,150, 46, 93,138,164,164, 36,216,216,216,160,101,203,150,245, 93, 35,120,120,120,164, 60,125,
-250,212,131,195,225, 84,230,117,172,204,151,135,130,130, 2,188,122,245, 10,111,222,188,129,167,167, 39, 38, 76,152,240,234,205,
-155, 55,158,245,245, 60, 39, 39,167,130,231,207,159,219,180,105,211, 6,249,249,249,176,176,176,128,185,185, 57, 44, 44, 44,170,
-254,118,119,119,199,146, 37, 75, 32, 22,139, 37,106,181,218,190, 62, 17,228,235,235,123,241,202,149, 43, 54,102,102,102,200,203,
-203,131, 76, 38, 3,139,197,130, 64, 32,128,141,141, 77,149,144, 79, 78, 78,198,208,161, 67, 11, 83, 83, 83, 7, 53, 66, 36, 49,
-236,237,237, 19,227,227,227,189, 8, 33,200,204,204, 68, 82, 82, 18,230,205,155,151,172, 86,171,125,240, 15,202,217, 87,205,239,
-138, 51,117,218,108,206,168, 17,221,180, 47,158, 71, 81, 60, 99, 18,218,181, 54, 43, 5,128,199,207,100,230, 26,134, 55, 90,180,
- 10, 32,167,206,220,229,254,122,240,103, 54,140,176, 7,133,164, 23,201,248,166, 54,238,129,125, 28,102,126,254,249,244,214,189,
-123,244, 98,200,149, 74,187,159,126,218,214, 62, 53,245,133, 29, 0,184,187,183,144,204,157,187, 56,214, 84, 40,148, 92,191,125,
-195,248,253,247,251,159, 93,186,150,187,183, 1, 85,118,247,242,242,186, 23, 25, 25,105, 99,103,103, 7,115,115,115, 40,149, 74,
-148,151,151, 35, 33, 33, 65,125,236,216, 49,157,153,153,153,105, 94, 94, 30,164, 82, 41, 40,138, 66,100,100,100, 38, 0,183,247,
-137, 42,125,180, 0, 96,222,144, 22,236,150,125,189, 44, 57, 60,189,137, 9,251,165, 3, 40, 3,143, 34, 34,251,243, 23, 31,183,
- 57,127,249,225,196, 81,163,191,176,237,217,107, 20,130, 86, 7,234,114,114, 50,253,202,209, 51,177, 38, 31, 45, 31, 79,244, 29,
- 57,102,212,199,107,214,132, 32, 36, 40, 20, 81,145,167, 75, 69, 66,134,198,204,130,109,238,223,165,187,122,201,252, 17, 89, 10,
- 69,142,203,154, 77,199, 38, 12, 29,177,196,185, 71,207,145,184,125,235, 52,194, 14,132,198, 80, 38,132,158, 70,124, 15, 33,128,
-165,133,187,251,156,133,201,201,156, 39, 33, 33, 10,125, 78, 78, 73,135,197,139, 11,107, 42,155,125,249,178,144,235,232,104,102,
- 57,124,184,213,118, 55, 55,162,147, 72,246,212,228, 99, 84, 19,103,180, 72,100,113,244,252,249,126,132,205,238,181,236,171,175,
- 76, 2, 2, 2, 32,147,201,112,242,228, 73,236,217,189, 91,227,224,224,240,212,241,217,179,184,214, 50,217,234,134,114,118, 88,
-188,184,208, 96, 48, 80, 31, 47, 93, 58,224,249,235,215,125,243, 36,146, 38, 0,224, 96,101,149,213,193,221, 61,102,127, 84, 84,
-210,206,166, 77,141, 13,173,231, 47, 23, 46,216,135,167,167,207,180,178,178, 50,201,151, 72, 88, 60, 46,183,168, 75,203,150, 39,
-126, 92,181,234,186, 62, 62,158,195,119,118, 54, 51, 15, 8,104,116,219, 59, 44, 94, 92, 88, 44,151,179, 22,174, 93,219, 61, 35,
- 63,191,137, 66,163,241,148,202,229, 98,131, 78,199, 48, 19, 8,138,154,121,123, 75, 84, 55,111,230, 54, 43, 43, 91,180, 23,144,
-252,183,174,117, 77, 90,228,111,132,247,227,104,253, 41,215,225,245,128,128,128, 63,173,174, 33,132, 52,200,154,197,102,179,223,
-153,166,170, 3, 28,138,162, 16, 27, 27, 11,107,107,107,136,197, 98,240,120,239, 38, 31, 44, 40, 40,192,157, 59,119,240,226,197,
- 11,180,109,219,182,114, 26,163,118, 69,196,227,125,190,105,211, 38, 11,173, 86,139,152,152, 24,116,232,208, 1, 60, 30, 15, 28,
- 14,231, 29, 17, 40,145, 72,208,170, 85, 43, 44, 91,182,204,124,253,250,245,159,107, 52,154, 90,223, 72, 89, 44,214,130, 89,179,
-102,217, 85, 90,176,178,178,178,208,190,125,251,170,237,182,182,182,120,252,248, 49, 58,116,232, 0,103,103,103, 4, 6, 6,218,
-133,133,133, 45,208,235,245,223,213,198,201,229,114, 25,190,190,190, 29, 1, 64, 40, 20,130,193, 96,188, 52, 51, 51,179,181,183,
-183, 23,154,153,153,253,169,141, 7, 14, 28,144, 50, 24, 12, 93,189,106,128,193, 64, 94, 94, 30, 90,183,110,141,210,210,138, 12,
- 46, 74,165, 18,158,158,158,144,201,100, 85,162,213,209,209, 17, 42, 85,221,174, 95,109,218,180, 9,241,241,241, 25, 40, 20, 10,
-121,108, 54, 27, 79,158, 60,129,159,159, 31,142, 29, 59, 6, 87, 87, 87, 8, 4, 2, 36, 39, 39,195,215,215, 23, 55,110,220,128,
-173,173, 45, 90,181,106,197,179,179,179,187, 85, 92, 92,124, 45, 35, 35, 35,164,142,122, 50, 68, 34, 17,110,220,184,129,253,251,
-247,227,245,235,215,200,201,201,129,169,169, 41,218,181,107,135,150, 45, 91,162, 91,183,110, 72, 78, 78, 6, 85,127,103, 18,123,
-121,121, 69, 61,124,248,208,134, 16,130,176,176, 48, 40, 20, 10,104,181, 90, 48, 24, 12,240,249,124, 88, 90, 90,162,111,223,190,
-176,181,181,133,151,151, 23,142, 31, 63,110, 51,100,200,144,223, 37, 18, 73, 59, 0,121,245,157, 87, 75, 75,203, 69,193,193,193,
- 46,118,118,118, 72, 79, 79, 71,105,105, 41,236,237,237,209,187,119,111,167,232,232,232, 69, 58,157,110,219, 63,229, 65, 86,205,
-241,157,186,116,113,223,104,175,102, 37,190,109,189, 5, 46, 17, 81,246, 46,199,162, 36,173, 0,160,117, 11,251,231,163, 3, 4,
- 89, 79,158, 71,101, 93,186,120, 58,230,197, 75, 68,160, 1, 83,219,165,101,154, 19,151,163, 31, 12,246,107,219,222,184,105,227,
-210,161,243,231,205,228,217,217,207, 64,126,230,105, 68, 95,141,117, 93,250,197, 44,219,239,182,252,114,254,114,244, 3, 70,105,
-153,102,117,195, 76, 89,174, 59, 15,254,216,205, 70, 94, 24,142,148, 68, 46, 76, 76, 91,195,221,189, 57,100, 50, 25,248,124, 62,
-127,194,132, 9,134, 21, 43, 86,148,153,153,153, 9, 40,138,194,181,107,215, 36, 0, 6,213,199,171,182,179, 36,134,114,157,158,
-112,153, 70, 66,153,170, 40, 67, 49,247, 89, 66, 26, 6,246,239,147,223,163,115,235,245, 43,214,108, 89,233,213,220,207,118,250,
-204, 80,246,218,144,137,187, 65,161,103, 77, 60,137, 41,184, 74,157, 56,101, 2, 96,232,154,111, 66,144,154,154,108, 57,251, 19,
-105, 40,139,103,226,232,227,214,221,116,247,254,107,131, 61, 61,155, 54, 89,178, 32,240,220,214, 31,182, 14,173,110,217, 58,120,
- 32,248, 12,128,126, 13, 57,183,255, 34,180,153, 28, 21, 5, 69,102,166,174,248,214, 45,117,191, 31,126, 40,116, 25, 52,104,155,
-182,188,220,166,242, 86,193,160, 40, 80,149,174, 19, 70, 35,197, 90,182,140, 65, 88, 44,232, 44, 45, 63, 65, 73, 73,243,250, 56,
-191,200,205, 29, 61,113,230,204,161,103, 46, 92, 64,211,166, 77,171,158,103, 22, 22, 22, 88,186,116, 41, 22, 47, 94,204,123,252,
-248,113,167,240,240,240, 78,223,109,222,108, 15, 96,116, 67,234,121,233,254,125,203, 79,215,172, 89,213,182, 67, 7,215, 67, 71,
-142,240, 60, 60, 60, 0, 0,175, 94,189,242,218,184, 97,131, 91,107, 95,223,252,245,159,127,126,240,249,138, 21,173, 0,220,170,
-139, 51,239,230, 77,109,120,122,250,204,171,215,174, 89,180,110,221, 26, 0,144,148,148,100,183,125,251,246, 89,173, 2, 3, 39,
-173,153, 59,119,117,128, 90, 45, 53, 43, 40,224, 5,236,220,201, 58,250,241,199,245,114, 86,214, 19, 0,122, 79,159,254,121,207,
- 62,125, 90,142,158, 57,211,202,213,213,149, 18,137, 68, 40, 47, 47, 71, 78, 78,142,229,243,231,207, 61,162,228,114,217,169,251,
-247,195, 96, 48, 12,248, 47, 94,235, 26,181,200,223,204,146,245,103, 77,241,246,187,119, 84, 84, 20, 1,208, 59, 32, 32,224, 70,
-229, 3,220, 96, 48, 52, 72,100,177, 88, 44, 80, 20,213, 80,177, 5, 66, 8, 10, 11, 11, 81, 88, 88, 88, 53,117, 36,145, 72,112,
-245,234, 85, 36, 39, 39,131,205,102,131,195,225,160,188,188,254, 28,180, 66,161,176,127,255,254,253, 89,247,239,223,135,187,187,
- 59, 76, 76, 76,170,234, 85,249,225,112, 56,112,112,112,128, 76, 38, 67,191,126,253,216, 59,118,236,232, 95,151,208, 50, 55, 55,
-255,104,236,216,177,220,202,255, 21, 10, 5,152, 76,102,149,104, 81, 40, 20, 40, 46, 46,134, 84, 42,133, 90,173, 70,215,174, 93,
-185, 81, 81, 81, 31, 21, 21, 21,125,215,144,246,151,149,149, 41, 36, 18,137, 69,207,158, 61, 45, 15, 30, 60,152,212,181,107, 87,
-239,119,122,218,245,235,106,181, 90,205,102, 48, 24, 13,202,163,119,248,240,225,170,115,255,230,205, 27,236,222,189,187,106, 91,
-114,114, 50,118,236,216, 1, 66, 8, 8, 33,117, 94, 35, 31, 31,159, 33, 97, 97, 97, 29, 14, 29, 58, 84,194,100, 50,145,148,148,
-132, 35, 71,142,128, 16, 2, 91, 91, 91,148,149,149, 33, 63, 63, 31,215,174, 93,131, 94,175,135, 72, 36,130,147,147, 19,127,193,
-130, 5, 61, 66, 67, 67,217,117, 9, 45,131,193, 96, 96, 50,153,112,115,115, 67, 80, 80, 16,212,106, 53, 56,156, 10,125, 41,147,
-201, 32,149, 74, 17, 23, 23,135,244,244,116, 16, 66,234,124,200,240,249,252,192, 67,135, 14,217,113,185, 92,168, 84, 42,200,229,
-114,100,101,101, 33, 35, 35, 67, 45,145, 72,244,166,166,166, 12, 55, 55, 55, 6,143,199,227,141, 28, 57,146,170, 20,156, 1, 1,
- 1,214, 97, 97, 97,227,180, 90,109,125, 34,201, 86, 44, 22,175,156, 53,107, 22,191,122,159,205,203,203,195,232,209,163, 5,119,
-239,222, 93, 33,147,201,142, 0, 40,248,135, 61,208, 72,248,169,230,143, 98,162,147,124, 35,162,236, 93, 50,178, 13,221,151,126,
-185,133, 5, 0, 63,239,249,182,123, 68,212,155, 59, 62, 77,243,179,194, 79, 53,127,100,105,249,162, 62, 33,192,232,219,203, 97,
-152, 80,192, 31, 59,122,248,112,242,211, 79,219,218,207,159, 55,147,231,214,124,105,133,133,147,109,135,126,250,111,168, 50,213,
- 43,254, 79, 63,109,107, 63,122,248,152,184,215,175,211,247,244,237,197, 59,126,245, 70,238,217,186, 44,134,118,214,124, 39, 1,
- 79, 9, 39,247,150,240,110, 33,196,227, 39, 73, 56,121,226, 30, 90,180,234, 2,141, 70, 3,189, 94, 47, 28, 54,108, 88,217,177,
- 99,199,212, 47, 95,190,148,171, 84,170, 94, 0, 94,214,215,248,236,236, 4,163,183,184, 75, 57,199,132,167,151,151,114,202,150,
-175, 14,255,184,125,231,129, 29, 44, 29,156,216,182, 66,227,217, 33, 3, 58, 29,217,191, 55,104,241,234,224, 35,232,216,105, 96,
-215, 23, 73,183, 90, 2,120, 90,163,120, 77, 69, 20,227,228, 41,125,106, 74,202,208,140,244,244,236,230,246, 98,237, 43, 41,209,
- 45, 90,254,203,128,158,189, 2,219,120,180,240,231,190, 72,184, 65, 5, 45, 27,247,219,154, 77, 91, 39, 84,138,173, 43,151,127,
-235,245,201, 39,247,184, 7, 15,214,110, 29,255,183,129,195,227, 57,139,220,220, 88,175, 15, 30, 84,185, 15, 27, 86, 2, 0,218,
-242,114,155,215,233,233,230, 2,129, 0,132, 16,232,116,186,119,124,136, 43,253,134, 91,123,123,219, 55,132,243,245,215, 95,183,
- 89,182,108, 25,242,242,242,160,215,235,193,102,179,223,191,103, 67,169, 84,226,147, 79, 62,193,206,205,155,187, 52,132,211, 96,
- 48, 80,159,174, 89,179,234,171, 85,171, 60,230,204,153,195,168,126,239,181,178,178, 66,248,201,147,220, 93,187,118, 57,175,220,
-185,243,147,137, 60, 94, 42, 52,154, 58, 57, 11, 61, 61, 97,149,159,111, 82, 41,178, 0,192,219,219, 27,187,119,239,230,205,152,
- 49,131, 59,108,216,176, 45,143,219,182,221,190,173, 71,143, 20,235,230,205,205,184, 60,158,115,125,156,149,231, 19, 0,228,106,
-117,235,109,219,183, 91, 62,120,240, 0,249,249,249,200,203,171,120, 31,165, 40, 10, 29, 59,118,164, 38, 79,158,108,222,204,197,
-165, 19, 12,134,255,230,229,254,147, 22,249, 27, 97,118, 13,191,253,225,163,245,182, 65,212,219, 6, 82,213, 30,142,239, 8,150,
-250,132,214,135, 64, 42,149, 66, 42,149, 98,239,222,189,224,112, 56, 85, 15, 95, 0,208,106,181, 13, 17, 45,190,142,142,142, 40,
- 45, 45, 69,243,230,205,223,177,100,113, 56, 28,176, 88, 44,112, 56, 28,240,120, 60,104, 52, 26,184,186,186,162,172,172,204,183,
- 46, 78,149, 74,213,206,202,202,170,234, 1,171,121,219, 89, 53, 26, 77, 85,125,181, 90, 45, 74, 74, 74,160, 80, 40, 32,151,203,
-161, 84, 42,253, 26,210, 94,163,209,136,103,207,158,189,242,246,246,110,199,100, 50, 33, 18,137,132, 74,165,178,202,183,168,184,
-184, 24,191,254,250,171,114,202,148, 41, 54,145,145,145,245, 10, 45,138,162,240,217,103,159,129,199,227,161,172,172, 12, 63,253,
-244, 19, 22, 46, 92, 8, 14,135, 3,185, 92,142,221,187,119, 99,201,146, 37, 96,177, 88,208,106,181,216,190,125,123,173, 92, 9,
- 9, 9,175,239,223,191,239,215,190,125,123,203, 83,167, 78, 21, 12, 24, 48,192,118,208,160, 65, 48, 49, 49,129, 74,165,130, 78,
-167, 67,151, 46, 93,224,227,227, 3,137, 68,130,243,231,207, 23,122,121,121,217, 60,120,240,192,152,151,151,151,241,255,216,187,
-238,240, 40,170,246,123,102,123, 73,175,164,144, 80, 34,164,211, 12,160,244, 18, 90, 18, 12,162, 20, 69, 81, 81,154, 5, 20, 68,
- 16, 5, 68, 52,128,162,136,130, 82, 44, 96, 16,144,110,168, 1, 19,144, 34, 66, 8, 37, 29, 2,169,187,201,110, 54,201,110,178,
-125,218,239, 15,146,124, 33, 38,217, 77,192,239,167,126,115,158,103,159,157,157,189,115,230,222,185,119,102,206,125,239,123,223,
-107, 67, 92,179,141, 44,134,160,105, 26,229,229,229,168,174,174,134, 90,173,134, 66,161, 64, 73, 73, 9, 4, 2, 1,108,232, 44,
-120,120,120, 60, 21, 25, 25,201, 7, 0,153, 76,134,222,189,123, 99,233,210,165,148,209,104,156, 12,224, 88, 93,178,113, 91, 22,
-186,136,224, 0, 0, 32, 0, 73, 68, 65, 84,183,110, 61,112,238,220, 57,129,159,159, 31,178,179,179,225,229,229, 37,144, 74,165,
- 54,133,150,143,143,207,247,191,252,242,139,123,189,184,174,191,206, 6,195,189,234,152, 56,113,162,251,142, 29, 59,190,167, 40,
- 42,230,223,246, 82,115,149, 65,212, 59,210, 89,187, 59, 73, 21,177,240,237,117,130,208,200,123,157,215,153,179, 32,248,244,147,
- 5, 17,211,226,157,143,184,202,116, 34, 91, 60,227,162, 3, 54, 62,241,196, 40,222, 51, 83,227,242, 68, 34,215,160,205, 91, 62,
-240,246,238, 48,163,145, 12,115,134,135,167, 51,130, 58,137,137,189, 71,178,188, 23, 47,249,208,156,184,227,179,252,159,118, 37,
-141, 21, 11,147, 71, 31, 59, 85, 60,167, 37,238,220,219,213,135, 13,102,105,152, 78,115,157,112,239, 48, 16,189,123,133,192,219,
-171, 10, 91,191,223,141, 46, 93,251,194,108, 54,195,217,217, 89, 78,211,180,149,207,231, 39,218, 35,178, 0,224,244,233,106, 38,
- 34,162,218,194,175, 97,168, 87,223,248,244,201, 81,227,158, 8, 31, 49, 34,154, 57,153,124,210, 58,176,143, 85, 57,110, 76,239,
-242,227,201, 27,243,148,138, 59,221, 35,122, 12, 66,102, 70,202, 88,150,197, 77,130,104,222,250,148,113, 11,199, 77, 76,102,202,
-238,221, 51, 25, 35,115, 85,182,234,163, 27,227, 98, 99,167, 71, 14, 25, 60,132, 73, 62,245,171, 69,140,138, 44,231, 65, 3, 74,
- 95,125,121,220,129,111, 19,191, 24,125,252,216,247,221,180,186,194, 36, 78,100, 53,233,164, 81, 84, 7,129, 68,194, 83,167,164,
- 80, 61,102,204, 48,215,223,143,114,185, 28,135, 14, 29,130, 88, 44,110,248,136, 68,162,134,237, 14, 29, 58,128,168,155, 70,106,
- 15, 39, 0, 40,149, 74,148,149,149,193,197,197, 5, 94, 94, 94, 40, 43, 43,195,133, 11, 23,144,155,155, 11,161, 80,136,177, 99,
-199,130,215,130,111,115, 83,206, 73, 11, 23,142, 10,235,209, 35,176,169,200, 2, 0,171,213,138,202,202, 74,196,199,199,243,142,
- 29, 59,230,115,188,168,232, 9, 0,137,173,113,246,137,141,213,148,239,221,219,236,185, 31,125,244, 81,226,252,249,243,146,177,
- 99,198,188,185,224,163,143, 54,126,185, 99, 71, 49, 77, 81, 62,109, 41, 59,143,199,227, 17, 4,129,128,128, 0, 84, 86, 86,162,
-182,246,222, 8,182,163,163, 35,220,220,220, 64,146, 36, 24,150, 21,254,149,117,221,146, 22,249,135, 96, 75, 35,193,181,229, 79,
- 22,173,186, 66, 1,192,176,198, 47, 22,134, 97,236, 18, 89, 66,161,208,166,207,149, 61, 86,174,166,176, 71,104,213,231, 85, 42,
-149, 54,220,104,141, 5, 86,125, 62,121, 60, 30,248,124,190,205,151,120,157, 24,226,215,212,212, 96,223,190,125, 24, 58,116,104,
-195,176,148, 86,171, 69,117,117, 53,180, 90, 45, 76, 38, 19,238,222,189,139,211,167, 79,163, 91,183,110,128,157,193, 95,243,243,
-243,175,116,233,210, 37,170,254, 37, 62,124,248,240,142, 63,252,240,131, 34, 38, 38,198,143,101, 89,188,247,222,123, 21,143, 61,
-246,152,103,227,151,188, 45,240,249,124, 92,184,112, 1,221,186,117, 3,203,178, 16,137, 68,200,201,201,129,183,183, 55, 24,134,
-129, 64, 32,128, 90,173,134,147, 83,235, 49, 18,111,222,188,249,226, 75, 47,189,164,112,113,113,233,169,209,104,148, 18,137,100,
-240,217,179,103, 3,172, 86, 43,156,157,157,225,236,236,140,163, 71,143,194,213,213, 21,243,231,207, 47, 50, 26,141, 23, 28, 28,
- 28, 58, 24,141,198,235,101,101,101,239,181,165,190, 41,138,130, 94,175, 71, 85, 85, 21, 42, 43, 43,161,211,233, 96, 50,153,108,
-230,177, 57, 12, 30, 60, 24, 73, 73, 73,252,132,132,132,111,243,243,243, 1, 0, 65, 65, 65,152, 63,127, 62,223,223,223, 31,119,
-239,222,197,149, 43, 87, 96,181, 90,193,178,108,171, 55,175, 64, 32, 24,254,252,243,207, 15, 10, 12, 12, 36,172, 86, 43, 24,134,
-129,217,108, 70,253,118, 81, 81, 17,194,194,194,120,157, 58,117,122, 60, 63, 63,127, 56,236,155, 88,193, 1, 64,121,209, 65,248,
- 11,189, 1,158, 51, 88,227, 65,104, 42,218, 23,197, 69,165, 82,125,180,232,253,243, 51,190, 92,107,237, 80,162, 4, 66, 34, 39,
-160,123,248, 72,188,248, 28,133,132, 79,246, 33,176, 83, 8, 10, 11, 11, 49,124,248,112,145, 66,161,120,169,182,182,118,161,189,
-220,201,201,191,211, 39,143, 30,123,122,210,148,233, 81,209,209, 49,212,137, 19, 71,113,243,250,137,140,151,166, 60,165, 98,153,
- 90,194,221, 85,118, 53, 39,251,114,247,158,189,135,193, 66,209,131,129, 21,107,129, 21,108,203,247, 59, 44, 71,142,248,242,142,
- 28,252,254,185,103,166,189,208,107,228,200,209,228,137,228, 95,112,229, 98,242,181,117,107, 95, 57,147,240,197,158,225,163,198,
- 62, 21,225,213,225,194,209,200, 96,243,203, 1, 30, 46,183,183,254, 80,201, 53,150,230,238, 77,169,148, 65,221,115,145, 71, 16,
- 96, 89,246, 62,145,213, 84,104,241,120, 60,155, 6,128,198,156,141,223, 69,245, 29,234,205,155, 55, 67, 34,145, 64, 44, 22, 67,
- 40, 20,218,116,191,104,204,153,113,247,238,136,237,137,137,146,230, 68,150, 70,163,129, 70,163, 65,109,109, 45,166, 78,157, 42,
-250,224,242,229, 71, 81,231,250,209, 18,103,160,175,175,217, 65, 38, 43,207,204,204,244, 11, 15, 15,191, 47,191, 58,157, 14, 50,
-153, 12,137, 59,119,138,226, 98, 99,231,142, 60,122,116, 29,108,196,191,106,174,236, 4, 65,192,219,219, 27,110,110,110, 32, 8,
- 2, 20, 69,161,172,172, 12, 25, 25, 25,184,124,249, 50,248, 4, 65,253,149,117,220,156, 22,249, 7, 90,181,182, 52, 59,116,216,
-210,152,104, 91,132, 22,159,207,111,183, 85,171, 37,216, 51,116, 40,151,203,111, 40, 20,138,129,254,254,254,160, 40,170, 65,104,
- 53, 29, 58,172,183,126,164,167,167, 67, 46,151,223, 48,153, 76,173,114,178, 44,251,120,191,126,253,176,127,255,126,164,164,164,
-224,206,157, 59, 48, 24, 12, 48,155,205, 48, 26,141,200,200,200, 0,195, 48,136,140,140,132,131,131, 3,228,114,249, 13,179,185,
-245,142,168, 94,175, 87, 10,133,194, 16,153, 76,214,176,207,215,215, 23, 26,141,134, 33, 73, 18,219,183,111,215,249,248,248, 56,
-200,100, 50,187,133, 43, 65, 16, 80,169, 84,232,216,177, 99,131,143, 86, 77, 77, 13,188,189,189,235,133, 5,204,102, 51,156,156,
-156,108, 14, 29, 2, 48,221,186,117,107, 65,163,223,125, 39, 77,154,244,211,238,221,187,187,158, 58,117, 10,151, 46, 93,130,151,
-151, 23, 62,254,248,227, 59, 5, 5, 5,207, 0,184,172, 82, 61, 92,191, 72,123,218,144, 70,163,217,119,227,198,141,199,251,245,
-235,215,240,148, 24, 62,124, 56, 49,124,248,112,207,198,166,126,181, 90,141, 63,254,248, 3,167, 78,157, 2, 65, 16,200,203,203,
-163,141, 70,227, 79,173,141, 82,248,251,251,255,176,116,233, 82, 71,138,162, 26,218,182, 76, 38,131, 84, 42,133, 72, 36, 2,159,
-207, 71, 65, 65, 1,226,227,227, 93,190,250,234,171,239,205,102,243, 35, 0,172,248,151,160,218, 8,107,250, 77,157, 75,100, 88,
-135,140, 45,155, 19, 6,206,156,133,250,161, 67, 42, 50,204, 59, 35,253,102,185, 75,148,183,237,242, 30, 59, 85,252,170,133, 60,
- 54,254,216,241,212,201,111,191, 57, 95, 24, 20, 20,166, 58,245,107, 90,224, 72,234, 67,194,195,211, 25,154, 10, 29, 10,138,202,
-145, 95,104, 97,131,130,194, 84, 87,254,184, 33,249,228,243,245,221,245, 6, 83,253,208, 97,171,237,244,183, 11,119, 38,172,219,
- 32, 57, 51,253,165,190, 98,153,204, 15,149, 21, 55, 16, 24,232,133,248,184,158,248,110,199, 5,184,184,184,163, 67,135, 14,224,
-241,120, 14,246,150,189,162,162,130,216,183,235,183, 25,207,191,240,202, 99, 99, 70,199, 82,199, 79, 28, 17,164,156, 60,124,225,
-251, 45,239, 30, 96,249,122, 57,193,214,200, 58,119,241,185,126,251, 86,250, 51, 35,162,167, 66, 38,114,234, 6,132, 54,219, 96,
- 27, 38, 24,176, 40,218,191,123,133,244,249, 23,102, 14, 24, 51,230, 9,234,196,137,131, 56,113,116,199,239,203,151,119, 62,122,
-167,116,167,232,226,229, 18,233,132,167,231, 84, 37, 29,203,178, 60, 53,190, 75,174,159, 67,111, 35,112,135, 83, 85,141, 59,146,
- 2, 65, 57,101, 54, 7,116, 28, 51,134,111, 40, 44, 20, 58,118,232, 64, 1, 0, 73,146, 54,133, 22, 90, 24,130,110,202,105,111,
- 94, 12, 6, 3,152, 22, 98, 39, 54,229, 44, 83,169, 58,215,117,194, 27, 64,146,100,131,200,210,104, 52,168,174,174,134,131,131,
- 3,212,102,115, 7,123, 56, 71,247,239,191,253,131, 21, 43, 22,238,221,183, 79,212, 88,100,213,127,132, 66, 33,214,172, 93, 43,
-122,227,237,183,231,204, 21, 8,230,129,162,236,190,158,245,157,118, 62,159, 15,129, 64,128,194,194, 66, 20, 21, 21,161,176,176,
- 16,133,133,133,144,201,100, 96,255,226, 73, 64,255, 96,255,172,122,145,213,248,187,193,202,213,106,120,135,182, 56,195,219, 43,
- 12,232, 54,140,239,218, 35,180,244,122,253,169,211,167, 79,247,159, 48, 97,130,224,247,223,127,135,143,143, 79,131,208,170,255,
-174, 31,142,146,203,229, 56,112,224,128, 85,175,215,159,178,113, 51,157, 62,122,244,104,212,178,101,203,132, 47,190,248, 34, 50,
- 51, 51, 49,107,214, 44, 84, 87, 87, 67,167,211, 65,163,209,192, 96, 48,160,127,255,254,144, 74,165,184,126,253, 58,105, 48, 24,
- 78,219,176,216,177, 42,149,170,214,203,203,203,183,233,127, 79, 63,253,116,135, 77,155, 54, 25,178,179,179,201,129, 3, 7, 58,
-219, 43, 56,234,177,107,215,174, 6, 75, 93,110,110, 46, 54,109,218,212,224,147,149,150,150,134, 79, 63,253,180, 33,246, 89, 27,
-113,185,162,162,130, 34, 73, 18,221,186,117,131,191,191, 63, 76, 38, 19,214,175, 95, 79, 1,184,252,255,213,154, 77, 38,211,222,
-233,211,167,191,115,245,234, 85, 95,129, 64,112,207,164, 93, 87, 62,171,213,138, 91,183,110, 33, 35, 35, 3,217,217,217,168,172,
-172,108,232, 8,164,167,167, 87,145, 36,185,167, 37, 94, 47, 47,175,247,190,251,238, 59, 31,185, 92,126, 95,123,174,183,134,214,
- 91, 73,213,106, 53, 92, 93, 93, 49,114,228, 72,239,211,167, 79,191,103, 54,155,151,253, 75,222,105,196,211, 79,230,246,125,227,
-213, 9,152, 24, 39, 47,222,159, 84,122,254,211, 79, 22,212, 57,195,123,103, 76,140,243, 47,190,150,227,138,167,159, 60,216, 23,
- 64, 9, 90,119,216,102,126, 61,163, 60,212,175,159, 91,202,254,195,135,191, 95,178,232,205,180,133, 11, 94,241, 50, 24,111, 75,
-131, 58,137, 9, 0,200, 47,180,176,215, 51, 25,211,167,235,222, 76, 75, 88,251, 21,175, 92, 83, 61,235,143, 63, 90, 14,111,208,
- 88,188,240,120,144, 6,133, 14, 85,116, 15, 30,212,229,247, 11,137,112,148, 27, 17, 18,218, 23, 99, 70, 63,142,148,212,116,148,
-169, 77, 80, 42,149, 48,155,205,173,134, 75,200,190,126,224, 57,150, 96, 3, 9,150, 40, 34,120,172,244,185,233, 47, 15,142,141,
-125,130, 77, 74, 58, 76, 29, 60,144,120,110,207,143, 27,246,242, 68, 66,129,209,226, 98, 33, 8,147, 22,188,155,153,181,250,123,
- 29, 26,161, 68,212,178,249,181, 46,176,107,120, 68,168,207,115,211,103,185,196,140,139,103,143, 30, 61,200,236,217,189, 61,101,
-207,182, 30,137, 12, 79, 39, 82, 22, 27, 36, 90, 29,169,101, 9,177,107,173,142, 49,148,231, 63, 98,242,139,125,218, 10,236,229,
-212, 85,227,247,128,217, 92, 82, 91, 92,236,235, 62,116,168,228,214,138, 21,242, 14,253,251,155,136, 58, 31,226,214,132, 22,159,
-207, 7,120, 60,198, 30, 78,123,243, 98, 52, 26,193, 0,100,123, 56, 41,138,186, 79,100,213, 11,173,250,251,197, 30,206, 45,203,
-151,255, 30, 56,102, 76,101,106,106,106,135, 97,195,134, 17, 53, 53, 53,168,169,169,185, 79,108,249,249,249, 17,225,145,145,242,
- 93, 41, 41, 65,246, 94, 79,123,202,206,227,241,254,114,161,245, 15, 71,139, 11, 73,183,186, 4, 79,189, 69,203, 30,161,101,167,
- 69,139, 36, 73, 18,222,222,222,168,168,168,104,241,197,207,227,241, 32,147,201,234,199,136, 91,157,121,103, 54,155,215, 47, 92,
-184,240,181,113,227,198,121,134,132,132, 64,173, 86,163, 67,135, 14,144, 74,165, 13,190, 99,245,124,105,105,105,248,238,187,239,
-116,102,179,121,189, 13,206,207,215,174, 93,251,234,196,137, 19,221,125,124,124,224,230,230,134,235,215,175,195,205,205, 13, 58,
-157, 14, 57, 57, 57,112,114,114,106,240,219, 57,124,248,112,141,217,108,254,220,134,120, 99,207,158, 61,107,117,114,114,186,174,
- 86,171,249,149,149,149,130,170,170, 42,129, 78,167, 19,106,181, 90,225,241,227,199, 61, 93, 92, 92, 12,191,254,250,171, 58, 48,
- 48,144,127,231,206, 29, 62, 73,146, 54,213, 43, 65, 16,152, 55,111, 30, 68, 34, 17,204,102, 51,214,175, 95,143,133, 11, 23, 54,
-248,100,173, 93,187, 22, 75,151, 46,109, 16,206, 91,183,110,109, 83,203, 97, 89, 22, 86,171, 21, 36, 73,130, 36, 73,187,196,239,
-131,192, 78,193, 94,150,151,151, 23,215,175, 95,191,147, 63,255,252,179, 71, 93, 76, 50,148,151,151,163,188,188, 28,106,181, 26,
-181,181,181,160, 40, 10,254,254,254, 40, 47, 47,199,193,131, 7,181, 53, 53, 53, 99,208,202,140, 67, 62,159, 63,125,240,224,193,
-130,166,121,168,239,229,213,139,119,137, 68, 2,133, 66,129,225,195,135,139, 83, 83, 83,167, 3,248, 71, 11,173,198,225, 29, 70,
-143,153, 33, 10,139, 24, 96,185,150,145, 84, 28,218,165,188,120, 90,188,243, 17, 0, 72,191, 89,238,114, 45,199, 21, 97, 17,113,
-236,232, 49,110, 81,229,101, 91,122, 0,176,182,182, 92, 15, 0,184,200, 37,147, 70, 69,247, 87, 56, 57, 56,240, 62, 93,183,245,
-216,215, 95,127,254,232,222, 35,255, 9,239,240,233,186,123,225, 29, 70, 69,247,103,178,179,178, 39, 1,216,102,175,120,137,139,
- 27,127,245,187, 31,190, 67,118,198,175,126,239,204,235, 41,174, 44, 39, 33,115, 12, 64, 84,239, 14,216,242,195, 13, 92,187,118,
-173,204, 98,177, 12,111,181,125, 19,108, 96, 70,230,205,224, 30, 17,225, 62,207, 77,159,233, 28, 23, 23,143,164,164, 67,248,113,
-251,182,179, 79, 77,157,248,109,105,149,142,239, 45,148,139,228, 44, 35,230,139, 92, 4, 34,137, 76,101,177,220,155, 3, 33, 20,
- 74,157,129, 73,173,190,120,102,207,156,230, 50, 34, 58, 30, 71,142, 30,194,143,219,183,156,121, 63,226,233,109, 93,250,132, 17,
-253, 31,253,100, 78,151,174, 93, 58,233,107,203,117, 60, 66,108, 53,153, 24,167, 79,182, 23,124,150,191,116,122, 62,128,117,224,
-102, 29, 54,198,245, 31, 99, 98,250,189,113,251,182,200,107,208, 32,153, 34, 37, 69, 94,183, 18, 73,171, 66, 75, 32, 16,128,109,
-121,168,235, 62, 78, 98,199, 14, 30,128, 86, 39, 97,137, 68, 34, 24, 12, 6,144, 45, 91,176,239,227,244, 61,113,162,248,246,237,
-219,221,221,221,221,239, 19, 89,149,149,149, 13,219, 38,147, 9, 6,131, 1, 50,153, 44,195,216,252,136,200,125,156,229,103,207,
-154, 86,207,155,183,236,153,169, 83, 55,156, 58,125, 90,234,225,225, 1,173, 86,123,159,208,178, 88, 44, 24, 49,114,164,104,237,
-213,171,207, 65,167, 91,110,207,245,236, 48,124,184, 77,127, 96, 62,159, 15,230, 47, 30, 58,252, 23, 96,102,115,194,139,103,107,
- 8,199,222, 89,135, 45,188, 32,155,174,238,189, 52, 42, 42,202,148,155,155,139,192,192,192, 6,177,210,248,156,206,206,206,112,
-117,117, 69, 90, 90, 26, 62,250,232, 35, 35,128,165, 54, 56,107, 12, 6,195,148, 81,163, 70, 25, 5, 2, 1, 66, 67, 67, 27,226,
-103, 49, 12, 3,177, 88, 12, 7, 7, 7, 92,189,122, 21,227,199,143, 55, 24, 12,134, 41,248,115, 12,173,166,156, 90,131,193,240,
-236,232,209,163, 13,153,153,153, 24, 60,120, 48,174, 93,187,134,218,218, 90,212,214,214,226,238,221,187, 8, 15, 15,135,193, 96,
-192,166, 77,155,140, 6,131,225, 89, 0,218,214, 56,107,106,106,198, 47, 92,184,144,255,211, 79, 63,117,241,247,247,143,232,219,
-183,111,200,200,145, 35, 31,121,242,201, 39, 59,197,196,196,248,118,239,222,221, 52,102,204, 24,175,113,227,198,121, 25, 12, 6,
-225,249,243,231,149, 36, 73,142,179,145,207, 6,113,146,155,155,219, 48, 84, 40, 16, 8, 80, 81, 81,209, 16,185,191,254,161,212,
-130, 16,142,182, 37,182,235, 5, 86,189,224,178,195,207,173, 57, 78,155, 7,137,197,226,122,139, 39,107, 7,103,122, 86, 86,214,
-168,161, 67,135,166,207,152, 49,163,166,172,172, 12, 78, 78, 78, 8, 10, 10, 66,112,112, 48, 60, 61, 61, 97,181, 90,113,224,192,
- 1,253,193,131, 7,111,104,181,218,225,248,115, 12,173,232, 38,215,241,110,115, 15,217,122,107, 86,189,208,146, 74,165,240,247,
-247,175,191,182,119,219,114, 61,219,137,191,150,179, 78,192,140, 28, 49,166,107, 76,236, 4,151, 3,135, 46,136, 55,108, 60,120,
- 35, 42, 26, 91, 61, 58,235, 14,123,116,214, 29,142,138,198,214, 13, 27, 15,222, 56,112,232,130, 56, 38,118,130,203,200, 17, 99,
-186,102,102,100,135, 52, 94,247,176,185,124, 74,165,210, 1,131, 7, 69, 85,165,158, 59,195, 36,172,253,138, 55, 98,248, 83, 87,
-183,125,123,224,192,182,111, 15, 28, 24, 49,252,169,171, 9,107,191,226,165,158, 59,195, 12, 30, 20, 85, 37,149, 74, 7,216, 83,
-246,217, 51,167,185,196,198,196, 35, 41,233, 0,181,119,215,166,181,187,247,229, 13,125,249,181,179,229,185,185,215, 88, 85,201,
- 9, 8,121,133,200,202,202,210,214,137,172, 92,123, 56,103,189, 50,173,177,200,250,205,195,103,240,214,172, 44,208,201,201,191,
-144,167, 79, 95, 53,254,150,174,210, 94,201,172,168, 84,168, 43,239,232,116, 26, 11,195,208,160,105,154,255,193, 7, 13, 14,187,
-205,214,209,192,129,195,240,235,169,157,216,254,195,102, 45,195,192, 52,105,239, 94,122,210,164, 21,108,167,206,157, 59, 37,238,
-218, 73,196, 61, 49,193,133, 5,152,241, 19,227, 93,127,218,253, 19,209,181, 91,215,206, 65, 65, 13, 33,109,254,121,109,233, 47,
-224, 92, 1, 84,233, 10, 11,207,164,125,245,149,185,195,148, 41,238,226, 14, 29,156, 65,211, 68,253,243,189,165,143, 64, 32,104,
-106,129,105,145,211,223,211,179,244,240,225,195, 8, 14, 14,134,191,191, 63, 26,251,200,214, 7,228,246,240,240,192,190,125,251,
-192,222, 31,156,186, 69,206, 62, 93,186,164,173, 89,189,218,194, 48, 12,170,170,170,254,100,205,170,170,170, 2,195, 48, 56,122,
-228,136, 69,119,111, 37, 16,187,202, 62,156,207,175,125,102,200,144,132,216,216, 88,235,237,219,183,193, 48, 12, 26, 91,182, 84,
- 42, 21, 28, 29, 29, 97, 50,155, 3, 0,200,237,225, 84, 29, 63,238, 0, 27,207,245,102, 44, 90,127, 69,189,255,211, 69, 86,227,
- 5,165,103,218,101,209,162, 40, 10, 1, 1, 1,247, 45,233,194,227,241,238,251,180,113,198,225,142,204,204,204, 19, 99,198,140,
- 89,246,216, 99,143,205, 94,182,108, 25, 63, 36, 36, 4, 90,173, 22,110,110,110,240,246,246, 70, 78, 78, 14, 14, 31, 62, 76, 87,
- 84, 84,124, 3, 96, 37,236,155, 66,159,146,151,151, 23,215,179,103,207,221,139, 23, 47,118, 25, 61,122,180, 48, 32, 32, 0, 44,
-203,226,234,213,171,216,191,127,191,117,219,182,109,186, 58,145,101,175,243,242, 73,133, 66,241,212,184,113,227, 18,167, 79,159,
-238, 68,211,180,240,238,221,187, 48,155,205, 32, 73, 18, 69, 69, 69,214,164,164,164, 90,131,193, 48, 13,192, 73, 59,248,210,170,
-171,171,195,147,147,147,167,159, 63,127,254,163, 25, 51,102,120,140, 28, 57, 82, 68, 81, 20,206,157, 59,167,238,211,167,143,183,
- 74,165,178,238,219,183, 79, 99, 50,153,150,210, 52,109,215, 18, 60, 4, 65, 64,167,211,193,211,211, 19,102,179, 25, 12,195,192,
- 98,177,192,209,209,177, 97,217, 36,150,101,209, 22,231,250, 38,109,128,111,181, 90, 49,117,234, 84, 48, 12,131,245,235,215,131,
-162,168, 54,147,185,184,184, 92, 73, 79, 79,143,235,221,187,119,131,120,169,111, 67, 18,137, 4,158,158,158,240,240,240, 64, 82,
- 82, 18,132, 66,225, 21, 91,254,110,117,184, 86, 81, 81,209, 39, 57, 57,121,192,141, 27, 55,158, 7,208,219,106,181,250,211, 52,
- 77,240,120, 60, 37,203,178,215,117, 58,221,183,176,115, 9, 30,149, 74,245,209, 11, 47,188,208,103,231,206,157,142, 2,193,127,
-110, 13,129, 64, 0,137, 68,130,250,224,152, 44,203,194, 98,177,224,189,247,222,211,233,245,250,143,254, 45, 79,137,168,190,253,
-177,101,211, 23,142,167,127, 61,161,206,202,195,254,102, 66, 56,148,148,151,109,233,161, 40, 46,118,140,234,219,223, 46, 78,210,
- 98,213, 60, 59,237,173,192,186, 37,120,222,187,123,183, 96,115,226,142,207,242, 1,224,147,207,215,119, 47,215, 84,207,202,206,
-202,158,180,121,243,174, 1,164,197,170,177,135,243, 63,226, 37, 81, 11, 22, 38, 0,151,174,222, 40,239, 50,126,202,241,165,221,
-186, 58, 63,161,210, 24, 75,107,107, 13,175, 3,200,183,183,236,131, 6, 14,197,175, 39,127,194,143,219, 19,117, 44,195, 55,121,
-122,122,178, 0,144,149,229,201,102,101, 85,179,255,241, 43,118,213, 11,217,107, 43,223,122,125,228, 91, 90, 93,229,231,235, 55,
-181, 62,148,210,179,215, 99,232,217,235, 49,188,246,250,187, 46,225, 17,161,129, 0,176,119, 47,232,136,110,153,191, 44,123,127,
-197, 19, 43, 87,174,128,174,198,140,250,229,122,114,110,102, 30,201,207,135,133,123,103,221,143,101, 20,117, 9,111,189,213,221,
- 80, 89,233, 53,232,157,119, 60, 5,111,191,205,107,205, 25,190,241,253,107, 15,231,229,235,215,143,204,122,249,229,210,229,203,
-150,141,249,102,243,102, 89,143, 30, 61, 80, 86, 86,134,208,208, 80,248,251,251, 35, 57, 57, 25,251,246,236,209, 87,215,212, 44,
- 5,240,181, 61,156, 59,142, 30,205, 9,137,136,168,216,188,121,179, 95,108,108, 44,161,215,235,161,213,106,161,213,106, 97, 54,
-155, 81, 23, 16,154,205,205,203,203, 34, 73,242, 27,123,203, 78,171,213,210,149,253,251,151,136, 24,102,205, 83, 19, 39, 46, 92,
-249,225,135,146,174, 93,187, 18,102,179,185,193,170,101,181, 90,225,232,232,104,181, 88, 44, 30, 0, 12,246,112, 74,182,109,163,
-212,106, 53,188,188,188, 26,194, 53, 53,142, 75, 88, 83, 83, 3,150,101,185, 96,186,237, 64,139, 10,201,205,205,237,138, 64, 32,
-232,216,216,186,213,220,218,121,141,247,145, 36, 89, 82, 81, 81, 17,213, 68,241,182,228, 15, 21, 4,224,227, 17, 35, 70, 60,181,
- 96,193, 2, 34, 53, 53, 21, 7, 15, 30,100,243,243,243,247,214, 89,177,242, 91,233,233,180,196,233, 36,145, 72,230, 59, 56, 56,
- 68,215,135,112,144,203,229, 55,244,122,253,169,186,225,194,154,118,112, 58, 75, 36,146,121, 14, 14, 14,163,234,150, 95,129,147,
-147, 83,186, 94,175, 79, 54,155,205, 95,160,229,133,170, 91,227,148,185,184,184,124,228,233,233,249,236,219,111,191,237,113,246,
-236, 89,229,175,191,254, 42,170,174,174,222,105,177, 88, 90, 91, 84,250, 79,156,238,238,238, 87,248,124,126,199,191,168,142,208,
-179,103,207,164,241,227,199,199, 78,155, 54, 13, 36, 73,226,235,175,191, 70,114,114,242,145, 91,183,110,197,217,232,141, 54,229,
-244,236,216,177, 99,234,236,217,179, 59, 77,157, 58, 85,238,230,230, 6,129, 64, 0,189, 94,143, 91,183,110,225,234,213,171,236,
-161, 67,135,106,211,210,210, 74, 12, 6,195, 48, 0, 21,109,184,158, 15,210,107,190,143, 83, 32, 16, 12, 13, 8, 8,216,181,124,
-249,114,167, 81,163, 70,201, 60, 60, 60,192,231,243, 65,146, 36,148, 74, 37,110,222,188,137, 19, 39, 78,232,247,238,221,171,215,
-104, 52, 83, 1,156,249,255,200,231,195,228, 12,235,142,247,155, 44, 20,221, 98,180,119, 27,105,109,230,115,196, 80,223,248, 73,
- 79,141, 27, 11, 0, 63,239, 59,118,220,142, 69,165, 91,204,167,173,188,218,195, 25,218,141,183, 60, 35,243,230,125, 1, 45, 35,
-194, 35,115,195,122, 76, 92,101, 15, 81,163,200,240,247,149,189,209,112,108, 99,155,238,125,195,172, 97, 65,136,139,159,244,100,
-236,187, 75,151,224,227,143, 18,112,232,231, 3, 71,178,242,239, 91, 38,232, 31,215,150,254, 98, 78, 98,149, 64,240,152,220,215,
-119,200,122,134, 89,114,237,230, 77,199,198, 29,182,122,203,115,227, 78,165,159,159,159, 74,169, 84,118,176,135, 51,238,203, 47,
-173, 6, 7, 7,201,146, 53,107,134,214,154, 76, 67, 87,174, 92, 41,184,124,249, 50, 54,125,245, 21,101, 42, 41, 73, 84, 3,243,
- 90, 24, 13,105,145,179,211,188,121,210, 69,155, 54,189, 24,212,173,155,247,243,207, 63, 47, 20, 10,133,208,235,245, 40, 46, 46,
-198,201, 19, 39, 44,153, 89, 89,153, 58,157,238, 9, 0, 10,123, 57,227,190,252,210,234, 26, 20, 4,185,151, 23,123, 58, 37,197,
-101,214,252,249,179, 59,119,233,226, 50,102,236, 88,161,179,179, 51,170,170,170,112,247,238, 93, 28, 56,112, 64, 85, 91, 91,235,
- 7,128,182,135, 51,241,252,249,158, 71,207,156,121,122,213,170, 85,226,200,200, 72,184,184,184,160,166,166, 6, 55,111,222,196,
-153, 51,103,204,223,124,243,141, 86,171,213,206,166,105,250,240, 95, 88,239,255, 6,171, 86, 61,182,216, 20, 90,255,197, 27, 48,
- 10,192,251,117,219, 31,194,246,154,129,255,166,135, 79,160,187,187,251, 22,147,201,196, 26,141,198, 89, 0,138,254,134,249, 20,
- 68, 69, 69,109, 82,169, 84, 3, 88,150,133,139,139,203,133,140,140,140,185,104, 97,230,141, 13, 78, 62,128, 1,142,142,142,253,
-157,156,156,134,154,205,230,176,186,225,183, 44,189, 94,127,198,106,181, 94,170,179, 62,209,255,207,101,231, 3, 24,229,231,231,
-247, 50,195, 48,221, 8,130,112,165,105, 26, 36, 73, 86, 51, 12,115, 75,171,213,110, 3,144,252, 55,200,231, 67,225, 12,127, 4,
- 79,178, 60,132,181, 36, 8,238, 19, 90, 77, 4, 4,193, 32, 43,243, 54, 14,180, 33,159,188,113,209, 1, 27,129,123, 51, 19, 97,
-219,185,246, 63, 66,203, 14,241,210,102,145,249, 8,255, 5,150, 96,239,227, 36, 88,162, 40,180,231,147, 63, 62,136,208,178, 23,
-225,193, 24, 10, 22, 3, 24, 22,151,178,111,225,215,127,241,179,238,161,113,126, 12,184,127,229,230,118,129, 39, 16,248, 0,224,
-213, 89, 95, 24,134, 32,104,150, 32,168,198,195, 91, 77, 58,150,173,114, 90,129, 30, 66,137, 36,128,166,168, 14,101,128,227, 81,
-154,126,212,196,178,181, 29,129,247,211,129,156,246,228,211, 10,244,224, 75, 36,129, 71, 89, 54, 94,237,224,208, 83,101, 52,122,
- 1, 96, 29, 29, 28,178,116,122,253,118,147,201,180, 17,127, 30,185,176,201, 41,146, 72, 58,210, 20,213, 1, 0,120, 2,129,106,
-183,217, 28, 80,226,236,252,188,201,108,238,228,232,232, 72, 90, 44, 22,157,201,100,154, 70, 81,212,233,182,148,253, 22, 69,133,
-159,231,241, 6, 91, 29, 28, 60,172, 4,225, 96,161, 40,171,197,106, 45, 54,153, 76, 55, 0,124, 6,224,246, 95, 92,239, 28,218,
-121,179,112,156, 28, 39,199,201,113,114,156, 28, 39,199,249,215,115,202, 1, 4,214,117, 22,255,137,101,255, 55,193, 62, 31, 45,
- 14, 28, 56,112,224,192,129,195, 63, 6, 6, 52,227,147,197,225,255, 23, 68, 43,170,180, 45, 38,193,246, 40,219, 83, 28, 39,199,
-201,113,114,156, 28, 39,199,201,113,254,207,113,218,226,254, 39, 14, 73,182,184,214,225, 95, 13,206,252,203,113,114,156, 28, 39,
-199,201,113,114,156, 28,231,255, 44,120,220, 37,104, 17, 29,234, 62, 15, 59, 45,135,127,119, 91,104, 10,255,186, 79, 91,210,251,
-114,151,156, 3, 7, 14, 28, 56,161,245, 87,191,180, 30,228,229,246,160,194, 39,129, 32,160, 32, 8, 40, 0, 36, 60,196,180,182,
-224,231,233,233,249, 70,120,120,120, 98,135, 14, 29, 94, 3,224,221,198,227,187,203,229,242, 47, 28, 28, 28, 82, 29, 28, 28, 82,
-229,114,249, 23, 0,186, 63,164,122, 35, 0,204,146, 72, 36, 41,190,190,190,165, 98,177, 56, 5,192,108,180,127,230,106, 8,238,
-197, 73,251, 16, 64,207,182, 28,232, 29, 17,191,199, 43, 34,254,186, 87, 68,252, 77,143,200,241,221,189, 34,226,111,122, 69,196,
- 95,247,142,136,223,243, 23,180,215, 7,169,223, 4,130, 64, 17, 65,160,200,206, 99, 63, 35,128, 98,130, 64,201, 67,104, 75, 28,
- 56,112,224,192,225,159, 6, 63, 63,191,167,124,125,125, 79,249,250,250, 38,251,249,249, 61,101,199, 33,209,205,188,120,104,130,
- 0,109,227, 69,210, 90, 58, 91,230,202,198,199,126,106,103,209, 26,115,118, 32, 8,208,108, 29, 8, 2,140,183,183,247, 6, 95,
- 95,223,132,166, 31,111,111,239, 13, 4, 1,166, 81, 90,186,145,192,107,171, 89,181,195,115,207, 61,247,115, 85, 85, 85,146,197,
- 98, 73,202,203,203, 75, 26, 54,108,216,238, 38,214,141, 22, 57,165, 82,233, 51,253,250, 15, 72, 59,115,238, 82, 94,238,173, 2,
- 69,102,206,157,130, 95,142,159,190, 28,217,163,231, 31, 82,169,244,153, 54,212, 17, 1, 96,150, 64, 32, 72,113,116,116, 44, 17,
- 8, 4, 41, 0,230,240,249,252,195,171, 87,175, 46,200,200,200, 40, 63,127,254,124,245,153, 51,103, 74,103,204,152,113,139, 32,
-136, 95,154, 17,236,209,205, 88,105,154, 90,117,150, 21, 22, 22, 30, 87, 42,149, 39,100, 50,217, 71,118,164,111,224,244,138,136,
-191,174,210, 90, 89,149,214,202,122, 69,196,179,141,182,175,183,241,154,219,170,163, 63,181, 5,137, 68, 18,104, 67,208, 71,183,
-116, 44, 0,159,186,255,162, 0,124, 89,247,169,159,122,238, 35,149, 72, 30, 86, 91,122, 24,101,231, 56, 57, 78,142,147,227,252,
-111,115,254,147,209,167,238,219, 23,247,252,181, 26,222,221,109,157,117,248,106, 94, 94,158, 35, 0, 4, 7, 7,207, 5,176,175,
- 45, 66,130, 32,176,136, 97, 88, 30, 0,240,120,196, 59,195,135,143,232, 35,147,201,238,139,130,108, 52, 26,197, 41, 41,191,142,
-100, 24,150,168, 75,183,136,101,241, 5,128,114,123,207, 97,177,152,121, 66,161, 24, 60, 30,241, 86,100,100,143,206, 21, 21, 21,
-103,121, 60, 94, 98,105,105,105, 85,155,205, 56, 4,129,173, 91,183, 6,251,250,250,254, 41, 90,179, 82,169, 20,199,199, 63,209,
- 38,190, 23, 0,137, 89, 34,233, 47, 34, 8, 95,154,162, 92, 1, 64, 32, 16, 84, 93, 22,139,163, 62, 94,181, 74, 78, 16, 4,163,
-209,104, 96, 52, 26,241,230,155,111,202, 50, 51, 51, 39, 84, 84, 84,108,180, 65, 27,220,179, 87,159, 55, 79,156, 56, 30,166,171,
-172, 50,109,253,124,115,154, 81, 32, 50,116, 9, 15, 21,109,218,178,221,109,230,139,211, 94,207,206,206, 72, 71,243,203,145, 52,
- 6, 15,192,129,249,243,231, 71,196,197,197,137,107,106,106,164, 70,163,177,115, 98, 98,226,123, 81, 81, 81,142,189,123,247, 22,
-239,218,181,139,208,106,181, 96, 89, 86, 30, 26, 26,202, 78,158, 60,217,180,123,247,238,215, 0,108,104, 69,248, 46,186,119, 45,
-121,235, 67, 66, 66,150, 3, 64, 94, 94,158,168,209, 53, 22,134,133,133, 57, 0, 64, 78, 78,206, 7, 44,203,204, 7, 0,150,197,
- 90, 0, 75,154, 49,173,229, 69, 12,154, 4, 16,232,150,113,238,103,105,196,224, 73, 38,176,184, 69, 0,121,117, 29,130,149, 64,
-163,184, 80,247, 35, 75,161, 80,180,107,109,194,216,216, 56,130, 32,136,189,105,105,105,251, 84, 42, 85, 23,134,161, 95,105, 45,
-159, 77,218, 17,225,225,225,241, 66, 69, 69, 69, 2,128,151,179,178,178,250, 0, 64, 88, 88,152, 8,192, 21,103,103,231,129, 86,
-139,133,224,158, 85, 28, 56,112,224,240,143, 21, 90, 87, 1,196,226, 63, 75,240,108,105,143,208, 18, 3,192,217,179,103, 1, 64,
-210,142,140, 16,141, 5,204,188,121,243,224,235,235,219, 84,188, 32, 53, 53,229, 65, 10,123,223, 57, 62,252,240, 67,199,234,234,
-234,232,111,191,253,118, 8,203,178,159, 42, 20,138,223,109, 28, 95,206,178, 88,203,227, 17,239, 16, 4, 1,137, 68,154, 59,123,
-246,236,171,117,255,117,254,229,151, 95,228,227,199,143, 55, 0, 40, 0, 0,137, 68,234,207,231,243,130, 89,150,173,127,225,182,
- 40, 8,159, 6,130, 40,177,120,196,172, 47,191,164, 30, 29, 63, 94,224,224,229, 69, 0, 64, 65,118,182,199,218, 79, 62, 25, 88,
-149,159, 47, 54,122,120,104, 52,122,189, 49, 55, 55, 23, 18,137,132,224,243,249,143,218, 42,176,131,131,195, 27,171, 62, 94,227,
-160,171,172, 54,154,116, 53, 22, 62, 69,154,157,100,114,186,188, 76,165,113,148, 57, 24,222,121,127,133,248,213, 87,166,191,161,
-215,235,231,218,160,122,237,173,183,222, 10,235,215,175,159,255,158, 61,123, 8,173, 86, 11,129, 64,224,216,187,119,111, 68, 69,
- 69,209,191,254,250, 43,209,165, 75, 23, 68, 70, 70,226,220,185,115,184,112,225, 2,209,167, 79, 31,249,254,253,251,159, 35, 73,
-114,131, 45,113,205,231,243,222, 12, 13, 13,237,237,224,224, 96, 9, 14, 14,198, 43,175,188, 2,150,101, 17, 29, 29, 29,233,232,
-232,184, 79,175,215,139,115,114,178,135,216, 18,217,170,140, 67,147,235, 45, 91, 0,122,128,197, 45,117,198,161,198,195,143, 97,
- 57, 57, 57,143, 85, 85, 85,225, 94,189,176, 13, 11,152, 15, 25, 50,164, 45,109,169,156,101,177,118,252,248,184,119, 0,130,136,
-142,142,174,126,237,181,215,120,217,217,217,207, 62,249,228,132,200,188,188, 91,104, 37,159,141,219, 17,241,194, 11, 47,150, 59,
- 58, 58, 78,220,187,119,111,142, 82,169, 20,136, 68, 13, 58,147,239,237,237,237, 21, 28, 28, 60,199,221,221, 93,197,231,241,188,
- 89,176,172,173,182,196,129, 3, 7, 14, 28,254, 86, 56, 82, 39,174,142, 52,253, 67, 0, 0, 73, 73, 73, 13,145,105,227,226,226,
- 90,236, 85,179, 44, 91,126,237,218,181, 0,131,193, 0,150,101,237,121, 9, 52,158,162, 89, 78, 16,188, 77, 60, 30, 49,151, 32,
- 8, 68, 70,246,184,179,126,253,250,230,214,244,178, 68, 70,246,184,195,231,243,186,178, 44, 11,130,224,125,205,178, 76,121, 11,
-156,205,190, 24,197, 98,201, 34, 0,240,241,241,205, 63,118,236,152,229,233,167,159,198, 39,159,124, 34, 90,188,120,241, 66,129,
- 64,240, 90, 81, 81, 81, 89, 43,249, 4,128, 37, 94, 94,222,242,173, 91,183, 6,207,158, 61,251,170, 82,169, 92, 2, 0,190,190,
-190, 9, 0,194, 1, 20, 52,218,135,111,190,217, 93,250,202, 43,175,228,170, 84,170, 37, 45,113, 78, 4, 30, 9, 8, 13, 29,177,
-242,236, 89,150,103, 54, 19, 21,191,253,166, 83,151,151,147,183,213,106,249, 15, 87,174,196,189,151,144, 32, 12, 8, 12, 68,234,
-225,195,158, 21, 6,131, 90,107, 54,155,202,203,203, 89,138,162, 46,216, 81,246, 8,111, 47,111,249,230,207,190,190,236, 36,228,
- 51,222, 29,253, 9,161,187,187,128, 39,119, 22,243, 5, 60,115,215,206,221,197, 0, 34,108,213,145, 72, 36,122,110,244,232,209,
-242,221,187,119, 19,145,145,145,112,117,117,197,111,191,253,134,244,244,116, 84, 85, 85,241, 72,146, 68,223,190,125,177,102,205,
- 26, 4, 6, 6,162,186,186, 26, 69, 69, 69,158, 98,177,216,139, 36,201,150,174,231,125,237,105,209,162, 69,240,245,245, 5, 69,
- 81,168,172,172, 4, 69, 81,112,116,116, 4, 0,148,148,148,224,240,225, 67,246,180, 37,155, 96, 89, 22,143, 63,254,120, 13, 65,
- 16, 89, 77, 45, 90,109,225,244,247,247,223,165, 86, 87,140, 27, 49, 98, 4,170,170,170,200, 21, 43, 86,160,103,207,158, 8, 14,
- 14,182, 39,159, 75, 68, 34,241,183,157, 58,117,250,108,222,188,121,190,238,238,238, 48,155,205,239,149,149,149, 97,206,156, 57,
- 0,128,152,152,152,158, 66,161,240,216,140, 25, 51,208,165, 75,151,210,202,202,202,162,180,180,180, 87, 12, 6,195,205,246,150,
-221, 78,112,156, 28, 39,199,201,113,254,173, 56,237,213, 34,127, 83, 40,113,127, 56,135, 45,247, 9,173,184,184, 56, 34, 41, 41,
-137,181,163, 96,154,142, 29, 59, 6,200,100, 50, 0,208,180, 53, 23, 12,195,188,230,225,225,161, 90,178,100,201,160,224,224, 96,
-203,107,175,189,118,179,160,160, 96,105,227, 52,157, 59,119,254,232,171,175,190, 66,110,110,110, 65, 66, 66,194, 57,141, 70,211,
-214,117,204, 22,179, 44,214,215, 89,199, 42, 14, 31, 62,220,243,236,217,179,115, 63,255,252,115,175, 87, 95,125, 85,244,198, 27,
-111, 76, 3,240,137, 45, 18, 62,159,111,104,110,184,176, 57,248,250,250, 90,248,124,126,139, 65,226,226, 0,153, 84, 44, 30,190,
-242,236, 89,214, 82, 80, 96,248,110,221, 58,167,205,127,252,177,156,100,217, 14,222,222,222, 24, 60,112, 96,173,148,207,175, 80,
-149,149, 49,222,143, 60,194,191,123,236,152,167, 81, 44, 86,236,222,189, 91,171,209,104, 14,218, 52,225, 17,132,142, 97, 89,139,
- 99,199, 64,242,233, 9,163, 34, 47, 95, 74,207,118,242,246,228,245,233, 29,217, 51, 59,183, 32, 13, 12, 99, 37, 8, 66,103,139,
-199,197,197, 37, 88,163,209, 64,167,211,193,203,203, 11,235,215,175,135,143,143, 15, 12, 6, 3, 50, 50, 50,216,142, 29, 59, 18,
-103,207,158, 69,199,142, 29,161, 86,171, 97,144,143,144,232, 0, 0, 32, 0, 73, 68, 65, 84,177, 88, 80, 83, 83,163, 50,155,205,
- 45,173,205, 88,206,227,241,191,231,241,136, 23, 9,130, 64,215,174, 65,133, 27, 55,110,180, 48, 12,131,176,176, 48, 60,249,228,
-147,216,191,127, 63, 50, 50, 50,234, 45, 79,150, 78,157, 58, 23,242,120, 68,167, 58,173,212,110,171, 78,253,210, 62, 10,133, 98,
- 98, 59,111, 26,158,159,159,223,180,110,221,186,205,125,230,153,103, 72,177, 88, 12,189, 94, 95,127, 45,200,113,227, 98,170,199,
-143,143,115, 57,114,228, 72,171,249,180, 88, 44,249, 90,173,246,229,183,222,122, 43,241,155,111,190,113, 91,186,116, 41, 24,134,
- 1,203,178,160, 40,170, 97,209,111,134, 97,112,224,192, 1,220,190,125,251,163, 38, 34,139, 3, 7, 14, 28,254, 39,208, 6, 45,
-242,119,132, 47,238, 13, 27,162,169,216,250,175, 71,134,231,243,249,155, 79,158, 60,217,123,200,144, 33,130,145, 35, 71, 70, 30,
- 63,126, 60,178,180,180,244,102,157,245, 32,114,228,200,145,145,222,222,222,248,226,139, 47, 12,124, 62,127,115, 59, 79,211,240,
-210, 43, 43, 43,187, 10,224,211,253,251,247,175,157, 53,107, 22,124,124,124,194,149, 74,229,127,181,204,206, 18, 73,159, 25,235,
-215, 83, 66,146,228,125,249,233,167,206,235, 82, 82,214,238,249,249,103,193,227,143, 63, 78,176, 44,139, 27,215,175,203,214,108,
-216, 32,159, 58, 97, 66, 65, 78,126, 62,117,232,196, 9,178,188,180,180,178, 84,173, 94, 6,160,210, 22, 63, 73,146, 23,243,242,
-242,252, 6, 15,125,220,255,204, 31, 55,211,159,158, 16, 51, 66, 40,224, 17,183, 10, 74,174,248,250,120,186,164,166,156, 50,146,
- 36,121,209, 22,143, 94,175,191, 75, 81,148, 59,203,178, 94,169,169,169,240,242,242, 66, 85, 85, 21, 72,146,132,197, 98,177, 24,
- 12, 6,169, 70,163,129,201,100,130,217,108,134,179,179, 51,110,220,184, 81, 78, 81,212,175, 45,113,210, 52, 61, 67, 34,145,124,
- 40, 20, 10,197, 34,145, 72,113,229,202, 21,232,116,186,206,174,174,174,159, 80, 20, 5,133, 66,129,179,103,207,190,237,236,236,
- 92, 0, 0, 82,169, 20, 98,177,196,195,108, 54, 83, 0, 74,219,123,205, 89,150,109,119,125,249,248,248, 4,202,100,178,149,239,
-188,179, 40,172, 87,175,222, 80,171,213, 96, 24, 6, 14, 14, 14, 48, 24, 12,112,118,118,198,128, 1, 3,238,174, 92,185, 82,201,
-178,152,105, 75, 12,170, 84, 42,181, 64, 32,120,109,214,172, 89, 31, 6, 7, 7,119,101, 89, 22,221,187,119,199,232,209,163,113,
-236,216, 49,228,230,230, 66,175,215,211,191,255,254,251, 79, 74,165,242, 23,238,113,203,129, 3, 7, 14,255, 56,252,201, 55,235,
- 62,139,214,127, 19, 42,149, 74,157,157,157,125, 60, 45, 45, 45,110,242,228,201, 72, 77, 77,125, 1,192, 91, 0, 32,145, 72, 94,
-152, 60,121, 50,210,210,210,144,157,157,125, 92,165, 82,169, 31,198, 57,197, 98,177,201, 98,185,103,156,146, 74,165,210, 54, 30,
-222,185,110,200, 16, 0, 58,183,178,175,101,211,136, 64,224,219, 99,236, 88, 65, 85,122,186,110,235,165, 75, 31, 38, 38, 38, 10,
- 6, 13, 26, 68,144, 86, 43,104,134, 65, 80, 80, 16, 49, 50, 58,218,225,251,196, 68,119, 90,175, 63,187,234,157,119,126,219, 50,
- 99, 70,109, 94,157, 31,152, 45,152,205,230, 13,115,231,188, 28,157,146,250,155,127,120,232, 35,238,199, 79,166, 92,245,240,112,
-145, 7,119,235,230,160,169,170,164,151, 46,126, 91, 96, 54,155,191,180,197, 99, 52, 26, 15,156, 58,117,106, 66, 64, 64,128,215,
-205,155, 55, 97,177, 88, 64,211, 52, 70,142, 28, 9,150,101, 37, 0, 24,129, 64,128,236,236,108, 88,173, 86, 85, 94, 94,158,226,
-214,173, 91, 18, 0,171,109,228,175,208,108, 54, 35, 43,235,222,168, 93,199,142, 29, 71,197,198,198,130,162, 40,140, 29, 59, 22,
-135, 14, 29, 26,149,149,149,181,174,177,230,123,208, 58,175,179,144,133,249,249,249,237,175,219,101,151, 19,188,191,191,127,100,
- 80, 80,208, 55,171, 87,175, 22,117,236,216, 17, 44,203,194,205,205, 21, 6,131, 1, 21, 21, 26,132,135,135, 35, 32, 32, 0,171,
- 87,175, 6,128,159,236,181,184, 41, 20,138, 91, 10,133, 98,178, 74,165, 18, 85, 87, 87, 71,141, 26, 53,234,139,232,232,104, 92,
-189,122, 21,191,253,246,219, 84,137, 68,162,178, 90,173,148,143,143,207, 76,130, 32,156,173, 86,235, 78,141, 70,163,228,158, 93,
- 28, 56,112,224,240,143, 64,189,143, 22, 26,125,183,205,162, 21, 22, 22,230, 80, 80, 80,240,124,231,206,157,197, 0, 32,147,201,
-194,131,130,130, 22,230,231,231,215,180, 53, 55, 6,131, 97, 79, 98, 98,226,232,207, 62,251, 76, 20, 19, 19,243,200,254,253,251,
-251, 1, 64, 76, 76,204, 35, 78, 78, 78, 72, 76, 76,180, 26, 12,134,135, 22, 19,137, 36,201, 33,125,251,246, 69,101,101, 37, 10,
- 10, 10,218, 52, 44,243,203, 47,191,200,113,207, 47,171,213,125,173,129,178, 88,220, 92,253,253,121,165, 41, 41,214, 74,157,206,
-119,200,208,161, 4,105,181,130,199,227, 65,163,209,160,168,168, 8, 46,174,174, 68,118, 94,158,227,182, 69,139,126,233,220,171,
-151,152,182, 88, 60,218,144, 77,125,133,170,252,197,215, 95,123,245,192,206,157, 63,121, 85,235,116,183,101, 50,185, 89, 34, 17,
-249,204,123,253,117,186,178,178,114, 58,128, 90, 59,120, 86,239,220,185,115,236,216,177, 99,175, 7, 6, 6,122,171,213,106,159,
-234,234,106,186,178,178,146,143,123,190, 86, 4, 0,164,164,164, 64,167,211, 81, 52, 77,159,197,189, 88, 88, 22,123, 51,218,169,
- 83, 39,151,168,168,168, 97, 94, 94, 94,208,106,181,240,240,240, 64,239,222,189,135,241,249,252,111, 11, 11, 11,181, 15,179,213,
- 39, 39, 39, 59,177, 44,251, 24,203,178, 24, 59,118,172, 93,199,208, 52,253, 82,108,108,172,136, 32, 8, 24,141, 6, 72,165, 50,
- 56, 56, 56,194,201,201, 25,193,193, 33, 80, 40, 20, 24, 51,102,140,229,246,237,219,155,148, 74,101,155,219,168, 86,171,141, 31,
- 48, 96,192,130, 57,115,230,128,162, 40,196,199,199,163,184,184,120,221,221,187,119,119,251,249,249, 77,123,233,165,151,188, 60,
- 60, 60,176, 96,193, 2, 25,128, 15,184,103, 23, 7, 14, 28, 56,252, 35,208,212, 71,235,207, 22,173,214,198, 68,125,124,124, 6,
- 19, 4,241,158,209,104, 20,215, 15,201, 16, 4, 33,246,242,242, 58,100, 52, 26, 19,148, 74,101,155,156,226,170,171,171,117,119,
-238,220, 57,116,241,226,197, 73, 19, 39, 78, 68,114,114,242,116, 0,152, 56,113, 34, 46, 94,188,136, 59,119,238, 28,170,174,174,
-214, 61,140,146,251,251,251,143, 27, 58,116,232,196,190,125,251, 34, 41, 41, 9, 52, 77, 95,104,203,241,141,103, 24,162,153, 89,
-135,245,251,236, 34,227,243, 65, 16, 4, 40,138, 2, 0, 84,168,213,200,205,201, 65,101, 85, 21,204, 38, 19,244, 6, 3, 29,220,
-165,139, 81,107,177, 8, 9,160,173, 99, 95,133,105,151,127, 47, 50,232,245,222, 30,110,238, 70,185, 92,130,106,157, 86,116,229,
-242,239,181, 0,110,219,201, 97, 97, 89,118,232,177, 99,199,150,241,249,252,201,142,142,142,152, 59,119, 46,127,216,176, 97, 16,
-137, 68, 48,155,205,168,174,174, 70, 98, 98,162,154,166,233,174,117,199, 56,202,229,242,237,124, 62,191,164,166,166,230, 61,155,
- 39,176, 88, 98,226,226,226, 4, 22,139, 5,171, 86,173,194,242,229,203, 49,118,236, 88,193,229,203,151, 99, 0,236,124, 88, 45,
-158, 97, 24,140, 26, 53,170,177, 51,124,150, 61,199, 9,133,194,200,110,221,186, 65,173, 86, 67,173, 86,195,203,203, 11,126,126,
-126,240,241,241,193,186,117,235,216, 47,190,248,226,184,213,106,221, 84, 81, 81, 81,222,142,182, 56,115,250,244,233, 51, 39, 77,
-154,132,218,218, 90, 92,188,120, 17, 3, 7, 14,196,218,181,107,125,207,158, 61,251, 86,223,190,125, 33, 20, 10,145,154,154, 10,
-138,162,138,185,231, 22, 7, 14, 28,254,215,240, 15,245,207,106, 21,173, 90,180, 2, 2, 2, 92,105,154,126, 59, 54, 54,118,212,
-132, 9, 19, 48,102,204,152,251,254,223,185,115,167,211,190,125,251, 18, 54,108,216, 48,214,106,181,174,110,203, 80, 31,195, 48,
- 7,118,238,220, 25,243,248,227,143,203,135, 15, 31, 30, 4, 0, 18,137,196,178,115,231, 78, 3,195, 48, 7,218, 81,150,250,224,
-142,229, 0,224,231,231,215, 83, 32, 16, 76, 28, 55,110, 92,207, 23, 95,124, 17, 25, 25, 25, 72, 76, 76,188, 21, 28, 28,124,174,
-188,188, 77,239,200, 2, 27,179, 14, 19,108, 89,183,248, 98,177,166,186,172,204,213, 49, 48, 80,232,230,228,164, 76, 74, 74, 10,
-136,142,142, 38,138,139,139, 81, 85, 85, 5,147,201,132,203,151, 47, 51, 2,160, 80,224,230, 70, 20, 94,188, 72,240,197, 98, 13,
-238,159,201,103, 19, 1,190,110,221,223, 95, 60,187,179,201,108,138,208,106,181,148, 64, 40, 20,118,244,113, 45,206,185,221,166,
-145, 56,179, 92, 46,143, 2, 32, 96, 24,198,224,238,238, 46, 63,121,242, 36,196, 98, 49, 8,130, 64,143, 30, 61, 32,149, 74, 69,
- 44,203, 22, 1,128,147,147,147,120,243,230,205, 46,211,166, 77,251,205, 22,113,159, 62,125,132, 18,137,228,137,224,224, 96, 92,
-188,120, 17, 55,111,222, 44,188,120,241, 98,167, 62,125,250, 32, 48, 48,240, 9, 95, 95,223,159,175, 94,189, 74, 62,140,134,125,
-111,198,106,219,157,225,105,154,102, 8,130, 0,143,199, 3,195, 48, 80,171,213,232,218,181, 43, 54,110,220,136,245,235,215,175,
- 82, 42,149,135,219,147,159,176,176, 48, 81,215,174, 93,167, 79,154, 52, 9,249,249,249, 72, 72, 72,168, 80, 42,149, 41, 39, 78,
-156,120,106,206,156, 57,252,129, 3, 7, 66,163,209,224,251,239,191,167,174, 92,185,242, 93, 89, 89,217, 14,238,145,203,129, 3,
- 7, 14,255, 98,161, 21, 16, 16, 48, 73, 36, 18, 45,152, 50,101, 10, 63, 36, 36, 4,229,229,229,112,118,118, 38, 9,130, 16, 2,
-128,171,171, 43, 41,147,201, 48,123,246,108,244,234,213,107,240,162, 69,139, 6, 10, 4,130,141, 10,133, 98,187, 61, 39, 86,169,
- 84, 6, 30,143,183,119,238,220,185,171,211,211,175,118, 5,128, 63,254,248,227,142, 66,161, 88,172, 82,169, 12,109, 44, 71,125,
- 80, 76, 66, 34,145, 94,234,222,189,251,221,168,168, 40,231, 9, 19, 38,192,203,203, 11,105,105,105, 88,179,102, 77,158,197, 98,
- 89,118,230,204, 25,234,191,125,145, 41,179,185,236,202,193,131, 78,195,158,125,214,121, 94,108,236,167,175,206,157,251,217,251,
-239,191, 47, 8, 9, 9, 33, 12, 6, 3, 46, 93,186,196,238,219,183,143,252,254,195, 15,215,195,193, 65,120,113,223, 62,177,197,
- 98, 41,108,163,181,100,232,160, 33,131, 67, 62,253,108, 3, 76,198, 90, 92,186,112, 4, 85, 85,106,108,222,178, 63,196,223,159,
- 29, 90, 90, 90,122,198, 94, 46,130, 32,130,147,147,147,189, 89,150,133, 88, 44,198,202,149, 43,225,231,231, 7,103,103,103,212,
-212,212,224,173,183,222,114,153, 63,127,190, 11, 0,100,100,100, 52,132,103,176, 5,133, 66, 49, 96,246,236,217, 78, 20, 69,225,
-248,241,227, 22,130, 32,222, 59,117,234,212,183, 61,122,244, 16, 15, 30, 60,216,105,199,142, 29, 3, 1,164, 62, 44,161,213,206,
-227,110,157, 60,121,178,239,228,201,147, 89,161, 80, 72, 84, 87, 87,195,213,213, 21, 27, 55,110,212, 43,149,202, 35,237,110, 3,
- 20, 37,150,203,229, 98,150,101,177,119,239, 94, 20, 22, 22,190,164,209,104,202,104,154,222,255,246,219,111, 47, 12, 9, 9,233,
-146,147,147, 83, 88, 83, 83,179, 86,165, 82,221,229, 30, 77, 28, 56,112,224,240,143, 66,189, 19,124,253,236,195, 35,184, 55,156,
-216,178,208,162,105,122,246,137, 19, 39,248, 12,195, 96,203,150, 45,184,114,229, 10, 43,151,203,223,147,203,229, 95,201,100, 50,
-218,104, 52,206,122,229,149, 87,166, 45, 95,190,156, 55,120,240, 96, 92,188,120,145,215,181,107,215,233, 0, 26, 11,173,104,180,
- 18,107, 67,171,213, 94, 46, 47, 47,235,218, 40, 64,101, 87,137, 68,122,217, 70, 97,154,114, 54, 13,138,217,127,229,202,149,122,
- 95, 95, 95,203,205,155, 55,241,205, 55,223, 48, 87,174, 92, 73, 17,139,197,155,149, 74,165,217, 78,206,135,129, 6, 78, 49, 69,
-165,253,184,112, 97,216,163,241,241,204,203, 11, 22,212,138,100,178, 55, 62,221,176, 97, 81,117, 77,141, 31, 8,130,245,112,113,
- 41,220,178,114,101,194,216, 39,158,168,205, 56,115, 70,154,158,156, 44,244, 34,201,107,109,201,103,105,105,233,153,212,212,223,
-240,195,214,207, 96,181,154,161, 44,189,167,211, 42, 52, 90,216, 16, 89,127,226,164, 40, 74,251,212, 83, 79,137, 0,200,158,123,
-238, 57,177, 74,165,194, 35,143, 60, 2, 0,208,233,116, 56,114,228, 8, 66, 67, 67, 1, 0, 55,110,220,104,216,182,149, 79, 7,
- 7,135, 39, 6, 14, 28,136,194,194, 66,100,100,100,156, 86, 42,149, 26, 0,167,139,139,139, 99,250,246,237,139, 3, 7, 14,140,
-111, 69,104,181,169,142,236, 20, 90,127,226,148,201,100,139,247,239,223,255,210,133, 11, 23, 38, 47, 92,184, 80, 56,114,228, 72,
- 0, 64, 77, 77,141, 1, 0,221, 30,206,198,121, 34, 73, 18, 12,195,192,221,221, 93,175,209,104,160, 82,169,238,170, 84,170,185,
-183,111,223,110, 23,231,195,104,159, 28, 39,199,201,113,114,156,127, 19,206,127, 3,236,143, 12,207,178, 44,197, 48, 12, 82, 83,
- 83,177,127,255,126,218,106,181,206, 84, 42,149, 55, 26, 37,217,144,150,150,150,252,212, 83, 79,109,207,201,201,225,103,102,102,
-130,101, 89,186, 45,185, 49,153, 76, 36, 65,252,121,223,131,150,242,135, 31,126, 64, 89, 89,153,181,184,184,248, 20, 69, 81, 7,
- 30,112,246,226, 3,207, 58,252, 1, 48, 63, 99,177,156, 90, 62,104,208,168,101,201,201,146,151,223,125,215,252,194,139, 47,190,
- 77, 91, 44, 36, 95, 36, 98,196, 14, 14, 60, 90, 34, 17,102,156, 57, 35,253, 98,206, 28,119,163,217,124, 60,177, 13, 14,230,245,
- 22,173, 97,195, 6,227,133,151,223,132,177,145, 69,235,226,229, 92,152,173,104,147, 69,203,108, 54, 71, 40,149, 74, 72,165,210,
- 34, 0, 62,207, 63,255, 60, 24,134,129,209,104, 68, 77, 77, 13, 20, 10,133,246,197, 23, 95,164,235,196,147, 96,226,196,137,206,
-246,240, 6, 5, 5,249, 9,133, 66, 28, 63,126, 28, 66,161,240, 8, 0, 8,133,194, 35,201,201,201, 49, 83,167, 78,133,191,191,
-127, 80,126,126, 62, 1, 27,254,105,222, 17,241,123, 88,160, 59, 8,116,187,103,130, 67, 55,175,136,248,235, 4,144, 87, 23, 53,
- 62,171, 79,159, 62,128,157,126, 89,141, 81, 55,185, 99, 61, 73,146, 63, 47, 90,180,104,110,255,254,253, 71, 47, 95,190,156, 0,
-192,127, 24,119, 32, 69, 81, 15, 20,122,130, 3, 7, 14, 28, 56,252,173,173, 90,127, 66,139, 66,139, 32,136, 45, 67,135, 14,157,
- 9,128, 79, 16,196, 55, 10,133,226, 70,211, 52, 74,165, 50,215,207,207,239,147, 46, 93,186,204, 2,192, 18, 4,177,165,141,153,
- 42,103, 89,172,225,241,136, 69,247,196, 93,187, 2, 84,214, 47,117,178, 8, 0,193,227,241,183, 95,189,122,245,221,162,162, 34,
-181,157, 22,136, 86,241, 48,102, 29, 2,192, 79,192,221, 41,133,133, 39, 22, 68, 70, 70,143,157, 51, 7, 61,199,142,117,246,235,
-212,137, 54, 90,173,204,141,115,231,136, 11,123,247,138,210,147,147,133, 70,179,249,248, 1,160,168,173,249, 44, 45, 45, 61,243,
-107,202,153,147, 79, 79,140, 25, 29,212,197,239,158,104,184,171, 64, 69,165,246,100, 91, 68, 86, 19,209, 27,191,113,227,198,195,
- 34,145, 72,208,120, 41, 27,171,213, 90,105, 54,155, 35, 0,160,170,170,202,111,203,150, 45,187,120, 60, 94,161, 45,190,204,204,
-204, 67,203,150, 45,155, 88, 80, 80,112,178,184,184,184, 0, 0,138,138,138, 10, 72,146,220,174, 84, 42, 39, 22, 22, 22,238,131,
- 29,147, 0, 88,160,123,198,185,159,123, 0, 64,196,160, 73,200, 56,247,179, 20, 64,143,136, 65,147, 0, 0,237, 93,203,176, 49,
-234, 66, 43,188,119,241,226,197,157,163, 71,143,126, 5, 15, 16,211, 11, 0, 44, 22, 11,105, 52, 26, 41,154,166, 5, 86,171,149,
-181, 88, 44, 36,247, 76,226,192,129, 3, 7,251,193,178,108, 95, 0, 94,117, 63,235, 13, 40, 94, 77,182, 45,168, 91, 46,176,254,
-241, 91,247, 91, 77, 16,196,229, 70, 28, 13,251,237, 56, 22, 0, 42, 0, 92, 39, 8,162, 37, 35,200,150,150,126,183, 40,180, 20,
- 10,197, 62,216,177,104,180,189,233, 90,193,146,186,117,226,128,246,175,237,214,192, 65,211,116,121, 81, 81,209, 3, 87, 40,143,
-199,187, 59,126,252,248, 54,165,183,149,102, 55, 80,248,186,217,188, 35,233,203, 47,123, 31,255,230, 27,127,154,162, 60, 8,128,
-229,139,197, 26,139,197, 82,224, 69,146,215,218,106,201,186,207, 26,115,167,116, 76,254,157, 82,116,235,214,141,189,117,235,214,
- 61, 91,207,131,225,154, 94,175, 15,176,213, 4, 12, 6,195, 96, 59,197,224, 79,165,165,165, 63, 53, 35,216,119, 41,149,202, 93,
-246,102,170, 97, 81,105,128,199, 16,204,211, 17,131, 38,237, 5,192,212, 47, 42,253, 48, 81, 86, 86,150,131,186, 56,111, 15,130,
-194,194, 66, 51, 65, 16, 63,174, 89,179,230,185,244,244,244,221, 10,133,194,204, 61, 54, 57,112,224,192,161,109, 34,139, 32,136,
-164,186,223,113,117, 70,161,164,166,219,245,105,234,211, 53, 78, 83,207,209,116,127,107,199, 2,192,226,197,139,223, 77, 72, 72,
-144, 3,176,119, 49,230,118, 47, 42,253, 87,161,252,111,194,209, 88, 20,108,253, 43, 10,250, 37, 96, 1, 69,253, 14,170,145, 79,
- 62,249,112,141, 27,183,110,221, 34,254,205, 55, 92,253,162,210,141, 16,249, 79,200,119, 65, 65,193,198,192,192,192,205, 10,133,
-130, 2, 7, 14, 28, 56,112,104, 11,188,154, 19, 70, 45,136,178,184,214,254,191,175,227,222, 76,186,230,126, 19, 4,145,148,144,
-144, 16,215,134,252, 54, 88,180,120, 92,221,113,224,240,223,195,255,199,172, 87, 14, 28, 56,112,224,208, 60,154, 90,177,234,197,
- 87,211,223,139, 23, 47,126, 23,173,143, 56,249,226,158, 21,203,183,238,119,131,191, 22,129,123, 51, 7,154, 67, 91,102, 19, 68,
-183,163,124,167, 56, 78,142,147,227,228, 56, 57, 78,142,147,227,252,159,227,180,197,125,170, 25, 65, 20,219,210, 80, 95,107,195,
-136, 77,183,109, 29,107, 43, 45, 65, 16, 45,133,249,169, 31, 42,108,250,253,151, 35,154,227,228, 56, 57, 78,142,147,227,228, 56,
- 57, 78,142,243, 65,192,178,108, 95,150,101, 99,113,111,194, 20,203,178,108, 44,203,178, 99, 23, 47, 94,188,164,126,223,226,197,
-139,151,176, 44, 59,178, 62, 93, 93,154,134, 99,234,247, 53,253,110,186,175,181,180,173,100,113,102,147,237,134,223,127, 23, 31,
- 45, 14, 28, 56,112,224,192,129, 3,135,102, 81, 63, 99,176,145,181, 73, 13,224, 70, 66, 66, 66, 85, 35,223, 41, 53,128,107, 0,
-122,213,165, 83,215,137,180,198,190, 85,150,186,223,150,102,210, 88,236, 73,219, 2,182,180,176,205, 9,173,150,208,203,135,247,
- 97, 96, 71,239,168,186, 10, 0,203, 48, 0, 0,166, 46, 6, 18, 91, 31, 12,137, 97,192,178, 44, 20,170,234,180, 27, 42,188,223,
-222,243, 5,251,193,221, 91, 42, 93,207,176,236,160,186, 93,103,180, 26,243,155, 25, 58, 84,219,203, 17,218, 1, 97, 82, 30,222,
-102, 88,244, 4, 0, 30,129,235, 38, 6,159,100,151,183, 61,158, 84,115,237, 60,194, 11, 51,197, 50,249, 20, 23, 87,183,110, 85,
- 85, 21,121, 86,147,249,231, 76, 53, 54,163,237,235, 50, 34,200, 13,143, 49, 44,222, 5,192, 19,242,176, 46,175,210,238,153, 28,
- 28, 56,112,224,240,160,214,145, 7,138,139, 71, 16, 4,221, 12, 39,241,128,156, 92,128, 61, 59,196, 86, 51,187,255,104,102,223,
-229,191, 83,190,219, 36,180,194,189, 48, 7, 4, 86, 0, 96,193,226,131, 76, 53,190,110,211,241,190,136,150,242,249,219, 0,240,
- 77, 86,122, 1,203,224,108,179, 23,147,135, 33, 82, 17,127, 29, 0,198, 68,211, 51, 50,149,246,251,139, 69,248, 99,172,128,225,
-253,200,176,172,144,102,216,237, 96,145,228, 40,194,249,223, 75, 97,106, 75, 94, 3, 59,122, 71, 29,252, 67, 57, 58,229,235,121,
-232,223,243, 17,176, 52, 5, 48, 36,228,131,223,198,233,207,159, 71,255,176, 64,176, 12, 9, 48, 20, 28,199,125,138,113,145, 46,
-236, 13, 85,251,214,193, 14,246,131,123, 39, 79,239,155, 91,183,110,243,241, 11, 10, 39, 24,202,138,156, 63, 78, 78,155,191,104,
-217,136, 8,104, 35,237, 17, 91, 61,125,241,114, 96,231,144,183,223, 92,241, 25,223,215, 47,192,129, 33,205, 84,217,221,172, 62,
- 27,214, 46,219, 39,226, 21,174,187,174,196, 54,123,219,114,184, 23,102, 9, 36,226, 73, 50,169, 67, 55,131,161,230, 22,109, 37,
-127,230, 9, 5, 99, 63,249,116,125,239, 97,163, 98, 28,233,154, 50, 30,201, 32,124,207,238, 93,157,190,220,184, 41,230,166,146,
-126, 2, 0,211,150, 50, 51, 44, 22,229,238,152, 25, 35, 20,240,137,176,151,182,242, 1,170, 93, 66, 43,204, 27,207, 16, 44,108,
-134,151, 96, 9,252,150,165,194, 79,237, 57, 71,168, 55,190, 37, 88, 4,131,192, 94,130,197,174, 76, 53, 84,220, 35,143, 3,135,
-127, 23,120, 60, 94, 10,195, 48,195, 31,178, 48,120,140,101,217,223,185,171,251,191,141,182, 89,180, 8,172,202,184, 93,236, 6,
-218,138,136,224,160, 15,129,182, 9, 45, 41,159,191,253,114, 94,185, 15, 40, 43,182,126, 52,119,183,133, 4, 40,210, 10,154, 34,
- 65, 83, 36, 40,202, 10,154, 36,193,146,102, 44,251, 46, 5,176,212, 32, 42,178,251,118,128,246,181,247, 28, 66,150,247, 99,218,
-185,147,238,132, 69,139,159,190, 78,120,189, 88, 93,251,250,169,235,138,138,112,111,227,146, 76, 21,190,111,139, 32, 72,249,102,
- 30, 18, 15, 28, 41,249,226, 91,125, 54,195,178,112,119,150,133, 76,139,203, 8,216,113, 40,165,120,253,118, 83, 54, 0,184, 56,
-136, 67,166, 95,207, 11,124,144, 74,240,150, 74,215,111,222,244,165,143,175,135,140,160, 46,172, 6, 69,211, 8,232, 20,203, 95,
-242,218, 52,223, 85,159,111,251, 28, 58,243, 11,173, 29, 31,226,141,240,206, 93,194, 22,108, 63,114, 33, 80,175, 83, 89, 78,238,
-124,247, 54,204, 32,125,252,195,132, 31, 38,124,198, 95,250,206,188,183, 44,116,201,165, 28, 21, 50,109, 61,107,194,188,113, 40,
- 97,245,167, 61, 71,140,139,115,100,106,213,124,147,190, 54,120,235,119,219, 86,132,246,236, 39, 31, 28,217, 81,164,250,121, 54,
- 97,172,169,132,149, 39,149,140,136,136,118, 54, 62, 55,149,220,250, 67,226,107,153, 42,108,104, 75,153,105,246, 63,109,143, 97,
-218, 31,117,157, 96, 49, 56,253,247,148, 89,180,226, 50, 88,154, 4,104,107,195, 55,104, 18, 44,115,239,187,255,236,239, 0,180,
- 79,104,241, 88,140, 62,117,238,178,111,121,153,178,239,231,159,126,188,132,189,124,249, 24,104,252,152, 85,137, 51,109, 21,152,
- 28, 56,112,248, 91, 91, 76, 40,150,101, 5, 15,153, 51,134,101,217,163, 15, 72,243, 54,128,151,235,182,183, 1,248,228, 33,100,
-173, 35, 0,159,186,237, 50, 0, 37, 92, 11,120, 32, 52,117,126,111,119, 28, 45, 41, 88, 6,216, 59, 1, 0,100,109,205, 5, 11,
- 72, 65,240, 1, 82,143,248,113,163,224,233,237, 3,144, 6,192,106, 0, 72, 35, 64,234, 1,210,136, 10,101, 33, 96,213, 3,249,
-199, 64,177,172,164,205,197, 53,107,129,220,159, 49,178, 79, 32,188, 92,164,152, 23, 31,238,185,229,120,238,182,109, 39,115,162,
- 51, 85,152, 98, 87, 94, 89, 22,253,123,116,195, 23,219,244,217,191, 92, 85,143, 1,128,152, 94, 30,199,251,135,119, 10, 88,191,
-221,148,125,244, 70,213, 88, 0, 24, 27,225,124,172, 95,136,111, 32,131,246, 91,125, 25,150, 29,236,215,185, 27, 65,167,111, 6,
-163, 43,129, 78,103, 68,201,221, 29,112,243,127,148, 71, 51, 24,106,235,120, 25, 31,139,223, 88,186, 70,104,208,149, 91, 24,171,
-154,246,226, 87,241, 5, 98,134, 64,233, 25,115, 45, 83, 77,191, 57,243,121,106,193,251, 31, 45, 6, 48,173, 53,158,112,111,188,
-182,110,221,250, 30, 3,163, 66,189,203,246,205, 35,106,171,202, 65,241,229,146,248,199, 7,194,181,123, 56, 83,158,186,142, 16,
- 7, 69,195,213, 35, 8,165, 23,118,162,224,247,253,196,160, 62, 19, 37,223,255, 36,122, 14,176, 54, 43,180,186,121, 98,208,152,
- 33,253,118, 7, 5,250,249,178, 44, 3,134, 97,193, 50, 52,106, 77, 36,150,236,201, 7, 77,211,120,106,204,160,145, 14, 98,130,
-101, 24, 6, 44,203,160,184, 76, 99,248,245, 82,246,200,252, 42, 92,178,199, 82,213,235,177,225,131,174,167,253, 30, 74,230,254,
-130,168,105, 9,217, 4,112,174, 81,155, 27,116,245,196,247,161,192,119,237,215,114, 4,232,130,227,171, 17, 56,100, 38,127,243,
- 79,199,189,180,234,210,233,251,118,108,122,250,235,205,155, 19,179, 85,152,205, 61, 95, 56,112,248,119,128,101,217,135, 46,182,
- 10, 11, 11, 21, 15, 34,182,252,253,253,135,148,150,150,174,173,247, 86, 33, 8, 98,109,231,206,157,151,253,167,163,122, 95, 95,
- 79, 75,211,244,180,210,210,210,179,173,113,198,198,198,250, 29, 57,114,164, 75, 35,206, 46, 0,186, 52,151,214,213,213,149, 30,
- 48, 96, 64,193,145, 35, 71, 20, 92, 11,105,151,224,106,179,208,202, 46,250,121, 94, 31,179,178, 22, 0,178,237, 72,127,223,144,
-159,137,164, 87,255,176,226,249,213, 17,157,221, 81,163,183,224,228,149, 2,208, 52, 9,154,162,234, 44, 91, 20,104,138,196,152,
- 94,158, 24, 96,154,141, 13, 73, 57,160,104, 38,161, 53,206,166,176,178,204, 51,189,163, 39,239, 97, 24, 86, 44, 17,242,180,193,
- 1, 30,222, 11,158,234,197,155, 23, 31, 1,163,149,154,188, 51,245,246,175, 89, 42,108,181,139,147,249,115,200, 35,182,185,125,
- 52,101,179,236,173, 88,163,250, 71, 15, 27,236,204,154,181, 32, 43,242, 81, 99, 32,145,175, 33, 81,102,170,134,132, 80,218,197,
-201,176,232,217,209,223, 87,126,126,247, 59,119, 61,248, 58,129, 55,159, 18,137,121, 20,104,134,229,179,213,153,102,247,208, 81,
-194,122,191,173,214,242, 41,147, 59, 61, 63,100,116,172, 75,209,206,153,132, 44,120, 12,188,251, 4,224,238,217, 31,160,186,146,
- 4,141,162,128,112, 54, 85,163,131,199, 35, 24, 55,109, 10, 62,153,210, 23, 53,186, 26,240,149,183, 93,196, 66,137, 43, 96,109,
-150,147,165, 49,109,221,154,143,124, 5,124,222,189,235, 89,255,161, 73, 24,205,102,128,166, 32, 21, 48, 32,216,250,255, 72,208,
-164, 85,222,115,226, 59,115, 1,250,146,173,178,103,169,240, 83,184, 23, 6,131, 33, 67, 89,210, 8, 2, 56,151,169,254,143,248,
- 9,243,198, 51,143,142,121,113, 48, 75,224,183,246,212, 81,164, 7,226,162,186, 56, 58, 56,232,178, 81,178,247,117,220,134,148,
-237, 48,240,101, 60,243,210,107,242, 45, 91,182,140, 7,216, 57,184,223, 71,237,175, 88,100,149,227,228, 56,255,145,156,206,206,
-206, 93, 59,119,238,188,140, 36,201, 33, 34,145,168,131,213,106, 5,195, 48,101, 98,177,248,183,130,130,130,149, 58,157,238,206,
-223,173,236,215,175, 95,111,139,216,178,201, 41, 20, 10,145,147,147,115,171, 13, 98,235, 84,147,227,127, 60,119,238, 28,246,236,
-217, 3, 0,200,205,205, 69,247,238,221, 29,154, 59,240,238,221,187, 14,195,134, 13,251, 17, 64, 64,107,156, 55,110,220,232,250,
-203, 47,191, 96,239,222,189, 0,128,156,156, 28, 4, 7, 7, 55,155,153,115,231,206,241,159,125,246,217,174, 0, 20,255,133, 58,
-250, 55,136,172,198,223,255, 17, 90, 73, 73, 73,108, 92, 92, 28,209,116,187, 25,228, 7,186,137,251,192, 68, 3, 64,126, 91,115,
-144, 85,142, 53, 95,236, 56, 49,246,244,222,141, 67,164, 34, 30,150,111, 93, 80,172,174,172,121, 76, 64,220, 27,126,161, 88,240,
-220, 28,197, 23, 19,166,247, 10,172,170, 53,225,240, 31,165,103, 51, 85,109, 51,145,102, 42,145, 12, 48,174,247,126,209, 48, 25,
- 85,193,211, 63, 73,222,181,107,241,216,158,111,198,247,196,161, 11, 5,111, 2,148,205,168,239, 44,195,128,101,168, 6,231,247,
-186,174, 3,192,220,191, 40, 48, 3,246,222, 62,166,109, 22,173,161,128,160,202, 27,227,156,228,226,175,102,205,122,197,153, 84,
-231,161,210, 34, 66,113,149, 9,101, 70, 33,106, 5,222, 40,205,190, 65,243, 8, 36,219, 52,185, 16,208,177,148,201,213, 77,236,
-200,139, 28, 53,215, 95,119,252,221, 42, 49, 65,241,157,159, 92,229, 90,113,250,179, 2, 74,175,214, 19, 4,108,134,159,119,113,
-113,237,110,210, 20,240,181, 85, 21,112,245,137,192,216,201,113,248, 32, 54, 28, 53, 58, 61,212,149, 23,217,110,190,206, 68,225,
-111,137, 88, 58, 46, 12,154,114, 37,204, 36, 64,232,205,149, 38,139,169,182,197,235,200,195,230,249, 11, 23, 61,211,201,215,203,
-161,126, 82, 1,203,208,232, 21, 22,132, 81, 67,250, 35,249,220,121, 92,190,145, 11,166,110, 82, 1,203, 48, 40, 81, 85,149,155,
-172,244, 15,109,186,160, 52, 5,150, 52, 53, 43,196,208,142, 33,195, 72,111,200,105,224,253,190, 93,157,102, 44,142,235,228,228,
- 32, 33, 96, 34,105,152, 44, 36,106,206,127, 5,143,206, 61, 32,151, 74,137, 62, 48, 10,174, 2,220,186,133, 28, 56, 52,194,211,
- 79, 63, 45, 45, 47, 47, 79, 13, 8, 8, 8, 31, 53,106,148,124,240,224,193,208,235,245, 56,121,242, 36,244,122,125,167,128,128,
-128, 78, 39, 79,158,156, 88, 84, 84,148,217,177, 99,199, 97,123,247,238,181,219,135,182, 78, 0,241, 27, 30,193, 0, 69, 16, 4,
-234,246, 17,117,251,218,189,206,173, 88, 44, 70, 97, 97,225, 67,183,108,149,150,150,222,106,143,101,171,182,182, 86,228,239,239,
- 15, 47, 47, 47,208, 52, 13,189, 94,143,131, 7, 15, 66,171,213,130, 97, 24,200,100, 50,172, 90,183, 21,217, 87, 83,113,233,210,
- 37,104,181, 90,145, 45,206,146,146, 18,162, 87,175, 94, 48,155,205,160, 40, 10, 38,147, 9,167, 78,157,106,248, 45, 16, 8,176,
-232,195,207,145,123, 37, 21,233,233,233, 40, 41, 41,249,175,172, 54,210, 6, 45,242,119, 68,139, 49,179,254,235,179, 14,105,154,
- 90,178,101,251,174,139, 75,102, 79,193,107, 83,163, 3, 86,110,220, 31,157, 85,129,237, 0, 16,230,137,233,207, 13,239, 22,232,
- 42, 23,226,131,157, 87, 0,150, 93,242,160,231,203,168, 68,110,120, 7,230,205, 3,151, 10, 83,223,157,210, 7, 65,190,206,221,
-171,196,149,226,252,124, 59,214, 20,100, 40,184, 57, 74, 66, 98,122,121, 28, 7,195,192,213, 73, 18, 10,154,130,171,163, 36,100,
-108,132,243, 49, 0,112,150, 11, 67,155,179,124,181,132,168, 0,225, 76,185, 68, 48,211,193,201, 53,240,133,241,163,100, 49,227,
- 39,202, 28,133, 20, 52,151, 78, 66, 39,236, 8,210,189, 19,204,100, 37, 74,238,220,166, 79,255,158, 85, 90, 81, 99, 94, 96, 51,
-155, 44,206,150,222,201,241,234,218,115,148, 91, 69,210, 82, 85,215, 23,119,118,225,129,225,213, 36, 62, 89,238,224,221, 79,246,
- 71,254,157, 90,134,109,214,162,115, 31,116, 90,109, 1, 73,195,215, 72, 11,156,110,167,124,143,197,227,122,160,170, 82, 5,147,
-149,130,214, 72, 89,125, 92,165, 18,243,157,155, 48, 91, 41, 88, 72, 6, 66, 87,127,156,188,120,163,130, 33,201, 99, 45,113,230,
-107,144,158,127, 48,221,177,241,190, 32, 79,244,122,199, 89,150, 14,210,136,194, 18, 5,182, 31,185,216, 39, 95,131,244, 7,169,
-103,150,161,238, 13, 63, 55,178,100, 17, 44, 6,183,199, 9, 62,212, 27,253, 68, 82,209,151,107,223,124, 54,252,241, 96,119, 9,
- 83,114, 17, 4, 99,133, 3, 45,128, 81, 76,195, 37, 32, 8,140,165,134, 53,152, 76,213, 25, 0, 23,233,157, 3,135, 70, 8, 9,
- 9,241, 41, 45, 45,205, 88,184,112,161,251,147, 79, 62,137, 3, 7, 14, 64,167,211,225,135, 31,126,192,250,245,235,177, 98,197,
- 10,144, 36,137, 45, 91,182,200,247,237,219,215,111,211,166, 77, 37,129,129,129, 17, 69, 69, 69,101, 54, 4, 22, 1, 64, 2, 64,
- 88,247,238, 34, 0, 48, 71,143, 30, 69, 76, 76, 12,142, 30, 61,202,212,237,163,113,175,243,211,174,245, 68,197, 98, 49,196, 98,
- 49,180, 90,237, 67, 17, 91, 66,161, 16,142,142,142, 16,139,197,168,169,169,105,179,216,162, 40,138, 95, 82, 82, 2,173, 86,139,
- 81,227,199,227,243,132, 4, 12, 31, 62, 28,163, 70,141, 2,203,178, 56,117,234, 20,162, 7, 70, 98,202, 19,195,144,149,149, 5,
-138,162,236,202,111, 89, 89, 25,202,203,203, 49,118,252,120,108,221,180, 9,253,251,247, 71, 72, 72, 8, 40,138, 66,106,106, 42,
-158, 30, 51, 16,210, 9,209,200,205,205,229, 26,181,253,214,172,135,226,163,245,192,200, 80,227,119,230,208,153,164,169, 99,250,
-197,141, 31, 20,142,173,187, 79,127, 4, 47,221, 46, 0,240, 48, 75, 86, 61, 63, 60, 8,153, 69, 85, 56,157,174, 72,202,170,192,
- 67,153,173,193,208,240,244,112,150, 3,124, 49,140, 86,134,114,206,183,237,192,204,176, 44,228, 67,222,193,115,227, 51, 3,250,
-135, 7, 4,212,207, 58,116,140,249, 12,211,111,220, 10,236, 27,226, 19, 8,154, 4,104, 18,206, 83,118, 2, 31, 58,216,204,199,
-192, 46,226,228,249,243,230, 13, 24, 55, 97,178, 76, 44,119, 1,173, 43, 6, 89,118, 3,154,188,179,208,203,187,163,172, 48, 31,
-123, 78, 92,210,230,149,104,116, 60, 30, 78,150,107,205,111,231, 87,161,214, 22,175,137, 68,194,178,165, 11, 98,247,236,218,237,
- 36, 9, 26, 68,220,254, 42, 70, 43, 22, 80, 18,175, 46,143,242, 12, 82, 79,246,227, 31,118, 59,235, 45, 88,109,139,199,160,215,
-237, 63,117,242,248,148,110, 93, 7, 57,221,189,124, 4, 70,147, 25,102, 18,136,232, 55, 12, 52,205,138, 9, 30,193, 56,243,249,
-132, 74, 83, 5,130,164,203,127,187,118, 87,121,238, 90, 62,223,236,132,213,173, 70, 23,105,170,238, 9,254, 27,227,135,245, 6,
- 72, 35,158, 24,210, 3,159, 39,158,126, 29,160, 95,124,176, 74,190,103,209, 98,129, 65,225, 94,248,134,101, 49,232,202,193,245,
-161, 81, 19,230,163, 45, 22,173, 8, 79,140, 11,235,234,247,253,231,171,222,113,247,232,216,157, 79, 48, 36, 88,159,158,128,174,
-132, 37, 74, 46,194,197,191, 63,104,191,129,216,178,225,211, 90,134, 97,119, 1,224,166,100,115,224,208,248,121,100, 50,237, 95,
-179,102,141,123, 92, 92, 92,189, 69, 6, 23, 47, 94,196,182,109,219,224,224,112,255,115, 50, 38, 38, 6, 44,203,186, 47, 95,190,
-124, 63,128,199, 91,226, 28, 48, 96,192,248,244,244,116, 69,239,222,189,243,235,196,150, 8, 0,239,230,205,155,188,226,226, 98,
-194,205,205,141,245,243,243, 35, 21, 10, 5, 3,128,126,233,165,151,248, 63,255,252,115, 55,189, 94,127,166,189, 66, 75, 44, 22,
- 63, 20,159, 45,161, 80, 8,130, 32, 32, 22,139, 33, 18,137,192,178,108,155,196, 22, 77,211,130,163, 71,143,226,202,149, 43, 88,
-209,187, 55,222,244,247,135,187,187, 59, 82, 83, 83,193,178, 44, 28, 28, 28, 80, 89, 89,137, 93,187,118, 97,196,136, 17,160, 40,
- 74,100, 15,239,222,189,123,145,150,150,134, 15,163,162,240,166,139, 11, 28, 29, 29,113,234,212,189,209, 64,137, 68,130,194,194,
- 66,156, 58,117, 10,195,134, 13,227, 26,245, 3,194,238,198, 51, 20, 16, 84, 18,240,177, 90,140, 96, 41, 22, 32,224, 23, 22, 6,
- 81, 86,214,253,206, 57,246,128,199,195,210, 13,219,147, 98, 63,155, 63,158,152, 25,223,199,111,229,247, 41,115, 0, 96,198, 83,
-193,254,114,137, 0, 95, 28,202,100,121, 60, 44,125, 24, 5, 12, 11,131,136,208, 96,206,168,254, 33, 80, 84, 91,112, 91, 81,253,
-107,150,157, 67, 61,167, 63,123, 14, 59, 14,167, 22,175,223, 97,202,102, 89, 22,174,142,146,144,233,215,111, 7,126,127, 52,173,
-104,221, 30, 83, 54,203,176,112,149, 11, 67, 95,204, 26,104,115,214, 97, 84,128,112,230, 91, 11, 22, 12,140,127,113,161,148,202,
-254, 25,150,219, 39,192, 88,141,208, 89, 69,168,230,251,160,164,168, 8, 31,111, 73, 42,214,233, 45, 83, 50,212,109, 19,152,121,
- 26,212, 10, 8,221,147, 31,127,240,110,114,194,170,229,142,198,252,212, 90, 62, 65, 25,249,157,135, 10, 86,173,248,140,168, 49,
- 91, 38,231, 87,161,198, 22,143,217, 9,171,215,172,219, 16,251,202,180,137,217,193,221,135,122,208,138, 59, 30, 38,157, 78,181,
-243,120,154, 79, 93, 79,145, 0,128,219, 37, 26,168,181,122,138,166,200, 51, 78, 66,172,204,180,199, 58, 88,135,174,222,240,138,
- 27, 20,241,172,151,147, 8,198,218,106,120, 59, 9, 49,166,255, 35,207,146,127,228,190,115, 71,213, 22,185,214, 84,104,145, 96,
- 73, 35,126, 95, 61, 34,148,165,201, 80,208, 36,172,215,127,108,187,101,140,192,155,175, 13,113,116,118,179,220,229, 65,239, 0,
-200, 60, 65, 56,119, 2, 92,186, 16,194,176,201, 80,228,103, 80,175, 63, 59, 77,115,167,160,228, 91, 79,217, 67,153,249,195,129,
-195,191, 10,133,133,133,207, 47, 89,178,228, 92,255,254,253, 59,120,122,122,162, 71,143, 30, 4, 75, 75,198, 0, 0, 32, 0, 73,
- 68, 65, 84, 56,124,248, 48, 22, 46, 92,216,144,166,119,239,222, 96, 89, 22,149,149,149, 88,179,102, 77,153, 66,161,120,190,213,
- 14,122, 70, 70,246,142, 29, 59,134,132,135,135, 91, 69, 34, 81, 53, 0, 73,117,117,181,180,178,178,146, 48,153, 76, 96, 24,134,
-113,113,113,161, 21, 10, 5, 57,101,202, 20,243,133, 11, 23, 30,209,235,245,133, 15, 98,209, 10, 8, 8,184,169,209,104,180, 4,
- 65, 60,112,232,135,122,145,229,233,233,233, 85, 91, 91,203, 0,168,106, 79,232, 7,138,162, 16, 21, 21,133, 19,103,175,226,232,
-233, 11,208, 41,114, 48,231,149,231,209,163, 71, 15,156, 56,113,162,221,117,214,171, 87, 47, 28, 63,117, 14,231,174, 92, 67, 97,
-238,117,188, 62,231, 21, 68, 68, 68,224,248,241,227, 92,131,182, 31, 71,112,191,111,214,145,166, 66,107, 88, 82, 82, 82,125,207,
-252, 79,242, 53,212, 19,189,132,174,226, 31,151,143,123, 36, 76, 56,106, 57, 8,161, 12, 63,119, 63, 62,112,233,199, 95,101,243,
-189, 11,167,221, 84,217,158, 29,118,223, 77,163, 66, 6,123, 41,251,167,107, 89,161,207, 62,209, 63, 0, 91, 15,203,223, 7,128,
-201,131,187,226,143, 60, 53, 46,229,170,126,202, 84, 35,227, 65, 75, 29,233, 13, 57, 93,129,159,214,188, 17, 63,172, 83, 71, 31,
-108, 59,112, 14, 4,129,253,118,189,112, 89,150,237, 31,222, 9,235,119, 52,157, 97,232, 19,184,110,143, 41,251,100, 70,205, 56,
- 0, 24, 21, 42, 63,214,247, 17,183, 64,182,177,227, 86, 51,144,137, 5,179,198, 77,124, 78, 74,229, 30, 6, 10, 78,129,160,204,
- 48, 90, 25, 40, 43,106, 96,112, 9, 64,234,197,107, 70,173,201, 50, 63, 83,221, 62, 43, 94, 86, 5,242, 69,151,175, 21,213,234,
-141,190,114,175, 71, 76,124, 30,195,212,154, 89,252,145, 89,160,203, 44, 67,142, 61, 28,249,249,176, 60,230, 79, 13,254,102,251,
-158,101, 66,145,120, 50,159, 0,225,237,234,224,245,205,103, 31,194,201,201, 17,140,165, 22,208,171,241,228,171, 31,171,111, 42,
-200,174, 0,208,221, 3,142,131,187, 10,183, 11,120, 68, 73,202,109,235,123,182,206, 65,144,152, 61,109, 76,111, 33, 99,209,227,
-141, 53,187,177,249,157,120, 60, 55, 50, 76,120,228,124,238,108, 0, 43,219, 91,215, 44, 77,129, 37,141,120,252,221,179,217, 4,
-112,142, 5, 6, 93,217,179, 42, 20,184,106, 55, 71, 31, 64, 72, 11,136,176,158,129, 14, 34,166,228, 60,152,146,243, 44, 63, 96,
- 32,136,192, 33, 4,225, 19,197,126,185,118,133,126,235,214,109, 39, 25, 30, 62,176, 35, 84, 6, 7, 14,255,171,200, 87, 40, 20,
- 99, 99, 98, 98, 78,159, 56,113,194, 61, 50, 50, 18, 0,112,229,202,149,123,157,206,168, 40, 4, 7, 7,163,188,188, 28, 83,167,
- 78,173, 80, 42,149, 99, 97,195,231,183,166,166,230,206,222,189,123, 59,232,245,250,222,239,189,247,158,170, 83,167, 78, 58,147,
-201, 68, 84, 87, 87, 51, 20, 69,193,205,205, 77,220,187,119,111, 12, 24, 48,160,246,226,197,139,157,139,139,139,107, 0, 20,180,
- 39,243,241,241,241, 56,123,246,222,164,189,135, 17, 87, 75, 36, 18, 33, 50, 50,210, 63, 63, 63,191,180,238,221,210,230,103,124,
-227,215,203,181,107,215,112,230,106, 9, 4, 22, 35,196,106, 5,126, 63,176, 23,227,103,205, 5, 69,181,223,139,225,255,216, 59,
-239,240, 40,170, 54,138,159, 41,219,178,233,101,211, 11, 33,144, 64, 32,244, 78, 16,144,166, 18, 62,138, 84, 65,154, 64, 64, 20,
- 16,165, 35, 69,165, 35, 69, 58,168,244,142,148,160, 2, 81,122, 9,157,132, 36, 4, 2,132,180, 77,239,217, 62,229,251, 35,197,
- 4, 82,118, 19,108, 56,191,231,153,103,182,204,158,157,153,187, 59,247,204,123,239,125,239,253,251,247,113, 60,244, 6,204,165,
- 52, 30, 61,122,136, 35, 71,142, 96,226,196,137,181,210,172, 33, 85,122,145,127, 56, 74, 84,210, 79,139, 6,128,160,160,160,139,
- 37,209,138,178,248,248, 64, 34, 45,192,130, 30, 45,220,102, 12, 14,172, 71, 25,242,146,193,177, 28, 40, 17,224,232, 96,133, 61,
-123,246,215,221,127,240,224,245, 77, 27, 55,173,231, 24,102,110, 68, 26, 84, 38,236,212,130,111, 15, 94, 25,188,103,122, 23,122,
-226,187, 13,237, 0, 64, 76,147, 88,119,242, 33, 3, 96, 65,109,142,182,157, 27,100, 5, 6,140,119,180,183,158, 63,251,163,222,
-118, 93, 90,249,225, 98, 88, 4,214, 31,185,126, 73,146,134,221, 70,255,184, 57, 3, 94,246, 79, 21,141, 58, 4, 87,125,191, 75,
-150,229,157,197,230,182,208,199,157, 7,244, 26,104,180,122, 36,100,178, 72,200,210,128,150,139,113, 59, 38, 81,109,159,130,144,
- 90, 28, 54, 97, 46,151,185,126,249,205,106,119,141,186,128,201,203,206, 96,196,146, 27, 34,185,153, 84,105, 74, 87,133, 27, 73,
-208,188,229, 45,106, 9,112,148, 68,198,171,230,124, 54,202, 60, 41,242, 12,234,147,201, 32,120, 30,102,254,189, 97,105, 70,137,
- 3,235,136,226, 1,192,220, 92, 46, 89,190,232,115,235,169, 51, 23, 85,219, 7,204, 31, 16,251,249, 56, 79, 13,240,178,197,165,
- 59,209,184, 20,254,226,225,165,219,143, 26,119,109,226, 10, 63,119,155, 41,146,236,156,101, 81, 48, 61, 66, 90, 84, 48, 12, 96,
-208,148,142, 58,244,119,196,176,214,131,231, 85, 54,218,176, 66,188, 1, 46,134,229, 65, 80, 20, 64,144, 69, 35, 32, 19,174,130,
-182,241,225,247, 31, 58,174,218,177, 99,247, 87, 81, 25, 66, 20, 75, 64,160, 58,114,115,115, 31, 68, 69, 69,245,106,218,180,233,
-206, 79, 63,253,212,114,248,240,225,174,227,198,141, 35, 1, 32, 53, 53,149, 91,187,118,109,242,119,223,125,151,155,145,145, 49,
-218, 96, 48,132, 27,243, 15, 87, 42,149,215,190,255,254,251,244,203,151, 47, 55,110,211,166,141,180,101,203,150,156,173,173, 45,
- 45,149, 74, 89,157, 78,167,137,137,137, 97,159, 62,125,234,146,147,147,243, 4, 64, 44,106,208,172, 95, 28,189, 90, 76, 81,212,
-151, 60,207, 7,188,142, 62, 90,114,185,220, 21,192, 19,130, 32,234,155,218,108,248, 74,133, 77,211,200,206,206,134, 42,229, 33,
-100,137,143,209,212,156, 68, 35, 91, 11, 88, 89, 89,213,202, 20,229,230,230, 2,133, 73,184,114,229, 62,192, 48,176,182,182,134,
-181,181,245, 95,110,180, 42,243, 34,255, 18,198, 87,240, 90,213,125,180, 26, 41, 48,209, 76,135,181, 19,122,215, 19,123,123,186,
- 67,155,120, 27,247, 19, 10, 48,183, 93,155, 72, 74,106,169,153,240, 97,223, 86, 3, 6,214, 65,151, 14,173, 9,111, 23,235, 41,
-203,190,221,252,113, 35,100,124, 30,153,134,117,198,236, 81,100, 58,158,113, 72,219,113,254, 65, 98,176,187, 92, 13,142,227,113,
- 62, 92,137,240,184,236, 29,209,233,120,102,202,209, 53,114, 65,119, 26,228, 65,158,231,101,214,230,230,249,141,252,220, 29,186,
-183,111, 70,190,211,185, 21,196, 20,112,229,230,125, 76,251,246,216, 13,142,227,123, 27, 61, 66,140,227, 94, 49, 80, 69, 35, 12,
- 13,229, 70, 24,242, 60,207, 23,141, 58,172,186,219, 23, 69, 17, 41,170, 23,183,156, 69,246,190, 80,199,158, 71, 92, 54,135, 23,
-105,249,200,163,157,161, 77, 74, 2,120, 46,254, 98, 45, 58, 86, 59, 56, 56, 56,214,109,228, 87,111,195,174, 35,208,171,114,241,
-236,194, 78, 20,100, 43,241,245,150,147,245,220,220,236, 59, 39, 37, 37, 93, 52,225, 98,227,247, 91,200,126, 71,240, 0, 37,146,
-226,244,166, 67,200,176, 55,131,131, 92, 12, 78,157,142, 9, 83,135, 91,191,219, 99,184, 53, 0,188,120,116, 15, 94,114,181, 81,
-186,122,123, 12, 24,220,181,129, 13, 12,106,236,250,245,158,134, 4,222,217,125,246, 97,108,215,134, 54,178,193,129, 94,182,139,
-147,115,222, 71,102,205,146,138,150, 68,180, 74, 35,124, 53, 24,109,120, 4, 96, 27,114,136, 61,120, 45,205,124, 96,143,150,114,
- 49, 77, 16,124, 65, 18,120, 51, 7,108,222,117,184, 64, 98,248,107,102, 98, 23, 16,120, 19, 80,171,213,119,212,106,117,147, 47,
-190,248, 98,216,156, 57,115,222, 50, 55, 55,175, 11, 0,133,133,133,207, 12, 6,195,165,226,255,167, 41,163, 3,121, 0, 79, 98,
- 99, 99,159,197,198,198, 58,237,221,187,215, 6,128,172,248, 61, 13,128, 28, 0,169,168,197,136,195, 18, 83, 69, 16,196,151,175,
-235, 60,148,152, 42,130, 32,234,215,228,243, 36, 73,178, 4, 65,128, 32, 8, 72,165, 82, 92,190,124, 25,131,122,247, 64,212,233,
- 28, 4,216, 88,160,205,232, 9, 56,120,238, 28, 40,138, 2, 65, 16,160, 40,202,164,122,132,166,105, 92,185,114, 5, 35,134, 14,
-132,148, 6,172,173,173,241,197, 23, 95,224,196,137, 19,160,105, 97,150, 62, 19,216, 86,198,112, 25,153, 71,139,192,226,115, 59,
-151,136,193, 26,112,106,231, 42,132, 68, 20,232, 30,165, 99,110,131,116,172, 61,130,124, 46,253,219,221,193,231,174, 68,172, 28,
- 51, 36, 72,254,118,215, 30,120,187, 75, 87,186,113,235,206,243,129,114, 70,171, 59,170,200,181,193,114,248,106,219,175,209, 19,
- 14, 94,136, 33,160,207,199,144,158,173,121,150,195, 87,213, 28,204, 43,154,214,102, 22, 7,175, 92,191,110, 11,125, 1,226,238,
-253, 46,171, 83,183, 30,192,234,241,228,201, 99,124,183,235, 39,238,194,205, 71,123,116, 12, 62,125,154,141, 66, 99, 53,139,156,
- 21, 3,107,115, 73,131,119, 26, 91,253,194,129,135,141, 92,220,144,231, 88,216,200, 69, 13,123, 52,148,255,194,243, 60,111,105,
- 38,106,200,179,134,106, 53,213, 58,102,235,174, 31,118,172, 30, 59,118,172,121, 70, 98, 10,146,243, 34, 80, 32,113,131, 65,238,
-129,216,123,151,212, 42, 45, 99, 76, 37, 94,233,249,204,200,200, 72,187, 19,150,133,131, 91,150,194,160,211, 34, 45,177,200,171,
- 38,103,228,193,202,193,237,122, 82, 82,146,209,154,122,134,203, 29, 48,124,188,216,204, 18,102, 35, 6, 4, 73, 98, 51,181,104,
-225,106, 89,116,209, 40, 72, 71, 84,232, 21,116, 41,238, 99,250, 52,129,132, 87, 51, 87,163,246,211, 82, 38,254,244,221,150,110,
-120, 22,175,196,229,135, 73,187,158,101, 33,153,141, 86,238,138, 77,206, 9,238,219,206, 19,107, 78, 68,126, 2, 24,246,155,114,
-236,254,142, 24,198,243, 8, 44,234, 12,175, 6, 15, 4,250, 59, 98,152,145, 35, 13, 95,209,164,197,248, 96,245, 47, 47,230, 29,
-190,149,209,119,198, 7,157,172, 58,116,120, 79, 2, 70,135,124,181,214, 16,149,131,188,218,148, 81, 45, 16, 52, 5,205,127,171,
- 38, 11, 96,143,193, 96,216,147,147,147,243, 58, 53,147,241,106, 94,167, 90, 29,123,217,102, 66,158,231,233,226,104, 86,117,157,
-225,171,212, 44,219, 76,200,243,252,207,197,209,172,234,162, 90,229, 52, 57,142, 75,110,213,170,149, 93,159, 62,125,192,178, 44,
- 30, 63,126,140, 23, 9, 9,232, 30,252, 9,108,108,108,112,233,193, 3, 60,122,244, 8, 95,126,249, 37, 12, 6, 3,142, 31, 63,
-158, 88,157, 38, 77,211,250,122,245,234,137,251,245,235, 7,134, 97,240,244,233, 83, 36, 37, 37, 97,218,180,105,176,182,182,198,
-157, 59,119, 74, 53, 51, 50, 50, 64,211,180,190,130,232,214,159,241, 91,250,183,243,138,201,170,218,104, 1, 44, 88, 3,114,207,
- 45,192,186,203,208,235, 13,104, 24,153,142,231,145,127, 68,164, 54, 83, 97, 15, 78, 61,136,136,126,118,231,234,219, 18,164,133,
-195,212, 59,137,199,153, 80, 90,202,242,243,161,207,183,194,211, 95,240, 60, 53,191,224,113, 38,148, 38,223, 49,112, 44, 1,189,
- 10, 80,222,198,181, 75, 23,113,225,198,125,220, 10,143,102,175,221,137, 57, 72,114,248, 42, 42, 19,143,107,112, 23, 2,139,222,
-107, 48, 42,252,137,103,107, 63, 39, 79,176, 12,120,206, 0,235, 33,251, 49, 58,178,131,103,107, 31, 27,207,162, 72,150, 1,182,
- 31,253, 14,172,150, 85,169,119, 59,193,176, 77,114,226,204,251,249, 57,153,237,186,117,110,111,110,237,255, 46, 50,158,196,224,
-241,253, 43,234, 59, 17,177,215,110, 39, 24,106, 21, 45,113,115,115,123,171, 91,231, 6, 24, 50, 97, 54,244,170, 92, 60,189,240,
- 3, 10,178, 82,112,249,186, 5,162,243,242,218, 3, 48, 58,162,117, 61,158,105,140,248,108,116,172, 35,138,183,132,214,249,195,
-160, 62,144, 18, 26,112,218, 60, 16,170, 12,196, 38,233,114,223,223,146,192, 2,128, 92, 74,208,230,124,174,149, 81,145, 71, 47,
-123, 95, 57,101,192,238,115, 15,193,113, 69,211, 55,113, 28, 54,239,254, 61, 54,248,171, 17, 45,208,200,211,182,217,189,164, 52,
- 2, 38,132,252, 9, 30,157,110, 29, 92,212, 80,243,219,124,128,211,227,202, 20,187,134,157,214,101,117, 66, 13,167,219,137, 72,
- 70, 18,128, 96,208,170,173, 83,214,253, 58,191,213,185,200,192,233, 31,245,181, 2, 47, 76,192, 46, 32, 32,240,215, 83, 80, 80,
- 48, 97,244,232,209, 91, 69, 34,145, 2, 0,193,113, 28, 56,142,163, 87,174, 92, 41, 98, 89,150, 36, 73,146,165, 40,138,249,249,
-231,159, 13, 44,203,166,107, 52,154, 9,213,105, 50, 12, 19, 59,105,210,164,122,213,141, 80, 60,112,224, 64,137,201,138, 21, 74,
-194, 40,147, 85,118, 93, 26,229,170,188,242,224,177,168,227,136, 5, 11, 0, 16,224,177, 48, 50, 29,207, 95,222, 36, 60, 11,201,
-141, 40,253,180,198,173, 59, 47, 40,249,140,169,123,166, 97,217,129,173,155,248, 29, 0, 0, 45,207,142,168,201,209,229,105,213,
-131,155,183,110,127,144,227,121,154,225,249, 29, 36,135,163, 26, 6, 81,198,140,180,171,140,228,180,156, 59,239, 6, 88,243, 64,
- 81,147, 97,105,115, 97,113, 26, 7,158,231,249,210,230,194, 85, 50,100,228,106,171,205, 3,117,245,185,174,135,142,185, 53,254,
-236,213,123, 19, 88,150,119,166, 40, 34, 69,173, 99,182,214,214,100, 1, 64, 82, 82,210,197,208,115, 73,103, 31, 52,115,234,233,
- 32, 47,142,114,169,128, 12, 21,206, 38,165, 23, 92,172,137,102,118,161,161,239,156,181, 39, 78, 74, 68, 20, 13,158, 47, 74, 40,
-202,243,208,232,217,172,235,241, 76, 99, 0,104, 98, 7,215, 47,142, 51, 7, 40,138,120, 81,157, 94,216, 35,229,154, 33,203, 66,
- 63,127, 24,151,189, 35, 46, 7, 17, 0, 16,151,131,136, 67, 87,158,207,143, 77,201,255, 60,226, 69,246, 42,152,216,175,130, 39,
-112,185,245,144, 5,175,188, 86,219,243, 25,173,196,125, 0,253,129,196, 30, 67,166,127, 55,157, 32, 32, 76, 63, 33, 32,240, 31,
-162, 36,170, 69,146,228,226,215,168,249, 51, 65, 16,239, 1,120, 98,194,199,194, 10, 10, 10,154,188,230,195,203,100, 24, 38,211,
-152, 13,255,134, 14,241,255, 86,254,182,174, 37,221, 5,205,191, 94,179,126,253,250,188, 9,134, 69, 56,159,130,166,160, 41,104,
-254,167, 52,121,158,167,106,179, 84,162, 73,212,102, 17,202,232, 95,207,248,202,158, 11,205, 33,111, 32, 79,158, 60, 33,132,179,
- 32, 32, 32, 32, 80, 49, 4, 65,176,127,130,166,144,188, 88,160,196, 96,149,139,110,145,194, 57, 17, 16, 16, 16, 16, 16, 16, 16,
-120, 45, 38,171,236,186,200,132,163,242,240,159, 41,163, 9,106, 18, 66, 12, 21, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243,
- 63,167, 89,157,182, 48,154,241, 79, 54, 96,130,166,160, 41,104, 10,154,130,166,160, 41,104,254,247, 52,255,205, 84,218, 71, 75,
-104, 58, 20, 16, 16, 16, 16, 16, 16, 16,248,147, 16, 58,195, 11, 8, 8, 8, 8, 8, 8, 8,212,142,106, 39,149, 22, 16, 16, 16,
- 16, 16, 16, 16, 16,168, 25, 85, 79, 42, 45, 32, 32, 32, 32, 32, 32, 32, 32, 80, 99, 76,159, 84, 90, 64, 64, 64, 64, 64, 64, 64,
- 64,192, 40,182, 9,167, 64, 64, 64, 64, 64, 64, 64, 64,224,175,161,252,168,195,144,144, 16,190,236, 90, 64, 64, 64, 64, 64, 64,
- 64,224,175,228, 77,245, 34, 66,211,161,128,128,128,128,128,128,128, 64,237, 24, 47, 24, 45, 1, 1, 1, 1, 1, 1, 1,129, 63,
-135, 74,251,104,149, 36, 44,237, 82, 28,170,235, 34,156, 43, 1, 1, 1, 1, 1, 1,129,191,129, 55,219,139, 8,253,179, 4, 4,
- 4, 4, 4, 4, 4, 4, 47, 34, 32, 32, 32, 32, 32, 32, 32, 32,240, 79, 66,152,235, 80, 64, 64, 64, 64, 64, 64, 64,224, 47, 54,
- 92,127,186,209, 18,102, 54, 23, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243,191,100,178,202,153, 45, 97,212,161,128,128,128,
-128,128,128,128, 64,237,168,118,212,161,128,128,128,128,128,128,128,128, 64,205, 24, 15, 32,168,248,113, 16,202, 68,181,132,136,
-150,128,128,128,128,128,128,128, 64,237,216, 6,192,165,216, 96,157, 6,160, 20,140,150,128,128,128,128,128,128,128,192,235,161,
-108,191,172,222,101,204,151, 96,180, 4, 4, 4, 4, 4, 4, 4, 4,106, 73,165,125,180, 8, 84, 62,114, 32,212,132, 47,168,201,
-232,131, 80, 65, 83,208, 20, 52, 5, 77, 65, 83,208, 20, 52,255,115,154,213,105,135,226,223,199,120, 83,204,215,235, 68, 24,250,
- 42,104, 10,154,130,166,160, 41,104, 10,154,130,230,127,150,215, 62,234,176, 5, 96, 38,156,214, 55, 18,167,226, 69, 64, 64, 64,
- 64, 64, 64,160,106,254,156, 81,135,254,192, 71,195, 3, 20, 91, 12, 17,233, 86, 17,128,170,170,109, 21, 10,197, 86,185, 92, 62,
- 92,165, 82, 21, 18, 4,193,149,188,206,243, 60, 0,148,157,235,232,105,122,122,122,167,234,190, 91, 34,145,172,117,114,114,250,
-168,160,160, 64, 69, 16, 4, 79, 16, 4, 8,130, 0,128, 87,214, 44,203, 38,102,102,102,182,250, 87, 23, 33,207, 83, 14, 78, 78,
- 55, 69, 20,229,102,234, 71, 89,142,123,158,150,154,218,222,132,143, 44, 37, 8,204, 40,250, 90,172, 0, 48,251, 77,251, 71,240,
- 0,101,204,118, 1,128,101, 12, 48,132, 37,201, 79, 68,192, 70, 45,199,109, 1, 0, 2, 96,107,250,221,218, 48,212, 35,120, 52,
- 35, 8, 88,243, 60,114,121, 2,247,165,109, 17,251, 55,157,138, 1, 34,145,168,175,149,149,149, 69,102,102,230, 69, 0, 7, 0,
- 12,181,183,183,239,156,151,151, 87, 96, 48, 24, 78, 0, 56, 86, 19,225, 78,205, 48, 83, 34, 22,141,209,232, 13,203,175,222,199,
- 15,157, 91,192,158,225,176, 76, 38,166, 59,105,117,204,138, 43, 15,176,195, 68, 73,162,120, 41,185,102,152, 60, 71,218, 97, 35,
-203, 29, 0,142,219,218,250, 73, 21, 86,191,137, 36,212,243,156,212,130,225, 3,211,210, 18, 6,213,162,220,255,137, 56, 56, 56,
-140, 34, 73,242, 27,158,231,193,178,236,220,172,172,172,157,175, 73,122, 46, 0,155,226,199, 57, 0,190,169,165,222, 11, 0,158,
-197,143,227, 1,120, 9,245,122,141,217,252,211, 79, 63, 5,119,237,218, 21,107,214,172,193,230,205,155,227,210,211,211,151, 1,
-216, 5, 64,247, 55,232, 8, 84, 70, 35,224,189,149,189,218,178,134, 31,191,226,202,188,220,189,146, 63,243,247, 31,126,248,161,
-158,231,121,254,209,163, 71,188, 78,167,227, 13, 6, 3,207, 48, 12,207, 48, 12,111, 48, 24, 74, 23, 55, 55,183,164,151, 62,254,
-138, 38, 73,146,235,222,127,255,253,124,158,231,249,219,183,111,243,106,181,154,215,106,181,188, 78,167,227, 53, 26, 13,175, 86,
-171,203, 45, 78, 78, 78,169, 85,105, 90, 89, 89,221,182,181,181, 77,181,181,181, 77,181,179,179, 75,181,179,179, 75,181,183,183,
- 47, 93, 28, 28, 28, 74, 23,133, 66,145,170, 80, 40, 82,237,236,236,110, 87,183,159,197,244, 2,112,209,136,165, 87, 5,159,237,
- 94,214,104,185,184,184,164,242, 53,192,221,221, 61,193,136,253, 44,193,137, 32,192,150,124,150, 32,192, 73,165, 82,207,178,239,
-227,213, 72, 87,181, 33,101, 87, 87,215,247, 93, 92, 92, 66, 93, 92, 92,206,185,186,186,190,111,196, 79,172,156,166,165,165,229,
-109, 7, 7,135, 84,103,103,231,180,146,197,197,197,165,220,226,234,234, 90,186, 56, 57, 57,165,218,218,218, 86, 90, 70, 60, 64,
- 85,182, 92, 0,104, 41,240, 54, 77, 81, 33, 78, 78, 78,121,225,225,225, 44,207,243, 60, 73,146, 73, 37,219,152,114,236, 47,155,
- 44,213, 21,204,205, 56, 47, 13, 43,120,190, 44, 55,227,188, 52, 76,117, 5,115,181, 97,168, 87, 83, 77, 35,169, 72,115,228,200,
-145, 35,239,167,166,166, 38,229,228,228, 40,183,108,217, 18, 35,147,201,174,108,217,178, 37, 38, 39, 39, 71,153,154,154,154, 52,
-114,228,200,251, 0, 38,153,160, 9, 0,104,223, 12,237,198, 14,112, 81,221, 63, 62, 66,245,118,107,250, 94,199, 0, 4,245,104,
- 47, 78,218, 48,203, 95,117,105,123,160,170,107, 75, 50,194, 68, 77,130,166,233, 14,158,158,158, 99, 20, 10,197,135,197,203,136,
-146,197,217,217,121,132,179,179,243, 8, 91, 91,219, 65, 85,105, 30, 6, 40, 99, 22, 15,153,172,195,160,186,158,170, 23,139, 23,
-242,225, 83, 63,225,199,248,120,228, 13,116,116,172,243, 55,148,209,159,170,233,232,232,152,108, 48, 24,120,189, 94,207,219,219,
-219, 39,191,198,253, 92,197,243,252, 42,158,231, 87, 1, 88,245, 26, 52, 75,175,103, 38, 24,236,170, 52,101, 52, 73, 78,151, 75,
- 36,231,164, 52,157, 38,165,233, 52,185, 68,114,142, 38,201,207, 1,200,254, 73,101,244, 39,104, 90, 40, 20,138,103,107,215,174,
-229, 85, 42, 21,175, 82,169,248,181,107,215,242, 10,133,226, 25, 0, 11, 19, 52,107,170,243, 38, 69,176, 94, 94, 94, 95, 68,203,
- 31,104,245,118,179,250, 71,167,140, 26, 2,238,200, 90,162,154, 59,166,239,219,183,106, 53,102,215,174, 93, 0,128,225,125,251,
-162,103,155, 54,176,180, 48,135, 68, 82,180, 59, 4, 79, 64, 44, 18,163,223,180,207,140,249,250, 21,253,250,245,251,224,200,145,
- 35, 22, 0,176,121,243,102, 12, 24, 48, 0,118,118,118,144,203,229, 16,139,197, 16,137, 68,229,214,213, 65, 81,148,123, 82, 82,
-146,163, 76, 38, 43,141,178,113, 28, 87,110,225,121,190, 36,250, 6,134, 97,224,235,235,107,236,233,154,149,155,155,251, 86, 97,
- 97, 97,169, 70, 69, 75,221,186,117, 1,224,140, 49,130,223,124,253, 21, 56,166, 16, 52, 13, 48, 12,160,213,147,224,248, 10,205,
- 13, 38, 77,154, 84,186,223, 53,161,119,239, 32,130, 32,136, 35,119,238,220, 57,154,150,150,230,205,113,236,184, 26, 70,186, 62,
-126,252,248,177, 5, 0,248,249,249, 77, 2,112,212,148,253,160,105,218,253,193,131, 7,142, 82,169,180,210,200,101,153, 8, 38,
-244,122, 61, 90,180,104,193,152,242, 29, 78,128,103, 22, 73,142,107,222,178,229,248, 5,253,250,201,110,222,188, 41, 35, 73, 18,
- 12,195, 96,229,202,149, 12,207,243, 54,141, 0,171, 72, 32,175, 10,153, 57, 0, 70, 21, 87, 6, 59, 0,172, 44,231, 22,120, 52,
- 83, 27,164, 65, 79, 11,250,181,105, 91,103, 38, 34, 31,134,183,241,177, 56, 14, 75, 90, 27, 11,252,181, 81, 45, 43, 43,171,190,
-107,214,172, 81,236,216,177, 35,239,209,163, 71,250, 45, 91,182, 40, 38, 76,152, 96,169,215,235, 17, 28, 28,156,222,160, 65, 3,
-241,154, 53,107, 20,199,142, 29,123,187,176,176,112,147, 73,229, 69,224,171,161,125,123, 66, 99, 32, 97, 48, 48, 10, 23,133,229,
-158, 41, 35,187,136,120, 94,135,221, 39,238,192,192,112, 63,152, 24,201,106, 63,112,224, 64,159,253,251,247,211,209,209,209,116,
-195,134, 13,193,113, 28, 88,150,133,193, 96, 0, 0,112, 28,135,250,245,235,215,250,188,140, 1,252, 28,156,236,206,181,127,239,
- 93, 51, 23,153, 20,118,217,233, 24, 43,166, 45,119,202,181,123, 1,116,120,163, 34,187, 60, 15,154,166,145,144,144, 0, 71, 71,
- 71, 51,142,227,148, 0, 22,102,103,103,111,195,155, 75, 27, 9, 77, 31,221,253,195, 58,231,182, 29, 58, 80, 78, 46,142,136,121,
- 28, 15,154, 96,187, 63,184,117,167,203,152,137,211,167,232, 24,230,125, 0, 55,223,180, 3,119,238, 48,169, 63, 65, 82,155, 9,
-158,195,162, 13, 39,243,151,174, 88, 43, 15, 30, 55,146,154, 54,109, 26, 60, 60, 60,188,251,247,239,191, 2,192,196,106,117,218,
- 78,234, 15,138,220, 12,158,199,130,239, 78,230, 47, 89,177, 86, 62,177, 6, 58,255,114, 42,253,143,212,218,104,249, 3, 62,141,
- 61, 28,207, 46,157, 49, 81,196,255,242, 35,169,202, 76,171,116, 91,133, 66,177,245,157,119,222, 25,190,115,231, 31,209,232,246,
- 1, 1,232,255,118, 32, 28,237,173, 33, 55,151, 20, 85, 71, 28,129,251,143,158, 27,101, 8, 60, 60, 60,130,143, 30, 61,106, 81,
-214, 76,136,197,226,210,165,172,201, 42, 89, 74, 42,224,170,144,201,100, 8, 13, 13, 5, 77,211,160, 40, 10, 52, 77,151, 46,101,
-159, 83, 20, 5, 39, 39,147,186, 46, 45,179,182,182,110,154,159,159,111,149,147,147, 3, 79, 79,207, 60, 0, 15,202,188,223, 52,
- 61, 61,221,202, 20, 65,142, 41,196,180,177,254, 16,233,110, 64, 39,106, 3, 53,221, 17,215,110, 69, 33,228,204, 69, 36, 37,167,
- 32,176, 93,115,124, 56,108, 32,206,157, 59, 7,150, 53,185,165, 35,149,231,177,162, 79,159,160,153, 0, 65,116,239,222, 61,103,
-242,228,201,100,116,116,244, 7,253,251,247, 11,120,252,248, 73,113, 84,145,152,193,243, 88, 7, 32,213, 72, 93, 9, 0, 92,186,
-116, 9, 0,164, 53,249,237, 73,165, 82, 92,191,126, 29, 37,205,196, 36, 73,130, 36, 73, 80, 20,133, 83, 79, 28, 80,168, 35,161,
- 74,141,192, 39, 65,158,168, 91,183, 46, 72,178,250, 46,137, 93, 0,217, 53,160, 63, 33, 18, 77,115,113,117,245,238,236,227, 35,
- 15, 13, 13,165, 0,192,203,203,139, 87, 42,149, 57, 39, 78,156,200,167,129,205, 94, 60,191,171, 42,147,229,225,225,209, 49, 41,
- 41,233,155,146,115, 78, 16,196,138, 58,117,234,124, 89, 90,110, 28,135,133, 63, 20,138,166, 76,153, 42,110,219,101, 30, 0,160,
-109,159,253,200,123,186,212,159,200,154, 99,253, 87, 95, 37,242,242,242, 14,214,175, 95,159,202,204,204,188, 6,224,133,193, 96,
-152,181,103,207, 30,199,177, 99,199,166,237,221,187,119, 25, 0,215,229,203,151,119, 41, 44, 44, 60,100,138,110, 96, 83,188,215,
-178,105, 64, 59, 79, 15, 15, 92,188,118, 19, 98,137,200,102,210,168, 32, 88, 88,208, 88,181,227, 52,247, 34, 49,107,242,149, 7,
-216,101,130,201,106, 51,112,224, 64,239,253,251,247, 75, 0,224,193,131, 7, 72, 73, 73,129, 66,161,128,153,153, 25, 68, 34, 17,
- 40,138,130, 72, 36,122, 45, 38,203,218,195, 62,236,248,241, 19,102,118,118, 54,216,240,217, 20,124,152,150, 10, 27, 75, 11, 24,
- 10, 10,189,223,176,138,194,175, 83,167, 78, 50,150,101, 81, 88, 88,136, 11, 23, 46, 88,155,153,153, 89,187,187,187, 47,128, 9,
-163,167,100, 50, 89,170, 70,163,113, 44,126,156,166,209,104,156, 0,228, 73,165,210,146,235,116, 65,241,218,216,230,196, 23,120,
-181,153, 48,158, 32,136,178,175,213,148,214,109, 90, 55, 13, 61,118,100,159, 69,110,126, 10,108,108,211, 64, 34, 23,219,182,109,
-132,153,153, 21, 22, 44,152, 67, 63,239,254,182, 91,175,247,222, 15,125, 24, 21,211,253,141, 51, 91, 60,177,173,123,159,225,118,
-102,114,203,226,186,196,128,157,219,167,128, 36, 73,124,249,229,151,104,220,184,241,248,135, 15, 31,206, 3,144, 85,181, 12,182,
- 53,121,107,176,157, 68, 86, 84,196, 28,107,192,150, 3,159, 23,233,204,158,128,161,125,234,142,255, 98,224,179, 95, 27,251, 32,
-191,248,198, 92, 45, 34, 17, 79,180, 69,169, 97, 8, 9, 9,233, 28, 20, 20,116,177,178,231,255, 2, 92,240, 71,254,172,114,230,
-139, 14, 9, 9,225,131,130,130,136, 50, 7, 87,238,121, 85, 52, 3, 28,108,173,229,161,155, 23, 78,177,160,111,156,166,212,241,
- 79,144,172, 41, 87,145,151, 27,162, 41,151,203,135,239,220,185,179, 92, 72,201,211,201, 17, 98,177, 8, 34, 49, 1,155, 78, 69,
-217,235,115, 46,135,128, 32, 42, 53, 89,229, 52, 11, 11, 11, 53,247,238,221,179,216,177, 99, 7, 28, 29, 29,225,237,237, 13,185,
- 92, 14,153, 76, 86,206, 92,149, 53, 92, 21, 24,173,114,154, 37,239,211, 52, 13,146, 36,113,238,220, 57, 48, 12,131,129, 3, 7,
-190, 98,178,104,154,174,204,184, 85, 54, 60,245, 12,128, 7, 60,207,191, 85, 92, 1, 63, 0,208,185,204,251,189, 20, 10,197, 44,
- 0,203,140,213,164, 40, 30,148,230, 26, 56,247,181,160, 19,166, 64, 39,106,134,243, 87,238, 96,231,214, 53, 0, 0,239,134,173,
- 49,168,127, 80,105, 52,206,200,253, 44,197,205,205,237, 64,122,122,198,187,111,191,253, 54,178,179,179, 13, 11, 23, 46, 68,211,
-166, 77,225,231,231,103, 84, 25, 85,114,231,156,250,224,193, 3, 15,181, 90, 13,158,231,141, 49,103,175,104, 18, 4,129, 61,123,
-246, 64,163,209,188,178,177,109,231, 37,248,124,128, 23, 70,127,178, 11, 43, 30, 29,194,166, 77,155,170, 60,118, 57,208, 84, 99,
- 93,127,157,132, 98,154, 46,155,243,177,244,195, 15, 63,164, 70,143, 30,141,248,248,120,140, 29, 59, 86,115,238,220, 57, 93,138,
- 82,121, 66,194,113, 27,244,229,141,113,165,154, 82,169,116,247,153, 51,103,112,232, 80,145, 47,137,137,137,129,175,175,175,121,
- 57,147,156,117, 24,249, 47, 54, 32,236, 84, 52,218,246,217,143,176, 83,195,192,230,156, 22,181,242, 69,174, 41,231,179, 6, 84,
-164,121, 40, 51, 51,179,212, 68,237,221,187,215,108,239,222,189,253, 0,156, 4,112, 8, 0,178,178,178,190, 53, 81, 19, 32, 48,
-122,240,128,126,160,197,150,136,126,146,136,206,237, 91,192,201,209, 17, 15,162, 98,241, 34, 41, 43,149, 32, 48,170, 87, 7,201,
- 50,181, 90, 55,239,242,125,124, 95,141, 38,225,238,238,238,119,248,240, 97,113,153, 8,116,233,127,156,162,168,210,231, 37,198,
-187, 38,191,207, 18,147,101,233,110, 17,246,213,198,142,230, 97,225,123,225,235,245, 30,108,223, 11,194,247,103,207,226,241,195,
- 72,141, 78,197,116,251, 27,202,232,207,210,244, 27, 48, 96,192,181,125,251,246,217, 36, 36, 36,224,210,165, 75,240,246,246,134,
- 74,165, 50,230,134,183,156,166, 70,163,113, 44,249, 12, 65, 16,142, 37,129,119,157, 78, 87, 82, 24, 37,127, 68,155, 50,219,217,
- 84,161,233, 89,102,187, 18,115,229,245, 26,142, 93, 34, 19,139, 15, 31, 63,118,192, 34, 50,250, 18,154, 55,107, 7, 11,235, 70,
-224,216, 20,100,102, 21, 32,251, 73, 50,190,254,122, 5, 22, 44,156,139,147, 63, 29,177,104,224,223,236,168,142, 97,234, 3,208,
-188, 49,229, 78,240,227, 67, 79,237,221, 76,240, 28,212,169,209, 82, 81,225, 51,249,240, 97,239, 83, 67,134, 12,193,201,147, 39,
-241,240,225,195,205, 85,152,172,208, 50,145,249,241, 17,151, 14,109, 6,207, 67,157, 22, 45, 21,171,159,201, 71,126, 48,136,250,
-112,104, 79,220,248,125, 29,122, 54,127, 22,225,234,136,254,217,197, 22,155,166,144, 41,149,225, 42, 31,134, 27,101,204,214, 5,
- 0, 68, 25,131,117, 1,127,244,193,252, 55,208,187,216, 88,141,127,249,198,132,174,137,193, 2, 0, 95,192,130,144,136,195,118,
- 46,248,216, 85, 30,255,144,214, 70, 92, 71,178,150,227,183,196, 49, 92, 11,192,236, 46,160,126,249, 51, 42,149,170, 48, 54, 54,
-214,108, 84,255,254,232, 16, 16, 0, 23,123,123,212,119,119,135,153, 84, 2,137, 88, 84,238,150,213,232, 54, 4,130,224, 27, 52,
-104,128, 62,125,250, 64, 36, 18, 65, 46,151,195,194,194, 2, 18,137,164,194,104,150,177,119,185, 60,207,131,162, 40, 68, 68, 68,
-224,197,139, 23,176,177,177,193,213,171, 87,209,173, 91,183, 87,162, 90,101,205,153, 41, 33,250, 10, 42,254, 18, 35,118,198, 20,
- 45,150, 37, 80,192, 55,131, 44,110, 50, 84, 68, 11,104,181, 12,180, 90, 45,190,191,162,199,205,216, 66,232,245, 58,104,181,218,
-170,190,179, 50, 72, 87, 87,215,225,245,235,215,159, 52,108,216, 48,131, 68, 34, 65, 97, 97, 33, 84, 42, 21, 30, 62,124,104,120,
-247,221,247,114,250,244, 9,178, 62,125,250, 52, 95,220,116,152,106,130,118,166,155,155,155, 71,113,243,108,102, 77,126,213, 4,
- 65,148,154,152,151, 25,245,109, 36,104,170,168, 76, 54,111,222, 12,150,101,193,243,124,165,133,164, 33,136,223, 22, 46, 89,109,
-189,124,237, 15,176,182,115,194,197,139, 23,217, 95,127,253, 53,159, 0, 98, 30, 63,124,248,237,255,128,159, 15, 3,122, 83,246,
- 47, 59, 59,219,204,219,219, 27,238,238,238,224, 56, 14, 6,131,161, 52,250,146,153,153, 9,181, 90, 13, 59,243, 28,212,179,119,
- 7,147,127, 1,202,136, 69,112,177,136,198,174, 51, 58, 67, 75, 63,220,255, 7, 92, 56,126, 44, 94,106,121,215, 12, 55, 71,103,
- 15,144,188, 1,201,105,153,232,215,187, 39, 40,177, 5,158, 39,100,160, 89, 35, 31,151, 15,254,215,209,133, 34, 24,204, 88,182,
-127, 18,192,125, 95,157, 92, 65, 65, 1, 27, 29, 29,141, 7, 15,138,252,174,149,149, 21,204,205,205,203,253,199, 73,146,172, 85,
- 68,171,196,100, 45,217,220,205,156, 20, 21, 34,143, 13,197,142, 61,119,208,172, 65, 16,182,132,221,210,176,169, 89,221, 87,105,
- 52, 49, 7,254,197,193, 12,103,103,231, 9, 28,199, 45,224,121, 62, 39, 48, 48,208,105,255,254,253,182, 73, 73, 73,184,115,231,
- 14,190,252,242,203,116,150,101, 25,158,231, 9,158,231, 23,189,134,175,227,202, 24,172,215,137, 72, 46,195, 39, 14, 86, 68, 95,
-154,180,242,102,242, 10,158,103,232,248, 19, 42,134,251, 14,128,161,202,139, 27, 73,126,116,228,224,102, 87, 7, 5,135, 46,138,
-183,161, 76,213, 99,201,103, 35,145,153,153,143,239,183, 47, 5, 32,129,158,161,240, 86,151,247,225,232,232,134,241,227,198, 59,
-111,222,186,229, 99,134,227, 86,225, 13, 33,229,218,166,159, 0,132, 42, 20,138,135, 31,143, 31,175,240,246, 30, 1,153, 76,134,
- 3, 7, 14, 96,255,134, 13,236, 90, 96,144, 20, 56, 31, 12,252, 84,165, 78,216, 31, 58, 83,130,131, 21,254,254,193,144, 74,165,
-248,253,215, 31,161, 73,217,147,223,187, 3,244, 42, 13,122,215,233,195,219,197,157, 34,178, 68, 34, 60, 1, 0,145, 12, 74, 0,
- 47, 55,131,253,219, 12, 86, 9,167,241, 71,191,172,241,229, 34, 90, 53,190,118,138, 36,225,219,167, 14,245,114,130,150,208, 93,
- 57,133, 36, 45,199, 46,127,172,167,238,230,242,159, 71, 85, 96,178,138,127,216,156,167,167, 39,222,110,213, 10,253, 59,117, 2,
- 77,211,144, 73,196,176,148,153,129,103,139, 34, 89, 37, 77,135, 85,212,137,168, 40,250,100,111,111, 15,177, 88, 92,106,176, 76,
-136,102, 85,168,201,113, 28,104,154,198,131, 7, 15, 16, 24, 24, 8, 15, 15, 15, 28, 58,116, 8,189,122,245,122,165, 41,209, 84,
-147, 85, 98,180, 94,106,198,235, 5,160, 36,146,101,146,209,210,232, 8,100,232,154,129, 32, 2,192, 48, 0,203, 3, 90,141, 6,
- 60, 15,240, 60, 96,208,235,160,209,104, 74,191,211,152, 38, 89,103,103,103, 79, 51, 51,179,197, 51,103,206,240,111,214,172, 57,
-210,211,211,193,113, 28,204,205,205,161, 82,169, 96,101,101,133, 14, 29, 58, 60, 95,188,120,177,146,231, 49,222, 68,147, 85,107,
- 74,206,249,217,179,103,203, 53, 27,150, 44,133,202, 68,140,254,116, 47, 36,116, 81,211, 82, 73, 31,158,170,174,187, 93,223,234,
-136,107,119, 99,152,143,102,172,211,138, 50,239, 44,115,230,184,157,137,181, 56, 46,158,231,145,145,145,129,212,212, 84,244,237,
-215, 15,251,247,237, 67, 92, 92, 28, 26, 53,106,132,174, 93,187,194,209,209, 17,113,113,113,184,121, 89, 11,109,118, 22,178,116,
-119, 32,183,108,139,227, 23, 99,181, 95,110,214,199,254,141, 23,140,190, 0, 70, 90, 89, 89,213, 85,169, 84, 74,134, 97, 14, 3,
- 56, 12, 96, 16, 77,211,131,228,114,185, 75, 94, 94,222, 51, 20,141, 38, 58, 81,157,152,153, 76,102, 47,149, 89,129, 99,180,160,
-105, 26, 30, 30,222,224, 89, 29,178,243,212, 24, 53,164, 15,238, 62,136,194,175,231,111, 48, 6, 3,183,222,152,211, 74, 81, 20,
-239,231,231,135,180,180, 52,136, 68, 34,152,153,153,193,194,194, 2,179,103,207,198,134, 13, 27, 74, 77, 86, 77,141,214, 24,192,
-207,202,211,226,198, 55, 27,139, 76, 86, 74,178, 18,169,137, 34, 40,236,157,176,126,195,218,194,236,184,148,182, 63, 0, 49,255,
-246, 74,150,227,184, 69, 73, 73, 73,142, 52, 77, 59, 51, 12,131,132,132, 4,220,190,125, 27,147, 39, 79, 78,205,204,204,236,130,
- 26, 30,163, 76, 38, 75, 43,137,100, 21, 55, 29, 86,214,156,152, 83, 38,146,149, 83,133,100,101,205,132, 62,222,238,150,231,182,
-175,153,230,217,186,109, 7, 82, 78, 91,101, 23, 60, 73, 9,188,114,233, 98,135,201,107,190,255,248, 69,118, 65, 79, 0, 79, 43,
- 19,149,138, 68,239,182,235,216,145, 6,159, 10, 90, 18,136, 21,203,135, 32, 61, 35, 15,217, 89,249, 16,139,205,161, 51, 80, 96,
- 57, 2, 29, 2, 59,225,199, 93, 7,209,120,220, 88, 74, 34, 18,245, 96,116,186, 55,198,104, 21,179,244,187,239,190,243,108,208,
-160, 1,118,238,220,137,243,187,119,227,195,220, 92, 92, 36, 73,202, 32, 18, 57,252,108, 48,108, 67, 53, 70,171,172, 78,227,198,
-141,241,195, 15, 63, 96,207,158, 61,241,195,187,165, 29,157, 54, 28,142,122, 61,222,185,243, 8,118,117,250, 0,119, 30,193,174,
-101, 3,212,103,104, 60, 33,136,242,233,160, 66, 66, 66, 58,151, 93,255,203, 80,162,146, 38,118, 26, 64,151,144,144, 16,190,236,
-186,218, 11,232, 44, 71,207, 0, 0, 32, 0, 73, 68, 65, 84,167,194, 55,120,105,207,186, 94, 1,245, 60, 9,195,161,117, 72, 40,
-100,116,243, 30,233, 37,143, 11,248,105, 81,192,218, 42,238, 32,120,138,162, 96,105,102, 6,133,141, 77, 81,152,159, 36, 1, 14,
-224, 12, 0,193, 22, 25, 0,158, 35,192,179, 38, 93, 48, 32,145, 72, 42,236,248,110,106,223,172,178,154,249,249,249,120,254,252,
- 57,198,143, 31, 15,185, 92, 94,228,220, 83, 82,224,229,229, 5,154,166,145,148,148,132,223,127,255, 29,117,235,214,133, 84, 42,
- 53,201,109,149,137, 46, 53, 69,209, 40,195,166, 74,165,210,202,197,197, 5, 38, 71,180, 56, 30, 42, 45, 1,157,142,197,227,199,
-143,145,156,156,140,231,207,158,160,117, 97, 30,120, 80,224,121,222,164,136,150,155,155, 91,128,143,143,207,150,101,203,150,137,
-221,221,221,193,243, 60,108,109,109,160, 82,169,144,145,145,137, 70,141, 26,193,195,195, 3,203,150, 45, 3,128,253,127,181,201,
-122,233, 55, 85,106,180,202, 26,174, 79,255,231,137,172, 44, 11, 80, 20, 89,106,156,171,233,163, 37, 6,128, 46, 61, 7,208,231,
-126,253,217,156, 1, 22,167, 80,212, 98,186,250,114, 52,176, 28, 39,175,236,253,132,132, 4,136, 68, 34, 28, 57,124, 24, 89,169,
-169,104,214,172, 25,218,180,105,131, 39, 79,158,224,238,221,187,176,183,183,135,194,189, 61, 46, 62,211, 35, 50, 89, 13,107,107,
-107,196, 38,146,127,103,202,128,113,221,187,119,255,242,219,111,191,117,116,118,118, 22,165,167,167, 55,216,184,113, 99,179,141,
- 27, 55, 78,249,248,227,143,157, 62,254,248, 99, 91,133, 66, 65,167,164,164,248,125,246,217,103, 45, 67, 67, 67,235, 2, 88, 93,
-149,160,185,185,165, 29, 37, 54, 7, 65,208,176,177,182, 5, 45, 49, 7,199,208, 96, 57,192,202, 90,129,107,119,143,224,106,120,
-254,132,180, 76, 28, 54, 42, 62, 86, 92,238,246,246,246,175, 68,170, 39, 79,158,140,237,219,183,151, 54, 35,214,212,100, 45,217,
-216,205,130, 40, 54, 89, 41, 9, 52, 8,109, 93,156,250,233,122, 78,118, 92, 74,224,155, 96,178, 74,174,113, 60,207,227,217,179,
-103, 80,169, 84,184,124,249, 50, 22, 45, 90,148,254,178,201,114,116,116, 28,103,101,101,181,176,160,160, 96, 69, 74, 74,202,186,
-106,111,252,138, 76, 84,201,227,146,117,133,205,137, 70,238,170, 87, 69,145, 44, 15, 23,217,153,187,151,247,122, 89,243,247, 9,
-188, 24, 15, 60,206,123,104, 25,230,248,214,123,173,123,147, 45, 54,125, 85,167,205,132,217,103, 18,242, 52, 13, 42,139,108,113,
- 44,219,194,220,194, 18, 64, 26,238,220,190, 80,106,178, 50,179,114,161,213, 83,208,234, 8,104,244, 36,222,238,254, 14, 54,108,
-217,131,164,180, 44,176, 44,219,228, 13, 51, 89,118, 1, 1, 1,193,131, 6, 13,194,226,197,139, 17,250,237,183,186,137, 4,145,
- 71, 3,252,105,150, 5,199,243, 4,105, 92, 39,246,114, 58,171, 86,173,250, 9,192,208,101,147,209, 62,187, 0,163, 92,251,240,
-118,117,250, 20,109, 56,112, 38, 15, 0,118,233,161,229,171,204,160,160, 32,162,164,101,205,212, 22,182,127, 58,116, 80, 80,208,
-197,144,144, 16,148, 93, 87,245, 1, 75,167, 6,239,125, 49,125,210,242,214,189, 58, 17,202,233, 61,144,149,167, 97,230, 68,234,
- 37,137,234,170, 77, 86, 89,190,216,184, 17,119, 99,138,254,199,238,142,142,152,241,193, 7,224, 25,224,234,195, 72, 28, 12, 13,
-197,144,238,221, 97, 46,147, 25, 29,217,224, 56,174,194, 40, 86,217,104,150,169, 81,167,156,156, 28, 28, 62,124, 24,109,218,180,
-129, 92, 46, 7, 77,211,104,218,180, 41,162,162,162,224,227,227, 3,130, 32,112,252,248,113,244,239,223, 31, 79,159, 62, 69,251,
-246,237, 45, 94,188,120, 97,178,209,138,140,140,180,226,121,254,173,146,232, 71, 77,209,106,181,136,142,142, 70,159, 62,125, 96,
-107,107, 11, 55,183,253, 8, 61,179, 23,242,128, 15, 65, 16, 48,201,104,177, 44, 59,166,119,239,222, 98,130, 32,160, 86,171, 32,
-147,153,193,220,220, 2,150,150, 86,240,243,107,128,228,228,100,244,234,213, 75, 23, 27, 27,187, 73,169, 84, 30, 50,117, 95,253,
-253,253,205,227,226,226, 62,172, 83,167,142, 4, 0,204,204,204, 26,249,248,248,124,254,244,233,211,124, 83,163, 90, 37, 6,139,
- 32, 8, 80, 20, 85,106,180,104,146,132,139,179, 99,233,243,226,254,105, 68, 21, 90,121, 73,153, 90, 41, 0,120,122,122, 98,195,
-214,147,100,239,222,189, 49,101,202, 20, 24, 12, 6,108,218, 84, 52,200,110,216,176, 97,208,235,245, 56,122,180,104,144, 36, 77,
-211, 85,134, 77,110,223,190,141, 59,119,238,192, 96, 48, 32, 55, 55, 23,191,252,242, 11, 46, 94,186,132, 3,199,127, 67,220,179,
- 39,104,218,192, 11, 99,199,142,129, 72, 36,194,174, 93,187, 16, 24, 24,248,183, 94, 16, 68, 34,209,240,237,219,183,187,236,220,
-185, 51,231,248,241,227,133,237,218,181,147,174, 93,187,214,113,195,134, 13, 10,157, 78,135,169, 83,167,166,221,184,113, 67,219,
-175, 95, 63,243,109,219,182,185,212,171, 87,175, 7,195, 48, 21, 25, 45,115, 0, 67, 0,140,200,206,215,209, 57,249,106,112,140,
- 14,207,226,158, 35,183, 64, 7,142,213, 35, 62, 49, 25, 5, 26, 22,153, 89,249,104,218,162,231,119, 23, 46, 92,152,171,215,235,
-231, 0, 8,169,110, 63, 31, 62,124,136, 27, 55,110, 32, 46, 46, 14,207,158, 61, 43,239, 20,199,141,195,158, 61,123, 76,142,104,
- 85,108,178, 40, 16, 90, 31,132, 28, 15,203, 73,123,162,124, 99, 76, 86,241, 53,104,129,139,139,203, 2, 23, 23, 23,217,217,179,
-103,173,235,212,169, 3,134, 97,116, 47, 71,178,186,116,233, 50,111,251,246,237, 46, 62, 62, 62,147, 1,172,251, 39,236, 59, 73,
- 98,220,138,205,193, 14,150,146,248,100, 60, 94, 93,156, 75,144, 2, 84,121,192,133,125,160, 59,206,127, 62,185,223, 76,219, 89,
- 59, 23,143,227,192, 85, 58, 66, 54,246,105, 2, 54,111,222,128,105, 83, 71,225,199,239, 87,128,227,104,104, 13, 20, 60,189,219,
- 65,171,231, 64,144, 52,154,181,104,133,243, 23, 46, 67, 68, 2,135,119,110,126,195,124, 22,178, 34, 34, 34, 54, 29, 63,126,252,
-147, 41, 83,166,128,227, 56,201,194,205,155,213,233,233,233, 75, 97, 90,254,171,151,117,250,111,222,188, 57,102,214,134,244,159,
-166, 13, 7, 21,119,138,200,186,243, 8,118, 3,103,242, 56,178,156, 64,203, 6,200,146, 87, 92,197, 95,122,105,253,102, 24,173,
- 18, 39, 89,118, 93, 17, 45,124,235,126,101,109,103, 59,134,180,116,115,152, 49,101, 34,253, 52, 69,131,163,117, 62, 40,248,125,
-247,122,243, 20, 70,250, 93, 44, 52,107, 77,249,226,131,191,255, 94,250,120,229,254,253, 21,190,167, 28, 56,208,232, 59,179,202,
-162, 88,166, 70,178, 0, 64, 46,151,219,244,232,209, 3,221,186,117,195,251,239,191, 95,218, 39,171,121,243,230, 56,112,224, 0,
- 6, 12, 24,128,123,247,238,193,197,197, 5, 13, 27, 54, 68,195,134, 13,241,243,207, 63,155,122,145, 3,203,178, 8, 8, 8, 40,
- 25,117,216, 52, 49, 49,209,170,166, 5,169,213,106,145,153,153, 9, 59, 59, 59, 72, 36, 18,180,109,219, 6,159,124,218, 22, 14,
- 46, 63, 32,192,191, 1, 10, 11, 11, 75,135,191, 27, 81,217, 6,212,175, 95, 31,233,233,233, 72, 79, 79,135, 66,161,128,171,171,
- 43,156,157,157,177,122,245,106,126,221,186,117,191,234,245,250, 77, 25, 25, 25, 38, 71,178,156,157,157, 59, 17, 4, 49, 79,173,
- 86, 75,202,220,225, 74, 20, 10,197, 9,181, 90,189, 84,169, 84, 26,221, 17,148, 32, 8,232,245,122, 16, 4,129,211,207, 92, 81,
-168, 35,144,151,120, 7, 83,254,231, 85,206,120,137, 68,162,106,155, 75,121,158, 47, 28, 58,116,168,163,135,135, 59, 18, 98, 31,
-226,200, 17, 30,223,126,251,109,201,168, 72,196, 20,223, 24,148, 60,239,218,181, 43,188,189,189,193,155,144, 43,131,227, 56, 60,
-120,240, 0,251, 79, 92,132,139,151, 63,226, 31, 71,227,238,207,167, 80, 71, 97,135,198, 45, 90,193, 96, 48,212, 42,245,198,235,
-192, 96, 48,236,240,245,245,229,117, 58,221, 69, 0, 27,194,195,195, 71, 41,149,202,169, 39, 79,158,116, 29, 52,104, 80,242,169,
- 83,167,214, 2,216, 25, 30, 30, 30,252,245,215, 95,119, 99, 24,166,194,209,130, 20, 69,253,248,217,103,159,117, 25, 52,104, 16,
- 33, 38, 13,186,179,103,118,209, 12, 99, 32,190,152,179,131,189,112,229, 34,201, 48, 6,226,253,161,159,113, 63,255, 30, 78, 78,
-248,116, 37,219,188, 93,111, 68, 68, 68, 56, 7, 5, 5,125,109, 48, 24,170, 52, 90, 37,145,170,202, 34,148, 20, 69, 97,212,168,
- 81, 56,112,192,248, 30, 84, 99, 1, 31, 43, 47,139, 27, 75, 54,118,183, 32,232,130, 50, 38,171, 30, 66,142,135,229,164, 62, 78,
-126,163, 76, 22, 0,100,102,102,110, 5,176,149,227,184, 84,115,115,115,228,231,231, 87,244,251,147,133,135,135,203, 36, 18, 9,
-122,246,236,105, 23, 26, 26, 26, 67,146,228,186,228,228,228, 74, 29, 71, 69,205,132, 21, 53, 39,162, 22,163, 14,109, 21, 8,106,
-219,169,133,229, 35,235,197,150, 50, 90,115,175, 78,140,204,138, 0,144,171,117,122,118,237,197,144, 60, 34, 77,218,188, 85,215,
-150,176,162,205,131,114,152,252, 10,141, 22, 73, 81,119,115,179,115,222,205,203,215,225,202,213, 8, 12, 29, 82, 31, 90, 61, 1,
-142, 35, 81, 80,168, 5, 40, 17, 72, 0,195, 62, 24, 9,158,160,145,149,154, 12,138,162,194,193, 48,120,195,152, 29, 28, 28,252,
-238,156, 57,115,234,206,152, 49, 3, 51,102,204,240,218,190,125,251,214, 37, 75,150,204, 72, 79, 79,111,130,106,146,143, 87,161,
- 83,231,212,129,249,211, 79, 92,222,146,219,187,131,250,113,203, 6, 69,145,175,150, 13,144, 37, 18,225, 9, 77, 33,147,231,203,
-119, 51, 10, 10, 10,234, 92,118,253, 47,227,229, 78,240,165,207,141,234,163, 85,191,174,219, 59, 45,154, 7,124, 58,119,206, 92,
-203,168,107, 23, 48,235,171, 13,188,111,171, 30,249, 91, 47,223,213, 21,152,123,191, 91,144,241,228,170,177,254, 2, 0,222,121,
-123, 0,154, 54,106,243,202,155,129, 93,139,146,181, 95, 57,127, 27,169,233, 73, 70, 87,182,197,230,160,194, 62, 89,198, 12,233,
-127, 25,181, 90,157, 19, 17, 17,225,152,152,152, 88,174,227,187,183,183, 55, 8,130, 64, 88, 88, 24,110,220,184,129,161, 67,135,
-130,166,105,136, 68, 34, 92,188,120,209,164,104, 76,153,232, 82,201,168,195, 94,238,238,238,149,141, 54,172, 86, 75,173, 86, 35,
- 55, 55, 23,103,206,156, 65,253,250,245,177,100,201, 18,184,186, 56, 97,238,220,233,224, 56, 14,121,121,121, 96, 89,214,216,136,
- 22, 87, 18, 45,226, 56, 14,233,233,233,168, 91,183, 46, 54,110,220,136,181,107,215,126,173, 84, 42, 79,154,186,143, 30, 30, 30,
- 54, 44,203,126,209,187,119,239, 30,253,250,245, 67,175, 94,229,243,177,238,219,183,207,242,232,209,163, 75,215,175, 95,255,142,
- 94,175, 95,150,150,150,150,110,140,238, 15, 63, 20,165, 95,146,183, 91,128, 89,131,234, 96,196,164, 93, 88,189,250, 24,164, 82,
-105,185,138,119,241,226,197, 85,154, 24,142,231,125,197, 25,215,146,167,207, 92,229,184,116,105, 40, 66, 67,211, 64,146, 36, 92,
- 92, 92, 64,146, 36,158, 63,127, 14,146, 36,225,229,229, 5,146, 36,145,148,148, 84,210, 39, 48, 27, 21,140,122,172,248, 46,156,
-132, 70,163, 65, 66,124, 28, 18, 99, 99, 96,145,151, 2,133,149, 28,217, 15, 31,160,233,216,113,165,249,159,254,102,246,232,116,
-186, 61,101,158,175, 58,117,234,148,142, 32,136,247, 81,212, 79,163, 36,162,241, 53,195, 48, 95, 87, 38,210,174, 93,187,230,115,
-230,204, 17,149,164,219,112,245,252,134,209,235,245, 28, 0, 52,104,250, 86, 57,183,255,228,201, 19,172, 94,189, 26,133,133,133,
- 16,139,197, 98, 99,206, 3,199,113,165, 35, 12, 43, 50, 97,166,152, 44, 0,176,247,114,255, 46,236,206, 69,246,126,236, 22,117,
-248,163, 95,204,148,241, 36, 72,221,155,107,178, 94,142,108,185,187,187, 47,224, 56,142,231,121,126,126,153,183,164,158,158,158,
-151,207,158, 61,107,207, 48, 12,214,175, 95,111,147,146,146, 98,243,214, 91,111,205, 2, 80,169,209,170,168,153,176,162,230, 68,
-148, 25,117, 40,149, 74,237,116,186, 74,131, 39,175,140, 58,100, 89,248, 89, 89,218, 32, 27,137,208, 58, 24,154,231,216, 51, 89,
-231,148,227,238,185,190,104,209,200,156, 53,212, 37,243,116,112,147,219,128,227,249, 74,135, 70,107, 13,134, 95,238,221,185,219,
-211,211,163, 62,117, 50,228, 18,250,246, 31, 4,173,150,132,198, 64,128,160, 68, 32, 40, 49,154, 52,109,129,134,141,155,130, 7,
-112,251,230, 53, 70,103, 48,156,123,147,202,222,165,227, 39, 67, 9, 2,235,192,115,124, 5,121,180,234,246,239,223,127, 41,128,
- 79,171,211,113,108,247,201, 80,146, 44,210, 41,155, 71,235,179, 79,130,241,240,166,200,250,210,157,229,226, 94,237,112, 58, 61,
-148,128, 92,246,199,168, 67, 17, 89,171,212, 28,255, 22,195, 85,189,209,242,240,240,176,177,146,202,126,248,120,236, 24,203, 23,
-247,175, 35, 37, 50, 12, 87, 47,197,100, 31, 60,122, 44,171, 48, 51,109,172, 9, 38,171,180,153,207,222,185, 14,188,253, 95, 53,
- 90, 50, 11, 5, 0,192,219,191, 13, 40,115,211,210, 8, 85, 20,205,170,137,201, 42,123,193,174, 40,135,214,132, 9, 19,176,125,
-251,118,116,236,216, 17,190,190,190,165, 23,123, 83,163,102, 21, 68,151, 76, 30,109, 88,150,252,252,124,120,121,121, 97,219,182,
-109, 8, 15, 15,135,165,165, 37,134, 14, 29,138,252,252,252, 82,131,101,108,103,120,158,231,159,156, 61,123,182,245,224,193,131,
-121,145, 72, 68,228,228,228,192,198,198, 6, 27, 55,110, 44, 84, 42,149,167,107, 96,178, 6,137,197,226,233, 67,134, 12,161, 26,
- 52,104,128,212,212, 84, 88, 89, 89, 25, 8,130, 16, 1,128,141,141,141,193,204,204, 12,193,193,193,104,214,172, 89,167, 25, 51,
-102,116,164,105,122, 99,114,114,242,174,170,126, 75, 4, 65,148, 86,168, 99,215, 69, 67,167, 43,170,160, 55,109,218,132,226,190,
-110,127, 52, 17,196,198, 2, 70,140,100,177,176,176,128,175,175,111,133,101,223,169, 83, 39,220,190,125,187,168,105,146,166,225,
-232,232,136,171, 87,175, 26, 53,146,170, 36, 17,100, 68, 68, 4,252,189, 29, 16, 30,122, 22, 14,114, 17,154,185, 58,195,189, 83,
-103,196,196,196,252,157,209, 44, 2, 69,253, 48,186, 23,255, 6,119, 0,152, 80,230,249, 70, 0,223,153, 34,200, 48, 12, 79,146,
- 36,145,144,144,160,151,203,229,132,157,157, 29, 45,149, 74,161,213,106, 75, 13,215,147, 39, 79, 16, 18, 18,130,196,196, 68,216,
-217,217,145,214,214,214,208,235,245,217,198,232,251,249,249,193,217,217,185, 92,199,247,177, 99,199,214,200,100,141, 2, 2,182,
-127,179,172,142,148,164,172,253, 29,222,193,179,232,231, 26, 82, 7,217,127,193,100, 1, 64, 78, 78,206, 86, 0, 91, 75,158, 59,
- 56, 56,140,166, 40,106,174, 86,171,181,190,120,241,162,141, 66,161, 32,118,237,218,101,152, 63,127,126, 14, 69, 81,217, 4, 65,
-172,249,251,205, 33, 34, 51,114, 99,189, 68,182,174,220,125, 13,127,109,106,194,172,134,217,162,250, 10,162,113, 0,250,167, 69,
- 93, 25,205,196,118, 72, 85,166,144, 60,184,200, 42,174,193, 59,102,205, 89,252, 69, 76,244, 93, 79,153,149, 12, 19,130,231,224,
-244,175,231, 65,144, 34, 92,190, 22, 6,157,158, 69, 70, 86, 46,134, 12, 27, 14,119, 23, 7, 68,222, 56,147,206,112,220,198, 55,
-203,100,115, 27,122,246, 29,109, 43, 53,147, 23,159, 19, 22,123,190,159, 14,146, 92,135, 47,191,252, 18, 1, 1, 1,147, 34, 34,
- 34, 22,161,154, 60, 90, 4,193,109,104,210,121,152,173, 88, 90,164,195,115, 44,182, 29,158, 85,156, 71,107, 26, 54,110, 61,218,
-164,177,247,179,133, 85,229,209,122,131, 76, 86,217,117,213, 70,203,203,203, 75,106, 46,194,120, 17, 69,207,248,248,131,126,138,
-180,216,135, 72,140,186, 91,212,188,160, 87,235, 83, 30, 71, 25,147, 10,189, 59,202,231,239,224,171,106,186,210,104,140,186,163,
- 47,167, 89, 82,225,190, 28,205, 50,209,100,189,162, 89,214,108,149,205,155,229,225,225,129,165, 75,151, 26,147, 71,235,229, 99,
- 47,161, 23,138, 58,192,151,237, 12,223,203, 72,147, 85,161,166, 66,161, 64,102,102, 81,134,132, 46, 93,186,160, 75,151, 63,198,
- 51,232,245,250,210, 40,150,165,165,101, 69, 17,173, 87, 52,205,204,204,102, 29, 59,118,108,204,181,107,215, 6,127,254,249,231,
-162,110,221,186,149,152, 57, 21,140,155,219,173,156, 38,203,178,193,103,206,156,161, 56,142,195,182,109,219,112,251,246,109, 94,
- 46,151,207,147,203,229, 27,204,204,204, 88,181, 90, 61, 97,220,184,113,195, 23, 46, 92, 72,118,234,212, 9,215,175, 95, 39,235,
-214,173, 59, 18, 40,151,196,178,194, 99, 15, 11, 11, 3, 73,146, 96,178,226, 49,105,214, 65,152,155,209,136,142,142, 70, 86, 86,
-214, 43, 73, 76,141, 57,159,101, 35, 37, 37, 75,167, 78,157, 74,155, 33,219,182,109, 11,138,162,112,239,222,189,202,154, 97,203,
-106,242,246,246,246,165,191, 15,177, 88,140,243,231,207,227,171,175,190,130,167,157, 13,178,163,194,225,220,229,109,244, 24, 51,
- 14, 67,135, 14, 5, 69, 81,176,179,179, 43,141,252, 26,241, 91,170, 13,101, 53,199,248,251,251,143,140,140,140,116,111,210,164,
-137, 75, 68, 68, 68,215,128,128, 0,175,240,240,240,146,231, 82, 24,215, 55,167, 84,243,214,173, 91, 71, 54,108,216, 16, 60,106,
-212, 40, 49,199,113,236,139, 23, 47, 12, 0, 8,103,103,103,234,214,173, 91,220,201,147, 39,161, 86,171,225,238,238, 78,186,185,
-185, 17,231,206,157,227,162,162,162,194,120,158,159, 99,204,177,179, 44, 91, 46,141, 67,201,227,125,251,246,153,252,127,175,211,
-208,111, 73,183,183, 26,120,100, 36,223,131, 50, 41, 22,108,174, 66, 31,114,252,148,214, 68,147,245,103,151,209, 95,169,185,248,
-241,227,199,110, 90,173, 22, 18,137, 4,155, 54,109,210, 47, 93,186, 52, 50, 35, 35, 35, 16, 21,143, 40, 47,167, 89,195, 81,135,
- 89, 85,104,190, 50,234, 48, 55, 19,167,143,159,184,213,218,162,255, 14, 76, 74, 78, 47,237,216,200, 19,132,221, 49,167, 70,129,
-242, 54, 77,146,200,159, 23,144,249,172,234,116, 21,199,174, 83,235,116,131,250, 15, 24,246,219,129, 3,251, 45,230, 47, 88,128,
-171, 97,225,200,204, 41, 0,199, 83,224, 8, 2,115,231,206,135,179,131, 29,242,146, 31,171,180,122,125,127,148,207,161,245,175,
- 47,119,130, 32, 39,159, 59,185,107, 29, 73,128, 43, 76,125, 36,165,242, 99,229, 35,134,246,167, 7, 13, 26,132, 99,199,142, 33,
- 34, 34, 98, 75, 21, 38,171, 84,147,231,201,201,225, 23, 15,174, 35, 0, 78,157,254, 72, 74, 23, 60,147,143,252,160, 63, 61,116,
-232, 80,252, 20,114, 13, 7, 78, 61,219,124,224, 20, 78,225,205,198,244,204,240,150, 52, 34, 2, 27,249,184,117,106,209, 88, 70,
-179,106, 36, 70,197, 34,171, 80,131,115, 15, 95,228,144, 60, 89,227,220, 58, 69, 23, 72, 49,226,227, 31, 87,112,103, 37, 43,174,
-208, 53, 38,105,146, 36, 89, 46,154, 85,155, 72, 86,217,253,116,114,114, 42, 55,157, 75,217,138,187,164, 15, 80, 13, 82, 59,204,
-138,143,143,183,138,143,143, 7,207,243, 8, 11, 11,179,106,219,182,237,172,218, 68,179,166, 79,159, 94, 26,181,122,121, 93,209,
-107,213, 81,220, 41,125,173,193, 96, 56, 60, 99,198,140, 73,109,219,182,237,185, 96,193, 2, 2, 38, 76,192,251, 82, 52,135,225,
- 56, 14, 23, 46, 92,192,177, 99,199, 88,189, 94, 63, 94,169, 84,134,151,217,100,253,157, 59,119,206, 13, 24, 48, 96,215,163, 71,
-143,168,200,200, 72,240,124,245,227, 78,213,106, 53,124,125,125,193, 48, 12,150, 79,242, 64,126,126, 19, 48, 12, 3,150,101, 97,
-110,110, 94, 26,197, 43,107,158,171,251, 29,177, 44,251,138,209, 10, 11, 11, 3, 69, 81, 8, 12, 12,196,221,187,119, 75, 35, 90,
-213, 69,160,244,122,125,188,147,147,147,211,226,197,139, 75,247, 43, 61, 61, 29,103,207,158, 69,187,246, 29,208,104,252, 4, 36,
- 39, 39, 99,205,154, 53,112,117,117,197,146, 37, 75,144,149,149, 5,134, 97,254,234,112,250,187,145,145,145,238, 31,124,240, 65,
- 90,120,120,184,123, 72, 72,136, 77, 80, 80,144,249,176, 97,195,210,194,195,195,221, 9,130,232, 0, 19, 59, 65,115, 28, 55,123,
-238,220,185,191, 46, 89,178,100,214,167,159,126,218,118,212,168, 81, 34,145, 72,196, 37, 37, 37, 49,251,247,239, 39,124,125,125,
- 73,177, 88, 76,156, 57,115,134,187,121,243,230, 13,134, 97,150, 3,184,108, 74,196,185,172,201,162, 40,202, 88,147, 85,142,169,
-142,210,145,150,100,122,224,134, 77, 75,201, 6,222,238,250,221,251,207, 38, 92,190,254,248, 41,165,101,166,254, 80, 69,106,128,
- 55, 25,138,162, 14,249,251,251,143,158, 60,121,178, 89,175, 94,189,164, 11, 23, 46,204,205,207,207,175,204,100, 85,112,195,252,
-151,140, 58,252,126,246,231, 33, 83, 63,107, 50,218,231, 35,231, 58, 8, 45, 76, 67, 54, 77,145, 86, 54, 36, 90,120, 81,200,207,
-120,162, 56,245,219,206,231, 0,170,203,203,118,235,206,131,136,238,141,155, 52, 63,186,124,201,114,199,121, 51,103,136,142,134,
-252, 2,158,209, 35,236,226, 69, 88,136, 89, 62,234, 78,104,170, 86,175,235,135, 55,112, 10, 30,229,213,239, 14, 0, 56, 97,103,
-103,119,127,204,168, 81,190,254,254,195, 32,151,203,113,228,200, 17,236, 89,191,158, 93, 11, 12,150, 2,119,131,171,201,167,151,
-118,163, 84,231,222,184, 49, 99,252, 90,180,248, 8,114,185, 28,135, 15, 31,198,174,181,107,141,214,249,151, 83,146, 25,254, 52,
-254,200, 16, 95, 77, 31, 45,146,200,191,241,248, 69, 65,216,227, 23, 5,224,120,158,227,121, 45, 73, 34,161, 80,175, 95,242,248,
- 89, 82,141, 76, 65, 73,211,225,215,223, 76,126,125,109, 30,101,204, 79, 77,135,116, 87, 96,178, 18,203,206,145, 86,182,146,174,
-236,177,193, 96, 72, 52, 82,126,153,167,167,231, 43,175,213, 60,244,203,155,100,178,140,205,163, 5, 0,153,153,153, 74, 0,243,
-174, 95,191,190,175,103,207,158,227, 0, 36,213,176,140,182,117,238,220,121, 60, 0,138, 32,136, 45,201,201,201,225,175,252,225,
-149,202, 24, 87, 87,215,149,222,222,222, 19,138,110, 76,137,109,213, 84,228,207,154, 52,105,162,175,168, 44, 42,123,206,113, 92,
-181,101,148,147,147,131, 54,109,218,188, 50,167, 37,207,243,120,241,226, 69, 73,196,169,244,220, 87,101,224, 10, 10, 10, 38,124,
-242,201, 39, 91, 69, 34,145, 39, 0,162,196,228,178, 44, 75,125,247,221,119, 50,150,101, 41, 0, 4, 73,146,140, 72, 36,210, 28,
- 59,118,140, 97, 24, 38, 94,171,213, 78,248,139, 47, 16,135,137,162,169, 24, 10, 35, 35, 35, 27, 20, 71,178, 18, 35, 34, 34,238,
- 29, 56,112, 64, 1,224, 96, 13,117, 47,171, 84,170,203, 75,151, 46,237,180,105,211,166,217, 19, 38, 76,104, 51,116,232, 80,186,
- 75,151, 46, 56,125,250, 52,123,225,194,133, 48,181, 90,189,204, 20,131, 85, 92,150,185, 30, 30, 30,165,134,171,154,255,114,149,
- 29,121,237,189,164, 27,134, 79,116,149,109, 91,118,182, 32, 35, 89,119,205, 80,160,155,179, 19,136,192,127,152,212,212,212,207,
- 1,204, 95,179,102, 77,114,179,102,205,164, 98,177, 88,103,172,201,250, 11, 97,184,156,130,247,190,237, 49,240, 68,231,185,159,
-120,247,232, 26, 40,247,168,227,232, 22, 21,155,138, 39,215, 79, 23,222, 63,245, 77, 28,175,205,238, 11,192,152,158,235, 55,181,
-122,125,253,233, 51,166, 79,146,136, 68, 61, 89,150,109,218,237,220,113,158,162,168,112,157,193,112,174,184,185, 80,243, 6, 23,
-249,215, 43, 87,174,244,245,247,247,199,145, 35, 71,112,110,239, 94, 12,201,200,192,121,138,162, 72,177,216,254,148, 94,191, 10,
-198, 25,164,175, 87,175, 94,237, 23, 16, 16,128, 67,135, 14,225,204,174, 93, 24, 92, 51,157,202,234,186,214, 0, 20,197, 79, 51,
- 0, 60, 2,208, 18,128, 25, 0, 45,138,166,118,114, 40, 91,133, 21,191, 87,242,254, 37,130, 32,254,204,142,176,213,103,134,127,
-153,136, 39,113, 45, 95,247, 94,168,213,234, 44, 95, 95, 95,147,198, 92, 27, 12,134, 42,219,112, 25,134, 73,244,241,241, 49, 58,
-106, 97,140, 41,202,202,202,106,245, 39, 22, 70,173,250, 98,149,171, 68, 56, 46,206,197,197,133, 43,169,244, 43, 50, 97, 21,189,
-198, 3,207, 77,249,158,148,148,148, 71, 0, 62,171,233,126, 38, 39, 39, 31,133, 17,147, 70, 27,187, 29, 0,100,103,103,191,246,
-201,124, 9,158, 79, 90,184,112,161, 73, 6, 27, 60, 95,149,249, 12, 47, 40, 40,104,107,204,119,235,245,122,252,141, 28, 42, 94,
-200,136,136,136,113, 4, 65,244, 66, 81,147,192, 22,188,158,108,222,151,243,242,242, 46,175, 88,177,162,211,182,109,219,166,242,
- 60,143,188,188,188,181,166, 26,172,210,187,231,180,180,211,175,235,192,179, 82,117,191,239,223,146,248,182, 58, 71, 63,117,123,
-129,110, 23, 4, 74,131, 81, 60,207,255, 56, 98,196,136,118, 0,118,214, 86,172,146, 81,135,181,229, 57,151,157,219,236,252,244,
-175,198,156,183,177,236, 13,150,110, 0, 29,121, 10,186,204,211, 0,126,128,113,221, 28, 74,143,151,225,184,213,140, 78,183,186,
- 76,229,242, 95, 40,103,187,128,128,128,169,163, 71,143,198,252,249,243,113,102,213, 42,253, 68,130,200, 21, 1,252,175, 69, 55,
-154, 36, 1,204, 52, 86,103,228,200,145,152, 63,127, 62,126, 94,190,188,166, 58, 85,161, 32, 8, 34, 4, 0,102,205,154, 53,103,
-233,210,165,182,179,103,207,110,186,108,217,178, 37,197,207, 31,150,188, 95, 92,215, 5,205,158, 61,187,113,153,247,243, 1,220,
-250,147,207,103,133,153,225,255,108,186, 11,154,130,166,160, 41,104, 10,154,130,166,160, 41,104,214, 6,158,231,123, 23,173, 42,
- 95, 87,246,184,204,250,111,129,134,128,128,128,128,128,128,128,192,191,144,178, 81,172,154,188,255, 26, 41,233,163, 85,150,109,
- 64,209,176,238,202, 92,169, 41,163, 30,106,226,108, 67, 5, 77, 65, 83,208, 20, 52, 5, 77, 65, 83,208,252,207,105, 86,167,253,
-202,231,121,158,239, 77, 16, 68, 8,207,243, 65,149,173, 75,140,213,203,143,203,172, 95, 91,183,131, 10, 40,233,155,245, 74, 31,
-173, 63, 27, 33,172, 42,104, 10,154,130,166,160, 41,104, 10,154,130,102,173, 40,105, 2, 4,192,207,154, 53,107,246, 63,176,233,
-208,165,216,100,149, 93, 0, 84,209,116,200,243,135,169,164, 36, 88, 73, 36,114, 49, 0,232,116, 42,189,155, 27,242, 8, 98,208,
-223, 57,225,173,192,191,147,146,225,222,169,175,121, 91, 1, 1, 1, 1,129,255, 6,233, 37,145, 42, 0,233, 0,136,226,231,186,
-226,117,122,177, 33,123,249,113,185,247,255, 68,148,168, 36,146, 69, 87,102,178, 50, 50,228, 14, 52,157,237,199,178,154,134, 0,
- 64,211,100,116, 70,134,109, 12,207, 31,206,168,137,217,114,112,116,188, 35,162, 40, 55, 99,182, 53,176,108, 82, 70,106,106,249,
-212,241, 4,241, 38, 24, 60, 99, 77, 68,109,204,198,159,110, 84, 28, 28, 28,156,156,156,156,254,103,101,101,213, 62, 39, 39,231,
-102,122,122,250, 79, 85,204,123,184,148, 32, 48,163,232,119,133, 21, 0,102, 87, 33,109,202,182, 47,227, 43,151,203, 39, 17, 4,
- 17, 80,252, 7,139, 80,169, 84,155, 0, 60,254, 15, 94,144,204, 0,244,163,105,122,164,131,131, 67,155,148,148,148,133, 0,106,
-154,205,155, 6, 48,221,198,198,102,136,141,141,141, 79, 86, 86,214,211,188,188,188, 67, 0, 86, 3,168,118,168,244,194, 79, 93,
-218,119,233,213,101,222,133, 51, 23,190, 94,184, 94,121,253,149,247,167,187,216,247,236,209,113,254,133, 83,215, 22,207,217,152,
-156,101,226,190,145,197, 11, 80, 52, 58,146,199,171,201, 94,107,139, 8, 64, 31, 0, 93, 0, 92, 0,112,202,152,227,174,132,118,
- 0,230, 20,239,243,106, 0,231,255,225,191, 35,115, 39, 39,167,229, 0,250,208, 52, 29,153,148,148, 52, 30, 64,226,223,188, 79,
- 52,128,214, 0, 2, 80,148,134,227, 22,140, 75,225, 80, 45,246,246,246, 65, 52, 77, 79, 42, 78,237,178, 41, 51, 51, 51,228,159,
- 90, 48, 18,137,100,173,179,179,243, 71,106,181, 90, 69, 16, 4, 95, 54,223, 35,195, 48,137, 25, 25, 25,173,222,180,139, 26, 65,
- 16,183,254,225,187, 56,190,130,215, 42,207,163,149,148, 4, 43,154,206,246, 75, 75, 9, 31,146,172,124, 48, 24, 0, 92, 93,154,
- 30,114,116,110,114, 48, 41, 73,162,119,110,208,223, 66, 36,167, 55, 81,148,168,185, 70,167,117, 16,209,162, 12, 61, 99,184, 71,
-234,248, 73, 41,143,126,170, 48,217,162,136,162,220,226, 98,206, 59, 50,250, 44,136,100,174, 16,153,121, 86,186,183,174,174,174,
- 53, 58, 74, 91, 91, 31, 75,189, 84, 54, 85, 36,162,122,112, 60, 19,192,115, 0, 73,136, 34, 24,214,240,155, 88,171,253, 54, 59,
-251,105,126, 77,207, 96, 3,123, 56,243,192, 80, 16,232, 1, 30,231, 8,224,192,163, 76,164,152, 32, 97,172,137,168,141,217, 40,
-251,217, 53, 0, 62,127,221,191, 36, 55, 55, 55,219,160,160,160,181, 95,125,245,149,153,133,133, 5, 17, 31, 31,223,107,230,204,
-153,111,221,190,125,251,179,164,164,164,228,151, 77, 31, 65, 96, 6,199,241, 36, 0,144, 36, 49, 83,161,112,148, 83, 20,245, 74,
-110, 35,150,101,229,233,233,105,147, 57,142, 39,138,183,157,193,243, 88,103,140, 97,148,201,100,195, 2,154, 52,255,108,249,202,
-213, 22, 78,142,142,230, 12,203,233,159,191,136,147,207,155,245,121,219,216, 39,143,215,105, 52,154,253, 53,249, 95, 83, 20, 53,
- 68, 42,149, 6, 1,240, 47,126, 45, 74,171,213,134,176, 44,123,208,216, 10,221,201,201,233, 18, 69, 81,117, 76,249, 98,150,101,
-227, 83, 83, 83, 3,107, 88, 68,131, 60, 61, 61,127,232,220,185,179,188, 77,155, 54,144, 72, 36,152, 63,127,254,116,165, 82, 89,
-157,209,162, 1, 76,151,203,229, 67,204,205,205,125, 10, 10, 10, 98,213,106,245, 81,137, 68,210,125,221,186,117, 30, 29, 59,118,
-180, 76, 77, 77, 37, 40,138,114,250,249,231,159, 63, 92,187,118,109, 47,134, 97,186, 85, 87,201,229,198,242,243,164,125,252, 59,
-229,198,158,159, 7,224,221,151,223,103, 52,178,145, 60,229, 17,164,230,239, 38, 20,155, 15,163, 77,150, 72, 36, 90,231,236,236,
- 60, 90, 83,148, 43,128,127,185,194, 1, 0,157, 78,151,157,147,147,211,160, 38,127,121, 0, 99,109,108,108, 70,127,241,197, 23,
-182,239,190,251, 46,246,238,221,251,241,246,237,219,179,243,242,242,126, 68, 81, 34,204, 71, 38,106,206, 72, 73, 73,121, 79, 36,
- 18, 17, 30, 30, 30,148, 90,173, 54,197,104,249,161,104, 18,230, 91, 0, 54,161, 40,117, 65, 87,160,232,255, 14, 96, 69,137,113,
- 35, 73,114, 83,131, 6, 13,254, 23, 21, 21,181, 25,192,215, 53,253,175, 59, 59, 59,111,221,184,113,227,224,190,125,251, 82,233,
-233,233,110,205,154, 53,219,151,146,146,210,233, 53, 92, 70,198, 72,165,210,105, 77,155, 54,109,244,232,209,163,152,188,188,188,
-213,197,231,179,170,255,148, 59,128,238, 54, 54, 54,221,230,206,157,107, 17, 20, 20,132,109,219,182,189,183,125,251,246,130,252,
-252,252,223, 80,212,167,167, 86, 38,144,166,233, 73,137,137,137, 14, 60,207,195,197,197,101, 18,128,127,164,209, 34, 73,114,221,
-128, 1, 3, 70,239,219,183, 79, 30, 23, 23, 39,119,115,115, 43, 77,158, 77, 16, 68,141,235, 79,129, 90,179,173,140,225,170, 62,
-143,150, 68, 34, 23,179,172,166, 97,178,242,193,224,183, 58,127,103, 13, 0,151, 46,126, 50,216,209,185,113,132, 68, 34,143,145,
- 90,201,142, 13,232,211,189,249,192,160,206,132,187,139, 35, 18,149,105, 78,223, 31, 56,243, 78,200,153,243,199, 80,148, 64,172,
- 66, 24,125, 22,204,244,161,120,116,101, 61, 28,186, 36, 99,195,207,137,184,126,255, 57, 84,185, 25,168,227,108,134,149, 83,123,
-194,217, 86, 94,179, 91, 47, 71,223,174, 12, 45, 61,248,193,176, 17,214,255,235,231, 47,242,114,118, 6,207, 75, 17, 19, 91,208,
-225,151,179,231, 91, 31, 61,188,127,146,185,200,119, 72, 97,218, 99,163, 47,110, 45, 92, 96, 86,168, 71, 63,154, 34, 62,236,216,
-170, 81,183, 97,239,117, 34, 27,249,215, 71,228,195,168,158, 39,126, 15, 91, 73, 94,123,248, 27,195,242,187,205,197, 56,126, 87,
- 89,101, 66,191, 87, 12, 71,183,110,221, 59, 73,165,210,114,201,147,180, 90,173,248,183,223, 66,219,213,196,108,148,124,135, 78,
-167, 37, 69, 34, 9, 72,146,248, 44, 32,160,137,127, 70, 70,198,121,130, 32,126, 72, 78, 54, 45, 90,240, 9, 32,201,166,233,150,
-164, 84,234,194,234,116,246, 0, 64, 72, 36,217,207, 73,178,201,220, 57,115, 44, 40,138,226, 50, 51, 51,161, 82,169,136,113,227,
-198,201, 98, 99, 99, 7, 36, 37, 37,173,175,230,142, 4,219,183,111,247,115,113,113,121,101,246, 88,165, 82, 41,233,219,247,127,
- 53, 41,122,191,166,205, 90, 76, 59,115,230, 87,255,188,172,108,205,246, 53, 91,239, 24,100,114,109, 93,255, 6,162, 77,219,118,
- 89,143, 31, 61,252,147,232,232,135,247, 96,218,124,117,158,102,102,102,199, 86,173, 90, 21,208,181,107, 87,145,163,163, 35, 82,
- 83, 83, 17, 21, 21, 21,240,251,239,191,247,219,181,107,215,116,181, 90, 61, 0, 48,106, 66, 84,223,223,118,255,224,104,110,103,
- 15,214, 96,128,107,211, 22,165,249,205,158,252,126, 22,140, 94, 15,206, 96,128,127, 80,191,226,104, 50, 15,127,127,255,154,102,
-221,117,109,220,184,241,158, 37, 75,150,136,181, 90, 45,194,194,194,112,254,252,121, 78,169, 84, 86,151, 16,151, 38, 8,226,236,
-130, 5, 11,220, 3, 3, 3, 45, 51, 50, 50,192,178,172,195,241,227,199, 39, 53,111,222,220,202,195,195, 67,178,123,247,110, 20,
- 20, 20,128, 97, 24, 59, 31, 31, 31,187, 97,195,134,233,118,239,222, 61, 29,192,242,202, 34, 89,121,177,252, 60, 37,225,243, 78,
-131,150, 35,145, 66,252,250,206,180,119,240,139, 85, 61,162, 52,178,245,142,143,143,101, 94,146,124,166,133, 85, 19,187,188,164,
-208,153,239,248,248,108,255,245,169, 81, 55, 67,100,113,101,243,193,129, 3, 7,228, 81, 81, 81,114,127,127,127,112, 28, 87,154,
-129,191, 36,225,172,175,175,111, 77,206,227,178,224,224,224,153,131, 7, 15, 70,211,166, 77, 75,147,162,126,249,229,151,152, 57,
-115,166,237,165, 75,151,166,239,223,191,127,250, 79, 63,253,180, 28,192, 44, 19,163, 49, 37,152, 90,198,139,158, 61,123, 54,232,
-216,177, 99,195,103,204,152,225, 11, 96, 50,128,249,153,153,153,157,139,163, 49,146, 98,163, 53,102,250,244,233, 19,103,205,154,
-133,247,222,123,111,126, 88, 88,216, 55, 53,140,242, 81, 12,195,188,215,183,111, 95,202, 96, 48,192,220,220, 28, 6,131,161, 94,
-109,131, 18, 0, 54, 78,152, 48, 97, 98,112,112, 48,108,109,109, 97, 48, 24,252, 14, 28, 56,176,125,254,252,249,237, 1,140,173,
-100, 95, 71, 78,156, 56,241,253, 17, 35, 70,160, 85,171, 86,160,233,162,211,184,106,213, 42, 44, 94,188,216,226,236,217,179,253,
-118,239,222,221,239,196,137, 19, 71, 81,126,218, 46,147,224, 56, 14, 52, 77, 35, 33, 33, 1,142,142,142, 82,142,227,206, 16, 4,
-177, 45, 43, 43,235,167,127, 80,101,190, 98,208,160, 65, 31,236,219,183,207, 2, 0, 86,174, 92,137,105,211,166,193,201,201, 9,
- 22, 22, 22,130,213,249,231, 68,180,198, 87, 27,209,170, 14,149, 74,213, 98,246,167, 31,130, 36,139,238, 26,235,215,245,196,210,
- 57,227,137, 19, 33,103, 90, 84, 25,131,151,185,226,209,149,245,144,122, 76,133,214,192,224,198,253,103, 56,183,178, 87, 81,109,
-249,238, 92,104,245,221, 74, 42, 27, 59,137,153,217, 10, 29,203, 94,133,179,115, 24, 94,188, 72,175,206,100, 41,156,157, 66,182,
-108, 89,110, 22, 80,175, 1,244,140, 1, 73,105, 73, 32, 8, 41,220,221, 44, 49,102,228,187,162,206,157, 93, 29, 22, 45,218,122,
- 58,133, 67,127, 85,198,227,106, 19,134,250, 57, 96,103,139, 0,223,193,195,122, 7, 74,155, 4, 52,134, 88,106, 86,250, 94,203,
- 86,173,208,178, 85, 43,114, 86, 65,126,143,155,183,238,244, 56,114,246,134, 86,101,120,113, 40, 38, 3,163,170,185,200,148, 26,
-142, 41, 83,166,192,201,201,169,220, 6,169,169,169,248,253,247,223, 42,252,140, 9, 23,178,210,239,248,230,155,111, 44,179,179,
-179,223,221,177, 99,199,219, 28,199,125,147,146,146,114,197, 24,145, 17, 64,157, 92,169,180,219,232,213,171,185,230,255,251, 31,
-101,227,236, 76,114, 44, 75, 36, 63,125,106,191,102,253,250, 46, 89, 79,158,152, 21,218,217,101,101,171,213,170,152,152, 24,200,
-100, 50,130,166,233,214, 21, 72,165,242, 60, 86,144, 36, 49,147, 32, 8, 72,165,178,152,224,224,224,187,197,239,213, 57,117,234,
-148,188, 79,159, 62, 42, 0,113, 0, 32,149,202,220, 40,138,222, 54, 21,243, 0, 0, 32, 0, 73, 68, 65, 84,244, 43,202,196,142,
- 21,198, 24, 76,115,115,243, 79,191, 94,178,220, 60, 47, 43, 71,173, 47, 44, 52, 40,172, 44, 8,194,194,146,202,203,205,207, 79,
- 82,166,107,231, 46, 92, 76, 77, 24, 51,226,211,194,194,194, 73,198,154,172,102,205,154,221, 60,118,236,152,163,189,189, 61,114,
-114,114,144,153,153,137,155, 55,111,130,227, 56, 12, 24, 48, 64,218,161,109,155, 22,115,230,206,187,158,144,148,212,222, 24,179,
-101,110,231,128,149,129,205,139, 42,235,184,204,210,242,217, 54, 40,168,116,155,197,137,185, 37,209,185,218, 76, 33,213,190, 91,
-183,110, 98, 0, 24, 59,118,108, 94,126,126,254, 82, 0,251, 80,125, 70,255,233,243,230,205,115,171, 91,183,174,215,190,125,251,
- 80, 80, 80, 0, 0,142,117,235,214,133,159,159, 31,123,225,194, 5,248,249,249,193,210,210, 18,151, 46, 93,194,245,235,215,209,
-170, 85, 43, 75,177, 88, 60, 88,175,215, 87,104,180,186,244,234, 50, 79,218,199,191, 83,131,150, 35, 97, 97,229,130,237,251, 15,
-226,209,157, 93,157,180,250,168,121, 98,246,226, 8, 53, 47, 29,149, 30,111, 49,171, 78,171,206,246,245, 27,255, 15, 94, 45,239,
- 58,104,216,203,207,230,245,168,187,140,150,105,118, 45, 92,173,204,172,204,100, 1, 88, 57, 96,192,128, 65, 7, 14, 28,176, 1,
-128,240,240,112,164,166,166, 66,161, 80, 64, 38,147, 65, 36, 18,149,206, 79, 90, 67, 70,109,218,180,169,212,180, 49, 12, 83, 58,
- 11,128, 92, 46,199, 91,111,189,133,230,205,155,227,167,159,126, 26, 85,137,209, 10,108,219,182,237, 94, 47, 47, 47,143,178, 47,
- 22, 22, 22, 98,232,208,161, 0,128,206,157, 59,119, 51, 51, 51,227, 75, 12,161, 82,169, 44,184,117,235, 86, 15, 0, 97,149, 56,
- 75,117, 82, 82, 18,190,248,226, 11, 60,127,254,252,227, 45, 91,182,188, 0, 32,147, 72, 36,165,247,199, 0,252, 26, 55,110,188,
-110,218,180,105,136,141,141, 69,100,100,228, 77,212,188, 41,149, 53, 55, 55,127, 98, 48, 24, 90, 49, 12, 3,181, 90,141,254,253,
-251,203,142, 30, 61,154, 74, 81, 84,116, 70, 70,198,112, 20,245, 73, 49, 22, 25,128,213,193,193,193, 19,103,204,152,129,223,126,
-251, 13, 39, 78,156,192,136, 17, 35, 48,117,234, 84, 88, 88, 88,140,158, 58,117,234,117, 20, 77,104,254, 50,221, 54,109,218, 4,
-150,101, 95,249,111,200,100, 50, 4, 6, 6,162, 81,163, 70, 56,113,226, 68,183, 90, 24, 45,175,192,192, 64, 9,199,113, 40, 44,
- 44,196,133, 11, 23, 44,204,204,204, 44,220,221,221,199, 1,248,199, 24, 45, 47, 47,175,224, 3, 7, 14, 88,148,109,253,145, 74,
-165, 40,243, 59, 16,248,251, 35, 90, 85,222, 97,149,162,211,169,244, 52, 77, 70,187,186, 52, 61,116,233,226, 39,165, 77,135, 0,
- 25,173,211,169,244, 0,192,114, 60,242, 84, 12,204,164, 36,226, 82,242,241,240,105, 70, 69, 82,229,134,104,138,204, 60, 33,109,
- 19, 7,158,231,161,211,179,208,230,166, 96,233,105, 21,162, 18, 53,208, 21,102, 67,167, 47,234,134,229,224,224, 64,159, 57,243,
-203,180,208,208,223, 39,254,248,227,143, 84,162,181,117,100, 62,208,162, 34, 77, 91, 91, 31, 75, 78, 34, 57,180,121,203,124, 51,
-158,122,138,152,248, 66,212,119,111, 3, 7, 27, 15,164,100, 20,226,106,228,207,136,126, 28,130,186, 46, 94,152,250,233, 59,178,
-175,151,236, 59, 40,102,188, 61,115,114,158,231, 85,182,159, 37,119, 81, 91,127,141, 1,147,245, 20,108,102, 44,216,252,228, 87,
- 54,176, 80,120,162,101, 87, 55, 40, 60,234, 73, 71, 77, 93, 60, 18, 40,103,180,202,106,166, 18, 4,185,153, 36,137,137, 4, 65,
-160,105,211,102,137,171, 87,175,174, 40, 21,184,190,105,211,102,137, 20, 69,186, 23, 93,216,201, 77, 60,207,165, 86,179,159,229,
- 76,141, 68, 34,157, 81, 20,246,119, 73, 56,125,250,180,126,208,160, 65, 88,181,106,149,100,230,204,153,115, 41,138, 26, 91, 65,
-243, 94, 57,205,254,128,167, 77,189,122, 61,191,185,122,149, 23, 25, 12, 68,214,205,155,121, 57, 74, 37,147,146,159, 47, 57, 28,
- 29,253,222, 71,159,127, 46,241,240,240,192,149,144, 16,251,244,194, 66, 62, 71,171, 85,231,228,228,240, 12,195,220,172, 68,115,
-182, 66,225, 40,223,190,125,187, 95,112,112,240, 93,165, 82, 57, 27, 0, 92, 92, 92,150, 2,104, 4, 32,174,204,107,216,178,229,
- 96,210,184,113,227, 98,210,210,210,102, 87,181,159,101,104,236,168,112,148,239,223,186,251,129,157,165, 25,169,112,119, 37, 69,
- 54, 54, 52, 35, 49, 19,115,128,186,174, 71, 61,115, 0,141, 43,249,236,203,154,132,153,153,217,177,147, 39, 79, 58,138, 68, 34,
-176, 44, 11,133, 66,129,231,207,159, 35, 39, 39, 7,249,249,249,120, 22, 29, 5,111, 15, 15, 44,154, 53,211,101,242,204, 89,199,
- 84, 42, 85,171,151, 42,179, 87, 39, 64, 54,232, 95,137,236, 85, 52,139,193,203,205, 94, 70,150,123, 89,158,199,199,199,195,194,
-194, 2, 1, 1, 1, 22, 87,175, 94,189, 92,133,201, 42, 59, 9,240,224,142, 29, 59, 90,238,219,183, 15,173, 90,181,130,181,181,
- 53, 46, 92,184,128,240,240,112,232,245,122,178,160,160, 0, 22, 22, 22, 88,182,108, 25, 60, 61, 61,145,159,159,143,184,184, 56,
-123,145, 72,228,240, 82, 70,251, 82,205, 11,103, 46,124,157, 27,123,126, 94, 10,241,235, 59,219,247, 31,196,184, 97, 67,224,204,
- 63,189,108, 93,143,248,186,103,159,142, 95,242,148, 71,144,185,101, 83, 91,223,128, 62, 16, 75, 44, 48,121,198, 98,196, 68,156,
-178, 85,229, 63,248,152, 96, 19, 60, 22,174, 62, 60,165,130, 99, 39, 0,144, 30, 30, 30, 31, 29, 62,124,216,178, 52,244, 66, 81,
-165,115, 30,150,157, 4,190,138, 9,223,171, 61,159, 4, 65,224,249,243,231,112,116,116,132,133,133, 69,233, 4,226, 81, 81, 81,
-184,113,227, 6, 74,102,163,168, 68,115,120,104,104,168,135,185,185,121,185, 13,120,158, 71, 70, 70, 6, 24,134,129, 92, 46, 7,
-203,178,208,235,245, 48, 24, 12,208,104, 52, 22,141, 26, 53,154,100, 48, 24,194, 42,210,228, 56,238,179,193,131, 7,119, 12, 11,
- 11,243, 89,191,126, 61,116, 58,221,202,148,148, 20,188,255,254,251,224, 56, 14,221,186,117,107,199,243,252,163,185,115,231, 2,
- 0,166, 77,155,102, 40, 44, 44, 12,174,201,177, 23,211,168,101,203,150, 62,191,253,246, 27, 58,117,234, 4,173, 86,139, 85,171,
- 86, 89,109,217,178,197,106,247,238,221,138, 25, 51,102,252,144,158,158,222,171, 26, 77, 2,192, 74,103,103,231,137, 93,186,116,
- 49, 43,158,195, 20,187,118,237,194,162, 69,139, 14, 0,152,251,203, 47,191, 44, 56,113,226,196,200,143, 62,250, 8,139, 22, 45,
-154,154,147,147,179,163, 50,205,103,207,158, 65,161, 80,192,202,202,170,232, 98,169,215,227,222,189,123, 56,119,238, 28, 26, 54,
-108,104,204, 49, 85,182,159, 94, 3, 6, 12,248, 97,255,254,253,150, 9, 9, 9,184,116,233, 18,188,189,189,161, 82,169,140,153,
- 27, 54,244, 79,168,176, 43,213, 84,171,213,154,248,248,120,139,229,203,151,195,197,197, 5, 94, 94, 94,144,201,100, 32, 8, 2,
- 6,131,161,170,233,213,170,221,207,206,157, 65,103, 36,217,246,181,182,177,253,152,231,121, 58, 55, 55,123,171, 30, 57, 71,158,
- 62,133,238, 47, 60,246,127, 51, 45, 0,220, 69,249, 57, 15,149,165, 70, 43, 36, 36,132, 15, 10, 10, 34, 74,214,110,110,200,203,
-200,176,141,113,116,110,114,208,209,185,113,241,188, 95,100, 52, 69,217,198, 56, 57,169,242, 0, 64,207,240,184, 22,157,131, 7,
- 79, 82, 16,254, 36, 5,230, 82,227,130, 47, 90, 61, 83,212, 99,149,231,161, 41,248,227,166, 85,175,202,134, 86, 95,212,221, 67,
-167, 85, 33, 55, 61,146, 24,212,191,135,108,226,196, 9,112,113,113, 83, 84,166,167,151,202,166, 78,158,246,158,141,157,141, 8,
- 33, 87,127, 69,187,134,253, 33,147,138,144,153,171, 1, 8,224,241,211,115, 0,103,137,136,152,120,180,109, 44, 71,175,158,254,
-255,103,239,186,195,162,184,218,239,153,237,176,187,244, 94, 44, 88, 0,123,239, 40, 98, 67, 99,239, 88, 98,239,216, 27,106,140,
- 37, 42, 26, 77,236,189,196, 96,239,137,216, 80, 84, 44, 88,233,136, 88, 0, 41, 11, 82,150,165,108,223,157,157,249,253, 65, 9,
- 42,101, 65,243,253,190,228,219,243, 60,243,192,236,206,156,125,231,222, 59,115,207,188,247,222,247, 21, 94,190, 16,191, 4,192,
-106,125,236, 37,211,158,131,227,218, 15,108,157, 22,218,156,120, 80,121,201,128,192, 30, 10, 66, 8,113, 70, 50, 94, 63,188,168,
-215, 59, 35, 69, 81,115,172,173,173,243, 86,173, 90,213,189, 97,195,134,154,217,179,103, 71, 38, 39, 39, 47,250,236,109,229,215,
-125,251,246,225,221,187,119,162,141, 27, 55,222,207,201,201,249,161,154, 21,237, 71,211,216, 81, 60, 20,151,115,229,202,149, 54,
- 33, 33, 33, 11,118,236,216, 97, 55,119,238, 92,238,220,185,115, 39, 3,248,169,178,225,194, 2, 30,175,215,198, 7, 15,104, 50,
- 45, 77,117, 98,247,110,238,222,208,208, 85, 26,138,114,180,182,181, 37, 58,119,232, 32,227, 51, 24, 57,226,204, 76,210,166,126,
-125,102,210,237,219, 86,180,177,113,250,141, 27, 55, 10,164, 82,105,133,169,115,152, 76,166,188,188,225,194,242,224,224,224,160,
- 46,111, 14, 87, 37, 29, 98, 1, 69,211, 26,243,122,245,232, 62, 61, 59, 53,124, 23,159,144, 96,100,110,206,116,109,232,226, 30,
-251, 58,233, 57,173,211, 41, 9,130, 40,208,107,172,132,201, 28,189, 99,199,142,230,166,166,166,160, 40, 10,102,102,102,200,206,
-206,134, 90,173, 70, 65, 65, 1,212,133,249, 80,231,231, 35, 58, 57, 9, 93,186,119,199,200,190,125, 26, 7, 92,249,115,180, 78,
-167, 59, 83,233,120, 94,139,214,165,158,172,245,117,173,254, 26, 11, 74,205, 43, 21, 93, 91, 90,187,130, 35, 20,162,247, 34,191,
-175,185,209,195,175, 93,187,118,125,216,176, 97,223, 45, 89,178,132,145,145,145,113, 51, 41, 41,169, 11,128, 87,149,157, 36, 20,
- 10, 27,228,228,228, 64, 42,149,194,204,204, 12, 59,118,236,128,157,157, 29,228,114, 57, 94,188,120, 65, 59, 59, 59, 19,247,239,
-223,135,179,179, 51,196, 98, 49, 52, 26, 13, 20, 10,197, 71,181, 90, 93,225,112,121,241,240, 96,191,133,125,113, 35, 62,236,247,
-174, 78, 68,226,139, 81,139, 61,223,197, 71,191, 78, 9,186,253,248, 39, 82,105,148,154,151,118,103,121,189,118,225,214,115,150,
-174,195,158,173,107, 16,255,236, 65,174, 93,237,130,189,198,132,234,120,101,246,202,100, 50,229,235,215,175, 77, 34, 35, 35, 65,
- 16, 4,204,204,204,192,231,243,203, 21, 91, 53, 0,163,172, 7, 74, 38,147,129,195,225,192,202,202, 10, 71,142, 28, 41,237,120,
- 93, 92, 92, 42,227, 56,216,187,119,239,209,181,107,215, 54, 41,251, 97,187,118,237, 48, 99,198, 12,236,223,191, 31,161,161,161,
-159,228,211,252,248,241, 99,134, 86,171,173,236,186,243, 50, 51, 51,251, 14, 29, 58, 52,236,225,195,135,166, 71,142, 28, 1, 73,
-146,229,110,135, 15, 31,198,211,167, 79, 87, 3,120, 93,195,118,212,104,248,240,225, 15, 78,158, 60,105,158,157,157,141,146,182,
- 33,147,201,160,211,233,224,238,238, 78,144, 36, 89,213,188, 55, 6,147,201,188,178,123,247,238,129,211,166, 77, 3,139,197,130,
- 90,173,198,238,221,187,177,124,249,242,204,226,151, 82, 13,128, 85,199,143, 31,159, 48,104,208, 32,180,108,217,178,241,189,123,
- 21,207,236,144, 74,165,144, 74,165, 96,179,217,176,183,183,199,134, 13, 27,160, 86, 23, 61, 86,220,220,220, 74,111, 99, 0, 7,
-221,220,220, 6,190,121,243,102, 27,138,230,174,125, 1,123,123,251,161, 52, 77, 79,215,233,116,133, 93,187,118,181, 58,125,250,
-180,137, 72, 36, 66, 88, 88, 24, 86,175, 94, 45,161, 40, 74, 71, 81, 20,161, 80, 40, 18,109,109,109,195,120, 60,158,177, 92, 46,
-207, 21,139,197,155, 0,220,252,255,234,201, 9,130, 32,216,108, 54,166, 76,153, 2, 22,139, 5, 99, 99, 99, 40,149, 74,104,181,
-218, 82, 49,143,106, 14, 75, 55,108, 40,180, 98,129, 51,205,194,164,201,130,145,243, 7,216, 56, 56, 58,193,220,148,135,184,184,
- 87, 93,238, 6,223,222,205,101,197, 31,160,212,218, 3,241, 31,242,255,246,100,247,159,107,145,127,168,208,250, 34,231, 33,171,
-252,202, 28,169,163,233,243, 57, 34, 17, 87,195,229,242,223,148,120,185,236,236,228, 5, 4, 49, 82,103,211,116, 48, 72,141,182,
-248, 65, 65, 23,111,122, 10, 45,173, 14,239,226, 99,240, 48,232, 79, 88,203, 69,200, 73,108, 5,112,154, 67,173,200,135, 82,173,
- 41, 22, 37, 58, 68,134, 5,163, 32, 63, 23,205,218, 14, 0, 24,140,167, 21,241,153, 89, 17, 3, 58,183,105,193,124,151, 18,131,
-118,110, 35, 80,223,185, 43,146, 51, 10,144, 39, 85, 65, 82,160, 68,171,102,126,200,150, 40, 80, 32, 87,226,213,187, 0, 56, 57,
-214,103, 16,172,132,158,250, 10, 45,213,171, 75, 80,189,254, 3,156, 58, 93,192,117, 31, 4,102, 29, 15,164, 68,221, 67,228,141,
-237, 72,139,125, 4,154,210,193,193,173,189,190, 55,201,238,155, 55,111,182,239,210,165, 11,171, 87,175, 94, 45,175, 95,191,222,
- 50, 35, 35, 35,178, 88, 96,180,236,213,171, 87, 75, 27, 27, 27,236,220,185, 83, 65, 16,196,238, 26, 86,118,169, 7, 44, 43, 43,
-235, 57,128,141,151, 46, 93,218, 61, 99,198, 12,216,218,218, 54, 79, 79, 79,175,240,196,108, 54,187,229,196, 77,155,104, 54,147,
- 73,159,217,179,135,179,238,230,205, 95,126, 59,126,156,211,195,203,139,160,105, 26, 17, 17, 17,252, 45,123,246,240,199, 14, 30,
-252, 33, 57, 43,139, 12, 9, 13,213,100,164,165, 21,102,201,100,235, 50, 50, 50, 62,254,127,180,108,173, 86,251, 36, 49, 41,209,
-169,109,135, 86, 54,225,113,137,177,222, 61, 58,119,102, 48, 24,140,248,132,228, 80, 27, 27, 83,254,237,160,219, 26,173, 86,251,
- 68, 31, 46, 30,143, 55,160, 71,143, 30, 44,137, 68, 2, 71, 71, 71,100,103,103, 67, 36, 18, 21,121, 28,242, 37,208,228,231, 67,
- 91,144, 7,157, 76,138,196, 23,207,209,170,126, 61,222,121, 30,111,128, 92, 46,175, 84,104,149,188,101,150,151,232,186,228, 51,
-174,137, 9,184, 66, 33,136,234, 15, 27, 14, 54, 55, 55, 95,158,151,151,119, 29,192, 6,141, 70,227,187,124,249,242,118,187,118,
-237,178,222,184,113,163,233,244,233,211,207, 75,165,210, 86, 40, 74,170, 90, 81, 7,246,158, 36, 73, 43, 0,118,193,193,193,176,
-181,181, 69,126,126,126,137,167, 69, 45,151,203,141,196, 98, 49, 84, 42, 21,212,106, 53, 76, 77, 77,241,242,229,203, 92,146, 36,
-175, 86,101,156,105, 3, 98,131, 74, 19,247,131, 85, 99, 65,186,134,180,240,204,202,165, 36,107,127,201, 88, 15,224,151,190,245,
-235, 31,214, 80, 15, 18,223,198, 92,181, 72,122,113, 63, 55,253,173,172,254,145,235,137,149,205,209,162, 1, 80, 4, 65,208,110,
-110,110,200,206,206, 6,147,201, 4,159,207,135, 80, 40,196,138, 21, 43,176,123,247,238,154, 8, 45, 35,129, 64,176,137,193, 96,
-140,102, 48, 24, 54, 58,157, 14,126,126,126, 24, 56,112, 32,184, 92, 46, 52, 26, 77,169, 71,179,196, 75, 85,133,167, 35,226,233,
-211,167,166, 79,159,126,242,216,242,178,182,182,190,171, 82,169,144,144,144,128, 43, 87,174,116, 7, 16, 82,205,186, 78,136,136,
-136,232,235,225,225,241,123,155, 54,109, 26,208, 52,141,230,205,155,195,199,199, 7, 1, 1, 1,136,140,140, 68,126,126, 62,117,
-251,246,237,223, 0,108,171,110, 31, 94, 92,190,238,195,135, 15,127,116,234,212, 41, 11,177, 88, 12,133, 66, 1,153, 76,134,243,
-231,207,163, 75,151, 46,176,182,182,198,201,147, 39, 73,154,166, 43,171,123, 6,131,193, 56,114,224,192,129,129, 83,167, 78,197,
-222,189,123,113,230,204, 25, 12, 26, 52, 8,163, 71,143, 70,118,118,182,221,214,173, 91, 39, 20, 15, 19,174,241,241,241,129, 84,
- 42,197,139, 23, 47,226,244,188,231,145,151,151,135,188,188, 60, 24, 27, 27,151,189,199, 8, 0, 1,219,183,111, 31,179, 96,193,
- 2,212,175, 95,127, 77, 98, 98,226,118,148,179, 74,148,162,168,153, 34,145,200,130,197, 98, 89,145, 36,137,212,212, 84,188,124,
-249, 18,115,230,204,201,205,205,205,157, 1, 32, 25,192,170, 41, 83,166,108, 88,180,104, 81,105, 91, 90,180,104, 81,224,245,235,
-215,251,254,167,189, 57,110,110,230, 77,185, 76,222,124, 73, 33,211, 74, 34,145,148, 62, 59,212,106, 53, 84, 42,213, 39,158, 44,
- 14,135,109,213,174, 85,237,107, 10,121,225,202, 87,111,243, 42, 76,144,222,184,129, 89, 11,190,192,108, 65,151,174, 61,198,245,
-233, 59,132, 73,106,181,184,117,235, 42,142, 30,221, 7, 47, 15, 55,212,111,216, 28,115,231,205, 55, 83,169, 73,191,219,183,111,
- 46, 55,127,250,240,102, 97, 65,222,138,202, 56,255,199,113,173, 88, 92, 93, 43,119,232,176, 60, 5, 89, 28,194, 65, 82,188,107,
-109, 97, 97,177, 71,167,211,121,153,154,154,130,202,123,131, 87, 47,159, 33, 87,194,134, 74,161, 3, 69, 23,137, 45,189,132,139,
- 74,141, 7,183,254,192,142,237,191, 64, 44, 22,195,163, 91,119, 72, 89,181, 80,187, 86,109, 40, 21,242,226,155, 6,208,168,181,
-176,177,171,131,240,240, 72,109,129, 76, 86,225, 3,137, 99,164,105, 92,219,206, 13, 42, 77, 39, 24,113,185,200, 47, 84, 67, 82,
- 44,178, 78, 94, 24, 5,149, 92, 1, 82,173, 1,169,214,194,166,246,112, 52,178,235, 1, 74,119,181,105,181,138,143,210, 65,147,
-244, 0,154,164, 7, 48,238, 52, 15,127,250,143,249,172, 35,213, 47,239,110,118,118,118, 86,108,108,236,213,136,136,136,161,163,
- 70,141,194,189,123,247,166, 3,152, 85, 60,124, 51,125,212,168, 81,136,136,136, 64,108,108,236,213,236,236,236,172,111, 81,243,
- 92, 46, 87,161, 82, 21,245,177,124, 62,223,168,138, 99,157,218, 13, 27,198,200, 15, 15, 47,216,254,248,241,154,195, 71,142,112,
-122,245,236, 73,104, 73, 18,148, 78,135,134,174,174, 68,159, 62,125, 4, 1,231,206, 89, 49,181,218,167, 75,125,125,131,247,143,
- 31, 95,248, 92, 38,211,119,162,121,221,226, 33, 67, 0,168, 91,201,103,122, 67,165, 82,237,154, 57,109, 82,175,144, 7,143,106,
-213,174,229,100,122,235,118, 72, 36,207,152,203,168,239,210,128, 41,201,207,101,173, 95,179,210, 88,165, 82,233, 43, 90, 27, 91,
- 91, 91,227,227,199,143,120,247,238, 29, 84, 42, 21,180, 90, 45, 40,185, 12,106, 73, 30,212,249,185, 32,148, 10,240,116, 58, 40,
-115, 50, 81,183,126, 61,224,175, 21,137, 85, 14, 69,149, 39,180, 74,254, 26,153,154,130, 35, 16,130,193,102,235,157, 28, 29, 64,
-155,246,237,219,159,187,120,241, 34,103,242,228,201, 29,238,220,185,179, 7, 64,178, 72, 36,234,185,122,245,234,231,123,246,236,
-225,205,152, 49,195,125,219,182,109, 19, 0, 28,172,136, 68,169, 84,158,187,118,237,218,216, 58,117,234,216, 69, 71, 71, 67,169,
- 84,130,162, 40,244,235,215, 15, 40,154, 91, 3, 0,136,143,143, 87, 40,149,202,172,152,152,152,130,228,228,100, 13,244, 88, 37,
-184,118, 87,198,147,130,143, 15,134,217,217, 59, 61, 53, 50,174,235, 66, 75,195,135, 46, 28,225,180,117,251, 5,145,242,102, 66,
- 66,225, 15,189,235,109,150, 21, 70,205, 49,119,150,238,189, 25,152,168,207, 68,248,210,213,133, 86, 86, 86, 96,177, 88, 96,179,
-217,224,112, 56, 32, 8, 2,243,230,205,195,161, 67,135,170, 26, 58,252, 68,100,153,152,152,196,174, 91,183,206,121,198,140, 25,
- 28, 35, 35, 35, 72, 36, 18,156, 60,121, 18, 83,166, 76,193,209,163, 71,203,157,255,162,199,144,210,231,222,210, 5,227,199,143,
-135, 90,173,134,143,143, 15, 14, 31, 62,188, 64,167,211,133,212,224,150,126, 26, 25, 25,233, 26, 25, 25,105, 10, 96,208,232,209,
-163,143, 15, 31, 62, 28, 33, 33, 33,184,122,245,106,119, 20, 45,250, 80, 0,240, 7, 96, 91,252,183,178,251, 83, 96,103,103,183,
-143,162,168, 65, 54, 54, 54,145,110,110,110,205, 78,157, 58,101,158,149,149, 85,178,248, 1, 73, 73, 73, 56,118,236, 88,198,145,
- 35, 71, 10,116, 58,157, 21,131,193,184,150,151,151,183,162, 18,193,118,100,251,246,237,147,138,135, 3,113,241,226, 69,250,151,
- 95,126, 33, 86,175, 94, 13,137, 68, 2, 47, 47, 47, 28, 56,112, 96,190, 84, 42,109,249,203, 47,191, 76, 27, 57,114, 36,214,175,
- 95, 15,153, 76,182,189,170,151,149, 74,196, 23, 1,160,243,246,237,219,235, 44, 88,176, 0, 23, 47, 94, 68,155, 54,109,140, 19,
- 19, 19,247, 3,152, 90, 94,253,209, 52,141,196,196, 68,200,229,114, 60,122,244, 8,107,214,172,145,148, 17, 89,243,103,205,154,
-181, 97,254,252,249,216,180,105, 19, 29, 29, 29,157, 53,124,248,112,187, 67,135, 14, 49, 27, 54,108, 56, 95, 46,151,255,199,132,
-150,123, 67,203,205,237,218,116, 93,238,224,212, 16, 39, 79,157, 70,110,110,110,105,153,148,148, 11, 77,211, 40, 44, 44,196,199,
-143, 31, 97,102,106,130,173,219, 54,124, 55,123,250,164, 90, 40, 10,131,241,165,203,178,190,197,182,225,163, 39, 47,246, 25, 59,
- 9,209,145, 97, 8, 56,126, 16, 49,209, 17,165,124,164, 86,131, 55,113, 47,241, 38,238, 37,236,236,235,160, 79,175,238,196,152,
- 49, 99,250,141, 31, 59,218, 6,192,223, 22, 58,226, 31,236,205, 2,190,140,163,117,232, 19,161, 85,133,187,206,218,194,194, 34,
-246,236,217,179, 86, 30, 30, 30, 76,146, 36,113,243,214, 45,204,153,245, 61, 38,140,247,131, 6, 22, 32,213, 28, 80, 28, 35,189,
- 44, 81, 40,228,160, 65, 67, 38,147, 33, 52, 52, 20, 52, 69, 34,224,208, 47,160,105,170, 84,104, 1, 52,212, 26, 13,156,106,187,
- 99,223,225,141, 36,216,236,231,208,150, 31,186,166, 64,204,212,105, 73, 26,162,172, 20,164,100,196,192,204,164, 54, 88,236,218,
- 16,231,201,193, 98,216, 67,171,140,135,174,248, 92,185, 44, 13, 10,205,215,213,159,174, 28,239, 41, 93,141,135,174, 66,161, 56,
-113,226,196,137,239,126,253,245, 87,110,255,254,253,221, 46, 92,184,208, 25, 0,250,247,239,239,102,106,106,138, 19, 39, 78,168,
- 21, 10,197,137,111,232,241,233,209,190,125,123, 72, 36, 18, 36, 37, 37, 69, 86,122,109,106,181,149,208,214,150,153,117,239,158,
- 54, 91, 34,169,213,163, 71, 15, 66, 75,146, 96, 16, 4,114,243,243,145,252,225, 3,204,205,205,137,216,248,120,225,238,185,115,
- 47,187, 53,107,198, 42, 89,145,168, 15,174, 94,189,202, 71,209,188,172, 74, 63,171, 38,100, 89,153, 31, 39,249,250,250, 94, 62,
-113,226,164, 89,102, 86,230, 27, 30,151, 75, 10,133, 70,142,227,199,205,102,229,229,229,141, 5, 32,213,151, 76, 34,145, 32, 49,
- 49, 17,198,198,198,224,176,217,160, 20,114,232,100, 82, 40,115,179,193,212,168,193,213,233, 96,201,231,161,150,157, 29,106,219,
- 88,235,197,249,238,110, 80,233,196,247,178,195,133, 91,219, 55, 6, 87, 32, 4,215, 68,136,217,129,247,139,223, 70, 57,192,234,
-159,244,161,181,118,114,114,250,243,212,169, 83,156,236,236,108, 68, 68, 68, 68, 2,200, 7, 96, 2,128,138,139,139,187, 19, 19,
- 19, 51,160,120,213, 93, 85,171,197,126,185,116,233, 82,111, 15, 15, 15,210,197,197, 69,144,149,149, 85, 75, 34,145, 80, 25, 25,
- 25,159,184,132,130,130,130,120,133,133,133, 50,138,162, 46, 23,139,172, 42,227, 23, 45, 28,225,100, 20, 26,142,121,158,222,117,
-155,155, 90,183, 64, 46, 25,222,252,105,100,198,188,133, 35,156,118,109,191, 32, 82, 26, 19,170,227,132, 46,181, 22,203, 72,169,
-239, 36,102, 26, 40,154, 43, 21, 26, 26,138,228,228,100, 36, 38, 38,126, 34,168,166, 79,159,142,128,128, 0,189, 60, 90, 2,129,
- 96,211,218,181,107,157, 23, 44, 88,192, 41, 35,138,224,235,235,139,252,252,124, 28, 62,124, 24,190,190,190,213,238,248, 63, 67,
-189, 30, 61,122,244,119,112,112,128, 88, 44,134,189,189, 61, 60, 60, 60, 6,134,132,132,184, 0, 72,170, 97,187,159,237,237,237,
-189, 97,221,186,117,208,106,181,152, 50,101, 10,222,190,125,123,238,237,219,183, 59,106,215,174, 61,111,217,178,101,118,118,118,
-118, 24, 53,106,148,128, 36,201, 97, 21,145, 88, 90, 90,250, 31, 60,120,112,108,255,254,253, 25, 26,141,166,219,221,187,119,241,
-225,195, 7,168,213,106,144, 36,137,247,239,223,195,215,215, 55,163,120,117,227,123, 61,236,154,188,106,213,170, 73,243,230,205,
-195,150, 45, 91,176,118,237,218,223,204,204,204,154,181,106,213,170,245,218,181,107,177,116,233, 82,212,169, 83, 7, 86, 86, 86,
-141, 86,175, 94,221,120,209,162, 69,216,181,107, 23,214,172, 89,243, 27,128, 99, 53, 41, 8,138,162,136,205,155, 55,183,220,190,
-125,187, 67,137,200, 98, 48, 24, 56,123,246, 44,194,195,195, 7, 38, 36, 36,148,119,206, 1,123,123,251,233, 14, 14, 14,220,219,
-183,111, 11,235,212,169, 3,146, 36,181,197, 34,107,119,237,218,181,231,188,127,255, 30,253,251,247, 71, 66, 66,194, 9, 0, 19,
-204,204,204,100,139, 22, 45,226, 27, 27, 27,155,201,229,242,255, 84,231, 13, 38,131,152,184,105,253, 82,188, 8,143,199,165, 75,
- 28,188,120,241, 2,118,118,118,224,241,120,160,105, 26, 42,149, 10,217,217,217,208,106, 84,104,222,180, 30,126, 63,178, 25, 89,
- 89,217, 0,131,168,112,202, 13,193, 32,198, 77,250,126, 40, 30, 62,186,133,253,251, 15, 66, 42,149, 85,240,242,109,132,134,110,
-141,225,228,104,139,212,180, 84, 16, 12, 88,255,157,215,250, 15, 31, 58, 44,125, 4, 65,159,240, 14,101, 97,110,110,190,227,204,
-153, 51, 86, 94, 94, 94, 76,153, 76, 6,138,162,208,213,195, 3,243, 22, 44,192,213, 83,167,224,218,193, 7,132, 90, 8,146,175,
-223,170, 7,165, 66,142, 38,173, 59, 99,228,168,209, 72, 73, 78,134,247,128,225, 80, 42,229,165,111, 24, 37, 30, 45,181, 90, 3,
-107,219, 90, 8, 10, 10, 98, 98,202,148, 87,216, 93,190, 83, 66,167,225, 70,189,121,175,236,146,167, 8, 71,232,139, 0,104, 84,
- 26, 52,111,190, 26, 26,202, 10,182,206,211,161,213, 94, 65, 65,246,221,162, 97, 12, 43, 47,164,165,164,128,193,228,196,214,180,
- 4, 41, 89,246, 87, 61,116,243,243,243,243, 19, 19, 19, 47,132,134,134,142, 27, 54,108, 24,130,130,130,166, 1,192,176, 97,195,
- 16, 26, 26,138,196,196,196, 11,249,249,249,249,223,162,182, 29, 28, 28, 6,117,239,222,221,167, 93,187,118, 8, 12, 12, 4, 77,
-211, 15,245,186,177,217,108,154,193, 96,128,162, 40, 16, 0,196,121,121,120,251,246, 45,196, 57, 57,208,106,181,144, 73,165, 84,
- 99, 55, 55, 41, 77, 81, 38,213,177,167,236, 10, 67,148,179,234,176,228,179, 26, 92,106,242,243,167,143, 83, 10,165, 82, 27, 11,
-115,139, 66, 46,151,171,147,228,229,229,191,138,141, 86,235,217, 57,148, 32, 46, 38, 38,166, 89,122,122, 58, 82, 82, 82, 64,202,
- 10,193, 84,169,193, 80,201,209,179,115, 39, 24,131,134, 17, 40,176, 41, 45,216, 76, 54, 10,139, 86,231, 85, 57,220,161, 43,243,
-146, 80, 34,178, 8,130, 40, 26, 46, 20, 8,192, 21,154,124,226,225,210,167, 61,241,120,188, 83,231,207,159,119,112,114,114,194,
-250,245,235,225,236,236,220,200,209,209, 81,110,102,102,102,108,103,103,135, 38, 77,154,160,115,231,206,184,113,227, 6,244, 40,
- 3,146,166,233, 62, 15, 31, 62, 92,252,248,241,227,145, 2,129,128,152, 59,119, 46,171, 95,191,126,224,241,120,144,203,229,144,
- 72, 36, 56,125,250,116, 14, 69, 81, 37,139, 82,172,248,124,254, 49,130, 32,146,100, 50,217,130,207, 9,127,255,181,185, 99, 86,
- 46, 53,133,150,242,135,122,122,215,109,222,195,187, 23,234,185,246, 64, 15,239, 20, 0,216,108,201,250,224,243,243, 42,243,203,
-230, 38,196,177,160,155,183,215,120,120,246, 88,181, 92,122,111,195,150, 67,121, 85,206,167, 35, 8, 2, 20, 69,125, 18, 59,232,
-243,239, 39, 76,152,128,179,103,207, 86, 89,142, 12, 6, 99,244,140, 25, 51, 56,159,121,158, 33, 18,137, 48, 96,192, 0, 12, 27,
- 54,236, 19,161,101,109,109, 13,123,123,123,124,248,240, 1, 0,196,122,182,171,121,147, 39, 79, 38, 20, 10, 5,166, 78,157,138,
-195,135, 15,195,199,199,135, 8, 9, 9,153, 7, 96, 65,117, 27, 59,131,193,216,186,108,217,178,197,190,190,190,200,205,205,197,
-245,235,215,209,175, 95, 63,156, 61,123,214,230,250,245,235,155,188,188,188,192,100, 50, 17, 24, 24, 8,146, 36, 43,141,245,197,
-225,112, 6,245,239,223,159,145,154,154, 10, 14,135,131,182,109,219, 34, 45, 45, 13,114,185, 28, 34,145, 8,243,231,207,255, 40,
- 22,139,187,235,123, 31,113, 56,156, 5,243,230,205,195,153, 51,103,224,231,231,119, 28,192,212,252,252,252,145,143, 31, 63, 62,
- 51,120,240, 96,136, 68, 34, 92,190,124, 25,107,214,172, 33, 38, 76,152,128,189,123,247, 98,254,252,249,191, 21,123,157, 42,106,
-248,133, 89, 89, 89,102, 13, 26, 52, 64,102,102, 38,164, 82, 41, 46, 95,190,108,123,227,198, 13, 23, 39, 39, 39,211,196,196, 68,
-221, 79, 63,253,196, 93,176, 96, 1,118,236,216,129,136,136, 8, 4, 4, 4,160, 71,143, 30,100, 66, 66, 66,185, 94,178,226,144,
- 13,151,105,154,190, 45, 16, 8, 80, 88, 88, 88,114,223, 45,241,243,243,243,245,247, 47,114,178,167,167,167, 99,226,196,137,227,
-131,131,131, 41, 47, 47, 47, 62,135,195,129, 82,169,148,253, 39,123,109, 74, 71, 1,160,224, 82, 75,136, 91, 87,143, 32, 44, 50,
- 1, 97,145, 49,224,242,138, 38,193, 43, 20,114,180,110,222, 16, 29,218,182, 71,122,134, 8, 39, 2,142,192,210,218,169,210,231,
- 8, 77,211,224,176,116,104,236,102,143, 83, 1, 7, 17,120, 61, 24, 1, 39, 78,151,206,121, 99,177,216,104,213,186, 3,218,182,
-245, 64, 66,226,123, 28, 57,178, 31, 54,182,181, 12,131,131, 53, 68,233,208, 97,217,191,159, 41,255, 30, 30, 30, 30, 76,169, 84,
- 10,165, 82,137,143, 31, 63,226,195,135, 15, 48,183, 48, 71, 66,122, 18,186,243, 53,248, 72, 21, 32, 46, 50, 86, 71, 48,217, 17,
- 85,253, 96,127,207, 86,128,103, 43,204,153,236, 83,201, 43, 43, 13,129,169,117,209,208, 13, 73,190,195,174, 93,100, 69, 66,139,
-212,105,239,220,186,125,183,253,228, 9,131,216, 65,119, 15, 67,171,166,160,208,154, 65,166, 84, 67,166, 97,131, 97,214, 15,200,
- 9, 1,147,197, 67,199,150, 13,113,249,210, 13, 13, 77,106,131,245, 46, 32,187,102, 32, 51, 99,202, 8,173,172,207,198, 29, 44,
-245, 30, 58, 44,237,120,117,186,179, 39, 79,158, 28,210,169, 83, 39,190,151,151, 87,131,226,142, 83,115,242,228, 73,121,113, 48,
-204,234,226,147,104,240,246,246,246,173, 57, 28,142, 79,191,126,253, 90, 79,154, 52, 9,175, 94,189,194,137, 19, 39,222, 52,108,
-216,240, 94, 70, 70,197, 43,178,153, 92,174, 88,154,149,101, 46,116,113, 97, 89,152,152,164,223,184,126,189, 78,175,222,189,137,
-148,148, 20,136,197, 98, 40,149, 74, 68, 68, 70,210,108, 38, 51,141, 48, 53,101,196,135,135, 51,152, 92,174,184, 34,111, 99, 57,
-248, 80,197,170, 67,255,154,122,183,106, 57, 88, 52, 88,227, 55,179,158, 82,165,108, 86, 80, 80, 64,178,216,108,182,179,189,121,
-114,252,123,253,159,137, 42,149, 42,240,206,157, 59, 67,122,245,234,197,123, 19, 21, 1, 50, 63, 31,234,124, 9, 56,148, 14,150,
-173, 91,130,169, 81, 1,106, 45,156, 26,211, 80,230,241, 17,242, 44, 94,171, 82,169,170, 12,106, 88, 34,180, 24,159, 9, 3,174,
- 80, 8,158,137, 41,120, 66,225,231,130,161,170, 55, 57,126,159, 62,125,122,118,236,216, 17, 52, 77,227,208,161, 67,208,104, 52,
- 92,141, 70, 3,181, 90, 13,141, 70,131,130,130, 2, 4, 4, 4, 96,223,190,125,143, 1,252,166,199,229,147,198,198,198,131, 9,
-130,176,101,177, 88,114, 27, 27, 27,193,217,179,103, 75,195, 77,180,106,213, 10, 38, 38, 38, 28, 20, 7,133,180,181,181,101, 31,
- 61,122,212,124,224,192,129, 15,202, 29,238,104,222,104,105, 61,210,194,211,200,184,174,139,169,117, 11,212,115,237, 1, 0,232,
- 61, 96, 50,234, 53,172,141,130,156, 40, 23,165,226,195, 80, 14, 75, 98, 17,187, 75,244,202,184,127,179, 73,178,172,251,111, 81,
-254,242,254,114, 59, 10, 6,131, 81,225,112,172, 62, 34,171, 72,179, 48,108, 74,230,249, 0,128, 88, 44, 70, 70, 70, 6,226,226,
-226,224,238,238,142,220,220, 92, 56, 57, 57, 65,173, 86,163, 93,187,118, 80, 40, 20,216,190,125, 59, 30, 61,122,244, 24,192,124,
- 61,126,195,216,213,213,117, 98,235,214,173,113,253,250,117,188,120,241, 66,116,235,214, 45, 39, 15, 15, 15,184,184,184, 76, 74,
- 74, 74, 90, 89, 60,212,167, 47, 4, 30, 30, 30,115,125,125,125, 17, 19, 19,131,153, 51,103,138, 83, 83, 83, 47,159, 59,119,110,
-234,154, 53,107, 24,222,222,222,200,200,200,192,214,173, 91,117,143, 30, 61,218, 6, 96,125, 21,229,248, 58, 53, 53,213, 89,169,
- 84, 34, 55, 55, 23, 36, 73, 66, 46,151,227,198,141, 27, 8, 8, 8,200, 44, 22, 89,239,244, 53,174,101,203,150, 77, 24, 12, 6,
-206,156, 57, 3, 0, 63,160, 40, 98,255,229,161, 67,135,138,126,250,233, 39,167, 21, 43, 86, 96,218,180,105,208,104, 52,216,178,
-101, 11, 86,172, 88,113,173, 88,100, 85,246, 16,253,213,222,222,126,250,204,153, 51, 27, 45, 90,180, 8,161,161,161,182, 47, 95,
-190,108, 27, 17, 17,129, 90,181,106, 65, 44, 22,179,172,172,172,176, 99,199, 14, 44, 92,184,240, 34,128,156, 39, 79,158,140, 78,
- 76, 76,244, 7,176,181, 10,209,126,192,201,201,105, 58, 77,211,180, 92, 46,255,224,231,231,183,117,227,198,141, 88,184,112, 33,
- 98, 99, 99,145,159,159, 15, 19, 19, 19, 98,217,178,101, 19,127,248,225, 7, 76,153, 50,133,150,201,100,251,254,211, 29, 53, 77,
-235, 32,151,196, 64,167,178, 64,171,230,238,104,213,172, 46,110,221, 13, 3, 0,244, 28,238, 1,185,172, 16,199,143, 31,194,187,
-119,111,193, 98,179, 97,110,105,175,143, 39, 16,234,130,215,200,211,100,160,151, 87, 91,244,243,238,142,223,126, 63, 11, 82,171,
-193,212,201, 99, 33,201,203,195,239,191, 31, 65, 66,226,123,176,216,108, 88, 89,255,253,129, 80, 43,211, 34,255,120,161,165,199,
-240, 19, 40,138,130, 72, 36,194,203,151, 47,145,148,148, 4, 62,159, 15, 5,169,163,246,223,121, 68, 17, 4, 39,141,162,233,199,
- 52, 89, 26,165,248, 75, 14,157, 78, 84, 38, 98,173,153,133,133, 5, 87,165, 82,128, 36,181,101,122, 21, 2, 32, 0, 14, 11,112,
-112,172,135,212,148, 84, 90,169, 84,222,175,244, 13, 74,165,220,241,199,229,243,190,157,187,120, 88,247,235,185, 14,151,175,172,
-134,164,160, 0, 74, 13, 27, 50,165, 6,114, 37, 96,110,233,134,118,205, 91, 32, 61, 93,140,168, 23, 33, 82,150, 74,174,207, 68,
-209,183,187, 87, 77,118,157, 60,103, 41,140,235,116,129, 42,238, 50, 40,105,102,169, 71,203, 72,104, 1,203,218,141,145, 39, 83,
-225,124,112, 24, 80,141, 84, 47, 89, 89, 89,114, 38,147,121,210,215,215,119, 75, 88,216, 75,103, 0, 8, 11, 11, 75,203,200,200,
- 88,158,149,149, 85, 93,159,116, 73, 52,120,194,200,200, 56,172, 97,195,134,233,109,219,182, 53, 27, 58,116, 40,172,173,173, 17,
- 17, 17, 1,127,127,255,215, 26,141,102,105, 72, 72, 72,165, 67, 61,106,181, 90, 20,118,229,138,105,247,239,191, 55, 95, 58,112,
-224, 86, 95, 95,223, 29,235,215,175,103,187,186,186, 18, 90,141, 6,209,209,209,244,169,147, 39,181,251, 86,172,216,206, 21, 8,
- 88,207,255,248,131, 77,170, 84,162,255,239, 70,236,228,228,228,233,209,173,107,227,109,191,238,130, 82, 33,197,179,208,107,144,
- 72,178,113,240,208,165,198, 78, 78,180,167, 72, 36, 10,209, 87, 0, 31, 59,118,108,113,135,214,173, 91,215,175, 85, 11,209,201,
- 73,224, 82, 58,112, 72, 18, 76,141, 10, 12, 82,137, 90,205,104, 16, 12, 19,100,124, 44,192,198, 51, 23, 98,244, 17,198,141,190,
- 27,132,245,105,249, 32, 8, 2,191,116,106, 6,174,137, 16, 28,129, 16,179,255,188, 91, 42, 12, 2,215,175, 0, 87, 40, 68,131,
- 14,122, 5,132,151,223,187,119,239,101,116,116,116,187,102,205,154, 97,241,226,197,248,240,225, 3, 40,138, 66,102,102,166, 50,
- 35, 35, 67,148,157,157,253, 1, 69,241,127, 14, 87,209,137,149, 85, 29, 78, 33, 33, 33,165,195, 13,193,193,193,112,116,116,132,
-153,153, 25, 10, 10, 10, 48, 99,198, 12,243, 31,127,252, 17, 0,240,242,229, 75,148, 21, 40,159, 35, 58, 44,110, 91, 94, 33, 45,
-161,165,225, 67,115,201,240,230, 61,188, 83,209,123,192, 36,220, 14,252, 13,119,111,221,129, 37,235, 67, 18, 4,133, 55,114,146,
-114, 10,210,100,174, 7, 26,183,153,202,204,144,221, 58, 48,119,208, 27,166,131, 3,117,126,197,254,130,188,202,108,117,117,117,
-133,157,157, 93,233, 28, 45, 22,139,133, 41, 83,166,128,166,105,125, 69, 86,113, 95, 67,101, 43,149, 74, 59,196,253, 47,128, 0,
- 0, 32, 0, 73, 68, 65, 84, 35, 35, 35,124,252,248, 17,239,223,191, 71, 66, 66, 66,105,232, 0,138,162,180, 75,150, 44, 97,207,
-157, 59, 23,251,247,239,199,253,251,247, 31, 3, 88, 7, 64,223,151,181,177,163, 70,141, 50, 81,171,213, 56,125,250, 52, 9, 96,
-192,249,243,231, 95,182,107,215,142,213,183,111, 95,147,189,123,247,142, 45,174, 35,189,133,150,169,169, 41, 71,163,209, 96,239,
-222,189, 72, 77, 77,245, 4, 16,247,252,249,243, 3,163, 70,141,218,215,172, 89,179,134, 49, 49, 49,111,165, 82,233,108, 0, 81,
- 85,145,101,102,102, 78,110,219,182,237,121,138,162,234,244,234,213, 75,240,235,175,191,154,198,199,199,195,217,217, 25, 20, 69,
- 69,163,154, 41,172,222,190,125, 27,151,145,145,209,184,123,247,238,184,113,227,198,102,157, 78,183, 9,192,150, 89,179,102, 57,
- 37, 39, 39,163,117,235,214,176,180,180, 68,124,124,124, 97, 70, 70,198, 62, 20,165, 36,170,202,133,155, 8, 96,249,129, 3, 7,
- 90, 28, 56,112,192,199,210,210,178, 99, 68, 68, 4, 30, 62,124,136,109,219,182,225,199, 31,127, 68,215,174, 93,177,120,241,226,
- 28, 0, 62, 0,200,196,196, 68,189,226,230,149,120,182, 0,160, 77,155, 54,233,254,254,254,152, 58,117, 42,125,244,232,209,157,
- 39, 79,158, 92, 48,118,236,216,210, 62,112,226,196,137,244,137, 19, 39, 38,162, 40, 13,211,127, 18, 90,141, 70, 13, 83,203,122,
-144,230,165, 32, 59, 53, 20,124, 19,123,120,247,104, 9,185, 66,141,171,127, 92, 68, 84,116, 36, 24, 12, 6,236,236,107,193,220,
-194, 26,111,222,188, 5, 42, 95,109,172,213,104, 52, 48,177,168, 11,105,126, 42,212, 89, 97, 48, 22,218, 98,210,247, 67, 33, 87,
-104,112,233,242, 69,196,196, 68,129,201,100,194,222,161, 22,204,204,139, 56, 9,186,242, 21,204, 6, 0, 40, 39,158, 86,149, 66,
-139,201,100,222,187,121,243,230,136, 14, 29, 58,176,222,189,123,135,119,239,138, 94,110, 36, 18, 9, 73, 64,119, 33, 43,250,143,
- 49,149,156,222, 11,197,171, 51,202,230, 46, 20,154,152,136,226, 95,199,217, 73,114, 51, 17, 25,254, 8,239,222, 68, 35, 41, 33,
- 14, 26,141, 18, 76, 6, 3, 12, 38, 3,117,235, 53,197,163,199,161,106, 37, 73,134, 86,196, 89,100, 71, 66,161,192,214,117,244,
-134,245, 43, 3, 23, 46, 93,107, 60,114,196,126, 68,197,191,130,148,180, 7, 77, 3,246, 86, 2,180,170,191, 12,162,244,108,156,
-249,109,175,156,210,104,198,125, 22, 67,235, 11, 78, 0,176,203, 65,147,125,135,126,155,114, 56,224,212,218,165,115,103,216, 13,
- 30, 54, 14,220,220, 87,208,166,135,161, 94,187,126, 32,120,230,184, 30,116, 23, 33, 47, 95,101, 82, 58,122,173,157, 24, 71,223,
- 84,193, 89, 22,121,121,121, 79, 62,126,204,112, 46, 19, 5,222,153,199, 51,170,106,117,220,231,156,159, 68,156,103, 50, 25,109,
- 54,108,216,160,181,179,179,211,196,196,196, 96,255,254,253, 84, 88, 88, 88, 16,131,193,216,157,145,145,161,172,138,211, 70,171,
-141, 60,229,231,215,164,253,176, 97,244,152,185,115,229,224,241,230,109,253,229, 23,191,108,137,196,145,166, 40,216, 88, 90,166,
-109, 93,177,194,127,196,168, 81,146,216, 71,143,140, 67,175, 92, 49,230,146,100,152, 30,118,126, 11, 84,200, 41, 18,137, 66,238,
-223,127,136,227,135,127,133, 70,163, 66,134, 40, 25, 0,144, 35,206, 71, 21, 34,235,115, 78, 90, 46,151, 15,251,225,199, 31,159,
-254,176,112,129,125,183,158,189,144, 18, 25, 1, 77,110, 54, 8, 45, 9, 54,193,130, 44,139,143,172, 76, 41,150,159, 56,151, 37,
-149,203,135,149,211, 73,148,107,103,137,199,138,103,106, 2,142, 64, 8,174,208,228, 19, 47,150,145,169, 41,184, 2, 33, 88, 92,
-110,121, 19,184,191,224,148, 74,165,195, 71,140, 24, 17,245,252,249,115,139,169, 83,167,162,115,231,206,225, 10,133,194, 11, 64,
- 97, 77,203,147,162, 40, 81,183,110,221, 24, 4, 65, 8,199,141, 27,199,203,206,206, 46,141,172, 46,149, 74,113,227,198, 13,184,
-187, 23,173,234,143,141,141, 69,211,166, 77, 43,228,156,182, 60, 70, 4, 96,253,194, 17, 78, 91,159, 70,102,204, 3,176,185, 94,
-195, 90,184,123,235, 14, 30,222, 13,245,235,216,140,218,245,221,184,118, 63,241,189, 70, 45,109,220,102, 42, 83,104,234,128,223,
- 47, 93,100,198,133, 29,217, 40,151, 71, 55,192,254,203, 75, 42,178,147, 32, 8,208, 52,253, 69, 40, 7, 38,147,137,147, 39, 79,
- 86,247,218,207, 29, 62,124,120,214,204,153, 51, 57, 25, 25, 25,120,253,250, 53,100, 50, 25,140,140,140,112,235,214, 45, 18,192,
-222,147, 39, 79,222, 58,121,242,100, 95, 20,173, 38, 10,174, 78,251, 20, 8, 4,190,222,222,222,120,253,250, 53, 94,188,120,113,
- 17, 64, 84,120,120,248,197,119,239,222,141,238,218,181, 43,126,251,237, 55, 95,133, 66,113,184, 58,156, 20, 69,149,141,153, 84,
-146,241, 33, 82, 42,149,118, 12, 13, 13,173,110,189,103,136,197,226, 46,197,194, 58,213,206,206,206, 52, 50, 50, 18,181,107,215,
-134, 70,163,233, 80,221,182,148,159,159,255,235,238,221,187,143, 78,158, 60, 25, 63,253,244,211,184,115,231,206,141,251,238,187,
-239,208,191,127,127, 28, 59,118, 12, 81, 81, 81,155,161, 95, 90,177,242,174, 61, 10, 64,148,157,157,221,156, 90,181,106, 97,219,
-182,109,136,142,142,246, 95,191,126,253,138,168,168, 40,184,187,187,243,226,226,226,200,154, 60, 67, 0,192,212,212,212, 84,171,
-213,226,202,149, 43,207, 0, 44, 28, 55,110,156,237,142, 29, 59,124,132, 66, 33,114,115,115, 21, 49, 49, 49, 99, 1,252,241,159,
-126,214,209, 4,177,106,234,180,121, 7,166, 77, 29,107,212,182, 77, 43,200, 11,210,160,144,102, 66, 94,248, 17,187, 15, 7,129,
- 32, 24,176,177,113,128,173,189, 51,146,147, 83,240,248,218,117,181, 76,174,216,193,213, 82,155, 43,231,156, 91,196,217,186,136,
- 83, 46,203,130, 66,154, 85,202,105,107,235, 88,204,153,140, 71,161,215,149, 10,153,236, 87, 53, 77,252,252, 55, 95,251, 63, 25,
-213,203,117, 88, 22, 18,137,100,254,140, 25, 51,188,150, 47, 95,110, 69,146, 36,211,210,210, 18,201,201,201,228,133, 11, 23,114,
-165, 82,233,252,154, 88,195, 98,179,163, 92,221,220,189, 6, 15, 30, 76, 14, 26, 52,144, 51,126,114, 95,150,141,173, 45,242,243,
-196,120,243, 58, 2,241,175,194,224,234,222, 18,107,214,111, 7,204,205,171, 76, 36, 89,156, 86,103,192,186, 31,150,156,237,226,
-217,199,212,189,105, 75, 78,171, 6,102,208,104, 73,164,165,165,225,143, 43,145,154,152,151, 15, 11, 40, 82, 61, 90,158,163, 95,
- 10,158, 16,128,132, 24, 7,155,217,106, 78,110,218,186,123,241,222,131,199,151, 46,159, 55, 85,208,213,163, 55,162,239,252,134,
-139,129,103,101, 74,149,122, 43,135,137, 95, 98,196,144,191,169,102, 25, 40,149, 74,205,231,253,169, 82,169,212,124,109, 77, 31,
- 59,118, 12,153,153,153,234, 15, 31, 62,220, 36, 73,242, 92, 37,201,158,191,192,110, 64, 61, 84,165,186,243,131,135, 71,223, 31,
-110,221, 50,154,184,108,153,122,220,248,241, 75,160, 82,105,192,229,210, 44,129,128, 1, 30,143, 29,251,232,145,241,206, 89,179,
- 44, 9,181,250,246,241, 74,194, 6,148,131,111,190,234,176,196,163,213,189,123, 87, 76,156,186, 16,138, 50, 30,173, 39, 47,222,
- 64,165,129,222, 30,173, 98,164,124, 72, 77,237, 56,111,213, 15,151, 70,123,247,108,220,172, 78, 93,158,141, 75, 93, 8,237,237,
- 33,206,206,198,163, 23,241,218,245,103, 47,197, 20,139, 44,189,226,202, 80, 20, 85, 52,201, 29, 64,207,249,203, 65, 48,153, 64,
-113, 24,135,146,149, 67, 46,237, 58,131, 96,177,160,163, 41,168, 84, 42,125, 38,253,165,189,127,255,126,248,184,113,227,130, 3,
- 3, 3, 25,222,222,222,173, 46, 95,190, 76,125, 77,219, 81, 40, 20, 29, 1,192,200,200, 40,201,220,220,220,105,242,228,201,208,
-106,181,144,203,229,200,207,207, 71, 90, 90, 90,222,228,201,147, 53, 0, 96,108,108,204, 29, 49, 98,132,105, 85,156,219, 47,136,
-148, 11, 71, 56,237,178,100,125,240, 41,200,137,114,177,100,125, 72,234,216,140,218,181,253,130, 72,105,234, 40,219,144,243, 33,
-228, 77,134,236,214,129,223, 47, 93,100, 78, 24, 58, 92,231, 44,124,235,103,100, 75, 95,168,138,151, 32,136, 47,130,147,234, 41,
-178, 62, 65, 97, 97,225,138,213,171, 87,247,151, 72, 36,206,125,251,246,229, 52,110,220, 24, 79,159, 62, 69, 96, 96, 32,249,228,
-201,147, 84,153, 76,182, 18,128, 18, 64, 80, 77,202,212,205,205,205,133,197, 98,149, 12,165,237, 41,254,120,207,229,203,151, 71,
- 79,157, 58, 21,117,235,214,109, 18, 23, 23,199, 67, 53,238, 35,154,166, 75, 71, 25,190, 37, 8,130, 72,216,185,115,167,147,189,
-189, 61,113,227,198, 13,146,201,100,214,196,115,115,236,200,145, 35, 29,180, 90,237,180,233,211,167,195,211,211, 19, 36, 73,226,
-196,137, 19, 56,114,228,136,190, 34,171, 82,188,121,243, 38, 44, 53, 53,181,219,146, 37, 75,176,109,219,182, 21, 75,150, 44, 65,
-106,106, 42,222,188,121, 19,241, 53,188, 5, 5, 5,138,148,148, 20,126,167, 78,157,218,198,196,196,196,120,121,121, 53,157, 58,
-117, 42, 54,111,222, 76,223,191,127,127, 4,128, 27,255, 31,189,119,252,187,220, 0,182,142,117,107,253,134, 95,127,108, 80,223,
-101,230,148, 73,163,152,110,174, 77, 33,203, 79,131,149,181, 29,156,107,213, 67,118, 86, 14,110,222,188,161,203,201,201, 59,166,
- 99, 16,235,222,189,203, 77,255, 26, 78, 39,231,122,200,202,202,194,245,235,215,117,121,146,130, 67,208, 50,214,199, 37,231,101,
-194, 0,125, 60, 89,211, 81, 73,148,248,202, 96,109, 97, 97,113,218,212,212, 52,211,212,212, 52,211,194,194,226, 52,160,215,234,
-131, 94,101,158, 14,204, 79,182, 17, 35,140, 96,100,212, 17, 44,214, 34,115, 11,139, 27,102,102,102,226,238,221,187,171, 15, 28,
- 56,160,140,139,139,165, 68,162, 84,218,204,204, 44,191,244,248,242, 56, 63,131,133, 69,125, 19,129, 67,211, 31,205,156, 91, 61,
- 18, 58, 52, 41, 20, 58, 52, 41, 52,115,110,249, 88,224,208,100,173,133, 69,125, 19,189,236,172, 0,245,108, 97,227,106,141,189,
-238, 54,132,194,213, 26,123,235,217,194, 70,239,107,175,124,216, 79, 71, 16,208,161,104, 25, 54,106,192, 89,194, 65, 49,153,204,
-227,206,206,206, 14,168, 94,192,186, 47, 56,199, 3,117,199,243,120,211,206,251,249, 77, 76,186,127,127, 92, 65, 98,226,152,252,
-132,132, 81, 17,103,207,142,222, 51,122,244,248, 49, 60,222,244, 17, 64,125,125, 57, 29, 28, 28,252,195,194,194, 2,245,221,202,
- 8, 47,189,203,179,126, 61,167, 91,222,189, 58,208,190, 51,134,209,190, 51,134,209,222,189, 58,208,245,235, 57,221,250,138, 58,
- 34,152, 76,166, 15,159,207, 63, 45,224,243,163, 5,124,126, 52,159,207, 63,205,100, 50,125, 80,249, 28,170, 79, 56,173,172,172,
- 94,218,217,217,101, 86,103,179,182,182, 14,175,134,157, 99, 92, 92, 92, 82, 25, 12,198,246,106,222,211,149,113,186, 26, 27, 27,
- 39, 8, 4,130,180,178,155,177,177,113,217,192, 80, 86,124, 62,255,170, 64, 32,216,161, 15,231,207,171,154,254,248, 56,104, 78,
-212,207,171,154,254,248,249,119,115,135, 88, 76,126, 26,188, 78, 60,119,136,197,100,125,236,180,181,181,189,111,107,107,155, 97,
-107,107,155, 97,103,103, 87,233,102,109,109,253, 82, 15, 78, 35, 19, 19,147, 29, 38, 38, 38,153, 2,129, 64, 39, 20, 10, 51, 5,
- 2,193,118,148, 9,109, 81,211,242,100, 48, 24,155,155, 52,105,162,100, 50,153, 71, 63,251,106, 91,131, 6, 13,148, 44, 22,107,
-107, 53, 57, 77,187,118,237,170,139,140,140,164, 61, 61, 61,105, 0, 22,223,176,222,237, 45, 44, 44,110,152,154,154,166,152,152,
-152,236, 6, 32,168, 33, 39, 1,192,199,201,201, 41,162, 71,143, 30,114, 39, 39,167, 80, 0,131,191,161,157,253,135, 12, 25, 66,
-165,164,164,208, 52, 77,211, 41, 41, 41,244,144, 33, 67, 40, 20, 5,138,252,154,103,242,170, 89,179,102,209, 79,158, 60,161,159,
- 60,121, 66,135,134,134,210,253,251,247,167, 0,124,255,149,207,121,124,171,107,111, 92,207,186,126,163,134, 22,231,198, 14,247,
-160,130,254,216, 78,175, 89, 57,147,238,237,217,148,118,111, 96,113,201,213,213,202,245, 91,112,254,184,114, 6,221,171, 91, 19,
-170,113,125,139,179,141,235, 89,215,255, 15, 95,251,191,209,171,133,191,123,194,217, 95,174,197, 79,197, 82,249,112,116,116,132,
- 88,220,193,136,197,242,224,241,120, 94, 12, 38,243, 94,110,118,246,130,226,215, 45,221,127,202, 85, 91,105,135, 94, 31,220, 74,
- 82, 18,212,132,243,147,137,236, 53,228,172, 14,135, 94,156, 21, 37,149,166, 84,170,116, 43,146,124,185, 27,149,150,193, 39,156,
- 78, 78, 78,211, 40,138,114,209,215, 32, 6,131,145, 36, 18,137, 14,215,164, 60, 27, 54,108, 72, 23, 15,111, 19,223,178,222,255,
-142,182,244,191,196,249,251,175,205, 29,221,155, 55, 90, 26, 29, 22,183,173,120, 88,177, 20,107,231, 90,152,120,244,232,190,250,
-209,221,251, 63,173,221, 45, 41,252,127,190,118, 6,244,156,211,246, 13, 56, 75,130,132, 86,139,147,205,102, 31,104,223,190,253,
-180,167, 79,159, 30,213,233,116,211,255, 71,219,103,127, 38,147,185,196,205,205,173,213,155, 55,111, 34,116, 58,221, 54,148, 19,
- 40,178, 6,118,174,116,113,113,153,205,225,112,120, 82,169, 84,146,158,158,190, 26,192,185,255,182,242,108,220,208,178, 45, 77,
-151, 6,221,222,248,250,125,238,243,111,198, 73, 83, 58,138,102,110,120,147, 40, 14,255,127,168,247,127,155,200, 58,244,159,248,
-225, 94, 6, 78, 3,167,129,211,192,105,224,252,230,156,198,134,242, 52,112,254, 11, 57,255,149, 96, 25,138,192, 0, 3, 12, 48,
-224, 31, 7,133,161, 8, 12, 48,224,191, 14,101,189, 90,165,222, 44,162, 18, 85, 90, 29,151, 96, 77,148,237, 29, 3,167,129,211,
-192,105,224, 52,112, 26, 56, 13,156,255,115,156,255, 86,145,117,168,146,253,191, 13, 6,183,170,129,211,192,105,224, 52,112, 26,
- 56, 13,156, 6,206,255, 5,161, 85,238,190, 97,232,208,128,191, 29,187,134,194, 9, 0,230, 93,134,232,239, 56,222, 0, 3, 12,
- 48,192, 0, 3,254,159,113, 8, 21, 12, 29,254, 55, 8, 45, 71, 0, 29, 81,148,248, 54, 30,192, 67, 0,146,175,224,179, 6, 48,
-138, 32,136,145, 0, 64,211,244,121, 20,173, 26,201,209,231,100, 35, 35,163, 76,165, 82,105, 91,252,127,150, 82,169, 44,155,203,
-128,192,151,171,217,232, 50, 91,185,112,113,113,201, 84,169, 84,182,122,252,124, 62, 77,211, 81, 12, 6, 35, 90, 40, 20,222,125,
-243,230, 77, 96,117, 46,220,203,203,107, 34,147,201,220, 8, 0, 58,157,110,213,189,123,247,142,255,141,245,214,161,150,163,253,
-111, 26,173,134,204,204,206, 93,141, 47, 3,249, 1, 0,246, 14,128, 63, 65, 98,105,241,255, 91,231, 4, 86, 30, 71,167,186,199,
- 87,130,182,108, 54,219,215,206,206,174, 95, 90, 90,218, 75, 0,203,128,170,163, 26,215,170, 85,235,123, 22,139, 53, 78,167,211,
-213,103, 50,153, 9, 36, 73,158, 76, 77, 77, 13, 48, 60, 67, 12, 48,192, 0, 3, 12,208, 67,108,125,129,106, 9, 45,119, 43,216,
-211,128, 15, 8,244, 6,141,219, 4,112, 38, 94,140,143,250,158,255,157, 59,180, 90,178,232, 55, 57, 12,232,110,188,103, 28,234,
-215,175,159,243,220,185,115,209,185,115,103, 60,125,250,180,211,177, 99,199, 38,159, 59,119, 46,138,162,168,123, 0,158, 2,122,
-133, 82, 16,160, 40, 78,203,216,126,253,250,245,218,184,113, 35,179,105,211,166, 80, 40, 20,184,127,255,190,199,214,173, 91,119,
- 60,126,252,248, 14,128, 83,197,130,160,194, 4,120, 74,165,210,182, 36, 25, 39, 65, 16,182, 35, 70,140,120, 94, 86, 92, 21,231,
- 87, 35,104,154,126, 66, 16, 68,168, 78,167,123,122,225,194,133, 84,119,160,195, 12, 23,206,133, 5, 73, 26,231,207, 57, 85, 42,
-149,237,149,159, 55,129,197,227, 65, 85, 88,128, 78,147,254, 18,189,183,127, 92, 10,130, 34,193, 4, 45,241,218,176, 35, 10, 64,
-116,122,122,122,148,167,167,103, 82,117,107,152,201,100,110,188,121,243,166, 3, 77,211,240,246,246,222, 8,224,239, 18, 90,188,
-142,109, 91,222,187,122,241,180,145, 52, 55, 19,125, 7,143, 62,249, 54, 53,107, 34,128,139,159,136,166,126,176, 35, 8, 44,157,
-181,233, 20, 19, 0,246,173, 28,187,108,123, 31,236, 90, 24,132,143, 0,188,138,197, 15, 0,252, 12,224,222,222,126,176, 3,176,
-124,214,166, 83, 4, 0,236, 95, 57,118,233,222,126,216, 57,231, 70,181,195, 86,204,158, 56,113,226,174,141, 27, 55, 50, 29, 28,
- 28, 32, 18,137,250, 54,105,210,196,173,160,160,160, 9, 42,153, 68, 92,183,110,221,179, 93,123, 12,172, 55,108,164, 15,223,198,
-218, 2,233, 25, 57,166,103, 79, 31,157,193,124,114,191,223,135, 15, 31, 70, 27,158, 33, 6, 24, 96,128, 1, 6, 84,128,154, 71,
-134,111,237, 0, 99,153, 6, 67, 88, 76,226,251, 46,109,155,244, 28,243, 93, 87, 70,147,198, 13,241, 42, 54,174,207, 31,119,159,
-109,101,132,198, 6,147, 58, 58, 64,192,193,149,240,140,202, 87,194,104, 73,176,130,174,156, 42,234, 9, 39,143,101, 62,127,254,
-188, 97,155, 54,109, 74, 83,195,244,236,217, 19, 61,123,246, 36,246,237,219,215, 50, 40, 40,168,229,145, 35, 71, 52,193,193,193,
-191,161,242,248, 40,190, 13, 26, 52,216,186,107,215, 46,158,167,167, 39,120, 60, 94,233, 23, 66,161, 16, 3, 7, 14,196,192,129,
- 3,153,233,233,233,222, 87,175, 94,245,254,249,231,159,213,201,201,201, 75,240, 87,148,230, 74,177,122,245,234,182,229,124,124,
-147, 32,136,247, 36, 73, 70,180,108,217, 50,213, 13,104, 56,227,187,206,183,103,119,113, 21, 44, 88,113,172, 92, 30, 22,151,139,
-223, 39, 22,245,213,101,133, 86,210,221, 27, 16,154,154,136,249, 38, 38, 81, 0,162, 1, 68,209, 52, 29,157,144,144, 16,215, 8,
-104,217,209,130,241,219, 81, 9,213,162, 26, 98, 11,169,169,169, 48, 51, 51, 51,246,244,244,204, 32, 8, 98,237,253,251,247,191,
-245,132,188, 14,107,151,206,230, 72, 62, 68,225,227,235, 39, 88, 52,210,131,191, 96,247,159, 63, 41,213,218,139,149,157, 68, 16,
- 12,198,207,161,148, 31,138,146,241,174, 22,139,197,158, 0, 96,101,101,197, 5,112,111,251, 51,124,183,176, 11,241, 53,177,221,
- 56, 76, 38,115,239,177, 99,199,166,126,255,253,247, 69,169, 35, 30, 61,130, 80, 40,196,250,245,235,235, 46, 94,188,216,159, 36,
-201,249, 21,121,178,186,246, 24, 88,111,231,182,159,154, 20,230,230,171, 14,238, 61,247,194,177,153, 59, 99,150,239, 98,147,157,
- 26,149,189, 78,167,251,222,224,217, 50,192, 0, 3, 12, 48,160, 58,222,172, 42,133,150,155, 53,142,183,110,230, 58,106, 76,127,
- 15, 94,243,102, 77,193,225,253, 21,186,165, 77,219,182,104,211,182, 45,195, 79, 90,216,251,249,139,176,222, 23,130,158,170,228,
-218,228,115,111,114, 48, 81, 95,171, 74,146,210,110, 28,108,215, 67,150,151,101, 4, 0, 2,115, 91,229,202, 43, 31,239,118,233,
-210, 5,206,206,206,156,224,224,224, 41, 85, 8,173,149,241,241,241, 60, 38,179,242,120,168,142,142,142, 24, 49, 98, 4,220,221,
-221,185,221,187,119, 95, 89,145,208, 50, 50, 50,202, 34, 8,194, 22, 0, 44, 45, 45,117,107,215,174,141,160,139, 0, 0, 52, 77,
-211, 79, 24, 12,198, 83,138,162,158,253,249,231,159,105, 77, 0,219,190,109,220, 31,206, 30, 63,130, 79, 95,216, 81,161, 72, 80,
- 22, 20,148,251, 57, 95, 40,200, 54, 22, 8,162,120,124,163,104, 20,229,242,138,118,118,118,142,107, 2, 56,183,119,119, 9,218,
-183,112,172,201,209,233, 63, 85, 89,150,173, 91,183,118,107,209,162,133,145, 78,167,131, 76, 38,195,254,253,251,205,140,141,141,
-205,250,245,235,183,166,108, 3,104, 12, 52, 31,238,200,156,190, 46, 93, 55,167, 6, 13,201,188,107,167,182, 31, 70, 12,236,103,
-218,182, 99, 87,188,189,119, 2,185,185,133,200,207,147,130,162,168, 47,226,250,204,185,129,204,189, 3,176,117,223,138,177,203,
- 9, 6,131,104, 57,116, 25, 6,217,231,207, 59,112,224, 64, 44, 0, 54,151,203, 45,219, 14, 29,141,157,154,109,109,216,167, 43,
-246,175, 26, 15,154,162,104, 0, 91,171,225,205,178, 53, 49, 49,249, 35, 40, 40,168, 67,187,118,237,240,244,233, 83, 36, 38, 38,
- 98,246,236,217,234, 57,115,230,112, 38, 76,152, 64, 44, 90,180,104,238,207, 63,255,124, 1,192,227, 47,110, 4, 22,107,220,224,
- 97,163,185,210,188, 2,165, 90,165, 81, 91, 90,155, 83, 42,153, 82,158, 35, 41, 80,142, 30, 59, 77, 29, 27,254,108, 28,128, 47,
-132,214, 87,150,167, 1, 6, 24, 96,128, 1,122,128,166,233,118, 0,108, 0,100, 19, 4,241,162,236,126,241, 33, 37,217, 90, 62,
-223,207, 65,209,168,148, 85, 25,186, 28, 20, 77,247,177, 1,160, 3,240,156, 32, 8,201, 87,154, 88,249, 42,195,192,192, 64,186,
-236,223, 50, 66,139,166,105,154,214,138,223,211,170, 55, 55,104,249,139,195, 95,108,138,216,139,116,198,243,115,244,179, 83, 63,
-210,110,214,149,103, 97,255,206, 29,218,177, 45, 64,207,106, 7,122,126,119,115,229,243,231,207,131, 41,138, 10,244,235, 10,154,
-126,117,138,166, 95,157,162, 23,118, 2,125,225,194,133,155,254,254,254,129, 1, 1, 1,129, 0,170,154,167,148, 89,248, 34,148,
-126,102, 11,186, 34,196,199,199,211, 7, 14, 28,160, 87,172, 88, 65, 31, 61,122,148, 70, 21, 17,212,189,189,189,239,199,196,196,
-208, 19, 38, 76,136, 64, 37,129, 1, 27, 3,130,113,117,237, 95,171,206,238,208,168,191,111, 78, 75,186, 25,149,123,253, 14, 14,
- 14,159,216,179,217,213,158,222,211,222,149, 62,222,187,205, 71,154,166,111,210, 52,189,153,166,233,209, 52, 77,187, 3, 64,107,
-192,116,176,131,213, 59,229,185,157, 10,245,244,142, 85,230,189,107,221,186,181,219,146, 37, 75,114,213,106, 53,157,148,148, 68,
- 31, 60,120,144,190,125,251, 54,125,229,202, 21,218,195,195, 35,189,140,189,118,147,221,235,100,170,143,172, 83,213,164, 21,177,
-153,204, 61, 47,110, 95,160,223, 61, 60, 79, 63, 63,227, 79,159,252, 97, 12, 61,119,112, 7,141,169, 49, 79, 9,160, 71, 69,231,
-205,233,130,134,238,117,109,222, 36, 39, 39,211, 26,141,134,158, 52,105, 18,237,237,237, 77,247,233,211,135,238,213,171, 23,221,
-179,103, 79,186, 71,143, 30,244,221,187,119,233,244,244,116,186, 87,215, 54,178, 1,141,209,182, 26,166, 53,171, 83,167,206,199,
-164,164, 36, 90,163,209,208,193,193,193,244,137, 19, 39,232,224,224, 96,218,207,207,143, 6,112,124,214,172, 89, 10,137, 68, 66,
-123,123,123,167,161,156,168,241,117,234,212,137,139,121,147,154,186,125,211,225,187,191,239, 57,125,247,210,133,219,119,255,184,
-245,252,218,149, 91, 47,206, 61,139, 76,184, 82,167, 78,157,184,114,234,255,171,202,211, 0, 3, 12, 48,192,128,170,181, 72,177,
-208,234, 95,236,236,232, 79,211,116,175,207,246,251, 23, 11,167, 47,246,253,252,252, 86,148,221, 47, 57,198,207,207,111, 5, 0,
-186, 83,167, 78,167,105,154,110,248, 13,204,159, 94,206, 86,181, 71,171, 4,100,218,115,112, 92,251,129,173,211, 66,155, 19, 15,
- 42, 47, 25, 16,216, 67, 65, 8, 33,206, 72,198,235,135, 23, 43, 79, 36, 81,140,235,241, 96, 3, 8,142,139,139,195,235,215,175,
-145,154,154, 10, 62,159,255,197,113,143, 30, 61,130,177,177, 49, 28, 28, 28,244, 83,186,234, 79,251,185,168, 54,117, 32,236,228,
-137,156, 49, 51, 17, 28, 28,140,172,172, 44,112, 56, 28,112,185, 92,144, 36, 89, 37, 31,131, 81,148,241,183,196,139, 85,222, 49,
-158, 0,139,103, 41,188,186,111,205,124, 23,198,147, 64,182, 34,229, 29,210,149, 58,253, 60,121, 66, 1,248, 2,126,134,177, 49,
-191,116,184, 16, 64, 52, 65, 16,111, 91, 3,108,129,208,232,234,111, 27, 22,217, 51,195,131,141, 20,239,162,202,229,232,213,171,
-215, 12, 0,107,104,154,206,107,209,162,133,221,198,141, 27, 45, 68, 34, 17, 94,189,122,133,115,231,206,101,147, 69, 23, 74,208,
- 52,189, 14, 0, 58, 2, 70,230, 54,230,183,246,252, 56,223, 4,247,206,114,107,210,138,204, 26, 15,188, 54,124,194,172, 57,187,
-230, 15,132,172, 80,129, 83,183,195,113, 51,236,253, 32, 0,143, 80,201,188,183,189,143,241, 14,200,238, 57,108,216,176,136, 7,
- 15, 30, 88, 31, 57,114, 4, 36, 73,150,187, 29, 57,114, 4,119, 30,134,205, 3,240, 82, 79,179, 28, 93, 92, 92,238, 60,123,246,
-204,134,207,231,227,246,237,219,200,203,203, 43,245,100, 77,156, 56,145,200,203,203,243,217,191,127,255,240, 15, 31, 62,108,123,
-248,240,161, 24, 69,185, 32, 63,105, 8, 76, 38,243, 61, 73,106, 26, 57, 52,110,200, 26, 57,176,107, 87,169, 56, 10, 66,171, 22,
-120, 18,249,254,106,158, 68,172, 96, 50,153,239,203, 30,255, 45,202,211, 0, 3, 12, 48,192,128,234,129, 32,136, 64,154,166, 7,
- 16, 4, 17,248,249,103,159,255, 95,114,156,191,191,127,233,126,201, 57,155, 55,111,222, 84,102, 95,254,141,204,171,116, 50,124,
-247, 98, 5,217,189,188,131, 84,175, 46, 65,245,250, 15,112,234,116, 1,215,125, 16,152,117, 60,144, 18,117, 15,145, 55,182, 35,
- 45,246, 17,104, 74, 7, 7,183,246,250, 26,162,108,212,168, 17,148,202,162,169, 89, 42,149, 10, 28,129,133,114,209,244,177, 70,
- 0, 64,177,140, 84,101, 20,172, 94,132, 38, 93,188,208, 62,147,198,115,187, 34, 71, 69,251,204,162,243, 54, 76,154, 4, 14,135,
- 3, 14,135, 3,162,120,234,143, 62, 66,139, 40, 62,152, 42, 26,190, 42,207, 8, 66,206, 99,159, 58,179,198,183, 61,239, 67, 52,
- 87, 21,243, 4,233, 42,138,190,154,169,187,166,143,189,124, 1, 95,100,204,231, 71, 27, 11, 5,165, 66,139, 32,136,247, 0, 64,
-179,217, 1, 39,214,249,182, 16,100, 38, 8,148, 47,130,145,161,164, 52, 21,208,172,187,113,227,134, 45,139,197,178,215,233,116,
- 72, 73, 73, 65,108,108, 44,118,238,220,153, 89, 88, 88,216, 61, 60, 60,252, 77, 89,237,168, 51,230,158, 11, 88, 63,191, 30, 43,
- 42,196, 72,245, 62,166,218,173,199,186,217, 16,239, 65,221, 91, 94,155, 49,126, 21,134,124,215, 7, 19,186, 55,161,147,210,115,
-149, 0,110, 23,187, 94,171,130, 40, 60, 60,188,119,183,110,221, 78,182,106,213,170, 49, 77,211,104,222,188, 57,124,124,124, 16,
- 16, 16,128,200,200, 72, 20, 20, 20,104,130,130,130,118, 0, 56,166,167, 89,124, 11, 11,139,155,119,239,222,181,225,243,249, 8,
- 10, 10,130, 66,161,128,131,131, 3,230,204,153,195,221,188,121,243,239, 5, 5, 5, 35,253,253,253,141,146,146,146,246,220,186,
-117,171, 46,138,242,206,125,209, 8,212,106,245,161, 83, 1,199,119,205,241,157,235,116,247,233,171, 96,149,180,208,172, 78,157,
-212, 2, 27, 11,161,201,142, 45,235,106,171,213,234, 25,229,151,231,253, 26,149,167, 1, 6, 24, 96,128, 1, 95,160, 82, 45, 82,
- 86, 60,125, 46,182,170, 35,210, 0, 40,252,252,252, 86, 18, 4, 17,232,231,231,183,210,223,223, 95, 1, 32,253,239, 16, 89,165,
- 66,107,192,128, 1, 33,129,129,129, 24, 48, 96, 64, 72,133, 20,148, 14,154,164, 7,208, 36, 61,128,113,167,121,248,211,127,204,
-103, 23, 79,213,216,186,129,235,111,223, 85,169, 84,172,227,199,143,151,206,219, 2, 0,157, 78,247,205,107,177, 58, 66,171, 88,
-232,125, 97,132, 11, 79, 24,114,104,225,200,142, 86, 58, 57, 91,253,232, 42, 68, 42,138,220,246, 78, 35,127,145, 71,255, 92, 17,
-231,149, 5, 51,144,250,240, 14,248, 66, 97,234,212, 7,209,165, 94,172, 98,145,149, 8, 0,117,121, 38,193, 7,230, 15,241,176,
-231,128,163,190,118, 30,233, 42, 74,117,224,131,246, 88, 5,141, 13, 52, 77, 35, 49, 49, 17,114,185, 28,161,161,161,184,120,241,
- 98,118, 57, 34, 11, 46, 60,225,253,163,203,198,117, 48, 45,252,200, 81,191,184,131,116, 21,165,215, 80,151,117,243, 33, 93, 56,
- 12, 34,136, 96, 48,141,123,118,116,195,130,105, 67,177,253,232,159,164,218,182,235,128, 93,127, 92, 31, 37, 85,105, 86,234, 41,
-178, 74,157,141,225,225,225, 77,194,195,195,121, 0,188,124,124,124,174, 15, 31, 62, 28, 33, 33, 33,184,122,245,170, 43,128,140,
-226,227,214,163, 40, 81,246,207, 0, 18, 42,114, 60,114, 56,156, 51,119,238,220,105,234,232,232,136, 59,119,238, 64,161, 80, 96,
-214,172, 89,106, 95, 95, 95,206,196,137, 19,137,252,252,252, 82, 79, 86,104,104,168,184, 34,145, 5, 0, 34,145,232,198,197,115,
- 39, 58,119,235,214,109,104, 61, 87,119,211,132,194,130, 44, 62,223,200,248, 97,200, 61,206,139,103,143,247,136, 68,162,231,229,
-151,103,176,222,229,105,128, 1, 6, 24, 96, 64,197,208, 75,139,124,230,153,170, 14,202,156,199,246,247,247,143,245,247,247,255,
-196,227,245,149,248,124,213,225,181,146, 62,173, 70,113,180,116,249, 41, 95, 94, 0, 69, 85,231, 98,191,248,204,194,194,130, 52,
- 54, 54,254, 68,104, 81,122,114,230, 94, 62,141,132,217, 99, 75, 61, 89, 37,158, 45,244,157,248, 85, 66,139,162,168, 80, 0,159,
- 24,193,183,117, 27,179, 99, 96,227, 46, 77,234, 57, 49,180,231,118, 34, 77, 78, 42,215,196,107,148,175, 11,233, 65,113,229, 76,
-178, 46,229, 36,181, 48, 18, 24, 39, 27, 11, 5,159,139,172, 15, 0, 32,176,115, 29,190,173,159,123,247,150,238, 13, 24,228,217,
- 95, 33,146,107,165,126,113, 26, 77,130,140,190, 84, 65, 25,174,233,211,167,207, 26, 43, 43, 43,163, 93,187,118,153,213,169, 83,
- 7, 36, 73,170, 63, 23, 89,124, 91,183, 49, 59,135, 52,235,226,102,111,193,208, 94,216,141, 84,133, 78,190, 51, 65,251,187, 62,
- 34,203,218, 76,120,235,192,166,217,198,124, 30, 27, 74,165, 18,155,247, 93, 64,208,227,152, 1, 57, 49, 87,110, 1,184,245, 21,
- 13,114,234,128, 1, 3,182,175, 95,191, 30, 90,173, 22, 83,166, 76,193,251,247,239,131,226,227,227,119,214,174, 93,123,201,178,
-101,203, 28,237,237,237, 49,106,212, 40,142, 86,171,157, 88, 1,199,150, 83,167, 78, 13,104,217,178, 37, 66, 66, 66,144,151,151,
- 7, 7, 7, 7,248,250,250,114,253,253,253,127, 47, 40, 40, 24,185,105,211, 38,163,196,196,196, 74, 61, 89,159,180,107,157,110,
-195,193,237,179,151,180,235,232,193,120,247,238, 13,153,210,222,147,113,239,206,213, 7, 86, 86, 86,191,167,164,164,252, 85,158,
- 67,155, 87,187, 60, 13, 48,192, 0, 3, 12,248, 54, 32, 8,226, 90,241,188,171, 79,188, 92,159,139,176, 18,143, 85,217,253,207,
-143, 47,254,254, 91,188, 44, 31, 42, 71,120,125, 26,222, 97,192,128, 1,122, 47,171,167,100,217,122,137,167,207,241,157, 59,180,
- 78, 66,176, 86,122, 50,192, 17, 88, 40, 7,174,191,125,183,162, 99, 5, 2,129,222, 30, 45, 74,165,172,170, 82,170, 37,180,138,
-231,104,221,164,105,250, 19,161,101,102,231,230,185,124,217,252, 29, 30,195,251, 50, 50,167,117, 66,158, 84,165, 90,246,138,164,
-210,228,149,139,172,162, 94, 92,155,196, 23, 8,163,141, 4,252,178, 34, 43, 5, 0,140,108, 27,180, 95,186, 96,206,190, 30, 99,
- 6, 18,217,179, 60, 32,201, 83,168,150,196,146,132, 72, 65,143,140, 3,238,149, 71,119,247,238,221,131, 0, 14,122,122,122,102,
- 10, 4, 2, 72,165,210, 47,234,160,196,222, 46,195,251, 50, 50,167,118, 64,174, 76,163, 90, 22, 75, 34, 93, 65,157,169, 74,100,
-217,152,155,220, 58,176,113, 54, 63, 61,237, 3, 56, 28, 14,132, 66, 33,110, 63,138, 70, 78,236, 31, 95, 35,176,192, 96, 48,214,
-250,249,249,173,153, 51,103, 14,196, 98, 49,174, 94,189,138,239,190,251, 14,167, 79,159,174,115,253,250,245,237, 94, 94, 94, 96,
- 50,153, 8, 12, 12,132, 86,171,125, 91, 1,205,208,233,211,167, 47, 25, 62,124, 56,158, 63,127,142,140,140,140, 79, 60, 89,121,
-121,121, 62,251,246,237, 27,158,148,148, 84,165, 39,235, 51,180,119,105,208,154,179, 98,245, 47, 80,201,179, 88,217,162,167, 33,
-193,183, 25, 79,114,115,115,249, 0,242,107, 90,158, 6, 24, 96,128, 1, 6,232,237,213,170, 72,139,100, 23,139,168,236,242,246,
-203, 8,172,242,246,137,207,188, 96,234,207,190,143,252, 59,175, 73, 47,143, 22,203,174, 25,200,204,152, 50, 66, 43,235,147,239,
-141, 76, 44,245, 26, 58,212,146, 96, 29, 56, 86, 26, 71,203, 72, 44, 22, 27, 89, 91, 91, 43,203, 10, 4, 62,159, 15, 71, 71, 71,
- 72, 36, 18, 28, 58,116, 8,168,122, 82, 52,105, 58,124, 60,218,143,153,130, 23,206, 92,208, 90, 77,169,103,235,192,164, 73,159,
-136, 45, 14,135, 83, 50, 55,172,170, 78,247, 89,177,167,233, 9, 0,186,181,107,189,159,140, 4,130, 73, 70,214,181,172, 23,204,
-158,202, 78,202, 82,225,174,199,138,188, 11, 91,150, 11, 83,105,225,156, 20,228, 63,174,130, 47, 97,240,254, 19,159,123,178,210,
- 90,185,214, 91,101,196, 55,154,198,181,172,107,239,183,104, 54, 59, 41, 83, 69,220,109,191,172,224,226,207,203,248,137, 48, 89,
-146,134,188,123,122, 84,207,154,239,190,251,110, 13, 77,211, 52, 69, 81,171, 1,160,172,189,139,124,167,177, 19, 62, 42, 17,236,
-177, 74,114,113,203,114,147, 84, 84,110,175,117,243, 33, 93,236, 44, 76,111, 29,216, 52,135,159, 33, 74, 6,143,199,131,137,137,
- 9, 82, 51,243,193,102, 49, 21, 95,217,222,120, 93,187,118, 93, 62,123,246,108, 68, 71, 71, 99,214,172, 89, 25, 41, 41, 41,151,
-206,158, 61, 59,235,199, 31,127,100,121,123,123, 35, 35, 35, 3, 91,183,110,213, 62,122,244,104, 19,128,173,229,182, 71, 22,107,
-234, 79, 63,253, 68,167,167,167, 19,137,137,137,112,112,112,192,220,185,115,185,155, 54,109, 42,157,147, 85, 29, 79, 86, 9, 68,
- 34, 81, 72,208,157, 39, 24,116, 99, 7, 72,173, 42, 36, 79,156,242,224,117,130, 36,196,146,203, 93,236,212,186,121,141,202,211,
- 0, 3, 12, 48,192,128,111,226,197,122, 81,217,254,127, 1,202, 27, 58,212, 75,104,189,221,189,106,178,235,228, 57, 75, 97, 92,
-167, 11, 84,113,151, 65, 73, 51, 75, 61, 90, 70, 66, 11, 88,214,110,140, 60,153, 10,231,131,195, 0,224,109,117,172, 42, 44, 44,
- 68,155, 54,109,176,119,162, 91, 15,101,161,216,200, 24,128,138,103,170,188,194,237,122,247,250,245,235,114,138,162,206, 0,184,
- 94, 5,205,218,166, 77,155,238,249,229,151, 95,184,141,199, 76,134,244,233,195,207, 61, 40, 48, 54, 54, 6,143,199, 67, 84, 84,
- 20,238,222,189,171, 6,176,182,138, 10,125, 70,146,100,228,217,179,103,211, 26,214,115,234,219,166, 85,139,121, 43, 87,248,153,
-188,122, 24,132,213,155,246, 80, 13,219,122,231,111, 62,125,165, 48, 95, 88,187,167, 34, 35, 62, 66,143, 75,141,252, 76,100,165,
- 55,114,169,213,163, 85,179,166, 75, 87,175, 94,101, 26,251,240, 54,126,252,249, 0,237,218,178, 87,254,207, 23,255, 40,200,225,
-215,237,163,204,122,253, 92,159, 50, 12, 9, 9, 57, 8,224, 96,201,254,231,246,250,173,223, 73,185,181,235, 43,217,124,250,162,
-172,192,164,118,175,202,236,181,105, 60,180,179,179,141,197,173,221, 27,102,242, 63,138, 82,192,227,241, 32, 20, 10,145,146,145,
-135, 53, 59,206,201, 52, 20,213,247,107,133,150,137,137, 9, 79,163,209, 96,239,222,189, 72, 73, 73,233, 4, 32,229,229,203,151,
- 7, 70,143, 30,189,171,121,243,230,141, 98, 99, 99,223, 74,165,210, 57, 0, 94, 87, 68, 98,110,110,222,201,198,198,134,120,242,
-228, 9,102,206,156,169,158, 59,119, 46,103,194,132, 9,132, 68, 34,169,169, 39, 11, 0,224,228,228,228,217,187,103, 71,116,233,
- 61, 43, 68,173,204,123,144,244,250,247, 16, 6,253,216,168,166,229,105,128, 1, 6, 24, 96,192,255, 12,106, 22, 24,220, 19, 96,
-185, 89, 97, 70, 83, 39,206,199,128, 45,115,233,194,132, 80, 90,241,252, 32, 93,112,121, 26,125,109,235, 4,250,250,238, 5,244,
-172,254, 77,233, 70,182,196, 71, 55, 43,204,240,252, 82,184,125,146,221,251, 59,119,104,123, 55, 0,221,187, 1,232,254,110,208,
- 2, 88,217,186,117,235, 43,190,237,255,138,163,229,219, 30, 52,128,153, 0,132, 21,152, 85, 94,198,112, 7, 0,135,218,180,105,
- 67,222,187,119,143,142, 31,217,139, 14,111,100, 77,207,153, 51,135,254,241,199, 31,233,177, 99,199,210, 54, 54, 54,100,113, 65,
- 56, 84,197, 57,104,208, 32,103, 0,168, 85,171,150,121,219,198, 13, 63, 70, 5, 95,165, 31, 4,236,162,143,250, 14,163, 59, 52,
-111,156, 99,223,168, 91,164,177,131,123,171, 42,138,175,148,211,222,222,126, 5, 77,211,125,105,154,118, 0, 0, 87, 87, 43, 97,
-235, 70, 13,211, 35,239, 92,165, 31,158,216, 67, 31,245, 29, 70,119,108,209, 68,236,220,216,235,181,145,109,163,246,250,112,150,
-135,114,237,109,214, 40,199,104,243, 99,239, 0, 0, 32, 0, 73, 68, 65, 84,174, 97,231,136, 74,236, 45,229,172,215,126,212, 31,
-105,233,153,244,179,103,207,232,235,215,175,211, 15, 31, 62,164, 3,206,254, 65,215,110, 55, 82,106,221,124, 72,151,106, 52,157,
-138,236, 52,235,223,191, 63,253,246,237, 91,186, 95,191,126, 52, 0,179, 26,114, 94, 73, 74, 74,162, 99, 98, 98,232,149, 43, 87,
-210, 0,142,207,158, 61, 91,145,159,159, 79,247,234,213, 43,165, 88, 96,177,106, 98,103,125, 23,167,205, 67, 7,118, 93,235, 59,
-115,184,231,215,150,231, 55,132,129,211,192,105,224, 52,112,254, 47,112,254,147,225, 80,236,213, 42,249,219, 90, 47,143, 86, 8,
- 64, 66,140,131,205,108, 53, 39, 55,109,221,189,120,239,193,227, 75,151,207,155, 42,232,234,209, 27,209,119,126,195,197,192,179,
- 50,165, 74,189,149,195,196, 47, 49, 98,200,223, 84, 97, 69,113, 28,173, 79, 16, 30, 30,206,183,108,240, 87, 12,166,119, 69,177,
- 89, 15, 84,243, 2, 51, 0, 76, 15, 11, 11,251,197,203,203,107,227,180, 46,237,135,249,118,238, 1,173, 86,139,128,128, 0, 36,
- 39, 39, 95, 2,176, 74, 95,143, 91,116,116,116, 78,147, 6,117,230,179,153,172,165,115,198, 14,181,201,126,255, 10,105,113,225,
- 0, 0,149, 74,161,253,248,246, 65,203,234, 24,103,108,108,252,204,198,198, 38,222,198,198, 70,226, 86,175,214,116, 30,216,171,
-103,249, 12,182, 21, 39,189, 70,106,108,209,200,168, 74, 41,215,164,189,189,215,168, 38,181, 91,167, 78, 29,158,128,141, 25,229,
-218,171, 86,106, 51,223,189,110,165, 15,143, 92,165,222,180,110,123, 64,159, 13, 75, 39,241, 76, 77, 77, 17, 22,243, 14,171,127,
- 61, 45, 83,168,181,125,115,162,175,124,147,225, 49,154,166,161,213,106,245, 94,232, 80, 1,150,183,108,217,210,125,227,198,141,
-174, 19, 39, 78,196,215,122,178,202, 34, 33, 73,228,231, 84,171,126,147,119,241, 97, 94,150,198,156,147, 95, 83,158, 6, 24, 96,
-128, 1, 6,252,207,160,127,177, 51,103,122,153,191,225, 85, 10,173, 18,196,100, 65, 14, 96,125, 61,166,244,192,138,141,219,215,
- 48,136, 29,147, 40,154,254,141,100, 96, 93,162, 24,217, 95,105,156,156,205, 2,217,103,200, 88, 22, 0,176, 89, 53,235, 32,139,
-241, 22,192,240,195,143,159,183, 59,252,248,249, 15,197,159,109, 0, 80,173,177, 92, 19, 22, 98, 60,154,212,119,234,218,186,169,
- 17, 83,167, 64, 90,220,123,228,202,148,184, 29,155,156,199,160, 25,191, 85,215,168,196,196,196,251, 0, 96,103,198,143,235,218,
-164, 65,237,110,109,154,242,217,132, 26,105,175,194,144,175, 80, 35, 40, 54, 57, 31, 4, 81,227, 9,213,223,202,222,204,232, 63,
- 94,252, 9,162, 23, 65, 16,119, 86,250,142,225,173,249,245,204, 55, 21, 89, 0,228, 34,145, 72, 44,151,203,173,210,211,211,213,
-168,121,144,184,119, 5, 5, 5,205, 23, 44, 88,176,126,201,146, 37, 75,183,108,217,194,169,201,156,172,138, 32, 17, 37, 95,238,
-214,244,219,213,191, 1, 6, 24, 96,128, 1,255, 19,152,254,217, 95,232, 45,180, 74, 5, 67, 22,178, 1,204,169, 95,159, 94,148,
-144, 0,245,183,178,172, 60, 79,215, 87,226, 5,128,129, 53, 62,155, 65, 20, 62,125,155, 44,125,246, 54, 89, 10,138,166, 41,154,
- 86, 49, 24, 72,149,105, 52,155,222, 38,138,106,190,234,142, 32,116, 47,222,165, 40, 94,190, 79, 85,210, 20, 69, 83, 52,173, 38,
- 8,124,212,106,169, 77,177,137,201,127,252, 55,216,155, 19,125,229,113, 32, 73,116,125,252, 44,102,145, 76,166,217,147, 19,119,
- 37,244, 27,214,139, 54, 58, 58,122, 92,167, 78,157, 38,235,116,186, 3, 0,180, 95,193,165, 38, 73,114,249,230,205,155, 47, 69,
- 71, 71,159, 11, 13, 13,205,248, 22, 34,235,111,173,127, 3, 12, 48,192, 0, 3,254,173,168, 89, 82,233,138,240, 45, 69,214,127,
- 35, 98,222,125,104,243,119,240,198,190,251,208,236,159, 96,111,102,220,229,151,153,128,207,223, 84,188, 65, 58,157, 46,232, 91,
-138,234,155, 55,111,186,160,156,180, 58,255,109,245,111,128, 1, 6, 24, 96,192,191, 22,211, 43, 18, 95, 44, 67,217, 24,240, 47,
- 0,253,173, 68,150, 1, 6, 24, 96,128, 1, 6,212, 0, 21,122,180, 8, 84,188,114,224, 78, 53,126,160, 38,171, 15,238, 24, 56,
- 13,156, 6, 78, 3,167,129,211,192,105,224,252,159,227,252, 55,194, 1, 69, 19,226,175, 21,255,173, 84,124,125, 75, 24,150,190,
- 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,183,163,220,137,240, 64,209,228, 97, 3, 12, 48,192, 0, 3, 12,248,187,
-192, 43,222,106,250,189, 1, 6,252, 19,197, 86,169,224,170,201, 28,173,134,197,127,223,253,141,198,250, 58, 56, 56, 76,111,209,
-162, 69, 99, 14,135,195, 40, 44, 44, 92,119,239,222,189,181,159, 31,212,181, 9,235, 37,147, 1,231,191, 62, 33, 0,130, 9, 48,
- 24,208,209, 72,123, 24,165,104,107,168,247,255,106,212, 49, 54,181,249,147, 96, 48,185, 58, 82, 3,157, 86,131,162,233, 86, 69,
-160, 40, 50, 89,167, 81,121, 87,116,178,125,203,161,181, 73, 29,181, 5,160,247, 2,140,217, 0,181,143, 0,107, 22, 13,114, 63,
- 1,230, 76, 48,233,159,161, 35,150,177,216,204, 21, 25,225, 23, 82,255, 13, 5,118,254,252,121,230,215,156, 63,114,228,200,114,
- 19,136, 58, 58, 58, 6,242,249,252, 6, 21,157, 39,147,201, 50, 50, 50, 50,188,254,229,237,177, 27,128,221, 0,154,126,246,249,
-107, 0,243, 1, 4,127,237, 15,120, 2, 44, 59, 96, 6, 7, 88, 6, 0, 26,224,231, 76,224, 96,200,127,209, 28, 67, 27, 27,155,
- 7, 44, 22,203, 85, 38,147,201, 10, 11, 11,235,155,152,152, 36, 8, 4, 2, 1, 73,146,111,179,179,179,187, 85,147,110, 54,254,
- 74,165,181, 20,192,190,106,126,111,128, 1,255, 20,124,213,170, 67,183,162,231, 3, 60, 1,116,107,215,174,157,157, 76, 38,195,
-235,215,175, 51, 1, 60, 0, 16, 82,188,189,249, 22,150, 50, 24,140,109,219,183,111, 95, 60,119,238,220,210,100,208, 81, 81, 81,
-104,217,242,203, 24,161, 76, 6,156,239, 93,189, 99,251, 34,250, 13,218,245, 26, 81, 44,180, 24,128, 44, 3, 94,189,219,215,212,
- 4, 19, 11, 11,139,117, 4, 65,140,100, 48, 24, 85,118,106, 20, 69,233,104,154, 62, 47,145, 72,214, 0, 40,172,206, 15, 9,248,
- 60, 45,169,211,149,251, 27, 44, 38, 83, 39,147,171, 42, 12,123, 97,105,105, 25,202, 96, 48,234,149, 77,152, 13,124,154, 64,187,
-162,239, 72,146, 76,203,201,201,209, 71,132, 26, 49, 88,156,249, 4,193,233, 13, 6,229, 6, 16, 32,192,120, 67,233,212,183, 41,
- 82,179, 19,128,242,107, 68,150, 67,173,250, 15, 23,174,218,236, 28, 19,247, 26, 43,125,199, 98,203,238,227, 88, 49,127, 50,118,
- 30, 58,141,249,211,199,160, 73,147,166,168, 44,173, 56, 5,206,166, 85,243, 70,246,242,223,123,206, 99,197,156,145, 60,255,189,
-231,187,174,244, 29,205,221,180,231, 92,215,149,190,163,120,254,123,206,121,172,152, 55,210,120,211,190, 11, 20,128,241, 53, 49,
-114,140,171,163,140, 32,201,114,223,182,105, 22, 75,117,250,109,186,224,255,227,142,158, 56,113, 98, 11,133, 66, 17, 54,182,119,
-235,205,173,220,156, 68,229, 29, 35,254, 40,114, 74,136, 15,247, 99,115,140,219, 12,246, 59, 30, 85,169,203,129,199,171,247,250,
-245,107, 87,138,162,160,211,233, 64,146,100,233, 95,181, 90,141,110,221,186,125,171,133, 51, 3, 1,172, 43,186, 89,225, 15,224,
-220, 87,112, 9, 89, 44,214, 66, 46,151,235, 73,146,100, 99, 0, 96,179,217,113, 42,149, 42,132, 36,201,237, 0,164,213,228,219,
- 33, 18,137,154, 8,133, 66,104, 52,154,210, 4,244, 76, 38,179, 81,237,218,181,247, 42,149, 74,215,175,189,120, 59, 96, 70,103,
- 15,143,157, 19, 22, 47,102, 42, 30, 60,192,206, 99,199,118,160,160, 0, 0,246, 86,117, 46,151,203,189,197, 96, 48,234, 84,231,
-247, 40,138, 74, 86,171,213,222,213, 57,135,197, 98,185,166,167,167,219, 58, 58, 58,162,176,176, 16, 2,129, 64, 80,178, 95, 3,
- 79,214, 86,154,166,141,139,159,237, 59, 59,118,236,216,137, 32, 8, 18, 0, 77, 81, 20,227,217,179,103, 99, 40,138, 98, 21, 63,
-159,182, 2, 56, 6, 64,101,232,179, 13,248,135,122,179, 14, 85, 87,104, 93, 7,224,217,174, 93, 59, 99, 31, 31, 31,120,122,122,
-194,213,213, 21, 70, 70, 70, 69, 15,113,177,216, 46, 34, 34, 98,212,131, 7, 15, 70, 93,189,122, 21,175, 94,189, 82, 0,120, 4,
-160,220,155,186,231, 0,143,185, 70, 66,222, 46, 0,200, 78, 19,103,164, 37,102,237,202,200,200,216, 10,160,108,136,240,250,227,
-199,143, 95, 52,111,222, 60, 4, 6, 6,226,244,233,211, 80,169, 84, 40, 44,172, 68,191,200,179, 32,185,187, 25, 16, 36, 1, 41,
- 33, 0,223, 22, 16,216,213,184,164, 44, 44, 44,214,205,159, 63,127, 65,147, 38, 77, 74,163,152,107,181, 90,144, 36, 9,173, 86,
- 11,137, 68,130, 69,139, 22, 21,117,180, 52, 13,138,162,112,227,198,141,185,211,167, 79,135, 68, 34, 89, 88, 30,103,199, 54,181,
- 94, 50, 8,134,115,137,175,134,214,233,210,158, 70,164,181, 37,117, 58,166, 82,169, 41, 55, 83,185,145, 17,167, 82,145,199,102,
-179,157, 95,253,249,167, 45,131,203, 5,173,211, 1, 20, 5,154,162,138,139,179,120,163,139, 62,163,117, 20,104,173, 14, 20, 73,
-129, 84,168,208,126,246,108,125,138,162, 51,155,107,124,122,220,180,197,246, 29, 58,118,100,215,173,229, 8, 82, 71,225,125, 82,
-154,125,216,203,167, 93,206,255,190,119,150, 90, 81, 56, 6, 64,141,226,108,113,249,166, 65,123,246, 31,118,126, 17, 17,131,224,
-123, 15,112,231,110, 8, 0,224,214,189,208, 18,193, 93,101, 85,129,148, 54,159, 63,101, 8,111,243,158, 51,236,249, 83,134, 50,
-183,236, 57,203,158, 55,121, 48,115,243,174,211,156,121,147, 7, 51, 55,239, 62,205,153, 55,101, 8,211,127,231,209, 22, 0, 44,
- 0, 72, 42, 34,171,168,142, 8,146,228,157, 76,200,100, 2, 64,246,129, 3,208,102,101,193,113,205, 26, 0,192,184,250,118,122,
- 15,119, 88, 91, 91,191,100,179,217,206, 85, 29,167,213,106,171, 20,193, 19, 39, 78,108,169, 80, 40, 94,146, 36, 73,179, 88, 44,
-191,177, 67,251, 92,233,219,181,165,184,236, 49, 81, 81,145, 86,155, 54,253, 57,228, 92, 88, 33, 61,170,141, 73, 88,224,182,137,
-109, 7, 44, 57, 30, 89, 73,135,204, 80,169, 84,120,251,246, 45,202, 38,121, 47, 3, 93, 77,223,157, 0,236,180,178,178,234, 32,
- 22,139,199, 1, 88, 89, 80, 80,208,130,201,100,194,210,210,114,165, 90,173,126,111,102,102,118, 36, 63, 63, 63,180,216,107,164,
-111,202,128,110,166,166,166, 1,151, 47, 95,182,104,221,186, 53, 35, 39, 39, 7, 46, 46, 46,200,205,205,109,255,224,193,131, 54,
- 83,166, 76,153, 82, 88, 88,248,125,241,203,160,190,112,231,243,249,244,132, 9, 19, 8,157,238,175,203, 61,122,244, 40,188,155,
-145, 13,108,204,249,114,165,154,206, 15,126,107, 54,147,195,225, 60, 74, 78, 78,206,175,110, 97,112,128,101, 19, 22, 47,102, 10,
- 63,124,128, 48, 50, 18,227, 10, 10, 88, 91,138,188, 91, 85, 10, 45, 6,131, 81, 39,224,244,111,174, 92, 46, 23, 36, 73,150,138,
-193,146,103,148, 86,171,133, 70,163,129, 86,171,133, 78,167,131, 86,163,133,255,134,159,107,252, 44,228,243,249,124, 7, 7,135,
- 76, 62,159,207,255, 22,189, 16,143,199, 99,253,254,251,239, 99,184, 92, 46, 0, 64,173, 86,163, 89,179,102,132,161,127, 54,224,
- 95, 38,182,190,240,114, 85, 38,180,250, 21, 20, 20, 64,167,211,193,196,196, 4, 76,230,167,253,190,149,149, 21,122,247,238,141,
-110,221,186,193,199,199, 7,175, 94,189, 50,246,241,241,233, 93, 17,217,216,197, 3, 80,203,213,174,184, 51,161, 28, 30, 95,139,
-216,124,244,167, 11, 54, 31, 63,126, 92, 92,230,176, 41, 51,102,204, 32,196, 98, 49, 70,142, 28,249, 64,165, 82, 13, 2, 80, 80,
- 17,167,142, 66,154,151,207, 56, 80, 52, 97,188,253,217, 97, 66,173, 84,208, 12, 6, 67, 81, 50,116, 88,147, 82, 34, 8, 98,164,
-163,163, 35,206,156,249, 63,246,190, 59, 46,138,107,125,255,153,217,190, 44,189,131, 10, 42,136,130, 32,216, 16,108,216, 53, 17,
- 19,107,188,246, 36, 38,222, 36,150, 88, 18,177, 69, 99,131,196, 26, 19,141,154,196, 88,174, 13,187,216, 98,197,196,174, 40, 82,
- 20, 20,105,194, 2, 75, 95,216, 54,187, 51,243,251, 3, 88, 1,217,130,201,253,221,251,189,217,231,243,217,207,238,236,204,190,
-123,230,156,153, 57,207,121,222,247,188,231, 32, 52,154,215,211,133,217,218,218, 34, 57, 57,249,149,170,198,225, 32, 44, 44,140,
- 67, 16,196, 56, 0,115,155,182, 73,182,188,113, 47,203,181,110, 59,114,112, 32, 63,172, 43, 89,152, 95, 88,205, 2, 32,150, 44,
- 89,162, 39,110, 0,240,245,215, 95,155, 83, 78,144, 60, 30,100,241,241,175, 30,196, 92, 18, 36,159, 0,193, 3, 72,110,141, 23,
- 21, 44,192,210, 0,163, 3, 24, 45, 32,242,104,101, 78, 53,132,182,240,242,139, 91,187,113,155,189, 90,203,226,224,201,203,200,
-204,124, 1, 14, 73,194,199,215, 15, 67,250,245,225,117,237, 30,222,234,219, 21,243, 79,231,231, 60,123, 11,192,221,102, 87, 52,
-195,138,124,189,156,241,243, 47, 15,224,226, 96,141,113, 35,223,134, 88, 36,196, 55,223,255,138,213,139,102,194,207,199, 27, 59,
- 54,175, 49,248,115, 59, 59,187,149, 1,126,190,222,219,246,156, 65,128,191, 63,103,219,222, 51, 8,232, 88,251, 30, 24,192,217,
-182,247, 12, 58, 6,118,228,108,219,123, 6,193,129, 29, 90,223,151,222, 89, 89, 90, 90, 58,211,112,125, 54,106,163, 33, 53,109,
-196,171, 98,244, 29, 65,214, 39,159, 0,128,158,104, 53, 7, 60, 30,175,101,126,126,190,171,169,227, 76,169, 6,181, 74,214,125,
-157, 78,135,162,162, 34,162,188,188,156,181,183,183, 31,121,126,199,226,227, 67,123,135,148, 2,192,163, 71,143, 28,163,163,215,
-142, 60,116,191, 18,202,219, 63, 16,255, 58, 21,207, 76,122, 39,226,254,201,152,105, 93, 81,187, 36, 68, 99,168,213,234,204,206,
-157, 59,179,181,159, 91, 8,133, 66,126,163,235,205,179, 93,187,118,175,169,214,102,184, 20,191,187,117,235,214,204,142, 29, 59,
-194,223,223,255,102,143, 30, 61,108, 37, 18, 9,206,159, 63,143,128,128,128, 64, 91, 91,219, 59,177,177,177,188,133, 11, 23,134,
-236,218,181, 11, 0,102,153, 81,157,131,250,247,239,127, 48, 46, 46, 78,196,231,243,161, 84, 42,145,156,156, 12, 59, 59, 59, 8,
- 4, 2,188,251,238,187,156, 94,189,122, 57,245,235,215,239,104, 90, 90,218, 4, 52, 99, 6,148, 74,165, 98, 23, 47, 94, 12, 43,
- 43, 43, 88, 89, 89, 65, 34,145, 64, 34,145,192, 90, 4, 98,251, 28, 47,241,236,157,229,226,185,203,183,199,236,221,182,226,106,
-171, 86,204, 87,185,185,185,229,205,189, 22,148,215,175,195,250,209, 35,160,222,189,107, 46,236, 36,142,136,138,138, 50,165, 72,
-129,207,231,163,103,207,158, 38,237, 57, 58, 58, 30,227,114,185, 13, 70,166, 58,157, 78, 20, 21, 21, 69,167,165,165, 73, 72,146,
-148, 48, 12,131,168,168, 40, 90,167,211,137, 92, 93, 93,111, 50, 12, 83, 88, 92, 92, 60,218,140,226,170, 1,124, 65,146,228,119,
- 66,161,144,219,186,117,235,236,101,203,150,221,170, 85, 51,193,178, 44,217,186,117,235, 80,177, 88,236,173, 86,171,117,168,113,
- 29, 90,212, 44, 11,154, 4,203,178, 93,107, 68, 97, 61, 52, 0, 4,181,159, 75,106,122, 59, 56, 55,250, 30, 0,138,107, 7,138,
-110, 6,182, 75, 0,164, 0,232, 0,192,181,118,223, 61,130, 32, 74,223,160,152,134, 21,173,184,184, 56,253, 16, 54, 50, 50, 82,
-223,177,216,216,216,224,222,189,123, 32, 8, 2, 54, 54, 54,176,181,181,133,157,157, 29, 42, 43, 43,145,146,146,130, 39, 79,158,
- 32, 43, 43, 11, 4, 65,192,199,199, 7,117, 55, 80, 61,232, 31,112,251, 55,196, 65,100, 45, 4, 65, 0, 93, 6, 4, 35,184,111,
- 16,186,223,205,152,115,255, 18,177, 83, 42,149,166, 3,224, 6, 5, 5,125, 24, 22, 22,134,141, 27, 55, 66,173, 86,111, 52, 64,
-178,244, 54,127, 79,209,117, 3, 0, 15, 15,143, 5,251,206, 63,183,154, 60,204, 87, 33,149, 74,215,191, 65,229, 52,120, 16, 23,
- 23, 23,155,189, 22, 31,195, 48, 40, 43, 43, 51,106,179,177, 66,176,233,187, 31,236,229, 21,133, 88,245,205, 62,104,181, 90,204,
-159, 63, 31, 12,195,232, 95,229,229,229,102,149,147,165,233,215,181, 3,178,198,123, 74,112, 1,175,241, 53,188, 34,231,224, 15,
- 32, 88,128,160, 1,188,126, 94,141, 59, 33, 17,135, 47, 62,180,226,155, 45,246, 9, 79, 94,226,228,229, 4, 80,149,121,144, 62,
- 58, 94, 35, 57,246,156,128,195,106, 14,122, 4,251,226,243, 37,223, 58, 44,253,124,202, 33,141, 82,238,143,134,110,196, 75,166,
-111, 26, 26,171, 86,174,196,206, 45, 27,241,237,198, 45,168,172, 40, 7,143,231, 92,251,160,167, 65,211,180,241,115,103,217, 97,
- 81,115,222, 39,190,249,241, 24, 66, 59,122,224,232,249,187,232,221,217, 27,199,127,187,143,190, 93,219,224,228,165, 4, 12,232,
-225,139,179,241, 73,248,124,198, 4, 98,194,133, 93,195,154,211, 70,155, 55,255, 96, 47,175, 44, 68,220,154, 61, 40,218,186, 21,
-217, 51,103, 34,180,246,152,187, 4, 1,126,203,150, 0,223,116, 27, 53, 70,106,106, 42,212,106,117, 83,163,125, 4, 4, 4,152,
-108,119,165, 82,249, 64,167,211,177,133,133,133, 68, 97, 97, 33, 36, 18, 9,145,156,156, 68, 7, 6, 6,141, 98,159, 28,249, 9,
- 0,162,163,215,142, 58,252,160, 18,138,155, 91,160,188,245, 61,248,109, 18,201,157, 95,207,160, 62, 94,190,227, 65,189,123,180,
- 65, 57, 11, 10, 10,222, 42, 40, 40, 0, 0,180,109,219,246, 73, 90, 90, 90,135, 58, 87,115,173, 11,145,175,211,233,252,234,220,
-137, 58,157, 14,106,181, 26,131, 6, 13,226, 24, 59,119, 7, 7,135,176,128,128, 0, 36, 36, 36, 96,203,150, 45,142,253,251,247,
-199,179,103,207, 64, 16, 4,214,174, 93, 75,116,236,216,145, 87, 92, 92,140,161, 67,135,226,216,177, 99, 61, 43, 43, 43, 77,213,
-167,141, 68, 34,217,117,250,244,105, 17, 73,146,144,203,229, 96, 24, 6,189,122,245, 2, 73,146, 72, 74, 74,194,146, 37, 75,112,
-236,216, 49,156, 56,113, 66,220,181,107,215, 93, 10,133, 34, 0, 13,221,250,134,218,136, 85,169, 84,172, 80, 40,132, 80, 40,132,
- 72, 36,130, 72, 36,130, 64, 32, 64,149, 10,248,120, 83,182,154, 35,114,102, 2, 59,247,246,125,127,246, 90,114,253,178, 15,174,
- 0, 56,105,238, 53, 15,212,196,100,125,247,235,175, 91, 38, 85, 84,144, 0,240, 51, 65, 48, 20,203,126,107,206,253, 14, 0, 85,
-170, 10,120,251,180,196,209, 67, 39, 48,102,252,200, 38, 73, 22,143,199, 7,159,199,131,173,163,196,164, 77, 62,159,239,246,228,
-201, 19, 39, 30,143, 7,150,101, 65,211, 52, 40,138, 42, 92,186,116,169,203,240,225,195,109,206,157, 59, 71, 14, 31, 62,156,113,
-112,112,168,190,123,247,110,145, 78,167,115,234,211,167, 79,115,174,249,109,193,193,193, 93,142, 31, 63,254, 65, 84, 84,212,253,
- 5, 11, 22,172,170,191,115,221,186,117, 43,207,158, 61,235, 61,106,212,168,189,143, 30, 61,218,214,156,103,200,159,125,206, 91,
-108,254,247,217, 52,196, 69,106,225, 70, 16, 68, 92,189,103,118,100,221,118, 84, 84,212,226,232,232,232,100,130, 32,226,234,127,
- 95,119, 92,237, 96, 49,174,169,237,218,223, 58, 46, 90,180, 40, 40, 38, 38,102,109,120,120,248,193,155, 55,111,190, 0,208, 92,
-162,101, 60, 70,171,238,132,234,159,100,163, 78, 13,149,149,149,168,172,172, 68,110,110, 46,182,111,223, 94,123, 67,243,192,229,
-114,193,229,114,245,241, 12,134,112, 57,238,143,239, 1,124,223,165, 75, 23,222,227, 91,177,231,190,220, 57,123, 96,183, 65, 93,
- 56, 15, 46, 63, 30,139,154,245, 8,223,154, 58,117,170, 51, 0,236,217,179,167, 24,192,185,255, 16,107,142, 77, 79, 79,255,220,
-195,195, 67, 31,163, 82,223,125,168,211,233, 32, 18,137, 80, 23,203,162, 82,169,176,125,251,118, 29,203,178,177, 70,108, 34, 45,
-249, 10,210,147,175,214,252,142, 97,192,208,175,126,191, 98,197, 10,176, 44,171,239,236, 63,169, 85, 78, 76,146,188,166,234,156,
-109,244,222,232,123,150,166, 77,184, 39,248,179,199, 78,153,233,193, 16, 92,156,186,242, 16, 60, 30, 15, 76, 61, 53,147,199,169,
- 25, 45, 39, 63,203,135,167, 91, 32,222,153, 48,195,253,248,222, 31,102,235, 40,213, 55,205,173,107,255,224,112,204,249,252,115,
-252,180,115, 39,150, 44, 95,169,103, 0, 58,154,134,206,100, 57, 73,114, 80,175, 32,232,170,242,193,225,112, 48, 32,212, 23, 28,
- 14, 7,131,195,219,131,195,225, 96,104, 47,127,112,185, 92, 12,235,221, 17,237,218,181, 3,151,203, 37, 77,180, 59,210,146, 47,
- 35, 61,249, 90, 61,210,203,130, 5, 64, 73,165,175, 29,175,149, 74,193,122, 57, 53,247,218,194,135, 31,126, 88,158,155,155, 75,
- 53,222,215,170, 85, 43,254,245,235,215,237, 13,184,237,244, 16,139,197, 93,185, 92,238,131,210,210, 82,198,202,202,138,100, 24,
-154, 9, 12, 12,226,156,223,177,248,120,221, 49,139, 22, 45, 62,254, 94, 87,219, 81,251, 98,227, 88,126,235,222, 4,193, 19,234,
- 62, 90,190,131,207,227,139,187, 2, 74,115, 6, 15,164, 90,173,198,211,167, 79, 97,170, 60, 44,203, 26,117,253,148,149,149, 77,
- 13, 8, 8,184,254,253,247,223, 59, 18, 4,129,223,127,255, 29, 28, 14, 71,255,202,200,200, 0, 73,146,248,242,203, 47,169,202,
-202,202,233,166,202,198,229,114, 63, 63,122,244,168,157, 64, 32,128, 92, 46,215,223, 55, 28, 14, 7, 79,158, 60,193,250,245,235,
- 49,117,234, 84,228,228,228,192,211,211, 19,243,231,207,183,142,137,137,249,156,162,168,149,102, 52, 81,162, 70,163,233,102,101,
-101, 5,145, 72,132, 58,194, 5, 0,191, 37,243,146,148, 74,101, 39, 39, 39,133,187, 75,124,220,169,158,253,223, 9,113,114,241,
- 8,151, 74,165,205, 90, 58,235, 57,176, 51,147,166,151,190,117,252,184,235,141,227,199,153,219,167, 79,191, 20,202,229, 59,204,
-190,134,180, 36,178, 51, 94,162,107,215,174,120,240,224, 1,186,118,237, 90,159, 52, 65, 32, 16,128,207,231,131,207,231,195,217,
-193,172, 16, 10,150, 36, 73,220,184,113, 3, 52, 77, 67,163,209, 64,163,209,160, 99,199,142,165, 87,175, 94,181, 6,128,140,140,
- 12,118,242,228,201,229,119,238,220, 65,231,206,198,215, 83,119,115,115,187,206,225,112, 90,215,255,174,164,164,196, 97,244,232,
-209, 40, 43, 43,123,123,244,232,209,189,107,239,223,188, 35, 71,142, 76, 6, 0,129, 64, 0,146, 36,105, 88,240,183,135, 41, 46,
- 82,159, 40, 53, 38, 92,209,209,209,145,141,191,171, 79,170,154,250, 92,255,183, 49, 49, 49,107,235,217, 86,190, 65,241, 77,199,
-104,197,197,197,177, 77, 48, 72,179, 97,138,104,213, 33, 33, 33, 65,235,233,233,249, 83,250,195,172,129,190,193, 62, 16, 75,132,
- 67, 0,124, 47, 20, 10,231, 77,153, 50, 5,183,111,223, 70, 82, 82,210, 47,248,147,179,112,130,130,130, 46, 8,133, 66,111, 3,
-110,146,236,164,164,164,161, 6, 58,134,229,167, 79,159,134,177, 96,248, 43, 87,174,212,239,148,234, 7,195, 55,125, 97, 48, 44,
-180,148, 22,213, 10,229,171, 78,188,150,104, 85, 87, 87, 99,252,248,241, 13, 20,173,162,162, 34,147,231, 71, 16, 4,214,159, 60,
-137,139,177,177,120, 59, 36, 4,199,238,222, 69,204,148,137,240,247,110, 1,150, 38,192, 18, 64,206,129, 31, 80, 82, 89,133,253,
-151,111,160, 84,174,192,164, 62,125,224,103,235,108,220, 46,143, 63, 56, 52, 44,156,127,233,102, 10,120, 60, 46, 72, 48, 96,181,
- 10,120, 6,244, 3,135, 36, 97,231,214, 6,124, 30, 15, 60, 30, 23, 25,185,197, 8, 8,234, 46,136, 19,136, 6,191, 9,209,106,
-229,221, 6, 52, 77, 99,234,212,169, 56,120,240, 32,156,220,189, 97,215, 42, 8,171, 55,238,196,219,131,250,152, 60,255,186, 17,
- 60,151,203, 5,135,195,121,237,189,238,179, 57,234, 36,203,176,160, 26,183, 17,195, 2, 44,139,150,107,214,160,229,154, 53,184,
- 91,251,159, 29,171,171,161, 84, 42,129, 30,129,205, 34, 89, 26,141, 6,185,185,185, 84, 65, 65,129, 91, 19,251, 11, 53, 26,141,
- 73, 98,179,123,247,238,196,105,211,166,117,115,116,116,188,159,248,232,145, 54, 56, 36,132,119,110,251,226, 19,117,110, 67, 0,
- 8, 9, 9, 41, 93,188,120,241,137,201,227, 34, 71,110,139,250, 7,253,233,202,189, 92,161, 88,220, 45,114,193,238,196, 3,227,
-198,153,246,247,168,213,153,193,193,193,172, 57,231,165, 80, 40, 10,140,236, 30, 1,224,235, 46, 93,186,216,246,239,223, 31,215,
-175, 95,199,152, 49, 99,212, 20, 69,165, 3,192,240,225,195,219,239,223,191, 95,144,146,146, 2, 23, 23, 23, 94,118,118,246, 46,
-152, 8,144, 23, 8, 4,253,186,119,239, 78,170,213,234,215, 72, 86, 76, 76, 12, 38, 76,152,128,246,237,219,131, 97, 24, 84, 85,
- 85,161,127,255,254,188, 45, 91,182,244, 51,147,104,205,241,247,247, 95,143,154, 89,135,245,159,133,169,168,113,107,161,164,164,
-164,224,225,157,203,201,125, 6,141,238,214,186, 93,144, 71, 82,226, 3,163, 6, 93, 93, 93, 23,145, 36,249, 30,195, 48,156,202,
-202,202,220,135, 26, 77,187,142,222,222,110,189, 70,142, 68, 5,143,199,249,238,242,101,178, 80, 46,183, 6, 96,150, 11, 82,165,
-173,134,183, 79, 77,168,223,152,241, 35,241,224,193, 3,140,253,199, 40,240,249,124,112,185,188,154,123,147, 95,163,104,217, 59,
-219,154,117,109,106,181, 90,253, 51,188, 46,206,139,162, 40,212,133,102, 89, 89, 89,233,247,169,213,106, 16, 4, 97,236,218,240,
- 59,188,114,153,171,216,214, 14,180, 86,139,192,145, 99,245,215,244,157,159,183,137,193, 48,226,242,236, 76,204,138, 61,205,131,
- 5, 22, 24, 80,181,140,113,145,250, 68,233,207,130, 32,136,184,168,168,168,197, 0,216,168,168,168,197,117,219,209,209,209, 74,
- 0,121,111, 72,182, 94, 83,185,184,127, 5,201,170,115, 47, 24, 67,255,254,253,103,217,216,216,108,169,219,206,189,157,135,220,
-219,121, 8,232, 16,216,171, 75, 72,183,138, 9, 19, 38,192,201,201, 9, 11, 22, 44, 96, 1,252,210,220,255,207, 72, 75,182, 6,
-192,122,120,120, 44,168,125, 32,135,220,189,123,215,229,222,189,123,232,222,189,251, 43,233,158,162,208,187,119,111, 99,166,228,
-181, 65,237,115,255, 58,149,140, 1, 69, 81, 80, 40,148,208,104, 40,232,180, 12,116, 58, 29,186, 6,218, 96,239,206,168,154,239,
-116,117,234, 89,141,106,214,210,221, 6, 54,214, 60, 45, 73, 18,202,251,137, 5, 77, 62, 49, 53, 26, 13, 18,179,179,241, 40, 43,
- 11, 0,240, 78,180,241,192,215,189,151,175,163, 99,199,142,166, 74,235,219,210,211, 29,249, 23, 19,107, 30,222,202, 92,220,251,
-227, 48,108,108,172, 1, 0,129, 17,147,192,231,215, 16,173,106, 37, 5,231, 14,173, 64,176,172,193,180, 0, 86, 14,238, 23,184,
-124,145, 55, 75, 51, 96, 89, 6, 44, 67,131,101, 25,112,120,124,171, 89,159,124, 0,134,161, 17, 26, 26, 10,130,195, 1,173, 85,
- 99,220,136,193, 40,171,144,195,201,222,188, 78,130,207,231, 35, 34, 34, 66,108,104,255,179,103,207,148,245,137,153,241, 54,210,
-162,186, 90, 9,181, 90, 13, 74,163, 3,165,213,129,110,203,199,170,165, 19,161,163,116, 80,252, 35, 28,148, 86, 7,230,243, 81,
-160, 52, 90,228, 88,145,100,112,128,179,150, 4,161,124,152, 42,179, 53, 69,180,234,200,129, 33, 52, 21, 19,104,128,108, 61,154,
- 54,109, 90,215,224,144,144, 7,239, 13, 10,217,240, 56, 41, 57,255,113, 82,242,107,199,121,183, 15,201,252, 52,230,224,124, 30,
- 95,220, 53,114,129,241, 89,135,245, 81,223,141,248, 39,177, 88, 46,151, 7, 91, 91, 91, 35, 45, 45, 13, 28, 14, 7, 4, 65, 60,
- 3, 16, 12, 0, 30, 30, 30,207,185, 92,174, 15,135,195,193,214,173, 91, 9, 46,151,219, 41, 60, 60,124,177, 74,165, 58,108,100,
- 64, 23, 96, 99, 99,211, 64,205,226,243,249,136,138,138,194,228,201,147,245, 36,139,207,231, 99,247,238,221,232,214,173, 27, 52,
- 26, 77,128,153,229,189, 7,160,143, 25,138, 31, 81, 75,206, 77,146, 81,157, 78, 55,173,228,189,247,218, 33, 62, 30,189,124,124,
- 58,118,237,218, 21, 20,245, 74,208,244,241,241,105, 37,151,203, 11,148, 74,229,191, 80,147,218,224,161, 81, 82,164, 98,144,157,
- 81, 19,126,250,224,193, 3,132,134,134,234, 21,172,250,106, 22,159,207,135, 88, 96,221, 44,162,197, 48, 53,207, 37,185, 92, 78,
-198,199,199, 59,251,251,251, 19, 0,224,239,239, 79, 60,124,248,208,209,202,202,170,216,215,215,215,228, 0, 88,108,107,135,221,
-211,198, 3, 0,190, 26, 52, 76, 63, 48, 58,255,245, 98,240,120, 60, 12, 92,176,248,181,235,158, 97, 24, 14, 44,176,144, 44, 51,
-184,200, 95, 69,178, 26, 43, 90,209,209,209,201,209,209,209,175,169, 99,205,132,105, 69,171,190,116,215, 92,212,221,172,134,176,
-113,227, 70,116,234,212,201,104, 71,180,101,203, 22,236,219,183,111, 35,128,140,102, 75,142, 3,187, 4, 98,211,241,100,159,246,
-129, 4, 0,172,252,124, 4, 89, 93, 93,141, 27, 55,110,192,206,206, 14,207,158,153,157,246,203,198,206,206,238,107,146, 36,199,
-113, 26,207, 0,104,154, 96,210, 12,195,196, 86, 84, 84, 24, 76,239,192,178, 0,165,213,161, 90,161,130, 70,163,193,231, 95,254,
- 96,178, 16,209, 0, 65,105,228,220,136,190,225, 98, 67,138, 78,104,167,126,248,108,138,245,107,157, 55,135, 4, 72, 18,232, 28,
- 90,163,184, 60,188,155, 12,134, 1,104, 6,112,118,117,192, 47, 7, 54, 24, 37,249, 58,154,169, 29, 29,211,168, 82,211, 8, 8,
-139,196,203,212,120,189,130, 36,224,215,184,140,249, 60, 30, 24,150,168,201,250, 96,136, 8, 9,196,222,101,210, 12,191,157,113,
-143,241,113,100, 39, 28,185,148,136,177,131,130,113,245, 78, 10,250,247,232,136,228,244, 44, 4,250,181,198,214, 93,177, 96, 89,
-200,127,220,180,186,224, 85,135,166,203, 54, 71,209,186,125,251,182,178,177,138, 85,255,157, 53,221, 31,130,101, 95, 41, 90, 74,
-149, 26, 11, 22,153,149,206,167,166,141,250,132,137,205, 57,216,152, 98,101, 14, 17,107,172,108,193, 68,122,150,182, 0,186, 1,
- 11,255,147, 15, 78,154,166,113,230,204, 25,125,123, 52,213,142,245,219,206, 12,146,131,236,236,108, 36, 39, 39, 35, 44, 44, 12,
- 21, 21, 21,224,145, 36,230, 63,126,140,142, 83,166, 64,195,231,131, 97, 24, 8, 4, 2,204,152, 49,195,236,250,108,230,211,185,
- 54,152,155, 54,101,124, 67,120,120,120,187,180,234,106, 36, 63,121,130, 65, 43, 86, 0, 0,206,158, 61,219,224,154,152, 55,111,
-158, 32, 37, 37,229,195,251,247,239,127,152,159,159,191, 17,192,124,131,207, 89, 86,173,143,209,122,111,226, 24,180,243,111,139,
-125,191, 30,208,239,159,247,197, 28,240,120,124,240,248, 60,216,219,217,155,117, 54, 90,173, 86, 79, 90, 21, 10, 5,121,246,236,
-217,150,131, 7, 15,230,207,153, 51,135, 0,128,125,251,246,145,223,127,255,189,228,226,197,139,252, 22, 45, 90, 72, 77,146, 75,
-138,122,173,141, 9,130, 0,143,199, 3, 95,192, 7, 24, 6, 4, 65, 72,214,173, 91,183, 50, 57, 57,185,187,191,191, 63,212,106,
-245, 20,212, 76,212,176,228,209,178,144, 45,163, 92,164,169, 88,171, 90, 85,202, 16,100,245,227,182, 12, 17,181,250, 49, 91,120,
-179, 73, 25,230,197,104, 53, 5, 14,135, 99, 82,173, 34, 73,210,164,235,112,222,188,121,176,177,177, 49,212, 1,177,143, 31, 63,
- 78,145, 74,165, 59, 1,252,240, 70,141,115, 57, 33,249,235,185,163,228,168,245,173,218,219,219, 23, 15, 24, 48,160, 10, 0,117,
-248,112,195, 1,178, 90,173, 54,216,129,219,217,217,125,253,243,207, 63,207, 30, 57,114, 36,217, 56,197, 64,125,247, 94,221, 75,
-171,213,226,240,225,195,179, 23, 46, 92,136,138,138,138,185,198, 58,113, 69,181, 18,202,218, 64,232,231, 73, 71,204,125,168, 27,
-220,101,109,239,129,150,109,131, 13,118, 38, 36,191, 38,134,200,205,235, 85, 7,102, 99, 35, 2,109,196, 38, 65,144, 25, 89, 57,
-249, 45, 90,185, 59,226,121,174, 12,110,173, 59,161, 44,239, 85, 61,112,185, 28,240,106, 93,135,246,182, 18,200,138,138, 64,146,
- 28,163,196,120,245,254, 4,220, 73,202,194,209, 75, 15, 65,169,170,177,105,207,121, 80,234, 42, 80,170,106, 80,170,154,247,181,
- 11, 63, 2, 65,160, 64,171,174,110,223,156,118,231,114,185,232,209,163,135, 65,162,147,151,151,103,166,162,197,234, 21, 45,165,
-170,153,109,100,222,200,201,168, 98, 85,183,255, 77,137, 65, 93,202, 7,177, 88,220,109,247,110,195,105, 28,154,130,187,187,251,
- 57,107,107,235, 54,230, 30,223,140,228,165,107,237,237,237,191,246,247,247, 15,216,180,105, 19,143,195,225, 96,224,192,129,237,
-221,221,221,179, 1, 32, 48, 48,208,179,238, 25,243,233,167,159,178,183,111,223, 78,170, 25, 99, 24,134, 64, 32,120, 98,103,103,
-215,173,127,255,254,168,168,168, 64,110,110, 46, 36, 18, 9, 58,110,216,128,199,159,126,138,144,237,219, 65, 14, 24, 0,130, 32,
- 32, 16, 8,240,248,241, 99,136,197,226, 39, 42,149,193,148,111, 61, 0,124, 11,160, 23, 94,185, 11, 89, 0, 55, 80,147,118,225,
- 78, 19,207, 59, 18, 0,104,134, 49,213, 88, 19, 23, 44, 88,128,114, 30, 15, 24, 62, 28,252,140, 12, 80, 20,133,176,176, 48,189,
-202, 30, 22, 22, 6, 46,151,139,224,224, 96,120,122,122, 98,235,214,173, 19,141, 17, 45, 85, 21,133,236,140,151, 8, 15, 15,215,
- 43, 87,195,135, 15,215, 43, 90, 60, 30, 79,175,108, 17,180,105,226, 74, 16, 4, 91,127,144, 76,211, 52,193,229,114,185,115,231,
-206, 37,198,140, 25,195,106, 52, 26, 70, 32, 16,144, 71,143, 30, 37,174, 94,189,202,173,174,174, 54, 57, 16, 15, 26, 53, 14, 95,
- 13,126,171,230,222,111,227, 2, 30,159, 7, 1,159,143, 5, 79, 94,234,219,197,118,247, 65, 65, 76, 76,204, 88,127,127,255, 26,
- 55, 60,192,181,228,209,178,192,132,208, 35,107, 68,146, 52,245,182,101, 0,136,218,109, 89, 61, 66, 37, 35, 8,226, 30,203,178,
-221, 27, 29, 91,183, 95,211,232,189,110,255,163, 55, 40,126,221, 90,135,175,145, 47, 99, 35,226,244, 91,183,110,249,117,237,218,
- 21, 57, 57, 57,175,205,132,171,235,184, 36, 18, 9,196, 98, 49,110,222,188, 9, 0,233,134,140, 93,189,122,245,123,212,100, 93,
-174, 41,145,135, 71,120,255,247,250,221, 12, 29,214, 29,251,163, 15, 84, 72,165,210, 96,188,202,161, 67,120,122,122, 78,230, 9,
-184,227,125,130,188, 34,192, 48,223, 94, 62,125, 99,133,177, 51,244,105, 31, 88, 5, 64, 89, 55,235,240, 13,103, 31,130, 36,201,
-113, 35, 71,142, 36, 83, 82, 82, 48,126,252,120,236,219,183,207,224,177,147, 39, 79,198,193,131, 7, 49,114,228, 72,114,209,162,
- 69, 6,211, 59, 52, 84, 75, 52,127,217, 69,153,246,236, 17,246, 30,252,217, 96, 12,146,171,107, 77, 60, 86, 81, 81,177,254,187,
-238, 93,141,123, 70, 24,157,230, 98,194,253,187,225, 61,251, 14,228,231, 22,150,131,209,169,161,146,191,250,189,162,188, 16,172,
- 78, 5,190,149, 35,220,157,237,240,224,214,111, 26, 74,163,186,104,204,230,236,145,129,248,116, 68, 0,192, 50, 24, 53,255, 23,
-196,253, 48, 75, 63,130,238, 61,102, 14, 46, 31,254,206,236, 24,191,198,224,241,120,120,252,248,177,210,144,154,197,225,112,204,
-201,201, 85,171, 58,106,161, 80, 40,161, 80,170,254,202,103,135,139,155,155,219,143, 14, 14, 14, 34, 3, 68,202,197,197,197,229,
- 71, 39, 39, 39,145,185,174, 67, 67, 36,171, 54,175,214,253,105,211,166, 53,139,108, 9,133,194, 54,233,233,233,250,100,165,198,
-222, 53, 26, 13,250,247,239,111,110,242,210,211, 0, 94,120,120,120,220,232,216,177,163,221,243,231,207,113,224,192, 1, 62,143,
-199,243,170,123,126,200,229,114,112, 56, 28, 20, 21, 21,105, 1,124, 0, 19,174, 51,181, 90, 29, 31, 31, 31,223,121,196,136, 17,
-156, 39, 79,158,128,195,225,212,148, 43, 60, 28, 33,219,183, 35,105,238, 92, 68,100,101, 65, 69, 81, 16,137, 68,184,112,225, 2,
-165, 80, 40,226, 13,217, 19,139,197, 59, 51, 51, 51, 3, 69, 34, 17, 40,138, 2,195, 48, 32, 73,146,224,114,185,189,237,237,237,
-183, 0,232,222,168,177, 92, 67,186,247,239, 64,235,116,180, 52,231,185,204, 84, 5,148,148,148,224,244,233,211, 8, 11, 11, 67,
- 68, 68, 4,242,242,242,144,145,145,129,183,223,126, 91,127,204,163, 71,143,144,144,144, 0, 95, 95, 95,211,138, 30,169,133,111,
-135, 54,224,243,249, 53, 10, 17,143, 95, 59,240,225,233,149, 44, 62,143, 15, 30,151, 7,145, 88,100,182,162, 69, 16, 4, 72,146,
- 4, 65, 16, 16,139,197,117,131,108,166,101,203,150,210,210,210, 82, 15, 0, 13, 3, 10, 12, 0, 0, 32, 0, 73, 68, 65, 84, 28,
-177, 88, 12,154,166,205, 26,180,212,245, 17,117, 36,139, 47,224,235,149, 45, 0, 40, 47, 47, 87,141, 28, 57,242, 95,106,181,250,
-125,188,217, 10, 37, 22,252,205, 64, 16,196,189,255,196,111,155,129,225,181,196,234,181,160,120, 99, 23,248,219, 61,123,246,220,
- 62, 97,194,132,129,155, 55,111,134,181,181, 53,164, 82,169,190, 67, 20, 8, 4,104,213,170, 21, 74, 75, 75,177, 99,199, 14,188,
-124,249,242, 10,128, 25,230,150, 72, 42,149,222,126,246, 48,189,164,255,216,158, 78,129, 61, 59,216,231,166,191, 12,147, 74,165,
- 55,107, 73,214, 47, 19,230,189,253,126,255,209,161,224, 11,120,200,125, 86,128,203,167,111,252,127,105, 76, 14,135,195, 33, 8,
- 2,227,199,143, 55,235,248,127,252,227, 31,136,143,143,135, 49, 55, 35, 83,167,104, 41, 84,168, 86,254,117,131,181,207,102, 77,
-198,103,179, 38,235,201,132, 57,174, 23, 0,240,244, 60,100,132,104, 81,155,227, 14,237,248,184, 75,104,184,119,183,192, 54,184,
-115,255, 33,246,111,127, 37, 50,236,250,126, 37,190,217,117, 5,173,220, 28, 64,169,171,113,238,200, 79, 5,148, 90,177,249, 13,
- 69,185, 26,114, 75, 16, 96, 89,166, 89,231, 94, 71,158,120, 60, 30,130,130,130, 12, 42, 90,165,165,165, 74, 83, 29,131,190,141,
- 52, 90, 84, 85, 43,161, 84,252,101, 68, 43,164,119,239,222, 23, 99, 99, 99,157, 92, 93, 93,145,159,159,223,152,104,133,244,234,
-213,235, 98,108,108,172,147,155,155, 27,114,115,115,205, 78, 43,210, 4,201,130, 76, 38, 35,202,202,202, 24, 7, 7,135,102,145,
- 45,146, 36,161, 86,171,145,154,154,106,238,223,154, 61, 67,204,206,206,110,247,193,131, 7,237,138,139,139,193,225,112,144,154,
-154,218, 96,214, 97,221,235,151, 95,126,225,143, 26, 53,234,231,242,242,114,163,211,218,116, 58,221,198,201,147, 39,127,152,151,
-151,231,224,234,234, 10,169, 84, 10,129, 64, 0,150,101, 65,244,239,143, 62, 47, 94,128,162,105,136,197, 98,164,165,165, 97,231,
-206,157,213,181,169, 98,154, 20,200, 8,130,240,227,243,249,152, 52,105, 82,131, 29,123,246,236,193, 59,221, 56,221, 92,236,184,
- 85, 58,136,212,133,226,183,206,113, 56, 28, 34,164,199,128,246, 61,250, 14, 15,122,154,116,231,185,172,240,165,169,135,146, 86,
-163,209,192,223,223, 31,247,238,221,195,165, 75,151, 48, 96,192, 0, 68, 68, 68, 32, 49, 49, 17,191,253,246, 27, 18, 18, 18, 64,
- 16, 4,156,156,156,234,194, 47,140,198, 96,104, 20, 58, 20,229,151,188,166, 94, 53,222,230,243,249, 80, 43, 41,179,218,232,201,
-147, 39,184,119,239,158, 62,181, 12,135,195,209, 77,153, 50, 5, 44,203,178,153,153,153,176,177,177, 97,167, 77,155, 70,115,185,
- 92, 93, 94,158,121,241,193,117,164,170,142,100,113,249,188, 6, 4,141, 97, 24,121, 98, 98,226,199, 0, 18,107,149, 44,192,146,
- 71,203,130,255,219, 56,131,215, 23,150, 54,169,104,189, 0, 48,232,192,129, 3, 19, 79,156, 56,177,113,203,150, 45, 46,145,145,
-145, 40, 43, 43,131,183,183, 55, 60, 60, 60, 16, 23, 23,135,179,103,207, 22,211, 52, 61, 31, 64, 83,210,207, 32, 24,201, 89,147,
-247, 92, 26,171,174,170,250,180,107, 68, 0,174, 28,254, 61,218,221,221,125, 6,135,195,249,124,218,226,119,223,239, 55,178, 59,
-210, 18, 50,113,251,183,199, 40,204, 41, 54,105,179,113, 48,188,189,189,253,135, 86, 86, 86, 2, 0, 84, 19,163,226,198,179, 14,
-245, 54,105,154,166, 53, 26, 13, 14, 29, 58,100, 22,217, 58,112,224, 0, 84, 42, 21,232,215,253,171,122,155, 44,195, 18, 92,158,
- 16,158,173,252, 65, 81,213, 96,152, 55,158, 80,169,183, 89, 55, 2,125, 46, 16,192,181,184, 24,119,238,220, 49,143,114, 15, 31,
-110,170,141, 84, 26,149,124,210,119,107, 22,196,205,140,250,214,126, 64,207,206,248,106,195, 30, 80,212, 46,144, 28, 18, 98, 33,
- 31, 93, 67,123,129, 3, 53,126,140,249,162, 92, 81, 89, 54, 9,175, 47,197,211,192, 38,107,204,195,194, 2, 52,195,224,210,245,
-187,102,159,187,190,183,167,105,112,185, 92, 60,123,246, 76,217,212,108, 67, 14,167,198,205, 89, 55, 82, 55,102,147,101, 24,130,
-199, 23,161,149,119, 71,104,212, 85,127, 73, 27,185,186,186,126,113,252,248,113,167,186, 84, 9,137,137,137, 32, 8, 34,245,149,
-226, 88,179, 95,169, 84, 34, 41, 41, 9,137,137,137, 64,205, 12, 55,179,239,163, 58, 37, 75, 38,147, 17, 82,169, 20, 86, 86, 86,
-100, 98, 98,162, 58, 56, 56,248,190,137,251, 91,111, 83,165, 82,101, 25,138,159, 84,169, 84, 45, 68, 34, 17,175, 81, 39,234,217,
-174, 93,187,180, 38, 92,136,175,149,179,162,162,226,206,194,133, 11,187, 14, 27, 54, 12, 95,124,241, 69,169,131,131,131,205,143,
- 63,254,200,229,112, 56,196,204,153, 51,233,162,162,162,170,159,126,250,201,238,196,137, 19, 40, 47, 47,191,105,198,185,203, 85,
- 42,213,199, 61,123,246,220,115,254,252,121, 43, 63, 63, 63, 84, 86, 86,130,101, 89,236,222,189, 27, 51,103,206,132, 72, 36, 66,
- 90, 90, 26,222,121,231, 29,133, 66,161,248, 24,175,199, 78,214,217, 36, 8,130, 96, 25,134,193,178,101,203,244,201, 73,235,146,
-149,218,136, 9,236,156,215, 86, 50,231,167, 10,201,196,175,126,154, 2, 0,180, 78, 71, 63, 77,186,243,124,247, 15, 95, 93,229,
-243,249,215, 77,180,209,146, 57,115,230,252, 56,124,248,112,177,181,181, 53, 74, 75, 75,113,227,198, 13,220,186,117, 11,183,111,
-223,134, 70,163,129,147,147, 19, 28, 28, 28, 32,149, 74,241,228,201, 19, 37,128, 37,198,108, 10,172,120,240,105, 95, 55,243,183,
- 70,193,226,213,155,109, 88, 95,221,226,243,120,102,221, 71,125,251,246, 69,143, 30, 61,234, 8, 16,157,157,157, 45, 85,171,213,
- 68, 61,210,159, 87, 71,200,189,188,188,116,251,246,237, 99,141,217,188,189,115, 43,206,175, 90, 2, 1,159,143,249,169,185,122,
-210,181,103, 64, 23,240, 4,124, 4,140, 24, 83,255,183,219, 80,227, 46, 68, 35,146,101,172,239,248,211,247,166,197,230,127,173,
-205,255,203,144,226, 13,150,224,169,195,126,149, 74,117,238,163,143, 62,138, 9, 9, 9,249,104,211,166, 77, 4,159,207,199,138,
- 21, 43,216,252,252,252, 95,107, 71, 33,101,111, 82, 42,150,101,127,189,118,236,230, 39, 83,163, 70, 18,243, 54, 79,235,125,255,
-114,210,147, 78, 61,253,208,169,167, 31,238, 95, 73,193, 15,139, 15,236,163,181,244,178,130,130,130, 28, 19,166,212,131,122,117,
-104, 28, 12,239, 20,127,245,178, 83,115,103, 29, 50, 12, 19,123,224,192,129,217,163, 71,143, 38,239,222,189,251, 90, 76, 86,221,
-178, 59, 12,195,224,226,197,139,160, 40, 10,191,254,250, 43,195, 48,140,225, 60, 90, 96, 79,126,183, 57,102,234,175,123, 79, 10,
- 4,124, 2,183,174, 31, 69, 69,153,241, 89, 93,124, 62, 15,191,236, 62, 70,241,249,188,167, 77,237,167, 40, 42,247,242,229,203,
-110, 67,105,154, 71,146,100, 83, 4,170, 73,196,198,198,106, 25,134,201, 54,113,216,205,194,151, 57, 35, 86,127,241,193,129,225,
-239,125,228,214,179,103,111,158,179,171, 27, 8,130, 64, 81, 97, 17,210,146,238,106,207, 29,253,185,176, 90, 97,222, 18, 60, 31,
-172,191,166,143,201, 2,128,200,153, 91,244,241, 89, 0, 48, 98,218, 66,244, 15, 11, 4, 97,142,244,244,138,100, 49, 58,157, 14,
- 18,137, 4, 58,157,174,201, 20, 15,118,118,118, 98,149, 74,165,172, 77,196,104, 84, 42, 98,129,191,188,141,104,154, 14, 40, 43,
- 43, 67,117,117, 53,110,221,186,197,174, 89,179, 70, 38,147,201,244, 65,155, 90,173, 54,160,180,180, 20, 85, 85, 85,184,121,243,
- 38, 27, 19, 19, 35, 43, 41, 41, 89,220,156,123, 72, 44, 22,119,227,114,185,247,203,202,202, 24, 43, 43, 43, 82,171,213,106,131,
-131,131,133, 98,177,216,236, 5,213,165, 82,233, 48, 67,251,124,124,124,210,211,211,211,219,209, 52, 93,127, 13, 68,190, 74,165,
-242,235,217,179,167, 57,207,143, 57,187,118,237,194,177, 99,199, 66, 43, 43, 43, 39,103,103,103,239, 1, 16,202,229,114,241,240,
-225,195, 84,149, 74, 53, 97,244,232,209,187,203,202,202,238,160,102, 9, 30,115,112, 62, 45, 45,109, 82, 64, 64,192,174,175,191,
-254,218, 58, 34, 34,130,235,233,233,137,238,221,187, 35, 45, 45, 13,103,206,156,209,110,219,182,173, 90,161, 80,124, 0,224,162,
-241,102, 7,161,211,233, 32, 16, 8,244, 47,161, 80, 8, 62,159, 15,185,146,197,244, 13, 25, 74, 29,196,202,141, 43, 62, 62,195,
- 2, 68, 65,110, 70,113, 81, 65,238, 29,130, 32,174, 75,165,210, 10, 3,117, 38, 80,169, 84,157, 89,150,229, 16, 4,177,153,162,
-168,105,179,102,205,242, 88,187,118, 45, 58,116,232,128,226,226, 98, 72, 36, 18,248,249,249, 65, 38,147,225,238,221,187,180, 66,
-161,216, 14, 96, 37,106,227, 71, 12,161,188,184, 18, 45,221,189, 26, 40,159, 44,203,130,165, 1,173,154, 6, 77,177,208, 16, 90,
-240,120, 90,240,249,124,115,148, 39,150, 97, 24,148,121,120,128, 73, 74,194,237,219,183,193,178,172, 65, 85,205,223,223,223,140,
- 7, 59, 3,129, 80,208,192, 93, 72, 16, 4,248, 2, 1,120, 2,126, 83, 51,103, 44, 42,150, 5,255,211, 48,215, 55, 94, 14, 96,
-198,163, 71,143,246,244,235,215, 47,142,101, 89, 30,106,252,145,191,255,153, 63, 47, 40, 40,120,112,243,204,131, 69,110, 45, 29,
- 98,222,154,220, 27, 29, 58,123,131,214,209,184,113,246, 33,126, 93,123,226, 96, 94,110,222, 52,152,177,246, 25,195, 48, 87,123,
-117,235, 64,162, 94,174,110, 79, 79, 79,230, 77,102, 29, 86, 84, 84, 44,159, 63,127, 62,190,248,226,139, 55,153,117,216, 36, 30,
- 63,145,205, 32,192,182, 28,241, 86,159,161, 32, 72, 86,163, 81, 27,121,240, 65,159,185,148,207,231, 61,189,151, 40, 13,110,234,
- 56,153, 76, 54,244,253,247,223,191,200,229,114,219, 52,167,206, 25,134,201, 46, 44, 44, 28,104,250, 72,221, 13,181,178,210,239,
-244,193, 29,115,207, 31,219, 53,148, 97,104, 95, 2, 0,135,203,127,174,165,168, 11,106,101,229, 38,152,185,168,244,186, 25,225,
-152,243,221,111,216,250,197, 8,204,138, 57,140,159,151, 77,199,162, 13, 7,240,237, 23,115,176,102,203,191,240,213,156, 73, 24,
- 59,241,125,134, 37,200, 63,204, 61, 15, 14,135,115,126,199,142, 29, 83,167, 79,159,174,159,180,192,178,108,131, 7,187, 86,171,
- 85, 50, 12,131,237,219,183, 51, 0,206, 27,179,215,176,141, 8,214, 88,188,148,185,109, 84, 89, 89,249, 65,120,120,248,110, 0,
- 66,150,101,159,149,149,149,253, 19,120,181, 52, 84, 85, 85,213, 7, 61,123,246,220,205,178,172,144, 32,136,215,246,155,131,218,
- 84, 15,221, 28, 28, 28,238,215, 42, 89,194, 55, 9,136, 55, 86,213, 70,220,138,230,184, 16, 25, 0,179,234,101,124, 95, 27, 26,
- 26, 90,127, 81,233,212,178,178,178,110,111, 80,174,139, 74,165, 50,112,217,178,101,115, 69, 34, 81,127,133, 66,209, 30, 0, 36,
- 18, 73,154, 90,173,190,170, 84, 42, 55,193,116,110, 42, 13,195, 48,105, 58,157, 46,200,197,197,165,102, 70,109, 45,217, 2,128,
- 83,247,233,251, 0,221,189, 70, 20,223,111,118,193,206,158, 61,219,218,193,193, 97, 8, 65, 16, 99, 89,150,245,151,203,229,234,
-101,203,150,221,140,141,141,173,104,211,166,205, 91,195,135, 15, 39, 28, 29, 29,113,239,222, 61,182,164,164,228, 40,128,197, 48,
- 99,166, 53,195, 48,217,235,214,173, 67,115,239,119, 99,251, 41,138, 42, 56,123,246,172,243,176,162, 34, 46,195, 48, 24, 49, 98,
- 68, 3, 2,215, 24, 79,159, 62,133, 90,173, 54,154,204, 81, 93, 81,134, 1,115, 23, 2,181,179, 63,235, 80,163,100,177, 96, 53,
- 22, 94,101,193,223, 11,255,238, 5, 61,205,146, 22, 61, 60, 60,198,139, 36,194,207,188,219,123, 4,231,103, 20,165,200, 43, 20,
-251,164, 82,233, 14, 3, 15,114,179,108, 54, 51, 97,169, 69,254,253, 55,217,124,149, 71,139, 6,203,210, 96, 25, 22, 44,203,128,
- 97,232,154, 5,175, 89, 6, 44, 77, 19, 4,129, 63, 52, 74,163,153,193, 27,151,211,193,217,217,121, 37,203,178,195, 56, 28, 14,
- 89, 95, 12,171,255,185, 86,201, 58, 47,147,201,190,106, 66,121,253, 63, 87,159,177,177,177, 77,146,127,115,103, 29,142, 27, 55,
-142,110,230,189,121, 85, 34,145,120, 52,181,175,186,186, 58, 71, 42,149, 14,249, 47,169,207,250, 51, 6,155, 99,179,217,179, 14,
- 77,217,244,246,246, 22, 82, 20,213, 5,128, 31, 65, 16,246, 0, 74, 41,138,186, 80, 92, 92, 92, 8,160, 27,128,101,181,191, 89,
- 5,224,254,127,248,126, 23, 59, 59, 59,239, 34, 73,178,165, 57, 63,214,233,116,154,210,210,210,169,141, 6, 4,122,155, 78, 78,
- 78,247,185, 92,110, 75, 51,236,188, 44, 41, 41,233,102,121,126, 90,108,254, 15,161,113, 16,188,193, 76,241,255, 14,162,101,177,
-105,177,105,177,105,177,105,177,105,177,105,177,105,177,249,191, 78,180,154,220,182, 76,171,181,192, 2, 11, 44,176,192, 2, 11,
- 44,248,115, 56,211,136,108,157,169,251, 64, 24, 97,165,205,145, 4,223,132,217, 94,178,216,180,216,180,216,180,216,180,216,180,
-216,180,216,252,219,217,180,224, 47,132, 69, 86,181,216,180,216,180,216,180,216,180,216,180,216,180,216,252, 95,135, 65,215, 33,
-105,169, 27, 11, 44,176,192, 2, 11, 44,176,192,130,127, 15,204, 38, 90, 18, 55,255, 0,103,239,224,221, 14, 45, 59, 37, 58,180,
-236,148,232,236, 29,188, 91,226,230, 31,240, 55,173, 55, 49,128,137, 92, 46,247,162,187,187,123, 37, 12, 44,189,243, 63, 0, 91,
- 0, 99, 81,147,223,103, 20, 0,171,191,210,120, 4,192, 29, 15,124, 54, 5,200,153, 2,228,140, 7, 62,139,248, 31,140, 27, 92,
- 49,219, 35,252,250,185,137,231, 86,204,246, 8,111,114,255,124, 15,167,219,191,141,251,110,237,103,158,142,127,209, 95,218,184,
-186,186,238,116,115,115,203,114,117,117,205,118,117,117,221, 5,192,206,242,184,179,192, 2, 11, 44,248,183,161, 46, 70,171,238,
-165,143,209,226, 2, 64, 92, 92, 92, 4,128,107, 0,250, 69, 70, 70,198, 55,254,181,131, 87,208,116,223,182,190, 95,172, 94,177,
-152,112,119,117,182,210,209, 12,149,153,149,219,113,249,234,152, 35,249, 2,238,198,178,156,164,159,223,160, 80, 4,135,195, 25,
- 47, 20, 10, 35, 1,212, 17,182, 84,181, 90, 29, 71,211,244, 33,152, 55, 77, 27,110,110,110,215, 57, 28, 78,235,230,252, 49, 77,
-211, 57,133,133,133,189,223,176, 50,199,121,121,121,237,138,136,136,176, 10, 13, 13,133, 64, 32,192,178,101,203,230, 75,165,210,
- 77,230, 26,112,112,240,177,161,132,162,207,185, 2,193, 96, 86,171, 9, 98,193, 2,164, 48,137,209,169, 47,243,213,234,141,101,
-101, 25,114, 51, 77, 45, 6, 48,173,182,174,126, 6,176,238,207, 92, 37, 83, 59, 67,171,165,107,174, 9, 62, 23,244,201, 23,118,
-215,150, 44, 89,194,141,140,140,196,207, 63,255,220,123,231,206,157, 31,203,229,242,203, 0, 78, 1,120,254,103,175, 74, 55, 96,
- 70,207,222,189,191,155, 58,127, 62, 71,121,253, 58,190,219,181,107, 51,106,242, 45,109,109,238,181,196,231, 99,172,179, 51, 47,
-146,101,209,133, 0, 8, 2,120, 40, 43, 97,206, 82, 20,125, 8,102,228, 98, 51,130,137,104, 56, 29,127,127,115, 13, 84, 60,103,
-151, 10, 71, 4,244,169,120,126,117, 41,128,183, 26,239,215,169, 68, 83, 89, 78,171, 72, 37,155,144, 11, 96,195,159,172, 86, 43,
- 23, 23,151,196,147, 39, 79,182, 12, 13, 13,229, 2,192,253,251,247,167, 68, 70, 70, 14,144,201,100, 65, 0, 42,255, 67, 15, 33,
- 17,151, 36, 63, 19,240,120,131,105,154,238, 4, 0, 28, 14,231,177, 70,171,189,168, 99,152,173, 48, 51, 39,155, 5, 22, 88,240,
-191, 11, 83, 92,228,191, 28, 6, 51,195,215,157, 28, 91,255,189, 62, 36,174, 29, 58,134, 13, 28,243,180, 66,174, 80,101,101,229,
-149,205,251,108,205,197,143,231,172, 63,177,225,167,184,179,241,119, 82,111, 7,132, 14, 73,145,184,118,232,104,192,180, 33, 31,
-174,151, 88, 44,126,176,109,219, 54, 42, 45, 45,141, 45, 47, 47,103,159, 62,125,202, 30, 61,122,148,253,228,147, 79, 84, 98,177,
-248, 1, 0, 47,115,108,186,185,185, 21, 62,189,242, 27,251, 50, 49,129,205,190,127,135,213,106,181, 44, 69, 81, 44, 69, 81,108,
-202,249, 56, 54,241,212, 49,246,225,209, 67,172, 70,163, 97, 53, 26, 13,171, 86,171,217,182,109,219,230,155, 89,206,198,240, 12,
- 12, 12,212,196,197,197,177, 71,142, 28, 97,231,207,159,207,134,132,132,208, 0,102,154,123,238, 18, 87,191,254, 54, 45,130,101,
-211,163,182, 82,103,110, 94, 96,147, 95, 60,100,147, 95,164,179,177,151, 82,217,105, 11,182, 80, 54, 45, 66,100, 18, 87,191,254,
-166,206,221,193,193, 33,140, 32, 8,182, 14, 0,216,214,173, 91, 87,213,127,121,121,121, 53,120,181,106,213,170,170, 77,155, 54,
-207,157,156,156,186, 52,101,115, 66, 39,176,108,202,126,150, 77,217,207, 46,233, 11, 54, 57, 57,249, 54,203,178,215,234, 94, 74,
-165,242,218,241,227,199,175,189,251,238,187,215, 0,188, 99,164,158,204,170,207, 41, 64,142,252,228, 73,150,221,180,137,101, 35,
- 34,216, 84,128,157, 2,228, 52,211,102, 91,119,119,222,195,245,235, 62,214,156, 60,249, 43,123,238,220, 25,246,236,217, 56,246,
-196,241, 93,236,230, 77,159, 81,110,110,188, 36, 0,237,154, 97,147, 11, 96, 13,128,141,168, 81, 46,211,100, 50, 25, 91, 80, 80,
-192, 2, 72,171,253,110,163,139,139,203, 6, 52,173,190, 13,170,175,100,205, 29,230,126,238,189,183,122,179,242,138,124,246,189,
-183,122,179,115,135,185, 55, 80,182,134,249,248,216,204, 26,209, 73,150,124,127, 31, 61,107, 68, 39,217, 48, 31, 31,155, 55,172,
- 79, 2, 53,235,132,110,187,114,229,138,142,173, 7,173, 86,203,238,217,179,135,118,112,112,248,181, 25, 54,219,187,184,184,100,
- 59, 58, 58,166,213,255,210, 37,120, 84, 79,255, 62, 83,150, 59,117,124, 55,162, 25,229, 12, 21,241,249, 47, 47, 30,254,145, 46,
-201,121,204,106,148,133,108,197,179, 4,246,101,234,109,118,207,142,141, 90, 1,151,251, 18, 64,232,159,185,150,154, 9,139, 77,
-139, 77,139,205,255, 66,155,198,184,200,255,101,112, 27,159, 96, 99, 8,133,130,168,229, 75, 22, 18,229, 37,229, 74, 85,165, 92,
-163, 85,169, 84, 36,159, 85, 61, 78,121, 81, 68,114, 57,229,115,231,204,182,137, 90,180, 36,170, 26,152,100,230,127,122,133,132,
-132,220, 61,118,236,152,171,163,163, 35, 42, 42, 42, 80, 82, 82,130,187,119,239,130,101, 89,140, 30, 61, 90,216,163,123,247, 46,
- 75,151, 45,187,245, 50, 47, 47, 28,134, 59,222, 87,228,197,209, 25,235,122,215,172, 69,251, 85, 86, 73, 77,175, 67, 16,216, 57,
- 46, 82,127,204,202,151, 53,171,101,136, 68, 34,253,130,196,111,128,240,129, 3, 7,242, 1,224,195, 15, 63,172,148,203,229,209,
-181, 10,135, 89, 43,173, 74, 92,253,250, 59,123,120,198,253,184,125,157,184,147,175, 31, 40,173, 14,217, 5,249,224,242,236,209,
-178, 37, 31,239, 79, 26,204,235,219,211,209,121,205,170,157,103, 10, 24,140, 82, 20,167, 95, 48,100,203,222,222,126,207,161, 67,
-135,112,248,240, 97, 0, 64, 90, 90, 26,252,252,252, 36,166,202,144,148,148,228,243,206, 59,239, 28, 44, 41, 41,105,103,234,216,
-198,137,241,133, 66, 33,122,247,238,141,142, 29, 59,226,228,201,147,253,106,149,173, 63, 5,229,245,235,176,126,244, 8,136,127,
-163,193, 75,219,174, 93,189,111,159, 61,179,207,249,204,217, 84,108,216,176, 11,207,159,215, 8,109, 62, 62, 62,152, 56, 97, 28,
-239,241,227,155,129, 99,199, 78,188,249,251,239,207,123,215, 18, 37, 83,248,250,167,159,126, 90,220,166, 77, 27,140, 29, 59,118,
- 92, 96, 96,160,187,173,173, 45,118,236,216, 1, 15, 15, 15, 31,141, 70,243,236,228,201,147,158, 5, 5, 5,152, 61,123, 54, 10,
- 11, 11,231, 27, 50,212,111,104,191,165,194, 17, 1,125, 58,116,157, 10,107, 91, 15,252,116,224, 16,158, 62,216,211, 71, 77,165,
- 46,229,211,241,147,149,172,112,154, 44,199, 58,170,117,183, 8,167,118,129,239,192,187,107,130,179,138,254,253,197,210,193,109,
- 99,184, 34,213,158, 21, 27,164, 37,175, 25, 29, 27,203, 9,170,124,226,152,116, 17, 37,192, 10,166,142, 96,233,213, 90, 22,239,
-244,237,219, 87,223,112, 89, 89, 89, 80,171,213, 8, 8, 8, 32, 53, 26, 77,127, 51,235,181,253,144, 33, 67,254, 56,123,246,172,
- 83,251,246,237,101,165,165,165,250, 29,238, 78,246, 67,227,143,109,158,189,230,187,127,249,239,101,137,114, 89,234,137,199, 38,
-108,133,246, 10,235,122,233,220,177,125,214, 68, 85, 46, 4,246,197, 0, 83,130,140,131,191,128,176,114,196,248, 79,230,113,251,
- 15, 28,208, 98,240, 91, 99, 46, 61, 77,127, 62, 16,192, 61,203,184,222, 2, 11,254,214,170, 22,251,191,118, 78,122,162, 21, 25,
- 25, 73, 52,117,130, 12,203, 4,187,185, 58,137, 55,175,223,125,143, 67,105, 52, 18,123, 59, 13,207,206,150, 33,108,236, 56,148,
- 70, 91,229,237,227, 45, 96, 88, 38,216,128,253,198, 83, 60, 9,177, 88,124,236,212,169, 83,174, 60, 30, 15, 12,195,192,197,197,
- 5,153,153,153, 40, 47, 47,135, 92, 46,199,243,212, 84,180,241,106,133, 21, 81, 11, 61,102, 47,140, 58,166, 80, 40,186,161,161,
- 27,241,181,105,163,180,182,225,186,209,117, 75,176,188, 54,228,175,253,174,137,125,230, 78, 69,205,204,201,201,129,181,181, 53,
-130,130,130,172,111,220,184,241,187, 17,146,213,192,166,131,131,143, 13, 35, 20, 28,222,246,227, 50, 49,165, 77, 66, 74, 70, 41,
- 58,180,233, 3, 55, 39, 47,228,151,106,112,251,238, 41, 36, 37,238,135,111, 11, 47,204,252,100,128, 40,102,221,145, 67,124, 93,
- 27,175,242,242,204,202,166,108, 86, 86, 86, 90,183,109,219, 22, 94, 94, 53,235,158,209, 52,141,148,148, 20,208, 52,173,223,174,
-255,190,251,232, 21,232, 42,179, 49,117,202, 20,148,148,148, 88, 55,101,147,199,129,110,222,199, 19,185, 98, 30, 32,144, 56,106,
-170,170,170,244,203,112, 80, 20,133,135, 15, 31, 34, 60, 60, 60, 34, 54, 54,214, 20, 43, 50,171, 62, 41,224,219,239,126,253,117,
-203,164,138, 10, 18, 0,126, 38, 8,134, 98,217,111,205,189,150, 92, 93,121, 71,207,159,219,235,204, 33,159,192,209,238, 27,220,
-189,155, 13,138,170, 41,111, 73, 73, 17,102,125, 86, 9, 62,207, 6, 39, 79,254,203, 41, 32,160,247,209,130, 2, 42, 8, 13,221,
-136, 77,149, 83,116,238,220, 57,204,154, 53, 11, 41, 41, 41,158, 28, 14, 7,119,238,220,129, 88, 44,198,250,245,235, 57, 1, 1,
- 1,158, 18,137, 4,231,207,159, 71, 97, 97, 33, 97,172,156,215, 46, 92, 91, 93,241,252,234,210, 2,226,252,176,159, 14, 28,194,
- 71, 19,198,195,157,205,248,221,206,151, 88, 61,100, 68,175,175, 88, 78,171, 72,137, 77,176,131, 95,208, 8,240, 5,214,152,249,
-229, 74,164, 37,157,118, 80,200, 19, 63, 35,232,220, 86, 43, 54,196,206,121,173,156, 71,198,209, 31,238,191,209,245,162,215, 61,
-239, 71, 15, 63,190, 35, 77,216,153,248,138,104,249,112, 9,146,182, 3,106,150, 79,121,246,236, 25,158, 63,127, 14, 46,151, 11,
-165, 82, 9,157, 78,215,100, 57, 61, 61, 61,103,232,116,186,175,106,219,121,183, 72, 36,250, 96,223,190,125, 78,245,137,182, 75,
-240,168,158, 78, 54,146,129,133, 69, 37,101, 55,239, 37, 63,157, 55, 99,108,191,235,183,147,114, 41,222,187, 57, 21,137, 39, 43,
- 12,212,167, 72, 44, 16, 28, 61,127,252, 95,214,218, 23, 87, 32, 9,232, 7,158,181, 31,104,109, 30, 20,101,213,144, 63,151, 66,
-253,227, 15,232,252,217, 92,156, 62,113,196, 58,176, 83,183, 88,181, 86,235, 7, 64,243, 6,247,102,115, 96,177,105,177,105,177,
-249,223,105,211, 32, 23, 97, 89,182, 43, 0,183,218,205,146, 90, 94,224, 12,160, 24, 53,171,200,184,213, 62, 59, 4,245,126,214,
-120,187,254,177,141,183,235,127, 46,169,253,236, 90,251,126,143, 32,136, 82, 19, 69,247, 64,205,210,132,103,106,223,129, 90, 87,
-162,201,192, 99,130, 32, 43,105,154, 17,242, 93, 92, 85, 31,190, 55,176,211,111,151,238, 63,180,114,182,229, 14,237,215, 37,226,
-238,227, 23,183, 8,146,208, 18, 4,105, 86,220, 7,135,195, 25,191,121,243,230, 78,182,182,182, 96, 24, 6,118,118,118,144,201,
-100,208,104, 52,168,168,168,128, 90, 94, 9, 74, 94,137, 71,185, 89,232, 21,209, 15, 99,134, 13, 9,248,215,137, 83,227,105,154,
- 62,104,204,174,103,112, 23,189,146,181,178,181,211, 43,105, 34,183, 92, 79,186,190,233,226, 7,190,181, 53, 6,207,139,250, 51,
-215, 64,194,153, 51,103,206,141, 30, 61,250,173, 5, 11, 22,144, 82,169,244,124,102,102,102, 47, 0, 41, 38, 73,133, 80,244,249,
-167,159, 71, 58, 56, 88,179,136,189,120, 10,125,187, 76,128,149,128,131,146, 74, 10, 4, 1,164, 38, 31, 3, 65, 56, 34, 49, 77,
-138, 62,157,109, 49,100,104,128,245,137, 35,169, 11,240, 42, 62,232,181,166, 41, 43, 43, 67, 81, 81, 17,180, 90, 45,180, 90, 45,
-198,142, 27,135,189,123,246,160,186,186, 26, 74,165, 18, 26,141, 6, 52, 77,131, 36, 73, 92,140,139, 69,238,139, 84,244, 12, 15,
- 7, 12, 44,189,180,231, 33,120, 0,110, 63,125,250, 20,169,169,169,120,249,242, 37, 68, 34, 17,220,221,221,177,114,229, 74,168,
-213, 53,107,148,141, 27, 55, 46, 2,192,227, 63,123, 67, 61, 7,118,102,210,244,210,183,142, 31,119,189,113,252, 56,115,251,244,
-233,151, 66,185,124,135, 57,191,229,243, 49,118,221,183,159,116,144, 72, 36,120,153,179, 25,254,254,124,204,159,235,132,232,111,
-138, 1, 0,179,103,181, 68,247,110,206,168, 44, 63, 2,103,215,197,216,178,101,142,239,180,105, 27,167, 40, 20,244,110, 19,166,
-151,158, 58,117,106,140,159,159, 95,139,132,132, 4, 66, 32, 16, 64, 44, 22, 67, 44, 22, 67, 36, 18,161,168,168, 8,153,153,153,
-236,186,117,235,242, 0, 44, 53,102,104,197, 22,233, 45, 0,111,205, 29,134,115, 79, 31,236,233,211,130,243,226,209,152,153,189,
-179, 18,111, 39,200,127,187,120, 99,149, 78, 37,202, 45,127,121,105, 97,219,238, 9,206,159,125,241, 53,126, 88,183, 28, 79,239,
- 92, 47,117,243,170,220, 42, 38,212, 77,150, 51, 34, 98, 5,215,195,205, 81, 55, 99,218, 24,251,211,110, 55,103,156,229, 18,178,
-130,226, 7,235,145,153,160, 20,182,235, 50,185,189, 15,169,185,114,229,138,184,111,223,190, 80,169, 84,122,101,114,223,190,125,
-140, 78,167,187,218,228,181, 73, 81, 95,229,229,229,121, 40,149, 74, 12, 27, 54,108,246,250,245,235, 37,117,107,212,209, 52,221,
- 64,201, 90,189,105,239,133,207,191,218,122,245,194,193,111, 60, 87, 71,125,208,111,210,204, 53, 87, 97, 96, 29, 73, 46, 73,126,
-118,250,248, 46,119,145,131, 22, 98,199, 33, 80, 21, 42,241,116,231, 71, 80, 84,170,208,125,245,215, 0, 4,208,104, 73,236, 24,
- 49, 22, 60, 39, 79, 44,159,254,129,231,146, 29, 63,125,194, 48,204,102,203,184,222, 2, 11, 44,104, 4, 55,130, 32,226, 0, 32,
- 42, 42,106,113,116,116,116, 50, 65, 16,113, 44,203, 70,214, 10, 40,113, 44,203, 70,214, 29, 83, 75,206, 94,219,174, 59,182,241,
-118,227,207,139, 22, 45, 10,140,137,137, 89, 27, 30, 30,126,240,230,205,155, 47, 0,152, 34, 90,195,107,137,213,107, 75,239,144,
-117, 12,178,254,123, 3, 69,139, 97,174, 63,123,145,165, 24, 50,168, 71,203,184,248,199,247,222,127,127,248,192,241, 35,250, 14,
-205,204, 41, 73,245,245,118,119, 78, 78,126,108,203, 48,204,117,115,106, 73, 40, 20, 70, 14, 24, 48,128, 91, 86, 86, 6, 43, 43,
- 43,200,100, 50,228,229,229,129,162, 40,168, 42,202,161,174, 40,135,170,188, 12, 84, 69, 25,158,223,191,139, 96, 95, 31, 97,109,
-176,188, 81,212,169, 46,141,149,170,250,202,150,192,198, 6, 66, 27, 27, 16,205,119, 27,190,107,111,111,127,187,174, 83,165, 40,
-234,179,133, 11, 23, 22, 51, 12,131, 53,107,214,216, 90, 91, 91,199, 2, 16,154, 50, 98,227,194,137, 12,239, 28, 68, 62,201, 76,
- 68,239,144,169,104,223,246,109,100, 22, 42, 81, 44,167, 80, 84, 78,161,123,223,239,209, 58,228,107,180,234, 28,141,212,236, 82,
-120,182,240, 35,193, 21, 26, 93,252, 57, 55, 55,183,193,246,193, 3, 7,160, 80, 40,224,235,235,139, 9, 19, 38, 96,225,194,133,
-152, 48, 97, 2, 60, 61, 61, 49,233,189,119,176,124,249,114, 20, 20, 20,152, 42,170,186,125,251,246,106,111,111,111,181,183,183,
-183,154,162, 40, 84, 85, 85,161,188,188,188,113,125,207,105,110, 69,186,186,186, 46,114,119,119, 79,116,117,117, 77, 22, 10,133,
-103, 31, 18,196, 19,149,183,183, 91,175,145, 35,137,142,239,189,199,201, 22,139,137,120,192,218, 28, 91,206,142,188,225,253, 7,
-188, 37, 40, 47,219,165, 23,169, 62,120,223, 5,127,196, 7,226,198,239,221, 48,235, 51, 95, 16,164, 8, 4, 41,128,162,250, 10,
-122,132,134,243,237,237, 9, 83,215,210, 68, 0, 15,123,245,234,229, 57,115,230, 76, 66, 40, 20, 98,246,236,217,212,244,233,211,
-211, 39, 76,152,144,126,249,242,101,218,219,219, 27,173, 90,181, 34, 90,181,106,229, 1,224, 97,237,111,140,194,214,151, 88,173,
-166, 82,127,183,247,147,188,160,225,220,179, 74, 43, 28,187, 98,131,180,100,245,182, 23, 27, 50,159, 42,124,158,222,185, 94,146,
-158,116,154,201,188,119,173, 56, 63, 93,238,179,122,219,139, 13,139,183,230, 55,121, 83,199,199,131, 57, 22, 23, 79, 41,170, 21,
-220,145, 35,250, 43,102,124, 56,190,189,163,117,224, 62,180, 24, 18,210,218,171,229,164,229,107,183, 80,211, 63,249,156,250,249,
-151, 93,172, 92, 46, 71,101,101, 37,182,108,217,162, 59,125,250,116, 30, 77,211,159, 27, 26, 3, 1,128, 86,171,197,140, 25, 51,
- 36,182,182,182,200,205,205,213, 43,162, 0, 32,149,149, 60,190,113, 47,233,201,188,127,142,139,168, 86,171,213, 23,174,221, 79,
-237,232,231,221,146, 32, 88,131, 19, 81, 4, 60,222,224,110, 61,122,112, 88,182, 28, 4,215, 11,207,247,172, 67,101, 65, 41, 42,
-139, 74,193,225, 73,160,131, 16, 90, 70, 0,251,224, 80,164,221, 75, 64, 11, 23, 55,174,144,199, 27,106,233, 79, 44,176,224,239,
- 9, 99, 92,164, 62, 89,138,137,137, 89,107,108,127,189,119, 77,163,109, 61,145,106, 76,194,234,127, 6,128,152,152,152,181, 44,
-203, 70,222,188,121,243, 0, 0,165,153,167,240,113,189,119,243,243,104,113, 84,154,232, 5, 11,151,194,193, 78,108, 23,218,197,
-207,253,228,249,248,251,215,111,222, 79,109,221,202,217,133,213,106, 28,190,221,248, 67, 75, 66,161,140, 49,179, 16, 1,206,206,
-206,160, 40, 10,207,158, 61,195,203,151, 47, 65, 81, 20,116,213,213, 80,151,151, 67, 85, 86, 6,186, 90, 14, 62, 77, 67, 41, 43,
-130,147,149, 8,120, 53, 35,209,132,242, 70, 52, 73,180,234,222, 69,182,182, 16,218,216,130,228,241,154,116, 43, 26, 64,215,208,
-208,208,195, 73, 73, 73, 61, 6, 13, 26,180, 10, 53, 83,228,179,243,242,242, 6, 46, 91,182, 76,237,230,230,134, 25, 51,102,116,
- 0, 48,213, 36,201, 20,104, 2,188,221, 59,160,189,207, 84,180,110, 53, 0,229,213, 90,200, 42,181, 40, 42,167,176,227,251,112,
- 28,253, 57, 20,127, 28,237,131,164, 11,131, 81,174,117,135,181,231,187, 96,105, 77,160, 49,155, 23, 47, 94,196,202,149, 43,177,
-106,213, 42,172, 89,179, 6,171, 86,173, 66, 94, 94, 30,130,130,130,144,147,147,131,115,231,206, 65, 42,149,194,217,217, 25,119,
-239,222,197,166, 77,155,240,199, 31,127,152, 60,233, 58,226,106,198, 49,205,242,165,235,116,186,105,210,145, 35, 59, 21, 58, 58,
-118,236,210,165,203, 91,179,103,207,246,233,213,171,151,126,191,143,143,143,151, 88, 44, 46, 64,205, 12,202,206,198,108, 49, 64,
- 23, 23,151, 32,104,212, 79,106,219,152, 7,130, 16, 97,192,224, 84,244,234,115, 31,148,150, 15,146, 16,130, 36, 69,208,233, 74,
-224,224,224, 9,150, 37,130, 76, 20,113,153, 76, 38,243,187,116,233, 18,153,153,153, 9,145, 72, 4, 0, 89, 43, 86,172,248, 97,
-195,134, 13, 41, 78, 78, 78,116, 92, 92, 28, 78,156, 56,129,200,200, 72,206,244,233,211,253, 90,181,106,181,221,212,121,175,216,
- 34,189,181,127,227,185,127,240,180, 14,157, 69,226,214,109, 80,109,253,238,167, 17,206, 18, 0, 56,159,145, 33,119,245,170,140,
-169,150, 39,230,216,183,172,250,230,124,134,169, 25,167, 43,152, 7,233, 79,110,239, 63,126,190,162,168,176,140,215,165, 83,160,
- 50,122,229, 23,252,214,109,218,125,187,124,225, 63,221,243, 42, 69,229,131,103,159,123,114,236,252,221,170,201,239,127,164,251,
-240,227,153,170,115,231, 47, 30,103, 24,166, 19, 12,204, 56,100, 24, 6, 82,169, 20,201,201,201,200,200,200,128, 76, 38, 67,113,
-113, 49,228,114,185,222,221,104, 37,175, 60,243,195,175,167, 31, 73,196, 98,171, 30,157,252,188,238, 36,164, 20, 73,196, 98, 43,
-191, 54, 94,237,129, 21, 77, 62, 71,104,154,238, 36,178, 18, 3, 32, 80,158,116, 29, 85,101, 85,168, 42,175,130,188,180, 10,106,
-138, 3,149,154,132, 82, 67,194, 59, 98, 8,170,170, 85,168, 42,169, 0, 67,211, 33,150,238,198, 2, 11, 44, 48,210,215,199, 69,
- 69, 69, 45, 54,243, 88,179,221,155,141,137, 87, 84, 84,212, 98,130, 32,226, 22, 45, 90, 20, 8,195, 19,170,234, 99,103, 19, 47,
- 0,102,164,119, 40, 41, 73,175,178, 33, 2, 70,207,253,242,171,115, 7,126,249,222, 85,173, 86,228, 56, 57, 88,211,214, 86, 2,
-231, 15,103,172,129,188,170,108, 84,181,249,233, 8, 80, 86, 86,134, 23, 47, 94, 64, 44, 22,131,207,227,129, 86, 42, 65, 43,171,
-161, 44, 43, 1, 73,169,193,167,105, 56, 90,137,225,237,233,142,214,110,238,102,217,124,118,229, 55,125,224,123,125,119,225,186,
-208, 0, 8, 36,214, 16,216, 88,227,211,184,107, 0, 0, 62,159, 15, 44, 91,101,150,104,210,162, 69,139, 83,251,247,239,231,203,
-100, 50, 60,124,248,240, 17,128, 10, 0, 54, 0,152,212,212,212, 75, 73, 73, 73,145,126,126,126, 0,224,107,202, 88,101, 49, 73,
-107,117, 44,114, 11,178,144,249, 50, 1,142,118,109,193,179,106,143,162,114, 10, 66,113, 91,104,213,175,188,143,170,202,108, 40,
- 41,142, 89,231,174,209,104,160,211,233,160,211,233,160,209,104,240,241,199, 31,227,198,205,155, 56,120,226, 50, 94, 60, 79, 67,
-135, 54,238,152, 50,101, 50, 66, 67, 67,113,243,230, 77,163,182,166,118,134,182,133, 53,184, 27,223, 34, 33,176,118, 82,135, 45,
-188,112,199, 20,217, 34, 8,130,133, 1, 87,100, 35,108, 8, 15, 15,111,151, 86, 93,141,228, 39, 79, 48,104,197, 10, 0,192,217,
-179,103, 27,156,203,188,121,243, 4, 41, 41, 41, 31,222,191,127,255,195,252,252,252,141, 0,154, 14, 54,103,129, 51,103,110,225,
-159,255, 76,129, 76, 38, 3, 0, 28, 58,240,138,151,102,190,160, 48,108,120,141, 71,203,222,222, 30, 27, 55, 6,153, 85,159, 52,
- 77, 99,231,206,157,122,119, 33, 0,112,185,220, 94,243,230,205, 27,221,212,241,237,218,181,227,155,178, 57,119,108, 11,209, 31,
-143,216,207,236,218,181, 14,180,117, 14, 70,137, 54, 33, 40, 33, 79, 58,107,238,216, 22,155, 55, 29,201, 83,137, 9,245,110,130,
-206,109,197, 21,169,246,152, 83,198,140,243,223,107, 74,188,167,237, 41,144, 85, 46,153,249,209, 68, 39, 91,123,215,234,159,127,
-136,118, 32, 57, 36,123,234, 62, 85, 30,232,227,100,255,110,216,119, 85,255,156,187, 44, 65,163,203,157,137,220, 83,105, 48,146,
-226,130,166,105,228,231,231, 67, 38,147, 33, 39, 39, 7,197,197, 53,238,215,226,226, 98, 48, 12,243,103, 30,136, 80,230,228, 32,
-251,248,207,104, 61,121, 50,186,175, 90, 9,154,225, 66,169,160,177,177,231, 64,148, 85, 40,161,102, 8,120,118,237,137,143,206,
-254, 14,146,165,129, 29, 91, 45, 61,137, 5, 22,252, 77, 97, 78,122,135, 58, 66, 20, 29, 29, 29,249, 87,255,127,125,178, 21, 29,
- 29,157, 28, 29, 29,221,156,255,106,236, 50,212,111,215,197,104, 93,171, 23,128,246, 90,167, 41, 47, 78,205, 72, 73,225,230, 87,
- 43,171,173,220, 92, 93,212, 86, 34, 33, 83, 81, 41,231, 36, 60,126, 68, 85, 23, 60,127,218,140,243, 72, 77, 74, 74, 10,202,207,
-207, 71, 78,118, 54,116,202,106,144,106, 13, 88,149, 2,131,122,247,132, 8,128,136, 36,192,103, 40,112, 57, 2,200,171, 42, 1,
- 32,213,100,231,168,213,190,166,108, 17, 4, 1,129,141, 13, 4, 18, 9, 4,214, 54, 13, 20, 46,115, 20, 27,161, 80,184, 63, 54,
- 54,214,163, 69,139, 22, 88,185,114, 37, 90,182,108,233,239,233,233,169,176,179,179, 19,187,185,185,161, 99,199,142,232,217,179,
- 39,206,157, 59, 7,152,145, 83, 74,171, 19, 37, 62,205, 66,175,226,210,155,248,253,218,143,208, 40,213,232, 18,241, 35, 40,219,
- 62, 66,105, 0, 0, 32, 0, 73, 68, 65, 84,110,107,184, 4,126, 13,230,217, 62, 40, 10, 78,214,168, 7,238, 35,240, 50, 39, 11,
- 4, 71,144,108,174,242, 84,247,249,209,163, 71, 56,112, 50, 30, 30,222, 1,200, 73,127,130, 39, 87, 47,225,134,139, 19,188, 3,
- 58,234,221, 64, 6,203, 72,131,187,122,107, 77,154,168,165,159, 77, 20,150,150,150, 10, 29, 29, 29,213,117,117,231,225,225,241,
-103,200,214,196, 5, 11, 22,160,156,199, 3,134, 15, 7, 63, 35, 3, 20, 69, 33, 44, 44, 12,221,187,119, 7, 0,132,133,133,129,
-203,229, 34, 56, 56, 24,158,158,158,216,186,117,235, 68, 67, 68,139, 36,240, 80,167, 43,241,247,241,241,209, 19,173, 61,123,101,
- 72,184, 63, 24, 4, 4,216,242,195, 51,253,177, 94, 94, 94, 40,144,102,128, 32,216, 36, 19,101, 92,229,238,238,190,204,195,195,
-195,103,195,134, 13, 28,145, 72,132, 79, 62,249,164,109, 85, 85, 85,235, 90, 41, 25,139, 22, 45, 2, 0, 44, 95,190, 28, 43, 86,
-172,128, 90,173, 86, 24, 50,182,103, 99, 39,207,162, 82,230, 67,182,202,106, 84,127,231,214,157, 6, 12, 29,132,182,126, 3, 48,
- 96,104, 14, 0,172,117,228,102,189,247,237, 18,251,227,246, 54,196,174,223,206, 95, 92,222, 59, 98,192,146,133, 85, 87, 87,127,
-179,179,220,100,204, 99, 69,246,110,249, 83,193,248, 77,223,111,223,187,233,171, 69,115, 68, 57, 50, 77, 89, 94, 25, 91,101, 45,
-228, 90,251,186, 17,214,179,190, 92,245, 34, 63, 63, 99, 62,114,207,155,156,105,201, 48, 12, 50, 50, 50,244, 49,125, 42,149, 10,
-213,213,213,200,205,205,213, 95, 51, 74,137,237,176,153,239,143, 8,169, 86, 42, 21,119, 30,167,231, 44,157, 61, 41,188, 90,169,
- 84,164,103,230,164, 1, 91,154,100, 99, 36, 73, 62, 86,200, 21,131, 20,229, 42,200, 30, 62, 69,203,129,222,208,234, 8,104,116,
- 52,100, 37,114,168,117, 0, 77,242, 16,248,222, 20,208, 4, 23,197,249,121, 32, 57,156, 71,104, 24,180,111,129, 5, 22,252,125,
- 96,148,139,212, 41, 90,225,225,225, 7,235,171, 78,117,159, 1,168, 97, 60,148, 71, 86,159, 76,213,185, 19, 13,253, 79, 35,187,
-230,226,181, 24, 45,147,233, 29,234,254,179,149, 93,165,231,186,229,147, 90, 50, 58, 93,135,162,226, 66, 29,151, 43,228,181,178,
- 83, 74, 75,115,204,255,119,181, 90, 29,119,233,210,165,145,131, 7, 15, 22,166, 63,126, 4, 77, 69, 5, 52, 21,229,224, 49, 58,
- 56,138,187,129,164,212, 32, 52, 26,180,240,103,160,146,139, 17,127, 35, 73,171, 86,171,227,204, 37, 90, 36,135,211, 48, 46,203,
-218, 26, 66, 27, 91, 8,173,173, 27,187, 22, 77,145, 2,171, 33, 67,134, 12, 12, 11, 11, 3,203,178,216,185,115, 39, 40,138, 18,
- 80, 20, 5,141, 70, 3,138,162, 80, 89, 89,137,189,123,247, 98,219,182,109, 55, 0,252,106,178, 51,211,105, 46, 93,184,120, 37,
-244,131, 73,145,188,179,113, 27,161,211,208, 80, 18, 45, 81, 93,173, 69,149,198, 10,180,211,100,160,240, 12, 56, 92, 17,194,131,
-219,226,228,145, 99, 20,116,234,203,102,178,240, 6,170, 80,110, 78, 22, 94, 62, 79,131,117,101, 1, 92,108,173,160,200, 72, 67,
-151, 41, 83,223, 72,157,104,213,170, 21, 24,134, 65,255,254,253,245,193,213,111, 74,182, 74, 74, 74,112,250,244,105,132,133,133,
- 33, 34, 34, 2,121,121,121,200,200,200,192,219,111,191,173, 63,230,209,163, 71, 72, 72, 72,128,175,175,113,145,176,184, 84,123,
-246,101,238,195,113,239,190,251, 46,255,246,237,219, 96, 89, 22,126,126,182,176,181,145,128, 32,133, 8, 8,112, 5, 80, 51, 6,
-232,215,175, 31, 42, 43, 51,116,101,101,236, 89, 19,167,187, 31,192, 9,141, 70,243,172,111,223,190,158,207,159, 63,199,220,185,
-115,185,135, 14, 29,170,147,146, 17, 21,213,112, 50,133, 82,105,216,117,223,161,147,255, 23,109,117, 14, 17, 34,113,235, 54,182,
-206,193,104,235, 55, 0, 0, 48, 56,242, 3,180,109,231,133,202,226,196, 54, 42,101,214, 40, 62,183,204, 33,113, 75, 94,138,120,
-120,208,251,170,162,107,233,168,113,157,154,108,118,101,250,161,194, 28,222,228,195, 39, 78,157,155,241,118,228, 59, 60, 45,173,
-211, 5,121,243,236, 99,143,159, 41,202,203,206,249, 14, 57,231,147, 94,233,127, 70, 85, 60,186,178,178, 18, 18,137, 4, 73, 73,
- 73,234,225,195,135, 11, 73,146,196,179,103,207,244, 68,203,213,217,177, 99,175,238, 65,254,171, 55,237,189, 32, 17, 10,133, 67,
-251,117, 11, 72, 73,207,126,201,178, 68,150, 65,181, 85,171,189,248,248,225,163,254, 46,158,237, 56, 25,215,110,195,169,207,219,
- 80,171, 73, 40, 53, 12,212, 58, 64,199,225,195,163,115, 15,216,251, 6,128, 5,112,239,246, 13,173, 90,171,189, 96,233,107, 44,
-176,224,111,173,106,177,198, 72, 82,237,231, 82, 0, 89,209,209,209,197,245,212, 38, 25,128, 71, 0, 66,106,143,147, 53,250,157,
-140, 32,136,123, 44,203,118,175,103, 71, 86,143,112,213,255,172,105,116,204,163,102,144,172,250,239, 13,137,150,161, 41,149, 0,
-224,236,236,236,218,165, 75, 55,223,159,126, 57, 12,150,101,241, 52, 97, 61,202,138,158, 96,217,218, 91,190, 45, 90,180,136,200,
-203,203,139, 55,167, 4, 52, 77, 31,218,181,107,215,252, 30, 93,187,116,105,211,178, 37, 30,101,101,130,207,210,224,211, 52, 72,
- 74, 13, 46,173, 65,203, 32, 26, 36, 97,141,252,252, 10,196,236, 63,156, 84,155, 37,222, 40,252,223,126, 7, 43, 95, 86,128, 32,
- 8,108, 8, 15,130,192,198, 26,124,137, 53, 62, 61,117, 69, 79,174,226, 86, 46,130,192,218, 26,190, 61,204, 74, 8,175,184,122,
-245,234,253,199,143, 31,119, 15, 10, 10,194,252,249,243,145,149,149, 5,134, 97, 80, 88, 88,168,146, 74,165,121, 50,153, 44, 11,
-192,113, 0, 63,193,140,204,227,124,181,106,115,220,209, 61, 51,195,123, 71, 56,191, 59,106, 27, 78, 28,153,135,242,138, 74, 40,
-116, 98, 84,171,116,168, 86,115,224,232,212, 9, 61,130,131,145,159, 87,132,228,219, 23,170,184,106,197,250,230, 92,160, 4, 65,
- 32, 33, 33, 1, 62,158, 54, 72,251, 61, 30,206, 86, 60,132,120,186,195,179, 87,111,125,126, 41, 99,224,113,160,155, 56,113,162,
- 62, 51,252,144, 33, 67, 50, 39, 79,158,236, 49,111,222, 60,252,242,203, 47,184,113,227,198,107, 1,218, 17, 17, 17,184,126,253,
-250,215, 0,150,155, 18,245, 52, 26, 13,252,253,253,113,239,222, 61, 92,186,116, 9, 3, 6, 12, 64, 68, 68, 4, 18, 19, 19,241,
-219,111,191, 33, 33, 33, 1, 4, 65,192,201,201, 9,218, 26,242,172, 53,100,140,162, 16,251,205,183,187, 22,111,218,180, 45,112,
-210,164, 73, 56,122,244, 32, 62,120,191, 3, 8, 82, 8,130, 16,226,157, 17, 29,176,114,213, 61,244,232,209, 15,206,206, 60,108,
-218,120,242,133, 82, 73,239, 53,163, 26, 87,255,246,219,111,158, 42,149, 10,229,229,229,172,181,181, 53, 81, 82, 82, 51,163,181,
- 41, 69, 75,161, 80,136, 12, 25,122,252, 32,117,125,185,156, 45, 99,171, 18, 70,149,234, 18, 58, 13, 24,154,139,193,145,239,227,
- 98,220,175,184,114,225, 18, 28,185, 89,153,144,200,207, 21,103, 22, 87, 74,171,253,182, 7,116,157,206,121, 89,125, 97,251,172,
-119,210, 56, 30, 30, 76,236,162, 31, 43,203,141, 17, 45, 0, 68,105,202,190, 83,199, 89,188,211, 51,188, 71,187, 32, 47, 15, 65,
- 89,113, 17,123,228,228,185, 36, 42,243,232,233,122, 4,139, 53, 65,212, 87, 70, 69, 69,125, 85,251,121,247,210,165, 75,167,199,
-196,196,184, 20, 20, 20,232, 99,180,138,138, 75,175,244, 28, 62,139, 46, 41,175,208,236,218,244,229, 88,177, 72, 40, 88, 26,179,
-235,154,150,131,219,134,236,234, 24,102,235,123,115,151,205, 73,127,154,208,162,181, 88,128,147, 95, 46,199,163,223,174, 66, 75,
-242,241,207, 75,119,160,166,104,148, 23,151,224,242,135,159,193,218,205, 1,219,174, 29, 45,100, 24,230, 71, 75, 87, 99,129, 5,
-127, 95, 24,226, 34, 4, 65, 52,149, 99,175,176,137,239,238, 25,251,157, 1, 59,127, 5, 12,102,133, 55,107, 10, 94,113,113,113,
-209,245,235,119,112, 45,110, 53,226,227, 86, 35, 57,225, 17,242,243, 52,200, 43, 84,193,214,214,246,150,145,159, 54,206, 28,203,
- 42, 20,138,209, 75,151,125, 85, 32, 18, 91,161,239,192,129,112,119,113,133, 21,159, 7,142,142, 1,135,224,161, 74,102,143,180,
- 68, 5, 22,238,218, 87, 84,165, 80,140,110,162,147, 24,100,136,100, 16, 4, 1,161,173, 13, 4,214, 54, 16,218,216, 54,112, 35,
-138,108,109, 33,178,177, 5, 87, 32,104, 42, 24,254, 53,155, 85, 85, 85, 99,198,142, 29, 91, 86, 81, 81,129,233,211,167, 35, 62,
- 62, 62,225,194,133, 11,182,137,137,137, 98,153, 76,214, 14,192, 16, 0, 59,140,144,172, 6, 54,203,202, 50,228,172, 78, 61, 62,
-250,171,207,149, 42,157, 19,198, 77, 61, 4, 9,153, 11, 29,205,128, 5,224,233, 40, 64,175, 65,171, 80,164,233,137, 67,219,215,
- 40, 24, 74, 53,169, 81, 14,173, 6, 54, 89,150,101,221,220,220, 94,171,131, 75,151, 46, 97,220,216, 49, 24, 58,106, 36, 92,218,
-248,192,117,208,219, 24, 58,253,159,216,190,125, 59, 72,146,132,179,179,115,227,142, 87,111,115,207, 67,240, 14, 60, 6,113,224,
- 49,136,221, 9,224, 2,152,178,111,223,190,111, 66, 66, 66,174,222,184,113, 99, 61,128,241,245,255,171, 30, 86, 52, 82,179,154,
-106,163, 37,115,230,204, 81,166,167,167, 67, 34,145, 64,167,211,225,198,141, 27,216,182,109, 27, 54,108,216,128,132,132, 4, 56,
- 57, 57,193,215,215, 23,106,181, 26,247,238,221, 83, 2, 88, 98,196, 38, 35,147,233,198,108,217, 18, 83, 18, 25,217, 7,187,118,
-253, 0,119,247,158,224,113,221,193,229,185, 64, 98,237,143,159,127,250, 6,111,189,213, 5,167, 78, 30, 46, 45, 46,209,141, 1,
-160, 51,227, 90, 82,221,185,115, 7,219,183,111,199,216,177, 99,243,198,141, 27, 71, 87, 84, 84,232, 21, 45,150,101,193,178, 44,
- 86,212,198,152,169,213,106,161, 33,155, 31, 45, 76,202,251,114, 77,242,202,194,130,188,176,248,171,183, 38, 94,185,112, 9, 47,
-210,175,224,202,133, 75,248,253,202,205,168,194,130,188,176, 46,161,237,249,163,167,207,252, 98,207,177,163, 28,107, 91, 15,236,
- 57,118,148, 51, 97,214,231,107,186, 13, 29,176,196,212, 53, 95,219,142,108, 85, 81,225,162,181,235,191,175,210, 81, 42,114,221,
-119, 91,243,149, 50,233,146,122,215, 37,107,234,250, 84, 42,149, 59, 84, 42,149,167, 74,165,242, 84,171,213, 75,178,178,178,250,
-206,159, 63, 95, 70,211,180, 94, 45,149,165,156,186,245,228,143,221,107, 93,157, 29,196, 61,187, 7,118,216,184,227,200,181,156,
-220,194,127,213,203,161,213, 84, 57, 85, 85, 74,213,152,145,163, 39, 87,151,151,169, 17,254,121, 20, 24,145, 53,212, 52,160,101,
- 57,208, 17, 92, 60, 94,189, 17, 98, 71, 27,236,207,124,160,168,208, 82, 99,208, 48,135,150,177,115,255, 51,176,216,180,216,180,
-216,252,239,180,249,127, 25, 30,104,184,214,161, 71, 3, 69,203,212,148,202, 22, 45, 90,244,125,247,157, 65,232, 23,185, 20, 44,
-203,226,201,131,111, 81, 38,123,138, 22,238, 66,100,228, 84,134, 3,136,111, 70, 97,114,178,114,115,195,230, 44, 89,122,108,220,
-144,129, 1, 65,109,218, 8, 91,183,246,134,196,213, 21,197,197, 50,252,113, 59, 69,187,230, 64,108, 82, 45,201, 50,203, 49,201,
- 48, 76, 77,144, 59,128,129,115, 22,130,224,112,128,218, 52, 14,117, 29, 99,155,238, 61, 65,112,185,160, 89, 6,106,181,218,156,
-217,114, 47,159, 63,127, 62,102,210,164, 73,151,227,226,226,200,161, 67,135,118, 62,126,252,248,159, 89, 51, 15,213, 69,233, 87,
- 1, 68,174, 89, 52,227, 80,216,128,145,182,126,129,221,248,221, 90,115, 64,105, 9,228,231,101, 35,238,216, 93, 42,229,206,133,
- 74, 86,167, 26,175, 40, 78,191,106,204, 22, 69, 81, 57,237,218,181,115,219,190,125,187, 62, 24,158,166,105, 20, 23, 23,227,214,
-173, 91,232,212,189, 7, 2,222,255, 16, 50,153, 12, 91,182,108,129,151,151, 23, 70,140, 24,129,210,210, 82,232,116, 58,115, 29,
-190, 52,128, 11,181, 47, 52, 34, 89, 68,237, 18, 64, 70,221,134, 62, 62, 62, 2,149, 74,213,153,101, 89, 14, 65, 16,155, 53, 26,
-205,180, 69,139, 22,121,172, 93,187, 22, 29, 58,116, 64,113,113, 49, 36, 18, 9,252,252,252, 32,147,201,112,247,238, 93, 90,161,
- 80,108, 71,205, 66,214, 50, 19,229,123,118,247,110,102,216,236,217,159, 30,251, 38,102,134,159, 74,221, 79,224,232,216, 27, 44,
-171,131, 76,150, 5,121,229, 13,106,213,202, 95,159, 23, 22,105, 71, 3, 72, 55,243,156,151,207,156, 57, 19, 0, 68, 0,150,102,
-100,100, 60, 12, 8, 8,240, 51,164,104,153,131, 77, 71,242, 84, 0, 14,140, 25,234, 57,183,178, 56,209,207,145,155,149, 25, 22,
-196,108,217,116, 36, 79,101,235, 89,189,186, 56, 43, 62, 77, 90,125, 97,251,158, 99, 71, 57, 83, 71,141,161, 91, 90,167, 71,137,
- 92,217, 35,102,152,102, 67, 66, 66, 90, 17, 68,105,219,162,146,167,247, 63,152, 62,227, 61, 59,190,242,108, 72,203, 18, 95,210,
-171,139, 40, 33, 33, 33, 19,205,156, 25, 90,139,180,188,188,188,190,139, 22, 45,186,192,178,108,131,216,132,162,226,210, 43,225,
-145, 51,217,242,242,138,135,178,212, 83,230,228, 82,187,123,247, 65,194,192,160, 78, 93,142,126,179, 54,198,173,223,156,249,220,
-180,171,215, 0, 90,139,236,248,107,160,133, 26,102,227,205,139,133, 21, 20, 53, 10,150,172,240, 22, 88,240,183, 87,179,140,113,
-145,255,114, 12,135,129, 96,120,179, 79,198,167,109,139, 11, 29,252, 90, 15,241,106,233, 2, 0,200,200,204, 71, 70,102,222,111,
- 25, 47,242,134,154, 96,188,134,166, 87,234, 23,149, 38,106, 83, 56,176,230, 45, 42,221,192,166,147,147,211,125, 46,151,219,178,
- 57,181, 65,211,116,126,113,113,113, 23, 51,203, 57,161, 77,155, 54, 49,217,217,217,199, 24,134,153,219, 76,182,223,164,205,186,
- 69,165, 73,174, 96, 16,171,211,116, 2, 0,130, 43, 48,103, 81,233,250, 54, 59, 89, 91, 91,239,224,241,120, 94,117,237, 88, 23,
-131, 69,211, 52,135,162, 40, 17, 77,211, 28, 0, 4, 73,146, 58, 30,143,167, 34, 8, 66,167,211,233,114,212,106,245, 12,188, 74,
- 56,106,236,220, 77,118,244,181, 68, 11, 77, 40, 90,151, 0, 32, 61, 61,189,189,131,131,195,120,130, 32,198,178, 44,235, 47,151,
-203,213,203,150, 45, 75,136,141,141,173,108,211,166,205,176,225,195,135, 19,137,137,137, 72, 74, 74, 98, 75, 74, 74,142,212,170,
- 88, 25,205,188,150, 72,161,144,243, 15, 71, 71,114, 56,203, 34, 4, 44, 8,130,196,227,138, 10,230,172, 66, 65,255,171,150, 48,
- 54,247,250,172,195,196,214,173, 91,255,154,153,153,201, 51,164,164, 26, 58,247,198,248,118, 73,224,210,240, 62,125,198,220,250,
-253,247,227, 95,174, 73, 94, 89,127,223,172,145, 14, 31, 76,248,108,206,183, 7,182,126,247,229,247, 39,202,118,153, 83,206,206,
-157, 59,251, 16, 4, 49, 30, 64, 16,203,178,237, 88,150, 16, 17, 4, 91, 70, 16, 68, 50,128, 68,141, 70, 19,151,146,146,242,242,
- 79,156,251,155,140,112, 13,217,212, 47, 42, 13,154, 14,166, 1,214,204, 69,165,255,127,151,211, 98,211, 98,211, 98,243, 63,103,
-243,255, 50, 62,110,226, 59,243, 50,195,215, 33,227, 69,222,208,140, 23,121,104,215,174, 29,251,236,217,179,102,145, 52, 67,157,
- 52, 77,211, 7, 21, 10,197,193, 63, 99,164,164,164,164,219,191,185,242, 14,100,102,102, 30,248, 43, 13,214, 18,169,149,181,175,
- 55,197,227,170,170,170, 30,230, 30, 76, 81,212,191,163,110,136, 90, 53,235,107, 67, 7, 12, 25, 50, 36,155,162,168, 75, 0,114,
- 9,130,176, 7, 80, 74, 81,212, 5,157, 78, 87,248,236,217,179,110, 27, 55,110,172,203,124,191, 10,192,253, 55, 44, 7,163, 86,
-211,251,243,243,233,253,255,134,115,220,175,209,104,230, 57, 57, 57,249,170, 84, 42,129, 74,165,226,215,159,124, 32, 22,139,101,
-198, 2,226,235,195,222,134,216,205,231,150, 57,217,219, 16,141,137, 20, 28, 91,224,168,178, 58,169,131, 99, 11, 28, 53,183, 96,
- 15, 31, 62,204, 8, 9, 9,217, 71,146,100, 27,150,101,221, 0,214,142,101, 33, 99, 89,182,152,251,255,216,187,238,184, 40,174,
-182,123,102,102,103,251, 46,176, 75, 93,138, 5, 20, 68, 64, 1, 11,246,136,154, 24,123,137, 88,162, 98, 47, 49,106, 98,212,168,
- 81,163,177,198,215,196,158,216,123,111, 81,176,247, 94,177, 43, 86,164, 55,169, 11,203,246,157,249,254,128, 37,168,148, 5, 77,
-222,228,253,246,252,126,227, 58,195,238,217,123,103,231,222,123,238,115,159,251, 60, 28, 78,210,227,199,143,147,254, 65,157,144,
-198,200, 48,139,141, 58,221,159,126,135,214,221,133, 86, 88, 97,197,255, 14,202,244,209,226, 84,150,233,197,139, 23,132,245,126,
- 90, 81, 82,108,149,247,199,184,184, 56, 45,128,171, 69,199,187,184, 13,160,203, 63,189,130, 41, 41, 41,193,101,253,205, 82,145,
- 5, 20,250,108, 1, 15, 75,141,206, 62,107, 69,118, 30, 86, 28,152, 84,217,178,221,187,119, 47, 30, 22, 46,177, 91, 97,133, 21,
- 86, 88,241,151,225,195, 45, 90, 86, 88, 97,133, 21, 86, 88, 97,133, 21, 86,148,138,181, 37, 4,215, 91,214, 45, 2,101,239, 28,
-168,204,218,107, 85,118, 31,156,182,114, 90, 57,173,156, 86, 78, 43,167,149,211,202,249,255,142,243,127, 21,239,137,172,191, 3,
-214,173,175, 86, 78, 43,167,149,211,202,105,229,180,114, 90, 57,255, 63,136,172,119, 15, 0,214,165, 67, 43,172,176,226,255, 49,
-246,238,221,107, 81, 82,209,190,147,215,119,150, 72,100, 51,242,149,185, 11,119, 45, 30,114,208,124, 61, 44, 44,204,100,189,139,
- 86, 88, 97, 5,170,226, 12,239,233,233,238, 71,154,152,230, 44, 75, 82, 44,201, 26, 8,165,122,247,171,236,236,183,194, 14,120,
-120,120,216,209, 36,186, 16, 44, 43, 38, 8,198,196, 80,228,149,152,152,196,199,149, 40, 24, 79, 38,147,125,205,229,114,219,233,
-116, 58,119,146, 36, 19,181, 90,237,233,130,130,130,149,120, 63,112,225,127, 13, 62, 62, 62,253,206,159, 63,111,215,162, 69, 11,
-173, 80, 40, 52,170,213,106,206,241,227,199,249, 29, 58,116,200,121,249,242,101,149,118, 36,186,186,186,182, 89,191,126,189,103,
-251,246,237, 81,187,118,109, 85,159, 62,125,184, 77,155, 54,229, 14, 27, 54, 44, 38, 57, 57,249,108, 37,233,252, 8,130,216, 74,
- 16, 4,197, 48,204, 64,252, 25,186,225, 99,131, 36, 73,114, 36, 65, 16, 61, 88,150,245, 34, 8,226, 21,203,178, 7, 25,134, 41,
- 47,112,107,121,248, 2, 64, 71,146, 36,131, 1,128, 97,152, 59, 0,142, 2,150,239,188,251, 59, 57, 69, 34, 81, 16, 0, 20, 20,
- 20,220,253, 88,156, 4, 65, 4, 1, 0,203,178, 85,229, 28, 44, 20, 10,135, 3,128, 90,173, 94, 7, 11,210, 65,189, 11,118,181,
- 47, 27, 60, 59, 26, 0,112,231, 71, 95, 0, 64,101,206,137, 81,209, 68,101,190,171, 52,190,202,112,148,130,142,253,251,247,159,
-191,125,251,246, 31, 1, 28,250, 43, 30,124, 23, 23,143,149,191, 44, 91,235,250,205,215, 67, 23,162, 48, 35, 68,249, 13, 18,248,
-148, 71, 81, 93,117, 38,211,165,199,192, 94, 0, 28,185, 92,222,143,199,227,181,210,233,116, 10, 14,135,147,162,211,233, 46,230,
-230,230,238, 68, 57, 25, 16, 44,190,175, 79, 32,211, 23,192,133, 96,254,204,243,198,146,208,114, 69, 72, 37,234, 34,251, 31,208,
-141,146, 0,198, 23,213,117, 3,202, 14,231, 81, 94,231,243,141,171,171,107, 15,165, 82, 89, 64, 81, 20,139,194, 93,207,133,255,
- 20,254,157, 96, 24, 38, 61, 43, 43,107, 96, 69, 92,226,106,168,195, 19, 19, 91, 77, 6,168,141, 90,118,180, 42, 1,209, 18, 15,
- 52, 99,129,129, 44, 80,147,164, 72, 71,134, 97, 82, 0,156, 37,141,136,200, 79,198,139,127,232,224, 94,189,232,190,214, 40, 58,
-167, 1, 56, 3,184, 15,224, 27, 0,249, 86,253,243,183,225, 93,103,248, 35, 0, 82,138,133, 86,137,112,247,173, 59,119,238,124,
-193,211,211,221,175, 87,247,158,243, 71,141, 28, 77, 80, 20,137,135,143, 30,113,190, 28, 56,248, 51,153, 76,230, 38,209,106,235,
-130, 32,152, 2,129,224,161, 82,153,155,180,119,231,118,169,111,157, 58, 38,147,137,193,234, 53,191,119,216,247,199,129,105, 22,
-138, 45, 31, 23, 23,151,173, 83,166, 76,113,233,218,181, 43,229,226,226,130,216,216, 88,187, 93,187,118,213, 89,177, 98, 69,239,
-236,236,236,129, 0,158, 85,161,178, 45, 93,228,228,103, 82, 33,209, 22,121, 38,228, 25,112, 38, 85,141,147, 0, 46, 85,245,238,
- 21, 20, 20,140, 45, 40, 40, 8,105,212,168, 17,187, 97,195, 6, 98,208,160, 65, 44, 65, 16,132, 90,173,222, 12,160, 74, 66, 75,
- 44, 22,175,106,223,190,189,183,183,183,247,171,151, 47, 95,118,220,179,103,207,209,240,240,112, 47,177, 88,252, 28,128, 79, 37,
-233, 54,101,102,102, 6,170,213,106,184,187,187,111, 0,208,224, 47,120,136, 8,138,162, 14,186,185,185,177,139, 22, 45, 58, 20,
- 24, 24,232,156,149,149,101,156, 52,105, 82,187,235,215,175,119, 48,153, 76, 93, 43, 33,182,100, 4, 65,172,113,118,118,118, 88,
-184,112,225,139,134, 13, 27,222,231,243,249,188,231,207,159,139, 38, 76,152,240,237,179,103,207,122,179, 44, 59, 18,168,212, 0,
- 33, 35, 8, 98,141,171,171,171,195,252,249,243, 99,131,131,131, 31,114,185, 92,238,243,231,207,197,223,127,255,253, 55,209,209,
-209, 85,226, 36, 73,114,117, 72, 72,136,236,199, 31,127,124, 82,167, 78,157,171, 20, 69,241, 18, 19, 19,201, 89,179,102,125,125,
-234,212,169, 48,134, 97, 70, 85,165,156, 78, 78, 78,178, 89,179,102, 61,105,218,180,233,117, 46,151,203,125,250,244, 41, 57,101,
-202,148,175, 95,188,120, 97,113, 57,229,114,121, 40, 65, 16,107, 83, 83, 83, 57, 0,160, 80, 40, 26,219,216,216,172, 40,153,211,
-210, 28,138,194, 96, 48,228,105, 52,154,254, 89, 89, 89,165, 6,194, 29, 52,117,121, 23, 0, 88,161, 55,159, 23,190, 86,116, 14,
-172,142,176,164,210, 65, 46,133,113,241,126, 81, 13,233, 14, 0,253,138, 82,133,255,162, 2, 56, 28, 14, 19,228,242, 13,123, 55,
-181, 82, 33, 99,186,181,105,211,102,214,217,179,103,127,111,221,186,245,247,219,182,109,115, 74, 72, 72,248,249,210,165, 75, 30,
-125,251,246, 29,116,230,204,153, 5, 25, 25, 25,251, 62,214,195,207,227,242,249, 4, 73, 64, 40, 16,217, 88,242,126,154, 36, 59,
- 95,237,214,109,248,186,167, 79,131, 87, 68, 71,123,170, 20,138,144,113,227,198, 57,247,236,217,147,244,240,240,192,139, 23, 47,
-236,183,109,219, 86,119,221,186,117, 61,114,114,114,198, 3,136,251, 16,145,165,202, 65, 61,173, 14,193, 44, 11,187,226, 6, 75,
- 32,135,175,199, 29,246, 9, 30,252, 3,196,214,204, 77,155, 54,253,248,226,197, 11, 44, 88,176, 0, 0, 86, 86,242,243, 19,186,
-117,235,214,233,192,129, 3,194,189,123,247, 10, 27, 53,106, 4, 23, 23, 23, 20, 77,166,138, 3, 83,123,122,122, 90,118,207, 24,
-252,178,244,232,144, 6, 15,179,142, 97, 85,207,212, 5, 66,119, 24,155,117,243,238,209,121, 80, 48,108, 29, 69, 16, 72, 56,200,
-201, 84, 6, 60,189,147,208,254,220,158, 23, 63,191,136,122,179, 80, 21,143,153, 40, 59, 38,223,127, 5,246,246,246, 27, 98, 98,
- 98, 66,197, 98,241, 91,215, 95,189,122, 21,228,237,237,157, 11,224,187,202, 10, 55, 71, 71,199, 29, 12,195,104, 51, 51, 51,135,
- 2,128, 84, 42,221, 46, 22,139,101, 41, 41, 41,211,254,170,137,140, 25,239,106,145,127,185, 69,171,216, 95,171,180, 92,135, 4,
-105, 98,154,143, 26, 57,154,232,211,175,111,234,139, 87, 49, 12,135,230,245, 59,126,226,132,200,207,207,143,212,174, 92, 9,227,
-155, 55, 48,124,251,109,179,211,167, 79, 27,194,250, 13, 80,211, 20,177,201,203,179,166,104,247,206, 93, 46, 7,246,239,107, 14,
-160, 34,161,197,115,113,113,217,122,254,252,121, 55, 79, 79, 79,228,228,228, 32, 54, 54, 22, 42,149, 10,189,123,247,166,155, 55,
-111,238,214,171, 87,175,173,185,185,185, 45, 42, 97,217,114,174,237,206,137, 28, 57,184,167, 79,135,207,154,139,221, 60,106,129,
- 77,213, 32,225,101,116,163,200,243,215,199,109,218,127,244,217,139, 92,182, 51, 74,207,141, 84, 46, 50, 50, 50, 38,247,232,209,
- 99,127,104,104,168, 35,159,207,135,171,171, 43,209,181,107,215,244,228,228,228,217, 85, 86, 45, 69, 41,108, 72,146, 52,149,124,
- 45, 37, 61,144, 37,112,151,201,100,144,201,100, 0,224,246,161, 51, 79, 59, 59,187,149, 82,169,180,151, 82,169, 84,147, 36,201,
- 18, 4,193,234,116, 58,161, 76, 38,187,247, 36,250,153,171, 86,171,173,189,120,233,186,101,109, 90, 6,218,156, 58,117, 10, 61,
-123,246,100, 79,158, 60, 57,210,210, 60,117, 4, 65,172,233,209,163, 71,193,140, 25, 51, 52, 47, 94,197,186, 61,121,246,138, 16,
- 11,120,140,131,131, 3,125,243,230, 77,206,146, 37, 75, 4,179,102,205, 90,195,178,108,175, 74,220,207, 53,125,251,246,213, 79,
-156, 56, 49,229,233,139, 24,167, 7, 79, 94,176, 18, 1,109,116,112,176,167,174, 95,191,206, 84,133,147, 36,201,213,147, 39, 79,
- 86,142, 28, 57, 50, 59, 51, 43,215, 37, 91,153,207,242,105,202,224,226,226,194, 57,116,232,144,118,199,142, 29,228,240,225,195,
- 87, 51, 12, 19, 86,137,251,187,186,107,215,174,121, 83,166, 76,201,121,254,234,181,203,131,199,207, 32,226,211, 6,103,103, 39,
-234,214,173, 91,250,197,139, 23,147,115,231,206,181,168,156, 98,177,120,203,158, 61,123, 56,135, 14, 21,246,125,215,174, 93, 35,
-189,188,188, 68, 37,223,163,214,104, 65, 18, 64, 70, 70,134,168,105,211,166, 91, 0,188, 23,220, 55,120,118, 52, 6, 77, 5,198,
-142, 29,155, 82,217,135, 37, 88, 49,174,194,247,152,126,247,101,151, 20, 12,233,206,225,112,152,225,195,135,167,190,251,119,141,
- 70, 67, 0,232,138,159, 45, 23, 91, 29, 59,118,252,225,200,145, 35,181,182,109,219,246,235,142, 29, 59,116, 0, 32, 16, 8, 28,
-118,237,218,181,160,119,239,222,232,221,187,247,140,125,251,246,125, 52,161,101, 98, 77,122, 0,224, 11,248,252,232,232,104,194,
-215,215,183,220,136,251,122,134,185,189,238,233,211,134, 95,249,250, 54,202, 98,152,218,220, 14, 29,242, 39, 76,152,144,161, 84,
- 42, 17, 27, 27, 11,189, 94,143, 65,131, 6, 81,173, 91,183,118,237,221,187,247,242,188,188,188, 47, 0,232, 45,120, 38, 23,187,
-185,185,141,200,205,205,205, 55, 91,117, 90, 12, 52,113, 90, 5, 25,249,245,107, 27,120, 92,202,200,237,242, 45, 67,156, 92, 73,
-168,124, 61,113, 25, 0,184, 5,120, 83,201,201, 64,169,176,113,135,167,137,198, 92, 71,119, 97,155, 55,113,234,159, 84,241,229,
-138,165, 47,196, 98,113,119,149, 74,181,175,104,112,246,233,220,185, 51,174, 95,191, 14, 0,205,139,132, 86, 27,146, 36,191,100,
- 24,102, 61,128,242, 82,185,141,235,214,173,219,167, 7, 14, 28,144, 2,192,190,125,251, 96, 48, 24,224,229,229, 5, 46,151, 11,
- 30,143, 7,154,166,139,179,131, 88, 8,133,163,163, 3, 28,108,105,200,228,226, 14,223,255,214,141, 83,205,207, 6,233,166, 71,
-200, 98,115, 96,100,181,224,218,139, 81,167,189, 29,130, 63,107, 67, 70,172,126, 56, 45, 98,213,147,134, 5, 36,186, 32, 14,218,
-127,202,200, 78,146, 36,255,254,253,251,112,117,117,125,235, 58, 69, 81, 0,208,170, 10,148, 51, 94,189,122,213, 52, 42, 42, 10,
-161,161,161, 51,234,213,171,247,249,133, 11, 23, 92, 50, 51, 51, 17, 26, 26,186, 60, 49, 49,241,208, 95, 93,167,146, 90,228,127,
-197,212, 69,190,163, 36, 91, 23,206,130, 73,138,162, 72,196,188,138, 53,132,134,182, 13,143,143,143,151,132,132,132,144, 52, 77,
- 67,117,246, 44, 52,183,110, 65, 34,145,160, 71,143, 30,244,197,139, 23,109,108, 36, 54,195, 94,199,188,206,163, 40, 18, 44, 75,
- 86,232,243, 32,147,201,190,158, 54,109,154,139,183,183, 55,140, 70, 99,113, 68,115,163,209,136,132,132, 4, 72, 36, 18, 12, 28,
- 56,208, 73, 36, 18,125,109, 97, 61,106,248,120, 57,221, 57,127,116, 77,131, 9,163, 58,138,125, 68,167, 32, 78, 24, 15,201,190,
-175, 80, 55,249, 56,166,116, 15, 17,159, 92, 53, 35,184,150,171,252, 78, 9, 19,171,197,208,106,181,151, 31, 62,124, 56,236,194,
-133, 11, 12, 0,156, 59,119,142,125,242,228,201,200, 15,153,133, 50, 12,131,156,156, 28, 48, 12, 67, 21,157,155, 95,255,171,207,
-131,141,141,205,234,207, 63,255,188,111, 92, 92,156,240,216,177, 99,246,241,241,241, 14,175, 95,191,118,244,241,241,225, 44, 88,
-176,224,136, 70,171,167, 12, 38, 86,103, 52, 25,242, 82, 30, 61,122,149,157,150,118,103,227,198,141,106,130, 32,122, 88,248, 29,
- 95, 40, 20, 10,251,169, 83,167,130,160, 69,141,235,212,173,231, 77,209, 66, 91,146,230,217,170,213, 26, 83, 76, 76, 76,194,212,
-169, 83,107, 6, 6, 6,186,162,112,121,205, 34, 78, 87, 87, 87,135,137, 19, 39,130,195,151, 6,213, 15, 12,174,197,227,139,165,
- 20, 45,148,134,132,132,180,126,245,234, 85,242,148, 41, 83, 20,141, 26, 53,170, 20,103,163, 70,141,100,195,135, 15, 55, 10,132,
-210,166,158,158, 94,117,235,251,215,237,228,227,227,211,157,195,225, 24,223,188,121, 19, 55,112,224, 64, 69,151, 46, 93,156, 43,
-195,233,228,228, 36,155, 50,101,138,209,163,186, 87,251,246,159,126,214,132, 43,148,218,114,120, 98,187,130, 2,141,233,233,211,
-167,113,211,167, 79, 87, 4, 5, 5, 57, 89,194, 89, 80, 80, 64, 59, 56, 56, 32, 32, 32, 0,126, 94, 94,200,205,205,197,129, 3,
- 7,176,105,211, 38,172, 95,191, 30, 59,119,238, 68,195, 22,159, 65, 42,149, 34, 57, 57, 25, 74,165,146,254,187, 31, 40,211,239,
-190,236, 10,221,136,174,163, 71,143, 78, 30, 62,124,120,170, 80, 40,100,222, 61,228,114,185,169,127,255,254,105, 3,191, 95,218,
-213,188,180, 88,129, 37,235,254,209,163, 71, 95,110,219,182, 13,126,126,126,104,223,190, 61, 15, 0,190,254,250,107, 94,239,222,
-189,177,103,207, 30,236,219,183,239,177,183,183,247, 21, 0,221, 44, 41,231,192,129, 3, 91,132,133,133, 93, 10, 11, 11,187,219,
-167, 79,159,181, 35, 71,142,124,107,228, 74, 73, 78,188,173,211,233, 16, 24,220, 72, 52,103,195,141,254, 21,241, 61, 1,182,173,
-141,142,222,180,240,209,163,184, 25,126,126,118,213, 95,191,150,111, 94,188,216,193,156,164,219, 96, 48, 32, 33, 33, 1, 50,153,
- 12,253,251,247,119,224,243,249, 3, 45, 40,230,146,110,221,186, 13,142,143,143,151,172, 91,183, 78,113,247,238, 93,215,148,148,
- 20,197,153,211, 39, 28, 39,125,247,181,212, 86,194,227, 37,191, 97, 9, 0,120,157, 12,113,116, 12, 90,176, 44,236, 74, 46, 39,
- 86, 9, 10, 8,133,238, 88, 81,171,133,221,179,137,123,130,250, 76,137, 12,118,144, 41,248, 83,203,249, 68,253, 69,139, 22,237,
-141,136,136,232,215,162, 69,139,253, 0,132,165,188, 71,208,176, 97,195, 3,123,246,236, 25,220,178,101,203,203, 0, 2,202,156,
- 69,186,187,247,248,227,143, 63,236,205,231, 14, 14, 14, 16, 8, 4,239,137, 44, 46,151, 11,146, 36, 43, 93,189,121,187,250,113,
-228,117,181,120,152,125, 20,123, 22,221,199,162, 14, 79,153,249,205, 94,107, 87, 14,140,198,201, 61,247,145,142,251,232,248, 85,
- 45,244,155, 30,216, 78,100,194,220,127,210, 0,254,230,205,155, 47, 91,181,106,181,183, 99,199,142,218,168,168, 40,188,121,243,
- 6,110,110,197,115,237,212, 42, 80,202, 69, 34, 17, 60, 60, 60,224,237,237,221,239,226,197,139, 46, 6,131, 1,175, 95,191, 70,
-122,122,250,157,191,163, 78, 37,181,200,191, 12,239, 58,194, 31,121, 79,104, 21,229, 22, 58, 15, 0, 44, 65,168,238, 63,124, 72,
- 83, 60,222,128,237, 59,118,240,185, 92, 46,226,226,226,240,248,241, 99, 20,156, 57, 3,245,213,171, 72, 75, 75, 67,126,126, 62,
-156,157,157,177,102,195, 6,177,206,196, 14,121,250,236, 25,197,146,108, 73,127,131, 82,183,120,242,249,252,118, 61,123,246, 44,
- 83,144, 37, 39, 39,163, 99,199,142, 52, 69, 81,165,237,106,120,151,147,112,117, 36, 34,206,236,159,163, 80,240, 30, 3, 47, 38,
- 0,121,119, 0, 86, 11, 24,117, 64,210, 3,224,200,108, 84,207,143, 38, 78,204, 9,119,113, 19,113, 34, 74, 81,202, 21,109, 69,
-245,242,245,245, 93, 63, 96,192, 0, 18, 0,218,180,105, 67,248,250,250,174, 5,224, 85,206,103, 78, 87, 48, 72, 94,207,206,206,
- 70,239,222,189,237,107,213,170,117,186,119,239,222,246,230,235, 85,229, 52, 91,147,253,252,252, 50, 5, 2,193, 78,192,162, 14,
-182,152,211,206,206,110,101,199,142, 29,123,237,216,177,131, 11, 0,231,207,159, 71, 68, 68, 4, 30, 61,122,132,231,207,159, 51,
-193,193,193,142, 75,215,239, 93,189,242,247, 45, 75,186, 55, 15,116,109,221, 56,184,174, 36, 63, 59,223,217,217,185, 57,203,178,
- 94, 22,150,179,227,236,217,179, 31, 63,121, 25,103, 75,114,104, 14,151,230,240,109,108,196,206, 50,169,216, 93, 46, 18,184,241,
- 73, 66, 82, 80, 80,144,186,115,231, 78, 6, 64, 71, 75, 57,231,204,153, 19,243,228, 69,156, 29, 65,114, 56, 52,135,230, 74, 36,
- 34,187, 14,237, 67, 27, 1, 0, 23, 44, 87,169, 84,166,109,218,180, 73, 95, 25,206, 31,127,252,241, 97, 86, 78,190,140, 67,211,
- 52,135, 67, 21,223, 75,177, 80,232, 40,226,243,121, 90,173, 54,105,217,178,101,234,202,112,206,158, 61,251,241,211,151,241,114,
-146, 32, 40,130, 32, 57, 54, 82,177,189,189,173,200,209, 81, 34,116, 16,113, 40,158, 82,169, 76,218,186,117,171, 69,156,122,189,
-158,155,150,150,134, 39, 79,158,192,163, 81, 35,156, 58,117, 10,213,170, 85, 67,239,222,189,209,183,111, 95, 8,133, 66,180,105,
- 90, 15, 83,167, 78,197,203,151, 47,161,215,235,249,165,113,154,253,164,222,133,171,171,107, 84, 69, 15,207, 59,159,125,171,156,
- 65, 46, 96, 87,232, 70,116, 45, 41,176,202,226,151,203,229,166,210,172, 93,239,114,118,236,216,241,135, 51,103,206,212,218,186,
-117,107,215,129, 3, 7, 94,222,186,117, 43,154, 52,105,130, 39, 79,158,160,102,205,154,216,188,121, 51,250,246,237,123,121,249,
-242,229, 93,163,162,162, 2, 61, 61, 61,167, 85,196,217,167, 79,159, 49, 65, 65, 65,103, 83, 83, 83,155,102,101,101, 5, 28, 56,
-112, 96, 72,143, 30, 61, 98,250,245,235,215,182, 88, 48, 26, 12, 59,142, 28,222,143, 78, 93,123,162,142,127,192,234, 65,211,182,
-213,171,160,109,178,143,128,181,155, 82, 82,222,236,208,104, 10,122,211,180, 72,116,227,134,124,223,239,191, 59,148,204, 44,144,
-148,148,132, 46, 93,186,208, 92, 46,183,101, 5,229, 92,212,189,123,247,222, 7, 14, 28,144,153,173, 58, 87,175, 94,197,131, 7,
- 15, 16, 27, 27,139,156,156, 28,180, 29,153,143,209, 11, 10,185, 71, 47, 96,241,217,215,172,184,138,125, 72, 49,132,213,224, 98,
-111,195,185, 50,100, 89,157,175, 71,172,246,227, 72,228, 52,182,127,255, 28, 25,175,181,251,202,224, 36,154, 54,109,186, 45, 44,
- 44,140,208,233,116,208,233,116, 58, 0,165, 70,245,117,115,115, 19,212,175, 95, 31, 35, 71,142, 36,109,108,108,150,151, 85, 78,
-149, 74,165, 61,122,244, 40, 6, 14, 28,136,241,227,199,163,118,237,218,144,201,100,160,105, 26, 91,182,237,118,232, 59,100,148,
- 79,131, 22,173, 2,253, 26, 52,169,159,167,165, 26,209, 66,217,240, 50,172, 33,165,214, 61,223, 41, 10, 15, 95, 95,195,138,174,
-137,204,205,205, 5,249,147,190,252, 79,244,211, 11,105,143,166,133,173,125,200, 94,107,150,177,237,155,120,164, 25,158,160,101,
-239,234,240, 12,146,125, 43,246,128,111, 85,239,167,133,168, 20,103,189,122,245, 90,220,188,121,147,223,170, 85, 43,196,197,197,
-129,166,139,231, 83,166, 15, 41,231,236,217,179,249, 26,141, 6,247,238,221, 67,120,120,120,146, 94,175,255,246, 67,202, 89, 25,
-139,150, 89,139,252,203,176,246,157, 35,165, 44,139,214,108, 0, 48, 48,136, 24, 16, 62,164, 32, 50, 50, 82,196,227,241, 16, 23,
- 23,135,148,148, 20,108,217,180,201,212,198,201, 41,175,189,155,155,114,203,166, 77,172, 78,167, 3,203,178,240,245,245, 69,175,
- 94,189,132, 95,244,238,151, 78, 40,213,187, 45, 88,230, 81,152,215,215,135, 12, 25,242,222,223, 39, 77,154, 4, 27, 27, 27, 16,
- 4,225, 98, 65,229,194,198,205,238,238, 46,243,180, 75, 99, 83,183,100,129, 18, 0, 28, 41,192,177, 1, 4,182, 0, 95, 10,240,
- 68,208, 70,157,205, 34,217,246,177, 61, 91, 14,117, 3, 80,153,165, 30,184,186,186,206, 56,123,246,172, 99, 84, 84, 20,171, 84,
- 42,145,146,146,194,206,159, 63,223,209,213,213,117, 70, 85,127,145,228,228,228, 57,157, 58,117, 74, 11, 15, 15,183, 61,126,252,
-184, 71,120,120,184,109,167, 78,157,210,146, 7,149,255,129, 0, 0, 32, 0, 73, 68, 65, 84,147,147,231,124,200, 47,205,229,114,
-169, 71,143, 30,201,231,206,157,219, 23,192,109,127,127,255, 76, 55, 55,183,219, 40,116,154, 44, 23, 82,169,180, 88,100,153,173,
-107, 28, 14, 7, 52, 77,195,213,213, 85,151,149,149,101,106,217,192, 75,232,107, 75, 26, 92,249, 92,161, 92, 40,112,151,218,216,
-134,100,102,102,222, 39, 8,226,149,133, 75,124, 65,141, 27, 55,166, 77, 44,205,140, 30,208,198,245,235,193,161, 78,191,205, 29,
- 94,109,217,156, 17,110,139,102, 13,243,157, 51,185,127, 40,201, 48,154,154, 53,107,186,152, 29,218, 45, 48,159, 7, 55,108,216,
-144,195,128,198,147,103,177,105,113,137, 73,121,159,182,110, 90,108,185,244, 11, 10,110,239,232,232,216,202,215,215,183, 33, 65,
- 16, 22,109, 73, 22, 10,133, 65,117,234,212,225,144, 20, 77,216,203,164, 30, 82,137,208,185,120, 9,197,206,174,153,220,209, 49,
-140,100,217, 92,133, 66,225, 36, 20, 10,131, 42, 81,119, 14, 3, 46,156,157,228,182,142, 14,118,146,246,161,205,107, 55,109,214,
-212,167, 94, 72,147,166,254, 13, 26,126, 65, 24,141, 74, 47, 47, 47, 39,179,147,124, 5,150, 86,193,142, 29, 59, 48,119,238, 92,
-212,175, 94, 29,110,110,110,112,114,114,194,213,171, 87,113,243,230, 77,200,100, 50,164,167,167, 99,241,226,197, 56,120,240, 32,
-244,122,189,180,178,207,147, 37, 98,171, 60, 24,141, 70,242, 93,129, 85, 22,191, 80, 40,100,204, 78,242,101,225,232,209,163,219,
-204,150,172,111,190,249,166,197,210,165, 75, 47, 71, 71, 71, 67, 34,145,224,230,205,155, 24, 50,100,200,229,229,203,151,183, 24,
- 53,106, 20, 54,109,218,132,152,152,152, 13,229,241,245,233,211,103,214,176, 97,195,150, 93,184,112,129,116,118,118,134, 76, 38,
- 67,247,238,221,177, 97,195, 6,142,209,104,220, 24, 22, 22,118, 55, 44, 44,236,174, 41,225,228, 15,123,215,207,191,250,240,254,
- 93,140, 25, 55,145,167, 51, 26,166, 88, 80,125, 86, 45,145,228, 25, 91,181,202,218, 99, 48, 20,244,225,114, 69,182,119,239,202,
- 35, 54,110, 44, 22, 91, 83,167, 78,133,173,173, 45, 80,232,192,140,114,172, 58, 35, 14, 30, 60, 88,220, 31,218,219,219,131,199,
-227,129,203,229,130,166,105, 80, 20,133,211,171,197,248,125,106,161,190,248,125, 42,129,147, 43, 9,213,135,252,118, 34, 55, 4,
-200,156,121,119,191,218,236, 31, 24,208,214, 30, 87,119,165, 98,126,167,168,196,155,123,222, 76,208,164,227,151, 50, 62,214, 96,
-210,164, 73,126,233,233,233,184,117,235, 22,110,221,186, 85,150, 5, 72,115,248,240,225,159,243,243,243,225,233,233,137,110,221,
-186,181, 2,208,168,140,118,131,134, 13, 27,162, 75,151, 46, 8, 13, 13, 69,253,250,245,161,211, 27,233,176, 1, 35,234, 60,138,
-121,227, 54,127,241,124,209,217,115, 7,200,203,151, 47, 80,219,246,159,180,109, 26,250,217, 50,174, 84,113, 29, 66,123,133, 37,
-245, 44, 48,101, 34, 72,209, 1,107,207,140, 35, 87,156, 15,151,108,137, 88,225, 37,149, 74,137, 59,183,238, 26,182,172,218, 19,
- 31, 32,238,150,126,125, 87, 38, 10,136, 84,180, 29,236, 73, 50, 64,175,127,202,200, 46, 16, 8,150, 94,184,112,193, 69,175,215,
-227,225,195,135, 24, 63,126,188,230, 3, 41,139, 13, 32, 30, 30, 30, 56,127,254, 60,250,247,239,175, 73, 75, 75,187,246,119,213,
-169,164, 22,249, 95, 1,167,132,130, 44, 70, 66, 66, 66,142, 76, 38,115,171, 83,167, 14,169,211,233, 10,151, 36,246,237, 51,173,
-223,184,241,136, 70,163, 25, 7,128,187,242,183,223, 86,187,185,187,135, 14, 24, 56,144, 48, 24, 12,232,212,169, 19, 47, 50, 50,
-210,254, 85,122,122,158, 5, 3,206, 91,223, 55,104,208, 32, 44, 93,186, 20, 0, 48,118,236,216, 98,211, 58, 97,129,195,146,196,
- 22, 29,219,119,110,104,147, 32, 94, 97,163,111,102,200,175,241, 82,122, 93,156, 47,108, 8,146,199,129,128, 2,163, 55, 24,159,
-167,247,184,253,242,121, 93, 63, 97, 86,102,205,118,254,159, 96,253,169,173, 29, 11, 76,154, 61, 22,119, 56, 34, 81, 99,137, 68,
-130,219,183,111,103, 53,108,216, 48,135,101, 89,219, 57,115,230, 56,136, 68,162,198, 31,112,239, 95, 63,123,246,172, 85,243,230,
-205,191, 38, 73,178, 29,195, 48,167,211,210,210, 86, 2,120,109,225,231, 71, 3,248, 17, 64,241,204, 82,167,211,129, 36, 73,176,
- 44,139, 62,125,250, 96,234,212,169,126, 15, 30, 60,192,217,179,103,229,237,218,181,187, 14, 32, 7,192, 80, 0,165, 90,205,148,
- 74,165,250,230,205,155,194,179,103,207,130, 97, 24,200,229,114,216,216,216,128,207,231,163,123,247,238,146, 41, 83,166,180, 61,
-113,226, 68,186,178, 70, 53, 74,144,146,164,226, 75, 36, 82,184,184,181, 28,213,239,203,104,150,101, 15, 86,162,115,224, 9, 57,
- 70, 13, 97,210,146,139,102, 46, 39, 69, 92, 46, 33,224,114,192,103, 10,240,195,207,243, 8, 46,107,226,160,146,235,243, 92, 46,
-151, 43,229, 67, 71,241, 40,131,136, 0,251, 49, 26, 7, 69, 81, 60, 1,183,108,127, 12,154, 36, 73,146, 36,185, 0, 44, 78,218,
-199,231,243,185, 82, 62, 91, 38,167,144, 34, 40,130, 32,120, 40, 99, 39, 90,144, 11, 88,179, 21,137, 55,238,149,182,164, 40,110,
-217,178, 37,142,156,189,141,125, 17,167,145, 17,119, 31,211,191,255, 6,141, 26, 53, 66,100,100,100,185,101, 50,251,104,149,101,
- 93,118,117,117,141, 74, 78, 78,110, 80,214,103,203, 91, 50, 44,195, 74,245, 62,255, 76, 91, 4,207,142, 70, 5, 62, 90,221, 90,
-182,108, 57,102,199,142, 29,186,207, 63,255,156,215,167, 79, 31, 4, 4, 4,180, 24, 60,120, 48, 0,160, 93,187,118, 88,186,116,
-105,139,193,131, 7, 99,247,238,221, 56,112,224,128,182,117,235,214,223,159, 63,127, 62, 9,133, 59, 58,223, 3,195, 48, 93,214,
-172, 89,243,174,165, 16, 70,163, 17, 6,131, 65, 97, 52, 26, 21, 69,125, 17,150, 45, 91,158,113,242, 68, 36,190,159, 54, 27, 78,
-142, 46, 65, 22, 62, 67,196,160,137, 19, 51, 54, 47, 94,140,197,187,119, 99, 98,205,154,162,173,143, 31,227,164, 70,131, 61,103,
-207,102, 20,125, 79,133,190,153, 42,149, 74,125,244,232, 81,155, 61,123,246,192,206,206, 14,181,107,215,134, 92, 46, 7, 77,211,
- 32, 41, 33, 40,174, 12,117,252, 27, 3,184, 9, 0,168,233, 10,149,175, 39, 46, 19, 4,114, 88,178,242, 62, 69,252,106,168,225,
-224, 46,184, 48,102, 83,128,157,141, 19, 23,199, 87,198,227,196,138,132,131,154, 12,252, 10, 35,158,162,108,159,175,134,158,158,
-158, 72, 79, 79,199,209,163, 71, 85, 64,153,130, 12, 12,195,252,252,219,111,191, 77,154, 54,109, 26,223,215,215, 23, 0,130, 0,
-220, 42,237,189, 98,177, 24,110,110,110,197,194,178, 79,248, 40,175,145, 19, 70, 9,123,124, 22, 10, 14,199, 1, 57, 42, 3, 50,
-243, 12,144, 57, 72,240,253,132, 48,193,233,134,110,141,214, 44,223,126, 88,173, 70, 35,224,253,254,128, 32,112,235,198,253,203,
-245, 4,190, 0, 65, 2, 9,228, 57, 16, 32,144, 79, 24, 64, 80, 20,107, 50,153, 16, 31, 31, 15,150,101,209,191,199,144,132, 17,
-243, 15, 56,181,232,175,132, 71, 29, 87, 16, 44, 62,249,167, 8, 1,123,123,251,160,204,204, 76,188,126,253, 26,225,225,225, 73,
- 25, 25, 25,167, 84, 42,213,144,228,228,100, 0,200,170, 2,101,177,152, 15, 10, 10, 66,227,198,141,209,187,119,111, 65, 65, 65,
- 65,152,151,151,151,219,155, 55,111,154,253,149,245,121, 87,139,252, 79, 9,173, 82, 27,154,193, 80, 71,187,122, 53, 84,167, 79,
-131,119,242, 36,246,184,186,230,107, 52,154,239, 0, 36, 20, 53,252,111, 54,109,222,124,165,235,181,107, 54,186,232,104,120, 61,
-120, 0,218,206, 46,168,178, 5,216,184,113, 35,148, 74, 37,114,115,115, 1, 0, 43, 86,172,128, 82,169,132,209,194,132,179, 28,
- 46, 90,184, 56,213, 68, 42,158,131,225,144,146,216, 58, 5, 77, 36, 26,105,178, 91,188,179, 42,151,116, 67,116, 92,136, 88,157,
-169,107, 66, 80, 58,104, 50, 10,224,214,188, 54, 56,224,180,168, 76, 25,205,235,254, 28, 14, 39,235,217,179,103, 93,124,124,124,
- 34, 0, 56, 84,197, 31,224, 29,188, 72, 75, 75, 27, 87,149, 15, 82, 20,245, 99, 76, 76,140,211,134, 13, 27,190,158, 51,103, 14,
- 91, 82,104,153,255,207,225,112,192,178, 44,108,109,109, 65,211,180,243,213,171, 87,157, 67, 66, 66, 86, 49, 12, 19, 84, 70, 61,
-217,128,128, 0,196,196,196,128,195,225,192,214,214, 22,140, 81,143,217, 19, 70,193, 68,241, 57,147, 39, 79, 14,234,217,179,231,
-195, 13, 27, 54, 24,108,154, 54,111,150,153,153,249,104, 76,255, 1, 15, 15, 29, 58,164, 43, 10,241, 80,241, 20,159,101,239, 62,
-127,254,156,114,119,117,166, 88, 99, 1, 35,230, 2,130,251,203, 88,158,196, 5, 2, 14,197,114, 9, 18,124,129,208,246,117, 98,
- 98, 38,195, 48, 79, 44,225,100, 24,230, 78, 76, 76,140,208,217,201,158, 83,160,214,229, 11,105,150, 23,123,231,246,171, 26,193,
- 13,189, 0, 64,115,231,230,121,126,157,186,194,216,180, 55,226,154, 53,107, 90,196,169, 86,171,239, 38, 37, 37, 81,206,206,206,
-156,184,132,196,195,118, 18,177,163,141,157, 93, 19, 0,208,231,229,222, 36,181,218, 55, 20,205,113,126,147,153,153,165, 86,171,
- 99, 44,173,251,203,151, 47, 57, 10,133, 19,117,252,228,153, 8,103, 17,223, 73,202,227,216,240, 9,130, 16, 81,132,146,107,100,
- 50, 4, 34,145,211,235,196,196, 44,150,101,203,180, 16, 46,204, 25,208,163,240,247,154,189,187, 4, 55,238,223,191,143, 99,151,
-159, 64,204,234, 64,104,114,113,114,211, 58,244,159, 60,237,131,253,254, 42, 18, 91, 85,178,102,173,169, 27,245, 14, 63, 82, 42,
-112,132,239,223,191,255,236,109,219,182, 21, 59,160, 60,121,242, 4,109,218,180, 49, 47,115,160,125,251,246, 8, 9, 9,193,147,
- 39, 79,224,237,237,141,179,103,207,242, 41,138,226, 15, 24, 48, 96,254,246,237,219,143, 86,104,247, 95,187, 22, 67,134, 12, 41,
-205,177,250, 37, 0, 13, 33,243,205,159,186,112,139, 67, 86,102, 6,210,223,164,222,181,244, 62, 16, 4,129, 65, 19, 39,102,172,
-209,233,176,227,198, 13, 12, 20,139, 69,155, 95,188, 64,167,144, 16,212,107,211, 38,195,146,190,206,108,213,209,104, 52,160,105,
- 26, 54, 54, 54,176,183,183, 7,151,203, 5, 69,187,130,195, 11, 4,201,229, 34,184,101, 32, 22,127, 39, 46, 8,239,128,229, 4,
-129, 28, 62, 15,119,184,162, 50,125,117, 8,113, 53,116,103, 89, 40, 11, 18,112,206, 44, 72,108,171,195,150,150,210, 39,135,173,
-242,181,179,113,226,226,216,242, 56,156, 92,149,184, 95,147,138,233, 69,247,130, 41,103, 34, 81,207,206,206, 14, 9, 9, 9,136,
-143,143,127,140,242, 29,252, 11,158, 60,121,242,138,207,231,251, 57, 58, 58, 2,128,103, 89, 19,115,134, 97,138,253,176,182,238,
-216,235, 16,212,202, 75,240,105, 11, 63,108,137,152,135,175,194,150,131,166, 8,152, 76,122,252,186,180, 51, 76,218,124,132,117,
- 29, 65,124,210,206, 59,240,116,132,110,152, 65,157,189,238,189,137, 0, 7,115,255,211,247,170, 29, 95, 66,214, 3, 67,216, 57,
- 56, 56,137,185, 92, 46,236,109, 20,186,105, 35,191, 77, 97, 89,182,184,221,208, 20,215, 64,230,201,213,153,169,249, 66, 59, 90,
- 13,176,100,141,170, 69,179,249,248, 72, 76, 76, 28,215,170, 85,171,249,121,121,121,217, 42,149,170, 63, 0,120,122,122, 86, 39,
- 73,146, 15,160,188,213,145,234, 40, 61, 44, 4,247,193,131, 7,144, 74,165, 72, 74, 74, 42,105,124, 1,195, 48,255,152, 77, 0,
-255, 80, 4, 3,184, 3, 64, 1,160, 19, 74,132,119, 32,139, 76,117,159, 68, 70, 70,178,145,145,145,159, 20, 15, 94, 44,203, 24,
-179,178,192,106, 11,239, 45, 77,211, 44,128,146, 59,154, 68,118,118,118, 4,237,238, 14,130, 95,232,250,193,126,196,173,175, 6,
-131,101,161,101, 24, 19, 40, 16,122,176, 37, 38, 45, 42, 1,129,121, 14,109, 49,142, 55, 3,169, 60,187,146, 35, 29, 96,100, 97,
- 2, 67, 85,178, 56,172, 74,165,130,209,104,148,213,170, 85,235,136,209,104,148, 21, 13,110,236,127,235, 23, 53,153, 76,175, 40,
-138,194,215, 95,127, 13,179,245, 71,167,211, 33, 53, 53, 21, 90,173, 22, 58,157, 14, 49, 49, 49,200,205,205,133, 78,167,195,163,
- 71,143,224,233,233, 9,138,162, 20,229,116,230, 44,203,178,240,240,240, 64,141, 26, 53, 64, 17, 44,214, 47,154,133, 31,198,143,
- 66, 95, 79, 6, 27, 87,254,138,214,173, 91,215,173, 89,179,102, 83, 14,135, 99,114,113,113,225, 30, 56,112,224,176,201,100,234,
- 14,203,123,158,163, 83,167, 78,173,225,239,239,239,100,103, 35, 53,240,121, 20,120, 6, 21,203,215,102,178,156,130, 12,120,120,
- 84, 55, 66, 40,242, 30, 56,112,160,169, 44, 43, 68,105,156,223,125,247,157,194,215,215,215, 86,102, 39, 85,241,104, 42,157, 11,
- 54, 35,247,254,173,235, 0,192,115,116,210, 64, 32,242, 11, 15, 15, 55, 86,134,115,198,140, 25,158,142,142,142,118, 36,216, 60,
-147, 94,255,231,122,187, 86,151, 73,208,180, 26, 92, 94,195,177, 99,199, 18,149,225,156, 52,105, 82, 77, 63, 63, 63, 59, 59, 27,
-113, 62,135,166, 82,184, 12,147, 34, 0,147, 74,235,244,217, 2, 71,135, 2,136, 36,193, 3, 7, 14, 44,147,211,108,205,154, 50,
-101, 74,194, 59,194, 27, 89, 89, 89,208,164, 62, 4, 55, 41, 26,129, 18, 26,141, 28,101,224,243,249,197, 91,223,203,122, 92,203,
-242,209, 42, 77,108, 89,250,217,134, 63,149,179, 4,184,166,110,212,187,113,179,146,147,147,161, 80, 40,202,109, 79,219,183,111,
-159, 22, 26, 26,154,222,190,125,123,221,145, 35, 71, 64, 16, 4,206,158, 61,139,164,164, 36,180,111,223, 30, 44,203,154,119,181,
-225,238,221,187,104,215,174,157,174, 85,171, 86, 73, 69,241,181, 42,196,144, 33, 67, 96, 48, 24,144,159,159,143,172,172, 44, 68,
- 70, 70, 34, 48, 48,144, 21,137, 68, 61, 41,143,207,230,133, 13,155,214, 44,160,126, 16, 86, 45, 95,172,227,113,232,133,149,105,
-175, 4, 65, 32,252,187,239, 50,114,131,131,179,182,170, 84, 5,131,108,108, 68,181, 18, 18,228,183, 79,156,112,208,235,245, 22,
-113,152,173, 58,238,238,238,197, 34,139,203,229,130,195,115, 4, 37,174, 7,158,125,123,136, 92,122,226,220, 29,190,214, 86,140,
-131, 82, 9,142,139,237,202, 14,237, 32,242,192,188,102,125, 20, 7,154,247, 85,156, 17, 85,195,134,162,241,128,100, 57,196,129,
-193,191,250,212,114,172, 33,196,181,189,169, 56,185, 42,241, 15, 77, 42,102, 1,120, 81, 81, 59,215,235,245, 26,147,201, 4,146,
- 36,193,225,112, 74,250, 4, 94,249,227,143, 63,112,251,246,109,160, 68,216,158,188,188, 60, 19, 69, 81, 16, 8, 4, 0, 32, 41,
-167,191, 3, 77,211,160,105, 26,231,175, 95,180,239,251, 69,103,226,234,189, 83,104, 30,216, 15,153,249,122,164,229,234,145, 83,
- 0,248, 55,154,142,128,118, 7,113, 63, 38, 15, 65,245, 3, 40,138, 39, 14, 47,141, 79,243, 26, 9,170,120,244,202,124,204,212,
-214, 37, 10,143, 93, 59,244,228,241,197,125,247, 31,237,250, 45,226, 69,179, 70,173, 84, 69,198, 4,228,231,231,179, 4, 65,176,
-223, 14,159,246,106,235,144,108,211,242,254,247, 25,142, 86,240,242,111,236,234,171, 59, 58, 58, 94,181,183,183, 63, 91, 36,142,
-170, 75,165,210, 43, 10,133, 34, 26,133, 27, 61, 14,165,164,164,248,170, 84,170,230, 40,220,156, 21,151,153,153,217,166,200,242,
- 20, 87,142, 37,108,131, 82,169,252,198,100, 50,117, 45, 58, 58,152, 76,166,160,231,207,159,251, 5, 5, 5, 61,246,242,242,186,
-235,229,229,117,204,203,203,235,176,151,151,215,225,208,208,208,165,230,112, 15,127,241,178,225,123, 90,228, 95, 38,180, 80, 36,
-178,214, 22,189,162, 88,104, 1, 56,255,174, 3,154,145,207,127,100, 28, 51, 6,118,135, 15,131,126,254, 28,131,195,195,109, 68,
- 34,209,114, 20,198,104,106, 46,145, 72, 86,205,154, 53, 75,234,176, 96, 1, 92, 47, 94, 68,108,100, 36, 12, 52,125,171, 42,165,
- 83,171,213,224,112, 56,197,150, 24,177, 88, 12,147,201,132,210, 76,190,239, 53, 64, 35,174, 37,165, 69,131,135, 26, 96,192,230,
- 31, 87,182,186,209,239,213,116,167, 72,165,167,247, 11, 21,215,251, 39,199, 38, 78,203,171,183,184,161, 34, 56,249, 60, 59, 1,
-226,227, 19, 96, 2, 83,169,245,102,141, 70,147,171, 82,169, 16, 20, 20,100,127,251,246,237, 90,129,129,129,242,162,235, 55, 63,
-240,135,105,234,234,234,186,215,205,205,237,181,171,171,235, 94, 0, 77, 43,241,217, 13,151, 46, 93, 2, 69, 81,152, 53,107, 22,
-242,242,242,160,215,235,145,153,153,137,248,248,120,232,116, 58, 36, 38, 38,226,233,211,167,208,233,116,136,141,141,133, 86, 91,
-241,132,132, 97, 24,216,216,216, 64,163,206,199,239,243,126,192,140, 41, 19,144,251, 50, 10,137,201,105,176,179, 21, 99,220,184,
-113,148, 76, 38, 99, 24,134,169, 97, 50,153,218, 49, 12,179,218,146,223,169,196,243,118,217,195,195, 35, 96,209,162, 69,126, 63,
-204, 91,205,181,225,228,179,124,169,128,225, 73,249, 44,175,110, 19, 12,153,190,156,187,108,201, 47,207,174, 93,187,150, 4,203,
-130,119,146, 0, 46, 7, 7, 7,251, 36, 37, 37, 5,250,250,250,214,113,168, 94,147,207, 87,184,229,112, 21,213,148,172, 86,115,
-131,112,171,214,114,245,234,213, 15,175, 92,185,146, 92, 25, 78,177, 88, 92,119,203,150, 45, 1,206,206,206, 1,180, 80, 40, 40,
-200,205,221, 99, 44, 80,237,165,236,100, 2,210,198,174,195,193,131, 7,163,246,239,223,159, 90, 25, 78,111,111,111,223,121,243,
-230,249,215,171, 87,207,223,197,179, 22, 95,232,230,145, 41,112,175,158, 41,172, 23,200,135,123,141,207, 87,173, 90,117,247,218,
-181,107, 22,113, 82, 20,101, 36, 73, 18, 52, 77, 67, 36, 18,225,248,241,227, 24, 51,172, 31, 60,220,236, 81,199,215, 23,109,191,
-250, 6,251,247,239, 47,246,225,161, 40,170,204, 17,125,243,130,113, 17,193, 10, 34, 10,107,234, 70, 97, 77,221,168, 96, 5, 17,
- 85,166,216, 42,250,123,105,239,177,168, 55, 42, 99,185,209, 2,177,117,244,252,249,243, 63, 15, 26, 52,136,215,177, 99, 71,220,
-184,113, 3, 67,134, 12,185,124,224,192, 1, 0,192,141, 27, 55,240,237,183,223, 94, 62,115,230, 12, 70,141, 26,133, 54,109,218,
-240, 46, 93,186,180, 10, 22,196,254, 49, 26,141,216,184,113, 35,140, 70, 35, 36, 18, 9,228,114, 57, 58,119,238,140,135, 15, 31,
-142,218,180,105, 83, 52, 69,211, 95,118,234,250, 5,142, 28, 62,128,167,143, 30,142,218, 60,127, 64,165,131, 2,147, 36,137,142,
-225,225, 25, 25,254,254, 89,155,149,202,130,161, 50,153,200, 55, 53, 85,126,110,239, 94, 7, 11,132, 26, 97, 50,153,138,197,149,
- 89,116,152, 15, 14,207, 17, 28,113, 0, 56,210, 70,184,255,130,107,224,134,224, 14,175, 17,158,148, 23, 63,139,230,145, 67,122,
-254,224,137,158, 63,120,162,219,228,154,131, 69,213,176, 94, 92, 13,163, 59,142,175, 17,234,213,200, 22,202,116, 61, 34,127,141,
-141,211,100, 98, 1,128,167,150,180,115,134, 97, 30, 39, 37, 37,129,199,227,161, 90,181,106, 62, 0,204,126,129, 27,134, 15, 31,
- 62,246,167,159,126,154, 0,224,167,162,107,146,208,208, 80,255,252,252,124, 60,127,254, 28, 0,110,151, 99, 13, 46,222,101,152,
-165,140,229,215,116,173,135,192,186, 35, 33,147,213, 71, 82,150, 14,201, 89, 58,172,255,189, 59,162, 46,205,197,237,147, 3, 17,
-151,154, 10,161, 75, 15,152,140,218, 0, 11, 38,245,174,247,238,221, 35, 46, 93,186, 68, 48, 12, 3,131,193,192,230, 41,149,236,
-157,203,151,161,190,112,129,176,177,177, 33, 90, 52,110,149,191,121,238,145,155, 7, 87, 94,190,173, 47,168,244, 68,253, 67, 48,
-227,213,171, 87, 77,247,238,221, 27, 10, 96, 70,189,122,245,174,197,199,199, 55,187,120,241, 98, 29,119,119,247,229, 85, 37, 53,
-135,133,136,141,141,125,235, 40, 10, 11,161, 43, 18, 13, 29,139,196, 92, 55, 0,223,226, 3,118,217, 87, 2,231,255,197,206,240,
- 71,240,206,110,195,119,133, 86,201, 64, 97,240,146,201,164, 6,131, 62,241,212,169, 83,122,146, 36, 33, 18,137, 48,104,200, 16,
-242,247,223,126,107,217,175,105,211,179, 35, 62,253,244,216,217, 51,103,130, 67, 66, 66,192,178, 44, 72,146,196,238,221,187,213,
- 26,141, 58,211,195,195,195,206,146, 78,163,100, 3, 82, 42,149,197, 66, 43, 55, 55, 23,206,206,206, 22, 47, 29,170,148, 56,125,
-230,120, 84, 54,107,250, 42,190,227,139, 37,250,133,169,221, 67,114, 24, 19, 39,215,100, 64,174,154, 69,158, 6,156, 27,164, 60,
-100,144,119, 15,125, 76,187,144,167, 23,162,175,102,106, 76,154, 74,237,150, 72, 79, 79,255, 33, 44, 44, 44, 83,161, 80, 16, 54,
- 54, 54,112,115,115, 35,187,117,235,150,145,144,144,240, 83, 85,127, 17,123,123,251,190,161,161,161, 17, 73, 73, 73,189, 46, 92,
-184, 80,227,226,197,139,189, 66, 67, 67, 35,236,237,237,251, 90, 72,177,103,218,180,105, 42, 30,143,135, 38, 77,154, 32, 47, 47,
- 15, 69,187,124,202, 61, 44, 89, 34,229,114,185, 88,179,232, 71,204,152, 50, 1, 89,209, 55,112,255,242, 41,156, 79, 37, 48,125,
-222, 47,224,114,185, 85,138,245, 85,219, 81, 84,175,158,171,244,201,183, 67,250, 36, 79,157, 50, 69,122,247,238, 93,122,236,248,
-111,217,216,148, 44,240, 58, 46,166,240,201, 15,228, 61,149, 35, 58,117,104,139, 89, 51, 38,214, 43, 10,218, 89, 46,234, 58,138,
-234, 5,184, 74, 31, 79, 28,209,239,213,248,241,227,133, 11, 23, 46,212, 52,109,218, 84,157,150,150, 38, 20,203,228,190, 28, 91,
-187,128,216,148, 84, 73,211,166, 77, 99,190,250,234,171,156,202,114, 78,159, 62, 93,116,226,196, 9, 78, 88, 88,152, 49, 59, 59,
- 91, 66, 11,133, 65, 4, 95,208,248, 77,118,182,109,175,176,176, 23,189,122,245, 42, 40, 10, 88,106, 49,231,204,153, 51, 69, 79,
-159, 62,229, 52,109,218,212,144,154,154, 42, 21,219, 59, 4, 82,118,242, 70,175, 83,210,108, 26,135,132,188, 28, 59,118,172,170,
-188,114,150, 20, 41, 82,169, 52,169,121,243,230,248,245,215, 95,177,108,217, 50,124,254,249,231,120,248,232, 33, 58,141,157, 0,
-191,209,223,226,240,213,235, 72, 74, 74,194,156, 57,115, 16, 24, 24, 8, 46,151,251,180,212,246, 56, 42,154,184,155, 10,226,110,
- 42, 8, 98, 84, 52, 97, 62, 47,211,178,245, 83, 46, 74,190,191,180,247,221,158, 89,186,165, 43, 88, 65, 68,149,231,135, 85,145,
-216,234,213,171,215, 24,115, 8,135,161, 67,135, 94, 94,190,124,121,139,161, 67, 11, 39,218, 77,154, 52,193,220,185,115, 91, 76,
-159, 62,253,242,188,121,243,208,182,109, 91,120,121,121, 85,184,241,197,100, 50,193,104, 52,162, 95,191,126, 48, 26,141,120,243,
-230, 13,158, 61,123,134,181,107,215,130,101, 89, 1, 0, 40, 92,221, 27,242,120, 60,220,187,115,171, 96,198,208,144,237,149,176,
-100, 17, 37, 39, 49,249,249,249,232, 53,122,116, 70, 98,237,218, 89,171, 51, 50, 10,134,201,100,162,154,113,113,114,169, 78,231,
-134,114,252, 18, 9,130, 0,195, 48,197,194,202, 44,184,222, 61,138, 6, 74,139,160, 47, 96,142, 94,220,150, 12, 0,104, 53,192,
- 21,221, 38,215, 28,172,240, 22,173,104,217,191,208,232,189,127,238, 43, 54, 47,217,180, 16, 6, 60,174,132,197,250,198,141, 27,
- 55, 96,103,103,135,176,176, 48, 62, 73,146, 11,204,243, 85, 20,198,206, 90, 98,230,226,243,249,139, 7, 14, 28, 72,230,228,228,
-224,254,253,251, 0,112,166,172,126,137,101,217,226,186,231,103, 17, 48, 49, 60, 92,185,115, 28, 39, 47,238,195,235,164, 55,136,
- 75,215, 0, 28, 91,104, 84,137,208,171,147,160,203,185, 3,165, 86,100, 81,129,185, 92,238,155,122,245,234,177,141, 26, 53, 98,
- 89,150,197,203,151, 47,141,177,113,113,198, 91, 75,151,178, 15, 70,142, 36,164,207,158,113,133, 66, 33,225,233,233, 9,129, 64,
-192, 8, 4,130,204,191,113,240,254, 75,194, 45,252, 5, 97, 33, 62,166, 85,139,197,191, 19, 41,120,123,183, 97,113, 0,211,210,
- 2,150,130,181, 17,246,217,183,234,119,219,176,126, 3, 84,129,129,129, 50, 55, 55, 55, 16, 4,129,238, 61,122, 16,161, 23, 46,
- 72,105, 87, 87,216, 55,104, 80,188, 28,113,250,212, 41, 28, 63,126, 92,117,228,143,131,110, 67,134, 13,235, 2, 96, 75, 57,133,
-225,240,249,252,226,239, 77, 73, 73, 1,159,207, 47,246,137, 80, 42,149,112,116,116, 68, 74, 74, 10, 44, 92,153,219, 58,117,202,
-245, 41,233, 33, 63,120,134, 72,105,226,152, 42, 21, 38,150, 5, 77,152, 0, 53, 11,131, 9,208, 26, 88, 52,172, 73,201, 79,170,
-141,178,200, 27, 7, 98, 0,108,173,204,221,211,106,181,231,238,222,189, 59,146, 97,152,125, 0,200, 11, 23, 46, 48,143, 31, 63,
- 30, 3,203, 29,215,223, 55,219,139, 68,147,207,158, 61, 43,159, 60,121,114,118,100,100,100,110,231,206,157,109,215,174, 93, 43,
-111,211,166,205,228,204,204,204, 93,150, 24, 2,227,227,227,183, 36, 36, 36,140,105,212,168, 17,178,178,178,160,215,235, 17, 21,
- 21, 5,111,111,111,220,190,125, 27, 62, 62, 62,184,117,235, 22,234,212,169, 3,147,201, 4,141, 70, 3,134, 97, 76, 21,117,230,
- 89, 25,111,128,204,120, 36,223, 56,134,103, 15,162,112, 54,153,192,202, 93, 17,168, 86,195,179, 74,113,106,124,156, 68,254, 10,
- 71,251,147, 11,103,207,116,138, 61,183, 27, 7, 54,174,100,206, 31, 59,230,199,147, 98,228, 39,253,190,249, 66,103, 64,117, 0,
-188,102, 33,141,208, 81,246,212, 36,170,129,212,179,143,203, 15,176,232,227, 36,242,119,118,176, 63,241,159, 5, 63, 73, 95, 30,
-223,140, 61,107,126,101,247,111,219, 25,168, 1, 66,252,253,253, 59,146, 36,105, 7, 64, 83,228,231,101, 81,106,155,210, 56, 79,
- 71, 68, 4,107,128,144, 67,135, 14,117, 20,137, 68, 46, 0, 12, 5, 5, 5,175, 62,132,243, 76,100,100,176,185,156, 4, 65, 56,
- 1,208,179, 44,251, 18,149, 76,193,211,187,119,239,185,223,126,251,237, 20,147,201,228, 88, 98,118, 78, 45, 94,188,152,195, 48,
- 12,197,178,172,158, 36, 73,253,137, 19, 39, 76, 70,163, 49, 89,163,209,140,254,144, 94,228,139, 47,190,192,245,235,215,103,163,
-112, 19,134,165,214,234,183,252,180,138, 82,246, 84,153,255,194,133, 11,115,190,252,242,203,169,187,118,237,122,182,124,249,242,
-174,163, 70,141,194,238,221,187, 81,187,118,109,220,187,119, 15, 63,252,240, 3, 0,180,152, 62,125,250,225, 13, 27, 54,120,197,
-198,198, 46,182,192,162, 1,163,209,136,157, 59,119,162,123,247,238,112,116,116,132,171,171, 43, 8,130, 56, 55,108,216,176,223,
- 0,128, 34, 40, 46, 0,104, 53, 90,173,175,111, 35,139, 45,184, 92, 46,183,184,175, 75, 77, 77, 45,222, 41,248,217,151, 95,102,
-172, 95,184, 16,219,213,106, 12,147,201, 68,137,238,238,138,195, 47, 95,142,120, 84,216, 57,179,229, 89,117, 42, 18, 89,150,186,
- 52,168, 83, 48,237,143,249,175, 93, 0,124,222,106,128, 43, 90, 13,112, 69,163,110, 78, 4, 73, 17,120,112, 50, 19, 15, 79,103,
-237, 55, 40,113, 14,149, 75,151,243,120,193,130, 5,135, 63,249,228,147,174,117,235,214,197,240,225,195,191,218,184,113, 35,215,
- 96, 48,140,199,159, 97, 30,108, 73,146,252,105,205,154, 53, 35,228,114, 57, 46, 93,186,132,139, 23, 47,158, 3, 16, 95, 86,191,
- 4,160, 56,102, 86, 53, 15, 31,205,211,216,124, 81,122,210, 21, 92,190,244, 7,106, 7,126, 3,161, 75, 23,200,125,231, 65, 31,
-189, 12,186,204,147,144,123,116, 70, 98,236, 75, 80, 28,254,195,138,156, 80, 88,150,125,148,152,152,232,229,229,229, 69,188,126,
-253,218, 8,128, 53,153, 76,172,190,101, 75,131,223,194,133,244,195,175,190, 34,154, 61,125, 74,177, 4,193, 68, 69, 69, 1,192,
-147,255,198, 40,110, 14,183,240,240,225,195,178,194, 45, 84, 10,245,234,213,107,113,241,226, 69,190, 70,163,193,249,243,231,209,
-184,113,241,222,174,255,106,244,251,146, 90,228, 95,134, 17,165, 92, 91,251,150, 69,235,173, 7,155, 33,232, 58, 62, 62, 38, 46,
-137, 77,221,187,116, 41,184,123,247,110,241,172, 79,115,243, 38, 84,199,143,195,100, 50,129,101, 89, 92,188,112, 1, 3, 7, 12,
-200,167, 41, 98,125,205,154, 53, 88,130,125, 43,118, 75,187, 82,102, 15, 97, 97, 97, 97,197,157, 79, 66, 66, 2,196, 98, 49,120,
- 60, 30, 24,134,129,209,104, 4, 69, 81,176,181,181,133,209,104, 44,205, 4,243, 46,167,193,148,165,234,181,161, 83,255, 20,215,
-124, 61, 59,210,174, 38,170,115,133,197,141,211,197,134, 64,215, 64, 26, 14,156,116,246,204,226, 79,147, 25,109,102, 47,188,191,
-163,171,162, 45,255, 62,245,235,215,255,109,224,192,129, 36, 0,180,107,215,142,172, 95,191,254, 10,148,159, 42,167, 92, 78,129,
- 64,192, 7,128,136,136,136,172,103,207,158,125, 30, 17, 17,145, 85,242,186,133,156,107, 23, 45, 90, 4,145, 72, 4,163,209, 8,
-157, 78, 87,236,159, 85,242, 85,175,215,195,193,193, 1, 71,142, 28,129,201,100, 58, 82, 81, 57, 61,170,215, 0,225, 88, 11, 91,
- 34,206,226, 98, 6,183, 42, 34,171,152,179,150,139,184,142,139,131,253,169,255,204,159,227,152,253, 34, 10,137,137,137,236,137,
-227, 71,174,105,128,164,220, 60,204,200, 81,161,142, 90, 7, 65, 99, 47,196,159, 90,243, 61, 59,189, 21, 12, 40,125,215, 96, 49,
-167,159,139,184,142,155,163,253,137, 95,254, 51, 95,154,243, 34, 10, 41,169,169, 56,122, 36,226,174, 6, 48, 47, 55, 14,102, 24,
- 38,128, 97,152, 0, 0,131,203, 17, 47,149,226, 44, 40, 40,168, 87, 80, 80, 80,239, 99,114,178, 44, 91,143,101, 89,139, 57, 75,
-250, 68, 45, 89,178, 36, 58, 37, 37,101, 96,122,122,122,123,243,145,157,157,221, 46, 63, 63,191,117, 65, 65, 65, 75,245,146, 26,
-182, 5, 5, 5, 78,249,249,249, 10,141, 70,211, 16, 64, 84, 37,158,249, 98,148,140, 58,157,146,146, 50, 43, 37, 37,133,168,168,
-156,212,232,104, 98,199, 47, 19,255, 88,179,102,141,226, 3,249,223, 42,103, 70, 70,198,190, 93,187,118, 5,121,122,122,122, 13,
- 30, 60, 24,171, 87,175,198,242,229,203,181, 0,176, 97,195, 6,109, 9, 75,150, 71,108,108,108,163, 50,150, 13,219,149,176,150,
-108,253,236,179,207,216,139, 23, 47,162,123,247,238,197,129, 68,215,173, 91, 7,163,209,168,108,219,182, 45, 3, 0,106, 77,129,
-146,101, 88,232,244,101,174,191,191,119, 63,121, 60, 94,135,146,241, 2,205,193,152,121, 60, 30, 88,150, 69,157, 22, 45, 50,114,
- 2, 3,179, 54,230,230, 22,204,170, 87,207,102,132,175,239,224,186,192,128,210, 56, 9,130,120,203,170,243,238, 81, 9, 75, 86,
-201,114,166,171,147, 49,252,143,249,175,143,155, 45, 91, 2, 9, 7,154, 60, 35, 14, 46,124,253, 70,243, 6,235,202, 18, 63,229,
-213, 61, 43, 43,107,236,194,133, 11,181, 50,153, 12, 95,124,241, 5,230,205,155, 55,172, 69,139, 22,185, 78, 78, 78,215,107,215,
-174,253,160, 79,159, 62, 41, 81, 81, 81, 99, 67, 67, 67,241,252,249,115,252,242,203, 47, 57,217,217,217,253,203,227, 36, 8,162,
-216,146,215,173, 83,187,172,223, 87,252,202,180,253,100, 12, 68, 66, 27, 24,104, 15,100,229, 27,144,173, 98,161,227,135,128,199,
-229,163,125, 83,127, 92, 63,177,185,192,164, 83,109,169,232,153,207,207,207,223, 63,104,208, 32, 37,151,203,133, 78,167, 99,105,
-154, 6,191,208,239,152,161, 63,255, 92,223,236,241, 99,163,137,101, 25,130, 32,240,221,119,223,169,178,179,179,119, 85,165, 29,
- 85, 2, 37, 57, 63, 86,184,133,118,239,140, 63, 31, 35, 44,196, 95, 81,247,127, 51,214,150,114,252,105,209, 50,111,169, 52,191,
- 18, 4, 99, 50,153, 24,212,244,172, 41,141,125, 29,191,178,119,239,176,161, 29, 59,118, 18,117,234,212, 73,224, 31, 93, 56, 27,
-141,136,136,192,129, 3, 7, 10, 78,158, 60,169,228,211,212, 6,143,106, 30,206, 38, 19, 3,130, 96,202, 85,195, 82,169,116,252,
-180,105,211,132,185,185,185, 88,190,124, 57, 19, 20, 20, 68,138,197, 98,232,245,122,108,216,176,193,224,239,239, 79,147, 36,137,
-220,220, 92,144, 36,249,212,194, 10,222,207,141, 79,106,255, 91,104,207, 3,141,190, 30, 98,239, 23,218, 76,214,218,195, 13,134,
- 6, 44,146, 19, 94,227,217,153,147,217,143, 78, 44,205,132, 38,173, 39, 42, 78, 15, 84,218, 64,240,227,201,147, 39,157,198,142,
- 29,203,106, 52, 26, 34, 62, 62,158,157, 63,127,190,211,240,225,195,127, 76, 78, 78,238, 91,197, 31,133,200,201,201, 1, 65, 16,
- 76, 81, 71, 98,158,245, 87,102, 93,238,225,150, 45, 91, 14,245,232,209,163, 91,219,182,109, 17, 29, 29, 93,188, 68, 88, 82,104,
-153,119, 31, 46, 88,176, 32, 7,192,212,138, 72,105,154,198,242, 45,251,144,147,157, 1,103,103, 87, 8,132, 66, 84,117,135, 37,
-143, 36,103,253, 60,103,166, 83,198,147,235,196,195,107,103,153,189,247,211,210,141, 38,182,244,136,255,121,201,108,145,250, 47,
-127, 54, 67, 82,179,126,158,255,147,173,121, 89,115,215,157, 20, 37, 97, 98,199,126, 80, 19,249,183,112,254,205,112,117,117, 69,
- 74, 74, 10,225,234,234,202, 22,249,104,177,229, 8,173,183, 31,240,194,229, 50,162,188,101,195,170,242,199,196,196,204,111,208,
-160,193,196,231,207,159,239,245,243,243, 27, 5,160,154, 86,171,205,153, 62,125,250,127, 54,108,216, 48,212, 18, 75, 22, 0,236,
-222,189,123,233,144, 33, 67,142,119,233,210,229,123,134, 97,234,151, 24,216, 99,156,156,156,138,151,112,223,164,165, 78, 25, 57,
-180,223,148,252,252,108,139,227,220, 73, 36,146, 17,211,167, 79, 23,168, 84, 42,172, 90,181,138,241,247,247, 39,205,147,162,109,
-219,182, 25,125,124,124, 56, 97, 99,198,100, 44, 73, 77,197,220, 75,151, 84, 83, 2, 2,130, 54, 62,123,214, 16, 12,179,181, 44,
-171, 78,105,150, 44,179,219, 69, 21,145, 92, 36,182,214, 1,248,188, 89,111, 23, 28, 90,244, 26,217,177,186,255,192,136,151,176,
- 32, 45, 80, 41, 72,220,191,127,127,251,180,180,180, 67, 51,103,206,180,109,216,176, 33, 2, 2, 2,104,137, 68, 18, 98, 14, 23,
-147,155,155,139,211,167, 79, 99,245,234,213,186, 71,143, 30,245, 40,111,185,202,100, 50,165,251,248,248,152,239, 3, 75, 16, 68,
-166, 82, 75,216,238,169, 27, 34, 25, 60,114, 47,113,249,214, 85, 36,235, 25,104, 13, 12,106,122, 6,163,245,231, 75,112,248,216,
- 3, 83,114,236,227,199, 6,117,246,122, 11,202,251,242,197,139, 23, 7,231,204,153,211,251,251,239,191, 23,102,100,100,152,180,
- 90, 45,179,111,223, 62,106,240,224,193, 38,150,195, 97,184, 28, 14,198,143, 31,175,206,201,201,249, 3,248, 91, 19, 76,255, 37,
-225, 22,254,130,176, 16, 31,205,154, 85,242,245,127, 5,165,182, 80,134, 34,175,172, 94,243,123,135,221, 59,119,185, 80, 20,233,
-242,242,213,171, 91, 93,123,246, 74, 58,117,234,148,156,107,107,219, 24, 0,163, 27, 53,234,154, 94,171,206,138, 60,116,168,122,
-205,154, 53, 2,139,146, 74,179, 12, 69, 94, 41,239, 11,243,243,243, 85,151, 46, 93, 42,152, 58,117, 42,145,144,144,176,195,217,
-217,185,207,177, 99,199, 36, 61,123,246, 84, 71, 71, 71,239,119,113,113,233, 22, 26, 26, 42,157, 56,113,162, 54, 63, 63,191, 50,
-137, 71, 31,179,111,178,235,222,156,185,248,203,155,139,126,255, 20, 28,170, 57,180, 52,192, 24,174, 64,159,119, 10,192, 14, 84,
- 34,222, 81, 73,136,197,226, 64,145, 72,132,187,119,239,102,135,132,132,232, 52, 26, 13,119,222,188,121,246, 98,177, 56,176,170,
- 55,158,101, 89, 54, 59, 59, 27, 12,195,112, 0, 16, 69,175, 96, 42,191, 23,191,111,215,174, 93, 15,237,217,179,231,179, 78,157,
- 58,193,203,203, 11, 6,131, 1, 62, 62, 62,208,233,116,240,246,246,134, 86,171,197,236,217,179,145,155,155, 59, 1,229,228, 60,
- 35, 8, 2, 70,163,177,216,217,214,205,189,122, 97,156,158, 15, 8, 99, 33,166, 73,175,167,145, 27,145,158,153,193,236,185,151,
-150, 86,160, 55,181,127,241,166,224,209,187,239, 43, 48, 65, 21, 58,120, 92, 18, 0,104,153,242, 51,206,139,121,240,122,118,100,
- 29,210,210, 51,176,251, 78, 74,142, 74,207,124,254,172, 20,206, 74,149,243, 95,194, 25, 60, 59, 26,189,198, 89,254,222, 15,129,
-165,130,170, 44,220, 77, 5,113, 91,180,145,197,154,141,165,198,200,250, 64,254, 67,207,159, 63, 63, 4, 0,143, 31, 63, 78,232,
-215,175,223,148,215,175, 95,207, 1,112, 52, 54, 54,118, 77,101,136, 54,110,220,248, 28,192,144,242,222,179,107,241,144,131, 0,
- 14, 86,134, 55, 47, 47, 79, 19, 21, 21,165,153, 56,113, 34,145,144,144,112,204,197,197,229,179,227,199,143,139,122,246,236,169,
-125,248,240,225, 25, 87, 87,215, 86,237,218,181,147, 28,189,113, 35,169,224,229,203,200,200,196,133,151,166, 0, 0, 32, 0, 73,
- 68, 65, 84,215,175,221, 13, 12, 19, 89, 94,251,252,200, 34,235, 45,177,117,112,238,235,159, 15,253,252,186, 29,163,197,126, 93,
- 54,174, 1, 72,252, 0,206,139, 87,174, 92,241, 27, 48, 96,192,158,206,157, 59, 55,243,243,243, 67,181,106,213,240,236,217, 51,
-188,121,243, 6,247,239,223, 71, 68, 68, 68,132, 70,163,169, 48,161,118, 86, 86,214,251,233,137, 4,114,215,205,171,102, 69,220,
-186,220,216,167,101,167, 65,194, 0, 87, 6, 58, 61,139,132,184,151,152, 61, 99,125, 65, 74,220,243,199,122,163,190, 7, 44,220,
-168,163, 86,171,215, 46, 91,182,140,142,140,140,236,180,114,229, 74,105,245,234,213, 41, 46,151, 75, 2, 96,111,223,190,205,142,
- 27, 55, 78,149,145,145,113, 68,169, 84,174,253,155,199,232,139,175, 94,189, 10,166, 40,234,163,134, 91,248,128,176, 16, 86,124,
- 76,120,122,186,251,213,170,238, 58,202,171,154,251, 24,207,234, 30,225,165, 57,185,123,201,100, 82,207, 26,110, 35,188,170,185,
-143,169, 85,221,117,148,167,167,187,159, 5,166, 69, 47, 27, 27,155, 99, 10,133, 34, 8, 0,108,109,109,187,217,217,217, 61,178,
-181,181,237, 86, 52, 11,236, 38,145, 72,158,248,251,251, 15,255, 27,205,149,229,114,250,248,248,244,203,207,207,255,202,199,199,
-167,159,249,252,229,203,151,197,231, 85,225,244,240,240,104,123,251,246,237,190,139, 23, 47,254,162,118,237,218,221,230,207,159,
-255,197, 31,127,252,209,215,221,221,189, 97, 21, 56,249, 0,182,211, 52,157,198,227,241,210,105,154, 78, 51, 31, 28, 14, 39,141,
-162,168, 52, 0,107,202,176,150,181, 43, 49,203,185,236,236,236, 28,235,236,236, 28,235,226,226, 18,235,226,226, 18,171, 80, 40,
-222, 59, 28, 28, 28, 46, 91,122, 63,125, 93, 36, 45, 66,170, 73,175,212, 83, 72, 46,215,117, 22,251,126,140,223,200,215, 69,210,
-162,113, 53,219, 43,245, 20,210, 75,255,223, 56,131, 92,192,178,171,125, 89,118,181, 47, 27,228, 2,182,162,243,143,105,246, 87,
- 40, 20,172, 66,161,152,245, 87, 45, 37,148,193,255,183,183,247,143,200,233, 37,149, 74,119, 85,171, 86,205,220,215,117,177,177,
-177, 57, 39,145, 72,186, 20,245,117, 93,196, 98,241, 5,127,127,255, 65, 21,113,202,229,242,219, 78, 78, 78,169, 69, 71,138,179,
-179,115,138,179,179,115,138,147,147, 83,178,147,147, 83,178,163,163, 99,146,249,176,179,179,187, 94,197,186, 59, 1,104, 2,160,
- 33, 0,155,143,120, 63, 61, 1,140, 44,234,131, 22, 2, 24, 14,160,254, 71,248,141, 8, 90, 40, 31,205,183,243,184, 66, 75, 28,
-243,104,137, 99, 30,223,214,253, 74, 57, 41,120, 44,225,172, 35,151,203,231,217,216,216,252, 33,149, 74, 47, 73,165,210, 67, 14,
- 14, 14,243, 1,212,249, 47, 61, 75, 18, 0, 27, 80, 24,159,233, 40, 10,151,194, 15,161,112, 83, 65,245,127,224, 51,255,255, 25,
- 35,254, 91, 95,220,206,202,105,229,180,114, 90, 57,173,156, 86,206,127, 33, 39,105,189,159, 86,161, 85, 73,161,245,238, 1,160,
-156,200,240, 86, 88, 97,133, 21, 86, 88,241,255, 24,140,245, 22, 88, 81, 73,148,186,180, 76,148,163, 74, 43, 19,107,170, 42,202,
-246,180,149,211,202,105,229,180,114, 90, 57,173,156, 86,206,255,119,156, 86,124, 68, 88,205,170, 86, 78, 43,167,149,211,202,105,
-229,180,114, 90, 57,255,215, 97, 93, 58,180,194, 10, 43,172,176,194, 10, 43,172,248,139,176,182,132,224,122,107, 9,209, 42,180,
- 42, 15, 18,192, 87, 0,122, 1,168,133,194,108,246,251, 0,252,134,170,173,233,219, 0,152, 2,160, 57, 10,119,231,196, 0,184,
-132,194,221, 57,249,214,219, 93, 58, 28, 28, 28,166,209, 52,109, 7, 20,166, 54, 49,191,150,252,191,201,100,202, 81, 42,149,243,
-255,162, 34, 80,176, 48,130,178,185,172, 37,203, 86,242,213, 96, 48,252,149,229,180,226,159, 9, 31,185, 92,190, 61, 43, 43,171,
- 63, 74, 36, 89,182,194,138,255, 5, 56, 58, 58,142,210,235,245,211,185, 92,238,188, 55,111,222,252,254,255,168,234,239,137,172,
-183,132, 86,100,100,228, 5, 0,232,220,185,243, 39, 0, 96,103,103,119,149, 36, 73,207,202,124, 3,195, 48, 49, 57, 57, 57,101,
- 6, 80,179,179,179,187, 74, 81,212,123,156, 6,131, 65,202,225,112,242, 74,251,140,209,104, 76, 84, 42,149, 13,255, 33, 55,145,
- 0, 16, 41,147,201, 52,115,230,204,249,173,117,235,214, 30,201,201,201,198,201,147, 39,183,186,119,239, 94, 39, 0, 29, 42, 41,
-182,154, 18, 4,177, 57, 40, 40,232, 96,120,120,248,158,144,144, 16, 94,102,102,166,116,223,190,125,110, 91,182,108,137, 98, 24,
-166, 63,202, 73,180,250,255, 25, 52, 77,219, 37, 38, 38, 74,129,194,212, 36, 69,194, 10, 6,131, 1, 6,131, 1, 42,149, 10,129,
-129,129, 31,253,123, 93, 92, 92,130, 9,130, 88, 41,145, 72, 26,230,231,231,223, 2, 48, 38, 37, 37,229, 94,101,202,106, 52, 26,
-193,178,108,113, 57,253,252,252,172, 63,104,229, 48,140,199,227,125,238,237,237,221, 88,171,213,102,199,196,196,220, 52,153, 76,
- 51,241,241,114,180,217, 2,152,201,231,243, 67,106,213,170,229,241,252,249,243, 4,189, 94,127, 3,133,201,144,115, 63,134,200,
-250,228,147, 79, 46,175, 90,181,202,126,244,232,209,151, 47, 93,186,212,194, 42,182,172,248,111,193,195,195,195, 78,165, 82,173,
- 7, 16, 76,211,180,139, 64, 32,128, 80, 40, 76,229,243,249,119,133, 66,225,208, 43, 87,174,228, 84,150,211,100, 50,205,140,141,
-141,117,105,210,164,201, 34, 39, 39,167,217, 25, 25, 25, 26,189, 94,127, 38, 59, 59,123, 2, 0,101,121,159,125, 87,139,252,203,
- 68, 86,201, 87,152, 69, 23,167,168, 98, 44,128,214,111, 41, 48, 14,199, 61, 46, 46,206, 73, 32, 16,128, 97,152,226,193,236,221,
-195,124, 93,167,211, 33, 32, 32, 64, 95,193,128,227,145,144,144,224,196,227,241,138,175,233,116, 58,184,185,185, 49,137,137,137,
- 78, 69,105, 15,138,161,213,106,225,238,238,254, 79,202,121,244,149, 92, 46,207,141,143, 79, 8,212,104,245, 63, 13, 31, 59,117,
- 90,255, 94,159,202,174, 94,189,202,116,232,208, 65,123,225,194,133,175, 80,152, 56,213,162,206,156, 32,136, 45,147, 39, 79,158,
- 45, 16,217,216,159,189,250, 88,187,101,223,145,164, 32,159,154,196,132, 9, 19,168,113,227,198, 93, 12, 14, 14,222,206, 48, 76,
- 3, 84,194,178, 37,147,201,142,243,249,252, 26, 69,247, 47, 62, 59, 59,251,179,127,224, 3,201,193,251,193, 99, 75,187, 86, 33,
- 50, 51, 51,161, 86,171,223, 59,252,252,252, 44,205,149, 89,169,114,211, 52,125,104,193,130, 5,110,169, 41, 41,248,117,201,146,
- 38, 40,180,100, 54,177,228,195,233,233,233,239,149,211,215,215, 23, 86, 84, 10, 83,102,207,158,189,224,203, 47,191,132,201,100,
-130, 90,173,118,125,241,226,133,255,244,233,211,123,188,124,249,178, 49,128, 87, 31, 58, 25,247,246,246,142,254,230,155,111,228,
-141, 27, 55, 70, 81,150, 10,215, 75,151, 46, 53,217,176, 97,195,192,248,248,120, 95, 0,111, 62,228, 11,228,114,249,246,117,235,
-214,217,139, 68, 34, 28, 62,124,216,190,109,219,182,151,238,220,185,211,242, 3,196, 22,105,111,111, 63, 14, 64, 27,134, 97,120,
- 0,110,100,103,103,207, 69,229,163,186, 43, 36, 18,201,126,146, 36,107, 2,127, 70,163, 39, 73,210,129, 32,136, 12,243, 53,130,
- 32,156, 24,134,185,150,149,149,213,204,250, 56,254,187, 97,111,111, 63, 44, 45, 45,109, 21,159,207,231,202,100, 50,136, 68, 34,
-112, 56, 28,112, 56,156,106,124, 62,191, 26,159,207,239, 24, 26, 26, 58,230,220,185,115,229, 70,216,111, 26,228, 60, 24, 36,241,
- 19, 69,144, 20, 0,144,180,216,198,214,214, 22, 63,253,244,147,184, 91,183,110, 98, 0,184,124,249,114,248,160, 65,131,218, 38,
- 38, 38, 6,148, 37,182, 74,211, 34,255, 34,172, 45,111,192, 67,145,122,188,240, 86,203, 37, 73,240,120, 60, 92,191,126, 29,150,
- 4, 43, 55,167, 72, 40,183, 55, 40,138, 48,126,239,222,159, 6, 0,243, 64,195,227,241,112,229,202,219, 65,229,155, 54,109, 90,
-220,216,255, 46,244,242, 43, 12,242,184,247,235,194,114,133,173, 44,140,174,189,247,107, 95,180,250, 37, 14,189,198,205,234, 83,
-160,209, 55, 2,160,202,201,206,206,190,117,224, 64,114,144,143, 15,119,251,246,237,141,221,220,220,122, 85, 66,104, 77,105,208,
-160,193,126, 74,104,235, 16, 62,104,112,248, 80, 14,169, 31, 56,114,226,188,132,148, 12,213,136, 17, 35, 14, 28, 62,124, 56,252,
-231,159,127,126, 50,105,210,164, 41, 0,126,176,180,252, 2,129,160,198,211,167, 79,189, 77, 38, 19,252,252,252,254,137,105, 12,
-130, 80, 24,124,239, 75, 0, 59,139,174,245, 67, 97,228,254, 96, 0,119, 43, 67,102,182, 96,149,118,124,108,184,185,185,249, 14,
- 24, 48,192, 33, 43, 35, 3,191, 46, 89, 98,190,220, 16, 21, 44, 35,154,219,143, 78,167,195, 23, 95,124, 49,192,100, 50,113,204,
- 34, 80,171,213,234,114,115,115, 53,248,211,177,244, 13,128, 79, 45, 40,142,167, 88, 44,254, 15,128, 96,181, 90,237, 6, 0, 98,
-177, 56,137, 97,152,131, 42,149,234, 7,252,153,192,183,210, 19, 92, 0,254, 40, 59, 21, 20,187, 96,193,130,231, 83,167, 78,125,
-245, 95,224,172,225,236,236, 60, 63, 44, 44, 12, 71,142, 28,193,209,163, 71, 13, 66,161,144, 51,104,208, 32, 98,204,152, 49,178,
-111,190,249,166, 35,128,101, 31,248, 51,119,156, 61,123,182,188,110,221,186,216,183,111, 31,238,223,191,175,246,246,246, 22,182,
-110,221, 26, 28, 14, 71, 62,109,218,180, 14, 0, 54,127,200, 23,100,101,101,205,157, 56,113,226,150,157, 59,119, 74, 99, 98, 98,
-176,114,229, 74,135, 62,125,250, 92,136,143,143,255,164, 18, 98,139, 15, 96, 28,128, 80,138,162, 90, 14, 26, 52,200, 56,118,236,
- 88,154, 36, 73,195,146, 37, 75, 28, 55,108,216,208,135,166,233,224,204,204, 76, 75, 38,105, 36,128,159,134, 14, 29, 58,228,220,
-185,115,178,155, 55,111,242,236,237,237, 97, 50,153,138, 45,197, 12,195, 56,153,159, 89,163,209, 8, 95, 95, 95,247, 18,159, 23,
-254, 91,133, 6, 73,146,122,134, 97,104, 0, 2, 0,218,138,206,255,151, 68,150, 92, 46, 31,157,149,149,245,155,139,139, 11,156,
-157,157,223, 27,107,181, 90, 45, 4, 2, 1,215,197,197,101, 93,183,110,221,232, 67,135, 14,149,185, 4, 72, 80,196,204,195,187,
-230,184,201,101, 82, 0,192,210,213, 39, 10, 0,224,143, 63,254, 64,114,114, 50,100, 50, 25, 2, 2, 2,168, 57,115,230, 40, 38,
- 76,152,240,107,118,118,246,208,178,184,222,213, 34,255, 50,139,214,218,210,206,203,245,209, 98, 89,182, 56, 79,158,133, 15,237,
-187,151, 78,191,195, 71,232,116, 58,188,107,209, 50, 55, 94,154,166,223, 53, 63,130, 32, 8,182, 60,206, 82, 48, 72, 44, 22, 7,
-170, 84,170, 21,149,152,221, 22,115,238,253,218, 23, 91,248,147,251,153, 51,145,118,156, 88,248,186, 5,192,213,215, 67, 87,174,
-250,228, 19,183,113, 51,150,207, 82,103, 38,103, 76, 27,208,165,134,183,139,189, 80,156,147,158, 43,175, 83,167,253, 59, 22,153,
-138,202,217, 42, 60, 60,124,235,201,235,177,132, 64,192,229,114, 40,138,110, 81,207,199,222,195,150,178,149, 2,182, 9,175,158,
- 95, 29, 60,120,112,189, 73,147, 38,181,172, 4, 39,138, 6, 92,108,219,182, 13, 4, 65,144,149,169,251, 71,196,233,242, 68, 22,
-203,178, 32, 8, 98, 71,137, 65,101, 71,209,181, 59, 37,196, 22,167,188,251,105,182,166,154, 69,213,160, 65,131, 6, 24,141, 70,
- 78,137, 78,226, 93, 1, 83,154,136,177,168,238, 10,133,226, 36,128, 79, 9,130,128, 78,163,209,253,231,151, 95, 74,254,249,246,
- 59, 34,235,116, 89,109,201, 96, 48,192,100, 50,113,238,220,185, 67,151,120,214,105, 0, 98, 0, 14, 44,203,130, 36,201, 7, 22,
-220, 79, 95,145, 72,116, 53, 34, 34,194,166, 97,195,134, 4,143,199,131,209,104,196,195,135, 15, 61,126,254,249,231,145,167, 79,
-159,238,160, 82,169,252,240,126,242,116, 75,126, 35,255, 75,151, 46,169,188,188,188, 74, 21,142, 74,165,146,227,227,227,243, 73,
- 25,162,232,175,230, 76, 76, 75, 75,235,254,233,167,159,142, 74, 77, 77,141, 54, 26,141,223, 3, 8,112,112,112,184,211,179,103,
- 79, 8,133,194, 80,181, 90,189,236, 67,158,121, 39, 39,167,110,205,154, 53,195,202,149, 43,241,243,207, 63,183, 3,112, 6, 64,
- 91,165, 82,121,186,107,215,174,176,179,179,235,158,147,147,179,249, 3,218,145, 79,171, 86,173,214,253,244,211, 79,210, 35, 71,
-142,192,219,219, 27,121,121,121,248,238,187,239,156,126,252,241,199,243, 57, 57, 57,173, 75,180,139,178, 56,253,248,124,254,230,
-157, 59,119, 74,188,188,188,188,184, 92, 46,233,229,229,133,172,172, 44,104, 52, 26,254,188,121,243,234, 9,133,194,123,203,150,
- 45,219, 12,160,103, 5,229, 36, 1,204, 93,179,102,205,168, 17, 35, 70,216, 13, 24, 48,192,164,211,233,176,103,207, 30, 80, 20,
- 5,154,166, 33, 18,137,138,147, 87,115,185, 92,212,169,243, 94,144,244,195,229,212, 55, 23,133,126,168,118,168,220,178,235,233,
-114,248,138,151, 62,104,154,134, 64, 32,128, 64, 32, 0,159,207,199,211,167, 79,103, 8, 4,130, 37, 4, 65, 24, 45,225, 36,254,
- 84, 23,129, 0,110, 86,116,142,247, 93, 67,254,206,254,211, 12,119,130, 32,150, 2, 8, 45, 28,118,201, 11, 14, 14, 14,227,211,
-210,210,226, 44,229, 84, 40, 20,246,153,153,153,203, 20, 10, 5,156,157,157,139,199,111, 55, 55, 55, 24, 12, 6,164,165,165,129,
-101, 89,228,228,228, 64, 36, 18,193,213,213,117,217,136, 17, 35,246,173, 93,187, 54,179, 84, 78, 6, 63,119,237, 51,125, 38, 69,
- 81, 36, 0, 80, 28,137,228,155,169, 64,141, 26, 53,208,162, 69, 11,104, 52, 26,228,230,230,194,223,223,159, 67, 16, 68, 56, 65,
- 16, 54, 44,203,254, 14,224,236,255,160,161,176, 76,103,248,217,239,174,139,154,179,197,115,185, 92,139,132, 86,209,251, 43,178,
-160,144, 6,131, 1, 92, 46,247, 45,139, 4, 65, 16, 48,153, 76,111, 93, 55, 11,173,170, 8,245, 49, 99,198, 48,235,214,173, 27,
-149,157,157,189, 26, 85, 92, 74, 8, 15, 15,127,207,223, 99,194,132, 9,137,233,233,233,236, 23,237, 3,197,209,199,146, 83,106,
-201, 36, 66, 71,169,180,166, 64, 38,183,203,204,204,188, 86,212,153, 88,138,218, 13, 26, 52, 16,110, 57,112, 41,113,248,183, 11,
-230, 52,244,178,183,169,239,238, 32,115,177, 21,242, 36, 36,161, 18, 24, 13,137,114,185,220,187,178,229, 54,247, 11, 34,145, 8,
- 36, 73,254,147, 44, 90, 28,179,200,202,202,202,194,145, 35, 71,208,169, 83,167, 59,102, 17,162, 84, 42,145,146,146, 2,133, 66,
-113,167,200,242, 81,225, 50, 34,195, 48,208,235,245,208,235,245,197, 2,166,196, 51, 84, 44, 96,204,239,165, 40,234, 65, 21,203,
- 62, 71, 38,147,181, 10, 13, 13,229,237,218,179,135,199,178,172, 10,133, 57,212,242, 89,182,140, 4,217,239,192,104, 52, 22, 91,
-217,104,154, 70,124,124,124,241,192,101,206, 45, 41, 16, 8, 44, 51,101,240,249, 19,119,239,222,109,211,184,113, 99, 34, 51, 51,
- 19, 12,195, 20,119,146,191,253,246,155,160, 87,175, 94,110, 81, 81, 81,211,180, 90,237,236, 42,212,149, 40, 75, 16, 1,128,141,
-141,141, 17,150, 69,204,174,144,211,104, 52, 18,205,155, 55,159,148,145,145, 81, 79,173, 86,207,179,228, 54, 2, 56,156,152,152,
- 88,114, 96,191, 23, 29, 29,173,238,221,187,183,176,102,205,154, 33,143, 31, 63,254,160,135,212,199,199,167, 41, 77,211,184,113,
-227,134, 22,128,121,102,125,225,254,253,251,218,158, 61,123,242, 61, 60, 60,154,230,228, 88,236,178,226,227,235,235,123,202,201,
-201, 73,104,238, 67, 29, 29, 29,233,181,107,215, 74,147,146,146,160,215,235, 49,101,202, 20,116,238,220, 25, 14, 14, 14,152, 48,
- 97,130,243,162, 69,139,182,231,231,231, 55, 40,207,104,205,227,241,182,190,120,241,194, 91,161, 80, 8,175, 95,191,142,250,245,
-235, 35, 35, 35, 3,169,169,169,200,207,207, 71,106,106, 42,134, 14, 29,234,244,235,175,191,186, 90, 96,201, 42, 22, 89,107,215,
-174,205,217,191,127, 63,181,126,253,122, 41, 77,211,197, 66,139,195,225, 20, 11, 45,115,110,197, 42,172, 52,228, 20,137, 54,187,
-220,220,220, 15,241,115,227, 3,224,149, 20, 89,124, 62, 31,124, 62, 31, 2,129,224,131,242,178,254, 75,224, 70, 16,196, 99, 46,
-151,203, 23,137, 68, 92,146, 36,193,231,243,219,203,229,242, 71, 1, 1, 1, 1,167, 78,157,138,181,132, 68,163,209,108,229,243,
-249,180,147,147, 19, 0,192,219,219, 27,245,235,215,135, 74,165, 98,114,115,115, 97,103,103, 71,198,197,197, 65,173, 86, 35, 37,
- 37, 5,213,171, 87,167, 73,146,220,138, 66, 63,228,247,112,245, 78,234,106, 0,171,205,231, 14, 14, 14,105, 37, 45,157, 2,129,
- 0,110,110,110, 72, 74, 74,130, 84, 42,165,126,252,241,199,158,123,246,236,233,113,245,234,213,112, 0,219, 74, 80,205,254, 23,
-251,104,153, 69, 86,201,215, 63,133, 86,231,206,157,103, 69, 70, 70,126, 82,218, 44,156,166,233,143,230,235, 98, 22, 84, 54, 54,
- 54,239, 90,173,192, 48, 76, 89, 22,173, 74,127,143, 64, 32, 16,142, 30, 61, 58,239,247,223,127,175,180,216, 10, 91, 25, 93,108,
-197,122,111, 26,233,231,119,117,218,180,105,221,206,157, 59,151,212,208,171, 38, 71,156, 28,151, 47,176,177,179,131,123,181, 78,
-131,186,247,188,143,194,221,135,150,226, 69, 94, 94,158,176,150,187, 72, 71,146, 26,162, 26,159, 35, 85,136,185,124, 23,153,204,
-141,171,211,166,219,200,100, 60,173, 86,155,131,114,146, 64, 3,128,179,179,243, 9,161, 80, 88,221,124, 46,147,201,108, 89,150,
-133, 72, 36,130, 66,161,144, 80, 20,245,172, 68,227,138, 75, 75, 75,107, 95, 81,193,236,236,236, 78,240,249,252,234, 36, 73,130,
- 32, 8, 80, 20, 5,146, 36, 65,146,100,241,255, 41,138, 2, 65, 16, 40, 40, 40,136,139,141,141,109,111, 65,125,141, 0,130, 9,
-130,184,115,228,200, 17,132,132,132,224,216,177, 99,248,252,243,207,145,155,155,139,135, 15, 31,162, 85,171, 86, 64,225,146,162,
- 69, 40,233,252,110,158, 20, 60,125,250,180, 88,184,148, 60,164, 82,233,135,152,216, 47,135,133,133, 97,221,186,117,108,209,100,
- 66, 76, 16, 68,125, 91, 91,219,167, 79,158, 60,177,200, 15,134,101, 89,232,245,127,190,213, 60,120, 21,249, 67, 84, 42, 57, 48,
- 69, 81,237, 27, 52,104, 64,228,230,230,154, 5, 36, 56, 28, 14, 40,138, 2, 69, 81, 88,181,106,149,176,113,227,198,211,249,124,
-254, 36, 46,151,171, 52, 24, 12,187, 52, 26,205, 60, 0, 57,255,164, 30,169,101,203,150,223, 38, 36, 36,116,174, 94,189,122,196,
- 7,208,176, 6,131, 65, 7, 64, 72, 81, 20,253, 17,250, 40,170,232,217,210,148, 16,251,198,162,115, 62, 10,151,137, 45,130,131,
-131,195,246,163, 71,143,186, 87,175, 94, 29, 6,131, 1, 70,163, 17,249,249,249,184,112,225, 2,180, 90, 45,140, 70, 35,188,189,
-189, 49,115,230, 76,205,248,241,227, 5,107,214,172, 73,207,207,207,239, 95, 1,237,248,125,251,246,137, 21, 10,133, 80,173, 86,
-227,213,171, 87,104,208,160, 1,242,242,242,160, 82,169, 80, 80, 80, 0,189, 94, 15,165, 82,105,103, 50,153,116, 21,112,205, 40,
- 41,178, 70,142, 28,249,128,199,227, 53, 24, 59,118, 44, 18, 19, 19,139,219,252,240,225,195,225,236,236, 92,220,150,138,250,228,
- 74,117,204, 28, 14, 7,124, 62, 31, 92, 46, 55,167, 90,181,106, 32, 8, 66, 16, 23, 23, 87,149,165, 56, 27, 0, 74,154,166,121,
- 37, 5, 22,159,207,199,141, 27, 55,166,241,120,188,178,172, 89,101,181, 75,182, 50,231,255,109, 16, 4,177,148,203,229,242,229,
-114, 57,183,196,132,147, 43,145, 72,224,228,228,180, 18, 64, 71, 11,235, 29, 36,151,203,139,251,247,192,192, 64, 36, 36, 36, 28,
-204,205,205, 29,152,158,158, 14,146, 36,183,146, 36,217,195, 60, 73,205,206,206,134,135,135, 71, 80, 89,124,205,130, 93, 70,129,
- 96,223,178,104,189, 51, 65,131,141,141, 13, 94,191,126, 13,149, 74,197, 62,127,254,156, 24, 61,122, 52,161,211,233, 54, 69, 69,
- 69, 93, 67,225,110,251, 50,181,200,191, 4,149,247,209, 50, 91,180, 44, 29, 0, 8,130,168,112, 54, 97, 48, 24, 36,254,254,254,
-165, 57,124, 17,165, 9,173,162,229,164, 42, 61,232, 52, 77, 75,171, 42,182,222, 69,196,254,157,206, 63,207,156, 50, 83,238, 90,
-179,214,164, 73, 51, 56, 93,186,116,185,190,101,203, 22,147,188,110,199,182,103, 79,108,115, 94,246,221,228, 99, 71,143, 30, 5,
- 10, 29,163, 45,197,229,200,200, 72,151, 9,227,198, 96,230,196,241,199,109,188, 29,120, 18, 66, 46, 22,104, 85,111, 36, 96,213,
-252,218,190,157, 15, 68, 68,164, 0,136, 42,143, 68, 36, 18, 85,127,252,248,177,119,201,141, 4,186,255,107,239,187,227,163,168,
-214,247,159,153,217, 94,178,233,149, 64, 2, 72,147,208, 66,239, 85, 64, 64,177, 80,174, 82, 47, 24, 68,188, 94,208, 43,232, 15,
-189, 98,164, 8,194, 23, 20,164,228,130, 82, 68,175, 52,105, 2, 82, 76, 72,164, 39, 32, 33, 9,161,167,183,205,102, 55,187,155,
-205,150,153,157,223, 31,217, 89, 55, 33,101, 55,108, 4,188,251,124, 62,243,201,206,206,228,217, 51, 51,103,206,121,206,123,222,
-243,190, 38, 19,164, 82, 41,206,156, 57, 19, 40,145, 72, 2, 1,192, 96, 48,160, 83,167, 78,206, 90, 76, 34, 50, 51, 51,219,122,
-121,121,161,162,162, 2, 70,163, 17, 22,139, 5, 86,171, 21, 4, 65,128,207,231, 67, 40, 20, 66, 38,147,185,186,178,239, 42,128,
-215,199,142, 29,187,251,216,177, 99,136,138,138, 66, 89, 89, 25, 50, 50, 50, 56,145,229,146,143, 22,103, 37,114,244,199,226,241,
-120,248,174,117,107,188,145,159,111, 23, 48,235,188,189,241,111,107,227,178,105,116,234,212,137, 77, 74, 74,194,241,227,199,241,
-226,139, 47, 18, 7, 15, 30, 52, 51, 12, 35,200,207,207,191,158,159,159,239, 20,135,213,106,181,151,149,107,183, 29, 5,150,171,
- 66,139,166,105, 47,161, 80,136,202,202, 74,112,150, 7,199,173, 85,171, 86, 80,169, 84,188,242,242,114, 94,126,126,190,116,233,
-210,165,255,136,143,143, 15,213,106,181,175, 61,206, 86,104,211,166, 77, 17,111,188,241, 70, 54,143,199, 99, 71,143, 30, 61, 53,
- 43, 43,235,165,208,208,208,211,191,254,250,235, 26, 0,237, 92,229, 11, 8, 8,184,194,227,241,194,203,203,203, 5,123,246,236,
-177,104,181, 90, 65, 96, 96, 96, 17,215,118,112,247,218, 98,177, 56,181,114, 57, 32, 32,224,138, 82,169, 20,172, 95,191,222, 82,
- 90, 90, 42, 8, 14, 14, 46,226,120,212,106,181, 96,207,158, 61,150,242,242,114,129,183,183,247, 21,141, 70,211, 32,159, 82,169,
-156, 50,125,250,244,196,211,167, 79, 7, 80, 20,133,172,172, 44,148,150,150,194,199,199, 7, 59,119,238, 68, 68, 68, 4,246,238,
-221,171, 82,169, 84,179,191,248,226,139,143,108, 34,171, 33, 31,173, 65,189,123,247,142, 80,171,213,240,241,241,129, 94,175,199,
-149, 43, 87,208,177, 99, 71,228,231,231,131, 36, 73,248,248,248, 96,227,198,141, 21, 4, 65,168,234, 35,146, 72, 36, 47,197,196,
-196,248, 0, 64, 76, 76,140, 79, 76, 76, 76,173, 29, 92,223,190,125,177, 97,195,134,154, 66,203,149,129,129,221,234,228, 32,142,
- 42,251,244,233,131,248,248,248,133, 46,138, 35, 19, 39,218,106, 90,179, 68, 34,145,203,139,105,172, 86,171, 0, 85, 46, 13,132,
- 51,251, 79, 0, 6, 75, 36, 18, 65,205, 47, 43, 42, 42, 4,161,161,161, 3, 93, 16,190,254, 18, 73,149,193, 41, 34, 34, 2, 26,
-141,134, 49,153, 76,147,119,237,218,101, 1,128,232,232,232,201, 12,195, 84,210, 52, 77, 9,133, 66,232,245,122, 4, 5, 5,249,
-215, 99, 27, 93,116,232,135,165, 33, 53,125,180, 66, 67, 67, 17, 29, 29, 13,163,209,136,130,130, 2, 36, 36, 36, 88, 24,134,217,
-189,105,211, 38,107, 96, 96,224,223, 95,125,245, 85, 42, 57, 57,249,109, 0, 11,234,210, 34, 79,153, 53, 43,174, 78,161,101, 83,
-144,241, 0,134,212,188,200,154,226,167, 62,161,213,208,212,161, 80, 40, 84,103,103,103,203, 28, 59, 21,154,166, 17, 22, 22,102,
-101, 89,150,168, 77,104, 61,138, 41,152,207,231,123,125,248,225,135,234, 77,155, 54, 77,185,127,255,254, 18,103,254,103,207,219,
- 29,176,163,134,200,218,188, 50,118,195,250,149, 75,253,238, 28,255, 22, 91,191, 90,205, 48, 12,146, 59,119,238, 60, 80,167,211,
-241,188,101, 22, 40,213, 56,102, 19, 89,206,138, 66, 18,192, 55,151, 46, 93, 74, 30, 51,102,204,111,223,252,119,191, 95,254,221,
-187,231, 69,229,202, 2, 69,155,182, 60, 65,179,136,151,181,149,149,130,201,147, 39, 7, 2,120,181,161, 70, 76,173, 86,163,176,
-176,176,166, 0,195,205,155, 55, 31, 58,215,169,194,145, 36, 24,134,193,190,125,251, 32,149, 74, 33,147,201,170,109,156,200,106,
-228, 66,133, 76, 0, 24, 61,122, 52, 84, 42, 21,228,114,185,211,229,170, 41, 94, 88,150,133,201,100,130,201,100,130,217,108,102,
- 0,240,121, 60, 30,102,229,230,218,173, 60,174, 8,152,154,232,220,185, 51,123,238,220, 57,252,246,219,111,208,235,245, 88,191,
-126, 61, 66, 67, 67,135, 1,248,216, 85, 46, 7, 39,125,166,188,188,156, 95, 94, 94,110,183, 14,242,249,124,187,245,192, 73, 75,
-158,128,199,227,217, 71,163,220,230,104,213,162, 40, 10,193,193,193, 8, 9, 9,193,230,205,155, 5, 45, 91,182, 28,247, 56, 91,
-160, 85,171, 86,181, 89,183,110,221,182, 29, 59,118, 28,155, 50,101,202,143,169,169,169, 51,189,189,189,175,159, 57,115,102,169,
- 72, 36,178, 54,242,253, 14,207,207,207, 15,114,252,202,106,181, 74,105,154,182, 11,219,138,138, 10,167, 7, 24,124, 62, 63, 60,
- 45, 45, 77, 10, 0, 75,151, 46,229, 3,144,114,206,224, 28,103, 69, 69, 5,191, 99,199,142,225,206,214,245,196,196,196,129, 35,
- 70,140, 56,119,242,228, 73,223,136,136, 8,228,229,229, 33, 47, 47, 15,109,218,180,193,242,229,203,245,229,229,229,253, 1,100,
-234,116,186,131, 78,114,134,249,250,250,242,179,179,179, 65,211, 52,186,117,235,134,141, 27, 55, 98,242,228,201,232,212,169, 19,
-202,203,203,145,150,150,134,237,219,183,251, 10, 4,130,122,219, 14,131,193,112, 48, 46, 46,174,121, 77,139,214,212,169, 83,101,
- 69, 69, 69,246, 58, 25, 27, 27, 91,109, 10,209,149, 54,217, 54,181, 85,231,214, 24,208, 52,173, 16,139,197,229, 34,145, 72,200,
-249,103, 37, 36, 36,184,108,205,170, 49, 0,116,101,255,177,129, 19,173,181,244,173, 8, 9, 9,113,154, 71, 36, 18, 17, 92,219,
- 72,211, 52, 52, 26, 13, 19, 26, 26,106,159,222, 79, 73, 73, 97, 34, 35, 35, 25,138,162, 40,161, 80, 8,130, 32, 32,149, 74,235,
-108,240, 89,134,141,125, 97,242,199,213, 86, 29,206,255, 16, 48,155,205, 72, 73, 73,129,217,108, 70, 66, 66,130,229,139, 47,190,
-200, 87,171,213,243, 1,240, 78,156, 56, 49,125,225,194,133, 84, 80, 80,208,136,226,226, 98, 52,164, 69,158, 34,177,245,144,149,
-139,235,133,226,199,141, 27, 71,216,150, 86, 18,156,112,114, 69,104,217, 94,190, 6,123, 94,130, 32, 80, 80, 80, 96,223, 15, 10,
- 10,114,249,183,156,133,191,191,191,190,111,223,190, 94, 74,165,242,224,170, 85,171, 26,101,201,218,188, 50,118,195,138,207, 62,
-241, 83,165, 95, 64,110,126, 1, 84,197,150,228,164,235,247, 15, 0, 56, 0, 0,216,242,108, 60,241,102,198,215,206,114,118, 8,
-144,116,229, 11,120, 7,158, 27, 51,174,249,164,152, 5,228, 91,111,189, 53, 96,250,244,233,154, 41, 83,166,188, 35,151,203,219,
-153,205,230,178,253, 71,143, 62,152, 52,105, 82, 75,134, 97,166,163,129,152, 35, 6,131, 33,107,200,144, 33,142,247, 83,113,234,
-212,169,224, 7, 15, 30, 96,222,188,121, 37,121,121,121,106,199,115,157, 41,163,217,108,206,234,218,181,107,157,211,133,220,148,
- 34, 0,104,181,218, 44, 23,110,233,107,176, 57,190,151,150,150,226,230,205,155,224,241,120,232,211,167, 15,146,146,146, 48, 96,
-192,128, 20, 87,172, 90,149,149,149,136,136,136, 64,101,101, 37,244,122,125, 5, 0,209,206,150, 45, 1, 0,111,151,150,226,202,
- 23, 95,224,194,138, 21,112,172,207,206,162, 75,151, 46,236,133, 11, 23,112,253,250,117, 24,141, 70,204,158, 61, 27, 0, 8, 91,
-221,117, 37,100, 70,107,138,162, 70,143, 25, 51, 38, 12, 0,244,122, 61,113,233,210, 37,136,197, 98,251,187,112,248,240, 97,228,
-229,229,129, 32, 8,248,250,250,134,151,149,149,181, 4,112,191, 30,179, 63,113,255,254,125,124,254,249,231,176, 90,173, 88,184,
-112, 33,218,182,109,107, 23, 88, 89, 89, 89, 88,186,116, 41, 24,134,193, 39,159,124,130, 54,109,218,192, 98,177,136,209,200, 16,
- 26,238,192,187,239,190,123,231,192,129, 3,199,114,114,114,158, 95,185,114,229, 96,130, 32,172,239,191,255,254,231, 10,133,130,
-121, 20,222, 50,141, 22, 55,111,103,217,133, 80,205, 45, 48,192,207,101,190, 91,119,115,236,255,207, 48,142,124, 12,252,253,124,
- 93, 45, 98,133,197, 98,209,191,252,242,203, 62,251,246,237, 35,218,180,105,131,123,247,238,113,150,161, 10,184, 30,210, 33, 79,
-165, 82,181,165, 40, 74,112,251,246,109, 68, 70, 70,162,119,239,222, 88,182,108, 25,148, 74, 37,104,154, 70, 80, 80,144,213, 98,
-177,164,152,205,230,179, 13,112,197,206,153, 51, 71, 0,224, 77,155,101,171,243,252,249,243,173,171, 87,175, 70, 74, 74,138,221,
-130,229,232, 12,239,234,212,161,163,213,201,113, 75, 72, 72, 88, 40, 20, 10, 89, 0, 23,225,122,160,103, 83, 77,139, 86, 99,172,
- 89, 77,133,166, 92,201, 24, 26, 26,154,224,229,229, 53,174,172,172,172,154, 85,171,127,255,254,230,224,224,224, 68,103,121,228,
-114,121, 25, 69, 81,254, 0,144,151,151, 7,153, 76, 38,184,123,247,238, 10, 84, 5,207, 70,203,150, 45, 87,168, 84, 42, 65, 75,
- 91,123, 26, 18, 18, 2,147,201, 84,167, 27,203,249,171, 69,223, 2,248,150,219,247,243,243, 43,208,104, 52,146,213,171, 87,235,
- 86,172, 88, 97, 96, 24,198, 8,224,140, 90,173,182,199,209, 42, 44, 44,212,240,249,124, 63, 31, 31,159,102,156,208,170, 77,139,
- 60,101,168,219,162,101, 83,146,108, 77, 65, 68, 16,196, 67, 14,234, 13, 8,173, 6, 69, 22,195, 48,213,172, 12,156,195,123,109,
-191,101,235,212, 27, 53,117,104, 19, 89,226,253,251,247,239, 92,181,106,213, 69,103,255,207,209, 71,107,203,154,207, 86,114, 34,
-235,247,223, 78,226, 96,134, 70,185,112,197,218,117,141,125, 2,207, 6, 72,187, 4, 7,251,199,127,177, 60, 86,113,231,248,118,
-252,184,229,255,216,223, 47, 95,238,117,249,242,229,105,243,230,205,107, 97,171, 88, 42, 0,215, 0, 76,130, 19,171,116,242,242,
-242, 70,213,232,132, 51, 5, 2, 65,176, 84, 42, 69, 94, 94,158,238,214,173, 91, 46, 79,201, 40,149,202, 81, 77, 80, 1,121,156,
-200, 82, 42,149, 72, 75, 75,195,208,161, 67, 1, 0, 73, 73, 73,232,223,191, 63,146,147,147,209,189,123,247, 20, 0, 61,209, 64,
-160, 86,139,197,162,126,246,217,103,237,214, 45,141, 70, 99, 5,128,152,130, 2,196,133,134,130,199,227,225,194,138, 21, 88,108,
-177, 96,153,139, 2,190,107,215,174,236,165, 75,151,240,224,193, 3,208, 52,141,241,227,199,163,145, 47,125,167, 14, 29, 58,156,
- 58,115,230, 76,160, 92, 46,135, 94,175,135, 78,167,195,140, 25, 51, 48,121,242,100, 24,141, 70,236,217,179, 7,135, 14, 29,130,
-151,151, 23,244,122, 61,244,122,189,239,216,177, 99,207,101,102,102, 14, 2,112,187, 14,161,197,142, 26, 53, 10,137,137,137,160,
- 40, 10,189,122,245, 66,105,233, 31,139,129,130,131,131,107, 59, 70, 61, 78,161,197,227,241,216,132,132,132,149,131, 7, 15, 70,
- 78, 78,206,243,221,187,119, 95, 63,115,230,204,188, 71,229,245,245,246, 66,215,142,173, 97, 52, 26, 97, 52, 26, 17, 22, 22, 6,
-173, 86,139, 59,119,238,192,104, 52, 34, 56,200,199,101,190,232, 78,109,236,124, 65, 65, 65,208,235,245,184,127,255, 62, 76, 38,
- 19, 2, 2, 92, 18, 90,205, 71,141, 26,245,235,238,221,187,253,183,111,223,110, 26, 50,100,136,112,253,250,245,132, 66,161,128,
- 67,199,226, 42, 18,146,146,146, 34, 70,140, 24,209, 62, 61, 61, 29, 9, 9, 9, 48,153, 76,136,142,142,198,173, 91,183,208,183,
-111, 95,232,116,186,139,151, 47, 95, 62,228,140, 97, 24,192, 71,115,230,204, 1, 39,182, 18, 19, 19, 81, 80, 80, 0, 47, 47,175,
-135,132, 22,231,251,104, 91, 53, 30,230, 76, 97, 57, 65,228, 96,121, 90,236,227,227, 99, 6,176,174,145,214, 39, 0, 64, 78, 78,
-142,168,115,231,206, 70,177, 88, 44,180,137,182,181,143,194,231, 78,184, 97, 37, 99,157, 8, 9, 9,153, 31, 16, 16, 48,162, 85,
-171, 86, 40, 42, 42, 18, 8,133, 66,244,239,223,223,220,179,103, 79,115, 72, 72,200,219,206,242,136, 68,162,116,129, 64, 48,168,
-106, 48,193, 32, 59, 59, 27, 44,203, 46,236,212,169,211, 63,181, 90, 45, 74, 75, 75,133, 10,133,194, 62,168,110,223,190, 61,140,
- 70, 99,186, 11,150,183,216,200,200,200,143, 4, 2,193, 50,165, 82, 89, 91, 88, 8,161,143,143,143, 66, 32, 16,192,108, 54, 87,
- 19,155, 53,181,200,211, 46,178,170, 9, 45, 7, 21, 89, 77,232,184, 98,209,114,198,106,192, 57,216, 59,238,115,162,174,230,111,
- 53, 54,134,150,183,183,183,145, 19, 89,203,150, 45,187,216, 24,142,189,187,119,133,122, 91, 43,154,231, 95,252, 25,153,215,147,
-113, 32, 77,173, 92,184, 98,237, 59, 47,188,250, 90, 81, 77, 97,230, 12,218, 6, 74, 59, 5, 7,249,199,175, 89,181, 66,161, 74,
-191,128,130,194, 66,252,124,241,114,178, 25, 72, 3,176,208,157,166,101,160,106,234,144,162,168, 39,169,194,218,157,225, 11, 10,
- 10, 56,145, 21, 13, 0, 3, 6, 12, 72,177,137, 44, 56,107,209, 82,171,213, 53, 83,214,140, 0, 16,192, 93, 63,143,199, 67,255,
-143, 62,114, 89,100, 1, 96,147,147,147,161, 82,169,184,145, 98, 99, 69, 22, 66, 66, 66,254,117,230,204,153,192,111,190,249,166,
-124,199,142, 29,165, 86,171,149,223,181,107,215,240, 30, 61,122, 16, 59,119,238, 4, 0, 76,154, 52, 9, 11, 23, 46,196,141, 27,
- 55, 32,147,201, 48, 96,192, 0,102,201,146, 37, 65,243,231,207,127,187,168,168,232,157, 90,123, 71,171, 85, 32, 22,139, 79, 3,
- 24,150,158,158, 14, 0,231, 80,149,194,137,179, 34,212,121,204,153,206, 87,171,213,242,189,188,188,106, 13, 13, 33,168, 26, 13,
-185,106,129,176,115,254,246,219,111,159,175, 89,179,230,192,123,239,189,119,251, 17, 57,107,181,104,141, 27, 55, 14, 6,163, 25,
-185, 69, 26, 48, 12, 13,131,185,216,101, 62, 71,139,214,184,113,227, 80, 81,105, 66,118,129, 10, 52,205, 64,107,112,186, 47,151,
- 62,247,220,115, 39,126,248,225,135,144,243,231,207,131, 97, 24,235,173, 91,183,238,191,252,242,203,138,247,223,127,223,255, 17,
- 22, 25,125,245,218,107,175, 77,248,237,183,223, 84,237,219,183,247,187,120,241, 34,138,139,139, 65,211, 52,134, 13, 27, 6,161,
- 80,152,189, 98,197, 10, 1,128,175,156,125, 54, 54,177,101,190,124,249,242, 27, 23, 46, 92,240,243,243,243, 19, 90, 59,116, 64,
-193,201,147,216,183,111,223, 67,255,176,101,203, 22,192,201, 40,252,156,197,233,210,165, 75,110, 17, 88,213,122,106,161,176,209,
-211,143, 79, 43, 46, 93,186,148,247,214, 91,111,117, 84, 40, 20,235, 6, 14, 28, 56,212,223,223,159,244,245,245, 77,104,214,172,
-217, 63,187,118,237,234,244,236, 2,159,207,159, 41,147,201,238,208, 52, 77,233,116, 58,232,245,250,170, 70,154,166,133, 36, 73,
-162,101,203,150,246,190,164, 87,175, 94, 8, 9, 9, 97, 50, 50, 50,102, 58,203, 95, 82, 82, 82,109, 21, 98, 45,152,211,191,127,
-127,158,209,104,196,131, 7, 15,146, 28, 15,212,166, 69,158, 18,196,212, 43,190,184,139,114,188,184,102,205,154,229, 88, 44, 22,
- 54, 13, 96,175, 93,187,198,198,196,196,212,187, 85, 86, 86,178, 65, 65, 65, 5,181,116,126,112,228, 52, 26,141,213,254,207,104,
- 52,178,193,193,193,140,193, 96,120,136,211, 96, 48,176,225,225,225,121,245,113,214,130, 25, 87,175, 94,221,180,120,241,226,222,
- 46,220, 32, 59, 39,187,185, 3,187,125,251,246,191,177, 44, 59,120, 96,199,136,235, 19,187, 6,179,253,219, 6,229, 31,218,187,
-123, 50,203,178,131,107,110, 92,128,211,250, 56, 59, 4,203,158, 29, 30,213,162,236,247,227,223,179,103, 86,255,131, 93, 51,190,
- 45,219, 61,220, 75,221, 33, 64,226,106,142,152, 6,179,165, 71, 69, 69,101, 90,173, 86,214,100, 50,177, 81, 81, 81,183,220,193,
-217, 8,212,199,217, 13, 85,190,108,175,213,242, 93,183, 71, 40,231,239, 44,203,178, 42,149,138,213,233,116,172,209,104,100, 25,
-134, 97, 29, 40, 13,213,230, 0, 0, 32, 0, 73, 68, 65, 84, 1,224,119, 39, 56, 89,179,217,204,150,149,149,177,112,222,231,174,
- 86,206,208,208,208,251,119,239,222,101,159,121,230,153, 28,155, 57,126,190, 94,175,103,107, 66,175,215,179, 67,135, 14,101,111,
-221,186,197, 70, 70, 70, 86,222,186,117,139, 13, 13, 13,189,217, 64, 57, 91, 53,111,222,252,116, 64, 64, 64, 2,128,182, 46, 28,
-171,247,126,238,217,179,167, 53,203,178,179, 89,150,141,169, 99,155,205,178,108,135,199,205,105,187,191, 69, 44,203,178, 21, 21,
- 21,172, 74,165, 98,243,243,243,217,138,138, 10, 86,167,211,177, 87,175, 94,101,207,159, 63,207, 94,191,126,157,245,243,243, 43,
-114,134,147,227, 51,153, 76,108,121,121, 57, 91, 92, 92,204, 26, 12, 6, 86,175,215,179,169,169,169,236,149, 43, 87,216,244,244,
-244,218,248, 30,226,244,247,247,223, 82, 88, 88,168, 59,119,238, 92,197,230,205,155, 43, 66, 66, 66,210, 1, 68, 0,104,231,235,
-235, 91,248,143,127,252,131,149,203,229, 89,141,124,143, 58,242,249,252,171, 43, 87,174,188,116,228,200,145,162, 67,135, 14,153,
-182,109,219,150, 59,111,222,188,179, 60, 30,239, 42,128,142,141,124,143,130,124,124,124,206, 93,188,120,145, 46, 43, 43, 99,213,
-106, 53, 91, 94, 94,206,234,245,122,214, 96, 48,176, 38,147,137,181, 88, 44,236,217,179,103,217,224,224, 96,199,105,201, 69,245,
- 12,172, 23,176, 44,251, 47,150,101,121,238,110,235, 28,184, 7,186,139,211, 29,109, 29, 73,146,102, 91,219,209,167,106,183,254,
-253,199, 85,206,225,195,135,127, 50,121,242,100,118,244,232,209,108,116,116,244, 67, 91,247,238,221,217,185,115,231,178, 71,142,
- 28, 97,191,248,226,139, 79,220, 80, 78, 30,170, 22,189, 44, 31, 62,124,184, 37, 49, 49,145,157, 52,105, 18, 11, 96, 84,125, 90,
-228,175, 32,184,184,240, 14,132,227, 95, 0, 48,155,205, 57,153,153,153,161,237,105,154, 2,128,175,191,254,250, 33,203,148, 35,
- 18, 19, 19,105,130, 32,238,212,247,235,102,179, 57,231,204,153, 51,193, 27, 54,108,224, 59,152,128, 65,211,180, 53, 63, 63,159,
- 92,191,126,125,181,243,227,227,227,105,154,166,179, 93,188,200,237,221,186,117,219,238,142,187,117,246,198,131,127,158,248,249,
-167,128, 62,189, 7,170, 21,126,126,181,142,194,246,188,221, 1,196,155,245, 91,181, 8, 30,185,108,229,242, 88, 31,110, 10,242,
-191, 41,133,234, 74, 35, 51, 52, 67,105,248,221,221, 79, 88,167,211, 61,224, 86, 2,234,245,250,236, 39,176, 18, 94, 69, 85,140,
- 43,186,198,119, 61,241,136, 78,167, 86,171, 21,222,222,222,118,107,104, 35, 44,162, 44,103, 97,229, 30,221,163,148,135,101,217,
-223, 82, 83, 83, 35,103,204,152,225,181, 99,199,142,187, 12,195,240,103,205,154,101, 14, 9, 9, 17, 36, 37, 37, 89, 0, 16,131,
- 7, 15,230, 21, 22, 22,178,121,121,121,170, 23, 95,124, 81,251,198, 27,111,248, 95,187,118, 77,104,181, 90, 27, 10, 90,120, 47,
- 39, 39,103,120, 35,142,213,139,137, 19, 39,222,197,163,167,177,105,114, 78, 14, 42,117, 57,238, 62,200,179, 69, 48,183,130,201,
- 42,178,251, 85, 89, 44, 52, 84,229,165, 46, 91,180,238,220,207,179,165, 24, 99,192, 48,249, 54,190, 42,135,120,182,172,162,225,
-222,132,199, 27,176,100,201,146, 49, 36, 73,146, 23, 46, 92, 48,174, 90,181, 42,167,164,164,100, 60,128,108, 0, 40, 43, 43, 27,
-178,125,251,246,239,156, 8,229, 80, 23,210, 44, 22, 75,223, 69,139, 22,189, 3, 96, 0,128, 22, 54,238, 36,155, 37,171,177, 17,
-204,139,213,106,245,200, 49, 99,198,156,164, 40,170,165,195,123, 20, 0, 64,201,189, 23, 44,203, 6, 21, 21, 21, 61,239, 12, 33,
- 65, 16,107,155,170, 33,105, 74,238, 71,108,135,158,138,149,140,167, 79,159,254,116,252,248,241,188,136,136,136,255, 23, 17, 17,
- 65,150,149,149, 65,167,211,129, 36, 73,132,132,132, 32, 42, 42, 10, 33, 33, 33,214,244,244,244,229, 31,124,240, 65,131, 49,249,
-158,125,246,217,214, 22,139,229, 25,146, 36, 91, 3,104,205,178,108,107,130, 32, 90, 3,240, 3, 0,133, 66,161,136,140,140,228,
-245,233,211, 7,189,123,247, 70,124,124, 60,246,238,221,251, 45,128, 19,142,214,172,154, 90,228, 73, 64, 90, 55,176, 29,175,130,
-184,209, 29,131, 9, 43,226, 89, 18, 67,162,146,237,113,246,106,138,172,186,147, 74,215, 98,250, 27, 53,108,216, 48,251, 11,231,
- 68,167,242,160,161,151,175,164,164,100,212,204,153, 51,171,113, 50, 12, 99, 44, 45, 45,125,171, 95,191,126, 27, 41,138, 18,213,
-168,176, 89,197,197,197,127,106,174,190,154,113,180, 70,141,121, 73,249,168,156,114, 1,249, 76,230,209,255,160,168, 88,137,255,
-166, 20,150,105, 77,204,144, 91,202,138,212,166, 40,127, 86, 86,214,232,167, 64,241,215, 38, 90, 31, 53,121,118,137, 19, 1, 73,
- 27,202, 81, 71,216,194,137,184,229, 37, 47, 44, 44, 92,253,209, 71, 31,141, 92,190,124,121,224,177, 99,199, 20,220, 0,229,149,
- 87, 94, 41, 78, 77, 77, 29, 8, 64, 84, 89, 89,121,106,249,242,229,129,177,177,177,254, 0,252, 1, 96,236,216,177, 69, 69, 69,
- 69, 27,224, 65,189,176, 88, 44,185, 81,207,182,183, 15,252, 28, 67, 58, 56,126,166,105, 58,215, 21,190,218,120, 28,247, 25,134,
-169,151,143,162,168,247,122,247,238, 77,189,247,222,123, 69,199,142, 29,227, 18,233, 58, 42,180,204, 6,130,146, 58, 3, 35,128,
- 85,182,205,157,208,171, 84,170,190, 46,254, 15,227,169,141,181, 14, 40, 93,217,127, 44, 56,120,240,224,199,147, 38, 77,218,238,
-231,231,183,171,117,235,214,237,131,131,131, 21, 18,137, 4, 70,163, 81,107, 50,153,110,102,102,102, 78,249,248,227,143,239, 57,
-101,225,216,190,157, 2, 32,176, 90,173, 98,146, 36,101, 0, 20, 4, 65,248,114, 66,139, 32, 8,152,205,102, 60,120,240, 0,139,
- 23, 47,102, 78,159, 62,253, 5,128, 79, 92, 24,184,246, 4, 16,232,208,142, 7, 2, 48,161, 42,128,109, 9, 65, 16,151,155,250,
-126, 17, 86,196,119,188, 10, 34,173, 27,106,235, 39,234, 79, 42, 93,215, 11, 87, 82, 82,210,215,221, 47,113, 93,156, 37, 37, 37,
- 17, 79,202, 27, 50,221,184,234,123,108, 89, 85, 45,207, 33, 39,194,106,219,111, 8, 26, 3, 61,239,171, 19, 55, 86, 27,105,214,
-106,166,173,127,191, 85, 82,145,230,105,135,220,142,231,220,245, 46,185,177, 76,169, 25, 25, 25,253,230,205,155,247,177, 84, 42,
-237, 5, 0, 21, 21, 21, 23,242,243,243, 63,131,109, 85, 97, 67,199, 61,168, 27, 74,165,178,199,147,200,103, 50,153,254,217,175,
- 95,191, 47, 25,134, 89, 67,211,116,210,255,192,163,168,244,212,198,167, 23, 63,254,248,227, 61, 0,125, 1, 96,194,132, 9, 20,
- 0,236,221,187,215,101,241, 60, 99,198, 12,134,101, 89,179,173, 62,232, 81,181,186,176,140,107, 83,245,122,125, 89,126,126,126,
- 58,195, 48,233, 0,190,131,235, 43,110, 3, 9,130, 56,194,178,236, 56,155,112, 59,194,178,236, 56,199,239,154,218,170,213,192,
- 41, 13, 59,195,123, 80,133,189,105, 32,106, 78, 5, 54,180,223, 16, 50,139,244, 9, 0,186,123,238,238,255, 36,238,230,231,231,
- 79,127,132,227, 30, 60,125,200, 54,153, 76,227,255,135,174, 87,227,121,228,127,145,254,175, 17, 2,139, 67,122,122,122,147,185,
- 8, 60,110,116,188, 90,125, 0, 94,115,223, 1, 49,181, 9, 47,143,208,242,192, 3, 15, 60,240,224, 81,160,246,220, 2, 15,254,
-202,224,124,179,184,253, 58,124,180,106,250,103,217,247, 9,212,189,114,192,149,172,228,141, 89, 37,113,202,195,233,225,244,112,
-122, 56, 61,156,143,157,211, 7, 64, 36,128,149, 13,156, 87,115,117, 97, 17, 0, 37, 0,139,231,126,122, 56, 31, 65, 63, 56, 5,
-150,101,199,214, 55,117, 72, 16,196,209,166, 18, 90,118,103,248,110, 88, 18,117, 21, 75,184,125,103,133, 86, 83, 99,132,135,211,
-195,233,225,244,112,122, 56, 61,156, 30, 78, 15,231, 35, 10,173,161, 31,124,240,193,135,168, 10,141,193,126,240,193, 7, 31,178,
- 44, 59,182,234, 16, 59,182, 41,127,251, 70,119, 12, 78,235, 6,150,219,110,116,199,224, 58, 78,141,113,216,236,240, 76, 29,122,
-224,129, 7, 30,120,224,129, 7, 79, 58,206,173, 88,177,162, 98,197,138, 21,156,227,123, 9, 0,194,102,225, 42,105,202, 31,182,
- 77, 19, 58,179, 80,170,254, 20, 60,143, 1, 97, 36, 79, 48,149, 47, 16, 13, 5,107,141, 2, 0,144,212, 13,198, 84,249, 43, 77,
-155,119, 1,200,111, 44,113, 7,224,217, 54, 62,146, 67, 70,134, 17,228,104, 77, 19, 50,170,210, 28,184,140, 9, 64,127,145, 80,
-248,139,200,199, 71, 82,219,113,163, 90,109, 48,154, 76, 35,247, 2,191,121,222, 1, 15, 60,240,192, 3, 15,158, 18,200,124,125,
-125, 79,147, 36, 25,193,125,225, 24,119,176,102, 12, 66,134, 97, 10, 84, 42,213, 72, 84, 77, 21,255,153,156,142,255,111, 66, 35,
-251,114,119,195,213,169, 67, 30, 80, 45, 10,107,131, 25,179,219,135,200, 6,182,111, 29,177, 59,191,176, 40,165,188,210, 52, 43,
- 51, 95,167,114,181,144, 20, 95,244,134,151,183,207,178,191,205,252,167,127,219,118,237,137,230,205,155, 1, 44,144,157,147, 27,
-124,231,246,173,225, 63,238,248,234,221,114,141,106,177,197,104,252,143,171,220,207, 2,178, 22,114, 81,210,127, 62,120,221,135,
- 7, 26,175, 45,221,125,156,208,153,155,167, 87, 45, 55,117, 73,100,249,248,251,159, 88,113,234,148,196,183, 75,151,106,199, 88,
-150,173,202,175,247,251,239,146,255, 55,114,228,137, 9, 42,213, 40,143,216,250, 75, 34, 68,161, 80,204,231,243,249, 67,204,102,
-115,132, 80, 40,204, 97, 24, 38,161,172,172,108, 29,128, 60,207,237,241,192,131, 6, 81, 95,126,205,199,150,123, 19, 0,228,114,
-249, 21,146, 36,195, 29, 69, 0,151,179,151,219,175,249,215,106,181,222, 83,169, 84,253,234,161,109,237,231,231,183, 17, 64,207,
-134, 2, 38,219, 98,179, 93, 86,169, 84,111,161,238,213,122, 94,190,190,190,159, 18, 4, 49,145, 36, 73,170,161,107,178, 90,173,
- 12,203,178,123,202,202,202, 62, 1,160,173,235, 60, 95, 95,223, 83, 25, 25, 25, 61,131,130,130, 26,180,210,208, 52,141,236,236,
-236,192, 94,189,122,157, 85,169, 84, 29,154,146,211, 21, 45,242, 56, 81,207,170,195, 58, 43, 58,128,106,249,133,136,250, 31, 36,
-166,126,179,236,173,102, 5, 89,183,155,205, 89,254,125, 59,194,159, 25,114,179,212, 80,232,236, 15, 10,196,242, 67,125, 7,141,
- 26, 58,247,157,247,100, 87, 83,111,226,151,248,243, 40,215, 27, 65,145, 36,124,188,164,104,215,238, 25, 98,109,220,190,128,111,
- 55,175, 93,115, 33,241,228,216, 74,189,230, 69,151,100,186,148,183,120,225,203,189,100,254,126, 12, 96,101,240,175, 49, 93,101,
-255,239, 72,202, 98, 84,208, 31,186, 44,178, 78,159,150, 22, 23, 21, 33, 54, 44, 12, 60,154,134,152, 36, 33, 38, 8,136, 73, 18,
- 50,177, 24,163,183,109,195,103,199,142, 73, 63,126,254,121,143,216,250,139, 65, 46,151,207, 12, 11, 11, 91,181,117,235, 86,255,
- 86,173, 90, 65, 38,147, 65,165, 82, 5,100,102,102,118, 91,176, 96,193,244,130,130,130,143,202,203,203,183,120,238,148, 7, 30,
-212,137,110, 0, 82, 80,123,254,210,250,142,213, 9,177, 88, 92, 84, 89, 89, 25, 84,223, 57, 66,161,176,216,100, 50, 5, 55,196,
- 69,146,100,120, 94, 94, 94,144, 84, 42, 5,195, 48,182,108, 0, 86,251, 64,218, 49,251,137, 45, 80, 45, 58,116,232, 96,174,143,
-211,203,203,235,235,226,226,226, 17, 92,158, 64, 7, 65, 85, 43,242,242,242, 70,116,236,216,241,107,173, 86, 59,178, 14,241,242,
-233, 59,239,188, 51,191, 83,167, 78,156, 21,200,150, 5,161,234,175, 82,169,196,188,121,243,236,191, 97,181, 90,113,242,228,201,
-119,102,206,156,137,178,178,178, 5,245, 92,123, 68, 80, 80, 16, 97, 75, 40, 94, 39,150, 44, 89,130, 37, 75,150,224,171,175,190,
- 34,248,124,190, 79, 3,247,211, 45,156,206,106,145,199, 97,193,106, 32, 50,252, 81, 84,247,205, 58,250,144,208,114, 22, 36,107,
-253,121,233,186,173,179, 98,103, 12, 32,190, 89, 48,162,237,155, 95,157, 58, 79, 10,216, 65,233, 5,149, 57, 78, 88,178,254,222,
-179,223,136, 33,243,230, 47,148,125,255,211, 25,100,166,255,142,140,164, 31,170,157,211, 99,228, 76, 20, 42,181,152, 57,247, 95,
-114,130,226, 13, 73, 60,117,240,239, 22,163,225, 27, 39,173, 89,193, 17, 34,225, 63,250,244,138,226,231, 73, 50, 17,226, 43,193,
-128,238,109,248,205, 79, 92,255,135, 30,244,151,233, 85,171,100, 92, 18, 89, 91, 95,127, 29, 3, 45, 22, 4, 81, 20, 40,130, 0,
- 5,128, 36, 8, 84, 26,141,184, 60,117, 42,122,237,220,137, 79, 14, 31,150,126,250,194, 11, 46,137, 45,153, 76,118,149, 32, 8,
- 95,157, 78, 55, 22, 85,137,165,159, 6,116,148,203,229, 71, 89,150, 45,211,235,245,221,158,160,114,133,162,106,142,190,230,232,
- 88,128,170, 21, 85, 46,101, 22, 22,137, 68,111, 76,152, 48, 97,237,134, 13, 27,164, 69, 69, 69,200,207,207, 7,195, 48, 16,139,
-197,104,219,182, 45,113,234,212, 41,255,133, 11, 23,174, 62,122,244,168, 72,171,213,126,233,202,192,134,207,231,199,249,249,249,
- 61, 31, 28, 28, 44, 43, 46, 46,174, 80,171,213, 39,141, 70,227, 27,104,124,218, 20,146,207,231, 79,137,140,140,124, 41, 44, 44,
- 44, 56, 47, 47, 79,153,155,155,123,200,104, 52,126,139, 70, 38,106,118,184,167, 93, 96,139, 86, 15,160, 32, 50, 50,242,198,131,
- 7, 15,138,221,200,153, 31, 25, 25,153,214, 8, 78, 25,128, 31, 1,132, 53,112, 94, 62,128, 73,112,209,154,237,129,251, 68,150,
- 45,165, 85, 77, 65, 85,223,177,122, 97, 52, 26, 3,205,102, 51,248,117, 36,139,215,235,245,240,242,242, 10,116,182,144, 18,137,
- 4, 63,252,240, 3,248,124, 62,248,124, 62,202,202,202, 16, 30, 30,110,223, 23, 8, 4,246,207, 45, 90,180,104,144,143, 97,152,
- 94, 20, 69, 65,167,211,129, 97, 24,251,166, 86,171,193,178, 44, 68, 34, 17, 24,166, 42,157,147,195,241, 94,117,241, 17, 4, 49,
- 49, 44, 44, 12,223,127,255, 61, 76, 38,211, 67,199, 21, 10, 5, 82, 83,255, 72, 50, 66, 81, 20,122,247,238, 77, 18, 4, 49, 17,
-192,130,122,120, 89, 0,136,137,137, 1, 69, 81,160, 40, 10, 36, 73,218, 63,115, 27,195, 48, 88,178,100, 9,106,164, 38,251,211,
- 56,159, 52, 52, 16, 25,190, 0,117,248,104,145,245,145,182, 15,150,189,181,224,181, 17, 21,139,255, 62,134,253,112,218,115,236,
-194,215, 6,179,207, 15,234,252, 19,197,227, 17, 23,211,178, 17,238, 13,124, 59,175,103, 68,243, 0, 89,106,148,159,188, 93, 45,
- 20,142, 75, 60,195,164, 50,197,231,111,253,243, 95,242,163,103,175, 35, 59, 39,251, 33,145, 5, 0, 87,126,249, 22, 5,249,121,
- 72,201,200,197,148,191,191, 45, 87, 40,124, 62,175,209,160,214,185,108,212,219, 75,240,197, 7,147, 6,136,117,150,124,104,125,
- 1,170,181, 16,124,169, 30, 11,199,117, 17, 41,188, 4,245,165,170,176,115,138,132,194, 95, 86,156, 58,101, 23, 89,253,141, 70,
-136, 24, 6, 52,195,216, 69,150,137,166, 97, 48,153, 16,170,211,225,206,204,153, 96, 45, 22,124,116,224,128, 84, 36, 20,254,226,
- 76, 57, 1, 64, 32, 16,132, 30, 58,116,168, 69,231,206,157,227,225,124, 48,211, 83, 77, 80,119,156,229,236,222,181,107,215,132,
-157, 59,119,182, 16, 8, 4,161,238,224, 20,139,197,175,202,100,178, 18,177, 88,252,106, 35,203, 73, 2, 88, 58,107,214,172,228,
-103,158,121,230,140, 77, 88,217, 69,205, 51,207, 60,115,106,214,172, 89, 87, 1, 44,169,163,174,215,198,217, 44, 44, 44,108,217,
-134, 13, 27,164,183,110,221, 66, 94, 94, 30, 44, 22, 11, 94,123,237, 53, 48, 12, 3,131,193, 0,147,201,132,149, 43, 87,202,252,
-253,253, 23,163, 42, 81,176, 51,215, 46,240,246,246,190,181, 99,199,142, 9,247,239,223,151,159, 57,115,134, 72, 77, 77,149,173,
- 94,189,122,188,191,191,127, 38, 0, 81, 35,238, 39, 25, 26, 26,250,205,193,131, 7,223, 74, 77, 77, 13,223,191,127, 63,255,194,
-133, 11,161,155, 55,111,158, 29, 26, 26,186, 19, 0,213,200,103,212, 77, 42,149, 14,127,255,253,247,173,231,206,157,203, 59,119,
-238, 92,222,218,181,107, 49,112,224,192,254,177,177,177,209,141,228,236,238,229,229, 53,236,253,247,223,183, 38, 38, 38,230, 95,
-188,120, 49,119,245,234,213,228,176, 97,195, 6, 44, 91,182,172,139,139,156, 63,158, 59,119,110,112, 78, 78, 78,171,220,220,220,
-150,185,185,185,145,185,185,185,145,121,121,121, 17, 5, 5, 5, 45, 10, 11, 11,155, 23, 23, 23, 55, 79, 72, 72, 24, 0, 96,247,
- 19,246, 30,253, 47,112,242, 56, 33,165, 82,169,112,244,232, 81,216,172, 87,221, 28, 69, 86,121,121, 57, 10, 10, 10,184, 99, 60,
-103,202,169, 80, 40, 78,111,221,186,149,173,172,172,132, 70,163, 65,113,113, 49,114,114,114,112,231,206, 29,148,150,150,226,230,
-205,155,144, 74,165,167,157, 41, 39, 65, 16, 96, 24,198, 46,164, 78,158, 60,137, 89,179,102, 65,165, 82,217,191,227,241,120,246,
-207,220,255, 52,196,201, 89,158, 24,134,193,197,139, 23, 49,103,206, 28,172, 93,187, 22,187,119,239,198,145, 35, 71,160, 82,169,
-236, 98,139,166,233, 6, 57,149, 74, 37,172, 86,231,198, 76, 44,203, 66,163,209, 56,253,220, 29, 5, 16,143,199,123, 72, 20,113,
-155, 43,117,233, 17, 57,159, 88, 56, 17, 25,190,238, 17, 54,247,193,102,170, 27, 82, 77,104, 69,134, 44, 94, 53,127,162, 4,140,
- 25,172,197, 0,152, 43, 0,179, 14, 86, 83, 5, 8,129, 4,176, 24, 16, 40, 82,225,199,185,237, 21,139,190,191,155,206,220, 36,
-198,102, 40,181,199,107,237, 17,120,130, 41, 19,103,188,227,159, 91, 92,142,188, 34, 13, 40,242,143,126, 47,122,196, 12,240, 40,
- 18,151, 78, 84, 25,174, 72,138,130, 70,111,132, 90,103,198,132, 25,243,253,254,179,246,223, 83,104,115,101,189, 49, 94, 58, 1,
-109,163,228,242,151, 59,118,108, 65,166,139, 50, 16,253,124, 18, 24, 43,192, 38,190,128,110,101, 65, 84,135, 95,132, 47,235,181,
-230,101,169,192,173,122,173, 25, 62, 62, 18,223, 46, 93, 16, 27, 22,134, 65, 22, 11, 4, 44,139,231,138,138,240,251,252,249, 48,
-238,219, 7, 18,128,224,213, 87, 49,116,221, 58,156, 13, 11, 67,136,193, 0,245,187,239, 34,240,248,113, 8, 20, 10, 9, 74,156,
- 91,252, 64, 16, 4,134, 12, 25,130, 83,167, 78,249,143, 30, 61,250,196,245,235,215, 95,161,105,250,108, 99, 30,162,183,183,247,
- 21, 30,143, 23,222,208,121, 52, 77,231,106, 52, 26,151,211,140,240,120,188, 65,189,123,247, 62,176,127,255,126, 95,179,217,236,
-150, 81,136, 80, 40, 28, 61,126,252,248,173,155, 54,109, 82,204,158, 61,123,235,145, 35, 71, 42, 76, 38,211,113, 87, 44, 57, 0,
-150,110,217,178,229,205,152,152, 24,159,217,179,103,179,119,238,220,113,180, 94, 5, 14, 28, 56,240,153,173, 91,183,134,244,236,
-217,243,157, 57,115,230, 8, 0,124,212,144,149, 71, 46,151,207,221,186,117,107,128, 82,169,132, 78,167,179, 55,178,185,185,185,
-144, 72, 36, 32, 73, 18, 36, 73,130,207,231,227,243,207, 63,247,159, 59,119,238,124,149, 74, 53,223, 9, 43, 89,220,198,141, 27,
- 3, 71,142, 28, 73,222,191,127, 31, 36, 73, 66, 44, 22,227,245,215, 95, 39, 13, 6,131,111,108,108,236,118,189, 94, 63,217,149,
-123,200,231,243,167,196,197,197,181,235,223,191, 63, 47, 35, 35, 3,125,251,246,197,165, 75,151,240,234,171,175,242,181, 90,109,
-203,133, 11, 23,206, 50, 26,141,174,198,113, 9,149, 74,165,157,126,253,245,215,156,230,205,155,219, 27,150,150, 45, 91, 50, 99,
-199,142, 85,101,100,100,180, 63,119,238, 92,105,191,126,253, 92, 73, 88,222, 76, 42,149,118,248,249,231,159, 11, 98, 99, 99,135,
-111,217,178,101, 60, 0,244,234,213,235,208,103,159,125,118, 70,165, 82, 69,157, 61,123, 86, 53,104,208,160, 92, 39,249,194, 66,
- 67, 67,153,121,243,230,201,235, 59,105,219,182,109,106, 84, 37, 92,110, 5,224, 30, 60,248,179, 64, 3,136, 38, 8, 34,229,232,
-209,163,232,221,187, 55,142, 30, 61,138,177, 99,199,166, 56,138,129,212,212, 84, 12, 26, 52, 8, 54,139,150, 83,190, 90, 26,141,
-230,131, 37, 75,150, 36, 78,153, 50, 69, 90,173, 49, 32, 73,248,248,248, 96,204,152, 49,149,122,189,254, 3,103, 11,202, 48, 12,
-120, 60, 30,114,115,115,177,109,219, 54, 44, 95,190, 28,109,219,182,133,197, 98,121, 72,108,217,218, 61,167, 26, 63,154,166,113,
-249,242,101,236,218,185, 19, 31, 45, 94, 12, 47, 47, 47, 0,128,217,108,134,170,172, 12, 98,177,216, 46,198, 26, 16, 78,123,110,
-223,190, 61, 63, 60, 60,188,218,148, 33,247,215,214,102,193,106,181,130,166,105, 84, 86, 86, 98,237,218,181, 52,203,178,123, 26,
-234,127, 56, 81, 52,127,254,124, 24,141,127, 24,212,187,216,124,146, 35, 35, 35,209,181,107, 87,251, 62, 73,146,172,179,156,255,
-233,215, 9, 6,135,179,219, 47, 89, 13, 0, 8, 15, 15, 71,251,246,237, 17, 26, 26, 90, 39,103,109, 90,228,113,195,133,200,240,
-117, 11,173,186, 50,101,167,223, 47, 92, 57,123,225,234,213, 50, 49,197,255,231, 75,157,209,194, 71, 0, 72,252, 32, 24,180, 8,
-132, 79,213, 64,158, 85,221, 3,126, 89,132, 53, 47,171,200,152,239, 42,127, 50, 51,190,129,119,203,202, 30,114,194,227, 11,196,
- 67, 91,183,105, 71,100, 23,168,192,227,241, 32,243, 14, 64,191,151, 22,128,162, 72,200,125, 2, 64, 48,134, 63, 20, 49, 73,129,
- 71,241,160,210, 26, 16,217,170, 13, 41, 18, 75,134,234, 27, 16, 90, 10,111,254,198,247, 39,247, 19,151,210,185,144,180, 16,131,
-225,186,211, 48, 33, 72,127, 45,222, 27,221, 86, 18,115,232,250, 70,104, 44,195,156,185, 49, 20, 77, 35,136,162, 96,102, 89,252,
- 62,127, 62,162,227,226,144,194, 9,195,184, 56,164,196,196,192,143,207,135,136, 36,193, 90, 44, 15,205,233, 59, 35,180, 0, 32,
- 39, 39, 7,251,246,237,243,155, 56,113,226,129,212,212,212, 41, 46,138, 13,142, 43,224,226,197,139, 65,173, 90,181,170,243,156,
-123,247,238,161, 71,143, 30, 46, 79, 79, 9,133,194,209,195,134, 13,251,126,223,190,125,222,105,105,105, 8, 10, 10,122,100,161,
- 37, 18,137, 6,141, 24, 49,226,251, 29, 59,118, 40, 74, 74, 74, 16, 23, 23,167,120,225,133, 23,118, 39, 39, 39,191,100, 52, 26,
-157, 17,155,213, 68, 86, 92, 92,156,122,219,182,109,255, 65,245, 41,194,130,109,219,182,125,211,179,103,207,183, 98, 98, 98,124,
- 0,188,105,243, 29,168, 87,108,137, 68,162, 33,173, 91,183,174, 54,170, 21,137,170,140, 77, 50,153, 12,222,222,222, 16, 8, 4,
- 48, 26,141,136,142,142, 38,132, 66,225, 0,103,174,217,203,203,107,196,203, 47,191, 76, 38, 37, 37,161,176,176, 16, 62, 62, 62,
-144,203,229, 96, 24, 6,179,103,207,166,214,174, 93, 59, 68,175,119,109,134,171,121,243,230,227,135, 15, 31,206,187,113,227, 6,
-238,223,191, 15,163,209,136,204,204, 76, 40, 20, 10, 76,155, 54, 77,176,106,213,170, 23,242,242,242, 92, 21, 90,157, 98, 98, 98,
-138, 28, 69, 22, 7,153, 76, 70,180,107,215, 78,229,239,239,223, 29,128, 43, 66,171,211,219,111,191, 93,188, 98,197,138, 65,167,
- 78,157,178, 7,189, 60,117,234,212, 66, 0,248,242,203, 47, 19, 3, 3, 3,187, 3,112, 86,104,129,101, 89,235,223,254,246,183,
- 44,161, 80, 8, 62,159, 15,161, 80, 88,109, 19, 8, 4, 32, 73,210,139,123,157,255,194,162,166, 39,128,255, 67, 85,114,221,197,
- 0, 46, 62, 33,229,186, 10, 32,122,236,216,177,118,177,117,236,216, 49,140, 30, 61, 26,106,181, 26, 55,110,220,112, 20, 89,174,
- 36, 88,190,106,177, 88,174,253,240,195, 15,253, 38, 78,156, 72, 56,188, 95, 72, 75, 75,195,205,155, 55, 83,156,229, 35, 73, 18,
- 86,171, 21,124, 62, 31,171, 87,175,134,217,108,198,119,223,125,135,189,123,247,130, 36, 73, 16, 4, 1,130, 32,160, 80, 40,240,
-213, 87, 95,185,212,238, 49, 12,131,237,219,183, 99,209,194,133,118,145,101,155,201, 64, 72,112, 48,252, 3, 2,112,247,238,221,
- 6,133, 86, 89, 89,217, 39,135, 15, 31, 70,125,206,240,135, 15, 31,182,127,174,225, 12,223,112, 63, 71, 81, 48, 26,141,120,238,
-185, 63, 82,197,190,253,246,219,246,207, 42,149, 10, 20, 69,113,247,130,112,150,211,192, 2, 47,137,255,248,110,204,123,239, 85,
-179,208,213,197, 89,151, 22,121, 18,173, 91,181,136,173,104,155,117, 54, 20,192, 88, 84,249,104, 21, 0, 13,248,104,221, 42,214,
-111,224, 17, 5, 93, 87,204, 27, 57,163, 69,144, 55, 88, 93, 17, 4,195, 62,193,181, 18, 9, 86,175,253, 25, 0,240,175,215,123,
-160,203,136,165, 48,125, 59, 18,243,251, 82,194,169,185,198,247, 1,124,252,112,195,104,237, 16,222, 44, 12,215,238,164,130, 71,
- 81, 16,122, 7,192,219, 47, 24, 86,218, 4, 77,241,125,196,239,255, 26, 0,176,101,251, 30,144, 36, 9, 30,143,130,209,196,160,
-109,139, 48, 88,173,214, 14,245,149,243, 89,160,223,144,224,128,222,205, 35,124,136, 27,190,247,209, 46,200,191,198, 68,136, 8,
-109,243,229, 68, 95,185,164, 87,153,166,188, 95, 58,112,174, 65, 49, 64,146, 32, 9, 2, 82,129, 0,198,125,251,170,188, 54,227,
-170,250,172,148,152, 24,144, 63,253, 4, 47,145, 8, 20, 65,128,103, 51, 65, 55, 6,229,229,229, 32, 8, 2,187,118,237,242,157,
- 54,109,218,238, 27, 55,110,196, 84, 86, 86,238,115,133, 67,173, 86,143,237,223,191,255,153,237,219,183, 7,134,132,132, 60,116,
-188,176,176, 16, 51,102,204, 40, 81,171,213, 46, 5,117, 19,139,197,175,142, 31, 63,126,235,183,223,126,171,184,125,251, 54,116,
- 58, 29, 2, 3, 3, 31,181,142,118,239,211,167,207,129,125,251,246,121, 23, 22, 22, 66,163,209,192,104, 52, 98,215,174, 93, 62,
- 99,198,140,217,151,145,145, 49, 26, 64,114, 3, 28, 31, 59,138,172, 57,115,230, 92, 7, 16, 4, 96, 99, 77, 13,106, 59,214,217,
- 65,108,105, 0,172,170,103, 36, 26, 33,147,201, 80, 92, 92,140, 25, 51,102,224,214,173, 63, 12,160, 97, 97, 97,246,145,222,221,
-187,119, 17, 24, 24, 8,130, 32,130,156,185,232,192,192, 64,185,201,100,194,172, 89,179,144,147,147, 83,141, 51, 55, 55, 23, 4,
- 65, 72, 93,189,145,193,193,193,193, 6,131, 1, 3, 7, 14, 68,101,101, 85, 94,223, 73,147, 38,129,207,231,163,184,184, 24,124,
- 62, 63,160, 17,207, 39, 96,236,216,177,117,134, 86, 81, 40, 20,102, 95, 95,223,103, 93,228,244,127,225,133, 23,242,226,226,226,
- 30, 90,216,114,233,210,165, 23,253,252,252, 78,249,249,249,181,115,145,211,234, 40,170, 4, 2, 65, 53,161,197,231,243, 65,146,
-164, 21,127,125,124, 1,128, 91, 5,183, 9, 64,215, 39,168,108,118,177,117,236,216, 49, 68, 69, 69,161,172,172, 12, 25, 25, 25,
-141, 21, 89, 92,123,183,232,211, 79, 63,253,229,149, 87, 94,145,113,131, 86,137, 68,130,119,223,125,215,160,211,233, 22,185, 84,
-137,172, 86,240,120, 60,251, 32, 89, 44, 22, 35, 58, 58,218, 46,178, 8,130, 64, 69, 69, 5,120, 60, 30,183, 34,145,112,178,140,
- 8, 13, 9,129,151,151, 23,218,180,109,139,219,182,118,132,251, 44, 18,137, 64, 16, 4,104,186, 65, 67,158,214,230,212,190,192,
-205,207,134,229, 68, 81,189,166,227,176, 48, 88,173, 86, 78,100,178,238,224, 12, 8, 8,128, 78,167,115,150,243,137, 68, 29, 22,
- 45, 78,104,141, 69,149,175,214, 67,225, 29, 6, 3,136, 71,245, 37,149,228,179,193,242,109, 43,230, 14,159, 49, 50, 42, 0,134,
-146,251, 16,123, 5,128,240,137,196,234,181, 63,227,198,189, 82, 0,192,234,221, 87,240,125,236, 24, 64,226,135,246,222, 74,132,
-120,241, 94,190, 89,252,176,208, 34,192, 18, 86,150, 5,143, 34,109,115,183, 20, 40,138,132,170,164, 0,235, 62,121,211, 38,178,
-246,226,104, 98, 6,194, 91, 71,253, 49,143, 75, 16, 0, 91,127,229, 14,244, 22,196,205,125,165,143,164,136, 40,128, 79,152, 20,
- 98,113, 13,253,232, 43, 0, 17, 73, 98,222,144,112,233,229,195,149,113,233, 26,115,131, 29,133,152, 36,171,156,223, 9,162, 86,
-231, 30,210,118,140, 34, 8,176, 44, 11,214,234, 90,155,206, 9,121,137, 68, 2,179,217, 12,138,162,176,126,253,122,159, 17, 35,
- 70,108,116, 85,104, 1, 72, 43, 42, 42, 26, 51,123,246,236, 99,123,246,236, 9, 8, 8, 8,168, 54,122,152, 61,123,182,178,168,
-168,104, 12, 92,116,186,231,243,249, 27, 55,109,218,164,120,240,224, 1, 42, 42, 42, 32,145, 72,236,141, 79, 99,235,103,175, 94,
-189, 78, 28, 63,126,220, 87,163,209,192,108, 54, 67, 34,145,128,101, 89, 80, 20,133,255,254,247,191,254,227,198,141,251, 57, 59,
- 59,123, 88,125,101,149, 72, 36, 47,217,132, 19, 98, 98, 98,124, 98, 98, 98, 6, 3,117, 70,234,181, 35, 38, 38,198,103,193,130,
- 5, 47, 24, 12,134, 85,245, 92,115,142, 74,165, 10,145, 72, 36,216,191,127, 63,228,114, 57,164, 82, 41,194,194,194,160, 82,169,
- 32,149, 74,193,178, 44, 44, 22, 11,215, 88,148, 58,115,225, 37, 37, 37, 58,154,166,189,143, 29, 59,134,210,210, 63,254,165, 69,
-139, 22, 80,171,213,176, 90,173, 21,174,222,204,252,252,252, 34,130, 32,154, 95,187,118, 13, 15, 30, 60,192,232,209,163,241,211,
- 79, 63,161, 71,143,170,217, 97,147,201,212,152, 32,126, 12, 69, 81,108, 61,245,150, 0,224,235, 78, 78, 91,231,229, 18,167,213,
-106,181,114, 34,203,241,175,163,248,106,224, 55,255, 42,240,118, 28, 39, 60,169,133, 28, 61,122, 52, 84, 42, 21,228,114,185, 59,
-252,115,206, 27, 12,134,204,131, 7, 15,118, 31, 59,118, 44,132, 66, 33, 50, 51, 51,145,156,156,156, 1,224,188,171, 66,139,207,
-231,227,211, 79, 63,197,155,111,190,137,224,224, 96, 44, 90,180, 8, 60, 30,207,190, 17, 4, 97,183,112,185,130,160,224,250, 23,
- 62,114, 14,241, 13, 25,195,189,189,189, 63, 37, 73,114, 34,229,196,141, 99, 24,134,177, 90,173,123, 52, 26, 77,189,225, 29, 56,
-199,117,103,158,133,227, 61,104,160, 79,123,100,206, 58,180,200, 99, 71,205,213,134,117, 88,180,184, 85,135, 15,165, 2,226,174,
- 50,222,102,178,139,119, 20, 89,159,191, 57,116,198,200, 40, 95, 28, 58,125, 17, 2,179, 26, 48,105,235,121,194, 22, 16, 2, 25,
-130,189,249,181,250, 10, 17, 36,117, 51, 55, 47, 31,254,190,114,155,200,178,109, 36,137, 46, 81, 85,131,217,163,137, 25, 8,111,
- 21, 5, 30, 69,129, 71, 81,144, 75, 68, 40, 42, 44, 0,143, 71,222,172,235,103, 59, 81,120,229,149,118,205, 35,125,253,249, 80,
- 6,154, 16, 26, 92,135, 97,160,187, 23,194, 67,133, 24,229, 47,142,232, 68,225,149,122,101, 57,203,218,133,150,153,166, 33,120,
-245, 85,251,116, 97, 74, 76, 12,162,227,226,192,140, 31, 15,189,217, 92,205, 84,220, 88,161, 37,145, 72,160,213,106, 49,101,202,
- 20,149,197, 98,121,171,145,117, 33,185,180,180,116,194,212,169, 83, 75, 57, 1, 99, 54,155, 49,117,234,212,210,210,210,210, 9,
- 78, 88,137, 30,130,197, 98,121,171, 71,143, 30, 42,165, 82,105, 47,103, 99, 26, 28, 14,126,126,126, 71,183,109,219,230,103, 52,
- 26, 65,211,180,157, 83, 34,145,128,162, 40, 4, 6, 6,226,251,239,191, 15,244,243,243,171, 55,103,149,193, 96, 56, 24, 23, 23,
-167, 6,128,184,184, 56, 53, 65, 16, 9, 4, 65,108, 38, 8, 98, 83,141,109, 51, 65, 16, 9,142,231, 26, 12,134, 3,245,113,155,
- 76,166,132,140,140, 12, 86, 42,149,130,162, 40,152,205,102,136,197, 98,187, 73,188,188,188, 28, 6, 67,213, 52,119,114,114, 50,
- 44, 22, 75,146, 51,215,174,213,106, 79,111,223,190,221,218,162, 69, 11, 68, 69, 69, 33, 58, 58, 26,125,250,244, 65, 68, 68, 4,
- 62,251,236, 51, 70,175,215,199, 55, 66,104, 29,253,241,199, 31, 45,205,155, 55, 71,247,238,221, 33, 18,137,208,165, 75, 23,132,
-133,133, 97,249,242,229, 38,141, 70,115,172, 17,143, 41, 59, 53, 53,149,170, 71,228, 42,224,196,234,221, 26,200,185,124,249, 50,
-213,167, 79,159, 67, 53, 15,244,234,213,235,144, 92, 46,247,230, 76,236,174,140,200, 29,197,149, 72, 36,178,111,220,247, 60, 30,
-239,127,193,162, 53, 31,192,117, 84,197, 97, 90,244,132,149,205,238,248, 94, 90, 90,138,140,140, 12, 36, 39, 39,163, 79,159, 62,
- 72, 74, 74, 2,254,112,144,119, 25, 26,141,102, 81,108,108,172,158, 91,201,183,120,241, 98,131, 86,171, 93,228,106, 27,204,178,
- 44,248,124, 62,218,183,111,143, 5, 11, 22,224,231,159,127, 70,102,102, 38, 44, 22,139, 93, 8,113, 62,153,174, 88,180, 4, 2,
- 1,130,131,131, 97,177, 88,236,214, 44, 0,184,125,235, 22,120, 60, 30,172, 86, 43, 76, 38, 83,131, 22, 45,111,111,239, 79,183,
-110,221,250,142, 82,169, 12, 45, 41, 41, 9,114,220,138,138,138,130, 10, 10, 10,130,242,242,242,130,114,114,114,130,178,178,178,
-130,238,223,191, 31,186,114,229,202,119,188,189,189, 63,117,166,156, 20, 69,161, 75,151, 46,120,251,237,183,237,219,134, 13, 27,
-236, 91,124,124,188,203,206,235, 20, 69,161,253,146,213, 24, 83,194,218,183,159, 3, 9,251,118,227, 95,115,234,227,172,169, 69,
-158, 8,112,171, 13, 29, 19, 75,215, 2,110,213, 33,215,150,217,221, 54,106, 58,195, 3, 0, 58,132, 72,151,126,254,198,160, 25,
-207, 61,235,141,131,167,175, 32,246,192,189,155,109,103, 4,182,127,198,183, 4,214,146, 12,252,235,245, 30, 88,189,251, 10,128,
-170,169, 67,107,241, 13,176,101,119,193,122, 53,199,125,149,178,214,105, 7,218, 84,121,230,222,157, 91, 67,219,119,234, 73, 22,
- 42,117,213,150,127, 70, 15,153, 0,130, 32,208,172, 85, 20, 40, 30, 15, 20, 69,130, 71, 81,240, 81,136,145,113,237,154,213,104,
- 48,156,169,141,115, 48,192, 19, 74,132, 27, 94, 31,213, 69,156, 47, 44, 70, 96,168, 12, 2,126,149,118,100,239, 77,168,209, 67,
-240,128, 78, 94,152,153,231, 47, 57, 83, 84,185,193, 87,111, 62,148, 80,199, 8,208,106,181, 66, 46, 18,161,210,104,132,129,166,
- 49,100,221, 58,251,116, 33, 73, 16,184, 10,160,243,186,117, 56,183,111, 31, 20, 66, 33, 32, 18, 57,189, 42,164, 54,161,165, 84,
- 42, 49,125,250,244,210,130,130,130,105,141,241,209,226, 96, 52, 26,207, 22, 22, 22, 78,155, 48, 97,194,174,253,251,247,251, 77,
-152, 48, 65, 85, 88, 88, 56,205, 73,191,167,135, 80, 89, 89,185, 47, 39, 39,167, 98,250,244,233, 59,119,239,222,237, 31, 16, 16,
- 96, 31,137, 52,170,178, 18,132,114,248,240,225, 34,103,206,107,224,148, 88,155,115,251,155, 54,203, 86,231, 57,115,230,156, 67,
-149,255,149, 35,150,108,217,178,101,146,195, 20,227,102, 0,235,234, 35, 46, 47, 47,223,180, 96,193,130,191,159, 61,123, 54, 64,
- 44, 22,131, 32, 8, 8, 4, 2,180,105,211,198,190,138,134,207,231,131,101, 89,188,247,222,123,202,226,226,226, 47,157,124, 54,
-115, 98, 99, 99, 7, 85, 86, 86,250, 78,159, 62,157, 18,139,197, 40, 42, 42,194,218,181,107,153,111,191,253, 86,173,215,235,103,
- 52, 66, 8,111,255,247,191,255, 61, 68,167,211,181,154, 61,123,182, 64,163,209,192, 96, 48,224,253,247,223, 55,125,243,205, 55,
-185, 6,131,193,229,128,191,125,251,246,189,147,149,149, 53,160,162,162,162, 76, 42,149,214,180,246, 17, 50,153,172, 39,128,157,
-174,112, 70, 71, 71,223,205,206,206,238,179,116,233,210, 4,139,197,194,191,116,233,146,221, 25,126,253,250,245,241, 98,177,120,
- 56, 92, 76,190, 74, 16,132, 85, 36, 18, 85,179, 96,213,252,204,227,241,254, 23, 44, 90,241,168, 10,153,241,164,161,154,200,186,
-113,227, 6,134, 14, 29, 10, 0, 72, 74, 74, 66,255,254,253,145,148,148,132, 1, 3, 6,184, 28, 75,203,134, 95,203,203,203,179,
-226,227,227, 59, 54,111,222, 28,231,207,159,191, 15,224, 87, 87, 11,201, 9, 45, 30,143,135,215, 94,123, 13, 35, 70,140, 64,139,
- 22, 45,170,173, 54,228, 62,187, 34, 54,104,154, 70,167, 78,157, 96, 52,153, 32, 16, 8,236, 83,147, 60, 30, 15,129, 65, 65,184,
-115,231,142, 83, 22, 45,146, 36, 39,190,244,210, 75,100, 90, 90, 26, 38, 79,158,140, 93,187,118,213,121,238,212,169, 83,241,195,
- 15, 63,224,165,151, 94, 34, 63,252,240,195,122,195, 59,112, 78,232,206, 92, 19,215, 79, 55,212,238,187,139,211, 81,139, 60,105,
-112, 8,237, 80, 27, 98,106,249, 46,174,154,208,114, 8, 18,134, 86,129,210,153, 35,218,240,112,240,204, 21,196, 30,204,222,206,
-176,236,254,253, 41,101, 71, 22,245, 7,204,123, 94, 71,151, 9, 59,171,166, 11, 1, 88,139,111,192,188,103, 42, 8,105, 0, 18,
-243,248,208, 24,204, 71,107,175,120,230, 93, 63,125,247,245,130, 62, 27, 7, 4,134, 6,121, 67,165, 49,216,197, 86, 74,252, 94,
- 0,192, 43,115,150,129, 71, 85, 77, 41, 42,228, 98, 72, 4, 4, 98, 0,180, 0, 0, 9,149, 73, 68, 65, 84, 20,246,237,248, 82,
-105, 54, 87,214, 90,187,180,124,242,205, 15,251,181,241, 22,202, 44, 40, 15, 97, 17, 21,248, 71,166, 28,162,213,222,135, 5, 87,
- 55, 95, 4,220, 40,195,235,207,200, 21, 95,166,169,223,132,197,186,225,161, 14, 81,173, 54,168,175, 93,147,140,222,186, 21,151,
-166, 77, 67, 51,134, 65, 66, 88, 24,252,248,124,120,139, 68, 32, 9, 2,134, 35, 71,112,110,255,126, 4,139, 68,128,151, 23,232,
-207, 62,131, 49, 35, 3, 22,173,214,208,136,145, 25, 38, 77,154,164, 84, 42,149, 19, 76, 38,211,217, 71,173, 8, 6,131,225,120,
- 78, 78,206,155,125,251,246,221,104,177, 88,222, 50, 24, 12,199, 31,133,207,100, 50, 29, 47, 44, 44,124,117,210,164, 73,123, 15,
- 28, 56, 16,224,227,227,211,104,174,210,210,210, 30,110,170,239, 86, 0, 31,217,156,219,223,140,137,137,241,185,124,249,242,223,
-183,109,219,182,209, 97, 52, 17, 52,107,214,172, 55,106,136,172, 6, 87, 29, 2,200, 46, 46, 46,254,236,221,119,223, 93,182,102,
-205, 26, 57,231,248,254,251,239,191,131,166,105,240,249,124, 48, 12,131, 89,179,102,233, 74, 75, 75, 87,163,238,136,206, 15, 85,
-173,242,242,242, 54, 75,151, 46,221,182,110,221,186, 17, 20, 69,201, 24,134,209, 87, 84, 84, 36, 84, 86, 86,206, 64,227,226,104,
- 89, 75, 74, 74,166,127,252,241,199,211,215,174, 93,251, 18, 73,146, 65, 52, 77, 43,181, 90,237, 97,131,193,240, 13, 26, 49,149,
-116,254,252,249,146,215, 95,127,253, 94, 73, 73, 73,135,240,240,112,141, 92, 46, 55,153, 76, 38, 74, 34,145, 40,100, 50, 89, 52,
-128,243, 4, 65,164,187,194,153,146,146, 82, 56,123,246,236, 7, 70,163,177,253,230,205,155, 19, 21, 10,197,105,130, 32, 8,129,
- 64,224, 43,145, 72,134, 2, 72, 32, 8,226,182, 43,156, 36, 73, 90, 29,173, 87, 53,253,179,132, 66,225,255,138,143,214,147, 8,
-123,120, 7,165, 82,137,180,180, 52, 78,100, 69, 3,192,128, 1, 3, 82, 56,177,149,156,156,140,238,221,187,167, 0,224,187, 90,
- 95,203,203,203,223,157, 50,101,202,113,219,224,248,221, 70, 12,252,236, 66,139, 19, 84, 45, 90,180,176,239, 59,110, 14, 62, 90,
- 78,129, 97, 24, 8, 4, 2,240,120, 60,132,134,133,217,127,139,101, 89,220,185,115, 7, 42,149,202, 41,161, 69, 81, 20, 69, 16,
- 4, 38, 79,118,110, 65,242,223,254,246, 55, 36, 36, 36,128,114, 82, 21, 82, 20,133,200,200,200, 6,207,225,116,169,179,156,225,
-225,225,141,230,116,212, 34, 79,146,192,170,237,115,109,162,170,174, 23,226, 33,220, 45, 54, 44,157,250,127,191,125,152, 94, 88,
-185, 63,163,168, 98, 1, 0,118,207, 13,233, 47, 93, 2,169,145, 35,219,229,194, 24, 55, 0,132,162, 42,120, 27,171, 43, 0, 33,
- 11, 70,174,181, 25,150, 28,186, 89, 72,131,168,203,255, 37, 95,167,211,124,180, 99,235,250, 53,179,230,190, 39,191,113,183, 8,
- 26,157, 17, 20, 69, 58, 54,158,224,241, 40, 40,100, 98, 52, 15,241,198,238,255,252,159, 86, 91,174,254, 24,117,228, 61,108,225,
- 37,152, 51,188,231, 51, 34, 65,168, 30,237, 59, 79, 2, 37,254, 67, 4,176,133,117,204, 14,246,255, 5,207,103,235,197, 63,101,
-235,231, 92, 45, 51, 61, 44,180, 76,166,145,139, 71,141, 58, 17,251,243,207,210, 94,219,183,227,238,172, 89, 8, 51, 24, 32,178,
- 77, 37,146, 4, 1,185, 64, 0,185, 64, 80, 37,178,214,174,133,129,166,177,110,218,180, 10,163,201, 52,202,149,151,188,180,180,
- 20,227,199,143, 47,201,207,207, 31,131, 70, 76,237,213, 5,189, 94,191, 15,192, 62,119,241, 25,141,198,179,185,185,185,207,143,
- 31, 63,254,231,227,199,143, 7, 62, 33, 65,230, 56,177,101,190,124,249,242, 27,137,137,137,119, 81, 61,177,168, 58, 49, 49,241,
-238,236,217,179,137,109,219,182,125, 3,224,223,112, 50,128,167, 94,175, 95,127,242,228, 73, 12, 26, 52,232,223, 43, 86,172,240,
-239,209,163, 7,130,130,130,160,213,106,145,156,156,140,249,243,231,171,202,203,203, 87,168,213,234, 53, 46,150,217,108, 52, 26,
-167, 58, 46,165,118,199,125, 48, 26,141,223, 22, 20, 20,124,235, 46,194,121,243,230,253,126,231,206,157,210,192,192,192,222, 2,
-129,160, 51,170,252,128, 10, 1,124,227,170, 32,226, 48,119,238,220,107,119,238,220, 81, 54,107,214,172,143,141,211, 7, 85,105,
-140,182, 54,130, 51,255,202,149, 43,225, 61,123,246, 36,249,124, 62, 75, 81, 20,248,124, 62,203,227,241, 88,155, 95, 13, 11, 0,
-135, 15, 31, 22, 1, 80,193,131, 63, 27,246,240, 14, 5, 5, 5,142, 34,139,179, 90, 69, 15, 24, 48, 32,197, 38,178,184, 99,141,
-241, 47, 59,101,181, 90, 31, 41, 95, 47,203,178,136,141,141,197,150, 45, 91,208, 80, 68,115,219,234, 62,162, 33, 62,206,162,197,
- 48, 12,204,102, 51,110,220,184, 97,143,217,197, 77, 23,114,161, 29,104,154,174,119,181, 58,195, 48,140,201,100,194,127,255,251,
- 95,167,196,214,247,223,127,143,202,202, 74, 48, 13, 40, 56,199, 80, 12, 93,187,118,133, 74,165,178, 47,246,137,142,254, 35, 84,
-158,217,108,118, 73,184,114,156,237,219,183,135, 82,169, 4,231, 47,220,124,218, 31,198, 30, 90,255,151,141, 31, 92,167, 69,203,
-233, 30,179,139,183,183,183, 81,104, 57,240, 98,148,104,200,196,104,111,180, 10,241, 2, 95, 32, 70,126, 57,141, 83,233,229,216,
- 26, 95,152, 99,176, 48,227,110,149, 84,164,214,199, 35,146, 42,142,247,232, 55,162,255,180, 55,230,203,116, 70, 6, 15, 30,100,
-161,164,184, 0, 36, 65, 34,180, 89, 56, 34, 34, 34, 33, 17,146,216, 21,183, 70,159,114,238,244,111, 58,109,217,232,186,184,198,
-122, 11,206,173,125,181,127,159,214,173,189, 8,208, 22,128,177, 0,180, 5,176,218,254,114,223, 89,171,215,185,180, 52, 53,251,
-225, 85,213,133,163, 26,115,173, 57,171, 38, 0,253,125,252,252, 78, 44, 57,124, 88,106, 53,155, 81,250,238,187,144,210, 52,196,
-182, 81, 73,213,133,136, 64,127,246, 89,149,200,154, 58,181, 66,163, 86,187,148,130, 39, 32, 32,224, 10, 65, 16, 1, 37, 37, 37,
- 79, 85,100,248,192,192,192,163, 44,203, 42,149, 74,101,143, 39,168, 92, 65, 0,212, 0,204,181, 12, 36, 2,225,186,255, 15,135,
-200,192,192,192, 15, 73,146,236,203,178,172, 63, 73,146,101, 86,171,245,124,113,113,241, 74, 0,119, 60,253,233, 99, 3, 23, 25,
-190,101, 3,231, 21, 3,248, 39,170,156,130, 31,120,110,219,159, 14,183,167,224,113, 39,252,252,252, 46,158, 56,113,162, 71,171,
- 86,173, 72, 71,135,119, 46, 86, 30, 55,189,197,227, 85,105,185,179,103,207,210,147, 39, 79, 62, 95, 84, 84, 52,168, 46, 78, 47,
- 47,175, 95,174, 95,191,254,156, 70,163,121, 72, 80, 57, 70,138,231,246,245,122, 61,230,206,157,123,178,174, 20, 60,222,222,222,
-107,215,172, 89,243,206, 43,175,188, 66,114,225, 40, 28, 55, 46, 93, 16,183,153,205,102,236,220,185,211,250,229,151, 95,126,165,
-209,104,234,156, 58, 12, 13, 13,205,201,207,207, 15,231, 66, 45, 56, 19, 84, 52, 50, 50,178, 32, 43, 43, 43,236,207,228,124,138,
- 5, 87, 53,235,150,171,166, 9,162,125,144,108, 18, 11, 76, 36, 97,237, 68, 18,132,144,102,145, 9, 22,191, 72,121, 21, 27, 83,
- 10,224,212,212, 25, 95, 34,153,231, 37,247,253,228,149, 41,111,251, 71,182,110, 75, 4,135, 54, 3, 1, 18, 69,133,121,200,186,
-119,139, 61,240,221,215,165,250,114,213,167, 6,131,254,235,250,120,158, 5, 90,183, 84, 8,246, 8, 25,180, 3, 39,128,106,228,
-167,122,104,196, 1,192,204, 39,111, 62,208, 90, 38,165,215, 51,237,195,137,173,143, 14, 28,144, 10,219,181,123, 40, 80,156,213,
-106,133, 49, 35, 3,235,166, 77,115, 89,100,121,224,129, 7,110, 65, 43, 52, 28, 35,203,130,170,248, 92,180,231,118, 61, 22, 60,
-177, 73,165, 1,200,252,252,252, 78, 83, 20, 21,193, 89,100, 28,173,245,181, 36,148,126, 80, 84, 84, 52, 28, 64,125, 43,132, 91,
-123,121,121,125,205, 48, 76, 47,103,146, 74, 83, 20,117, 73,171,213,206, 67, 61, 73,165,155, 98,213,161,191,191,255,157,172,172,
-172,214,220, 42,106,199,190,178,182,149,229,183,111,223,198,224,193,131,179, 10, 11, 11, 35,255, 76,206, 39, 21,117,172, 58,124,
-116,139, 86, 19, 32, 76, 32,146, 79, 23, 74,196,195,172, 22,186, 61, 8,128,199,231,223, 52, 85, 26,206, 24, 13,186, 29,168, 99,
-186,240,207,196, 4,160,191, 72, 40,252, 69,160, 80, 72,106, 19,109, 22,173,214, 96, 52,153, 70,122, 68,150, 7, 30,120,224,129,
- 7, 79, 17,218,249,249,249,157,224,243,249, 34, 71, 49, 89,243, 51, 7,154,166, 43, 75, 74, 74, 70, 3,200,252,147, 57,255, 55,
-225,162,147,218, 8,103, 57,109,219,224, 39,157,179, 9,175,157,117, 35,231, 96, 27,231,146,167,164,156,131,159, 84, 78,238,122,
- 93,224, 29,225, 74, 61,114,215,253,116, 40, 39,235,238,114, 54, 21,167,187,222,163, 90,202,201, 54,193,115, 95,242,148,148,115,
-240,147,198, 89,179,254, 56,201,235, 18,167,147,117,202,213,114,178,238, 46,103, 83,113, 62,234,123, 84, 79, 57,217, 71,173, 75,
-117, 60,251, 37,120, 10,145,214, 13,108, 90, 55,176, 55,186,215, 26,183, 49,166,174,255,115,201,145,176,169, 86, 2,112, 97,247,
-109,252,196,147,202,233,120, 31,220,153, 42,160, 9,210, 14,196,187,155,179,198,253,116, 23,150,216, 86,152, 36,192,137,128,163,
-174, 92,187, 59,158,123,141,107,117, 11,111, 35, 68,150, 75,156,238,170,247, 77,205,233,174,119,169, 38,167, 59,234,125,109,207,
-189, 9,159,145,187,202,233,150,119,169, 41,234,124, 45,245,231,145,121,107,114,186,227, 93,170,201,233,142,122,255,103,112,186,
-227, 93,170,141,211, 29,245,190,174,103,255,180, 26,154,184,233, 66, 91,136, 7,194, 9,177, 21, 7, 0,100, 99,110, 90, 19, 90,
-202,134,184,155,211,221,101,110, 10,177,233,130, 5,230,177,115,186,249, 25, 45,177,113,186,115,116, 51,196, 93,207,168, 41,234,
-187, 35,167,187,248,107,242,184,227, 57,213,198,249,168,229,173,163,156,110,191,246, 71,173,247,127, 22,167,155,159,145, 91,222,
-165, 26,156, 67,220, 60, 24, 24,226,176,191,196,157,156,238,122,151,106, 41,231, 35, 63,167,218, 56, 31,181,188,117,148,211,237,
-215,238,142, 62,164,169,120, 31,167, 69,139, 37,235,172, 19,113, 53,182, 63, 69,104, 60,182, 41, 57, 23,185,255, 82,156, 46, 78,
-207,140,104,130,103,255, 88,203,233, 78,206,154,101,116,231,116, 79, 83,150,211,157,156, 46,148,245, 47,199,249,180, 61,247, 39,
-241,126,214,197,247, 40,211, 82,117, 89, 71,155,162,156,238,228,116,146,251, 47,193,249, 8,207,254, 47, 7,222,147, 82, 16,238,
-198,187,121,100, 2, 55, 91, 96,154,236,186,221, 92,206, 33, 77, 97, 33,108, 2,184,189,156,182,145,242, 39, 77,112,237, 79,203,
- 61,245,188, 75,158,119,233,137,123,151,106,212,201, 33,110,180, 20,185,213,242, 92,147,211, 29,191,225,200,225,174, 58,218,212,
-215,238,206,119,169, 41,158,253,211,134,255, 15, 96,195, 45,132, 53, 49,191, 76, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 90, 0, 0, 2,128, 8, 6, 0, 0, 0, 68,254,
+214,163, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0,
+ 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38,
+ 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216,
+ 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,188,247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192,
+ 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,
+115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,
+153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4,
+ 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32,
+ 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0, 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,
+176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41, 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,
+242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185, 36, 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73,
+ 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52, 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,
+206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98, 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254,
+ 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,
+112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,196, 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,
+126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,224,194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,
+252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81, 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197,
+ 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,
+247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,119,255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0,
+ 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,176, 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252,
+ 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,
+192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97, 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,
+136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138,
+ 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,200, 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,
+181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143, 22,160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,
+218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,195, 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,
+176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192, 9, 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,
+168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72,
+ 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67, 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110,
+ 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178, 7, 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,
+228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,106, 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154,
+ 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,
+211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,151,208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134,
+ 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152, 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153,
+ 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,
+203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,
+103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44,
+ 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,187,152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,
+179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231, 40,167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,
+185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,235,189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,
+199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,167, 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187,
+ 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,121,189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12,
+ 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29, 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,
+225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,227, 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234,
+ 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,205,162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,
+155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228, 90,166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,
+179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147, 78,171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,
+216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,195,238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,
+171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,238, 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,
+182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,131,243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,
+200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,194,237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159,
+ 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,149, 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99,
+ 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246, 62,114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,
+183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,255,122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91,
+ 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237, 65,140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,
+200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,232,214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,
+134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,223, 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53,
+ 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,
+190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200, 93,112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150,
+ 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,119, 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216,
+ 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121, 36,197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,
+155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,144,113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,
+101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,172, 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,
+103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,179,202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,
+165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,219, 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,
+213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,202,130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,
+237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,138,174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,
+202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,230,222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,
+180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,131,182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63,
+ 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,209,238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,
+190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,174,137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,
+210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,143,214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54,
+ 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247, 30, 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29,
+ 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,204, 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,
+121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,149,157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,
+106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,206, 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58,
+ 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,185, 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,
+221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,111,247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,
+119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,213, 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220,
+ 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,203,134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,
+167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,126,248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,
+124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120, 51, 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15,
+ 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147, 25,147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0,
+ 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 13,215, 0, 0, 13,215, 1,
+ 66, 40,155,120, 0, 0, 0, 7,116, 73, 77, 69, 7,219, 2, 27, 16, 38, 47, 61,220,216,191, 0, 0, 32, 0, 73, 68, 65, 84,120,
+218,236, 93,119,120, 20,213,226, 61, 51, 59,179,187,217,146, 77, 35, 61,144, 66, 9, 96, 0, 67, 81,130, 84, 65, 80,140,138, 10,
+ 86,132,167,207,103,197,134, 5, 84, 68, 68, 32, 54, 64,240, 39,242,208,167,128,160,128, 5, 4,164, 68, 74,232, 29,233, 9,144,
+ 4, 18, 66, 58,201, 38,219,203,220,223, 31,217, 89, 55,203,182, 64, 98,129,123,190,111,190,221,157,157, 57,115,239,157,123,239,
+156, 57,183, 1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,215, 52, 86,175, 94, 77,154,112,248,144,
+ 64, 57, 29,219,128,191, 59,103, 11,198,157, 52, 35,231, 0, 7,231,187,255,144,112, 14,248,187,114,138,241,109, 2,239,144,166,
+228,163,230, 74, 79,151,112,146,230, 14,103, 75,113, 54, 87, 57,242, 16, 78,210, 2,247,253,221,127, 72, 56, 7,252,221, 56,221,
+243, 79,128,188, 77,226, 12, 48, 79, 53, 53,156,164,185,195,217, 82,156, 87, 91,142,124,132,147, 92,109, 94,242,114,239,223,197,
+117, 4,174, 5, 69, 86,192,200,204,204,100, 92,248,153,191, 43,167,107, 58,136,252,205, 25,214,102,196,150,230,230,116, 75,207,
+230,194,187,153,153,153,204,234,213,171,183, 2, 24,208,156,113,111,142,251,238, 22,215,102,225,189, 2,145,213, 36,206,230,202,
+247, 45,205,217, 92,101,201,157,179, 57,242,189,167,251,222,130,247,168,185,194,217, 44,101,169, 37,242,188,135,252,115,213,188,
+238,156,205, 81,150,220, 57,155, 35,223,255, 25,156,205, 81,150, 60,113, 54, 71,190,247,118,239,175, 55,131,138,253,139, 5,129,
+123, 1, 31,248,119, 22, 68, 45, 37, 54,155,224,192,252,229,156,205,124,143,222,117,112, 54,231,219,205,192,230,186, 71, 45,145,
+223, 93, 57,155,139,223,157,167, 57,238,147, 39,206,171, 13,175,151,112, 54,123,220,175, 54,223,255, 89,156,205,124,143,154,165,
+ 44,185,113, 14,108,230,151,129,129, 46,191,223,109, 78,206,230, 42, 75, 30,194,121,213,247,201, 19,231,213,134,215, 75, 56,155,
+ 61,238,205,241, 12,105, 41,222,107, 26, 45,213,124,214,220,156, 77,228,190,166, 56,155,216, 60, 51,164, 5,238,253, 95, 26,206,
+230,228,116, 15, 99,115, 54,247,180,100, 56,155,147,179, 9, 97,189,230, 56,255,105,247,253,239,152,158,222,248,174,166, 89,202,
+155, 59,218, 18,225,108, 78,206, 0,185,175, 9,206,171,184,247,215, 28,184,191, 75, 64,196,132,111,230, 55, 19, 52,179, 3,211,
+146,194,181, 57,195, 57,176, 37, 28,194, 22, 64,179,135,211,241,166, 60,185, 5,226,254, 79, 73, 83, 90,150,104, 89,250,219,149,
+ 37,183, 60, 57,176, 25,157,162,102,117,158,221, 57,155,227, 26,174, 28,205,149, 71, 91, 58,238,205, 89,150, 90,226,222, 83, 92,
+133, 11, 65, 57, 41, 39,229,164,156,148,147,114, 82,206,235,150,243,154, 4, 75,147,128,130,130,130,130,130,130,130,130,130,130,
+130,130,130,130,130,130,226, 31, 5,175,237,187,113,113,113,171,149, 74,101, 59,111,255,235,116,186,139, 23, 47, 94, 28, 68,147,
+240,175, 3,189, 71, 20,255, 32,176,248,195, 65, 23, 0, 16,199, 70, 65, 65, 65,113, 77,195,107,103,120,185, 92,158,114,242,228,
+201, 14,130, 32,192,110,183,195,102,179, 57, 63,205,102, 51,250,247,239,223,228,142,244,209,209,209, 57, 18,137, 36,169, 41,231,
+216,237,246,243,101,101,101,125,125, 28,178, 19, 64, 10,195,252,161, 25,197,239,222, 62, 1,148, 88,173,214,238,190, 56, 25,134,
+ 73,113,231,243,194, 37,126,247,201, 25, 18, 18,178,159,227,184, 4, 79, 92,222,190, 11,130,144, 95, 81, 81,209,231,207,188, 71,
+215, 51,162,163,163,115, 56,142,107,114,254, 44, 45, 45,245,154, 63, 99, 99, 99, 15,177, 44, 27,215, 4, 74,137, 32, 8,185, 23,
+ 47, 94,236,235, 67,136,236, 4,144,226,243, 13,202, 45, 63, 49, 12, 83,108,183,219,123,250, 43, 71,190,184, 60,228, 81,127,156,
+ 78,145,197,113, 92, 86, 84, 84,212, 51,122,189,222, 8,128, 72, 36, 18,226, 18, 54, 0,128,205,102,171,168,169,169,233, 66,115,
+ 34, 5, 5,197,117, 33,180, 4, 65, 96, 77, 38, 19,242,242,242, 64,136,199,250,222,126, 5,215,235,112,224,183,141, 81,193, 81,
+209,176, 89, 44, 80,181,138,116,114,151,157, 56, 6,155,213, 2,155,217,140, 54,189,122,139, 97, 64,231,206,157, 37,126, 56, 19,
+ 62,248,224,131,168,224,224, 96, 24,141, 70, 24,141, 70,152, 76, 38, 24,141, 70,152,205,102,152,205,102, 88, 44, 22, 88, 44, 22,
+216,108, 54,152, 76, 38,100,103,103,219,173, 86,171, 79,206,105,211,166, 69,105, 52, 26, 39,159,184,137,156, 34,175,213,106,133,
+209,104,196,166, 77,155,124,114,114, 28,151, 80, 82, 82, 18, 37,149, 74, 65, 8,129, 32, 8, 32,132, 52,218,220,209,182,109, 91,
+139,175, 64,182,208, 61,186,158,209, 97,218,210, 53, 81, 33, 10, 57,108,130,128,204,110,109,157,127,228,127,185, 28,196,102,135,
+ 96,179,161,253,243,163,157,251, 59,117,234,228, 51,127, 18, 66, 18,167, 45, 93, 19, 26, 40,103, 85, 85,149,161, 99,199,142, 37,
+104,112,155,189, 9,173, 4,131,193, 16,229,224,191, 76, 16,177, 44,219,104, 91,191,126, 61, 50, 51, 51,253,197, 61,225,229,151,
+ 95,142,178, 90,173, 48,155,205, 48,153, 76,176, 90,173,176,217,108,206,205,110,183, 59, 55,179,217,140, 61,123,246, 4,234,100,
+125,112,219,109,183, 61,190,102,205, 26,213,207, 63,255,172, 74, 74, 74,130, 84, 42,133, 68, 34,129, 68, 34, 1,203,178,224, 56,
+ 14, 55,223,124, 51, 67,179, 32, 5, 5,197,117, 35,180, 76, 38, 83, 65,122,122, 58,113,124,143,151,203,229, 82,183,183,220,184,
+246,237,219,231,186,159,231,175,185, 42, 56, 42, 26, 19, 91,135, 3, 0,222, 57, 87,229,124, 64,124,216,231, 70,231, 49,239, 93,
+168, 5, 0, 40, 20, 10, 48,174,175,209, 94,160, 82,169,112,219,109,183, 65, 38,147,161,103,207,158,224,121,222,227, 38,149, 74,
+193,243,188,223, 68, 97, 24, 6,106,181, 26, 83,166, 76, 17, 69, 18, 84, 65,114,140,235,211, 19, 65, 32,248,239,177,211, 48, 11,
+ 4, 28,199, 57,183, 64, 56,165, 82, 41,142, 30, 61, 10,142,227, 32,145, 72,156,159,226,247, 85,171, 86, 97,228,200,145,224, 56,
+ 14, 10,133, 2,240, 51,115,176,235, 61, 50,155,205,177, 50,153,204, 2, 64, 20,103, 82,134, 97, 98,174,228, 30, 93,207, 8, 81,
+200, 49,102,222, 79, 0,128,162, 89,207, 59,239,221,158,103,223,113, 30,147,248,159, 7,192, 48, 12,120,158, 7,203,178,205,198,
+ 89, 93, 93,109,120,232,161,135,182, 7, 7, 7,175,215,106,181,240, 35,224, 80, 84, 84, 4,142,227,188,230,119,150,101, 49,115,
+230, 76,156, 57,115, 38,160,184, 27,141, 70, 44, 88,176, 0,118,187,189, 17,175,248,221,125, 95,128, 34,235,253,161, 67,135,142,
+ 94,179,102, 77, 24,195, 48,248,236,179,207, 32,149, 74, 49,124,248,112, 68, 68, 68, 96,195,134, 13,144, 74,165,120,253,245,215,
+105,230,163,160,160,240, 85,231,241, 0,110, 4, 16,233, 48, 17,234, 0,132,186, 28, 82,225,248,140, 20,127, 51, 12,179,207, 3,
+ 79, 47,199, 49, 21, 12,195,236,115,249,109, 6, 32,243,176,191, 10,128,194,177,153,208,224,254,167,185, 92, 71, 60, 15,222,174,
+203, 1, 13,235, 15, 1,216, 2, 96, 96,102,102,230, 86, 0, 40, 45, 45,189,163,180,180, 20, 0,144,146,146,114, 50, 55, 55,183,
+163,168,121, 28,205, 83, 82,155,205,214, 65,108,170, 18,221,162, 33, 67,134,248,124,195,183, 89, 44,151, 9, 16, 79, 90,202, 83,
+115,133, 55, 1, 99,177, 88,240,192, 3, 15, 0,128,215,135,142,235, 22,128,118,131,217,108, 6,199,113, 72,109, 29,137, 73,195,
+210,113, 19,177, 66, 87,207,192, 86,171,195, 61,106, 43, 78,118,238,142,249,231, 43,112, 78, 91, 15,142,227, 2,226, 20, 4,193,
+171,200,146, 72, 36,152, 55,111, 30, 30,122,232, 33, 72, 36,146,128,248, 92,239, 81,114,114,242,154,220,220,220, 8,134, 97, 76,
+142,123, 36,183,217,108, 26,155,205, 22, 97,183,219, 35,154,114,143,174,103,216, 4,193, 99, 62,244,150,103, 3,185, 79,129,112,
+ 86, 87, 87, 27, 50, 51, 51,119,203,229,242,133,209,209,209, 37,197,197,197,126,133,150,187,248,113,127,169,248,228,147, 79, 48,
+103,206, 28, 12, 26, 52, 40,160,112,154, 76, 38, 48, 12,131,249,243,231, 95,246,223,212,169, 83, 47,187,158, 31, 78, 6, 0, 27,
+ 23, 23,247,236,186,117,235, 52,226,177,173, 90,181, 2,207,243,232,210,165, 11,130,131,131,177,125,251,118,216,237,246,128,203,
+ 37, 5, 5,197,181, 11, 79, 90,196, 5,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106,
+151, 58, 49,211, 81,191,174, 22,127, 19, 66,122,185,138, 30,135, 88,139,100, 24,102,181,120,188,235,111,241,147, 16, 50, 4,128,
+ 76,252, 61,113,226,196,180,172,172,172,233, 19, 38, 76,120,115,198,140, 25,210,137, 19, 39,118,205,202,202,154, 46, 94,199, 83,
+ 56, 60, 57, 90, 62,215,158, 18,155,168, 78,157, 58,229,173,137,202,245, 1,224,179,182, 84,181,138,116, 58, 89,239, 37, 70, 56,
+247, 79, 41,174,113, 62,192,230,246,104, 7,149, 74,133, 97,239,125, 20,144, 83,100, 54,155, 81, 94, 94,238,116, 25,252,109,129,
+114, 42, 21, 65,200,126,185, 11,138,170,100,120,119, 87, 53,214, 28, 62, 3,158,231,113,123,231, 46,184, 67, 26,140,183, 19,101,
+120,249,116, 33,172, 36,176, 62,189,132, 16,143, 2, 75,252, 46, 54,161, 4, 42,180,220,238, 81,145,209,104,172,202,203,203, 51,
+ 8, 13, 15,118, 5, 33, 36,140, 97,152, 58,135,203, 21, 27,232, 61,186,158,145,217,173,173,211,117,218, 19, 60,216,185,127,164,
+238,168,243,158,140,159,247, 33, 0, 96, 80,247,155,253,150,135, 64, 56,171,170,170, 12,125, 7, 15,220,106, 55,152,191, 25, 61,
+122,116,193,230,205,155, 21,129,132,213,147,208, 18, 93, 91, 81,100,113, 28, 7,179,217, 28, 80,220,205,102,179,215,242, 33,149,
+ 74,175,196,209,130, 78,167, 51,175, 92,185, 18,115,231,206, 69, 68, 68, 4,134, 14, 29,138,216,216, 88, 44, 95,190, 28,132, 16,
+ 60,255,252,243, 80, 40, 20,162,123, 77, 51, 32, 5,197,245, 13, 95, 90, 68,158,149,149, 53,221, 93,200,184,254,118, 21, 80,110,
+ 98,202, 85,172,165,249,121,254,175,118, 23, 79,226,117, 25,134, 89, 61, 99,198,140, 76, 63,225,168,240, 38,180,124, 78,137,111,
+ 50,153, 10,186,117,235, 22,144,154,208,235,245,165,254,196,134,167,183,122, 87,151, 64,173, 86, 67,165, 81,131, 13,176,222,181,
+ 90,173, 78,161,178,113,227, 70, 40, 20, 10, 12, 31, 62,252,170, 28, 45,139,197, 2,153,148, 7,219, 42, 26, 99,102,109, 70, 85,
+157,193,249,128,217,146, 95,128,131,101,229,120, 57, 99, 48, 84,138,114,212,155,205, 1, 57,111,130, 32, 92, 38,178, 56,142,195,
+ 3, 15, 60,224,116, 19, 92,251,173,192, 71,211, 97, 68, 68,196,126,142,227, 18, 92,238, 81, 80, 74, 74, 10,240, 71,191, 30, 70,
+ 16,132,250,208,208,208, 31, 1,196, 17, 66, 18, 0, 4, 7,114,143, 40, 60,231, 79,247,253,130,155, 83,117, 37,156, 85, 85, 85,
+134,204,204,204,221,118,131,249,155, 11, 23, 46,236, 6, 16,116,211, 77, 55, 53, 89,104,137, 2,139,231,121,204,156, 57, 19,115,
+230,204,113,254, 31,168,208,178,217,108,141, 4,212,233,211,167, 27, 93,203, 93,216,249,105, 54, 37,104, 24, 93, 40,164,164,164,
+ 56,207,137,137,137, 65,104,104, 40, 4, 65,128, 32, 8, 8, 10, 10,130, 66,161,128, 84, 42,165,153,142,130,130,194,151, 22, 49,
+ 76,152, 48,225, 77,134, 97, 86, 59,156,165, 99, 62, 4,149, 39,237,209,203, 77,172, 85,120, 57, 46,211,147,216,114,253, 46, 98,
+226,196,137,105,238,225,240,212, 92,233,172, 85,221,166,221,111, 4,215, 38,170,230,122,136,249,122,144,169, 67, 53, 80,168, 84,
+144, 72, 88, 48, 12, 67,252,113, 89, 44, 22,103,197,255,204, 51,207,248,236,183, 18,104,127, 42,139,197, 2,150,147,224, 98, 76,
+ 50,236,236, 54,231,185,226,198,114, 60,206,197,116,132,228,212, 33,240, 1, 62,112,221, 29,173,231,159,127, 30, 11, 22, 44, 0,
+203,178,206, 52,225, 56, 14,237,219,183, 71, 65, 65,129, 79, 46,142,227, 18,206,157, 59, 23,229,154,142,162,136, 37,132,192,110,
+183,163,109,219,182,198,188,188,188, 23,105,209,189, 58,145,229,109,191,221, 46, 4,236,194,120, 58,174,170,170,202, 48,106,212,
+168,173,181,181,181,223,220,112,195, 13,167,209,120, 10, 4,191,124, 28,199, 53, 18, 88,162,200,250,244,211, 79, 27,137, 34,171,
+213, 26,208,139,128,213,106,189, 76,240,124,252,241,199,141, 62, 1,160, 79,159, 62, 1, 57,195, 0, 8,203,178, 68, 42,149,226,
+182,219,110, 67,215,174, 93,241,243,207, 63, 67, 16, 4, 60,247,220,115, 80, 40, 20,152, 61,123, 54,108, 54, 27, 62,248,224, 3,
+234,104, 81, 80, 80,248,210, 34,166, 25, 51,102, 28,155, 49, 99,134,211, 89,114,119,180,188, 60,119,239,116,136,170, 72, 81,164,
+ 1, 48,121, 18, 68,158, 92, 50,119, 1,230,186, 47, 43, 43,107,186,123, 56,220,155, 43, 27, 9,173, 63, 11,165,199,143,226,163,
+ 91,210, 1, 52,110, 46,156,119,115, 71,168,212, 42,168,130,213, 24,181,106, 27, 0, 56, 42,253, 9, 1, 57, 90,162,208,170,170,
+170,242, 41,178,154,226,104,177, 50, 14, 43, 18, 46,129,200,120,112,102,107, 35,161, 37,225,120, 20, 69, 36,131,229,165,224,236,
+182,128, 56, 9, 33,151, 53, 21,142, 29, 59, 22, 12,195, 56, 71,136,117,235,214,205,149,139,241,247,112,124, 45,188,161, 15,158,
+123,115,236, 7,149, 70, 90, 98,175, 36,127,238,255, 18, 39,127,120, 22, 0,208, 87,167,115,222,139,105,221,254, 24, 59, 48,235,
+232, 86,167,251,248, 30, 94,189, 34,206,170,170, 42,195, 77,157,210,118, 75,195, 67,190, 57,127,254,252,110, 0,236,131, 15, 62,
+ 24,218,173, 91,183,128,202,164, 56,184,194, 93,100,185, 58, 89,226,167,159, 17,182, 46,194,209, 30,144,128, 18,155, 17, 3,200,
+243, 68,204,219, 26,141, 6,106,181,218, 57,226, 54, 40, 40, 8, 74,165,210,217,191, 51, 64,225, 70, 65, 65,113,253, 34, 76, 20,
+ 58, 14,177,212,200,105,114,244,173,202,116,253,237,201,241,114, 56, 80, 57,126,234,215, 53, 14,129,230, 17,162,179,230,118,206,
+106,111, 34,141, 19, 21,164,235,103, 76, 76,204,175,106,181, 58, 57,208,216, 55,101, 20,155,221,106,185,204,217, 98, 24, 6,234,
+ 96, 53, 20,106, 21, 20,193,106,175,174,151, 47,161, 37, 58, 69,226, 67,103,225,194,133, 80,171,213,248,215,191,254,213,228, 62,
+ 90, 78,161, 37,101,177, 65,190, 9, 18, 25,215, 72,100,113, 28, 7, 9,207,163, 84, 29, 11,150,231,193,217, 2,115,201,106,107,
+107,193,113, 28, 38, 77,154,228,124,131,119, 21, 89, 77,137,179, 47,176, 12, 35,186, 91,242,118,237,218,189,202, 48, 76, 34,128,
+ 36,157, 78, 39,191,120,241,226,173,180,188,250, 80, 6,118,235,101, 46,148, 55,247,245, 74, 57, 69, 39, 75, 26, 30,242, 77,199,
+142, 29,157, 78,150, 82,169, 20, 71,155,250,191,199, 44,235, 81,100,185,143, 16,228, 56,174, 33, 47,251, 25, 29,233,234,104,205,
+152, 49,195,201,235,234,100,137,104, 74, 57, 18,195,186,117,235, 86, 28, 60,120, 16,207, 60,243, 12, 20, 10, 5,230,204,153, 3,
+155,205,134,169, 83,167, 66,161, 80, 64, 38,147,209,204, 71, 65, 65,221,172, 70, 90,196, 13, 21,110,253,160, 24, 55, 81, 83,225,
+ 73, 96,185, 54, 19,138,223, 25,134,177,122,224, 53,187, 53, 41,186,239, 23, 63,171,102,204,152,177, 89,116,178, 92,246, 55, 10,
+135, 95, 71, 75, 46,151, 39,231,229,229, 57, 39,194,244,245,105, 54,155, 49,104,208,160,128,157, 49,113,212, 33,199, 73, 26, 9,
+ 11,101,176, 26, 74, 77, 48, 20,106,181,187,224, 96,252, 85,226,226, 27,177,171,208,154, 60,121, 50, 56,142,195,130, 5, 11, 0,
+ 0,175,190,250,106,192,125,180, 68, 78,216, 25, 20,147,179, 72,159, 53, 18,230,111,173, 40,219,241, 59, 56,142, 67, 84,239, 59,
+ 32,220, 52, 18,122,133, 26,156,221, 22,240,168,195,234,234,106, 20, 20, 20, 64, 34,145,224,149, 87, 94,105, 52,215,145,251, 72,
+182,141, 27, 55,250,141,187, 39, 39,107,242,249,106, 39,143, 66,161, 96,127,255,253,247,100, 65, 16, 82, 12, 6, 67,187, 62,125,
+250, 8,180, 40,251, 17, 69,130, 45, 32, 81, 21,104,254,116,231, 20,251,100,213,214,214,126,115,254,252,249, 61, 0,216,209,163,
+ 71,135, 42,149, 74,124,245,213, 87,122, 0,178,229,203,151, 43,252,137, 34, 49,223,248, 19, 89, 60,207, 55,228,229, 64,226, 78,
+ 26, 79, 89,226,175, 99,124, 32,121, 94, 12, 43,195, 48,176,219,237, 80, 40, 20,141,156,172,160,160, 32,200,229,114,154,241, 40,
+ 40, 40,252,213, 37,251, 2,174,199, 9,233,229, 34,170,246, 93, 9,111, 83,174,231, 15,156, 55,161, 97, 50,153,112,226,196,137,
+ 64,121, 2,158, 24,179,117,207,155,241,222,133, 90, 48, 12,131,255,246,185, 1, 42,141, 26, 74,149, 10,247,255,188,213, 89,113,
+ 31,157,254, 42,228, 42, 53,226,250, 13, 13,168, 34, 23,155, 14, 93,133, 86, 77, 77, 13,120,158,199,251,239,191, 15,150,101,241,
+193, 7, 31, 32, 62, 62, 30, 23, 47, 94,196,242,229,203, 3,114,180, 36,118, 9, 98, 31,235, 4,229,216, 16,104, 30,235,143,176,
+219, 38,227,130,153,195, 78,163, 18,253,141,199, 33,219,240, 41,204,130, 61,224, 17, 88, 54,155, 13, 91,183,110,117,239,240,238,
+236, 83,101,179,217, 96,181, 90, 97,177, 88,240,193, 7, 31, 4, 50,194,243,178,251, 38,166,161, 99, 18, 84, 73,110,110,110, 36,
+ 33, 36, 28, 64, 8,128, 74, 90, 92,125, 35,182,247,243,136,236,249, 52, 0, 96,213,140, 39,156,251, 39, 29,253, 35,127,206,252,
+182, 97, 1,128,142, 73, 67,155,196, 89, 85, 85,101,184,125, 80,159, 28,163,192,127,221,165, 75,151, 70, 78, 86, 80, 80, 16,227,
+248, 29,144, 93,198,178, 44, 36, 18,201,101,205,133,222,196, 86, 32,125,180,108, 54,155,115, 34, 81, 95,253, 25,175,196,209,122,
+226,137, 39, 16, 27, 27,235,116,178,222,123,239, 61, 40, 20, 10, 76,156, 56, 17, 86,171, 21,159,126,250, 41,205,124, 20, 20, 20,
+127,186, 40,251, 51,224,177, 38, 53, 26,141,133, 93,187,118,133,151,255,226,131,130,130,120,183, 72,197,181,111,223, 62,215, 67,
+ 19,226, 16, 0,217,158, 42,117,134, 97, 16,172, 9, 70,144, 90, 5,165,155,139, 21, 20,172,129, 92,173, 6, 43,245, 88,153, 95,
+198, 41,246, 45,113, 21, 90,226, 86, 91, 91, 11,158,231, 49,119,238, 92,104, 52, 26,152, 76, 38,191,156,226, 67, 71, 34,145, 64,
+ 95, 84,135,147,211,179, 33, 11,218,137,118, 67, 31, 66, 44,175,128,116,251,143, 48,216,173,254, 38, 44,189,140,179, 67,135, 14,
+120,231,157,119, 46,155,214,193, 27,226,227,227,253,198,221,221,201,154,121, 67, 27, 72,101, 82,140, 63, 94, 4,147,201,196, 60,
+244,208, 67, 2, 0, 3,128, 10,131,193,112, 62,144,244,108, 6,252,227, 57,125,141,138, 21, 33, 16,187, 39, 1,227,145, 83,116,
+178,140, 2,255,117, 65, 65,129,232,100,133, 40,149, 74,124,241,197, 23,122, 0,236,212,169, 83,149,137,137,137,146, 64,242,146,
+ 68, 34,193,172, 89,179, 60,246,201,242, 36,186,154, 82,142, 92,207, 29, 48, 96,128,199, 9, 75,189,136,183,203, 56,197,176, 70,
+ 68, 68, 56,157, 44,187,221,238, 28,109, 40,206, 62,239,227,165,130,230, 79,202, 73, 57,175, 31,206,107, 18, 30,107,224,139, 23,
+ 47,222,238,237,132,182,109,219,230,229,229,229,181, 23,151,226,112, 84,156, 82,163,209,216,161, 79,159, 62,126,173, 29, 65, 16,
+ 32,151,203, 65, 8,193,173,239,100,129, 97, 1, 22,141, 31, 98, 81,183, 12,134, 68,194, 65,104, 88,234,195,239,168, 67,131,193,
+208,232,225,224,105,171,175,175,135,201,100, 10,120, 54,111,163,209,216,104, 10, 6,134, 8, 56,247,219,178,203, 70, 31,138, 91,
+160,253,118,130,130,130, 26, 53,253,248,113,172,152, 64, 28, 45,215,166, 71,169, 76, 10, 78,202,139,142, 86,221,233,211,167, 71,
+209,108, 30, 56,196, 1, 11, 0,144,218,103, 56, 4,193, 14, 98,183, 55, 90, 38,169, 83,242,237, 16,136, 29, 22,171, 30, 38,147,
+201,223,180, 39, 76,101,101,165, 97,212,168, 81, 91, 1,252,239,158,123,238,201, 69,195,236,194, 68,173, 86,203,121,158, 23, 0,
+ 84, 3, 32,151, 46, 93, 10,185,112,225,130, 96, 52, 26,219,248, 11,231,154, 53,107,112,226,196, 9,244,235,215,175,209,114, 80,
+162, 43,234, 58,187,123, 32,249, 83,108, 46,247, 52, 35,188, 55, 33, 23, 40, 36, 18, 9, 66, 66, 66, 32,149, 74,241,254,251,239,
+ 67, 42,149, 66,169, 84, 2, 0, 62,253,244, 83,231,228,171, 20, 20, 20, 20,215,141,208,242, 87,111,250,104, 86,244,217,132,104,
+179,217,138, 19, 19, 19,155,116, 49,187,221, 94,230, 71,184, 21, 47, 95,190, 92,234,234, 66,248,251, 36,132,148,249,121,216, 22,
+175, 90,181, 74,234,201,221,240,182,192,180, 63, 78,187,221, 94,156,148,148,228,213, 49,241, 4,171,213,122,193,159,104,205,170,
+ 48, 52, 18, 9,227,143, 23,121, 93, 59,145,194,111, 94,243,145, 63,223,186,210,252,121, 58, 53, 53,245, 66,104,104,232,218,232,
+232,232,170, 29, 59,118, 68,244,234,213, 43,194,245,152, 94,189,122,197,186,157,102,134,247,117, 14,193, 48, 76,241, 61,247,220,
+227, 49,207,139,162,201, 67,254, 44,246,151,231,247,238,221, 43,117, 61,223, 27,191, 75, 57, 42, 14, 64,184,158, 75, 79, 79,103,
+ 93,121,188,229,125,171,213, 90, 65,115, 33, 5, 5,197,117, 47,180, 12, 6, 67, 81,215,174, 93,109, 94,254, 59,239,235,220,170,
+170,170,158,205, 29, 1,171,213,218,231,159,192, 89, 89, 89,217,172,113,183,217,108,197,142, 9, 74,125, 30, 67,179,248, 95,119,
+143, 0,160,188,188,252, 38, 0,208,233,116,240,183,172, 78, 19, 4, 97,179,231, 79,155,205,214,167, 37,210,180,186,186, 58,131,
+230, 44, 10, 10, 10, 42,180,154, 0,186, 24,241,223, 3, 45, 33, 90, 41, 40, 40, 40, 40, 40, 40,154, 23, 44, 77, 2, 10, 10, 10,
+ 10, 10, 10, 10,138,150, 1,131,134,145, 3,158,208,148,209, 4, 67,174,224,218,217,148,147,114, 82, 78,202, 73, 57, 41, 39,229,
+188,238, 56,253,113,211,209,140, 45, 44,192, 40, 39,229,164,156,148,147,114, 82, 78,202,121,253,113, 94,147,160, 77,135, 20, 20,
+ 20, 20, 20, 20, 20, 20, 45, 4,142, 38,193, 95, 6, 9,154, 48,163,190, 63, 16, 66,194, 0,120, 91, 48,206,204, 48,204,165, 43,
+224,100, 0, 72, 29,155, 56,209,145, 21,128, 5,128,133, 97, 24,226,159,227, 93,182,164, 36, 44,141,216,249, 94,132, 97,120, 65,
+192,225, 54,109, 90, 31, 98,152, 59,204, 0,160,138,238,212, 89,173, 82, 12, 49, 89,204,201,114, 94,118,162, 70, 87,191,209, 84,
+158, 87, 72,179, 7, 5,197, 95,130,187, 0, 76, 65, 67,183,146, 25, 0,150,209, 36,161,160,104, 33,161,165, 86,171,247,179, 44,
+155,224,111,126, 30, 17,142,181,204,138, 47, 93,186,212,179, 9,215, 30,165, 86,171, 7,241, 60,127, 11, 0, 88,173,214, 29,245,
+245,245,155, 1, 44, 7, 96,187,194, 56,105, 0, 60, 0,224, 17,199,239, 37,142,202, 66,123,133,124, 93, 67, 66, 66,126,224,121,
+158, 84, 86, 86,246, 6,128,136,136,136,221, 86,171,149,209,106,181,247, 3, 56,210, 68, 62,150,231,249,153,189,123,247,238,191,
+109,219,182,255, 1,152,219, 76,247, 82,206,178,172, 71,129, 34, 8, 66,210, 21,136, 44, 41,128,144,185,115,231, 70, 44, 94,188,
+ 56,189,184,184,184, 11, 0, 36, 36, 36, 28, 29, 61,122,244,161,113,227,198, 85, 17, 66,106, 25,134,177,248,226, 41, 41, 9, 75,
+ 43, 47,205,127,166,172,252,196, 3, 0, 16, 19,219,101,153, 68,194, 74, 9, 57,176, 75,217,234,145, 86,237,219, 37, 61,253,221,
+ 87,115,165, 73,201,173,177,105,231,193, 27,199,189,248,102,218, 5,224, 19, 42,182,254, 60, 4, 7, 7,239,103, 89, 54,193, 87,
+ 25,247, 84,230,237,118,123,113,117,117,117, 79,111,156, 28,199, 37,248,170, 47, 60,237, 19, 4, 33,191,178,178,210,227, 84, 19,
+ 26,141,102, 23,199,113,201,129,114,137,159, 54,155,173,216,219, 40, 93,141, 70,179, 95, 34,145, 36,248,138,167,167,255, 4, 65,
+200,175,168,168,240, 22,206,203,226,222, 28,225,188, 18, 78, 95,225, 20,235, 35, 0,159, 70, 68, 68,220, 92, 85, 85,245, 40,128,
+ 55,181, 90,109, 55,137, 68,130,240,240,240, 55,205,102,243,153,144,144,144, 47,107,107,107,119, 2,120, 17, 0, 93, 47,149,130,
+162,185,160,209,104,202,234,235,235,137, 8, 65, 16,136,213,106, 37, 38,147,137, 24, 12, 6,162,211,233, 72,125,125, 61,209,106,
+181,164,182,182,150, 84, 85, 85,145,200,200, 72,247,201, 27,189,181,225,118,209,104, 52,121, 89, 89, 89,166,130,130, 2, 98,177,
+ 88,136,197, 98, 33,133,133,133,228,163,143, 62, 50,105, 52,154, 60, 0, 93,188,156, 59,196, 75,101,113, 27,128,165,233,233,233,
+230, 53,107,214, 16,163,209, 72,116, 58, 29, 89,182,108, 25,185,225,134, 27,204, 0,150, 58,142, 97, 3,228, 4,128,190, 49, 49,
+ 49,197,103,207,158,181,111,220,184,209, 18, 18, 18,146, 29, 18, 18,146, 93, 88, 88,104, 63,123,246,172,208,170, 85,171, 98, 0,
+125,155, 16, 78, 0, 24, 57,126,252,248,178,194,194, 66, 50, 96,192,128,195, 46,251, 25,248, 95,231,110,136, 39, 39,139, 16, 18,
+ 67, 8,137, 69,195, 36,151,151,109,132,144, 88,199, 49, 97, 1,114,170,242,243,243, 91, 71, 71, 71,103, 49, 12, 99,118,231, 99,
+ 24,198, 28, 29, 29,157,149,159,159,223,154, 16,162,242,197, 89,124,126,222,147,107,215, 12,174,209, 93, 58, 69,116,151, 78,145,
+255,125, 61, 80,251,212,184, 71,151,198,182,237,190, 32, 52, 33,109,238,137, 83,167,231, 19, 66,230,111,222,151, 55,127,242,231,
+191,206,191,119,220,236, 47, 34, 18,211,159,106, 66,122, 94, 13, 40, 39,128,208,208,208, 82,157, 78, 71, 8, 33,196,110,183, 19,
+139,197, 66, 76, 38, 19,209,235,245,164,190,190,158,212,213,213, 57,203,121,109,109,173,243,123, 84, 84,148,215,242, 30, 22, 22,
+ 86,102, 48, 24, 26,213, 29,102,179,217, 89,127,232,245,122,162,215,235,137, 78,167,115,110,245,245,245, 36, 46, 46,174,200, 71,
+ 56, 47,138,225, 20, 4,129,216,108, 54, 98,177, 88,156,188, 70,163,177,209,102, 50,153,136,201,100, 34,137,137,137, 1,135, 51,
+ 16, 78,163,209, 72, 18, 18, 18, 74,188,113,134,135,135,151, 25,141,198, 70,156,174,241,119,231, 21,127,199,196,196,148, 54,133,
+ 51,144,112,250, 74, 79, 7,230,230,230,230, 18,131,193, 64,226,227,227,171,238,191,255,126,171,221,110, 39,107,214,172, 33,233,
+233,233,194,192,129, 3, 45,149,149,149,228, 95,255,250, 23,241,241, 82, 72,203, 17,229,164,184, 18, 71,139, 97, 24,168, 84, 42,
+124,255,253,247, 94,151,227,112,253,222,166, 77,155, 64,175,217, 51, 57, 57,121,235,246,237,219, 21,177,177,127, 76,136,109, 54,
+155, 17, 22, 22,134,231,158,123, 78,118,215, 93,119,181, 31, 58,116,232,238,115,231,206, 13, 0,176,223, 15,223,125,145,145,145,
+159, 77,154, 52, 41,250,193, 7, 31, 68, 68, 68,163, 73,183, 49,106,212, 40,220,127,255,253,210,220,220,220,135, 22, 46, 92,248,
+208,188,121,243, 74,235,235,235,199, 1,248,209, 23,169, 66,161,184, 39, 46, 46,238,139,237,219,183, 71, 69, 69, 69, 33, 37, 37,
+133,125,253,245,215,219,119,232,208, 65,145,144,144,192, 94,188,120, 17, 63,255,252,115,252,195, 15, 63,188,162,172,172,236,105,
+139,197,178, 50,128,184,203, 34, 34, 34,222,124,250,233,167, 91,105,181, 90,219,129, 3, 7,242,196,253, 50,153,108,106, 70, 70,
+ 70,175, 45, 91,182,124, 11,224,203, 43,113,178, 8, 33, 90,252,209,196, 39,194, 42,254, 31,136,179, 69, 8,145, 29, 62,124, 56,
+ 60, 35, 35,227, 71,147,201,212,253,153,103,158, 57, 63,125,250,116,133, 70,163,209, 0, 96,180, 90,237,165, 41, 83,166,152,103,
+207,158,253, 70,231,206,157, 7,239,218,181,235, 62, 66,136,213, 33,200, 46,231, 99, 24,103,120,138, 46, 84, 96,235, 78, 65,246,
+206,196, 87, 19, 62,156,150,124,110,223,241, 34,129, 83,104,240, 75,206, 49,148, 85,213,227,215, 93,199, 17, 19, 17,204, 72,229,
+124, 90, 72,252, 13, 3,106, 47, 28,207,129,143, 25,210, 41,154, 7, 12,195, 64,169, 84,226,151, 95,126,185,108,233, 42, 79,203,
+ 90,113, 28,135,208,208, 80,191,171, 27, 4, 5, 5, 97,227,198,141, 30,215, 94,244,180,164, 79, 72, 72, 8,124,189,108, 48, 12,
+131,160,160, 32,236,216,177, 3, 44,203,122, 92, 26,200,125,159, 74,165, 2,235, 99,173, 43,145, 51, 39, 39,199, 47,151,248,169,
+ 86,171,129,134,166,127,239,133, 82, 46,199,246,237,219,189,198,217,253,187,218,177,222,171, 63,206, 29, 59,118, 52, 90,250,203,
+125, 73, 48,215,223, 42,149, 10,140, 31,210,176,176,176,222, 9, 9, 9,216,187,119, 47,150, 47, 95, 30,158,150,150,134,211,167,
+ 79,131, 97, 24, 76,159, 62,157,185,225,134, 27,248,210,210, 82,244,235,215, 15, 63,253,244, 83, 31,173, 86, 75, 11, 12,197, 95,
+ 2, 66, 8, 15,224, 70, 0,145,104,232,118, 83, 7, 32, 20, 13, 43,105,200, 0, 84, 1, 80, 56, 54, 19,128,122, 0,173, 28,167,
+ 87, 58,234, 22, 87,129, 80,225,186,248, 52, 33,164,151,131, 91, 92,161, 34,210,229, 88,241, 26,238,191,221, 63, 61,114,115, 0,
+176,122,245,106,241, 97, 54, 48, 51, 51,115,171,107,228, 2, 17, 89,226, 58,101, 30,202,180,251, 16, 77,185, 74,165,250, 97,247,
+238,221,138,200,200, 63,226, 96, 50,153, 80, 87, 87,135,250,250,122,212,213,213, 33, 56, 56, 24,203,151, 47, 87, 12, 30, 60,248,
+135,186,186,186, 14,142, 68,243,198, 57,235,226,197,139,209, 54,155, 13, 50,153,231, 46, 74, 44,203,162, 83,167, 78,120,243,205,
+ 55, 49,108,216,176,152, 65,131, 6,205,114, 19, 90,151, 13, 37, 85, 42,149, 95, 28, 56,112, 32, 74,169, 84, 34, 47, 47, 15,197,
+197,197, 24, 63,126,124,107, 65, 16, 80, 84, 84,132,211,167, 79,227,194,133, 11, 88,184,112, 97,212,136, 17, 35,190,240, 32,180,
+ 60, 13, 79,125,230,229,151, 95,238, 24, 22, 22,198,126,244,209, 71, 53, 58,157,238,255, 28,251,223,153, 51,103,206, 99,253,251,
+247,143,250,247,191,255, 77,118,236,216,177,216,113,227,188,166,167,107,159, 44, 71, 51, 31, 28,153,239,164,219, 57,157, 92,254,
+ 7, 33, 36, 6,128,137, 97,152, 26, 15,156, 12,128,144,161, 67,135,190, 98, 50,153,186,111,223,190,253,204, 45,183,220,146, 8,
+224,162,152,249, 66, 66, 66, 84,179,102,205,138,206,204,204,204,189,245,214, 91,187, 15, 29, 58,244,149,138,138,138,233,132,144,
+ 10,151, 62, 91, 78, 78, 65,192,225,152,216, 46,203,114,118,141,123, 96,203, 14,179,244,213, 23, 39,159,111,211, 58,169,246,112,
+ 94,181,253,120,126, 5,234, 12, 54,220,123,107,195, 2,230,189,187,180,193,103,223,111,199,115, 47,189,197,255,184,108,209,253,
+103, 8, 84,245, 37,199,215,248, 72,207,171, 5,229,132,179,137, 9, 60,207,227,142, 59,238, 0,195, 48,151,173,229,201,243, 60,
+118,237,218,133, 91,111,189, 21, 60,207,227,137, 39,158, 8,136,147,227, 56, 12, 29, 58,212,185,142,162, 43,159,187,104,240,162,
+ 9,178,221, 42, 91,112, 28, 7,150,101,189, 46,164,237,206,233,175, 94, 18,195,233,139,203,245, 63,127,225,116, 44,121, 20,176,
+200, 10,148, 83, 12, 39,199,113,232,211,167, 15, 14, 29, 58,228, 83,116,121,209,151,141,226,126,233,210,165, 49, 29, 58,116,200,
+153, 59,119,110, 56, 0, 84, 85, 85, 57, 23,188,151, 72, 36, 56,117,234, 20,204,102, 51,222,125,247, 93,139, 86,171,253, 55, 45,
+ 71,148,179, 37, 57,125,105, 17, 0,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,202, 48,204,106, 66,
+ 72,166,248, 57,113,226,196,180,172,172,172,233, 19, 38, 76,120,115,198,140, 25,199, 24,134, 89, 13, 0,238,191, 29,117, 73,166,
+155,136,139, 20,121, 28,101,174,209,177,158,126,187,127,122,226,110,228,104,101,102,102, 50,142, 72, 50,174,149, 90,160, 66, 43,
+144,181,251, 56,142,123,126,250,244,233,209,190, 68, 86,125,125, 61, 74, 74, 74,144,152,152,136, 39,158,120, 34,122,238,220,185,
+207,219,108,182,143,125,208, 74, 37, 18, 9,246,238,221,139,242,242,114,116,237,218, 21,201,201,201,141, 14, 56,123,246, 44,214,
+174, 93,139,154,154, 26,244,232,209, 3,104,232,220,237, 17,221,186,117,123,183, 83,167, 78, 67, 89,150,181, 41, 20, 10, 28, 62,
+124, 24,221,187,119,199,247,223,127,143, 54,109,218, 64,169, 84, 34, 55, 55, 23, 93,187,118,197,214,173, 91, 17, 25, 25,137,244,
+244,116,155, 86,171,221, 86, 93, 93,189,249,220,185,115,239,122, 11,103,124,124,252,228,167,158,122, 74, 86, 82, 82, 34,124,243,
+205, 55,219, 1,108, 7,240,252, 91,111,189,245,248,176, 97,195,162, 14, 30, 60, 88,187,111,223,190, 61, 94, 68, 86, 32, 78,150,
+205,253,161,100,183,219, 77, 6,131,193,108, 50,153,172, 44,203, 22, 50, 12, 99,182,219,237, 29,188,153, 16, 99,199,142,109, 91,
+ 89, 89,249,220, 75, 47,189, 84,224, 16, 89,167,208,208, 1, 30, 0, 96,179,217, 76,245,245,245,218,140,140,140,196,135, 31,126,
+248,204,210,165, 75,159, 27, 59,118,236,242,111,190,249,166, 30,128,193,157,176, 77,155,214,135, 36, 18, 86,170,171, 11,207, 95,
+177,252,203,151,215,174,122,190,117, 81,209,133,246, 17,173, 34,117, 82,117,100,201,242, 37, 95,239, 7, 96, 46,169,208,226,200,
+217, 82,240,188, 4, 39,138,106,209,255,246, 81,252,153,188,105,125, 1,172,161,239,114, 45,255,178, 40, 46, 66,189,101,203, 22,
+159,142,214,174, 93,187,192,243, 60, 20, 10, 5,102,207,158,237,147, 84, 20, 6,162, 91,228, 79,204,136,139,163,251,114,159, 4,
+ 65,112, 46,244,238,190,253,223,255,253, 31, 94,122,233,165, 70,215,112,136, 13,198, 31,167,183,240, 37, 38, 37,161,188,172,172,
+209,190, 64, 22,165,183,219,237,224,121, 30, 11, 22, 44, 64,102,102, 38, 86,175, 94,237,243,243,142, 59,238, 0,203,178, 36,144,
+244,236,211,167, 15, 44, 22,139, 51,204,167, 78,157,242,200, 59,111,222, 60,127,193,188, 11,192,148,238,221,187,107, 6, 13, 26,
+132,156,156, 28,220,127,255,253, 38,139,197,146, 7, 0,119,222,121,103,234,220,185,115,101, 7, 14, 28, 64, 68, 68, 4,127,254,
+252,249,255,129,118,144,167,104, 97,120,210, 34,226, 51, 47, 43, 43,107,186,187,136,113,133,248, 63,195, 48,171,103,204,152,145,
+233, 42,138, 92,127,139,174,147,155,136, 75,115,117,164, 92, 69,148, 55, 1,229,246,188,117, 61,190,194,163,208,114, 68,108,160,
+171, 11, 36, 86,190,254, 68,150,143, 55,199, 70, 8, 9, 9, 25,126,239,189,247, 58, 69,142,209,104,116, 10, 44, 81,100,137,191,
+115,115,115,209,179,103, 79,105, 72, 72,200,240,170,170,170,143, 3, 16,113,136,139,139, 67,101,101, 37,142, 30, 61,138,196,196,
+ 68, 88,173, 86,172, 95,191, 30,181,181,181,224,121, 30, 82,169, 20, 22,139,207,190,219,232,212,169,211, 29,139, 23, 47,238,185,
+104,209,162, 75,226, 27,221,146, 37, 75, 64, 8, 65,100,100, 36,244,122, 61,202,202,202,176,121,243,102,216,108, 54,168,213,106,
+164,164,164,200,238,185,231,158,190, 83,166, 76,225,125, 8,173, 62,247,223,127,127,136, 70,163,193,139, 47,190, 72, 44, 22,203,
+ 12,199,190,201,227,198,141,139, 40, 44, 44, 52, 63,249,228,147,123, 45, 22,203, 71,162,153,232, 42,112,188,220, 88,175, 78,150,
+213,106, 21,211,180,160,190,190, 30,173, 90,181, 74,116,117,182,188,137,193, 29, 59,118,244, 1, 32,153, 58,117,106, 16,128, 50,
+215, 48,152,205,102,212,215,215, 67,167,211, 89,107,107,107,203, 95,123,237, 53,219,210,165, 75, 37,142,115, 78,120, 18, 90, 12,
+115,135, 89,163, 81,202, 8,145,188, 53,127,254,124,245,176, 97,195, 88,181, 90,141,186,186, 58,205,175,235,214,169, 7, 15,234,
+155, 50, 61,235,195, 13,154,132,174,101, 59, 14,231,227, 66,105, 45,204, 86, 43, 82, 98, 67, 26,252, 48,138, 22,135, 99, 32,139,
+211,209,114, 21, 21, 57, 57, 57,184,253,246,219,157,101, 93, 42,149, 54,114,190,252,113,114, 28,135,219,111,191,253, 50,135,103,
+203,150, 45, 30,221, 39,127,112, 21, 69,238,226,200,147, 0, 99, 89,214,239, 2,235,162,155,231, 73,108,185,186,250,110,226,205,
+ 95, 51, 7, 56,142,195,184,113,227,192,243, 60, 94,127,253,117,112, 28,135,244,244,116,112, 28,135,140,140, 12,240, 60,143, 91,
+111,189,181,201,113,223,189,123, 55,186,119,239,238, 12, 83,122,122, 58,122,245,234, 5,142,227,208,175, 95, 63,240, 60,143,161,
+ 67,135, 6,194,249,102, 93, 93, 93, 55,181, 90,141,220,220, 92, 72, 36, 18, 48, 12,115, 26, 64, 55, 0,136,141,141, 61,163, 6,
+111,130,189, 0, 0, 32, 0, 73, 68, 65, 84,215,235,219, 26,141, 70, 60,245,212, 83,140,217,108,238,250,250,235,175,191,101, 52,
+ 26,169,208,162,104, 49,184,107, 17, 23, 24, 38, 76,152,240, 38,195, 48,171, 69,135,202,221,121,242,244,219, 67,221, 36, 58, 80,
+251, 28,101,181,151,155,136,171, 96, 24,102, 31, 33,228, 78,111,231, 2, 48,187, 9,171, 70, 77,135,174,205,134,126, 29, 45,177,
+242, 13, 84,104,249,131,209,104,188, 49, 42, 42,202,171,200,114,253, 52,155,205, 72, 78, 78,134,209,104,188,177,169, 15,141,216,
+216, 88, 88, 44, 22,124,249,229,151,144, 74,165,144, 74,255,208, 23,102,179,111,179,232,248,241,227, 5,187,119,239,238,222,163,
+ 71,143,176,159,126,250,169, 98,192,128, 1,145,195,134, 13,131, 66,161,128,193, 96,128,213,106, 69,239,222,189,209,169, 83, 39,
+ 20, 23, 23,227,215, 95,127,173,236,208,161, 67,171, 61,123,246, 8,165,165,165,231,124, 80,223, 54,120,240, 96, 48, 12,131,117,
+235,214, 85, 2,216, 39,151,203,215, 78,155, 54, 45,204,108, 54, 11,163, 71,143, 62, 95, 93, 93,253, 18, 0,139, 76, 38,155, 51,
+ 96,192,128,140,236,236,236,111, 5, 65,152,221,212,140,234,158,182, 58,157, 14, 65, 65, 65,129, 76, 37,193, 87, 87, 87,119, 1,
+ 0,149, 74, 21, 14,224,140, 51,135, 27, 12,141,196,176,217,108, 54,134,135,135,171, 0,192,113, 14,239,133, 51,210,102,195,138,
+115,231,242,131, 93,251,207,133,134,134,226,145,135, 31,102,111,233,211, 71,214,237,198, 27,135,190,253,201,162,239,227, 34, 52,
+230,148,184, 8, 88,237, 86,100,111, 88, 47, 16,193,186,129, 86, 59,127,142,208, 18,197,134,187,163,197,243, 60,182,110,221,122,
+217, 62,169, 84,138,255,254,247,191, 1, 9, 3, 81, 84,121,107, 58,115,107,234, 98,252, 9, 24,158,231, 33,145, 72,176, 96,193,
+ 2, 8,130,128,151, 95,126,185, 81,115,162, 43,127, 64,118,158,139, 8,236, 52, 89, 0, 96, 70,241, 76,185,243,124,247,240, 58,
+206, 9,200, 37,155, 59,119,110, 64,142,214,157,119,222,233, 87,184,186,182, 48,184,134,235,208,161, 67, 30,121,231,207,159,239,
+ 55, 61,237,118, 59,214,172, 89,227, 20,169, 34,222,126,251,237,167,100, 50, 89,244,182,109,219, 80, 90, 90, 10,157, 78,135,250,
+250,122,244,238,221, 59,133,101,217,195,165,165,165,133, 39, 78,156,184,151,150, 30,138, 63,209,209, 50,205,152, 49,227,216,140,
+ 25, 51, 60, 58, 86,238,206,146, 47,231, 73, 20, 88, 14, 65, 20, 41,138, 55, 52,116,171,217,231,239, 92, 0, 50,247,166, 67,159,
+ 70,144,155,138,156,226,169,242, 13,164,249, 48, 64, 59,157, 99, 24, 6, 70,163,209,163,192,114, 21, 7, 22,139, 5,213,213,213,
+176,219,237, 87, 60,215,151,167, 55, 89,127, 66,235,232,209,163,255,122,252,241,199, 75, 66, 66, 66,186, 85, 84, 84,148, 11,130,
+112,235,174, 93,187, 34, 57,142,131, 70,163,129, 70,163,193,218,181,107,161, 84, 42, 49,110,220,184,114,187,221,158, 19, 28, 28,
+ 28, 97, 48, 24,126, 47, 45, 45,125,219,171,130,225,249,161,253,250,245,195,129, 3, 7,112,233,210,165,141, 0,210, 31,125,244,
+209,219, 91,183,110,205, 76,155, 54,205,120,246,236,217,217, 0,202, 85, 42,213,226,197,139, 23, 15,234,209,163, 71,240,232,209,
+163,177,117,235,214,249, 0,140,129,198, 89,167,211, 53, 18, 88, 90,173, 22,117,117,117, 80,169, 84,182, 0,211,140,199, 31, 35,
+ 12, 65, 8,113,222, 27,135,155, 37,222, 31,194,113,156, 56,170,209,155,200,130, 74,165,154,186,104,209, 34,133,251, 32, 5,187,
+221,142,178,178, 50,104, 52, 26, 76,122,251,109,233,123,227,255,221, 93,162,142,222,197,178, 12,204, 22, 82, 67, 4,243,122, 93,
+217,131,219,128,119,105,205,243, 39, 64, 20, 6,119,223,125,247,101,205,133, 82,169, 20, 27, 55,110,196,136, 17, 35,156, 47, 46,
+ 61,122,244,240,251,114, 37, 10,131,187,238,186,203,233, 12,173, 95,191,222, 99,179,159,232, 72, 5, 34, 8,197, 99, 95,120,225,
+ 5,112, 28,135,207, 62,251, 12,175,188,242, 10, 88,150,197,204,153, 51,193,178, 44,222,121,231,157,128, 69,166,171,128, 41,252,
+176,225, 51,225, 21, 45,170,230, 69, 3, 0,130, 53, 26, 49, 66, 77,170,123, 56,142,115, 58, 89, 55,222,120, 35,120,158, 71, 70,
+ 70, 6, 56,142,115, 58, 89,195,135, 15,119, 77, 71, 18, 8, 39,199,113,200,203,203,115,134, 57, 35, 35,163,145,147,197,113, 28,
+238,188,243,206, 64,130, 57, 61, 52, 52,116, 74,167, 78,157, 58,207,154, 53,139,151, 72, 36, 24, 60,120,112,106, 76, 76,204, 57,
+155,205, 22, 49,117,234, 84,165,135,115, 20, 0,186,117,238,220, 89, 69, 75, 13, 69, 11, 58, 90, 83, 60,252, 21,230,218,231,170,
+ 9, 47,146,171, 93,143, 23, 57,220,197,145,195, 33,203,241,199,229,233, 92,127,224, 68, 5,233,203, 82, 15, 68,104, 57,108,103,
+159, 23, 83, 42,149, 71,202,203,203, 51, 20, 10, 69, 35,145,229, 73,112, 73, 36, 18,148,150,150, 66,169, 84, 30, 49,153, 76,205,
+118, 19,253, 53, 29, 2, 48,158, 62,125,122,188,203,239, 33,195,135, 15,255,102,227,198,141,177,217,217,217,216,179,103, 15, 34,
+ 35, 35, 49,119,238,220,139,101,101,101,255, 2,176,177,178,178,210,239,117,219,182,109,219, 69,173, 86, 99,199,142, 29, 0,176,
+ 21,192,191,159,123,238, 57,198,106,181, 98,222,188,121, 58, 0,235, 66, 67, 67,215, 44, 95,190,188,123,183,110,221,100,217,217,
+217,218, 61,123,246,252, 22,160,200,178, 11,130,112,153,192,114, 77,211,224,224,224, 64, 28, 45,107, 72, 72,200, 81,173, 86, 59,
+202, 96, 48,104,229,114,121,176, 86,171, 53,185, 10, 44,145,159,227, 56, 62, 47, 47,175, 4, 64, 74, 72, 72,200, 81,120,105,230,
+228, 56,110,240,224,193,131, 57,247,123, 80, 86, 86,134,210,210, 82, 88, 44, 22,244,232,209,131,145, 48, 86,201,165,162, 35,110,
+211, 58, 80,145,245, 39, 57, 90, 68, 44,235,226, 40, 65, 79, 35, 13,215,175, 95,239,252,205,178, 44,190,254,250,235,128, 68,209,
+198,141, 27,125,118, 88,119,107, 58,244,107,141,139,199,127,254,249,231, 32,132, 56,157, 44,150,101, 49, 97,194, 4,200,229,114,
+ 76,155, 54, 13, 19, 38, 76, 0,199,113,126,155, 14, 93, 5, 76,210,235,122,215,151,163,134, 66,225,232, 15,197, 48,140,171,216,
+ 98, 2, 21,111,190,220,188, 64, 90, 2, 92, 57,197,243,130,130,130,188,118,132,119,227,244,117,129, 95, 0,228,199,198,198,238,
+200,200,200, 8,217,191,127, 63,102,206,156, 41, 53,153, 76,109,178,179,179,157,215,245,148, 94, 58,157, 78, 65, 75, 14, 69, 75,
+184, 89, 62,254,174,112,235, 95,197,184, 54,227,249,248,116, 63, 30, 46,251, 92,121, 43, 24,134,177,122,184, 94,133, 7,113,229,
+126, 13,215, 99, 42,188, 58, 90,254, 42, 11,127,130, 43, 16, 71, 75,175,215,255,182,110,221,186, 94, 15, 63,252, 48,231,171,217,
+ 80,167,211, 33, 58, 58, 26,199,142, 29,179,233,245,250,223, 2,112,202,154, 83,104,185, 35,187,188,188, 92, 98,181, 90,209,190,
+125,123,196,199,199,195,104, 52,162,166,166, 70, 2, 96, 99,128, 28, 82,149, 74, 37, 1,128,154,154, 26,160, 97,168,105,106,135,
+ 14, 29,112,224,192, 1, 84, 87, 87,255, 8, 96,216,148, 41, 83,122,244,238,221, 91,250,253,247,223,235,159,121,230,153, 31,173,
+ 86,107, 64, 74, 67, 16, 4,179,205,102, 75,102, 89,214, 82, 83, 83,115,193, 53, 61,163,163,163,195, 85, 42, 21, 83, 86, 86,102,
+ 13, 68,104,117,235,214,109,239,249,243,231, 49,117,234,212,138,233,211,167,119,168,171,171,187, 84, 91, 91,107,115, 21, 91, 70,
+163,145,109,213,170,149,124,222,188,121, 10, 0,232,214,173,219, 94,111, 66, 75,167,211,181, 86, 42,255,120, 49, 54,153, 76, 40,
+ 45, 45, 69,105,105, 41,202,202,202, 80, 87, 87,135,148,148, 20,232,245,250, 68, 90,205,252,101, 66,171, 81,243,153,107,249,118,
+125,144, 55,165,172,187, 10,152,187,239,190,219,217,183, 75,116,200,196,109,197,138, 21,238, 29,204, 3, 18, 90,159,127,254, 57,
+ 94,120,225, 5, 4, 5, 5, 97,214,172, 89,141,154, 14,221,197,129, 32, 8, 76, 32,113, 79,126,195,128,210, 57,225,224,121, 30,
+ 17,207,148, 53,106,162,243, 32, 56, 2, 10,231,244,233,211,155,165,233,208,149, 51, 49,177,161,168, 44, 88,176, 0,163, 70,141,
+194,182,109,219,174,184,233, 48, 45, 45,109,201,234,213,171, 67,142, 31, 63, 14,173, 86,139,138,138, 10,152, 76, 38, 20, 23, 23,
+123,109, 21,112,212,229, 65,180,228, 80,252,201,245,212,190, 63,147,183, 57,175,199,249,121,128, 7, 44,180, 2,113,180, 76, 38,
+211,172, 23, 95,124,241,185, 33, 67,134,132, 7, 7, 7,163,164,164,228, 50,145, 85, 95, 95, 15,181, 90, 13,131,193,128, 85,171,
+ 86,105, 77, 38,211, 44,127,226,192,106,181, 34, 42, 42, 10,149,149,149, 16,188,244,159,102, 89, 22, 10,133, 2,245,245,245,128,
+159, 78,230,158, 30, 24, 22,139, 5, 86,171, 21, 86,171, 21, 22,139,197,239, 91,178,187,153,167, 82,169, 68,225, 1, 0,186,184,
+184,184,246, 65, 65, 65, 40, 40, 40, 0, 26, 70,246, 13,185,253,246,219,249,170,170, 42,242,228,147, 79,110, 39,132, 60, 5,223,
+179,227,155,115,114,114,146, 1, 64,161, 80,228, 2, 64,113,113,177,181,166,166,166,145, 83,168, 84, 42,201,136, 17, 35, 98, 9,
+ 33,200,201,201, 73,150, 74,165, 4,222, 71, 53, 26, 87,174, 92,121, 60, 36, 36,100,105, 86, 86,214,195,153,153,153,199,186,116,
+233,146,172,211,233,202, 13, 6,131,193,104, 52, 18,137, 68, 34, 13, 11, 11, 11,218,176, 97,195,153, 93,187,118, 13,209,104, 52,
+ 75, 87,174, 92,121,220,155,243,166, 82,169,138,245,122,125,146,120, 79, 93, 69, 86,105,105, 41, 8, 33,200,207,207,135, 82,169,
+ 60,239,175, 89,151,162,229, 32,190, 84,185, 59, 47,238,251, 2, 21, 89,174,194, 96,195,134, 13, 62,231,208, 10,148,211, 85, 20,
+189,242,202, 43,152, 51,103,206,101,142,214,180,105,211, 0, 0,111,191,253,118,192,125,180, 68,247,170,116, 78, 56, 98, 94,168,
+110, 20,118, 0, 96,196,240, 53,173,204,131,227, 56, 76,157, 58,245,178, 78,234,174, 77,123, 1, 54,241, 53, 10,103,121,121, 57,
+ 56,142, 67,120,120, 56, 30,121,228, 17, 12, 29, 58,212,217, 4,217, 84,222,147, 39, 79,238,120,227,141, 55,186,166,165,165,225,
+253,247,223,175, 14, 13, 13, 13,254,207,127,254,195,213,212,212, 48,190, 28, 45, 42,180, 40, 40,154, 65,104,137, 5, 44,208, 81,
+135, 94, 42,203, 33,104, 60,215, 70,173, 94,175,127,228,182,219,110,251,105,217,178,101,138,182,109,219,226,228,201,147,168,174,
+174,134,217,108,134, 84, 42, 69,108,108, 44,106,106,106,240,245,215, 95, 27,244,122,253, 35, 0,106,253,112,190,213,179,103,207,
+ 47, 62,254,248,227,160,244,244,116, 84, 87, 87,163,190,190,222, 41,132, 24,134,129, 70,163,129, 66,161,192,222,189,123,177,126,
+253,122, 3,128,183,252,112,122, 82,115,176, 88, 44, 78,193, 21,128,208,114,229, 84,137,174,142, 94,175, 7, 0,107,235,214,173,
+ 99, 0, 32, 63, 63, 31, 0, 10, 83, 82, 82,166,180,109,219,150, 89,188,120, 49, 33,132,172,247, 34,178,156,156, 12,195, 84, 19,
+ 66, 46, 1,136, 49,155,205, 82, 0,168,173,173,181,180,106,213, 42, 74, 46,151, 11, 10,133, 66, 8, 10, 10, 18, 74, 74, 74,108,
+ 54,155, 77, 10, 0,253,250,245, 51, 3, 40,117, 91,163,208,149, 83, 32,132,104,231,207,159, 63,101,244,232,209, 25,125,250,244,
+ 73,123,246,217,103,143, 62,249,228,147,108,124,124,124, 88, 93, 93,157,241,244,233,211,151, 62,249,228,147,186,221,187,119, 15,
+225,121,254,220,252,249,243,167, 0,208, 50, 12, 35,120,226,180,217,108,191,101,103,103,255, 43, 51, 51,147,187,112,225, 2,202,
+202,202,156, 34,171,172,172, 12,157, 58,117,194,174, 93,187,236, 22,139, 37,187, 9,233,217, 92,160,156, 13, 47, 33, 68, 44,235,
+222, 4,150,248, 50, 21, 40,167,171, 40, 26, 53,106, 84, 35, 23, 75, 42,149,226,135, 31,126,240, 88,111,120, 40, 87,141,226,238,
+ 58,199,215, 27,111,188,209, 72,180, 77,154, 52,201,107,117,230, 47, 61, 69,158,218, 5,241,141, 71, 29,122, 41,231,190,194, 41,
+214,157, 60,207, 99,210,164, 73, 1, 59, 90,184,188,143,214,101,156, 98,220, 7, 12, 24, 0,189, 94,239, 20,178,222, 28, 45,127,
+233,105,183,219, 95,152, 51,103, 14,209,104, 52, 55,107,181,218, 71,207,159, 63,191, 80,175,215,223, 84, 91, 91,235,211,209, 50,
+153, 76,114, 90,142, 40, 39, 90,102,126,174,235, 71,104, 57, 30,146,104,221,186,117,163,181,179, 88,150,109,180, 53,165,159,129,
+ 3, 27,242,242,242,238,187,229,150, 91,190,125,225,133, 23,130,211,211,211,249,164,164, 36,232,116, 58, 20, 20, 20,224,216,177,
+ 99,182,149, 43, 87,106,245,122,253,163, 0, 2, 25,117,182,232,248,241,227,235,135, 13, 27,246, 78,239,222,189,159,158, 60,121,
+178, 36, 53, 53, 21,181,181,181, 8, 11, 11, 67, 84, 84, 20, 78,157, 58,133, 85,171, 86,217, 43, 43, 43,191, 0,240, 30, 60,180,
+161,250,123,225,183, 88, 44,120,232,161,135, 32, 8, 2,102,207,158,141, 64, 22, 84,118,129,197, 98,177, 16, 0,140,163, 63,151,
+222, 49,187, 52, 78,159, 62, 13, 0,231,146,147,147,131, 1, 32, 59, 59,155, 65,195,252, 90,129,188,225, 19, 66,136,211,217,234,
+212,169, 83,129,123,229, 40, 58, 89,162, 11,230, 47,220, 12,195, 24, 9, 33,229,122,189,126,216, 43,175,188,242,206,231,159,127,
+254,240,231,159,127,126,217,113, 26,141,102,233,204,153, 51,223,123,224,129, 7,202, 25,134,241,218,143, 76,167,211,189, 61,102,
+204,152, 7,142, 28, 57, 18, 28, 20, 20, 4,157, 78,135,170,170, 42, 88, 44, 22,164,164,164,160,188,188, 28,139, 22, 45,170, 51,
+ 24, 12,239,210,226,248,215,192, 85, 24,120,115,181, 2, 16, 89, 94, 93,157, 95,126,249,197,227, 28, 85, 77,229,116, 23, 27,129,
+206,109,229,235,165, 72,156,150,198,211,148, 17, 77,172,215, 46,227,229, 56, 14, 31,125,244,145,115,210, 86, 79, 78, 86, 83, 28,
+ 45,145, 51, 60, 60,188,193, 38, 87, 42, 33, 8, 2,238,188,243,206,171,225, 21, 0,140,115,153,241,125,250,107,175,189, 54,165,
+ 83,167, 78,169, 0,228,174,105,208, 68, 23,159,130,130,194,159,208,178,219,237,197, 29, 59,118,108, 84,193,249, 91,204,212,106,
+181, 22, 7,120,221,245, 58,157, 46,101,230,204,153, 47,170, 84,170, 33,122,189,190,171,163,226, 56,162,211,233,178, 77, 38,211,
+167,104,218, 34,208, 21, 0,158,223,189,123,247,236, 97,195,134, 77,187,245,214, 91, 71,142, 31, 63,158, 33,132, 96,222,188,121,
+228,236,217,179, 43, 28, 46,214,217, 43, 73,164,240,240,240,227, 95,127,253,117,244, 79, 63,253, 4,171,213,138, 79, 63,253, 20,
+193,193,193,199,171,171,171, 3,165, 40,223,180,105,211, 55,125,250,244,121,108,215,174, 93,139, 0,252,190,117,235,214,133,125,
+251,246, 29,179,107,215,174, 37, 0,142,109,222,188,121, 97,239,222,189,199,236,219,183,111, 57,128, 67, 77,168,124,157,206,150,
+205,230,185,165,209,139,147,229,139, 83, 75, 8,177, 60,254,248,227,227, 31,120,224,129, 47,247,237,219,119, 83, 77, 77, 77, 87,
+ 0, 8, 13, 13, 61,210,171, 87,175,189,203,150, 45, 59,229,112,178,252,117,214,175,208,233,116, 35,186,118,237,250,227,251,239,
+191,175, 74, 75, 75,227,218,183,111,143,194,194, 66, 28, 61,122,212,246,191,255,253,175,222, 96, 48,220, 13,224, 18, 45,142,127,
+157,208, 34,132, 32, 52, 52,180,209, 75,148, 56,228,191,169,205,133,174, 15,102,113,169, 30,119, 94,111,156,190,166, 77, 16,161,
+ 86,171,157,147,155, 6,210,101, 65, 16,124,207,199, 70, 8,113,114,138, 91, 0, 34,203,239, 8, 65,199, 18, 56, 1,115, 6, 50,
+189,131, 74,165,130,213,106,117,242, 6, 48,242,179,169,106,241, 23, 0,191, 88,173,214,211, 0,218, 81,113, 69, 65,209,130, 66,
+235,210,165, 75, 61, 91,248,218, 90,147,201,244,158,201,100,122, 79,220, 97, 52, 26,175,150,243, 44,128, 7, 54,109,218,244,241,
+166, 77,155,196,118,132,169,240,191, 94,162, 79,156, 60,121, 50,147,231,249,255, 46, 93,186,180, 55, 33, 4, 33, 33, 33,187, 11,
+ 11, 11,255,211, 20, 14,187,221,254,248,174, 93,187,158,131,163, 47,147,197, 98,121,124,199,142, 29, 47,162, 97, 61, 38,216,237,
+246,199,247,236,217,227,252,221,196, 7, 37, 33,132,152, 8, 33,113, 94, 14, 49, 53,209,129, 19,157, 45,243,178,101,203,234, 1,
+ 28,198, 31,243,100, 89, 29,155,209,173,185,208, 23, 54,235,116,186,246,147, 38, 77,154, 46,145, 72, 6,235,116,186,120,149, 74,
+ 85,100,179,217,126,211,235,245,111,161, 97,141, 42,138,191, 8,102,179,249, 66,199,142, 29, 57, 79, 47, 80,190, 30,228,190, 94,
+172,236,118,123,113,135, 14, 29,252,190,156,121,224,188,224, 67, 52,156, 75, 73, 73, 97, 3,229, 18, 97,177, 88,202,125,133, 51,
+ 37, 37, 5, 77,229,244, 23,247,228,228,100,143,113,247, 35, 8,189,198,221,102,179, 93, 17,167,175,244,244, 5,131,193,112, 41,
+ 50, 50,178,222,104, 52,242, 38,147,137,183,217,108,141,236, 71,133, 66, 81, 97, 48, 24,104,225,161,160,184, 26,161,245, 15,199,
+126, 52, 44, 47,209, 92, 48, 29, 57,114,228, 49,167, 61, 85, 94,126,165, 60,238, 74,178,222,207,239,166, 8,163,102,119,132, 28,
+ 66, 74,223, 76,116,149,245,245,245, 79,138, 63,196, 62, 32, 20,127, 61,170,170,170,110,110,110,206,234,234,234,102,127, 81,171,
+172,172,204,104,129,184,247,188, 94, 57,125,161,164,164,228,102, 63, 66,140, 22, 28, 10,138, 0,193,210, 36,160,160,160,160,160,
+160,160,160,104, 25, 48,104, 24, 57,224, 9, 77, 25, 77, 48,228, 10,174,157, 77, 57, 41, 39,229,164,156,148,147,114, 82,206,235,
+142,211, 31, 55, 29,205,216,194, 2,140,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 31,231, 53, 9,218,116, 72, 65, 65, 65,
+ 65, 65, 65, 65, 65,133, 22, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20,174, 72,109,221,186,245,137,212,212,212, 11,
+ 0,198,182,240,181, 30,233,221,187,119,149, 92, 46,223, 0, 32,149, 38, 61, 5, 5, 5, 21, 90, 20, 20, 20,215,180,200,234,218,
+181,235,246,147, 39, 79,118,202,206,206,142,139,143,143,255,176, 37, 47,214,179,103,207, 15,182,109,219, 22,190,110,221,186,219,
+ 98, 98, 98,114,174, 80,108,165,182,105,211,230, 68,106,106,106, 49,128, 71,154, 57,136, 99, 51, 50, 50,170,101, 50,217,122, 42,
+ 4, 41,174, 3,116, 1,208,149, 10, 45, 10, 10, 10,138, 22, 20, 89, 59,119,238,140, 48, 26,141, 56,121,242, 36, 42, 42, 42, 14,
+181,228, 5,115,115,115, 47,237,220,185, 19, 9, 9, 9, 88,178,100, 73,100,114,114,242,182, 38, 10,154,212,174, 93,187,110, 63,
+113,226, 68,167,236,236,236,248,168,168,168, 79,154, 51,124, 55,221,116,211,180,109,219,182,133,109,216,176, 97,104,100,100,228,
+149, 10, 65, 10,138,191, 51,228, 0, 30, 99, 24,102,111,151, 46, 93,142,164,165,165,253,206, 48,204, 46, 0,163,112,237,206,221,
+ 25, 24, 86,175, 94,189,117,245,234,213, 91,105, 30,161,160,160,104, 6,164,165,165,165,233,116, 58, 29,169,168,168, 32,159,125,
+246, 25, 9, 15, 15,183, 0,248, 13,192, 74, 15,219,155, 0, 52, 1,114,107, 28,199,123,226,249, 45, 60, 60,220,242,217,103,159,
+145,252,252,124,114,252,248,113,146,154,154,106, 8, 80,208,164,118,237,218,181, 82, 12,243,218,181,107, 9,199,113,235,155, 51,
+ 81, 52, 26,205,177,156,156, 28,114,246,236, 89,178, 97,195, 6, 18, 29, 29, 93, 78,197, 22,197, 53,130, 36, 0, 31,168,213,234,
+234,187,238,186,139,124,245,213, 87,100,213,170, 85,228,199, 31,127, 36,179,102,205, 34,131, 6, 13, 34, 50,153,236, 2,128,215,
+ 1,132, 94, 79, 90,132,113, 68,140, 0, 24, 8, 0,153,153,153, 84,108, 81, 80, 80, 92, 45,118,234,245,250, 12,189, 94,143,186,
+186, 58,180,110,221, 26, 60,207,123, 60,176,188,188, 28, 59,118,236,192,184,113,227,142,151,150,150,246,135,239,117, 47,195,186,
+119,239,190,115,243,230,205,169,193,193,193,206,157,130, 32,192, 98,177,192,106,181,194, 98,177,192,100, 50,193,100, 50, 65, 38,
+147, 65,161, 80, 32, 60, 60,252, 40,124, 55, 97, 56,221, 55,131,193,128,131, 7, 15, 98,244,232,209, 21, 85, 85, 85,253, 1,228,
+ 54, 99,186,164, 70, 69, 69,229, 44, 90,180, 40, 50, 37, 37, 5,231,207,159,199, 19, 79, 60, 81,121,238,220,185,126,205,124, 29,
+ 10,138, 63, 19, 19,238,187,239,190,105,209,209,209,108,151, 46, 93, 16, 27, 27, 11,147,201, 4,131,193, 0, 66, 8, 56,142, 3,
+ 33, 4,181,181,181,200,201,201,193,230,205,155, 77,151, 46, 93,250, 26,192,167, 0,242, 92, 68,214, 53,169, 69,156, 66, 43, 51,
+ 51,147,161,121,133,130,130,162,153,112,164,182,182,182,139,201,100,130, 78,167, 11,232,132,252,252,124,140, 29, 59,246,120,105,
+105,233, 45,240,188,168,188,166,123,247,238,123,114,114,114, 82,141, 70, 35,180, 90,255,235,206,203,100, 50, 4, 5, 5, 33, 34,
+ 34, 98, 23,128, 62,222,222,196,187,116,233,178,127,215,174, 93,225, 6,131, 1,135, 14, 29,194, 35,143, 60, 98,169,174,174,222,
+ 14,192, 91,224,171,209,176,142,234, 57, 15,255, 37, 2,120,209,241,134,239, 9,170,200,200,200,190,139, 23, 47,150,182,109,219,
+ 22,122,189, 30,163, 70,141,170,206,205,205,237, 5,160,128,102, 29,138,127, 32,114, 79,158, 60,217,193,110,183,163,178,178, 18,
+ 38,147, 9,122,189,222, 41,180, 36, 18, 9, 8, 33,176,217,108,206, 23,163, 3, 7, 14, 32, 59, 59,155,228,231,231, 79,118,148,
+165,107, 86,139, 80,161, 69, 65, 65,209, 18, 72,237,208,161,195,161, 95,127,253, 53, 72, 42,149, 98,213,170, 85,152, 60,121,178,
+181,186,186,122,155,187,120,137,142,142, 78, 91,184,112, 97,114, 74, 74, 10,126,255,253,119,220,127,255,253,111, 1,152,238,129,
+243, 77,173, 86, 59,205, 98,177,224,208,161, 67, 24, 51,102, 76, 65, 89, 89,217, 49,119, 17,147,156,156,220,239,147, 79, 62,225,
+123,244,232, 1,173, 86,139,145, 35, 71,234, 79,157, 58,213, 27,192, 49, 47, 97,253,164,186,186,250, 21,187,221,142,186,186, 58,
+ 36, 36, 36, 64, 42,149,250,140,156,193, 96, 64, 82, 82,210,174,138,138,138,203,196, 91, 68, 68,196,166,243,231,207, 15, 82, 40,
+ 20, 62, 57, 44, 22, 11,138,139,139, 33,147,201, 96, 50,153,208,174, 93,187,175, 1, 60, 78,179, 14,197, 63, 81,104, 29, 62,124,
+184,195,119,223,125,135,238,221,187,163,115,231,206,168,175,175,119,138, 46,179,217, 12,171,213,122,217, 73, 90,173, 22, 47,191,
+252,114, 30, 28,205,231,215,170, 22, 17, 59,166, 77, 17,219, 68, 51, 51, 51, 7,208, 60, 67, 65, 65,113,181, 21,111, 94, 94, 94,
+250,144, 33, 67,182,173, 88,177,162,213,240,225,195,209,174, 93, 59,254,222,123,239,141,212,235,245,131, 93, 15, 44, 43, 43, 11,
+ 27, 51,102,204,254,162,162,162,100,199,174, 94, 94, 56,123, 5, 7, 7, 35, 63, 63, 95, 20, 89, 61,225,214,204, 40,147,201,214,
+ 31, 62,124,152,151,201,100,216,183,111, 31,198,142, 29, 91, 89, 80, 80,224,175, 89, 46,212,108, 54, 67, 34,145, 0, 0,138,139,
+139,253, 70,238,252,249,243, 16, 4,193,228,233, 63,150,101,229, 7, 14, 28, 64, 92, 92,156, 79, 14,150,101,221, 5, 93, 13,205,
+ 54, 20,255, 80, 88,205,102, 51,122,246,236,137,130,130, 2, 28, 56,112,192, 41,184, 42, 43, 43, 81, 82, 82,210,232,224,189,123,
+247,226,224,193,131,232,223,191,191, 59,207, 53,169, 69,156,202,113,245,234,213, 3, 28,145,219, 74,243, 12, 5, 5, 69, 51, 33,
+ 53, 46, 46, 46,103,209,162, 69,145,177,177,177, 24, 52,104, 80, 81,105,105,105, 27, 15,199,173, 36,132,220,157,159,159,143,182,
+109,219,174, 2,112,207,149, 28,147,152,152, 88,177,111,223,190, 86,199,143, 31,199, 35,143, 60, 82,225,232,243,229,175,239, 83,
+114,167, 78,157,246,109,216,176, 33,156,101, 89, 28, 59,118, 44,144,166,195, 66, 52,244, 47, 57,231,225,191, 68, 0,147, 0,132,
+123, 57, 87,213,161, 67,135,190,251,247,239,151, 50, 12,131,194,194, 66,177,233,176,167,131,151,130,226,159,134, 17,113,113,113,
+255,123,238,185,231, 66,122,247,238,141,226,226, 98, 92,184,112, 1,151, 46, 93, 66,122,122, 58,210,210,210,112,246,236, 89,172,
+ 95,191, 30, 7, 15, 30,132, 92, 46, 71, 66, 66, 2,212, 75,191,195,127, 25, 28, 7,144, 70,181, 8, 5, 5, 5,197, 85,136, 45,
+169, 84,186, 62, 62, 62,190, 28,158,231,165, 10, 27, 57,114,100,137,221,110, 39,103,207,158, 37,104, 24, 61, 8, 47, 66,139,156,
+ 61,123,150, 68, 71, 71,231, 3, 8,243,112,204,216,152,152,152, 34,165, 82,121, 20, 77,156,214,161,125,251,246, 21,167, 78,157,
+ 34, 69, 69, 69,100,221,186,117, 36, 34, 34,162, 37, 70, 4,166,118,236,216,177,178,174,174,142, 24,141, 70,146,147,147, 67, 18,
+ 19, 19, 43, 64, 71, 30, 82,252,243, 17, 12, 96,106, 74, 74,138,241,227,143, 63, 38,235,215,175, 39, 11, 22, 44, 32,211,166, 77,
+ 35,227,199,143, 39, 25, 25, 25, 36, 35, 35,131,140, 26, 53,138,188,242,202, 43,228,246,219,111, 39,106,181,186, 22,192,189, 52,
+233, 40, 40, 40, 40,154, 23,137, 0,102, 57, 4,213,202,145, 35, 71,150,152, 76, 38,114,225,194, 5,242,195, 15, 63, 16, 52, 76,
+221,224, 9,111,150,150,150,146,210,210, 82,113,106,132,124,252, 49,173,195, 87, 14,222,171, 18, 65, 73, 73, 73, 21,251,247,239,
+ 39,133,133,133,100,237,218,181,196, 33,216,154, 13, 10,133, 98,131, 86,171, 37, 70,163,145,108,218,180,137, 78,239, 64,113, 45,
+ 34, 10,192,220, 27,110,184,193, 58,123,246,108,178,114,229, 74,242,217,103,159,145, 17, 35, 70,144,215, 95,127,157, 60,248,224,
+131, 36, 50, 50,210, 4, 32, 11, 64, 8, 77,174,171, 7, 93,217,156,114, 82, 78,202,233,142,245,199,143, 31, 39, 34,236,118, 59,
+185,112,225, 2,217,176, 97, 3,137,137,137, 57,134,198,243,105,185,114,106, 58,119,238,124,242,212,169, 83,228,252,249,243,196,
+ 98,177, 56, 57, 78,158, 60, 73, 0,108,109,134,112,166,198,199,199,151,111,217,178,133,156, 58,117,138,196,196,196, 20, 53,103,
+220,147,146,146,202, 43, 42, 42,200,166, 77,155, 72,100,100,164, 63,145, 69,243, 18,229,252, 39,115, 38, 1, 88,220,163, 71, 15,
+251,156, 57,115,200,211, 79, 63, 77, 18, 19, 19,237,142,151,162,248,235, 73, 8, 93,223,179,180, 82, 80, 80,252, 21,144,239,222,
+189, 27,114,185,220,185,227,247,223,127,119,157, 71,203,219,188, 13,218, 19, 39, 78,220, 50,124,248,240,109,115,230,204,233,236,
+ 58,138,105,203,150, 45, 0, 96,106,134,176,229, 94,184,112,161,255,176, 97,195, 62,141,136,136,184,177,180,180,244,157,230,140,
+120, 97, 97,225, 43, 93,187,118,157, 94, 87, 87,167,213,235,245,163, 64,231,206,162,184,118, 81, 8, 96,244,129, 3, 7, 62, 60,
+112,224,192, 91, 0, 8,128,247, 1,156,184,222, 18,130, 10, 45, 10, 10,138, 63, 27, 99,159,124,242, 73,247,206,226,251, 0,252,
+159, 15,145, 37,226, 82, 65, 65, 65,159, 59,239,188,243, 57, 52, 30,157, 40,118, 78,111, 14,228,154,205,230,161,238, 35,165,154,
+ 9, 75, 74, 75, 75,151,208, 44, 64,113, 29,225, 24,128, 7,175,231, 4,160, 66,139,130,130,226,207,198, 57, 0, 79, 92,197,249,
+ 90,120,158,103,139,130,130,130,226,111, 7,186,168, 52, 5, 5, 5, 5, 5, 5, 5, 5, 21, 90, 20, 20, 20, 20, 20, 20, 20, 20,
+255, 44, 48,240, 62,114, 32,187, 9, 60, 87, 50,162, 33,155,114, 82, 78,202, 73, 57, 41, 39,229,164,156,215, 29,167, 63,238,108,
+ 80,180,168, 0,163,156,148,147,114, 82, 78,202,249,207,230,100, 28, 27,235,216,196,223,127,231,184, 51,127,227,184, 95, 47,156,
+215, 36,254,170,206,240,226,141, 16,208, 48,228,147,226,239, 7,215, 2, 66,232,125,162,160,160,104, 98,221, 33,113,121,216,218,
+ 29, 27,254,134,117,137,171, 40, 16,174,242,185,212, 18,113,191,158, 57,175,121,161,117,163, 74,165,154, 44,147,201, 82, 24,134,
+177,235,116,186, 35, 38,147,105, 62,128, 93, 87,121,205,175,162,163,163,199, 86, 85, 85, 9, 44,203,130,101, 89, 48, 12, 3,150,
+101,193,243,188,161,182,182, 86,115, 37,164,145, 93, 70,188,202, 49,204, 11,118, 98,159, 95,126,116,213, 52,127,251, 41,124, 23,
+ 24,169, 84,122, 95,120,120,120,104, 69, 69, 5, 97,217,134,174,124, 18,137, 68, 92, 8,215, 86, 91, 91,251, 77,160,100, 97, 97,
+ 97,123,195,195,195, 67,197,243, 25,134, 65, 85, 85, 85, 77,121,121,249, 77, 0, 16, 20, 20,180, 67,165, 82, 69,112, 28, 7,137,
+ 68, 2,137, 68, 2,189, 94, 95, 85, 85, 85,117, 11,189, 21,255, 76, 44, 95,190, 92, 50, 44,254,137,118, 28, 49,116, 99, 89, 18,
+ 34, 8, 76,173,141, 81,252,190,254,194, 87,103, 2, 57,127,212,168, 81,118,154,138,127, 30,100, 50,217,236,232,232,232,127,215,
+215,215,235, 25,134, 33, 12,195,128, 97, 26,222,179,220, 63,237,118,123,113, 85, 85, 85, 79, 63, 15, 91, 94, 38,147,205,140,137,
+137, 25,163,215,235,245, 14, 62,143,188, 0, 96,181, 90,139, 43, 43, 43,123, 6, 84,215, 71, 70,206, 87, 40, 20,143,234,245,122,
+ 29,195, 48,130,235,127,132, 16,215,135,249,217,202,202,202,126,254,132,129, 76, 38,251, 52, 58, 58,250, 95,142,184, 59,195,121,
+181,113,143,142,142, 30,163,211,233, 2,226,244, 17,247,203, 56, 91, 34,156,127, 83,206,107, 95,104,165,167,167,127,183,103,207,
+158, 14, 60,207, 3, 0,140, 70, 99,215,185,115,231, 62,246,198, 27,111,100, 1,152,120,133,215, 91,216,175, 95,191,135,114,114,
+114,216,149, 43, 87,178,189,122,245, 2,195, 48,176,219,237,176,219,237,232,210,165,139,226, 74, 35, 18,162, 82, 78, 56,184,241,
+191, 65, 55, 14,121,242,133,114, 96,154,191,253,190, 4, 38,128,183, 1,164, 52, 49, 8, 21,142,116, 57,232, 69,108,236,100, 89,
+182, 73,156,130, 32,228, 95,186,116,169,143, 15, 1,211,236,156, 14,145,117,127,191,126,253, 66,178,179,179,153,162,162, 34, 70,
+161, 80, 64, 16, 4,216,237,118, 88,173, 86,220,112,195, 13, 77,114, 66, 67, 67, 67, 53, 19, 38, 76,104,119,199, 29,119,224,135,
+ 31,126,192, 99,143, 61,134,190,125,251,230,149,151,151, 3, 0, 84, 42, 85,196,241,227,199, 59,132,135,135, 67,175,215,163,182,
+182, 22,183,221,118, 27,170,170,170,254,209,133,235,230,244,132,247, 25,150,113,206, 21, 69,108,246,234, 61,191,151,188,125,181,
+188,225,225,225, 7,229,114,121,180, 95,181,236,242, 32, 51, 26,141,101,213,213,213,221,253,156,146, 4,224, 46,137, 68,210,158,
+227,184,142, 0,146,108, 54, 91, 52, 0, 72,165,210, 50,137, 68, 82,104,181, 90, 79,153,205,230,211, 0,126,129,143, 5,144,135,
+197, 63,209,142,177,233, 71,214,153,132,225,202,182, 89,169,250,179, 19,114,149,114,253,218, 97,241, 79,172, 8, 84,108,253,133,
+ 72, 5,176, 12, 13, 11, 74, 63,141,134,121,128,174, 6,241, 0,238, 70,195,154,143,201, 22,139,165, 18,192, 1, 52,244, 67,201,
+ 3,144, 24, 25, 25,185, 68, 16, 4, 83, 85, 85,213, 19,240,176, 80,117,239, 30,173,247,179, 44,155, 32,122, 2, 2,177, 23,239,
+ 62, 80,220, 44, 15, 40,150,101, 63,205,204,204,252,215,138, 21, 43,148, 7, 14, 28, 80,118,238,220,217,249, 66, 36, 8, 2, 26,
+107, 23, 32, 57, 57,217,159,171,193,177, 44, 59,123,228,200,145, 15, 47, 94,188, 88,121,238,220, 57,101, 92, 92,156,147,211, 85,
+108,137,136,139,139, 11, 52,239,127, 53,116,232,208,209,139, 22, 45,226, 87,173, 90,165,104,213,170, 21, 34, 34, 34, 32,149, 74,
+ 47, 59,246,150, 91,110, 17,252, 71,157,253,244,158,123,238, 25,253,253,247,223, 43,247,236,217,163,236,210,165, 11, 36, 18,201,
+ 85,199,125,196,136, 17, 15,127,247,221,119,202, 35, 71,142, 40,219,183,111, 15,209, 84,112,231, 99, 89, 22,173, 91,183, 14,136,
+243,238,187,239,126,120,217,178,101,202,131, 7, 15, 42, 59,118,236,232, 76, 79, 66,200, 21,135,243,111,206,121, 93, 56, 90, 50,
+139,197,130,173, 91,183,130,101, 89,132,135,135, 99,236,216,177,216,184,113,227,132, 77,155, 54,173,190, 2,103,235, 43,135,200,
+226, 1,224,199, 71, 71, 32,159, 7,198,149,155, 33,149, 74,113,246,236, 89, 72, 36,146, 38, 91,139,114,185,124, 12, 33,100,146,
+254,194, 62,185,193, 96,133,177,100,191, 82,161, 80, 56, 31, 0,250, 18,199,254,139,251,149, 10,133,226,172, 68, 34,153, 90, 95,
+ 95,191,208, 27, 95,251,246,237,191, 61,118,236, 88, 39, 79, 5,215, 23,244,122, 61,218,180,105,147, 88, 93, 93,221,222,211,255,
+ 60,207, 39,156, 59,119, 46, 74, 38,147,129, 16,226, 44,196,238,159,226,119,139,197,130, 27,110,184,193,226,235,154,190, 56,109,
+ 54, 27,130,130,130, 32,186, 81,102,179, 25,245,245,245,254, 56, 25,169, 84,122,159, 40,178, 0, 96,233,210,165,136,137,137, 65,
+ 84, 84, 20, 84, 42, 21, 20, 10,133,147, 51, 80, 72, 36, 18, 12, 27, 54, 12,239,190,251, 46,178,178,178,240,218,107,175, 53,170,
+104,121,158, 71,120,120, 56,214,173, 91, 7,141, 70,131,196,196, 68,136, 2,255, 31,109, 11,178, 76,248,174,253,231,157, 14,237,
+237,183,118,226,110,238,206,125,238,120, 84,130,101, 1, 65,104,120,116, 50, 12,136,205, 42, 92,218,127,164,228,157, 0,210, 51,
+174,176,176, 48, 42,208, 52,178,217,108,136,139,139,147,248, 57,108,120, 90, 90,218,143,207, 62,251,172,180,125,251,246,140, 84,
+ 42, 5,199,113,224, 56, 78, 20,232,137,132,144, 68, 65, 16, 6,150,149,149,145,185,115,231,126,184,101,203,150,123, 1,172,245,
+ 88,177, 16, 67,183, 58,147, 48,124,219, 33,220, 52,114,200, 27, 88,183,124,194, 77,253,210, 5, 4, 43, 13,103, 0,252,157,133,
+ 86,106, 90, 90,218,161, 61,123,246, 4, 89, 44, 22,244,238,221,123,119,110,110,110, 15, 92,217, 12,238, 97, 0, 62,153, 56,113,
+226,232,103,159,125, 86, 18, 26, 26, 10,153, 76,134,186,186, 58,156, 57,115,102,204, 55,223,124, 67,190,248,226,139,255, 3, 16,
+ 92, 88, 88,152,177,119,239, 94, 12, 26, 52,232, 69, 0, 47, 95,174, 8, 36, 9, 59,246, 22, 68,137,191,239, 30,214, 85,154,209,
+147, 45,107,112,113,220,143, 38, 16,236, 66,241,222,195, 23, 2, 17, 98, 31,142, 24, 49,226,145, 21, 43, 86,168, 1, 96,222,188,
+121,184,239,190,251, 16, 30, 30, 14,165, 82, 9,169, 84, 10,158,231, 27,125,250,121,216, 74, 0,124,248,224,131, 15,142, 92,188,
+120,113, 48, 0, 44, 94,188, 24, 35, 70,140, 64, 68, 68, 4,130,131,131, 33,147,201, 32,145, 72,154,156,152,225,225,225, 95,245,
+189,233,166,199, 23, 45, 90, 4, 0,120,235,165,151,112,199,205, 55, 67,173, 84, 64,169,144, 65, 76, 11,153,132,199,237,227, 94,
+240,171, 47, 1,124,124,223,125,247, 61,240,253,247,223, 7, 3,192,129, 3, 7, 80, 94, 94,142,232,232,104, 40, 20, 10,200,100,
+ 50,103,156, 25,134,129, 66,161, 8, 40,238,247,221,119,223,200,239,190,251, 46, 24, 0, 22, 46, 92,136, 97,195,134, 57,227, 46,
+151,203, 33,149, 74, 27,109,238,162,211, 19,231,189,247,222, 59,114,217,178,101,193, 0,240,205, 55,223, 96,200,144, 33, 8, 11,
+ 11,115,166,167,200,213,148,123,244, 55,231,188, 62,132,214,161, 67,135,238, 87,169, 84, 51, 0, 68,202,100,178,208,135, 31,126,
+184,245,227,143, 63,142, 7, 31,124, 16,155, 54,109,122,170,137, 66,139,137,142,142, 30,155,147,147,227,124, 66,155,201,101,130,
+169,201, 15,112, 7, 38,237,127,234,169,152,172, 51,245,216,189,247, 20,130,192, 50,123, 63,254, 56,210,120,250, 52,236,102, 51,
+222, 59, 91,215,176,223, 70,152,173,175,140,139,185,113,246,255, 77, 2,176,208,135, 11, 32, 55,153, 76,200,203,203,107, 82, 32,
+138,138,138, 32, 8,130,201,151,187, 32,149, 74,113,244,232,209,203, 84,189, 39, 36, 38, 38,250, 42,128,126, 57,215,175, 95,143,
+241,227,199,227,212,169, 83, 16,151, 42, 9,128,147, 9, 15, 15, 15, 21, 69,150, 40,130, 20, 10, 5,120,158,103, 56,142, 99,196,
+166, 61, 71,225, 10, 72, 24,179, 44,139,111,191,253, 22, 31,124,240, 1, 94,127,253,117,204,159, 63, 31,221,186,117,251, 35, 19,
+114, 28,180, 90, 45,194,194,194, 16, 22, 22,214, 72, 32,254,147,225,126,155,103,206,154,163,132, 64, 26, 58,129, 16, 1, 16, 0,
+ 2, 2,129, 8, 40,187,112, 6,147,223,253, 40,224,167, 15,207,243, 56,125,250,180, 51, 31,136,206,176, 40,140, 92, 93,131,164,
+164, 36,191,121, 73, 42,149, 78,249,249,231,159,101,223,126,251, 45,190,255,254,123, 48, 12, 3,185, 92, 14,149, 74,133,208,208,
+ 80, 68, 68, 68, 56,183,132,132, 4,230,127, 61,184,254,121, 0, 0, 32, 0, 73, 68, 65, 84,255,251,159,180, 91,183,110, 83,180,
+ 90,237, 90,207,247,156,132, 40,219,102,165,142, 28,242, 6, 0, 96,228, 27, 4,151,242,166,221,200,214,188,243,119, 94, 68, 54,
+181,107,215,174,219,119,238,220, 25,164,215,235, 33, 8, 2,214,174, 93,171, 28, 50,100,200,182,130,130,130,126, 77, 21, 91, 73,
+ 73, 73,171,118,238,220,121, 75,100,100, 36,106,107,107,161,213,106, 97,181, 90, 33,145, 72,144,152,152,136, 15, 63,252,144,185,
+231,158,123,158, 31, 51,102,140, 81,161, 80,136,206, 70,146,231,188,212, 56, 51,205,253,236,243, 80, 66, 26,242, 15, 17, 72,163,
+207,234,242, 66,188,244,202,228,128,194,216,186,117,235,167,127,248,225, 7,181,171,179,228, 42, 2, 92, 69,150,184,249, 17, 6,
+108,155, 54,109, 30, 95,178,100,137,147,179, 85,171, 86,224, 56, 14, 60,207,131,227, 56,176, 44,139,109,219,182, 97,198,148,137,
+ 8,139,140,195,156,207,230,249, 13,103,100,100,228,252, 97,195,134, 61,186,112,225, 31, 85,119,215,182,109,113,231, 45, 55, 35,
+170,149, 6,173,194,130, 27,210, 73, 96,240,251,169, 2,191,207, 35, 0,108,235,214,173,159, 88,190,124,185,218,245,133, 80,140,
+171,248,242, 44,186,248,102,179, 25, 61,123,246, 12, 40,238,174,156,162,219, 38,138, 54, 49, 61,197,235,136,229,213, 79, 56, 31,
+ 23,133,176, 67,112, 54,226,224,121, 30,203,215, 45,242,234,102, 95, 41,103, 83,239,187, 59,103, 97, 97, 33,166, 79,159, 14,241,
+165,205,181,171, 80,124,124, 60,230,204,153,227,183, 94,114, 43, 3,189, 0, 68,186,236, 50, 3,144,185,124, 86, 48, 12,179,207,
+195,113,226,126,222,209, 98, 21,137,134,126, 99,117, 0, 66, 61,240,121,227,169,116, 60,243, 34,221,142,111,116, 29,175, 66,107,
+245,234,213, 98, 41, 30,152,153,153,185,213,241,189, 70, 46,151, 23, 41,149,202, 24, 0,117,107,215,174,197,127,254,243, 31, 56,
+172,213,187, 67, 66, 66,142,121,112,117, 14,153, 76,166, 55, 0,148, 57,118,137, 67, 52,217,234,234,106, 97,227,198,141,236,226,
+123,135,194, 76,128,244, 73, 51, 48, 44, 51, 19,235,227,101,144, 0,184,233,100, 37,148, 74, 37,167,213,106,173,174,253,182, 60,
+244,221,202,118,203, 80,146, 32,142, 67,239,237,107, 48,126,251, 26,220,164,146,161,106,197, 50,212,237,200, 1,203, 50,232,175,
+106,133,215, 30,217,136, 62, 26, 57,100, 38, 29, 88,150,245,148,179,157,156,121,121,121,163, 52, 26,205, 12,183, 4, 14, 4,249,
+104, 88,199, 9, 94,194, 9, 66, 8,186,117,235, 6,134, 97,156,110,129,184,137,133, 78,220, 14, 30,244,216, 2,233,149,211,209,
+ 4, 7,149, 74,133,223,126,251,205,121,204,224,193,131, 97, 52, 26, 17, 30, 30, 30, 16,103, 69, 69, 5, 41, 41, 41, 97, 22, 47,
+ 94, 12,158,231, 17, 17, 17, 1,165, 82,201, 44, 90,180,104,162, 84, 42, 77, 48, 26,141,130,217,108,134, 76, 38,155, 35,222, 31,
+142,227,116, 90,173, 54,194, 27,167, 68, 34,193,179,207, 62,139, 87, 95,125, 21,243,231,207,199, 83, 79, 61,117,153,227,101, 52,
+ 26,209,170, 85, 43,167,216,242, 80, 0, 91, 98,184,111,203,114, 10, 4,199, 14,174,199,241, 35,217, 16,236, 2,236, 2, 1, 33,
+118, 8, 54,224,192,198,221, 29, 46,230,151,196, 19,144,134,174,183, 0,228,181,245,182, 1, 17,178,142, 0, 86,110,173, 50,207,
+246, 23, 78,142,227, 96, 52, 26,241,243,207, 63,227,228,201,147, 88,187,118, 45, 12, 6, 3, 90,181,106,133,208,208, 80,220,124,
+243,205, 24, 51,102, 12,146,146,146,252,198,157, 16,178,176,168,168, 40,189,111,223,190, 76, 77, 77, 13,106,106,106, 96, 48, 24,
+ 96,183,219, 97,179,217,192,113, 28,130,130,130,160, 80, 40, 16, 29, 29, 13,163,209, 72, 76, 38,211, 66,111,156,130,192,212,234,
+207, 78,200, 93,183,124,194, 77, 35,223, 32, 88,241, 1,131,118,109,228,250,223,246, 7, 63,190,114,251,107,183, 1, 32, 2,113,
+ 90, 11,196,106, 23, 42, 95,157,248,201,243,127,250, 61,186, 92,100, 69, 24, 12, 6,212,213,213, 53,216,250, 50, 25, 86,172, 88,
+209,234,174,187,238,202, 41, 41, 41,233,239, 67,108, 93,198, 25, 28, 28,156, 40,145, 72,112,244,232, 81,124,241,197, 23,248,237,
+183,223, 80, 86, 86,118, 41, 46, 46, 46,100,224,192,129,236, 75, 47,189,132,244,244,116,124,253,245,215, 65,254, 56, 9, 33, 40,
+204,219,134,194,211,219, 33, 8, 13,174,117,195,230,249, 59, 9, 48,238, 58,157,206,120,232,208, 33,245,151, 95,126,137,168,168,
+ 40, 36, 39, 39, 67,169, 84, 34, 40, 40,168,209, 67,214,245,193,235,175,108, 26, 12, 6, 99, 97, 97,161,250,187,239,190, 67, 68,
+ 68, 4,146,146,146,160, 84, 42, 33,147,201,192,113, 28, 24,134,193,226,197,139,177,244,221, 71, 80,120,234, 8, 70,220,121,155,
+223,112, 42,149,202, 71, 23, 46, 92,216,200, 2,137, 14, 11, 3,199,179,144,240, 12,194, 6,223, 11, 0,184,180,233, 39, 95,179,
+ 67,186,114, 50,117,117,117,198, 61,123,246,168,247,239,223, 15, 65, 16,144,148,148, 4,189, 94, 15,141, 70,227,140,255,198,141,
+ 27,113,207, 61,247,224,219,111,191, 69, 70, 70,134,223,184,215,215,215, 27,143, 28, 57,162, 94,178,100, 9,194,195,195,209,186,
+117,107,103,220,197,141,231,121, 72, 36, 18,164,164,164,160,182,182, 22,106,181,218,239, 61, 58,112,224,128,122,201,146, 37, 8,
+ 11, 11, 67, 66, 66,130,211,113, 19,197,209, 7,159,191,219,136, 32,136,137,189,106,206,166,222,119,119,206, 17, 35, 70,160, 93,
+187,118,208,104, 52, 80,169, 84, 78,110, 95,156, 94,180,136, 83,111, 51, 12,179,218,165, 76,100, 50, 12,179,218,245,211,219,113,
+142,175,253, 39, 78,156,216, 51, 43, 43,107,122, 70, 70,198,119, 59,119,238, 92,234,141,207, 27,207,196,137, 19,211,178,178,178,
+166,187, 30,239,225, 58,222, 29,173,204,204, 76,198, 17, 73, 6, 64,114,143, 30, 61,246,109,218,180, 41, 60, 56, 56,216,121,240,
+249,243,231, 81, 83, 83,131,224,224, 96,205,204,153, 51, 53, 3, 7, 14, 68,116,116,180,243, 13, 32, 47, 47,239,134,212,212, 84,
+ 45, 0,119,223, 86, 96, 89, 22,125,250,244,193, 49, 71,107,199,176,204, 76, 36, 36, 36, 56, 59,121, 4, 5, 5,225,249,231,159,
+103,198,143, 31,207,137,110, 6, 33, 4, 6,131, 1,177,177,177, 10, 95,174, 14, 0,164, 25, 42,241,211,192,254, 96, 25, 64,127,
+112, 47,164, 50, 6,172,132, 65,119, 82,133, 95, 7,245, 7, 3,192,124,120, 23, 2,112, 97, 14, 2,184,173,101, 28, 14,130, 51,
+103,206, 4,228,104, 57,226,197, 92, 41,167,232,104,236,220,185, 19,118,187, 61, 80, 78,194,178, 44, 84, 42, 21, 98, 98, 98,160,
+ 80, 40,160, 84, 42,153,239,190,251,238,237,228,228,228,216,241,227,199,179, 90,173,150,237,211,167, 15,238,187,239, 62, 78,108,
+226, 76, 75, 75,243, 27,151,173, 91,183,226,139, 47,190,192, 83, 79, 61,229,209,209, 98, 24, 6,145,145,145,208,104, 52,184, 86,
+ 32, 0,176,216,172,208,215, 27,156, 77,186,118,187, 29, 71,182, 28,238,144,127, 56, 47,109,245,119,223,242, 0, 96,220,242,147,
+235,105,177,247,125,190, 44,117, 64, 24,191,103,235, 37,235, 30, 95,121,158,227, 56,140, 29, 59, 22, 89, 89, 89,120,244,209, 71,
+177,118,237, 90,188,243,206, 59,248,247,191,255,125,153,171,229,239,205,209,106,181,254,247,177,199, 30,123,106,197,138, 21, 29,
+223,120,227, 13, 86,116,180,148, 74, 37, 24,134,129,209,104,132,201,100,130,193, 96,192,169, 83,167,132, 39,159,124, 50,215,108,
+ 54,255,215,107,115, 37,163,248, 93, 41,215,175,109,155,192,182,211, 21,124, 20,220,247,230, 36, 3,163,232, 81,123,111,234, 16,
+ 50,124,108, 82, 24, 8, 1, 17, 0,129, 0, 38,147, 14,207, 63,255,162,228, 47,188, 85, 78,145,101, 52, 26,113,232,208, 33, 12,
+ 26, 52, 8, 69, 69, 69, 56,113,226, 4, 58,116,232,128, 69,139, 22, 69, 62,252,240,195, 57,229,229,229,253, 3,117,182,142, 28,
+ 57, 50,241,198, 27,111,252,180,190,190,190,186,190,190,254, 83, 0, 75, 1,212,156, 57,115,166,243,153, 51,103,230,174, 95,191,
+190,223,228,201,147, 37,110,125,116, 36,222,236, 81,171,213, 6,131,193,228, 83, 96,137,191, 9, 17, 2,138, 56,195, 48,164, 99,
+199,142,184,235,174,187,192,243, 60,148, 74, 37,212,106,117,163,102, 51,119,193,229,171,254, 0, 32, 48, 12,131,184,184, 56, 12,
+ 31, 62, 28, 82,169,180, 17,167,152, 15,135, 15, 31,142, 23,222,155,132,255,190,112, 43,190,120,172, 3,134,188, 95,230, 51,156,
+122,189,190,126,243,230,205,138, 87,159,122, 10, 55,182,111,143, 86, 26, 13,218, 68, 71, 66, 33,151, 65,234, 26, 38, 38, 32,147,
+157, 0, 16, 36, 18, 9,186,116,233,130,178,178, 50, 20, 20, 20,160,160,160, 0, 44,203,162,111,223,190, 78, 23,230,244,233,211,
+120,239,189,247, 96, 50,153, 2,142,123,251,246,237,113,235,173,183, 66, 38,147, 65,169, 84, 54,106, 50, 20,211,180,174,174, 14,
+237,218,181,195,202,149, 43,145,154,154,234,151,179, 83,167, 78, 24, 48, 96, 64,163,244, 84, 40, 20, 78, 81, 4, 0, 69,123,234,
+157,215,136,143,143,111, 18,231,134,189,231,241,229,198,205, 48,153, 5,104,245,214, 70, 39,196,182,210, 96,251,146, 55, 2,138,
+187,200,185, 96,193, 2,212,212,212, 56,141, 3,241,165, 92, 52, 81, 90,183,110,141,121,243, 60, 59,153,110, 90,196,211, 51, 47,
+ 51,192,231,173,120,156,152,185,228, 89, 89, 89,211,221,207,247,199,231,250,191,219,249,102, 55,113, 86,214,164,166, 67,185, 92,
+254,230,230,205,155,195,107,107,107,113,250,244,105,176, 44,235,108, 83,231, 56, 14, 22,139, 5,103,207,158, 69,120,120, 56,202,
+203,203, 33,151,203, 33,145, 72, 96, 54,155, 1,160,187,183, 7, 56, 33, 4, 47, 84, 52,116, 17, 90, 23, 39, 69, 33,128, 59, 43,
+ 26, 10,134,216, 33,254,135, 31,126,128, 90,173, 70,112,112,176,243,211, 95, 51,210,145,130, 51, 40,227, 25,176,187,182,129, 97,
+ 1,150, 1, 24, 9,192,178, 4, 44,195,128,221,149, 3,134, 1, 84, 17, 97, 77,173,128,253,117,140,247,217, 1,222,155,251,228,
+201,197,114,255,190,101,203, 22, 4,202,217,174, 93, 59,168,213,106,231,182,126,253,250, 70,142,150,221,110, 71, 68, 68, 68, 32,
+156,164,193,141, 16, 16, 21, 21, 5,158,231,153, 69,139, 22, 77, 76,249,127,246,174, 59, 60,138,106,125,191, 51,219,119,147,108,
+ 54, 61, 33, 33,148, 0, 82, 34, 77,225,194,165,151, 0, 66,104, 34, 69, 46, 4, 17, 81,138,168, 40, 17,129, 31, 42, 32,161, 73,
+147, 42,200, 37, 32, 72,151, 46, 69,164,131, 5, 20, 36,129, 64, 8, 9,164,111,234,246, 50,237,247, 71,118,227,102,179, 73, 54,
+ 33,194, 5,231,125,158,121,118,167,189,115,206,156, 51,103,222,243,157,239,124,211,176, 97,200,244,233,211, 73,129, 64,128,235,
+215,175, 35, 33, 33, 1,245,235,215,119,219,103,171,168,168, 40,235,147, 79, 62, 97, 62,249,164,100, 14, 69,100,100, 36,138,138,
+138,114,237,251, 53, 26, 77,126,159, 62,125,202,248,109,228,229,229, 61,219,158,240,182,251, 72, 91,105, 24, 76, 38,232,180,134,
+ 82,235, 80,110,102,142,234,227, 15, 63, 16, 45,155,250, 6, 0,224,195,149,107,160,221,248, 87, 67,118,224,195, 81,129, 67,191,
+220, 53, 19,192,224,202,248,117, 58, 29, 76, 38, 19, 34, 34, 34,112,249,242,101,104,181, 90,244,235,215, 15, 4, 65,148,206, 16,
+173, 6, 44, 25, 25, 25,157,162,163,163,127, 93,177, 98, 69, 68,243,230,205, 9,189, 94, 15,131,193, 0,199,223,155, 55,111,114,
+ 59,119,238, 76, 49, 24, 12,255,182,153,206, 93,226, 68,198, 55,201,125, 67,223,220,251,227,117, 65,116, 96,163, 36,101, 70, 97,
+ 4,157,159, 33,213,107,140,119, 76, 12,151, 0,142, 1, 24,176,224,104, 22,140,109,216,235,105, 65, 46,151,127,117,241,226, 69,
+ 63,147,201,132,107,215,174, 97,204,152, 49,150,188,188, 60, 9, 0,252,231, 63,255,177,108,223,190, 93,210,168, 81, 35,108,219,
+182, 45,224,213, 87, 95,221,163,215,235, 95,116,147,250,219,172,172,172,111,157, 55,250,249,249,173,126,248,240, 97,119, 71,159,
+ 31,154,166, 75,147,227,242,193,100, 1,138,162, 96, 52,154, 81, 92,172,133,197, 74,217,218, 76, 22, 12, 67,219,126, 89,208,182,
+118, 84, 34, 22,122,181,125, 49, 88,199,113, 28, 72,130, 40,186,246,103,118,221,202, 68,187,171, 33, 46, 55,173, 89,206, 96,236,
+179,204,252,252,252, 32, 18,137,240,237,183,223,226,198,165, 19,144, 8, 56, 48, 52, 5,154,178,130,161, 44, 16, 9, 4,248,241,
+250, 3, 68, 53,243,114, 75, 16,250,251,251, 99, 64,199,142,136,238,216,177,100,122,155, 80, 8, 79,169, 20, 10,177,172,196,146,
+ 5,128, 99, 72,119,131, 8,176,246,116, 6, 5, 5,225,183,223,126,195,180,105,211,176,120,241, 98,200,229,242,210,217,207,183,
+111,223,198,238,221,187, 17, 21, 21, 85,237,188,219, 45,120, 51,103,206, 68,102,102, 38, 86,174, 92,137,151, 94,122, 9, 34,145,
+ 8, 69, 69, 69,248,247,191,255,141,156,156, 28,183, 56, 29,135,247, 36, 18, 73, 25,235,147, 93, 0, 86,183,140, 28, 57,223, 24,
+ 18,130, 67,151,118,130, 0,129,171, 59, 62, 40, 35, 10,215,239,186, 80,109,206,185,115,231,150, 73,167, 59,214, 44,119,225,100,
+117,170,242, 56,130, 32,174,217,141,173, 51,103,206,156, 69, 16,196,145,153, 51,103,206,138,139,139,187,229, 14,159,171,253, 4,
+ 65, 28,181,137,176, 1, 14,219,174, 85, 75,104, 41, 20,138,246,158,158,158,184,119,239, 30,250,245,235,103,201,207,207, 79, 18,
+137, 68, 77,242,242,242,164,185,185,185, 48, 24, 12,186,249,243,231, 63, 0, 32,239,208,161, 67,163, 31,127,252, 17,143, 30, 61,
+194,246,237,219, 1,224,128,107,159, 13, 18, 44,203,150, 86, 10,231,110,155, 64, 32,192,149, 43, 87,112,229, 74, 89,215,175,205,
+155, 55, 87,249,194,120,245,251,195,184,126,253, 58, 28,195, 3,216,255, 59,110,147,201,100, 64,229, 51, 60,202,160, 42,199,248,
+170, 28,224, 93,193, 93,223, 47, 87, 51,115, 42, 66, 70, 70, 70,133,231, 95,185,114,165,140, 69,171, 42, 78,129, 64, 0,134, 97,
+ 32,151,203, 9,177, 88, 76,136,197,226, 48,187,200, 18, 8, 4,165, 15,140, 84, 42,133, 84, 42, 45,211, 75,173, 8,153,153,153,
+ 61, 50, 51, 51, 43,220,175, 86,171, 59,169,213,106, 60,143,176, 82, 20,140, 6, 11,180, 58, 35, 62,143,251,111,201,198,207,241,
+ 51,128,159, 59,189, 51, 13,147,251, 70,245,172,238, 48,181,253,126, 7, 6, 6,226,220,185,115, 32, 8, 2,123,246,236,129,183,
+183, 55,250,246,237, 11,165, 82,137,153, 51,103, 98,248,240,225,213,109,204,138,243,243,243, 59,189,255,254,251,191, 46, 93,186,
+ 52,188,110,221,186,176, 88, 44,176, 90,173,176, 88, 44, 72, 78, 78,198,206,157, 59, 31, 25, 12,134, 78, 0,138,171, 34, 59,145,
+241, 77,242,254,243, 31,102,246, 30,249,170,241,118,206, 15,200,206,206, 7, 77,103,128,101,104, 88,105,166,196,194, 71,211,160,
+105, 6, 98,177, 64,185,244,139, 15, 78,177,224, 64,146,132, 5,192, 43, 79,170,140, 84, 42, 85,164, 90,173,198,221,187,119, 17,
+ 19, 19,147,157,159,159,159, 8,160, 23, 0,228,231,231, 95, 28, 51,102, 76,243,248,248,248,224, 6, 13, 26,192,211,211, 83,169,
+215,235,171,162,244, 4, 48, 25, 64, 31,148,248,129,216, 81, 0, 96, 62, 73,146,210,107,215,174,149,155,105,119,254,252,121, 0,
+248,217,117, 15,200,102,209, 50,153,160,206, 47,196,132,119,230,252,213, 51, 2, 87, 70, 92,112,224, 48,233, 93,200, 0, 32, 47,
+ 39, 25,111, 76,152, 38,173,170, 67,224,234, 69, 88, 13, 31,157, 50, 29, 53,123, 29,245,244,244, 44, 25,126, 59,184, 19, 71,191,
+124, 7, 96,172,224, 40, 35, 96, 53, 0, 86, 29, 88,139, 1,132, 88, 14, 80, 70,183,132,150,167,167, 39, 60,229,114, 4,170, 84,
+224, 56, 14, 66,129, 0, 34,145, 16, 44, 5, 16, 12, 81, 42, 72, 89,247, 2,131,148,118, 42,229,114, 57, 82, 83, 83, 49,121,242,
+100, 88,173, 86, 12, 25, 50, 4, 22,139, 5, 38,147, 9, 70,163, 17, 13, 27, 54,132,193, 96,112,139,207, 62, 91,209,211,211, 19,
+ 98,177, 24, 31,124,240, 1, 94,126,249,101,204,155, 55, 15,177,177,177,104,216,176, 33, 38, 77,154,132,157, 59,119, 34, 50, 50,
+178, 42, 94,206,177,140,236,247,211, 46,182, 28,135,248, 0, 84,187,140,156, 57, 9,130, 44, 35,216,236,203,123, 99,123, 85,155,
+115,209,162, 69, 80,171,213,229, 44, 89,246,255,161,161,161, 88,183,110, 93, 77, 71,134,236,214,163, 32, 23,251, 6, 56, 91,162,
+ 56,142,107,103,243,157, 50,199,197,197,221,138,139,139,139, 38, 8,226, 72, 92, 92, 92,116, 69, 22, 45, 87, 60, 46,246,187,253,
+210, 18, 58,141,141,118,119,220,105,191,209,190,190,190,130,240,240,112, 82,169, 84,162,168,168, 8, 1, 1, 1,156, 90,173, 30,
+169, 80, 40, 62,251,238,187,239, 26,233,116, 58,220,190,125, 27,171, 87,175,254, 25,192,170,202,132,214,177, 0,155,233,216,102,
+201,114, 92, 31, 56,112, 32, 26, 52,104, 80,198,154, 37,151,203, 43,173, 60,246,125,118,139,144, 64, 32,192, 11, 47,188, 32, 79,
+ 73, 73, 49,138,197, 98,132,133,133,201,179,179,179,141, 98,177,184,218, 51, 93,170,114,140,175,202, 1,222,149,240,105,215,174,
+ 93, 25, 11,150,227,175,227,255, 67,135, 14, 85, 57,116,104,231,108,222,188,121,233,253,242,242,242,178,159, 11, 0,232,215,175,
+ 31, 88,150,133,191,191,191, 91,156,118, 81,107,115,128,135,201,100, 98,181, 90, 45,121,237,218, 53, 72, 36, 18,120,121,121,149,
+250,234,200,100,178, 82,107, 38, 15, 87, 13, 2, 11, 11, 69,193,104, 52, 66,167,211, 1, 0,146,255,220, 87, 86,136,153, 53, 53,
+230,183, 55,176, 5, 5, 5, 56,113,226, 4,126,248,225, 7,188,252,242,203, 46, 69,117, 53, 4,151,186,160,160,160,243,140, 25,
+ 51,174, 46, 88,176,160,142,175,175, 47,172, 86, 43, 30, 62,124,136, 45, 91,182,100, 26, 12,134,206,213,105, 96,192, 1, 20, 69,
+195,100, 48,163, 88,163,197,103, 95,108,173,176,234, 1, 64, 65,238, 29, 12, 28, 52, 92,242, 36,203, 41, 51, 51,115,122,231,206,
+157,191,208,106,181, 69, 6,131, 97, 56,128,101,142,253,169,252,252,252, 46,131, 6, 13, 90,225,235,235,251, 82,110,110,238, 44,
+ 55, 40,103,166,166,166,206,170, 87,175, 94,153,141,102,179, 25,245,234,213,123, 33, 55, 55,119,116,215,174, 93,255, 15,128,175,
+195,110, 47, 0, 39, 1,172,171,168, 46,217,135, 14,117, 58, 35,148,170, 16,100, 60, 56, 87,101, 66,196, 2, 19, 56,150,173,180,
+ 13,177,119,128, 43, 90,170,152, 25, 87, 46,169,246, 99,237, 47,236, 87,134,141,197, 43,147, 23, 65, 33, 2, 22,190,209, 9, 13,
+ 85, 0,228,190, 16,119,253, 24,132,202,118,143, 38, 31,118,139, 60,118,195, 6, 92,183,181,199, 97, 1, 1,152, 49,114, 36, 56,
+ 10,184,156,144,128, 93, 63,253,132,145, 61,122, 64, 33,147,185,221, 97, 97, 89, 22, 98,177, 24,201,201,201,184,124,249, 50,154,
+ 53,107,134,123,247,238,149, 9, 67,193,113,156,187,249, 47,205,187, 84, 42,133, 72, 36, 66,118,118, 54,162,163,163, 33, 22,139,
+177,117,235, 86,156, 59,119, 14, 51,102,204,192,248,241,227,209,189,123,119, 36, 38, 38,186,197,201,113, 92,185,217,138,206,195,
+185,213, 45, 35,103, 78,231,247,126, 77,202,221,206,185, 96,193, 2,151, 19, 42,220,225,116,165, 69, 92,148,221, 53, 71, 49,100,
+183, 60, 57, 10, 35,231,117, 0, 62,246,109, 51,103,206,156,229,238,121,142,235,118,139, 88,117,134, 48, 75,133, 86,116,116,116,
+153,156, 23, 20, 20, 92,189,122,245,106, 11, 15, 15, 15,220,185,115, 71,162, 84, 42, 91,216, 27,116,146, 36,177,103,207, 30,175,
+254,253,251,159, 90,182,108, 89, 24,203,178,200,201,201,193, 71, 31,125,164,163,105,122, 20, 0,186,162, 23,120, 85,150,169,195,
+135,203, 63,108, 7, 15, 30,116,107, 8,196, 46,164,132, 66, 33,124,124,124,140, 70,163, 17, 10,133, 2, 62, 62, 62, 70,131,193,
+ 0, 15, 15, 15,251, 88, 49,137,191,102, 42, 84,101,125,170,202, 49,222,217, 1,190, 74, 36, 36, 36,184,117,156,109,168,213,173,
+ 90,158,154,154, 90, 97, 67,114,238,220, 57,176,182,134,214, 93, 78, 91, 47,143,179, 11, 63,133, 66, 1, 95, 95, 95, 72,165, 82,
+200,229,242, 50, 34, 75, 42,149, 86,249,224, 84, 21,144, 84, 38,147,253,226,225,225,161,178,239, 23,137, 68,208,106,181, 69, 5,
+ 5, 5,237,159,233,161, 67,112,160,173, 52,140, 70, 19,116, 90, 99,173,243, 91, 44, 22, 72,165, 82,236,220,185, 19,157, 58,117,
+ 66,135, 14, 29,202,137,172, 26,154,231,211, 11, 10, 10,186,175, 90,181,234,231,229,203,151,251,232,116, 58,252,247,191,255, 45,
+214,233,116,221, 1,164, 87, 75,108,178, 28, 40,171, 21, 6,147, 25,122, 93,201, 61,184,127,107,223,255, 90, 81,237,204,206,206,
+222, 89,201,254,251, 52, 77, 71,219,227,190,185,129,127,213,171, 87, 15,217,217,217,101, 54,166,165,165,129, 97, 24, 51, 74,226,
+100,189,233,104, 72,198, 95,209,179, 43,234,197,151, 88, 71,141,102,232,116, 37, 86, 16,147, 62,175,118,234,169, 77,108, 84,228,
+147, 85,147, 58, 68, 16, 68,169,211,247,212,169, 83,113,243,198, 13,244,170,163, 65,195, 96, 47,112,154, 12,136,123,126,138, 63,
+212,114, 44, 91,113,172,218,220,187, 29, 92, 32,150,237,222,237,114,223,253,193,131,171,149,247,164,164, 36,200,229,114, 48, 12,
+ 83,238,125, 83,221,252, 59, 10,152, 21, 43, 86, 96,198,140, 25,216,186,117, 43,110,222,188,137,214,173, 91,163,119,239,222,200,
+205,205,197,141, 27, 55, 96, 54,155,221, 78,167,163,223, 92, 82, 74, 2, 78, 95, 62,142,180,244, 7,200,204,126, 84,227,114,119,
+228,116, 22, 90,251, 79,255,142, 97, 81,109,107,196,249,217,103,159, 33, 55, 55,183,140, 37,203,177, 93,170,200,162,229,172, 69,
+156,144,231,228, 11,101, 95,183, 56,137, 30,231,117,231,227, 1, 32, 23,128,160,138,243,156,215,243,226,226,226,206,218, 45, 97,
+ 54, 94, 65, 85,254, 89,101, 44, 90, 78, 88, 52,120,240,224, 65,171, 87,175, 14,144,201,100,165, 51,144,102,206,156,137, 25, 51,
+102, 32, 34, 34, 2,254,254,254,161, 42,149, 10,249,249,249, 88,188,120, 49, 82, 83, 83, 39,194, 69,160, 61,103,161,213, 37, 69,
+ 11,137,228,175, 14,171,221,178, 5, 0,227,199,143, 47,103,209,178, 23, 80,101,160, 40, 10,126,126,126, 48, 24, 12, 16, 8, 4,
+ 24, 50,100,136,224,207, 63,255,100,250,246,237,139,161, 67,135, 10,110,220,184,193, 12, 24, 48, 0, 2,129, 0, 61,123,246,212,
+236,223,191,255, 67, 0, 95,186, 33,182,106,205, 49,222, 94,201,220,141,125,228,142,184,172,140,147, 32, 8, 24, 12, 6, 8,133,
+194, 82, 71,121,119, 56,237, 67,135,142, 15, 32, 73,146, 80,169, 84,165,141,135,221,162,101, 23, 90, 85,241, 86, 21,144, 84,161,
+ 80, 40,239,220,185,211,200, 62,241, 34, 47, 47, 15, 61,123,246,188, 91, 80, 80,240,108,155,180, 88,192, 74, 51,208, 25, 77,208,
+ 25, 13,181, 70,107,127, 30, 54,110,220,136,196,196, 68,152, 76, 38,124,245,213, 87,165,147, 10, 28, 69,214, 99, 8,174,100,185,
+ 92,206,246,235,215, 15, 87,175, 94,133, 84, 42,165, 80,131,248, 87, 44,199,194, 74,211, 48, 25,141,208, 85, 61,228,246,188,160,
+ 84, 85, 39, 38, 38,194, 98,177, 96,222,188,121,204,175,191,254,122, 22, 37, 1, 80,237, 22,188,209,221,186,117,155,239,225,225,
+161, 58,122,244,232,123, 0,182, 86,246,242,166,104,155,104,175,197,251,232, 56, 34,224,202, 39,171, 38, 97, 86, 28, 95,172, 44,
+203, 98,226, 91,111,161,119, 29, 13,134,190, 20, 0,125,214, 93, 40,188, 3, 64,168,234, 99,217,138, 99,184,149,226,182, 43, 38,
+ 7, 0,253,186, 13, 70,171,102,229,195,131,117,238, 85,210, 39,187,248,227, 47,200,201,203,172,118,222,245,122,125,133,150,171,
+106, 88,180, 74,159, 57,251,253,107,211,166, 13,154, 52,105,130,179,103,207,162,109,219,182,184,119,239, 30,238,221,187,135,212,
+212, 84,220,188,121, 19,133,133,133,213, 46,163,239, 79,238, 66,161,182, 0, 18,177, 4, 5, 69,121, 72,203,120,128, 32,191,224,
+199, 46,119, 59,154, 14,248, 12, 0, 80, 39,192,187, 90, 66,203,145,115,201,146, 37,229,196,251,227,134,236, 33, 8,226,151,202,
+214,171,123,254,147, 68, 69, 66,235,129, 90,173,238, 48,114,228,200,153, 0,218,217,182, 21, 3,216,125,234,212,169,193,129,129,
+129, 61, 58,118,236, 40,148, 72, 36,184,124,249, 50,246,239,223,191, 21,192,174,202, 46, 36,145, 72,140,245,235,215,151,219, 43,
+162,253, 65, 84, 42,149,130,197,139, 23, 19,155, 55,111,174,208,202, 85, 85, 1, 21, 23, 23, 67,175,215,195,219,219, 27, 86,171,
+ 21,253,250,245, 99, 18, 19, 19, 33, 22,139, 49,104,208, 32, 38, 33, 33,161,180,160, 55,109,218, 20,102, 52, 26,255,253,195, 15,
+ 63,244, 1,208,181, 26,247,202,238, 24,239, 9, 55, 29,224, 43,234,229,185, 3,119,135,227, 42,226,156, 54,109, 90,141, 56,197,
+ 98, 49,109,143,252, 78,146, 36,172, 86, 43,218,182,109,139,220,220,220,210,135,198,195,195,163, 84,100,185, 35,180,170, 10, 72,
+ 42, 20, 10, 97,177, 88,208,181,107, 87, 16, 4,129, 53,107,214, 60, 31,195,145, 44, 75,120,122,250,161, 78,157, 23, 16, 16,104,
+ 2,203,214,238, 87,101, 98, 99, 99,203,136, 41, 87,145,151,237,247,191, 38,176,115,185, 51, 75,182,178,183,163,125,200, 75,175,
+ 55, 61,115, 69, 24, 24, 24,216, 33, 55, 55,247,160,211,230, 2, 0,243, 43,233, 88,150, 22,244,163, 71,143,208,183,111, 95, 28,
+ 63,126, 92,112,224,192,129, 94,135, 14, 29, 74,184,123,247,238,163,182,109,219,214,125,251,237,183,165, 93,187,118, 69, 94, 94,
+ 30, 94,122,233,165,207, 51, 50, 50, 42, 17, 90,182,251,104, 50, 67,175,175,125,235,168, 43,107,214,227,188, 24,237,117,114,238,
+220,255, 67,239,144, 34, 12,105,237,141,248, 35,151, 48,186,141, 28,176, 72,171,205,103, 79,139,111,157, 6,168, 31,217,161,220,
+126,169,178, 36,150,107,253,200, 14, 32, 31,221,171,118,222, 29,211,236, 44,170,106, 98,209,115,188,159, 19, 38, 76,192,199, 31,
+127,140, 62,125,250,224,222,189,123, 56,127,254, 60,238,221,187,135,105,211,166, 33, 50, 50, 18,173, 91,183,174, 22,231,161,211,
+123,161,209, 21,131, 36, 72, 20, 20,231,195,100, 54, 34,118,210,220,199, 46,247,210,151,255,233, 56, 0,192,190, 83,215,107,204,
+ 57,123,246,108,100,103,103,151,177,100, 61,142, 95,214,179,142,202,162,165, 61, 0, 48,209,121,163,197, 98,241,154, 55,111, 94,
+148,191,191, 63, 8,130,192,138, 21, 43,224,235,235,219, 9,192, 45,139,197,146,167,215,235,103, 56,136,144,222,176,197,218,200,
+201,201,113, 57,111, 95,175,215, 91,163,162,162, 68, 33, 33, 33,101,102, 27,122,120,120, 84,100,221, 41,229,180,239,163,105, 26,
+177,177,177, 88,184,112, 33,194,195,195, 49, 96,192, 0, 68, 71, 71,131, 32, 8,244,235,215, 15, 3, 6,252, 53,148,171, 82,169,
+196,199,143, 31,239, 70,146,100,130,195, 11,164, 12,167, 43,216, 29,227, 41,138,114,215, 1,190, 12,167,189,178, 77,155, 54, 13,
+ 11, 23, 46,196,172, 89,149,187,122,108,216,176, 1, 40,239, 79,245,183,115, 22, 20, 20,148,105,236, 21, 10,197,154,161, 67,135,
+ 10, 31, 61,122, 84, 70, 92, 57, 46, 46, 26,162, 50,156, 85, 5, 36, 21, 8, 4, 8, 10, 10,194,130, 5, 11,224,231,231,135,224,
+224, 96, 87,129,252,170, 44,163, 26,224,111,229,100, 56,246,218,210, 69,255,215,249,191,219, 15,137,164, 18,224,202,249,125,208,
+ 20,150, 29, 78, 50, 91,255,154, 74, 45,105,219, 11,150,235, 63,186, 85,151,236, 98,250,179,207, 62,195,103,159,125, 86,105,130,
+ 54,110,220,248,216,121,119, 83,108,149,231,100, 57, 66,225,225, 3,153, 71, 29,180,136,244, 1,203,209,255, 83,101, 84, 1,126,
+253,229,151, 95, 6,249,249,249, 33, 61, 61, 61, 64, 36, 18, 13, 42, 99,174, 50, 26, 81,191,126,253, 23,212,106,245,191,171,226,
+156, 54,109,154,121,206,156, 57,210, 81,163, 70, 97,232,208,161, 24, 53,106,148, 84, 44, 22, 55,230, 56, 14, 86,171, 21,233,233,
+233,248,241,199, 31,161, 86,171,111, 87,150, 78,150,227, 8,185, 66, 5,153, 71, 8, 90,188,168, 2,203,210,181,146,119, 71,171,
+184,163, 53,171,154, 34,203,101,253, 4,128, 95,127, 60,136,185, 31,188,136,173, 71,127,198,234, 95,128, 86,170, 92,180, 8, 80,
+131, 85,223,198, 71,163, 95,198,178, 29,191, 1, 0,206,159,171,178,140,184,202,234,160,201,104,125,172,188, 59, 90,174, 28,175,
+227,134,143, 86, 57, 78,123, 39, 81,171,213,162,168,168, 8,241,241,241,120,227,141, 55,144,155,155,139,212,212, 84,220,189,123,
+ 23,223,125,247, 29, 20, 10, 69,141,202,232,195,183,102, 99,206,178,233,224,192,161,105,163, 22,152, 57,249, 51,180,107,213,241,
+177,203,221, 25,110, 88,179, 42,228, 92,185,114,101, 77,235,210, 63, 78,104,185,132,191,191,255,168,110,221,186,193,100, 50, 33,
+ 32, 32, 0,169,169,169, 32, 73, 50, 2, 40, 25,194, 11, 13, 13,221,173, 86,171, 35,220,229, 19, 8, 4,160,105,186,212,247,199,
+190, 0,192,192,129, 3,113,248,240,225, 42,123, 20,193,193,193,168, 91,183, 46,222,127,255,253,114,179, 28, 28,103, 58,200,229,
+114, 28, 61,122, 52,187,160,160,160,128,227,184,106, 77,115,179, 59,198, 95,188,120,209,109, 7,120, 71, 88,173,214, 71,119,239,
+222, 13,217,184,113,163,160,146,151, 95, 41,206,159, 63, 79,163,138,161,154,191,131,211, 85,207,148,227,184, 10, 69,150, 59, 97,
+ 4,170, 10, 72, 42, 20, 10,145,148,148,132,185,115,231,130, 32, 8,236,219,183,239,185,120,184,254,188,147,191,153, 36, 73,159,
+129,175,116,110, 9,130,128,213, 82,126,164,218,179, 80, 87, 42,178,134,126,185, 11, 7, 62, 28,233,142,232, 73,190,112,225,130,
+239,198,141, 27,133,238,148,251,133, 11, 23,104,142,227,170, 61,236,103,127,225, 88,173, 86, 24,141, 53,179,162,112, 28,119, 57,
+238,139, 57, 81,219,190, 61, 38, 34, 8, 11,174,156,219,135,226, 34,215,238, 12, 18,145, 16,155,227,247,211, 98,145,224,209, 83,
+ 46,186,181, 67,134, 12, 25,245,213, 87, 95,181,112,181,211,141, 73, 48,169, 38,147, 9, 25, 25, 25, 48, 24, 12,123, 63,249,228,
+ 19,235,177, 99,199,222,124,245,213, 87,209,186,117,107,132,132,132, 32, 43, 43, 11,201,201,201,136,143,143,231, 46, 93,186,180,
+ 23,192,148, 42,238,227,193, 69, 95,204,137,137,223,113, 76, 66, 18, 86, 92, 57,191, 15,197, 78,162,189,188,117, 90,132,111,182,
+238,183,138,197,162, 59, 85, 89,139, 28,173, 89,181,249, 98, 28, 52,102, 50,134,174, 90,141,136,118,125,177,104,113,111,124,243,
+197,112, 44,239, 39,134,117,207,104,180,122,109, 27,118,206,235, 15, 0,168,243,141,155,214, 18,161, 24, 15, 93, 88,172,138,138,
+101, 54,113, 83, 61,171,169, 61,239,149, 89,174,170,107,209, 34, 73, 18, 13, 26, 52, 64, 68, 68, 4, 58,117,234,132,182,109,219,
+162, 71,143, 30,184,113,227, 6,110,220,184,129,105,211,166, 85, 38,178,170, 44,163,238,255,142,194,207, 93,238, 60,118,217, 56,
+151,123,109,192,157,186, 52,121,242,100, 0,248, 71, 89,183,170, 45,180, 52, 26,205, 13,150,101, 91,122,123,123,219, 45, 82,165,
+251,210,210,210,192,178,172,161,186, 5, 99,177, 88,236,193, 49,203,196,101,178, 59,199, 87,246,224,115, 28,199, 20, 20, 20,160,
+ 91,183,110,232,210,165, 75,233,240,137,227,226, 32, 76,112,224,192, 1,112, 28, 87,109, 39,107, 7,199,120, 29,170,233, 0, 15,
+ 0,185,185,185,125,187,118,237,122, 74, 40, 20,186,245, 21, 77,150,101, 83,115,114,114, 94,121,210,156,174,202,135,101,217, 10,
+ 69,150, 59, 13, 81, 85, 1, 73,133, 66, 33, 60, 60, 60,240,253,247,223,195,223,223,255,185,122,192,110, 36,170,151, 84,182,191,
+155,159,228, 28,128,128,161, 95,238,122,120, 46,223, 90,111,232,151,187,210, 14,124, 56, 50,188,178,115,178,179,179,251,140, 28,
+ 57,242,184,187,229, 78,211,244,131,236,236,236,106,135, 75,224, 56, 14,119,238,220, 97, 39, 76,152,144,167, 86,171,135,215, 36,
+255, 51,231,174, 94,190,240,243,169,126,253,162, 58,180, 3, 9, 88, 42,118,254,229, 8,128, 19,138, 4,143,102,204, 90,249,214,
+240,225,195,159,102,177,105,178,179,179, 59, 13, 27, 54,108, 10,254,114,157, 40, 35,164, 80,193,236,106, 27, 86,213,173, 91,247,
+ 69,129, 64, 32, 5, 48, 23, 64,218,165, 75,151,214, 94,186,116,169, 15,128,127, 9, 4,130, 16,134, 97, 50,108,157,158, 93, 0,
+254,168,186, 30,229,190, 13,142, 13,235,215,251, 95,125, 65, 16,156,197, 98,174,162,131, 4, 14, 28,199,137,197,162, 59,191,222,
+200,106, 85, 89, 71,202,225, 11, 28,181, 62,100, 63,101,202, 20, 76,153, 50,165,180, 62,173, 89,211, 5,123,255,188,136,215, 90,
+165,195,252,117,103, 16,202,112,183, 59,124, 0, 48,251,255, 38,212, 90,218, 28,243,238,104,209,114,245, 28, 84,199, 71, 75, 32,
+ 16, 32, 47, 47, 15, 73, 73, 73,200,201,201,129,193, 96, 64, 98, 98, 34,172, 86, 43, 10, 11, 11,241,226,139, 47,214, 56,157,181,
+ 85, 70, 79,147,243,159, 56,124, 88,109,161,101,181, 90, 63,109,208,160,129, 72, 38,147,181, 96, 24, 6, 28,199,129, 97, 24,206,
+ 38,106,170, 61, 11, 79, 36, 18,153,154, 52,105, 66,184,154,157, 96,255,239,225,225, 97,172,196, 90, 18, 87,191,126,253, 79, 8,
+130, 16, 84,212, 11,177,255,103, 89,150, 17, 10,133,113, 53,188, 87,143,235, 24,175, 87,171,213, 29,107,185,252,254, 14, 78,231,
+242,209, 55,107,214,172,244,139,246,206, 49, 81,108, 31, 91,213, 87, 33,206, 43, 13, 72,170,215,235,179,250,246,237,203, 56,238,
+119, 12,104,250, 92,131,224,210,250,143,122,179,222,185,124,107, 61, 0,176,139, 45,112, 92, 90, 37,103, 25,179,179,179,187,253,
+221, 73, 75, 73, 73,177,252,235, 95,255,250, 86,171,213, 78, 6, 80, 99,111,254, 89,159,174,153,245, 12,150,140, 6,192,194, 26,
+158,155,150,159,159,223,211,105,219, 31,118, 65,101,143,107, 87,109,209,126, 59,175,214, 99,139,209, 52,157, 30, 17, 17, 81, 45,
+203, 13, 69, 81,233, 85,237,119,142, 17,230,136, 91,240,198,172,171, 64,201,228,239,124,183, 56, 77, 38, 83, 65,199,142, 29, 69,
+213,204, 91,174,187,121, 15, 9, 9, 65,157, 58,117, 74,127,237,112,222, 94, 85, 58,105,154, 78, 15, 11, 11,131,191,191,127,133,
+ 17,223,157,125,178,220,225,172,237, 50,170,140,179, 78,157,109,181,206, 89,211,116,242,112, 15,189,121, 78,158,147,231,124,102,
+ 57, 5,252,253,228, 57,121, 78,158,243, 9,114, 62,151,224,189,212,120,240,224, 81, 17, 24,254, 22,240,224,193,131,199,227,129,
+168, 68,149, 86,103,166, 79, 77,148,237,105,158,147,231,228, 57,121, 78,158,147,231,228, 57,255,113,156, 85,113,215,246, 76,227,
+231, 26,188, 89,149,231,228, 57,121, 78,158,147,231,228, 57,121,206,127, 44,248,161, 67, 30, 60,120,240,224,193,131, 7, 15, 94,
+104,241,224,193,131, 7, 15, 30, 60,120,240, 66,139, 7, 15, 30, 60,120,240,224,193,131, 7, 47,180,120,240,224,193,131, 7, 15,
+ 30, 60,120,161,197,131, 7, 15, 30, 60,120,240,224,193,131, 7, 15, 30, 60,120,240,224,193,131, 71, 9, 8, 0, 56,114,228, 72,
+233, 7, 1,163,163,163, 9,254,182,240,224,193,131, 7, 15, 30, 60,158, 36,158,107, 45,226,152, 57, 30, 60,120,240,224,193,131,
+ 7, 15, 94,139,212, 14, 72, 94,108,241,224,193,131, 7, 15, 30, 60,120,177,197,103,140, 7, 15, 30, 60,120,240,224,193,139,172,
+103, 10,101, 44, 90,188,224,226,193,131, 7, 15, 30, 60,120, 60, 77,177,245,140,106, 17,206,182, 56,174,243,224,193,131, 7, 15,
+ 30, 60,120,240,120, 76,129, 85,217, 47, 15, 30, 60,120,240,224,193,131, 7,143, 90, 18, 92,246,255, 79, 76,104,241, 95, 54,231,
+ 57,121, 78,158,147,231,228, 57,121, 78,158,243, 31, 11, 33,127, 11,120,240,224,193,131, 7, 15, 30, 60, 30, 27,142, 86, 44,130,
+ 23, 90, 60,120,240,224,193,131, 7, 15, 30,181, 39,178, 8, 87,235,252,183, 14,121,240,224,193,131, 7, 15, 30, 60,254, 38,240,
+ 22, 45, 30, 60,120,240,224,193,131, 7,143,199, 3, 1,126,232,144, 7, 15, 30, 60,120,240,224,193,227,111, 21, 91, 46, 55, 86,
+ 52,115,224,116, 53,200,107, 50,251,224, 52,207,201,115,242,156, 60, 39,207,201,115,242,156,255, 56,206,170,184, 79,227,217, 67,
+ 55, 0,103, 1,116,183,253, 86, 40,188,106, 27,252,212, 87,158,147,231,228, 57,121, 78,158,147,231,228, 57,159,119, 84, 24,168,
+148,119,134,231, 81, 21,132,168,124,136,185,170,253, 60,120,240,224,193,131,199, 63, 77,108, 17,225, 72,218, 0, 0, 32, 0, 73,
+ 68, 65, 84,113,142, 47, 73, 87,104, 12, 96, 22, 0,111,135,109,191, 0,136,115, 58,110, 7, 0,133,195,186, 30,192, 60, 0,247,
+170, 76, 13,199,137,109,252, 82,219,194, 2, 48, 1, 48, 3,208, 18, 4, 65,241,101,246,212,209, 17, 64,180,237,255, 17, 0, 87,
+170,185,255,185, 66, 72, 72,136,220,199,199,167,207,245,235,215, 37,137,137,137,184,112,225, 2,183,121,243,102,107, 97, 97,225,
+201,172,172, 44, 35, 95, 93,158, 11,244, 5, 48,211,246,127, 17,128, 19,143,201, 71, 40, 20,138,105, 30, 30, 30,253,165, 82,105,
+ 29,154,166, 9,131,193,144,169,215,235, 79,209, 52,253,165,173,221,171, 46, 6,251,250,250,190,217,180,105,211,198,169,169,169,
+ 25,153,153,153, 59, 0,236, 1, 48,188, 78,157, 58,163,235,215,175, 31,122,231,206,157,123, 5, 5, 5,223, 0, 56,248, 20,211,
+201,131,199, 63, 9, 68,101,214, 8, 87,152,203,113,220,232, 50, 12, 68,121,142,158, 61,123, 14, 58,121,242,164,130,101, 89,216,
+ 23,185, 92, 78, 3, 24, 87,133,200,242,187,124,249,114,189,201,147, 39, 15,205,204,204,124, 89,171,213,182, 7, 0,133, 66,241,
+115, 96, 96,224,175,171, 86,173,250,142,227,184,116,130, 32,180,213,204,168, 80, 36, 18,189,225,227,227,211,159,166,233,182, 28,
+199, 65, 36, 18, 93, 47, 44, 44, 60, 65, 81,212, 55, 0,106, 34,222, 36, 66,161,112,138, 84, 42,237, 75,211,116, 75, 0, 16, 10,
+133, 55,205,102,243, 9,154,166,215, 2,176,212,128, 83, 38,145, 72,166, 40,149,202, 40,139,197,210, 18, 0, 36, 18,201, 77,141,
+ 70,115,202, 98,177,172,181, 9,206,167, 13, 33,128,104,142,227, 68, 0, 32, 16, 8, 6,183,111,223,190, 30, 65, 16, 44, 65, 16,
+ 28,199,113,196,207, 63,255,220,134, 97, 24,210, 86, 63,162, 1,252, 10,128,126, 22,159, 16,127,127,255,133, 44,203,214,169,180,
+208,100,178,151,175, 95,191,222,116,247,238,221,204,215, 95,127, 93, 52,126,252,120,207,201,147, 39, 11,215,172, 89,179, 54, 43,
+ 43,235, 61,231,227,253,252,252,150,147, 36,233,239,206,245, 89,150,205,203,207,207,159,254,180,242, 31, 19, 99, 42, 99,238,142,
+143,151, 53, 2,144, 94,195,250,253,247,113,154, 98, 56, 0,136,151,197, 55,138, 49,197, 36,219,255, 63, 46,175, 3,102,174, 59,
+173,237,202,113,192,148, 40, 47,242,113,133, 86,104,104,104,124, 76, 76,204,168,150, 45, 91, 10, 57,142, 3, 69, 81, 48,155,205,
+ 77,175, 92,185,210,125,223,190,125, 47,107,181,218,225,213,164,124,235,227,143, 63, 94, 48,127,254,124,127,145, 72, 68, 80, 20,
+213,104,247,238,221,109,223,126,251,237,247, 55,110,220, 88,119,196,136, 17, 94,246,237,115,231,206,109,183,104,209,162,134, 0,
+190,124, 10,233,228,193,227,159,134,110, 40,235,163,245, 57,128,207, 42, 19, 90, 30,182,151,103,142,205,146, 5,135,223, 82,156,
+ 57,115,230,144, 80, 40,180, 91,180,218,235,245,250, 32, 39, 43,152, 43,145, 85,127,204,152, 49, 29,247,238,221,187,112,196,136,
+ 17,217, 10,133,162,201,171,175,190,170, 37, 8, 66,176,123,247,238, 54, 17, 17, 17,242,129, 3, 7,142,233,217,179,231,135, 28,
+199, 93, 32, 8, 66,237,102, 38, 91,248,250,250,238, 95,178,100, 73,189,190,125,251,138,253,253,253,193,113, 28, 50, 51, 51, 67,
+143, 30, 61,218,239,243,207, 63,255,176,160,160, 96, 8,128,132,106,220,184,118,114,185,124,239,231,159,127, 30,210,175, 95, 63,
+ 97,112,112, 48, 76, 38, 19, 18, 19, 19,123,159, 56,113,162,235,198,141, 27,223, 51, 26,141,175,217, 4,134,187,104,239,237,237,
+189,239,191, 31,127, 28,212,225,141, 55,132,190,190,190,224, 56, 14,106,181,186,247,197,109,219,186, 79, 90,178,228,189,226,226,
+226, 97,174,238,247,211,132, 68, 34, 33,183,111,223,222, 90, 34,145, 0, 0, 44, 22, 11, 34, 35, 35,137,231,229, 9, 33, 8, 34,
+ 44, 51, 51,211, 91, 44, 22,187,220,207, 48, 12,186,118,237,218, 64, 44, 22,227,203, 47,191,164,242,242,242,218,124,245,213, 87,
+215,119,238,220,233,191,118,237,218,215, 0,148, 19, 90, 36, 73,250,167,167,167,187,228,100, 24, 6, 86,171, 21, 52, 77,195, 98,
+177,160,121,243,230, 79, 53,255,241,241,178, 48, 0,211, 99, 98, 76, 31,216, 54,125, 9,224, 67, 0, 41,168,225, 55,187,254, 6,
+ 78,199,250,182,220,225,255, 99,167,213, 1,245, 0,224,216, 13, 19, 0,248, 62,238,125,245,240,240,104,246,250,235,175, 11,213,
+106, 53, 68, 34, 17,172, 86, 43,178,179,179, 17, 25, 25, 41,248,246,219,111, 95,168, 46, 95,163, 70,141,198, 47, 90,180, 40,224,
+216,177, 99,214,237,219,183, 91,162,162,162, 68,227,199,143, 87,118,237,218,181,121, 88, 88, 24,185,101,203, 22,243,169, 83,167,
+168, 49, 99,198, 72,226,226,226, 2,142, 30, 61, 58, 48, 33, 33,225,203, 39,157, 78, 30, 60,254,129, 56,139,191, 66, 60,216,127,
+ 43, 21, 90,112, 16, 87,131, 1, 64, 36, 18,181, 9, 10, 10,138,167,105, 58,216,102,213,201,206,201,201,249,146,162,168,223,109,
+199, 30,100, 89,118, 80, 85,150,172, 49, 99,198,116, 60,126,252,248,178, 43, 87,174, 20,231,231,231, 7, 31, 58,116,200,244,225,
+135, 31,166, 2, 64, 74, 74, 74,195,129, 3, 7,134, 78,157, 58, 53,189, 79,159, 62,171,122,244,232,241, 46,199,113,167, 8,130,
+208, 87, 37,178, 34, 35, 35, 47,159, 63,127,222, 75,165, 82,149,217, 81,191,126,125,188,251,238,187,226, 65,131, 6, 69,244,234,
+213,235, 82,114,114,114, 23, 0,127,186, 35,136, 26, 55,110,124,250,204,153, 51,158, 62, 62, 62, 40, 42, 42, 66,118,118, 54, 12,
+ 6, 3,148, 74, 37, 70,140, 24, 33,238,214,185, 83,221,169,211,222, 59,157,158,145,209,219, 77,177,213,190, 83,139, 22,167,119,
+198,197,121, 82, 15, 31, 66, 46,151, 67,167,211, 1, 0,188,188,188,240,114,131, 6,194,223,182,109, 11, 29, 29, 27,123,250,215,
+164,164,222, 79, 73,108, 73,109,191,102, 0, 71, 4, 2,193, 96,137, 68, 66, 14, 30, 60, 24,167, 79,159, 38, 76, 38,147,208,102,
+221,161, 7, 15, 30, 12,185, 92, 14,139,197,194,162,100,232,144,126,150,159, 18,137, 68,130,228,228,228, 50,219,180, 90, 45,212,
+106, 53,242,243,243, 97, 54,155, 81, 84, 84, 4,150,101, 9,185, 92,174,102, 89, 22, 36, 73, 58, 11,128, 50, 16,139,197, 72, 74,
+ 74, 42,179,141,166,105,232,245,122,152,205,102, 88,173, 86,104,181, 90,185,151,151, 87, 99,127,127,255,116, 0, 7, 11, 10, 10,
+190,204,201,201, 73,123,194,217,207,179, 11,162,248,120,217,125, 0,146,255, 69, 78, 7, 75, 86,168,109,253,143, 90, 74,171, 29,
+ 15,143,252,110, 10,183, 89,199, 30,212, 2, 31, 11, 0, 23, 46, 92, 64, 78, 78, 14,242,242,242,160, 86,171, 17, 22, 22, 6,142,
+227,170, 61, 28,151,156,156,188,238,197, 23, 95, 36,110,221,186,117, 2,192,154,221,187,119,143, 43, 40, 40,152, 57, 99,198, 12,
+223,165, 75,151, 22,196,198,198, 46, 2,176,117,247,238,221,239, 52,107,214,172,255,237,219,183, 55, 62,141,116,242,224, 81,219,
+224, 56,174, 29,128, 0,123,219, 98,107,119,253, 28,214,111, 16, 4, 97,113, 56,206, 98,107, 27,156,127,237,176,175,171, 9,130,
+248,213,225, 60, 53, 65, 16,191,214, 52,153, 78,191, 37,157,110, 0, 56,114,228, 8,103, 95, 92,157, 25, 24, 24, 56,173,103,207,
+158,203,174, 93,187,214, 60, 43, 43,203, 39, 43, 43,203,231,218,181,107,205,123,246,236,185, 44, 48, 48,112,154,195,141,112, 62,
+245,180,195, 62,241,229,203,151,235,237,223,191,127,209,233,211,167,139,219,180,105, 99, 57,115,230, 12,221,167, 79,159, 92,219,
+ 11,154,238,211,167, 79,238, 79, 63,253,196,116,232,208, 65,126,252,248,241, 71,151, 46, 93, 90,190,119,239,222, 32,142,227, 4,
+174, 56,109, 16,169, 84,170,239,207,157, 59, 87, 78,100, 57,162,110,221,186, 56,114,228,136, 82,165, 82, 29, 4, 32,174, 40,157,
+ 54,200,100, 50,217,190,159,126,250,201,211,203,203, 11,185,185,185, 16,137, 68, 8, 12, 12, 68,113,113, 49,178,179,178,144,118,
+247, 46, 72,139, 5, 43,190,152,239, 37,151,203,247,186,104,236,203,113,122,123,123,239,219,185,112,161,103,254,233,211,248, 99,
+193, 2, 88,173,214,210, 33, 87,171,213,138, 75,147, 39, 67,253,227,143,216, 50,119,174,167,183,183,247, 62, 0,178, 42, 56,107,
+ 3,142,156,147, 1, 20,216,150,201, 0,174, 68, 70, 70, 94, 75, 76, 76, 68,151, 46, 93,176,103,207,158, 86, 51,102,204,152, 60,
+ 99,198,140,201,123,246,236,105,213,165, 75, 23, 36, 38, 38, 34, 50, 50,242, 26,202,250,103,253,221,233,252,219, 56, 25,134, 41,
+179,176,236, 95,239,152, 58,117,234,228,238,223,191, 31, 35, 70,140, 32, 37, 18, 73,214,200,145, 35,165, 23, 47, 94,228,108, 34,
+211,237,116,154, 76, 38, 24,141, 70,232,245,122,164,164,164,200,151, 44, 89,210,249,179,207, 62,107,116,250,244,233,208, 89,179,
+102, 77, 10, 8, 8,184, 30, 20, 20, 84,239, 9,231,221,234,244,127, 5,128,140,106, 90,136,254,110, 78,206,118, 62, 98, 76, 49,
+173, 29, 26,216,234,242, 86,118, 63,179,109,105,213, 3, 72,123,156,186,212,179,103,207, 23, 27, 53,106, 20,180,251,150, 15, 10,
+197, 77,193,138, 85, 96,197, 42, 48,126,237,144, 44,121, 5,225,225,225, 65,158,158,158, 29,171,153,206,237,183,110,221,250,151,
+173,167,156, 15, 96, 89,108,108,236,231, 4, 65, 92,136,141,141,157, 15, 96,153,109,251,130,219,183,111,119, 0,176,243, 41,165,
+243,153,120,222,121,206,255, 45,206, 42,180, 72, 0, 65, 16, 71, 8,130, 56,242,201, 39,159,244, 0,224,231,180,254,111,199,227,
+ 0, 72, 92,253,218, 23,135,237, 1, 28,199, 13,112, 56, 47,160,134,201, 39, 92, 44,127, 9, 45, 0,136,142,142, 38,162,163,163,
+237, 59,126, 33, 8,226, 16,128, 95, 68, 34, 81,155,214,173, 91, 15,254,225,135, 31,188, 2, 2,254,186,126, 64, 64, 0,246,238,
+221,235,213,162, 69,139,193, 34,145,168, 13,128, 95,148, 74,229,161, 74,172, 48,170,201,147, 39, 15, 29, 59,118,172,166, 77,155,
+ 54, 0, 80,148,144,144,160,232,208,161,131,158,166,105,130,166,105,162, 67,135, 14,250,132,132, 4, 5, 69, 81,218,118,237,218,
+121,244,234,213, 43,117,250,244,233, 99, 92, 8, 14, 71,188,190,120,241,226, 48, 31, 31,159,202,148, 48,180, 90, 45,130,130,130,
+ 48,121,242,228, 96,145, 72,244,102,101,119, 75, 40, 20, 78, 89,188,120,113,160, 74,165, 66, 97, 97, 33,194,194,194, 96,177, 88,
+144,148,148, 4,147, 94, 7, 74,171, 1,165, 41,130,250,254, 61,168, 68, 66,140, 25, 20, 29, 36, 20, 10,167, 84, 97, 45,153,242,
+ 77,108,108,144, 37, 53, 21, 41,123,246,128,161,203, 27,127,104,171, 21, 55, 55,109,130, 41, 61, 29,139, 38, 76, 8,146, 72, 36,
+ 83,158,176, 37,107, 41,199,113,114,142,227,228, 4, 65,172,234,216,177,227,183,114,185,124,114, 92, 92, 92,223,147, 39, 79,246,
+ 59,127,254,124,119,154,166, 69, 52, 77,139, 46, 92,184,208,197,100, 50, 9,165, 82, 41,132, 66, 33,135,231, 20, 34,145, 8, 98,
+177, 24,114,185, 28,157, 59,119,190,191,121,243,102, 42, 44, 44, 76,180,111,223, 62,159, 58,117,234,120,172, 89,179,166, 72,171,
+213, 46,118,151,207,106,181,194,108, 54,195,104, 52,194,100, 50,225,204,153, 51, 13,166, 78,157, 42, 52,153, 76,204,192,129, 3,
+ 11, 40,138, 50,199,198,198, 42,125,125,125, 63,124,146,249,140,137, 49,177, 54,203,211,109,155,104,121,128,199,244,121,250, 59,
+ 56, 1, 88,108, 62, 89,118,248,219,184, 45,181,116, 43,104, 0, 58,155,208, 50, 59, 61, 31, 45, 29, 44,190, 85,162,168,168,104,
+227, 55,223,124, 19, 70, 74, 85,184,104,233,143,239,216,207,113,210,123, 13,114,235,125,132,192,176, 70, 24, 53,106, 84, 32,199,
+113,107,106, 33,205, 95, 1,232, 10, 96, 85, 77, 78,126, 2,233,172,231,225,225,177,199,203,203,235,162,135,135,199, 30,216,134,
+103, 31, 7, 81,141,208,123, 80, 51, 50, 61, 42, 2,220,160,102,100,122, 84, 35, 62,212,192,243, 2, 39, 45,226, 8, 53,199,113,
+209, 28,199, 69, 47, 90,180,104,161,195,251,221,190, 46,119,211, 50, 22,205,113, 92,116, 25,133, 84, 34,176, 30,219,232,230, 98,
+ 41,209, 20,142, 74,210, 33,115,165,179, 11,131,130,130,226,227,227,227,189,156, 25,179,178,178,160,209,104, 48,103,206, 28,175,
+177, 99,199,190,151,158,158, 30, 83, 69, 34, 36,217,217,217,109, 71,143, 30, 45,179, 90,173,133, 44,203,146, 26,141, 70,232,237,
+237,205,216, 15,240,246,246,102,138,139,139, 69,122,189, 94,192, 48,140,121,236,216,177,146, 9, 19, 38,188, 12, 64, 80, 17,105,
+ 64, 64, 64, 84,255,254,253, 43, 28, 58,160, 40, 10,122,189, 30,122,189, 30, 86,171, 21,157, 59,119,150,110,222,188,185, 79,110,
+110,238,250, 10, 21,135, 84, 26, 21, 21, 21, 37, 42, 40, 40,128,183,183, 55,210,210,210,240,224,193, 3,152,117, 58, 88,117, 26,
+ 88,117, 90,208, 90, 13, 56, 77, 49,242,239,221, 65,135,102, 77,197, 59,164,210,190,122,189,126,121, 69,156, 74,165, 50,170,195,
+184,113, 66, 15, 15, 15,116, 31, 93, 50,207,224,120,179,102,224, 24, 6, 44,195,128,161,105,244, 77, 74, 2, 69, 81, 32, 73, 18,
+237, 10, 10,132,202,109,219,162,212,106,245,178,167, 81,217,165, 82,169,112,251,246,237,175, 75, 36, 18,112, 28, 71, 88, 44, 22,
+156, 60,121,242, 31,247,208, 75, 36, 18,200,100, 50, 88,173, 86,212,175, 95,223, 56,122,244,232,203, 95,124,241, 69, 56, 73,146,
+ 30, 98,177,248,135,252,252,252,133, 89, 89, 89, 41,238,242, 81, 20, 5,139,197, 2,139,197, 2,163,209,136,251,247,239, 7, 55,
+104,208,128,152, 60,121, 50, 99, 48, 24, 26,174, 94,189, 58,249,228,201,147,138,197,139, 23,191, 10,224,221, 39,157,223,152, 24,
+ 83, 51, 0,205,226,227,101, 98,155,229,215,242, 63,198,201,161,196,241, 29,241,178,248, 68, 0,234, 90, 20, 89, 18, 0,222,225,
+126, 66,189, 72, 0, 29, 0, 47,155, 40,120,149, 32,136, 14,205,155, 55,247, 73, 76, 76, 44,228, 56,238, 42,128,239, 0,100, 85,
+ 70,198,178, 44,193,178, 44,222,110, 95,132,201, 29, 5,160,168, 98, 20, 23, 23, 35, 45, 45, 13, 9, 9, 9,248,249,231,132,154,
+ 62,155,111,122,122,122,246,145,201,100,245,105,154, 38,117, 58, 93,154,193, 96, 56,205,178,236, 70,212,192, 71,237,239, 74,167,
+ 29, 30, 30, 30, 75,102,205,154,213,201,219,219, 27,191,255,254,123,195, 93,187,118, 45,209,235,245,143,229, 92, 47, 19,145, 91,
+150,175, 92, 19, 26, 26,168,194,141,243,135, 67, 23,110,216,189, 5, 96,195,120,153,242,236,195, 73,139, 56,138,161, 95, 57,142,
+ 27, 64, 16,196, 17,103,161, 84, 45,179,211, 99,158, 95,133, 69,203,249,195,210,101,133, 86, 5, 10, 18, 52, 77, 7, 59, 90,178,
+ 56,142, 67, 86, 86, 22, 50, 50, 50,160, 86,171,225,227,227, 3,171,213, 26,236, 78,251,160,213,106,219,251,249,249, 25, 68, 34,
+145,217,104, 52, 66,161, 80,176, 34,145,136,179, 93,135,176,205, 90,100,204,102, 51, 33, 20, 10, 41, 47, 47, 47, 79,179,217,220,
+ 20,149,248,146,113, 28,215,222,207,207,207,229, 62,179,217, 12,157, 78, 7,189, 94, 15,157, 78, 7,179,217,140,160,160, 32,208,
+ 52,221,182,210, 46, 45, 77,183, 12, 8, 8, 64,102,102, 38,228,114, 57,210,211,211, 97,209,105, 97,213,106, 65,235, 53, 96,138,
+139,193,106, 52, 96,245, 26, 80, 22, 3, 66,155, 52,131,125, 70, 98,133,221,112,139,165,165,159,159, 31,244,250,191,220,205, 56,
+155,192,162,105, 26,180,205, 57,218, 62,156,232,239,239, 15,251,140,196, 39, 4, 51,128, 25, 36, 73,174,146, 74,165,194, 73,147,
+ 38, 33, 43, 43,171, 76,157,152, 52,105, 82,169, 79, 86,215,174, 93, 47,200,100, 50, 90,173, 86,195,108, 54,139,158,215,135,158,
+ 32, 8, 16, 4, 81, 82, 70, 52, 13,127,127,127,125, 94, 94,222,207, 69, 69, 69,175,215,132,143,162, 40,251,140, 46, 24,141, 70,
+112, 28,135,223,127,255, 29, 50,153, 76,196, 48,204, 45,154,166, 21, 34,145, 8,164,205,249,235, 73,193, 54, 35,240, 75, 0, 97,
+ 54, 11,209,155, 40,113, 56,207,112,209,144,184,117,235,220,228,172,190,112, 51,197,216, 45, 77, 25,168,217,112,164, 43,116,111,
+170,146, 44,143,235, 16,168,106, 61,208, 67,175,144, 8,244,108, 90,235,250,255, 93,154,176,107,236,152, 55,189,230,205,155, 87,
+207,223,223, 95,150,156,156,108,154, 63,127,126,131,237,219,183, 19, 40, 25,166,171, 16, 15, 31, 62, 60, 48,107,214, 44,223,254,
+253,251, 55,148, 74,165, 68,113,113, 49,212,106, 53,114,114,114,240,224,193, 3,238,198,141, 27,247,205,102,243,158,234, 36, 50,
+ 36, 36,100,243,235,175,191, 62,246,165,151, 94, 18,217, 45,164,122,189,190,205,185,115,231, 6, 29, 63,126,188,139, 94,175,175,
+118,189,124,244,232,209,158,217,179,103,123,188,242,202, 43, 77,165, 82, 41, 89, 27,233,116, 4, 73,146, 65,158,158,158, 56,125,
+250, 52, 84, 42, 21, 72,146, 12,122,220,250,106,178,178,161,117,130,253, 96,186,180, 28, 77, 3,234,193,100,101, 67,121,137,242,
+252, 88,180, 42,120,215,183,179, 91,164,170, 16, 75,198,153, 51,103,206, 34, 8,226,200,204,153, 51,103,185,178,104,217,254, 50,
+142,199, 57, 28,111,174,109,177, 85,173, 64,147, 44,203, 34, 35, 35, 3,153,153,153,200,200,200, 64,126,126, 62, 72,146, 4,199,
+113,238,204, 62,227, 8,130, 96, 79,157, 58,229,115,249,242,101,125,187,118,237,138,236,254, 47, 52, 77, 19, 20, 69, 17, 54,191,
+ 24, 34, 45, 45, 77,124,241,226, 69,213,237,219,183,131,108,189, 85,182, 10, 83, 96,185,109,118,129,229,184,152, 76, 38,200,100,
+ 50,247, 84,135,237, 69,248,251,181,107, 37, 34, 75,167,181, 13, 25, 22,131,209, 20,131,211,107, 33, 97, 40, 72,192,129, 48, 25,
+220,190,127,142,176,139, 44,171, 77,104, 89, 44, 22, 80, 20, 5,150,101, 65,211, 79,197,175,124, 93,171, 86,173,218, 30, 56,112,
+ 96,124, 70, 70,249,119,225,144, 33, 67,240,238,187,239, 98,234,212,169,183, 7, 12, 24,112,227,240,225,195,152, 50,101, 10, 88,
+150,109, 13,160, 24,192,241,231,237,161, 55,155,205,165, 22, 40,147,201, 4,171,213, 10, 84,227,179, 10,206,117,211, 94,182, 52,
+ 77,219,185,137, 3, 7,246,227,194,133, 11,100, 66,194,173,176, 73,147, 38,219, 29,238,159,116, 86,211, 81, 50,115, 79, 98,107,
+ 40, 44, 40,241,127,170, 40,164, 66, 4, 42, 31,178,227, 42,227,124, 28,180,218,208,106,196, 7, 31,124, 16,133,146, 25,206, 41,
+143,105,209,122, 69, 66, 18, 95, 79,107,233, 43,251,176,149,159, 94, 34, 36,116, 73, 95,207,210, 61, 8, 87,234,131,234, 42, 44,
+ 97, 13, 84,117, 22, 46,252, 34,228,246,237, 59,230, 57,115,230, 36,142, 28, 57, 50,240,195, 15, 63,108,190,111,223,190, 46, 38,
+147,233, 27, 0, 69, 21, 25, 93, 6, 13, 26,116, 53, 48, 48,176,193,134, 13, 27,114, 31, 61,122,228, 67, 81,148,135,213,106,101,
+245,122,253, 3,163,209,120,218,106,181,158, 6,112,173, 58,137,245,242,242,106, 53,110,220, 56, 81, 81, 81, 17,132, 66, 33,172,
+ 86, 43,114,115,115,209,169, 83, 39,193,161, 67,135, 90,212,228, 6, 20, 22, 22, 46,255,230,155,111,206,238,220,185,179,143, 82,
+169,124, 73, 42,149, 6, 3, 96,180, 90,109,142, 94,175,255,163, 38,233, 44,211,206, 49, 76,206,181,107,215, 34,148, 74, 37, 30,
+ 62,124, 8,134, 97,114, 30,183, 14,200,196,228,163,155,231, 15,213,109,230,223, 0, 23, 47, 95,133, 76, 76, 62,226, 67,125, 61,
+247,176,251, 80,193, 81, 64,185, 16, 72,151,227,226,226,228,139, 22, 45, 66, 92, 92,220, 45, 87, 22, 45,187,224,138,139,139,187,
+101, 63,206,225,248,243,143,145,198,138, 45, 90, 21, 41, 72,160,100,118,161, 90,173,246, 81,169, 84,165, 2, 43, 51, 51, 19,153,
+153,153,144, 72, 36, 72, 75, 75,131, 68, 34,201,114,167, 19, 34,151,203,127,107,211,166,205, 11, 41, 41, 41,226,249,243,231,215,
+189,118,237,154,178, 83,167, 78, 47,202,229,114,134,227, 56,152, 76, 38, 50, 49, 49,209,115,217,178,101,161,237,219,183,183,180,
+111,223,254,250,238,221,187,141,168, 36,254, 21, 65, 16,191,100,101,101, 53,172, 95,191,190, 93,180,149, 17, 87,142,130, 11, 40,
+ 25,242, 20, 10,133,215, 43, 75,168, 80, 40,188,153,148,148,212, 91, 33,147,194,162,213,192,170,211,128,214,106,193,104,139,193,
+ 20, 23, 3,122, 13, 36, 52, 13, 17, 67, 65, 46,147, 33, 35, 61, 29, 66,161,240,102,101,156, 18,137,228,102, 78, 78, 78,111,149,
+ 74, 85,250, 18,165,104,186,100, 97, 24, 88,104,186,212,162, 37, 18,137,240,232,209, 35, 72, 36,146,155, 79,186, 38,147, 36,201,
+216, 67, 56, 84,144, 15, 4, 5, 5,177, 29, 58,116,192,148, 41, 83,192, 48,140,173, 24,136,238, 0, 46,162,196,191,229,153,132,
+ 43,113,107,119, 90, 55, 26,141,208,233,116, 40, 44, 44, 20,202,229,242, 23, 66, 67, 67,175, 90, 44,150, 61, 52, 77,111,121,240,
+224,129,166, 34, 78,155, 48, 43, 21, 93, 44,203,130,227, 56, 48, 12, 3,138,162, 32, 22,139,217,115,231,206, 99,217,138, 37,136,
+223,178,157, 27, 52,104, 16,113,232,208, 33,176, 44,155,254,132,179,111,177,137,150,202, 26, 13,231,144, 10, 31,161,242,144, 10,
+ 21,113, 58,246,254, 28,183, 17, 46,142, 41,135, 15, 62,248,224, 4, 74,134, 12,243,108, 98,238,113, 56,191, 44,250,238, 11, 25,
+104, 70,111, 62,183, 83,247,237, 93,141,126,222,183, 43,127,179, 72, 4,154,151,187, 5,181,108,216,224, 5,129, 74,229, 67,174,
+223,184, 42,127,199,246,189,201, 15, 31, 62,212,172, 93,187,182,227, 11, 47,188,224,253,199, 31,127,132, 86, 36,180, 20, 10, 69,
+227, 55,223,124,115, 92, 97, 97,161, 56, 62, 62,126,119, 86, 86,214,111, 40, 9, 45,227, 56,131,122, 0,128,173, 54, 33, 26,100,
+107,231, 46, 2,152, 95, 89,127,141, 32, 8,252,244,211, 79,229,102, 7,178,143,167,206, 85,141, 26, 53, 26,145,146,146,114, 33,
+ 39, 39,103,152,243, 78,177, 88, 60,175, 73,147, 38,125,111,221,186,245, 57,128, 99,213, 33, 54, 24, 12,177,123,247,238, 93, 42,
+ 16, 8,234, 48, 12,147,105, 52, 26, 99, 31,219,162, 69,177, 19,226,214,239,218,100,180, 48,225,114,137,224,161,137, 98,223,226,
+117,200,243,107,205,178, 65,237, 96,141, 82, 3, 32,156,214,255,176,189,140, 44, 28,199,217,143, 85, 59, 88,177, 44, 78, 86, 48,
+ 87,251,212,143, 17, 44,157,171,168,141,171,200,162,245, 9,128,246, 0,126,201,201,201, 89, 53,118,236,216,101, 59,118,236,240,
+210,104, 52,200,201,201, 65,110,110, 46,132, 66, 33,148, 74, 37,214,173, 91,103,204,201,201, 89,229,120, 14,202, 71,144, 7, 0,
+147,191,191,255,111,219,183,111, 15,254,250,235,175,133, 49, 49, 49,105, 3, 6, 12,104,186,110,221,186, 20,177, 88,204, 49, 12,
+ 67,152,205,102,226,237,183,223,142, 88,177, 98, 69,170, 64, 32, 80,140, 24, 49,130,240,240,240,248, 5,149,132, 13, 80,171,213,
+167,190,255,254,251,161,211,167, 79,151, 90, 44, 22,151,150, 44,251, 54,149, 74,133, 75,151, 46, 89, 10, 11, 11, 79, 86, 97,197,
+ 56,245,195,177,163, 93,255, 51,114,164,152,210,106, 64,105, 53,160, 53, 26, 48,218, 34, 16, 58, 13, 68, 12, 13,185,152, 69,112,
+152, 12,180,209, 19, 71,127,253,131, 50,155,205,149, 6, 54,212,104, 52,167, 46,198,199,119,111, 95,175,158,240,210,180,105,176,
+ 82, 20, 94, 73, 74, 42, 21, 87, 86,171, 21, 7, 91,182, 4, 67, 16,104, 61,113, 34,238,209, 52,173,209,104, 78,253, 47, 62, 12,
+ 55,110,220,200, 29, 61,122,244, 53,150,101,219,226, 9,125, 52,243, 73,128,162,168,114,214, 40,134, 97, 74,172,142, 37,150, 3,
+201,209,163, 71,187, 38, 38, 38,138,255,252,243, 79, 92,184,112,161,245,142, 29, 59, 62, 9, 15, 15,111,249,240,225,195,236,170,
+196,155,171,160,191,176,249, 31,238,222,185, 7,239,188,243, 14,145,157,157,141,239,190,251, 14, 85, 5, 79,253, 59, 16, 19, 99,
+ 98,227,227,101,117,225,228,247,228, 34,164,194,239,112, 51,164, 66, 69,156,166,152, 18, 43,153, 44,190, 36,216,168, 41,166,100,
+ 56, 80, 22, 95,165,165, 12, 49,166, 24,141,205, 33, 62,171, 22, 56,245,160, 25,185,229,220, 78,221,128, 99, 15,181, 87,178,140,
+243, 1,156,128,137,225,238, 93,231,110,188,244,146,143, 63, 0,152, 77, 76,112,227,198,141,187, 9,133, 66, 9, 0,120,122,122,
+190,228,231,231,183, 46, 63, 63,191,179,171, 50,141,142,142,238, 16, 24, 24,216,230,248,241,227,127,100,101,101,221, 2,240,179,
+243, 65, 17, 17, 17,115,110,223,190,221, 78, 36, 18, 17, 85,212, 17, 0, 64,183,110,221, 94,144, 74,165,126,199,238,122, 67, 35,
+110, 4, 78, 80, 12, 8,101, 96, 84,173,144, 38,110,142,176,176,171,126,133,133,133,173,139,139,139,255,168,102,209,247, 24, 58,
+116,232,150,248,248,248,176,110,221,186,113,215,175, 95, 39,157, 71, 17, 34, 34, 34,250, 92,185,114,165,237, 91,111,189,181, 97,
+215,174, 93,147, 81,118,166,109, 85, 72,179,197, 27,172, 53,156, 74,198,105,128,169,103,179,153,241, 10,229, 31,128,234,132, 92,
+120,140,240, 12,143,149,196, 10, 13, 24, 21,108,111,111,139,137,213,158,162,168,223,111,220,184,113,112,196,136, 17,186,252,252,
+124,248,249,249,161,126,253,250, 32, 8, 2,235,214,173, 51, 62,120,240, 96,159, 45,150, 86,251,204,204,204, 65, 54,177,229, 10,
+218,213,171, 87,239,218,182,109,155,234,218,181,107, 2,154,166,149, 77,155, 54, 53, 92,190,124,217, 83, 36, 18,113, 98,177,152,
+189,118,237,154, 34, 34, 34,194, 68, 16,132,244,199, 31,127,204,191,122,245,106,248,140, 25, 51,190, 65,217,105,226,206,216,185,
+ 96,193,130,140,148,148, 20,152,205,102,104, 52, 26, 20, 23, 23,151, 46, 69, 69, 69, 40, 46, 46,134, 72, 36, 66,118,118, 54,246,
+239,223,159,101,139, 18, 95,153,101, 99,237,154,117,235,213, 89, 15,211,160, 84,200, 65,107,138,192, 20,231, 3,218, 98, 72, 40,
+ 43, 60, 68, 12,234, 54,146, 67,166, 80, 34, 71,163, 67,252,229, 95,179,109, 81,226, 43, 54, 23, 88, 44,107,223, 93,177, 34,135,
+ 22,139, 81,111,248,112, 88,109, 67,133,142, 66,139, 33, 8,132,247,234, 5,210,219, 27, 11,247,237,203,177, 69,137,127,162, 96,
+ 89, 86, 96,177, 88, 42,203, 7, 88,150, 77, 79, 76, 76,220, 5,224, 44, 65, 16, 28, 65, 16, 28, 74,130,181,233,158,229, 7,153,
+162, 40,204,157, 59, 23, 98,177, 24,115,231,206,197,167,159,126,138,101,203,150, 97,253,250,245,248,246,219,111,113,244,232,209,
+ 6, 23, 47, 94, 20,159, 63,127,158,139,139,139,203,139,136,136, 16, 76,156, 56, 81, 37,151,203, 63,168,140, 51, 54, 54, 22, 94,
+ 94, 94,136,141,141,197,146, 37, 75,176,121,243,102, 28, 60,120, 16,151, 46, 93,130, 64, 32, 96,211,211, 31,193,100, 50,113,171,
+ 87,175,206, 56,120,240,160,113,213,170, 85, 16, 10,133,196, 83,106, 36, 62,176, 9, 42, 71, 75,144,115, 72,133,124, 0, 43, 81,
+181,111, 84, 69,156,144,197,199,215,181,137,163,100, 7, 65,116, 24,192,116, 84, 62,189,218,206, 49, 25, 64,112, 45,112,206,150,
+143,254,191, 68,213,166, 59,247,175,100, 25,103, 3,248,193,158, 39,165, 82, 41, 63,112,224,123, 33, 0,236,219,187, 95,148,148,
+148,228,253,253,247,223,203, 2, 3, 3,241,237,183,223,202,228,114,121, 96, 5,156,204,193,131, 7,205, 18,137,196,111,194,132,
+ 9,253,218,181,107,247,190,173, 35,218, 11, 64, 11,148,204, 94,140,186,127,255,126,130,191,191,255,221,147, 39, 79,234,221, 41,
+ 32,173, 86,251,205,214,173, 91,235, 23, 48,190, 56,166, 31,138,120,118, 41,142,170,182, 32,173,222,167, 80,212,121, 25,175,191,
+254,122, 29,134, 97, 54, 85,179,220, 95, 31, 50,100,200,214,248,248,248,176, 9, 19, 38,100, 95,191,126, 61, 7, 64, 60,128,237,
+142,203,237,219,183,243,198,142, 29,155,181,105,211,166,144, 17, 35, 70,172, 7, 48,140,127,245,243,224, 81,182, 47,132,170,102,
+ 29,186,120,225,150,254,207,205,205, 93, 93, 88, 88,120,233,222,189,123,239, 89, 44,150, 16,130, 32, 56,177, 88,156,157,147,147,
+179,202, 33, 96,169, 43,191,146,222,176,197,218, 32, 8,130,226, 56, 46,189, 71,143, 30, 31,244,234,213,235,171, 35, 71,142,152,
+186,119,239,142,189,123,247,250,247,232,209,195,192,178, 44,119,236,216, 49,255,190,125,251, 26,206,158, 61,171,127,251,237,183,
+155, 54,105,210,100, 98,108,108,172,154, 32, 8,214, 21,167,253, 93, 86, 84, 84, 52,164, 95,191,126,151,246,237,219,167, 84,169,
+ 84,160,105, 26, 6,131, 1, 6,131, 1, 28,199,193,219,219, 27,106,181, 26,243,231,207,215, 20, 23, 23, 15,118, 33,220,156, 57,
+ 77, 38,147,105,216,228,247,167,159, 90,245,249, 92,175,240, 6, 13,144,127,199, 4,218,100,128,136, 35, 81,247, 5,111,136, 37,
+114,220, 75,210,226,163, 93, 7,180, 70,147,233, 53, 23,189,229,114,156,197,197,197,195, 98, 62,253,244,244,134, 25, 51, 60,219,
+ 4, 5, 65, 32, 16,192,108, 54,131, 97, 24,136, 68, 34, 68,198,196, 64, 28, 16,128, 57,187,118,233, 53, 26,205, 48,148,255, 20,
+143, 51,103,109,192,145,115,242,141, 27, 55,198, 54,107,214, 12,147, 38, 77,194,144, 33, 67,202, 28,248,253,247,223, 99,253,250,
+245, 48,155,205, 99, 1, 92, 7,176, 14, 37, 67, 29,112, 18, 89,127,119, 58,107,157,147, 97,152,194,164,164, 36,229,210,165, 75,
+ 9,171,213,138,207, 63,255, 28,118,193,105,175,215, 83,166, 76,169,227,229,229,133,207, 62,251,204,146,151,151,215,115,201,146,
+ 37,103,182,111,223,238,255,205, 55,223,188, 14, 32,214,153,147,101,217,220,155, 55,111,122,109,216,176,129,164,105, 26,203,151,
+ 47, 47, 55, 60, 57,126,252,120, 88,173, 20, 4, 2,161,197,100, 50,183,144,203,229,201,126,126,126,114,174,172,115,215,147,188,
+159,161, 40, 9, 97,224,232,248,110,113,244,207, 66,197, 33, 21,170,195,169,150,197,199,119, 55,197,196,156,181, 9,162, 68,219,
+ 49,123,237, 38,253,106,112,218, 5, 97, 77, 56, 79,217,150, 42, 97, 50,153,160, 86,171,145,151,151, 7,149, 74, 5,129, 64, 64,
+ 84,148, 78,179,217,252,231, 71, 31,125,116, 99,211,166, 77,189,175, 92,185, 50,240,252,249,243, 61, 78,159, 62,109, 74, 75, 75,
+163, 41,138,226, 66, 66, 66,132,157, 59,119,150,245,239,223,223, 67, 42,149,146,179,103,207,206,251,226,139, 47,252, 81,214,135,
+205, 57,239, 2,130, 32,240, 97, 87, 45, 98,123, 8, 96,177, 88, 81, 84, 84,132,140,140,116, 36, 36, 36,224,202,149, 59,224, 56,
+142,172, 70,185,251, 1,152,253,221,119,223,133, 74, 36, 18, 98,215,174, 93,117,118,237,218, 85,165, 37,117,199,142, 29,117,118,
+239,222, 61,207, 54,122,145,254, 44, 62,239, 60,231,255, 44,231,179, 12,231,200,240,168, 82,104,217,218,249,246,176,125,148,148,
+162,168, 95, 92,132,112,248, 4,192, 92, 7, 43, 88, 85,230, 60, 13,199,113, 23,122,247,238, 61,165, 87,175, 94, 43,250,244,233,
+147,149,149,149,213,112,249,242,229, 97, 52, 77, 91, 19, 18, 18,200,228,228,228,180,223,126,251,173, 81,147, 38, 77, 38,222,190,
+125,251, 28, 65, 16, 86, 55, 50,152,144,156,156,220,169, 71,143, 30,251, 39, 78,156, 24,222,161, 67, 7,137, 74,165,130, 80, 40,
+ 68, 74, 74, 10,254,248,227, 15,203,238,221,187,211,139,138,138,170,243, 9,158, 95, 82, 51, 50,162, 70, 76,125,111,223,196, 33,
+ 3,253,255,213,244, 5, 73, 72, 72, 8, 96, 52,226,206,195,108, 92,189,243,135,117,243,133,171,106,179,217, 60, 12,238,127,130,
+231,151,223,238,221,235,221,115,198,140,125,243,254,243,159, 32,100,101, 9, 67, 66, 66, 32,145, 72,240,224,193, 3, 36,179, 44,
+189,120,227,198, 28,155,200,122,210, 81,225,165, 0,150,178, 44, 43, 4, 0,185, 92,142,119,223,125, 23,142,159,220, 89,191,126,
+ 61,140, 70, 35, 0, 8, 9,130, 88, 10, 96,203,179,110,197,178,163,160,160, 96,206, 43,175,188, 18, 39, 20, 10, 43,140,122,235,
+227,227, 3,173, 86, 11,154,166,153,140,140,140, 59, 62, 62, 62, 16,137, 68,224, 56,206,229,115,148,159,159, 63,103,216,176, 97,
+ 11, 72,146,172,200,242, 1,165, 82,153,118,230,204,153,198,111,189,245, 22,249,223,255,254, 55,101,194,132, 9,210, 51,103,206,
+ 48, 28,199,237,127,210,247,160, 75,151,157,192,134,152,215, 0,188, 6,148,115,120,207,176,109,171, 86, 72,133, 46, 93,118, 98,
+ 3,254,226,116, 28,198,179, 11, 34,155, 21,170,185, 44, 62,126, 5, 74,252, 44, 42,229,238,178,179, 11, 54,196,160, 86, 57,221,
+129,163,246,213,235,245, 96, 24,166, 50,107,222,239,123,247,238, 93,241,219,111,191, 5, 76,153, 50,165,225,127,254,243, 31,101,
+143, 30, 61, 60, 29, 15, 48, 26,141,236,225,195,135,245,235,215,175, 47,190,112,225, 66,234,248,241,227, 59, 84,150,206,135, 15,
+ 31, 30, 93,184,112,161,119,255,254,253,155, 0, 40,245,207, 82,171,213, 72, 75, 75,195,159,127,254,153,102,181, 90, 15, 85, 35,
+ 75,249, 0,230,141, 26, 53,106,233,182,109,219,234, 76,152, 48, 33,123,247,238,221,127,162, 36, 96,177, 51, 84, 67,134, 12,105,
+185,109,219,182,144, 9, 19, 38,100,163,196,143, 44, 29, 60,120,240,176,163, 59,202,251,105, 85, 58, 50,177,213, 98,177,112, 38,
+147,137, 51, 24, 12,156, 78,167,227,224,250, 43,240, 7, 51, 51, 51,185,244,244,116,238,225,195,135, 92,106,106, 42, 7,224, 91,
+ 39,197,235,170,193,242,216,177, 99, 71,163,208,208,208,207, 21, 10,197, 9,129, 64,160, 17, 8, 4, 26,169, 84,250,131,159,159,
+223,167,139, 23, 47, 14,229, 56, 78, 92,137,138,174, 8, 66,145, 72,244, 86, 96, 96,224, 65, 95, 95,223,116, 31, 31,159,244,192,
+192,192,131, 34,145,232, 29, 0,162, 42,148,121, 69,144, 9,133,194,143, 60, 60, 60, 78, 73,165,210, 92,169, 84,154,235,225,225,
+113, 74, 40, 20,126,132,202, 3,169, 86,202, 41,145, 72, 62, 10, 8, 8, 56,165, 84, 42,115,149, 74,101,110, 64, 64,192, 41,137,
+ 68,242, 56,156,143,211, 43,177, 11, 45, 3,103, 3, 65, 16, 84,235,214,173, 55,180,109,219,118, 93,219,182,109,215,181,106,213,
+234,107,155, 85,146,179, 89, 91, 12,168, 56,120,227,223,153,206,167,198, 25, 25, 25,185,125,219,182,109,236,156, 57,115, 52, 77,
+154, 52, 41,152, 51,103,142,102,219,182,109,108,100,100,228,246,154,114, 6, 5, 5,213,139,140,140, 44,216,180,105, 19,157,148,
+148,196,109,218,180,137,142,140,140, 44,112,138, 12,255, 36,242, 78, 0,136,176, 89,127, 14, 1,216,131, 18,231,247, 80, 0, 68,
+140, 41,134,179,205, 62, 60, 1,160, 79, 5,101,239, 46,103,152, 41, 38,134,179,249, 84,157, 4,144,232,176,222, 13,101,253,191,
+158, 4,167, 75,180,104,209,226, 30,231, 0,139,197,194,169,213,106, 46, 41, 41,137,187,112,225, 2, 23, 22, 22,118,207, 13, 78,
+ 63, 0,111, 3, 56, 28, 28, 28,124,187, 99,199,142, 15, 59,117,234,244,176, 94,189,122, 41, 34,145,232, 10, 74, 34,188, 71,218,
+150,165, 0,154, 84,193,217, 81,165, 82, 45, 12, 11, 11, 59,212,184,113,227, 75,245,235,215,191,226,235,235,123, 68, 38,147, 45,
+194, 95,145,177,171, 91,231,123, 12, 29, 58, 52, 77,167,211, 49, 47,189,244,210,109, 87, 39, 53,107,214,236,162, 78,167, 99, 70,
+142, 28,153, 14, 32,250,159,240,188,243,156, 79,133,243, 31,133,198, 54,193,116,208, 97,249,196,197,113,159, 56, 29,179,213,118,
+110,149, 5,193,113,156,128,227, 56, 15,142,227,188, 57,142,243,229, 56, 78,197,113,156, 39,199,113,210, 42,204,223,124,197,254,
+251, 56, 39,219, 4,148,193,246,223, 25, 85,237,127,174,239,103,104,104,168, 79,187,118,237,166, 30, 56,112,224,163,251,247,239,
+127,116,224,192,129,143,218,181,107, 55, 53, 52, 52,212,231,113,210, 25, 20, 20, 84,175,121,243,230, 95, 53,107,214, 44,189,121,
+243,230, 95, 57,137,172, 39,153,119,137, 77,196, 52,179, 45, 13,109,219, 8,148,196,194, 90,107, 19, 54, 17, 21,244,212,170,195,
+105,231, 59, 4,160,175,109, 57,100,219, 22,246, 20, 56,203,161, 65,131, 6,199, 91,182,108,121,175, 85,171, 86,201,173, 90,181,
+186,215,162, 69,139,123, 77,155, 54,189, 23, 17, 17,113,175,110,221,186,247,252,253,253,143,215,160,140,124, 1,132,160,252,103,
+192,158,118,157,239, 30, 25, 25,121, 85, 38,147,185,140, 13, 38, 20, 10,231,181,106,213,234, 38, 74,102, 74,242,237, 39,207,201,
+ 11,173,255, 33,240,149,240,217,227,148,162,242,207,140, 84,181,159,191,159,207, 54,167,203,111,117,217,132, 76, 67,155,192,145,
+212, 2,167, 35,159,189, 78, 69, 56,136,166,167,193,201,215, 37,158,147,231,228,133, 86,173, 67,200,223, 2, 30, 78, 48, 63,230,
+126, 30,207,197,104, 60,126, 0, 0, 32, 0, 73, 68, 65, 84, 54,170, 19, 19,235,113, 56, 93,241,221,127,202,156, 60,120,240,224,
+ 81, 91,109,103,119, 0,231,236,189,194,138, 84,105,117,102, 19,212, 68,217,158,230, 57,121, 78,158,147,231,228, 57,121, 78,158,
+243, 31,199,105,199,138, 10,182,223,113, 90,255,250, 25, 21, 94, 79, 36, 76, 15,111, 86,229, 57,121, 78,158,147,231,228, 57,121,
+ 78,158,179,166,152,248,140,138,172,110,246, 21,126,232,144, 7, 15, 30, 60,120,240,224,193,163,246, 80,117, 28,173, 61,123,246,
+ 8,236,255, 71,141, 26, 53,158, 97,152,169,246,117,129, 64,176,230,187,239,190,219, 82,217, 21,134, 15, 31,206, 84,198,233, 10,
+ 85, 93,199, 21,103,139, 38,202, 73,126,222,138,247,138,138, 13, 43, 83, 50,153, 11, 38,147,169,185,125,159, 76, 38, 75,220,178,
+101,203,221,218, 78,231,248,241,227,155, 56, 95,167,126,152,168,187,175,151,236,221,130, 34,221,242, 91,247,116, 95,243,117,236,
+169,192, 31, 64,180,151, 76, 60,168,133, 74,220,241,207,124,211,101,189,149, 57,140,146,217,176,133,207, 99,134,131,131,131,155,
+ 42,149,202, 49, 0, 90, 24, 12,134, 64,133, 66,145, 11, 32, 65,163,209,108,207,206,206,190,227, 46, 79,183,250, 72, 3, 16,110,
+ 91,125,120, 46, 21,245,220,217, 87, 21,250, 68,192,196, 1, 82,130,128,245,100,242, 95,206,232,125, 27,193,196,114,229,183,247,
+105, 4, 11,199, 65, 76, 0,230,147,247, 33,123,142,138, 74, 9, 32, 10, 37, 33, 28,110,160, 36,252,132,129,127,100,121,240,120,
+174,224, 60, 84, 88,186, 46,172, 64, 76,116, 21, 11,137,175, 56,112, 42,128,243, 51,155,205, 34,137, 68, 2,139,197, 2,133, 66,
+190,246,237, 9,227, 63, 7,137, 34,138,198,187, 91,182,108,169,241,151,174,171,115, 29, 0, 63, 57,159,239,163,148, 47, 56,123,
+248, 99,159,174, 3, 22, 47,178, 60,200,139,213,106,181,164, 84, 42,133,217,108,134,183,183,119,167, 73, 19, 39,190, 68,138, 56,
+139, 88,236,113,121,197,138, 21,217, 53, 77,231, 7, 31,124, 16,108,181,154,254,205,178,172,196, 98,177, 72,157,175,227,173,240,
+ 88,124,246,240,199,138,110,209,139, 62, 7,120,161,245, 20, 32,169,231,227,113,110,229,168,238,205, 58,182,104, 12, 54,225, 60,
+ 76, 22,235,160,179,233,186, 65,159, 94,201,156,158,174,179,182, 69, 45, 4,172,252, 31,130,160, 97,195,134, 83, 2, 2, 2, 70,
+110,220,184, 81,220,176, 97, 67,200,100, 50, 24,141,198,144,251,247,239,135, 76,154, 52,169,155, 92, 46,223,149,146,146,178, 22,
+238,125, 8, 46,252,236,214,255, 3, 0,116, 26, 51, 63, 28, 37, 31,139, 54, 56,239,235, 62,110,126, 56,128, 25, 40,251, 97,228,
+ 44,148,132, 80,112,213,234, 72,142,108, 91,134, 65, 99, 63, 18, 2,152, 84,154,120, 18,248,225,219, 85,232, 55,234,189, 50,219,
+ 9, 14,194,195,219,150, 33,122,236, 71, 21,126, 71,177,111, 99,130, 98, 89,174, 66, 75, 60, 73, 18,244,137,123,156,171, 15, 12,
+231,160, 36, 6, 88, 57, 74,148,124,208,217,229,241, 3,154, 10,114,172, 20,227, 50,224,172, 88, 36,200, 61,122,135, 41,119,110,
+ 76, 27, 80, 20, 83,210,182,138,133, 96, 14,166,120,159,157, 61,123,182, 48, 58, 58, 26,155, 55,111,238,252,245,215, 95, 79,212,
+106,181, 63,218,238, 91, 50,255,248,242,224,241, 92, 11, 46,215, 66, 75, 40,192,134, 67,251,182, 52,202,201,205, 67,204, 91, 31,
+ 98,231,206,157, 40, 44, 44,132,143,143, 15, 36, 98,177,104,229,210,255, 11, 86, 42, 61,130, 99, 38,198,110, 0,208,180,166,169,
+169,230,117, 26, 59,159, 79,216, 62,165, 35, 20,144, 34,137, 68, 66,238,218,181, 11, 69, 69, 69, 80,169, 84,144, 72, 68,228,138,
+ 69,159,200,149, 74, 79,249,155,147,103,118, 70, 73,252,159, 26,193, 98,209,117, 62,176,115,139, 82,173, 86, 99,220, 59,177,112,
+190,142, 88, 44,102,236, 47, 22,190,142, 61, 21,204,222,248,238,216,102, 47,122, 1,214, 91,151, 32, 18, 8,160,240,246, 65,148,
+ 80, 0, 1,129,230, 49, 39, 82,103, 1,248,244,121,201,108,195,134, 13,167, 12, 31, 62,124,228,130, 5, 11,196, 36, 89, 18,114,
+ 78,175,215,195,104, 52, 34, 52, 52, 20,103,207,158, 21,207,153, 51,103,228,247,223,127,143,148,148,148,213,213,229,191,117,235,
+ 86,253,240,240,112, 19, 0, 12,108,233,229,188,175,158,125, 31, 0,120,121,121, 85,201,231,167,242, 48,223,186,117,181,133,253,
+188, 41,189, 66,153, 10,182,155, 0, 40, 42,227, 98, 89, 78,120,242,171, 73, 21,238,127,107,193, 14,250,198,158, 11, 77, 27, 54,
+108,104,116,220,238,233,233, 89,209, 41, 65, 58,157, 46,220,121,163,253,120, 43,197, 4, 86,116,189, 62,239,174,119, 41,192, 40,
+ 6,194, 29, 59,118, 0, 0,190,252,104,180, 96,211,207,121, 66,161,176,164,169, 93,186,116, 41,230,205,155, 39, 57,113,226, 68,
+255,109,219,182,245, 63,120,240,224,202,138,132, 42, 15, 30, 60,158, 73,145,229,248, 91,177,208, 34, 9,194, 75,233,229,137,215,
+ 94,127, 27,199,143,255,128,174, 93,187,150,238,107,208,160, 1,134, 15, 27,140,239,182,174, 0, 0,175,199, 73,209,227, 94,167,
+176, 88,255,105,191,145, 95,205,127,152,173,187,114,228,200, 17,116,233,210,165,204,249,175,143,120, 13,223,126,179, 20,149, 68,
+153,119, 11, 4, 71,138,189,148, 30, 24, 21,243, 14, 92, 93,103,226,184, 33, 71,250, 14, 95,213, 59, 39, 95,191,130,175,103, 79,
+ 30,141,130,253,250,180,108,214, 20,133,251,215,226,143, 34, 19,142,103,154,240,102,212,191, 16,233, 43, 71, 23,154, 65,176,135,
+168,103,182,158,122, 46,132, 86,112,112,112,211,128,128,128, 50, 34, 75,171,213, 66,167,211, 65,163,209, 64,171,213,130, 36, 73,
+196,198,198,138,207,157, 59, 55, 50, 56, 56,248,180, 27,195,136, 15,109,150, 44, 64, 32,210,205,157, 59,215, 28, 24, 24,104, 86,
+ 40, 20,156, 80, 44,213,118, 31, 55,223, 11, 0, 72,161, 88,187,114,229, 74, 75,104,104,168, 73, 40, 20, 74,222,123,239, 61,210,
+157, 52,155,205,102,206,145,211, 98, 49,151,110, 95,188,120,177, 37, 40, 40,200,172, 80, 40, 56,171,213,125,163,227,205, 7, 5,
+144,138, 5,144,138, 5,144, 73, 68,240,170,223, 14,210,194, 63, 65,211, 52,150, 44, 89, 98, 13, 14, 14,182, 40, 20, 10, 78, 34,
+145,136,167, 77,155, 86,101, 58,199,143, 31,207,169, 84, 42,171, 66,161, 16,207,155, 55,175,220, 76,161, 51, 55, 50, 32,151,136,
+160,144, 10,209,184, 65, 24,164,156,209,237,180, 10, 4,101,189, 17,164, 82, 41, 58,119,238,140, 22, 45, 90,224,224,193,131,221,
+121,161,197,131,199,115,129, 10,103, 24, 10, 1,224,200,145, 35,221, 80,242, 65, 68, 68, 71, 71, 19, 37,103,112,152, 49,101, 24,
+222, 28, 55, 10, 12,195,150,126,231,139, 32, 9, 76,126,163, 63, 88,214,157, 17,137,170,167,120,214,224, 58,165,156, 28, 65, 10,
+ 0,160, 81,189, 16,110,226,155,255, 1,195,178,127, 13,148, 8,128,183,199,245, 43,217, 86, 11,233, 20,128,193,135,147, 94,133,
+171,235, 52,109, 84,135,164,173, 38, 16,101, 63,246,248,119,124,108,147,231,116,129, 22,117, 67, 34, 40,163, 17, 38, 19,133,248,
+ 59, 5,198, 83, 25,250, 64, 82,149,170, 94,245, 90, 7,153, 64,157,137,122, 94,146,198,217,122,234,185,200,187, 82,169, 28,179,
+113,227,198,114, 34, 43, 39, 39,135,212,233,116,176, 90,173,172, 86,171, 5,195, 48,152, 57,115,166,104,206,156, 57, 99,178,179,
+179,231,217, 53,143, 43, 78,155,223,213,140, 91,183,110,213,155, 61,123,182,181,103,207,158, 15, 27, 52,104,160, 23, 8, 4, 8,
+ 9, 9, 89, 21, 21, 21,229,187, 96,193, 2,107,255,254,253, 83, 5, 2, 1, 26, 55,110,172,255,243,207, 63,235, 1,144,187,155,
+119, 71,206, 45,103,214,112, 0, 64, 16, 4,162,162,162,210, 26, 55,110,172, 23, 8, 4,184,123,120, 49,231,238,253, 20, 9, 73,
+ 52, 9,245,182, 53, 34, 4, 32,247, 44,245,196,139,138,138, 74,111,218,180,169,142, 36, 73,220,188,121, 51, 12,229, 63,107, 85,
+142, 83, 46,151, 83,175,191,254,250,195, 59,119,238,184, 58, 30, 66, 1,137, 14, 77,109, 6,172,208,182, 64,250,197, 10,211, 41,
+ 18,128,158, 51,101,180, 80, 37, 3,164, 94,254,102,141, 70, 3,165, 82, 89, 98, 33,179, 90,241,251,239,191,163, 99,199,142,221,
+246,236,217,115,142,127,222,121, 78,158,243, 47,184,210, 34,207,160, 53,203,241, 67,247,101,124,180,206, 58,103,138, 97,104, 52,
+ 8, 15,194,226,255, 27, 15,134, 97,193, 48, 12,104,219, 47,195, 48,160,172,214, 90, 73,217,227, 92,199, 71, 41, 95,240,195,174,
+119,125,122, 14, 89,218, 43,110,246,184, 83, 12, 3,176, 44, 5,138, 2, 24,150, 2,203, 48,160,168,218,113,205,161, 88, 22,245,
+194,130, 17, 55,123, 28,156,175,179,253,187, 61, 3,207, 28,138, 85,116,141, 94,244,225,221, 52,195, 18, 94,216, 63, 89,200,196,
+ 82, 33, 39,148,193, 98,161,161,181,176, 22, 0,122, 19,197, 90, 57, 15,127, 25, 0, 8, 73,226,121,154, 93,219,162, 97,195,134,
+101, 68,214,178,101,203,252,215,173, 91, 23, 10, 0,195,134, 13,203,232,213,171, 87, 94, 82, 82, 18, 66, 66, 66,136,188,188,188,
+ 1, 0,222,179,157, 59, 3,192,186, 10,120,245,225,225,225,166,128,128, 0,179, 93, 16,145, 36, 9,161, 80,136,240,240,112, 83,
+ 96, 96,160,185,113,227,198,122,177, 88, 12,146, 36, 97, 23,122,110,117,243, 8, 2, 2,129, 0,118, 78,103,107,143,157,179, 58,
+ 16, 9,201,242,205,155, 3, 39, 73,146, 46,175, 87, 97, 29,146,201, 56, 0, 21, 30, 47, 32, 29,154, 71, 97,229, 30, 2,241,191,
+ 67, 4,224, 44,199,113,184,126,253, 58, 82, 82, 82, 32, 22,139, 17, 28, 28,140,121,243,230,193,108, 46,209,187,195,135, 15,239,
+ 6,224, 38,255, 4,243,224, 81,138,179,207,160,192,114,182,106, 85,238,163,117,228,200,145,110,209,209,209,231,236, 2,168, 68,
+236,184, 16, 63, 20, 13,138,178, 2, 28, 87, 43, 66,171,162,235, 48, 12, 91,233,117,236, 62, 90, 44,203, 9, 93,138, 44,150, 5,
+ 77, 81,181,114,247, 88,134, 2,203, 82,112,117, 29,130, 32, 25, 91,131, 47,230,159,147, 39,143,224,240,122, 36, 21,222, 0, 23,
+104, 19, 66,253,164, 18,228, 25,209,240,133,102,130,223, 13, 20, 46,221, 72,132,191,167,242,185, 41, 23,131,193, 16, 40,147,201,
+160,215,235, 75, 45, 89,235,214,173, 11,181, 88, 44, 36, 0, 8,133,162, 48, 53, 27, 42, 99, 88,192, 91,153,133,194,194, 98, 63,
+142,227, 8,155,224, 89, 10, 96, 11, 42,137,238, 47, 22,139, 75, 5,138,163, 0,146, 74,165, 53, 18, 48,118,216,197,153, 88, 44,
+118,185,221,121,120,173, 42,136, 29,133, 22,184, 18,171,150,147,216, 18, 8, 4,176,251, 70, 85, 5,137, 68, 82,154,119, 87, 16,
+ 10, 28,174, 39,168,190, 43,166,213,106,133, 78,167, 67, 81, 81, 17,100,178, 18,131, 25,199,113, 32, 8,226, 61, 0,239,243, 79,
+ 49, 15, 30,174,181,200, 51, 44,182, 92, 11, 45,148,152,236, 8, 0,160, 41,171, 75,241,179,231,240, 37, 60,204,214, 35,216,255,
+ 23,112,213,140,122, 58,114,228,200,173, 33, 33, 33, 29,236,235, 82,185,167,223,196,119, 63, 3, 77, 91,225, 37, 39,241,214,152,
+126,101, 68, 86,137, 69,203, 82,225, 55, 65, 10,139,245,159,246, 27,190,122,190,183,210,239,138,179,248,137,139,191,246, 90,161,
+198, 28, 70,146,191,162,144, 8, 97,134,191,253,217,120,135,198,253,198,174,245,115,167,187,109, 15, 36, 72,209,107,147, 86, 77,
+228,132,158,205, 21,164,246,252,199,227,254,117,192, 81,204,249,250,250, 30,233,243,218,202,222, 57, 5,188,143,214,211,128,151,
+183,138, 12,123,185, 59, 94,126,239, 43,156,249,228, 99, 14, 40,132, 95, 72, 40,217, 99,202, 23,240,124,121, 32,174,190, 53,134,
+ 5, 10,158,139,188, 42, 20,138, 92,131,193, 16, 98, 52, 26,161,209,104,160,209,104,202, 10, 2,145,136,152,248,206, 84,127,145,
+ 88, 2,202,106,193,241,237, 95, 84,201,105, 15,225, 48,176,165, 23, 4, 34,137, 54,161, 97,195, 85, 66,161, 16, 36, 73,226,240,
+218,143,223,219,191,252, 93, 47, 0,184,113,100,173,102, 84,236,154,213, 36, 73,194,108, 54, 75,171,147,238, 71,143, 30,133,153,
+205,102,147, 77,160,217,133, 31, 30, 60,120, 80,215,108, 54, 27, 29,183,187, 3,185,194, 11, 80, 53, 0, 20,129,229,172,103,169,
+169,169,117, 40,138, 50, 8,133, 66, 88, 44, 22,183, 84, 17, 73,146,226,155, 55,111,134,177, 44,235,242,248, 22, 17,117,128,224,
+150,128,196,219,237, 60,115,110,116, 68,109, 98,235,137, 69,144,230,193,227, 89,177,108, 61,131,207, 4, 81,193,255, 82,161,213,
+253,200,145, 35,156, 99, 15,145,166, 40,155,200,250, 75,244, 48, 12,139, 76,181, 9, 73, 73,119,177,114,229, 74, 92,186,250,145,
+247,130, 5, 11,164,115,230,204, 49,143, 28, 57,114, 57,203,178,173, 72,146,188,129,191,134, 42,202, 90,133, 88,182,238,181,107,
+215, 26,218,215, 41,138,130,151,151, 23,188,188,188,208,180,113, 88, 57,145,197, 48, 12,172,149, 12, 29,218,125,180, 8,142,229,
+ 40,138, 1,195,178,165,226,167, 80, 99, 14, 59,116,250,122, 35,135,195, 95,176,255,233,220,174,121,197, 98,112,210,188,210,124,
+236, 90, 63,119,250,130,205,155,165,133, 76,192,180, 81,175,189, 25, 57,124,212, 24,188,254,234, 43,221,204, 22,203, 65, 1,201,
+177, 84,233,245, 64,130,131,179,143, 22,143, 39,132,228, 34, 61, 37,146,202,225, 25, 92, 31,119,117,140, 88, 32, 16,252,114,191,
+200, 32, 38, 5, 66,144, 66, 49, 18, 10, 77,212,115,148,221,132,228,228,228,144,186,117,235, 66,163,209,128,166,105,118,216,176,
+ 97, 25, 66,161, 40, 76, 40, 18, 17,209,163,166,178,217,217,153, 20, 73, 10,192,113, 12, 94, 25, 62,137,144,202,228, 98,171,197,
+ 66,163,100,232,208,149, 53,203, 49,132,131, 87, 84, 84,148,175,125, 38,224,254,229,239,122, 57,236, 83,190,244,210, 75,190,142,
+179, 14,221,180, 22, 17, 35, 71,142,148,135,135,135, 19, 0,240,235,246,217,118,235, 25, 49,112,224, 64, 89,120,120,137, 31,254,
+143,107,223,117,155,211, 95,193, 1,197, 15,128,226,212,114,150,172,129, 3, 7, 74, 27, 54,108, 88,173,103,209,230, 0, 95, 97,
+236, 46, 15, 33, 13,100, 95,119,139, 43,166, 13,168, 80, 79, 8,151,191, 66, 66,226,233,103,238,240,241,137,159,121,177,197,131,
+135, 91,112,210, 34,207, 20,186,217, 4, 98,119,219,111,169,224, 18, 2,128,205, 68, 71, 56,232, 44, 80,180,181,156,200, 98, 24,
+ 6, 34,194,140,149, 43, 87,226,253,247,223, 7, 0,241,244,233,211, 15, 44, 88,176, 96, 40,203,178,173, 56,142,235, 66, 16, 68,
+101,189,198,179, 33, 33, 33, 57, 28,199,137, 72,146,236,178,118,237, 90,223,254,253,251,195,203,203, 11, 28,203,149, 19, 89, 12,
+195,194,106,181, 84,248,153, 91, 31,165,124,193, 15,123,166,249,244, 28,188,180, 23,195,178,167,236, 34,139,101, 24,128, 45, 57,
+ 41, 63, 55, 3, 39,143, 31,196,134,245, 27, 10, 65,112,183,193,129,181,137, 65, 84, 32, 6, 91, 93,252, 53,177, 75,231,118,205,
+177, 96,243,102,233,173,107, 89, 7,166,126, 48, 43,114,248,168, 49,216,243,221,118,144,116,209,117, 71,145,197, 80, 44,138, 11,
+243, 6,254,196,251,104, 61, 45,248,158, 60,117,138, 24, 51,102, 12,171,213,106, 33,150, 72, 88,138,162, 4,255,254,247,191,153,
+247,223,127,159,204,206,206,134, 70,171, 19, 2,240,197,115, 96,214,210,104, 52,219, 39, 77,154,212,237,252,249,243, 98,146, 36,
+161,209,104,208,163, 71,143, 60, 53, 27, 42,155,248,206, 84,255,204,204, 12, 90, 41, 23,154,197, 98, 17,114,115,115,217,110,253,
+ 71, 27, 71,141,127,191,206,251,179,227, 54,102, 93, 94,191,206,157,107, 56,206, 4,116,222,183,105,211, 38, 75,104,104,168, 73,
+ 42,149, 74,198,141, 27,231,214,248,161,197, 98,225, 22, 47, 94,108,118,158, 93,104,177, 88,184,149, 43, 87, 90,194,194,194,204,
+114,185,156,163,168,170,253, 62, 73,146,160,223, 90,176,131,166,105,186,140, 21,203, 46,178, 40,150,208,125,245,213, 87,214,176,
+176, 48,139, 66,161,224,164, 82,169,216,157,116, 78,157, 58,149,243,241,241,177,122,120,120,136, 99, 99, 99, 31,107,214, 33,197,
+ 64,184, 96,109,105,120, 7,169,151,151, 23,180, 90,109,105, 90, 67, 66, 66,120,177,197,131,135, 11,148,211, 34,207,166, 21,206,
+189, 56, 90, 44,160,203,201,205, 11,244, 15,170, 15,154,166,109, 11, 5,154,162, 48,237,237, 81, 88,190,254, 43, 0,176,139,173,
+168,233,211,167, 31, 0, 80,101, 99,182,107,215,174,249,211,167, 79, 87,230,228,228,156,216,186,117,171,239,232,209,163, 49, 99,
+198, 12, 44, 93,186, 20, 34,137, 12,190, 1,117, 75,175, 99,191,110,158,186, 0, 28, 56, 93, 5,118, 58,107, 73, 35, 5,161, 95,
+ 64, 61, 80, 12, 5,150,162, 64, 81, 20, 8, 65, 73,214, 78, 30, 63,136,209,111, 76,133, 72,170,244, 89,179,114,137, 49,242,229,
+144,161,115, 38, 76, 48,187, 97, 4, 36,111, 93,203, 58, 48,245,253,216, 40,187,200,218,183,125,253,237, 47,103, 14,222, 41,149,
+ 8, 75,175, 67,177, 44, 72, 82,192,251,104, 61, 37,145, 37,149, 74,247, 30, 59,118,236, 94,219,182,109, 9,189, 94, 15,138,162,
+144,151,151,135, 3, 7, 14, 36,112, 28, 7, 31, 31, 31, 28, 59,118,140, 29, 61,122,244, 94,179,217,252,218,179, 46,182,178,179,
+179,239,200,229,242, 93,179,102,205, 26, 53,115,230, 76, 17,203,178, 72, 74, 74, 2, 8,130, 19,137, 37, 32, 73, 18, 34,145, 16,
+197,197, 26, 86,225,169,202,178,114, 2,133, 72, 44, 1, 41, 16, 87, 54, 77,248,161, 45, 24, 41, 72,161, 88,107,159, 9, 40, 22,
+139,113,117,207, 50, 77,247,113,243,149, 0, 32,150,202, 11,251,244,233,147,214,188,121,115,253,111,191,253, 86, 15,229,103, 29,
+ 58, 63,159,244,144,113,177, 2,133, 92,166,143,138,138,122,104,231, 76, 61,181, 70, 51,102,242,108,130, 16, 72,244,209,209,209,
+105,145,145,145,122,129, 64,128,196,131, 75, 52, 67,198,197,202,136, 74,130,172,158,184,199,189,117, 99,207,133,166, 95,124,241,
+ 5,213,191,127,255, 71,118,127,177,212,212,212, 58, 3, 6, 12,144,174, 88,177,130, 26, 48, 96, 64,250,139,255,207,222,117,199,
+ 53,113,254,225,231, 46,155,189, 71, 16, 68, 69, 81, 20,112,139, 11,197, 58,107, 29,173,226,194,189, 71,157,173,179, 14,220, 74,
+221,168,117,214, 90,220, 84,171,162,214, 81, 23, 42, 46, 16, 7, 67, 69, 1, 25, 97, 67,128,144,157,187,223, 31, 36, 52, 32, 35,
+ 65, 91,107,127,121, 62,159,124,146,220,189,247,220,123,251,185,239,251, 29, 94, 94,197, 36, 73, 34, 50, 50,210,185, 58, 75,149,
+ 6, 70, 70, 70,138, 9, 19, 38,188,123,254,252,121,109,163, 14,171,133,139,139, 11, 40,138, 66,183,110,221, 32,145, 72, 12,150,
+ 45, 3, 12,248,111,162, 98, 30,173,170, 51,195, 43,148,138,111,167,204, 94,185, 19, 32, 76,181,238, 2,127, 25,150,104, 16,223,
+127,255,157, 9, 0, 35,141,216,154, 59,119,110,141,101, 78,180, 68, 86,155,128,128, 0, 44, 94,188, 24,155, 55,111, 86,253,248,
+227,143,140,248, 87,137,242,177,211, 87, 20, 84, 88, 15,104,208,197,148,130,250,182, 50,190,124,161,104,133,239, 87, 27, 86,166,
+101,150,220, 25, 59,109,105,217,221, 75, 5,160,144,224,171, 0, 96,207, 79, 63,137, 88, 92,115,147, 33,195, 71, 1, 64,207,157,
+219,130,206,172,193,129,154,197, 22, 77,120,124, 59,119,129,149, 70,100,237,218,186,246,185, 5,145, 25, 60,243,187, 24,133,246,
+122, 0,192,218, 12,103,124,191,218,208, 59, 43, 79,180,221,112,158,253,115,224,112, 56,171,175, 95,191,110,226,237,237, 77,228,
+230,230, 66,165, 42, 61, 34,114,185, 28, 66,161, 16, 69, 69, 69,144, 74,165,104,221,186, 53,185, 99,199, 14,147,153, 51,103,174,
+150,201,100,211, 63,247,237,126,251,246,237,174,115,231,206,225,214,173, 91,195, 22, 45, 90,196,114,116,116, 36, 44, 44, 50, 9,
+133, 92, 6,128,166,179,179,179, 41, 99, 83, 75,129,173,131,243,187,244,140, 44, 15,133, 92, 6, 74, 37,175,210,219, 92,157,222,
+225,251, 23, 47, 94,212,219,180,105,147, 76, 59, 18,112,248,130,157, 59, 90,183,110,109, 29, 28, 28, 44,235,215,175, 95,178,198,
+121, 93, 23,103,248, 43,111, 48,251,197,139,103,205, 42,114,250, 77,222,116, 80,195,169, 29,141,216,255,187,189, 7, 27, 53,106,
+100,237,233,233,153, 92, 29,111,131, 6, 13,196,124, 62, 95,214,164, 73,147, 98, 22,139, 85,106,201, 82, 40, 74, 26, 52,104, 64,
+ 57, 56, 56,200,154, 54,109, 90,172,175,211,190,145,145, 17,173,177,138, 85, 6,125,162, 14, 89, 12, 40, 3, 2, 2,202, 50,195,
+127,223,168,145, 96,212,168, 81,252,121,243,230,225,224,193,131,184,123,247,238,123, 98,191,107,215,174,184,125,251,246, 74,252,
+135, 18,235, 26, 96,192,255, 25,170,207,163, 85, 17,135, 14,133,252, 9, 45,159,166,202,176,102,205, 26,174,218,146,213,115,206,
+156, 57, 16,139,197, 86,149, 52,235, 1,117,174,141,202, 68, 86, 80, 80,208, 49,154,166,157, 1,116, 86,169,168, 7,251, 15, 28,
+234, 86,213,250,134, 12, 25,242, 30, 39, 77,144, 12,146, 36,138, 57, 44,250,201, 79,251, 14, 30, 41,215,190,212,249,189, 49, 8,
+ 60,221,185, 45, 72, 12,160,103, 69,177,133,191,202,140,148,113,106, 48,117,218,212, 50,145,181,115, 91,208, 85,207, 54,117,191,
+ 89, 58,113,117,165,226,108,245,138, 41, 38, 36, 73,116,172,224,163,245, 30,231, 71,128,129,243, 47,116, 11, 8, 8,104,238,227,
+227, 67,106,139, 44,153, 76, 86,150,184, 83,227, 44,158,150,150,134,174, 93,187,146,205,155, 55,247,122,248,240, 97, 55,252, 85,
+206,233,115,221,118,213,219,183,111,119, 56, 58, 58, 94, 91,190,124,249,168,156,156,156,175,242,243, 11,108,194, 14,173, 70,159,
+ 33,211,136,174,125, 71,136,100, 52,147,151, 42,200,108,114,243,226, 81,235, 75, 39,118, 65, 46,147, 77, 1, 16,135,191,210, 59,
+ 84,228, 44,209,164,113,104,210,164,137, 72, 91,168,212,173, 91, 87,226,228,228, 36,245,244,244, 44,155, 94, 69, 52,223,123,219,
+174, 47,167,218,255, 75, 84,211,254,212,136,182,138,105, 35,140,141,141,161, 17, 95,250,244, 83, 59,218,178,210, 27,101,205, 81,
+135,101,156,234,244, 14,229,116, 90, 72, 72, 72,143,144,144,144, 54, 0,158,160,180,214,161, 2, 40, 29, 74,212,114,154, 15, 84,
+127, 12,215,187,129,243,255,149,243,115, 70, 87,252,229,155, 5,148,250,106,221,170, 82,104,213, 4,141,227, 59, 0,114,238,220,
+185,249, 98,177,216,106,212,168, 81,213, 46,147,145,145,113,240,240,225,195,229, 68,214,160, 65,131,198,133,134,134, 94,203,202,
+202,170,213, 86, 89,153, 27,173,185,117,126,161, 85,215,126, 27,230, 0,248,177, 10, 67, 30,229,217,134,255,205,206,109, 65,103,
+ 42,136,173, 95, 1, 12,170, 74,149,246,250,114, 32,142, 30,218,169,241,237, 50,122,254, 56,237,210,176,168, 85,149, 70, 43, 90,
+154,114, 87,169,251, 49,207,224,163,245,207,128,205,102,251, 45, 90,180,136, 45, 18,137,222, 19, 89, 21,133, 86, 97, 97, 33,158,
+ 62,125,138,177, 99,199,114,163,163,163,253,228,114,249,141,255,194, 62,200,200,200,136, 87, 39, 35,157,173, 73,225,192,229, 25,
+177, 71,140,159,227, 92, 22,117,120, 98, 23,164, 18, 49, 0, 48,117, 73,239,192,100, 50,217,209,209,209,174, 26,171,149, 92, 46,
+231,106,166, 63,126,252,216, 85,147, 91, 75, 34,145,232, 28,117,248,119,113, 62,123,246,204, 89, 19, 29,169,137, 46,100, 50,153,
+236,200,200, 72,103, 13,167, 84, 42,213, 41,234,144,195,225,176,163,163,163,157, 85, 42,213, 71,139, 58,212, 22,198, 40,173,179,
+ 88,174,214,162,218,183,140, 32, 8,130, 54, 12, 27, 26, 96,192,103,143,138,145,146,213, 23,149,174, 9, 26,199,119, 61, 22, 97,
+186,184,184,244, 26, 62,124,120, 57,145,229,239,239,175, 58,125,250,244, 77, 62,159,159, 73,146,100,188,190,253, 40,243,209,194,
+123,111,144, 32, 73,242,105,231,182, 77, 65,146,228,211,165, 19, 39, 74,215,224, 64, 57,177,117,246,204,201,222,169,249, 49,149,
+ 75, 51, 0, 54,246,117, 16, 48,238, 91, 4,140,251,214, 10, 64, 39,160,234,104,197,234,250, 97,192,223, 3,130, 32, 56, 78, 78,
+ 78,207, 37, 18, 9, 8,130,128, 84, 42, 45, 19, 88, 69, 69, 69, 16, 10,133,101,255,229,114, 57,178,179,179, 81,183,110, 93, 16,
+ 4,241,159,246,163,147,203,229,202, 69, 43, 55, 29,102, 48,217, 74,138,146, 19,114,185,124,188, 62,215,249,162, 69,139, 72, 84,
+226,123, 53,115,230,204, 74,167,127, 42,206, 37, 75,150, 84, 26, 37, 56,115,230,204,106,163, 7,171,194,119,223,125,247,209,162,
+ 14,117,191,125, 25, 96,128, 1,255, 49, 84, 26,186, 87, 43,161, 69,146,228,211, 74,162, 11, 9, 0, 52, 73,146, 79, 43,201,114,
+160,124,247,238,221, 74, 75, 75,203, 41, 34,145,232,143, 65,131, 6,205,245,247,247, 87, 1,165, 14,242,181,221,162,124,161,104,
+133, 95,255,141,243, 10,138,165,193, 21,231, 85,180, 60,105,196,214,174,237, 65,187,207,132, 30,247,207, 72, 79,221, 93,213,182,
+ 85, 37,168,170,138, 86, 20, 22,138, 87,250,245,223, 56, 39,191, 80,108,240,209,250,135,160, 82,169,174, 24, 25, 25, 17,154, 98,
+202,218,214,171,194,194, 66,148,148,148, 64, 93,146, 6, 0, 80, 92, 92, 12, 11, 11, 11,168, 84, 42,250, 63,182, 43,164, 0,230,
+171,173, 85, 0, 48, 63,241,230, 14,237,115,251,153,246,188,106,172, 89, 2, 93, 10, 68, 87,182, 92,117,243,254, 6,206,204,106,
+ 10, 68, 87,135, 76, 61,249, 50, 1,128,205, 98,100, 85, 85, 60,154,205, 98,100, 85,227,183,175,231,123, 3, 65, 3, 88,105,184,
+178, 13, 48,224,243,125,255,255, 84, 43,238, 97,224, 52,112, 26, 56,255, 17, 78,174,250,163,235, 60,195,254, 52,112, 26, 56, 13,
+156,255, 54,206,202, 48,249, 51, 17, 90,116, 37, 31, 0,181,180,104, 25, 96,128, 1,255, 58, 72,107, 57,207, 0, 3, 12, 48,192,
+128, 15,199,123,197,164,181,103, 84,165, 74,245,137, 38,168,141,178,189,102,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243,
+255,142,179, 38,110,237,229, 39, 3,216,247,153,136,173, 79, 18,208, 98, 48,171, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,
+224,172, 45, 12, 67,135, 6, 24, 96,128, 1, 6, 24, 96,128, 1,255,231,208, 47, 97,169, 1,149,160,238,192,165,160,176, 68,189,
+ 59,131,144,114, 54,240,191,182,137,254,254,254, 12,125,218, 39, 38, 90,146, 81,224,111, 54, 55, 97,247, 47, 22, 41, 54, 83, 81,
+ 43,130,107, 58, 17,109, 27,180, 26,109,204, 51,158, 46,147,201,234,155,154,153,101,229,229,102,239,201,123,247,108,151, 86, 27,
+243, 7, 15, 30,240,125,124,124,210, 1, 20,105,189, 41, 24, 96,128, 1, 31, 19,150, 77, 93, 64, 16,227, 1,250,175,176, 75,138,
+142,129, 48,238, 80,185,118, 22, 30,227, 64, 18,205,180,166,136, 65, 99, 63, 10, 98, 83,106,120,224, 88, 38, 36, 36,184, 54,108,
+216, 48, 25, 64, 65,197,181, 87, 50,207,112,157, 27,240, 57,163, 43,202, 39, 44, 45,187, 22, 62, 92,104, 53, 26, 84, 31, 74,114,
+ 12,104,140, 4,129,104, 36,134, 14,174, 21,143,219, 55,117, 64, 49,219, 1,104, 5,208,173, 76,140,120, 45,197, 50,121, 22, 69,
+211,163,241,230,228, 19,189,249,234,251, 79, 67,213,229, 44, 86, 34, 49,244, 39,189,248, 40,250,135, 71,183, 79,115, 45,141, 9,
+ 52,108, 61,104, 1,202,103,112,174, 45, 56, 0,124, 73,146,108,102,108,108,204, 47, 41, 41,201,166, 40, 42, 5,165,227,211,249,
+181,228, 36, 1, 76, 48, 53, 49,233,227,106,198,105,245, 46, 71,152, 86,164, 80,133,163, 52,161,107,254,199, 58,163, 74, 69,150,
+227,190, 57, 35,124,198, 6,205,234, 1, 75,191,141, 11, 74,128,234,132, 22,225,220,184,227,217, 97,195,135,248,205,152, 60,214,
+180,142,157, 41, 4, 57, 34,155,159, 14,134,108, 10, 9, 57,218,111,226,176,158,125, 0, 96,245,234,213, 95,187,184,184,212, 99,
+ 48, 24,137,203,150, 45,251,117,197,138, 21, 52, 81,117,165,114,190,250, 28,214,220,240, 77, 0,120, 2,104, 0,224, 45,128, 23,
+ 40,159,101,188, 54,248, 44, 56,235,212,169,227, 68, 81,212, 68, 7, 7,135,175, 50, 51, 51, 47,144, 36,121, 32, 45, 45, 45,253,
+ 83,222,117,104,154,222, 75, 16,196,100,154,166,247,233,241, 61, 69,159,117,240,120,188, 76,137, 68, 98,175,254,157, 37,145, 72,
+ 28,254,174,237,249, 39,215,245, 15,189,127, 79,186,114,231, 69, 31,237, 73,189, 58, 55,171,228,142, 66, 52,187,114, 39,166, 75,
+249,118,158,170, 42,238,129, 4, 77,211, 88,185,114, 37,177,106,213,170,113,110,110,110,141, 72,146,124,185,124,249,242,114,169,
+111, 42,206,211,186,206, 13, 98,203,128,207, 21,250, 21,149,174, 17, 77,253, 77, 32,161,253, 1, 98,108,215,182, 45, 59, 79, 25,
+221,159,160, 25, 60,140,152,180, 80,169, 55,151,235, 88, 46, 24,226, 53,222,205, 26,207, 29,210,191, 7,217,198,179, 30,248,118,
+ 22, 0,201,194,222,139, 73, 54,193, 65,203,118, 3,240,169, 69, 47, 87,188,137, 56,102, 47, 40, 80,129, 32, 0,130, 0, 72, 2,
+ 40,150, 80,232,245,245,152, 21, 0,126,210,243,174, 68, 90, 26, 19,152,123, 76, 2, 0,140,143,112, 80,234,217,217,217,141,155,
+ 61,123,182,137,167,167,167, 37,143,199,227, 72, 36, 18,135,132,132, 4,187,101,203,150,121,138,197,226,243, 0, 30,233,201, 89,
+183,161,179,211,201,224,185, 19,218, 53,111,224, 10,150,172, 24,148, 84,228,242, 42,225,117,135,169,187, 79, 77,138,201,147, 12,
+ 71, 45, 74, 38,228,228,228, 16, 0, 96,107,107, 75,151, 23, 89,237,199,110,157,215, 11,115,183, 92, 65,137, 68,118,164, 58, 14,
+235,122, 45, 70,125,243,205, 64,191,181, 63,204, 52, 77,203,149, 35, 58, 81, 12,107, 83, 54, 86,204,159,198,145, 74, 21, 29,118,
+255, 26, 50,121,231,134,133,251, 85, 42,213, 23, 0,218,168, 84,170,199, 0,126, 93,185,114,101, 85, 55,223, 85, 0,150,168, 79,
+232,163, 12, 6,227,106,183,110,221,234, 79,156, 56,145,104,221,186, 53, 34, 35, 35, 27, 28, 59,118,172,199,133, 11, 23, 18, 85,
+ 42,213, 51, 0, 47,161, 46,123,162, 3, 88, 0, 26, 51, 24, 12,239,127, 51, 39,159,207, 55,146,201,100, 99,156,157,157, 39,119,
+236,216,209,187,127,255,254, 68,227,198,141, 17, 31, 31,223,250,210,165, 75, 43,194,195,195,159,165,166,166,238,227,112, 56,135,
+ 5, 2,129,248, 31,127,142, 19,196,100, 0, 78,106,157,188, 82,135,239,116,148,230,146, 18,232,186, 14,137, 68, 98,175, 41, 97,
+ 67, 16,132,253,223,185, 61,122,174, 43,150, 32, 8,107,117, 91, 84,247, 77,146, 36,148, 74,165, 72,165, 82,185,213,192,217, 88,
+253, 34,165,179,214, 5, 80, 93, 34,104, 35, 0,232,213,169, 89, 30, 8,196,148, 89,180,222,127,201,140, 41, 19, 96, 52,154, 93,
+185, 27, 99, 93,206, 10, 86,241, 45,118,229, 74, 98,197,138, 21, 8, 12, 12,236, 15,192,151,162,168,112, 15, 15,143, 29,229, 40,
+ 41,170,108,222,138, 21, 43,182, 87,115,157, 27, 96,192,231, 2, 63,232, 83, 84,186,202,247, 31,183,193, 93,160,194, 88, 87, 27,
+123,255, 89, 19,135, 26,121,122, 52,132, 4,166, 72,202, 81,225, 98,216, 37, 0, 56,161,159,213,105,104, 27, 38, 83,114, 56, 40,
+112,126, 19,223,118,158,120,158,166,192,227, 52, 21, 74, 18, 21, 96,144, 10,168, 40, 26,160, 33,169,237, 86,167,230, 43,113,231,
+165, 12, 36, 1, 48, 72,128, 36, 9, 48,200, 90,146, 81,178, 87,171, 15, 69,121,230,100, 82, 0, 37,123,245,129, 7,164,153,187,
+187,251,168, 85,171, 86, 89,102,100,100,152, 68, 70, 70,130,203,229,194,202,202,138,193,231,243,157,182,108,217, 34,158, 53,107,
+214, 87,114,185, 60, 9, 64,142,142,156, 30,125,219,120,223,219, 23,180,218, 66,241,224, 18, 10,142,255, 6, 6, 73,131,109, 98,
+138,250, 70, 70,184,244, 77, 67,107,255,176,196,211, 15, 51, 69, 30, 0,210,106, 34,139,139,139, 99, 72,165,210,225,230,230,230,
+237, 89, 44,150, 3,207,170, 30,149,206,108,147,155, 77, 52,120,155,101, 95,210,101, 94, 15,135, 62,155,231,116,195,220, 45, 87,
+176,237,216,253, 95, 90, 33, 99,121,117,121,179,141,141, 77,167,204,154, 62,209, 52, 53, 71,142, 53,167,115,112,232,118, 33,198,
+248,154, 97,238,151, 22, 8, 24, 49,204,228,212,111,161, 83, 0,236,215, 90, 36,222,195,195,131,136,139,139,171,236,230,107, 5,
+ 96,161, 76, 38, 35,217,108, 54,193,227,241, 70,173, 93,187, 86, 62, 98,196,136, 84, 77, 3, 95, 95, 95,248,250,250, 18, 69, 69,
+ 69, 13,110,220,184,209, 32, 36, 36, 68, 25, 17, 17, 17, 11,224,108,213, 22, 11,163,119, 18,137,216,133,103,100, 84,242,211,238,
+221,155,187,116,233, 66,113,185,127,165,159,170, 13, 39, 0, 88, 88, 88,236,183,183,183, 39, 22, 47, 94,156,254,177, 56,235,213,
+171,119,165, 93,187,118,221,122,245,234,197,236,212,169, 19,156,156,156,202,230,217,218,218,194,215,215,151, 72, 73, 73,105, 30,
+ 30, 30,190,251,202,149, 43, 59,158, 60,121,114, 35, 41, 41,169,215, 63,108,209,218,167, 22, 19, 2, 61,219,127,246, 32, 8,194,
+116,239,222,189,246,154,154,140, 10,133, 2, 42,149,170,236, 91,243,161, 40, 10, 42,149, 10,107,215,174, 85,137, 68, 34, 93,246,
+145, 72,235,173, 89,243,161, 42,251,230,112, 56,182,154,132,189, 53,220,217, 99,248,220,130,166, 38, 38, 38,174, 0,250,194,174,
+209,194,242, 13, 74,223,159, 69, 34, 81,178, 64,106, 25, 3,160, 75, 53,108,150,171, 86,173, 26, 19, 24, 24, 56, 80,203, 74,235,
+ 61,100,200,144,138,101,175,188,213,223, 34,130, 32,110,146, 36,121, 30,192, 33,124, 68,171,187, 1,255, 45,208, 52,221, 22,128,
+157,214, 36, 25, 74, 71,133,160,126, 78, 18, 0,108, 42, 76,215,110,167,249,206, 86, 79,183, 83, 47, 71,107,241,102, 19, 4,241,
+168,150, 93,188,133, 42,252,180,152, 0, 16, 22, 22, 70,247,235,215,143,208,124, 87, 46,138,252, 47, 78, 24, 49,160,207, 87,221,
+ 59,130,228, 89,225, 85, 22, 16,241,142, 6,147, 84,128, 4,141, 7,119,111,208, 96, 82,135, 43, 44, 85,181,245,164,222,224,239,
+188, 61, 61, 54, 30, 8,154,205,136,205, 98,226, 80,120, 9,228,146, 98,100,103,188, 67, 86,122, 50, 4,169,111,145,246,238,237,
+ 51,128, 88,161, 51,231,123, 7, 6, 80, 81,234,119, 64, 10,168, 38,242,178,102, 78,185, 40,174, 65, 99, 79,207,124,142, 10,144,
+139,226,116, 88,125, 85,156, 94,141, 26, 53, 26,241,195, 15, 63, 88,191,120,241,194,168,164,164, 68,122,233,210,165,248,164,164,
+ 36,115, 62,159,159, 55,109,218,180, 70, 78, 78, 78,230,131, 6, 13,226, 28, 63,126,252,107,148, 15,107,173,138,211,115, 64,251,
+150, 17, 7,119,108, 53,201, 61, 21, 12, 89,194, 83, 92, 20,136,112, 55,179,132,110, 96,193, 37,190,109,110, 7, 83, 46, 19,171,
+ 59, 57,153,246, 61,147,176, 81, 65, 81, 1,213,113,222,187,119,143,111,108,108,188,101,228,200,145,252,153, 51,103,114, 85, 76,
+ 75,102,104, 68,174,197,194,221, 17, 78, 37, 82, 57, 99, 68,183,122,152, 55,210, 27,243,182, 93,215,136,172,201,245,235, 23, 80,
+ 81, 81, 85,115, 42,228,242,250,206,246,230,136, 78, 18,227,208,237, 66,252,249,131, 19,186,175, 77,199,160, 86, 76,120,212, 53,
+133, 82,174,104, 60,100,200,144,195,234,183,246, 71, 0,190, 30, 50,100, 72, 19, 6,131,113, 29,192,239, 53, 29, 35, 30,175,242,
+234, 41, 86, 86, 86,232,218,181, 43, 60, 60, 60,152, 93,186,116,241,174, 32, 96,202,113,202,229, 50, 62, 69,209, 48, 51, 51, 51,
+178,177,177,177, 50, 51, 51,203,173,236, 65,165, 15, 39, 0, 88, 91, 91, 15,238,218,181, 43,243,216,177, 99, 57,137,137,137, 15,
+ 70,140, 24,241,214,220,220,188,156,245,215,196,196, 4,141, 26, 53,194,178,101,203,152,125,250,244,169,145,211,193,193,161,103,
+ 72, 72, 8, 8,130, 40,123,104,191,103, 44,118,117,133,163,163, 35,250,246,237,203, 28, 60,120,112,207,164,164,164, 90, 93, 71,
+122,224, 90, 37, 22,173,149, 21,142, 83,149,195,111,149,181,215,225,184,103,105,172, 75,106, 62,124,192,181, 89,237,112, 39,143,
+199, 43,179, 66, 85,178,174,247, 56, 73,146,196,210,165, 75, 65, 16, 4, 88, 44, 22,216,108,118,165,223,126,126,126,250,246, 51,
+133, 32, 8,146,205,102, 47,100, 50,153, 19,165, 82,169, 51,143,199, 75, 87,169, 84,191, 72,165,210,181, 0, 20, 52, 77, 91, 86,
+ 33,178, 42,229, 52, 49, 49,113,125,245,234,149,123, 85, 29,145, 74,165,240,246,246, 6,164,136,173,142, 51, 33, 33,193,213,205,
+205,173, 49, 0, 77,137,182,219, 52, 77,119,209,250,175,141,219, 52, 77,127,169,254,253,242,205,155, 55,174, 13, 27, 54,204,255,
+167,206, 79, 3,231,191,143,179, 6, 45, 98, 71, 16, 68,152,113, 48, 25,151, 0, 0, 32, 0, 73, 68, 65, 84,214,181,218, 79,243,
+127,209,162, 69, 75,214,175, 95,255,130, 32,136, 48,237,233,218,237,180,191,213,247,155, 48,154,166,251, 45, 94,188,216,115,195,
+134, 13,235, 52,109,255, 14,145,168,143, 69,203, 60, 91, 98,130,240,119,230, 96, 50, 84, 96,146, 4,152, 12, 0, 52,129,228,164,
+ 4, 20, 21, 22,220, 65,226,233, 68,221, 44, 89,254,157, 90,180,240, 10, 58,186,109, 1,249,115,120, 9, 10, 68, 18,196, 61,185,
+137, 71, 55,127,207, 80, 41, 85,191,131,160, 31, 3,100, 36,222, 82,241, 64,104,237,106, 92, 16, 52,179, 84,104,169,197, 85, 57,
+177,245,201,208,188, 73,147, 38,195,150, 45, 91,102, 27, 21, 21,197, 19, 10,133, 69, 71,143, 30, 77,151, 74,165, 73, 0, 46, 39,
+ 39, 39, 55,217,190,125, 59, 39, 40, 40,200,203,203,203,139,127,242,228, 73, 89, 37,229,140,222,227,156, 63, 54, 32, 98,226,172,
+ 57,188,216,147,187,192,137,141,196,210,167, 57,170, 63, 5, 37, 63, 0,216,134,148,226, 78,217, 18,229,213,173, 93, 93,200,122,
+102,108, 52,180,228,248,197,229, 73,170,181,100, 25, 27, 27,111, 9, 9, 9,113,109,219,182, 45, 9, 0,225, 47,149,220,133,187,
+ 35,156, 46,175,239, 68,116,106,102,131,172, 2, 41,102,239,138,198,165,136,172, 63, 52, 34,171,166, 78,154,153,153,101,167,102,
+ 21, 58,216,152,242, 48,186,179, 41,186,175, 77,135,127, 27, 46,184,108, 2,241,137, 25,104,232, 86,143,136,190,115,182,141, 90,
+100,181, 21, 8, 4, 0,208, 6, 64, 98, 74, 74, 10,223,199,199, 71,168, 69,151, 15, 96, 35,135,195, 89, 74, 16, 4,221,182,109,
+219,104, 47, 47,175, 98, 43, 43, 43,136,197, 98, 72,165, 82,176,217,108,136,197, 98, 36, 39, 39,227,193,131, 7,176,178,178,210,
+235, 64, 21, 23, 23,195,204,204, 12, 20, 69,125, 48,167, 74,165, 34,246,236,217, 99,242,226,197, 11,147,208,208, 80,135,185,115,
+231,230, 54,109,218,244,241,176, 97,195, 94,219,219,219, 75,159, 62,125,138,123,247,238, 33, 63, 63, 31,237,219,183,215,137, 83,
+ 38,147,129,201,100, 66, 44, 22,131,203,229,130,201,100, 66,169, 84,130,162,168, 50,241, 85, 92, 92,140,188,188, 60,176,217,108,
+200,100,178, 79,241, 6,250,158,133,170,186,225,183,218, 88,180,180,133,154,142, 34,171, 38, 75, 84,149,195,157, 5, 5, 5, 70,
+150,150,150, 11, 1, 8,106, 90, 23, 65, 16, 96, 48, 24, 96,179,217, 32, 8, 2, 93,186,116,193,132, 9, 19,208,170, 85, 43, 36,
+ 36, 36,224,248,241,227,120,244,232, 17, 88, 44, 86, 89,123,157,199, 39,252,252, 24, 60, 30,239,222,128, 1, 3, 60,127,248,225,
+ 7, 94,189,122,245, 16, 27, 27, 91,119,195,134, 13, 11,175, 93,187, 54, 80, 36, 18,181,209,220,237,170,183,210,171,135, 4, 75,
+135, 11,251, 74,165, 82,196,198,198,234,179,204,123,104,216,176, 97, 50, 73,146,175, 41,138, 10, 7,224, 77,211,116, 23,130, 32,
+ 46,161,212, 47, 81, 27, 34,154,166,191, 36, 8,162, 16,192, 51,146, 36, 95, 82, 20,149,108,176,219, 24,160,195,125,165, 95,197,
+255, 4, 65,132,173, 95,191,190, 95,101,226,170,146,107,179,220,244, 13, 27, 54,172,211,250,255, 33, 22,213,174, 40,239, 12,239,
+167,182,114,253, 37,180,194,194,194,170, 87, 32, 20, 6,133,157, 62,118,191,187, 28,174,158,173,125,181,172, 67, 52, 34, 31,220,
+ 3, 64,255,162, 83, 87,248,253,140, 72, 6,243,151, 61,235,102,146,123,111,150, 32, 37, 61, 11,247, 46,254,130,108, 65,210, 33,
+128,158,139,196,208,194, 15, 62, 18,245, 6,121,217,219,216, 90, 74,228, 52, 40, 26,192,123, 98,235,147,160, 85,227,198,141, 7,
+ 71, 68, 68,216, 74, 36, 18,222,157, 59,119, 74, 66, 66, 66, 50,228,114,249, 77, 0,119,213,109,162,178,179,179,135,168,133, 9,
+131,201,100,114,228,114,121,117,190, 11,173,230, 79, 28,115,103,227,158,131,188,215,207,163,177, 61,244, 34, 10, 74, 74, 84, 55,
+179,196, 95, 3,208, 40,250,235, 81, 57,226, 52, 26,180, 11,139, 36,192, 55, 97, 57,198,229, 73,120, 64,229, 67,178, 82,169,116,
+196,200,145, 35,249, 26,145, 5, 0, 57, 69, 10,102,137, 84,193,232,212,204, 6,173,187, 13, 65,228,141, 83, 56,121, 59, 13,110,
+118,198,183,235,155, 20,232,180, 71,179,179, 4,123,182, 6,239,221,186,113,229,124,206,188,190, 22,240,111,195, 2,143, 77,192,
+220,152,133,181, 59,246, 43,162, 30,220,126,202,231,243,195, 0,124, 45, 16, 8,192,231,243,139, 1,188,100, 48, 24,137, 42,149,
+170, 50,167,238,229, 0, 28, 14, 31, 62, 76, 42, 20,138,226,132,132, 4, 56, 58, 58,194,193,193, 1, 22, 22, 22,136,139,139,195,
+159,127,254,137,248,248,120, 80, 20,133, 22, 45, 90,232,117,176,114,115,115,241,244,233, 83,244,237,251,213,220,236,236, 44,115,
+ 43,107, 27,209,157,240,219,155,106,195, 73, 81, 20, 1, 0,158,158,158,240,244,244,228,165,165,165, 57,135,133,133,217,175, 89,
+179,230,157,171,171,235, 81,177, 88, 92,206,114,160,171,208,210,136, 11,141, 8,228,241,120, 96,179,217, 40, 44, 44, 68,102,102,
+ 38,138,138, 74,131, 54, 45, 45, 45, 63,137,208,170,194, 66,245,209,218,255,205,226,240,189,225, 78, 75, 75,203,145, 0, 22,234,
+184, 45, 80, 42,149, 96,179,217,240,241,241, 65,112,112, 48, 30, 61,122,132,223,127,255, 29,117,235,214,197,216,177, 99, 65,146,
+ 36, 94,188,120,161,111, 23,169,136,136,136,133, 95,127,253,181,231,225,195,135,121,201,201,201,136,143,143,135,165,165, 37,130,
+131,131,185,147, 39, 79,110,120,227,198,141,229, 40, 13,126,169, 30, 90,209,133, 34, 35,254, 80,111,111,239,247,154, 56, 58, 58,
+ 90, 92,190,124,217,190, 76,128, 85,140, 72,124, 31, 5,203,151, 47,223,234,225,225,177, 77, 61, 92,232, 11,192,132,166,105,191,
+208,208, 80, 2, 0,252,253,253,105,130, 32, 52, 15,164,103,167, 78,157,234, 22, 23, 23, 71, 7, 6, 6, 26,124,180, 12,168, 74,
+139, 76,214, 92,147, 85, 9, 40,125,132,154,182,197, 75,131,197,139, 23,123,174, 95,191,254,225, 7,138, 44,237, 55, 38, 90, 35,
+182,202, 30,166, 85, 14, 25,150,217,190, 72,190,163,189,141,245,162,177,157, 64, 81,128, 82, 5, 40, 85, 52, 68, 37, 98,196, 62,
+127, 84, 2, 30, 17,170, 83,119,184,156,160, 53, 63,204,105, 16,157, 74, 34, 61, 95,142, 91,103,247,210,217,130,164,193, 72, 60,
+ 53,254,227,136,172,161,222,142, 14,246,183,142,237, 93, 77, 62,122, 43,131,138, 42,213, 89, 20, 69,151,253,254, 4,112,180,179,
+179, 11,184,127,255,190, 29,151,203,229,189,122,245,138, 58,117,234, 84,190, 92, 46,191,166, 37,178, 0,160, 83,155, 54,109,148,
+166,166,166, 16,137, 68,114,185, 92, 46,169, 70,100, 57,251,181,106,126,123,227,158,131, 60,137, 76, 6,161, 88, 10,134,141,125,
+ 69,145, 5, 0, 29,187,185,215,169, 67,240,204, 64, 3, 72, 42,148,167, 87, 37,178, 0,128,203,229,246,152, 57,115,102,185,186,
+120,182,102, 44,165, 49,151,165,186, 27,147, 67, 69,222, 56,133,240, 23, 57, 20,143,205, 80,217,209,111, 27,232,186, 3, 10, 82,
+ 99,246,252,126, 46,236,234,119,203,130,138, 75, 68, 69,112,115, 50, 66,113,145, 16,107,215,111, 84, 68, 68,132,223, 92, 56,119,
+106,135, 83,167, 78,109, 64,169, 51, 56, 0,188, 60,117,234,212,152,101,203,150,253,138,191,210, 60, 84, 68,122, 64, 64, 64,106,
+179,102,205,132, 30, 30, 30,194,220,220, 92,196,196,196, 32, 63, 63, 31,219,183,111, 71,108,108, 44, 52, 22, 65,157,124, 85,222,
+ 23, 72,200,207,207, 51,165,105, 26,249,121,185, 38, 63,252,240,131, 69,109, 56, 85, 42, 85,185,107,171, 78,157, 58,152, 54,109,
+ 26,187,164,164,196,242,221,187,119,230,218,243,116,229,148,201,100,208, 88,134,104,154,134, 76, 38,131, 80, 40,132, 76, 38,195,
+235,215,175,203, 68,150,122,253,159,204,162,165,249,205,227,241, 50, 53,231,178,102, 8,142,199,227,101, 85,213,254, 67,160,181,
+ 46, 90,253, 91, 95,113, 88,227,246,232,120,220,193,102,179, 49, 97,194, 4, 60,124,248, 16, 9, 9, 9, 96, 48, 24, 16,137, 68,
+ 40, 41, 41, 65,207,158, 61,193,225,112,244,181,104,209,108, 54,123,228,146, 37, 75,120,137,137,137,200,201,201,209, 56,211, 67,
+165, 82, 97,238,220,185, 70, 92, 46,119,164,190,166,123,129, 64,208,251,245,235,215,141, 43,126, 50, 50, 50,132,218, 62,133,181,
+ 69,104,104, 40,225,239,239, 79,251,251,251,211, 26,193,101,128, 1,149,161, 10, 45,178,175, 42,139,214,199,176,138,105, 44, 91,
+ 80, 7,136,212, 2, 26,145,213, 85, 75,120, 17, 26, 11,151,110, 67,135,110, 67, 91, 58,216, 88,223, 56,188,107,149,105,216,115,
+ 2,169, 41, 73,200, 22, 36,163, 77, 7, 63,196, 62,143, 6,165, 80,157,198,235,208,154, 61, 57,235,249,187,123,120, 52,157,222,
+181,131, 23,130,194,138,241, 42,242, 50, 10,178, 5, 59,145,116,234,244, 71, 57, 66,174,254,205, 29,236,173,111,252,186,107,149,
+229,165, 24, 18, 41, 41, 73, 56,251,235, 86, 90, 33,151, 22,160,124, 36,151,222,111,205, 70,148,140, 83, 92,144, 9, 89,145, 10,
+ 60,178,132,167,231, 32, 69, 6,128,240,173, 91,183,118,111,223,190, 61, 39, 32, 32, 32, 35, 63, 63,255, 44,128,251, 90,109,154,
+185,187,187,247, 13, 14, 14,118, 72, 73, 73,193,181,107,215, 50, 80, 26,250, 95, 21, 82,111, 71, 63,223,253,231,175,251,231, 27,
+ 53,104,130,237, 75,190, 83,134, 62,138, 25, 0,224,146, 86, 27,143, 30,222,238, 97,107,190,159, 65, 82, 81,127,224,105,114, 38,
+222, 10,165,127, 86, 69,152,147,147, 67,148,148,148,184, 90, 90, 90,106,159,144,224,155,136,164, 11,134,186,167,247, 92,120,199,
+ 73, 34, 87,129,203, 34,233,217, 3, 93,211, 31,158, 13,181,201,145,228, 16,154,104,196,154, 48,105, 88,143,129,187, 66,206,140,
+ 14, 11,187, 48, 93, 46,149,120, 53,105,210,152,126, 28,113,227,233,194,185, 83,251,212,242,136,155, 62,124,248,144,100, 48, 24,
+229, 4,186,182,133, 72, 95, 75,145, 62,208,149,179,162,208,210, 64,169, 84, 18,181,229,148, 74,165,101, 66,171,226,195,189, 50,
+193,248,119,108,191, 62, 22, 42,237, 33, 67,141, 63,157, 68, 34,177, 87,251,108, 57,124, 76,139,214,135, 68, 34, 86, 55,124,169,
+ 79,255, 72,146, 4, 69, 81, 96,179,217,104,209,162, 5,194,194,194, 96,109,109, 13,115,115,115,152,155,155,195,200,200, 8, 54,
+ 54, 54,101, 66,139, 36,117,142,210,161,165, 82,105,221,186,117,235,226,245,235,215,224,241,120,101, 31, 46,151, 11, 79, 79, 79,
+136, 68,162, 58,248,148,182,123, 3, 12,248,123,239, 43, 97,218, 98,137, 32,136,176, 69,139, 22, 45,169, 45,223,162, 69,139,150,
+ 84,102,225,250, 64,193, 85,206,186,197,212, 86,144,149, 42, 73,181,200, 58,180,115,165,249,153, 39, 64,106,106, 34,174,158,220,
+ 81,164,144,203,242, 41, 74,225,250, 54, 62, 26, 32,241,139, 78, 93, 32,233,118, 3,251,118, 35,174,190,144,161,176, 32, 27, 47,
+ 31, 95, 78,130,152,179,248,163,137, 44, 7,219, 27,135,119,173,180, 60,255,156, 64, 74, 74, 18, 46, 29,219, 94,168,144,203,123,
+ 32, 49,244,241,135, 80,143,100,179, 7,178, 93,222,245,155,232,155, 14, 21,161,194,200,216,184, 47,179, 50, 48, 80,112,167,250,
+200, 48,109,100,103,103,159,221,186,117, 43,241,227,143, 63,118,149, 72, 36,191, 1,208, 54, 81,122,185,185,185, 13,223,183,111,
+159,117, 74, 74, 10,235,206,157, 59,162, 27, 55,110,208, 0,206,215, 96,113, 89,208,115,252, 52, 70,171,122,117,102, 70, 37,165,
+ 13, 0,240,135,214,108,207,126,173,155,221, 61,184,126,185,153,226,110, 40,138, 5, 41, 88,124, 55,181, 16,128,206,251, 91,161,
+ 80, 64, 40, 20, 66, 81,156,171,108,195, 23, 9, 3,135,216, 75, 51,243, 37, 76, 22, 85,162,244, 48,207,146,222,200,125,203, 48,
+ 54, 54,214,107, 95,238, 90, 63, 63, 4, 64,200,144, 33, 67, 14, 63,139,184,208,134,207,231, 95,240,240,240, 32, 0,160,138, 8,
+195,170,176, 10,192,220,142, 29, 59, 18, 62, 62, 62, 15,182,109,219,118,165, 58,177, 82, 27,139, 86, 77,208,149,147,162, 40,178,
+138,253, 75,212,150, 83,219,162, 85,147,208,250,148, 22,173,202, 68,139,182, 72,212, 22, 66,255,134,168,195,234,196,148, 62,253,
+211,248,201,177,217,108, 68, 71, 71,195,197,197, 5,114,185, 28,102,102,102, 48, 51, 51,131,169,169, 41,138,138,138,192, 98,177,
+160,231, 54, 83, 60, 30,239, 93, 76, 76, 76, 99, 59, 59, 59,168, 84,170,114, 98,235,213,171, 87, 48, 49, 49, 73,211,215,162,197,
+231,243, 47,171,163, 14,203,193,209,209,209,226, 99,236, 87,109, 75,150,191,191,191, 97,136,208,128,106,173, 89, 85, 88,181,178,
+ 43, 88,162,100, 90,255,179, 81,154,195,173,159,250, 55, 42,249, 45,171,100, 90,238,250,245,235,111,104,249,119,101,127,224, 38,
+104, 82, 60,148,139,112, 97,214,100,201,178,183,182,186,113, 96,123,160,249,201, 72, 32, 45, 37, 17,183, 78, 7, 11,149, 42,249,
+ 23,160,104, 65,196,181,211,161, 32, 80,130,183,161,183,116,187, 69,160, 85,171,166,174,248,253,133, 2,217,169,175, 64,211,212,
+ 33,100,133,148,124,240,209,113, 27,212,194,222,218,246,198,161,224, 64,139, 51,209, 4, 82, 83, 18,113,245,100,112,161, 82, 81,
+210, 29,137,167, 35,107, 75, 59, 1,176, 98,152,240,118, 15,246,107, 53,212,213,205, 25, 20,173, 0,197,166, 49,104,129, 45,243,
+101, 84,201,239,225, 60,225, 73,170,152,154,158,118, 95, 55, 7,186,226,226,226,223, 1, 60, 70,249,244, 10,205, 27, 53,106, 52,
+116,247,238,221,118,169,169,169,188,168,168, 40,241,222,189,123,179, 40,138, 58, 3, 64,151,161,212,239,162,146,210, 14,160,124,
+190,156,230,243,199, 7, 68, 4,140,155,200, 75,188, 22, 2,171,196, 88,124,127, 55, 93,245, 50, 95, 54, 66,109, 93,171, 20,182,
+182,182,116, 78, 78, 78,114, 65, 65, 65, 99, 19, 19, 19,228,230,230, 34, 47, 47, 15, 66,161, 16,210,194, 60,165,141,170, 64, 68,
+ 40,243,192, 98,177,144,149,162,128, 74,165,202,208,213,154, 5,192,106,213,170, 85,147, 40,138,210,100, 68, 44, 23, 93,168,213,
+ 78,115, 62, 52, 30, 50,100,200, 97,173,168, 67,109,103,120, 77,122, 7, 66,157,222,161,253, 31,127,252, 17,215,167, 79,159,212,
+202,196, 10,151,203,213,219, 81,186,170, 40,198,218,112, 86,101,209,170, 56, 93, 31, 78,205,240,165,198, 9,190,226,116, 13, 24,
+ 12, 6, 40,138,130, 14, 65, 21,127,171,104,209,142, 14,172,141,200,169,112,108,170, 77, 28, 90,203, 72,196,143,106,209,210, 28,
+ 11, 54,155,141,115,231,206, 97,220,184,113, 80,169, 84, 48, 54, 54,134,169,169, 41, 76, 76, 76,112,250,244,105,104,210, 63,232,
+163, 95, 21, 10,197,145,245,235,215, 47,217,179,103,143, 17, 77,211,224,112, 56,101, 66, 43, 48, 48, 80, 44,151,203,143,232, 36,
+180, 52, 25,223, 41, 58,198,196, 68, 89,109,212, 97,101,203, 84,225,175,101,185,106,213,170, 49, 20, 69, 13, 68,133, 20, 14, 21,
+218,149, 75,253, 96, 72,239, 96,128, 14,247,147, 71,255,226,238,105, 4, 22,161,101,201, 42, 19, 92,100,117,226,197,206,202,242,
+198,254,237,129,230, 71, 31, 17, 72,124,251, 22, 55,127,219, 81, 42,178,222,156,124,130,228,208, 76, 36,134,118,198,219,208,222,
+ 58,191, 61, 17, 68, 43, 39,123, 75,228,137, 40, 20,230,188, 3,104, 68,125, 12,145,101,103,101,119,227,231,224, 64,139, 83, 79,
+ 72, 36, 38, 38,226,234,201, 29, 66,165, 82,242,197,135,136,172,145,108,246,192, 70,238,206, 9, 75, 39, 13, 28,234,211,208, 17,
+ 54,239,226,112,126,236, 80,172, 62,254, 13,204,236, 24,104,215,215, 12, 19,214, 58, 14,229,123,114, 95,243, 59, 99,160, 30,212,
+218, 34,171, 85,253,250,245,135,222,191,127,223,214,219,219,155, 23, 31, 31, 47,217,187,119,111,150, 88, 44,190, 2, 32, 90, 15,
+ 78,109,145,213,106,209,228,177, 17, 27,247, 31,230,145,108, 14,130,142,156,199,172,219,169,170, 11,201,133, 67, 80,126, 88,177,
+ 82, 72,165,210,107,193,193,193, 82,146, 36,145,151,151,135,156,156, 28,100,101,101,149,125, 23, 20, 20,128,193, 96,224,250,245,
+235,178,194,194,194,251,186,118,240,222,189,123,245,211,210,210, 60, 4, 2, 65, 27,245, 39, 30,165,209,133,166, 90,211,218, 8,
+ 4,130,174, 0, 30,105,166,167,166,166,214,123,240,224, 1,191, 38,126, 51, 51, 51,176,217,236,114, 22, 45, 46,151, 11, 7, 7,
+ 7, 40,149, 74,156, 56,113, 2, 0,242,170,227, 96,179, 57, 2,146, 36, 64,209,148,148,199,227, 81,124, 62,191, 82,129,165, 15,
+167, 26,169, 95,126,249,165, 36, 50, 50,178, 82,139, 86,109, 56,105,154, 46,233,213,171, 23,210,211,211,193,227,241,202, 30,214,
+ 26, 65, 69,146, 36,184, 92, 46, 50, 50, 50, 48,101,202, 20,208, 52, 93,242, 79,223,121,180,125,154,212, 98,136, 0, 64,168,133,
+208,123,126, 90,186,250, 64,105,134, 6,105,154,134, 70,112, 85,152, 95,182, 46, 93,178,183, 87,240,233,154, 92, 80, 80,176,177,
+180, 59,244,222, 10,223,251,244,120, 40,148, 9,173,216,216, 88, 28, 62,124, 24, 5, 5, 5,224,112, 56,200,207,207,199,193,131,
+ 7, 17, 19, 19, 3, 14,135, 3,205,190,208, 85,191,249,248,248,108, 12, 15, 15,143, 25, 49, 98,132, 56, 58, 58, 26, 98,177, 24,
+209,209,209,232,221,187,183,228,238,221,187, 9, 98,177,120, 21,116, 25, 58,212,100,124, 87,151,215,145, 74,165,136,138,138,170,
+244, 83,213, 50, 21,145,144,144,224,170, 82,169, 26,211, 52,237, 75,211,180, 57,212, 41, 28,212,255,181, 63, 95,170,231,153,211,
+ 52,237,171, 82,169, 26, 37, 36, 36,184, 26,228,132, 1,159, 41,110,105,137, 45, 90, 75,100,221,170,222,162, 69,145,193, 7,118,
+172, 52, 63,242,144, 68, 74,114, 2, 30, 95,220, 45, 84, 81,138, 47,244, 44,135,211, 3, 90,185, 54,120, 70, 38, 94, 20, 81, 26,
+206, 92,152,147, 2,208,140,218, 8,173,114,156,160,200,224,131, 59, 2, 45,142, 61, 38,144,158,242, 6,119,207,238, 18, 42,149,
+210,238,120, 27, 26, 85, 27,206,145,108,246, 50, 22,131, 88,218,171, 83, 75,118,231,150,238, 48,201, 74, 66, 70,106, 58, 78,196,
+102,231, 37,228, 75, 39,222, 37,228, 72,126, 35, 61,208,119,146,181,181,149, 35, 11,253,166,218, 88,223, 63, 95,248, 59,193, 18,
+201,105, 57,189, 94,112,183,172, 44, 69,249,126,190, 15, 71, 51, 51,179, 17,143, 31, 63, 54,231,241,120, 70,143, 31, 63,166,246,
+238,221,155, 43, 22,139, 47, 2,136,208,105,219,223,135,115, 91,119,183, 91,235,118,237,231, 21,139, 74, 32,146,201,193,117,224,
+171,206, 68, 60, 31,140,170, 19, 96,150,227,228,114,185,199,142, 29, 59,214,183, 75,151, 46,174, 94, 94, 94,100, 94, 94, 30,138,
+139,139,203,156,171,237,236,236, 16, 27, 27, 75, 37, 38, 38,166,115,185,220,227,186,246,179, 99,199,142,137, 36, 73,198,171,135,
+209,226, 81, 33,186, 80,171,105, 99,129, 64,208,150,207,231,223, 2, 96,172, 21,117,168,205,169, 73,239,176, 4, 0, 73, 16,196,
+163,232,232,232,226, 62,125,250,192,200,200, 8, 34,145, 8,117,235,214,133, 82,169,196,197,139, 23, 17, 25, 25, 41,162, 40,234,
+ 86, 37,226,181, 92, 63, 37, 18,113, 93, 0,164,184,164,164,197,152, 49, 99,186,206,155, 55,175, 92, 72,186,189,189, 61,172,173,
+173,245,226, 4,128,188,188,188,166,127,252,241,199,156,232,232,232,239,250,246,237,107,177,100,201, 18,110,253,250,245,161, 82,
+169,200,218,114,230,231,231, 91, 68, 69, 69,109,234,220,185,243,140, 62,125,250, 48,215,173, 91, 7, 11, 11, 11,168, 84, 42, 24,
+ 25, 25,161,176,176, 16,171, 86,173,194,157, 59,119,148, 52, 77,239, 18, 10,133,223,235,121, 46,225, 67,175,205,170, 44, 64, 85,
+165,100,168,162,253,223,222,207, 10, 62, 93, 80,167,112, 88, 88, 69, 6,123,232,122,206,107,132, 22,131,193, 64, 82, 82, 18,246,
+238,221,251, 94, 30, 45, 77,250,135, 42,184, 43,219,118,250,230,205,155, 42,130, 32, 58, 60,126,252,120,225,232,209,163, 39,138,
+ 68, 34,103, 19, 19,147,116,133, 66,241,139, 88, 44, 94,139, 82,127, 84,182, 62,247, 16,145, 72,148, 92, 89,212, 97,197, 54,128,
+101,181,156, 21,210, 59,148, 75,225, 80, 97,153,114,169, 31, 42, 73,239,240,183, 31,119, 3,231,191,146,243,115, 23, 91, 85, 39,
+ 44,125, 15,173, 38,179, 88, 98,133,119,120, 2,241, 33, 34,235,125,107,137,164, 36, 97,249,177,119, 45,101, 82, 9, 68,194,204,
+151, 72, 58,145,245, 65,155,165,238,231,237, 4, 2, 73,137,111,240, 48,108, 87,105, 63,223,134,214,186,159, 4,176,248,167, 75,
+161,108,194,194, 26, 79,231,140, 67,122,129, 8,151,222,230,159,164, 75,164,211,143, 0,249,184, 3,144, 74,105,248,193, 31, 50,
+118,251, 14,178, 24,106, 91,135,133, 45,243,127, 1,111,145, 13,187, 93,247, 46,250,212, 64,204,224,241,120,225,219,183,111,239,
+225,235,235,203, 29, 50,100, 72,101, 14,242,250, 34,245,209,171, 55, 63, 93,216,179,121,190,141,119,123,236, 92,182, 64,117, 44,
+226,121,197, 40,196,106,225,225,225,161,186,119,239,222,188, 41, 83,166,108,233,209,163,135,211,128, 1, 3, 56,117,235,214, 5,
+151,203,197,155, 55,111, 16, 30, 30, 46,123,251,246,109,122, 73, 73,201,188,230,205,155,235,147,227, 44,127,249,242,229, 27,213,
+235, 32,212,195,133,109,160,142, 46,212, 52, 82, 39, 45,109, 3,192, 56, 48, 48,112, 52, 0, 84, 17,246,189, 28,192, 30, 0, 76,
+154,166, 51, 66, 66, 66, 58,156, 61,123,182,195,220,185,115,217,125,251,246,197,253,251,247,113,245,234, 85,185, 92, 46,143, 80,
+ 11, 87, 93, 75,229, 80, 0,162,148, 74,229,243,160,160,160, 14, 12, 6, 99,185,102, 70, 76, 76, 12, 14, 29, 58, 84, 27, 78, 37,
+128, 77,153,153,153, 63,133,132,132, 44,191,118,237,218,248, 49, 99,198,152, 43, 20, 10,196,198,198,226,231,159,127,174, 21,167,
+ 80, 40,156, 99,107,107,187,244,226,197,139,191, 92,185,114,229,235, 81,163, 70,145,179,102,205, 66,112,112, 48,126,251,237, 55,
+ 74,165, 82,157,101,177, 88, 99,114,114,114, 68,159,226,174,163, 30,134, 75,215,179,214, 97,141,188, 31, 50, 52,168, 35, 4, 31,
+ 74,160,217, 14, 63, 63,191, 50, 43,163,198, 10,167,221,134, 32, 8,189,135, 14, 1, 88,210, 52, 77, 1,216,133,210,250,162,218,
+ 89,225, 25,248, 43,115,188,174,140,205, 4, 82,203, 24, 72, 17, 91,125, 81,105, 75,128, 70,179, 26,216, 10,150, 47, 95,190,117,
+197,138, 21, 91, 43,166,112,208,110, 84, 49,245,195,202,149, 43, 97, 72,239, 96,192,127, 21,149, 11,173,168,125, 10, 69,131,193,
+ 75,182,175, 91,176, 66,169,144, 9,105,200,253,241,230,116,244,135,174,140,166,232, 69,215,143, 6, 6,131, 70, 62,173, 82, 46,
+252,224,222,255, 77,253, 36, 44,172, 81,180,106, 26,126,123,145, 78,103,136, 20,223, 28,145,203,203, 89,131, 74,125,178,168, 97,
+ 55, 36,249, 39,172,156, 88,103,230,124, 97, 67, 92,200, 27,173,247,122,178,178,178,206,109,221,186,149,220,188,121,115,215,146,
+146,146,138, 14,242,181,197,130,254, 51, 23, 49,218, 53,114,157,249,240,117,242, 64,232, 48, 92, 88, 17, 29, 59,118, 20,196,197,
+197, 5, 92,185,114,101,196,237,219,183,123,136, 68, 34, 87,130, 32, 96,108,108,156, 44,149, 74,175,113,185,220, 99,122,138, 44,
+ 0,192,138, 21, 43,232,149, 43, 87, 18,113,113,113, 52,131,193,248, 19, 64, 34,131,193, 72,210,118,130,215,158,174, 89, 38, 48,
+ 48, 80,151, 7,226,237,226,226,226,200, 85,171, 86,117, 89,181,106, 85, 11,181, 85,232, 54,254,242,249,210, 23, 10, 0,183,217,
+108, 78, 58, 65, 16,206,108, 14, 87,116,239,222,189,107, 31,200, 89, 34,151,203, 23,166,164,164,108,217,178,101,203, 90, 19, 19,
+147,182, 49, 49, 49,127,126, 8,167, 90, 68, 13,182,182,182,118, 58,124,248,240,169,131, 7, 15,182,103, 50,153,247, 9,130, 24,
+ 34, 20, 10, 63,105, 81,105,117,129,232,149,122,212, 58,212,137,247, 99, 39, 41,253, 59,132,155, 74,165, 42, 94,186,116,105, 86,
+ 69,225, 85,209,122,165,249,175, 78,229,162,203, 62,213, 39,138,178, 6,225, 66, 20, 3, 64,105,237,194,210,178, 58,186, 22,149,
+ 6, 32,174,233, 58, 39, 73,242, 44,128,151, 36, 73,190,174, 24,232,162, 61,111,229,202,149, 53, 93,231, 6, 24,240, 89, 67,135,
+ 59, 91, 32, 9, 4,214,214,147,246, 31, 52, 87,126,156,126, 6,176,217, 43, 73, 96, 62, 0,130, 6,182, 28,145,203,127,168,110,
+ 65,199,142, 88, 75, 19,152,171,222,153,235, 50,238, 98, 77, 45,182,189, 14,116,168, 63,168, 39,103, 19, 84, 95, 80,246, 61, 78,
+127,127,127, 70, 21, 15,243,114, 69,165,171, 66,104,104, 89, 22,255,170,250,169,125,190,153, 61,120,240,192,201,199,199, 71,128,
+242, 78,255,149, 77,167,245,220,118, 6, 0,213, 71,222,159,159, 5,167,155,155, 27,231,205,155, 55,178,127,215,181,105,224,252,
+ 87,114, 90, 54,117, 1,129, 73,208,206, 29, 84,173, 69, 75, 75,160,209,244,207, 40,136, 77,169,162,159,154,235,220, 50, 33, 33,
+193,181, 97,195,134,201, 0, 10, 42,244,163,178,121,180,225, 24,253,223,115, 86,134,201, 40, 95,138,206,128, 74, 14,132,129,211,
+192,105,224, 52,112, 26, 56, 13,156, 6, 78, 3,103,109,133,214,103, 13, 18, 6, 24, 96,128, 1, 6, 24, 96,128, 1, 6,252, 45,
+ 32,170, 81,165,250,152, 4,107,163,108,175, 25, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,191,227,172,137, 91,123,249,
+207,117,232,240, 31,235,183,193,172,106,224, 52,112, 26, 56, 13,156, 6, 78, 3,167,129,243, 67, 4,203,103, 13, 38, 12, 48,192,
+ 0, 3, 12, 48,192,128,207, 6, 61,220,193,103,170, 64,254,241, 70,167, 32,170, 26,209,199, 13,117, 0,224, 99,241,253,159,130,
+ 15,224, 43,173,255, 23,160,142,140, 55, 8,173,207, 23,141, 0, 44, 1,160, 93,139,236, 33,128,245, 21,218, 29, 5,160, 93,144,
+ 80,132,210, 58,129,175,245, 89, 25, 73,146,235,187,116,233, 50,253,206,157, 59,155,149, 74,229,170, 90,244,215,149,207,231,111,
+ 36, 8,162, 53, 0, 22, 65, 16,111, 50, 51, 51,215, 43,149,202, 15,137, 90,105,224,232,232,184, 1, 64, 75,146, 36, 89, 4, 65,
+ 36,100,102,102,174, 81, 42,149, 55, 63,128,211,204,193,193,161, 19, 77,211,142, 0, 24, 44, 22, 43, 55, 45, 45,237, 1,106,153,
+ 91,201, 63, 48,150, 93, 40, 82,178, 0,192,220,132,169, 8, 13,108, 42,215,117,154,225, 20, 55,192,128,255,111,208,165,145,201,
+229,208,219, 13,107,105, 37,190, 87, 1, 68,175,250,216,113, 57, 17,223, 87,181, 60, 81, 73, 84,115, 69,206,222,110, 88,171,162,
+ 75, 57,122,185, 97,211,229, 55,168, 54,210, 94, 23, 78, 13,246, 1,228,100, 29,170, 20, 16,186, 69, 95,255,219,241, 21,202, 15,
+ 21,150, 13, 29, 86, 43,180,134,185,131,175, 98,130, 25, 26, 11, 77, 24,175, 25,128, 22,234,135,252,107,148,230, 42, 42,250,192,
+206,125, 46,156,255, 54, 44,167,105, 58,160,220,201, 90, 73, 30,162, 47,190,248, 98,192,149, 43, 87,140, 53,245,238, 40,138,130,
+145,145,145, 18,192, 88, 61,214,101, 63,108,216,176, 69, 7, 14, 28,192,208,161, 67,151,134,133,133,109, 5, 80,172,235,194, 86,
+ 86, 86,254,150,150,150,193,251,247,239,183,107,223,190, 3,193,225,112,240,230, 77,130,243,148, 41, 83,188,226,226,226,206,102,
+101,101, 77,212,119,227,173,173,173, 71, 90, 90, 90,110,217,187,119,175,109,231,206,157, 65, 16, 4, 34, 35, 35,157,231,204,153,
+211,226,221,187,119,199, 51, 51, 51,103,232,203,105, 99, 99,227,110, 97, 97,209,109,231,206,157, 70,157, 58,117, 2,143,199, 67,
+116,116,180,233,212,169, 83, 29,211,210,210, 98, 51, 51, 51,111,233, 43,178,158, 69,158,255, 90, 41,151, 6, 1, 0,147,205, 93,
+208,126, 75,196,249,103, 55,206,247,175,105,154,127, 96,236,239, 6,177,101,128, 1, 6,104, 99,164, 19, 28,105, 26,243,175,252,
+188,140, 4,128, 94,227, 87,207, 26,233,132,205, 71,210,171,174, 97,171, 39,223,247, 99,234, 32,248,112, 26, 50, 63,164,159,251,
+ 0,114, 14,147, 57,171,157,143,143,237,183,119,239, 38,200,129, 95,254, 79, 14, 81,165,195,156, 85, 10,173,193, 77,177, 74, 89,
+106, 49, 33,250, 52,196,241,171,137,140,240, 47,190,248,162,225,132, 9, 19,136, 86,173, 90, 33, 50, 50,210,253,248,241,227, 95,
+ 93,184,112, 33, 65,165, 82, 69, 2,120, 1,221,179, 90,179, 0,120, 50, 24,140,214,255,114,206,127, 51, 76,212,226, 42, 19,127,
+ 37, 58,125, 47,225,233,245,235,215,207, 49,153, 76,141, 69,171,157, 72, 36,114,168, 96, 5,211, 5,245, 20, 10, 5,226,227,227,
+ 65,146, 36, 11, 64,125,188, 95, 82,163, 42, 56, 27, 27, 27,239,142,120, 24,105, 67, 48,141,144, 47, 1, 32,145,131, 99,234,128,
+ 3,135, 66,172,231,205,158, 49,248,230,205,155,225, 69, 69, 69,191,234,209,159,250, 38, 38, 38, 91,159, 62,125,106, 99,108,108,
+ 12,138,162, 80, 84, 84, 4, 71, 71, 71,236,223,191,223,114,222,188,121, 1,133,133,133, 55, 37, 18,201,111,250,136,115, 11, 11,
+139,110,207,159, 63, 55,210, 20,148,150,201,100,112,118,118,198,209,163, 71,185,179,102,205,106, 90, 80, 80,144, 42,147,201,222,
+234, 74, 88, 40, 82,178,148,114,105,208,225, 93,129, 46, 0, 48,102, 70, 96, 16,167,200,252,162, 46,211, 10, 69,202, 11, 0, 12,
+ 66,203,128,127, 26,173,109,109,109, 67,115,114,114,110, 1,152,136,143, 99,105,112,231,241,120,205, 41,138,114, 36, 73, 18, 12,
+ 6, 35, 67, 36, 18, 61, 5,240,170,182,132, 54,110,126,253,193, 53, 30, 7,154,106, 65, 2, 32, 72, 50, 90, 37, 47, 57,148,251,
+234,230,249, 15,226,228, 24,141, 7,232, 22, 36, 64, 17, 36,249,148, 82,150,236,207,137,191,121,233,223,114,112,238, 11,209,216,
+205, 81,247,194,152, 31,131,111,120, 3,240, 73, 10,228,209, 36,221,135, 21,103, 2,125,103,207,158,237, 56, 99,250,116, 98,220,
+216,177,141,110,221,185, 67,116,213,167, 90,193,231,137, 42, 29,223, 43, 21, 90,254, 77, 97, 69, 3, 11,143, 7, 47, 33,153, 12,
+ 6, 49, 98,246,250,128,131,187, 54,145, 61,251, 15, 41, 27, 62,241,245,245,133,175,175, 47, 17, 20, 20,212,232,207, 63,255,108,
+116,244,232, 81,101, 68, 68,196, 83, 0, 39,170, 90, 89,111, 55,136, 41,128,199,102, 49, 69, 35,150,253,186,215,199,199, 7, 92,
+ 46, 23, 31,194, 9, 0, 61, 27,146,111, 89,214, 13,158,142,152,185, 60,185,125,251,142,244,199,224,252,140,240, 16, 40, 43,106,
+109,229,226,226,210, 73,169, 84,242, 0,128,201,100, 74, 82, 82, 82,102,162,180, 54, 32, 0,156,165, 40,106,128, 30,220, 36,128,
+ 21, 3, 6, 12, 88,250,237,183,223,162,110,221,186,152, 53,107, 22, 20, 10, 69,228,165, 75,151,150, 3,216,128, 26, 46, 30,123,
+123,251,229,187,119,239,182,102,114, 76,208,106, 97, 34, 4, 5, 74, 0,128, 41, 23, 56, 55,141,198,172, 89,179,204, 31, 63,126,
+188, 70, 31,161,101,111,111,191,106,255,254,253,214,198,198,198,160,105,186,172, 22, 99,113,113, 49,138,139,139, 49, 99,198, 12,
+243,216,216,216,141,250, 8, 45, 7, 7,135, 78, 59,119,238, 52,226,241,120, 40, 46, 46,102,203,229,114,162,168,168, 8, 37, 37,
+ 37,180, 76, 38,147,207,156, 57,147,251,226,197, 11, 63,129, 64,240, 22, 6,252, 91,192, 0,240, 13,139,197, 26,212,176, 97,195,
+ 54,175, 95,191,126,162, 84, 42, 79, 3, 56,253, 17, 94,166,186, 59, 57, 57,173, 77, 79, 79,223, 9, 32,228,255,101,135, 58, 56,
+ 56,156,190,119,239,158,203,238,221,187,199,110,222,188,249, 34,128,223, 62,128,142,205,102,179, 7,119,237,218,213,101,204,152,
+ 49, 28, 7, 7, 7, 72,165, 82, 36, 38, 38,154,159, 60,121,210, 53, 58, 58, 58, 85, 93, 17, 67,231, 23, 10, 27,247,142,166, 96,
+154, 31,239,208,177, 83,231,161,131,191, 49,115,176,177,128, 88,166,194,235,100, 65,221, 63, 46,158,235, 26,199, 54,186, 39,151,
+ 11,135,231,190,186, 87,172, 47,103,183,110,221, 59,247,232,222,221,204,194,210, 2, 66,145, 28,111,146,210, 92,111, 92, 61,239,
+203,100, 26,221,166, 8,197,168,172,231, 87, 75, 62,229,177,153, 5, 48, 69, 60,155,230, 45, 58,182,122,220,107,194,154, 54, 52,
+ 77,131,164,177,163,162, 53,107, 22,192,220, 81, 90,246, 75, 47, 62,208, 52, 77, 16,216,164,109,205,234,237,134,181, 52,141,239,
+ 65,130,232, 93,195, 48,165, 6,189, 0,174,165,181,181,207,212,201,147,137,162,194, 66, 68, 71, 71,151, 84, 20, 89, 91,235,128,
+125,155, 68,189,179, 41,181, 23,219,255, 82,107, 86,165, 67,135, 58,231,209, 50, 54, 54,174,116,186,133,133, 5,186,117,235,134,
+245,235,215, 51, 1,180,174, 48,187,124,145, 85,128, 27,182,103, 49, 44, 76,184,100,221,186,117,205,204,205,205, 63,152, 19, 0,
+ 64, 83,245, 59,214,165,191,124,244,235,146,177,215,142,110,241, 20, 21, 21,176, 42, 54, 49, 53, 53, 69,227,198,141,177,116,233,
+ 82,221, 56, 63, 28,255, 40,167,163,163, 99, 19, 95, 95,223,214,215,111,221,178, 76, 79, 79,231,166,167,167,115,175, 92,191,110,
+217,161, 67,135,214,142,142,142, 77,202,118, 21, 77,235,211,207,213,187,118,237, 90,126,246,236, 89,210,215,215, 23, 86, 86, 86,
+232,214,173, 27, 46, 94,188,200,220,188,121,243, 58, 0, 75,107,234, 39, 73,146,157,125,125,125, 9,208, 52, 50,132, 74, 60, 88,
+223, 4,209,155, 60, 80, 36,161,145, 39, 44,132, 88, 44,129,177,177, 49, 15,165,195,189,186,110,123,199, 14, 29, 58, 16, 0,202,
+196, 85, 81, 81,233,167,184, 88, 4,153, 76, 14, 46,151,107, 6,128,167, 43, 39, 77,211,142,157, 58,117, 2, 0,200,229,242,178,
+ 55,188,130,130, 2, 66, 40, 20, 66, 38,147,129,197, 98,177, 81,179, 95, 99, 25,167,185, 9, 83,193,100,115, 23,140,153, 17,152,
+ 50,102, 70, 96, 10,147,205, 93, 32, 51, 43, 84,233, 50,205,220,132,169,248,196,231,167, 29, 73,146, 63,187,185,185,197,146, 36,
+121, 24,128,227, 7,114,182, 5,176,206,200,200,232,154,135,135, 71,138,177,177,241,117,181, 80,239, 80, 75, 78,142,177,177,241,
+245,117,235,214,157,122,242,228,201,208, 63,255,252,179,254,179,103,207, 6, 7, 5, 5, 29, 55, 53, 53, 13, 71,121,191, 68,189,
+175,205,250,245,235, 31,124,240,224, 65,219,142, 29, 59, 30, 0,192,253, 72,215, 59, 3, 64, 75,232, 84,145,227,147, 28,119,167,
+ 86,173, 90,185,240,120, 60,244,232,209, 3, 0,252, 62,132,147,205,102, 15, 94,186,116,169,219,178,101,203, 56, 2,129, 0,215,
+175, 95,199,195,135, 15,161, 84, 42, 49,109,218, 52,238,152, 49, 99, 26,152,153,153, 13,214,171,159, 76,243,227,179,231,204,237,
+ 51,127,214, 36,179,167,239,228, 56,116,237, 29,126,143, 16, 32,171,132,131,254,131,199, 88,244, 30, 56,172, 55,135,107,113, 92,
+ 95,206, 69, 11, 23,246,153, 60, 62,192, 44, 70, 64,225,220,253, 12,220,143, 23, 66,201,178, 68,223,193, 19,173, 90,116,234,243,
+ 21, 19,172, 95, 62,245, 49,218, 15,180,159, 61,123,182,221,130, 77, 71,238, 58,181,253,102, 71,118, 62,124,181,133,143, 59, 96,
+105,109, 98,242, 77,124,215,174,147,140, 74,235,197, 86,203, 89,142,175,245,192,224,172,124,116,209,246,207,234, 98,141, 70,234,
+ 97, 69,198,149,159,151,145, 52,129, 89, 35,157,202,221, 7, 42,237,231, 77, 96,232,236,185,115, 89, 22, 86, 86,216,181,107, 23,
+164, 34, 81, 57,159,217,238, 46,232,115,205,152,153,218,192,195, 57,182,155, 43, 17,254, 31,124, 95,153, 92,165, 69, 43, 44, 44,
+140,238,215,175, 31, 1, 0,161,177,200, 31,220, 20, 27,135,125,187,110, 41, 65, 18,116, 61,207,142, 49,117,220,154,137,108,108,
+108, 80, 82, 82, 2,169, 84, 10, 54,155, 13,137, 68,130,119,239,222,225,254,253,251,176,178,178,210,171, 39,133,133,133, 48, 53,
+ 53,133,169,169,233, 71,225, 92, 60,182, 7,247, 77, 74, 54,247,242,253,155, 93,183, 79,255,173,189, 91, 75,191,103,221,135,205,
+122,110,110,231, 36,121,246,236, 25,238,221,187,135,252,252,124,248,248,248,252, 87, 14,230, 67,181, 79,214, 67, 0, 86, 13, 27,
+ 54,116,190,124,237,182, 85,177,132, 50, 79,202, 84,176, 40,138,130,177, 49, 95,121, 34,244,156,112,232,224,254, 68, 70, 70, 70,
+ 22,128,135,106,113, 91, 83, 77, 69, 30,128, 38,254,254,254,139,166, 79,159,142,132,132, 4, 76,154, 52, 73,252,240,225,195,220,
+142, 29, 59,218,236,223,191,223,104,222,188,121,184,117,235,214,138,176,176,176, 51, 0, 18, 1, 84, 90,171,141,166,105, 54,155,
+205,134, 82, 45, 27,228, 42,170, 76,223, 23, 22, 22,130, 22,231,131,205,102, 51, 0,216, 65, 71, 63, 58,138,162,216, 44, 22,171,
+ 76,100,189,203, 44,196,187,172, 18, 20, 22,203, 32, 22, 43, 33, 19,211, 96, 24,219, 48,129, 36, 7, 0, 73, 80,170, 87, 0, 0,
+ 0, 32, 0, 73, 68, 65, 84,186, 90, 71,120, 60, 30,148, 74, 37,138,138, 74,187,161,177,148,201,100, 50, 8,133, 66, 48, 24, 12,
+ 83, 0,230, 0,242,116, 33, 84, 59,185,255,174, 30, 6,196,163, 35, 3,108, 95, 95, 88, 92,110,154,185, 9, 83, 17, 58,175, 41,
+195,198,185,197,157,150, 67,127,241, 40,155,246,105,253,179,184,118,118,118, 55, 78,157, 58,213,180, 81,163, 70, 72, 76, 76,244,
+ 24, 50,100,136,143, 64, 32,104, 9,253,107, 50, 26,147, 36,185,113,204,152, 49,211, 71,140, 24, 65,184,187,187,131,201,100, 66,
+169, 84, 58, 39, 36, 36,116, 59,121,242,228,194,131, 7, 15,238, 87,169, 84,223, 65,119,191, 63,146,195,225,156,216,187,119,111,
+ 23, 31, 31, 31, 28, 62,124, 24, 15, 31, 62,164,218,182,109, 75,142, 30, 61, 26,174,174,174, 62,163, 71,143,254, 93, 42,149,246,
+173,165,101,203,181, 67,135, 14, 46, 12, 6, 3, 29, 59,118,100,223,187,119,175, 21,128,123, 31,184, 79, 77,157,157,157,111,249,
+249,249,181,188,118,237, 90, 84, 70, 70,134,159, 30,219, 11, 0, 3,157,156,156,130, 44, 44, 44,172,244,184,199,150,164,165,165,
+125, 15, 32, 84,199, 69,218,183,110,221, 26,201,201,201,104,210,164, 9,216,108,118, 7,185, 92, 62, 5, 64, 31, 0, 63, 0,136,
+213,163,191,238,221,187,119,119,241,243,243, 35, 66, 67, 67,203,252, 67, 73,146,132, 82,169, 4,155,205, 70,251,246,237,201,200,
+200,200, 58,143, 30, 61,114,135, 14,195,136, 54,110,126,253, 59,118,238,218,185,139, 79,115,114,115,232,107,168, 40, 21, 24,132,
+ 18, 76,130, 2,165,224,130,203,102,192,221,179, 13, 35,254,197, 83, 31,153, 84,222, 63,247,213,181,243,186,112,246,233,213,211,
+183,105, 19,119,114,251,239,111, 80,144, 22,171, 74,139,187,157, 67, 50, 72, 52,109,253,133,173,123,179,150,140,150, 62,126,172,
+244,196, 23,221, 36,146, 46, 61,242, 19,110, 95,251, 20, 23,228, 74,128,225, 92,199,246,155,126, 61,253,216,130,244,116,209,201,
+208,243,207, 75, 20,184, 15, 0,183, 0,162, 47,208,220,187, 93,187,174,251, 55,108,176,225,243,249,172, 81, 35, 70, 40,247, 69,
+ 69, 69,161,138,161,223,149, 0,195,214,209,177,199,212,169, 83, 25,130,244,116,250,228,233, 11,207, 52,124, 40,125, 75,241,110,
+238,236,209, 15,162,120,189,134, 41,251, 3, 28, 7, 71,199,166, 83,166, 76, 65, 70,122, 58, 14,135,132, 20, 75,128, 8,141, 21,
+235, 28, 3, 59,155,185, 57,142, 91, 48,113, 0,225,194,183,197,212, 21,251, 58,116,147,103,185, 65,240,215,241,215,214, 34,159,
+177,200,154, 92,169,208,170,136,223, 98,177,220,140,141,250, 39, 79, 30, 35,179,139,228,162,132,132, 4,216,218,218,130,207,231,
+195,194,194, 2, 49, 49, 49,184,126,253, 58, 94,190,124, 9,138,162,208,162, 69, 11,189,122,147,147,147,131,167, 79,159,194,202,
+202,234,163,113,186,185,216,225, 91, 23, 59,118,102,110, 33,251,218,195,151, 62,251, 22, 15,110, 70,122, 12, 62,168, 93, 36, 86,
+ 38,147,225, 63,130,178,232, 66, 23, 23,151, 78,135, 14, 29, 98, 75,149, 48,115,159, 18,241,163, 72,162, 50, 1, 0, 19, 30, 67,
+ 20, 25,212,248,187,213,171, 87,139,198,143, 31,239,145,146,146,178, 94, 7, 91,255,218,238,221,187,207,167,105,154, 53,123,246,
+108, 0,192,152, 49, 99, 10,239,223,191,239, 14, 32,235,250,245,235, 78, 19, 38, 76,120,117,227,198, 13,227,185,115,231, 50,148,
+ 74,101, 12,147,201,164,195,194,194, 86, 1, 8,124,239,137, 72,146,143,163,162,162,234, 57,185, 54,134,171, 13, 9,223,165, 47,
+ 75,111,112,198, 20, 82,147,222, 32,238,217, 67, 56, 58, 58, 90,240,249,252,216,212,212, 84,121, 90, 90,218, 66,145, 72,180,187,
+134, 62, 70, 71, 70, 70,242, 93, 93, 93, 81, 92, 92,140,212,236, 18,204, 58,109,140, 66,113,169, 17,131, 5, 49, 90,186, 52, 54,
+ 51, 34,101, 15,179,178,178,228, 50,153,108,153, 80, 40, 60, 84, 29, 39,139,197,202,125,246,236,153,105,221,186,117, 33,145, 72,
+232,188,188, 60, 66, 36, 18,161,168,168,136,184,112,225,194,215, 2,129,160,109,253,250,245, 9,103,103,231, 85, 2,129, 64,156,
+150,150, 54, 73,151,161, 73,181, 96, 82, 49,153,204,205,147, 39, 79, 30,122,230,204,153,199,161,129, 77, 7,106, 13,151, 88,120,
+122,122, 94,110,222,188,153, 83,200, 38,239, 29, 0,126,252, 23,156, 91,227,150, 44, 89,210,212,218,218, 26, 83,167, 78,197,202,
+149, 43,177,124,249,242, 70, 83,167, 78,157, 12, 96,171, 30, 60, 70,142,142,142,143,182,111,223,238,209,169, 83, 39, 92,188,120,
+ 17,199,142, 29,195,219,183,111,149,245,235,215,103,250,248,248, 96,197,138, 21,232,221,187,247,164,153, 51,103,118, 77, 79, 79,
+111,165,163,248, 24,191, 98,197,138,129,157, 59,119,198,216,177, 99,165, 55,111,222, 28, 10,224,202,213,171, 87,191,184,117,235,
+ 86,232,145, 35, 71,140,214,173, 91,215, 99,222,188,121, 83, 1, 4,215, 98,251,191,238,210,165,180,134,114,231,206,157, 17, 20,
+ 20,212,251, 3,133, 22,199,198,198,230,194,225,195,135, 91, 54,110,220, 24,163, 70,141,106, 53,116,232,208, 11,249,249,249, 61,
+ 1,232,116, 67,170, 83,167,206,198,179,103,207, 54,172,106,100,161, 50, 72,165, 82,235,111,190,249,102, 67, 82, 82,146, 94, 66,
+235,232,209,163,248,254,251,239,209,162, 69,139,230,237,219,183,223, 51,101,202, 20,248,251,251,119,143,137,137,113, 64,105,212,
+114,141,224,241,120,205,135, 15, 31,206,121,240,224, 1, 0,192,211,211, 19, 45, 91,182, 68,114,114, 50, 30, 63,126, 12,169, 84,
+ 10, 7, 7, 7, 12, 26, 52,136,151,148,148,212, 60, 39, 39,167, 70,161, 69,114,141,199, 13,236,215,215,236,220,125, 1, 84,148,
+ 18,109, 26,154,195,199,195, 30,241,169,133,136,140, 77,133, 74,198,134,185,181, 13, 58,116,237,101,157,145,246,118, 92, 46, 80,
+179,191, 22,215,120,220,160,129, 95,153,158,139, 72, 71, 65,122, 28,253,250,225,153,235, 10,137,104, 18, 0, 60,254,243,248, 30,
+ 71, 27,163,158,238,173,219, 48,252,122, 14,176, 58,125, 44, 99, 92,254, 63, 83,219,239, 61,220,114,193, 94, 87, 86,206,152, 5,
+ 1,190, 52,203,202,249,161,153, 66,177, 83, 51,175, 55,208,107,225,146, 37,237, 39, 78,158,204,163, 40, 10, 71,126,253,181,240,
+105, 84, 84,252,100,128,154, 82, 5,223, 78,192,117,232,192,129, 92, 51,115,115,204,153, 53, 11,102, 10,197,141,178, 93, 2,116,
+159, 51,127,126,167, 25, 51,102, 24,237, 89, 53,253,113,239, 9,107, 90, 83, 52, 77,104,134, 41,143, 86,111,138,107, 59, 97,224,
+ 64,152,153,155, 99,246,236,217, 32,228,242,203,101, 2,138,137, 27,227,191,246,245, 9,232,223, 25, 4, 8, 28, 11,187,131,215,
+201,217,207,110, 8,240,230,115, 85, 85, 21, 80,165,143, 86,181, 67,135, 69,114,100,118,255,106,176,192,221,221,189,168, 81,163,
+ 70, 69,185,185,185,120,254,252, 57,242,243,243, 17, 28, 28,140,184,184, 56, 80, 20, 85,107, 1, 67, 81, 20, 62, 54, 39, 0, 56,
+216,152, 99, 84,223,118, 76,169, 68,196,203,206,206, 46, 55,124,244, 31, 18, 90,101, 80, 42,149,188,250,245,235,131, 4, 8, 97,
+137,194, 52,227,104, 23, 34,227,104, 23, 66, 88,162, 48,149,201,100,164,169,169, 41,164, 82, 41, 79, 7, 42,214,151, 95,126, 57,
+255,204,153, 51,172,181,107,215,194,203,203, 11,114,185, 28,247,239,223, 79, 5,144,165,110,147,126,251,246,237,116,141, 16, 94,
+191,126, 61, 78,159, 62, 77,244,232,209, 99, 97,101,231,147, 64, 32,216, 56,101,202,148,188,146,162, 60,236, 29, 38, 70,232,168,
+108,252, 60,240, 45, 70,216,156, 66, 94,230, 59,236,219,183, 15, 87,175, 94, 35,174, 92,185,202,190,121,243,166,201, 87, 95,125,
+181,163, 78,157, 58, 97,213,117, 50, 61, 61,125,237,140, 25, 51, 10,138,138,138, 80, 84, 84, 4,177, 88,130, 60, 17,240,108, 75,
+ 83, 60,219,210, 20, 18,202, 8,187,118,238, 38,159, 61,123,102,251,246,237, 91,167,254,253,251,111,225,243,249, 7,171,227, 76,
+ 75, 75,123,240,237,183,223, 74, 10, 11, 11, 33,147,201,228, 42,149, 74, 38, 22,139, 21,199,143, 31,159,107, 99, 99,211,225,226,
+197,139,172,171, 87,175, 49,111,222,188,197,190,126,253,186, 69,183,110,221, 78, 56, 56, 56,252,162,139,165,140,193, 96,108, 11,
+ 9, 9, 25,183,107,215, 46, 7, 31, 31,159,102, 21,134,162,248, 61,123,246,172,247,235,175,191,214, 9, 10, 10, 90,136,210, 0,
+148, 79, 10, 91, 91,219,153, 3, 7, 14,196,174, 93,187,112,254,252,249,121, 59,118,236,192,151, 95,126, 9, 39, 39,167,111,161,
+251,176, 23, 0,252,184,117,235, 86, 15, 15, 15, 15,140, 25, 51, 70, 54,105,210,164,239, 14, 29, 58, 84, 63, 60, 60,156,253,203,
+ 47,191,212,155, 58,117,234,236,128,128, 0, 73,131, 6, 13, 16, 28, 28,220,144, 36,201,109, 58, 93,223, 14, 14,115, 71,140, 24,
+129, 77,155, 54,225,230,205,155,131, 81,250, 64,149, 1,184,116,247,238,221,254,235,214,173,195,224,193,131,225,236,236, 60,187,
+ 54,150,167,166, 77,155, 46,235,211,167, 15,194,195,195,209,170, 85, 43,116,232,208, 97, 30, 0,219, 90,238, 78,210,212,212,244,
+196,161, 67,135,124,235,213,171,135, 53,107,214,192,205,205, 13, 7, 15, 30,244, 53, 49, 49, 57, 1, 29,221, 55, 44, 44, 44, 76,
+141,141,141,177,112,225, 66,122,240,224,193,121, 53,125,230,205,155, 71,115,185, 92, 88, 89, 89,233, 26,248, 98,196,227,241, 58,
+122,121,121,225,254,253,251,184,122,245, 42,150, 46, 93,138,185,115,231, 34, 59, 59, 27,195,135, 15, 55, 6,224,175,199,118,219,
+219,217,217,161,176,176,180, 46,188,151,151, 23,158, 60,121,130,236,236,108, 56, 59, 59, 35, 35, 35, 3, 54, 54, 54,104,220,184,
+ 49, 40,138,178,215,141,146,246,178,181,182, 64, 86,190, 20, 76, 40,209,218,221, 22, 55,158,231,226, 93,182, 12,246, 54,150,200,
+200,202, 70, 29, 27, 30, 92, 92,234,130,166, 41, 47,157, 20, 48,131,108,205,229, 25, 33,175, 72,142,180,216,155,185,114,149,116,
+ 74, 65,226,221,148,130,196,187, 41,114,169,100,202,227, 59, 87,115,235, 57, 24,193,197,197, 5, 4, 77,181,251, 20,215,227,144,
+186,112, 49, 49, 98,142,185,250,243, 50, 34,108,255, 98, 66,154,251,174,109, 31,135, 82,203,178, 29, 80,127,200,240,225, 29,191,
+251,238, 59, 94,102,102, 38, 21, 48,108, 88,222,218,192,192,107,127,212,240, 98, 80, 12, 52,234,217,179, 39, 72, 0,127, 92,185,
+ 34,202, 0, 82, 1,192, 1,112, 25,240,205, 55, 93,150, 44, 90,100,148,147,155, 75,221, 79, 40, 62, 23,151, 69, 15,178, 86,161,
+190, 46,254, 89, 42,192, 91,195,123,249,242,101, 90, 12, 60, 6, 0, 63, 23,124,219,171,147,167,207,232,129, 93, 32,200,202,199,
+236,181, 63, 99,207,201, 91,151, 45, 20,244, 23,255,161, 71,241,228, 90, 9, 45,245,208,207,123,211, 74, 74,222, 31, 61,248, 80,
+ 1,243,119,112, 86,134,255,162,208,210, 64,161, 40, 29, 37,145, 41, 40,200, 20,148,230,173, 22, 98,177, 88,103,138,203,151, 47,
+ 31,158, 53,107, 22,182,108,217,130, 87,175, 94,129,205,102,195,203,203,139, 15,192, 84,115,207,111,221,186,181, 61, 73,146,136,
+143,143,199,230,205,155, 49,126,252,120,250,222,189,123, 7, 81,121,190,148, 39,121,121,121, 59,167, 76, 26, 95,144,159,249, 14,
+ 10,113, 62,178,210,222, 64, 42, 42,192,154,245, 27, 81,162, 96, 34, 67, 40, 71,134, 80, 14,146,107,141, 61,251, 15, 49,154, 54,
+109,218,135,193, 96,244,171,166,159,247, 51, 51, 51,247, 79,155, 54,173, 32, 35, 35,163,108,251,100, 10, 26, 50, 69,249,243,213,
+216,216, 24,219,182,109,179,112,119,119, 31,200,100, 50,187, 85,195, 41, 72, 73, 73,137,155, 54,109,154, 44, 51, 51, 19, 66,161,
+ 16,231,206,157,235, 95,175, 94, 61,171, 13, 63,110, 33, 68,114, 38, 50, 10,228,200, 40,144,131, 99,106,143, 19,161,103, 24,141,
+ 27, 55, 14, 96, 50,153, 29,106, 18, 89, 71,142, 28, 25, 61,108,216, 48,179, 31,127,252, 49,239,236,217,179,187, 0,104, 31,144,
+248,109,219,182,157, 60,113,226, 68,209,252,249,243,173,131,130,130,230,125, 98,177,213,109,216,176, 97, 77, 40,138,194,169, 83,
+167,158, 1,216,122,230,204,153, 71, 82,169, 20,195,135, 15,175,175, 30, 70,210, 5,109, 3, 2, 2,166,251,250,250, 98,206,156,
+ 57,242,107,215,174,181, 6,176, 5,165, 67,185, 52,128,100, 0, 59,110,221,186,213, 98,230,204,153,210,118,237,218, 97,236,216,
+177,227, 1,248,214,192,219,113,196,136, 17, 30, 20, 69,225,248,241,227, 79, 1, 92,172, 48,255,122,104,104,232,125,153, 76,134,
+145, 35, 71, 54, 0,160,207,141,156,205,229,114, 79,173, 94,189,218, 50, 45, 45, 13,163, 71,143,150,198,199,199, 35, 48, 48,208,
+200,194,194,226,162,214, 53,160, 51,184, 92,238,190,159,126,250,105,160,183,183, 55,166, 77,155, 38,219,189,123,247,172,233,211,
+167,203, 90,183,110,141, 93,187,118, 13,228,112, 56,122,149,232, 72, 79, 79, 47,136,141,141,181,169,233,147,154,154,170,107,120,
+190,177,169,169,105,132,167,167,103,161,151,151, 87, 27,165, 82,137,152,152,152, 55,135, 15, 31,166,188,188,188,176,115,231, 78,
+ 4, 5, 5,161, 95,191,126, 96, 48, 24, 58, 11, 45, 6,131, 1,185, 92, 14, 99, 99, 99, 48,153, 76,188,121,243, 70,147, 90, 6,
+108, 54, 27, 0, 96, 98, 98, 2, 35, 35, 35,144, 36,169, 83, 52, 26, 65,128, 46, 44, 81,128,197, 34,193, 36, 41,196, 37, 11, 33,
+ 87, 80,224,177, 25, 96, 49, 9,128,166, 96,105,194, 2,143,195, 0, 73, 16,148,142,156, 16,138,228,224,176, 73,176,216, 28,130,
+ 84,170,140,202, 30,142, 76,149,145,145, 17,135,176, 53,231,130,199,254, 23,149, 5, 38, 74, 29,203,199, 1, 44,147,186,117,135,
+110,218,188,153, 83, 88, 92,140,193,131, 7,231, 37, 61,122, 20, 34, 6, 30,117,173, 33, 72,137,100, 50,221,253,186,118, 69,100,
+ 84, 20,138,242,243, 95, 3,165,206,241, 28, 39,167, 97,219,182,109,227,136, 37, 18, 12, 30, 52,168,224,213,157, 59, 71, 82,138,
+ 17,118, 60,185, 84,136,213,120,220,217,108, 71, 13,175, 48, 63, 63, 31, 40, 77, 33,225, 96,103,186, 97, 70, 64,111, 20,149, 72,
+176, 96, 99, 8, 21, 21, 39,248, 54, 60, 21, 95,157, 73,135,240, 63,246, 24,158, 92,225, 3, 64,135,132,165, 26,235, 82, 77, 98,
+ 69, 42,149,126,116, 1,244,161,156,149,137,196, 15,229,252, 55,130,201,100, 74, 94,190,124,201, 49,183,113,162,108,204, 88,249,
+245,198,223,177, 0, 0,107, 83,166, 80,174, 82, 80,233,233,233,224,114,185, 18, 29,135, 27, 38,237,219,183,111, 13,128,102, 76,
+ 38, 51,236,208,161, 67, 68, 72, 72,136,213,136, 17, 35, 18, 98, 99, 99,211, 60, 61, 61, 93, 15, 29, 58,100, 14, 0, 59,118,236,
+160, 79,156, 56,209, 27,165, 41, 51,170,204,227,146,153,153, 25,152,155,155,123,111,198,140, 25,193, 28, 14,199,202,196,196,196,
+ 38, 60, 60,156,144,200,105,180, 93,146, 92, 22,137,104,110, 68,226,246, 98,115, 76,158, 60,153, 17, 27, 27,187, 62, 45, 45, 45,
+172, 26,206,133, 5, 5, 5,225,175, 94,189,218, 98,225,220,210,206,196,117,137,133,207,226,120, 0,128,171, 45, 11,164,250,190,
+ 88, 80, 80,128,236,236,108, 76,159, 62,221, 42, 33, 33, 97, 97, 90, 90,218,141,106,172, 90,183,114,114,114, 82, 95,188,120,225,
+199, 98,177, 56, 38, 38, 38,109, 35, 34, 34, 8,137,140, 66,243,133,201,200, 43, 46,237,167,181, 41, 19,143, 87, 59,224,219,111,
+191,101,190,126,253,122,163, 64, 32,232, 92,233,205,140, 36,131,180, 69,214,130, 5, 11,162, 1, 52, 0, 80,110,104, 84,165, 82,
+ 17, 35, 71,142,124, 14,192,107,254,252,249,214, 52, 77,207, 91,184,112, 97, 30,128,189,255,244,185,100,110,110,190, 97,202,148,
+ 41, 56,113,226, 4,242,243,243,183, 1, 64, 97, 97,225,214,163, 71,143, 30,159, 52,105, 18,126,253,245,215, 13,217,217,217,127,
+160,230, 80,237, 47,135, 15, 31,142, 75,151, 46,225,207, 63,255, 92, 6, 32,166,138,118,175,194,195,195, 23,158, 61,123,118,251,
+136, 17, 35,240,243,207, 63,247, 1, 80,157,131,108,207,222,189,123,227,226,197,139,200,205,205,221, 85, 89,131,130,130,130,221,
+231,206,157,107,223,187,119,111,172, 95,191,190, 39,128,235, 58,108,186,135,133,133,197,161,237,219,183,183,245,246,246, 70, 64,
+ 64,128, 68, 46,151,247,153, 63,127,254,249, 99,199,142,153, 29, 62,124,184,205,228,201,147, 31,168,115,190,221,215,201,148, 69,
+146,235, 54,111,222, 60,193,207,207, 15,243,230,205, 83, 94,190,124,121, 0,128, 43,127,252,241, 71,194,130, 5, 11, 46,108,222,
+188,153,177,105,211,166, 9,179,103,207,206,166, 40,234, 83,137,235,213, 59,118,236,104,223,171, 87, 47,188,121,243, 6,247,239,
+223,135, 92, 46,255, 53, 34, 34,226,118,163, 70,141, 86,203,100,178,243, 38, 38, 38, 99,204,204,204, 60, 91,182,108,249,197,227,
+199,143,141,161,155,159, 94,102, 98, 98,162,165,133,133, 5,148, 74, 37,158, 61,123,134,186,117,235, 66, 46,151,227,237,219,183,
+240,246,246, 6,155,205, 70,102,102, 38,180,172,229, 53,136, 34,242, 89, 66, 82,122, 3,107, 51, 19, 64,197,195,147,248, 84,216,
+217, 90, 65, 69,144,200,200, 16,160,101, 19,103, 16, 4,129,130,220, 12, 16, 4,241, 92, 23, 78, 21, 77, 69,190, 75,207,170, 99,
+ 99,198,133,119,251, 94, 54, 17,127,100,135,152, 55,232, 52,153,201, 32, 24, 28,174,233,222, 9, 99,199,218, 82, 20,141,130,220,
+ 76, 48, 73,242,225,167, 56, 64,167,222, 33,165,171, 27,239, 73,175, 9,107, 90, 18, 52,104,177, 28,135,127,206, 68,190, 49,208,
+114,199, 15, 63, 88,218,216,218, 34, 32, 32,128,202, 77, 75,187, 86,162, 99, 98,229, 6,141, 26, 57,152,154,153,225,238,221,187,
+ 96,148,250,216,226, 32,224, 17,180, 96,129,141,189,163, 35,198, 79,152, 64,101,190,123,119, 93, 12,164,235,211,215, 6,110,110,
+ 44, 13, 47,169,230, 21, 48, 48,107,254, 0, 95,174,137, 17, 23,235,246,156, 65, 74,142,232,120,132, 0,123,254,163,246,142,125,
+213, 90,180,170,114, 62, 43,117,170, 54,174, 86,172,240,120,188, 50,107,138, 30,111,122, 31,157,179, 38,252, 29,156,159, 16,139,
+ 1,156, 5,176, 56, 37, 37, 37,110,194,132, 9,114,165, 92, 90,116,111, 77,131, 69, 81,235,235, 77,139, 8,228, 79,251,125,150,
+197,162, 18, 97, 94,209,142, 29, 59, 20, 41, 41, 41,113,218,203,212,192,253, 14,192,197, 95,126,249,101,247,169, 83,167,224,229,
+229,133,152,152, 24,123,145, 72,212,234,249,243,231,214, 30, 30, 30, 8, 9, 9,193,137, 19, 39,182, 0,184, 90,157,200,210, 64,
+169, 84, 94,203,200,200,104,156,156,156,220,208,210,210, 82, 97,105,105,137,138,145,136,133, 98, 10,185, 5, 66, 88, 91,219,192,
+220,220,188,190, 14,226,252, 98, 70, 70,134, 59,101,213,164,139,123,206, 54, 97,228, 58, 23, 68,174,115,193,197,133, 78,224, 91,
+114,144,159,159,143,236,236,108,100,103,103,131, 32, 8, 40, 20,138,166, 58,112,190, 21, 8, 4, 7,222,189,123,119,214,193,193,
+ 1,102,102,102,160, 1,100, 20, 40, 16,189,201, 3,209,155, 60,144, 81,160, 64, 97, 81, 17,234,213,171, 7, 51, 51,179,170,134,
+ 40,200, 58,117,234,244, 29, 54,108,152, 25, 0,168, 5, 84,119,154,166,167, 85,242,153,170, 84, 42, 59,105,218,126,255,253,247,
+214, 0,122,255,195,231, 19, 3,192,140, 73,147, 38,181,225,241,120,216,185,115,231, 91, 0, 71, 52,247,250,221,187,119,199, 3,
+192,172, 89,179, 60, 1,204, 67, 21,153,160,203, 76, 67,108,118,235,166, 77,155, 34, 34, 34, 2, 0,206,212,176,238,208,123,247,
+238,161, 81,163, 70,224,241,120,109,107,104, 91,223,197,197, 5,241,241,241, 0,240,164,138, 54, 79,226,227,227, 75,135,123, 8,
+162,190, 14,219, 62,176, 87,175, 94,207,110,220,184,209,182, 99,199,142,152, 48, 97,130,236,193,131, 7,125, 1,220,126,242,228,
+ 73,183,145, 35, 71,138,220,221,221,113,235,214, 45,143,145, 35, 71,222, 35, 73,114,141, 14,156,227, 87,173, 90,181,248,235,175,
+191,198,170, 85,171,232,147, 39, 79, 6, 0,184,162,158,119,249,248,241,227,163,215,174, 93, 75, 15, 26, 52, 8, 43, 87,174, 92,
+ 12, 96, 90,117,100, 34,145, 72,168, 82,169, 32, 18,137,116, 50,201,235,218,222,214,214,246,203, 94,189,122, 97,233,210,165,168,
+ 83,167, 14,206,159, 63, 79, 3, 8, 3, 16, 46,147,201,186, 0,216, 44, 18,137,126,143,136,136, 64,207,158, 61,217, 40, 95, 98,
+164,186,245, 63, 59,122,244,168,212,194,194, 2,174,174,174,104,208,160, 1, 50, 50, 50,144,148,148, 4,111,111,111,180,110,221,
+ 26, 74,165, 18, 7, 14, 28,144, 20, 21, 21,233,148,147, 79, 41, 19, 29,190,122,225,180,208,198,140, 11,103,123, 11,212,171, 99,
+141,226,130, 28,100,103,164,163,117,211,186,232,218,186, 30,114,132, 50, 92, 14, 59,157, 95, 84, 84,114, 88, 39, 19,190,180,228,
+208,181, 63,206, 11,173,204,216,104,220,196, 19, 35, 39,204,106,217,178,149,207,213,118,237, 58, 93,254,113,195,186,230,221, 59,
+ 52, 37, 82,115, 36,184, 20,118, 38, 95, 88, 88,120,232, 83,220,232, 87, 2, 12,137,133,251,237, 93,103, 35, 15, 52,235, 51,233,
+ 64, 92, 42,182, 1,128,130,193,240,232,251,229,151, 72, 77, 77,197,233, 83,167, 4, 37,192, 83, 93,249,140,140,140, 72, 0, 16,
+ 10,133,224,170,253,238,148, 64,147,175,190,250, 10,217, 57, 57, 56,122,228, 72,246, 37, 32, 74,159,126,246, 7, 56,198, 70,165,
+ 6, 65,161, 80, 8, 2, 40, 4, 0,130,137,190,237,188, 26, 33, 59,175, 16, 55, 30,198, 21,215, 19, 99,122,117, 60,159,177, 35,
+124,237,124,180, 0,228,204,155, 55, 15, 92, 46, 23,124, 62,191, 76, 28,105,196, 10,135,195, 1,159,207,135, 82,169,196,241,227,
+199, 1, 32,167,218, 55, 60, 64, 58, 96,218,122, 74,170,160, 75, 88, 44,214, 71,225, 84,191, 57, 74, 7, 47,248,153,250,227, 94,
+229, 65, 49,181,225,252, 12,208, 78,157, 19,171, 29,128,252,164,164,164,212,161,131, 7, 8,147, 19, 94,100,136, 10,210, 5,133,
+185, 41,130,148,183,207, 51,150, 44,156, 39, 76, 77, 77, 77, 65,105, 46,173,118,233,233,233,154,101,116,193,188,161, 67,135,254,
+ 52,105,210, 36, 58, 58, 58, 26, 0, 16, 25, 25,137,177, 99,199,210,163, 71,143,222, 6, 96, 81, 45,250, 45, 18,139,197,229,172,
+ 33,114, 21, 85, 54,228, 87, 88, 88,136,244,244,116,200,100, 50,157, 21,241,171,203,155, 94,230, 37, 61, 86,120,186,154,192,211,
+213, 4, 30, 46,198, 32,148,197,101, 34, 43, 59, 59, 91,243,230, 44,209,163,159,133, 82,169,180, 92, 63,181,135, 38, 11, 11, 11,
+145,145,145, 1,149, 74, 85,213,131,140, 74, 75, 75,187,124,226,196,137, 34, 0,248,241,199, 31,243, 8,130,248,147, 32,136,159,
+ 42,249,236, 97, 50,153,119, 53,109, 55,109,218,148,135,247,135,196,254, 78,124,237,237,237,157,191,120,241,226,157,179,103,207,
+198,158, 61,123, 32, 16, 8, 22,225,175, 92, 60, 84, 78, 78,206,130, 93,187,118, 97,220,184,113, 88,190,124,249,166, 86,173, 90,
+ 21, 2, 24, 89, 21,161,157,157,157, 51,147,201, 68, 84, 84, 84, 33,128, 55, 53,172, 63, 35, 42, 42, 42,147, 32, 8,240,249,124,
+183,234, 26, 90, 91, 91, 55, 52, 51, 51, 67, 90, 90, 26,160,126, 99,174, 4, 73,233,233,233, 52,135,195,129,147,147, 83,163,154,
+ 54,222,202,202,106,193,129, 3, 7,152, 47, 94,188, 64,247,238,221, 83,111,221,186,213, 19,128, 38, 36, 61, 42, 50, 50,210,183,
+ 91,183,110, 47,175, 94,189,138,141, 27, 55, 18, 45, 90,180,152, 86, 19,167,171,171,235,212,241,227,199, 35, 56, 56, 24,123,247,
+238,157, 6,224, 84,133, 38,199,118,237,218, 53,107,239,222,189,152, 48, 97, 2,234,215,175, 63,178, 58,190,228,228,228,133,126,
+126,126,145,175, 94,189,210,169,226,129,142,237,187,249,248,248, 52, 20,139,197, 56,116,232,208,155,134, 13, 27, 62, 58,117,234,
+212, 60,188,255,192,254,253,244,233,211, 24, 53,106, 20, 90,180,104,113, 8,192, 8, 93, 46,203,216,216,216,148,235,215,175, 83,
+108, 54, 27,174,174,174,232,215,175, 31, 2, 2, 2,208,188,121,115,200,229,114,156, 62,125,154,122,254,252,121,170, 76, 38,211,
+ 41,151, 82,238,171,155,231, 19, 19,255,199,222,121,135, 71, 81,181, 81,252,204,246,190,155,186, 73, 72, 72, 8, 45,149,142, 84,
+233,161, 72, 23, 81, 68, 16, 43,162,130, 72,177,125, 34, 86, 4,105, 34,136, 20, 69, 65, 4, 20, 69, 90,164,136, 40,145, 78, 2,
+132, 0, 33,129,244,186,233,101,179,125,103,238,247, 71,138, 33,164,236, 38, 40,150,251,123,158,121, 38,185,179,115,246,206,157,
+118,246,189, 45,225,212,197,115, 81, 54, 1,159, 7,127, 31, 55, 60, 24,209, 13,207, 76,238,143, 30, 33,190, 72,203, 51,226,248,
+241,159,109, 41, 41, 73,103, 28,233,113, 88,173, 25,127, 45,246,244,213,139, 39,237, 66, 1,131,144,224,142, 88,244,191, 87, 93,
+151,188,253,154, 75,199,118,254,136, 77, 46,197,207, 71, 15,217,178, 51, 51,126,189, 87, 61, 14, 79, 0, 34,165,132, 81,240,121,
+ 60,176, 60, 73, 5,191,170, 35, 77,167,176,176, 32, 47,111,111, 68, 70, 70,130,231, 68,143,208, 19,128, 72,169,172,172, 5,215,
+235,245,168,214,107, 31, 28, 28,236, 31, 16,128,159, 34, 35,193,231,184,235,131,156, 28, 96,244, 70,101, 53,116,141, 46, 3,152,
+ 94,104, 13, 85,251,214,218, 96, 87,141, 2,231, 98,111,194,108, 35,231,191, 41,198, 61, 29,143,236, 79,100, 38,154, 89,117,184,
+ 98,227,198,141,189,190,248,226,139,225,243,231,207, 87,206,152, 49, 3, 82,169, 20, 6,131, 1,126,126,126, 96, 89, 22,135, 15,
+ 31, 70,116,116,180,158,227,184,159,113,231,176, 1, 17,168,213, 75,227, 72, 18,100,149,126,203,208,107,223,195, 15,223, 21, 77,
+ 0, 80,222,228,212,133,109, 44,219,215,238, 62, 57,105,199,145,139,204,203, 83, 7,241,122, 4,183, 6, 0,120,121,121, 65,173,
+ 86, 59,173,121, 23,248,211, 53,107, 87,235,230,230,230,222,200,205,205,205,123,246,217,103, 67,170, 27,190, 75, 36, 18, 83, 85,
+ 36,171,184,190,125, 28,200,167, 21,192, 11, 95,124,241,197,254,210,210,210, 35,175,188,242, 10,150, 44, 89,130, 3, 7, 14, 12,
+ 0,112,170,153,199,206, 22, 23, 23,151,156, 63,127,222,171, 67,104,119,180,213, 10, 49,240,173, 68, 16, 66,224, 46, 39, 40, 47,
+ 41,194,165, 75, 23, 81, 94, 94,126,206,153,124, 90,173,214,146,188,188, 60, 15,173, 86,139,162,162, 34, 20, 20, 20,212,152,172,
+226,226, 98, 20, 21, 21, 17,134,185, 99,204,150,198, 52, 43,242,242,242, 12,241,241,241, 98,175,214, 29,208, 78, 43, 66,239,255,
+221, 0, 8,129,191, 27, 15,229,101, 37, 56,115,230, 12, 74, 75, 75,127,107, 72,147,227,184, 5,211,166, 77,227, 3,120,252,149,
+ 87, 94,113, 3,208,245,213, 87, 95,253, 25,117,122, 22, 10, 4,130,143,183,111,223,222,169,186,138,241,181,215, 94, 91, 13,224,
+139,191,234, 90,114,119,119, 95, 16, 25, 25,169,178, 90,173, 88,187,118, 45, 86,175, 94,189, 5,119, 14, 84, 25,249,233,167,159,
+174,231,241,120, 47,206,158, 61, 27,207, 61,247,156,188,103,207,158,243,115,114,114,190,169, 79, 51, 43, 43,107, 81,143, 30, 61,
+ 22,231,229,229,125,232,144, 89, 78, 76,156,217,163, 71,143, 69,121,121,121,203, 27, 59, 71, 10,133, 66,193,178, 44, 82, 82, 82,
+138,129, 6,219,119,152, 82, 82, 82,178, 88,150,245,147,203,229,110, 77, 93,159,197,197,197, 31,246,236,217,243, 29,157, 78,119,
+ 20,192, 7,245, 24,242,203, 57, 57, 57,225,115,231,206,157,179,108,217,178, 73,185,185,185,187,154,210, 76, 75, 75,251,112,200,
+144, 33,111, 37, 36, 36,108, 69,195, 85,192,159,190,251,238,187,214,237,219,183, 63,159,146,146,178,180, 9,205,131, 5, 5, 5,
+ 7,157, 56,191, 13,125,190, 70,147,207,231,191,186,108,217, 50,222,198,141, 27, 65, 8, 89,201,178,108, 67,249,140,221,187,119,
+239,182,254,253,251,207,216,189,123,183, 52, 60, 60,252, 57,179,217,188,179,169,235,211, 96, 48,236,217,189,123,247,164,216,216,
+ 88,191, 25, 51,102, 72,131,130,130, 96,181, 90,145,147,147,131,141, 27, 55,154,226,226,226, 50, 75, 74, 74,246, 56,243, 12,177,
+ 91,202,166,158, 62,190,111,103,106, 98, 92,223,193,163, 38,184, 90,172,126,144, 20,242, 81, 82,152,139,195, 7,247, 20,167,164,
+ 36,157, 49, 24, 74,166, 58,163,105, 53,151, 62,122,230,215,253,187, 50, 83,226,251, 12, 28, 50,218,213,100, 9,128, 68,196, 67,
+161, 46, 11,135, 35,247, 21,165,164, 36,255,110,178,153,159,184, 87,207,121,126, 32, 62,224,231, 70, 63, 59,107, 92, 55,200, 92,
+253, 46, 9,129,181,253, 1,153,135,151,151,168,234,222,129,178,178,205,163, 67,154, 58, 64,220,161,170,150,202, 96, 48, 64, 8,
+ 88,158, 4,132,158,158,158, 50, 0, 72, 72, 72,128,188,178, 86,195,169,124,234, 1,133,188,150, 46, 15, 48, 20, 10,224,219, 94,
+173, 96, 0, 32, 51,183, 16, 22, 91,163,239,141,127, 58,155,107, 25,174,205,205, 17, 16, 1,136, 80, 42,149, 75, 22, 47, 94,188,
+242,220,185,115, 43,199,142, 29,187, 82, 34,145, 44,169, 42,108, 81, 35, 39,226, 47,211,188,175, 21,220,134,180, 99,162, 70,180,
+103,184, 89, 3, 92,217, 39,122, 43, 44, 67,135, 14, 93,223,194,124,182,228,102,249, 51, 53,247,217,108, 54,130,202,106,187,125,
+104,184, 74,240,141, 90,219,115,211,211,211, 73,213,223,206,228,211, 99,202,148, 41, 92,121,121, 57,121,228,145, 71, 8,154,158,
+194,167, 81, 77,137, 68, 50,100,224,192,129, 54, 93,126, 17,185,145,156, 69,206,198, 92, 35, 71,142,159, 38,187,246, 68,146,117,
+235, 55,145, 46, 93,186, 88, 0, 4, 56,163, 41, 16, 8,134, 14, 25, 50,164, 80,167,211,145,248,248,120, 18, 21, 21, 69,190,255,
+254,123,178,105,211, 38,178, 97,195, 6,210,186,117,107, 29, 0, 47,103, 52,101, 50,217,132, 7, 30,120,192, 86, 82,102, 32, 41,
+ 89,133,228, 74,124, 10, 57,117,254, 10, 57,124,252, 20,249,102,231,110, 18, 22, 22,102,114, 64,147,207,231,243,215,237,218,181,
+171,140, 16, 66, 38, 76,152,144,137,219, 7, 82,109,187, 96,193,130, 60, 66, 8, 89,190,124,121, 33,234,111, 8,255,103, 95, 75,
+163,124,125,125,111,136, 68,162, 72, 0,143, 55,177,223,163, 2,129,224,128,183,183,247, 5, 0, 15,222,131,251,104,172, 86,171,
+ 61, 11,160,169, 25, 14,170, 63, 55,241, 95,114,191,255, 25,154, 67, 5, 2, 65, 20,208,248, 36,194,181,158,215,239,243,249,252,
+159, 0, 12,115, 50,159, 29, 61, 60, 60, 30,113,117,117,125,217,213,213,245,101,173, 86,251,136, 88, 44,238,216,146, 99,119,239,
+ 24, 49,206,191,251,248,189,173,187,142, 73,243,239, 54, 54, 45,176,199,132,189,238, 29, 35,198,181, 84, 51,160,199,132,125,254,
+221,198,166,251,119, 27,151,218,246,190, 9,123, 61,130, 35, 30,184,151,231,232,113, 95,180, 26,222, 22,118, 18,245, 22, 33, 81,
+111,145,136,182,224,250,186, 32,172, 23,160, 26, 25, 17,177,138,176,236,170, 73, 19, 39,174,234, 0,184, 19,128, 95,119,169, 79,
+179, 59,160,174,217,119,194,132, 85,237, 0,143,225,128,124,208,128, 1, 43, 9,203,174,154,246,232,163,171,252, 1,239,250,244,
+ 26,210, 36, 0,223, 23,104, 85, 91,215, 3,104, 63, 57, 16,225,111,140, 11, 36, 36,234, 45,242,238,195, 65,164,135, 23, 30,111,
+ 66,179,161, 72,209, 63, 58,162,229, 44,138,170,135,235,210,170,181,226, 46, 92,132,119, 93,179,143, 15,130, 34,218, 51,241,163,
+131, 5, 69,168,236,146,172,248, 23, 62, 36,183, 90, 44, 22, 98, 50,153,136,193, 96, 32,122,189,190,174,129,170, 49,100,217,217,
+217, 36, 51, 51,147,164,167,167,147,212,212, 84,130, 63,218,222, 56,156, 79,181, 90,253,197,195, 15, 63,204, 10,133,194,117,119,
+227,216,221,220,220,150,246,238,221,219,250,201, 39,159,144,189,123,247,146,207, 63,255,156,204,158, 61,155,116,234,212,201,236,
+226,226, 50,181, 57,154,222,222,222,139,130,131,131, 11,183,108,217, 66,190,249,230, 27,178,102,205, 26,242,230,155,111,178,126,
+126,126,185, 42,149,106,100,115, 52,181, 90,237,230,251,239,191,223,186,121,243,102,242,243,207, 63,147, 29, 59,118,144, 5, 11,
+ 22,144,144,144, 16,179, 66,161,120,200, 65, 77,190, 64, 32, 88, 53,107,214,172,220, 86,173, 90, 69,214,217, 38, 15, 11, 11,187,
+ 48,109,218,180,108, 0,175,253,139,174, 79,170, 73, 53,169,230,159, 96,180, 30,107, 5, 95, 2,240,229, 34,209,163,131, 6, 12,
+ 88, 41, 2, 30,117,214, 20, 73,249,252,201,253,123,247, 94, 41, 2,166, 86,127, 86,202,231, 79, 30, 52, 96,192, 74, 33,159, 63,
+189, 33,189,198, 52, 9,192, 23, 9, 4,175,245,239,219,119,149, 0,248, 95,117,218,208,182,204,245, 5,163, 90,147, 1, 1,204,
+205,233, 90,200,255,197, 70,235,174, 35,248, 19, 46,194,127,138,230,223,229,166,238, 80,101,152,246, 57, 17,209,218,135,202, 89,
+212, 59, 52, 51,159,178,187,124,236,157, 61, 60, 60, 14,117,232,208, 33,191, 77,155, 54,217,174,174,174, 59, 1,248,181, 80, 51,
+220,219,219,251,107, 47, 47,175, 68, 31, 31,159, 88, 15, 15,143,143, 81, 57,234,124,179, 53,133, 66, 97,111, 47, 47,175,223, 2,
+ 3, 3, 75, 2, 2, 2,116, 30, 30, 30,187,234,137,100, 57,162,233,131,250, 31, 42,162,170,109,244,165, 67, 53,169, 38,213,188,
+205,192,140,104,135,101,195,219,194, 62,188, 45,216, 17,129,248,184,182, 65, 25, 11,200,154,107,138,158, 0, 36,117, 63,223,148,
+ 94, 83,154, 4,224,247, 3,148,117,247, 25,237,135, 48, 7, 53,255,233, 17,173,234,231,188,115,195, 59, 52,128,253, 79,200,228,
+ 63, 69,243,239,194, 77, 52,210, 24,185, 22, 75,239,226,119, 26,239,242, 49, 92, 41, 40, 40,120,160,160,224,174,246, 77,184,154,
+155,155,251,248,221, 20,180,217,108,231,116, 58,221,224,187, 32,213, 80,215,107, 43, 28,236,150, 77,161, 80,254, 59, 48, 0,139,
+ 36,188, 30,209, 17,107, 5, 44,120,135,147,145, 85,167, 75,158,145,105,142,102, 37,236,214,122,158,241, 76,115,243,249, 7,250,
+ 59, 52, 50,113,141,249,239,156,182, 28, 84,182,209,106,177,209,162, 80, 40, 20, 10,133,242, 23,112, 44,145,254, 16,251, 7, 16,
+137,219,163,111,145,181,140,104,131,161, 79,103,122, 82, 52, 39,124,122,140,106, 82, 77,170, 73, 53,169, 38,213,164,154,255, 57,
+205,106, 26,154, 59,245, 70,157,255,155,213,139,239,191, 2,173,103,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,102,
+143,163, 69,161, 80, 40, 20, 10,133, 66,105,156, 6,163,110,212,104, 81, 40, 20, 10,133, 66,161,180, 12, 31, 84, 78, 81, 21,137,
+ 63,166,170,218, 76,141, 22,133, 66,161, 80, 40, 20, 74,203, 25,131, 63,122, 27,222, 22,221,226,209,178,161, 80, 40, 20, 10,133,
+ 66,105, 49, 51,107,173,105, 27, 45, 10,133, 66,161, 80, 40,148,187,132, 99, 61, 35, 15, 30, 60, 72,104, 89, 81, 40, 20, 10,133,
+ 66,185, 87,252, 67,189, 72,117, 20,235,142, 89, 62,104, 68,139, 66,161, 80, 40, 20, 10,165,101,108,174,101,184,110, 75,163, 70,
+139, 66,161, 80, 40, 20, 10,165,101, 84, 27,172, 72,212,153, 82,141, 7,208, 42, 67, 10,133, 66,161, 80, 40,247,150,127,184, 23,
+217, 92,181,220, 49, 93, 82,117,175,195,193, 85, 7, 56,152,158,106, 10,133, 66,161, 80, 40,247,128,127,178, 23,241, 65, 3,109,
+180, 40, 20, 10,133, 66,161, 80, 40, 45, 99,102,157,117, 13, 12, 45, 27, 10,133, 66,161, 80, 40,148,187, 98,180,106, 67, 39,195,
+166, 80, 40, 20, 10,133, 66,249, 39, 67,103, 54,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,127,129,153,168, 51, 42, 60, 64,
+135,119,160, 80, 40, 20, 10,133, 66,185, 27, 38,107,115,125,255,211,185, 14, 41, 20, 10,133, 66,161, 80,254, 36,104, 68,139, 66,
+161, 80, 40, 20, 10,165,101,108, 70, 61,163,194, 83,163, 69,161, 80, 40, 20, 10,133,114,247,204,214, 29,208,170, 67, 10,133, 66,
+161, 80, 40,148,150, 49,179,161,255, 25, 52,220,115,224,152, 19, 95,208,156,222, 7,199,168, 38,213,164,154, 84,147,106, 82, 77,
+170,249,159,211,108, 74,251, 24,254,121, 52,216, 24,254,207,134,118,125,165,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,
+234, 41,120,170,151,154,169,120,104, 27, 45, 10,229, 31, 14,217, 13, 62,138,131, 3, 65, 72, 43,240,197, 57,200,185,146,196,188,
+ 3,174,197,154,186,176, 0,200,108, 94,176, 75,243,161,139, 77,110,169, 38,133, 66,161,252,139,201, 65, 3, 17, 44,106,180, 40,
+148,127, 58,249, 33, 65, 16, 96, 41,120,240, 1,177,222,130,103,216, 82,224, 90, 92,139, 53, 69,220, 7, 96,121,126, 32,214, 4,
+104,131,151, 1, 55,174,209,112,241,142,135, 0, 0, 32, 0, 73, 68, 65, 84,194,166, 80, 40, 20,231,248,203, 27,195, 11,133, 66,
+ 29, 0, 78, 42,149,238, 1,157,229,154,242,231,226, 83,117,157,113, 85,215,157, 51, 40, 5, 2,193, 98,185, 92,254,171, 68, 34,
+201,147, 72, 36,121, 10,133,226, 87,129, 64,176, 24,128,242,239,114,128,228,235, 78,114,240,216, 7, 44, 54,206,247,240,149, 18,
+173,193,204, 6,129,103, 31, 77,182,116, 84,182, 72, 83,192,140, 48, 89, 57,255,111,206, 27,188, 42, 44,246, 80, 16,180, 72,179,
+ 22, 46, 34,145,232, 48, 0, 15,122,121,254, 59, 9, 5,122,246, 20, 8, 22,134, 0, 67, 65,231,211,165, 80,254,122,163,101,179,
+217,180, 5, 5, 5,204,182,109,219,198,107, 52,154, 91, 2,129,224, 13, 0,162,255, 74,129, 43,149,202,211,106,181, 90,167,209,
+104,116,106,181,250, 98, 83,233,255, 82,130, 60, 61, 61,211,220,220,220, 18,106, 39,122,118,121,176, 95,135,254,143,191,237, 30,
+ 54, 97, 80, 11,245, 69, 2,129,224, 13,141, 70,115,107,219,182,109,227,179,178,178, 24,155,205,166,117, 98,255,129,174,174,174,
+215,207,157, 59,247, 86, 65, 65,193,160,140,179, 91, 60,115,207,109,242, 76,251,109,213,224,232,159,214,189,229,226,162,185, 6,
+ 96,224,223,162, 36, 77,156, 23,120,252, 33, 87,115, 12,242,156, 50,155, 87, 76,170, 65, 5,240, 7,195,210,130, 31, 49,165,156,
+ 23, 64,134, 94,206, 52, 42, 78, 23,121,122,253,158,100, 86,131,199, 27, 2, 19,227,221,226, 7, 14,143,247, 60,199,113,195, 69,
+ 34,209,203,244,241,251,239, 68,204,227,245, 63, 61,126,252, 7,175,117,233, 50, 39, 4, 24,215,128,217, 98, 0,188, 20, 18, 18,
+114, 8,192,163,119,241,235, 63, 10, 14, 14,206, 2, 48,151,158, 9,202, 95, 76,247,234, 31,248,168,211, 70,203, 97,163, 53, 57,
+ 16,253,167,182,197,137, 71, 2, 81, 62,165, 45,244,211,219,226,228, 67,129, 24,218,156,220,184,187,187, 99,224,192,129,252,172,
+172, 44,217,130, 5, 11,222,150, 74,165, 41, 0, 70, 54, 71, 75, 38,147, 69,203,229,242, 12,129, 64,112, 91, 94,228,114,121,180,
+ 66,161,200, 16, 8, 4,195,106,167,171, 84,170,211,106,181, 90,167, 82,169, 46, 54, 96,132,162,213,106,181, 78,169, 84, 70,215,
+ 78, 23, 8, 4,195,148, 74,101,166, 74,165,170,155, 62, 84,165, 82,101,212, 77,111, 8,161, 80,232,151,145,145,161,205,204,204,
+212,138,197, 98,175,218,233,233,233,233,218,140,140,140,219,210,157, 65, 32, 16, 12, 85, 40, 20, 25,114,185, 60,186,190,244,186,
+199,212, 16,181,202,110,168, 35,233,206,154,172, 17, 35, 70,156,204,201,201,241,119,113,113,113,169,189,193, 77,227, 50,242,235,
+ 45,235,231, 79, 24, 61,226,121,207,208,137,157,155,169, 63, 82, 42,149,166, 44, 88,176,224,237,172,172, 44, 89,223,190,125,249,
+ 60,158, 83,191, 39, 34, 38, 76,152,176, 79,167,211,249,118,237,218,149,111,183,219,113,117,255, 98,200, 99, 95,134, 52,101, 35,
+ 90,203,242, 5,183,126, 94,230, 55, 98,112,207,125,184,199,141, 65,201,238, 80, 17, 24,110, 32, 71,136,231,245, 44,147,231,152,
+241, 15, 11, 46,101, 24, 61,109, 44,235, 6,240, 7,147,175, 2, 36,205,210, 20,216, 6,112,132,120,253,146, 42,244, 28,242,200,
+ 28,254,241, 84,129,167,141,101,221,193,195,160,230,104,214,190,252,249,124,254,252, 85,171, 86,241, 0,204, 6, 32,254, 47, 61,
+133,123,181,130,239,208,246,252,243,221,125,208,255, 46,202,134, 87,221,239, 65,127,151,227,180,112,220,141, 93,201,201, 71,166,
+183,111, 63,246,181, 46, 93,158,172,199,108, 49, 0, 94, 91,182,108,217,227, 87,175, 94,245,108,219,182,237,115,119,233, 71,255,
+154,101,203,150,189,122,245,234,213, 86,129,129,129,239,130, 14, 95,244,175,130, 16, 34, 38,132, 12, 33,132,140, 33,132, 12, 35,
+132,244,170,250,251,190,170,101, 12, 33, 36,162,206,250,190,170,125,171,183,247,110, 64, 99, 76,221,253,106,237, 83,247,255,219,
+254,174,199,104,141, 65,101, 91,173, 49,183, 29,192,193,131, 7, 73,237,117, 93,166, 4,226,157, 57,253,124, 13,215, 15,236, 32,
+250,140,100, 82, 28,127,137, 92,218,252, 33,153,115,159,167,225,177,182,248,200,249,242, 34,228,212,169, 83,228,234,213,171, 68,
+175,215,147,196,196, 68,210,187,119,111,163, 92, 46,255, 5, 64,160, 51, 98, 42,149, 74,247,203, 47,191,144, 17, 35, 70,148, 42,
+149,202,149,213, 55,151, 90,173,214,157, 58,117,138,140, 24, 49,162, 84,165, 82,173, 1,192, 7,128,135, 30,122, 40,143, 16, 66,
+ 60, 61, 61,179,235,211,155, 48, 97, 66, 49, 33,132,104, 52,154,234,170, 38,190, 74,165, 90,243,226,139, 47,234, 47, 92,184, 64,
+ 92, 93, 93,171,211,121,106,181,122,229,236,217,179,245, 49, 49, 49,181,211, 27,197,205,205, 45,131,101, 89,114,224,192, 1,162,
+213,106,107,242,224,234,234,154,193,178, 44,217,183,111, 95,131,121,107, 44, 80,160, 84, 42, 87, 76,159, 62,189, 60, 53, 53,149,
+184,187,187,235,106,165,175,156, 49, 99, 70,121,122,122, 58,241,240,240,112, 40,143,238,238,238,186,211,167, 79,147, 73,147, 38,
+149,213, 46, 83,119,119,119,221,153, 51,103,170,211, 87, 56,242, 32,107,213,170,213,115, 90,173, 54, 91,171,213,102,187,184,184,
+ 44,241,241,241,201,205,207,207, 39,132, 16,210,174, 93,187,188,218,145, 44,109,248,248,121, 27,119,159, 57, 23, 21, 87,152,223,
+101,248,243, 43, 52, 93, 38,104,156, 40,131, 64,185, 92,254,203,160, 65,131,140, 25, 25, 25,164,162,162,130,196,198,198,146, 83,
+167, 78,145,155, 55,111, 18, 0,196,145,203, 73,169, 84,102,153,205,102,206,108, 54,115,249,249,249,108, 94, 94, 30, 27,191,210,
+135,144, 47,133, 53, 75,201,190,113, 36, 55,106, 41,167, 86,202, 51, 1,168,238,217,131,103,125,152, 31,217, 20,188,235,218, 98,
+255,248,168,101,163,108, 36,245, 56,217,241,164,167,237,196, 60,223, 91,100, 67,200, 15,100, 83,104,235,102,105,110, 8,221, 17,
+251,166,255,141,117,239,190,100, 75, 75, 75, 35, 11,103,140,178, 31,157,227,155, 68, 54,134,236,110,142,102, 45,166, 62,248,224,
+131,250,244,244,116, 18, 22, 22, 86,193,231,243,159,254, 47,153,172,136, 32,113, 86,236, 55, 11,185,113,225,242,194,187,100,182,
+194,181, 90,109,193,214,173, 91,137, 74,165,202,251, 27,153, 45, 38, 4, 24,191,173, 75,151,125,220,228,201,236,182, 46, 93,246,
+133, 0,227,171, 12, 22, 3,224,245,229,203,151,199,216,108,182,152,175,190,250, 42,102,252,248,241, 49, 0, 22,182,240, 59, 63,
+249,232,163,143,136,205,102, 35, 95,125,245, 21, 25, 63,126, 60, 1,176,214,209,157,149, 74,101,135,206,157, 59,111, 15, 11, 11,
+ 75,239,218,181,171, 37, 52, 52,212, 20, 20, 20,148, 26, 30, 30,190, 85, 34,145, 4,130,242,151,208,152, 23, 33,132,244,122,253,
+245,215,223, 0, 64, 94,127,253,245, 55, 8, 33, 99,170,252,196,152,218,127,215, 93, 87,155,167,234,255,235,211,168, 94,234,211,
+172,239, 59,234,124, 15, 26,136,100,205,188,227,224, 14, 30, 60, 56,232,224,193,131, 39,234, 30,220,195,109,209,111, 78, 63, 95,
+163, 49, 63,135,196,125,248, 50,249,117,136, 31, 57, 53,216,155, 36,204,127,144,228,124,179,134,188,208,205,213, 48,185, 45,134,
+ 56,107,180, 98, 98, 98, 72, 76, 76, 12,185,120,241, 34, 73, 73, 73, 33,165,165,165,228,219,111,191,101,221,221,221,141, 18,137,
+100, 25, 0,153, 35, 98,106,181, 90, 71, 8, 33,102,179,153, 44, 89,178,196, 84, 21,169,242,210,104, 52, 58, 66, 8, 41, 41, 41,
+ 33,203,150, 45, 51,105, 52,154, 88, 0,173, 60, 60, 60, 50,146,147,147,137,151,151, 87,189,102,198,213,213, 85,119,227,198,141,
+106,227,228,235,234,234, 26,183,127,255,126, 43, 33,132,100,102,102, 18, 55, 55, 55, 29, 0, 47,119,119,247, 75, 7, 15, 30,180,
+ 18, 66, 72,118,118,118,117,186, 67, 70,203,104, 52,146,163, 71,143,222,150,135,234,244, 67,135, 14,221,102,192, 28,192, 75,163,
+209,196,124,251,237,183, 22,150,101, 73, 92, 92, 92,181, 73,244,114,113,113,185,184,123,247,110, 11,203,178, 36, 62, 62,222, 97,
+ 51,216,166, 77,155, 60, 66, 8,177,219,237,100,227,198,141,230,234, 50,173, 78,183, 88, 44,228,179,207, 62, 51,171,213,234, 24,
+ 0,141, 70,223, 60, 60, 60,178, 45, 22, 11, 41, 41, 41, 33,189,123,247,214,159, 58,117,138,148,149,149, 17, 66, 8,105,211,166,
+ 77, 30, 0, 4, 15,122,250,253,115,137,250,178,167, 94, 93,255, 93, 96,175,199, 62, 60,114, 62, 43,243,139,189,209, 49, 30,225,
+ 19, 70, 57, 18,212,148, 72, 36,203,124,124,124, 76,191,255,254, 59,107,181, 90, 73,122,122, 58,185,120,241, 98,205, 53,118,229,
+202, 21,135,140,150, 64, 32, 88,124,238,220, 57, 43,203,178, 92, 65, 65, 1,155,151,151,199,230,229,229,217,235, 26, 45,242,165,
+144, 20, 28,122,150, 68,110,158,107, 17,137, 68,139,239, 77, 52, 11,124,178, 41,120, 2,217, 20, 28,179,117,186, 71, 65,249,197,
+157,132,252, 60,151, 36,189,223,150, 44, 30,165, 42,231, 54, 5,199,144, 77, 33,147,201, 59,131, 4, 78,105,110, 14, 29, 71, 54,
+ 5,199,124,244,112, 64,225,165,152, 11,228,196,137, 19,228,179, 53,203,201,156, 8,223, 10,110, 83,112, 12,217, 16, 58,201, 25,
+205,218, 72, 36,146,196,147, 39, 79,146,168,168, 40,242,238,187,239, 18,185, 92,158,126, 55,162,122,100, 67, 80, 0,249, 60,104,
+ 16,217,210,209,135,252, 54,232,111,215,193,167, 87, 43,248, 14, 15, 18,103, 22, 92,218, 75, 72,209, 77,146,187, 50,140,140, 10,
+ 22,182,212,108,133,107,181,218,252,212,212, 84,146,155,155, 75, 86,175, 94, 77,212,106,245,223,218,108, 5, 3, 19, 0,188,177,
+ 98,197,138, 26,147,181,126,253,250,152, 43, 87,174,196,248,251,251,255,212,130,239, 90,187, 98,197,138, 26,147,181,126,253,122,
+114,229,202, 21, 18, 16, 16,144,209,212,142,211,167, 79,151,247,235,215, 47,102,218,180,105,134,173, 91,183,146,212,212, 84, 18,
+ 27, 27, 75, 86,172, 88, 65,222,126,251,109,242,229,151, 95,146, 73,147, 38, 85,244,238,221,251,220,228,201,147,165, 78, 70, 20,
+ 4, 85, 81, 24, 49, 33, 68, 72, 8,169, 54,154, 2, 0,194,234, 31,255, 20,199,188, 72, 67,102,170, 33,131, 85,119, 91, 35, 70,
+172, 81,195,230,192,247,221,105,170,234, 70, 66,106,253,253,219,216,177, 99, 7,221,241,242, 33,120,111,230,130,247,165, 41, 91,
+ 87, 67,247,237,167,224,151,232, 32, 44, 47,132,249,100, 36,108, 39,247,227,241,190,125,101, 50,134,249,192,217, 2, 21,139,197,
+ 16,139,197, 16,137, 68, 48, 24, 12,200,206,206,198,253,247,223,207,187,120,241,162,244,185,231,158,155, 43,147,201,210, 1, 76,
+108,242,110,102, 42, 35,210,167, 79,159,198,179,207, 62, 43,217,190,125,123, 87, 79, 79,207,203, 44,203,138, 1, 32, 62, 62, 30,
+ 83,166, 76,145,236,220,185,179, 83,171, 86,173, 46, 90,173, 86,185, 68, 34, 1,159,207,111, 80, 79, 44, 22,195,102,179, 73, 58,
+118,236, 24,123,249,242,229,240,177, 99,199, 10,211,210,210,144,156,156, 12,155,205, 38, 14, 10, 10,186,114,241,226,197,174, 99,
+198,140, 17,102,100,100, 32, 45, 45,173, 38, 31,142,228,215, 98,177, 64, 34,145,160,118,149, 22,195, 48, 48,155,205, 16,139,197,
+ 14,107, 9, 4,130,161, 33, 33, 33, 87, 46, 95,190,220,125,194,132, 9,162, 11, 23, 46, 32, 51, 51, 19, 44,203,138, 67, 67, 67,
+175, 92,190,124,185,219,248,241,227, 69,177,177,177,208,233,116,112,180, 10,173,250,115,151, 47, 95,198,180,105,211,196,135, 15,
+ 31,238,230,227,227, 19,107,183,219,197, 0,112,229,202, 21, 76,153, 50, 69,124,228,200,145,238,173, 91,183,142,109,162, 42,145,
+ 15, 0, 54,155, 13,207, 61,247,156, 66,173, 86, 35, 35, 35, 3, 28,199,129,101, 89, 0, 64, 97,113,225,149,203, 87,226,226, 31,
+159,250,240, 32,163,213,108, 62,115, 62,250,122,187, 54, 1,126, 12, 67,218, 52,145,213,137, 10,133, 34,125,229,202,149,243, 82,
+ 83, 83, 37, 33, 33, 33,188,164,164, 36,148,151,151, 67, 36, 18,213, 92, 99,142, 30,183, 88, 44, 30, 28, 22, 22, 38, 48,153, 76,
+224, 56, 14, 0, 8,143,199,171,247,100, 72, 75, 78, 34,212,203, 46,148,201,100,131,239,201, 19,169, 44,204, 29, 28,134,167,229,
+ 91, 36, 18, 23, 63,149,210, 39, 8, 72,143, 66, 91, 79, 9,248, 60,190,244, 66,178, 65, 1,144,225,240, 47,112,119, 78,147, 27,
+158,156,103,145,216,220, 58, 41, 91,249,249,163,176,176, 16,173,219,133,192, 36,246, 20,159,190, 89,161, 4,227,164,230, 31, 12,
+232,216,177,163,119,135, 14, 29, 80, 80, 80,128,238,221,187,195,213,213,213, 21,192,240,102,155,172,175, 2, 36, 40, 67,127,128,
+183, 18, 44,243, 46,108,130,165,184,153,223,157,108,234, 46,252, 59,153, 44,181, 82,124,118,231,174,111,125,221,253, 67,129,200,
+167,224,229, 34,193,150,231,187,187,121,106, 36,251,154,105,182,194,189,188,188,142,159, 59,119,206, 67, 42,149,226,226,197,139,
+ 8, 11, 11,195,234,213,171, 61, 93, 93, 93,163,254, 38,102,139,196, 3, 7, 62,138,141,253,106,251,173, 91, 7,167,183,111, 63,
+118, 90, 80,208,146, 89,143, 62,250,244, 75, 47,189,132,229,203,151, 99,223,190,125,232,223,191, 63,102,206,156,105, 75, 79, 79,
+223,214,204,239,249,116,229,202,149,115,230,206,157, 91, 87,211,154,150,150,214,104,109, 75, 88, 88,152, 95, 98, 98, 98,214,252,
+249,243,187,111,223,190, 93, 38,151,203, 81, 82, 82,130,207, 63,255, 28,111,188,241, 6, 24,134, 1, 33, 4, 95,126,249,165,252,
+201, 39,159,236,117,235,214,173,172,128,128,128, 38,155,117, 16, 66, 24, 66,136, 20,128,188,106, 81, 0,144,239,220,185, 83, 51,
+ 97,194, 4,117, 85,154,172,106,145,128, 82,151,122,189, 72,173,119,229,193, 58,229, 61,182,110, 90,221,109,132,144,177,141,105,
+ 56,105,160,235,251,190,200,198,204, 86,237, 55,208,224,122, 93, 36,208,197, 59, 48, 24,165, 63,239,134, 76,192, 64,198,175, 90,
+ 4, 12,120, 73, 87,208, 90, 42,132,141,144,240,230, 26,173,234, 69, 40, 20,194, 96, 48,128,101, 89,188,241,198, 27,146,163, 71,
+143,186,243,120,188, 31,154,210,169,109,152, 18, 18, 18, 16, 26, 26,202, 28, 56,112,192,107,246,236,217,178,234,239, 41, 45, 45,
+ 69,135, 14, 29,152, 67,135, 14,105,223,124,243, 77,101, 99,102,134, 97, 24,136, 68, 34,204,157, 59, 87,118,254,252,121,183, 86,
+173, 90, 33, 41, 41, 9, 69, 69, 69, 80, 42,149,152, 59,119,174,236,220,185,115,158,173, 90,181, 66,106,106, 42, 74, 75, 75,161,
+ 84, 42,157, 54, 90, 34,145,232,182,125, 24,134,129,213,106,117,202, 24,104, 52,154, 29, 49, 49, 49,158, 26,141, 6,177,177,177,
+176,219,237,208,104, 52,152, 51,103,142, 44, 38, 38,198,211,197,197, 5,241,241,241, 32,132, 64,173, 86, 59,149, 71, 0,224, 56,
+ 14,241,241,241,104,211,166, 13,162,162,162,180,179,102,205,146, 86,167,223,188,121, 19,126,126,126,136,138,138,210, 42, 20,138,
+ 29, 13,105,113, 28,135,156,156, 28, 92,189,122, 21, 73, 73, 73,200,207,207, 71, 65, 65, 1,202,203,203, 97,183,219, 1, 0,242,
+242,178,200,157,223, 29,184, 44,147,201,228, 97, 65, 29,253,175,196, 93,203,147,201,100,242, 0,127,255, 32,224, 29, 94, 35,134,
+240,135,180,180, 52,247, 39,159,124, 82,148,155,155,139,226,226, 98, 8, 4,130, 59,174, 45,177,216,177,166, 64,118,187, 61, 84,
+ 42,149, 50, 86,171,181, 38, 2, 38, 22,139, 49,111,135, 1, 97,139,113,219,242,232,154, 60, 16,214, 6,139,197, 18,250,151,191,
+193, 0, 6,140,165, 35, 24,166,251,217,164, 10,183, 1, 99,167,138,144,124, 24,224,108, 0, 79,128,193, 93,252, 4,251,174, 84,
+120,129,160, 11,204, 8, 33,164,233,158, 95, 4, 96, 0,107, 7,128,233,121, 52,209,238,222,255,193,231, 69, 89, 89, 89, 16,137,
+ 68,144, 72, 36,232, 62,244, 33,193,206,203, 54,111, 48,232, 10, 43,130, 29,209,188, 45,236, 40,147,189,245,246,219,111, 43,106,
+107, 62,253,244,211, 10,141, 70,243,118,179, 77, 86,133,188, 47,236,100,238,213, 44, 67,155, 37,145,185,161,183,242,140,193, 32,
+100, 62, 96,235,118, 23,204,214, 96,137, 68,146, 12,224,254, 22,153, 44,149,248,204,174, 93,223,250,186,181,174, 52, 89,176,155,
+ 0,161, 12,222,158, 46,216, 50,111,136,155,167,139,204, 89,179, 21,238,229,229,245,203,217,179,103, 61,164, 82, 41, 98, 98, 98,
+ 32, 18,137, 32,149, 74,209,185,115,103,108,218,180,201,211,205,205,237,111,101,182,150,197,198,110, 93,122,245,106,194,235,225,
+225, 33, 19, 21, 10,183, 23,167, 77,211,188,249,230,155, 7,247,239,223,255,213,152, 49, 99, 10,206,159, 63,255, 49,128,221,206,
+ 70,204, 0,172, 95,181,106,213,139,213,198,237,205, 55,223,252,114,255,254,253, 75,199,140, 25,147,115,254,252,249,249, 0,214,
+ 55, 38,160,215,235,247, 47, 90,180, 72,243,224,131, 15, 86,255,143,147, 39, 79, 98,219,182,109, 80, 40, 20,183,125,118,252,248,
+241,120,246,217,103, 93, 45, 22, 75,163,239, 36,173, 86, 59,236,236,217,179, 97,168,236,224, 37,169, 54, 90,113,113,113, 46,101,
+101,101, 46, 74,165,210,197,199,199, 71, 85,109,182, 30,124,240, 65, 23,129, 64,112, 63, 40,104,202,139,212, 54, 58,142,164, 53,
+247,243,142,154,173, 58, 73, 13,142,161,117,155,209, 26, 59,118,236, 9, 52,208,147,202, 90,164,131, 4, 44,100,124, 6,114,126,
+ 45,179, 5, 14,130,210, 60, 48,205,232,192, 91,223,203, 80, 44, 22,131,207,231,195, 98,177,160,176,176,208, 41, 83,160, 86,171,
+161, 84, 42, 97, 52, 26, 97,183,219, 33,149, 74,171,205, 8,212,106, 53,132, 66, 33,132, 66, 33,164, 82,233, 29,209,164,186,209,
+ 28,145, 72, 4,133, 66,129,156,156, 28,164,165,165,129,227, 56, 40,149, 74, 40, 20, 10,136,197, 98,100,103,103, 35, 59, 59, 27,
+132, 16, 40, 20, 10, 40, 20, 10, 56,211,224,154,101,217,122, 95,254, 54,155,205,169,136,150,221,110,199,245,235,215,145,158,158,
+ 14,169, 84, 90,115,172, 18,137, 4, 55,111,222, 68,110,110, 46,228,114, 57,212,106, 53, 52, 26,141,195,186,213,199,162, 82,169,
+ 32,147,201, 80, 92, 92, 12,131,193, 80, 83,166,106,181, 26, 10,133, 2,165,165,165,200,203,203,107,244,216, 89,150, 69,118,118,
+ 54,242,243,243,145,145,145,129,130,130,130, 26,179, 85, 21, 53,106, 89, 96,167,172, 12,133,133,133, 53,145,200,134, 22, 71,224,
+ 56, 14,229,229,229, 56,123,246, 44,195,113, 28, 74, 74, 74,184,252,220, 92,246,133,108, 49,246,189,179,129,124,123,248,146,105,
+231, 79, 49,198, 61,191, 92, 53,174,223,115,197, 40,237,253,174,253,158, 60,134, 62, 11,215,192, 38, 28, 81,160,183, 73,242,173,
+ 34,141, 87,120, 4,144,124, 8,224, 9, 0,169, 43,250,116,106,139,180, 98, 86,113, 67,103,145,130,193, 72,172, 15,114,117, 72,
+147, 21, 14,207, 47,183, 73, 82,173,158,234,208, 46, 61,160,211,233, 32,145, 72, 32,145, 72,208,179,127, 4,146, 11, 89,249,181,
+ 44,163, 28, 4, 35, 28,210,252,131,118, 74,165,178,239,253,247,223,207,212,214, 28, 61,122, 52, 24,134,233, 12, 32,196,169,135,
+220,218,118, 98, 88,229,125, 32, 32,115,175,229, 24, 90,237,139, 51, 5,141,155,248,144,219, 39,199,242, 66,175,231,154, 3, 65,
+108, 11, 64,172, 61, 90, 96,182, 6,169, 84,170,131,235,214,173, 11,148, 74,165,135, 0, 12,104,142,136, 82,198,223,248,214,139,
+ 83,125, 93,171, 77,150,205, 0, 8,100,128, 80, 6, 8,100,240,214,122,224,131,103,135,187,201,165,194, 61, 78, 24,214,157,235,
+215,175,247,172,107,178,170,151,238,221,187, 99,241,226,197,158,110,110,110, 59,238,241,203,114,132, 70,163,217, 30, 17, 17,113,
+ 54, 91,165,122, 54,167, 71, 15,241, 47, 26, 77,233,176,210, 82, 77, 64, 92,156, 53, 24,184, 2,224,179,204,204,204, 81, 78,152,
+172, 71,213,106,117,204,176, 97,195,172, 42,149, 42,125,245,234,213, 47,204,158, 61, 27,203,151, 47,199,162, 69,139, 62, 7,240,
+ 12,128,255,101,102,102,182,106,202,100, 1, 64,110,110,238, 99,175,189,246, 90, 65, 65, 65, 1, 0,160,115,231,206, 40, 41, 41,
+193,194,133, 11,241,242,203,149,157, 98,187,117,235, 6, 66, 8,116, 58, 29, 86,174, 92,169,203,205,205,125,162,137,103,123,198,
+238,221,187,123, 89,173, 86, 63, 84, 86, 15, 74, 74, 74, 74,212, 69, 69, 69, 42,171,213,170,224, 56, 78,225,226,226,162, 4, 32,
+127,252,241,199, 5,215,174, 93, 11,181,219,237, 89,212, 91,253, 65, 99, 94,164, 57, 48, 12, 19,217,146,200, 85,125, 17,177, 6,
+104, 60,162, 53,118,236, 88,166,246,250,182,136, 17,131,216,244,232, 40,184,133,247,184, 45,154, 37,231, 51,144,169, 53, 72,206,
+ 72,131, 8,204,213,187,101,180,138,139,139,241,194, 11, 47, 24, 31,123,236,177, 66,142,227, 30,114,212, 20,104, 52, 26,104, 52,
+ 26, 92,187,118,141, 76,154, 52, 73,183,122,245,106, 99,109,163,149,144,144, 64, 70,140, 24,145,247,246,219,111,235, 27, 51, 90,
+213, 17,173,101,203,150, 25, 7, 15, 30,156,127,245,234, 85, 82,109,166,148, 74, 37, 86,174, 92,105, 28, 50,100,136,238,194,133,
+ 11,164, 58,205,153,136, 22,143,199,171, 49, 90,181,247,225,241,120,224, 56,206, 41,163, 85, 81, 81,241,216,152, 49, 99,116,241,
+241,241,164,250, 56, 53, 26, 13, 86,175, 94,109, 28, 62,124,184,238,234,213,171,164, 58, 77,173, 86, 59,108, 6,171,191, 95,165,
+ 82, 65,173, 86,227,218,181,107,100,196,136, 17,186,181,107,215,154,106,167, 95,191,126,157,140, 31, 63, 94, 87, 94, 94,254, 88,
+ 99,230,165,186, 58,207,110,183,195,100, 50,161,160,160, 0, 25, 25, 25, 53, 85,135, 70,133,122,212,212, 71,198,117, 53, 26,141,
+134,107, 9,137,233,157, 59,133,105,141, 70,163, 33, 45, 61, 61, 1,120,135,107, 68,251,161,240,240,240,194, 23, 94,120,193, 88,
+ 92, 92,220, 98,163, 37, 22,139,227, 5, 2, 1, 25, 48, 96, 0,177, 88, 44, 36, 35, 35,195, 86, 80, 92,108, 15,249,240, 67,114,
+117,222, 60, 70, 22, 29, 45, 81, 42,149, 76,149, 38, 47, 41, 41,137,147,201,100,241,127,249,147,136,199,121,131, 33,247,255,158,
+168,119, 25, 62,110,138,152,201, 61, 15, 88,245,128,196, 21,144,184, 66,160,112,199, 3, 3,186,241,183,158, 45,243, 6,225,250,
+ 65, 36,241,107, 82, 83, 72,188, 0,110,192,207, 9, 38,215,251, 39,207, 17, 23, 21, 21,129,207,231,215,152, 34,185, 66,129, 97,
+ 19, 31,231,125,121,222,236, 13,144,254, 96,248,126, 78,220,235,175,190,245,214, 91,162,226,226, 98,240,120,188, 63, 52,229,114,
+204,154, 53, 75,162, 86,171, 23, 57,252,240,219, 29, 42,130, 80,210, 7, 32, 47,223,200, 53,181,218,127,197, 24,188, 96,217, 22,
+ 89,120,183, 94,120,110,176, 86,182, 44, 50, 47,252,114,134,177, 45,192,206,131,221,210,179, 25,102,107,128, 74,165,138,140,142,
+142,150,143, 30, 61, 26, 43, 87,174, 84,200,100,178, 67,205,121,240, 87,232,217,217,239,173,253, 90, 23,251,241, 72,192, 90, 81,
+105,176,106, 45,121,122, 14,139,183, 28, 47,181,217,200, 84, 71, 53,141, 70,227,140,103,158,121,166,112,207,158, 61,119,152, 44,
+169, 84,138,148,148, 20, 44, 89,178,164,168,168,168,232,137,123,105,178,102,207,158,189, 36, 51, 51, 51,248,231,159,127, 22,228,
+231,231,107, 87,125,241, 69,233,247,165,165, 69, 75,227,226,110,252,175, 83,167,142,175,119,233,242, 68, 35, 67, 63,212,107,178,
+ 94,124,241,197,157,153,153,153,221,143, 29, 59, 38,204,207,207,247,123,241,197, 23,177, 98,197, 10, 44, 90,180,104, 19,128,231,
+224, 88,135,151, 63, 2, 8, 86,235,141,226,226,226,177, 35, 71,142, 44, 41, 46, 46, 70,151, 46, 93, 48,110,220, 56,120,123,123,
+163, 85,171, 86,152, 48, 97, 2,130,130,130, 80, 88, 88,136,169, 83,167, 22,229,231,231,143, 4,144,212,152,102, 97, 97,225,173,
+ 29, 59,118, 36,204,153, 51,167,123,102,102,102, 40, 0,247,242,242,114, 69,121,121,185,196, 98,177,200, 92, 93, 93, 93,187,117,
+235,230, 49,115,230, 76,229,165, 75,151, 66, 51, 51, 51,245, 0,210,168,189,170, 49, 89, 13,122, 17, 0,249, 85,134,199, 82,103,
+157,223,196, 54, 71,247,173,247,111, 7, 62, 87,215,108,213, 94,238,168, 58,172,255, 98, 4, 22,111,219,189,213, 36,246,239, 0,
+ 77,112, 87,200,165, 82,200,196, 98,200, 92,221, 97,230, 56,124,145,146,107,168, 32,100,145,179, 5, 90,247, 69,200, 48, 12, 62,
+253,244, 83,123,223,190,125, 77,199,143, 31, 95,103, 52, 26,253, 1,236,117,198, 20,172, 93,187,214, 48,119,238,220,203,121,121,
+121, 93,165, 82,169,165, 58,125,221,186,117,134,199, 31,127, 60, 46, 51, 51,179,187, 92, 46, 55, 52,212, 62,171,182,209,146, 72,
+ 36,230,188,188,188, 94, 79, 63,253,116,252,103,159,125, 86, 33,151,203,161, 80, 40, 32,145, 72, 44,121,121,121, 93, 95,120,225,
+133,203, 43, 86,172, 48,200,100, 50, 40, 20, 10,167,170,229, 8, 33,119, 24,170,218,233,142, 98,183,219,143,231,229,229,117,157,
+ 59,119,238,165, 79, 62,249,164,162,218, 0,213,206,227,170, 85,171, 12, 74,165,210,169,136, 86,245,231, 20, 10, 5,214,172, 89,
+ 99,152, 51,103,206,229,188,188,188,174, 18,137,196, 82, 43,189, 98,246,236,217,151,242,242,242,186,218,237,246,227,141,252,194,
+ 99,203,202,202, 32, 16, 8, 16, 23, 23,103, 22,137, 68,224,241,120,184,121,243,102,141,209,114,115,115, 11,235,218,185, 83,200,
+215, 59,119,159,144,137, 36,146,190,189,122,134, 38,165,166,101, 18,194,164, 54,145,213,189, 70,163,209,255,248,241,227,235,250,
+246,237,107,250,244,211, 79,237, 13, 69,182, 28,193,108, 54,159,184,120,241,162, 77, 42,149, 50, 57, 57, 57,118, 62,159, 15,150,
+101,137,185, 87, 47,115,231, 79, 62, 33,215, 94,127,157, 81, 43, 20, 2,145, 72, 4,185, 92,206, 28, 62,124,216, 98, 48, 24, 78,
+252,245, 70, 11,114, 48,144, 37,230,153, 85, 82,158,157, 65,194,222, 74,147, 37,117, 1,164,174,128,212, 21,190,190,126, 56,159,
+ 98, 80,129, 7, 49, 88, 7,198, 16, 35, 68, 1, 6,242, 56, 29, 84, 66,177,140,201,205,205,173, 49, 68,213, 75, 96,135, 80, 92,
+ 76,211, 43,193, 16, 9,248,112,102, 8,146,177,238,238,238,130,156,156,156, 59, 52,195,194,194,248, 54,155,205,241,161, 93,178,
+ 89, 31,128,123, 49, 33,215,228,243,227,229,138,224,121, 75,191,148,201,216, 18, 32,122, 45,194,219,181,194,188,201,221,196,111,
+238,207, 15,191,144,106,104, 7, 62,121, 14,156,222,211,137,124,222,175, 82,169, 14, 93,184,112, 65,174, 82,169,144,148,148,132,
+ 94,189,122, 97,243,230,205,114,185, 92,254, 19, 0,167,218,227,157,211, 33, 77, 95,206,246,125,117,119,122,110,108,142,253, 54,
+147,149, 95, 65,240,204, 71,251, 75,138,203, 76, 15,157,205,104,248,254,169,135, 75, 37, 37, 37, 35, 22, 45, 90, 84,152,159,159,
+127,155,201, 74, 75, 75,171, 54, 4,131, 1, 92,189, 87, 47, 75,141, 70, 51,109,233,210,165,184,112,225, 2, 70,143, 30,141,168,
+168, 40, 20, 21, 21, 97,215,161, 67,137, 59, 18, 19,255, 87,221,102,171,129,161, 31,234, 69,173, 86, 47, 88,186,116, 41,162,163,
+163,107, 52, 11, 11, 11,177,116,233,210, 76, 0,207, 59,107,178,170,201,203,203, 59,127,227,198,141,145, 93,186,116,185,190,110,
+221,186, 76, 31, 31, 31,110,230,204,153,120,230,153,103,224,233,233,201,174, 89,179, 38,125,192,128, 1,113,183,110,221,138, 48,
+ 24, 12, 87, 28,249, 45, 80, 80, 80,112,122,243,230,205,103,135, 14, 29, 42,159, 49, 99,134,231,190,125,251,220, 13, 6, 67, 43,
+137, 68,162,181, 88, 44,226,235,215,175,243,191,255,254,123,239,107,215,174,165,152, 76,166,243,205,205,251,127, 13,134, 97, 46,
+ 48, 12, 19,201, 48,204,177, 58,235, 11,141,109,115, 98,223,134,254,110,244,115,117,178,185,185,206,226, 56,211,218,225,157, 89,
+157, 84,134,211,211,251,144,220,153,247, 19,221,148, 80,114,114,144, 27,121,186, 61, 83, 49,163,153,195, 59, 24,141,198,154,101,
+207,158, 61,196,219,219,187, 66,165, 82, 57, 61,188,131,183,183,183,174,172,172,140,220,119,223,125, 69,158,158,158, 53, 67, 17,
+248,248,248,232, 42, 42, 42, 72,159, 62,125,138,180, 90,109,205,240, 14,126,126,126, 25,132, 16, 18, 16, 16,144,221,144,158,221,
+110, 39,222,222,222,213, 61,244,132,110,110,110, 27,122,247,238, 93,164,211,233,136,143,143, 79,205,208, 9,158,158,158, 43,123,
+245,234, 85, 55,189,169,252,102,100,102,102,146,204,204, 76,210,186,117,235,236,218,233,105,105,105, 36, 45, 45,141,248,249,249,
+ 57, 61,188,131,167,167,231,138,122,242,210,172, 60,250,251,251,235,140, 70, 35,233,215,175,223,109,101,234,239,239,175, 51,153,
+ 76,213,233, 14, 13,239, 32,147,201,158,147, 74,165,217, 82,169, 52, 91, 34,145, 44,105,211,166, 77,222,119,223,125, 71,214,172,
+ 89, 83,221, 37, 29,158, 97,227,251,118,232,247,196,255, 60,195, 38, 44,104,201,240, 14, 42,149,234, 23,111,111,239,138, 61,123,
+246,220,118,125, 25,141, 70,135,135,119,144,201,100,153,122,189,158,211,233,116,182, 83,167, 78, 25,162,163,163, 13,113,113,113,
+134,148,148, 20, 99, 97, 94,158, 85,167,211, 25, 75, 75, 75,205,151, 47, 95, 54,203,229,247,102,120, 7,178, 57,168, 3,217, 16,
+178,255,214,123,129,215,230, 14,148,155,174,124,208,149,144, 31, 30, 36,228,167,103, 8, 57,254, 42, 57,191,105, 38,233, 23, 40,
+ 97, 79, 45,108,157, 64, 54, 6,255,232,200,144, 12,100,115,231, 14,100, 67,200, 79,137,239, 6, 94,155, 49,160,149,233,139,207,
+214,144,115,231,206,145,184,184, 56,146,148,148, 68,126,218,251, 29,233,215, 78, 94,169,185, 33,100,191,147,195, 60,244,151, 72,
+ 36,250,213,171, 87,147,179,103,207,214,104,238,223,191,159,200,229,114, 3,224, 88,175,101, 2, 48,100, 67,216, 68,251,103,193,
+191,191, 57, 92, 89, 94,120,240, 85, 66,174,108, 37,100,115, 56, 33, 95,245, 38,228,187, 49,132, 28,120,130,156, 93, 51,153,244,
+ 15, 20,217,200,198,224, 40,178, 41,204,225,198,246, 66,161,176,108,207,158, 61, 36, 59, 59,155, 68, 69, 69,145,232,232,104, 18,
+ 31, 31, 79,210,211,211, 73,100,100, 36, 17, 10,133, 38, 52, 99,218,178,222, 94, 8,136,232, 40,202,185,188,172, 63, 33,251,166,
+146,252, 29,211,200,216, 78,170,162, 62,173, 91, 52, 30, 93, 55,119,119,247,130,200,200, 72,146,146,146, 66, 78,156, 56, 65,180,
+ 90,109, 1,128,240,123,253, 66,140,136,136, 56, 71, 8,137, 25, 61,122,116, 12,128,195, 17, 17, 17, 49,201,201,201, 49,189,122,
+245, 58,139,198,135,126,104,144, 97,195,134, 89, 9, 33,100,244,232,209, 4, 64,118, 68, 68, 4, 73, 78, 78, 38,189,122,245,178,
+220,165,108,243, 1, 60, 33, 20, 10,191,112,115,115,251,213,213,213,245, 56,159,207,223, 12, 96, 58,154, 63, 30, 23, 31, 64, 43,
+ 0, 97, 0,122, 86, 45,161, 85,105,180,199, 33,229, 78, 38, 7,162,255,147,237,152, 19,143,181, 69,249,212,182,208, 63,213,158,
+113,100,192,210,136,134,140, 22,199,113, 36, 33, 33,129, 12, 25, 50,164, 66,161, 80,100,193,241, 1, 75,111,211,244,240,240,136,
+214,106,181,119, 12,162, 89, 43,253,182, 1, 75,181, 90,237,105, 31, 31, 31,157,167,167,231,197,250, 52, 61, 60, 60,162,125,124,
+124,116, 30, 30, 30,183, 13,238,201,231,243, 71,123,120,120,100,213, 77, 23, 8, 4, 67,181, 90,109, 70,221,244, 6,142, 29,222,
+222,222, 25,217,217,217, 36, 63, 63,159,248,251,251,103,215, 53, 96,185,185,185,183, 25, 48, 71, 52,155,202, 75, 35,121,172, 87,
+211,129, 50,109,206,121,175, 38,200,215,215, 55,111,213,170, 85, 68,169, 84,230,213,222, 16, 60,240,169,183,206, 37,234,203,158,
+121,109,195,119,245, 12, 88,234,232,224,160, 35, 21, 10, 69,214,144, 33, 67, 42, 18, 18, 18, 8,199,113,132,227,184,134,140, 86,
+125,154,163,122,246,236, 89, 88, 80, 80,192,150,151,151,219, 51, 50, 50,204,201,201,201,198, 15, 62,248,192,154,159,159,111,210,
+235,245,150,216,216, 88,179,143,143, 79, 62,128, 81,206,158,163,230,190,187,234, 86,159,145, 77,161,253,201,198,208,200,248,183,
+ 3,174, 63,209, 91, 97,142, 89, 53,154,144,227,175,146,179, 27,158, 33,125, 3,197,149,134,104, 83,200, 33,242,101,208, 64,178,
+182,157,216, 33,205, 47,218, 15, 32,155, 66, 14, 93, 91, 28,112,253,193, 30,158,150,157, 91, 55,145,155, 55,111,146,253,223,239,
+ 32,125,218, 86,153,172,141,161, 71,201,134,208, 33,142,104,214,103,182,182,108,217, 66,110,222,188, 73,126,252,241, 71, 71, 77,
+ 86, 68,125, 70,235,141, 8,101,201, 51,189,165,230,169,221,196,150, 9,225, 34,235,136, 14, 34,123,191, 0, 1,219,213,135,199,
+133,122,130,140, 8,150,153,201,198,224, 40,178, 49,116,164,163,249, 20,139,197,233,168, 53,166, 78,221, 69, 34,145,228, 55, 98,
+180, 34,154, 52, 91, 65,146,156, 95,222, 27, 74,198,117, 81, 21, 58,104,178,154,186,150,186,121,120,120, 20,124,245,213, 87,196,
+203,203, 43,223, 65,147,245,167, 95,159, 26,141,102,187, 94,175,143, 57,114,228, 72, 76, 68, 68, 68,204,246,237,219, 99, 78,158,
+ 60, 25, 35,151,203,183, 87, 7, 39,234,154,173,208, 59,159,255, 17,117, 34, 90, 49,229,229,229,228,200,145, 35, 36, 34, 34,130,
+108,223,190,157,156, 60,121,146,200,229,242,152,230,230,243,207, 56,118,170,249,159,102, 38, 26,168, 58,252,211,127,220,212,103,
+180, 76, 38, 19, 89,184,112,161, 69, 42,149, 26, 68, 34,145,179, 83,240,252,163, 47, 66, 15, 15,143,211, 94, 94, 94, 58, 47, 47,
+175,219,204, 94,237,116, 15, 15,143,139,255,242, 27, 48, 72, 36, 18,165, 9,133,194,219,167,224, 9, 27,223,183,125,255, 25,139,
+188,194,199, 63,208,194,124,138, 68, 34,209, 27, 82,169,212,176,112,225, 66,139, 94,175,119,198,104, 1,192,112,185, 92,158,181,
+109,219, 54, 99, 98, 98,162,173,168,168,200,126,238,220, 57, 91,116,116,180,229,157,119,222, 41,151,203,229, 89,104,120, 88,130,
+191,164, 60,201,218,118,226,106,179,117,101, 81, 64,252,184, 78,114,235,230,249, 35, 72,223, 54,117, 76, 86,195, 35,185,215,175,
+ 89,101,182, 46,189,233, 31, 63, 36, 72,105, 95,186,104, 30,233,211, 86,118,187,201,114, 66,179,174,217,146,203,229,229,111,191,
+253,182, 51,145,172,219, 13,225, 23,193,254,100, 83,200,246, 74, 19,213,196,178, 33,248,115,242,105,176,255,223,229, 62,234,237,
+133,128, 97, 65,146,171, 78, 68,178, 28,201,103, 55, 87, 87,215,235, 78, 68,178,254,138, 99, 31, 49,107,214,172,152,228,228,228,
+152,164,164,164,152,147, 39, 79,198, 76,156, 56, 49, 6,192,136, 90,159,169, 49, 91,214, 73,147,204,221,120,188,121, 77,104, 62,
+ 58,107,214, 44,146,156,156, 76,146,146,146,200,201,147, 39,201,196,137, 19, 9,156,155,190,135,154, 34,106,180,238, 9,127,246,
+132,159, 17, 0,142,213, 78,144, 74,165, 58,147,201,228,169, 84, 42,247,234,245,250, 57,168,236, 22,217, 34,205, 63, 35,159, 84,
+243, 95,161,233,163, 84, 42,215,233,245,250,137, 82,169, 52,223,100, 50,121, 57,161,233, 34,145, 72,230, 73,165,210, 33, 6,131,
+ 33, 8, 0, 20, 10, 69,130,217,108,254,213,104, 52,126, 12,160,228, 94, 31, 59, 89,219, 78, 12,177,184, 39, 8, 94,143, 73,175,
+104,187,244, 72, 81,192,252,161,174,233,253,218, 43, 82, 32,228, 62, 2, 99, 62,207, 60,153,102,118, 90, 83,198,244, 2, 43,124,
+253,124,170,161,205, 71, 63,151, 7, 44, 24,162, 76,239,215, 78,153, 14,130,143, 32, 49,156,113, 86,179,174,217, 82, 40, 20,219,
+ 42, 42, 42,158, 5,240,171,179,199, 78,118,135,138, 80, 97,243,133,141,223, 9,164,145, 41,124, 8, 49,128,199,143, 67, 46,116,
+204, 59,215,173,244, 62,250,203, 53, 71, 40,149,202,105, 33, 33, 33,237,174, 93,187,150,100, 48, 24,190, 1,112,180,238,251, 39,
+ 4, 24, 34, 23, 8,186, 26,237,246,168,235, 64,116, 19,154,143, 42,149,202, 5, 33, 33, 33,225,215,174, 93,187,106, 48, 24, 86,
+ 1,216, 69,207,209,191, 74,243, 95,201, 95, 62,138,114,245,203, 78,175,215,211,210,167,252,217,228,232,245,250, 73, 85,215,157,
+179,251,150,152,205,230,197,102,179,121,113,245, 15,146,226,226,226,191, 85,163, 85,230,165, 36, 11, 89,219, 46, 26, 98,241,178,
+ 30,254,178, 57,123,102,201, 12, 32, 76, 38,132,220,154, 38, 76, 86, 83,154,231, 33,179, 45,235, 21, 32,123,249,199,231,100, 6,
+ 16,228,130,224,227, 38, 76,150,163,156,170,168,168,104,219,236, 99,126,248,186, 21, 64, 10, 1, 82,241, 78, 35, 63, 20,223, 1,
+ 97,104, 35,227,123,201, 81,189, 94,127,244,252,249,243,141,125,134,196, 3, 4,249, 91,179, 0, 0, 32, 0, 73, 68, 65, 84,199,
+ 97,119,184, 51,192, 46,189, 94,191,171, 9, 77, 10,133, 26, 45, 10,229, 31,200,223,246,133,205,188,148,100, 33,187, 67, 47,160,
+128,191, 16, 60,180, 5,236,105,168,176,231, 50, 47,165, 89, 90,168,121, 14, 5,204, 92,240, 17, 4,177,253, 22,244,150, 92,230,
+249, 52,203,223,230,184, 1,130,119,168,145,162, 80, 40,127, 27,102,226,246,158,134, 53,255, 83,163, 69,161,252,195,169,138,242,
+100, 86, 45,127, 91, 77, 10,133, 66,249, 15, 26, 46, 48,104,184, 65,155, 51,117,175,205,105, 20,119,140,106, 54, 75,147, 15, 64,
+ 3,192, 5,149,211, 56, 84,119, 19,110,106,152,141, 7, 0,216,104,121, 82, 77,170, 73, 53,169, 38,213,188,199,154, 77,105,255,
+ 19,219,126,213,215,203,112,243, 95,241,197,180, 71,198,221,101, 36, 45, 79,170, 73, 53,169, 38,213,164,154,255, 82,205,127, 37,
+ 60, 90, 4,255, 40,164,180, 8, 40, 20, 10,133, 66,249,219,209,189,106,237,131,202,232,150, 79,245,134,123,218, 70, 75,230,222,
+209, 7, 2, 94, 23,134, 35, 33, 0, 64,120, 76, 60,236, 92,172,177, 48, 49,167,165,218,202, 86, 65,110, 4,226,221, 12, 44, 15,
+235,179, 19,138, 90,170,215, 41, 72, 61,201,203, 67, 53, 45,183,176,116,219,213, 27,250,125,206,236,171,209, 4,104,164,110,174,
+147,205, 86, 91, 39,177, 72,148,110, 45, 41,219, 92, 92,156, 84,222,140,108,184, 53,182,241,157,119, 8,115, 48,231, 34, 35,146,
+ 91,121,238,106, 17,163,135,158,232,115,148, 92, 96, 73, 10,249,254,251,135,137,179,231,134,225, 97,176, 66,165,234, 33,145,202,
+123,201, 85,174, 29, 57, 2, 20,233,178, 82, 45, 54,251, 73,214, 98,136, 33, 28,126,187, 27,231,138, 66,161, 80, 40,148,127,129,
+209,186, 8, 96, 12, 42,171, 12,155,110, 12, 31, 16,118,255, 5,169, 84, 22, 8, 0, 28, 33,224, 8, 80, 81, 86, 18,147,155, 20,
+ 61, 18, 0, 60,218,116, 63, 34,148,170,123,112,164,114, 59,203, 1,118,171, 41,165, 44,237,220,125,142,228, 72,225, 25,244,224,
+208,136, 97,147,198,142, 29, 19,220,185, 83,231,246, 0,112, 37,238,202,173,131, 7, 35,111, 28, 63,198,236,169,200, 79,248,177,
+ 37, 71, 76, 32,125,191,103,207,110,247, 71, 71, 95,124, 15,192,139, 45, 45, 65,119,119,229,156,163, 63, 44, 28, 56,108,210, 74,
+ 5,224,156,209,146,186,185, 78,158, 48,110, 84,183, 87, 94,154,197,123,102,225,135,129, 23, 78,253,182, 92,233, 19, 94, 66, 56,
+219,209, 10,221,148,223, 27,155, 56,185,174,127,108,200, 96,125, 83,116,152,183,230,171,190,174,198,162, 91, 83, 8,199, 78, 97,
+ 24, 6,124,177,252,123,207,118,247,127,231, 50,120,126, 49, 0,135,123,140,169,125,194, 34,180, 62,126,123,166, 60, 53, 79, 42,
+215,120, 9,192, 23, 1, 96,144,157,122, 29,199,119, 45,117,125,249,221, 45,221, 79,197,166,217,127,249, 97,189,137, 17, 9, 39,
+ 25,114,174,209,177, 84, 40, 20, 10,133,242, 95, 38,178,202, 92, 69,214,221,208,160,209,146, 74,101,129,103,127, 59,232,246,227,
+201, 12, 0, 64, 68,119,111,252,239,131,117, 35,182,175,141,190, 1, 0,125,135,142, 13,122,239,141,151,112,250,106, 30, 8, 33,
+232,214,193, 29, 15, 76,120,216, 49,227,225, 21,122,223,228,201, 15, 61,182,112,225,130,241, 55,111,222, 76,221,185,115,231,239,
+ 0, 48, 96,224,192, 14, 31,126,248,225, 35, 43, 93,221, 36,223,126,255, 67,150, 73,119,253, 66,115,142, 86,218,170,157,111,112,
+199,182,211,190,253,114, 29,111,240,200,135,166,166,162, 98,169, 41, 59, 41,203,145,125, 61, 60, 60,230, 10,133, 66, 13, 0,112,
+220, 31,254,199,106, 37,222, 0, 96,103, 57,149,107,171,224,114,190, 72,202, 74, 36,162,107,229,122,253,182,178,172,235, 95, 52,
+166,105,182,217,194, 95,126,254, 73,222,165,164, 66, 4,134, 15,224,175, 89,250, 38, 56,214,230, 58,239,141, 15, 38, 71,159,251,
+ 22, 21, 58,156,112,240,208,132,117, 19,124,125,251,240,223, 95,170, 28,206, 48,120, 34,160,239, 83, 19,223,219,250,189,176,103,
+ 7, 53,204, 54, 14,135, 98, 10,251,110,248,248,253, 21,167, 54,140, 57, 0, 96, 19,128, 95, 0, 52,105,234,220,220,221,190,153,
+187,232, 99,101,133,229,143, 97,138,170, 76, 22, 62,223,182, 27,151, 51, 56,132, 4,135, 8,188,231, 46, 87,110,250, 96,230, 86,
+ 67,229,220, 93, 20, 10,133, 66,161,252, 87,201,193,237,141,223, 55, 55,105,180, 0, 64, 41, 19,224, 70,114, 46, 0,192, 69, 6,
+204,121,110, 6, 10, 11,242,131, 44,118, 14, 79,205,152,142,139,241, 57,184,145,146, 15, 66, 8,130,252,228, 14,231,134, 15,174,
+231, 83, 79, 63, 53,232,200,209,163,231,223, 90,244,214,215, 12,131, 51, 0,176,105,243,231,125, 23,191,189,248,217,233, 51,166,
+ 15,255,254,251,239,175, 2,104,150,209, 18, 48,170,117, 43,150, 45, 17,103, 22,152, 76,115, 23,190,206, 45,152, 63,119, 13,128,
+135, 28,114, 50, 66,161, 38, 51, 51, 83,201,227,221,222,124,237,163, 37,175, 71, 13,159,180, 50, 49, 53,189,228,210,145,253,251,
+239, 11, 11, 11, 67,102, 86,110,255,229,159,108,236,122,232,136,236,201,242, 50,227, 36, 67,193,245,122, 39,109,150, 8,133, 87,
+223, 93,190,161, 27,231,210,129,247,191,103, 71, 35,188,125, 43,100,229,149, 96,224,200,241,130,152, 11, 23, 70, 0, 14, 27,173,
+186, 3, 52, 78,182,112,121, 93, 63,220,118,110,216,196,126,173,122,242,120,124,232,141, 54,228,151,154,193,114,192,128, 80, 13,
+ 70,109,255, 68, 80, 84, 97,123,240,131, 31, 50, 30, 60,179,118,172,206, 84,154, 61, 27,192,158,198,191,134,184,249,105,213,184,
+145, 81, 94,175,201,170, 48,217, 1, 0, 34, 62, 11, 6,196,157,222, 95, 20, 10,133, 66,249,143,211, 96,175, 67, 30, 0, 28, 60,
+120,176,222,246, 59, 44, 75,112, 35, 37, 7, 55, 82,114,112, 62, 62, 31, 86, 34,196,154,229,239, 98,213,210,183, 81,100,228,225,
+199,211, 25, 72, 72,201, 69, 66, 74, 46, 10,138,235, 29,233,253,182, 42,165,149, 75,101,221, 63,254, 88,189, 98,196, 64,197, 96,
+ 55, 87, 87,215,196,171, 95, 87, 44,158,175, 11,125,247,229, 12,145,208, 34,201, 84, 40, 21,253,118,239,254, 46,204,203, 83,171,
+ 80, 42, 85,175,202,125,187,110,209,104,186,104, 26,211,172,139, 76, 27, 50,126,252,152, 81, 67,189,189,189,184, 89,107, 98,226,
+ 59,133,134,216, 58,118,232,216, 95,166,237, 56,190,145,221,106, 52, 57,142, 3,143,199,131, 78,167, 67,118,118, 54,146,147,147,
+145,144,144,128,140,140, 84, 29, 71,136,144, 5,199,243,241,241,131, 64, 32, 70, 96,155, 0,108, 88,179, 84,254,193, 59,255,235,
+ 37, 85,136,247,213, 49, 66, 53,154,166,162,226,239,127, 58,124, 52,235,208,206, 13, 44, 0,228, 21,235,113,252,194, 77, 92,188,
+150,225,236,137,172, 59,132, 67,155,172,180,155,101,246,148, 72,254,123,111, 46,200, 56,121,242, 84,106,105,185, 5,229, 6, 43,
+ 12, 38, 27,204, 22, 22, 54,150, 67,128,167, 20,123, 95,239,132,253,191,198,122, 49, 12,243,113, 83,229,105, 54,219,216,251, 67,
+ 20,152, 58,164, 53, 66,252, 20,200,186,113, 6,115, 23,125,140,232,100, 51,138,139, 75, 96,171, 40, 0,167,207, 68, 65,202, 69,
+216, 89,150, 52,117,222,239, 18, 84,147,106, 82, 77,170, 73, 53,255,197,154, 13,121,145,127, 8,155,235, 89, 80, 99,180, 26,226,
+ 86, 70, 17,110, 36,231,162, 71,136, 47,218,183,241,193,249,132, 98,124,115, 60, 3, 91,142,164,225,248,229,124,112, 2, 21,114,
+203,128,196, 84, 29, 18,211, 10,154, 28, 63,155, 47, 17, 78,121,249,229,210,133,157,195,202,250,252,118,104, 14,124, 61, 19,195,
+ 94,123,173,100, 14, 95, 34,156,226,218, 90,181,243,245,133,243,166,169,228,114,177,197,108, 65,187,182, 1,210,151,102,207,121,
+146,113,149,236,116,244, 40, 85,190,161,174, 18,153,236,139, 15,222,121, 85,242,241,143,137,233, 21, 22, 84,236, 57,163, 75, 90,
+240,250,226, 34,129, 80,186, 65,229, 27,234,234,168,150,205,102,131,217,108,134,197, 98,129,213,106, 69, 86,198,245,241,191,252,
+248,202,200,182,173,221, 70, 74,164, 82, 16, 0,101, 70, 59,146,115, 12, 24, 50,108, 56,191, 71,247,238,225, 74,159,208,167,235,
+211, 42, 45, 77, 43,229, 8, 95,117,112,239, 14,254,119, 63, 95,194,215, 7, 47, 96,223,175,151,112,254,196, 33, 59,225,108, 53,
+243,127, 41,125, 58, 4, 41,125, 58,167, 41, 91,117,209,213, 44,190,157,162, 27, 45, 83, 62,143, 12, 25, 22,113,236,185, 23, 95,
+250,205, 80, 94,152,247,197,186,119,179,242,179, 83,175, 75, 68,140, 93, 46,225, 67,111,178, 99,235, 47,217,152,188,244, 50,174,
+165,235, 65, 8,105,114, 2,111, 14,152, 63,229,233, 87, 88,155,213,138, 96,127, 37,118,108, 94,134,241, 67,186, 98,104,103, 87,
+220,215, 94, 1,185,192,140,171,241, 55,176,107,199, 86, 59,199,241, 22,208, 31, 50, 20, 10,133, 66,161, 17,173,154,197,167,246,
+134, 6,171, 14, 77, 38, 99,202, 67, 83,166,195, 71,235,173,156, 48,248, 9, 81,204,173, 18,228,231,164,225,102, 66, 28, 12, 38,
+ 27, 68,174,109, 1,169, 55,218, 4, 6, 32,246,198, 62,235,218, 21,145,122,206,110, 78,105, 72,111,252,120, 31,191,155,241, 12,
+111,197,114,255,179, 9, 55,138,123,236, 88,244, 21, 30,123, 76,233,177, 98,185,255,217,212, 36, 5, 79, 46, 37,253,158,156, 49,
+149,225, 49, 4,175,189,182, 16, 19,198,142,194, 83, 79, 62,206,108,219,182,181, 79,137,131, 71,201, 65,248,233, 27,111,190, 43,
+214,149,216, 45,231, 19,244,102,185, 66, 38, 59,149,168,175, 8, 15,244,151,141,158,244, 68,118,228,238, 47, 62, 6, 48,195, 17,
+173,106,131,101,179,217, 96,181, 90, 1,128, 5, 0, 30,175,114, 93, 88,110, 65, 94,137, 25,186, 18, 51,236, 44,135, 73, 83,102,
+200, 46, 68, 95,158, 1,160,129,246, 90, 28,103,179,219,176,231,231,139,200,186,240, 61,199,240,248,165,181, 26,195, 67,233,211,
+ 33,200,219,219, 63,106,236,164,199, 61,197,210,202,106,216,242, 10, 51,182,109, 92,222,104, 62,121, 12, 67, 56,214, 94, 98,183,
+217, 42,218,181,109,151, 21, 18,214, 85,122,242,183, 35,227, 79, 29,219,163,183,183,123,220,229, 86,106, 14,248, 66, 9,248, 34,
+ 41,204, 86,199,126, 44,232,110,158, 93, 15,128,121,250,133,133,107,230,189,242, 63,254,252,181,191,195, 98, 50,192,108,172, 64,
+ 89,105, 49,100, 2, 27,174,158,222,111, 39,172,109, 94, 69,206,165,245,244,254,162, 80, 40, 20,202,127,156,186,211,239,212,164,
+ 53,104,180,210,174,157,188, 15, 0,130,122,142, 40, 84, 74, 5,110, 2, 30, 3, 93,230, 45,108, 91, 57, 23, 28, 71, 48,250,217,
+ 21, 80, 5,122, 67, 38,226,195,172, 47,212, 23,221, 58,209,104, 91, 29,134,177, 13, 95,191, 41, 43,240,133,231,219,169,119,236,
+208, 11, 1, 96,199, 14,189,240,249, 89,173,213,159,109, 74, 9,236,125,127, 15, 16,150,197,216, 9, 15, 97,202,163, 83,144,154,
+107,192, 15, 81,233,168, 48, 90, 28,234, 45, 39,243, 8,233,234,225,238, 57,234,229, 39, 70, 41, 4,124,134,233, 24,160,225,103,
+228,219,236,124,190,144, 61,112,161, 52,123,210,164, 71, 61,142,255,244,221, 80,214, 35,164,171,177, 32,254,114, 83,122,102,179,
+ 25, 44,203,194,108, 54,195,102,179,193,205,163,237, 79,195, 31, 90,153,153,147, 91, 30,153, 91,108,234, 93, 97,179, 67, 87, 98,
+ 70, 94,137, 25, 37, 21, 86,120,171, 92, 97,183, 89, 58, 55,164, 71, 8,249,122,226, 67,211, 31, 7,192, 99,120,246,175,244, 57,
+241, 9,149, 91,254, 48, 89,163, 38, 60,230, 25, 21,115, 11, 55,163, 15, 21, 19,206, 94, 57,138, 59,195,101, 54, 94,174, 32,124,
+ 6,156, 72,192,216,248, 60, 30,103,181,234,109, 90,173,231,241, 19,199, 15,143, 51,217,147,192, 23, 73,106, 62,107,180,176, 14,
+ 95, 49,186,155,103, 63, 5,128, 79,214,174, 89,213,111,248, 99,162, 19, 23, 83, 96,180, 1,125,187, 7, 97,239,183,159,155, 9,
+177,189, 82,145,115,233, 83,122,111, 81, 40, 20, 10,133,114,155,193,138, 68,101,227,248,219, 35, 90,213,117,163, 99,199,142,173,
+219,224, 26, 89,186, 34,184, 43, 5,240,108, 21,136,105,115, 87,225,235,143,231,131,101,109, 32, 4,176,179,142,141, 76, 64,136,
+240,231, 23,159, 15, 12,105, 19,200,247,156,246,152,220,248,205, 14,131,108,218, 99,114, 99,167,206,238,165, 47, 62, 31,152, 82,
+110,242,239,111,103, 89,156,186,154,135,184,148, 82,196,165,150, 65, 41,115,124,152, 47,190, 88,244,252,242,101, 75, 69, 2, 62,
+195, 92, 77,211,235, 51, 11,237,122,190, 80,104,149,203,196,196, 66, 4,230,212, 2, 82, 56,108,226,147,198, 3,219, 63,121, 26,
+192,236,134,116,170,123, 26, 86, 71,178,170,215,132, 16,194, 0, 28,199,176,108,102,129, 9,122,171, 13,186,226, 63,140, 22, 99,
+111,184,230, 84,233,211, 33, 72,173, 82, 30,230,243,249, 18, 66, 0,155,213,254, 8,124, 58,140,212,231,220, 76,168,109,178,206,
+ 94,205,198,173, 75,199,116,172,213, 48,221,144,119,227, 23, 71,143,157, 97, 64,248,124,112,124, 30,195, 49, 12, 56, 33,143, 88,
+ 64, 8, 87, 55, 71, 6, 39,140, 86,181,217, 18, 11,249,139,142,238,250, 88,251,212,152, 80,124, 27, 85,233,249, 76,229,249,101,
+ 21, 89,212,100, 81, 40, 20, 10,229,238,210,152, 23,249, 7, 69,181,238,140,104, 53,118, 64,132, 0,137,105, 5,104,227,231, 9,
+191, 54,237,145,112, 61,246,143,109, 0,236,172, 99,213, 81,251,247,231,100,174, 90,165,230,230,207, 47,237,187,124,185,255,153,
+231,103,181,214,116,234,236, 94,250,234,171,233,125, 87,175,214,156,249,249,172,144, 37, 85,227,117, 85,143,205, 69,136, 51,237,
+226,120,189,186,134,181,229,191,187, 35, 49,253,151, 43,229,121, 34,145,200,230,237, 42,101, 84, 74, 49,159,207, 19,138,205, 54,
+158, 57, 40,188, 59,255, 0,143,233,222,152, 74,181,209,170, 91,117, 88,152,127,107,252,209, 31, 22,118, 26, 60,113,133, 91, 86,
+190, 17,165, 22,126, 77,213, 33,159,199,224,202,245, 52,128, 47,138,171, 79, 83,173,114, 59,178,243,155,175,253, 87, 47, 95, 2,
+171,157,197,139,243,223,194,147, 51,166, 31,129, 79,135,145,254,129,193, 49,191, 31,248, 74, 62,114,214, 6,164,221,136,206,181,
+155,203,118, 57, 99,178,106,204, 22, 64, 88,194,241,138,138,203,148,102, 59,164,168,199,247,153,173, 92,179,174, 28,189,209,142,
+ 3,231,114,113,240,199, 93,208,168, 20,244, 73, 64,161, 80, 40,148,187,206, 63,212, 92,161,142,185, 2, 26,138,104, 53, 70,128,
+159, 23,206,197,165,160,115, 72, 91,104,212, 42,196,223,202, 4,159, 39, 4,143, 1,108,118,199,205, 16,177,218,190, 93,189, 90,
+131,180, 20, 5,239,179, 13, 41,129, 47, 62, 31,152,178,122,181,230, 12,177,218,190, 5, 48,157, 16,160,210,108, 85, 26, 46,214,
+ 9, 95, 64, 56, 91,107, 47, 55, 57, 63, 58,169,162,144,199,227,155,221, 53, 82,206, 93, 35,225,185,171,196, 66,145,144,207,217,
+ 9,207,234,167, 13, 52, 17,142,235,234,136, 94,237,170, 67,150,101,193, 48, 60,182,202,136, 41, 50, 10,141, 40, 53,241,161, 43,
+ 49,163,184,220,138,142,190, 10, 28, 59,254,189,129,181, 25,119,212,167,197, 23,138, 52,237, 3,253,240,191,247, 87,195,104,102,
+145,152,165,135, 72, 34,241,246,242, 14,191, 60,253,133,215, 37, 47,109,190,133,167,135,186, 99,254,239,183,178, 12, 58,233,235,
+206,156, 89,150,101, 97, 52, 89, 68,186,130, 98,215,178,242, 10,181, 76, 42, 49,122,186,105, 10,234,251,172,201,201,136, 86, 53,
+114,169, 0,227,250,120,195,100,157, 10,163,217,142,211,191,236,161, 79, 4, 10,133, 66,161, 80,254,160,193, 9,164, 29, 50, 90,
+ 74,185, 20,132, 47,197,239, 49,183, 16, 28,214, 5, 91,247,159, 71,135,206,125,144, 83,110, 7, 1,175,201,222,134,213, 44,124,
+195,120, 17,192,197,241,227,229,126, 15, 62,232, 59,156, 16,225,207, 27, 54,149,101, 2, 64,219, 78,149, 50, 28, 71, 64, 8, 64,
+184, 74,195,229, 48,140, 32, 45, 37,167,172, 77,160,183, 2,215, 50,173,102,133, 68,196,115, 85,136,249,158, 26,177, 72, 36, 16,
+128, 37,140, 57, 39,231,150,153, 1, 82, 29,145,171, 91,117, 40, 87,250,252, 52,108,226,138,252,212,244,210,232,142, 69,134,174,
+165, 86, 49, 8, 1, 58,250, 42, 16,119, 54,146,213,101,221, 76, 52,234,110,108,172, 79,139,227,192,183,218, 57, 92, 78, 42, 69,
+ 73,133, 13, 37,122, 43,250, 15, 25, 39,234, 31, 49, 30,191,199, 21,128,179,219,176,252,243,200,114,150,216,166, 0,215,109, 78,
+ 28, 52,239,220,197,171,126,249,197, 21, 18,161, 64, 80, 18,210, 33, 32, 89, 44, 18,218,203,202,202,196,183,127,138, 15,133, 76,
+140, 34,189, 13, 0,108,206, 94, 61,165, 21, 54,236, 63,155,139, 3,123,118, 66, 38,147,129,208, 27,138, 66,161, 80, 40,148,218,
+248,160,114,250,157,200,170,117,141,249,114,104, 82,105,150, 35,240,112,119,131, 84,161, 70,138,206,138,114, 70,139, 98, 3, 1,
+203, 86, 70,180, 26, 9, 60,213, 59,187,247,254,253, 57,153,251,246, 21,108,217,191, 63,167, 86, 67,239, 63, 34, 89, 53,107,142,
+ 56,172,201, 16,246,216,254, 67,191,149,142,239,237,233,202,227,243,141, 34, 33,207, 44, 16,241,173, 34, 1,207, 38, 18,240, 44,
+ 94,106, 33,255,183, 3,187,196,132,193,111, 77,105,154, 76, 38, 68, 68, 68, 96,244,232,209,152, 48, 97, 2, 30,126,248, 97, 4,
+ 5,133,106,121,124,198, 66, 24,142,243, 20,151,163,189, 39, 3,129, 41, 3,191,236,250,200, 16,119,106,239,101,214,108, 26,135,
+219, 45,231, 31,154,132,112, 69,165,102,152,172, 44,138,245, 86, 20, 87, 88, 97,247,236,139,189,167,179, 97,180,176, 72,139,249,
+222,152,159,155, 57,215,156,119, 51,165,137, 83,241,218,237,255,146,204,103,158,154,145,175,146,242,110, 14,232,119, 95,190,135,
+187,155,157, 97,254,136,188, 50, 12, 3,169, 90, 11, 87, 23, 21, 82, 46, 30,194,209,229,195,140, 0,222,116,164, 60,107,163,150,
+ 11, 48,190,183, 55,198, 77,154,138,206,125, 70, 58, 98,172,233,140,246, 84,147,106, 82, 77,170, 73, 53,255, 75, 84,207,113, 88,
+189,118,108,100,248,106, 3,212,206, 71,129, 14,190, 10,152,172, 90,152, 44, 44, 42, 76, 44,202, 12, 86,148, 25,108, 72,201, 53,
+ 32,110,127,203,115, 88, 25,197,170, 28,241,147, 16, 0, 76,165,193,115, 52,122, 34,182, 90,222, 95,181,252,195, 71,118,117,239,
+102,121,105,140, 79,235,216, 20, 75, 54,195,240,140, 60,190,192,230,166, 18, 8,227,227, 99,243,207, 68,253, 52, 80,106,103, 31,
+ 55, 52,162, 99,183,219, 75,125,125,125, 1,220, 62, 5, 79,104,123,217,132, 83,145,175,181, 29, 52,126,185,231,199, 75, 22, 26,
+120,124, 17,199, 8, 68,113,172,205,184,211,168,187,177, 1,141,216, 15,158, 72,122,253,220,165,107,125, 92,220, 90,227,102, 86,
+ 5, 42, 76,118, 88,237, 28, 92,149, 34,100, 94, 57, 98, 77,137,143,254, 78,159, 29,187,181, 25,197,182, 35,225,122,156,223,168,
+ 81, 35, 31,234,211,167, 47,127,241,226,183, 16, 28, 28, 12,163,209, 8, 30,143,135,214,109,218, 35, 37,225, 18,206, 70,190,207,
+ 26, 10, 83, 55, 2,120, 15, 64,190,179, 95, 82, 80,102,193,161,232, 60, 68,254,248, 45,248, 66, 49,189,157, 40, 20, 10,133, 66,
+185,147,153,117,214,155, 29, 50, 90, 38,147, 41,229,254,136,113,224, 56, 2,150, 0, 28, 91, 21,121,226,254,136, 62,177, 54, 83,
+ 74, 75,115,199,113,236,249, 79, 55,111, 25,221,189,215, 32,126,152,191, 18,101,133,185, 56,123,234, 87, 59, 56,114,198,145,253,
+ 11, 11, 19,245, 50,175, 14, 15, 61, 50,249,193,221, 51,158,154, 85, 50,112,200, 16,133, 86,235,109,206,204,202, 52,124,185,253,
+ 27,219,145,159,246, 13,228, 96,127,180,176,240,166,190, 49,157,210,210,210, 79,234, 75,151,136,149,253, 1,180,229, 11, 24,139,
+ 49, 63,209,169, 22,225, 5, 89, 25,147, 62,124,255,157,212,199,158,157, 39,110,231,219, 30,121,165,124,164,100,230, 34, 62,106,
+159, 57, 43,225,194,143,101,153, 23,159,118, 80, 42,167,158,180, 76, 0, 31,159, 61,123, 38,124,212,168, 81, 35,135, 14, 29, 74,
+102,206,156, 9, 66,128, 95, 54, 63, 79,138, 82,206,126,143,202, 40, 86, 82, 51,207, 75, 90,212,153, 75,110, 15, 15,236, 41,112,
+ 87, 61,141, 45,223,254,100, 3,225,210,232,253, 68,161, 80, 40, 20, 74, 13,205,111,163,149,113,189,114, 60,173, 63,155,242,220,
+188,233, 91,183,126,253,193,215,219,119,245, 55, 89, 44,190, 4,162, 12,214,110, 57,161,103,177,216, 81, 13,163,238,102,180,187,
+123,199, 78, 95,126,254,233,155, 95,110,249,108, 16, 56, 54,132, 1, 82, 9,131,223,164, 54,118, 70, 83, 38,171, 81,179, 84, 80,
+190,105,248, 67, 43,141,133,133,250,175,157,221,215, 88,120, 35,151,199,183,182,222,180,230,253, 21, 60, 30,127, 4,203,114, 66,
+142,181,221,100,173,166,143,140,249, 55,246,195,225, 86,110, 40,106,100,219, 85, 0, 87,143, 31, 63, 62,224,248,241,227,189, 0,
+124,130,202, 57, 20,163, 91,114, 94,204,133,229,195, 94, 89,248,202, 47, 11,192, 4,112, 28,129,157,229,210, 68, 70,195, 48,122,
+ 79, 81, 40, 20, 10,133, 82,195, 76,220, 57,104,169, 99, 17,173,191,138,226,226,164,114, 20,227,165,150,234, 20, 22, 38,234, 1,
+220,209,115,207,208, 66,221,184,196,178, 31,144, 88,246, 67,115,247,175,200, 75,206, 7,146,103,180, 48, 27,142, 52,100,255,189,
+106,185, 43, 20, 20, 92,175, 64, 1,122,211,123,136, 66,161, 80, 40, 20,167, 13,151, 99,141,225, 41, 20, 10,133, 66,161, 80, 40,
+ 77,154,172,218,107, 0,149,109,207, 27,234, 57,224,204,204,220,205,233,125,112,140,106,182, 88, 83, 8, 64, 12, 64, 9,160,169,
+ 42,205,145,168,154,175,145,150, 39,213,164,154, 84,147,106, 82,205,123,168,217,148,246, 49, 80,254, 84, 3, 70, 53,169, 38,213,
+164,154, 84,147,106, 82,205,255,158,230, 63,153,153,245, 44, 0,254, 70,109,180, 40, 20, 10,133, 66,249,171,112,119,239,168, 4,
+106,218,245, 54,137,220, 35,212, 11, 0, 12, 5,215,117,180,244, 40,245, 80,123,158,195,187,210, 70, 75,200, 19,136, 95,145,171,
+220,175, 43, 52,238, 89,255,241,194,101,130,218, 40,230, 12, 31, 24,184, 55,184,173,108,130, 51, 59,202, 61,131,190,242,110,223,
+ 59, 93,161, 13,154, 3,159,238,178,150,100, 66,161,109,235,169,108,221,243,148,202, 55,252,129, 63,225, 24, 37, 97, 97, 97,125,
+195,194,194,250, 2,144,220, 13, 65,185, 54,104,170, 95,135, 62, 81,218,118,221,126, 85,120,117,156,124,183, 51,172,244,233,224,
+174,108,221,227, 7,101,171, 46,197, 74,159, 46,101, 74,191, 30, 39, 84, 30,161,237,154,218,175,245,248, 15, 67,222,221, 25,183,
+179,245,248, 15, 67,234,219,238, 58,106,173,234,237, 93,137, 75,220,199,125,164,164,207,149,230,209,186,255, 84, 23,159, 65, 11,
+220,157,221,207, 55,168,207,213, 54,225, 3,242, 90,117,236, 29,231,232, 62,126,193,125, 47, 6,132,245,215,249, 5,245,141,166,
+ 37,239, 24, 82,207,182,125,165,174,254,145, 18, 87,255,159, 36,110,109,135,180, 84,207,199,199, 71, 22, 18, 18, 50,170, 79,159,
+ 62,207, 13, 27, 54,236,229,110,221,186,205, 12, 8, 8, 24,113, 47,127,232,203,181, 65,111,152,133, 76,129, 89,200, 20,200,181,
+ 65,111, 52,253,124, 13,254,128,225,177,217, 12,143,205, 86,104,131, 63,248,187,156, 43,137, 87, 80,128, 92, 27,180, 90,229, 29,
+118, 94,166,237, 56,206,217,253, 93, 93, 93, 71,120,122,122, 78,172, 94, 92, 93, 93, 71,208, 59,160,217,212,142, 98,181, 56,162,
+197, 23, 74,228, 39, 31,123,234,197, 78,203,222,121, 93,186,102,203, 94,172, 89,178,240,154,185,162, 36,236,239,120,228, 30,109,
+123, 69,243,121,124,191,218,105, 44,199,102, 22, 36,159,239,121, 55,244,131,219,200,158,126,243,213,233,243,167, 62, 18, 17, 16,
+ 49,118, 46,115, 35,217,184,207,113,139,134,174,223,253,240, 99,235,168,223,126, 93,187,101,203,230,247,242,237,193,171,133, 18,
+193,167,101, 25, 87, 75,156,201,131,218,179, 93, 91,129,194, 35,234,254, 9, 47,122,199, 28,251,102, 43,107,225,134, 27, 10,106,
+205,254,221,124, 60,219,183,111,127, 31,159,207,119,159, 51,103,142, 8, 0, 62,254,248,227, 14, 44,203, 22,222,186,117,235, 2,
+154, 49,248,105,165,193, 12,158,254,201,138,119,191,126,224,129,209,200, 46,168,192,242,213,235, 7, 31, 62,248,221,195, 21,186,
+196,239,239,198, 57,113,113, 9, 84, 67,164,186, 50,247,213,247,180,163, 6,223,199,215,155,236, 56, 28,117,105,192, 55,235,223,
+ 59, 15,132,246, 42, 47,184,222,224,152, 98,156,161,116,145,151,146,140,226, 12,165, 0, 48,245,142,151,189,210, 22,225, 41, 99,
+ 71,249, 72, 4,151, 10,129, 38, 39,125,116,105,211,255,136, 80, 34, 9,224,241,120,224, 49, 0,143,199,128,207, 48,149,243,132,
+ 90,141,105, 89,241,191,143,252, 59,220, 39, 42,255, 94,185,224, 11,220,121,204, 31,249, 99,120, 85,107, 66,202,114, 19, 79,186,
+223,133,175,209,116,234,224, 18,222,191, 67,197,151, 39,146,139, 20,130,129, 47, 71, 50,132,247, 89,250,239,171, 47, 59,100, 0,
+164, 82,215, 3, 7, 14,120,142, 26, 53, 74,163, 13,159,112,194,145,125,196,124,125,216,193,131,251, 69,163, 70,141,116,226,250,
+ 12, 26, 14, 30,111, 59, 3, 8, 57,142,124,204,231,200,119,250,194,132, 91,128,115,179, 79,201,180,193, 79,243, 64, 28,126,206,
+112, 96,162,141,121, 55,182, 52,183,112, 5, 18,245, 48,161, 72,244,114,219,160,206,221,179, 82,111, 70, 87,232,203, 87,219,205,
+165, 39,156, 22,178,217, 95, 57,246,123,204, 3, 2,161,144, 25, 53,172, 55,223, 12,252,218,146,147,238,229,229, 53,113,221,186,
+117,237,250,246,237, 11, 0,176,219,237,234,221,187,119,123,191,255,254,251,138,132,132,132,230, 78,156,234,235,233,233,233, 47,
+ 22,139,125, 1,192, 98,177,100,229,231,231,167, 3,104,242,135,191,194,171,157, 7, 8,222,251, 61, 42, 74, 0, 0, 3, 6, 12,
+252,192,255,254,217,174,124,145,210, 88,111,113, 88,202, 21, 37,183,126,157,119,246,220, 25, 6, 0,250,244,238,251,186,220, 35,
+244,211,123, 25,217,146,106,131,123,243,128,249,125, 6, 68, 76,154,242,232,116, 94,120, 71,127,140, 24, 62,244, 53, 35,112,192,
+169,107, 70, 32,144,157, 63,127,190, 61,143,199,227,219,237,118, 83,159, 62,125,210, 91,146,175, 86, 65,125, 79, 51,224,181,182,
+218, 45,159,231, 39, 69,127, 0,220, 49,113, 12, 95,211,186,251,155,224, 11,158,229, 56, 46,163, 60, 61,186,223,191, 48,162,117,
+103, 57, 59,171,196, 19,136, 95,158,250,228, 11,157,230, 45,248,159,116,238,154,227,136, 92,255,122,193,223,213,100, 1, 0,159,
+199,247, 59,114,244,136, 86, 46,230, 3, 0,244, 38, 59, 30, 24, 53,170,233, 55, 66,155, 94,191,241, 24, 38,184,122, 66, 27,214,
+110,149, 10,132, 98, 19, 83,105,144,192, 0,240,104,213,230,184,151,253,164,124,234, 35, 17, 1,219,119,253,156,153,158, 89,232,
+244, 67,141,225,139,208,103,224, 8, 68, 12, 31,169, 57,127,238,244,123,155, 55,110,120,195,110,181,109,224,108,220,106, 83,209,
+205,236, 38, 31,230,222, 29,123,136,149, 30,135, 39, 61,247,190,187,137,231,134,197, 75, 62,241,136, 58,180,227, 68, 86, 70, 87,
+ 46, 45, 45,195, 68, 24,230, 90,113, 81,206,203, 21,185,183,110, 56, 90,100, 74,165,178,157, 82,169,236,218,165, 75, 23,233,194,
+133, 11,133,131, 7, 15,254,195,178,207,156, 41,250,237,183,223,124, 86,174, 92, 57, 58, 54, 54,214,164,215,235, 47,235,245,250,
+ 36, 56,209,208,222,219,219,115,246, 67, 15,142,195,208, 73, 47,130,229, 24,204,124, 97, 30,142, 28,218, 51, 11,192, 93, 49, 90,
+ 54,185,250,253,103,159, 91,232,217,231,190,110,252,247,118,220,128, 76, 44,192,200,158,193,204,147,115, 22,185,108, 89,251,222,
+ 23, 40,192,160,250, 34, 89,156,161,116, 81, 39, 15,203,163,227,251,182,197,254,157,150, 71, 49,236, 85,240,228,154, 15, 50,246,
+255, 47, 30, 0,218,141,154,163,146,176,249,235, 90,185,240,181, 18, 54,127, 93,187, 81,115,142, 37, 29, 94, 87,222, 88, 94,132,
+ 18, 73,192,206, 29, 59, 58,186,170, 68, 16,240, 24,240,249, 12, 4,124, 30, 76, 22, 22, 15, 63,242,232, 93,187,204,101,218,142,
+163,121,192,147,149, 47,108,124,101,204, 75,252,201,153,115,194,240, 69,238, 7,247,255, 40,208,106, 36,224,243, 25,240,121, 0,
+159,199, 32, 85,103,196,211, 79, 63,169,105,169, 97,127,160,191,246,190, 87,166, 4,143,236,211,201,173,203,183,103, 24, 77,159,
+ 7,166,184, 23,152,228, 79,236,218,247,235,163,100,192,188,115,132,112, 43, 50, 79,126,114,180, 49, 17,179,217,172, 27, 57,234,
+ 1, 53, 35, 80,200,143,237,221, 58, 80,192, 99, 96, 99, 9,236, 44, 1, 91, 53, 55, 42, 83,245, 11,134,199, 99, 64, 56,130,103,
+159,125, 26, 35, 71, 61, 96,224,236, 92,166,227, 15, 57,222,246,195,199, 78,121,154,109, 28, 86,174,219,242, 94, 69,105,254,123,
+201,241,238,169,250,210,130,121,198,188, 68,135,231,193,224,129,244,204, 72,138,123,110,199,193,179,232, 20, 22, 10,150,171,204,
+103,176,159, 2, 59, 34,207, 34, 36, 56,164, 50,223, 28,249, 63,123,103, 29, 29,197,245,183,241,103,214, 53,238, 9,193, 3,193,
+ 18,220,221,139,107,209, 66,113, 90, 74,141, 34, 45, 45, 80,180, 20,167, 64, 11,148, 82,160,184, 7, 11, 14,165,104,128,144, 0,
+ 73,136, 19,223,216,186,239,220,247,143, 77, 40, 18,217, 0,125,251,107,123, 63,231,236,217,204,100,247,217, 59,115,103,238, 60,
+247,123, 13,181, 3,229,104,214,180, 25, 0,188,150,209,226,137,156,190,233,208,123,244,130, 62, 67,199,193,219,203, 11, 28, 98,
+233,115,238,196,111,125,126,217,248,253, 23, 86,131,106, 69,133,196,136,237,217,115,129,176,236, 27, 71,157,252,253,253,189,154,
+ 53,251,115, 58, 70,171,213,138,106,213,170, 33, 61, 61, 61,248,117,234,105,126,126,126,189,231,205,155,231,221,171, 87, 47,190,
+175,175, 47, 0, 32, 43, 43, 43,224,244,233,211,141,231,205,155,151,147,153,153,121, 2,101,204,232, 99,179,112, 4, 28, 30,184,
+ 98,177,212,126,140, 96, 56, 51,166,189, 23,234,227,231,111, 44,233,243, 10, 69,150,112,230,135, 23, 25, 30, 79, 80,244,121,112,
+ 8, 97,153, 50,162, 68, 93,249,124,126,137, 45, 20,102,174,115, 75,194,119,153,192,225,114,236, 23,171,213,162, 40, 72,189, 91,
+183, 2,145,184,250,124,161, 96,211,224, 97,227, 90, 15, 25,212, 31,126, 94, 46, 56,247,123, 36,166, 76,251,204, 98, 53, 91, 86,
+189, 86,225,193,229,242,114,114,114,146,221,220,220,124,223,252,121,203, 84, 63,123,230,148,247,185,243, 23,102,175, 92,179,110,
+170,217,100,181,176,132, 60, 91,199, 88, 34, 17,241,187,245,121,215,217,187,102, 75,241,186,121, 19,248,255,194,136,214,230,183,
+ 98,180,132, 18,167,119,191,158,249,145,120,225,174, 27, 56,177, 97, 74,174, 78,149,235,245,172,166,224,236,122, 87,171, 42,108,
+252, 58, 41,148,123,213,110,197,112,121,147, 25, 46, 87,198,112, 24, 33,107, 99,159, 90, 77,166, 69,250,188,184,204, 55, 61,122,
+150, 37, 56,248, 71, 78,197, 12, 16, 65,208,206,189,135,189,125, 92, 69, 48,152,109, 24, 54, 98, 52,118,236,216,225,228,229, 34,
+132,193,100,197,247, 43, 87,170, 53,201, 39,188,147,159, 22,164,119,237,251, 89,120, 66, 82, 78, 84,106,166, 97, 95, 69,211,102,
+ 52,219,160,210, 89,161, 51,114, 80,171,126, 51,124,191,170,142, 56, 53, 37,241,179,237,191,108,157,254,240, 33,119, 7,203,229,
+ 44, 48,100, 62,122, 90,226, 77,231,219,160,135,179,155,199,238,129,147, 23,187,198,229,240, 64, 96, 70,188,179, 24,239,142,157,
+238, 92,195, 87, 2,153,152,235,154,152,146,238, 55,227,139, 47,126, 79,176,145,230, 42, 69, 66, 98,121,233,169, 90,181,234,160,
+ 62,125,250, 72, 63,255,252,115,126, 96, 96, 32,126,249,109,127,149,118, 61,134,246,205,200,204, 14, 36,132,192,199,219,251,233,
+196,247,135, 30, 63,121,242,100,202,211,167, 79,249,203,151, 47,111,113,248,240,225,122, 89, 89, 89, 14,215, 76,109,132,192, 96,
+180,193, 86,244,128, 84, 40,141, 21,246,167, 1, 1, 1,162,244,244,116,227,115, 81, 6,230,207, 64, 33,211,163, 75,135, 22,188,
+159, 78, 37, 65, 99,176, 65, 38,230, 35, 41, 91,135,166,141, 66,152, 45, 54,107,195,146, 4,199,191,219,123,174,143,156,244,236,
+215,170, 58,188,221,164,216,246,195, 98, 28,187,158,216, 51, 91,195, 96, 61,225, 78,246, 19,241,186,201,216,204,245, 29,155,214,
+244,237,220,164, 10,110, 55,173,233,123, 37, 34, 38, 86, 50,116,229, 71,233, 26,254,185,130,211,211,213, 37, 23, 60, 28,184, 59,
+ 9,240,243,153, 20, 72,197, 60,200,196, 60,200, 68,246,119, 14,135,121,179, 90,173, 95,221, 64, 46,107, 27,207,229,242,198, 15,
+127,119,168,255,200,225, 67, 9,184, 28,236, 63,120,188,255,174, 93, 59, 51, 45,102,211, 86, 27,135,251,115,105,215,207, 11, 39,
+148, 3,120,187, 8,241,197,214, 40, 56, 75,248,112,146,242,225, 44,229,163,115,168, 23,184,175, 63, 9,140,219,148,254, 53,122,
+ 77, 25, 88,181, 83,112,101,121,173,251,241,202,135,227, 23,221, 89,115,169,176,211, 39, 63,172,174,231,161, 41, 52,241,190,153,
+ 49,145,151,150,145,209,105,255,241,203,157,109,166,113, 49, 86,179,246, 75, 69,228,254, 18,163,194,105, 49,215, 27, 7,180, 28,
+ 34, 54,107, 44, 15,238,199,164,213, 44, 48,138, 16,157,172,130, 76,204,131,188,248,220,138,121,144,137,249,144,139,121,200, 72,
+ 75, 66,190,150,251,123,186, 7,167, 19, 46, 95,183, 86, 36,225, 6,179, 13,247, 18, 53,168, 26,220, 8,126,126,254, 48,245, 26,
+ 85,245,230,133,131, 71,111, 93, 62,178, 84,151,245,248, 75, 71,117,126, 11,187,129,217,159, 78,142, 96,128,187, 69, 15,233,198,
+223, 44,219,208,228,219,217, 31,190,176,111,198,130,117, 77, 94, 63,146,229, 52,183,243,192, 15, 22,180,235, 54, 16,234,252,108,
+252, 17,190, 15, 61,250, 12,198,168,113, 31,195,213,213,243,251, 85,139,102,222,183, 26, 85, 23, 94, 41,115,125,235,180, 13,105,
+ 80,119, 87,128,191,127, 32,203,218, 87,249, 32, 4,208,168,149,152,249,201, 68,176,132,160, 97,227,230,157,197,237,186, 17, 82,
+180, 26, 72,110, 94,174, 54,230,241,195,174,134,156,152,155, 14,159, 75,131,193,162, 80, 40,112,239,222, 61,196,198,198, 34, 58,
+ 58, 26,121,121,121,112,113,113,209,104,181,218, 10, 5,239, 67, 67, 67, 71, 94,184,112, 65,236,230,230,246,108,167,201,100,130,
+147,147, 19, 70,142, 28,201,239,222,189,123, 64,239,222,189,199, 68, 69, 69,253, 6, 64, 85, 98,122,242,159,100, 56,249, 4,255,
+216,161, 99,135,169, 0, 32,113,246, 75, 92,255,203,241,232, 50, 43,180, 46,254, 85, 90,183,110, 83, 19,132,128, 1, 89,171,203,
+139,205, 42, 35, 74, 36,187,113,227, 70, 13, 46,151,203,251,243, 25,196, 98,227,182,189,117,206, 94,125, 48,104,217,247, 43,196,
+206, 50, 17, 20, 74, 19, 38,140, 26,232,240, 51, 88,226, 19,220,171,117,235,246, 71,191, 93,240, 53, 79, 46,147, 33,252,102, 2,
+ 62,250,228, 11, 67,102,114,212, 10,194,242, 55,232, 20,177, 57,111,248,168, 36,120, 11,212,170, 36,135, 83,191, 30,226, 41,239,
+245, 19,155, 44, 54, 20,106, 45, 48,154,109,176,177, 4, 74,173, 5, 15, 83,213,240,116,174,248, 82,110,132,144,102, 0,188, 0,
+ 40, 24,134,185,253,252,118,113,133,174,216, 27,191,180,157, 91,244,124,240, 0, 96,130,125,164,254,179,203,167,104,187,180,253,
+197,223,127, 8,160,110,145,166, 13,192, 45,134, 97, 10, 74, 49, 91,175, 68,185,120, 97, 97, 97,164, 79,159, 62,207, 74,252,151,
+183, 95, 70, 36,224,251,203, 92,188, 64,200, 35, 60,191,128,177,183,111, 64,222,138, 85,107,220,167,125, 48, 57, 69, 85,152, 95,
+165,104,247, 57, 71, 30, 22, 60,134,187,170, 67,155,150,221,167,126,240, 1,130,107, 84, 18,216,108, 54, 18, 21,155,104,217,254,
+243,182,177, 87,174, 11,215,168,210,162,230, 62, 23,130,172,208,176, 79, 27,107, 75,123, 57,130,101, 99,109, 47,215,110, 95,209,
+100, 24,192, 85, 46,196,143,167,146, 64, 8,192,128,192, 69,198,199,158, 75,105, 72,140, 56,164,234,211, 80,165, 29,185,108,126,
+231, 78,189,166, 95,120, 24,111,216,151,147, 99, 56, 3, 32,171, 44,205,146, 11,116, 22, 70,179, 13, 22,171, 21, 7,142, 31, 71,
+207,206, 45,208,186,117, 11,180,111,215,154,119, 39, 34,114,220, 7, 83, 39, 6,226,207,209, 29,207, 52,197, 62, 65,205,228, 46,
+158,251, 6, 77, 93,238,244, 32,205, 10, 30, 23,168,238, 43,129,187,147, 0, 38, 43,131,100,133,185,232,206,113,197, 71, 51,218,
+ 68,194,144, 0, 0, 32, 0, 73, 68, 65, 84, 22,184,207,254,108,234, 73,149, 66,216, 0,120,100, 46,235,216,117, 58,157,112,244,
+232,209,124,139,197, 98, 30, 57,225,227,238, 89, 89,138,254, 27,215,126, 39,242,246,246,129,206, 96, 69, 68,244,147,186,223,126,
+187,160,250,241,211,151,142,204,255, 98,202,209,158, 61,123,186,236,221,187,151, 45,239,124,190, 80, 67,204,206,253, 97,219,174,
+ 3, 59, 86,175, 88,130,152,148, 2,252,252,211, 6, 16,155,245,199,114, 78,213,243,154,100,244,232,209,146, 35, 71,142, 84, 74,
+ 75, 75, 83,233,116, 58,197, 11,241, 8, 14,195,203,206,215,193,211, 73, 8, 1,143, 3, 31, 55, 49,188, 93, 68,224,115, 1, 14,
+195,216, 74,210,252,121,223,137, 69,172, 78,137, 99,187, 77,195,183,253,176, 24,227,166,125,133,168, 92,225,105,142,212,101,209,
+135,195, 7,205,246,146,216,122,250,187,114,188, 59, 55,169, 10,153, 88,128, 57,211, 71,163,121, 68,178,119,122, 33,251,149, 66,
+207,109,180,224,244,179,197,186,207,189, 24, 28,177, 71,176,156,164,124,156,222,245,125,142, 86,169, 80, 22, 55,201,153,140,134,
+ 20, 7, 47,227,115, 37,212,108,103, 55, 10,169,191,120,234,164,241,156, 54,173,154, 19, 14,135,143, 92,181,137, 33, 4,248,228,
+163, 41,248,112,202, 68,223,167, 25, 57,223,108,216,240,227,220, 11,103,201, 66,173,226,241,252,178, 52, 57,140, 61, 10, 36, 23,
+243, 32,151,216,141,139, 92,204,131,193,100, 3,195,128,235, 90,185,177,146,177, 71,114, 51,242, 83, 74,173,129,191,160,233, 94,
+185,254,249,179,137, 78,117, 10,246, 21, 92, 79,202,136, 94, 20, 17,153,125, 11, 64,126, 96,123,215, 49,102, 43,129,198, 96, 69,
+ 82,182, 14, 86, 51, 97,198,189, 83, 5,213,134, 48,193, 75,182,221,221,113, 42, 18,206,207, 21,250, 47,104,166,223, 56, 96,240,
+104, 48,112,216,234,117, 63,221, 94,177,248, 43,110,174,210, 4,150, 16,136,133, 92, 72,132,188,162, 23, 23,122,173, 18, 27, 54,
+109,201,178,130, 25,132,203,151,173, 21,185, 62,193,146, 81, 3,123,181,223,195, 0, 66,134, 35, 72,243,175, 82,181, 74,151,190,
+ 99,197, 93,250,141,134,205,106,154, 29,113,149, 92,212,229,196,156,119, 68,179, 65,189,186, 96,128,187,218,156,216, 41, 0, 32,
+243,174,253, 99,157,224, 58, 77, 94,222, 23, 20, 20,220,196,145,124,127, 22, 41, 21, 59, 77,115,115,247,250, 42,184,126, 35,239,
+236, 2, 35,227,228, 81, 9, 73,113,247,176,123,211, 55, 59, 89,131,105,193,249, 19,251, 22,175,249,249,240,187, 93,122, 14,196,
+182,141,223,205,201,203,124,102,180,206, 61, 23,173, 26,181,125,235,230, 64,190, 80, 4,139,149,133,197, 70,236,239, 86, 27,242,
+243, 11, 96,177,178, 16, 75,157, 96,101, 25, 88,108, 44, 44, 86, 22, 70,147, 85, 54,101,116,239, 15, 12,192,205,146,210, 25, 80,
+167,195, 25,129, 72, 84,133,192,190,118, 45, 33, 4, 73, 89,122,142,159,159,223,111, 0, 32, 18,137, 32, 18,137,192,178, 44, 34,
+ 98, 20,211, 60,131,107, 79, 69,145,193,179,153, 77, 41,133,201,215,122,148,118,236,190,190,190,125, 95, 54, 89, 6,131, 1, 26,
+141, 6, 87,175,223,118,217,186,227, 64,207,164,148,180, 26, 44,113, 49, 58,121,215,232,161,206, 73,232, 91,218,249, 84,103,199,
+124,224,220,114, 34,231,243, 15,199, 4,173,219, 30,118,235,201,153, 69,101,246,211,170,214,101,150,233,243,201,131,155, 46, 91,
+251,115, 92,193,181, 31, 63, 45, 47,143,120, 60, 30, 95,161, 80, 60,187,191,215,111,217,221,244,110, 76,250,128, 53,171,215,136,
+ 35, 18,212,120,144,148,129, 49, 93, 43,219,107, 56, 14,228,187,204,167,134,103,245,154, 53,127,219,176,118, 25, 47, 46,195,128,
+ 31, 14,221,194,133,163, 63, 94,205,202,185,217, 19,217,153,250,215, 41, 67,222,130,209, 42, 85,243, 98,100, 46, 52, 6, 43,140,
+ 38, 43, 44, 44,129, 74,103, 65, 78,161, 9, 42,157, 25, 26,189, 21, 99,186, 85, 46,241,123,229,248, 17, 47,134, 97,194, 8, 33,
+125, 8, 33, 93, 1, 8,139,183,237,207,108, 38,172,200,144,189,176, 61,123,246,236, 47,151, 46, 93, 26, 93,252,217,226,253,197,
+159, 45,107,255,115,223,247,152, 51,103, 78,131,101,203,150, 45,105,213,170,213,158, 63,254,248, 35, 17, 64,129,163,205,135,188,
+231, 15, 38, 44, 44,172,188, 19, 93,195,108, 49,139,156, 37,124, 84,175, 86, 25,239,127,185,205,243,215,101,227,115,196, 66, 30,
+247,212,169, 83,238,121, 38, 57, 56, 28,174,195, 85, 20,185, 87,173,214, 2,129,240,196,202,149, 43, 49,188,111, 59, 73,106,174,
+ 69, 19,153,170,207,214,154, 96,245,246,170, 45, 92,180,100,153,124,217,242,239, 63, 12, 59,198, 22,106,178, 31,126, 95,114, 19,
+ 95,211, 59, 92,230,185, 62, 88, 12, 3,194,218,210, 10,146,111, 55, 5,128, 55,233,139,165, 49, 88,192, 45,234, 91,195, 48,128,
+206, 96, 5,151,203,228, 20,198,236,123, 56,114,225,162,206, 59,247,156,205, 32, 28, 87,181, 86,155, 36,133,125,205,193, 10, 99,
+ 48,217, 96,180,216, 16,125, 63, 2,237, 91,214, 67,235,166,117,160, 51,216,160, 51, 90, 81,173,102, 48, 0,120,150,152,113, 92,
+ 78, 34,177, 89, 12,132,216,156,250, 52,243,130,183,171, 16,126,110, 34,136,132, 60, 88,172,128,222,196,194, 96,178, 33, 57, 71,
+ 15,181, 94,130,144, 14, 67,171,123,248,221, 49,102, 37, 75,142,228,167,222, 25, 84,166, 57,181,217,176,253,183, 3, 65, 25, 25,
+217,253, 79, 30,217, 37, 82,168, 44,136, 76,214, 34,167,208, 8,112,189, 48,111,201, 15,162, 89,159, 78, 26,176,125,247,193,148,
+ 46,237, 90,164, 84,244,152,117,138,152,157,251,246, 31,248,177, 79,159, 1,146,232,155, 39, 17,119,239,252, 98,109, 78,133,250,
+103,113, 26, 54,108,104,157, 52,105,146,122,201,146, 37,129,199,142, 29,171,166, 80, 40,238, 1,176,184,186,186,214,169, 29, 84,
+229,126,248,233, 83, 1,189, 7, 12,229,167,229,234,225, 34, 21,160,138,183, 20,215,175,158,177, 8,133,252, 18,251,155, 20, 53,
+ 15,142, 64,151,153, 56,118, 61,177,103,116,158,248,210,196,241, 99, 82,194,175,196,228,173,223, 17,254, 93,128,220,114, 79,204,
+ 42,214,223,105, 90,211,119,246, 71,163,177,116,221, 78, 92,142,136,201,209,114,252, 22,103, 26,173,103, 75, 15,165, 3, 60, 46,
+ 3, 39, 9, 31, 90,149, 66, 25,127,247,116,237,183, 20,166, 30, 19,126,100, 39, 39, 95,109,193,211, 92, 3,147,145,175,134,141,
+ 37,112,149, 10, 96,101, 9, 10,243,115,153, 93, 59,119,224,246,237,235, 28,112, 57, 19, 0,204, 47,243,132, 50,246,166, 66,185,
+152,111,143, 8, 73,236,239, 22, 27,139,224,160,154,216,188,126,149,179,167,183, 15,218,182,119,188,111,180,147, 71,149,134,123,
+126, 89,143, 75,127,220,237,120,121,205, 15,205,228,254, 94,235, 24,198,182, 2, 4, 6,163,217, 6,101, 97, 1,132,166,167,104,
+ 30,160,128,187,212,134,100,149, 31,162,178,226,228,229, 21,248,121, 81,135,239, 49,100,192,220, 3,199, 47, 44,237,209,173, 35,
+162,146, 85,144, 8,121, 16, 11,185, 16, 11,185,224, 51, 54,172,218,244,163,165, 64,169,238,147, 23,125, 52,247, 53,174,207,115,
+ 69,181, 95,187,185,179,105,188,118,174,155,251,235,196,153,203,123,244, 28, 56,150,137,186,125,241, 75, 29,112,222,177,138, 30,
+113,104, 31,203, 58,254,140, 19, 59,121,174,157, 62,107,209,244,238,125,134,130,203,229,193, 98,177,224,224,222,157,248,229,135,
+121,143, 77,154,188,177, 0, 88, 83, 14,119,210,190,157,155,134,206,252,102, 21,211,160, 97,243, 22, 23, 51, 95, 93,142,150,229,
+ 50, 63,189, 55,126,242, 48, 31, 31, 31,167, 63, 35, 90, 4,181,131,235,161, 87,191,193, 56,115,244, 48, 30, 70, 71,130, 37,118,
+195,196,178, 4,133, 5,121, 89, 86,139,105,123,169, 45, 30, 98,113,149,109,191,236,168,197,225, 48, 48, 91, 88,152,172, 44, 62,
+253,224,125,211,148, 79,190,108,219,171,123,135,104, 33, 23,170,228,212, 76,215,235,119, 31,133,176,124,121,224,248, 25,171, 4,
+ 6,163, 13, 74,157, 5, 39,127, 46,221,235,136,221, 42,183,170,218,164,215,248, 41, 95,111, 22,137,184, 28,115,253,218,129,137,
+ 29, 90,214,127, 90,217,223, 83,253,237,178, 31,154,255,126,243,110,175,119, 71,142, 23,143,169,211,132,241,247,144, 56,189, 63,
+114, 96,168,205,106,126, 79,151,255,180,212,249, 5,249, 82,183,194,202,213,130,116,127, 70,140,106, 31, 98, 8,170,191,224, 60,
+ 24, 36,234,179, 99, 7, 1,128,159,127,101, 3, 95,228,172,174, 64, 4,134, 0,192,186, 45,187,155,222,143,205,152,184,122,245,
+ 26,105, 68,130, 26,247, 18,148, 16, 9, 56, 48, 91, 88, 48, 14, 6,181, 89,194,157,252,213,156,217,206, 5, 90, 27, 46, 69, 42,
+ 16,125,231, 34, 49,105, 12, 35,165, 86,231, 65,240,118,122, 15, 64, 77, 0,241, 12, 67,126,210,102,251, 30, 5, 46, 91, 43,122,
+221,179,172,189,190,236,236, 85,163,186,141, 39,234,197, 23,202, 90, 49, 12,169,207, 16,184, 1, 36, 61,191,232,153,234,168, 83,
+211,102,199, 98,249,146,111,176,118,235, 97,100,228, 25,224, 98,123,138,163, 63, 47,194,231, 75,127,131,222, 88,122,175,134,242,
+252, 72, 73,198,232,101,195, 85,252,119,241,231,150, 46, 93,218,231,165,188,233, 83, 74,158,189,242,185,226,239, 47, 91,182,108,
+201,115,255,215, 57,106,178,158, 25,173,226,131, 42,199,108,213,246,242,171,242,199,209, 35,135,220, 10, 52,102,136, 5, 92, 84,
+174, 22,132,249,235,143,122,189,211,212, 19,185,102, 23,236,222,188, 34,223,160, 83,239,117,168,176,240, 14,110, 33,145,203, 78,
+ 30, 58,120, 24, 53, 42,123, 11,118, 93,205, 79,186,155,168,127, 22,234, 85, 41, 82,132,213,156,117,188, 65, 3, 7, 74,207, 95,
+184,248,137, 6, 40,209,104,113, 25,110,165, 45, 59, 14,122, 59, 73,248, 96, 24, 64,173,183, 98,226,123,131,223,252, 49, 70, 88,
+238,248,177, 99,192, 20,153, 44, 85, 94, 22,190,156,245,129, 65,102,137,123,152,154,156,154,222,181,239,231,231, 85, 26,198, 48,
+108,244, 7,183, 31,198, 46, 45,208,233, 94,111,145, 31,163,201, 6,163,153, 69, 66, 66, 60, 62, 29,211, 13,124, 46, 7, 92, 46,
+107,239, 44,109, 45,253, 98,212,100,196,230,195, 87, 48,100,231,202,105, 91,252,125,188, 61,228, 50, 9,145, 75, 69, 76,253, 58,
+181, 4, 45, 91,182, 22, 86, 11, 14, 21, 92,125,164, 71,170, 66,143,196, 12, 37, 68, 62,141,120,195, 59,191,131,157,107,102,116,
+204, 79,189,195,193,171,157, 20, 95,224,236,165, 27,125,183,110, 90, 45,202, 46, 52,227,113,170, 6, 89, 5, 6,100, 22, 24,145,
+149,111,128, 92,194, 71,251,126,147, 68, 39,142,254,212,183, 75,187, 22,235, 94,231,184, 19, 19,147, 78, 36,167,103, 14, 13,109,
+220, 28, 59,127,253,165,157,171,107, 53,231,194,194, 36,149,163,185,179,104,209, 34,225,178,101,203,120,235,215,175, 87,181,108,
+217,210,119,206,156, 57, 61,114,114,114,110, 85,173, 90, 53,248,204,161,237, 23, 26,181,239,223, 12,172,217,171, 93,135, 78, 2,
+ 17,203, 67,120, 88,152,121,223,222, 93,121,122,189,122, 74,153,134, 67,234,178, 40, 91,195,192, 43, 32, 32, 90, 46,180,117,227,
+113, 10, 99, 11, 78, 79,223, 81, 0, 28,170,209,243,163,115, 23,239,196,196, 54,141, 72,246,190, 16,241, 36, 39, 95,103,174,157,
+112,250,243, 50, 11, 94, 46,195,128,207,229,192, 73,194, 3,167,168, 84,149,251,135, 62, 1,195,120, 21, 71, 78, 25, 48, 69,239,
+ 0,195, 32,163, 32,245,158, 3,125, 54, 24,194, 18, 32, 38, 77, 11,141,193, 30,154,175,228, 41,133, 34, 59, 13, 27,215,109,199,
+221, 59,183,209,253,157,126,216,176,101, 23, 38,190, 55,212, 80, 94,237,135,195, 41,138,104, 61, 23,205,146, 75,120, 0, 24, 20,
+106, 45, 56,248,251, 83,212,172,206,113,248,193, 0, 0, 78,114, 41,148,106, 61, 56, 2, 39,196, 71,156,148,158,186,120,115,206,
+220,133,171,191, 40,200,140, 76,125,242,224, 42,130, 61,149,168, 30, 96, 70,116,150, 51,238,228, 85, 67,112, 80, 13,112, 4,183,
+ 29,210,206,141, 14, 89,126,148,115,176, 79,211, 70,245, 90, 85,241,118,133,222,100, 43,138,106,113,241,203,182, 29, 72, 78, 74,
+ 27,159,247,240,232,221,183,225,104,181, 57,137, 10,145,119,208,135, 15,110,158, 79, 28, 56,242, 67,248, 5, 84,110, 88,152,122,
+207,225,110, 11,142,236,179, 57,104,180, 4, 82,215, 57,159,126,245,221,244,238,189,135,224,198,213,243,184, 23, 29,143, 22, 45,
+154,225,157, 1,195,161, 86,229,215,217,191, 99, 77, 55,171, 78,125,134, 39,178, 78,111,222,186, 51,195,218,108,136,123, 28, 21,
+ 95,146,150, 62, 51,230,222,245,204, 24,231, 23,154,167, 60,235, 52,148,187,184,223, 51,154,109, 72, 79, 79,195,181, 63, 46, 53,
+214,103,198,220,171,200,249, 18, 9,184, 8,191,155, 3,179,133,133,217,202,162,125,135,110, 38, 1,199,216,110,241,234,109, 45,
+ 51, 51, 50, 57, 50,103, 79,214, 61,160,174,192, 79,100, 54,222, 79, 80, 10,204, 22, 22, 53,252,101,101,106,122,249, 7, 45,153,
+ 49,227,211,186, 92,129, 4,106,173,209,148,153,145,238,187,121,247, 69,205,163,199, 15, 2, 42,121,187, 56,127,183,230, 39,129,
+202,192, 32, 71,105, 68,190, 90,197,140,156, 60,211,127,235, 15, 75, 71,149,101,180, 74,232, 46, 82,253, 68,248,213, 58,110, 78,
+ 2, 70, 99,176,178,121, 42,179,109,228,128, 55, 27,116, 89,100,178, 38,173, 94,181, 70,122, 55, 65,141,251, 9, 74,136, 5, 92,
+ 8, 5, 28,152, 44, 44, 28,188,157, 56,190,222,190, 83, 90, 55, 13,193,153,123,185,224,114, 57,208,171, 11,116, 60,228,197, 54,
+237,216, 93,218,164,121, 75,116,234,216, 1, 79, 98, 99, 42,135, 29, 59,216,229,250,181,203, 89, 86,115,237,105, 90, 69,236,225,
+ 10, 5, 22,116, 58,174, 69,232,251,190, 95, 64,213, 54,131,134,191,239, 82,165,114, 0,227,237,233, 1, 43,225, 97,210,123,131,
+ 29,190,243,237,198, 28, 88,182,112, 14,140, 70, 19,188, 92,133, 32, 4,216,182,110, 62, 76, 38, 19,252, 61, 68, 80,106, 75, 95,
+ 77,174, 60, 63, 82, 90, 20,170, 66,125, 79,158, 51, 99,101,237,103, 24, 38,108,246,236,217, 95, 2, 32,179,103,207,254,178,120,
+123,233,210,165,122, 0, 25,229, 52, 29,110,126,193,104, 21, 31, 92,233,119,183, 32,216,211,195,239,122,248,153,211, 46, 71,238,
+179,184,113,248, 14,122,183,240,131,128,199,129,212,197, 31,247,147,148, 56,113,104, 83,225,209, 61, 63,165, 27,141,198,239,203,
+111,107, 14,106, 42,151,202,206,252,186,115, 47,235,233,225,193,217, 24,174, 72,200, 83, 91,159, 53,105,197,222, 60,198,222, 57,
+179,217,143,128, 57, 45, 22,139,131, 76, 38,147, 91,121, 25,187, 45, 60,165,168, 19, 47,243, 54,202, 86, 48, 92,174,109,231,174,
+157,240,116, 22,194,104, 97, 49,251,139,143,245, 99,186,203, 11, 71,190, 59,188,115,167, 94,211, 47,240,101,181,206,183,110, 92,
+139, 52,106,212,168,144,203,229, 58,212,149,194,219,219,123, 62,135,195, 25, 33, 20, 10,157, 76, 38,147,218,196, 26,164, 90,131,
+ 9, 6, 51,160,211, 25,192, 23,216,205, 34,159,203, 64,111, 48, 65,167, 55,149,125, 99,100, 69,253, 14,160,182,234,185,152,210,
+249, 71, 53,132,191,237, 63,250,241,144,119,135,205, 13,104, 56, 64,158,148,169,132,128, 49,163, 89, 93, 63, 92, 60,125,152,164,
+ 37,199,126, 90,158,201, 2,128, 28, 69,126,160,151,151, 15,238, 38,106,144,158,167, 71, 86,145,201,202, 44, 48, 66,173, 87, 35,
+180,138, 63, 10,149,202,192,215, 62,191,192,225, 51,103,206, 12,237,213,127, 24,166,127,177,160,237,207,155, 86, 68,202,132,252,
+113,218,236,184, 75,142, 24,173,168,168,168,252, 89,179,102,213,220,178,101, 11,103,212,168, 81,250,144,144, 16,241,232,209,163,
+219,238,216,177, 67, 44,149,138,245,247,175, 30,155, 59,225,163,217,253, 55,175, 93,212,176,160,160,128,177, 90, 44,167,204, 5,
+ 5,179, 53,229,152,185,167,199,190,124, 60, 47,193, 60,182, 91, 59,175, 99,238, 82, 78,125, 17, 49, 13, 71,221,249,123,241,104,
+190, 57,225,244,122,181,100,232,202,143, 50, 10,217,175, 12, 28,239,197,229,153, 44, 0,224,112, 25,152,172, 54, 56, 73,248,224,
+112, 56,197, 38,222,239,151,189,167,164, 94, 46, 66,240,185, 28,240,184, 12, 84, 58, 11,114, 85,102,124,248,190,163, 51,132, 16,
+214,106, 35,208,155,172,208, 21,213, 14,213,170, 92,204,249,226, 51,188,211,119, 32, 38, 76,249, 12, 5,122,224, 78,162, 26,102,
+139,165,220,155,130,195,112,160, 51, 90, 49,174,123, 21,228,107,204,208,234,173, 48, 89, 89, 72,133, 60,240,121, 28,200,196, 60,
+ 56, 75,249, 0, 33,130,226,194,132,207,231, 27, 44, 22,203,206, 50,106,244,168, 22,232, 3,189,133,131,230,195, 86,160,107,171,
+218,136,254,253, 32,239,242,141, 7,213, 63,249,226, 43,124, 60,177, 47, 14, 60,174, 9,119,239, 42,144,203, 36,176, 16, 14, 0,
+226, 96,135,189,249, 44,199, 60,112,196,143, 91,182,197,124,251,205,108,113,161,150,129, 72,192,197,133,243,231,112,253,230,157,
+181,185, 15,143,238,196, 91,132, 79, 56, 62,206,206,206, 16, 11,185, 48,153,141, 38,199,187, 46, 16, 16,160,177,204,187,246,143,
+ 69, 53,254,198, 54, 22, 37,236, 43,223,104,241,196,206,179,167,125,241,237,146,238,189,135, 32, 60,236, 0,246, 31,216,107,107,
+213,115, 60,119,215, 47,155,208,182,107, 63,180,237, 62, 12,167, 14,239,248, 76,203, 50,245, 38, 77,159,187,176,125,231, 94, 8,
+ 63,113, 0,217, 89,105, 43, 29, 77, 47,151,207, 76,239,220,173, 47, 12, 38, 27,218,117,233,131,211,199, 15,127,132,162, 65, 22,
+142, 63,196, 94, 42,159,193,177,126,246,233,116,126, 78,161,137,175, 80,153,144,166,208, 33, 41, 91,135,163,123,126, 38,142,151,
+ 23,166,102,237, 67, 43,241, 39, 45,191,240, 52,176,146,159,145,111,212, 75, 98,227, 19,234, 76,120,127, 12,191,122, 80, 29, 78,
+142,210, 8,133,210,136, 92,165, 17, 26,131, 21, 65,149,106,113, 44, 86,166, 85, 69,243,217,211, 69,200,223,112, 60, 17,206, 50,
+ 62, 90,215,121,253,129,182, 44,203,254,105,178, 86,219, 77, 86,100,162, 18, 34, 1, 23, 34, 1, 7, 34, 1, 23, 86, 27,113,168,
+226, 34,241,174,221,235,195,105, 31,248,155,172, 64,158,210, 4, 30,151,129,183,167,155,172, 89,195, 17,216,182,226, 35, 0,192,
+196, 89, 27, 49, 97,220,104,212,173, 31,130,194,130, 2,223, 17, 67,122,173, 6,112,216,209,180,158, 12,191, 84, 57,252,202,221,
+ 89, 31,206,152, 39,127,183,111, 39,238,189, 4, 37, 50,243,141,136,143, 85, 87, 40,242, 6, 0, 86, 27, 11, 2,130,237,123,195,
+ 32, 17,242,160, 80,154, 65, 8,193,162,245,251,224, 36,225, 35,179,192,222,220, 95, 22,101,250,145, 50, 34, 82, 21,136, 54,246,
+129,189, 47,151,151,163, 17,173,165, 75,151, 70, 47, 93,186,180,196, 8,217,115, 38,235,245, 22,149, 22, 8,100,117,156, 61, 60,
+111,132,159, 62,233,116,248,190, 13, 23,239,231, 97, 72,187, 74,208,228,167,226,251, 47,222,205,103, 64, 76, 28, 46,183,208,168,
+215, 29,210,235,181,139, 1,152,203,188,104,124,107, 55,150,137,229,231, 54,108,254,213,234,233,237,141,157, 87,243,211, 10,180,
+ 86,203,159,205, 86, 22,230,206,153,205,213,173,172,165,167, 33,251,201,237,242,106,226, 44,129, 96,233,166,163, 0, 8, 88,150,
+ 5, 97, 89,240,197,114,153,103,141,150,217, 69, 5,157,152,199, 97, 12,207,151, 0,132,181,166,229, 38,150, 29, 6,101, 0,184,
+ 72,249,216,123, 57, 29, 0,178,185,234,136, 71, 35,223,181, 55, 23, 26, 76, 98, 85,253,154, 53, 73,179,102,205, 10, 37, 18,135,
+166,191,226,250,248,248,220,154, 59,119,110,157, 9, 19, 38,136,132, 66, 33,172, 86,171,251, 79,155, 55,179,155, 23, 79,196,160,
+143, 54, 64, 32, 20, 65,111, 48,131,207,231,161, 64,169, 65,161, 74, 7,181,206, 82,241, 43, 40, 33,193,164, 0,150, 31, 57, 44,
+ 28,216, 67, 30,218, 92,200, 17,160, 73,176, 31, 46,158, 57, 66,110,156,222, 54, 81,159, 19,251,171,131, 23, 34, 52, 6, 11, 50,
+242, 12, 72,207, 51, 32,171,192,128,172,124, 35,178, 10, 12, 96, 24, 6, 6,147,245,141, 30, 92,218,156,152,253, 59,127,221,218,
+207,104,198,240,246,221, 7,226,179,121, 27,170,236,252,113,217,185, 68,194,105,227, 96, 71, 91, 91,116,116,116,242,251,239,191,
+223,112,247,238,221,220, 6, 13, 26,232, 31, 61,122, 36, 45, 50,145,102,185, 92, 42,249,249,135,165,103,154, 55,111,190, 39, 61,
+246,241,133,162,246,244,114, 11,246, 42, 29,198,138, 36,230,187,147, 42,203, 90,247,168,225, 43, 69,101,153,186, 71, 29,249,253,
+239,243, 58,127,188, 68,113, 97,109, 78,166,209,122, 86,161,231, 54, 74,215,240, 29,234,131,103, 49, 26, 82, 6, 13, 25, 14, 46,
+195,129,217,160, 75, 41,190,184,188, 93,132,152,191,235, 49,228, 98, 62,156, 36, 60,200, 37,124,180,173,231,142, 10,148,103,196,
+ 98, 99,161, 51,218,160, 55, 90, 97, 48, 89,225, 25,232,134, 45, 59,247, 35, 53, 71,143,163,183,115, 17,147,162, 70,173, 74, 50,
+ 16, 82,126, 49,201,218, 44,218,190,131, 71, 57,113, 57, 12,184, 28,134, 83,175, 78,109,228,107,204, 16,240, 56, 16,136, 37,144,
+137,120,112,150,240, 33, 16,240,145,147,147, 3,163,209,136,202,149, 43,139,203,182,130, 4, 78,114, 9,106, 85,247,135,217, 98,
+197,201, 43, 15,177,248,211, 65,232,214,190, 41, 24,190, 28,143,141,141,225,228,238, 4,150,195,129,217,202,194,100,182, 1,224,
+ 24, 74,211, 11, 12, 12,236, 44,147,201,100, 58,157, 78,157,154,154,122, 41, 43,230,112,170,141,219,127,210,233,240, 11, 59,251,
+188,211, 13,119, 35,163,113,224,240,177,171,185, 30,202, 25,197,223,169, 95,191,126, 75, 79, 79, 79,121, 94, 94,158, 42, 42, 42,
+234,214,235,214, 11, 8,135,243, 73,171,182, 29,161, 41,204, 65,246,211, 36,135,107,209,117,171, 56,225,235,165, 27,154, 4,215,
+ 14,110, 98, 35,118,227, 85,175,178, 19, 62,159,183,174, 73,205, 90,181,155, 20, 15, 8,169, 91,185,236,105,217,120, 82,167,238,
+239, 77,248,108,105,191, 33, 99,113, 33,252, 24, 86, 45,254, 98,167,204,197,171,174,187,155, 75,163, 6, 45,187,227,234,185, 99,
+ 16, 59,249,194,205,195,183,237,168,113,211,186, 14, 25, 53, 25,215,175,158,195,218,101, 95,238,176, 25,213,191, 57,146, 86,153,
+119,117,175,134,141,155,143,116,114,247, 65,161, 82, 13, 39, 55,111,212, 13,109, 54,242,225,125,227, 44,109, 78,162,226,181, 77,
+ 7, 33, 48,154, 9, 10, 52,102, 60, 85,232,145,156,101, 55, 90, 44, 91,129, 62, 65, 54,150,145,139,121, 60,119,203,147,202, 15,
+206, 93, 32, 85, 2,125,152,229, 11,191,224,154, 33,134,162,208,110,178, 20, 42, 19, 20, 74, 19, 52, 6, 11,220,101, 60,176, 54,
+182,194,181,238, 2,141, 25, 78, 82, 62, 92,164, 2,135,163,140, 37,177,233,151,189,193,247, 99, 51, 6,172, 90,181, 70,122, 47,
+241, 57,147,197,183, 71,179, 68, 2, 46,108, 44, 11, 56,112,199,243,121,252,233,253,123,117,197,211, 92,189,125,212, 50,135, 65,
+173,144,230,240,148,176,232, 50,108, 54, 0,160,111, 47,123,215,182,196, 76, 45,142,223, 80, 0, 47,118,236, 46,187, 44,214,235,
+185,155,119,157,248,100,255,190, 61, 46, 6, 27, 15, 63,157, 74,134,206,104,133, 88,192,133, 72,192,133, 68,192,125,161, 63,118,
+249, 70,203,222,231, 46, 53,215, 2,157,193, 0,149,222, 2, 2,224,214, 19, 13,244, 38, 43,148, 90, 11, 90,214,113,123,179, 64,
+ 8,195,156, 32,132,244,126,217, 16,189,108,150,158,139, 72,149,164,113,251,121,141,226,207,151,102,228,158,239,179, 5,160, 66,
+ 35,184,120, 47, 59,199,231,183, 5, 50,183,186, 46, 78, 46, 55, 78,159, 10,147, 31,190,207,226, 82,164,221,100, 89,244,185, 88,
+ 57,107, 68,154,170, 48,183, 19,128, 4, 71,127, 76,234, 89, 55, 84, 44, 20, 93,248,110,205, 79,102,111,159, 0,246,208,141,194,
+ 28,165,206,246,130,155,176, 25,141, 28,194, 18,129, 33,251,137, 67,109, 8, 28, 14, 99,158,247,209, 64,176,132, 96,254,154,253,
+ 88, 50, 99, 24,228,146, 81, 82,134, 97,164, 90,131, 21,159, 46,216,138,149, 95,143,119,146,138,120, 96, 24,123,159,168,247,134,
+ 15,116,236, 2, 52, 88, 17,127,115,183, 70,157, 24,246,232,249,230,194, 22,109,223,185,211,162, 69,139, 66, 55, 55, 55, 72, 36,
+146, 63, 35, 21,165,224,227,227,243,245,188,121,243,130,167, 76,153,242,108,178, 79, 30,143,135, 15, 63,248,128, 99,179, 17,156,
+ 58,181, 13, 94, 85, 27,227,216,217, 27,232,217,185, 25, 52, 58, 3,242, 11,213, 96,193,125,237, 11, 81, 93,152,123, 33, 43,249,
+ 65,243, 54,157,250,226,210,153, 35,228,198,169,159, 39, 86,100,142, 30, 55,119,183,167, 17, 15,226,235, 50,140,187, 61,162, 85,
+100,178, 76, 22, 22, 85,124,164,120,154, 28, 15, 87, 23,151,167,142,234, 73,188,130,251, 51, 28, 50,133, 1,217,166,205,142,219,
+ 15,128,104, 51, 31,141,216,255,219,230,200,232,168,123,139,251,140,156,206,235, 62,228, 3,238,143, 75,167,125, 9,192,209,137,
+247,204, 49, 49, 49, 15,199,143, 31,223,250,250,245,235, 54, 0, 58,134, 97, 44, 92, 46, 87,106, 50,153, 4,157, 58,117, 82, 62,
+126,252,248, 50, 74,238,180,248, 2,109,223,223,239,201,136,212,239, 8, 89,243,136, 42, 78,234,110,157,218,181, 66,171,250,129,
+120,218,174, 21, 0, 76, 79,209,200,131, 13, 53,183,238,181, 88, 37, 39,127,252,229,248,146,137,195,186,126,186,147, 55,127, 85,
+102,216,252, 50, 59,162, 62,125,116,185, 71, 73, 54,158,199,229,192, 73,194,135, 92,194,131,147,132, 15, 39, 49, 31, 22, 43,169,
+ 72,205,145, 88,172,172, 61,162,101,178, 66,163,183,226,194,189,108,100, 41, 77, 40, 84,155,161, 55,219, 64, 64,236,181, 81, 7,
+ 74,115,197,147,107,174,197, 79, 82,215,202,141,149,155,215,175,112, 62,248,123,218,179, 17,125, 46, 82, 33,156,164,246,209,216,
+ 87,174, 92,129,135, 71,249,181,125,150,101,113,224,244, 45,172,218,126, 1,167,183,205,132, 88,192, 69,104,255, 5, 24, 59,160,
+ 5, 88,194, 34, 62, 38, 58,187, 86,189,134, 62, 28,142, 4, 28,134,129,209,194, 2, 32,165,158, 79,147,201,228,145,154,154,170,
+ 10, 10, 10,242,245,247,247, 31,194,229,114, 9,212,247,140, 71,246,228,235,206,135,253, 38,213,234,141, 54,169, 85,185, 45, 40,
+ 83,223, 27, 65, 65, 96, 24,134, 56, 59, 59, 11, 46, 92,184,160, 9, 9, 9,241,122,205, 91,137, 35,241,174,189,118,194,212, 79,
+134,212,172, 81, 3,251,127,219, 6, 66,152,131,142,126,121,215,241,235, 88, 56,231,197, 17,134,159,207, 91,215,100,229,130,233,
+ 47,236,155, 58,103, 85,153,163, 14, 37, 34,249,140, 65, 35, 38,225,206,173, 63,240,253,130,207,247, 24, 53,249, 99, 45, 86,203,
+208,252,204,196, 61,213,235,181, 0, 49,171, 17,190,111, 5,134,141,158, 40,234,222,103, 8,174, 95, 61,135, 37, 95, 78,221,165,
+ 43,204,121, 31, 14,118,114,102, 9,127, 74,167, 30, 3,248,122,163, 25,235,150,127,131,201, 51, 22,163,101,231,190,252,168,123,
+ 55,166, 0,248,214,225,238, 16,102, 27, 58,133,120,218,205,179,133,197,177, 68, 46,175,164, 43,144,199,101, 56,141,106,184, 66,
+111,178, 66, 85, 78,165,146, 39,224,103, 21, 42, 85, 85,127, 88,242, 9, 87,107,176, 66,161, 52, 33, 71,105, 68,110,225,159, 6,
+ 43, 87,105,132, 66,105, 2,159,199, 32, 54, 33, 5, 28, 62,175,194,253,243, 10, 52, 22, 52,175,237,102,191, 71, 95,179,117,196,
+194,115,110,113,250,242,253, 65,171, 86,173, 22,223, 79, 82, 35, 50, 81, 85, 20,201,226, 66,196,231, 64, 88,244,183,141,181,247,
+141, 44, 11,103,175, 26,213,199,188, 55,170,139,179, 92,130,140,184, 28,240,184,246, 41, 98, 92,188, 3,225, 34, 50, 96,218,212,
+ 73,240,244,112, 69,106,174, 17,107, 15,199, 34,242,225, 19,176,250,138, 29,246,186,159,246,244,156,240,225,231,174, 28,190, 16,
+ 59,206, 36,217,211,201,181,225,241,141,227,134,140,248, 7, 90,141, 42,143,128,216, 28,236,131,204, 16,171,205,126,185, 45,153,
+ 63, 27,123,182,111,196,153,136,156,103, 87,224,239, 7, 87,226,147, 57,139,144,171, 50,161,164,235,178, 44, 63, 2, 64,241, 92,
+ 36,234,149,237,231,204, 81, 73,219, 76,209,182,169, 20, 13,211, 75,230,202,244,210,126,211, 75,122, 37,205,253,183,185,220,166,
+195, 87, 76,145,171, 87, 3,169, 88,246,199,169, 83,199,101, 71, 34,201, 51,147,101,214,229,146,197,211,251,166,169, 10, 21,221,
+ 43,100,178,188,106, 53, 16, 73, 69,151,231, 46, 90,107,244, 9,168,106, 61,121, 79,149,167, 54,216,172,175,246, 65,144,217,100,
+ 46, 94, 6,158, 80,180,138,175, 55,125,147,155,251, 72, 91, 94,228,137, 37, 4, 97, 55,179, 64,136,189,138,180,239, 74, 58,138,
+106,230,176,177,246,102,149,179,247,114,192, 43,234,135,226,104,248,123,211, 79, 27, 85,189, 67,148,218,145, 75,230, 63,107, 46,
+108,217,208, 30,201,114,118,118,134,171,171, 43,228,114, 57,202,107, 58,100, 24,230,189, 9, 19, 38,188, 82,251,207,201,201, 65,
+215, 46,157,176,126,227, 22, 52,236, 50, 6,103,175,157,129,217,194, 34,180, 94, 13, 84,245,119,195,211,108,245,107,221,232, 50,
+159,224, 15,155,119, 26,240,101,219,206,125,113,225,244, 33,114,227,244, 47,147, 42, 58, 17, 98,239,174,173,143, 47, 92, 56,191,
+250,220,197, 63,136,156,196, 60, 60,210,152,192, 97, 24, 84,241,145,194, 67,198,193,165, 35, 59, 12,195,250,182,118,120,114,188,
+192,192,128,157, 43,215,111,150,173, 92,182,160,211,157, 8,230,130, 38, 35, 54, 31, 0,116,217, 49,203, 31, 3, 15, 43,253, 17,
+126,178, 97,135,129,240,241,175,209, 45, 49,251,177,195,102, 3,128, 46, 33, 33, 33,113,238,220,185,193,203,150, 45, 35, 92, 46,
+151, 5, 32, 90,179,102,141, 46, 46, 46,238, 30,236, 67,115, 81,222,195,166, 75,183,250,159,202,133,182,150,238, 82, 78,253, 26,
+190, 82,180,170,111,111, 21, 29,214,187, 45, 2, 43, 87, 70, 66,150,174, 81,190,142,229,107, 76,220, 26, 27,126,138,188, 93,205,
+147, 59,209,170, 55, 61, 4,112,180,162,249,195,224,207, 14,242,197,209, 44, 39, 9, 31,172,253, 90,169,144,209, 50,154,109,208,
+ 27,109,208,155,172,208,154,108,208,153,108, 96,137,253,158, 96, 24, 6,102, 43, 11,135,170,205, 47, 93,251,206,238,158,168, 81,
+141,129,179,212,158, 54,231,162,233, 30, 24, 0, 30, 30, 30,240,246,246,118, 40, 42,106, 50,219,111,113,147,133,125,214,172,111,
+ 50, 91, 65, 8, 65,108,108,204,204,228,196,196,254, 65,181,130,218,215, 11,109,232, 46, 21,113, 0,160, 84,163,165,211,233,108,
+ 78, 78, 78,222,238,238,238,156,244,244,244,103,230, 57,168, 81, 39,235,225, 67, 7, 49,104,208, 64,205,163, 91,247,159, 13,113,
+215,235,245, 76,155, 54,109,156, 3, 3, 3, 57, 70,163, 81, 85,209,108,146,121,213, 30,224,230,225,190,248,189,247, 39,215,238,
+212,181, 39, 46,158, 15,199,209, 67,187,127,213, 41, 98,195, 29, 21, 9, 14,174,243,202,168,195,154,181,106,191, 50,234,176,106,
+245, 90,101, 26,173,122,161,205, 90, 16,134,135, 51, 97,251,136,129, 99,158, 10,128,181, 25,212,251,246,110,250,250,219, 17, 83,
+230,212,236,213,111, 4,222, 27, 61, 22, 60, 30, 23,151,206, 30,199,202, 5,159,157,208, 40,115,198, 56,210, 77,192, 30,122,171,
+ 43, 8,144, 4,126, 92,185,102, 3, 68,220,184,138,248,216,168,232,251,183,175,215, 15, 10,105, 9, 47,255, 42, 31,167,120,114,
+151,225,209, 35,115,121, 50, 38,131, 33,101,236,152,209,120,126,212, 97,171,198,193, 30,204,203, 55, 0, 0,157, 58,199,252,243,
+138, 79,227,138, 71, 29,178,102, 83, 74,105,186,202, 2,197,129, 75,215,110,206,232,223,187, 39, 39, 87,101,178, 71,176,148,166,
+162,151, 17,185,197,127,171,140,168,229, 47, 71, 76,116, 4,107, 80,230, 30,172,224,125,105, 24, 59,180,199,195,226,107,151,101,
+ 9, 24,192, 80,225,102, 41,190,243,164,229,223,175, 18,223, 79,212, 32, 50, 73,101,111, 42,228,115,237, 6,139,207,121,102,186,
+236,163,217,203,137, 14, 49,220, 37,227,198, 12, 71,174,202, 12,150, 5,120, 92, 78,209, 75,128, 84, 53,131,167,106, 29,114, 11,
+ 20, 72, 76, 78, 65, 97, 86, 60, 56, 28, 14, 60,253,107, 59, 60,147,180,141, 8,253,116, 38, 18, 50,164,119,123,222,161, 63, 50,
+ 33, 21,241, 96, 84,103,227,212,222, 21, 10,163, 70,181, 88,175,211, 28,114,100, 62,199, 63,187, 32, 48, 10,149,198,224, 35,226,
+115,177,127,251, 15, 24, 58,118,234, 11,165,239,204,175, 22, 2, 28, 6,249, 5,106, 48, 12,163,168, 88,185,196,220, 46,107,251,
+ 53, 35, 99,111,172, 81,130,217,122,181,162, 80,122,109,148,156, 10, 63,125, 92,246,123,178, 8,183, 98, 50,139, 76,150,130, 93,
+244, 81,239, 52,181, 50,191, 7,128,216,138,213, 11, 57, 61,134,141,155, 17, 93,163,118, 61,227,197, 40, 77, 82,161,214, 82,106,
+ 63,135, 86, 67,230, 70,223, 57,177,190,151,210,146,240,129,204,175,158,141,181, 90,151,235, 21,177, 11, 74,105, 58, 20, 46, 88,
+187,255, 89,179,225,172,101, 59,236,127,219,108,176, 17, 22,132, 5,166,125,189, 9, 86,214, 6,214,102, 3,107, 35,176,216,136,
+180,188,228,122,251, 87, 61, 84,240,120, 95,157,145,223,190,218, 92,232,234,234, 10, 15, 15, 15,120,120,120,192,217,217,185, 92,
+163,197,231,243,229, 60,222,139,167, 58, 37, 37, 5,201,201,201,112,118,118, 6, 97, 45, 48, 89,128, 6, 45,187,227, 65,124, 20,
+206,253,126, 15,132,181, 65, 38,175,248, 42, 47, 50,159,224, 15,154,117,236,255, 67,231,126,227,113,246,208, 79,228,246,149,227,
+147,245, 57,177, 91, 29,142,208,219,108,140,197, 98, 65,239,238, 29, 83,238, 70, 63, 57,253,213,140, 41, 61, 91,247,153, 44,106,
+ 21, 28, 0,131,201,134,180,228,120, 92, 58,242,139,161,118,117,191, 51, 93,218,181, 72,177, 88, 44,176,217,108,229, 62,200, 13,
+ 38,115, 46,151, 47,145, 13, 31, 62,146,127,251,214,173,131, 50,175, 90,251,109, 12,231, 62, 67,216, 80,134,144, 65,161,161,117,
+ 97,182,176,208,233, 84, 5, 21, 61,102,181, 90,157,184,109,219,182,234, 99,198,140,145,214,171, 87,143, 31, 31, 31,143,149, 43,
+ 87,230,169,213,234, 68, 71, 53,194,175,196,172,225, 49, 5,113,197, 17,173,212,182,173, 48,188, 79, 91,236, 57,241, 59, 46, 93,
+189,142, 20,141,252,158,198,202, 59,242, 52, 37,195, 88,223, 93,117,176, 95,171,170,220,253,219, 11, 14, 70,119,156,253, 46, 33,
+162,240,220,203,243,181,142,223,220,128, 90,111,129,179,212, 62,223, 83,113,100,139,203, 48, 14, 59, 34, 6, 72,188,122, 61,162,
+ 65,211, 90,245,112, 55, 81,137,156, 66, 35,244, 70, 43, 88,150,128, 5,129,135,147, 16, 98, 1, 7,169,201,137, 96,137, 57,169,
+130,143, 10, 69,135,246, 29,120, 0, 3,134, 33, 60, 62,143, 7, 2,251,252,138, 18,137, 68,227,237,237,237, 80, 68,203,108,181,
+ 98, 80,207, 22,104,217, 44, 20,253, 39,219,231,204, 60,255,235,108,184,201,249,216,179,115, 43,158, 94, 89,179,179,122,171, 41,
+225, 81, 15,162, 7, 71,223,253, 99,228, 59, 77, 36,141,124,121, 25,130,210,194,164, 90,173,246, 32, 0,161, 64, 32,232,217,190,
+125,123,247,131, 7, 15, 22,122,122,122,178, 66,129, 64,209,175,111, 31,150, 47, 16,228, 23,127,246,218,181,107,252,201,147, 39,
+ 59, 21, 20, 20,164,102,103,103, 95, 7, 96, 41,187, 34, 24,220, 21, 28,236, 6,195,136,229, 18,105, 74,181,106, 53,252,155,181,
+108,225, 50, 96,208, 80,136,132, 34,156, 13, 63,141,117,171,151,237,211,100, 62, 26, 87,145, 51,249,182, 70, 29,166,165, 38, 37,
+234,244,198,144, 6, 77, 59, 50, 87,195,143, 76, 55,195,115, 53, 87,100, 94,209,117,208,212,154,137, 25, 26,172, 91, 58, 19,110,
+ 46, 50, 36,197, 63,214,199, 61,122,176,201, 98, 80,205,116,216,100, 1,144,230,217, 6,183, 26,221,211,205,104,182,225,202,133,
+ 19, 6,214,202,246,188,126,249,100,124,165,218,205,196, 13,154,117,113,203, 61,186,117,144, 14,216, 83,158, 78,250,227, 87, 35,
+184,196, 84,152,116,254,194, 57, 23,159, 42,245,185, 12, 24,152,141, 6, 40, 18,110, 91,117,217,143, 85,170,244, 40,135, 70,225,
+230, 61,197,215,115,230,125,247, 65,179,166, 77,101, 4,226, 23, 34, 88,197, 6, 43, 87,101,130,167,147, 16,122,149, 2,113,183,
+ 79, 27,116, 10,110,153,243,157, 89, 77, 90,105,110, 78,182,240,207,238, 12,177, 45,203,250,124,110, 78,182,208,106,210, 74,203,
+127,212,113,225, 44, 19,226, 65, 82,250,179,142,239, 34,190,189,111,150,144,207,125,214, 79,171,184, 44, 40,135,142, 2,177, 43,
+210,243, 12, 96, 64,192,218,172,176, 90, 76,221, 61,207,163, 0, 0, 32, 0, 73, 68, 65, 84, 80,171, 84, 72,207,200, 66,118, 86,
+ 54,212,234, 66, 72,229,110,104,208,168, 57,156,100, 98,220,191,180, 15,132, 16,135,230, 53,180, 48,252,224,102, 45,219,137,162,
+146,237,125,177,196,124,130,227,187,151,229,105, 84, 57,237, 52,153,113,113, 21, 45,139,173, 54,219,185,200,135,113,245, 43,249,
+ 85, 99,238,197, 43,177,115,203,122,152,138, 34,155, 22,139, 13, 81,169, 90,100,230,235,144,154,240,136,176, 54,219, 57,252, 71,
+224,149, 30, 0, 4, 47,180, 65, 93,116, 31, 53, 0, 27, 55,110, 66, 66, 98, 50,187,120,122,175, 84,141,186,240,157, 10,152,172,
+174, 40,154,107, 67,151, 29,179, 92,239,214, 44,237,216,221,124,142,222, 68,202,236,224, 35,246,170,130,118,227, 86,158,209,171,
+243,133, 54,163,142,119,124,231,184,221, 37,105,218, 29, 52, 76,139, 63, 31, 6,185,132, 7,134, 97, 80,220, 92,184, 97,225, 36,
+ 72, 69,246,182,101,189,209,138, 81,159,174,194,206, 85,159,129, 0, 24, 49,244,119, 93,105,233,132,125,237,194,105,126,184, 85,
+ 41, 37, 57, 39,189,107,223,207,207, 27,204, 34, 99,159,129, 99,238, 52,109,218,180, 80, 34,145, 64, 34,145,192,217,217, 25,110,
+110,110,112,117,117, 45,247,216, 45, 22,139,198,100, 50,121, 8,133, 66,176, 44,139,164,164, 36, 36, 37, 37, 65,169, 84, 66,161,
+ 80, 64,171, 81, 89,111,157,223,207,107,208,170, 23,252,107,132,160, 74,173,134,224,115, 25,240,120, 28, 92, 58,182,165,180,116,
+150,108,178, 58,244,219,208,165,255, 4,156, 61,180,153,220,190,114,124,138, 62, 39,118,139,163,121, 84,212,220,115,127,208,160,
+ 65, 33,147, 39, 79, 22,204,155, 49,249,204,137,240, 75,177,251,195, 54,247, 45, 40, 40, 12, 36,132,192,213,197,229,233,176,190,
+173,143,119,106,211, 44,229,252,249,243,236,238,221,187,141, 12,195, 60, 40, 75,211, 94, 72,229,252,122,254,220,133,249,237, 58,
+116,196,214,237,187, 59, 68, 63,124,212, 33, 62, 62, 14,129, 85,106,160, 90,245, 90,208, 49,110,184,112,249, 42, 52,133, 57,191,
+ 58,146,206,151,162, 90, 76, 65, 65,193, 31,195,134, 13,235,254,251,239,191,115,134, 13, 27,166,203,205,205,189,246, 92, 20,139,
+148,167,121,253,199,129, 10, 0,191, 86,233, 48,118, 95,186,185,240, 99, 0,203, 42, 87,169,140, 75, 87,175,227,250,239, 55, 55,
+229, 74, 43, 47, 24, 55,234,253, 73, 85,251,113, 39,244,107, 85,149,235,237, 38,197,111,155, 87,114,143, 93, 79, 94,149,156,103,
+219,186,236,242,252,133,142,228,209,179, 7,135,218,140, 54,117,221, 97,177, 17,176,196, 94,224, 58,137,249,165, 21,188,175,104,
+242, 76,162,113, 83, 38, 79,142,111, 16,218,232,147, 81,239, 79, 17, 52,170, 17,136, 91, 79, 10, 1,134,129,187,175, 12,153,153,
+153,184,114, 96,179,181, 32,253,241, 38, 46,151,253,182, 2,231, 19, 5, 41,247,130,158,219,156,148,155,155,139, 75,151, 46,161,
+216, 96,121,121,121,149,102,180, 94,208,204,203,206,184,182,240,251,159,218, 76,124,111, 32,250,116,172,143,203,183,227, 97, 42,
+154,175,169,120, 40,121,226,245, 31,133, 31, 15,171, 97,250, 96, 80,109,149,222, 34, 76,254, 58, 73,121, 5,246, 53, 88,217, 82,
+210,105,202,207,207, 63, 22, 19, 19,211,182, 97,195,134, 85, 79,158, 60,153, 31,125,243,204,244,231, 19,241,249,231,159,203, 55,
+110,220, 40, 37,132, 92, 51,153, 76, 9, 14, 29, 59, 7,191, 69,220,185,227, 97,182,176,184,122,243,126,221, 46,109, 26,129, 37,
+192,237,219,183,177,245,231,173,134, 7,145,247, 86,104,179,125,191, 45,195,188,148,120, 62,109,111, 54,234,240,153,102,102,122,
+242,138,179, 39, 14,236,108,214,161, 47, 70, 78,251,246,219, 75, 39,118,207,111,210,174, 15,167,110,179,238,136,184,126, 1,231,
+ 78,158,254,206,172,201,159,143,242,251,142,148,152, 78,145, 68,250, 81,189, 38, 29,144,154,146,140,164,184,168, 95, 13,249, 79,
+ 50, 82,226,185,191,102,164,165, 76,169, 94,191, 13,126, 63,179,103,122, 25, 70,171,204,107, 62,208, 75,178,249,100,216,177,225,
+105,105, 63,250,106,245, 6, 17, 33,196, 32, 18,242,178,228, 28,245, 94,149,195,233,124,100, 86,100, 84, 29, 52,116,212,148, 19,
+235,214,173,230,251,184, 74,145, 85, 96,128, 74,111,134, 90,103, 6,135, 97, 16,228, 47,131, 78,157,143,203, 7,190,183,152, 52,
+ 5,195,128,120,115,105,154, 50,239,224, 69, 5, 79, 46, 76,251,124,234, 69, 8, 93, 2,253,171,117,158, 83,102,180, 78,157,126,
+175,239,231, 83,143, 7, 19, 66,186,200,188,131,213,218,156,152,185,165, 29, 59,195,216,239,239,145,157, 2, 97,182,218,231, 31,
+179,178,128,141,101,139,162,124, 0,121,214,158,207,148,115,236, 12,187,247,196, 53,100,100, 23, 66,111,178,192,104,178,194,108,
+177,129,195,229,194,213,205, 21,181,170, 53,134,139,171, 51,178,179, 50,112,253,252, 49,196, 70, 94,190,198, 16, 44,208, 43,226,
+206, 59,146, 71, 2,137,107,176,159,191, 47, 39, 83,101,130, 68,200,197,189,203, 39,205, 22,147,113,133,131, 38,235, 21,205,194,
+188,252, 85,159,204,248, 98,196, 47,219,182,251,134, 84,119, 70, 90,174, 30,105, 10, 3,212, 6, 75,145, 17, 99, 97,212,228, 34,
+242,194,246, 44,155, 65,189, 10,255, 17, 74, 53, 90, 86,179, 65,125,240,244, 45,143,217,243,191,231, 62,137, 79,176, 44,250,184,
+119,154, 94,163,234, 85,225, 72,214,115,252,242, 97,245, 61,127,197, 65,188,210, 92, 72, 88,176,132,224,248,205,172,103,205,133,
+108, 81,207,203,187,241,101, 47, 35,248,252,218,133, 29,123, 77, 63, 27, 25,163,222,165,215,103,187, 60,126,178,162, 0, 0,184,
+ 92,238,179, 87,113,223, 44,131,193, 96, 42,167, 9,101,199,150, 45, 91,102, 77,153, 50, 69,244,244,233, 83,196,199,199,163,176,
+176, 16, 98,177, 24,167, 79,159,182,128,181,174,136,252,253,112, 82, 76, 68,248, 55,193, 77,187, 87, 10,105,213, 11, 82,169, 12,
+ 60,226,120,103, 76,169,119,237,225, 77, 59,244,251,161,203,128,137, 56,119,120, 11,185,125,249,216, 84,189, 34,118,115, 69,207,
+101, 97, 97, 97, 52,128,184, 21, 43, 86, 52,218,186,117,107,245, 25, 51,102, 36,236,248, 97,254, 58, 0,200,203,203, 3, 0,220,
+189,123,151, 76,157, 58,213,104, 48, 24, 18, 11, 10, 10, 34, 80,206, 0, 8, 0,208, 43,164, 75,182,110, 88,214,224,105,122,230,
+192, 26, 13,154,195,171,122,115,248, 6,181, 64,129,218,140, 91, 79, 50,144,240,232, 60, 30, 93, 61,112, 82, 39,183,206, 71, 5,
+231, 55,110,216,176, 97, 32,135,195,169,166,209,104,124,235,213,171,215, 80, 38,147,221,109,216,176, 97, 99, 30,143,151,118,231,
+206,157,228,138,104,165, 92,222,110,172,210, 97,236,218, 20,181, 83,167,132, 44, 93,227, 20,181,211, 93,157,200,229, 51,197,133,
+181,198, 95,184, 1,171,136, 57, 55,122,255,118,213,193,223, 54,175,228,142,154,244,185, 45, 74,233,246, 49, 79, 34, 60, 91,177,
+112, 53, 39,243,131, 49,253,255,156,222,161, 40,146, 85,244,183, 67, 97,122,165, 50, 82, 9, 96, 86,228, 67,254, 15, 81, 31, 79,
+ 94, 24,218,172,205,232,246,239, 12,227, 88, 5,114,156, 57,252, 35, 73,140,188,176,159, 71,108, 95,233, 29, 88, 13,160,220,230,
+ 32,147,201, 17,147,245,106, 26,159,202, 58,238,223,253,243,216,131,135, 15, 45, 29,208,175,191,199,134,175,223,197,247, 63, 29,
+129, 76, 34, 2, 97, 89,188,219, 41,112,200, 55, 19,234,244, 13,244, 17, 7, 28,188,152,118,101,218,234,168, 89, 58,157, 57,214,
+129, 72, 12,201,205,205,189, 42,151,203, 21,109,219,182,109, 41, 18,137,152,220,220, 92,158,183,183,183,213,197,197,197,148,150,
+150,166, 51, 26,141, 7, 1, 84,104,218,113,179,133, 69, 82,182, 1, 71, 15, 29,196,253,155,231,241,232, 81,140,250,209,195, 71,
+235, 25, 30, 89,173,205,142,203, 7, 42, 92,193, 7, 91,226,168, 67, 82,225, 81,135, 54,163,250,183, 29,155, 22,117,214, 25,140,
+ 99, 27,182,238,141,170,117,219,112,204, 22, 27, 30,220,190,136,139, 7, 86,127,111,214,228,207,126,147, 60,246,175, 84,189, 22,
+225, 10,241,199,165, 19, 32, 44,187, 9, 0, 8,203,110,186,251,251,201, 41, 45,122, 77,128,187,119,213,134,133,169,119, 25,188,
+198,236,225, 2, 30, 71,123,234,224, 47,135,147,146,146,240,248,241, 99, 60,121,242, 4,249,249,249,248,237,183,164, 10,229,143,
+174, 32,249,108,236, 67, 78,143,193,239,142, 60, 62,100,248,123,226,234,181, 66, 56,193,149,220,224, 33,231, 33,230, 73, 50, 98,
+239, 68,178, 49,183, 78, 26,204,170,156, 1,250,130,228, 82,141,159,212,179,174, 15, 96,155, 93,188,118, 97,171, 86,109,130,191,
+ 88,188,180,165,135,151,119,137,229,120,158, 34, 71, 56,115,218,177,224,235, 55,254,112,104,173, 67,214,102,203,155, 52,118, 24,
+203,181, 47, 20,138,103,113,234,162,179,103,175, 76,217,247, 19,214, 90,110, 4,255,253,129,237, 96,101, 89,104,245,102,168,180,
+ 70, 40,213, 6,100,230,228,225,126,100, 36, 46, 31, 63,134,248,152,251,137, 22,147, 41,156,195, 97, 14,232,179, 99, 47, 87,172,
+165,137, 87,221,195,221, 29,137,249, 26,136,133, 60, 36,199,222, 49,106, 85,202, 93,175,123, 29,233,243,226, 50,115,184, 76,247,
+ 97,195,134,159,238,220,163,159, 75,179,214, 93,165,158,206,174, 16,240, 8,226,146, 50, 16,113,237,180, 54,225,254, 21,149,197,
+164,233,249, 54, 86,125,249, 31,167,252, 81,135,102,163,182,239,136,254, 29, 14,113,185, 60, 33,203, 90,141,102,147,113,240,155,
+152,172,191, 10, 66,108,105, 99, 71, 12,124,161,110, 96,101,137,100,196,208, 51,250,231,235, 10, 22, 27,145,142, 24,122, 77,103,
+ 47, 64, 74,239,216,231,231,231,222,187,120,237,194,148,148,188,219,249,249,198,139, 0,210, 12, 6,195,107,167, 49, 59, 59,123,
+225,226,197,139,251,232,116,186, 58, 29, 59,118, 20, 57, 59, 59, 35, 47, 47, 15,225,225,225,150,176,176,176,135, 57, 57, 57,223,
+ 0, 57, 86, 61, 26,255, 26,105, 56, 60, 38,230, 78,248, 55,117,154,246,168, 20,210,186,151,227,133,153, 72, 50,177,115,191,241,
+204,185, 35, 91,200,173, 75, 71, 62,208, 43,226,126,122,131,211,106, 54, 24, 12, 55, 13, 6, 67,212, 87, 95,125,213,204,199,199,
+199,231,155,111,190, 17,171, 84, 42,254,134, 13, 27, 12,185,185,185, 89, 42,149,234, 58,202,232, 79,243, 42,119, 45,202,116, 12,
+ 58,117,112, 75, 39,114,112, 75, 55, 87,207,128,238, 46, 94,149,106, 22, 42,210, 19,149,138,140,112, 0,231,138, 38,138,172, 16,
+141, 26, 53,170,193, 48,204, 48, 0, 13,100, 50, 89,144, 92, 46, 23, 17, 66,234, 48, 12, 19,205,178,108,100,189,122,245,194, 30,
+ 62,124, 88,161,201,100, 83, 46,111, 55, 6, 6,183,217,157,175, 99, 5, 38,142, 96,119,202,229,237, 70, 0,200, 57,251,133, 14,
+192,209,135, 29,103, 13, 58,118, 61,121, 93,116,129,203,116,197,165,165,199, 42,154,102,101,218,253,160,183,117,253, 27, 50, 31,
+166, 1, 24, 27,121, 7, 43, 31,220,189, 62,143, 33,224,219, 96, 93,164,207,121,114,231,109,232,243,249,124, 67, 64, 64, 64,137,
+163, 11, 69, 34,145,193,104, 44, 43,128,114,217,170,201,196, 86,160,195,246, 67,251,182,143, 61,114,236,232,210,246, 93, 6,120,
+136, 43, 85, 66, 53,111, 6,219,103, 55,153,126,254,174,226, 86,191, 47,174,108, 76,200, 48, 68,162,130,253, 97, 52, 26, 77, 44,
+128, 2,141, 70,211,159, 16,242,148, 97,152,192,130,130,130,123, 22,139,229, 65,133, 13, 1,139,145,173, 90, 53,255,141, 97, 24,
+ 30,177,178,203,175,243,185,187, 13,153,143,210,240,134,203,146,132, 84,115,198,167,223,172,109, 82, 51,168,118,147,226,181, 14,
+235, 87,117,194,228, 89, 43,155, 84,173, 94,171,201,159,235, 31,150,219, 77,128, 88,116, 5,227, 14,253,188,252,202,221, 27, 23,
+191,244,244,171, 90, 53, 43, 45,225,209,211, 39,247, 22,218, 12,170, 67,111,154,207, 73, 79,162, 87,111, 93, 49,107, 70,102,122,
+226, 86,157, 34, 46, 10, 0,116,138,184,168, 71, 17,248, 58, 55, 43,109, 70, 94, 78,194,138,215, 61, 23, 90,173, 54, 99,215,174,
+ 93,174,109,218,180,225,248,248,248, 64,161, 80,224,226,197,139, 44,203,178,233, 21,214,202, 79,188,168,205,103,220,127,253,233,
+135,229, 2,153, 83, 47,171,213,234, 79, 8,192,227,241, 50, 77, 58,213,105, 53, 71,246, 5, 10,146, 13,101, 63, 51, 88, 6, 0,
+167,120,237, 66,150,101,153,229,235,182, 39,243,197, 78, 37, 78,134,104, 49,168,165, 44,203, 58,188,214, 97, 97,106, 68,205,183,
+117,127, 51,132, 44,104,216,180,229,151, 22,139,217, 80,116,127, 24, 0, 24, 8, 65, 30,135,195, 92,230,178,150, 51,170, 55,168,
+ 76, 49, 12,156, 9,195,131,147,132, 7, 6, 12, 52,202,124, 82,145, 62, 89, 37, 26,226,156,216,104, 93, 78,135, 42,167, 76,251,
+198, 92, 56,123,114,168,205,102,171, 86, 20, 51, 72, 50,234,181,251, 53,153,110,191, 2,119,172,248,247,115,162,216,108, 49,127,
+241, 15, 57,212,140,242,191,164, 25, 92, 93,210,191, 82,128,207,152,164,228,156, 91, 9, 79,117,191,226,197,101,117,222, 36,157,
+ 92, 31, 31,159,175, 25,134, 25, 45, 20, 10,229, 38,147, 73, 75, 8,217,145,157,157,189, 16,175, 44,254,219,152, 47,241,214,143,
+ 17,138,165,115,205, 6,237, 31,186,156,216,145,229, 29,187,212,171,118,119,177, 76, 54,203,160,215,238,208,101,199,110,127,203,
+231,211, 69, 36, 18, 53,150,203,229,252,220,220,220,155, 0,148,255, 75,249,222,176, 97,195,202, 28, 14,167, 26,203,178, 62, 0,
+ 92, 96, 31, 21,146,203,227,241,210,139, 34, 90,164,162,154,109,223,223,239,217,165, 91,253, 79,195,175,196,172, 41,106, 86,124,
+ 70,192,144, 85,226,209,189, 58,125,254,235,161,163, 37,141, 58,252,199, 93,243,255,127,154, 29,120,114,191,220,177, 28,161,203,
+162, 46,193, 6, 93,110, 70,250,212,171, 15, 20, 55, 1,168,223, 36,157, 2,129, 96,148,217,108,150, 8, 4, 2,189,217,108,222,
+245,191,114,236, 18,239,224,241, 28, 16,135, 87,166, 96,193,220,121,105,208,202,191,229, 90,226,134,132,132,180, 19, 8, 4,149,
+109, 54,155,212,100, 50,233,244,122,125, 82,114,114,242, 31, 40,125,225,243,191, 52,157, 50,239, 90,171, 5, 2,209,199, 0, 96,
+ 54, 27,215,106,115,226, 62, 45,235,139,101,124,254, 31,157, 71,158,213,154,198,241,184,124, 47, 20, 77,204,205, 90,173,138,236,
+196,219,181,254,198,116, 82, 94, 51,115,169, 38,213,164,154, 84,243,101, 56,244,124, 82,205,191, 83, 83,236, 87, 55, 80,236, 87,
+215,225, 73,151, 75,249, 60, 61,159,148, 98, 38,149,240, 2,224,192,132,165, 20, 10,133,242, 23,192,210, 83, 64,249, 59, 49,100,
+ 62,122,250, 87,126,158,242,159,163,212, 62,209, 76, 25,174,180, 34, 33,193,215,113,182,231,168, 38,213,164,154, 84,147,106, 82,
+ 77,170,249,159,211, 44, 79,251,159,216, 36, 57,233,165,237, 19, 0,254, 95, 58,252,211,176, 42,213,164,154, 84,147,106, 82, 77,
+170, 73, 53,255,107, 60, 51, 94, 28,122, 46, 40, 20, 10,133, 66,161, 80,254, 26,104, 31, 45, 10,133, 66,161, 80, 40,148, 55,163,
+164,166, 67,106,180, 40, 20, 10,133, 66,161, 80,222, 2,165,118,134,167, 77,135, 20, 10,133, 66,161, 80, 40,111, 70,113, 68,203,
+ 15, 47, 77,239, 64,141, 22,133, 66,161, 80, 40, 20,202,219, 33, 19, 37, 69,183,194,194,194, 72, 73,127, 83, 40, 20, 10,133, 66,
+161,252,127,240, 15,247, 34,207, 71,178, 38, 21,109, 3,120, 46,162, 69, 13, 22,133, 66,161, 80, 40,148,255, 21,179,245, 15,163,
+ 56,146, 85,252,202,124,197,104,245,233,211,135,161,102,139, 66,161, 80, 40, 20,202,223,197,191,209,139,112, 94, 62, 64,154,205,
+ 20, 10,133, 66,161, 80,254, 78,179,245,111, 58, 30, 58,189, 3,133, 66,161, 80, 40, 20,202,155,225, 7,160,247,115,219,255,111,
+ 75,240, 80, 40, 20, 10,133, 66,161,252,219,153, 84,218, 54,141,104, 81, 40, 20, 10,133, 66,161,188,125,179, 69,161, 80, 40, 20,
+ 10,133, 66,249, 39, 67, 87, 54,167,154, 84,147,106, 82, 77,170, 73, 53,169,230,191,157,226,121,180,128,210,230,209,162, 80, 40,
+ 20, 10,133, 66,161,188, 22,189, 97,159, 63,107, 82,209,123,111,106,180, 40, 20, 10,133, 66,161, 80,222, 46,175, 44,191, 67,141,
+ 22,133, 66,161, 80, 40, 20,202,219, 53, 88,155,169,209,162, 80, 40, 20, 10,133, 66,249,139,161, 70,139, 66,161, 80, 40, 20, 10,
+229, 47,130, 65,233, 35, 7,206, 85, 64,231,117, 70, 31,156,163,154, 84,147,106, 82, 77,170, 73, 53,169,230,127, 78,179, 60,237,
+115,248,231, 81, 60, 51,252, 9,252,217, 17,126,243,255,199, 15,211,161,175, 84,147,106, 82, 77,170, 73, 53,169, 38,213,252,183,
+ 51,233,165,247,103,208,166, 67, 10,133, 66,161, 80, 40,148,183,107,182,232, 18, 60, 20, 10,133, 66,161, 80, 40,111,137, 82,155,
+ 9,105, 68,139, 66,161, 80, 40, 20, 10,229,205, 40,117, 81,105,106,180, 40, 20, 10,133, 66,161, 80,254, 26,195, 69,141, 22,133,
+ 66,161, 80, 40, 20,202, 91, 52, 89,147, 74,252,111, 88, 88, 24,161,231,136, 66,161, 80, 40, 20,202,223,197,191,214,139, 20, 31,
+ 24, 53, 91, 20, 10,133, 66,161, 80,168, 23,169, 48,126,248,115,180,225,164,162,109, 0,116,212, 33,133, 66,161, 80, 40, 20,202,
+155,210, 27, 47,142, 60,156, 84,188, 77,141, 22,133, 66,161, 80, 40, 20,202,155, 51,169,204,255,210,102, 67, 10,133, 66,161, 80,
+ 40,127, 39,255, 70, 47,194,208,108,165, 80, 40, 20, 10,133, 66,121, 35, 74,138,102,109,166,167,133, 66,161, 80, 40, 20, 10,229,
+175, 53, 92, 20, 10,133, 66,161, 80, 40,148,191,194,100,253,213, 19,150,210,149,205,169, 38,213,164,154, 84,147,106, 82, 77,170,
+249, 95, 49, 89,207, 79,241, 0,128,142, 58,164, 80, 40, 20, 10,133, 66,121, 83,232,162,210, 20, 10,133, 66,161, 80, 40,127, 17,
+116, 81,105, 10,133, 66,161, 80, 40,148,255,103,195, 69,141, 22,133, 66,161, 80, 40, 20,202, 91, 52, 89, 47,152, 45,218, 71,139,
+ 66,161, 80, 40, 20, 10,229,205, 40,181,143, 22,131,210, 71, 14,156,171,192, 15,188,206,232,131,115, 84,147,106, 82, 77,170, 73,
+ 53,169, 38,213,252,207,105,150,167,125, 14,255,124, 38,225,255,105,194, 82, 58,244,149,106, 82, 77,170, 73, 53,169, 38,213,164,
+154,255, 53,232,244, 14, 20, 10,133, 66,161, 80, 40,111,219, 88,189, 12, 53, 90, 20, 10,133, 66,161, 80, 40,111, 6,157, 71,139,
+ 66,161, 80, 40, 20, 10,229, 47,194, 15,246,168, 86,241,123, 99,106,180, 40, 20, 10,133, 66,161, 80,222, 14,189, 97,143,106, 21,
+191, 83,163, 69,161, 80, 40, 20, 10,133,242, 22, 41,113, 30, 45, 6, 0,194,194,194, 72,209,118,199, 62,125,250, 92,166,231,138,
+ 66,161, 80, 40, 20,202,255, 39,255, 86, 47,242, 44,162,213,167, 79, 31, 6,192, 37,154,213, 20, 10,133, 66,161, 80,254, 14,254,
+141, 94,132,243,146,147,236, 72,179,153, 66,161, 80, 40, 20,202,223,193,191,209,139,240, 94,114,145, 20, 10,133, 66,161, 80, 40,
+127, 11,255, 96, 47,226, 7,123, 71,248, 19, 69,239, 64,209,148, 15,116, 30, 45, 10,133, 66,161, 80, 40,148, 55,163,120,180,225,
+ 43, 75,239,208, 40, 22,133, 66,161, 80, 40, 20,202,155, 81,210,204,240,155,233,105,161, 80, 40, 20, 10,133, 66,249, 11,161, 17,
+ 45, 10,133, 66,161, 80, 40,148, 55,231,249,168,214,255, 91, 52,139,174,108, 78, 53,169, 38,213,164,154, 84,147,106, 82,205,255,
+146,201,122, 97,155,206, 12, 79,161, 80, 40, 20, 10,133,242, 23, 65, 71, 29, 82, 40, 20, 10,133, 66,161,188, 25,197, 35, 14,159,
+223,166, 70,139, 66,161, 80, 40, 20, 10,229, 45,154,173, 87,160, 77,135, 20, 10,133, 66,161, 80, 40,111,198,164,210,254, 65,141,
+ 22,133, 66,161, 80, 40, 20,202, 95,100,184, 24,148, 62,114,224, 92, 5,132, 95,103,244,193, 57,170, 73, 53,169, 38,213,164,154,
+ 84,147,106,254,231, 52,203,211, 62,135,127, 30,127,219,132,165,116,232, 43,213,164,154, 84,147,106, 82, 77,170, 73, 53,255,179,
+208,166, 67, 10,133, 66,161, 80, 40,148,255, 1,163,229,197,227,241,190,148, 72, 36, 27, 37, 18,201, 79, 60, 30,111, 5, 0,183,
+138,254,160, 76, 38,155,238,235,235,251,216,215,215, 55,173,114,229,202, 39,157,156,164,159,212, 16,161, 61, 0,254, 91, 58,158,
+ 96, 0,159, 72, 36,146, 71, 98,177, 56, 25,192, 78, 0,159, 0,240,124, 19,225,133,254, 24, 28,245,113,255, 35, 11,253, 49,248,
+165,127,245,246,241,241,185, 10,160,251,219,202,148,225, 82,116, 29, 34, 67,234, 16, 25, 82,135, 75, 95,191,214,224,228,228, 52,
+218,207,207,239,186,135,135, 71,186,159,159,223, 53,177, 88, 60,164,130, 18,222, 62, 62, 62,223, 7, 6, 6,198,250,251,251,175,
+129,125,117,242,255, 89,218,137,208,174,165, 8,138, 86, 66,168,219, 8,177,177,149, 16,221,186, 1,210,215,148,107, 11,224,128,
+179,179,243, 61, 30,143, 23, 6, 96, 80,209,245, 53,136,199,227,133, 57, 59, 59,223, 3,112,160,232,115,175,115,157,126, 15, 32,
+ 29,192,146,162,237,143, 2, 3, 3,213,161,161,161,201,161,161,161,191, 4, 5, 5,189,231,168,152, 84, 42,237, 22, 24, 24,120,
+176,114,229,202,201,173, 90,181,202, 15, 8, 8,136,169, 84,169,210,118,145, 72,212,145, 22,113, 20, 10,133,242,191, 79, 95, 0,
+ 75, 1,172,143,140,140,140, 32,132, 68, 16, 66, 34, 34, 35, 35, 35, 0,108, 4,176, 12,165,135, 16, 95,216,239,225,225,177, 96,
+209,162, 69,134,204,204, 76,162, 80, 40, 72,108,108, 44, 89, 61,119, 22,219,195,157, 71,106,120,185,233,252,252,252,226,171, 84,
+170,180,167,190,156, 51, 11, 64, 77, 71, 52,159,195, 77, 34,145,220,156, 59,119,174,230,234,213,171, 26,147,201,164, 97, 89, 86,
+147,145,145,161, 57,119,238,156,166, 77,155, 54, 26, 0,159, 2,224, 86, 64,243, 25,223,250,227, 50,249,249,107,242,173, 63, 46,
+ 63,191,191, 78,157, 58, 15, 89,150, 37,131, 7, 15, 54, 2, 8,168,136,230,203, 4, 0,226,250,206,112, 29, 34, 71,182,117,251,
+ 66, 66, 54,204, 32, 67,100, 72,125, 29, 77,111,111,239,163,211,167, 79, 87,165,167,167, 19,163,209, 72, 82, 83, 83,201,228,201,
+147,149,222,222,222,187, 28, 60,118,143,144,144,144,236,235,215,175,179,133,133,133,228,210,165, 75,108,131, 6, 13,178, 29, 52,
+ 91, 93, 95, 74,203,102,127,127,255,147, 21,121,121,123,123,111,173,104, 30,181, 16, 33,213, 28,113,145,144,219,225,228,216,224,
+ 86,100,117,211, 74,100,144,187,176,176,173, 16, 31,117, 40,121, 42,147,210, 52,135,118,232,208, 65,251,224,193, 3, 91, 94, 94,
+ 30,121,248,240, 33, 59,113,226, 68, 3,128,232,137, 19, 39, 26, 30, 62,124,200,230,229,229,145, 7, 15, 30,216, 58,116,232,160,
+ 5, 48,161, 2,233,228, 0,216, 54,127,254,124, 66, 8, 33,139, 22, 45, 34,161,161,161,164,115,231,206, 68,163,209, 16, 66, 72,
+ 50, 33,228, 23,171,213, 58,214, 17, 77, 23, 23,151,209,211,167, 79,215,232,116, 58, 82, 12,203,178,164,176,176,144,172, 95,191,
+ 94,235,235,235,123,178,148, 74, 6,109,242,160,154, 84,147,106,254,175,105,254,147,241,131,189,159, 86,241,203,225,192,196,136,
+ 89,179,102, 21,155,170, 83,109,219,182,189, 53,118,236,216,136,177, 99,199, 70,180,109,219,246, 18,128, 51,119,238,220,137,152,
+ 57,115,102, 4,128, 17,229,100,132, 91,235,214,173, 11,179,178,178, 72,173, 90,181, 72,213,170, 85, 73, 86, 86, 22, 33,132,144,
+219, 67,155,144,243,117, 65,158, 94, 57, 69,194, 15, 31, 32, 19,253,120,164,157,159,139,197,207,215, 55,207,211,211,115, 49, 94,
+ 92,147,177,164,204, 29, 88,183,110, 93,117,116,116,180, 38, 46, 46, 78,179, 96,193, 2, 77,231,206,157, 53, 33, 33, 33,154, 65,
+131, 6,105,214,173, 91,167, 49,155,205,154,173, 91,183,106,156,157,157,163, 75, 48, 91,175,109,180,120, 60,222,218,200,200, 72,
+ 18, 31, 31, 79,138,162, 20,165,105,186,184,186,186,246,116,115,115,251,212,213,213,181, 39, 0, 23, 0,168, 5,200, 27,186,160,
+242, 71, 13,107,212, 9, 27,209,181,230,250,174,205,154, 12,113,226, 20, 90,126,152, 65,200,224,202,175,101,180, 92, 92, 92, 70,
+127,242,201, 39,106,163,209, 72,116, 58, 29,209,104, 52, 68,167,211, 17,181, 90, 77, 70,140, 24,161, 18,139,197, 3,203,211,244,
+244,244, 92,120,229,202, 21,107, 86, 86, 22,185,114,229, 10, 57,121,242, 36,217,176, 97, 3,235,237,237,189,170,162, 55,160,175,
+175,239,217,240,240,240,136,187,119,239, 70,220,188,121, 51,194, 98,177, 68,152,205,230, 8,179,217, 28, 17, 22, 22, 22,113,232,
+208,161,136,189,123,247, 70,152, 76,166, 8,147,201, 20, 97, 52, 26, 35,170, 87,175,126,186,162,121,212, 92,132,167,166,171,199,
+ 8, 89,245, 33, 81,126, 55,149, 20,126,214,139,228, 76,110, 79, 54, 54,171, 68,218, 75,112, 28,175,174,237, 89,162, 38,159,207,
+191,156,156,156,204,206,153, 51,199, 84,175, 94, 61,229,184,113,227, 12, 70,163,145, 16, 66,136,209,104, 36,227,198,141, 51,212,
+171, 87, 79, 57,103,206, 28, 83, 82, 82, 18,203,227,241,206, 85, 32,157,203,138, 77,214,229,203,151,201,243,104, 52, 26,210,185,
+115,231,228,208,208,208, 95,170, 85,171, 54,178, 60, 77,185, 92,222,127,246,236,217, 26, 82, 2, 22,139,133,168,213,106,146,148,
+148,196, 86,173, 90, 53, 3,128, 7, 45,204,169, 38,213,164,154,212,104,253,101, 76, 42,103,187,228,147, 56,115,230,204, 8, 66,
+ 72,196, 87, 95,125, 21, 81, 20,217, 18, 0,144, 23,189,120, 0,134,207,158, 61, 59,130, 16, 18, 49,107,214,172,226,207,148,150,
+ 17,125,247,239,223,111, 94,179,102, 13,241,241,241, 33,190,190,190,100,237,218,181,132,101, 89,146, 21,182,139,156,175, 11,242,
+232,203, 49,132, 16, 66, 98, 23, 79, 35,231,235,130, 36,108,250,150,140, 26, 53, 74, 39,149, 74, 71,148,145,185,238, 77,154, 52,
+ 81,235,245,122,205,246,237,219, 53, 82,169,244, 54,128,122,176, 55, 69, 50, 69,105,125,175, 94,189,122,170,168,168, 40,205,238,
+221,187, 53, 0, 22, 56,120,193,212, 4,208, 73, 38,147, 13,154, 29,192,143, 35, 63,127, 77,102,251,224, 1,128, 6, 0,188,138,
+ 62,227, 63,107,214, 44, 66, 8, 33,129,129,129, 87, 74,209,116, 9, 9, 9,153, 21, 23, 23, 55,207, 98,177,204,187,123,247,238,
+188,218,181,107,207,233, 87,221,175,213,145, 17,221, 26, 43,191,157,218,152,172,252, 44,100,197, 59,205,187,238, 25,214,113,196,
+251,213, 60,175,142,243, 22,235,222,117,225,170, 95,106, 58,116,232,194, 14, 8, 8,184,153,154,154,250,204, 92,169,213,106,146,
+158,158, 78, 18, 19, 19,201,213,171, 87,137,159,159,223,249,242, 52,125,125,125, 31,166,166,166,146, 77,171, 87,147,193, 13,234,
+144,246,174, 78,164,131,155, 19,105, 42, 23,107,235, 2, 77, 43,106,180,238,221,187, 23, 1, 32, 2, 64, 68, 94, 94, 94, 68, 94,
+ 94, 94, 68, 65, 65,193,179,125, 0, 34,148, 74,101,132, 82,169,140, 48,153, 76, 17, 53,106,212,168,176,209,106, 35, 70,155, 22,
+ 98,228,183, 18, 65,223, 55,192, 51, 99,106,117, 79,219,141, 17,173, 72,193,135,157,201,154,198, 1,164,173, 16, 31, 57,168,217,
+ 87, 40, 20, 94, 2, 48,163,200,148,143,233,217,179,167,142, 16, 66,122,246,236,169, 3, 48,166,104,255, 39, 69, 38,171,167,131,
+233,228, 4, 5, 5,105,139, 35, 89, 0,254, 8, 10, 10,210,134,134,134,146,208,208, 80, 18, 24, 24,168, 46,210,118,168, 64,171,
+ 89,179,102,172, 94,175,127,102, 0, 11, 11, 11, 73, 70, 70, 6, 73, 72, 72, 32,209,209,209,228,246,237,219, 36, 57, 57,153,236,
+219,183,207,230,234,234,122,130, 22,230, 84,147,106, 82, 77,106,180,254, 82,163,245,242,235, 69,194,194,194,200, 75,187,190,187,
+115,231, 78,196,236,217,179, 35,202,113,102,147,190,250,234,171,226,168,215,210, 50, 30,254, 91, 99, 99, 99,201,152, 49, 99, 72,
+112,112, 48, 9, 14, 14, 38, 99,199,142, 37, 74,165,146,104,158, 68,145,243,117, 65,110,191,219,148, 16, 66,136,250,209, 93,114,
+190, 46, 72,196,168,214,228,254,253,251,164, 82,165, 74,225,101,252,254,241,107,215,174, 41,118,237,218,149, 5,123,127, 44, 62,
+128,150, 0,214, 74, 36,146,109,176, 55, 23, 86, 5,224, 86,171, 86,173,124,157, 78,167, 25, 60,120,176, 6, 64,229, 50, 52, 59,
+ 4, 7, 7,199,111,221,186,149,228,228,228,144,252,252,124,178,188, 77,109, 66,126,254,154, 44,106, 90,149,221,180,105,147,113,
+198,140, 25, 90,119,119,247, 48, 0,254,131, 7, 15,182, 18, 66, 72,251,246,237,179, 75, 18,115,117,117,237, 25, 23, 23, 55,207,
+ 96, 48,204, 43, 44, 44,156,151,159,159, 63,239,216,145, 35,243,122, 52,168, 61, 70,249,237,212,198, 71, 70,116,107,252, 78,128,
+219,160, 85,221,155, 77, 73,159, 51, 97,240, 87,173,235, 61, 50, 44,251,248,226,208,234, 62,223,191, 78,110,123,121,121,101, 26,
+141, 70, 2,224,149, 87,124,124, 60,241,240,240, 72, 45, 79,195,221,221,253,171, 79,134, 15,179, 13,172, 26, 64,226,215,204, 37,
+150,179,187,137,229,228,118,242,228,187,207, 72, 63, 95, 79, 85, 75, 1,103,182,163,233,241,245,245, 61,123,243,230,205, 23,140,
+ 86, 65, 65, 65,137, 70, 75,165, 82, 69,152, 76,166,136,160,160,160,211,111,122,213,183, 20,162, 70, 7, 9,247,246,221, 49,237,
+136, 98,106,103,210,211,133,159,252, 6,114,195, 1, 92, 2, 48,170,130,223,227, 0, 88, 86,108,168,190,251,238, 59, 66, 8, 33,
+ 65, 65, 65, 90,188,217, 96, 20,151, 58,117,234, 36, 78,152, 48,193, 90,183,110,221,156, 54,109,218, 20,222,186,117,139, 92,190,
+124,153,156, 60,121,146, 28, 56,112,128, 68, 69, 69,145,244,244,116, 18, 27, 27, 75,122,247,238, 93, 8,160, 3, 45, 11, 41, 20,
+202,255, 50, 37,120,145,127, 60,156,226, 3,235,211,167, 15,243,220, 1,186, 0, 16, 55,109,218, 84,177,108,217,178,149,176,207,
+ 5,193,132,112, 49,180,179,132,119,191,179,132,119, 63,132,139,161, 69, 17,163,205,139, 23, 47, 94, 24, 26, 26,154, 9, 64, 2,
+192,183,164, 31, 34,132,180,243,240,240, 64,106,106, 42, 92, 92, 92,224,226,226,130,212,212, 84, 16, 66, 96, 37,128,133, 0, 70,
+179, 25,122,189, 30, 6,150, 64,207, 2, 42,141, 6,190,190,190, 48,155,205, 53, 74, 73,127,195,119,223,125,183, 70, 72, 72,136,
+ 98,230,204,153, 25,176,247,149,217, 54,126,252,248,179,127,252,241, 71,136, 70,163,201,143,142,142, 54, 52,104,208,160, 39, 0,
+223,184,184,184,209,235,215,175,199,152, 49, 99, 80,198, 67,167, 65,239,222,189, 79, 70, 69, 69,213, 24, 53,106, 20, 46, 93,186,
+132,229,203,151, 35, 55, 55,151, 0,128,209,104, 36, 54,155,205,220,186,117,107,243,154, 53,107,154,183,111,223,254,102,245,234,
+213,185, 0,144,152,152,248,164, 36, 65,134, 97,106, 87,169, 82, 5, 70,163, 17, 10,133, 2, 81, 81, 81,112,114,113, 65,100, 70,
+174, 79,199, 85,155,242,190, 60,114,150, 63,188,121,136,251,167,221,218, 24,151,132, 95,170, 85,207,223,199,199,100,182,248,198,
+102,102,103,188, 78,166, 10, 4,130,212,220,220, 92,152, 76, 38,232,245,122,168, 84, 42,228,229,229, 33, 55, 55, 23, 25, 25, 25,
+ 16, 8, 4,241,229,105, 56,231,231, 95, 73,188,118,153,217,247,227,119,168, 97,205, 7,239,224, 90,240,142,110, 68, 77,147, 2,
+ 63,205,157,236,100,242,240,154,239,236,228, 84,224,234,234,186, 25, 64, 80,121,122,141, 27, 55, 70, 94, 94, 30,242,242,242,224,
+225,225, 1, 55, 55, 55,184,185,185,161,176,176, 16, 74,165, 18, 42,149, 10,181,106,213, 66,195,134, 13,177, 99,199,142,183,114,
+113,223, 48, 33,193, 10,219,212,179, 49, 25, 16,200,100,168,238, 38,175,210, 76, 14,247, 50,190,210,153,207,231,239,119,119,119,
+ 15, 7,240, 33, 0, 25,128, 15,221,221,221,195,249,124,254, 0, 0,139, 0,236,170, 96, 50,150,204,159, 63,127, 86, 92, 92,156,
+244,254,253,251,152, 57,115, 38, 22, 44, 88,128, 39, 79,158,252, 0,128, 45,250,204, 7, 30, 30, 30, 97, 28, 14,103, 11,128, 94,
+ 0,122,250,249,249,117, 41, 71,119,192,140, 25, 51, 12, 77,154, 52,137,125,244,232,209,128,107,215,174, 53,253,236,179,207,148,
+ 41, 41, 41,136,141,141,133,159,159, 31, 2, 3, 3,161,209,104, 80, 80, 80,128, 1, 3, 6,184, 56, 59, 59,143,160,197, 56,133,
+ 66,249, 95, 54, 89, 47,121,145,127, 90, 68,171,196,237, 18,107,212, 82,169,116,126, 68, 68, 68,171,208,208, 80, 30,128,125, 0,
+ 16,194,197,144, 1,173, 27,109, 59,178,249,187,208, 67,107,230,134,246, 8,173,181, 45,132,139,226, 81,108, 97, 77,155, 54,117,
+139,136,136,104, 45, 18,137, 62, 42, 37, 17, 4, 0,220,220,220,224,226,226, 2, 87, 87, 87,184,185,185,129,101, 89,104,116, 6,
+104,109,128,218, 96,130, 82,169,132,186,104, 91, 99, 52, 67,171,213, 62,251,110, 9,116,156, 48, 97,130, 98,253,250,245, 57,153,
+153,153,223, 1,104, 48,102,204,152,254,235,214,173,195,133, 11, 23, 12,189,130,107,122, 44,110,215,104, 97,189,204, 39,243,130,
+249,152, 8,224,202,149, 43, 87,208,186,117,107, 48, 12, 51,172, 36, 65,137, 68,178,113,207,158, 61,146,232,232,104,212,172, 89,
+ 51,122,216,176, 97, 67,191,251,238,187, 26, 50, 77,254,239, 0, 96,205,203,138,158, 54,109,218,215,139, 23, 47, 86, 40, 20, 10,
+179, 78,167,251, 63,246,190, 59, 44,138,171,125,251,158,237,203,238,210,219,210, 85,138, 96, 65,197,222,176,183,136,157,216, 53,
+246, 88,162,209, 24, 99, 11,197,168,177, 68,141, 26, 19, 77,108, 17,141, 5, 81, 17, 99,195,222, 21, 80, 84, 4, 65,144, 38,101,
+105,203, 22,182,176,229,124,127, 32, 4, 13,213,188,239,239,123,147,204,125, 93,123, 45,236,156,185,231,156,153,115,102,238,121,
+206,115,158,199,110,248,240,225,200,204,204,196,155, 55,111,238,214, 34, 50, 95,198,197,197,145,210,210, 82,164,166,166, 34, 46,
+ 46,206,228,235,175,191,238,100, 96, 48, 70,100,195,116,218,212,238, 29, 58, 77,234,210, 14,135,239, 61,225,220, 74, 74,179,232,
+208,196,201,242,113, 86,110, 83, 29,133, 87, 31,114,181,229,114,249,246,111,190,249, 70,161, 80, 40,144,157,157,141,167, 79,159,
+226,197,139, 23, 72, 79, 79,199,166, 77,155, 20,197,197,197, 59,234,227,112,228,179,190,216,188,100, 6,197, 74,184, 11, 60,185,
+ 1,148,201, 1,149, 2,154,196, 88, 28, 72,204,195,174,147,167,184, 25,153,153, 22,199,142, 29,155,233,234,234, 26, 11,192,171,
+ 46, 62, 66, 42, 46, 33,131,193,120, 95,132,130,193, 96,200, 1,228, 9,133,194, 44, 83, 83,211, 44, 6,131,145, 71, 8, 81,254,
+ 71,222, 36,244, 40, 7,147, 9,112, 77,192, 96,215,153,218,243,227,113,227,198, 29,205,202,202, 26,148,154,154,218,117,199,142,
+ 29,223,240,249,252,248, 29, 59,118,124,147,154,154,218, 53, 43, 43,107,208,184,113,227,142, 2,152,210,152,227,123,122,122, 46,
+ 8, 14, 14,198,166, 77,155,208,182,109, 91,120,121,121,149,133,132,132,108, 7,176, 26,192,103,158,158,158,183, 23, 44, 88, 48,
+ 93, 34,145,136,179,179,179,219,254,240,195, 15,115,182,111,223,222, 49, 39, 39,135, 95, 15,117,143,129, 3, 7,226,252,249,243,
+ 0,144, 11, 32,181,168,168, 72,159,147,147, 3, 31, 31, 31,116,234,212, 9, 10,133, 2, 10,133, 2, 82,169, 20,110,110,110, 48,
+ 26,141, 93,233, 91, 57, 13, 26, 52,104,252,159, 10,174,154,133, 22,159,207,183,244,243,243, 67,179,102,205, 44,241,118,181,150,
+ 53,151,181, 98,241,204,241, 2, 81,236, 5, 80,113, 87, 48,174,103, 43,129, 53,151,181,226,237, 46, 44, 55, 55, 55,158,159,159,
+ 31,132, 66,161, 83, 45, 7,191,158,151,151, 7, 63, 63, 63, 88, 88, 88,192,220,220, 28,126,126,126, 40, 47, 47, 71,169, 92, 14,
+165, 1, 40,211, 25, 81, 90, 90,138,226,130,124,148, 25, 0,189,169, 53,210,211,211,193,100, 50,211,106,225,116,240,240,240, 40,
+136,143,143, 47, 0,112, 19,192,167,161,161,161, 88,190,124, 57,130,130,130,142, 10,114, 95, 15, 60,122,254,140,245,145,144,121,
+182, 94, 92,106, 60,128,242,172,172, 44, 88, 88, 88, 64, 40, 20,214, 40, 12,252,253,253,219, 11,133, 66, 28, 60,120,144,100,103,
+103,119, 71,197, 18,254, 52,138,170, 16,123, 38, 12,148, 2,216, 30, 27, 27,219,249,235,175,191, 78,234,223,191, 63,187, 75,151,
+ 46, 88,187,118, 45, 0, 68,213,196, 41,149, 74,239, 79,153, 50, 69,123,237,218, 53, 36, 38, 38, 10, 79,159, 62, 29,184,118,237,
+218, 86, 25, 25, 25,188,179,191, 95, 24, 18,150, 37, 11,220,120,233, 22,127,221,197,235,247,109,204,132, 45,155,218, 88, 33, 46,
+227, 13,199,192,196,195,250,174,104,103, 54,115,102,111, 62, 43,174, 39,143,145,219,155,207, 66,159, 74, 59, 0, 0, 32, 0, 73,
+ 68, 65, 84,138,237,200,102,206,144,203,229,199, 34, 35, 35, 47, 46, 89,178, 68, 33,145, 72, 96,106,106,138,162,162, 34,172, 95,
+191, 94, 17, 23, 23,119, 82,171,213,158,173,143,215, 96, 36,237, 93,154,184, 2,175,226,171,126, 43, 55, 18, 60,212,114, 16,240,
+233, 34,120,251,248, 64,171,213,162,117,235,214, 84,104,104,168,208,220,220,252,203,122, 69, 15,227, 79,221, 77, 79, 81, 84, 30,
+ 33,228,141, 66,161,200, 54, 49, 49,201,224,112, 56, 25,197,197,197,217,132,144,252,255,132,206, 34, 12,124,209,173,181, 39,192,
+ 51, 65, 70,145, 34,231,145, 2,197, 53, 21, 52, 53, 53,157,177,107,215, 46,254,190,125,251,116, 11, 22, 44,208,204,153, 51,135,
+173, 82,169,236,230,204,153,195, 94,176, 96,129,102,223,190,125,186, 93,187,118,241, 69, 34,209,232, 15,169,136, 78,167, 67,124,
+124,252,198,148,148, 20, 33, 42,194,141, 44, 10, 9, 9,153,154,156,156,204,223,185,115, 39,194,195,195, 17, 30, 30,142, 17, 35,
+ 70, 96,225,194,133, 8, 14, 14,174,139, 78,208,166, 77, 27, 63,107,107,107,220,184,113, 35, 7, 64, 6,128,246, 34,145,200,116,
+196,136, 17, 24, 52,104, 16,212,106, 53,202,203,203,171,132, 22,147,201,132,133,133,133, 53,125, 15,164, 65,131, 6,141,255,186,
+200,122, 71,108,177, 0,160,210, 84, 23, 16, 16, 64,213,245, 96, 52,148, 72, 32, 85,150, 33,189,180, 12,153, 37,198,119,182, 25,
+141,198, 58,143,158,147,147,115,246,222,189,123, 51,252,252,252, 88, 57, 57, 21, 51, 98,126,126,126, 40, 43, 43, 67,206,147, 7,
+ 80, 26, 1,161,135, 47,148, 74, 37, 74, 94, 60,134,168, 77, 87, 88, 15,157,132,173, 59,119,106,138,138,138,118,215,196,201,229,
+114,217,206,206,206, 5,105,105,105,122, 0,197,230,230,230, 3, 93, 93, 93,113,253,250,117, 0, 56, 76,128,205,136,187, 6,220,
+136, 0,169, 48,169,136,220,220,220, 32,145, 72,160, 80, 40,174,215,196,121,239,222,189,100,157, 78,215,122,248,240,225,212,175,
+191,254,122, 92, 38,147, 5, 1,120,170, 49,130,249, 36, 43, 31, 74, 3,248, 0, 6, 88, 90, 90,126, 30, 28, 28,220,111,193,130,
+ 5,136,140,140,196,165, 75,151,202, 81,225, 11,118,175, 6,218,210,212,212,212, 61, 75,151, 46,237,194, 96, 48, 62,189,124,249,
+178,222,203,203, 75, 86, 94, 94,110,104,238,237,205, 8, 10, 93,195,153,255,233,108,139,162, 50, 36, 12,106,238,208,141,162,128,
+132, 55,146,140, 20, 5,138,234, 58,167,254, 92,102,212,200,238,109,252,103,140, 27, 38, 18,122,180,132,242,217, 3,241,158, 19,
+191,111, 53,137, 75, 14,184, 33,145,140,136,140,140, 12,188,126,253,250,124,173, 86,219,140,199,227,189,146, 74,165,223, 43, 20,
+138,122, 69, 22,147,201, 28,170,113,112,182,148, 22, 23,131,255,214, 18, 37,211, 25, 81,168,209, 35,209,194, 11, 19,156, 93,170,
+166, 65,243,242,242, 32, 22,139, 41,131,193, 48,172, 46,206, 75,151, 46, 33, 32, 32,160, 82,120,130,162, 40, 80, 20, 85,232,237,
+237,157,207,227,241,138, 56, 28,142,108,243,230,205,106,181, 90, 13, 22,139,197, 55, 24, 12,204,191,210,219, 59, 9, 96,199, 35,
+212,143,115,134,247,233,223,182,165, 15,185,249,232, 9, 85, 82,166, 62, 80,135, 21,240, 7, 79, 79, 79, 86,113,113,241, 89, 0,
+137, 58,157,238,200,241,227,199,249,147, 39, 79, 86,159, 56,113, 98, 34, 0,247, 45, 91,182, 4, 42, 20,138, 70,165, 84, 72, 73,
+ 73,249, 97,221,186,117, 95,173, 90,181, 10,135, 14, 29, 90,144,146,146,178,252,173,165,107, 68,112,112, 48, 54,111,222,140, 67,
+135, 14, 25, 19, 19, 19,127, 55, 26,141, 41, 75,150, 44,105, 99,111,111, 95,152,155,155,155, 82, 7,109,135,193,131, 7,107,110,
+223,190,205,149,203,229,183, 0,124, 62,119,238,220,153,157, 59,119,150,141, 27, 55, 78, 84, 92, 92, 44, 21, 8, 4,220,189,123,
+247, 90,178, 88, 44, 40,149, 74, 80, 20, 5,185, 92,174,165,239,131, 52,104,208,248, 95, 69,109, 90,228,111,130, 90,159, 13,172,
+154, 26, 88, 86, 86,150,159,153,153,233,243,230,205, 27, 61, 0, 61, 0, 20,105,245,223,174,219, 27,177,111,116, 23, 79, 97,174,
+ 78,135,211,143,158,151, 21,105,245,149,206,239,250, 55,111,222,200, 51, 50, 50, 76, 85, 42,149,162,150, 99,221,253,241,199, 31,
+ 85,215,174, 93, 51, 77, 77, 77,133,193, 96, 64,251,246,237,241,242,229, 75,148, 36,198, 67,232,211, 30,194, 94, 1,120, 30,251,
+ 8,113,151,162,241, 90,161,213, 39,173, 94, 87,170, 80, 42,131,203,203,203, 79,215, 68,200,102,179,139, 1, 16, 66,136, 1, 0,
+100, 50,217, 83,133, 66,209,211,222,222, 30, 9, 9, 9, 66,165, 1, 11, 3, 87,108,221, 65, 8, 49,112, 42, 86,115, 45, 30, 55,
+110, 28, 98, 98, 98, 0, 32,166, 38, 78,153, 76,182, 96,214,172, 89,215, 14, 30, 60,200, 74, 77, 77, 29,180,111,223,190, 65, 73,
+ 73, 73,132, 42,206, 52,220, 46, 99,195,125,234,194,142, 63,185,121, 95, 10, 8, 8,128,131,131, 3,246,238,221,139,239,191,255,
+ 94, 55,111,222,188,228,239,191,255,190,163, 68, 34, 57, 82, 75,251, 75,165, 82,233, 5,107,107,235,249,173, 90,181,146, 43,149,
+ 74, 20, 21, 21, 33, 39, 39, 7, 86,214,214, 12, 61, 24,221,108, 45, 44,142,156,205,147, 11, 89, 23,238,227, 65,118,110,157,214,
+172, 46,108,230,148,209,254,237,252, 63, 91,181, 66,132,219,167, 65,205, 10, 6,217,247, 13, 22,125, 18,104,170,214, 28,233,165,
+124,146, 62, 57, 86, 38, 11,147,201,100,225,141,236, 44,131,187,117,235,118,116,221,186,117, 38, 43, 55,173,195, 22, 31, 39,232,
+139,138, 80,160, 49,160, 80,163,135,172, 36, 17, 9, 9,207, 97,109,109,131,215,175, 95, 67,173, 86,227,197,139, 23,132,201,100,
+158,173,207,162, 83,137,106,211,133, 82, 30,143, 87,196,102,179,243, 89, 44, 86,113,106,106,170, 82,173, 86,131,193, 96, 8, 13,
+ 6,131, 73, 3,234,234,108, 99, 99,179, 4, 21,193, 68, 35,229,133,133,219,253,216,176, 0, 11,189,221,108,172,135,172,158, 51,
+217,198,213,209, 78,154,154,252, 74,183,251,226,157, 66,181,166,246,197, 26, 0,162,138,139,139,171, 44,146, 39, 78,156, 88,116,
+226,196,137,153, 0,246,163, 34,239, 86,180, 84, 42,253,233, 3, 6,223,234,147, 39, 79,126,181,106,213, 42,152,152,152, 84, 5,
+ 79, 53, 49, 49,225, 3,192,111,191,253,134,132,132,132,206,120,235,175,101, 52, 26,143,230,230,230,214,199,233,238,235,235,155,
+ 26, 17, 17,193, 5,224, 56,119,238,220,174, 59,118,236,192, 39,159,124, 82,240,252,249,243, 46, 0,210, 0,184,127,250,233,167,
+ 15, 15, 29, 58,100,105, 52, 26, 81, 82, 82, 2,173, 86,155, 70,223,202,105,208,160, 65,139,173,255, 10,252, 0,196,161, 34,126,
+214, 80, 0,231, 80,225,214, 81, 43, 92,222,170,179,139, 0,134, 87, 62, 31,107,113,134, 7, 42, 86,100, 93, 0,240, 11, 0,251,
+218, 72,173,173,173,191,156, 58,117,170, 46, 59, 59,155,228,229,229,145,240,240,112,178,120,198, 84,195, 0, 15, 71,163,135,163,
+189,210,214,214,246,165,131,141,213,129,118, 2, 44, 6,224,220,128,134, 77, 77, 74, 74,154, 61,117,234,212, 25,111,143, 59,227,
+232,209,163,138,203,151, 47, 43,152, 76,102, 20, 42, 66, 59, 84, 10,202, 41,195,134, 13, 83,104, 52, 26,133,183,183,119, 49, 42,
+ 28,247,107, 67, 96,239,222,189, 75,206,159, 63, 79, 12, 6,195,159, 98, 20, 21, 20, 20,144, 75,151, 46,145,238,221,187, 75, 1,
+ 76,238,215,175,223,245, 59,119,238, 92,239,209,163,199,201,250, 42,108, 99, 99,179,226,201,147, 39, 49,233,233,233,177,231,206,
+157,139, 61,114,228, 72,236,167,159,126,250,180, 77,155, 54,170,228,228,100,163, 94,175, 39, 79, 30, 63, 38,222,205,155, 43, 1,
+184,213,198,211,215,132,245, 80,182,247, 27,162, 94,251, 9, 81,143,116, 33, 0,136,124,235,151, 36,127, 65,127,242,114,254, 16,
+210,135,207,188,247, 33, 61,197,202,202,234, 98, 76, 76, 12,145,203,229,228,217,179,103,100, 74,192, 32,114,111,102,127,114, 97,
+144, 39, 57,212,171, 41,217, 58,176, 13, 25,212,171, 39,249,241,199, 31, 73, 68, 68, 4, 89,177, 98,133,209,198,198, 70,142, 58,
+124,180,196, 98,241,229,227,199,143,199, 2,136,101, 50,153,177, 50,153, 44, 86, 46,151,159,205,202,202,218,229,237,237,253, 85,
+171, 86,173, 38,250,248,248,244,237,211,212,237,171,126,166,188,151,253,205,248,175,154,139, 4, 91,241,231,184, 87, 85, 48, 7,
+220, 60,220,221,229, 55,110,220, 48,106, 52, 26,114,235,214, 45, 99,139,230, 94,234, 45, 99, 7,159,124,189,119,195, 73,245,249,
+ 95, 47,150,157,249,249,206,137,105, 1,241,189, 5,140, 95,187, 10,171,194,113,124, 40,198, 3, 56,141, 63, 86, 29, 78, 5,112,
+ 6,117,175, 66,100, 0,216,191,118,237,218,234, 43, 13, 1,128,209,166, 77,155, 88, 66, 72,108,155, 54,109, 98, 27, 91, 17,129,
+ 64,176, 36, 50, 50, 50,196,213,213,117,211,184,113,227,246, 74,165,210,115, 19, 39, 78,140, 71,197, 98, 16, 10, 21,217, 17,134,
+ 57, 59, 59, 23,196,197,197,145,235,215,175,147, 49, 99,198,200, 57, 28,206, 36,250, 54, 78,131, 6, 13, 26,255, 21,204,174,229,
+187, 78,172,139,143,143,175,140,161, 53,183, 46,242,229,203,151,199,198,196,196,196,162, 34, 74,124,157, 96,177, 88,167,230,205,
+155, 71,236,237,237, 21,118,118,118,167,216, 76,230, 76, 23, 19,248,225,195,150,186,247, 12, 11, 11, 27,241,195, 15, 63, 12, 5,
+208, 25, 0,219,201,201, 41, 39, 47, 47, 79,113,231,206, 29, 69,247,238,221, 21, 54, 54, 54, 18, 95, 95, 95,197,150, 45, 91, 20,
+ 58,157, 78,177,100,201, 18, 5,254, 28,239,171, 38,240, 1,204,231,114,185,167, 90,180,104, 17,191,122,120, 95,221,166,133, 51,
+201, 84, 79, 91, 5,128, 31, 0,204, 3, 96, 1,128, 29, 24, 24,120,229,197,139, 23, 23,125,125,125,247, 52,128,215,177, 85,171,
+ 86, 87,143, 30, 61, 26, 19, 17, 17, 17,251,229,151, 95,198, 88, 91, 91,103, 39, 39, 39, 27,213,106, 53, 41, 41, 41, 33, 82,169,
+148,156, 59,119,206, 96,101,101,181,179,214,134,243,152,185,228,210,225, 26, 67, 56,100,173,154, 68,186,115, 25,111, 62,164,167,
+ 8,133,194,226,162,162, 34,146,151,151, 71, 82, 83, 83,201,201,147, 39,201,224,110,157,200,177, 79, 71,147,195, 51, 70,144,205,
+131, 59,145,206,166,124,165,216, 84, 20, 99,106,106, 42,105,200,170, 67,177, 88,124, 89,163,209, 84,133,111,112,118,118,142,245,
+246,246,142,240,245,245,221, 26, 25, 25,185,104,219,182,109, 35,250, 52,117,251,106,253,160,110,170,178,232, 19, 68,126,252, 7,
+178,188,189,151,250,173,152,175, 17, 78,214, 86, 97, 55,174, 95, 55, 86,138, 95,189, 94, 79, 78,159, 58, 69,198, 14, 25, 16, 95,
+122,225,183, 95,110, 5, 47, 56,186,164,189,215,233,238,124,140,175, 75,176, 85,189,138,136, 96,237,111,198,216,245,145,171, 85,
+110, 79,115,198, 15, 93, 76,223, 73, 47, 53,214,203,203, 43,149, 16,146,235,227,227,147, 10,224,176,143,143, 79,245,255,167,213,
+ 66, 91, 21,156, 52, 36, 36,132,188, 29, 31, 12, 0, 65,235,214,173,139, 37,132,196,122,122,122,222, 6,128,182, 66,216,244, 50,
+103,252, 50,220,221,190,168,151, 57,227,151,182,194,154, 83, 70,185,113,208,188,167,173,224,214, 8, 79, 7,121,111, 39,243,155,
+135, 15,236,219,244,209, 71, 31,237, 5,176, 19,192, 55,214,214,214,183,198,143, 31,159,112,232,208,161,132, 45, 91,182,148, 39,
+ 39, 39,147,233,211,167, 43,121, 60,222, 55,244,125,144, 6, 13, 26, 52,254,107,168,140, 12,239,208, 24,161, 53,236,171,175,190,
+138, 37,132, 84,198,210,154, 92, 67,153,225,171, 86,173,138, 37,132, 84, 70,135,127, 63,128, 89, 77, 1,205, 66,118,237,218, 69,
+120, 60,222, 47, 31,216,152,234,156,226,145, 35, 71,118,145,201,100, 29,237,237,237, 59,190,181, 92,185,216,216,216,164, 30, 57,
+114, 68,161, 82,169, 20,132, 16,133, 94,175, 87,196,196,196, 40,122,247,238,173,168,246,214, 95, 95, 61,223,193, 74, 49,110, 63,
+ 90, 61,131,172, 20,227,246,123,155, 38,237,223,191,255,124, 90, 90,218, 89, 51, 51,179,101, 13,228,116,177,181,181, 13,178,178,
+178,186,104, 99, 99,179,210,202,202, 42,183,188,188,156,148,148,148,144,151, 47, 95,146,235,215,175,147,123,247,238, 17, 43, 43,
+171,236,218,234,217,207,132,117,191,100,211,124, 98,220,191,142,104,119,172, 32, 0,136,116,219,114, 82,248, 99, 40,121, 52,107,
+ 16,233,205,103,222,253,128,243, 9, 11, 11,139,159, 79,157, 58,101, 76, 73, 73, 33, 81, 81, 81,228,220,185,115,100,225,194,133,
+164,185,163,131,166, 11,151,145,223,147,199,186,248, 33, 1, 75, 53, 26, 77,172, 76, 38,139, 85, 40, 20,177, 45, 90,180,136,237,
+212,169, 83, 68,151, 46, 93,182,158, 56,113, 98,209,250,245,235, 71,244, 51,229,189, 44,139, 62, 65,200,151, 67, 8,153,223,131,
+188,154,217,155,244, 53, 97, 61,169,149,211,222, 62,187, 50, 90,187, 82,169, 36, 55,111,222, 36, 87,175, 94, 37, 98, 27, 27,153,
+191, 9,115,118,119, 30,122,117, 55,131, 69, 67,235,217,199,156,113,224,254,143,223, 26, 84,231, 15,145,223,166, 14,209,247,182,
+ 96,236,170, 86,238, 24, 33, 36,119,204,152, 49,175, 9, 33,185, 39, 79,158,204, 34,132,228,142, 30, 61,250, 53, 33, 36, 23,192,
+209,154, 56,223, 11, 78,186,255,173,200,154, 31, 18, 18, 18, 75, 8,137, 13, 9, 9,137, 5, 42,130,168,246, 50,103, 28,124,176,
+103,179, 81,115,238, 32, 57, 49,125,168,161,151, 57,227, 96,141,245,180, 96,157,141,219,191,141,104, 47, 30, 38,167, 22, 78, 52,
+244, 16,155,221,240,242,242,218,188,104,209,162,136,123,247,238, 61, 53, 24, 12, 9,169,169,169, 9, 59,119,238, 76,232,218,181,
+235,109,107,107,235,120, 46,151, 59,175,190,107,244, 31, 2,205, 73,115,210,156, 52, 39,141,247, 13, 76,117,108, 59,187,113,227,
+ 70, 33, 33,100, 73, 96, 96, 32, 54,108,216, 48,182, 85,171, 86,227,157,156,156,108, 1, 32, 39, 39,167,236,217,179,103,178,192,
+192, 64, 4, 5, 5, 97,211,166, 77, 91, 81,225,203,242,127,137,188,211,167, 79, 59, 47, 88,176, 64,178,126,253,122,227,244,233,
+211,125, 0, 60, 43, 44, 44,108, 62,113,226,196,249, 44, 22, 43,208,205,205,205, 55, 55, 55,183, 64,165, 82, 29, 6,176, 7,245,
+204,153,214, 6, 30, 3,134, 14, 77, 28,112,145, 1, 67,181,159,135, 4, 5, 5,141, 27, 61,122,116,249,182,109,219,244, 50,153,
+ 44,178,129,116, 89, 5, 5, 5,107, 42,255,177,178,178, 18, 63,121,242,100,158,157,157, 29, 35, 53, 53, 21, 26,141, 6, 41, 41,
+ 41, 70, 84, 76, 77,213, 8,133,158,108,255,233,228,101,239, 37,147, 2,204,202, 18, 31,131,195,100, 66,199,230, 34,239,254, 69,
+236,191,153, 40, 83,150, 99,199,135,180, 83, 42,149,126,183,112,225,194,137,203,150, 45,227,187,185,185, 81,119,239,222,197,241,
+227,199, 53, 18,137,100, 48,128, 27,127,132,126,106, 28,140, 70, 35,184, 92, 46, 0, 96,249,242,229, 96, 48, 24,108,137, 68,194,
+165, 40,138, 71, 81,148,128,162, 40,166, 46, 45, 1, 70, 89, 9,242, 75,164,200,202,151,214,201,103, 48, 26,143, 63,120,240, 96,
+113,187,118,237, 24,143, 30, 61, 66, 65, 65, 1, 82, 82, 82,136,129,144,163, 55, 85,134, 10,167, 68, 77,195,235, 39,176,178, 30,
+217,214,146,199,224, 30, 8,130,191,150,193,220,109,196, 24, 84,196,210, 2,128,253, 20, 69,113, 0, 20,181,104,209,162,207,139,
+ 23, 47, 76, 90,180,104,161, 74, 76, 76, 60, 79, 81,148, 19,128,131, 53,113,154,152,152, 20, 2, 40, 60,121,242, 36, 0,204, 66,
+197,201,107, 31, 28, 28,156,123,243,230, 77,132,132,132,228, 3,216, 5, 0, 34, 75,235,225,190,230, 28,138,251,107, 8,186,106,
+192,216, 97, 36, 53, 90, 93, 69,118,246,125, 91, 9, 25, 96,239,251, 26, 29,197,222, 12,174,190,188,117,104,104,232, 77,133, 66,
+161, 57,118,236,152,118,218,180,105,204,228,228,228,135, 0,110, 1, 56,137,183, 62,150, 52,104,208,160, 65,227,191,138,247, 45,
+ 88,245,250,104,189,175, 90, 55, 0,248, 41, 41, 41,169, 42,169,116, 82, 82, 82, 44,128,221,168,136, 6, 63,172, 17,138,119,245,
+ 91,139,214,158, 15,108,204,251,156,124, 63, 63, 63,147, 23, 47, 94,112, 80,115, 18, 71,234, 3, 56,255,132,154,114, 29,122,121,
+121,125,175,211,233, 34,118,239,222,125,130,201,100, 78,252, 11,106,223,205,211,211,179,228,200,145, 35,198,168,168, 40,178,122,
+245,106,131,131,131, 67, 9,254,236,163,245, 14,167, 63,151, 25,190,212,199, 73, 22, 51,185, 7,121,181,104, 56,185, 53,169, 55,
+153,237, 36,146,249,243,153,199,255,226, 91,137,167,185,185,249,126, 19, 19, 19,153,153,153,217,101, 0,221,254,202, 53,178,182,
+182, 62, 36, 22,139, 47, 87,255,216,219,219, 71,216,218,218,254, 96, 99, 99,179,218,194,194, 98,142, 59,159,187,109, 81,115, 71,
+117,252,200, 22, 36,186,187, 45,153,100,195,125,127,234,240,253,122, 58,184,187,187, 23,133,133,133, 25,207,158, 61, 75, 86,172,
+ 88, 97,108,210,164,137, 12,117,248,181,213,105,209,178, 96, 30, 15, 31,221,197,152, 63,212,137,108,240, 49, 53,246,177,100,214,
+182, 66,113,210, 91, 1, 60,181, 62, 78, 15, 15,143,221,132,144, 3,107,215,174, 61,128, 63,114,129, 14, 8, 13, 13, 13, 38,132,
+ 4,135,134,134, 6, 3, 24, 4, 0,254,230,140,176,195, 35, 58, 24,114, 62,114, 36,223,250,136, 12,254,230,140,176, 26, 45,153,
+ 86,172,211,103,102, 14, 53,230,206,236, 78,130, 60,133,134, 46, 86,188, 43, 92, 46,119, 17, 42, 44,206,157, 0,112,233,183,102,
+154,147,230,164, 57,105,139,214,255,156,240,106, 16,196, 86, 86, 86,251,155, 53,107,118,194,205,205,237,132, 72, 36,218,138, 10,
+167,249,198, 94, 8,247,117,235,214,201,204,205,205,219,254, 7, 47,174, 29, 0, 39,252, 57,113,238,127,172,195,172,113,192,130,
+228,101, 99,159,172,113,192,130,106, 63,119,242,241,241,249, 22, 21,209,188,255,106, 39,116,179,178,178,218,105,101,101,149,253,
+214, 55,203,173, 33,156, 29,152,204,137,125,248,204,187,221,184,140,188, 62,124,214,157,142, 76,230,132,191,233, 0,172,107,177,
+ 69,109,156,206, 54, 54, 54,219,172,172,172,114,108,108,108,118, 54, 82,100,189,195,217,214, 4, 14,125, 45,152,167,187,153, 82,
+202,190,230,204,147, 29, 4,181, 47,234,104, 68,219,253, 66, 66, 66, 62, 33,132,124,226,232,232, 24, 88, 77,248,251, 6, 5, 5,
+ 5, 16, 66, 2, 42, 35,192,119, 18,192,174,183, 5,243, 72,119, 51, 74,218,219,130,121,164,147, 0,118,181,213,179,143, 5,243,
+120,119, 51, 74,234,111,198, 56,226,202, 67, 19,250,102, 78,115,210,156, 52, 39, 45,180,254, 25, 66,139,238, 48, 52, 39,205, 73,
+115,210,156, 52, 39,205, 73,115,210, 66,171,102, 97, 85,253, 83, 53,195,198,162,207, 13, 13, 26, 52,104,208,160, 65,131,198, 95,
+ 66,173, 1, 75,169, 58, 84,105, 99, 28,219, 63, 68,217, 70,211,156, 52, 39,205, 73,115,210,156, 52, 39,205,249,175,227,172,143,
+251,255,122, 97,221,223, 26,180, 89,149,230,164, 57,105, 78,154,147,230,164, 57,105,206,127, 45, 24,244, 41,160, 65,131, 6, 13,
+ 26, 52,104,208,248, 75,240,123,251,253,126,224,210,154,125,180, 88,157,214,230,235,245,122, 59, 0, 96,177, 88, 18,221,195,213,
+ 14,117,177,179,129,126,250,138,244, 59, 96, 1,179,244,192,229, 26, 56, 47,235,245,122,203,183,156, 37,186,135,171, 7,213,201,
+217,105,237,197,234,229,245, 15, 87, 15,120,191, 12, 1,152,236, 78,107,115,222,171,171, 99, 67,207, 10,133,119, 98, 98,253,215,
+234,249,119,225,252, 55,131,221,121,109,190, 78, 87,209,143,216,108,150,164,252, 65,221,253,136,211,121,109, 78,245,242,186, 7,
+171,237,235,226, 20,152,240,138, 60,156,108,183,214,197,153,154, 83,184, 68, 89,166,182,174,139,179,177, 99,211,197,193,161,159,
+225,237,216,100, 2,179,178,115,115, 47,255,143,245,165, 14, 0, 86, 3, 48,171,246, 91, 60,128,207,233, 94, 73,131, 6,141,191,
+153,208,138, 67, 69,158,195,159,223,138,173,159,107, 21, 90,122,189,222, 46,246, 84, 48,148, 26,160,223,148,181,118,238, 35,247,
+252, 41, 81,178, 94, 93,194,149, 62, 63,230,203,212,201, 44,109, 89,229,102, 57, 57, 57, 20, 0, 80, 20,245, 11, 0,215, 26, 56,
+ 45, 99, 79, 5,163, 76, 11,248,143, 15,181,116, 5,204, 10, 56,156, 47, 76,132,194, 62, 42,149,170, 21, 0,152,152,152, 60, 87,
+ 41,149,215,108,203,203,183,188, 95,190,182,150, 85,175,107,223,201,107,237,124, 70,238, 89,104, 48, 26,185,111, 30,237,246, 87,
+ 23, 38,179,216,122,205,174,149,192,249,224, 26, 68, 85, 45,124,127, 28,247,227, 21,214,108,160, 47,151,207,111,107, 97,105,217,
+211, 72, 72, 11,163,209, 72, 25,244,250, 4, 89,105,233, 45,163, 94,255, 68,175, 85, 90,199, 70,126,107,172,171,158,239,183,229,
+ 99,128,117, 10, 8, 20,138, 68,125,152,108,118, 55, 0, 48,232,116,119,149, 10,197,181, 81, 64,120, 67,218,222,208,243,243,161,
+229,255,109,208,233,244,118,105, 23,131,161,209, 1,126, 99,190,181,107, 51,241,215, 35, 0,160,149, 60,177, 87, 36, 71,118, 6,
+ 0,161, 71,192, 3,158,216, 47, 31, 0, 88, 25,185,118, 47,163, 86, 65,163, 3, 90, 4,132,218,213,199, 57, 45,232,184,245,178,
+217,163,121, 0,112,233,228, 15,205,175, 70,252, 52, 4, 0,250,142,158,123,126,224,152, 5, 47, 1, 96,211,207, 17,214, 71,191,
+ 29, 91, 39,103,195,198,102, 41,167, 52, 57,202, 83, 43,203,181,112, 17,178,196,201,201,201, 12, 0,112,116,116,108,208,216,116,
+ 6,204,115,129,249, 12, 38,179,167,135,167,167, 31, 0,146,250,234, 85,156, 65,175,191,237, 0,236,250, 15,247,165,133,132,188,
+ 27,156,149,162, 40,186, 67,210,160, 65,227,239,134,115,111,197,213,185, 63,189,204,214,182,135, 82, 3,220, 72, 1,122,117,105,
+131,217, 19, 63, 18, 85,223, 22,190, 39,212, 53,249,209, 25,159,125,191,110, 97,180,105,211, 6,105,105,105, 13,170, 69,153, 22,
+184,158, 12, 64,250,194,180, 68, 40,124,181,109,243,102,179, 1, 3, 6,176, 28, 29, 29, 65, 81, 20,242,242,242,186, 68, 71, 71,
+119, 88,188,120,241,167,144,190, 40, 41,211, 66,126, 61,185,126,222,202,186,182,106,222, 4,171, 23,140, 53, 7,128,149, 83,118,
+117,120,148,148,111,245,234,213,171,126, 95,125,245, 85, 17,243,218,181,159,108,128, 3,249, 64, 86, 67,234,121,232,236, 3,190,
+121,238,111,238,147, 22, 44, 56,233,233,233, 41,114,115,115,163, 76, 77, 77,193,100, 50, 81, 82, 82,226,250,236,217,179, 33, 15,
+ 31, 62, 84, 70,223,248,133, 27,243,112,120,170,132,223, 89,221,160,182,171,114,248,151, 76, 77,159, 79, 30, 53,202,121,236,216,
+177,124, 15, 15, 15, 0,192,171, 87,175,188,194,195,195,199,159, 60,121, 50, 8,170, 28,125,153, 22,234,250,218, 94,197, 9,128,
+ 15,116,179,176,179,155,196,100,179, 91,233,245,122,167,183,214,134, 55, 6,157,238,185, 84, 34, 57,252,126,121, 26,127,134, 70,
+ 7,188,200, 5,250,247,244,195,228,209,253,133, 0,240,213,184,117, 93, 50, 94,167,112,180, 90, 45,154,123,183,232,254,205,183,
+ 91, 47,130,193, 64, 88, 68,116, 85,249,134,112,198,191, 72, 67,240, 55,219,144,243, 52,188,139,161, 52,165,143, 92, 86,202, 4,
+ 0, 51,115,243,209,225,199,126,187,230,232, 27,120, 63,165,176,188, 65,156,117,141,205, 11,199,118, 58,100, 63,187,214,242,199,
+ 75,251,217,174,174,174,120,250,244,105,227,198,102,105,146,169,209,193, 33, 97,203,151, 95,138,253,253,253, 33, 18,137,192, 98,
+177,160,215,235,251,223,190,125,187,127,112,112,240, 92,148, 38, 41, 27, 58, 54, 27,128, 45, 20, 69,245,153, 54,123,161,195, 71,
+ 35, 2, 49,122,112,119,186, 35,210,160, 65,227,239,134, 74,235, 85,245,149,135, 63,215, 41,180, 88, 44,150,100,192,212,245,118,
+ 61, 59,183,198,163, 39, 47, 75,211, 51,115, 21,149,219,138,159,135, 55, 31,209,221,169,229,205,155, 55,160,209,104,112,247,238,
+ 93, 60,121,242, 4,175, 95,191,198,156, 57,115, 52,111,167, 14,107,226, 44,241, 31, 31,106,137,210,100,145, 23, 55,169,105,116,
+ 98, 34, 83,173, 86,227,230,205,155, 40, 41, 41, 1,151,203,133,179,179, 51, 6, 14, 28,200, 74, 76, 76,180,234, 55, 96,176,185,
+255,224, 9,105, 48,247, 82,176, 88,172,146,218,242,136,176, 88, 44, 73,191, 41,107,237, 90,122, 53,193,171,244,156,210,213,223,
+238, 83, 24,141,132,149,250, 58,163,252,198,141, 27,240,243,243,195,229,203,151,173,139,139,139,191,222,181,107,215,106,246,198,
+ 31,183,235,180, 69, 75, 81, 59, 95,137,255,248, 80, 75,107,201, 9,183,171, 23, 78,115,158, 63,127,206,217,189,123, 55,138,138,
+138,192,229,114, 97, 97, 97, 1,177, 88,140,230,205,155, 83, 43, 87,174, 20, 5, 4, 60,199,103,179, 2,221,202,221,103, 38,213,
+ 86,207,170,182, 43, 50, 4, 54,178, 75, 30, 17,231,206, 49,122,244,232,241,206,107,123,179,102,205, 48,104,208, 32,254,164, 73,
+147, 60,198,142,159,104,244, 31, 58,237, 21, 68,110,101,245,114, 42,179, 76,172,203,238, 57,246, 31, 63, 62, 50, 52, 52,212, 66,
+ 44, 22, 67, 40, 20, 2, 0, 74, 75, 75,157,211,211,211,187, 4, 5, 5,141,121, 16,127,140,229, 31,144,149, 3,161,139,170,174,
+243,249,111, 5,155,205,146, 84, 90,145, 76,133, 38, 37, 89,217,249, 74, 0,208,106,181,208,106,181,208,104, 52,152, 55,119, 14,
+115,214,152, 78,158,110, 61, 23, 62,126,253, 38,191,184, 69,244,125,171,202,125,117,245,112,178,202, 94, 75,165,153, 87,102, 5,
+127,249,165,216,222,254,143, 25,193,176, 67,135,152,197,197,197,253,131,131,131, 91, 18, 65,111,105,139,128, 80,139,186, 56,235,
+ 26,155,210,151,231,154,126,179, 96, 80,219, 61,223, 70,193, 96, 48,224,222,189,123,184,121,243, 38,182,110,221, 74,206,159, 63,
+ 95,106, 38, 20,206, 66,157, 99, 51,201,180,135, 67,158,251,198,141, 39, 41, 30,143,135, 51,103,206, 32, 49, 49, 17, 12, 6, 3,
+109,218,180,193,228,201,147,209,191,127,127,241,236,217,115,136,255,224,113,169, 48,247,150,255,197,190,196, 0,176,112, 69,240,
+ 70,135, 41, 51,231, 99,211, 55, 43,105,161, 69,131, 6,141,191,179, 53,171,214, 16, 15,136,138,138, 34,111, 63,189, 0,128, 0,
+140,102, 35,247, 28, 61, 17, 99, 60,215,108,228,158,163, 4, 96, 16,128, 97, 6, 52,105,215,174,157, 78, 42,149,146,135, 15, 31,
+146,121,243,230, 41,183,111,223,126,237,220,185,115,225,250,242,242,189,142, 14, 14,223,145, 90, 28,236, 9,192,112, 3,204, 5,
+ 2, 65, 65,102,102, 38,249,253,247,223, 73, 72, 72, 8, 57,124,248, 48, 57,127,254, 60,137,142,142, 38,231,207,159, 39, 71,143,
+ 30, 37,241,241,241,228,229,203,151, 68, 40, 20, 22,184, 1,230,117,112, 50, 9,192,108, 62,114,247,210,147,143,116,161,222, 35,
+247, 44, 38, 0,211, 18,240,105,215,174,157, 33, 60, 60,156,132,133,133,145, 95,127,253,149,196,199,199,147,194,194, 66,194,226,
+ 9, 11, 42,247,171,173,158, 4, 96, 56, 57, 57, 21, 72,165, 82,226,226,226, 66,184, 92, 46,177,183,183, 39,205,155, 55, 39, 93,
+186,116, 33, 67,134, 12, 33, 19, 39, 78, 36, 95,127,253, 53,145, 74,165,132,207,231,231, 87,238, 87, 27,167, 31, 96, 34, 20, 10,
+ 51, 99, 99, 99, 73,109, 80,169, 84,164,176,176,144, 92,188,120,145, 8,133,194, 76, 63,192,164, 46, 78, 19,160,189,175,175,111,
+ 65, 97, 97, 33, 41, 47, 47, 39,153,153,153,228,217,179,103, 36, 49, 49,145,100,102,102, 18,149, 74, 85,197,253,242,229, 75,226,
+238,238, 94, 96, 2,180, 39,244, 34,136, 90,251,210,251, 31, 87,123,251, 33, 98,177, 88,117,242,228, 73,242,230,205, 27,114,240,
+224, 65,194, 0,214,189, 95,174, 46, 78, 46, 48,176, 71,143, 30,134,123,247,238,145,199,143, 31,147,229,203,151,147, 65,131, 6,
+145,193,131, 7,147,224,224, 96,146,157,157, 77,178,179,179,201,144, 33, 67, 12, 92, 96, 96,125,253,179,166,177,105, 14,184, 6,
+ 4, 4,168,202,203,203, 73,106,106, 42,105,213,170, 85, 54, 19,152, 36, 4, 90,246, 2,120,245,245, 79, 39,192,210,193,193, 33,
+247,222,189,123, 36, 34, 34,130,184,185,185, 21, 48,129,105,102, 64, 51, 51,160, 25, 19,152,214,172, 89,179,130,123,247,238,145,
+162,162, 34,226,234,234,154,235, 4, 88,254,133,190,196, 0,176,127, 69,240, 70,146,148,173, 36, 43,130, 55, 18, 0,153,132, 16,
+130, 26,124, 60,105,208,160,241,207,199,251, 90,228,159,130,170,155,100, 64, 64, 0, 5,224,122, 93,133, 85, 76,230,250, 77,155,
+ 54,177,212,106, 53,246,237,219, 39,255,120,204,152, 19,189,122,246, 76,109,234,230, 38,165, 24,140,122,179, 13, 23,240,120,139,
+ 54,109,218,100,161,213,106, 17, 19, 19,131, 14, 29, 58, 64, 44, 22, 67, 36, 18, 65, 36, 18,193,206,206, 14,222,222,222,144, 72,
+ 36, 48, 53, 53,197,178,101,203,204, 11,120,188, 69,245,241, 26,141,132, 5, 0, 6,163,145,203, 1,102,187,119,236, 24, 19, 20,
+ 20,196,176,182,182,134,149,149, 21, 68, 34, 17, 18, 19, 19,161,213,106, 33, 48, 17, 52, 40, 72, 43,131,193, 96,136, 68, 34, 92,
+189,122, 21, 11, 23, 46, 68,183,110,221, 96, 97, 97, 1, 83, 83, 83,180,106,213, 10, 3, 7, 14,196,172, 89,179,144,154,154, 10,
+170, 1, 78, 37, 9, 44,214,252, 89,179,102,217,249,249,249,213,184, 93,173, 86, 67, 42,149,162,160,160, 0,206,206,206, 8, 12,
+ 12,180, 75, 96,177,230,215,198,103, 13,136,157,189,188, 34, 31, 62,124,104, 35, 20, 10, 17, 22, 22,134,211,167, 79,227,194,133,
+ 11,248,253,247,223, 17, 21, 21,133, 51,103,206,160,160,160, 0, 0,224,229,229,133,227,199,143,219,136,236,236,162,172, 1, 49,
+ 61,164, 27,134,140,252,252, 75,173,242,242,108, 38, 77,156,120, 75,161, 80, 96,210,164, 73, 88,191, 97,195, 74, 54,176,184, 33,
+251,123, 3,230, 86, 14, 14, 7, 54,110,220,200,200,203,203,195,168, 81,163, 10,183,108,216, 48, 35,238,226, 69,143,216, 11, 23,
+ 60,214,135,134,206,232,213,171, 87, 97,118,118, 54, 14, 29, 58,196,176,119,117, 61,224, 13,152, 55,182,158,114, 96,225,247,223,
+127,207, 87,171,213, 24, 48, 96, 64,170,241,249,115,111, 61,240,155, 2, 72,188, 14,148,215,183,127, 46, 48,127,217,178,101, 98,
+ 30,143,135, 47,190,248,162,176, 44, 35,163,181, 30,248,181, 20, 72, 47, 5,210,245,192,175,242,180,180,214, 83,166, 76, 41,228,
+241,120,216,182,109,155, 56,247,143,164,219, 13, 69, 7, 0,145, 0,110, 0,200,153, 54,123,225, 52,191, 78, 93,113,104,239, 46,
+124, 27,250,213, 1, 0, 31, 83, 20,117, 24,192, 82,186,231,209,160,241,239, 68, 67,180,200,255, 40,106, 77,185,195,170,174, 36,
+ 1,244,174,139,197,210,218,186, 67,235,214,173,113,243,230, 77,248,250,250, 62,180,176,176,208,115,120, 60,176,217,108, 16, 99,
+189, 58, 11, 38, 66, 97,191,254,253,251,179,238,223,191, 15,119,119,119,152,152,152,128,205,102,191,243,225,112, 56,112,112,112,
+128, 76, 38, 67,191,126,253,216, 59,118,236,232, 7,141,230,155,122, 31,136,201,207, 68, 5,247, 55, 78,252,229,224,129,102,254,
+254,254, 40, 45,149,193,104, 52, 66, 32, 16, 64,171,213,130,197, 98, 85, 76, 1,233,136,172, 33,103,204, 96, 48, 24,152, 76, 38,
+220,221,221,177,126,253,122,168,213,106,112, 56, 28, 0,128, 76, 38,131, 84, 42,197,179,103,207,144,158,158,142,183,111,225,117,
+194,212,220,252,163,177, 99,199,214,152,240, 87,163,209,160,180,180, 20,165,165,165,144, 74,165, 80,171,213,232,218,181, 43,247,
+ 92, 84,212, 71, 40, 42,218, 82,227, 62,124,254,152, 67,135, 14,217,113,185, 92,168, 84, 42,200,229,114,100,101,101, 33, 35, 35,
+ 67, 45,145, 72,244,166,166,166, 12, 55, 55, 55, 6,143,199,227,141, 28, 57,146,146,201,100,160, 40, 10, 1, 1, 1,214, 71,194,
+194,198, 66,171,221, 74, 15,233,134,225, 18,160,105,175,213, 14,235,220,169,211,213,135,143, 30,249, 45, 90,180, 8,241,241,241,
+ 27, 5,199,142,221, 40, 3,158,212,181,111, 42, 48,255,187,106, 2,134,100,100,248,150, 3, 5,213,138,164,187,165,165, 93,152,
+ 50,101,202,211,248,248,120,155,109,219,182,137, 63, 30, 53,106, 62,128,117,141,169,163,169,185,121, 71, 7, 7, 7,156, 63,127,
+ 30,153,175, 95,127,165, 7, 84,141,122,227, 98, 50,123,248,251,251,227,204,153, 51,200,206,200,248, 74,255,110, 29, 43, 94,148,
+128, 2, 86,106,234, 87, 7, 14, 28,216, 63,125,250,116, 48, 89,172, 30,208, 55,106,226,240, 79,142,239,211,231, 44,194,129,159,
+119, 28, 0, 48, 19,128, 17,192, 67,186,199,209,160,241,239,182,106,213,167, 69,254, 70, 98,235,231, 70, 91,180,236,236,236,156,
+ 68, 34, 17,114,114,114,208,194,199, 71,194,227,241,192,101,179,193,231,114, 27, 84,131,178,178, 50, 95, 71, 71, 71,148,150,150,
+194,198,198, 6, 28, 14,167,234,195,229,114,171,254, 54, 53, 53, 5,131,193,128,171,171, 43,202,202,202,124,235,229,205,127,102,
+119,108,199,220,121,247,110,156,111, 54,106,212,104, 88, 90, 90,193,197,197, 25,118,118,118, 48, 49, 49,129,139,139, 11, 60, 60,
+ 60,200,150, 45, 91, 32,176,107,211,160, 27,121,117,241,196, 98,177, 96, 48, 24,144,159,159,143,164,164, 36,196,199,199,227,222,
+189,123,120,252,248, 49,228,114, 57, 26,160,179, 80,166, 82,181,101,177, 88, 53,138, 44,169, 84, 10,169, 84, 90, 37,180, 10, 10,
+ 10,144,158,158, 14,133, 82,217,174, 14,209, 59,186,117,235,214, 76, 0, 48, 49, 49, 65,187,118,237,176,103,207, 30,253,217,211,
+167,199,181,188,119,207,202,229,226, 69,139, 95,118,239, 30, 23, 24, 24,104,184,127,255, 62,100, 50, 25, 94,188,120, 1, 91, 91,
+ 91, 22,151,207, 31, 75, 15,231,198, 33, 22, 80,218,200,229,131,187,117,235,150, 86, 90, 90,138,205,155, 55, 51,216,166,166, 63,
+135,214, 50,197, 87, 5, 38,179,187,191,191, 63, 34, 35, 35,145,147,145,177, 60,163, 6, 1,147, 1, 20,100,166,166, 46, 63,112,
+224, 0, 6, 14, 28, 8,138,197,106,180,163, 82,151, 46, 93, 90, 27,141, 70, 60,125,250, 20, 22,192,131,198,238,239,225,233,233,
+ 87,105,249, 21, 2,183,106, 43, 39, 4,110,197,197,197,193,196,196, 4, 45, 90,182,108,223,200,195,108,161, 40, 42,119,250,156,
+ 69,136,184,112, 7, 0,112,224,231, 29,249,213, 68, 22, 13, 26, 52,104,139,214,223,213,162, 85, 41,172,170,127,240,142,208,106,
+160,248, 0, 0,176,217,108,112,121, 60,112,185,220, 10,129,196,227, 53,152,131,162, 40,240,249,252, 42, 97, 85, 93, 96, 85,255,
+ 91, 32, 16, 52, 72,192, 0, 64, 73,202,133,158, 51,103, 76,231,242,120, 60,104,181, 26, 16, 66,192,227,241, 97, 97, 97, 1,119,
+119,119,200,100, 50,116,235,222, 75,147, 37,229, 68, 89,183, 24, 25,255, 33,103, 79,175,215, 67,169, 84,162,164,164, 4,197,197,
+197,144,201,100, 80,169, 84, 13, 94,138,110, 52, 26,153, 89, 89, 89,248,237,183,223, 80, 84, 84, 4,160,194,209,186, 82, 92, 85,
+126,167,165,165, 33, 44, 44, 12,175, 95,191,110,212,245,233,217,179, 39,162,162,162,152,189,251,245,219,123,217,205, 45,231,178,
+155, 91, 78,239,126,253,246, 70, 70, 70, 50,157,156,156,144,158,158,142,152,152, 24,148,148,148,128, 16, 66,175,159,255, 0,188,
+ 2, 74,202,138,139,167,175, 92,185,146,136, 68, 34,108,254,238,187,182,235,128, 9, 13, 21, 48,230,117, 8, 24,243,191, 38, 96,
+ 64, 8,129,209,104,132,193, 96,248,160,182, 81, 20, 69,177,217,236,198,134, 86,104, 76,225, 42,199,247,101, 95,175,199,239,103,
+194, 43,127, 79,166, 69, 22, 13, 26, 52,254, 1,168,213, 17,158, 85, 77, 65, 86,125,215,134,252,252,252, 55, 74,165,178,153,155,
+155, 27,178,179,179,237, 92, 93, 93, 51,184,108, 54, 56, 92, 46, 40, 70,253,154, 64, 32, 16, 60,205,201,201,233,238,228,228, 4,
+189, 94, 95, 37,170,222,159, 58,172,180,210, 60,126,252, 24, 2,129,224, 41,212,117, 70, 78,128, 65, 91,210,164,125,251,246, 85,
+150, 33, 11, 11, 11, 88, 88,152,131,199,227, 99,213,170, 85,198,109, 91,182,236,114,237, 27, 90,250,201,226,149,100,229,186,189,
+255,209, 51,219,208, 7,147, 64, 32,120,234,226,226,210,213,220,220, 28, 17, 17, 17, 72, 79, 79, 71, 73, 73, 9,202,202,202,160,
+209,104, 80, 86, 86, 6,173, 86, 11, 62,159,143,150, 45, 91,194,204,204, 12,209,209,209, 79,161,209,212, 44, 46,139,138, 34,158,
+ 62,125,218,181, 83,167, 78, 85, 22,149, 62,125,250, 80,125,250,244,177,169,178,162,149,149,161,176,176, 16, 15, 31, 62, 68,116,
+116, 52, 40,148, 28,221,209, 0, 0, 32, 0, 73, 68, 65, 84,138, 66,114,114,178, 65,163, 82, 29,165,199,196,135, 65, 13,220,101,
+ 30, 56,176,255,211, 79, 63,157,209,189,123,119, 24,128, 33, 0,194,254, 63, 10, 24, 0,192,189,123,247,158, 25, 12,134,238,205,
+155, 55,135, 20,232, 12,224, 76,163, 68,100, 74, 74,156, 94,175,239,215,182,109, 91, 68,156, 56,209, 19, 64,122, 77,229,148, 64,
+ 79, 63, 63, 63,168, 84, 42,188, 72, 72,136,109,132,200,218,187, 34,120,227,180, 41, 51,231,227,208,222, 93, 56,240,243,142,172,
+253,123,182,187,160, 1,254, 99, 52,104,208,248, 87, 89,179,234,213, 34,255,163,152, 93,155,248, 98, 53,134,165,180,164, 36, 54,
+ 46, 46,174, 89,251,246,237,177,119,239,222, 78,221,186,118,125,195,225,114,245, 92, 14, 7,140, 6, 60, 72, 84, 74,229,149, 43,
+ 87,174,116, 30, 57,114, 36,235,254,253,251, 16,139,197, 85, 66,171,242,155,197, 98,129, 16, 2,129, 64,128, 83,167, 78,149,171,
+148,202, 43,245, 90,139, 12, 70, 3,227,173,208, 35,132, 64, 42,149,130,195,225, 96,235,214,109,216,185,101,203, 68, 3, 16,238,
+ 37,180,253, 18, 0,255,255,219, 3,186,172,236,234,239,191,255,222, 33, 40, 40,136,237,236,236, 12,169, 84,138,146,146, 18, 20,
+ 21, 21, 65, 38,147, 65, 38,147,161,164,164, 4, 82,169, 20,124, 62, 31,241,241,241, 58,117, 89,217,213,218,248,120,106,245,201,
+169, 83,167, 46,139,139,139,115, 96,177, 88,208,233,116, 48, 26,141, 48, 26,141, 40, 47, 47, 71, 74, 74, 10,158, 63,127,142,196,
+196, 68, 20, 23, 23,131,205,102,131,201,100,226,241,227,199, 37, 66,157,238,132,150, 30,211, 31, 12, 54, 16,113,251,246,237, 25,
+147, 39, 79,134,163,179,115, 47,100,103, 55, 72,192,156,174, 67,192,148,126,152,128,249, 67, 0,201,229,143,210,210,210,186,247,
+238,221, 27, 14,206,206, 27, 91,102,103, 95, 78,104,132,159,150, 65,175,191,117,251,246,237,126, 83,166, 76,193,222,189,123, 55,
+218,166,165, 93, 40,120,111,154,211, 22,176,109,234,225,177,113,218,180,105,184,116,233, 18, 12,122,253,173, 58, 40,171, 71,124,
+111, 50,109,246, 66,151,247, 28,223,247, 80, 20,181, 0,192,102,186, 71,209,160, 65,227,159,108,209,106,212,212,161,137,193,176,
+ 98,233,210,165, 58, 6,131,129,209,163, 71,155,158,137,140, 12,124,252,228,137,187, 68, 34,177, 48, 24, 12,245,114,217,106, 52,
+219,151, 46, 93, 42,213,106,181,240,246,246, 70,113,113, 49, 12, 6, 3, 88, 44, 22, 88, 44, 22, 40,138, 2,131,193,128, 72, 36,
+ 66, 92, 92, 28,246,239,223, 47,179,213,104,182,215,251,144, 48, 24,158,134,133,133,129,201,100, 18, 62,159, 15,138,162,192, 98,
+177,176,109,219, 54,201, 78, 32, 2, 0,152, 12,134, 22, 0, 24, 12,170,161,222,187,245,206, 91,114,185, 92, 24, 43, 22, 1,212,
+ 91,214, 82,163,249,126,211,166, 77,242, 23, 47, 94, 64,169, 84, 86, 89,223, 20, 10, 69,149,115,189, 84, 42, 5, 69, 81, 80, 42,
+149,136,140,140,148, 91,106, 52,223,215,198, 87, 4,228,101, 39, 39, 15,239,212,169, 83, 81, 90, 90, 26, 74, 75, 75,241,244,233,
+ 83, 68, 71, 71,227,248,241,227,184,116,233, 18, 82, 82, 82,160,215,235,225,228,228, 4, 66, 8, 78,159, 62, 93,170,151,203,135,
+ 20, 1,121,244,152,168, 29, 77,196,226,126,246,118,118,153,182, 54, 54,217, 77,196,226,126,239,111, 55, 7, 94,190,124,249, 18,
+122,189, 30,238,238,238, 86,117,249,105, 17,189,254,246,237,219,183, 49,101,202, 20,184, 52,107,182,193, 13,176,125,191,140, 27,
+ 96,235,230,225,177,161, 82,192, 16,189,254,118, 99,235,108, 10,236,248,242,203, 47, 85, 28, 14, 7,199,142, 29,115,215,121,122,
+ 38,178,128, 9, 34,192,167, 55,192,169,111,127, 7, 96,215,215, 95,127,157, 71, 81, 20, 14, 31, 62,108, 99,238,225,241,140, 5,
+ 76, 53, 7,154,152, 3, 77, 88,192, 84,115, 15,143,103,199,142, 29,179,209,235,245, 88,188,120,113,158, 3,176,171, 14,202,133,
+132,144, 97,132, 16,127, 66,136,203,254, 61,219,241,251,153,240, 74,145, 53, 19, 21, 78,239,147, 1, 60,163,123, 28, 13, 26, 52,
+254,201,168,209, 12,197,234,180, 54, 31, 32,118,189,186,180,193,163, 39, 73,165, 54,150,102, 23, 43,183, 21, 63, 15,111,222,215,
+215,172,205,143, 63,254, 8, 54,155,141,172,172, 44, 36, 36, 36,192,204,204, 12, 19, 39, 78,212,168,228,242,225,213,114, 29,246,
+ 7, 16,253,150,179, 34,159, 90,105,178,200,131, 21,223,236,194,239, 81, 76,115,115,115, 40, 20, 10, 48, 24, 12,240,249,124, 8,
+ 4, 2,152,152,152, 32, 38, 38, 6, 67,135,141, 48, 20, 8,252,255, 8, 88,250, 71, 62,181, 42,206,202, 88, 67,157, 1, 65, 28,
+240,133,157,163,227,210,213,171, 87,155, 12, 26, 52, 8, 28, 14, 7,206, 77,188,242,220, 7,111,222,193, 96, 80,250,236, 34,217,
+ 42,143, 38,142,230, 9,201,233, 0, 40,137,238,225,106,199,106,185, 14,255, 84, 79, 87,237, 13,247, 83,191,110, 49,107,215,174,
+194, 31, 93, 42,149, 34, 63, 63, 31, 18,137, 4, 82,169, 20, 74,165, 18, 0, 16, 21, 21,133,223,111, 38,202, 84,206,129,169,181,
+213,243,143,182, 39,153, 58,150, 63,104,122, 36,236, 87,166,173,173, 45,242,243,243, 81, 80, 80, 0,169, 84, 10,149, 74, 5,131,
+193,128,226,226, 98,236, 59,240,171,161, 72,228,255,186, 42, 32,100, 93,156,202, 44, 19, 43,197, 29, 39,191,150,110,100,198,140,
+ 25,166,102,102,102, 48, 26,141, 40, 41, 41, 65,102,102, 38,210,210,210,112,243,230, 77,165, 68,170,133,210,102, 64,118, 85,192,
+210, 26, 56,255,131,248,219,113, 86,143, 91,229,232,224,144,147,145,145, 97,103, 48, 24,224,228,228,164,151, 22, 23,111,224, 2,
+151, 76,129, 92, 0,164, 16, 88,253,253,142, 29,211, 71,140, 24,129,142, 29, 59,102,229,229,231, 55,173,169, 47, 17,128,233, 13,
+152,151, 57, 59, 63,127,248,240,161, 56, 51, 51, 19, 83,166, 76, 41,204,120,245,106,121,165,191, 86, 41,208,211,205,195, 99,195,
+177, 99,199,108,154, 53,107, 6, 95, 95,223, 60,126,102,102,171, 36,160,180,150,254, 89,235,216,148,190, 60,215,116,238,168,214,
+ 29,231,205,155, 7,189, 94,143,155, 55,111,226,193,131, 7,200,200,200,192,157, 59,119,164,102, 66,225,184,106,185, 14,107,236,
+159, 67,188,148,238,135, 15,135, 81, 28, 14, 7, 7, 14, 28, 64, 92, 92, 28, 0,192,207,207, 15,211,166, 77,131, 94,175,199,164,
+ 73,147,201,185, 36,147,212,186,250, 39,128,214, 0,190, 67,133,200,235, 72, 8,225, 83, 20,149, 3,192, 5,141,243,201,162,251,
+ 39,205, 73,115,254,123, 56,255,145,168, 55,215,225,218,159, 96,254,110,154,143, 89, 57,225,123, 66, 89, 61,122,250,251,132,134,
+ 4, 51, 58,117,234, 4, 23, 23, 23,248,249,249, 33, 51, 51,147,103, 97, 97, 81, 95, 62, 53,133,255,224, 9,105,109,218,180,177,
+ 88,190,124,185,249,192,129, 3,217, 46, 46, 46, 32,132, 32, 46, 46, 14, 17, 17, 17,229,123,247,238,149,149,217, 15,147,198, 94,
+251, 77,209,144,124,106, 15,128, 50, 0,107,156,115,114,126,158, 63,119,110,112,187,246,237,103,132,132,132, 48, 68, 2, 19,246,
+250, 85, 51,249, 0,176,246,135,227,230, 35, 2, 39,226,123, 79,160,215,132,154,243,200, 85,175,103,102,246,172,140,143, 70,245,
+243,252, 98,193,116,195,216,177, 99,133,102,102,102,112,113,113,129,165,165, 37, 82, 83, 83,145,157,157, 77,206,158, 61,171,184,
+247,248, 37,251,244,165, 71, 25,124,115,135,134,228, 37,148,251, 15,250,248,245, 71, 31,125,100, 57,117,234, 84,211, 14, 29, 58,
+176,121, 60, 30,120, 60, 30,242,243,243,145,146,146, 82,126,246,236, 89, 69,153,221,144,146,216,107,199,228, 13,204,117,168,242,
+ 31, 31,154,114,235,114,200,226,231, 79,159, 78, 54, 2,109,203,203,203,157, 12, 6, 3,197, 96, 48,114,141, 70,227,211,114,185,
+124,191,198, 47,100, 27,157,235,176, 97, 48, 24, 12, 28,131,193, 0,169, 84,138,203,151, 47,179, 94,189,122,181,250,201,147, 39,
+171,115,114,114,160,211,233, 48,102,204, 24,248,249,249,225,218,181,107, 40,200,207, 63, 91, 23, 87, 18, 80,202,203,206,158, 54,
+107,214,172,243, 97, 97, 97,140, 39, 79,158,216, 28, 56,112, 96, 95, 77, 2,102,242,228,201,198,252,204,204,105, 26,160,180,142,
+254, 89,215,216, 44,188,112,108,231,147,145,163, 3, 91,134, 4,173,102,119,235,214, 13, 54, 54, 54,232,217,179, 39,202,203,203,
+ 45, 90,180,104, 81,223,216,148,251, 15, 30,151,218,182,109, 91,225,182,109,219,196,211,167, 79,199,130, 5, 11, 0, 0, 42,149,
+ 10,151, 46, 93,194,226,197,139,243, 50, 89,157,149,245,245,207,183,150,170, 74, 1,118, 3,128, 63,128, 84,208,142,239, 52,104,
+208,248,103,162, 50,169,180, 3, 42, 18, 75,159, 67,197,203,121,253,185, 14,111, 61,120,134,234,105, 62, 42,224,144,160,119,157,
+250,106,206,210, 13,190, 76,157,204,146, 77,169,205,146, 95,190,164,234,203,121, 88,149, 79,205,220, 75, 97,157,118,180,211,250,
+181,107, 23,125,255,253,247,253, 42, 67, 56, 8, 4,130,167, 42,165,242,138,173, 70,179,189,204,220,235, 74, 99,115,243,101, 3,
+249, 0,230, 90,198,198,238, 8, 24, 49,102, 19,223,202,157,189,114,221, 94, 53,147,193,208,166,228, 20,224,123, 79, 64,216,128,
+ 5,146,101, 90,224,185,212, 65,159,111, 29,152,244,245,151, 95,126,177,118,205,154, 78, 34,145,168, 87,185, 94,239,101, 52, 26,
+ 1,163, 49,185, 76,169,188, 65,202,203, 31,106,252,130,182,240,205, 29, 72,131,243, 18, 90,180,144, 91,189, 14,239,116,112,255,
+254,133, 39, 78,156,248, 83,219,173, 53,154, 29,101, 22, 45,162, 27,210,246,234,101,212,192, 93, 72, 36,119,235, 50, 93,210,185,
+ 14, 27,248,246, 97, 52,206,182,180,180, 60,212,175, 95, 63,126,255,254,253, 49,116,232, 80,116,235,214, 13, 70,163, 17,132, 16,
+200,229,114, 28, 63,126, 28,155, 54,109, 74,110, 10,172,169,143, 79, 3, 92,225,253,254,251,144,182,109,219, 30,168, 75,192,188,
+ 21, 89,245,250, 36,214, 61, 54,121,201,122,243,225,233,227,231,175,247,212,202,114, 45,172, 5,122,241,243,103, 79, 25, 13, 31,
+155,222,114, 67,220,241,206, 99, 70,141,154,207,100,177,122,190, 93, 1, 73, 94, 36, 36,196, 86, 38,149,134,223,180,203,141,236,
+ 75,149,177,235,104,199,119, 26, 52,104,252,211,133,214, 80, 84,248,107, 85,165,228,169, 53,215, 97,165,213,135,197, 98, 73, 82,
+ 79,207,153, 88, 23, 59, 27,232,247,214,146,133,122,115, 29,190,253, 59, 29,144, 67,163,249,230,157, 96,164,213, 86, 23,178,223,
+ 43,223,152,176,136, 37, 64, 18,244,154, 0, 72, 18,128,200,185, 21,124,157,214,126, 85,189, 77,181, 62,100,223, 57, 46,167, 88,
+ 13,220,130, 66,113, 11, 10, 69,141, 78,187,108, 22,167,184,190,122,190,223,246, 76, 64,246, 87,219,254, 62,103,189,226,225, 47,
+156,207,127, 27,222, 20, 22,158, 6, 32,114,142,138,178,191, 16, 21, 53,246,139, 37, 75,198, 56, 56, 58,122,216,216,216, 88,154,
+154,154, 50,238,223,191,159,166, 87,171,119,180, 3, 14,190,181,166,214, 11, 13,112,197, 59, 51,179,213,199,163, 70,205,167, 88,
+172, 30,213, 5, 12,209,235,239,184, 3,187,234,178,100,125,232,216,116,225, 57,244,123,107,201, 2, 19,152,213,144,190,145, 93,
+ 81,143,117,208,235,215, 33, 62,190,134, 62,223,232,190,180,150,162, 40, 57,104,199,119, 26, 52,104,252,115, 81,153,239,240,220,
+255,245,129,251,211,156, 52,231, 63,136,147,137,138, 85,116,244,249,164, 57,105, 78,154,147,230,164,209, 32,176,232, 83, 64,131,
+ 70,131, 97,192, 31,211, 96, 52,104,208,160, 65,131, 70, 37, 42,125,179,170,227,103,160,194,117,167, 54, 85,218,152,213, 4, 31,
+162,108,163,105, 78,154,147,230,164, 57,105, 78,154,147,230,252,215,113,214,199,253,119, 92,205, 88,233,147, 85,229,155,245,127,
+ 5,218,172, 74,115,210,156, 52, 39,205, 73,115,210,156, 52,231, 63, 29, 14,111, 69, 86,245, 15,128, 70, 6, 44,165, 65,131, 6,
+141,127, 42, 66, 66,192, 32, 4, 20, 33, 33, 12, 66, 78, 48, 9, 9,100, 18,130,191,148, 10, 36, 48,176,230, 96,182,159, 77,180,
+ 52,165,207, 56, 13, 26,255, 40,228,162,150,164,210,180,143,214,255, 95,184,138,197,226, 61, 0,168,188,188,188,217, 0, 50,233,
+ 83,242,191, 7, 43, 43,171,126,122,189, 30, 50,153,236,202, 63,177,125, 45, 61, 48,138, 48,208,162,234, 7,130,204, 23, 41, 56,
+ 84, 83,217, 22,158,152, 2,234,143, 88, 92,148, 17, 47, 18, 94,225, 84, 35, 14,199, 24,210,223,101, 23, 0,156,143,206,154,143,
+255, 78, 92,173,230,182,182,182, 23, 89, 44, 22,203, 96, 48,204,149, 72, 36, 81,181, 11,161, 64, 38, 0,176,201,181, 21,210, 60,
+187,229,159,127, 74,177,203, 52,251,165, 26,149,178,148,201,102,190,230,177,197,183,231, 76,103,156, 47, 81,116, 77,168,105,255,
+240,240,240, 90,179,120,183,242,196, 16,134,161,229, 48,191,214,105,169,223,109,239,244,125, 47,119, 27,118, 90,214, 99,209,198,
+221,165,123,184, 22,110,195,166,140,165,162, 88, 2,106,242,254,253, 69, 10,122,148, 53, 28,235, 1,171,114,192,151,205,227,185,
+ 24,244,122,123, 10, 32, 76, 22, 43, 95,167,209,100,113,128,248, 21,128,244,159,206,201,225,241,156, 13,122,189, 61, 0,252, 47,
+214,147,198,187,168, 85,104,137, 68,162, 24, 6,131,225, 92, 61, 25,110,101, 62,193,202,223,170,111,163, 40, 10, 6,131, 33,187,
+164,164,164, 67, 35,142,111, 6, 96, 44,128,202, 37,234, 71, 0, 28,199,135, 59, 28,155,113, 56,156,165, 66,161,176,175, 74,165,
+106, 5, 0, 38, 38, 38,207,149, 74,229,213,242,242,242,239, 62,144,151, 5,224, 99,145, 72,212,135,193, 96,244, 33,132, 80,132,
+144,107, 10,133,226, 42,128, 19, 0, 62, 36, 82,130,137,157,157,221, 58, 43, 43,171, 9, 43, 86,172, 40,178,182,182,246, 94,188,
+120,241,163,226,226,226,223, 10, 11, 11, 87,161, 17, 57,234,254,203,240, 16,139,197, 71,216,108, 54, 51, 43, 43,171, 15, 0,184,
+184,184, 92,211,106,181, 6,137, 68, 50, 17,192,171, 70,242, 9, 1,116, 17,137, 68, 29, 68, 34,145,191,193, 96,104,241, 54, 63,
+227, 11,133, 66,113,179,188,188, 60, 6,192,125, 0,202,255,161, 49, 98,202, 98,177,194,222,246,117, 47, 0,242,127,218, 77,128,
+ 48,208, 34,225,121,162,119,149,240,106,229, 83,123, 97, 10,174, 53,148,109,176,208,234,219,203, 97,216,240,225, 3, 24, 0,160,
+213,157, 31,118,245, 70,238,153,255,112,115,154,143, 30, 61,250,110, 88, 88,152,165, 70,163,193,236,217,179,143, 68, 71, 71,239,
+146,201,100, 43,234,188,113,136, 44, 23,111,222,118, 73, 64, 81, 12, 0,176, 51, 26, 13,118,111,222,188,242, 74,120,118,119,240,
+243,231,247,214,171, 18,175,222, 55, 82,236, 57,229,232,153,216,144, 74,180,112, 71,192,176, 49,163,134,174, 89, 19,130, 9,227,
+ 38, 52,121,254, 92,109,226,100,150,202, 45, 86, 9, 61,173,109,237,134,175, 89, 27, 78,221,190,117,122,120,216,129,208,171,211,
+167, 91,247,165,197, 86,131, 64,173,101,177,186,152,123,122,250,143, 59,125, 26, 34, 23, 23, 22,139,199, 99, 0,128, 94,163,113,
+ 81,100,101, 57, 28, 27, 62,188,115,200,203,151,215, 67,128, 7, 52,231,255, 23, 78, 26,141, 17, 90, 12, 6,195,249,205,155, 55,
+118, 66,161,176,226,102, 76, 8, 12, 6, 3, 12, 6, 67, 85,242, 98, 66, 72,213,183, 94,175,135,143,143, 79,131,222,104, 1,244,
+ 5,240, 73,239,222,189, 3,191,251,238, 59,182,175,175,111,101,202,144,158, 43, 87,174,252, 33, 46, 46,238, 36,128,131,168, 8,
+222,216,208, 55,222, 65, 66,161,240,240,230,205,155,205, 6, 12, 24,192,114,116,116, 4, 69, 81,200,203,203,235, 18, 29, 29,221,
+ 97,241,226,197,115,149, 74,229, 36, 0, 23, 27,113,126, 90,155,154,154,134,143, 26, 53,202,185, 87,175, 94,252,150, 45, 91,194,
+ 96, 48,224,241,227,199,211, 99, 98, 98,198,159, 60,121, 50, 88, 46,151, 7,162,225,249,218, 40,145, 72, 52,213,204,204,108, 93,
+ 80, 80,144,213,164, 73,147,184,207,158, 61, 43,113,119,119,167,110,223,190,109,123,252,248,241,185, 27, 54,108,248, 88, 38,147,
+173, 82, 40, 20,191,162, 1, 57, 20, 77, 77, 77, 99, 24, 12,134,115, 67,132, 48,128,198,136,225,118, 77,155, 54, 61,126,235,214,
+173,166,233,233,233,134,145, 35, 71, 30, 2,128,171, 87,175,250,234,116, 58,106,224,192,129,231,179,179,179,199, 2,120,220,192,
+182,183,177,178,178, 58, 51, 97,194, 4, 43, 15, 15, 15, 65,211,166, 77, 41,161, 80, 8, 38,147,137,210,210, 82,199,103,207,158,
+245,127,240,224,129, 42, 58, 58,186, 88,163,209, 12, 7, 16,223,136,235,212,205,206,206,110, 50,155,205,110,173,215,235,157, 0,
+128,197, 98,189,209,233,116,207, 36, 18, 73, 24,128,187, 31, 58, 64,236,237,237,119,174, 91,183,206, 70, 34,145,144, 13, 27, 54,
+236,148,203,229, 83,255,169, 55,131, 35,191,157, 64,204,163, 7, 64, 69,218, 28,170,134,254, 71, 1,224,124,254,249, 18,116,232,
+216, 25, 19, 39,124, 92, 47,231, 71,253,156, 55,179,185, 28,107,181, 90,125,183,180, 76,115, 66, 40,224,143,157, 48, 62, 32, 25,
+ 0,206, 95,184, 62,182, 83, 39,203,107,230, 2,222,199,124, 62,191,155, 78, 91, 94,244,251,149,236, 47, 27, 35,170,156,156,156,
+ 46, 90, 90, 90, 10,138,139,139,243, 10, 10, 10,126, 26, 54,108,216,218,131, 7, 15, 90,166,165,165, 33, 43, 43, 11,139, 22, 45,
+ 18,101,103,103,207,143,143,143,191,167,213,106,107,181,108,201,229,197,219, 87, 46, 31, 17,100,110,110,195, 20, 10,204, 96,106,
+110, 5,119,143,182,232,210,109, 24,134, 12,157,129,148,228,184, 46, 7, 15,172,137,123,243, 38,250, 91,145, 85,179,181, 82,105,
+211, 90,239, 75, 45,155,163,215,240, 81, 21, 34, 43, 40, 40, 4, 47, 19, 19,229,233,175, 25,159,157, 59,205, 18, 12,233,231,195,
+211,107,243,210,111,223, 58,221,180, 71,207,145, 0,208, 33,236, 64,232,213,207, 38, 90,246,219,121,164, 68, 78, 63,146,106,191,
+119,174, 97,179,167, 14,218,182,205,206,111,238, 92,142,226,245,235,242,212,221,187,203,242,111,222, 52,176,120, 60,226, 50,120,
+ 48,101,219,167, 15,127,238,139, 23,156, 59, 27, 54,248,179, 67, 67,221, 87,149,151, 31,166, 57,255, 79, 57,255,237,168,116,130,
+175,190,250,240,231, 58,133, 22, 69, 81, 16, 10,133, 56,118,236, 24,216,108, 54, 88, 44, 22,216,108,118,173,127,187,186,186, 54,
+164, 34,163,197, 98,241, 15,187,118,237,178, 31, 52,104, 16,248,124,126,213, 6, 38,147,137, 1, 3, 6,160,127,255,254,236,156,
+156,156,241,199,142, 29, 27,191,126,253,250,124,169, 84,186, 0,111, 19, 67,215,129, 62,222,222,222, 17,151, 46, 93, 50, 81,171,
+213,184,121,243, 38, 74, 74, 74,192,229,114,225,236,236,140,129, 3, 7,178, 18, 19, 19,173, 6, 12, 24, 16,241,242,229,203, 0,
+ 0,215, 26, 80,215, 14,118,118,118, 55, 78,156, 56,193,111,219,182, 45,149,146,146, 2, 63, 63, 63, 0, 64,105,105, 41, 70,142,
+ 28,201,159, 52,105,146,199,248,241,227,239, 75, 36,146, 94, 0, 98,234,225,107, 47, 22,139,127, 29, 53,106,148,227,250,245,235,
+205, 76, 77, 77,145,158,158,158, 43, 22,139,189, 42,207,247,248,241,227,185,195,134, 13,115,216,180,105,211,246,240,240,240, 47,
+ 37, 18,201, 84, 0,177,117,170,214,183,130, 88, 32, 16, 32, 63, 63, 31, 71,142, 28,193,252,249,243,193,100, 50, 33,145, 72,112,
+252,248,113,124,246,217,103,149,130,166, 65, 98, 88, 32, 16,244,247,244,244,220,119,245,234, 85,103, 11, 11, 11, 56, 58, 58, 50,
+190,254,250,235,214,238,238,238, 38, 77,154, 52, 97,230,230,230, 34, 34, 34,194,125,242,228,201,103, 50, 51, 51,167,107, 52,154,
+122,167,212,236,237,237,247,159, 59,119,206,245,249,243,231,216,189,123, 55,138,139,139,193,229,114, 97, 97, 97, 1,177, 88, 12,
+ 47, 47, 47,106,249,242,229,130, 97,195,134, 9, 22, 44, 88,176, 95,171,213,182,107,192, 53,106,107,103,103,183,167, 79,159, 62,
+238,161,161,161, 22, 98,177, 24,149, 47, 6,165,165,165,206,233,233,233, 93,130,130,130, 2, 99, 98, 98,210, 36, 18,201, 28, 0,
+ 79, 26, 57,112,218,181,108,217, 50, 96,228,200,145,204,220,220, 92,132,133,133, 5,200,229,242,118,141, 16,151,127, 43,196, 60,
+122,128,217,243, 22, 41, 28, 93, 92, 56,151, 46,238, 27, 29,126,170,249, 35, 11,147,138,132,212, 82, 21,202, 3, 71,189,236, 56,
+112,208, 12,206, 71, 67, 71, 42,126,254,113,187,168, 33, 66,139,205,229, 88, 31, 57,188, 53,243,214,237,152,214,151,163, 31, 12,
+ 30, 61,124, 56,225,112, 44,220, 1,224,203,197,159,179, 35, 34, 35, 15, 12,232,223, 57,167,103,143, 14,153, 19, 39, 45,113,109,
+ 68,117,155, 55,111,222,252,122, 92, 92,156, 61,143,199, 67,113,113,177,245,207, 63,255,188,181, 71,143, 30,140,212,212, 84, 36,
+ 38, 38,226,245,235,215, 40, 45, 45,197,128, 1, 3, 68,177,177,177, 63, 1,168, 85,104,149, 51,250,174,115,108,162,219, 97,109,
+ 34,108, 90,110,144,217, 17, 93,110,203,203,231, 46,183, 57, 26,166,242,179,119,240,241,250,100, 90, 48,214,172, 61,201,254,237,
+200,198,160, 43,209, 71, 1, 70,211,218, 51, 2, 16,116, 91,185,106, 5,100,114, 13, 38, 77,152,133,201, 19,102, 89, 19,104, 29,
+136, 65, 45,212,170, 74, 44, 76, 57, 47,162,118,237,221, 58, 10,128,115, 53,177,117,133, 22, 91,181, 99, 13,139,213, 57,224,135,
+ 31,108, 91,207,156,201,123, 18, 26,170, 44,188,121, 83,229,249,209, 71, 37,126,159,126,170, 1, 0,249,235,215,156,151,193,193,
+ 2, 91,127,127,147,174, 75,151, 90, 26,180, 90,241,154, 53,107, 58, 5, 85, 36, 47,111, 20,167,235,216,177,134,160, 3, 7, 58,
+222, 92,178,164, 55,165,211, 49, 7,119,237,250,120, 67, 88,216,155,191,194,249,159,172,103,206,141, 27,154, 98,119,119,248,141,
+ 28, 89,228,106,103,167,249, 79,182,253,175,212,147, 70, 21, 42,125,181,102, 87,127, 67, 69, 84, 84, 84, 47, 0,215, 1,132, 6,
+ 4, 4,132, 0,128,185,185,121,190, 84, 42,181,139,136,136,168, 87,100,177,217,108, 56, 56, 56,192,203,203, 75, 34,145, 72,236,
+235,168, 64,150,209,104,116, 38,132, 84, 89, 95,106,131, 70,163, 65,114,114, 50,218,180,105,147,141,138, 68,180,181, 26,117, 4,
+ 2, 65,106, 98, 98,162, 77, 66, 66, 2, 98, 98, 98,224,238,238, 14, 75, 75, 75,176,217,108,232,116, 58,200,100, 50,120,123,123,
+131,199,227,161,125,251,246,133, 74,165,210,189,158, 41, 32,158, 80, 40, 76,190,113,227,134,139,159,159, 31, 30, 62,124, 8, 23,
+ 23, 23,136,197, 98, 0,192,235,215,175,113,251,246,109,124,244,209, 71,136,139,139,195,152, 49, 99,178,148, 74,165, 23, 0, 77,
+109,132, 86, 86, 86,185, 87,175, 94,205,246,245,245, 85, 43,149, 74, 70,126,126, 62,251,230,205,155,122,185, 92, 46, 42, 45, 45,
+101, 75,165, 82,182, 76, 38, 99, 41,149, 74, 54,131,193,224,168, 84, 42,246,149, 43, 87,152,229,229,229,117, 6,200,172,188, 78,
+145,145,145,240,245,245, 69, 68, 68, 4,190,248,226, 11,220,185,115, 7, 46, 46, 46, 56,113,226, 4,150, 46, 93,138,164,164, 36,
+216,216,216,160,101,203,150,245, 93, 35,120,120,120,164, 60,125,250,212,131,195,225, 84,230,117,172,204,151,135,130,130, 2,188,
+122,245, 10,111,222,188,129,167,167, 39, 38, 76,152,240,234,205,155, 55,158,245,245, 60, 39, 39,167,130,231,207,159,219,180,105,
+211, 6,249,249,249,176,176,176,128,185,185, 57, 44, 44, 44,170,254,118,119,119,199,146, 37, 75, 32, 22,139, 37,106,181,218,190,
+ 62, 17,228,235,235,123,241,202,149, 43, 54,102,102,102,200,203,203,131, 76, 38, 3,139,197,130, 64, 32,128,141,141, 77,149,144,
+ 79, 78, 78,198,208,161, 67, 11, 83, 83, 83, 7, 53, 66, 36, 49,236,237,237, 19,227,227,227,189, 8, 33,200,204,204, 68, 82, 82,
+ 18,230,205,155,151,172, 86,171,125,240, 15,202,217, 87,205,239,138, 51,117,218,108,206,168, 17,221,180, 47,158, 71, 81, 60, 99,
+ 18,218,181, 54, 43, 5,128,199,207,100,230, 26,134, 55, 90,180, 10, 32,167,206,220,229,254,122,240,103, 54,140,176, 7,133,164,
+ 23,201,248,166, 54,238,129,125, 28,102,126,254,249,244,214,189,123,244, 98,200,149, 74,187,159,126,218,214, 62, 53,245,133, 29,
+ 0,184,187,183,144,204,157,187, 56,214, 84, 40,148, 92,191,125,195,248,253,247,251,159, 93,186,150,187,183, 1, 85,118,247,242,
+242,186, 23, 25, 25,105, 99,103,103, 7,115,115,115, 40,149, 74,148,151,151, 35, 33, 33, 65,125,236,216, 49,157,153,153,153,105,
+ 94, 94, 30,164, 82, 41, 40,138, 66,100,100,100, 38, 0,183,247,137, 42,125,180, 0, 96,222,144, 22,236,150,125,189, 44, 57, 60,
+189,137, 9,251,165, 3, 40, 3,143, 34, 34,251,243, 23, 31,183, 57,127,249,225,196, 81,163,191,176,237,217,107, 20,130, 86, 7,
+234,114,114, 50,253,202,209, 51,177, 38, 31, 45, 31, 79,244, 29, 57,102,212,199,107,214,132, 32, 36, 40, 20, 81,145,167, 75, 69,
+ 66,134,198,204,130,109,238,223,165,187,122,201,252, 17, 89, 10, 69,142,203,154, 77,199, 38, 12, 29,177,196,185, 71,207,145,184,
+125,235, 52,194, 14,132,198, 80, 38,132,158, 70,124, 15, 33,128,165,133,187,251,156,133,201,201,156, 39, 33, 33, 10,125, 78, 78,
+ 73,135,197,139, 11,107, 42,155,125,249,178,144,235,232,104,102, 57,124,184,213,118, 55, 55,162,147, 72,246,212,228, 99, 84, 19,
+103,180, 72,100,113,244,252,249,126,132,205,238,181,236,171,175, 76, 2, 2, 2, 32,147,201,112,242,228, 73,236,217,189, 91,227,
+224,224,240,212,241,217,179,184,214, 50,217,234,134,114,118, 88,188,184,208, 96, 48, 80, 31, 47, 93, 58,224,249,235,215,125,243,
+ 36,146, 38, 0,224, 96,101,149,213,193,221, 61,102,127, 84, 84,210,206,166, 77,141, 13,173,231, 47, 23, 46,216,135,167,167,207,
+180,178,178, 50,201,151, 72, 88, 60, 46,183,168, 75,203,150, 39,126, 92,181,234,186, 62, 62,158,195,119,118, 54, 51, 15, 8,104,
+116,219, 59, 44, 94, 92, 88, 44,151,179, 22,174, 93,219, 61, 35, 63,191,137, 66,163,241,148,202,229, 98,131, 78,199, 48, 19, 8,
+138,154,121,123, 75, 84, 55,111,230, 54, 43, 43, 91,180, 23,144,252,183,174,117, 77, 90,228,111,132,247,227,104,253, 41,215,225,
+245,128,128,128, 63,173,174, 33,132, 52,200,154,197,102,179,223,153,166,170, 3, 28,138,162, 16, 27, 27, 11,107,107,107,136,197,
+ 98,240,120,239, 38, 31, 44, 40, 40,192,157, 59,119,240,226,197, 11,180,109,219,182,114, 26,163,118, 69,196,227,125,190,105,211,
+ 38, 11,173, 86,139,152,152, 24,116,232,208, 1, 60, 30, 15, 28, 14,231, 29, 17, 40,145, 72,208,170, 85, 43, 44, 91,182,204,124,
+253,250,245,159,107, 52,154, 90,223, 72, 89, 44,214,130, 89,179,102,217, 85, 90,176,178,178,178,208,190,125,251,170,237,182,182,
+182,120,252,248, 49, 58,116,232, 0,103,103,103, 4, 6, 6,218,133,133,133, 45,208,235,245,223,213,198,201,229,114, 25,190,190,
+190, 29, 1, 64, 40, 20,130,193, 96,188, 52, 51, 51,179,181,183,183, 23,154,153,153,253,169,141, 7, 14, 28,144, 50, 24, 12, 93,
+189,106,128,193, 64, 94, 94, 30, 90,183,110,141,210,210,138, 12, 46, 74,165, 18,158,158,158,144,201,100, 85,162,213,209,209, 17,
+ 42, 85,221,174, 95,109,218,180, 9,241,241,241, 25, 40, 20, 10,121,108, 54, 27, 79,158, 60,129,159,159, 31,142, 29, 59, 6, 87,
+ 87, 87, 8, 4, 2, 36, 39, 39,195,215,215, 23, 55,110,220,128,173,173, 45, 90,181,106,197,179,179,179,187, 85, 92, 92,124, 45,
+ 35, 35, 35,164,142,122, 50, 68, 34, 17,110,220,184,129,253,251,247,227,245,235,215,200,201,201,129,169,169, 41,218,181,107,135,
+150, 45, 91,162, 91,183,110, 72, 78, 78, 6, 85,127,103, 18,123,121,121, 69, 61,124,248,208,134, 16,130,176,176, 48, 40, 20, 10,
+104,181, 90, 48, 24, 12,240,249,124, 88, 90, 90,162,111,223,190,176,181,181,133,151,151, 23,142, 31, 63,110, 51,100,200,144,223,
+ 37, 18, 73, 59, 0,121,245,157, 87, 75, 75,203, 69,193,193,193, 46,118,118,118, 72, 79, 79, 71,105,105, 41,236,237,237,209,187,
+119,111,167,232,232,232, 69, 58,157,110,219, 63,229, 65, 86,205,241,157,186,116,113,223,104,175,102, 37,190,109,189, 5, 46, 17,
+ 81,246, 46,199,162, 36,173, 0,160,117, 11,251,231,163, 3, 4, 89, 79,158, 71,101, 93,186,120, 58,230,197, 75, 68,160, 1, 83,
+219,165,101,154, 19,151,163, 31, 12,246,107,219,222,184,105,227,210,161,243,231,205,228,217,217,207, 64,126,230,105, 68, 95,141,
+117, 93,250,197, 44,219,239,182,252,114,254,114,244, 3, 70,105,153,102,117,195, 76, 89,174, 59, 15,254,216,205, 70, 94, 24,142,
+148, 68, 46, 76, 76, 91,195,221,189, 57,100, 50, 25,248,124, 62,127,194,132, 9,134, 21, 43, 86,148,153,153,153, 9, 40,138,194,
+181,107,215, 36, 0, 6,213,199,171,182,179, 36,134,114,157,158,112,153, 70, 66,153,170, 40, 67, 49,247, 89, 66, 26, 6,246,239,
+147,223,163,115,235,245, 43,214,108, 89,233,213,220,207,118,250,204, 80,246,218,144,137,187, 65,161,103, 77, 60,137, 41,184, 74,
+157, 56,101, 2, 96,232,154,111, 66,144,154,154,108, 57,251, 19,105, 40,139,103,226,232,227,214,221,116,247,254,107,131, 61, 61,
+155, 54, 89,178, 32,240,220,214, 31,182, 14,173,110,217, 58,120, 32,248, 12,128,126, 13, 57,183,255, 34,180,153, 28, 21, 5, 69,
+102,166,174,248,214, 45,117,191, 31,126, 40,116, 25, 52,104,155,182,188,220,166,242, 86,193,160, 40, 80,149,174, 19, 70, 35,197,
+ 90,182,140, 65, 88, 44,232, 44, 45, 63, 65, 73, 73,243,250, 56,191,200,205, 29, 61,113,230,204,161,103, 46, 92, 64,211,166, 77,
+171,158,103, 22, 22, 22, 88,186,116, 41, 22, 47, 94,204,123,252,248,113,167,240,240,240, 78,223,109,222,108, 15, 96,116, 67,234,
+121,233,254,125,203, 79,215,172, 89,213,182, 67, 7,215, 67, 71,142,240, 60, 60, 60, 0, 0,175, 94,189,242,218,184, 97,131, 91,
+107, 95,223,252,245,159,127,126,240,249,138, 21,173, 0,220,170,139, 51,239,230, 77,109,120,122,250,204,171,215,174, 89,180,110,
+221, 26, 0,144,148,148,100,183,125,251,246, 89,173, 2, 3, 39,173,153, 59,119,117,128, 90, 45, 53, 43, 40,224, 5,236,220,201,
+ 58,250,241,199,245,114, 86,214, 19, 0,122, 79,159,254,121,207, 62,125, 90,142,158, 57,211,202,213,213,149, 18,137, 68, 40, 47,
+ 47, 71, 78, 78,142,229,243,231,207, 61,162,228,114,217,169,251,247,195, 96, 48, 12,248, 47, 94,235, 26,181,200,223,204,146,245,
+103, 77,241,246,187,119, 84, 84, 20, 1,208, 59, 32, 32,224, 70,229, 3,220, 96, 48, 52, 72,100,177, 88, 44, 80, 20,213, 80,177,
+ 5, 66, 8, 10, 11, 11, 81, 88, 88, 88, 53,117, 36,145, 72,112,245,234, 85, 36, 39, 39,131,205,102,131,195,225,160,188,188,254,
+ 28,180, 66,161,176,127,255,254,253, 89,247,239,223,135,187,187, 59, 76, 76, 76,170,234, 85,249,225,112, 56,112,112,112,128, 76,
+ 38, 67,191,126,253,216, 59,118,236,232, 95,151,208, 50, 55, 55,255,104,236,216,177,220,202,255, 21, 10, 5,152, 76,102,149,104,
+ 81, 40, 20, 40, 46, 46,134, 84, 42,133, 90,173, 70,215,174, 93,185, 81, 81, 81, 31, 21, 21, 21,125,215,144,246,151,149,149, 41,
+ 36, 18,137, 69,207,158, 61, 45, 15, 30, 60,152,212,181,107, 87,239,119,122,218,245,235,106,181, 90,205,102, 48, 24, 13,202,163,
+119,248,240,225,170,115,255,230,205, 27,236,222,189,187,106, 91,114,114, 50,118,236,216, 1, 66, 8, 8, 33,117, 94, 35, 31, 31,
+159, 33, 97, 97, 97, 29, 14, 29, 58, 84,194,100, 50,145,148,148,132, 35, 71,142,128, 16, 2, 91, 91, 91,148,149,149, 33, 63, 63,
+ 31,215,174, 93,131, 94,175,135, 72, 36,130,147,147, 19,127,193,130, 5, 61, 66, 67, 67,217,117, 9, 45,131,193, 96, 96, 50,153,
+112,115,115, 67, 80, 80, 16,212,106, 53, 56,156, 10,125, 41,147,201, 32,149, 74, 17, 23, 23,135,244,244,116, 16, 66,234,124,200,
+240,249,252,192, 67,135, 14,217,113,185, 92,168, 84, 42,200,229,114,100,101,101, 33, 35, 35, 67, 45,145, 72,244,166,166,166, 12,
+ 55, 55, 55, 6,143,199,227,141, 28, 57,146,170, 20,156, 1, 1, 1,214, 97, 97, 97,227,180, 90,109,125, 34,201, 86, 44, 22,175,
+156, 53,107, 22,191,122,159,205,203,203,195,232,209,163, 5,119,239,222, 93, 33,147,201,142, 0, 40,248,135, 61,208, 72,248,169,
+230,143, 98,162,147,124, 35,162,236, 93, 50,178, 13,221,151,126,185,133, 5, 0, 63,239,249,182,123, 68,212,155, 59, 62, 77,243,
+179,194, 79, 53,127,100,105,249,162, 62, 33,192,232,219,203, 97,152, 80,192, 31, 59,122,248,112,242,211, 79,219,218,207,159, 55,
+147,231,214,124,105,133,133,147,109,135,126,250,111,168, 50,213, 43,254, 79, 63,109,107, 63,122,248,152,184,215,175,211,247,244,
+237,197, 59,126,245, 70,238,217,186, 44,134,118,214,124, 39, 1, 79, 9, 39,247,150,240,110, 33,196,227, 39, 73, 56,121,226, 30,
+ 90,180,234, 2,141, 70, 3,189, 94, 47, 28, 54,108, 88,217,177, 99,199,212, 47, 95,190,148,171, 84,170, 94, 0, 94,214,215,248,
+236,236, 4,163,183,184, 75, 57,199,132,167,151,151,114,202,150,175, 14,255,184,125,231,129, 29, 44, 29,156,216,182, 66,227,217,
+ 33, 3, 58, 29,217,191, 55,104,241,234,224, 35,232,216,105, 96,215, 23, 73,183, 90, 2,120, 90,163,120, 77, 69, 20,227,228, 41,
+125,106, 74,202,208,140,244,244,236,230,246, 98,237, 43, 41,209, 45, 90,254,203,128,158,189, 2,219,120,180,240,231,190, 72,184,
+ 65, 5, 45, 27,247,219,154, 77, 91, 39, 84,138,173, 43,151,127,235,245,201, 39,247,184, 7, 15,214,110, 29,255,183,129,195,227,
+ 57,139,220,220, 88,175, 15, 30, 84,185, 15, 27, 86, 2, 0,218,242,114,155,215,233,233,230, 2,129, 0,132, 16,232,116,186,119,
+124,136, 43,253,134, 91,123,123,219, 55,132,243,245,215, 95,183, 89,182,108, 25,242,242,242,160,215,235,193,102,179,223,191,103,
+ 67,169, 84,226,147, 79, 62,193,206,205,155,187, 52,132,211, 96, 48, 80,159,174, 89,179,234,171, 85,171, 60,230,204,153,195,168,
+126,239,181,178,178, 66,248,201,147,220, 93,187,118, 57,175,220,185,243,147,137, 60, 94, 42, 52,154, 58, 57, 11, 61, 61, 97,149,
+159,111, 82, 41,178, 0,192,219,219, 27,187,119,239,230,205,152, 49,131, 59,108,216,176, 45,143,219,182,221,190,173, 71,143, 20,
+235,230,205,205,184, 60,158,115,125,156,149,231, 19, 0,228,106,117,235,109,219,183, 91, 62,120,240, 0,249,249,249,200,203,171,
+120, 31,165, 40, 10, 29, 59,118,164, 38, 79,158,108,222,204,197,165, 19, 12,134,255,230,229,254,147, 22,249, 27, 97,118, 13,191,
+253,225,163,245,182, 65,212,219, 6, 82,213, 30,142,239, 8,150,250,132,214,135, 64, 42,149, 66, 42,149, 98,239,222,189,224,112,
+ 56, 85, 15, 95, 0,208,106,181, 13, 17, 45,190,142,142,142, 40, 45, 45, 69,243,230,205,223,177,100,113, 56, 28,176, 88, 44,112,
+ 56, 28,240,120, 60,104, 52, 26,184,186,186,162,172,172,204,183, 46, 78,149, 74,213,206,202,202,170,234, 1,171,121,219, 89, 53,
+ 26, 77, 85,125,181, 90, 45, 74, 74, 74,160, 80, 40, 32,151,203,161, 84, 42,253, 26,210, 94,163,209,136,103,207,158,189,242,246,
+246,110,199,100, 50, 33, 18,137,132, 74,165,178,202,183,168,184,184, 24,191,254,250,171,114,202,148, 41, 54,145,145,145,245, 10,
+ 45,138,162,240,217,103,159,129,199,227,161,172,172, 12, 63,253,244, 19, 22, 46, 92, 8, 14,135, 3,185, 92,142,221,187,119, 99,
+201,146, 37, 96,177, 88,208,106,181,216,190,125,123,173, 92, 9, 9, 9,175,239,223,191,239,215,190,125,123,203, 83,167, 78, 21,
+ 12, 24, 48,192,118,208,160, 65, 48, 49, 49,129, 74,165,130, 78,167, 67,151, 46, 93,224,227,227, 3,137, 68,130,243,231,207, 23,
+122,121,121,217, 60,120,240,192,152,151,151,151,241,255,216,187,238,240, 40,170,246,123,102,123, 73,175,164,144, 80, 34,164,211,
+ 12,160,244, 18, 90, 18, 12,162, 20, 69, 81, 81,154, 5, 20, 68, 16, 5, 68, 52,128,162,136,130, 82, 44, 96, 16,144,110,168, 1,
+ 19,144, 34, 66, 8, 37, 29, 2,169,187,201,110, 54,201,110,178,125,218,239, 15,146,124, 33, 38,217, 77,192,239,167,126,115,158,
+103,159,157,157,189,115,230,222,185,119,102,206,125,239,123,223,107, 67, 92,179,141, 44,134,160,105, 26,229,229,229,168,174,174,
+134, 90,173,134, 66,161, 64, 73, 73, 9, 4, 2, 1,108,232, 44,120,120,120, 60, 21, 25, 25,201, 7, 0,153, 76,134,222,189,123,
+ 99,233,210,165,148,209,104,156, 12,224, 88, 93,178,113, 91, 22,186,136,224, 0, 0, 32, 0, 73, 68, 65, 84,183,110, 61,112,238,
+220, 57,129,159,159, 31,178,179,179,225,229,229, 37,144, 74,165, 54,133,150,143,143,207,247,191,252,242,139,123,189,184,174,191,
+206, 6,195,189,234,152, 56,113,162,251,142, 29, 59,190,167, 40, 42,230,223,246, 82,115,149, 65,212, 59,210, 89,187, 59, 73, 21,
+177,240,237,117,130,208,200,123,157,215,153,179, 32,248,244,147, 5, 17,211,226,157,143,184,202,116, 34, 91, 60,227,162, 3, 54,
+ 62,241,196, 40,222, 51, 83,227,242, 68, 34,215,160,205, 91, 62,240,246,238, 48,163,145, 12,115,134,135,167, 51,130, 58,137,137,
+189, 71,178,188, 23, 47,249,208,156,184,227,179,252,159,118, 37,141, 21, 11,147, 71, 31, 59, 85, 60,167, 37,238,220,219,213,135,
+ 13,102,105,152, 78,115,157,112,239, 48, 16,189,123,133,192,219,171, 10, 91,191,223,141, 46, 93,251,194,108, 54,195,217,217, 89,
+ 78,211,180,149,207,231, 39,218, 35,178, 0,224,244,233,106, 38, 34,162,218,194,175, 97,168, 87,223,248,244,201, 81,227,158, 8,
+ 31, 49, 34,154, 57,153,124,210, 58,176,143, 85, 57,110, 76,239,242,227,201, 27,243,148,138, 59,221, 35,122, 12, 66,102, 70,202,
+ 88,150,197, 77,130,104,222,250,148,113, 11,199, 77, 76,102,202,238,221, 51, 25, 35,115, 85,182,234,163, 27,227, 98, 99,167, 71,
+ 14, 25, 60,132, 73, 62,245,171, 69,140,138, 44,231, 65, 3, 74, 95,125,121,220,129,111, 19,191, 24,125,252,216,247,221,180,186,
+194, 36, 78,100, 53,233,164, 81, 84, 7,129, 68,194, 83,167,164, 80, 61,102,204, 48,215,223,143,114,185, 28,135, 14, 29,130, 88,
+ 44,110,248,136, 68,162,134,237, 14, 29, 58,128,168,155, 70,106, 15, 39, 0, 40,149, 74,148,149,149,193,197,197, 5, 94, 94, 94,
+ 40, 43, 43,195,133, 11, 23,144,155,155, 11,161, 80,136,177, 99,199,130,215,130,111,115, 83,206, 73, 11, 23,142, 10,235,209, 35,
+176,169,200, 2, 0,171,213,138,202,202, 74,196,199,199,243,142, 29, 59,230,115,188,168,232, 9, 0,137,173,113,246,137,141,213,
+148,239,221,219,236,185, 31,125,244, 81,226,252,249,243,146,177, 99,198,188,185,224,163,143, 54,126,185, 99, 71, 49, 77, 81, 62,
+109, 41, 59,143,199,227, 17, 4,129,128,128, 0, 84, 86, 86,162,182,246,222, 8,182,163,163, 35,220,220,220, 64,146, 36, 24,150,
+ 21,254,149,117,221,146, 22,249,135, 96, 75, 35,193,181,229, 79, 22,173,186, 66, 1,192,176,198, 47, 22,134, 97,236, 18, 89, 66,
+161,208,166,207,149, 61, 86,174,166,176, 71,104,213,231, 85, 42,149, 54,220,104,141, 5, 86,125, 62,121, 60, 30,248,124,190,205,
+151,120,157, 24,226,215,212,212, 96,223,190,125, 24, 58,116,104,195,176,148, 86,171, 69,117,117, 53,180, 90, 45, 76, 38, 19,238,
+222,189,139,211,167, 79,163, 91,183,110,128,157,193, 95,243,243,243,175,116,233,210, 37,170,254, 37, 62,124,248,240,142, 63,252,
+240,131, 34, 38, 38,198,143,101, 89,188,247,222,123, 21,143, 61,246,152,103,227,151,188, 45,240,249,124, 92,184,112, 1,221,186,
+117, 3,203,178, 16,137, 68,200,201,201,129,183,183, 55, 24,134,129, 64, 32,128, 90,173,134,147, 83,235, 49, 18,111,222,188,249,
+226, 75, 47,189,164,112,113,113,233,169,209,104,148, 18,137,100,240,217,179,103, 3,172, 86, 43,156,157,157,225,236,236,140,163,
+ 71,143,194,213,213, 21,243,231,207, 47, 50, 26,141, 23, 28, 28, 28, 58, 24,141,198,235,101,101,101,239,181,165,190, 41,138,130,
+ 94,175, 71, 85, 85, 21, 42, 43, 43,161,211,233, 96, 50,153,108,230,177, 57, 12, 30, 60, 24, 73, 73, 73,252,132,132,132,111,243,
+243,243, 1, 0, 65, 65, 65,152, 63,127, 62,223,223,223, 31,119,239,222,197,149, 43, 87, 96,181, 90,193,178,108,171, 55,175, 64,
+ 32, 24,254,252,243,207, 15, 10, 12, 12, 36,172, 86, 43, 24,134,129,217,108, 70,253,118, 81, 81, 17,194,194,194,120,157, 58,117,
+122, 60, 63, 63,127, 56,236,155, 88,193, 1, 64,121,209, 65,248, 11,189, 1,158, 51, 88,227, 65,104, 42,218, 23,197, 69,165, 82,
+125,180,232,253,243, 51,190, 92,107,237, 80,162, 4, 66, 34, 39,160,123,248, 72,188,248, 28,133,132, 79,246, 33,176, 83, 8, 10,
+ 11, 11, 49,124,248,112,145, 66,161,120,169,182,182,118,161,189,220,201,201,191,211, 39,143, 30,123,122,210,148,233, 81,209,209,
+ 49,212,137, 19, 71,113,243,250,137,140,151,166, 60,165, 98,153, 90,194,221, 85,118, 53, 39,251,114,247,158,189,135,193, 66,209,
+131,129, 21,107,129, 21,108,203,247, 59, 44, 71,142,248,242,142, 28,252,254,185,103,166,189,208,107,228,200,209,228,137,228, 95,
+112,229, 98,242,181,117,107, 95, 57,147,240,197,158,225,163,198, 62, 21,225,213,225,194,209,200, 96,243,203, 1, 30, 46,183,183,
+254, 80,201, 53,150,230,238, 77,169,148, 65,221,115,145, 71, 16, 96, 89,246, 62,145,213, 84,104,241,120, 60,155, 6,128,198,156,
+141,223, 69,245, 29,234,205,155, 55, 67, 34,145, 64, 44, 22, 67, 40, 20,218,116,191,104,204,153,113,247,238,136,237,137,137,146,
+230, 68,150, 70,163,129, 70,163, 65,109,109, 45,166, 78,157, 42,250,224,242,229, 71, 81,231,250,209, 18,103,160,175,175,217, 65,
+ 38, 43,207,204,204,244, 11, 15, 15,191, 47,191, 58,157, 14, 50,153, 12,137, 59,119,138,226, 98, 99,231,142, 60,122,116, 29,108,
+196,191,106,174,236, 4, 65,192,219,219, 27,110,110,110, 32, 8, 2, 20, 69,161,172,172, 12, 25, 25, 25,184,124,249, 50,248, 4,
+ 65,253,149,117,220,156, 22,249, 7, 90,181,182, 52, 59,116,216,210,152,104, 91,132, 22,159,207,111,183, 85,171, 37,216, 51,116,
+ 40,151,203,111, 40, 20,138,129,254,254,254,160, 40,170, 65,104, 53, 29, 58,172,183,126,164,167,167, 67, 46,151,223, 48,153, 76,
+173,114,178, 44,251,120,191,126,253,176,127,255,126,164,164,164,224,206,157, 59, 48, 24, 12, 48,155,205, 48, 26,141,200,200,200,
+ 0,195, 48,136,140,140,132,131,131, 3,228,114,249, 13,179,185,245,142,168, 94,175, 87, 10,133,194, 16,153, 76,214,176,207,215,
+215, 23, 26,141,134, 33, 73, 18,219,183,111,215,249,248,248, 56,200,100, 50,187,133, 43, 65, 16, 80,169, 84,232,216,177, 99,131,
+143, 86, 77, 77, 13,188,189,189,235,133, 5,204,102, 51,156,156,156,108, 14, 29, 2, 48,221,186,117,107, 65,163,223,125, 39, 77,
+154,244,211,238,221,187,187,158, 58,117, 10,151, 46, 93,130,151,151, 23, 62,254,248,227, 59, 5, 5, 5,207, 0,184,172, 82, 61,
+ 92,191, 72,123,218,144, 70,163,217,119,227,198,141,199,251,245,235,215,240,148, 24, 62,124, 56, 49,124,248,112,207,198,166,126,
+181, 90,141, 63,254,248, 3,167, 78,157, 2, 65, 16,200,203,203,163,141, 70,227, 79,173,141, 82,248,251,251,255,176,116,233, 82,
+ 71,138,162, 26,218,182, 76, 38,131, 84, 42,133, 72, 36, 2,159,207, 71, 65, 65, 1,226,227,227, 93,190,250,234,171,239,205,102,
+243, 35, 0,172,248,151,160,218, 8,107,250, 77,157, 75,100, 88,135,140, 45,155, 19, 6,206,156,133,250,161, 67, 42, 50,204, 59,
+ 35,253,102,185, 75,148,183,237,242, 30, 59, 85,252,170,133, 60, 54,254,216,241,212,201,111,191, 57, 95, 24, 20, 20,166, 58,245,
+107, 90,224, 72,234, 67,194,195,211, 25,154, 10, 29, 10,138,202,145, 95,104, 97,131,130,194, 84, 87,254,184, 33,249,228,243,245,
+221,245, 6, 83,253,208, 97,171,237,244,183, 11,119, 38,172,219, 32, 57, 51,253,165,190, 98,153,204, 15,149, 21, 55, 16, 24,232,
+133,248,184,158,248,110,199, 5,184,184,184,163, 67,135, 14,224,241,120, 14,246,150,189,162,162,130,216,183,235,183, 25,207,191,
+240,202, 99, 99, 70,199, 82,199, 79, 28, 17,164,156, 60,124,225,251, 45,239, 30, 96,249,122, 57,193,214,200, 58,119,241,185,126,
+251, 86,250, 51, 35,162,167, 66, 38,114,234, 6,132, 54,219, 96, 27, 38, 24,176, 40,218,191,123,133,244,249, 23,102, 14, 24, 51,
+230, 9,234,196,137,131, 56,113,116,199,239,203,151,119, 62,122,167,116,167,232,226,229, 18,233,132,167,231, 84, 37, 29,203,178,
+ 60, 53,190, 75,174,159, 67,111, 35,112,135, 83, 85,141, 59,146, 2, 65, 57,101, 54, 7,116, 28, 51,134,111, 40, 44, 20, 58,118,
+232, 64, 1, 0, 73,146, 54,133, 22, 90, 24,130,110,202,105,111, 94, 12, 6, 3,152, 22, 98, 39, 54,229, 44, 83,169, 58,215,117,
+194, 27, 64,146,100,131,200,210,104, 52,168,174,174,134,131,131, 3,212,102,115, 7,123, 56, 71,247,239,191,253,131, 21, 43, 22,
+238,221,183, 79,212, 88,100,213,127,132, 66, 33,214,172, 93, 43,122,227,237,183,231,204, 21, 8,230,129,162,236,190,158,245,157,
+118, 62,159, 15,129, 64,128,194,194, 66, 20, 21, 21,161,176,176, 16,133,133,133,144,201,100, 96,255,226, 73, 64,255, 96,255,172,
+122,145,213,248,187,193,202,213,106,120,135,182, 56,195,219, 43, 12,232, 54,140,239,218, 35,180,244,122,253,169,211,167, 79,247,
+159, 48, 97,130,224,247,223,127,135,143,143, 79,131,208,170,255,174, 31,142,146,203,229, 56,112,224,128, 85,175,215,159,178,113,
+ 51,157, 62,122,244,104,212,178,101,203,132, 47,190,248, 34, 50, 51, 51, 49,107,214, 44, 84, 87, 87, 67,167,211, 65,163,209,192,
+ 96, 48,160,127,255,254,144, 74,165,184,126,253, 58,105, 48, 24, 78,219,176,216,177, 42,149,170,214,203,203,203,183,233,127, 79,
+ 63,253,116,135, 77,155, 54, 25,178,179,179,201,129, 3, 7, 58,219, 43, 56,234,177,107,215,174, 6, 75, 93,110,110, 46, 54,109,
+218,212,224,147,149,150,150,134, 79, 63,253,180, 33,246, 89, 27,113,185,162,162,130, 34, 73, 18,221,186,117,131,191,191, 63, 76,
+ 38, 19,214,175, 95, 79, 1,184,252,255,213,154, 77, 38,211,222,233,211,167,191,115,245,234, 85, 95,129, 64,112,207,164, 93, 87,
+ 62,171,213,138, 91,183,110, 33, 35, 35, 3,217,217,217,168,172,172,108,232, 8,164,167,167, 87,145, 36,185,167, 37, 94, 47, 47,
+175,247,190,251,238, 59, 31,185, 92,126, 95,123,174,183,134,214, 91, 73,213,106, 53, 92, 93, 93, 49,114,228, 72,239,211,167, 79,
+191,103, 54,155,151,253, 75,222,105,196,211, 79,230,246,125,227,213, 9,152, 24, 39, 47,222,159, 84,122,254,211, 79, 22,212, 57,
+195,123,103, 76,140,243, 47,190,150,227,138,167,159, 60,216, 23, 64, 9, 90,119,216,102,126, 61,163, 60,212,175,159, 91,202,254,
+195,135,191, 95,178,232,205,180,133, 11, 94,241, 50, 24,111, 75,131, 58,137, 9, 0,200, 47,180,176,215, 51, 25,211,167,235,222,
+ 76, 75, 88,251, 21,175, 92, 83, 61,235,143, 63, 90, 14,111,208, 88,188,240,120,144, 6,133, 14, 85,116, 15, 30,212,229,247, 11,
+137,112,148, 27, 17, 18,218, 23, 99, 70, 63,142,148,212,116,148,169, 77, 80, 42,149, 48,155,205,173,134, 75,200,190,126,224, 57,
+150, 96, 3, 9,150, 40, 34,120,172,244,185,233, 47, 15,142,141,125,130, 77, 74, 58, 76, 29, 60,144,120,110,207,143, 27,246,242,
+ 68, 66,129,209,226, 98, 33, 8,147, 22,188,155,153,181,250,123, 29, 26,161, 68,212,178,249,181, 46,176,107,120, 68,168,207,115,
+211,103,185,196,140,139,103,143, 30, 61,200,236,217,189, 61,101,207,182, 30,137, 12, 79, 39, 82, 22, 27, 36, 90, 29,169,101, 9,
+177,107,173,142, 49,148,231, 63, 98,242,139,125,218, 10,236,229,212, 85,227,247,128,217, 92, 82, 91, 92,236,235, 62,116,168,228,
+214,138, 21,242, 14,253,251,155,136, 58, 31,226,214,132, 22,159,207, 7,120, 60,198, 30, 78,123,243, 98, 52, 26,193, 0,100,123,
+ 56, 41,138,186, 79,100,213, 11,173,250,251,197, 30,206, 45,203,151,255, 30, 56,102, 76,101,106,106,106,135, 97,195,134, 17, 53,
+ 53, 53,168,169,169,185, 79,108,249,249,249, 17,225,145,145,242, 93, 41, 41, 65,246, 94, 79,123,202,206,227,241,254,114,161,245,
+ 15, 71,139, 11, 73,183,186, 4, 79,189, 69,203, 30,161,101,167, 69,139, 36, 73, 18,222,222,222,168,168,168,104,241,197,207,227,
+241, 32,147,201,234,199,136, 91,157,121,103, 54,155,215, 47, 92,184,240,181,113,227,198,121,134,132,132, 64,173, 86,163, 67,135,
+ 14,144, 74,165, 13,190, 99,245,124,105,105,105,248,238,187,239,116,102,179,121,189, 13,206,207,215,174, 93,251,234,196,137, 19,
+221,125,124,124,224,230,230,134,235,215,175,195,205,205, 13, 58,157, 14, 57, 57, 57,112,114,114,106,240,219, 57,124,248,112,141,
+217,108,254,220,134,120, 99,207,158, 61,107,117,114,114,186,174, 86,171,249,149,149,149,130,170,170, 42,129, 78,167, 19,106,181,
+ 90,225,241,227,199, 61, 93, 92, 92, 12,191,254,250,171, 58, 48, 48,144,127,231,206, 29, 62, 73,146, 54,213, 43, 65, 16,152, 55,
+111, 30, 68, 34, 17,204,102, 51,214,175, 95,143,133, 11, 23, 54,248,100,173, 93,187, 22, 75,151, 46,109, 16,206, 91,183,110,109,
+ 83,203, 97, 89, 22, 86,171, 21, 36, 73,130, 36, 73,187,196,239,131,192, 78,193, 94,150,151,151, 23,215,175, 95,191,147, 63,255,
+252,179, 71, 93, 76, 50,148,151,151,163,188,188, 28,106,181, 26,181,181,181,160, 40, 10,254,254,254, 40, 47, 47,199,193,131, 7,
+181, 53, 53, 53, 99,208,202,140, 67, 62,159, 63,125,240,224,193,130,166,121,168,239,229,213,139,119,137, 68, 2,133, 66,129,225,
+195,135,139, 83, 83, 83,167, 3,248, 71, 11,173,198,225, 29, 70,143,153, 33, 10,139, 24, 96,185,150,145, 84, 28,218,165,188,120,
+ 90,188,243, 17, 0, 72,191, 89,238,114, 45,199, 21, 97, 17,113,236,232, 49,110, 81,229,101, 91,122, 0,176,182,182, 92, 15, 0,
+184,200, 37,147, 70, 69,247, 87, 56, 57, 56,240, 62, 93,183,245,216,215, 95,127,254,232,222, 35,255, 9,239,240,233,186,123,225,
+ 29, 70, 69,247,103,178,179,178, 39, 1,216,102,175,120,137,139, 27,127,245,187, 31,190, 67,118,198,175,126,239,204,235, 41,174,
+ 44, 39, 33,115, 12, 64, 84,239, 14,216,242,195, 13, 92,187,118,173,204, 98,177, 12,111,181,125, 19,108, 96, 70,230,205,224, 30,
+ 17,225, 62,207, 77,159,233, 28, 23, 23,143,164,164, 67,248,113,251,182,179, 79, 77,157,248,109,105,149,142,239, 45,148,139,228,
+ 44, 35,230,139, 92, 4, 34,137, 76,101,177,220,155, 3, 33, 20, 74,157,129, 73,173,190,120,102,207,156,230, 50, 34, 58, 30, 71,
+142, 30,194,143,219,183,156,121, 63,226,233,109, 93,250,132, 17,253, 31,253,100, 78,151,174, 93, 58,233,107,203,117, 60, 66,108,
+ 53,153, 24,167, 79,182, 23,124,150,191,116,122, 62,128,117,224,102, 29, 54,198,245, 31, 99, 98,250,189,113,251,182,200,107,208,
+ 32,153, 34, 37, 69, 94,183, 18, 73,171, 66, 75, 32, 16,128,109,121,168,235, 62, 78, 98,199, 14, 30,128, 86, 39, 97,137, 68, 34,
+ 24, 12, 6,144, 45, 91,176,239,227,244, 61,113,162,248,246,237,219,221,221,221,221,239, 19, 89,149,149,149, 13,219, 38,147, 9,
+ 6,131, 1, 50,153, 44,195,216,252,136,200,125,156,229,103,207,154, 86,207,155,183,236,153,169, 83, 55,156, 58,125, 90,234,225,
+225, 1,173, 86,123,159,208,178, 88, 44, 24, 49,114,164,104,237,213,171,207, 65,167, 91,110,207,245,236, 48,124,184, 77,127, 96,
+ 62,159, 15,230, 47, 30, 58,252, 23, 96,102,115,194,139,103,107, 8,199,222, 89,135, 45,188, 32,155,174,238,189, 52, 42, 42,202,
+148,155,155,139,192,192,192, 6,177,210,248,156,206,206,206,112,117,117, 69, 90, 90, 26, 62,250,232, 35, 35,128,165, 54, 56,107,
+ 12, 6,195,148, 81,163, 70, 25, 5, 2, 1, 66, 67, 67, 27,226,103, 49, 12, 3,177, 88, 12, 7, 7, 7, 92,189,122, 21,227,199,
+143, 55, 24, 12,134, 41,248,115, 12,173,166,156, 90,131,193,240,236,232,209,163, 13,153,153,153, 24, 60,120, 48,174, 93,187,134,
+218,218, 90,212,214,214,226,238,221,187, 8, 15, 15,135,193, 96,192,166, 77,155,140, 6,131,225, 89, 0,218,214, 56,107,106,106,
+198, 47, 92,184,144,255,211, 79, 63,117,241,247,247,143,232,219,183,111,200,200,145, 35, 31,121,242,201, 39, 59,197,196,196,248,
+118,239,222,221, 52,102,204, 24,175,113,227,198,121, 25, 12, 6,225,249,243,231,149, 36, 73,142,179,145,207, 6,113,146,155,155,
+219, 48, 84, 40, 16, 8, 80, 81, 81,209, 16,185,191,254,161,212,130, 16,142,182, 37,182,235, 5, 86,189,224,178,195,207,173, 57,
+ 78,155, 7,137,197,226,122,139, 39,107, 7,103,122, 86, 86,214,168,161, 67,135,166,207,152, 49,163,166,172,172, 12, 78, 78, 78,
+ 8, 10, 10, 66,112,112, 48, 60, 61, 61, 97,181, 90,113,224,192, 1,253,193,131, 7,111,104,181,218,225,248,115, 12,173,232, 38,
+215,241,110,115, 15,217,122,107, 86,189,208,146, 74,165,240,247,247,175,191,182,119,219,114, 61,219,137,191,150,179, 78,192,140,
+ 28, 49,166,107, 76,236, 4,151, 3,135, 46,136, 55,108, 60,120, 35, 42, 26, 91, 61, 58,235, 14,123,116,214, 29,142,138,198,214,
+ 13, 27, 15,222, 56,112,232,130, 56, 38,118,130,203,200, 17, 99,186,102,102,100,135, 52, 94,247,176,185,124, 74,165,210, 1,131,
+ 7, 69, 85,165,158, 59,195, 36,172,253,138, 55, 98,248, 83, 87,183,125,123,224,192,182,111, 15, 28, 24, 49,252,169,171, 9,107,
+191,226,165,158, 59,195, 12, 30, 20, 85, 37,149, 74, 7,216, 83,246,217, 51,167,185,196,198,196, 35, 41,233, 0,181,119,215,166,
+181,187,247,229, 13,125,249,181,179,229,185,185,215, 88, 85,201, 9, 8,121,133,200,202,202,210,214,137,172, 92,123, 56,103,189,
+ 50,173,177,200,250,205,195,103,240,214,172, 44,208,201,201,191,144,167, 79, 95, 53,254,150,174,210, 94,201,172,168, 84,168, 43,
+239,232,116, 26, 11,195,208,160,105,154,255,193, 7, 13, 14,187,205,214,209,192,129,195,240,235,169,157,216,254,195,102, 45,195,
+192, 52,105,239, 94,122,210,164, 21,108,167,206,157, 59, 37,238,218, 73,196, 61, 49,193,133, 5,152,241, 19,227, 93,127,218,253,
+ 19,209,181, 91,215,206, 65, 65, 13, 33,109,254,121,109,233, 47,224, 92, 1, 84,233, 10, 11,207,164,125,245,149,185,195,148, 41,
+238,226, 14, 29,156, 65,211, 68,253,243,189,165,143, 64, 32,104,106,129,105,145,211,223,211,179,244,240,225,195, 8, 14, 14,134,
+191,191, 63, 26,251,200,214, 7,228,246,240,240,192,190,125,251,192,222, 31,156,186, 69,206, 62, 93,186,164,173, 89,189,218,194,
+ 48, 12,170,170,170,254,100,205,170,170,170, 2,195, 48, 56,122,228,136, 69,119,111, 37, 16,187,202, 62,156,207,175,125,102,200,
+144,132,216,216, 88,235,237,219,183,193, 48, 12, 26, 91,182, 84, 42, 21, 28, 29, 29, 97, 50,155, 3, 0,200,237,225, 84, 29, 63,
+238, 0, 27,207,245,102, 44, 90,127, 69,189,255,211, 69, 86,227, 5,165,103,218,101,209,162, 40, 10, 1, 1, 1,247, 45,233,194,
+227,241,238,251,180,113,198,225,142,204,204,204, 19, 99,198,140, 89,246,216, 99,143,205, 94,182,108, 25, 63, 36, 36, 4, 90,173,
+ 22,110,110,110,240,246,246, 70, 78, 78, 14, 14, 31, 62, 76, 87, 84, 84,124, 3, 96, 37,236,155, 66,159,146,151,151, 23,215,179,
+103,207,221,139, 23, 47,118, 25, 61,122,180, 48, 32, 32, 0, 44,203,226,234,213,171,216,191,127,191,117,219,182,109,186, 58,145,
+101,175,243,242, 73,133, 66,241,212,184,113,227, 18,167, 79,159,238, 68,211,180,240,238,221,187, 48,155,205, 32, 73, 18, 69, 69,
+ 69,214,164,164,164, 90,131,193, 48, 13,192, 73, 59,248,210,170,171,171,195,147,147,147,167,159, 63,127,254,163, 25, 51,102,120,
+140, 28, 57, 82, 68, 81, 20,206,157, 59,167,238,211,167,143,183, 74,165,178,238,219,183, 79, 99, 50,153,150,210, 52,109,215, 18,
+ 60, 4, 65, 64,167,211,193,211,211, 19,102,179, 25, 12,195,192, 98,177,192,209,209,177, 97,217, 36,150,101,209, 22,231,250, 38,
+109,128,111,181, 90, 49,117,234, 84, 48, 12,131,245,235,215,131,162,168, 54,147,185,184,184, 92, 73, 79, 79,143,235,221,187,119,
+131,120,169,111, 67, 18,137, 4,158,158,158,240,240,240, 64, 82, 82, 18,132, 66,225, 21, 91,254,110,117,184, 86, 81, 81,209, 39,
+ 57, 57,121,192,141, 27, 55,158, 7,208,219,106,181,250,211, 52, 77,240,120, 60, 37,203,178,215,117, 58,221,183,176,115, 9, 30,
+149, 74,245,209, 11, 47,188,208,103,231,206,157,142, 2,193,127,110, 13,129, 64, 0,137, 68,130,250,224,152, 44,203,194, 98,177,
+224,189,247,222,211,233,245,250,143,254, 45, 79,137,168,190,253,177,101,211, 23,142,167,127, 61,161,206,202,195,254,102, 66, 56,
+148,148,151,109,233,161, 40, 46,118,140,234,219,223, 46, 78,210, 98,213, 60, 59,237,173,192,186, 37,120,222,187,123,183, 96,115,
+226,142,207,242, 1,224,147,207,215,119, 47,215, 84,207,202,206,202,158,180,121,243,174, 1,164,197,170,177,135,243, 63,226, 37,
+ 81, 11, 22, 38, 0,151,174,222, 40,239, 50,126,202,241,165,221,186, 58, 63,161,210, 24, 75,107,107, 13,175, 3,200,183,183,236,
+131, 6, 14,197,175, 39,127,194,143,219, 19,117, 44,195, 55,121,122,122,178, 0,144,149,229,201,102,101, 85,179,255,241, 43,118,
+213, 11,217,107, 43,223,122,125,228, 91, 90, 93,229,231,235, 55,181, 62,148,210,179,215, 99,232,217,235, 49,188,246,250,187, 46,
+225, 17,161,129, 0,176,119, 47,232,136,110,153,191, 44,123,127,197, 19, 43, 87,174,128,174,198,140,250,229,122,114,110,102, 30,
+201,207,135,133,123,103,221,143,101, 20,117, 9,111,189,213,221, 80, 89,233, 53,232,157,119, 60, 5,111,191,205,107,205, 25,190,
+241,253,107, 15,231,229,235,215,143,204,122,249,229,210,229,203,150,141,249,102,243,102, 89,143, 30, 61, 80, 86, 86,134,208,208,
+ 80,248,251,251, 35, 57, 57, 25,251,246,236,209, 87,215,212, 44, 5,240,181, 61,156, 59,142, 30,205, 9,137,136,168,216,188,121,
+179, 95,108,108, 44,161,215,235,161,213,106,161,213,106, 97, 54,155, 81, 23, 16,154,205,205,203,203, 34, 73,242, 27,123,203, 78,
+171,213,210,149,253,251,151,136, 24,102,205, 83, 19, 39, 46, 92,249,225,135,146,174, 93,187, 18,102,179,185,193,170,101,181, 90,
+225,232,232,104,181, 88, 44, 30, 0, 12,246,112, 74,182,109,163,212,106, 53,188,188,188, 26,194, 53, 53,142, 75, 88, 83, 83, 3,
+150,101,185, 96,186,237, 64,139, 10,201,205,205,237,138, 64, 32,232,216,216,186,213,220,218,121,141,247,145, 36, 89, 82, 81, 81,
+ 17,213, 68,241,182,228, 15, 21, 4,224,227, 17, 35, 70, 60,181, 96,193, 2, 34, 53, 53, 21, 7, 15, 30,100,243,243,243,247,214,
+ 89,177,242, 91,233,233,180,196,233, 36,145, 72,230, 59, 56, 56, 68,215,135,112,144,203,229, 55,244,122,253,169,186,225,194,154,
+118,112, 58, 75, 36,146,121, 14, 14, 14,163,234,150, 95,129,147,147, 83,186, 94,175, 79, 54,155,205, 95,160,229,133,170, 91,227,
+148,185,184,184,124,228,233,233,249,236,219,111,191,237,113,246,236, 89,229,175,191,254, 42,170,174,174,222,105,177, 88, 90, 91,
+ 84,250, 79,156,238,238,238, 87,248,124,126,199,191,168,142,208,179,103,207,164,241,227,199,199, 78,155, 54, 13, 36, 73,226,235,
+175,191, 70,114,114,242,145, 91,183,110,197,217,232,141, 54,229,244,236,216,177, 99,234,236,217,179, 59, 77,157, 58, 85,238,230,
+230, 6,129, 64, 0,189, 94,143, 91,183,110,225,234,213,171,236,161, 67,135,106,211,210,210, 74, 12, 6,195, 48, 0, 21,109,184,
+158, 15,210,107,190,143, 83, 32, 16, 12, 13, 8, 8,216,181,124,249,114,167, 81,163, 70,201, 60, 60, 60,192,231,243, 65,146, 36,
+148, 74, 37,110,222,188,137, 19, 39, 78,232,247,238,221,171,215,104, 52, 83, 1,156,249,255,200,231,195,228, 12,235,142,247,155,
+ 44, 20,221, 98,180,119, 27,105,109,230,115,196, 80,223,248, 73, 79,141, 27, 11, 0, 63,239, 59,118,220,142, 69,165, 91,204,167,
+173,188,218,195, 25,218,141,183, 60, 35,243,230,125, 1, 45, 35,194, 35,115,195,122, 76, 92,101, 15, 81,163,200,240,247,149,189,
+209,112,108, 99,155,238,125,195,172, 97, 65,136,139,159,244,100,236,187, 75,151,224,227,143, 18,112,232,231, 3, 71,178,242,239,
+ 91, 38,232, 31,215,150,254, 98, 78, 98,149, 64,240,152,220,215,119,200,122,134, 89,114,237,230, 77,199,198, 29,182,122,203,115,
+227, 78,165,159,159,159, 74,169, 84,118,176,135, 51,238,203, 47,173, 6, 7, 7,201,146, 53,107,134,214,154, 76, 67, 87,174, 92,
+ 41,184,124,249, 50, 54,125,245, 21,101, 42, 41, 73, 84, 3,243, 90, 24, 13,105,145,179,211,188,121,210, 69,155, 54,189, 24,212,
+173,155,247,243,207, 63, 47, 20, 10,133,208,235,245, 40, 46, 46,198,201, 19, 39, 44,153, 89, 89,153, 58,157,238, 9, 0, 10,123,
+ 57,227,190,252,210,234, 26, 20, 4,185,151, 23,123, 58, 37,197,101,214,252,249,179, 59,119,233,226, 50,102,236, 88,161,179,179,
+ 51,170,170,170,112,247,238, 93, 28, 56,112, 64, 85, 91, 91,235, 7,128,182,135, 51,241,252,249,158, 71,207,156,121,122,213,170,
+ 85,226,200,200, 72,184,184,184,160,166,166, 6, 55,111,222,196,153, 51,103,204,223,124,243,141, 86,171,213,206,166,105,250,240,
+ 95, 88,239,255, 6,171, 86, 61,182,216, 20, 90,255,197, 27, 48, 10,192,251,117,219, 31,194,246,154,129,255,166,135, 79,160,187,
+187,251, 22,147,201,196, 26,141,198, 89, 0,138,254,134,249, 20, 68, 69, 69,109, 82,169, 84, 3, 88,150,133,139,139,203,133,140,
+140,140,185,104, 97,230,141, 13, 78, 62,128, 1,142,142,142,253,157,156,156,134,154,205,230,176,186,225,183, 44,189, 94,127,198,
+106,181, 94,170,179, 62,209,255,207,101,231, 3, 24,229,231,231,247, 50,195, 48,221, 8,130,112,165,105, 26, 36, 73, 86, 51, 12,
+115, 75,171,213,110, 3,144,252, 55,200,231, 67,225, 12,127, 4, 79,178, 60,132,181, 36, 8,238, 19, 90, 77, 4, 4,193, 32, 43,
+243, 54, 14,180, 33,159,188,113,209, 1, 27,129,123, 51, 19, 97,219,185,246, 63, 66,203, 14,241,210,102,145,249, 8,255, 5,150,
+ 96,239,227, 36, 88,162, 40,180,231,147, 63, 62,136,208,178, 23,225,193, 24, 10, 22, 3, 24, 22,151,178,111,225,215,127,241,179,
+238,161,113,126, 12,184,127,229,230,118,129, 39, 16,248, 0,224,213, 89, 95, 24,134, 32,104,150, 32,168,198,195, 91, 77, 58,150,
+173,114, 90,129, 30, 66,137, 36,128,166,168, 14,101,128,227, 81,154,126,212,196,178,181, 29,129,247,211,129,156,246,228,211, 10,
+244,224, 75, 36,129, 71, 89, 54, 94,237,224,208, 83,101, 52,122, 1, 96, 29, 29, 28,178,116,122,253,118,147,201,180, 17,127, 30,
+185,176,201, 41,146, 72, 58,210, 20,213, 1, 0,120, 2,129,106,183,217, 28, 80,226,236,252,188,201,108,238,228,232,232, 72, 90,
+ 44, 22,157,201,100,154, 70, 81,212,233,182,148,253, 22, 69,133,159,231,241, 6, 91, 29, 28, 60,172, 4,225, 96,161, 40,171,197,
+106, 45, 54,153, 76, 55, 0,124, 6,224,246, 95, 92,239, 28,218,121,179,112,156, 28, 39,199,201,113,114,156, 28, 39,199,249,215,
+115,202, 1, 4,214,117, 22,255,137,101,255, 55,193, 62, 31, 45, 14, 28, 56,112,224,192,129,195, 63, 6, 6, 52,227,147,197,225,
+255, 23, 68, 43,170,180, 45, 38,193,246, 40,219, 83, 28, 39,199,201,113,114,156, 28, 39,199,201,113,254,207,113,218,226,254, 39,
+ 14, 73,182,184,214,225, 95, 13,206,252,203,113,114,156, 28, 39,199,201,113,114,156, 28,231,255, 44,120,220, 37,104, 17, 29,234,
+ 62, 15, 59, 45,135,127,119, 91,104, 10,255,186, 79, 91,210,251,114,151,156, 3, 7, 14, 28, 56,161,245, 87,191,180, 30,228,229,
+246,160,194, 39,129, 32,160, 32, 8, 40, 0, 36, 60,196,180,182,224,231,233,233,249, 70,120,120,120, 98,135, 14, 29, 94, 3,224,
+221,198,227,187,203,229,242, 47, 28, 28, 28, 82, 29, 28, 28, 82,229,114,249, 23, 0,186, 63,164,122, 35, 0,204,146, 72, 36, 41,
+190,190,190,165, 98,177, 56, 5,192,108,180,127,230,106, 8,238,197, 73,251, 16, 64,207,182, 28,232, 29, 17,191,199, 43, 34,254,
+186, 87, 68,252, 77,143,200,241,221,189, 34,226,111,122, 69,196, 95,247,142,136,223,243, 23,180,215, 7,169,223, 4,130, 64, 17,
+ 65,160,200,206, 99, 63, 35,128, 98,130, 64,201, 67,104, 75, 28, 56,112,224,192,225,159, 6, 63, 63,191,167,124,125,125, 79,249,
+250,250, 38,251,249,249, 61,101,199, 33,209,205,188,120,104,130, 0,109,227, 69,210, 90, 58, 91,230,202,198,199,126,106,103,209,
+ 26,115,118, 32, 8,208,108, 29, 8, 2,140,183,183,247, 6, 95, 95,223,132,166, 31,111,111,239, 13, 4, 1,166, 81, 90,186,145,
+192,107,171, 89,181,195,115,207, 61,247,115, 85, 85, 85,146,197, 98, 73,202,203,203, 75, 26, 54,108,216,238, 38,214,141, 22, 57,
+165, 82,233, 51,253,250, 15, 72, 59,115,238, 82, 94,238,173, 2, 69,102,206,157,130, 95,142,159,190, 28,217,163,231, 31, 82,169,
+244,153, 54,212, 17, 1, 96,150, 64, 32, 72,113,116,116, 44, 17, 8, 4, 41, 0,230,240,249,252,195,171, 87,175, 46,200,200,200,
+ 40, 63,127,254,124,245,153, 51,103, 74,103,204,152,113,139, 32,136, 95,154, 17,236,209,205, 88,105,154, 90,117,150, 21, 22, 22,
+ 30, 87, 42,149, 39,100, 50,217, 71,118,164,111,224,244,138,136,191,174,210, 90, 89,149,214,202,122, 69,196,179,141,182,175,183,
+241,154,219,170,163, 63,181, 5,137, 68, 18,104, 67,208, 71,183,116, 44, 0,159,186,255,162, 0,124, 89,247,169,159,122,238, 35,
+149, 72, 30, 86, 91,122, 24,101,231, 56, 57, 78,142,147,227,252,111,115,254,147,209,167,238,219, 23,247,252,181, 26,222,221,109,
+157,117,248,106, 94, 94,158, 35, 0, 4, 7, 7,207, 5,176,175, 45, 66,130, 32,176,136, 97, 88, 30, 0,240,120,196, 59,195,135,
+143,232, 35,147,201,238,139,130,108, 52, 26,197, 41, 41,191,142,100, 24,150,168, 75,183,136,101,241, 5,128,114,123,207, 97,177,
+152,121, 66,161, 24, 60, 30,241, 86,100,100,143,206, 21, 21, 21,103,121, 60, 94, 98,105,105,105, 85,155,205, 56, 4,129,173, 91,
+183, 6,251,250,250,254, 41, 90,179, 82,169, 20,199,199, 63,209, 38,190, 23, 0,137, 89, 34,233, 47, 34, 8, 95,154,162, 92, 1,
+ 64, 32, 16, 84, 93, 22,139,163, 62, 94,181, 74, 78, 16, 4,163,209,104, 96, 52, 26,241,230,155,111,202, 50, 51, 51, 39, 84, 84,
+ 84,108,180, 65, 27,220,179, 87,159, 55, 79,156, 56, 30,166,171,172, 50,109,253,124,115,154, 81, 32, 50,116, 9, 15, 21,109,218,
+178,221,109,230,139,211, 94,207,206,206, 72, 71,243,203,145, 52, 6, 15,192,129,249,243,231, 71,196,197,197,137,107,106,106,164,
+ 70,163,177,115, 98, 98,226,123, 81, 81, 81,142,189,123,247, 22,239,218,181,139,208,106,181, 96, 89, 86, 30, 26, 26,202, 78,158,
+ 60,217,180,123,247,238,215, 0,108,104, 69,248, 46,186,119, 45,121,235, 67, 66, 66,150, 3, 64, 94, 94,158,168,209, 53, 22,134,
+133,133, 57, 0, 64, 78, 78,206, 7, 44,203,204, 7, 0,150,197, 90, 0, 75,154, 49,173,229, 69, 12,154, 4, 16,232,150,113,238,
+103,105,196,224, 73, 38,176,184, 69, 0,121,117, 29,130,149, 64,163,184, 80,247, 35, 75,161, 80,180,107,109,194,216,216, 56,130,
+ 32,136,189,105,105,105,251, 84, 42, 85, 23,134,161, 95,105, 45,159, 77,218, 17,225,225,225,241, 66, 69, 69, 69, 2,128,151,179,
+178,178,250, 0, 64, 88, 88,152, 8,192, 21,103,103,231,129, 86,139,133,224,158, 85, 28, 56,112,224,240,143, 21, 90, 87, 1,196,
+226, 63, 75,240,108,105,143,208, 18, 3,192,217,179,103, 1, 64,210,142,140, 16,141, 5,204,188,121,243,224,235,235,219, 84,188,
+ 32, 53, 53,229, 65, 10,123,223, 57, 62,252,240, 67,199,234,234,234,232,111,191,253,118, 8,203,178,159, 42, 20,138,223,109, 28,
+ 95,206,178, 88,203,227, 17,239, 16, 4, 1,137, 68,154, 59,123,246,236,171,117,255,117,254,229,151, 95,228,227,199,143, 55, 0,
+ 40, 0, 0,137, 68,234,207,231,243,130, 89,150,173,127,225,182, 40, 8,159, 6,130, 40,177,120,196,172, 47,191,164, 30, 29, 63,
+ 94,224,224,229, 69, 0, 64, 65,118,182,199,218, 79, 62, 25, 88,149,159, 47, 54,122,120,104, 52,122,189, 49, 55, 55, 23, 18,137,
+132,224,243,249,143,218, 42,176,131,131,195, 27,171, 62, 94,227,160,171,172, 54,154,116, 53, 22, 62, 69,154,157,100,114,186,188,
+ 76,165,113,148, 57, 24,222,121,127,133,248,213, 87,166,191,161,215,235,231,218,160,122,237,173,183,222, 10,235,215,175,159,255,
+158, 61,123, 8,173, 86, 11,129, 64,224,216,187,119,111, 68, 69, 69,209,191,254,250, 43,209,165, 75, 23, 68, 70, 70,226,220,185,
+115,184,112,225, 2,209,167, 79, 31,249,254,253,251,159, 35, 73,114,131, 45,113,205,231,243,222, 12, 13, 13,237,237,224,224, 96,
+ 9, 14, 14,198, 43,175,188, 2,150,101, 17, 29, 29, 29,233,232,232,184, 79,175,215,139,115,114,178,135,216, 18,217,170,140, 67,
+147,235, 45, 91, 0,122,128,197, 45,117,198,161,198,195,143, 97, 57, 57, 57,143, 85, 85, 85,225, 94,189,176, 13, 11,152, 15, 25,
+ 50,164, 45,109,169,156,101,177,118,252,248,184,119, 0,130,136,142,142,174,126,237,181,215,120,217,217,217,207, 62,249,228,132,
+200,188,188, 91,104, 37,159,141,219, 17,241,194, 11, 47,150, 59, 58, 58, 78,220,187,119,111,142, 82,169, 20,136, 68, 13, 58,147,
+239,237,237,237, 21, 28, 28, 60,199,221,221, 93,197,231,241,188, 89,176,172,173,182,196,129, 3, 7, 14, 28,254, 86, 56, 82, 39,
+174,142, 52,253, 67, 0, 0, 73, 73, 73, 13,145,105,227,226,226, 90,236, 85,179, 44, 91,126,237,218,181, 0,131,193, 0,150,101,
+237,121, 9, 52,158,162, 89, 78, 16,188, 77, 60, 30, 49,151, 32, 8, 68, 70,246,184,179,126,253,250,230,214,244,178, 68, 70,246,
+184,195,231,243,186,178, 44, 11,130,224,125,205,178, 76,121, 11,156,205,190, 24,197, 98,201, 34, 0,240,241,241,205, 63,118,236,
+152,229,233,167,159,198, 39,159,124, 34, 90,188,120,241, 66,129, 64,240, 90, 81, 81, 81, 89, 43,249, 4,128, 37, 94, 94,222,242,
+173, 91,183, 6,207,158, 61,251,170, 82,169, 92, 2, 0,190,190,190, 9, 0,194, 1, 20, 52,218,135,111,190,217, 93,250,202, 43,
+175,228,170, 84,170, 37, 45,113, 78, 4, 30, 9, 8, 13, 29,177,242,236, 89,150,103, 54, 19, 21,191,253,166, 83,151,151,147,183,
+213,106,249, 15, 87,174,196,189,151,144, 32, 12, 8, 12, 68,234,225,195,158, 21, 6,131, 90,107, 54,155,202,203,203, 89,138,162,
+ 46,216, 81,246, 8,111, 47,111,249,230,207,190,190,236, 36,228, 51,222, 29,253, 9,161,187,187,128, 39,119, 22,243, 5, 60,115,
+215,206,221,197, 0, 34,108,213,145, 72, 36,122,110,244,232,209,242,221,187,119, 19,145,145,145,112,117,117,197,111,191,253,134,
+244,244,116, 84, 85, 85,241, 72,146, 68,223,190,125,177,102,205, 26, 4, 6, 6,162,186,186, 26, 69, 69, 69,158, 98,177,216,139,
+ 36,201,150,174,231,125,237,105,209,162, 69,240,245,245, 5, 69, 81,168,172,172, 4, 69, 81,112,116,116, 4, 0,148,148,148,224,
+240,225, 67,246,180, 37,155, 96, 89, 22,143, 63,254,120, 13, 65, 16, 89, 77, 45, 90,109,225,244,247,247,223,165, 86, 87,140, 27,
+ 49, 98, 4,170,170,170,200, 21, 43, 86,160,103,207,158, 8, 14, 14,182, 39,159, 75, 68, 34,241,183,157, 58,117,250,108,222,188,
+121,190,238,238,238, 48,155,205,239,149,149,149, 97,206,156, 57, 0,128,152,152,152,158, 66,161,240,216,140, 25, 51,208,165, 75,
+151,210,202,202,202,162,180,180,180, 87, 12, 6,195,205,246,150,221, 78,112,156, 28, 39,199,201,113,254,173, 56,237,213, 34,127,
+ 83, 40,113,127, 56,135, 45,247, 9,173,184,184, 56, 34, 41, 41,137,181,163, 96,154,142, 29, 59, 6,200,100, 50, 0,208,180, 53,
+ 23, 12,195,188,230,225,225,161, 90,178,100,201,160,224,224, 96,203,107,175,189,118,179,160,160, 96,105,227, 52,157, 59,119,254,
+232,171,175,190, 66,110,110,110, 65, 66, 66,194, 57,141, 70,211,214,117,204, 22,179, 44,214,215, 89,199, 42, 14, 31, 62,220,243,
+236,217,179,115, 63,255,252,115,175, 87, 95,125, 85,244,198, 27,111, 76, 3,240,137, 45, 18, 62,159,111,104,110,184,176, 57,248,
+250,250, 90,248,124,126,139, 65,226,226, 0,153, 84, 44, 30,190,242,236, 89,214, 82, 80, 96,248,110,221, 58,167,205,127,252,177,
+156,100,217, 14,222,222,222, 24, 60,112, 96,173,148,207,175, 80,149,149, 49,222,143, 60,194,191,123,236,152,167, 81, 44, 86,236,
+222,189, 91,171,209,104, 14,218, 52,225, 17,132,142, 97, 89,139, 99,199, 64,242,233, 9,163, 34, 47, 95, 74,207,118,242,246,228,
+245,233, 29,217, 51, 59,183, 32, 13, 12, 99, 37, 8, 66,103,139,199,197,197, 37, 88,163,209, 64,167,211,193,203,203, 11,235,215,
+175,135,143,143, 15, 12, 6, 3, 50, 50, 50,216,142, 29, 59, 18,103,207,158, 69,199,142, 29,161, 86,171, 97,144,143,144,232, 0,
+ 0, 32, 0, 73, 68, 65, 84,177, 88, 80, 83, 83,163, 50,155,205, 45,173,205, 88,206,227,241,191,231,241,136, 23, 9,130, 64,215,
+174, 65,133, 27, 55,110,180, 48, 12,131,176,176, 48, 60,249,228,147,216,191,127, 63, 50, 50, 50,234, 45, 79,150, 78,157, 58, 23,
+242,120, 68,167, 58,173,212,110,171, 78,253,210, 62, 10,133, 98, 98, 59,111, 26,158,159,159,223,180,110,221,186,205,125,230,153,
+103, 72,177, 88, 12,189, 94, 95,127, 45,200,113,227, 98,170,199,143,143,115, 57,114,228, 72,171,249,180, 88, 44,249, 90,173,246,
+229,183,222,122, 43,241,155,111,190,113, 91,186,116, 41, 24,134, 1,203,178,160, 40,170, 97,209,111,134, 97,112,224,192, 1,220,
+190,125,251,163, 38, 34,139, 3, 7, 14, 28,254, 39,208, 6, 45,242,119,132, 47,238, 13, 27,162,169,216,250,175, 71,134,231,243,
+249,155, 79,158, 60,217,123,200,144, 33,130,145, 35, 71, 70, 30, 63,126, 60,178,180,180,244,102,157,245, 32,114,228,200,145,145,
+222,222,222,248,226,139, 47, 12,124, 62,127,115, 59, 79,211,240,210, 43, 43, 43,187, 10,224,211,253,251,247,175,157, 53,107, 22,
+124,124,124,194,149, 74,229,127,181,204,206, 18, 73,159, 25,235,215, 83, 66,146,228,125,249,233,167,206,235, 82, 82,214,238,249,
+249,103,193,227,143, 63, 78,176, 44,139, 27,215,175,203,214,108,216, 32,159, 58, 97, 66, 65, 78,126, 62,117,232,196, 9,178,188,
+180,180,178, 84,173, 94, 6,160,210, 22, 63, 73,146, 23,243,242,242,252, 6, 15,125,220,255,204, 31, 55,211,159,158, 16, 51, 66,
+ 40,224, 17,183, 10, 74,174,248,250,120,186,164,166,156, 50,146, 36,121,209, 22,143, 94,175,191, 75, 81,148, 59,203,178, 94,169,
+169,169,240,242,242, 66, 85, 85, 21, 72,146,132,197, 98,177, 24, 12, 6,169, 70,163,129,201,100,130,217,108,134,179,179, 51,110,
+220,184, 81, 78, 81,212,175, 45,113,210, 52, 61, 67, 34,145,124, 40, 20, 10,197, 34,145, 72,113,229,202, 21,232,116,186,206,174,
+174,174,159, 80, 20, 5,133, 66,129,179,103,207,190,237,236,236, 92, 0, 0, 82,169, 20, 98,177,196,195,108, 54, 83, 0, 74,219,
+123,205, 89,150,109,119,125,249,248,248, 4,202,100,178,149,239,188,179, 40,172, 87,175,222, 80,171,213, 96, 24, 6, 14, 14, 14,
+ 48, 24, 12,112,118,118,198,128, 1, 3,238,174, 92,185, 82,201,178,152,105, 75, 12,170, 84, 42,181, 64, 32,120,109,214,172, 89,
+ 31, 6, 7, 7,119,101, 89, 22,221,187,119,199,232,209,163,113,236,216, 49,228,230,230, 66,175,215,211,191,255,254,251, 79, 74,
+165,242, 23,238,113,203,129, 3, 7, 14,255, 56,252,201, 55,235, 62,139,214,127, 19, 42,149, 74,157,157,157,125, 60, 45, 45, 45,
+110,242,228,201, 72, 77, 77,125, 1,192, 91, 0, 32,145, 72, 94,152, 60,121, 50,210,210,210,144,157,157,125, 92,165, 82,169, 31,
+198, 57,197, 98,177,201, 98,185,103,156,146, 74,165,210, 54, 30,222,185,110,200, 16, 0, 58,183,178,175,101,211,136, 64,224,219,
+ 99,236, 88, 65, 85,122,186,110,235,165, 75, 31, 38, 38, 38, 10, 6, 13, 26, 68,144, 86, 43,104,134, 65, 80, 80, 16, 49, 50, 58,
+218,225,251,196, 68,119, 90,175, 63,187,234,157,119,126,219, 50, 99, 70,109, 94,157, 31,152, 45,152,205,230, 13,115,231,188, 28,
+157,146,250,155,127,120,232, 35,238,199, 79,166, 92,245,240,112,145, 7,119,235,230,160,169,170,164,151, 46,126, 91, 96, 54,155,
+191,180,197, 99, 52, 26, 15,156, 58,117,106, 66, 64, 64,128,215,205,155, 55, 97,177, 88, 64,211, 52, 70,142, 28, 9,150,101, 37,
+ 0, 24,129, 64,128,236,236,108, 88,173, 86, 85, 94, 94,158,226,214,173, 91, 18, 0,171,109,228,175,208,108, 54, 35, 43,235,222,
+168, 93,199,142, 29, 71,197,198,198,130,162, 40,140, 29, 59, 22,135, 14, 29, 26,149,149,149,181,174,177,230,123,208, 58,175,179,
+144,133,249,249,249,237,175,219,101,151, 19,188,191,191,127,100, 80, 80,208, 55,171, 87,175, 22,117,236,216, 17, 44,203,194,205,
+205, 21, 6,131, 1, 21, 21, 26,132,135,135, 35, 32, 32, 0,171, 87,175, 6,128,159,236,181,184, 41, 20,138, 91, 10,133, 98,178,
+ 74,165, 18, 85, 87, 87, 71,141, 26, 53,234,139,232,232,104, 92,189,122, 21,191,253,246,219, 84,137, 68,162,178, 90,173,148,143,
+143,207, 76,130, 32,156,173, 86,235, 78,141, 70,163,228,158, 93, 28, 56,112,224,240,143, 64,189,143, 22, 26,125,183,205,162, 21,
+ 22, 22,230, 80, 80, 80,240,124,231,206,157,197, 0, 32,147,201,194,131,130,130, 22,230,231,231,215,180, 53, 55, 6,131, 97, 79,
+ 98, 98,226,232,207, 62,251, 76, 20, 19, 19,243,200,254,253,251,251, 1, 64, 76, 76,204, 35, 78, 78, 78, 72, 76, 76,180, 26, 12,
+134,135, 22, 19,137, 36,201, 33,125,251,246, 69,101,101, 37, 10, 10, 10,218, 52, 44,243,203, 47,191,200,113,207, 47,171,213,125,
+173,129,178, 88,220, 92,253,253,121,165, 41, 41,214, 74,157,206,119,200,208,161, 4,105,181,130,199,227, 65,163,209,160,168,168,
+ 8, 46,174,174, 68,118, 94,158,227,182, 69,139,126,233,220,171,151,152,182, 88, 60,218,144, 77,125,133,170,252,197,215, 95,123,
+245,192,206,157, 63,121, 85,235,116,183,101, 50,185, 89, 34, 17,249,204,123,253,117,186,178,178,114, 58,128, 90, 59,120, 86,239,
+220,185,115,236,216,177, 99,175, 7, 6, 6,122,171,213,106,159,234,234,106,186,178,178,146,143,123,190, 86, 4, 0,164,164,164,
+ 64,167,211, 81, 52, 77,159,197,189, 88, 88, 22,123, 51,218,169, 83, 39,151,168,168,168, 97, 94, 94, 94,208,106,181,240,240,240,
+ 64,239,222,189,135,241,249,252,111, 11, 11, 11,181, 15,179,213, 39, 39, 39, 59,177, 44,251, 24,203,178, 24, 59,118,172, 93,199,
+208, 52,253, 82,108,108,172,136, 32, 8, 24,141, 6, 72,165, 50, 56, 56, 56,194,201,201, 25,193,193, 33, 80, 40, 20, 24, 51,102,
+140,229,246,237,219,155,148, 74,101,155,219,168, 86,171,141, 31, 48, 96,192,130, 57,115,230,128,162, 40,196,199,199,163,184,184,
+120,221,221,187,119,119,251,249,249, 77,123,233,165,151,188, 60, 60, 60,176, 96,193, 2, 25,128, 15,184,103, 23, 7, 14, 28, 56,
+252, 35,208,212, 71,235,207, 22,173,214,198, 68,125,124,124, 6, 19, 4,241,158,209,104, 20,215, 15,201, 16, 4, 33,246,242,242,
+ 58,100, 52, 26, 19,148, 74,101,155,156,226,170,171,171,117,119,238,220, 57,116,241,226,197, 73, 19, 39, 78, 68,114,114,242,116,
+ 0,152, 56,113, 34, 46, 94,188,136, 59,119,238, 28,170,174,174,214, 61,140,146,251,251,251,143, 27, 58,116,232,196,190,125,251,
+ 34, 41, 41, 9, 52, 77, 95,104,203,241,141,103, 24,162,153, 89,135,245,251,236, 34,227,243, 65, 16, 4, 40,138, 2, 0, 84,168,
+213,200,205,201, 65,101, 85, 21,204, 38, 19,244, 6, 3, 29,220,165,139, 81,107,177, 8, 9,160,173, 99, 95,133,105,151,127, 47,
+ 50,232,245,222, 30,110,238, 70,185, 92,130,106,157, 86,116,229,242,239,181, 0,110,219,201, 97, 97, 89,118,232,177, 99,199,150,
+241,249,252,201,142,142,142,152, 59,119, 46,127,216,176, 97, 16,137, 68, 48,155,205,168,174,174, 70, 98, 98,162,154,166,233,174,
+117,199, 56,202,229,242,237,124, 62,191,164,166,166,230, 61,155, 39,176, 88, 98,226,226,226, 4, 22,139, 5,171, 86,173,194,242,
+229,203, 49,118,236, 88,193,229,203,151, 99, 0,236,124, 88, 45,158, 97, 24,140, 26, 53,170,177, 51,124,150, 61,199, 9,133,194,
+200,110,221,186, 65,173, 86, 67,173, 86,195,203,203, 11,126,126,126,240,241,241,193,186,117,235,216, 47,190,248,226,184,213,106,
+221, 84, 81, 81, 81,222,142,182, 56,115,250,244,233, 51, 39, 77,154,132,218,218, 90, 92,188,120, 17, 3, 7, 14,196,218,181,107,
+125,207,158, 61,251, 86,223,190,125, 33, 20, 10,145,154,154, 10,138,162,138,185,231, 22, 7, 14, 28,254,215,240, 15,245,207,106,
+ 21,173, 90,180, 2, 2, 2, 92,105,154,126, 59, 54, 54,118,212,132, 9, 19, 48,102,204,152,251,254,223,185,115,167,211,190,125,
+251, 18, 54,108,216, 48,214,106,181,174,110,203, 80, 31,195, 48, 7,118,238,220, 25,243,248,227,143,203,135, 15, 31, 30, 4, 0,
+ 18,137,196,178,115,231, 78, 3,195, 48, 7,218, 81,150,250,224,142,229, 0,224,231,231,215, 83, 32, 16, 76, 28, 55,110, 92,207,
+ 23, 95,124, 17, 25, 25, 25, 72, 76, 76,188, 21, 28, 28,124,174,188,188, 77,239,200, 2, 27,179, 14, 19,108, 89,183,248, 98,177,
+166,186,172,204,213, 49, 48, 80,232,230,228,164, 76, 74, 74, 10,136,142,142, 38,138,139,139, 81, 85, 85, 5,147,201,132,203,151,
+ 47, 51, 2,160, 80,224,230, 70, 20, 94,188, 72,240,197, 98, 13,238,159,201,103, 19, 1,190,110,221,223, 95, 60,187,179,201,108,
+138,208,106,181,148, 64, 40, 20,118,244,113, 45,206,185,221,166,145, 56,179, 92, 46,143, 2, 32, 96, 24,198,224,238,238, 46, 63,
+121,242, 36,196, 98, 49, 8,130, 64,143, 30, 61, 32,149, 74, 69, 44,203, 22, 1,128,147,147,147,120,243,230,205, 46,211,166, 77,
+251,205, 22,113,159, 62,125,132, 18,137,228,137,224,224, 96, 92,188,120, 17, 55,111,222, 44,188,120,241, 98,167, 62,125,250, 32,
+ 48, 48,240, 9, 95, 95,223,159,175, 94,189, 74, 62,140,134,125,111,198,106,219,157,225,105,154,102, 8,130, 0,143,199, 3,195,
+ 48, 80,171,213,232,218,181, 43, 54,110,220,136,245,235,215,175, 82, 42,149,135,219,147,159,176,176, 48, 81,215,174, 93,167, 79,
+154, 52, 9,249,249,249, 72, 72, 72,168, 80, 42,149, 41, 39, 78,156,120,106,206,156, 57,252,129, 3, 7, 66,163,209,224,251,239,
+191,167,174, 92,185,242, 93, 89, 89,217, 14,238,145,203,129, 3, 7, 14,255, 98,161, 21, 16, 16, 48, 73, 36, 18, 45,152, 50,101,
+ 10, 63, 36, 36, 4,229,229,229,112,118,118, 38, 9,130, 16, 2,128,171,171, 43, 41,147,201, 48,123,246,108,244,234,213,107,240,
+162, 69,139, 6, 10, 4,130,141, 10,133, 98,187, 61, 39, 86,169, 84, 6, 30,143,183,119,238,220,185,171,211,211,175,118, 5,128,
+ 63,254,248,227,142, 66,161, 88,172, 82,169, 12,109, 44, 71,125, 80, 76, 66, 34,145, 94,234,222,189,251,221,168,168, 40,231, 9,
+ 19, 38,192,203,203, 11,105,105,105, 88,179,102, 77,158,197, 98, 89,118,230,204, 25,234,191,125,145, 41,179,185,236,202,193,131,
+ 78,195,158,125,214,121, 94,108,236,167,175,206,157,251,217,251,239,191, 47, 8, 9, 9, 33, 12, 6, 3, 46, 93,186,196,238,219,
+183,143,252,254,195, 15,215,195,193, 65,120,113,223, 62,177,197, 98, 41,108,163,181,100,232,160, 33,131, 67, 62,253,108, 3, 76,
+198, 90, 92,186,112, 4, 85, 85,106,108,222,178, 63,196,223,159, 29, 90, 90, 90,122,198, 94, 46,130, 32,130,147,147,147,189, 89,
+150,133, 88, 44,198,202,149, 43,225,231,231, 7,103,103,103,212,212,212,224,173,183,222,114,153, 63,127,190, 11, 0,100,100,100,
+ 52,132,103,176, 5,133, 66, 49, 96,246,236,217, 78, 20, 69,225,248,241,227, 22,130, 32,222, 59,117,234,212,183, 61,122,244, 16,
+ 15, 30, 60,216,105,199,142, 29, 3, 1,164, 62, 44,161,213,206,227,110,157, 60,121,178,239,228,201,147, 89,161, 80, 72, 84, 87,
+ 87,195,213,213, 21, 27, 55,110,212, 43,149,202, 35,237,110, 3, 20, 37,150,203,229, 98,150,101,177,119,239, 94, 20, 22, 22,190,
+164,209,104,202,104,154,222,255,246,219,111, 47, 12, 9, 9,233,146,147,147, 83, 88, 83, 83,179, 86,165, 82,221,229, 30, 77, 28,
+ 56,112,224,240,143, 66,189, 19,124,253,236,195, 35,184, 55,156,216,178,208,162,105,122,246,137, 19, 39,248, 12,195, 96,203,150,
+ 45,184,114,229, 10, 43,151,203,223,147,203,229, 95,201,100, 50,218,104, 52,206,122,229,149, 87,166, 45, 95,190,156, 55,120,240,
+ 96, 92,188,120,145,215,181,107,215,233, 0, 26, 11,173,104,180, 18,107, 67,171,213, 94, 46, 47, 47,235,218, 40, 64,101, 87,137,
+ 68,122,217, 70, 97,154,114, 54, 13,138,217,127,229,202,149,122, 95, 95, 95,203,205,155, 55,241,205, 55,223, 48, 87,174, 92, 73,
+ 17,139,197,155,149, 74,165,217, 78,206,135,129, 6, 78, 49, 69,165,253,184,112, 97,216,163,241,241,204,203, 11, 22,212,138,100,
+178, 55, 62,221,176, 97, 81,117, 77,141, 31, 8,130,245,112,113, 41,220,178,114,101,194,216, 39,158,168,205, 56,115, 70,154,158,
+156, 44,244, 34,201,107,109,201,103,105,105,233,153,212,212,223,240,195,214,207, 96,181,154,161, 44,189,167,211, 42, 52, 90,216,
+ 16, 89,127,226,164, 40, 74,251,212, 83, 79,137, 0,200,158,123,238, 57,177, 74,165,194, 35,143, 60, 2, 0,208,233,116, 56,114,
+228, 8, 66, 67, 67, 1, 0, 55,110,220,104,216,182,149, 79, 7, 7,135, 39, 6, 14, 28,136,194,194, 66,100,100,100,156, 86, 42,
+149, 26, 0,167,139,139,139, 99,250,246,237,139, 3, 7, 14,140,111, 69,104,181,169,142,236, 20, 90,127,226,148,201,100,139,247,
+239,223,255,210,133, 11, 23, 38, 47, 92,184, 80, 56,114,228, 72, 0, 64, 77, 77,141, 1, 0,221, 30,206,198,121, 34, 73, 18, 12,
+195,192,221,221, 93,175,209,104,160, 82,169,238,170, 84,170,185,183,111,223,110, 23,231,195,104,159, 28, 39,199,201,113,114,156,
+127, 19,206,127, 3,236,143, 12,207,178, 44,197, 48, 12, 82, 83, 83,177,127,255,126,218,106,181,206, 84, 42,149, 55, 26, 37,217,
+144,150,150,150,252,212, 83, 79,109,207,201,201,225,103,102,102,130,101, 89,186, 45,185, 49,153, 76, 36, 65,252,121,223,131,150,
+242,135, 31,126, 64, 89, 89,153,181,184,184,248, 20, 69, 81, 7, 30,112,246,226, 3,207, 58,252, 1, 48, 63, 99,177,156, 90, 62,
+104,208,168,101,201,201,146,151,223,125,215,252,194,139, 47,190, 77, 91, 44, 36, 95, 36, 98,196, 14, 14, 60, 90, 34, 17,102,156,
+ 57, 35,253, 98,206, 28,119,163,217,124, 60,177, 13, 14,230,245, 22,173, 97,195, 6,227,133,151,223,132,177,145, 69,235,226,229,
+ 92,152,173,104,147, 69,203,108, 54, 71, 40,149, 74, 72,165,210, 34, 0, 62,207, 63,255, 60, 24,134,129,209,104, 68, 77, 77, 13,
+ 20, 10,133,246,197, 23, 95,164,235,196,147, 96,226,196,137,206,246,240, 6, 5, 5,249, 9,133, 66, 28, 63,126, 28, 66,161,240,
+ 8, 0, 8,133,194, 35,201,201,201, 49, 83,167, 78,133,191,191,127, 80,126,126, 62, 1, 27,254,105,222, 17,241,123, 88,160, 59,
+ 8,116,187,103,130, 67, 55,175,136,248,235, 4,144, 87, 23, 53, 62,171, 79,159, 62,128,157,126, 89,141, 81, 55,185, 99, 61, 73,
+146, 63, 47, 90,180,104,110,255,254,253, 71, 47, 95,190,156, 0,192,127, 24,119, 32, 69, 81, 15, 20,122,130, 3, 7, 14, 28, 56,
+252,173,173, 90,127, 66,139, 66,139, 32,136, 45, 67,135, 14,157, 9,128, 79, 16,196, 55, 10,133,226, 70,211, 52, 74,165, 50,215,
+207,207,239,147, 46, 93,186,204, 2,192, 18, 4,177,165,141,153, 42,103, 89,172,225,241,136, 69,247,196, 93,187, 2, 84,214, 47,
+117,178, 8, 0,193,227,241,183, 95,189,122,245,221,162,162, 34,181,157, 22,136, 86,241, 48,102, 29, 2,192, 79,192,221, 41,133,
+133, 39, 22, 68, 70, 70,143,157, 51, 7, 61,199,142,117,246,235,212,137, 54, 90,173,204,141,115,231,136, 11,123,247,138,210,147,
+147,133, 70,179,249,248, 1,160,168,173,249, 44, 45, 45, 61,243,107,202,153,147, 79, 79,140, 25, 29,212,197,239,158,104,184,171,
+ 64, 69,165,246,100, 91, 68, 86, 19,209, 27,191,113,227,198,195, 34,145, 72,208,120, 41, 27,171,213, 90,105, 54,155, 35, 0,160,
+170,170,202,111,203,150, 45,187,120, 60, 94,161, 45,190,204,204,204, 67,203,150, 45,155, 88, 80, 80,112,178,184,184,184, 0, 0,
+138,138,138, 10, 72,146,220,174, 84, 42, 39, 22, 22, 22,238,131, 29,147, 0, 88,160,123,198,185,159,123, 0, 64,196,160, 73,200,
+ 56,247,179, 20, 64,143,136, 65,147, 0, 0,237, 93,203,176, 49,234, 66, 43,188,119,241,226,197,157,163, 71,143,126, 5, 15, 16,
+211, 11, 0, 44, 22, 11,105, 52, 26, 41,154,166, 5, 86,171,149,181, 88, 44, 36,247, 76,226,192,129, 3, 7,251,193,178,108, 95,
+ 0, 94,117, 63,235, 13, 40, 94, 77,182, 45,168, 91, 46,176,254,241, 91,247, 91, 77, 16,196,229, 70, 28, 13,251,237, 56, 22, 0,
+ 42, 0, 92, 39, 8,162, 37, 35,200,150,150,126,183, 40,180, 20, 10,197, 62,216,177,104,180,189,233, 90,193,146,186,117,226,128,
+246,175,237,214,192, 65,211,116,121, 81, 81,209, 3, 87, 40,143,199,187, 59,126,252,248, 54,165,183,149,102, 55, 80,248,186,217,
+188, 35,233,203, 47,123, 31,255,230, 27,127,154,162, 60, 8,128,229,139,197, 26,139,197, 82,224, 69,146,215,218,106,201,186,207,
+ 26,115,167,116, 76,254,157, 82,116,235,214,141,189,117,235,214, 61, 91,207,131,225,154, 94,175, 15,176,213, 4, 12, 6,195, 96,
+ 59,197,224, 79,165,165,165, 63, 53, 35,216,119, 41,149,202, 93,246,102,170, 97, 81,105,128,199, 16,204,211, 17,131, 38,237, 5,
+192,212, 47, 42,253, 48, 81, 86, 86,150,131,186, 56,111, 15,130,194,194, 66, 51, 65, 16, 63,174, 89,179,230,185,244,244,244,221,
+ 10,133,194,204, 61, 54, 57,112,224,192,161,109, 34,139, 32,136,164,186,223,113,117, 70,161,164,166,219,245,105,234,211, 53, 78,
+ 83,207,209,116,127,107,199, 2,192,226,197,139,223, 77, 72, 72,144, 3,176,119, 49,230,118, 47, 42,253, 87,161,252,111,194,209,
+ 88, 20,108,253, 43, 10,250, 37, 96, 1, 69,253, 14,170,145, 79, 62,249,112,141, 27,183,110,221, 34,254,205, 55, 92,253,162,210,
+141, 16,249, 79,200,119, 65, 65,193,198,192,192,192,205, 10,133,130, 2, 7, 14, 28, 56,112,104, 11,188,154, 19, 70, 45,136,178,
+184,214,254,191,175,227,222, 76,186,230,126, 19, 4,145,148,144,144, 16,215,134,252, 54, 88,180,120, 92,221,113,224,240,223,195,
+255,199,172, 87, 14, 28, 56,112,224,208, 60,154, 90,177,234,197, 87,211,223,139, 23, 47,126, 23,173,143, 56,249,226,158, 21,203,
+183,238,119,131,191, 22,129,123, 51, 7,154, 67, 91,102, 19, 68,183,163,124,167, 56, 78,142,147,227,228, 56, 57, 78,142,147,227,
+252,159,227,180,197,125,170, 25, 65, 20,219,210, 80, 95,107,195,136, 77,183,109, 29,107, 43, 45, 65, 16, 45,133,249,169, 31, 42,
+108,250,253,151, 35,154,227,228, 56, 57, 78,142,147,227,228, 56, 57, 78,142,243, 65,192,178,108, 95,150,101, 99,113,111,194, 20,
+203,178,108, 44,203,178, 99, 23, 47, 94,188,164,126,223,226,197,139,151,176, 44, 59,178, 62, 93, 93,154,134, 99,234,247, 53,253,
+110,186,175,181,180,173,100,113,102,147,237,134,223,127, 23, 31, 45, 14, 28, 56,112,224,192,129, 3,135,102, 81, 63, 99,176,145,
+181, 73, 13,224, 70, 66, 66, 66, 85, 35,223, 41, 53,128,107, 0,122,213,165, 83,215,137,180,198,190, 85,150,186,223,150,102,210,
+ 88,236, 73,219, 2,182,180,176,205, 9,173,150,208,203,135,247, 97, 96, 71,239,168,186, 10, 0,203, 48, 0, 0,166, 46, 6, 18,
+ 91, 31, 12,137, 97,192,178, 44, 20,170,234,180, 27, 42,188,223,222,243, 5,251,193,221, 91, 42, 93,207,176,236,160,186, 93,103,
+180, 26,243,155, 25, 58, 84,219,203, 17,218, 1, 97, 82, 30,222,102, 88,244, 4, 0, 30,129,235, 38, 6,159,100,151,183, 61,158,
+ 84,115,237, 60,194, 11, 51,197, 50,249, 20, 23, 87,183,110, 85, 85, 21,121, 86,147,249,231, 76, 53, 54,163,237,235, 50, 34,200,
+ 13,143, 49, 44,222, 5,192, 19,242,176, 46,175,210,238,153, 28, 28, 56,112,224,240,160,214,145, 7,138,139, 71, 16, 4,221, 12,
+ 39,241,128,156, 92,128, 61, 59,196, 86, 51,187,255,104,102,223,229,191, 83,190,219, 36,180,194,189, 48, 7, 4, 86, 0, 96,193,
+226,131, 76, 53,190,110,211,241,190,136,150,242,249,219, 0,240, 77, 86,122, 1,203,224,108,179, 23,147,135, 33, 82, 17,127, 29,
+ 0,198, 68,211, 51, 50,149,246,251,139, 69,248, 99,172,128,225,253,200,176,172,144,102,216,237, 96,145,228, 40,194,249,223, 75,
+ 97,106, 75, 94, 3, 59,122, 71, 29,252, 67, 57, 58,229,235,121,232,223,243, 17,176, 52, 5, 48, 36,228,131,223,198,233,207,159,
+ 71,255,176, 64,176, 12, 9, 48, 20, 28,199,125,138,113,145, 46,236, 13, 85,251,214,193, 14,246,131,123, 39, 79,239,155, 91,183,
+110,243,241, 11, 10, 39, 24,202,138,156, 63, 78, 78,155,191,104,217,136, 8,104, 35,237, 17, 91, 61,125,241,114, 96,231,144,183,
+223, 92,241, 25,223,215, 47,192,129, 33,205, 84,217,221,172, 62, 27,214, 46,219, 39,226, 21,174,187,174,196, 54,123,219,114,184,
+ 23,102, 9, 36,226, 73, 50,169, 67, 55,131,161,230, 22,109, 37,127,230, 9, 5, 99, 63,249,116,125,239, 97,163, 98, 28,233,154,
+ 50, 30,201, 32,124,207,238, 93,157,190,220,184, 41,230,166,146,126, 2, 0,211,150, 50, 51, 44, 22,229,238,152, 25, 35, 20,240,
+137,176,151,182,242, 1,170, 93, 66, 43,204, 27,207, 16, 44,108,134,151, 96, 9,252,150,165,194, 79,237, 57, 71,168, 55,190, 37,
+ 88, 4,131,192, 94,130,197,174, 76, 53, 84,220, 35,143, 3,135,127, 23,120, 60, 94, 10,195, 48,195, 31,178, 48,120,140,101,217,
+223,185,171,251,191,141,182, 89,180, 8,172,202,184, 93,236, 6,218,138,136,224,160, 15,129,182, 9, 45, 41,159,191,253,114, 94,
+185, 15, 40, 43,182,126, 52,119,183,133, 4, 40,210, 10,154, 34, 65, 83, 36, 40,202, 10,154, 36,193,146,102, 44,251, 46, 5,176,
+212, 32, 42,178,251,118,128,246,181,247, 28, 66,150,247, 99,218,185,147,238,132, 69,139,159,190, 78,120,189, 88, 93,251,250,169,
+235,138,138,112,111,227,146, 76, 21,190,111,139, 32, 72,249,102, 30, 18, 15, 28, 41,249,226, 91,125, 54,195,178,112,119,150,133,
+ 76,139,203, 8,216,113, 40,165,120,253,118, 83, 54, 0,184, 56,136, 67,166, 95,207, 11,124,144, 74,240,150, 74,215,111,222,244,
+165,143,175,135,140,160, 46,172, 6, 69,211, 8,232, 20,203, 95,242,218, 52,223, 85,159,111,251, 28, 58,243, 11,173, 29, 31,226,
+141,240,206, 93,194, 22,108, 63,114, 33, 80,175, 83, 89, 78,238,124,247, 54,204, 32,125,252,195,132, 31, 38,124,198, 95,250,206,
+188,183, 44,116,201,165, 28, 21, 50,109, 61,107,194,188,113, 40, 97,245,167, 61, 71,140,139,115,100,106,213,124,147,190, 54,120,
+235,119,219, 86,132,246,236, 39, 31, 28,217, 81,164,250,121, 54, 97,172,169,132,149, 39,149,140,136,136,118, 54, 62, 55,149,220,
+250, 67,226,107,153, 42,108,104, 75,153,105,246, 63,109,143, 97,218, 31,117,157, 96, 49, 56,253,247,148, 89,180,226, 50, 88,154,
+ 4,104,107,195, 55,104, 18, 44,115,239,187,255,236,239, 0,180, 79,104,241, 88,140, 62,117,238,178,111,121,153,178,239,231,159,
+126,188,132,189,124,249, 24,104,252,152, 85,137, 51,109, 21,152, 28, 56,112,248, 91, 91, 76, 40,150,101, 5, 15,153, 51,134,101,
+217,163, 15, 72,243, 54,128,151,235,182,183, 1,248,228, 33,100,173, 35, 0,159,186,237, 50, 0, 37, 92, 11,120, 32, 52,117,126,
+111,119, 28, 45, 41, 88, 6,216, 59, 1, 0,100,109,205, 5, 11, 72, 65,240, 1, 82,143,248,113,163,224,233,237, 3,144, 6,192,
+106, 0, 72, 35, 64,234, 1,210,136, 10,101, 33, 96,213, 3,249,199, 64,177,172,164,205,197, 53,107,129,220,159, 49,178, 79, 32,
+188, 92,164,152, 23, 31,238,185,229,120,238,182,109, 39,115,162, 51, 85,152, 98, 87, 94, 89, 22,253,123,116,195, 23,219,244,217,
+191, 92, 85,143, 1,128,152, 94, 30,199,251,135,119, 10, 88,191,221,148,125,244, 70,213, 88, 0, 24, 27,225,124,172, 95,136,111,
+ 32,131,246, 91,125, 25,150, 29,236,215,185, 27, 65,167,111, 6,163, 43,129, 78,103, 68,201,221, 29,112,243,127,148, 71, 51, 24,
+106,235,120, 25, 31,139,223, 88,186, 70,104,208,149, 91, 24,171,154,246,226, 87,241, 5, 98,134, 64,233, 25,115, 45, 83, 77,191,
+ 57,243,121,106,193,251, 31, 45, 6, 48,173, 53,158,112,111,188,182,110,221,250, 30, 3,163, 66,189,203,246,205, 35,106,171,202,
+ 65,241,229,146,248,199, 7,194,181,123, 56, 83,158,186,142, 16, 7, 69,195,213, 35, 8,165, 23,118,162,224,247,253,196,160, 62,
+ 19, 37,223,255, 36,122, 14,176, 54, 43,180,186,121, 98,208,152, 33,253,118, 7, 5,250,249,178, 44, 3,134, 97,193, 50, 52,106,
+ 77, 36,150,236,201, 7, 77,211,120,106,204,160,145, 14, 98,130,101, 24, 6, 44,203,160,184, 76, 99,248,245, 82,246,200,252, 42,
+ 92,178,199, 82,213,235,177,225,131,174,167,253, 30, 74,230,254,130,168,105, 9,217, 4,112,174, 81,155, 27,116,245,196,247,161,
+192,119,237,215,114, 4,232,130,227,171, 17, 56,100, 38,127,243, 79,199,189,180,234,210,233,251,118,108,122,250,235,205,155, 19,
+179, 85,152,205, 61, 95, 56,112,248,119,128,101,217,135, 46,182, 10, 11, 11, 21, 15, 34,182,252,253,253,135,148,150,150,174,173,
+247, 86, 33, 8, 98,109,231,206,157,151,253,167,163,122, 95, 95, 79, 75,211,244,180,210,210,210,179,173,113,198,198,198,250, 29,
+ 57,114,164, 75, 35,206, 46, 0,186, 52,151,214,213,213,149, 30, 48, 96, 64,193,145, 35, 71, 20, 92, 11,105,151,224,106,179,208,
+202, 46,250,121, 94, 31,179,178, 22, 0,178,237, 72,127,223,144,159,137,164, 87,255,176,226,249,213, 17,157,221, 81,163,183,224,
+228,149, 2,208, 52, 9,154,162,234, 44, 91, 20,104,138,196,152, 94,158, 24, 96,154,141, 13, 73, 57,160,104, 38,161, 53,206,166,
+176,178,204, 51,189,163, 39,239, 97, 24, 86, 44, 17,242,180,193, 1, 30,222, 11,158,234,197,155, 23, 31, 1,163,149,154,188, 51,
+245,246,175, 89, 42,108,181,139,147,249,115,200, 35,182,185,125, 52,101,179,236,173, 88,163,250, 71, 15, 27,236,204,154,181, 32,
+ 43,242, 81, 99, 32,145,175, 33, 81,102,170,134,132, 80,218,197,201,176,232,217,209,223, 87,126,126,247, 59,119, 61,248, 58,129,
+ 55,159, 18,137,121, 20,104,134,229,179,213,153,102,247,208, 81,194,122,191,173,214,242, 41,147, 59, 61, 63,100,116,172, 75,209,
+206,153,132, 44,120, 12,188,251, 4,224,238,217, 31,160,186,146, 4,141,162,128,112, 54, 85,163,131,199, 35, 24, 55,109, 10, 62,
+153,210, 23, 53,186, 26,240,149,183, 93,196, 66,137, 43, 96,109,150,147,165, 49,109,221,154,143,124, 5,124,222,189,235, 89,255,
+161, 73, 24,205,102,128,166, 32, 21, 48, 32,216,250,255, 72,208,164, 85,222,115,226, 59,115, 1,250,146,173,178,103,169,240, 83,
+184, 23, 6,131, 33, 67, 89,210, 8, 2, 56,151,169,254,143,248, 9,243,198, 51,143,142,121,113, 48, 75,224,183,246,212, 81,164,
+ 7,226,162,186, 56, 58, 56,232,178, 81,178,247,117,220,134,148,237, 48,240,101, 60,243,210,107,242, 45, 91,182,140, 7,216, 57,
+184,223, 71,237,175, 88,100,149,227,228, 56,255,145,156,206,206,206, 93, 59,119,238,188,140, 36,201, 33, 34,145,168,131,213,106,
+ 5,195, 48,101, 98,177,248,183,130,130,130,149, 58,157,238,206,223,173,236,215,175, 95,111,139,216,178,201, 41, 20, 10,145,147,
+147,115,171, 13, 98,235, 84,147,227,127, 60,119,238, 28,246,236,217, 3, 0,200,205,205, 69,247,238,221, 29,154, 59,240,238,221,
+187, 14,195,134, 13,251, 17, 64, 64,107,156, 55,110,220,232,250,203, 47,191, 96,239,222,189, 0,128,156,156, 28, 4, 7, 7, 55,
+155,153,115,231,206,241,159,125,246,217,174, 0, 20,255,133, 58,250, 55,136,172,198,223,255, 17, 90, 73, 73, 73,108, 92, 92, 28,
+209,116,187, 25,228, 7,186,137,251,192, 68, 3, 64,126, 91,115,144, 85,142, 53, 95,236, 56, 49,246,244,222,141, 67,164, 34, 30,
+150,111, 93, 80,172,174,172,121, 76, 64,220, 27,126,161, 88,240,220, 28,197, 23, 19,166,247, 10,172,170, 53,225,240, 31,165,103,
+ 51, 85,109, 51,145,102, 42,145, 12, 48,174,247,126,209, 48, 25, 85,193,211, 63, 73,222,181,107,241,216,158,111,198,247,196,161,
+ 11, 5,111, 2,148,205,168,239, 44,195,128,101,168, 6,231,247,186,174, 3,192,220,191, 40, 48, 3,246,222, 62,166,109, 22,173,
+161,128,160,202, 27,227,156,228,226,175,102,205,122,197,153, 84,231,161,210, 34, 66,113,149, 9,101, 70, 33,106, 5,222, 40,205,
+190, 65,243, 8, 36,219, 52,185, 16,208,177,148,201,213, 77,236,200,139, 28, 53,215, 95,119,252,221, 42, 49, 65,241,157,159, 92,
+229, 90,113,250,179, 2, 74,175,214, 19, 4,108,134,159,119,113,113,237,110,210, 20,240,181, 85, 21,112,245,137,192,216,201,113,
+248, 32, 54, 28, 53, 58, 61,212,149, 23,217,110,190,206, 68,225,111,137, 88, 58, 46, 12,154,114, 37,204, 36, 64,232,205,149, 38,
+139,169,182,197,235,200,195,230,249, 11, 23, 61,211,201,215,203,161,126, 82, 1,203,208,232, 21, 22,132, 81, 67,250, 35,249,220,
+121, 92,190,145, 11,166,110, 82, 1,203, 48, 40, 81, 85,149,155,172,244, 15,109,186,160, 52, 5,150, 52, 53, 43,196,208,142, 33,
+195, 72,111,200,105,224,253,190, 93,157,102, 44,142,235,228,228, 32, 33, 96, 34,105,152, 44, 36,106,206,127, 5,143,206, 61, 32,
+151, 74,137, 62, 48, 10,174, 2,220,186,133, 28, 56, 52,194,211, 79, 63, 45, 45, 47, 47, 79, 13, 8, 8, 8, 31, 53,106,148,124,
+240,224,193,208,235,245, 56,121,242, 36,244,122,125,167,128,128,128, 78, 39, 79,158,156, 88, 84, 84,148,217,177, 99,199, 97,123,
+247,238,181,219,135,182, 78, 0,241, 27, 30,193, 0, 69, 16, 4,234,246, 17,117,251,218,189,206,173, 88, 44, 70, 97, 97,225, 67,
+183,108,149,150,150,222,106,143,101,171,182,182, 86,228,239,239, 15, 47, 47, 47,208, 52, 13,189, 94,143,131, 7, 15, 66,171,213,
+130, 97, 24,200,100, 50,172, 90,183, 21,217, 87, 83,113,233,210, 37,104,181, 90,145, 45,206,146,146, 18,162, 87,175, 94, 48,155,
+205,160, 40, 10, 38,147, 9,167, 78,157,106,248, 45, 16, 8,176,232,195,207,145,123, 37, 21,233,233,233, 40, 41, 41,249,175,172,
+ 54,210, 6, 45,242,119, 68,139, 49,179,254,235,179, 14,105,154, 90,178,101,251,174,139, 75,102, 79,193,107, 83,163, 3, 86,110,
+220, 31,157, 85,129,237, 0, 16,230,137,233,207, 13,239, 22,232, 42, 23,226,131,157, 87, 0,150, 93,242,160,231,203,168, 68,110,
+120, 7,230,205, 3,151, 10, 83,223,157,210, 7, 65,190,206,221,171,196,149,226,252,124, 59,214, 20,100, 40,184, 57, 74, 66, 98,
+122,121, 28, 7,195,192,213, 73, 18, 10,154,130,171,163, 36,100,108,132,243, 49, 0,112,150, 11, 67,155,179,124,181,132,168, 0,
+225, 76,185, 68, 48,211,193,201, 53,240,133,241,163,100, 49,227, 39,202, 28,133, 20, 52,151, 78, 66, 39,236, 8,210,189, 19,204,
+100, 37, 74,238,220,166, 79,255,158, 85, 90, 81, 99, 94, 96, 51,155, 44,206,150,222,201,241,234,218,115,148, 91, 69,210, 82, 85,
+215, 23,119,118,225,129,225,213, 36, 62, 89,238,224,221, 79,246, 71,254,157, 90,134,109,214,162,115, 31,116, 90,109, 1, 73,195,
+215, 72, 11,156,110,167,124,143,197,227,122,160,170, 82, 5,147,149,130,214, 72, 89,125, 92,165, 18,243,157,155, 48, 91, 41, 88,
+ 72, 6, 66, 87,127,156,188,120,163,130, 33,201, 99, 45,113,230,107,144,158,127, 48,221,177,241,190, 32, 79,244,122,199, 89,150,
+ 14,210,136,194, 18, 5,182, 31,185,216, 39, 95,131,244, 7,169,103,150,161,238, 13, 63, 55,178,100, 17, 44, 6,183,199, 9, 62,
+212, 27,253, 68, 82,209,151,107,223,124, 54,252,241, 96,119, 9, 83,114, 17, 4, 99,133, 3, 45,128, 81, 76,195, 37, 32, 8,140,
+165,134, 53,152, 76,213, 25, 0, 23,233,157, 3,135, 70, 8, 9, 9,241, 41, 45, 45,205, 88,184,112,161,251,147, 79, 62,137, 3,
+ 7, 14, 64,167,211,225,135, 31,126,192,250,245,235,177, 98,197, 10,144, 36,137, 45, 91,182,200,247,237,219,215,111,211,166, 77,
+ 37,129,129,129, 17, 69, 69, 69,101, 54, 4, 22, 1, 64, 2, 64, 88,247,238, 34, 0, 48, 71,143, 30, 69, 76, 76, 12,142, 30, 61,
+202,212,237,163,113,175,243,211,174,245, 68,197, 98, 49,196, 98, 49,180, 90,237, 67, 17, 91, 66,161, 16,142,142,142, 16,139,197,
+168,169,169,105,179,216,162, 40,138, 95, 82, 82, 2,173, 86,139, 81,227,199,227,243,132, 4, 12, 31, 62, 28,163, 70,141, 2,203,
+178, 56,117,234, 20,162, 7, 70, 98,202, 19,195,144,149,149, 5,138,162,236,202,111, 89, 89, 25,202,203,203, 49,118,252,120,108,
+221,180, 9,253,251,247, 71, 72, 72, 8, 40,138, 66,106,106, 42,158, 30, 51, 16,210, 9,209,200,205,205,229, 26,181,253,214,172,
+135,226,163,245,192,200, 80,227,119,230,208,153,164,169, 99,250,197,141, 31, 20,142,173,187, 79,127, 4, 47,221, 46, 0,240, 48,
+ 75, 86, 61, 63, 60, 8,153, 69, 85, 56,157,174, 72,202,170,192, 67,153,173,193,208,240,244,112,150, 3,124, 49,140, 86,134,114,
+206,183,237,192,204,176, 44,228, 67,222,193,115,227, 51, 3,250,135, 7, 4,212,207, 58,116,140,249, 12,211,111,220, 10,236, 27,
+226, 19, 8,154, 4,104, 18,206, 83,118, 2, 31, 58,216,204,199,192, 46,226,228,249,243,230, 13, 24, 55, 97,178, 76, 44,119, 1,
+173, 43, 6, 89,118, 3,154,188,179,208,203,187,163,172, 48, 31,123, 78, 92,210,230,149,104,116, 60, 30, 78,150,107,205,111,231,
+ 87,161,214, 22,175,137, 68,194,178,165, 11, 98,247,236,218,237, 36, 9, 26, 68,220,254, 42, 70, 43, 22, 80, 18,175, 46,143,242,
+ 12, 82, 79,246,227, 31,118, 59,235, 45, 88,109,139,199,160,215,237, 63,117,242,248,148,110, 93, 7, 57,221,189,124, 4, 70,147,
+ 25,102, 18,136,232, 55, 12, 52,205,138, 9, 30,193, 56,243,249,132, 74, 83, 5,130,164,203,127,187,118, 87,121,238, 90, 62,223,
+236,132,213,173, 70, 23,105,170,238, 9,254, 27,227,135,245, 6, 72, 35,158, 24,210, 3,159, 39,158,126, 29,160, 95,124,176, 74,
+190,103,209, 98,129, 65,225, 94,248,134,101, 49,232,202,193,245,161, 81, 19,230,163, 45, 22,173, 8, 79,140, 11,235,234,247,253,
+231,171,222,113,247,232,216,157, 79, 48, 36, 88,159,158,128,174,132, 37, 74, 46,194,197,191, 63,104,191,129,216,178,225,211, 90,
+134, 97,119, 1,224,166,100,115,224,208,248,121,100, 50,237, 95,179,102,141,123, 92, 92, 92,189, 69, 6, 23, 47, 94,196,182,109,
+219,224,224,112,255,115, 50, 38, 38, 6, 44,203,186, 47, 95,190,124, 63,128,199, 91,226, 28, 48, 96,192,248,244,244,116, 69,239,
+222,189,243,235,196,150, 8, 0,239,230,205,155,188,226,226, 98,194,205,205,141,245,243,243, 35, 21, 10, 5, 3,128,126,233,165,
+151,248, 63,255,252,115, 55,189, 94,127,166,189, 66, 75, 44, 22, 63, 20,159, 45,161, 80, 8,130, 32, 32, 22,139, 33, 18,137,192,
+178,108,155,196, 22, 77,211,130,163, 71,143,226,202,149, 43, 88,209,187, 55,222,244,247,135,187,187, 59, 82, 83, 83,193,178, 44,
+ 28, 28, 28, 80, 89, 89,137, 93,187,118, 97,196,136, 17,160, 40, 74,100, 15,239,222,189,123,145,150,150,134, 15,163,162,240,166,
+139, 11, 28, 29, 29,113,234,212,189,209, 64,137, 68,130,194,194, 66,156, 58,117, 10,195,134, 13,227, 26,245, 3,194,238,198, 51,
+ 20, 16, 84, 18,240,177, 90,140, 96, 41, 22, 32,224, 23, 22, 6, 81, 86,214,253,206, 57,246,128,199,195,210, 13,219,147, 98, 63,
+155, 63,158,152, 25,223,199,111,229,247, 41,115, 0, 96,198, 83,193,254,114,137, 0, 95, 28,202,100,121, 60, 44,125, 24, 5, 12,
+ 11,131,136,208, 96,206,168,254, 33, 80, 84, 91,112, 91, 81,253,107,150,157, 67, 61,167, 63,123, 14, 59, 14,167, 22,175,223, 97,
+202,102, 89, 22,174,142,146,144,233,215,111, 7,126,127, 52,173,104,221, 30, 83, 54,203,176,112,149, 11, 67, 95,204, 26,104,115,
+214, 97, 84,128,112,230, 91, 11, 22, 12,140,127,113,161,148,202,254, 25,150,219, 39,192, 88,141,208, 89, 69,168,230,251,160,164,
+168, 8, 31,111, 73, 42,214,233, 45, 83, 50,212,109, 19,152,121, 26,212, 10, 8,221,147, 31,127,240,110,114,194,170,229,142,198,
+252,212, 90, 62, 65, 25,249,157,135, 10, 86,173,248,140,168, 49, 91, 38,231, 87,161,198, 22,143,217, 9,171,215,172,219, 16,251,
+202,180,137,217,193,221,135,122,208,138, 59, 30, 38,157, 78,181,243,120,154, 79, 93, 79,145, 0,128,219, 37, 26,168,181,122,138,
+166,200, 51, 78, 66,172,204,180,199, 58, 88,135,174,222,240,138, 27, 20,241,172,151,147, 8,198,218,106,120, 59, 9, 49,166,255,
+ 35,207,146,127,228,190,115, 71,213, 22,185,214, 84,104,145, 96, 73, 35,126, 95, 61, 34,148,165,201, 80,208, 36,172,215,127,108,
+187,101,140,192,155,175, 13,113,116,118,179,220,229, 65,239, 0,200, 60, 65, 56,119, 2, 92,186, 16,194,176,201, 80,228,103, 80,
+175, 63, 59, 77,115,167,160,228, 91, 79,217, 67,153,249,195,129,195,191, 10,133,133,133,207, 47, 89,178,228, 92,255,254,253, 59,
+120,122,122,162, 71,143, 30, 4, 75, 75,198, 0, 0, 32, 0, 73, 68, 65, 84, 56,124,248, 48, 22, 46, 92,216,144,166,119,239,222,
+ 96, 89, 22,149,149,149, 88,179,102, 77,153, 66,161,120,190,213, 14,122, 70, 70,246,142, 29, 59,134,132,135,135, 91, 69, 34, 81,
+ 53, 0, 73,117,117,181,180,178,178,146, 48,153, 76, 96, 24,134,113,113,113,161, 21, 10, 5, 57,101,202, 20,243,133, 11, 23, 30,
+209,235,245,133, 15, 98,209, 10, 8, 8,184,169,209,104,180, 4, 65, 60,112,232,135,122,145,229,233,233,233, 85, 91, 91,203, 0,
+168,106, 79,232, 7,138,162, 16, 21, 21,133, 19,103,175,226,232,233, 11,208, 41,114, 48,231,149,231,209,163, 71, 15,156, 56,113,
+162,221,117,214,171, 87, 47, 28, 63,117, 14,231,174, 92, 67, 97,238,117,188, 62,231, 21, 68, 68, 68,224,248,241,227, 92,131,182,
+ 31, 71,112,191,111,214,145,166, 66,107, 88, 82, 82, 82,125,207,252, 79,242, 53,212, 19,189,132,174,226, 31,151,143,123, 36, 76,
+ 56,106, 57, 8,161, 12, 63,119, 63, 62,112,233,199, 95,101,243,189, 11,167,221, 84,217,158, 29,118,223, 77,163, 66, 6,123, 41,
+251,167,107, 89,161,207, 62,209, 63, 0, 91, 15,203,223, 7,128,201,131,187,226,143, 60, 53, 46,229,170,126,202, 84, 35,227, 65,
+ 75, 29,233, 13, 57, 93,129,159,214,188, 17, 63,172, 83, 71, 31,108, 59,112, 14, 4,129,253,118,189,112, 89,150,237, 31,222, 9,
+235,119, 52,157, 97,232, 19,184,110,143, 41,251,100, 70,205, 56, 0, 24, 21, 42, 63,214,247, 17,183, 64,182,177,227, 86, 51,144,
+137, 5,179,198, 77,124, 78, 74,229, 30, 6, 10, 78,129,160,204, 48, 90, 25, 40, 43,106, 96,112, 9, 64,234,197,107, 70,173,201,
+ 50, 63, 83,221, 62, 43, 94, 86, 5,242, 69,151,175, 21,213,234,141,190,114,175, 71, 76,124, 30,195,212,154, 89,252,145, 89,160,
+203, 44, 67,142, 61, 28,249,249,176, 60,230, 79, 13,254,102,251,158,101, 66,145,120, 50,159, 0,225,237,234,224,245,205,103, 31,
+194,201,201, 17,140,165, 22,208,171,241,228,171, 31,171,111, 42,200,174, 0,208,221, 3,142,131,187, 10,183, 11,120, 68, 73,202,
+109,235,123,182,206, 65,144,152, 61,109, 76,111, 33, 99,209,227,141, 53,187,177,249,157,120, 60, 55, 50, 76,120,228,124,238,108,
+ 0, 43,219, 91,215, 44, 77,129, 37,141,120,252,221,179,217, 4,112,142, 5, 6, 93,217,179, 42, 20,184,106, 55, 71, 31, 64, 72,
+ 11,136,176,158,129, 14, 34,166,228, 60,152,146,243, 44, 63, 96, 32,136,192, 33, 4,225, 19,197,126,185,118,133,126,235,214,109,
+ 39, 25, 30, 62,176, 35, 84, 6, 7, 14,255,171,200, 87, 40, 20, 99, 99, 98, 98, 78,159, 56,113,194, 61, 50, 50, 18, 0,112,229,
+202,149,123,157,206,168, 40, 4, 7, 7,163,188,188, 28, 83,167, 78,173, 80, 42,149, 99, 97,195,231,183,166,166,230,206,222,189,
+123, 59,232,245,250,222,239,189,247,158,170, 83,167, 78, 58,147,201, 68, 84, 87, 87, 51, 20, 69,193,205,205, 77,220,187,119,111,
+ 12, 24, 48,160,246,226,197,139,157,139,139,139,107, 0, 20,180, 39,243,241,241,241, 56,123,246,222,164,189,135, 17, 87, 75, 36,
+ 18, 33, 50, 50,210, 63, 63, 63,191,180,238,221,210,230,103,124,227,215,203,181,107,215,112,230,106, 9, 4, 22, 35,196,106, 5,
+126, 63,176, 23,227,103,205, 5, 69,181,223,139,225,255,216, 59,239,240, 40,170, 54,138,159, 41,219,178,233,101,211, 11, 33,144,
+ 64, 32,244, 78, 16,144,166, 18, 62,138, 84, 65,154, 64, 64, 20, 16,165, 35, 69,165, 35, 69, 58,168,244,142,148,160, 2, 81,122,
+ 9,157,132, 36, 4, 2,132,180, 77,239,217, 62,229,251, 35,197, 4, 82,118, 19,108, 56,191,231,153,103,182,204,158,157,153,187,
+ 59,247,204,123,239,125,239,253,251,247,113, 60,244, 6,204,165, 52, 30, 61,122,136, 35, 71,142, 96,226,196,137,181,210,172, 33,
+ 85,122,145,127, 56, 74, 84,210, 79,139, 6,128,160,160,160,139, 37,209,138,178,248,248, 64, 34, 45,192,130, 30, 45,220,102, 12,
+ 14,172, 71, 25,242,146,193,177, 28, 40, 17,224,232, 96,133, 61,123,246,215,221,127,240,224,245, 77, 27, 55,173,231, 24,102,110,
+ 68, 26, 84, 38,236,212,130,111, 15, 94, 25,188,103,122, 23,122,226,187, 13,237, 0, 64, 76,147, 88,119,242, 33, 3, 96, 65,109,
+142,182,157, 27,100, 5, 6,140,119,180,183,158, 63,251,163,222,118, 93, 90,249,225, 98, 88, 4,214, 31,185,126, 73,146,134,221,
+ 70,255,184, 57, 3, 94,246, 79, 21,141, 58, 4, 87,125,191, 75,150,229,157,197,230,182,208,199,157, 7,244, 26,104,180,122, 36,
+100,178, 72,200,210,128,150,139,113, 59, 38, 81,109,159,130,144, 90, 28, 54, 97, 46,151,185,126,249,205,106,119,141,186,128,201,
+203,206, 96,196,146, 27, 34,185,153, 84,105, 74, 87,133, 27, 73,208,188,229, 45,106, 9,112,148, 68,198,171,230,124, 54,202, 60,
+ 41,242, 12,234,147,201, 32,120, 30,102,254,189, 97,105, 70,137, 3,235,136,226, 1,192,220, 92, 46, 89,190,232,115,235,169, 51,
+ 23, 85,219, 7,204, 31, 16,251,249, 56, 79, 13,240,178,197,165, 59,209,184, 20,254,226,225,165,219,143, 26,119,109,226, 10, 63,
+119,155, 41,146,236,156,101, 81, 48, 61, 66, 90, 84, 48, 12, 96,208,148,142, 58,244,119,196,176,214,131,231, 85, 54,218,176, 66,
+188, 1, 46,134,229, 65, 80, 20, 64,144, 69, 35, 32, 19,174,130,182,241,225,247, 31, 58,174,218,177, 99,247, 87, 81, 25, 66, 20,
+ 75, 64,160, 58,114,115,115, 31, 68, 69, 69,245,106,218,180,233,206, 79, 63,253,212,114,248,240,225,174,227,198,141, 35, 1, 32,
+ 53, 53,149, 91,187,118,109,242,119,223,125,151,155,145,145, 49,218, 96, 48,132, 27,243, 15, 87, 42,149,215,190,255,254,251,244,
+203,151, 47, 55,110,211,166,141,180,101,203,150,156,173,173, 45, 45,149, 74, 89,157, 78,167,137,137,137, 97,159, 62,125,234,146,
+147,147,243, 4, 64, 44,106,208,172, 95, 28,189, 90, 76, 81,212,151, 60,207, 7,188,142, 62, 90,114,185,220, 21,192, 19,130, 32,
+234,155,218,108,248, 74,133, 77,211,200,206,206,134, 42,229, 33,100,137,143,209,212,156, 68, 35, 91, 11, 88, 89, 89,213,202, 20,
+229,230,230, 2,133, 73,184,114,229, 62,192, 48,176,182,182,134,181,181,245, 95,110,180, 42,243, 34,255, 18,198, 87,240, 90,213,
+125,180, 26, 41, 48,209, 76,135,181, 19,122,215, 19,123,123,186, 67,155,120, 27,247, 19, 10, 48,183, 93,155, 72, 74,106,169,153,
+240, 97,223, 86, 3, 6,214, 65,151, 14,173, 9,111, 23,235, 41,203,190,221,252,113, 35,100,124, 30,153,134,117,198,236, 81,100,
+ 58,158,113, 72,219,113,254, 65, 98,176,187, 92, 13,142,227,113, 62, 92,137,240,184,236, 29,209,233,120,102,202,209, 53,114, 65,
+119, 26,228, 65,158,231,101,214,230,230,249,141,252,220, 29,186,183,111, 70,190,211,185, 21,196, 20,112,229,230,125, 76,251,246,
+216, 13,142,227,123, 27, 61, 66,140,227, 94, 49, 80, 69, 35, 12, 13,229, 70, 24,242, 60,207, 23,141, 58,172,186,219, 23, 69, 17,
+ 41,170, 23,183,156, 69,246,190, 80,199,158, 71, 92, 54,135, 23,105,249,200,163,157,161, 77, 74, 2,120, 46,254, 98, 45, 58, 86,
+ 59, 56, 56, 56,214,109,228, 87,111,195,174, 35,208,171,114,241,236,194, 78, 20,100, 43,241,245,150,147,245,220,220,236, 59, 39,
+ 37, 37, 93, 52,225, 98,227,247, 91,200,126, 71,240, 0, 37,146,226,244,166, 67,200,176, 55,131,131, 92, 12, 78,157,142, 9, 83,
+135, 91,191,219, 99,184, 53, 0,188,120,116, 15, 94,114,181, 81,186,122,123, 12, 24,220,181,129, 13, 12,106,236,250,245,158,134,
+ 4,222,217,125,246, 97,108,215,134, 54,178,193,129, 94,182,139,147,115,222, 71,102,205,146,138,150, 68,180, 74, 35,124, 53, 24,
+109,120, 4, 96, 27,114,136, 61,120, 45,205,124, 96,143,150,114, 49, 77, 16,124, 65, 18,120, 51, 7,108,222,117,184, 64, 98,248,
+107,102, 98, 23, 16,120, 19, 80,171,213,119,212,106,117,147, 47,190,248, 98,216,156, 57,115,222, 50, 55, 55,175, 11, 0,133,133,
+133,207, 12, 6,195,165,226,255,167, 41,163, 3,121, 0, 79, 98, 99, 99,159,197,198,198, 58,237,221,187,215, 6,128,172,248, 61,
+ 13,128, 28, 0,169,168,197,136,195, 18, 83, 69, 16,196,151,175,235, 60,148,152, 42,130, 32,234,215,228,243, 36, 73,178, 4, 65,
+128, 32, 8, 72,165, 82, 92,190,124, 25,131,122,247, 64,212,233, 28, 4,216, 88,160,205,232, 9, 56,120,238, 28, 40,138, 2, 65,
+ 16,160, 40,202,164,122,132,166,105, 92,185,114, 5, 35,134, 14,132,148, 6,172,173,173,241,197, 23, 95,224,196,137, 19,160,105,
+ 97,150, 62, 19,216, 86,198,112, 25,153, 71,139,192,226,115, 59,151,136,193, 26,112,106,231, 42,132, 68, 20,232, 30,165, 99,110,
+131,116,172, 61,130,124, 46,253,219,221,193,231,174, 68,172, 28, 51, 36, 72,254,118,215, 30,120,187, 75, 87,186,113,235,206,243,
+129,114, 70,171, 59,170,200,181,193,114,248,106,219,175,209, 19, 14, 94,136, 33,160,207,199,144,158,173,121,150,195, 87,213, 28,
+204, 43,154,214,102, 22, 7,175, 92,191,110, 11,125, 1,226,238,253, 46,171, 83,183, 30,192,234,241,228,201, 99,124,183,235, 39,
+238,194,205, 71,123,116, 12, 62,125,154,141, 66, 99, 53,139,156, 21, 3,107,115, 73,131,119, 26, 91,253,194,129,135,141, 92,220,
+144,231, 88,216,200, 69, 13,123, 52,148,255,194,243, 60,111,105, 38,106,200,179,134,106, 53,213, 58,102,235,174, 31,118,172, 30,
+ 59,118,172,121, 70, 98, 10,146,243, 34, 80, 32,113,131, 65,238,129,216,123,151,212, 42, 45, 99, 76, 37, 94,233,249,204,200,200,
+ 72,187, 19,150,133,131, 91,150,194,160,211, 34, 45,177,200,171, 38,103,228,193,202,193,237,122, 82, 82,146,209,154,122,134,203,
+ 29, 48,124,188,216,204, 18,102, 35, 6, 4, 73, 98, 51,181,104,225,106, 89,116,209, 40, 72, 71, 84,232, 21,116, 41,238, 99,250,
+ 52,129,132, 87, 51, 87,163,246,211, 82, 38,254,244,221,150,110,120, 22,175,196,229,135, 73,187,158,101, 33,153,141, 86,238,138,
+ 77,206, 9,238,219,206, 19,107, 78, 68,126, 2, 24,246,155,114,236,254,142, 24,198,243, 8, 44,234, 12,175, 6, 15, 4,250, 59,
+ 98,152,145, 35, 13, 95,209,164,197,248, 96,245, 47, 47,230, 29,190,149,209,119,198, 7,157,172, 58,116,120, 79, 2, 70,135,124,
+181,214, 16,149,131,188,218,148, 81, 45, 16, 52, 5,205,127,171, 38, 11, 96,143,193, 96,216,147,147,147,243, 58, 53,147,241,106,
+ 94,167, 90, 29,123,217,102, 66,158,231,233,226,104, 86,117,157,225,171,212, 44,219, 76,200,243,252,207,197,209,172,234,162, 90,
+229, 52, 57,142, 75,110,213,170,149, 93,159, 62,125,192,178, 44, 30, 63,126,140, 23, 9, 9,232, 30,252, 9,108,108,108,112,233,
+193, 3, 60,122,244, 8, 95,126,249, 37, 12, 6, 3,142, 31, 63,158, 88,157, 38, 77,211,250,122,245,234,137,251,245,235, 7,134,
+ 97,240,244,233, 83, 36, 37, 37, 97,218,180,105,176,182,182,198,157, 59,119, 74, 53, 51, 50, 50, 64,211,180,190,130,232,214,159,
+241, 91,250,183,243,138,201,170,218,104, 1, 44, 88, 3,114,207, 45,192,186,203,208,235, 13,104, 24,153,142,231,145,127, 68,164,
+ 54, 83, 97, 15, 78, 61,136,136,126,118,231,234,219, 18,164,133,195,212, 59,137,199,153, 80, 90,202,242,243,161,207,183,194,211,
+ 95,240, 60, 53,191,224,113, 38,148, 38,223, 49,112, 44, 1,189, 10, 80,222,198,181, 75, 23,113,225,198,125,220, 10,143,102,175,
+221,137, 57, 72,114,248, 42, 42, 19,143,107,112, 23, 2,139,222,107, 48, 42,252,137,103,107, 63, 39, 79,176, 12,120,206, 0,235,
+ 33,251, 49, 58,178,131,103,107, 31, 27,207,162, 72,150, 1,182, 31,253, 14,172,150, 85,169,119, 59,193,176, 77,114,226,204,251,
+249, 57,153,237,186,117,110,111,110,237,255, 46, 50,158,196,224,241,253, 43,234, 59, 17,177,215,110, 39, 24,106, 21, 45,113,115,
+115,123,171, 91,231, 6, 24, 50, 97, 54,244,170, 92, 60,189,240, 3, 10,178, 82,112,249,186, 5,162,243,242,218, 3, 48, 58,162,
+117, 61,158,105,140,248,108,116,172, 35,138,183,132,214,249,195,160, 62,144, 18, 26,112,218, 60, 16,170, 12,196, 38,233,114,223,
+223,146,192, 2,128, 92, 74,208,230,124,174,149, 81,145, 71, 47,123, 95, 57,101,192,238,115, 15,193,113, 69,211, 55,113, 28, 54,
+239,254, 61, 54,248,171, 17, 45,208,200,211,182,217,189,164, 52, 2, 38,132,252, 9, 30,157,110, 29, 92,212, 80,243,219,124,128,
+211,227,202, 20,187,134,157,214,101,117, 66, 13,167,219,137, 72, 70, 18,128, 96,208,170,173, 83,214,253, 58,191,213,185,200,192,
+233, 31,245,181, 2, 47, 76,192, 46, 32, 32,240,215, 83, 80, 80, 48, 97,244,232,209, 91, 69, 34,145, 2, 0,193,113, 28, 56,142,
+163, 87,174, 92, 41, 98, 89,150, 36, 73,146,165, 40,138,249,249,231,159, 13, 44,203,166,107, 52,154, 9,213,105, 50, 12, 19, 59,
+105,210,164,122,213,141, 80, 60,112,224, 64,137,201,138, 21, 74,194, 40,147, 85,118, 93, 26,229,170,188,242,224,177,168,227,136,
+ 5, 11, 0, 16,224,177, 48, 50, 29,207, 95,222, 36, 60, 11,201,141, 40,253,180,198,173, 59, 47, 40,249,140,169,123,166, 97,217,
+129,173,155,248, 29, 0, 0, 45,207,142,168,201,209,229,105,213,131,155,183,110,127,144,227,121,154,225,249, 29, 36,135,163, 26,
+ 6, 81,198,140,180,171,140,228,180,156, 59,239, 6, 88,243, 64, 81,147, 97,105,115, 97,113, 26, 7,158,231,249,210,230,194, 85,
+ 50,100,228,106,171,205, 3,117,245,185,174,135,142,185, 53,254,236,213,123, 19, 88,150,119,166, 40, 34, 69,173, 99,182,214,214,
+100, 1, 64, 82, 82,210,197,208,115, 73,103, 31, 52,115,234,233, 32, 47,142,114,169,128, 12, 21,206, 38,165, 23, 92,172,137,102,
+118,161,161,239,156,181, 39, 78, 74, 68, 20, 13,158, 47, 74, 40,202,243,208,232,217,172,235,241, 76, 99, 0,104, 98, 7,215, 47,
+142, 51, 7, 40,138,120, 81,157, 94,216, 35,229,154, 33,203, 66, 63,127, 24,151,189, 35, 46, 7, 17, 0, 16,151,131,136, 67, 87,
+158,207,143, 77,201,255, 60,226, 69,246, 42,152,216,175,130, 39,112,185,245,144, 5,175,188, 86,219,243, 25,173,196,125, 0,253,
+129,196, 30, 67,166,127, 55,157, 32, 32, 76, 63, 33, 32,240, 31,162, 36,170, 69,146,228,226,215,168,249, 51, 65, 16,239, 1,120,
+ 98,194,199,194, 10, 10, 10,154,188,230,195,203,100, 24, 38,211,152, 13,255,134, 14,241,255, 86,254,182,174, 37,221, 5,205,191,
+ 94,179,126,253,250,188, 9,134, 69, 56,159,130,166,160, 41,104,254,167, 52,121,158,167,106,179, 84,162, 73,212,102, 17,202,232,
+ 95,207,248,202,158, 11,205, 33,111, 32, 79,158, 60, 33,132,179, 32, 32, 32, 32, 80, 49, 4, 65,176,127,130,166,144,188, 88,160,
+196, 96,149,139,110,145,194, 57, 17, 16, 16, 16, 16, 16, 16, 16,120, 45, 38,171,236,186,200,132,163,242,240,159, 41,163, 9,106,
+ 18, 66, 12, 21, 52, 5, 77, 65, 83,208, 20, 52, 5, 77, 65,243, 63,167, 89,157,182, 48,154,241, 79, 54, 96,130,166,160, 41,104,
+ 10,154,130,166,160, 41,104,254,247, 52,255,205, 84,218, 71, 75,104, 58, 20, 16, 16, 16, 16, 16, 16, 16,248,147, 16, 58,195, 11,
+ 8, 8, 8, 8, 8, 8, 8,212,142,106, 39,149, 22, 16, 16, 16, 16, 16, 16, 16, 16,168, 25, 85, 79, 42, 45, 32, 32, 32, 32, 32,
+ 32, 32, 32, 80, 99, 76,159, 84, 90, 64, 64, 64, 64, 64, 64, 64, 64,192, 40,182, 9,167, 64, 64, 64, 64, 64, 64, 64, 64,224,175,
+161,252,168,195,144,144, 16,190,236, 90, 64, 64, 64, 64, 64, 64, 64,224,175,228, 77,245, 34, 66,211,161,128,128,128,128,128,128,
+128, 64,237, 24, 47, 24, 45, 1, 1, 1, 1, 1, 1, 1,129, 63,135, 74,251,104,149, 36, 44,237, 82, 28,170,235, 34,156, 43, 1,
+ 1, 1, 1, 1, 1,129,191,129, 55,219,139, 8,253,179, 4, 4, 4, 4, 4, 4, 4, 4, 47, 34, 32, 32, 32, 32, 32, 32, 32, 32,
+240, 79, 66,152,235, 80, 64, 64, 64, 64, 64, 64, 64,224, 47, 54, 92,127,186,209, 18,102, 54, 23, 52, 5, 77, 65, 83,208, 20, 52,
+ 5, 77, 65,243,191,100,178,202,153, 45, 97,212,161,128,128,128,128,128,128,128, 64,237,168,118,212,161,128,128,128,128,128,128,
+128,128, 64,205, 24, 15, 32,168,248,113, 16,202, 68,181,132,136,150,128,128,128,128,128,128,128, 64,237,216, 6,192,165,216, 96,
+157, 6,160, 20,140,150,128,128,128,128,128,128,128,192,235,161,108,191,172,222,101,204,151, 96,180, 4, 4, 4, 4, 4, 4, 4,
+ 4,106, 73,165,125,180, 8, 84, 62,114, 32,212,132, 47,168,201,232,131, 80, 65, 83,208, 20, 52, 5, 77, 65, 83,208, 20, 52,255,
+115,154,213,105,135,226,223,199,120, 83,204,215,235, 68, 24,250, 42,104, 10,154,130,166,160, 41,104, 10,154,130,230,127,150,215,
+ 62,234,176, 5, 96, 38,156,214, 55, 18,167,226, 69, 64, 64, 64, 64, 64, 64,160,106,254,156, 81,135,254,192, 71,195, 3, 20, 91,
+ 12, 17,233, 86, 17,128,170,170,109, 21, 10,197, 86,185, 92, 62, 92,165, 82, 21, 18, 4,193,149,188,206,243, 60, 0,148,157,235,
+232,105,122,122,122,167,234,190, 91, 34,145,172,117,114,114,250,168,160,160, 64, 69, 16, 4, 79, 16, 4, 8,130, 0,128, 87,214,
+ 44,203, 38,102,102,102,182,250, 87, 23, 33,207, 83, 14, 78, 78, 55, 69, 20,229,102,234, 71, 89,142,123,158,150,154,218,222,132,
+143, 44, 37, 8,204, 40,250, 90,172, 0, 48,251, 77,251, 71,240, 0,101,204,118, 1,128,101, 12, 48,132, 37,201, 79, 68,192, 70,
+ 45,199,109, 1, 0, 2, 96,107,250,221,218, 48,212, 35,120, 52, 35, 8, 88,243, 60,114,121, 2,247,165,109, 17,251, 55,157,138,
+ 1, 34,145,168,175,149,149,149, 69,102,102,230, 69, 0, 7, 0, 12,181,183,183,239,156,151,151, 87, 96, 48, 24, 78, 0, 56, 86,
+ 19,225, 78,205, 48, 83, 34, 22,141,209,232, 13,203,175,222,199, 15,157, 91,192,158,225,176, 76, 38,166, 59,105,117,204,138, 43,
+ 15,176,195, 68, 73,162,120, 41,185,102,152, 60, 71,218, 97, 35,203, 29, 0,142,219,218,250, 73, 21, 86,191,137, 36,212,243,156,
+212,130,225, 3,211,210, 18, 6,213,162,220,255,137, 56, 56, 56,140, 34, 73,242, 27,158,231,193,178,236,220,172,172,172,157,175,
+ 73,122, 46, 0,155,226,199, 57, 0,190,169,165,222, 11, 0,158,197,143,227, 1,120, 9,245,122,141,217,252,211, 79, 63, 5,119,
+237,218, 21,107,214,172,193,230,205,155,227,210,211,211,151, 1,216, 5, 64,247, 55,232, 8, 84, 70, 35,224,189,149,189,218,178,
+134, 31,191,226,202,188,220,189,146, 63,243,247, 31,126,248,161,158,231,121,254,209,163, 71,188, 78,167,227, 13, 6, 3,207, 48,
+ 12,207, 48, 12,111, 48, 24, 74, 23, 55, 55,183,164,151, 62,254,138, 38, 73,146,235,222,127,255,253,124,158,231,249,219,183,111,
+243,106,181,154,215,106,181,188, 78,167,227, 53, 26, 13,175, 86,171,203, 45, 78, 78, 78,169, 85,105, 90, 89, 89,221,182,181,181,
+ 77,181,181,181, 77,181,179,179, 75,181,179,179, 75,181,183,183, 47, 93, 28, 28, 28, 74, 23,133, 66,145,170, 80, 40, 82,237,236,
+236,110, 87,183,159,197,244, 2,112,209,136,165, 87, 5,159,237, 94,214,104,185,184,184,164,242, 53,192,221,221, 61,193,136,253,
+ 44,193,137, 32,192,150,124,150, 32,192, 73,165, 82,207,178,239,227,213, 72, 87,181, 33,101, 87, 87,215,247, 93, 92, 92, 66, 93,
+ 92, 92,206,185,186,186,190,111,196, 79,172,156,166,165,165,229,109, 7, 7,135, 84,103,103,231,180,146,197,197,197,165,220,226,
+234,234, 90,186, 56, 57, 57,165,218,218,218, 86, 90, 70, 60, 64, 85,182, 92, 0,104, 41,240, 54, 77, 81, 33, 78, 78, 78,121,225,
+225,225, 44,207,243, 60, 73,146, 73, 37,219,152,114,236, 47,155, 44,213, 21,204,205, 56, 47, 13, 43,120,190, 44, 55,227,188, 52,
+ 76,117, 5,115,181, 97,168, 87, 83, 77, 35,169, 72,115,228,200,145, 35,239,167,166,166, 38,229,228,228, 40,183,108,217, 18, 35,
+147,201,174,108,217,178, 37, 38, 39, 39, 71,153,154,154,154, 52,114,228,200,251, 0, 38,153,160, 9, 0,104,223, 12,237,198, 14,
+112, 81,221, 63, 62, 66,245,118,107,250, 94,199, 0, 4,245,104, 47, 78,218, 48,203, 95,117,105,123,160,170,107, 75, 50,194, 68,
+ 77,130,166,233, 14,158,158,158, 99, 20, 10,197,135,197,203,136,146,197,217,217,121,132,179,179,243, 8, 91, 91,219, 65, 85,105,
+ 30, 6, 40, 99, 22, 15,153,172,195,160,186,158,170, 23,139, 23,242,225, 83, 63,225,199,248,120,228, 13,116,116,172,243, 55,148,
+209,159,170,233,232,232,152,108, 48, 24,120,189, 94,207,219,219,219, 39,191,198,253, 92,197,243,252, 42,158,231, 87, 1, 88,245,
+ 26, 52, 75,175,103, 38, 24,236,170, 52,101, 52, 73, 78,151, 75, 36,231,164, 52,157, 38,165,233, 52,185, 68,114,142, 38,201,207,
+ 1,200,254, 73,101,244, 39,104, 90, 40, 20,138,103,107,215,174,229, 85, 42, 21,175, 82,169,248,181,107,215,242, 10,133,226, 25,
+ 0, 11, 19, 52,107,170,243, 38, 69,176, 94, 94, 94, 95, 68,203, 31,104,245,118,179,250, 71,167,140, 26, 2,238,200, 90,162,154,
+ 59,166,239,219,183,106, 53,102,215,174, 93, 0,128,225,125,251,162,103,155, 54,176,180, 48,135, 68, 82,180, 59, 4, 79, 64, 44,
+ 18,163,223,180,207,140,249,250, 21,253,250,245,251,224,200,145, 35, 22, 0,176,121,243,102, 12, 24, 48, 0,118,118,118,144,203,
+229, 16,139,197, 16,137, 68,229,214,213, 65, 81,148,123, 82, 82,146,163, 76, 38, 43,141,178,113, 28, 87,110,225,121,190, 36,250,
+ 6,134, 97,224,235,235,107,236,233,154,149,155,155,251, 86, 97, 97, 97,169, 70, 69, 75,221,186,117, 1,224,140, 49,130,223,124,
+253, 21, 56,166, 16, 52, 13, 48, 12,160,213,147,224,248, 10,205, 13, 38, 77,154, 84,186,223, 53,161,119,239, 32,130, 32,136, 35,
+119,238,220, 57,154,150,150,230,205,113,236,184, 26, 70,186, 62,126,252,248,177, 5, 0,248,249,249, 77, 2,112,212,148,253,160,
+105,218,253,193,131, 7,142, 82,169,180,210,200,101,153, 8, 38,244,122, 61, 90,180,104,193,152,242, 29, 78,128,103, 22, 73,142,
+107,222,178,229,248, 5,253,250,201,110,222,188, 41, 35, 73, 18, 12,195, 96,229,202,149, 12,207,243, 54,141, 0,171, 72, 32,175,
+ 10,153, 57, 0, 70, 21, 87, 6, 59, 0,172, 44,231, 22,120, 52, 83, 27,164, 65, 79, 11,250,181,105, 91,103, 38, 34, 31,134,183,
+241,177, 56, 14, 75, 90, 27, 11,252,181, 81, 45, 43, 43,171,190,107,214,172, 81,236,216,177, 35,239,209,163, 71,250, 45, 91,182,
+ 40, 38, 76,152, 96,169,215,235, 17, 28, 28,156,222,160, 65, 3,241,154, 53,107, 20,199,142, 29,123,187,176,176,112,147, 73,229,
+ 69,224,171,161,125,123, 66, 99, 32, 97, 48, 48, 10, 23,133,229,158, 41, 35,187,136,120, 94,135,221, 39,238,192,192,112, 63,152,
+ 24,201,106, 63,112,224, 64,159,253,251,247,211,209,209,209,116,195,134, 13,193,113, 28, 88,150,133,193, 96, 0, 0,112, 28,135,
+250,245,235,215,250,188,140, 1,252, 28,156,236,206,181,127,239, 93, 51, 23,153, 20,118,217,233, 24, 43,166, 45,119,202,181,123,
+ 1,116,120,163, 34,187, 60, 15,154,166,145,144,144, 0, 71, 71, 71, 51,142,227,148, 0, 22,102,103,103,111,195,155, 75, 27, 9,
+ 77, 31,221,253,195, 58,231,182, 29, 58, 80, 78, 46,142,136,121, 28, 15,154, 96,187, 63,184,117,167,203,152,137,211,167,232, 24,
+230,125, 0, 55,223,180, 3,119,238, 48,169, 63, 65, 82,155, 9,158,195,162, 13, 39,243,151,174, 88, 43, 15, 30, 55,146,154, 54,
+109, 26, 60, 60, 60,188,251,247,239,191, 2,192,196,106,117,218, 78,234, 15,138,220, 12,158,199,130,239, 78,230, 47, 89,177, 86,
+ 62,177, 6, 58,255,114, 42,253,143,212,218,104,249, 3, 62,141, 61, 28,207, 46,157, 49, 81,196,255,242, 35,169,202, 76,171,116,
+ 91,133, 66,177,245,157,119,222, 25,190,115,231, 31,209,232,246, 1, 1,232,255,118, 32, 28,237,173, 33, 55,151, 20, 85, 71, 28,
+129,251,143,158, 27,101, 8, 60, 60, 60,130,143, 30, 61,106, 81,214, 76,136,197,226,210,165,172,201, 42, 89, 74, 42,224,170,144,
+201,100, 8, 13, 13, 5, 77,211,160, 40, 10, 52, 77,151, 46,101,159, 83, 20, 5, 39, 39,147,186, 46, 45,179,182,182,110,154,159,
+159,111,149,147,147, 3, 79, 79,207, 60, 0, 15,202,188,223, 52, 61, 61,221,202, 20, 65,142, 41,196,180,177,254, 16,233,110, 64,
+ 39,106, 3, 53,221, 17,215,110, 69, 33,228,204, 69, 36, 37,167, 32,176, 93,115,124, 56,108, 32,206,157, 59, 7,150, 53,185,165,
+ 35,149,231,177,162, 79,159,160,153, 0, 65,116,239,222, 61,103,242,228,201,100,116,116,244, 7,253,251,247, 11,120,252,248, 73,
+113, 84,145,152,193,243, 88, 7, 32,213, 72, 93, 9, 0, 92,186,116, 9, 0,164, 53,249,237, 73,165, 82, 92,191,126, 29, 37,205,
+196, 36, 73,130, 36, 73, 80, 20,133, 83, 79, 28, 80,168, 35,161, 74,141,192, 39, 65,158,168, 91,183, 46, 72,178,250, 46,137, 93,
+ 0,217, 53,160, 63, 33, 18, 77,115,113,117,245,238,236,227, 35, 15, 13, 13,165, 0,192,203,203,139, 87, 42,149, 57, 39, 78,156,
+200,167,129,205, 94, 60,191,171, 42,147,229,225,225,209, 49, 41, 41,233,155,146,115, 78, 16,196,138, 58,117,234,124, 89, 90,110,
+ 28,135,133, 63, 20,138,166, 76,153, 42,110,219,101, 30, 0,160,109,159,253,200,123,186,212,159,200,154, 99,253, 87, 95, 37,242,
+242,242, 14,214,175, 95,159,202,204,204,188, 6,224,133,193, 96,152,181,103,207, 30,199,177, 99,199,166,237,221,187,119, 25, 0,
+215,229,203,151,119, 41, 44, 44, 60,100,138,110, 96, 83,188,215,178,105, 64, 59, 79, 15, 15, 92,188,118, 19, 98,137,200,102,210,
+168, 32, 88, 88,208, 88,181,227, 52,247, 34, 49,107,242,149, 7,216,101,130,201,106, 51,112,224, 64,239,253,251,247, 75, 0,224,
+193,131, 7, 72, 73, 73,129, 66,161,128,153,153, 25, 68, 34, 17, 40,138,130, 72, 36,122, 45, 38,203,218,195, 62,236,248,241, 19,
+102,118,118, 54,216,240,217, 20,124,152,150, 10, 27, 75, 11, 24, 10, 10,189,223,176,138,194,175, 83,167, 78, 50,150,101, 81, 88,
+ 88,136, 11, 23, 46, 88,155,153,153, 89,187,187,187, 47,128, 9,163,167,100, 50, 89,170, 70,163,113, 44,126,156,166,209,104,156,
+ 0,228, 73,165,210,146,235,116, 65,241,218,216,230,196, 23,120,181,153, 48,158, 32,136,178,175,213,148,214,109, 90, 55, 13, 61,
+118,100,159, 69,110,126, 10,108,108,211, 64, 34, 23,219,182,109,132,153,153, 21, 22, 44,152, 67, 63,239,254,182, 91,175,247,222,
+ 15,125, 24, 21,211,253,141, 51, 91, 60,177,173,123,159,225,118,102,114,203,226,186,196,128,157,219,167,128, 36, 73,124,249,229,
+151,104,220,184,241,248,135, 15, 31,206, 3,144, 85,181, 12,182, 53,121,107,176,157, 68, 86, 84,196, 28,107,192,150, 3,159, 23,
+233,204,158,128,161,125,234,142,255, 98,224,179, 95, 27,251, 32,191,248,198, 92, 45, 34, 17, 79,180, 69,169, 97, 8, 9, 9,233,
+ 28, 20, 20,116,177,178,231,255, 2, 92,240, 71,254,172,114,230,139, 14, 9, 9,225,131,130,130,136, 50, 7, 87,238,121, 85, 52,
+ 3, 28,108,173,229,161,155, 23, 78,177,160,111,156,166,212,241, 79,144,172, 41, 87,145,151, 27,162, 41,151,203,135,239,220,185,
+179, 92, 72,201,211,201, 17, 98,177, 8, 34, 49, 1,155, 78, 69,217,235,115, 46,135,128, 32, 42, 53, 89,229, 52, 11, 11, 11, 53,
+247,238,221,179,216,177, 99, 7, 28, 29, 29,225,237,237, 13,185, 92, 14,153, 76, 86,206, 92,149, 53, 92, 21, 24,173,114,154, 37,
+239,211, 52, 13,146, 36,113,238,220, 57, 48, 12,131,129, 3, 7,190, 98,178,104,154,174,204,184, 85, 54, 60,245, 12,128, 7, 60,
+207,191, 85, 92, 1, 63, 0,208,185,204,251,189, 20, 10,197, 44, 0,203,140,213,164, 40, 30,148,230, 26, 56,247,181,160, 19,166,
+ 64, 39,106,134,243, 87,238, 96,231,214, 53, 0, 0,239,134,173, 49,168,127, 80,105, 52,206,200,253, 44,197,205,205,237, 64,122,
+122,198,187,111,191,253, 54,178,179,179, 13, 11, 23, 46, 68,211,166, 77,225,231,231,103, 84, 25, 85,114,231,156,250,224,193, 3,
+ 15,181, 90, 13,158,231,141, 49,103,175,104, 18, 4,129, 61,123,246, 64,163,209,188,178,177,109,231, 37,248,124,128, 23, 70,127,
+178, 11, 43, 30, 29,194,166, 77,155,170, 60,118, 57,208, 84, 99, 93,127,157,132, 98,154, 46,155,243,177,244,195, 15, 63,164, 70,
+143, 30,141,248,248,120,140, 29, 59, 86,115,238,220, 57, 93,138, 82,121, 66,194,113, 27,244,229,141,113,165,154, 82,169,116,247,
+153, 51,103,112,232, 80,145, 47,137,137,137,129,175,175,175,121, 57,147,156,117, 24,249, 47, 54, 32,236, 84, 52,218,246,217,143,
+176, 83,195,192,230,156, 22,181,242, 69,174, 41,231,179, 6, 84,164,121, 40, 51, 51,179,212, 68,237,221,187,215,108,239,222,189,
+253, 0,156, 4,112, 8, 0,178,178,178,190, 53, 81, 19, 32, 48,122,240,128,126,160,197,150,136,126,146,136,206,237, 91,192,201,
+209, 17, 15,162, 98,241, 34, 41, 43,149, 32, 48,170, 87, 7,201, 50,181, 90, 55,239,242,125,124, 95,141, 38,225,238,238,238,119,
+248,240, 97,113,153, 8,116,233,127,156,162,168,210,231, 37,198,187, 38,191,207, 18,147,101,233,110, 17,246,213,198,142,230, 97,
+225,123,225,235,245, 30,108,223, 11,194,247,103,207,226,241,195, 72,141, 78,197,116,251, 27,202,232,207,210,244, 27, 48, 96,192,
+181,125,251,246,217, 36, 36, 36,224,210,165, 75,240,246,246,134, 74,165, 50,230,134,183,156,166, 70,163,113, 44,249, 12, 65, 16,
+142, 37,129,119,157, 78, 87, 82, 24, 37,127, 68,155, 50,219,217, 84,161,233, 89,102,187, 18,115,229,245, 26,142, 93, 34, 19,139,
+ 15, 31, 63,118,192, 34, 50,250, 18,154, 55,107, 7, 11,235, 70,224,216, 20,100,102, 21, 32,251, 73, 50,190,254,122, 5, 22, 44,
+156,139,147, 63, 29,177,104,224,223,236,168,142, 97,234, 3,208,188, 49,229, 78,240,227, 67, 79,237,221, 76,240, 28,212,169,209,
+ 82, 81,225, 51,249,240, 97,239, 83, 67,134, 12,193,201,147, 39,241,240,225,195,205, 85,152,172,208, 50,145,249,241, 17,151, 14,
+109, 6,207, 67,157, 22, 45, 21,171,159,201, 71,126, 48,136,250,112,104, 79,220,248,125, 29,122, 54,127, 22,225,234,136,254,217,
+197, 22,155,166,144, 41,149,225, 42, 31,134, 27,101,204,214, 5, 0, 68, 25,131,117, 1,127,244,193,252, 55,208,187,216, 88,141,
+127,249,198,132,174,137,193, 2, 0, 95,192,130,144,136,195,118, 46,248,216, 85, 30,255,144,214, 70, 92, 71,178,150,227,183,196,
+ 49, 92, 11,192,236, 46,160,126,249, 51, 42,149,170, 48, 54, 54,214,108, 84,255,254,232, 16, 16, 0, 23,123,123,212,119,119,135,
+153, 84, 2,137, 88, 84,238,150,213,232, 54, 4,130,224, 27, 52,104,128, 62,125,250, 64, 36, 18, 65, 46,151,195,194,194, 2, 18,
+137,164,194,104,150,177,119,185, 60,207,131,162, 40, 68, 68, 68,224,197,139, 23,176,177,177,193,213,171, 87,209,173, 91,183, 87,
+162, 90,101,205,153, 41, 33,250, 10, 42,254, 18, 35,118,198, 20, 45,150, 37, 80,192, 55,131, 44,110, 50, 84, 68, 11,104,181, 12,
+180, 90, 45,190,191,162,199,205,216, 66,232,245, 58,104,181,218,170,190,179, 50, 72, 87, 87,215,225,245,235,215,159, 52,108,216,
+ 48,131, 68, 34, 65, 97, 97, 33, 84, 42, 21, 30, 62,124,104,120,247,221,247,114,250,244, 9,178, 62,125,250, 52, 95,220,116,152,
+106,130,118,166,155,155,155, 71,113,243,108,102, 77,126,213, 4, 65,148,154,152,151, 25,245,109, 36,104,170,168, 76, 54,111,222,
+ 12,150,101,193,243,124,165,133,164, 33,136,223, 22, 46, 89,109,189,124,237, 15,176,182,115,194,197,139, 23,217, 95,127,253, 53,
+159, 0, 98, 30, 63,124,248,237,255,128,159, 15, 3,122, 83,246, 47, 59, 59,219,204,219,219, 27,238,238,238,224, 56, 14, 6,131,
+161, 52,250,146,153,153, 9,181, 90, 13, 59,243, 28,212,179,119, 7,147,127, 1,202,136, 69,112,177,136,198,174, 51, 58, 67, 75,
+ 63,220,255, 7, 92, 56,126, 44, 94,106,121,215, 12, 55, 71,103, 15,144,188, 1,201,105,153,232,215,187, 39, 40,177, 5,158, 39,
+100,160, 89, 35, 31,151, 15,254,215,209,133, 34, 24,204, 88,182,127, 18,192,125, 95,157, 92, 65, 65, 1, 27, 29, 29,141, 7, 15,
+138,252,174,149,149, 21,204,205,205,203,253,199, 73,146,172, 85, 68,171,196,100, 45,217,220,205,156, 20, 21, 34,143, 13,197,142,
+ 61,119,208,172, 65, 16,182,132,221,210,176,169, 89,221, 87,105, 52, 49, 7,254,197,193, 12,103,103,231, 9, 28,199, 45,224,121,
+ 62, 39, 48, 48,208,105,255,254,253,182, 73, 73, 73,184,115,231, 14,190,252,242,203,116,150,101, 25,158,231, 9,158,231, 23,189,
+134,175,227,202, 24,172,215,137, 72, 46,195, 39, 14, 86, 68, 95,154,180,242,102,242, 10,158,103,232,248, 19, 42,134,251, 14,128,
+161,202,139, 27, 73,126,116,228,224,102, 87, 7, 5,135, 46,138,183,161, 76,213, 99,201,103, 35,145,153,153,143,239,183, 47, 5,
+ 32,129,158,161,240, 86,151,247,225,232,232,134,241,227,198, 59,111,222,186,229, 99,134,227, 86,225, 13, 33,229,218,166,159, 0,
+132, 42, 20,138,135, 31,143, 31,175,240,246, 30, 1,153, 76,134, 3, 7, 14, 96,255,134, 13,236, 90, 96,144, 20, 56, 31, 12,252,
+ 84,165, 78,216, 31, 58, 83,130,131, 21,254,254,193,144, 74,165,248,253,215, 31,161, 73,217,147,223,187, 3,244, 42, 13,122,215,
+233,195,219,197,157, 34,178, 68, 34, 60, 1, 0,145, 12, 74, 0, 47, 55,131,253,219, 12, 86, 9,167,241, 71,191,172,241,229, 34,
+ 90, 53,190,118,138, 36,225,219,167, 14,245,114,130,150,208, 93, 57,133, 36, 45,199, 46,127,172,167,238,230,242,159, 71, 85, 96,
+178,138,127,216,156,167,167, 39,222,110,213, 10,253, 59,117, 2, 77,211,144, 73,196,176,148,153,129,103,139, 34, 89, 37, 77,135,
+ 85,212,137,168, 40,250,100,111,111, 15,177, 88, 92,106,176, 76,136,102, 85,168,201,113, 28,104,154,198,131, 7, 15, 16, 24, 24,
+ 8, 15, 15, 15, 28, 58,116, 8,189,122,245,122,165, 41,209, 84,147, 85, 98,180, 94,106,198,235, 5,160, 36,146,101,146,209,210,
+232, 8,100,232,154,129, 32, 2,192, 48, 0,203, 3, 90,141, 6, 60, 15,240, 60, 96,208,235,160,209,104, 74,191,211,152, 38, 89,
+103,103,103, 79, 51, 51,179,197, 51,103,206,240,111,214,172, 57,210,211,211,193,113, 28,204,205,205,161, 82,169, 96,101,101,133,
+ 14, 29, 58, 60, 95,188,120,177,146,231, 49,222, 68,147, 85,107, 74,206,249,217,179,103,203, 53, 27,150, 44,133,202, 68,140,254,
+116, 47, 36,116, 81,211, 82, 73, 31,158,170,174,187, 93,223,234,136,107,119, 99,152,143,102,172,211,138, 50,239, 44,115,230,184,
+157,137,181, 56, 46,158,231,145,145,145,129,212,212, 84,244,237,215, 15,251,247,237, 67, 92, 92, 28, 26, 53,106,132,174, 93,187,
+194,209,209, 17,113,113,113,184,121, 89, 11,109,118, 22,178,116,119, 32,183,108,139,227, 23, 99,181, 95,110,214,199,254,141, 23,
+140,190, 0, 70, 90, 89, 89,213, 85,169, 84, 74,134, 97, 14, 3, 56, 12, 96, 16, 77,211,131,228,114,185, 75, 94, 94,222, 51, 20,
+141, 38, 58, 81,157,152,153, 76,102, 47,149, 89,129, 99,180,160,105, 26, 30, 30,222,224, 89, 29,178,243,212, 24, 53,164, 15,238,
+ 62,136,194,175,231,111, 48, 6, 3,183,222,152,211, 74, 81, 20,239,231,231,135,180,180, 52,136, 68, 34,152,153,153,193,194,194,
+ 2,179,103,207,198,134, 13, 27, 74, 77, 86, 77,141,214, 24,192,207,202,211,226,198, 55, 27,139, 76, 86, 74,178, 18,169,137, 34,
+ 40,236,157,176,126,195,218,194,236,184,148,182, 63, 0, 49,255,246, 74,150,227,184, 69, 73, 73, 73,142, 52, 77, 59, 51, 12,131,
+132,132, 4,220,190,125, 27,147, 39, 79, 78,205,204,204,236,130, 26, 30,163, 76, 38, 75, 43,137,100, 21, 55, 29, 86,214,156,152,
+ 83, 38,146,149, 83,133,100,101,205,132, 62,222,238,150,231,182,175,153,230,217,186,109, 7, 82, 78, 91,101, 23, 60, 73, 9,188,
+114,233, 98,135,201,107,190,255,248, 69,118, 65, 79, 0, 79, 43, 19,149,138, 68,239,182,235,216,145, 6,159, 10, 90, 18,136, 21,
+203,135, 32, 61, 35, 15,217, 89,249, 16,139,205,161, 51, 80, 96, 57, 2, 29, 2, 59,225,199, 93, 7,209,120,220, 88, 74, 34, 18,
+245, 96,116,186, 55,198,104, 21,179,244,187,239,190,243,108,208,160, 1,118,238,220,137,243,187,119,227,195,220, 92, 92, 36, 73,
+202, 32, 18, 57,252,108, 48,108, 67, 53, 70,171,172, 78,227,198,141,241,195, 15, 63, 96,207,158, 61,241,195,187,165, 29,157, 54,
+ 28,142,122, 61,222,185,243, 8,118,117,250, 0,119, 30,193,174,101, 3,212,103,104, 60, 33,136,242,233,160, 66, 66, 66, 58,151,
+ 93,255,203, 80,162,146, 38,118, 26, 64,151,144,144, 16,190,236,186,218, 11,232, 44, 71,207, 0, 0, 32, 0, 73, 68, 65, 84,167,
+194, 55,120,105,207,186, 94, 1,245, 60, 9,195,161,117, 72, 40,100,116,243, 30,233, 37,143, 11,248,105, 81,192,218, 42,238, 32,
+120,138,162, 96,105,102, 6,133,141, 77, 81,152,159, 36, 1, 14,224, 12, 0,193, 22, 25, 0,158, 35,192,179, 38, 93, 48, 32,145,
+ 72, 42,236,248,110,106,223,172,178,154,249,249,249,120,254,252, 57,198,143, 31, 15,185, 92, 94,228,220, 83, 82,224,229,229, 5,
+154,166,145,148,148,132,223,127,255, 29,117,235,214,133, 84, 42, 53,201,109,149,137, 46, 53, 69,209, 40,195,166, 74,165,210,202,
+197,197, 5, 38, 71,180, 56, 30, 42, 45, 1,157,142,197,227,199,143,145,156,156,140,231,207,158,160,117, 97, 30,120, 80,224,121,
+222,164,136,150,155,155, 91,128,143,143,207,150,101,203,150,137,221,221,221,193,243, 60,108,109,109,160, 82,169,144,145,145,137,
+ 70,141, 26,193,195,195, 3,203,150, 45, 3,128,253,127,181,201,122,233, 55, 85,106,180,202, 26,174, 79,255,231,137,172, 44, 11,
+ 80, 20, 89,106,156,171,233,163, 37, 6,128, 46, 61, 7,208,231,126,253,217,156, 1, 22,167, 80,212, 98,186,250,114, 52,176, 28,
+ 39,175,236,253,132,132, 4,136, 68, 34, 28, 57,124, 24, 89,169,169,104,214,172, 25,218,180,105,131, 39, 79,158,224,238,221,187,
+176,183,183,135,194,189, 61, 46, 62,211, 35, 50, 89, 13,107,107,107,196, 38,146,127,103,202,128,113,221,187,119,255,242,219,111,
+191,117,116,118,118, 22,165,167,167, 55,216,184,113, 99,179,141, 27, 55, 78,249,248,227,143,157, 62,254,248, 99, 91,133, 66, 65,
+167,164,164,248,125,246,217,103, 45, 67, 67, 67,235, 2, 88, 93,149,160,185,185,165, 29, 37, 54, 7, 65,208,176,177,182, 5, 45,
+ 49, 7,199,208, 96, 57,192,202, 90,129,107,119,143,224,106,120,254,132,180, 76, 28, 54, 42, 62, 86, 92,238,246,246,246,175, 68,
+170, 39, 79,158,140,237,219,183,151, 54, 35,214,212,100, 45,217,216,205,130, 40, 54, 89, 41, 9, 52, 8,109, 93,156,250,233,122,
+ 78,118, 92, 74,224,155, 96,178, 74,174,113, 60,207,227,217,179,103, 80,169, 84,184,124,249, 50, 22, 45, 90,148,254,178,201,114,
+116,116, 28,103,101,101,181,176,160,160, 96, 69, 74, 74,202,186,106,111,252,138, 76, 84,201,227,146,117,133,205,137, 70,238,170,
+ 87, 69,145, 44, 15, 23,217,153,187,151,247,122, 89,243,247, 9,188, 24, 15, 60,206,123,104, 25,230,248,214,123,173,123,147, 45,
+ 54,125, 85,167,205,132,217,103, 18,242, 52, 13, 42,139,108,113, 44,219,194,220,194, 18, 64, 26,238,220,190, 80,106,178, 50,179,
+114,161,213, 83,208,234, 8,104,244, 36,222,238,254, 14, 54,108,217,131,164,180, 44,176, 44,219,228, 13, 51, 89,118, 1, 1, 1,
+193,131, 6, 13,194,226,197,139, 17,250,237,183,186,137, 4,145, 71, 3,252,105,150, 5,199,243, 4,105, 92, 39,246,114, 58,171,
+ 86,173,250, 9,192,208,101,147,209, 62,187, 0,163, 92,251,240,118,117,250, 20,109, 56,112, 38, 15, 0,118,233,161,229,171,204,
+160,160, 32,162,164,101,205,212, 22,182,127, 58,116, 80, 80,208,197,144,144, 16,148, 93, 87,245, 1, 75,167, 6,239,125, 49,125,
+210,242,214,189, 58, 17,202,233, 61,144,149,167, 97,230, 68,234, 37,137,234,170, 77, 86, 89,190,216,184, 17,119, 99,138,254,199,
+238,142,142,152,241,193, 7,224, 25,224,234,195, 72, 28, 12, 13,197,144,238,221, 97, 46,147, 25, 29,217,224, 56,174,194, 40, 86,
+217,104,150,169, 81,167,156,156, 28, 28, 62,124, 24,109,218,180,129, 92, 46, 7, 77,211,104,218,180, 41,162,162,162,224,227,227,
+ 3,130, 32,112,252,248,113,244,239,223, 31, 79,159, 62, 69,251,246,237, 45, 94,188,120, 97,178,209,138,140,140,180,226,121,254,
+173,146,232, 71, 77,209,106,181,136,142,142, 70,159, 62,125, 96,107,107, 11, 55,183,253, 8, 61,179, 23,242,128, 15, 65, 16, 48,
+201,104,177, 44, 59,166,119,239,222, 98,130, 32,160, 86,171, 32,147,153,193,220,220, 2,150,150, 86,240,243,107,128,228,228,100,
+244,234,213, 75, 23, 27, 27,187, 73,169, 84, 30, 50,117, 95,253,253,253,205,227,226,226, 62,172, 83,167,142, 4, 0,204,204,204,
+ 26,249,248,248,124,254,244,233,211,124, 83,163, 90, 37, 6,139, 32, 8, 80, 20, 85,106,180,104,146,132,139,179, 99,233,243,226,
+254,105, 68, 21, 90,121, 73,153, 90, 41, 0,120,122,122, 98,195,214,147,100,239,222,189, 49,101,202, 20, 24, 12, 6,108,218, 84,
+ 52,200,110,216,176, 97,208,235,245, 56,122,180,104,144, 36, 77,211, 85,134, 77,110,223,190,141, 59,119,238,192, 96, 48, 32, 55,
+ 55, 23,191,252,242, 11, 46, 94,186,132, 3,199,127, 67,220,179, 39,104,218,192, 11, 99,199,142,129, 72, 36,194,174, 93,187, 16,
+ 24, 24,248,183, 94, 16, 68, 34,209,240,237,219,183,187,236,220,185, 51,231,248,241,227,133,237,218,181,147,174, 93,187,214,113,
+195,134, 13, 10,157, 78,135,169, 83,167,166,221,184,113, 67,219,175, 95, 63,243,109,219,182,185,212,171, 87,175, 7,195, 48, 21,
+ 25, 45,115, 0, 67, 0,140,200,206,215,209, 57,249,106,112,140, 14,207,226,158, 35,183, 64, 7,142,213, 35, 62, 49, 25, 5, 26,
+ 22,153, 89,249,104,218,162,231,119, 23, 46, 92,152,171,215,235,231, 0, 8,169,110, 63, 31, 62,124,136, 27, 55,110, 32, 46, 46,
+ 14,207,158, 61, 43,239, 20,199,141,195,158, 61,123, 76,142,104, 85,108,178, 40, 16, 90, 31,132, 28, 15,203, 73,123,162,124, 99,
+ 76, 86,241, 53,104,129,139,139,203, 2, 23, 23, 23,217,217,179,103,173,235,212,169, 3,134, 97,116, 47, 71,178,186,116,233, 50,
+111,251,246,237, 46, 62, 62, 62,147, 1,172,251, 39,236, 59, 73, 98,220,138,205,193, 14,150,146,248,100, 60, 94, 93,156, 75,144,
+ 2, 84,121,192,133,125,160, 59,206,127, 62,185,223, 76,219, 89, 59, 23,143,227,192, 85, 58, 66, 54,246,105, 2, 54,111,222,128,
+105, 83, 71,225,199,239, 87,128,227,104,104, 13, 20, 60,189,219, 65,171,231, 64,144, 52,154,181,104,133,243, 23, 46, 67, 68, 2,
+135,119,110,126,195,124, 22,178, 34, 34, 34, 54, 29, 63,126,252,147, 41, 83,166,128,227, 56,201,194,205,155,213,233,233,233, 75,
+ 97, 90,254,171,151,117,250,111,222,188, 57,102,214,134,244,159,166, 13, 7, 21,119,138,200,186,243, 8,118, 3,103,242, 56,178,
+156, 64,203, 6,200,146, 87, 92,197, 95,122,105,253,102, 24,173, 18, 39, 89,118, 93, 17, 45,124,235,126,101,109,103, 59,134,180,
+116,115,152, 49,101, 34,253, 52, 69,131,163,117, 62, 40,248,125,247,122,243, 20, 70,250, 93, 44, 52,107, 77,249,226,131,191,255,
+ 94,250,120,229,254,253, 21,190,167, 28, 56,208,232, 59,179,202,162, 88,166, 70,178, 0, 64, 46,151,219,244,232,209, 3,221,186,
+117,195,251,239,191, 95,218, 39,171,121,243,230, 56,112,224, 0, 6, 12, 24,128,123,247,238,193,197,197, 5, 13, 27, 54, 68,195,
+134, 13,241,243,207, 63,155,122,145, 3,203,178, 8, 8, 8, 40, 25,117,216, 52, 49, 49,209,170,166, 5,169,213,106,145,153,153,
+ 9, 59, 59, 59, 72, 36, 18,180,109,219, 6,159,124,218, 22, 14, 46, 63, 32,192,191, 1, 10, 11, 11, 75,135,191, 27, 81,217, 6,
+212,175, 95, 31,233,233,233, 72, 79, 79,135, 66,161,128,171,171, 43,156,157,157,177,122,245,106,126,221,186,117,191,234,245,250,
+ 77, 25, 25, 25, 38, 71,178,156,157,157, 59, 17, 4, 49, 79,173, 86, 75,202,220,225, 74, 20, 10,197, 9,181, 90,189, 84,169, 84,
+ 26,221, 17,148, 32, 8,232,245,122, 16, 4,129,211,207, 92, 81,168, 35,144,151,120, 7, 83,254,231, 85,206,120,137, 68,162,106,
+155, 75,121,158, 47, 28, 58,116,168,163,135,135, 59, 18, 98, 31,226,200, 17, 30,223,126,251,109,201,168, 72,196, 20,223, 24,148,
+ 60,239,218,181, 43,188,189,189,193,155,144, 43,131,227, 56, 60,120,240, 0,251, 79, 92,132,139,151, 63,226, 31, 71,227,238,207,
+167, 80, 71, 97,135,198, 45, 90,193, 96, 48,212, 42,245,198,235,192, 96, 48,236,240,245,245,229,117, 58,221, 69, 0, 27,194,195,
+195, 71, 41,149,202,169, 39, 79,158,116, 29, 52,104, 80,242,169, 83,167,214, 2,216, 25, 30, 30, 30,252,245,215, 95,119, 99, 24,
+166,194,209,130, 20, 69,253,248,217,103,159,117, 25, 52,104, 16, 33, 38, 13,186,179,103,118,209, 12, 99, 32,190,152,179,131,189,
+112,229, 34,201, 48, 6,226,253,161,159,113, 63,255, 30, 78, 78,248,116, 37,219,188, 93,111, 68, 68, 68, 56, 7, 5, 5,125,109,
+ 48, 24,170, 52, 90, 37,145,170,202, 34,148, 20, 69, 97,212,168, 81, 56,112,192,248, 30, 84, 99, 1, 31, 43, 47,139, 27, 75, 54,
+118,183, 32,232,130, 50, 38,171, 30, 66,142,135,229,164, 62, 78,126,163, 76, 22, 0,100,102,102,110, 5,176,149,227,184, 84,115,
+115,115,228,231,231, 87,244,251,147,133,135,135,203, 36, 18, 9,122,246,236,105, 23, 26, 26, 26, 67,146,228,186,228,228,228, 74,
+ 29, 71, 69,205,132, 21, 53, 39,162, 22,163, 14,109, 21, 8,106,219,169,133,229, 35,235,197,150, 50, 90,115,175, 78,140,204,138,
+ 0,144,171,117,122,118,237,197,144, 60, 34, 77,218,188, 85,215,150,176,162,205,131,114,152,252, 10,141, 22, 73, 81,119,115,179,
+115,222,205,203,215,225,202,213, 8, 12, 29, 82, 31, 90, 61, 1,142, 35, 81, 80,168, 5, 40, 17, 72, 0,195, 62, 24, 9,158,160,
+145,149,154, 12,138,162,194,193, 48,120,195,152, 29, 28, 28,252,238,156, 57,115,234,206,152, 49, 3, 51,102,204,240,218,190,125,
+251,214, 37, 75,150,204, 72, 79, 79,111,130,106,146,143, 87,161, 83,231,212,129,249,211, 79, 92,222,146,219,187,131,250,113,203,
+ 6, 69,145,175,150, 13,144, 37, 18,225, 9, 77, 33,147,231,203,119, 51, 10, 10, 10,234, 92,118,253, 47,227,229, 78,240,165,207,
+141,234,163, 85,191,174,219, 59, 45,154, 7,124, 58,119,206, 92,203,168,107, 23, 48,235,171, 13,188,111,171, 30,249, 91, 47,223,
+213, 21,152,123,191, 91,144,241,228,170,177,254, 2, 0,222,121,123, 0,154, 54,106,243,202,155,129, 93,139,146,181, 95, 57,127,
+ 27,169,233, 73, 70, 87,182,197,230,160,194, 62, 89,198, 12,233,127, 25,181, 90,157, 19, 17, 17,225,152,152,152, 88,174,227,187,
+183,183, 55, 8,130, 64, 88, 88, 24,110,220,184,129,161, 67,135,130,166,105,136, 68, 34, 92,188,120,209,164,104, 76,153,232, 82,
+201,168,195, 94,238,238,238,149,141, 54,172, 86, 75,173, 86, 35, 55, 55, 23,103,206,156, 65,253,250,245,177,100,201, 18,184,186,
+ 56, 97,238,220,233,224, 56, 14,121,121,121, 96, 89,214,216,136, 22, 87, 18, 45,226, 56, 14,233,233,233,168, 91,183, 46, 54,110,
+220,136,181,107,215,126,173, 84, 42, 79,154,186,143, 30, 30, 30, 54, 44,203,126,209,187,119,239, 30,253,250,245, 67,175, 94,229,
+243,177,238,219,183,207,242,232,209,163, 75,215,175, 95,255,142, 94,175, 95,150,150,150,150,110,140,238, 15, 63, 20,165, 95,146,
+183, 91,128, 89,131,234, 96,196,164, 93, 88,189,250, 24,164, 82,105,185,138,119,241,226,197, 85,154, 24,142,231,125,197, 25,215,
+146,167,207, 92,229,184,116,105, 40, 66, 67,211, 64,146, 36, 92, 92, 92, 64,146, 36,158, 63,127, 14,146, 36,225,229,229, 5,146,
+ 36,145,148,148, 84,210, 39, 48, 27, 21,140,122,172,248, 46,156,132, 70,163, 65, 66,124, 28, 18, 99, 99, 96,145,151, 2,133,149,
+ 28,217, 15, 31,160,233,216,113,165,249,159,254,102,246,232,116,186, 61,101,158,175, 58,117,234,148,142, 32,136,247, 81,212, 79,
+163, 36,162,241, 53,195, 48, 95, 87, 38,210,174, 93,187,230,115,230,204, 17,149,164,219,112,245,252,134,209,235,245, 28, 0, 52,
+104,250, 86, 57,183,255,228,201, 19,172, 94,189, 26,133,133,133, 16,139,197, 98, 99,206, 3,199,113,165, 35, 12, 43, 50, 97,166,
+152, 44, 0,176,247,114,255, 46,236,206, 69,246,126,236, 22,117,248,163, 95,204,148,241, 36, 72,221,155,107,178, 94,142,108,185,
+187,187, 47,224, 56,142,231,121,126,126,153,183,164,158,158,158,151,207,158, 61,107,207, 48, 12,214,175, 95,111,147,146,146, 98,
+243,214, 91,111,205, 2, 80,169,209,170,168,153,176,162,230, 68,148, 25,117, 40,149, 74,237,116,186, 74,131, 39,175,140, 58,100,
+ 89,248, 89, 89,218, 32, 27,137,208, 58, 24,154,231,216, 51, 89,231,148,227,238,185,190,104,209,200,156, 53,212, 37,243,116,112,
+147,219,128,227,249, 74,135, 70,107, 13,134, 95,238,221,185,219,211,211,163, 62,117, 50,228, 18,250,246, 31, 4,173,150,132,198,
+ 64,128,160, 68, 32, 40, 49,154, 52,109,129,134,141,155,130, 7,112,251,230, 53, 70,103, 48,156,123,147,202,222,165,227, 39, 67,
+ 9, 2,235,192,115,124, 5,121,180,234,246,239,223,127, 41,128, 79,171,211,113,108,247,201, 80,146, 44,210, 41,155, 71,235,179,
+ 79,130,241,240,166,200,250,210,157,229,226, 94,237,112, 58, 61,148,128, 92,246,199,168, 67, 17, 89,171,212, 28,255, 22,195, 85,
+189,209,242,240,240,176,177,146,202,126,248,120,236, 24,203, 23,247,175, 35, 37, 50, 12, 87, 47,197,100, 31, 60,122, 44,171, 48,
+ 51,109,172, 9, 38,171,180,153,207,222,185, 14,188,253, 95, 53, 90, 50, 11, 5, 0,192,219,191, 13, 40,115,211,210, 8, 85, 20,
+205,170,137,201, 42,123,193,174, 40,135,214,132, 9, 19,176,125,251,118,116,236,216, 17,190,190,190,165, 23,123, 83,163,102, 21,
+ 68,151, 76, 30,109, 88,150,252,252,124,120,121,121, 97,219,182,109, 8, 15, 15,135,165,165, 37,134, 14, 29,138,252,252,252, 82,
+131,101,108,103,120,158,231,159,156, 61,123,182,245,224,193,131,121,145, 72, 68,228,228,228,192,198,198, 6, 27, 55,110, 44, 84,
+ 42,149,167,107, 96,178, 6,137,197,226,233, 67,134, 12,161, 26, 52,104,128,212,212, 84, 88, 89, 89, 25, 8,130, 16, 1,128,141,
+141,141,193,204,204, 12,193,193,193,104,214,172, 89,167, 25, 51,102,116,164,105,122, 99,114,114,242,174,170,126, 75, 4, 65,148,
+ 86,168, 99,215, 69, 67,167, 43,170,160, 55,109,218,132,226,190,110,127, 52, 17,196,198, 2, 70,140,100,177,176,176,128,175,175,
+111,133,101,223,169, 83, 39,220,190,125,187,168,105,146,166,225,232,232,136,171, 87,175, 26, 53,146,170, 36, 17,100, 68, 68, 4,
+252,189, 29, 16, 30,122, 22, 14,114, 17,154,185, 58,195,189, 83,103,196,196,196,252,157,209, 44, 2, 69,253, 48,186, 23,255, 6,
+119, 0,152, 80,230,249, 70, 0,223,153, 34,200, 48, 12, 79,146, 36,145,144,144,160,151,203,229,132,157,157, 29, 45,149, 74,161,
+213,106, 75, 13,215,147, 39, 79, 16, 18, 18,130,196,196, 68,216,217,217,145,214,214,214,208,235,245,217,198,232,251,249,249,193,
+217,217,185, 92,199,247,177, 99,199,214,200,100,141, 2, 2,182,127,179,172,142,148,164,172,253, 29,222,193,179,232,231, 26, 82,
+ 7,217,127,193,100, 1, 64, 78, 78,206, 86, 0, 91, 75,158, 59, 56, 56,140,166, 40,106,174, 86,171,181,190,120,241,162,141, 66,
+161, 32,118,237,218,101,152, 63,127,126, 14, 69, 81,217, 4, 65,172,249,251,205, 33, 34, 51,114, 99,189, 68,182,174,220,125, 13,
+127,109,106,194,172,134,217,162,250, 10,162,113, 0,250,167, 69, 93, 25,205,196,118, 72, 85,166,144, 60,184,200, 42,174,193, 59,
+102,205, 89,252, 69, 76,244, 93, 79,153,149, 12, 19,130,231,224,244,175,231, 65,144, 34, 92,190, 22, 6,157,158, 69, 70, 86, 46,
+134, 12, 27, 14,119, 23, 7, 68,222, 56,147,206,112,220,198, 55,203,100,115, 27,122,246, 29,109, 43, 53,147, 23,159, 19, 22,123,
+190,159, 14,146, 92,135, 47,191,252, 18, 1, 1, 1,147, 34, 34, 34, 22,161,154, 60, 90, 4,193,109,104,210,121,152,173, 88, 90,
+164,195,115, 44,182, 29,158, 85,156, 71,107, 26, 54,110, 61,218,164,177,247,179,133, 85,229,209,122,131, 76, 86,217,117,213, 70,
+203,203,203, 75,106, 46,194,120, 17, 69,207,248,248,131,126,138,180,216,135, 72,140,186, 91,212,188,160, 87,235, 83, 30, 71, 25,
+147, 10,189, 59,202,231,239,224,171,106,186,210,104,140,186,163, 47,167, 89, 82,225,190, 28,205, 50,209,100,189,162, 89,214,108,
+149,205,155,229,225,225,129,165, 75,151, 26,147, 71,235,229, 99, 47,161, 23,138, 58,192,151,237, 12,223,203, 72,147, 85,161,166,
+ 66,161, 64,102,102, 81,134,132, 46, 93,186,160, 75,151, 63,198, 51,232,245,250,210, 40,150,165,165,101, 69, 17,173, 87, 52,205,
+204,204,102, 29, 59,118,108,204,181,107,215, 6,127,254,249,231,162,110,221,186,149,152, 57, 21,140,155,219,173,156, 38,203,178,
+193,103,206,156,161, 56,142,195,182,109,219,112,251,246,109, 94, 46,151,207,147,203,229, 27,204,204,204, 88,181, 90, 61, 97,220,
+184,113,195, 23, 46, 92, 72,118,234,212, 9,215,175, 95, 39,235,214,173, 59, 18, 40,151,196,178,194, 99, 15, 11, 11, 3, 73,146,
+ 96,178,226, 49,105,214, 65,152,155,209,136,142,142, 70, 86, 86,214, 43, 73, 76,141, 57,159,101, 35, 37, 37, 75,167, 78,157, 74,
+155, 33,219,182,109, 11,138,162,112,239,222,189,202,154, 97,203,106,242,246,246,246,165,191, 15,177, 88,140,243,231,207,227,171,
+175,190,130,167,157, 13,178,163,194,225,220,229,109,244, 24, 51, 14, 67,135, 14, 5, 69, 81,176,179,179, 43,141,252, 26,241, 91,
+170, 13,101, 53,199,248,251,251,143,140,140,140,116,111,210,164,137, 75, 68, 68, 68,215,128,128, 0,175,240,240,240,146,231, 82,
+ 24,215, 55,167, 84,243,214,173, 91, 71, 54,108,216, 16, 60,106,212, 40, 49,199,113,236,139, 23, 47, 12, 0, 8,103,103,103,234,
+214,173, 91,220,201,147, 39,161, 86,171,225,238,238, 78,186,185,185, 17,231,206,157,227,162,162,162,194,120,158,159, 99,204,177,
+179, 44, 91, 46,141, 67,201,227,125,251,246,153,252,127,175,211,208,111, 73,183,183, 26,120,100, 36,223,131, 50, 41, 22,108,174,
+ 66, 31,114,252,148,214, 68,147,245,103,151,209, 95,169,185,248,241,227,199,110, 90,173, 22, 18,137, 4,155, 54,109,210, 47, 93,
+186, 52, 50, 35, 35, 35, 16, 21,143, 40, 47,167, 89,195, 81,135, 89, 85,104,190, 50,234, 48, 55, 19,167,143,159,184,213,218,162,
+255, 14, 76, 74, 78, 47,237,216,200, 19,132,221, 49,167, 70,129,242, 54, 77,146,200,159, 23,144,249,172,234,116, 21,199,174, 83,
+235,116,131,250, 15, 24,246,219,129, 3,251, 45,230, 47, 88,128,171, 97,225,200,204, 41, 0,199, 83,224, 8, 2,115,231,206,135,
+179,131, 29,242,146, 31,171,180,122,125,127,148,207,161,245,175, 47,119,130, 32, 39,159, 59,185,107, 29, 73,128, 43, 76,125, 36,
+165,242, 99,229, 35,134,246,167, 7, 13, 26,132, 99,199,142, 33, 34, 34, 98, 75, 21, 38,171, 84,147,231,201,201,225, 23, 15,174,
+ 35, 0, 78,157,254, 72, 74, 23, 60,147,143,252,160, 63, 61,116,232, 80,252, 20,114, 13, 7, 78, 61,219,124,224, 20, 78,225,205,
+198,244,204,240,150, 52, 34, 2, 27,249,184,117,106,209, 88, 70,179,106, 36, 70,197, 34,171, 80,131,115, 15, 95,228,144, 60, 89,
+227,220, 58, 69, 23, 72, 49,226,227, 31, 87,112,103, 37, 43,174,208, 53, 38,105,146, 36, 89, 46,154, 85,155, 72, 86,217,253,116,
+114,114, 42, 55,157, 75,217,138,187,164, 15, 80, 13, 82, 59,204,138,143,143,183,138,143,143, 7,207,243, 8, 11, 11,179,106,219,
+182,237,172,218, 68,179,166, 79,159, 94, 26,181,122,121, 93,209,107,213, 81,220, 41,125,173,193, 96, 56, 60, 99,198,140, 73,109,
+219,182,237,185, 96,193, 2, 2, 38, 76,192,251, 82, 52,135,225, 56, 14, 23, 46, 92,192,177, 99,199, 88,189, 94, 63, 94,169, 84,
+134,151,217,100,253,157, 59,119,206, 13, 24, 48, 96,215,163, 71,143,168,200,200, 72,240,124,245,227, 78,213,106, 53,124,125,125,
+193, 48, 12,150, 79,242, 64,126,126, 19, 48, 12, 3,150,101, 97,110,110, 94, 26,197, 43,107,158,171,251, 29,177, 44,251,138,209,
+ 10, 11, 11, 3, 69, 81, 8, 12, 12,196,221,187,119, 75, 35, 90,213, 69,160,244,122,125,188,147,147,147,211,226,197,139, 75,247,
+ 43, 61, 61, 29,103,207,158, 69,187,246, 29,208,104,252, 4, 36, 39, 39, 99,205,154, 53,112,117,117,197,146, 37, 75,144,149,149,
+ 5,134, 97,254,234,112,250,187,145,145,145,238, 31,124,240, 65, 90,120,120,184,123, 72, 72,136, 77, 80, 80,144,249,176, 97,195,
+210,194,195,195,221, 9,130,232, 0, 19, 59, 65,115, 28, 55,123,238,220,185,191, 46, 89,178,100,214,167,159,126,218,118,212,168,
+ 81, 34,145, 72,196, 37, 37, 37, 49,251,247,239, 39,124,125,125, 73,177, 88, 76,156, 57,115,134,187,121,243,230, 13,134, 97,150,
+ 3,184,108, 74,196,185,172,201,162, 40,202, 88,147, 85,142,169,142,210,145,150,100,122,224,134, 77, 75,201, 6,222,238,250,221,
+251,207, 38, 92,190,254,248, 41,165,101,166,254, 80, 69,106,128, 55, 25,138,162, 14,249,251,251,143,158, 60,121,178, 89,175, 94,
+189,164, 11, 23, 46,204,205,207,207,175,204,100, 85,112,195,252,151,140, 58,252,126,246,231, 33, 83, 63,107, 50,218,231, 35,231,
+ 58, 8, 45, 76, 67, 54, 77,145, 86, 54, 36, 90,120, 81,200,207,120,162, 56,245,219,206,231, 0,170,203,203,118,235,206,131,136,
+238,141,155, 52, 63,186,124,201,114,199,121, 51,103,136,142,134,252, 2,158,209, 35,236,226, 69, 88,136, 89, 62,234, 78,104,170,
+ 86,175,235,135, 55,112, 10, 30,229,213,239, 14, 0, 56, 97,103,103,119,127,204,168, 81,190,254,254,195, 32,151,203,113,228,200,
+ 17,236, 89,191,158, 93, 11, 12,150, 2,119,131,171,201,167,151,118,163, 84,231,222,184, 49, 99,252, 90,180,248, 8,114,185, 28,
+135, 15, 31,198,174,181,107,141,214,249,151, 83,146, 25,254, 52,254,200, 16, 95, 77, 31, 45,146,200,191,241,248, 69, 65,216,227,
+ 23, 5,224,120,158,227,121, 45, 73, 34,161, 80,175, 95,242,248, 89, 82,141, 76, 65, 73,211,225,215,223, 76,126,125,109, 30,101,
+204, 79, 77,135,116, 87, 96,178, 18,203,206,145, 86,182,146,174,236,177,193, 96, 72, 52, 82,126,153,167,167,231, 43,175,213, 60,
+244,203,155,100,178,140,205,163, 5, 0,153,153,153, 74, 0,243,174, 95,191,190,175,103,207,158,227, 0, 36,213,176,140,182,117,
+238,220,121, 60, 0,138, 32,136, 45,201,201,201,225,175,252,225,149,202, 24, 87, 87,215,149,222,222,222, 19,138,110, 76,137,109,
+213, 84,228,207,154, 52,105,162,175,168, 44, 42,123,206,113, 92,181,101,148,147,147,131, 54,109,218,188, 50,167, 37,207,243,120,
+241,226, 69, 73,196,169,244,220, 87,101,224, 10, 10, 10, 38,124,242,201, 39, 91, 69, 34,145, 39, 0,162,196,228,178, 44, 75,125,
+247,221,119, 50,150,101, 41, 0, 4, 73,146,140, 72, 36,210, 28, 59,118,140, 97, 24, 38, 94,171,213, 78,248,139, 47, 16,135,137,
+162,169, 24, 10, 35, 35, 35, 27, 20, 71,178, 18, 35, 34, 34,238, 29, 56,112, 64, 1,224, 96, 13,117, 47,171, 84,170,203, 75,151,
+ 46,237,180,105,211,166,217, 19, 38, 76,104, 51,116,232, 80,186, 75,151, 46, 56,125,250, 52,123,225,194,133, 48,181, 90,189,204,
+ 20,131, 85, 92,150,185, 30, 30, 30,165,134,171,154,255,114,149, 29,121,237,189,164, 27,134, 79,116,149,109, 91,118,182, 32, 35,
+ 89,119,205, 80,160,155,179, 19,136,192,127,152,212,212,212,207, 1,204, 95,179,102, 77,114,179,102,205,164, 98,177, 88,103,172,
+201,250, 11, 97,184,156,130,247,190,237, 49,240, 68,231,185,159,120,247,232, 26, 40,247,168,227,232, 22, 21,155,138, 39,215, 79,
+ 23,222, 63,245, 77, 28,175,205,238, 11,192,152,158,235, 55,181,122,125,253,233, 51,166, 79,146,136, 68, 61, 89,150,109,218,237,
+220,113,158,162,168,112,157,193,112,174,184,185, 80,243, 6, 23,249,215, 43, 87,174,244,245,247,247,199,145, 35, 71,112,110,239,
+ 94, 12,201,200,192,121,138,162, 72,177,216,254,148, 94,191, 10,198, 25,164,175, 87,175, 94,237, 23, 16, 16,128, 67,135, 14,225,
+204,174, 93, 24, 92, 51,157,202,234,186,214, 0, 20,197, 79, 51, 0, 60, 2,208, 18,128, 25, 0, 45,138,166,118,114, 40, 91,133,
+ 21,191, 87,242,254, 37,130, 32,254,204,142,176,213,103,134,127,153,136, 39,113, 45, 95,247, 94,168,213,234, 44, 95, 95, 95,147,
+198, 92, 27, 12,134, 42,219,112, 25,134, 73,244,241,241, 49, 58,106, 97,140, 41,202,202,202,106,245, 39, 22, 70,173,250, 98,149,
+171, 68, 56, 46,206,197,197,133, 43,169,244, 43, 50, 97, 21,189,198, 3,207, 77,249,158,148,148,148, 71, 0, 62,171,233,126, 38,
+ 39, 39, 31,133, 17,147, 70, 27,187, 29, 0,100,103,103,191,246,201,124, 9,158, 79, 90,184,112,161, 73, 6, 27, 60, 95,149,249,
+ 12, 47, 40, 40,104,107,204,119,235,245,122,252,141, 28, 42, 94,200,136,136,136,113, 4, 65,244, 66, 81,147,192, 22,188,158,108,
+222,151,243,242,242, 46,175, 88,177,162,211,182,109,219,166,242, 60,143,188,188,188,181,166, 26,172,210,187,231,180,180,211,175,
+235,192,179, 82,117,191,239,223,146,248,182, 58, 71, 63,117,123,129,110, 23, 4, 74,131, 81, 60,207,255, 56, 98,196,136,118, 0,
+118,214, 86,172,146, 81,135,181,229, 57,151,157,219,236,252,244,175,198,156,183,177,236, 13,150,110, 0, 29,121, 10,186,204,211,
+ 0,126,128,113,221, 28, 74,143,151,225,184,213,140, 78,183,186, 76,229,242, 95, 40,103,187,128,128,128,169,163, 71,143,198,252,
+249,243,113,102,213, 42,253, 68,130,200, 21, 1,252,175, 69, 55,154, 36, 1,204, 52, 86,103,228,200,145,152, 63,127, 62,126, 94,
+190,188,166, 58, 85,161, 32, 8, 34, 4, 0,102,205,154, 53,103,233,210,165,182,179,103,207,110,186,108,217,178, 37,197,207, 31,
+150,188, 95, 92,215, 5,205,158, 61,187,113,153,247,243, 1,220,250,147,207,103,133,153,225,255,108,186, 11,154,130,166,160, 41,
+104, 10,154,130,166,160, 41,104,214, 6,158,231,123, 23,173, 42, 95, 87,246,184,204,250,111,129,134,128,128,128,128,128,128,128,
+192,191,144,178, 81,172,154,188,255, 26, 41,233,163, 85,150,109, 64,209,176,238,202, 92,169, 41,163, 30,106,226,108, 67, 5, 77,
+ 65, 83,208, 20, 52, 5, 77, 65, 83,208,252,207,105, 86,167,253,202,231,121,158,239, 77, 16, 68, 8,207,243, 65,149,173, 75,140,
+213,203,143,203,172, 95, 91,183,131, 10, 40,233,155,245, 74, 31,173, 63, 27, 33,172, 42,104, 10,154,130,166,160, 41,104, 10,154,
+130,102,173, 40,105, 2, 4,192,207,154, 53,107,246, 63,176,233,208,165,216,100,149, 93, 0, 84,209,116,200,243,135,169,164, 36,
+ 88, 73, 36,114, 49, 0,232,116, 42,189,155, 27,242, 8, 98,208,223, 57,225,173,192,191,147,146,225,222,169,175,121, 91, 1, 1,
+ 1, 1,129,255, 6,233, 37,145, 42, 0,233, 0,136,226,231,186,226,117,122,177, 33,123,249,113,185,247,255, 68,148,168, 36,146,
+ 69, 87,102,178, 50, 50,228, 14, 52,157,237,199,178,154,134, 0, 64,211,100,116, 70,134,109, 12,207, 31,206,168,137,217,114,112,
+116,188, 35,162, 40, 55, 99,182, 53,176,108, 82, 70,106,106,249,212,241, 4,241, 38, 24, 60, 99, 77, 68,109,204,198,159,110, 84,
+ 28, 28, 28,156,156,156,156,254,103,101,101,213, 62, 39, 39,231,102,122,122,250, 79, 85,204,123,184,148, 32, 48,163,232,119,133,
+ 21, 0,102, 87, 33,109,202,182, 47,227, 43,151,203, 39, 17, 4, 17, 80,252, 7,139, 80,169, 84,155, 0, 60,254, 15, 94,144,204,
+ 0,244,163,105,122,164,131,131, 67,155,148,148,148,133, 0,106,154,205,155, 6, 48,221,198,198,102,136,141,141,141, 79, 86, 86,
+214,211,188,188,188, 67, 0, 86, 3,168,118,168,244,194, 79, 93,218,119,233,213,101,222,133, 51, 23,190, 94,184, 94,121,253,149,
+247,167,187,216,247,236,209,113,254,133, 83,215, 22,207,217,152,156,101,226,190,145,197, 11, 80, 52, 58,146,199,171,201, 94,107,
+139, 8, 64, 31, 0, 93, 0, 92, 0,112,202,152,227,174,132,118, 0,230, 20,239,243,106, 0,231,255,225,191, 35,115, 39, 39,167,
+229, 0,250,208, 52, 29,153,148,148, 52, 30, 64,226,223,188, 79, 52,128,214, 0, 2, 80,148,134,227, 22,140, 75,225, 80, 45,246,
+246,246, 65, 52, 77, 79, 42, 78,237,178, 41, 51, 51, 51,228,159, 90, 48, 18,137,100,173,179,179,243, 71,106,181, 90, 69, 16, 4,
+ 95, 54,223, 35,195, 48,137, 25, 25, 25,173,222,180,139, 26, 65, 16,183,254,225,187, 56,190,130,215, 42,207,163,149,148, 4, 43,
+154,206,246, 75, 75, 9, 31,146,172,124, 48, 24, 0, 92, 93,154, 30,114,116,110,114, 48, 41, 73,162,119,110,208,223, 66, 36,167,
+ 55, 81,148,168,185, 70,167,117, 16,209,162, 12, 61, 99,184, 71,234,248, 73, 41,143,126,170, 48,217,162,136,162,220,226, 98,206,
+ 59, 50,250, 44,136,100,174, 16,153,121, 86,186,183,174,174,174, 53, 58, 74, 91, 91, 31, 75,189, 84, 54, 85, 36,162,122,112, 60,
+ 19,192,115, 0, 73,136, 34, 24,214,240,155, 88,171,253, 54, 59,251,105,126, 77,207, 96, 3,123, 56,243,192, 80, 16,232, 1, 30,
+231, 8,224,192,163, 76,164,152, 32, 97,172,137,168,141,217, 40,251,217, 53, 0, 62,127,221,191, 36, 55, 55, 55,219,160,160,160,
+181, 95,125,245,149,153,133,133, 5, 17, 31, 31,223,107,230,204,153,111,221,190,125,251,179,164,164,164,228,151, 77, 31, 65, 96,
+ 6,199,241, 36, 0,144, 36, 49, 83,161,112,148, 83, 20,245, 74,110, 35,150,101,229,233,233,105,147, 57,142, 39,138,183,157,193,
+243, 88,103,140, 97,148,201,100,195, 2,154, 52,255,108,249,202,213, 22, 78,142,142,230, 12,203,233,159,191,136,147,207,155,245,
+121,219,216, 39,143,215,105, 52,154,253, 53,249, 95, 83, 20, 53, 68, 42,149, 6, 1,240, 47,126, 45, 74,171,213,134,176, 44,123,
+208,216, 10,221,201,201,233, 18, 69, 81,117, 76,249, 98,150,101,227, 83, 83, 83, 3,107, 88, 68,131, 60, 61, 61,127,232,220,185,
+179,188, 77,155, 54,144, 72, 36,152, 63,127,254,116,165, 82, 89,157,209,162, 1, 76,151,203,229, 67,204,205,205,125, 10, 10, 10,
+ 98,213,106,245, 81,137, 68,210,125,221,186,117, 30, 29, 59,118,180, 76, 77, 77, 37, 40,138,114,250,249,231,159, 63, 92,187,118,
+109, 47,134, 97,186, 85, 87,201,229,198,242,243,164,125,252, 59,229,198,158,159, 7,224,221,151,223,103, 52,178,145, 60,229, 17,
+164,230,239, 38, 20,155, 15,163, 77,150, 72, 36, 90,231,236,236, 60, 90, 83,148, 43,128,127,185,194, 1, 0,157, 78,151,157,147,
+147,211,160, 38,127,121, 0, 99,109,108,108, 70,127,241,197, 23,182,239,190,251, 46,246,238,221,251,241,246,237,219,179,243,242,
+242,126, 68, 81, 34,204, 71, 38,106,206, 72, 73, 73,121, 79, 36, 18, 17, 30, 30, 30,148, 90,173, 54,197,104,249,161,104, 18,230,
+ 91, 0, 54,161, 40,117, 65, 87,160,232,255, 14, 96, 69,137,113, 35, 73,114, 83,131, 6, 13,254, 23, 21, 21,181, 25,192,215, 53,
+253,175, 59, 59, 59,111,221,184,113,227,224,190,125,251, 82,233,233,233,110,205,154, 53,219,151,146,146,210,233, 53, 92, 70,198,
+ 72,165,210,105, 77,155, 54,109,244,232,209,163,152,188,188,188,213,197,231,179,170,255,148, 59,128,238, 54, 54, 54,221,230,206,
+157,107, 17, 20, 20,132,109,219,182,189,183,125,251,246,130,252,252,252,223, 80,212,167,167, 86, 38,144,166,233, 73,137,137,137,
+ 14, 60,207,195,197,197,101, 18,128,127,164,209, 34, 73,114,221,128, 1, 3, 70,239,219,183, 79, 30, 23, 23, 39,119,115,115, 43,
+ 77,158, 77, 16, 68,141,235, 79,129, 90,179,173,140,225,170, 62,143,150, 68, 34, 23,179,172,166, 97,178,242,193,224,183, 58,127,
+103, 13, 0,151, 46,126, 50,216,209,185,113,132, 68, 34,143,145, 90,201,142, 13,232,211,189,249,192,160,206,132,187,139, 35, 18,
+149,105, 78,223, 31, 56,243, 78,200,153,243,199, 80,148, 64,172, 66, 24,125, 22,204,244,161,120,116,101, 61, 28,186, 36, 99,195,
+207,137,184,126,255, 57, 84,185, 25,168,227,108,134,149, 83,123,194,217, 86, 94,179, 91, 47, 71,223,174, 12, 45, 61,248,193,176,
+ 17,214,255,235,231, 47,242,114,118, 6,207, 75, 17, 19, 91,208,225,151,179,231, 91, 31, 61,188,127,146,185,200,119, 72, 97,218,
+ 99,163, 47,110, 45, 92, 96, 86,168, 71, 63,154, 34, 62,236,216,170, 81,183, 97,239,117, 34, 27,249,215, 71,228,195,168,158, 39,
+126, 15, 91, 73, 94,123,248, 27,195,242,187,205,197, 56,126, 87, 89,101, 66,191, 87, 12, 71,183,110,221, 59, 73,165,210,114,201,
+147,180, 90,173,248,183,223, 66,219,213,196,108,148,124,135, 78,167, 37, 69, 34, 9, 72,146,248, 44, 32,160,137,127, 70, 70,198,
+121,130, 32,126, 72, 78, 54, 45, 90,240, 9, 32,201,166,233,150,164, 84,234,194,234,116,246, 0, 64, 72, 36,217,207, 73,178,201,
+220, 57,115, 44, 40,138,226, 50, 51, 51,161, 82,169,136,113,227,198,201, 98, 99, 99, 7, 36, 37, 37,173,175,230,142, 4,219,183,
+111,247,115,113,113,121,101,246, 88,165, 82, 41,233,219,247,127, 53, 41,122,191,166,205, 90, 76, 59,115,230, 87,255,188,172,108,
+205,246, 53, 91,239, 24,100,114,109, 93,255, 6,162, 77,219,118, 89,143, 31, 61,252,147,232,232,135,247, 96,218,124,117,158,102,
+102,102,199, 86,173, 90, 21,208,181,107, 87,145,163,163, 35, 82, 83, 83, 17, 21, 21, 21,240,251,239,191,247,219,181,107,215,116,
+181, 90, 61, 0, 48,106, 66, 84,223,223,118,255,224,104,110,103, 15,214, 96,128,107,211, 22,165,249,205,158,252,126, 22,140, 94,
+ 15,206, 96,128,127, 80,191,226,104, 50, 15,127,127,255,154,102,221,117,109,220,184,241,158, 37, 75,150,136,181, 90, 45,194,194,
+194,112,254,252,121, 78,169, 84, 86,151, 16,151, 38, 8,226,236,130, 5, 11,220, 3, 3, 3, 45, 51, 50, 50,192,178,172,195,241,
+227,199, 39, 53,111,222,220,202,195,195, 67,178,123,247,110, 20, 20, 20,128, 97, 24, 59, 31, 31, 31,187, 97,195,134,233,118,239,
+222, 61, 29,192,242,202, 34, 89,121,177,252, 60, 37,225,243, 78,131,150, 35,145, 66,252,250,206,180,119,240,139, 85, 61,162, 52,
+178,245,142,143,143,101, 94,146,124,166,133, 85, 19,187,188,164,208,153,239,248,248,108,255,245,169, 81, 55, 67,100,113,101,243,
+193,129, 3, 7,228, 81, 81, 81,114,127,127,127,112, 28, 87,154,129,191, 36,225,172,175,175,111, 77,206,227,178,224,224,224,153,
+131, 7, 15, 70,211,166, 77, 75,147,162,126,249,229,151,152, 57,115,166,237,165, 75,151,166,239,223,191,127,250, 79, 63,253,180,
+ 28,192, 44, 19,163, 49, 37,152, 90,198,139,158, 61,123, 54,232,216,177, 99,195,103,204,152,225, 11, 96, 50,128,249,153,153,153,
+157,139,163, 49,146, 98,163, 53,102,250,244,233, 19,103,205,154,133,247,222,123,111,126, 88, 88,216, 55, 53,140,242, 81, 12,195,
+188,215,183,111, 95,202, 96, 48,192,220,220, 28, 6,131,161, 94,109,131, 18, 0, 54, 78,152, 48, 97, 98,112,112, 48,108,109,109,
+ 97, 48, 24,252, 14, 28, 56,176,125,254,252,249,237, 1,140,173,100, 95, 71, 78,156, 56,241,253, 17, 35, 70,160, 85,171, 86,160,
+233,162,211,184,106,213, 42, 44, 94,188,216,226,236,217,179,253,118,239,222,221,239,196,137, 19, 71, 81,126,218, 46,147,224, 56,
+ 14, 52, 77, 35, 33, 33, 1,142,142,142, 82,142,227,206, 16, 4,177, 45, 43, 43,235,167,127, 80,101,190, 98,208,160, 65, 31,236,
+219,183,207, 2, 0, 86,174, 92,137,105,211,166,193,201,201, 9, 22, 22, 22,130,213,249,231, 68,180,198, 87, 27,209,170, 14,149,
+ 74,213, 98,246,167, 31,130, 36,139,238, 26,235,215,245,196,210, 57,227,137, 19, 33,103, 90, 84, 25,131,151,185,226,209,149,245,
+144,122, 76,133,214,192,224,198,253,103, 56,183,178, 87, 81,109,249,238, 92,104,245,221, 74, 42, 27, 59,137,153,217, 10, 29,203,
+ 94,133,179,115, 24, 94,188, 72,175,206,100, 41,156,157, 66,182,108, 89,110, 22, 80,175, 1,244,140, 1, 73,105, 73, 32, 8, 41,
+220,221, 44, 49,102,228,187,162,206,157, 93, 29, 22, 45,218,122, 58,133, 67,127, 85,198,227,106, 19,134,250, 57, 96,103,139, 0,
+223,193,195,122, 7, 74,155, 4, 52,134, 88,106, 86,250, 94,203, 86,173,208,178, 85, 43,114, 86, 65,126,143,155,183,238,244, 56,
+114,246,134, 86,101,120,113, 40, 38, 3,163,170,185,200,148, 26,142, 41, 83,166,192,201,201,169,220, 6,169,169,169,248,253,247,
+223, 42,252,140, 9, 23,178,210,239,248,230,155,111, 44,179,179,179,223,221,177, 99,199,219, 28,199,125,147,146,146,114,197, 24,
+145, 17, 64,157, 92,169,180,219,232,213,171,185,230,255,251, 31,101,227,236, 76,114, 44, 75, 36, 63,125,106,191,102,253,250, 46,
+ 89, 79,158,152, 21,218,217,101,101,171,213,170,152,152, 24,200,100, 50,130,166,233,214, 21, 72,165,242, 60, 86,144, 36, 49,147,
+ 32, 8, 72,165,178,152,224,224,224,187,197,239,213, 57,117,234,148,188, 79,159, 62, 42, 0,113, 0, 32,149,202,220, 40,138,222,
+ 54, 21,243, 0, 0, 32, 0, 73, 68, 65, 84,244, 43,202,196,142, 21,198, 24, 76,115,115,243, 79,191, 94,178,220, 60, 47, 43, 71,
+173, 47, 44, 52, 40,172, 44, 8,194,194,146,202,203,205,207, 79, 82,166,107,231, 46, 92, 76, 77, 24, 51,226,211,194,194,194, 73,
+198,154,172,102,205,154,221, 60,118,236,152,163,189,189, 61,114,114,114,144,153,153,137,155, 55,111,130,227, 56, 12, 24, 48, 64,
+218,161,109,155, 22,115,230,206,187,158,144,148,212,222, 24,179,101,110,231,128,149,129,205,139, 42,235,184,204,210,242,217, 54,
+ 40,168,116,155,197,137,185, 37,209,185,218, 76, 33,213,190, 91,183,110, 98, 0, 24, 59,118,108, 94,126,126,254, 82, 0,251, 80,
+125, 70,255,233,243,230,205,115,171, 91,183,174,215,190,125,251, 80, 80, 80, 0, 0,142,117,235,214,133,159,159, 31,123,225,194,
+ 5,248,249,249,193,210,210, 18,151, 46, 93,194,245,235,215,209,170, 85, 43, 75,177, 88, 60, 88,175,215, 87,104,180,186,244,234,
+ 50, 79,218,199,191, 83,131,150, 35, 97, 97,229,130,237,251, 15,226,209,157, 93,157,180,250,168,121, 98,246,226, 8, 53, 47, 29,
+149, 30,111, 49,171, 78,171,206,246,245, 27,255, 15, 94, 45,239, 58,104,216,203,207,230,245,168,187,140,150,105,118, 45, 92,173,
+204,172,204,100, 1, 88, 57, 96,192,128, 65, 7, 14, 28,176, 1,128,240,240,112,164,166,166, 66,161, 80, 64, 38,147, 65, 36, 18,
+149,206, 79, 90, 67, 70,109,218,180,169,212,180, 49, 12, 83, 58, 11,128, 92, 46,199, 91,111,189,133,230,205,155,227,167,159,126,
+ 26, 85,137,209, 10,108,219,182,237, 94, 47, 47, 47,143,178, 47, 22, 22, 22, 98,232,208,161, 0,128,206,157, 59,119, 51, 51, 51,
+227, 75, 12,161, 82,169, 44,184,117,235, 86, 15, 0, 97,149, 56, 75,117, 82, 82, 18,190,248,226, 11, 60,127,254,252,227, 45, 91,
+182,188, 0, 32,147, 72, 36,165,247,199, 0,252, 26, 55,110,188,110,218,180,105,136,141,141, 69,100,100,228, 77,212,188, 41,149,
+ 53, 55, 55,127, 98, 48, 24, 90, 49, 12, 3,181, 90,141,254,253,251,203,142, 30, 61,154, 74, 81, 84,116, 70, 70,198,112, 20,245,
+ 73, 49, 22, 25,128,213,193,193,193, 19,103,204,152,129,223,126,251, 13, 39, 78,156,192,136, 17, 35, 48,117,234, 84, 88, 88, 88,
+140,158, 58,117,234,117, 20, 77,104,254, 50,221, 54,109,218, 4,150,101, 95,249,111,200,100, 50, 4, 6, 6,162, 81,163, 70, 56,
+113,226, 68,183, 90, 24, 45,175,192,192, 64, 9,199,113, 40, 44, 44,196,133, 11, 23, 44,204,204,204, 44,220,221,221,199, 1,248,
+199, 24, 45, 47, 47,175,224, 3, 7, 14, 88,148,109,253,145, 74,165, 40,243, 59, 16,248,251, 35, 90, 85,222, 97,149,162,211,169,
+244, 52, 77, 70,187,186, 52, 61,116,233,226, 39,165, 77,135, 0, 25,173,211,169,244, 0,192,114, 60,242, 84, 12,204,164, 36,226,
+ 82,242,241,240,105, 70, 69, 82,229,134,104,138,204, 60, 33,109, 19, 7,158,231,161,211,179,208,230,166, 96,233,105, 21,162, 18,
+ 53,208, 21,102, 67,167, 47,234,134,229,224,224, 64,159, 57,243,203,180,208,208,223, 39,254,248,227,143, 84,162,181,117,100, 62,
+208,162, 34, 77, 91, 91, 31, 75, 78, 34, 57,180,121,203,124, 51,158,122,138,152,248, 66,212,119,111, 3, 7, 27, 15,164,100, 20,
+226,106,228,207,136,126, 28,130,186, 46, 94,152,250,233, 59,178,175,151,236, 59, 40,102,188, 61,115,114,158,231, 85,182,159, 37,
+119, 81, 91,127,141, 1,147,245, 20,108,102, 44,216,252,228, 87, 54,176, 80,120,162,101, 87, 55, 40, 60,234, 73, 71, 77, 93, 60,
+ 18, 40,103,180,202,106,166, 18, 4,185,153, 36,137,137, 4, 65,160,105,211,102,137,171, 87,175,174, 40, 21,184,190,105,211,102,
+137, 20, 69,186, 23, 93,216,201, 77, 60,207,165, 86,179,159,229, 76,141, 68, 34,157, 81, 20,246,119, 73, 56,125,250,180,126,208,
+160, 65, 88,181,106,149,100,230,204,153,115, 41,138, 26, 91, 65,243, 94, 57,205,254,128,167, 77,189,122, 61,191,185,122,149, 23,
+ 25, 12, 68,214,205,155,121, 57, 74, 37,147,146,159, 47, 57, 28, 29,253,222, 71,159,127, 46,241,240,240,192,149,144, 16,251,244,
+194, 66, 62, 71,171, 85,231,228,228,240, 12,195,220,172, 68,115,182, 66,225, 40,223,190,125,187, 95,112,112,240, 93,165, 82, 57,
+ 27, 0, 92, 92, 92,150, 2,104, 4, 32,174,204,107,216,178,229, 96,210,184,113,227, 98,210,210,210,102, 87,181,159,101,104,236,
+168,112,148,239,223,186,251,129,157,165, 25,169,112,119, 37, 69, 54, 54, 52, 35, 49, 19,115,128,186,174, 71, 61,115, 0,141, 43,
+249,236,203,154,132,153,153,217,177,147, 39, 79, 58,138, 68, 34,176, 44, 11,133, 66,129,231,207,159, 35, 39, 39, 7,249,249,249,
+120, 22, 29, 5,111, 15, 15, 44,154, 53,211,101,242,204, 89,199, 84, 42, 85,171,151, 42,179, 87, 39, 64, 54,232, 95,137,236, 85,
+ 52,139,193,203,205, 94, 70,150,123, 89,158,199,199,199,195,194,194, 2, 1, 1, 1, 22, 87,175, 94,189, 92,133,201, 42, 59, 9,
+240,224,142, 29, 59, 90,238,219,183, 15,173, 90,181,130,181,181, 53, 46, 92,184,128,240,240,112,232,245,122,178,160,160, 0, 22,
+ 22, 22, 88,182,108, 25, 60, 61, 61,145,159,159,143,184,184, 56,123,145, 72,228,240, 82, 70,251, 82,205, 11,103, 46,124,157, 27,
+123,126, 94, 10,241,235, 59,219,247, 31,196,184, 97, 67,224,204, 63,189,108, 93,143,248,186,103,159,142, 95,242,148, 71,144,185,
+101, 83, 91,223,128, 62, 16, 75, 44, 48,121,198, 98,196, 68,156,178, 85,229, 63,248,152, 96, 19, 60, 22,174, 62, 60,165,130, 99,
+ 39, 0,144, 30, 30, 30, 31, 29, 62,124,216,178, 52,244, 66, 81,165,115, 30,150,157, 4,190,138, 9,223,171, 61,159, 4, 65,224,
+249,243,231,112,116,116,132,133,133, 69,233, 4,226, 81, 81, 81,184,113,227, 6, 74,102,163,168, 68,115,120,104,104,168,135,185,
+185,121,185, 13,120,158, 71, 70, 70, 6, 24,134,129, 92, 46, 7,203,178,208,235,245, 48, 24, 12,208,104, 52, 22,141, 26, 53,154,
+100, 48, 24,194, 42,210,228, 56,238,179,193,131, 7,119, 12, 11, 11,243, 89,191,126, 61,116, 58,221,202,148,148, 20,188,255,254,
+251,224, 56, 14,221,186,117,107,199,243,252,163,185,115,231, 2, 0,166, 77,155,102, 40, 44, 44, 12,174,201,177, 23,211,168,101,
+203,150, 62,191,253,246, 27, 58,117,234, 4,173, 86,139, 85,171, 86, 89,109,217,178,197,106,247,238,221,138, 25, 51,102,252,144,
+158,158,222,171, 26, 77, 2,192, 74,103,103,231,137, 93,186,116, 49, 43,158,195, 20,187,118,237,194,162, 69,139, 14, 0,152,251,
+203, 47,191, 44, 56,113,226,196,200,143, 62,250, 8,139, 22, 45,154,154,147,147,179,163, 50,205,103,207,158, 65,161, 80,192,202,
+202,170,232, 98,169,215,227,222,189,123, 56,119,238, 28, 26, 54,108,104,204, 49, 85,182,159, 94, 3, 6, 12,248, 97,255,254,253,
+150, 9, 9, 9,184,116,233, 18,188,189,189,161, 82,169,140,153, 27, 54,244, 79,168,176, 43,213, 84,171,213,154,248,248,120,139,
+229,203,151,195,197,197, 5, 94, 94, 94,144,201,100, 32, 8, 2, 6,131,161,170,233,213,170,221,207,206,157, 65,103, 36,217,246,
+181,182,177,253,152,231,121, 58, 55, 55,123,171, 30, 57, 71,158, 62,133,238, 47, 60,246,127, 51, 45, 0,220, 69,249, 57, 15,149,
+165, 70, 43, 36, 36,132, 15, 10, 10, 34, 74,214,110,110,200,203,200,176,141,113,116,110,114,208,209,185,113,241,188, 95,100, 52,
+ 69,217,198, 56, 57,169,242, 0, 64,207,240,184, 22,157,131, 7, 79, 82, 16,254, 36, 5,230, 82,227,130, 47, 90, 61, 83,212, 99,
+149,231,161, 41,248,227,166, 85,175,202,134, 86, 95,212,221, 67,167, 85, 33, 55, 61,146, 24,212,191,135,108,226,196, 9,112,113,
+113, 83, 84,166,167,151,202,166, 78,158,246,158,141,157,141, 8, 33, 87,127, 69,187,134,253, 33,147,138,144,153,171, 1, 8,224,
+241,211,115, 0,103,137,136,152,120,180,109, 44, 71,175,158,254,255,103,239,186,195,162,184,218,239,153,237,176,187,244, 94, 44,
+ 88, 0,123,239, 40, 98, 67, 99,239, 88, 98,239,216, 27,106,140, 37, 42, 26, 77,236,189,196, 96,239,137,216, 80, 84, 44, 88,233,
+136, 88, 0, 41, 11, 82,150,165,108,223,157,157,249,253, 65, 9, 42,101, 65,243,253,190,228,219,243, 60,243,192,236,206,156,125,
+231,222, 59,115,207,188,247,222,247, 21, 94,190, 16,191, 4,192,106,125,236, 37,211,158,131,227,218, 15,108,157, 22,218,156,120,
+ 80,121,201,128,192, 30, 10, 66, 8,113, 70, 50, 94, 63,188,168,215, 59, 35, 69, 81,115,172,173,173,243, 86,173, 90,213,189, 97,
+195,134,154,217,179,103, 71, 38, 39, 39, 47,250,236,109,229,215,125,251,246,225,221,187,119,162,141, 27, 55,222,207,201,201,249,
+161,154, 21,237, 71,211,216, 81, 60, 20,151,115,229,202,149, 54, 33, 33, 33, 11,118,236,216, 97, 55,119,238, 92,238,220,185,115,
+ 39, 3,248,169,178,225,194, 2, 30,175,215,198, 7, 15,104, 50, 45, 77,117, 98,247,110,238,222,208,208, 85, 26,138,114,180,182,
+181, 37, 58,119,232, 32,227, 51, 24, 57,226,204, 76,210,166,126,125,102,210,237,219, 86,180,177,113,250,141, 27, 55, 10,164, 82,
+105,133,169,115,152, 76,166,188,188,225,194,242,224,224,224,160, 46,111, 14, 87, 37, 29, 98, 1, 69,211, 26,243,122,245,232, 62,
+ 61, 59, 53,124, 23,159,144, 96,100,110,206,116,109,232,226, 30,251, 58,233, 57,173,211, 41, 9,130, 40,208,107,172,132,201, 28,
+189, 99,199,142,230,166,166,166,160, 40, 10,102,102,102,200,206,206,134, 90,173, 70, 65, 65, 1,212,133,249, 80,231,231, 35, 58,
+ 57, 9, 93,186,119,199,200,190,125, 26, 7, 92,249,115,180, 78,167, 59, 83,233,120, 94,139,214,165,158,172,245,117,173,254, 26,
+ 11, 74,205, 43, 21, 93, 91, 90,187,130, 35, 20,162,247, 34,191,175,185,209,195,175, 93,187,118,125,216,176, 97,223, 45, 89,178,
+132,145,145,145,113, 51, 41, 41,169, 11,128, 87,149,157, 36, 20, 10, 27,228,228,228, 64, 42,149,194,204,204, 12, 59,118,236,128,
+157,157, 29,228,114, 57, 94,188,120, 65, 59, 59, 59, 19,247,239,223,135,179,179, 51,196, 98, 49, 52, 26, 13, 20, 10,197, 71,181,
+ 90, 93,225,112,121,241,240, 96,191,133,125,113, 35, 62,236,247,174, 78, 68,226,139, 81,139, 61,223,197, 71,191, 78, 9,186,253,
+248, 39, 82,105,148,154,151,118,103,121,189,118,225,214,115,150,174,195,158,173,107, 16,255,236, 65,174, 93,237,130,189,198,132,
+234,120,101,246,202,100, 50,229,235,215,175, 77, 34, 35, 35, 65, 16, 4,204,204,204,192,231,243,203, 21, 91, 53, 0,163,172, 7,
+ 74, 38,147,129,195,225,192,202,202, 10, 71,142, 28, 41,237,120, 93, 92, 92, 42,227, 56,216,187,119,239,209,181,107,215, 54, 41,
+251, 97,187,118,237, 48, 99,198, 12,236,223,191, 31,161,161,161,159,228,211,252,248,241, 99,134, 86,171,173,236,186,243, 50, 51,
+ 51,251, 14, 29, 58, 52,236,225,195,135,166, 71,142, 28, 1, 73,146,229,110,135, 15, 31,198,211,167, 79, 87, 3,120, 93,195,118,
+212,104,248,240,225, 15, 78,158, 60,105,158,157,157,141,146,182, 33,147,201,160,211,233,224,238,238, 78,144, 36, 89,213,188, 55,
+ 6,147,201,188,178,123,247,238,129,211,166, 77, 3,139,197,130, 90,173,198,238,221,187,177,124,249,242,204,226,151, 82, 13,128,
+ 85,199,143, 31,159, 48,104,208, 32,180,108,217,178,241,189,123, 21,207,236,144, 74,165,144, 74,165, 96,179,217,176,183,183,199,
+134, 13, 27,160, 86, 23, 61, 86,220,220,220, 74,111, 99, 0, 7,221,220,220, 6,190,121,243,102, 27,138,230,174,125, 1,123,123,
+251,161, 52, 77, 79,215,233,116,133, 93,187,118,181, 58,125,250,180,137, 72, 36, 66, 88, 88, 24, 86,175, 94, 45,161, 40, 74, 71,
+ 81, 20,161, 80, 40, 18,109,109,109,195,120, 60,158,177, 92, 46,207, 21,139,197,155, 0,220,252,255,234,201, 9,130, 32,216,108,
+ 54,166, 76,153, 2, 22,139, 5, 99, 99, 99, 40,149, 74,104,181,218, 82, 49,143,106, 14, 75, 55,108, 40,180, 98,129, 51,205,194,
+164,201,130,145,243, 7,216, 56, 56, 58,193,220,148,135,184,184, 87, 93,238, 6,223,222,205,101,197, 31,160,212,218, 3,241, 31,
+242,255,246,100,247,159,107,145,127,168,208,250, 34,231, 33,171,252,202, 28,169,163,233,243, 57, 34, 17, 87,195,229,242,223,148,
+120,185,236,236,228, 5, 4, 49, 82,103,211,116, 48, 72,141,182,248, 65, 65, 23,111,122, 10, 45,173, 14,239,226, 99,240, 48,232,
+ 79, 88,203, 69,200, 73,108, 5,112,154, 67,173,200,135, 82,173, 41, 22, 37, 58, 68,134, 5,163, 32, 63, 23,205,218, 14, 0, 24,
+140,167, 21,241,153, 89, 17, 3, 58,183,105,193,124,151, 18,131,118,110, 35, 80,223,185, 43,146, 51, 10,144, 39, 85, 65, 82,160,
+ 68,171,102,126,200,150, 40, 80, 32, 87,226,213,187, 0, 56, 57,214,103, 16,172,132,158,250, 10, 45,213,171, 75, 80,189,254, 3,
+156, 58, 93,192,117, 31, 4,102, 29, 15,164, 68,221, 67,228,141,237, 72,139,125, 4,154,210,193,193,173,189,190, 55,201,238,155,
+ 55,111,182,239,210,165, 11,171, 87,175, 94, 45,175, 95,191,222, 50, 35, 35, 35,178, 88, 96,180,236,213,171, 87, 75, 27, 27, 27,
+236,220,185, 83, 65, 16,196,238, 26, 86,118,169, 7, 44, 43, 43,235, 57,128,141,151, 46, 93,218, 61, 99,198, 12,216,218,218, 54,
+ 79, 79, 79,175,240,196,108, 54,187,229,196, 77,155,104, 54,147, 73,159,217,179,135,179,238,230,205, 95,126, 59,126,156,211,195,
+203,139,160,105, 26, 17, 17, 17,252, 45,123,246,240,199, 14, 30,252, 33, 57, 43,139, 12, 9, 13,213,100,164,165, 21,102,201,100,
+235, 50, 50, 50, 62,254,127,180,108,173, 86,251, 36, 49, 41,209,169,109,135, 86, 54,225,113,137,177,222, 61, 58,119,102, 48, 24,
+140,248,132,228, 80, 27, 27, 83,254,237,160,219, 26,173, 86,251, 68, 31, 46, 30,143, 55,160, 71,143, 30, 44,137, 68, 2, 71, 71,
+ 71,100,103,103, 67, 36, 18, 21,121, 28,242, 37,208,228,231, 67, 91,144, 7,157, 76,138,196, 23,207,209,170,126, 61,222,121, 30,
+111,128, 92, 46,175, 84,104,149,188,101,150,151,232,186,228, 51,174,137, 9,184, 66, 33,136,234, 15, 27, 14, 54, 55, 55, 95,158,
+151,151,119, 29,192, 6,141, 70,227,187,124,249,242,118,187,118,237,178,222,184,113,163,233,244,233,211,207, 75,165,210, 86, 40,
+ 74,170, 90, 81, 7,246,158, 36, 73, 43, 0,118,193,193,193,176,181,181, 69,126,126,126,137,167, 69, 45,151,203,141,196, 98, 49,
+ 84, 42, 21,212,106, 53, 76, 77, 77,241,242,229,203, 92,146, 36,175, 86,101,156,105, 3, 98,131, 74, 19,247,131, 85, 99, 65,186,
+134,180,240,204,202,165, 36,107,127,201, 88, 15,224,151,190,245,235, 31,214, 80, 15, 18,223,198, 92,181, 72,122,113, 63, 55,253,
+173,172,254,145,235,137,149,205,209,162, 1, 80, 4, 65,208,110,110,110,200,206,206, 6,147,201, 4,159,207,135, 80, 40,196,138,
+ 21, 43,176,123,247,238,154, 8, 45, 35,129, 64,176,137,193, 96,140,102, 48, 24, 54, 58,157, 14,126,126,126, 24, 56,112, 32,184,
+ 92, 46, 52, 26, 77,169, 71,179,196, 75, 85,133,167, 35,226,233,211,167,166, 79,159,126,242,216,242,178,182,182,190,171, 82,169,
+144,144,144,128, 43, 87,174,116, 7, 16, 82,205,186, 78,136,136,136,232,235,225,225,241,123,155, 54,109, 26,208, 52,141,230,205,
+155,195,199,199, 7, 1, 1, 1,136,140,140, 68,126,126, 62,117,251,246,237,223, 0,108,171,110, 31, 94, 92,190,238,195,135, 15,
+127,116,234,212, 41, 11,177, 88, 12,133, 66, 1,153, 76,134,243,231,207,163, 75,151, 46,176,182,182,198,201,147, 39, 73,154,166,
+ 43,171,123, 6,131,193, 56,114,224,192,129,129, 83,167, 78,197,222,189,123,113,230,204, 25, 12, 26, 52, 8,163, 71,143, 70,118,
+118,182,221,214,173, 91, 39, 20, 15, 19,174,241,241,241,129, 84, 42,197,139, 23, 47,226,244,188,231,145,151,151,135,188,188, 60,
+ 24, 27, 27,151,189,199, 8, 0, 1,219,183,111, 31,179, 96,193, 2,212,175, 95,127, 77, 98, 98,226,118,148,179, 74,148,162,168,
+153, 34,145,200,130,197, 98, 89,145, 36,137,212,212, 84,188,124,249, 18,115,230,204,201,205,205,205,157, 1, 32, 25,192,170, 41,
+ 83,166,108, 88,180,104, 81,105, 91, 90,180,104, 81,224,245,235,215,251,254,167,189, 57,110,110,230, 77,185, 76,222,124, 73, 33,
+211, 74, 34,145,148, 62, 59,212,106, 53, 84, 42,213, 39,158, 44, 14,135,109,213,174, 85,237,107, 10,121,225,202, 87,111,243, 42,
+ 76,144,222,184,129, 89, 11,190,192,108, 65,151,174, 61,198,245,233, 59,132, 73,106,181,184,117,235, 42,142, 30,221, 7, 47, 15,
+ 55,212,111,216, 28,115,231,205, 55, 83,169, 73,191,219,183,111, 46, 55,127,250,240,102, 97, 65,222,138,202, 56,255,199,113,173,
+ 88, 92, 93, 43,119,232,176, 60, 5, 89, 28,194, 65, 82,188,107,109, 97, 97,177, 71,167,211,121,153,154,154,130,202,123,131, 87,
+ 47,159, 33, 87,194,134, 74,161, 3, 69, 23,137, 45,189,132,139, 74,141, 7,183,254,192,142,237,191, 64, 44, 22,195,163, 91,119,
+ 72, 89,181, 80,187, 86,109, 40, 21,242,226,155, 6,208,168,181,176,177,171,131,240,240, 72,109,129, 76, 86,225, 3,137, 99,164,
+105, 92,219,206, 13, 42, 77, 39, 24,113,185,200, 47, 84, 67, 82, 44,178, 78, 94, 24, 5,149, 92, 1, 82,173, 1,169,214,194,166,
+246,112, 52,178,235, 1, 74,119,181,105,181,138,143,210, 65,147,244, 0,154,164, 7, 48,238, 52, 15,127,250,143,249,172, 35,213,
+ 47,239,110,118,118,118, 86,108,108,236,213,136,136,136,161,163, 70,141,194,189,123,247,166, 3,152, 85, 60,124, 51,125,212,168,
+ 81,136,136,136, 64,108,108,236,213,236,236,236,172,111, 81,243, 92, 46, 87,161, 82, 21,245,177,124, 62,223,168,138, 99,157,218,
+ 13, 27,198,200, 15, 15, 47,216,254,248,241,154,195, 71,142,112,122,245,236, 73,104, 73, 18,148, 78,135,134,174,174, 68,159, 62,
+125, 4, 1,231,206, 89, 49,181,218,167, 75,125,125,131,247,143, 31, 95,248, 92, 38,211,119,162,121,221,226, 33, 67, 0,168, 91,
+201,103,122, 67,165, 82,237,154, 57,109, 82,175,144, 7,143,106,213,174,229,100,122,235,118, 72, 36,207,152,203,168,239,210,128,
+ 41,201,207,101,173, 95,179,210, 88,165, 82,233, 43, 90, 27, 91, 91, 91,227,227,199,143,120,247,238, 29, 84, 42, 21,180, 90, 45,
+ 40,185, 12,106, 73, 30,212,249,185, 32,148, 10,240,116, 58, 40,115, 50, 81,183,126, 61,224,175, 21,137, 85, 14, 69,149, 39,180,
+ 74,254, 26,153,154,130, 35, 16,130,193,102,235,157, 28, 29, 64,155,246,237,219,159,187,120,241, 34,103,242,228,201, 29,238,220,
+185,179, 7, 64,178, 72, 36,234,185,122,245,234,231,123,246,236,225,205,152, 49,195,125,219,182,109, 19, 0, 28,172,136, 68,169,
+ 84,158,187,118,237,218,216, 58,117,234,216, 69, 71, 71, 67,169, 84,130,162, 40,244,235,215, 15, 40,154, 91, 3, 0,136,143,143,
+ 87, 40,149,202,172,152,152,152,130,228,228,100, 13,244, 88, 37,184,118, 87,198,147,130,143, 15,134,217,217, 59, 61, 53, 50,174,
+235, 66, 75,195,135, 46, 28,225,180,117,251, 5,145,242,102, 66, 66,225, 15,189,235,109,150, 21, 70,205, 49,119,150,238,189, 25,
+152,168,207, 68,248,210,213,133, 86, 86, 86, 96,177, 88, 96,179,217,224,112, 56, 32, 8, 2,243,230,205,195,161, 67,135,170, 26,
+ 58,252, 68,100,153,152,152,196,174, 91,183,206,121,198,140, 25, 28, 35, 35, 35, 72, 36, 18,156, 60,121, 18, 83,166, 76,193,209,
+163, 71,203,157,255,162,199,144,210,231,222,210, 5,227,199,143,135, 90,173,134,143,143, 15, 14, 31, 62,188, 64,167,211,133,212,
+224,150,126, 26, 25, 25,233, 26, 25, 25,105, 10, 96,208,232,209,163,143, 15, 31, 62, 28, 33, 33, 33,184,122,245,106,119, 20, 45,
+250, 80, 0,240, 7, 96, 91,252,183,178,251, 83, 96,103,103,183,143,162,168, 65, 54, 54, 54,145,110,110,110,205, 78,157, 58,101,
+158,149,149, 85,178,248, 1, 73, 73, 73, 56,118,236, 88,198,145, 35, 71, 10,116, 58,157, 21,131,193,184,150,151,151,183,162, 18,
+193,118,100,251,246,237,147,138,135, 3,113,241,226, 69,250,151, 95,126, 33, 86,175, 94, 13,137, 68, 2, 47, 47, 47, 28, 56,112,
+ 96,190, 84, 42,109,249,203, 47,191, 76, 27, 57,114, 36,214,175, 95, 15,153, 76,182,189,170,151,149, 74,196, 23, 1,160,243,246,
+237,219,235, 44, 88,176, 0, 23, 47, 94, 68,155, 54,109,140, 19, 19, 19,247, 3,152, 90, 94,253,209, 52,141,196,196, 68,200,229,
+114, 60,122,244, 8,107,214,172,145,148, 17, 89,243,103,205,154,181, 97,254,252,249,216,180,105, 19, 29, 29, 29,157, 53,124,248,
+112,187, 67,135, 14, 49, 27, 54,108, 56, 95, 46,151,255,199,132,150,123, 67,203,205,237,218,116, 93,238,224,212, 16, 39, 79,157,
+ 70,110,110,110,105,153,148,148, 11, 77,211, 40, 44, 44,196,199,143, 31, 97,102,106,130,173,219, 54,124, 55,123,250,164, 90, 40,
+ 10,131,241,165,203,178,190,197,182,225,163, 39, 47,246, 25, 59, 9,209,145, 97, 8, 56,126, 16, 49,209, 17,165,124,164, 86,131,
+ 55,113, 47,241, 38,238, 37,236,236,235,160, 79,175,238,196,152, 49, 99,250,141, 31, 59,218, 6,192,223, 22, 58,226, 31,236,205,
+ 2,190,140,163,117,232, 19,161, 85,133,187,206,218,194,194, 34,246,236,217,179, 86, 30, 30, 30, 76,146, 36,113,243,214, 45,204,
+153,245, 61, 38,140,247,131, 6, 22, 32,213, 28, 80, 28, 35,189, 44, 81, 40,228,160, 65, 67, 38,147, 33, 52, 52, 20, 52, 69, 34,
+224,208, 47,160,105,170, 84,104, 1, 52,212, 26, 13,156,106,187, 99,223,225,141, 36,216,236,231,208,150, 31,186,166, 64,204,212,
+105, 73, 26,162,172, 20,164,100,196,192,204,164, 54, 88,236,218, 16,231,201,193, 98,216, 67,171,140,135,174,248, 92,185, 44, 13,
+ 10,205,215,213,159,174, 28,239, 41, 93,141,135,174, 66,161, 56,113,226,196,137,239,126,253,245, 87,110,255,254,253,221, 46, 92,
+184,208, 25, 0,250,247,239,239,102,106,106,138, 19, 39, 78,168, 21, 10,197,137,111,232,241,233,209,190,125,123, 72, 36, 18, 36,
+ 37, 37, 69, 86,122,109,106,181,149,208,214,150,153,117,239,158, 54, 91, 34,169,213,163, 71, 15, 66, 75,146, 96, 16, 4,114,243,
+243,145,252,225, 3,204,205,205,137,216,248,120,225,238,185,115, 47,187, 53,107,198, 42, 89,145,168, 15,174, 94,189,202, 71,209,
+188,172, 74, 63,171, 38,100, 89,153, 31, 39,249,250,250, 94, 62,113,226,164, 89,102, 86,230, 27, 30,151, 75, 10,133, 70,142,227,
+199,205,102,229,229,229,141, 5, 32,213,151, 76, 34,145, 32, 49, 49, 17,198,198,198,224,176,217,160, 20,114,232,100, 82, 40,115,
+179,193,212,168,193,213,233, 96,201,231,161,150,157, 29,106,219, 88,235,197,249,238,110, 80,233,196,247,178,195,133, 91,219, 55,
+ 6, 87, 32, 4,215, 68,136,217,129,247,139,223, 70, 57,192,234,159,244,161,181,118,114,114,250,243,212,169, 83,156,236,236,108,
+ 68, 68, 68, 68, 2,200, 7, 96, 2,128,138,139,139,187, 19, 19, 19, 51,160,120,213, 93, 85,171,197,126,185,116,233, 82,111, 15,
+ 15, 15,210,197,197, 69,144,149,149, 85, 75, 34,145, 80, 25, 25, 25,159,184,132,130,130,130,120,133,133,133, 50,138,162, 46, 23,
+139,172, 42,227, 23, 45, 28,225,100, 20, 26,142,121,158,222,117,155,155, 90,183, 64, 46, 25,222,252,105,100,198,188,133, 35,156,
+118,109,191, 32, 82, 26, 19,170,227,132, 46,181, 22,203, 72,169,239, 36,102, 26, 40,154, 43, 21, 26, 26,138,228,228,100, 36, 38,
+ 38,126, 34,168,166, 79,159,142,128,128, 0,189, 60, 90, 2,129, 96,211,218,181,107,157, 23, 44, 88,192, 41, 35,138,224,235,235,
+139,252,252,124, 28, 62,124, 24,190,190,190,213,238,248, 63, 67,189, 30, 61,122,244,119,112,112,128, 88, 44,134,189,189, 61, 60,
+ 60, 60, 6,134,132,132,184, 0, 72,170, 97,187,159,237,237,237,189, 97,221,186,117,208,106,181,152, 50,101, 10,222,190,125,123,
+238,237,219,183, 59,106,215,174, 61,111,217,178,101,118,118,118,118, 24, 53,106,148,128, 36,201, 97, 21,145, 88, 90, 90,250, 31,
+ 60,120,112,108,255,254,253, 25, 26,141,166,219,221,187,119,241,225,195, 7,168,213,106,144, 36,137,247,239,223,195,215,215, 55,
+163,120,117,227,123, 61,236,154,188,106,213,170, 73,243,230,205,195,150, 45, 91,176,118,237,218,223,204,204,204,154,181,106,213,
+170,245,218,181,107,177,116,233, 82,212,169, 83, 7, 86, 86, 86,141, 86,175, 94,221,120,209,162, 69,216,181,107, 23,214,172, 89,
+243, 27,128, 99, 53, 41, 8,138,162,136,205,155, 55,183,220,190,125,187, 67,137,200, 98, 48, 24, 56,123,246, 44,194,195,195, 7,
+ 38, 36, 36,148,119,206, 1,123,123,251,233, 14, 14, 14,220,219,183,111, 11,235,212,169, 3,146, 36,181,197, 34,107,119,237,218,
+181,231,188,127,255, 30,253,251,247, 71, 66, 66,194, 9, 0, 19,204,204,204,100,139, 22, 45,226, 27, 27, 27,155,201,229,242,255,
+ 84,231, 13, 38,131,152,184,105,253, 82,188, 8,143,199,165, 75, 28,188,120,241, 2,118,118,118,224,241,120,160,105, 26, 42,149,
+ 10,217,217,217,208,106, 84,104,222,180, 30,126, 63,178, 25, 89, 89,217, 0,131,168,112,202, 13,193, 32,198, 77,250,126, 40, 30,
+ 62,186,133,253,251, 15, 66, 42,149, 85,240,242,109,132,134,110,141,225,228,104,139,212,180, 84, 16, 12, 88,255,157,215,250, 15,
+ 31, 58, 44,125, 4, 65,159,240, 14,101, 97,110,110,190,227,204,153, 51, 86, 94, 94, 94, 76,153, 76, 6,138,162,208,213,195, 3,
+243, 22, 44,192,213, 83,167,224,218,193, 7,132, 90, 8,146,175,223,170, 7,165, 66,142, 38,173, 59, 99,228,168,209, 72, 73, 78,
+134,247,128,225, 80, 42,229,165,111, 24, 37, 30, 45,181, 90, 3,107,219, 90, 8, 10, 10, 98, 98,202,148, 87,216, 93,190, 83, 66,
+167,225, 70,189,121,175,236,146,167, 8, 71,232,139, 0,104, 84, 26, 52,111,190, 26, 26,202, 10,182,206,211,161,213, 94, 65, 65,
+246,221,162, 97, 12, 43, 47,164,165,164,128,193,228,196,214,180, 4, 41, 89,246, 87, 61,116,243,243,243,243, 19, 19, 19, 47,132,
+134,134,142, 27, 54,108, 24,130,130,130,166, 1,192,176, 97,195, 16, 26, 26,138,196,196,196, 11,249,249,249,249,223,162,182, 29,
+ 28, 28, 6,117,239,222,221,167, 93,187,118, 8, 12, 12, 4, 77,211, 15,245,186,177,217,108,154,193, 96,128,162, 40, 16, 0,196,
+121,121,120,251,246, 45,196, 57, 57,208,106,181,144, 73,165, 84, 99, 55, 55, 41, 77, 81, 38,213,177,167,236, 10, 67,148,179,234,
+176,228,179, 26, 92,106,242,243,167,143, 83, 10,165, 82, 27, 11,115,139, 66, 46,151,171,147,228,229,229,191,138,141, 86,235,217,
+ 57,148, 32, 46, 38, 38,166, 89,122,122, 58, 82, 82, 82, 64,202, 10,193, 84,169,193, 80,201,209,179,115, 39, 24,131,134, 17, 40,
+176, 41, 45,216, 76, 54, 10,139, 86,231, 85, 57,220,161, 43,243,146, 80, 34,178, 8,130, 40, 26, 46, 20, 8,192, 21,154,124,226,
+225,210,167, 61,241,120,188, 83,231,207,159,119,112,114,114,194,250,245,235,225,236,236,220,200,209,209, 81,110,102,102,102,108,
+103,103,135, 38, 77,154,160,115,231,206,184,113,227, 6,244, 40, 3,146,166,233, 62, 15, 31, 62, 92,252,248,241,227,145, 2,129,
+128,152, 59,119, 46,171, 95,191,126,224,241,120,144,203,229,144, 72, 36, 56,125,250,116, 14, 69, 81, 37,139, 82,172,248,124,254,
+ 49,130, 32,146,100, 50,217,130,207, 9,127,255,181,185, 99, 86, 46, 53,133,150,242,135,122,122,215,109,222,195,187, 23,234,185,
+246, 64, 15,239, 20, 0,216,108,201,250,224,243,243, 42,243,203,230, 38,196,177,160,155,183,215,120,120,246, 88,181, 92,122,111,
+195,150, 67,121, 85,206,167, 35, 8, 2, 20, 69,125, 18, 59,232,243,239, 39, 76,152,128,179,103,207, 86, 89,142, 12, 6, 99,244,
+140, 25, 51, 56,159,121,158, 33, 18,137, 48, 96,192, 0, 12, 27, 54,236, 19,161,101,109,109, 13,123,123,123,124,248,240, 1, 0,
+196,122,182,171,121,147, 39, 79, 38, 20, 10, 5,166, 78,157,138,195,135, 15,195,199,199,135, 8, 9, 9,153, 7, 96, 65,117, 27,
+ 59,131,193,216,186,108,217,178,197,190,190,190,200,205,205,197,245,235,215,209,175, 95, 63,156, 61,123,214,230,250,245,235,155,
+188,188,188,192,100, 50, 17, 24, 24, 8,146, 36, 43,141,245,197,225,112, 6,245,239,223,159,145,154,154, 10, 14,135,131,182,109,
+219, 34, 45, 45, 13,114,185, 28, 34,145, 8,243,231,207,255, 40, 22,139,187,235,123, 31,113, 56,156, 5,243,230,205,195,153, 51,
+103,224,231,231,119, 28,192,212,252,252,252,145,143, 31, 63, 62, 51,120,240, 96,136, 68, 34, 92,190,124, 25,107,214,172, 33, 38,
+ 76,152,128,189,123,247, 98,254,252,249,191, 21,123,157, 42,106,248,133, 89, 89, 89,102, 13, 26, 52, 64,102,102, 38,164, 82, 41,
+ 46, 95,190,108,123,227,198, 13, 23, 39, 39, 39,211,196,196, 68,221, 79, 63,253,196, 93,176, 96, 1,118,236,216,129,136,136, 8,
+ 4, 4, 4,160, 71,143, 30,100, 66, 66, 66,185, 94,178,226,144, 13,151,105,154,190, 45, 16, 8, 80, 88, 88, 88,114,223, 45,241,
+243,243,243,245,247, 47,114,178,167,167,167, 99,226,196,137,227,131,131,131, 41, 47, 47, 47, 62,135,195,129, 82,169,148,253, 39,
+123,109, 74, 71, 1,160,224, 82, 75,136, 91, 87,143, 32, 44, 50, 1, 97,145, 49,224,242,138, 38,193, 43, 20,114,180,110,222, 16,
+ 29,218,182, 71,122,134, 8, 39, 2,142,192,210,218,169,210,231, 8, 77,211,224,176,116,104,236,102,143, 83, 1, 7, 17,120, 61,
+ 24, 1, 39, 78,151,206,121, 99,177,216,104,213,186, 3,218,182,245, 64, 66,226,123, 28, 57,178, 31, 54,182,181, 12,131,131, 53,
+ 68,233,208, 97,217,191,159, 41,255, 30, 30, 30, 30, 76,169, 84, 10,165, 82,137,143, 31, 63,226,195,135, 15, 48,183, 48, 71, 66,
+122, 18,186,243, 53,248, 72, 21, 32, 46, 50, 86, 71, 48,217, 17, 85,253, 96,127,207, 86,128,103, 43,204,153,236, 83,201, 43, 43,
+ 13,129,169,117,209,208, 13, 73,190,195,174, 93,100, 69, 66,139,212,105,239,220,186,125,183,253,228, 9,131,216, 65,119, 15, 67,
+171,166,160,208,154, 65,166, 84, 67,166, 97,131, 97,214, 15,200, 9, 1,147,197, 67,199,150, 13,113,249,210, 13, 13, 77,106,131,
+245, 46, 32,187,102, 32, 51, 99,202, 8,173,172,207,198, 29, 44,245, 30, 58, 44,237,120,117,186,179, 39, 79,158, 28,210,169, 83,
+ 39,190,151,151, 87,131,226,142, 83,115,242,228, 73,121,113, 48,204,234,226,147,104,240,246,246,246,173, 57, 28,142, 79,191,126,
+253, 90, 79,154, 52, 9,175, 94,189,194,137, 19, 39,222, 52,108,216,240, 94, 70, 70,197, 43,178,153, 92,174, 88,154,149,101, 46,
+116,113, 97, 89,152,152,164,223,184,126,189, 78,175,222,189,137,148,148, 20,136,197, 98, 40,149, 74, 68, 68, 70,210,108, 38, 51,
+141, 48, 53,101,196,135,135, 51,152, 92,174,184, 34,111, 99, 57,248, 80,197,170, 67,255,154,122,183,106, 57, 88, 52, 88,227, 55,
+179,158, 82,165,108, 86, 80, 80, 64,178,216,108,182,179,189,121,114,252,123,253,159,137, 42,149, 42,240,206,157, 59, 67,122,245,
+234,197,123, 19, 21, 1, 50, 63, 31,234,124, 9, 56,148, 14,150,173, 91,130,169, 81, 1,106, 45,156, 26,211, 80,230,241, 17,242,
+ 44, 94,171, 82,169,170, 12,106, 88, 34,180, 24,159, 9, 3,174, 80, 8,158,137, 41,120, 66,225,231,130,161,170, 55, 57,126,159,
+ 62,125,122,118,236,216, 17, 52, 77,227,208,161, 67,208,104, 52, 92,141, 70, 3,181, 90, 13,141, 70,131,130,130, 2, 4, 4, 4,
+ 96,223,190,125,143, 1,252,166,199,229,147,198,198,198,131, 9,130,176,101,177, 88,114, 27, 27, 27,193,217,179,103, 75,195, 77,
+180,106,213, 10, 38, 38, 38, 28, 20, 7,133,180,181,181,101, 31, 61,122,212,124,224,192,129, 15,202, 29,238,104,222,104,105, 61,
+210,194,211,200,184,174,139,169,117, 11,212,115,237, 1, 0,232, 61, 96, 50,234, 53,172,141,130,156, 40, 23,165,226,195, 80, 14,
+ 75, 98, 17,187, 75,244,202,184,127,179, 73,178,172,251,111, 81,254,242,254,114, 59, 10, 6,131, 81,225,112,172, 62, 34,171, 72,
+179, 48,108, 74,230,249, 0,128, 88, 44, 70, 70, 70, 6,226,226,226,224,238,238,142,220,220, 92, 56, 57, 57, 65,173, 86,163, 93,
+187,118, 80, 40, 20,216,190,125, 59, 30, 61,122,244, 24,192,124, 61,126,195,216,213,213,117, 98,235,214,173,113,253,250,117,188,
+120,241, 66,116,235,214, 45, 39, 15, 15, 15,184,184,184, 76, 74, 74, 74, 90, 89, 60,212,167, 47, 4, 30, 30, 30,115,125,125,125,
+ 17, 19, 19,131,153, 51,103,138, 83, 83, 83, 47,159, 59,119,110,234,154, 53,107, 24,222,222,222,200,200,200,192,214,173, 91,117,
+143, 30, 61,218, 6, 96,125, 21,229,248, 58, 53, 53,213, 89,169, 84, 34, 55, 55, 23, 36, 73, 66, 46,151,227,198,141, 27, 8, 8,
+ 8,200, 44, 22, 89,239,244, 53,174,101,203,150, 77, 24, 12, 6,206,156, 57, 3, 0, 63,160, 40, 98,255,229,161, 67,135,138,126,
+250,233, 39,167, 21, 43, 86, 96,218,180,105,208,104, 52,216,178,101, 11, 86,172, 88,113,173, 88,100, 85,246, 16,253,213,222,222,
+126,250,204,153, 51, 27, 45, 90,180, 8,161,161,161,182, 47, 95,190,108, 27, 17, 17,129, 90,181,106, 65, 44, 22,179,172,172,172,
+176, 99,199, 14, 44, 92,184,240, 34,128,156, 39, 79,158,140, 78, 76, 76,244, 7,176,181, 10,209,126,192,201,201,105, 58, 77,211,
+180, 92, 46,255,224,231,231,183,117,227,198,141, 88,184,112, 33, 98, 99, 99,145,159,159, 15, 19, 19, 19, 98,217,178,101, 19,127,
+248,225, 7, 76,153, 50,133,150,201,100,251,254,211, 29, 53, 77,235, 32,151,196, 64,167,178, 64,171,230,238,104,213,172, 46,110,
+221, 13, 3, 0,244, 28,238, 1,185,172, 16,199,143, 31,194,187,119,111,193, 98,179, 97,110,105,175,143, 39, 16,234,130,215,200,
+211,100,160,151, 87, 91,244,243,238,142,223,126, 63, 11, 82,171,193,212,201, 99, 33,201,203,195,239,191, 31, 65, 66,226,123,176,
+216,108, 88, 89,255,253,129, 80, 43,211, 34,255,120,161,165,199,240, 19, 40,138,130, 72, 36,194,203,151, 47,145,148,148, 4, 62,
+159, 15, 5,169,163,246,223,121, 68, 17, 4, 39,141,162,233,199, 52, 89, 26,165,248, 75, 14,157, 78, 84, 38, 98,173,153,133,133,
+ 5, 87,165, 82,128, 36,181,101,122, 21, 2, 32, 0, 14, 11,112,112,172,135,212,148, 84, 90,169, 84,222,175,244, 13, 74,165,220,
+241,199,229,243,190,157,187,120, 88,247,235,185, 14,151,175,172,134,164,160, 0, 74, 13, 27, 50,165, 6,114, 37, 96,110,233,134,
+118,205, 91, 32, 61, 93,140,168, 23, 33, 82,150, 74,174,207, 68,209,183,187, 87, 77,118,157, 60,103, 41,140,235,116,129, 42,238,
+ 50, 40,105,102,169, 71,203, 72,104, 1,203,218,141,145, 39, 83,225,124,112, 24, 80,141, 84, 47, 89, 89, 89,114, 38,147,121,210,
+215,215,119, 75, 88,216, 75,103, 0, 8, 11, 11, 75,203,200,200, 88,158,149,149, 85, 93,159,116, 73, 52,120,194,200,200, 56,172,
+ 97,195,134,233,109,219,182, 53, 27, 58,116, 40,172,173,173, 17, 17, 17, 1,127,127,255,215, 26,141,102,105, 72, 72, 72,165, 67,
+ 61,106,181, 90, 20,118,229,138,105,247,239,191, 55, 95, 58,112,224, 86, 95, 95,223, 29,235,215,175,103,187,186,186, 18, 90,141,
+ 6,209,209,209,244,169,147, 39,181,251, 86,172,216,206, 21, 8, 88,207,255,248,131, 77,170, 84,162,255,239, 70,236,228,228,228,
+233,209,173,107,227,109,191,238,130, 82, 33,197,179,208,107,144, 72,178,113,240,208,165,198, 78, 78,180,167, 72, 36, 10,209, 87,
+ 0, 31, 59,118,108,113,135,214,173, 91,215,175, 85, 11,209,201, 73,224, 82, 58,112, 72, 18, 76,141, 10, 12, 82,137, 90,205,104,
+ 16, 12, 19,100,124, 44,192,198, 51, 23, 98,244, 17,198,141,190, 27,132,245,105,249, 32, 8, 2,191,116,106, 6,174,137, 16, 28,
+129, 16,179,255,188, 91, 42, 12, 2,215,175, 0, 87, 40, 68,131, 14,122, 5,132,151,223,187,119,239,101,116,116,116,187,102,205,
+154, 97,241,226,197,248,240,225, 3, 40,138, 66,102,102,166, 50, 35, 35, 67,148,157,157,253, 1, 69,241,127, 14, 87,209,137,149,
+ 85, 29, 78, 33, 33, 33,165,195, 13,193,193,193,112,116,116,132,153,153, 25, 10, 10, 10, 48, 99,198, 12,243, 31,127,252, 17, 0,
+240,242,229, 75,148, 21, 40,159, 35, 58, 44,110, 91, 94, 33, 45,161,165,225, 67,115,201,240,230, 61,188, 83,209,123,192, 36,220,
+ 14,252, 13,119,111,221,129, 37,235, 67, 18, 4,133, 55,114,146,114, 10,210,100,174, 7, 26,183,153,202,204,144,221, 58, 48,119,
+208, 27,166,131, 3,117,126,197,254,130,188,202,108,117,117,117,133,157,157, 93,233, 28, 45, 22,139,133, 41, 83,166,128,166,105,
+125, 69, 86,113, 95, 67,101, 43,149, 74, 59,196,253, 47,128, 0, 0, 32, 0, 73, 68, 65, 84, 35, 35, 35,124,252,248, 17,239,223,
+191, 71, 66, 66, 66,105,232, 0,138,162,180, 75,150, 44, 97,207,157, 59, 23,251,247,239,199,253,251,247, 31, 3, 88, 7, 64,223,
+151,181,177,163, 70,141, 50, 81,171,213, 56,125,250, 52, 9, 96,192,249,243,231, 95,182,107,215,142,213,183,111, 95,147,189,123,
+247,142, 45,174, 35,189,133,150,169,169, 41, 71,163,209, 96,239,222,189, 72, 77, 77,245, 4, 16,247,252,249,243, 3,163, 70,141,
+218,215,172, 89,179,134, 49, 49, 49,111,165, 82,233,108, 0, 81, 85,145,101,102,102, 78,110,219,182,237,121,138,162,234,244,234,
+213, 75,240,235,175,191,154,198,199,199,195,217,217, 25, 20, 69, 69,163,154, 41,172,222,190,125, 27,151,145,145,209,184,123,247,
+238,184,113,227,198,102,157, 78,183, 9,192,150, 89,179,102, 57, 37, 39, 39,163,117,235,214,176,180,180, 68,124,124,124, 97, 70,
+ 70,198, 62, 20,165, 36,170,202,133,155, 8, 96,249,129, 3, 7, 90, 28, 56,112,192,199,210,210,178, 99, 68, 68, 4, 30, 62,124,
+136,109,219,182,225,199, 31,127, 68,215,174, 93,177,120,241,226, 28, 0, 62, 0,200,196,196, 68,189,226,230,149,120,182, 0,160,
+ 77,155, 54,233,254,254,254,152, 58,117, 42,125,244,232,209,157, 39, 79,158, 92, 48,118,236,216,210, 62,112,226,196,137,244,137,
+ 19, 39, 38,162, 40, 13,211,127, 18, 90,141, 70, 13, 83,203,122,144,230,165, 32, 59, 53, 20,124, 19,123,120,247,104, 9,185, 66,
+141,171,127, 92, 68, 84,116, 36, 24, 12, 6,236,236,107,193,220,194, 26,111,222,188, 5, 42, 95,109,172,213,104, 52, 48,177,168,
+ 11,105,126, 42,212, 89, 97, 48, 22,218, 98,210,247, 67, 33, 87,104,112,233,242, 69,196,196, 68,129,201,100,194,222,161, 22,204,
+204,139, 56, 9,186,242, 21,204, 6, 0, 40, 39,158, 86,149, 66,139,201,100,222,187,121,243,230,136, 14, 29, 58,176,222,189,123,
+135,119,239,138, 94,110, 36, 18, 9, 73, 64,119, 33, 43,250,143, 49,149,156,222, 11,197,171, 51,202,230, 46, 20,154,152,136,226,
+ 95,199,217, 73,114, 51, 17, 25,254, 8,239,222, 68, 35, 41, 33, 14, 26,141, 18, 76, 6, 3, 12, 38, 3,117,235, 53,197,163,199,
+161,106, 37, 73,134, 86,196, 89,100, 71, 66,161,192,214,117,244,134,245, 43, 3, 23, 46, 93,107, 60,114,196,126, 68,197,191,130,
+148,180, 7, 77, 3,246, 86, 2,180,170,191, 12,162,244,108,156,249,109,175,156,210,104,198,125, 22, 67,235, 11, 78, 0,176,203,
+ 65,147,125,135,126,155,114, 56,224,212,218,165,115,103,216, 13, 30, 54, 14,220,220, 87,208,166,135,161, 94,187,126, 32,120,230,
+184, 30,116, 23, 33, 47, 95,101, 82, 58,122,173,157, 24, 71,223, 84,193, 89, 22,121,121,121, 79, 62,126,204,112, 46, 19, 5,222,
+153,199, 51,170,106,117,220,231,156,159, 68,156,103, 50, 25,109, 54,108,216,160,181,179,179,211,196,196,196, 96,255,254,253, 84,
+ 88, 88, 88, 16,131,193,216,157,145,145,161,172,138,211, 70,171,141, 60,229,231,215,164,253,176, 97,244,152,185,115,229,224,241,
+230,109,253,229, 23,191,108,137,196,145,166, 40,216, 88, 90,166,109, 93,177,194,127,196,168, 81,146,216, 71,143,140, 67,175, 92,
+ 49,230,146,100,152, 30,118,126, 11, 84,200, 41, 18,137, 66,238,223,127,136,227,135,127,133, 70,163, 66,134, 40, 25, 0,144, 35,
+206, 71, 21, 34,235,115, 78, 90, 46,151, 15,251,225,199, 31,159,254,176,112,129,125,183,158,189,144, 18, 25, 1, 77,110, 54, 8,
+ 45, 9, 54,193,130, 44,139,143,172, 76, 41,150,159, 56,151, 37,149,203,135,149,211, 73,148,107,103,137,199,138,103,106, 2,142,
+ 64, 8,174,208,228, 19, 47,150,145,169, 41,184, 2, 33, 88, 92,110,121, 19,184,191,224,148, 74,165,195, 71,140, 24, 17,245,252,
+249,115,139,169, 83,167,162,115,231,206,225, 10,133,194, 11, 64, 97, 77,203,147,162, 40, 81,183,110,221, 24, 4, 65, 8,199,141,
+ 27,199,203,206,206, 46,141,172, 46,149, 74,113,227,198, 13,184,187, 23,173,234,143,141,141, 69,211,166, 77, 43,228,156,182, 60,
+ 70, 4, 96,253,194, 17, 78, 91,159, 70,102,204, 3,176,185, 94,195, 90,184,123,235, 14, 30,222, 13,245,235,216,140,218,245,221,
+184,118, 63,241,189, 70, 45,109,220,102, 42, 83,104,234,128,223, 47, 93,100,198,133, 29,217, 40,151, 71, 55,192,254,203, 75, 42,
+178,147, 32, 8,208, 52,253, 69, 40, 7, 38,147,137,147, 39, 79, 86,247,218,207, 29, 62,124,120,214,204,153, 51, 57, 25, 25, 25,
+120,253,250, 53,100, 50, 25,140,140,140,112,235,214, 45, 18,192,222,147, 39, 79,222, 58,121,242,100, 95, 20,173, 38, 10,174, 78,
+251, 20, 8, 4,190,222,222,222,120,253,250, 53, 94,188,120,113, 17, 64, 84,120,120,248,197,119,239,222,141,238,218,181, 43,126,
+251,237, 55, 95,133, 66,113,184, 58,156, 20, 69,149,141,153, 84,146,241, 33, 82, 42,149,118, 12, 13, 13,173,110,189,103,136,197,
+226, 46,197,194, 58,213,206,206,206, 52, 50, 50, 18,181,107,215,134, 70,163,233, 80,221,182,148,159,159,255,235,238,221,187,143,
+ 78,158, 60, 25, 63,253,244,211,184,115,231,206,141,251,238,187,239,208,191,127,127, 28, 59,118, 12, 81, 81, 81,155,161, 95, 90,
+177,242,174, 61, 10, 64,148,157,157,221,156, 90,181,106, 97,219,182,109,136,142,142,246, 95,191,126,253,138,168,168, 40,184,187,
+187,243,226,226,226,200,154, 60, 67, 0,192,212,212,212, 84,171,213,226,202,149, 43,207, 0, 44, 28, 55,110,156,237,142, 29, 59,
+124,132, 66, 33,114,115,115, 21, 49, 49, 49, 99, 1,252,241,159,126,214,209, 4,177,106,234,180,121, 7,166, 77, 29,107,212,182,
+ 77, 43,200, 11,210,160,144,102, 66, 94,248, 17,187, 15, 7,129, 32, 24,176,177,113,128,173,189, 51,146,147, 83,240,248,218,117,
+181, 76,174,216,193,213, 82,155, 43,231,156, 91,196,217,186,136, 83, 46,203,130, 66,154, 85,202,105,107,235, 88,204,153,140, 71,
+161,215,149, 10,153,236, 87, 53, 77,252,252, 55, 95,251, 63, 25,213,203,117, 88, 22, 18,137,100,254,140, 25, 51,188,150, 47, 95,
+110, 69,146, 36,211,210,210, 18,201,201,201,228,133, 11, 23,114,165, 82,233,252,154, 88,195, 98,179,163, 92,221,220,189, 6, 15,
+ 30, 76, 14, 26, 52,144, 51,126,114, 95,150,141,173, 45,242,243,196,120,243, 58, 2,241,175,194,224,234,222, 18,107,214,111, 7,
+204,205,171, 76, 36, 89,156, 86,103,192,186, 31,150,156,237,226,217,199,212,189,105, 75, 78,171, 6,102,208,104, 73,164,165,165,
+225,143, 43,145,154,152,151, 15, 11, 40, 82, 61, 90,158,163, 95, 10,158, 16,128,132, 24, 7,155,217,106, 78,110,218,186,123,241,
+222,131,199,151, 46,159, 55, 85,208,213,163, 55,162,239,252,134,139,129,103,101, 74,149,122, 43,135,137, 95, 98,196,144,191,169,
+102, 25, 40,149, 74,205,231,253,169, 82,169,212,124,109, 77, 31, 59,118, 12,153,153,153,234, 15, 31, 62,220, 36, 73,242, 92, 37,
+201,158,191,192,110, 64, 61, 84,165,186,243,131,135, 71,223, 31,110,221, 50,154,184,108,153,122,220,248,241, 75,160, 82,105,192,
+229,210, 44,129,128, 1, 30,143, 29,251,232,145,241,206, 89,179, 44, 9,181,250,246,241, 74,194, 6,148,131,111,190,234,176,196,
+163,213,189,123, 87, 76,156,186, 16,138, 50, 30,173, 39, 47,222, 64,165,129,222, 30,173, 98,164,124, 72, 77,237, 56,111,213, 15,
+151, 70,123,247,108,220,172, 78, 93,158,141, 75, 93, 8,237,237, 33,206,206,198,163, 23,241,218,245,103, 47,197, 20,139, 44,189,
+226,202, 80, 20, 85, 52,201, 29, 64,207,249,203, 65, 48,153, 64,113, 24,135,146,149, 67, 46,237, 58,131, 96,177,160,163, 41,168,
+ 84, 42,125, 38,253,165,189,127,255,126,248,184,113,227,130, 3, 3, 3, 25,222,222,222,173, 46, 95,190, 76,125, 77,219, 81, 40,
+ 20, 29, 1,192,200,200, 40,201,220,220,220,105,242,228,201,208,106,181,144,203,229,200,207,207, 71, 90, 90, 90,222,228,201,147,
+ 53, 0, 96,108,108,204, 29, 49, 98,132,105, 85,156,219, 47,136,148, 11, 71, 56,237,178,100,125,240, 41,200,137,114,177,100,125,
+ 72,234,216,140,218,181,253,130, 72,105,234, 40,219,144,243, 33,228, 77,134,236,214,129,223, 47, 93,100, 78, 24, 58, 92,231, 44,
+124,235,103,100, 75, 95,168,138,151, 32,136, 47,130,147,234, 41,178, 62, 65, 97, 97,225,138,213,171, 87,247,151, 72, 36,206,125,
+251,246,229, 52,110,220, 24, 79,159, 62, 69, 96, 96, 32,249,228,201,147, 84,153, 76,182, 18,128, 18, 64, 80, 77,202,212,205,205,
+205,133,197, 98,149, 12,165,237, 41,254,120,207,229,203,151, 71, 79,157, 58, 21,117,235,214,109, 18, 23, 23,199, 67, 53,238, 35,
+154,166, 75, 71, 25,190, 37, 8,130, 72,216,185,115,167,147,189,189, 61,113,227,198, 13,146,201,100,214,196,115,115,236,200,145,
+ 35, 29,180, 90,237,180,233,211,167,195,211,211, 19, 36, 73,226,196,137, 19, 56,114,228,136,190, 34,171, 82,188,121,243, 38, 44,
+ 53, 53,181,219,146, 37, 75,176,109,219,182, 21, 75,150, 44, 65,106,106, 42,222,188,121, 19,241, 53,188, 5, 5, 5,138,148,148,
+ 20,126,167, 78,157,218,198,196,196,196,120,121,121, 53,157, 58,117, 42, 54,111,222, 76,223,191,127,127, 4,128, 27,255, 31,189,
+119,252,187,220, 0,182,142,117,107,253,134, 95,127,108, 80,223,101,230,148, 73,163,152,110,174, 77, 33,203, 79,131,149,181, 29,
+156,107,213, 67,118, 86, 14,110,222,188,161,203,201,201, 59,166, 99, 16,235,222,189,203, 77,255, 26, 78, 39,231,122,200,202,202,
+194,245,235,215,117,121,146,130, 67,208, 50,214,199, 37,231,101,194, 0,125, 60, 89,211, 81, 73,148,248,202, 96,109, 97, 97,113,
+218,212,212, 52,211,212,212, 52,211,194,194,226, 52,160,215,234,131, 94,101,158, 14,204, 79,182, 17, 35,140, 96,100,212, 17, 44,
+214, 34,115, 11,139, 27,102,102,102,226,238,221,187,171, 15, 28, 56,160,140,139,139,165, 68,162, 84,218,204,204, 44,191,244,248,
+242, 56, 63,131,133, 69,125, 19,129, 67,211, 31,205,156, 91, 61, 18, 58, 52, 41, 20, 58, 52, 41, 52,115,110,249, 88,224,208,100,
+173,133, 69,125, 19,189,236,172, 0,245,108, 97,227,106,141,189,238, 54,132,194,213, 26,123,235,217,194, 70,239,107,175,124,216,
+ 79, 71, 16,208,161,104, 25, 54,106,192, 89,194, 65, 49,153,204,227,206,206,206, 14,168, 94,192,186, 47, 56,199, 3,117,199,243,
+120,211,206,251,249, 77, 76,186,127,127, 92, 65, 98,226,152,252,132,132, 81, 17,103,207,142,222, 51,122,244,248, 49, 60,222,244,
+ 17, 64,125,125, 57, 29, 28, 28,252,195,194,194, 2,245,221,202, 8, 47,189,203,179,126, 61,167, 91,222,189, 58,208,190, 51,134,
+209,190, 51,134,209,222,189, 58,208,245,235, 57,221,250,138, 58, 34,152, 76,166, 15,159,207, 63, 45,224,243,163, 5,124,126, 52,
+159,207, 63,205,100, 50,125, 80,249, 28,170, 79, 56,173,172,172, 94,218,217,217,101, 86,103,179,182,182, 14,175,134,157, 99, 92,
+ 92, 92, 82, 25, 12,198,246,106,222,211,149,113,186, 26, 27, 27, 39, 8, 4,130,180,178,155,177,177,113,217,192, 80, 86,124, 62,
+255,170, 64, 32,216,161, 15,231,207,171,154,254,248, 56,104, 78,212,207,171,154,254,248,249,119,115,135, 88, 76,126, 26,188, 78,
+ 60,119,136,197,100,125,236,180,181,181,189,111,107,107,155, 97,107,107,155, 97,103,103, 87,233,102,109,109,253, 82, 15, 78, 35,
+ 19, 19,147, 29, 38, 38, 38,153, 2,129, 64, 39, 20, 10, 51, 5, 2,193,118,148, 9,109, 81,211,242,100, 48, 24,155,155, 52,105,
+162,100, 50,153, 71, 63,251,106, 91,131, 6, 13,148, 44, 22,107,107, 53, 57, 77,187,118,237,170,139,140,140,164, 61, 61, 61,105,
+ 0, 22,223,176,222,237, 45, 44, 44,110,152,154,154,166,152,152,152,236, 6, 32,168, 33, 39, 1,192,199,201,201, 41,162, 71,143,
+ 30,114, 39, 39,167, 80, 0,131,191,161,157,253,135, 12, 25, 66,165,164,164,208, 52, 77,211, 41, 41, 41,244,144, 33, 67, 40, 20,
+ 5,138,252,154,103,242,170, 89,179,102,209, 79,158, 60,161,159, 60,121, 66,135,134,134,210,253,251,247,167, 0,124,255,149,207,
+121,124,171,107,111, 92,207,186,126,163,134, 22,231,198, 14,247,160,130,254,216, 78,175, 89, 57,147,238,237,217,148,118,111, 96,
+113,201,213,213,202,245, 91,112,254,184,114, 6,221,171, 91, 19,170,113,125,139,179,141,235, 89,215,255, 15, 95,251,191,209,171,
+133,191,123,194,217, 95,174,197, 79,197, 82,249,112,116,116,132, 88,220,193,136,197,242,224,241,120, 94, 12, 38,243, 94,110,118,
+246,130,226,215, 45,221,127,202, 85, 91,105,135, 94, 31,220, 74, 82, 18,212,132,243,147,137,236, 53,228,172, 14,135, 94,156, 21,
+ 37,149,166, 84,170,116, 43,146,124,185, 27,149,150,193, 39,156, 78, 78, 78,211, 40,138,114,209,215, 32, 6,131,145, 36, 18,137,
+ 14,215,164, 60, 27, 54,108, 72, 23, 15,111, 19,223,178,222,255,142,182,244,191,196,249,251,175,205, 29,221,155, 55, 90, 26, 29,
+ 22,183,173,120, 88,177, 20,107,231, 90,152,120,244,232,190,250,209,221,251, 63,173,221, 45, 41,252,127,190,118, 6,244,156,211,
+246, 13, 56, 75,130,132, 86,139,147,205,102, 31,104,223,190,253,180,167, 79,159, 30,213,233,116,211,255, 71,219,103,127, 38,147,
+185,196,205,205,173,213,155, 55,111, 34,116, 58,221, 54,148, 19, 40,178, 6,118,174,116,113,113,153,205,225,112,120, 82,169, 84,
+146,158,158,190, 26,192,185,255,182,242,108,220,208,178, 45, 77,151, 6,221,222,248,250,125,238,243,111,198, 73, 83, 58,138,102,
+110,120,147, 40, 14,255,127,168,247,127,155,200, 58,244,159,248,225, 94, 6, 78, 3,167,129,211,192,105,224,252,230,156,198,134,
+242, 52,112,254, 11, 57,255,149, 96, 25,138,192, 0, 3, 12, 48,224, 31, 7,133,161, 8, 12, 48,224,191, 14,101,189, 90,165,222,
+ 44,162, 18, 85, 90, 29,151, 96, 77,148,237, 29, 3,167,129,211,192,105,224, 52,112, 26, 56, 13,156,255,115,156,255, 86,145,117,
+168,146,253,191, 13, 6,183,170,129,211,192,105,224, 52,112, 26, 56, 13,156, 6,206,255, 5,161, 85,238,190, 97,232,208,128,191,
+ 29,187,134,194, 9, 0,230, 93,134,232,239, 56,222, 0, 3, 12, 48,192, 0, 3,254,159,113, 8, 21, 12, 29,254, 55, 8, 45, 71,
+ 0, 29, 81,148,248, 54, 30,192, 67, 0,146,175,224,179, 6, 48,138, 32,136,145, 0, 64,211,244,121, 20,173, 26,201,209,231,100,
+ 35, 35,163, 76,165, 82,105, 91,252,127,150, 82,169, 44,155,203,128,192,151,171,217,232, 50, 91,185,112,113,113,201, 84,169, 84,
+182,122,252,124, 62, 77,211, 81, 12, 6, 35, 90, 40, 20,222,125,243,230, 77, 96,117, 46,220,203,203,107, 34,147,201,220, 8, 0,
+ 58,157,110,213,189,123,247,142,255,141,245,214,161,150,163,253,111, 26,173,134,204,204,206, 93,141, 47, 3,249, 1, 0,246, 14,
+128, 63, 65, 98,105,241,255, 91,231, 4, 86, 30, 71,167,186,199, 87,130,182,108, 54,219,215,206,206,174, 95, 90, 90,218, 75, 0,
+203,128,170,163, 26,215,170, 85,235,123, 22,139, 53, 78,167,211,213,103, 50,153, 9, 36, 73,158, 76, 77, 77, 13, 48, 60, 67, 12,
+ 48,192, 0, 3, 12,208, 67,108,125,129,106, 9, 45,119, 43,216,211,128, 15, 8,244, 6,141,219, 4,112, 38, 94,140,143,250,158,
+255,157, 59,180, 90,178,232, 55, 57, 12,232,110,188,103, 28,234,215,175,159,243,220,185,115,209,185,115,103, 60,125,250,180,211,
+177, 99,199, 38,159, 59,119, 46,138,162,168,123, 0,158, 2,122,133, 82, 16,160, 40, 78,203,216,126,253,250,245,218,184,113, 35,
+179,105,211,166, 80, 40, 20,184,127,255,190,199,214,173, 91,119, 60,126,252,248, 14,128, 83,197,130,160,194, 4,120, 74,165,210,
+182, 36, 25, 39, 65, 16,182, 35, 70,140,120, 94, 86, 92, 21,231, 87, 35,104,154,126, 66, 16, 68,168, 78,167,123,122,225,194,133,
+ 84,119,160,195, 12, 23,206,133, 5, 73, 26,231,207, 57, 85, 42,149,237,149,159, 55,129,197,227, 65, 85, 88,128, 78,147,254, 18,
+189,183,127, 92, 10,130, 34,193, 4, 45,241,218,176, 35, 10, 64,116,122,122,122,148,167,167,103, 82,117,107,152,201,100,110,188,
+121,243,166, 3, 77,211,240,246,246,222, 8,224,239, 18, 90,188,142,109, 91,222,187,122,241,180,145, 52, 55, 19,125, 7,143, 62,
+249, 54, 53,107, 34,128,139,159,136,166,126,176, 35, 8, 44,157,181,233, 20, 19, 0,246,173, 28,187,108,123, 31,236, 90, 24,132,
+143, 0,188,138,197, 15, 0,252, 12,224,222,222,126,176, 3,176,124,214,166, 83, 4, 0,236, 95, 57,118,233,222,126,216, 57,231,
+ 70,181,195, 86,204,158, 56,113,226,174,141, 27, 55, 50, 29, 28, 28, 32, 18,137,250, 54,105,210,196,173,160,160,160, 9, 42,153,
+ 68, 92,183,110,221,179, 93,123, 12,172, 55,108,164, 15,223,198,218, 2,233, 25, 57,166,103, 79, 31,157,193,124,114,191,223,135,
+ 15, 31, 70, 27,158, 33, 6, 24, 96,128, 1, 6, 84,128,154, 71,134,111,237, 0, 99,153, 6, 67, 88, 76,226,251, 46,109,155,244,
+ 28,243, 93, 87, 70,147,198, 13,241, 42, 54,174,207, 31,119,159,109,101,132,198, 6,147, 58, 58, 64,192,193,149,240,140,202, 87,
+194,104, 73,176,130,174,156, 42,234, 9, 39,143,101, 62,127,254,188, 97,155, 54,109, 74, 83,195,244,236,217, 19, 61,123,246, 36,
+246,237,219,215, 50, 40, 40,168,229,145, 35, 71, 52,193,193,193,191,161,242,248, 40,190, 13, 26, 52,216,186,107,215, 46,158,167,
+167, 39,120, 60, 94,233, 23, 66,161, 16, 3, 7, 14,196,192,129, 3,153,233,233,233,222, 87,175, 94,245,254,249,231,159,213,201,
+201,201, 75,240, 87,148,230, 74,177,122,245,234,182,229,124,124,147, 32,136,247, 36, 73, 70,180,108,217, 50,213, 13,104, 56,227,
+187,206,183,103,119,113, 21, 44, 88,113,172, 92, 30, 22,151,139,223, 39, 22,245,213,101,133, 86,210,221, 27, 16,154,154,136,249,
+ 38, 38, 81, 0,162, 1, 68,209, 52, 29,157,144,144, 16,215, 8,104,217,209,130,241,219, 81, 9,213,162, 26, 98, 11,169,169,169,
+ 48, 51, 51, 51,246,244,244,204, 32, 8, 98,237,253,251,247,191,245,132,188, 14,107,151,206,230, 72, 62, 68,225,227,235, 39, 88,
+ 52,210,131,191, 96,247,159, 63, 41,213,218,139,149,157, 68, 16, 12,198,207,161,148, 31,138,146,241,174, 22,139,197,158, 0, 96,
+101,101,197, 5,112,111,251, 51,124,183,176, 11,241, 53,177,221, 56, 76, 38,115,239,177, 99,199,166,126,255,253,247, 69,169, 35,
+ 30, 61,130, 80, 40,196,250,245,235,235, 46, 94,188,216,159, 36,201,249, 21,121,178,186,246, 24, 88,111,231,182,159,154, 20,230,
+230,171, 14,238, 61,247,194,177,153, 59, 99,150,239, 98,147,157, 26,149,189, 78,167,251,222,224,217, 50,192, 0, 3, 12, 48,160,
+ 58,222,172, 42,133,150,155, 53,142,183,110,230, 58,106, 76,127, 15, 94,243,102, 77,193,225,253, 21,186,165, 77,219,182,104,211,
+182, 45,195, 79, 90,216,251,249,139,176,222, 23,130,158,170,228,218,228,115,111,114, 48, 81, 95,171, 74,146,210,110, 28,108,215,
+ 67,150,151,101, 4, 0, 2,115, 91,229,202, 43, 31,239,118,233,210, 5,206,206,206,156,224,224,224, 41, 85, 8,173,149,241,241,
+241, 60, 38,179,242,120,168,142,142,142, 24, 49, 98, 4,220,221,221,185,221,187,119, 95, 89,145,208, 50, 50, 50,202, 34, 8,194,
+ 22, 0, 44, 45, 45,117,107,215,174,141,160,139, 0, 0, 52, 77,211, 79, 24, 12,198, 83,138,162,158,253,249,231,159,105, 77, 0,
+219,190,109,220, 31,206, 30, 63,130, 79, 95,216, 81,161, 72, 80, 22, 20,148,251, 57, 95, 40,200, 54, 22, 8,162,120,124,163,104,
+ 20,229,242,138,118,118,118,142,107, 2, 56,183,119,119, 9,218,183,112,172,201,209,233, 63, 85, 89,150,173, 91,183,118,107,209,
+162,133,145, 78,167,131, 76, 38,195,254,253,251,205,140,141,141,205,250,245,235,183,166,108, 3,104, 12, 52, 31,238,200,156,190,
+ 46, 93, 55,167, 6, 13,201,188,107,167,182, 31, 70, 12,236,103,218,182, 99, 87,188,189,119, 2,185,185,133,200,207,147,130,162,
+168, 47,226,250,204,185,129,204,189, 3,176,117,223,138,177,203, 9, 6,131,104, 57,116, 25, 6,217,231,207, 59,112,224, 64, 44,
+ 0, 54,151,203, 45,219, 14, 29,141,157,154,109,109,216,167, 43,246,175, 26, 15,154,162,104, 0, 91,171,225,205,178, 53, 49, 49,
+249, 35, 40, 40,168, 67,187,118,237,240,244,233, 83, 36, 38, 38, 98,246,236,217,234, 57,115,230,112, 38, 76,152, 64, 44, 90,180,
+104,238,207, 63,255,124, 1,192,227, 47,110, 4, 22,107,220,224, 97,163,185,210,188, 2,165, 90,165, 81, 91, 90,155, 83, 42,153,
+ 82,158, 35, 41, 80,142, 30, 59, 77, 29, 27,254,108, 28,128, 47,132,214, 87,150,167, 1, 6, 24, 96,128, 1,122,128,166,233,118,
+ 0,108, 0,100, 19, 4,241,162,236,126,241, 33, 37,217, 90, 62,223,207, 65,209,168,148, 85, 25,186, 28, 20, 77,247,177, 1,160,
+ 3,240,156, 32, 8,201, 87,154, 88,249, 42,195,192,192, 64,186,236,223, 50, 66,139,166,105,154,214,138,223,211,170, 55, 55,104,
+249,139,195, 95,108,138,216,139,116,198,243,115,244,179, 83, 63,210,110,214,149,103, 97,255,206, 29,218,177, 45, 64,207,106, 7,
+122,126,119,115,229,243,231,207,131, 41,138, 10,244,235, 10,154,126,117,138,166, 95,157,162, 23,118, 2,125,225,194,133,155,254,
+254,254,129, 1, 1, 1,129, 0,170,154,167,148, 89,248, 34,148,126,102, 11,186, 34,196,199,199,211, 7, 14, 28,160, 87,172, 88,
+ 65, 31, 61,122,148, 70, 21, 17,212,189,189,189,239,199,196,196,208, 19, 38, 76,136, 64, 37,129, 1, 27, 3,130,113,117,237, 95,
+171,206,238,208,168,191,111, 78, 75,186, 25,149,123,253, 14, 14, 14,159,216,179,217,213,158,222,211,222,149, 62,222,187,205, 71,
+154,166,111,210, 52,189,153,166,233,209, 52, 77,187, 3, 64,107,192,116,176,131,213, 59,229,185,157, 10,245,244,142, 85,230,189,
+107,221,186,181,219,146, 37, 75,114,213,106, 53,157,148,148, 68, 31, 60,120,144,190,125,251, 54,125,229,202, 21,218,195,195, 35,
+189,140,189,118,147,221,235,100,170,143,172, 83,213,164, 21,177,153,204, 61, 47,110, 95,160,223, 61, 60, 79, 63, 63,227, 79,159,
+252, 97, 12, 61,119,112, 7,141,169, 49, 79, 9,160, 71, 69,231,205,233,130,134,238,117,109,222, 36, 39, 39,211, 26,141,134,158,
+ 52,105, 18,237,237,237, 77,247,233,211,135,238,213,171, 23,221,179,103, 79,186, 71,143, 30,244,221,187,119,233,244,244,116,186,
+ 87,215, 54,178, 1,141,209,182, 26,166, 53,171, 83,167,206,199,164,164, 36, 90,163,209,208,193,193,193,244,137, 19, 39,232,224,
+224, 96,218,207,207,143, 6,112,124,214,172, 89, 10,137, 68, 66,123,123,123,167,161,156,168,241,117,234,212,137,139,121,147,154,
+186,125,211,225,187,191,239, 57,125,247,210,133,219,119,255,184,245,252,218,149, 91, 47,206, 61,139, 76,184, 82,167, 78,157,184,
+114,234,255,171,202,211, 0, 3, 12, 48,192,128,170,181, 72,177,208,234, 95,236,236,232, 79,211,116,175,207,246,251, 23, 11,167,
+ 47,246,253,252,252, 86,148,221, 47, 57,198,207,207,111, 5, 0,186, 83,167, 78,167,105,154,110,248, 13,204,159, 94,206, 86,181,
+ 71,171, 4,100,218,115,112, 92,251,129,173,211, 66,155, 19, 15, 42, 47, 25, 16,216, 67, 65, 8, 33,206, 72,198,235,135, 23, 43,
+ 79, 36, 81,140,235,241, 96, 3, 8,142,139,139,195,235,215,175,145,154,154, 10, 62,159,255,197,113,143, 30, 61,130,177,177, 49,
+ 28, 28, 28,244, 83,186,234, 79,251,185,168, 54,117, 32,236,228,137,156, 49, 51, 17, 28, 28,140,172,172, 44,112, 56, 28,112,185,
+ 92,144, 36, 89, 37, 31,131, 81,148,241,183,196,139, 85,222, 49,158, 0,139,103, 41,188,186,111,205,124, 23,198,147, 64,182, 34,
+229, 29,210,149, 58,253, 60,121, 66, 1,248, 2,126,134,177, 49,191,116,184, 16, 64, 52, 65, 16,111, 91, 3,108,129,208,232,234,
+111, 27, 22,217, 51,195,131,141, 20,239,162,202,229,232,213,171,215, 12, 0,107,104,154,206,107,209,162,133,221,198,141, 27, 45,
+ 68, 34, 17, 94,189,122,133,115,231,206,101,147, 69, 23, 74,208, 52,189, 14, 0, 58, 2, 70,230, 54,230,183,246,252, 56,223, 4,
+247,206,114,107,210,138,204, 26, 15,188, 54,124,194,172, 57,187,230, 15,132,172, 80,129, 83,183,195,113, 51,236,253, 32, 0,143,
+ 80,201,188,183,189,143,241, 14,200,238, 57,108,216,176,136, 7, 15, 30, 88, 31, 57,114, 4, 36, 73,150,187, 29, 57,114, 4,119,
+ 30,134,205, 3,240, 82, 79,179, 28, 93, 92, 92,238, 60,123,246,204,134,207,231,227,246,237,219,200,203,203, 43,245,100, 77,156,
+ 56,145,200,203,203,243,217,191,127,255,240, 15, 31, 62,108,123,248,240,161, 24, 69,185, 32, 63,105, 8, 76, 38,243, 61, 73,106,
+ 26, 57, 52,110,200, 26, 57,176,107, 87,169, 56, 10, 66,171, 22,120, 18,249,254,106,158, 68,172, 96, 50,153,239,203, 30,255, 45,
+202,211, 0, 3, 12, 48,192,128,234,129, 32,136, 64,154,166, 7, 16, 4, 17,248,249,103,159,255, 95,114,156,191,191,127,233,126,
+201, 57,155, 55,111,222, 84,102, 95,254,141,204,171,116, 50,124,247, 98, 5,217,189,188,131, 84,175, 46, 65,245,250, 15,112,234,
+116, 1,215,125, 16,152,117, 60,144, 18,117, 15,145, 55,182, 35, 45,246, 17,104, 74, 7, 7,183,246,250, 26,162,108,212,168, 17,
+148,202,162,169, 89, 42,149, 10, 28,129,133,114,209,244,177, 70, 0, 64,177,140, 84,101, 20,172, 94,132, 38, 93,188,208, 62,147,
+198,115,187, 34, 71, 69,251,204,162,243, 54, 76,154, 4, 14,135, 3, 14,135, 3,162,120,234,143, 62, 66,139, 40, 62,152, 42, 26,
+190, 42,207, 8, 66,206, 99,159, 58,179,198,183, 61,239, 67, 52, 87, 21,243, 4,233, 42,138,190,154,169,187,166,143,189,124, 1,
+ 95,100,204,231, 71, 27, 11, 5,165, 66,139, 32,136,247, 0, 64,179,217, 1, 39,214,249,182, 16,100, 38, 8,148, 47,130,145,161,
+164, 52, 21,208,172,187,113,227,134, 45,139,197,178,215,233,116, 72, 73, 73, 65,108,108, 44,118,238,220,153, 89, 88, 88,216, 61,
+ 60, 60,252, 77, 89,237,168, 51,230,158, 11, 88, 63,191, 30, 43, 42,196, 72,245, 62,166,218,173,199,186,217, 16,239, 65,221, 91,
+ 94,155, 49,126, 21,134,124,215, 7, 19,186, 55,161,147,210,115,149, 0,110, 23,187, 94,171,130, 40, 60, 60,188,119,183,110,221,
+ 78,182,106,213,170, 49, 77,211,104,222,188, 57,124,124,124, 16, 16, 16,128,200,200, 72, 20, 20, 20,104,130,130,130,118, 0, 56,
+166,167, 89,124, 11, 11,139,155,119,239,222,181,225,243,249, 8, 10, 10,130, 66,161,128,131,131, 3,230,204,153,195,221,188,121,
+243,239, 5, 5, 5, 35,253,253,253,141,146,146,146,246,220,186,117,171, 46,138,242,206,125,209, 8,212,106,245,161, 83, 1,199,
+119,205,241,157,235,116,247,233,171, 96,149,180,208,172, 78,157,212, 2, 27, 11,161,201,142, 45,235,106,171,213,234, 25,229,151,
+231,253, 26,149,167, 1, 6, 24, 96,128, 1, 95,160, 82, 45, 82, 86, 60,125, 46,182,170, 35,210, 0, 40,252,252,252, 86, 18, 4,
+ 17,232,231,231,183,210,223,223, 95, 1, 32,253,239, 16, 89,165, 66,107,192,128, 1, 33,129,129,129, 24, 48, 96, 64, 72,133, 20,
+148, 14,154,164, 7,208, 36, 61,128,113,167,121,248,211,127,204,103, 23, 79,213,216,186,129,235,111,223, 85,169, 84,172,227,199,
+143,151,206,219, 2, 0,157, 78,247,205,107,177, 58, 66,171, 88,232,125, 97,132, 11, 79, 24,114,104,225,200,142, 86, 58, 57, 91,
+253,232, 42, 68, 42,138,220,246, 78, 35,127,145, 71,255, 92, 17,231,149, 5, 51,144,250,240, 14,248, 66, 97,234,212, 7,209,165,
+ 94,172, 98,145,149, 8, 0,117,121, 38,193, 7,230, 15,241,176,231,128,163,190,118, 30,233, 42, 74,117,224,131,246, 88, 5,141,
+ 13, 52, 77, 35, 49, 49, 17,114,185, 28,161,161,161,184,120,241, 98,118, 57, 34, 11, 46, 60,225,253,163,203,198,117, 48, 45,252,
+200, 81,191,184,131,116, 21,165,215, 80,151,117,243, 33, 93, 56, 12, 34,136, 96, 48,141,123,118,116,195,130,105, 67,177,253,232,
+159,164,218,182,235,128, 93,127, 92, 31, 37, 85,105, 86,234, 41,178, 74,157,141,225,225,225, 77,194,195,195,121, 0,188,124,124,
+124,174, 15, 31, 62, 28, 33, 33, 33,184,122,245,170, 43,128,140,226,227,214,163, 40, 81,246,207, 0, 18, 42,114, 60,114, 56,156,
+ 51,119,238,220,105,234,232,232,136, 59,119,238, 64,161, 80, 96,214,172, 89,106, 95, 95, 95,206,196,137, 19,137,252,252,252, 82,
+ 79, 86,104,104,168,184, 34,145, 5, 0, 34,145,232,198,197,115, 39, 58,119,235,214,109,104, 61, 87,119,211,132,194,130, 44, 62,
+223,200,248, 97,200, 61,206,139,103,143,247,136, 68,162,231,229,151,103,176,222,229,105,128, 1, 6, 24, 96, 64,197,208, 75,139,
+124,230,153,170, 14,202,156,199,246,247,247,143,245,247,247,255,196,227,245,149,248,124,213,225,181,146, 62,173, 70,113,180,116,
+249, 41, 95, 94, 0, 69, 85,231, 98,191,248,204,194,194,130, 52, 54, 54,254, 68,104, 81,122,114,230, 94, 62,141,132,217, 99, 75,
+ 61, 89, 37,158, 45,244,157,248, 85, 66,139,162,168, 80, 0,159, 24,193,183,117, 27,179, 99, 96,227, 46, 77,234, 57, 49,180,231,
+118, 34, 77, 78, 42,215,196,107,148,175, 11,233, 65,113,229, 76,178, 46,229, 36,181, 48, 18, 24, 39, 27, 11, 5,159,139,172, 15,
+ 0, 32,176,115, 29,190,173,159,123,247,150,238, 13, 24,228,217, 95, 33,146,107,165,126,113, 26, 77,130,140,190, 84, 65, 25,174,
+233,211,167,207, 26, 43, 43, 43,163, 93,187,118,153,213,169, 83, 7, 36, 73,170, 63, 23, 89,124, 91,183, 49, 59,135, 52,235,226,
+102,111,193,208, 94,216,141, 84,133, 78,190, 51, 65,251,187, 62, 34,203,218, 76,120,235,192,166,217,198,124, 30, 27, 74,165, 18,
+155,247, 93, 64,208,227,152, 1, 57, 49, 87,110, 1,184,245, 21, 13,114,234,128, 1, 3,182,175, 95,191, 30, 90,173, 22, 83,166,
+ 76,193,251,247,239,131,226,227,227,119,214,174, 93,123,201,178,101,203, 28,237,237,237, 49,106,212, 40,142, 86,171,157, 88, 1,
+199,150, 83,167, 78, 13,104,217,178, 37, 66, 66, 66,144,151,151, 7, 7, 7, 7,248,250,250,114,253,253,253,127, 47, 40, 40, 24,
+185,105,211, 38,163,196,196,196, 74, 61, 89,159,180,107,157,110,195,193,237,179,151,180,235,232,193,120,247,238, 13,153,210,222,
+147,113,239,206,213, 7, 86, 86, 86,191,167,164,164,252, 85,158, 67,155, 87,187, 60, 13, 48,192, 0, 3, 12,248, 54, 32, 8,226,
+ 90,241,188,171, 79,188, 92,159,139,176, 18,143, 85,217,253,207,143, 47,254,254, 91,188, 44, 31, 42, 71,120,125, 26,222, 97,192,
+128, 1,122, 47,171,167,100,217,122,137,167,207,241,157, 59,180, 78, 66,176, 86,122, 50,192, 17, 88, 40, 7,174,191,125,183,162,
+ 99, 5, 2,129,222, 30, 45, 74,165,172,170, 82,170, 37,180,138,231,104,221,164,105,250, 19,161,101,102,231,230,185,124,217,252,
+ 29, 30,195,251, 50, 50,167,117, 66,158, 84,165, 90,246,138,164,210,228,149,139,172,162, 94, 92,155,196, 23, 8,163,141, 4,252,
+178, 34, 43, 5, 0,140,108, 27,180, 95,186, 96,206,190, 30, 99, 6, 18,217,179, 60, 32,201, 83,168,150,196,146,132, 72, 65,143,
+140, 3,238,149, 71,119,247,238,221,131, 0, 14,122,122,122,102, 10, 4, 2, 72,165,210, 47,234,160,196,222, 46,195,251, 50, 50,
+167,118, 64,174, 76,163, 90, 22, 75, 34, 93, 65,157,169, 74,100,217,152,155,220, 58,176,113, 54, 63, 61,237, 3, 56, 28, 14,132,
+ 66, 33,110, 63,138, 70, 78,236, 31, 95, 35,176,192, 96, 48,214,250,249,249,173,153, 51,103, 14,196, 98, 49,174, 94,189,138,239,
+190,251, 14,167, 79,159,174,115,253,250,245,237, 94, 94, 94, 96, 50,153, 8, 12, 12,132, 86,171,125, 91, 1,205,208,233,211,167,
+ 47, 25, 62,124, 56,158, 63,127,142,140,140,140, 79, 60, 89,121,121,121, 62,251,246,237, 27,158,148,148, 84,165, 39,235, 51,180,
+119,105,208,154,179, 98,245, 47, 80,201,179, 88,217,162,167, 33,193,183, 25, 79,114,115,115,249, 0,242,107, 90,158, 6, 24, 96,
+128, 1, 6,232,237,213,170, 72,139,100, 23,139,168,236,242,246,203, 8,172,242,246,137,207,188, 96,234,207,190,143,252, 59,175,
+ 73, 47,143, 22,203,174, 25,200,204,152, 50, 66, 43,235,147,239,141, 76, 44,245, 26, 58,212,146, 96, 29, 56, 86, 26, 71,203, 72,
+ 44, 22, 27, 89, 91, 91, 43,203, 10, 4, 62,159, 15, 71, 71, 71, 72, 36, 18, 28, 58,116, 8,168,122, 82, 52,105, 58,124, 60,218,
+143,153,130, 23,206, 92,208, 90, 77,169,103,235,192,164, 73,159,136, 45, 14,135, 83, 50, 55,172,170, 78,247, 89,177,167,233, 9,
+ 0,186,181,107,189,159,140, 4,130, 73, 70,214,181,172, 23,204,158,202, 78,202, 82,225,174,199,138,188, 11, 91,150, 11, 83,105,
+225,156, 20,228, 63,174,130, 47, 97,240,254, 19,159,123,178,210, 90,185,214, 91,101,196, 55,154,198,181,172,107,239,183,104, 54,
+ 59, 41, 83, 69,220,109,191,172,224,226,207,203,248,137, 48, 89,146,134,188,123,122, 84,207,154,239,190,251,110, 13, 77,211, 52,
+ 69, 81,171, 1,160,172,189,139,124,167,177, 19, 62, 42, 17,236,177, 74,114,113,203,114,147, 84, 84,110,175,117,243, 33, 93,236,
+ 44, 76,111, 29,216, 52,135,159, 33, 74, 6,143,199,131,137,137, 9, 82, 51,243,193,102, 49, 21, 95,217,222,120, 93,187,118, 93,
+ 62,123,246,108, 68, 71, 71, 99,214,172, 89, 25, 41, 41, 41,151,206,158, 61, 59,235,199, 31,127,100,121,123,123, 35, 35, 35, 3,
+ 91,183,110,213, 62,122,244,104, 19,128,173,229,182, 71, 22,107,234, 79, 63,253, 68,167,167,167, 19,137,137,137,112,112,112,192,
+220,185,115,185,155, 54,109, 42,157,147, 85, 29, 79, 86, 9, 68, 34, 81, 72,208,157, 39, 24,116, 99, 7, 72,173, 42, 36, 79,156,
+242,224,117,130, 36,196,146,203, 93,236,212,186,121,141,202,211, 0, 3, 12, 48,192,128,111,226,197,122, 81,217,254,127, 1,202,
+ 27, 58,212, 75,104,189,221,189,106,178,235,228, 57, 75, 97, 92,167, 11, 84,113,151, 65, 73, 51, 75, 61, 90, 70, 66, 11, 88,214,
+110,140, 60,153, 10,231,131,195, 0,224,109,117,172, 42, 44, 44, 68,155, 54,109,176,119,162, 91, 15,101,161,216,200, 24,128,138,
+103,170,188,194,237,122,247,250,245,235,114,138,162,206, 0,184, 94, 5,205,218,166, 77,155,238,249,229,151, 95,184,141,199, 76,
+134,244,233,195,207, 61, 40, 48, 54, 54, 6,143,199, 67, 84, 84, 20,238,222,189,171, 6,176,182,138, 10,125, 70,146,100,228,217,
+179,103,211, 26,214,115,234,219,166, 85,139,121, 43, 87,248,153,188,122, 24,132,213,155,246, 80, 13,219,122,231,111, 62,125,165,
+ 48, 95, 88,187,167, 34, 35, 62, 66,143, 75,141,252, 76,100,165, 55,114,169,213,163, 85,179,166, 75, 87,175, 94,101, 26,251,240,
+ 54,126,252,249, 0,237,218,178, 87,254,207, 23,255, 40,200,225,215,237,163,204,122,253, 92,159, 50, 12, 9, 9, 57, 8,224, 96,
+201,254,231,246,250,173,223, 73,185,181,235, 43,217,124,250,162,172,192,164,118,175,202,236,181,105, 60,180,179,179,141,197,173,
+221, 27,102,242, 63,138, 82,192,227,241, 32, 20, 10,145,146,145,135, 53, 59,206,201, 52, 20,213,247,107,133,150,137,137, 9, 79,
+163,209, 96,239,222,189, 72, 73, 73,233, 4, 32,229,229,203,151, 7, 70,143, 30,189,171,121,243,230,141, 98, 99, 99,223, 74,165,
+210, 57, 0, 94, 87, 68, 98,110,110,222,201,198,198,134,120,242,228, 9,102,206,156,169,158, 59,119, 46,103,194,132, 9,132, 68,
+ 34,169,169, 39, 11, 0,224,228,228,228,217,187,103, 71,116,233, 61, 43, 68,173,204,123,144,244,250,247, 16, 6,253,216,168,166,
+229,105,128, 1, 6, 24, 96,192,255, 12,106, 22, 24,220, 19, 96,185, 89, 97, 70, 83, 39,206,199,128, 45,115,233,194,132, 80, 90,
+241,252, 32, 93,112,121, 26,125,109,235, 4,250,250,238, 5,244,172,254, 77,233, 70,182,196, 71, 55, 43,204,240,252, 82,184,125,
+146,221,251, 59,119,104,123, 55, 0,221,187, 1,232,254,110,208, 2, 88,217,186,117,235, 43,190,237,255,138,163,229,219, 30, 52,
+128,153, 0,132, 21,152, 85, 94,198,112, 7, 0,135,218,180,105, 67,222,187,119,143,142, 31,217,139, 14,111,100, 77,207,153, 51,
+135,254,241,199, 31,233,177, 99,199,210, 54, 54, 54,100,113, 65, 56, 84,197, 57,104,208, 32,103, 0,168, 85,171,150,121,219,198,
+ 13, 63, 70, 5, 95,165, 31, 4,236,162,143,250, 14,163, 59, 52,111,156, 99,223,168, 91,164,177,131,123,171, 42,138,175,148,211,
+222,222,126, 5, 77,211,125,105,154,118, 0, 0, 87, 87, 43, 97,235, 70, 13,211, 35,239, 92,165, 31,158,216, 67, 31,245, 29, 70,
+119,108,209, 68,236,220,216,235,181,145,109,163,246,250,112,150,135,114,237,109,214, 40,199,104,243, 99,239, 0, 0, 32, 0, 73,
+ 68, 65, 84,174, 97,231,136, 74,236, 45,229,172,215,126,212, 31,105,233,153,244,179,103,207,232,235,215,175,211, 15, 31, 62,164,
+ 3,206,254, 65,215,110, 55, 82,106,221,124, 72,151,106, 52,157,138,236, 52,235,223,191, 63,253,246,237, 91,186, 95,191,126, 52,
+ 0,179, 26,114, 94, 73, 74, 74,162, 99, 98, 98,232,149, 43, 87,210, 0,142,207,158, 61, 91,145,159,159, 79,247,234,213, 43,165,
+ 88, 96,177,106, 98,103,125, 23,167,205, 67, 7,118, 93,235, 59,115,184,231,215,150,231, 55,132,129,211,192,105,224, 52,112,254,
+ 47,112,254,147,225, 80,236,213, 42,249,219, 90, 47,143, 86, 8, 64, 66,140,131,205,108, 53, 39, 55,109,221,189,120,239,193,227,
+ 75,151,207,155, 42,232,234,209, 27,209,119,126,195,197,192,179, 50,165, 74,189,149,195,196, 47, 49, 98,200,223, 84, 97, 69,113,
+ 28,173, 79, 16, 30, 30,206,183,108,240, 87, 12,166,119, 69,177, 89, 15, 84,243, 2, 51, 0, 76, 15, 11, 11,251,197,203,203,107,
+227,180, 46,237,135,249,118,238, 1,173, 86,139,128,128, 0, 36, 39, 39, 95, 2,176, 74, 95,143, 91,116,116,116, 78,147, 6,117,
+230,179,153,172,165,115,198, 14,181,201,126,255, 10,105,113,225, 0, 0,149, 74,161,253,248,246, 65,203,234, 24,103,108,108,252,
+204,198,198, 38,222,198,198, 70,226, 86,175,214,116, 30,216,171,103,249, 12,182, 21, 39,189, 70,106,108,209,200,168, 74, 41,215,
+164,189,189,215,168, 38,181, 91,167, 78, 29,158,128,141, 25,229,218,171, 86,106, 51,223,189,110,165, 15,143, 92,165,222,180,110,
+123, 64,159, 13, 75, 39,241, 76, 77, 77, 17, 22,243, 14,171,127, 61, 45, 83,168,181,125,115,162,175,124,147,225, 49,154,166,161,
+213,106,245, 94,232, 80, 1,150,183,108,217,210,125,227,198,141,174, 19, 39, 78,196,215,122,178,202, 34, 33, 73,228,231, 84,171,
+126,147,119,241, 97, 94,150,198,156,147, 95, 83,158, 6, 24, 96,128, 1, 6,252,207,160,127,177, 51,103,122,153,191,225, 85, 10,
+173, 18,196,100, 65, 14, 96,125, 61,166,244,192,138,141,219,215, 48,136, 29,147, 40,154,254,141,100, 96, 93,162, 24,217, 95,105,
+156,156,205, 2,217,103,200, 88, 22, 0,176, 89, 53,235, 32,139,241, 22,192,240,195,143,159,183, 59,252,248,249, 15,197,159,109,
+ 0, 80,173,177, 92, 19, 22, 98, 60,154,212,119,234,218,186,169, 17, 83,167, 64, 90,220,123,228,202,148,184, 29,155,156,199,160,
+ 25,191, 85,215,168,196,196,196,251, 0, 96,103,198,143,235,218,164, 65,237,110,109,154,242,217,132, 26,105,175,194,144,175, 80,
+ 35, 40, 54, 57, 31, 4, 81,227, 9,213,223,202,222,204,232, 63, 94,252, 9,162, 23, 65, 16,119, 86,250,142,225,173,249,245,204,
+ 55, 21, 89, 0,228, 34,145, 72, 44,151,203,173,210,211,211,213,168,121,144,184,119, 5, 5, 5,205, 23, 44, 88,176,126,201,146,
+ 37, 75,183,108,217,194,169,201,156,172,138, 32, 17, 37, 95,238,214,244,219,213,191, 1, 6, 24, 96,128, 1,255, 19,152,254,217,
+ 95,232, 45,180, 74, 5, 67, 22,178, 1,204,169, 95,159, 94,148,144, 0,245,183,178,172, 60, 79,215, 87,226, 5,128,129, 53, 62,
+155, 65, 20, 62,125,155, 44,125,246, 54, 89, 10,138,166, 41,154, 86, 49, 24, 72,149,105, 52,155,222, 38,138,106,190,234,142, 32,
+116, 47,222,165, 40, 94,190, 79, 85,210, 20, 69, 83, 52,173, 38, 8,124,212,106,169, 77,177,137,201,127,252, 55,216,155, 19,125,
+229,113, 32, 73,116,125,252, 44,102,145, 76,166,217,147, 19,119, 37,244, 27,214,139, 54, 58, 58,122, 92,167, 78,157, 38,235,116,
+186, 3, 0,180, 95,193,165, 38, 73,114,249,230,205,155, 47, 69, 71, 71,159, 11, 13, 13,205,248, 22, 34,235,111,173,127, 3, 12,
+ 48,192, 0, 3,254,173,168, 89, 82,233,138,240, 45, 69,214,127, 35, 98,222,125,104,243,119,240,198,190,251,208,236,159, 96,111,
+102,220,229,151,153,128,207,223, 84,188, 65, 58,157, 46,232, 91,138,234,155, 55,111,186,160,156,180, 58,255,109,245,111,128, 1,
+ 6, 24, 96,192,191, 22,211, 43, 18, 95, 44, 67,217, 24,240, 47, 0,253,173, 68,150, 1, 6, 24, 96,128, 1, 6,212, 0, 21,122,
+180, 8, 84,188,114,224, 78, 53,126,160, 38,171, 15,238, 24, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,159,227,252, 55,
+194, 1, 69, 19,226,175, 21,255,173, 84,124,125, 75, 24,150,190, 26, 56, 13,156, 6, 78, 3,167,129,211,192,105,224,252,183,163,
+220,137,240, 64,209,228, 97, 3, 12, 48,192, 0, 3, 12,248,187,192, 43,222,106,250,189, 1, 6,252, 19,197, 86,169,224,170,201,
+ 28,173,134,197,127,223,253,141,198,250, 58, 56, 56, 76,111,209,162, 69, 99, 14,135,195, 40, 44, 44, 92,119,239,222,189,181,159,
+ 31,212,181, 9,235, 37,147, 1,231,191, 62, 33, 0,130, 9, 48, 24,208,209, 72,123, 24,165,104,107,168,247,255,106,212, 49, 54,
+181,249,147, 96, 48,185, 58, 82, 3,157, 86,131,162,233, 86, 69,160, 40, 50, 89,167, 81,121, 87,116,178,125,203,161,181, 73, 29,
+181, 5,160,247, 2,140,217, 0,181,143, 0,107, 22, 13,114, 63, 1,230, 76, 48,233,159,161, 35,150,177,216,204, 21, 25,225, 23,
+ 82,255, 13, 5,118,254,252,121,230,215,156, 63,114,228,200,114, 19,136, 58, 58, 58, 6,242,249,252, 6, 21,157, 39,147,201, 50,
+ 50, 50, 50,188,254,229,237,177, 27,128,221, 0,154,126,246,249,107, 0,243, 1, 4,127,237, 15,120, 2, 44, 59, 96, 6, 7, 88,
+ 6, 0, 26,224,231, 76,224, 96,200,127,209, 28, 67, 27, 27,155, 7, 44, 22,203, 85, 38,147,201, 10, 11, 11,235,155,152,152, 36,
+ 8, 4, 2, 1, 73,146,111,179,179,179,187, 85,147,110, 54,254, 74,165,181, 20,192,190,106,126,111,128, 1,255, 20,124,213,170,
+ 67,183,162,231, 3, 60, 1,116,107,215,174,157,157, 76, 38,195,235,215,175, 51, 1, 60, 0, 16, 82,188,189,249, 22,150, 50, 24,
+140,109,219,183,111, 95, 60,119,238,220,210,100,208, 81, 81, 81,104,217,242,203, 24,161, 76, 6,156,239, 93,189, 99,251, 34,250,
+ 13,218,245, 26, 81, 44,180, 24,128, 44, 3, 94,189,219,215,212, 4, 19, 11, 11,139,117, 4, 65,140,100, 48, 24, 85,118,106, 20,
+ 69,233,104,154, 62, 47,145, 72,214, 0, 40,172,206, 15, 9,248, 60, 45,169,211,149,251, 27, 44, 38, 83, 39,147,171, 42, 12,123,
+ 97,105,105, 25,202, 96, 48,234,149, 77,152, 13,124,154, 64,187,162,239, 72,146, 76,203,201,201,209, 71,132, 26, 49, 88,156,249,
+ 4,193,233, 13, 6,229, 6, 16, 32,192,120, 67,233,212,183, 41, 82,179, 19,128,242,107, 68,150, 67,173,250, 15, 23,174,218,236,
+ 28, 19,247, 26, 43,125,199, 98,203,238,227, 88, 49,127, 50,118, 30, 58,141,249,211,199,160, 73,147,166,168, 44,173, 56, 5,206,
+166, 85,243, 70,246,242,223,123,206, 99,197,156,145, 60,255,189,231,187,174,244, 29,205,221,180,231, 92,215,149,190,163,120,254,
+123,206,121,172,152, 55,210,120,211,190, 11, 20,128,241, 53, 49,114,140,171,163,140, 32,201,114,223,182,105, 22, 75,117,250,109,
+186,224,255,227,142,158, 56,113, 98, 11,133, 66, 17, 54,182,119,235,205,173,220,156, 68,229, 29, 35,254, 40,114, 74,136, 15,247,
+ 99,115,140,219, 12,246, 59, 30, 85,169,203,129,199,171,247,250,245,107, 87,138,162,160,211,233, 64,146,100,233, 95,181, 90,141,
+110,221,186,125,171,133, 51, 3, 1,172, 43,186, 89,225, 15,224,220, 87,112, 9, 89, 44,214, 66, 46,151,235, 73,146,100, 99, 0,
+ 96,179,217,113, 42,149, 42,132, 36,201,237, 0,164,213,228,219, 33, 18,137,154, 8,133, 66,104, 52,154,210, 4,244, 76, 38,179,
+ 81,237,218,181,247, 42,149, 74,215,175,189,120, 59, 96, 70,103, 15,143,157, 19, 22, 47,102, 42, 30, 60,192,206, 99,199,118,160,
+160, 0, 0,246, 86,117, 46,151,203,189,197, 96, 48,234, 84,231,247, 40,138, 74, 86,171,213,222,213, 57,135,197, 98,185,166,167,
+167,219, 58, 58, 58,162,176,176, 16, 2,129, 64, 80,178, 95, 3, 79,214, 86,154,166,141,139,159,237, 59, 59,118,236,216,137, 32,
+ 8, 18, 0, 77, 81, 20,227,217,179,103, 99, 40,138, 98, 21, 63,159,182, 2, 56, 6, 64,101,232,179, 13,248,135,122,179, 14, 85,
+ 87,104, 93, 7,224,217,174, 93, 59, 99, 31, 31, 31,120,122,122,194,213,213, 21, 70, 70, 70, 69, 15,113,177,216, 46, 34, 34, 98,
+212,131, 7, 15, 70, 93,189,122, 21,175, 94,189, 82, 0,120, 4,160,220,155,186,231, 0,143,185, 70, 66,222, 46, 0,200, 78, 19,
+103,164, 37,102,237,202,200,200,216, 10,160,108,136,240,250,227,199,143, 95, 52,111,222, 60, 4, 6, 6,226,244,233,211, 80,169,
+ 84, 40, 44,172, 68,191,200,179, 32,185,187, 25, 16, 36, 1, 41, 33, 0,223, 22, 16,216,213,184,164, 44, 44, 44,214,205,159, 63,
+127, 65,147, 38, 77, 74,163,152,107,181, 90,144, 36, 9,173, 86, 11,137, 68,130, 69,139, 22, 21,117,180, 52, 13,138,162,112,227,
+198,141,185,211,167, 79,135, 68, 34, 89, 88, 30,103,199, 54,181, 94, 50, 8,134,115,137,175,134,214,233,210,158, 70,164,181, 37,
+117, 58,166, 82,169, 41, 55, 83,185,145, 17,167, 82,145,199,102,179,157, 95,253,249,167, 45,131,203, 5,173,211, 1, 20, 5,154,
+162,138,139,179,120,163,139, 62,163,117, 20,104,173, 14, 20, 73,129, 84,168,208,126,246,108,125,138,162, 51,155,107,124,122,220,
+180,197,246, 29, 58,118,100,215,173,229, 8, 82, 71,225,125, 82,154,125,216,203,167, 93,206,255,190,119,150, 90, 81, 56, 6, 64,
+141,226,108,113,249,166, 65,123,246, 31,118,126, 17, 17,131,224,123, 15,112,231,110, 8, 0,224,214,189,208, 18,193, 93,101, 85,
+129,148, 54,159, 63,101, 8,111,243,158, 51,236,249, 83,134, 50,183,236, 57,203,158, 55,121, 48,115,243,174,211,156,121,147, 7,
+ 51, 55,239, 62,205,153, 55,101, 8,211,127,231,209, 22, 0, 44, 0, 72, 42, 34,171,168,142, 8,146,228,157, 76,200,100, 2, 64,
+246,129, 3,208,102,101,193,113,205, 26, 0,192,184,250,118,122, 15,119, 88, 91, 91,191,100,179,217,206, 85, 29,167,213,106,171,
+ 20,193, 19, 39, 78,108,169, 80, 40, 94,146, 36, 73,179, 88, 44,191,177, 67,251, 92,233,219,181,165,184,236, 49, 81, 81,145, 86,
+155, 54,253, 57,228, 92, 88, 33, 61,170,141, 73, 88,224,182,137,109, 7, 44, 57, 30, 89, 73,135,204, 80,169, 84,120,251,246, 45,
+202, 38,121, 47, 3, 93, 77,223,157, 0,236,180,178,178,234, 32, 22,139,199, 1, 88, 89, 80, 80,208,130,201,100,194,210,210,114,
+165, 90,173,126,111,102,102,118, 36, 63, 63, 63,180,216,107,164,111,202,128,110,166,166,166, 1,151, 47, 95,182,104,221,186, 53,
+ 35, 39, 39, 7, 46, 46, 46,200,205,205,109,255,224,193,131, 54, 83,166, 76,153, 82, 88, 88,248,125,241,203,160,190,112,231,243,
+249,244,132, 9, 19, 8,157,238,175,203, 61,122,244, 40,188,155,145, 13,108,204,249,114,165,154,206, 15,126,107, 54,147,195,225,
+ 60, 74, 78, 78,206,175,110, 97,112,128,101, 19, 22, 47,102, 10, 63,124,128, 48, 50, 18,227, 10, 10, 88, 91,138,188, 91, 85, 10,
+ 45, 6,131, 81, 39,224,244,111,174, 92, 46, 23, 36, 73,150,138,193,146,103,148, 86,171,133, 70,163,129, 86,171,133, 78,167,131,
+ 86,163,133,255,134,159,107,252, 44,228,243,249,124, 7, 7,135, 76, 62,159,207,255, 22,189, 16,143,199, 99,253,254,251,239, 99,
+184, 92, 46, 0, 64,173, 86,163, 89,179,102,132,161,127, 54,224, 95, 38,182,190,240,114, 85, 38,180,250, 21, 20, 20, 64,167,211,
+193,196,196, 4, 76,230,167,253,190,149,149, 21,122,247,238,141,110,221,186,193,199,199, 7,175, 94,189, 50,246,241,241,233, 93,
+ 17,217,216,197, 3, 80,203,213,174,184, 51,161, 28, 30, 95,139,216,124,244,167, 11, 54, 31, 63,126, 92, 92,230,176, 41, 51,102,
+204, 32,196, 98, 49, 70,142, 28,249, 64,165, 82, 13, 2, 80, 80, 17,167,142, 66,154,151,207, 56, 80, 52, 97,188,253,217, 97, 66,
+173, 84,208, 12, 6, 67, 81, 50,116, 88,147, 82, 34, 8, 98,164,163,163, 35,206,156,249, 63,246,190, 59, 46,138,107,125,255,153,
+217,190, 44,189,131, 10, 42,136,130, 32,216, 16,108,216, 53, 17, 19,107,188,246, 36, 38,222, 36,150, 88, 18,177, 69, 99,131,196,
+ 26, 19,141,154,196, 88,174, 13,187,216, 98,197,196,174, 40, 82, 20, 20,105,194, 2, 75, 95,216, 54,187, 51,243,251, 3, 88, 1,
+217,130,201,253,221,251,189,217,231,243,217,207,238,236,204,190,123,230,156,153, 57,207,121,222,247,188,231, 32, 52,154,215,211,
+133,217,218,218, 34, 57, 57,249,149,170,198,225, 32, 44, 44,140, 67, 16,196, 56, 0,115,155,182, 73,182,188,113, 47,203,181,110,
+ 59,114,112, 32, 63,172, 43, 89,152, 95, 88,205, 2, 32,150, 44, 89,162, 39,110, 0,240,245,215, 95,155, 83, 78,144, 60, 30,100,
+241,241,175, 30,196, 92, 18, 36,159, 0,193, 3, 72,110,141, 23, 21, 44,192,210, 0,163, 3, 24, 45, 32,242,104,101, 78, 53,132,
+182,240,242,139, 91,187,113,155,189, 90,203,226,224,201,203,200,204,124, 1, 14, 73,194,199,215, 15, 67,250,245,225,117,237, 30,
+222,234,219, 21,243, 79,231,231, 60,123, 11,192,221,102, 87, 52,195,138,124,189,156,241,243, 47, 15,224,226, 96,141,113, 35,223,
+134, 88, 36,196, 55,223,255,138,213,139,102,194,207,199, 27, 59, 54,175, 49,248,115, 59, 59,187,149, 1,126,190,222,219,246,156,
+ 65,128,191, 63,103,219,222, 51, 8,232, 88,251, 30, 24,192,217,182,247, 12, 58, 6,118,228,108,219,123, 6,193,129, 29, 90,223,
+151,222, 89, 89, 90, 90, 58,211,112,125, 54,106,163, 33, 53,109,196,171, 98,244, 29, 65,214, 39,159, 0,128,158,104, 53, 7, 60,
+ 30,175,101,126,126,190,171,169,227, 76,169, 6,181, 74,214,125,157, 78,135,162,162, 34,162,188,188,156,181,183,183, 31,121,126,
+199,226,227, 67,123,135,148, 2,192,163, 71,143, 28,163,163,215,142, 60,116,191, 18,202,219, 63, 16,255, 58, 21,207, 76,122, 39,
+226,254,201,152,105, 93, 81,187, 36, 68, 99,168,213,234,204,206,157, 59,179,181,159, 91, 8,133, 66,126,163,235,205,179, 93,187,
+118,175,169,214,102,184, 20,191,187,117,235,214,204,142, 29, 59,194,223,223,255,102,143, 30, 61,108, 37, 18, 9,206,159, 63,143,
+128,128,128, 64, 91, 91,219, 59,177,177,177,188,133, 11, 23,134,236,218,181, 11, 0,102,153, 81,157,131,250,247,239,127, 48, 46,
+ 46, 78,196,231,243,161, 84, 42,145,156,156, 12, 59, 59, 59, 8, 4, 2,188,251,238,187,156, 94,189,122, 57,245,235,215,239,104,
+ 90, 90,218, 4, 52, 99, 6,148, 74,165, 98, 23, 47, 94, 12, 43, 43, 43, 88, 89, 89, 65, 34,145, 64, 34,145,192, 90, 4, 98,251,
+ 28, 47,241,236,157,229,226,185,203,183,199,236,221,182,226,106,171, 86,204, 87,185,185,185,229,205,189, 22,148,215,175,195,250,
+209, 35,160,222,189,107, 46,236, 36,142,136,138,138, 50,165, 72,129,207,231,163,103,207,158, 38,237, 57, 58, 58, 30,227,114,185,
+ 13, 70,166, 58,157, 78, 20, 21, 21, 69,167,165,165, 73, 72,146,148, 48, 12,131,168,168, 40, 90,167,211,137, 92, 93, 93,111, 50,
+ 12, 83, 88, 92, 92, 60,218,140,226,170, 1,124, 65,146,228,119, 66,161,144,219,186,117,235,236,101,203,150,221,170, 85, 51,193,
+178, 44,217,186,117,235, 80,177, 88,236,173, 86,171,117,168,113, 29, 90,212, 44, 11,154, 4,203,178, 93,107, 68, 97, 61, 52, 0,
+ 4,181,159, 75,106,122, 59, 56, 55,250, 30, 0,138,107, 7,138,110, 6,182, 75, 0,164, 0,232, 0,192,181,118,223, 61,130, 32,
+ 74,223,160,152,134, 21,173,184,184, 56,253, 16, 54, 50, 50, 82,223,177,216,216,216,224,222,189,123, 32, 8, 2, 54, 54, 54,176,
+181,181,133,157,157, 29, 42, 43, 43,145,146,146,130, 39, 79,158, 32, 43, 43, 11, 4, 65,192,199,199, 7,117, 55, 80, 61,232, 31,
+112,251, 55,196, 65,100, 45, 4, 65, 0, 93, 6, 4, 35,184,111, 16,186,223,205,152,115,255, 18,177, 83, 42,149,166, 3,224, 6,
+ 5, 5,125, 24, 22, 22,134,141, 27, 55, 66,173, 86,111, 52, 64,178,244, 54,127, 79,209,117, 3, 0, 15, 15,143, 5,251,206, 63,
+183,154, 60,204, 87, 33,149, 74,215,191, 65,229, 52,120, 16, 23, 23, 23,155,189, 22, 31,195, 48, 40, 43, 43, 51,106,179,177, 66,
+176,233,187, 31,236,229, 21,133, 88,245,205, 62,104,181, 90,204,159, 63, 31, 12,195,232, 95,229,229,229,102,149,147,165,233,215,
+181, 3,178,198,123, 74,112, 1,175,241, 53,188, 34,231,224, 15, 32, 88,128,160, 1,188,126, 94,141, 59, 33, 17,135, 47, 62,180,
+226,155, 45,246, 9, 79, 94,226,228,229, 4, 80,149,121,144, 62, 58, 94, 35, 57,246,156,128,195,106, 14,122, 4,251,226,243, 37,
+223, 58, 44,253,124,202, 33,141, 82,238,143,134,110,196, 75,166,111, 26, 26,171, 86,174,196,206, 45, 27,241,237,198, 45,168,172,
+ 40, 7,143,231, 92,251,160,167, 65,211,180,241,115,103,217, 97, 81,115,222, 39,190,249,241, 24, 66, 59,122,224,232,249,187,232,
+221,217, 27,199,127,187,143,190, 93,219,224,228,165, 4, 12,232,225,139,179,241, 73,248,124,198, 4, 98,194,133, 93,195,154,211,
+ 70,155, 55,255, 96, 47,175, 44, 68,220,154, 61, 40,218,186, 21,217, 51,103, 34,180,246,152,187, 4, 1,126,203,150, 0,223,116,
+ 27, 53, 70,106,106, 42,212,106,117, 83,163,125, 4, 4, 4,152,108,119,165, 82,249, 64,167,211,177,133,133,133, 68, 97, 97, 33,
+ 36, 18, 9,145,156,156, 68, 7, 6, 6,141, 98,159, 28,249, 9, 0,162,163,215,142, 58,252,160, 18,138,155, 91,160,188,245, 61,
+248,109, 18,201,157, 95,207,160, 62, 94,190,227, 65,189,123,180, 65, 57, 11, 10, 10,222, 42, 40, 40, 0, 0,180,109,219,246, 73,
+ 90, 90, 90,135, 58, 87,115,173, 11,145,175,211,233,252,234,220,137, 58,157, 14,106,181, 26,131, 6, 13,226, 24, 59,119, 7, 7,
+135,176,128,128, 0, 36, 36, 36, 96,203,150, 45,142,253,251,247,199,179,103,207, 64, 16, 4,214,174, 93, 75,116,236,216,145, 87,
+ 92, 92,140,161, 67,135,226,216,177, 99, 61, 43, 43, 43, 77,213,167,141, 68, 34,217,117,250,244,105, 17, 73,146,144,203,229, 96,
+ 24, 6,189,122,245, 2, 73,146, 72, 74, 74,194,146, 37, 75,112,236,216, 49,156, 56,113, 66,220,181,107,215, 93, 10,133, 34, 0,
+ 13,221,250,134,218,136, 85,169, 84,172, 80, 40,132, 80, 40,132, 72, 36,130, 72, 36,130, 64, 32, 64,149, 10,248,120, 83,182,154,
+ 35,114,102, 2, 59,247,246,125,127,246, 90,114,253,178, 15,174, 0, 56,105,238, 53, 15,212,196,100,125,247,235,175, 91, 38, 85,
+ 84,144, 0,240, 51, 65, 48, 20,203,126,107,206,253, 14, 0, 85,170, 10,120,251,180,196,209, 67, 39, 48,102,252,200, 38, 73, 22,
+143,199, 7,159,199,131,173,163,196,164, 77, 62,159,239,246,228,201, 19, 39, 30,143, 7,150,101, 65,211, 52, 40,138, 42, 92,186,
+116,169,203,240,225,195,109,206,157, 59, 71, 14, 31, 62,156,113,112,112,168,190,123,247,110,145, 78,167,115,234,211,167, 79,115,
+174,249,109,193,193,193, 93,142, 31, 63,254, 65, 84, 84,212,253, 5, 11, 22,172,170,191,115,221,186,117, 43,207,158, 61,235, 61,
+106,212,168,189,143, 30, 61,218,214,156,103,200,159,125,206, 91,108,254,247,217, 52,196, 69,106,225, 70, 16, 68, 92,189,103,118,
+100,221,118, 84, 84,212,226,232,232,232,100,130, 32,226,234,127, 95,119, 92,237, 96, 49,174,169,237,218,223, 58, 46, 90,180, 40,
+ 40, 38, 38,102,109,120,120,248,193,155, 55,111,190, 0,208, 92,162,101, 60, 70,171,238,132,234,159,100,163, 78, 13,149,149,149,
+168,172,172, 68,110,110, 46,182,111,223, 94,123, 67,243,192,229,114,193,229,114,245,241, 12,134,112, 57,238,143,239, 1,124,223,
+165, 75, 23,222,227, 91,177,231,190,220, 57,123, 96,183, 65, 93, 56, 15, 46, 63, 30,139,154,245, 8,223,154, 58,117,170, 51, 0,
+236,217,179,167, 24,192,185,255, 16,107,142, 77, 79, 79,255,220,195,195, 67, 31,163, 82,223,125,168,211,233, 32, 18,137, 80, 23,
+203,162, 82,169,176,125,251,118, 29,203,178,177, 70,108, 34, 45,249, 10,210,147,175,214,252,142, 97,192,208,175,126,191, 98,197,
+ 10,176, 44,171,239,236, 63,169, 85, 78, 76,146,188,166,234,156,109,244,222,232,123,150,166, 77,184, 39,248,179,199, 78,153,233,
+193, 16, 92,156,186,242, 16, 60, 30, 15, 76, 61, 53,147,199,169, 25, 45, 39, 63,203,135,167, 91, 32,222,153, 48,195,253,248,222,
+ 31,102,235, 40,213, 55,205,173,107,255,224,112,204,249,252,115,252,180,115, 39,150, 44, 95,169,103, 0, 58,154,134,206,100, 57,
+ 73,114, 80,175, 32,232,170,242,193,225,112, 48, 32,212, 23, 28, 14, 7,131,195,219,131,195,225, 96,104, 47,127,112,185, 92, 12,
+235,221, 17,237,218,181, 3,151,203, 37, 77,180, 59,210,146, 47, 35, 61,249, 90, 61,210,203,130, 5, 64, 73,165,175, 29,175,149,
+ 74,193,122, 57, 53,247,218,194,135, 31,126, 88,158,155,155, 75, 53,222,215,170, 85, 43,254,245,235,215,237, 13,184,237,244, 16,
+139,197, 93,185, 92,238,131,210,210, 82,198,202,202,138,100, 24,154, 9, 12, 12,226,156,223,177,248,120,221, 49,139, 22, 45, 62,
+254, 94, 87,219, 81,251, 98,227, 88,126,235,222, 4,193, 19,234, 62, 90,190,131,207,227,139,187, 2, 74,115, 6, 15,164, 90,173,
+198,211,167, 79, 97,170, 60, 44,203, 26,117,253,148,149,149, 77, 13, 8, 8,184,254,253,247,223, 59, 18, 4,129,223,127,255, 29,
+ 28, 14, 71,255,202,200,200, 0, 73,146,248,242,203, 47,169,202,202,202,233,166,202,198,229,114, 63, 63,122,244,168,157, 64, 32,
+128, 92, 46,215,223, 55, 28, 14, 7, 79,158, 60,193,250,245,235, 49,117,234, 84,228,228,228,192,211,211, 19,243,231,207,183,142,
+137,137,249,156,162,168,149,102, 52, 81,162, 70,163,233,102,101,101, 5,145, 72,132, 58,194, 5, 0,191, 37,243,146,148, 74,101,
+ 39, 39, 39,133,187, 75,124,220,169,158,253,223, 9,113,114,241, 8,151, 74,165,205, 90, 58,235, 57,176, 51,147,166,151,190,117,
+252,184,235,141,227,199,153,219,167, 79,191, 20,202,229, 59,204,190,134,180, 36,178, 51, 94,162,107,215,174,120,240,224, 1,186,
+118,237, 90,159, 52, 65, 32, 16,128,207,231,131,207,231,195,217,193,172, 16, 10,150, 36, 73,220,184,113, 3, 52, 77, 67,163,209,
+ 64,163,209,160, 99,199,142,165, 87,175, 94,181, 6,128,140,140, 12,118,242,228,201,229,119,238,220, 65,231,206,198,215, 83,119,
+115,115,187,206,225,112, 90,215,255,174,164,164,196, 97,244,232,209, 40, 43, 43,123,123,244,232,209,189,107,239,223,188, 35, 71,
+142, 76, 6, 0,129, 64, 0,146, 36,105, 88,240,183,135, 41, 46, 82,159, 40, 53, 38, 92,209,209,209,145,141,191,171, 79,170,154,
+250, 92,255,183, 49, 49, 49,107,235,217, 86,190, 65,241, 77,199,104,197,197,197,177, 77, 48, 72,179, 97,138,104,213, 33, 33, 33,
+ 65,235,233,233,249, 83,250,195,172,129,190,193, 62, 16, 75,132, 67, 0,124, 47, 20, 10,231, 77,153, 50, 5,183,111,223, 70, 82,
+ 82,210, 47,248,147,179,112,130,130,130, 46, 8,133, 66,111, 3,110,146,236,164,164,164,161, 6, 58,134,229,167, 79,159,134,177,
+ 96,248, 43, 87,174,212,239,148,234, 7,195, 55,125, 97, 48, 44,180,148, 22,213, 10,229,171, 78,188,150,104, 85, 87, 87, 99,252,
+248,241, 13, 20,173,162,162, 34,147,231, 71, 16, 4,214,159, 60,137,139,177,177,120, 59, 36, 4,199,238,222, 69,204,148,137,240,
+247,110, 1,150, 38,192, 18, 64,206,129, 31, 80, 82, 89,133,253,151,111,160, 84,174,192,164, 62,125,224,103,235,108,220, 46,143,
+ 63, 56, 52, 44,156,127,233,102, 10,120, 60, 46, 72, 48, 96,181, 10,120, 6,244, 3,135, 36, 97,231,214, 6,124, 30, 15, 60, 30,
+ 23, 25,185,197, 8, 8,234, 46,136, 19,136, 6,191, 9,209,106,229,221, 6, 52, 77, 99,234,212,169, 56,120,240, 32,156,220,189,
+ 97,215, 42, 8,171, 55,238,196,219,131,250,152, 60,255,186, 17, 60,151,203, 5,135,195,121,237,189,238,179, 57,234, 36,203,176,
+160, 26,183, 17,195, 2, 44,139,150,107,214,160,229,154, 53,184, 91,251,159, 29,171,171,161, 84, 42,129, 30,129,205, 34, 89, 26,
+141, 6,185,185,185, 84, 65, 65,129, 91, 19,251, 11, 53, 26,141, 73, 98,179,123,247,238,196,105,211,166,117,115,116,116,188,159,
+248,232,145, 54, 56, 36,132,119,110,251,226, 19,117,110, 67, 0, 8, 9, 9, 41, 93,188,120,241,137,201,227, 34, 71,110,139,250,
+ 7,253,233,202,189, 92,161, 88,220, 45,114,193,238,196, 3,227,198,153,246,247,168,213,153,193,193,193,172, 57,231,165, 80, 40,
+ 10,140,236, 30, 1,224,235, 46, 93,186,216,246,239,223, 31,215,175, 95,199,152, 49, 99,212, 20, 69,165, 3,192,240,225,195,219,
+239,223,191, 95,144,146,146, 2, 23, 23, 23, 94,118,118,246, 46,152, 8,144, 23, 8, 4,253,186,119,239, 78,170,213,234,215, 72,
+ 86, 76, 76, 12, 38, 76,152,128,246,237,219,131, 97, 24, 84, 85, 85,161,127,255,254,188, 45, 91,182,244, 51,147,104,205,241,247,
+247, 95,143,154, 89,135,245,159,133,169,168,113,107,161,164,164,164,224,225,157,203,201,125, 6,141,238,214,186, 93,144, 71, 82,
+226, 3,163, 6, 93, 93, 93, 23,145, 36,249, 30,195, 48,156,202,202,202,220,135, 26, 77,187,142,222,222,110,189, 70,142, 68, 5,
+143,199,249,238,242,101,178, 80, 46,183, 6, 96,150, 11, 82,165,173,134,183, 79, 77,168,223,152,241, 35,241,224,193, 3,140,253,
+199, 40,240,249,124,112,185,188,154,123,147, 95,163,104,217, 59,219,154,117,109,106,181, 90,253, 51,188, 46,206,139,162, 40,212,
+133,102, 89, 89, 89,233,247,169,213,106, 16, 4, 97,236,218,240, 59,188,114,153,171,216,214, 14,180, 86,139,192,145, 99,245,215,
+244,157,159,183,137,193, 48,226,242,236, 76,204,138, 61,205,131, 5, 22, 24, 80,181,140,113,145,250, 68,233,207,130, 32,136,184,
+168,168,168,197, 0,216,168,168,168,197,117,219,209,209,209, 74, 0,121,111, 72,182, 94, 83,185,184,127, 5,201,170,115, 47, 24,
+ 67,255,254,253,103,217,216,216,108,169,219,206,189,157,135,220,219,121, 8,232, 16,216,171, 75, 72,183,138, 9, 19, 38,192,201,
+201, 9, 11, 22, 44, 96, 1,252,210,220,255,207, 72, 75,182, 6,192,122,120,120, 44,168,125, 32,135,220,189,123,215,229,222,189,
+123,232,222,189,251, 43,233,158,162,208,187,119,111, 99,166,228,181, 65,237,115,255, 58,149,140, 1, 69, 81, 80, 40,148,208,104,
+ 40,232,180, 12,116, 58, 29,186, 6,218, 96,239,206,168,154,239,116,117,234, 89,141,106,214,210,221, 6, 54,214, 60, 45, 73, 18,
+202,251,137, 5, 77, 62, 49, 53, 26, 13, 18,179,179,241, 40, 43, 11, 0,240, 78,180,241,192,215,189,151,175,163, 99,199,142,166,
+ 74,235,219,210,211, 29,249, 23, 19,107, 30,222,202, 92,220,251,227, 48,108,108,172, 1, 0,129, 17,147,192,231,215, 16,173,106,
+ 37, 5,231, 14,173, 64,176,172,193,180, 0, 86, 14,238, 23,184,124,145, 55, 75, 51, 96, 89, 6, 44, 67,131,101, 25,112,120,124,
+171, 89,159,124, 0,134,161, 17, 26, 26, 10,130,195, 1,173, 85, 99,220,136,193, 40,171,144,195,201,222,188, 78,130,207,231, 35,
+ 34, 34, 66,108,104,255,179,103,207,148,245,137,153,241, 54,210,162,186, 90, 9,181, 90, 13, 74,163, 3,165,213,129,110,203,199,
+170,165, 19,161,163,116, 80,252, 35, 28,148, 86, 7,230,243, 81,160, 52, 90,228, 88,145,100,112,128,179,150, 4,161,124,152, 42,
+179, 53, 69,180,234,200,129, 33, 52, 21, 19,104,128,108, 61,154, 54,109, 90,215,224,144,144, 7,239, 13, 10,217,240, 56, 41, 57,
+255,113, 82,242,107,199,121,183, 15,201,252, 52,230,224,124, 30, 95,220, 53,114,129,241, 89,135,245, 81,223,141,248, 39,177, 88,
+ 46,151, 7, 91, 91, 91, 35, 45, 45, 13, 28, 14, 7, 4, 65, 60, 3, 16, 12, 0, 30, 30, 30,207,185, 92,174, 15,135,195,193,214,
+173, 91, 9, 46,151,219, 41, 60, 60,124,177, 74,165, 58,108,100, 64, 23, 96, 99, 99,211, 64,205,226,243,249,136,138,138,194,228,
+201,147,245, 36,139,207,231, 99,247,238,221,232,214,173, 27, 52, 26, 77,128,153,229,189, 7,160,143, 25,138, 31, 81, 75,206, 77,
+146, 81,157, 78, 55,173,228,189,247,218, 33, 62, 30,189,124,124, 58,118,237,218, 21, 20,245, 74,208,244,241,241,105, 37,151,203,
+ 11,148, 74,229,191, 80,147,218,224,161, 81, 82,164, 98,144,157, 81, 19,126,250,224,193, 3,132,134,134,234, 21,172,250,106, 22,
+159,207,135, 88, 96,221, 44,162,197, 48, 53,207, 37,185, 92, 78,198,199,199, 59,251,251,251, 19, 0,224,239,239, 79, 60,124,248,
+208,209,202,202,170,216,215,215,215,228, 0, 88,108,107,135,221,211,198, 3, 0,190, 26, 52, 76, 63, 48, 58,255,245, 98,240,120,
+ 60, 12, 92,176,248,181,235,158, 97, 24, 14, 44,176,144, 44, 51,184,200, 95, 69,178, 26, 43, 90,209,209,209,201,209,209,209,175,
+169, 99,205,132,105, 69,171,190,116,215, 92,212,221,172,134,176,113,227, 70,116,234,212,201,104, 71,180,101,203, 22,236,219,183,
+111, 35,128,140,102, 75,142, 3,187, 4, 98,211,241,100,159,246,129, 4, 0,172,252,124, 4, 89, 93, 93,141, 27, 55,110,192,206,
+206, 14,207,158,153,157,246,203,198,206,206,238,107,146, 36,199,113, 26,207, 0,104,154, 96,210, 12,195,196, 86, 84, 84, 24, 76,
+239,192,178, 0,165,213,161, 90,161,130, 70,163,193,231, 95,254, 96,178, 16,209, 0, 65,105,228,220,136,190,225, 98, 67,138, 78,
+104,167,126,248,108,138,245,107,157, 55,135, 4, 72, 18,232, 28, 90,163,184, 60,188,155, 12,134, 1,104, 6,112,118,117,192, 47,
+ 7, 54, 24, 37,249, 58,154,169, 29, 29,211,168, 82,211, 8, 8,139,196,203,212,120,189,130, 36,224,215,184,140,249, 60, 30, 24,
+150,168,201,250, 96,136, 8, 9,196,222,101,210, 12,191,157,113,143,241,113,100, 39, 28,185,148,136,177,131,130,113,245, 78, 10,
+250,247,232,136,228,244, 44, 4,250,181,198,214, 93,177, 96, 89,200,127,220,180,186,224, 85,135,166,203, 54, 71,209,186,125,251,
+182,178,177,138, 85,255,157, 53,221, 31,130,101, 95, 41, 90, 74,149, 26, 11, 22,153,149,206,167,166,141,250,132,137,205, 57,216,
+152, 98,101, 14, 17,107,172,108,193, 68,122,150,182, 0,186, 1, 11,255,147, 15, 78,154,166,113,230,204, 25,125,123, 52,213,142,
+245,219,206, 12,146,131,236,236,108, 36, 39, 39, 35, 44, 44, 12, 21, 21, 21,224,145, 36,230, 63,126,140,142, 83,166, 64,195,231,
+131, 97, 24, 8, 4, 2,204,152, 49,195,236,250,108,230,211,185, 54,152,155, 54,101,124, 67,120,120,120,187,180,234,106, 36, 63,
+121,130, 65, 43, 86, 0, 0,206,158, 61,219,224,154,152, 55,111,158, 32, 37, 37,229,195,251,247,239,127,152,159,159,191, 17,192,
+124,131,207, 89, 86,173,143,209,122,111,226, 24,180,243,111,139,125,191, 30,208,239,159,247,197, 28,240,120,124,240,248, 60,216,
+219,217,155,117, 54, 90,173, 86, 79, 90, 21, 10, 5,121,246,236,217,150,131, 7, 15,230,207,153, 51,135, 0,128,125,251,246,145,
+223,127,255,189,228,226,197,139,252, 22, 45, 90, 72, 77,146, 75,138,122,173,141, 9,130, 0,143,199, 3, 95,192, 7, 24, 6, 4,
+ 65, 72,214,173, 91,183, 50, 57, 57,185,187,191,191, 63,212,106,245, 20,212, 76,212,176,228,209,178,144, 45,163, 92,164,169, 88,
+171, 90, 85,202, 16,100,245,227,182, 12, 17,181,250, 49, 91,120,179, 73, 25,230,197,104, 53, 5, 14,135, 99, 82,173, 34, 73,210,
+164,235,112,222,188,121,176,177,177, 49,212, 1,177,143, 31, 63, 78,145, 74,165, 59, 1,252,240, 70,141,115, 57, 33,249,235,185,
+163,228,168,245,173,218,219,219, 23, 15, 24, 48,160, 10, 0,117,248,112,195, 1,178, 90,173, 54,216,129,219,217,217,125,253,243,
+207, 63,207, 30, 57,114, 36,217, 56,197, 64,125,247, 94,221, 75,171,213,226,240,225,195,179, 23, 46, 92,136,138,138,138,185,198,
+ 58,113, 69,181, 18,202,218, 64,232,231, 73, 71,204,125,168, 27,220,101,109,239,129,150,109,131, 13,118, 38, 36,191, 38,134,200,
+205,235, 85, 7,102, 99, 35, 2,109,196, 38, 65,144, 25, 89, 57,249, 45, 90,185, 59,226,121,174, 12,110,173, 59,161, 44,239, 85,
+ 61,112,185, 28,240,106, 93,135,246,182, 18,200,138,138, 64,146, 28,163,196,120,245,254, 4,220, 73,202,194,209, 75, 15, 65,169,
+170,177,105,207,121, 80,234, 42, 80,170,106, 80,170,154,247,181, 11, 63, 2, 65,160, 64,171,174,110,223,156,118,231,114,185,232,
+209,163,135, 65,162,147,151,151,103,166,162,197,234, 21, 45,165,170,153,109,100,222,200,201,168, 98, 85,183,255, 77,137, 65, 93,
+202, 7,177, 88,220,109,247,110,195,105, 28,154,130,187,187,251, 57,107,107,235, 54,230, 30,223,140,228,165,107,237,237,237,191,
+246,247,247, 15,216,180,105, 19,143,195,225, 96,224,192,129,237,221,221,221,179, 1, 32, 48, 48,208,179,238, 25,243,233,167,159,
+178,183,111,223, 78,170, 25, 99, 24,134, 64, 32,120, 98,103,103,215,173,127,255,254,168,168,168, 64,110,110, 46, 36, 18, 9, 58,
+110,216,128,199,159,126,138,144,237,219, 65, 14, 24, 0,130, 32, 32, 16, 8,240,248,241, 99,136,197,226, 39, 42,149,193,148,111,
+ 61, 0,124, 11,160, 23, 94,185, 11, 89, 0, 55, 80,147,118,225, 78, 19,207, 59, 18, 0,104,134, 49,213, 88, 19, 23, 44, 88,128,
+114, 30, 15, 24, 62, 28,252,140, 12, 80, 20,133,176,176, 48,189,202, 30, 22, 22, 6, 46,151,139,224,224, 96,120,122,122, 98,235,
+214,173, 19,141, 17, 45, 85, 21,133,236,140,151, 8, 15, 15,215, 43, 87,195,135, 15,215, 43, 90, 60, 30, 79,175,108, 17,180,105,
+226, 74, 16, 4, 91,127,144, 76,211, 52,193,229,114,185,115,231,206, 37,198,140, 25,195,106, 52, 26, 70, 32, 16,144, 71,143, 30,
+ 37,174, 94,189,202,173,174,174, 54, 57, 16, 15, 26, 53, 14, 95, 13,126,171,230,222,111,227, 2, 30,159, 7, 1,159,143, 5, 79,
+ 94,234,219,197,118,247, 65, 65, 76, 76,204, 88,127,127,255, 26, 55, 60,192,181,228,209,178,192,132,208, 35,107, 68,146, 52,245,
+182,101, 0,136,218,109, 89, 61, 66, 37, 35, 8,226, 30,203,178,221, 27, 29, 91,183, 95,211,232,189,110,255,163, 55, 40,126,221,
+ 90,135,175,145, 47, 99, 35,226,244, 91,183,110,249,117,237,218, 21, 57, 57, 57,175,205,132,171,235,184, 36, 18, 9,196, 98, 49,
+110,222,188, 9, 0,233,134,140, 93,189,122,245,123,212,100, 93,174, 41,145,135, 71,120,255,247,250,221, 12, 29,214, 29,251,163,
+ 15, 84, 72,165,210, 96,188,202,161, 67,120,122,122, 78,230, 9,184,227,125,130,188, 34,192, 48,223, 94, 62,125, 99,133,177, 51,
+244,105, 31, 88, 5, 64, 89, 55,235,240, 13,103, 31,130, 36,201,113, 35, 71,142, 36, 83, 82, 82, 48,126,252,120,236,219,183,207,
+224,177,147, 39, 79,198,193,131, 7, 49,114,228, 72,114,209,162, 69, 6,211, 59, 52, 84, 75, 52,127,217, 69,153,246,236, 17,246,
+ 30,252,217, 96, 12,146,171,107, 77, 60, 86, 81, 81,177,254,187,238, 93,141,123, 70, 24,157,230, 98,194,253,187,225, 61,251, 14,
+228,231, 22,150,131,209,169,161,146,191,250,189,162,188, 16,172, 78, 5,190,149, 35,220,157,237,240,224,214,111, 26, 74,163,186,
+104,204,230,236,145,129,248,116, 68, 0,192, 50, 24, 53,255, 23,196,253, 48, 75, 63,130,238, 61,102, 14, 46, 31,254,206,236, 24,
+191,198,224,241,120,120,252,248,177,210,144,154,197,225,112,204,201,201, 85,171, 58,106,161, 80, 40,161, 80,170,254,202,103,135,
+139,155,155,219,143, 14, 14, 14, 34, 3, 68,202,197,197,197,229, 71, 39, 39, 39,145,185,174, 67, 67, 36,171, 54,175,214,253,105,
+211,166, 53,139,108, 9,133,194, 54,233,233,233,250,100,165,198,222, 53, 26, 13,250,247,239,111,110,242,210,211, 0, 94,120,120,
+120,220,232,216,177,163,221,243,231,207,113,224,192, 1, 62,143,199,243,170,123,126,200,229,114,112, 56, 28, 20, 21, 21,105, 1,
+124, 0, 19,174, 51,181, 90, 29, 31, 31, 31,223,121,196,136, 17,156, 39, 79,158,128,195,225,212,148, 43, 60, 28, 33,219,183, 35,
+105,238, 92, 68,100,101, 65, 69, 81, 16,137, 68,184,112,225, 2,165, 80, 40,226, 13,217, 19,139,197, 59, 51, 51, 51, 3, 69, 34,
+ 17, 40,138, 2,195, 48, 32, 73,146,224,114,185,189,237,237,237,183, 0,232,222,168,177, 92, 67,186,247,239, 64,235,116,180, 52,
+231,185,204, 84, 5,148,148,148,224,244,233,211, 8, 11, 11, 67, 68, 68, 4,242,242,242,144,145,145,129,183,223,126, 91,127,204,
+163, 71,143,144,144,144, 0, 95, 95, 95,211,138, 30,169,133,111,135, 54,224,243,249, 53, 10, 17,143, 95, 59,240,225,233,149, 44,
+ 62,143, 15, 30,151, 7,145, 88,100,182,162, 69, 16, 4, 72,146, 4, 65, 16, 16,139,197,117,131,108,166,101,203,150,210,210,210,
+ 82, 15, 0, 13, 3, 10, 12, 0, 0, 32, 0, 73, 68, 65, 84, 28,177, 88, 12,154,166,205, 26,180,212,245, 17,117, 36,139, 47,224,
+235,149, 45, 0, 40, 47, 47, 87,141, 28, 57,242, 95,106,181,250,125,188,217, 10, 37, 22,252,205, 64, 16,196,189,255,196,111,155,
+129,225,181,196,234,181,160,120, 99, 23,248,219, 61,123,246,220, 62, 97,194,132,129,155, 55,111,134,181,181, 53,164, 82,169,190,
+ 67, 20, 8, 4,104,213,170, 21, 74, 75, 75,177, 99,199, 14,188,124,249,242, 10,128, 25,230,150, 72, 42,149,222,126,246, 48,189,
+164,255,216,158, 78,129, 61, 59,216,231,166,191, 12,147, 74,165, 55,107, 73,214, 47, 19,230,189,253,126,255,209,161,224, 11,120,
+200,125, 86,128,203,167,111,252,127,105, 76, 14,135,195, 33, 8, 2,227,199,143, 55,235,248,127,252,227, 31,136,143,143,135, 49,
+ 55, 35, 83,167,104, 41, 84,168, 86,254,117,131,181,207,102, 77,198,103,179, 38,235,201,132, 57,174, 23, 0,240,244, 60,100,132,
+104, 81,155,227, 14,237,248,184, 75,104,184,119,183,192, 54,184,115,255, 33,246,111,127, 37, 50,236,250,126, 37,190,217,117, 5,
+173,220, 28, 64,169,171,113,238,200, 79, 5,148, 90,177,249, 13, 69,185, 26,114, 75, 16, 96, 89,166, 89,231, 94, 71,158,120, 60,
+ 30,130,130,130, 12, 42, 90,165,165,165, 74, 83, 29,131,190,141, 52, 90, 84, 85, 43,161, 84,252,101, 68, 43,164,119,239,222, 23,
+ 99, 99, 99,157, 92, 93, 93,145,159,159,223,152,104,133,244,234,213,235, 98,108,108,172,147,155,155, 27,114,115,115,205, 78, 43,
+210, 4,201,130, 76, 38, 35,202,202,202, 24, 7, 7,135,102,145, 45,146, 36,161, 86,171,145,154,154,106,238,223,154, 61, 67,204,
+206,206,110,247,193,131, 7,237,138,139,139,193,225,112,144,154,154,218, 96,214, 97,221,235,151, 95,126,225,143, 26, 53,234,231,
+242,242,114,163,211,218,116, 58,221,198,201,147, 39,127,152,151,151,231,224,234,234, 10,169, 84, 10,129, 64, 0,150,101, 65,244,
+239,143, 62, 47, 94,128,162,105,136,197, 98,164,165,165, 97,231,206,157,213,181,169, 98,154, 20,200, 8,130,240,227,243,249,152,
+ 52,105, 82,131, 29,123,246,236,193, 59,221, 56,221, 92,236,184, 85, 58,136,212,133,226,183,206,113, 56, 28, 34,164,199,128,246,
+ 61,250, 14, 15,122,154,116,231,185,172,240,165,169,135,146, 86,163,209,192,223,223, 31,247,238,221,195,165, 75,151, 48, 96,192,
+ 0, 68, 68, 68, 32, 49, 49, 17,191,253,246, 27, 18, 18, 18, 64, 16, 4,156,156,156,234,194, 47,140,198, 96,104, 20, 58, 20,229,
+151,188,166, 94, 53,222,230,243,249, 80, 43, 41,179,218,232,201,147, 39,184,119,239,158, 62,181, 12,135,195,209, 77,153, 50, 5,
+ 44,203,178,153,153,153,176,177,177, 97,167, 77,155, 70,115,185, 92, 93, 94,158,121,241,193,117,164,170,142,100,113,249,188, 6,
+ 4,141, 97, 24,121, 98, 98,226,199, 0, 18,107,149, 44,192,146, 71,203,130,255,219, 56,131,215, 23,150, 54,169,104,189, 0, 48,
+232,192,129, 3, 19, 79,156, 56,177,113,203,150, 45, 46,145,145,145, 40, 43, 43,131,183,183, 55, 60, 60, 60, 16, 23, 23,135,179,
+103,207, 22,211, 52, 61, 31, 64, 83,210,207, 32, 24,201, 89,147,247, 92, 26,171,174,170,250,180,107, 68, 0,174, 28,254, 61,218,
+221,221,125, 6,135,195,249,124,218,226,119,223,239, 55,178, 59,210, 18, 50,113,251,183,199, 40,204, 41, 54,105,179,113, 48,188,
+189,189,253,135, 86, 86, 86, 2, 0, 84, 19,163,226,198,179, 14,245, 54,105,154,166, 53, 26, 13, 14, 29, 58,100, 22,217, 58,112,
+224, 0, 84, 42, 21,232,215,253,171,122,155, 44,195, 18, 92,158, 16,158,173,252, 65, 81,213, 96,152, 55,158, 80,169,183, 89, 55,
+ 2,125, 46, 16,192,181,184, 24,119,238,220, 49,143,114, 15, 31,110,170,141, 84, 26,149,124,210,119,107, 22,196,205,140,250,214,
+126, 64,207,206,248,106,195, 30, 80,212, 46,144, 28, 18, 98, 33, 31, 93, 67,123,129, 3, 53,126,140,249,162, 92, 81, 89, 54, 9,
+175, 47,197,211,192, 38,107,204,195,194, 2, 52,195,224,210,245,187,102,159,187,190,183,167,105,112,185, 92, 60,123,246, 76,217,
+212,108, 67, 14,167,198,205, 89, 55, 82, 55,102,147,101, 24,130,199, 23,161,149,119, 71,104,212, 85,127, 73, 27,185,186,186,126,
+113,252,248,113,167,186, 84, 9,137,137,137, 32, 8, 34,245,149,226, 88,179, 95,169, 84, 34, 41, 41, 9,137,137,137, 64,205, 12,
+ 55,179,239,163, 58, 37, 75, 38,147, 17, 82,169, 20, 86, 86, 86,100, 98, 98,162, 58, 56, 56,248,190,137,251, 91,111, 83,165, 82,
+101, 25,138,159, 84,169, 84, 45, 68, 34, 17,175, 81, 39,234,217,174, 93,187,180, 38, 92,136,175,149,179,162,162,226,206,194,133,
+ 11,187, 14, 27, 54, 12, 95,124,241, 69,169,131,131,131,205,143, 63,254,200,229,112, 56,196,204,153, 51,233,162,162,162,170,159,
+126,250,201,238,196,137, 19, 40, 47, 47,191,105,198,185,203, 85, 42,213,199, 61,123,246,220,115,254,252,121, 43, 63, 63, 63, 84,
+ 86, 86,130,101, 89,236,222,189, 27, 51,103,206,132, 72, 36, 66, 90, 90, 26,222,121,231, 29,133, 66,161,248, 24,175,199, 78,214,
+217, 36, 8,130, 96, 25,134,193,178,101,203,244,201, 73,235,146,149,218,136, 9,236,156,215, 86, 50,231,167, 10,201,196,175,126,
+154, 2, 0,180, 78, 71, 63, 77,186,243,124,247, 15, 95, 93,229,243,249,215, 77,180,209,146, 57,115,230,252, 56,124,248,112,177,
+181,181, 53, 74, 75, 75,113,227,198, 13,220,186,117, 11,183,111,223,134, 70,163,129,147,147, 19, 28, 28, 28, 32,149, 74,241,228,
+201, 19, 37,128, 37,198,108, 10,172,120,240,105, 95, 55,243,183, 70,193,226,213,155,109, 88, 95,221,226,243,120,102,221, 71,125,
+251,246, 69,143, 30, 61,234, 8, 16,157,157,157, 45, 85,171,213, 68, 61,210,159, 87, 71,200,189,188,188,116,251,246,237, 99,141,
+217,188,189,115, 43,206,175, 90, 2, 1,159,143,249,169,185,122,210,181,103, 64, 23,240, 4,124, 4,140, 24, 83,255,183,219, 80,
+227, 46, 68, 35,146,101,172,239,248,211,247,166,197,230,127,173,205,255,203,144,226, 13,150,224,169,195,126,149, 74,117,238,163,
+143, 62,138, 9, 9, 9,249,104,211,166, 77, 4,159,207,199,138, 21, 43,216,252,252,252, 95,107, 71, 33,101,111, 82, 42,150,101,
+127,189,118,236,230, 39, 83,163, 70, 18,243, 54, 79,235,125,255,114,210,147, 78, 61,253,208,169,167, 31,238, 95, 73,193, 15,139,
+ 15,236,163,181,244,178,130,130,130, 28, 19,166,212,131,122,117,104, 28, 12,239, 20,127,245,178, 83,115,103, 29, 50, 12, 19,123,
+224,192,129,217,163, 71,143, 38,239,222,189,251, 90, 76, 86,221,178, 59, 12,195,224,226,197,139,160, 40, 10,191,254,250, 43,195,
+ 48,140,225, 60, 90, 96, 79,126,183, 57,102,234,175,123, 79, 10, 4,124, 2,183,174, 31, 69, 69,153,241, 89, 93,124, 62, 15,191,
+236, 62, 70,241,249,188,167, 77,237,167, 40, 42,247,242,229,203,110, 67,105,154, 71,146,100, 83, 4,170, 73,196,198,198,106, 25,
+134,201, 54,113,216,205,194,151, 57, 35, 86,127,241,193,129,225,239,125,228,214,179,103,111,158,179,171, 27, 8,130, 64, 81, 97,
+ 17,210,146,238,106,207, 29,253,185,176, 90, 97,222, 18, 60, 31,172,191,166,143,201, 2,128,200,153, 91,244,241, 89, 0, 48, 98,
+218, 66,244, 15, 11, 4, 97,142,244,244,138,100, 49, 58,157, 14, 18,137, 4, 58,157,174,201, 20, 15,118,118,118, 98,149, 74,165,
+172, 77,196,104, 84, 42, 98,129,191,188,141,104,154, 14, 40, 43, 43, 67,117,117, 53,110,221,186,197,174, 89,179, 70, 38,147,201,
+244, 65,155, 90,173, 54,160,180,180, 20, 85, 85, 85,184,121,243, 38, 27, 19, 19, 35, 43, 41, 41, 89,220,156,123, 72, 44, 22,119,
+227,114,185,247,203,202,202, 24, 43, 43, 43, 82,171,213,106,131,131,131,133, 98,177,216,236, 5,213,165, 82,233, 48, 67,251,124,
+124,124,210,211,211,211,219,209, 52, 93,127, 13, 68,190, 74,165,242,235,217,179,167, 57,207,143, 57,187,118,237,194,177, 99,199,
+ 66, 43, 43, 43, 39,103,103,103,239, 1, 16,202,229,114,241,240,225,195, 84,149, 74, 53, 97,244,232,209,187,203,202,202,238,160,
+102, 9, 30,115,112, 62, 45, 45,109, 82, 64, 64,192,174,175,191,254,218, 58, 34, 34,130,235,233,233,137,238,221,187, 35, 45, 45,
+ 13,103,206,156,209,110,219,182,173, 90,161, 80,124, 0,224,162,241,102, 7,161,211,233, 32, 16, 8,244, 47,161, 80, 8, 62,159,
+ 15,185,146,197,244, 13, 25, 74, 29,196,202,141, 43, 62, 62,195, 2, 68, 65,110, 70,113, 81, 65,238, 29,130, 32,174, 75,165,210,
+ 10, 3,117, 38, 80,169, 84,157, 89,150,229, 16, 4,177,153,162,168,105,179,102,205,242, 88,187,118, 45, 58,116,232,128,226,226,
+ 98, 72, 36, 18,248,249,249, 65, 38,147,225,238,221,187,180, 66,161,216, 14, 96, 37,106,227, 71, 12,161,188,184, 18, 45,221,189,
+ 26, 40,159, 44,203,130,165, 1,173,154, 6, 77,177,208, 16, 90,240,120, 90,240,249,124,115,148, 39,150, 97, 24,148,121,120,128,
+ 73, 74,194,237,219,183,193,178,172, 65, 85,205,223,223,223,140, 7, 59, 3,129, 80,208,192, 93, 72, 16, 4,248, 2, 1,120, 2,
+126, 83, 51,103, 44, 42,150, 5,255,211, 48,215, 55, 94, 14, 96,198,163, 71,143,246,244,235,215, 47,142,101, 89, 30,106,252,145,
+191,255,153, 63, 47, 40, 40,120,112,243,204,131, 69,110, 45, 29, 98,222,154,220, 27, 29, 58,123,131,214,209,184,113,246, 33,126,
+ 93,123,226, 96, 94,110,222, 52,152,177,246, 25,195, 48, 87,123,117,235, 64,162, 94,174,110, 79, 79, 79,230, 77,102, 29, 86, 84,
+ 84, 44,159, 63,127, 62,190,248,226,139, 55,153,117,216, 36, 30, 63,145,205, 32,192,182, 28,241, 86,159,161, 32, 72, 86,163, 81,
+ 27,121,240, 65,159,185,148,207,231, 61,189,151, 40, 13,110,234, 56,153, 76, 54,244,253,247,223,191,200,229,114,219, 52,167,206,
+ 25,134,201, 46, 44, 44, 28,104,250, 72,221, 13,181,178,210,239,244,193, 29,115,207, 31,219, 53,148, 97,104, 95, 2, 0,135,203,
+127,174,165,168, 11,106,101,229, 38,152,185,168,244,186, 25,225,152,243,221,111,216,250,197, 8,204,138, 57,140,159,151, 77,199,
+162, 13, 7,240,237, 23,115,176,102,203,191,240,213,156, 73, 24, 59,241,125,134, 37,200, 63,204, 61, 15, 14,135,115,126,199,142,
+ 29, 83,167, 79,159,174,159,180,192,178,108,131, 7,187, 86,171, 85, 50, 12,131,237,219,183, 51, 0,206, 27,179,215,176,141, 8,
+214, 88,188,148,185,109, 84, 89, 89,249, 65,120,120,248,110, 0, 66,150,101,159,149,149,149,253, 19,120,181, 52, 84, 85, 85,213,
+ 7, 61,123,246,220,205,178,172,144, 32,136,215,246,155,131,218, 84, 15,221, 28, 28, 28,238,215, 42, 89,194, 55, 9,136, 55, 86,
+213, 70,220,138,230,184, 16, 25, 0,179,234,101,124, 95, 27, 26, 26, 90,127, 81,233,212,178,178,178,110,111, 80,174,139, 74,165,
+ 50,112,217,178,101,115, 69, 34, 81,127,133, 66,209, 30, 0, 36, 18, 73,154, 90,173,190,170, 84, 42, 55,193,116,110, 42, 13,195,
+ 48,105, 58,157, 46,200,197,197,165,102, 70,109, 45,217, 2,128, 83,247,233,251, 0,221,189, 70, 20,223,111,118,193,206,158, 61,
+219,218,193,193, 97, 8, 65, 16, 99, 89,150,245,151,203,229,234,101,203,150,221,140,141,141,173,104,211,166,205, 91,195,135, 15,
+ 39, 28, 29, 29,113,239,222, 61,182,164,164,228, 40,128,197, 48, 99,166, 53,195, 48,217,235,214,173, 67,115,239,119, 99,251, 41,
+138, 42, 56,123,246,172,243,176,162, 34, 46,195, 48, 24, 49, 98, 68, 3, 2,215, 24, 79,159, 62,133, 90,173, 54,154,204, 81, 93,
+ 81,134, 1,115, 23, 2,181,179, 63,235, 80,163,100,177, 96, 53, 22, 94,101,193,223, 11,255,238, 5, 61,205,146, 22, 61, 60, 60,
+198,139, 36,194,207,188,219,123, 4,231,103, 20,165,200, 43, 20,251,164, 82,233, 14, 3, 15,114,179,108, 54, 51, 97,169, 69,254,
+253, 55,217,124,149, 71,139, 6,203,210, 96, 25, 22, 44,203,128, 97,232,154, 5,175, 89, 6, 44, 77, 19, 4,129, 63, 52, 74,163,
+153,193, 27,151,211,193,217,217,121, 37,203,178,195, 56, 28, 14, 89, 95, 12,171,255,185, 86,201, 58, 47,147,201,190,106, 66,121,
+253, 63, 87,159,177,177,177, 77,146,127,115,103, 29,142, 27, 55,142,110,230,189,121, 85, 34,145,120, 52,181,175,186,186, 58, 71,
+ 42,149, 14,249, 47,169,207,250, 51, 6,155, 99,179,217,179, 14, 77,217,244,246,246, 22, 82, 20,213, 5,128, 31, 65, 16,246, 0,
+ 74, 41,138,186, 80, 92, 92, 92, 8,160, 27,128,101,181,191, 89, 5,224,254,127,248,126, 23, 59, 59, 59,239, 34, 73,178,165, 57,
+ 63,214,233,116,154,210,210,210,169,141, 6, 4,122,155, 78, 78, 78,247,185, 92,110, 75, 51,236,188, 44, 41, 41,233,102,121,126,
+ 90,108,254, 15,161,113, 16,188,193, 76,241,255, 14,162,101,177,105,177,105,177,105,177,105,177,105,177,105,177,105,177,249,191,
+ 78,180,154,220,182, 76,171,181,192, 2, 11, 44,176,192, 2, 11, 44,248,115, 56,211,136,108,157,169,251, 64, 24, 97,165,205,145,
+ 4,223,132,217, 94,178,216,180,216,180,216,180,216,180,216,180,216,180,216,252,219,217,180,224, 47,132, 69, 86,181,216,180,216,
+180,216,180,216,180,216,180,216,180,216,252, 95,135, 65,215, 33,105,169, 27, 11, 44,176,192, 2, 11, 44,176,192,130,127, 15,204,
+ 38, 90, 18, 55,255, 0,103,239,224,221, 14, 45, 59, 37, 58,180,236,148,232,236, 29,188, 91,226,230, 31,240, 55,173, 55, 49,128,
+137, 92, 46,247,162,187,187,123, 37, 12, 44,189,243, 63, 0, 91, 0, 99, 81,147,223,103, 20, 0,171,191,210,120, 4,192, 29, 15,
+124, 54, 5,200,153, 2,228,140, 7, 62,139,248, 31,140, 27, 92, 49,219, 35,252,250,185,137,231, 86,204,246, 8,111,114,255,124,
+ 15,167,219,191,141,251,110,237,103,158,142,127,209, 95,218,184,186,186,238,116,115,115,203,114,117,117,205,118,117,117,221, 5,
+192,206,242,184,179,192, 2, 11, 44,248,183,161, 46, 70,171,238,165,143,209,226, 2, 64, 92, 92, 92, 4,128,107, 0,250, 69, 70,
+ 70,198, 55,254,181,131, 87,208,116,223,182,190, 95,172, 94,177,152,112,119,117,182,210,209, 12,149,153,149,219,113,249,234,152,
+ 35,249, 2,238,198,178,156,164,159,223,160, 80, 4,135,195, 25, 47, 20, 10, 35, 1,212, 17,182, 84,181, 90, 29, 71,211,244, 33,
+152, 55, 77, 27,110,110,110,215, 57, 28, 78,235,230,252, 49, 77,211, 57,133,133,133,189,223,176, 50,199,121,121,121,237,138,136,
+136,176, 10, 13, 13,133, 64, 32,192,178,101,203,230, 75,165,210, 77,230, 26,112,112,240,177,161,132,162,207,185, 2,193, 96, 86,
+171, 9, 98,193, 2,164, 48,137,209,169, 47,243,213,234,141,101,101, 25,114, 51, 77, 45, 6, 48,173,182,174,126, 6,176,238,207,
+ 92, 37, 83, 59, 67,171,165,107,174, 9, 62, 23,244,201, 23,118,215,150, 44, 89,194,141,140,140,196,207, 63,255,220,123,231,206,
+157, 31,203,229,242,203, 0, 78, 1,120,254,103,175, 74, 55, 96, 70,207,222,189,191,155, 58,127, 62, 71,121,253, 58,190,219,181,
+107, 51,106,242, 45,109,109,238,181,196,231, 99,172,179, 51, 47,146,101,209,133, 0, 8, 2,120, 40, 43, 97,206, 82, 20,125, 8,
+102,228, 98, 51,130,137,104, 56, 29,127,127,115, 13, 84, 60,103,151, 10, 71, 4,244,169,120,126,117, 41,128,183, 26,239,215,169,
+ 68, 83, 89, 78,171, 72, 37,155,144, 11, 96,195,159,172, 86, 43, 23, 23,151,196,147, 39, 79,182, 12, 13, 13,229, 2,192,253,251,
+247,167, 68, 70, 70, 14,144,201,100, 65, 0, 42,255, 67, 15, 33, 17,151, 36, 63, 19,240,120,131,105,154,238, 4, 0, 28, 14,231,
+177, 70,171,189,168, 99,152,173, 48, 51, 39,155, 5, 22, 88,240,191, 11, 83, 92,228,191, 28, 6, 51,195,215,157, 28, 91,255,189,
+ 62, 36,174, 29, 58,134, 13, 28,243,180, 66,174, 80,101,101,229,149,205,251,108,205,197,143,231,172, 63,177,225,167,184,179,241,
+119, 82,111, 7,132, 14, 73,145,184,118,232,104,192,180, 33, 31,174,151, 88, 44,126,176,109,219, 54, 42, 45, 45,141, 45, 47, 47,
+103,159, 62,125,202, 30, 61,122,148,253,228,147, 79, 84, 98,177,248, 1, 0, 47,115,108,186,185,185, 21, 62,189,242, 27,251, 50,
+ 49,129,205,190,127,135,213,106,181, 44, 69, 81, 44, 69, 81,108,202,249, 56, 54,241,212, 49,246,225,209, 67,172, 70,163, 97, 53,
+ 26, 13,171, 86,171,217,182,109,219,230,155, 89,206,198,240, 12, 12, 12,212,196,197,197,177, 71,142, 28, 97,231,207,159,207,134,
+132,132,208, 0,102,154,123,238, 18, 87,191,254, 54, 45,130,101,211,163,182, 82,103,110, 94, 96,147, 95, 60,100,147, 95,164,179,
+177,151, 82,217,105, 11,182, 80, 54, 45, 66,100, 18, 87,191,254,166,206,221,193,193, 33,140, 32, 8,182, 14, 0,216,214,173, 91,
+ 87,213,127,121,121,121, 53,120,181,106,213,170,170, 77,155, 54,207,157,156,156,186, 52,101,115, 66, 39,176,108,202,126,150, 77,
+217,207, 46,233, 11, 54, 57, 57,249, 54,203,178,215,234, 94, 74,165,242,218,241,227,199,175,189,251,238,187,215, 0,188, 99,164,
+158,204,170,207, 41, 64,142,252,228, 73,150,221,180,137,101, 35, 34,216, 84,128,157, 2,228, 52,211,102, 91,119,119,222,195,245,
+235, 62,214,156, 60,249, 43,123,238,220, 25,246,236,217, 56,246,196,241, 93,236,230, 77,159, 81,110,110,188, 36, 0,237,154, 97,
+147, 11, 96, 13,128,141,168, 81, 46,211,100, 50, 25, 91, 80, 80,192, 2, 72,171,253,110,163,139,139,203, 6, 52,173,190, 13,170,
+175,100,205, 29,230,126,238,189,183,122,179,242,138,124,246,189,183,122,179,115,135,185, 55, 80,182,134,249,248,216,204, 26,209,
+ 73,150,124,127, 31, 61,107, 68, 39,217, 48, 31, 31,155, 55,172, 79, 2, 53,235,132,110,187,114,229,138,142,173, 7,173, 86,203,
+238,217,179,135,118,112,112,248,181, 25, 54,219,187,184,184,100, 59, 58, 58,166,213,255,210, 37,120, 84, 79,255, 62, 83,150, 59,
+117,124, 55,162, 25,229, 12, 21,241,249, 47, 47, 30,254,145, 46,201,121,204,106,148,133,108,197,179, 4,246,101,234,109,118,207,
+142,141, 90, 1,151,251, 18, 64,232,159,185,150,154, 9,139, 77,139, 77,139,205,255, 66,155,198,184,200,255,101,112, 27,159, 96,
+ 99, 8,133,130,168,229, 75, 22, 18,229, 37,229, 74, 85,165, 92,163, 85,169, 84, 36,159, 85, 61, 78,121, 81, 68,114, 57,229,115,
+231,204,182,137, 90,180, 36,170, 26,152,100,230,127,122,133,132,132,220, 61,118,236,152,171,163,163, 35, 42, 42, 42, 80, 82, 82,
+130,187,119,239,130,101, 89,140, 30, 61, 90,216,163,123,247, 46, 75,151, 45,187,245, 50, 47, 47, 28,134, 59,222, 87,228,197,209,
+ 25,235,122,215,172, 69,251, 85, 86, 73, 77,175, 67, 16,216, 57, 46, 82,127,204,202,151, 53,171,101,136, 68, 34,253,130,196,111,
+128,240,129, 3, 7,242, 1,224,195, 15, 63,172,148,203,229,209,181, 10,135, 89, 43,173, 74, 92,253,250, 59,123,120,198,253,184,
+125,157,184,147,175, 31, 40,173, 14,217, 5,249,224,242,236,209,178, 37, 31,239, 79, 26,204,235,219,211,209,121,205,170,157,103,
+ 10, 24,140, 82, 20,167, 95, 48,100,203,222,222,126,207,161, 67,135,112,248,240, 97, 0, 64, 90, 90, 26,252,252,252, 36,166,202,
+144,148,148,228,243,206, 59,239, 28, 44, 41, 41,105,103,234,216,198,137,241,133, 66, 33,122,247,238,141,142, 29, 59,226,228,201,
+147,253,106,149,173, 63, 5,229,245,235,176,126,244, 8,136,127,163,193, 75,219,174, 93,189,111,159, 61,179,207,249,204,217, 84,
+108,216,176, 11,207,159,215, 8,109, 62, 62, 62,152, 56, 97, 28,239,241,227,155,129, 99,199, 78,188,249,251,239,207,123,215, 18,
+ 37, 83,248,250,167,159,126, 90,220,166, 77, 27,140, 29, 59,118, 92, 96, 96,160,187,173,173, 45,118,236,216, 1, 15, 15, 15, 31,
+141, 70,243,236,228,201,147,158, 5, 5, 5,152, 61,123, 54, 10, 11, 11,231, 27, 50,212,111,104,191,165,194, 17, 1,125, 58,116,
+157, 10,107, 91, 15,252,116,224, 16,158, 62,216,211, 71, 77,165, 46,229,211,241,147,149,172,112,154, 44,199, 58,170,117,183, 8,
+167,118,129,239,192,187,107,130,179,138,254,253,197,210,193,109, 99,184, 34,213,158, 21, 27,164, 37,175, 25, 29, 27,203, 9,170,
+124,226,152,116, 17, 37,192, 10,166,142, 96,233,213, 90, 22,239,244,237,219, 87,223,112, 89, 89, 89, 80,171,213, 8, 8, 8, 32,
+ 53, 26, 77,127, 51,235,181,253,144, 33, 67,254, 56,123,246,172, 83,251,246,237,101,165,165,165,250, 29,238, 78,246, 67,227,143,
+109,158,189,230,187,127,249,239,101,137,114, 89,234,137,199, 38,108,133,246, 10,235,122,233,220,177,125,214, 68, 85, 46, 4,246,
+197, 0, 83,130,140,131,191,128,176,114,196,248, 79,230,113,251, 15, 28,208, 98,240, 91, 99, 46, 61, 77,127, 62, 16,192, 61,203,
+184,222, 2, 11,254,214,170, 22,251,191,118, 78,122,162, 21, 25, 25, 73, 52,117,130, 12,203, 4,187,185, 58,137, 55,175,223,125,
+143, 67,105, 52, 18,123, 59, 13,207,206,150, 33,108,236, 56,148, 70, 91,229,237,227, 45, 96, 88, 38,216,128,253,198, 83, 60, 9,
+177, 88,124,236,212,169, 83,174, 60, 30, 15, 12,195,192,197,197, 5,153,153,153, 40, 47, 47,135, 92, 46,199,243,212, 84,180,241,
+106,133, 21, 81, 11, 61,102, 47,140, 58,166, 80, 40,186,161,161, 27,241,181,105,163,180,182,225,186,209,117, 75,176,188, 54,228,
+175,253,174,137,125,230, 78, 69,205,204,201,201,129,181,181, 53,130,130,130,172,111,220,184,241,187, 17,146,213,192,166,131,131,
+143, 13, 35, 20, 28,222,246,227, 50, 49,165, 77, 66, 74, 70, 41, 58,180,233, 3, 55, 39, 47,228,151,106,112,251,238, 41, 36, 37,
+238,135,111, 11, 47,204,252,100,128, 40,102,221,145, 67,124, 93, 27,175,242,242,204,202,166,108, 86, 86, 86, 90,183,109,219, 22,
+ 94, 94, 53,235,158,209, 52,141,148,148, 20,208, 52,173,223,174,255,190,251,232, 21,232, 42,179, 49,117,202, 20,148,148,148, 88,
+ 55,101,147,199,129,110,222,199, 19,185, 98, 30, 32,144, 56,106,170,170,170,244,203,112, 80, 20,133,135, 15, 31, 34, 60, 60, 60,
+ 34, 54, 54,214, 20, 43, 50,171, 62, 41,224,219,239,126,253,117,203,164,138, 10, 18, 0,126, 38, 8,134, 98,217,111,205,189,150,
+ 92, 93,121, 71,207,159,219,235,204, 33,159,192,209,238, 27,220,189,155, 13,138,170, 41,111, 73, 73, 17,102,125, 86, 9, 62,207,
+ 6, 39, 79,254,203, 41, 32,160,247,209,130, 2, 42, 8, 13,221,136, 77,149, 83,116,238,220, 57,204,154, 53, 11, 41, 41, 41,158,
+ 28, 14, 7,119,238,220,129, 88, 44,198,250,245,235, 57, 1, 1, 1,158, 18,137, 4,231,207,159, 71, 97, 97, 33, 97,172,156,215,
+ 46, 92, 91, 93,241,252,234,210, 2,226,252,176,159, 14, 28,194, 71, 19,198,195,157,205,248,221,206,151, 88, 61,100, 68,175,175,
+ 88, 78,171, 72,137, 77,176,131, 95,208, 8,240, 5,214,152,249,229, 74,164, 37,157,118, 80,200, 19, 63, 35,232,220, 86, 43, 54,
+196,206,121,173,156, 71,198,209, 31,238,191,209,245,162,215, 61,239, 71, 15, 63,190, 35, 77,216,153,248,138,104,249,112, 9,146,
+182, 3,106,150, 79,121,246,236, 25,158, 63,127, 14, 46,151, 11,165, 82, 9,157, 78,215,100, 57, 61, 61, 61,103,232,116,186,175,
+106,219,121,183, 72, 36,250, 96,223,190,125, 78,245,137,182, 75,240,168,158, 78, 54,146,129,133, 69, 37,101, 55,239, 37, 63,157,
+ 55, 99,108,191,235,183,147,114, 41,222,187, 57, 21,137, 39, 43, 12,212,167, 72, 44, 16, 28, 61,127,252, 95,214,218, 23, 87, 32,
+ 9,232, 7,158,181, 31,104,109, 30, 20,101,213,144, 63,151, 66,253,227, 15,232,252,217, 92,156, 62,113,196, 58,176, 83,183, 88,
+181, 86,235, 7, 64,243, 6,247,102,115, 96,177,105,177,105,177,249,223,105,211, 32, 23, 97, 89,182, 43, 0,183,218,205,146, 90,
+ 94,224, 12,160, 24, 53,171,200,184,213, 62, 59, 4,245,126,214,120,187,254,177,141,183,235,127, 46,169,253,236, 90,251,126,143,
+ 32,136, 82, 19, 69,247, 64,205,210,132,103,106,223,129, 90, 87,162,201,192, 99,130, 32, 43,105,154, 17,242, 93, 92, 85, 31,190,
+ 55,176,211,111,151,238, 63,180,114,182,229, 14,237,215, 37,226,238,227, 23,183, 8,146,208, 18, 4,105, 86,220, 7,135,195, 25,
+191,121,243,230, 78,182,182,182, 96, 24, 6,118,118,118,144,201,100,208,104, 52,168,168,168,128, 90, 94, 9, 74, 94,137, 71,185,
+ 89,232, 21,209, 15, 99,134, 13, 9,248,215,137, 83,227,105,154, 62,104,204,174,103,112, 23,189,146,181,178,181,211, 43,105, 34,
+183, 92, 79,186,190,233,226, 7,190,181, 53, 6,207,139,250, 51,215, 64,194,153, 51,103,206,141, 30, 61,250,173, 5, 11, 22,144,
+ 82,169,244,124,102,102,102, 47, 0, 41, 38, 73,133, 80,244,249,167,159, 71, 58, 56, 88,179,136,189,120, 10,125,187, 76,128,149,
+128,131,146, 74, 10, 4, 1,164, 38, 31, 3, 65, 56, 34, 49, 77,138, 62,157,109, 49,100,104,128,245,137, 35,169, 11,240, 42, 62,
+232,181,166, 41, 43, 43, 67, 81, 81, 17,180, 90, 45,180, 90, 45,198,142, 27,135,189,123,246,160,186,186, 26, 74,165, 18, 26,141,
+ 6, 52, 77,131, 36, 73, 92,140,139, 69,238,139, 84,244, 12, 15, 7, 12, 44,189,180,231, 33,120, 0,110, 63,125,250, 20,169,169,
+169,120,249,242, 37, 68, 34, 17,220,221,221,177,114,229, 74,168,213, 53,107,148,141, 27, 55, 46, 2,192,227, 63,123, 67, 61, 7,
+118,102,210,244,210,183,142, 31,119,189,113,252, 56,115,251,244,233,151, 66,185,124,135, 57,191,229,243, 49,118,221,183,159,116,
+144, 72, 36,120,153,179, 25,254,254,124,204,159,235,132,232,111,138, 1, 0,179,103,181, 68,247,110,206,168, 44, 63, 2,103,215,
+197,216,178,101,142,239,180,105, 27,167, 40, 20,244,110, 19,166,151,158, 58,117,106,140,159,159, 95,139,132,132, 4, 66, 32, 16,
+ 64, 44, 22, 67, 44, 22, 67, 36, 18,161,168,168, 8,153,153,153,236,186,117,235,242, 0, 44, 53,102,104,197, 22,233, 45, 0,111,
+205, 29,134,115, 79, 31,236,233,211,130,243,226,209,152,153,189,179, 18,111, 39,200,127,187,120, 99,149, 78, 37,202, 45,127,121,
+105, 97,219,238, 9,206,159,125,241, 53,126, 88,183, 28, 79,239, 92, 47,117,243,170,220, 42, 38,212, 77,150, 51, 34, 98, 5,215,
+195,205, 81, 55, 99,218, 24,251,211,110, 55,103,156,229, 18,178,130,226, 7,235,145,153,160, 20,182,235, 50,185,189, 15,169,185,
+114,229,138,184,111,223,190, 80,169, 84,122,101,114,223,190,125,140, 78,167,187,218,228,181, 73, 81, 95,229,229,229,121, 40,149,
+ 74, 12, 27, 54,108,246,250,245,235, 37,117,107,212,209, 52,221, 64,201, 90,189,105,239,133,207,191,218,122,245,194,193,111, 60,
+ 87, 71,125,208,111,210,204, 53, 87, 97, 96, 29, 73, 46, 73,126,118,250,248, 46,119,145,131, 22, 98,199, 33, 80, 21, 42,241,116,
+231, 71, 80, 84,170,208,125,245,215, 0, 4,208,104, 73,236, 24, 49, 22, 60, 39, 79, 44,159,254,129,231,146, 29, 63,125,194, 48,
+204,102,203,184,222, 2, 11, 44,104, 4, 55,130, 32,226, 0, 32, 42, 42,106,113,116,116,116, 50, 65, 16,113, 44,203, 70,214, 10,
+ 40,113, 44,203, 70,214, 29, 83, 75,206, 94,219,174, 59,182,241,118,227,207,139, 22, 45, 10,140,137,137, 89, 27, 30, 30,126,240,
+230,205,155, 47, 0,152, 34, 90,195,107,137,213,107, 75,239,144,117, 12,178,254,123, 3, 69,139, 97,174, 63,123,145,165, 24, 50,
+168, 71,203,184,248,199,247,222,127,127,248,192,241, 35,250, 14,205,204, 41, 73,245,245,118,119, 78, 78,126,108,203, 48,204,117,
+115,106, 73, 40, 20, 70, 14, 24, 48,128, 91, 86, 86, 6, 43, 43, 43,200,100, 50,228,229,229,129,162, 40,168, 42,202,161,174, 40,
+135,170,188, 12, 84, 69, 25,158,223,191,139, 96, 95, 31, 97,109,176,188, 81,212,169, 46,141,149,170,250,202,150,192,198, 6, 66,
+ 27, 27, 16,205,119, 27,190,107,111,111,127,187,174, 83,165, 40,234,179,133, 11, 23, 22, 51, 12,131, 53,107,214,216, 90, 91, 91,
+199, 2, 16,154, 50, 98,227,194,137, 12,239, 28, 68, 62,201, 76, 68,239,144,169,104,223,246,109,100, 22, 42, 81, 44,167, 80, 84,
+ 78,161,123,223,239,209, 58,228,107,180,234, 28,141,212,236, 82,120,182,240, 35,193, 21, 26, 93,252, 57, 55, 55,183,193,246,193,
+ 3, 7,160, 80, 40,224,235,235,139, 9, 19, 38, 96,225,194,133,152, 48, 97, 2, 60, 61, 61, 49,233,189,119,176,124,249,114, 20,
+ 20, 20,152, 42,170,186,125,251,246,106,111,111,111,181,183,183,183,154,162, 40, 84, 85, 85,161,188,188,188,113,125,207,105,110,
+ 69,186,186,186, 46,114,119,119, 79,116,117,117, 77, 22, 10,133,103, 31, 18,196, 19,149,183,183, 91,175,145, 35,137,142,239,189,
+199,201, 22,139,137,120,192,218, 28, 91,206,142,188,225,253, 7,188, 37, 40, 47,219,165, 23,169, 62,120,223, 5,127,196, 7,226,
+198,239,221, 48,235, 51, 95, 16,164, 8, 4, 41,128,162,250, 10,122,132,134,243,237,237, 9, 83,215,210, 68, 0, 15,123,245,234,
+229, 57,115,230, 76, 66, 40, 20, 98,246,236,217,212,244,233,211,211, 39, 76,152,144,126,249,242,101,218,219,219, 27,173, 90,181,
+ 34, 90,181,106,229, 1,224, 97,237,111,140,194,214,151, 88,173,166, 82,127,183,247,147,188,160,225,220,179, 74, 43, 28,187, 98,
+131,180,100,245,182, 23, 27, 50,159, 42,124,158,222,185, 94,146,158,116,154,201,188,119,173, 56, 63, 93,238,179,122,219,139, 13,
+139,183,230, 55,121, 83,199,199,131, 57, 22, 23, 79, 41,170, 21,220,145, 35,250, 43,102,124, 56,190,189,163,117,224, 62,180, 24,
+ 18,210,218,171,229,164,229,107,183, 80,211, 63,249,156,250,249,151, 93,172, 92, 46, 71,101,101, 37,182,108,217,162, 59,125,250,
+116, 30, 77,211,159, 27, 26, 3, 1,128, 86,171,197,140, 25, 51, 36,182,182,182,200,205,205,213, 43,162, 0, 32,149,149, 60,190,
+113, 47,233,201,188,127,142,139,168, 86,171,213, 23,174,221, 79,237,232,231,221,146, 32, 88,131, 19, 81, 4, 60,222,224,110, 61,
+122,112, 88,182, 28, 4,215, 11,207,247,172, 67,101, 65, 41, 42,139, 74,193,225, 73,160,131, 16, 90, 70, 0,251,224, 80,164,221,
+ 75, 64, 11, 23, 55,174,144,199, 27,106,233, 79, 44,176,224,239, 9, 99, 92,164, 62, 89,138,137,137, 89,107,108,127,189,119, 77,
+163,109, 61,145,106, 76,194,234,127, 6,128,152,152,152,181, 44,203, 70,222,188,121,243, 0, 0,165,153,167,240,113,189,119,243,
+243,104,113, 84,154,232, 5, 11,151,194,193, 78,108, 23,218,197,207,253,228,249,248,251,215,111,222, 79,109,221,202,217,133,213,
+106, 28,190,221,248, 67, 75, 66,161,140, 49,179, 16, 1,206,206,206,160, 40, 10,207,158, 61,195,203,151, 47, 65, 81, 20,116,213,
+213, 80,151,151, 67, 85, 86, 6,186, 90, 14, 62, 77, 67, 41, 43,130,147,149, 8,120, 53, 35,209,132,242, 70, 52, 73,180,234,222,
+ 69,182,182, 16,218,216,130,228,241,154,116, 43, 26, 64,215,208,208,208,195, 73, 73, 73, 61, 6, 13, 26,180, 10, 53, 83,228,179,
+243,242,242, 6, 46, 91,182, 76,237,230,230,134, 25, 51,102,116, 0, 48,213, 36,201, 20,104, 2,188,221, 59,160,189,207, 84,180,
+110, 53, 0,229,213, 90,200, 42,181, 40, 42,167,176,227,251,112, 28,253, 57, 20,127, 28,237,131,164, 11,131, 81,174,117,135,181,
+231,187, 96,105, 77,160, 49,155, 23, 47, 94,196,202,149, 43,177,106,213, 42,172, 89,179, 6,171, 86,173, 66, 94, 94, 30,130,130,
+130,144,147,147,131,115,231,206, 65, 42,149,194,217,217, 25,119,239,222,197,166, 77,155,240,199, 31,127,152, 60,233, 58,226,106,
+198, 49,205,242,165,235,116,186,105,210,145, 35, 59, 21, 58, 58,118,236,210,165,203, 91,179,103,207,246,233,213,171,151,126,191,
+143,143,143,151, 88, 44, 46, 64,205, 12,202,206,198,108, 49, 64, 23, 23,151, 32,104,212, 79,106,219,152, 7,130, 16, 97,192,224,
+ 84,244,234,115, 31,148,150, 15,146, 16,130, 36, 69,208,233, 74,224,224,224, 9,150, 37,130, 76, 20,113,153, 76, 38,243,187,116,
+233, 18,153,153,153, 9,145, 72, 4, 0, 89, 43, 86,172,248, 97,195,134, 13, 41, 78, 78, 78,116, 92, 92, 28, 78,156, 56,129,200,
+200, 72,206,244,233,211,253, 90,181,106,181,221,212,121,175,216, 34,189,181,127,227,185,127,240,180, 14,157, 69,226,214,109, 80,
+109,253,238,167, 17,206, 18, 0, 56,159,145, 33,119,245,170,140,169,150, 39,230,216,183,172,250,230,124,134,169, 25,167, 43,152,
+ 7,233, 79,110,239, 63,126,190,162,168,176,140,215,165, 83,160, 50,122,229, 23,252,214,109,218,125,187,124,225, 63,221,243, 42,
+ 69,229,131,103,159,123,114,236,252,221,170,201,239,127,164,251,240,227,153,170,115,231, 47, 30,103, 24,166, 19, 12,204, 56,100,
+ 24, 6, 82,169, 20,201,201,201,200,200,200,128, 76, 38, 67,113,113, 49,228,114,185,222,221,104, 37,175, 60,243,195,175,167, 31,
+ 73,196, 98,171, 30,157,252,188,238, 36,164, 20, 73,196, 98, 43,191, 54, 94,237,129, 21, 77, 62, 71,104,154,238, 36,178, 18, 3,
+ 32, 80,158,116, 29, 85,101, 85,168, 42,175,130,188,180, 10,106,138, 3,149,154,132, 82, 67,194, 59, 98, 8,170,170, 85,168, 42,
+169, 0, 67,211, 33,150,238,198, 2, 11, 44, 48,210,215,199, 69, 69, 69, 45, 54,243, 88,179,221,155,141,137, 87, 84, 84,212, 98,
+130, 32,226, 22, 45, 90, 20, 8,195, 19,170,234, 99,103, 19, 47, 0,102,164,119, 40, 41, 73,175,178, 33, 2, 70,207,253,242,171,
+115, 7,126,249,222, 85,173, 86,228, 56, 57, 88,211,214, 86, 2,231, 15,103,172,129,188,170,108, 84,181,249,233, 8, 80, 86, 86,
+134, 23, 47, 94, 64, 44, 22,131,207,227,129, 86, 42, 65, 43,171,161, 44, 43, 1, 73,169,193,167,105, 56, 90,137,225,237,233,142,
+214,110,238,102,217,124,118,229, 55,125,224,123,125,119,225,186,208, 0, 8, 36,214, 16,216, 88,227,211,184,107, 0, 0, 62,159,
+ 15, 44, 91,101,150,104,210,162, 69,139, 83,251,247,239,231,203,100, 50, 60,124,248,240, 17,128, 10, 0, 54, 0,152,212,212,212,
+ 75, 73, 73, 73,145,126,126,126, 0,224,107,202, 88,101, 49, 73,107,117, 44,114, 11,178,144,249, 50, 1,142,118,109,193,179,106,
+143,162,114, 10, 66,113, 91,104,213,175,188,143,170,202,108, 40, 41,142, 89,231,174,209,104,160,211,233,160,211,233,160,209,104,
+240,241,199, 31,227,198,205,155, 56,120,226, 50, 94, 60, 79, 67,135, 54,238,152, 50,101, 50, 66, 67, 67,113,243,230, 77,163,182,
+166,118,134,182,133, 53,184, 27,223, 34, 33,176,118, 82,135, 45,188,112,199, 20,217, 34, 8,130,133, 1, 87,100, 35,108, 8, 15,
+ 15,111,151, 86, 93,141,228, 39, 79, 48,104,197, 10, 0,192,217,179,103, 27,156,203,188,121,243, 4, 41, 41, 41, 31,222,191,127,
+255,195,252,252,252,141, 0,154, 14, 54,103,129, 51,103,110,225,159,255, 76,129, 76, 38, 3, 0, 28, 58,240,138,151,102,190,160,
+ 48,108,120,141, 71,203,222,222, 30, 27, 55, 6,153, 85,159, 52, 77, 99,231,206,157,122,119, 33, 0,112,185,220, 94,243,230,205,
+ 27,221,212,241,237,218,181,227,155,178, 57,119,108, 11,209, 31,143,216,207,236,218,181, 14,180,117, 14, 70,137, 54, 33, 40, 33,
+ 79, 58,107,238,216, 22,155, 55, 29,201, 83,137, 9,245,110,130,206,109,197, 21,169,246,152, 83,198,140,243,223,107, 74,188,167,
+237, 41,144, 85, 46,153,249,209, 68, 39, 91,123,215,234,159,127,136,118, 32, 57, 36,123,234, 62, 85, 30,232,227,100,255,110,216,
+119, 85,255,156,187, 44, 65,163,203,157,137,220, 83,105, 48,146,226,130,166,105,228,231,231, 67, 38,147, 33, 39, 39, 7,197,197,
+ 53,238,215,226,226, 98, 48, 12,243,103, 30,136, 80,230,228, 32,251,248,207,104, 61,121, 50,186,175, 90, 9,154,225, 66,169,160,
+177,177,231, 64,148, 85, 40,161,102, 8,120,118,237,137,143,206,254, 14,146,165,129, 29, 91, 45, 61,137, 5, 22,252, 77, 97, 78,
+122,135, 58, 66, 20, 29, 29, 29,249, 87,255,127,125,178, 21, 29, 29,157, 28, 29, 29,221,156,255,106,236, 50,212,111,215,197,104,
+ 93,171, 23,128,246, 90,167, 41, 47, 78,205, 72, 73,225,230, 87, 43,171,173,220, 92, 93,212, 86, 34, 33, 83, 81, 41,231, 36, 60,
+126, 68, 85, 23, 60,127,218,140,243, 72, 77, 74, 74, 10,202,207,207, 71, 78,118, 54,116,202,106,144,106, 13, 88,149, 2,131,122,
+247,132, 8,128,136, 36,192,103, 40,112, 57, 2,200,171, 42, 1, 32,213,100,231,168,213,190,166,108, 17, 4, 1,129,141, 13, 4,
+ 18, 9, 4,214, 54, 13, 20, 46,115, 20, 27,161, 80,184, 63, 54, 54,214,163, 69,139, 22, 88,185,114, 37, 90,182,108,233,239,233,
+233,169,176,179,179, 19,187,185,185,161, 99,199,142,232,217,179, 39,206,157, 59, 7,152,145, 83, 74,171, 19, 37, 62,205, 66,175,
+226,210,155,248,253,218,143,208, 40,213,232, 18,241, 35, 40,219, 62, 66,105, 0, 0, 32, 0, 73, 68, 65, 84,110,107,184, 4,126,
+ 13,230,217, 62, 40, 10, 78,214,168, 7,238, 35,240, 50, 39, 11, 4, 71,144,108,174,242, 84,247,249,209,163, 71, 56,112, 50, 30,
+ 30,222, 1,200, 73,127,130, 39, 87, 47,225,134,139, 19,188, 3, 58,234,221, 64, 6,203, 72,131,187,122,107, 77,154,168,165,159,
+ 77, 20,150,150,150, 10, 29, 29, 29,213,117,117,231,225,225,241,103,200,214,196, 5, 11, 22,160,156,199, 3,134, 15, 7, 63, 35,
+ 3, 20, 69, 33, 44, 44, 12,221,187,119, 7, 0,132,133,133,129,203,229, 34, 56, 56, 24,158,158,158,216,186,117,235, 68, 67, 68,
+139, 36,240, 80,167, 43,241,247,241,241,209, 19,173, 61,123,101, 72,184, 63, 24, 4, 4,216,242,195, 51,253,177, 94, 94, 94, 40,
+144,102,128, 32,216, 36, 19,101, 92,229,238,238,190,204,195,195,195,103,195,134, 13, 28,145, 72,132, 79, 62,249,164,109, 85, 85,
+ 85,235, 90, 41, 25,139, 22, 45, 2, 0, 44, 95,190, 28, 43, 86,172,128, 90,173, 86, 24, 50,182,103, 99, 39,207,162, 82,230, 67,
+182,202,106, 84,127,231,214,157, 6, 12, 29,132,182,126, 3, 48, 96,104, 14, 0,172,117,228,102,189,247,237, 18,251,227,246, 54,
+196,174,223,206, 95, 92,222, 59, 98,192,146,133, 85, 87, 87,127,179,179,220,100,204, 99, 69,246,110,249, 83,193,248, 77,223,111,
+223,187,233,171, 69,115, 68, 57, 50, 77, 89, 94, 25, 91,101, 45,228, 90,251,186, 17,214,179,190, 92,245, 34, 63, 63, 99, 62,114,
+207,155,156,105,201, 48, 12, 50, 50, 50,244, 49,125, 42,149, 10,213,213,213,200,205,205,213, 95, 51, 74,137,237,176,153,239,143,
+ 8,169, 86, 42, 21,119, 30,167,231, 44,157, 61, 41,188, 90,169, 84,164,103,230,164, 1, 91,154,100, 99, 36, 73, 62, 86,200, 21,
+131, 20,229, 42,200, 30, 62, 69,203,129,222,208,234, 8,104,116, 52,100, 37,114,168,117, 0, 77,242, 16,248,222, 20,208, 4, 23,
+197,249,121, 32, 57,156, 71,104, 24,180,111,129, 5, 22,252,125, 96,148,139,212, 41, 90,225,225,225, 7,235,171, 78,117,159, 1,
+168, 97, 60,148, 71, 86,159, 76,213,185, 19, 13,253, 79, 35,187,230,226,181, 24, 45,147,233, 29,234,254,179,149, 93,165,231,186,
+229,147, 90, 50, 58, 93,135,162,226, 66, 29,151, 43,228,181,178, 83, 74, 75,115,204,255,119,181, 90, 29,119,233,210,165,145,131,
+ 7, 15, 22,166, 63,126, 4, 77, 69, 5, 52, 21,229,224, 49, 58, 56,138,187,129,164,212, 32, 52, 26,180,240,103,160,146,139, 17,
+127, 35, 73,171, 86,171,227,204, 37, 90, 36,135,211, 48, 46,203,218, 26, 66, 27, 91, 8,173,173, 27,187, 22, 77,145, 2,171, 33,
+ 67,134, 12, 12, 11, 11, 3,203,178,216,185,115, 39, 40,138, 18, 80, 20, 5,141, 70, 3,138,162, 80, 89, 89,137,189,123,247, 98,
+219,182,109, 55, 0,252,106,178, 51,211,105, 46, 93,184,120, 37,244,131, 73,145,188,179,113, 27,161,211,208, 80, 18, 45, 81, 93,
+173, 69,149,198, 10,180,211,100,160,240, 12, 56, 92, 17,194,131,219,226,228,145, 99, 20,116,234,203,102,178,240, 6,170, 80,110,
+ 78, 22, 94, 62, 79,131,117,101, 1, 92,108,173,160,200, 72, 67,151, 41, 83,223, 72,157,104,213,170, 21, 24,134, 65,255,254,253,
+245,193,213,111, 74,182, 74, 74, 74,112,250,244,105,132,133,133, 33, 34, 34, 2,121,121,121,200,200,200,192,219,111,191,173, 63,
+230,209,163, 71, 72, 72, 72,128,175,175,113,145,176,184, 84,123,246,101,238,195,113,239,190,251, 46,255,246,237,219, 96, 89, 22,
+126,126,182,176,181,145,128, 32,133, 8, 8,112, 5, 80, 51, 6,232,215,175, 31, 42, 43, 51,116,101,101,236, 89, 19,167,187, 31,
+192, 9,141, 70,243,172,111,223,190,158,207,159, 63,199,220,185,115,185,135, 14, 29,170,147,146, 17, 21,213,112, 50,133, 82,105,
+216,117,223,161,147,255, 23,109,117, 14, 17, 34,113,235, 54,182,206,193,104,235, 55, 0, 0, 48, 56,242, 3,180,109,231,133,202,
+226,196, 54, 42,101,214, 40, 62,183,204, 33,113, 75, 94,138,120,120,208,251,170,162,107,233,168,113,157,154,108,118,101,250,161,
+194, 28,222,228,195, 39, 78,157,155,241,118,228, 59, 60, 45,173,211, 5,121,243,236, 99,143,159, 41,202,203,206,249, 14, 57,231,
+147, 94,233,127, 70, 85, 60,186,178,178, 18, 18,137, 4, 73, 73, 73,234,225,195,135, 11, 73,146,196,179,103,207,244, 68,203,213,
+217,177, 99,175,238, 65,254,171, 55,237,189, 32, 17, 10,133, 67,251,117, 11, 72, 73,207,126,201,178, 68,150, 65,181, 85,171,189,
+248,248,225,163,254, 46,158,237, 56, 25,215,110,195,169,207,219, 80,171, 73, 40, 53, 12,212, 58, 64,199,225,195,163,115, 15,216,
+251, 6,128, 5,112,239,246, 13,173, 90,171,189, 96,233,107, 44,176,224,111,173,106,177,198, 72, 82,237,231, 82, 0, 89,209,209,
+209,197,245,212, 38, 25,128, 71, 0, 66,106,143,147, 53,250,157,140, 32,136,123, 44,203,118,175,103, 71, 86,143,112,213,255,172,
+105,116,204,163,102,144,172,250,239, 13,137,150,161, 41,149, 0,224,236,236,236,218,165, 75, 55,223,159,126, 57, 12,150,101,241,
+ 52, 97, 61,202,138,158, 96,217,218, 91,190, 45, 90,180,136,200,203,203,139, 55,167, 4, 52, 77, 31,218,181,107,215,252, 30, 93,
+187,116,105,211,178, 37, 30,101,101,130,207,210,224,211, 52, 72, 74, 13, 46,173, 65,203, 32, 26, 36, 97,141,252,252, 10,196,236,
+ 63,156, 84,155, 37,222, 40,252,223,126, 7, 43, 95, 86,128, 32, 8,108, 8, 15,130,192,198, 26,124,137, 53, 62, 61,117, 69, 79,
+174,226, 86, 46,130,192,218, 26,190, 61,204, 74, 8,175,184,122,245,234,253,199,143, 31,119, 15, 10, 10,194,252,249,243,145,149,
+149, 5,134, 97, 80, 88, 88,168,146, 74,165,121, 50,153, 44, 11,192,113, 0, 63,193,140,204,227,124,181,106,115,220,209, 61, 51,
+195,123, 71, 56,191, 59,106, 27, 78, 28,153,135,242,138, 74, 40,116, 98, 84,171,116,168, 86,115,224,232,212, 9, 61,130,131,145,
+159, 87,132,228,219, 23,170,184,106,197,250,230, 92,160, 4, 65, 32, 33, 33, 1, 62,158, 54, 72,251, 61, 30,206, 86, 60,132,120,
+186,195,179, 87,111,125,126, 41, 99,224,113,160,155, 56,113,162, 62, 51,252,144, 33, 67, 50, 39, 79,158,236, 49,111,222, 60,252,
+242,203, 47,184,113,227,198,107, 1,218, 17, 17, 17,184,126,253,250,215, 0,150,155, 18,245, 52, 26, 13,252,253,253,113,239,222,
+ 61, 92,186,116, 9, 3, 6, 12, 64, 68, 68, 4, 18, 19, 19,241,219,111,191, 33, 33, 33, 1, 4, 65,192,201,201, 9,218, 26,242,
+172, 53,100,140,162, 16,251,205,183,187, 22,111,218,180, 45,112,210,164, 73, 56,122,244, 32, 62,120,191, 3, 8, 82, 8,130, 16,
+226,157, 17, 29,176,114,213, 61,244,232,209, 15,206,206, 60,108,218,120,242,133, 82, 73,239, 53,163, 26, 87,255,246,219,111,158,
+ 42,149, 10,229,229,229,172,181,181, 53, 81, 82, 82, 51,163,181, 41, 69, 75,161, 80,136, 12, 25,122,252, 32,117,125,185,156, 45,
+ 99,171, 18, 70,149,234, 18, 58, 13, 24,154,139,193,145,239,227, 98,220,175,184,114,225, 18, 28,185, 89,153,144,200,207, 21,103,
+ 22, 87, 74,171,253,182, 7,116,157,206,121, 89,125, 97,251,172,119,210, 56, 30, 30, 76,236,162, 31, 43,203,141, 17, 45, 0, 68,
+105,202,190, 83,199, 89,188,211, 51,188, 71,187, 32, 47, 15, 65, 89,113, 17,123,228,228,185, 36, 42,243,232,233,122, 4,139, 53,
+ 65,212, 87, 70, 69, 69,125, 85,251,121,247,210,165, 75,167,199,196,196,184, 20, 20, 20,232, 99,180,138,138, 75,175,244, 28, 62,
+139, 46, 41,175,208,236,218,244,229, 88,177, 72, 40, 88, 26,179,235,154,150,131,219,134,236,234, 24,102,235,123,115,151,205, 73,
+127,154,208,162,181, 88,128,147, 95, 46,199,163,223,174, 66, 75,242,241,207, 75,119,160,166,104,148, 23,151,224,242,135,159,193,
+218,205, 1,219,174, 29, 45,100, 24,230, 71, 75, 87, 99,129, 5,127, 95, 24,226, 34, 4, 65, 52,149, 99,175,176,137,239,238, 25,
+251,157, 1, 59,127, 5, 12,102,133, 55,107, 10, 94,113,113,113,209,245,235,119,112, 45,110, 53,226,227, 86, 35, 57,225, 17,242,
+243, 52,200, 43, 84,193,214,214,246,150,145,159, 54,206, 28,203, 42, 20,138,209, 75,151,125, 85, 32, 18, 91,161,239,192,129,112,
+119,113,133, 21,159, 7,142,142, 1,135,224,161, 74,102,143,180, 68, 5, 22,238,218, 87, 84,165, 80,140,110,162,147, 24,100,136,
+100, 16, 4, 1,161,173, 13, 4,214, 54, 16,218,216, 54,112, 35,138,108,109, 33,178,177, 5, 87, 32,104, 42, 24,254, 53,155, 85,
+ 85, 85, 99,198,142, 29, 91, 86, 81, 81,129,233,211,167, 35, 62, 62, 62,225,194,133, 11,182,137,137,137, 98,153, 76,214, 14,192,
+ 16, 0, 59,140,144,172, 6, 54,203,202, 50,228,172, 78, 61, 62,250,171,207,149, 42,157, 19,198, 77, 61, 4, 9,153, 11, 29,205,
+128, 5,224,233, 40, 64,175, 65,171, 80,164,233,137, 67,219,215, 40, 24, 74, 53,169, 81, 14,173, 6, 54, 89,150,101,221,220,220,
+ 94,171,131, 75,151, 46, 97,220,216, 49, 24, 58,106, 36, 92,218,248,192,117,208,219, 24, 58,253,159,216,190,125, 59, 72,146,132,
+179,179,115,227,142, 87,111,115,207, 67,240, 14, 60, 6,113,224, 49,136,221, 9,224, 2,152,178,111,223,190,111, 66, 66, 66,174,
+222,184,113, 99, 61,128,241,245,255,171, 30, 86, 52, 82,179,154,106,163, 37,115,230,204, 81,166,167,167, 67, 34,145, 64,167,211,
+225,198,141, 27,216,182,109, 27, 54,108,216,128,132,132, 4, 56, 57, 57,193,215,215, 23,106,181, 26,247,238,221, 83, 2, 88, 98,
+196, 38, 35,147,233,198,108,217, 18, 83, 18, 25,217, 7,187,118,253, 0,119,247,158,224,113,221,193,229,185, 64, 98,237,143,159,
+127,250, 6,111,189,213, 5,167, 78, 30, 46, 45, 46,209,141, 1,160, 51,227, 90, 82,221,185,115, 7,219,183,111,199,216,177, 99,
+243,198,141, 27, 71, 87, 84, 84,232, 21, 45,150,101,193,178, 44, 86,212,198,152,169,213,106,161, 33,155, 31, 45, 76,202,251,114,
+ 77,242,202,194,130,188,176,248,171,183, 38, 94,185,112, 9, 47,210,175,224,202,133, 75,248,253,202,205,168,194,130,188,176, 46,
+161,237,249,163,167,207,252, 98,207,177,163, 28,107, 91, 15,236, 57,118,148, 51, 97,214,231,107,186, 13, 29,176,196,212, 53, 95,
+219,142,108, 85, 81,225,162,181,235,191,175,210, 81, 42,114,221,119, 91,243,149, 50,233,146,122,215, 37,107,234,250, 84, 42,149,
+ 59, 84, 42,149,167, 74,165,242, 84,171,213, 75,178,178,178,250,206,159, 63, 95, 70,211,180, 94, 45,149,165,156,186,245,228,143,
+221,107, 93,157, 29,196, 61,187, 7,118,216,184,227,200,181,156,220,194,127,213,203,161,213, 84, 57, 85, 85, 74,213,152,145,163,
+ 39, 87,151,151,169, 17,254,121, 20, 24,145, 53,212, 52,160,101, 57,208, 17, 92, 60, 94,189, 17, 98, 71, 27,236,207,124,160,168,
+208, 82, 99,208, 48,135,150,177,115,255, 51,176,216,180,216,180,216,252,239,180,249,127, 25, 30,104,184,214,161, 71, 3, 69,203,
+212,148,202, 22, 45, 90,244,125,247,157, 65,232, 23,185, 20, 44,203,226,201,131,111, 81, 38,123,138, 22,238, 66,100,228, 84,134,
+ 3,136,111, 70, 97,114,178,114,115,195,230, 44, 89,122,108,220,144,129, 1, 65,109,218, 8, 91,183,246,134,196,213, 21,197,197,
+ 50,252,113, 59, 69,187,230, 64,108, 82, 45,201, 50,203, 49,201, 48, 76, 77,144, 59,128,129,115, 22,130,224,112,128,218, 52, 14,
+117, 29, 99,155,238, 61, 65,112,185,160, 89, 6,106,181,218,156,217,114, 47,159, 63,127, 62,102,210,164, 73,151,227,226,226,200,
+161, 67,135,118, 62,126,252,248,159, 89, 51, 15,213, 69,233, 87, 1, 68,174, 89, 52,227, 80,216,128,145,182,126,129,221,248,221,
+ 90,115, 64,105, 9,228,231,101, 35,238,216, 93, 42,229,206,133, 74, 86,167, 26,175, 40, 78,191,106,204, 22, 69, 81, 57,237,218,
+181,115,219,190,125,187, 62, 24,158,166,105, 20, 23, 23,227,214,173, 91,232,212,189, 7, 2,222,255, 16, 50,153, 12, 91,182,108,
+129,151,151, 23, 70,140, 24,129,210,210, 82,232,116, 58,115, 29,190, 52,128, 11,181, 47, 52, 34, 89, 68,237, 18, 64, 70,221,134,
+ 62, 62, 62, 2,149, 74,213,153,101, 89, 14, 65, 16,155, 53, 26,205,180, 69,139, 22,121,172, 93,187, 22, 29, 58,116, 64,113,113,
+ 49, 36, 18, 9,252,252,252, 32,147,201,112,247,238, 93, 90,161, 80,108, 71,205, 66,214, 50, 19,229,123,118,247,110,102,216,236,
+217,159, 30,251, 38,102,134,159, 74,221, 79,224,232,216, 27, 44,171,131, 76,150, 5,121,229, 13,106,213,202, 95,159, 23, 22,105,
+ 71, 3, 72, 55,243,156,151,207,156, 57, 19, 0, 68, 0,150,102,100,100, 60, 12, 8, 8,240, 51,164,104,153,131, 77, 71,242, 84,
+ 0, 14,140, 25,234, 57,183,178, 56,209,207,145,155,149, 25, 22,196,108,217,116, 36, 79,101,235, 89,189,186, 56, 43, 62, 77, 90,
+125, 97,251,158, 99, 71, 57, 83, 71,141,161, 91, 90,167, 71,137, 92,217, 35,102,152,102, 67, 66, 66, 90, 17, 68,105,219,162,146,
+167,247, 63,152, 62,227, 61, 59,190,242,108, 72,203, 18, 95,210,171,139, 40, 33, 33, 33, 19,205,156, 25, 90,139,180,188,188,188,
+190,139, 22, 45,186,192,178,108,131,216,132,162,226,210, 43,225,145, 51,217,242,242,138,135,178,212, 83,230,228, 82,187,123,247,
+ 65,194,192,160, 78, 93,142,126,179, 54,198,173,223,156,249,220,180,171,215, 0, 90,139,236,248,107,160,133, 26,102,227,205,139,
+133, 21, 20, 53, 10,150,172,240, 22, 88,240,183, 87,179,140,113,145,255,114, 12,135,129, 96,120,179, 79,198,167,109,139, 11, 29,
+252, 90, 15,241,106,233, 2, 0,200,200,204, 71, 70,102,222,111, 25, 47,242,134,154, 96,188,134,166, 87,234, 23,149, 38,106, 83,
+ 56,176,230, 45, 42,221,192,166,147,147,211,125, 46,151,219,178, 57,181, 65,211,116,126,113,113,113, 23, 51,203, 57,161, 77,155,
+ 54, 49,217,217,217,199, 24,134,153,219, 76,182,223,164,205,186, 69,165, 73,174, 96, 16,171,211,116, 2, 0,130, 43, 48,103, 81,
+233,250, 54, 59, 89, 91, 91,239,224,241,120, 94,117,237, 88, 23,131, 69,211, 52,135,162, 40, 17, 77,211, 28, 0, 4, 73,146, 58,
+ 30,143,167, 34, 8, 66,167,211,233,114,212,106,245, 12,188, 74, 56,106,236,220, 77,118,244,181, 68, 11, 77, 40, 90,151, 0, 32,
+ 61, 61,189,189,131,131,195,120,130, 32,198,178, 44,235, 47,151,203,213,203,150, 45, 75,136,141,141,173,108,211,166,205,176,225,
+195,135, 19,137,137,137, 72, 74, 74, 98, 75, 74, 74,142,212,170, 88, 25,205,188,150, 72,161,144,243, 15, 71, 71,114, 56,203, 34,
+ 4, 44, 8,130,196,227,138, 10,230,172, 66, 65,255,171,150, 48, 54,247,250,172,195,196,214,173, 91,255,154,153,153,201, 51,164,
+164, 26, 58,247,198,248,118, 73,224,210,240, 62,125,198,220,250,253,247,227, 95,174, 73, 94, 89,127,223,172,145, 14, 31, 76,248,
+108,206,183, 7,182,126,247,229,247, 39,202,118,153, 83,206,206,157, 59,251, 16, 4, 49, 30, 64, 16,203,178,237, 88,150, 16, 17,
+ 4, 91, 70, 16, 68, 50,128, 68,141, 70, 19,151,146,146,242,242, 79,156,251,155,140,112, 13,217,212, 47, 42, 13,154, 14,166, 1,
+214,204, 69,165,255,127,151,211, 98,211, 98,211, 98,243, 63,103,243,255, 50, 62,110,226, 59,243, 50,195,215, 33,227, 69,222,208,
+140, 23,121,104,215,174, 29,251,236,217,179,102,145, 52, 67,157, 52, 77,211, 7, 21, 10,197,193, 63, 99,164,164,164,164,219,191,
+185,242, 14,100,102,102, 30,248, 43, 13,214, 18,169,149,181,175, 55,197,227,170,170,170, 30,230, 30, 76, 81,212,191,163,110,136,
+ 90, 53,235,107, 67, 7, 12, 25, 50, 36,155,162,168, 75, 0,114, 9,130,176, 7, 80, 74, 81,212, 5,157, 78, 87,248,236,217,179,
+110, 27, 55,110,172,203,124,191, 10,192,253, 55, 44, 7,163, 86,211,251,243,243,233,253,255,134,115,220,175,209,104,230, 57, 57,
+ 57,249,170, 84, 42,129, 74,165,226,215,159,124, 32, 22,139,101,198, 2,226,235,195,222,134,216,205,231,150, 57,217,219, 16,141,
+137, 20, 28, 91,224,168,178, 58,169,131, 99, 11, 28, 53,183, 96, 15, 31, 62,204, 8, 9, 9,217, 71,146,100, 27,150,101,221, 0,
+214,142,101, 33, 99, 89,182,152,251,255,216,187,238,184, 40,174,182,123,102,102,103,251, 46,176, 75, 93,138, 5, 20, 68, 64, 1,
+ 11,246,136,154, 24,123,137, 88,162, 98, 47, 49,106, 98,212,168, 81,163,177,198,215,196,158,216,123,111, 81,176,247, 94,177, 43,
+ 86,164, 55,169, 11,203,246,157,249,254,128, 37,168,148, 5, 77,222,228,253,246,252,126,227, 58,195,238,217,123,103,231,222,123,
+238,115,159,251, 60, 28, 78,210,227,199,143,147,254, 65,157,144,198,200, 48,139,141, 58,221,159,126,135,214,221,133, 86, 88, 97,
+197,255, 14,202,244,209,226, 84,150,233,197,139, 23,132,245,126, 90, 81, 82,108,149,247,199,184,184, 56, 45,128,171, 69,199,187,
+184, 13,160,203, 63,189,130, 41, 41, 41,193,101,253,205, 82,145, 5, 20,250,108, 1, 15, 75,141,206, 62,107, 69,118, 30, 86, 28,
+152, 84,217,178,221,187,119, 47, 30, 22, 46,177, 91, 97,133, 21, 86, 88,241,151,225,195, 45, 90, 86, 88, 97,133, 21, 86, 88, 97,
+133, 21, 86,148,138,181, 37, 4,215, 91,214, 45, 2,101,239, 28,168,204,218,107, 85,118, 31,156,182,114, 90, 57,173,156, 86, 78,
+ 43,167,149,211,202,249,255,142,243,127, 21,239,137,172,191, 3,214,173,175, 86, 78, 43,167,149,211,202,105,229,180,114, 90, 57,
+255, 63,136,172,119, 15, 0,214,165, 67, 43,172,176,226,255, 49,246,238,221,107, 81, 82,209,190,147,215,119,150, 72,100, 51,242,
+149,185, 11,119, 45, 30,114,208,124, 61, 44, 44,204,100,189,139, 86, 88, 97, 5,170,226, 12,239,233,233,238, 71,154,152,230, 44,
+ 75, 82, 44,201, 26, 8,165,122,247,171,236,236,183,194, 14,120,120,120,216,209, 36,186, 16, 44, 43, 38, 8,198,196, 80,228,149,
+152,152,196,199,149, 40, 24, 79, 38,147,125,205,229,114,219,233,116, 58,119,146, 36, 19,181, 90,237,233,130,130,130,149,120, 63,
+112,225,127, 13, 62, 62, 62,253,206,159, 63,111,215,162, 69, 11,173, 80, 40, 52,170,213,106,206,241,227,199,249, 29, 58,116,200,
+121,249,242,101,149,118, 36,186,186,186,182, 89,191,126,189,103,251,246,237, 81,187,118,109, 85,159, 62,125,184, 77,155, 54,229,
+ 14, 27, 54, 44, 38, 57, 57,249,108, 37,233,252, 8,130,216, 74, 16, 4,197, 48,204, 64,252, 25,186,225, 99,131, 36, 73,114, 36,
+ 65, 16, 61, 88,150,245, 34, 8,226, 21,203,178, 7, 25,134, 41, 47,112,107,121,248, 2, 64, 71,146, 36,131, 1,128, 97,152, 59,
+ 0,142, 2,150,239,188,251, 59, 57, 69, 34, 81, 16, 0, 20, 20, 20,220,253, 88,156, 4, 65, 4, 1, 0,203,178, 85,229, 28, 44,
+ 20, 10,135, 3,128, 90,173, 94, 7, 11,210, 65,189, 11,118,181, 47, 27, 60, 59, 26, 0,112,231, 71, 95, 0, 64,101,206,137, 81,
+209, 68,101,190,171, 52,190,202,112,148,130,142,253,251,247,159,191,125,251,246, 31, 1, 28,250, 43, 30,124, 23, 23,143,149,191,
+ 44, 91,235,250,205,215, 67, 23,162, 48, 35, 68,249, 13, 18,248,148, 71, 81, 93,117, 38,211,165,199,192, 94, 0, 28,185, 92,222,
+143,199,227,181,210,233,116, 10, 14,135,147,162,211,233, 46,230,230,230,238, 68, 57, 25, 16, 44,190,175, 79, 32,211, 23,192,133,
+ 96,254,204,243,198,146,208,114, 69, 72, 37,234, 34,251, 31,208,141,146, 0,198, 23,213,117, 3,202, 14,231, 81, 94,231,243,141,
+171,171,107, 15,165, 82, 89, 64, 81, 20,139,194, 93,207,133,255, 20,254,157, 96, 24, 38, 61, 43, 43,107, 96, 69, 92,226,106,168,
+195, 19, 19, 91, 77, 6,168,141, 90,118,180, 42, 1,209, 18, 15, 52, 99,129,129, 44, 80,147,164, 72, 71,134, 97, 82, 0,156, 37,
+141,136,200, 79,198,139,127,232,224, 94,189,232,190,214, 40, 58,167, 1, 56, 3,184, 15,224, 27, 0,249, 86,253,243,183,225, 93,
+103,248, 35, 0, 82,138,133, 86,137,112,247,173, 59,119,238,124,193,211,211,221,175, 87,247,158,243, 71,141, 28, 77, 80, 20,137,
+135,143, 30,113,190, 28, 56,248, 51,153, 76,230, 38,209,106,235,130, 32,152, 2,129,224,161, 82,153,155,180,119,231,118,169,111,
+157, 58, 38,147,137,193,234, 53,191,119,216,247,199,129,105, 22,138, 45, 31, 23, 23,151,173, 83,166, 76,113,233,218,181, 43,229,
+226,226,130,216,216, 88,187, 93,187,118,213, 89,177, 98, 69,239,236,236,236,129, 0,158, 85,161,178, 45, 93,228,228,103, 82, 33,
+209, 22,121, 38,228, 25,112, 38, 85,141,147, 0, 46, 85,245,238, 21, 20, 20,140, 45, 40, 40, 8,105,212,168, 17,187, 97,195, 6,
+ 98,208,160, 65, 44, 65, 16,132, 90,173,222, 12,160, 74, 66, 75, 44, 22,175,106,223,190,189,183,183,183,247,171,151, 47, 95,118,
+220,179,103,207,209,240,240,112, 47,177, 88,252, 28,128, 79, 37,233, 54,101,102,102, 6,170,213,106,184,187,187,111, 0,208,224,
+ 47,120,136, 8,138,162, 14,186,185,185,177,139, 22, 45, 58, 20, 24, 24,232,156,149,149,101,156, 52,105, 82,187,235,215,175,119,
+ 48,153, 76, 93, 43, 33,182,100, 4, 65,172,113,118,118,118, 88,184,112,225,139,134, 13, 27,222,231,243,249,188,231,207,159,139,
+ 38, 76,152,240,237,179,103,207,122,179, 44, 59, 18,168,212, 0, 33, 35, 8, 98,141,171,171,171,195,252,249,243, 99,131,131,131,
+ 31,114,185, 92,238,243,231,207,197,223,127,255,253, 55,209,209,209, 85,226, 36, 73,114,117, 72, 72,136,236,199, 31,127,124, 82,
+167, 78,157,171, 20, 69,241, 18, 19, 19,201, 89,179,102,125,125,234,212,169, 48,134, 97, 70, 85,165,156, 78, 78, 78,178, 89,179,
+102, 61,105,218,180,233,117, 46,151,203,125,250,244, 41, 57,101,202,148,175, 95,188,120, 97,113, 57,229,114,121, 40, 65, 16,107,
+ 83, 83, 83, 57, 0,160, 80, 40, 26,219,216,216,172, 40,153,211,210, 28,138,194, 96, 48,228,105, 52,154,254, 89, 89, 89,165, 6,
+194, 29, 52,117,121, 23, 0, 88,161, 55,159, 23,190, 86,116, 14,172,142,176,164,210, 65, 46,133,113,241,126, 81, 13,233, 14, 0,
+253,138, 82,133,255,162, 2, 56, 28, 14, 19,228,242, 13,123, 55,181, 82, 33, 99,186,181,105,211,102,214,217,179,103,127,111,221,
+186,245,247,219,182,109,115, 74, 72, 72,248,249,210,165, 75, 30,125,251,246, 29,116,230,204,153, 5, 25, 25, 25,251, 62,214,195,
+207,227,242,249, 4, 73, 64, 40, 16,217, 88,242,126,154, 36, 59, 95,237,214,109,248,186,167, 79,131, 87, 68, 71,123,170, 20,138,
+144,113,227,198, 57,247,236,217,147,244,240,240,192,139, 23, 47,236,183,109,219, 86,119,221,186,117, 61,114,114,114,198, 3,136,
+251, 16,145,165,202, 65, 61,173, 14,193, 44, 11,187,226, 6, 75, 32,135,175,199, 29,246, 9, 30,252, 3,196,214,204, 77,155, 54,
+253,248,226,197, 11, 44, 88,176, 0, 0, 86, 86,242,243, 19,186,117,235,214,233,192,129, 3,194,189,123,247, 10, 27, 53,106, 4,
+ 23, 23, 23, 20, 77,166,138, 3, 83,123,122,122, 90,118,207, 24,252,178,244,232,144, 6, 15,179,142, 97, 85,207,212, 5, 66,119,
+ 24,155,117,243,238,209,121, 80, 48,108, 29, 69, 16, 72, 56,200,201, 84, 6, 60,189,147,208,254,220,158, 23, 63,191,136,122,179,
+ 80, 21,143,153, 40, 59, 38,223,127, 5,246,246,246, 27, 98, 98, 98, 66,197, 98,241, 91,215, 95,189,122, 21,228,237,237,157, 11,
+224,187,202, 10, 55, 71, 71,199, 29, 12,195,104, 51, 51, 51,135, 2,128, 84, 42,221, 46, 22,139,101, 41, 41, 41,211,254,170,137,
+140, 25,239,106,145,127,185, 69,171,216, 95,171,180, 92,135, 4,105, 98,154,143, 26, 57,154,232,211,175,111,234,139, 87, 49, 12,
+135,230,245, 59,126,226,132,200,207,207,143,212,174, 92, 9,227,155, 55, 48,124,251,109,179,211,167, 79, 27,194,250, 13, 80,211,
+ 20,177,201,203,179,166,104,247,206, 93, 46, 7,246,239,107, 14,160, 34,161,197,115,113,113,217,122,254,252,121, 55, 79, 79, 79,
+228,228,228, 32, 54, 54, 22, 42,149, 10,189,123,247,166,155, 55,111,238,214,171, 87,175,173,185,185,185, 45, 42, 97,217,114,174,
+237,206,137, 28, 57,184,167, 79,135,207,154,139,221, 60,106,129, 77,213, 32,225,101,116,163,200,243,215,199,109,218,127,244,217,
+139, 92,182, 51, 74,207,141, 84, 46, 50, 50, 50, 38,247,232,209, 99,127,104,104,168, 35,159,207,135,171,171, 43,209,181,107,215,
+244,228,228,228,217, 85, 86, 45, 69, 41,108, 72,146, 52,149,124, 45, 37, 61,144, 37,112,151,201,100,144,201,100, 0,224,246,161,
+ 51, 79, 59, 59,187,149, 82,169,180,151, 82,169, 84,147, 36,201, 18, 4,193,234,116, 58,161, 76, 38,187,247, 36,250,153,171, 86,
+171,173,189,120,233,186,101,109, 90, 6,218,156, 58,117, 10, 61,123,246,100, 79,158, 60, 57,210,210, 60,117, 4, 65,172,233,209,
+163, 71,193,140, 25, 51, 52, 47, 94,197,186, 61,121,246,138, 16, 11,120,140,131,131, 3,125,243,230, 77,206,146, 37, 75, 4,179,
+102,205, 90,195,178,108,175, 74,220,207, 53,125,251,246,213, 79,156, 56, 49,229,233,139, 24,167, 7, 79, 94,176, 18, 1,109,116,
+112,176,167,174, 95,191,206, 84,133,147, 36,201,213,147, 39, 79, 86,142, 28, 57, 50, 59, 51, 43,215, 37, 91,153,207,242,105,202,
+224,226,226,194, 57,116,232,144,118,199,142, 29,228,240,225,195, 87, 51, 12, 19, 86,137,251,187,186,107,215,174,121, 83,166, 76,
+201,121,254,234,181,203,131,199,207, 32,226,211, 6,103,103, 39,234,214,173, 91,250,197,139, 23,147,115,231,206,181,168,156, 98,
+177,120,203,158, 61,123, 56,135, 14, 21,246,125,215,174, 93, 35,189,188,188, 68, 37,223,163,214,104, 65, 18, 64, 70, 70,134,168,
+105,211,166, 91, 0,188, 23,220, 55,120,118, 52, 6, 77, 5,198,142, 29,155, 82,217,135, 37, 88, 49,174,194,247,152,126,247,101,
+151, 20, 12,233,206,225,112,152,225,195,135,167,190,251,119,141, 70, 67, 0,232,138,159, 45, 23, 91, 29, 59,118,252,225,200,145,
+ 35,181,182,109,219,246,235,142, 29, 59,116, 0, 32, 16, 8, 28,118,237,218,181,160,119,239,222,232,221,187,247,140,125,251,246,
+125, 52,161,101, 98, 77,122, 0,224, 11,248,252,232,232,104,194,215,215,183,220,136,251,122,134,185,189,238,233,211,134, 95,249,
+250, 54,202, 98,152,218,220, 14, 29,242, 39, 76,152,144,161, 84, 42, 17, 27, 27, 11,189, 94,143, 65,131, 6, 81,173, 91,183,118,
+237,221,187,247,242,188,188,188, 47, 0,232, 45,120, 38, 23,187,185,185,141,200,205,205,205, 55, 91,117, 90, 12, 52,113, 90, 5,
+ 25,249,245,107, 27,120, 92,202,200,237,242, 45, 67,156, 92, 73,168,124, 61,113, 25, 0,184, 5,120, 83,201,201, 64,169,176,113,
+135,167,137,198, 92, 71,119, 97,155, 55,113,234,159, 84,241,229,138,165, 47,196, 98,113,119,149, 74,181,175,104,112,246,233,220,
+185, 51,174, 95,191, 14, 0,205,139,132, 86, 27,146, 36,191,100, 24,102, 61,128,242, 82,185,141,235,214,173,219,167, 7, 14, 28,
+144, 2,192,190,125,251, 96, 48, 24,224,229,229, 5, 46,151, 11, 30,143, 7,154,166,139,179,131, 88, 8,133,163,163, 3, 28,108,
+105,200,228,226, 14,223,255,214,141, 83,205,207, 6,233,166, 71,200, 98,115, 96,100,181,224,218,139, 81,167,189, 29,130, 63,107,
+ 67, 70,172,126, 56, 45, 98,213,147,134, 5, 36,186, 32, 14,218,127,202,200, 78,146, 36,255,254,253,251,112,117,117,125,235, 58,
+ 69, 81, 0,208,170, 10,148, 51, 94,189,122,213, 52, 42, 42, 10,161,161,161, 51,234,213,171,247,249,133, 11, 23, 92, 50, 51, 51,
+ 17, 26, 26,186, 60, 49, 49,241,208, 95, 93,167,146, 90,228,127,197,212, 69,190,163, 36, 91, 23,206,130, 73,138,162, 72,196,188,
+138, 53,132,134,182, 13,143,143,143,151,132,132,132,144, 52, 77, 67,117,246, 44, 52,183,110, 65, 34,145,160, 71,143, 30,244,197,
+139, 23,109,108, 36, 54,195, 94,199,188,206,163, 40, 18, 44, 75, 86,232,243, 32,147,201,190,158, 54,109,154,139,183,183, 55,140,
+ 70, 99,113, 68,115,163,209,136,132,132, 4, 72, 36, 18, 12, 28, 56,208, 73, 36, 18,125,109, 97, 61,106,248,120, 57,221, 57,127,
+116, 77,131, 9,163, 58,138,125, 68,167, 32, 78, 24, 15,201,190,175, 80, 55,249, 56,166,116, 15, 17,159, 92, 53, 35,184,150,171,
+252, 78, 9, 19,171,197,208,106,181,151, 31, 62,124, 56,236,194,133, 11, 12, 0,156, 59,119,142,125,242,228,201,200, 15,153,133,
+ 50, 12,131,156,156, 28, 48, 12, 67, 21,157,155, 95,255,171,207,131,141,141,205,234,207, 63,255,188,111, 92, 92,156,240,216,177,
+ 99,246,241,241,241, 14,175, 95,191,118,244,241,241,225, 44, 88,176,224,136, 70,171,167, 12, 38, 86,103, 52, 25,242, 82, 30, 61,
+122,149,157,150,118,103,227,198,141,106,130, 32,122, 88,248, 29, 95, 40, 20, 10,251,169, 83,167,130,160, 69,141,235,212,173,231,
+ 77,209, 66, 91,146,230,217,170,213, 26, 83, 76, 76, 76,194,212,169, 83,107, 6, 6, 6,186,162,112,121,205, 34, 78, 87, 87, 87,
+135,137, 19, 39,130,195,151, 6,213, 15, 12,174,197,227,139,165, 20, 45,148,134,132,132,180,126,245,234, 85,242,148, 41, 83, 20,
+141, 26, 53,170, 20,103,163, 70,141,100,195,135, 15, 55, 10,132,210,166,158,158, 94,117,235,251,215,237,228,227,227,211,157,195,
+225, 24,223,188,121, 19, 55,112,224, 64, 69,151, 46, 93,156, 43,195,233,228,228, 36,155, 50,101,138,209,163,186, 87,251,246,159,
+126,214,132, 43,148,218,114,120, 98,187,130, 2,141,233,233,211,167,113,211,167, 79, 87, 4, 5, 5, 57, 89,194, 89, 80, 80, 64,
+ 59, 56, 56, 32, 32, 32, 0,126, 94, 94,200,205,205,197,129, 3, 7,176,105,211, 38,172, 95,191, 30, 59,119,238, 68,195, 22,159,
+ 65, 42,149, 34, 57, 57, 25, 74,165,146,254,187, 31, 40,211,239,190,236, 10,221,136,174,163, 71,143, 78, 30, 62,124,120,170, 80,
+ 40,100,222, 61,228,114,185,169,127,255,254,105, 3,191, 95,218,213,188,180, 88,129, 37,235,254,209,163, 71, 95,110,219,182, 13,
+126,126,126,104,223,190, 61, 15, 0,190,254,250,107, 94,239,222,189,177,103,207, 30,236,219,183,239,177,183,183,247, 21, 0,221,
+ 44, 41,231,192,129, 3, 91,132,133,133, 93, 10, 11, 11,187,219,167, 79,159,181, 35, 71,142,124,107,228, 74, 73, 78,188,173,211,
+233, 16, 24,220, 72, 52,103,195,141,254, 21,241, 61, 1,182,173,141,142,222,180,240,209,163,184, 25,126,126,118,213, 95,191,150,
+111, 94,188,216,193,156,164,219, 96, 48, 32, 33, 33, 1, 50,153, 12,253,251,247,119,224,243,249, 3, 45, 40,230,146,110,221,186,
+ 13,142,143,143,151,172, 91,183, 78,113,247,238, 93,215,148,148, 20,197,153,211, 39, 28, 39,125,247,181,212, 86,194,227, 37,191,
+ 97, 9, 0,120,157, 12,113,116, 12, 90,176, 44,236, 74, 46, 39, 86, 9, 10, 8,133,238, 88, 81,171,133,221,179,137,123,130,250,
+ 76,137, 12,118,144, 41,248, 83,203,249, 68,253, 69,139, 22,237,141,136,136,232,215,162, 69,139,253, 0,132,165,188, 71,208,176,
+ 97,195, 3,123,246,236, 25,220,178,101,203,203, 0, 2,202,156, 69,186,187,247,248,227,143, 63,236,205,231, 14, 14, 14, 16, 8,
+ 4,239,137, 44, 46,151, 11,146, 36, 43, 93,189,121,187,250,113,228,117,181,120,152,125, 20,123, 22,221,199,162, 14, 79,153,249,
+205, 94,107, 87, 14,140,198,201, 61,247,145,142,251,232,248, 85, 45,244,155, 30,216, 78,100,194,220,127,210, 0,254,230,205,155,
+ 47, 91,181,106,181,183, 99,199,142,218,168,168, 40,188,121,243, 6,110,110,197,115,237,212, 42, 80,202, 69, 34, 17, 60, 60, 60,
+224,237,237,221,239,226,197,139, 46, 6,131, 1,175, 95,191, 70,122,122,250,157,191,163, 78, 37,181,200,191, 12,239, 58,194, 31,
+121, 79,104, 21,229, 22, 58, 15, 0, 44, 65,168,238, 63,124, 72, 83, 60,222,128,237, 59,118,240,185, 92, 46,226,226,226,240,248,
+241, 99, 20,156, 57, 3,245,213,171, 72, 75, 75, 67,126,126, 62,156,157,157,177,102,195, 6,177,206,196, 14,121,250,236, 25,197,
+146,108, 73,127,131, 82,183,120,242,249,252,118, 61,123,246, 44, 83,144, 37, 39, 39,163, 99,199,142, 52, 69, 81,165,237,106,120,
+151,147,112,117, 36, 34,206,236,159,163, 80,240, 30, 3, 47, 38, 0,121,119, 0, 86, 11, 24,117, 64,210, 3,224,200,108, 84,207,
+143, 38, 78,204, 9,119,113, 19,113, 34, 74, 81,202, 21,109, 69,245,242,245,245, 93, 63, 96,192, 0, 18, 0,218,180,105, 67,248,
+250,250,174, 5,224, 85,206,103, 78, 87, 48, 72, 94,207,206,206, 70,239,222,189,237,107,213,170,117,186,119,239,222,246,230,235,
+ 85,229, 52, 91,147,253,252,252, 50, 5, 2,193, 78,192,162, 14,182,152,211,206,206,110,101,199,142, 29,123,237,216,177,131, 11,
+ 0,231,207,159, 71, 68, 68, 4, 30, 61,122,132,231,207,159, 51,193,193,193,142, 75,215,239, 93,189,242,247, 45, 75,186, 55, 15,
+116,109,221, 56,184,174, 36, 63, 59,223,217,217,185, 57,203,178, 94, 22,150,179,227,236,217,179, 31, 63,121, 25,103, 75,114,104,
+ 14,151,230,240,109,108,196,206, 50,169,216, 93, 46, 18,184,241, 73, 66, 82, 80, 80,144,186,115,231, 78, 6, 64, 71, 75, 57,231,
+204,153, 19,243,228, 69,156, 29, 65,114, 56, 52,135,230, 74, 36, 34,187, 14,237, 67, 27, 1, 0, 23, 44, 87,169, 84,166,109,218,
+180, 73, 95, 25,206, 31,127,252,241, 97, 86, 78,190,140, 67,211, 52,135, 67, 21,223, 75,177, 80,232, 40,226,243,121, 90,173, 54,
+105,217,178,101,234,202,112,206,158, 61,251,241,211,151,241,114,146, 32, 40,130, 32, 57, 54, 82,177,189,189,173,200,209, 81, 34,
+116, 16,113, 40,158, 82,169, 76,218,186,117,171, 69,156,122,189,158,155,150,150,134, 39, 79,158,192,163, 81, 35,156, 58,117, 10,
+213,170, 85, 67,239,222,189,209,183,111, 95, 8,133, 66,180,105, 90, 15, 83,167, 78,197,203,151, 47,161,215,235,249,165,113,154,
+253,164,222,133,171,171,107, 84, 69, 15,207, 59,159,125,171,156, 65, 46, 96, 87,232, 70,116, 45, 41,176,202,226,151,203,229,166,
+210,172, 93,239,114,118,236,216,241,135, 51,103,206,212,218,186,117,107,215,129, 3, 7, 94,222,186,117, 43,154, 52,105,130, 39,
+ 79,158,160,102,205,154,216,188,121, 51,250,246,237,123,121,249,242,229, 93,163,162,162, 2, 61, 61, 61,167, 85,196,217,167, 79,
+159, 49, 65, 65, 65,103, 83, 83, 83,155,102,101,101, 5, 28, 56,112, 96, 72,143, 30, 61, 98,250,245,235,215,182, 88, 48, 26, 12,
+ 59,142, 28,222,143, 78, 93,123,162,142,127,192,234, 65,211,182,213,171,160,109,178,143,128,181,155, 82, 82,222,236,208,104, 10,
+122,211,180, 72,116,227,134,124,223,239,191, 59,148,204, 44,144,148,148,132, 46, 93,186,208, 92, 46,183,101, 5,229, 92,212,189,
+123,247,222, 7, 14, 28,144,153,173, 58, 87,175, 94,197,131, 7, 15, 16, 27, 27,139,156,156, 28,180, 29,153,143,209, 11, 10,185,
+ 71, 47, 96,241,217,215,172,184,138,125, 72, 49,132,213,224, 98,111,195,185, 50,100, 89,157,175, 71,172,246,227, 72,228, 52,182,
+127,255, 28, 25,175,181,251,202,224, 36,154, 54,109,186, 45, 44, 44,140,208,233,116,208,233,116, 58, 0,165, 70,245,117,115,115,
+ 19,212,175, 95, 31, 35, 71,142, 36,109,108,108,150,151, 85, 78,149, 74,165, 61,122,244, 40, 6, 14, 28,136,241,227,199,163,118,
+237,218,144,201,100,160,105, 26, 91,182,237,118,232, 59,100,148, 79,131, 22,173, 2,253, 26, 52,169,159,167,165, 26,209, 66,217,
+240, 50,172, 33,165,214, 61,223, 41, 10, 15, 95, 95,195,138,174,137,204,205,205, 5,249,147,190,252, 79,244,211, 11,105,143,166,
+133,173,125,200, 94,107,150,177,237,155,120,164, 25,158,160,101,239,234,240, 12,146,125, 43,246,128,111, 85,239,167,133,168, 20,
+103,189,122,245, 90,220,188,121,147,223,170, 85, 43,196,197,197,129,166,139,231, 83,166, 15, 41,231,236,217,179,249, 26,141, 6,
+247,238,221, 67,120,120,120,146, 94,175,255,246, 67,202, 89, 25,139,150, 89,139,252,203,176,246,157, 35,165, 44,139,214,108, 0,
+ 48, 48,136, 24, 16, 62,164, 32, 50, 50, 82,196,227,241, 16, 23, 23,135,148,148, 20,108,217,180,201,212,198,201, 41,175,189,155,
+155,114,203,166, 77,172, 78,167, 3,203,178,240,245,245, 69,175, 94,189,132, 95,244,238,151, 78, 40,213,187, 45, 88,230, 81,152,
+215,215,135, 12, 25,242,222,223, 39, 77,154, 4, 27, 27, 27, 16, 4,225, 98, 65,229,194,198,205,238,238, 46,243,180, 75, 99, 83,
+183,100,129, 18, 0, 28, 41,192,177, 1, 4,182, 0, 95, 10,240, 68,208, 70,157,205, 34,217,246,177, 61, 91, 14,117, 3, 80,153,
+165, 30,184,186,186,206, 56,123,246,172, 99, 84, 84, 20,171, 84, 42,145,146,146,194,206,159, 63,223,209,213,213,117, 70, 85,127,
+145,228,228,228, 57,157, 58,117, 74, 11, 15, 15,183, 61,126,252,184, 71,120,120,184,109,167, 78,157,210,146, 7,149,255,129, 0,
+ 0, 32, 0, 73, 68, 65, 84,147,147,231,124,200, 47,205,229,114,169, 71,143, 30,201,231,206,157,219, 23,192,109,127,127,255, 76,
+ 55, 55,183,219, 40,116,154, 44, 23, 82,169,180, 88,100,153,173,107, 28, 14, 7, 52, 77,195,213,213, 85,151,149,149,101,106,217,
+192, 75,232,107, 75, 26, 92,249, 92,161, 92, 40,112,151,218,216,134,100,102,102,222, 39, 8,226,149,133, 75,124, 65,141, 27, 55,
+166, 77, 44,205,140, 30,208,198,245,235,193,161, 78,191,205, 29, 94,109,217,156, 17,110,139,102, 13,243,157, 51,185,127, 40,201,
+ 48,154,154, 53,107,186,152, 29,218, 45, 48,159, 7, 55,108,216,144,195,128,198,147,103,177,105,113,137, 73,121,159,182,110, 90,
+108,185,244, 11, 10,110,239,232,232,216,202,215,215,183, 33, 65, 16, 22,109, 73, 22, 10,133, 65,117,234,212,225,144, 20, 77,216,
+203,164, 30, 82,137,208,185,120, 9,197,206,174,153,220,209, 49,140,100,217, 92,133, 66,225, 36, 20, 10,131, 42, 81,119, 14, 3,
+ 46,156,157,228,182,142, 14,118,146,246,161,205,107, 55,109,214,212,167, 94, 72,147,166,254, 13, 26,126, 65, 24,141, 74, 47, 47,
+ 47, 39,179,147,124, 5,150, 86,193,142, 29, 59, 48,119,238, 92,212,175, 94, 29,110,110,110,112,114,114,194,213,171, 87,113,243,
+230, 77,200,100, 50,164,167,167, 99,241,226,197, 56,120,240, 32,244,122,189,180,178,207,147, 37, 98,171, 60, 24,141, 70,242, 93,
+129, 85, 22,191, 80, 40,100,204, 78,242,101,225,232,209,163,219,204,150,172,111,190,249,166,197,210,165, 75, 47, 71, 71, 71, 67,
+ 34,145,224,230,205,155, 24, 50,100,200,229,229,203,151,183, 24, 53,106, 20, 54,109,218,132,152,152,152, 13,229,241,245,233,211,
+103,214,176, 97,195,150, 93,184,112,129,116,118,118,134, 76, 38, 67,247,238,221,177, 97,195, 6,142,209,104,220, 24, 22, 22,118,
+ 55, 44, 44,236,174, 41,225,228, 15,123,215,207,191,250,240,254, 93,140, 25, 55,145,167, 51, 26,166, 88, 80,125, 86, 45,145,228,
+ 25, 91,181,202,218, 99, 48, 20,244,225,114, 69,182,119,239,202, 35, 54,110, 44, 22, 91, 83,167, 78,133,173,173, 45, 80,232,192,
+140,114,172, 58, 35, 14, 30, 60, 88,220, 31,218,219,219,131,199,227,129,203,229,130,166,105, 80, 20,133,211,171,197,248,125,106,
+161,190,248,125, 42,129,147, 43, 9,213,135,252,118, 34, 55, 4,200,156,121,119,191,218,236, 31, 24,208,214, 30, 87,119,165, 98,
+126,167,168,196,155,123,222, 76,208,164,227,151, 50, 62,214, 96,210,164, 73,126,233,233,233,184,117,235, 22,110,221,186, 85,150,
+ 5, 72,115,248,240,225,159,243,243,243,225,233,233,137,110,221,186,181, 2,208,168,140,118,131,134, 13, 27,162, 75,151, 46, 8,
+ 13, 13, 69,253,250,245,161,211, 27,233,176, 1, 35,234, 60,138,121,227, 54,127,241,124,209,217,115, 7,200,203,151, 47, 80,219,
+246,159,180,109, 26,250,217, 50,174, 84,113, 29, 66,123,133, 37,245, 44, 48,101, 34, 72,209, 1,107,207,140, 35, 87,156, 15,151,
+108,137, 88,225, 37,149, 74,137, 59,183,238, 26,182,172,218, 19, 31, 32,238,150,126,125, 87, 38, 10,136, 84,180, 29,236, 73, 50,
+ 64,175,127,202,200, 46, 16, 8,150, 94,184,112,193, 69,175,215,227,225,195,135, 24, 63,126,188,230, 3, 41,139, 13, 32, 30, 30,
+ 30, 56,127,254, 60,250,247,239,175, 73, 75, 75,187,246,119,213,169,164, 22,249, 95, 1,167,132,130, 44, 70, 66, 66, 66,142, 76,
+ 38,115,171, 83,167, 14,169,211,233, 10,151, 36,246,237, 51,173,223,184,241,136, 70,163, 25, 7,128,187,242,183,223, 86,187,185,
+187,135, 14, 24, 56,144, 48, 24, 12,232,212,169, 19, 47, 50, 50,210,254, 85,122,122,158, 5, 3,206, 91,223, 55,104,208, 32, 44,
+ 93,186, 20, 0, 48,118,236,216, 98,211, 58, 97,129,195,146,196, 22, 29,219,119,110,104,147, 32, 94, 97,163,111,102,200,175,241,
+ 82,122, 93,156, 47,108, 8,146,199,129,128, 2,163, 55, 24,159,167,247,184,253,242,121, 93, 63, 97, 86,102,205,118,254,159, 96,
+253,169,173, 29, 11, 76,154, 61, 22,119, 56, 34, 81, 99,137, 68,130,219,183,111,103, 53,108,216, 48,135,101, 89,219, 57,115,230,
+ 56,136, 68,162,198, 31,112,239, 95, 63,123,246,172, 85,243,230,205,191, 38, 73,178, 29,195, 48,167,211,210,210, 86, 2,120,109,
+225,231, 71, 3,248, 17, 64,241,204, 82,167,211,129, 36, 73,176, 44,139, 62,125,250, 96,234,212,169,126, 15, 30, 60,192,217,179,
+103,229,237,218,181,187, 14, 32, 7,192, 80, 0,165, 90,205,148, 74,165,250,230,205,155,194,179,103,207,130, 97, 24,200,229,114,
+216,216,216,128,207,231,163,123,247,238,146, 41, 83,166,180, 61,113,226, 68,186,178, 70, 53, 74,144,146,164,226, 75, 36, 82,184,
+184,181, 28,213,239,203,104,150,101, 15, 86,162,115,224, 9, 57, 70, 13, 97,210,146,139,102, 46, 39, 69, 92, 46, 33,224,114,192,
+103, 10,240,195,207,243, 8, 46,107,226,160,146,235,243, 92, 46,151, 43,229, 67, 71,241, 40,131,136, 0,251, 49, 26, 7, 69, 81,
+ 60, 1,183,108,127, 12,154, 36, 73,146, 36,185, 0, 44, 78,218,199,231,243,185, 82, 62, 91, 38,167,144, 34, 40,130, 32,120, 40,
+ 99, 39, 90,144, 11, 88,179, 21,137, 55,238,149,182,164, 40,110,217,178, 37,142,156,189,141,125, 17,167,145, 17,119, 31,211,191,
+255, 6,141, 26, 53, 66,100,100,100,185,101, 50,251,104,149,101, 93,118,117,117,141, 74, 78, 78,110, 80,214,103,203, 91, 50, 44,
+195, 74,245, 62,255, 76, 91, 4,207,142, 70, 5, 62, 90,221, 90,182,108, 57,102,199,142, 29,186,207, 63,255,156,215,167, 79, 31,
+ 4, 4, 4,180, 24, 60,120, 48, 0,160, 93,187,118, 88,186,116,105,139,193,131, 7, 99,247,238,221, 56,112,224,128,182,117,235,
+214,223,159, 63,127, 62, 9,133, 59, 58,223, 3,195, 48, 93,214,172, 89,243,174,165, 16, 70,163, 17, 6,131, 65, 97, 52, 26, 21,
+ 69,125, 17,150, 45, 91,158,113,242, 68, 36,190,159, 54, 27, 78,142, 46, 65, 22, 62, 67,196,160,137, 19, 51, 54, 47, 94,140,197,
+187,119, 99, 98,205,154,162,173,143, 31,227,164, 70,131, 61,103,207,102, 20,125, 79,133,190,153, 42,149, 74,125,244,232, 81,155,
+ 61,123,246,192,206,206, 14,181,107,215,134, 92, 46, 7, 77,211, 32, 41, 33, 40,174, 12,117,252, 27, 3,184, 9, 0,168,233, 10,
+149,175, 39, 46, 19, 4,114, 88,178,242, 62, 69,252,106,168,225,224, 46,184, 48,102, 83,128,157,141, 19, 23,199, 87,198,227,196,
+138,132,131,154, 12,252, 10, 35,158,162,108,159,175,134,158,158,158, 72, 79, 79,199,209,163, 71, 85, 64,153,130, 12, 12,195,252,
+252,219,111,191, 77,154, 54,109, 26,223,215,215, 23, 0,130, 0,220, 42,237,189, 98,177, 24,110,110,110,197,194,178, 79,248, 40,
+175,145, 19, 70, 9,123,124, 22, 10, 14,199, 1, 57, 42, 3, 50,243, 12,144, 57, 72,240,253,132, 48,193,233,134,110,141,214, 44,
+223,126, 88,173, 70, 35,224,253,254,128, 32,112,235,198,253,203,245, 4,190, 0, 65, 2, 9,228, 57, 16, 32,144, 79, 24, 64, 80,
+ 20,107, 50,153, 16, 31, 31, 15,150,101,209,191,199,144,132, 17,243, 15, 56,181,232,175,132, 71, 29, 87, 16, 44, 62,249,167, 8,
+ 1,123,123,251,160,204,204, 76,188,126,253, 26,225,225,225, 73, 25, 25, 25,167, 84, 42,213,144,228,228,100, 0,200,170, 2,101,
+177,152, 15, 10, 10, 66,227,198,141,209,187,119,111, 65, 65, 65, 65,152,151,151,151,219,155, 55,111,154,253,149,245,121, 87,139,
+252, 79, 9,173, 82, 27,154,193, 80, 71,187,122, 53, 84,167, 79,131,119,242, 36,246,184,186,230,107, 52,154,239, 0, 36, 20, 53,
+252,111, 54,109,222,124,165,235,181,107, 54,186,232,104,120, 61,120, 0,218,206, 46,168,178, 5,216,184,113, 35,148, 74, 37,114,
+115,115, 1, 0, 43, 86,172,128, 82,169,132,209,194,132,179, 28, 46, 90,184, 56,213, 68, 42,158,131,225,144,146,216, 58, 5, 77,
+ 36, 26,105,178, 91,188,179, 42,151,116, 67,116, 92,136, 88,157,169,107, 66, 80, 58,104, 50, 10,224,214,188, 54, 56,224,180,168,
+ 76, 25,205,235,254, 28, 14, 39,235,217,179,103, 93,124,124,124, 34, 0, 56, 84,197, 31,224, 29,188, 72, 75, 75, 27, 87,149, 15,
+ 82, 20,245, 99, 76, 76,140,211,134, 13, 27,190,158, 51,103, 14, 91, 82,104,153,255,207,225,112,192,178, 44,108,109,109, 65,211,
+180,243,213,171, 87,157, 67, 66, 66, 86, 49, 12, 19, 84, 70, 61,217,128,128, 0,196,196,196,128,195,225,192,214,214, 22,140, 81,
+143,217, 19, 70,193, 68,241, 57,147, 39, 79, 14,234,217,179,231,195, 13, 27, 54, 24,108,154, 54,111,150,153,153,249,104, 76,255,
+ 1, 15, 15, 29, 58,164, 43, 10,241, 80,241, 20,159,101,239, 62,127,254,156,114,119,117,166, 88, 99, 1, 35,230, 2,130,251,203,
+ 88,158,196, 5, 2, 14,197,114, 9, 18,124,129,208,246,117, 98, 98, 38,195, 48, 79, 44,225,100, 24,230, 78, 76, 76,140,208,217,
+201,158, 83,160,214,229, 11,105,150, 23,123,231,246,171, 26,193, 13,189, 0, 64,115,231,230,121,126,157,186,194,216,180, 55,226,
+154, 53,107, 90,196,169, 86,171,239, 38, 37, 37, 81,206,206,206,156,184,132,196,195,118, 18,177,163,141,157, 93, 19, 0,208,231,
+229,222, 36,181,218, 55, 20,205,113,126,147,153,153,165, 86,171, 99, 44,173,251,203,151, 47, 57, 10,133, 19,117,252,228,153, 8,
+103, 17,223, 73,202,227,216,240, 9,130, 16, 81,132,146,107,100, 50, 4, 34,145,211,235,196,196, 44,150,101,203,180, 16, 46,204,
+ 25,208,163,240,247,154,189,187, 4, 55,238,223,191,143, 99,151,159, 64,204,234, 64,104,114,113,114,211, 58,244,159, 60,237,131,
+253,254, 42, 18, 91, 85,178,102,173,169, 27,245, 14, 63, 82, 42,112,132,239,223,191,255,236,109,219,182, 21, 59,160, 60,121,242,
+ 4,109,218,180, 49, 47,115,160,125,251,246, 8, 9, 9,193,147, 39, 79,224,237,237,141,179,103,207,242, 41,138,226, 15, 24, 48,
+ 96,254,246,237,219,143, 86,104,247, 95,187, 22, 67,134, 12, 41,205,177,250, 37, 0, 13, 33,243,205,159,186,112,139, 67, 86,102,
+ 6,210,223,164,222,181,244, 62, 16, 4,129, 65, 19, 39,102,172,209,233,176,227,198, 13, 12, 20,139, 69,155, 95,188, 64,167,144,
+ 16,212,107,211, 38,195,146,190,206,108,213,209,104, 52,160,105, 26, 54, 54, 54,176,183,183, 7,151,203, 5, 69,187,130,195, 11,
+ 4,201,229, 34,184,101, 32, 22,127, 39, 46, 8,239,128,229, 4,129, 28, 62, 15,119,184,162, 50,125,117, 8,113, 53,116,103, 89,
+ 40, 11, 18,112,206, 44, 72,108,171,195,150,150,210, 39,135,173,242,181,179,113,226,226,216,242, 56,156, 92,149,184, 95,147,138,
+233, 69,247,130, 41,103, 34, 81,207,206,206, 14, 9, 9, 9,136,143,143,127,140,242, 29,252, 11,158, 60,121,242,138,207,231,251,
+ 57, 58, 58, 2,128,103, 89, 19,115,134, 97,138,253,176,182,238,216,235, 16,212,202, 75,240,105, 11, 63,108,137,152,135,175,194,
+150,131,166, 8,152, 76,122,252,186,180, 51, 76,218,124,132,117, 29, 65,124,210,206, 59,240,116,132,110,152, 65,157,189,238,189,
+137, 0, 7,115,255,211,247,170, 29, 95, 66,214, 3, 67,216, 57, 56, 56,137,185, 92, 46,236,109, 20,186,105, 35,191, 77, 97, 89,
+182,184,221,208, 20,215, 64,230,201,213,153,169,249, 66, 59, 90, 13,176,100,141,170, 69,179,249,248, 72, 76, 76, 28,215,170, 85,
+171,249,121,121,121,217, 42,149,170, 63, 0,120,122,122, 86, 39, 73,146, 15,160,188,213,145,234, 40, 61, 44, 4,247,193,131, 7,
+144, 74,165, 72, 74, 74, 42,105,124, 1,195, 48,255,152, 77, 0,255, 80, 4, 3,184, 3, 64, 1,160, 19, 74,132,119, 32,139, 76,
+117,159, 68, 70, 70,178,145,145,145,159, 20, 15, 94, 44,203, 24,179,178,192,106, 11,239, 45, 77,211, 44,128,146, 59,154, 68,118,
+118,118, 4,237,238, 14,130, 95,232,250,193,126,196,173,175, 6,131,101,161,101, 24, 19, 40, 16,122,176, 37, 38, 45, 42, 1,129,
+121, 14,109, 49,142, 55, 3,169, 60,187,146, 35, 29, 96,100, 97, 2, 67, 85,178, 56,172, 74,165,130,209,104,148,213,170, 85,235,
+136,209,104,148, 21, 13,110,236,127,235, 23, 53,153, 76,175, 40,138,194,215, 95,127, 13,179,245, 71,167,211, 33, 53, 53, 21, 90,
+173, 22, 58,157, 14, 49, 49, 49,200,205,205,133, 78,167,195,163, 71,143,224,233,233, 9,138,162, 20,229,116,230, 44,203,178,240,
+240,240, 64,141, 26, 53, 64, 17, 44,214, 47,154,133, 31,198,143, 66, 95, 79, 6, 27, 87,254,138,214,173, 91,215,173, 89,179,102,
+ 83, 14,135, 99,114,113,113,225, 30, 56,112,224,176,201,100,234, 14,203,123,158,163, 83,167, 78,173,225,239,239,239,100,103, 35,
+ 53,240,121, 20,120, 6, 21,203,215,102,178,156,130, 12,120,120, 84, 55, 66, 40,242, 30, 56,112,160,169, 44, 43, 68,105,156,223,
+125,247,157,194,215,215,215, 86,102, 39, 85,241,104, 42,157, 11, 54, 35,247,254,173,235, 0,192,115,116,210, 64, 32,242, 11, 15,
+ 15, 55, 86,134,115,198,140, 25,158,142,142,142,118, 36,216, 60,147, 94,255,231,122,187, 86,151, 73,208,180, 26, 92, 94,195,177,
+ 99,199, 18,149,225,156, 52,105, 82, 77, 63, 63, 63, 59, 59, 27,113, 62,135,166, 82,184, 12,147, 34, 0,147, 74,235,244,217, 2,
+ 71,135, 2,136, 36,193, 3, 7, 14, 44,147,211,108,205,154, 50,101, 74,194, 59,194, 27, 89, 89, 89,208,164, 62, 4, 55, 41, 26,
+129, 18, 26,141, 28,101,224,243,249,197, 91,223,203,122, 92,203,242,209, 42, 77,108, 89,250,217,134, 63,149,179, 4,184,166,110,
+212,187,113,179,146,147,147,161, 80, 40,202,109, 79,219,183,111,159, 22, 26, 26,154,222,190,125,123,221,145, 35, 71, 64, 16, 4,
+206,158, 61,139,164,164, 36,180,111,223, 30, 44,203,154,119,181,225,238,221,187,104,215,174,157,174, 85,171, 86, 73, 69,241,181,
+ 42,196,144, 33, 67, 96, 48, 24,144,159,159,143,172,172, 44, 68, 70, 70, 34, 48, 48,144, 21,137, 68, 61, 41,143,207,230,133, 13,
+155,214, 44,160,126, 16, 86, 45, 95,172,227,113,232,133,149,105,175, 4, 65, 32,252,187,239, 50,114,131,131,179,182,170, 84, 5,
+131,108,108, 68,181, 18, 18,228,183, 79,156,112,208,235,245, 22,113,152,173, 58,238,238,238,197, 34,139,203,229,130,195,115, 4,
+ 37,174, 7,158,125,123,136, 92,122,226,220, 29,190,214, 86,140,131, 82, 9,142,139,237,202, 14,237, 32,242,192,188,102,125, 20,
+ 7,154,247, 85,156, 17, 85,195,134,162,241,128,100, 57,196,129,193,191,250,212,114,172, 33,196,181,189,169, 56,185, 42,241, 15,
+ 77, 42,102, 1,120, 81, 81, 59,215,235,245, 26,147,201, 4,146, 36,193,225,112, 74,250, 4, 94,249,227,143, 63,112,251,246,109,
+160, 68,216,158,188,188, 60, 19, 69, 81, 16, 8, 4, 0, 32, 41,167,191, 3, 77,211,160,105, 26,231,175, 95,180,239,251, 69,103,
+226,234,189, 83,104, 30,216, 15,153,249,122,164,229,234,145, 83, 0,248, 55,154,142,128,118, 7,113, 63, 38, 15, 65,245, 3, 40,
+138, 39, 14, 47,141, 79,243, 26, 9,170,120,244,202,124,204,212,214, 37, 10,143, 93, 59,244,228,241,197,125,247, 31,237,250, 45,
+226, 69,179, 70,173, 84, 69,198, 4,228,231,231,179, 4, 65,176,223, 14,159,246,106,235,144,108,211,242,254,247, 25,142, 86,240,
+242,111,236,234,171, 59, 58, 58, 94,181,183,183, 63, 91, 36,142,170, 75,165,210, 43, 10,133, 34, 26,133, 27, 61, 14,165,164,164,
+248,170, 84,170,230, 40,220,156, 21,151,153,153,217,166,200,242, 20, 87,142, 37,108,131, 82,169,252,198,100, 50,117, 45, 58, 58,
+152, 76,166,160,231,207,159,251, 5, 5, 5, 61,246,242,242,186,235,229,229,117,204,203,203,235,176,151,151,215,225,208,208,208,
+165,230,112, 15,127,241,178,225,123, 90,228, 95, 38,180, 80, 36,178,214, 22,189,162, 88,104, 1, 56,255,174, 3,154,145,207,127,
+100, 28, 51, 6,118,135, 15,131,126,254, 28,131,195,195,109, 68, 34,209,114, 20,198,104,106, 46,145, 72, 86,205,154, 53, 75,234,
+176, 96, 1, 92, 47, 94, 68,108,100, 36, 12, 52,125,171, 42,165, 83,171,213,224,112, 56,197,150, 24,177, 88, 12,147,201,132,210,
+ 76,190,239, 53, 64, 35,174, 37,165, 69,131,135, 26, 96,192,230, 31, 87,182,186,209,239,213,116,167, 72,165,167,247, 11, 21,215,
+251, 39,199, 38, 78,203,171,183,184,161, 34, 56,249, 60, 59, 1,226,227, 19, 96, 2, 83,169,245,102,141, 70,147,171, 82,169, 16,
+ 20, 20,100,127,251,246,237, 90,129,129,129,242,162,235, 55, 63,240,135,105,234,234,234,186,215,205,205,237,181,171,171,235, 94,
+ 0, 77, 43,241,217, 13,151, 46, 93, 2, 69, 81,152, 53,107, 22,242,242,242,160,215,235,145,153,153,137,248,248,120,232,116, 58,
+ 36, 38, 38,226,233,211,167,208,233,116,136,141,141,133, 86, 91,241,132,132, 97, 24,216,216,216, 64,163,206,199,239,243,126,192,
+140, 41, 19,144,251, 50, 10,137,201,105,176,179, 21, 99,220,184,113,148, 76, 38, 99, 24,134,169, 97, 50,153,218, 49, 12,179,218,
+146,223,169,196,243,118,217,195,195, 35, 96,209,162, 69,126, 63,204, 91,205,181,225,228,179,124,169,128,225, 73,249, 44,175,110,
+ 19, 12,153,190,156,187,108,201, 47,207,174, 93,187,150, 4,203,130,119,146, 0, 46, 7, 7, 7,251, 36, 37, 37, 5,250,250,250,
+214,113,168, 94,147,207, 87,184,229,112, 21,213,148,172, 86,115,131,112,171,214,114,245,234,213, 15,175, 92,185,146, 92, 25, 78,
+177, 88, 92,119,203,150, 45, 1,206,206,206, 1,180, 80, 40, 40,200,205,221, 99, 44, 80,237,165,236,100, 2,210,198,174,195,193,
+131, 7,163,246,239,223,159, 90, 25, 78,111,111,111,223,121,243,230,249,215,171, 87,207,223,197,179, 22, 95,232,230,145, 41,112,
+175,158, 41,172, 23,200,135,123,141,207, 87,173, 90,117,247,218,181,107, 22,113, 82, 20,101, 36, 73, 18, 52, 77, 67, 36, 18,225,
+248,241,227, 24, 51,172, 31, 60,220,236, 81,199,215, 23,109,191,250, 6,251,247,239, 47,246,225,161, 40,170,204, 17,125,243,130,
+113, 17,193, 10, 34, 10,107,234, 70, 97, 77,221,168, 96, 5, 17, 85,166,216, 42,250,123,105,239,177,168, 55, 42, 99,185,209, 2,
+177,117,244,252,249,243, 63, 15, 26, 52,136,215,177, 99, 71,220,184,113, 3, 67,134, 12,185,124,224,192, 1, 0,192,141, 27, 55,
+240,237,183,223, 94, 62,115,230, 12, 70,141, 26,133, 54,109,218,240, 46, 93,186,180, 10, 22,196,254, 49, 26,141,216,184,113, 35,
+140, 70, 35, 36, 18, 9,228,114, 57, 58,119,238,140,135, 15, 31,142,218,180,105, 83, 52, 69,211, 95,118,234,250, 5,142, 28, 62,
+128,167,143, 30,142,218, 60,127, 64,165,131, 2,147, 36,137,142,225,225, 25, 25,254,254, 89,155,149,202,130,161, 50,153,200, 55,
+ 53, 85,126,110,239, 94, 7, 11,132, 26, 97, 50,153,138,197,149, 89,116,152, 15, 14,207, 17, 28,113, 0, 56,210, 70,184,255,130,
+107,224,134,224, 14,175, 17,158,148, 23, 63,139,230,145, 67,122,254,224,137,158, 63,120,162,219,228,154,131, 69,213,176, 94, 92,
+ 13,163, 59,142,175, 17,234,213,200, 22,202,116, 61, 34,127,141,141,211,100, 98, 1,128,167,150,180,115,134, 97, 30, 39, 37, 37,
+129,199,227,161, 90,181,106, 62, 0,204,126,129, 27,134, 15, 31, 62,246,167,159,126,154, 0,224,167,162,107,146,208,208, 80,255,
+252,252,124, 60,127,254, 28, 0,110,151, 99, 13, 46,222,101,152,165,140,229,215,116,173,135,192,186, 35, 33,147,213, 71, 82,150,
+ 14,201, 89, 58,172,255,189, 59,162, 46,205,197,237,147, 3, 17,151,154, 10,161, 75, 15,152,140,218, 0, 11, 38,245,174,247,238,
+221, 35, 46, 93,186, 68, 48, 12, 3,131,193,192,230, 41,149,236,157,203,151,161,190,112,129,176,177,177, 33, 90, 52,110,149,191,
+121,238,145,155, 7, 87, 94,190,173, 47,168,244, 68,253, 67, 48,227,213,171, 87, 77,247,238,221, 27, 10, 96, 70,189,122,245,174,
+197,199,199, 55,187,120,241, 98, 29,119,119,247,229, 85, 37, 53,135,133,136,141,141,125,235, 40, 10, 11,161, 43, 18, 13, 29,139,
+196, 92, 55, 0,223,226, 3,118,217, 87, 2,231,255,197,206,240, 71,240,206,110,195,119,133, 86,201, 64, 97,240,146,201,164, 6,
+131, 62,241,212,169, 83,122,146, 36, 33, 18,137, 48,104,200, 16,242,247,223,126,107,217,175,105,211,179, 35, 62,253,244,216,217,
+ 51,103,130, 67, 66, 66,192,178, 44, 72,146,196,238,221,187,213, 26,141, 58,211,195,195,195,206,146, 78,163,100, 3, 82, 42,149,
+197, 66, 43, 55, 55, 23,206,206,206, 22, 47, 29,170,148, 56,125,230,120, 84, 54,107,250, 42,190,227,139, 37,250,133,169,221, 67,
+114, 24, 19, 39,215,100, 64,174,154, 69,158, 6,156, 27,164, 60,100,144,119, 15,125, 76,187,144,167, 23,162,175,102,106, 76,154,
+ 74,237,150, 72, 79, 79,255, 33, 44, 44, 44, 83,161, 80, 16, 54, 54, 54,112,115,115, 35,187,117,235,150,145,144,144,240, 83, 85,
+127, 17,123,123,251,190,161,161,161, 17, 73, 73, 73,189, 46, 92,184, 80,227,226,197,139,189, 66, 67, 67, 35,236,237,237,251, 90,
+ 72,177,103,218,180,105, 42, 30,143,135, 38, 77,154, 32, 47, 47, 15, 69,187,124,202, 61, 44, 89, 34,229,114,185, 88,179,232, 71,
+204,152, 50, 1, 89,209, 55,112,255,242, 41,156, 79, 37, 48,125,222, 47,224,114,185, 85,138,245, 85,219, 81, 84,175,158,171,244,
+201,183, 67,250, 36, 79,157, 50, 69,122,247,238, 93,122,236,248,111,217,216,148, 44,240, 58, 46,166,240,201, 15,228, 61,149, 35,
+ 58,117,104,139, 89, 51, 38,214, 43, 10,218, 89, 46,234, 58,138,234, 5,184, 74, 31, 79, 28,209,239,213,248,241,227,133, 11, 23,
+ 46,212, 52,109,218, 84,157,150,150, 38, 20,203,228,190, 28, 91,187,128,216,148, 84, 73,211,166, 77, 99,190,250,234,171,156,202,
+114, 78,159, 62, 93,116,226,196, 9, 78, 88, 88,152, 49, 59, 59, 91, 66, 11,133, 65, 4, 95,208,248, 77,118,182,109,175,176,176,
+ 23,189,122,245, 42, 40, 10, 88,106, 49,231,204,153, 51, 69, 79,159, 62,229, 52,109,218,212,144,154,154, 42, 21,219, 59, 4, 82,
+118,242, 70,175, 83,210,108, 26,135,132,188, 28, 59,118,172,170,188,114,150, 20, 41, 82,169, 52,169,121,243,230,248,245,215, 95,
+177,108,217, 50,124,254,249,231,120,248,232, 33, 58,141,157, 0,191,209,223,226,240,213,235, 72, 74, 74,194,156, 57,115, 16, 24,
+ 24, 8, 46,151,251,180,212,246, 56, 42,154,184,155, 10,226,110, 42, 8, 98, 84, 52, 97, 62, 47,211,178,245, 83, 46, 74,190,191,
+180,247,221,158, 89,186,165, 43, 88, 65, 68,149,231,135, 85,145,216,234,213,171,215, 24,115, 8,135,161, 67,135, 94, 94,190,124,
+121,139,161, 67, 11, 39,218, 77,154, 52,193,220,185,115, 91, 76,159, 62,253,242,188,121,243,208,182,109, 91,120,121,121, 85,184,
+241,197,100, 50,193,104, 52,162, 95,191,126, 48, 26,141,120,243,230, 13,158, 61,123,134,181,107,215,130,101, 89, 1, 0, 40, 92,
+221, 27,242,120, 60,220,187,115,171, 96,198,208,144,237,149,176,100, 17, 37, 39, 49,249,249,249,232, 53,122,116, 70, 98,237,218,
+ 89,171, 51, 50, 10,134,201,100,162,154,113,113,114,169, 78,231,134,114,252, 18, 9,130, 0,195, 48,197,194,202, 44,184,222, 61,
+138, 6, 74,139,160, 47, 96,142, 94,220,150, 12, 0,104, 53,192, 21,221, 38,215, 28,172,240, 22,173,104,217,191,208,232,189,127,
+238, 43, 54, 47,217,180, 16, 6, 60,174,132,197,250,198,141, 27, 55, 96,103,103,135,176,176, 48, 62, 73,146, 11,204,243, 85, 20,
+198,206, 90, 98,230,226,243,249,139, 7, 14, 28, 72,230,228,228,224,254,253,251, 0,112,166,172,126,137,101,217,226,186,231,103,
+ 17, 48, 49, 60, 92,185,115, 28, 39, 47,238,195,235,164, 55,136, 75,215, 0, 28, 91,104, 84,137,208,171,147,160,203,185, 3,165,
+ 86,100, 81,129,185, 92,238,155,122,245,234,177,141, 26, 53, 98, 89,150,197,203,151, 47,141,177,113,113,198, 91, 75,151,178, 15,
+ 70,142, 36,164,207,158,113,133, 66, 33,225,233,233, 9,129, 64,192, 8, 4,130,204,191,113,240,254, 75,194, 45,252, 5, 97, 33,
+ 62,166, 85,139,197,191, 19, 41,120,123,183, 97,113, 0,211,210, 2,150,130,181, 17,246,217,183,234,119,219,176,126, 3, 84,129,
+129,129, 50, 55, 55, 55, 16, 4,129,238, 61,122, 16,161, 23, 46, 72,105, 87, 87,216, 55,104, 80,188, 28,113,250,212, 41, 28, 63,
+126, 92,117,228,143,131,110, 67,134, 13,235, 2, 96, 75, 57,133,225,240,249,252,226,239, 77, 73, 73, 1,159,207, 47,246,137, 80,
+ 42,149,112,116,116, 68, 74, 74, 10, 44, 92,153,219, 58,117,202,245, 41,233, 33, 63,120,134, 72,105,226,152, 42, 21, 38,150, 5,
+ 77,152, 0, 53, 11,131, 9,208, 26, 88, 52,172, 73,201, 79,170,141,178,200, 27, 7, 98, 0,108,173,204,221,211,106,181,231,238,
+222,189, 59,146, 97,152,125, 0,200, 11, 23, 46, 48,143, 31, 63, 30, 3,203, 29,215,223, 55,219,139, 68,147,207,158, 61, 43,159,
+ 60,121,114,118,100,100,100,110,231,206,157,109,215,174, 93, 43,111,211,166,205,228,204,204,204, 93,150, 24, 2,227,227,227,183,
+ 36, 36, 36,140,105,212,168, 17,178,178,178,160,215,235, 17, 21, 21, 5,111,111,111,220,190,125, 27, 62, 62, 62,184,117,235, 22,
+234,212,169, 3,147,201, 4,141, 70, 3,134, 97, 76, 21,117,230, 89, 25,111,128,204,120, 36,223, 56,134,103, 15,162,112, 54,153,
+192,202, 93, 17,168, 86,195,179, 74,113,106,124,156, 68,254, 10, 71,251,147, 11,103,207,116,138, 61,183, 27, 7, 54,174,100,206,
+ 31, 59,230,199,147, 98,228, 39,253,190,249, 66,103, 64,117, 0,188,102, 33,141,208, 81,246,212, 36,170,129,212,179,143,203, 15,
+176,232,227, 36,242,119,118,176, 63,241,159, 5, 63, 73, 95, 30,223,140, 61,107,126,101,247,111,219, 25,168, 1, 66,252,253,253,
+ 59,146, 36,105, 7, 64, 83,228,231,101, 81,106,155,210, 56, 79, 71, 68, 4,107,128,144, 67,135, 14,117, 20,137, 68, 46, 0, 12,
+ 5, 5, 5,175, 62,132,243, 76,100,100,176,185,156, 4, 65, 56, 1,208,179, 44,251, 18,149, 76,193,211,187,119,239,185,223,126,
+251,237, 20,147,201,228, 88, 98,118, 78, 45, 94,188,152,195, 48, 12,197,178,172,158, 36, 73,253,137, 19, 39, 76, 70,163, 49, 89,
+163,209,140,254,144, 94,228,139, 47,190,192,245,235,215,103,163,112, 19,134,165,214,234,183,252,180,138, 82,246, 84,153,255,194,
+133, 11,115,190,252,242,203,169,187,118,237,122,182,124,249,242,174,163, 70,141,194,238,221,187, 81,187,118,109,220,187,119, 15,
+ 63,252,240, 3, 0,180,152, 62,125,250,225, 13, 27, 54,120,197,198,198, 46,182,192,162, 1,163,209,136,157, 59,119,162,123,247,
+238,112,116,116,132,171,171, 43, 8,130, 56, 55,108,216,176,223, 0,128, 34, 40, 46, 0,104, 53, 90,173,175,111, 35,139, 45,184,
+ 92, 46,183,184,175, 75, 77, 77, 45,222, 41,248,217,151, 95,102,172, 95,184, 16,219,213,106, 12,147,201, 68,137,238,238,138,195,
+ 47, 95,142,120, 84,216, 57,179,229, 89,117, 42, 18, 89,150,186, 52,168, 83, 48,237,143,249,175, 93, 0,124,222,106,128, 43, 90,
+ 13,112, 69,163,110, 78, 4, 73, 17,120,112, 50, 19, 15, 79,103,237, 55, 40,113, 14,149, 75,151,243,120,193,130, 5,135, 63,249,
+228,147,174,117,235,214,197,240,225,195,191,218,184,113, 35,215, 96, 48,140,199,159, 97, 30,108, 73,146,252,105,205,154, 53, 35,
+228,114, 57, 46, 93,186,132,139, 23, 47,158, 3, 16, 95, 86,191, 4,160, 56,102, 86, 53, 15, 31,205,211,216,124, 81,122,210, 21,
+ 92,190,244, 7,106, 7,126, 3,161, 75, 23,200,125,231, 65, 31,189, 12,186,204,147,144,123,116, 70, 98,236, 75, 80, 28,254,195,
+138,156, 80, 88,150,125,148,152,152,232,229,229,229, 69,188,126,253,218, 8,128, 53,153, 76,172,190,101, 75,131,223,194,133,244,
+195,175,190, 34,154, 61,125, 74,177, 4,193, 68, 69, 69, 1,192,147,255,198, 40,110, 14,183,240,240,225,195,178,194, 45, 84, 10,
+245,234,213,107,113,241,226, 69,190, 70,163,193,249,243,231,209,184,113,241,222,174,255,106,244,251,146, 90,228, 95,134, 17,165,
+ 92, 91,251,150, 69,235,173, 7,155, 33,232, 58, 62, 62, 38, 46,137, 77,221,187,116, 41,184,123,247,110,241,172, 79,115,243, 38,
+ 84,199,143,195,100, 50,129,101, 89, 92,188,112, 1, 3, 7, 12,200,167, 41, 98,125,205,154, 53, 88,130,125, 43,118, 75,187, 82,
+102, 15, 97, 97, 97, 97,197,157, 79, 66, 66, 2,196, 98, 49,120, 60, 30, 24,134,129,209,104, 4, 69, 81,176,181,181,133,209,104,
+ 44,205, 4,243, 46,167,193,148,165,234,181,161, 83,255, 20,215,124, 61, 59,210,174, 38,170,115,133,197,141,211,197,134, 64,215,
+ 64, 26, 14,156,116,246,204,226, 79,147, 25,109,102, 47,188,191,163,171,162, 45,255, 62,245,235,215,255,109,224,192,129, 36, 0,
+180,107,215,142,172, 95,191,254, 10,148,159, 42,167, 92, 78,129, 64,192, 7,128,136,136,136,172,103,207,158,125, 30, 17, 17,145,
+ 85,242,186,133,156,107, 23, 45, 90, 4,145, 72, 4,163,209, 8,157, 78, 87,236,159, 85,242, 85,175,215,195,193,193, 1, 71,142,
+ 28,129,201,100, 58, 82, 81, 57, 61,170,215, 0,225, 88, 11, 91, 34,206,226, 98, 6,183, 42, 34,171,152,179,150,139,184,142,139,
+131,253,169,255,204,159,227,152,253, 34, 10,137,137,137,236,137,227, 71,174,105,128,164,220, 60,204,200, 81,161,142, 90, 7, 65,
+ 99, 47,196,159, 90,243, 61, 59,189, 21, 12, 40,125,215, 96, 49,167,159,139,184,142,155,163,253,137, 95,254, 51, 95,154,243, 34,
+ 10, 41,169,169, 56,122, 36,226,174, 6, 48, 47, 55, 14,102, 24, 38,128, 97,152, 0, 0,131,203, 17, 47,149,226, 44, 40, 40,168,
+ 87, 80, 80, 80,239, 99,114,178, 44, 91,143,101, 89,139, 57, 75,250, 68, 45, 89,178, 36, 58, 37, 37,101, 96,122,122,122,123,243,
+145,157,157,221, 46, 63, 63,191,117, 65, 65, 65, 75,245,146, 26,182, 5, 5, 5, 78,249,249,249, 10,141, 70,211, 16, 64, 84, 37,
+158,249, 98,148,140, 58,157,146,146, 50, 43, 37, 37,133,168,168,156,212,232,104, 98,199, 47, 19,255, 88,179,102,141,226, 3,249,
+223, 42,103, 70, 70,198,190, 93,187,118, 5,121,122,122,122, 13, 30, 60, 24,171, 87,175,198,242,229,203,181, 0,176, 97,195, 6,
+109, 9, 75,150, 71,108,108,108,163, 50,150, 13,219,149,176,150,108,253,236,179,207,216,139, 23, 47,162,123,247,238,197,129, 68,
+215,173, 91, 7,163,209,168,108,219,182, 45, 3, 0,106, 77,129,146,101, 88,232,244,101,174,191,191,119, 63,121, 60, 94,135,146,
+241, 2,205,193,152,121, 60, 30, 88,150, 69,157, 22, 45, 50,114, 2, 3,179, 54,230,230, 22,204,170, 87,207,102,132,175,239,224,
+186,192,128,210, 56, 9,130,120,203,170,243,238, 81, 9, 75, 86,201,114,166,171,147, 49,252,143,249,175,143,155, 45, 91, 2, 9,
+ 7,154, 60, 35, 14, 46,124,253, 70,243, 6,235,202, 18, 63,229,213, 61, 43, 43,107,236,194,133, 11,181, 50,153, 12, 95,124,241,
+ 5,230,205,155, 55,172, 69,139, 22,185, 78, 78, 78,215,107,215,174,253,160, 79,159, 62, 41, 81, 81, 81, 99, 67, 67, 67,241,252,
+249,115,252,242,203, 47, 57,217,217,217,253,203,227, 36, 8,162,216,146,215,173, 83,187,172,223, 87,252,202,180,253,100, 12, 68,
+ 66, 27, 24,104, 15,100,229, 27,144,173, 98,161,227,135,128,199,229,163,125, 83,127, 92, 63,177,185,192,164, 83,109,169,232,153,
+207,207,207,223, 63,104,208, 32, 37,151,203,133, 78,167, 99,105,154, 6,191,208,239,152,161, 63,255, 92,223,236,241, 99,163,137,
+101, 25,130, 32,240,221,119,223,169,178,179,179,119, 85,165, 29, 85, 2, 37, 57, 63, 86,184,133,118,239,140, 63, 31, 35, 44,196,
+ 95, 81,247,127, 51,214,150,114,252,105,209, 50,111,169, 52,191, 18, 4, 99, 50,153, 24,212,244,172, 41,141,125, 29,191,178,119,
+239,176,161, 29, 59,118, 18,117,234,212, 73,224, 31, 93, 56, 27,141,136,136,192,129, 3, 7, 10, 78,158, 60,169,228,211,212, 6,
+143,106, 30,206, 38, 19, 3,130, 96,202, 85,195, 82,169,116,252,180,105,211,132,185,185,185, 88,190,124, 57, 19, 20, 20, 68,138,
+197, 98,232,245,122,108,216,176,193,224,239,239, 79,147, 36,137,220,220, 92,144, 36,249,212,194, 10,222,207,141, 79,106,255, 91,
+104,207, 3,141,190, 30, 98,239, 23,218, 76,214,218,195, 13,134, 6, 44,146, 19, 94,227,217,153,147,217,143, 78, 44,205,132, 38,
+173, 39, 42, 78, 15, 84,218, 64,240,227,201,147, 39,157,198,142, 29,203,106, 52, 26, 34, 62, 62,158,157, 63,127,190,211,240,225,
+195,127, 76, 78, 78,238, 91,197, 31,133,200,201,201, 1, 65, 16, 76, 81, 71, 98,158,245, 87,102, 93,238,225,150, 45, 91, 14,245,
+232,209,163, 91,219,182,109, 17, 29, 29, 93,188, 68, 88, 82,104,153,119, 31, 46, 88,176, 32, 7,192,212,138, 72,105,154,198,242,
+ 45,251,144,147,157, 1,103,103, 87, 8,132, 66, 84,117,135, 37,143, 36,103,253, 60,103,166, 83,198,147,235,196,195,107,103,153,
+189,247,211,210,141, 38,182,244,136,255,121,201,108,145,250, 47,127, 54, 67, 82,179,126,158,255,147,173,121, 89,115,215,157, 20,
+ 37, 97, 98,199,126, 80, 19,249,183,112,254,205,112,117,117, 69, 74, 74, 10,225,234,234,202, 22,249,104,177,229, 8,173,183, 31,
+240,194,229, 50,162,188,101,195,170,242,199,196,196,204,111,208,160,193,196,231,207,159,239,245,243,243, 27, 5,160,154, 86,171,
+205,153, 62,125,250,127, 54,108,216, 48,212, 18, 75, 22, 0,236,222,189,123,233,144, 33, 67,142,119,233,210,229,123,134, 97,234,
+151, 24,216, 99,156,156,156,138,151,112,223,164,165, 78, 25, 57,180,223,148,252,252,108,139,227,220, 73, 36,146, 17,211,167, 79,
+ 23,168, 84, 42,172, 90,181,138,241,247,247, 39,205,147,162,109,219,182, 25,125,124,124, 56, 97, 99,198,100, 44, 73, 77,197,220,
+ 75,151, 84, 83, 2, 2,130, 54, 62,123,214, 16, 12,179,181, 44,171, 78,105,150, 44,179,219, 69, 21,145, 92, 36,182,214, 1,248,
+188, 89,111, 23, 28, 90,244, 26,217,177,186,255,192,136,151,176, 32, 45, 80, 41, 72,220,191,127,127,251,180,180,180, 67, 51,103,
+206,180,109,216,176, 33, 2, 2, 2,104,137, 68, 18, 98, 14, 23,147,155,155,139,211,167, 79, 99,245,234,213,186, 71,143, 30,245,
+ 40,111,185,202,100, 50,165,251,248,248,152,239, 3, 75, 16, 68,166, 82, 75,216,238,169, 27, 34, 25, 60,114, 47,113,249,214, 85,
+ 36,235, 25,104, 13, 12,106,122, 6,163,245,231, 75,112,248,216, 3, 83,114,236,227,199, 6,117,246,122, 11,202,251,242,197,139,
+ 23, 7,231,204,153,211,251,251,239,191, 23,102,100,100,152,180, 90, 45,179,111,223, 62,106,240,224,193, 38,150,195, 97,184, 28,
+ 14,198,143, 31,175,206,201,201,249, 3,248, 91, 19, 76,255, 37,225, 22,254,130,176, 16, 31,205,154, 85,242,245,127, 5,165,182,
+ 80,134, 34,175,172, 94,243,123,135,221, 59,119,185, 80, 20,233,242,242,213,171, 91, 93,123,246, 74, 58,117,234,148,156,107,107,
+219, 24, 0,163, 27, 53,234,154, 94,171,206,138, 60,116,168,122,205,154, 53, 2,139,146, 74,179, 12, 69, 94, 41,239, 11,243,243,
+243, 85,151, 46, 93, 42,152, 58,117, 42,145,144,144,176,195,217,217,185,207,177, 99,199, 36, 61,123,246, 84, 71, 71, 71,239,119,
+113,113,233, 22, 26, 26, 42,157, 56,113,162, 54, 63, 63,191, 50,137, 71, 31,179,111,178,235,222,156,185,248,203,155,139,126,255,
+ 20, 28,170, 57,180, 52,192, 24,174, 64,159,119, 10,192, 14, 84, 34,222, 81, 73,136,197,226, 64,145, 72,132,187,119,239,102,135,
+132,132,232, 52, 26, 13,119,222,188,121,246, 98,177, 56,176,170, 55,158,101, 89, 54, 59, 59, 27, 12,195,112, 0, 16, 69,175, 96,
+ 42,191, 23,191,111,215,174, 93, 15,237,217,179,231,179, 78,157, 58,193,203,203, 11, 6,131, 1, 62, 62, 62,208,233,116,240,246,
+246,134, 86,171,197,236,217,179,145,155,155, 59, 1,229,228, 60, 35, 8, 2, 70,163,177,216,217,214,205,189,122, 97,156,158, 15,
+ 8, 99, 33,166, 73,175,167,145, 27,145,158,153,193,236,185,151,150, 86,160, 55,181,127,241,166,224,209,187,239, 43, 48, 65, 21,
+ 58,120, 92, 18, 0,104,153,242, 51,206,139,121,240,122,118,100, 29,210,210, 51,176,251, 78, 74,142, 74,207,124,254,172, 20,206,
+ 74,149,243, 95,194, 25, 60, 59, 26,189,198, 89,254,222, 15,129,165,130,170, 44,220, 77, 5,113, 91,180,145,197,154,141,165,198,
+200,250, 64,254, 67,207,159, 63, 63, 4, 0,143, 31, 63, 78,232,215,175,223,148,215,175, 95,207, 1,112, 52, 54, 54,118, 77,101,
+136, 54,110,220,248, 28,192,144,242,222,179,107,241,144,131, 0, 14, 86,134, 55, 47, 47, 79, 19, 21, 21,165,153, 56,113, 34,145,
+144,144,112,204,197,197,229,179,227,199,143,139,122,246,236,169,125,248,240,225, 25, 87, 87,215, 86,237,218,181,147, 28,189,113,
+ 35,169,224,229,203,200,200,196,133,151,166, 0, 0, 32, 0, 73, 68, 65, 84,215,175,221, 13, 12, 19, 89, 94,251,252,200, 34,235,
+ 45,177,117,112,238,235,159, 15,253,252,186, 29,163,197,126, 93, 54,174, 1, 72,252, 0,206,139, 87,174, 92,241, 27, 48, 96,192,
+158,206,157, 59, 55,243,243,243, 67,181,106,213,240,236,217, 51,188,121,243, 6,247,239,223, 71, 68, 68, 68,132, 70,163,169, 48,
+161,118, 86, 86,214,251,233,137, 4,114,215,205,171,102, 69,220,186,220,216,167,101,167, 65,194, 0, 87, 6, 58, 61,139,132,184,
+151,152, 61, 99,125, 65, 74,220,243,199,122,163,190, 7, 44,220,168,163, 86,171,215, 46, 91,182,140,142,140,140,236,180,114,229,
+ 74,105,245,234,213, 41, 46,151, 75, 2, 96,111,223,190,205,142, 27, 55, 78,149,145,145,113, 68,169, 84,174,253,155,199,232,139,
+175, 94,189, 10,166, 40,234,163,134, 91,248,128,176, 16, 86,124, 76,120,122,186,251,213,170,238, 58,202,171,154,251, 24,207,234,
+ 30,225,165, 57,185,123,201,100, 82,207, 26,110, 35,188,170,185,143,169, 85,221,117,148,167,167,187,159, 5,166, 69, 47, 27, 27,
+155, 99, 10,133, 34, 8, 0,108,109,109,187,217,217,217, 61,178,181,181,237, 86, 52, 11,236, 38,145, 72,158,248,251,251, 15,255,
+ 27,205,149,229,114,250,248,248,244,203,207,207,255,202,199,199,167,159,249,252,229,203,151,197,231, 85,225,244,240,240,104,123,
+251,246,237,190,139, 23, 47,254,162,118,237,218,221,230,207,159,255,197, 31,127,252,209,215,221,221,189, 97, 21, 56,249, 0,182,
+211, 52,157,198,227,241,210,105,154, 78, 51, 31, 28, 14, 39,141,162,168, 52, 0,107,202,176,150,181, 43, 49,203,185,236,236,236,
+ 28,235,236,236, 28,235,226,226, 18,235,226,226, 18,171, 80, 40,222, 59, 28, 28, 28, 46, 91,122, 63,125, 93, 36, 45, 66,170, 73,
+175,212, 83, 72, 46,215,117, 22,251,126,140,223,200,215, 69,210,162,113, 53,219, 43,245, 20,210, 75,255,223, 56,131, 92,192,178,
+171,125, 89,118,181, 47, 27,228, 2,182,162,243,143,105,246, 87, 40, 20,172, 66,161,152,245, 87, 45, 37,148,193,255,183,183,247,
+143,200,233, 37,149, 74,119, 85,171, 86,205,220,215,117,177,177,177, 57, 39,145, 72,186, 20,245,117, 93,196, 98,241, 5,127,127,
+255, 65, 21,113,202,229,242,219, 78, 78, 78,169, 69, 71,138,179,179,115,138,179,179,115,138,147,147, 83,178,147,147, 83,178,163,
+163, 99,146,249,176,179,179,187, 94,197,186, 59, 1,104, 2,160, 33, 0,155,143,120, 63, 61, 1,140, 44,234,131, 22, 2, 24, 14,
+160,254, 71,248,141, 8, 90, 40, 31,205,183,243,184, 66, 75, 28,243,104,137, 99, 30,223,214,253, 74, 57, 41,120, 44,225,172, 35,
+151,203,231,217,216,216,252, 33,149, 74, 47, 73,165,210, 67, 14, 14, 14,243, 1,212,249, 47, 61, 75, 18, 0, 27, 80, 24,159,233,
+ 40, 10,151,194, 15,161,112, 83, 65,245,127,224, 51,255,255, 25, 35,254, 91, 95,220,206,202,105,229,180,114, 90, 57,173,156, 86,
+206,127, 33, 39,105,189,159, 86,161, 85, 73,161,245,238, 1,160,156,200,240, 86, 88, 97,133, 21, 86, 88,241,255, 24,140,245, 22,
+ 88, 81, 73,148,186,180, 76,148,163, 74, 43, 19,107,170, 42,202,246,180,149,211,202,105,229,180,114, 90, 57,173,156, 86,206,255,
+119,156, 86,124, 68, 88,205,170, 86, 78, 43,167,149,211,202,105,229,180,114, 90, 57,255,215, 97, 93, 58,180,194, 10, 43,172,176,
+194, 10, 43,172,248,139,176,182,132,224,122,107, 9,209, 42,180, 42, 15, 18,192, 87, 0,122, 1,168,133,194,108,246,251, 0,252,
+134,170,173,233,219, 0,152, 2,160, 57, 10,119,231,196, 0,184,132,194,221, 57,249,214,219, 93, 58, 28, 28, 28,166,209, 52,109,
+ 7, 20,166, 54, 49,191,150,252,191,201,100,202, 81, 42,149,243,255,162, 34, 80,176, 48,130,178,185,172, 37,203, 86,242,213, 96,
+ 48,252,149,229,180,226,159, 9, 31,185, 92,190, 61, 43, 43,171, 63, 74, 36, 89,182,194,138,255, 5, 56, 58, 58,142,210,235,245,
+211,185, 92,238,188, 55,111,222,252,254,255,168,234,239,137,172,183,132, 86,100,100,228, 5, 0,232,220,185,243, 39, 0, 96,103,
+103,119,149, 36, 73,207,202,124, 3,195, 48, 49, 57, 57, 57,101, 6, 80,179,179,179,187, 74, 81,212,123,156, 6,131, 65,202,225,
+112,242, 74,251,140,209,104, 76, 84, 42,149, 13,255, 33, 55,145, 0, 16, 41,147,201, 52,115,230,204,249,173,117,235,214, 30,201,
+201,201,198,201,147, 39,183,186,119,239, 94, 39, 0, 29, 42, 41,182,154, 18, 4,177, 57, 40, 40,232, 96,120,120,248,158,144,144,
+ 16, 94,102,102,166,116,223,190,125,110, 91,182,108,137, 98, 24,166, 63,202, 73,180,250,255, 25, 52, 77,219, 37, 38, 38, 74,129,
+194,212, 36, 69,194, 10, 6,131, 1, 6,131, 1, 42,149, 10,129,129,129, 31,253,123, 93, 92, 92,130, 9,130, 88, 41,145, 72, 26,
+230,231,231,223, 2, 48, 38, 37, 37,229, 94,101,202,106, 52, 26,193,178,108,113, 57,253,252,252,172, 63,104,229, 48,140,199,227,
+125,238,237,237,221, 88,171,213,102,199,196,196,220, 52,153, 76, 51,241,241,114,180,217, 2,152,201,231,243, 67,106,213,170,229,
+241,252,249,243, 4,189, 94,127, 3,133,201,144,115, 63,134,200,250,228,147, 79, 46,175, 90,181,202,126,244,232,209,151, 47, 93,
+186,212,194, 42,182,172,248,111,193,195,195,195, 78,165, 82,173, 7, 16, 76,211,180,139, 64, 32,128, 80, 40, 76,229,243,249,119,
+133, 66,225,208, 43, 87,174,228, 84,150,211,100, 50,205,140,141,141,117,105,210,164,201, 34, 39, 39,167,217, 25, 25, 25, 26,189,
+ 94,127, 38, 59, 59,123, 2, 0,101,121,159,125, 87,139,252,203, 68, 86,201, 87,152, 69, 23,167,168, 98, 44,128,214,111, 41, 48,
+ 14,199, 61, 46, 46,206, 73, 32, 16,128, 97,152,226,193,236,221,195,124, 93,167,211, 33, 32, 32, 64, 95,193,128,227,145,144,144,
+224,196,227,241,138,175,233,116, 58,184,185,185, 49,137,137,137, 78, 69,105, 15,138,161,213,106,225,238,238,254, 79,202,121,244,
+149, 92, 46,207,141,143, 79, 8,212,104,245, 63, 13, 31, 59,117, 90,255, 94,159,202,174, 94,189,202,116,232,208, 65,123,225,194,
+133,175, 80,152, 56,213,162,206,156, 32,136, 45,147, 39, 79,158, 45, 16,217,216,159,189,250, 88,187,101,223,145,164, 32,159,154,
+196,132, 9, 19,168,113,227,198, 93, 12, 14, 14,222,206, 48, 76, 3, 84,194,178, 37,147,201,142,243,249,252, 26, 69,247, 47, 62,
+ 59, 59,251,179,127,224, 3,201,193,251,193, 99, 75,187, 86, 33, 50, 51, 51,161, 86,171,223, 59,252,252,252, 44,205,149, 89,169,
+114,211, 52,125,104,193,130, 5,110,169, 41, 41,248,117,201,146, 38, 40,180,100, 54,177,228,195,233,233,233,239,149,211,215,215,
+ 23, 86, 84, 10, 83,102,207,158,189,224,203, 47,191,132,201,100,130, 90,173,118,125,241,226,133,255,244,233,211,123,188,124,249,
+178, 49,128, 87, 31, 58, 25,247,246,246,142,254,230,155,111,228,141, 27, 55, 70, 81,150, 10,215, 75,151, 46, 53,217,176, 97,195,
+192,248,248,120, 95, 0,111, 62,228, 11,228,114,249,246,117,235,214,217,139, 68, 34, 28, 62,124,216,190,109,219,182,151,238,220,
+185,211,242, 3,196, 22,105,111,111, 63, 14, 64, 27,134, 97,120, 0,110,100,103,103,207, 69,229,163,186, 43, 36, 18,201,126,146,
+ 36,107, 2,127, 70,163, 39, 73,210,129, 32,136, 12,243, 53,130, 32,156, 24,134,185,150,149,149,213,204,250, 56,254,187, 97,111,
+111, 63, 44, 45, 45,109, 21,159,207,231,202,100, 50,136, 68, 34,112, 56, 28,112, 56,156,106,124, 62,191, 26,159,207,239, 24, 26,
+ 26, 58,230,220,185,115,229, 70,216,111, 26,228, 60, 24, 36,241, 19, 69,144, 20, 0,144,180,216,198,214,214, 22, 63,253,244,147,
+184, 91,183,110, 98, 0,184,124,249,114,248,160, 65,131,218, 38, 38, 38, 6,148, 37,182, 74,211, 34,255, 34,172, 45,111,192, 67,
+145,122,188,240, 86,203, 37, 73,240,120, 60, 92,191,126, 29,150, 4, 43, 55,167, 72, 40,183, 55, 40,138, 48,126,239,222,159, 6,
+ 0,243, 64,195,227,241,112,229,202,219, 65,229,155, 54,109, 90,220,216,255, 46,244,242, 43, 12,242,184,247,235,194,114,133,173,
+ 44,140,174,189,247,107, 95,180,250, 37, 14,189,198,205,234, 83,160,209, 55, 2,160,202,201,206,206,190,117,224, 64,114,144,143,
+ 15,119,251,246,237,141,221,220,220,122, 85, 66,104, 77,105,208,160,193,126, 74,104,235, 16, 62,104,112,248, 80, 14,169, 31, 56,
+114,226,188,132,148, 12,213,136, 17, 35, 14, 28, 62,124, 56,252,231,159,127,126, 50,105,210,164, 41, 0,126,176,180,252, 2,129,
+160,198,211,167, 79,189, 77, 38, 19,252,252,252,254,137,105, 12,130, 80, 24,124,239, 75, 0, 59,139,174,245, 67, 97,228,254, 96,
+ 0,119, 43, 67,102,182, 96,149,118,124,108,184,185,185,249, 14, 24, 48,192, 33, 43, 35, 3,191, 46, 89, 98,190,220, 16, 21, 44,
+ 35,154,219,143, 78,167,195, 23, 95,124, 49,192,100, 50,113,204, 34, 80,171,213,234,114,115,115, 53,248,211,177,244, 13,128, 79,
+ 45, 40,142,167, 88, 44,254, 15,128, 96,181, 90,237, 6, 0, 98,177, 56,137, 97,152,131, 42,149,234, 7,252,153,192,183,210, 19,
+ 92, 0,254, 40, 59, 21, 20,187, 96,193,130,231, 83,167, 78,125,245, 95,224,172,225,236,236, 60, 63, 44, 44, 12, 71,142, 28,193,
+209,163, 71, 13, 66,161,144, 51,104,208, 32, 98,204,152, 49,178,111,190,249,166, 35,128,101, 31,248, 51,119,156, 61,123,182,188,
+110,221,186,216,183,111, 31,238,223,191,175,246,246,246, 22,182,110,221, 26, 28, 14, 71, 62,109,218,180, 14, 0, 54,127,200, 23,
+100,101,101,205,157, 56,113,226,150,157, 59,119, 74, 99, 98, 98,176,114,229, 74,135, 62,125,250, 92,136,143,143,255,164, 18, 98,
+139, 15, 96, 28,128, 80,138,162, 90, 14, 26, 52,200, 56,118,236, 88,154, 36, 73,195,146, 37, 75, 28, 55,108,216,208,135,166,233,
+224,204,204, 76, 75, 38,105, 36,128,159,134, 14, 29, 58,228,220,185,115,178,155, 55,111,242,236,237,237, 97, 50,153,138, 45,197,
+ 12,195, 56,153,159, 89,163,209, 8, 95, 95, 95,247, 18,159, 23,254, 91,133, 6, 73,146,122,134, 97,104, 0, 2, 0,218,138,206,
+255,151, 68,150, 92, 46, 31,157,149,149,245,155,139,139, 11,156,157,157,223, 27,107,181, 90, 45, 4, 2, 1,215,197,197,101, 93,
+183,110,221,232, 67,135, 14,149,185, 4, 72, 80,196,204,195,187,230,184,201,101, 82, 0,192,210,213, 39, 10, 0,224,143, 63,254,
+ 64,114,114, 50,100, 50, 25, 2, 2, 2,168, 57,115,230, 40, 38, 76,152,240,107,118,118,246,208,178,184,222,213, 34,255, 50,139,
+214,218,210,206,203,245,209, 98, 89,182, 56, 79,158,133, 15,237,187,151, 78,191,195, 71,232,116, 58,188,107,209, 50, 55, 94,154,
+166,223, 53, 63,130, 32, 8,182, 60,206, 82, 48, 72, 44, 22, 7,170, 84,170, 21,149,152,221, 22,115,238,253,218, 23, 91,248,147,
+251,153, 51,145,118,156, 88,248,186, 5,192,213,215, 67, 87,174,250,228, 19,183,113, 51,150,207, 82,103, 38,103, 76, 27,208,165,
+134,183,139,189, 80,156,147,158, 43,175, 83,167,253, 59, 22,153,138,202,217, 42, 60, 60,124,235,201,235,177,132, 64,192,229,114,
+ 40,138,110, 81,207,199,222,195,150,178,149, 2,182, 9,175,158, 95, 29, 60,120,112,189, 73,147, 38,181,172, 4, 39,138, 6, 92,
+108,219,182, 13, 4, 65,144,149,169,251, 71,196,233,242, 68, 22,203,178, 32, 8, 98, 71,137, 65,101, 71,209,181, 59, 37,196, 22,
+167,188,251,105,182,166,154, 69,213,160, 65,131, 6, 24,141, 70, 78,137, 78,226, 93, 1, 83,154,136,177,168,238, 10,133,226, 36,
+128, 79, 9,130,128, 78,163,209,253,231,151, 95, 74,254,249,246, 59, 34,235,116, 89,109,201, 96, 48,192,100, 50,113,238,220,185,
+ 67,151,120,214,105, 0, 98, 0, 14, 44,203,130, 36,201, 7, 22,220, 79, 95,145, 72,116, 53, 34, 34,194,166, 97,195,134, 4,143,
+199,131,209,104,196,195,135, 15, 61,126,254,249,231,145,167, 79,159,238,160, 82,169,252,240,126,242,116, 75,126, 35,255, 75,151,
+ 46,169,188,188,188, 74, 21,142, 74,165,146,227,227,227,243, 73, 25,162,232,175,230, 76, 76, 75, 75,235,254,233,167,159,142, 74,
+ 77, 77,141, 54, 26,141,223, 3, 8,112,112,112,184,211,179,103, 79, 8,133,194, 80,181, 90,189,236, 67,158,121, 39, 39,167,110,
+205,154, 53,195,202,149, 43,241,243,207, 63,183, 3,112, 6, 64, 91,165, 82,121,186,107,215,174,176,179,179,235,158,147,147,179,
+249, 3,218,145, 79,171, 86,173,214,253,244,211, 79,210, 35, 71,142,192,219,219, 27,121,121,121,248,238,187,239,156,126,252,241,
+199,243, 57, 57, 57,173, 75,180,139,178, 56,253,248,124,254,230,157, 59,119, 74,188,188,188,188,184, 92, 46,233,229,229,133,172,
+172, 44,104, 52, 26,254,188,121,243,234, 9,133,194,123,203,150, 45,219, 12,160,103, 5,229, 36, 1,204, 93,179,102,205,168, 17,
+ 35, 70,216, 13, 24, 48,192,164,211,233,176,103,207, 30, 80, 20, 5,154,166, 33, 18,137,138,147, 87,115,185, 92,212,169,243, 94,
+144,244,195,229,212, 55, 23,133,126,168,118,168,220,178,235,233,114,248,138,151, 62,104,154,134, 64, 32,128, 64, 32, 0,159,207,
+199,211,167, 79,103, 8, 4,130, 37, 4, 65, 24, 45,225, 36,254, 84, 23,129, 0,110, 86,116,142,247, 93, 67,254,206,254,211, 12,
+119,130, 32,150, 2, 8, 45, 28,118,201, 11, 14, 14, 14,227,211,210,210,226, 44,229, 84, 40, 20,246,153,153,153,203, 20, 10, 5,
+156,157,157,139,199,111, 55, 55, 55, 24, 12, 6,164,165,165,129,101, 89,228,228,228, 64, 36, 18,193,213,213,117,217,136, 17, 35,
+246,173, 93,187, 54,179, 84, 78, 6, 63,119,237, 51,125, 38, 69, 81, 36, 0, 80, 28,137,228,155,169, 64,141, 26, 53,208,162, 69,
+ 11,104, 52, 26,228,230,230,194,223,223,159, 67, 16, 68, 56, 65, 16, 54, 44,203,254, 14,224,236,255,160,161,176, 76,103,248,217,
+239,174,139,154,179,197,115,185, 92,139,132, 86,209,251, 43,178,160,144, 6,131, 1, 92, 46,247, 45,139, 4, 65, 16, 48,153, 76,
+111, 93, 55, 11,173,170, 8,245, 49, 99,198, 48,235,214,173, 27,149,157,157,189, 26, 85, 92, 74, 8, 15, 15,127,207,223, 99,194,
+132, 9,137,233,233,233,236, 23,237, 3,197,209,199,146, 83,106,201, 36, 66, 71,169,180,166, 64, 38,183,203,204,204,188, 86,212,
+153, 88,138,218, 13, 26, 52, 16,110, 57,112, 41,113,248,183, 11,230, 52,244,178,183,169,239,238, 32,115,177, 21,242, 36, 36,161,
+ 18, 24, 13,137,114,185,220,187,178,229, 54,247, 11, 34,145, 8, 36, 73,254,147, 44, 90, 28,179,200,202,202,202,194,145, 35, 71,
+208,169, 83,167, 59,102, 17,162, 84, 42,145,146,146, 2,133, 66,113,167,200,242, 81,225, 50, 34,195, 48,208,235,245,208,235,245,
+197, 2,166,196, 51, 84, 44, 96,204,239,165, 40,234, 65, 21,203, 62, 71, 38,147,181, 10, 13, 13,229,237,218,179,135,199,178,172,
+ 10,133, 57,212,242, 89,182,140, 4,217,239,192,104, 52, 22, 91,217,104,154, 70,124,124,124,241,192,101,206, 45, 41, 16, 8, 44,
+ 51,101,240,249, 19,119,239,222,109,211,184,113, 99, 34, 51, 51, 19, 12,195, 20,119,146,191,253,246,155,160, 87,175, 94,110, 81,
+ 81, 81,211,180, 90,237,236, 42,212,149, 40, 75, 16, 1,128,141,141,141, 17,150, 69,204,174,144,211,104, 52, 18,205,155, 55,159,
+148,145,145, 81, 79,173, 86,207,179,228, 54, 2, 56,156,152,152, 88,114, 96,191, 23, 29, 29,173,238,221,187,183,176,102,205,154,
+ 33,143, 31, 63,254,160,135,212,199,199,167, 41, 77,211,184,113,227,134, 22,128,121,102,125,225,254,253,251,218,158, 61,123,242,
+ 61, 60, 60,154,230,228, 88,236,178,226,227,235,235,123,202,201,201, 73,104,238, 67, 29, 29, 29,233,181,107,215, 74,147,146,146,
+160,215,235, 49,101,202, 20,116,238,220, 25, 14, 14, 14,152, 48, 97,130,243,162, 69,139,182,231,231,231, 55, 40,207,104,205,227,
+241,182,190,120,241,194, 91,161, 80, 8,175, 95,191,142,250,245,235, 35, 35, 35, 3,169,169,169,200,207,207, 71,106,106, 42,134,
+ 14, 29,234,244,235,175,191,186, 90, 96,201, 42, 22, 89,107,215,174,205,217,191,127, 63,181,126,253,122, 41, 77,211,197, 66,139,
+195,225, 20, 11, 45,115,110,197, 42,172, 52,228, 20,137, 54,187,220,220,220, 15,241,115,227, 3,224,149, 20, 89,124, 62, 31,124,
+ 62, 31, 2,129,224,131,242,178,254, 75,224, 70, 16,196, 99, 46,151,203, 23,137, 68, 92,146, 36,193,231,243,219,203,229,242, 71,
+ 1, 1, 1, 1,167, 78,157,138,181,132, 68,163,209,108,229,243,249,180,147,147, 19, 0,192,219,219, 27,245,235,215,135, 74,165,
+ 98,114,115,115, 97,103,103, 71,198,197,197, 65,173, 86, 35, 37, 37, 5,213,171, 87,167, 73,146,220,138, 66, 63,228,247,112,245,
+ 78,234,106, 0,171,205,231, 14, 14, 14,105, 37, 45,157, 2,129, 0,110,110,110, 72, 74, 74,130, 84, 42,165,126,252,241,199,158,
+123,246,236,233,113,245,234,213,112, 0,219, 74, 80,205,254, 23,251,104,153, 69, 86,201,215, 63,133, 86,231,206,157,103, 69, 70,
+ 70,126, 82,218, 44,156,166,233,143,230,235, 98, 22, 84, 54, 54, 54,239, 90,173,192, 48, 76, 89, 22,173, 74,127,143, 64, 32, 16,
+142, 30, 61, 58,239,247,223,127,175,180,216, 10, 91, 25, 93,108,197,122,111, 26,233,231,119,117,218,180,105,221,206,157, 59,151,
+212,208,171, 38, 71,156, 28,151, 47,176,177,179,131,123,181, 78,131,186,247,188,143,194,221,135,150,226, 69, 94, 94,158,176,150,
+187, 72, 71,146, 26,162, 26,159, 35, 85,136,185,124, 23,153,204,141,171,211,166,219,200,100, 60,173, 86,155,131,114,146, 64, 3,
+128,179,179,243, 9,161, 80, 88,221,124, 46,147,201,108, 89,150,133, 72, 36,130, 66,161,144, 80, 20,245,172, 68,227,138, 75, 75,
+ 75,107, 95, 81,193,236,236,236, 78,240,249,252,234, 36, 73,130, 32, 8, 80, 20, 5,146, 36, 65,146,100,241,255, 41,138, 2, 65,
+ 16, 40, 40, 40,136,139,141,141,109,111, 65,125,141, 0,130, 9,130,184,115,228,200, 17,132,132,132,224,216,177, 99,248,252,243,
+207,145,155,155,139,135, 15, 31,162, 85,171, 86, 64,225,146,162, 69, 40,233,252,110,158, 20, 60,125,250,180, 88,184,148, 60,164,
+ 82,233,135,152,216, 47,135,133,133, 97,221,186,117,108,209,100, 66, 76, 16, 68,125, 91, 91,219,167, 79,158, 60,177,200, 15,134,
+101, 89,232,245,127,190,213, 60,120, 21,249, 67, 84, 42, 57, 48, 69, 81,237, 27, 52,104, 64,228,230,230,154, 5, 36, 56, 28, 14,
+ 40,138, 2, 69, 81, 88,181,106,149,176,113,227,198,211,249,124,254, 36, 46,151,171, 52, 24, 12,187, 52, 26,205, 60, 0, 57,255,
+164, 30,169,101,203,150,223, 38, 36, 36,116,174, 94,189,122,196, 7,208,176, 6,131, 65, 7, 64, 72, 81, 20,253, 17,250, 40,170,
+232,217,210,148, 16,251,198,162,115, 62, 10,151,137, 45,130,131,131,195,246,163, 71,143,186, 87,175, 94, 29, 6,131, 1, 70,163,
+ 17,249,249,249,184,112,225, 2,180, 90, 45,140, 70, 35,188,189,189, 49,115,230, 76,205,248,241,227, 5,107,214,172, 73,207,207,
+207,239, 95, 1,237,248,125,251,246,137, 21, 10,133, 80,173, 86,227,213,171, 87,104,208,160, 1,242,242,242,160, 82,169, 80, 80,
+ 80, 0,189, 94, 15,165, 82,105,103, 50,153,116, 21,112,205, 40, 41,178, 70,142, 28,249,128,199,227, 53, 24, 59,118, 44, 18, 19,
+ 19,139,219,252,240,225,195,225,236,236, 92,220,150,138,250,228, 74,117,204, 28, 14, 7,124, 62, 31, 92, 46, 55,167, 90,181,106,
+ 32, 8, 66, 16, 23, 23, 87,149,165, 56, 27, 0, 74,154,166,121, 37, 5, 22,159,207,199,141, 27, 55,166,241,120,188,178,172, 89,
+101,181, 75,182, 50,231,255,109, 16, 4,177,148,203,229,242,229,114, 57,183,196,132,147, 43,145, 72,224,228,228,180, 18, 64, 71,
+ 11,235, 29, 36,151,203,139,251,247,192,192, 64, 36, 36, 36, 28,204,205,205, 29,152,158,158, 14,146, 36,183,146, 36,217,195, 60,
+ 73,205,206,206,134,135,135, 71, 80, 89,124,205,130, 93, 70,129, 96,223,178,104,189, 51, 65,131,141,141, 13, 94,191,126, 13,149,
+ 74,197, 62,127,254,156, 24, 61,122, 52,161,211,233, 54, 69, 69, 69, 93, 67,225,110,251, 50,181,200,191, 4,149,247,209, 50, 91,
+180, 44, 29, 0, 8,130,168,112, 54, 97, 48, 24, 36,254,254,254,165, 57,124, 17,165, 9,173,162,229,164, 42, 61,232, 52, 77, 75,
+171, 42,182,222, 69,196,254,157,206, 63,207,156, 50, 83,238, 90,179,214,164, 73, 51, 56, 93,186,116,185,190,101,203, 22,147,188,
+110,199,182,103, 79,108,115, 94,246,221,228, 99, 71,143, 30, 5, 10, 29,163, 45,197,229,200,200, 72,151, 9,227,198, 96,230,196,
+241,199,109,188, 29,120, 18, 66, 46, 22,104, 85,111, 36, 96,213,252,218,190,157, 15, 68, 68,164, 0,136, 42,143, 68, 36, 18, 85,
+127,252,248,177,119,201,141, 4,186,255,107,239,186,195,163,168,214,247, 59, 51,219, 75, 54,189, 18, 72, 0,129, 0,161,133,222,
+171,128,128, 98,161, 92,165, 94, 48,136,120,189,160, 87,208, 31,122,197, 72, 17,132, 11, 10, 82,114, 65, 41, 98,161, 73, 19,144,
+ 98, 66, 34, 61, 1, 9, 73, 8, 69, 72,111,155,205,214,108,182,204,236,252,254,200,238,186, 9, 41,187, 97, 67,241,238,251, 60,
+243,100,103,103,246,205,153, 51,167,188,231, 59,223,249,142,209, 8,177, 88,140, 51,103,206, 4,138, 68,162, 64, 0,208,235,245,
+232,212,169,147,179, 22,147,136,172,172,172,182, 94, 94, 94,168,168,168,128,193, 96,128,217,108,134,197, 98, 1, 65, 16,224,114,
+185,224,243,249,144, 72, 36,174,174,236,187, 10,224,181,177, 99,199,238, 62,118,236, 24,162,163,163, 81, 94, 94,142,204,204, 76,
+155,200,114,201, 71,203,102, 37,114,244,199,226,112, 56,248,182,117,107,188, 94, 80, 96, 23, 48,235,188,189,241,111, 75,227,118,
+211,232,212,169, 19,155,156,156,140,227,199,143,227,133, 23, 94, 32, 14, 30, 60,104, 98, 24,134, 87, 80, 80,112,189,160,160,192,
+ 41, 14,139,197, 98, 79,171,173,221,118, 20, 88,174, 10, 45,154,166,189,248,124, 62, 42, 43, 43, 97,179, 60, 56, 30,173, 90,181,
+130, 66,161,224,168,213,106, 78, 65, 65,129,120,233,210,165,255, 72, 72, 72, 8,213,104, 52,175, 62,206, 86,104,211,166, 77, 17,
+175,191,254,122, 14,135,195, 97, 71,143, 30, 61, 53, 59, 59,251,197,208,208,208,211,191,254,250,235, 26, 0,237, 92,229, 11, 8,
+ 8,184,194,225,112,194,213,106, 53,111,207,158, 61,102,141, 70,195, 11, 12, 12, 44,182,181, 29,182,188, 54,155,205, 78,173, 92,
+ 14, 8, 8,184, 34,151,203,121,235,215,175, 55,151,149,149,241,130,131,131,139,109, 60, 74,165,146,183,103,207, 30,179, 90,173,
+230,121,123,123, 95, 81,169, 84, 13,242,201,229,242, 41,211,167, 79, 79, 58,125,250,116, 0, 69, 81,200,206,206, 70, 89, 89, 25,
+124,124,124,176,115,231, 78, 68, 68, 68, 96,239,222,189, 10,133, 66, 49,251,243,207, 63,255,208, 42,178, 26,242,209, 26,212,187,
+119,239, 8,165, 82, 9, 31, 31, 31,232,116, 58, 92,185,114, 5, 29, 59,118, 68, 65, 65, 1, 72,146,132,143,143, 15, 54,110,220,
+ 88, 65, 16,132,162, 62, 34,145, 72,244, 98,108,108,172, 15, 0,196,198,198,250,196,198,198,214,218,193,245,237,219, 23, 27, 54,
+108,168, 41,180, 92, 25, 24,216,173, 78, 14,226,168,178, 79,159, 62, 72, 72, 72, 88,232,162, 56, 50,218, 68, 91, 77,107,150, 64,
+ 32,112,121, 49,141,197, 98,225,161,202,165,129,112,230,252, 9,192, 96,145, 72,196,171,249,101, 69, 69, 5, 47, 52, 52,116,160,
+ 11,194,215, 95, 36,170, 50, 56, 69, 68, 68, 64,165, 82, 49, 70,163,113,242,174, 93,187,204, 0, 16, 19, 19, 51,153, 97,152, 74,
+154,166, 41, 62,159, 15,157, 78,135,160,160, 32,255,122,108,163,139, 14,125,191, 52,164,166,143, 86,104,104, 40, 98, 98, 98, 96,
+ 48, 24, 80, 88, 88,136,196,196, 68, 51,195, 48,187, 55,109,218,100, 9, 12, 12,252,251, 43,175,188, 66,165,164,164,188, 5, 96,
+ 65, 93, 90,228, 41,179,102,197,215, 41,180,172, 10, 50, 1,192,144,154, 15, 89, 83,252,212, 39,180, 26,154, 58,228,243,249,202,
+156,156, 28,137, 99,167, 66,211, 52,194,194,194, 44, 44,203, 18,181, 9,173,135, 49, 5,115,185, 92,175, 15, 62,248, 64,185,105,
+211,166, 41,247,238,221, 91,226,204,111,246,188,213, 30, 59,106,136,172,205, 43,227, 54,172, 95,185,212,239,206,241,111,176,245,
+203,213, 12,195, 32,165,115,231,206, 3,181, 90, 45,199, 91, 98,134, 92,137, 99, 86,145,229,172, 40, 36, 1,124,125,233,210,165,
+148, 49, 99,198,252,246,245, 15,251,253, 10,238,222, 61, 47, 80,203, 11,101,109,218,114,120,205, 34, 94,210, 84, 86,242, 38, 79,
+158, 28, 8,224,149,134, 26, 49,165, 82,137,162,162,162,154, 2, 12, 55,111,222,124,224, 94,167, 18, 71,146, 96, 24, 6,251,246,
+237,131, 88, 44,134, 68, 34,169,118,216, 68, 86, 35, 23, 42,100, 1,192,232,209,163,161, 80, 40, 32,149, 74,157, 78, 87, 77,241,
+194,178, 44,140, 70, 35,140, 70, 35, 76, 38, 19, 3,128,203,225,112, 48, 43, 47,207,110,229,113, 69,192,212, 68,231,206,157,217,
+115,231,206,225,183,223,126,131, 78,167,195,250,245,235, 17, 26, 26, 58, 12,192, 71,174,114, 57, 56,233, 51,106,181,154,171, 86,
+171,237,214, 65, 46,151,107,183, 30, 56,105,201,227,113, 56, 28,251,104,212,118, 56, 90,181, 40,138, 66,112,112, 48, 66, 66, 66,
+176,121,243,102, 94,203,150, 45,199, 61,206, 22,104,213,170, 85,109,214,173, 91,183,109,199,142, 29,199,166, 76,153,242, 99, 90,
+ 90,218, 76,111,111,239,235,103,206,156, 89, 42, 16, 8, 44,141,172,223,225, 5, 5, 5, 65,142, 95, 89, 44, 22, 49, 77,211,118,
+ 97, 91, 81, 81,225,244, 0,131,203,229,134,167,167,167,139, 1, 96,233,210,165, 92, 0, 98,155, 51,184,141,179,162,162,130,219,
+177, 99,199,112,103,203,122, 82, 82,210,192, 17, 35, 70,156, 59,121,242,164,111, 68, 68, 4,242,243,243,145,159,159,143, 54,109,
+218, 96,249,242,229, 58,181, 90,221, 31, 64,150, 86,171, 61,232, 36,103,152,175,175, 47, 55, 39, 39, 7, 52, 77,163, 91,183,110,
+216,184,113, 35, 38, 79,158,140, 78,157, 58, 65,173, 86, 35, 61, 61, 29,219,183,111,247,229,241,120,245,182, 29,122,189,254, 96,
+124,124,124,243,154, 22,173,169, 83,167, 74,138,139,139,237,101, 50, 46, 46,174,218, 20,162, 43,109,178,117,106,171,206,163, 49,
+160,105, 90, 38, 20, 10,213, 2,129,128,111,243,207, 74, 76, 76,116,217,154, 85, 99, 0,232,202,249, 99,131, 77,180,214,210,183,
+ 34, 36, 36,196,105, 30,129, 64, 64,216,218, 70,154,166,161, 82,169,152,208,208, 80,251,244,126,106,106, 42, 19, 25, 25,201, 80,
+ 20, 69,241,249,124, 16, 4, 1,177, 88, 92,103,131,207, 50,108,220,243,147, 63,170,182,234,112,254, 7,128,201,100, 66,106,106,
+ 42, 76, 38, 19, 18, 19, 19,205,159,127,254,121,129, 82,169,156, 15,128,115,226,196,137,233, 11, 23, 46,164,130,130,130, 70,148,
+148,148,160, 33, 45,242, 20,137,173, 7,172, 92,182, 94, 40, 97,220,184,113,132,117,105, 37, 97, 19, 78,174, 8, 45,107,229,107,
+176,231, 37, 8, 2,133,133,133,246,243,160,160, 32,151,255,151,179,240,247,247,215,245,237,219,215, 75, 46,151, 31, 92,181,106,
+ 85,163, 44, 89,155, 87,198,109, 88,241,233,199,126,138,140, 11,200, 43, 40,132,162,196,156,146,124,253,222, 1, 0, 7, 0, 0,
+ 91, 58, 36, 16,111,100,126,229, 44,103,251, 0, 81, 87, 46,143,115,224,217, 49,227,154, 79,138, 93, 64,190,249,230,155, 3,166,
+ 79,159,174,154, 50,101,202,219, 82,169,180,157,201,100, 42,223,127,244,232,253, 73,147, 38,181,100, 24,102, 58, 26,136, 57,162,
+215,235,179,135, 12, 25,226,152,159,178, 83,167, 78, 5,223,191,127, 31,243,230,205, 43,205,207,207, 87, 58,222,235, 76, 26, 77,
+ 38, 83,118,215,174, 93,235,156, 46,180, 77, 41, 2,128, 70,163,201,118, 33, 75, 95,133,213,241,189,172,172, 12, 55,111,222, 4,
+135,195, 65,159, 62,125,144,156,156,140, 1, 3, 6,164,186, 98,213,170,172,172, 68, 68, 68, 4, 42, 43, 43,161,211,233, 42, 0,
+ 8,118,182,108, 9, 0,120,171,172, 12, 87, 62,255, 28, 23, 86,172,128, 99,121,118, 22, 93,186,116, 97, 47, 92,184,128,235,215,
+175,195, 96, 48, 96,246,236,217, 0, 64, 88,203,174, 43, 33, 51, 90, 83, 20, 53,122,204,152, 49, 97, 0,160,211,233,136, 75,151,
+ 46, 65, 40, 20,218,235,194,225,195,135,145,159,159, 15,130, 32,224,235,235, 27, 94, 94, 94,222, 18,192,189,122,204,254,196,189,
+123,247,240,217,103,159,193, 98,177, 96,225,194,133,104,219,182,173, 93, 96,101,103,103, 99,233,210,165, 96, 24, 6, 31,127,252,
+ 49,218,180,105, 3,179,217, 44, 68, 35, 67,104,184, 3,239,188,243,206,157, 3, 7, 14, 28,203,205,205,125,110,229,202,149,131,
+ 9,130,176,188,247,222,123,159,201,100, 50,230, 97,120,203, 85, 26,220,188,157,109, 23, 66, 53,143,192, 0, 63,151,249,110,221,
+205,181,255,158, 97, 28,249, 24,248,251,249,186,154,196, 10,179,217,172,123,233,165,151,124,246,237,219, 71,180,105,211, 6,127,
+252,241,135,205, 50, 84, 1,215, 67, 58,228, 43, 20,138,182, 20, 69,241,110,223,190,141,200,200, 72,244,238,221, 27,203,150, 45,
+131, 92, 46, 7, 77,211, 8, 10, 10,178,152,205,230, 84,147,201,116,182, 1,174,184, 57,115,230,240, 0,188, 97,181,108,117,158,
+ 63,127,190,101,245,234,213, 72, 77, 77,181, 91,176, 28,157,225, 93,157, 58,116,180, 58, 57, 30,137,137,137, 11,249,124, 62, 11,
+224, 34, 92, 15,244,108,172,105,209,106,140, 53,171,169,208,148, 43, 25, 67, 67, 67, 19,189,188,188,198,149,151,151, 87,179,106,
+245,239,223,223, 20, 28, 28,156,228, 44,143, 84, 42, 45,167, 40,202, 31, 0,242,243,243, 33,145, 72,120,119,239,222, 93,129,170,
+224,217,104,217,178,229, 10,133, 66,193,107,105,109, 79, 67, 66, 66, 96, 52, 26,235,116, 99, 57,127,181,248, 27, 0,223,216,206,
+253,252,252, 10, 85, 42,149,104,245,234,213,218, 21, 43, 86,232, 25,134, 49, 0, 56,163, 84, 42,237,113,180,138,138,138, 84, 92,
+ 46,215,207,199,199,167,153, 77,104,213,166, 69,158, 50,212,109,209,178, 42, 73,182,166, 32, 34, 8,226, 1, 7,245, 6,132, 86,
+131, 34,139, 97,152,106, 86, 6,155,195,123,109,255,203,218,169, 55,106,234,208, 42,178,132,251,247,239,223,185,106,213,170,139,
+206,254,206,209, 71,107,203,154, 79, 87,218, 68,214,239,191,157,196,193, 76,149,124,225,138,181,235, 26,251, 6, 58, 4,136,187,
+ 4, 7,251, 39,124,190, 60, 78,118,231,248,118,252,184,229, 63,236,239,151, 47,247,186,124,249,242,180,121,243,230,181,176, 22,
+ 44, 5,128,107, 0, 38,193,137, 85, 58,249,249,249,163,106,116,194, 89, 60, 30, 47, 88, 44, 22, 35, 63, 63, 95,123,235,214, 45,
+151,167,100,228,114,249,168, 38, 40,128, 28,155,200,146,203,229, 72, 79, 79,199,208,161, 67, 1, 0,201,201,201,232,223,191, 63,
+ 82, 82, 82,208,189,123,247, 84, 0, 61,209, 64,160, 86,179,217,172,236,208,161,131,221,186,165, 82,169, 44, 0, 16, 91, 88,136,
+248,208, 80,112, 56, 28, 92, 88,177, 2,139,205,102, 44,115, 81,192,119,237,218,149,189,116,233, 18,238,223,191, 15,154,166, 49,
+126,252,120, 52,178,210,119,106,223,190,253,169, 51,103,206, 4, 74,165, 82,232,116, 58,104,181, 90,204,152, 49, 3,147, 39, 79,
+134,193, 96,192,158, 61,123,112,232,208, 33,120,121,121, 65,167,211, 65,167,211,249,142, 29, 59,246, 92, 86, 86,214, 32, 0,183,
+235, 16, 90,236,168, 81,163,144,148,148, 4,138,162,208,171, 87, 47,148,149,253,185, 24, 40, 56, 56,184,182,107,212,227, 20, 90,
+ 28, 14,135, 77, 76, 76, 92, 57,120,240, 96,228,230,230, 62,215,189,123,247,245, 51,103,206,204,127, 88, 94, 95,111, 47,116,237,
+216, 26, 6,131, 1, 6,131, 1, 97, 97, 97,208,104, 52,184,115,231, 14, 12, 6, 3,130,131,124, 92,230,139,233,212,198,206, 23,
+ 20, 20, 4,157, 78,135,123,247,238,193,104, 52, 34, 32,192, 37,161,213,124,212,168, 81,191,238,222,189,219,127,251,246,237,198,
+ 33, 67,134,240,215,175, 95, 79,200,100, 50, 56,116, 44,174, 34, 49, 57, 57, 57, 98,196,136, 17, 81, 25, 25, 25, 72, 76, 76,132,
+209,104, 68, 76, 76, 12,110,221,186,133,190,125,251, 66,171,213, 94,188,124,249,242, 33,103, 12,195, 0, 62,156, 51,103, 14,108,
+ 98, 43, 41, 41, 9,133,133,133,240,242,242,122, 64,104,217,124, 31,173,171,198,195,156, 73,172, 77, 16, 57, 88,158, 22,251,248,
+248,152, 0,172,107,164,245, 9, 0,144,155,155, 43,232,220,185,179, 65, 40, 20,242,173,162,109,237,195,240,185, 19,110, 88,201,
+ 88, 39, 66, 66, 66,230, 7, 4, 4,140,104,213,170, 21,138,139,139,121,124, 62, 31,253,251,247, 55,245,236,217,211, 20, 18, 18,
+242,150,179, 60, 2,129, 32,131,199,227, 13,170, 26, 76, 48,200,201,201, 1,203,178, 11, 59,117,234,244, 79,141, 70,131,178,178,
+ 50,190, 76, 38,179, 15,170,163,162,162, 96, 48, 24, 50, 92,176,188,197, 69, 70, 70,126,200,227,241,150,201,229,242,218,194, 66,
+240,125,124,124,100, 60, 30, 15, 38,147,169,154,216,172,169, 69,158,118,145, 85, 77,104, 57,168,200,106, 66,199, 21,139,150, 51,
+ 86, 3,155,131,189,227,185, 77,212,213,252, 95,141,141,161,229,237,237,109,176,137,172,101,203,150, 93,108, 12,199,222,221,187,
+ 66,189, 45, 21,205, 11, 46,254,140,172,235, 41, 56,144,174,148, 47, 92,177,246,237,231, 95,121,181,184,166, 48,115, 6,109, 3,
+197,157,130,131,252, 19,214,172, 90, 33, 83,100, 92, 64, 97, 81, 17,126,190,120, 57,197, 4,164, 3, 88,232, 78,211, 50, 80, 53,
+117, 72, 81,212,147, 84, 96,237,206,240,133,133,133, 54,145, 21, 3, 0, 3, 6, 12, 72,181,138, 44, 56,107,209, 82, 42,149, 53,
+183,172, 25, 1, 32,192,246,252, 28, 14, 7,253, 63,252,208,101,145, 5,128, 77, 73, 73,129, 66,161,176,141, 20, 27, 43,178, 16,
+ 18, 18,242,175, 51,103,206, 4,126,253,245,215,234, 29, 59,118,148, 89, 44, 22,110,215,174, 93,195,123,244,232, 65,236,220,185,
+ 19, 0, 48,105,210, 36, 44, 92,184, 16, 55,110,220,128, 68, 34,193,128, 1, 3,152, 37, 75,150, 4,205,159, 63,255,173,226,226,
+226,183,107,237, 29, 45, 22,158, 80, 40, 60, 13, 96, 88, 70, 70, 6, 0,156, 67,213, 22, 78, 54, 43, 66,157,215,156,233,124, 53,
+ 26, 13,215,203,203,171,214,208, 16,188,170,209,144,171, 22, 8, 59,231,111,191,253,246,217,154, 53,107, 14,188,251,238,187,183,
+ 31,146,179, 86,139,214,184,113,227,160, 55,152,144, 87,172, 2,195,208,208,155, 74, 92,230,115,180,104,141, 27, 55, 14, 21,149,
+ 70,228, 20, 42, 64,211, 12, 52,122,167,251,114,241,179,207, 62,123,226,251,239,191, 15, 57,127,254, 60, 24,134,177,220,186,117,
+235,222, 75, 47,189, 36,123,239,189,247,252, 31, 98,145,209,151,175,190,250,234,132,223,126,251, 77, 17, 21, 21,229,119,241,226,
+ 69,148,148,148,128,166,105, 12, 27, 54, 12,124, 62, 63,103,197,138, 21, 60, 0, 95, 58,251,110,172, 98,203,116,249,242,229,215,
+ 47, 92,184,224,231,231,231,199,183,180,111,143,194,147, 39,177,111,223,190, 7,126,176,101,203, 22,192,201, 40,252, 54,139,211,
+165, 75,151,220, 34,176,170,245,212,124,126,163,167, 31,159, 86, 92,186,116, 41,255,205, 55,223,236, 40,147,201,214, 13, 28, 56,
+112,168,191,191, 63,233,235,235,155,216,172, 89,179,127,118,237,218,213,233,217, 5, 46,151, 59, 83, 34,145,220,161,105,154,210,
+106,181,208,233,116, 85,141, 52, 77,243, 73,146, 68,203,150, 45,237,125, 73,175, 94,189, 16, 18, 18,194,100,102,102,206,116,150,
+191,180,180,180,218, 42,196, 90, 48,167,127,255,254, 28,131,193,128,251,247,239, 39, 59, 94,168, 77,139, 60, 37,136,173, 87,124,
+217, 30,202,241,225,154, 53,107,150,107, 54,155,217,116,128,189,118,237, 26, 27, 27, 27, 91,239, 81, 89, 89,201, 6, 5, 5, 21,
+214,210,249,193,145,211, 96, 48, 84,251,157,193, 96, 96,131,131,131, 25,189, 94,255, 0,167, 94,175,103,195,195,195,243,235,227,
+172, 5, 51,174, 94,189,186,105,241,226,197,189, 93,200, 32, 59, 39,187,185, 61,187,125,251,246,191,177, 44, 59,120, 96,199,136,
+235, 19,187, 6,179,253,219, 6, 21, 28,218,187,123, 50,203,178,131,107, 30,182, 0,167,245,113,182, 15,150,116, 24, 30,221,162,
+252,247,227,223,177,103, 86,255,131, 93, 51,190, 45,219, 61,220, 75,217, 62, 64,228,234, 30, 49, 13,238,150, 30, 29, 29,157,101,
+177, 88, 88,163,209,200, 70, 71, 71,223,114, 7,103, 35, 80, 31,103, 55, 84,249,178,189, 90,203,119,221, 30, 34,157,191,179, 44,
+203, 42, 20, 10, 86,171,213,178, 6,131,129,101, 24,134,117, 4,128,223,157, 92,118,192,127, 0, 0, 32, 0, 73, 68, 65, 84,224,
+100, 77, 38, 19, 91, 94, 94,206,194,121,159,187, 90, 57, 67, 67, 67,239,221,189,123,151,125,230,153,103,114,173,230,248,249, 58,
+157,142,173, 9,157, 78,199, 14, 29, 58,148,189,117,235, 22, 27, 25, 25, 89,121,235,214, 45, 54, 52, 52,244,102, 3,233,108,213,
+188,121,243,211, 1, 1, 1,137, 0,218,186,112,173,222,252,220,179,103, 79,107,150,101,103,179, 44, 27, 91,199, 49,155,101,217,
+246,143,155,211,154,191,197, 44,203,178, 21, 21, 21,172, 66,161, 96, 11, 10, 10,216,138,138, 10, 86,171,213,178, 87,175, 94,101,
+207,159, 63,207, 94,191,126,157,245,243,243, 43,118,134,211,198,103, 52, 26, 89,181, 90,205,150,148,148,176,122,189,158,213,233,
+116,108, 90, 90, 26,123,229,202, 21, 54, 35, 35,163, 54,190, 7, 56,253,253,253,183, 20, 21, 21,105,207,157, 59, 87,177,121,243,
+230,138,144,144,144, 12, 0, 17, 0,218,249,250,250, 22,253,227, 31,255, 96,165, 82,105,118, 35,235, 81, 71, 46,151,123,117,229,
+202,149,151,142, 28, 57, 82,124,232,208, 33,227,182,109,219,242,230,205,155,119,150,195,225, 92, 5,208,177,145,245, 40,200,199,
+199,231,220,197,139, 23,233,242,242,114, 86,169, 84,178,106,181,154,213,233,116,172, 94,175,103,141, 70, 35,107, 54,155,217,179,
+103,207,178,193,193,193,142,211,146,139,234, 25, 88, 47, 96, 89,246, 95, 44,203,114,220,221,214, 57,112, 15,116, 23,167, 59,218,
+ 58,146, 36, 77,214,182,163, 79,213,105,253,231,143, 43,157,195,135, 15,255,120,242,228,201,236,232,209,163,217,152,152,152, 7,
+142,238,221,187,179,115,231,206,101,143, 28, 57,194,126,254,249,231, 31,187, 33,157, 28, 84, 45,122, 89, 62,124,248,112,115, 82,
+ 82, 18, 59,105,210, 36, 22,192,168,250,180,200, 95, 65,112,217,194, 59, 16,142,127, 1,192,100, 50,229,102,101,101,133, 70,209,
+ 52, 5, 0, 95,125,245,213, 3,150, 41, 71, 36, 37, 37,209, 4, 65,220,169,239,191,155, 76,166,220, 51,103,206, 4,111,216,176,
+129,235, 96, 2, 6, 77,211,150,130,130, 2,114,253,250,245,213,238, 79, 72, 72,160,105,154,206,113,241, 33,183,119,235,214,109,
+187, 59,114,235,236,141,251,255, 60,241,243, 79, 1,125,122, 15, 84,202,252,252,106, 29,133,237,121,171, 61,136, 55,234,183,106,
+ 17, 28,114,217,202,229,113, 62,182, 41,200, 31, 82,139,148,149, 6,102,104,166, 92,255,187,187,223,176, 86,171,189,111, 91, 9,
+168,211,233,114,158,192, 66,120, 21, 85, 49,174,232, 26,223,245,196, 67, 58,157, 90, 44, 22,120,123,123,219,173,161,141,176,136,
+178, 54, 11,171,237,213, 61, 76,122, 88,150,253, 45, 45, 45, 45,114,198,140, 25, 94, 59,118,236,184,203, 48, 12,119,214,172, 89,
+166,144,144, 16, 94,114,114,178, 25, 0, 49,120,240, 96, 78, 81, 81, 17,155,159,159,175,120,225,133, 23, 52,175,191,254,186,255,
+181,107,215,248, 22,139,165,161,160,133,127,228,230,230, 14,111,196,181,122, 49,113,226,196,187,120,248,109,108,154,156,211, 6,
+133, 82,141,187,247,243,173, 17,204, 45, 96,178,139,237,126, 85,102, 51, 13,133,186,204,101,139,214,157,123,249,214, 45,198, 24,
+ 48, 76,129,149,175,202, 33,158, 45,175,104,184, 55,225,112, 6, 44, 89,178,100, 12, 73,146,228,133, 11, 23, 12,171, 86,173,202,
+ 45, 45, 45, 29, 15, 32, 7, 0,202,203,203,135,108,223,190,253, 91, 39, 66, 57,212,133,116,179,217,220,119,209,162, 69,111, 3,
+ 24, 0,160,133,149, 59,217,106,201,106,108, 4,243, 18,165, 82, 57,114,204,152, 49, 39, 41,138,106,233, 80,143, 2, 0,200,109,
+245,130,101,217,160,226,226,226,231,156, 33, 36, 8, 98,109, 83, 53, 36, 77,201,253,144,237,208, 83,177,146,241,244,233,211,159,
+140, 31, 63,158, 19, 17, 17,241,127, 17, 17, 17,100,121,121, 57,180, 90, 45, 72,146, 68, 72, 72, 8,162,163,163, 17, 18, 18, 98,
+201,200,200, 88,254,254,251,239, 55, 24,147,175, 67,135, 14,173,205,102,243, 51, 36, 73,182, 6,208,154,101,217,214, 4, 65,180,
+ 6,224, 7, 0, 50,153, 76, 22, 25, 25,201,233,211,167, 15,122,247,238,141,132,132, 4,236,221,187,247, 27, 0, 39, 28,173, 89,
+ 53,181,200,147,128,244,110, 96, 59, 94, 5,113,163, 59, 6, 19, 22, 36,176, 36,134, 68,167,216,227,236,213, 20, 89,117,111, 42,
+ 93,139,233,111,212,176, 97,195,236, 21,206,137, 78,229,126, 67,149,175,180,180,116,212,204,153, 51,171,113, 50, 12, 99, 40, 43,
+ 43,123,179, 95,191,126, 27, 41,138, 18,212, 40,176,217, 37, 37, 37,143,116,175,190,154,113,180, 70,141,121, 81,254,176,156, 82,
+ 30,249, 76,214,209,255,162,184, 68,142, 31, 82,139,202, 53, 70,102,200, 45,121, 69, 90, 83,164, 63, 59, 59,123,244, 83,160,248,
+107, 19,173, 15,187,121,118,169, 19, 1, 73, 27,218,163,142,176,134, 19,113, 75, 37, 47, 42, 42, 90,253,225,135, 31,142, 92,190,
+124,121,224,177, 99,199,100,182, 1,202,203, 47,191, 92,146,150,150, 54, 16,128,160,178,178,242,212,242,229,203, 3,227,226,226,
+252, 1,248, 3,192,216,177, 99,139,139,139,139, 55,192,131,122, 97, 54,155,243,162, 59, 68,217, 7,126,142, 33, 29, 28, 63,211,
+ 52,157,231, 10, 95,109, 60,142,231, 12,195,212,203, 71, 81,212,187,189,123,247,166,222,125,247,221,226, 99,199,142,217, 54,210,
+117, 84,104, 89, 13, 4, 37,117, 6, 6, 0,171,172,135, 59,161, 83, 40, 20,125, 93,252, 13,227, 41,141,181, 14, 40, 93, 57,127,
+ 44, 56,120,240,224, 71,147, 38, 77,218,238,231,231,183,171,117,235,214, 81,193,193,193, 50,145, 72, 4,131,193,160, 49, 26,141,
+ 55,179,178,178,166,124,244,209, 71,127, 56,101,225,216,190,157, 2,192,179, 88, 44, 66,146, 36, 37, 0,100, 4, 65,248,218,132,
+ 22, 65, 16, 48,153, 76,184,127,255, 62, 22, 47, 94,204,156, 62,125,250,115, 0, 31,187, 48,112,237, 9, 32,208,161, 29, 15, 4,
+ 96, 68, 85, 0,219, 82,130, 32, 46, 55,117,126, 17, 22, 36,116,188, 10, 34,189, 27,106,235, 39,234,223, 84,186,174, 10, 87, 90,
+ 90,218,215,221,149,184, 46,206,210,210,210,136, 39,165,134, 76, 55,172,250, 14, 91, 86, 85,219,231,208, 38,194,106, 59,111, 8,
+ 42, 61, 61,239,203, 19, 55, 86, 27,104,214, 98,162, 45,127,191, 85, 90,145,238,105,135,220,142,103,221, 85,151,220,152,166,180,
+204,204,204,126,243,230,205,251, 72, 44, 22,247, 2,128,138,138,138, 11, 5, 5, 5,159,194,186,170,176,161,235, 30,212, 13,185,
+ 92,222,227, 73,228, 51, 26,141,255,236,215,175,223, 23, 12,195,172,161,105, 58,249,127,224, 85, 84,122, 74,227,211,139, 31,127,
+252,241, 15, 0,125, 1, 96,194,132, 9, 20, 0,236,221,187,215,101,241, 60, 99,198, 12,134,101, 89,147,181, 60,232, 80,181,186,
+176,220,214,166,234,116,186,242,130,130,130, 12,134, 97, 50, 0,124, 11,215, 87,220, 6, 18, 4,113,132,101,217,113, 86,225,118,
+132,101,217,113,142,223, 53,181, 85,171,129, 91, 26,118,134,247,160, 10,123,211, 65,212,156, 10,108,232,188, 33,100, 21,235, 18,
+ 1,116,247,228,238,255, 36,238, 22, 20, 20, 76,127,136,235, 30, 60,125,200, 49, 26,141,227,255,135,158, 87,229,121,229,127,145,
+254,175, 17, 2,203,134,140,140,140, 38,115, 17,120,220,232,120,181,250, 0,188,230,185, 3, 98,107, 19, 94, 30,161,229,129, 7,
+ 30,120,224,193,195, 64,233,201, 2, 15,254,202,176,249,102,217,206,235,240,209,170,233,159,101, 63, 39, 80,247,202, 1, 87,118,
+ 37,111,204, 42,137, 83, 30, 78, 15,167,135,211,195,233,225,124,236,156, 62, 0, 34, 1,172,108,224,190,154,171, 11,139, 1,200,
+ 1,152, 61,249,233,225,124, 8,253,224, 20, 88,150, 29, 91,223,212, 33, 65, 16, 71,155, 74,104,217,157,225,187, 97, 73,244, 85,
+ 44,177,157, 59, 43,180,154, 26, 35, 60,156, 30, 78, 15,167,135,211,195,233,225,244,112,122, 56, 31, 82,104, 13,125,255,253,247,
+ 63, 64, 85,104, 12,246,253,247,223,255,128,101,217,177, 85,151,216,177, 77,249,191,111,116,199,224,244,110, 96,109,199,141,238,
+ 24, 92,199,173,177, 14,135, 29,158,169, 67, 15, 60,240,192, 3, 15, 60,240,224, 73,199,185, 21, 43, 86, 84,172, 88,177,194,230,
+248, 94, 10,128,176, 90,184, 74,155,242, 31, 91,167, 9,157, 89, 40, 85,255, 22, 60,143, 1, 97, 36,135, 55,149,203, 19, 12, 5,
+107,137, 6, 0,144,212, 13,198, 88,249, 43, 77,155,118, 1, 40,104, 44,113,123,160, 67, 27, 31,209, 33, 3,195,240,114, 53,198,
+ 9,153, 85,219, 28,184,140, 9, 64,127, 1,159,255,139,192,199, 71, 84,219,117,131, 82,169, 55, 24,141, 35,247, 2,191,121,234,
+128, 7, 30,120,224,129, 7, 79, 9, 36,190,190,190,167, 73,146,140,176,125,225, 24,119,176,102, 12, 66,134, 97, 10, 21, 10,197,
+ 72, 84, 77, 21, 63, 74, 78,199,223, 27,209,200,190,220,221,112,117,234,144, 3, 84,139,194,250, 72,118,204,166,184,130,215,189,
+188,125,150,253,109,230, 63,253,219,182,139, 34,154, 55,111, 6,176, 64, 78,110, 94,240,157,219,183,134,255,184,227,203,119,212,
+ 42,197, 98,179,193,240, 95, 87,185, 59, 0,146, 22, 82, 65,242,127,223,127,205,135, 3, 26,175, 46,221,125,156,208,154,154,103,
+ 84, 45, 55,117, 73,100,249,248,251,159, 88,113,234,148,200,183, 75,151,106,215, 88,150,173,218, 95,239,247,223, 69,255, 55,114,
+228,137, 9, 10,197, 40,143,216,250, 75, 34, 68, 38,147,205,231,114,185, 67, 76, 38, 83, 4,159,207,207,101, 24, 38,177,188,188,
+124, 29,128,124, 79,246,252,181, 17, 21, 34, 25, 24,213, 58, 98,119, 65, 81,113,170,186,210, 56, 43,171, 64,171,240,228,138,203,
+168,111,127,205,199,182,247, 38, 0, 72,165,210, 43, 36, 73,134, 59,138, 0,219,158,189,182,243,154,127, 45, 22,203, 31, 10,133,
+162, 95, 61,180,173,253,252,252, 54, 2,232,217, 80,192,100,107,108,182,203, 10,133,226, 77,212,189, 90,207,203,215,215,247, 19,
+130, 32, 38,146, 36, 73, 53,244, 76, 22,139,133, 97, 89,118, 79,121,121,249,199, 0, 52,117,221,231,235,235,123, 42, 51, 51,179,
+103, 80, 80, 80,131, 86, 26,154,166,145,147,147, 19,216,171, 87,175,179, 10,133,162,125, 83,114, 62,106, 45,210, 88,212,179,234,
+176,206,130, 14,160,218,254, 66, 77, 26,145,149, 39,148, 30,234, 59,104,212,208,185,111,191, 43,185,154,118, 19,191, 36,156,135,
+ 90,103, 0, 69,146,240,241, 18,163, 93,187,103,136,181,241,251, 2,190,217,188,118,205,133,164,147, 99, 43,117,170, 23, 92,146,
+233, 98,206,226,133, 47,245,146,248,251, 49,128,133,193,191,198,116,149,252,223,145,212,197,168,160, 63,112, 89,100,157, 62, 45,
+ 46, 41, 46, 70, 92, 88, 24, 56, 52, 13, 33, 73, 66, 72, 16, 16,146, 36, 36, 66, 33, 70,111,219,134, 79,143, 29, 19,127,244,220,
+115, 30,177,245, 23,131, 84, 42,157, 25, 22, 22,182,106,235,214,173,254,173, 90,181,130, 68, 34,129, 66,161, 8,200,202,202,234,
+182, 96,193,130,233,133,133,133, 31,170,213,234, 45,158,156,250,235,194, 98,193,212,175,151,189,217,172, 48,251,118,179, 57,203,
+191,107, 71,248, 51, 67,110,150,233,139, 60, 57,227, 52,186, 1, 72, 69,237,251,151,214,119,173, 78, 8,133,194,226,202,202,202,
+160,250,238,225,243,249, 37, 70,163, 49,184, 33, 46,146, 36,195,243,243,243,131,196, 98, 49, 24,134,177,238, 6, 96,177, 15,164,
+ 29,119, 63,177, 6,170, 69,251,246,237, 77,245,113,122,121,121,125, 85, 82, 82, 50,194,182, 79,160,131,160,170, 21,249,249,249,
+ 35, 58,118,236,248,149, 70,163, 25, 89,135,120,249,228,237,183,223,158,223,169, 83, 39,155, 21,200,186, 11, 66,213, 95,185, 92,
+142,121,243,230,217,255,135,197, 98,193,201,147, 39,223,158, 57,115, 38,202,203,203, 23,212,243,236, 17, 65, 65, 65,132,117, 67,
+241, 58,177,100,201, 18, 44, 89,178, 4, 95,126,249, 37,193,229,114,125, 26,200, 79,183,112, 62, 42, 45,210, 24, 11, 86, 3,145,
+225,143,162,186,111,214,209, 7,132,214,163, 0,197, 21,252,189,103,191, 17, 67,230,205, 95, 40,249,238,167, 51,200,202,248, 29,
+153,201,223, 87,187,167,199,200,153, 40,146,107, 48,115,238,191,164, 4,197, 25,146,116,234,224,223,205, 6,253,215, 78, 90,179,
+130, 35, 4,252,127,244,233, 21,205,205, 23,101, 33,196, 87,132, 1,221,219,112,155,159,184,254, 15, 29,232, 47, 50,170, 86,201,
+184, 36,178,182,190,246, 26, 6,154,205, 8,162, 40, 80, 4, 1, 10, 0, 73, 16,168, 52, 24,112,121,234, 84,244,218,185, 19, 31,
+ 31, 62, 44,254,228,249,231, 93, 18, 91, 18,137,228, 42, 65, 16,190, 90,173,118, 44,170, 54,150,126, 26,208, 81, 42,149, 30,101,
+ 89,182, 92,167,211,117,123,130,210, 21,138,170, 57,250,154,163, 99, 30,170, 86, 84,185,180,179,176, 64, 32,120,125,194,132, 9,
+107, 55,108,216, 32, 46, 46, 46, 70, 65, 65, 1, 24,134,129, 80, 40, 68,219,182,109,137, 83,167, 78,249, 47, 92,184,112,245,209,
+163, 71, 5, 26,141,230, 11, 87, 6, 54, 92, 46, 55,222,207,207,239,185,224,224, 96, 73, 73, 73, 73,133, 82,169, 60,105, 48, 24,
+ 94, 71,227,183, 77, 33,185, 92,238,148,200,200,200, 23,195,194,194,130,243,243,243,229,121,121,121,135, 12, 6,195, 55,104,228,
+ 70,205, 14,121,218, 5,214,104,245, 0, 10, 35, 35, 35,111,220,191,127,191,196,141,156, 5,145,145,145,233,141,224,148, 0,248,
+ 17, 64, 88, 3,247, 21, 0,152, 4, 23,173,217,246,140,101, 45, 63, 47, 93,183,117, 86,220,140, 1,196,215, 11, 70,180,125,227,
+203, 83,231, 73, 30, 59, 40,163,176, 50,215,163,161,156, 19, 89,214, 45,173,106, 10,170,250,174,213, 11,131,193, 16,104, 50,153,
+192,173, 99,179,120,157, 78, 7, 47, 47,175, 64,103, 19, 41, 18,137,240,253,247,223,131,203,229,130,203,229,162,188,188, 28,225,
+225,225,246,115, 30,143,103,255,220,162, 69,139, 6,249, 24,134,233, 69, 81, 20,180, 90, 45, 24,134,177, 31, 74,165, 18, 44,203,
+ 66, 32, 16,128, 97,170,182,115,114,184,222,171, 46, 62,130, 32, 38,134,133,133,225,187,239,190,131,209,104,124,224,186, 76, 38,
+ 67, 90,218,159,155,140, 80, 20,133,222,189,123,147, 4, 65, 76, 4,176,160, 30, 94, 22, 0, 98, 99, 99, 65, 81, 20, 40,138, 2,
+ 73,146,246,207,182,131, 97, 24, 44, 89,178, 4, 53,182, 38,123,100,156, 79, 26, 26,136, 12, 95,136, 58,124,180,200, 38, 78,151,
+227, 18,207, 48,177, 68,246,217,155,255,252,151,244,232,217,235,200,201,205,121, 64,100, 1,192,149, 95,190, 65, 97, 65, 62, 82,
+ 51,243, 48,229,239,111, 73,101, 50,159,207,106, 52,168,117, 46, 27,245,246,226,125,254,254,164, 1, 66,173,185, 0, 26, 95,128,
+106,205, 7, 87,172,195,194,113, 93, 4, 50, 47,222, 42,103,210, 41,224,243,127, 89,113,234,148, 93,100,245, 55, 24, 32, 96, 24,
+208, 12, 99, 23, 89, 70,154,134,222,104, 68,168, 86,139, 59, 51,103,130, 53,155,241,225,129, 3, 98, 1,159,255,139, 51,233, 4,
+ 0, 30,143, 23,122,232,208,161, 22,157, 59,119, 78,128,243,193, 76, 79, 53,241, 59,170, 15,221,187,118,237,154,184,115,231,206,
+ 22, 60, 30, 47,212, 29,156, 66,161,240, 21,137, 68, 82, 42, 20, 10, 95,105,100, 58, 73, 0, 75,103,205,154,149,242,204, 51,207,
+156,177, 10, 43,187,168,121,230,153,103, 78,205,154, 53,235, 42,128, 37,117,148,245,218, 56,155,133,133,133, 45,219,176, 97,131,
+248,214,173, 91,200,207,207,135,217,108,198,171,175,190, 10,134, 97,160,215,235, 97, 52, 26,177,114,229, 74,137,191,191,255, 98,
+ 84,109, 20,236,204,179,243,188,189,189,111,237,216,177, 99,194,189,123,247,164,103,206,156, 33,210,210,210, 36,171, 87,175, 30,
+239,239,239,159, 5, 64,208,136,252, 36, 67, 67, 67,191, 62,120,240,224,155,105,105,105,225,251,247,239,231, 94,184,112, 33,116,
+243,230,205,179, 67, 67, 67,119, 2,160, 26,249,142,186,137,197,226,225,239,189,247,158,229,220,185,115,249,231,206,157,203, 95,
+187,118, 45, 6, 14, 28,216, 63, 46, 46, 46,166,145,156,221,189,188,188,134,189,247,222,123,150,164,164,164,130,139, 23, 47,230,
+173, 94,189,154, 28, 54,108,216,128,101,203,150,117,113,145,243,199,115,231,206, 13,206,205,205,109,149,151,151,215, 50, 47, 47,
+ 47, 50, 47, 47, 47, 50, 63, 63, 63,162,176,176,176, 69, 81, 81, 81,243,146,146,146,230,137,137,137, 3, 0,236,118,134, 51, 42,
+ 88,242,230,130, 87, 71, 84, 44,254,251, 24,246,131,105,207,178, 11, 95, 29,204, 62, 55,168,243, 79, 20,135, 67, 92, 76,207, 65,
+184, 55,240,205,188,158, 17,205, 3, 36,105,209,126,210,118, 79, 88,221,124,210, 56, 57, 54, 33,165, 80, 40,112,244,232, 81, 88,
+173, 87,221, 28, 69,150, 90,173, 70, 97, 97,161,237, 26,199,153,116,202,100,178,211, 91,183,110,101, 43, 43, 43,161, 82,169, 80,
+ 82, 82,130,220,220, 92,220,185,115, 7,101,101,101,184,121,243, 38,196, 98,241,105,103,210, 73, 16, 4, 24,134,177, 11,169,147,
+ 39, 79, 98,214,172, 89, 80, 40, 20,246,239, 56, 28,142,253,179,237, 55, 13,113,218, 44, 79, 12,195,224,226,197,139,152, 51,103,
+ 14,214,174, 93,139,221,187,119,227,200,145, 35, 80, 40, 20,118,177, 69,211,116,131,156,114,185, 28, 22,139,115, 99, 38,150,101,
+161, 82,169,156,126,239,142, 2,136,195,225, 60, 32,138,108,135, 43,101,233, 33, 57,159, 88, 56, 17, 25,190,238, 17,182,237,131,
+213, 84, 55,164,169, 18, 73,114,120, 83, 38,206,120,219, 63,175, 68,141,252, 98, 21, 40,242,207,126, 47,102,196, 12,112, 40, 18,
+151, 78, 84, 25,174, 72,138,130, 74,103,128, 82,107,194,132, 25,243,253,254,187,246,223, 83,104, 83,101,189, 49, 94, 58, 1,109,
+163,165,210,151, 58,118,108, 65,102, 8, 50, 17,243, 92, 50, 24, 11,192, 38, 61,143,110,229, 65, 84,251, 95,248, 47,233, 52,166,
+101,105,192,173,122,173, 25, 62, 62, 34,223, 46, 93, 16, 23, 22,134, 65,102, 51,120, 44,139,103,139,139,241,251,252,249, 48,236,
+219, 7, 18, 0,239,149, 87, 48,116,221, 58,156, 13, 11, 67,136, 94, 15,229, 59,239, 32,240,248,113,240,100, 50, 17, 74,157, 91,
+252, 64, 16, 4,134, 12, 25,130, 83,167, 78,249,143, 30, 61,250,196,245,235,215, 95,166,105,250,108, 99,242,214,219,219,251, 10,
+135,195, 9,111,232, 62,154,166,243, 84, 42,149,203,219,140,112, 56,156, 65,189,123,247, 62,176,127,255,126, 95,147,201,228,150,
+ 81, 8,159,207, 31, 61,126,252,248,173,155, 54,109,146,205,158, 61,123,235,145, 35, 71, 42,140, 70,227,113, 87,138, 20,128,165,
+ 91,182,108,121, 35, 54, 54,214,103,246,236,217,236,157, 59,119, 28,173, 87,129, 3, 7, 14,124,102,235,214,173, 33, 61,123,246,
+124,123,206,156, 57, 60, 0, 31, 54,100,229,145, 74,165,115,183,110,221, 26, 32,151,203,161,213,106,237,141,108, 94, 94, 30, 68,
+ 34, 17, 72,146, 4, 73,146,224,114,185,248,236,179,207,252,231,206,157, 59, 95,161, 80,204,119,194, 74, 22,191,113,227,198,192,
+145, 35, 71,146,247,238,221, 3, 73,146, 16, 10,133,120,237,181,215, 72,189, 94,239, 27, 23, 23,183, 93,167,211, 77,118, 37, 15,
+185, 92,238,148,248,248,248,118,253,251,247,231,100,102,102,162,111,223,190,184,116,233, 18, 94,121,229, 21,174, 70,163,105,185,
+112,225,194, 89, 6,131,193,213, 56, 46,161, 98,177,184,211,175,191,254,154,219,188,121,115,123,195,210,178,101, 75,102,236,216,
+177,138,204,204,204,168,115,231,206,149,245,235,215,207,149, 13,203,155,137,197,226,246, 63,255,252,115, 97, 92, 92,220,240, 45,
+ 91,182,140, 7,128, 94,189,122, 29,250,244,211, 79,207, 40, 20,138,232,179,103,207, 42, 6, 13, 26,148,231, 36, 95, 88,104,104,
+ 40, 51,111,222, 60,105,125, 55,109,219,182, 77,137,170, 13,151, 91, 1,168,119,191,182,168,200,144,197,171,230, 79, 20,129, 49,
+129, 53,235, 1, 83, 5, 96,210,194, 98,172, 0,193, 19, 1,102, 61, 2, 5, 10,252, 56, 55, 74,182,232,187,187, 25,204, 77, 98,
+108,166, 92,115, 28, 30,212,218,212, 0,136, 33, 8, 34,245,232,209,163,232,221,187, 55,142, 30, 61,138,177, 99,199,166, 58,138,
+129,180,180, 52, 12, 26, 52, 8, 86,139,150, 83,190, 90, 42,149,234,253, 37, 75,150, 36, 77,153, 50, 69, 92,173, 49, 32, 73,248,
+248,248, 96,204,152, 49,149, 58,157,238,125,103, 19,202, 48, 12, 56, 28, 14,242,242,242,176,109,219, 54, 44, 95,190, 28,109,219,
+182,133,217,108,126, 64,108, 89,219, 61,167, 26, 63,154,166,113,249,242,101,236,218,185, 19, 31, 46, 94, 12, 47, 47, 47, 0,128,
+201,100,130,162,188, 28, 66,161,208, 46,198, 26, 16, 78,123,110,223,190, 61, 63, 60, 60,188,218,148,161,237,175,181,205,130,197,
+ 98, 1, 77,211,168,172,172,196,218,181,107,105,150,101,247, 52,212,255,216, 68,209,252,249,243, 97, 48,252,105, 80,239, 98,245,
+ 73,142,140,140, 68,215,174, 93,237,231, 36, 73,178,206,114,254,183, 95, 39,232, 29,238,142, 90,178, 26, 0, 16, 30, 30,142,168,
+168, 40,132,134,134,214,201,217,212, 90,164, 49,112, 33, 50,124,221, 66,235, 81,236,148,205,229, 9,135,182,110,211,142,200, 41,
+ 84,128,195,225, 64,226, 29,128,126, 47, 46, 0, 69,145,144,250, 4,128, 96,244,127, 42, 98,146, 2,135,226, 64,161,209, 35,178,
+ 85, 27, 82, 32, 20, 13,213, 53, 32,180,100,222,220,141,239, 77,238, 39, 44,163,243, 32,106, 33, 4, 99,235, 78,195,248, 32,253,
+ 53,120,119,116, 91, 81,236,161,235, 27,161, 50, 15,115, 38,189, 20, 77, 35,136,162, 96, 98, 89,252, 62,127, 62, 98,226,227,145,
+106, 19,134,241,241, 72,141,141,133, 31,151, 11, 1, 73,130, 53,155, 31,152,211,119, 70,104, 1, 64,110,110, 46,246,237,219,231,
+ 55,113,226,196, 3,105,105,105, 83, 92, 20, 27, 54,174,128,139, 23, 47, 6,181,106,213,170,206,123,254,248,227, 15,244,232,209,
+195,229,233, 41, 62,159, 63,122,216,176, 97,223,237,219,183,207, 59, 61, 61, 29, 65, 65, 65, 15, 45,180, 4, 2,193,160, 17, 35,
+ 70,124,183, 99,199, 14, 89,105,105, 41,226,227,227,101,207, 63,255,252,238,148,148,148, 23, 13, 6,131, 51, 98,179,154,200,138,
+143,143, 87,110,219,182,237,191,168, 62, 69, 88,184,109,219,182,175,123,246,236,249,102,108,108,172, 15,128, 55,172,190, 3,245,
+138, 45,129, 64, 48,164,117,235,214,213, 70,181, 2, 65,149,177, 73, 34,145,192,219,219, 27, 60, 30, 15, 6,131, 1, 49, 49, 49,
+ 4,159,207, 31,224,204, 51,123,121,121,141,120,233,165,151,200,228,228,100, 20, 21, 21,193,199,199, 7, 82,169, 20, 12,195, 96,
+246,236,217,212,218,181,107,135,232,116,174,205,112, 53,111,222,124,252,240,225,195, 57, 55,110,220,192,189,123,247, 96, 48, 24,
+144,149,149, 5,153, 76,134,105,211,166,241, 86,173, 90,245,124,126,126,190,171, 66,171, 83,108,108,108,177,163,200,178, 65, 34,
+145, 16,237,218,181, 83,248,251,251,119, 7,224,138,208,234,244,214, 91,111,149,172, 88,177, 98,208,169, 83,167,236, 65, 47, 79,
+157, 58,181, 16, 0,190,248,226,139,164,192,192,192,238, 0,156, 21, 90, 96, 89,214,242,183,191,253, 45,155,207,231,131,203,229,
+130,207,231, 87, 59,120, 60, 30, 72,146,244,178, 85,231,134,248, 50,238, 21,173,156,189,112,245,106,137,144,226,254,243,197,206,
+104,225,195, 3, 68,126,224, 13, 90, 4,194,167,202,104,201, 42,254, 0,126, 89,132, 53, 47, 41,200,216,111, 43,127, 50, 49,190,
+129,119,203,203, 53,143,185, 15,232, 9,224, 63,168,218, 92,119, 49,128,139, 79, 72,223,116, 21, 64,204,216,177, 99,237, 98,235,
+216,177, 99, 24, 61,122, 52,148, 74, 37,110,220,184,225, 40,178, 92,217, 96,249,170,217,108,190,246,253,247,223,247,155, 56,113,
+ 34,225, 80,191,144,158,158,142,155, 55,111,166, 58,203, 71,146, 36, 44, 22, 11,184, 92, 46, 86,175, 94, 13,147,201,132,111,191,
+253, 22,123,247,238, 5, 73,146, 32, 8, 2, 4, 65, 64, 38,147,225,203, 47,191,116,169,221, 99, 24, 6,219,183,111,199,162,133,
+ 11,237, 34,203, 58,147,129,144,224, 96,248, 7, 4,224,238,221,187, 13, 10,173,242,242,242,143, 15, 31, 62,140,250,156,225, 15,
+ 31, 62,108,255, 92,195, 25,190,225,126,142,162, 96, 48, 24,240,236,179,127,110, 21,251,214, 91,111,217, 63, 43, 20, 10, 80, 20,
+101,203, 11,194, 89, 78, 61, 11,188, 40,252,243,187, 49,239,190, 91,205, 66, 87, 23,231,163,208, 34,238,178,110,213, 34,182, 98,
+172,214,217, 80, 0, 99, 81,229,163, 85, 8, 60, 66, 31, 45,150,181,180, 15,111, 22,134,107,119,210,192,161, 40,240,189, 3,224,
+237, 23, 12, 11,109,132,170,228, 30, 18,246,127, 5, 0,216,178,125, 15, 72,146, 4,135, 67,193, 96,100,208,182, 69, 24, 44, 22,
+ 75,251,250,184, 59, 0,253,134, 4, 7,244,110, 30,225, 67,220,240,189,135,118, 65,254, 53, 38, 66, 4,104, 91, 32, 37,250, 74,
+ 69,189,202, 85,234,126, 25,192,185, 6,197, 0, 73,130, 36, 8,136,121, 60, 24,246,237,171,242,218,140,175,234,179, 82, 99, 99,
+ 65,254,244, 19,188, 4, 2, 80, 4, 1,142,213, 4,221, 24,168,213,106, 16, 4,129, 93,187,118,249, 78,155, 54,109,247,141, 27,
+ 55, 98, 43, 43, 43,247,185,194,161, 84, 42,199,246,239,223,255,204,246,237,219, 3, 67, 66, 66, 30,184, 94, 84, 84,132, 25, 51,
+102,148, 42,149, 74,151,130,186, 9,133,194, 87,198,143, 31,191,245,155,111,190,145,221,190,125, 27, 90,173, 22,129,129,129, 15,
+ 91, 20,186,247,233,211,231,192,190,125,251,188,139,138,138,160, 82,169, 96, 48, 24,176,107,215, 46,159, 49, 99,198,236,203,204,
+204, 28, 13, 32,165, 1,142,143, 28, 69,214,156, 57,115,174, 3, 8, 2,176,177,166, 6,181, 94,235,236, 32,182, 84, 0, 86,213,
+ 51, 18,141,144, 72, 36, 40, 41, 41,193,140, 25, 51,112,235,214,159, 6,208,176,176, 48,251, 72,239,238,221,187, 8, 12, 12, 4,
+ 65, 16, 65,206, 60,116, 96, 96,160,212,104, 52, 98,214,172, 89,200,205,205,173,198,153,151,151, 7,130, 32,196,174,102,100,112,
+112,112,176, 94,175,199,192,129, 3, 81, 89, 89,181,175,239,164, 73,147,192,229,114, 81, 82, 82, 2, 46,151, 27,208,136,247, 19,
+ 48,118,236,216, 58, 67,171,200,100, 50,147,175,175,111, 7, 23, 57,253,159,127,254,249,252,248,248,248, 7, 22,182, 92,186,116,
+233, 5, 63, 63,191, 83,126,126,126,237, 92,228,180, 56,138, 42, 30,143, 87, 77,104,113,185, 92,144, 36,233,180,143,218,173, 18,
+221, 6, 14, 81,216,117,197,188,145, 51, 90, 4,121,131,213, 22,131, 55,236, 99, 92, 43, 21, 97,245,218,159, 1, 0,255,122,173,
+ 7,186,140, 88, 10,227, 55, 35, 49,191, 47,197,159,154,103,120, 15,192, 71,143,185,205,255, 28,128,109, 21,220, 38, 0, 93,159,
+160,254,200, 46,182,142, 29, 59,134,232,232,104,148,151,151, 35, 51, 51,179,177, 34,203,214,222, 45,250,228,147, 79,126,121,249,
+229,151, 37,182, 65,171, 72, 36,194, 59,239,188,163,215,106,181,139, 92, 42, 68, 22, 11, 56, 28,142,125,144, 44, 20, 10, 17, 19,
+ 19, 99, 23, 89, 4, 65,160,162,162, 2, 28, 14,199,182, 34,145,112, 50,141, 8, 13, 9,129,151,151, 23,218,180,109,139,219,214,
+118,196,246, 89, 32, 16,128, 32, 8,208,116,131,134, 60,141,213,169,125,129,187,187,100,155, 40,170,215,116, 28, 22, 6,139,197,
+ 98, 19,153,172, 59, 56, 3, 2, 2,160,213,106,157,229,124, 34, 81,135, 69,203, 38,180,198,162,202, 87,235,129,240, 14,131, 1,
+ 36,160, 9,151, 84, 18, 96, 9, 11,203,130, 67,145,214,185, 91, 10, 20, 69, 66, 81, 90,136,117, 31,191, 97, 21, 89,123,113, 52,
+ 41, 19,225,173,163,255,156,199, 37, 8,128,173,191,112, 7,122,243,226,231,190,220, 71, 84, 76, 20,194, 39, 76, 12,161,176,134,
+126,244,229,129,136, 36, 49,111, 72,184,248,242,225,202,248, 12,149,169,193,142, 66, 72,146, 85,206,239, 4, 81,171,115, 15,105,
+189, 70, 17, 4, 88,150, 5,107,113,205,239,216, 38,228, 69, 34, 17, 76, 38, 19, 40,138,194,250,245,235,125, 70,140, 24,177,209,
+ 85,161, 5, 32,189,184,184,120,204,236,217,179,143,237,217,179, 39, 32, 32, 32,160,218,232, 97,246,236,217,242,226,226,226, 49,
+112,209,233,158,203,229,110,220,180,105,147,236,254,253,251,168,168,168,128, 72, 36,178, 55, 62,141, 45,159,189,122,245, 58,113,
+252,248,113, 95,149, 74, 5,147,201, 4,145, 72, 4,150,101, 65, 81, 20,126,248,225, 7,255,113,227,198,253,156,147,147, 51,172,
+190,180,138, 68,162, 23,173,194, 9,177,177,177, 62,177,177,177,131,129, 58, 35,245,218, 17, 27, 27,235,179, 96,193,130,231,245,
+122,253,170,122,158, 57, 87,161, 80,132,136, 68, 34,236,223,191, 31, 82,169, 20, 98,177, 24, 97, 97, 97, 80, 40, 20, 16,139,197,
+ 96, 89, 22,102,179,217,214, 88,148, 57,243,224,165,165,165, 90,154,166,189,143, 29, 59,134,178,178, 63,127,210,162, 69, 11, 40,
+149, 74, 88, 44,150, 10, 87, 51,179,160,160,160,152, 32,136,230,215,174, 93,195,253,251,247, 49,122,244,104,252,244,211, 79,232,
+209,163,106,118,216,104, 52, 54, 38,136, 31, 67, 81, 20, 91, 79,185, 37, 0,248,186,147,211,218,121,185,196,105,177, 88, 44, 54,
+145,229,248,215, 81,124, 53,240, 63,171, 85,231, 14,193,210,109, 43,230, 14,159, 49, 50, 58, 0,250,210,123, 16,122, 5,128,240,
+137,196,234,181, 63,227,198, 31, 85,239,107,245,238, 43,248, 46,110, 12, 32,242, 67,148,183, 28, 33, 94,156,151,110,150, 60,118,
+161,229,237, 56, 78,120, 82, 59,166,209,163, 71, 67,161, 80, 64, 42,149,186,195, 63,231,188, 94,175,207, 58,120,240, 96,247,177,
+ 99,199,130,207,231, 35, 43, 43, 11, 41, 41, 41,153, 0,206,187, 42,180,184, 92, 46, 62,249,228, 19,188,241,198, 27, 8, 14, 14,
+198,162, 69,139,192,225,112,236, 7, 65, 16,118, 11,151, 43, 8, 10,174,127,225,163,205, 33,190, 33, 99,184,183,183,247, 39, 36,
+ 73, 78,164,156,200, 56,134, 97, 24,139,197,178, 71,165, 82,213, 27,222,193,230,184,238,204,187,112,204,131, 6,250,180,135,230,
+124, 20, 90,164, 49,168,185,218,176, 14,139,150,109,213,225, 3, 91, 1,217,158, 50,193,106,178, 75,104,170,132, 18, 36,117, 51,
+ 47,191, 0,254,190, 82,171,200,178, 30, 36,137, 46,209, 85,131,217,163, 73,153, 8,111, 21, 13, 14, 69,129, 67, 81,144,138, 4,
+ 40, 46, 42, 4,135, 67,222,172,139,183, 19,133,151, 95,110,215, 60,210,215,159, 11,121,160, 17,161,193,117, 24, 6,186,123, 33,
+ 60,148,143, 81,254,194,136, 78, 20, 94,174,223,250,198,218,133,150,137,166,193,123,229, 21,251,116, 97,106,108, 44, 98,226,227,
+193,140, 31, 15,157,201, 84,205, 84,220, 88,161, 37, 18,137,160,209,104, 48,101,202, 20,133,217,108,126,179,145, 89,156, 82, 86,
+ 86, 54, 97,234,212,169,101, 54, 1, 99, 50,153, 48,117,234,212,178,178,178,178, 9, 78, 88,137, 30,128,217,108,126,179, 71,143,
+ 30, 10,185, 92,110, 79,103, 99, 26, 28, 27,252,252,252,142,110,219,182,205,207, 96, 48,128,166,105, 59,167, 72, 36, 2, 69, 81,
+ 8, 12, 12,196,119,223,125, 23,232,231,231, 87,239,158, 85,122,189,254, 96,124,124,188, 18, 0,226,227,227,149, 4, 65, 36, 18,
+ 4,177,153, 32,136, 77, 53,142,205, 4, 65, 36, 58,222,171,215,235, 15,212,199,109, 52, 26, 19, 51, 51, 51, 89,177, 88, 12,138,
+162, 96, 50,153, 32, 20, 10,237, 38,113,181, 90, 13,189,190,106,154, 59, 37, 37, 5,102,179, 57,217,153,103,215,104, 52,167,183,
+111,223,110,105,209,162, 5,162,163,163, 17, 19, 19,131, 62,125,250, 32, 34, 34, 2,159,126,250, 41,163,211,233, 92,174,123, 5,
+ 5, 5, 71,127,252,241, 71,115,243,230,205,209,189,123,119, 8, 4, 2,116,233,210, 5, 97, 97, 97, 88,190,124,185, 81,165, 82,
+ 29,107,196,107,202, 73, 75, 75,163,234, 17,185, 50, 56,177,122,183, 6,114, 47, 95,190, 76,245,233,211,231, 80,205, 11,189,122,
+245, 58, 36,149, 74,189,109, 38,118, 87, 70,228,142,226, 74, 32, 16,216, 15,219,247, 28, 14,199,153,209, 15,217, 33, 88,186,237,
+179, 55,134,206, 24, 25,237,139, 67,167, 47,130,103, 82, 2,198,122,102, 4, 25, 51, 8,158, 4,193,222,220,240, 39,160, 15,152,
+ 15,224, 58,170,226, 48, 45,194,147, 5,187,227,123, 89, 89, 25, 50, 51, 51,145,146,146,130, 62,125,250, 32, 57, 57, 25,248,211,
+ 65,222,101,168, 84,170, 69,113,113,113, 58,219, 74,190,197,139, 23,235, 53, 26,205, 34, 87,219, 96,150,101,193,229,114, 17, 21,
+ 21,133, 5, 11, 22,224,231,159,127, 70, 86, 86, 22,204,102,179, 93, 8,217,124, 50, 93,177,104,241,120, 60, 4, 7, 7,195,108,
+ 54,219,173, 89, 0,112,251,214, 45,112, 56, 28, 88, 44, 22, 24,141,198, 6, 45, 90,222,222,222,159,108,221,186,245,109,185, 92,
+ 30, 90, 90, 90, 26,228,120, 20, 23, 23, 7, 21, 22, 22, 6,229,231,231, 7,229,230,230, 6,101,103,103, 7,221,187,119, 47,116,
+229,202,149,111,123,123,123,127,226, 76, 58, 41,138, 66,151, 46, 93,240,214, 91,111,217,143, 13, 27, 54,216,143,132,132, 4,151,
+157,215, 41,138, 66,212,146,213, 24, 83,202,218,143,159, 3, 9,251,113,227, 95,115,234,227,108,114, 45,210, 40,253, 98, 93,109,
+232,184,177,116, 45,176,173, 58,180,181,101,118,183,141,154,206,240, 77, 6,218, 88,121,230,143, 59,183,134, 70,117,234, 73, 22,
+201,181,213,150,127,198, 12,153, 0,130, 32,208,172, 85, 52, 40, 14, 7, 20, 69,130, 67, 81,240,145, 9,145,121,237,154,197,160,
+215,159,169,141,115, 48,192,225,139,248, 27, 94, 27,213, 69, 88,192, 47, 65, 96,168, 4, 60,110,149,118,100,255,152, 80,163,135,
+224, 0,157,188, 48, 51,223, 95,116,166,184,114,131,175,206,116, 40,177,142, 17,160,197, 98,129, 84, 32, 64,165,193, 0, 61, 77,
+ 99,200,186,117,246,233, 66,146, 32,112, 21, 64,231,117,235,112,110,223, 62,200,248,124, 64, 32,112,122, 85, 72,109, 66, 75, 46,
+151, 99,250,244,233,101,133,133,133,211, 26,227,163,101,131,193, 96, 56, 91, 84, 84, 52,109,194,132, 9,187,246,239,223,239, 55,
+ 97,194, 4, 69, 81, 81,209, 52, 39,253,158, 30, 64,101,101,229,190,220,220,220,138,233,211,167,239,220,189,123,183,127, 64, 64,
+128,125, 36,210,168,194, 74, 16,242,225,195,135, 11,156,185,175,129, 91,226,172,206,237,111, 88, 45, 91,157,231,204,153,115, 14,
+ 85,254, 87,142, 88,178,101,203,150, 73, 14, 83,140,155, 1,172,171,143, 88,173, 86,111, 90,176, 96,193,223,207,158, 61, 27, 32,
+ 20, 10, 65, 16, 4,120, 60, 30,218,180,105, 99, 95, 69,195,229,114,193,178, 44,222,125,247, 93,121, 73, 73,201, 23, 78,190,155,
+ 57,113,113,113,131, 42, 43, 43,125,167, 79,159, 78, 9,133, 66, 20, 23, 23, 99,237,218,181,204, 55,223,124,163,212,233,116, 51,
+ 26, 33,132,183,255,251,223,255, 30,162,213,106, 91,205,158, 61,155,167, 82,169,160,215,235,241,222,123,239, 25,191,254,250,235,
+ 60,189, 94,239,114,192,223,190,125,251,222,201,206,206, 30, 80, 81, 81, 81, 46, 22,139,107, 90,251, 8,137, 68,210, 19,192, 78,
+ 87, 56, 99, 98, 98,238,230,228,228,244, 89,186,116,105,162,217,108,230, 94,186,116,201,238, 12,191,126,253,250, 4,161, 80, 56,
+ 28, 46,110,190, 74, 16,132, 69, 32, 16, 84,179, 96,213,252,204,225,112, 26,108,211,218,135,136,151,126,246,250,160, 25,207,118,
+240,198,193,211, 87, 16,119,224,143,155,109,103, 4, 70, 61,227, 91, 10, 75,105, 38,254,245, 90, 15,172,222,125, 5, 64,213,212,
+161,165,228, 6,216,242,187, 96,189,154,227,158, 66, 94,240, 4,244, 1, 9,168, 10,153,241,164,161,154,200,186,113,227, 6,134,
+ 14, 29, 10, 0, 72, 78, 78, 70,255,254,253,145,156,156,140, 1, 3, 6,184, 28, 75,203,138, 95,213,106,117,118, 66, 66, 66,199,
+230,205,155,227,252,249,243,247, 0,252,234,106, 34,109, 66,139,195,225,224,213, 87, 95,197,136, 17, 35,208,162, 69,139,106,171,
+ 13,109,159, 93, 17, 27, 52, 77,163, 83,167, 78, 48, 24,141,224,241,120,246,169, 73, 14,135,131,192,160, 32,220,185,115,199, 41,
+139, 22, 73,146, 19, 95,124,241, 69, 50, 61, 61, 29,147, 39, 79,198,174, 93,187,234,188,119,234,212,169,248,254,251,239,241,226,
+139, 47,146, 31,124,240, 65,189,225, 29,108, 78,232,206, 60,147,173,159,110,168,221,119, 23,103, 83,107,145,135,129, 67,104,135,
+ 90, 39, 77,106,249, 46,190,154,208,114, 8, 18,214, 52, 66,139, 54,237,250,233,219,175, 22,244,217, 56, 32, 48, 52,200, 27, 10,
+149,222, 46,182, 82, 19,246, 2, 0, 94,158,179, 12, 28,170,106, 74, 81, 38, 21, 66,196,163,176,111,199, 23,114,147,169,178,214,
+210,165,225,146,111,124,208,175,141, 55, 95, 98,134, 58,132, 69,116,224,159, 59,229, 16,173,246, 62, 40,184,186,249, 34,224,248,
+ 59,101,193, 0, 0, 9,165, 73, 68, 65, 84, 70, 57, 94,123, 70, 42,251, 34, 93,249, 6,204,150, 13, 15,116,136, 74,165, 94,121,
+237,154,104,244,214,173,184, 52,109, 26,154, 49, 12, 18,195,194,224,199,229,194, 91, 32, 0, 73, 16,208, 31, 57,130,115,251,247,
+ 35, 88, 32, 0,188,188, 64,127,250, 41, 12,153,153, 48,107, 52,250, 70,140,204, 48,105,210, 36,185, 92, 46,159, 96, 52, 26,207,
+ 62,108, 62,235,245,250,227,185,185,185,111,244,237,219,119,163,217,108,126, 83,175,215, 63,212,202, 40,163,209,120,188,168,168,
+232,149, 73,147, 38,237, 61,112,224, 64,128,143,143, 79,163,185,202,202,202,122,184,169, 56, 89, 0,124,104,117,110,127, 35, 54,
+ 54,214,231,242,229,203,127,223,182,109,219, 70,135,209, 68,208,172, 89,179, 94,175, 33,178, 26, 92,117, 8, 32,167,164,164,228,
+211,119,222,121,103,217,154, 53,107,164, 54,199,247,223,127,255, 29, 52, 77,131,203,229,130, 97, 24,204,154, 53, 75, 91, 86, 86,
+182, 26,117, 71,116,126,160,104,169,213,234, 54, 75,151, 46,221,182,110,221,186, 17, 20, 69, 73, 24,134,209, 85, 84, 84, 36, 86,
+ 86, 86,206, 64,227,226,104, 89, 74, 75, 75,167,127,244,209, 71,211,215,174, 93,251, 34, 73,146, 65, 52, 77,203, 53, 26,205, 97,
+189, 94,255, 53, 26, 49,149,116,254,252,249,210,215, 94,123,237,143,210,210,210,246,225,225,225, 42,169, 84,106, 52, 26,141,148,
+ 72, 36,146, 73, 36,146, 24, 0,231, 9,130,200,112,133, 51, 53, 53,181,104,246,236,217,247, 13, 6, 67,212,230,205,155,147,100,
+ 50,217,105,130, 32, 8, 30,143,231, 43, 18,137,134, 2, 72, 36, 8,226,182, 43,156, 36, 73, 90, 28,173, 87, 53,253,179,248,124,
+190, 83, 62, 90,173, 2,197, 51, 71,180,225,224,224,153, 43,136, 59,152,179,157, 97,217,253,251, 83,203,143, 44,234, 15,152,246,
+188,134, 46, 19,118, 86, 77, 23, 2,176,148,220,128,105,207, 84, 16,226, 0, 36,229,115,161,210,155,142,194,131,218, 96, 15,239,
+ 32,151,203,145,158,158,110, 19, 89, 49, 0, 48, 96,192,128, 84,155,216, 74, 73, 73, 65,247,238,221, 83, 1,112, 93, 45,175,106,
+181,250,157, 41, 83,166, 28,183, 14,142,223,105,196,192,207, 46,180,108,130,170, 69,139, 22,246,115,199,195,193, 71,203, 41, 48,
+ 12, 3, 30,143, 7, 14,135,131,208,176, 48,251,255, 98, 89, 22,119,238,220,129, 66,161,112, 74,104, 81, 20, 69, 17, 4,129,201,
+147,157, 91,144,252,183,191,253, 13,137,137,137,160,156, 84,133, 20, 69, 33, 50, 50,178,193,123,108,186,212, 89,206,240,240,240,
+ 70,115, 54,181, 22,105,172,192,170,237,115,109,162,170,174, 10,241,168, 80,160,213,170, 62,220,177,117,253,154, 89,115,223,149,
+222,184, 91, 12,149,214, 0,138, 34, 29, 27, 79,112, 56, 20,100, 18, 33,154,135,120, 99,247,127,255,163,209,168,149, 31,161,142,
+125, 15, 91,120,241,230, 12,239,249,140,128, 23,170, 67, 84,231, 73,160,132,127,138, 0,182,168,142,217,193,254,191,224,185, 28,
+157,240,167, 28,221,156,171,229,198, 7,133,150,209, 56,114,241,168, 81, 39,226,126,254, 89,220,107,251,118,220,157, 53, 11, 97,
+122, 61, 4,214,169, 68,146, 32, 32,229,241, 32,229,241,170, 68,214,218,181,208,211, 52,214, 77,155, 86, 97, 48, 26, 71,185, 82,
+201,203,202,202, 48,126,252,248,210,130,130,130, 49,104,196,212, 94, 93,208,233,116,251, 0,236,115, 23,159,193, 96, 56,155,151,
+151,247,220,248,241,227,127, 62,126,252,120,224, 19, 18,100,206, 38,182, 76,151, 47, 95,126, 61, 41, 41,233, 46,170,111, 44,170,
+ 76, 74, 74,186, 59,123,246,108, 98,219,182,109, 95, 3,248, 55,156, 12,224,169,211,233,214,159, 60,121, 18,131, 6, 13,250,247,
+138, 21, 43,252,123,244,232,129,160,160, 32,104, 52, 26,164,164,164, 96,254,252,249, 10,181, 90,189, 66,169, 84,174,113, 49,205,
+ 38,131,193, 48,213,113, 41,181, 59,242,193, 96, 48,124, 83, 88, 88,248,141,187, 8,231,205,155,247,251,157, 59,119,202, 2, 3,
+ 3,123,243,120,188,206,168,242, 3, 42, 2,240,181,171,130,200,134,185,115,231, 94,187,115,231,142,188, 89,179,102,125,172,156,
+ 62,168,218,198,104,107, 35, 56, 11,174, 92,185, 18,222,179,103, 79,146,203,229,178, 20, 69,129,203,229,178, 28, 14,135,181,250,
+213,176, 0,112,248,240, 97, 1,128,122,183,205,185, 91,162, 95, 58,245, 63,191,125,144, 81, 84,185, 63,179,184, 98, 1, 0,118,
+207, 13,241, 47, 93, 2,169,145, 35,219,229,193, 16, 63, 0,132,172, 42, 80, 37,171, 45, 4, 33, 9, 70,158,165, 25,150, 28,186,
+ 89, 68,131, 88,229,209, 84,181,143,171, 97, 13,239, 80, 88, 88,232, 40,178,108, 86,171,152, 1, 3, 6,164, 90, 69,150,237, 90,
+ 99,252,203, 78, 89, 44,150,135,234,195, 88,150, 69, 92, 92, 28,182,108,217,130,134, 34,154, 91, 87,247, 17, 13,241,217, 44, 90,
+ 12,195,192,100, 50,225,198,141, 27,246,152, 93,182,233, 66, 91,104, 7,154,166,235, 93,173,206, 48, 12, 99, 52, 26,241,195, 15,
+ 63, 56, 37,182,190,251,238, 59, 84, 86, 86,130,105, 64,193, 57,134, 98,232,218,181, 43, 20, 10,133,125,177, 79, 76,204,159,161,
+242, 76, 38,147, 75,194,213,198, 25, 21, 21, 5,185, 92, 14,155,191,112,243,105,127, 26,123,104,157,238,175, 90,238,235,180,104,
+ 61,242, 30, 83, 32,150, 29,239,209,111, 68,255,105,175,207,151,104, 13, 12,238,223,207, 70,105, 73, 33, 72,130, 68,104,179,112,
+ 68, 68, 68, 66,196, 39,177, 43,126,141, 46,245,220,233,223,180,154,242,209,117,113,141,245,230,157, 91,251, 74,255, 62,173, 91,
+123, 17,160,205, 0, 99, 6,104, 51, 96,177,254,181,125,103,169, 94,230,210,211,149,236, 7, 87, 21, 23,142,170, 76,181,238, 89,
+ 53, 1,232,239,227,231,119, 98,201,225,195, 98,139,201,132,178,119,222,129,152,166, 33,180,142, 74,170, 30, 68, 0,250,211, 79,
+171, 68,214,212,169, 21, 42,165,210,165, 45,120, 2, 2, 2,174, 16, 4, 17, 80, 90, 90,250, 84, 69,134, 15, 12, 12, 60,202,178,
+172, 92, 46,151,247,120,130,210, 21, 4, 64, 9,192, 84,203, 64, 34, 16,174,251,255,216, 16, 25, 24, 24,248, 1, 73,146,125, 89,
+150,245, 39, 73,178,220, 98,177,156, 47, 41, 41, 89, 9,224,142,167, 63,125,108,176, 69,134,111,217,192,125, 37, 0,254,137, 42,
+167,224,251,206,146,119,241,246,246, 54,240,205, 7, 94,136, 22, 12,153, 24,227,141, 86, 33, 94,224,242,132, 40, 80,211, 56,149,
+161,198,214,132,162, 92,189,153, 25,119,171,180, 34,205,243, 42,234,133,219,183,224,113, 39,252,252,252, 46,158, 56,113,162, 71,
+171, 86,173, 72, 71,135,119, 91,172, 60,219,244, 22,135, 83,165,229,206,158, 61, 75, 79,158, 60,249,124,113,113,241,160,186, 56,
+189,188,188,126,185,126,253,250,179, 42,149,234, 1, 65,229, 24, 41,222,118,174,211,233, 48,119,238,220,147,117,109,193,227,237,
+237,189,118,205,154, 53,111,191,252,242,203,164, 45, 28,133,227, 97,219, 46,200,118,152, 76, 38,236,220,185,211,242,197, 23, 95,
+124,169, 82,169,234,156, 58, 12, 13, 13,205, 45, 40, 40, 8,183,133, 90,112, 38,168,104,100,100,100, 97,118,118,118,216,163,228,
+124,138, 5, 87, 53,235,214, 99, 49, 77,112, 69,162,121, 94, 82,223,143, 95,158,242,150,127,100,235,182, 68,112,104, 51, 16, 32,
+ 81, 92,148,143,236, 63,110,177, 7,190,253,170, 76,167, 86,124,162,215,235,190,170,143,167, 3,208,186,165,140,183,135,207,160,
+ 29,108, 2,168,198,254, 84, 15,140, 56, 0,152,184,228,205,251, 26,243,164,140,122,166,125,108, 98,235,195, 3, 7,196,252,118,
+237, 30, 8, 20,103,177, 88, 96,200,204,196,186,105,211, 92, 22, 89, 30,120,224,129, 91,208, 10, 13,199,200, 50,163, 42, 62,151,
+171, 22, 19, 34, 42, 72, 50,137, 5, 38,146,176,116, 34, 9,130, 79,179,200, 2,139, 95,196,156,138,141,169,133,208,123,178,223,
+ 41, 60,177,155, 74, 3,144,248,249,249,157,166, 40, 42,194,102,145,113,180,214,215,178,161,244,253,226,226,226,225, 0,234, 91,
+ 33,220,218,203,203,235, 43,134, 97,122, 57,179,169, 52, 69, 81,151, 52, 26,205, 60,212,179,169,116, 83,172, 58,244,247,247,191,
+147,157,157,221,218,182,138,218,177,175,172,109,101,249,237,219,183, 49,120,240,224,236,162,162,162,200, 71,201,249,164,162,142,
+ 85,135, 79,142, 69,203, 1, 97, 60,129,116, 58, 95, 36, 28,102, 49,211, 81, 32, 0, 14,151,123,211, 88,169, 63, 99,208,107,119,
+160,142,233,194, 71,137, 9, 64,127, 1,159,255, 11, 79, 38, 19,213, 38,218,204, 26,141,222, 96, 52,142,244,136, 44, 15, 60,240,
+192, 3, 15,158, 34,180,243,243,243, 59,193,229,114, 5,142, 98,178,230,103, 27,104,154,174, 44, 45, 45, 29, 13, 32,235, 17,115,
+254,111,194, 69, 39,181, 17,206,114, 90,143,193, 79, 58,103, 19, 62, 59,235, 70,206,193, 86,206, 37, 79, 73, 58, 7, 63,169,156,
+182,231,117,129,119,132, 43,229,200, 93,249,233,144, 78,214,221,233,108, 42, 78,119,213,163, 90,210,201, 54,193,123, 95,242,148,
+164,115,240,147,198, 89,179,252, 56,201,235, 18,167,147,101,202,213,116,178,238, 78,103, 83,113, 62,108, 61,170, 39,157,236,195,
+150,165, 58,222,253, 18, 60,133, 72,239, 6, 54,189, 27,216, 27,221,107,141,219, 24, 91,215,239, 92,114, 36,108,170,149, 0,182,
+176,251, 86,126,226, 73,229,116,204, 7,119,110, 21,208, 4,219, 14, 36,184,155,179, 70,126,186, 11, 75,172, 43, 76, 18,225, 68,
+192, 81, 87,158,221, 29,239,189,198,179,186,133,183, 17, 34,203, 37, 78,119,149,251,166,230,116, 87, 93,170,201,233,142,114, 95,
+219,123,111,194,119,228,174,116,186,165, 46, 53, 69,153,175,165,252, 60, 52,111, 77, 78,119,212,165,154,156,238, 40,247,143,130,
+211, 29,117,169, 54, 78,119,148,251,186,222,253,211,106,104,178, 77, 23, 90, 67, 60, 16, 78,136,173,120, 0, 32, 27,147,105, 77,
+104, 41, 27,226,110, 78,119,167,185, 41,196,166, 11, 22,152,199,206,233,230,119,180,196,202,233,206,209,205, 16,119,189,163,166,
+ 40,239,142,156,238,226,175,201,227,142,247, 84, 27,231,195,166,183,142,116,186,253,217, 31,182,220, 63, 42, 78, 55,191, 35,183,
+212,165, 26,156, 67,220, 60, 24, 24,226,112,190,196,157,156,238,170, 75,181,164,243,161,223, 83,109,156, 15,155,222, 58,210,233,
+246,103,119, 71, 31,210, 84,188,143,211,162,197,146,117,150,137,248, 26,199, 35, 17, 26,143,109, 74,206, 69,238,191, 20,167,139,
+211, 51, 35,154,224,221, 63,214,116,186,147,179,102, 26,221, 57,221,211,148,233,116, 39,167, 11,105,253,203,113, 62,109,239,253,
+ 73,204,207,186,248, 30,102, 90,170, 46,235,104, 83,164,211,157,156, 78,114,255, 37, 56, 31,226,221,255,229,192,121, 82, 18, 98,
+203,120, 55,143, 76,224,102, 11, 76,147, 61,183,155,211, 57,164, 41, 44,132, 77, 0,183,167,211, 58, 82,254,184, 9,158,253,105,
+201, 83, 79, 93,242,212,165, 39,174, 46,213, 40,147, 67,220,104, 41,114,171,229,185, 38,167, 59,254,135, 35,135,187,202,104, 83,
+ 63,187, 59,235, 82, 83,188,251,167, 13,255, 15, 47,211, 45,132, 34, 78,139,159, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
0};
diff --git a/source/blender/editors/datafiles/blob.png.c b/source/blender/editors/datafiles/blob.png.c
index 16dc958f7d3..c6540511709 100644
--- a/source/blender/editors/datafiles/blob.png.c
+++ b/source/blender/editors/datafiles/blob.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/blob.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <blob_png> */
int datatoc_blob_png_size= 10703;
diff --git a/source/blender/editors/datafiles/blur.png.c b/source/blender/editors/datafiles/blur.png.c
index d737bea4ae3..3fae863c92a 100644
--- a/source/blender/editors/datafiles/blur.png.c
+++ b/source/blender/editors/datafiles/blur.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/blur.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <blur_png> */
int datatoc_blur_png_size= 9327;
diff --git a/source/blender/editors/datafiles/bmonofont.ttf.c b/source/blender/editors/datafiles/bmonofont.ttf.c
index 029ee607bc6..36f50403da2 100644
--- a/source/blender/editors/datafiles/bmonofont.ttf.c
+++ b/source/blender/editors/datafiles/bmonofont.ttf.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/bmonofont.ttf.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <bmonofont_ttf> */
int datatoc_bmonofont_ttf_size= 309588;
diff --git a/source/blender/editors/datafiles/clay.png.c b/source/blender/editors/datafiles/clay.png.c
index aea212639e7..8e4a62a02b1 100644
--- a/source/blender/editors/datafiles/clay.png.c
+++ b/source/blender/editors/datafiles/clay.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/clay.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <clay_png> */
int datatoc_clay_png_size= 11181;
diff --git a/source/blender/editors/datafiles/clone.png.c b/source/blender/editors/datafiles/clone.png.c
index 324611a2d75..291633890c2 100644
--- a/source/blender/editors/datafiles/clone.png.c
+++ b/source/blender/editors/datafiles/clone.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/clone.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <clone_png> */
int datatoc_clone_png_size= 10774;
diff --git a/source/blender/editors/datafiles/crease.png.c b/source/blender/editors/datafiles/crease.png.c
index f785c005628..5315d9c016d 100644
--- a/source/blender/editors/datafiles/crease.png.c
+++ b/source/blender/editors/datafiles/crease.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/crease.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <crease_png> */
int datatoc_crease_png_size= 8638;
diff --git a/source/blender/editors/datafiles/darken.png.c b/source/blender/editors/datafiles/darken.png.c
index 9ba032f1f5e..cac5a4ee273 100644
--- a/source/blender/editors/datafiles/darken.png.c
+++ b/source/blender/editors/datafiles/darken.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/darken.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <darken_png> */
int datatoc_darken_png_size= 9653;
diff --git a/source/blender/editors/datafiles/draw.png.c b/source/blender/editors/datafiles/draw.png.c
index f87c5fc18c7..e521ddc1545 100644
--- a/source/blender/editors/datafiles/draw.png.c
+++ b/source/blender/editors/datafiles/draw.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/draw.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <draw_png> */
int datatoc_draw_png_size= 11349;
diff --git a/source/blender/editors/datafiles/fill.png.c b/source/blender/editors/datafiles/fill.png.c
index 010cd5ca278..fc34f1b3231 100644
--- a/source/blender/editors/datafiles/fill.png.c
+++ b/source/blender/editors/datafiles/fill.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/fill.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <fill_png> */
int datatoc_fill_png_size= 16892;
diff --git a/source/blender/editors/datafiles/flatten.png.c b/source/blender/editors/datafiles/flatten.png.c
index 6c82baec5dc..570ab394967 100644
--- a/source/blender/editors/datafiles/flatten.png.c
+++ b/source/blender/editors/datafiles/flatten.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/flatten.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <flatten_png> */
int datatoc_flatten_png_size= 9114;
diff --git a/source/blender/editors/datafiles/grab.png.c b/source/blender/editors/datafiles/grab.png.c
index 44c86d98a09..b72bc49061d 100644
--- a/source/blender/editors/datafiles/grab.png.c
+++ b/source/blender/editors/datafiles/grab.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/grab.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <grab_png> */
int datatoc_grab_png_size= 8045;
diff --git a/source/blender/editors/datafiles/inflate.png.c b/source/blender/editors/datafiles/inflate.png.c
index cd6f11877c7..6ccef9603d7 100644
--- a/source/blender/editors/datafiles/inflate.png.c
+++ b/source/blender/editors/datafiles/inflate.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/inflate.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <inflate_png> */
int datatoc_inflate_png_size= 8840;
diff --git a/source/blender/editors/datafiles/layer.png.c b/source/blender/editors/datafiles/layer.png.c
index 6006067bf76..89230e7a6bf 100644
--- a/source/blender/editors/datafiles/layer.png.c
+++ b/source/blender/editors/datafiles/layer.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/layer.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <layer_png> */
int datatoc_layer_png_size= 11004;
diff --git a/source/blender/editors/datafiles/lighten.png.c b/source/blender/editors/datafiles/lighten.png.c
index 7059d11de21..77e14433659 100644
--- a/source/blender/editors/datafiles/lighten.png.c
+++ b/source/blender/editors/datafiles/lighten.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/lighten.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <lighten_png> */
int datatoc_lighten_png_size= 9437;
diff --git a/source/blender/editors/datafiles/mix.png.c b/source/blender/editors/datafiles/mix.png.c
index 5acf62b7cfe..6acd3139421 100644
--- a/source/blender/editors/datafiles/mix.png.c
+++ b/source/blender/editors/datafiles/mix.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/mix.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <mix_png> */
int datatoc_mix_png_size= 10448;
diff --git a/source/blender/editors/datafiles/multiply.png.c b/source/blender/editors/datafiles/multiply.png.c
index 6648ecdf5d2..b411a0e6c03 100644
--- a/source/blender/editors/datafiles/multiply.png.c
+++ b/source/blender/editors/datafiles/multiply.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/multiply.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <multiply_png> */
int datatoc_multiply_png_size= 10039;
diff --git a/source/blender/editors/datafiles/nudge.png.c b/source/blender/editors/datafiles/nudge.png.c
index 2fa29ad78b4..20be979540c 100644
--- a/source/blender/editors/datafiles/nudge.png.c
+++ b/source/blender/editors/datafiles/nudge.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/nudge.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <nudge_png> */
int datatoc_nudge_png_size= 18012;
diff --git a/source/blender/editors/datafiles/pinch.png.c b/source/blender/editors/datafiles/pinch.png.c
index 23111e38e50..6e9223bfc7d 100644
--- a/source/blender/editors/datafiles/pinch.png.c
+++ b/source/blender/editors/datafiles/pinch.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/pinch.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <pinch_png> */
int datatoc_pinch_png_size= 9880;
diff --git a/source/blender/editors/datafiles/preview.blend.c b/source/blender/editors/datafiles/preview.blend.c
index 3f2b5bd41c1..b27fbd328bd 100644
--- a/source/blender/editors/datafiles/preview.blend.c
+++ b/source/blender/editors/datafiles/preview.blend.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/preview.blend.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <preview_blend> */
int datatoc_preview_blend_size= 586384;
diff --git a/source/blender/editors/datafiles/prvicons.c b/source/blender/editors/datafiles/prvicons.c
index 4254fe5a08e..0991ffe535d 100644
--- a/source/blender/editors/datafiles/prvicons.c
+++ b/source/blender/editors/datafiles/prvicons.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/prvicons.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <prvicons> */
int datatoc_prvicons_size= 12311;
diff --git a/source/blender/editors/datafiles/scrape.png.c b/source/blender/editors/datafiles/scrape.png.c
index b67bfa15984..89b6b324f60 100644
--- a/source/blender/editors/datafiles/scrape.png.c
+++ b/source/blender/editors/datafiles/scrape.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/scrape.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <scrape_png> */
int datatoc_scrape_png_size= 13055;
diff --git a/source/blender/editors/datafiles/smear.png.c b/source/blender/editors/datafiles/smear.png.c
index 2e6f73d3fb1..98e3be1d0e0 100644
--- a/source/blender/editors/datafiles/smear.png.c
+++ b/source/blender/editors/datafiles/smear.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/smear.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <smear_png> */
int datatoc_smear_png_size= 9358;
diff --git a/source/blender/editors/datafiles/smooth.png.c b/source/blender/editors/datafiles/smooth.png.c
index bb54061b172..0dcad4213f3 100644
--- a/source/blender/editors/datafiles/smooth.png.c
+++ b/source/blender/editors/datafiles/smooth.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/smooth.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <smooth_png> */
int datatoc_smooth_png_size= 16428;
diff --git a/source/blender/editors/datafiles/snake_hook.png.c b/source/blender/editors/datafiles/snake_hook.png.c
index 44d3efab779..dd4037231e6 100644
--- a/source/blender/editors/datafiles/snake_hook.png.c
+++ b/source/blender/editors/datafiles/snake_hook.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/snake_hook.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <snake_hook_png> */
int datatoc_snake_hook_png_size= 9710;
diff --git a/source/blender/editors/datafiles/soften.png.c b/source/blender/editors/datafiles/soften.png.c
index c50e3064e30..e4ee600fc28 100644
--- a/source/blender/editors/datafiles/soften.png.c
+++ b/source/blender/editors/datafiles/soften.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/soften.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <soften_png> */
int datatoc_soften_png_size= 9219;
diff --git a/source/blender/editors/datafiles/splash.png.c b/source/blender/editors/datafiles/splash.png.c
index f01e1499bca..aea2a9a1a14 100644
--- a/source/blender/editors/datafiles/splash.png.c
+++ b/source/blender/editors/datafiles/splash.png.c
@@ -1,5468 +1,8411 @@
/* DataToC output of file <splash_png> */
-int datatoc_splash_png_size= 174800;
+int datatoc_splash_png_size= 268962;
char datatoc_splash_png[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82,
- 0, 0, 1,245, 0, 0, 1, 26, 8, 6, 0, 0, 0, 8, 90,206, 70, 0, 0, 10, 79,105, 67, 67, 80, 80,104,111,116,111,115,104,
-111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120,218,157, 83,103, 84, 83,233, 22, 61,247,222,244, 66, 75,136,
-128,148, 75,111, 82, 21, 8, 32, 82, 66,139,128, 20,145, 38, 42, 33, 9, 16, 74,136, 33,161,217, 21, 81,193, 17, 69, 69, 4, 27,
-200,160,136, 3,142,142,128,140, 21, 81, 44, 12,138, 10,216, 7,228, 33,162,142,131,163,136,138,202,251,225,123,163,107,214,188,
-247,230,205,254,181,215, 62,231,172,243,157,179,207, 7,192, 8, 12,150, 72, 51, 81, 53,128, 12,169, 66, 30, 17,224,131,199,196,
-198,225,228, 46, 64,129, 10, 36,112, 0, 16, 8,179,100, 33,115,253, 35, 1, 0,248,126, 60, 60, 43, 34,192, 7,190, 0, 1,120,
-211, 11, 8, 0,192, 77,155,192, 48, 28,135,255, 15,234, 66,153, 92, 1,128,132, 1,192,116,145, 56, 75, 8,128, 20, 0, 64,122,
-142, 66,166, 0, 64, 70, 1,128,157,152, 38, 83, 0,160, 4, 0, 96,203, 99, 98,227, 0, 80, 45, 0, 96, 39,127,230,211, 0,128,
-157,248,153,123, 1, 0, 91,148, 33, 21, 1,160,145, 0, 32, 19,101,136, 68, 0,104, 59, 0,172,207, 86,138, 69, 0, 88, 48, 0,
- 20,102, 75,196, 57, 0,216, 45, 0, 48, 73, 87,102, 72, 0,176,183, 0,192,206, 16, 11,178, 0, 8, 12, 0, 48, 81,136,133, 41,
- 0, 4,123, 0, 96,200, 35, 35,120, 0,132,153, 0, 20, 70,242, 87, 60,241, 43,174, 16,231, 42, 0, 0,120,153,178, 60,185, 36,
- 57, 69,129, 91, 8, 45,113, 7, 87, 87, 46, 30, 40,206, 73, 23, 43, 20, 54, 97, 2, 97,154, 64, 46,194,121,153, 25, 50,129, 52,
- 15,224,243,204, 0, 0,160,145, 21, 17,224,131,243,253,120,206, 14,174,206,206, 54,142,182, 14, 95, 45,234,191, 6,255, 34, 98,
- 98,227,254,229,207,171,112, 64, 0, 0,225,116,126,209,254, 44, 47,179, 26,128, 59, 6,128,109,254,162, 37,238, 4,104, 94, 11,
-160,117,247,139,102,178, 15, 64,181, 0,160,233,218, 87,243,112,248,126, 60, 60, 69,161,144,185,217,217,229,228,228,216, 74,196,
- 66, 91, 97,202, 87,125,254,103,194, 95,192, 87,253,108,249,126, 60,252,247,245,224,190,226, 36,129, 50, 93,129, 71, 4,248,224,
-194,204,244, 76,165, 28,207,146, 9,132, 98,220,230,143, 71,252,183, 11,255,252, 29,211, 34,196, 73, 98,185, 88, 42, 20,227, 81,
- 18,113,142, 68,154,140,243, 50,165, 34,137, 66,146, 41,197, 37,210,255,100,226,223, 44,251, 3, 62,223, 53, 0,176,106, 62, 1,
-123,145, 45,168, 93, 99, 3,246, 75, 39, 16, 88,116,192,226,247, 0, 0,242,187,111,193,212, 40, 8, 3,128,104,131,225,207,119,
-255,239, 63,253, 71,160, 37, 0,128,102, 73,146,113, 0, 0, 94, 68, 36, 46, 84,202,179, 63,199, 8, 0, 0, 68,160,129, 42,176,
- 65, 27,244,193, 24, 44,192, 6, 28,193, 5,220,193, 11,252, 96, 54,132, 66, 36,196,194, 66, 16, 66, 10,100,128, 28,114, 96, 41,
-172,130, 66, 40,134,205,176, 29, 42, 96, 47,212, 64, 29, 52,192, 81,104,134,147,112, 14, 46,194, 85,184, 14, 61,112, 15,250, 97,
- 8,158,193, 40,188,129, 9, 4, 65,200, 8, 19, 97, 33,218,136, 1, 98,138, 88, 35,142, 8, 23,153,133,248, 33,193, 72, 4, 18,
-139, 36, 32,201,136, 20, 81, 34, 75,145, 53, 72, 49, 82,138, 84, 32, 85, 72, 29,242, 61,114, 2, 57,135, 92, 70,186,145, 59,200,
- 0, 50,130,252,134,188, 71, 49,148,129,178, 81, 61,212, 12,181, 67,185,168, 55, 26,132, 70,162, 11,208,100,116, 49,154,143, 22,
-160,155,208,114,180, 26, 61,140, 54,161,231,208,171,104, 15,218,143, 62, 67,199, 48,192,232, 24, 7, 51,196,108, 48, 46,198,195,
- 66,177, 56, 44, 9,147, 99,203,177, 34,172, 12,171,198, 26,176, 86,172, 3,187,137,245, 99,207,177,119, 4, 18,129, 69,192, 9,
- 54, 4,119, 66, 32, 97, 30, 65, 72, 88, 76, 88, 78,216, 72,168, 32, 28, 36, 52, 17,218, 9, 55, 9, 3,132, 81,194, 39, 34,147,
-168, 75,180, 38,186, 17,249,196, 24, 98, 50, 49,135, 88, 72, 44, 35,214, 18,143, 19, 47, 16,123,136, 67,196, 55, 36, 18,137, 67,
- 50, 39,185,144, 2, 73,177,164, 84,210, 18,210, 70,210,110, 82, 35,233, 44,169,155, 52, 72, 26, 35,147,201,218,100,107,178, 7,
- 57,148, 44, 32, 43,200,133,228,157,228,195,228, 51,228, 27,228, 33,242, 91, 10,157, 98, 64,113,164,248, 83,226, 40, 82,202,106,
- 74, 25,229, 16,229, 52,229, 6,101,152, 50, 65, 85,163,154, 82,221,168,161, 84, 17, 53,143, 90, 66,173,161,182, 82,175, 81,135,
-168, 19, 52,117,154, 57,205,131, 22, 73, 75,165,173,162,149,211, 26,104, 23,104,247,105,175,232,116,186, 17,221,149, 30, 78,151,
-208, 87,210,203,233, 71,232,151,232, 3,244,119, 12, 13,134, 21,131,199,136,103, 40, 25,155, 24, 7, 24,103, 25,119, 24,175,152,
- 76,166, 25,211,139, 25,199, 84, 48, 55, 49,235,152,231,153, 15,153,111, 85, 88, 42,182, 42,124, 21,145,202, 10,149, 74,149, 38,
-149, 27, 42, 47, 84,169,170,166,170,222,170, 11, 85,243, 85,203, 84,143,169, 94, 83,125,174, 70, 85, 51, 83,227,169, 9,212,150,
-171, 85,170,157, 80,235, 83, 27, 83,103,169, 59,168,135,170,103,168,111, 84, 63,164,126, 89,253,137, 6, 89,195, 76,195, 79, 67,
-164, 81,160,177, 95,227,188,198, 32, 11, 99, 25,179,120, 44, 33,107, 13,171,134,117,129, 53,196, 38,177,205,217,124,118, 42,187,
-152,253, 29,187,139, 61,170,169,161, 57, 67, 51, 74, 51, 87,179, 82,243,148,102, 63, 7,227,152,113,248,156,116, 78, 9,231, 40,
-167,151,243,126,138,222, 20,239, 41,226, 41, 27,166, 52, 76,185, 49,101, 92,107,170,150,151,150, 88,171, 72,171, 81,171, 71,235,
-189, 54,174,237,167,157,166,189, 69,187, 89,251,129, 14, 65,199, 74, 39, 92, 39, 71,103,143,206, 5,157,231, 83,217, 83,221,167,
- 10,167, 22, 77, 61, 58,245,174, 46,170,107,165, 27,161,187, 68,119,191,110,167,238,152,158,190, 94,128,158, 76,111,167,222,121,
-189,231,250, 28,125, 47,253, 84,253,109,250,167,245, 71, 12, 88, 6,179, 12, 36, 6,219, 12,206, 24, 60,197, 53,113,111, 60, 29,
- 47,199,219,241, 81, 67, 93,195, 64, 67,165, 97,149, 97,151,225,132,145,185,209, 60,163,213, 70,141, 70, 15,140,105,198, 92,227,
- 36,227,109,198,109,198,163, 38, 6, 38, 33, 38, 75, 77,234, 77,238,154, 82, 77,185,166, 41,166, 59, 76, 59, 76,199,205,204,205,
-162,205,214,153, 53,155, 61, 49,215, 50,231,155,231,155,215,155,223,183, 96, 90,120, 90, 44,182,168,182,184,101, 73,178,228, 90,
-166, 89,238,182,188,110,133, 90, 57, 89,165, 88, 85, 90, 93,179, 70,173,157,173, 37,214,187,173,187,167, 17,167,185, 78,147, 78,
-171,158,214,103,195,176,241,182,201,182,169,183, 25,176,229,216, 6,219,174,182,109,182,125, 97,103, 98, 23,103,183,197,174,195,
-238,147,189,147,125,186,125,141,253, 61, 7, 13,135,217, 14,171, 29, 90, 29,126,115,180,114, 20, 58, 86, 58,222,154,206,156,238,
- 63,125,197,244,150,233, 47,103, 88,207, 16,207,216, 51,227,182, 19,203, 41,196,105,157, 83,155,211, 71,103, 23,103,185,115,131,
-243,136,139,137, 75,130,203, 46,151, 62, 46,155, 27,198,221,200,189,228, 74,116,245,113, 93,225,122,210,245,157,155,179,155,194,
-237,168,219,175,238, 54,238,105,238,135,220,159,204, 52,159, 41,158, 89, 51,115,208,195,200, 67,224, 81,229,209, 63, 11,159,149,
- 48,107,223,172,126, 79, 67, 79,129,103,181,231, 35, 47, 99, 47,145, 87,173,215,176,183,165,119,170,247, 97,239, 23, 62,246, 62,
-114,159,227, 62,227, 60, 55,222, 50,222, 89, 95,204, 55,192,183,200,183,203, 79,195,111,158, 95,133,223, 67,127, 35,255,100,255,
-122,255,209, 0,167,128, 37, 1,103, 3,137,129, 65,129, 91, 2,251,248,122,124, 33,191,142, 63, 58,219,101,246,178,217,237, 65,
-140,160,185, 65, 21, 65,143,130,173,130,229,193,173, 33,104,200,236,144,173, 33,247,231,152,206,145,206,105, 14,133, 80,126,232,
-214,208, 7, 97,230, 97,139,195,126, 12, 39,133,135,133, 87,134, 63,142,112,136, 88, 26,209, 49,151, 53,119,209,220, 67,115,223,
- 68,250, 68,150, 68,222,155,103, 49, 79, 57,175, 45, 74, 53, 42, 62,170, 46,106, 60,218, 55,186, 52,186, 63,198, 46,102, 89,204,
-213, 88,157, 88, 73,108, 75, 28, 57, 46, 42,174, 54,110,108,190,223,252,237,243,135,226,157,226, 11,227,123, 23,152, 47,200, 93,
-112,121,161,206,194,244,133,167, 22,169, 46, 18, 44, 58,150, 64, 76,136, 78, 56,148,240, 65, 16, 42,168, 22,140, 37,242, 19,119,
- 37,142, 10,121,194, 29,194,103, 34, 47,209, 54,209,136,216, 67, 92, 42, 30, 78,242, 72, 42, 77,122,146,236,145,188, 53,121, 36,
-197, 51,165, 44,229,185,132, 39,169,144,188, 76, 13, 76,221,155, 58,158, 22,154,118, 32,109, 50, 61, 58,189, 49,131,146,145,144,
-113, 66,170, 33, 77,147,182,103,234,103,230,102,118,203,172,101,133,178,254,197,110,139,183, 47, 30,149, 7,201,107,179,144,172,
- 5, 89, 45, 10,182, 66,166,232, 84, 90, 40,215, 42, 7,178,103,101, 87,102,191,205,137,202, 57,150,171,158, 43,205,237,204,179,
-202,219,144, 55,156,239,159,255,237, 18,194, 18,225,146,182,165,134, 75, 87, 45, 29, 88,230,189,172,106, 57,178, 60,113,121,219,
- 10,227, 21, 5, 43,134, 86, 6,172, 60,184,138,182, 42,109,213, 79,171,237, 87,151,174,126,189, 38,122, 77,107,129, 94,193,202,
-130,193,181, 1,107,235, 11, 85, 10,229,133,125,235,220,215,237, 93, 79, 88, 47, 89,223,181, 97,250,134,157, 27, 62, 21,137,138,
-174, 20,219, 23,151, 21,127,216, 40,220,120,229, 27,135,111,202,191,153,220,148,180,169,171,196,185,100,207,102,210,102,233,230,
-222, 45,158, 91, 14,150,170,151,230,151, 14,110, 13,217,218,180, 13,223, 86,180,237,245,246, 69,219, 47,151,205, 40,219,187,131,
-182, 67,185,163,191, 60,184,188,101,167,201,206,205, 59, 63, 84,164, 84,244, 84,250, 84, 54,238,210,221,181, 97,215,248,110,209,
-238, 27,123,188,246, 52,236,213,219, 91,188,247,253, 62,201,190,219, 85, 1, 85, 77,213,102,213,101,251, 73,251,179,247, 63,174,
-137,170,233,248,150,251,109, 93,173, 78,109,113,237,199, 3,210, 3,253, 7, 35, 14,182,215,185,212,213, 29,210, 61, 84, 82,143,
-214, 43,235, 71, 14,199, 31,190,254,157,239,119, 45, 13, 54, 13, 85,141,156,198,226, 35,112, 68,121,228,233,247, 9,223,247, 30,
- 13, 58,218,118,140,123,172,225, 7,211, 31,118, 29,103, 29, 47,106, 66,154,242,154, 70,155, 83,154,251, 91, 98, 91,186, 79,204,
- 62,209,214,234,222,122,252, 71,219, 31, 15,156, 52, 60, 89,121, 74,243, 84,201,105,218,233,130,211,147,103,242,207,140,157,149,
-157,125,126, 46,249,220, 96,219,162,182,123,231, 99,206,223,106, 15,111,239,186, 16,116,225,210, 69,255,139,231, 59,188, 59,206,
- 92,242,184,116,242,178,219,229, 19, 87,184, 87,154,175, 58, 95,109,234,116,234, 60,254,147,211, 79,199,187,156,187,154,174,185,
- 92,107,185,238,122,189,181,123,102,247,233, 27,158, 55,206,221,244,189,121,241, 22,255,214,213,158, 57, 61,221,189,243,122,111,
-247,197,247,245,223, 22,221,126,114, 39,253,206,203,187,217,119, 39,238,173,188, 79,188, 95,244, 64,237, 65,217, 67,221,135,213,
- 63, 91,254,220,216,239,220,127,106,192,119,160,243,209,220, 71,247, 6,133,131,207,254,145,245,143, 15, 67, 5,143,153,143,203,
-134, 13,134,235,158, 56, 62, 57, 57,226, 63,114,253,233,252,167, 67,207,100,207, 38,158, 23,254,162,254,203,174, 23, 22, 47,126,
-248,213,235,215,206,209,152,209,161,151,242,151,147,191,109,124,165,253,234,192,235, 25,175,219,198,194,198, 30,190,201,120, 51,
- 49, 94,244, 86,251,237,193,119,220,119, 29,239,163,223, 15, 79,228,124, 32,127, 40,255,104,249,177,245, 83,208,167,251,147, 25,
-147,147,255, 4, 3,152,243,252, 99, 51, 45,219, 0, 0, 0, 6, 98, 75, 71, 68, 0,255, 0,255, 0,255,160,189,167,147, 0, 0,
- 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, 0, 0, 7,116, 73, 77, 69, 7,218, 12, 29, 18,
- 47, 19,145,242,249, 7, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,189,121,184, 93,215, 85, 39,248, 91,251,156,123,239, 27, 52,
-203,146, 28,199,142,109,217,113, 70, 98,140,156, 64,101, 66, 16,185,168, 64, 65, 51,201,124,161, 33, 52,147,220,208, 83,168,238,
-216,174, 46,250,131,250,138, 4, 75, 69,117,160, 26, 82,109, 21, 20, 31, 5, 52, 84, 68, 24, 58,253, 1,193, 10, 56, 36, 6, 2,
-113, 37,129,224,140, 86, 28, 39,158, 36,107,126,195,189,247,156,179, 86,255,177,215,222,123,237,115,239,147,158,100, 13, 86,114,
- 86,190, 23,201, 79,239,157,123,134,125,246, 90,235,183,126,235,183,128,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,
-179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206,
- 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,187, 36, 86, 92,226,207, 35,253,154, 1,176,
-221, 57,108, 17,193, 18,128, 74,191,223, 89,103,157,117,214, 89,103,157, 93, 1, 70, 0,156,115,116,243,191,218,125,235,239,126,
-252, 23,190,243,240, 39,127,241,187,142,190,243, 7,190,238,143,250,165,219, 97,126,166,179,206, 58,235,172,179,206, 58,123,158,
-103,234, 4,160,255,147,111,126,201, 59,126,225,123, 95,250,214,109,213,242,252,150,117,243,179,111,248,250, 23,191,228,245, 47,
-221,178,235,195,159,122,250,233,227, 11,227,207, 2,144,206,185,119,214, 89,103,157,117,214,217,243,219,169, 59, 0,115,223,120,
-195,236,247,252,211,173,245, 43,151,143, 28, 67,117,252, 40,234,229, 17,110,185,229,250,141,223,251,250,155,190,253, 51, 79, 28,
- 47, 62,247,228,169, 79, 0, 88,238, 28,123,103,157,117,214, 89,103,157, 61,191, 51,245,193, 71, 30, 59,245,244,230,245,253, 87,
-189,238,166,117, 87, 75, 45,104, 78,159, 66,125,250, 52, 54,110,221, 90,190,229, 77, 47,255,198,134,235, 23,127,248,145,167, 63,
- 6,224,104,231,216, 59,235,172,179,206, 58,235,236,249,233,212, 1,128, 68,112,250,143, 31, 57,249,241,103,150,155,205,119,188,
-108,195, 45, 51, 69,137,106,121, 25,205,137, 99,192, 96, 14,119,188,238,229, 47,123,213,245,235,119,126,240,147, 79, 62,182, 48,
-172, 15,117,143,168,179,206, 58,235,172,179,206, 86,159, 61, 95,234,207,155, 1,176, 30,192,181,175,191,121,237, 15,253,214, 91,
-182,255,216,245,179,229,204,210, 82, 5, 20, 5,220, 53, 55, 96,230,186,235,240,232,147, 71, 79,221,245,203, 15,254,252, 7, 62,
-254,196,187, 1,156,214,223,151,231,243,205, 20,145, 29, 0, 54,234,127, 30, 34,162,175,232,160,228,171,237,122, 59,235,172,179,
-206, 58,167, 62,221, 28,128,117, 0,182, 93,189,174,252,142,255,242, 67, 55,253,139,215, 95, 61,127,245,112,185, 1,192,160,109,
-215, 98,246, 69, 55, 98, 44,140,255,237,215, 31,250,207,255,215, 31,253,195, 79, 3,248,146,158,239,115,118,236, 34,178, 29,192,
-246, 85,254,248,113, 34,122,120,149,199,125, 0,192, 46,253,207,123,137,104,239, 87,184, 83,255,138,184, 94, 13, 78,118,105,128,
-178,195,252,211,195, 0, 14, 1, 56, 64, 68,199, 47,192,231,180,143,143, 11,189, 6, 39, 62,115,223,206,115, 91,235,119, 63,248,
- 48, 58,235,172,179, 43,214,202,231,224,148, 25,192,218,205,107,122, 95,179,121,190,220,204, 66,148, 69, 10, 4, 16, 17, 73,248,
- 14,133,239,199,127, 45, 1,204, 85,141, 44,255,212, 31, 31,254,211, 95,252,206,235,190,243,181, 91,231, 55,140, 43, 1,142, 31,
-197,112,110, 13,122,155,183,225,223,223,181,243,173, 59,110,222,246,146,183,221,255,151,111, 63,177, 48,254,240, 5,114,236,187,
- 1,220,119, 14,155, 49, 0, 28, 0,112,144,136,246,119,203,230, 43, 6,101,216,173, 95, 43, 57,189, 16,176,220, 47, 34,251, 53,
-112,121, 46,206,125, 7,128, 7,206,227,247, 14, 2,184,227,146,172,245,125, 59,211, 90,191,251,193, 75,182,214,101,223,206, 28,
-245,185,251,193, 14,245,233,172,179, 75,228,212, 9, 0,205, 15,138, 29, 63,247,230,235,223,249,150, 91,183,238, 92, 63,219,235,
- 51, 57,239,176,157,243, 95, 68,160,178,200,254, 27,206,129,138, 34,253, 55,249,127, 99,144, 84, 66, 92,151, 37,156, 57, 78,221,
- 84,224,101,194, 15,221,241,202,175,191,237,230, 45,239,253,209,119, 29,252,153,143,126,246,200,175, 3, 24,225,210, 67,241,187,
- 1,236, 22,145,221, 0,238,188, 16,153, 91,103,151,213, 62,122,142, 63,191, 7,192, 46, 17,185,243,124,179,230, 43,200,252, 90,
-223,183,211,175,245,187, 31,188, 20,107,253, 62, 19, 68,221, 11, 96,111,183, 68, 59,235,236,210,101,234, 91,246,125,251,141,239,
-250,201,215,190,240, 13,227, 37,134, 48,161,112,228, 19,120, 33,255, 5, 7, 98,242,174, 87, 0, 56,242,185, 61, 11, 80, 0, 68,
-228,243,125, 1, 10, 34, 42, 29, 21,154, 17,123,167, 46, 0, 68,192, 68, 24, 45,141,241,170,235,183,110,121,224,157,223,253,203,
- 63,249,238,191,120,241,239,252,249,103,127, 30,192,145, 11,148,181,135, 76, 8,103,201,214,236,127, 63, 32, 34,119,116,142,253,
- 43,198, 30,214,236,244, 97, 34, 58,168,153,252, 70,125,214,123,204, 26,216, 14,224, 61, 34,114,251, 5,122,246,251,225,225,253,
-179,217,133, 92,103,231,190,214,247,237,188,227, 18, 57,246,206, 58,235,236,114,100,234,131,158,219,254,207, 95,182,241,213,178,
- 88,161, 26,142, 0,102,239,164, 35,178, 30,242,121, 74,126,183,112,112,155,183,170,115,103,144, 3,192,138,226, 19, 16, 61,188,
- 99,239,248,157, 3, 26,120,126, 62, 1,227, 81,133,245,253,190,251,127,238,254,214,159,122,245, 75,174,254,154,127,249,171, 15,
-221, 61,170,154,143, 95, 8,199, 78, 68,103,132, 54, 53, 59,191, 15, 9,166,221,161,155,125,151, 77, 92,217,182, 31,192,254,105,
-153,183, 58,237, 3, 0, 14,136,200,253,250,188,131, 99,191, 80,207,254, 64, 8, 34, 46,149,209,221, 15,158,121,173,251,236,188,
- 91,235,157,117,118,133,154, 59,143,223, 41,198, 21, 31,253,221,191, 63,242, 17,114, 35,204,247, 27,204,207, 2,115, 51,162, 95,
-156,254, 62, 96,204,184, 49,208, 84,160,193,156,119,242,204, 0, 51, 98, 86, 14, 0, 24, 3, 60, 4,120, 25,144, 33,128,145,255,
-111, 25,235,207, 11, 68, 24, 85,195,168, 71, 13,126,234,123, 94,189,235,129,125,223,243,135, 55,108, 91,247,221,234,246,221,197,
-188, 73, 68,116, 0,190,166,105,179,149,221,221,242,185,162,237, 14, 34,186,107, 53, 80, 58, 17,221,213,202,168,239,249, 74,189,
- 41,116,247,131,221, 90,239,172,179,175,178, 76, 29, 2, 28,189,231,143, 30,251,153, 63,254,228,179,223,253,178,171,103,175, 39,
-192,177, 8,235,182, 0, 22,239,178,151,198,236,110,123,209,218,151,255,248, 27,111,222, 62, 83,206, 56,102, 6,138,194,231,214,
-204,144,241, 2,168, 32,184,235,110,133,219,114, 51,104,221,213,160,153,117, 64, 61, 2, 47, 30,129,156,126, 10,124,228,179, 64,
-189, 12,208, 44, 4, 13, 26, 1,120, 97,140, 55,188,242, 69, 47,122,255,190,239,249,181,127,118,239,239, 23, 95,120,234,228,123,
-145,200,123, 23,203,177, 31, 18,145, 3, 38, 99,219,113, 33,142, 59,133, 17,253,240, 5, 98, 90, 91,214,243,121,181,155, 93,136,
- 99, 92,138,235,109,157,231,170,142,119, 30, 25,242,126, 36,194,217, 70, 17,217,241,149, 90, 91,167,187, 31, 60, 36,251,118,158,
-215, 90,151,125, 59, 39,159,239, 37,128,238, 91, 68,187, 75,246,185,157,117,246,149,224,212, 27, 0,139, 0, 62,245,193, 71, 23,
-222,245,193, 71, 23,102, 49, 93,196,102,243,155, 95,181,245, 71,191,251,246, 27, 95, 48,231,250,174,102,241,208,251,112, 8, 25,
- 45, 2,205, 34,138, 91,222,128,242,246,239, 71,113,227, 55,172, 8, 33,200,177,199, 80, 63,250, 1, 52, 95,124, 8, 84,244, 1,
- 17, 8, 1,227,165, 49,110,185,102,243,250, 63,252,215,255,205,175,188,233,237,239, 57,246,236,201,225,159,227,194,213,216, 87,
-178, 11,194,200, 85,199,182, 71, 51,160, 29, 83,254,253, 16, 18, 52,124,124,133, 99,220,103,126,247, 0, 17,237, 55,199,221,131,
- 22,163, 91,143,185,119, 53,236,125, 17,217,163,217,232,246,115, 61,175,139,113,189,103,184,214,123,244,184,118, 51,127, 46, 76,
-241, 51, 89,219,129,111,252, 10,223, 27, 86,189,214,213,145,175,252,124,247,237, 76,207,183,229,104,101,223,206, 7,166, 4, 14,
-123,100,223,206, 93, 43,124,220,189,122,110,187,244,107,199, 74, 65,199,153, 62,183,179,206, 58,167,158,140, 1, 12, 1,212,240,
-162, 48, 90,245,142, 61,239, 66,132,151,239,253,222, 91,126,246,237, 59,111,216,217,140,129,113,211, 64,170, 17,100,184, 4,212,
- 35,160, 20, 12,190,245, 95,162,188,253, 45,103,207, 26, 54,221,128,222,166, 31,133,187,250, 85,168,255,238, 87, 1,215,120,151,
- 79,132,241, 82,133, 87,189,248, 5, 87,189,235, 39,118,238,251,193,251,254,244,187, 1, 60,126,145,157,186,221,200,207,107,147,
- 16,145, 93, 0,222,115, 22,167,176, 93,179,194, 61,103, 96, 91,135,222,106, 0, 56,168, 45, 90,247,159, 33,171,218, 14,223,154,
-181, 67,225,228,149,156,239,253, 88, 25,110, 13,231,181, 91, 68,238,184,132,215, 59,237, 90, 31,248, 42,112,172,151,211, 86,181,
-214,213,249,174,254,249,238,219,121,103,171, 23,126,215, 10, 63,191,253, 12,231,181, 7,171,107,211, 11,159,123,143,146,253,186,
- 30,252,206, 58,167,190,210,187, 12, 63, 3,189, 10,190, 87,255, 44,174,191,106,230,219,239,127,203, 75,247,126,203, 45, 87,189,
-120,180,204,104,154, 10, 24, 45, 3,117, 5,144,128,122,192,224,187,126, 30,197, 43,191, 45, 30,236,212,242, 8,239,255,248, 99,
-120,255, 39, 30,195,177,133,101,244, 10,194,203,174,217,132,239,184,253,102,124,221, 77, 47,240, 7,190,238,213,160,254, 90, 84,
- 31,254,119, 64,191,244,167,224, 8,245,194, 8, 63,240,166, 87,222,246, 91, 31,248,244,143,190,255,239, 30,123, 7, 46, 82,187,
-155, 58,188,221,173,140,240, 92,143,177, 91, 55,192,118, 6,120,208,108,156, 54,219,217,142,196,180,127,248, 44, 27,240,123,204,
- 70,120,192,100,150, 59, 90,231,189, 71, 68, 14,173, 32, 20,115,223, 20,135,110,143,181,219,100, 70,239,185, 76,215,187,177,229,
-208,143,155,243,219,126, 17,223,149, 93,103,201,220,159,203,186,186,224,229,151,231,116, 78, 62,243, 62,235, 90, 87, 82,221,185,
- 63,223,220,193, 30, 52,235,116,163, 65, 9, 86, 66, 10,142, 79, 65, 20, 14,181,206,113,187, 62,175,237,118,205,200,190,157,183,
-119,253,239,157,117, 78,253,236, 22, 32,239,245,111,126,229,166,159,218,127,231, 75,238,190,118,205,236,236,242, 98, 3,105, 70,
- 64, 53,210, 79, 42, 64,245, 34,122,175,251,177,204,161,255,205,231,158,194,219,127,251, 67, 56,244,236,105,204, 12,122,232,149,
- 14, 78,128, 79,124,233, 24,126,239,175, 63,141,111,191,253, 38,252, 31,187,223,128,185, 65, 15,110,219, 75, 81,190,242, 78,212,
- 31,251,117, 96,237, 54, 0,226,139,232, 66,248,215,111,125,237,143,253,217, 71, 31,251, 61, 17,124, 18,190, 68,112,161, 29,250,
-253, 45,167,177,255, 28,143,177, 93,143, 97, 55,163,187,166,212,118,247,182,178,219,240,217,183,159,225,240,247, 24, 7,124, 87,
-219, 41,232,103,191,199,108,174,247,136, 72, 6,117, 43,228,190,167,181, 57,223,217,170,163,219,115,219,117,153,174,247, 30,115,
-188,123,149,196,216,126, 86, 23,195,118, 95, 4,199, 59, 53,195,213,114,196, 1,248,114,196, 37,117, 66,234,208,207,186,214, 85,
-169,110,242,249,222,253,224,228,243,205,179,249,236,249, 6, 54,190,194,240, 97, 77,237,167,187, 31,220,123, 22,116, 96, 47,128,
- 3,103,202,190,101,223,206,144,209,219,207,189, 3,157,117,214, 57,245,179, 58,244, 27,223,246,205, 47,252, 55,247,189,249,134,
-255,182,228, 18, 75,163, 10,104,198, 64, 83,251, 58, 58, 1,144, 6,116,213,117, 40, 95,243,214,248,203,159,123,250, 56,222,250,
- 43,239,199,225,229, 26,115,243,179,168,138, 2,189, 94,129,126, 65, 40,164, 15,106,106,188,247, 35,159, 71,225, 28,126,238,251,
-119,250,140,253,230,111, 66,243,153, 63, 5,154, 5,160,156, 5, 8,168,199, 21,110,187,105,235,213,175,121,217,213,223,242,145,
- 71,158,254, 20,124,137, 96,213,217,186,136,220,115,150, 12,173,237,192,238, 58, 15,162,213,253,173,236,114,197, 94,103, 34, 58,
-168,240,118,200, 72,119,136,200,158,179,212,195, 15, 18,209,157, 43, 28,239,144,136,220,139,164,102, 22,122,176, 15, 76,113,150,
- 97,131,158,218,135,111,206,237,163,151,241,122, 15,173,116,188,139,145,229,234,250, 56,239,128,238, 44, 8,203, 52,219,174,207,
-227, 30, 17,185,160,242,187,178,111,231,185,175,245, 73, 71, 61,253,249,174, 80,183,166,187, 31, 60, 40,251,118,230,207,119,223,
-206, 61,231,171, 88,119, 38,135,223,250,185,253, 90, 87, 15,235,126,151,236,219,185,189,203,214, 59,235,156,250,202, 14,157, 54,
-205,151,111,122,247,238,155,126,225,251, 94,117,213,173,163, 33, 48,162, 10, 96, 15,181,163,231,226, 79, 74, 53, 70,121,203, 27,
- 65,107,174,138, 7,184,247,183, 31,194,231,190,124, 18, 88,191, 6, 39, 23,106,128, 26, 20, 4,204, 21,132,171,230, 75,108,156,
- 45,177,126,253, 26,252,225,223,126, 14, 59, 95,113, 61,118,221,122, 35, 80,148, 40,182,191, 17,245,199,127, 3,180,229, 6, 64,
- 24, 76,132,254,108, 31,223,183,243, 37,187, 62,242,200,211,255, 9,192, 49,156, 27, 4,191, 90, 25,205,253, 56,143,222, 98,163,
- 45, 30, 47,253,108,206,135,136, 30, 86,105,210,123,204,134,123,166, 77,240,174,179, 28,239,160,136, 60,140, 28, 10, 13,231,215,
-150, 74,221,123,166,243, 51,231,182,231, 50, 93,239,222, 75, 5, 81,235,181,220,215,202,210, 47,132, 83, 15,186,242, 54,211,180,
- 26,244,113,109,138,200,246,149,120, 16,231, 97,231,182,214,167, 56,116,101,154,231,207,247, 44, 68, 52,186,251,193,135,101,223,
-206,115, 89,207, 23,196, 52,160,176,235,126, 55,186,158,251,206,190,130,237,124,250,187, 3, 41,110,205, 27,110, 90,251, 47, 30,
-250, 31, 94,241,123,223,247,178, 77,183, 46, 45, 53,104,208,120,135,238, 0, 20, 4, 42, 8, 84, 18,168,112,160,146,224,174,121,
-101, 60,200, 23,158, 57,129, 63,249,248,227,192,220,172,111,115,115, 14, 40, 10, 52,112, 56, 61,106,240,133, 35, 75, 56,116,120,
- 9,149, 16,184, 40,240,129,127,248, 98, 58,129,171,110,134, 44,159, 2, 80,235,217, 8, 80, 51, 94,122,237,166,155, 0,188, 0,
- 23,111, 80,205,110,205, 34,207, 21,226,181, 27,224,241,115,112, 10, 7, 91,159,189,162,131, 88, 37, 76,187, 18, 65,105, 87,203,
-193,174,230,252, 14, 92,166,235, 61,116,169,244,247,181,132, 96,181,218,143,159, 45,120, 58,139, 29,135,103,111,223, 68, 68,183,
- 19,209,157, 68,180,215,124,221, 73, 68,155,244,103,172,147,220,163,129,215,165,180,221,154, 81,111, 60,235,243, 93,125,198,189,
-218,245,124,161,237,192, 42,208,145,206, 58,251,170,204,212, 3,220,126,205,143,124,195,150,159,125,247,183, 95,255,227, 61, 46,
-176, 52,102,160, 16, 64, 24, 36, 0, 49, 65, 10, 82,232,221,255, 10,149,125,184,141, 47,138, 7,122,236,200, 41, 44, 47, 85,192,
-186, 65,138, 19, 66,110,237, 28, 32,130, 19, 11, 21,170,113,141,107,215,151, 56, 61,172,210, 73,172,221, 6,160, 0, 70, 75,160,
-217,181, 16, 8, 80,215,184,113,219,218,173,131,126,113,245,104,220,124,234, 28,175,235,222, 51,252,155, 37,221,108,132, 97,127,
-159, 67,182,184,107, 5,199,138, 85,100,215, 89,214,184, 2,129,108,181,200,193,161, 51, 92,227, 57, 29,171,125,110,151,240,122,
- 47, 9,131, 89, 3,183,118,205,251,222,231,210,155,174,191,187, 26,177,155,189, 34,114, 16,121,137,227,190,179, 4, 82, 23,111,
-173, 79,202,196,158,223,243,245, 89,115,150,241, 95, 8, 70,186, 34, 7,103, 98,204,239,106,161, 33,157,117,214, 57,245,144,253,
-174,157, 41, 94,251,111,191,237,218,125,119,237,216,242,186,241, 24, 24,246,188,228,171, 52, 2,170, 24,253,190,195,201,166,225,
- 89, 56,135,178,136, 29,236, 4, 0, 82,199,131,109, 93, 63,135,162,223, 67,195, 80,189,120, 81,167,174,127, 10, 1,133,195,226,
- 82,133, 47, 14,135, 24,220,106, 78, 85, 26, 64, 42,160, 30, 2,110, 29, 72, 24,194,140, 77,243,189,185,245,115,253,141,135,199,
-203,231,132, 64,172,166,102,169,117,213,123,144,198,115, 62,128, 51,147,215,176,194, 70,178, 93, 71,150,158,143,109, 60, 67, 6,
-248, 92,236,188, 54,105,253,217, 29,151,248,122, 47,186, 83, 87,135,254, 64,235, 58,238,186,148, 19,250,180, 28,113, 47, 18, 92,
-190, 93, 68,118,183,137,129,231,124,220, 85,212,163,181,238,126,166,181,158, 63,223,212,107,126,161,214,243,106, 28,121,104,109,
-187,167,203,190, 59,235,236,220,156,122,128,178,123, 47,221, 54,243,253,191,253,125, 55,238,253,186,173,115, 91,151,199, 12, 12,
- 74,239,208, 43, 70, 89, 49,250,179, 5,254,213, 7,158,248,196,245, 27,250, 27,126,124,199,150,235,135, 2, 80,200,214,171, 10,
-252,236,231,225,174,123, 53, 0,224,101, 47,220,140,175,127,241, 86,252,213,167,142, 0,101,233,157,184, 83,135, 30,116,225,216,
-255,238,240,216, 34, 94,124,117,122,111,229,212,147,192,232, 20,100,180, 1,164, 19, 99,132, 67, 80, 0,135,139, 0,191,107,246,
- 4,179,201,174,134,188, 54,109,243, 58,151,249,214,151,195,142, 95,128,159,189,146,174,119, 53, 14,253,222,203, 52,114,215,170,
-216,225, 82,221, 71,186,251,193,189,154, 81,167,181,158, 19,219, 46,235,243,213,204,188,211, 41,232,172,179,243,112,234, 1,110,
-223,122,231,215,110,122,251, 47,125,235,181,255,243,213, 51,189,254, 18, 19,104,206,167,224, 50,102,204,176, 96,216, 7,254,167,
-247,125,241,125,251, 31, 58,252, 7,191,118,231, 13,119,147, 40,242, 94, 40,251,189,116,144,103, 62, 25, 15,236, 28,225,167,191,
-235,118,124,235, 35,255, 31, 48,172,128, 65, 95,167,187,169, 83,103, 0,194,192,194, 18,110,123,249, 11,241,131,223,248,138,248,
-187,124,248, 83, 16,169, 64,205,216,255,160, 8, 28, 9,142, 45, 12,151, 79, 45,141, 79, 95,196,236,105,175,170,155, 5,219,141,
-115, 39,251,156,169, 7,247, 66, 58,220,231,139, 93,105,215,219,118,232,251, 47, 36,251,252, 28,215,219,241, 22,185, 49,180,114,
- 93, 42,199,190,154,181,126, 73,159,175,102,232,109,157,130,253,138,224, 28,154, 6,231, 43,242,112, 31, 58,235,236,171,220,169,
- 19, 0, 42, 11,186,229, 29,255,236,154, 95,122,251, 63,185,250, 91,234, 26, 88, 42, 29,104,224, 32, 44,144,229, 6,243, 37,225,
-177, 81, 61,252,225,223,250,194,175, 62,248,217, 83,191, 13,128, 31, 63, 89, 61, 3,146,151, 74,204,212, 1,204,204,161,121,236,
-195, 40,143, 63, 6,218,120, 3, 0,224,205,183,221,128,253, 63,241, 77,120,219,175,125, 8, 75, 39, 70,192,204, 0, 40,124, 61,
- 29,227, 10, 88, 90,198,215,189,116, 27,126,239,237,223,134,249,153,158, 63,171,106, 25,205, 35,239, 5,245, 7, 0, 53,128, 48,
-132, 27,192, 57, 60,250,244,137, 35,195,113,115, 4, 23,143, 40, 7,248,154,243, 46,179,201,158,115,246,117,185,156,196,101,178,
- 43,230,122,117, 26, 91,219,161,223,117,153, 79,235,114, 6,114,171, 89,235,251, 87,219, 98,118,129,108, 79,203,161,119, 74,113,
-157,117,102,204,157,197,169,111,189,239, 91, 95,248, 43,119,191,238,234,111, 25,214, 64, 53, 87,130,102, 11, 8, 3, 88,106, 48,
- 63, 83,224, 47,158, 92,124,102,231,187, 63,253, 51, 15,126,246,212,127, 0,240, 24,128, 39, 62,243,236,240, 51,112, 4, 52, 74,
-122, 42,156,135,216,235, 5, 84, 31,126, 87,246, 33, 63,254,166, 87,224,175,127,254,123,241,182,127,254, 53,184,113,211, 0, 51,
- 82, 97,141,107,240,218, 23, 95,133, 95,254,201,111,198, 95,190, 99, 55,110,220,182, 62,254,124,253,119,191, 10, 57,241, 24,208,
- 27, 64,148,132,135,186, 1, 28,225, 51, 95, 62,254, 69,248, 57,235,252, 60,187,207,103,147,197,188, 82,207,111,215, 21,122,189,
- 43, 57,244, 61,207, 51,135,254,124,181,203,249,124, 45,107,126,239, 42, 29,250,246,238,145,117,214,101,234, 0,174,219,216,223,
-249,195, 95,179,233, 77,227, 33, 3,107,122,160, 62, 65,198,130, 98, 88, 99, 48, 95,224, 55, 63,113,244,211,255,227,239, 61,246,
-111, 79, 45, 55, 31, 2,112, 20,126,208,203,204, 95, 62,122,250,111,159, 58, 93,253,200, 85,115,189,178, 17, 73, 77,112,179,115,
-224,199,255, 18,245, 67,191,136,242,117,111,139,159,243,170,235,175,194,187,126,228,141,248,249, 31,172,241,244,177, 69,244,123,
- 37,174,217, 52, 63,113, 62,205, 35,127,132,250,239,127, 19,152,153,243, 81,135, 43, 32, 13,131, 26, 70, 53, 28,225,189, 31,122,
-244, 33,120, 61,250,139,233,212,207,103,131,200, 32, 84, 17,217,120,185,165, 64, 91,118,200,156,223,170,216,193,218,191,125,165,
- 94,239,149,228,208,207,151,196,120, 49,215,122,254,124,247,237,220,120, 9, 7,166,236, 56,143,251,113, 69, 4,150,157,117,118,
-177, 51,245,242,134, 77,131, 23,111, 28, 20,168,217,179,219,101,169, 65,127,220,128, 6,132,183,191,255, 75, 7,223,250,155,143,
-254,175,167,150,155, 15, 0,120, 6,192, 73, 0, 99, 0,213,147, 39,198,127,251,222, 79, 29,255,120,175, 4,100,216, 0, 16,144,
-131,239, 87,159, 91,139,230,239,255, 51,170,131, 63, 13, 89,122, 54,251,192,153, 94,137, 27,182,173,159,116,232,213, 50,154,143,
-188, 27,245,135,222, 1, 26,244, 65, 69,225,235,245,189, 1, 80,213,232, 57,224,111, 62,243,212,211,127,245,200, 51, 7,225,181,
-223, 47,138, 83,111,141,248, 60,151, 77,165,221, 38,182,231,121,182, 14,236,249,109, 84,217,214,231,178, 81, 62,223,175,247,138,
-112,232, 42,221,219, 14,190, 46,205,103,123, 25,216,149,214,250,149,243,124,189,164,108,151,169,119,214, 57,117, 0,197, 35,207,
- 44,127,246,203,227,166,158,155, 43, 48, 87, 53,152, 43,128,133,130,229, 7,222,115,232,119,126,225,129,167,126, 22,192, 39, 0,
- 60,171, 25,186,247,222,126,200,203, 51,191,244,193,103, 14,156,172, 26,148, 85, 3, 84,236, 89,115, 42, 74,131,249,181,224, 71,
-255, 4,227,247,190, 21,205, 63,190, 23,114,234,137,233, 47,228,226, 17,240,163, 7, 49,254,131, 31, 65,253,177,255, 8,204,204,
- 0, 69,233,197,102,136, 64,174, 7, 26, 86, 64, 33,248,185,223,253,216, 31, 0,248,188,126,254, 5,119,234,166,111,217,218,170,
-218,139,180, 13,201,110,200,247,156, 37,211,189,212,118, 0,121,237,246,158, 85,220,139,123,174,224,235, 93,201,161, 63,140, 51,
-247,113,159, 53,232, 19,145,123,204,215,174,214, 61, 59,215,245,102,201, 93,199,113, 97,250,212, 87,227, 8,207,184,214,233,238,
- 7, 39,159,175,103,164, 63, 87,180, 8,171, 64,139,142,175, 54, 3,215,235,232, 8,114,157,125, 85,217, 25,225,247,163, 11,245,
-223,125,223,239,124, 97,239,219,222,184,109,247,230,185,114,253,167,158, 29,126,249,255,254,240,225,247,253,227,147, 75,255, 47,
-128,167, 0,156,208,236,220, 58,209, 6,192,242,231,143, 12,255,228, 29,127,254,244,174,125,223,118,221, 29,245, 66, 13,148, 14,
- 52, 40, 18,133,109,110, 29, 80,159, 68,245,225,119,130,250,107, 64,155, 95, 10,183,233, 38,160,156, 1,184, 2,159,120, 28,114,
-228, 31,129,225, 9,160,215, 3,230,215,155,183, 21, 0, 59,200,136,208, 95,227,240, 27, 7, 63,243,200,159,253,215, 39,126, 7,
- 30,122,175, 46, 66,118,190, 11,147,243,197, 3,235,118,181,118, 23,114,237,245, 7,116,204,232,193, 85,124,254,110,117,150, 23,
-133,144,164, 44,235,189,102, 3,220, 37, 34,247, 79,203, 88, 77,203,215,198, 43,245,122,207,224,208,239,120,142,101,130,237, 45,
- 39,114,175,201,106,119,168,214,193,254,179,245,154,155, 49,186,246, 30, 95,116,105, 92,205,206, 87,187,214, 39,159,175, 31,171,
-122,112, 21,159,177, 91,131,131,189, 43, 56,245,221,103, 16,166, 57, 96,158,219, 30,217,183,243,192, 10,140,247,105,173,137,157,
-117,246, 85,237,212, 43, 0,199,254,250,208,233,255,244,215,135, 78, 63, 0, 96, 45,124,221,252,105,120,168,125, 65,127,166, 45,
- 43, 22,230,173, 63,253,239, 62,240,212,187,110,187,110,238,198,183,220,186,249,230,229, 83, 99,208,186, 62, 48,112, 94,105, 14,
- 2,244,122,160, 94,207, 51,216,143,126, 2,245,225,135,227,225,200,149, 64,217, 7,230,215,180,222, 86, 0,227, 6,194,179,152,
- 25,244,241,240,231,158, 57,254,191,252,199,143,236,211, 44,125, 25,231, 49,161, 77,206, 32,141,118, 38,167,117, 46,155,172,170,
-165,221,133, 52,217, 42, 56,186,131,186,241, 63,220,114, 14, 97,131,221, 97, 28,196,197,180,253,200,199,100,238,209, 76,115,191,
- 57,183, 93, 72,236,227, 67,186,217,239,184,210,174, 87,175,107, 26,100,252,158,115, 88, 10, 7,206,163,119,125,151, 6, 76, 97,
- 84,232, 52,237,247,246,168, 92,192,203, 0, 95,144, 0, 71,246,237, 60,191,181,222,170,153,171, 58,220,228,243,221,183,243,124,
-159,111,208,133, 15,129,204, 71,117, 24, 75,187,228,144,149,138,244,231,246, 35,141,123, 13,130, 57,150, 37,127, 0,151, 86,150,
-182,179,206,158,151, 78,189, 81,199, 93,171, 19,119,250,189,145,126, 53, 88,121,104, 74, 13, 96,129, 69,254,225,191,255,221, 47,
-252,220,230,249,242, 29,255,244,230,245, 47, 28,158, 28, 3,107,123,160,153, 34,245,175,123, 15, 14,244,103,206,220,135, 38, 0,
- 88,128, 81, 3, 62, 53,198,236, 11,182,225, 83, 79, 29, 95,184,115,239, 7,247,158, 92,172, 62,100,130,140,139,109, 15,171, 67,
- 63,103,210, 18, 17,237, 55, 2, 54, 27,237, 70,127,185, 23,130,102,235,119,106,118,179,125,133,204,211,102,110,119,226, 44,208,
-230,243,249,122,167,216,185,102,116, 7,159,195,103,109,199,234,235,208,251, 47, 65, 64,119,230,181,190, 2,195, 92,167,160, 93,
-144,231, 75,119, 63,120, 92,246,237,188, 23,249, 56,215,105,194, 54,123, 21, 37,176, 63,183,231, 12,247,243, 46, 61,183,206,169,
-119,246, 85, 97,238, 44,110,180,134,175,151, 31,135,159,124,118, 2,192,146,126, 95,206,242,187, 35, 0, 39, 79, 45, 55, 15,126,
-215,254,207,254,239,191,249,177,163,159,158,233, 59,244, 78, 85,224,147, 21, 48,228,120, 20, 2,129,104,202,151,254, 15, 13,128,
- 49, 67, 78,213,160,227, 35,204,110,220,128, 7, 15,157,124,250, 91,126,230,224,207, 28,122,102,225,247,245,220,150,112,241, 88,
-239, 7,117,115,189, 83, 7,113, 60, 23,253,239,253,240,146,155,251,177,186, 30,228, 3,186, 49, 93,252,137, 86,126, 40,204,237,
-103,249,172,131,240, 99, 79, 31,190,210,175,247, 50, 56,200,123,177,122,114,229, 1,248,114,192, 93,151,184,115, 32,173,245,187,
- 31,188,253,108, 45, 99,170, 50,119, 65,158,175, 30,235,166, 22, 58,180,210,103,222,137, 51, 19, 7,253, 58, 61,207,241,174,157,
-117,118,165, 26, 93,228,227, 23, 0,230, 52, 82,126,197, 15,191,118,235,143,253,155, 55,191,240, 59, 94,184,190, 95,214, 35, 65,
- 93, 18, 48, 83,128, 74,231, 51,119,103, 78, 71, 4,104, 0,169, 25, 24, 54, 40, 42, 70,175, 71, 56,213, 0,239,252,208,177,191,
-248, 63,223,247,232,253, 85,195,127,135,212, 74, 87, 95,137, 15, 64,161,224,118,150,120, 8,126,186,217,193,203,120, 94, 1, 46,
-181, 66, 31, 7, 87, 57, 13,238,138,187,222,203,244,220,183, 99,146,155,240, 48, 60,220,126,252,138,188, 46,207, 54,159,254,124,
-207, 82,111,191, 64,159,119, 8,192,195,221,204,244,206, 58,167,126,113, 29,251, 12,128,245, 0,174,126,209,166,193, 55,239,121,
-195,214,239,252,161, 29, 87,189,230,218,181,189, 30,132, 32, 34, 96, 34,176, 57, 27, 39,128, 19,241,173,107, 4, 28, 29, 54,252,
- 95, 62,113,236, 31,238,127,232,240,251,254,254, 75,139,127, 12,224,203,138, 28, 44, 95,169, 14,189,179,206, 58,235,172,179,206,
-174, 52,167, 30, 62,167, 15, 96, 30,192, 58, 0, 87,111, 90, 83,126,237,107,110, 88,243,154,239,189,117,211,171,111,125,225,220,
- 11, 54, 14,138,249,249,146,250,165, 35, 87, 51,100,169,225,241,201, 49, 47,125,238,240,242,145, 3, 31, 63,246, 95,255,234,208,
-194,223, 62,121, 98,252, 48,128, 39, 0,156,130,175,161, 95,180,158,244,206, 58,235,172,179,206, 58,235,156,250,153, 63,203, 1,
- 24,192, 67,242,115,240,140,250, 77, 0,182,205, 13,220,230,153,210,173,235, 21,212,175, 89,234, 97, 45,167,151, 70,205, 81, 17,
- 28,134,135,216, 79,193,215,205, 23,113,118,162, 94,103,157,117,214, 89,103,157,117, 78,253, 18, 58,247,158,102,239,225,171, 68,
-156,190, 14,104, 6, 94,233,215, 88, 29,121,221, 57,243,206, 58,235,172,179,206, 58,123,254, 56,245,246,231, 7, 39, 31,254,180,
- 78, 93,204,159,157, 35,239,172,179,206, 58,235,172,179,231,177, 83, 63,211,249,116, 78,188,179,206, 58,235,172,179,206, 58,235,
-172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,
-206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,235,172,179,206, 58,
-235,236,249,103,244, 11,255,254,254, 41,253,224,228, 27,198, 5,128, 19,136, 56, 16, 1, 2,153,104, 36, 23,209,225,106, 2,128,
-226, 31,254, 79,246,202, 49,100,254,125,194,244, 51,130,238, 76,251, 71, 68, 4, 68, 4, 8, 65,136, 0, 97, 64, 4, 76,254,248,
-241, 68, 5, 16, 61,239, 48, 4, 6, 2,255,187,228, 79, 84,116,164,171,136,254, 12,128,147,199, 79,225,243,159,252, 36,164, 26,
- 97, 60, 30, 97, 60, 30,163,116, 4,112,131, 97,221, 96, 80, 20, 32, 2,170,170,194, 53, 55,223,142, 47,127,225, 31,112,242,228,
- 81, 44, 46, 47, 98,121,220, 0, 4,148,228,208,239,247,225, 92,137,235,111,188, 17,183,237,248,122,252,205,135, 14,226, 59,238,
-124, 43,126,235,254, 95, 2, 0, 12,199, 21,102, 7,125,140,235, 6, 11,163, 17, 54,174, 89,131, 99, 11,139,232,247,251,168, 26,
-198, 85,235,214, 98,177,170,176,102,102, 22, 71,151, 71,184,106,237, 58, 52,189, 62,182, 93,115, 3,238,120,227, 14,212,117,141,
-162, 40, 32, 16, 52, 13,235,120, 90,125, 46, 2,228,119, 94,255,206,128,232,115, 11,247, 54,253,108,254, 16, 68, 0, 97,255,253,
-162, 40,210, 13,202,127, 49,222,235,186,105, 80,150,101,122,102,162,127,115,254,153, 53,117,131,162,112,128,142,208,133, 0,226,
-116,101,137,254, 28, 51, 8, 2, 17,242,107,139,210, 51,231,134, 81,184, 2,172,139,136, 38,206,133, 32, 4, 52,117,141,178, 40,
- 1, 71,186, 86,194,234, 37, 16, 73,190, 24,178,251, 3, 64, 8,228,156, 89,107,128, 35, 2,131,179, 75,110,154, 26, 16,160,236,
-149,241, 40, 77,195, 96,105, 80,186, 82, 23, 26,226, 49,195,177, 8,233, 35,133, 4,117,221,160,212,123, 75,250, 84,184, 97,127,
- 92,241, 63,200,204, 40,138, 2,228, 0, 18,154,120, 33,152,211,125, 32, 2,200,172,107,210,197, 16,214, 74, 81,148, 0, 73, 28,
- 99, 44,228, 47,200,193,233,187,161,191,235,244,126,137,128, 28, 65, 24,104,152, 81, 56,231,255, 27, 2, 71, 78,239,143,121,209,
- 29, 0,214,123, 76,173,157, 65,160,191, 75, 19,239,181,152, 71, 9,248,119, 52,220, 87,146,180, 90, 9,126,208, 19,216,175,119,
-127,233, 28,215,147,115,206, 15,103,118,225,227,195,117,232,211, 38,232,181,167,115,142,251, 81, 60, 15,137,207, 11, 96,127,190,
-122,223, 29,153, 61,197,158,187, 72,220, 79,152, 25, 18,206,153, 68, 63,155,210,235, 18, 94, 11,241,255, 46,254,170, 16,207,138,
-243,123, 1, 2, 26,110,224, 92,161,207,197,236,140, 4,115,103, 4, 68, 46,109,161, 83,246, 85,161,120,194, 16, 61, 33,134,232,
-190, 25,254, 91,255,170,215, 42, 77, 3, 16,161, 32,151,164,193,244,254,137,238,167, 68, 64, 93, 55, 40,156,131,211,159,147,169,
-123,183, 95, 99, 0,193,133,125, 56,172,124,241,251, 12, 17,129,196,175, 77, 2,161,214,119,173, 40, 10,148,101, 9,231, 72,215,
-114, 1,231,156,126,207,193, 81, 1, 1, 67,216,191, 51,117,211,160,105,154,248, 60, 24,156, 28, 20, 72,159,145,223, 16, 5,140,
-170,170, 65, 68,254, 93, 41, 11,239, 83, 26, 70, 35, 2,102,127,156,134, 25, 77,237,143,219,176,255, 83,194,179, 55, 15,152,245,
-122,184,105, 80,148,165,127,191,117, 63,101, 22,136,232,121, 10, 64,196, 96, 33,248,213, 76,113,221,133,187, 39, 8,163,200,245,
-247,133,211,125,247, 59,132,174, 79,255,190,138,243, 43,196,238,112, 37,166,250, 89, 73, 47, 30, 3,112,254, 64,102,141,100,110,
-129, 37,238,231,126,169, 10,169,227,165,236, 84, 97, 54,164,108, 5,176, 46,116,231,166,123,127, 65,107,211,208, 69,236,140,175,
- 33,179,176,201, 94, 9, 38,182, 21, 50,171,238,169, 39, 14,163,239, 8,203, 0, 6,101, 1, 97, 7, 97,160,152, 93,143,254,240,
- 52, 32,140,153,126, 15,253,153,121,112,189,140, 53,235, 54,161, 39, 35,188,242,214,215,227,200,211,143, 97,225,228, 17, 44, 13,
-135, 56,185,184, 4,160,194,145,103,158,196, 23, 31,255, 2, 78, 29, 59,134,247,189,231, 55, 1, 17,244,251,126,227,175,234, 26,
-131, 94, 15,189,178,192, 51, 39, 78, 98,203,186,181, 24, 51,163,160, 18,133, 35, 12,202,158,127, 1, 0, 44,142,199,152,235,207,
-160,223,235,129, 69,204,213,200, 10,247,136,208,246, 1,105,211, 74, 47,101, 88, 32,103,215,246,145,184,241,132,141,151,153,163,
-143, 36,202,125, 44,181,159, 41, 77, 62,179,176,120,252,239,232, 65, 36,223, 56,226,117, 18, 32, 78,224,196, 65,156,100,139, 78,
-200,165,243,167,116,156,228,208,225,157,188, 58,118, 97, 19,228,153,205, 81,244,228,201,120,223, 44, 62,162,214,245,101,151, 40,
-186, 25,217, 32,152,144, 60,138,185,104, 71,198,147,133,247,200,249, 0, 85, 15,236,156,196,207,201, 30,143,228, 49, 9,145,185,
-110,245, 60,206,158,183,121, 94, 33,168, 9,215,236,224,252,102, 68, 26, 96, 73,242,110,132, 16, 60,135,235, 22,115,205,148,159,
- 79,188, 93,102, 92,178, 58,173,176,225,132, 95, 38,164,141,213,250, 38,202,246, 26, 74, 14,157,252,250, 23,117,244, 78,210,223,
- 73,247, 1,127, 89,193,233,132, 99,187, 21,182, 11,153,120,158,200,110, 47,153, 77,117,122, 98, 65,246,121,170, 3, 23, 50, 65,
- 27,252, 51,208, 80, 16, 52,241, 30, 74,246, 46,248,251,238, 55,118, 10,123,152, 6,100, 89,192,163, 9,141,216,223, 35,228,107,
- 52,188, 79,230,221, 33, 32, 91,176, 18, 28,188,122,112, 33,154,140,172, 68,131, 40, 17,239,128, 77,224, 27,110, 92, 8,146, 98,
-240, 76,103,214, 46,163,236,157, 78,187,137,176,248,128,140,210,251, 65,240,251, 11,224,131, 65, 87, 56,179,206, 39,118,110, 13,
-160, 82,160,170, 33, 73, 10, 96,194, 5,147, 79, 30, 76, 90, 3,110, 88, 31, 37,195, 57, 31,224,178, 8, 24,234,128,197,223, 7,
- 97, 6,139,126,177, 63,174, 79,124,196, 4,114,234,235, 88,131,103,129,254,155, 38, 74,254,168,209,163,138, 0, 16,239,216,195,
-222,108,111, 55,169,211,101,166, 24, 56,144,190,247, 44,230, 93,204, 18, 91,134,168, 99, 7, 1,101,246,194,197, 13, 65,204, 99,
-161, 44,178, 75,145,171, 76, 70,134,225,223, 37,253,153,254, 77, 98,140,153,189,117,186, 17,248,147,229, 20,217,211,180, 69,162,
-143,142,252,141,137, 17, 13, 76,118,180,130,191, 18,187, 8, 41,237,147,117, 53,198,184,170, 80, 64,176, 60, 30, 99, 92, 53, 40,
- 9,232,213,139, 24,143,199, 88, 51,211, 71,191, 44,113,114,113, 1,167,191,124, 8, 60, 94,192,236, 96,128,197, 83,207, 98,184,
-120,194,143,159,235,149,216,186,113, 19, 70,163, 33, 78,159, 60,133,191,254,208, 95, 96,110,118, 22,195,103,158, 66,233, 10, 12,
- 23,198, 0, 17,122,101, 9, 22,198,210,168,194,160, 44,176,118,110, 22, 79, 30, 63,133,185,193, 0,163,170, 65, 45,130,138,147,
-235,118,174,192,186,181,115,153,123,166, 41,219, 82,184,104, 27, 64,197,101, 20, 82, 70,177,206, 73, 90,142, 54,223, 98,211,254,
-156,175,141,144, 69,218,167,145,118, 74,154,120, 86, 89, 48, 69,249,179, 72,171, 56, 4,129,186, 97,137, 68,132, 37,126,188,232,
- 86,165,209,124,216,220, 69, 55, 32, 74, 41, 31, 68, 52,115,179,225,156, 58,123,161,224, 64, 18, 90, 67, 54,205,160,228,116, 17,
- 55, 8,127, 78, 69, 81,168, 67, 36,115, 47, 83, 22, 39, 38, 82, 16,139, 12,133,127, 11,136, 83,116,118,186,129, 58, 93,195, 18,
- 28,130, 94, 79,184,126,189,110,187,177,198, 13, 74,130,238, 2,159,201, 0, 0, 32, 0, 73, 68, 65, 84, 35,116,209,183,134,205,
-197,103,177,206,103, 64,138,132,216, 64, 43,249, 95, 74,247, 46,124,148, 57, 87,210,119, 55,162, 44,118,149, 81, 30,119,132,189,
-195,111, 48,233, 57, 66,131,245,248,110, 91, 24, 67, 12, 42,168, 14, 61,100, 33,241, 90,201, 32,112, 41, 58, 11,121,121,204,196,
- 98, 86,110,145, 3,105, 35,144, 33,203, 54,193, 88, 88, 45, 45,112,202,162, 25, 9,122, 73,193,161,207, 46, 91, 1,163, 6,172,
-100,130,128, 44, 7, 51, 31,228, 17,170,228,120, 65,228,209,171,128,186,132,165, 25, 31, 76,218, 87, 77,138, 21, 3, 42,187,231,
- 74,132,154,194,251, 28,130, 14,196, 48, 38,247, 36,126,237, 4,167, 42, 98,144,162,112,175,188,199, 2,179,119,134,228, 40,189,
-155, 19, 1,159,143,145, 18,218,228,175,159,217,175,121, 71, 41,243, 15,153,175, 40, 2, 89, 56,151, 16, 86,164, 53,106,159, 79,
-112,120,193,129,134,228, 82,162, 31, 10,240, 3,167, 37, 32,226,179,111,230,152,160, 56,231,188, 3,111,127,177,164,239,115,114,
-246, 49, 40, 54, 1, 30,216,255, 12, 21,206,223, 87,201,157,162,255,189,112,206,122, 60, 18, 19, 39,230,153,191,253, 29,210,247,
-142, 69,162, 31,149,108,207, 9,235,202, 39, 8, 2,160,148, 24, 33,183, 50, 14, 19, 9,138,121,242, 36, 98,147,174,184,225,144,
-249,102,150,205,199,183, 3, 16, 19,141,147,125, 73, 72,146,239,177, 16,159,121,225, 66,178, 67, 49, 25,114,105,155,144,201,128,
- 78, 32,112,146, 67, 86,109,215, 83, 20, 5,184,105, 48,174,198,232, 81, 8, 26, 9,174, 32, 84,117,131, 70, 4, 85,211, 96, 88,
- 85, 88,191,245,122,148,253, 25, 28,254,210,167, 49,211, 43,177,102,253, 22,156, 58,250, 4,106,241, 11,100,195,250,181,104,154,
- 10, 87,109, 88,135,225,120,140,211, 75, 75, 96, 1, 28,249, 81,239,133,115, 24, 85, 21,230, 6, 3, 20, 68,232,151, 37,142,157,
- 94, 64, 89, 56,244,123, 5,198, 77, 3, 1, 97,105, 60, 70,175,215,247,215, 92, 20,216,188,113, 93, 68, 35,200,166,196, 2,144,
-227,184, 81,176, 36,167, 39,146, 94, 66,145,228,132,130,147, 74,112,113, 56,142,152, 23, 61, 5, 91, 33,211,245, 25,140, 36,168,
-212,194, 35,113,191, 49, 25,145, 61, 79,146,137,224, 65,212,153,165, 61, 69,226,231,161,245, 60, 69,131, 78,103,119,139, 86, 73,
- 37,157,167,191, 22,136, 3,133,204, 23, 33, 88, 48,193,168,102,177,126, 13,165,108,158, 76,176,103, 95,200,152,249,218,108, 40,
- 56, 68,114,233,126,132,204,137,210,117,133,181,203, 48, 65, 64,112, 58, 44, 30,157,210, 99,123, 39,239, 64,122,204, 0,171,155,
- 16, 62,194,228,118,151,139, 73,179, 58, 55,167,155,162,144, 34, 29, 36, 38, 72,202,157, 98, 58, 52,133, 16, 94,175,143, 98,137,
- 35,123,198,230,126,147,125,255, 3,180, 76,249, 51, 20,139,172,165,216,203,196, 81,169,148, 66, 72,193, 26,217, 76, 95,207, 71,
-204,117,251,159,117,241,173,246,159, 31,160, 72, 73,232, 0,181, 49, 72,239,112, 93,200, 96, 37, 21, 8,194,166, 11, 69, 10, 72,
-236, 70,151,103,160,193,217, 50, 9,192,121, 52, 64, 89,150,219, 10,164, 92, 2,207,200, 64,233,193,233, 48, 75, 44,179, 69,152,
-213, 58, 74,139, 18,200, 36, 10, 22,127, 77,225,169, 24,160, 75, 10,138,108, 54,111,177, 76,214,204, 53, 36,101, 9,151, 79,193,
- 48,139,119,188,142,156, 6,139,122, 92, 70,150, 82,248,243,117,166,172,224, 51,113, 31,132, 23,201,225, 3, 49, 43, 22, 2, 74,
-231,124,233, 97, 21, 72,128, 5, 46, 83, 89, 81,252,181,139, 41, 45,232,147, 15, 48,189, 52,141, 71, 3,156, 3,139, 15,102,188,
-227,214,210, 95,128,189, 21,218,103,227,208, 67, 6, 30,159, 5, 43, 60,238, 92, 12,158, 41,236, 91, 54, 99, 87, 24, 61,193,247,
-105,159,161,214, 50,147,184,111,164,160, 58,250, 83,227,127,205,227, 73,136,144, 0,101, 40, 61,164,104,175, 85,103,178, 17,175,
-197, 33,163, 99,144, 22,208, 45,147,105,153,121, 56, 28, 55,104,139, 12,231,248, 88,138,116,125,168,226, 98,106,148,240,118,239,
-220,237, 77, 52, 79, 16, 4, 18, 55, 1, 7,199,210, 64,200,132, 28,161,169, 70,126,195,224,198,215,137, 11,231, 55,205,114, 22,
-197,184,246,245,225,166,198,210,201,103, 1, 87, 96,221,134,109,168, 22,142,224,248,225,199,209, 52, 90,251, 66,131, 13, 91, 94,
-132, 83, 39,143,163, 95,150, 56,181,176,136,173, 27,214, 99, 97, 56, 66, 85,215, 24, 85, 53, 22,150,135, 40,156,127, 9,230, 7,
- 51,152,155,157,193,210,104,140,126, 81,120,135,202, 90,207,132,143, 30,157, 43,208,239,207, 96,203, 85, 27,178,136, 92,108,116,
-199, 90, 83, 35, 91, 51, 23,221,168, 40,131,128, 99,230, 26, 2, 40, 78,165, 81,230, 54,222, 27, 16, 19, 74,217,138, 36,120,150,
-140,179,177,209,118,136, 20,197,236, 54, 18,179, 26, 11,191,147, 47,217,180,130, 3,187,168, 73, 11,165,126,195,144,220,177,233,
- 70,199, 32,205,116, 53,184,136,155,123,168,227, 33, 58,153,176,209,248,123, 22,119, 62, 5,173, 40,135,224, 37,193,215,220, 4,
- 52, 32,161, 66,194,201,169, 59,146, 86,146,146, 54, 58,177, 85, 8,130, 57,142,158,175,110, 44, 46,148, 11, 26, 68, 39,239,178,
- 87,199, 77, 64,235, 9,180, 54, 79, 56,220, 38,123, 12, 39,254, 93,208,235,119,234,248,132,140, 99, 23,103, 56, 17,254, 60,156,
- 75,200, 65, 59,141, 37,180, 29,122,242, 52,206,192,146,146, 83, 94,210, 86, 66,148,161,126, 54, 48,161,248, 28, 9,182,186, 14,
-179,230, 40,192,210, 38, 64, 9, 25, 63,153, 77, 46,162, 30, 34, 38,150,145, 88, 63,246,207,223,105,157, 18, 89,160, 32, 6, 1,
-203, 61,151, 89,203,122, 63,217,137,217, 14, 41, 15,120,219,232, 83, 12, 26, 96,156,131, 63, 79,230, 20,144,101, 91, 36, 89,104,
- 68,223, 31, 19, 20, 73,142, 45,233,251,165,225, 2,153, 96,198,122, 35, 83, 82,241,107,135, 65,226,159,123, 22,208,144, 45,179,
-250,111, 20,206,212,219,217, 32,174, 33,208,139, 8, 89, 8,162,204, 59,163,176, 59, 73,130,148,153, 27,127,220,194,121, 56, 92,
- 75, 91,177, 36, 52, 45,118,161,148,185,250,140,218, 58, 94, 24,248, 91,209, 5, 97, 52, 85, 3,230, 70,223, 15,159,161,135,154,
-119,128,216,131, 67, 79,127,230, 95,214, 7, 38,135, 30, 74, 23,138,192,217,108,155, 89, 3, 6,127,236, 88,190,177,153,121,112,
- 96,198,129,147,115,177, 86, 31,185, 26,250,239, 36, 45, 4, 43,172, 7, 93, 99,101,132, 4, 98, 6,220,130, 75,197, 68,239, 90,
- 15,136, 16, 56, 44, 12, 68,104, 35, 15, 80,136,129,180,198, 17,106,185, 54,147,132, 93,176, 50, 89, 19,166,108, 25,122,199,199,
-122,215, 36, 56,118, 39,126,179, 18,179,177,145,137,132,244,173, 16, 3,213, 18,128,133,211, 75, 0,215,112, 32, 84,236, 73, 18,
-125, 0,101, 89, 98,204,140,170, 26, 99, 80,206,160,106, 24,163,165,163,152, 91,179, 1,167, 23,142,162, 97, 65,179,124, 24, 47,
-121,197, 63,193, 35,127,255, 16,170,166,193,209,103, 30, 7, 57, 66, 85,141, 49, 63, 55,131,245,235, 55, 99,113,248, 36,214,206,
-206, 98,166,223,192,185, 33, 78, 44, 46, 97, 92,251,104,120,220, 52, 0, 57,172,159,157,197,233,225, 24,253, 94, 15,181,214, 15,
- 89, 4,189,162, 64,217, 31, 96,110,118,128,170,170,167, 16,123, 36, 67,182,125, 36,154, 46, 94, 20,230,201,235,136,186, 96, 36,
-109,152,162, 89,114,138,200, 53,214,102,130, 35,246,153,168, 6, 29, 22,234,202,156, 9,179,129, 32, 37,174,153,137,218,140, 5,
- 2, 40, 71,117,242, 90,112,202,140,201, 56,129,172,164,230, 8, 78, 56, 57, 91, 67,246,113,209, 7, 58, 83, 38,114, 62, 12, 8,
-228, 39, 55, 89,175,158,228, 5,234,186,119,166, 10, 44,134, 84,231,200, 67,205,148,103,249, 36, 57,106, 30,126,209, 57, 31, 72,
-134, 32,200, 19,126,210, 3,114,164, 65, 74,150,195,145,169,112, 36,120, 53,119,135, 97,131, 20, 13, 20,148,152,100,160, 91,167,
-142, 92,148, 92,231, 8,137,124, 74,240,129,179,115,250, 60,194,231,135, 19,243, 55, 52, 98, 99,134,148, 24,207,198, 32, 39,193,
-249, 56,161, 84, 12,114, 46,110,136, 46, 43,139, 37,104,155,148, 36, 99,239, 15,166,160,232, 20,235,234, 6, 38, 54, 11,204, 57,
- 83,131, 15, 59, 7,181,216,104,162,231,167, 72, 20,153,210, 67,172,149,154,117,235, 47,207,133, 45,219,144,156,108, 38, 29,214,
- 21, 39,162,154,201,212, 99, 1, 82,159, 65,128,175,195,134, 13, 81,228, 70, 4,226, 40, 86,249, 99, 62, 99,136,202,212,218, 27,
- 39, 74,149,225,182,154,172, 91, 16,156,176,180,238,167,175, 51, 59,253, 76,145,188, 42, 71, 72,245,246, 68,126,157,246, 30,155,
-192,138, 0, 18,231,131, 23,102,125, 46, 69, 66, 92, 53, 86,143,129,130, 58,116, 9, 65, 43,145, 6, 0, 57,218, 17, 75, 39,193,
- 9,102,208,184,255,118, 72, 24, 34, 68,207,140,186,110, 80, 55,117,250,156,152, 57, 7, 7,158,190, 68,131,132, 72,130, 52, 95,
- 30,182,119, 38,248, 55,207, 62,242,201, 82, 86, 30,206, 41,108,215,161,118, 79, 34,134, 76, 25, 40,112, 98,170,169,146, 80,134,
-112, 28,189,105, 98, 17, 17, 33,127, 60, 74, 40,104, 41, 1,119, 12, 25, 59, 88,111, 26,101, 14, 35,175, 81,113,142,170,106,172,
- 32,173,138,141, 39, 50, 48,210,118,144,232, 18, 57, 37,165, 77,102, 17, 91, 45, 51, 78,154,178,168, 59, 6,196, 98,178, 8,151,
- 7, 1,214,171,133,151, 56, 68,207,167, 79, 45,105,192,193,122,131, 24,163, 90, 80, 56,135,133,133, 83,145, 28, 6, 0, 27,182,
- 92,135,133,163, 95,198,252,186, 45, 88, 58,117, 4, 27,183, 94,143, 35, 79,127, 17,227,241, 8,253,194,197, 69, 80, 53, 13,138,
-130, 48, 30, 15, 49,211,235,129,133, 49,174, 42,204, 13,122, 24,142,123, 0, 1,199, 23,151,193, 2,244,202, 18,149, 8,202,162,
-244,108, 75, 1, 6, 74, 16,233,247, 6,152,157,157, 67,211,112, 11,102,163,172,214, 11, 75, 52,138, 28, 10,206,160,204, 54,215,
-128, 67,109, 26,169,110, 30,157, 39,139,169,202, 83,172, 9,138,137, 48, 29,185,108, 67, 16, 75,166,162,196,100, 79, 48,170,100,
-203,199,229,151,210, 34,181,135,236,143, 90,165,122,253,190,163,140,242, 72,206,229,196,171,136,244, 36, 70,109,128, 61, 69, 28,
- 34, 31, 91, 98,186, 16,179,148, 8,196,170, 47, 9, 76,115,223,101,144, 54,120,231, 8,204,137, 57,111, 9, 83,217, 57,183,131,
- 16,231, 20,166, 51,207,192,249, 99,179,214,228, 18, 19,156, 20,109,208, 13,211,229, 84, 79,154,218,195, 0, 56, 74,140,228, 24,
- 76,192, 1, 78, 52,153,162, 4,187, 58, 19,180, 59,138, 25,176,103,204,187,228, 36,145, 2, 38,100,132,181,132,206,216,141,215,
-197,178,136,190,131,206,220,119,195, 68,151,144,149, 59, 19, 80, 90,248,221, 44, 92, 39, 38,251,215,243,183,196,216,176,209,134,
-110, 10,187,161,144, 18, 8,132, 0,155,255, 7, 20, 35,150, 31, 99,237,152,226,125, 97,136,249, 92,195,153,176,149, 12, 73,129,
-137,232, 29,167,176,113, 19,153,140,122,210, 17, 64,107,243,204,158, 40,236,239, 5,193,137,180,136,112,138,232, 76,208, 95,167,
-172,131,192,168, 14,205, 66, 54,192,116,146, 81, 72, 96, 28,171, 93,207, 98, 23,178, 32,214,209,157,118,220,132,208, 76, 76,171,
- 1,153,154, 75,188,207,234, 95,156,162, 71, 33,136, 99, 32,146,206, 60, 50,233,203, 78,148, 0,163,172, 59,130, 76, 9, 76,192,
- 62, 56,177, 14, 23, 22,126, 23, 52,193,169,139,160,110,188, 67,247,239, 95,145,213,208, 89, 82, 22,237, 29,189,102,229, 83,234,
-236,204,141,105,235,242, 1, 92,224, 6,196,189, 79,226, 42,156, 32, 55,199, 64,137, 13,138,160, 40,137, 47,155,165, 64, 85, 2,
- 42, 20,192,248,144,140, 25,248, 93, 4, 6,249,161,184,231,151,108, 32,153,184, 93, 50,212, 25,211, 68,218, 28,115, 48,243, 66,
- 83,116,217,192,212,116, 59, 64, 94,166,197,129, 51,212,221, 7, 2, 34, 46,239,114, 11, 27,134,155,194, 72,142, 59, 56, 39,184,
-136,166,180,230, 73, 98,250, 38,226,151, 63,247,163,135,159, 5, 55, 53,136,128,113, 85,163,223,235, 1, 10,193,207,244, 75, 84,
- 85,133,185,249, 57,156, 60,113, 2,199, 15, 63,238, 95,188,211, 71, 81,174,217,130,199, 31,123, 4,115,243,235, 80, 55, 13,230,
-215,109,195,169,147, 71, 0, 0,117,195,232,245, 6, 88, 88, 92,192,114, 85,249, 90,122, 93, 99,221, 96,222,215,207,203, 30,202,
-162,193,184,105,208, 8, 97,105, 52,198,220,140,195,104, 56,130,144,195,218,185, 89, 52,228, 80,148, 37,182, 94,181, 33,102,199,
- 57,208,218, 10,132, 76, 13, 39,188, 84,108, 83, 74,125,183,242, 4, 68, 18,148,221,174,152,136,193,230, 67,203,153,169, 45,163,
-213,222, 67,166, 45, 46,176, 63, 41,237,120, 41,101, 17,202, 9,239, 97, 45, 5, 34,184, 51, 48, 37, 37, 50, 72,246,119, 11, 79,
- 88, 72, 22,105,211, 70,107,211, 10, 75,208,153,226,174,143, 31, 92,236,201, 36, 11, 69,170,199,145, 80, 63,116,164,108,125, 75,
- 25,160, 44,123, 22, 75,228,106,247, 51,133, 98,134, 75,215, 11,246,229, 1,103,202, 89,142, 76, 22,164, 4,183,200,246,182,180,
- 4,106, 55,151,234, 6,169,181,115,184,252,190,180,176,237, 68, 75, 16, 3, 97, 75,186, 56,203, 31,200,136,173, 68, 10,175,107,
-234,152,213,223, 13,243,194,146,195,156,139,132,198, 12,202, 14, 40, 94, 86,195,150, 20,153, 43, 18,231,226,207,155,172, 81,204,
- 93, 53, 72,176, 24, 66, 32,161,213, 33, 97,106,231,100, 57, 37,148, 53,137,105, 80,144,194, 38,138, 28, 22,221,103,178, 78, 0,
- 13, 45,204, 26, 79,153,170,114, 38, 90, 84, 66,219,254,203,148,218,227,178,245, 65, 57,185, 50,161, 32,121,113,157, 12,171, 92,
- 38, 88,231, 48, 92,147,128,180,218, 14,153,244, 51,204, 77, 68, 69, 36,242,166, 40, 33,156,146, 8,108, 49,204, 51, 92,139,248,
-236,132,178,165, 20,118, 33, 71, 46,173,167,224,208, 37, 57,244, 66,225,112,138, 8, 5, 33,246, 41, 82, 43, 66,142,101, 87, 24,
-135,107,225, 5,152,164,212, 7, 75,141,162, 16, 69,225, 82, 59,162,169,111,115,116,230, 98, 88,238,121,150,206, 77, 19, 97,241,
-128, 76,134,224,217,217,210,151,237, 56,136,168, 67,218,139,165,213, 61, 34,194,202,173, 9, 1, 11,181,250,207, 36,102,248,129,
- 43, 38,246, 90, 45, 74, 20,156,122,134,237,183,234, 45, 49,139, 55,100, 34,177, 45, 21, 72,181,219,108,155, 17,219, 99, 30, 98,
- 14,210, 7,234,124, 29,210, 48,152, 41, 16,108, 72, 33, 49, 39,166,115,143,160,123, 61, 92,140, 94, 18,123,217, 16, 67,167, 58,
-116, 80, 43, 96, 49,247,180, 26,141, 48,170, 42, 20, 34,232,151,190,182,221, 8, 99, 92,141, 49, 59, 24,160,174,107, 44,156, 62,
-141,170,105,208, 43,123,177,174, 52, 24, 0,189, 94, 15,203,139,167, 80, 22,132,178,236, 69, 88,105,208, 43, 48, 55,232,227,244,
-226, 18, 74,114,232, 21, 14,235,102,102, 80, 42, 36, 58,232,245, 48, 55, 51,131, 97, 85, 97,185,170, 65,174,192,176,170, 65,206,
-161, 44, 29,134, 85,141,193, 76, 15,253,126, 31,215, 94,179, 37, 11,160, 44,119, 65, 76, 73, 36,254, 41,182,231,214, 68,137,220,
- 38,218,144,121,129, 90,162, 3, 89,245,132,227,155, 59, 45, 35, 72,181, 29, 49,109, 57,137,117, 27, 34,215,180, 1, 7,200,211,
-100, 80,176, 80,110,170, 16,134, 90,114,200,178, 12, 55, 46, 18,207, 28,181,218,243,178,136, 33, 5,132, 36,201, 65,201, 4,249,
-134, 2, 9, 27,224,176,198, 44,199, 41,175,113,134, 87,206,185,212, 27,170,137,112,138,150,115, 90,159, 46,245,148,137,248, 76,
- 83, 55, 82, 24, 62,128,115,246,166, 78, 4,177,100,153,103, 54, 66,179, 93, 41, 49,147, 82,182,191,194,204,177,253, 83, 82, 11,
-152, 71, 50,108,160,219, 38,253, 89,126, 75,114,186,129,200,135,204,249, 79,182,139, 6,103,234,218, 16,170, 13, 14, 45, 89, 45,
- 23,152,136,142, 44,107,209, 74, 43, 36,214,108,179,174,157, 72,242, 21,211,241,144, 2, 46,154,210,180, 38, 22, 62, 37,151,101,
-243,129, 32,232,203, 7,156, 65,232,150, 32, 44, 52,217,250,230, 29,128,225, 42, 91,248,223,212,159, 89,127,214,129, 48,173,245,
-103,218,198,221, 70, 35,179, 18, 91, 27, 53,210,114,139,216,223,136, 21, 55, 45, 84,133,154, 85,171,172, 26,218,195,138,178,240,
-136,139,237,138, 16, 49,229, 26,171, 91, 16,229, 68, 18,105,211, 41,242,161,253,218,161, 28, 21, 90,219, 68,252, 61,118,134,108,
-155, 5,206, 19,117, 89,219, 42,150,123,212,208, 57,193, 44,104, 26,127,237, 78,187,118, 36, 43,193, 80,116,144, 9, 46,151, 84,
- 91,103,109,107,107, 26,189,135,206, 35,183, 1,121,104, 83,195,204,166, 24,223, 65,246, 78,159,201,247,159, 57, 39,218,174,166,
- 65, 79,188, 71,173,174, 80,180, 24,246, 33,163, 55,140,255, 88, 70, 53,101,160, 84, 83,151,182, 75, 79, 48,152,101,177,134, 15,
-205,107,135,210, 98, 86,231, 53, 36,155, 1,112, 38, 46,145,156,126, 56, 65,168, 67, 87,218,120,106,253,137,235,197, 63,244,208,
-102, 34, 42,164,192,180,178,174, 77,214,127,108, 30,124,225, 28,154,102, 12, 7, 96, 84, 85,168,235, 26, 78, 23,127, 89, 20, 24,
-141,199, 40, 93, 1, 34,191,129,215,117, 13, 71, 2,162, 18, 39,142, 62,139,219,190,225,141,248,200,135, 62,128,158, 43,113,250,
-244, 9,192,149,224,166,194,242,112, 4,114, 5, 70,117, 13, 17,198,218,249, 13, 96, 89,194,104, 92, 97,208,235, 97,208, 47,192,
- 12,108,152,159, 71,111, 60,198,114, 85,107,173,211,197,252,210,185, 2,253,193, 44,214,175,157,207,200, 47,210, 22, 80, 17,201,
- 30,124,124,192,129,117,169, 11, 92,164, 21,214,217, 23, 90, 38,117, 67, 34,203,155, 82,230,205,182,197,200, 66, 73, 54, 35,136,
- 74, 68,148, 50,156,140, 61,237, 29,137,139,153,189, 75,125,189, 68, 74,216,227,172,134, 29,196, 69, 36, 8,142, 80,106, 25,131,
- 17, 19,130, 35, 16,115,238, 0,132,114, 21, 24, 50, 68, 54,164,168, 48,157,187, 68,241,145, 32,140,147,148, 77,200, 56,141, 38,
-182,106,197,227, 32,177,199,209,226,110,132,214, 53,103,179,195, 40,250,146,132, 90,242,146, 67,130,245,226,102, 65,121, 78,105,
- 9,136,225, 60, 2,113, 80,196,212,209,205, 70,103,235,242,169,103,222, 20, 69, 66,155, 96, 64,226,168,229,132, 66,103,201, 20,
-102,178, 32, 23, 44, 32, 35, 52, 98,154, 45,180,164,144, 58, 96, 92,187, 65,182,221,194,148,137,211,164, 86, 47, 17,155,117,231,
- 29, 55,212,234,166, 12,168,132, 76,169, 66, 7, 66,153, 24, 34, 29,216, 16,227, 98, 64,147,103,201,237,243,181,251, 76, 44, 31,
- 56,164,250,105,222,129, 22,239,189, 39, 92,230, 39,237, 20,177, 16, 66, 78, 76, 14, 37,160,200,214, 55,215, 20,136,144, 98,131,
-201,188,209, 53,235,138, 1, 32,210, 68,104, 60,113, 10, 40, 75,204,162, 72,140,158,167, 4,237, 5,166, 12,170, 39, 9, 98, 65,
-154,221,187,164, 37, 64,162,109, 89, 90,211,138,144,123, 8,248,195,117, 58,202,136,184, 68,212,110, 96,240,213,103,227,132, 5,
-150,112,168,190, 65,133, 99,156, 3, 92,209,203, 90,171, 69, 25,242,142,104,130, 33, 36,166,166, 46,202,150,103, 86,135, 30, 2,
- 32,227,129,133, 45, 33, 50, 95, 14, 28,215,162,131, 19, 1,107, 73,203,223,127, 86, 46, 1, 77, 32,218,233,164, 84,164, 40, 36,
-199, 76, 9,114,213,146, 72, 44,190, 6, 4,220,215,212,101, 66,111, 43,131, 86,131,102, 12,167, 95, 22,147, 9,137, 97, 85,228,
-209,176,129,121, 34,133,159, 76,155, 28,165,202, 96,128, 83,156,175,135, 16, 28,192, 30,238, 18, 2,136, 29,216,105,101,158, 18,
- 68,225,197,198, 90,117,204,184,241,176,214,126,173,218, 83,171,199,166,241,108,200,180,129, 11, 26, 22,140, 69, 80,184, 34, 66,
- 48,117,211,248, 53,220, 8, 42,140,177,249,234,107,241,153,143,125, 20,194,140, 74,106,128, 5, 92,143, 65, 68, 88, 59, 55,171,
-181, 23,198,252,204, 12, 74, 7,212,117,157,181,236, 49, 75, 84,236, 90, 63, 55,139,165,113,141, 6, 64,197,128, 43, 28,250,131,
- 89,204,207,175, 69,163, 81,161,176,104,164,107, 80,146, 88, 11, 75, 10, 64, 28, 11, 27, 65,165,141, 99,210,148,152,200, 28,137,
- 7, 17,102, 38,202, 3,187,140,232, 21, 20,189,242, 77,144,208,142,232, 93,204,188,131, 56, 72, 90,232,228,219,230, 66,173,149,
-130,162, 25,103, 81, 51, 41, 12,239,156,135,223,162, 98,154,217,157, 61, 36, 75,104,132,163, 0, 73, 32, 99,178,169,217,145,178,
-139, 44, 99, 90, 12,115, 62,135,243, 16,219,177,156,238,190,181, 18,228,168, 45,160,100,234,174, 25,232,236, 16,157, 40,217, 62,
-101, 18,160,241,228,189,212,130,149, 58, 8,136, 8,172,253,185, 54,227,182,237,160, 19,164, 37,103, 90,235, 36, 5,123, 20, 91,
-215,148,204,150,114,218, 68, 72, 51,237, 99, 4,100,237, 99, 81,219, 42,219,236,114,116,131,162, 82, 28, 90,142,142,140,120, 84,
- 98,125, 59,228,109,177,142,104,162,252, 34, 19,220, 9, 35,136,226,108,139, 99,128,253,253,198, 72, 83,217, 97, 45, 18,153,237,
-168,176,173, 90, 98,154,234,200,246, 45, 68,175,233,137, 94,194,185, 8, 79,171,165,169,221,188, 17,168,116, 89,195, 0, 77, 19,
-181, 9, 80,191,192, 21,110, 10,142,216,106, 91, 35,180,196,100, 36,181, 50, 74,114, 1,150,255,228, 4, 89, 74,160, 57,163, 65,
-215,196, 40,243, 73, 12, 2, 8,169,111, 61, 40,185, 89, 86,126,162,176,114,150,110,136,238, 21,177,254,174,239,155, 40, 12, 22,
-248, 73,142, 92,114,248,137,206, 30,223,119, 24,135, 62,161,133, 18, 2, 91,225,172,165, 45,181,219, 58, 0,141, 87,221,116, 20,
- 85, 47, 19,252,237,247, 69, 9, 73, 43,229,119, 92,140, 99,111,154, 6,208,142, 4,239,132,149,188, 25, 74, 4, 28,217,149, 70,
- 71, 35,173,118, 7, 1,187, 68,122,115,162, 92, 28,176,118,151, 56, 67,122, 14,129, 15,195, 66,128,162,136,134,247,211, 2,166,
-212, 67, 15, 88,180, 36,161,157,165,200, 36,248, 30, 96,187, 80,135, 22,150,152, 33,249,236, 56,151,219, 12,117, 3,201,153, 26,
-121,133, 71,114,193,148,172, 17, 46, 44, 82,237,223, 96, 39, 17,246,242,189,230,236, 29, 59,169,211,146, 40,152,167,205,252, 38,
-139, 50,170, 86,162, 13,116, 73,223,196,188,204,166,255, 48, 58, 62, 17,244, 10,231,137, 21,149,111,113,107,234, 26, 36,130, 65,
-175, 7,144,195,117,183,188, 28,167,143, 31,195,154, 77,155,240,236,137, 99, 40,136, 81,141,135, 88,187,118, 61,150,151,151,176,
-176, 60,196,154,185, 89, 16, 57,148, 69,129,133,229, 33, 64, 14, 71,142,159,192,214,141, 27, 80, 22, 5, 10, 39, 24,244,123, 24,
- 47, 15, 65,202,214,173, 26,193,186,217, 25,140,169,192,236,220, 60, 94,241,146,235,181, 70,237, 73, 27,209, 41, 69, 8, 38, 64,
- 20, 6, 66, 50,121,189,135,118, 44, 60,102, 24,148,129, 72,167,145, 50,152, 97, 40,227, 70, 91,192,197,160,142,200, 74,185,154,
-154,135,110,126, 62,219,113,177, 13, 37, 17, 94, 40,170,192, 37,226,154, 36,158, 3,200, 28,103, 74,207,180, 35,191, 57, 88, 49,
- 28,197,223, 83, 13, 50, 64,130, 28,107,124,118, 23, 32, 50,100,173,184, 33, 58, 11, 34,249,210, 0, 75, 11,218,116, 10,139,230,
- 29,202,209,217,183, 68, 18,194,182, 41, 46,106,226,234,207, 53, 49,200,129,173,149,154,112, 33,182, 9, 9,101,104, 89, 91,236,
- 36,235,221, 15, 18,157, 28, 54, 9,189,223, 65, 32, 39,211, 10, 32, 27, 70, 79,122, 36,180,197, 82, 82,157, 58,246,128, 7, 78,
- 13, 51,224, 82, 91, 85, 12,148, 66,192,152,149,188,172,142, 69,210,168,136,157, 40,210, 18,149,153,162,148,152,183,166,250,245,
-237, 98, 54, 73, 45, 81,152,188,191, 91, 12,131,210,255, 93,139,129,228, 18,178, 69, 17, 66,208,189,141,209, 98,140,153, 18, 65,
-112,140, 52,169,254, 22,203,133,146,117, 8, 73,187,182, 31, 90, 50,117,189, 57,155,168,100,144,110, 46,150, 21,224, 98,178, 52,
- 9,131,148, 69,245, 61,105,145, 55, 39,216,155,161,195,133,141,252,104,250,100, 34,151,139, 24, 81,206, 12,176, 65,159,223,183,
-253,123,197,234,230, 3,233, 45, 65, 6,236,131,112,223,175,171, 65, 12,165,122, 60,100, 66,187, 38, 10, 29, 25,228,199,175,127,
-110,245,115,231, 32,188, 8,251, 86, 99, 34, 20,101,191,197, 21, 10,244,248,196,147,161,118, 97, 86, 81,206,192,124,247,221, 86,
-234, 15, 67,237, 31, 41, 49,140,201, 42, 75,174,168, 24,249, 54,182, 13, 82,223,139,162,136, 93, 13, 48,196, 78, 95, 42, 51,165,
-173, 86, 66,147,237, 15, 6,117,200,253, 45, 80, 90, 5,177, 88,206,138,208, 91, 18, 75, 14, 14, 34,246,207, 66, 50, 38,168, 8,
- 90,236,211, 41,145,119,187, 78, 96, 53,227,197,194,195, 28, 55, 69,105, 87, 46, 56, 57,148, 80,126, 20,146,137,190,249, 0,211,
- 49, 88,123, 30, 77,170, 7, 96,113,113, 25, 77,237,251,208, 11,173,151,129,253,131, 31, 14, 71, 40,139,196,180,119,206, 67,173,
- 77, 85,227,208,167, 63,137,122,180,140, 23,191,242, 54,204,244, 10,124,231, 91,127, 2, 15,253,197,251,193,227, 33, 22, 30, 95,
- 64,233, 60, 4,210, 40,131,114,113,121, 25,101,225,107,235,225,107,113, 52, 70, 51, 28,161,110, 24,107,102, 75,212, 34, 24,214,
- 21,250,189, 30,202,254, 28,214,173,223,132,141, 27,215, 37, 7,174,168, 5, 50,230,163,100, 89, 86,210,118, 78,172,184, 8,206,
-217,150, 49, 14,122,193,126,115,102,109, 29,113, 45, 96,145,130,151,205, 54,150,208,182, 97,220,156,152,168,218,108,142,225,231,
- 45,209,107, 10,211, 49,219,124, 96,101, 77, 93,139,103, 23,106,236,102,123,138,210, 35,129, 0, 20, 25,208,134, 80, 67,121, 75,
-132, 36, 42,183, 97,225, 43,111,195, 52, 58, 7,231,232,218,250,183,204, 19,109, 54,164, 65,139, 11,252,134, 80,100, 7, 25, 22,
-187, 11,152, 42,164,209,141,221,182,134,181,217,254, 66,104,235, 4,145, 21,251, 33, 43, 6, 19,136,118,148,109,146,148,157,163,
- 76,203, 3, 77, 63,130,180, 90, 11, 13,207,154,173,142,190,121,223, 91, 2,247, 81, 21, 47, 18,187,173,148,110,144, 64,240, 8,
- 75,200,242, 89,219,237,218, 27, 83,146, 34,150, 24,160,184,176,192, 93,171,213, 47,239, 84, 75, 37, 15,161,169,202,148, 70,245,
-220,223,151,176,199,177, 76, 84,168,189, 52, 70, 59,176,112, 32,150,172,229, 80, 44,109,205,181,121, 62,148,171,249,217,162,135,
-169, 83, 35, 35,234,101,196,134, 84,115, 13,207, 91,196,160,102,134,120,156,244,252, 76,143,179,161, 1,146,105,107, 11, 74,137,
- 89,139,154, 18,193, 66,157, 61, 91, 15,146,161, 21,100,102, 24,136,146, 53, 93,152, 73, 17, 85,222, 36, 30, 15,142, 82,155,226,
- 10,179, 64,114,117,194,182,212, 8,197,253, 38,180,164,229, 28, 46,246, 18,176, 58,167,129, 50, 4, 82,203, 87, 12, 95, 34,176,
- 62,202,138, 60,181,250,207,195,241, 40, 4, 42, 45,213, 31,106,151, 70,200,200,249, 72, 82, 87, 13, 62, 47,150, 90, 76,112,158,
-136,185,146,169,203,133,236, 92,100,242, 89,138,233,188,176, 4, 97,129,160, 36,153,148, 12, 13,112, 44, 69, 41, 55, 83,157, 38,
- 67,237, 11,241,170,180, 64,247, 51, 77,111, 16, 73, 89,189, 32,171, 21,167,122, 71,104,155,115, 96, 79,173,243, 17,160,164, 26,
- 98, 10, 44,208,138,244, 44,249, 43, 72,110, 74, 98, 53, 43,196,115,248,169, 35, 16,110, 98,173,145,156,195,210,120,140, 53,179,
- 3,148, 5, 97, 92, 85,232, 21, 5,198,149,215,107, 31,143, 70, 0, 8,213,120,140, 65,191,143,199, 63,255, 57, 16, 57,252,254,
-111,252, 7, 20,101,137, 2,192,160,223,195,160,215,195,114,229,135,194, 48, 51,250,189, 18,227,170,130,192, 15,201, 88, 30,141,
-193, 44,232,247, 11, 20, 13,163,110,252, 2,170, 26, 6,185, 2,131,153,121,124,211,235,111,139, 11,171, 45, 35, 24,162, 56,219,
-218, 16, 54, 49, 75,174,200,154, 95,196,212,208, 92,128,152,225,137, 41, 43, 72, 4,231,252, 10, 36,201,207,232, 88,204, 70, 69,
- 98, 53, 64, 84, 60,196,236,108, 45,169,233,148, 64,166, 38,199,208,178,152,201,190,186,124,216,131,157, 37,146, 45,181,140, 95,
-150,152,190,137,234,175,155,145, 75,114,180, 20, 24,237,177,198,107,106,224, 17,242, 50,173,113,129,212, 20,197, 99,146, 99, 10,
-218,244, 98, 55,225, 76, 56, 36,180,248, 5,228, 67, 97, 60, 73,153, 91,108,141, 49, 25,105, 96,168,115,155,132,102,226,162,144,
-109, 69,216,149,141, 28,172, 65,199,132,166, 75, 47,135, 64,197,147,228, 82,139,132,216, 32,199,180, 44, 10, 56,107, 45,139, 74,
-104,237, 77, 56,110, 17, 28,159,171,180, 2, 80,114, 41,227, 32,194,132,180, 43,183,135, 69, 41,159,134,152, 38,231, 71, 32,175,
-191, 7, 36,207, 77,153,118,146,161, 21, 36,109,212, 91,251,136,141,234, 31, 73,166,188, 6, 35, 96, 67, 70,165, 46,163,173, 77,
-219, 6, 37, 21, 29,131,122,160,115, 46, 83,178,203, 75,244, 18, 73,124, 86, 53,209,119,171,229, 94,145, 88,178, 46,144,201,218,
- 0,101,199,111, 76,201, 39, 75,226,148, 63,227,138, 34, 31,118,212,234,165, 78, 8, 71, 98,200, 35,244,150, 27,241, 50, 22,142,
-104, 65,100,193, 7, 46,149,213, 26, 32, 76,246,129,154,128, 51, 28,203,133,210,161,149,192, 85, 82, 28, 55,254,252,203,178,244,
- 3,136, 96,157,108,232, 96, 56,131, 58, 93,144,112, 85, 14,140, 71,223, 85,251,193,206,155,136,100, 95,158, 16,217,154, 92,143,
- 46,238, 65, 78,239, 79, 36,128,154,225, 79,161, 28, 34,153,180,108,242,135,194,222, 19,122,212, 79,249, 11,241, 81,164,110, 37,
-129,160,228, 73, 80, 38,170, 9,217,250,164,232, 77, 34,141,180,153,166, 79, 73,160,246,180, 23,194,228, 12,146,120,242,148, 35,
-230,129, 68,192, 33, 50, 15,110,158,141, 92,127,254,232, 57,244, 44, 34,181, 68, 65, 55,206, 88, 95, 52,113,111,112,138,207, 30,
-121, 22, 77, 93,129,185, 65, 93, 87,177, 58, 58, 28,141,209, 43, 74,159,109, 43,140,211,159,219,128,122,120, 18,194,130,254,154,
-121, 12, 6, 3, 84, 53,227,244,233,177, 95,108,250,206,204, 13, 6, 94,133, 72, 7, 6, 56, 17,148,206, 97,153, 25,131,178, 64,
- 85,215,232,245,122, 32, 34, 44, 12,135,152,155, 25,160, 44, 29,158, 61,126, 18,189,178, 7,110,106,140,199,203, 56,122,236, 4,
- 54,110, 88,155,193, 50, 98,153,183,166,221, 34,146,202, 44, 89, 46, 35, 31,155,118,160, 86,219, 71,116,194, 38,138,148,168,214,
-229, 35,126,223,189, 65, 17, 74, 54,218, 36, 9,208, 13, 18,181, 20,218, 82, 67, 58,153,136,100,148, 45, 6,215,154,166,103, 8,
- 72,218,203, 45,146,234,108, 48, 16,189,100,221, 0, 70, 6,115, 5, 72, 57,108, 34,162,187,187,173,241, 6,134,106,104,235,116,
-182, 74,164,196, 54,162, 52,128, 67, 76,185, 41,240, 59, 38, 68, 64, 90,189,204,214, 1, 56,106,201,135, 76,244,242,183, 5,110,
- 66,214, 39, 83, 85,181, 72, 3, 71, 24,165,191, 48, 55,201,137,217,128, 12, 33, 79,166,100,183,150, 36, 20, 56, 20,118,128, 74,
- 6,189,155,126,157, 24,254,185,244,125,137,140,117, 74, 76,233,216,114,151, 79, 77,228,152, 56,132,172,131,125, 9,135, 90, 98,
- 86, 20,196, 58, 82, 91, 30,133,247,222, 1,211, 20,106,194, 51,137,142,157,114,150, 58,209, 20, 49,129, 86, 31,125,206, 6, 48,
-192,132,164,250,105, 30, 36, 72,156, 49, 35,237, 12,147,210,115, 16, 73, 19, 1, 67,199,130,216,119, 52, 59, 19, 73, 76,254, 8,
-143,231, 78, 58, 57,115, 3,197, 74, 62, 91,195,102,246, 44, 57, 1,206,180,203, 40, 33, 86,215,190,136,121,126,156,101,238,105,
- 38, 67,208,140,167, 72,124,211,234,166,135,240, 67,125, 89,167,206, 81,106, 73,137, 98, 67,206, 94,187, 51,106,116, 66,102, 45,
-104,171,174,214,156, 45,244,220, 52,170,231,174,164,191, 32, 98,147, 54, 58, 78,168,174,209,219,144,108,126,134,182,177,197,242,
- 67, 13,110,252,223, 29, 5, 37, 78, 45, 89, 56,179,159, 5, 52,219, 37, 14, 91,251,221,138,136, 89,224,156,176, 37, 16, 43,111,
- 4, 70,219, 93, 82,112, 33, 98, 20, 67,163,240, 77, 99,238,145,174, 67, 78,123, 79,222,210,102,225, 93,141, 48, 28, 43,163, 81,
-255,142, 80, 81, 18, 51, 54, 36,111,221,204,175,200,238,186, 50,169,234,100,135, 17,132,151,197,171,130,137, 78,178, 81,125,101,
-109, 43, 9,155, 3, 36,181,137, 8,113,146,187,132, 25,142, 0,196,217,134, 22,210,241,250,198,190, 55,177, 17, 79,142, 27,148,
- 5,150,133, 49, 28,213,152,233,123,182,100, 81,248,204,170, 30,157, 6, 64,152, 25,148,168, 26,198,226,169, 83,216,176,121, 11,
-150,122, 37, 70,117,227, 55, 65,231,176, 60, 26,250,145,129, 86, 70, 49, 8,182,232,248, 64,102,193,184,174, 48, 59, 24,128, 89,
- 48, 26,215, 94, 65,174, 44, 80, 53, 13, 92,221,224,216,241, 83, 88,191,118, 62,131,218,131, 90,156,173,205,196,105, 68, 1,253,
- 16,153,224, 49,144,149,124, 53, 68,198, 80,219,166,224, 72, 39,166,224,185, 56,174,208,143,227,244,120,117, 32,170,177,165,150,
-144,109,183, 10, 89,181,107,101,122,208, 64,193,101,237, 31, 78,235,230,182,236,147,106,136, 97, 35, 55,235,199,229,179, 53,210,
-212, 44, 59, 36, 51,109,177,206,170, 93, 81,202, 62, 41, 40, 28, 42, 27,159,117,163, 17,155,193,144, 83,197, 56,137, 47, 47, 25,
-102,115,123,120,144,149,156, 32,201,191, 99,184,172,153,236, 98,208,106,199,132,206, 87, 56, 14, 77,153,185, 68,177, 55, 61,145,
-209,210,251, 68, 0, 56, 12, 96, 33, 81, 7, 79, 83,138, 97,134,165,107, 72,115,156, 5, 69, 98,160, 68, 78,132, 40, 74,159,107,
- 7, 93, 56,152, 81,187, 72, 37,162, 0, 27,139, 76, 81, 28, 20,214,126,111,138,217,146,133,171,197, 74,239,134,250,109,144,193,
- 21,180,102,129,217,174, 56,191,151,196, 32, 71, 50,205,211, 92,156,222,118, 7,147,164, 65, 56, 18, 56, 0,169,163, 36, 79, 38,
-147, 60,110,132, 30,166, 12,134, 1,165, 65, 54, 54, 75,183, 76, 86, 50, 29, 39, 25,215,128,140,138, 12,166,115,147,162, 36,107,
- 36, 4,114, 36,169, 98, 74, 95,186, 69, 89,178,182,172, 40, 20,227,140,124,190,145,152,109,197, 12,158,100, 76, 81,176, 41, 56,
-244,240,125,192,197,206,143,148, 28,248, 18,158, 35, 81,117,194,124, 56, 82,152, 47,224,242, 9, 46, 58,223,192,197, 17,209,129,
- 1,206,204,137, 31,224, 40,203,120,227,207, 25,103, 25,127, 39, 53, 11,129, 21, 49,117,228,209, 97, 59,145, 50, 34, 5,250, 61,
-202,160, 50,138, 82,188, 78, 91,250,166, 54,137,155,118, 91,143,150,166,146,128, 51,129,169, 40, 57, 83,208, 18,190, 49,196,218,
-248, 62,137,207,220,197, 36,178,254,189,244, 33,149,175,123, 4, 45,221,116,199, 12,219,154, 99, 86,138, 32,203,135, 36,213, 23,
-245,249,166, 40,241,248, 11, 53, 69,125,219,118, 37,236,251, 22,153, 33, 96,213,199, 77,218,187, 86,211, 55,144, 23, 96,213,128,
- 56,158,106,186, 25,225, 85, 86, 82,132, 48, 32,236,153,135,162, 89, 61, 87, 99,101,165,123,247, 52,174,198,217, 60,106,168,180,
-160, 48,131,164, 1,161,209,127,171,112,237, 77, 47,195,145,167,158,192,141, 47,255, 90, 16,128,161, 66,242, 75,195,161, 50, 60,
- 69,219,226, 42,136, 0,101, 81,162, 84,145, 5,209, 72,179,170,107,157, 22,212,160, 87,248,104,112,121, 92,129,133, 81, 87, 85,
-166,104, 4,115,205,217,232,191,144, 49, 81, 94, 55,247,218,238,156, 36, 19, 57,100,233, 14, 73, 46, 55, 17, 81,200, 78,203,108,
- 73, 90,218,210, 10, 25,184,109,106, 68,106, 90,145, 60, 91, 63,169,195,133,214,142,192,218, 13, 89, 92, 40,163, 56,202,213,163,
- 34,251, 29,173,172, 79, 12,107, 85,210, 6,220, 18, 80,200,115, 24, 74,157,253,193,225, 18,181, 27,125, 16,219, 71, 60, 36, 10,
-149, 52, 77,187,173, 0,145,181, 43,206,212,182, 96,201, 70,148,205, 80, 16,177, 51,149,146,243,139, 14, 10,100,155,225,162, 79,
-200,199,103, 74,222, 16,171,151,203,146, 90, 94, 60, 25, 87, 51, 39,146,108,150, 52,155,169,125,118,220,170, 95, 86,166, 59,192,
- 20, 41, 73, 18,209,146,219, 36,166,192,117,224, 0,199,230,211,206,196, 8,122,132, 88, 35,182, 51,217,193, 62, 48,226, 33, 72,
- 34, 34, 17, 1, 9, 1, 0,251, 47, 49, 74, 92, 4, 85,253, 10,231, 10, 43,201,153,158, 54, 66, 93, 82,153,195,177,211,134,124,
-184,203,196, 96,237,121,134, 89, 31, 96,117, 4,196,233, 86, 50,130,182,169,231, 6, 24, 73,207,164, 51,155, 36,118, 41, 76,159,
- 12,239,155, 75,181,220, 4,231, 90, 4,131, 98,141, 84,136, 38,152, 16, 20, 59,143, 12, 72, 74,212,154, 1, 96, 42,237,148,214,
- 84,210,247,144,216, 27,221, 46, 13, 4,105, 94,114, 97, 94, 61,153,245, 69,137,231, 65,148,173, 59, 43,109, 28, 70,139, 6,212,
-213, 75, 35,187, 52,146,137, 2, 1,149, 50,132,201, 41,113, 55,188, 75,206,200, 69,219, 36, 37,188,115, 58, 10,188, 36, 0, 0,
- 32, 0, 73, 68, 65, 84,161,134,207, 38, 0, 12, 74,151, 81,111, 29,201,199, 72,208,111, 23, 63, 27,157,245,123,193,175, 4,132,
- 66, 68,208,112,147,246, 34,241,254,195, 78,117,131,109, 73,164,196, 92,247,113,163, 51,252, 62,149,108,142,242,208,136,153,191,
- 29, 10, 37, 58,180,220, 7, 84, 72, 63,239,204,190, 23,190, 96,255, 68, 82,126,148,212,233,226,242, 9,209, 65, 61, 44,181,170,
-113,246,247, 41, 35,234,210,122,200,123, 7,219,142,189,165,228, 99,213,128,226,203,202,118,244, 29, 71, 93,223,168,193,203, 86,
-218,207,244, 42,178,209,225,209,122, 19,115,146,158, 36,146, 76,252, 97,113,113,217, 7, 14,141,143,114,234,198,183,156, 21,206,
-161, 95, 22, 40,136, 80,150, 69,132,194,250,101,137,178,232,163,152,157,135, 48,112,232,211, 31,199,184,169,241,249, 79,126, 12,
-227,170,194,203, 95,181, 3,227,186,194,134,181,107,245, 77,115,168,234,198, 75,198, 58,160, 44, 11, 12,250, 61,144,136, 23,187,
-209, 40,221, 57,194,241,197, 37,204,246,122,145, 88,151, 74, 19,146, 79, 6,138, 44, 71,142,242,165,105,148, 31,162, 4,104, 24,
-132, 32, 46,159, 96, 21, 54, 1,103,156,142, 29,202, 50, 89, 99, 74, 10, 70, 54,243,112, 83, 69,104,166, 8,186, 8,229, 26, 1,
- 1, 89, 9, 66, 40,166,219, 33,114, 57, 38,184,149,147, 35, 97,197, 56,202,168,195, 45,148,195,210,102,186, 86,206,140,165,169,
-248, 88,104, 65, 19, 35, 85, 26, 53,229, 51,114,147,133,227, 97, 20,183,140,164,177, 21,179,176,172,233, 48,120,130, 37, 35,228,
-196, 8, 91, 82,237,212,190,131, 18,186, 61, 36, 10,132,167,241,161, 44, 57,201, 52,176,163,197, 8,183, 4,210,164,101,180, 90,
-129, 32,145, 28,249,137, 63, 67,177,191,154, 68, 38,180, 30, 98,214, 26, 39, 80,229,239,123,220,140, 89, 50, 93,124,137,242,169,
-152, 8, 30, 17,218,121, 76, 32, 33,176, 68, 73, 49,245, 85, 35,252, 98,158,141,207,168, 57,237, 5, 52, 89,167,181,161, 74, 10,
-170, 36, 15, 54, 40,149, 33,185, 13,141, 74, 18, 77, 2, 75,150,240, 39, 62, 71,198,203,205, 62, 61, 49,202,105,226, 93, 65,220,
-226, 91, 68,172, 9,173, 13, 67, 80, 36,100,196, 1,123,111,195,181,132,239,179,233,148, 32,228, 60,135, 48,242, 52,116,228,132,
-163,166,161, 73,146,205, 46, 0, 1,133, 43,226,160,162,232, 48,212,171, 57, 87, 68, 97, 21,114,102,158, 67, 0, 50,201,229,142,
-202, 12,244,137,229, 39,201,131,218,144, 64, 74,227, 29,116,200,128,227, 57, 74, 80,144, 53, 3, 89,180,131,136,117,104, 87,211,
- 48,184,209, 49,172, 77,157,178,114, 32,118, 68, 89, 2, 50,195,195,222, 81, 44, 42, 32, 18, 57,180,153,141,169,181, 51, 8, 97,
-184, 72, 97, 55,178,247,204,197,224, 76,217,245,225,190, 24, 71, 14,195,213,128,209, 52,136,226,109,118,202, 69, 91,116, 62,102,
-185,108,245,197, 57,204, 40, 48, 67, 63, 16,107,189,118,147, 72, 91, 40,219,109,120, 5, 39,159, 34,130,232,192, 17,156,120,138,
-174,194, 20,157,160,205,139,200,168,108, 57,119, 49, 14, 61,147, 73, 53, 21, 54, 2, 78, 28, 59,225, 33, 40,120,249, 63, 2,161,
-225, 6,117, 93,107, 61,165,193,104, 52, 6,115,131,126, 89, 2, 68,168,235, 10, 11, 39,142,162,225, 6, 27,182,222,128,134, 5,
- 47,189,237, 27, 12,190, 35, 24,142,198, 24, 85, 99,140,171, 58,182, 69, 48,252,139, 52,211,239,163, 17, 86, 38,188,175,217,215,
-117,131,133,209, 40,190,126,161,143,211,207,219,181, 44,247,124, 59, 34,219,218,100, 7,107, 24,173,104,103,128,203,164,146, 45,
-134, 69, 45, 6,178,150, 73, 73, 13, 66, 38,114,146,213, 67,219,210, 29,212,230, 42,133, 12,151,242,108, 27,121,139, 86,166, 23,
-109,163, 11,203, 4, 55,127,177,226, 58, 73, 93, 56,135, 80,217,246,173, 74,171,218, 51, 85, 75, 88,226,191, 37, 93,123,125,233,
-172, 88,106, 32,188,105, 28, 76, 98, 39,138, 33, 23,167,205, 88,226, 73,166,151, 34,113,200, 8,250, 68,213, 50, 78, 65, 26,101,
-218, 95, 25, 76, 30,223,190, 22,196, 40, 33, 40,161,164, 4, 25, 70,242,146,221,180, 76,123, 90, 32, 40,146, 61, 79,194,196,108,
-121,201,158,181,237, 85, 70,134,186, 80,198,189,227, 68,226,212,233, 86, 86,212, 40,238, 27, 20,200,119, 81,245,121, 42, 7, 46,
-194,254,161,198, 14,110, 73,133, 74, 84, 49, 51,110,193,168,119,229,124,177, 40, 50,100,180, 54,108, 41, 50,246, 12, 35,100,237,
- 12, 59, 37, 38,244, 9,199,251, 41,161,149, 44,105, 21,248,252, 52,100,165,105,221, 83, 32,113,197, 72, 59,188,236,110,146, 44,
-103, 27,180,173,139,151,244,222,230, 51, 1,140, 78,122, 8,244, 97,203, 89,146,222, 99,147,210, 57,231,224,108, 79,186,146,195,
-130,222,187,207, 56, 11,159, 25,234,181,123,135,238, 34,170, 22, 58, 57,156, 74,202, 22,133,255,221, 66, 29,149, 11, 35, 91,173,
- 35,183, 42,117, 10,213,219, 57, 66,174,165,230,232,249,110,118,176, 10, 18,236, 30,158,101,244, 13, 65, 17,206, 59,239,166,110,
-208, 52,141,255, 59,135,191,115,212,211,136,109,108,234, 44, 89, 19, 75, 7,167, 1,143, 18, 53, 77,247,149,237,112,119, 33, 8,
- 50,219, 64,108,136,117, 9,225,240,221, 49,138,166, 4, 84, 80,133, 5, 82,128, 99,191,144, 79,162, 20, 35, 8,133, 92, 1,218,
-143, 94,109, 49,207,132,109, 61, 90,157, 2, 27,117,247, 72, 40,230, 76, 73, 40,239,191, 73,176, 23,104, 50,235,130, 89,148,147,
- 28, 21,214,246, 12, 59,136, 65,219, 54, 72, 7, 83,232, 57, 18,115, 75,228,134,236,123, 97, 90, 30, 82,231,163,136, 96,225,244,
-162,214,147,201,179,212, 65, 24,143,125,125,189,212,197,219, 43,129,186,241,196, 57,144,111,145,224, 10,168,171, 17,158,125,250,
- 49, 12,102,102,240,248,231, 30, 1, 1,248,252, 35,159, 0, 1,232,247,123,168, 71, 77, 28, 70, 32,194, 56,185,176, 16, 33, 38,
- 17,160,170,106,172,157,155,135, 84,181, 31,104,239, 28,150,171, 10, 27,230,215,224,116,229,137, 30,253,126, 79, 51, 28,202,231,
-239,138,117,193,212, 98,213, 6,232,135, 12,196, 76,217, 52,159,216,113,102,183,106,163, 75, 60, 65,143, 54, 3, 53,200,144,220,
-178,246,193, 54,241,200,202,123,107,187, 80,222,114,225,107,242,118,236, 99,204,146, 69,114,162,178, 76,225,115,153, 56,173, 61,
-168,102,210, 25,168, 82,129,149, 14, 13, 45,110, 25,231, 35,109,226,169,205, 44,245,213,195,204, 18,143,165, 49,237,237,204, 58,
- 92,166,192, 24,241, 92, 41,193,241,161, 15, 56, 69,252,172,253,209,173,241,243, 18,102, 48,152,153,105,140, 56, 0, 36,100, 22,
- 4, 2,113, 11,128, 96, 1, 59, 10, 50,243,217, 72,212, 28,166, 53,109,164,166,181, 85,178,225,174,148,156, 94, 62,201, 41,118,
- 8,180,159, 81, 18,182, 73, 90,123,249, 12,119, 51, 44, 40, 8,231, 68,213, 62, 76,165,234, 83, 91, 47, 64,245,216,147, 2, 27,
-199,231,149,230,215, 75,116,238,217,244, 0,178,104, 78, 54,217, 52,107,129,202, 90, 0, 67, 16, 73,166,149, 80, 34, 56,103, 54,
- 90,151,171,203,181,230,149, 59,180,180,173,197,138, 31, 18,236,188, 0, 1,161, 61, 79, 35,146, 11, 57,239, 48,177,179,110, 61,
-175, 34,172, 11, 21, 91, 49,163, 93,237,177,157,115,153,106, 92,204,150, 93, 75,103, 32, 4, 51, 68,190,215, 60, 78,201, 19, 52,
- 65, 52, 74,133,167,156,107, 41, 43, 82, 62,226,216,103,252,105, 52,107,210,180,160,212, 70, 28, 7, 5, 39,129, 32,230, 38, 14,
-191,137, 18,183,133, 75,101, 73, 50,194, 92,234,152, 27, 69,101, 61,161,206,255, 25,153,229, 68,102,142,186, 29,147,202,113, 63,
- 72,202,143,169,123, 37,182,232,177,164,246, 27, 55,169, 55, 24,144, 27, 50, 12, 85,201, 36,131, 77,144, 21,249, 59,129, 59,192,
- 42, 69,226, 64,196,121, 48, 38, 0, 49,197, 86,207,128,162,147, 16,202,188,161, 82, 90,157, 48,126, 55,242, 7,102,211,159,138,
- 9, 40, 46,141,158,155,218, 20, 58,165, 49, 81,114,134,240,180, 22, 56,246, 83,222, 66,157,201,129,253, 66,182,222,195, 33,155,
-203,237, 29,131, 74,144,186,164,162, 22,115, 78, 2, 78,159, 60,141,113,237,235,215, 2, 65,175, 40,177,204, 67, 52, 77,131,254,
- 96,128,186,174, 32,240, 80,249, 76,191,143,209,104,140,185,217, 1, 54,109,187, 9, 71,190,244, 8,120, 48,131,151,221,246, 26,
- 60,253,248, 33,156, 60,113, 12,142, 8,195,209,216,143, 38,212, 23,164,105, 26, 12,202, 18,245,104,236,181,221,105,140,126,191,
-135,162, 40, 48, 28,143, 49,110, 24, 85,195, 88, 55, 59,139, 90,251,218,157,115, 40,203, 30, 54,110, 92, 23,235,137,177,255,156,
-217,108,162, 86, 5, 44,180, 85,153, 94,243,168,180,102,180,187, 44,164, 68,105, 44,166,100, 67, 74,108,168,224,235,255,206, 76,
-168, 10, 42, 82, 97,174,125,222, 56, 39,173,201,126,121,223, 53,199,217,229,158,228, 68, 26,192,145,132,201,112, 45, 18,211, 20,
-190,101,158,151, 80,182,137,197,122,174, 81, 81,131, 76,226, 16,150, 71,156,103,255,105, 2, 93,128,140,109,227,115,248, 94,224,
- 4,196,106,136,157, 75,206, 98,117, 39,178, 94,110,225,212,182, 66,198, 25, 11,155,156,188,213, 58,101, 59,157,216, 16, 62, 67,
-141,207, 41,113,148,156,146, 73,131,206,187,248, 25,223, 78, 18, 19,158, 29, 69,114,171,125, 95,218,155,181,125, 7, 73,157,184,
-152,110, 5,145,156, 0, 75, 10,115,199,158,121,211,233, 64, 25,137,141, 99,166,159,235,148,103, 19,118,114, 69, 61, 76, 8, 69,
-182, 58, 28, 36, 99,185,219,254,125,138,165,193,228, 40,136,172, 64,147,245,226,148,149, 49,210, 90,111,165,248,148,143, 41,182,
-208,126,186, 75,138,244,132,153,245,122,151,153, 57,102,169, 57,243,145,211, 92,108, 10,124, 0,100,186,237, 54,224,152, 54, 5,
-176,173, 25, 21,118,125, 7,211,150,200,137,241, 30,186, 76,194,181,123,213, 56,202, 97, 95,171,141, 96,113, 35, 93,119,100,160,
-255, 70, 91,192,188, 2, 96,174,139, 62, 57,113,209, 62, 11, 23,201,150, 68,200, 4,154,172,200, 85, 88, 19, 33,147, 46, 92, 17,
-209, 95,231, 92,154,188, 9, 74, 67,138,204, 40,213,144,145, 55, 77, 29,255, 30,123,244,141, 80, 87,252,121,110,180,231, 62,105,
- 75,216, 32, 83,135, 56, 71,228, 55,170, 37,162, 77, 0,213,142,132, 48, 98, 23,173,115, 13,156, 37, 50, 8,160,238,183,206,121,
-242, 46, 69, 1, 53,153,168,171, 71,158,131,225, 87,121,137,140,118,125,187, 85, 15, 20, 29, 73, 10,133,183,152,181,206,110,136,
- 45, 97, 81,115,224,146,172,248,229,235, 19,225,207,188,248,152, 71,201,109,146, 92, 32,207,217,241,120, 98, 4, 99,236, 53,112,
- 24, 61,104, 4,228, 34, 99,217, 17, 10, 48,164,105,188, 4,108,221,168,100,107,129, 94, 89,128,149, 17, 63,211,239,193,145,195,
-250,205, 91, 81,169,254,239,242,242, 49,204,111,220,140,211, 39,142,161, 26, 46,225,213,111,216,229,213,102,185,129, 43, 28,230,
-103,103,209, 48,163, 87,122, 24,107, 92,215, 40,138, 2,133,214,123, 78, 46, 46, 97,118,208,143, 47,224,160, 87, 2,240, 67, 7,
- 22, 70, 99,175, 66, 87,246, 48, 63, 55,171,114,170,109, 26,109,170,135,199,214, 51,251,242,155,121,213, 46,209,182,180,166,149,
- 48, 45, 50,138,167,121,123,143,100,217, 64, 96,165,102, 37, 12,161,137,193, 47,177,254,101, 75, 30, 90,190, 97, 93, 63,196,169,
-133, 26, 74, 64, 10,179,128,197, 12,150,144,150, 86, 84,156,108, 36,156, 70, 92,154,246,162,118,247,228,132,212,138,149,234, 52,
- 67, 12, 68, 18,135, 36, 70,246,150, 36,152, 21, 74, 41,211,207, 15,181, 62,150,198, 16,120,130, 99,160, 68,214,202, 6,236,104,
- 13, 60,124, 46, 11,218,255, 99,109,243,226, 64, 52, 3,155,169, 76,173,254, 85, 54,255, 29,122,241, 37, 5, 54, 96,210,251,173,
-193,179,133, 36, 3, 4, 30,202, 14,148,106,255,210,170,101,135, 76,172,197,106,136,108, 98,182,147, 22, 37,181, 77,198, 0,165,
-213, 18, 55, 65,101,148,156, 4,152, 56, 19, 50,225,208,167,195,242,100,134,104, 27,213, 48,131,246, 81, 70,152, 82,189,110,201,
-133,142,243,121,164, 48,219,116,104,219,203, 87, 88, 22,236,138,145,155, 13, 29, 30, 46,175,215, 75,187,141, 78,196, 16, 6,242,
- 0,208,101, 89, 94,154, 56,103, 62, 61,149, 49, 12,172, 67,100,106,187,217,180, 64, 51, 77,143, 18, 73, 47,100,238,147, 95,100,
-198,172,166, 26,175,135,213,139, 52, 34,150,124, 59,168,139,208,121,129,162, 40,227,248,223,144,177, 7,146, 96,132,241,245, 68,
- 67,223,246,196,231, 26, 52,193,249, 2, 70,230,208, 3,195, 62,252,142, 85,215,203,196, 36, 3, 57,142, 5, 77, 93,163,174, 27,
- 84, 85,237,137,208,152,206, 35, 98,110, 98,176,224,200,151, 79,146, 14,135, 24,181,196, 0,173,135,243,180,237, 78, 65,207, 90,
- 75,145, 86,239,194, 64,240,158,187,160,196,193,120,222, 78,255,219,150, 63,146,178, 95,212,197, 55,130, 57,193, 23,184,194,151,
- 67, 74,180,198,132,144,233,201,204, 96, 40,153, 16,157, 50,208, 12,173,208, 44,211,122, 43,173,112,185,157, 18, 51,201, 87,206,
-179,179,168, 84,197, 16,118, 81, 40,193,139, 83, 72, 28, 66,224, 34,220, 75, 81, 82,214,129,252,239, 56, 54, 12, 73, 15,195, 4,
-120,123, 92,215, 62,219,169,189, 64, 76,207, 17,234,154, 1, 97, 28,121,230, 73,112, 53,194,104,236,176,112,228, 41, 12, 6, 51,
- 40,202, 30,190,252,249,207,224,137,199, 31,195,168,170,176,118,205, 90, 84,227,177,207,206,123, 37,198, 85,141, 97, 85, 65, 64,
-168,155, 38,146,237,106,102, 44, 44, 15, 65, 68,232,245, 6,168,234, 6, 84, 20,126,254,122,120,193,138, 82,231,117, 91, 49,127,
- 51, 92, 7,118,214,181, 68,169,195, 12,246, 19, 35,131, 73,169, 79, 55,204,204,134,115,153, 34,244,228, 20, 44,155, 53,234, 94,
-227,236,224, 22,179,155, 68,180,148,147,243, 34,211,111,203,105, 10,154,103, 44,167,169,123, 18,250, 67,109,123,173, 33,107,181,
- 59,118,227, 16, 26,178, 67, 56, 90,157,226,148, 21, 9,162,212,162, 19,203,206, 78, 45,163, 97,164,102,232, 63,149,168,222, 37,
- 26,116, 80,236, 7,141,130, 22,198, 65,184,150,246, 66, 28,251, 72,156,177,201,145, 57,121,239,192, 11,177,100,191, 21,212, 81,
-168,213,156,110, 80,155, 80,243, 13,176, 60, 59, 91,190,240,170,140, 76,126,233,199,214,161, 48,140,195,190,139, 54, 72, 20,153,
-144,205, 76, 34,142,100,230,232,217, 88, 79,166,242, 44,237, 32, 22,137,189,221, 70,183,222,204,125,151,172,165, 73, 50,233,145,
- 51,193,240,217, 24, 85, 73,112,106,212,172,104,135, 1,217,230,150, 15,222,153,210, 56, 17,215, 77,148, 97,166,214, 84,251, 48,
- 69, 80, 44,145, 9, 57,220,218,216, 50,132, 76,209,185,207,203,148, 97, 70,121,128,217, 61, 69,194, 64,237,220,234, 56,105,151,
- 17,172, 82,154,178, 15, 98,150, 78, 65, 61, 15, 58,142, 52,192,238, 6, 50, 55, 53,121, 24, 30, 68, 12,214,194,126,194, 9,201,
-115, 10,201,103, 72, 79,166, 84,103,136,166,217,176, 22, 50,138,138,166,110, 76, 73,167,159, 57,101,229,126, 86,130, 68,134,184,
-216,121,246, 45,191, 21,148, 61,155,198, 19,228,170,186,246, 28,170, 68,244,241,218, 17, 66, 25, 79, 34, 76,172, 75, 36,107,219,
-136, 18,208, 38,198, 36, 5,210, 8, 71,233,154,119,128,202, 70,103, 58,133,177,220,148, 20, 32,205,200,229,176,133,168,108,113,
- 80,252, 76, 3,113,104, 82,217,207,204, 97,119, 44,148,181,123, 69,198, 97, 22, 62, 79, 97,173,179,105, 77,139, 10, 44, 33,171,
- 15,132, 54,253, 59,244,239, 33,123, 54, 53, 58, 33, 78, 45, 64,132,148,157,104, 54, 79,166,221,133, 77,165, 52,157, 15,199,122,
- 37, 43, 16, 71,129,212,162,217,138, 85, 4,139, 49,184,246,126, 18,128, 82, 91,202,250,101,225,219,203,156, 67,195, 13,230,103,
- 6,216,114,205, 45, 24,204,204, 97,203,213,215, 2,101, 31,107, 54,109, 65,175,244, 83,220,142, 61,123, 24, 47,191,237, 53, 88,
- 92, 90,192,220,204, 0, 77,211, 96, 84,213,202,180,244,109,109,142,128,217,193,192,215,128, 32,168, 89,191,154, 26, 53, 51,150,
- 70,227,232, 84, 3, 89,197, 75, 19,230,186,190,100,178, 53,203,254, 15, 25, 88,128,122,196,180,240,196, 44, 34,132,240,118, 19,
-110,181, 33, 89,214, 54, 66, 95,188,164,146, 70, 32,240, 49,114,221,255, 64,223, 98,180,178, 89,210,101, 31,251,131, 36, 66,164,
- 60, 49, 34,217, 8,187,132, 54, 42, 34, 67,185,204, 59, 47,114,246,148,196,129, 9,145, 68, 23,200,147,100, 21, 28, 13,177, 44,
- 38, 74,170,142, 38,134, 32,195,166,156, 64, 28, 29,122, 26,128, 3, 21,188,104, 98, 61, 92,226,255, 35,102,171,196,100,250,105,
- 83,125, 79, 32, 42, 78,228,215,107, 28,243, 40,156,190, 56,253,221, 18, 75, 83,135, 8,167, 64, 79,251,158, 67, 86,151, 58, 40,
-212,137,178,168, 42,168,126,166, 81,174, 11,186,213,130, 28, 41,105,223,239,201,247, 62,139,194,210,103,154, 54, 73, 43, 92, 69,
- 81, 48, 37, 61,191, 88,213, 21, 35, 14,131, 73, 7, 43, 88, 89, 60,110,162,102,151, 77,198, 59, 67,154, 17, 54,114, 90, 33, 98,
-160,182,124, 31,197,169,122,202, 11,211, 44,204,244,173, 83,171,141,156,114, 53, 72,106,117, 81, 96, 66, 74,139, 90,221, 30,198,
-147,184, 86,187,154,107, 49,227,205, 88, 86,202,113,174, 40, 72, 67, 38,211, 11,191,227, 29, 58, 50, 88,215, 33,104, 13,248, 36,
- 32, 62,203, 56,121,209,153,181, 71,113, 47, 45,202, 66,229, 97, 93,100,118,123, 2,155,194,234, 14,169, 62, 29, 51,207,148,201,
-187,200,138,183,146,185,164,173,202,105,176, 76, 96,170, 23, 81, 28, 42,181,232,218, 54, 82,219, 6,157, 72,113, 77, 84,147,108,
- 19,130,195, 20,202,162, 40,163,148,173,247, 17, 46,106,110, 8,145,233,232,165,201, 24,144,146, 34,166, 21,220,203,180,236,145,
- 51,252, 67, 64,235, 5,156, 92, 22,236, 64,149, 78,227, 61, 34,151,142, 31,136,225,132, 72, 96, 12, 51,217, 75,112,254, 66,112,
-107, 60,173,172,192, 90,138,145, 2,135,112, 86, 38,226,104, 17, 51,255, 91,108, 41, 44,133,161, 1,182,117,150,221,141, 41,155,
- 61,165,193, 47,241,150,138, 85, 78, 50, 58,187, 70,137,201,104,142,102,173, 98,126,212,167,160, 87,150,104,154, 26,243,131, 1,
- 70,227, 49,170,122,236,135,174,136,160,156,219,128,227, 79,126, 26, 69,217,195,194,210, 50, 94,243,134, 93,216,126,243, 45,248,
-224,159,189, 15, 36,192, 51, 95, 58,132,195, 95,250, 2,250,189, 62,150,199,190,166, 94,150, 61,204, 14,250,168,235, 26,131, 94,
-137,134, 25,101, 81,196, 81,123,131,210,143,101, 45,156,195,145,133, 69,108,219,176, 14, 39,135, 21,138, 94, 15, 69, 81, 98,118,
-118,198,103, 98, 46,205, 44, 14,197, 62,150,233,140,104, 10,178,139,236, 23, 0,135,137,116,176,253,216,200,148,203,108,224, 22,
- 56, 11,140, 92,217, 40,219,148,178,150,173,148,169, 5,137, 9, 10, 45,121, 81,166, 53,137,150,136,233,105, 98, 74,117,223, 24,
- 93,147,180, 16,137,244,220,216,170,139,232,132, 59,255,236, 56,109,182,176,227, 34,131, 10, 21, 71,201, 76, 49,122,216,164,208,
-180, 85,147,226,214,231,133,209,138,108,200,149,137, 59,146, 90,184, 66, 95,139,100,163, 63, 13, 98,160,199,229, 88, 71, 87,149,
-190,224,148, 57,241, 69,242,250, 51,226,125,137, 44, 0,201, 21,195, 72,167, 6,186,194,194,143,108,228,118,124, 20,204, 58, 84,
- 66,140, 70,180,100,105,182, 81,217, 50,138,102, 98,186,223,192, 6,125,137, 66, 40, 73,150,215,151, 83,147, 42,144,114,134, 18,
- 75,191,157,221,218, 50, 9,193,140,172,157, 14, 86,156, 13, 0,204, 37,116, 8,171,177,188,145,195,134, 14,156,195, 35, 97,202,
- 24,153,214, 59, 3,106, 83, 28,147,166, 3,131, 56,189,127,209, 39,187,150,242,102,139,219,145,184, 32,110,146,247,145,205, 23,
-183,172, 58,202,185,158, 73,141, 52, 58, 5, 59, 54,171,112, 69,108, 75, 99, 70, 44, 9, 6,168,215,182,208,132,121, 9,206,160,
-118,182, 68,193,204, 41, 73,114, 80, 72,156, 50,193, 28,178,228,195, 88,254, 12,106,129,206,148,170,195,250,119, 25, 71,130,136,
- 98, 80,235, 91,227,200, 59,101, 29,155, 29, 71,126,235,180,199,208, 53, 97,133,148, 66,128,236,235,233, 77, 36,163, 89, 50, 91,
- 82,190,243, 14,157,168,137,158,200, 19,209,196, 50,132,162, 44,117,202, 76, 12, 91, 39,102, 17, 46,130, 97,105,248,139,100,157,
- 63,225,222,164, 89, 42,100,106,234,118, 48,140,164,128,146,243, 82, 41,105, 96, 6,145,172, 75,170, 4,113, 6,173, 39, 69, 31,
- 51,164, 37,235,103,150,140,167, 22, 82,175, 0,133,100, 68, 76, 59,156,200,234,104, 68, 70, 11,155,177,144,211,129,252,124,240,
-165, 73,241,162, 94,117, 11, 70,206, 98, 88,154, 96, 67,199,222,123, 34,148, 17, 46, 42,252, 20, 33,125,249, 26,205,134,150, 22,
-142,227,170,235,191, 22, 60, 94,192,177, 35, 95,196,167, 63,246, 55,248,228,223,124, 16,235, 55, 95, 5, 1,225,196,201,147,216,
-214,239,163, 87, 56, 85,193, 35,148,206,197,186, 76,165,208, 59, 0, 63,190,213, 17,102,250,125,212, 44, 88, 30, 87, 40, 11,135,
-186, 97, 12,122, 5, 26, 16,138,178, 84,121, 88, 49,154,202, 18, 85,138,194,128,157, 48, 53,203,110,154, 17, 2,247, 51,106,125,
-238,172,218,249, 17,226,146,164,241,237, 95, 26,191, 33,179,102,186, 97,238, 73,156, 2, 7, 50,125,242,134,237,108,170,171, 78,
- 18,250, 18,235,178,156, 72, 81, 65,226, 19, 58, 14,212, 73,194, 84,108,251, 90,116,128, 97, 58, 17,115,166,227, 13, 51,200,193,
- 51,211, 3,228,201, 89,192,152, 90,188,210, 12,108, 47, 96, 37, 73, 97, 43, 34, 55, 64, 24, 9, 89, 40,155,214,127,110,153,129,
-153, 81,225, 76,161, 6,110, 56,173, 85,105,203,184, 38, 90,158, 93,155, 2, 21,120, 42, 10,253,188, 34, 5, 9,246,250, 76,201,
-139, 84, 97, 42,228,211, 4, 23,181,180, 35,177, 49,100, 53,113,104, 31,231,141,202,177,158,140, 9,101,177, 72, 40,139,178, 90,
-220,226, 34, 80,171,213, 43,144,138, 16, 21,247, 40, 4, 63, 42,247, 25,131,125,215, 30, 18, 99, 2, 35, 59,121,197,220,171,152,
-113,146, 13,206, 87,204,203,243,242, 92,212,126,225,216, 98,149,139, 17, 37,169,209,192,160, 13, 90,242,137, 8, 53,173, 16, 73,
- 9,134,119, 48,210,190,237, 18,164,164, 64,144,108,201, 48,239, 81,166, 76, 7, 46, 47, 97, 50,114, 7,146, 53,168,144,157,146,
-150, 35,169,100,122,150,153,217, 19,192,180, 86, 27, 90,191, 66,171, 24, 55, 18,117, 50, 98,155, 20, 81, 38,193,148,207,141, 87,
-209, 42,167, 8, 90,211,100,196,217,162,176, 61,247, 57, 1,218, 73, 88,181,177,196, 28,157, 65, 40,231, 37,161, 75,255, 57,129,
-136,234,153,232,161,110,158, 72,114, 94,110, 22,170, 54,154,200,133, 68,173,210, 93,107, 46, 58,194, 88,101,211,198,203,202,107,
-113, 74, 28, 12,170,116, 65,143,159, 73, 91, 65, 57,181,157,197,202, 39,153,207,182,129, 89,144,221, 38,192, 69,178,182, 41, 67,
-181,231, 8,180, 53,227, 69,172,248,167, 41,253,132, 32, 68, 52,177, 9,247,197,206,201, 86,241, 25,145, 0,185,251, 47,110,101,
-135,137,248, 99,107,104,169,190,153,106,103,134,244,134, 51, 4,205, 52, 33,142,213,170,213,139,165,192,228,108, 80, 3,101,194,
-181,136,176,164,250,222, 36,166, 47,218,136,230,135,105, 70,202,222, 44,200,161, 17,193,112, 60,246,255,173, 26,224,145,128, 87,
-244, 81, 22, 5, 6,179,115, 16, 42,192, 53, 99,241,228,113, 44, 46, 46,224,153, 47, 61,134,222, 96, 6,223,243,223,253, 4,234,
-162,244,181,113,125, 57, 6,253, 1,234,170, 78,217,164, 58,152,165,209, 24,131, 94, 15,195,170,194,184,174,209,176, 96,195,220,
- 44, 78, 15,199,168,106, 61,167,162,196, 11,182,108,138,189,150,137,188, 20, 72,129,156,228, 14, 37, 13, 95,136,176, 40,155,249,
-246, 22,170, 14,144, 61,146,140,161, 71, 99, 57, 85,134, 2,195,219, 44,120, 59, 37,203,142, 68,146, 76, 95, 32, 65,157,108,234,
- 90,220, 22, 54,209, 46, 4, 22,195, 3, 8,115, 5,140,144, 17, 49,167, 32, 66,213, 5, 41,178,153, 13,124, 27,127,143, 50,105,
-214, 56, 6, 83,130,214, 66, 18, 72,162, 92, 26, 33,169, 25, 6,229, 53,105,201,111,138,129,230,194,116, 36,150, 76,125, 74, 40,
- 7,224,115, 18, 25,199,243,138,194, 74,113, 77,152,222,232, 86,105, 43,150,106, 57,215,235, 79,207,133, 18, 82,144,137,210, 24,
-116, 44,148,182,192, 38,112,208, 94,238,160,206,198,162,153, 10,183, 4, 95,194, 62,192,185, 32, 13,172,120, 14,101, 68,218,168,
- 55, 96,166,136,137,161,109,103, 34,128,182, 93, 78,194,212,202, 40, 87, 25,167,168,145, 33,246, 77,213, 70, 18,163,192,199, 45,
-238,129,180,178, 98, 91,231,117, 98,250,122,157,105,119,181, 12,193,212,226, 16, 55, 99, 73, 45,124, 81,232, 73,200,204, 6, 32,
- 51, 73,139,205,242, 79, 67,149,162,138, 95, 40,115,218,182,219, 22,105, 88, 72, 75, 58, 38, 88,229,156, 85,232, 51, 92,211, 50,
- 23, 25,236, 70,183, 59,206,107, 15, 12,106,231, 38, 71,146, 78,169,123, 72, 8,204,213, 43,251,178, 81,202,240,139,162, 0,156,
- 33,109,121, 41,184,188,175,218, 64,203, 20, 9,114,234,244,200, 32,136, 81,243, 31,255, 63, 97,111,246, 99, 91,114,157,249,125,
- 43, 98, 15,231,100,230, 29,107, 30, 72,170, 36,138, 20,233,150,186, 5,171,101,116, 75,110,184,219, 48, 32, 24, 48, 26,232,191,
-200,127,134, 31,253,228,126,148, 31,236,110, 64,178,101,169, 53,176, 73,113,144, 72,113, 38,139, 44,214,112,235,142,121, 51,243,
- 12,123,138,181,252, 16, 17, 43, 86,236,147, 37, 65, 40,136, 53,220,123, 51, 79,238, 29,177,134,239,251,125,102,135, 78,122,113,
-113, 96, 13,132, 17,161, 74,114,185,114, 89,150,181, 29, 71, 46,124,254, 51,172, 80,147,211,174, 29, 82, 83, 37,157, 21,168, 57,
- 87,196,150, 84, 32,102,214, 17,161,250, 3,171, 76, 87, 47, 58,106,105,163,229,189,171,104,196,184, 42,210, 42, 33,186,190, 44,
-182,195,178, 17,196,184, 21,204,231,174, 68, 63, 65, 99,219,107,170,140,198,183,248,128,233,246,193, 23, 85,152, 68,185, 69,151,
- 34, 56, 17,114,219,148, 49,183,166,136,153,172,100,103, 3,102,114,221, 71,144, 21,196,135, 20,209,103,224, 29,154, 10,100, 98,
-158,211,142, 39,121,140,208,121, 31, 83,216,230, 9,125,211, 36, 63,227,130,174, 59, 3,201,140,143,127,254,247,120,253,221, 47,
-225,112,220,195,123,135, 87,223,122, 15, 47, 30,255, 10,159,126,248, 11, 44,204,184,115,247, 62,158, 63,121,140,251,237, 5, 60,
- 17, 30,191,120,142,182,105,177,132, 8,174, 97, 22,220,233, 59, 28,199, 17,222,197,172,246,139,237, 22, 83, 8,152,242, 94, 86,
- 0,231, 61,218,174,199,221,187, 23, 6, 76,146, 58, 78, 54,151,175,209,169,101,101,122,254,124, 57,237, 47,157,172,108,127,171,
- 90,171,140,173,236,165, 75, 38,133,207, 68,185,178, 49, 37,173,230,195,134, 60, 91,160, 64,154, 5, 92, 74,169,220, 25, 75, 5,
-196,169, 1, 26,186, 51,206,185,232,160,245,183,160,251,246,245,228, 37,219,174,234, 69,153, 77,181,147, 52,181,168, 59,159, 34,
-134, 49, 83, 17, 50, 83, 38, 49, 8,205, 84,113, 7,230, 58, 83,218,196, 6, 10,173,169,108,150,212, 40,149,199, 53,115, 8,180,
-131,171,200, 45, 37,123,161,138, 19,101,169,246,166, 89,104, 86,167,195, 25, 10,133,165,218, 25, 52, 37, 86,161, 63, 90,192,105,
-128,135, 41,232,237,207, 76,210,152, 57,119,196, 41, 31, 32,238, 32,139,166, 34, 31, 54,206, 48,244,117, 10,153,125,229,142,234,
- 52, 59,219,153,231,115,135,179,168,179, 30, 67,219,159,177, 24,209,100, 1, 14,165,238,215,173,206,173, 85, 71,170, 32,167,252,
- 53,221,166,173,163,122,102,239,108,174,196,103, 44, 5, 24,118,172, 26,211,181,170,206, 26,107, 95, 26, 25,177,137, 61,108,165,
-118,221,173,243, 4,168, 76, 82, 99, 51, 66,104, 26, 3,131,225,114,201, 23, 60,172, 79,151,151, 91, 5, 53, 89,231, 71, 45,140,
-132, 32, 9,139,161, 14, 15,215,184, 82, 20,185,245,231, 70, 39, 97, 55, 46,189,116, 46, 7, 61,229,103,137,234,252, 84, 73,106,
-117,239, 75,142, 71, 70,193,146,163, 82, 44,218, 89,141,169,200, 44,145, 52,164, 73,105, 14,146,209, 24, 93,182, 54,193, 66, 32,
- 84,251, 28,137,138,229,216,221,146,210,178,226, 82,200,106, 38, 44,102,172,238,178,214, 41, 63, 63, 76, 96,199,102,109, 35,230,
-218,151,234,108,205,235, 15,230, 56, 33, 65,154, 84,136,132,146, 87, 79, 82,123, 95, 73,125,234,171,167,120, 69, 40, 3,185,219,
-103, 95,217, 26,161,163,127,151, 20,234, 84,118, 15,246, 27, 94, 21, 5,214, 26,123,178,161,176, 47, 26, 81,149,140,164,158, 80,
- 19,119,168, 47, 92, 22,193, 81,177,127, 57,114, 70, 53, 13,181, 85,108,218, 6, 33, 32, 2,104, 28,225, 48, 68,175,250,118,123,
-129, 7,239,126, 9,215,143,126, 10,225, 3,120, 62,130,136,208,181, 61,158,126,252, 62,154,182,197,243,203, 23,248, 55,255,243,
-127,192,159,254,241,127,196,187,159,127, 15, 31,127,248, 1,134,113, 68,215,117, 88,198, 17, 23,219, 45,118,199, 1, 77,211,224,
- 56,198,105,192, 56,205,113,196,156, 60,171, 89,207, 64, 9,120,227,155, 54, 9,212,210, 40,218, 26,188, 88, 84, 41,201,112,202,
-133,224,196,198,206,159,117, 85,121, 27,165,172,152,110, 64, 92,237, 68,144,244, 57,179,139,103,181,208,233,239, 21, 39, 88,108,
- 16,142,235,137, 78,233, 58,117, 61, 32, 41,153,204,240,202, 93,178, 54, 90,191,173,237,190,215, 42, 94, 41, 61, 80,165,204,102,
-161, 83, 21,244,186, 24, 53,190,110,113,201, 21,203, 37,250, 55, 39,222,229, 84, 39,189,252,184,192,117, 68,145,188,156, 58,216,
-144,226, 31,203, 5, 90,188,174, 5, 32,195, 86, 29, 43,118,236, 12, 5,124,124,214, 24, 75, 47, 27,165,148,145,170,141, 41, 49,
-231,227,193,151,173, 61,235,196, 68, 62, 85,158, 73,113, 26, 84,239, 96,234,220,201,211,106, 92,191,190, 84,202,250, 67,147,180,
- 32,106, 43, 58, 28,142,120,246,236, 18, 87,215, 55,120,241,226, 18, 87, 87,215,216,221,236, 32,150,163,237,202,179,211,180, 13,
-182,155, 13,206,207,207,113,113,113,142, 55,222,120, 13,175,191,254, 26,238,220,185,208,159, 7, 37, 43,158, 30, 96, 54,113, 81,
- 80, 81,236, 86,184,143,162,210, 6,140, 47,186, 78,179,179, 77,137,152, 49,180, 78, 52,141,149,172, 20, 17, 41, 8,137,220,103,
-110,253,197, 90,237, 42,160,206,103, 85, 12,178,138,201,229,219,127, 95,178,110,163,245,228, 34, 94,132, 57,218, 51,167, 15,230,
-203, 9,138,167,133, 34, 96,115, 65,155,215,171,122,153,218,226, 80,202,196, 49, 63,191,222, 59,181,122, 21, 84, 3,157, 22, 68,
-233, 35,114, 68, 58, 34,207,211,124, 90, 95, 38, 18, 11,102, 27,112, 4, 32,117,218,146, 68,114, 82,222, 11, 88, 27,118,202, 10,
- 97,214, 14, 60,187,142, 74, 94, 69,230,213,179, 2,160,136,128, 32, 28, 53, 62,213,142,152, 52,232,202,101, 52,109,158,172,173,
-172, 96,197, 95, 94, 1, 49,211,231,226, 42,175, 63, 37, 77, 81, 57, 55,172, 83,132, 83,136, 22, 23, 56, 80, 58,223, 75,113,226,
- 98, 14, 9,193, 56, 20, 72,163,146,115, 38, 75,195, 76, 22, 77,187,198,123,192,246,113,197,186, 43, 74,146,163, 10,221,136, 82,
- 33, 87,241, 73,107,204, 22, 41, 6, 80, 86, 91,115,141, 99, 37,220, 42, 26,145, 10, 34, 65, 85,250, 90, 29, 66, 82,132, 28,182,
-114,202,223,215,176, 44,240, 41,244,100, 55, 12, 8,203, 2,114, 14,188, 44,120,254,242, 18, 51,189,143, 47,254, 55,255, 26, 55,
- 95,255,191,225, 92,163,163,123, 34,141, 33,194,159,255,241,255,129, 16, 2,174, 94, 60,195, 52, 79,240,141, 71,227, 8,195,204,
-218,225,181, 77,131,253,241,136,182,109,209, 54, 13, 14,227,140,190,107,112,185, 63,224,124,179, 5, 49, 41,176,102,211,117,154,
-160, 36, 43,117,119,252,136,185,216, 60, 80,244,137,146, 4,139,101,124,149, 15, 66, 86,136, 76,124,217, 19,161, 72, 92,202,192,
-142, 59,113,209, 44,101,151,118,191,217,231, 9,133,155,192,236,114,141,169,169,236,169,243, 11,150, 91,250, 52, 62, 97, 46,148,
-164, 76,250,138,191, 29, 85,207,151,142, 22, 45,214,210, 12,198, 84, 63,135,219,233,101,235,230,167,218, 24,144,164,157, 51, 87,
-184, 78, 61, 20,242,136, 60,123,110,201,250,211,217,248,211, 89, 1, 27, 76,166, 99, 22, 49,226,160,248, 25, 75,176,169,222, 72,
-158, 96,210,125,152,200, 45,202,173,170,119, 19,219,176, 37,103,138,232,190,143,140,232,141, 57,166, 26,130, 78,169, 36, 82, 81,
-254,232,100,206, 86, 34, 40, 73,117, 20, 88,129,131,108,241,149, 85,184, 47, 95, 94,227, 23,191,252, 16,159,124,242, 41,246,251,
- 61,150,101, 65, 88,102, 44,203,140,176,204, 21, 35, 93,149,193,222,163,223,108,224,201, 99, 88,142, 56,238,143,120,250,244, 25,
-136, 8, 63,254,241, 79,209,118, 29,186,126,131, 87, 30, 62,192,111,125,249, 55,240,214, 91,111,160,109, 26,156,226, 80, 87, 22,
- 89, 59,122, 49,167,107,142,187,181,233,132, 86, 33, 87,237,130,205,207,195, 57,201,206,161,234, 60, 82,192, 86,142,161, 94,229,
- 74,103,123, 21, 25,160, 23, 83,204, 58, 95,139,236, 44,120,139, 21,108,115,203,142, 21,235, 38,202,102,120,155, 66, 43,105,122,
- 40, 63,159,166, 75,207, 43,155,252,247,229,145,115,154,103,175,147, 35,251, 60, 74,217, 59,123, 23,181, 32,113,148, 79, 41,202,
-216, 60, 71,150, 44,169,174,153,114,107,145,171,156,169, 38,178,217,250,195, 99,193,160,197, 68, 8, 16,137,250,147,122,251,106,
- 50, 49,242, 69,158, 46,243, 16, 2,230,121, 86,187, 39, 87, 0,175,220,161,187,212,181,199,127, 23, 82, 35,152,213,247,185, 0,
-137, 73,161,206,226,141,110,105,126, 69,253,229,206,192,169, 36,117, 74,100, 39, 25, 2, 21,202, 34,145, 46, 57,251,137,164, 8,
-228, 36, 53, 8, 89, 35,161, 79, 25,215,250, 33, 13,132,145,212, 84, 36,212,120,131, 74, 57,124,186,247,190,173, 89,135, 25,213,
-202,202,239, 89,149, 6,107,170, 67, 46,235, 42,165,166,110, 51,180,235,119,183,169,238,201,190,199,100, 70,110, 98, 72,107,183,
-244, 61,246,125, 79, 93,250, 56, 77,104, 83, 98,154,176, 36, 15, 99,202, 85,119, 17, 22, 51,236, 95,224,222, 43,111, 33, 8,176,
-187,252, 4,109,215, 98,158, 70,244,155, 11, 44,211, 1,155,174,195, 97, 28,209,180, 45, 60, 1,125,215, 1,130,120, 49,231,106,
- 51, 85,205,219,205,166,132, 10,136, 96, 14,140,198,121,173, 38, 1, 66,211,180,120,248,240, 94,122, 88,107,101,236,122, 45,130,
-124,209,162, 48,191, 73, 49,164,174,218, 11, 59, 74, 52, 61, 46, 19, 21,209,113,114,124, 20, 92,218,161, 58,225,152, 62,198,146,
-132, 44,201, 62,149, 45, 29,233,115, 47,157, 56,110,237, 86,116, 28,101,124,173, 98,148,177,108, 46, 36, 74,187,252,140, 93,163,
-245, 41,177,234,127, 42,161,146,216, 66,141, 78,173,200, 98, 61,248,198, 76, 68,201, 31,110, 49,166,106, 5, 91, 77, 49,146, 29,
-136,181, 88, 34,141,255,180, 83, 37, 93, 41,172,150,160,154, 47,159, 1,189,218, 41, 21, 75,138, 48,157, 72,223,181,128,201,227,
- 94, 41,224,138, 76,163, 43,239,101, 22, 72, 74,229,143,206,226, 62, 89,157, 63, 85,162,165, 45, 32, 10, 3, 58, 69,161,150,202,
-200, 57,135,113,156,240,195, 31,189,143, 95,126,240, 33,246,187,151, 24,135, 1,203, 50,167,195, 55, 30,204, 0,193,103, 43, 78,
-218,231,103, 52, 47, 47,130,195,113,151,212,188, 62,249,166,227, 69, 19, 38, 96, 26, 27, 12,135, 3, 14,187, 27, 60,121,252, 4,
-155,179, 51,124,238,221,183,241,149,223,250, 34,238, 92, 92,212,227,247,147, 28, 2,193, 63,101,130,211, 21,131,184,202, 85, 99,
- 30,145,164,162,118,112,206, 96, 68, 43, 97,240,169, 44,183, 74,249,172, 64,135, 82,177, 62,196, 76,148,196,218, 59, 73, 78,154,
- 40, 83, 73,105,115,162, 34, 63, 59,125, 72, 23,111, 86,136,103,145,173, 38,177,165,233,150,211, 61,186,232,110,219,106,105, 64,
-208, 11,187, 68,168, 74, 21, 64,147,243,210,201,158,249,146,249, 23,198,205, 64,182,177, 42, 98, 85,152,119, 5, 26,193, 28,247,
-229,172, 10,253,116, 70, 8, 39, 40, 88,154,184, 50,170, 64, 39,145, 24,202,178,182,172,205, 38,225,210, 90, 66,243, 37,239, 12,
-167,158,165,172,150, 56, 89,215, 20,102, 83, 2, 18, 82, 45,229, 78, 49,208, 84,179, 18, 52, 5,145,204,103, 83,141,230,243, 10,
-194, 85, 95,143,234,108,132, 77,212, 54,235,206, 93, 82, 60,120, 1,219, 81, 65,222,144, 81, 89, 36,113, 83, 19,187, 19,209,116,
- 40, 59,109,163, 91, 46,199,162,134,172, 48,239, 6,221,150, 79, 90, 62,121,240,233, 86, 67,106, 93, 8, 88, 58, 80,101, 30,161,
-213,127, 78,183,188,199,216,104,194, 39, 0, 0, 32, 0, 73, 68, 65, 84, 39,251,170,211, 63, 47,143,216, 54, 93,139,195, 97,194,
- 28,150, 24,218, 34, 2,145,128,214, 3,221, 43,111, 99,120,241, 24,127,253,127,253,111,120,243, 11,191,141,143,126,254,119,104,
-188,195, 91, 95,252, 93,252,252, 71,223, 68,215,180, 24,151,128,179, 77, 7, 17,193, 56, 69, 27,156, 48, 99, 73,227,198,121, 94,
-176,105, 91,156,111,183,120,122,117,133,179,205, 6, 44, 64,227,125, 10,117,113,152,242, 94, 41,225, 97, 95,127,245,161,238,225,
- 44,175, 30, 21,238,213,250,108, 75,188,105, 13,180, 46,133, 82, 28,207, 90,235,155,122,203,162,210, 60,109,148, 28, 33,113,210,
- 51,194,212,169, 16,175, 96, 63,147, 47, 90,121,255,229,116,210,152,251,138, 57, 95,246,181,148, 10, 14, 50,233, 87,178,134,193,
-224,182, 20, 53, 99,225,226, 58,224,225, 51,221, 75, 82, 53, 27,197,217, 72, 37, 2, 53,143,251,156, 9,130, 88,147,245,114, 87,
-224,140,181, 79, 71,131,116,203,243,197,101, 84,206,169, 51, 47,235, 5, 90,253, 25, 84,246,219, 84,191, 47,228, 68,139,154,248,
-147,224, 82, 0, 40, 12, 40, 25,193,242,122,133, 18, 63,222,217,133, 69,178, 70,114, 45, 83,169, 15,218, 88, 25,100, 26, 93,145,
- 41, 51, 28,199,224,137,199, 79,158,227, 91,223,249, 1,118, 87,151,216,221, 92, 97, 94,102,112,136,100, 46, 2,208,182, 77,220,
-255,133, 5,109,219, 34, 76, 3, 2, 7,140,156,163, 95, 81, 81,177,188, 58, 68,160, 64, 40, 13, 19,241, 13,154,174,199, 60,141,
-152,166, 1,239, 79, 51, 62,249,228, 49, 94,123,237, 33,126,227,215,191,128, 55, 94,127, 85, 67, 69, 40,197, 8,219,195,161,186,
-112,233,150, 59,127,237, 23,167,211, 95, 67,100,138, 51,163,206,214,244,187,213, 42, 81,232,212,234, 86,186,241, 34,178, 92, 81,
-120, 87,179,198,202,147, 80,166, 64, 43, 96,201,250, 79, 41, 74,232,130,242,229, 36, 50, 75,116, 88,245,132,131, 68,227, 73,243,
- 88, 56, 95, 40,121, 52, 47, 84,172, 89,132, 12, 62,161, 2,222,161,146, 74, 88, 58, 48,229,147,166, 81,246,103,217, 22, 72,215,
- 38, 89, 0,150,131,127, 98, 56, 12,116,210,152, 71,206,185, 80, 46, 14,142,180, 47, 79, 29,250,178, 68,244,235,178, 44,152, 83,
-148,118, 22,194,229,156,244, 24,165,154,181, 31, 37,190, 58, 23,192,130, 85, 67,104,195,119,242,171,168, 18,151,138,167,173,108,
-247,172,246,202, 46,129,186,129, 16,227,191, 47, 43, 9, 38, 43,222, 21, 19, 39, 91,146,226,136, 69,227,188, 73,168,114, 78, 84,
-198,220, 28, 97,235, 28,154,184, 99,112,122, 42, 9, 92,177,212,125,198,187,113,219,223,211,250,182, 61, 89, 26,114, 90,166,212,
- 97, 36,100,254,220,245, 93,109,255,135, 13,141, 32,219,201, 25, 65, 7, 73, 78, 31, 51,165,172,177, 54,101,170, 87,211, 52,152,
- 70, 96, 78, 9,109,115, 8,105,124, 19, 71,207,225,242, 25, 46,206,239, 64, 54, 15,211, 46, 39,160, 63,191,131, 39, 31,254, 16,
-190,109,225,188, 67,195,132,205,230, 28,227,112, 64, 72, 23,251,249,102,131,253, 56, 41,154,146,211, 33,194, 44, 24,231,120,224,
-229, 11,175,241, 13,142,211, 12,223,196, 3,173,105, 59,220,187,123, 81, 58, 45, 35, 70,170, 50,204,171, 28,102, 50,216, 86,170,
- 40,115, 34, 81,229,235,170, 14,187, 88,199, 74,208,242,170,160,202,138,103,177,219,109,232,133, 14,196,113, 98,221,238,173, 66,
- 39,196,146,193, 86,107, 27, 69,170, 82,237,156,146,149,171,104,189,174,201,187, 98, 5,233,136,138, 71,229,150,255,252,228,227,
-170, 86, 60, 98, 2, 29,156, 17,178,153, 47, 96,245,155,230, 46,157,140, 32, 12,235,227,152, 74, 82,160,169,225,141,223, 57, 23,
- 5,171, 37,151, 6, 35,157,228,116, 22,222,122,182,242, 89, 6,180, 72,125,241,192, 50,252,165,162,129,213, 22, 47, 19,174, 33,
- 37,178,212,118, 95, 32,194,113, 28,240,181,111,124, 15, 79, 62,253, 8,215, 47, 47,209,182, 29,142,199, 61,194, 50,195,123,143,
-174,241,184,217,221, 96, 30, 56, 78,163,230, 17,187,225, 8,248, 6, 8, 75, 44, 34, 37,192, 59, 66, 16,193,110, 92, 82,208,138,
- 67,227, 72, 71,161,206,121,184,166, 65,211, 52,104, 26,134, 91, 22, 56, 34, 28,247, 30, 55, 87, 47,209,247, 27, 92,189,124,129,
-143, 62,252, 4,119,239,222,193,123,191,254,121,124,241, 55,222, 67,211,120,227, 2,176, 43,184,218,186,231, 84,163,147,198,161,
-176, 13,198, 74,216,155, 30, 24,114,137, 65, 96, 69, 41,196,233,215, 75,117,193, 18, 91, 47, 62,195, 6,178,212, 83, 27, 41,193,
- 47,235,104, 38, 41, 30,101,178,235, 67,192, 16,215, 78,197,174, 64,108, 20,244,188,203,138,253,100, 93,245, 73,196,104, 45,152,
- 46, 7, 24,165,145,109,132,208, 56,172, 77,122, 21, 36, 37,157, 39, 53,155, 95, 84,195,148,167, 87, 66,198,194,101, 44,164,102,
-249,174, 83,217,124,241, 70, 91, 92,249,158, 74,206,133,201,116, 48,168,101,123,161,231,203,124,158, 39, 29,175,179,138,118,145,
-138, 3,129,243, 62, 77,228,160,239,104,190, 39, 92,106,199, 53,201,206, 18, 11,104, 53, 56,164, 85,104,139,212,196, 60, 75,134,
-203, 54, 58,169,210, 38,202,100,199, 25, 23, 11,145, 64, 66, 76, 13, 21,150, 8,254,201, 16, 48,157,108, 24,157, 8, 98, 83,150,
- 51,225, 29,197,252, 15,102, 70, 67, 42, 88, 43,167,170, 21, 33, 41,202,174,162,127, 65,171,127,125, 52,245,144,249,140,235, 63,
- 9,191,114, 58,154,156, 84,209, 38,189,141, 78, 71, 28, 57, 61,142, 12, 86,178,136, 61, 68,173, 38,178,226, 30, 87,233,157, 57,
-189, 9,132,101,137,130, 39, 70,192,113,156, 32, 18,148, 46,214,117, 61,166,241,128,195,245, 21,134, 38,122,201,119,187, 43,144,
-115,232,125,131,105,158,208,180, 29, 94,127,231,115,248,193,247,190,141,198, 55,152,150, 5,247,219, 22,114, 60, 2, 68, 24,150,
- 5, 93,219,225, 48,140,177, 8,240, 30,129, 67,132,221,136, 96, 63, 77, 9,164,224,209,117, 61,218,110,147, 2, 58, 66,242,107,
-218,238,184,150, 1, 57,212,223, 84, 25,251,164, 67, 44, 97, 74, 73, 40,118,199, 46,199,139, 58,163, 79,144, 42,159,247,228,136,
- 35, 84, 59, 81,245,206, 27, 95,185,220,210, 95, 56, 87,215, 24,213, 90,198, 90,130,215, 7,233,109,130,142,236,113, 88,139, 80,
-196, 42,105,111,239,239, 79,159, 33, 67, 17,163, 2,177,201, 21, 48, 75, 73,153,210,148, 50,107, 93, 75,135, 79,125,249,215,242,
-182, 44,104,229,149, 87, 62, 91,182, 42,162,151, 81,244,231,125,173,216,145,222, 26, 63,171, 18,120,209, 8,200,147,239, 58,139,
-193, 56, 95, 90,171,221,159,241,189, 22, 88, 73,233,222,242, 90,197, 57,135,191,249,250,119,241,233,163,143,241,252,201,167, 96,
-102,204,211,136,121, 26, 32,160,136, 68, 6, 35, 68,132, 29, 24,132, 37, 48,166,121,193, 52,141,240,142,176,105, 28,198,121,193,
-245, 48,199,209, 33,226,159,211,248, 6,155,109,143,205,102,139,187, 15, 31,162,109, 58, 44,243,136,105, 28,177, 76, 35,120,153,
-193, 68,112, 77, 11,223,180,240, 77,147, 4, 83, 11,134,227, 30,243, 52, 96,127, 56,226,231,239,255, 10, 95,253,173, 47,226, 11,
- 95,120, 55, 77,111, 50, 47, 3,229,221, 41,114,237,147,135, 66,108, 70,245,173,149, 36, 76,211, 0,229, 21,144,139,205,137,220,
- 22, 64,249,153,216, 28,211,127, 75,173,125,112, 89, 56,150,133,125,110,173, 11,202,226,188, 26,180, 20,187,220, 16, 35, 65, 83,
- 7, 74, 34,122,190,105,247,237,200, 88,175,156,185, 32, 10, 75,221,173,203, 15,170, 69,129, 85, 65, 97,238, 10,139, 97, 46,107,
-137,149, 80,142, 87,107,219,196,169,200, 41,133, 81,229, 94,246,239,156,194, 84,114,162,221,218, 78, 89,128, 50, 5,253, 58,142,
- 35, 66,242,207, 87, 52,185, 36, 58,115,228, 10, 31, 69, 36,190, 27, 73,235,163,220,117, 50, 5,221,106,175, 66,197,120,111,176,
-212,246,231,111,155,203,213,236, 57,137,216, 92, 18,201,105,201,164,225, 90, 37,172,134,211,148,129,210, 10, 52, 36,246, 67, 14,
-208,170,242, 80,210,196, 66,117, 54,185,241,128,160, 33, 37, 94, 25, 51, 63,173,163, 61,211, 5,225,204,248,210, 94,251,105, 57,
- 20, 67, 12,160, 96,144,172,244, 91,143,210,179,223,174,136, 66,201,236,236,163,122,190, 80,228,168,140,177,136, 12,123, 9,218,
- 9, 23,141, 93,188,120,156, 57,120, 35,238,208,192, 74,210,131, 49,165, 10, 15, 16,156,111,123,112, 88,224, 4,113,223,222,109,
- 48, 28,102,188,254,246,187, 24, 14, 59,188,121,239, 33,158,126,242, 33, 14,135, 35,238,156,109,225,155, 6,194, 1, 63,251,209,
- 63,224,222,197, 93, 92,222, 92,163,109, 60, 14,195,128, 97,158,241,202,189,251,184, 57, 28,128, 70,176, 44,115, 12,111,233, 58,
-220, 28,143,112, 14,184,220, 31,176,237, 55, 24, 67, 20,110,121,215, 96,179,217, 36,145, 28,170, 96, 22, 80,125, 32,185,218,166,
- 90,104,220,178,218, 13, 86,142, 1, 42,208, 24, 19,223,172,214,179,147,151,182,198,168, 20, 32, 66, 98,154,151,140,193,149,240,
-162,240,183,109,199, 43,230,199, 84,167,171,213,130, 71, 90,183, 34,116,251, 1,185, 10,246, 58,249, 79,171,177,101,101,167, 66,
- 37, 64,116, 10, 76,146,202,246,164,190, 86,203, 67, 55,251,172,127,116, 90,101,132, 90, 46,255,161, 11,235,174,177,216,190, 68,
-227, 45,173, 13,205,242, 24,114, 13,194, 65, 20,140,196,194,201,205,129,211,164,190, 53,128, 73, 76, 97,100,187,199,234, 30, 43,
- 9, 89, 44,140,176, 4,252, 63,127,245, 13,124,242,193,207,177, 44, 51,166,113, 80, 95,243, 60, 28,225,132,209,147, 96, 92, 56,
-165, 11, 6,204,227,132,101,160, 20,100, 68, 56, 28, 7, 60,155, 22,184,132,176, 60,191,184,139,139,187,247,208, 54, 45,100, 30,
- 48, 29,246,152,110, 46,241,244,230, 69,236,212,155, 78, 17,151,228,163, 11,100, 89, 22, 44,129,225,198, 49,142,128,247, 30,222,
- 59, 52,109,139,113, 28, 48, 14,103,248,214,183,143,248,197, 7, 31,227,247,127,239,119,112,126,118,102,131,100,203,116,105,181,
-214, 17,147, 93, 64,171,226,184, 38,236,165,247, 37, 1,142,148, 70,166,233,116,164,153, 8,197,115, 72, 37, 37, 17, 53,116,135,
-178,197, 68,156,158,123,206, 21,245,111,214, 48,208,170, 99,210, 36, 51,181,109, 82,149,242,231,114,234, 90,158,130, 50, 27,146,
-157, 43,162,238,236, 12, 74, 38, 59, 17, 20,202,156, 25,119,173,253, 4, 5,223,108, 71,206,100, 46, 73, 87, 57,111,236, 84,158,
- 51,231, 71, 74,254,131,138,239, 4, 5,254,149,109,121, 33,238,201, 5, 57, 69, 46, 1,161,192,234, 93,183, 10,247,176, 44,154,
-185,145, 71,214, 25,161,205, 57,102,214,217, 80, 29,170,107,188, 4,165,202, 30,122, 5, 57,165,200, 99,202, 66,217,245,164,196,
-164, 81,150,160, 22, 99,183, 21,210,166, 35, 58,128,184,228, 39,172, 0,110,217,165,144, 53, 52,222,187,248, 57, 72, 40, 15, 73,
-133,138, 78,226,190, 16,215, 87, 46, 17,229,114, 86, 8,145, 67, 83,208,147, 84,123, 68,193,160, 36,190,145, 50,125,210,255, 45,
-100, 51,207,139, 88,135,156, 97,197,165,104,211,220,133, 16,213,208, 9,192, 36,188,230,221,101,174, 70,245,197, 19, 5, 7, 84,
-163,138,147,226,186, 0, 46,224,138, 96, 67,119,201,101,113,139, 41, 4,132, 36,144, 3, 4,157,143, 47,235, 34,130,113, 89,208,
- 30,175, 49, 46, 1, 47,158, 60,194,221,251,111, 98,127,243, 44, 30, 52,124,128, 8, 48, 77, 19,186,182, 69,215,118,184, 62,236,
-177,233, 58, 12,211,132,133, 25,155,174,199, 28, 22,180, 77,131,198, 59,140,243, 28,119,240,243, 4, 17,194, 48,205,104,188,199,
-110,156,112,231,108,139, 5, 14,190,105,240,218, 43,247,235,171, 43,166,213, 20,104, 10, 21,155,147,253,231,150,116,166,160, 15,
-123,180, 81, 29,229,105, 93, 1,118, 39,148,139, 34, 97,209,113,157,100, 65,150,105,120, 42, 81,164,113, 25,137, 40, 40,179, 12,
-157,179,157, 37,253, 60,157,161, 72,229,206,202,213, 86,111, 83,229,186,213,207,246,212,206, 83,241,177,205,222,146, 86,152, 74,
- 82, 91,164, 84, 40,201,252, 18,171,141,196, 78, 68, 12, 78, 56, 59, 0,170, 3, 29,183,217,169, 12,176, 36,199,144, 74,121,230,
-105, 53,162, 32, 90, 21, 57,102,103, 70, 48,202,228, 36,168, 57, 65,231, 73, 41,160,181, 83, 18, 51,205,160,162,150,163, 21, 91,
- 28,214, 34,152,214, 49, 31,127,242, 20,223,254,246,247,240,244,211,143,147, 16,105, 1,132, 17,134, 1,227, 60,163, 33,198, 2,
- 7, 33,143,195,120, 64, 71, 64,235, 8,155,206,225,229,113,194,113, 28, 83,204,176,195, 91,111,189,131, 87,223,120, 27,187,203,
-167,216, 95, 62,199,225,233, 39,241,231,215, 52,113,111,190, 57,131,243,145,170,215,180,125, 28,149,114,208, 41,199, 18, 66,156,
-196, 4, 78,193, 35, 12, 80, 7, 89, 2,248,120,140,239,224,241,136,121,158,240, 39,127,122,133, 47,125,233, 61,124,229,203, 95,
- 68,227,188, 9, 55, 66,133, 51, 45,127, 47, 6,160,101,167, 66,214,168,110,156, 29,118,139, 77,197,170,132,202,219,111, 93,133,
- 5, 84, 83,124,180, 84,118,183, 34,134, 63,158,158, 86, 39, 69,176,105,215, 83,218,176, 56,203, 37,131,132, 52, 82, 54,202,126,
-206,127,166, 3,124,226,176,231, 99, 65,156,168, 69, 83, 56, 1,105,140,181, 77,147,219, 36,175,236,214, 78, 19, 49,113,187,245,
-106, 32,255,183, 90, 48,153,137, 34,155, 88, 91,202, 2, 48,237,208,141,120, 54,119,170,185,155, 38, 15,128, 19,127,234,150, 46,
-125,137,162,184,108,131,203,249, 9, 57,193, 83, 89,247, 39, 86,194,186,176,181, 63,133, 28, 3,203,134, 8,168,205,160,141,134,
-149,154,182, 74,134,166,105,177, 3,121,178, 44,236, 76,148,182,153, 90,167,226, 44,243,236, 41,209, 38, 51,137,146, 60, 25,104,
-148,168,149, 53, 36, 97,106,158,176, 49,138, 56,207,129,208,208,138, 8, 71,137, 21, 42,100,164,179, 48, 73, 91, 82, 34, 3,234,
-148, 48,164,100, 42,135,219,211, 24, 86, 68, 50, 35, 36,128, 1,173,192,116, 50, 58,142, 55, 72, 88,231, 76, 26,146,172, 39,187,
-164, 21, 52,204, 1, 71,201, 63, 39,204,112, 77,131,101,142,182,155, 12,111, 9, 33,104, 22,250,118,179, 1,252, 6,141,204,144,
-101,192,225,120,141,144, 58,250,174,105,176,217,244, 88,120, 1, 51, 99, 63, 12, 96,102,180,222, 99,211,247,177,226, 98, 65,215,
-120, 28,151, 0, 67, 32, 7,115,244, 68,118, 77, 83, 44,100,105, 12,211,180, 45,222,124,227,161,201, 16, 70,241,134, 59, 35, 90,
- 65, 9, 20,112,182,147,174,140, 97,164, 2,143, 34,172,146,122,125,178, 74,214, 42,157, 13, 37,209, 28,213, 24, 96, 3, 87,185,
-237, 34,163, 60, 41,112,117,215,232,212,122,232,204, 62,206, 24, 85, 63, 99,124,126,226, 59,182,135, 9,213,190, 32, 77, 60, 50,
- 47,238,122,153, 80,245,177, 14, 64,144,202, 43,158, 49,242,178,170, 20,201,172,120,124,134,120,224,150,168, 90,123,248, 87,233,
- 89,181,168,170,234,212,113,203,104,132,106,255,181,168,191,152, 78, 39, 6, 70,123, 65, 38,104,130,232,118,133,187,220,182,154,
- 72, 13,161, 35,194,119,127,240, 62,126,240,189,239, 98,191,223, 65,132,177, 76, 35,150,105,192, 52, 47, 32, 4,116,109,135, 97,
- 94, 16,198, 3, 90, 2,182, 36,104, 60,225, 48,206, 56, 76, 51,188, 44,120,227,243, 95,196,171,175,191,133,171,231,143,241,236,
-163, 95,226, 87,207, 62, 69,187, 61, 71,187, 57, 67,127,247, 1,124,211,160,237,122, 64,128,227,113, 15,223,180, 90, 92,180,222,
-129,231, 25, 28,102, 44,211,152,124,194, 94,117, 35,204, 49,100,201,247, 61,218,174, 69,183,217,160,235,122, 0,130,121,158,240,
-179,247,127,133,199, 79, 46,241, 7,255,234,119,113,182,221, 88, 15,198,186,204,197,237,144,121, 90,189, 69,137,133, 64, 98,252,
-251,145,135, 94,139,242,156,249,179,196,164,120, 73,245,172,146,241,185, 59, 29,111, 59,163,117,129, 42,173,133,169, 94, 95, 81,
- 61, 9,226,192,202, 7,176,194, 71, 73, 62,238,152, 3, 94,224, 60,218,105, 67, 16,192,229, 66, 55, 49,120,130, 66,226,204,239,
- 44,170, 11,200,213,202,125,187,124, 35,210, 78,149, 42,145, 53,233, 58,138,170, 29,186, 47, 50,175,212,144,132, 32,230,121, 55,
-192, 33,225, 21,199, 61,169,220, 23,115,161, 75,236,108,115, 78,122, 85,160,211,106,226,168,133, 19, 27,230,124, 14, 23,139,141,
-135,203,252, 15, 58, 13,212,115, 46,175,234, 88, 87,190, 86,243,101,234, 69,227,112,145,202,130,200,233,251, 14, 70, 16,167,141,
- 68, 22, 46,166, 70,147,164,216,242,178,150, 32,218, 23,157, 10,149,245, 60, 72, 42,253, 70, 43, 63, 22,144,119, 70,178, 38,167,
- 17,144,121, 36,168,163,220,250,165, 81,213,123, 18, 29, 72,246,220,225,196, 10, 90,211,232, 76,232,131,165,154,229,113,113,254,
- 40,106,127,175, 24,241, 71,230, 78,219,196, 34, 81,132, 97,166,178,229,183, 39,112,162,185, 9,163, 73, 29,125,231, 27,204, 97,
-134, 39,192, 99,193, 56, 31,227, 3, 48, 29,192, 97, 70,223,245,104,156,139,150, 9, 22,156,111,122,140,243,140,187,119,238,224,
-229,110,135,251,231, 23, 56,142, 3, 26,239,112,121,189,195,118,179,193,113,138,251,196, 56, 21,224,244,208, 56, 52, 4,236,166,
- 17,178, 44,232, 55,109, 12,129,217,110,234, 66, 40,103,194,179, 91,157, 65, 82,242, 28,146, 53,167,252,125, 81,233, 22,225, 83,
- 61, 2,175,109, 65,182,194, 54,158,210,226,119, 75, 64, 4,170,186,146, 83,238,192,233,223, 58,227, 88,200,207, 66,137,221, 94,
-145,207,254, 49, 9,123,254, 25,167, 2,167,124, 9, 25, 55, 89, 4, 58, 39, 23,186, 80,125,225,154,116,166, 56,122, 55, 98, 49,
-183, 18,156,113,233,216,179,106, 91,176,178,162,153,247,132,112,170,229,208,231, 84,140, 53, 74, 47,123, 42,130,195,149,163,205,
- 56,224,226,180,140, 74, 2, 91,149,111, 47, 0, 28, 39, 87,129,117,137,172,169,142, 4, 51,253,173,245, 25, 68,248,206,247,126,
-130,239,127,247,187,152,198, 1,224,128,233,176,195, 56, 47, 8, 97, 65,211,120,128,129,229,184, 7, 66,192, 52, 77,232, 55, 49,
- 70,248,217,205, 4,226, 5,191,246,155, 95, 69,215,245,248,248,167,223,199,245,147, 79,240,224,245,183,241,234, 23,126, 19,251,
-151,151,104,186, 22,155,237, 57,198,113,192, 60, 79, 24,142, 7, 16, 51,136, 23,176, 4, 44,211,148, 14,108, 96,226,152, 34,151,
-109,110,154,228,229,115, 86,183,199, 48, 79,112,137,251,208, 52, 45,186,174, 67,211,118,232,251, 13,194, 50,227,207,255,203, 55,
-240, 47,255,219,223,198,107,175, 62,172,118,217,194, 2, 78,201, 94,149,160, 71,110,177,192, 86, 97, 80,197,135,172,162, 69,229,
- 94,184, 52, 83,162,147, 21, 25,175,124,184,162,194, 51, 67, 49, 20,131,158,203,171, 42,146, 42,149, 90, 93, 35, 14,101, 28, 45,
- 2,223,120, 21,255, 90,148,180,230,157,219,226,147, 10,200, 37,103,157,159,214, 54,117,235, 90,242, 7, 44, 29,242, 84, 16,198,
- 54,200,196,112,239,101, 85,100,103,226, 93,222,161,231, 66, 60,138,217, 74, 26,162,203, 43, 1, 69, 98,103, 69,120,108,190, 22,
- 78, 29,186,218, 40,163,192,121, 9, 12, 9, 65, 87, 14,250,250,115,137,225,181, 19, 51,201,171, 88, 23, 93, 35,153,255,144,139,
- 52,170,210, 12,197, 88,175,211,217,193, 70, 72, 72,117, 64, 81,177,195,186, 74, 56,169,231,122, 66, 51,115,130, 73,145,177,177,
-101,215,140,172, 26,224, 92,212,136, 61, 67,243, 61,153, 3,202, 16,115,150, 27,232,222,218,152,244, 13,201, 45,119, 48, 36, 86,
-204, 83,118,226,213,204, 52,195,234, 89,204, 97,103,100,141, 98,101,254,167,206,102, 39, 28,109, 86,233,254,101,147, 21, 76,228,
- 18,183,189, 14, 94,176, 98,132, 74,224,162, 39,179, 51,163,119,193,203,203,216,121,139,112, 2,252, 59, 28,167, 57, 93,240,132,
-102,179,193,126,119,131,175,252,222, 31,192, 59,194, 71,239,255, 4,207, 63,253, 4, 77,170, 48,189,119,152,151,128,113, 9,232,
-218, 22,199,113,196,121,223, 39,210, 24,161,105, 26,244,125,252,227,207, 55, 27,236,142, 3,206,182, 27,140,243,130, 97, 94,240,
-242, 48, 20, 62, 51, 69,222,187,247,141, 81,142,214, 94,220, 10, 99,106,216,194,118, 20, 70, 38, 12,196, 73,142,102,180,105, 62,
-174, 88, 82,114, 42, 94,158,200, 56, 73, 86, 40, 67,137,187,205,236, 47,164, 62,232,218, 59, 47,117, 52, 55,173, 2, 12, 80, 86,
- 40,122,200, 82,109,201,160,207,188,212, 63,203,190,150,191, 94, 66,201,111,175,227, 13,181,235,209,132, 45, 75,162,130,238,211,
-165,218, 99, 80,213,120,103,224,144,247,126,149, 83, 45,102,186,145, 25,217, 88,217,143, 40, 15, 5,210,238,203,149, 11,134, 12,
- 8,165,154,175,224, 84,121,111, 87,150, 44,186,223, 38,169, 47,236,106,133,150,132, 80,180,118,112, 83,250, 89, 23, 36, 21,254,
-246,219, 63,196, 79,126,244,125, 44,243,132,105, 56, 96, 24, 7, 72, 8,224,176,160,107, 91,204,199,189, 10,146, 58, 79, 56,235,
- 26,188,220,143, 96, 14,120,240,234,155,216,180, 45,158,254,242,167,184,251,198, 59,184,251,250, 59, 56, 92, 95, 98, 58, 30,224,
- 57,160,237, 59,236,111,174,112,249,228, 83,180, 93,135,243,179,115, 44,187,107, 76,243,108,112, 30,113, 69,198,153, 89,148, 82,
-223,180,128,115, 37,144, 38,100, 79,118, 98,122, 55, 77,180, 50,249,102,198, 52,141,170, 95,249,219,111,127, 15,191,243,207,126,
- 11,239,188,245,122, 9, 21,194,201,224,209, 92,170,183,178,177, 76,160,142, 13,126, 73, 58,100, 21, 95,153,159, 61,173, 38,132,
-169, 8, 16, 11,150,169,224, 47,171,169,163,153,192, 40,169,220, 18,184, 73, 18, 1,209,151,139,217,144,215,114, 33, 84, 77,112,
-114,208, 76,162, 88, 22, 90,155,168,109, 53, 70, 29, 71,162, 89, 29,203,156,233,118,118, 10,145, 9,124,164, 95, 99, 17,239,145,
-209, 99,149, 98,192,142,220,157, 51, 43, 63,148,253,186,165, 19,138, 57, 83,214, 93,122,212, 90, 4, 37,173,133, 16,192,203, 82,
-180, 38,118,189,203,156,210, 3,107,241,169,230, 82,144, 17,252, 42,131,130,203,125, 66,162,104,106,177,249, 0, 73, 55, 81, 34,
-179, 45,233, 48,195,132, 88, 75,202, 42,146, 58, 9,218, 52, 14, 23,208, 14,156, 45,221, 50,103,116,152,203, 30,171,117,158, 84,
-164, 68,209,159, 81, 83, 2, 26, 10,245,170, 64, 20,226, 5,157,127,124,146,125,209, 92, 30,230, 18, 77,135,202, 94,150, 65, 14,
-146, 22,241, 69, 60,101,144,167,154,158, 90, 50,192,179,162,146,243, 8, 57,131, 16, 50, 59,155,163,122,145,172,239, 55, 18, 62,
-140, 34,152,170,145,147, 80,217, 15, 63,123,252, 12,211, 52, 96, 94, 2, 58,141, 17,140, 5,205,184,204, 88,194, 2, 97,198,203,
-231,143,241,226,227, 15,176, 59, 78,248, 87,255,238,143,240,103,255,233,255,196,166,239,163,199, 86, 24,103,253, 70,247,206,151,
-187, 29, 60, 59, 76,211,140, 22, 64,215,120, 72, 82, 4,103,192, 64, 96, 81,117,125, 16, 70,215,117,145,211,235, 91,156,157,111,
- 35,104,129,252, 73, 58,129, 10,114,204,168,150, 20,102,111,139, 24,169, 92, 1, 69,152, 67, 85,236, 31,131,203,203, 78, 57, 58,
- 52,122,146,243, 3,109,119,202,150,243, 81, 14, 40, 42, 52, 43,219,117,211, 74,161,175,227,246, 91, 64, 68,255, 84,176,102,165,
- 1,147,244,108,186,106,204,133,196,185,143, 62, 82, 57,157,134,107, 7, 43, 21,104,163,188,180, 89, 77, 94,239,211, 93, 26,141,
-102,245,172, 90, 83, 18,177, 75, 76, 34, 82,106,161, 81,247,199,165,136,145, 44, 92, 90,137, 0,101, 37, 78,188,117,175, 33,181,
- 56,207, 70, 30,231,125, 71, 25,223,210, 42, 95,193,198,111,202,138, 18, 23,127, 38,223,252,206, 15,241,254,207,126,130, 48,141,
- 24,135, 35,198,113, 64,152,103,244,219, 51, 44,211, 21,166,227,132, 97, 90, 0, 4, 16, 9, 14,227,140, 97, 94,112,255,222, 3,
-220,189,184, 0,115,128,235, 58, 52,219, 11, 76,135,125,244,160, 55, 13,246,215,151,152, 83, 20,241,171,111,188, 5, 23, 2,142,
-135, 61, 94, 28, 15, 8, 22, 54, 73, 17, 84,227, 82, 1,228,168, 36,218, 45, 92,194, 81,154, 84, 56,121, 20,120, 17, 0, 44, 75,
-236, 96,124, 2,144, 68, 5,254,140,123,247, 31,226,155,223,158,177,252,206, 87,240,107,159,127, 39,117,129,174,112,200, 13,200,
- 64,216,234, 36, 96,146,226,170, 61, 87, 90, 33,149, 34,206, 24, 51,112, 42,249,150, 42,183,156,224,170,149,136, 10,205,108,224,
-135, 17,146,138,152,200, 68, 64,121,233, 89, 39,225, 82, 42, 36, 76, 70,125,182,234,230,244, 51,103, 46,147, 24, 83, 92,240,184,
-121,103,203, 38,253, 15, 44,113,151, 76,171,181, 65,242,150,179, 75, 19, 9, 17, 67,233, 33,165,230, 57,228, 81,121,162, 27,234,
-133,158, 85,238,105,228,174, 84, 62,210,177,114, 46,152,156, 39,237,202,245,254,144,188, 75, 14,106, 97,203, 23,250, 18, 2,150,
- 16,195,177, 74,206, 56, 71,194, 34, 21, 11,111,254, 82, 75, 49,145, 11, 92,115,247,144,171, 50,202, 81, 73, 75, 11,190, 58,159,
- 71, 14,121,122,146,162,100, 29, 41, 59,196, 73, 36,105,102, 21,175, 6,204, 24, 77, 65,198,249, 50,115,244,210,167, 41, 67,222,
-157, 35, 77, 40, 2,135,114,217,155,207,171,214, 60,152,243,221, 33,118,234,162,182, 30, 54,153,221, 48,177,145, 98,252,201, 70,
-255, 46,108,246, 69, 22,198, 80,188,128, 36,133,155,157,237, 57,234, 7, 20, 59,190,103,211,221,217, 40,198,219,146,157,204, 55,
-103,198,210, 10, 58,161,178, 75,113,112, 70,253, 41,184,124,113, 9, 44, 51,132, 3,130, 35, 44, 44,240,105,132,182,164,157,204,
-249,249, 5,238,223,123,128,235,231,207,208,206, 1,191,248,209,143,225, 93, 84,247, 14,195,144,188,235,209, 39, 57, 76,179, 94,
-220, 11, 11,206,124, 28,127, 29,134, 49,141,248,227, 15,179,107, 60,230,137,177,105, 91, 28, 67,192,194,140,174,105,209,118, 45,
-222,124,253,149, 26, 77, 69,229,135, 69, 85, 91, 70,102, 85, 33,153, 51, 82,246, 87, 70,209, 46,206,146, 52,106,165,111, 25,128,
- 20, 1, 21, 11, 27, 96,202, 74,247, 80, 5,159,100,251,124, 29, 49,170,163,234,138,107,156, 15,143, 60,125, 41, 84,187,127, 42,
-246, 58, 31,124, 26,211,109, 19,137,196,176,209,157,156,220,134,174, 88, 39,160, 24,100, 35,128,115, 84,232, 90, 58, 28,203,226,
- 20, 72,165, 56,245,206,153, 11, 93,212, 79,190, 30,151,151,144, 26,169, 46,226, 66,130, 51, 40, 72, 99,109,178,123, 95, 73,105,
-232, 5, 0, 83,127,221, 42,190,211, 67,149,193,226, 76, 2,212, 58, 58, 52,171,240,169, 66, 18, 1,132,239,253,224,103,248,224,
-253,247, 49, 15, 7,140,195, 17,211,112, 68, 88, 22,108, 54, 27,236,174, 95, 98, 9, 1, 36, 1,144,120,112, 58,223,224,149,215,
-222,194,205,213, 11, 76,199, 29,252, 43,175,226,250,209,135,232,250, 13, 8,130,241,176,199, 60,141,160,182,195, 60,207, 56, 63,
-187, 64,152, 71, 60,125,252, 40, 49,243,163,181,175,113,132,222, 59, 4, 0,115, 16, 12,204,198,157,224,208, 55, 30,189,247,145,
-221,208, 52,240, 77,171,207,151,107, 26, 77,207,202,222,118, 24, 25,160, 48, 99, 26, 71, 92,189,124,129,101, 89,240,183,223, 28,
-112,125,117,141, 47,127,249, 55,208,119,157,122,177, 19,141,163,176, 7, 80, 67,234,164,114, 9, 38,127,182, 18,211, 82, 98,151,
-208, 45, 98,221,245,254,100,205, 56, 55, 14, 4, 3, 38,114, 54,108,135,236, 36, 46, 99, 40,162,253,138,243,120,157,106,106, 39,
-115,178,166,101,102,190,121, 29, 56, 20,184,140,173,120,173,207,157,115,179, 38,197, 41, 83, 9,254, 40,138,166,153, 56, 22,209,
- 41,144, 36,251,184,137, 83, 66,166,148, 56,208, 12,193,129, 0,190,241,133,193,110, 2, 92,132, 11,112,201, 37,230,124,200, 93,
- 44, 10,223,157, 67,134,204,164, 29,122, 10,221, 90,194, 2,201,206,144,164,142,215,120, 92, 5,170, 69,106,168,230,142,195,233,
-215, 16, 47,246,172,181, 49,232, 89, 33, 35,134, 45, 97, 70,122,105,235, 68,194,229, 13,111,130, 40,145,209,232, 24, 10,158, 81,
-237,231,159,133,168,192, 47,130,116,178, 88,208,158,165,250,223, 39,193,119,158, 16,148, 2,159, 75,129,105, 86,122,141,118,180,
- 82, 7,120,232,135,154,187,131, 12, 4, 0,213, 25,150, 40,157, 75, 57,175,202,152, 81,244, 67, 65, 5, 97,176,236, 24, 89,137,
-142,132,172, 18, 20, 56,217, 18,138, 20, 60, 30, 23,117,124,174,248,236,145,198, 18, 31,196,236, 67, 12,203,144, 60,179,169, 82,
-228, 8,199, 0, 16, 65, 13, 0, 94, 92, 62, 7,253,224,239,113,255,205,119,113,239,213,215, 16,210, 14,135, 57,118,216,158, 8,
- 75, 86, 88, 58,143,214,121, 92,108,183,241,242,110, 35, 62,214, 57,143,101,154, 19, 54, 54, 22, 75,125,219,226, 48, 45,209,206,
-145, 40, 90, 93,191,137, 99, 66,177,138,126,174,108, 72,197,227,105, 21,153, 6,120,177, 82,109,231,155,208, 33,134,183, 72, 22,
-252,172,186,220,242,247, 82,129,102, 50,193,169,236,132, 11,102, 75,196,197,112, 20,161,138, 75, 15,171,189,226,149,183,213, 74,
-149, 20,109,250,143,229, 92, 73, 90, 35,212, 86,155,124, 49,186,170, 27, 39, 77,128,210, 24,113,163, 80,119, 84, 95,220,209, 18,
- 71,133,217,158, 86, 51,100, 96, 44, 90, 17,195,140, 48,205, 88,214,173,197,238, 21, 8, 82, 42, 59, 89,241,145,138,201, 44,136,
- 7, 2,155,223, 75,199,171,167, 90,122,163, 27, 41, 5, 26,107, 39,200,137, 58, 71, 38, 87,186,236, 67, 8, 43, 68, 46, 4, 31,
-125,252, 4, 63,249,241, 79,112,253,242, 57,198,225,136,101,153, 49, 7,198,102,179,193, 97,119, 29, 19,161, 56, 96, 90, 22,244,
-125,143,109,123,129,155,151,151,120,242,232, 67,188,245,185,247,112,245,244, 17, 14,207,226, 72,125,216,221, 32, 72,252, 26, 66,
- 8,216, 54,130,109,215, 98,183,187,214, 40,215,141,119,240,206, 35, 48,227, 24, 56,118,255,233,235,108,189,195,182,105,209,184,
-180, 67,119, 81, 16, 55, 47, 11,134, 16, 32,227, 8, 2,161, 73,163, 89,151, 46,175,184, 99,143,239, 95,164,209,121, 52,109,116,
-134,132,101,193,254,230, 10,211, 56,224,251,243,130,159,252,236, 23,120,239,215, 62,135,127,241, 59, 95, 69,219, 54,169, 72,229,
-106,181, 98, 26, 95,115,161,145,217, 91,151,236,237,245,127, 79,107, 92,109,189,139,169, 82,221,116,205, 98,243,192,237,207, 41,
- 55, 51,153,116,150, 46, 42, 73,221,104,158,164,230,175, 49,243, 22,188,203,239,188,121, 15, 76, 96, 84,213,111,170,107,197, 30,
-192,101,242,102, 87, 99,122,162, 74, 14, 66, 98, 93,195, 58,163, 15,136,159, 67,116, 64, 9, 73,180, 97, 38, 75, 35, 25,145,109,
-254,246, 66, 66, 10, 3,156,192, 48,208,166, 42, 98, 84, 11, 14,118, 89, 34, 28, 76, 16, 47,253, 37, 4,204,115,156,168,194, 85,
- 47, 73, 58, 31, 68, 27,149,220,165,115, 90,179,185, 85, 99,201, 21, 32,174, 64,183,156, 35, 80,138, 64, 45, 18,157,248,193,229,
-252, 44, 42,177,159, 39, 50, 76, 93, 69, 48,148, 79,191,126,175,115,102,124,214, 19,100,219,158,141,162,118,100, 83,175, 87,182,
- 84, 70, 37,237,204, 98,247, 70, 76, 72, 72,161, 30,145,170, 1,201,132, 81,139, 33, 5, 81,218,127,159,136, 77, 50,140,160,196,
-186, 87,123,218, 60,100, 39, 89,147,185,168,136, 51, 36,255,249,166, 18,204, 86, 55,138,157, 83,109,235,177, 95, 3,167,126,167,
- 28,244,249,207,185,186,138,251,116, 79,241,144, 24,166, 17, 14,192, 24, 2,186,156, 57, 76,130,179,126,139,166,237,241,252,209,
-199, 24,166, 17,219,205, 6, 23,103,231,104,251, 22,199,195, 17,228, 61,198, 57, 94,216, 93,219, 68,251, 77,250,138,142,227,168,
-149,215,107,247,238, 97, 14, 1,227, 28, 71, 43, 49,152, 32,232,194,173,241, 13,154,166,143,159,119,144, 34,208, 48,215, 96,180,
- 18,186,146, 11,153,194, 85, 40, 77, 32,156,121, 81, 43, 21,117,201, 54, 51,236,145,244,123,235,100, 72,106, 49, 79,250,156,217,
- 94,240, 82,160, 42,185, 58,140,121,191,197,182, 6,235,101,117,198, 54,164,193,147,174, 22,197,177, 29, 61,202, 73,103,185,182,
-140, 89,119, 4,161, 88,238, 74, 20,171, 33, 21,138,177,122,229,245, 59,139, 78,127,212,155,190, 18, 54, 89, 31,107,182,154, 56,
-202,128,204, 98, 39, 90,153,202, 74, 49,201,197,135,107,195, 82, 78, 85,162, 54, 44, 61, 33, 84, 43, 79, 48, 21, 27, 94, 69, 35,
- 77, 19, 4, 69,242,214,218,134, 18, 79, 91,235, 22,204,137, 0,128, 48,140, 19,190,243,247,223,195,203, 23,207,176, 76, 35,166,
-101, 6, 68,224, 73,112,184,185, 6,135, 37,173, 97, 28,206,206, 47,112,184,185,193,205,245, 21,222,120,235,115, 56,220,188,196,
-241,249,167,145,134,120,216, 99, 97,142,128,140,116,194,220,187,123, 15,215, 55,215, 74,203,186,104, 91,176,196,240,164,221, 60,
-235,133,209, 57,135,179,166, 85,148,169, 35,135,153, 25,199,121, 49,145,194,241,103,216,100,229, 63, 11, 22, 65, 76,169,226, 56,
-165,240,236, 65, 46,192,135,120,169, 79, 97,137, 26,149,166,137,151, 53,185, 56,101, 8, 14, 31,124,240, 49, 62,126,244, 4,255,
-230, 15,254, 37,238,223,191,155, 88, 25,245,138, 75, 42, 48,146,171,197,193,100,125,235,174, 46,102, 5, 56,101,192,166,174,222,
- 57,243, 62,148,130, 91,179, 26,108, 12,236, 42,250,215,145,141, 66,166, 42,236,164, 4,127, 68,113, 25, 12, 31,132,212, 34,102,
- 69,158, 38, 4, 64,145,183,180,138,174,205,131,123,152, 68,178,162, 93,137,235,187, 50,141, 99,137,239, 54,167,113,116, 94,183,
- 74, 48,185,237,121,198,202,101,202, 17,210, 89,199,156,104,114, 32,132,176,104,206, 66,190,204, 67,186,188,243,191, 11,204, 8,
-105, 4,175,239,195, 42,118, 52,167, 88, 66,193, 44, 81, 92, 35,169, 9, 83,144,147, 38, 32,202, 41, 13, 21,206, 20,215,229, 51,
- 32, 42, 14,129,188,150, 35, 71,137, 36, 32, 22,198,161, 77,175,238,195,243,217,146,190, 55, 97, 54,233,111,164,118,188, 16, 88,
- 5,177, 46,209, 72,117,200, 79, 48, 26,166,178,122, 22, 13,155,202, 43, 73, 78,163, 81,169,253,185,146, 59, 46, 97, 48,101,217,
- 77, 26, 87,216,124,111, 61, 78, 68,199,153,105, 11, 18, 63, 60,142, 43, 71, 29, 45,164,191,178, 47, 49,163, 10,171, 10,197, 84,
-105,156, 84,144, 72, 99,148, 92,245,136, 90, 29,160,255,173,253,117,202, 11,102,209, 17,204,179,103, 47, 32, 97,142,190,215, 84,
-189,206, 97, 65,147,136,111, 89, 18,226,154, 6,211, 60,162, 61,191,192, 89,215,197, 12,109, 34, 60,184,255, 70, 84,219, 54, 13,
-186,166, 69,227, 61,142,195, 17,141,163, 20,179,234,209, 54, 49,209,237,238,197, 25, 22,102, 28,198, 81,171, 48, 0,184,179,237,
- 83,215, 17, 69,114,219, 77, 15, 9, 5,139,200, 66, 9, 98, 33, 21, 85,170, 56,107,216, 84,141, 82,232,101, 40,248, 85,210,125,
-184,152,201, 71, 26,163,173, 60,225, 2,169,146,140,128, 98, 35,129,225, 5,104,149,186, 2,240,211,138,122, 67, 44,229,217,224,
-162,220,172,190, 80,181, 42, 22, 91, 90, 62,184, 52,109,221, 36,166, 72,122,162,157,134,113, 20,176,140,133, 37,101,106, 22, 57,
- 42, 89,241, 34,149,123, 67,253,168, 98,144,185,142, 44, 85,216, 68,200,102, 11, 27,175, 77,104,171,201, 17,110, 9,251,226,146,
- 3, 77,101,167, 70,245,183,166, 5,119, 84,227,150,142,144,141,125, 40,167, 58,149,149,103, 26,149,234,178, 46,117,240,156,159,
-247,180, 23,102,210, 76,244,124, 89,254,191,255,223,215,240,236,241, 35, 0,130,113, 28,227,179, 18, 34,196, 99, 9, 81,204,185,
- 57,187, 64, 96,198,225,250, 37, 88, 2, 62,255,235, 95,194,225,242, 41,156, 48,166,105,194,241,176,199,148,224, 23,173, 35,116,
- 93, 11,231, 28, 94, 94, 95,195, 59,143, 77,219, 97,211,118,184,158, 3,174,199, 9, 1,192,198,123,220,239, 58, 60,232,123,156,
-183, 45,188,143, 95,215, 20, 4,135, 37, 96, 10,113,154,197,202,216,167,204, 61,139, 59, 84,112, 17, 76,165, 17,237,180,204,105,
- 36, 11,180, 93, 3, 79, 64, 67,130, 6,140, 6,130,105, 28,112,115,245, 18,187,155,235, 4,172, 25,240, 23,127,249, 13,124,244,
-209,227, 40, 44,115, 69, 56, 25,193, 84, 86, 26,194,229, 0,183,244,185,106, 86, 79, 53, 34, 81, 12,195,195,213,123,245,252,107,
-178, 37, 46,171,195, 93,186, 24,200,229, 83,219,196,105,106, 23,204,105, 74,145, 47, 20, 73,227,120,203,114, 79,104,106, 42,116,
- 50,231, 10,177,161, 36,186,213, 64, 8, 21, 59,167,231, 72, 68,192,224, 52, 58,151, 34, 99, 20,251,238,230,160,167,210, 80,112,
- 58,249,203,136,217,174, 86,115, 98,121,137,244, 45, 43,121, 50, 32,149,116,118,101,165,251, 74, 20, 23,145,176, 33,141,217, 85,
-217,107, 34,160,243,241,197,224, 16,140, 69, 47,255,112,210, 29,162,239, 79,189,102,164, 21,220,153,140,143, 62, 83, 75,165,130,
-164, 82,181, 30,181,104,182, 8,136,225,164,203, 65,177, 49,138,164, 32, 43, 11, 65,238, 0, 0, 32, 0, 73, 68, 65, 84,154, 66,
-248,206, 95, 83, 8,172, 26, 47,164, 64, 27,214, 2,128,205, 29,154, 11,183,236, 14,200,112,158, 36,182,203, 55, 58,107,252, 94,
-241,203,177, 42,230,226,101, 46,137, 18,167, 29, 64, 76,176, 79, 85, 2,167, 31,116, 26,107,114,124,232,152, 74,197,146, 15, 28,
-145,242, 82,208,106,127, 32,146, 65, 3,171, 11,158,139,106,177,144,131, 68,255,251, 58,149, 7,234, 25,143, 95, 98,252,119,203,
- 56,193, 19, 48, 47,179, 73, 72, 3,230,101, 73, 31, 70,252, 90,135,253, 13,154,126,131, 39,143, 31,225, 95,255,209,191,199,112,
-220, 99, 9, 11,118, 55,151, 58,234, 90, 66, 12, 18,216,244, 61,188,247,233, 66,111, 49,135,128,243, 77,143,203,235, 29,246,195,
-128,190,237,146,208, 1, 24,151, 5, 11, 71,191, 59,136,208,182, 45, 94,127,237,161,241,252,231, 14, 78,170,233, 93,190,120, 41,
- 15,146, 51, 36, 70, 44, 55, 67,140, 13, 66, 20,188, 64,149,210, 58,223,180, 57, 39,220,172, 60,140, 26, 84,247,228,234,177,148,
-178, 15, 54, 93, 58,192,170, 32, 39,148,157,185,133,159,104,231, 0,171, 52,207, 62,209,228,228,207,227,255,244,156,229,157, 98,
- 17,113,202, 9, 61,150,196, 8,192,202,196,178, 78, 28,163, 98,105,212,131, 56,129,137,156, 6,197,216,253,162,232,193, 70, 68,
-198, 45, 0,107, 82,186,157, 12,154,167, 84, 82, 2, 85, 88,194,201,129,193, 22, 94,193, 69, 79, 2, 75,254,226, 36, 70, 69, 41,
- 94, 65,162,239, 94,190,232,171,255,203, 41,128, 40,226, 40, 6, 39, 98, 84, 60,252,255,228,207,254, 43,158, 63,125, 4,114, 62,
-249,209, 69, 59,159, 41,165, 91,121,231,112,125,117,137,105, 28,112,255,213, 55,112,126,113, 23,215, 79, 31, 65,194,130,225,120,
-196, 28, 2, 56,173,170,130, 48,218,174,199,126, 24, 83, 87, 24,223,129, 67, 0,218,139,187,184,127,126,142, 59, 93,139, 51,231,
-208,186,242, 51, 8, 16, 12, 75,192,176, 4,204, 34,152,153,181, 25,200, 7, 99,144,252,164,150, 34,206,185, 56,150,109,154, 6,
-103, 23, 23,184,123,113, 7,189,143,137,106,211,188, 96, 10, 1,199,105,198,113, 90, 48, 6, 70,219,120, 48, 7,140,195, 17,251,
-253, 13,134,195, 1,195,241,128,111,125,231,123,248,232,195, 79, 43,123,172,152,143,190, 16,177,120, 5,235, 65,157,101, 43, 43,
-243,165, 83, 23,237,233,226, 35, 51,198, 83,145,160,180, 65,117, 8,185, 4,243,178,230, 4, 87,197,170,218,100,181, 28, 10, 66,
-228, 42,215, 68, 14, 4,137,151,125,114, 53, 85,213,116,214, 78,229,166, 42,142,213,203,115, 36,149, 86, 55, 95, 82, 76,108,172,
-203, 40,182, 53, 41,131,167, 16,226,229,239,114,177,196,169, 68, 79,205, 33, 88, 42,204, 41, 17, 21,144,138,115,218, 61,179,100,
- 63,122,217, 59, 71,190,251, 82,229,141,147,201,248,144, 52,245,202, 13, 36, 57, 82, 31,191,162, 54,210, 61, 64,169,112, 17,219,
-140,164,238, 59,135,216, 84,180,193,138,180, 76, 26,121,234, 12, 68, 32, 94,178,241, 11,200, 2,183, 2,136, 33,157, 82,229,221,
-122,154, 39, 40,254,149, 67,252,124,179,181,150,243,221,202, 5,150, 85, 38,127,165,105,203, 23,125,201,148, 79,108,194,108, 89,
-179, 29, 69,238,248,216, 40,135,237,193,149, 95, 0, 49, 62, 76,205,186, 77, 47, 41,153, 14, 45,143,221, 89, 88, 35, 61,197,236,
- 55,212,183,201,185,234,227,242,178,217, 14, 60,193,250, 97, 46,118,189,204, 13, 85,168, 68,145,139,126, 24,251,235,107, 72,218,
-215,177, 48,150,144,149,148,241, 80,117, 46,138,229,238, 62,120,136,174,105,240,251,127,248,111,241,183,127,246,159, 0, 56,156,
-157,157,227,234,230, 10,141,247,216, 31,227,101, 45, 64, 60, 96, 54, 27,204, 75,226,186, 51, 99,152,163, 29,104, 89, 66,154, 10,
-196, 29,224,113,154, 49, 45,241,240,241,222,163,235,183,248,220,187,111,172, 8, 77, 84, 35, 62,211,136, 70,125,136,249, 66, 62,
-225,159, 72, 97,166,234,216, 92,180,179,103,243, 50, 86,240,126, 27,244, 98, 87, 36, 34,230, 51,204,248,215,194, 41,135, 77, 77,
-202, 42,219, 28,234,192,214, 82,184,202,205,227, 2,192,203, 51,207,220, 45,169, 67,146,211,215,158,198, 19, 42, 30, 73,128,163,
- 50,181, 16,131, 95,189,237,150, 53,140,123,148,106, 25,230, 48,208,252,244,172, 86, 79,130, 36,114, 84,225, 63,203,141, 91, 47,
- 71,226, 58,162, 60,223,101, 85, 37, 74,212, 83, 72,132,157,192, 19,233,170,137,114, 30,114,122,223,242, 40,148,149,135, 45, 58,
- 5, 81,205,139, 80, 61, 50, 48, 5, 92, 81,208,150, 78,228,107,223,248, 46,158,124,242, 1,230,121,198,241,176,131,132,128,182,
-109, 49,207,115,180,133, 57,135,160,153,232, 11,222,124,231,115, 56,222, 92,129,199, 35,230, 33, 94,230, 89,164, 39, 28,192,169,
-184, 61, 12, 3,188,139,171, 36, 52, 29,250,123,247,113,209,183, 24, 94,190,136, 97, 71,204, 96,223,192,109,206, 32,109,135, 57,
-196,103,162,115, 30,157,247,216, 52, 13, 90,231,224,157,131, 87,194, 95, 28, 39, 54,142,208, 38,212,167,243, 13,182,103,103, 56,
-219,110, 32, 97,193,238,230, 10, 87,215,215,184, 25, 70, 48, 3,203, 56,162,129,195, 89,223,227,124,179,193,249,102,139,190,235,
-113,126,118, 17, 5,116,195, 17,199,227, 30,199,227, 30,227,120,196,119,191,255, 35, 60,123,246, 98, 69, 21, 43,123, 95,150,168,
- 91,200,150, 46,125,166, 13,250, 64,110, 1,253,104, 33,187, 26,231, 56, 41, 28,247,180,144,133,165,165,171,136,212,228, 49,100,
-245,120,134, 15,145, 41, 21,114,186, 29, 81, 89,217,197, 11, 45,196,103,215,213,111, 67,121,246,216,164, 46, 82,217, 4,169, 11,
- 89, 84,178, 76,246,204,200,255, 36, 63,235,149, 5, 90,212,229, 17,199,231,133,141, 33, 44,197,111, 46,208,220,115,152,145,123,
- 14, 59,202,133, 70,214, 47,229,115,108, 73,214, 53,187,158,172,168, 20, 5, 28, 31, 59,244, 84,236,136, 80, 5,105,202, 81,171,
-169, 94, 54,199,128, 17,225,210,109,252,130,136,241,181, 14,133,248,243,112, 37, 14, 57, 29,110,249,235,207,182, 89,123,135,129,
-217,216, 54,169,106, 74, 45,192, 70, 12,179,192, 90,250,226,123,205, 90,184,229, 21, 75, 30,229, 43, 11, 30,159, 65,209, 42, 52,
- 44, 89, 69,172,154,238, 15, 82,141, 64, 44,228, 50,119, 95, 86, 68,103, 81,159, 86,248, 84,252,209,198,219,158, 5, 42, 54, 49,
- 76,125,139, 69, 84, 0, 29,221,151, 70,148,101,253,239,226,215, 18,150, 17,135, 97, 68, 8,140,253, 48, 34,112, 76, 87,155, 67,
-192, 52, 47, 8, 34,232,218, 6,199,253, 1,151, 47,158,227,187,223,252, 26,190,252,187,255, 29,218,198,225,221,247,126, 19,195,
- 56,193, 59,135,182,241, 32, 31,227, 82,135,113,194,126, 28,225,189,195,243,171, 43, 44, 33,224,172,239,113,115, 60,162,239,218,
-232,245,101,198,113,156,112,214,181, 24,230, 5,219,174,141, 60,107,223,192, 27,160,142,172,195, 36, 12, 76, 71,147,211,196,226,
- 96,165,176,225,171,157,109, 25,185,137, 88,223, 62,173, 58, 13,169,254, 34, 35,248,144,106, 23,155, 70,107,153,230, 32,208, 78,
- 95, 42, 97, 25, 85,129,187, 57,183,220,162, 56,173,255,180,172,105,160, 63,103,253, 89,243,138, 63,175, 5,129, 73,109, 74, 80,
- 33,155,166, 4,170, 87, 22,122,121,230,209,252, 74, 37, 79,171, 13,146,176,161,247, 85,197,129, 9,150,176, 9, 51,171,240, 7,
-251, 82,150, 44,116,147, 1,107,119, 31,149,106,134, 84,192, 94,185,218, 88,140,166, 32, 21,182, 40,164,176,147,177, 40,103, 49,
- 83,249,210,255,230, 27,223,197,207,127,250, 35, 28,142, 71, 44,243,132,113, 56,162,237, 55,184, 73, 49,170,228,188, 30,164,227,
- 60,227,205,183, 63,135,253,203, 23,144,121,194, 60,141,113,228,157, 56, 18, 99, 88,208,111,182,224,101, 81, 71,138,184, 22, 3,
- 8, 15, 31,220,199,254,249, 19, 44,211, 17, 65, 4,205,246, 2,226, 28,194, 60, 99, 57, 30,176,140,137, 20, 39,121, 69, 35, 32,
-230, 56,194,247, 30,173,247,232,124, 74,112, 19,192,119, 27,156,221,189,135,182,233, 16,150, 5,187,155, 27,140,195,136, 37,193,
-156, 28,128,251,119, 46,176,233,123,244,141, 7,230, 17,251,221, 14, 87, 87, 47,241,226,197,115, 60,123,250, 4,151,151,207,245,
-193,152,167, 9,211, 56,226,176,223,227,112,216,227,107,223,248, 14,110,118,187,250, 98, 86, 47, 54,116, 37,132, 42,222,248, 51,
- 28,152,166, 98,147, 28, 14, 66, 6,231,236, 74, 83, 68,134,173, 76,118,173,162, 13, 12,233,132, 49, 95, 80,118,251,123,242,231,
-229,142,143,163,118,231, 4, 46,195,208,125,120,149, 16, 71,229,140, 86,136,149,148,228,199, 50, 85,173, 61,252,146,108,156, 36,
- 84,133, 13, 81,102, 2, 88, 10, 31, 21,119, 84,190,240, 0, 74,157,108, 33, 47,178, 97,154,151,176,165,216,253,115, 88, 37, 36,
- 90, 61,132,190, 99,162,182,225,146, 56, 39,122,153, 26,178,217,103, 5, 49,214, 59,180,117,161, 70,162,220,150, 66,247, 19,117,
-171,144,130,112, 66, 37, 30,204,177,228, 34,130, 32, 92, 29, 39,121,100,174,167, 81, 62,223,133,203,207, 34,189,203,246,114,207,
-197,143,242,224, 77, 19,150, 45,185,192,106, 67,174,192, 25,172,124,223,107,216,162,148, 75,164,206,220,206,163,220,184,215,131,
-144,217, 85,202,237,118,100, 49, 23, 68,222,165,165,110,133,243,120,118, 53,130,207, 15,131, 29,201,219,127, 47,105,204, 1, 8,
-174, 47,175, 49, 78, 35, 68, 24,195, 28,213,190,251,113,196, 56, 47,152,142, 71,221,123,180, 77, 3,159,118,227,158, 25, 31,252,
-236,199,184,184,123, 15,111,188,243, 57,156,111,183, 24,166, 49, 2, 69, 24, 88,194, 2,239, 29,166,105,196, 60,207, 49, 58,210,
- 69, 1,219,221,179, 45,250,182,197,238, 56,164,116, 42,159,186, 20, 96,152,131, 2,104, 56,119,212,246,251, 2, 42,168,122,158,
- 80,208, 58,104, 7,167, 64,139,181,191,155, 84,189, 27,199,221, 66,230, 98, 68,193, 64, 74, 21,221,122, 90, 48,137, 86,241,208,
- 5,164,100,173, 4,151,145,175, 85,205,230, 76,106, 34, 46,230,100,152, 28,118, 38, 84,205, 0,213,198, 43, 93, 54,223, 74, 32,
- 76,149,113,114,102,104,231, 46,102,183, 69, 69, 60, 67,169,171,129, 35,152,184,131,117,136,212, 42,196,133,203, 81, 74,182, 61,
-147, 50,169, 16,138,163, 73,182,188,117,169,145,174, 10, 91, 40, 0,167,147,193, 2,173, 52,109, 98,197,140,229, 67, 34, 99, 97,
-129,161, 77,157,232, 81,210,215,247,221,239,255, 12, 31,188,255, 51,236,118, 59,132,101,193,241,120,192,230,236, 28,135,221, 13,
- 66, 8,104,115,118,249, 60, 97, 90, 22,188,249,230,219, 56, 94,189,192,124, 60, 32,240,146,222, 63, 6, 9, 99, 22, 65,223,182,
-152,166, 17, 1,192,152,106,135,166,235,176,113, 14,215, 79,159, 64, 64,104,206,238, 64,136, 48,238,111,208,128,112,214,117,216,
-110,207,177,233, 55,232,189, 67,227, 26, 56, 23, 89, 14, 33,143,219,211, 14, 20, 0,154,190, 71,223,181, 88,166, 17,187,171, 75,
-112,152,226, 14,158, 98, 62, 3,165,174,222, 65, 48, 29,143,104,136,208,247,155,168,160, 71,185, 28,200,123,156,157,109,209,182,
- 29,154,182, 41,105,115,227,128,225,176,199,112, 56,226, 47,255,250, 91, 24,231,229,244, 76, 34,203,146, 41,190,233,178, 97,151,
-210, 80,243,202,169, 78,174,176, 12, 76, 71, 95,235, 46,164,164, 78, 82, 1,125, 41,190,152,138,182,128,200, 14,194, 45,179,162,
-116, 91, 10,151,201, 73, 99, 57, 59, 67,138,146,222, 72,114,138,184, 54, 15,237,180,129, 74,151,138,153, 58,101,173, 65, 12,145,
-177,122,215, 50,137,117,229, 27, 73,143, 42,233, 26, 47,239,233, 3,135, 18,173,154,206,173,188, 54, 18,102,240,194,186,170, 84,
-245,186,148, 73,197,237, 78,159,172,179, 10,177,159, 38,186, 21,195, 44,107,122, 94, 14,178, 89,141, 50,244,231, 69, 98,250,163,
-122, 82,162,209,199,249,116,160, 50, 86,207, 14, 4,170, 80,234, 41,112, 69,162,126,130,171,177, 57,233, 72,255,228, 78,203,250,
-164, 60, 94,207, 83,105,102, 93,111, 75,186, 35,197, 52, 95, 78,231,244, 42,140, 40,129,238, 98,199, 97,102,240, 88,143,106,205,
- 95,182, 99, 72,157, 69, 76,245,130,178,219, 9,184,229,128,151,117, 54,139,238,230,245, 80,229,248, 96, 16,151,106,141,147, 93,
-224,116,183,158,146,125,236,131, 76, 64, 8,130,253, 16,115,119,243, 38,229, 85, 7, 60,236, 60, 46,175,119, 56,142, 17,152,113,
- 28, 6,204, 33,224,247,254,240,223,226,249,147, 71,248,194,151,127, 27,255,240,245,191, 68,219, 54, 24,198, 25,227,112, 68,183,
-233,177, 44, 1,111, 60,184, 15, 2,225,226,236, 60,141,217,163,128,227, 56, 78,232,187, 46,121,157, 9,195, 50,163,111, 27, 85,
-163, 70, 58,157, 55,194, 21, 75,222,147, 19, 57, 86,113,247,137, 33, 57,161,130,138, 16,234,108,123,210, 81,112, 57, 72, 68, 87,
- 27, 48, 15, 80,217,157,155,180, 2, 3, 9,145, 42, 43, 60,238,110,114, 71,207,102,212, 91,214, 36,106,129,225,210,149, 41, 58,
-133,172, 79, 36,137, 47,197, 6, 24,149, 16, 33,155,169, 12, 42, 66, 76,189,208, 83,198,122,222, 61,234, 40,172,194,126,186, 26,
-152,170, 47, 52, 85, 54,150,252,189,228,100,167, 92, 68,158, 52,229,108, 18,226,136, 53,230,189,120,221,227,115,105,115,172, 75,
- 10, 27,107, 17, 39,171,247, 71,199,246, 96, 48, 37,129,106, 74,137, 98, 42,251,243,172,158,205, 5, 85, 62, 66,242,158, 61,127,
-141, 63,127,255, 67,252,240,251,223,199,213,213, 75,128, 8, 75,152,209, 52,109,244,165, 79, 3,186,205, 89, 28,111, 46, 51,230,
-101,193,195,251, 15,113,188,190,196, 52, 28, 32, 18, 16,183, 82,113,231,237,155, 22, 78, 68,147, 13,145, 46,228,123, 15, 94, 5,
-141, 49, 88,165,191,123, 55, 78,116, 14, 59,108,157,195,214, 57, 56, 48,102, 14, 88,230, 17, 28, 22, 48, 57, 80,219, 70, 43,154,
-243, 49,147, 65, 98,146, 34, 59, 66,211,122, 56, 94,146,200, 40, 62,169,115, 16,204, 75,236,204,183,109,139,109,215,163,107,218,
- 84, 56, 50,230,241, 24,129, 44, 93,143,195,188, 96, 14, 1,129, 3,134, 97,192,213,203, 43, 12,199, 61,134,195, 1,243, 52, 96,
-154, 38, 76,211,136,105, 28,176,223, 95, 99,191,223,227,219,127,247, 15,177,115,188,141,122,156,215, 47,170, 69, 17,179,124, 97,
-179, 43,173, 79, 68,130, 96, 61,209,173,218, 34, 49,115,126,179, 58,203, 10,235, 12, 2,163,204, 96, 55,190,120, 89,173,201,178,
-144,151,188, 91, 37, 29, 20,153, 90, 70, 13,171, 67,136,139,160,139,145,119,234,146,118,231,102, 13,154,254,191,110,162,148, 10,
- 96,220,123, 84,254, 60,251,103, 84, 49,168,129, 13, 25, 45,218,236,178,229,140,153,177,240,130,133, 23, 29,155,215, 20, 58, 87,
- 93,164, 54, 67, 33,239,145,163,177,160,168,225,237,250,144,185,228, 33,219,156,139, 83,229,107,153, 56,147,100, 28, 58, 85,142,
- 8,170,224,246,233, 66, 79, 98,190,180,127,176, 67,189,244,245,177, 2,134,200,124, 38,150,194, 42, 82,235, 54, 56, 79,220,114,
-144, 77,234,146, 88,127, 30, 89,148, 83,158, 55, 78,162,185, 70, 76,176, 64, 29,228,158, 43, 77,135, 42, 63, 37, 67,240,197, 98,
- 31,202,161,196, 82, 98, 9, 21,148,146, 98,236,140,213,206,192,100,204,152,223, 0,103, 42,240,140,225,108, 71,156, 97, 13,119,
-200,251,123, 74,182, 10,114, 25,115, 36, 74, 74,186,115,231, 2,104, 26,204,204, 81,185, 11,224, 66, 24,109,223, 34, 4,198,217,
- 50, 97, 63, 12,184,216,196,196,168,121, 89,240, 15,223,252,155,184, 35,223,239,128,126, 11, 55, 12, 8, 28,240,246,123,191,137,
-182,235,113,125,253, 35, 60,125,121,165,255,125, 16,134, 35,194,211,171,107,108,186, 14,135,113,192,166,111,209,181, 61,134,155,
- 29,188,243,104,189,128, 41,142,238, 95,127,237,129,126, 10,134,143, 83,162, 83, 13,199,194, 38,220, 73,206, 97, 38,195, 46, 95,
-119,240,148,247,220, 43, 46,201, 42, 99, 85,227, 5,141, 86,148,205,115, 91, 71, 74,167, 36,190,138,111, 92,246,233, 48, 97, 58,
-153, 44, 37, 32, 56, 70,228,110,155,128,137,188,185,203,208, 59,202,187,127, 74,121,240, 72,136, 71, 94, 73,203, 45,141, 45,195,
-144,210,231, 46, 78,177,121,233,243,114,154,138, 37, 84, 91,145,180,235, 49,104, 79, 29,119, 26,181, 56,153, 67, 2,171,144, 8,
- 73,214, 32,210,194,169,236,239,213,159,110,194,116,212,118, 35,171,235,163,202,156, 55,211, 6, 18, 5, 40,145,208,137,151, 63,
- 23, 77, 21,229, 46, 85, 67,159, 62,125,134,239,124,231,239,113,121,249, 2, 77,211, 98,158, 71,117,130, 28,246, 55,104, 55, 91,
- 44,243,132,227, 97,135, 16, 22,220,191,184,131, 48,236,177,204, 83, 58,128,227, 15,127,102, 70,215,246,152,231, 49,122,209, 5,
-224, 16,119,183, 15,239,220,195,112,184,129,107, 59,200, 50, 99,188,190,194,182,237, 33, 68,152,194, 18, 47,238,110, 19,247,237,
- 68,144, 16,253,233,203, 60, 33,132, 25,194,130,182,245, 24,153,209,251, 6,115, 16, 28, 23, 78, 59,250, 8,115,106, 40, 22, 15,
- 89,180,187, 44, 11, 28, 17,186,182,129, 75,158,244,101,158,225,198, 17,139, 0,247,239,222,211, 56,202,105,153,177,204, 35, 70,
- 8,218,174,199, 52,207,104, 27, 96, 89, 22,213, 14,121,127,131,143, 63,121,140,151,151,215,120,248,240,190,126,142,186, 66,215,
-236,136,204,101,119,102,221, 71,154,109, 47,176,172,112, 3,124,164,245, 88,173,198,208,105,114,155,185,134,243,197,226, 50, 97,
-178,132, 31, 40, 1, 79,183,141,102,151,141,213,182,217,194,143, 96,172, 81,180,226, 58, 87,241,197,122, 89,179,218, 64, 53,105,
-147, 36,230, 77, 16, 43,122, 90,181, 29, 46, 59, 85, 5,118, 7,151,237,117, 75,154,196,184,100, 1, 19,182, 14,158, 56,182,206,
- 99,243, 92, 92,151,247, 39,107, 95,204,121,151, 10,249,194, 67,119, 74,180, 67,230,160,152,152, 47,169, 33, 4,213,148,179,184,
- 77, 82, 38,125,162, 87,194, 17,136,163, 16,147,217,213,170,120,100,184, 85,178, 14,170,174, 33,138,195,243,212, 89, 9,114, 84,
-138, 40, 72, 89, 93, 32,195,217,108, 1,196,198,125,148, 97, 56,186,206, 54,201,146, 38,125, 82,139, 46, 73, 68,185,234, 56,170,
- 86,126,178, 2,122,166,165,190, 55,163,119, 75,116,179,207,174,161,141, 17, 78, 3, 20,100,253,123,139, 17, 59,201,169, 3, 87,
-107, 65, 46,161, 20,100,252,197,209,107,201,241,161,171, 70,216,230,235,112, 62, 93,172, 13,102,153,209,119, 45,218,198,193, 59,
- 70, 35,140,205, 50,227,147,103, 47,176,233, 91,108,208,225, 56, 28, 49, 78, 51,174,175,175,240,232,195, 15,240,250,155,111,129,
- 14, 7,188,120,242, 8, 55, 55, 55,154,204, 22, 64,232, 8, 24,199, 25,119, 47,206,177, 73,106,205,182,109,227,129,156,190,207,
-155,113, 0,200,195, 55, 14, 93,219,225,221,183,223, 48, 87, 49,157, 70,112,100,223,119,190, 36,115,196, 41, 21, 55,101, 85,127,
-138,156, 64, 47,106, 22, 62, 86,123,185, 34, 82, 33, 34,235,107, 44, 42,123,123,239, 16,213,197, 31,145, 82,185,212,210,200, 46,
-141,207, 56,166, 77,185,168,243,116,204,241, 98,183, 17,186,249,185,179,153,238,217,130,151,138,198, 18, 98,114,139,160, 72, 25,
-220, 98,118,148,168,242,166,244,215,201,105,114, 89,241, 40,151,106, 57, 42,172,147, 31,223, 38,110, 73,253,147, 34, 65, 29,117,
- 43,197, 76,170,142, 0, 43,194,179, 86,124,161, 91,129, 59,100,113,182,146, 95,220, 60, 58,228,234,215,137,161,110,177,217,161,
-139, 8,118,251, 3,190,246, 95,191,137,203,203,231,104,219, 22,211, 56,160,105,123,112, 8,216,223,220,192, 55, 29,198,253, 62,
- 10,149,152,113,247,236, 2, 60, 79, 8,201, 34,150,167, 98,222, 55,232, 29, 97,152, 39, 4,137,113,168, 11, 51,238,108,183,232,
-154, 13,130, 48, 66,218,147,195, 55, 32, 71, 24, 57,141, 0,251, 62,102, 93,239,175, 99,167,149, 62,134, 44,134,243, 4, 76, 4,
- 12, 75,220,177, 78,129,163,104,174,141,130, 82, 9,140,206,185,184, 18, 35,194, 34, 64,238,165,195,178,192, 57,151,236,163, 80,
-117, 52,152,113,156, 70,128, 28,218,182, 69,219,245, 96, 14,152,231, 73, 21,112,145,142,231,128,100,117, 62, 30, 15,232,250, 13,
-254,230,111,255, 14,127,244, 63,254, 33,124,138, 51, 85, 7,134,152, 81,172, 20, 1, 42,173,164, 22,170,171,116,102,236,125,171,
- 77,162,136, 67,149, 31,110,235, 69, 33,221,141, 87,231, 0,172, 72, 50,254,163,104,219,162, 18,155,106,255, 8,200, 9, 15, 71,
-236,251, 65, 21, 92,164, 74,182,132, 57, 83, 89, 80,135,118,193, 20, 25,153, 67, 65, 46,106, 66,156, 84, 80,168,236,210, 89, 66,
-136,239,102, 74,135, 99, 37,141,218, 85,149,171,214,125,249,146, 86,235, 88, 53,242,134,218,132, 11,250, 54,129, 92,112,155, 64,
- 41, 51, 0,156,213,205, 37, 91, 96,254,217,165,117,173, 73,111,204,224,159,124,177, 91,238,132,136, 36,182, 72,129,150,101, 85,
-187,181,109,235,133,206,102,255,141, 98,183,206, 36, 79, 54,212, 57, 49,110, 32,107,247, 62,165,107,139, 54,207, 58,117,141,171,
- 16, 27, 57, 40,213,253, 96, 97,244,213,125, 43, 5,105, 40, 22,194, 97,113,164,100, 69,118,162, 35, 95,219,185, 20,140,222,106,
-252, 72,118, 20, 91,123,109, 21,153,101,118, 2, 42,188, 17,168, 63, 62,219,224, 68,199,168,140,183,223,125, 7, 77,191, 65,215,
-198,195,170,109, 61,218,198,163,111, 60,182,109,131, 77,215,224,129, 44, 56, 28, 7,176, 48,166,100,247,121,244,203,159,197,184,
- 66,223, 0,105,143,215,119, 93, 36, 35, 5, 70,235, 41,141,219, 91, 44,203,130,190,137,190,221,179,190, 71,219, 54, 56, 78, 19,
-250,182,197,156,186, 16,231, 28,154,182,195,197,217, 54, 41, 40, 81, 41,107,227,223,187, 50,189, 48,170,248,188,111, 34,151,125,
-218, 38, 26,215,236, 0, 53,183,153,196,112,162, 44, 51,106,101,129,195,105,214,183,172, 4,148, 21,151, 88,253,149,150, 94, 37,
-134,247, 92, 84,166, 72,241, 34,196,121,146, 99,132,147, 34,122,224, 84,135,146, 72,253,252, 73,182, 61, 81, 21,162, 69,149, 15,
- 29,234, 16,168, 45, 72,171,102,127,173, 82,203,153,233,121,127, 38,213, 19, 91,251,230,141,211,128,115,199,198,246,162, 69, 17,
-191,208, 45,127,150, 17, 55, 10,137, 90,142,138,224,208, 8,242,184, 20, 89,101,181,206,234, 32,201, 59, 71, 18,235,147, 22,252,
-249,127,249, 58, 94,188,120, 6,239, 61,230,105,132,247, 13,142,135, 29,246,187,107,144,111, 48,143,199, 56,110,230, 5,103, 93,
-143,160, 23,122,136, 0, 12, 18,244, 93,135,113,158,177,159,102, 52,109,139,192,130,109,223,227,222,102,131,166,237, 48,143, 35,
-198,195, 62,170,176,125,135,237,197, 67, 56,231,112,241,202,107, 88,200, 97,154,166, 56, 10, 36,160, 73, 74,121, 79, 62,118,110,
- 4, 28, 67,236, 4, 27,231,113,222,123,108,218, 6,227, 18,176, 59, 76, 0, 39,101,183, 58,161, 4,141, 3, 90,239,193,228, 98,
-176, 75, 88,208,122,135,205,102, 3,118, 14, 97,153,113,152,103, 32,137,149,198,113,196, 97,191,195, 52,142,241,251, 10,177, 16,
-200,156,237,248,249, 6,132,101,198,241,176,199, 97,127,192,251,191,248,176, 62, 48, 45,140, 70,202,238,146,236,121,148,247,205,
-185,163,225, 18, 85,115,234,127,172,167, 90,100,206, 86,213,120,104,222,192, 74,116,169, 6,141,244,107, 44,254, 53,235,151, 84,
-157,142, 74, 48,162,251,113, 41, 38, 59,169,208, 69, 84, 92, 45, 66, 6, 58,179,118, 30,213,250,165,162,183, 53,255,220,164, 35,
- 10, 75,100,181, 39,118,185, 6,198,176,237, 78, 81,206,247,204,243, 80, 61,151, 84,231,143,242,221, 97,166,106,142,170,117, 6,
-103, 77,128,218, 70, 69,207, 14,139,168, 85, 33,109,190,135,132, 79,168,110,121,156,238, 93,122, 30, 93,218,137,167,164,207,252,
-249, 59, 87, 4,184,164,168,216, 84,220,166, 11, 63, 47, 62, 69,106, 8,155, 88,253,151,249, 12,215,221, 59, 86,255, 63, 51,242,
-213,194,109,254,108,151, 83,212,148,144, 99,196, 26,214, 63, 92, 42,166, 90,189, 92,115,124,205,222,221,160, 5,217, 66,245, 69,
- 84, 64, 37, 85, 70,182,156, 30,126,145,177, 87, 30, 48,174, 49,133,156, 69, 8,186, 3, 90,169,186, 33,166,234, 1,222,126,251,
-117, 52,253, 22,206, 55,184,115,118,134,179,174, 73,254,242,168,186,245, 77,131,179,109,135,123, 33,224,242,102,135, 97,156,227,
- 1, 34,140,179,205, 6,207,158,124, 10, 2,112,115, 60,226, 48, 12,137, 38,183,164, 11,193, 97,219,247, 0, 57, 76, 75,136,120,
-216,148, 31,124,115, 28, 32, 18,241,153, 65,128,166,105,209,180,157, 78,150, 41, 33,222,234,248,195, 20,216, 97,198,240,122,209,
-186, 21, 71,186,190,126, 87,147, 17, 90,253, 92, 76,193, 39,116, 26, 61,105,197, 36, 73,216,161,120, 87,195,116,135, 72, 77,137,
- 75, 36,225,124,161, 49, 83,164, 14,102, 24,114,229,163,143,251,226,138,181,105, 29, 12,100, 56,247,122, 17, 22,223, 48,137,172,
-227,203, 77,213,169, 78,109,211,153,203,234,243,170, 52, 70, 38,184,198, 25,204,236, 74,145, 47,165,155, 22, 51, 20, 41,122,146,
- 58, 24,137,168, 38,226,173, 98, 4, 19,144, 39,175,197,164, 40,201,177,130,208,153, 28,131,248,238, 80, 5, 68,201, 35,122, 72,
-220, 63,254,231, 63,249, 43, 92,190,120,138,174,235,176,204, 51,124,211, 98,127,243, 18,243, 52,198, 78,117, 60, 34, 44, 51, 56,
- 44,216, 52, 45, 68, 34, 18, 54,132,136,226,108,218, 22, 65, 4,215,199, 1,190,105,240,234, 43, 15,240,214, 59,159,195,253,205,
- 6, 30, 20,163,132,143, 7, 56, 2,218,166,197,230,252, 1,182,247, 95, 65, 8, 35, 38, 1,174, 46,159, 65,150, 25, 20, 22,244,
- 77,135,243,243,123,216,158,223, 67,231, 60,218,134,112,224, 0, 22, 66,215,120,156,117, 30,142,128,121, 98,200, 28, 98, 74, 98,
- 42, 84, 85,159, 66,208,226,201, 3,104,211,106,106, 10,140,113, 26,225, 16, 53, 43,141,115,104,210,103,190,113, 20,125,241,233,
-144,142,104,209, 88, 80,119,109, 27, 61,193,249,176, 15, 65,217,247, 63,252,201,251, 74, 43,139,122, 29, 41,127, 9, 25, 10, 92,
-221,181, 49, 75,201,204,214,206,177,214, 32,213, 97, 63,114,114,176, 23,247, 66,236,246, 51, 95, 60,190, 43, 92, 46, 4, 65,241,
- 64, 59, 67,106,172,186, 72,134,149, 74, 21,241, 26, 27,162,167, 9,131, 49, 34,228, 24,192,101, 58,206,234,130,225, 19, 65, 51,
- 86,150,226,114, 55, 36, 94, 59,115, 36,225, 57, 50, 94,119, 49, 22, 91,125, 9,244,215,177,220, 2,196, 90,229, 32,184,212, 28,
- 57,251, 22, 26,238, 73, 57, 83,216, 72,148,196,196, 76,139,102, 18, 8,193,176, 81,146,109,218,140,227,243, 46,189, 48, 85,130,
-201,163, 72,119, 18, 25, 37,191, 94,232,190,182, 75,174,191, 87, 41,246,180,250, 2,207, 90,134,178, 7,146,180, 66, 97, 29,207,
-179, 41, 6,202,239, 25, 5,147,235, 8, 41,195, 92,149,202,148,111,252,194, 26, 48, 47,167,145,151, 70, 12,194,154,202, 83,132,
- 5, 82, 29,200,164,223, 36, 89,160,131,148,224, 18,210,221, 72,250,106,152, 34,132,131, 11, 81,139, 88, 13,238,122, 0, 72, 46,
- 52,148,202, 19, 63,144, 63,252,131,223,135,219,156,193, 35,165, 26,145, 67,239, 61, 26,239,208,182, 13,124,219, 98,187,237,241,
-128, 3,110, 14, 7, 76,243, 2, 1, 97,119, 56,194, 57,194,111,124,229,183, 99,188,106,219,226,122,127, 72, 42, 94,209, 14,124,
- 14, 11,156, 35, 12,211,140,155, 97,196,179,235, 27, 28,231, 5,125,215,198,128,151, 20,207,122,239,222, 29,189,192,197,137, 58,
- 4, 50,109, 45,138, 67,228, 20,144, 96, 46, 48,151,213,216, 14,149, 32,171,198, 57,175, 4, 34, 85,215,110,196, 93, 68, 39,150,
- 14,231,164,138,218,189, 5,155, 86,180, 99, 6, 6, 3, 77, 18,202, 23,123,210, 67,228, 42, 61,147, 9,237, 97,151, 71,217,118,
- 4,149, 75, 80, 99,185,203, 2, 52,253, 57, 19,157,242,229,181,115,226, 50,170,207,158,206,202,206, 95,166, 1, 98, 61,145, 10,
- 48,130,225, 34,148, 26, 51,171,133, 43, 1,242, 58,195, 92, 57,237, 53,113,207,242,244, 75, 12,104,205,124,215,175,137,185,116,
-127,149,143, 56, 57, 14,178, 85, 41,137,233,254,243,159,254, 85,228,224,139, 96,216,239,176, 61, 63,199, 97,119, 29,199,230,243,
-168,227,189, 37, 4, 92,244, 61, 66,178,251, 44, 75, 28, 73,187,198,225,102, 24,112,118,182,197, 91,111,188,130,251, 15, 94,197,
-120,152,240,232,163,143,176,159, 38, 72,152,209, 80,212, 47, 52,155, 59,184,247,214,123,184,255,230,155,184,186,126,142,227, 97,
- 7,199, 1, 88,102,108,218, 22,103,222, 3,203,132,105, 58, 96, 28,174, 48,201,130, 33, 8, 90,223,160,107, 29, 90,239, 48, 46,
- 64,219,157,161,233,182, 16,231, 13, 5,145,147, 16, 50,126,110,222, 57, 93,193,229,206, 95, 0,132,133, 17,166, 41,158, 67,190,
-129, 39,194, 44,145, 80, 23,210,193, 26, 36,126,191, 97, 89,176, 76, 19,132,227, 40,120, 89, 22, 61, 80, 67,190,216,199, 17,159,
- 62,126,150, 14,108, 41,171, 30, 5,104,149, 81,120, 1,152, 72, 53, 60,140, 48,165,250,189,163, 91,115, 95, 88, 51,189, 53, 92,
- 40,239,199, 87, 98, 79, 50, 65, 86,172,248, 83, 87,179, 10,168, 48, 14, 42,113,166, 5,173,176, 29,154,146,253,165, 57, 26, 68,
- 29, 26, 81,144, 12,176,233, 48,117, 77,165,177,160,108,212,244, 92, 28, 72,249, 51, 15, 1,141,143, 49,177,164,207,170,168, 0,
- 47,149, 17,122,167,216,130, 32,158,215,168, 4,100,249,247,119, 41, 98,182,236,217, 93,129,240, 72,177,156,102,197,120, 97,162,
-144,117,158,150, 56, 39, 49, 36, 58,150,242, 87,197,225, 79, 23,127,178,228, 89,251, 97,113,241,148,115,196,121,127,114,246,194,
-174,116,164, 88,149,173, 71,191, 16,250, 80,222, 1,172,248, 35,171, 81, 61,219,127, 38, 12,255, 7,255,253,255,240,191, 86, 7,
- 17,149, 46, 32,143, 77,148,154, 99, 46,230,148, 13,149, 22,245,140,146, 87,203,133,174, 99,246,230, 57, 83,187, 36, 35,145, 86,
- 56, 88, 65, 2,106,143, 17,105, 85, 84, 46,152,156,221,107,236, 38,102,167, 76,213, 69, 81, 34, 21,243, 7,210,245, 27, 12, 87,
- 47,209,128,225, 8,216,186,184,191,236, 26,143, 69, 4, 77,194,200, 98,156,112,195,130,105,142,208,152, 16, 24,199,155,235, 20,
-255, 23,127,251,174,241,232,210,168,114,156,102,244, 93,135, 97,154,113,113,118,134,253, 48, 33,136,224,124,179,137,123, 66, 16,
-124,211,226,252,252, 14,190,250, 91, 95,196,102,211,199,164, 31, 67, 63,203,136, 69, 29, 57, 57,167, 23, 90,180,190,230, 17,124,
- 18,126,145, 1, 40,100,104,154,118,165, 53, 11,190,208,143, 92,241,206,234, 5,238, 42,253, 65,137, 57,205,129, 46, 40,127,191,
- 26,201,231,110, 62,139,134,138, 13, 36,177,250, 83,113,226,114,150,120,190,140,205, 14, 95, 86,184, 54,235,129,181,130, 25,107,
-231,201,149, 49,197,228,136,149, 29,169,142,172,165,180,123,183,211,138,156, 38,149,179,168,173,118, 64,173,109, 89, 0,229,240,
- 25,226, 54,152,192, 34, 84, 65, 68,250,190,172,196,142, 48, 97, 60,148, 24,216,164, 57,109, 98, 38, 20,201, 30,117, 75, 88, 12,
-165,125, 38,129,240,209, 71,159,226, 47,254,242, 27,120,246,228, 19,188,120,250, 68,245, 35,211, 56,168, 16, 46, 11,213,230,101,
-193,189,237, 6,227, 18,224, 17, 15,169,166,139, 43, 34, 1,225,225,221, 11,244,103,119,177,219, 29,113,220,221, 96,152, 70,128,
- 99, 23, 29,213,200, 45,250,187,247, 49, 47, 19, 14, 47, 62,197,245,229, 51,116,109, 11, 10, 75, 4,202,164,104,226,217, 55, 96,
- 48,182,125,131,227,184, 96, 1,161,111, 26,116, 13,225, 56,205,232,218, 45, 54,109, 11, 98, 70,211,118,170,134,143,103, 75,122,
- 30,157,143, 7, 55, 74,247,235, 41, 22, 4,217,119,221,166,159,251,229,113,196,200, 1,158, 28, 46,206,206,209,247,125,180,190,
- 37, 10,157, 13,218, 40, 0, 34, 87, 2, 79,136,208,180, 45,174,119, 71,252,250,175,189,107,154, 26, 3, 48,114,182,184,165, 82,
- 88,167,159,177,179,106,212,181,242,157,232,116, 24,233,116, 30, 87,240,184,222, 85,252,127,123, 25,228,131,223, 59,111,132, 29,
-165,130, 39,177, 98, 59,172,132,115,229, 12,132,161, 68,102,192, 24,169, 16,217, 50, 50,196, 32,141,141, 10,202,196,102,219,212,
- 71,123,111,112, 96,248,198,195,147, 47,188, 18, 41,150,183,188,207, 86, 43,168, 90,151,169,154,178,170, 55,155, 67, 34,214, 37,
-158,126,101,113, 19, 59,168, 48, 5, 77,185,207,200,149,136, 91,164,179, 20,213,132,148, 74,240,149,161,198,169,162, 32, 93,248,
-228,140,151,102,165, 89,202,172, 7,205, 68, 23, 3,232, 90,217,133, 51, 96, 41, 95,196,178,182,105,175,120,244,113,109,101, 86,
- 54,186,234, 43,227,251,204,226,111, 84,240, 36,197,227,103,197, 9,229, 48, 53, 95, 32, 11,196,231,195,155,205,195,207, 5,143,
-111,144,163, 85, 7, 95, 61, 88,117,100,107,125,177, 83, 17,240,145,217, 0,165,189, 57, 73,206,179, 37, 99,224, 79, 13,123, 14,
- 58, 73,222,205, 74, 20, 69,130,135, 15,238,227,121,202,198,118, 18,133, 27, 77,227,163, 15,183,241, 8,233, 75,190, 56, 19,244,
-195,128, 71, 75, 20,165,197,248, 70,160,239, 58,132,176,160,239, 58,108, 54, 27, 92, 94, 93,193,251, 6,211, 60,225,250,229, 53,
- 30,222,189,131,109,215, 1,216,227, 48,205,184,179,221, 96, 78,179,246,198, 55,232, 55, 91, 60,124,112,207,120, 50,171,192,180,
-250,129,169, 4, 47,241, 27, 19, 41, 12,232,248,107, 92, 10,143, 40,241,134, 49,240, 37,167, 74,145, 81,200, 83,165,204,177,249,
-234, 21,231,154,204,108,192,225, 22,216, 74,197, 91, 65, 9, 21,141, 5,157,115, 57, 61,172,196,131,114, 94,233, 80, 81,115,154,
-135,162,138,240,101,243, 51,101,115, 9, 59,179, 67,211, 17,100,222, 99,155,231, 71,117, 5,249,171, 99, 54,187, 67,214, 23, 39,
-239,165,156,249,236,236,203, 72, 84, 68, 70,122, 72,172,172, 10,146, 39, 8,102,170, 65,249,185, 43,153, 13, 39,134,101,213,130,
- 16, 78,160, 63, 5,217,204, 37, 59,153,234,181,215,167,143,159,227,235, 95,255, 22,246, 55, 87,152,199, 1,112, 14,119,238,221,
-199,225,176,199, 60, 69,214,185,181,172, 30,199, 17,247,207,207, 49,204, 51,136, 3,154,174,197,110, 26,177, 28,102,204, 33,224,
-238,249, 22,135, 49,128,111,158, 96,225, 0,225,116, 81,145,195,152,167, 39,203, 0, 63, 79, 58,238,111,200,129,231, 9,103,119,
- 30, 98, 26,118,216, 79, 19, 54,173,195,157,158,112,121,240,216, 45, 13,200, 51, 46, 26,194, 24, 24,187,113,198,118,179,141,151,
- 23,199,145,184, 44, 19,154,182,131,235,163, 34, 63, 36,251, 27,133, 37, 70,222,146, 75, 81,159,177,231,244,136,176,154,145, 25,
- 65, 24, 35, 3,158,128, 59,109, 27, 15,203,241,136,208, 52,104,219, 14,219, 59,119, 1,231,112,216,199,104,216,101,137,170,124,
-181,125, 54, 13, 56, 4, 76,211,132,113, 24,112, 60, 30,177,219,237,113,247,206, 69, 69, 50, 20,145, 24, 12,148,198,250,249,113,
-209,243, 78,202,197, 38,148, 19,245,168, 36,239, 73,241, 60, 11,234,221, 13,131, 77, 3, 85,112,197,249,221,208, 8, 82, 51,114,
-175, 28, 21, 86, 24,167, 78, 15, 27,196, 98,112,177, 86, 44,171, 29,122,217,161,151, 9, 91,205, 77,180, 35,107, 74,177, 46, 26,
-255,201,209, 34,202,136, 97, 46,129, 3,154,166,137,105,107,201,249,148,221, 3, 57,212,132, 53, 87, 61, 93,100, 40, 43, 46,187,
-238,146, 10, 35, 46,122, 97,102, 46,175, 3, 3,206,171, 22, 37,152,119,209,144,239,181, 49,201,162,198,181,174,160, 46,176, 57,
-158, 85,137,186,151, 3,174,242,254, 62,168, 74,190, 64,113,178,133, 47,218,234,120,197,164,119,128,178, 89,105,109,137, 56,225,
- 75,192, 0,198,178, 80,146,243,255, 54, 12,121,251,107, 45,186,176,209,168, 70,243, 47,117,116,152, 47,117,103,189,186,214, 40,
-111,216,186,213,227, 81,234,220, 42, 66,215,238, 54,243,201,200,180, 74, 89,171,111,141,106,103,108, 96, 55, 98,195, 74,242, 1,
- 77,164,105, 98, 82, 81,184,168, 98,162,239,111,118,250,117, 58,135,168,132,117, 14,222,124,127, 46, 1, 91, 22,191,193, 23,198,
- 25,143,164,193, 60, 47, 56, 30, 99,178,213,166,235, 48, 45, 1, 56, 30,113, 24, 39,108,123,194,118,179,209,238,224,233,213, 53,
- 56,237,209,135, 57, 96, 14,140,182,237,208,118, 29, 54,219,109,133, 65, 36,114, 85,230, 86, 29, 36, 64, 0,130,138, 66,228,132,
-144,145,178,213,205, 68, 34,255, 80,156, 73,213, 3, 25,245,182, 62, 48, 46,185,108,168, 86,135,147,185,166, 75,150,103,113, 52,
- 0,183, 57,111, 83,193,151,179,137, 83,209,144, 47,114,103, 20,249, 84, 10,128,162,182, 53, 86,188, 4,123,208,184, 66,125,200,
-115,129, 80,252,230,241, 48, 36, 19, 61,103,205, 0,183, 12,199,205, 56,143,178,130,184, 82,177, 75, 69,125,202, 84, 49,192, 68,
- 43,117, 0, 0, 32, 0, 73, 68, 65, 84, 82, 68, 45,153, 52,180, 58, 92,214,161, 80,164,136, 76, 52,196,109, 48, 50, 85,249,150,
-113,155, 93,124,229, 8, 93,178,234,100, 67,100,252,214,119,126,128, 95,253,234, 3,236,174, 95, 98, 30,199,216, 29, 15, 19,142,
-251,155,106,223, 63,142, 35,186,190,199,126,119,133,187,219, 11,204,209, 88, 11, 34,193,203,155, 29,166,176,224,206,217, 57,206,
-156, 67, 24,135,200,219, 38, 96, 14, 28, 9, 93, 16,108,186,216, 29,231, 60, 5, 74, 43, 36, 1,192,222, 3, 68,184,217,189,192,
-121,223,224, 98,219, 96, 63, 17,194,228,225, 27, 66,135, 25,210,182,184, 62, 30, 65, 0, 90, 34,240, 60,226, 48, 14,112,190,193,
-102,123,134,134, 36,194,100, 28, 1,222,195, 81, 15, 94, 60,166,121, 4, 88,224, 93,201,149,166,212,213, 70, 37,125, 12,132,105,
- 28,225,254,182,195, 18, 4, 1,130,144,152,246,243,178, 96, 24, 7, 52,253, 6,112, 49,234,152, 37, 82,236, 60, 0,113,177, 40,
- 32,102, 56, 14,152,166, 1,243, 52,226,167, 63,255, 21,126,247,159,127, 69, 35,110,137, 13,158,148,147,195,193, 4,191,104, 31,
-155, 99,137,129,168,125,160,148,193,183, 42,234,170, 20,191,148,135,174, 69,183,137,179,214,211, 50,243,220, 51, 46,214, 54, 63,
- 85,111, 36,122,129,174,137,104, 5, 78,105,150, 61,230,108, 46,227,247,100,213,162, 26,178,147,237,108,229,191,141, 93, 60,231,
-201, 96,214, 47, 4,134,111, 92,137, 27, 78, 89, 17,217,209,146, 51, 36,200,138,177,141,248,148,236, 74, 46, 21,238,193,228,144,
-103, 38,186,102,210, 75,116,214, 72,154,230, 57, 17,112,202, 43, 95,107,133, 74, 31, 41,167, 75, 17, 41, 98, 88, 85,214,235, 69,
- 77,112,228, 43,231, 79,158, 34,144, 17, 36, 58,231,226, 58, 71,114,168, 78,178, 26,178, 65,151,175,148,235, 82,209, 86,197,220,
-231,172, 20,193,138, 60,192, 92,236,140,234, 0,176,110, 51,160,177,163,134,210,249,136,102, 82, 51,135, 2, 71,209, 51, 47, 95,
-246,117, 8,131,109, 77,116,160, 99,207, 89, 46, 5,129,216, 29,178, 13, 62, 88,177,157,236,239, 95, 58,118, 54, 42, 77,210,221,
-135,147,188,155,113, 37, 46,148,163,223, 89,210, 15, 64, 68,176,191,222,193,167, 14,213,147, 3,131,177, 8,161,115, 4,242, 0,
-147,131, 16, 33,136, 71,239, 28,150,174,193,239,189,251,155,248,252,191,248,125,252,241,127,252,223, 33,194,216,244, 93, 2,113,
- 52,216,164, 36,183,121, 24, 98, 87, 51,207,104,156,195,113,158,241,234,221, 59,152, 57,238,144,157,115,232,250, 13,190,248,222,
-187,182, 57,211,177,172,203,104, 65,147, 11, 85, 63, 6, 89,209,238, 42,133,152, 22, 97,137, 57,112,170,238, 46, 23, 94,177,159,
-185, 21,227,178, 72,181,116, 61,146, 59,125, 87, 14, 38, 50, 35,109, 54,117,133,157, 24,217,175,157, 56, 39, 28,185, 98,193, 99,
- 90,185, 35,140, 8, 73,202, 56, 91,173,118,217,143,235, 92,196,194,166,125, 90,238,238, 57,249,210,245,106, 22,170,199,143,121,
-114, 81, 9,252,160, 30, 83, 79, 84, 58,135, 84,152, 88,102, 0, 37, 32, 7,165, 44,101,162,181,184, 51,249,128,189,171,114,216,
- 79, 28, 77,153,115,189, 50,213,229, 73,147,172, 10,108,151,139, 36,162,106,116,247,254, 47, 63,198,135,191,250, 0, 55, 87,151,
-152,166, 17,146, 66, 49,178, 27,195, 37,111,247,113, 56,194, 55, 13,134,227, 1,119,182, 23,152, 69,224,195,132,113, 26,177,112,
- 28,227, 62,232,207, 99, 87,159, 4, 88,206, 55,154,112, 5, 34,252,243,175,126, 25,125,219, 32, 44, 11,126,249,241,167, 56, 30,
-142, 88, 56,164,116, 67,143, 70, 98,142, 1, 46,238, 99,129, 67,215,159,227,108,220,131,120,192, 60, 7,236,198, 9, 30, 51,238,
-111,123,156,111,207,192, 16, 76,105,234, 21,194,130,221, 97,192,196,192, 22,128,155,167, 56,114,247, 30,174,235,193,132,184, 7,
- 23,192, 59, 82,245, 57,167,207,200, 17, 97,145, 56,154, 27,230, 72,155,227,180, 0,140, 25,221, 81,224,180, 76, 19,154,182,197,
-102,179,213,221,169,115, 62, 30,144, 33, 9,209, 88,176,204, 11,166,105,194,199,143, 30,227,119,254,217,151,225, 77,176,135, 13,
- 73, 21,147, 52, 72,150, 86,166, 69, 95,140, 74,214,179,206, 20,155, 98,245,231, 73, 82,196,233,103,145,247,193,165, 81, 33, 21,
- 70,185,180, 55, 70, 53, 70,135, 33,125,196,119,173,236,128,217,168,226,139,208, 74,170, 6,201,126, 77, 82,172,110, 22, 70, 37,
- 38,116,134, 68, 51,203,137, 24, 34, 46,249,211, 69,217,227,200, 43, 67,142, 90,161,204,114, 40,174, 17, 19,227, 78, 92,209,151,
-108,162,154,194,148, 2, 39,127,187,139,151,123, 28, 3,166,115, 40, 19, 50, 83,248,169, 13, 25, 75, 23, 44,173, 96,238, 98,108,
-132,229, 5,175, 3,149, 11,220, 44,234, 42,188,243,201, 46, 77, 70,227, 83, 2, 98,226, 90,202,155, 93,119, 60,115,157,147, 85,
-186, 26, 27, 75,222,122,228, 89, 52, 68, 76, 53, 55,148,140,107, 66, 93, 72,134, 25,159, 87,132, 57, 77,178,193,138, 4,151,105,
-107, 98,208,175,217,134, 68, 43,168, 65, 21,203,153, 68,111, 2,210,234, 12,130, 83,240, 6, 12, 55, 60,125,160,164,237,252,202,
- 87,109,163, 61,197,118, 49,100,196,118,133, 56, 39,148,247, 61,241, 98,231,116, 41,101,236, 97,222,229, 12,199, 67, 74,208, 17,
-120, 8,230,244,133,118,141, 67, 88, 24,147, 56,144, 99,108,186, 54,210,130, 2,240,202,107,175,225,243,239,188,139, 78, 24,187,
- 16,240,241,179,231,120,253,193,125, 12,227,136,190,239,193, 44,120,124,243, 18,239,190,250, 42, 0,193,163,151, 55, 8, 34, 17,
- 13,155, 94, 72,239, 27,244,253, 6,175, 60,188, 95,162, 25,242,133,236,110, 91,215,202, 41, 35, 92,119,124, 37,190, 49, 63,220,
- 36, 5, 82, 97, 91,250, 74, 66,102, 0, 12,170,218, 92, 13,209,201,116,250,121, 97, 38,168, 35, 27, 37,119, 48, 85, 26, 85, 29,
- 65, 9,170,220,188,105,236,110, 14, 9, 6,114, 84,252, 90,205,110,193, 25,113, 87, 84, 68,114,148, 94,218, 19,167,183,156,194,
- 62,212,170, 67, 92, 44,111, 25, 78,195,150, 33,205, 41, 90,145, 78,220, 24, 44,133,245, 25,145,183,164, 49,177,234,243,173, 58,
-108, 42, 21,247,202, 15, 92,234, 10,210, 40, 93, 49,140,110,202, 47,175,138, 15, 21,154,167, 44,236, 31,255,248,103,184,185,185,
-198, 52, 77, 88,150, 0,146, 0, 78,194, 36,145, 8, 55,202,201,137,228, 90,116, 68, 24,231, 9, 14,140,221, 56, 97, 10, 11, 94,
-185,123, 15,135,221, 13,134, 49,122,207,137, 8,173,111, 18,187, 26,216,158,109,240,191,252, 79,255, 14,243, 50,227, 79,254,226,
-175,177, 76,179,230,172,119,222, 65,252, 6, 23,247, 94,193,249,221,251,216,108,123, 92,191,188,196,116,184, 6, 79, 87,104, 28,
-112,113,126,129,205,166, 71,215,117, 56, 63,219,226,252,236, 12,119,206,207,209,118, 29,188,111, 48, 14, 71,140,243,140,221,225,
-136, 71,143,159,224,249,229, 75,192, 53,112, 28,192,243, 2,161,152,248,230, 0,132,101,142,248,216, 68, 98, 4,128, 37, 29,246,
- 44, 64,200,185,216, 4, 44,169,115, 89,230, 25, 2,192,251, 6, 93,215, 65, 66,192, 50, 28,225,219,174,132,249, 52,190, 20,119,
-204, 16, 9, 88,230, 9,243, 52, 99,158,103,184,190,139,227, 90,179,255,214,227,201, 25, 58,150, 29,173, 39, 70,131, 19,210, 11,
-213,166, 36,210,202,109, 18,210,197, 83, 74,202,248,107,243,152, 94, 71,188,142,170,137,150,158, 23, 5,245,102,136,132,230,141,
- 52,255, 14, 70, 60, 87,197,197,210,122, 5,202, 41,254,217,128,152,170,108,137, 50,159,136,226,100,214,115,163,201,251,100,152,
-196,194,188, 26, 83,199,147, 84,250,157, 92,220, 87, 23,157,148,247,179, 10,108,202, 2,237,156,206, 38, 4,231, 56, 1,185, 98,
-231,174,209,225,170,159, 32,213, 95, 59, 49,159,143,142, 39,235, 36,198, 28, 18, 83, 24,238, 73,224, 75,165,217, 21, 69,189,198,
-200, 88, 65,164,230, 5, 46,121, 19,242,255, 51,246,102, 49,147, 37,217,125,223,255, 68,196,189, 55, 51,191,173,170,186,186,122,
-159,153,158,141, 51,228,112, 56, 36, 77, 82,180,185,136, 20, 53, 92,134,148,105,136,162, 68, 83,134, 8, 25, 22,228, 23,235,197,
- 50,252,174, 87, 3,178, 97, 64, 15,134, 1, 91, 54, 8,217,178,108, 3, 38, 96,195,162, 65,147,162, 52, 20,101, 15,105,115,155,
-133,156,233,233,158, 94,171,107,249,214,204,188,247, 70,156,227,135,216, 78,220,252, 26,240, 67,205, 84,119, 87,229,151,153,247,
-222,136, 56,231,252,255,191,127,224,198, 10, 88,195,202,180,213, 16,141,243,161,236,234,213,234, 31,187, 43,121,205, 47,226, 56,
- 86, 2,234,220,205,139,127,206,213, 86, 76, 22,177, 45,120,239,233,100, 96,108,125, 97, 82, 92,222, 40,208,136, 24,194,120, 63,
-100,160, 8,169, 55, 77,109,112, 22,213,249,141,226, 20, 52, 45,200, 6,120,112,155,233, 30,104,124,158, 77,138, 28,234, 33,129,
- 23,148, 47, 0,240,201,146, 99, 96, 96,133, 17,136, 64,150, 96, 28,197,137,157, 0,134, 5,166,179,120,254,219, 62,139,175,127,
-229,247,113,118,239, 62,166,253, 22,207,110, 58,224,114,198,233,157, 59,120,246,249,151,241,229,175,126, 25,230,102,139, 59,199,
- 71,248,240,131, 7,120,120,113,137,144,110,170, 77,223,163,239, 58, 60,221,238,225,156,131,117, 14,174, 27,234, 97,132, 76, 83,
-209,229,121,221,129,186,101, 81,241,137,174,206,117,148, 39, 81,107,249, 58, 72,114, 51, 53,108, 65,106, 11,156, 68, 1, 41, 84,
-116,168,126,254,117,235, 74,100,225,157, 93,192, 44,164,137,154, 32, 44,185, 9,121, 86, 92,178,223,179,112, 47, 19, 57, 75,181,
- 94, 41,105, 69, 39,161,231,235,165, 74,146, 66,158,203,249,234,229,154,243, 50, 33, 37, 61, 0, 12,176,132, 74, 8, 75, 21,121,
-185,111,115,251, 62, 45, 66, 69,148,169, 32, 10, 84,232, 99,212,160, 38,245, 93, 44, 45,162,187, 30, 52,106,135,173,220,251,154,
-189,191, 20, 5,230,143,241,165,255,231, 79,112,115,125, 9, 63, 79, 41,254,215, 67, 56, 64, 56, 83,185, 98, 85, 59,207, 62,126,
-167,243, 24, 17,177,211, 8, 31, 2, 86,235, 53,250,253, 30, 55,215, 87,240, 92,127,150, 35,130,103, 70, 16,193, 39, 94,125, 5,
- 63,254,195,255, 6,126,237,159,254, 6,158, 60,121, 18, 71, 11, 68, 24, 67,236, 70, 16, 17, 48,143,120,250,240, 91,120,244,238,
-235, 56, 59, 57,194,199, 63,252, 10, 78, 94,124, 5, 67,223, 99,189, 90, 97,179,217,224,232,248, 4,235,245, 10,125, 63,192, 57,
- 91,220, 11,100, 29,198,113,196,148, 18,226,166,105,198,245,205, 46, 86, 59, 44,112,253, 58, 6,201,248, 0,107, 93,180, 30,205,
- 35,140,173,156,127, 6, 67,199,243, 76, 41, 58, 57, 32, 66,154,108,170,248, 69, 4,211, 52,167, 24, 78, 66, 24,247, 48,214,162,
-183,209,249, 18, 18,229,142,147,173,111,158, 38,248,121,194, 27,223,122, 7,159,248,248,135,171, 3, 69,170, 78,165,182,166,234,
-120, 49,143, 78, 41, 85,105, 76, 90,252, 72, 85, 17,175,179,149,210,198,145, 29, 52,197, 62,153, 54,231, 58,179, 53,165, 67,154,
- 31, 68,105,194,175,164,128, 96,170, 88,127, 73,120, 92,136, 82,245, 56, 53,219, 64, 69, 5, 23, 47,136,148, 82,149,118,213, 36,
- 66, 85, 9, 15,170, 16, 22, 73,142,151,156, 62,168, 11,190, 18,146,147,158, 91,163,109,178,104, 5,100, 57, 57, 51,166,100,107,
-164,148,168, 76, 7,170, 93, 78, 50, 49,199, 94, 12, 40,132,194,101,175,197, 70,205,168, 47,159,180,224,156, 81,112, 94,180,176,
-207, 9, 75,113, 24,229,249,118,182,163, 69,141, 19, 33,248,248,243, 10, 55,128,121,193,151,168,135,116, 13,148, 44,162, 57, 53,
-251,207,164,189,194,155, 74, 95,240, 50, 79, 93, 33,191,212,201,203,192,233, 31, 90, 78, 37,138,238, 85,198,245,140, 82,129, 84,
- 37,116,158, 9, 82,115,179, 66, 14,150,182, 67, 90, 26,164,153, 75,166, 9, 47, 88,181,167, 22,196, 88,117,162,164, 6,128, 67,
-210, 38, 95,197,174, 80,190, 24, 84, 91, 39,169,138,117,185, 66,229, 88,169,147, 33, 56, 2, 56,196,155,191,235, 29,104,142, 11,
-220,211, 71,239,161,179, 29,238,220,127, 22,219,203, 75,116, 93,135,123,199,107, 92,239,110,240,229, 63,250, 3,152,190,135, 49,
- 6,151,187, 61,222,122,114,129,211,163, 53,134,174,199,126, 63,161, 3,225, 98,187,139, 65, 11,198,162,239, 7, 60,115,247,172,
-197, 53,146,214, 48, 84,157, 0, 26, 43,160,134,210, 36, 37, 44, 71, 21,124, 21, 73,152, 3,144, 92,117,108,228,160, 11, 46,162,
- 25, 67, 21,224, 16,231,103, 9,242,152,198, 42,149,235,172,165, 12,149, 54, 79, 9,135,136,102, 84, 0,149,202, 84, 91,223, 70,
-106,134, 0, 14,238,151, 36,188, 81, 21,188, 44,134,133,149,173, 82,134, 47, 37, 34, 50,207,249,164,248, 64,219,214, 57, 20, 44,
- 36, 47, 56, 7, 36,176, 76,184,106,219, 33,170,205, 73,205,162,216,132,116,136,226,130, 47,139, 32,145, 3,252, 47,160,211,175,
-168, 22, 89, 80, 49,150, 34,109,206,187,234,151, 62,122,244, 4, 31,123,238, 14, 94, 15,123,188,183,223,149,205,136,184, 34, 51,
- 67,202, 68,176, 68,128, 4,236,166, 17,179, 15, 56,219,172, 49,237,182,240,233,189, 5, 97,220, 57, 61,193,180,221, 97,102,198,
- 28, 24, 63,254, 67,223,135,147,147, 83,252,215,255,232,127,140, 29, 18, 67,240, 33,138,180, 28,226, 28,219, 88,139,209,207,240,
-129,241,137, 15,191,132,111,255,228,199,112,124,124,130,213,208, 99, 53,244, 24,134, 21, 86,235, 13,134,245, 26,206,185, 88,157,
- 39,154, 87, 72,139,173, 64,240,171,255,232,127,192,135, 94,121, 25, 63,252,131,223,143,207, 60,125,138,247, 31, 63,197,147,243,
-115, 60,121,122,129,235,212, 98, 29,183, 55, 32, 14,169, 51, 83, 55,212,108,103,138,159, 55,222,179,157, 53, 41, 61, 12, 49, 98,
- 57, 48,200, 68, 46,132,181, 54,218,249, 68,208, 65, 48,141,187,168,186, 79,238,157, 98,247,243, 51,230,121,194,159,126,227,117,
-188,250,234,203,112, 73,105,221, 32,173,203,161, 58,217,176,114,155, 62,117,144, 72, 98, 8,138,100,130,162, 22,177,169,195,114,
-161, 49,102,113, 26,116,244, 43, 43, 77,141, 44,237, 22,139,110,222, 34, 4, 9,139,206, 23,181,112, 34, 61, 82, 16,105, 7,239,
-148, 7,229, 32,245,220, 29,210,110,129, 74, 84,203,194,208,204, 20, 48,121,142,126,240, 55,165,169, 42,169, 1, 69, 81,177, 4,
- 70, 45, 13,165, 13, 61, 44,160, 81, 73,185,158, 94,219,164, 53,132,179, 59, 72, 20,107,197, 72, 75, 21, 85,221,202,178,117, 27,
-237,152,145, 3, 18, 96,229, 64,212,194, 69,202,188, 60,109,182, 33,142, 6, 75, 58,158,138, 39,215, 39,250,246,240,114,144,252,
- 80,191,107,110, 98,123, 22,126,123,141, 71,151,210, 45,201,174, 34, 36,219,103,107,229, 97,110,102, 55,133, 71, 93,132,111,162,
-216, 32,234, 0, 64, 13, 48, 89, 1, 74,104, 33,146,107,137,117, 68,162,120,216, 10, 70,210, 84,232,212,204,162,176,248,223,170,
-118,166,226, 91,103,147,179,159, 1, 50, 21,119,152, 91,173, 62,189,215,206, 18, 70, 99, 64, 44,232, 12, 97, 15,130,181,132, 57,
- 88, 48, 3,211,245, 19, 56,103,112,247,222,125,188,254,103, 95,131,235, 12,122,244, 88,129,240,178,235,112,206, 4,235, 44,110,
-118, 35,238, 30,109, 48, 50, 99,187,221,161,239, 58, 88, 99, 98,170, 20,197, 25, 95,215, 15,248,200,135, 94, 44,135,167,242,157,
-202, 97,200, 64,182,135, 1,122, 67,225,242,240, 68, 15,166, 41,236,241, 18, 8,145,172, 25,208, 27,114,222, 52,149,213, 38, 91,
- 73, 12, 81, 17,255,100,125, 49,193,214, 36,180,116,152,171,190,235,252, 48,196,242,145, 18,115,189, 9, 74, 40,254,122,147, 90,
-235,181,138, 86,126,184,122, 3, 27, 29,137,181,236, 2, 52,238,238, 34,138,169,234, 50,110,238, 13,134,142,138,151,170, 30,102,
-253,125,162,164,130,213,243,160,170,108,148,255,157,132,154,247, 82,233,120, 69, 40,162, 16,142, 82, 21,176, 10,121, 27, 23,200,
- 10, 77, 42,215, 12, 28,171,252,226, 77,149, 69,228,109,230, 45,196, 31,254,222,251,143,225,120,194, 27,239, 94,224,122,187,133,
- 51, 20,239, 47, 22,120, 14,105,150, 71,176,138,228,184,155, 98,212,240, 73,231, 48,237,247,152,211,131,191,247, 30,159,252,240,
-203,120,248,240, 49,230, 16, 48,134,128,159,251,137, 31,193, 31,126,249, 79,241,238,195,247,225, 57, 10,206,186,116,157, 58, 99,
-208,173,214,128, 8,198,113, 15, 14, 1, 63,242,253,223,133, 79,188,250, 17,108,142,142,177,217,108, 48,116, 29, 58,103,225, 92,
-135,110,232,225,250, 1,214,245, 17, 62, 66, 73, 68, 20, 60,254,193,127,249, 15,241, 61,159,251, 78,252, 59,191,244,139,112,206,
-130,189,199,209,230, 8,247,238, 62,131,235,235, 75, 60,124,255, 49,222,120,251, 93, 92,141,113, 49,243,151, 35,108,186,142,158,
-185,116,224,242, 66,105,147, 35, 36,143,186,120,145,182,231,231, 57,182, 37,187, 30, 86, 42,116, 38,152, 0,235,108, 73, 14, 11,
-222,195,219, 25,251,253, 14,253,118,139,243,243, 11,220,191,119, 47, 29,119,235, 72,137,210,117, 53, 37, 67,179, 42,206,145, 52,
- 31, 4, 73,153, 7, 2, 35,166, 58, 86,242,146,154,146,202,140,169, 22, 47, 81, 21, 89,244, 58,155, 67, 27,233, 1, 14,154,138,
-170,252,150,150,222,129, 66,147,154, 30, 40,213, 66, 66,239, 91,164, 55, 96, 53,194, 83,234,248,220,122, 46,164, 75,170,135,118,
- 81,227, 58, 90, 90, 63, 41,138, 8, 13,169, 88,110,181, 41,232,113, 3, 43,177,155, 14, 28, 99,149, 76, 41, 7,208, 45,133,148,
- 21,106,241,182, 77,121,153, 4,102, 73,193, 91,201,170,241, 66,154, 70, 19, 38, 48, 70, 82,107,159,203,161, 18,217,186, 93,108,
-151,181,131,172,181, 73,205,251,100, 89, 4, 96, 45, 59,152,117, 76,199,105,148,156,225,109,198, 80,202,195, 96, 21,130,166, 85,
-242,241, 31,221,146, 76,204,139, 96,138, 66, 50,187,109,163, 21,110, 16,149,203, 54,121, 54, 84, 45,181,211, 5, 34, 98,106,160,
-192, 97,227,178, 77, 35, 82, 62,162,131,217,107, 45, 76, 19,135,184,144, 26, 19,203, 55, 41, 15, 88,226, 76,133, 69,209,146,136,
- 64, 33,142, 23, 88, 16,219,132,204,112,214,148,147,156,120,198,233,157,123,184,190,120, 2,103, 45, 68, 12,172,143,190,246,158,
- 25,179, 15, 48,206,224, 38,169, 88,215,125,143,163,213, 10, 83, 96, 28, 13, 3,246, 44,232,186, 30,171,213, 6,155,205,208, 8,
-192,106, 59,189, 25, 63, 43,107,219, 18,180,151,103,244,181, 13, 85,196, 48, 11,169, 73, 1,164,228, 25, 15, 42,177, 74,255, 16,
-202,226, 66,141,164, 84, 74, 88,168,177, 92,172,226,219, 57,189, 17, 58, 96, 11,144, 66,160, 18, 85,139, 12, 9,221,202, 58,170,
-151,151, 75,162, 95,124,186, 22,239, 41,163,235,146,248,175, 10, 49,147,205, 70,171,221,203, 8, 40,246, 42, 88,205, 1,132,165,
-166, 90,101, 22, 6,113,201, 52, 32, 5,121, 47,175, 37,106,250, 73, 69, 86, 88,208,199,210, 36,122,168,147,125, 99, 81, 82,162,
- 23,245, 64,230,201,170,182,103,114,153,165, 71, 97,215,151,126,239, 15,113,249,244, 9,246,187, 45,166, 57,206,125,125,240,113,
-131, 74,177,183,206,246,133, 8,191,155, 70, 88, 50, 56,114,132,125,136,157, 39,145,104, 43,251,197,159,254, 49,252,254, 31,126,
- 57, 50, 24,152,241,179,127,241,207,227,183,190,248,175,176,221,143, 81,248, 67, 4, 75, 84, 54,246,110,181, 70,152, 70,120, 14,
-232,186, 14, 95,248, 11, 63,140, 15,189,244, 34,214,155, 13, 86,253,128,213,106, 64,215, 15,112, 54,134, 21, 89,231,208,117, 3,
-224, 28, 36, 68,178,216,118,183,197,127,245,171,255, 29,254,246,175,252,114,204, 69,176, 54,162, 90,157,139, 35, 0, 67, 88,175,
- 87,216, 28, 29,227,248,228, 4,223,120,253, 13, 60, 49, 64,223,247,184,122,242, 24,243, 60, 33,176,160, 75, 21,146, 71,134, 4,
- 9, 6,107,192, 0,124,234, 86, 68,165,120, 28,141,176, 8,224, 3, 68, 70,184,174,139,233,112, 57,127, 60,135, 83,169,106,125,
-158, 39,120, 63,227,203, 95,125, 13,255,250, 15,156,193, 16,197, 34,129, 76,169, 12,151,147,197,102,239, 76, 98, 46,134,202, 28,
- 87,150, 50, 74,135, 8,147,252,246,186, 51,153,187, 45, 54, 69,174,234,140, 1,210,197,141,104, 17, 40, 45,170,226,229,252,188,
- 98,111,219,137, 38,171,244,183, 42,206,171,149, 51,107, 28, 90,108, 61,231,141, 23, 53,220, 38,219,204,178,114,157,113,139,216,
-181,104,238,164,118,223,178, 54,133, 52, 43,157, 64,198,168, 89,244,130,214,216, 96,179, 15,117, 71, 58,201,141, 10,149,178,230,
- 86,148,212,187,252, 76, 82,118,230,228,231,186,221,115,138,173, 55, 59,168, 82,137,158, 15, 51,206,162,201,142, 16, 44, 59, 31,
-109, 40,100, 80,244, 58, 86,137,127,229, 14, 72,135,135,156, 94,201,210, 6, 79,149, 70, 74,190,130, 44,109, 30, 20,242,166, 46,
- 11, 33,155,232,152, 76,213, 74, 84, 32, 8, 42,179, 65, 41,254, 95, 82, 40,195,146, 9,124,139,174,157, 72, 18,109,174, 86, 50,
-180,240,200,235,147,221, 18,104,214, 10,239,168,240,226,227, 7,230, 70,226, 79, 28,237, 25,229,148,199, 82, 80,162,164,223, 55,
-153,168, 27, 8, 1,206, 70,229,226,148, 63,135, 35,156,222,125, 6,251,155,203, 56,175, 76, 41, 81,100, 9, 52,199, 56,201,141,
-235,224,230,128,145, 5,251,192,184,218,143,113,209,242, 1,253,176,194,233,217, 93,124,238,179,159, 42, 94,107,105, 30,210,154,
-174,165,195, 61,244,120, 93, 68,146,255, 78,138,250,159, 84, 53,202,233, 53, 50,166,178,196,165,232, 8,211, 20, 10,131,230,193,
-136, 51,109, 40,125, 66,180,242, 72,114, 19,164,198,126,253, 15,200,214,245,144, 43,110, 67, 13,174, 53,127, 54,147, 79,175,109,
-202,233, 45,170,112,237,227,171,200, 75,125,127, 29, 90,232,110,209, 91,152, 58,227,166,172,255,208, 9, 44,138,241, 92,215, 69,
-174,214, 55,137,180, 66, 42, 57, 5,117,246, 64,197,179, 46,213,121, 33, 85,112, 71,214, 52, 85,118,115,231,179, 82, 36, 51,213,
-153,127, 22,231, 41,219, 90,211,122, 79,149,188, 33,194,175,255,198, 23,113,113,254, 4,187,253, 14,243, 60, 99,154, 39,124,228,
-193, 61, 60,189,184,196,251,201,205, 33,130,196, 68,183,216,122,143,149,181,160,224,177, 77, 80, 12, 22, 96,102,198,223,249, 27,
-191,136,175,191,254, 45, 60,122,252, 20, 99, 8,248,228, 71, 63,130,223,252,237,223,193,222,251, 40,152, 75,247,147, 79, 54, 42,
- 99, 44,230,113,143,192,140,251,247,238,226, 39,126,232, 7,240,226,115,207, 98,189,222,160, 31, 6, 12,125,143,190,143, 1, 42,
-174,235, 65,194, 48,206,193,186, 14, 4,130,135,197,126,154,240,235,255,231,111,225,223,255,155,127, 3, 93,223,131,200, 98,156,
-246, 56,127,122, 1,231, 12,120, 26, 33, 32,244,174, 3,109,214,216,221,244,248,182,143,126, 4,231,151, 87,120,235,157,119,177,
-191,122, 10, 4, 3, 17, 95, 58,138, 83,136,173,198,117,103, 49, 37, 37,112, 87, 84,242, 53,190, 20,198,166,152, 90, 6,121, 15,
-114, 93,244,199, 39, 29,130,179, 46, 9,179,226, 63,135,224, 49, 77, 35, 30, 63,126, 10,239,227, 33,134, 68,177, 58, 10,128,132,
- 14,133,172, 70,101, 33,152,172, 57,227,120,120, 72, 55,117,224, 80,158,209,216, 5, 72,221,135,164,113,176,201, 38,120,152, 91,
-144,215,202,218, 59, 16, 85,131, 54,182,227, 3,130, 68, 43,132, 21,197,124,167,197,128, 52,247,163, 66, 10,150, 41,121, 66,105,
-206,159,131,139,114,240, 12,101,141, 10,213, 81,224,225, 70, 28, 63, 79, 1, 81, 49,169,117, 78,199,147, 82,237, 88,201, 33,169,
- 81,154,198, 52,169,161,243, 7, 36, 31, 38,102,124,158, 75,214,113, 34,181,176, 53, 65, 89,199, 72, 47,122,186, 32,146,252,122,
-166, 2,112, 82, 44,170, 70,228,234,108,246, 8,186, 49,233, 64,193,241,126, 80, 56,218, 42, 6, 84,107,155, 72, 19,187,156,219,
-250,121,239, 2,161, 53, 64, 55,169,115,146, 54,117, 13, 62, 41,214,182,101,254, 53, 90, 31,221, 2, 88, 80,126,132,105,133, 0,
-203, 80, 11,109, 79, 43,190, 91, 98, 21, 55,169,210,182,136, 22,234,204, 67, 85,120, 41,108, 52, 85,169,156, 4,165,216, 67,178,
-215,114,220,207, 9, 74, 19, 63,199, 4,128,156,137,221,100,207,240,194,113,142, 38,234, 41, 37,131, 97, 88, 97,119,115, 5, 15,
- 66, 72,138,101,147, 46,152, 33,130, 21, 65, 7,138, 1, 47, 49,109, 5,206,117, 88, 31,157,226,195,175,190,138,207,124,250,227,
-133,210, 86,129, 86,117,220,193,185,157,167, 80,225,186, 93,140,229, 44, 40, 79,202,245,172, 54, 93, 23, 35, 13,191, 71,245,243,
- 99,123,218,136, 89, 60, 44,170,193,152, 91,196,156,219,234,164,148,239,218, 53,153, 53, 10, 10, 18,148, 55,178,102,147, 87, 75,
- 8,181, 93,153, 91,159, 86,137,215, 34,228,185,169,180, 11, 84, 99, 56, 69, 89, 95,170,112,146,204, 65, 24, 77, 78,247,211, 17,
-171, 54,145,250, 88,205,244,137,114, 43,149, 26, 81, 93,190,119,144, 68,125,249,117,114,122, 94, 21,214,201, 1, 57, 76, 20, 12,
-164,160, 97, 27,144,135,134,221,168, 77,157,171,192,232,143,190,252, 13,156, 63,125,132,253, 46, 38,171,117, 4,252,220,143,253,
- 32, 94,123,235, 29,236,247,123, 88,235, 96, 82,198,186, 49, 6,147,247, 88, 27,131, 48, 79, 24, 83, 21,207, 2,244,157,197,223,
-254,171,191,128,253,184,199,111,255,238,239, 99, 10, 1, 71, 71, 71,120,243,205,183, 48,134, 16,171,243, 84,249, 6, 65, 10, 85,
-137,159,110, 10,140,143,125,232, 69,252,216, 15,126, 63,158,189,255, 12,214,171,180,153, 15,171, 56, 55,239, 98,158,129, 37, 2,
-140,131, 75, 66, 52, 78,115,231,175,124,245,107,248,249,159,254,201,216, 1, 19,198,126,158,209, 89,139,251,247,159, 1, 56, 96,
-158,102,236,246,123,236,198, 17, 36,130,231,158,185,135,113,246, 56, 61, 61, 65,223, 57, 56, 8,222,124,243, 93,248,155,109, 57,
- 28,186,180, 72,239, 2, 99,227, 44,118, 41, 69, 46,150,232,105,166,154, 68,190,185, 21,159,103,180,228, 28,200, 24, 4, 31,146,
- 93, 44, 5,117, 36, 23, 65,172,214, 61,174,174,174,241,204,189,187, 21,218, 98,180, 70, 35,197, 61,211, 45,206,148,188,113, 41,
-239,179,144,148,128,145,216, 45,200,163,132,124,192,139,162,185, 22,211, 93,219,251, 37, 26, 36, 71, 21,107,104,147,198,169, 8,
-212,251, 83, 37,156, 74, 2, 36,125,152, 92, 8,147, 5,104, 68,122,121, 6, 28,114,235,185,180,198,169,140, 7, 91,139, 22,183,
- 29, 70,181, 16,113,154,185, 49, 39, 22, 5, 36, 17, 29, 19, 61,145, 80, 44, 91,124, 75,168, 9,229,140,134,236, 43, 47, 12, 7,
- 44, 51,201,210,123,207,213,191,168,141,143,138,152,184, 20,161,233,143,150, 81,162,180,217,116,249,243, 90,107, 35, 82,185,216,
-124,147, 15,189, 10,237, 85,232,143, 84,181, 19, 37, 64, 24, 81, 19, 98, 86, 42,252, 76, 4, 85,225,100,121, 51, 23,104,235,243,
- 18, 65,176, 96,115,100, 75, 91, 99, 87, 78, 45,192,154,166, 86, 43,105, 78, 51,160,218,210,105, 51,191,219, 88,202,165,240, 8,
- 11,118,184,180,226,175,131,230, 59, 62,224,132,134,246, 22,164,197, 33,141, 90,146,118,252,114,211, 28, 86, 8,215, 87,215, 37,
- 9,201,144, 0,214,130, 38, 15, 79,113, 94,187,234, 45,172, 0,222,196, 22, 36, 57, 2,193,162, 27,122,204,227,174,182,132, 67,
-154,187, 88, 7, 33,130, 19,224, 58,204, 48, 38, 42, 42, 45, 69,216, 69, 63, 12,120,245, 67, 47,197, 27, 54,183,221,200, 64,210,
-134,110,210,194, 23,255,191, 42, 87, 35, 53,175, 58, 14,160,218, 86, 84, 34, 62,147,208,134, 9,208, 48, 42,100, 66,154, 18, 90,
-160,162,125,153,242,152, 66,106,254,188,154,241,171, 4,198,220,254, 72, 39,108,211,210,207,154, 3,109,251,157,171, 78,124,250,
-169,105,113, 48,121,163,230, 54,159, 92,210,236,209, 96,129, 72, 36,149,150, 69, 75, 60,125,180,168, 24, 44, 12,151, 75, 83,160,
-148, 60, 24, 78, 66,185, 74,250, 98, 37, 10,226,131,150, 66, 83,213,235,170,128,210,146,217,132, 71, 84, 53,174,198,104,230,238,
- 67,150,232,233, 69,151,149,142, 68, 88, 20,119, 33,206,139,246,227,132,215, 94,123, 29,219,155,235, 24,144, 17, 2,158, 57, 94,
-161,115, 14,157,235,176,222, 28,227, 67, 71,103,120,244,240, 33,246,251, 29, 56,197, 0,123, 31, 98,203, 61, 37,233,173,134, 30,
-191,242, 11, 63, 7,103, 13,254,183,223,252, 29,248,224,113,188,217, 32,204, 19, 38,102,244,105, 1, 9, 58,181, 79, 24,176, 14,
-227,236,241, 61,159,249, 36,126,240,123, 62,135,123,119,238, 96, 88,175,209, 91, 27,171,243, 46,254,178, 93, 95,114,134,156,237,
-224,220, 0, 99, 45,188,247,248,147,175,253, 9, 62,245,241,143, 97,216, 28, 1,193,199,107,192,115,140,226, 76,121, 8,214, 18,
- 86,195,128,190,115,165, 53,233, 66, 64, 55, 77,144, 7, 15,192,204,216,207, 30,227, 91,239,128,103,143, 57, 80, 73,202, 51, 68,
-216,133, 0,103, 44, 30,220, 57,195,245,126,135,203,237,174,156, 85,131,231, 56,114,202,153,215,204, 8, 28,213,243,198, 38, 2,
-154,117,241,238, 73, 45,248,224,163,179,224,155,111,188,131,187,119,239,148, 12, 10,202,112,165, 84, 85,106, 49,100, 93, 63,107,
-151, 17,233,128,156,201,106,156, 53, 75, 66,201,206,153, 70, 8, 28, 17,177,133, 15,161,215, 80,157, 15,112, 27,168, 75,217,173,
-203,154, 75,162,114, 4, 90,112, 84,173,211,129, 67,117,109,181, 77, 69,239,124, 6,192,132,130,176,102,134,106,187, 75, 35,224,
-170,143, 31,181,179,255, 58,197,175,124,115,225,136,126, 69, 28,123, 86,191,187,180,148, 53,169, 85,178,168,194, 2, 77,177, 83,
- 17,208,249,187,136,115,121, 69,223,215, 7,152, 60,166,205,135,246,188, 14,114,197,143,231,152,104, 14,201,127,159, 52, 14, 57,
-200,133,146,112, 41,254, 57, 3, 15, 95, 84,251,149, 42, 67,117,195, 38, 82, 98, 89, 46, 10,249,186, 95, 86,253, 84,196,131,151,
- 21,162,238,175,180, 72, 78,189,197, 25,230,154,158,232, 66, 97,157,173, 63,185,141,176, 4,209,100,234,151,136,169,243, 31,105,
-211,192, 14,155,239,210,136,146, 76, 51, 59,150, 38,136,128,110,173,205,177, 80, 83,234,128,220,246,204, 73,202, 10,148,125,200,
-126, 28,163,109, 38,189,204, 20, 4,189, 73,201,106,214, 36,207,174,193, 20, 4, 94,128,142, 25,226, 6, 76,227, 30,227, 52,194,
- 90, 11, 27,226, 60,140, 12,129, 83, 68,228,110,156, 96,156, 1,205,113,131,203,161, 3,206, 57, 12,171,190, 10,249, 18, 84,193,
-176, 73,118, 8, 78, 27,116, 77,227, 41,240,131,228,139,102, 81,179,232,140,226,205,224,149,124,214,207,175,151,169, 76,138, 29,
-145,191,212,168,102, 54,173, 10, 22, 18,149,244, 74,164, 17, 11, 94, 86,186,246,220,222,151,218, 73,161, 67, 91, 91,163,158,208,
- 22,198,202,182, 83,215,215, 20,169,110, 20,142,169,196, 41,237,177, 61,224, 20,162,204,181, 69,131, 63,110, 9, 20,210, 99,197,
-114,120,224,140,112,165, 2,210, 80,176, 79, 37,226, 84,179,241, 70, 69,164,176,159, 37, 14, 54, 5,174,137,168,121,150, 70, 27,
-211, 7,110,232, 57,240,134, 20, 92, 34, 11, 64,200, 16,126,251,139, 95,194,213,213, 5,166,105,194,217,224,240,232,122,194, 56,
-205,184,186,185, 41,233,110, 60,141,152,198,177, 44,219, 14,192, 54,112,170,208, 5,103, 71,107,252,219, 63,255, 51,120,253,205,
-183,240,207,127,247,247, 32, 44,145,106, 24,102,204, 44,112,162,102,136, 84,223, 11,136, 16,130,199,231,127,228, 7,240,185,239,
-248,118, 28,173,227, 97,162, 79, 8, 86,235,108,252,127,107, 74, 44,166,201,122,111, 17, 4, 31,240,207,190,248, 59,248,220,103,
- 63,131,245,102, 5,230, 0,182, 6, 60,206, 69,235, 96,156, 3,207, 19,136, 44,172, 77,174, 21, 50,169,245, 27,223,207, 41, 0,
-121,240,108,225,107,191,253,230, 59, 73, 63, 96, 96, 65,120,233,254, 51,184,115,122,134,247,207, 47,112,179,223, 97, 63, 77, 81,
-164, 26,162, 70,194, 80,194, 74, 83, 92, 96,243, 92, 24, 89, 36, 10,138,160,148,204,234, 8, 41, 97,204,123,188,255,248,105,129,
-195,100,238, 5,197,234,166,118,102,160, 18,253,178,194,131,212, 40,186, 68, 18,231, 0, 24,171,196, 80,241,154,197,128,146,116,
-136,228, 60, 6, 66,193,132, 86,166,199, 66, 25,157,186,158,172, 35,173, 69, 52,193,164, 32, 99,137,234,103,150,130, 54, 93,236,
-143,136, 4,183,200,222,143,207, 75, 37,186,197, 13,189,172, 35,165, 45,143,133,229,169,134,113,201, 66, 44, 87, 14,184, 34,240,
- 62,164,234,183,198, 58,103, 28,110,224,208,230,139,103,120,203, 2,188,211, 28,190, 69, 61,119,170, 8,101,209,235,194, 34, 75,
- 62,139, 28,137,138,152, 86,146,128,142, 81,231,252, 25, 68, 84,177,172, 42, 15, 37, 65,177,106, 87,132, 53, 41,191, 20,189, 58,
- 23, 94,179, 56, 98,128, 13,218, 13, 61,161,178, 13, 87,232, 82, 17, 88,231, 98,143, 4, 11, 93, 45,144,137,114, 7, 10,201,162,
- 24,174,243, 6, 82,201, 52, 48, 56,240,242, 53,246, 28,186, 77,200,198,202, 41, 68, 74,228, 68,234, 96,169,163, 71,107,180, 36,
- 14,106,120, 58,100,162,147, 52, 24,198,124,130,172, 66,149, 88, 41,250,253, 14,112, 93,244,167,123, 65, 39, 2,233, 12,100,244,
-240, 36, 56,238, 13, 16, 0, 31,106,181,123,124,247, 30,118, 55, 55,224, 20,203,104,141,193, 92,136,190,241,251,234, 58,135, 57,
-196, 47, 58, 6,178,164, 8, 73,231, 82,168, 4,151, 74, 89,131, 7, 42,114, 84,154,217,152,104,182,248,114,190, 36,146,236, 50,
-202,247,104, 20,106, 50, 43,203, 23, 76, 31,209,225, 20, 77,200,132,180,219, 26,213, 10, 62,222,232, 92,196,111, 69,197,174,125,
- 90,165,122,169,135,131,246, 65, 78,244, 41,106, 79,236,164,213,248, 25,113, 89, 90,107,104,126,142,102,226,151,197, 66,244,129,
-162,106, 91,235, 97,167,113, 64,150, 10,192, 36, 59, 35, 23, 56,205,225,145,179,144, 96,154,142, 16,169, 3,149,148, 67,130,158,
-153,228,177, 9, 55,147,191,124,208, 34,181,161, 39,181,175,228,246,191, 18,168,166,147,232, 91,111, 63,196,110,123,141,105,220,
-227,185,163, 1, 36,140,158,128,105,158,113,113,121, 5, 14, 30,231, 23,231, 56,191,188, 41, 45,118,103, 18, 19,157, 67,100, 84,
- 19,208, 91,139,127,252, 63,253,175,145,230,230, 3,108,223,131,194,140, 49,100, 66, 87,253, 92,162, 14, 23, 62, 4,252,245,159,
-255,105,188,250,202, 43, 24, 86, 3,156,117,113, 3, 71, 13, 17, 42, 17,178,226,211, 63,123, 4,182,184,124,242, 20,255,252,119,
-255, 47,124,225,243,159,143,152,233,224,147, 96, 48, 36,109, 72,138,116,242, 51, 96, 44,136, 67,220,208,173, 45,102,165,144, 15,
- 84,195,128,179,179, 51,144, 49,216,238,118,120,250,244, 2, 39, 67,135,227,227, 99,156,158,156, 96,246, 30, 87,187, 29,220,218,
-225,238,230, 20,182,183,216,237, 39, 92,109,119,240, 9,123, 11, 35, 48,233, 25, 20,163,232,137,200,148,186,180, 97, 35, 69,107,
- 50,195,135,232,161, 15, 33,110, 98,217, 85, 99,178,125, 77, 7,108,168, 3, 17, 52,152, 37, 7, 28,113, 58, 84,147,173, 7,128,
-124,184, 53,162,196,111, 82,199,153,156, 9,115,169, 19,150,239, 23,147,251,110, 82,181,179,229,182,145, 66, 4, 45,241,202,122,
-157, 20, 52,166,225, 50,110, 78,155, 51, 39, 34, 97, 28, 13, 10, 56,100, 12,169,169,209,158,134,170, 61, 52,139, 96,243,123,103,
-129,205,216,110, 99,128,140,230, 37,106,214,179,224, 3, 24,136,227, 24,170,129, 54,165,237,174,168,105, 57,166,180, 8,223,168,
-182,185,165,153,191,183,254,123, 83, 4,168,138,172,169, 10, 65,214,108, 11,212, 3,165, 41, 65, 50, 89,227,144, 70,122,204,165,
- 11, 42, 98,235, 56,177, 8, 99,147,131, 40,139, 33, 77, 29, 13,234, 57,126, 85,231, 47,192,118,105, 12, 84, 1, 84, 81,148, 81,
-217, 34, 80,161, 51,181, 61, 83, 14, 78,183,169,223,235, 60, 36,230, 38, 91,211, 2, 59,138, 95, 87,241,123, 11, 31,158, 53, 64,
-131,154, 74,176,145,230,233,246, 76, 78,225,210, 4, 46, 44, 47, 14, 62, 64, 93,213, 46,218, 31,248,135, 73,123, 19, 1,241, 51,
-224,167, 56, 99, 73, 49,142,206, 25, 12,189,133,176,135, 99,137,173,248, 76,166,179,132, 7,207,127, 8, 87,231, 79, 48,172, 86,
-152,246, 91,120, 33,116,198,198,214, 38,153,120,115,100, 1, 4,170,205,131, 40, 86,234,229,166, 51, 82,103, 35, 98, 80, 67,234,
-116, 11,152, 74,164, 97,252,110,121,209,130,170,109, 64, 46,150,140, 84,129,194, 64, 12,199, 22, 97, 22,177,209,162, 10,197, 45,
-113,161, 68,202,158, 82,187,208, 44, 53, 66, 55,107,228, 76, 73, 24, 59, 36,165,149,195, 84, 86,185,107,174, 44,113,177,219, 25,
-253,190, 10,224,133, 26,114, 84,153,231, 45,141,163,202, 42,163, 59,123,229, 52,108,168, 33,176,233, 35, 96, 30,187,232, 32, 14,
-232, 32,152,230,240,184,184, 95, 21,249, 40,120,174,127, 0, 0, 32, 0, 73, 68, 65, 84, 10, 84, 81, 24,121,177,169,172,105, 46,
- 48,154,226,202, 32,101,239,201,113,138, 82, 83, 13, 57, 43,141, 21, 27, 0, 16,124,237,207,190,137,105, 28,177,182, 17,146,244,
-209, 23,159,197,195,243, 75, 8, 11,254,224,107,175,225,201,213, 77, 2,117,164, 57,113,130,152,140,115, 84,155,119, 68, 56, 29,
-122, 76,187, 61, 66, 78,127,114, 29, 16,102, 76, 62, 64, 66, 2,182,112, 69,153,102,148,242,243, 15,158,193, 47,253,155, 95,192,
-233,241, 6,214,186,216,161,178, 22, 96,198,159,190,254, 6,222,125, 20,211,217, 78, 78,142,113,247,236, 12, 71,235, 13,200, 24,
-188,241,246,219,120,250,244, 2, 63,245, 19, 63,134,159,252,241, 31,137,194,182,146,239, 32, 17,105,235, 3, 32, 28,219,226,206,
- 1,222, 87,125,100, 18, 2, 85, 91,151,133, 75,106,245,179,227, 35,124,232,229,151, 49,205, 51,238,221,185,131,103,238,221, 69,
-215,117,184,190,190,193,126, 28,113,117,117,141,119, 31,190,143,103,238,221,193,106,181,198,107,111,188,137, 55,223,123, 31,222,
-215,132, 45, 73, 86, 51, 73,155, 86,102,146,199,140,108,155, 4, 96, 57,174, 57, 64,132, 49, 77, 19,156,139,218, 26,147, 49,197,
-141,102,130, 84, 54,120,126,238, 90, 1,108, 38,128, 17,161, 85,161,231,106, 75,229, 33,232,233,166, 64,231,127,167,142, 23, 27,
-192,196, 32, 21,201,130,100,142, 36,184, 40, 18,173,179,124,253, 98,101,164, 42,245, 88, 93,128, 40, 84, 59, 9,214,216,194,155,
-207, 9,142,185,131, 17,249,251,166,218, 69,243, 65,150, 57, 10, 36, 51, 75, 63,169,176,167,174,143,177,186,166, 82, 18,115,218,
-154,117,182,182,239, 11,242,244,182,214,187,178,128,229,124,143,220, 17,166,150,161,174, 69,170, 66,164,233, 29,181,123,144,218,
-252,121,148, 92, 70,108, 89,164, 86,240,232, 21,168, 83,152, 2, 92, 50,203, 35, 44,140, 72, 21,158,212,140, 29, 72,151, 75,233,
- 0, 72, 90,104,151, 50, 55,248,150,161,179, 73,206, 13,157,136, 23, 95,150, 75,213,206,130, 91, 55, 68,119,200,105,107, 51,108,
-139,135,175,196, 61, 74,170, 16,169, 33, 96,137,105, 48, 11, 13,253,168,156, 50, 22,102,124,160, 37,236, 52,251, 56, 29, 56,232,
-110,165,195, 31,150,133,213,198,212,206,223, 41,157,196,227, 5,169, 68, 50, 1,102,198,198, 1,243, 28, 57,241,227,204, 32,178,
-133,161,251,226, 71, 62,129,135,239,190,141, 87, 62,245, 93,248,202,151,190,136,253,236,177,233, 92, 12,144, 49,241, 38, 15,233,
-117,243,169, 54, 11, 58, 92,215, 23,188,169,158,133,152, 2,154,161, 34, 70,202,236,118,164, 42,210,168,132,176,156, 87, 94,185,
-201,185, 57,193, 42, 86,149, 11,162, 55,187,206,155, 33,147, 82,188,215, 8, 68, 5, 17, 34, 45,226, 93,176,253, 40,139,231,164,
-108,154,101, 94, 95,238, 99, 69,114, 67,245,110,231,128,150,122, 42,174, 25,212, 68,141,196, 78,197,158,162,182,249, 85, 43, 75,
- 67, 49, 14,206,115,229,200, 77,138,152,167,230,110,130,170,230,213,152,131, 91, 15,139,149, 86, 71,210,222,110, 80,159,155, 37,
- 2, 89,184, 1,205,228, 57,153,168, 54,129, 36, 79,122, 61,152,213, 96, 55, 46,176,145, 90,173, 17,118,187, 61,152, 3,238, 31,
-175,176, 73, 65, 33,100, 44,166,105,196,110, 63, 70, 59, 88,106, 83, 90,235,162,205, 43, 4, 4, 97,172,157,195,138,128,221, 60,
-167, 12,107, 1,217, 14, 78, 60,118,179,143,204,251,244, 36, 75,105, 1, 19,118,227,140,127,239,151,255, 50, 94,126,225,133, 72,
-102,179, 14, 95,251,198,107,120,247,225, 35,124,228,229,151,240,241,143,124, 24,159,254,196,199,240,153, 79,127,170, 58, 71,210,
-104,167,119, 29, 94,122,225,133, 20,133,155,238,131,224, 17,160, 42,185,226,189,103,136,115,145, 64, 41,177, 10,106, 36,160, 93,
- 23, 43, 37,102, 24, 8, 92, 23,133,109, 15,238, 59,220,187,123,183,172, 7, 87, 87, 87,112,206, 98,109,214,232,250, 1,167,167,
-167,184,184,186,196,123, 15, 31,225,197, 7,207,226,104,189,198, 87,191,249,173, 20,151, 44, 69,125, 77,186,202, 67,237,132,149,
- 72,233, 20, 36, 18,188,199,205,205, 22,155,205, 58,165,119, 81,201, 31,168, 52,178,186,171,112, 14,103, 74,144, 7, 73, 68,206,
-120,141, 34,225, 46,115, 10,164,104,232, 43, 89, 81, 22,158,234, 44,198,172,135,103, 66, 52,192, 43, 20,119, 46,181,147,141,151,
- 85, 48,140,174,146,242, 1, 66,179,200, 42, 77, 52,109,218,201,197, 17, 56, 20,209,107,246,241, 83,178,155, 53, 35,212,116,255,
-146, 68, 0, 18, 49,195, 6, 15,155,186, 89,118,154,176,221, 28,129,225, 98, 59, 59, 9, 21,173,117,202,105, 85, 83, 25, 15, 54,
-116, 72,187, 31, 73,186, 6,217,137,194, 45,252, 73,227,171,244, 65,137,148, 17, 60,207,219, 51, 23,160,174,129,201, 42,153,162,
-152,141,165, 70,140, 86, 62, 53,115,188,206, 90,168,167,100, 64,121,109, 51,141,206,167, 2,188, 40, 23,141, 38,219,173,227,106,
- 77, 82,231,253,132,136,191,229, 20,208, 83,109,180,250,224, 39, 69,156,206, 42,248,212,233, 45,189,196,245,229,100, 45, 13,210,
-160, 26, 92,177,208,201, 29,170,240,228, 80, 23,167, 55,105,136,106,253, 72,142, 12,149, 91, 29, 9,104,129, 90,139,253,252, 22,
-195,156, 2,164,180, 36, 47, 6, 82,235, 75, 36,122, 93,167, 84,105,135, 32,232, 59,130,243,132, 89, 0, 15, 0, 28, 32, 54,194,
- 99,158,255,208,171,248,227,223,251, 93,252,232, 79,253, 60,190,242,165,127, 17,147,172,122,130,177, 0, 79, 1,157, 49,152, 80,
- 1, 55, 69,151, 96, 12,250,174, 43, 98, 30,205,208,215,243,103,110,176, 8, 25, 78, 16,111,156,114, 66, 85, 39, 89,144,170, 4,
- 73, 42,104, 65,161, 19,161, 0, 28,249,135,144,161, 34,202, 91, 36,176, 22,166, 62, 21,108,105, 58,244,160,206,241,242, 67, 84,
- 83,250,164, 84, 96,164,230,126,133, 73, 95,240,179, 26,149, 68,202,222,163, 97, 15,210,114,236,137, 14,108, 61,116,251,193, 52,
- 29,112, 42,227,153,212,232, 65,167, 32,105,160, 15, 85, 89,205, 7, 72, 51,213,127, 49,138,199,172,190,247,100,120, 7, 96, 11,
- 23,189,161,200, 29,224, 49,164,153,217,171, 40, 14,117, 54,173,119,134,136,160,183, 22, 96,143,103,239,158, 98, 14, 1,103, 43,
-135,119,199,189,138,118,172,239,201, 16, 33, 48, 99,112, 14, 27,241,216, 6,134, 79,255,221, 13, 3, 16, 2,110,198, 25,148, 2,
- 82,202, 48, 32, 48, 78,142, 54,248,107, 63,255, 51,120,249,197, 23, 96,140,193,195, 71,143,241,245,111,188,134,239,251,220,103,
-241,201,143,190,138,207,126,219, 39,163, 32,206, 57, 56,219,197,254, 77, 94, 31,200,128,200,194, 88,151, 84,217, 86, 29,198, 19,
- 87, 32,147,210, 82,219,115,183,221,166,120,211,148, 60, 69, 58,216, 38,145,225, 20, 82,215, 80, 74,112,179, 22,142,227,135,242,
-193, 99, 88,173,208,175, 6,204,147,135, 15, 33, 42,230, 79,142,241,252,253,103,240,149, 63,251, 6,206, 47, 47,209, 59, 7,151,
-240,157,227, 56, 71, 59,155, 40,129,151,122,198,108,111, 83, 37,137, 50, 91,191,190,217,226,193,179,119,227, 38,156,170,252,156,
- 63, 96, 74,151,172, 58,119, 36,163, 10,211, 51, 80, 35,131,171, 23, 90,202, 51, 92,159,131, 86,221,172,132,167,164,233,138,245,
- 80,173, 53,248, 90, 53, 77,201,157,211, 28,203,149, 22,138, 53,205,147,170,165, 44,103,142,151, 13, 61, 85,137,129,171, 50, 63,
-195,103, 50,229,172,128, 80,210,134,110,252, 12,195, 33, 86,236,233,187,216, 92, 5, 92,158,158, 69,150, 66,226,247,103,136, 76,
- 51,186,106,102,214,154,186, 6, 37,131,171,154,158,184,230,113, 99,183, 42,169,156, 36, 77, 71,225, 54,230, 61,212,250, 41,101,
- 68, 23,157, 81,198,152,178,174,112,238, 14,162,102,152,115, 98,180,100,176,144,104,229,253,210, 17,100,242,136, 89,109,130,202,
- 3,175,199,214,209, 85,149, 63,131,169,215, 82, 42,163, 94,212, 33, 45,127,135, 69,161, 36,128,203, 45,201,106,223, 74, 23,220,
-152,136,191, 83, 54, 29, 42,173,242, 42, 84,208,185,235,208,202,105,125,194, 90,114,117,168,110,188, 26, 26,212,244, 44,151,131,
-206, 3,177,133,162,239,104,165, 7, 85,123,146,118, 24, 73,105, 53,197,197, 98,154, 25,163,247, 32, 17, 12, 54,181,108,173,193,
-236, 35,109,202, 51, 48,216, 14,129,129,103, 30,188,128, 39, 15,223,129, 51,190,156,182,129,168, 80, 37,142,209,180, 76, 9, 87,
- 73,245,103, 27, 99,176, 26,250, 6, 29, 72,198, 36, 15,235, 66,250, 87,112, 66, 92, 32, 6, 38,137, 52,234, 6,154, 62, 91, 97,
-253,166,224, 7, 82, 80, 31,210,168, 68,211, 88,170,146, 28,162,196, 44,214,176,148,148,141, 44,237, 17,137,139, 88,209,148, 42,
-161,128, 94,170,215, 35, 38,195,105,214,181, 10,250, 17,146, 40, 10,204,222,218,204, 18, 40, 50,119, 69,114, 50, 82,213,244,154,
-190,245, 1, 25,126, 5,136, 83,230,131,185,106,106,179,165,179,162, 60, 82,160,204,162, 47, 47, 31,176,161,223,190,197,235,249,
-132, 52,100,175,250,210, 44, 25, 28, 66,139,191,209, 78,179, 68,221, 23, 53,142,184,230, 20, 88,103,112, 52,116,192,236,225,140,
-193,126,156,112,186,234,241,206,211,184,217,239,167, 9,207,221, 57,198,236, 3, 46,118, 35, 32,136,252,132,113, 15, 15,194,156,
-172, 54,198, 58, 76,211,132,103,238,156,226,187, 94,254, 56, 86,195,128,221,126,143,111,189,253, 46,254,220,231,190, 19, 47, 60,
-255, 92,217, 88,191,249,250, 27, 32,107,241,233, 79,124, 28, 31,121,241, 5,116,174,195, 28, 66,172,164,140, 65,215, 13,241,250,
- 7,109, 27,138, 31,202,207,115,140, 30, 38,130,181, 3,216,207,176,221, 0, 34, 3,239,103,188,255,248, 49, 68, 24,199, 71,107,
-156, 30, 29,213, 47,194,218,154,124,165, 20,215, 92, 80,172,146, 50,208, 85,150, 57, 7, 56,234,112,116, 20, 23,213,169,139, 29,
- 9,187,219, 99,183,189,193,213,205, 22,179,247, 56, 90,175,113,247,236, 12, 15, 31, 63, 1,179, 96,232, 28,174,111,246, 69,217,
-156, 15,173,121, 29, 11, 97,134, 49, 93, 17, 6, 51, 7,108,119,251,194, 62,136,113,217, 74,180, 42,153,211,160,138, 18, 67, 21,
- 64,147,114,192,243, 40, 73,219, 37, 9, 45, 9, 78,234,100,247,150, 14,164, 52,200,227,166,130, 71,182,136,113, 13, 31,202,236,
-169, 50, 70, 95,160,151,163,103, 42, 42,242,115,202, 31,153, 68, 90,172, 34,176, 44, 86,179, 57,189, 51,223,247, 28,215, 73, 9,
- 33, 30,238,132, 65,193,195,112,172,218,193,161, 0, 84, 72, 60, 78, 46, 24,231,167,103,105, 67,207, 35, 61, 41,110, 4, 93,165,
- 87,171, 51,165,207, 83,245, 82,185,235,153, 61,220,180, 72,100, 36, 21,154, 30,175,171, 81, 46, 2, 86, 17,180, 42, 33, 82, 69,
-199, 82, 82,185,107, 87, 11,169, 89, 95, 57,184,177, 36, 95,126, 77,255,172,168, 85,180,132, 58,249,128, 5,133,212,156, 93, 20,
- 43, 68, 89,200,137, 40,206,248,169, 2,123, 34,167, 32, 37, 95,230, 16, 31,170,189, 29, 87,160, 39, 89,215,111, 76,181, 4, 44,
-185,195,105,195,226, 44, 34, 91,116,193,141,105, 83,193,165, 1,111, 44,145, 8, 56,244,230, 30, 24,215,106,112,193, 65,125,166,
-226, 12, 15, 84,253,170,197, 11,174,252,100, 14,140,121,246,152, 38,143,113, 26, 49, 78, 19,198, 45,112,186,114, 16, 27,191,196,
- 73,128,221,236,177,187, 25,113,239,254, 25, 0,194,159,252,193,151, 34,209,235, 95,254, 75,204, 28, 55,107,171,231,191,170,231,
- 18,149,213,213,211,120,122,114, 84,231,110,168, 65, 36, 92,236,108,121,182,147, 90, 45, 7,179,186, 42, 20,169, 39, 89,157,185,
-107,148, 45, 43, 71, 65,230, 16,137, 80,125,166, 20,125,179,172,232, 84,156,108, 41,165,122, 87,194,146,114, 24,202,218,130, 18,
-167, 38,229, 65, 19,169, 93, 6, 18, 81,161, 9, 89,224, 24, 57,208,108,162,159,183, 4,205,192, 68, 54,129,242,173, 55, 84,165,
-194, 85,214,247, 96,237,204, 44, 91,234,101,159,230,204,253,175, 15,134, 73, 93,135,188,176,234,180,185, 66,181,210,179,244,131,
-188,229,138,145, 33, 77, 55,100,224,208,225,155, 14,135, 70,101, 62,169,112, 22,249, 32, 55,135, 14,209, 81,202,218,245,106, 5,
- 43, 19,172, 51,105,230,203, 88,119, 14,175,222, 59, 1,145,224,244,238,203,120,116,126,137, 55, 30, 62, 6,132,240,217, 79,189,
-138,175,254,217, 55, 1, 34,108,231, 25,100, 93,244,128, 7,143,231,238,157,225,123,191,243, 59,112,247,244, 4,255,236,119,255,
-111,252,194,207,124, 30,125,215, 97,221,103,250,155,131,177, 14, 38, 97, 94, 77,226,188,147,177,112, 67, 28, 33, 5,207,152,198,
- 61,250,190,143,234,111, 6,158,158, 95,193, 58,131,227,163, 13, 32,132,253,110, 15,235, 28, 86,201, 50,196,251, 29,152,128,221,
-126,196,233,209,186,140, 87, 50,213, 81, 74,138, 87,250,189,159,227,197, 55, 38,229,190,155, 98, 1,202,191, 39, 9,181, 50, 54,
- 22,243, 52,198, 77, 63,193, 99,186,174,195,157,179, 51,188, 48, 77,184,190,121, 29,243, 60,227,187, 63,243,105,188,243,238,123,
-248,198,183,222,198, 48,116,152,102, 95,141, 13,169,154, 42, 64, 22, 83,227,126,153, 25,126,158, 43,232,133, 9,100,106, 78, 58,
-180, 8, 50, 11,218,178, 58, 62,207, 95, 51,238, 85, 14,141, 26, 57,252,170,186, 82, 85,142,182,168,146, 40, 35,100,115, 37,199,
- 74, 28,154,113,197, 76,101,140,150,109,149,109, 45, 84, 71,114,198,198,231,145, 57, 10, 3,137,226,230, 14,202,103,120,106,115,
-220, 77,230, 61, 48, 16, 82, 42,224, 60,131,189,135,225,144, 60, 46,249, 59, 10,201,174,197, 73,243, 17,159,221,179,235, 27,220,
-220, 57,171, 7, 11,105,243,201, 69, 85,236, 69,159, 36,173, 6,161, 96, 96,203,252,251,208,223, 87,219,233, 21,111, 45,234, 24,
- 33,168, 5, 79,137, 67, 79,153, 23,198,152,146,139, 94, 54,216,244,251,188, 20,113, 70,118, 75, 20,204, 37, 88,123, 75, 64, 85,
-209,118,149, 72, 89,187,107,104, 62,175, 52, 29, 5, 29,232,164, 71, 4, 49, 74, 56,212,112, 31,109, 13,207, 46, 35, 2,220, 50,
-227, 55, 35, 56, 41,183,131, 4, 42,111,157,203,208, 64,163, 78,179,181,237,160,113,217, 58, 43, 22,237,119, 69, 52, 19,173,170,
-110,115,170, 9,183, 65, 12,104,193,131,199, 1,119,180,182,255,170, 72,201,123,143,253,236, 49, 79, 30, 38,196, 69,234,102,154,
-192,222,161,163, 56,191,155, 16,163,244, 38, 97, 60,122,248, 20,110,232,240, 79,254,139,191, 15,103, 13,188, 68,138,149, 8, 99,
-156,162,224,193, 19,193,165,155, 56,146,197,146,128, 33,241,222,143, 54,171, 98,103, 41, 89,245,101, 46,146,145,168,113, 55, 34,
-163, 9,103,137,124,167,245, 8,188,184,117,114,126,124,153,201, 40, 49, 72,193, 37,114, 57,105,114, 9, 45,168,105, 83, 37,230,
- 51,189,191,146, 85, 79,154, 73, 78, 48, 57,142,145,178,184, 71,143, 75, 22, 41, 79, 41,217, 44,139,249,226, 26,200,137,118, 87,
-129, 38,217,199, 94,226, 81,155,135, 97, 1,223,148, 54, 25, 89,148,110,163, 40,245,115,194,170,246,220, 18, 32, 65, 34, 27, 64,
-113,119,179, 70,160, 62,134, 92,221, 19,139, 48,134, 18,251,188,196,192,178, 38,113, 82, 59, 10, 80,170,218,219,230,255, 57, 95,
-168,177,233,213,246, 7, 0,194,122, 53, 96, 77, 43, 92,157, 63, 5,164,135, 77,194,206,211,117,220,100,239, 28,111, 48,206, 51,
-230, 0, 60,115,118, 2, 2, 33, 36,116, 44,250, 21,194,126,139, 32,192,122,213,227,135,190,239,123, 65,194,152,198, 17,127,245,
-103,127, 10,155,163, 99, 12,206, 68, 1,156, 49,176,157, 75, 52,184,184,193,229,185, 31,140, 75, 27, 0, 96, 49, 1,100, 49,207,
- 51,122,215,193,117, 22,247,238,156, 86, 33,149, 8,134, 97,192,126,220, 99,191,149,136,100, 77, 97, 27, 34,128,117, 29,188,159,
- 83,171,215, 68,108,109,224,106, 0,228, 44, 58, 12, 81, 45, 79, 20,157,243,197,230, 23,138,160,170,246,243, 57,146, 27, 67,192,
-126,154, 74,171,126, 12, 1,155,205, 6,207, 62,115, 15,125,223,225,242,242, 10,247,238,222,193,187,143,158,224,122,187,175,153,
- 0, 10, 46, 66,134,203,162, 94, 14,210, 82,195, 91, 50,107,208,164,141,189,132,166,106, 4,106,130, 23, 81,178, 19,130,170,189,
-138, 52, 67,114, 49,166, 33,214,248,207, 69,195,146, 22,181,140, 18,194, 73,122,206,114,164,169,136,182,108, 73,237,228,229,172,
-249, 16, 74,122, 93, 16, 65,152,125, 51,138, 35, 74,157, 68, 68,198,129,238,198, 48, 51, 36, 4,240, 60, 35,204, 51,194, 52, 33,
- 76, 19,192, 30, 14,177,227, 98, 10,176,138,227,181, 74,164, 62, 97, 6,118, 91,244,125,143,121,179,174,150,212, 98, 89,171,129,
- 37,220, 16,184, 84,161, 46, 75,253, 23, 85,251,110,137, 31, 81, 81,208, 41, 92,135, 77,236, 22,138,214,116, 72, 61,132,103, 17,
-111,241,161,103, 6, 65,238, 34,144,169,243,116, 82, 35, 52,150, 36,114,190, 37,139, 36,109,250, 92, 52, 83,173,186, 95,219,245,
-116,224, 84,177, 71, 82,142,119,102, 69,179, 19, 53,214,100, 53,134, 37, 37,163, 20,168,129, 64, 43, 98,147, 4,250,206,233, 57,
-241, 13,153, 70, 12,220,182, 13,209,154,226, 69,202,243,215,164, 82, 74,211,217,168, 16,123,180,194,185, 18, 25,152, 79,158,203,
- 95,170,122,211,179, 81,149,178,215,192, 27, 0,193,126,187,131,120,143,144, 54,116, 99, 8, 39,235, 30,119, 55, 3, 54,157,131,
-233, 28, 38, 31,176,219,238,241,177,239,253, 2, 46,175,119,184,124,124,137,207,253,249, 47,224,226,226, 6, 87, 23, 55,120,248,
-228, 2, 79,159, 94,227,201,249, 13,110,118, 99, 2,193,152,106,219,160,106, 9,178, 38, 2, 58,202, 30,144,184,206,209,147,153,
- 54,111,225,242, 32,182,100, 49, 36, 85,180,138,231,203,104,193,164,142,103,229,251,172,246,142, 28, 0, 16,197, 87,249, 6, 90,
- 2, 29,242,159, 1,243, 45,144, 7,212,135, 44, 47,185,172,210,211, 88,135, 17,164, 86, 20,215,138, 56,155, 87,139,125,171,104,
-197,234, 98,134,102,150,175,225, 26,162, 68,117, 75, 92,164, 38, 75,137,178,118,168,185, 28,233, 27, 76,119, 54,232,192,207, 89,
-248,244, 36,202,102,201,139, 60,104,129, 52,169,108,234,115,139, 98,187,171, 36,235, 15,128, 43, 52, 39,146, 74,197, 85,153,209,
-186,221, 42,192,170,115,184,127,178,129, 51,113,145,177,214, 70,132, 49,168, 88,216,190,242,250, 59, 32, 97,220, 61, 61,198, 55,
-223,124, 39, 94,127, 55, 96,220,111, 99,216, 11, 4,127,237,103,127, 18, 95,251,198,107,120,229,165, 23,240,109, 31,255, 40,206,
-238,156, 97,179,234,209,247, 61,250,213, 10,253, 16,201,112,113,131,143,158, 92, 71, 38,110,246,153,156,229,103, 88,107,209,117,
- 14,155,205, 17,108,231, 34, 52,166,235, 98,149,108, 29,140,181,176,214, 96,157, 40,115,211, 56,226,122,187,197,245,205, 14,119,
- 78,239, 68, 59, 87,178,179,133,212,186,149,196, 96,103,239,147,215, 31,105,156, 67, 57, 43, 37, 89,171, 66, 75,224,202, 57,211,
-121,166,111, 12, 58,107,112,180,138, 0,155,213,208, 23,103,192,253,103,238, 97,179, 30,240,244,226, 18,207,221,191,135, 15,191,
-248, 92,220,184,185, 85,233,198, 52, 69,163, 92, 39, 40,243,102,214,185,215,136,213,167,142, 48, 46, 51, 97,117, 44, 43,129, 73,
-101, 65,227,218,175,164,234,118, 41, 25, 20, 69, 50,186, 8,128, 80,104,149,220, 1,163, 52, 14,173, 27, 6, 41,141, 0,218,123,
- 83,170, 93, 45, 31,106, 57, 48,252, 52, 71,168, 76,211,233,231, 82,132, 64,146,202, 91, 66,193,236,250,121,198, 60, 77,152,119,
- 59,236,111,174,177,223,222, 96,191,221, 98,119,115,131,113,183,197, 56,142,152,253,140, 16, 98,248, 78, 8, 81,204, 25,188, 71,
-152,246,232,174, 46, 82,135, 47, 23,137,234,122,230,234,149,185, 25,161, 29,240, 74, 74, 96, 76,222, 27,234,239, 77, 22,105,154,
-132,196, 54, 41,203,141, 84,144, 9, 81, 35,196,203, 30,124,163,208,177,249, 87,142, 82, 37,165,109,160,130,151, 78,107, 95,186,
- 81, 73, 89,104, 68, 41,102, 26, 69, 63, 51, 56,112, 33, 45,102,210,160,166,124,200,162,235,208,252,106, 0, 92,245, 96, 67, 18,
-169,164,145,193, 82,112,133,104,227, 33, 57, 69,217, 53,190, 99,237,241, 83,105,110, 74,181,220,250,242, 90,159, 63, 26,112,192,
-225,169, 75, 74, 91, 84,233, 51, 75, 74, 86, 78, 70,167,214,163,167, 2, 97, 84, 3,173,158,172,148, 0,121,127,117,137,222, 0,
-182,119,160,142, 64,236,113,103,211,227,120,232, 96, 72,240,242,119,127, 1,127,240,219,255, 4,215,219, 61, 62,252,234, 39,241,
-254,215, 94,193,131,143,126, 22,255,239, 23,127, 3, 63,254, 87,126, 9,255,244, 31,255, 42, 40, 8,182,222, 99,158, 3,246,163,
-199,241,153,133,192, 37, 56,127,222,140, 83, 32,134,115,105,142,155, 34, 9, 81,177,176,146,170, 87, 18, 83,116, 0,139,193, 5,
-218, 90, 66, 74,117, 71,141, 1,189, 85,239,138,250,134,140,180,135, 27,226,116,211, 19, 43,181, 56, 41,135,131,220, 34, 68,147,
- 3,172,175, 40,225, 89,238, 38,200,130, 1, 84,242,158,243,231, 84,200,198, 42,164,163, 38,144, 34,139, 65,154, 10, 87,106, 24,
-131, 22,210, 9,168,145, 97, 72,251,196,171,189, 62,177,146, 69, 5,177,136, 74,116,210,237, 50,212,107,213,228, 97,180,110,186,
-148, 4,168,186, 77,229, 15, 45,186, 71,244,129,210,250, 70, 89, 67,234, 30, 70,153,155, 17,238, 88,193, 73,223,161,179, 14,150,
- 8,189,179,152,156,131, 15, 30,228,129,135,143,159, 96,156, 38, 4, 16,118,227,132,155,155, 45,102, 16,246,227, 22,115, 96,156,
-172, 6, 60,119,255, 46, 78, 78,142,241,151, 62,255, 23, 48, 56, 7,103, 13, 58,107, 99, 21,109, 13, 40,189,182,201,153, 1, 9,
- 78, 68,157,171, 66,157, 84, 13,231,207,231,250, 1,126, 26,203, 92, 53,222, 74, 22, 68, 38, 65, 90,226, 12, 62,134,188,108,208,
- 13, 67, 92,252,192,176,112,152,167, 9, 28,124, 28, 15,100, 37,188, 8, 40,132,196,130,161,218, 81,201, 11, 47, 25,117,105,171,
-134, 71, 66,106,241,134,184,225, 88,103,203,236,117,154, 3,134,213, 26, 6,192,189,179, 51,172, 86, 43, 92, 92, 94,225,201,197,
- 21,122,103,177,103, 95, 67, 86, 82, 23,201, 90,151,218,208,106,211, 1,154,131,167, 20,169,177, 52,182,169, 74,110, 85,157,185,
-218,138, 42, 0,152, 24,155,156,186,115,101, 13,227,210,145,184,197,203,179, 64, 16,183,145,162, 80, 66, 81, 44,194, 61,242,189,
-198, 69,236, 22,181, 82, 33, 57, 39,234,166,149,198, 34, 16, 32,117, 35, 77,234, 56, 80,242,103, 11, 11,194, 60, 99,220,237,224,
-119, 91,204,187, 29,252, 60, 1,204,209, 1, 50, 25,240,208,131,251, 30, 93, 17, 17,114,185,190,128,129,236,247, 24,158, 60,193,
-254,238,157, 5,143, 3, 21, 35,155, 70,143,237,140, 93, 74, 84,114,113,164, 44,218,242,173, 93,186,218,116, 13, 73,234, 24, 82,
- 57,108, 21,193, 31, 98, 23,175, 81,148,235,182,125, 22,237,178, 52, 95,121,238,146,198,179, 26, 45, 2,168,171,187,137,165, 13,
-183,201, 21,122,254, 85,253,120,138,241, 97,110,113,120, 45,192,222, 5, 61,150, 81,181,249,135, 9, 43,245,251,114, 65,167,150,
-168,165,131, 65, 42, 62,182,102,225,150,155, 34, 9,185,116,164,104,253, 17,124,160, 51,206, 95, 88,243,239,100, 97, 75,206,173,
- 93, 35, 7, 0,208,250,222, 20, 48,231,128, 97, 19,255,236,118, 63, 98,156, 61,216, 7,172,108,252,217,215,251, 25,193,207,112,
-150,240,199,191,243, 63,163, 31,122,156,117, 29, 94,255, 87,255, 61, 30, 60,184,139,163, 1, 56,233, 8,191,255,235,255, 11,238,
-159, 30, 97,211, 59,140,227,140,237, 20, 49,156,110,183,199,126,118, 17,121,105, 34,234, 16,185,205, 76, 53,216,128, 80,231,102,
-140, 36, 78, 75,237,149,242,112,103,239,114, 82,110, 50,171, 54,187,154,235,228,239, 81,164, 37,253,212, 89,187,170, 26, 84, 54,
-123,157,122, 41,129, 93,194, 87, 74, 30,153, 35, 5,199,168,195, 16,149, 76, 97,180, 4, 39, 21,158, 34, 13,237, 38, 55,131,162,
- 1, 50,174, 95,138,138,103, 20,212, 85, 39, 73,165,185, 22, 41, 84,107,182,204, 52, 60,118,133,119, 44,126,122,109, 77, 82,147,
-129, 40,144, 51,197,195,171,103, 64, 37, 38, 81,116, 68, 45, 26,218, 19, 41, 20, 40,212,225,177, 10, 27,227,207,176,116, 64,112,
-106,192,156, 31, 36,185, 43,207,128,112, 51,199, 15, 33,192, 72, 64, 8,140,222, 70,234, 22,216,192, 25, 74, 63, 75,240,135,175,
-189, 3,102, 65,215, 37, 48,164, 53, 24,247, 51,156,181,248,177,239,255,110,188,243,238, 67,252,149,159,251,105,184,161,135, 51,
-177,202,183, 38,181,220,157, 75, 42, 95, 91, 14,158, 81,201,174,242, 30, 50, 96, 37,137,155, 0, 96, 88,109, 16,230, 57,186, 67,
-114,104, 74,110,231, 6, 15,200, 12, 50, 4, 67, 54, 70,116,122,143, 49,120,184, 97,149,196,116, 83,105,141,138,228, 92,234,196,
-225, 79,213, 56, 41, 84, 41,140, 41, 85,108,134, 85, 21,118, 3,135, 82,221,251, 16, 9,116,113,147,143,118, 52, 63, 79, 56, 59,
-222, 96, 53, 12, 8,214, 70,103, 64,223,163,115, 22,199, 71, 27, 56, 55, 97,187,159,202,194,109, 77, 20,138,137, 2, 69, 17,197,
-239,171,204, 62, 83,252,138,161, 68,210,204,224, 26, 99,212,158,203, 11,136, 87,212,115, 24, 83,147,247,162,142, 46, 65,153, 80,
- 57,238,162, 3,178,114, 71,146,177, 0, 62, 73,235, 38,106,132, 95, 58, 3,163, 30, 82, 67,182,171,113,188,183, 24,145,146, 71,
- 41,167, 65, 50,237, 46,117, 69,140,137,216,108,226,248, 61, 91, 14,209, 29,192, 1,126, 26,177,189,185, 1,239,247,152,167, 17,
- 33,132,232,242,233, 92,217,184,188,115,112, 69, 84,198,165, 26, 15,204,176, 87,151,176,199,199,152,157, 83,207, 44, 39, 24, 76,
-234, 98,240, 98, 12, 43, 58,173, 83,217,134,160, 82,191,165,110,182, 17, 11,108, 84,122,165, 74,108, 52,117,198,157, 43,116,101,
- 6,168, 21,145,161, 34,168,132, 81,107, 29, 80, 66,193,234,232, 88,121,225,211,124, 59, 19, 0,185,217,208,165,116, 61,218,180,
- 80,131, 54,194,118, 97, 5,147,195, 1,180,192, 36,139,113, 61,252, 48, 73,252,222,111,245,161,233,243, 64,106,189, 83,179,121,
-212,185,122,179,225, 67,110, 29,160, 23,186,209, 7, 72,141,155,108,118, 28,174,143,153,189, 45, 10,208, 65,137,186, 35,202, 71,
- 47, 7,114, 59, 46, 85,157,239, 44,156,181,240,126,134, 15,140,113, 63,129, 16, 48, 19,224, 76, 36, 32, 13,171, 14,195,170, 7,
-194,140,121,126,138,243,224, 97, 87, 27,216,224,193,134,113,186,234, 33,129,113,126,185,197,246,106,135,155,113, 70,152, 25,247,
- 78, 54,224, 4,237,201,202,114,107, 77, 18,202,216,226,111, 20, 99, 10, 11,218,228, 48,136, 36,114, 49,148,211,154,148, 46,160,
-225,252, 82,225,131,231,238, 69, 99, 42, 16,101, 78,204,243,114,169,244,190,104,129, 72, 36, 58, 42, 17,236,113,195,229,116, 20,
-203, 89,207, 74, 69,207,249,160, 84,110,222,108,211,201,254,226,132,170,204,249,234, 36,101, 35, 38, 48,162,248,221, 32, 59,233,
- 72,114,200, 65, 43,148, 43,235,225, 98, 22,157, 21,255, 77,123, 74,205,220,178,139, 66,207,187, 72, 85,220, 82,240,154,162,112,
-158, 84,200,115, 21, 26, 3, 5, 17, 33, 37,120, 81,109, 86,212, 25,165, 20,101,174, 30, 91, 45,176,179,116,152,106,144,219,129,
-164, 5, 38,121,142,155,254,212, 87,254,244, 53,220,241,113,195, 49,226,225,236, 0, 70,136, 73,130,194,120,114,179, 67, 96, 15,
- 33,224,222,233, 49, 30,157, 95, 97,156, 38,136, 48,126,238,199,127, 20,255,251,111,254, 11,252,157,127,247,151,209, 15, 3,140,
-115,232, 19,134,212, 90,155, 20,234, 49,149,208, 36,113, 13,153, 72, 90,203,209,182,148,161, 58,101,148, 38,176,198, 69, 81, 90,
-185, 23, 57,241,181, 99,251, 92,146,176,142,147,234,222,218, 14,182,239, 49, 12, 27,132,224, 49,222, 92,131, 83,101, 45, 62, 20,
-171,171,132,172,183, 56,140,203,228, 50,126, 9,106,254, 29, 98,251,182, 36,135,133, 72,166,203,255, 45,112, 9,237, 89, 13, 67,
-238,173,195, 57,135,213,106,192,253,123,119, 49,116, 61, 94,123,235, 29, 24,227,211,134,155, 54,164,212,121, 16, 91,221, 61,171,
-161, 87, 58, 32, 46, 99,201,220,121,106,196,166, 73,124,102,148, 90,220,100,200, 16,199,141, 61,111, 38,249, 53,162, 38, 41,179,
- 34, 76,169,234, 53,140,168, 50,214,181,207,188,222,105, 85,129,111,212, 51, 19,231,211, 33,132,164, 85,144, 4,212,137, 46, 19,
- 99, 80,198,111, 4,137, 42,107,102, 88, 0, 86,226, 1,137,216,195,132,232, 65, 55,193,131,102,143, 35, 18, 92,142,123,236,182,
-219, 72,217, 76,154, 42,239, 67, 92, 91,189, 71,239, 44,186,212,169, 20,174,250, 32,239, 3,108, 8, 88, 93, 92,128,238,221, 43,
- 27,158,118, 44,197, 67, 80, 29,241, 74,201, 62, 95,234, 12,164,153, 55,139,202,178,104,187, 95,148, 18,206, 4,100, 35,197, 47,
- 11, 0,141, 53,170,141, 93,233,156, 36,212, 16, 44, 83,116, 79,210,226,212,238, 77,252, 46,185,240, 9,168,116,154,165, 92, 3,
- 82,163, 5, 46,226, 65, 81,107,138,110, 78, 73,189,143,136,234,168,111, 9,202,214,107, 78,118, 77, 81, 92,199, 93,205,176,160,
- 69, 16,192,161,171,162,100, 98,103,155, 80,230,190, 55, 4,174,202, 93,167, 37, 12,134,128,219, 0,178,185,101,101,104,217,179,
- 87,191,167,234,149,206,255,138, 85,128, 12, 45,248, 35, 7, 36, 59, 16,206, 54, 71,224,213, 57,176,114,232, 12,224,167, 17, 52,
-143, 48, 18,176,221,123,140,222, 99, 29, 28, 16, 4,179, 48,126,240, 47,253,117,252,206,111,254, 31,184,124,247,155, 8,126,132,
- 79, 74,234,161,239, 48,108, 86,184, 11,194,205,110,130, 23,193,110,156,209, 13,125,105, 31,147, 49, 88,173,215,141,239, 50, 29,
-247,178, 60,187, 68, 50, 54,214, 59,149,143, 43,106, 92, 17,131, 72, 76, 11, 50,205,202,126,245, 29,229, 36, 48, 74,150, 26, 73,
- 27, 45,140, 84, 97, 30,167,147,104,170,220, 13,155,194,181, 46, 75,133,212,188,114,189,132,136,106,107, 51,155, 2,129,160, 69,
- 27, 76,251,176, 99,123,138,219,156, 99, 50, 81,152, 4,197,134, 78,240, 29, 81,224,250, 70, 67,183,104,253,148,214,214,129,147,
- 34, 30, 94,106, 11, 52,205,189, 20,188,161, 17, 28, 50, 55, 3, 59, 86,228, 45, 81,135, 43,157,103, 32,170, 37, 88,147,175,148,
- 10, 94,169, 87,231,121,198,229,213, 22, 79,207, 47,113,113,121,141,237,118,143,221,110,135,113,220,194,207, 19, 66,240,144, 60,
-239, 52,177, 21,184,221, 94,227, 39,191,253, 21,240, 76,176, 26, 53,155, 78,249,175, 61,190,138, 85,101,106,157,251, 4,161,249,
-215,190,227,147,248,181, 95,255, 45,252,173, 95,250,183,176, 90,173, 99,182,121, 66,149,154,188,113,154,252, 43, 86,224,100, 13,
-196,184, 4,193,145, 50,163,206,148,187,162,176, 78,222, 93, 9,177, 29, 27, 55,244,180, 81,100, 53,114,240,177,114, 48, 0,147,
-193, 60,238, 19,236,195,196,116,195, 84,209,115,250, 59,162,176,177,162, 43,187, 76,233, 19,129, 88,151, 14, 61,136, 66, 45, 1,
-152,125,137,251, 12,115, 72, 1, 45,113,131, 15,193,199, 77, 94, 4,150, 0,132,144, 26, 80,132,206,117,216,237,246,176,214,224,
-244,120,131,113, 14, 96, 68,158, 39,167, 25,181, 73,215,128, 76, 12,101, 58, 62,222,160,105, 93,161,174,131,154,235, 13, 21, 33,
- 74, 10, 0,195, 9,118, 66,101, 99,151, 98, 65,163,180,225, 20, 24,141,242,139, 87,166,121, 94, 11,120,225, 96,175, 80,146, 34,
- 74,205, 7,253,116, 96,141,135, 20, 41, 54, 44, 66,172,182, 13, 81,202,152,175, 7, 94, 8,195,230, 13, 63,228, 3, 48,131, 56,
- 0,193,131, 66, 0,241, 12,225, 25,247, 54, 3,190,254,248, 73,189,255,133, 97,157,197, 52, 25,204,157,195,208,119,232,156,139,
-221, 0,105, 19,210,140,103,240,205, 53, 86, 39, 39,128,181,106, 19,172, 97, 52,203,182,188,134, 36, 85,129, 91,213,233,228, 32,
-152, 24,170,105, 10,152, 39,239, 83, 4, 13,165, 18, 88, 75,202, 66,170, 84,171,208, 77,179, 28,174,147, 90,227, 37, 84, 75, 17,
- 52,243, 51, 95,174, 27, 53, 73,164,162, 26,156,101,166,206,172,242,226,165,166, 90, 74, 37,207, 69,200,145,118, 20,201, 65,167,
-176,232,167,178,186,138,227,174,232,114, 43, 88, 7, 80,177, 82,225,105,203, 1,145,105,224, 30,162, 82,172, 32, 10, 38,163,213,
-199,185, 82, 38,220,138,248, 40, 96,147, 92,249,208, 34, 53, 72,104,209,162,165,154,193, 46, 82, 35,245, 14,166,244,130, 54, 30,
- 22, 56,127,255, 49,142, 57,192,116, 22,182,115, 48, 70,112,247,184,199,204,140,241,209, 37,142,187, 14,199,199, 43,236, 67,180,
- 13,124,235,181, 63,197,147,119,223,130,247, 19,198,201, 67,152, 49,207, 1, 97, 37,176,235, 1,155,227, 13,186,190,195, 59,231,
- 91,236,124, 0,108,128,113,174, 88, 16,134,174, 83,177,128, 20, 17,174,168,128,146, 40,184, 86, 85,225,173, 35, 11, 41, 59, 24,
- 25,105,132,107,249,164, 74,172,133, 92,181, 82, 71, 66, 99,178, 80, 82,160, 75,189, 30, 82,103, 20,185, 26,226,236,173,206, 97,
- 15,121,214, 70, 7, 56,192,114,210, 21, 53,154,209,149,124,113, 51, 64, 97, 96,147,111, 52,182,198,210,193,193,232,141,126, 41,
- 9, 79,183, 43, 47, 15,106, 74,101,138, 54,182, 84,138,150, 79,147,168,180, 24, 15,106,126,143,162, 94,133,106,169, 17,161, 16,
-222,106,136, 67,189,191, 69,205,220,243, 40,107,158, 38,236,119, 35,110,174,111,112,113,121,133,235,171,107, 92, 95, 93, 65,252,
- 8,146,104,161,180, 68,152, 60, 99,246,113,227,217,143, 35,230, 16, 48,205, 30, 34, 2,159, 54, 31, 16,129,131,135,165,151,211,
-108, 51, 91,192,226, 38,119,126,179,195,236,231, 34,236,185,184,217, 3, 0,214, 67,143, 63,254,234, 55,240,249, 31,250,126, 60,
-120,240, 0,142, 24,126,119, 9,244, 43,160,235, 65, 68, 41, 18, 85,141,189,172, 1, 92, 95, 92, 47,113, 14,234,227,102, 27,124,
- 25, 35, 69,113,149, 7, 89,115, 72,248, 67, 37, 13, 2,177, 93,207, 0,194,184, 7,165,214,188, 0,240,126,142,173, 95, 31, 91,
-220,217,146, 22,237,106,146,170,198,204,105, 72, 8,222,188, 54,132, 0,241,190,180,214, 69,193, 74,188,143,207,102, 72,200,219,
- 56, 47,142,222,234, 26, 16, 18,255, 30,135, 0,151, 4,125,155,245, 26,195,205,136,209,179,130, 6, 37,193, 85,138,215, 52,100,
-113,180, 94, 23,229,179,136,130,131, 44,245,143,233,222,176, 9,215, 91,121,226, 41, 35,128,146,149, 83, 85,249, 92,170,210,236,
-193, 87,243,219, 50, 41,147, 10, 63,186, 45, 55,156, 43,171,162,232,146,146,133, 55, 35,132, 33,137, 87, 23, 34, 99,159, 56,106,
- 24,202, 24, 37, 61, 35, 54, 71, 74,167,120, 87,147,132,140,148, 60,251,134, 25, 61, 4, 27, 2,158,187,115,138,215,223,123, 20,
-159,155,212, 1,232, 58,135,185,235, 48,205,115, 76, 18,180,174,140, 38,106, 54,133, 7,247, 3,236,118, 11,115,114,162,198, 95,
- 74, 25, 37, 10,182,165, 52, 13,101,244, 32,173, 94, 32,127,143, 6,212, 36, 77,230, 52,189, 60, 10, 73, 81, 7, 49,226, 86,109,
- 55,194,166, 58, 96,138,126, 43,179, 91,148,107,161,100,162, 84,179,107, 9,174,206,224, 54, 13, 82,210,150,189,116,223, 50, 43,
-107, 27,234,158, 70,170,192,105,228,114,234, 11,170, 49, 63, 92,125,244,170,216,102, 80,116, 34,136,198,234, 73,203, 84, 47, 74,
-205,172, 44, 94,144,219, 52,213, 45,103, 18, 55,158,115, 94,134,123,220,142, 5,171,115, 84, 58,216,158,151,132, 46, 58, 96,126,
-181,200, 90, 13,183,105, 66,106,252, 84, 30,120,176,224,164, 39,140,204,120,114,113,131,253, 60, 3, 32,220,236, 13,246,251,152,
-198,246,173, 47,127, 9, 71,142, 32, 39,107, 76, 62,194, 52,246,147,199,229,232,193, 55,123, 28, 29,111,224,250, 14,199,155, 30,
-187,209,195,123, 6, 17,195, 25, 11, 67, 6, 71,199,235,210, 22, 74, 99, 93,176,137, 9,109,217,187,173, 65, 20,114, 11,247,190,
-204,108,160,194, 67,116, 38,123,201,244, 38, 5, 85, 16,160, 48,225,147,253, 70, 76,153,153,115, 43, 37,140, 55, 69,206, 19, 78,
- 27,123,246,144,235, 13,157,154,188,101, 41,241,169, 34,203,141,252,182,223, 83, 33,186,197,215, 79,173, 72, 36, 22, 50, 41,100,
-236,129,119,173,190,190,166, 76,105,160,145, 72, 75,180, 47, 66,170, 5, 6,180,102, 14, 44,102,231,250, 1,228, 22, 5, 27,231,
-170,132,155,155, 29,118,187, 29, 46,207,207,177,189,190,193,180,191,193,184,219, 97,187,219, 22,213,178,164, 13,100,242, 51,230,
- 57, 10,145,230,121, 46, 66, 37, 24,139,113,154, 49,207, 51,166, 57,110,114,158,115,120, 4,151,247,203, 92, 95,143,210, 2,157,
-171,169, 55, 30, 61,109, 4,167,227, 60, 39,123,216,140,143,190,242, 2,190,231,187,190, 51,169,228, 3,152,128,153, 3,174,159,
- 62,130,247, 30, 6,130,245,241, 41,142,207,238,162,239,122,116, 38,161, 90, 65,144,224,251,226,105, 64, 0, 0, 32, 0, 73, 68,
- 65, 84,163, 32,142, 34,222, 53,182,165,227,166,203,222,195,118,189, 82, 88,115,177,105,129, 40,182,211,133, 65,198,162,239, 87,
- 48,100, 48,209, 8, 63, 79,152,120,159, 54, 93,174,247, 74,206, 13,151,236,178,145, 58, 10, 33,163,132,178, 57, 12,166,250,219,
- 37,248,164,209,142,173,127, 9,190,216,162, 56,196, 95,146, 66,109,152, 25,158, 76, 68,190,206, 62, 89,234, 66,218,156, 9,125,
-215, 97, 10, 83, 92,112,173,105, 36, 70,214, 70, 52,237, 48,116, 5,253, 90,168,129,101,241, 70, 25, 43, 21,192,145,169, 41,138,
- 13,173, 85, 42,180, 40,219,230,160, 54,131, 66,184, 32, 29,230,132,130,128,174, 46, 38,213,144, 45,163, 49, 73,247,173,148, 14,
- 95, 60, 36,166,214,122,234, 88, 88, 97, 88,174,213,119, 17,178, 17, 42, 7,128, 72, 81, 25, 37,254,217, 84,177,231,103,168,115,
- 22,119,214, 61,158,172,123, 60,124,242,180,164,185,217,201, 96,236, 28,134,174, 67,223,197,106,221, 89, 91,149,219,233,208,135,
-121, 70, 55,142, 88,109,142,210,216, 71,150,244,112, 53,222,146,134, 89, 82,108,179,217, 17,148,212,235, 84,194,111,170,160,208,
-228,207,149,243,234, 75,124,170,202,232,144,184, 46, 35, 41,200, 27, 45, 76,233,240,181,185,241,213,141, 3,165, 72,143,219,123,
-169,206, 25,141,221,171, 69,223,162,145,117, 83, 10,188,146, 68, 44, 92,174,123,164, 70,123,205,235, 64,197,113, 38,107,158,163,
-228, 87, 54,217,255,216, 16,179, 22, 98, 93, 45,108,203,120,189,124,244, 41, 61, 34, 86, 23,225,131, 97, 58,237,190, 78, 8, 89,
-109,185, 80,249, 29,120, 0,245,182,174,124,237,180, 0,212,232, 19,109,110,103,173,251, 30,188, 31,225, 82,123,122,183,245,184,
-190,188,198,118, 28, 97,141,193,209,209,128,121,102,120, 17, 76,227,132,112, 37,248,143,254,254,127,139,255,228,239,254, 77, 56,
- 71, 8,214,224,120,189,194,229,195, 11,248, 57, 96,183, 27, 49,172,250, 68, 16, 51,240, 16,176, 15, 56, 89,119, 96, 19, 85,198,
- 69,144,150,192, 40,104, 54, 74,169,164,177,198, 14, 8,149,161, 44,133,237,156,127, 78,211,162, 95,122,165, 18, 96, 38,231,155,
- 75,185, 97, 82,187,220,160,156, 45,139,218, 32, 89, 50, 36,101,179,231,248, 86, 13,177,104, 24,233,133,190,148,218,115,106,187,
-215,172,118,110, 78,158, 84,224, 69, 57,143, 56,102,168,167, 22,151,170,216, 69,249,199,151, 41, 63,117,110,222, 38,179, 85, 16,
- 85,154, 37,114, 76, 87,170,109,115, 89,136, 65, 85, 80,134,206, 66,151,200, 26,152, 71,143,247, 31, 62,194,163,247,222, 3,252,
-132,155,155, 43,176,159, 18,132,197, 99,242, 17,212,209,185,120, 8, 36, 34,140,211, 12, 99,162, 32,139, 0, 88,107,162,160, 40,
-179, 0, 4,152, 67, 92,252,166,105,130, 15, 17,109,202, 57,222, 82,181,248, 61, 51,156, 49,152, 75, 4,101,108, 87,111,167, 25,
-239, 95,239,224,172,197, 28, 98,101,113,119,211, 97, 63, 78,112,206,226, 47,254,232, 15,195, 56, 23, 91,227, 94, 32,102,192,213,
-197, 99, 92, 60,125,138,237,110,143,187,119,238,224,102,191,199, 91,111,191,133,211,211, 51,220,189,255, 0,155,147, 51,244, 93,
- 7, 67,177, 69, 30, 35, 81,251, 58, 7, 12, 1,174, 95,149,193, 31,243,156, 4,114, 14,214,118,240, 97,134, 88, 65,231,214,232,
-251, 85,108,207, 11, 99,181, 58,194,100, 44,246,187,235, 18, 77, 43,136, 9,131,165, 37, 74, 10, 68, 34, 28, 23,124, 21, 20, 34,
-217, 31,206,161,116, 5, 96,108,220,144,210,123,139,172,238,108,125,243, 8,105,227, 70, 18,208, 89, 17,248,192,152,231, 25,193,
-199, 67, 84, 72,163, 40,231, 28, 32, 99,150,116, 66,115, 64,172,139, 89,241,198,216, 10, 32,162,148,140,144,211,215,164, 85,105,
-103, 81,161,104, 97, 72,230, 40, 72, 22,131,154,131, 81,146, 65,108,185, 26,209,247,183,168,184,229, 42,122,109,245, 67,202,243,
- 34, 21,164, 18, 66,188,111, 76, 94, 38, 67, 72,248,214,204,104, 15,160,224, 11, 96, 38,139,141,137, 90,148,105,142, 60,205,214,
- 45,230,172, 14,143,162,205,231,207,142,241,248,233, 57, 46,118,219, 50,122,232,156, 67,215,247, 88,245, 93, 68,244,166, 54,124,
-222, 96, 77, 55,192, 6,198,228, 61, 58,239, 35,231,191, 86, 41,135,145,206, 5, 50,147,186,125,146,181, 20, 42, 64, 75,119,154,
- 83, 23,209, 38,123, 98, 30,129,100, 6, 1,104, 1,216,146,196,172, 16,237,245, 95, 22,157,218, 51,159, 3,188, 42,174,183,229,
- 16, 72,233,114, 75,171, 47, 94,172, 63,181, 27,216, 8,140,147,190,130,155,224, 19,197, 16, 1, 55,124, 23, 29,125, 43, 16,184,
- 34,168, 72, 80,144,165, 62,183,206,214, 51, 31,216,150,155,153, 82,123, 84, 68, 51,138, 91, 60,103,109,197,127, 16,185, 91,117,
- 4, 4, 13, 42, 19,141,210, 79,207,145, 88, 1,104, 4, 68, 56,192,202, 53,168,146,180, 80, 71,117,174, 20,203,129, 53,132,205,
-102, 5, 22,193,241,241, 10,211, 52, 99,232, 45,142, 79, 78,225, 5,240,129,241, 15,255,179,191, 7,102,198, 56,199, 42,102,154,
- 2,214,155, 21,230,155, 61,194,236,177, 7,208,187, 24, 73,121, 51,122,244,214,180,136,216,204,244, 33, 46, 98,177, 34,228, 42,
-167,127,190,197,174, 38,153,221,144,218,208, 84,236, 28,249,228, 88, 22,140,132, 96,101,125, 24,144, 42,155, 97,164,205,211,196,
-247, 16,171,242,154,204,149,119,156, 34, 64,228, 52,211, 41,121,223,139,100, 29,169,162,148, 66,156,163, 37,194,181,158, 46,169,
-180,144,114,224, 77,138,143, 44,109,237, 44,196,108,243,134, 15, 0,195,139,217,146, 22, 4,161, 38,150,215,145,128,104,214,186,
- 52,135, 2,157, 52,104,136,176,219,207,120,244,238,187,120,231,173,183, 17,194,132,203,139,115,136, 4, 4, 31,162,250,215,217,
-130,211,132, 4,204, 1, 88, 15, 29, 66, 0,246,251, 17,206, 86, 47, 39,135, 25,134, 12,118,163, 47,213,227, 52,207,176,174,139,
-109,224, 16,210, 44, 61,192,123, 15,159, 18, 17,125,138,185,100,209,254, 84, 52,128,148,119,159,156, 23,142,128,103,198,247,124,
-219,199,240,245, 55,223, 67, 96,198, 23,126,226,135,176, 62,218,196,247,154,186, 64,126,218, 98, 61, 12,112, 15, 30,224,120,220,
-227,225,251,143,240,222,251,143,113,122,188,129,159,246,216,222, 92,225,238,179, 47,224,206,157,123, 88,173,215, 48, 20, 21,191,
-156, 81,160, 17, 63, 6,144,133, 72, 72,243,243,180, 49, 69, 52, 76,154, 81,118,232,251, 85,228,194, 59,131,121, 26, 49,251, 41,
-225,101, 45, 56,248, 52,230, 73,213, 69, 74,194,201,152, 85,136, 41,172,240,172,216, 46,209,155, 10,185, 26, 21,212, 62,250,218,
-153,193,169,147, 0,201,237,102,174, 88,104, 0,211, 52,163,239, 28,188,143, 29,186,248, 75,181, 64,245, 8, 81,101, 12, 88,235,
- 18,153,238,100, 57,193, 78, 53, 12,169,245, 45,137,227,236,109,153, 10,121,163,145,170,239, 72,182, 86, 61,170,202,250,144,188,
-177,215, 72, 97, 81,194,208, 84, 53,146, 82,172, 20, 14, 44,151,103, 57,166,210,133,226,106, 16,142,163, 11,147,175, 95,170,188,
-193, 28, 71, 26, 69,178,100,106, 16, 15,171, 1,166,186, 46,145, 1, 20,210, 33, 75,208, 27,194,203,247,239,224,241,197, 5,118,
-251, 41,197,169, 90,244, 62, 96, 14, 1,189,117,232,187,152,242,103,140,129,177, 14, 67,191, 2, 91, 3,207,177,155,208,119,110,
-161, 45, 64,219,169,105, 92, 81, 82,236,117,148,236,132, 21, 5,157, 14,164, 38,253, 44, 83, 61,233,241,223, 81,113, 90,228,206,
- 1,167, 32, 21,206, 7,198,178,158,153,202,252,201, 22,187, 69, 61, 80, 56,240, 16, 16,155,228,234,145, 74, 26, 72,135, 33,205,
-162,168, 29,139,122,175, 69,254, 77, 20, 30,183,235,123, 93,253, 98, 23,220, 64, 16, 14, 4,228,180,200,176,112, 81,245, 27, 51,
-100,151,229,159, 52,117,111, 58, 33, 10,167, 20,153,122, 74, 42,254,244,180, 43,112,163, 45,110, 69,248,135,116,184,197,230, 79,
-248,255,145,189, 74, 7, 9, 68, 80, 73, 59,173,254,189,114,203, 39, 63, 3,179,135, 97,194,202, 16,134,213,144,102,103,192,197,
-205, 22,251,253, 12, 97, 70,215, 57,172,215, 3,134,147, 83,244,171, 53,152, 5,211, 52,195, 90,134, 79,207,215,170,239, 98,117,
-230, 25,187, 48, 99,232, 58,108,134, 14,222, 11, 70, 22,108,200, 96,232,251,218, 10,202, 10,106,174,246,112, 74,202,243, 40, 24,
- 74, 40,198,132,139, 53, 70,107,249, 77, 73,245, 42,115,106,169,177, 60,185,162,201, 27,102, 77,156,170,251,112,214,198,113,193,
- 27,234,110, 10, 87,229,103,230, 83,231, 88, 74, 34, 29, 85,223,182,127, 22,224,141,133,244,161,116, 14,218,168,201,116, 99, 7,
-181,153,155, 28,193,155, 58, 9, 58,209,173,209, 73,202,237,193, 62,121,251, 47,236,252,195, 89,103,158,101,102,229,177, 15, 1,
-231,143,159,226,205, 55,223, 2,249, 61, 30, 63,126,140,222, 1,219,253, 4, 75,128,133,193,197,213, 21,250,126,192,110,191,197,
-201,122,136,155, 92,194,126, 30,245, 14,115,240,152,166, 17,100,128,217,123, 12,125, 95,158, 52,239, 61, 66,152, 17,130,199,236,
-227,133,155,230,136, 64,245,222,167, 57,121,106,107,138,196, 13, 29,132,144, 18,162,124, 8, 81,165,238, 28,156,139,182,179,155,
-121,194,235,239, 63,133, 1, 48, 7,198,179,167, 39,248,250,235,111,131,137,240,137, 15,191,136,151,158,127, 14,214,185, 84,249,
-207,240,115, 0, 66,156,239,205,129,177, 31, 61,214,235, 13, 94,121,177,199, 52,142,120,231,225, 35,248, 16,240,220,197, 57,246,
- 47,190,130,251, 15,158,199, 48,172,224,172, 45,115, 71, 6,129, 56, 96,246, 99, 28,223,164,185,165, 24, 37,166, 67,164, 39, 90,
-215,163,235,215, 8,243, 12, 65,156,109,207,126, 46, 45,111,206,176,163, 12, 0,225, 56,191, 7, 87, 38,133, 44, 70, 45,133,192,
- 21, 66,218,135,162, 80, 78,210,123,144, 84,145,150, 88, 79,174, 57,216, 44,130,121,142,218, 3, 31, 66, 12,124,241, 30,211,236,
- 49,251,144,146,201, 66,179, 94, 80,142,197,164,248,221,191,242,210,115, 77, 14,182,246, 46,231, 57,104, 80,155,132,190, 69, 73,
- 9, 70, 65,117,126, 94, 34, 60, 36, 81,206,168, 82,203, 74,133, 87,196,151,109,240,143,166, 25,234, 58, 45, 87,178,236, 57,218,
-251,178,114,154, 3,144, 66, 86,114,170, 31, 56, 68,119, 67, 86,113,231,209, 16, 49, 36,227,160, 51,191, 66,171,172, 19, 76,198,
-123, 15, 63, 71,149, 59, 51, 99,176, 22, 47, 61,115, 7,127,248,141,111,197,138,216, 58, 76, 65,224, 25,232,123, 65, 31, 24,150,
- 8,221,106,133,222, 18, 86, 93,151,226, 88,171,230, 33,111, 78,204,213,202, 35, 44, 77,186, 95,246,176,115, 26,157,196,131,101,
-170, 80, 51, 99,223, 80,105,197,231, 46, 10, 17, 69,203,177, 10, 88,145,138, 58,201,204,182, 34,232,102,133,107,166,133,103,190,
-182,224, 57,101, 79,164,202,190, 36,231,153,186, 6, 73, 13,138,201, 81,210,185, 91, 64,198, 64, 66, 75, 26,173, 14,158,236, 89,
-175,158,121, 73, 34, 78, 42,123, 43, 85, 49, 94,131,169, 20,184,188, 24,178,201,145,128,241,212,140, 66,185,169,155,101,161, 36,
-165,102, 85,108,221,167,236, 97, 21, 10, 18,173, 46, 42,122, 19, 7,198,241,102,163,111,243, 97,111, 83,191, 47,219, 33,139, 41,
-187,246, 23,222,114, 16, 16, 1,206,211, 73, 82,246, 35, 70, 18,248,217, 65,172,195,126, 59,226,250,250, 6,219,253, 88, 64, 22,
-144,152, 27,126,117,125,131,199,239,189, 7,215, 57,116, 46, 42,112, 77,246, 54,154,184,161,175, 7,135,237,205, 8, 54,140,174,
-119,216,250, 0,155, 22, 57,151, 64, 24, 80, 74,106, 83,196,123, 84,178,157, 75,138, 73,237,197,199,141,189,216, 6, 85, 30,183,
-198, 7,228,107,163,162, 4, 69,251, 48,179,231, 61,101, 45,139,212, 74, 66,183,255, 72,205,120, 26,218,154,180,169, 56, 85,204,
- 39, 85, 81, 94,205,161, 85, 72,170,102,218, 53,122, 85, 74, 75, 50,243, 6,168, 88,105, 12,216,160,201, 85, 39,232,160, 12,106,
- 19,247, 68,117,133, 22,211,117, 81, 26,142,122,202,143, 7,163,253,110,143,135,239,190,135,247, 31, 62,196,241, 42, 10,198,166,
-235,115, 92, 92, 94,160,119, 61,174,111,182, 32, 16, 38, 63,198, 86,163,159, 48,178, 71,239, 98, 32, 73, 22,105,173, 87, 27,140,
-227, 12, 31, 2,134,190,199,126,191,135,112,192,245, 52,161,239, 99,100,104,144, 56, 99,246,222,195,251, 0, 24, 11,107, 93,108,
-251, 34,182,130,103,239,147,232, 43, 47,243, 92,211,252, 36,110,170,228, 28,142,142,142,176, 94,173,112, 49, 62,194,197,126, 42,
- 42,246,253,110, 15,227, 6,192, 16, 62,244,226,243,112,233,121,243,179,199,110,191,199,184, 31, 49,123,159, 24,248, 1,236,167,
- 20,102,228,177, 31,103, 88,235,208,247, 61,200, 58, 92,157, 63,194,246,230, 2,119,159,121, 14,167,167,119,176, 90,111,208, 91,
- 11,146,100, 37, 11, 33,229,136, 39, 46,123,170, 68,172,237,225,134, 78,109,194,209,194,201, 28, 48, 77,123,248,121, 6, 75,101,
-129, 51,106,204,170, 32, 41,234, 75, 53, 24, 55,202,108,219,204, 62,246, 42,206, 78,121, 3,193, 39,145, 89,136,109,230, 36,232,
-147,228,115,103,213,177,153,189, 71,103,163,205,110,154,230,194,241,102, 70,169,220, 9, 82, 4,129,241,254, 51,232,186, 14,206,
-245,120,238,217,123,229,153,164,156, 91,176,172, 36,179,109,181, 1,149,139, 90,116, 15,117, 66,153, 71,110,140, 41, 44, 6, 20,
-148,113,235, 56,225,166, 69,155, 81,200, 92,240,162,245,251, 9, 37,144,133, 82, 69, 45,243, 28,149,235,194,209,101,145, 54,119,
- 42,227,206,248,247,114,180,106,233,176,230,136, 85,225,242,153, 56,196,215, 8,126, 78,135, 53,143, 57, 29,216, 54,157,195,253,
-179, 99,124,235,253,243, 88, 60,144,129, 24, 15, 47,192,108, 3,142,214,107,116,214,161,223, 28,193,173, 86,112, 67, 31, 69,197,
-166, 6,153,176,218, 17,152,149, 16,179,140,201,116, 90, 28, 85, 58, 39,183,238,142,210, 81, 72,182,204,130, 35,207,216, 92,221,
-193, 83, 64, 24,225,234,149,207,163, 60, 22,211,206,195,179,246,133, 53, 15, 36,174,227, 68,209,209,164,137,166,113,175,143, 7,
-140,120,224,176,176,150,147,115,133, 27,232,151, 33,179,200, 82, 49, 77,150, 99,137,110,205,137,127,156, 11,109, 82,194, 59,129,
- 43, 89,217, 74,160,198,186,228, 98,213,230, 76, 49,112, 76,148, 16, 12, 25, 82,161, 96, 30,137, 49, 94, 4, 11,122,162,144, 75,
-212,220,174, 85,167, 37, 81,254, 84,146, 5, 36,254,192,129, 47,139,136, 86,170,158, 96,189, 59, 41,193, 9, 68,176,238, 7,128,
-167, 24,234,226, 61,206, 47,111, 32, 28,112,116,247, 62,246,239,190, 3, 88,160,235,122, 32, 48,238,125,236,219,241, 43,255,193,
-127,140,235,235, 75,252,167,255,225,223,138,167, 74, 23, 49,178,235,245,128,174,235,112,185,189,198, 48,244,216, 12, 61,246, 62,
- 96,109, 98,123,196, 36, 79,108, 77,239, 41, 38, 87,245,249,100, 1, 78,169, 86,168,226,167, 38, 29,151,152, 67,118, 14, 69,116,
-208, 22,139,114, 71,177,162,244, 49,178,211,187,170,238,165, 52, 56, 68,164,182,182, 53,158, 85,235,156,243, 44, 73, 43,242, 83,
-133,159,191,251,202, 93,206,234,242, 66,195, 81, 41,101,210, 86,243,156, 70, 19, 9,192, 96,154,192, 6, 42,153,247, 36,183, 29,
- 12, 53,145,170,109, 51, 81, 10,203,121,248,222, 99, 92, 62,125, 2,139,128,243,243,115, 24, 8,252,184,199,205,108, 34, 3, 28,
-130, 59, 39,199,120,252,228, 9,246,211,140,245,208, 99,158, 99,199,230,244,244, 24,215,215, 55, 37,229,122,246, 30, 16,198,110,
-183, 67,191, 58,130, 21,198,126,183,131,129, 96, 78,115,201,113, 26,147,109, 48, 45,162, 18,253,210, 66,136,145,189,160,136,204,
- 76,243, 78, 1, 48,107,197,191, 73,170,239, 84, 93, 12,195, 10,189, 53,216,237, 71,188,119,113, 25,171,120, 17,172,173,197,204,
-140,239,251,244, 71,241,149,111,190,133, 23, 31,220,135,117, 93,234, 8,120, 92, 95, 95,227,252,252, 2, 79,159, 60,193,118,187,
- 5, 0,172,134, 30, 71,235, 21,134,213,128,213, 58,226, 97,137,128,139,171, 27, 60,121, 58,131, 67,192,213,229, 53,158,127,225,
- 37, 28,159,158,225,120,189,130,235, 7, 88,219, 85, 80,143,250,206,251,126, 40,155,200,209,241, 29,128, 5,243, 60, 97,183,191,
-193, 52,141,165, 77,155,197, 76,156, 90,164,146, 24,239,100, 76, 93, 68, 85,186, 33,140, 77,226, 45, 83,109, 59, 65, 83,184, 80,
- 90,176,101,161, 77, 62,246,104,177, 75,196, 75,137,223,249,110,156,138,152,140, 83,231,159,243,129, 43, 68,173,130, 77, 27, 5,
-153,248,251,174, 95, 97, 24,134, 40,242, 82,155,139, 49,185, 50,203, 85,122, 80,104, 89, 81, 13, 68, 42,145,167,185,178,203,173,
-223,194,227,160,106,187,204, 84,185,124,223, 51,161,193,113,138,182, 92,233, 96,145,252,108, 39,159,120,116, 69, 82, 9,162, 9,
-243, 4,147, 54,115,195, 81, 40, 71, 28,162,109,173, 60,171,185,165,206,149, 92, 87,230,209, 40,185, 22,144,252,154, 89,232, 57,
- 97,154,226,175, 16, 2,142,134, 30,125,223, 97, 76,118, 56, 10, 28, 55, 46,215,161, 59, 62,198,250,248, 8,195,209, 17, 86, 71,
- 27,216,174,135,117,182,117, 81,165, 53, 38, 22,221,188,176,239,182, 27,122, 73,108, 99,181,113,155, 90,220,229,251, 36,114, 29,
-164,133,102, 45,214,208,252,217, 89,185, 42,242,193,136, 62, 40,231,189,158, 58,226, 33,132,114, 34, 15, 53, 97,100,100,234,198,
-110,200, 64,136, 75, 81,200, 92,115, 83,140, 49, 77, 91,189,228,170,104,188,122,113, 37,104,116,172,148,110, 64,222,143, 29, 41,
-239, 37, 55,150,103, 83,197, 11, 42,180, 64, 24,117,142,145,127,136,161,114, 51, 20, 4,167,100, 74, 14, 14, 19, 93, 22,115,243,
-204,131, 35,189,176, 21,102,160,106,229, 42,112, 41, 84,130, 92,139, 72,164,106, 3, 80,135,129,190,235,176,234, 9,132, 62,249,
- 86,165,204,219,174,207, 31, 99,179,234,112,118,122, 92, 60,195,188,189,192, 63,248,123,127, 23,126,142,213,215,245,126, 6, 25,
-193,213,110, 68,240, 1,103,103, 39, 24,214, 61,196,199,118,206, 44,192, 20, 56, 37,184,153, 2,156, 17,106,231, 39,135,204, 81,
-186,229, 43,170, 27,249,173, 50,132, 37,156, 69,101,242, 26,212, 27, 32,135, 21,148, 86,103, 82, 71,178,202, 4, 23, 85,181,211,
-146,106,133,172,165, 88,124,255,185, 13,196,113, 14, 87,247, 91, 86, 20, 75, 81,199, 45,170, 7,137,210,121, 20,128, 13, 36,121,
-213,133, 13,140,225,226,189, 39,196,182,124, 40,247, 94,211, 6, 88, 84,234,181,189,117,179, 29,241,240,237,119,241,232,201, 57,
-194,254, 58,138,210,198, 29, 12, 1,125,239,208, 25,131,253,110,135, 93,250,182, 28, 9, 46, 46,247,232,173,193, 54,120,132,137,
-177, 29, 39,116,150,112,126,126,145, 62, 76,102,174, 39,123,212, 60, 99, 27,174, 32, 32, 76,227,190,108,248,134,128, 32,136,132,
- 55,196,135,118,246, 30,206,186, 50,115, 13, 44,232,156,131,112,192,148,230,191,157, 53,152, 83,176, 73, 1,133, 36,170,156,136,
-192,179, 32, 8,240,123, 95,253, 38,152, 25, 43,235, 48,135,128,239,254,206, 79, 97,154,103,188,248,236, 93,156,157,156,192, 57,
-155, 22,137,216,106,190,190,217,226,225,163, 39,120,231,225, 35,140,179, 71, 16,193, 81,239,176, 90,173,112,239,236, 4,247,239,
-158,225,248,120,131,174,235, 48,165, 48, 20, 63, 77,248,214, 27,223,196, 48, 12,184,255,236,125,220,125,230, 1, 78,142, 79,163,
-242, 29, 20,171,245, 84, 17,133,100,193,203, 36,186,235,155,167,152,167, 41,217,215,166, 66, 87,100,174,185, 7,140,232,143, 15,
- 28,202, 12,189,120,188,165,110,116,217, 98, 7,205,126,207, 60,248,212,205, 8, 25,203,156, 3, 89,210,166,158, 84, 32,241,251,
- 14, 1,215, 55, 55,232,250, 30,157,181, 8, 2, 4,142,225, 78,211, 28,197,138, 70, 5, 83, 1, 17,239,220, 15, 43,124,236, 35,
- 47, 41, 39, 13, 45, 73,218,101,179, 40,121,217, 74,240, 74, 13,176,186,230, 97, 64,141,171, 76, 17, 30, 74,113,130,228, 82,156,
-160, 2, 7, 84, 17,212,152, 9, 83,107, 56,110,232,169, 35, 99,226,189, 21,188,199, 60, 77,137,197, 49,195, 8,195,130,225,114,
- 94,120,122, 93, 35, 92,103,195, 33, 65,132, 18,201, 47, 95, 87,201, 65, 46, 28, 53, 38, 33,181,223,167,121,194,126, 76,191,166,
- 9, 28, 24,103,155, 21, 30, 94,239, 83,183, 42,173, 19,206,161, 95,175,113,124,231, 12,253,176, 66,183, 90, 97, 88,175, 83,110,
-128,169, 48, 22,237,205,134,206,236,137,237,108, 99,109, 97,117,132, 20,237,154, 91,215,180,172,208, 37,129,101,116, 50, 90, 51,
-220, 65,209,110,112, 8, 85,143,145,235, 36,170,164, 57, 81,215,186,208,228,184,218,166, 69, 65,173,178, 87, 29, 84, 91,233, 48,
- 4,147,233,126,105,180, 99,138, 85, 52, 84,107,176,193,130,245,110,202,225, 38,161, 70,146,248, 88,103,177,235, 54,124,124, 24,
-156, 78,174,170, 21, 95,220,221,205, 2,173, 75, 57, 53,134, 20,179, 58,181,171,152, 3,140,106,179,151,133,255, 86, 63, 27, 45,
- 90,233,217, 91,205,138,145,172,200, 14, 75, 0,247, 98, 78,159,103, 77, 89,100, 70, 77,178, 75, 52,247,191,255,198, 27,120,114,
-181,197, 6, 30,155, 85, 23, 5, 18,166, 75, 52, 42,139,142, 4, 87, 55,219, 40, 52, 32,224,249,231, 95,194,143,252,204, 95,198,
-245,249, 99,252,218,127,243,159, 99,146, 45,246,115,192,236, 25,163, 4,220,108,247, 56,123,230, 12, 79,159, 94, 69, 59, 17,128,
-217,115,228,106, 91,135,174,235, 21, 82, 55,239, 71,166,108,186, 37, 75,183, 17, 60,232,209,129,105,231,115,205,130,161,174, 87,
-115, 56,168,216,213, 70, 89,156, 78,250, 21,181,153,219, 62,164,102,241, 10, 48,195, 84,160, 50,133, 96,151,171,139, 18,156, 66,
-165,197,105,242,226,141,232,135, 47, 1, 41,162,168, 79,148, 88,239, 89, 85,207, 41, 63, 61,165,186,102, 38, 54, 21,123, 91,136,
-194, 66, 20,181, 95, 62, 69,168, 60, 2,194,236, 25, 15,223,127,138, 39,143, 30, 99,218,221, 96,158,246,113,129, 75,190,238, 92,
- 93,207,243,132,105, 4, 64, 22,206, 0,211,236, 17,242, 98,234,103,236,167, 9, 97, 26,177,101,151, 54,156,168,226,157,189,143,
-150,177,144,146,198, 72, 64, 93,135,235,155, 27,108,142,142,224,172, 73, 51, 65,198,232, 25,171,161,135,159,125, 17,203,116, 93,
- 31, 55,242,174, 3,200,194, 88,193,126, 55,197,153,174,106, 3,134,192, 25, 26, 93,132,168,227, 52,195,186, 9,126,246,120,239,
-241, 99,236, 83,174,122,224,128,239,250,246, 79, 96,112, 29,254,232, 27,111,226, 11, 63,250,231,226,236,189, 31, 34, 92, 36,253,
-190,239,123, 28, 31,173,113,247,236, 4,219,221, 14,215,251, 9,204,140,171,235, 45,182,151, 55,120,231,157,247,113,255,153, 51,
-188,248,194,115,184,123,122, 12,207, 1, 83,170, 90,124, 8,144,247, 31,197, 69,124,220,225,248,238,125,244,235,147,184,176,178,
- 32,120, 15, 16, 99, 24, 54, 88,173, 79,112,254,244, 33,118,219, 43, 56,219, 71,208, 12, 39,213,186, 72, 12, 93,201,135,193, 76,
- 26,236,186, 68,174, 75, 11,119,190,191,184, 18, 32, 37,169,254, 57,205,225, 57, 39,141,101,175, 47,115,209,245,100,112, 76, 36,
-202,133, 82,145,173,134, 1,227, 52,225,226,242, 26,253,208, 71,145, 22, 71,252,110, 8,105,134, 75,166,116, 14, 12, 25,116, 93,
- 15,231, 58,124,232,229,231, 43,221,234, 22,129, 47, 11,151, 42,253, 54, 49, 48,137,166, 38,202,193, 18,152,129, 82, 57, 69, 89,
- 12,167,103, 36,109, 38, 36,139,110,164,148,249, 82,177, 55,165,107, 5, 8,172,117, 73,152, 25,224,167, 41, 86,212,227, 20,121,
- 1, 28,224, 72,224, 8,209,114,139,100, 85, 99,142,233,119,169,131,198,222, 71,223,127, 34,229, 9, 85,126, 59, 7,159, 44,131,
-161, 88, 50,199,105,198,110,154,176,223, 79, 24,125, 20, 67,174, 87, 3,246,115, 40, 99, 16, 16,129,172,195,122,115,132,213,122,
-133, 97, 88,161,235,187,232, 60,200,173,246, 92, 20, 72, 77,154,203, 72, 85, 32,145, 16, 11, 97, 48,190,114,169,110,213,214,144,
-131, 82,200, 82,219, 54,151,170, 72,103,170, 62,115,225, 26, 63, 91,102,248,121,252,167,162, 80, 69, 17,174, 26,202,167,202,222,
- 8,196,165,211,168,173,138,148, 90,233, 77, 36,108,227,246, 17, 21,173, 90,123, 40,208, 2,100, 37, 70,151,165,204,172,152,206,
-226, 90,235,154,141, 36,219,132,204,130,199,174, 62, 40, 53,177,171, 85,177,222,108,222,134, 98,220,229, 1, 59,238,131, 60,109,
-202,220,207,213,130, 86,246,133, 76, 25, 19, 52,156, 93,237, 82, 47,143,213,114,192,110, 0,107, 12,198,125,164,120,109,131,199,
-115, 71, 43,220,191,119,252,255,241,245, 38,191,150,101,215,153,223,183,155,211,221,230, 53,209,103, 48,251,100, 39, 82, 37, 22,
- 37,168, 74,150, 74, 70, 9, 80, 73, 85,240,192,246,180, 70,254, 15,236,145,167,158,248,111,240,208,240,196,128, 1,195, 3, 27,
- 5, 91, 54, 92, 85,164, 85, 5,149, 26,170, 72, 49,217, 38,201,100, 54,204,140,200,140, 23,175,187,247,158,102, 55,203,131,181,
-246, 62,251,220, 8,138, 64, 34, 82,161,140, 23,239,221,123,238,222,171,249,190,223,135,207,174,247, 8, 46, 96, 24, 29,162,115,
-168,180, 66, 93,105, 84, 77,133,203,207, 62, 65,219,117,248, 63,254,167,255, 5,227,232,208,181, 53, 76, 77,184, 30, 38,248, 24,
-225, 38,143,175,127,243,247,240, 31,254,252, 91,216,247, 83, 46,170,173,164,105,173, 86,237,242,131, 78,203, 78,251,120,188,162,
-212, 82, 85, 89,134, 54,148, 65,180,116,244,231,168,228,189, 38,113,200, 2,205, 75,185,224,153,145,139,170,232,206,177,196, 44,
-102,200,202, 76,198,202, 62,216, 4, 58,200,107,246,152, 71,133, 58, 9, 93, 18, 22, 17, 71,148, 36, 96,161,218, 87, 50,137, 33,
-157, 92, 23, 90,214, 64,197,218, 32,101,174, 71,100, 46,114, 8, 17, 55, 55, 7, 92, 93,239,176,223,221, 98, 26, 14,152,220, 4,
- 80, 68,240, 14, 20,217,226, 68, 20,209, 84, 21, 42, 99, 68, 50, 24,113,232, 7,128, 28, 66, 82,204, 19, 80,105, 62, 32,186,166,
-134, 51, 6,222,141,232,170, 10, 74, 43, 12,147, 71,144,220,109, 79, 26,135,190,135, 2,176, 89,181,188, 47,119, 83,193,143,214,
-232, 26,238,160,147,250,214,128,149,241,105,111, 74,196, 54,187, 40,135, 20, 73,135,239,124,170,214,185,123, 11,114,184, 28,134,
-158,119,244, 20,241,227, 15,126,149,119,160,186,174,241,189,159,254, 18, 77,221,224,119,127,243, 43,184,119,231, 28,149,224, 96,
-181,214,104,180,197, 58, 68,156,157,109, 49, 13,123, 28,246, 7,124,126,117,141, 87,207,206, 80,213, 13, 2, 20,156, 28,200,183,
- 55, 3,126,122,243, 62,238,222, 59,197,195,135, 15, 80, 55, 21,124,140,240, 97,146,112, 34,194, 56, 12, 56,155, 38,220,185,247,
- 0, 88,159,115, 23,163, 53,154,110,139,166,233, 48, 76, 3, 92,240,176, 85,187, 20,173, 5, 63,167,169, 41,205, 80, 27,154, 89,
-241, 52, 63, 49,128, 8,224,178,248, 41,141, 92, 5, 89, 76,208, 25,112,146,127, 77, 65, 37,224,241,188, 11, 62,115,204,211, 33,
- 13, 0,171,174,131, 82, 6,251,113, 66, 24, 70, 64,241, 62,221,201,229,149, 44, 90, 90,105, 24,107,208,180, 29, 54,235, 53,140,
-209, 11, 41, 15, 33, 53, 54,148,191,246, 66, 8,251,178,222,133, 94, 60, 0,179,205, 84,146,129,242, 52, 79,168,112,137, 58,161,
-168,116,120,136,191, 67, 97, 46, 2, 18,193,142, 8, 90, 25,254, 60, 5,143,224,153,168,231,189,131, 27, 7,140, 67,207, 30,117,
- 68,182,152,105,166, 20,230, 11, 61,206,137,121, 36, 46, 2,159, 58,246, 50, 50, 84, 58,245, 40,108, 5,231, 28,166,201,161,119,
- 30,253,228, 56, 6,216, 71,104, 93,193, 86, 42, 59,112,108,205,235, 30, 91, 85, 92, 8, 91, 86,195,163, 72,232, 76,207, 67, 90,
-214,101,171, 93,242,181,167, 84,183,212, 17,103, 16, 90, 9,152,154, 67,107,210,133,174, 18,104, 39,242, 84, 34,221, 24, 94,235,
-226,231,154,139,196,108,217, 45,181,231,165,250,255,104, 92,179,176,110,211,220,144,106, 53, 67,183,102,231, 70,201, 0,152, 59,
-117,165, 69,167,145,146,226,244,139, 46,159,101,218,202,203,127, 51,105,150, 44,189,100, 79,169, 36,212, 35,230,124,207, 57, 86,
-114, 14,184, 40,242,163, 19, 59,122,241, 77,207, 0, 6,168, 95,159, 68,121,188, 40,162,133,209, 30,203,224,146, 18, 80,128,165,
- 5,101,174, 15,104,166,132,139,136, 0, 80,112, 19,227, 43, 27,173,241,249,245, 30,181,213, 56, 28, 70,182,127,120, 30, 5,218,
-186, 70, 87,107,172,214, 29, 12, 52,254,135,255,238,191, 65,140, 10,135,195, 1,186,174,176, 62, 61,193,221, 19,143,139,203, 61,
- 78, 31, 60,194, 15,254,242,207,121,220,170, 21, 66,138,170, 20,184,193,122,181, 90,254,204,234,216, 34, 61,239,214,168, 4,228,
- 20, 3,182,164,228, 95,200,108,104,134,214,164,128, 18, 77, 47,176,124,103, 95,235,226,117, 43,152,212,180, 0,183,205,229,145,
- 66,225,159, 76,202,245,185, 35, 74,120, 66,254, 51, 50,250,202, 25,230,115, 76, 46,202,143, 69,193,242, 86,229,123,172,211,123,
-157,178,168,129,168,213,236,196, 32, 64, 41,139, 97, 2,110,174,174,224,220,136,195,126, 7, 55,246,240, 33,112, 98,148,115,176,
- 98, 95,177,149, 69,240,132, 16, 8,198, 24,140,206,131,130,227, 3, 49,120, 14, 63,177, 6,149,226, 67,109,136, 4,163, 12, 40,
-242,104, 58, 70, 15,165, 45, 38,231,114, 48,200,232, 3,186,218,194, 57,143,147,205, 26,227, 56, 97,116, 14,109,211, 96, 63,244,
- 92,153, 11,239, 92, 73,220, 99,140, 17, 70, 25, 24,107,160, 13, 79, 4,106, 99, 64,164,217,238, 38,175, 37, 43,181,231,127, 87,
- 74,195, 7,225,130, 3,184,185,221, 99,187, 90, 97,242, 1, 63,254,240, 83, 84, 90,227,149,251,119,176, 90,117,232,186, 14,103,
- 39, 39,120,251,141,215,242, 33,105,148,146,110,141, 80, 91,139,182,174,217, 75, 94, 89,124,243,157, 55,112,186,217, 98, 36, 3,
-210, 6, 30,192,228, 2,118,251, 29, 62,248,213,175,240,241, 47, 63,197,163,235, 29,222,121,237, 49, 54,155,149,168,247, 7, 12,
-227,136,219,219, 29, 46,111,119,216,247, 3, 94,121, 28,209,181, 29,108,221, 33,128,125,217, 93,211,193,187, 9,251,221, 21,170,
-170,193,126,127, 11,159, 60,180, 82,172,196,100, 19,178, 54, 63, 67, 64,200,225, 71, 68,122,246, 99, 75, 22,121, 12,142, 47,126,
-165,179,149,142,114,194, 85,224, 14, 47, 93,174, 90,129, 60,131,120, 98,140,112,211,148, 49,175, 58, 70,216,202,162,142,132,195,
- 48,102, 5,119,136, 73, 67,194,148, 67,101, 52,172,229, 24,218,223,252,141,183,231,184,224,100,101,211,243, 78,150, 34, 73, 34,
-156,250,181, 39,219,108,215, 60,154,194,229,144,164, 50,112,115, 46,176,103,176, 38, 45,162, 60,203, 28, 13,146, 88,229, 36,168,
-210, 34,148, 99,251,154, 67,244, 30, 97,154, 56, 38,117,156,224,198, 1,214, 26, 56,231, 97,181, 98, 86, 7,241, 88, 29,210,129,
- 83, 8,249,239, 74,227,251, 20, 60, 82, 10,202,130, 15,217, 77, 48,249,128,209, 7,244,206, 99,116, 1, 83,100, 71, 75,187, 90,
- 99,156, 38,180,109,139,205,122, 37,194, 67,182, 9, 26, 99,242,164, 3,165,184, 85, 58,226, 28, 11, 45, 29, 62,251,192,227, 75,
- 22,146, 69,215, 42,159, 87, 45, 63,151, 34, 53,107, 6, 98, 20,136, 78,204, 1, 60, 78,213,139,253,120, 41,146, 59,190, 99,136,
-232, 69, 19, 86, 44, 89, 34, 88,172, 92,160, 68,228,171,102,246,123, 90, 81,151,226, 93,150, 46,148,148, 86,205,103,123, 44,180,
- 25, 37, 68, 43, 21,148,116, 36,108, 46,189,241, 60,141, 81,197,201,174,102,183, 84,250,173,217, 8,152, 81,137,177,224, 17,179,
- 88,106,198,240,149, 9,105,116,148, 82,245,247,119,235,152, 5, 48,197,158,156, 74,158,123, 82,129,235, 66, 42, 89,250,243, 85,
- 74, 52,210, 71,129, 50, 4,116, 45,234,190, 70,229, 6,236, 66,192, 39, 55, 61,198, 97,128,139, 10, 15,183, 13,206,206,206,208,
-104, 3,173, 34, 2, 17,182,167, 39, 88, 93,183,124, 88,245,138, 25,209,215,183,216,108, 87,232,247, 35,139,151,110, 7,120,101,
- 96,181, 70, 21,211,158, 76,195, 26,139,237,186, 43,246, 42,101, 48,236,113,213, 94,188, 58,105,167, 88, 92,240, 12,174, 88,218,
-253,162, 42, 56, 13,106,217, 12, 80,230,239, 83,190,236, 19,234, 85, 21, 30,238,121, 51, 33,154,124,162,204,151, 86,208,185, 19,
-167, 56,163, 15, 51,219, 95,138, 46, 93,140, 2,151,132, 58,121,136,244,172,220, 85,165,146,190,192, 12,102, 98, 86,154,248,164,
- 29,169, 55,140,228,245,183,216,239,118,216,237,110, 49,185, 41,179,198,149, 98, 37,122,101,184, 42,119,142, 69, 79,171,174,133,
-137,188,215,173, 13, 64, 30, 24, 38,135,170,170,177,173,106,120, 55, 34,164, 0, 21, 55,194,118, 29,198,145,197, 78, 85,213, 32,
- 4, 7, 21, 12,250, 97,132, 81, 60, 74,140,129,109,142,131,139,185, 91, 11,129,215, 77,214, 24, 76, 62,176, 5, 69, 70,199,198,
- 24,104,163, 36, 84,132,197, 64, 33, 18,180, 34,140,163,131, 11,236, 49,119, 62,202,126, 48,194, 26,141,144, 19,188,248, 3,244,
-244,249, 21,238,223, 57,199,211,231,151,121,255,119,247,252, 20,253,228,112,178, 94,225,209,189,187,104,235, 26,182,178, 66, 13,
-227,162,194,104, 3,219,174,160,234, 3, 86,219, 83,220,153, 70, 60,123,118,137, 87, 30,220,197, 73,189,198,100,106, 40, 83,195,
- 3,176,207,159,225,231, 31,125, 12,173, 20, 46,174,118,232,251,247,241,250,227, 7,184,127,231, 76,198,186,130, 17, 62,236,241,
-171, 79, 62, 65, 8, 1, 15, 31, 60,194,230,204, 64,245, 59, 84,166, 2, 72,161,105,215,240,206, 97,191,191,206, 69,117, 44, 32,
- 33, 49, 82,190,100,211,161, 21,131,232,122, 5,201,198, 89,218, 97,166,156, 37, 78, 95,217, 65,137,104,107,214, 22, 82,161, 30,
- 6, 42,107, 16,130, 66,180, 54,107, 18, 72, 18,232, 82, 65, 59, 78, 14, 62,120,161,218, 69,233,172,184, 83,111,218, 22,198, 84,
-184,123,231, 84, 62,187,201, 82,165,115, 88, 72, 44,197, 89, 11,157,204,203,182,140,234,104,132,175, 22,154,152, 99,234,220, 98,
- 27, 90,186, 58,138,195, 34, 74,209,147,254, 91, 14, 77,145,181,131,243,136,206,129,164,232,141, 98, 43, 12, 0,220, 48, 66, 3,
- 48,197,165,142, 24,152, 6, 88,116,234, 41, 24, 39,120,143,113,114, 82, 16,207, 66, 69,239, 3, 2, 69,248,192, 62,243, 41, 68,
-140, 33,178,141,141, 20,200, 70,212, 74,177,142,161,174,176, 90,175, 80, 55, 53,140,181,185,163, 6,138,244,195, 2,123, 29,105,
-142,245,230,184, 95,185,111, 82,204, 40, 10, 55,239, 12, 1, 96, 7, 66,122, 25, 3,229,105,146, 6, 96, 64,208,130,186, 85, 52,
-223, 95,123, 91,101, 75, 93,204,151,250, 81,177,128,121,167,175,142,223, 35,122, 73,226,104,222,185,163, 88, 37, 74,196,118,162,
-130, 22,246, 94,157, 98, 83,161,139, 24,231, 98, 82,155,214, 44, 74, 1, 20,114,225, 67, 11, 74, 93, 34,145,243,239,217,249, 15,
- 28,245,244,170, 16, 78, 9, 32, 37,143,202, 85,145,127, 93,102,192,198,242,110,154,247,105,115,247,249, 34,224,117, 89,189, 22,
-106,108,141,163, 78,189,240, 47, 34,153,174,145, 19,152, 64,106,145, 31,172,202,233,131, 82,232,162, 7, 25, 66, 99, 42,180,171,
- 14,113, 26,112, 99, 13,222,188,127,138,237,186,195,211,207, 46,177, 7, 67, 64,140,213, 56,252,242,103,120,253,157,175,192,251,
- 17,195,207,222,195,211,139, 91, 86,216,172, 91,212,171, 6, 87,159,127,134,117, 91,115,151,238,121,151, 18,133,241,104,140, 65,
- 93,215, 98, 81, 89,226,115, 94, 32,193,149,173,114, 17,129,163, 74, 86,106, 10,207, 66, 17,234,146, 34,250,104,233,203,159,161,
- 54,200,121,193,139, 61,123, 30,217,207, 31, 38, 42,136,124, 73,228, 24,197,188,147, 31,141,228, 91, 47, 88,142,121,102, 64, 49,
- 11, 56,210,129, 77,121, 36, 63,219,114, 80,164, 14,207,196,173, 57, 66,149, 15,104, 78, 19,251,224,231, 63, 65, 99, 13,218,182,
-130,159, 60, 90, 75, 24,199,136, 72,220,101,213, 85,133,166,174,178,101,203,202,142,127, 24, 70,177, 41,113,231,213,118,107, 64,
- 29,242,129,164,108,131,181,149, 61,120,242, 75, 67,161, 54, 10,164, 45,195, 97, 40, 64,107, 11,144,131,143, 74,162, 74, 53,200,
- 71,104,163,176, 31, 38,168,192,108,241,195, 56,194,202,136,223,249,128,186,174,133, 71,206,187, 78,147, 71,239,252, 62, 79,206,
-201, 37, 31, 81, 87, 21, 70,199,202,108,166,162,233, 68, 73, 5,160,240,254, 39, 79,241,230, 23, 30,225,233,229, 21,140, 82,216,
-172,120, 31,220,214, 53,238,156,158,160,107,107, 38,158,201,101,174,100,118, 98,219, 21, 44,245,232,214, 91,156,140, 3, 84,152,
-208,212, 29, 62,191, 62,224,213,251, 45,123,236,109,131, 74,235, 60,101, 88,215, 22,181, 86,184,117, 17,239,254,242, 19,188,126,
-187,195,100, 56,134, 71, 0, 0, 32, 0, 73, 68, 65, 84,235,143, 31,162,105,106, 12,211,128, 72, 64, 3,133,155,155, 27, 84,214,
- 32, 6,135,166,237, 48,142,131,216,240,248,217, 10,130, 96,205, 17,168,105, 12,143, 20, 25, 43,153, 5,162, 8, 78,163,229,153,
- 93, 93,200, 63,213, 60,165,155, 51,185,231, 3,113,142,176, 76,170,121, 45,157, 94, 88,240, 11, 22,232, 78,241,189,251, 72,208,
-166,130,138, 46, 95, 0, 85, 85,161,237, 86,248,218,151,223,204,137,131, 42,177, 26, 20,167,176,165, 49,170, 49,229,196,235,239,
- 73,159, 60, 18,182,170,163, 4,203,172,180,166, 37, 37,115, 46,148,151,199, 67, 42,106,116,169,156, 79, 23,174,103,101, 58, 5,
-207,191,230,125,180,133, 23,199, 79, 25,116,163, 33, 69,148,143,179,232, 47,117,251,226, 58,240, 17,232,251,145, 29, 27,129, 93,
- 27, 33,196,108, 7,244,196,110, 12, 31, 1, 71,128,151,201, 71, 8, 1,155,147, 19, 52, 77,131,182,109,208, 52, 13,195, 96,114,
-162, 98,204,119, 75,137,158,166, 72, 12, 56, 75, 35,116,196,226,242, 79, 67,196, 57,164,132, 4, 27,108,228,123, 79,103,191,150,
- 17,184,213, 90, 46,117,206,133, 71,140, 48, 49,192, 34, 96,167, 77, 30,187, 39, 93, 76, 78,179, 43,210, 9,203,209,121,121,121,
-207,193, 45,179, 14,173, 76,119, 76,129, 61, 80, 18, 99, 91,172, 64,179,132, 56,167,245,189,152,137, 18,213,114,194, 51,199, 14,
-167,215, 46,206, 95,143,102,162,140,205,106,191,163,222,154, 95, 80, 45,138, 62, 42,130, 84,230, 17,124,146,193, 43, 85,238,103,
-245,156,244, 86,166,204,188,112,159,151, 80, 22,181,176,109,100,124,104,169, 1,167,151,120,220,211,223, 75, 73,216,199,180,180,
-133,162, 27, 96,219,133,115, 24,125,192, 20, 60, 30,158, 87,152,170, 22,231,247,206, 64,209,227,226, 57,199, 86, 70,239,177,178,
- 6, 94, 18,155,126,241,131,191,195,253,215, 94,195, 59,191,241, 13,252,236, 91,223,134, 85, 10, 67, 63,194, 24,205,170, 89,171,
- 97, 8,112,177, 36,190,241, 95,106,196, 10,147, 83,211, 8, 47,174, 33,202,187, 60,217,193, 98,178,190, 29,149,239, 49,185, 2,
-232,136,193, 66, 47,192, 98, 11,106, 69,110,229,249,192,156,173, 97,165,216,110, 14, 53,160, 25,252,146,112, 12, 81, 30, 60, 53,
-239, 19, 75,232, 79, 82,202,166, 79, 43,233,249,231, 32, 93,252,183, 58, 85,150, 2, 46,146,244, 35, 20, 86,142, 57, 42, 87,227,
-203, 95,255, 50,254,223,127,243, 23,120,124,106,209, 53, 13,186,213, 6,141, 5,116,181,194, 52,244,232, 71, 57,180, 18, 81, 44,
-175, 7, 88,157,157,232, 81,253, 52,193, 26,131,160, 52,234, 90,193, 59, 47,158,219,128,186,174, 48, 57, 66,101, 43,120, 16, 40,
- 50,168,100,213, 54,216,199, 30,214,116,136,193, 99,242, 14,209,113,197,122, 24, 6,230,185, 7, 22, 69, 26,205,163,196, 16, 3,
-180,210, 24,167,137,131, 81, 36, 33,175,159, 28,148, 49,168,170,134, 61,211,149,193,213,205, 14, 74, 43, 17,107,197,188,178, 74,
-171,150, 4, 34,250,248,242, 6, 63,126,255, 67,252,248,163, 39, 92,184, 24,141,253, 48,225,241,195, 83,116,109,139,186,170,161,
- 5, 2,166,137, 59, 21, 83, 55,208,182, 66, 67, 60, 29,136,110, 18, 95,247, 53,118,187, 27,252,252, 87, 79,240,218, 67,143,237,
-221, 26,147,169,228, 57, 37, 24, 16, 26,107, 49,132,136,222, 69,252,242,217, 13,246,131,199,171, 15,207,177,221,172,160,148,198,
-228, 3,118,187, 61, 42,171,177,223,239,177, 94,173,113,178,221,161,109, 59,168,186,131,210,172,250,167,224, 65,178, 82,240,129,
- 59, 62,165, 52, 7,157, 68, 30,169, 7,154,167, 56,105,132, 76, 98, 65,138, 8, 25, 40,162,140,145, 48,148,152, 39, 68,101,222,
- 64, 6,131, 40,133, 40,140,140, 88, 66, 66,242,232,152,181, 22,233, 53,231, 29,125,204,246, 71, 45, 54, 54,107,107,188,246,234,
-195,217,122, 89,136,158,146,141, 78,155,130,155,112,212,170,224, 5, 87, 10, 45, 20,243,179, 0, 57, 85,190, 5,104,131,146,208,
-119,137,216, 86,114,164,206,182, 46,157,187,217,212, 73, 70,207,250,143,242,215, 68, 75, 76, 87,130,115, 14,211, 56,242,152, 61,
-145, 54, 19,132, 70, 94, 43,190,248,124,126,125, 3, 20, 38,101,113, 24,123, 4, 9,228,201,151, 58,177, 43, 35, 66, 33,128,241,
-212,164, 52, 52, 49, 74, 89,137,120,175,105, 91, 84, 21, 35,119, 75,189, 14, 10, 7, 78,210, 70,164,253, 50,164,168, 72, 34, 67,
- 18, 7, 15, 31, 44,179,120,143, 66,132, 38, 17,252, 5,159,127, 54,210,134, 69,167,134, 11, 87, 22, 6,122, 46, 90, 2,119,222,
- 15,122,194,175, 68, 7,146,180, 9, 20,139,236, 8, 41, 0, 67, 40,246,225,197,202, 84,169, 89,231, 52,219,112,231, 20,191,212,
-224,168, 4,107, 82,234, 72,228,166,160, 72,231,233, 55,137,101, 60, 19,239, 10, 94, 72,206,147, 47,156, 23, 73,244,188,224,201,
-147,130,229, 11,180,240,144,167,184, 15,185,172,149, 46,119, 10,115, 14,116,140,180,232,228, 74, 30,113,170,220,115,151, 39, 97,
- 38,127,255, 12,158, 22,151, 93,132,240,232, 95, 82, 5,171,130,197,152,247, 86,210, 21, 39, 42, 80,190,254, 53,240,236, 87,159,
-195,141, 35,172,102,229,103,208, 6,171,166,134,155, 38,220,222,236, 48,184,192, 35,155, 64, 8, 42,160, 61,127,140, 71,111,190,
-141,159,252,135,111,163,122,250, 9,126,255,159,255,231,248,223,255,245,191,197,132, 32,213,186,140, 20,229, 67,239, 67,196, 4,
-133,149, 49, 8, 82, 37,205,209,126,197,212,224,104, 53,145, 63,192,169, 48,162, 35,250,158, 90,150,110, 42,206,213,129, 18, 33,
- 89, 60, 66, 25,206,151,109, 10, 86,157, 3, 96,230, 39, 66, 47,162, 84, 19,142,116, 57, 57, 80,133,109,158,138,226,227,152,177,
- 95,136,219,146, 53, 73,198,149, 37,237, 79,101,102,180, 28,229, 81,177,234, 93,198,254,154,176,176, 44,126,247,251, 63,131,115,
- 35,126,240,254,103,240,222,227,149, 59, 91,108,183,107,156,111, 79, 16, 67,196,166,171, 48, 78, 30,189,139,168,173,193,237,126,
- 15,107,216,122, 70, 20,242,168,207, 90, 11,239, 29,154,186,134,115, 99, 86,161, 54,214, 98,242, 30, 77,165, 16, 13, 63,185,206,
- 1,125,112, 8, 20, 80,213,236, 87,175,173,201,185,222, 33, 4, 84, 13, 19,211, 2, 17,200, 7, 24, 99, 16,130, 23, 91,158, 64,
- 72,160, 48,142, 19,160,192,137,108,206, 3, 48, 0, 69, 12,227, 4, 99, 52,134,201,205,220,234,244, 26,145, 90, 4, 20, 2, 10,
-127,243,179, 15, 81, 9, 13,107, 28, 39, 40,165,112,186, 89,195, 86, 22,198, 86,204,212, 78, 73, 84, 0, 16, 61, 12,106,212,117,
-205, 93,200,246, 4,193,141,136, 99,143, 87, 30, 62,132, 11,132,157,155, 48, 61,249, 20,119,238,221,195,166,169,208,117, 29,252,
-225, 22, 10,132,214, 40, 28,180,130,167,136,103,183,123,144,119,120,120,239, 12,103,103, 39,104, 26,158,140, 60,123,126,131,105,
- 26,113,255,222, 93, 64, 41,220,220,222,226,228,228, 28,117,183, 2, 76,149,133,106, 65,192, 59, 62, 70, 84,117,195,170, 99,205,
-184,221,152,114,179,245, 60,102,133,209, 32,239, 69, 24,133,124,121,229, 21,143, 49,208, 49,240,250, 68,161, 88,225,240,225, 78,
-137, 54, 71,133,213, 77,118,180, 62,178,144,146,113,177,148,173,115,105,204,107,173, 69,215,173,241,149, 47,190, 49, 39,126,229,
-221,127,114,248,204, 0,154, 18,228,153, 21, 40, 47, 21,204,169, 69,114,100,210,173,164,213,102,137,230, 94, 50,182,168,116,112,
-206,182,174,244,154,128,197,113, 9,236,227,157,151, 78,125, 18, 80,146, 36,222, 73,242, 93, 98,193, 79,206, 97, 26,165,208, 43,
- 8,101,144, 36,188, 20,241,171, 73, 8,128,182,134, 55, 53,156,174, 48,248, 41,227,118, 99,224,105, 71, 76,133, 85,242,182,139,
-240,149,117, 11,220, 57, 55, 77,141,166,105,102,235, 51,205,220,116, 42, 96, 48,252,103,229, 8,138, 66,135,204,103, 76,142, 95,
-156, 47,244, 24,184, 32,241, 76,110, 84,222,137, 93, 57, 2,198, 64, 27,131, 96,152, 12, 40, 41, 69,108,205,147,192, 31, 77,132,
- 74, 87,232,139, 75, 61, 79,135,114,151, 46, 10,121,201,155, 79,216,235,185,207, 84,197,249,169,138, 48,153,148, 91, 80,100, 74,
-104, 93,176, 68,104, 17, 43, 61, 55,168,148,249,253,106,177,142,153,233,126,116, 20, 40, 3,154, 45,117, 68,128, 77,214,164, 37,
- 47, 93, 46,153,244, 0,103,102,119,250, 38, 84, 62,236, 33, 82,252, 36,252, 74,187, 48, 86,243, 38,206,174, 46,124,227,244, 82,
- 76,108,249,123, 60, 35, 72,120, 62,129, 94,168,217, 34, 64, 71, 46,237, 23,132, 10,197, 15,173, 0,184,177,135,169,106, 32, 76,
-176, 74,225,242,106,135, 87,238,157,225,118,183,199, 52,186,140, 29, 92,173, 26,156,223,189,139,103,159, 63,197,119,191,253, 30,
- 30,126,225, 13, 28,110, 47,176, 62, 57,135, 81, 10,167,175, 60,134, 26, 15, 64,116,156,196, 53,121,168,198, 10,189,137, 96,172,
-194, 40,193, 40, 41,221,170,244,151, 30,225, 81,230,203,242, 5, 56, 79, 41, 36, 64, 65, 56,154,125,252,138,232, 69, 46, 62, 29,
-165,151, 22, 10,120, 69,169,147,197,162,112, 99,152, 6,228,223,145, 45,133, 9,174,177,176,231,208, 75,160,214, 5, 52, 80,209,
-172, 95, 37, 73,177, 80, 71,181, 73,186,204,185,114,230,200,206,121, 42, 51, 79, 23,234,138, 15, 90, 91,241,222,235,201,229, 13,
- 62,185,184, 2,197,143,241,224,252, 4,167,167, 39, 88,183, 29,148, 98,236,100,119,247, 28,251,253,129, 59,232,186,129,115, 14,
-109, 83, 99,114, 14,214, 86,240,145, 0,109, 1,104,140,227,129,149,206, 98,189,154,124,128, 77,155, 3,173,177,105,106,244,195,
-192,251, 89, 31, 96, 20, 1,158, 59,110, 69, 10, 30, 60, 62,103,196, 50,167,178, 69,240, 72,211, 59, 14,168,224, 67,202,192,104,
-133,186,226, 12,128,131,172, 6, 38,231,143, 12,207,242, 10,201,123,161, 18,176, 68,139,144, 79,180, 38, 55,163,199, 23,187, 22,
- 77, 93,139, 56,142,167, 67, 58, 91, 24, 8,202, 59,152,202, 3,166, 66, 93, 91,128, 86, 8,238, 4,222, 57,168,190,135,113, 14,
-163, 34, 12,163,199, 79,127,254,115, 60,190,123,134,223,122,237, 1,254,246,167, 7, 12, 62, 96, 93, 89, 52,134, 5,123, 86, 43,
-172,107,139,195,126,143, 97,116, 56, 63,219,162,109,107,180, 2,173,233,251, 30,215, 55,183, 88,117, 29,158, 95, 95, 97,229, 38,
- 1,138, 88, 40, 99, 17,156,195, 52, 77,136, 74,195, 52, 45,148,182, 32, 9,141,241, 18,141,170, 52,119,118,100,140,156, 72, 53,
- 98,112,243,250, 78,126, 46,173,140,164,143,114,215,206,128, 26, 63, 11,137, 84,193,219, 70, 26,237,243,123,234, 3, 67, 83, 92,
-129, 54,141, 66,179,211,154, 39, 8, 77,183, 66,221,118,120,227,181, 87,138, 84,137, 34, 33,145, 88,212,104,140, 46,236, 83,130,
- 74, 79,236, 5,245,107,198,239,153,158,167,150, 44, 46,164,189,101, 49, 35,141,200,152, 40, 18,159, 62,219, 7, 85, 78,118,155,
- 21,222, 92, 24, 37,108,107,112, 60,118,103, 45,129, 88,219,130,228,203,167,113,185,231,200, 95,182, 93,138,106, 94, 28, 5, 9,
-180,162, 69, 72,186,218,108, 96,155, 6,109,183, 69,255,217,231,240,227,132,201,123,246,250,203,106,133,114, 76, 29,223, 9, 38,
-111, 64, 3, 63,115,210, 0, 38, 1,241,220,161, 98,177, 95, 95,224,193,169, 72,161,203,103,191, 52,151, 9,146, 19,188,176,235,
-153,152, 71,110, 2,188,103,110,190,164,206,193, 90,192, 24, 40,209, 79,168,148, 17,144,116, 25,228,241, 72,143,120, 15, 70, 96,
- 50, 36, 99,255,153,219, 62,127,143,233,178, 85,249,109, 68,158,196, 38,103, 88, 41,240,158, 45,102, 90, 82,224, 84,196,114,253,
-152,175,231,152, 87,165, 57, 13, 51,119,252,122, 73, 81,165,108,125,152,211, 37,213, 28,161, 5, 82,176, 51,183, 91,191,120, 88,
-167,215,155, 37,189, 11,128,138,202, 34,182,121,185,159,147,189,228,197,209,154,237, 57, 74,158,231, 56,227,234,126,173,176,100,
-105,155, 91, 18,148,242,214,160, 12, 23, 41, 34,242,162,194,139,217,101, 81, 1,206, 97,101, 8, 55, 33,194, 35,162,174, 43,248,
-224, 49, 13, 35, 98,224, 93,217,163,135,119, 80, 27, 13,219, 54, 88,173, 59, 92, 31, 70,108,206,239,224,243,171,103,248,171, 63,
-255,183,232,106,139,139,207,158,224,241,118,141,182,174,112, 59, 56,172, 5,251,106,148,226,128, 24,197,107,247,153,148,164,231,
- 42, 76,205,254,239,153,158,171,178,253, 43,145,213, 52, 20,254, 94,242,125,222,203,188, 88, 30,169,133,135,242,197,125, 92, 73,
- 75,226,148, 61, 30,135,231,177,119,212,115,229,249, 50, 3, 69, 65, 46,202, 30,116,210,153,244,200, 9, 92,162,198, 79, 66, 28,
-210,108,121,203,234,118,204,151,184, 76, 42, 98, 17,247, 72, 96,245,251, 59,111,189,138, 87, 31, 63,192, 95,125,231,251, 24,250,
- 61,134,225,192, 33, 40, 8,120,242,252, 10, 79, 46,158, 67,105,131,123,103, 39,152, 86,107,172,187, 14,155,174,195,224, 35, 52,
- 8,117,213, 98,156, 60,180,102, 95, 58,127,101,139,209, 57,116,155,187,232,119, 28, 23,169,181,133, 86, 1, 46,120,137, 23,231,
- 61,121, 93, 85, 50, 46, 87,240,206, 65,215,141,224, 49, 19, 36, 69,195,251, 8,163, 5,248, 65, 17,163,128,139,200, 59, 24, 91,
-243, 62,221, 32, 79,174,120,215,206,254,244, 88,182,117, 89,226, 80,208,252,138, 44,131,244, 33,104,106,139,173, 40,137, 53, 84,
- 86,243,130, 2, 20, 25, 40,217,207,171,224, 96,109,205,235, 26,163,209, 52, 13,186,110,141, 32,128, 13, 99, 44,234,138, 96,155,
- 6, 23,187, 9,219,147,115,252,193, 63,104,240,193,167, 79,240,228,226, 10, 86, 43, 52,150,117, 4,251, 64,120,222,143,176,106,
-196,174, 31,112,247,108,139,245,122,133,166,174, 64,116,192, 48,140,172,182,175, 27,108,183,107, 52, 85, 5, 83,213,168, 87, 39,
-146,153, 48,161,233, 86,128, 50, 8,226, 66,240,130,121,173,140,129,173,235, 76,181, 34,137, 81,205,196, 15, 17,234, 41,101,144,
- 60, 45,164,197,222,228, 61, 72, 25,144,138, 32,242, 11,101, 49, 37, 2,157, 96,125,125,240,217, 58,232,132, 32,167,101,146,163,
-181,134,149, 93,250,215,191,242, 86, 78,248, 34,104, 32, 70,104,104, 68, 86, 65, 22, 29, 89,204, 83,203, 89, 18, 67,153,141,255,
-107,199,239, 89, 0, 43, 82,160,156,212, 53, 23,205, 90,178, 0, 52, 69,144, 54, 24,180,149, 29,190,153, 47, 72,173,179, 51,133,
- 4, 11,236,189,135, 27, 71, 4,177, 89, 38, 32,141,247, 30,193, 7, 56,239,249,191,115, 65, 94, 11,121,253,162,203,221,124,114,
- 45, 41, 16,182, 39,167,104, 78,207,176,222,110,209,110, 79,240,228,217, 37, 76,187, 66,116,220,208, 68,197,255,164,112, 25,173,
-151, 19, 63,254,190,184,144,186,124,126,137, 71,143, 30, 8,248,106,118, 48,132,120, 68,181, 92, 16,213,150,145,205, 16,129,108,
- 12,129,173,171,158, 5,129,138, 34,224,157, 92,238,204,185, 79, 13, 76,172, 2,162, 49,160, 96, 65,214,194,104,197,227,121, 17,
-178, 69, 21,161,131,199,185, 82,184, 16,248, 83, 38,165, 70,201, 28,144, 95,151,194,247, 35, 76,121,193, 5, 41,173,221,185,101,
-227,108, 87, 62, 47,197, 33, 3,154, 93, 5, 60, 94, 79, 54, 58,169, 14, 73,201, 35, 70,197,184,189, 8, 91, 45,243,230, 23,244,
- 79,192,102,235,153,162,101, 80,202,113,136,134, 82, 69, 12, 40,114,170, 14, 45,146,180, 40,179,171,115, 56, 66, 1,110,208,152,
-115,187,203, 19,107, 73,140,155,187, 63, 85, 16,153,102,213,168,202, 81,134,203, 17, 53,207,179, 82,226, 89,249,115,140,195, 8,
- 13,194, 89, 87,227,208, 15, 80, 90, 99, 58,140,184,255,214,151,241,228,167, 63,194,253,123, 91,172, 54, 29, 40, 68,236,251, 93,
-142,148,253,194,219, 95,198,147,159,253, 8, 77,219,225,124,213, 96,220,143,248,253,127,241, 95,224,175,255,221,159, 97,127, 17,
-176,158, 28,234,186, 98,223,171,188, 76,218,104,216,166, 41,172,100, 36, 44,121,158, 86,228,215,240, 37, 65, 55, 42,135,162,226,
- 40,137, 44, 5,169,205, 54, 49, 42,162,233,242,120,234, 72,133, 27,169, 40,196, 50, 64,134,138,130, 88, 65,235, 88,192,126,104,
-150,218,209, 17,123, 64,189,172,247,152,149,188,165,144,133, 52,150, 31,129,200, 7,163, 78, 9,112,201,182, 86, 66, 71, 40, 50,
-164, 36,146,116,242, 64,211, 84,248,195,223,255, 29,104,165,240,157,239,254, 16, 23, 23,207, 48,244,123,184,105,228,172,236, 16,
-240,244,217, 37, 62,195, 5,180,177,184,127,126,138, 59,219, 19, 52,171, 53,182,155, 53, 86, 93,196, 56, 77,152,166, 17, 90, 25,
-132, 8,212, 13,239,201,235,166, 5, 65, 99,232,119,153,185, 77,114, 89, 87, 21,143,246, 83, 80, 78,148,209, 58,137, 8,210,104,
-141,209, 57,104, 99, 49, 8, 81,206,170,249, 53, 54, 18,120,196, 86, 35,126, 79,125, 8, 2,178,241, 37,123,168,176, 42,241,135,
- 88, 11,129,170,204,149, 78,156,240,117,215, 96,189, 94,113, 17,169, 69,221, 43, 99,123, 21, 35,116, 85, 67,219,138,187,184,232,
- 97,180,134,142, 30, 22, 17,117,101,208,212, 21,188,115,128,226,110,171,169,107,120, 31,240,193,167,159,162,169, 42,188,245,234,
- 23,112,186,221,224, 71, 31,124,130,157,243,160, 17,232,125,192, 73,219, 96,187,106,113,232,123, 60,121,118,133,237, 97,228, 11,
-188,174,160,192,192, 29, 59, 76,184,189,189,197,122,181,194,250,244, 28,245, 20,120, 30,100, 43,172,235, 70, 40,114, 49,143,126,
-155,166,129,182, 53,160, 44, 16, 38, 46, 76,160,196,150, 37,234,110, 37, 34,183, 66, 57, 66, 2,175, 33,217,181, 39,133,124, 2,
-149,164,238, 60,138,168, 45,200,197,230, 67,128, 19,224, 16, 41, 61,207, 38,149,146,104, 80,139,135,247,239,200,251,108,114, 55,
- 4, 45,223, 19, 1,214,178, 2,158,101,214,105,218,165,101,146, 32, 43,173, 20,204,244, 18, 88, 13, 21, 12,108,149,146,198,168,
-248, 7, 4,237, 61, 95,236, 18,143,186, 82, 22,211,106, 13, 8,116,136,147,199,116,161, 6,103,186,218, 56,142,178, 47,247, 34,
- 8,151, 48, 29,129,196, 36, 88, 76, 42, 94, 3,233,236,229,247,222,101, 45,141, 6, 23,123,213,106,133,122,179,197,250,228, 20,
- 85,215,161,106, 59, 76,193, 67, 89, 38,114,146, 78,170,238,121,215,156,227,147,229,125, 10,129,189,242,135, 67,207,190,119, 69,
-136, 62,194,249, 32, 62,120,225,211,103,255,248,124, 45, 24,205, 62,118,163, 53, 42,107,217,126, 71, 17,209, 57,248,105,130,155,
-198,188, 71, 87,129, 83,232, 40,122, 32, 68, 24,195, 25, 29, 49, 6, 4,107,249,215, 24, 50,116,103,102,119,104,132,224,112, 90,
- 25,124, 46,197, 85, 12,106, 46, 12, 23, 93,125,178, 33,234, 25, 18,148,184,252,170,100, 24,148, 93, 27,119,179,145, 56,149, 82,
- 17,165,220,151,217,115, 47,235,142,164,255, 35,137,217,230, 97,169,102,150, 60, 21,123,244, 88,112, 3, 22, 22, 57,185, 43, 21,
-193,106,165, 16,138,241,231, 75,154, 93,169, 46, 37,207, 21, 71, 65,105, 52, 7,161, 45,188, 82,242,162,169,114,204,252, 82,235,
-199,145,144, 68,198, 24, 49, 18, 72,199,101,123, 72,197, 95, 70,229, 15,162,178,160,111, 65, 25,204,149,120,141,232,118, 8, 20,
- 48, 58,143,211,179, 13,238, 63,124, 21, 95,251,189, 63,194,255,250,131,239,161, 93,181,217,254,208, 84, 6, 83, 47,249,214,162,
-246,188,255,240, 21,169,144,129,223,254,131, 63,194, 95,255,249,159,229, 23, 24, 57, 24, 33, 98,138,220,185, 85, 85, 93,188, 68,
-154,147,216, 98, 9, 97, 65,230, 66,191,120, 79,150,156,116,181, 88,113, 35,211,224,244,114,119,147,216,234,185,162,156, 19,244,
- 84,233,111, 20, 75, 98,218, 27, 41,201, 88, 79,254,219,185,139, 40,202,180,151,196,160,190,232,187,159,137,113,124, 88, 97, 65,
-217, 42,247,247, 51,220, 65,229, 44,226,236,222, 16, 52,168,138,144,128, 33,157, 97, 20,223,252,198,111,192,104, 5,135, 21,254,
-253,191,251, 54, 46,158, 61, 1,105, 30,197,165,241,226,211,103,207,241,244,217,115, 84,117,141, 7,119,206,177, 89,175,177, 89,
-175,229,242,138,104, 42,133, 41, 68, 24, 91,207,121,211,166,230, 40, 79,226,110,218,128,177,172,156, 11,109, 16, 2,219, 20,125,
-218, 17, 66,193,104,142,151,116,228, 97, 37,119, 60, 68,207,162, 53,163,243,165, 20, 66,132, 54, 22, 33, 38,214,120, 40,198,174,
-101, 14,178,112,171, 23,185,241, 75,238,127, 36,224,108,187, 70, 43,104, 77, 37, 43, 46,164,188,107, 74,112,142,132, 88, 13,208,
-240,176, 20, 80, 81, 68,173,129,216, 54,249, 48,240,129,227,132, 35, 69,156,157,157, 33,134,128,171,195,132,166,233,240,213, 55,
-190,128,207,174,118, 24,160,240,246,102,139, 70, 43, 92, 95, 95,227, 48, 78, 80,136,184,222, 29,112,232, 7,116,109,131,182,173,
-112,189, 59,192,104,133,243, 45, 11,234,160,175,225,218, 21,148,109,112,231,228, 14,108,211, 65,105,131,105,154, 48,140, 3, 42,
-163,115, 10, 33,162,207,129,227,108, 25, 51, 34,182, 2,188,104, 70,120, 15, 42,170,122,109, 5,233, 73,115,160,139,140,150, 99,
- 18,224,201, 97, 28,130,135, 23,129, 92,186,216,121, 11, 99,243,243,174,181, 65, 93,183,104,187, 86,166, 24,102, 17,210,146,132,
-104, 90,203,152, 90,146,204, 84, 90, 33, 73,250, 95,148,207, 37,228,255, 46,197, 17,153, 62,145, 68, 80, 34, 78, 83,242,126, 41,
-130,100,157, 75,167, 30, 3, 84, 8, 2, 76, 25,161,252,132,105,115, 10, 85, 85, 50, 69,224,208, 45, 34, 6,151, 68, 2,250, 97,
-196,212,247,121, 85, 25, 83, 17, 57,205,124,118, 39,222,124,126,214,249, 53, 49,182,130,182, 54,115,227,161, 13, 54,167,167,104,
-215, 27, 52, 93, 7,219,180,232,214, 43, 60,122,252, 8,239,191, 63, 64, 91, 3,114,172,129,208, 57,110,116, 38,166,233, 84,188,
-203,133,221,239,247, 88,111,182,216,239, 15,104, 26, 22,139, 78, 19, 7,193,140, 3,171,234,125, 8,115,202,154,226, 28,116,173,
- 53,154,186, 66, 93,215,168,173, 65,101, 53, 32, 93,186,159, 28,166,113, 64,244,204,124, 32,207, 2, 87,190,228, 3,124,144, 40,
- 83, 5, 88, 91, 33, 84,172,227, 8,218,192, 26, 46,216,180,156,133, 14, 64,173,109, 26, 10,205, 10,245,210,195,158,243, 42, 84,
-134,217, 36,132,122, 2, 45,189, 16,249,157,137,191,130,123,149,152,204,196, 97, 40,237,131,201, 85, 84,102, 96, 65, 66,214,178,
-141,184, 80,232,167,239, 41,143,255, 23,250, 40,205,152,216, 12, 72,120, 9,147, 61, 7,198, 43,254, 6, 41,169,241,138, 21,145,
- 42, 70,186,121, 29, 44, 15,151,210,162, 90, 76,123,224,194,130,165,104,110,218,105, 89,206,202, 1,165, 23,115, 95,254,218, 12,
-246, 88,173,214,217,115,104,140, 65, 63,244, 92, 17, 81, 40,210,195,248,143,186,113, 15, 63, 12,152,250, 1,163,243, 88, 87, 6,
-207,222,127, 15,255,231, 47,222,207,157,230, 56, 76,208, 96, 91,200,254, 48,128, 98,196,197,231, 79, 97,172,197,147,143, 63,192,
- 97,114,184,119,122,142,191,253,139,111, 99, 12,236,119,124,243,107,191,133, 95,253,242, 39, 60,234,138, 17, 83,136,176,182,128,
- 82,168, 57, 96,101, 30,219,205,194, 53,165, 94,202, 8,122, 49,164, 86, 45, 21,253,179, 58,190,188, 8,230, 63, 89,164, 23, 46,
-148,150, 72,113,128, 57,239,254,248, 98,199, 34, 6,146, 72,101,109, 3, 22, 0, 32,181,200, 90,198, 11, 52,188,163, 65,132,176,
- 12,142, 12,242,133,117,167, 96, 51, 73, 39,198, 31,130, 40,204, 2,254, 47,246, 97,133,167, 79, 63,199,217,157,251, 88,173, 86,
-120,231,205, 87,241,221,239,255, 16,253, 97,135,105, 24,224,220,148, 69, 65, 79, 47, 46,241,228,217, 5,106,107,113,255,116,139,
-237,102,141,122,123,134, 70, 25, 16,121, 76, 8,194,100, 15, 0, 12,130,182, 44,130,164, 32, 19,142,164,208,230,170, 90, 39, 16,
-144, 98,229, 59,148,102,145, 92,140,176,182, 65,244, 6, 49,112, 23,170,181,129, 74,208, 14,239,225, 35,112,232, 7,217,195,207,
-124, 0, 22,131,206, 98, 21, 74,127, 71,145,200,151,188,179, 4,224,206,201,150,191,182,214,208,194,121,167, 24, 0, 35, 86,171,
-192,227,107,138,150, 47, 6,165, 80, 85, 21, 98, 8,104,196,250, 21,173, 1, 53, 21,251,152,189,199,193, 7,132, 20, 72,161,128,
-253,228, 64, 81,225,181,199,175,160,218,156, 98, 24, 70,244, 55,151,208,220, 1,192, 84, 13,188,245, 24,199, 9, 55,187, 3,134,
-193,160,235, 26,172, 87, 45, 28, 89,116,218, 34,146,134,139,192,249,233, 25,186,237, 41,140,109,224, 34, 97, 24, 71, 68,239,161,
-109,195,223,171,102,180, 48, 36,206, 57,101,174, 83, 82, 85, 43, 45,221,184, 70, 52, 85, 86, 93,199,140, 44,245,121,196,158,225,
- 40, 33,100, 26, 89, 76,246, 43, 41,200, 66,140, 18,171,202,182, 37, 72,180,173,177, 21,222,121,243, 11,185, 16, 77, 62,116,164,
- 40,220, 20, 84, 69,188,102, 75,171,170,168, 82, 4,121,161, 30, 87, 69, 46, 83, 41,143,147,245,164,166, 8, 29, 3, 16, 34,239,
-122,197, 59,173,229, 60, 85,224,181, 67, 66,184, 18, 17, 84, 8,168,174, 2,204,230, 4,113,187,153, 87, 93,196, 29,173, 54,188,
-218, 56,244, 35, 20, 5, 88,201, 22,112,110,194, 56, 78, 24,198, 17,147,115,178,250, 65,158, 96, 68,137,247,109,186, 21,226,225,
- 0, 34,133,211,243, 51,108, 78, 54, 88,109,214,140, 26,238, 90, 24, 99,209,182, 44,118, 59,236,109,110, 40,148, 68, 37,115,108,
-185,206, 52,180, 57, 99, 62,192, 77, 35,246,187, 29, 46, 47,175,177, 90,175,208,247, 35,198,113, 64, 63, 12,152, 70, 39,144, 35,
-166,224, 65, 38,189, 9,202, 82, 87, 21,186,166,194,102,189,198,201,170,229,236,133, 16,224,198,129,227,115,199,129, 57, 16, 20,
-179,192,143,164, 24, 74, 88, 88, 99, 28,154,202,194, 87, 22, 77, 85, 33, 24, 30,195, 43, 2,140, 73,238,157, 9,167,186,198,149,
-143,249, 62,202,106,248, 69, 22,121, 10,180, 70,102,136,144,162, 69, 84, 56,149, 43,181,140,155,157,111,235,236, 47, 47,136,113,
-249,223,149, 90,236,201, 25,198, 52,219, 57, 75, 16, 16, 98,129, 98,207,151, 48,191, 31,118, 78, 11, 34,241, 17,210,139,198, 12,
- 17, 3,100,159,114, 1,208,103, 37,166,202,177,118, 42,169,253,142, 71,243, 5,180, 36,143, 46,138, 20,184,185, 40, 40,131, 67,
-196, 9, 45,100,180,202, 90,188,253,198, 91,184,186,248, 12, 31,127,244, 33,140, 40,105, 73, 3,103,231,119,121,124,171, 42, 68,
- 25, 73, 37,207,236,212,247,216,239,123,192, 59, 84,181, 97, 21,115,219, 96,124,242, 12,154, 8,215, 23,151,156, 56, 69,132,113,
- 26,113, 56, 12,120,227,203, 95,195,251,255,241,175,209,110, 58,252,228,123,127,137,224, 3, 84,244,248,206,191,249, 87,232, 71,
-135, 70, 1, 79,127,254, 19, 76,217,126, 67,217,130, 97,180, 46,188,242,133,119, 31,133, 66, 63,111, 54,116, 57, 92, 92, 84,124,
-217,223, 95,100, 42,167,175,165,147,200,102,161,160, 59, 18, 35, 82,118, 55, 30,221,178, 42,139,114,248, 53,227, 88, 86,149,226,
- 89, 41,230,103,129, 10,175,255, 66, 43, 71,106,129,187, 93, 86, 35,106,193, 80,200, 29,187, 42,120, 28,145, 80,184, 31,231,241,
-123,177, 81,201,147, 12,197,233, 76,143, 31,189,137, 31,190,251, 46,126,251, 55,223, 2, 41, 3,133,128,127,250, 79,254, 49,172,
- 53,120,118,113,133,191,253,238,187, 24,243,120,158,217,222,253, 48,226,163,113,128,254,252, 25,186,238,115,156,109,183,120,252,
-240, 62,206,183, 27,244,211,132,113,162, 89, 20,154, 3, 29,180, 40,159, 83,184, 10,255,211,212, 53,250, 97, 90,196,213, 54, 85,
-197, 88, 90,136,126, 68, 78,245, 72, 0,121, 22,172, 57, 31, 5, 93, 59, 79,152,102,145, 85,145,228,135, 66,141, 42, 83,166,210,
-181,176, 89,175,160,141,206,185,204, 57,145,175,240, 43, 51,191,155, 99, 85, 33,202,120,171, 20,243, 20,172, 6,213,149, 96,151,
- 21,140,173, 96,109,133,195, 48,224, 48, 12,112,126, 20,187, 25,240,236,249,115, 84,187, 61,170,182,131,246, 1,154, 20,218,154,
-187,186, 78, 85,104,235, 10,206,249, 98, 23, 42,175, 89,100, 59,209,230,244, 12,171,205, 41, 11,230, 34, 97,114, 19,198,113, 64,
-165,249,117, 13,110,196, 68, 97, 86,242,104, 43, 9,110, 60, 30,143,133, 85, 43, 66,101,127,116, 12, 78,172, 85,188,147, 13,206,
-193,231,139, 62,100, 34, 89,250,135,228,247,185,131,231,213, 70, 20,125,144,150,209,187, 54, 6, 15,238,157, 23,231, 89,178,216,
- 69,113, 80, 24,105, 82,230, 2, 56,231,161,231,245,122,217,141,151,241, 14,185, 58, 19,170, 89,128, 14, 30,202,123, 25,149, 71,
-232,151,168,104, 18,203, 62,143,128, 67,128,186, 37, 40,239,129,243,179,124, 94,135,192,108, 4,219, 52,232,157,231, 51,206,176,
-178,221,123,158,140, 76,211, 4, 55,121,132,192,211,162, 20,151,202, 96, 32,254, 25, 55,167,167,208, 74, 97,123,122,130,237,201,
- 9, 86,171, 21, 54,155, 13, 86,171, 21,250,126, 96,145, 97, 8,176,182,202,180,201,132, 65,213, 74, 38, 47, 2, 91, 73, 46, 85,
-138, 81,198,239, 59, 60,127,126,137, 97, 28,209,247, 61,134, 97,196, 48,140, 12, 1,146,213, 64,140,133, 26, 95,176,203, 77,101,
-177,110, 42,196, 97,128,118, 39,104, 42, 37, 95,211,195, 77, 78,236,146, 12,162, 82,130, 39, 14,110, 2,165,137,152,124,134,156,
-183,104, 67, 5, 10,132,170,226, 49,188, 82,128, 9,252, 57, 10, 4,172,187, 10, 23,113,153,200, 86,242, 2,230,148,203, 34,177,
-146,202, 51,182,216,175,171, 57, 18,155,138,108,122,202, 96, 17,202, 89, 42,139, 40,222,244,153,143,133,166,166,152, 24,196, 66,
-188,151, 98,101, 73, 46,254, 84, 84, 81, 36,216, 57, 84,132,150,105, 93,115, 96,112,129,195,211,197, 37, 81, 8, 3, 10,190,119,
-177, 49, 18,182,183,140, 23, 82,120,188, 8,221, 40,123,178,165,123,207, 49,112,243,100, 32,117,142, 68,192,221, 59,119, 16, 39,
-143,159,254,221,119, 48,122,143,155,203,231, 8, 49,160,170, 44,130, 15,120,254,217,167,208,202, 96,117,114,202, 32,144,105, 68,
-213,112, 26, 16, 85, 22,253, 52,130,166, 9,111, 63,120,128,195,161,135, 85, 10,191,243,207,255, 43,252,205,255,245, 63, 98,191,
-239,197,195, 74, 64,240,248,167,255,229,191,196,207,222,253, 30,154,174,193,201,249, 25,126,249,233, 83,108,181, 2,188,131, 61,
-233,112,241,236, 10,107,165, 96, 12, 97,119,112,104,172,129,138, 1, 46, 40,212,162,234,117,206, 9,128, 38,197,166,242, 56, 72,
-139,173, 97, 12,243, 8,133, 57, 58, 58,155, 99,150,138, 17,202,157,245,140,155, 76, 25,220,180, 80,141, 19,212, 18,111,152,186,
-234,133, 55,130, 22, 59, 19,138,243, 5, 14, 9,236,209, 58, 37,185,169, 69,215, 72, 71,204,219,210,162, 94, 42,248, 23, 25,232,
-121,208,194,187,117, 30,215, 29,173, 29, 82, 8, 79, 14, 76, 80, 89, 16,169,229,226,242,246, 12,255,254,255,251,215,120,231,237,
-183,240,193,147, 29,238,108, 43,108, 55, 77, 78, 72, 59, 61,221,226,143,254,211,223, 3, 0,252,236, 23, 31,224,131, 15,127,133,
-113,216, 99, 28,216, 95, 27,137,176,219,239,112, 56,236,241,236,249, 5, 30,223,191,139,245,246, 12,171,166, 69, 32,177,232,128,
- 16,157, 67,211,174, 48, 14,123,137,128, 4, 72, 25, 70,200, 2,168, 43,195,169,105,222,229, 66, 39,196, 0,239,216,159, 30, 69,
-116,148,236, 48, 65,194, 67, 48, 75, 92,178,194,184,100, 51,168,100, 23,149, 29, 45, 45, 21, 19,176, 90,163, 22,182,123, 89, 80,
- 71,163,231, 41,142, 98,246, 55, 11, 22, 53,119,130,162,243,168,234, 70, 82, 19, 21,148,118,236,155,143, 10,119,238, 24,220, 30,
-246,120,246,252, 41,246,251, 3, 14,135, 61, 7,218,104,141,253,110, 7,123,115,139,149,173, 64,154,208, 52, 13,234,186,130, 53,
- 58,199, 91, 50, 90,213,114, 10, 98,219,162, 91,175,177, 61, 59,199,230,228, 14,172,172,161,134,105,192,112,216, 35,120, 15, 83,
- 91, 76, 46,194, 71, 7,160,103,165,181,214,208,198,178,149, 77, 27, 4, 63,101,189, 78, 74,120, 99,216, 73, 16, 8,138, 8,166,
- 10, 24, 74,140, 1, 44,145, 12,121,197,176,240, 82,139, 67, 33, 89, 61, 33,222,116, 91,213,232,218,118,134,217,164,221,185,216,
-178,120, 28, 95, 82,222,162, 8, 94, 85,206, 52,207, 23,125,201,238, 76, 53,119, 68, 22, 51,105,226, 75,153,252, 4,229,125,134,
-165,144,116,186,148,131,176,228,236,148,206, 51, 33,113, 83, 7, 79,109, 3,212,141,184,107, 52,214,155, 53,170,231, 21,162,210,
- 24,199, 9, 94,115,183, 20,188,199, 52, 58,140, 19,139, 4, 39,231, 49, 77, 35,175,171, 10, 81, 97,240, 30,221,122,131,166,105,
-112,114,122,130,245,102,131,205,102,131,110,181, 66, 85,213,184,186,186,193,225,112,128,159, 38,166, 23,106,157,181, 63, 57,156,
- 36,113,203,213, 50, 72, 42, 70,130, 27, 29,158, 61,253, 12, 39,231,103,184,185,185,193, 56,242,212,192, 57,135, 16,253,226, 18,
- 77,103, 36, 8,152, 6, 2,185, 26, 58,122,232, 24,176, 89,183, 72, 88,191, 52,145, 11,222,203,138, 81, 38, 85, 82, 8, 82, 97,
- 81,179,198,194, 55, 53,124, 19,208,120,139,202, 88, 88, 99,196,161,165, 96,106,192,218, 9,154, 52,227,141,105,110,208, 72,209,
- 60, 42,213,148, 81,198,243,142, 29, 57,222, 58, 19, 89,211,214, 56, 79,167,139, 11,189,184,240, 75,213,113,246, 13,197, 25,194,
-180,220,112, 82, 49,161,161, 34,179, 67,101,251, 48, 73, 49,104, 75, 74, 78,201, 6, 95, 72,157,148, 90, 80, 14,103, 27, 14,229,
-131, 71, 23,182,173,153,212, 69, 69, 30,123, 38,160, 20,121,225,133,102,142,150,138,171, 25,127,162,112,231,206, 61,140,135, 3,
-158,125,242, 33,194,184,135,170, 90,104, 77, 60,210,235,123, 24,163,224, 2,161,173, 53,110, 46, 62, 23, 31,240,132,187,247, 31,
- 97,127,117,129,182,171,241,246,215,190,142, 16, 2,206,238, 63,196,212, 31,128,195, 45, 92,127, 9, 43,162,172, 90, 17, 6,205,
- 35,182,191,250,191,255, 21,226,180,195,189, 7, 15,177, 31, 14,232, 15, 3,182,198,160, 50, 10,207,119,123, 12,227,132,187, 93,
- 3,163, 57,187,122, 63,121,180, 90, 99,239, 28, 98,220,225, 39, 63,250, 1,126,248,131,119,209,117, 43,124,245, 75,111,227,206,
-186,195,186,173,113,178, 89,161, 91,117,176,166, 66,244, 30,251,126,196,165,167, 12, 47, 64, 44, 37,135, 5, 36, 38,249, 57, 75,
- 42,157, 8, 42, 23, 87,120, 60, 82,254,151, 22,137, 66,135,203, 95, 39, 37, 68,241,193,169,245, 28,246, 18,101, 50,144, 8,134,
- 41, 53, 73, 45,214, 6,101, 26,145, 96, 14, 75,160,196, 98, 7, 63,139, 56, 18,106,115, 65,112,200,140,121, 14,243,201,207, 90,
- 76,176,145,136,254,234, 9,246,183, 87,120,239,246, 26,143, 31,221,195,102,181, 94,168, 66,243,244,136,128,119,222,122, 3, 95,
-122,231, 45,236,118, 59,124,247,251, 63,194,238,246, 26, 99,127,128,247, 14, 33, 6, 12,211,132, 95,124,252, 9, 86,221,115,188,
-246,224, 46,200,116, 48,166,202, 14,129,224, 6, 17,155,113,140,167,214, 90,196, 68,200,185,215,198, 48,134, 52, 18,239, 94,107,
-213, 96,156, 70, 56,231, 57, 90,149,192, 41, 96,154,196, 86, 20, 22, 44,223,184,196, 1,204, 23, 66,138, 92, 4, 45,216,207,149,
- 53,236,183,149, 73, 66,218, 27, 35, 6, 68, 5,196,168,178,119, 55, 36,107,146,173,160,172, 21,251, 30,161,174,171,156,214,103,
-155, 53,234,230, 4,187,253, 14,187,225, 6,167, 39,103,176,198,160,174, 44,250,234,128,195,225, 0, 34, 66,191,223,227,209,201,
- 6,126, 23,128,166, 69,109, 45,154,218,114,194,150, 92,200,182,146,221,103,219,161,237, 86,104, 79,206, 80, 53, 29,180, 49,240,
- 62, 96,232,123, 12,125,207, 7,162,119, 80,193, 1, 97,196,228, 88, 36,213,212, 53,136, 2,218,182,227,253,187,169,100,244, 62,
- 7,195, 68,225,181, 71, 41,192,162, 92, 70, 41,149, 45,209, 55, 35, 65, 46,250, 48,115,202,165, 16,200,133,143, 36,144, 25, 99,
- 80, 85, 53,190,252,206,235,185, 35,182,150,247,232, 94,198,193, 74,165, 36, 49,149,115,174, 19,155,127,214,138,146, 76, 94, 72,
- 46,120,190,242,210, 24, 63,166, 48,145,200,235, 24,229, 29,162,155,102, 79,156, 54,162,122, 22,235,105,138, 67,205,197, 11,123,
-171,161, 20, 84, 8,192,211, 39,160, 71,143, 65,198,192, 90,254,220,221,187,127, 15, 31,127,252, 41,174, 47,175, 48,129,129, 44,
-105,175,238, 3,219, 54,157,155, 68,127, 66,179,123, 84,244, 32,206, 57, 52,109,139,147,211, 83,180, 93,135,213,122,133,213,170,
-131,214, 12, 84,234, 15, 28,136, 85, 53, 53,235, 11, 82,158,189,154,101, 90,153, 23, 41, 19, 17, 72,206,187,155, 70, 28,246, 10,
-117, 83,225,226,226, 2, 10,188,246, 8,126,202,107,132,152,240,192, 90,243, 84, 66, 65,252,229,252, 66,187,224, 49,140, 19,172,
-102,214,133,151,231,193, 77,147, 92,236,113, 46,130,100,213, 64,210,189, 27, 99, 48,140, 53,186,182,193,186,109,209, 86, 21, 42,
-153,190,104, 91,193, 40, 3, 61,177, 99,100,138,179,250,112,167, 29,235, 0, 0, 32, 0, 73, 68, 65, 84, 61,255,100, 20,217,193,
- 19,197,190, 38,151,117, 44,180, 94,145,138, 0, 43, 61, 35,185, 35,100,215, 95,104,105,230, 27,185,152,220,203, 58, 50,129,190,
-146,160,110,182,198, 45,139,198,116,142,230,245, 56,197, 92, 16,218,236, 5,132,202, 1, 1,234, 24, 27, 43, 31, 6,149, 78,227,
-108, 89,154, 49,177, 40,236, 12, 74,128, 43, 9, 46,129, 72, 34,240, 50, 57,159, 91,145, 98, 91, 79, 18, 2, 40, 20, 21,202, 28,
-154, 0,165,113,239,236, 28,239,190,255, 30,130,119,184,217,247,136,113,199, 95, 23,196, 57,215, 20,208,173, 59,220,238,123, 33,
- 41, 25, 68,239,240,236,233, 39, 88,173, 90,108,182, 27,238, 18,172,194,238,217,167,168,186, 22,102,213,225,163,143,254, 14,223,
-187,184,193, 63,122,229, 46, 70, 31, 56,252, 65, 27,172, 90,128, 78, 31,192,108,182,184,125,126,129, 78,107, 88,173,224,180,194,
- 71,159, 93,226,142,181,168,107,139,131, 4, 26,120, 34,222,113, 70, 96,160,136,199,103, 91,156,174, 87, 80, 32,248,221, 37,168,
-209,168,170, 22,117,211,160,105, 90,216,202, 34,122, 3,101, 13,212,190,199,213,224, 65,198,130,180, 46,248,195,200,124,100, 42,
-130, 1, 80,188, 70,170, 36,245, 21,225, 17, 47,104,111,139, 8,192, 57, 66,119,238,165, 21,104,182,232,164, 98, 77,171,229,181,
- 92,204,206, 85, 1,179,161, 98,233, 63, 83,231,212,146, 99, 67, 69,181, 43,249,218, 90, 99, 81,104,100, 71, 64, 73,162, 43,108,
-137, 93, 99,240,219,191,245,101, 24,163,185,243,165, 37,247,155,150, 94, 59,132, 16,177,234, 90,252, 39,191,251, 77, 64, 1,127,
-247,238,143,241,217,103,159,193,141, 61,119, 43,222,227, 48, 76,248,201,135,159,226,108,205,225, 40,166,238,160,155, 22,211, 36,
-212, 45, 21,178, 79, 56,229, 62, 39, 72, 70, 16,240,204,228,184,122, 79,121,232, 74, 27, 78, 57,243, 5,168, 40, 19,159,104,145,
-114,140, 36,100, 4, 10, 16, 13, 31,112, 25, 31, 41, 5,117, 87, 87, 34,138, 42, 5, 60, 17,177, 72,128,138,242, 44, 90,107,249,
-121, 18,225, 80,202,238, 38,104, 84,182,130, 82,150, 93, 0,228,161, 13,176,106, 91, 0, 3,160, 54,168,141, 70,107, 13,218,186,
-194,161,169, 81, 89,131,247, 47,174,113,182,221,162,109, 27,180,117,133,182,107, 81, 25,158, 26, 88,163, 81, 53, 77,246,121, 87,
-221, 6,166,106, 0, 83,113, 18,154, 27, 48,244, 7, 12,195, 97,246, 20, 7,190,100,167,105, 68,116, 19, 83,240,100,138,177, 90,
-175, 97,171,138,131,105,148,129, 54, 21,251,162,165,128, 74,177,170, 49,178,104, 40,196, 56, 23,119, 50,166,119, 73,237, 61, 57,
- 76,222,195, 5, 22,203, 69,105,182, 32,123, 95, 91,113,224,205,253,123,231,139,174, 60,237,225, 43, 97, 36, 36, 69,114,202,131,
-228,207,136,150, 76, 6, 90,224,172,243,249,166,226,162,251,103,165,183, 7,220, 52,219,175, 34,207,238, 51,128, 38,145, 61, 41,
- 10, 68,133,178,239,124,230,143, 43, 96,242, 48,207, 47, 96, 31, 60,204, 9,150, 77, 83,227,213,215, 30,227,201,147,167, 8,147,
-227,189, 61,133, 60,114,247,206, 45, 47,244,226,136,167, 24,225,198, 30,113,189,198,237,237, 1, 15, 30, 62,224,115,202, 90,132,
-192,226, 65,182,119, 90,184, 97,156,167,171, 49, 34,106,128,162,112, 72,180,140,143,149, 20,196, 5, 12,104, 28, 14,184,248,220,
-115, 94, 98, 12,252,172, 58, 55, 23,185, 57,196, 71,132,118, 98,131,157, 38,194,104,148,232, 14, 8,168,108, 94, 27,184,105,196,
-152, 60,247,162,228,143,178,159,247,206,203, 94,156, 59,255,202, 78, 24, 38, 14,157, 89, 55, 44,190,179,182,130,129,129,181, 17,
-202, 7, 68, 29,230,221,119,230,110,164, 44, 18,238,188,117,230,183,199,133,248, 87,189, 16, 43,158, 26,219,152,227,204, 83,120,
- 90, 86,185,235,227, 22,110,153,242,171,142, 46,116, 42,125, 82,170,240, 24, 23,150, 59, 66,202, 83,199,188, 31, 93,140,224, 23,
- 41, 33,122,222, 49,164,111, 22,115, 71, 78, 11, 8,154,202, 12,114, 85,164, 26,233, 28,175, 71,243, 24,159,230,108,224, 88,244,
-145,105,243,251,230,235,111,226,227,143, 62,196, 52,236, 81,215, 22,171,174,134,243, 30, 90,105,236,251, 30, 86,107,206, 49,119,
- 19,172, 6,250, 72,240, 3,255,187,177, 26, 85,197, 0,130,224, 39,104, 16,124,244, 56,220,176,197,237,238,157,187,248,239,255,
-219,255, 26,218, 88,236,111,111,240,217,211,207,112,245,252, 57,198,221, 13, 98,187,193, 7,239,253, 4, 83, 63, 96,211, 84, 56,
- 57,223,226,175,126,249, 4, 39, 80,104,106, 5, 99, 52, 62,185,222,225,224, 61, 86, 90, 99, 55, 49, 98,118,242, 17, 99,191,199,
-197, 56,160,169, 42,172,238,157,163,171,173, 84,136, 22, 26, 17,228, 38, 80, 96,117,125, 93, 91,172,125,192,181,115,208,214,160,
-192, 8,228,226, 38,141,162, 73,209, 2, 17,180, 64,198,190, 36, 25, 80, 45,131,157,139, 93,223,210, 65,155,133,141, 80, 71,137,
-125,148,139, 53, 90, 68, 65, 34,115,156,179, 56, 68, 29, 57, 25,142,240,254,249,123,202,154,145,121, 42, 49, 91,244,102, 13, 71,
-254, 78, 75,122,141, 28,238,180,192,212, 98,185, 7, 83, 51,188, 33, 11, 84, 34,225, 31,124,237, 43,208,191,249, 85,188,255,193,
-199,248,197,251,191,196, 56, 28, 48,141, 3, 66,136,184, 62, 12,184,222, 31,240,232,124, 11, 84, 29,116,213,202,216,159, 0, 21,
-242,170, 40,241, 23,162, 15,130, 65, 77,163, 50, 13, 99, 8, 33,200,216, 54,242,238,113,114, 14,129,244,204, 45, 79,226,184,130,
- 90, 5,149,124,171,200,225, 41,243, 48,140,242, 39,189,173,171,124, 88,240,193,165, 16, 37,198,149, 36,223, 92, 19, 65, 43,203,
-130,176, 4, 44, 73,122, 8,109,128,200, 44,122,173, 52,172,214, 76, 23,235,175, 81, 27, 13,212, 21,172, 86,152, 68, 16, 87, 85,
- 22,117, 93,163,109, 26,156,108,214, 0, 20,234,202,162,105,152, 86, 87, 89, 3,107, 13,170,170, 66,221,180,168,218, 14,117,179,
-130, 93,109,160, 76,197, 60,240,129,119,177,227,192,227,247,169,239,225,166, 17,126,154,248,146, 13, 78,138,152, 91,129,192, 40,
- 92,223,238,225, 99,196,232, 2,186,182,131,130,240,242,101, 18, 99,173,129, 49, 22,218,104, 6,253, 24, 3,173,173, 8,238, 88,
-240,231,156, 23,149,181,195, 48, 77,152, 38, 15, 31,168, 96, 48, 8,235,189,174,113,178, 93, 35,132,144,157, 31, 73, 96,167,115,
- 6, 60,191, 39,186, 60,153, 82, 80,211,145, 90, 57, 9, 96, 51,183,161,136, 2, 37, 17,167, 5,231,178,109, 13, 20, 1,121,159,
- 72,242,220,115, 74,162,116,231,209, 75,148,106, 72, 33, 46,252,233,173,234, 61,116,223, 67,111,214,121,143,219,118, 45, 54,219,
- 45,158, 95, 76,152,188, 99, 91,151,116,235, 73, 95, 4, 53,119,120, 51, 51,131,215, 73,251,219, 27,220,116, 29,148,210, 60,213,
-145,213,146,209,204,100, 32,168, 60,245, 72,220,125, 21, 0,173,196,106, 39,156,125,228,240, 23,126,246,156,155,178, 21,180,109,
- 90,236,246, 59, 80,224, 61, 56,167, 19, 38,211,134, 92,148, 90,195, 40,142,161,245,142, 48, 72, 0,205, 52, 14, 44, 2, 21,248,
-147,115, 44,216,156,166,137,189,235, 33, 46,108,140, 49,136, 19, 65, 3,214, 84, 28, 17,235, 3,122, 31,177,110, 27,116,202, 8,
- 78, 25, 60, 1,201,136, 88,153, 54,166,169,187, 88,211,146,210,157,146, 32,146,104,233, 66,202,217, 61,105, 12, 95,178, 93,100,
- 31, 19,231, 84,212,180,114, 64, 1,229, 73, 43,199,168,142,226,179,139,198, 37, 63,171, 52,115, 14,202,230,218, 30, 47,248, 89,
-128,161,151,144,145, 52, 98, 80, 98,142, 87, 10, 42, 38,225,192, 76, 55,211,249,146, 47, 96,174,105,254, 47,190,105,157,201, 2,
- 42,103,233,166,238,127,129, 74, 21,191,251,205,213, 21,227, 13,125,128, 49, 28, 9,216, 90,238,134, 78, 54,107,244,253, 1,221,
-170,101, 1, 81,136, 88,175, 26,140,195,136,126, 56,160, 49, 22, 55, 55, 55,176,214, 48, 30, 86,108, 28,235,213, 10,239,127,248,
- 43,252,201,159,254, 41, 78, 54, 27, 24,107,113,239,206, 57,222,124,235,173, 66,156, 16, 65,241, 79,224,166, 9,187,253, 1, 87,
- 87,151, 88,191,251, 67,252,252, 71,239,161,213,132,104, 13, 14,163,135, 33,134,215,168, 24, 49, 6, 25,255,249, 0,109, 57, 54,
-244,238,217, 41,182,235, 21,106, 94, 18, 33, 58,222,156, 7, 33,145, 77,129, 16,253,132,241,106,135,238,254,189,163, 0,102, 85,
- 80,251, 18, 52,241, 56, 7, 70, 21,180,190, 37, 29,159,202, 8,200,194, 98, 67,133,185, 92, 45, 24,244, 51, 91, 48, 9,212, 23,
- 93,112, 25,171,187,236, 81,150, 56, 91,168,133,127,114, 97,182, 47, 41,116,122,105,233, 44, 84,115,179,167,151,212,177,123, 46,
-199, 95,150,207,230, 66, 31,152,173, 38, 75, 12,103,140,132,215, 95,123,140, 55,223,120, 21,239,253,236,125,124,244,209, 71, 24,
-135, 1,211, 52,194,121,135,143,158, 93,161,173,118,216,110,182,168,186, 13,180,177, 92,136,106,202,132, 41, 40, 6,151,104,231,
-160,140, 69, 20,161,157, 11, 1, 33,178, 69,200,143, 60,226,103, 26,227, 28,145, 73,229,150, 92, 97, 17,194, 83,134,238,148,226,
-210,244,222, 84,149,157,127,254, 20, 66,129,136,168, 44, 66,240,176,186,202,123, 96,101, 45, 72,115,200, 76, 66, 78, 34, 89,194,
-188,131, 50, 21,140, 82, 8, 83,143,198, 86,104,107, 3, 87, 71,236,251, 61, 99,117,171, 10,245, 52,161,182, 61,186,218, 98,154,
- 26, 86,251,107, 3,173, 1, 91, 89, 84,214,242,197, 95, 85,168,154, 14,245,106,133,170,219,194, 54, 45,160, 43,168,105,194, 64,
- 96, 33,212, 52,160,223,237,112,123,203,137,123,125, 47,161, 59, 50,190, 87,154,113,186,117,101,243,180, 78,107, 11,231, 82,196,
- 42,227, 75,131, 76, 61, 42,201,226,102,219, 33, 95,232, 81,146,243, 20, 56, 46, 55,101,121,135, 16, 49,137,170, 89, 51, 33, 37,
-103, 51, 88, 91,225, 75,111,191,158,173,108,136,132,128,229, 42,135, 10,242, 97, 46, 50,203,152, 68, 36, 42,163,122,225,179, 16,
-197, 22,151, 46,161,232, 3,200, 57, 40, 63,193, 64,177,219, 38,248, 57, 75, 92,235, 89,121, 17,217,147,205,251, 97,122, 97,197,
- 16,199, 17,166, 63,160,105, 91, 22,152, 2,104,154, 26,119,239,158,227,246,118, 7, 47,177,196,209, 77,136,137,188,167,144, 49,
-174,243,244, 12, 57,187, 96, 26, 7, 92, 93, 94,226,147, 79,158,224, 43, 95,249, 34, 98, 12, 60,237,112,147,232, 12,248,245,240,
- 18,111, 75, 49, 34,128, 24,234, 66,233, 49,243,226, 92, 98, 36,112,154, 16,240,154,165, 66,191,187, 6,121,158, 68, 25,165, 48,
-121, 87, 76, 20, 35, 95,176,134,157, 5,158,120,109,225, 53,224,173,198, 52, 42, 68, 97,187, 71,129,238, 76,211,132, 65,138,199,
-144, 94, 43,226,181, 75, 66,121,147, 82, 48,218,163,138,132,137, 20, 28, 12, 84,187, 2,193, 34, 70,133, 70, 22,145,201,115, 79,
- 89,157,172,243,186, 70, 41,157,149,231,138, 94, 18,137, 93,164,108, 82,142,175, 70,129, 96, 79, 66, 56,245, 66,119,175,142, 0,
-162,148,153, 37, 75,160, 82, 14,122, 73, 52, 57, 97,103, 28, 11,219, 45, 94,104,233,139,152,185, 76,136,155,199,235,121, 76,170,
-102, 22,109,218,195,146, 94, 66,100, 18,234, 81, 65, 67, 39, 1, 75,222,161,170,252, 96,209, 66,248, 59,143, 35,141,225, 81,203,
-231,159,124, 8,182, 41, 6,152,170, 66,211, 53,104,149,198,205,205, 13,154,182,197,208, 31,224,124, 64,211, 52, 44,230, 83, 26,
-219,147, 83, 40, 40,132, 0, 4, 23, 96, 26, 3, 47, 35,181,219,219,107,252,103,255,226, 79,112,114,114,194,161, 28,194, 9,214,
- 64,222,103,242,142, 59,128,218, 22,219,245, 26, 15,239,222,193, 23,223,124, 11,211, 63, 27,112,187,219,225,221,159,190,135, 95,
-252, 63,223,130,118, 17,125, 8,176, 74, 97, 12,129, 15,153, 16, 16,181,194,171, 15,238, 97, 91, 87,168, 41,192, 6, 7,141,128,
- 72, 42,131, 72, 28, 41,140, 49,226, 48, 49, 56, 97,247,252, 10,171,211,211, 23, 18,158,242, 27, 95, 86,117,233,223,213,139,129,
- 18,234,133, 70,121,225, 94,151,226,235,216,170,246,178,175,160,230,221,185, 92,176,233, 92,196, 34, 8,104, 41,234,202,135,221,
- 81,196,100, 57, 49, 72,113,150, 37, 34,115,129,165, 85,115,149, 26, 23,137,128,180,160, 79, 45, 52, 5,105,170, 17, 83, 2, 6,
-229,189, 84, 90, 10, 40, 82,160, 16,241,206, 91,111,224,237,183, 94,199,119,254,246,251,184,189,189,193, 97,191, 3,136, 48, 58,
- 15,119,249, 28,219,105, 68,221,109, 81, 53, 13,180,151,215,187, 82,153,208,165, 52, 11,134,160, 13,162,159,248, 89,141,132,209,
- 77,208,218,240, 37, 19,227,130,254,164, 68,252,149, 70,115,105, 50, 22, 41,135,123, 46,114,231,103, 48, 19,171,180, 75,143, 68,
-242,193, 39,246,118, 52, 44,244, 3, 44,180, 92, 2, 80, 90,168, 72,233,121,102,127,183, 53,149, 48, 25, 26,206, 46,112, 14, 93,
-211, 34,146,135, 13, 1,193,104, 56, 5,212, 90,193,133, 36, 76, 19, 81,165, 21,124,175,209,220,169,215,141,140,223, 55,168,186,
- 14,186,106,120,196, 43,107, 1,231, 38,140,135, 61,110,111,111,241,252,226, 18,215,187, 61, 38, 23,178, 16, 72,139,192, 74, 43,
-133, 94, 79, 34,188,210,128,246, 80,189, 92, 16,145, 15,114,163, 89, 93, 61, 74, 87,104,180,198,160,131,116,233, 12,248,201, 99,
- 92,185,252,242, 51,108, 44,180,177, 34,198,226,220,116,173, 45, 54,235, 85, 46, 82,131,216, 0, 83,151,158, 82, 17, 83,216,145,
- 22, 79,184, 86, 84,112, 27, 88, 40,151,248,220, 57,255, 32,210, 34,158, 53, 4,198,185, 70,239, 1, 31,184, 25,144, 78,139, 39,
- 47,108,241, 75, 3, 95, 18,190,122,246,232, 71,228,103, 37, 40, 5,114, 14,149,115, 48,110,130,105, 26,222,223, 67,161,105, 89,
- 60,106,170, 26, 67,127, 96,171, 24, 5, 89,169,105,152,108,169, 42,132,180,146,101,225,189, 67,127,216,225,131, 95,126,128,166,
-105,240,232,209,125,140,195,128,195,158,167, 90, 90,216,237, 33,107, 68,248,245,137, 17,240,193, 35, 82, 16, 91, 27,219, 45, 99,
-240, 50,242, 7, 98,100,145,158, 10,142, 47, 44,207,211, 44, 77, 97, 17, 35,107,192, 52, 64,210, 10,129, 2, 60, 44,188, 1,220,
-164,129, 24, 68, 40,138,156,197, 48,142, 35, 95,234,211,140, 0, 38,217,229,231, 34, 40, 65,134,104,130, 83, 6, 78,245, 24, 3,
-225,244,252, 20,103,117,195,147, 9,109, 88,189, 95,218,129,213, 28,137,154,220, 2,165,243,171, 52,247, 18,230,233,101, 42,112,
-180, 34, 68,197,252,147, 40, 72,238, 24, 5, 68,147, 63,231, 69,192,110,161, 91,227,233,126, 44,206, 67, 22, 82,231,139, 62, 77,
- 86,169,196, 19,211,124,169, 43, 85,140, 68,101, 71,163,210,156,230,200, 11,125,156,145, 62, 75,248,233, 40, 76,117,110,151, 72,
- 81, 33, 24, 41, 21, 66,106, 25,116,112, 20,127,112,186, 61,193,216,239, 49, 12, 61,180, 6,154,174, 67,116, 14,159, 95, 92,226,
-238,221, 59,128, 82,216, 31, 14, 88,181, 29,148,102, 74,150, 2,161,170, 42, 32,114,110,181,209, 10, 85,101, 16, 35,243,189,181,
- 6,110,250, 9,175,190,250, 26,108, 85,195, 8,153,203, 8,214, 86, 19,242,168, 82, 25,195, 31, 42, 17, 23,197,232, 65,211,136,
- 85, 83,227, 31,126,245,171,248,210, 27,111,224,135, 63,253, 41,254,231, 63,251, 22, 90,203,251,184,211,117,203, 64,143,205, 10,
-171,202,162, 82, 64, 77,132, 74,108, 26,253,110,135,201, 9, 20, 35, 18,250, 16,177, 31, 38,236, 70,143,195,112,141, 55,207, 78,
-103, 27, 97, 57,108, 47, 82,231, 40,171,167,227,114,208,174,168,136,241,155, 35, 77,179, 42, 11, 75,135,194,162, 85,135, 62,118,
-199,103,160, 79, 2, 47, 44, 44,108,101, 52,228, 75,160,115, 10, 47,102,210, 44, 26,250, 34, 79,249,216,135,175, 22,223,130, 32,
-128, 41,206, 19, 0, 90,162, 84, 81, 80,250, 18,203, 32,230, 81, 69, 92,228,182,147, 90, 70, 92,255,238,239,124, 3,207, 46, 46,
-241,238, 15,127, 12,189, 55, 24,250, 61,188,119,184,222,239,177,246, 14,181,219,162, 93,173,248,194, 21, 38, 2,137,178,186, 28,
-201,123,231,114,142, 56,101,132,178, 80,187,138,142, 59,185, 31, 74, 85,107,194,108,102,154,160,136, 23,185, 81,224,175,149,132,
- 61,233, 80,141, 70,129,140, 42, 64, 43,129,181, 36, 6, 51,144, 71,196,134,138, 34,148,169,242,251, 21, 61,211,219,234,186,133,
-115, 35,206,239, 62,194, 56, 13,240, 97,100, 30,190, 86,168, 52, 16,234, 42, 35, 72,115,116,173, 2,180,225, 75,221, 84, 21,108,
- 93,163,110, 91,212, 77,141,170,102, 74,156, 11,132,216, 15,240,126,194,212,239,177,187,189,197,245,213, 53,174,111,247, 24, 28,
-127, 78,115, 65, 73, 49, 31, 88,105, 10,196, 59, 80, 22,156,113,150,183, 47,193,199,220,225, 27,158, 28, 40, 99,230,241,118,228,
-176, 22, 42, 45,152,152,139, 6, 10,129, 19,187,140, 65, 93, 55,120,244,224,142, 28,210,101,164,170,153, 11, 49, 73, 5,139,242,
-158, 69,138,208, 81, 35,106,198,199,166,221, 23,199, 82,207, 25, 25, 73, 23,163,148,158,113,221, 10,152,124,132,159, 88, 40,200,
- 81,160, 62,115,215,253,228,216,246,168,103,123,108, 26,235, 83,152,247,183,129, 0, 84, 53, 42, 40,184, 16, 81, 75, 48, 9, 17,
- 49,250, 85, 28, 65,211, 52, 10,107, 33,102, 32,141,146,168,207,100,203,138, 41,171, 60, 21,192,145,224,198, 1, 55, 87,151,248,
-232,195,143,176,221,174,176,219,237,176,219,237, 48,140, 99,222, 35,207,246, 44,110,200,156,115,136, 1, 34, 60,172, 96,196,106,
-231,189, 3, 72,137,107,193, 33,134, 9, 39,155, 13, 84,116,128,209,176,134,209,199,201, 26,169,149, 66,208,115, 81, 31, 2, 23,
-127,209,107,140,122, 2, 69,147, 73,153, 36,152, 89, 39,249, 2,147, 92,234, 65,116, 88,201, 57, 65,146, 28, 7, 5,184,201, 33,
-104,131,168, 52,130,210,152,158, 95, 99,244, 17,231,119,207,113, 94,215,168,203,168, 92, 53, 59,127, 50, 70, 55,217, 85, 21,165,
-214,136, 5,114,106, 30,137, 39,245,122,226, 26,100, 17,101,186,208, 21,101,221, 16, 95,131,122,225, 38, 75, 49,215,101, 64, 86,
-118,163, 21, 66,232,228,190,152, 33,108,115,184,183,157,183,216, 84,224, 95,185, 82,202, 72,144,252, 13,204, 49,167,185,179,143,
-179,159, 14, 69,199,159,148,212,153,246, 86, 88,120,114, 76,157,136,166, 20, 81,177,203, 85, 9,190,135,186,110,112,243,252, 25,
-136, 8,187,195, 8,231, 38, 52, 77, 13,107, 13,174,174,111,176,106, 27, 52, 33, 64, 33,162,174, 13,156, 15, 18,218,193, 49,172,
-150, 8,251,219, 29,154,174,133,166,136,174,235,240,252,234, 6,127,250,199,127,140,186,174, 97,148,112,219, 5,183,169, 37,131,
- 91,103,229,126,204, 7, 65,156,122,249,112, 33,211,188,140, 86,120,253,149, 71,248,151,127,252, 79,240,191,125,235, 47,228,193,
-228, 55,123, 85, 87, 48, 32, 24,138,168,180, 66, 91, 55, 24,135, 1,171,174, 67,189, 82,216,141, 19,110, 47,175, 48,141, 35,246,
-251, 1,183,253,132,137,184,251,163,128, 34,251,137, 22, 64, 3, 0, 56, 18,189, 23, 19,142,146,193,187,176,141,191,228,234,165,
-133, 0, 78,149,158,120, 69, 5,103,126, 30, 21,107, 85,148, 95,121,106,115, 60, 15, 56,226,206, 28,193,112,143, 47,249, 99,100,
-170, 42,199,239, 25,210, 80, 48, 17,212,146, 48, 88, 90, 42,169, 68, 29, 23, 42,214,244, 36, 83,226,209,163,200,154, 39,194,157,
- 59,167,248,195,223,255, 71,248,222,247,127,132,139,139,207,177,223,221,192,185, 9,251,193,193,249, 43,132, 24,208,180, 29, 67,
- 95, 68, 77,171,141,101,232, 80,152, 47, 60,128,237, 51,147,236,122,147,226,122, 78,107, 42,214, 92, 84, 68, 85, 45,180, 1,152,
-131,232,163, 18,178, 30,242, 40, 49,202,228,130, 47,109,131,160, 21,167,196, 25,126,142,163,247,112, 32, 89,163,133, 76, 31, 84,
-228,229,146, 33, 16, 2,110,175,159, 97,181, 57,199,201,233,125,216,166, 65,244, 14,171,118,141,253,176,131, 86, 22, 86, 1, 65,
-107, 17, 75,201, 40,211, 75, 8,136, 36,171, 25,107, 97,235, 22,117,187, 70, 85,183,168,170, 6,202, 90, 76,126, 64, 12, 1,211,
- 48,160,223,239,112,123,115,131,219,219, 61, 38, 31,152,255, 94, 78,122, 36, 12, 68,107,141,198, 86,168,171,154, 71,196,218, 72,
-169, 89, 35, 70,159,173,130,147,140, 85, 17, 34, 92, 96, 69, 50,200,207,177,205, 80, 57,143, 62,163,145,147,242, 74,166, 0,214,
-214,168,234, 26, 95,122,231,245,124,222, 49,247,127,110, 84, 98, 78, 14, 76, 1,224, 9, 97, 92, 92,236,177,140, 78,149,174, 53,
-144,100,152,235,204, 81, 39, 89,201, 13,110,130, 27, 71,246,170,199, 8, 4, 39,120, 83,238,198,167,196, 85,207, 4,206,188,156,
-207,140,112,104,131,166,181,136,198,178, 72,178,216,179, 5, 31, 16,124,204,158,111,109,140, 56, 37, 34, 76, 42,152, 84, 65,224,
- 36,148, 52, 12, 6, 18, 33,224,176,223,225,234,249,115,252,252,189, 95,160,174, 13,110,174,175,113,216,237,120,157, 19, 41,231,
-115,132,192, 44, 16,133,200,142, 15,112,193, 7, 47, 33, 50,162,106,247,110,148, 75, 93,195, 7,254, 94,180, 16,249,234,202,230,
- 41,131,181,134,245, 19,169, 24,150,247,198, 5, 15,140,201,190, 73,121,167,159, 98, 81, 39,201,138,247, 46, 89,245, 56,209, 47,
-138,130, 92,169, 20, 19, 30, 1,231, 56, 12, 72, 27,144, 50,184,188,217,193, 19,224, 3,225,222,189, 59,140,253, 78,247,149, 82,
- 5,247,189, 56,221, 82,120, 79, 33, 82,158,133,221, 52,127,172,179, 17, 60, 1,216, 40, 79,189,245, 18, 96, 50,247,103,180,212,
-167, 81, 97, 5, 79, 7,165,154,149,118,243,255,175,248,159,205, 0,139,148,204,166, 41,219,203,230, 48,120, 53, 7,182,148,125,
- 32, 41, 40, 29, 23, 54, 27,238,236,116,222, 19,106,121, 97,210,225, 82,122,169, 51,172, 95,166, 3, 75,213,183, 66, 63,140, 0,
- 52, 86, 93, 7, 66,196, 56, 12,188, 95, 51, 6,209,123,244, 0,239,215, 82, 2,146,120,105,251,254, 32,150,136, 10,155,205,138,
-109, 25,206, 97,114, 30,159, 95, 94,226,254,221,251,104,170, 78, 82,174, 68,213,175,117, 14,109,200, 57,203, 90,243,223, 53,141,
-128,177,240, 61, 91,157,198,113, 20,133, 39,171,113,219,182,197,215, 31,158,227, 63,126,114, 1, 66,196,166,173,185,146,148,228,
- 36, 10, 17, 6,132, 74,222,195,186,235, 64,198,192,133,128,207,158,121,196,201, 99,232, 7,196,122,133,163,129,245,146, 47, 71,
-115, 48,203, 12, 47, 80,121, 79, 72, 71,249,168, 5,187,101,177,123, 81,185, 51, 95, 50,127,231, 24,214, 34, 52, 71,169,163, 14,
-127,182,241,228, 57,252,209, 13, 94,134,204,189, 76, 52,135,151,176,237,211,197,246,194, 54,128, 80, 84,201, 84, 4,225,208, 17,
- 97,151,178,139, 99,161,136, 47,240, 7, 58, 65, 30, 22,105,132,115, 56,199, 63,252,173,223,192,167, 79,238,226, 71, 63,254, 41,
- 14,251, 27,140,227,128,201, 71,132,219,107,120, 55, 97,189,222,200, 37, 68, 34,124,114,104,219, 53,134,225, 0,163, 52, 38, 63,
- 29,189, 23, 51,227,185, 4, 0,137, 59,169,136,182, 61, 10,129,160, 36,112,155, 63,236, 49, 43,132, 69,157, 45,225, 24,209, 24,
- 22,204, 69, 78, 34, 35,163, 97,149,130, 82, 33,103, 58,104,109,216, 35, 35,227, 82, 35,107,131, 16, 28, 90,187, 69,148,189,183,
-155, 14, 48, 10,188,147, 55, 6, 38,176,149,199, 77, 19, 95,170,146, 62,151,108,175,218, 24, 84,117, 45,130,185,154, 93, 29,138,
-247,168,227,176, 71,191,191,197,205,213, 21,174,175,111, 49, 76, 62,147, 14,141, 82, 80, 70, 21,197, 49, 95, 22, 62, 56,180, 86,
-163,210, 53, 72, 17,118,211, 36, 68, 62,134,137, 24,173, 80, 91, 30,147, 50, 36, 71,240,189,194,231, 86, 90,208,212,242,250, 37,
-186,153,150,113, 48, 71, 34, 27, 52, 77,131,205,122, 45, 73,138,179,205,114, 65, 88,160,101,144, 20,164, 27, 87, 9, 95, 29, 53,
-103, 20,164, 56,228,168, 36, 92,134,132, 91,174,114, 65,157,194, 85,134,126,196,225,208,195, 16,193,128,131, 72,162,155, 56,255,
- 60,134, 44,254, 10,145, 16,228,130, 76,107, 19,200, 88,187,238, 26,232,166,129,170,106, 40, 91, 1, 90,207, 99,244, 20,121,234,
- 60,166,105,200,211,130,164, 47,224,207,129,158, 87, 81, 69,147, 86,178,206, 99, 28,112,115,125, 9,107, 13, 86, 93,141,195,238,
- 22,214, 24, 76,142, 69,123, 9,122,226, 61, 63, 23, 28,104, 21, 97,172,102,165, 61,121,113,111, 0,110, 26,178, 37, 49,198,136,
-221,126,135,237,170,133, 38,105,166, 4,102, 19, 5,235,218, 72,144,146, 22, 20,114, 8, 60, 41, 34,173,224,195, 12,159, 9, 9,
- 52, 20, 11,123, 91,226,180,167, 21, 74, 42,158, 85, 58, 27, 52,188,247,208, 38, 64, 25,199, 57, 15, 74, 97,183,223,231, 21,192,
-221,187,231,104,219,118,249,217, 45, 14,190,197, 25, 72,201,139, 94,196, 83,211,236, 76, 74,147,198,168,136,179, 63,178, 78,105,
-182, 72,242,136,254,197, 53,169, 78, 25,236,105,143,175,230,117, 78, 18,150,243,217, 32,156,251,226, 36,183, 10, 52, 79, 94, 73,
- 45,246,153,186, 20, 97,149, 11,222,153, 85, 95,116,145, 84,196,134, 46,139, 24,100,223,189,140, 92,165,178, 69,212, 89,156,135,
- 18, 64, 35,255,107,234, 26, 79,251, 3,180, 6, 58,107, 48,129,208,247, 3, 78,183,107,198, 93,198,136,195, 52,202,200,140, 64,
-202, 32,236,111, 17, 66,192,174,239,209, 8, 55,152,192, 15,201,228, 38,124,241,139, 95,134,115, 35,118,251,107, 84,214,178, 21,
- 39, 83,238, 12,127,192, 5,205, 23,101,103, 25,228, 20, 78,161, 30, 36, 62, 86, 63, 77, 25,194,177, 94,175, 81,171,231, 32, 73,
- 81, 26,199, 17,187, 67,143, 90, 27,212,134, 57,198,155,182,193, 56, 57,168, 16,209, 53, 45,250,113, 68,165, 19,138, 20,115,236,
-223,203, 82,232, 22, 23,187,154,211,127,202, 29,208, 11,227,115,181, 16,184, 81, 22, 47,204, 74, 94, 42,160, 65, 89, 81, 46, 29,
-252,156,186, 68,139,162, 65, 21,251,235,244,190,229, 0,146, 44,148,155,181, 38, 73,112,148,127, 45,133, 98,139,116, 38, 58, 18,
-195,169, 34,156,134,230,224,151, 50,230,135,168,184, 65,243,248,128, 71,225,130,156, 85,148,126, 71, 23,177,154,179, 72, 79, 73,
-240, 13, 69,194,195,135,247,112,126,118,138,191,248,203,191,129, 54, 22,253, 97,135, 16, 3,250,126, 15,138, 1,221,230, 84,118,
-171, 17,198,218,172,236, 13, 2,122,201,135,186, 8,217,230,240,133,114, 34, 85, 12,218, 99, 25,200,163,139,226, 69,205, 23, 63,
- 20,119, 97, 98,181,138, 90, 33,134,200,163, 68,112,183,162,211, 69, 73, 51,172,133,146,136, 43,122,232, 40, 2, 63,197,254,117,
-238,156, 28,118,215,159,195,185, 17, 33,114,142,121, 37, 36, 58,168, 36,238,114,208,109,155,233,108,229, 56,210,212, 13, 42,107,
- 80, 55, 29,108, 85, 65,155,138,245, 45,211,128,177, 63, 96,119,117,137,235,203, 75,244,253,144, 9, 88,181,104, 88,210,227,230,
- 67,192, 73, 83,227,206,118, 3, 85,213, 48,117, 13, 40,131,139,155, 91,196, 67, 15,138, 81,132,111,252, 60,156,214, 6,103,173,
-197,147, 62, 48, 15, 28,132, 16, 21,162, 48,215,117,178, 92, 38,231,180,116,233, 68,220, 61, 87, 85,141,186,110,241,205,111,124,
- 85, 70,229, 49, 39,193, 49,153,152,145,181,208, 71,218,142, 4,202, 74,157, 57,210,197, 62,243, 30,210,222, 61,179, 74,210,186,
- 67,246,252, 62, 4,220,236, 14,208, 20,152,127, 31, 2,130, 27,224,199, 73, 86, 28, 4, 31, 3,156,231,226, 77, 85, 53,170,170,
-134,138, 1,182,174,208,182, 29,170,205, 6,118,181,134,169,107,152,202, 10,168, 37,105,152,248,219, 54, 2, 40, 10,222, 99,206,
-242, 42, 88, 18,105, 18,185, 16,154, 74, 42, 25, 69, 80, 32, 12,253, 30,183, 55, 53,134,131,193,238,246, 26, 48, 21, 39,236, 57,
- 70, 33, 83,240,153, 73, 78,198, 0,218,130,160, 48, 77, 19,175, 51,161, 57,213,208, 77,124,161,203, 69,231,166, 9, 83, 93,115,
-142, 79, 8,168,234, 26,186,105,224,157, 80, 16, 65, 8,251, 61,108, 85,243,159,141, 74, 58,115,169,157, 34, 79, 35,242,132, 44,
-219, 27, 69, 99, 34, 55,103,244,178, 62, 77, 52, 63,205,182,187, 64, 17, 62, 56,104,207, 46,144,116, 81,246,253,128,231,151,215,
- 80,218,224,206,185, 66, 93, 87,115,188,117, 17,124,206, 29,188,206,107,182, 52, 89,206,207, 68,185,221, 46,220, 96,156,192, 41,
-141,175,172,219,160, 34, 34, 56,231, 32, 43,220,101, 66,199,193,103, 52, 83, 40,115,195,149,180, 56,170,104,188, 0, 45, 21,115,
- 36, 73,105,163,148, 5,139,162, 3, 12, 49, 43, 62,203,165,186,122, 33,204, 99,198, 5,166,192,151,212, 25, 82,150,242,171, 66,
- 93, 31,231,240, 10,169,126,147, 0,131,226,194,243,196, 41, 80, 33, 48, 33,142, 8,149,181, 88,119, 13,220,228,228,197,212,216,
-239, 15,232,218, 26,164, 52, 14,253,158,119,109, 74,193, 77,204, 65, 30,135,136,186,110, 81, 91,141,235,219, 61,222,126,231, 43,
-232,251, 30, 90, 1,161,170,152,186, 84,215,204,181,214, 10, 70, 25, 25,193, 27, 24, 93,193, 42,141,145,246,136,129,171, 96, 82,
- 10, 1,242,112, 58, 38, 90,177, 26,148,240,198,186,198,165,116,239, 14,192,245,237, 30, 20,152,115,101,181,134,193, 9,218,166,
-193, 56, 28, 48, 70,133,174, 93,193, 90,139,105, 28,208,214, 53,130,173,242,238,248, 69, 25, 88, 41, 90,123, 73, 2,148, 18, 12,
- 45,209, 81,183, 79, 47, 10, 52, 11, 97, 91,105, 65,164,210, 82,166,139,209,183, 56, 19,248,128,140,115, 92,107,169,237, 32, 42,
-144,167,177,176,202,169, 35,139, 36, 95, 88,188,159, 45, 46,227,151, 16,240, 21, 21,163, 44, 73, 75, 75,110,139,133, 88,112,129,
-103, 46, 71,244, 10,170,240,253, 83,218,125,190, 56, 44, 40,138, 41, 66, 85, 89,252,225, 31,252, 99,252,245,119,190,139, 16, 60,
-198,225,128, 16, 3, 14,195, 1, 49,122, 52,221, 86,178,184, 45,172, 37, 68, 55,177,136, 76,105,193, 66, 70,225, 40, 8, 99,188,
-228, 51, 39,210,216,188,241,205,255, 79,202,194, 24,153,116, 73,135, 70, 10,172,100,150,221,185, 87,204,103, 8, 1, 8, 80,208,
- 42,192, 68,133, 32, 29, 74, 12, 17,128, 3,172,112,235, 53, 79,162,148,248,138,199,126,207,170,236,168,161,224,217, 57, 98,106,
- 88,219,160,106, 86,240,126,224,131,207,104, 68,211,206, 59,102,165, 16,157, 19, 39, 64,224, 75,178, 93,193, 88, 35,163,255, 9,
-126, 26, 49, 30,246, 56,220,222,224,250,234, 10,187,253, 1, 62, 68,241,180,243,206, 53,215,114, 33,226, 27,111,124, 1, 94, 3,
-104, 90,232,186,133,173,107, 80, 36,236,199,137, 85,234, 10, 88, 89,141,222, 19,238,117, 21,222, 58, 95, 67, 41,141,107, 63, 98,
-240,162,140, 87, 92, 72,199,114,151,147,197,136,210, 33, 25, 22, 27,118,221, 26,143, 31, 63, 96,106,162,120,191,181,209, 25, 0,
- 68, 73,171,146,169,113,146, 52,153,124,199, 18,156,195,161, 58, 60,138,231,195,185, 68, 4,179,167, 58,102,176, 10,101,202,160,
-243, 1, 49,120, 12, 49, 64, 83, 96,204,237, 56,228,238, 51, 68, 86,249, 7, 2,180, 15,248,255,233,122,147,159, 75,211,244,204,
-235,122,134,119, 58,211,247,125, 17,145, 89, 89,153,206,161,178, 50, 43,171,168,178,221,133,113,155,150,105,172,182,144, 89, 55,
- 98,193,158, 37, 18, 82,175, 88, 52, 11, 47, 80,139, 5, 43,224, 47, 64, 72,172, 88,128,196, 6, 36,212,136, 70,173,166, 69,117,
- 75, 46, 87,217, 93,131,115,136,200,200, 24,190,225, 12,239,121,135,103, 98,113,223,207,240,158, 72, 91, 46, 85,102,101, 68,228,
-249,206, 57,239,243,220,195,117,253,174, 78,215, 64,144,184, 89,111,176,190,190, 70,183, 89,163,106, 91, 52,171, 14, 85, 93, 23,
-138,121,206,156, 16,228, 89, 31,199, 10,103,215, 39,173, 64, 72,176, 24,193,112, 27,113,193,180,224,139,221, 57,142,171,117,192,
-225, 1,215, 55, 55, 28,134, 70, 98, 52,239, 44,167, 30,114,126,186, 82,208,154, 94,135,225,252,244,224, 3,172,153, 16,188, 77,
-197, 74, 92,201, 26,235, 48, 12, 3,208, 16,109, 83, 25, 3, 93,213,233,123,161,164, 66,219, 54, 25,171, 28,237, 91,206,231,200,
-214,200,242,119, 46,193,107, 2,103,188,123,214, 66,208, 4, 46,127,110,146,181, 19,224, 98,199, 73,250,206, 10, 41, 33,172,132,
- 82, 26,243,108,112,119,255,128,224, 29, 30, 61,186, 78, 9,156,184, 60, 37, 5,138,125,123, 40,240,233, 72, 1,102,196,117, 89,
-178, 66,188,240,144, 65, 48, 3,164,100,139, 20,103,100,188,139,189, 95, 16, 57,227,159,155,196,151, 66,164, 14,189,140, 91, 23,
- 66, 48, 38, 54, 44,237, 53, 0, 87, 10, 33,119,227,162,128,213,135,194,118, 37, 22, 81,171,124,168, 75, 81, 36,182,138,148,180,
- 37,211, 38,161, 52,221, 39, 29, 44,141, 34, 24,206, 31,173, 27,215,215,143,240,242,235,207,161, 84,133,110,215,192,219, 9,227,
-249, 12,227, 61,141,173, 32, 97,188,192, 56,156, 96,172,131,146,138, 61,194, 22, 90, 73,244,167, 30,186,154, 80, 55, 13, 86,109,
-141,227,233,136,251,251, 10,211,184, 66,211,212,104,234, 6,154,173, 57, 58, 10,230,180,166,189, 41,169, 53, 16, 60, 48,143, 19,
-219,150, 40,206,115,154, 13,198,121,194, 56, 77, 56, 15, 3,121, 65,165, 68, 45, 72, 56, 18,227, 20,125, 32,177, 94, 83, 49, 94,
- 83, 86,148, 30,228, 13, 94,189, 60,208, 3, 1,129,102,213,225,250,189,119,243,243, 37,197, 98,122, 18, 43,113,136,112, 17,145,
- 23,191, 52,252,129,197,112,158,146, 96,228, 51, 70, 54,143,121,228, 27,156,255,188, 7,162,223, 35,132, 76,157,165, 7,217, 24,
-165,200,251,195, 82,121, 31, 68,142,175,136, 58, 11,218, 35,135, 36, 40,185, 20, 2,148, 92,243, 98, 17, 85,164,250, 33,117,179,
-209,228,225, 23,149,137,184, 76, 54, 78,138,208,212, 94,197,176,148,168,181, 15,133, 77,110,177, 83, 8,233,159, 1, 1,191,254,
-237,231,152,198,129,187, 83,201,120, 80,135, 97,156, 16,188, 71,187,222, 81,166,116, 0,180,210, 64, 5,204,198,164,174, 64, 1,
- 48, 98, 78, 94,229,148,208,197,202,214,148,186, 39,114, 68,132, 72,182, 2,158, 42, 20,196, 62, 99, 29,145,233,188,135,117, 1,
-150, 12, 57,176, 0,148,170, 41, 89, 78, 48,108, 70, 8,232, 64, 22, 45, 85,224, 75,131,167,142, 73,105,197,194, 49,218, 47, 34,
- 4,234,226,149, 4,220,132, 0, 75,100, 53, 89,196, 80, 70,209,146,166,105, 22, 42, 77,151,176,214,168,116, 13, 40, 13,199,158,
-225,105, 28,112,220,239,113,120,120,128, 49,244,103, 73, 41, 81, 55, 53,180,214,240, 33,224,186,235,240,221,221,142, 98,105,219,
- 6,162,105, 89,196, 86, 65, 0, 88,111, 54,144,175, 94, 33,120,139, 86, 73,108,107, 2, 64, 61,221, 15,152,130,196,209,120, 40,
- 17, 80, 43, 42,102,173,231, 3,174,232,102,232,208,102, 97,157, 84,104,218, 14,117,211,224,179, 79, 62,202,239,114,182, 89,164,
-169,213, 98, 24, 90, 94,232,204,106,144,124,232, 66, 8, 78,210,242, 60,218,207,205,137, 23, 62,233,138, 2, 2, 89,172, 28, 1,
-174,140, 49, 24,206, 3,132,119,169,251,117,198,192,217,152, 54,199, 79,168, 15,192, 56,224,250,241, 91,144,109,139,213,213, 14,
-237,106,133,110,181, 66,211,182, 76, 92, 43, 34, 56,131,224,231,212, 83,167, 41, 37,117,201,206, 39, 56,140, 16, 28, 19,203,175,
- 47,226, 84,147, 85, 50, 68,155,157,192, 28, 6, 28,246,200, 1, 57,204,170, 15,222,195, 11, 1, 45,169, 67,167,127, 15, 69,190,
- 10,165, 24,238, 52, 39,245, 54,233, 13, 25, 10, 37, 8, 15, 75,141, 28,137, 35, 87, 74,163,173,107, 24,235,160,149,194,122,181,
-194,237,253,253, 66, 20,235,203,144,158,152,202, 23, 66,148,206,164, 33,177, 47,178, 48, 68,153, 34, 25, 66,202,124,247,176,112,
- 86, 38,170, 32,138, 84,191,161,167,160, 32, 0,184,185,190, 70,211, 16, 34, 89, 22, 17,201, 72,107,100,159, 86,213, 65, 98,145,
-147, 33, 22,147, 79, 70, 64,251, 98, 13, 90,176, 15,168,213, 46, 20,101,209,175, 31, 87,226, 16,139,236, 12, 41, 68, 10, 96, 18,
- 8,133, 11,154,243,212,113, 97, 67,138,250, 12,225,121,132, 42, 50,250, 53, 9,174,131, 88, 8, 5,104,172,224, 33,164,128,119,
-108,202,144, 17,253, 26, 43, 15, 44, 1, 55, 92,237,208, 30,190,176,201, 9,242, 81,122, 79,151,225, 52,158,208, 52, 13,156,165,
- 80, 2,178,213,212,168, 17,224,165, 66, 5, 10,237, 48,179,193,100, 45,177,138, 79, 3, 78,231, 51, 20, 2, 54,109, 13,105,200,
- 63,124, 60,245,248,205,111,126,131,243,241,128,237,102,131, 85,215,161,237, 58, 52, 85,133,186,109,233,226,213,228,193, 85, 90,
- 83,150,175, 82,216,172,111,240,112,251,154, 42,109, 14, 54, 24,198, 17,231, 97,196,158,253,183,211, 60, 83, 70,245, 52, 97,144,
- 18,168, 3, 66, 69, 15,220,253,177, 71, 87, 87, 20, 12, 1,129,182, 33,133,124, 37,129,227,221, 1,208, 26, 74,215,216,221, 92,
-177,216,226,111,223, 65,199,177,108,202,239, 21,161,208, 59, 4,188,121,205, 97, 89, 49,150, 98,248,111,206,133,171, 34, 0, 0,
- 32, 0, 73, 68, 65, 84,115,179, 5,176, 78,130,198, 74, 4,137,145,124,153,231,206, 57,238,121, 82, 88, 65,172, 94,131,120, 99,
-196,190, 4,233, 32, 39,245, 21,227,114,148, 29,120,137, 81, 44,214, 54, 8, 40,186,251, 76, 91,202,135,241,197,110, 95, 20, 69,
-140,184,132,228,228,162, 52, 86,205, 49,177,208, 26, 7,173,107,124,239,123, 31,163,109, 53,174,190,251, 99,252, 31,255,235,255,
-128,225,116,128,247, 30,231,145,246,132,235,237, 53,164,212,112,142, 84,211,202,147,175,154, 53,150,124,152,100, 68,164,144, 34,
- 43,163, 11,207,135,247, 92,195,197,140,110,246, 48,231,196, 27,193,124,115,142,115,133,128, 13, 30, 22, 10, 74,144,202,152,254,
- 61,154, 5, 76, 30,128,133, 66, 40,195,237, 1,165,232, 32, 9, 30,158,243,203, 69,240, 80, 85, 77,220,117,111, 17,180,134,150,
- 85,202, 19,143, 35,204, 72,174,115, 34,131, 52,164,174,160,171, 6, 90, 41, 26, 27,155, 9,102, 28, 48, 12, 3,250,254,132,121,
-158,233, 25,170, 42,232, 74,163,235, 58,232,138,172,127,195, 52,227, 87,175,239, 80,105,133,182,170,209, 53, 26, 87,155, 14,187,
-237, 22,168, 90, 96,187,194,203,117,135,219,251, 41,199,100,122,192,137, 0,195, 98,189,171,117, 11, 59, 79, 0, 92, 26, 39, 11,
- 25,191,171, 76,124, 11, 2, 82, 41, 52, 77,139,110,189,197, 31,255,209, 79, 19, 27, 62, 79,189,200,122, 36, 66, 88,136, 61, 23,
-161, 66,197, 84,203,179,208, 41, 94,138, 75,213, 60, 27,225,162,115,136, 31,214,216,137, 75, 69,221,226,108, 45,230,113,228, 75,
- 55,243,236, 61, 23, 39,160,142, 11,114,158,112,238,143, 88,237,118,232,152,201,174,249,156, 2,251,223, 19,247,155, 99,102, 71,
- 99,161, 56,229,108,232,123, 90,197, 20,207,170,146,153,152,224, 3,185, 6,136,254,150,191, 99,129,243,200,113, 14,168,155, 22,
-253,249, 12,201, 32,153,168,109,169,155, 54, 1,105,162, 72,216,154, 9,214,204,176,108, 93, 83, 82, 20,107, 63,240,159,239, 48,
-207, 51,130,167,159,161,170, 27, 90, 25,240,187, 92,107,114, 54,152,216,141,179, 56, 52,218, 20,163,141, 51,112,113, 34, 22,145,
- 88, 57,225, 51, 78, 88,242,196, 80, 36,159,184,115, 22,202, 41,136,208, 16, 71,192,210, 20, 66,105,141, 48, 2,183,119, 15, 16,
- 66,224,250,122,135,166,174, 89, 56, 41,242,145,197,226,215, 28, 68,201,209,187, 23, 90,166, 56, 33,204,164,205, 80,248,225,243,
-251, 34, 66,132,181,149, 80,173,144, 1, 99,133,157, 60,196, 9,148,112,153,199, 81, 56,129,116, 57, 94, 23, 69, 66, 84, 73,151,
- 43,197, 35, 16, 23, 68, 51, 68,101,116, 86, 74,135, 34,246, 51,217,167, 82,172,156, 72,251,181,244, 81,248,101,102,123, 0,240,
-225,239,124,128,215, 47,158,227,116, 60,192, 76, 35,156,157, 81,215, 21,166,153, 19,154,172,133,172, 21, 20,128,154, 51,166,107,
-235,112, 60,143,132,174,212, 84,129,125,125,183,135, 20, 2,179, 7,238, 30,246,208, 8,120,245,242, 21,174,182, 27,108, 55, 27,
-108,214, 43,172, 58, 98,178,119, 45,161, 92,235,186, 70, 83,215, 52, 90,146, 18,175,194,139,196, 38,134, 32, 18, 87,127, 62,227,
-112, 60,226, 97,255,128,135,195, 9,195, 72,121,197,214,122, 92,153, 9,179,148, 84, 81,106, 13,239, 3,110,143, 61,180,174,232,
- 82,119,244,243,207,179,229,104, 83,197, 35,186,178,137, 14,223, 58,146, 94, 36,178,137,204, 92, 14, 23,163,246, 50,202, 54,148,
-128,161,242,243, 14,249,162, 91, 64,107,120, 55, 73,123, 65,145,130, 11, 68,204,236,246, 98, 25,211, 27, 10,223,166,160,192,139,
- 60,201,201, 35,246, 80, 68, 24,102, 64, 77,193,161,142, 34,192,194, 73, 17, 15,130, 24, 56, 20,202, 17,215, 34,150,151, 10,194,
-144, 68,104,133, 56,141,167, 81,226,141, 84,131, 76,205, 35,238, 66, 96, 79,177,131, 82, 26,175,238, 30, 48,140, 3,118,183, 35,
-174, 30,191,131,243,241, 33,129, 68,134,105,134,115,119,216,108,175, 32,117, 13,231,124, 58,104,103, 99,217,203, 44, 22,170,246,
-176,152, 28, 96,161,224, 15, 40,131,218,232, 0,147, 5, 99,127, 50, 22,150, 15,127, 37, 36, 44,136,119,160,164,128,116, 62, 77,
- 50, 0,203,194, 88,153, 34, 40,193,150,175,168,128,246, 60, 73,137, 81,153,206, 76,144, 65, 67, 86, 21, 2, 60,105, 2,216,222,
- 10, 14,140,137,153,217,152, 29,125,215,116, 5, 85,213,201, 63, 79,107,168, 25,147, 49, 24,134, 51, 6, 22, 31,181, 93,139,170,
-170,208,182, 53,186,182, 75,239,209,141,144,208, 85, 3,231, 61,147,194, 60,246,103,131,135,243, 45, 42, 93,161,171, 53,254,224,
-227,247, 48,205, 79,240,226,118,143,231,247,123,156, 70, 7, 72, 96,221,213,120,114,181, 65, 48, 19,142,115,192,110,189,194,195,
-233,140, 70, 87, 8,130,148,204,105, 93,197,108,250,245,118,135,159,254,238,103, 4, 54, 9, 62, 71,135, 46,138, 84, 62, 48,211,
- 24, 30, 20,194, 82, 22,135,137, 5, 46,210,243, 32,101, 57, 97, 18, 9,116, 68, 90, 90,159,132,142,214, 24,100,185, 58,125,166,
-102,158,147, 69, 43,174, 3, 80,216,170,180,115,152,231, 17,253,254, 30,207,158, 86,164,249,120,252,152,184, 8,124,177,128,247,
-245,214,146, 24,109,178, 22, 58,120, 10, 45, 17, 72,222,102, 15, 15, 56,201, 94,125,145,232,135,145, 45,239, 56, 60, 38,199,207,
- 2,214, 9,248,161, 71, 8, 68,249, 35,250,158,132,224,180,192, 72, 87, 19, 66,210, 88,219, 26,132,224, 10,118, 58,219,191, 20,
- 39,138, 5, 73,194, 70,155,173,127,199,227, 17,206, 89,116, 77, 3, 55,121,200,186,198,102,221, 97, 28,199, 4,185,137,233,100,
-139,115, 80,208,212,201, 39,129, 28,137, 35, 29,123,188,203,145, 53,251, 3,146,150, 37,234,171,105,149, 68,113,195,209,113, 1,
- 0,211, 52,226,246,238, 62, 93,236,117, 93,167, 70,196,123, 87,190,132, 66,151,196,236,126,228,238, 29, 11,118,103, 78,105, 76,
-223,175,216, 44,135,156, 33,144, 81, 99, 64, 33,155, 74,223, 27,201,180, 61, 18,140,250,136,141, 79,171, 8,189, 8, 14, 73, 62,
- 37,153,186,162, 28,242,130,197,133, 34,176,180,224, 8, 31,255,155, 47,111, 41,222,200, 4,143, 64,134,224, 75, 43,213,114, 47,
- 31, 15,194,182,174,240,252,233,231, 88, 85, 21,100,165,161, 59,194,110, 70,225,135, 84, 18,222, 80,120, 69,211, 84,144, 51,160,
- 37,129, 16,134,217,162,107, 60, 32, 60, 14,189,196,195,169,199,105,152,224,188,195,110,189,198,179, 87,247,184,127, 56, 66, 10,
-218,219,175,186, 22,187,245, 26,235,245,138,198, 91, 93,135,174,237,208,212, 21,234,138,254, 83,213, 85,186, 54,231,137, 50,130,
-247,251, 61, 94,191,190,199,126,127,192,121,140, 1, 21, 1,253,236,176,171, 45,198,160, 97,166,153,190,196,135, 19, 49,148,157,
- 67, 59, 78,228,109,118, 30,231,201,208,235,173,243, 62, 88,248,204, 5, 94,188,209, 98,137,124, 69, 9,119, 97,187,217, 27, 96,
- 22, 22, 37,134, 5, 56,150, 99,116,249,162,149,165, 58, 62, 78,153,100,254,231, 75,157, 94, 44, 12, 18, 79,176,248,114,115,130,
- 85, 49, 2,240,101,108,172,231,106,180, 4, 28,151,202,239, 16,114, 4,176, 16, 69,174,181,207,193, 5, 62,171, 69,195,197, 98,
- 63, 11,248,196, 5,241, 41, 31,210,223,170, 86, 40, 68,128, 79,191,121,141, 87,175,239, 48,141, 3, 62,253,201, 31, 98, 60,159,
-177, 89,183,248,103,255,244, 87,184,122,235, 61, 60,188,124, 74,223,101,231, 49,206, 19,220,195, 29, 86,219, 43,232,154,166, 47,
-100, 1, 11, 32,243, 86, 60,212, 98, 50, 97, 9,222,225,148,175, 68, 61, 95, 60,133, 69, 38, 2,117, 59, 46, 4, 82, 22, 91, 3,
- 37, 9, 30, 99,133,132,178,110,153,213, 32, 52, 2, 28, 96, 12, 7,126,144,110, 36,196, 40, 81, 0, 66,208,154, 74,105,133, 96,
-153, 32,233,226, 26, 68, 33, 76, 46,165,166, 9, 7, 8,165, 19, 25,178,226,241,185,168, 52, 84,160, 24, 81,231, 44,156, 11,152,
-231, 9,243, 52, 97, 56, 29, 49, 79, 19,234, 74, 67, 87, 84, 32,183,109,131,182,235, 80, 85, 21, 77, 5,120,210, 98,189,135, 84,
- 2,227, 52,195, 24, 67, 47,193, 57,244,199, 49,229,101,175,186, 21,126,255,241, 35,212,149,134, 19, 18,134,213,221, 93,179,197,
-105, 48,248,171,175,190, 70, 83, 83,145, 49, 25,139, 0,151, 70,240, 74,107,172, 86, 27,188,245,228, 49,118,219, 77, 18, 31, 73,
-166,210,229, 56,232,194, 24, 20, 21,198, 66, 20, 84,110,222,129,202,204,226, 78,221, 62,127,223,168,230,207,107,198, 20,220,197,
-112, 46,227,124, 18, 84, 66,208, 14,152,224, 62,158, 47,188,165, 15, 89,184,140, 60,157,198, 51,142,247,119, 48,243,132,215, 47,
- 94,226,157,247,222,195,245,163, 27,238,174, 29,172, 33, 27, 89,165, 21,161, 83,233,141,228,221,127,182,197, 57, 88, 46,186,179,
-101, 52, 2,149, 66,145, 22,226, 41, 77,135,126, 62, 94, 5, 82,151, 78,239,105, 85,213, 52,121,144,130, 35,176, 13,224, 45, 41,
-157,120,245,225, 24, 21,171, 84,200,151,188,240,112, 46, 19,214,194,204,254,127, 94,125,198, 28,244,154, 49,196,179, 49, 5, 93,
- 50, 39,131, 42,173, 0, 23, 25, 3,188,230,243,101,145, 95, 72,110, 24,250,239,131, 76,201,114,209, 17, 97,237, 12, 9, 7, 93,
-213,116,222,121, 7,231,232, 12, 25,199, 9,183,119,247,144, 82,226,250,250,138, 38,173,222,165,190,235,114, 42,154,117, 75, 33,
- 79, 7, 18, 51, 62, 44, 2,207,232,242, 95, 34, 53,169,254,139,193, 87, 98,145, 96, 42,147,182, 54,139,217,133, 20, 16, 78,240,
-217,146,153,254, 58,177,106,147,118, 47, 7,179, 80, 94,111, 40, 98, 57, 47,253,206,116,224,203, 32,105, 82,200,123, 61,234, 58,
- 69,225,120,138,221,144, 79, 85,175, 72,249,235,165,208,137,126,221,135,191,243, 59,120,241,205, 51, 84, 74,224,120, 58, 98,213,
- 86,128,231,232,201,237,154, 14,183,121,130,117,132, 49, 12,158, 94,187,174, 43,104,235,177, 81, 26,234,250, 10,199,211, 9,143,
-175, 28,246,167, 1,214, 57,212,138,196, 60, 77, 93, 65, 84, 29,134,243, 17,131, 25,113,232, 71,188,124,125,143,221,245, 13,194,
- 52, 96,181,234,208,117, 29,214,235, 53,186,174,193,118,187,197,106,181,130, 86, 84, 21, 78,227,132,211,233,132,195,126,143,251,
-251, 7,156,250, 1,179,243,233, 24,159,189,199,241, 60, 97,123,221,226, 48, 76, 48,206, 39, 69,235,121,228,127,191, 32, 97,143,
-241,128, 80, 45,174,223,126,178, 36,250, 71,171,140,184,200, 74, 23, 5, 82, 53, 77, 56,194,183,201,226,104,189, 1,207,201, 79,
- 33,127,225, 2,197, 60, 70,217, 88,120, 51,142, 32,175, 72, 68, 86,209,211,248, 56, 69,247, 1, 5,151,125,105, 89, 15, 75, 40,
-140, 88, 24,234,249,207, 88, 10, 2,211,238,150,171,121,113, 17, 57,136,130,129, 85, 6, 24,228,157,126,206,112,247, 34,188, 25,
-178, 16,190,101,213, 80,252,159,132,192,111,190,252, 26,175,239,238,112, 62,247,216,236,174,241,236,203, 95,195, 78, 35,254,229,
-231,191, 66,183,222,192, 59,143,237,227,119,113,120,253,140,186, 47,231, 49,249, 25,238,225, 22,219,221, 13,100,221, 50, 55,187,
-198, 56, 77,105, 26, 21,149,191, 41,134, 62, 20,197, 85,132,255,134, 69,165,146, 63,118,100,124,115, 34,166,121, 79, 0, 13,239,
- 97,226,136, 87,133,156,168,192, 23, 87, 21, 11, 37, 6,180, 68, 40,136,148, 10, 94, 51,106, 51,198,130, 70,170,162, 20, 9, 86,
-162,117, 5, 85,209, 26, 74, 85, 53, 93,254,146, 68,164,177, 3, 38,240,206, 4, 59,140, 48,227,128,241,244,128,105, 28,128, 16,
-208,198,201, 87,211, 80, 44,107,211, 16,156, 36,198,197, 10,192, 59,186,216,219,149,199, 48, 78, 24,134,145,166,113,132,148,132,
- 15, 1,119,199, 19, 94,239,143,228,129, 6,229,177, 91,107,113,158, 38,250, 57,165, 68, 93,105, 46, 14,124, 18, 87, 73, 41,209,
-182, 29,154,182,195,143,127,244, 73,186,136,227,104, 60, 68,234, 91,236,214, 11,171,228, 18,246, 80, 48,185,121, 85, 18,117, 68,
- 82,150, 26,142,192,249,234,113,108,202, 20, 49, 38,189,197,139,221,115,122, 88,132, 12,185, 34, 35, 59,150,118,212,141,113,194,
-156,165,220,241,121, 26, 1, 33,112,120,152,177,191,191,195,251, 31,127,130,171,155, 43,120,231,210,254,220, 89,139, 74, 9, 12,
-227, 12, 59, 77,252,239,240,208, 82,164,194,193,186, 12,145, 73, 66,186, 4,238, 9, 28, 88,194, 13,152,115,240, 32,167,145, 82,
-154,186, 96, 33,153, 69,239, 33, 36, 97,138,157, 53, 8,158,198,193,154,209,184,224,206, 51, 22,231, 49, 43, 60, 78, 24, 84,136,
- 1, 86, 1,199,158, 34,127,107,165, 97,157,199,170,166, 53,168, 20,180, 92, 65, 40,194,170, 10, 33,108, 96,235, 49, 92,200,231,
- 83,202,126,160, 53,178,231, 85,112, 44,235,149,170,120,178, 96,224, 45,160, 80,113, 20,171, 76,233,122, 14,196,228, 31,199, 9,
-119,247,123, 72,169,176,101,123, 52,245, 91, 50,135, 48, 69, 78,134,207,114, 40,148,201,166, 1,188,178, 9,217,141, 19,179,209,
-188,191,212, 60,167, 70,200,243,152,159,126, 63,171,228, 99,105,192, 43,242,236, 40, 75,172, 36,168,127,239,223,255,211, 63, 79,
-237,129,100,225,136,200,157, 95, 26, 57,201, 56,138,141, 85, 66, 22,193, 21,243,131,111, 77,172, 17,225,130,123,186,128, 79, 20,
-249,233,252,151,199,227,128,159,253,236,103,120,247,131,239,225,254,225, 30,179,177,100, 29,226,137,193, 56, 78,240, 34, 71, 44,
- 66, 80, 55, 97,172,163,138, 93, 41,136,224, 16,156,193, 91,239,188,143,119,223,121, 27,247,251, 61,132,119,104,180, 34,120,199,
- 60,113, 26, 16,125, 49, 86,219,107,124,244,217,143,241,244,233, 51, 88,235,240,233,223,249, 67,252,229,207,255, 18,170,219,224,
-245, 55,207, 48,156, 7,140,227,132,211,241,132,251,135, 7,220,221,223,225,225,126,143,211,121,192,236, 28,108, 2, 1,137, 36,
-140,128,247, 88,173,215,216,247, 3,172, 15, 24,141,197, 56, 27,156,199, 25,167,113, 66, 63, 91, 88,169, 81,119,107,188,251,209,
-251, 5,241, 44,103,239, 38,190,123, 89,193, 7,177,136, 62,141,227,236, 52,184,241, 33, 89,209,114, 9,149, 19,221, 66, 54,252,
- 20,157,120,120,179,163, 21, 50,125,140,209, 42, 68, 85,239,155,144,249, 80,114,226,133, 76, 25,191,254, 34,102, 58,158,230,105,
-175,142,176, 72, 91, 43,247,252,113,143, 30,173, 97, 73,179,159,190, 71, 57, 53, 75, 20,123,252,197,106, 32,105,157,194, 2,107,
-187,220, 83, 72, 60,127,121,135, 23, 47, 95,226,116, 58,192, 26,131,243,233,136,135,187,215,232,251, 3, 89,214,108,236, 72, 13,
-170,166,131,153,198,244,158, 89, 23,224,236,140, 77, 91, 1,170,130,210, 26,214, 89, 88,107, 96,166,129,194, 41,202,213,135, 88,
- 70,226,138, 98,255, 33, 82, 83, 18,210,251,175,148,132,210, 21,174, 55,107,254,126,211,190, 80,240, 24, 85,132, 98,108,155, 18,
-225,150, 72,221,192,176,142, 44,122,114, 9, 87, 60,243,127,198,105,196,241,120,192,241,212, 99,224,206, 89,134, 60,227, 33,232,
- 14,129,103,116,221, 65,215, 45,156, 35,225,211, 52, 27,156,207, 39, 28, 30, 30,240,240,112, 15,107, 45,234,182, 69,187, 90,161,
-169, 27,202, 98,111, 26, 84,138,130, 84,234,186,130,210,244, 94,169,186,134, 82,116,176,234,138,244, 44, 4, 99,177,152,102,147,
-216,232, 62,120,204,102,198, 56, 17,204,132, 99, 40, 80,119, 45,170,186, 78,185,225, 30, 72,123,244,245,102,135,191,255,247,254,
- 32, 45,246, 68,220,135,103,129,124, 33,156,204,121,224,169,158, 78,191,168, 64, 31,243,231, 19,189,208,161, 76, 76, 20,185,139,
- 47, 25,240,117, 85,227,112,236,113, 60,208,168,217,152,153, 58,106,195,113,178,133, 40, 44, 17,224, 4, 21, 13,164, 48,103,251,
- 26, 71, 1,247,167, 19,250,253, 61, 32, 8,125, 59,142,103,120,231,112,127,119,143,121, 26, 96,172,193, 56,141,112,102,134, 53,
- 36,112,163, 2,196, 39,232, 82,188, 80, 67, 18,158,249, 20, 66, 82,166, 42,198,247, 65, 10,250, 30, 70, 79,188,140, 74,114, 75,
- 54, 55, 33,136, 37, 32, 68,164,248,201, 5, 2,246,242, 59,153,182,198, 76,104,140,223, 81,203, 74,247, 74,211,100,211,199, 4,
-182, 52, 29, 41,244, 52, 97,249, 44,199, 95,147,244, 52, 34,159,155, 82,209,132, 65, 74, 69,116, 80, 79,107, 50, 37, 40,109, 80,
- 73,133, 74,179,205, 58,126,222, 74,193, 57,143,105,154,200, 2,221,212,105, 31,158,250,157,130,175, 33,210, 68,174, 32,122, 22,
- 13,108,178, 89, 70, 13,145, 40, 18,215, 68,158, 94,251,200,143, 23,249,190,204, 14,101, 81, 36,183,133,197,251, 24, 66,128, 46,
-233, 32,162, 80, 16, 7,254, 2,251,180, 11,151, 69,186, 76,174,148,144,126,117,225,203,227,206, 34, 17,149,226, 89, 22, 71,239,
- 49,187, 61, 18,174,138, 11,104,183,189, 70,176, 22,181,174,240,179,255,239,103,168, 20,237, 56,165,160,224,128,237,134,198,226,
-222, 7, 76,209,223, 57, 58,218,241, 4, 64, 86, 21,170,186, 1,160,208,180, 45,166,243, 30,206, 88,252,232,195,247,113,245,232,
- 9,116,211,224,183,191,253, 45, 94,126,253, 44,189,241, 77,221, 64, 4,129, 47,126,253,107, 40, 17,240,103,255,240, 63,193,255,
-246, 63,255, 79, 8, 66,225,237,247, 62,194,207,254,249,223,224,233,139, 59,108,155, 26,117,173,249, 32,163,156, 98,231,163,112,
- 99,185, 67,117, 1, 48, 62,160,118, 14,117, 93,193,204, 22,115, 16,112,193,162, 10, 2, 77, 83,161,150, 53,174,175,111,240,193,
-247, 62,202,106,237, 80, 40, 29, 11,186, 80, 22, 44, 20, 21, 81, 40, 35,250, 8,233,138,240,109, 36,183,176, 88,111, 36,208,139,
-136, 34, 12, 42, 29,147, 95, 82,138,252,224, 70,190,181, 4, 91, 40, 2, 84, 16,139,184,192, 50, 83,133,196,145,158, 67, 38,178,
-243,129,254, 63,231, 11,196,105,132,143, 25, 2, 5,244, 39,132,162, 27, 47, 38, 12,209, 40,145,166, 8,233, 23, 47, 3,104,162,
- 60, 47,105, 86, 5, 22,186,127, 92,152, 8, 78,231, 1,207,191,121,137,190, 63,230, 0, 10,142, 87,116,204, 75, 15,240,124, 30,
-210, 95,235,102,133,233,124, 76,132,152,105,158,113,251,240,128,171,237, 21,100,187, 33,145, 18, 87,255,214,249,236,247, 15,101,
- 49, 38,222,224,251, 39, 33,163,200, 85, 63, 81, 10,105, 68,109,173, 69,168, 43,234, 40, 66,160,174, 43,249,180,233, 64, 83, 62,
- 64,123,162,206, 57,173, 97,173,165, 66, 55,106, 48,162,208,134, 85,217,228,141,182,232,207,103,188,186,189,199,235,135, 3,222,
-186,190,194,239,254,224,251,104,155, 26,117,224,238,223,121, 72, 45,160,116,141,170,110,137,248, 5,192,250, 64, 49,152,156,155,
- 62,143, 35,234,186,129,174, 73,159, 82, 87, 21, 5,192, 40,137, 74, 83, 22,187,212,228,135,183,206, 65,121, 64, 74,226,122, 43,
- 22,170,106, 65,104,220, 97, 28, 49, 78, 6,179, 49,176,134, 50,181,103, 99,211,142,255,234,122,135,170,110,208, 15, 35, 78,227,
- 76,231,142, 82,208,138,236,107,127,231,119,127, 72,118, 59, 44, 29, 58, 2,223,234, 12, 93,102, 15, 4,177, 96, 26,196, 36,201,
-224,105,253,151,226,165, 19,129, 50,206,101, 56,234, 86,209,164, 51, 10,233, 62,254,248, 67,124,253,236, 27,166,198, 21,117,105,
- 49,238, 18, 23,196,196,168,204,166,236,112, 66,181,106,237,160,181,198,233,116,194,139,167, 95, 98,189,187,130,119, 6,206,209,
-212, 82, 11,138,234,157,149,128, 9,100, 29,181,222,241,132, 34,164,231, 70,192, 39,225,154, 76,200,216,184, 16,226,124,142,152,
- 60,167, 36,132,172,232,181,243,168,222, 5,192,219,153,118,204,222, 67,104,149,126,118, 41, 99,174, 60,232, 98,142,109,108, 92,
- 61, 48,243, 35, 90, 48,117, 16, 24,166,153,237,143, 22,222, 85,204,124,144,217, 97,197, 66,190,146,101,225,217,151, 15, 14,201,
-122, 3,192, 21, 68, 42,140,170,170, 6, 64,118,103,192,211,186, 54, 18, 5,157,131,172, 8,169, 91,105, 1, 25, 40, 84, 38, 71,
-253, 58,188,186,189,131, 82, 18,219,237,122,113,246,138,148,193, 33,151,126,243,146, 29, 18, 39, 65, 9,195,206,107,196, 98,253,
-115, 41, 34, 14,220, 24,166,153, 4, 3,107,226, 68,167, 76,111,163,144, 39,250,159,245,155, 33, 30,209, 63,151, 53, 68, 36,221,
- 71,142, 28,196, 69, 39, 84,236, 99,147, 80, 9,161, 64,115,139,162,194,112,124,160,184, 52, 54, 77, 99,250, 0, 74, 5, 26,123,
-172, 26,129,177,174,112,236,123,120, 71,157, 64, 83, 41,244,195,128,205,170, 67,219,212,232,135, 25,243, 68,106,203,117, 87, 99,
-187,219,209,248,167,210,168,149,194, 56,156, 1,231,208, 40, 9, 81, 43,216,241,136,105, 56,225,147,239,125,132,235,221, 6, 63,
-255,197, 47,177,170, 52,249, 77,101,128, 51, 61,254,243,127,252, 95,225,191,251, 39,255, 24,206, 11, 52,149,194, 47,126,246, 47,
- 48,187,128,113, 38,101,228, 97,127, 74, 35,187,212,157, 10,153, 74,127, 1,145,246,167,212, 93, 0, 58,120, 76,117, 75,151,145,
- 82,184,186,186,193,238,230, 49, 62,253,254,135, 20,192,144,152,191,133,133,193, 23, 19, 89, 81,174,212,233,178,186,148,197, 19,
- 83, 88,166,200, 64,132,197,148,234,194,151,125,113,237,251,204,120,143,136,213, 32,233,146,247,146,126, 18, 25, 51,147, 67,182,
-204, 93,218,203, 19, 40, 65, 32,249,195,125, 18,194,101,254,121, 8, 75, 0, 76, 82,164,135, 98,156, 31, 66,129, 59, 14,139,208,
-131,242,175, 3,190,165,241, 78,253,111,121, 28,243,248,171,176, 47, 65, 8,152,201,226,183,159, 63,195,241,184,231, 8, 71,155,
-246,148,161,240, 23,151,246,154,224, 29,204, 60, 97, 24, 39,172,186, 22, 50, 4,184, 64, 17,161,199,254,136,173,212, 16, 74,163,
-169, 27,244,170, 2,236,132, 16,149,192,139,215, 20,138,149, 90, 88,124, 62, 33, 82,209, 82,156, 39, 69, 13, 95,239, 86,172,176,
- 87, 8,146, 19,255, 60, 57, 79,172,247,240,198,195, 9,139, 41,128, 92, 35,156,135, 45,132, 45, 36,175,220,157, 57,143, 97,154,
-208,159, 7,244,227, 8,165, 20, 54, 93,139,235,117,135,143, 62,252, 16, 79, 30, 63, 70,219,180, 16, 74,166, 47,148,170, 42,202,
- 33,215, 21, 76, 8, 8,170,130,199, 8,203,225, 26,243, 60, 83, 81, 45, 37,170,186, 74, 78, 18,169,152,211, 30,255, 35,104,127,
- 89,129, 66,158,132, 18, 16, 66, 67, 34, 64, 5, 5,209,214, 80, 74,160,109, 42,204,134, 82,239,134, 97,132,210, 10, 45,103,159,
- 11, 77, 0, 22,154, 18,156,105, 55, 13, 65,201, 94, 60, 89,249,197, 95,255, 6,159,126,252, 17,158, 60,185, 38, 1, 96,202, 29,
- 40,204,181,172,136, 22, 33, 92,160, 63, 67,161, 88,142,110,144, 2,121,237,243,163,228,185,112, 77, 26, 36, 33,146,154, 93,200,
- 44,170,251,236, 71,159,226, 47,255,226, 23,112,145,163, 32, 36,132, 96, 13,128, 44,124,208, 40, 80,165,158,244, 10, 49,238, 69,
-112,218, 90, 8, 1,135,253, 29, 32, 36,166,105,132,157,206,212,252,212, 29,180, 8,232,234, 10,118,162,189,235,236, 57, 61, 82,
- 21, 25,220,188,238,146,188,167,214, 12,218,138, 73,110,158,153,248, 66, 40, 8,169, 19, 75, 65, 74, 65, 62,113, 30,185, 67,248,
- 36,188,163, 49,123, 44,230, 37,154, 90, 2,134, 18,102,125,145,129,128,216, 13,243, 62,207, 2, 16, 9, 4, 36,184,152,246,168,
-107,205, 83, 34,230, 75,112,132,172,224,181,135,140,252, 4, 70, 35,251, 40,154,229, 39,140,108,107, 21, 93,232, 66,192, 90, 3,
-239,109, 18,155,121, 47, 18,116,199,123, 7, 21, 28, 42, 89,161, 82, 10,198, 1,198, 59, 10, 20,210, 26,195,121,192,235,219,123,
-212,117,133,150,207,109,186,107,201,127, 30, 16, 33,101, 33,225,129, 33, 98, 78, 7, 23,243,145, 17, 80, 76,190, 67, 2,232,196,
-200, 90,151,210,230,150,194,225,229,122, 60, 20,224,157,156,155,193, 62,245, 75, 24, 89, 68, 14,199,197,188, 8,114, 25, 2, 82,
-200,174, 66, 58, 95, 89,205, 39, 99,117, 20,210, 7, 43, 99, 40, 72,145,163,157, 16,180, 49,180, 66, 0, 33, 72,188,124,245, 10,
-127,245,203, 95, 96,215, 86, 8, 1, 88, 85, 10,119,227,128,182,169, 96, 45, 85,243,149, 82, 56,158, 71,140,195, 64, 57,201, 80,
-176,178,193,233, 76, 81,145, 56,247,144,109,155, 32, 51,231,113,196,186,107, 8,108, 97, 29,220,124,198,223,124,254, 5,164, 82,
-152,230, 25,168, 52,124,240,216,236,174,241,223,254,147,255, 18, 87, 55,143,113,184,189, 67, 37,105,127, 55, 91,143,154,243,155,
-109, 20,115,161, 24,213, 21, 98, 50, 89,118,146, 74, 49,191, 56, 32, 40, 44,160,253, 85,221,160,226,140,236, 40, 72, 75, 22,137,
- 4,160,201, 93, 69, 10, 80, 16,209,249, 24, 22, 32, 21,196, 14, 25, 69,130,207,133,175, 45, 1, 98,144,129, 40,165, 50, 94, 22,
- 72, 26,233, 3,188, 20, 68, 23,149, 5, 17, 46,209,217,196, 27,177,168, 84,151,248,148,190, 86, 18,100,163, 72, 38,189,178, 32,
- 22,200,227,232,183, 85, 82, 36, 63,119,132,199, 4, 92,138, 2, 11,174, 68, 34, 59,133,165,181, 45, 46, 25, 34, 55, 33,254,212,
- 50, 43,225,157,243,248,205,231,207,240,112,255, 26,243, 52, 21,169, 82, 46, 33, 51,243,101,158, 39, 7,214,242,126, 19, 1,231,
- 97,196,122,213,194, 27,178,240, 56, 15,156, 78, 71,172, 86, 43, 40, 37, 81, 55,100,187,138,155,139,203,242,106,225,109, 45,109,
- 35,241,242, 69,206, 78, 62,143, 52, 74,165, 36, 42,254,252, 35, 66,150, 97, 46,129,203,101, 41, 5, 38,222,235,139, 34,217,205,
-123,143,217, 24,178,129, 58,135,182,105,176,217,172,113,117,181, 35, 85,183, 49,184,222,172,241,248,209, 35,108,182, 59, 38,150,
-121, 38,209, 41, 72,201,220,251, 16,224,133,130,115, 51,191, 31, 51,230,113,164, 61,110,160, 68,186,184,151,149, 81,240, 88,164,
-214,197,241,173, 16, 20,162, 36, 60,127, 27, 36, 77,219,148, 20,208, 74,194, 40,137,170, 34,223,117, 83,215,232,186, 22, 54,208,
- 30,154, 10,137,153, 45,165, 54,243,210,189,135,214, 32, 26,160,243,248,249, 47, 70, 60,122,252, 54, 62,124,255, 59,120,124,115,
-197,176, 16,145,223,155,203, 49,232, 66,128, 41,146,112, 52,230, 17, 8,173, 82,223, 46, 32, 23,128,151,248, 13,116,222, 49, 4,
- 8,208, 66,147, 87, 28, 1, 79, 30,223,224,157,119,223,197,231,191, 29, 1,113,102, 31,189, 44, 38,252, 52,185,146, 82,112,108,
-171,132,115, 22, 2,142, 62, 3, 73, 5, 94, 85,105, 84, 90,225,116, 26,112,247,250, 27,172, 54,215,112, 30, 48,102, 66,203,126,
-250, 90, 75,172,219, 6,194, 59, 32, 16,145, 48,234, 45,226,231, 17, 53, 1,193,123,104,173,114, 35,192,238, 9, 1, 73, 23,122,
- 18,164, 9,246,116,211, 68, 11,130,197,209,130,115,198,161,147, 80, 90, 41,250,179,107, 77,206,105, 7, 15, 23, 56,212, 43,230,
- 25,240,179,233,227,232,194, 58, 46, 26, 60,163,104, 93, 10,161,137,119,155,103, 7, 78, 4, 59, 5,159,233,114, 57,186,153,156,
- 15, 74,215,168, 52,101,195,219,121, 74,176, 34, 31, 36,113, 38,100,200, 49,178,206,161,210,158,117, 1,146, 39, 3, 30,179, 7,
- 85, 37, 90,224,120,234,241,226,213, 29,222,127,239, 59,252,249,208,207,239, 69,153,173,158, 11,116, 25,136,193, 18,100,110, 78,
- 60, 60,130, 37,186, 29,253,187, 93,202, 54,136,151, 57,202,224,170, 16, 46, 89,161, 75, 66,231,197, 5,174,203, 52,175,210, 46,
- 36, 69,190,172,163,191, 86,198,132, 31,246,127, 94,170,219, 75,194, 87, 26, 51,200, 44, 12, 10, 2,204, 91,166,189, 80,224,224,
-149,217, 81,100,164,112, 22, 47, 94,124,131, 77, 87, 83,114,145, 53,112,222,163,107,106,188,125,181,198, 56,141,168,234, 6, 46,
- 0,211, 52,193,122,160,173, 4, 28, 52, 94,191,122,137,102,181,195,174, 3,234,138,174,138,166,174,224,204,156,118,250,167, 83,
-143,237,122,141,215,175, 94,225,223,253,183,127, 15,109, 93, 99,154, 72,225,248,229,211,103,216,223,221,162,106, 90,252,167,255,
-217, 63,194,127,253, 95,252, 35,212,237, 99,204,134,210,221, 42, 33, 80,213, 26,222, 4, 88,227,225, 24,166,179,220,127, 21, 41,
- 82, 90, 65, 85, 42,133, 52,132, 88,228, 4, 79, 42,225,164, 90, 14, 57,237, 9,172,122,228, 74, 46,192, 67, 48,151,124, 17,138,
- 34,120,148,141,165,125, 16,184,136, 13,140,190, 74,136,165,127, 18, 98,193,181, 73,254,199,216,168,196,124,104, 31, 56, 53,138,
- 19,129,184, 32, 72, 8,216,111,117,135, 81,113,225,249,160, 18,113,100, 86,236,185, 99,104, 76,230, 42, 23,116,171, 32,150,227,
- 80, 17,190,117,152,148, 71, 92, 81,120,242, 6, 41,159, 15,238,242,114,151,169, 16,179, 54,224,171,167,207,113,127,247, 10,195,
-112, 78, 35, 56,239, 56, 20,194,187, 69,135,142,130,141,109,205, 12, 51, 79,176,206, 66, 74,133,205,122,135,190, 63,192, 49,176,
-199,121,143,253,254, 1,109,183, 70,215,117,232,143,251, 55,127,150,130,161,159, 39, 22, 60, 95, 8,197,235,142, 81,164, 66, 96,
-156,105, 12,237,156, 47,118,194,108, 23,138, 91,154,120,240, 6,208,212,129,247,165,198, 90, 76,204, 21,175,235, 10,187,171, 45,
- 86,221, 26,117, 83, 69,120, 40,156,161,209,182,148,180,247,214,117, 77, 42,113,103, 33,188,135, 20,116,169,243, 50,130,200, 94,
-206,194, 90,199, 59,226, 9,134,167, 29, 80, 26, 42,228,206, 50, 85,132,206, 37,213,120,224, 11, 77,202,204, 58,136,239,189, 86,
- 10,161, 98,246,121,226,141,179, 71,192, 5,120, 67,226,177,211,241,136,113, 24, 83,242, 27,189, 85, 21,197,127, 74,162, 53, 10,
- 1,188,124,241, 12,231,243, 25,111,191,245, 24, 31,127,248, 93,182,214,133,108,209,205,108,215, 12,253, 72, 43, 42,145, 58, 34,
- 37, 99,176, 75,126,158, 67, 88,234, 57, 98,224, 8, 0, 82,105,243, 52, 69, 73, 26, 35,255,224,211,143, 48,140, 35,190,252,124,
-134,152, 45,132,244, 60,201,146,156, 69, 17, 67,166, 36,124,112, 8,142,243, 0, 4, 21, 58, 78, 25,210, 85, 0,168, 42,141,115,
-223, 19,120, 75, 85, 16, 1, 56,159,137,237, 33,225, 81,105,137,174,173, 41,103,126,206,249, 1,177, 67, 39,188, 54, 23, 88, 44,
-114,163,239, 23,237,160,165, 18,116, 1,178,234, 59, 4, 79, 1, 45,156, 3, 47, 11, 97, 88,158,184, 33, 57,168, 40, 97, 80,194,
-179,248, 85,120, 70, 62, 7,192, 7, 87,184, 8, 36, 36, 60,172, 7, 20,200,130, 9, 3,158, 52,201,100,133, 14,156,125,144,194,
-204,128, 34,111, 33, 67,120,164,164, 53,145,214, 21,173,169,236, 76,225, 92, 34,135, 57,121, 30, 91, 91, 71,123,252,138, 51, 76,
-130,247, 80,193, 1,138,147, 22, 13, 61, 67,244, 61, 4,246,251, 61,214,171, 22, 79, 30,223,112,148, 56,159,177,126, 97, 78, 79,
-218,132, 0, 66,239,250,224, 19, 3,159,126, 22,159,166,129,233, 18, 47, 96, 57,233,127, 95, 64,116, 80,230, 94, 23, 43,200,156,
-147,170,203,147, 82,198, 11,230, 98,187, 14, 78,138, 41,125,234, 73, 72, 39,138,142, 47,142, 10,185,107,114, 33,164,131, 21,145,
- 64, 38, 0, 23, 36,164, 4,140,245, 24,141, 32, 14,114,176,176,193,161, 82, 26,187, 71,143,240,205,243,175, 49,155, 57,141, 99,
- 70, 99,225,132,196,237,253,129,148,156,222,162,174, 27, 12, 99,143,227,249,132,205,246, 26,222, 76,112,168,113, 26, 12,246,253,
-132,235,109, 7, 55, 77,104,155,138,243,217, 9,214,113,253,248, 9, 62,253,228, 19, 74, 22,242, 20,128,240,211,223,251, 9,250,
-190,199,195,233,140,255,241,191,255,111,240,147, 63,252, 35,252,252,151,191,128,132, 64, 45, 4,110, 30, 63,193,185,223, 35, 76,
- 1,109,173, 48,204, 14, 22,129,130, 9,216,198, 17, 7, 32,148, 51, 77, 22,184, 97,154,168,171,143,149, 21,143,210,250,211, 1,
-207,190,185,199,187,223,185,225,129,200,146,196,150,157, 1,133,152, 10, 23,161, 2,151, 98,140,210,174,118,193,115, 79,251,120,
- 17, 46,246,224,220,243,133,192,107, 4, 14,184, 72, 22, 57,145,122,198,180,199, 42, 66,245,130, 8,184,248,158,165, 81, 55,124,
-254, 94,128, 85,248,225, 2, 87, 27,109, 94,161,240,222, 47, 73, 56,165, 13,236,226, 66,140,197,136, 36, 69,127, 20,160, 68,191,
-112, 12, 11,114,214,227, 52,206,152, 39, 67, 22, 33, 51, 99, 24,206,248,250,155,231,232,207, 61,137, 45,121, 42,226, 57, 49, 43,
- 93,232, 40, 47,117,130, 86, 88, 67,197,166,128,192,122,181,134,117, 22,149,174, 0,231, 82,246,178,117, 22,231,126,143,110,189,
- 35,160,133,115,139, 7, 62,177,247,223,240, 30, 44,209,189, 66,100, 70,181,245, 30,227, 52, 81,196,166,243, 16,113,172,237, 51,
- 18, 83,200,156,209,238, 3,237, 61,173, 15, 8, 74, 99,187,222,160,107, 91,180, 13, 97, 57,171,170,166, 93, 41,143,137,173, 0,
-204, 52, 99,127,234,113, 58,158,208,174, 55,168,153,170,168,170, 26,186,109,201,222, 38, 20, 21, 13,134,176,176,243, 52, 98, 26,
- 39, 12,231, 51,250,243,128,113,154, 81, 53, 13, 42,165,224,107,205,158,123,206, 83,176, 22, 80,148,194, 38, 32,224,224,161,130,
- 98, 33, 22, 49, 39,156,162,160, 22,197,228, 44, 37,178,195,152, 18,207, 12,166, 97,192,233,112,196,249,124,102,154,156, 72,123,
-118,201,148, 48,103,103, 40, 93,193, 90,194,151, 78,227, 25,175,111, 5,102,227,240,163, 31,124, 0,165, 37,196,223,178,190, 73,
-222, 12,254,220, 61, 19,201,178,131, 36,176,141, 45, 36,241, 83, 96, 54,185, 15,217, 81, 64,211,155, 56,158, 22, 73, 26,250,251,
-191,251, 67, 28, 15, 39, 58,224, 79, 7,192,228,203, 85,198,164,200, 20,219, 27,120,205,226, 88, 31, 33,161,148,164,160, 30,126,
-205, 67,127,130,110, 58,194,161, 6, 98,106, 72,149, 27,168, 74, 43, 56,175, 96, 12, 51, 31,124, 88,172,185,226,101,162,164, 76,
-185,238,144,154, 40,117,206, 37, 37,182,139,160,163, 88,176, 73, 89,240, 50,232,125,210, 17,193,203, 69, 8, 2, 21, 11, 33,228,
-162,151, 46,101,153,210, 13, 3,235, 21, 16,120,157, 20, 64,162, 71, 41,104,207, 46,242, 42,202,133,176, 16,206,130,187,114, 26,
-163,211,104, 62, 93,232,220, 28, 70, 74,155, 44,236,211, 81,131,226,147,198, 65,194, 57, 15,131, 25, 90, 9, 84, 85,197,218, 9,
-129,195,192,161, 59,150,158,205, 23, 47, 95,227,122,183,133,210,138,133,174, 49, 84, 37, 25, 26, 17,124,128, 9, 84, 76,164, 78,
-188,108, 20, 82, 54, 68,153, 72,137,194,129,224,243,206,156,215, 19,101,200, 16, 7, 7, 46, 92,206, 52, 25, 42, 5, 85, 81, 89,
-189, 64,216,196, 52,153,188, 51,201,200,196, 11, 32, 77, 42, 10,144,246, 69, 40,186, 40, 74,158, 17,144,193,193,134, 6,214,142,
- 80,193, 64, 6,250,226,159,199, 51,156,179,120,249,106, 79,177,124, 10, 80, 74, 99, 98, 21,236,105,166,157, 71,211,172,209,247,
- 22,118,154,176, 89,239,112, 60,191, 36, 15,248, 76,150,145,225,220,227,250,209, 91,216, 31, 79,112,206,226, 48, 58,116,181,130,
- 12, 1,183,183,175,241, 15,255,163,255, 24,187,237,142,173, 53,244,122,173, 49,116, 64,205, 51, 62,249,240,125,244,125,143,247,
-222,190,198,231, 95, 60,197, 55,207,190, 6,236, 4, 99,201, 26,162,149, 66,183,107,112, 26,103,234,126, 66,156,110, 72, 40, 45,
-161, 43, 13, 33, 36,198,113,132,115, 30,171,171, 43,140,195,148,166, 32,206, 58,152,105,194,221,221, 61,158, 60,218,209,222, 9,
- 89, 4, 38,138,185,117,194,175,198,207,160,200, 87, 11, 37,214, 55, 45,249,253, 69,202, 91, 88, 32, 84, 47,199, 56,249,129, 18,
- 81, 31,156, 10,135, 16,242,133,227, 19,183, 61,175, 1,104, 47, 39, 22, 17,147, 9,190, 81, 10, 33, 11,214,116, 88,208, 20, 74,
-192, 81, 72,123, 54,113, 9, 45, 22,101,161,195, 63,167,140, 32,144, 34, 25,137, 15,208,105, 52, 41, 95,217,199,189, 31, 31, 72,
-227, 60,195, 59,143,135,227,137,166, 61,102, 78,135, 77,224,128,138, 88, 69,167, 86,128, 59,132,192,149,182,179,134,200, 77, 90,
- 99,181, 90,195, 57, 3, 0,168,171,154, 64, 44,236, 69, 54,214, 66, 12, 61, 54,155, 43,156, 14,247,139,105, 67, 94,101, 45, 97,
- 39, 33,100,111,115,114, 59, 72,153, 10,170,211,121,196,245,149, 77, 36, 49, 41, 40,168, 37,101, 47,120, 14, 94,145,180,246,146,
- 2,104, 35,107, 65,107, 84,149,134, 82, 26, 90, 41, 40, 30,115, 7, 73,207, 70, 64,128,174,107,220,190,126,141, 47,191,254, 26,
-155,171, 43,168,245,138,186,246,110, 5, 85,183, 41, 81,209, 57, 11,103, 38,216,121,130,153, 39,140,227,128,190,239,113, 56, 28,
-233,208, 5, 96,218, 6,181,243, 8,186, 66,144,146,215, 4,158,198,149,222, 48, 63, 95,193, 5,151,186, 12,239,124, 98,240, 71,
- 7, 73, 96,209, 31,141,249, 7, 12,231, 17,167, 83,143,227,169,135,241,153,127,157,194, 46, 60, 81, 2,154,166,131, 20, 36,146,
-146,156,156, 54,207, 19, 14,135, 61, 94,188,188,195,123,223,125, 43, 27,114, 46, 82,182,178, 91, 36,227, 76,105,212,158,117, 70,
- 8,129,125,224, 5, 72,201,243,122,140, 21,224,137,181,144,210,212,232, 3,182,222,225,239,254,225,239,227,255,253,151,255, 26,
- 66, 72,156,142, 15,240, 12,198,223,152, 0, 0, 32, 0, 73, 68, 65, 84,214,242,168, 89, 20,157, 90, 46, 55, 18,247,220, 57, 40,
- 99, 33, 85, 38, 22, 26, 99, 48,206, 6, 90, 87,168,148,128,153, 29,154,154, 66, 86, 92, 76,121, 91,232,151, 88,113, 30, 66,177,
-202,138,130, 83, 65,115,200, 66,189, 78,163,112,131,192,177,174,113, 26, 68,216, 82,153, 46, 93, 81,100,222, 75, 33, 40,223,156,
-117, 6,170, 16, 44, 6, 0,149, 2, 12,159, 51, 46,248,130, 30,137, 98,236, 44,179,142,128, 53, 91,190,176,220,162,136, 50,245,
-158,138, 58,173,235, 20, 25,108,236,156,109, 99, 81,180, 93,224,151, 51, 95, 94,240, 68,203, 0, 65, 98,158,185, 57,211, 20, 63,
-108, 93,192,105,178,105, 50, 96,173,192, 87,207,190,198, 71, 31,190,191, 76,101,244, 14, 54, 77,245, 92,254, 94, 68,220,117, 8,
-140,232,205,129, 45,101,167,158, 45,222,197,239, 73,194,185, 28,242, 20,202, 30, 40, 42,252, 89, 88,173, 47, 13,104, 41,205, 51,
-191,157,116, 33, 72, 86,189, 23,200,184, 68,194, 90, 52,132,162, 64,115,135,196, 47,207,174, 55,129,113, 14,240,230,136,166,214,
- 4,216,247, 62,121, 44,155,182,193,225,222, 64, 6, 79, 7,115, 48,236,181,149, 88, 85, 18,231,179,199,233,120, 68,219,214, 16,
-170,198, 60,157,241,228,209, 99, 60, 60,220,161, 91,109, 49, 79, 35,116, 85,163,239, 79,168,116, 69,227,178,224,112, 56,246,168,
- 21,176,186,122,140,235,235, 27,116, 93,155, 30, 60, 33, 36,188,227,192, 12,107,225, 12,141, 57,191,243,157,239,224, 7,223,255,
- 62,198,243, 25,125,223,227,203,167, 79,241,244,155,111,240,242,245, 61,130, 15,216,116, 13,186,182,193,225,116,230, 93, 17, 29,
-120,198, 24, 76, 19, 93, 22,154,201, 91,225, 60,166,107,216,199, 93,205, 60,225,243,175,190,193, 15, 63,121, 63, 85,104,226, 50,
-194,116, 25, 39,198,117, 96,120, 67,238,246,166,124, 49,179,247,243,184, 58,188, 25,112, 94,254, 59,139,204,241, 80, 88,230, 66,
- 81,112, 32,237,236,249,129, 19,165,169,162,208, 91, 68, 24, 77, 26,247,251,172, 63,192, 27,184,226,236, 25,190,248, 25, 68, 17,
- 50, 19,167, 5, 66,132,100,177,155,140,197,254, 52,225,124,158, 32,165, 64,173,107,200,224, 32,131,129,150,196, 71, 63,207, 20,
-152, 97,173,133, 49, 6,231,105,194,195,195, 30,243, 60,144,186,149, 83,186,200,222,227, 88,140, 19,237, 62, 25,141,232,157, 39,
-149,177,247,104,154, 14,171,245,150, 58,128,144, 85,248, 93,219,146, 66,157, 95,253, 52, 77,104, 59,149,131,146,194, 18, 52, 35,
-163,125, 69, 92, 14, 41, 66, 26,187,163,184, 52,134,105,198, 60,219,148, 28, 24, 1, 43, 34, 2, 84, 56, 88, 38, 10,116,164, 82,
- 41,185, 75, 85, 21,164,174,168, 8,136,135,176, 80, 16,149, 34,145,144,215,208,117,131,245,122,131, 23, 95, 63,199,205,245, 53,
- 62,248,224, 3, 82,171, 43, 77,251, 37, 85,193, 51,255,192,177,199,218, 76, 19,134,211, 9,135,253, 1, 46, 4, 84, 85,141,105,
-158, 81, 13, 35, 42,165, 40,106, 53, 0, 66, 73, 56, 47,144, 2,181,217,186, 20,147,175, 2,219,191, 92, 32, 93,128, 51, 52,241,
-152,199, 9,211, 52,162, 31, 71,244,253,136, 99,127,198,177, 31,200,243,157,103, 77,104,218, 21,132,160,103,174,174, 91,206,244,
-166, 73,134,247, 30,243, 52, 64,235, 10, 82, 8, 60,125,254, 18,235,117,139,235,171, 77,186, 68, 83, 19, 2,118,146, 64,164,125,
-185,228,194, 10, 34, 36, 5,118,132,114,249,144, 5, 94, 30, 62, 57, 72,210, 8, 94, 41,142,134,141,147, 41, 15,120, 26, 43,255,
-225,191,243,251,248, 87,255,250,231,144, 82,226,120,120,224, 61, 46,237,192,203, 40,193, 8, 50,241, 12,164,153, 1, 72, 71, 62,
-126,231, 60,103, 82, 24, 24,235, 96,148, 64,163, 21, 12,211, 53, 99, 70, 59, 65,110,144,196,159,180,154, 89,102, 32, 43, 69,238,
- 4, 33, 21,139,182,232,210,113,206, 32, 56,114, 29, 40,185,124, 74, 35,153, 48,117,211, 28,163, 26, 47,103,201,162,190,152,254,
- 29,255,158, 50,207,169,160, 13, 62,147,239,202, 98, 95,150, 65, 81, 33, 34,142, 11, 55, 12, 36,133,183,240,231,161,171, 26, 74,
-105,126,222,185,160,143,207,155, 64,161, 97, 98,177,157,164,169,145,103,145, 54,180,132, 12, 26,179, 48,104, 44,219, 44, 21,176,
-235,106,156, 89,207, 34,156,133, 21, 18,167,254,204, 28,123,153,112,193,129,221, 49,139, 93,120,153,105, 17, 50, 90, 88, 36,140,
- 52,175, 95,211, 62,212, 47,156,100, 57,122,181,152,227,137,229,164, 37,198,159, 11, 4,134,207,188,177,179,148,121,217, 47, 22,
-250,252,220,173, 95,116,125, 11,245,110,162,197, 73, 62,204,233, 8,179, 94, 96, 26, 45,132,159,209,214,154, 14, 18, 33,208,143,
- 19, 86,155, 14, 24, 5,250,211, 9, 15,135, 19,182,235, 22, 64,192,245,102,141, 97,162,142,119, 50, 6, 99,204, 30,118, 22, 79,
- 30, 85,120,245, 48,160,110, 28,106,173, 97,167, 1, 85, 93,193,121,143, 90, 81,183, 60, 79,103,116,155, 45,165, 33,185, 25,127,
-246,167,255, 0,109,219, 82,254,179,162,234,145, 34, 79, 91,218,163, 58, 11,111,105,175, 26,189,188,214, 24, 4,231,240,209, 7,
-239, 99, 28, 6,140,243,140,227,233,132,127,243,219,207,241,151,191,250, 13,218,186,194,200, 76,120,239, 3,148,180, 41,254,241,
-100, 61,110,216,182, 65, 93, 23, 56,101,200, 16, 84, 98,158,113,123,127,196,205,213,186, 96,169, 23, 23,153, 40, 59,106,177,184,
-224,196,197,218,185, 20,143,229,236,117,252,237,225, 37, 89,186,251, 6, 72, 70,148,177, 61, 33, 7,165,100, 28, 33,237,255, 66,
- 40,180, 23,133, 87, 44, 1, 85, 72, 22,146,217, 51, 16,139, 2, 33,239,217, 3, 39, 78, 33,217,236,202, 80,160,120,233, 77,179,
-197,225, 52, 97,156,136, 62, 86, 85, 26, 34,144,195, 33, 56, 11, 97,251,228,125, 31, 38, 11, 1, 15, 59,143,148,124,101, 45,102,
- 51,227,112, 56, 36,111, 45,188, 79,217,219, 62, 74,154,131, 39,145, 16, 31,210,129,133, 68, 49,204, 66, 74,133,110,189,165, 81,
-177,157,179,184,144, 15,171,237,102,139,233,118, 76,252,134,113, 28,208,180, 43, 76,211, 88,192,101, 10,167, 64, 40, 55, 40,133,
-229,141, 33, 36, 34,159,144, 24,103,131,105,142, 81,157, 9, 23, 69,221,146,146, 41,123, 62, 93,236, 74,241,222,154,146,218, 28,
- 4,130,117, 8,186, 2,132,166, 17,190, 53, 4, 74,169, 27, 40,231, 81,117, 43, 84,211,132,167, 95,126,133,171,171, 29,154,134,
- 52, 46, 66,106, 4, 85,241, 72,214,192, 49,247,123,158,103,244,167, 19,198,105,198,106,181, 70, 0,112,232,207,144,106,100, 63,
- 58,231,139,123,130,215, 32,120, 64, 42,222,169,139,148,207, 29,189,232,206,121,216, 64, 58,128,121,166,233,202,121,152,208,159,
-122, 28,206, 3,142,231, 1,147,229,139, 9, 2, 74,105, 70,208, 42,238,156, 9, 97,170,171, 26,206,186,116,241,106,161,248, 96,
-165,105,203,151,207, 94,224,106,187, 65,214,117,134,204, 85,242,121, 12, 42,101,198, 92,135,197,133,206, 23, 60,219, 14,125, 73,
- 68, 12, 76, 74, 99,208, 78, 81,205,101,178,166, 32, 85,247, 79,127,250, 19,252,226,151,191,194,211,175,128,227,254,158,167, 48,
-158,115,185,179,184, 54, 78, 58,232,114,182,132, 4, 6,136, 51, 96, 28,140,117, 8,214,161,210,138, 44, 90, 2,176,134, 38, 25,
-214,186,148, 32,231,125,160, 2,213,131, 61,225,129, 19,210, 36,103, 32, 81, 70,183,227,177,187,181, 6,222,218,180, 70, 80, 74,
- 34, 39,148,208,101,163,162,134, 70, 0, 80, 98, 65,117,244, 33,115, 55, 74,116,180,224, 63,203,133, 0, 29, 4,179, 62,138,240,
-169, 8, 11, 10,217, 81, 21, 82,212,105,193, 85,231,207, 91,233, 10, 82, 42, 88,107, 96, 45, 33,121, 11,105,110, 42,218, 2,135,
-218,144, 50, 94, 3,160,132,185,224, 5, 36,116, 98,181, 76,179,161, 17,124, 8,232,154, 10,187,182,198,125, 63, 82,190,137, 48,
-112, 86,226,111,190,120,138, 15,222,123, 59, 19,242,130, 91,224,213, 17,150, 33, 27,241, 50,143, 98,190, 32, 46,230,170, 9,202,
-229, 83, 3,157,146,217,252, 34,116, 58, 23,146, 33,134, 71,208,119, 76,127,107,234,101, 9,146,137,158, 78,145, 65, 34, 11, 63,
-112, 17,163,158, 41,115, 5,163,155,223,200,217,122, 88, 99, 33,188, 69,215,104, 34, 30, 89,139,217, 88, 32, 56,104,181, 70,215,
- 54,232, 86, 29, 32, 4,142,253,128, 90, 2, 47,111,111,209,181, 45, 36, 2,214, 93, 7,169,107, 76, 67,143,217, 24,188,120,249,
- 26,117,183, 70, 63,156,161,132, 64,219,173,104,183, 84,213, 48,194, 98,154, 71, 82,191, 31, 14,144, 90,225,238, 97,192,147, 39,
-111, 99,183,189,161,241, 95, 32,198,183,144,146,208,149,206, 33,132,138,118, 89,188,211,240,206,209, 30, 48, 16, 78,209,172, 87,
-152,167, 25, 55, 87, 87,120,114,115,131, 31,126,255,123,248,167,255,252, 95,224, 87, 95, 61, 79,160, 20,120, 1,131, 60, 5, 80,
-188,219, 34,131, 38,237, 7, 17, 2,197, 24, 78, 35, 94,221, 62,224,241,205,150, 49,177,229,222,117,249, 70,139,111,179,212,138,
-156, 76, 36,226, 5, 20,138,205,123,250, 13, 62, 37,182,133, 98,164, 29,125,165,192, 5,180, 46,218, 16, 99,215, 81, 2, 35,130,
-128, 16, 30,222, 75, 8,153,133, 80,254, 50, 45, 13,146, 73, 78,254, 50,243,245, 13,106, 90, 26, 31,165,128, 22,122,237,214, 58,
-236,143, 35, 78,253, 72,107,143,118, 69,232,208, 70, 16, 64,200, 77, 8,158, 20,179,129, 9, 77,150,211,164,198,113, 32,171,142,
-146,152,231, 30,198, 90,156,207, 3,166,105,128, 53, 6,194,145,125, 45, 64, 66, 10, 10, 56,145,224,221, 23, 88,196,226,243,107,
-139,175,115,179,187,198,122,179,131,157,198,197,195, 21,138,103,165,109, 59,156,135, 62,119,218,222,101,152, 73,177, 10, 17, 11,
- 64,214,146, 64, 19, 71,239, 82, 72, 56,111, 9,233,233, 2,134,113, 36,223,182,181, 8, 85,149, 14, 71, 18, 41,210,119, 89,198,
- 76,119, 22,105,122,235, 16,132, 3,132,133,148, 21, 52, 12,117,250, 90, 3,186,134,240, 22,194,121,218, 69, 54, 13,234,213, 26,
-167,251, 91, 60,127,246, 53, 86,155, 45,170,245, 22, 74, 86, 8,144,240, 66,193, 11,199,197,169,197, 52,142, 56, 30,123,248, 0,
-168,186, 38, 84,236, 52, 67,106,133,102,172, 83,151, 91,235, 10, 96,212,166,151, 68,182,147,162, 24,115, 35,234, 17, 28,140,115,
- 28,211, 57,226,212,247,212,157,159, 7, 28,251, 9, 99, 76,140,243, 1,117, 93,163, 91,109,104, 69,200, 60,116, 33, 5,140,157,
-211,229,155,156, 29,130, 70,170, 74, 74, 24, 51, 99,191, 63,194, 88, 78,145, 19, 50,225, 74, 3, 11, 59,211,223, 3,185,187, 18,
-153,226, 21,173,134, 66, 82,119,234, 93,198,211, 38, 0, 84, 72, 25,135,144,108,159,138,203,200, 8, 36,144, 82,226,199, 63,250,
- 1,234,170,194, 95,255,114, 68,127, 52,140, 85, 45,151, 97, 52,237,176,206, 35,192, 38,165,117, 76,141,156, 45, 53, 59,150,215,
- 47, 94, 73, 84, 58,119,144, 54, 18,224, 68, 94, 57,198, 11,222, 58,151,108,120,113,175,236, 5, 9,210, 34, 45, 46,166,164, 65,
-210,133,175, 8, 98,146, 5,176,233,168,145,201, 1, 20,223,211, 37,112, 38, 36,161, 26, 56,146, 58, 56, 7, 40, 9,199,226,225,
-176, 28, 30,164,208,170,136, 78,205,252, 11, 82,239, 72,169,248, 66,151,169, 89, 10,137,127, 34, 22, 74,164,192,126,114, 33, 21,
-105, 93, 64,168,216, 56, 13, 81, 69,186,223, 48, 17,253, 83,243,180,235,122,213, 96,127,158,184, 91,247,176,194,192,204, 26,102,
- 54,144,204,249, 15,222, 23, 13, 48,159,133, 60, 13, 72,118,180,144,167,162,178, 56,195, 75,226,165, 44,114, 33,210,164,174,136,
-221, 46,183,152, 82,200, 44,183, 21,128,250,251,127,242, 31,252,185, 64, 78,226, 42,243, 90, 99, 16, 75,206, 92, 71,130,199, 44,
-236, 31, 2, 5,207,236, 82,242,195, 7,209, 48, 2,206,162,213,146,246,112,198,114, 8,193,140,171,171, 43, 8,120, 28,143, 7,
-204,214, 97,127,127, 7,103, 13,102,107,240,104,183,161, 47,156,119,120, 56,244,168,181, 66,211,212,240,206, 97,154,231,228, 79,
- 21, 2, 56,115,146,144,170,169, 66,119, 60, 6,157,166, 17, 85,221,226,167, 63,254, 12, 79,158, 60,130, 51, 19, 42, 85, 97,181,
-222,177,168,198,167, 4, 31,153, 56,196, 34,141, 45, 35, 76, 65,241,136, 83, 87, 68,173,147, 0,180,214,120,180,219, 33,152, 9,
-207,111,239,201,110, 19, 69, 75,252,158,109, 54,107, 28,251,115, 97, 77, 3,103, 8,215, 9, 4,210,143, 22,215,187, 85, 18,200,
- 37,213,122, 92,115,132, 12, 33, 89,100, 70, 23,108, 56, 47, 46, 56, 3, 73,200, 24, 10,238,184, 72, 99,156, 80, 8,240,194,226,
-239, 4,222,192,187, 33, 7,242,200, 69, 40,140, 44, 34, 75,151,124,249,165,189,236,130, 24, 23, 68,234, 86,210, 61,198, 26,135,
-195,105,196,171,135, 1,183,247, 39,244,253, 68,201,100, 82, 66, 33,192,142,103, 56,107, 32,188, 69,112, 6,214,140,233,161, 68,
- 32, 69,180, 49, 51,172,153, 81, 73,240, 24,211, 97,156, 12,198,113,164, 61, 44, 23,146, 8,142, 11,142,216,133,147, 72, 46,122,
-120, 69, 84,167,179, 72, 72, 50,218,119,181,217, 65, 73, 73,209,172, 92,248, 17,108,131,148,220, 73, 97,207,227,229, 88, 52, 41,
-142, 57, 93,236,203,211,131,202, 66,191, 66,141, 45, 5, 65, 84,164,228,139,144,215, 2, 74, 73,108, 86, 29,186,186, 70, 93,211,
-254, 80,113,151, 42,121,199, 43, 10,246,190,153, 38, 24,239,136,124, 23,242,250, 68, 50,254, 85,213, 13,100,213, 16, 60,132, 85,
-243,129,211,230,134,254, 68, 36,184,166, 5,148,130,144, 21,102, 86,186, 79,195,128,211,241,128,151,223, 60,199,151, 95, 62, 77,
-187,196,135,253, 1,195, 76,192,155, 8, 6,137,107, 12,159,144,168,180,115, 44, 99, 52,173,243, 48,198,194, 88,131,201, 88,140,
-227,132,243,249,140, 19,143,219,143,195,136,209, 90,248, 0,180,221, 10,109,219, 49, 33, 76, 50, 38,213,103, 93,138,160,252,244,
-248,223, 74,107, 52,140,169, 61, 28,143,152,102, 2,228,188,251,206,219,156,158, 88, 70,223,138,164, 3,145,201,147,238,211,212,
- 40,141,149, 89,196, 24, 16,146,248, 75, 42,181, 40, 0, 66,129, 27,139, 49,167, 17, 86,146,113,166,244,108, 94, 95,239,240,240,
-112,196, 56, 14,176,142, 18, 41, 61, 22,190, 83, 22,227,121,120,231, 97,189,195, 56, 77,152,102,131,217, 80,216, 79,236, 24, 69,
-161,129,178,188,126,136,147, 68, 95,236,209,125, 18,149,146,159, 91, 74, 74,220, 35,242, 32,185, 26,146,176, 45,189, 7,249, 88,
-200,163,119,110, 98, 80, 76,150,178,249, 42,163,170, 56,153,179,204, 74, 47,189,255,226,146,119,145, 70,231, 5,185,175, 8, 9,
- 83, 82, 17,183,157,177,175,142, 11,245, 40,222,147, 23,248,108,178,218,105,104, 69, 69, 64,116,136,160,136, 15, 47,117, 13,154,
- 25,244, 74, 73,172,218, 6,227,108, 49,218, 60,238,151, 82, 98, 54, 14,171, 70,167,179, 35,151,237,158,149,100, 34,179, 91, 66,
- 40,240,110, 49, 85,238, 98, 55, 94,216, 92, 47, 83, 43,211, 87,167, 48,153,199, 30, 60,158, 39,186, 60, 96,114, 37,181,196, 99,
-132, 34,120,133,118,168, 28, 65, 83, 18, 20, 67,161,164, 20,249, 69, 82,245,163, 32,189, 37,118,187,240, 56, 77,212,101, 76,204,
- 38,150,138, 94, 76,219, 52,120, 56,156,240,199,127,252,199,248,127,254,217,255,141,113,180, 24,102,218, 79, 59,239, 81, 85, 21,
-102,235, 16,230, 25,231,113,162,241,145,165, 29,134, 99,166,178,215,192,232,122,212,186, 34,229, 39, 2,174,118, 59, 60, 28,246,
-120,239,221,191,139,105, 28,161,133,128,115, 22,227,216,163,237, 86, 88,111,174, 16,130, 43,198,198, 30, 81, 17,147,188,207, 92,
-133, 7,103, 89,152,196,111,176, 82,104,234, 10,191,243,221,119, 48,143, 35,190,184, 63,226,238,216, 67,241,110,197, 7,137,227,
-233, 68, 7, 50,143,168,100,200,194, 19, 41, 37,230,105,196, 97,239,209, 63,218, 97,221,213,184, 8, 27, 47, 93,224,111,180,187,
- 73,193, 30,150, 10,138, 56, 81,241,229, 14,157, 15, 18,207,151,254,114,119, 45, 46, 24,116, 69,167, 46,222, 12, 46,200,104, 86,
-191,248,210,189, 49,118, 66, 46, 48, 68,153,227,206, 59, 75, 9,160, 31, 45, 78,103,155, 94, 87,240,150, 20,215,108, 27, 12,188,
-207,115, 60, 18, 15,110,198,232, 61,218,138,108, 73, 21, 2,230,121,128,224,145,173,103,187, 14,237,124,249, 33,243,150, 58,220,
-105,194,108,102,212, 74, 20,184, 73,166, 49, 33,164, 84, 43,197, 83,143,244, 48,113,197, 45, 21, 61,132,214,146, 63, 91, 43,201,
- 15, 56, 93,170,193, 57,238,252, 5,195, 95,108, 94, 89,149, 4, 64, 33, 22, 94,104, 33, 69,105, 60,161,183, 72,138,116, 73,163,
- 56,200,198,137, 16,163,198, 90, 56,239, 82,210, 97,144,153,162, 23, 73,100,198, 57,204,150, 80,174, 1, 52,162,175,234, 26, 74,
-173, 16,116, 3, 72,149, 19,216, 20,241,201,181,153, 9,118, 82,215, 24, 78, 35,190,248,226, 11, 56, 8,220, 12, 19,218,237, 21,
-160, 42,114,112, 28, 15,120,253,242, 5,158,126,245, 12,183,247,123,200,186,130, 59,246,232,135, 17, 77,215, 98,182, 22,167, 97,
-132,245, 30,205,108, 48,114,231, 83,197,120, 99, 41,146,208, 44,118,137,214,154, 52,118, 31,198, 17, 39, 30,183, 31,135, 9,227,
-108,225, 5,160,235, 6,186,170,147, 8,151,196,119, 25, 15, 92,158,105, 85, 85, 67, 72, 26,175, 30, 14, 15, 64, 8,168,234, 6,
-235,205, 46,165,140,149,151, 69, 2,156, 0, 80, 42,219,168,226,247,216, 95,140,223,227,136, 62,218,221, 2,119,107, 17, 14, 3,
-142, 71, 22,151,187,249, 82,242,202,196, 66, 33, 4,222,249,238, 59, 56, 29, 15,240,206,192, 26,208, 58,144, 61,238,190, 32, 55,
- 83,179, 68,144,157,201, 24,190,208, 9,121, 26, 56,193, 79, 8,197,150, 51,201, 88, 83,177, 80,155, 43, 30, 65,107, 65, 9,101,
- 82, 72,138, 58, 69,192,108, 45, 16,253,223,252,220, 9, 22,190, 57,246,231, 71, 75,156,226,171, 51,138,215,162, 62, 38, 33,139,
-147,131, 4,105, 66,128, 66,132, 27, 79, 23,153,130,116,100, 58,235, 50, 31,163, 20,212, 34, 95,232,186,162, 52, 57, 59,243,107,
-247, 41, 57, 45,175, 43,153, 79,193,171, 26,165, 43,250, 89, 25, 80,196,213, 9, 69,228, 58, 15,105, 35,125, 79, 96, 28,103,180,
-117,205, 14,153,128,155, 77,139,195,121, 78,235, 24,107, 13,230, 89,165,181, 87,250,238, 21, 34, 63,222,157, 20, 16, 86,145,245,
- 68,101, 38, 69,160,245,236,162,211, 89,206,192, 19,193,114, 41,156,202,246, 87, 4,124,203,165, 94,164,113,165,110,189,216, 76,
- 8, 22,128,200, 11, 74, 89, 98,110,251,184, 51, 16, 28, 47, 26, 48,156,238,161,149,132,150, 36,126,163,204,234, 9, 82, 73,212,
-117,155,178,134,199,105,198,213,110,139,215,175,111,209,214, 36,120,154,166, 9, 93, 83,195, 6, 82,149,107,173,112, 30, 38,184,
- 48,144,247, 83, 73,138,123,180, 22,155,182, 73,233, 64,136, 64, 14, 99,112, 30,206,240,214,225,124, 58,161,214, 26,222, 26,116,
-109, 7,107, 29,102,231, 48,142, 35, 89,124,234, 26,149, 82,104, 87, 27,136,224, 49,143,103,216,105,226, 73, 1,167, 33, 89, 75,
- 95, 26, 22, 8, 57, 75,144, 9,165, 43,192,123,188,115,181,193,167, 31,127,136,191,250,245,231, 56,158, 7, 72, 8, 28, 79, 39,
- 56, 31, 32,165,231,202,158,193, 11,206,194, 57, 10, 68,240, 83,192, 23, 95, 61,199,143, 63,251,240, 34,100, 85, 20, 89,234, 75,
-245,180,143, 20,172,226,179, 14, 11, 16,204,101, 46,187,200,169,100,223, 26,236, 26,107,203, 98,132, 94,248, 48,211, 67,139,191,
-157,175,153,247,241,178, 16,135,197,111, 47,253,201,214, 1,253,224,177,231,228, 58,165,168,235,173,170,138, 41, 85,220, 57, 59,
-139,217, 59,212, 82,160,214, 2, 62, 56,204,198,208,143,106, 70,140, 86, 98,189,234,210, 14,173,107,106, 56, 79, 2, 44,231, 44,
- 93, 44,231, 1, 74, 73,156,250,158,232,131,118, 70, 37, 5,249,129, 61,229, 91, 59,235, 96, 66,238,162,232,249,230,253,180,148,
- 80,220, 73, 72, 93,195, 9, 38,202,121,151, 47,124,238,208,165,100,175,173,181,144, 74,163,214, 53,108,109, 49,205,115,122,112,
- 21,251,128,133, 88,114, 7,162,205, 77,198,195, 72, 4,134,146,228, 93,101,252,103,198, 57,244,195,132,217, 24, 58,240, 67,145,
- 19, 16, 28,130,210,180, 3,229,192,163,104,131,115,206, 83,158,121, 32,229,126,109,102, 56,173,224, 0, 26,191,243, 84, 64,234,
- 6,170,110,128,218,192, 87, 13,190,124,254, 2,251, 83,143,183,223,189,199,230,234, 26, 74, 85, 52,190,190,191,199,211,175,190,
-194, 23, 95, 61,167, 28,131, 97,130, 0, 80, 55, 53,137,216, 2,224,252,132,113,158,105,231, 42, 21,130, 84,201,102,183,105,106,
-220,172, 27,172,219,134, 99,137,163,238, 33,238,209, 71,156,206, 35, 78,227,132,201, 58,184, 16,160,116,133,182,237, 10, 81, 39,
-119,138,188,166, 16,146,214, 93, 49, 62,179, 63, 29,168, 64, 98,126,122,221,116,168,185,195,167,208,153,166, 32,195,229, 11, 90,
- 74,153,166, 10,177,224,202,103,157, 76,235, 38,193, 83,134, 40, 16,206, 76,134, 34,178, 58, 42,244,227,216, 62,145,197,179, 85,
- 52, 78, 3,222,255,157,119,112,255,176,135, 49, 51,134,211, 1, 22,128,115,185, 91,134, 15,133, 18,158,186,111, 99,168,112, 84,
-130,118,178, 49, 52,201,123, 1, 40, 13,173,114, 5,111,249, 53,198, 29,125,165, 43, 80,235, 35, 83,164,168, 51,236,240,136, 29,
-111,156, 50, 48, 79,192,249, 28,102, 67,211,221,104, 99,203, 90,157,200,161,136,153, 36,209, 91, 83,202,182,147, 6, 72,128, 25,
- 15,220, 73,243,225,229, 66, 72,204, 6,138,156,144, 92,120,171,244,121,134, 64,202,255,132,170, 45,176,208, 41,139, 92,114,215,
- 94, 92,232,164, 73,177,169, 96,137,206, 29,231, 60,172,200,107,148, 97, 54,104,103,186,216,173,117, 88,183, 13,154, 74, 99,118,
- 81,208,232, 97,140,132,177, 30, 77, 93, 21, 24,107,145,168,154,113, 71, 45,196, 50, 2, 59, 44, 24,223,165,235, 44,135, 61, 69,
- 45, 19,164,132,140,147,155, 76, 26, 33, 93, 10, 51, 12,226, 12, 64,151,234,232,178, 91, 7,219,219,124, 33,146, 18,241,127, 47,
-198, 84,178,240,200,133, 11,226,205, 60, 91,244,199, 19, 42, 37,208,213, 84, 12, 40,165, 17, 88, 25,222,182, 53,116,173, 19,151,
-122,189,162,188,229, 97, 80,248,193, 39, 31,227,229,139,231,120,216,239, 49,112,178,217,112,238,177,221,108,160,130,197,205,102,
-133, 97, 28, 97,157,165, 93,150, 38,155,206, 48,205,168,180,134,225,131,115,182, 30, 16, 51,186,174,197,126,191, 71,240, 30,211,
-106,133,177, 27, 41, 94,117,154, 82,126,122, 85,105,104, 77, 93, 72,219,174,208, 53, 91,204,144, 60,198, 15,152,199,137,243,145,
- 41, 88, 34,170, 77,189,247,112, 28, 11, 59,246,103,232,166,193, 79,126,240, 49,180,174,240, 23,255,230,215,120, 56,244, 52, 10,
-132,162,253,102, 8,148, 61, 45, 36,164,210,176,134,190,217,131, 16,248,205, 23, 47,241,253, 15,190,131, 66,228, 94,120,103, 73,
- 56,140,203,152,200,128,101,194, 91, 88,170,168,151,224, 19,153,196, 45,197, 86, 55,239,103, 80, 98, 22, 69,234, 68,132, 92, 86,
-143,111,162, 94,240, 45, 96, 21,130,129, 88, 7, 28,123,131,113,206,132,168,121,162, 29,249, 52,156,120, 52,235, 49, 13, 39,104,
-165, 96,205, 76,133, 99,112,208, 44,250,241, 94, 99,178, 14,179,153,209,112,252,231,170, 33,240,198,163,235, 45,228, 64,128,137,
-196, 11,224,136,206,113,154,160,217,247,108,230, 17,149,146,140,252, 45,190,239, 82, 64, 5,137, 32,217, 19,204, 15, 22, 93, 14,
-116, 24, 41,169, 97,188,131,212,100, 91,179,102, 78,161, 30,222,199, 44,247, 44, 88,145,140,132,109,154,150,198,253, 96,155, 89,
- 16, 11,145,224,165,243, 32,235,106,100, 26,239,225, 98,191, 38,165,196,121, 28,169, 91,143, 30,226,228,249, 97, 63, 56, 3, 79,
- 28, 35,108,199,105,198, 48,144,198,160,174, 42, 12,231, 51,206,167, 35, 54, 93,135,213,106,133,182,107, 81,183, 43,136,170,134,
-106, 26,172,171,183,224,160,209, 15, 35,102,161,240,171, 47,158,225,171,231, 47,209,118, 29, 32, 5,230,201,224,112, 60,225, 56,
- 76,132, 20,214, 10, 85, 18,116,145,174, 4,186,134,149, 21,117, 80,222, 82,193, 81,124, 39, 79,195,128,111,238,129,109,219,224,
-201,213, 6, 77, 69, 5,174,153,103, 12,227,132,126,156,112,158, 12,102,254, 25,235,182, 67,221,182,169,217,144,197, 28, 56,120,
- 15, 23, 92,218,225, 74,102,134, 87, 21, 37,114, 73,165,104,228,170,232,210,127,252,232, 6,191,247,147, 31, 20,133, 42, 39,172,
- 49,114, 55,118,180,146,149,217,203,236, 4,207,131, 60, 22, 41, 65, 16,164,133, 83,202, 34,192, 36,126,182, 62, 68, 94, 60,169,
-224, 61, 95, 94, 73, 67, 83,118,162, 33,224,223,250,209,247,113, 58, 30, 17, 66,192,249, 68,129, 66, 54,102,157,167,213,133,231,
- 44,116,250,140,227,125, 32, 35,193, 18,180,254,169, 52,171,194, 37, 31, 30, 2, 68,107, 3,125,103,181,214,240,160,231, 3, 66,
- 32, 88, 75, 78,160,100,227, 19,233,122, 73, 86, 54, 6,182,200,144,215, 19, 50,173,123,202,201,134, 88,232,175, 36, 51,220,165,
-144,233,130, 79,171, 93,126, 61, 10, 62,197,118, 7,231,115,226, 98,188,236,164,132,210,138, 61,232,244,204,123,110, 2,242,249,
-148,213,246, 81,159,147, 84,253,160, 16, 26,235, 44,202, 96,221,184,187,247,209, 39,239, 92,138,130,157, 38, 3,219, 57,122, 63,
-107,137,109, 87,225,245,225,156, 8,149,214, 90, 28, 78, 3,222,122, 84, 21, 32, 35,207, 23,110, 72,124, 2,148, 54, 60,153, 4,
- 23,185,115,191, 80,179,199, 6,144,252,232,161,160,252, 21,186, 35,228,130, 50, 54,227,234, 79,254,244,207,254,156,118, 34,114,
-177,215,136,123, 93, 25, 82, 76, 87, 6,162, 68, 36, 42, 99, 42,197, 34, 13, 43,127,160,118,114,176,102, 70, 83, 43, 82, 98, 90,
- 7,107, 38,156, 78, 61,186,174, 69,211, 52,164, 82, 30, 6,130, 67,204,180,171,123,252,232, 17,246,247,247,216,238,182,216,109,
- 58, 56, 75,164,171, 90, 19,116, 97,211,181,216,178,157,172, 82, 10, 74, 9, 56,235,152,210, 6, 76,206,161,214, 21,169, 64,131,
- 39, 15,174, 39,165,179, 49,148, 62,101,102, 26,243, 89, 78,222,178,142,132, 63,209,135, 60, 79, 3,134,254, 64, 29,181,181,232,
-218, 45, 14,251, 59,204,150, 70, 93,253,233, 72,225, 18,214,225,212,247,184,127,120,192,253,221, 61,134,113, 66,144,196,200,110,
-154, 26, 31,188,247, 93,124,246,189, 15, 48,142, 35, 14,231, 33,117,104, 66, 18, 66, 52,118,195,113,204,229,188,199,102,187, 65,
- 93,233, 69,167, 28,177, 6,209,134, 17,237,129,201,146,246,230, 74,155, 6,177,145,107,141,188, 74,200,114,136,203,161,123,217,
-129,231,125, 77,178,127,240, 40, 15,178,220,189,139, 69, 48, 69,156, 32, 12,147,199,253,254,140, 87,183, 7,188,186,219,195, 11,
-133,190, 63,177, 26,188, 39,145,224, 56,192, 89, 3, 51,159,161, 56, 22,215, 26,210, 94,104, 9,104, 25,224,152,155,174,149,128,
-115,134,236, 26, 8,232,106, 13, 19,128,201, 82, 50,151,243, 30,198, 56,172,154, 10,195, 56, 66,202,128,102,213,225,116, 56, 64,
- 74,137,211,254,128,121,158,201, 61,225, 44,218, 74,167, 93, 95, 74,199, 2, 0,161, 8,197, 89,236,179,148, 84,168,170, 6, 66,
-210, 1, 72, 94, 97, 3,137,156,203,172,152,103, 78,128,146,232,209,245, 88,177,136,107,158,103, 38, 50,138,197, 24, 46, 71,222,
-137,148, 2, 22,127,191, 82, 44,230, 73,158, 87,207,255, 14,122, 94,187,166,198,170,107,211, 94, 93, 10,153,153,209, 25,114,128,
- 16, 2, 94,221,222,225,249,179,231,100, 73, 19, 18,175,111,111,241,242,171,175, 48,158,142,152,207, 61,236,112,134, 55,172, 77,
-144, 26,147,153,113, 30,135, 68,137, 51,206,225,208,159,113,127, 60, 97,127,236,209, 79, 51, 76, 16, 52,190,103, 45,128,172, 59,
-168,118, 3,168,138, 1, 53, 52,141,138,201, 95,145, 30, 39,165,226,117, 5, 5,222, 56, 72,156,102,139,251,126, 64,127, 30,112,
- 26,232, 66, 31, 38, 3,227, 61,164,210,104,186, 21,237,205, 11,172,166,139, 4, 64,111,211,206, 27, 34, 91,205,242, 56, 94,162,
-105, 90,116,235, 45,126,242,227, 31,225,247,127,247,135,120,235,201,205, 27,101,105,220,201,167, 75,182,152, 98, 74, 89,172,189,
-226, 5,224, 67,225,173, 14, 75,189, 4, 3,108, 34,160, 70,138,172,101, 41,195,148, 11,253, 24, 19,245,168, 59,219,237,182,184,
-187,219,243,136,151, 58,117,103, 29, 92,240,176,124, 78,184, 66,152, 37,132,128,226, 17,187,146,185, 72,128, 0, 52,159,155,165,
-135, 28,124,209, 73,214, 29, 36,246,128, 53,169, 48, 42,114, 28,211,229, 27,149,225,222,231,109, 95,130,163, 68,145,157,207, 54,
- 87, 95,228, 61,196,159, 89,177,103,127,153, 54, 89, 88,206, 74,119,149, 40,216, 13, 60,110, 87,170, 74,239, 75, 68,241,198,203,
-188, 8,111,100,130, 36,143,220, 85,197,137,107,140,129, 46,210, 30, 47,215, 0, 73,167, 20,137,141, 82,162,109, 27, 52,117,157,
- 86, 24, 15,253,152, 68,112, 84,172, 8, 92,239, 86, 75,139, 89,249,105,151, 63,155,100, 64, 13, 79, 46,211, 81, 16, 53,108, 69,
- 66, 96,116,201,100,141,196, 50, 72,230, 82, 5, 37,132,128,150, 82, 94,176, 99,227,155, 25,138,125,170, 79,149, 82,224,213,191,
-243, 30,144,161,200,189, 46,163,192, 3,230,201,162,239, 79,208, 34, 16, 12,129, 71, 68,195,100,160, 42,141,186,105,240,226,235,
- 47,177,123,235,187,168,155, 6,227, 56, 96,187, 94, 99, 54,116,217,234,186,193,139,103, 95,192,135,128,171,221,150,172, 5,124,
-169,244,211,132,186,170,209, 74,137, 90, 81,240, 74, 93,213,184, 59, 28, 49, 27,131, 70, 75, 24,142,100,149, 66, 98,127,238,209,
-194,227,139,241, 25,214,171, 22,219,245, 26,187,237, 6,187,237, 22,219,221, 22,235,245, 26,235,142, 50,212,219,174, 67, 83,215,
-168,181,166, 29,254, 60, 3,222,163,239, 79, 24,199,145, 70,230, 16, 56,245, 61,134,121,134,113, 1,167,227,145,254, 57,143, 57,
- 49,142,152,134, 17,117, 69,228, 46, 89,215,248,233, 79,126,132, 79, 15, 71,252, 95, 63,251, 11, 8,102, 34,211, 56, 63, 79, 62,
- 66, 32,218,220,151, 79, 95,224, 39, 63,252,104, 65, 77, 18,165,152,141, 23,230, 33, 62, 89, 34,147,106,100, 12,151, 64, 86,127,
- 74,137,148,185,187, 80,185, 92,236,112, 23, 95,236, 11, 31,123, 73, 63, 75,194,187,100,169, 0, 78,131,197, 48, 57,198, 85,106,
-156,251, 19, 29, 98,206, 65, 43,141,161, 39,122, 86,176, 4, 45, 17, 28, 3, 25,225, 41,176,164, 98,111,180,130,181, 51, 52,191,
-206, 85,219,194, 91, 7,203, 86, 29, 4,178, 1,173, 87, 29,206,195,136,174,238, 18,201,171,174, 42,120,118, 94, 12,147,193, 52,
-223, 99, 50, 22,128,192, 48,207, 16,193,163,130,135,170,170, 66,145, 27,125,163,252, 30,169, 40,113,241,172,110,102,213,116, 85,
- 67, 4, 73,211, 26,222,115, 74, 14, 58, 81, 41,160,196,243,106, 74,100, 6,191, 16, 88,175,183,152, 38, 66,107,198,241, 34,233,
-208,194, 27,154,196,144,166, 95,113,244,158,101, 62,178, 56, 1,214,235, 14, 62,144,237,198, 90,203, 22, 38,177,136,236, 85, 82,
- 64,233, 6, 74, 74,236,186, 21,134, 85,135,213,170,195,187,239,127,192,191,214,227,235,175,190,196,223,124,254, 21,174, 86, 13,
-118,219, 45,118,215, 55,216,220, 60, 66,181,189, 38,219, 19,168, 64,109,187, 22, 1,164, 8, 54,214,194, 5, 64, 86, 13,148,170,
- 25,119,233, 32, 21, 69, 90,210,100, 43,163,110,105,143,236, 51,173,143,189,195, 21, 11,243, 32, 21, 60, 4, 81,248, 56,209, 43,
-149,159,145, 99,193, 78, 6,164,195, 54, 35,102,227, 95,139,216, 49,202, 0, 41, 21,154,182, 67,183,222,226,211, 79, 62,198, 7,
-239,189,147,252,228,201, 87,206,251,238,232, 71,247,161, 20,102, 81,231, 46,101, 60, 80,139,241, 41, 19,217,188, 15, 11,128,149,
-144,226,130,233,127,153, 1,158,173,162,165,213, 41, 62,134,222,211, 57,235,248, 82,253,238,187,239,224,235,231,160,245, 97,152,
-224,226,218, 46,198,231, 70,129, 87,212,162,164,187,140,248, 17, 46,193,106, 72,176,168, 20, 95,122, 78,176,142, 73,165,247,204,
-145, 9,254, 34,215, 35, 64, 92, 56, 90, 22,235, 61,207, 63,143, 8,128,141,121,243, 33, 9,234,104, 29,149,243, 38, 18,192,135,
-185,255, 94, 98,249,250,163,187, 0,130, 2,166, 80,100, 2,128,120, 12, 74, 87,212,120, 57,206, 64, 96,140,239,114, 96, 40,146,
-232,151,118,232,154, 69,113,156,192, 88,252, 44,244,251,121, 62,153,162,184,233,189, 51,142,206, 78,195,129, 94,107,103, 33,172,
-128,150, 84, 56,185, 34, 69,207, 89, 91,232, 6, 66, 1,195,228, 40,234,162,114, 40, 89, 46,151,126,114,177, 88,178,163,204,180,
-206,215,183, 20, 23,144, 50,177,112, 19,169, 63,249,211,255,240,207,203, 92,243,112, 33,173, 15, 69,238,107, 40, 82,218, 66, 81,
-211,248,111, 97, 45,238, 15, 61,188,153,208, 84, 18,109, 93, 99,156,102,246,165, 7,108, 55,107,252,252,151,191,192,191,250,197,
- 95,227,179, 79, 62,133,117, 22,198, 88,116,109,131,201, 24, 84,186,194,122,213,161, 63,220,163, 82,212,229, 59,231,240,157, 39,
-215,105,100,236, 13,217, 22, 72, 29, 44, 17,156,199, 91,111,191,141,205,246, 26,253,233, 8,165, 20,102, 67,106,207,105,158,160,
-154, 22,163,113, 48,227,132,227,177,199,195,225,128,211,233,132,161,239, 49,141, 35,241,216,217, 38, 68,234,223,156, 59, 29, 51,
-163,199,225, 12,235, 60,134, 97,192,241,120,196,121, 24,112,234,123,188,126,253, 26,119,119,247, 56,157, 78, 9,136, 33,148, 34,
-254,187, 34, 65, 80,165, 53,116,165,112,213,214,120,126,247,192, 17,148,117,178, 44, 9,144, 31, 52, 89,158,100,141,237,186,205,
- 76,125,228, 14, 46, 94,178, 62,117,151, 34, 91,163, 68, 72,157,121, 73,122, 75, 21,177,200, 16,154, 28, 72, 83, 8,233,138, 86,
- 94, 20,246,186,228,123,150, 18, 62, 8, 28,207, 51, 30, 78, 6,199,126,198,237,221, 30,135,227, 9,243, 52, 97, 28,206, 24,135,
- 51,135, 50, 88,162,120, 77, 35,164, 32,235,136,153, 39,194, 93,206, 35,164,164,125,159,119, 51,197, 32,122,218,238,181,117, 5,
- 17, 2, 92, 16, 8,198,192,121,139,117,219,192, 5,154,202,204,179, 65, 93,213, 24,199, 9,235,174, 3,164, 68,215, 52, 16, 18,
-152,167, 25,211, 60,165,100,191,186,110,112, 56,245,152,250, 35, 11,179,104, 87, 39,101, 12,132, 40,196,144, 41, 51,158,172, 63,
-138,185,160, 82, 74,104, 85,167,236,113,207,157, 34,225, 60,201, 31,171,100, 20,203,132,229, 45, 45, 4,231, 29, 4,204,102, 78,
- 93,100, 42,208,184, 27,128, 40, 59, 4, 14,163,224, 29,119,180,202,196,109,154,148, 18,111, 63,190,161,142, 23, 30,109,211,162,
-169, 43,254,140,178,130, 94, 41, 77,184,214,170, 66, 35,128, 48,205,184,187,187, 67,183,219,162,110,168,195,223, 93, 95, 97,243,
-232, 17,246,231, 1,199,251, 7,184,105,196, 60,156, 49,205,180,218,154, 83,230,186,199,217, 10,204, 66,195, 75, 69, 29, 58, 31,
- 86, 74,201,148,170, 21,175, 3, 34,206,145,214,193,154, 9,158, 15, 84,203,126,103, 17, 99, 99, 67,150,253, 68, 53,124,198,105,
- 94,174, 5,113, 17, 31, 43, 82,241, 35, 37,137,189,170,170,198,122,187,195,213,205, 91,248,123,127,244, 7,248,225,103,223,199,
-110,179, 65, 97,178, 37, 54,184,200,170,235, 50,228, 36, 79, 26,145, 38, 34,212,161,134, 5,219, 60,250,215, 75,251,154, 44,162,
- 11, 83,159,196,191, 46, 8,113, 17,146, 16,138, 62,120, 17,102,128,217, 24,188,122,253,128, 87,183,183,152,102, 3,169, 20,250,
-254, 72,103, 17, 79, 98, 34, 18, 53,157,210, 50, 98,114,217,177, 35, 99,188,110,158, 52,168, 84, 20, 41, 72,169, 23, 19,134,232,
-175, 46,223,167, 36,224, 92,164,140, 21,192, 43,145,197,208,137, 91, 30,153,234,177, 96, 73,130,185, 34,183, 62, 93,239,133, 42,
-157,215,136,101,202, 91,186,252,132, 34,199,145, 38,187,177,115, 38, 57, 82, 82, 6,121, 26, 76,101, 8, 78, 82,185, 43,149, 47,
-244, 80,138,119, 25,230, 85,186,183,248,217,145,172, 1,209, 85,149, 16,198,109, 83,147, 16, 81, 80,211, 96,109, 88, 20,150,155,
-245,138, 61,252,101,115,196, 98,215,248,108,150,118, 49, 20, 46,160, 18, 37, 18,178,131, 38, 97,137,197, 82, 0,186, 84,199, 47,
-229, 77,122,193,159, 15, 89, 20, 81,130, 71,124,196,113, 94,144,145,131,231, 69,189, 15, 9,237, 24,187,188,105, 24,208,104,129,
-182,166, 24, 84,165, 20, 42,169,160,116,139,255,229,127,255, 63, 49,155, 25,155,245, 26,175, 94,191,194,122,179, 65, 83, 55, 56,
-246, 61,118,219,109,206,183,149, 18,206, 59, 40, 37,113,115,189,131,170,106,172, 58,170,240, 15, 71,207,123, 50,129,113, 2,180,
- 86,176,231, 35,180,214,248,236, 7,159,225,254,112,196,253,221, 29,110, 5, 30,173,250, 0, 0, 32, 0, 73, 68, 65, 84,247,123,
- 42, 2,198,145,194, 69,248, 13,180,179,197, 56, 31,240,176, 63,162,123,249, 10,187,205, 26,215,215, 87,184,190,190,198,110,183,
-195,213,110,135, 77,215, 81,167, 45,233,210,117, 51,141,193,134,105,194,254,176,199,121, 32,139,212,203,151, 47,113, 56,156, 48,
- 91,218,253,121,235, 48,141, 35,198,186, 66,165, 43,178, 69, 84, 26, 74, 72,172,214, 43,172,226, 33,136, 0,233, 61,140,159, 24,
-128, 67,192,135,113, 28,240,205,139, 23,120,251,201, 21,137, 92, 22,126,115,145,190, 44, 34,249, 67,115, 32,134, 8, 36,214, 74,
-141, 78,170,226,243,131, 21, 21,222,203, 54, 49,243,155,115, 94, 57, 61,172,198,121,236,207, 22, 82,181,100, 23, 99, 90,211, 60,
- 79,112,214,160,169, 91, 16,110,155,190,124,206, 26, 12,134,224, 46, 82,107,130,166, 12,228, 0,112,102, 38,229,178, 55,232,167,
- 51,228,106, 5,231, 3, 84,240, 88,213, 26,149,148,148,138, 20, 2, 42, 17, 96,121,136,105, 45, 77, 69,102, 99,208,116,148,138,
-182, 94,173, 1, 1, 84, 85,131,190,239,161,224, 49, 50,197,236, 60,140, 88, 55, 13,132,148,120, 61,244,232,218, 6, 54, 8, 40,
- 4, 24, 55, 39,181,181, 72, 41,100, 5,244, 37, 18,175,248,161,162,100, 50, 5,193,162, 52,199,193, 16,177, 59,147, 82, 37, 54,
-120, 28,181, 34, 81, 78, 29, 52,128,245,122,131,113, 60, 83, 33, 38, 37, 84, 82,246, 22,153,200,177,235, 96,145,156, 20,114, 81,
- 32, 68,161, 80,165, 21,154,166,133,247, 30,227, 52, 98,158,105,165, 68,246, 75, 69, 93,102,252,189,206, 66, 9, 34,221, 93,173,
- 59, 28, 15,123,188,126,254, 28,186,170, 32,229, 26,109,211, 65, 74,133, 71,239,188,131,251,170,198,171,151,255, 63, 93,111,246,
- 99,201,117,165,251,125,107, 15, 17,113,134, 28,170,138, 67,145, 18, 53,180,122,144,219,246,237, 6,218, 54,112, 1, 3, 54, 12,
- 24,126, 50,252,167,250,193, 79,247,197,126,243,128,107,224, 14,125,123,146, 68, 81,108, 82, 36,107,204,204, 51, 69,196, 30,253,
-176,214, 30, 78,177, 45, 64, 80,145,170,170,204, 60,231,196,222,107,248,190,223,247, 6,199, 72,240,151,136, 57, 19,124,100,193,
- 98,206,169,250,178, 89, 76,103,235,207, 23,188,151, 53,138,171,105, 89,189, 55,185,140,178, 21, 81,205,199,174,118, 40,106, 67,
-222,194,199,174, 29, 52,125,232,206,104, 93,185,210,170,174,163,148,140,101,183,251, 61,118,251, 59,252,205, 95,255,231,184,185,
-217, 9,107,162, 51, 86, 21, 43, 37,174,187,195,242,126, 50,213, 88,113, 8, 21,116, 85,183,151,157,178, 18, 49, 21,199,141,246,
-217,214, 36,221, 62,201,159, 45,214,173,244,163, 3,183,156,172,148,203, 51,219,167,242, 9,103, 33, 68, 28, 14, 7,156,207, 23,
-158,128, 16, 91, 96,139, 91,168,208,199, 74,167,166,229,236,229, 96, 31,170, 66, 72, 22, 86,241,247, 25, 99, 89,221, 48,148, 43,
- 37, 22,188,113,136, 84,224,175, 97, 56,145, 45,132,200,177,190,233, 74,156, 35, 89,245,101,103, 95,162,102,219, 37,207,224, 45,
-117, 21,197,172, 74, 76,172, 36, 11,150, 2, 90,149,117, 94,151,131,192,212,180, 54,245, 80,153, 96,138,192, 82,196,109,172, 66,
-151, 59,136,218, 52,132,131,199,218,152,177, 92,232,168, 29,122,172, 69, 80, 15,191,105,141,172,170,194, 58, 8,183, 68,107, 83,
-215,178, 23,202, 88,221, 22,214,112, 4,173, 81, 10, 25, 65, 16,175,220,144,156,231, 5,131,221, 95,143,243,169, 41,251,219,120,
-191, 57,107,168, 59, 43,174,218,237, 62,202,182, 20, 71, 53, 70, 35,255,136, 37, 86,197,117, 68, 12,159, 33, 78, 44,104,203,246,
- 98, 72,207, 84, 89,189,200, 73,108, 2,168, 7, 79,139,164,164,122, 97,146,216, 25,172, 97,209,131, 86, 10,171,119, 80,148, 96,
-135, 1,255,235,191,249,223,101,143,157,240,201, 71,207,240,226,163,143, 25, 48,113, 57, 3, 25,216,110, 88, 44, 23,252, 10,163,
- 9,219,105,135,148, 57,122,209,104,133, 32, 2, 10, 99, 24,127,184,186,136,156, 34,134,193, 2, 52,240,161, 50, 31,177,179,132,
-151,127,241, 23,120,122,122,194,251,199, 7,204,199, 3,150,121,150,248, 71, 9,231, 72, 25,107, 72, 88,194,138,167,203,138,247,
- 79, 39, 76,223,254, 17,119,247,119,120,118,127,143,251,187, 59,108, 55, 27,140,227, 40, 59,110,254, 51,167,227,145, 31,186,203,
- 5, 15, 15,143,120,122, 58,212, 4,172, 40,209,164,110,117,152, 47,140,165, 52,214,192,104, 22, 4, 58,231,240,108, 63,225,245,
-197, 35,122, 15, 61,136, 29,164, 88,159,132, 80,118, 58, 30,240,183,127,255, 91,252,250,207,126,133,105, 50,173,194, 45, 85,101,
-110,190,116,174, 82,169, 62,232,137,154,130,146,115,210, 91, 64, 12,169,206, 7,170,168,134,236,148,245,138, 15, 25,139, 75, 88,
- 86,143,224, 60, 95,166,222, 49,173, 74,246,110, 0,193, 12, 27, 56,233,136,151,249, 2,163, 53,188, 99, 68,111, 74, 25,222,243,
-207,145,214,153,225, 18, 57,241, 5, 31, 29,214,224,160, 8,216, 14, 22, 57, 71,108,164,248,241,222, 35,100,135,144, 56,216,103,
- 28, 12, 98, 96,148,165,210, 6, 27,197,184, 96,141,140,152, 3, 38,210, 56, 62,157,241,252,217, 45,226,122,193,227,249,130, 20,
- 35,166,205,196,222,228, 97,192,249,124,230,116, 63,137, 95,228,245,128,230,241,244, 48,176,213, 75, 70,110,101, 21,149, 98,100,
-171,148,148,175,144, 41, 74,136,145, 45,100,114,144,147, 92, 82, 90,107,132,130,139, 44, 15,172, 28, 92, 41,177,117,113,179,217,
- 97,187,217,225,116, 62, 66, 27, 11, 50,109,172, 86, 96, 25,232,186, 71, 18,133, 47, 1, 28,176,145,139, 54, 66,225,254,246,182,
-190,135, 46,102,204,203,138,113, 28,185,163,209, 60, 51,206, 41,212,201, 10,139,197,248,215, 27,107,241,234,225, 1,203,199, 31,
- 97,183,219,227,237,195, 35,190,127,245, 26,135,211,204,147,149,113,135, 39,159, 0, 63, 87, 93, 70,193,213,150, 67, 52, 70,143,
-176, 6,185,196, 99,205,117, 78, 31,248,163,169,235, 38,140, 82,176,198, 32,136,138, 59, 86,139,151,134, 46,215,110, 37,102, 81,
-149,241,124,216,241,168, 26, 85, 90, 40, 98, 6,155,205, 14, 55,119,207,240,223,252,205,191,194,205,205,174,162, 93,203, 40, 53,
- 95,169, 71,178,192, 62,168,249,196,235,255,223,186,174, 62,215,190,236, 21, 83, 70,181, 19, 41,177,195,181,177,123,187,221,146,
- 92,206,117,231, 42,174,146,156,186,113, 54,117, 76,112,180,245, 91, 74, 9,214,104, 28,143, 39, 78,187,203, 17,148, 88, 24,124,
- 57,159, 42,170, 22,148,161,229,181,110,184,107,153,174, 81, 11, 51,178,138, 4,205, 74, 0,233, 26,164,147, 41, 65, 81, 2, 83,
-242, 25, 38,163, 53, 71,196,106,177,174, 21,209, 91,249,158, 99,138,252,122,232, 12, 31,217, 54,151, 11, 21,183,144,227,114,251,
-252,103, 17,210,165,220,166, 18, 33,242,157, 0, 9,175,169,235,189,220,210,222, 42,196, 70,181, 80, 25, 23, 28, 82, 10,117, 60,
- 93,113,238,164, 58, 56, 15,143,186,181, 86,124,161,107,133, 36,207, 45, 85, 76,117, 79, 61,165, 22, 97, 44, 46, 7,102,199, 91,
-104,109,228,231,229,215,195, 5, 14, 21,219,200, 52,138,117, 36, 93,222, 20, 50,188, 15, 53, 80,169,153,236,203,123,219,166, 10,
- 72,226, 41,163,124,141,247,166, 62,150, 92,137,116,170,239,206, 69,128, 74, 29,105, 51,117, 89, 9,130,208, 54,185,132,114,128,
-170,176, 1,181, 83, 43,213,173, 84,124, 37,153,168, 41, 36, 4,235, 87,184,200,169,250,188, 83,230, 15,142,214,154,119,209, 57,
-227,255,254,119,127, 43, 59, 8,254, 33, 95,126,246, 25,206,231, 51, 0,130, 53,140,119, 93,215, 21,195, 48, 86,124, 95, 20, 66,
-152,115, 14,227, 56, 96,178, 10,167,115,100,225, 82, 8,128, 38,100,107,160, 60,143,246, 72, 17,130,143, 0, 41,204,135,247,176,
- 68,152, 20, 48,222,220, 64,191,120,129,219,103,207, 57,204,194, 88,156, 47, 39,252,230,239,254, 78, 64, 27, 25, 30,132,213, 5,
-188,255,225, 45, 94,189,121,143,251,253, 22,207,238,239,176,223,239, 57,202,144,120,164, 60, 11, 11,254,116, 62,227,114,186,192,
- 5,134,248,199,106, 35,227,106,123, 93, 87,152,121,230, 11, 70,232, 89,199,211,153, 43, 97, 82, 76, 53, 3, 96,172,229, 88, 64,
-197,202, 76,182,204, 56,156, 78, 79,248,242,235,111,241,249,203, 79,241,252,126,123, 29, 4,210,143,121,149,146, 41, 75,110,208,
- 26,137,189,189,202,175,167, 70,183, 42, 12,235,101,141, 32, 61,225,112, 60, 54,155,162,240,235,249, 96, 48,240,209,129, 72, 99,
- 89, 47,149,167, 28, 79, 71,220,220,222, 99, 93, 3,144, 34,134,253, 29, 82,206, 88,215, 25,110, 93, 1, 0,155,205,158, 47,122,
- 99,129,232, 17, 29,139,222,180, 2, 6, 81, 33,243,104, 35,194, 45, 92, 77,147,214,152, 44, 59, 25,144, 18,118,155, 9,218, 24,
- 81,205,203,207,166,216,158,114, 88, 22, 40, 67,248,246,245,107,172, 51,143,139,111,182, 91, 92, 46, 11,175,124,230, 11,230,121,
-198,164, 9, 48,150,227, 23,137, 47, 20, 35,221,245, 48,109,170,218, 62, 11,218,179, 8,178, 32,151,182, 17, 5,117,202,108, 33,
- 43, 83, 21, 37,159,123,170,151, 89, 20,203, 90,172,197, 83,150,130, 56,229,132,205,102,139,144,248,153, 48,195,192, 93,107,125,
-248, 91, 72, 6,132,205,205, 99,123, 84,222, 60, 36,150,116,156,182, 88, 61, 95,166, 33, 19, 14,243,130,172, 20,235, 85,140,174,
- 74,102,239, 89, 60, 26, 98,194,188, 58, 44,171,195, 18, 13, 48,221,224,159,190,250, 22,233,203,127, 6,122, 37,190, 42,177, 75,
-221, 76,174,168,173, 99,188,206,153,151, 75, 42,229,235,209, 96, 47, 22, 43, 63,154,149,157,102,146,162, 48,229,107, 52, 17,170,
-205, 42,137,165,178,223,223, 82, 27,201, 82, 91, 77, 40,165, 48, 14, 19,110,238,158,225, 87,191,250, 37,126,253,103,191,148,194,
-162,133, 18, 55,170, 24, 90, 58, 18,181, 53,100,150,116, 46,234,216,229,232, 46,154, 98,238,164, 78,217,221, 51,223, 41,247,250,
- 20,121,190,114,139, 99,213,130,232, 77, 29,150, 57,151, 51,242,202,165,146,107,192, 71, 97,249,179, 86,130,133,161,186,142,213,
- 9, 65,138, 31,254,236,100,144,204,124,116,101,175,243, 63,199,148, 97,197, 85,164,192, 98, 79, 34, 45, 20,179,162,141,225,117,
- 23,233, 6, 78, 74,242,191, 33, 38,228,172, 42,173, 18,200,208,137,106,183,171, 84,170,162,177,156,218,247, 95, 47,233, 30,152,
- 82,113,177, 37,229, 49,129, 34, 42, 38, 88, 93, 53,147,141,192,166,181, 97,120,146,231, 51,167,104,121,138,109,185, 35, 11, 84,
- 53,184,146,145, 57,137, 15, 61, 20,239, 58,202,215,161,238,227, 80,210, 29,175,201,116,236, 16,240,149,203, 78, 90, 35,196,132,
-197,121,248,216, 96, 82,197,174, 91,238,212,162, 21,225, 34, 79,181,128,172,156,229,220, 85,245, 51,147,145, 68, 47, 32,223,191,
- 82, 93, 65, 75,221,231,144,186, 56,237,242,223,246,123,107,196,117,197,186, 39,152,194, 17, 71,134,216, 7,168,237,250,115,225,
-143, 83,231,142, 34,224,106,228,148,160,116,190,178,102,248, 16,129,228, 48,140, 86,242,169, 19, 52, 41,188,121,120,172,163,185,
- 24, 35,246,187,189, 28, 16, 28, 54,112,153,103,140,214,226,235,175,191,194, 79, 62,123,137,113,179,193, 55,223,125,143, 95,253,
-242,231,184, 60,189,199,160, 21,188,243, 24,140, 70, 34,130, 37, 13,231, 51,220,202,135, 50, 25, 11, 74, 9, 17, 1,211, 96,164,
- 99, 73,248,248,217, 13, 78,231, 25,218,104,204, 79,111, 49, 78, 27,104,165,240,238,205, 59,152, 97,192,254,230, 22,231,195, 35,
- 11,142, 50, 16, 98,198,147,247,184,132, 19, 94, 61,157,240,108, 55, 97, 55, 13,156, 38, 23, 3,251,154,189,135, 11, 81, 96, 12,
-221, 94,137,138,184,135,253,163,110, 93,177, 88, 83, 8,173, 56, 30,143, 88,214, 21, 80,147,116,102,162, 96, 37,226, 17,106,150,
-113,149,188,198,199,167, 7,124, 19, 35,150,245, 35,252,228,229,179,186,251,174, 19, 19,100,137, 77,149,195, 42,169, 86, 21,118,
- 98, 37, 31, 18,230,149, 97, 56,222, 59, 1, 77, 56, 40,100, 44,243, 3,214,117, 17,184, 11,143,234, 66,136, 98,215, 72,216,108,
-118, 88,215,153, 11,173,156, 1,173, 49, 88,194,233,240, 0, 31, 2,166,205, 14,143,143,111, 97,148,194, 44, 93,123,244, 43, 78,
-193,139, 69,109,173,186,140,232, 29,180, 53, 18, 24,196,135,252,146, 88,232,181,153, 6, 12, 86, 99, 51,141, 24,140, 97,145, 34,
-145, 16,224, 50,204, 96,225,115,192,168, 13,140, 53,120, 56, 60, 33, 58,135,219, 91,182, 57,206,115,230,159, 35, 38, 92,102,246,
- 59, 95, 46, 23,182,247,248,200,221, 89,134, 4, 9,161,230, 67, 27,195,190,107, 62,136, 45, 31,222, 82,172,242,237, 92,158,145,
-212, 4, 63, 29,189,167, 4,241, 24, 98,142,117,161,199,149, 8, 73,238,198, 3,148,144,169,202,235, 16, 59, 10, 20, 9,158,148,
- 58,250, 92, 19, 61,118,104,102, 99,112,154, 93, 23,209,155, 49,123,135,183,199,165,142,188,219,165,155,174,240,156,212, 41,146,
-123, 27, 43,201, 33,145,197,231, 94,198,224, 33,166, 54,186,206,168, 52,179, 70,147,164,106, 33,204,245, 50,197,149,111,158,187,
- 38, 45,233,117,241, 10,108,213, 2,131,114,253,188, 83,110,223,211,191,204, 66, 96, 87,192,118,123,131,219,251,231,248, 31,254,
-187,127,205,233, 95, 41, 95, 9, 63, 27,165,172, 83,240, 82,141, 33,170, 25, 6, 36, 98,218,246,245,114,195, 36,215,248,225,214,
-133,151, 14,173,183, 36,230,222,149, 46, 41,127,156, 59, 79,245,162,227,207, 91, 39, 25,239,100,221,249,122, 11,134,148, 18,134,
- 97,192,114, 57,193,167,136,113,212,128, 34,124,246,252, 14, 95,125,255,154,215,135, 49, 97, 99,181, 40,221,249,243,161,169,134,
-155,215,247,133,228,245, 82, 69,123,132,146,165, 30, 1, 5, 40,101,186, 46, 31, 53, 56,164, 8,225,116, 21, 18,102, 40,205,197,
-110, 2, 65,103,134,213,248, 24,185,136, 16,157, 65,136, 77,141,223,219, 48,137, 8,186, 36,195,161, 89,188, 84,135,153, 69, 42,
-204, 7, 22,196, 1, 64, 10,174, 2, 98, 10, 47,160, 16,236,114, 23, 97,193,166, 32,195,103,203, 21, 88,166, 88,178,169,173, 58,
-164,131, 86,181, 97,215,194,203,176, 50,137,138, 87,174,130, 98, 33,244,129,133,192, 45, 70, 54,247, 6, 32,153,110,160, 78,252,
- 42,171,163, 7, 77,169,220,246,232,170, 11,151, 41, 57,166,189,115,184, 91,191, 85,228,109,129, 84,149, 63, 65,185, 22,147,164,
- 24,165,107,202, 3,152,170,112, 35,225, 3,194,200,213, 18,191, 48,170,235,231, 82,212,195,189,224,106, 89, 28,159,253, 18,228,
- 48,141, 35,126,247,213,215,181,210,103, 95,167,174, 60,113, 78,110, 91, 96,140,198,227,211, 19, 62,126,241, 28, 95,253,225, 15,
-120,253,230, 45, 98,240,248,135,223,124,137,237,104,241,124, 63,113, 21,166,100,236, 0,206, 30, 30, 70, 43, 66,164, 8,109, 13,
-110,140,150,145,173, 66, 36,192, 42, 96, 51,106,144, 2,140, 29, 57, 69, 45, 6,220,236,183,248,236,229,199,184,156,207,184,187,
-217, 0,164,241,199,111,191,225,253, 75, 17,190, 32,227,225,178,226,245,105, 65,202, 9, 35, 17, 38,211,248,198, 17, 60,202,139,
-200, 72, 84, 14,204, 22, 3,234, 3,227, 46, 67, 76,240,206, 99,190, 92,216, 9, 48,136,215,213,112,225,147,101, 12,155, 50,143,
-154, 97, 24, 59,184, 44, 23, 24, 59,224,187,239,190,131,243, 1,127,246,139,151,117, 4,151,209,217, 32,228,221,243, 57, 97,117,
- 25,206, 69, 40,109,225,165,179, 30,172, 69,240,161, 93, 22,158,133,106,222, 47, 32,197,135,228,233,124, 96,132,111,228, 73,135,
- 95, 28,140,182, 56, 30, 30, 48,109,118,184,156,143,210,225, 68,144,182,204,137,246, 14,171, 82, 8,206,225, 18, 28,166,113,132,
-115, 43,198, 97,224, 74, 25, 9,154, 52, 66,244,114,145, 75, 10, 92,202,200,137,224,157,231,142,189,136,215, 36, 71,155, 58, 37,
-234, 96,249,224,113, 33, 84, 75,215,114,185, 96,171, 21, 22, 5, 44,231, 51, 82,206,216,109, 71,204,235, 10,138,185, 6,196,120,
-239,224, 49, 98,178,132,203,234,175, 16,159, 70, 70,242, 0,152, 60, 86, 68, 91,137,119,210, 37,229,172,144,199, 82, 74, 87, 32,
-100, 18,117, 20,131, 49, 10,122, 55,243,148,161,118, 16, 16,241,211,138, 73,111, 57,106,180, 83,128,247, 49,144,189,165, 39, 41,
- 35, 2,159, 98,217,202, 87,166,195,156,175,127,221,239,175,211,149, 15,190,227,100,203,216,153,114,139, 95,226, 9, 94,232,188,
-243,130, 14, 77, 93, 66, 88,119,201, 93,225, 60,235,212, 14,117, 63, 93,200, 92, 90, 56,235, 74,166,109,174,168,131,129,171, 93,
-104,233,120,116, 23,144, 82,156, 3,229,115,174,138,239, 88, 1,198, 88,220,222, 62,195,167, 47, 63,195,127,251,175,255,166, 78,
- 88,122,241, 97,238, 66, 60,174,175, 92, 92, 89,128,218,132, 65,254, 84,231,253,189,146, 38, 75,247, 77,164,218,217, 72, 29, 6,
- 22,173, 64,172, 2, 74,148, 51, 10, 87,182,165,156,175,180,215, 87, 59,105,116,214,186,105, 26,241, 4,198, 28,171, 76,140, 1,
-206, 6,155,193,226, 60, 47,162, 93, 80, 48,164, 96, 12,137,175,185,124,118,155, 5,175,228,203, 23,235,101, 22, 36,178, 66,230,
-243,185,172, 31,228,125, 83, 96,245,125, 25,229, 23, 7,134, 86,252,124,166,146,140, 87,136,135,129,139, 30,157, 18, 39,156,133,
- 32, 23,251, 53, 78,188,237,151, 85,247,217,165,182,111, 38,130,214,128,210,182,130,136,130, 64,101,170, 13, 56,179, 40, 91,137,
- 77, 49, 21, 97, 42, 21,176,140,105,164,184, 20,240, 35,242, 59,201,228, 50, 55,170,163, 34, 30,213,107,163,197, 38, 25,164,184,
-238, 0, 96, 89,112,203,213, 54,221, 69,210,254, 11,154, 36,170,106,247,252, 65,136,244, 7,129, 41,212,220,226,160,174,192,255,
-192,161,148,127, 76, 30,235,180, 79,234, 10,113, 76, 4,190,212,137,186,113,215,143,150,246,197,162,158,155,220, 94, 58, 67, 18,
- 81, 80, 75,110,227,111,150,129, 44, 12,154,152,166, 9, 74, 41,252,230,235,111, 25, 18, 35,149,227,102, 51, 74,229,206, 54, 46,
- 99, 12,156,243,248,225,135,239,216,178,180,191,133,126,247,128,197,179,192,109, 89, 86, 24, 69,216, 13, 30, 94, 20,193,209, 7,
-104, 99, 97,245, 0,163,128,172,152, 16, 22, 66,132,210, 60, 81,176,214,212, 46,222,106,194,152, 51,212, 56, 96,118, 1, 63,255,
-229,159, 96,180,204,178, 94,150, 21,243, 60,227,227,251, 27,204,235,130,121, 94,176,174, 43, 14, 79, 7, 44,206, 33, 58,143, 16,
-128, 99, 76,120,183,178, 40,105, 99, 53, 76, 61, 84, 27,253,173, 52,121, 49,201,212, 98, 89,129,101,197,234, 28, 98, 72,240,162,
-138, 13,129, 59,216, 97,156, 56,128, 34, 37,196,228,161,212,202,145,160, 54, 35,103, 11,239, 86, 40,173,241,234,213,119,152,231,
- 25,127,241,171, 47, 36, 97, 9,136, 73, 97,153, 47,216,223,222, 66, 17,241,158, 51, 6, 22, 76, 37,135,236, 87, 88, 99,240,244,
-240, 14,214, 90,248,156,106,232, 3, 43,238, 57,185,172,200, 31,125,136,176,227,132,243,229, 2, 2,231, 79,231,156, 49, 95, 78,
-136,193, 67, 27,195,213,118,152,161,205,192,169,120,193, 99, 94,102,220,222,222,195,175, 23,164, 24, 48, 47, 81, 98, 46,117,183,
- 43, 22,177,142, 28,222,171,227,238,216, 42,141,105,156,176,177, 26,183, 55,183,152,215, 21,119,119,207,241,250,205, 27, 28, 47,
- 11,238,111,118,120,255,248,136,195,249,132, 95,252,244,167, 56,207, 23, 24,165,240,116, 60, 0, 49,194, 14, 35,239,181, 67,196,
-225,112,130,182,236, 85,215, 34,196, 25,117, 81,131, 91, 88, 3,164, 44, 12,108,177,219, 41,173, 1,101,177,204,172, 48, 46,190,
-107,136,159, 58, 19,147,166,234, 30, 75, 14,180,146,134, 86, 46,184,152,178,104, 61, 82,189, 52,148,232, 78,202,234,166,122,183,
- 5,144, 18, 59,107, 82,111,213, 2, 82,243, 14,199,112,149,183, 92, 44, 85,229, 32, 70,199,225, 14,194,201, 47,185,216,220,213,
- 69,217,239, 11,113,174, 99,137,167,170, 50,111,223, 79,211,109,168,166, 16,175, 73,100,169,170,117,127, 84,236,131,167, 21, 37,
- 92, 38,167,140, 53,186,238,146, 45, 25,209, 16,184,143,130, 53, 28, 72, 19, 11, 39,162,254,156,170,122,219,155,144, 74, 97,156,
- 54,248,228,211,151,248,244,227, 23,248,253, 31,190,193, 96, 7,172,114,126, 40,217,219, 91,107, 56, 29, 78, 55, 34,159,234,192,
-215,232, 56,224,253, 72,254,199, 62, 79,105, 32, 11, 37,173, 67,249, 82, 45,227,168, 37,116, 9, 30,182,168,206,175, 59,241, 92,
-209,202, 92, 60,182,215, 36,167,235,240, 17,231, 89,169,205,169, 98,220,249, 91,226, 21,222,103,207,239,240,219,111,217, 35, 61,
-175, 14,163,157,174, 28, 49, 80,169,158,227, 74, 43, 22, 76,146,174, 59, 89,230,117,112, 5,160,101,207,206,227, 97,158, 10,149,
-228,191,178,118,209,146,131, 81,215, 32,166,209,215,116,230,253, 56,167,198,165,166,244,246,190, 78,157,250, 2,139,241,205,114,
-153,130,174, 82, 33,181, 98, 16, 23, 41,233,150,187,216,212,214,245, 87,186,180, 76, 88,120, 31,174,100,157,170, 32,147,212, 20,
- 27, 81,187, 47,192,106,119,222,113,227,141,145, 66,155,249, 21,233, 42, 77,174, 21, 4,101,210,228, 67,132, 53,166,138, 8,233,
-106,130,196,175,183,234,196,160, 53, 71,133,154, 8,185,184, 89,250, 30,253, 71, 23, 58, 21,157, 90, 49, 37, 53, 92,123,157,167,
-231, 70,205,235, 9,125,166, 88, 18, 84,247, 5, 82,157, 48,229, 15,106,141,114,124, 41,168,156,144,148, 98,229,123,142, 29,207,
- 26, 88,151,149, 45, 0,195,128,121, 89, 48, 89, 43, 85,132, 2,233, 12,149, 21,126,254,179,159, 99, 93, 22,108,119, 91,156, 78,
- 30, 70, 27,108, 54, 19, 62,123,249, 57,230,213, 97, 5,224,220, 10,173, 53,230,117, 69,202, 9,175, 31, 18,238,118, 27,108, 55,
- 27, 44,206, 75,133, 24,144,117, 68,212, 10,214, 14,146, 85, 46, 85,101,206, 88,125,194, 52,104,140,211,200,130, 7,239, 48,104,
- 13, 51,106,252,244,139,159,129, 50,123, 57,163, 40,186,189, 99,208,205,186, 58,172,235,140,101, 93,177, 44, 11,220,178, 98,241,
- 14,222,121, 92,150, 21, 79,167, 51,158, 46, 51, 92, 74,152,221,130, 81, 20,242, 60, 30,146,117, 70, 74, 18, 92,147,170,175, 84,
-105, 38,163, 13,145,133, 76,164, 20,211,232, 68,241,159,137,125,193, 41, 70, 25,137, 71,228, 19, 56, 84, 99, 24,241,254,221, 43,
-252,219,167, 71,252,171, 63,255, 19, 28, 47,174, 86,181,201,205, 88,150, 11,119,189, 68, 56, 94, 14,216,232, 8,239, 35, 46, 33,
- 96,180,134, 47,252,172,145,194, 10, 23,121,183, 22, 83, 68,202, 10, 33,122,193,214, 70,132,153, 57,234,243, 60,195, 88, 46, 42,
- 82, 78,176, 90, 33,196,150,244,118, 62,241, 58, 37,132, 0, 59, 76,240,110,198,229,124, 98, 97,150, 80,215, 84,240,128,214, 53,
- 73, 13,178, 91, 50, 10,176, 90,215, 8,209,209,106, 28, 47, 51, 39,176,109,183, 56, 60, 61, 49, 13,142, 50,110,246,123, 60, 61,
-188,199,221,118, 39,150,195,136,115, 88,112,184, 44, 60, 91,154, 23,236,183, 91,209, 42, 16, 82,140,162,201, 0,236,200, 69,157,
- 79,132,209, 14, 8,110,129,177,166, 93,130, 57, 66,197, 92,227,118,181,101, 2,154,214,108, 41, 43,197,170, 66, 63,185,107, 15,
-105, 21, 2,101,192,104, 37,234,119,201, 39, 87,132, 32, 42, 99, 45,123, 58, 18,120,200,102,195,130,174,224, 22, 81, 95,183,110,
-139, 68, 8, 69, 36, 89,217,194,254,134,168,116,139, 23, 62,197,212,173, 2, 8,171, 76, 50,234,255, 47, 33, 30, 5,155,154, 36,
-169, 43,119,157, 62, 73,220,169,146, 17,107, 47, 38,202,104,180,181, 10,191,202,215, 23, 96, 57,144,181, 54,242, 53, 25,229,155,
-113,157,230, 88,116,228,170,116,240, 18, 52,226,131, 7,228, 48, 78, 50,242, 84, 74, 33, 33, 86,135, 77,137, 53,245,137, 83,228,
- 94,189,122,133, 87,175, 95,203,174,157,153,251, 90, 21, 16,144,146, 16, 23,141,113, 28, 25,208,179,221,224,230,102,135,221,118,
-131,113,180,205,134,148,233,218,210, 89,219,160,238, 44, 44, 65, 45,170,199, 53,231,102, 72,169, 19,146, 84, 65, 37, 53,143, 65,
-118,156,101,159, 95, 11,127,116, 65, 65,212,225, 34,101,218, 55, 47, 11,150,101,133, 82, 84,179,208, 67,240, 32, 16,172, 53,248,
-248,126,135, 87, 2,166,185, 44, 14,187,137, 99,164, 51,184,160,139, 49, 66,203,234,168,128, 90,114, 17,120,166,116,117,137,104,
-173, 56,240, 37,112,161, 91,178,217,189,104, 54, 82,206, 80,150, 29, 76, 49,103, 14, 37,146,113,175, 74,157, 5, 51, 43, 36,233,
-232, 81, 29, 5,173,225,227,103, 68, 93,193,108,218, 4, 73, 65,105, 11,107,173,240,236, 93,183, 58,234, 56,241,101,204,156, 59,
- 49,153, 86,173, 67,143,158,163,118,203,123,210, 45,162,235,222, 89, 92, 36, 90, 10, 1,146,231, 50, 9,215,132,186, 73, 76,134,
-170,147, 28,166,253,178, 19,168, 4, 16,149, 41, 67, 41,170, 10, 1, 82, 27,211,220,242,221, 5, 15, 42, 2,202,171,132,237,171,
-203,191,238, 20,114, 99,194, 36,180,181, 15,149, 63, 95, 45,199,244, 65, 52, 58, 96, 72,246,226,185,236, 9,122,127,122,191, 47,
- 74,185, 51,245, 39, 94,236,151, 15,119,237,232, 75,112, 0,170, 80, 36,167,136,255,235,223,255, 45, 64,138,233, 69, 18, 7,121,
-127,123, 7, 59, 12,120,120,120,143,219,155, 27,120,183,192,175, 17,251,155, 61, 30, 31, 31, 49,140, 35,158,125,244, 9,222,124,
-255, 93, 7,170, 80, 8, 49,193, 45,172,168,214,118,196,186,206,200,195,136,249,112, 96,116, 96, 78,200,164,160,149,198, 52,142,
- 80, 57,130,200,194,104,128,180, 97, 91,146, 2,126,250,147, 95,224,230,246, 14,154,248, 64,135, 28, 72, 41, 38,246, 82, 75,230,
-121, 8, 17,193, 57, 4, 65,125,134, 16, 69, 81,237,176,172, 43, 94,189,125,135,255,244,187,223, 99, 17,184,142, 34,130, 17,104,
- 69, 78,172,210,174, 35, 63, 99, 17,205, 0,138,171,164,173, 36,153,104, 20, 97,150, 88, 90,150,153,163,250, 36, 69,200,131,249,
-243,227, 56, 49, 61, 45, 94,240, 31,127,243, 59,252,197,207,127,134, 20, 46,176,102,128, 74, 14,214, 90,100, 1,163,104,176, 45,
-198, 88,203,163,241, 11,143,149, 24, 11,169,129, 28, 17,200,224,114,153,161,144, 16, 69, 4, 20, 98, 70,138, 11,231, 93,231, 8,
-183, 6,113, 10, 4, 16, 89,104,120,184,149,185,253,202, 12,128, 95, 97, 69,212,118, 56, 29,112,123,255, 12, 97,157,187, 36, 48,
- 45, 7,104,179,109,113,171, 38,187,125,165, 96, 40, 99, 48,132,155, 79, 94,224,124, 58,227,253,241,137,109,144, 68,120,253,248,
- 8,163, 53, 30, 78, 23, 40,173,241,195,251, 7,196, 24,113, 60,115, 58, 95, 72, 92, 61, 43,245, 84,167, 70, 57,103,140,150,167,
- 55,251,201, 66,155, 1, 20, 28, 92,140, 32, 33,107,241,131,167, 59, 26,111,102,241, 37,120,114,162, 72, 55, 27, 96,202, 24,182,
-183, 56, 47,223,179, 72,175, 2, 50, 84, 61,164,203, 65, 74, 74,186, 89,213, 82,240,250,157,241,110,119,139,253,237, 0,165, 53,
- 46,151, 19,150,101,150,231,152,119,210,177,184, 17, 20,175,103,120, 84,159,234, 37, 25, 83,148,213, 78,172,210, 91,163,217,238,
- 3, 48, 16,131,100,132, 90,196, 98, 33,116, 30,228,124,237,251, 46,188,249, 30,114,209, 60,201,162,213,232, 68,129,229,231,213,
-226, 3, 46,255,241,222,183,248, 72, 38,202,212, 85, 20,251,252,181, 76, 11, 50, 92,240, 53, 4, 71,139, 45,142, 47, 69,212,215,
-178, 37,248,101,201,191, 38,124,250,249, 47, 96,135,145,211,241,228,213, 45, 99,102,173, 13, 35, 50,181,173,118,167,101, 89,112,
- 20, 85,119, 33,127, 89, 99,177,221, 50, 29,108,179,153, 48,109, 38,104,165, 48, 12,124,169, 24,201, 34,168,249,221,210,173,246,
-145,165,125,128, 81,150,247,162,240, 3, 10,236,252,195,223,251, 33,231, 41, 21,134, 68,207,138, 23, 17,241,229, 60,179,158,164,
-116,182,162, 83,178,134, 11,167,219,221, 22,143,167, 51,150,213, 99, 94, 61,172, 82, 72, 70,193,104,110,154,216, 43,205,175,127,
- 22,193, 87, 34, 22,218, 53,158,133,136, 26,115,141, 0,226,172,128, 16, 16, 66,170,159, 25,136, 90,221,106, 17,230,137,168, 80,
-151,162, 82, 16,203,168, 99,106,254, 89, 67,160,142, 91, 80,112,169, 92,168,182,108,151, 12, 69, 70, 16,174,140,125,141,114,161,
- 55,122,129,172,125,160,234, 10,170, 8, 80,149,230, 21, 26,129, 47,244, 20, 99, 11,152, 98,245,217, 7,250, 13,118,149, 24, 99,
- 36, 14,155, 21,235, 73,222, 63,212,181, 66,157, 79,203,132,170,189,111, 33,114,218, 97,133,121,149,100,190, 92,166, 13, 90, 66,
-138,114, 21, 41,215, 66,176, 76,197, 20, 65,101,125,245,239,139,174,166,165,222,112,243,144, 68,151, 83,211,250,114,139,225,206,
-153, 58, 39, 5,106,112, 77,141, 27,107,220,234, 46,140,179, 23, 58,168,134,174, 77,189,118, 85,144,119,169, 27,227,167,196, 54,
-128,193, 90,120, 15, 60,205, 1,195,184, 97,200,140,115,136,126,197,110,183,131, 95,103,236,182, 91, 56,183,226,102,191,199,155,
-183,239, 16, 18, 63,208,239,222,190,197,110,191, 71,136, 17,227, 56,178, 82,156,120, 92,124, 10,252,224,196,101,133, 34,197, 93,
-181,243, 24,134, 12, 69,153,133, 79,137,171,202, 97,208,152,151, 5,119,183, 55, 60,234,181, 22, 46,120,252,228,179,151, 24, 44,
-243,128,149, 84,139, 53, 63, 29, 55,200, 49, 34,250, 21, 17,132, 36, 35,237,156,185, 0,112,206,113,226,151,243,184,191,185,193,
-237,102,194,223,253,238,247,120,245,116, 98,219, 20,128, 1,188,103,215, 50,114, 11,118,100,206,251,186,240,235,152, 98, 75, 75,
-206,133,233,156,228, 0, 39,134,117,100,142,118, 45, 89,220,164, 8,214,142,220,209,231,140,175,254,248, 61,126,254,249, 75,104,
-197, 24,210, 28, 29,160, 12,220,186,176,152,112,216,224,178,176,205, 43,197, 0, 23,185, 51, 50,102, 0, 0,204,203,133,125,151,
- 74,236,100,222, 65, 41,230,170,187,101, 22,126, 53,213, 11,207,173, 11,130, 36, 85,197,156,145,227,202,217,221, 68, 56,157,158,
-176,191,123,134,199,247,239,176, 25, 7, 30,177, 3,136,224,176,135,242, 73, 85, 41, 99,118, 43,211,226,172, 70, 86,132, 81,141,
-120,247,116,196,112, 89,112,186, 92,224, 3,107, 0,222, 61, 60,226,178, 58,188,121,255, 8, 34, 96,176,156,240, 53, 14, 3,246,
-219,109, 29,241,150,163,195,197,128, 16,184, 67, 94, 86, 7,191, 46, 32, 34,248,156,184, 19,200, 30,160, 1, 8, 14,154, 52,204,
-184,133,247, 43, 98, 74,178,123, 52,213, 9,145,145, 43, 86, 82, 41,194,254,230, 5, 94,191,123, 5, 13,238, 2,137,248,162, 34,
- 1,203,100,185,224,139, 46,149,169, 89,130, 7, 5, 19,215, 62,253,217,159,226, 87,191,254, 43,124,253,251,127, 68,142, 17,135,
-195, 3, 63, 43, 70, 66,125, 74,180, 45,181,207, 69,207,248,103, 1, 95, 27, 33,151,221, 95,185, 36,123,156,100, 25,209,131,174,
-115,253, 42,229,170, 67,158, 50, 36, 68, 60,177, 98, 99,165,254, 12,233, 32, 41,236,228, 80,146,104,197, 32,153,186, 30,164,182,
- 35, 86,132,122,145,243,133,145,224, 66,148,213,133,170,249,221,101,239, 90, 84,209,229,139, 38,234,108,113, 74, 97,123,115, 15,
- 45,133, 80, 29,197, 42,141, 24,115, 5,158, 80, 7,177,209, 68,236,191, 86,154,139,118,197, 23,117, 10, 60,129, 3,169, 86,112,
- 10,146,215,104,141, 97,176, 24,172,197, 56,141,221,255, 26, 12,195, 0,107,116, 75,205, 43,232,110,249,158, 73, 20,241,169, 19,
- 98, 85,241,112,239, 86, 41,239, 95,234,160, 93, 41, 85,255,118, 8, 65,252,233, 76, 41, 51, 36,226,196,148, 16, 37,195,222,104,
-133,143,238,110,241,237,171,183,200, 57,227,180,172,216,142, 22, 49, 41,232,168, 48, 14,131,136,244,216, 78, 9, 81,184,147,116,
-168, 5, 87,220, 59, 1, 82, 98, 77,146, 11,178, 6, 73,237, 53, 13, 41,179,107, 3, 84, 11, 60, 30,203, 43, 80, 23,247, 90,138,
- 28, 77, 4,167, 88,224, 90, 20,235, 37, 19,128,100,202, 87, 71,248, 70,226, 94, 99, 96,238,188, 32, 92,123,221,199,191, 20, 34,
- 94, 38, 52, 4,133, 40, 66,219, 92,248, 28,229,106,170,141,108, 75, 82, 44,227,246,148,120, 58,219,231,152, 87,130,100,241,178,
-103,213,222,191, 18,193,144, 50,162,128,127, 74,248,149,214,188, 14, 86,134, 95,219,171,140, 57,209,167, 20,251, 99, 3,250,116,
- 51,240,122,153,231,106, 83, 79,226, 78, 66,167,245,160, 78,253,142, 30, 18, 87,158,213, 18,174, 83, 21,156,169, 64, 31, 80,255,
- 34,244, 98,128,174, 42,104, 26, 0, 25, 95,201,155, 75,242,197,198,209, 34,172, 30, 33, 69,188,125,255, 30,151, 35,167, 14, 21,
- 18, 87,148, 74,108, 24, 6, 16, 1,203,204,251,219,209,104, 44,222,215,124,227,113, 28,241,211, 47,126,138, 63,252,225,107, 40,
- 69,204,134,183, 28,163,248,209,253, 61, 82, 88, 16, 51, 71, 15,238,119, 27, 56, 31,177,174, 14,187, 45, 48,142, 76,167,123,247,
-120,128, 85, 92,145,221,223,221,113,245,171, 52,127,240, 99, 4, 52,131, 52,202, 72,144,233,249, 50,122, 10, 19, 82, 78,114, 17,
-103,228,152, 16,188,195, 96, 12,140, 34, 56,249, 59,206,251, 29, 62,187,191, 69,112, 14,143,142,253,234, 62,183, 28,244,164, 8,
- 8, 30, 90,172, 74, 40,158, 78, 81, 40, 27, 99,176,134,165, 22, 80,193,175,108, 3, 75,177,210,170,188,247, 80,202, 97, 48, 22,
-198, 24,248,224,145,130,195, 63,126,249, 21,254,234,207,127,129,135,199, 71,108, 54, 19,172, 85, 88, 66,146, 92,236, 21,155,113,
-226, 21,136, 86,192,234,132, 43, 0,134,192, 24,141,152, 19, 46,167,115, 77, 72, 35, 75, 8, 98, 33, 9,222,179,239, 60,103,132,
-101, 70,140, 30,118, 24,225,221, 2,109, 44, 98,138,172,248, 6, 48, 78, 27, 60,189,127,131,205,118,207, 58, 9,241, 94, 91,201,
-168,103, 50, 31,175, 25,140,102, 97,212,193,241,133,252, 72,151,202,166, 54,154, 39, 44, 70, 41, 60,191,191,197,167,118,148,140,
-231,124,133,193, 76,162, 50, 46,249,246,107, 8, 48, 94,193, 26, 96,245, 30,195, 48,193,166,128,211, 18,112,187, 27,144,192, 64,
-137,228, 22, 64,113, 34,149,146,241, 36, 17, 91, 95, 20, 1, 89,105,164, 28, 57, 97, 45,133, 42,102, 58, 29,223,193, 24, 3,104,
-194, 40,150, 25,206,235,230,157,162,209,138,181, 12,154,233,134,154, 84, 21,195,105,109,241, 95,253,247,255, 11,220,122,193,111,
-254,254,223,227,179,207,191,192,215,127,248, 13,214,117,198,167,159,255, 28,199,167,247, 64, 78,184, 92,206,149,134,213, 35, 81,
-203, 84, 44, 83,147,227, 37,168,122,104,148,125, 27,186,145,110,198,181, 18, 28, 29,139,160,221,214,125,174,119, 63,201,235, 72,
- 95,185,112, 39,132, 64,150,128,213,187,254,143,180,179, 86,208,180, 74, 72,124, 25, 25,171, 15,181,184,208, 74, 87, 65, 47,211,
- 32,181,248,248,155, 93,174, 48,208,249,123, 84, 69, 14,142,205,118,143,243,249, 88, 47, 36,146,152, 80, 72,214, 60, 50,187, 41,
-216,159,223,198,158, 25,145,109,100, 34,198, 99, 97,107,172,118,197,242, 90,123, 57,108,231,165,144,252,248,253, 29,236, 0,165,
-185,195,183,214,182, 75,127,100,167,134, 54,186, 50, 16,202,152, 56,161,243, 47,231,134,120,174, 46,252, 12,225, 25, 52, 59, 84,
-225, 27,172,235,138,167,227, 73,208,163, 30, 86,163,178,238,147,207,117, 13, 51, 13, 6,207,111,183,120,243,112,132,143, 9,171,
- 7,108,182,200, 70,193,100,137, 33,202,177,134,204,196, 74, 89,227,119, 77, 43, 18,193, 25,234,164, 40,202, 20, 53, 22,184,137,
- 76, 17,188,247,140, 70, 53, 70, 38, 74,186, 22,102, 74,166, 67,157,167,161,173,172,100, 21, 86, 88,241, 41,147,136,137, 69,116,
- 36, 54,187, 16, 56, 90, 57,117, 19,142,148, 62, 20, 34,230,214,181,139, 61, 24,160,235, 11, 93, 22,101, 53,179, 66,181, 60, 18,
-173, 76,141,105,141,177, 64,108, 82, 39, 84,149,220,134,186,177, 38,177,186,209, 7, 57, 25,185,174, 68,202, 32, 70, 19, 33,203,
-231,165,172, 93,115,111, 15,207, 29,177, 80, 92, 46,185,195, 63,151,125,255,149,199,191,236,236, 43, 42,186,155,156,119,187,173,
-220, 58,109, 94,245,100,192,212, 25,190, 84,132,197,246, 64,169, 64,101, 62, 84,103, 18, 58, 11,167, 28, 54,101,244,196,223,248,
-104, 6,248,229, 12,163, 13, 12,162,140, 24,211,149, 85, 70, 43,133,101, 94,240,240,244,136, 47,126,250, 5,190,252,221,111, 48,
-142,155, 58,194,218,237,246,248,246,155,111, 48,142, 3, 62,121,249, 18,143,111, 95, 35,102,141,243,188, 98, 26, 44, 94, 63, 60,
-225,229,243, 91, 28,207,103,196, 4, 44, 11,123,116, 9, 96,181,121,136, 24,198, 17,119,251, 13,166,113, 64,240, 14,167,211, 17,
-251,237, 6,251,253, 45,130, 91,225,172,174,226, 14,196, 12,178, 3,195, 25,202, 74,193, 90,164,232,101, 68,152, 68,128,198, 10,
-109, 99, 45, 82, 6,172,181,149,171, 60, 17,112, 99, 53,244, 52,225,233,120,225,106,142,154, 42,153,243,126, 91, 78,118, 28,221,
-121, 20, 0, 0, 32, 0, 73, 68, 65, 84, 97, 2,135, 16, 96,180,230, 40,205,148, 48, 12, 35, 31,114, 49, 32,228, 12, 34,230,107,
- 47, 0,110,119,219,154, 67,157, 64, 88,151, 25,255,225,159,190,196,175,127,249, 83,120,239,176,204, 71, 56, 31, 17,136, 48,109,
-182, 88,150, 51,180, 34,172,235, 42,163,207, 0,172,171,236, 75,139, 42, 29,152, 47, 39,104,109, 48,207,103, 57,104, 88,100,200,
-214, 60, 14,250, 80,218, 96,157, 47, 0, 8,126,229,247, 52,146, 71,244,236, 75, 31,134, 13,214,117, 65,118, 75,173,242,189, 92,
-200,178,212,101,101,170, 34, 24,163,176, 29, 71, 76,211,196, 22, 25, 73, 81, 82,154,131, 86,204, 96, 96, 4, 82,226, 3,175, 20,
-140, 33,108,199, 9, 65, 70,207, 49, 43, 88,107,176,174, 14, 91,163,112, 9,156, 70, 54,104,133, 85, 70,137,211, 48, 32,102, 96,
- 48,252, 51, 45,164,225,115,128, 78,132,203,124,168,147, 39,228, 12,239,146,140,215, 53, 66,116, 60, 49, 17,225,220, 50, 31,249,
- 82,130,146,110,213,192, 14, 60,250, 11,209,195,135, 82,236, 74,215, 47, 74,243, 97,220,226, 23,127,249, 95, 3,209,227,171,223,
-254, 61, 62,255,252, 11,124,247,199, 63,192, 59,143, 63,253,245, 95,227,240,248, 14, 63,255,249,175,240,207,255,252, 37,239, 43,
-235,248,176,219, 39, 94, 41,166, 5,133, 89,216,254, 68,141,197,223, 25,204,175,163, 66, 59,139,150,236,237, 83,205,119,104, 23,
- 60,195, 81,174, 71,122,197,147,235,188,111, 33, 83,212, 1,168,228,107,112,231,198,170,127, 31,162,128, 72, 88,217,100, 69,231,
-193, 16, 16,192,104,158, 6, 5,121, 30, 26,133,174,233, 22,122,150,194,179,231, 31,195,185,133,207, 38,105,143,130, 36, 39, 34,
-122, 57,240, 68, 79, 81,116, 14,133, 8, 39,187, 94, 2, 31,188, 68,169, 30,148,141, 5,159,121,149, 16, 81,221, 9,188,146, 24,
-106,183, 31,148,135,211, 26, 23, 69, 32,101,170,175,123, 18, 12,239, 52, 14, 24, 71, 11,107,117,131,228,116, 68,177,154, 65, 90,
- 70,239,185,165,189,101, 89,111,198,148,113, 62, 95, 48, 95,230, 26,174,146,229,251,140,221,110,191,236,249,183,155, 9,227,233,
-130,217, 7,172,158, 19,223, 72, 19,230,213, 99,208,168, 5, 98,206,226, 91, 55, 66, 86, 85, 45, 20,136,136,217,121, 70,107, 24,
-165, 16, 17, 49,144, 98,161,177,176,249,139, 6, 35,102,158, 60,162,123,207,203, 74,245, 58,187, 49,131, 96, 96,117,155, 34,165,
-220,222,231,148, 89,173, 30, 51,113,218, 97, 10,200, 41, 86,184, 89, 11,114,233,186,122,233,152, 11, 76, 41, 20,254,187, 92,232,
- 21,161, 44, 99,111,116,177,188,101,188,159, 69,255, 83, 10,141,246, 76,168,122,161, 87,132,112,105,100, 85,211,207,160, 23,186,
-149, 75, 93,166, 99,163, 53,176, 98, 89,165, 46,144,173,191, 59,171,141, 79, 53, 75, 95,238,156, 47,213, 62, 41,138, 55, 77,189,
-230,163, 83,182, 41,234,138, 1, 41, 26, 40,115,212,110,206, 48, 21, 57,154,249,165,201,221, 30,228,106,148, 33,197, 64,238,162,
-222,250,240, 15, 82,141,129, 28, 51,119,159,236,239,107,160,135, 78,159,143,101, 93, 17,115,194,243,251,123, 28, 15, 7,124,254,
-249, 79,112, 58,159,241,248,250, 45, 70,137, 87,188,127,246, 12,209, 59,124,243,205, 55,184,127,118, 15,157, 19,242, 49, 85,166,
-248,219,167, 19, 70,163, 56, 86,114,117,216,140, 6,171, 11,208, 74, 97,204, 28,187, 58,142, 35,156,115, 32, 0, 55,155, 1, 79,
-199, 19,126,242,217, 79,177,174, 75, 3, 80,132,128, 56, 88, 88,201, 69,231,240, 24,146,253,144,146, 49, 15,160,192,136, 64,181,
-240,235,165,228,131,146, 42,186, 16,208, 57, 35, 44, 43,158,221,108,241,238,120,169,149, 99,181,104,149,167, 92, 48,177, 73,138,
-138,154,177, 77,140,161, 76,242,247, 71, 25,161,217, 97, 4,114,194,225,116,196, 48,140,184,191,185,129,209, 26, 11, 41, 44,203,
-140,239, 94,191,197,198, 50, 39, 95, 17, 23, 57, 57, 7, 30,147,122, 22, 91, 45,203, 42, 62, 74,131,203,124, 70,130, 70, 78,129,
-199, 71, 49, 32, 56,199, 43, 0, 17,102, 37,137,118, 44,213,107, 92, 56,101,174, 28,206,165,111, 44, 93,150,243, 71,246,178,102,
- 96,183,217, 2, 41, 66, 41,205, 41, 98,214, 98,148,162,139, 81,139,185,218, 82, 70,197, 85, 40,231,156,139, 99, 33, 71,132,144,
- 68,112,166,152,131,175, 20, 86,199, 66, 71,154,184,152, 58, 28,142, 48,214,226,116,186, 64, 33,227,102, 51, 97,245, 12,178, 25,
-134, 1,137, 44,182,211,196,185,218,210, 85,251, 8, 28, 87,143,152, 86,254,204,103, 84,181,184,214, 10,251,237, 22, 91,165, 65,
- 72,188,206,209, 3, 92, 98,155, 38,233,194,131, 39, 65,178, 18, 84, 22, 11, 19, 17,146, 68, 59,150,157,233,199, 95,252, 41, 62,
-249,248, 37,254,223,255,231,255,128, 85,192, 31,190,252, 7,196,156,241,236,197, 75, 32, 5,188,252,244, 51,188,122,245,157, 84,
-232, 81,188,170,213,240,212, 17,165,122, 64, 71,139,175, 42, 33, 61, 84, 32, 82,170,137,108,128,198,142,238, 21,223, 87, 97, 16,
-117,103,153, 59, 97, 81,167,205,238,198,160,170,252, 89, 25,209, 91,165, 49, 88,177, 31, 5, 22,200,213,168,102, 2,180,230, 73,
-149,151,207, 11, 17,115,247,163,119, 18,179,137, 42, 50,227, 85, 66,110,140,116, 97, 56,220,222, 61,135,182, 3, 79, 39, 82, 98,
-241, 97,104,194,169,242, 99,232,210,140, 72,231, 25,130,231,148,198, 68, 80, 70, 35, 69, 94,167, 52, 27, 21,143, 77,179,172, 11,
-229,182, 99,167, 66, 82,200, 68, 88, 83,134,210, 36, 54, 74, 57,176,165, 24, 47,132,200, 40,142,158, 39, 98,214,254, 56,114, 39,
-191,221, 78,108,197, 84,212,241,192,203, 33, 44,184,234, 4,204,243, 82, 87, 47, 41, 38, 28, 79, 39,129,159,176,235, 33,146, 66,
- 68,170, 23,137,214, 74,190, 38,255,204,207,110,118, 88,222, 61,129,180,170,121,224, 49, 49,148,107, 48, 74, 20,236,162, 54,175,
- 26,135,102,119, 99,147,135,194,150, 20, 82, 72, 24, 20, 97,208, 26,131, 97,228,112,206,153,249,255, 66, 14, 85, 31, 36,139,149,
- 80,163, 84,149,229, 60,150, 15, 84,183,210,205,235, 45,133, 94,130, 22,113,175, 7, 74, 92,173, 82,160,174,200,170, 81,223,185,
- 7,222,176, 8, 77, 43, 37, 52,203, 40, 80,151, 78,200,157, 75, 88, 27, 73, 46, 3,239,236,179, 64,204,120,122,214,207,173, 21,
-148,106,172,244, 10, 96,162, 30,199,219,249,206,202,231, 53, 95, 27,230, 6,195,110,139, 97, 48,149,231,208,243, 94, 74,180,111,
-161,127,170, 92,138,187, 22, 38, 85, 92, 84, 84,214,118,157,181,173, 88,229,170,117,174,144, 21, 37,194, 55, 75,190,123, 76, 9,
-166,224, 96, 81, 87, 64,185,138, 84, 62,140,229,164,235,184,236,102,241,233,114,182,145,129,243,229,130, 65,177, 64,230,213,187,
-247, 87, 21, 87,169,200,207,231, 19,180,182, 8, 41,224,249,199,159,224,116, 60,226,229,167,159,226,124, 62,195,199, 92,199, 70,
-203,186,226,238,102,143,249,116,130, 15, 14,199,243,140,237,200, 17,120, 75,140,208,138,115,208, 99,140, 88, 29, 43,205,125,136,
-240,145, 11, 11, 64, 65,143, 22,163, 81, 32,109,224,206,103,164, 20,113, 57,159,171, 69, 97, 24, 7,120, 63,194, 14, 28, 38,227,
- 36,242, 82, 73,220, 95,161, 5,229,200, 86,132, 24, 69,213,158,129,117, 89,112,185, 92,164,115,160,234, 79,245,171,195,222, 26,
- 92,132, 23,206,227, 71, 85, 88,147, 8, 98, 73, 42,158,199, 50, 70, 85,138, 69, 78, 10,128,119,107, 21,204,173,203, 5,118,152,
-176, 96,193,205,118,131,199,227, 9,251,205,132,176,206, 80, 74,225,241,233, 8,251,236, 22,131,213,140,110, 93,206, 80,224,206,
-217,133, 12,173, 9,231,203,140,148, 18,156, 23,165,113,249,218,242, 36,104,226, 61,169,210, 13, 75, 91, 20,224,133, 39,205,196,
- 37,230,139, 71, 17,103, 89,107,171, 82, 56,202,254,104, 59, 14, 34, 50,226, 3,113,144, 4,175, 65, 19,156, 95, 97,181, 18, 81,
- 23,139,101, 40, 39,140,195, 84, 89,236,132,140,253,198,226,178,240,195,120, 58,173,184,187,187,129, 53,252,193,118,235, 10, 23,
- 2,150,203,140,140, 25,187,221,150, 99,111, 9, 80, 70,195,173, 11,180, 68, 88, 62, 61, 62, 96, 24, 55,120, 58,159, 17, 51, 7,
- 10,109, 4, 98,193,106,222, 92,199, 93, 73, 20,190,196, 32,119,100,240,186, 71,155, 17,201,157,197,162, 86, 32, 25, 53,246, 2,
- 74,177, 51,160,165,100, 1, 80, 19,126,242,197,159,224,251, 63,126,133,249,244,136, 89, 28, 16, 47,127,254,103,216, 76, 91,156,
- 78, 7,252,238,219,127,192,180,217,193, 26,141, 21,116, 21,167, 88,187,238,122, 17, 83, 29, 14,182,234,190, 37, 65, 21,243, 87,
- 46,222,221, 58, 66, 85,173,125,239,141, 91,181,210,199, 21,156,165,159, 9, 52,124,173,208,215, 20,107,101,202,119, 18, 98, 16,
-181,123, 81,239, 83, 85,109,199, 34,240,147,239, 35,228,216,165,172,253, 11, 30,251,202, 76,226,127,247,226,227,207,248, 34, 78,
- 76,228, 82,213, 62,213,210,209,202, 33,216, 3,127,178,136, 7,203,197,227,157, 32,124, 99,179,228,130,148,116,121, 16, 30, 64,
-100,113, 98,100, 54,129, 86, 37,182,153,199,251,218,104,168,208,212,246, 81, 49,243, 97, 93, 23,217, 83, 43, 33, 31,122, 92,136,
-216, 90,105,184,160,157, 70,203, 93,188, 49, 85,132, 87,184,249,239, 31,158,112,190,156, 89,237,157, 18, 30, 30,222, 35, 70, 86,
-171,167, 24, 16,164, 16, 40, 64,164,152, 74, 0, 77,130, 82,156, 23,191,223,110,176, 6,110, 18,156,103,235,111,204,204,121,135,
- 92,198, 90,243,179,110,149,170, 54, 53, 34,130,209,138, 59,204, 65, 97,171, 53, 12, 1, 86,115,215,105,140,174, 34,189,217, 57,
- 92, 92,192, 90,180, 87, 5,126, 82, 2,138,228,235,151, 73,149, 49, 6,148, 51, 38,177, 36,198,106,245,213,194,236, 96,116,184,
-234,206, 64, 74,212,184, 3, 31, 4, 73, 18,105,144, 50,156,242, 86, 98,119,235,158,186,227, 61, 80,123, 30,141,182,252, 94,201,
-184,189, 23, 99,214,191,185, 20,193,164,174,247,220,249,195,130,184,129, 97, 82, 85,166,183,175, 91,116, 54,197,105,194, 52,190,
-150, 90,199,221,109,170,211,168,212,255, 93, 41,212,206,190, 20,244, 81,206, 64,234, 92, 23, 68,169,165,253,137,115,170,159, 32,
-100, 1, 67,153,171, 0,238, 2,144, 64,170,108,220,171,196,161,126,158, 80,195, 39,218, 53, 95,237, 61, 82,181,198, 16,240,205,
- 15,175,234,136,161, 7, 92,188,122,253, 6,159,125,250, 41,136, 8,175, 95,253, 0,183,174,120,247,246, 13,163, 17,237,132,121,
-225,240,148, 97, 28, 49,141, 35,110, 83,196,251,119,239,176,223,237, 49,207, 11,139,136, 60,103,105,175,206,215,186, 98, 94, 61,
-175, 18,214, 0,173, 61, 92, 72,176,154,224, 92,144, 14, 68,225,241,241, 17,110,101, 94,246, 48, 77,216,108, 54, 24,134,145,253,
-173,118,132, 86, 4, 51,142,188,131, 81, 26,144, 44,246,178,219,114, 33, 96, 94, 22,172, 62,224,233,112,192,225,120,196,229,178,
-180,221, 18, 1,161,172, 47,186, 68,157,218, 96, 21, 31,169,188, 94,170,179,213,164,204, 88,200, 40, 74,245, 16,121,123,106, 44,
- 23, 50, 33, 68,188, 63, 28, 49,142, 35, 22, 71,216,111, 38,156, 93,192,236, 60,230,213,129, 48, 0,164,176,217, 63,227,157,246,
-198, 2, 98, 87, 25, 54, 26,195, 48,177,178, 86,105,172,203, 12,109,121, 71, 94, 86, 1, 89,246,223,195,184,193, 50,159,229,123,
- 68,245,142,242, 97,200, 59,104,107, 52, 64,236, 72, 80, 57,177,223, 93, 25, 88, 99,112,120,122,192, 48,140, 80,138,176, 29, 6,
-132,196,159, 15, 31, 2,198,193,242,110, 93,254,110, 77, 92,105,206,203, 2, 82, 44,244,113,193,243,148, 65,194, 24,166,113,128,
- 19, 76, 99,138, 17,122, 24,120,100,153, 51,182,219, 13, 66, 8,172,147, 32,194,233,114,134, 66,198,110,127,135,243, 60,195, 90,
-139,217,173,172,216, 86,132,232, 87, 62,156,193,123, 65, 51,108,176, 92,142, 48,118,228, 20, 38, 81, 60, 23, 71,192, 48,110,113,
-190, 28,248,123, 85,170,121,130,175,128, 18, 28,201, 24,147,170, 99,213,187,103, 47, 96,172,198,195,195, 59,158,132, 37,198, 27,
-243,154,137,240,195,119, 95,227,197,199, 47,241,209, 71,159,224,183,255,248,183, 53,101, 77, 21, 5,125,119,249, 85,123, 80, 79,
-151,234,242, 31,114,238, 16,167,104,110,131, 22,255,136, 46,202,247,199,160,182,162, 90,207,215,254,174,122,120, 89,107, 97, 37,
-224, 34,165, 40, 28,252,116,229, 33, 46, 73, 97,213,211, 47,207,125,200, 45,145, 14,185, 71, 96, 72,151,129,166, 0,206, 57,225,
-230,238, 57, 54,219,157,164,161,165,230,117, 22,111,175,214, 34,106, 45, 88,213, 10, 91,105, 34, 61,173, 10,179, 63,212,144,170,
- 88, 68,109, 68,200,138,174,108,186, 9, 2,141, 81, 90,236,103,132, 20, 51,146, 6, 40, 71, 32,136, 16,201,106,201, 50, 96,124,
-111, 18,203,157,182, 26,218,235,122,233,151, 75,222,173, 43, 46,103, 22, 85, 26,107, 49, 12, 28,233, 60, 14, 6, 57, 71, 28, 79,
- 71, 60, 61, 29, 5,122,146,176, 92,206,197,104, 8, 72,146, 93,209, 34,149, 25,138,146,100, 56, 37, 78,140,219,221, 22, 15,167,
- 75,245,183, 67,115,151,157,114,134, 41,100, 67,186,198,241,148,169,131,181, 3, 70, 77,184,217,108, 96,192,129, 71,131, 49,146,
- 34,201, 36,204,152,120,173,117, 90, 22, 60,205, 51, 46, 62, 34,200, 58,181, 36,194,149,220,248, 34, 8, 83,146,108,166, 44,167,
- 58,106,217,119,103,112, 51, 64, 72, 44,160,181, 90,138, 20,158, 0, 70,121, 55,106,224,116, 89,201,200, 36, 38,137,168, 56,119,
-145,173,117,215, 68,252, 94, 40,161,195, 17,192, 64,175,206,198, 87, 61, 31,153, 47,113,202,101, 15,223, 68,106, 80,249,131,179,
- 27,215, 16,157,148,171,120,174, 36,191, 23,216, 18,174, 70,237,168, 86,230,194,162,232,161, 81,232, 10, 54, 66,249, 25,115,135,
-215, 37,201,139, 23,207,122, 65, 25, 67,216,247, 49,116,155,254,118, 71, 27,116, 23, 77,181,177,200, 69,147,241, 97,214,115,171,
- 24,114, 23, 89,135, 14, 72, 95,188,180, 49,113, 82,217,241, 50, 95,157, 31,229,114,127,245,250, 13, 62,255,244, 19, 88, 59,192,
-175, 51,182,219, 13, 14,135, 35, 94,188,120,129,199,195, 17, 55,187, 45,158,142, 39, 14, 10, 89, 87,188,127,255, 14,206, 57,108,
-242, 0, 13, 32, 0, 24, 7,139,105,154, 96, 53, 33, 64,193,175, 11,166,193,224,178,122,164, 12,140, 32,196, 16,113,184, 44,216,
-141, 6,239,143, 23, 12, 57,227,187, 63,126,135,237,134,179,165, 55,219, 45,166,105,194, 36,121,234,195, 48, 98, 24, 71, 24,239,
- 96,237, 8, 45, 30,123,196, 8,196,136, 24, 28, 46,243,140,203,188,224,116, 58,225,237,187,119,120,122, 58, 96,150,209,118, 44,
-203,138,114,208,117,112,143, 50,173, 80,212, 52, 9, 74, 18,193, 74,110,116, 77, 28, 34,212,140,236, 32, 0, 18,173, 53,236, 56,
- 33,197, 8,231,248,103,220, 77, 35,214,195, 17,218, 24,156,231,165, 59,212, 84, 69, 50, 34, 51,183, 88, 41,141,227,233,192,226,
- 20,127,226,209, 99,206, 88,151, 11,239,177, 13,199, 12, 82,138,112, 11,139,182,188, 91,171,247,149, 36,144,198,104, 5, 37,118,
- 55, 99,172,164,154, 69, 9,106, 0,206,167, 39,236,183, 91,168, 28,101, 68,141,234, 65,214, 4,204,203,204, 30,117,207, 40,218,
-193, 76,204, 5,247, 1,218, 26,104,193,212,134,192,187, 68, 99, 12, 92,136,152,180,173,151,137,150, 72,221,155,155, 29,158,142,
- 39,108,167, 9,218,104,172,206,215, 41, 82,140, 30,131, 81,152, 93,198,118, 26,240,120, 60,192,106,219,137,202,196,242,229, 29,
- 79, 32, 50, 91,198,148,176, 55,141, 50,152,131,135, 59, 63,225,197,199, 63,193, 31, 95,125, 47, 32, 25,211, 75,119, 68,147,209,
- 30,250,226, 82,218,237,247,248,230,235,175,113, 58, 62,177,133, 46,103,124,252,147, 95, 96,191,191,197,111,254,241, 63, 98,154,
- 38,252,250, 47,255, 26,127,248,242,159,228,117,166, 38,140,169, 23,181,170,153, 11, 77, 44, 67, 53,148,168,145,227,114,167,121,
-201, 87,249,236, 87, 23,124,238,163, 53,187,125,122, 73,249,171, 78, 22, 86,132,219, 34,246, 76, 9,115, 88, 58,123,157, 18, 47,
-116,190,178,245,229,171, 62,168,169,225, 83, 23,109,122,117,189, 84,113, 89,194,238,230, 30,219,221,109,237, 58, 74, 19,160, 72,
- 85, 91,145, 22, 31,120,193,241, 42,106, 59, 95, 37, 47, 26, 73,172,110,204, 65,104,151,234, 90, 21,196,234,195, 58,226,143,129,
- 19, 31,145,203,234, 43, 1, 58, 23, 25, 72,221, 99, 43,109, 42,225, 44,248, 22,179, 27, 17, 17, 83,224,168, 91,173,144, 36,246,
- 54,139,147, 71, 41,133,168, 13, 86,231,112, 62,203, 24, 89,243,127, 31,222,191, 7, 41, 35,254,106,246,146, 47,203,204, 93,189,
-162, 90, 64, 87, 40, 76, 74,213, 26,104,180, 70, 22, 27, 21, 55, 46, 2,148,138, 9,131,209,112, 33,194, 78, 76,245, 75, 57, 99,
-180,230,234, 51,171,133,249,190, 25, 7,220,108, 38, 76,198,192,128,247,195,163,181, 98,253,226,224,172,197, 57,220, 58,135,237,
-233,130,135,243, 5,135,117,197,188,186, 42,106,131,172,225, 10,147,131,121,255,156,178,166,141, 17,235, 95, 18, 55, 73,233,240,
- 51, 0,141, 36, 2,175, 18, 64,132, 16,234,219, 21, 37,196, 8, 2,111, 42, 43, 74,245, 47,164,200,241,133,206,225, 89,172,221,
- 42,221,124,115,121, 48,150,181,123, 94,174,226,100, 85,109,222,187,152,203, 46,157, 61,183, 78, 25,169, 66,125, 84,157,188,100,
-153, 36, 65, 68,135,108,145,206,117, 18,139,150, 71,144, 27, 85, 81, 9,236,170,177, 35, 74,238, 75,170,241,217, 16, 18,222, 85,
-210, 92, 17, 88,150,114, 79,160,102,166,167, 34,166,130,168,140, 9, 89,229,142,170,131,138,108,164,234,117,101,224,255, 85, 60,
- 34,181, 63,159, 84, 70, 10,190,143, 2,175,176, 21,133,140,227,229, 12, 59, 12,112,222, 99,216,236,112,120,122,194,139,231,207,
- 16, 99,130, 38, 96,218,108,161,181,193,187,135, 71,108,119, 59, 12,199, 39, 16,177, 2, 62,198,136, 16,131,116, 77, 51, 54,214,
-192,110,118,120,251,150, 97, 53,155,145,201,104, 89, 51, 40,225,112, 89,240,252,217,103,248,250,219,111, 97, 1,156, 14, 71, 88,
-171, 49, 90,131,237,110,135,221,126,135,221,126,143,237,110,135,237,118,139, 73, 58,248,146, 57,173, 69,125,156,114,130, 95, 86,
-156, 79, 71,156, 79, 39,188,123,255, 14,111,222,190,195,249, 50, 51, 57, 78, 78,153,162, 26,101,241,146, 0, 53, 4, 76, 66,170,
-216,149, 80, 31,210,222, 75, 73, 29,201, 72,107, 93,131, 61,172, 16,247,120,194, 48,241,190, 58,105,188, 61,156,160,140,169,214,
-150,197,121,188,184,221, 74, 48, 12, 79, 46, 50, 17,252, 42,138,245,152,224,252, 69,188,218, 22,126,185,200,174,145,199,204, 57,
- 6, 12,155, 29,130, 91,196,166, 97,106,199, 51,136, 0,140,199,209, 22, 57,204, 8,129, 59, 25,173, 13, 8, 9,151, 53, 96, 59,
- 88,156,206, 23,220, 77,172, 54,205,193,177,184, 72, 84, 89, 86,236, 67,155,113,144, 49, 19, 97,191,219,241,229,237,189,232, 51,
- 52,140, 36, 37, 89,163,235,235, 81,246,200,243,194, 5,204,101, 89,112,179,219, 33,132,136,211,133,255,157,115,158,107,166, 20,
-225, 97,161, 40,224,120, 62,194,142, 27,228,228,133,210, 88, 94,223, 4, 91,188,195,200, 76,139, 66,230,128, 29,217,159,127,250,
-217,175,112,185, 60, 9, 98, 83,215, 98,172,116,137, 73,242,215,107,138,161,224,101, 31,222,191, 3,153, 19,134,113,130,217,108,
-241,209,103, 95, 0, 41,227,219,111,126, 15, 99, 44,166, 97,139,127,254,250, 43,188,121,243,125, 99,159, 11,158, 54,137, 85, 38,
-198, 80, 87, 98,218,244,235,155,212,226, 48,187, 43,139,174,151, 99, 29, 4,165, 76,138,114, 45, 18,218, 30,178,169,112,141,140,
-103, 99, 98, 97,167,207,249,106,229,166,181,145, 92,106,217, 65,119, 74,224, 30, 85, 75, 93, 83,208, 2, 84,164, 32, 80, 13,183,
-154, 82,194,246,230, 22,155,237, 94,194,158, 98,221,197, 42, 34,118, 17,228, 12,163,153,193,175, 20, 97,245,190, 59,208,181, 20,
- 96,186,203, 98, 87,136,146, 15, 94,178,236, 11, 96,167, 98,198,229,123, 97, 59, 82,150,231, 48,136,248, 75, 35, 71,209, 7, 40,
- 43, 29,169,145,241,114, 99, 33,212, 53, 75,183, 54,163,108,170,128,216,201,179,173,181, 66,134,111,207,181, 60, 83, 72, 25,222,
-121,144,226,243, 12, 49,176, 10,220,175, 8, 41,192, 40, 98,110,132,140,155, 51,184,208,175,148, 50,165,249, 96, 15,252,123, 89,
-232,198,221,125, 33, 11,198, 18, 5, 44,239,175,238,156, 1, 74, 68,193,163, 29, 48,216, 1,251,205,132, 81, 2,149, 6, 99,120,
-205, 34, 35, 94, 31,121, 4, 63,141, 35, 51, 67, 14,192, 42, 81,187, 69,167,224,124,128,143,169,193,198,141,129, 29,140, 20, 67,
- 25, 33,121,153,180,104,121,253, 89,206,168,160,219,199, 85,183,215,151, 74,238,130,192,113,114,138, 44,204,147,103, 55,198, 80,
- 39,198, 60, 25,177,178,130,137,149, 14, 71, 53, 78,166,233, 48, 42, 24,152,114,109,160,174,241,192,141, 22,152,175, 50,203,133,
- 30,168, 4,186,132, 70,150, 36, 36, 68, 31, 43,175,129,167, 15, 93,232,153,168,225,169,155,168, 85, 69,124,241,139, 95, 53,191,
-232,130, 90,169,107,160, 43, 1,137,243, 70,202, 84,167,252,153,156, 97,218, 54,191,140,128,115, 29, 3,244,190, 83, 84, 44, 93,
- 25,171,169,250,114, 21,147, 62,196, 22, 80, 10,157,105, 26,126,220, 29, 16,167,226, 24, 24, 60, 29, 14,216, 10, 70,214, 45, 51,
- 72,189, 64, 88, 87, 12, 70,227,225,253, 91,124,244,209,199,184,187,189,193, 56,109,240,252,207,255, 2, 95,253,254,183, 24,110,
-119,248,238,213, 27,217,153, 40, 22,192,236, 54,112,206,225,211,151,159,227,225,253,107, 56,199,106,242,152, 9, 55,183,119, 56,
- 60, 61,226,155,239,190,151, 14, 63, 67,223, 61,195,195,227,123,252, 79,255,227,255,140,255,243,223,252,111,120,247,238, 1,131,
-209,216,108, 55,124,193,239,118,216,238,119,216,108,119,152, 54, 27, 12,210,101,113,110,116,192,178, 44, 56, 28,143,120,243,250,
- 13, 14,135, 19,214, 16, 17, 65,245, 34,175, 43, 76,202,200, 33, 55, 86, 62,218,165, 93,137, 78, 84, 70, 46,205,248, 18, 18,143,
-115,188,140, 14,145, 18,214,224,235,206, 38,165, 8, 74,188, 43, 42, 19,146, 82, 9,186,148,112,190, 92,160, 69,200,147, 73,195,
-201,222,157,181,138, 12, 73, 9, 76, 54,225,138,118,113, 80,154, 3, 84,236, 48,192, 45, 23,126,199,229, 0,113, 41,137,232, 41,
-215,206, 61,184,165,138, 70,172, 28, 82, 90, 25,220,237, 13,142,151, 21,251,137,109, 63, 69, 5,110,140,130, 38,130,213,141, 42,
-118,154, 23,140,198, 96,201, 17, 86, 8,123,171,247, 48, 74,195, 14, 3,172,225,143,231,227,211, 1,251,221, 22, 49, 6,216,129,
-115,165,207,243,130,232, 3,134,205, 6, 16,126, 60,145, 8,143, 66,192,198, 90,184, 4, 12, 22,200,106,195,254,124,173,176, 4,
- 73,165,146, 16,143, 28,131,116, 45, 35, 78,243,185,165, 64,229,132, 28,249,112,126,124,248, 30, 49, 9,118, 85,108, 55, 41,101,
-232,148, 5, 22, 67, 53, 24, 36, 22,223,111, 76,240,235, 5, 42,120,232,205, 30,183,207, 62,194,251, 55,175,176, 44,236, 65,214,
- 90,131,236,132,199,135,119,112,243,153, 63, 23,154, 42, 98, 84, 41,141, 16, 28,119,195,170, 33, 95, 33,194, 24, 45,182, 62,213,
- 65,163,122,181,123, 33,131,149, 46, 62,117,144,234, 22, 55,201,240, 16, 43,106,244, 44,118, 83,159, 98, 29,109, 22, 94,182, 17,
-152, 78,148,215, 43, 21,112, 82,206, 87,251,247,126,103,153,107, 64, 75,195,241,169, 14,126,179,221,223, 96,152, 54,226, 44,137,
-242, 26,242,215, 53, 74,215, 14,121,178, 67,253, 94,188, 15, 66,198, 3,172,100, 48, 12, 66, 8,140, 49,241, 5, 42,222,249, 82,
- 4, 2,153,243,175,229, 34,190, 10,229,145,162, 72, 33, 3, 57,242,238, 63,200,235, 27,121, 23,106,141, 22,214, 0,167, 79, 22,
-226, 96, 95,188,151,233,138,207, 94,124,252, 9, 33, 7,238,182,147,174,207, 52, 8, 80, 65,198,218, 33,192, 7, 87, 5,116,148,
- 2, 20, 18,144, 2, 66, 10, 80,214, 86, 67, 87, 33,101,150,159,177,106,113,196,219,173, 20,199, 93, 39,207,157,188,147,224,145,
-197, 49, 77,178,172, 35,248, 57,105, 44,116, 35,255,108,148,194, 52,142,216, 12, 3, 70,163, 97,149,230,137,156,228, 24,152,200,
- 59,246, 65, 58,240, 16, 35, 11,148,125, 96, 98, 36, 18, 79,214, 68,240, 7,120, 88,101, 36,234, 21,194,226, 72,141, 83,160, 13,
-178, 15,165,218,227, 12, 15,109, 17, 3,251,240,165, 3, 68, 10,252, 30,164, 28,235,221,170, 84,217, 93,179,243, 65,105,110, 0,
-136, 20,211,225,228,115, 73, 61, 31,160,112,223,175, 2,120,202,104,191,165,166, 16,229,171, 12,129, 86, 38, 55,126, 75,213,161,
-105,177,112, 18, 65, 83,135, 11,239, 98,107,209, 11,224,196, 41,150, 83,172, 29,122,155, 98,118, 60,247, 26, 37, 91, 38,186, 45,
-104, 77, 56,135,204,138,145,115, 1, 89,203, 62, 61, 87, 57,183,220,215,229, 98, 33, 57,136, 59, 5, 98,141, 86,197, 85,130,209,
-213,124,190, 88, 1, 50,163, 12,159,221,108,113, 56,159, 27,118,175, 74,239, 91, 37,246, 31,254,211,223,227,175,254,139,255, 12,
-199,239,191,195,237,243, 23,248,234,171,223,227,254,217,115, 76,227,136,103,207, 70,204,203,130,253,110, 11,231, 28, 14,139,199,
-175,255,242,191,196,229,240,128,243,233,132,243,188, 96,245, 17, 90, 1,135,195, 1, 32, 30,255, 25, 51,112,146,155,101, 66,209,
-124, 62,193, 24,139, 23, 47, 94, 84, 48, 69,112,172,190, 85,198, 98, 73, 18, 80,224, 60,176, 6,216,199, 3, 54, 90, 99, 55, 24,
- 12,155, 9,211, 52, 97,156,166, 58, 26, 69,206, 88,150, 21,167,211, 9,135,227, 9,139,247,213, 70, 19,168,236,150,168,249,125,
- 73, 73, 86, 48, 71, 48,146,248,117,139, 32,164, 64, 66, 82,110,185,196, 70,196, 39,170,203,117, 46,249,200,138, 8, 26,169, 38,
- 23, 25,109, 26,202, 82,170,215,139, 3,172, 78, 98,205, 81,226, 66,200, 80,138, 69,114,229,205, 12,158,119,235,118,152,176,172,
- 51,148,160,118,215,249, 12,101, 71,238,138,141, 69,188,156, 0,109,144,114,104,251,127, 36,144, 98, 97, 80,150,228, 49, 78, 50,
-226, 3,122, 9, 10,163,229,195,245,102,187, 5, 64, 24, 6, 78, 67, 83, 90, 33,134,136, 73,198,129, 38, 51,168, 34, 4,177, 10,
-198, 8,171, 20, 92, 8,149,220,118, 60,157,249, 32,200, 9, 15, 79, 7,172, 94, 14,178, 49, 35, 81,170,238,129, 40, 31,110, 82,
- 26, 58, 19,230,101,198, 96, 71,246, 34, 59,119,149,149,205, 54, 39,170, 15,204, 96, 71,246,189, 6, 15,173, 13,124,112, 72, 57,
-227,211,143,127,134,239,191,255,170, 10,141,216,174,212,117,127,162, 76, 85, 42,201,197,206,223, 67,240, 14,201,123,108,136,240,
-195, 55, 95, 34,172, 51,251,190,149, 2, 13, 27,156,206, 71,172,151, 35, 6,173, 36,134, 82,213,177,122, 81, 68,215, 66,162, 4,
-167, 84,129, 18, 33, 38, 92,177, 36, 26,251, 32, 95, 69,160, 10,172,176,250,191, 89,189,142,154,116, 85,194, 86,202, 63, 43, 41,
-188, 99,106,118, 87, 34, 85, 17,151, 94, 4,146,245, 34, 47, 14, 26,186, 90,180,161, 90, 95,186, 67, 42, 3,184,189,125,134,105,
-183,151, 17,123, 18,198, 55,119,219,253, 56,211, 16,129,140,134, 49, 34,142, 10, 28,175, 28, 51, 79,243, 42,119, 95,224, 40,101,
- 26, 80,242,196, 11,147, 92,107, 45, 43,175, 98,101,147,230, 35, 21,165,244,117, 92,108, 9,114,210,162, 40, 47,207,125,121,111,
-178, 40,241,139,207,153,227, 85, 11, 34, 85, 46, 3,173,153, 51,145,149,136,104, 1,146, 11,212,203, 78,254,124, 57,241, 51, 88,
-109,136, 17, 38,115,215,237, 67,225,131,215,152, 16,153,142, 20,146, 24,137, 80,149,191, 23, 83,244, 33,162,180,247,129, 5,195,
-140, 42,102, 54, 71,148, 11,149,247,224,186, 46,139,147, 8, 86,171,200, 83,105, 64, 43,228, 10, 8,210, 80, 8,208,153,195,149,
-238,182, 91,184, 91,143,211,188, 96, 9, 44, 8, 84,158, 45,105,193, 11,129, 50, 19,131,187, 98,108,175,177, 32,137, 11,168, 39,
- 75,170, 29, 4, 54,163, 52, 71,191, 90, 99, 17,235, 93, 28, 91,110,125,209,110, 9,227,127, 17,161,171, 22, 23, 82, 12, 45, 66,
- 25, 18,125,172,184, 66,230, 95, 35,127,176, 42,190,214,149,212, 69, 82,238, 44,219, 31, 76,161,203,243,196,223, 51,175, 19,203,
-197,174,192,231, 14,149,208,210,226,187, 47,211, 52,234,156, 37, 10, 18,198,130,235,128,165,146,244, 41,247,109,121,132,170, 13,
- 78, 46, 97, 85, 56,251,133, 9,145, 19,114,140,200,117,167, 94,227, 5, 83,219, 35,100,170, 6,254,171,150,191,131,201, 55, 53,
-110,169,107, 84, 83,235,166,140,127,248,237,151, 87,240,128, 92,101,249,185, 34, 45,181, 54,176,195,128, 28, 2,238,239,239,241,
-199,111,190, 1,140,197,159,252,242,231,172,104, 95, 87,236,111,110, 96,150, 21,255,252,245,215,208, 72,194, 57,102, 60,163, 22,
- 2, 90, 1,148, 12,118,128, 25, 25, 37, 91, 96, 0, 33, 38,188,121,243,154,141,249,214, 96, 26, 71, 60,255,232, 83,252,237,191,
-251,183,248,228, 39, 63,131,214, 26,222, 59,188,123,253, 26,206,175,112, 62,224,193, 69,228,211,130, 73, 1, 91,173,152, 23, 47,
- 73, 62,206, 71,248, 24,133,102,197, 85,154,151,125, 71, 4, 71,234, 33,101,248, 84,236, 35,185, 90, 17,174,240,145,221,232, 46,
-165,212,197, 96, 2, 65,126,159,209, 13, 39, 88,201,125,245, 13,103,175,166, 18, 68, 38, 41, 13,149, 18,103,254,138, 47, 30, 86,
-213, 52, 57,146, 14, 35,138, 26,211, 90,246,191, 59,191, 86, 11,197,122, 57, 65,141, 27,248,117,134,177, 19,206,167, 35,110,110,
-159, 97,157, 79, 8, 41, 99,210,134,215, 16, 17, 48, 36,160,160,204,194,176, 97,224,109,206,118,183, 3, 69, 15, 31, 34,246,155,
- 17,243,178, 98,187,153, 48, 89,131, 20,184,224, 90,211, 10,100,224, 36,220,129,105,179,197,121,158, 37,183,216,113, 78, 48, 50,
- 46,107,192,110, 26,112, 88, 29,148,136, 77,172, 53,112, 62, 98,179,153,176, 58, 7, 61,141,240, 33,192,249,128,197,121,220,109,
- 70, 12, 90,193, 69,224,238,246, 6,203,194, 46, 2,206, 18, 16,180,171, 36,172,141,102, 15,231, 23,152,114,236,144, 70, 66,132,
- 15, 14, 25,128, 53, 3,140, 29,224,188,131, 81,165,112,109, 7, 69, 46, 59, 62,105, 37, 89, 5,207, 23,134, 34,238,246,151,249,
- 36,236,110,222, 9, 7, 31,145, 37,215, 96, 59, 90, 17, 24,201,158,184,236,127,101, 21, 19, 99,106,121,235,130,103,101,223,120,
-108,123,245, 78, 9,143,206,231, 90, 96, 22,138,218,211,217,232,102,185, 97,112,113,149, 4, 42, 99,240,150, 39,159,114,198, 42,
-194,197, 43,145, 15, 82, 23,228,148,127,156,146,170,122,187,125,194,237,253, 11, 76,219,125,169, 64,248, 60,137, 44,124,178, 70,
-215,140,112,107,141,116,123,188, 39, 37,185,248, 93, 8,240,194,183, 55,186,192, 68, 24, 22,131, 20,234,202, 41,198, 70,185, 43,
- 7,110,202,220, 41,199,196,133,152,210, 12, 94, 42,156,252, 38, 54,226, 21, 75,190, 10,217, 96,173,133, 21, 78, 58,201,206,148,
-192, 19, 40, 66, 66,140,165, 24, 40,100,202,166,112,143, 50,153,225,125,188,170, 93,247,124, 62, 49,238,183,122,172, 19, 12, 37,
- 9, 12,241, 2, 87,146,206,150,168,218,253,248,124,141, 53, 6, 55,165,140, 80, 35,122,149,144, 12,121, 69, 19,100,162,148,115,
- 3,186,104, 81,247,247,194,175, 16, 56, 42, 58, 12,137, 47, 66,169,201, 98,230,198,137, 99, 85, 11,209, 78, 99,191,221,226,217,
-110,139,195,204,148, 73,165, 8,227, 56, 9, 66,149,213,234, 92,132, 17, 11,238,100,154, 81, 26, 16,200, 10, 44,134, 36,118, 74,
- 89,103, 25, 13,157,129,236, 75,146, 97,187,136,179,156,153,204,246,183, 18,198,100, 90,186,154,124,222, 9, 5,247,160,164, 89,
-189, 6,216, 20,107, 49, 41, 89, 69,101,234,226,132,243,255,111,176, 79,139, 25, 46,113,167,242,122,138,239,159,196,218,217, 79,
- 3,122,114, 31,114,234, 62, 87,168,171,236,230,205,191,246,164,231,110,236,207,176, 26,197,105,208,164,106, 97, 84,139,105,185,
-143, 19, 1,166, 8,100,138,206,254, 71, 65,113, 29,121, 62,119, 75,123, 92,141,230,219,222, 34, 83,198, 48, 12,200, 4,252,240,
-238,125,135,175, 42, 56,196,212, 88,183, 32,252,246,203,223,227,243, 79, 63,198,188, 44, 8,222,227,139, 47,126,130,183, 15, 39,
-252,240,234, 13, 62,122,254, 12,222,123, 28,143, 39, 56,183,226,249,139,143,240,254,205,247,216,110,119, 32,165,177, 11, 91, 9,
-144, 89, 16,101,188,179, 46, 51,140, 86,136,226, 33, 45, 9, 60,101, 28,147, 98,192,233,228,161,213, 5, 79,143,252, 54,155, 98,
- 79,210, 6,217,185, 43, 40,192, 37, 18, 78, 62, 34,102, 95,247, 40,150,128,231,187, 9, 58,120,132,152,225, 18, 33,228,140, 84,
-130, 14, 4, 21, 91, 5,136,124,140,212, 78,157, 72, 65, 33,117,161, 6,237, 13, 45,226, 38,173,168, 38,120,149,176,143, 98, 25,
- 73,208,136,209,193, 88, 91,161, 54, 74, 41,184,249,130, 97,154,170, 40, 13, 34,180, 41, 7, 80, 76, 17,118,220, 32,198,192,251,
-183, 24, 5,237,155,171,250, 61, 2, 64,240, 32, 40, 56,183,192,218, 17,235,229, 4,109, 13,146, 91, 17,201,178, 24,133, 12,180,
-116,200,138, 20,144, 3,230,213, 99, 51,104,168, 28,112,246, 17,207,119, 35,114,226, 29,154, 15,124,192,164,156,177, 44, 14,171,
-247,184,217,239, 48, 70, 38,215, 93,230,153,169,112,146,154, 54,207, 11, 62,250,232, 5, 98, 60, 98, 89,153,126,231,156, 67, 72,
- 73,236, 71,124,225, 77,195,128,195,233, 12,163, 21,230,197, 85,198, 55,217, 45, 84, 94,176, 58, 62,180, 41,103,152, 2,135,144,
- 7, 33, 5,143, 8, 5,107, 39, 94,101, 40, 45, 27,170, 86,100,101, 9,124, 40, 40,217, 34,206,162,106,165, 34,153,190, 16,114,
-226,247, 77, 19, 33,138,211,130,192,227,226, 50,225, 40,128,167,148,100, 98, 85,118,111, 50,114, 46,130,160,162,250,174,214, 82,
-121,132,130,164,118,149, 81, 33,100, 55,138,210,209,151, 63, 39, 56,207,162, 10,207,200, 53, 24, 38, 95,237,245, 10, 21,171,101,
- 63,243, 37,168, 68,187,146,170,109,142,208, 67, 47,210, 7, 14, 0, 18, 79, 90,249, 37,255, 34, 33, 97,127,115,199, 2, 56,112,
- 66,157, 82,141,227,205,150, 70, 96,180,188,171, 31, 44,187,102,148,150,142, 82,188,227,101,188,206,171, 27,131,113, 28,161,181,
-149,194,214,201, 78, 92,210,235,132, 55,223,200, 41,169,250,133, 21, 41, 94, 37,116,185,243,195, 96,225, 99,172, 35,250,166, 16,
-167,234,192, 80,117,165,145,171, 24,210,202,168,191,124,173,156, 24,110, 3, 72,161,219,251,143, 35,147, 1, 67, 10,181, 25,242,
-206,241, 46, 93, 94,219,173, 16, 99,180,192,153,138,117, 74,107, 5,157,116,157,118, 52, 69,117,148,117, 66, 66, 74, 60,209, 42,
- 69, 59, 7, 90,145,116,235, 10, 86,183,144, 43,165,196,231,140, 70, 37,115, 62, 96, 94, 87,104, 99,144,136, 96, 97,196, 47, 13,
- 40, 89, 67, 4,207,152,111,102,191, 3,251,221, 22,187,195, 17,143, 2,250, 74,164,235, 62,159,114, 20,111,184,146,188,137, 92,
- 93, 8, 21,141, 74,138, 27, 16, 2, 84, 74,208, 57,203,228, 49, 3, 8, 40,241,240,138,168,114, 31, 32,153, 34,198, 88,104,189,
-136,136, 56, 94,161,118,155,134,171,203,175,151, 78, 87,245,200, 89,124,112,143, 81,135, 69, 46,147, 46,153,166,150,215,173,137,
-211,155,173,212,200,153,163,144, 17,156,135,182,186,174, 15,138,128,173, 38,253, 81,113,151,245,105,170, 34, 80, 87, 84,127,134,
- 26, 5,156,113,165,202, 47, 35,132, 74,148,168,163,123, 98,104,125, 74, 48,140,203,149,202,131,250, 49, 95, 91,216, 23, 91, 12,
-165,198,151,189,142,130,235,200, 56,224, 29,151,145, 67,228,202,215, 78,109,132,152,101,124,121, 56, 95,176, 63,157,113,127,123,
-203, 22,182,205, 14,239,191,250,103,220,223,221,227,253,227, 19,126,246,211,207,241,253,247,223, 99,220,236,160,173,197,179, 23,
- 31, 97,176, 3,222,189,254, 35, 82, 76,152,125,146, 17, 13,199,109,110, 55, 19,179,204,197,182,149, 50, 42,142,146, 10, 92, 83,
- 94,216,148,178, 28,224,124,208,172, 62,226,102, 51, 98, 93,157, 0,101, 74,166,112,174,193,244, 94,242,163,222, 5,194, 60, 23,
- 8, 11,255, 62,149, 51, 34, 20,166,205, 6, 58, 72,231,128, 92, 15, 92,234,114,184,155, 61, 74, 93,113,129, 21, 21,159,186,170,
- 74,223, 44, 29,123,148,221, 76,202, 25,163,209, 72, 50, 66,215,162, 64,215,214, 50,152, 39, 39,172,242,245,140, 29, 68, 72,145,
-161,141,129, 95,103,142, 41,141, 65, 84,162,128, 53, 22, 33,242,207, 57,109,247,112,243, 25, 81,114,173, 65,192, 52,140, 56, 93,
-206,184,189,185,193,188, 44,184,204, 23, 86,249,202,222, 19, 57, 84, 30, 56,100,188,185, 27, 52, 66, 6,118,131,129, 2, 48,140,
- 3, 23, 23,138, 15,194,209, 26, 60,157, 0,219,254, 44, 0, 0, 32, 0, 73, 68, 65, 84,206,156,208, 54, 88,220,222,220, 64,157,
-103,236,110,182, 88,102,182, 11,158, 78, 71, 4, 9,251,240,129, 49,191,175,223,190,227,181,139, 86, 56, 10, 35,123, 94,121, 98,
- 16, 82,134, 22, 63,243,124, 62, 96,220,236,225,151, 11, 86,231, 49, 78, 27,204,231, 51,180, 70, 77, 96,227, 41, 79, 64,136,190,
-182,149, 41, 71, 14,232, 80,108, 31, 52, 0,158, 30, 95, 33,229, 4, 67,154, 47, 94,209, 75, 80, 93,149, 48, 68,136,148,226, 61,
-188,226, 20,195, 92, 98, 74, 69,168,149,147, 92,254,221,222, 44, 85, 44,102,170,151,106, 74,205,254,169, 74, 71, 44,255,203,123,
-234,114, 24,137, 31,215, 88, 94,167, 4, 39,187,243, 62,181, 41, 95, 7,184,228,230,213,102,113, 81, 99,179, 3,101,228,158,132,
-110,149,174,182,121, 85, 79,147,210,135, 1,209,210, 26,113,196, 99, 57, 47,166,205, 22,187,219,123,233, 38,163,140, 26,115,139,
-232, 36,192, 71,126,255, 9, 25,211,192, 41, 93,236,249,229,231,195, 24, 13,231, 19,156,243,146,230,165, 27, 94,122,185,112, 23,
- 89,158, 11,185,204,180,136, 82,181, 92,210,181, 51, 18, 95,118,121,111, 33,227,100, 2, 95,208, 73, 68,101,197,142, 70,196, 35,
-110, 45,107,157,226,253, 7,177,245, 75,137,157,202,139,189, 51,196, 8,107,153,111,177,134, 88, 35,134, 99, 2,160,115,103,251,
- 2,140, 2,188,155, 17, 98,172, 77,196,126,216,201, 36,202,178,197, 43, 37,113, 82, 16,116,226,244,199, 16,228,243,137,230,102,
-200, 37,130, 51, 37,104,165, 69, 47,146,234,100, 47,196, 84,255,174,162, 84, 87, 53,226, 87, 46,245,192,151, 58,105,133,144, 51,
-236, 96,101, 84, 47, 29, 98,206,136,129, 49,220, 41, 69,206,104, 39,194,237,118,131,211,225, 8, 50, 26, 67, 2, 54,155, 9,206,
- 7,196,245, 34, 19, 1,213,162,121,139,115, 35,101,144, 92,124, 62,164,154,236, 86, 10,110,254, 30,121,133, 85, 24,243, 41,179,
-215, 93,139, 93,173,128,127, 98,232,128, 71,185, 93,236, 41, 43, 73,204,108,219,226,182, 68,111,221,124,203, 49, 47,171, 43,170,
-187, 42, 42, 69,181, 36,236, 21,243, 99,209,165, 68, 97, 11, 20,246,128,146, 21,176,150,137, 37,170, 79, 61,182,244, 63,185, 67,
-115,191,211,239, 98,214,171,188,170,122, 88,164, 24,168,159,133, 92, 97, 83,170, 49,151,249,110,149,194,206,148, 11,165, 66, 38,
-240, 65,248,251, 85,102,171,232, 26, 83,251, 29, 21,131,216, 25,176,135,193, 98, 71, 93,133,241, 35, 83,108,219,193,167, 24,241,
-240,116,196,199,207,159, 99, 62,159, 96,141,197,221,221, 61, 54,155, 13, 78,231, 19,150,101,197,139,231, 47,240,234,221, 59, 0,
-192, 71,207,238,241,135,175,190, 68,112, 43,238,110,111,240,201,142,224,226, 6,203, 60,227,238,102,135,211,249,130, 36,148, 52,
- 3,224,178,250,166, 78,141, 12, 87, 41,170,198, 44, 31,148,114, 24, 12,198,224,102,191,195,179,219, 27,196, 20,113,185, 44, 56,
- 93,102,184, 28, 43, 92,135, 18,119, 63,206, 57,244,105,121, 73, 58,241, 44, 86, 7,165, 50,200, 42, 57, 24, 60, 87,248,146, 54,
-148, 58, 46,124, 57,127,217,218,150,234,138,162, 38,221,137, 66, 53,203, 33, 82,132, 92, 40, 8, 83,146, 76,100, 98, 75, 77,206,
- 76,197,163,228,121,126,150, 99,205, 69, 46, 65, 48, 33,114,165,184,172, 11,198,113,132,247, 14,218,110, 16,253,130,224,207,200,
- 68,176,150,131,114,180, 34,204,235, 10, 99,216,215, 30,188,231,196, 38,197, 85,183,210, 22, 17, 4, 3, 94, 55,164, 53,214, 75,
-226,229,102, 18,124,162, 65,146, 32,148, 65, 19,134,113,196,225,112,196, 48, 16,116,206,152,166, 17, 86,139,157, 4, 36, 29,187,
-194,102,218,224,253,211, 19,140,102,251,212,195,211, 19,172,101,123,140, 15, 1,214,176, 40,111, 48,138, 89, 5, 68, 24,149, 66,
- 8, 17,219,253,158,137,116, 49, 98,119,115,139,199,167, 71, 12,166,113,161,167,105,199, 59,201, 36,163, 84,133,170,190, 46,249,
-222,153,120, 15,106,204, 80,199,100, 41,103, 88,194, 85,245,207,233,119, 90, 62, 31, 90, 98,116,249,194,247, 34,190, 42,162,157,
- 16, 89,116,216, 86, 94,252,144,150,162,173, 60, 67,124,184,245,105, 13,237, 51,211,128, 28,210,165, 43, 18,144, 74,174, 99,246,
- 98, 25,138, 41,139, 48,167, 77,130,148,184, 80, 74,183, 26,139, 44, 55,149,130,183, 75,182,202,215,144,232, 90, 20,252,232, 63,
-109, 34, 96,140,197,205,221,243,166, 60,151,239,161, 48,199, 73, 78,212, 20, 66,101, 7, 24,177, 87,169, 24,144, 18, 97, 51,141,
-146,162,229,101,136,168,161,173, 68, 62,135, 85,188,239, 25, 41, 82,133, 55, 21, 37,114, 9,186, 1, 50,143, 43, 37,122,139, 45,
- 92,237, 61,179, 70,215, 81,191,210,242,204,130,129, 46,137,171,132,106, 97, 83,242, 12, 26, 37, 5,131, 4,163, 68,153, 56,148,
- 49,190, 22,182,120,146,181, 73, 12, 17, 33,129, 29,224, 49,114, 19, 17, 35,148,102,209, 33,167, 63,138,163, 33,120,140,219, 9,
-227, 56,114,145, 23, 73,128, 63,133, 22, 23,107,164,111,204, 36,121,247,185,122,151,235, 94, 88, 17, 40,181,130, 38, 36, 6,200,
-132, 16,129, 17,114, 22, 93,219, 11, 83,202, 88,156,231, 92, 4, 41, 40,180,228, 97,144,164,172,165,200,107, 71,183, 44,188,190,
- 72, 9, 70,107, 88, 89,165, 42,226, 8,101, 46,214, 36,222, 84,107, 97, 4, 72,167,173, 24,179,173,165,177,137, 57, 35, 5,118,
- 91,105,207,231,118,195, 4, 19,136,146,128,115, 80,145,175,144,212,195,152,120,228, 78, 87,147,114,193,196, 42,142,120,174, 11,
-118,228,234,117,167,162,123,168, 12,157, 84, 47,113, 94, 19, 36,212, 13,124,110, 66,228,178, 53, 74, 37, 81, 49,177,110,161, 80,
- 60,181,208, 84,147,160,113,115, 74,157, 71, 94, 6, 7, 37, 1,224,195,196, 63, 69,232, 31, 45,254, 53, 71,203, 86,160, 84,254,
-144,243,150,175,117, 45,242,186,153,154,200, 68,248,241, 3,140, 54,242,224,106, 48,117,151,247,135,250,251, 92, 99,129,181, 82,
- 28,137, 90,197, 2,169, 2, 6, 72, 1, 57,166, 43,170,213,188,174, 56,158,207,248,228,147, 79,240, 79,255,248, 15, 48,214,224,
- 50, 3,203,188,224,135, 55,111,112,179,221,226,114, 58,227,238,246, 30,239, 30, 30,241,236,238, 22,199,227, 1, 57,115,144,193,
- 15,111, 56,108,227,249,253, 45,140,230,100,183, 67, 10,252, 48,169, 80, 49,124, 33,202, 1,171, 50, 44,177,253,131,247,214,220,
- 17,236,167, 17, 95,124,254,146,187,246,101,133,243, 30,171,115,112,222, 99,158, 23, 60,157,103, 92, 86,135, 97, 26, 48,159,151,
- 42,108, 98, 36, 33,191, 35,251,205, 14, 65, 34, 71, 75,146, 84,240, 78, 62, 86,170, 94,222, 68,157,207,175,218,216, 84, 83, 47,
-139, 15,149, 36,119,154,186,220,222,162, 71,168,226,189,178,155,145,135, 56, 6, 95, 15,173,146,120,230, 67,224,160, 17, 73, 4,
- 99,101,188,149, 76, 98, 3, 77, 25, 89,196,112, 90, 41,248, 16,184,251,245, 78,186,195,146, 73,200,135,112, 42,233,114,209, 67,
-105,139,213,123,220,109, 6, 92, 60,225,197,118,192,251,243,204, 10,242, 12,172,206,195, 90, 43, 2, 70,233,128,164,195,222, 76,
- 3,199, 71, 26, 30,129,166, 12,134,200,164,140,119, 79, 7, 4, 31,144,146, 97,181,126,193, 92,150,241,121, 12, 32,133, 10,215,
-200, 57, 99, 51, 50,220,227,116, 58, 33,103,194,118,183,199,188, 58,102,192, 23,241, 89, 6, 39,117,169, 38,142,138, 41,202,238,
- 54, 85, 33, 74, 25,103, 59,183,212,125,117,146,220,236, 50, 58, 55,196,214, 46, 2, 48, 24, 3,159, 25, 57, 26, 35,131,145,202,
-184, 54,150,139,134, 32, 74,104,238,218,147,112,219,181,230, 74, 59, 22,184, 8,250,241, 95,211,179,148,180,187, 44, 92,235,154,
- 26, 86,214, 72,229,130,136,237,107,215, 96,152, 46, 76, 40,215,196,183, 46,212,163,246, 32,109,199,220,187,218,169,187,212,251,
-157, 97,155, 42, 40,220,220, 63,131, 30, 70, 97,112,167,234, 57, 71, 77,113,228,152, 94,173, 21, 2, 88,193,142,156,177,174, 43,
-110,246, 59, 40,176,141,106, 89, 86, 25,179, 14,204,254, 79, 9,209, 59,104, 81,187, 19,154, 85, 40, 75,215,162, 42,103,163, 77,
- 60,180,156,184, 53, 85,140,152, 93, 65,226,242, 41, 73, 93,214, 10, 2, 90, 27, 17, 55, 69,172,222, 9, 73, 81,215, 3, 55,201,
-247,174, 74,247,206, 87, 71, 43,152, 20,193,175,190,114, 6, 74,232, 80,142,157,152,145, 0, 23, 50,148,182, 72,171, 19,151, 17,
-225,116,153,241,209,179,251, 26, 13, 42, 88, 66,100, 17, 84,229,148, 96,181,105, 1, 33, 50,237,236,233,128,101,242,163,138,248,
- 67,154, 57, 31, 51,102, 23, 48,141, 17, 67, 8,136,105, 64, 17,153, 23, 86,134,143, 17, 36,116,192,152, 51,116, 52,242,249,146,
-203, 50,178, 88,209,133,136,236,189,172,166, 2, 70,165,112,242, 14, 74,107,108,236, 0, 90, 86,144,181,213, 7,159,138,206, 67,
-208,208, 44,161, 43,133, 48, 95,165, 62, 70,152,168,174, 1, 73, 96,241,156,206, 26,164, 44,131,167, 4,155,173,212,208,197,143,
-182, 72,225,130, 0,230, 13, 85, 17,121,150,140,131,214,101, 23,113, 12, 21, 91,118,161, 41,202, 56,190,178, 21,169,205,162, 83,
- 73,214,236, 52,226,171,231,241,127,145,158,105, 98,215, 80,239, 57,191,106,201, 83, 29, 16, 92, 89,211, 84,226,200,240, 26,217,
-218,157,245, 64,211, 81, 81,199,178,104,217, 46, 4,146,181, 37, 17,193,244,152,200,126, 52, 87,243,132,235,162, 33, 73, 8,193,
-255,199,214,187,252,204,118,165,231,125,207,186,238, 75,213,119, 57, 36,155,108,170,213, 45, 89,105,201, 86, 4, 36,182, 0,195,
-179,252, 11,153,100,152, 12, 50,201, 63,145, 81,198, 25, 4,200, 72, 6, 18,195,115, 79, 50, 74, 0, 15, 50, 14,144, 32,114, 44,
- 7,146, 98,165, 37,183,196,110,178,121,120, 46,223, 87, 85,123,239,117,205,224,125,223,181, 86, 29,167, 1,129, 34,121,120,206,
- 87, 85,187,214,122, 47,207,243,123,234,125,103, 94,123,150,171,236,230, 75,173,248,225,251,183,237,255,151, 68, 45,129, 86,208,
- 10,170,220, 65,238,127,253,155,183, 56,173, 43, 52, 10,126,246,179,223,197, 95,252,219,191,194,211,211, 19, 82, 8,240,207, 30,
-191,253, 91, 95,227,251,119, 63, 96, 93, 79, 56, 63, 61, 33, 70,130,160,196, 24,112, 62, 45, 48,198, 34,196,132,215, 27,117,147,
-203, 60, 3, 12,104,209,198,160, 50, 52, 37, 51,252, 95, 66, 70,180, 82,112,134,236, 86, 95,126,245, 21,126,246,179,223,161,232,
-192, 24, 16, 99, 68,140, 17,251,182, 99, 15, 7,182,235,134, 35, 4,202,240,142, 25,223,189,123,143,203,118,112,230, 52,171,142,
-173,135, 30, 8, 78,205, 62,194,145,124,221,127, 73, 15, 73, 26, 4, 70, 10, 34,232,161, 78, 56, 75, 4,232, 40,138,224,106, 81,
-243,254, 30,149, 18,193, 82, 10,240,122,110, 66, 28, 99, 52, 18, 51,182, 19,219,102,168, 42,142,152,252,140,192, 89,230, 33, 70,
- 56,103, 73,209, 92, 11,239,149,137,121, 94, 43,233, 12, 52, 39, 95,213, 92,218,248, 88,246,200, 70, 43,236,225,192,201, 91,188,
-108, 1, 79,139,195,119, 47, 87,124,249,176,224,117, 11, 4,178,240, 30, 21,192,186,174,164,140,223, 15, 28, 57, 99,157, 60,140,
- 34, 95,112,174, 25,183, 35,192, 92,175,205,122,131, 66,113,157, 97, 59,168,147,147, 24, 88,107, 17, 34, 90, 24,136,124,150,185,
- 82, 39, 69,157,183,195,228,200, 54,103,148,106,251,248,105,242,204,161,206,208,213,182,231,179,121,151,107,129, 82,212, 97, 16,
-222,170,224,118,123,105, 5,133, 17, 58, 89,169, 80,186, 0,204,162, 38, 4, 48,237, 47,139,214,116,241, 72,242, 85,171,223,136,
-225, 96,248, 64, 41,140,220, 84, 50,246, 70, 31, 93,171, 38,122, 67,103,181,139,200,135,165,169,142,189,196, 45, 40, 35,151,166,
-152,183,198,192,232,202,192,143,114,151,216, 38,163, 70, 74,101,172, 3, 99,190,242,185, 87,113,111,164, 25,248, 29,186, 43,234,
-164,131, 80,156,210,183,156, 30,155,118,166,240,206, 81,228,187,109,207,205, 81,188, 52, 49, 99, 94, 38,207, 29, 83,138, 4,163,
-138, 9,218, 16,252, 36,231,132,215,235, 21, 41, 83, 82,152, 98, 30, 57,223,176,109, 10, 37, 24,212, 58, 52, 96, 85,245,194,199,
- 90, 34, 8, 70, 78, 15,148, 78, 42,115, 90, 92,140, 52,249, 17, 61, 3, 29,238,244,221, 82, 3,100,222,218, 14,191, 33,109, 64,
- 38, 53, 61,239,220,229,115,115,198, 52, 71,134, 81, 64, 76,145, 63, 23,162,203,125,184,109,180, 42, 67,207, 23,223, 66,194,236,
- 73,249, 77, 5,189,230, 76,109,210, 60,100, 77, 69, 7,152, 5, 79, 13,153,106,147,191, 60,104, 7, 36,248,163,193,102, 20, 93,
- 64, 71,200,240, 46, 33,198, 8,197,154, 28,197,130,200,148, 9,248,164, 84, 34, 21,181,120,241,229,242, 97,191,124, 46,210, 37,
-179,197, 16,228,149, 39,177, 91, 38,110,252,178, 16,215, 93,194,116,106,234,128, 51,182, 30, 88, 67, 81,168, 57, 69,164, 66,239,
-159,188,150,190, 10, 55,112,142, 52, 30, 33,202, 20,150,214,150,211,180, 64, 27, 10,190, 33,189, 72, 1,138, 38,198,202,192,168,
-175,101, 8, 62,210,125,204, 77,191,160,176, 0,145, 46,248,202,145,171,253, 66, 45, 45,175, 35,229,210, 45,167,124,223, 29, 44,
-206, 61,175,180, 50,208, 10,136,172,235,128,156,219,232, 9,138, 74,163,173,177,251,151,170,182, 76,128,170,208,194,153, 74,237,
- 88,216,182, 38,168,186,175, 77,208, 57,240, 70,107,102, 54,176,250,189,112, 74,144,234, 57,124,119,226,129,222,140,243,206, 66,
-125,178,179,107,254,187,190, 91,255,213,219,119, 3, 52,170, 54,160, 70,101,161,143,226,136, 83, 73,165,223, 67,192,182,111,248,
-252,203,175,240,246,237, 15,248,234,205, 35, 94,247, 3,199,190,147,128,163, 86,108,215, 43, 78,167, 19, 62,188,188, 98,118, 30,
-175, 31, 63,240,174,178,162,234,202,168, 80,242,166,222, 54, 74, 10,115,198, 32,230,204,182, 22, 13, 88, 52, 66,147,116, 79, 90,
-107, 56,239,241,211,159,124,141, 47, 62,255,188,209,145, 10,231,115,199,112,180,128,133, 24, 34,182,219,134,152, 19,126,250,227,
- 47,113,185, 94,241,237,219,119, 56, 82,194, 37,100, 78, 4,226,157, 72, 41,136,145, 50,223, 43,227, 23, 35,139,149,104, 44, 40,
-171, 13, 81, 78, 43,158,136,136, 31,179,171, 33, 75, 21,111, 65,183,186,169, 22,111,152, 90, 22,120,105,248,205,222, 61,228, 54,
-254,164, 48,151,131,177,176,181, 20, 24, 77,130, 29,221, 14, 0,193,127, 26, 78,144, 11,196, 80, 70, 65,226, 81, 23, 21,103, 36,
- 58, 74,165, 98,245, 14,206,210,193,106,173,197,151,143, 22, 11, 99,118,173,247,184,238, 1,111, 30,207,172,226, 4,188,247,120,
- 90, 23,236,220,129,121,235,105,127,109, 72,200,118,217, 14, 60,157, 60,180, 82, 88, 28, 93,188,222, 89, 98,234,167,140, 61, 68,
-108, 33,144,210, 86,174,158, 90,201,161,192, 25,231, 0, 77,102,140,170,136, 41, 97, 93, 22, 28, 44,130, 84, 13,166,128,198,248,
- 46,185,171,109,105, 35, 70, 7, 78,140,177,131, 59,140,161,103,166, 20,238,236,152, 44, 5,178,151, 81,250, 83,109,218, 82, 99,
- 12, 12,239,110,115,173, 77,232, 85, 6, 37,187, 98,166, 58,161, 41,107, 43,232,229, 0,108, 59,119, 40,168, 82, 81, 84,229, 12,
-103,221,254,189,112,173, 59,219,109, 20,164,171, 1,121, 91, 7,176, 5, 90, 28,106, 45, 5, 5,133,158,157, 42,185,117,146,208,
-216,225, 53,141, 8, 57,112,228,141,210, 56, 61, 62,194, 56,127,167,116, 47,165, 52,149,182,209, 36, 78,115,134, 46, 41, 81,102,
- 79, 19,225,130, 61,127,198,211,180, 50,139,157,248, 1, 41, 6,196,120, 32,178,107, 65,181,241,189,106,163,205, 49,143,125,204,
-141, 23, 1,155,116,240, 66,102,108,111,140,136, 97,115, 70,101, 58, 89, 87, 91,179,203,161, 84, 16,245, 55,179,246,196, 54,107,
-160, 99, 70, 70,225,239,130,140,193, 69, 27,209, 9,138, 21,161,228,246, 93, 52,170,226,186, 31,216,110, 87,154, 22, 13,137,116,
- 24,168,121,214, 90, 32,203,121,154, 97,140,130,171,150,200,147, 41,195,185,218, 88, 4,138, 5,128, 85, 66,185,196, 98,201,103,
- 92, 65, 97,252, 49,173, 35,173, 85,228,189, 87, 26, 19,187, 87,172,155, 90,113,152,107,133,202, 5, 85,101, 24, 9,226, 98,157,
- 71,201,185, 61,203,165,208,153, 27, 35,197, 74,167,156,185,232, 39,188,119,142, 7,120,148, 54,192,122,106, 67,200, 74,126,253,
- 94, 50,116,233,172,116,173,229,254,161, 41, 34, 37,216,229, 54,249,180,206,195, 53,108,118,108, 12,127,200,232,188,144,189, 20,
-114, 73, 43,197, 2,109,221,136,167, 85, 38,143,237,251,198,109,116,101,204,115,213, 80,186, 48, 78,150, 39,189, 41,195, 24, 73,
- 68,212, 13,219,189,237,129,152, 34, 90, 67,219,138, 49, 56,101, 44,210, 43,243, 34,148, 82,125,161,143, 49,128, 73, 82,226, 10,
- 7,223, 0,122,200,102, 17,248, 80,235, 3,121,162, 8,165, 80,184,129, 83, 74,195,118, 47, 41,122,158,113, 27, 23,208, 28,163,
-193,237,121,142, 95,107,253,247, 54,106, 66,139, 82,108, 67,249,254,221,251, 33,162,174, 98,242, 14,233, 72,173, 66, 16,152, 64,
-151,228, 3,191,248,229, 55,248,163,191,255,115,188,188,252,128,159,254,228,107,216, 41,224, 55,251, 13, 47, 47,175, 56, 77, 22,
-147,211,248,245,175,127,141,211,233,132, 56,121,192, 88,220, 46, 23, 30, 93, 22,188,251,248,202,126,245,130,121,158,184, 99, 40,
-109,167,110,184,139,157,173,131,225,177,118, 41, 21,243, 52,195,121,135,223,253,233,207,112, 58,157,185,202,162, 92,237,154,137,
- 85,156,211, 65,127, 13, 7,194,105,197, 30, 34,246,125,195,236, 29,106,206,248,187, 95,127, 7,143, 10, 93, 2,110,177, 96, 89,
- 79, 80,214,226,114,121,105, 35, 78,180, 61,150,190, 83, 96,182, 80,132,210, 8,179,204,119, 30,146,177,238, 81, 63, 29, 73, 42,
-176, 19,206,106,215, 76,173,171,114, 97,241, 46, 83,136,128, 68,201, 50,180,143,103, 98,157,216, 98, 70, 92, 48,197, 61, 10, 33,
- 55,226,147, 24,132,126, 88,106, 82, 9, 47,243,132,148, 18,113,194, 25,167, 73,170, 86, 10, 80, 73,185, 32,239, 59,217,245, 56,
- 74, 21, 41,163, 24,131,194, 7,131,181, 6, 47,175, 87,154, 28,228,132, 15,215, 91,155, 76, 4, 93,153,137, 95,176,135, 68,164,
-173, 70,106,162,103,242,121,157, 90,184, 70, 81,132, 9,222, 88,232, 20, 99, 24,226, 14,105,132,103, 21, 49, 21, 84,166, 46,167,
-136,192,180,130, 58, 11,173,241,252,230, 43,188,190,126,192,117, 15,140,223,212, 60,181,200,188,202, 32, 20,174,105,221, 54,119,
-198,232, 57, 8, 90,137, 53,180, 7,168, 80, 33,157, 91, 81,129,130, 86,140,148, 1,213, 92, 80, 90,154, 96, 5, 79,113,164, 66,
-231,195, 41,115,145, 42, 19,148, 82, 43, 9, 12, 75, 29, 22,112,156,176, 37,235, 27,158,158, 33,151, 54,110, 84,131, 26,183, 54,
-170, 91,167, 93,181,231,144, 87, 63,222,121, 76,235,153,166, 67, 60,130,148, 81,171,226, 11, 83,196, 86, 90,107, 98,254,243,152,
-119,157, 39, 42, 12, 45,101, 21,156,214, 21, 74,105,236,251, 13,199,113,176,163, 3,120,185,110, 36,234, 99, 37,127,206,165,177,
-183,197,197, 32, 10,115, 98,194, 15,179, 68,165,238,160, 53,125, 84,193,197, 73, 46,173,112, 46, 37, 33,243,174, 60,149,194, 34,
- 56, 22,162,242,158,217, 72,209,205, 19, 74, 2, 18, 81,145, 72,107, 46,211,105,115,138,137,242,185, 19, 35,107,169, 72, 10,120,
-121,125,193,237,122, 65,201, 52, 57, 74,172,141, 81, 74,227,178,237,120, 56,159, 73, 31,131,210, 46, 51,203,194,189, 82,106, 43,
- 46,180, 42, 80, 50,234, 85, 10,186,240,103, 37,231, 46, 11,230,192,221,252,228, 28, 66, 74,184,110,224,152, 99,131,117,242,220,
-196, 21,120,239, 88,184,215,227,185,179, 42, 45, 54,185,150,202,197,148, 8, 0, 11, 98,166, 93,125,201, 5, 25, 9, 73, 13,126,
- 40,121,243,135, 8, 88,165, 36, 97, 12, 48, 26,240,206, 81, 22,133,209,173, 99, 45, 69, 44,110,186,113,239,181, 34, 45, 78,230,
- 34, 57,198, 3, 33,236,180,106,108,204,133,218,150,215, 52,194, 46,189, 72,173,138, 38,107, 77,212, 41, 38,112,125,103,235, 68,
-243,209, 23,168, 34,152, 88,201, 81,207,195,180, 1, 48,149,206,141,235,126, 96,219, 3, 5, 87, 89, 98, 2,140,214,209,166,201,
- 43, 3,220,102, 72, 82, 84,195,193, 90, 89, 22,171,197,173,165,134, 92, 6,177,208, 50, 54, 87, 15, 86, 82, 89, 67,148,146, 96,
-171,194,112, 73,247,110, 97,132,241,148,161, 67,187,227, 81,202,238, 74,228,253, 85,181, 42, 86, 65,224,254,117, 80,215,162,219,
- 25,248,144, 18, 33, 6, 9,204, 52,190,253,238, 55,112,186, 34,164, 12, 93, 51,190,252,242, 71,248,155,191,253, 6, 63,249, 7,
-127,128, 55,159,125,134, 63,253, 87,255, 26,203,186, 34,131, 82,136,222,190,251,128,211,186,192, 57,139,151,203, 21,147,179,216,
- 66,194,251,151, 11,231, 36, 27, 78, 43,170,200,133,108, 18,203,228, 97,156,198,195, 50,195, 77, 30,251, 30,241,229,231,159, 81,
-228, 43, 42,148, 33, 2,147, 49,142, 31, 98,139, 18, 13, 82,140, 8,168, 48, 80,176,222, 3,149, 85,185,188, 13,207, 49,181, 78,
-238,229,195,206,251,163,202, 59, 61,203,138,242, 1,229, 57,196,235, 81,178,210, 32, 64,108,227, 51,213,190, 32,114,137,107, 53,
-142,135, 84,179,188,167, 24,225,188,130, 42,166,117,126,163,250,218, 25,199,190, 88, 86, 60,151,124,231, 76,248, 36, 80, 23, 26,
- 5, 69,235, 38,206, 1, 84,187, 40,114,225, 0, 12, 69, 40,202, 16, 34, 38, 71,239,179,229, 4, 45,165, 21,246, 24,240, 52,121,
-124,254,249,103,120,185,220, 80,106,193,219,119, 31,240,163, 55, 15,216, 67, 64, 10, 1,207,167,103,188,253, 72,214, 53,227,200,
-210,162,141,133,225, 93,219,245, 8,152, 11,217,161,212,176,226,105, 33, 65, 44, 32,155, 39, 71,112,143,162, 97,144,232,176, 80,
-160, 48,152,148, 80, 83,230,253,181, 99,120,143,106, 59, 81, 25, 21, 43,214, 60,136,175, 25,149, 92, 3,138, 95,187,102,219, 8,
- 44,117,184,198, 57, 56,235,233, 89,102, 81,206,164, 20, 66, 10,208,160, 72,219,156,106,235, 34, 4, 27,217,237, 49,181,137,130,
-232,224,207, 84,141,151,130, 52,160, 87, 85, 11,114, 40,220,241,208,123,159,154, 63,183, 54, 17,164,136,197,208, 44, 60, 84, 28,
-228,210,247,232, 90,128, 50, 3, 67,190, 42,213, 38, 15,141,171, 46,133,190,234,217, 16,214,104,248,121,129,243,115, 83, 29,107,
-238,158,141,166, 78, 82,170, 84, 93, 1,163, 12,172, 38, 11, 84,138, 9, 38,165, 46,244,179,142, 17,200, 7,127,159,142,150,210,
- 23, 66,106, 34, 68,205,193, 65, 70, 49, 54,179, 10,212,139,196,130,164, 68,150,177,124,189, 19, 2, 10, 84, 37,164,220, 18,238,
-100, 77, 65, 56,220,136, 88, 42, 21,102,220,141,122,239,112,219, 14, 56,107, 17, 83,129,213, 64,136, 10, 33, 23, 76,214, 32, 23,
-133,253, 8, 88,151,153,186,225,146, 97,103,143, 16, 2, 9, 48,141,102, 56,150, 2,106, 70,136, 68,138,219, 98, 70, 56, 40,110,
-213, 90,139,135,211, 9,239, 95, 95, 25, 94,100,240,225,122,224,241,225, 1,198, 88, 20, 36,148, 42, 25,244, 12,218,209,160,115,
- 76, 89, 32,101,122,246,121, 20,111,140,230, 66, 69,183, 73,129, 20,121,212, 32,104,212,148,113,196,140, 61, 36, 56,155, 91,226,
- 96, 1,224,141, 25,236,181,250, 46, 75, 64,180, 17,133,207,237,130,202, 62,120,234,208,201,250,168,144, 65,162, 98,195, 29, 37,
-198,203,150, 47,117,173, 85,203,192,112, 66,187,171,154, 3, 89,185,243, 44, 64, 77,145,237,119,134,138,156, 92, 17,143,131,149,
-241,190, 61,227, 34,244, 83,236,167, 31,215, 14,131, 46,123,176,103,143,161, 70,212, 73,169, 65,165, 86,229,247,106,147, 45,197,
-220,143,218,128, 67, 77,129, 94, 53,246, 16,113,221, 14,242,216, 91, 15, 56,203,172,151,193,174,220, 26,238,122, 31, 19,123,175,
- 51, 29, 69,242, 20, 69, 91,129,162, 58,224, 73, 51, 29, 73, 13,186, 55, 93, 53,170, 66,119,120,169,150, 91,219, 93,240,125,220,
-223,187,242, 50,208,148,234, 93, 80,131, 36,208,244,177, 91,142,113,176,112,177, 93, 65, 15,106, 66,185, 52,184, 74,146,145, 13,
- 0,124,255,238, 3,230,245, 12,109, 12,166,211, 3, 62,126,248,128, 63,250,195,127,128,199,199, 71,252,249,159,255, 57,158,159,
- 31, 17,182, 43,188,179,120,251,238, 29,148,162,140,237,183,239, 63,160, 2, 56, 98,230,135,140, 42,206,152, 74, 87,229, 26,131,
-211, 60, 13,251, 73,250, 48,231,217,225,203, 47,127,132,227,216,177, 31, 52,238,203,137, 46,104,233,152,180,236, 5,161,200, 66,
- 86,104, 12,154, 83,194,113, 28,108,145, 1, 85,173,210,101,213,218, 66, 4,140,238,153,202, 93,121, 10, 22, 88, 25, 64, 27,178,
- 71,213,126,105,139, 24, 66,176,189, 98, 47, 86, 90,181,224,151,230,246,101, 65, 79,145, 64, 10,222,195,202, 1,102,140, 37, 94,
-190,177, 44,170, 82,109, 34, 64, 64, 13, 58, 20, 69,188, 37,148,180,194, 94,127, 97, 94, 75, 49, 33,175,175, 14,236,113,205, 29,
-153,128, 25,196, 54,243,122,189,226, 87,191,249, 30, 0,240,254,229,138, 55,143,103,196,152,154, 21,232,253,199, 23,204,204,153,
-174, 85,225,195,229,138,143,151, 43,142, 20,113, 57, 2,230,121,106, 94,124, 84,178, 11,201,207,152, 10,117,200, 70,107,204,222,
-227,182,237,136,199,141,188,177,133, 4, 80,185,144, 7, 89, 0, 18, 84, 28, 8,227,156, 44,109, 50, 86, 78,114, 24, 73,103,170,
- 13, 66, 12,112,150, 66, 46,192,207,130, 4,224, 56,235, 80, 75,130, 18, 92, 46,175,124, 38, 86,241, 58,195,130, 76, 33, 52,142,
-174, 16, 37,133, 9,125,111, 34,167, 14, 54, 97,236,224, 35,150,128, 19, 17, 18, 85,174,234,107,201,236, 39,207, 77,213, 12,142,
-188, 53,252,220,228, 82, 59, 17, 82,119, 5,122, 17,226,149,170, 40,255, 63,192, 13,122,140, 88,108, 36, 43, 3,163,177,156, 30,
-225,253,220,242,182,107, 91,217, 81,225,101, 53,101,121,123, 75, 1, 39, 98, 89,204,185,176,155,192, 1,218, 34,131,118,210,168,
- 9,181, 36,130, 3,233,158, 82, 23, 75, 97,142,119, 38, 78,248,208,241,129,253,193, 21,170, 9, 96, 19, 79, 11, 68, 96, 42,246,
- 59, 25,157, 82, 56, 10, 61,231, 33, 80,250,223,109,219,144, 74,134,202, 36, 88,139,199, 1,239, 12,110, 71,196,100,105, 69, 21,
-195,142,146, 51,110,251,129,146, 2, 82,140,248,120,185,193, 25,131,112, 4,188, 92,174, 48,156, 75,241,241,245,130, 90, 43,142,
- 16,177, 31, 7,142,112,144,245,150, 83, 29,183,237, 74, 25, 11, 21,248,234,139, 47,176, 78, 19,145, 34,173,131,245, 19, 66,213,
-168,156,176, 86, 75,225,179, 64,181, 66,142, 80,173,174,209,227,104, 18, 98, 88, 87, 96,216,210,103,154, 67, 70,137,125, 13,132,
- 96,246,142, 10,160,192, 72,215,170,168, 65,145, 44, 3,111, 45, 44,251,208, 59, 61,178, 83, 23,199, 24,237,204, 23,186,196,236,
-130, 63, 11,161,221,149,114, 63,117,170, 67,113, 10,225,216,131, 58, 91,163, 53,172,163,168,236,156,107,223,147, 11, 4, 45, 39,
-212, 18, 25,229, 91,218, 5, 40, 52,188,145,112,170, 10, 59, 30, 10,218, 93,165, 70, 64, 82, 11,219,234,107,229, 70, 98, 20, 28,
-156,252, 17, 77,140, 9,158, 94,150, 54,177,144, 53, 78, 76, 25,151,125,199,182, 29, 56,142, 3,114, 90,151, 81, 72,174,250,208,
-236,158, 82, 55,200,211,196, 6, 55,174,201,228, 71,226, 9,157,208,249,104,226,168,219,142, 31,114,134, 3,176,181, 73, 97, 74,
-251,225,239,243,227,250,159, 38, 21,189,106, 60,226,254, 11, 75, 79,132,199,175,126,120,215, 70,112,210,255,125,254,252,136,203,
-183,111,161,172, 65,225,177, 6, 1,249, 21, 18,192, 59, 97, 34, 47,253,205,175,190,197,207, 80,177,204, 11,172,159,240,171,111,
-254, 14,223, 64,225,195,203, 11,190,158,103,220,182, 13,219,245,130,175,191,250, 49,158,255,254, 51,254,230,175,254, 18,219,182,
- 35,230,136,203,117,135, 51, 10,181,234, 86, 13,210,131, 6, 68, 22,231,144, 56,142, 34, 84, 95,174, 55,172,203,130,201, 26,188,
-124,252,128,201,123, 76,243, 2,239, 44,188,139,237, 50, 47, 41, 33,199,192, 99, 75, 18,245,164, 82,177,241,135, 41, 98, 45, 53,
-208,146,180,116,192,170, 7, 72,168, 97,119, 78,211, 80, 9,182,200, 29,236, 49,148,110,210,209,169, 97, 50, 34,140, 0,107, 45,
-119, 41, 25, 19,239, 77, 67, 46,208,186,246,189,186, 82,109, 63,111,180,109,213,251, 8, 47, 24,147,185,164,211,211,138, 68,116,
- 34,148, 73,220,133, 9,227,188,109,161, 4,197,168,168,160,209, 90, 35, 38,226,101,103, 30, 13,159,215, 5,147,247,248,225,195,
- 11, 82, 41,120,247,114,161, 74,182, 84, 28, 71, 36, 71,129,181,205, 25, 80,132,101, 80,129,217, 90,196,152,112,154, 28, 98,202,
- 44, 66,161, 55, 35, 55, 15,114,133, 53,116, 89, 79,222, 67,105,141,237,118, 35,193, 17, 72, 52,150, 88,137,174, 77,199,153,210,
-232,154,133, 81,232, 7, 79, 44,153,105, 97, 6,235,249, 9,111,127,248,182,249,148, 81, 42, 66, 45,152, 45, 21, 94, 33, 28,176,
-126,110,187, 45,111, 13, 98, 74, 48,214, 66,167,132,204,187,126, 26,145,131,225, 32,108, 75, 42, 93, 8,153,219, 23,141,198,124,
-168,104, 96,160,177,211, 25,230, 51,180,207, 76,137,127, 63, 61, 76,188, 4, 92, 84,219,174,182,125, 23, 43,165,138,117, 63,110,
-143, 43,109,176, 47, 53, 68,185,242,159,105,140,193,178, 44,128,182,221,226, 83,105,114,162, 5, 85,170,137,255,175, 80, 27, 12,
-232,225,241,220, 70,163,198, 26, 56,231,113,185,110, 72,145,227,147,181,134,213, 84,180,169, 22, 55,201, 98,202, 84, 48, 57, 71,
- 96, 26,177,101,138,202,152,211,201,210,113,112,129,101, 73, 36,201, 98,201, 24,201,105,145,249,121,206, 85, 70,198, 9,123, 72,
- 88,188,197,118, 36,156,103,139,215, 91,192,227,105,198,245, 72, 88,103, 79,188,138,201, 33,196,128,253,136, 56,207, 30, 33, 87,
-226, 49, 88,131, 61, 38, 56, 69, 89, 16, 71,169, 88, 44,137,244, 46,151, 27,188,161,207,229,122, 4, 10,199,169,192, 37, 68,120,
-163,240,114,219,120, 23, 77, 52, 71,103, 12, 38,111, 97,140,133,159,102, 56, 71, 58,148, 61, 74,248,140,186, 67,148,106,254,238,
-217, 22,136, 66,235, 45, 69,227, 11, 24, 13,100, 46, 2,154, 18,190,246, 96,242,156, 51,252, 50, 33, 36,254,142,105, 3,205,127,
-182, 1,211,235, 88,231,129, 70,255,148,243, 93, 67,229,220,110,164,194, 23,106,230,248,227,202,130,194,102,227,226,253,119,225,
-221,187,106,162,179, 46, 30, 43,181,112,192,140,130,174,108,127,227, 8,214,194,218,162,152, 34,117,242,138,238,136, 59, 20,113,
-115, 0,220,143,247,235, 48,106, 86,227,115, 62, 56,188,106,233,209,169,252, 70,210,141, 89, 6,222,122, 37, 96, 16,117,241,165,
- 53, 79,133,113,123,149, 57, 31,185, 84,220,246, 8,111, 15, 88,231, 48,159,106, 79, 82,227,203, 88, 86,133,247, 98,243, 33,177,
-176, 18,184, 13,172,218, 87,162,232,107,197, 89,109,217,220, 85,201, 12,142,213,210,195,152, 95, 85, 5,171, 84, 33,127,106,187,
- 4, 10,127,225, 63, 77,141,169,189,122,151,176,146,134,216,171,119, 93,196,235,229,134, 33,191, 30,181, 86,204, 12,140, 40, 60,
- 90,195,200,174,101,197,119,209,252, 1,161,226,155, 95,127,143,217, 19, 69,108,158, 60, 74, 78,164,142, 55, 22,179, 51,176,206,
-226, 79,255,245,191,194,215, 95,253, 24, 63,249,250,107,252,221, 47,255,154,236, 71, 57, 35, 6,234,204,102, 71,249,198, 25,180,
- 19,115,154,118, 74,226, 27, 14, 41,227,171,207, 30, 81,114,193, 15,223,191,197,190,109, 88,215, 21,203,178, 99,158,103,120,142,
- 31,212,108,109, 74, 33, 0,204, 16,223,246, 29,219,190,227,195,135, 23,220,246,157,252,167,106, 56, 16, 7, 63,177,101, 79,167,
-110,151, 9,239, 43,121,196, 37,157,180,224, 35, 49,120,213,101,202,160,161, 33,171,146,204,129, 30,149,253,237, 78,107,196,156,
-250,239, 63,232, 36, 10,143,148, 51,143,234,172,238,184, 70,153, 86,210,196,132,118,171,140,142,110,233,104, 2,175, 48, 90,119,
-245,190, 33, 15,182, 36, 65, 41, 5,196,148, 49, 47, 14, 49, 38, 44,203, 4,203,145,181, 91,136, 52, 61, 41, 7,142, 24,241,163,
-231, 39,236, 97,199, 22, 34,140,211,220,225, 68, 74,126, 74,192, 30, 35,150,201, 99,114, 6,219, 78,233, 80,214,104,220,142, 64,
-106,219,148, 91,199, 64, 9, 84,156, 65,175, 20,121,238,133, 15, 94, 42,140,120,129,121, 28,172, 26, 85,138,222,203,204, 93,174,
-224, 91,101, 47,173, 53, 97, 68,231,121,197,135,119,223,113, 72,132,236,180, 20, 78,203, 76,151,136,210, 28,205,203,169,106,149,
- 58, 81,239, 44, 82, 56, 48,123,139, 92, 40, 86,179, 42,133, 34, 62,117, 14,180, 49,176, 45,156, 36,151,218,255,140,218, 71,119,
- 85,152,227,165, 48, 38, 82, 49,141, 75,241, 10, 97,132,172,160, 77, 79,138, 56, 86,134,110,191,160,231, 59,116, 27,208, 56,251,
-171,172,102,239,133,168,209, 26,147,159,136,143,103, 29, 19, 19, 89,108, 84, 50, 52,104,175, 56,115,150,116, 46,153,186, 61,231,
-176,178,184, 48,165,130,231,211, 3,142, 72,218,137,112, 92,169,243, 82, 10, 78, 43,236,219,214, 20,207, 90, 91,164,170,160,236,
- 4, 93, 35,128,138,144, 43, 20, 10,182,148,219,229,150,148,134,202, 1,161,144,154,254, 8, 1,149,225, 75, 65, 91,120,171, 16,
- 34, 61, 59,175,219,129,217, 25,220,246,131,146, 25, 61, 61,215,139, 5,182, 88,241,124,154,177,199,136, 89,211, 81,169, 75,134,
-170,116,129, 60,159, 39, 98, 58,196,136,211,228, 1,165, 16,142, 13,126, 93,145, 75,129, 43, 17,214, 44, 56, 66,130,169, 25,235,
-180,226,229,118,224,121,241,120,185,109,136,176,200,199, 14,227, 44,139,186, 72,202,246,229,231,111, 48, 79, 14,206, 26,172,211,
- 4, 59,209, 58, 67, 27,141,203,145,240,188,122,154, 32, 40, 78,154, 43,125, 82,103,172,129,149,142,185,212, 33,214,185, 54,101,
-184,240,233,179,234,240, 52,210, 90, 84, 56,246,235, 67,105, 76,156, 72,105,137,125,203,142,132,122,215,215,213, 82,161, 12, 11,
-165, 83,109, 54,204,194, 13,109, 46, 5,208,166,165,112, 86, 94, 67, 81, 39, 95, 26,211, 66, 13,164, 70,113,157, 0,164,205,200,
- 42, 53, 5,127,206,149, 62,207, 22, 84, 67,147, 7,173,249,210, 86, 68,199, 44,220,141,183,100, 93,213,253, 26,205,108, 60,104,
- 74,100, 63,174, 26, 66,121,104, 59, 11,229, 29,140,247, 59, 64,147, 26, 90, 23,243,157,167, 10,235,237,244,128, 89, 38, 49,238,
-117, 15,176,238,192, 57, 4,152,101,161,247,130,243, 8,218,189,171, 56,140,101,128,216,180,197,119, 81,253,226, 87,146,209,221,
-140,229, 45,159, 69, 53, 29, 86,189,183,158,202, 4, 75, 46,240, 90, 49, 92,210,140, 29, 28, 47,118,137,107,172,221, 8, 79, 23,
-119,225, 15, 25,205,250, 48,207, 83, 19,101,137,159,215,123,199,221, 12,141, 60,107,227, 33,211,135,158,249, 3,148, 57, 97,173,
- 25, 71, 82,152,188,103, 62,188,131,137, 17, 87,142,108,253,171,191,250,127,145, 82,193, 47,191,249, 6,127,251,205,175,218,184,
-247,113,246,120,158,167,230,103, 6,123,248, 68, 1,110,161,145, 77,133, 50, 6, 70, 43,252,223,191,248, 59,252,211, 63,249,167,
-248,239,254,155,255, 26,167,243, 9,231,135, 7, 78,105, 59, 99,158, 23,204,147,231,221,106, 65, 14, 17,202,104,236,183, 13,215,
-109,195,251,247, 31,240,238,195, 7,236, 49,183, 7, 93,250, 72, 34,209, 17, 3,185, 12, 84, 47, 73,231,209, 74,118,180,106,232,
-124,234,176,111,186, 79, 9,234,251,150,145, 37,204,239, 47, 91,170,246, 16,238, 46,242, 42, 33, 23,124,249, 23,142,203, 76,146,
-254, 54, 40, 41, 32,251,255,198,254, 23, 49, 16, 93,156,198,232,118, 32,149, 82, 16, 7,155,199,236, 72,236,243,122,221,240,197,
-211, 3, 85,222,138, 58,147,199,117,225,232, 76,138, 90, 13, 41, 98, 63, 34, 78,203,132, 82, 50,231, 46,159,145, 82, 66, 58, 2,
-188, 49, 56, 34,229,197, 75,183,153, 21, 29, 14,130,221,140,108, 21,234,143, 60,112, 90,166,246,207, 66,140,176, 28, 71, 91,107,
-197, 17,201, 42,132,193,129,173, 21,241,175,139,132,109, 72,241,165, 74,227, 69,111,251,141, 25,240, 29, 59,170, 0,130,166, 56,
- 11,173,137, 96, 87,106,133,117, 11, 97, 56,115,228,192, 6,133, 24, 73, 76, 69,192,156, 8, 47,116, 45,222, 3, 75, 64,135, 28,
-112,226,139,111,105,137,106,180,153,245, 73,141,102,231,130,192,132,170,136,222, 24,140, 34,227, 69,201,209,238, 25,206,232, 69,
-139, 22,102,127, 39,147,169, 65, 36,167,248, 51, 83,154, 44, 72,206,186,102,123,166,181, 69,110,207,168,211,180,139,181,236,157,
- 50, 90,147, 69,204,121,104,237,224,108,193,135,143, 31,225,173,193,117,219, 88, 64,167,224, 29,217, 80,193,171, 49,173, 12, 66,
- 34,161, 80, 42,133, 70,242, 85,195,148,128, 35,102, 82,201,103,114, 30,164,180,147,127,149, 31,210, 10, 0, 0, 32, 0, 73, 68,
- 65, 84,187,100,236, 0, 38,107,176,237, 59, 38,103,145, 34,225,140,105,215,236,224, 84, 65, 74,192,121,246,136, 49,194,121,143,
-151,235, 13,211,121,197,137,191, 47,179,115,152, 39,135,215,203, 13,167,117, 70,229, 80, 33,109, 44, 82,140,120, 62, 45, 36,228,
-188,238,120, 58,175,136,185, 32,196,136,167,211,140, 92,129, 20, 54, 60, 63,156, 41,181, 16, 25, 86, 89,156,188,195, 15,175, 55,
-172,206,226,221,245,218,198,209,206, 90,204,206, 81,102,185, 49,248,241,103, 79,120, 23, 0,235, 92,155, 42,228, 10,122,125,181,
- 12,163, 89, 22,186,114, 90,163, 76,147,169, 24, 76,173, 8,211, 28, 24, 69,186,139, 2,209,207, 17, 15, 32,224,180,204,208,198,
-146,248,204,123,248,105,130, 99, 40, 76, 23,218,149,230,130,170,181,182, 73, 98,169, 29,230, 83,185,137, 17,207,128, 54,150, 41,
-154,188,167, 79,137,214,119, 74,144,221,170, 65,125,122, 8, 17,159, 77, 60,254, 79, 49, 96, 59, 54,134,242,128, 38,126,165,175,
- 23,219,137,197, 52,183, 34,221,184,174, 32,193,123, 97,109, 87,103,118, 87, 62, 51, 85,237,214,205,182, 82, 82, 60, 77,173,162,
-116,231, 98,160,244,219,189,138,130,121, 92,135, 53,138, 93,109, 13,198, 30, 19,220, 30,112,221,118, 60,174, 75, 71, 4, 15,235,
- 2, 85, 63, 69,173,247,243, 94, 98,185,101,253, 47, 1, 75,212, 8, 83, 3,172,180,106, 97, 49,237,252,191,211, 69, 1,150, 82,
-194, 36,244, 93,212,196,138,163, 6,201, 10,160,238,193, 86,141,123,219,246,238,124, 8, 20, 30,245,124,254,217, 19,229,107,139,
-161,159,127,216,117,242,184,134, 76, 63, 28,143,131,132, 3, 45,121,227, 26, 68,229,209,138, 30,204, 35,105, 28, 49, 32,199, 13,
-251,113, 96,223,247,187,188,102,137,172,252,217,211,153, 15,137, 60,228,241,178, 56, 68, 84,178,170,194,104,234, 34,254,179,255,
-252,191,194,229,242,138,255,231, 47,254, 28,255,236,127,252,103,120,123,221,241,254,182,227,252,254, 3,150,121,194,249,241, 17,
- 15,143, 79, 56,157, 78,112,222,209,232,137, 69, 82,151,235, 5, 47, 47, 87,188,253,225, 29,174, 91,160, 46, 75,198,230, 21, 61,
-120, 65,117, 50, 87, 29,246,169, 35, 77, 78, 84,188,134, 49,127,119, 27, 15, 40,124, 26,124,213,212,201, 2,243,104, 35,227,114,
-167, 4,110,252,128,150, 5, 79, 69, 78,228,206,116, 92, 21, 64, 49, 16, 72, 41,164, 34,182, 20,122,152,168, 75,160, 75,214, 26,
-141, 90,128,204,236, 98,241,221, 30, 49,193, 57,131,213,211, 36, 68, 70,175,235, 50,225,118, 28,152,189, 71,204,137,189,176, 21,
-231,117,193,182,111,152,167, 9,251, 65, 35, 78,137, 19, 77, 92,228, 29,252,165,158,188,197, 30, 83, 91, 13, 88,125, 31, 93, 43,
-187,245,135,117,198,118, 4,196, 16, 73, 24, 23,248,231, 8, 17,147, 51, 60,210, 67, 27, 83, 11,112,195, 90, 10,243,209,140,127,
-117,206,145, 23, 55, 23,196, 18,176,174, 79,216,143, 31,136,106,199,187,218, 82, 51,226,177,195,157,206,188, 99,231, 80,143, 68,
- 23, 78,137, 17, 90, 89, 88, 21, 49, 79, 14,241, 40, 48,172, 44, 78,137, 50,234, 69, 61, 76,252,125,141,217,211,184,183, 98, 24,
-131,183,103,160,119,213, 77,179,144, 41,228, 36,151, 65,140,202,107, 3,136,141, 81,201, 78, 82,194, 74,200,173, 32,250, 23,169,
-241, 75,243,241,150,102,169, 90,150,149, 14,114, 77,177,150,149, 71,142,214, 57,134,160,144,112,212, 59,178, 33, 82, 32, 11,189,
-135,211,188,208,158,151,131,146,114,205,152,189, 7,180,198,156, 61,106,205, 28, 79,155, 57,222, 23, 40,138,118,239,215, 35, 81,
-151,150,104,213,229, 13,133,215,156,103,143, 84, 56,201,139,215, 44, 71, 56,160,181,197,108,136,176,118,158, 39, 92,247, 3,167,
-153,158,171,105,158,112,132,128,101,242, 72, 41, 34,102,131,211, 66, 59,236, 55,231, 21,218,104, 88,109, 48, 77, 52,129,216, 67,
-196, 52, 81,103,174,141,129, 6, 17, 40,189, 51,109,173,116,158, 61, 82, 78,212, 61, 42, 74, 9, 67,206,120, 88,102,172,243,132,
-247,215, 29, 95, 60, 63, 34,166,136,237,168,248,226,188,210,148,230,122,107,252,239,175, 62,251, 12,147, 39,210,226, 50,123, 40,
-173,240,195,118, 33,221, 13, 79,209, 46, 91,192,105,246,200, 37, 33,243,101,147,217, 62, 44,246,202,146, 51, 52, 79, 39, 50,147,
- 46,149, 50,100,173, 42, 26, 58, 43, 82, 92,215,222, 83,118,165,189,106, 5,128,117,174, 89, 70, 43,135, 61,213, 90,128, 82,155,
-102,170,100, 98,181, 23, 89,123,105,158, 62, 85, 64, 25,139,196, 43,192,194, 57, 26,134,159, 15, 81,179,151,220, 5,152, 45,131,
-189,170, 6,220, 34,189, 67, 66, 56, 2, 82,228,149,210,224,238,168, 82,176, 14,187,239, 34, 29, 48,120,218,172,121, 47, 32,150,
- 25,213, 5,121, 21,133, 70,218,172,128,215, 85, 13,212, 84,137, 9,238,246, 49,136, 95,157,125,234, 90, 20,245,247,169,230,141,
-168, 42,216,216, 35, 38, 92,182, 13, 15,249,113,252, 6,247, 96,211, 58,240, 95,152,224, 40, 64, 25, 45,150,201, 86,188,117, 38,
- 4, 77, 42,116, 43,224,169, 63, 54,205,165,161,153,222,167,181,129, 21,164,162,236,253, 1,121, 8,208,240, 55, 69, 13,162,129,
-118, 64,244,101,126,109, 93,124,109,187, 20,109, 44, 83,213,232,141,248,246,251,183,248,234,203, 47,240,139,111,126,211, 42, 12,
-249,144, 69,224, 81, 89, 80, 86,147,228,236, 82,117,104,172,163, 23,236, 22,248,133, 70, 88,198, 90,250,231, 74,195,234,130, 21,
- 7, 42, 20,156,169,109, 7, 44, 2,183,204,187, 45,217, 42,124,246,197,151,248,135,127,252,143, 81, 43,240,217,163,199,255,240,
- 39,127, 66, 44,112, 5,132, 82,177, 95, 54,124,255,122,195,242,221,247,120, 60,173, 88, 78,167,246,166, 42,165,176,237, 59, 94,
- 95,175,184,222, 54,196, 74,157, 69, 22, 85,130,238,156, 99,213,231, 66,173,115,175,181,171, 65, 85,237,226, 57, 25, 83,141,204,
- 2,121,111, 69, 41,143, 90,239, 30, 42,241, 45,210, 1,164,137,221, 95,251, 94,214,114,113,145, 89,180, 24,115,102,241,148,226,
- 72,214,220, 5,111, 32,113, 85,206, 93, 43, 81,106,133, 98, 33,140,145,128, 12,213, 69,114,154, 5,142, 34, 56,148,241,102,169,
- 6, 33, 18,237,205, 26,162,218, 57,107,240,186,109,208,218,224,181,100,172,222,226,114,219,105,199,204,127,214, 17, 35, 61, 59,
- 74,225, 26, 19,172,162, 17, 42,106,223,233, 11,226, 22,237,231, 6,243,169,121, 50,227,232,153, 48, 77, 1, 12,114, 21, 12,220,
-110,180, 52,188,138, 16, 99, 3, 61, 80,130, 27,216,207, 76, 7, 95, 8,148, 45, 63,207, 19, 65,141,166,137,136, 95,154,172,126,
-214,204, 80,218,162, 64, 83,247,174, 42, 98, 41,112,222,195,164, 0, 99,200,218, 69,147, 7,250,112, 73,123, 64,135,136, 4,211,
-212, 65,116,104, 56, 86, 85,190,176, 49,215, 65,143, 97, 90,250, 87, 25,220, 37,130, 99, 46, 50,238, 99,213,174, 80,178,212, 39,
-216,231, 58, 64,109,154,128,135,191, 47,218, 24,130,165, 24, 75, 59, 79, 69,226, 63,165,250, 68, 45,197, 64,240, 16, 99, 9, 39,
-106, 12,139, 48, 53,180, 50, 56,157, 86, 28,251,134,219,245, 21,235,186, 96,158, 61, 94,175, 27, 61, 19,202,114, 58, 32, 77, 99,
-156,181,152,252, 68, 43,168, 18, 96,107, 66, 42, 25,159,159, 23, 92,182, 3,231,217, 67,107,131, 55,143, 39,188,125,255, 1, 15,
-231, 21, 49, 70,156,150, 5, 53, 39, 34,153,105,141, 35, 85,124,241,120,194,245,136,248,252,249, 1, 31, 94,111, 56, 77, 30,123,
- 8,248,236,249,169,225,160, 83,164,255,102,154,124,227,188, 91, 80,164,242,228,108, 91,179, 36,134,161, 56,107,113,196,222, 9,
- 63,156, 86,132,148,225, 45,189,247,126,158,144,115,193, 30, 19,158, 79, 51,165,251, 57, 15,173,118, 84, 20,188,125,221, 26,207,
- 67,105, 42,128, 28, 63, 67,214,104,156,102,143, 55,179,193, 1,210,167, 40,208, 57,116, 82, 26, 25, 6, 25, 25,170, 20,164, 66,
-151,139,124, 70,198,218, 86,239,147, 71,220, 52,168,137,102,237, 14,165,187, 73,206,108,109, 43,172,197,235, 54,189,212,138,196,
-191, 90,162,217,134, 14, 83, 46,245,156, 50,160, 57,102,186, 84,168,196, 72, 89,110, 28, 98,224,194,220, 80, 16, 76, 75,249, 51,
-150, 71,229, 12,134,105,142, 21,141, 10,141,156,169,136, 67,230,213,132,136,216,208,155, 71,250,145, 74,115,121,168, 97, 85, 38,
- 23,164,110,145,162,159,108,171,185,241, 84,124,177,107,233,184, 71,140,106, 37,174,126,139, 21, 20,180,172, 64,154,134, 81,126,
-155,102,214,193,144, 54, 8, 69, 83, 38,142, 70,179,159,181,177,191,106,171,229,170, 70, 42, 28,189, 23,154, 53, 34, 18, 64,166,
- 4, 83,141,123, 13, 80, 5, 37,141, 26, 94,113,105, 99,155,187,131,238, 92,206, 83,239,106,103, 81, 75,143,249,178, 67,165,223,
- 8,115,244, 34,202,157,136,142,127, 77, 1,148,202,248,195,159,255, 61,252,233,159,253, 27,196, 72,148,161,183, 31, 62,226,241,
-241,177,139,193, 84,109,170,206, 82, 50,140,241,124,152,101, 82,113,231, 2,104,139, 90, 18,127, 86,180, 75, 51,206,163,216,218,
-222, 20,234,242,193,193, 23, 26,206,160,161, 50, 45, 23, 10, 95,124,253,219,248,240,155, 95, 35,101, 42, 88,190,250,241, 79,240,
-211,159,253, 46,126,253,171,191,195, 63,252, 71,127,140,117,158,144,114,129,211, 10, 86, 1,123, 37,161,198,199,152,241,238,221,
- 11,212,187, 23,156,140,134,103, 11, 87,226,120,211, 80,137, 30, 84, 0,234,212, 89,165,216,212,254,181,131, 81,148,238,149,225,
- 56,250, 38,232, 75, 31,207, 75,113,166, 6,240,140,102, 26,156, 30,186, 83, 35,122, 4,213,133, 84,210,165, 41,190, 32,146, 6,
- 20,179,238, 69, 88, 83, 25,172,211,252,147, 3, 81, 48,243,133, 89,134, 47,134,120,173,115, 45,132, 33, 29, 28, 18, 50,250, 19,
-232,132,140,227,143,152, 48, 59,139,143,151, 27,188, 53,152,188,195, 17, 2,188,115,168, 74,195, 26,133,237,160,172,114, 36,234,
- 12, 73, 81, 90,145, 10, 37,117, 25, 5,132,148,219,207,104,141,198, 30,115, 75, 24,202,181, 14,244, 46,219,160, 50,214,106,132,
-144, 88, 11, 64, 7,114,229,157,191,200, 75,156,181,208, 70, 97,191,221, 26,157, 79, 10, 46, 45,130, 31, 30, 57, 78,126, 65, 41,
- 87,118, 1,208,151, 48,134, 29,126, 93,144, 99,198,142,128,101,177, 4,231,137, 9,211,178, 16, 23, 59, 70,102,131, 43, 44,147,
-167,209,227,141,216,223,109, 21,100, 8, 40, 67,193, 20,181,143, 82,209,179,205, 1,153, 94,141,249,232,156, 65, 62, 36,138,145,
- 40, 72, 48,186,242,175, 74, 19, 76, 10,252, 73,252,210,141,237,206,234,104,153, 90, 76,158,186, 91, 41, 98, 41,225,203, 64, 91,
-234,228,228,125,151,168, 84,241,171, 91,231,145, 18,197,228,150,156, 8, 26, 19, 3, 78,235,130,243,105,109,216,227,219, 22, 97,
-103,135, 20, 50, 98,136, 80, 74, 97,101,173,204,118, 4, 76,134,132, 29, 79,235, 12, 40,133,199,211, 2,231, 39,242,184, 3,120,
- 56,145,136,117,153,102,236,251, 6, 24, 15,203,235, 1, 99, 2,166,105,166, 49,173, 50,120, 88, 39,148, 82,241,252,248,128,201,
-123,196, 68,138,119,205, 23, 15, 61,243, 20,144, 82, 75,101,159, 57,237, 60,215,101,197,245,122, 33,199, 3, 23,207,206,218,198,
- 89, 55, 80,168,204,172,207, 57, 99, 93,102, 14, 26, 50,176, 90, 97,223,119, 60,174, 51, 50,128,191,253,225, 35, 61,223, 74,225,
-249,180,144, 45, 47, 39,160, 26,254, 43,240, 48, 83,142,193, 50,205,188, 34, 49,136, 89,224, 49, 26,145,185, 17,161, 18,156,197,
-242,231, 67,233, 94, 52, 37,169,182, 55, 2,122,252,108, 21, 69, 47, 75,243, 21, 98,196, 92, 11, 19, 38,115,187,128,181, 54, 80,
-102,128,243,176, 35,134, 8,141,212,153,155, 10,158, 90,154,214, 9,151, 90, 80, 20, 5, 99,249,229,140,196,251,112,210, 75,229,
-158,113, 78,194,150,134,137,142,113, 39, 4,112,206, 13,220, 83,219,153,216,169,105,149, 3,174,132,165, 65,113,182, 24,114,214,
- 11,255,122,225,189, 15,235,171, 65,176, 61,102,138,246,196, 52,158,134, 22,197, 59,245,218,211,213,138,106, 4,197,170,250, 20,
- 64, 13,171, 49, 42, 39, 74,107,106, 69,131,148,115,134,182,102, 8, 57,173,237,181, 55,212,171,104,213, 36, 20, 74, 10,149, 90,
-251,101,222,209,240,212,192, 88, 2,108, 73, 81,231,156,135,226,105,106,201, 25,185, 36,194,196,202, 40,151, 68,112,188, 83,175,
- 84,101, 20, 54,238,183,117,124, 29, 86,243,194, 37,144,241,135,146,124, 90,224,244,248,136,117, 93,113, 28, 59, 50,119,154,223,
-124,251, 29, 71, 70,162, 69, 42,118,240, 74, 65, 98, 79,176,196,235, 37, 17,131,112,101, 45, 44,121,140,208, 9, 5, 76,134,140,
-253,164,164, 52, 45,129,138, 68,130, 26,143,235,138,221, 89, 20,147,145, 50,240,147,159,253, 46,230,105,198,223,254,205, 47,240,
-215,191,248,183,172, 38, 37,177, 30,241, 43, 10,119, 98,157,179,254, 62, 22,212,144,219, 4,252,249,249, 25,251,235, 11,229,126,
-215,218,115,209,107,101, 6,111,151, 91, 54,130,209,184, 35,191, 11,188,225,157,212, 64, 18,211, 80, 72, 53,195,192, 32,183,148,
-174,238, 89, 46,165, 80,212, 95,209, 48,134, 95,247, 56,194, 23,177,149,136, 90,184,203, 32,113, 21, 95, 21,181, 54,229,244,221,
-222, 30,184, 3, 12,169, 97, 31, 43,171,170, 81, 49,159, 11,237,173, 79,243,132, 35, 70, 24,165,240,178,237,236, 3, 46,184,110,
- 7, 82, 46, 56,175, 10,208, 6, 70,129, 59,247, 29,150, 21,192,215,237,160, 85, 1,128,203,182,243,136, 92,181,144, 19,161,255,
-149, 49, 65,144,255, 58, 25,221,196,133,228, 74, 40, 28,118,131, 6,225,137, 53,183,231,198, 26,138,130,212, 28,114, 67, 99, 61,
- 98, 82,151,220,125,193,214,159,176,111,215,214,185, 89,165,219,100, 34,196,132,117, 61, 33,198,140, 28,105, 47,255,252,244, 6,
-183,235, 5,161, 84, 60,174, 43,226,126, 67, 44, 26,181, 36, 24,198,241,230, 82,161,106,193,118, 36, 88,230,158, 91,205, 1, 50,
- 60, 50,180, 28,132, 2, 6,226, 24, 30,171, 10, 19, 60,198, 30, 38,116, 39,123,225,226, 87, 86, 99,170, 3, 78, 71,237, 83,163,
- 25,130, 59, 1,203,170,116,163, 53,182,125,231,110,139,248,230,203, 76,164,177,154, 41,117, 80, 43,133,144, 51, 60, 91,172,150,
-229,132,201, 79,120,121,253,200,124, 10, 71,202,243,201,163,150,140,201, 79,184, 92,111,188, 59, 87,152,189,109,175,115,246, 30,
-206, 19,124,134,194, 80,136,136,232, 12,117, 45, 4,103,153,225, 24,173,250,241,229, 5,206, 26, 76,211,140,152, 18,230,105,110,
-103,200, 17,104, 87,156, 11, 5, 26,197, 40,182, 69,154, 4, 30, 33,192, 89,141,253,200, 72, 57, 97,241, 19, 66, 32,182,251, 60,
- 79,208, 86, 53,230,118, 5,112,236, 27,102, 79, 90, 17, 40, 13, 63, 77,168, 57, 99, 89, 87,164, 24, 97,157, 69,136, 36,160,164,
-105, 84,194,105, 89,136, 89, 63,123,104, 40, 92,142, 3,151,253,224,223,147, 14,236,137, 83,225,196,121,146, 82,230, 80, 27,141,
-124, 92,145, 52, 37, 8, 22,165,112, 48,135,157,138, 10,158, 8, 50, 35,221, 14, 88, 97, 99, 20,211, 1,105,124, 47,110, 31,137,
- 44,197, 40,208,229,152,213, 35, 4,156,214, 21, 49, 6,236,251, 78,201,119,222, 55, 75,161, 42, 36,207,173,154,247,215, 80,172,
-180,231,201, 32,175, 53, 75, 37, 43,166,214,180,226,154,153, 89, 95,161, 7,125, 20,113,238,101, 79,188,239, 59,114,206,136, 28,
-155,122,196,132,117,114,173, 32,117,198,176,171,172, 23,186, 48,181, 43,104,106,109,177,212, 66,170,147, 11,189,123,135,244,253,
-206, 82,186,230,238, 23,101, 93,221, 24,193,170, 58, 26, 22,221, 42, 6,173,201, 38,167,199,220, 3,180, 38, 10, 69,245,169, 42,
-223,167, 33,101, 44,214,245,188,148,150,221, 49,240, 73,196, 17,197,127,165, 63,132, 41,144, 76,252, 19, 2,171,102, 97,116,183,
-197,113,126,122,166, 96,164, 90,114,211, 80,233,202,251,147, 50,140,220, 43, 87,252, 5, 5,170,160,253,181, 14,194,183,210, 70,
-241,165, 51,224, 57,192,163,242,190,252, 15,127,255,247, 49,207, 75, 3,205,239,199,209, 46, 57,185, 45, 36,140,163,121, 43,249,
- 3,147,236,242, 50,112,171,197,199, 92, 7, 33,135, 82, 10,154,225, 23, 90,107,172,222,176,103,153,124,197,203,100,112,121,251,
- 43, 44,142,144,136,222, 24,124,249,213,143,241,250,242, 17,255,229,127,241,159,226,247,126,254, 31, 96, 50, 6, 15,243,132,197,
- 25, 14, 43, 97,203, 12, 39, 72,201, 59,169,249,242,248,131,159,255, 62,172, 49,116, 24, 13, 23,161,225,195, 71, 53,206,175, 30,
- 20, 78,117, 72, 82,234,227, 82, 61, 80,220,104, 36,213,127,141,248,140,123,114,151,238,224, 2,238, 86,129, 30,226,208, 50, 98,
-198,117, 8, 48, 60,248, 3, 74,147, 61,166, 24,118, 56,133,237, 54, 90,245, 64, 8,163, 21, 83,177, 84, 35,207,201,175,175,165,
-103, 82,107,165,112,217,246,198,111,214, 12, 71, 1, 20,230,201,225,205,211,185,173, 1,106,173,148,196,102, 45,127,201, 15, 44,
-179,103,174, 64,102,191, 43,253, 90,201,176,142,185,116,234, 93,237,206, 89, 98,160, 83,215, 18,142, 3, 49,101,134,223,116,228,
-102,173, 21,147,103, 97,144,179, 0,143,143,115,206,156,222,212,169,134, 80,236,241,182, 6, 95,255,228,231,152,215, 7, 82,167,
-199, 64, 35,105,109,176,172, 11,172,113,109, 85,146, 51,113,243, 67, 12,168, 90,225,179,199,167,246,126,205,211,140,156, 18, 82,
- 5, 17,216,172,109, 2, 55,203, 84,168,156, 51, 79,149,216,101,145, 18, 93,246,204,149,151, 12,113,103,109, 27, 1,214,129, 32,
- 39, 29,181, 26, 56,223,149,159,185, 86, 36,170, 10,163,113, 31, 62,162, 20, 38,239,240,252,244,140,121,154,120,228,110,218,175,
- 95,167,137, 94, 27, 83,205,188,179,240, 70,227,228, 61, 30,206,103,172,203, 10,141,138,151,151,119, 48, 76,141, 52, 90, 99,154,
- 28,182,219,149,216,244,222, 54,231,135,181, 22,222,251, 70, 9,115,158,198,135,222, 57, 34,254,241,247, 90,210,189,206,231, 19,
- 81, 10,217,146,104,180,134,247, 83,215,131,112,113,123,221,246, 54,250, 21,152, 85, 8,129, 11,187,202, 19, 5, 77, 10,117, 13,
- 44,126,226,125,188,198,227,249,132,146, 8,139,236,157,225,132, 66,215,158,241,105,154, 91,206,129,115, 14,183,219,198, 41,126,
- 5,243,228,185,243,210,221, 30,202,240, 29,109,168, 0,123,127,221, 91,119, 56,123, 7,103,108, 67,252,170, 62,174,131, 82, 26,
-159,175, 14,251,177,163,166, 64,118, 63,118, 55, 80,116, 42,193, 94, 66,174, 56, 82,105, 90, 10,185, 96,132, 56,103,153,143, 32,
- 23,136,136, 86, 81,187, 82, 58,215,194, 41,147, 10,151,235, 13,251,182, 97,219,136,228, 23, 35, 57, 66,178, 0,141,198,202,158,
- 71, 90, 5, 4,202, 18,127,186, 60,175,185, 16, 37, 17,218,180,169, 29,253,183,182, 9,116, 99, 56, 56,236,136, 92, 42, 41,103,
-142,185, 70, 15,215,226,128, 45,107,204,144, 75,192,130, 82,190,103,114, 78,125, 53, 89, 74,187,176, 85, 55,123, 53, 33,156, 22,
-228,177,234, 43, 45,225, 46,180,202,191,157, 39, 61, 81, 81,171, 78,158, 27, 93, 77,205,251,175, 59,191, 68,125,226, 18,203,156,
-235,160,181, 97, 40,141,129, 50,166,103,167,243,132, 87,241,180, 75,248, 17,178, 14, 50,140,204,150,245,181,172,218,148,210,212,
-153, 87,130,141,133, 99, 67, 60,118,196, 16, 90,198,138, 45,172,192,165,204,216,210, 3, 31,164, 83,167, 91,189, 3,103,154,226,
-110,200,131, 22, 97, 79,169,119, 49,174,110,158,240,199,255,209, 31,225,127,251, 63,254,207, 86, 16,228,184, 67, 79,107, 59, 68,
-197, 94, 85,101,156,196, 74, 88,169,194,156, 53,119, 72, 72,104,133, 82,248,162,225, 11,221,106, 82, 43, 26,163,113,242, 6, 69,
-209, 62, 89, 88,209, 78, 3,201, 88,160, 38, 36, 85, 49, 47, 39,252,249,191,249,191, 48,185,140,127,254,223,255,183, 76,107,170,
- 48,208, 72, 85, 65,171,196,151,185,168, 32,196, 51,174,241,251,191,247,115, 92,175, 87,124,120,121,105,187, 93,217,105,180,213,
-132,236,242,115, 25,198,156,154,119,229,195, 30,154,105,124,122, 16,166, 53,200,128, 88, 25,196, 98,196,190,206,134,237,228,110,
- 94, 72,104, 85,151, 97,172, 63, 42, 60, 7, 61,132,214,208, 92,132,201,142,186, 14, 35, 95,197, 69,202,145, 50,131, 61,128,144,
- 82,227,216,139,114, 95,254,151,185,130,180,138,226, 82,141,210, 80, 70, 97,103,145,218,188,204,188,251, 37,170, 91, 44, 21,179,
- 35,112,198,245,122,133, 2,237,159,107, 46, 40, 49, 49,167, 62, 99,241, 14, 71, 72, 56,228,207,230, 7, 76, 43,210, 46,140,175,
- 11, 10, 28,236,195, 29, 58,123, 55,173,161,216, 66, 12, 25,244, 98,219,172,185,192, 26, 11,216,190,151,163, 61, 93,146, 40, 2,
- 98, 25,248,149, 18,197,180,134,243, 19,189, 7, 74, 99,223, 54, 22,147, 49,129,144, 53, 36, 45,126, 83, 3, 85, 43, 24,235,249,
-114,155, 32,179,128, 45, 39, 24,171,177, 40,219,213,204,124,241, 90, 46, 64,246, 44,211,147,202, 93,186, 6, 20, 29,114, 33,134,
-230, 3,183, 90, 53, 45, 64, 41,133, 64,119,150,201,107,122, 24,185, 55, 70,186,226,113, 16,125,134,167,211, 9, 79, 79,207,184,
- 94,175,184, 94,175,252, 94,138, 42,218,161, 86,214,101,176, 54,196, 89,139,196,107, 24, 85, 9, 28, 18, 67, 97,112, 16, 89,143,
- 46,215, 11,214,117,193,195,233,132,219,182,225, 56, 2, 82, 74,176,142, 70,232,251,190,179,142,134,166, 1,196,195,143,141, 22,
-152, 83,134, 49,142,119,132,156, 39,192,169,123,206, 57,164,152, 72,223,144, 82,179, 85,174,179,135, 53, 20,254, 50, 51,199, 98,
-158, 60, 35,120,235,157,187,196, 57, 15,148,138,201,121,234,176, 67,196, 60,207,216,142, 29,128,131,214, 10,215,219, 13,147,159,
-136, 52, 23, 3, 79, 24, 60,182,237, 70,174, 0, 75,100, 70,202,126, 39, 84,176,227,253,182,117, 14,241, 56, 26, 84,168,217,183,
- 42,240,230,124,194, 60,121, 76,222, 67,115,152, 9, 77, 20,169,131, 63,207, 14, 31,183, 3,251,158,224,166,153,221, 20,129,206,
- 59,161,185, 49,124,201, 28, 17,179, 55,112,134,144,202,242,249,202,228,243, 62,229, 11,247, 10,122,129,239,164,136, 35, 40,188,
-190, 94, 90, 1,237,167,137,153, 17,159,242, 28,136, 30, 71, 69, 54, 3,190, 18,193,146, 34,127, 79,157,157, 73,107,225, 87, 4,
-110,248,200,174,201, 89, 27, 41,176, 16, 48, 35,115,151, 30,115,103,198, 39, 46, 72,149, 53, 45, 50,182, 21,222, 74,119,192,153,
-132,103, 85,105,150,244,253,200,106, 88,101, 10,142, 91, 11,174,118,248,251,123,126,102,103, 51,168,187, 12,133,210,157, 65, 13,
- 6, 87, 59,250, 22, 34,100, 31,109,221, 44, 2,231, 96, 46,185,196,235,167, 26, 24, 53,100,192, 43,116, 32,218,253, 79, 37,196,
- 18,210, 27,233,158, 72, 35, 43,157,246,121,243,198,205,142,204,247, 49,240, 65,118,114,138, 27,241,130,126,185,143, 65, 45, 93,
- 51,215,133, 24,117, 72, 75, 58,159,206,248,131,223,253, 41,254,226, 23,255,142, 45, 52,172, 28,158, 23, 6, 38, 24,174,250, 10,
-119, 14,190, 65, 79,100,215,172,148, 68,129,146,114,182,237,160, 91,185,158, 27, 52,161, 84,138,192,180,173,211, 5, 28,143, 46,
-156,161, 44,238,227,118,197,159,253,213, 95,224,127,254, 23,255, 28, 78,170, 45, 85, 97, 81,145, 83, 79,102,210,236, 45,150,221,
-209,195,249, 1,191,121,251, 61, 94, 47,151,174, 13,224, 93,174, 98, 47,169, 16,139, 26,221, 11, 93,164, 37,227, 36, 40,117, 7,
-111, 17, 81, 22, 6,165,178, 28, 6,178,143, 23,210, 92, 95,104,215, 6,105,145, 15, 88,141,200,221,246,153, 42,190, 44, 11, 52,
- 87,135,226, 87, 47, 35,211,155,197,102,169,244,113,176,252,143,114,130, 89,107, 81,238, 89, 14,122,208,100,200,115, 97,141, 70,
-204,153, 71,160,132,181,124,247,241,149, 20,187,182, 96,219, 35,182,152, 16, 83,196,196, 41, 99, 3, 62, 1, 47,183,131, 73,119,
- 21, 99,244,240,167,151,185,236,200, 87,223,211,166,214,153, 58,227,194, 95,148, 61, 70,246,211,243,197, 43,116, 42, 20, 26,161,
- 30, 20,110,163,234, 24, 95, 9,168, 82,241,139,191,252,223, 89, 37,174, 16,142, 3,243, 68,145,162,235,233, 12,176, 40,198, 58,
- 79, 68,183, 20, 48, 79, 19,188,241,216,119,202,169,175,197, 52,203,162,213,150, 59,122,186, 28, 99, 9, 76,167,226, 12,106, 65,
-247,230, 12,203,130,159, 42,193, 49, 74, 67, 49, 56, 8,181, 79, 83,148,214,176,202,208, 5,103, 12, 28,119, 54, 2, 2, 82,138,
-224, 59, 96, 43, 80,225, 93,221, 52, 57,124,245,213,215, 8, 49, 99,187, 93,113,185,188,146,203, 65,137,112,149, 46,134,217,147,
- 5,140,130, 72, 56,227,188, 20,164,156,112, 58,173, 80, 90, 99,114, 14, 31, 63,126, 68,201, 9,165, 56, 44,203, 66,206, 21, 78,
-225,218,143,131, 58,102, 91,176,109, 7,230,217,183, 29,107, 46,192,236, 52, 46,151,215, 94,116,240,119,193, 90,219,244, 0,225,
- 8,124,193,101,134,237, 36,138,234,141, 17,206,106, 78, 87,203,112,252,243, 58, 78,119,203, 76,247, 35, 63, 61, 77, 26, 28, 95,
-194,228,120,240, 56,118,178, 44, 62,156, 86,188,127, 33, 92,235, 58,211,103,250,244,248,132,109,223,201,194,153,232,207, 20,117,
-186, 92,160,198,116,235,164,155, 72, 76,185,158, 86,188,123,251, 14,111, 47, 27, 79,197,152,120,232, 44,102, 79, 23,166,227,162,
- 76, 60,212, 70, 43, 56, 99,240,197,121,198, 95,127,251, 22, 75,206,168,126, 2, 42,173, 48,174, 77,201, 92, 17, 51,173,187,140,
- 81, 48,186,163,112,229,188,145,203, 68, 15,107,181,142,251,149,117, 86,198,118, 28,120,115,158,241,238,221, 59, 34,231,165,132,
-121, 89,224,189,231,148, 63,209,240,208, 20, 34,230, 76,113,212, 7, 69, 82, 31, 49, 34, 38,250,103,170, 84, 84, 38, 63, 26, 99,
-161,116, 70,202, 27,114, 12, 76,105,100,226,159,166, 85,103,206, 84, 32, 36, 57, 35,152,195,111,132,195,128,174,237,105, 0, 48,
-246,150,167, 68,244, 65, 17,187, 85, 93, 7,234,154,172,119,235,221, 52, 68,201,101,221,226,178,199, 11,189, 12,123,199, 30, 16,
- 84, 27, 43, 68,148,239,141,209, 55, 48, 71,198, 51, 29, 67, 28,112,159,154, 22,137,116, 22,193,174, 86, 45,127,160,111, 7, 76,
-107,248, 42,167, 23,138,219, 76,166,103,165,228, 54,185,178,178,230, 16,123,160,104,161,148,130, 45,157,137, 57,248,155,122, 84,
- 20,221, 51,165,119,227,162,246, 31, 85,240,204,167,237, 81,172,130,146, 85,120,185,237,248, 15,127,254,123,248,238,251,183,248,
-225, 99, 70,201,116, 8,149,148,200, 63, 46,138, 70,165,218,158,202, 48, 59,156,196,113,138, 3, 97, 60,125,185,157, 67, 57,246,
-182,219,168, 6, 77,213,172,181, 70,174,138,113,146,132, 95, 37, 53, 96,133,206,192, 97,105,212,241,246,219,111,240,203,191,252,
- 51, 92,175, 47, 88, 38,199, 59,113,186,244, 62,230,140,217, 91,246, 66,223,143, 87,174,183,219,221, 58, 96,156,121, 75,101, 62,
- 22,139,181, 81,188, 36,249, 73,223, 95,162, 74, 19,167,183,118,235, 91,203,234,110,112, 4,116,230,248,176,199,238,127,148,124,
- 14, 5, 80,230,254,103, 27,195, 45,100, 36,165, 85,103,100, 11,176,130,181, 37, 57, 23,194,154, 14, 23,169, 82, 12,128,209, 61,
-248, 64,196,115,117, 8,240, 32,193, 14,133,173,136, 64,103,143,100,233, 42,165, 66,231,130, 84,129,160, 18,142,152,240,230,188,
-226,215,239, 62,192, 58,139,235, 17, 16,184,168, 75, 57, 99,114, 22,123, 32,154, 95, 30,222,211, 49, 31, 92,236,128,147, 55, 93,
-228,199, 96,160, 61, 68,156,151, 25,183,125,167, 92,121,153,162,176, 72, 80,113,222, 61, 29, 64, 14, 41, 39,164, 74,251, 98,203,
-239,179,115, 51,114,222, 17, 34,141,181, 38,127,194,105, 93,136, 50,182,111, 45, 73, 43,112,130,148, 49, 22,251,177,225, 96, 88,
- 75,136, 1, 70, 25, 44,235, 9,251,177, 81, 20,110,162,125,110, 74, 17,129,253,188, 34,150, 36,191,184,172,183, 50, 21, 37, 60,
-210,117,206, 2,156,253,109,180,130,230,189,116,230, 80, 25, 26,121,211, 65,188,239, 59,187, 67, 12,114,166,231,204,178, 93,212,
- 88,139,135,243, 3,214,211, 25,175,175, 23,220,182, 43, 66, 32, 21,123,169, 5, 86, 49,102, 84,129, 11, 59, 78,224,210, 10,126,
- 89,154, 80,231,136,148,140, 53,113,138,157,117, 14,206, 45, 56,142,128,197, 57,132, 99,135,177, 22,251,113, 80, 74, 27, 19,245,
-140,181,184,222, 54, 58,144,152, 60,119, 28, 59, 63,135, 36, 4, 51,154,132,148,130, 57,165,159, 61, 17,192, 7,149,118,191,138,
-210,223, 98,162, 46, 61,132, 72,150,216,156, 96,180, 65,202,169, 93, 18,165,210, 84,207, 50, 39, 67,162,143,173, 53,212,229,175,
- 11,187, 69, 88,225,207,197,174,177,150,246,240,206, 33,132,136, 16, 54,120,231,144, 98,196, 52,121,132,152, 48,123, 79, 59,125,
- 67, 89, 22,165,208, 57,245,242,122, 1,180,193,198,172, 5,160,226,179,243,137, 4,147,252,185, 78,142,227,125,121,226, 85, 42,
-177, 60, 78, 0, 62, 59, 47,248,238,253, 11, 78,167, 19, 44,175, 72,156,170, 8, 50,114,175, 21,123,204, 48,134, 80,188,159, 6,
-108,137,142,132,231, 90,159, 28, 8,164,205,201, 57,227,245,114,129,250,226, 25, 47, 47,175,168, 32,224,203,194,197,171,227,137,
-154, 22,182, 2, 95,202, 33, 70,220,246,141,136,127, 71, 64, 8,129, 86, 94,218,242, 30,154,138, 47, 74,180, 12, 72, 49,240,116,
-181,182,216,214,202,248,223,200,127,111, 52,250,218,143, 67,162,106, 81,237, 98,110, 25, 22, 60,137, 43, 37, 83,122, 98, 29,213,
- 53,154,197,113,178,233, 28, 47, 97,133, 49, 8, 79,245,251,155,118,247,159,138,116,196, 79, 94, 89,128, 39,151,189, 30, 54, 17,
-218,240, 4, 76,114, 17,106,135,142,181, 6,161,140, 35, 0,154, 16, 12,197, 86,155,188,118, 70, 43,106,166,238,219, 24,221,236,
-178, 93,180, 40, 72,246, 78,211,236, 30,120,213,244, 7, 22, 67, 58,215,248,202,104,212,200,227,129,182, 99, 71, 35,241,212, 79,
-172,109, 52, 98, 24, 99, 97,168,122, 50, 86,227,186, 5,252, 39,255,228, 31,227,127,250,151,255, 43,239, 16, 52, 82,220,225,205,
-153, 14, 27,137,145,100, 4,171,102,161,156,236,114, 41,135, 58,147, 95, 28, 10,176,142, 62,220, 20,104,207,202, 1, 14,172, 23,
-161,131, 89, 3,202, 40, 76,214, 80,124,157, 86, 56, 98,133,174, 5,151,247,111, 17,183, 11, 12,123,151,169,203,167, 75,194, 91,
-202, 86, 14, 60, 10,202,131,120, 45,167,212, 70, 49, 29,163,169,239,166, 22,119, 99,159, 54,169,233,170, 56,233, 72, 20, 20, 63,
-208,170,117,235,194,203,167,177,177, 60,133,212,227,231, 82,134,193,122,223,161, 75,192, 71,174, 5,182,109,147,208, 20,155,146,
-184, 70,156,116,234,220, 36,183,189,193, 88,248,242, 55, 26, 67, 56, 8,191,254, 92,105,111,204,209,175,141,107, 95, 42,171,242,
-123,102,114,204,157,154,151, 88, 81,123,219, 15,172,243,132,237,136,152,188, 39,187,135, 82,248,254,133, 24,217, 37, 49,183,160,
- 20,178,193,113, 70, 49,170, 28,118, 61, 62,118, 36,161, 9,114,205, 27, 74,200, 18,216,134,115,100, 25, 2, 43,119,181,209, 20,
-139, 90, 73,163, 81, 43,249, 95,115,142,220,101, 49, 38, 55, 23, 84,107, 17, 19,131,107,160,144, 50, 9,169,188,247, 88,214, 25,
-126,154, 27,123, 90,188,252,168, 21,167,101,109, 41,133,154, 59,113,242, 53, 83,130,148, 53, 14,183, 16,144, 57,114, 49,132,132,
-201, 83, 1, 91,107, 65,140,253, 11, 90, 43, 29,141, 70,107,242,188,243,222,114,178, 20, 35, 41, 68, 68,173, 21,156, 35,253,134,
-181, 6,206,208, 52, 43, 38,162,176,105,173, 97, 29, 93, 54,206, 57,104,235, 49,207, 11, 30, 30,158,112,187, 93,177,221, 46,228,
-247,118,132,125,245,108, 37, 44, 60,209,146,103,120,246,158,243,187,169, 24, 74,137, 66, 35,166,105,194,237,118,107,235,152, 90,
- 43,230,201, 99, 93, 87, 56,235,240,114,121,165,215, 48, 77,120,189, 94, 49,123,199,118, 68, 2,242, 24,100, 90, 21, 20, 18,178,
-161, 22,222, 69,107, 94, 9, 21,148, 28,121,228, 78,151,246, 60, 45, 48, 90,227,182,239,216,142,116, 39, 8, 83,195,228, 76,138,
-167,201,249,142,137,205, 25,110,154, 96,148,194, 30, 2,188,167, 68, 63,197,241,172,137,245, 18,126,242,136, 33, 16, 84, 37,147,
-144,173,148, 66,194, 63, 41,244,141,134,142,149,167, 13,100,249,116,214, 34,134, 3, 17, 10, 31, 95, 95,248, 50,232,174,147,135,
-117,134,247,142,158,151,121,226, 11,147,223,228,196,223,121,246,234,127,254,244,136,239,223,191,224,122,189, 97,246, 22,102, 51,
- 56,175, 51,106, 0, 66, 42, 13,141,122,196, 4,111,109,227, 11,224,206,181,132, 33, 52,232, 46,218,163,157, 85,219, 30,104,242,
-163, 20,222,189,251,128,112,144,104,110,154,167,214,173,107, 22,223,201,107,141, 41, 97,219,119, 92,111, 55,108,219,142, 35, 68,
- 84, 69, 60,255,148, 19, 82, 4,178,186, 33, 14, 25, 28,170,168, 78,151,227, 21,139, 40,196,133,216, 38,246, 99,177,225, 25, 13,
- 24,152, 65, 15,192,201,130,172,151,200, 37,243, 74, 81, 53,129,220, 72,170,215, 13, 33,221, 5,165, 50,141, 4, 83, 9, 75, 29,
-128, 94,172,134,175,195,200,190,214, 30,145,170, 27,196,171,131, 98, 42, 42, 39,175,117,144,171,188,203,198,176, 85,210,154,190,
- 58, 17,187, 96,227,207,115, 54,186,234,211, 86,113, 33,212, 38,164,251,247, 87, 43,162,148,151,105,157, 88,173, 75,161,251,205,
- 22,140,163,247,206, 9, 86,226,239,171,227,131, 80,217,186, 62,250,213, 75,167,244, 72,199, 94,208,168, 92,181, 2, 47, 71,196,
-100,129,175, 63,127,131, 95,126,251, 93, 19,114,164, 24,200,162, 86,228,141,112,204,147,230,145, 34, 11,169, 90,200, 61,139, 82,
- 38, 59,145,208, 9, 22, 85, 27, 40, 21,251, 56,133, 11, 20,175, 72, 65,235, 53, 80, 42,237,125,117, 46, 72, 89,227,118,125,165,
-106,145, 69, 42,210, 21, 71, 62, 44,171, 49,247,114, 97,244,144,122,110,119,219,104, 69, 13,123,114, 12,177,170,106, 32, 2, 73,
- 39, 50, 22,109, 21,133,189,226,157, 2, 35,251,151, 50,136, 90, 84,173,119, 16,154, 42,137,121,146, 97, 47,105,120,133,245, 15,
- 93,115,207, 25,236,252,185, 48, 54,149,248, 10,165,239,147,106, 79, 34,106, 1, 9,170, 55,252, 70,141,186,123,122,216,197,214,
- 84,100,239, 95,250, 62,191,176,208,209, 24,221,120,226,219, 30, 48, 57,139,235,126,176,154, 26, 61, 27,155,149,249,146,226,231,
- 12, 89,121, 74, 23,169,182, 96, 29,133,218, 3,142,248,113,180, 90,241,254, 79, 44, 62,244,251,236, 49,145, 48, 47, 85, 36,168,
- 22,113,170,106, 69,213,185,229,133, 31,199, 14,109, 12,137,163, 64,246,160,146, 51,172,177, 80,218, 34,229, 3,167,135, 71,212,
-156,113,236, 27, 41,159, 13,237,184,115, 41,240,222,226,118,187,192,184, 25, 78,233,102, 51,185,109, 23,120,235,112,221, 34,182,
-237,198, 64, 37,133, 80, 20, 30, 30,206,208,149, 14, 37,249,194,203,161, 39,133,237,108, 53,227, 49,233,192, 44,133,198,217,181,
- 72, 70, 52,229,210, 27,142,107,205, 28,142,163,215, 21,151,235, 13,139,119,180, 16, 83,100, 83,115,126, 6, 20,240,241,253, 59,
-108,183, 87,178,125,241,154,101,178,174, 9,240,104, 36,156, 97,148, 97,113, 89,196,227,249,220,121,221, 57, 97,153, 87, 86,162,
-203, 94,156,246,135,167,211,137, 51, 22, 98,251,142,239,199,193, 35, 87,210, 85,152,117,229,125, 56,112, 28, 71,251,174,132, 68,
-130, 41,199,246,210, 99,223,155, 19, 6, 74, 97,114,228,255,190,110, 59, 91,238, 42, 22,101,184,216, 16,125, 14, 81,204,106, 45,
- 52, 42, 71,229, 78, 59, 96,241, 51, 61,103,131,238,135,184, 22,150,210, 1,181, 6,144, 16, 99,160, 49,126,136,124, 38,209,238,
-123,219,119, 34, 9, 26,131,125,167,110,118,219, 3, 57, 24,184, 35,252,240,114, 1, 80,177,206, 51,254,250,187,119, 77, 99,244,
- 48,121,172,243, 76, 35,118,235, 90, 33, 65, 78, 6, 42,114,197,221,115, 62, 81,166,252,215,159, 63,225,111,190,125, 75, 32,161,
-122,195,105,118,120,152, 29, 62,108, 17, 57,211,119, 50,102, 82,178, 43,118,235,160,210,101, 86, 89,176,247,105,151,174,134,229,
-122,195,155,198, 8,235, 61,126,248,225, 29, 66,140, 88,118, 90,145, 56,231,217,109,161,219,238, 88,242,211,247, 16, 41,127,227,
-136, 72, 12,198, 41, 37, 33,133,138,172,129,176,109,119, 35,118, 42,144,104,116, 76,250,230,204, 86,182,210, 98,156,165,225, 33,
-151,142,225,163,166,180, 38, 70, 38, 5,165,130,186,116, 22,162,169,134,233, 84,157,249,166, 6, 77,129,234,142, 33,193, 44,203,
- 39,166, 89, 72,170,135, 53, 72,101,162, 92, 45,170,131, 99,196, 2,223, 88, 17,159, 68,252,222,161,229,105, 58, 84,235,152,162,
-169, 97,116, 69,102, 58,164, 6,139, 43,181,254,196,222,108,218,138,132,179, 79,219,106, 5,124, 86,246,128, 37,134,156,213,238,
-106, 40,136,161,214,207, 0, 0, 32, 0, 73, 68, 65, 84,124,223,218, 59, 72,123, 11,148,161,174,188,178, 32,161, 42,116, 92,101,
- 3,243,143,222,253,122,215,177, 11,120,190,200,155,162, 53,140,113,248, 39,255,232, 63,198, 47,255,151,127,201,234, 67,160,164,
- 0,205, 92,105,169,178, 53,147,131,156,243,180,191,227,174,200,242, 67,111,141,164, 9, 45, 92, 97, 7,232, 76,118, 21, 61, 92,
- 70, 34,152, 74,150,194, 14,182, 88, 24,121,170,145,227, 65, 23, 65, 81, 20, 4,146, 42, 20, 7,109,180, 12, 12,133, 6, 40, 41,
-178,147,209,186,217,187, 70,244,171,196,241,181,201,197,224, 39, 22,227,185,196, 93,210, 69, 43, 99,118,180,238, 72, 30,104, 53,
-240, 1,186,162,178,220,109,128,234, 40,162,144,255, 30,132,246,149, 44, 95,114,183,162,137,196, 70,101,230,157, 30,226,206, 38,
- 87,121, 20, 92,216,114,216,121,226, 82,225, 74,212,166, 20, 89, 89,162, 45,135,181,130,225,113,175,116,222,128,198,118,132,230,
-118,240,214, 65,213,130,172,104,253, 98, 45, 41, 61,247, 35,226,224,188,100,217,175,150, 78, 69,186, 43, 62,186, 90,214, 52,214,
-193,228,201,202,100,180,194,190, 71, 78,212, 51, 40,153,163, 56,115,134, 86, 21, 37,115,106, 93, 73,164, 82,182,204,203,206,137,
-211,220, 20,230,229,140, 15, 31,127, 24,248,246, 76, 50, 99, 27, 85,136,113, 16, 59, 25,196, 20,176,204, 79,152,167, 25, 37, 71,
-204,126,110,221,187,113, 30,251,237, 10,171, 21, 38,173,128,146,104,130, 80, 65, 30,254, 35, 16,100,103,176,158,121,231, 72, 92,
- 24,115, 59,160, 82,138,116, 64, 56,241,211,163,177,223,157,181, 56, 2,165, 5, 46,211,196,130, 83,139,135,135, 39,132, 16, 8,
-242,147, 50, 82,220,121,231, 30,225,140,197,196,248, 92,239,136, 37, 96,180,129,179,134, 46, 92, 99,112, 94, 23, 78, 56,180,184,
-221, 56,253,142,237,129, 90,107,138,183,133,194,204, 44,116,193, 63, 87, 33,220,241,103, 53, 77, 30, 57, 37, 88, 75,163,115,101,
-116, 19, 9,202,119,105, 93, 23,228, 92, 41,196,131,247,134,133,167, 62, 94,107, 92,110, 55, 94, 13, 84, 76,126,193,126,236,112,
-214, 49,149,143,214, 5,198,104,232, 66, 35,120,239, 61, 43,171, 85, 3, 47,101, 70,161, 42, 67,107, 4,239, 61, 91, 11, 11, 59,
- 0, 82, 39,171, 25, 13,231, 28,174,183,141,154, 16, 0, 37,101, 76,222, 98,219,143,193, 33,163,153,174,103,145, 14, 26, 75,151,
- 34,193, 60, 21,159, 61,158, 40,184,133, 93, 62,178, 18,145,116, 57,205, 1, 52,148, 44, 72, 63,199,103, 79, 15,120,189,237,120,
-127,217, 80, 74,193,235,182,227,179,179,193,143,158,206,248,246,221, 75,123,254,183,152, 96, 21,224, 13,159, 47,188, 6, 48, 90,
- 53, 92,240, 61,144,178,222,193, 41,223,189, 92,240,163,231, 71, 40,235,240,225,245,134,237, 8,152, 55,215,115, 47,152,205, 81,
-249,247,206,165, 32,166, 76, 66,214, 24,105,199,171, 65, 98,190,170,104,202, 89, 50, 66, 76,124, 17,167,230,134, 18, 38, 64,183,
-145,130,211, 4,199,100,192,130, 82, 58, 92, 70,206,219, 84, 50, 82, 76, 44,214,203, 44, 74, 30,112,220,124, 46,200, 29, 32, 77,
-213,232, 10, 82, 44,144,107,212,244, 74, 23, 44, 69,155,234,182,210,107,233,154,184, 79, 68, 68, 85,109, 69,218, 38,161,163,113,
- 84,117,248,141, 82, 64, 56, 40,237,211, 24,211,222, 71, 88,246,148, 14,141,116, 23, 83,102, 40,158,156, 43, 38, 71, 10,222,187,
-178,179,160, 59,165, 36,133, 14,131, 30,133,207, 68, 25,173, 67,245,241,239,168,148, 20, 13,156, 44,245,203, 72, 12,175,232,244,
-185,161,225,175,170, 52, 11,129, 40,229,141,117, 88,157,185, 31,242,171, 94,161, 40,208,195,232,157,231, 81, 42,117,130,222, 10,
-227,152, 46,139,153, 99, 2,101,215,163, 17,161,138,102,143,186,110,252, 91, 81,202, 35, 21,148, 74,132,174, 84,129,201,106,148,
- 28,219, 27,111,152, 41,128, 70, 81, 99,158,113,233,177,120, 2, 54,185, 87, 45,214,182,159, 83,170,183,143, 34, 78,175,195,229,
-174,196,247, 57, 68,178,202,133, 75, 54, 47,213,169, 71, 77, 44, 87, 63, 97,195,210,159, 85, 74,238,136,220,218,133, 25,253,129,
-234,157,118, 11, 3,169,146,164,213, 31,244, 59,249,132,234,137, 71, 40,181,233, 24,154,160,100, 20,100,148,190, 39,210,198,180,
-252,226, 6,177, 41, 84,145, 42,206,240, 70, 37,244,172, 20, 32,185, 84,216,133,226, 72, 13, 7, 33,228, 82, 8, 21,171, 0,111,
- 41,135, 90,241,184,173,126, 2,235, 25,127,118,173,129,231,243,138,196, 93,170, 60, 55, 33,208,239,233, 39,135,235, 30, 49, 89,
- 71,207,182, 70,163, 28, 86,254, 12,100, 60, 6, 85, 96,181, 65, 74,180, 35,158,231, 51, 82,162,136,204,156, 34,204,228,145, 99,
-230,196, 55, 34,198,169,170,216, 70, 23,177,172, 39,228,148,177,151, 27,220,178,242,174,254,192, 52,207, 56, 94, 62, 96, 89, 22,
-236,151,143, 8, 71,192, 52,123,236,123, 64, 72,145,186, 28,246,212,103,198,114, 90,231,241,217,155,103,234, 92, 93, 65, 74,140,
-147,229, 98, 58, 70,250, 89,173,209, 92,180, 36, 0, 6,167,101,109, 97, 47,211, 52, 3,160,137, 87, 74,137, 58,195,154,224,140,
- 66, 76,180,115,181,150, 96, 43,203, 52, 97, 59, 2, 91,185, 10,114,138,128, 82,120, 88, 23,196,148,176,240, 20, 35,151, 12,175,
- 29, 67,138, 42,246,227,192,228, 39, 60, 61,145,133, 79, 27,141, 35, 37, 28, 71,104,142,143,156, 51, 30,206, 39, 42,251,156, 67,
-140, 7,129,132,246, 64, 92,111,177,247, 25,131, 99, 63,160,140,134, 53, 22,243, 52,195, 77,212, 49,123, 71, 2, 52, 85,105,253,
- 96, 56,206, 85,138,253,196,103,133,209, 26,219,193,128, 25, 0, 49, 4, 4, 40, 44,243, 66, 97, 79, 41,192,106,242,148, 23, 0,
-111,158,159, 89,212,165,216, 62,166, 16,183, 29,213, 82, 71,119, 28, 1,147,247,112,206,225,253,203, 43, 38,103,217,213, 37,129,
- 32,228,162,200,137, 46,175,125, 63,224,141,198,219,215,107, 59, 47,181, 82,148, 59, 80, 43, 1,124, 4,135, 92, 43,142,253,128,
- 51,166,173,215,102,182,252,237,251,129,211,186,224, 71,207, 15,184,108, 59, 66, 46,120,189,238, 88,172,193, 87, 79, 15,120, 88,
- 39,188, 92,119, 46,146, 25,129, 10, 26, 89,107,214, 35,149,113, 50,120,239,137,193, 88, 23,191, 92, 54,124,254,120,194,249,124,
-194,109,219,113,221, 14, 28, 33, 18, 45,144, 81,184, 50,130, 23,203,109,202,133, 11, 72,114,185, 84,232,214,144,108, 71, 64, 44,
-138, 52, 35,188,194, 16,251,108,102,173, 3,233,146,232,243, 34,152, 10, 29,154, 66,148, 35,117,124,207,122,168,133, 66,172,100,
-167, 63,134, 99,169,162, 72, 74, 36,118, 53,168,102, 81,213, 74,221,165, 26,106,254,191,118,166,203,229, 95,209,115, 22,164,239,
-209,146,185,208,115, 49,250, 89,212,215,203, 85, 13,231,188, 82, 77, 7,181,172, 11,150,101,230,215, 83, 56,154,155,180, 60, 74,
-139,208,155, 5,172, 37,163,148,140, 1,178,218,104,152, 77, 76, 55,168,235,139, 20,255,186, 83, 50,107, 15,195,232,157,250,200,
-117, 31, 85,146,117, 0,206,244, 70,175,244,253,205,232,136, 71,183, 79, 21, 69,180,172,194, 95,130, 91,200,112, 22, 28, 68,208,
- 69,121,205,176,175, 20,172, 6, 87,221, 96,251,137,107,120, 82,201, 11,246,222, 13,221, 89, 69,184, 70, 30,191, 2,179,213,136,
-220,149,201,238, 35,229,138, 35,101,164,170, 26, 35, 55,197, 72, 89,197, 80,176, 0, 98, 11, 38, 82,125,148, 62,198,160,138,138,
-114,132,176,104, 61,208,244,186, 44,187,223,229,186,227, 1, 69,232,198,202,198,102,141,108,251,156,218, 10,151, 49, 23,120,204,
-178,134, 26, 71,248,125,199,100,196,175, 94, 42, 10,114, 47, 48, 84,147, 68,210,120, 86, 48,170, 45, 33, 14, 60,185, 80,232,162,
-253,202,124,246,204,239,111,105,216,201, 90, 43,140, 60, 60,131,112,198, 48, 32,166, 61, 92, 2,189,224, 84, 38,169,182, 69,128,
- 38,212,192,148, 11,246,156,225,216,163,233,157, 69,202, 25, 49,101, 22,200,213, 1,147,219,193, 55,117,208, 12,104,109,144, 74,
-225,142, 54, 82,218, 91,243, 52, 43,228, 64,246,184, 90, 85, 11,142,208,156, 39,175, 42,179,199, 21,225,117,181, 97, 11,162, 34,
-181,105, 25, 70, 90, 20,128, 99, 48, 47, 11,246,237, 70,191, 71, 58, 0,109,144, 98,128,182, 26, 37, 69, 36,109, 80, 97,160, 66,
- 64,214, 25,202, 24,168,170,225,252,140,154,105,130, 16,114, 70,188, 94, 41,152,196, 18,176,227,224, 12,117,249, 28,190,120,243,
-204, 9, 85,134, 16,180,229, 32, 81, 20,136,119,110,153,156, 87,249, 32, 76,185, 98,157, 28,156,115,176,110,130,113, 14,215,235,
- 43, 52, 20, 62,190,146,178, 93,163, 96, 15, 7, 21,206,198,194, 79, 30, 86, 43,196,148,200,179, 12, 58, 76,173, 54,216,227,129,
-167,135, 7, 94,121,144, 32,240,227,203, 43, 78,235,138,148, 8,119,235,189,195,237,186,193, 56, 79,228,181,137,118,212,215,203,
- 5,235,233,220, 14,242,245,116, 38, 40, 80, 46,200, 57,114,151, 68,239,171, 68,210, 90, 67, 99, 71,203, 26, 2, 99, 45,220, 68,
-107,154,144, 42,172, 73,200, 49,182,247,240, 97, 89,219,158, 93, 56,216, 37,209,193, 25, 83,130,174, 21, 33, 23, 40,163, 48,251,
- 9,251,190, 97,158,103,234,108, 67,192, 58,123,164, 92, 49,205, 11, 82,140,132,237, 5,176,237,219,240, 29,167,117, 1, 53, 19,
-164, 89, 88,230, 9, 57,229,187, 32, 33, 73, 0, 12, 41,115, 35,163,113, 57, 98,123,110, 63,123, 88, 73, 73,110, 12, 23, 4, 26,
- 33,144,163, 32,196, 72,186,149,162,154,104, 46, 69,226,202,215,226,240,120, 62,225,171, 55, 1,127,251,246, 61,246, 24,241,241,
-186,225,225,182,225,139,231, 51, 98, 76,216, 66,106,197, 96, 42,104,147, 45, 65,171,226,142,162,134, 59,214,185,156,153,123,140,
-184,222,118,120,231,113, 58,173,184,109, 59,142, 24,233,245, 4,213, 34,155,181,181,168, 12,103,162, 98,151, 86,108, 74, 99, 40,
-216, 11,174,251, 1,165, 45,191, 70,201, 85,207, 45,231, 64, 46, 57,203, 83, 79, 35, 83,176,218, 18,194,144, 51,218,212,148,214,
- 81,153,115,219,115,203,107,151, 52,179, 58,230, 72, 75, 60,173,196,175,136,237,172,212, 33,119,163,235,158,138, 68, 14,179,176,
- 87, 4,207, 96, 8, 91,213,221,197, 85,170,248,210, 63,213, 80,213, 54,113,237,205,170,194,186,158,112, 58,211,170,233, 56, 14,
-148, 35,240, 61,161, 9,201, 59, 82,228, 50,175, 69,235,160,111, 27, 68,118, 99,152,143,208, 32, 33,222,123,109,208, 22,254, 85,
- 58,245,118,105, 99,224,242,242, 27, 49, 94,206,195, 31, 52,254, 55,205,198, 38,100, 28,177,165,176,255, 14,252,207,142, 92,241,
-225,227, 11, 38,239,120,124,162, 89,120, 19,224,167,133,241,140,232,249,186,124,145, 86, 22,130, 57,103, 49, 77, 19,163, 26, 9,
-245, 89,106,197,107, 78, 80, 44,174,177,168, 8, 44,240,210, 74,195, 48,103, 87, 62, 65,175,169, 58, 74, 49,180, 67, 59,243,221,
- 23, 57,141, 76,178,225, 91,222,117,189, 23,189,137,226, 91, 15,151,126, 29, 50,190,165,216,128,162, 87,216, 71,240, 69,150,233,
-252,183,149, 65, 14, 50,142,231, 85, 71,173, 61, 0, 64,141,113,246,221, 3, 57,250,209, 91, 53,203,126, 74,240,133, 44,197, 68,
- 29,198,247,244,122, 89, 56, 36, 15,202, 39, 95,120, 81,235,138,231, 90,108, 36, 98,139, 27,247, 52, 36, 66, 43,109,250, 32, 94,
-206,116,159, 45, 71, 95,206, 90, 90,246,114,140,212, 89, 59,163,154, 40,206, 90, 67, 85,125, 83,133, 82, 82, 23,173, 3,238,189,
-182, 50, 22,147,231, 32,231,210, 2,103, 14,182, 32, 41, 69, 28,116, 83, 41, 20,230,118, 4, 40,101,187,224,177, 82,161,131, 82,
- 6,172,171,124,225,108,243,148,230, 82, 48,207, 11,182,253,134,117, 89, 96,157,131,113,116,129, 29,183, 11,230,133,178,226,133,
- 43, 30, 82,194,228, 93,139, 20, 62, 66,128, 49, 6,225,184,194, 58,143,117, 90, 80,114,132,158, 12, 66, 60,200,178,149,232,217,
-159,253,132,223,249,173, 31,195,106, 80,140,108, 36,221, 71, 41,100,203,202,137,156, 33, 98,169, 49,214,192, 24,143,170,105,196,
-185, 44,167,198,252, 87,165, 34, 85, 96,153, 23,172,147,195,245,118,131, 51, 14, 65, 81,116, 46,237,249, 20,170,233,107, 36,231,
-168,163,156,230,137, 82,255,246, 3,206, 89, 92,174, 87, 76,147, 67, 96,187,152, 49,116,249, 44,235, 66,157,167,161, 85,192, 17,
- 2,188,247,128,162, 9,204, 52, 77,252,221,245, 80, 41, 1,149, 20,209,114,161, 4,182, 68, 25,173,113,217, 55, 44,243,204, 23,
-159, 97,255,186, 2, 74,192,182, 71,118, 24, 24, 44,214, 34, 4,162, 15, 26, 40, 4, 46, 84,140, 53,216,247,192, 52, 74, 26, 27,
- 31,129,249,228, 41,225,114,189,226,179, 55, 79, 40,215, 13, 49,102,248,217,227,122,189, 17,244,167, 20, 28,137, 70,241,219,182,
-193, 79, 19,175, 44, 72,232,116,219,118,156,215,181, 29,186,114, 78, 89,203, 78,158, 66,233,103, 70, 1,183, 35, 48, 74,154,192,
- 49,167,121,106, 28,129,170, 0,205,133, 75, 8,169,113, 9, 4, 52,162,249,217, 71,169, 72, 37, 99,153, 39,188,121, 58,227,229,
-186,225,135,235,134,203, 17,240,246,253, 7,252,236,116,194,103,143, 39,252,230,195,165, 69, 17, 39,254, 34,219,210, 33, 56,194,
-170,184, 35, 69,182,200, 93, 90,255,149,156,241,241,122,195,155, 71, 98,225, 75, 0, 87,138,137,187, 65, 71,176,166, 68,151, 57,
-184,136,162, 11, 93,183, 37,182, 82,192,198,138,120,165, 51,142, 16,105,130,151, 11,195, 98, 10, 7, 14,245, 9,168,213,252, 12,
- 86, 98, 44, 72,188,172,160,167,133, 88,151,216,202,152, 82,110,218, 37, 1,112,181,203,186,221,235,157,218, 86, 91, 8, 82,231,
-156,244,208, 43,234,114,197,191, 46,151,114,225,233,248,221, 62, 93,118,222, 18,105,203, 4, 85,137,157,174, 18,246, 90,187,188,
-222, 88, 11,109, 44, 28, 23,230,214, 78,205,218, 70,110,142,122, 55, 66,175,220, 76,136, 64, 60,165,216,132,179,181,220,139,176,
-123,227,166,238,199, 47,160,103,204,202, 94, 75, 60,232,170,229, 46,143,227,219, 33,137,237, 46,204,133,225,244,178, 27, 19,193,
- 23, 43,201,229, 66, 71, 41,120,217, 46, 56,213,140,243,186, 98,219,143,150,119, 91, 90,229, 69, 85, 16,101,143,103,174,126,116,
- 59,224, 29, 19,181,156, 53,240,204, 99,174,181,210, 1,109, 28,113,195,179,100, 66,163,101,234,130,163,245, 10,168,211,212,214,
- 32,199, 58,236, 34,200, 74, 4,173, 80, 50,143,100,181,193,145, 98, 79,203,105,234,117,213,124,137,205,166,102, 12,125,200,160,
-125,189,236,138, 68, 33,222, 85, 8, 76, 44, 26,216,238, 50, 2,110,217,234,106,128,211,180,137,129,110,151,114, 67,126, 14, 74,
-248, 94, 37, 48,101,140,237, 32,125, 91, 94,248,247,167,234,253,238, 57,168,149, 56,212,252, 90, 10, 11,220,228,210,206,237,115,
- 46, 13, 52, 36,140,247,218,168,102,104, 57,239,170,177,226,213, 29,210,183, 86, 18,171,169,182,104,168, 72,169, 34,231,230, 16,
- 69, 72,169, 81, 13,203,144, 82, 84, 24,176,208,213,165,253,149, 91,205,145,184,124, 0, 72, 96, 70, 77, 25,243,228, 26,251, 93,
- 4,155, 80, 52,133, 80, 85, 60,220, 20, 3,108,170,226, 80, 28,213,132,127,178,203,215, 74,225,245,242,138,167,135, 71,194,179,
-214, 2, 99, 61,226,118,133,210, 6,235,178, 32,166,120,183,143, 85,198,181,181,148, 41,133, 15,120,141,203,237, 21,198, 59,196,
-237,192,237, 22,144,114,228, 41,128,198,143,222, 60,225,119,126,251,183, 97,173, 33,180,114,162,226,140,198,238,244,236, 89,107,
-225,180, 67, 17,197, 56, 63, 21, 79, 15, 15,252, 76, 22,156,230, 25,219,182,227,241,241, 1,219,182, 97,187, 5,252,230,237, 11,
-214,245, 4,235, 44, 22, 40, 18,251, 89, 18,177,201,202,194, 26,242, 69,248,101,198,113,236,184,222,232,146,245,206,225,182,109,
- 64, 5,206,167, 83,123,214,172,181,184,220, 54,254,247, 59,172, 37,239,247,227,227, 35,194, 17,240,245,215,191,133, 15, 31, 63,
-192, 26,139,125,223,224,140,129,183,182,173,201, 98, 12, 20, 18,130,138, 61, 4, 44,243, 66,147,139, 2,226, 1, 24,131,253,118,
-193,245,182,193, 89,218,191,159, 61, 89,201,188,115, 40,153,188,249,211, 60,147, 61,235,122,107,128, 40,153, 58,158, 88, 52,248,
-120, 94, 17, 83,198,235,235, 13,214,106, 88,235, 96,141,167,117, 30,175,251, 80, 11, 98,136, 56,159, 78,136, 49,162,148,130,117,
-165, 85, 95, 74,137,154,136,156,219, 56,218, 58,139, 99, 39,200,204,182, 29,152,173,129,113, 22,255,238,251,247,116, 49, 87, 96,
-157,124,163,217,105,246, 95, 11, 52,197, 48,172, 7,181,239,185, 19,199,189,230, 66, 64,173, 92, 20, 30, 79, 39,124,241,188,227,
-101,219,145,114,198, 15, 47, 87, 60,189,188,224,124, 58,227,121,157,241,253,203, 85,238, 6,148, 10, 36,209, 50,141,156,140, 70,
-163, 44,119,241,140,165, 80, 88,210,235,117,199,228, 92, 19, 5, 46,218, 34,121, 22,110,230,212,192, 64,154,149,230,180,182,233,
- 2, 91,107, 53,142, 35, 96,143, 9, 59, 23, 67,145, 45,155,178, 15, 46,108,219,115, 66, 72,108,234,127,230,113,176, 72, 84,134,
-197, 2,226, 74,124,153, 83,241, 84,218,238, 92,244,230,106, 72,196,236, 46, 8,161, 40,222, 95,244, 90,245, 83,164, 43,227,217,
- 33, 62, 26,215,203,125,138,102,225, 59, 77,146, 29,155, 99,172,141,196, 27, 98,164, 89,149,193,171, 70,173, 45,148,225,245,107,
- 76,228,219,103,113,103, 5,189,110,165, 21,252, 52, 99, 89, 79, 60,161,162, 38, 37,236, 27,194,177,163,196,120,151,248,134,113,
- 93, 32, 99,250, 22, 88,213, 2, 93,208,108, 17, 69,140,239,204,113, 31,123, 46,249,178,180, 14,190, 54,242, 59,249,250, 68, 68,
-214,212,241,247, 29,251,116, 58,227,139,231, 71,252,240,225, 35,121,104, 5,198,207,100, 50, 73,234,242,214, 10,202, 6,222, 57,
- 22,193, 41,222, 71,249,246, 37, 41,185,224,205,143,126,140,252,225, 45,145,141, 44, 37, 68, 41, 40, 24, 30,207,150, 92, 16, 33,
-227, 38,234,164,115,161, 4, 28,199, 31,140,231, 88, 69,137,198, 43,168,237,242, 30,131, 52,234, 32, 78, 19,197,127,201, 29,215,
- 88,198,127, 47, 42,114,213,147,137,234,144,137,221, 0, 58,181,222, 49,159,234,157, 40,172, 67,125,198,224, 29, 12, 19,144, 86,
-104,240,191,147, 44,117,213,124,139,224,253,118,175,218, 75,219,247,145, 8, 73, 38, 34,106, 72, 54, 27,193, 66, 98,187,211,194,
- 97,102,156, 35, 56, 67, 91,114,207,121,212,193,158,107, 6,230,160, 67,114,114, 41,200,133,192, 27,226,146,208,172,200,111,137,
- 69, 3,148,167,212,202,249,195, 13,219,115,183,233, 81,138,163, 36, 1, 44,206, 98, 15, 7,142,156,145,120, 26, 48, 77, 19,125,
-217,120,146,162,249, 32, 19, 65,166, 6, 48, 59,223,138, 55,249,253,141,155,113,121,253, 1, 80,138,210,214,120, 82,180,111, 55,
- 76,147,103,149,246,130, 24, 34,246,109,231, 47, 61,113, 22,172,167, 4,177, 82, 11, 22, 63,193, 77, 14, 97,167,241,238,236,103,
-154, 76,249, 25, 74, 39,220, 14,224,241,252,136,243, 60,193,123,202,237,126,189, 94, 8, 29, 91,233,192,164,176, 35, 13,239, 29,
-148,254,255,216,122,147, 93, 89,178, 43, 77,239, 95,187, 51, 51,119, 63,205,237, 35, 72, 38, 65,177, 88,100, 33, 85, 18, 4,168,
- 25,213, 72,208,176, 94, 66,143, 32, 64, 83, 77,234, 1, 4, 77, 53, 21,160, 55,208, 43,104, 36, 65, 80,170, 50,179,152,100,102,
-101,178, 9, 70, 4, 35,110,115, 26,119, 51,219,221,210, 96,173,189,205,252, 70, 38, 64,220,200,136,123,207, 61,199,221,109,239,
-213,252,255,247,143,184,156,159,213,131, 12, 28, 14, 71,128, 43,238,238, 95, 34,198, 5, 37, 70,124,252,244, 81,198,202, 57,195,
- 57,143,155,147,145, 75, 80,213,178,151,121, 6,106,134, 53,226,219,182, 62,224,238,238, 70, 34, 47, 75, 65,140, 17,222, 7,212,
-221, 84,106, 28, 7, 16,145, 40,195,149,166,182,198,132,224, 4, 80, 50, 77, 35,214, 24,251,196, 98, 8, 1,143, 15, 15, 56,140,
-242, 90, 12, 10,125,201, 37,139,154, 59,203,197,156,180, 86, 30,198, 17, 4,194,211,188,226,246,120,196, 48, 12,120,122,124,192,
-101,158, 49,141, 3, 8,140,224,196,169,114,119,119,139,135,135, 71, 4, 47,170,255,156, 43,150, 40,200,223, 90, 89, 0, 57, 12,
-161,196,233,110,186,234, 94,247, 48, 77,162,120, 15, 3,166,105,194, 56, 14, 10, 34,146, 78,219,107,129, 82,138,100,193,139,192,
-171,246,152,210,172, 23, 65, 5, 43, 55,190, 98, 93, 19,124,112, 18,236,162,224, 34, 86, 66,227,237, 20, 36,154, 86, 59,221, 22,
- 14,211, 0, 68,117,103,105,181,155,184, 69, 87, 88, 6, 46, 88, 80, 34,188,186,191,197,101, 89,241,199,247,159, 16, 43,227,207,
-239, 63,193, 58,135, 41, 88, 12,206, 96, 73,109,170, 4,100,189,136,154, 62,170,117,155, 93,103, 68,123,135,141,124,175, 75,202,
-120,186,204, 56, 76,147,172, 60,201, 2, 49, 34,165,139,226, 88,171,128,187, 90,132,243,110,122,102,213, 74,185,198,132, 53,101,
-172, 49, 99,240, 2,136,233, 13, 77,173, 27,238, 90,215,162,182,157, 93,117,195,139,215, 93,243, 32,147, 47, 17,219,166,156,186,
- 75,228, 58,154,101, 39,138,107,152,100,218,112,176,134, 76,239,194,183,142,158,118, 90,174,205,185,176,133,167,176,168,226,105,
-139,138,105,119, 91,139,134,222,159,141,237, 78,100,146, 17,189,211, 46,125, 58,156,224,148, 99,144, 22,209, 31, 48, 3,110, 24,
- 16,140,221,196,113, 10, 78, 27,198, 9,195, 56, 41, 74, 22,112,195,132, 97, 60, 32,197, 5,113, 89, 16,151,139,104, 93,118,176,
- 25,218,237, 19,218, 63, 27, 34,184,158,205,162, 97,243,218,179,105,245, 71,221, 96,223, 35,236, 52,145,172,241,112,183,246,169,
-246,232, 86, 96,131,229,115,213, 48, 3, 16,230, 92,240,246,213, 75,252,230,247, 95,129,106,237, 35,234,166,252, 6,128,209,123,
- 17, 11,169,237,195, 16, 84, 97, 76, 24,135, 1,206,201, 97,236,173, 69, 86,113, 95, 73, 89, 70, 61, 94, 82,113,188, 37, 20,171,
- 8, 74, 13, 67, 8,222,194,146,140,149, 88, 71,114,213,180,157,157,130, 5,170, 60,188, 40, 69, 84,247,100,228, 53, 52,251,142,
- 24, 29,165,187,237,207,181,238,170,165,143,223,155, 2,188, 39,206,239,246,242, 77,105,189, 11,183,214, 67,148,251, 14,168, 33,
- 38,121,103, 51,216,119,216, 68,155,160,174, 77, 18, 88,133,110, 76,181,243,245,249, 42,153, 27, 27, 88,104,231, 85,223,136,118,
-172, 23,165,120,211,249,202, 35,190,255, 89,183, 93, 98, 43,198,128, 61,163,152,118,234,122,218,118, 71,250,179,230,178, 89, 73,
-184,104,152,133, 90,185,246,150, 35,244, 28, 98,186,174,164,119, 2,191,230,220,156,151, 5, 75,206, 66,104, 83,214,114,227, 60,
- 71,205, 44, 23,128, 67,233, 7, 43, 41, 17, 44,198, 85, 10, 15, 99,144, 75, 66,122,254,132,183, 95,254, 2,223,255,249, 15,152,
-151, 8, 75,132,239,191,255, 22, 47,238, 95, 74,167,110, 9,235,124,129,243,126, 83,247, 26,131, 26, 25,148, 51,194,120,196,224,
-109,207,140, 31,172, 69, 25, 39, 84, 29,143,113, 92,241,242,254, 14,191,124,245,115, 60, 60, 61,225,249,233, 25,167,211, 45, 30,
- 30, 62,225,208,246,214,101,227,165, 27, 34,164, 84, 68,249,109, 37,124,165, 84, 25,135, 54,224,140, 49, 2, 39,185,189,189, 67,
-201, 81, 4, 84, 85, 24,219,198, 57, 9,181, 89, 87, 56, 48,194, 56, 34, 43,224,102, 26, 6, 24, 99,197,255,206,140, 81, 59, 95,
-175, 93, 91, 78,185, 63,231,167,227, 17,143,207,231, 62, 57,104, 89, 8, 15,143, 79, 8,222,195,120,139,121, 89,112, 58,157,186,
-186,123, 84, 58, 91, 76, 9, 41, 70, 56, 39, 93, 28, 88, 80,165, 33,120,157, 66, 4,156, 70,194, 16, 28,150,229, 44, 89,231, 94,
- 92, 18, 49,171,179, 33,174, 98,229,243, 86,223,183, 4, 31,134,190, 10, 28, 66,128,119, 78,194, 99, 88,215, 33, 49,194, 57,139,
-105, 28, 17,115,193,241,120, 82, 79,184, 20,208, 41,101, 25, 53,151,130,218, 44,180, 93, 68,200,136,113,213,132, 56, 82,148,106,
- 81, 12,175, 92, 76,162, 3, 40,168, 21,248,246,211, 83,159,108, 58, 35,197, 84, 11,139,106, 83, 39, 50,178,230,104,251,101,102,
- 82,248, 79,139, 58,181, 8,206, 10, 77, 81, 63,242, 55,199, 35, 94,223,175,248,238,225, 9, 49, 87, 60,156,103,248,247,159,240,
-238,213, 61, 78,131, 67, 42, 69,119,234,202, 91,103,153, 58, 58,115,189, 67,222, 84, 67,109,116,200,162,157, 2,176,100,134,205,
- 12, 80, 1, 33,163, 20, 25,181,183,157, 51,233,186,135,179, 18,235,172,252,185,118,161, 71, 85,196,151, 82,144,116,191,142, 93,
-124,234, 78,177,132, 77,246,195,106, 51,148,253, 57,118,147, 58,174,172,180,186,172, 2,210,109,202,217, 41,108,157,160,167, 93,
-121, 19,200,113, 19,203,237,130,179,176, 27,201,119, 75,155,124,159,198,110,103,115, 67,118,111,218, 29,213, 68,237,132,119,141,
-213,177, 21, 42,186, 87,183, 70,112,200,227, 1, 55,119,119, 72, 41, 34, 43, 36,104, 60, 28,196, 58,235, 36,170,184,205, 12,184,
-227, 91, 5,180, 85, 91,108,171, 2,132,134,233, 0,230,138,220,178, 17, 64, 59,210,234,245,255,218,121,236, 88,131,225, 9,226,
-115, 38,222,114,110, 90, 60, 97,221,107,225,152,119,138,131, 13,115,199,251, 11,164,123,232, 54, 70, 60,161,226,178,204,248,242,
-197,139, 78,152,234,222, 82,222, 46,161,152, 69, 40, 66, 42, 12, 75, 5, 24, 88,242,137, 27,228,196, 88,139, 82, 25,211, 48, 96,
-125,255,103, 12,206,202, 15,172,209,144,213, 72,224,192, 37, 17,130, 55,176, 69,166, 9, 48, 6,169,206, 32,174,178,119, 84,134,
-238,154,100,143, 85,170,140,116,171,102,138, 19,137,234,242,230,120,196,186,196,238,165, 38,218, 51,121,183,143,107, 19, 63,244,
- 11,189,119,234,181,211,172,164,227,213, 61,110, 41, 87, 52,191,125,113,131,125, 48,203, 78,129,183,239,168,141,142,243, 12, 81,
-135,198, 92,129,131,246,239, 1,227,250,107, 93, 37, 13,113,127,168,122,116,123,221,208,199,109,226,149,149,169,222, 86, 18,172,
- 59,231, 62, 73,232, 12,249,109,248,144,219, 24, 77, 69,125, 85,243,205,187,253, 70,213,159,133,247,251, 62,234, 15,215, 30, 95,
-188,231, 40, 64,215, 36,198, 26, 60,158, 47,184,153, 38,164,231,103,177,153,105,144, 2,145, 21, 74, 97,169,128,142,247, 26,164,
-194,104,177, 85, 88,108,147, 13, 57,155, 99,196,233,230, 37,214,117, 6,192,152,166,131,124, 94,115,194,186, 46, 56, 12, 35,230,
-121,134,117, 1,165,200,197,100,173, 65,101,215,249,216,211, 65, 66,106,130, 31, 48, 47,171, 10, 9, 9, 41, 39,196,148,101, 20,
- 29,132, 95, 30,172,193,241, 48,226,195,167, 15,168,165,224,249,124, 70,112, 94, 20, 39,181,194, 56,175,225, 27,140,156, 86, 24,
-235,176,174, 11,194, 48, 72,220,168,147, 24, 81, 3, 35, 89,246, 37, 11,251, 33, 70, 85,225,158, 0,178, 56, 63, 61,138,205,205,
- 89, 21, 88, 26,140,147, 68,194,198, 20,225,172,195, 52,201,133, 94,139,238,105, 75,145,221,108,173,152,166, 9,231,243, 5,131,
- 23, 60,171, 49,178, 83, 46, 73,148,245, 41,103,156, 47, 11, 14,135, 17,113, 93,225,125,192, 52, 77,253, 61,245,206,137,149, 77,
-167,111, 41,101, 28, 14, 7, 21, 43,201,110,242,112, 16,160, 77, 74,130, 43,197, 26,145,171, 96,159, 75,206,162,206,215,239, 61,
-169,165,208,232, 57,113,156, 14,168, 37,227, 50, 11,236, 72, 58, 71,209, 0,120, 43,168,221,219,219, 83, 31,167,143,227,136,117,
- 94,240,124,126, 22, 4,176,242,228, 27,231, 28,204,178, 67,134,136, 9, 83,202,112,206,202,248, 95,155, 12, 99, 12,144, 99,247,
- 34, 47,185,200, 84,128, 24,247,199, 9,222,203,133, 94,185,226, 56, 14,253, 66, 21,244,174,134, 63, 17,245,100,190, 22,198,194,
-234,244, 41,170,244, 79,185, 96, 24, 60, 94,223,157,240,213,247, 15, 40,165,224,211,243, 51,166, 65,108,143, 71, 71,248,180,228,
- 45,123, 98,151, 67,222, 30,226, 61,136,133,247, 34, 90,146, 14,121, 89, 22,228, 36,214,224,160,197, 77,247, 79,211,166, 23, 34,
- 42,253,145,140, 57,107, 39, 93,176,166,132,162,197,122,179,234,109,201,147,188,195,183,210,182,218,101,160,160,162, 20,238, 69,
- 0,235,249, 37,106,119,189,240,235, 46, 8,156,118, 13,210,110,180,190,183,176, 49,225,138,215, 65, 59,113,210,222, 77, 35, 17,
-175,212,125,242,188, 27,233,243,150,156, 46,180, 81, 99,251,204,116,143, 65,103, 85,177, 91,231,225, 92,232,247,212,243,211, 35,
-226, 50, 35,103,129, 92,249, 97, 20,223,191,247,125, 50, 90,138,208, 8,141,114, 40,202, 42, 25, 8,235, 60,119, 23,142,184,109,
-154, 45,110,148,103,179,110,218, 54, 98,200,120,191, 23, 94, 14,142, 89,187,161,158,200,166, 69, 77, 39,205, 93, 51,244,120, 23,
-177, 65,204,251,254, 17,180,191,234,118, 2,171, 61, 19,189, 42,152,190,143,160, 65,226, 31,118, 70, 95,112,211, 47,136, 65,199,
- 90,164, 31,148,201, 12, 58, 58,149, 55,245,124, 62,227, 24,130, 84,105, 44, 74,119,231,164, 67,183, 58, 81, 88, 75, 70, 42, 12,
-148,162,232, 76,249,123,159,230, 5,206, 0, 41, 21, 68,197,143,178, 49, 96, 67, 56,167, 36, 65, 3, 85,146,153, 82,204,189,218,
-222,196,106,102,151,131,190,145,135,250, 8,188,141,221,219,174,189, 20, 24, 75, 48,140, 46,228,106, 29, 55,181, 93,205,190, 20,
-109,169, 67,212, 95,237,157,237,173, 93,222, 69,197,109,185,251,202, 27,126,144,120,131,224,112,197, 46,235,232, 42,125, 80, 67,
-142, 54,235,155,221,149,244,117,143, 11, 6,186, 88,174,219,213,246, 99,176,158, 66, 71,221, 27,223,119, 90,187, 66,144,118,224,
-143,150,140, 84,119,147,136, 86, 61,246, 24, 68,162,107, 74, 94, 31,159,201, 37,157, 98, 66,104, 1, 49, 90, 52,132,113,132,247,
- 30,181,200,225, 22,188,195,154, 46,170, 55,168, 58,134,115, 48,181, 34,115,148,145,112, 18, 49,150,113, 22,119, 47,191,196,167,
-143,127, 86,113, 83, 65, 78, 5, 37,103,172,201, 97,116,226,111, 31,135, 1,214,184,109,101, 65, 44, 15, 33, 24,243,124, 17, 65,
- 40, 87, 48,228,225,181,214,160, 84,194, 56, 4,124,122,122,196,171,215,175, 81, 65, 24,198,131, 84,233, 90,156,197,148, 0,235,
- 97,213,161,144, 75, 86,118, 56,129, 96, 59, 28,197, 26, 11,174, 73,179, 10, 2,150, 44, 12,123,230, 36, 62, 85, 34, 28,142, 55,
- 48,214,137,141,204, 27, 44,115,132,213, 34,161, 26, 66, 94, 86, 28,142, 7, 4,231,165, 64,210, 29,126, 86, 69,122,106, 25,226,
- 0,158,159,159,251, 97, 89,149,169, 94,139,160, 62, 91,134,116, 24,188,188,247, 85,124,237,207,207,207,112, 26, 33,233,172,196,
-151,206,151,139,178,220, 45, 64,114,209, 87,237, 8,159,158, 46,186, 30,171,200, 49, 98, 26,100,124,185, 46,171,132,160, 24, 35,
-175,143,254,158, 48, 4, 60, 95,102,120,239, 49,175,177,167,241,173, 57,245, 17, 55, 17,193,122, 47,208, 23, 34, 4,239,113,115,
- 58,194, 89,135,135,101, 70,173, 5,211, 56, 34,101,121,230,187,216, 85,133,191,203,178,118, 72,140, 37,234, 4, 62,163, 17,207,
- 85,159,155,175, 63,126,218,152, 14,154, 65, 32, 26,155,218,241,176,165, 86,120,227,144,107,133,179, 26,160,212,120, 12, 92, 81,
- 89,196,189,165, 20,128,208, 69,150,178,126,112,184, 59, 30,240,116, 94,240, 52, 11, 10,249,227,211, 25,119, 58,153, 10,196,152,
-115,217, 58,191, 90, 84,183,211, 84,222, 29, 20,173,121, 32, 77, 31, 5,165,202,137, 38, 41, 37, 66,114, 89,207,221, 45, 69,211,
- 20,241,214,199, 40,147, 13, 99,128, 84,170,156,159, 89,173,106,157,114, 41,203, 72, 82,152,139,184,155, 54,137,107,115, 63, 20,
- 29,101,231,230, 91,215,179, 70,214,116,181, 23, 7,251, 73, 67, 35, 93,210,174, 80,160,109,254,160, 5, 59,122,131,213,217, 37,
- 45,237,172, 17,229,118,112,173, 22,119,138,207, 70,218,181,213, 61, 13, 65,222, 64, 48,237,207,144,133,179, 30,206, 75, 64, 15,
- 84,216, 87,107,198,229,249,177, 79, 70,139,186, 5,106,221, 10,230,154, 37,174,217,251, 0,203,122, 46,237,109,204,204,200, 49,
-162,168, 38,195,122,175, 26, 8,101,200, 52,126, 71,203,104,215,207,164,177, 22,142,169,202,216,157, 72, 31, 90, 13,110,233, 41,
- 54,155,178,187,121,192, 25, 27,180,190, 39,108, 84,116,147,126,219,197,179,142,241,183,238, 29,248, 56, 47,176,206, 3, 49,118,
-171, 65, 73,114,216, 52,164, 41, 67,188,163, 57, 23,120, 43, 93,222,168,123,117,171,213, 44, 17,225,230,230, 6,223,198,136,163,
-151,135,215,123,143,224, 36, 24,193, 66, 63,116,133,113,137,194,245,246, 57, 35,233,138,225, 50,175,112, 4, 92,114,221,246, 50,
-214, 98,102,137, 54,180, 0,150, 92, 17,166,208,223,108, 34,193,207,114, 81,145, 73,163, 14,211, 6,237,225,158,159, 46,213, 29,
-107, 28, 94,187, 60,183,212, 54,244,200,198, 22, 26,210,133,101,202, 1,239,150, 58,200,122,128, 43,127, 6,161, 65,247,202,243,
-206, 87,222,212,240, 45, 57,142,177, 49,163,205, 14, 27, 91,181, 99,181, 90,153,150,190,203,218, 4,127, 87, 86,178,157,207,126,
-123,152,208, 21,242, 78, 1, 62,180,201, 88, 58,142,145,186,214,226,218,251, 95,155, 85,142,119,196,190, 61,131,185,131, 29, 72,
-253,246,237,181,150, 34,240, 18,179,230, 17,203, 3,126,163, 59,212,154, 11,150,152, 58, 5,171,150, 2,107,209,179,160, 91,119,
-152,178, 92,216,204, 12,228, 44,159, 77, 48,230,203, 67,159,214,140,227,132,154, 34, 6, 69,191, 30,166,131,112,173,157, 76,120,
- 14,199, 35,150,117,193,253,205, 17,203, 60, 43, 66, 18,168,121, 65, 76, 2,215,185, 44, 51,134, 48, 96, 94, 22, 4, 43,192,153,
-187,219, 91,217, 87,134,128, 17, 2,171,144,162, 85, 39, 88, 37,139, 64,135, 4,125,106,244,178,168,165,192, 26,214,231,195,163,
-114,193, 48,140,112,206, 98, 89,165,115,180,214,138, 35,192, 9,157, 45,167,164,162, 82,233, 28, 39, 47,123,242,117, 89, 84,212,
- 89, 80,117, 79,223,232, 95,167,195, 1, 37,103, 60, 45, 11,188,181, 61,108,201, 89,177,226, 17,145,142, 95, 51,140, 49, 56, 78,
- 83,143, 80,126,124,122, 64,240, 1, 57, 75, 81,235,221,208,195, 40,130,142,252,107, 21,161,230, 60,207,224, 16,144,114,134, 37,
-233,204,155,149,108, 93, 18,172,119,152,215, 21,150, 8,177, 48, 78,135, 17, 40,178,238,243,106,133, 52,109,162, 72, 4,103, 93,
- 95, 77, 4, 47,194,194,113, 28,229,130,223, 9,156,140,115,240, 93,168,169,187,205, 48, 0, 4, 44,243,210, 69,113,146,221, 30,
- 20,146,162,133,133, 62, 43,222, 7, 92, 46,179,100, 0,232, 36,239,197,113,234, 97, 40,109,108,157,139,140, 97,207,203, 42,185,
-243,206,116,253, 14, 17, 75,177,207,140,154,228, 53,130,106, 97, 26, 89,143, 0,140,193,227,197,205, 1,231, 53,138,243,231, 50,
-163,148,130,119, 47,110, 49, 57,194,243,146,251,227, 85,101,185,127,213,209, 98,183,115,190,130,140,233,234, 21,202, 34,104,248,
-234,102, 39,110, 66,180,108,118,176, 41, 34, 25,143,103, 25,143, 55,160, 73,229,109,148,221, 0, 88, 64,131,195,232, 62,191, 42,
-121, 84, 11,243,170, 17,206,202, 11, 83,125, 68,237,218, 4,236,186,102,218,163, 59, 62,223,145,239,119, 13,252,195, 17, 53,136,
- 96, 84, 60, 47,185, 0, 91,232,215,166,115, 50, 59,245, 14,119,156,235, 62,112,202, 90, 3,231, 2,156,243,186, 3,215, 4,210,
-154, 97, 97, 49, 14, 1,147,142,205, 5,119,172, 34,224,146, 81, 85,225,110,131,239, 13, 97,206, 17, 37, 37, 9,169,105, 22, 96,
-239,182, 21, 36,179,134, 65, 65,201,153,186,195, 47,159, 97,253,117,133, 99,154,114,178, 95,198,237, 66,223,165,205, 64,187,169,
-206, 60,231,107, 62, 17, 51,247, 64,151,189,237, 11,187,228,210, 38,206, 90,117,140,102,246,254,196,166,176,175,117,215, 93,106,
-186, 77,231,174, 87, 21,100, 9, 35,188,214,138,101,153,241,241,188, 34, 43,103,120, 85, 54,187,245, 14,214, 59, 12, 67,192, 52,
- 10, 2,115,244, 22,255,205,127,251,111,145, 75,237, 59,189, 38,254, 66,101, 88,146, 81,118, 44,162, 60,245,214,192, 56,131,117,
-137,240,154, 2, 86, 84,174,221,133, 25, 10,220,231,238,209,222, 87, 90,170,254, 54,248,140,170,191, 79, 77,218,128, 2,212, 84,
-246,106, 17,163,238, 57,221,216,228,216, 33, 19,175,208, 0,122,192, 96,231,237,174,154, 10,212, 69,126, 42, 22, 43,187,228,179,
- 6,252, 73,250, 16, 65, 5,100,188, 11,229,217,218,251,186,161, 8,177,197,153,214, 30, 86,128,206,226,222,246, 87,188, 93,214,
- 59,117, 27,245, 56, 79,245,175,235,235,105,212, 7,106,173, 48, 9,172,118,143,198, 88,117, 70, 8,189,173, 93, 28,133, 69, 63,
-193,144, 49,255,168,161, 38, 48, 6,107, 86, 80,139,234, 35, 24, 27,174,114, 15,206,108,213,175,248,211, 69, 25, 77,100,177,174,
- 23, 17, 92,133, 65,138, 78,239, 80,136,112,115,119, 47,168,209, 42, 75, 0, 0, 32, 0, 73, 68, 65, 84, 17,175,100,241,240,240,
-136,203,124,193,249,124,134,177, 3,158, 46, 51,158, 47, 51, 46,107,132, 15, 99,159, 54,213, 90, 17,188,100,120, 51,137,242,155,
- 0,140,211, 40,132, 58, 24,185, 76,245,247, 5,231, 36, 30,214, 88, 77, 22,179,253,243, 16,115,134,243,114,233, 57,231, 0, 46,
-125,108,156, 82,198,178, 44,136,107,196,101,158,177,172, 51,210,186,226,252,252, 44,209,141, 10,171, 25,199, 17,227, 24,224,188,
-197,116, 56, 0, 68, 56,158,110,112, 58,158,244, 89,103, 76,135, 35, 82, 46,162,108,183,130,171,141, 41,245,241,113,163,128,149,
- 82,113,127,115,196,221,233,216,253,216,203,178,160, 86,198,178, 44,152,231, 89,125,215,194,208, 23, 42,151,224, 93,157, 37,172,
-113, 69,169,140,243, 60,235, 56,218, 96, 89, 87,164, 82,240,240,244, 4,231, 37,129, 77, 68,201,202,245, 39,241,140,203, 88,210,
-245,142,210, 40,140,102, 89, 23,140,227, 40, 35,127,178, 87,108,140,152, 68,208, 39,138,124, 73,149,203, 69,108,136,226,243,247,
-122,112, 10,124,134,213, 82,213,158,173,198,112, 72,169,160,178,236,236, 47, 41, 95,173,206, 14,218,153, 55,149,123, 43,198, 59,
-131,163, 79, 36,229, 89, 74, 81, 96, 63, 57,165,158,212, 23,147, 68,214,122,239,250,244, 36,120,135,195, 24,112, 24, 2, 80,229,
-123,185, 44, 43,158,230, 69,156, 61,205, 62,168, 2,176, 92,234, 6,133,218,173,219,218, 62,183,177, 85,122,206,132, 54,110,172,
- 58,134, 37,102,172,185, 96,205,178,202, 88,163,172,143,214,152,177,164,164, 23,250,214, 48,108, 74,224,107,125,213,142,134,213,
- 69,112,185, 72, 49,221,186,245,246,239, 83, 46,154,211,126,189,230,109,157, 52,204,118, 65,247,160,150,171,162,133,174,210, 49,
- 9, 45, 21,205,244,166,225,115, 2, 27,239,156, 71,251,175,209,197,119,166,225, 89, 13, 92, 24, 16,194,164,137,143,220, 1,242,
-141, 99,111, 12,225,197,253,237, 46, 11, 93, 26,137, 97, 24,149,187,178,233,175, 4,198,147,192,165, 72,147,160, 69,189,181,130,
-231,109, 8,104,174, 69,166,217, 70,116, 38,198, 90,144,177, 59,204,108,211, 16, 72, 81,230,234, 46, 63,157,175, 8,182,219,184,
-147,119,153,196, 18, 82,176,203,193,172,251, 63,181,191,182,106,127,147,121,203,154, 7, 81, 85,187,205, 69,236,108,188, 17,154,
-218, 24,186,189, 89, 85, 5, 18,174,103,250,202, 62,178,249, 14,255,195,191,255,107,156,130, 71,174,140, 65,147,146,114, 76, 88,
- 85,149, 25,188, 69, 45,132,224, 45,198, 48,226,253,119,223,194,112, 85,196,163,238, 94,137, 85,241,236,177,228,132,193,136,160,
-206, 25,131, 88, 24,181, 36, 56, 39,162, 33,222, 93,194,219, 90,250, 58, 57, 76, 62, 20, 22, 21,185, 95,198, 29,196,207,219,150,
-105,195,178,154, 94, 58,183,202,172,118,202, 28,182,204,244, 62,123,178,154, 30,196, 87, 1, 69,125, 76,213,139,164, 93,186,209,
- 62,207,173,193, 12, 26, 97,206,108, 10, 89, 40,218,147,121,195, 34,182,138,246, 10, 35, 76,219,215, 51, 68,224, 31, 66,242, 59,
- 48,168,125, 93,163,232, 80,179, 87,107,234, 11,230,157,217,148,173, 87,255,253,186,203,104,170,117,235, 28,156, 17,170,152,177,
-140,129, 12,242,154,100,164,135,166,191,200,136,172,228, 42,146, 67,162, 5,188,144,146,156, 74, 78, 61, 28, 70,148,178,178,199,
-108, 12,229, 82, 11, 62, 62, 62, 96,244, 1, 54,101, 4,239,240,252,244, 40, 15,153,113, 8,222, 97, 24,101, 47,156,210,138,224,
- 3, 66,112, 72,149,240,225,195,123,132, 97,192,186, 68, 88, 67,154,203,109,176, 92,158, 96,157,199,121, 89, 80, 74,193, 50, 47,
- 50,246,175,132,233,112,236, 79,223,116,112, 82,189,167,168,221,145,224, 87,125, 24, 97,173,168,139,165,163, 41, 32,178, 72, 36,
- 98,191,224, 3, 10, 24, 53, 37,161,178,133,128, 3,110,228, 48, 89,132,183,238,125, 64,174, 85, 5, 91, 21, 7,213, 13, 16, 17,
-206,151, 51, 74,173,152, 23, 25,107,251, 33,136,133,205, 26,228, 12,217,155, 79, 3,200, 90, 81,177,135,160,225, 40, 14,133,185,
- 71,149, 78,227,136,101, 93,225,212,167, 59,142, 3,214,117,237, 2, 62,103, 8, 41, 37, 45, 4,165, 32, 43,165,202, 69,204,226,
- 97, 15,222,109, 78, 11, 54,136, 57,227,116,152, 64, 96, 60, 95, 86, 28, 15,163,118, 72,165,179, 33, 82,202, 8, 77,127, 99, 4,
- 34,212,146,216,162, 90,214,230,121,150,130, 47,199,206, 97, 87, 63,144,242,238, 69, 77,239,188, 85,149,191, 83, 39, 6,119,238,
- 68,102,198, 64,194, 87,184, 68,161,246,129, 8, 55,163,239,159, 83,210, 36,191, 22,183, 25,163, 92,242,205,183,222, 44, 91,214,
- 24,164,164, 23, 36, 53, 36,182, 52, 53,107, 44, 59,252, 53, 35, 56,143,105, 24,240,188, 72,183, 94,152,241, 60, 71,140, 97, 64,
-176, 14, 75,138, 72, 41,202,103, 84,184,218, 59,191,214, 63, 19,218,166,194,232,186,235,130,197,181, 36, 35,243, 54, 93,108, 62,
-232,174, 57,171,212,243,221,175,108, 41,117, 63,213,219,190, 86,243,247,183,221,121,101, 6,171,138,190,173,245,234, 30, 56, 69,
-215, 26,247, 54,246,110, 28,118,179, 63,123,245,242,222, 38,160,212, 21,239, 77, 44,219,239,169,207,129, 98,109, 29,177,183,200,
-181,169,172, 32,235, 64,100, 97,201,194, 89,167,155, 13, 17, 57, 91,141,226, 45, 37,171,240, 87, 4,169, 47, 94,222,233,180, 75,
-167, 99, 68,114, 81,183, 8,228, 82,174,240,174,114,185, 11, 11,223,122,117, 1,104,161,101,149,236,215,214,180,155,192, 41,119,
-225,220,102, 33,150,149,172,107,153,180, 59,202,137,250, 4,183, 23,128,118,185,177,210,241, 53,216,252,134, 24,229, 29,167,188,
- 15,236,123, 91,191,137, 54,152, 25,239,222,190,194,135, 15, 31, 59, 55, 26, 68, 40, 41,194,248,161,219,148,156, 33, 61, 56, 10,
-170,145, 10,221, 26, 69,129, 26, 17, 37, 29,157,193,201,123, 81,190, 90,131, 88,212, 91, 57,175, 32,107,145, 87,131, 88, 43, 28,
-128,156, 86,233,208, 65,120,243,163,191,192,167,239,255,172, 9, 87, 27,164,229,224, 29,150, 82,251, 62, 69,196, 60, 19, 46,231,
-229,202,198,209,186,217, 14, 57,145, 0,110,177,112, 25,131, 82,114, 87, 92,122,231,187,117,161,191, 62,170, 11,216, 91,199,106,
- 23,215,215, 43, 79,118,247,168,183,206,183,150, 93,162, 9,126,144,203,219, 29, 9, 93, 56, 39,104,196,210, 18,221,104,103, 33,
-107, 73, 68,180,131, 8,241, 54,202,170,123,111,251,238, 33,107,126,245, 22, 72, 67,251,241, 85, 35,237, 25,211,227, 3, 91,161,
-182, 61, 48,180, 19,238, 24,181, 12,225,106,239,222,186, 37, 1,128, 56,188,124,113,143, 31,253,232, 75,188,125,243, 74, 30, 46,
- 48,254,240,251, 63,226,195,183, 95, 99,185, 60,137,114,122, 12,202,120,151,247,194,238,114,236, 91, 17, 82, 42,195, 40, 35,188,
-106,161,216,236, 51, 68, 21,198, 6,188,255,243,239, 55,138,158,245, 8,227,132,117,185, 96, 48, 2, 69, 73, 41,129,144, 49,140,
-199,158, 78,152,185,130,203, 5, 75, 20,207, 58, 57,217, 47, 91,239,145,107, 85,101,176,216,204, 82, 41, 88,150, 5,239,223,191,
-215, 20, 55,181,172, 1, 66, 66, 3,131,184, 34,171, 53,142,245,160, 44, 76, 8,196,178,211,180, 50, 1, 40, 44, 17,195,153,133,
-105,239, 64, 88,215, 85,212,219,168, 40,105, 21, 97, 89, 92, 53,235,222,203,190,148, 89,149,225, 65, 10,103, 67, 72, 49,137,181,
-203, 58, 4,157, 78,249, 65, 34,143, 47,203,170,147, 3,171, 93,177, 69, 86,241,216,101, 94, 49, 29,100, 93, 22,188, 3, 87,163,
-252, 0,137, 39,205, 37, 99, 89, 91, 65, 87,101, 76,105, 61,214,117,149,181, 88, 24,145,138,216,220,114,206,168, 92, 69,113,174,
- 41,125,139,230, 6, 92,249,185, 21, 49,235,157, 36, 55, 30,166,161,103,130,159, 78, 55, 2, 46, 34, 96, 26, 7, 44,243, 69,173,
-177, 14,214, 90,204,243,140,152, 50,140,147,169, 66, 67, 30, 7,239, 84,168, 39, 32,162, 90,170,162,115,185,175,139, 60, 20, 48,
- 99, 61,136, 11,190,127, 94,148,115,175,238,157,224, 59, 27,193,247,137,147,233,103, 97, 97, 70,208, 68, 67, 18,254, 54, 18, 23,
- 56, 69,135, 54, 63,118,243,198, 39, 85,219, 55,209,173,115, 14,131,247, 24,131,195,188, 38, 88,235, 81, 97,113, 89, 11,114, 94,
-197,215,220,196,171,220,166, 7,116, 21, 7,221,206,178,189, 34, 74,242,187, 55,235, 45,209, 54,248,102, 70,207,123,104,169, 89,
-155, 3,103, 7, 14,175,123,105,189, 6, 95,237,245,213,216, 83, 34,165, 27,145, 98, 73,166, 10, 27,118,123, 95, 39,232, 57,213,
-162, 75,185,145,212,112,165,102,167, 70,187,220,159, 53,251,125, 3,181, 2, 96, 31,235,141,190, 90,148, 70,178,246, 44,122,128,
- 64,214,193,153, 0,134,236,211,155, 85,213,234,196, 16,204,200, 53,117,212,249,198,245,183,253,245,225,182,123,236, 35,242,186,
-101,121,144, 8,115, 99,140, 40, 89,242, 32,132,224,103,181,169,170, 61,168,138, 52,147, 35,231,188,173, 11,245,127, 37,215, 78,
-154,147, 64,151,150,168,214,106, 54, 49,162,139,200,129,175,247,228, 91, 54,215,118,216,243,126,124,222,189,234,181,163, 83,107,
-179, 78, 48,174,216,186, 50, 98,176, 58, 98, 86, 63,174,222, 85,165, 20, 88,114, 40, 57,129,130,236,204,138, 10, 43, 64,128,169,
- 5, 48, 18,147, 26, 6, 47, 5, 0,196,159,103,117, 44,156, 43,203, 8, 73, 3, 15,156, 53,248,243, 31,126, 15, 59, 12,152, 31,
-222,139, 10, 86,115,194,141,105,130, 8, 35,251,114, 38, 60,171, 2,247,221,187,119,248,201,143,222,225,175,255,246,183,200, 89,
-170, 96,217,157, 81,223, 61, 55, 44,172,112,223, 69,172, 87,213,150,150,203,117,198,186,213,195,184,234, 56,133,119,121,242,189,
- 64,218,147,227,118, 15, 65,119, 20,104, 39,223, 50,123, 27,205,172,173, 48,228,165, 54, 50, 14,106, 10,219,206, 38,222,222, 15,
-194,246,207,253,129,194,142, 79,111,204, 38,102,100, 6, 25, 25,163,218, 6,131, 97,116,128,132,161, 29,225, 9,162,194,108, 69,
-207, 62, 54,144,204,166,212,236, 19, 12,221,131, 26,221,219,190,124,241, 2, 95,126,241, 14, 47, 95,220,246,175,179,175,217,115,
- 22,209,225,225,120,196,183, 69,163, 60,117,130,100, 33,101,124,169, 5,177,100, 21, 98,161,239,249, 13, 17, 92, 24, 96, 72,194,
- 72,184,137, 36,107, 5,233,120,250,246,254, 45,158,159,190, 23,194,157, 41,240,167,123,152,241,136,229,249, 1,143,143, 15,184,
-189,185,209, 49, 32, 16, 83, 22, 87,128, 17,130,157,119,164,121,224, 50, 53, 25,188,131, 45,140,241,197, 11,196,148,241,252,244,
- 0,148,132,148, 50,158,158,159,133,162,198, 6, 31,222,127,144,139, 84,159,247, 24, 87,181,224,105, 40, 6,244,242, 46,181,195,
- 61,184, 50,134, 48,160, 84,233, 80,101,244,188, 74, 48, 74,149, 17,170,183, 14,185, 68, 12,170,218,119, 78, 98, 29,159,207, 23,
-156,142, 39, 41, 30, 52,174,181, 20,161,152, 73, 40,139,236,165, 47, 10, 61,105,221,179, 49, 6, 33, 4,148,148,112, 58,157,144,
-162, 8, 13, 83, 76,240, 26, 91,204,234, 40,184, 61,221,244,113, 97, 24, 6, 17, 12, 41,215,251,195,249, 1,183,167, 19,150,101,
- 65,169,162, 40, 95, 83,130, 85, 64, 80,173, 21, 33,120,156,207,103, 77,239, 51,168, 68,155, 98,152, 12, 78,199, 35, 62, 61, 60,
-200,196, 33,139, 10, 59,232,110,222,107,116,232,249,114,198,241,112, 16, 24,138, 33, 92,150, 69, 4,117, 94, 38, 11,173,120,246,
-206,105, 17,197, 87,137,131,163,179, 40, 89,214,104, 82,228, 25, 84,178,240, 37,129,156,195, 57, 21,213, 59, 24,140,222,118, 28,
-114, 91, 27,201,136,182,246,162,222,146,193,162,186,132, 13,248,100,117,196, 47, 26,129,148, 50,140, 78, 99,154,248,115, 67, 82,
-179,102, 96, 12, 40,176, 48,214,129,107,197,195,243, 19, 12,218,186,110, 67, 87,151, 22,206,212,129, 44, 77, 16, 86,122, 18, 39,
-183,213, 42, 53, 42, 36, 93,133,115, 48,237,130, 96, 42, 64, 70,197,178,188, 15, 89,234,243,191,174,181,225,221,247, 76, 42,187,
-111,118, 45,230, 10, 46,232,154, 28, 13, 93,211, 8, 11,234, 63, 3,117,141, 18,131,216,116,214,122,239,178,251,153,131,206,218,
-239,251,245, 54,102,103,192,192,160,170,198,107, 47,210,238, 46, 46,162,158,226,102,173,133,117, 3,170, 9,200, 41, 41,231, 94,
-108,166,212, 99, 78,203,149,208,153, 84,239,181,229,208, 19, 0, 17,174, 89,181,216, 66,243, 16, 88,249, 38,181,233, 92, 0, 56,
-231,175, 92, 10,198, 24,212,220,154, 14, 93,117,229,172, 57,242,122, 87,235,200, 95, 28,108,220, 39, 12,142,105, 55, 45,215, 55,
- 68, 46, 98,189,152,155, 96,106,119, 49, 75, 33, 88, 91, 67,216, 61,159,251, 55,145, 53, 57,172,171,150,121, 7, 88,169,140,151,
- 47,239, 36,202, 82,193,255, 45,139, 58,169, 80, 75,186,106,133,136, 4,177,248, 24,211,136,115,162,212, 31,130,140, 38, 92,139,
-222, 84, 15,187, 81, 97,198,188, 38, 84, 67,240,204,184,121,251, 37,254,251,255,241,223,225,127,254,159,254, 7, 44,113, 69,204,
- 69, 47,103,217,167, 23, 8, 86,243,156, 50,230, 84,177, 86,198, 77,112,120,120,120,194,143,223,189,197, 95,254,171,127,129,243,
-121,198,239,255,240,149, 88,147,226,170,100, 47,234,123, 48,230, 54, 78,225,141, 59,204,123,213, 60,245,157,110, 35,244,245, 96,
-211,157,205, 67, 46,207,114,157,198,208, 84, 36, 61,187,119,179,127,201, 4, 99,251,144,237,247,246,172,254,107, 83,141,164,107,
-237,162, 94, 43,201,120,127, 75, 18, 16,203, 83, 45,187,209,153, 94,244,141,146,100, 28,233,238, 19,255,236,200,220,104, 34, 17,
- 51,195, 91,191,219,249, 24,205, 33,150,221,184,181, 22,199,195, 1,111,222,188,194,219, 55,175,113, 60, 76,157, 55,223,187,121,
-230,174, 18,109,235, 13,238,251, 59,131,249, 50, 75, 32, 14, 1,131,238, 67,107, 43, 64, 44,193,177,133,163,128,121, 94,174,242,
-236,157, 27,117, 39,255,116,229,125,183, 74, 38,116,110,216, 86, 13,110,192,253,235, 47,165,240,121, 83,112,186,125,209,199,228,
- 95,255,238, 55,120,250,254,107, 84,102, 12,131,151, 46,154, 9,117, 93, 49,140, 22,140,140,186, 2,167,105,194,243,249,130,164,
- 40,219,112,115, 47,211, 28,150, 93, 26, 52, 17, 75,210,159, 74,207, 40,224, 74, 18, 99,170, 15,136,128,104,156,236,179,189,239,
-232,132, 85, 47,137,117, 89,186,213,138,187, 11, 67, 44, 99,226, 37,206,114,105, 70, 25,255, 61, 95,206, 56,140, 35,130, 49,136,
-203,170,227,112, 93,143, 45, 51,136, 12, 46,139, 88,196, 10, 42, 50, 11,243,189,234,222, 51,158, 47, 32, 50, 56, 76, 18, 43, 90,
-149,239,237,188,199,203,219,131,124,158, 84,200, 86, 83,198,195,227, 39,193,154, 50,227,230, 40,216,213,166, 80,103, 34, 12,222,
-227,249, 50,139,189,110, 28,112,190, 92, 58,190,118, 93,163, 70,209,202, 97, 54, 28, 68,116, 40, 62,112,121,205,188,247, 40,149,
-113,152, 6, 88, 99,145,115,196, 56, 4,204,203,162,144,156, 91,153, 98, 88,135, 33, 4, 92, 86,225,232,111,124,127,113, 31, 8,
-190,212,194,248, 13, 74,210,158,177,148, 10, 74,140, 56, 29, 15,248,246,225,121,163, 15, 18,245, 93, 58,169,103,186,109,228,138,
- 58, 4,192, 34,204, 28, 66,216,209, 21, 53, 78, 89,197,181,185,197,254,106,251, 84,114,222,214,146, 90,108, 59,107, 49, 13, 19,
- 42, 37, 92,214, 5, 37, 39, 29,227,183, 24,211,221, 37, 91, 25,108, 42,152, 77, 79, 23,219, 86, 95,116,149,245,193,140, 31,128,
- 93,118,155,230, 77, 69, 85, 91, 60,232, 15,129, 80,125,242, 71,215,251,186,214,252,148,186,105,107,184,110, 99,127,230,186,137,
-165,193, 87, 2, 56,110,106,100, 93, 71,126,102,200,234, 59,229, 70,245,108,143,116,211, 25, 52,125,151,169, 4, 54,187, 81,190,
-106,229,141, 66,201,100,181, 23, 96,173, 7,181, 92,132, 20,251,153,109, 52,183, 34,165, 45,247,188,239,205, 53,155,228,237,219,
- 87,106,201,147,115,213,123,177,157, 74,247,173,133,135, 78, 74,100, 52, 47,110,157,180,174,200, 73, 38, 17, 89, 11, 80,214,206,
-188,209, 66,155,221,180,253,204,205,198,205,138,236, 54,206,194, 90, 15,215, 83,214,250,126,124,163,151,237, 19,216, 54,136,192,
-142,251,222, 68, 83, 59, 63,228, 86, 85,214,171, 81, 75,163,163,181,247,225,238,246,132,239,190,115,176, 73,131, 78,200,224, 16,
- 28, 30,230,117,195,254,105, 6,182, 16,172, 34,166,105,232,239,230, 50,207, 61,250,112,240, 22, 73, 33, 38, 86,147,133,108, 97,
-100, 24, 76, 7, 77,215,226,132,255,237,127,249,119,176,117, 69, 24, 2,170,149, 23, 36,232, 12, 38,169,125,194, 21, 11,103, 1,
-231, 54, 90, 91, 67,205,157, 78, 7,252,235,191,252, 37,254,246,239,254, 99,143, 75, 44,185,200,110, 89, 15, 82,176, 92,244, 69,
- 59,241,189,240,162,116,225,155, 30,188,117, 27,171, 93, 13,195,184,234,212,105,191, 7,170, 29,229,204,125, 4,182, 29, 6,189,
-179,111, 81,185, 10,161,233,128, 24,162,110, 49,105, 62,204,166, 4,134, 33, 88,178,221, 81,103,189, 3, 52,123,122, 79, 42,106,
-202,207,170, 93,189,177, 91,183,221,133,131,170,184,111, 78,133,134,158,188,189,185,197,187,183,175,241,250,213, 11, 33,189,253,
- 96, 34,161,180,183,182,207,251, 76,199,209,241,195,251, 24,217,202, 56, 78, 35,158,227,172, 64, 17, 73,173, 74, 73, 46,204,154,
-101,119,203, 36,113,159,214, 56, 56,235,113,123,247, 26,195, 48,224,211,199,111,122,246, 59, 85, 29, 23, 15, 71, 28, 78,183, 56,
- 28,239,113, 89,223, 35,120,139,247, 95,253, 35,254,171,127,243,223,225,235,175,191,194, 79,255,226,167,248,244,233, 35, 46,243,
-130,219, 55, 63,194,225,238, 37,190,254,237,255,139,180, 68,184,233,128,146, 11, 74,205,112,206, 73,152,137, 78, 59, 78,135, 9,
-139, 53,168, 85,113,163, 97, 64, 90, 23,144, 49,152,231, 25,198, 72,182, 65, 8, 78, 70,194, 36, 19, 9,231,253,110,252, 41,123,
- 59, 99, 29,114, 76, 72,165,192, 89,143, 16, 28,226,178,224, 48,138,181,230,124, 57, 35,231,130,113, 58, 96, 89, 86,153, 34, 40,
- 16,197,121,135,154, 88,210,214,114,217, 38, 38, 4, 80, 41, 82, 88,171,143,122, 89,150,222, 77, 95,230, 21, 47,238,110, 4,210,
-162,239, 79, 19,101,229,156, 65, 58,150,183,214,192, 91,163,159, 31, 33,212,157, 78, 55, 96, 84, 56,231,113, 58,158, 68,212,186,
-174, 72, 73,118,193,237, 82,205,204, 18,209, 90, 25,159, 30,159,251,115,212,192, 76, 50,173,112,136,169,116, 78,186, 8,223, 6,
- 73,180,180,174, 59, 74, 82, 92,123,225, 89, 82,194,233, 78, 46,116, 98,225,234, 59,231, 17, 74, 5, 7,177,204, 85,150,201, 0,
-152, 49, 14, 65,224, 74, 36,212, 74,231, 76,191,244, 83, 46, 56, 29, 38,148, 82,240,188,234,212,142, 8,135,224, 58, 97,205, 59,
-135,224,156, 52, 32, 69, 38,155,206, 24,172,186,174,168, 44, 94,123,168,118,167, 48,195, 27, 66, 98,198, 96,157,170,208,185,239,
-230,179, 70,141, 26,165,154, 57, 23,224, 57,195,196, 21,156,147,166,252,201,196, 10,134,213,166,101,186,125,179,157,229, 29,172,
-194,155,103, 93, 18,183,174, 85,188,187, 32,202,171,156,200, 54, 88,223,208,214,216, 5, 78,109,244,181,157, 18,119, 43, 4,104,
- 99,209, 87,205, 21,105,130,108,222, 11,104,181,203,102,222,156,226, 13,244,213, 21,239,172,176,176, 29, 37,110,155, 66,238,213,
-238,232, 0, 25, 34,177, 56,183, 92,143,118,199, 72,200,148,217, 44, 97, 32,212, 28, 5,101,205, 86, 39,178, 86, 45,182,251,245,
- 4, 93, 9,127,133,133, 79,120,253,234, 69,119, 16, 65,221, 33,205,162,104,173, 83, 32, 27,250,106,205,251,160, 71,126, 27, 39,
- 10, 58,182, 79, 33, 32,133, 68,209,224, 33, 77,126,233,107,206,230,152,146,162,196,169, 79,253,179,176,144, 10,254, 44, 78,245,
-179,212,176,157, 32,174,225,253,122, 55,138, 93, 32,201,158, 27,222,126, 79,147,226,233,152,196,104,240, 66,173,242, 3,204,235,
-170, 80,146,140, 90,133,158, 85, 13,193, 14, 1,227, 56,136,234, 54,136, 95,111, 89, 46, 24,181,248, 40, 44,184,209,166,154,150,
-182,191,194,122, 3, 11, 0, 14,248,249,191,254, 47,241,211, 95,254,167,248, 63,254,247,255, 21,156, 43, 12, 85,120, 29,145, 26,
-222,160, 41,201,106, 69, 73, 6,145, 1,231,109,135,234, 19, 73,102,249,175,254,229,207,240,233,225, 9, 95,125,253, 13,138, 17,
- 69,168, 49,180, 11, 27,208, 52,186,202,221, 10,199,186,227, 99,152,171,224,156,246, 0,180, 55,167, 85,205,212,201, 69,102,211,
- 41,208,206,111,174,106, 76,236,212,243, 76, 91,119,208,157, 7, 44, 66,143,150,104,213,161, 11,125,109, 64,240,222,169,202, 86,
- 59, 22,133, 42, 88,221,241,144,142,248,140, 78, 68,108,251,192,153, 13,186, 35,255, 77, 82,244,110,111,110,241,229,187,183,120,
-249,242, 94, 66, 66,218,231, 66, 15, 92, 65,111,238,136,124,188,137,107,184,131,125,168, 11,246,174, 48, 16, 58,210,143, 41, 9,
- 98, 17, 98, 97,236, 57,244,181,192,178, 76,121, 44, 24,235,154,180,130,111, 33, 57, 22,247, 47,191,192,253,139,123,252,246,239,
-254,159, 62,150, 7,100,151, 23,198, 35, 74, 74,184, 60,125, 64, 74, 17,203, 26,241,227, 55, 63,193,223,255,253,111,240,252,240,
- 17,191,251,135, 95, 99,125,254,132,159,254,242,191,192,235,119, 63, 70, 14, 35,134,241,128,188,158, 17,215, 21,195, 48, 98, 26,
- 92,103,107, 91, 99, 16,215, 40,157,131, 53, 96, 22, 0, 75,205, 98, 33,243,134,224,131, 7,193,104, 23, 32,135,142,116,103, 91,
-224, 71,201,172,204,114, 39, 81,175,227,132,192, 21,231,243, 12,176, 40,105,171, 53,240,214, 10, 35,125,149,244,184, 53, 51, 30,
- 47, 51,156,147, 61,185,100,183,139, 64,109, 28,164, 72, 62,159,207,176,198, 72, 0,139,181, 88, 82,132, 97,201, 91, 88,150, 69,
-186,245,195, 40,175,175,181, 40, 49, 34, 21, 70, 65, 22,239,118,112,152,151,136,224,101,133,146, 74,134, 41, 18,235, 90, 42,227,
- 89,161, 64,169, 77, 20, 98, 66, 92, 87,233,124, 74, 65, 85, 29,141,113, 30, 65,227, 71, 31,233, 65,195, 85, 2,214,152, 48, 56,
-139,113, 24,100, 68,175,227,234,105,146, 64,153,210, 96, 87, 85,178,228,215,117,133,119, 2, 30, 90,150, 5,211, 52,105,135, 40,
-222,246,102,159, 10, 65, 82,239,194, 16, 48, 12, 3,190,251,254, 59,140, 67, 80, 11, 30,117,132,103,214,184, 99, 73, 23,147,149,
-225, 31, 62, 60,246,226,134, 12, 97, 10, 78,200,148,160, 30,208,210,206, 76,107,141, 88,230,122,199,189,173, 46,101, 21,224, 53,
- 67,222,116, 14, 68,211,202,212,134,170, 53, 70, 12, 98, 36,182,202,146, 19, 12,196,122,150, 10,235,103, 69,236, 97,198,146,146,
-241,168,251,191,171,130,163,182,149, 33,245,209,126, 35, 94, 54,113,108,195,110, 16,109,180,179,158, 39,222, 46,227,186,209, 30,
- 55,216, 11,119,190,197, 94, 16,187,233,131, 20,146,133, 77,188,214,126,206,193,251,157,170,125,199, 85,223,127, 79,216, 11,232,
-126,120,121, 91, 67, 59,210, 28,117,177, 48,104, 83,184,147,130,214, 88, 17,178,109,135,223, 38, 39,165,230,173,136,128,219,206,
- 57,150,166,135,106,197,158,214, 77,186, 82,148, 9,154,147, 92, 18,117,210,228,148,177, 92, 46,178,118,117,174,115, 32,226, 26,
-117,170,102,116,221,156,123,116, 45, 65,180,100,109,172,111,119, 83, 13,168,222,132, 88, 33,100,157,138,105, 65,186,190, 36,244,
- 64, 23,110,129,170, 93, 69,189, 9,184,218,142,125, 23, 52,182,251,160,244, 34, 79,247,127,220,179,134,209,171,146, 94,103,243,
- 94,144,197,120,113,127,139,168,225, 21, 68,178, 3,183, 86,242,142,247,137, 58,141, 26, 5, 54,136,235, 42,163,145, 53, 98,178,
- 70, 19,192,132, 65,110, 27,156,223, 26,148,202, 24, 12,228,129,116, 22,255,244, 55,255, 55,126,251,215,255,151,252,217, 93,117,
- 8, 2, 44, 8,163, 21, 88, 73, 2, 96, 43, 99, 41,242,193, 60,157, 78,253,195, 85, 89, 3, 96, 64,184,191, 59,225,213,139, 95,
-225,111,126,253, 15,112, 46,203,174,189,170,237, 13, 93,109,214,161, 3, 18,107,106, 59,180,165, 63, 42, 21,125,148, 83,247,150,
-151, 6, 80,216, 35, 97,121,167, 98,223, 17,231,104,127,139,239, 22,248,100,118, 99,113, 99, 97, 76,221,168,113,134,118,170,114,
-129,240, 48,116,140, 99,108,255,154,125, 55,213,119,243,212,197, 28,206, 75,231,213, 59,240, 16, 58,172,162,237,134, 74, 41, 61,
-231, 24,181,106,204,225,118, 85,203, 68,129,175, 14,178,150,198, 46, 15,223,102,116,103, 29, 57,145, 53,248,244,241, 9, 57,174,
- 24, 28,225, 67,202,240, 54,192,176,160, 49,141, 53,120,190,136, 64,140,172, 1,167, 34,227,108,245, 38, 15,131, 71, 8, 65,139,
- 10,113, 77, 72,225, 75,178, 71,190, 60,168,221,173,194,250, 1,247, 47,223, 98, 58, 28,241,205, 87,255,132,248,248, 61,156,117,
-120,122,255, 39,252,248,103,255, 18, 92, 43, 92, 24, 48,159, 31, 64,198,131, 74,133, 15, 6, 41, 85, 68,151,225,201,246,196,182,
-167, 57, 98,176,132, 88, 42,152, 53, 41,174,180, 48, 31,131,105,244,106,233, 1,106,138, 42,212,146, 81,109, 8, 3,188,218,174,
-104,145,139,166,251,213, 83,193,241,112, 80, 62,123, 2, 21, 65,119, 6, 0,135,227, 17, 94, 47,249, 24,147,164,167,169,109, 11,
-100, 36,148, 70,153,237, 34, 6,202, 93, 80, 86, 74, 65, 90, 22,220, 28, 15,112, 78,144,184,134, 68, 97,111, 76,197,241,112,144,
-209,111,201, 93,161,203, 61, 32,198, 98, 94,146,144, 4,189,112,230, 7,117,144, 16,100, 44, 89, 25,125,191, 60,142, 19, 64,192,
- 48,140,210,181,151,130,113,144,247, 40, 56,177,240,192, 24, 12, 62, 96, 94,102, 76,211, 1,207,231, 51, 82,150,226,196,238, 14,
-181,195, 52,244, 98, 40,132, 32, 2,186,148,224, 26,195,192,112,135, 54,141,195,160, 46,132, 11, 44, 9, 77,141,185,246,148, 70,
- 73,179,147, 98,108, 89, 35,198,193,227, 28,101,253, 80,245,178,189,155, 66,135, 46,181, 73, 33,243,182,254,232,217,221,106,225,
-108,163,104,215,114,202,119, 5,125, 99,171,183,176,155, 90,165,105,177, 26, 95,155, 75, 70,140, 75,183,143,122, 99,144,201, 32,
-117, 71,141,122,197,185, 57,107,164, 17, 97,146,247,215,135, 32,113,211, 57, 43, 11, 67,175,245,122,189,199,110,231, 9, 95,141,
-223, 27,171,132,123, 65,112, 61,174, 55, 59, 29,125, 99,177,213,173,123,223,125,181, 14,150,214,202,222,170,198, 0, 36,234,240,
-206, 52,191,162,200,209,149,203,232,138,219,222, 38,162, 93,175, 67,186,155,111, 32,145,189, 88,144,174,208,177,109,202, 8, 50,
-234, 30, 18, 13, 66, 67,134,183, 53,131, 49,232, 2,202, 46,234, 85, 65,176, 49,132,187,187,155, 46,254,149,203, 91,118,241, 33,
- 12, 34,170, 75,226,146,136,203, 34, 8, 94,235,182,112,180, 90, 97,189,133,117,109, 77, 34, 29, 58, 87,222,156, 12,204,187,149,
-136, 72,251, 37, 53,210, 43,204, 73, 11, 79,238,135,106, 75, 94,231, 93,164, 42,111,126,102,222, 8,246,181, 37, 11,181,220,245,
- 10, 84, 18, 25,126, 27, 19,247,241, 61,239, 59,123,116,186, 16, 19,225,229,139, 27,124,248,240, 81, 14, 34,221, 77,149, 34, 32,
-139,105,156, 68,112, 68,132,160,106, 82, 99,100,132,108,141,145, 93,228, 52,192,235,139,192, 32,100, 38,112,169,176, 90,137, 22,
-102,112, 97,248, 32,111, 88, 45, 81, 31,102,116, 42,149, 49, 50,150, 33, 34,233, 22,200,128, 81, 17,107,129, 13, 22,222,187,237,
- 50, 85,118,115,243, 96,150, 90,241,171, 95,252, 12,159, 30,159,240,205, 55,127,198, 26, 99, 7,191,108,226, 55,131, 90,212,187,
-249, 25,212,128,181,163,111, 89,194,178, 71,173,159,173, 59,180,154, 68,189, 26,147,181, 70,189, 22,238, 74,246, 38,252,232, 54,
- 15, 77, 13, 18,159,166,235, 12,246, 43,196, 98,219, 85,169, 10,125,179, 90,152,110, 29, 52, 70, 70,232,227, 56,226,213,203, 23,
-120,247,230,149,134, 99, 96,215,121, 80, 23, 84,217,141, 89,209,119,117, 76, 66,211, 99,162, 45,187,158, 55, 75, 73,243,145,247,
-125, 32,147,190,102, 87,146,254, 62, 65,202, 57,129,184,226, 48, 14,184, 61, 29, 65, 69,168, 86,177, 36,137,220,101,198, 82, 74,
- 15,158, 65,173,176, 78, 42,234, 63,253,225,119,112,254, 0, 50, 14, 40, 9,213,168, 71,128,129, 24,103,164,143,223, 42,150,209,
- 33, 12, 19, 82, 74,136,159, 62, 96, 61, 63, 32,151,130, 97, 58,192, 56,143,245,114, 65, 74, 43,214,229, 2, 99, 28,142, 83,192,
-156, 34,150,165,136,186, 59, 37, 20, 54, 90, 68,120,156, 12,227, 60, 47,112,198, 98, 94, 35,192, 5, 38,200, 88, 22,100,212,179,
-154,101, 74, 98, 12,160, 24, 92,231,188, 22, 28, 50,138, 46, 32,245,186,171,240, 70, 15,216,154,146,142,195, 11, 96, 12,150, 40,
-168,201,117, 93,113,185, 72,215, 75, 12, 60, 93, 22, 56,103,113, 51,141, 10,136, 73,240, 62, 96, 89, 37,106,181,137, 60,107, 45,
- 56, 4, 15,104,135,233,140,133,113, 22, 41, 85, 56, 39, 43, 13, 99, 45,156,210,207, 42, 51, 98, 41, 56,141, 83,215,153,172,107,
-196,141, 22, 28,177, 84, 44,243,130,219,211, 13, 74, 45, 34,234,155, 38,245, 62, 39, 28, 14, 7, 20,174,136, 41,169,151, 92, 14,
- 69,175, 93, 78, 8, 65, 20,251,214, 97, 93, 22,140, 97, 0, 81,194, 16, 6,249,124, 25,210,248,212, 11,130,115,130,225, 13, 1,
-151,203, 69,179,237, 1, 88,211, 93, 53,195, 48,224,227,135,143,176,214,104, 0,206,134,228,100,180, 0, 15, 57, 88,115, 46,152,
- 6,185,188,191,127,120,236,209,201,110, 87, 28,123,239,228,125, 83, 27, 85,202, 25, 99,240, 87,233,135,185, 84,140, 97, 75,153,
-148, 80,165, 2, 3,131,168,159,215,102,109, 75, 89,172,122,107,170,178, 78,204, 25,231,101,193, 96, 13,230,168,123, 94,107,224,
-157,116,133,237,226,106, 46, 23,153, 62, 25,144,145,134,136,245,156,113,206,195,218,164,241,195, 27,249,141,182,124, 86, 73,220,
-220,117,210, 29,232,210, 57,172,124,229,142, 2, 95,239,225,251,121,223,129,155,123,207,185, 62,223, 58,191,119,164, 23,153,254,
-221,198,218,126, 62,246, 11,123, 3,164,232,217,198,215,110, 26,124,206, 65,111, 93,186,217, 69,177,210,174, 43, 87,141,150, 49,
- 87,209,172,220,154, 85,227,118,171,136,205, 19,111,140,237, 9,120, 29, 46,100,165, 72,254,242,139, 55,176,222,131,139,144, 46,
- 99, 92, 55,208, 77, 45,224, 90,144, 98, 18, 23, 76, 8, 50,142,111,122, 44, 0,206, 7, 56,221,231,151,162, 16, 56,109,150, 91,
- 96,209,150, 66,167, 90, 41,107,251,235, 85,213, 57,225, 58,176,132,182, 42,160, 54,224, 73,207,220,174, 29, 42,211,198, 33, 85,
- 61,139,181,126,102,121,235, 82,251,141, 32, 38, 23,127,147,126, 16, 80,169, 99, 69,173, 19,163,125, 45,219, 94,196, 90,131,148,
- 86, 76,225,136,211,233,136,211,225, 0,160, 42, 27, 89,186, 95, 99,229,242,181,198,109, 56, 82, 0,197,144, 80,162, 44,161,194,
-194,146, 86,176, 45,146,177,145,211,180, 99, 48, 76,200, 96, 56, 45, 2, 26, 11, 60, 22,198, 4,224, 48, 14,253,146, 81, 33,171,
- 86,142, 27, 2,245,254,246,132,151,119,183,248,187,127,248, 29, 82, 92, 17, 83,148,203,188,138,120,206, 24, 97, 43,181,234,185,
- 2,178, 55,209,139,176, 91,198,120,123,136,154, 0,131,118, 26,185, 45,204,100,227,242, 27,179,181,246, 13, 58,113, 21, 45,216,
-149,184,166, 7, 40,116,200, 12,182,241, 81,251,144, 67, 99, 56,125, 8,184,189,189,193, 23,111,223,224,254,238,102,179,238, 53,
- 24, 80,135,219,136,188,210,240,198,109,174,100,117,116, 71,219,216,205,112, 15, 35,104, 59, 24,218,239,204,121, 35, 21,210,110,
-220,199, 90, 4, 82,109,252, 43, 61,180,152,181,120, 96,188,184, 61,225,155,111,255, 12,103, 8,161,123, 54, 89,139,194,173,240,
- 0, 8,203,122,193,143,127,246,159,169,111, 92, 10, 35,177, 81, 74,135,234,108, 59,132, 7,228,252, 4, 83, 42,172,115, 40,181,
-226, 39,255,201,191,194, 87,191,253, 43,252,139,191,252,175, 49, 28,111, 48, 29,142,248,167,191,255,247,152,231, 25, 83,112,168,
- 12,220,157,238, 64,168, 24,188, 19,191,115, 76,184, 36,139,232, 12, 98,150,145,217, 37,103,220,221,156, 4, 60,146, 98,183, 89,
-101,146, 84,192,118,121, 88,125,184, 75,149, 66,215, 7,217,191, 89, 67,160,224,133, 18, 87,178,138,194, 36,162,210,123, 18, 69,
-126,150,137,201,211,227, 19, 46,203, 2, 31,130,104, 13,200, 96, 26,156, 92,240, 68,120, 58,159, 69,172,102,164,235, 44,181,194,
- 91, 9,102,105,161, 46,222,139,162,188, 77, 54,172,209,188,251,146, 49,141, 35, 24, 78,194, 94,158,158,112,156, 38, 28,166, 17,
-207,207,103,217, 21,135, 32,112, 28, 72,230,249,253,120,131,203,188,192,184, 0,239, 29,214, 36,151,232,221,221, 9, 62, 4,217,
-123, 15,140,115, 22,190,188,247, 10, 28, 50, 6,235,186, 74, 65,207, 5,163, 31,177, 38,193,205, 94,214, 21, 94,149,199,232, 43,
- 43, 22, 49,220,178,168, 7,223,232,116,128,187,165, 52,197, 36, 72,210,146, 49, 47, 43, 6,253,239,222, 10,214,153,153, 81, 21,
-153, 91, 85, 20,245,199,247, 15,219, 25,105, 12,142, 99,208, 61,183, 85, 72,143,193,160,129, 45,206,154,238, 42,217,138,248, 13,
-148, 3, 0, 57, 55, 84,106,130,209, 9, 99, 81,107,222,154,244,117,174, 21,231,121,193,224, 84, 60,165, 34,176,172,183,166, 53,
- 22,134, 36,247,162, 57,112,138,238,117,201,144, 8,196,244,244,173,181, 32,132, 1,195, 48, 96,105,150,220, 70,254,220, 17, 66,
-141,174,224,168,111,207, 89, 70,214,168,187, 8,106,254, 1,107, 93, 10,137,218, 67,175, 54,220, 27, 58,216,140,118,225, 96,204,
-192, 48,134, 29,176,170,238, 68,114,187, 32,171, 29, 10,111, 15,145,185, 98, 99, 52, 97, 47,153, 77, 9,223,214,159,188, 83,255,
-211,214,205,139,237, 22,170,125,145,179,163, 48,119,196, 47,171, 37,176,171,242,245,172,108,231,160, 0,178, 8, 97, 8,184,189,
-187, 1, 23,249, 60,181, 11,221,134,112,229, 64, 98,174,112,222, 99, 28,167,174,113, 72,177,116, 22, 74,251,119, 85,225, 60, 85,
-139,185,170,107,209,253,132,160,117,230,164, 83,157, 82, 4, 82,227,176,235, 0,219, 37,220, 40,115,178, 63,169, 26,197, 90,183,
-192,120,218, 95,236,212, 71, 44, 12, 65,206, 86,186,234, 73, 55, 98, 81, 71, 8, 54,177, 93,197, 23,111, 95,227,119,191, 95, 81,
- 76, 6,179,233,157,164,247, 30,135,105, 4,231, 12,239, 45, 8, 34, 60, 1, 1,231,115,132,215, 80,151, 92, 55,172,166, 81,209,
-155, 39,185, 92,150,148,224,130,140,215,168,202,168,179,125,146, 90, 44, 95,227,204, 23, 0,133,165,155, 40,117,243,108, 7,239,
-126, 16, 42,242,195,120, 84, 41, 8,126,241,243,159,226,225,225, 17,127,250,230, 59,233,164,244,141, 20,184, 72,149,105, 1, 23,
- 88, 99, 53,212,132,174,146,140,218,152,214, 24,222,233, 20,176, 85,165,189,215,231,221,120, 74,199, 75,116, 29, 73,104,126,224,
- 9,151, 46,149,168,108, 42,216,102,223,176, 14,211, 56,226,205,235, 87,120,243,250, 37,188,119,155, 63,180,249,241,247,106,212,
-202, 87, 10,212,134,187,220,242, 36,246, 24,162, 70,199,193,245,184,110,187,219, 55,138,252, 14,181,219,129, 60,187, 67,160,237,
- 47,159, 47, 75, 87,143,135, 97, 0,101, 96, 77, 25,213, 18, 14,193,227,188,204, 98, 28,225,141,242,151, 75,133,165,138,211,225,
- 8, 67, 6, 79,143,239,213,237,129,142, 3, 21, 53,105,193,241,230, 53,230,243, 35,106,173,120,124,248,128, 15,223,127,131,251,
-151,111,112,186,125,137,255,252,223,252, 91, 76,135, 35, 94,189,124,135, 15,223,127,141, 90, 11,188,149,130,231, 48, 29,228,146,
-245, 14, 15,151, 25, 99,144,132, 54,107,229,251,115, 4,172,122,192,166, 24,197,142,233, 2,226,186, 34,132, 32, 93,154, 10, 54,
- 11,164,219, 54, 36,222,231, 48,140,138,212, 44,152,231,185,163, 92, 5, 0,100,193, 69,172, 75,243,188, 34,151,170,216, 88,181,
- 15,198, 36, 43, 42,239, 20,113, 44,249,225,196, 34, 60,179, 26,224, 49,132,160, 43,147,138, 97, 24,118,164, 33,234, 98, 78, 67,
- 4, 63, 4,132, 97, 64, 92, 69, 49,127, 58,221,232,216, 93, 68, 93, 89,133, 62,131,247, 34, 14,213,113,178,119, 30,203,178,226,
-230,120,194,154, 34, 82,145,221,117, 83,136,187, 90, 17,215, 85, 55, 53, 82,196, 59,235, 5,203,170,157, 47,156,116,217,205,243,
-159,153, 96, 81,177,198, 54,101,168,189, 69,124,120,122, 22, 96,139,186, 11, 82,138, 50,245, 40, 9,217, 0,243,178,246,209,230,
-233, 48,202,247,168, 65, 59,214,200, 40, 89,254,156,224,131, 31,180, 80,145,100, 47,131,131,119,170,176, 22,193,155,179,118,179,
-202,105,230,124,235, 50,107,143,100,150,238,186, 69, 54,103, 22,212,112, 42, 21, 30,132,152, 19, 86, 77, 64,204, 89,184,232,193,
- 10,176,167,176,197, 33, 56, 44, 73,148,238,185,182, 80, 18, 17, 39, 86, 46, 87,104,233, 82, 43, 28, 9,248,240, 60, 58, 0, 0,
- 32, 0, 73, 68, 65, 84,141,177, 74,234,134,168,174,139, 40,240, 99,140,160,156, 59,173,141, 13,131,170,209, 51,191, 17, 30,182,
-139,220,144,238,238,169, 21, 42,155,125, 13, 84,193,117,119,206, 55, 6, 70, 59, 59,169, 49,215, 55,220,184, 88, 9,109,247,179,
- 95,181,161,170, 79,218,235,179,232, 51,191,249,231, 8,216,205,150, 78,253,123,236,151,181,218,142, 97,168, 39,131,238, 81,190,
-237, 76,108, 69, 85,163,248,113, 45, 42, 58,108, 78,160,173,160, 48,164,194,108, 99,241,197,187, 55,221,221,148, 82,234, 66,233,
- 86,232, 53, 55,138, 49, 22, 97, 28, 16, 6,229, 42,232,116,183,237,219,183,239,169, 77,198,235,150,143,208,154, 51,157,204,153,
-230,142, 0, 96,116,154,197, 34, 33,219,200, 39,116, 21,199,169, 6, 55,150, 11,157,120, 27,157,108, 60,131,205,178, 85,193,122,
-161,215,206, 17,230,221, 9,126,189, 77,105, 99, 89,194, 52, 6, 56,239,144,146, 3,113, 2,152,112,154, 6, 21, 5, 89,220, 28,
- 15, 24,148, 16, 5, 72, 28, 31,148, 75,108, 32,149, 38, 90,213, 2, 32,236,240,135, 6, 82,249,146,126, 32,123,101,172,247, 96,
-209,160, 12,195, 45,208, 94,240,162,237,235, 89,163,149,211,142,173,139, 43, 62, 48,174,196,107,204,162,234,127,249,226, 22,255,
-225,183,191, 67,140,179,134,138, 84,176,114,224, 13,153,171,252, 91,171,249,238,253,129, 39,163, 30,129,170, 76,238,218, 31, 84,
-222,249, 51,183,152,160,221, 5, 79,166,119,239,212,243,133,197, 30,101,141, 5,145, 64, 91,156,181,184,185, 57,225,203,183,111,
-112,123,123,218, 32, 9, 74,151,147, 15,151,189, 74,119, 35,252, 16, 80,164,204,138,171,239,129,119, 97, 44,155,196,134,213,157,
-105,208,184, 84, 68,220,120, 61,219,103,131,120,223, 44, 92, 23,145, 90, 60, 90, 54, 88,231, 21,156, 35, 78,135, 9,195, 16,192,
-151,138,227, 52,161, 22,177, 42, 50,203, 4,200, 48,227,146,228,181,117,202, 4,176,222, 99, 26,143,248,227,239,127,141, 33, 28,
-144,150, 71, 37,235,137,173,113, 89,207, 8,227,141, 28, 30,198,192, 84,224,219,223,255, 22, 6,192,221,139, 55,248,242,203, 31,
- 35,165,136,223,255,227,223,226,253,251,239, 96,211, 5,193, 89, 28, 15,130, 27,205, 57, 33,229, 8,235, 6, 57,244,156, 7, 12,
- 97, 50, 22,231,203, 5,135,224,192, 24, 52, 96,196,162,228, 5,227, 56, 97,208,177,177, 76,114, 8, 83,240, 0,137,120, 13,198,
- 72,176,136,119,184,172, 17,105, 93,117,191, 59,180, 17,141,116,226, 57,195, 24,139,201,123, 28,198, 1,231,203,140,243,154, 48,
-232,184, 55,248, 0,242, 50, 42, 79,185,192,216,166,119, 0,124, 8, 8, 33, 72,135, 93,171, 96, 86, 85,148, 87,187, 72, 90,192,
- 74, 57,138,205,202,168, 2,247,227,167, 79, 58, 85,144, 17,253,167,199, 39, 20,141,108, 45,149, 81, 17,213, 66, 40,221, 94, 46,
- 18,169,233,189, 71, 76, 81,152,239,198,226,211,167, 71,184,224,144, 98, 20,180,243, 56, 34,197,132,105, 58,224,227,195, 35, 94,
-222,221,226,114,153, 59, 27, 33,132, 1, 69,109,177,119, 55, 55, 96,102,172,235, 34,144, 29, 39,211, 3,231, 44, 82, 20,107, 91,
-138, 81,198,227,128, 88,133,106, 21,199,140,181, 72, 57,117,250, 27, 85,185,168, 83,170,170,115, 33,128, 11, 62,156,151,174, 25,
-177,234,157,111,104, 90,239,172,162, 65,181, 8,239,145,171, 82, 80,122,103,123,132,103, 11, 48,169,202, 18, 16,177, 91,197, 69,
- 51,234, 99, 18,252,237,232, 8, 79, 41,163, 24,131,227, 40,118, 61,103, 13, 38,242, 72,185, 34,101,238, 5,132,140,146, 91,200,
-181, 34,144,149, 74,103,141,197,134, 97,226,190,150,240, 10,251,225,172,205, 27, 27,185,216,217,232, 58,213,104, 3, 97,118, 16,
-172,246,124,215,173,253, 86, 46, 6, 76,221,173,202,244,247,182,121, 35,235, 5, 77, 27, 84,134, 1,140,195,120,149, 10, 74,109,
- 93,198,251,248,230,218, 51, 31,176, 67,195,238,228,239,221,197,209,154, 53,130,144, 35,187, 46, 71, 51, 46,154,176,183,163,190,
-141,233,103, 77,209, 75, 61, 87, 6,115,146,207,174, 10,156, 65, 82,236,116, 48, 77,215, 41, 9, 16,232,205,155,215,189, 1,170,
-181,110,147, 1, 5,213,180, 2, 88, 28, 46, 67,191, 79,132, 89, 82,187,229,215,232,175,181, 54,146, 28, 80,138,235, 59,127,163,
-232, 88,168,229,187, 17,243,164,161,149, 36, 57,247, 57, 92, 0, 87,232,188,218,105, 59, 93, 0,161,130,138,214,141,233,111,211,
- 17,201,214,118,213, 93,129,118, 77, 40,220,189,233,122,104,159,142, 71,164, 24, 69,109,106,196,203,249,147, 47,190, 64,169, 34,
-156,115,198,192,134,128, 20, 19,230,249, 9,191,249,199,223,227,103,175,239,100,180, 77, 74,142,113,170,128, 84,236,168, 33,131,
- 69, 71, 85, 6, 6, 57, 74,162,213,156, 75, 95, 19,212, 90,193, 70,118,169,185,106,226,210,110,252,109, 20,235, 7,230, 29, 37,
- 15, 93, 5, 79, 59,166,113, 87,158,107,254,238, 47,127,254, 23, 56,159,103,252,225, 79,223, 32, 39,221, 55,147,120,108,247, 59,
-157, 82, 90,240,139,142,206,154,208, 12,205,102,129,205,126,193, 59,144, 3,209, 21,219,125,219,251,108,164,182, 6,192, 8, 67,
-192,155, 87,175,240,246,245, 75,241, 25,171, 95,189, 21,113,109, 71,212,222,208, 43,235, 88,251,249,169,246,228,184,253,255,181,
- 24, 86,250, 44, 88,128, 20,231, 72,123,248,144, 81, 97,160,233,185, 65,250, 0,214,173, 96,224, 45,239,239,250, 19, 89,251,235,
-159,115,146,132,189, 44,204,238, 97, 24,240,171, 95,252, 28,255,223,223,252,117, 63,104, 69, 96, 36,100, 54,106,212, 12,107, 81,
- 75, 70,202, 17, 47, 95,255, 4,235,186, 98,189, 60,192, 90,205, 67,102,233,144, 37, 31, 91,222,151,233, 48, 98, 12, 30,143,223,
-253, 1, 15,223,253, 17,239,255,248, 27, 25,225,146, 65,205, 17,150, 10,136, 28, 82, 17,240,140, 33,131, 87, 47,238,193, 16,192,
-203,164,151,245, 57,202, 30,173,137, 16,141,181, 40, 41,225,230,238, 14, 57,174,120,122,126,214, 88, 91, 25, 57, 39, 13,160, 89,
-150, 21,228,100,199,155,214,136,184,174, 88,214,132, 41, 12, 8,193, 99,154, 14,168, 53,227,233, 60, 35,229,130,233, 48, 97, 84,
-203, 96, 24,138, 92, 46, 58,178, 31, 91,231,236,197, 19,239, 91, 39, 9, 32,198,136,101, 93, 59, 21,174,237,164,155,184,139,212,
- 67,124,110, 99, 69,211,226, 79, 13, 12, 75, 52,235,178,174,189, 59,205, 74,126, 75,181, 40, 62, 83,138,197,183,111,222,224,233,
-124,193,209,137,175, 94, 40,108, 3, 46,235,138,241, 48,129,107, 70, 56, 76, 88,215, 21,181, 50,198,113, 64,140, 43,110, 79, 71,
- 44, 49, 34, 4,175, 12,236, 1,151,121, 6,115, 69, 8, 3,226,186, 72,132, 46, 3,199,211, 9,227, 52, 97,157,103, 44,243,130,
-227,241,128,203,101,198,113,154,144, 98,236,232, 91,102,198, 56, 9,199, 59, 63, 63, 1,234,129, 39, 35,147, 55, 48, 35,229,138,
-195, 24,240, 15,223,124,236,227,120,144,193, 20,188, 4,123, 40, 49,206, 89, 11, 75, 34,130,107,158,125, 25,241, 23,132, 96,183,
- 3, 28,140,152,101,188, 94,245,239,136,185, 98, 10, 78,179, 49,100,253,178,174, 17, 9,132,211, 20, 64,170,160, 63,140,178,106,
- 44,185,224,137, 51,156, 37, 20, 54,160, 10,185,208,141,233,252,144, 86,140, 75,250, 95, 75,133,108,188, 3,233, 68,155,189, 80,
- 88,236,215,121, 18,178,227,150, 41,109,109, 15,243,231, 29,187, 6, 97,180,147,130,218, 78,159, 90,128,203, 46, 92,197,236,205,
-236,242,161,155,134,241, 26, 25,173,147,184, 62,161,211,113,188,129,233, 83,181, 13,106,130, 13,252, 2,186,190,224, 21, 34, 35,
- 1, 92,212,215, 70, 93, 43,100,183,233, 92,251, 89, 37,204,138,145,107, 69, 42,117,135,202,230,205, 75, 15,205,106,215, 63,107,
- 53, 19,225,221, 59,177,200,182,117,152, 56, 16,172, 22,190, 36,147,153,181,162,164, 4,123, 60,138, 40, 87, 87,153,206, 7,137,
- 28,143,146, 7, 97, 85,243,225,157, 5, 88,169,142,222,131,194,208,105,120,130,242,174, 59, 67, 0,109,251,118, 99,224,234,149,
- 11,113,203,244,218,172, 70,154,217,202,205,110,213, 18,197,118,157,251,103,226,198,190, 23,249,220,252,184,255,231,157, 83,225,
-221,155, 23,120,126, 62, 43, 6, 47, 97, 73, 9,223,125,120,143, 55,175, 94,193, 88,135,195, 97, 66,101,198,255,249, 87,127,133,
- 53,101,156, 70,121, 40,155,234,176,253,253,158, 8,222, 17, 2, 1,133, 90, 48, 13,129,173, 65,140, 73, 80,154,188,137,232, 26,
- 21, 41,177,228,143,175,169, 96, 10, 30,207, 49, 43,164,196,245, 29,122,219,163,139,154,223,244,157, 54,179,236,229,127, 0, 85,
- 6,112, 60, 78,248,203, 95,253, 28,127,250,230,123,124,248,248, 73, 82,170,218, 3,175,111, 80,243, 76,178,233,232,228,174,156,
-151,191,201,238,216, 48,215,226, 20,241, 79,242, 21,181,205, 24, 33,109,189,121,253, 10, 47,238, 78, 59,112,133,209, 84,180,150,
-202,167, 90,149, 90,187,157, 69, 38, 45,205, 26, 86,251,243,211, 38, 50,124, 45,245,235,193, 59,162, 95,216,138, 1,214,177,157,
-225, 62,244,147, 95,107, 69, 37,253,247,234, 53,237, 14, 0,208, 21,100, 6,251,201, 14,183, 81, 58, 97,137, 17, 84, 11,198,224,
-113,152, 6, 4,231,145,115, 66,133, 88,123, 14, 65,180, 11, 20,156,198,152, 90,148,101,149, 46,223, 5, 44,203, 69, 62, 99,243,
- 25, 57,173,125,231,111,117,133, 81,184,224,227,251, 63, 74,178, 82, 45, 48,213,118, 44,107,208,216,205, 18,103,113, 87,120, 43,
-222,119,231,100,167, 14,194, 52, 57, 44,171,100,169, 79,211,160,246, 49, 22, 82, 27, 51, 78,199, 35,106,201, 40,181, 0, 97, 64,
- 92, 22, 9,142, 25, 3, 74, 46, 56,142, 3,214, 53, 2, 70,212,206, 2,150,145, 0, 19,153, 28,200, 14,246,105,153, 97,149,102,
-150,114, 18,193,164, 49,240,206, 35,165, 34,162, 64,213, 2, 12, 74, 41,139, 41,105,103, 39, 1, 71, 86, 45, 78,162, 99,145,189,
-188,136,207, 36, 43,123,141, 17,222,121, 64,247,122,203,186, 10,127,125, 26, 97,176, 69, 90, 78,195,168,211, 29,131,117,141,154,
-215, 46, 95,115, 36, 96,112,190,219, 77,215,101, 1,106,193, 18, 35,140,178,185,151,101,134,119, 30,165,100, 28,198, 1,203, 50,
-203, 65, 85, 50,170,221, 10,215,227, 52,245,100,180, 54,226,228,146, 37,205, 14,194, 87,152,198, 17, 37,103, 60, 63, 61, 98, 89,
- 68,136,119, 62,207, 24,134,128,152,229,125,124,255,241, 1,119,183,183,146,115, 29,196, 2, 71,214,130, 75,145, 68, 52, 22,138,
- 31,140,197,224, 25, 95,189,127, 68,229,138, 84, 10,200, 24, 76,206,246, 20, 51, 67,146, 45,209,116, 38,214, 10,194,154, 73,118,
-165, 70,207, 21, 3, 97, 97,228,156, 81,170,188,190, 2,223,145,231, 51, 22,189,204, 83,134, 1,112, 28, 61,162,138,243,188,145,
-231,203, 54,223,179,126, 94,157, 49,136, 36,141, 16,179,145, 56,215,106, 58, 94,151,171, 38,124, 85,134,109, 54, 55,229,185, 39,
-205,154, 63, 30, 14, 29,142,211,200,141, 27,210,149,180, 1, 39,113, 12,212,237, 98, 39,170,170,212, 85,109, 85, 59,103,118,231,
- 17,239,115,158,249, 26,101, 99, 44,117,170,222,214,253,154, 43, 72, 89, 3,172, 52,101,125, 55,198,183,254, 95,199,225,253,242,
- 52, 91, 62,253,246,207, 22,196, 34,128, 54, 86,165,165,116, 61,198,110,226,239, 92, 25,107, 46,221, 89,208, 55, 7,166,121,195,
-140,106,164,204,214,165,123,143,151, 47, 95, 32,165, 40,180,183, 13,181,186,155, 30, 80, 23,222,118,236, 79, 43, 58, 44,245,142,
- 60, 46, 17, 23,158,113, 60, 28,224,189,219,237,249,155,205,176,104, 17, 86, 58, 22, 22, 32,112, 17,177,151, 76, 13, 60,220, 6,
- 31,226,207,130, 57,174,119,166,188,247, 72,215,214, 93, 81, 71,112,214, 30,224,114, 13, 43,192,110,156,218,191,228,190,125,215,
-175,253,163, 47,223,226,171, 63,125,171, 29, 98,193,247, 15,207,248,238,227, 99, 95, 7, 52, 70, 48, 17, 33, 88,221,231, 24,183,
-237, 23,172,129,183,132,209, 89, 24, 0,107, 46,152, 83, 69,176, 4,235, 3, 42,150, 93,244,167,154,250, 33,214, 20,163,163, 23,
-168, 8,175, 81,216,164,147,217,249, 52,245, 3,181,161, 97, 63,239, 41,175, 51,229, 27,252,226,139,183,175,240,227, 47, 94,227,
-171,175,191,199,199,135, 7,229, 59,151,107,140, 98, 23,187,109, 59,100, 96,143, 48,220,234, 34,179,179, 97, 12,195,128,187,155,
- 27,188,122,117,175, 22,160,205,135, 82,153, 97,138,236, 52,219, 39,183,241,229, 59,228,165, 5,199, 84,238, 28,138,158, 96,103,
-169,239,200,171,161, 31,214,103,237,137, 16,118,100, 87,195,115, 37, 80,239,202,101,170, 97,140, 92,228,134,106,183,241,113, 15,
- 46,160,238,149,109,142,137,207,121,244,173,152,159, 47, 51, 12, 23, 48, 44,158,158,207,120,251,250,149,208,253,152,241,197,155,
- 55,120,252, 40, 8,224, 20,147,116, 42, 81,173, 59,165,160,164,136,195,237, 29,222,127,247, 39,156,207,143,152,207, 15, 42,150,
-161,110,187, 99,168, 13, 18,208,149, 5,163,112,193,104,157, 98, 96, 13,144, 45, 6, 47, 69,196,141,122,160,157, 31,100,244, 30,
- 19, 14,199, 35, 82, 21, 70,179, 37, 40, 45,206,226,116, 28,225,188, 69, 6,227,120, 56,162, 84,198,188,138, 32,109, 89, 23,216,
-193, 98,142,171,138, 16,245,144,173, 12,235,165,184,124,124,126,194,211,249,172,135,130,199,228, 3,124, 24,177,150, 2,152,130,
-195, 56,117,108,171, 49, 65,213,243, 14,222,121, 48,147, 10, 56, 55,188,113, 74, 89,161, 55,178, 75,191,187,187,195,170,221,122,
-103, 92, 55,171, 81, 22, 12,172, 68,144, 10,224, 7,202, 50,104, 65, 23,151,101, 70, 97, 73,253,131, 10,215,150,121, 75, 24,243,
-206,225,241, 50,227,241,233, 9,183,135, 3, 98,201,120,158,103, 76,195, 8, 31, 60,114, 41, 56,159,207,138,189, 77, 24,130, 67,
-201, 50, 49,241, 97,192,162, 4,185, 24, 5,220, 81, 75,222,146, 30,201,194, 48, 96,181, 56, 72, 49,195,186,198,226,150,238, 7,
- 44,137,104,211, 48,106,162,153,235, 66,168,113, 24,176, 46, 11,156,147, 84, 52, 11,249,245,113, 77, 56,175, 73,113,171, 4,111,
- 36, 27, 94, 82,180,104, 75, 53, 84,111,118, 74,185,167, 84,198,164,187,121,174, 40, 85,198,245,243, 42, 5,221,224, 44, 18, 75,
-119, 59,141, 65, 63,231, 21,199,193,117, 75,217,105, 28, 52, 19, 65,220, 47, 45,181, 82,242,231,229,115, 75,105, 15,109,145, 17,
-177,133,237,151,225,214,173,183,157,190, 17,225,174, 78,163,198, 97, 20,166,121, 41, 72,188,131,198,240,110,205,103, 0,211,196,
-174,181,117,205,250, 61, 25,234, 90, 24, 2,116,242,185,133, 83, 81, 39, 96,162,239,195, 9,132,163, 58, 36,168,167, 92,110, 19,
- 73,110,233, 95, 45,103, 99, 95, 28,236, 96, 88,109, 5,100,148, 0,216, 59,119, 29,195,183,132,114, 99,173,146,254,244, 61,163,
-237,125, 3, 72,104,162, 69, 4,210,185,148,206, 10, 96,253,123,184, 51, 65,208,133,220, 86,201,153,175, 95,189, 0, 1, 88,230,
-185,151, 44,198,154, 93,231, 42,191, 10, 46,214, 33,198, 4,239, 83,231,196, 27, 3, 9,139, 57, 30, 5, 52,148,178,104, 71,244,
-192,171,106,141,235, 34, 97, 77, 12,132, 58,155,186, 59, 74,217, 35, 57, 39,184,237,114,165, 62, 43,223,160, 3,255,204,197,220,
-137, 65,125,104, 42,191,214,107,255,225,126,212,190, 1,253,119,114,238,174,104,150,223, 63, 14, 3, 94,189,186,199,247,239, 63,
-138, 88, 6,221,213,212,211,129,106,169, 56, 77, 3,110,166, 97,135, 0,148,174,214, 25, 35,169,107, 0,140, 5,226,170, 59, 81,
-219, 64,255,232, 99,226, 13, 26,160, 99,218, 10,100,221,231, 86,141, 38, 53,134, 52, 84, 66,190, 9,106, 43, 9,194, 53, 71,125,
- 47,161, 83,107,200,213, 26, 67,187,221, 90,129, 47,223,189,194,143,191,124,141,167,243,140,111,191,251,128,203,101,214,135,171,
-108, 66,177,157,182,164,129, 99, 26,204, 38,132,128,155,155, 35, 94,222,221, 98,154,134, 14,168,105,159,245, 82, 85,197,218,188,
-164, 77, 32,162,251,242,174,226, 7, 64,205,174, 66,144,212,183,157,168,172,195,113,216,110, 21, 33,155,107,203,138,218, 63,154,
- 43, 96,251, 52,160, 91,200,184, 9,242, 64,221, 2,196,220,178,231,154,176, 6,215,235, 28,222,168, 81,124, 5,168,108,139,175,
-138, 49, 56, 16,106,223, 41,223,223,223,225,195,135,143,120,121,127,135,175,191,249, 6, 83, 16,175,113, 76, 25,134,172,118,221,
- 98,181,123,122,252, 14,228, 2, 46,151, 7,177,106,169, 70,162,212, 10,103,148,216, 53,157,176,204,207,138,133,100, 12, 65,186,
- 38, 7,224,252,244,136,105, 12, 40, 5,184,191, 57,118,178, 90, 79,254, 11, 35,142,199, 83, 79,116,203,133,213,170,168, 42,234,
- 82,213,243, 45,130,183, 97, 24, 48, 78,147,162,129, 37, 28, 98,212,206,183,214,138, 37, 9, 23,189,148,138, 24, 19, 14,195,128,
- 92, 43,134, 97,194,232, 29,214,117,198,105, 58, 32,151,132, 75, 20, 4,234,232, 61,198, 73,162, 30, 47,243,140,117, 89,177,198,
-164,123,117, 15,239,228, 98,108, 9,104,109, 92,252,233,211,167, 78,208, 18, 66,150, 48,209,163, 50,170,201,200,244,138,192, 72,
- 10,214,201, 21,184,187, 59,225,249,233,185,143, 2,187, 56,168, 50,252, 48, 8, 16, 72, 73,132,222, 57,220, 28, 38,197,130, 58,
- 28,167, 17, 12,234,128, 30, 89, 31, 49, 14,211,120,181, 70,146,213,156,216, 67, 11, 23, 17,164, 89, 11, 99,183,160,165,224,125,
-135,122, 16,184,227, 86,189,247,152,151, 5,135,113, 68,226,138, 28, 51,178,119,194,210,175, 21,195, 16,250,123,209,220, 59, 45,
- 87,252,235,143, 79, 87, 13,142,183,102,151, 91,160, 98, 52, 22,251,160,181,114,240, 11,111, 67, 62, 83, 75,202,114,129,231,130,
-156, 27,106,148,144, 43, 99, 10,161,219, 47, 14,222,194, 90, 82, 26,220, 6,139, 17,223,121,149, 46, 93, 3,171,140, 22, 10,114,
-153, 17,114, 69,111,120,100,223,207,144, 76,157,182, 11,215, 85, 84,103,171,203,215,143, 41, 41,107,226, 70,222,227, 90, 81,202,
-142, 98, 73,245,179,134, 76,138,117,170,155, 31,189, 55,132,180,105,143,246, 42,109,190, 26,210,202,249,123,156, 14, 58, 93,160,
-190,211, 54,187,232,218,126,190, 42,254,183,197,216,238, 18,191,119,154, 33,211,167,144, 61,201,140,212, 14,186, 91, 15,218, 93,
- 84,118, 23,211,113, 75,142,147, 41,164, 68,122,243,213,153,222, 19, 96,117, 53, 64,154,184,102, 72,186,226,195, 97, 68,156, 47,
-112,222,247,213, 39, 80, 85,223, 36,241,189, 38,139,139, 37,168,189, 49,174, 43,134,105,146, 51, 24, 6,214,202,207, 17,194, 0,
-231, 36,158, 56,165,140, 20, 87,204,231,179, 70,242,138, 78, 3, 85, 10, 50,106, 81, 93,138, 71,111,244,194,146, 18, 28,245,230,
-149,175, 81,165,123,152, 9,109, 54,181,238, 63,102,238,162, 9,234,202,231, 29,104,128,104, 7, 73,249,231,152,194,162,162, 52,
-187,161,238,253,237, 13,130,247,248,250,155,239,144, 98, 68,169,121, 19,212, 5,143, 87,247,119,248,230,253, 7, 56,231, 97,172,
-140,163,200, 42, 83,156, 72, 94, 36,102, 36, 24,164, 10, 56,253,208, 85,101,227, 82,169, 8,193, 73,214,118,145, 32,133, 57,173,
-155, 93,139,129,220, 50,123,141,193, 97, 26,122, 1,211,107, 17,189,160,100, 7, 78, 29, 65,136, 93,216,157,217,117,203,104,150,
- 22,218,118,208,199,105,194,207,254,226, 75,205, 15,151,125,123,140, 18,242, 33,112,127, 57, 20,131,247,125,100, 84, 53,133,139,
-119,145,166, 87, 15, 76,109, 85,174,126,168,106, 27,233, 87, 9, 66,168, 12,152, 93,176,130,190,238,134,119,232, 67,208,149, 86,
-130,119, 49,137,246, 51,174, 60,120, 47,113,163,205,218,216,165, 45,162,206,108,202,183,246,255,139, 40,109,151,240,215,253,248,
-166, 35,112,233, 74, 92,201, 61, 99, 64, 42,232,130,121, 93,240,246,229,189,140, 24, 75,193,229, 89,212,227,185, 84,220,221,221,
-161,172, 23,128, 44,144, 5,184,161, 2, 99, 16, 3,214, 56,204,231,103,121, 48,177,209,235,218,222,153,172, 71, 76,162,172,174,
- 44,214,196, 24, 87, 77, 55,115, 96, 2, 98,172,152,166, 1, 41,174, 24,199, 65,232,102, 99,128,245, 66,134,147,142,114, 18, 77,
- 70, 73, 50, 74,131,193, 28, 87, 9, 80, 41,141, 65,239, 81, 75,198,229,124, 22,177,104, 6,106, 37, 92,150, 8,103,101,244,232,
-117,159, 62,199, 21, 62,120,140,206, 33,230, 44,179, 49, 45, 40, 74, 45,240,126,128,179,210, 93,134, 48,224,112, 56, 97, 94,102,
-196,148,122, 39,228,140,196,165,206,203,138, 97, 8, 24,199, 17,206, 7,201,252,214,176,150, 54,138,119, 78, 84,220,207,151, 25,
- 79,231, 51,130,181,168,153, 49,142, 83,247,142, 51,128,227, 52,118,182,127,235, 46, 70,133, 16,205,107,196, 52, 14, 24,134, 9,
-222, 7,156, 21,237,204,204, 61,226,214, 90, 43,244, 59,107,113, 58, 76,200, 41,194,168, 48,182, 17,240,154,162, 66,200, 89,140,
- 96, 68,252,118, 60, 76, 72,170, 34, 39, 85,239, 75,224, 69,209,112,141, 0,235,196, 10, 55,120,135, 24, 35,230,203, 69,198,160,
- 68,221, 91, 95,114,218, 88, 11, 57,247, 36,172,191,255,211,251, 45,228,138, 25,163,119,253, 98, 16,135,130,156,129,115, 76, 48,
- 68, 88, 98,210,113, 43,176,172,146, 36,103,152,165, 48,179, 86,105, 96, 80,250,156,133,117, 30,193, 25, 56,213,250,218, 29, 86,
-218,144, 60,239,100, 37,100, 42,213, 34,163,121,179, 21,186, 45,124,137,128,254,189, 52,219,150,148, 53, 5,165,154, 62,125,172,
- 42,196,109, 93, 95, 74, 9, 57, 39, 12, 97,196,233,120,210,252, 10,238, 76,246,158, 50,193,123,125, 44,201, 57, 82,141, 86, 18,
-122, 57,239, 66,167,184,235,115,248,218,145, 99,140, 16,251,218,207, 96, 54,154, 91, 19,251, 53,190, 9, 25,211, 5,110,220, 87,
-181,123, 7, 16,250, 69,110, 84, 44,221, 0, 69, 70, 11, 37,222, 79, 53,205,214,221,183,149, 91,179, 55, 22, 22,240, 89,174, 91,
-178,229,174,199,237,182, 56,217,199, 91,201, 24, 49, 6,239,222,189,193,233,120, 16,236,179,181,155,211,161, 50,188,215,224, 35,
-189,196,185, 20,140,227,168,206,135,210, 95,151,148,146, 20,112,206,193, 24,135,202, 5,165,164, 93, 99,173,231,180, 58,163,196,
-161, 35,231,181,221,217,149, 91, 36, 44,215, 10,215, 59,195,186, 69, 27,118,206, 12,233,238,132,161, 65, 25, 91, 36, 31,239, 46,
-128,158,224,182,201,152, 81,183, 25,240, 62, 98,123, 87,175,109, 22, 15,161,227,200, 7,254,120, 28,241,139,159,255, 20, 31, 62,
- 61,226,233,241, 9,172,251,158, 48,142,120,253,238, 45, 94,189,121,141,167,239,191, 7,106,234, 33, 35,206, 25, 12,131,195,200,
- 21,254, 16,112,190, 36, 20,181,220,229, 10,112, 78,253,131, 18, 0, 20, 3, 20, 97,213,118,190,121, 19,189,241,238, 3, 40,190,
-120, 1,239,108,181, 10,245,238, 14, 26,124, 83,153,176,245,177,186,152, 32,249,112, 54, 29, 66,235,228,177, 27, 67, 53, 2,159,
- 53, 22,227, 40, 62, 90,107,105, 39, 86,145,215,175,104,113,210, 94,195,254,154, 19, 54, 5, 57, 41, 93, 78, 49,136, 85, 59,112,
-249,103, 89, 49,128, 25, 85,125,251,104,184, 65,222, 89, 76,116,236, 14,141,103,229,182, 56,229,207, 50,221,219, 85,168,149,233,
- 62, 74,176,125,240, 72,195, 89, 36,158,117,247,171,114,200,169, 99, 95, 91,135,177, 37,253,225,179,188,227,198, 68, 62, 63,207,
-120, 62,207,184,155, 12,150, 53,194,145, 76, 88,198, 16, 16, 83,198, 97,154,240, 23, 63,250, 18,127,251,235, 95,235,158,213, 32,
-198,130,202, 25,164,204,109, 34, 96,153, 63, 33,230, 12,103,124,215, 87,248,198,197, 46,187, 36, 65,211,130,104,244, 48,135,208,
-157, 98,173,160,228, 96, 81,144,216,192, 27,131,231, 25,112,113,133,181, 22, 67, 24, 16,147,199,139,251,123,172, 49,226,252,248,
- 36,226, 23,235,177,172,179,136, 35,201,162,146,140,252,124,240, 88,215,212,139, 41,211,152,229, 10,124, 25, 66,192, 16, 68, 77,
-127, 89, 86,140,211,168,105, 99, 69,241,178,162,230,142,235,138,113,156, 96,173,195,229, 34, 99,250,203,101, 65, 5,112, 28, 71,
-216, 86, 40, 25,129,187,116,116, 51, 3,179,142,221, 13, 25,140,138,139, 37,253,239, 47,111,111, 54,142, 55, 1,222, 5, 25,235,
-170,144,238,249,249, 25,151,121, 22, 86,189,142,188, 5, 84,198, 40, 41, 99,213,136, 91,102,150,231,185, 86,172, 73,192, 44,151,
-121,233,145,202,107, 76, 29,163, 57, 13, 65, 51,213,125,223, 9,151,156, 97, 13,225, 60,175, 50, 46,143, 45, 10,211,194, 59,175,
- 86, 52,194,211,243,130,160,162,196,134,218, 45,165, 96,141, 9,198,137, 88, 16, 85,240,180,182, 79, 79,228,215, 22,152,241, 31,
-191,126,175,231,158, 92,136,163,138,102,139,194, 42, 4, 51, 33, 32, 25,193, 68, 27,216,198,111,216, 89,146,108, 67,119, 90, 65,
-141, 6,167,201, 93,214, 97, 12,182, 35,162,247, 25, 10, 73,197,188,133, 25, 69, 57,247,251,180,199, 90,107,159, 98, 25,218, 40,
-117,181, 95,162,162,213, 17,251,153, 76,204, 26,114,150,118,122, 39,230,182,230, 24, 49,141, 34,116,228, 42,240,159,109, 13,102,
-118,241,218,188, 81,231, 20,166,213,172,204, 48, 0,177, 81,161, 45,111, 13,157,158,137,206,154,158,156,215,211, 39,119,207, 57,
-119,112, 86,221, 86,153,205,150,219,206,133,189,109,173,237,182,173, 21, 59, 23,217,237,226, 53, 70,157, 54,154, 40,105, 54,172,
-117, 75,172, 43,218,130, 23, 37, 41,198,148,251, 90,176,127,208,177, 39,189, 80, 87,186, 27,178, 56,157, 78,120,253,230,149,186,
- 42,210,102,165, 52,128, 55, 22, 94,221, 5,166, 72,132,178, 42,158,133, 12, 88,179,196,142,147, 76,168,172,243, 24, 6,200, 94,
-126,141,114, 78, 54, 23, 64, 11,168,169, 13,201, 94,122,254, 59,183,188,140, 88,183,184,109, 34,209,140, 55,229,122, 63, 70,219,
-136, 86, 21,207,157, 32,215,197, 97,132,150,165,131,125,150,247, 94, 68, 85, 63, 19,202, 93,201,241,182,210,239, 10, 52, 64,155,
-143,253,229,253, 45, 94,222,223,110, 57,226,250, 65, 49,214, 72,102,115,204,189,138, 14, 0, 12, 49,130,221,166, 9,193, 89, 73,
-228,169, 64, 42, 85,121,196,216, 0, 42, 6,253, 16, 43,204, 91,250, 79,223,155,216,142, 20,108, 66, 45, 50,159, 37,160,181, 8,
-210,202, 74,165,171, 93,245,185, 29,208,116, 61,194, 34, 22,209,135,214, 59,123,232,207,158,244,182,179,197,247,145, 58,246, 73,
-119,188,179,144,181, 71,167, 9,224,182, 77,121, 71,248, 86, 99,228,129,222,137,210,136,235,213,123,214, 64, 48,196,215,244,182,
-110,153,220,137, 96,246, 69, 64,207,102, 87, 91, 96, 15, 32, 81, 59, 36, 54,249,229,246,117,118,130,193,253,215,217,128, 21,215,
- 97, 66, 0,225,241,249,140,131,151,215, 60,248,128,154, 35,114, 74,120, 88, 87,220,222,220,162, 48,227,238,246, 22,227,225,132,
-243,211, 39,100,102, 81,224,179, 5, 20, 84,196,181,246,228,179,194, 9, 65,247,109,237,168, 51,134, 96,184,161, 60,197, 18, 9,
- 75, 24, 45, 16, 75,214,148, 64,173,176,173,129, 73, 17,197, 56,156,134, 17,224,130,183,111,191, 68,205, 17,135,195, 65, 40,100,
-211, 65,108,148,165, 40,128, 69, 2, 88,134, 97, 68, 76,171,186, 62, 42, 64, 86, 2,101,198, 65, 5,136, 5,199,225, 8, 2,225,
-211,211, 51,130,181,152,151,136, 82,197,122,117,152, 14,242,125,151,130,160,132, 53, 31, 6, 81,110,103,153, 14, 92, 86,185,252,
-150,117, 65, 45, 25, 54, 4,112,201,138, 85, 53, 56,221,220, 32,197,132,101, 89,144,179,140,180,155,167,159,139, 76,202, 14,211,
- 36,246, 47, 34, 85,228,138, 5, 71,114,224,173,136,119, 82, 18,181,125,240, 56, 95,102, 76,227, 0,231, 61,110,156, 67, 84,255,
-120,214, 73,192, 18, 35, 98,146,159,115,153,103, 48,128, 37,174, 56, 29, 14, 50, 86, 52,132, 64,182,123,220,115, 17,159, 57, 17,
-192,106, 47, 29,134,208,237, 99,193, 6,153, 80,168, 79,190,241,229, 67, 16,171,108,140, 17,135,233, 0, 38, 32, 51,131,178,164,
- 62, 78,135,131,196,219,234,196,173,249,132,141, 49,248,230,187, 15,136,185,244, 17,179,183, 2,128,113, 70,144,194, 34,112,179,
-187,224, 17,105,136,140,102, 56,203,247,229,212, 90, 42, 35,245,152, 11, 6,101, 2, 56,231,224, 45,118,202,106,161, 5, 54,191,
- 55, 65,208,176, 68, 34,130, 98,189,124,136,196, 25,212, 49,168, 61,140,103,203, 82,104, 69,121, 95, 51, 26,113,210,180,120, 78,
-102, 81, 39, 54,230, 90,140, 9,209,175,248,255, 11,123,179,157,201,146, 44, 59,111,109, 27,206,228,254, 15, 49,100,102, 85,245,
- 76, 18,132, 64,117, 3, 20, 37,129, 36, 40,241,117,244, 8,122, 2, 93,233, 1,116, 47, 93,233, 94, 47, 32,240, 70,141, 38, 4,
-178,196, 98,163,217,236,234,174, 33,171, 58,199,136,127,112, 63,147,153,109, 93,236,109,195,241,200,146, 10,104,100,103,102, 68,
-254, 30,238,126,204,246,176,214,183,134,113,194,253,157, 6,246,168, 58, 30, 58,214, 54,121, 13,160,255,174, 76, 47,181,216, 38,
- 86,235,179,222, 17,181,171, 86, 47,183,177,232, 58,215,160,191,107,227,148,207,112,171,172,135,172, 21,106,167,132,101, 37,172,
-151,172,209, 11, 58,103,213,103,209, 90,214,127, 24, 99, 11, 56, 39, 79,113, 77,211,209,231, 14, 61,169,136,112,203,151,114,115,
- 8, 27, 66,147, 64,169,106,119, 77, 20,116,222,225, 39,191,255, 99,156,239,238, 16,246,173,232,160,242,161,157, 57,239, 65, 59,
-114,223,117, 66,153,219,119,248,174, 67,140, 17,151,203, 21,134,172, 98,153, 19, 98,216,203,165,222,166,109,102,139,156,201, 52,
-190, 84,167,233,212,166,159,230, 53, 44, 67,119,234, 92,227,191, 24,169,230,211,150,238, 60, 85, 64, 62,167,155, 75,230,152,212,
-147, 47,129,212, 66,254,115,246, 54, 29,185,181,109,190, 58,221, 92,255,101, 52,171,255, 50,103,124, 51,203,216,129,141,218, 21,
- 64, 24, 7, 7, 39,179, 37, 60,173, 17,158, 8, 75,140,240,134, 16, 13,105,168,188,190,174,182,152,224, 84,198, 63, 25,148,159,
-199, 54,222,119,135,162,163,174, 22,204,173, 61,188,116,171,165, 19,135,120, 61,179,239,250,240,231,203,190,255, 92, 47, 39,150,
-209, 81, 30, 39,181,225, 5,135,244,194,116, 16, 23,230,217, 80, 9, 60,128,118,225,217, 51, 74, 77,172,162, 33, 13,173,209,223,
- 97,168,181,154,235,164, 38, 29, 42,232, 28, 56,145, 51,213,243,120,186, 77, 73, 43, 54,186,204,149, 44, 23, 53,233,152, 61, 63,
-168,250,215,156, 24,213,250,239,179,247, 95, 95, 83, 1, 32,209,173,153,128, 97,137,113, 26, 58,120,103, 17,245, 66, 39, 2, 78,
-167, 51, 0,160,239, 58,172,219,134,127,242,143,255, 17,254,205,255,245,231,229,194,230, 50,226, 67, 9,187, 40,185, 5, 58,241,
-144,201,131,240,147,207,111, 62,199,208, 79,248,254,175,254, 93, 1, 22,205, 91, 94, 17,200,152,151, 83,196,208, 15, 50, 42,177,
-130,119, 76, 97,199,199, 15,223,224,253,251,247, 56,157,207,120,189, 92, 16, 99,194,253,221, 29,150,117,197,229,122,145, 46, 15,
- 66,128,114,214,227,244, 48, 1,198,129,145,176, 92, 47, 34, 0, 99,130,117,157, 18,207, 4, 20, 50, 95, 23, 48,128,251,251, 7,
-204,203,170,236,122,205,107,208,116,196, 60, 93, 74, 41, 98, 11, 34, 20,138, 41,225,238,116, 46,154, 11,107,157,116, 16,214,224,
-122,189,106,156,105,133, 21,121,223, 73,158, 66, 12,184, 59,159, 17,226, 46,104, 86,231, 96,251, 14,251, 22,117, 44, 42,159,201,
-117, 89, 69,241,174,222,115, 99,228,130,186, 63,159,241,252,242, 34,251,117, 18, 81,154, 37, 25, 61, 90,125,141,206,202,120,122,
-240, 67,217,153,147, 58, 30, 99, 76,240,189,248,249, 13,201, 36,130, 20,244, 65,218, 97,175,235,170, 36, 55, 7,222,119,112, 98,
-201,167,159,148,119,191,109, 56,157, 78,232,251, 30,251, 30, 48,245, 64,180,161,136,233,178,216,200,232,216, 61,166,132,167,215,
- 11,190,121,122, 45, 9,136,135, 60,112,197,194,166, 28, 72,101,228,220,112,214,160,243,186,195, 53, 89, 87, 32,151, 33,152, 17,
-162,228, 62,100, 64, 8, 33,130,200,234,202, 74, 69, 90, 10, 30,145,103,206, 54,103, 11, 41, 9, 78,104,151, 96,160,243,182,116,
-229,133, 26,169,151, 88, 57,223, 26,241, 28,140, 6,176,164, 84,220, 76,149,237,206, 88,183, 77,178, 5,156,132, 49,137,222, 37,
- 42, 78,219,170,222, 67,156, 73, 33,236,101,207,127, 64,195, 54,248, 85, 40, 55, 61,139,211,188,119, 7,125, 81, 17,191,149,181,
-105,213, 82,228, 81, 60,233,175, 49, 37, 76,171,237,212,235, 40,221, 58,175,133,135,132,131,145, 2,102, 72,179, 54,164,112,168,
-151,123, 42,229, 76, 82,197,187, 66,102,154, 38, 13,186,239,207, 99,252, 98, 95, 83,128,215,143,126,244,185, 52, 17, 65,196,206,
-166,236,247,173, 58,184,100,186, 76, 74, 75, 44,145,209, 9,136,243,130,176, 71,132, 61,130,140,140,203, 83,220, 97,163,100, 45,
-228,137, 86,107, 83, 54, 6, 13, 84,169, 54,224,133, 21,161,150,195,188, 66,114, 69,248,197, 53,186, 14,169, 94,196,185,179, 76,
-154, 82,150,137, 66, 57,106,149, 8, 57,122,163,168, 20,107,242,149, 30,164,166,233,228,155,196,183,250, 57,201,207, 76,237,125,
- 70, 55, 57,128,197,122, 32, 52, 44,163, 23,186, 33,130, 53,128, 19, 13, 85, 9, 85, 73, 36, 21,178,188,209,109,132,169,116, 96,
- 9, 98, 11, 40, 26,209, 70, 43,192, 0,124,231,202,197, 93,168, 70, 45, 89, 78,119,213, 53, 79,184, 17,161, 49,192, 38,195, 27,
- 90, 5, 28,231,220,194, 26,179,151,114, 65,132, 35, 75,185, 77, 83,160,219,194,167,221, 54,231, 90,161,118,238, 70,121, 1,108,
-168,137,196,173, 41,111, 38,229,139,172,180,224, 42, 70, 81,208,131,169, 29,117, 70, 6, 19,227,144,183, 92,249,202,181,250, 38,
- 61, 8,139, 21,189, 69, 7,227,150, 40,151,163, 23, 83,211,221,243,205, 68, 39,215, 46,146,182,230,173,193,221,233, 36, 72,213,
- 36, 23,199, 22, 3,174,243,172,151, 92, 18,212,103, 98,252,209, 31,254, 1,190,253,251,191,199,211,117,133, 49,226, 33,207,159,
-157,179, 70,186,120,164, 50,154, 99, 5, 78,113, 74,216,150,139, 48,152, 21, 14,212, 89, 17,135,229,233,205,117, 93,225,188,100,
-140,131,129,206, 24,132,176, 98,232, 6, 48, 25,177,143,109,171,136,165,246, 29,215,117, 6, 84,121, 27, 73,180, 18,215,235, 5,
-119,119,247, 2,140,177, 10,160, 32, 25,207,173,219,174, 1, 30,114, 48,249,174,211,110,167,199,188, 46,184,187, 59,203, 30, 79,
-255,221,182,174,176,123,192, 30, 34,156,211,176,146,176,161,119, 14, 59, 24,235,182, 22, 48, 81,223,121,221, 55, 59,164, 20,213,
- 15, 46,182, 55,178,130,109,237,157,131,245, 22,203,124, 69, 74, 9,157,247, 24,134, 65,244, 41, 73,167, 59,214,233, 33, 12,181,
- 98,137,162, 87, 46,210, 17, 79,207, 79,101,136,103,213, 10,150, 0,144,177,136, 97,151,228, 53,229,206,147,102,161,231, 40, 99,
-249, 51, 43,178, 51,201,104,119, 89, 23, 24,107,241, 48,142,184, 94,175,216,182,185,136,198, 12, 37, 88,103,225,157, 76, 8,194,
- 46,105, 86,249,121,222,214, 77,118,224, 33,148, 14, 49, 70,205, 90,208, 12,243,125,219,176,133,136,191,253,237,183,101, 28,204,
-204,112,250,156, 56,147,187,114,131,193,171,243,196, 57, 93, 71,216,242,157, 53,144, 80,151,150, 54,105,173,173, 49, 39, 28, 17,
-163,194,177,140,116,142, 65,187,196, 16,245, 89,163, 76,231,147,239,231,190,133, 98, 69,180,186,190,178, 36, 73, 99, 41, 5,109,
-120,116,237,169,185, 19, 45,228,202, 40, 29,143,201, 22,150,184, 88,116,229,187,178,135, 29,219,190, 97,156,206, 24,199, 17, 22,
- 1,148, 2, 66, 2,182, 68, 8,249,162,221,168,138,122,211,141,198, 6,220,160, 83,179,104,205,150,174, 58, 55,130,185, 57, 43,
- 93,122, 74, 90,228,165, 98, 67, 43, 14,164, 76,159,107,130,169, 90,251,110, 78,157,171, 97, 62,164, 23,123,142,238, 62,178,224,
-243,235,136,122,198, 75,228,111,172,234,123,174,235, 70, 34,163,234,119, 83, 47,117,107,112,119,119,194, 56, 12, 2, 66,219,214,
- 50, 53,225, 70,102, 20,246, 29,188,115,121,109, 49, 5, 93, 23, 88,101,186,179,176, 66,178, 31,158, 24, 49,212, 4, 59, 83,130,
-126,178, 88, 58, 23,108, 92,161, 57,121,191, 79, 66, 20, 52, 86,232,118,204,128,203,123,216,210,126,162,129,238,231,253,120,206,
-253, 86,174,111,109, 63, 43,198, 20,208,110, 80,171, 91,186, 81,194,211, 97, 6,207,160,155,222, 28,217,131,251,195,255,182, 92,
- 99, 81,127,141,209,187,222, 18,131, 67, 66, 36,139,141, 25, 6, 9, 81,129, 24, 41, 37, 80,215,195, 66,246,210,220, 36,186,215,
-226, 34, 21,250, 82, 46, 77, 68,137,216, 29, 45,120,185,203, 52,104,118, 26,168,151,113,225, 13,235,248,171,228,227, 54,110,128,
- 54,130,173,201, 73,103, 70,137,254, 60, 14, 44,232, 96, 81,131,238,195,115, 69, 73, 13, 63, 74,108,134, 82, 37, 37,170,201,110,
- 37,235, 40,135,243, 16, 26, 86,243,144, 0, 0, 32, 0, 73, 68, 65, 84,131, 13,151,221, 87, 85,168,234,173,157, 29, 5,229,247,
- 81,149,190,113,253, 28, 10, 21, 58, 87,108, 57, 69,141,185,112,163,181, 93,151, 81,154,145,204,242,252,247,164,163,204,204,170,
- 62,100, 4, 83, 59, 86,146, 63,215,235,235, 12, 67, 6,151,101, 5,165, 4,223, 57,192, 24, 76,126,192,187, 55,111, 96,140, 85,
- 24,138,133, 11, 17,127,242,251,191,135, 95,255,234,215, 56,119, 22,187,177,160, 36, 97, 7,176, 98,199, 25,134, 14,251, 38,194,
- 45, 89,135,112,209,130,196,176, 97,190, 62,169, 93, 42, 98, 11, 36,161, 33,156, 64, 70,236,108, 70,117, 18,214, 88, 33,200,145,
-197,117, 22,178,217,117, 94, 48, 12, 19,182,109,209,108,110, 81,213,238, 97,199, 52,157, 36,147,251,238, 81, 4,132,138,126,237,
-135, 9,188,202, 33,118,127,238,176,108, 59,182, 93, 46,220,147, 33,220,221,221,107,193, 36,135,223,150,128,121, 93,164,112, 80,
-206,251,216, 43, 37, 44, 69, 72,223, 24,208, 89,135, 61, 10, 61,173, 43, 24, 88,241, 75,147,145,137, 20, 3, 50,205,130,193,221,
-105, 16,113,158,118,167,123, 8, 88,215, 77, 70,240,250,108,120, 47,234,249, 85,133,112, 68, 4,235, 12,174,215, 69,252,224,219,
- 38,159,185,158, 5,137, 25,157,115,184, 94, 46,197,113, 98,173,193,182,111,229,115,222, 54,249, 25,214,137,114,127,154, 78,242,
- 51, 89, 20,217,214, 26,244,157, 68,148,102, 95,115,126,157,206, 57,116,125, 15,239, 61,214, 77,108,105,207, 47,207, 2,194, 97,
- 96, 56, 13,216,183, 13, 33, 64,196,140,214,162,115, 14, 73,149,240,251, 46,156,131,255,252,155,175,203, 90,172, 4, 31, 41, 86,
- 52, 49, 48, 56,167, 41,134,132,193, 11, 80,199,229, 64, 38, 45, 22,147,102, 99,103, 46,184,228, 59,176, 88,107,161, 73,148,202,
-175, 55,156, 25,243, 80,157, 5,244,215, 39, 88,245,252,112,136,216,118,209, 42, 68,165,219,213,156,138,250,252, 26, 5,230,228,
- 40,214,132, 38,174,153,197,129, 33, 57,230,170, 19,200,103,179, 54, 60,123, 8, 24, 56, 97,234,123, 12,246, 12,138, 66, 4,100,
-219,227,105,222,117,133, 19,165,248,218, 54,216, 2, 46, 58,222, 29, 53,134,217, 28,173,205,134, 10,157,206,100,204,172,218,205,
-100, 15, 94,207, 59,153,152,113,105, 56,200,210, 33, 95, 60,231,151, 91, 39,218, 4,155, 65, 47,208, 66,162,172,194,169,114, 64,
-138, 99, 41, 39, 80,212,125,122, 73,135,175,190,226, 50, 29,174,144, 25,131,190, 31,240,230,205, 35,134,206, 99, 95,230,166,185,
-145,207, 60, 67,189, 56,101,109,134,164, 91,102, 78,136,117,234,132, 65,210,117, 70,168, 81,216,154,152, 72, 77,106, 27, 43, 8,
-137,140,131,117, 94,192, 90, 57,188, 37, 71,192, 42, 60, 45,227,106, 99, 12,112,114,160, 37, 21, 34,220,204, 83, 26,111, 96,166,
-114, 81, 65,129,214, 56, 62, 98,221, 41, 51, 55,240,130, 99,199,133,155, 36,159, 79,198,210,208,249,124,201, 55,111,141,242, 84,
-182,178, 41,196,131,236,187,119, 6,157, 51,120,141,106, 81,219, 2,216,121,164, 40,137, 76,134, 76, 65,194,202, 87, 80,236, 84,
-114,167,136,146, 60,171,145,153,100,151, 37, 99, 54,219,214,159,229,191, 97,184, 85, 6,168, 0, 13,141,128, 48,135, 32, 80, 22,
-203,125,210,102, 31, 76, 5, 25, 14, 99,136,127,232, 29, 59,162,117,111, 16,177,133,252, 70,199,254,150, 82, 21,151,181,148, 55,
-180,234,210,230, 51,174,171, 4, 42, 23,109,222,117,101,125,138,100,248,178, 6,233,112, 43,238,175,227,242, 50, 30,202,171, 13,
- 42,164,188,108,171,107,199,240,242,143, 73, 58,252, 44,160,107,114,226,219,119, 34,196, 8,143,132,101, 21, 37,113, 14,189,232,
-252,168, 35, 73,137,247,220, 67,128,119, 22, 31,183, 29, 63,249,189,223,199, 55, 95,127,133, 62, 37,108, 57,109, 42,213,159,109,
-157,211,209,165, 20, 15,214, 57,221,179, 69,124,254,217, 31,226,235,111,191, 2, 37, 9,245,145,112, 14, 97,184,119,157, 71,223,
-141,240,148, 16, 53,195,187, 31, 6,140, 67, 15,107, 8,111,222,190,131,247, 14,219, 54,227,227,199,167, 38,168,200,227,245,245,
- 10, 16,224,157, 36,183,145,183,152,175, 51,236, 40, 7, 95, 10, 59,158, 46, 11, 88, 99, 64, 65, 70,248,231,235,138, 24, 35,238,
-238,206,248,248,244,132,109, 15, 34, 38,219, 2,174,243, 21,131, 6,180, 24, 18, 92,104, 12, 1,203, 46, 81,171, 12,135,222, 91,
- 68, 78,224,100,176,135, 85,114,208,135, 94,197, 75, 98,153, 19, 33,163,140,186,141,118,221,121,223,200, 28,117,119, 29, 65,145,
-144, 66, 44,239,183, 49, 6,175,151,171, 88,221,102, 81,181,175,123,192,121, 26,208, 89, 47,126,113,136,117,204,228,239, 6, 58,
-204,203, 6, 67,140,109,223, 10,149,205,123, 17, 34,237, 33,200, 8, 56,138,239,219, 82, 14,191,216, 37,197,173,239, 48,207, 11,
-166,193,151,226,210, 90, 9,228,185, 94, 47, 34, 58,117, 14,222, 24,196, 32,224,157,126, 28,209,245,189, 20, 48,153, 51, 15,241,
-182,255,205, 47,191, 44, 57, 16,164, 63,143,180,145, 49,134,224,213,155,222, 57,219, 56, 89, 32,138,105,197,191,238, 58,229, 26,
-186, 78, 44,148,206, 34,196,132,206,202,217, 25, 84,172,150, 87, 93, 33,197,242,236, 36, 85, 77, 75, 30,187, 92,236,206, 90,108,
- 49,162,239, 92,193,213, 38, 85,106,231,231, 5, 13, 23, 61, 79, 36,203, 64,209,220, 94,132,164,160, 39,113,141,152,156,238,152,
- 3, 79, 82,146, 73,142, 39, 12,157, 71, 80, 93,201,188, 61, 99,205,137,146, 50,246,106, 38, 1, 40,133, 89, 94, 87, 84, 84,108,
-237,174, 83,202,232,220, 84,247,230, 77, 6,135, 88,119,107, 3, 67,121,247,127,208, 8,152, 38, 25,205,214, 14, 61,239,212,111,
-246,231, 21,106, 83, 63,175,172, 39,224,156,157,160,239,159,161,170,155, 98,141,151, 54,198,150,162,131,140,197,251,247,111,113,
- 82,234, 97, 72, 84,149, 63,218, 81,167, 84, 36,228,162, 67, 51, 22,150, 81, 94,167,215,198, 96, 15,187,104, 28, 72, 65, 56, 58,
- 5, 32, 34,196, 61, 32,170, 70, 69,126,182, 76,232,250,113, 16, 71, 74, 98,172,243, 44,231, 52, 82,209, 30,196, 16, 16, 33,193,
- 47,174, 93,202,163, 5, 14,208,177,107,111,194,215, 42, 73,236,128, 92,105,116,237, 68,117,216,202,199,189,104,225,214, 85, 63,
-255,161,151, 39,220,164,126,148,116, 27, 46,148, 41,215, 16,236,188,146,136,246, 4, 12,134, 17,242, 76,223,104,193, 97, 10, 96,
- 84,216,235,134, 74, 34, 28,140, 1,103,129,138, 10,222, 98, 98,144, 97,201,181, 69, 43, 55,168, 10,109, 52,152,214,106,125, 48,
-199, 75, 13, 55, 32,165,155, 63, 82, 6,204,152, 44,152, 99, 52, 19, 18, 42, 0,128,116,168,130,170,197,228,128,163,225,154, 94,
-124,160,237,167,250,186,209, 20, 93,249,205, 47,180,192,156,180,166,131,243,148, 32,157, 40, 87,202, 93, 43, 88, 68,171,108, 45,
-254,114,174, 59, 51,101,193,202, 23,155,203,214, 65, 92, 2, 66,151, 35, 13,250,200,179,250,148, 53, 23,138,125, 44,197, 81,121,
-232, 68, 80, 53,118, 3, 70, 69,133, 90, 99,208,245, 61,156,210,208,242, 65,126,157,103,177,155,117, 29, 34, 19, 56,198,114, 80,
- 72,222,125,146,136, 83, 22,120, 70, 89, 53,196,160,194, 61, 96,190, 62, 11,108,196, 74,250,218, 56, 12,216, 67,192,249,228,177,
- 44, 11, 44, 69, 68, 24, 97,207,147,184, 31,122,239,225,187, 14,227, 56,212, 67, 58, 7,145, 24, 3,203, 70,149,174, 30,203,182,
-138, 66,157,128,251,243, 89, 34, 62, 53,178,145,140, 23, 91,139, 21, 47,117, 78,163,235,188,195,211,199,103,137, 72,181, 6, 79,
- 79, 79,216, 67,130,161,132,117, 89,208, 15, 35,140, 51,176, 48,120,121,189, 0, 36,124,244, 20,119, 57, 88,140, 20, 49,187,126,
-254,222, 90, 77,104,203, 68, 52, 96, 85,174,188,240,226, 73, 16,206,251,166, 74, 91, 57, 0,230,121, 81,145,169, 28,128,251,190,
- 2, 41,137,172,194, 24,204,203,138,193, 59, 44,203,138,228, 35, 60,123, 61,132,109, 25, 51,167,148, 74, 87, 42,224, 15,198, 52,
-120,248,110,192, 56, 14,178, 34, 9, 59, 94, 46, 27,122,239, 96,141, 20, 25, 41, 70, 56, 45,224, 58,239,145, 32,182,190,174,235,
-177, 44,215,146,142,213,105,118,251, 30, 4,246, 50, 12, 83,241,216, 3, 84,136,106, 12,224,231,191,250, 45,246,144,138,136,182,
- 4, 31,106, 67,144,247,195,214,200, 36,199,169,128,210, 90,225,221,103,167,132, 33,117,204, 24,171, 93,123, 2, 82,194, 22,163,
-216, 57,245,241,219, 19, 23,222,251,224,157, 16,231, 84,102,148,119,192, 98,119, 10,213,191,173, 1, 42, 41,171,224, 89,162, 89,
-163, 10,136,243, 89, 18, 82,166, 48, 87,112,138, 76, 51,212,114,101,173,142,124, 19, 82, 22,129,145, 20, 45,206, 10,235, 99,244,
- 61,188, 53,240, 42, 34, 28, 61,225, 89,163, 67,115, 62, 69,182,223,149,100, 53,178, 58,129,203, 81,210, 74,188,212,123,192, 58,
-121,174,114, 98, 94, 17,244, 25,186,241,193, 87, 23, 77,210,139,173,228,109,232,235,181,150,224,180, 67,207,168, 86, 99,242,216,
- 95,119,232,153,216,166, 99,246, 18, 58,197, 4, 24,139,196,123, 19,204,101,202,207,224,210,229,155, 82, 40, 24, 99,240,238,237,
- 35,206,231,179, 76,194,182,181, 98, 90, 91,113,157, 49, 5,168,149,163,118, 25,220, 0,159,196,174,150, 98, 40, 97, 56, 2,141,
-137,162,151,200, 64, 46,146, 66,192,169,240,213, 56, 1,215,132, 16,245, 89, 76,213,103,175, 9,109,169,113, 41,184, 70,250, 92,
-133,113,170,112, 63,224,228, 62,233,173,185,146,225,233, 86,221, 77, 34,214,226,198,167, 78, 53, 8,134,192, 53,136,135,234, 37,
- 88, 46,207,164, 98, 0,174,158,204,172, 78,182,168,187, 22,214,177, 71, 32, 11,102,181,204,144, 21,117,188, 30, 20, 40, 65, 4,
-164,182, 60,110, 20,142, 84,254, 42, 35, 17,245, 24, 58, 83,216,188, 5, 84, 3,153, 70,100,213, 39, 49,142,187,152,166, 4, 34,
-206,226,183, 31, 96,244,105,189,147,138, 86,144,154,148, 54,100,116, 95,177,169,225,118, 15,157,175,246, 38,218, 84, 70,223,169,
-254,252,131,192,143, 15,185,192,242, 53, 75, 5,253,155,223, 67,153, 52,152,114, 97,107,189, 9, 62,204, 10,234,100,128,138,255,
-188,238,227, 81, 23, 24, 69, 63, 80, 46,116, 34, 24,174,169, 79,172, 93,188, 33, 70, 98, 3,211, 60, 33,165,120,160,202,122,239,
-156,195,114, 13,184, 46, 11,122, 37,221,157,166, 73, 14, 60,103,225,173, 19,239, 51, 68,153,252,248,248,136,159,253,231,191,131,
-239, 59,124,243,250,138,187,209,131,172, 50, 6,184,190, 71,249,160,245,190, 87, 6,127, 68, 76, 59,246,109,145,117,128, 42,126,
-159, 47, 50,234, 54,144,236,241, 53, 4, 56,157,243,137,192, 41, 33,194,192, 68, 21,101, 38,193,154, 94, 52,213,107, 28, 39, 60,
-189, 92,112, 62,157, 10,170, 50,169, 32,236,251,143, 31,228, 33, 86,245,249,208,123, 24, 59,224,114,189,106, 52,167,122,205, 59,
-175, 15, 63,176,108,130, 27, 61,159, 70, 24, 0,215, 53, 8, 94, 85, 71,176,227, 56, 33,134, 77, 71,220, 12,198,142,177,151, 73,
- 66, 50,169, 28,152, 97, 15,176,142,176,133,173,116, 8,111,223,188, 1, 49, 11,162,214, 73,151,184,135,128, 93,237,165,211, 56,
-138, 98, 62, 70,164, 36,212,180, 93, 47,144,144,132, 30,199, 44, 86, 67, 24,131,113, 24,203, 56,244,229,245, 34, 54,181, 16,112,
-217, 22,132, 32,127,182,193,137,128,175,243, 78,133,114, 17,175,151, 43, 66, 8, 2,141, 81, 79,121, 70, 43,135, 16, 37, 46,151,
- 58,172,219, 42,246,183,206,151, 66,138,201,192, 58, 3,214,201, 74,140, 17,214,121, 24,215, 33,174,175, 74,127,219,241,237,199,
-103, 60,207,235,113,173, 87, 37, 95,101, 36,204,153,158,153, 24, 33,227, 93, 51,171, 27,130, 24,181,170,122, 47,203,169, 24,133,
-174,199,146, 2,153, 52, 1,204,105, 12,175, 33, 96,221,229, 61,229, 66, 87, 83, 77,132,106, 44,160, 36,186,160, 42,232,164,186,
-149,168, 98,172,114, 97,229, 80,174, 28, 58,194,220, 8,174,204,241, 8, 50, 6,136, 25,240, 34, 66, 44, 97,216,147, 22, 23,114,
-209, 16, 0,111, 61, 78,157, 69,216, 55, 5, 34, 5,153, 98, 18,196,150,201,169,224,170,141,230,208,231,110, 57,165,236, 42,162,
- 70, 28, 93,197,114,173,149,237, 56, 32,150, 63,139,173,193,225, 7,215, 77,123,161,147,145,209,187, 85,146,156,213,179, 60,139,
- 13, 99,170,251,115,144, 41, 14,138,164,255, 87, 24,239, 2,147,191,225,186,203,197,126,119,119,194,105, 26,113, 58,141,218, 24,
- 26,201, 46, 47, 59,110, 39,251,108,144, 20, 93,172, 29,116,206, 95, 55,186,102,205, 34, 98,107,193, 65,221, 8, 26,230, 82,236,
-123,186, 74,112,125,175,145,202,187,172,142,182,189,134,234, 40,195,162,146, 77, 77,113, 58,112, 42, 49, 40, 71,148, 31, 43, 25,
- 77,121,254, 85,200,213,112,114,107,167,154,199,189,140,219, 88,152,172,248,171, 66, 5,249,251,195, 56, 62,127,224, 13, 25,173,
- 77,118, 67,126, 45,186,247, 79, 33,194,192, 0, 73,118,130,206, 27, 92,247,204, 31,118,176,148,138, 55,212, 2, 37, 45, 74, 68,
- 18,210, 41,178,134, 23, 56, 67, 88,169, 38,205,101, 21,113, 62, 92, 51,114,141, 75,241,194,229, 86,230, 76,197, 83, 62,114,161,
- 40,193,128, 56, 22,241, 93,211,100,127,226,237,227,198, 69,145,218, 75,150, 27, 47, 59,223, 14,224,169, 8, 10,203,235,105, 32,
- 15, 92, 98,109, 81, 82,218,184, 33,182, 85,145, 90, 22,237,181, 72,199,212,136, 18,185, 68, 50,230,191, 55, 89,104,168, 81,170,
- 92, 18,156,244,243,207, 76, 2,189,180,145, 47,116,229,191,215,189,149, 28,142, 98,245,111,131,114,168,177,222,212, 3,105, 89,
- 69,200,195, 49,128,147,197,235,229,138, 31,125,254,153,232, 30, 82,196,190,203, 20,102, 26, 39,252,234, 55,191,197, 95,255,226,
-151,216,150, 25,189,179,120,255,120,143,199,113,196,151,223,126, 13,151,253,190,134, 48,248, 14,211,244,136,235,245, 35,156,113,
- 66, 41,235, 70,132,125,198,186,173,216,183, 25,206, 57, 44,123,238, 42,119,116,110,144,117, 1, 12, 44,137,103,116, 15, 17,253,
- 52, 96,139, 1,243,229, 5, 60, 78,176,134,112, 93,174,226,219,246, 30, 3,100,197, 50,141,163, 10,157,116, 58, 3,134,247, 22,
-123, 96, 17,174,177,236, 24,147,146, 66,196,186,231,225,188,133, 51, 50,162,243,206, 35,196, 14,235,182, 99,210,233,206,188, 44,
-120,188, 31,113,189, 48,186,190,199,216,119,120,121,121, 21, 16, 11, 8,227, 56,194, 59,131,215,151, 87,116,195,136,187,243,157,
- 88,191,156,151,238,221, 16,210, 34,208,154, 45, 68,172,235, 2,231, 60, 46,215, 43,184,239,101, 39, 15, 96,236,122, 12,227,128,
-215,215, 87,172,235, 86, 46,234,101,223,208, 57,135, 85, 71,154,222, 90,197,168,154, 34,120,114, 78, 46,223, 94,169, 90,203,178,
-170, 13, 78, 16,169,214,121, 64, 85,214, 49,137, 18, 61,165, 40,233,107, 74,119,115, 86,198,161, 33, 72, 46,124,208,209,255,186,
-202,123, 27,118,137, 17,117, 86,172, 99,156, 36, 58, 85, 10, 24,135,233,116,194, 58,207,114,161,179,100,148,255,246,123,225,186,
-231,120, 97, 99,126, 72,167,171,217,231, 58,233, 51,196,154,152,166, 29, 37, 52, 21,208, 58, 48, 68,132, 23, 57, 98, 11, 65, 17,
-173, 66, 20,203, 57,234, 57,161, 45,162,174,189, 92, 9, 98,162,162,116, 78, 44,123,122,177,246, 37,189,196, 43,207, 29,133,126,
-119, 75,130, 68,141, 83,165, 54,226, 57,143,176, 37,232, 39, 91,123,243,217,226,140, 8,249, 8,242,222, 58, 43, 22,198,193, 59,
-196, 24, 20, 78,147, 47,101, 91,202, 31,180, 56,213,140,171, 45, 54, 44,170,249, 19,250,125, 48,149, 30, 83,214,180,109,203,216,
-134, 84, 21,175, 54,213,252,114,217,165,219,162,254,206, 73,123, 69,155,165,151, 85, 98,189,212,181,153,200,251,250,152, 98,205,
- 94,207,211, 66,125, 33,249, 66,207,184,217,105, 28,241,112,119,198, 52, 13,136,123,133, 20,145,181, 32,125, 46,200, 88, 24,215,
- 73,113,135, 93,186,103, 67,232,250, 65, 73,115,208,108,244, 80,244, 98, 70,139,248,164,142,148, 76,200,203,228, 70,107, 93,113,
- 5, 37,245,186,179,162,155,115,179,155,223,223,234, 41,167,154,220,198, 63,208, 83,102,223,157,252, 7,168, 94,198,133, 34,196,
-141, 62,162, 97,159, 51,223,216,211,143,105, 47,135,162,145,106,156, 41,103, 53,120,137, 9,171,188,239,146,135,155,201, 28, 72,
- 48,150,208,105, 94,116, 22,102,113, 69,156, 43,151, 89,118,115,217,250,241, 63,252,143,255,147,190,124,177,166, 72, 14,114, 85,
-111,103,181,118,215,121, 56,107,114,241,166,163,122,170,153,230, 76, 69,169,151, 47,244,234, 66, 75,205,133,154,133,116, 12,106,
- 40, 80,141, 52,173,136,240, 50, 65, 40,255,249,137,235, 4, 69, 74, 13, 46, 57,193,101, 23,146,154, 15, 84, 71,161, 37, 34, 55,
-143,229, 52,185,138,110, 84,120, 66,142,106, 34, 78,243,129,145,242,223,231,239, 68, 42, 32,137,212,172, 41, 50,191, 63,123,218,
-115,231,206,121, 79,158, 80, 99, 86,161, 24,218,124,232, 40,242, 61, 37,212,190, 40,171, 94, 83, 42,227, 37,232, 30,127,213,116,
- 50, 2, 16,247, 13, 93, 62,216,245,203,111,141, 84,238,219,190,193, 24,194,239,125,246, 30, 63,122,247, 6, 68,130, 31,126,251,
-120, 47, 72, 78, 45,188,156,117,240,253,136,223,251,163,127, 12,107,189,240, 12, 0,132,184,195,184,190, 68, 38,118, 93, 47, 34,
-182,190,131, 51, 86,209,166, 66, 42,187, 59,157, 68,188,226, 28,152, 13, 58,215,163,239,122,188,121,243,128,203,245, 90,196,150,
-146,210, 68, 8, 44,163, 77,107, 13, 78, 39,185,100,239,207,119,176,190, 71,231, 7, 13,145,144,239, 73, 8, 81, 64, 32, 28,101,
- 21,100,141, 70, 82, 74,103,214, 15, 39,201, 45, 15, 27, 56, 69,188,123,251, 22,211, 56,226,237,187,247, 50,102,205,223, 39, 34,
-220,157, 38,116, 78, 2,141,198,241, 36, 17,160, 49, 98,232, 59,128, 19,214,245,138,109, 93,208,121,135,125, 91,192, 49,192, 59,
-135,101, 93,240,112,119,134,239, 68, 81,110,148,136,246,242,242, 34, 57,228, 96, 17, 75,105,240,209, 22, 35, 58,107, 49, 40, 96,
-196,232,126,223,123,185,236,132,154,184, 97,221, 54,108, 33, 32,164,168,123, 68,131, 97, 24, 49, 77, 19,238, 79, 18,100, 49, 14,
- 3, 12, 25,188,127,251, 86,126,191,113,234, 71, 54,112, 94, 68,113, 68,170,163, 80, 75,218,182, 74,132,235,160,123,115,231,228,
-240,247, 93, 39,211,133,105,146,239, 16, 17,156,122,224,127,254,219,111, 69, 36,168, 99,102,129,146,212, 85, 33,221,168,167, 69,
- 22, 66, 37, 78,148, 20, 71, 74,214,195,250, 81,248,255, 49, 33,196,128,151,121, 69,136,154,205,173,233, 95, 70, 61,235, 25, 20,
- 19, 82,158, 38,114,121, 54, 98,146,203, 59,234,218,107, 15, 17, 91,136,216, 83,157, 36,150, 51,179, 92,232,220,158,176,197,131,
-157, 74,215,192,199,213, 89,179,235,206, 19,136, 44,238, 10,170,195, 8, 81,248,255,162, 81, 49,138,146,214, 46,148,155,165,169,
-118,209,114, 70, 27,157, 54,208, 17,217, 90,136,104,168, 16,152,204,106,207,201,105, 89, 37,159,217,237,249,175,165, 99,150, 49,
-123,190,208,243,229,107,141,173, 28,117, 91, 87, 23, 34, 62,140,242,127,185, 91,135, 41, 66,105,100, 78,188,122,241,115, 8, 76,
- 78, 87,179,198, 98, 28, 6,188,125,247, 6,247, 15, 15, 10, 41, 10,101,109, 36,175,213,170, 22, 64,120, 17, 12,134,243, 30,174,
-235,209,143, 19,134,105, 66, 63,142, 18,172, 20,130, 80, 82, 85,175, 50,158,207, 24, 38, 57, 67,160,249, 16, 48, 84,210,252,194,
-190, 99, 91, 86,196, 61,138,107,131,160,132, 68,215,248,251, 19, 18,107,140, 47,167,194,243,119, 57, 78, 51,143,115,137, 33,234,
-233,148,169,100,199,189,110, 91, 81,101,213,114,162, 6, 21,139,106,235, 58,240,209, 51,172, 32, 43,165,185, 41, 8,184, 94,152,
-212, 82,134,184,229,161, 23,127,153, 88, 76,136,208, 27,131,141, 9, 61, 81,185,144, 83,202, 68, 51,192,186, 30,113,125,213,177,
- 63,225,127,253, 95,254,231,162, 56,239,156,197, 28, 36, 23,154, 90,208, 1, 1,221, 48, 20,142,243,173,206,141, 52, 17, 41,175,
- 16, 14,177,115,121, 44, 79,244, 59,228,128,191, 67,211, 95, 4,111,101,238, 94,179,202,243, 16,132,169, 98,106,115, 4,171,169,
- 85,121,173,163,210,113, 32, 64, 84,194, 34, 76,227,245, 68, 25, 66,181, 53,214,109,148,158, 81, 33, 91,134, 98,152, 82,120,149,
- 98,239,134, 28, 69,168,138, 92, 82, 52,173,252,206, 74, 40,226, 92,180,148, 61, 89,182, 42, 54,239,105,202,241,139, 40,164,176,
-109,223,241,238,124,143,247,159,125,134,206, 59, 85, 14,203,184,119, 94,100, 71,154, 98,196, 79,255,234,175,241,238,225, 30,159,
-191,121,128,179, 22,203,178, 96, 28, 70,108, 33, 40,180,132,176, 44, 11,206,247,247,242, 46,236,155,106, 14,162,160,120,137, 48,
- 95,159,229, 1,113,210,181,216,210,217, 16,194,118, 69,180, 26,149,185,206, 0, 34, 18, 44,134,113, 16, 75,150, 53, 32,235,112,
-157,175, 72, 49,193, 88,135, 1, 9,100,123, 0, 81, 59, 74, 96, 89,103, 24,227, 0, 36,236,123, 44, 1,199,224, 0,103, 29,140,
- 38,174, 25,147, 48,246, 82,213,175,203, 85, 58,232,196, 24,186, 17, 32, 89, 67,204,203,130,161,239, 17, 99,194,186, 46,146, 88,
- 55, 12,232,251, 1,204, 17,235,182, 1,156,208,251, 94,186,225,152,176,174, 43, 0,153, 18, 88,223,129,149,129,255,225,227, 51,
-188,179, 8, 90, 20,231,221,226,243,245,162,162, 57,233,186,150,117,171, 16, 20, 34, 68, 78,176,218, 9,177,134, 79,156,250, 14,
- 49,236, 48,198, 10, 5,110,223,133,125,221, 9,118,215, 24,139, 45, 36, 76,125,135, 24, 3,136,128,203,245, 90, 68,139, 68, 6,
- 91, 88, 0, 35,250,133,101, 93,225,140,149, 66, 67,129, 49, 49, 38,144,183,101, 10,144, 5,176, 93, 55, 96,143, 1,143,143,111,
- 20, 74, 35,151,195,203,203, 51,126,246,243, 95,203,152, 91,161, 53,204, 81,108, 71, 68,135,243,199,232,243, 19,184, 34,123,101,
-231,169, 33, 49, 36, 48,153,160, 33, 50, 98, 95,146,159,159, 7,250, 50, 74, 39, 21,199, 37, 89,169,100,213, 81, 98,236, 36,129,
- 52, 28, 83, 41, 82, 50,185, 46,159,185, 73,139, 3,171,222,119, 98, 65,195,230,209,114,233,220,243,132, 83,132, 49,117,186,215,
-112, 33,178,221,139, 85, 8, 71, 16,216,204,186,111,170,192,207,246, 84,113,121, 88, 43,250,139, 93,227,163,133,119, 47,129, 90,
-104,211, 60,179,240,142,101, 52,207, 57,141, 44, 55,115, 13,159,254,102, 44,123,240,184,163, 36, 56, 82,211,181, 27, 97,227, 27,
-215, 92,232, 85, 28, 7,237,196, 51, 66,149, 19, 11,116, 44,197, 50, 33,200, 83,204, 10,180,169,214, 49, 99,107, 40,140, 49, 6,
-253,208,225,221,187, 55, 56,159, 38, 56,103,193, 28, 85,106,150, 21,252, 14, 48, 73, 4,106,251, 10, 56,135,174, 63,195,247, 61,
- 98, 22,194,129, 17,118,105, 72, 98,144,169,153,245, 94, 35,152, 69,192, 25,131,124,231, 3,133,122,247, 17, 36,194, 53, 74,108,
-113,177,235,169, 46, 34,133, 84,239,150,212,104,218, 89,214,205, 46,169,196,191, 96,230,114,206,121,246, 58, 83, 77, 16,147,139,
-185,233, 12,111, 8,103, 68,124,136, 96, 61,100,167, 83, 93, 40, 19, 53,150,173,196,101,115, 91, 58, 97,237,252,248,224, 2,171,
- 18, 70, 1,244, 11, 47,205, 24, 3,116, 14, 70,195, 48, 72,173, 84, 41, 49,252,208,131,232, 2, 6,240,249,143,127,130, 95,253,
-226,239,208,235,206,142, 57, 97,221, 2,172,119, 69,141,157,159,139,168,182,147,146,211,219,224,109,153,154,137, 68,222, 91,183,
- 59,184, 50,210, 62,170,226, 9,255,223,255,203, 32, 26, 99, 26, 42, 92,177,206,149,100,155, 67,160, 14, 39, 86,190,123, 86,179,
-241, 15,153,218,203,123,223,166, 73, 37, 21,119,165,116,244,231,231, 66,172,236,230, 15,235,184, 84, 58,117, 89,190,105,190,242,
-225,251,145,127,157,209, 48, 25,201, 81, 47, 66, 56, 80, 3, 28, 74, 72, 17, 7,251, 36,103,255,174, 32,242,202,161,136,176,225,
- 60,246,136,249,191,211,196, 26,166,148, 48,207, 51,254,221,223,254, 2,127,240,197,231,120, 60,159,240, 15,126,255,199, 0, 9,
-135,221, 24,194,233,122,197,199, 23,217,127,145,117, 0, 89,252,223,127,241,127,202,238, 60,119,141, 26,100,146,247,170, 40, 72,
- 77,130,215,125, 97,220,165, 90, 95, 87,137, 7, 61, 79,103,196, 16,241,248,112,198,164,137,109,247, 15,119,184, 92,103, 76,195,
-136,231,215,139,140, 86,157, 4,118,128,228, 98,155, 78,103,236,235, 12,107, 45,246,224,208,247, 30,137, 13,150,117, 69,138,114,
-201,120,231, 48,175, 43, 34, 11,193, 78, 20,228, 61, 78,206,227,114,185, 32,165,128,126, 24,240,250,250,130,101,219, 75, 30,131,
-115, 14,119,231, 73, 47, 27,185, 88, 62,123,247, 94,212,190, 0,214,101,193, 58,207, 24,134,190,208,236,174,203, 6, 50,130,136,
-133,130, 96,182,176, 99, 89, 55, 12,125,143,190,239,241,238,237, 91, 92,175, 87,233, 58,246, 29, 49,202,120,123, 28, 58,108,123,
-196,190,239, 88,195,174,129, 46,178, 58,128, 58, 60, 50,113, 48,197,168, 42,247,161,228, 87,247,157, 67,208,194,106, 11, 65,124,
-241,125,175, 24,205, 21,222, 90,244,125,175,157,100, 64,127, 18,235, 94, 12,146,104,229,189,199, 56,142, 10,222,145,157,187,243,
-190, 8,182, 86, 85,185,147,247,136, 49,225,223,255,167,159, 23,151, 67, 78,102,204, 90,153,188, 54,202,156,139,188, 8,180, 25,
-111,106,140, 92,102,182,147, 78, 13, 9,215,235, 69,213,207, 9,206,100,180, 41, 10,134, 84, 2, 89, 12,214, 32,194,185,146,108,
-169,126,108,103,197,147,110, 21, 91,237,172,140,175,131, 94,242, 81,199,245,166,116,114,218,209, 35,143,152, 81,198,240, 49, 53,
-169,145, 41,119,233,162,184,205,234,115,106,154, 14, 86,202,230, 22, 3,230,149, 52, 91, 93, 82,228, 50, 87,222,154, 30,189,119,
-152,183,189, 32, 75,115, 16, 77, 14, 71, 49,101,173,103,170,191, 28,237, 90, 50,251,175,155, 53, 64, 89,108,226, 56,110, 55,117,
-172,159, 57, 33,148, 47,114,107,224,140, 41, 90,134, 98,201,229, 10,103, 73,234,228,200, 5,168,156, 87, 42, 5,110, 34,102,203,
-164,160,116,221,226,247,238,251, 30,111, 31, 31, 48, 14, 3, 58,239,148, 22,104, 85, 72,105,116,245, 0, 32,133,230, 62,203,107,
- 78, 41, 36,194,182, 97,213, 53, 74,107, 7, 5,203, 51,176,238,187, 60,143, 41,202,180, 48, 79,106, 52, 70, 24, 32, 45, 92,109,
- 89,201, 36,229, 22,148, 8,240, 60,141, 97, 58, 0, 71, 93,139,226,228,236, 91,204,152, 62,170,251, 6, 78,121, 71,174, 42,240,
-198,155,156,247,163,156, 47,247,214,190, 70, 92, 69,119, 13, 2,245,144,246,213,144,231,202,165,149,227,254,138,141, 46,147,223,
- 42,132, 33,104,101,109, 75,162,145, 28,206, 25,122, 79,174, 87,240, 2,227,205,251, 31,225,183, 95,254, 90, 34, 23, 19, 99,213,
-139,223, 54,170,251,220, 25,164,152,244, 75, 67, 13,251,134,235,254,231,128, 7,110,190,148, 77,218, 30,231, 78,158,141, 38, 27,
-161, 1,190, 52,243,122,206, 89,182, 85,144,211,110,245,152,179, 71, 60,219, 79,212,107,154,181,104, 77, 92, 49,181,155, 64,190,
- 37,249,112,233,244,179,192,177,133,201,180,251,246, 76,184,171,197, 73, 86,135, 86, 94, 51,184,118,235, 37, 54,209, 52,198, 9,
-164,170,176,215,239,208, 81,118, 87,247,242,100,184, 38,247,193, 52, 90, 4,221,113, 42, 59,158, 40, 97,210,139,104,200,202, 80,
- 34, 88,103, 49, 2,120,243,240,160, 17,160, 27,150,117, 67,215,249,226,233, 44,170,100,223,233,126, 45,226,143,254,248, 79,241,
-155, 95,255, 28,151,215,239,149,252, 37,187,220, 2,245, 48, 14,214,238, 96,178, 88, 35, 99,244,114, 40,156,167, 17,119,100,176,
- 71,198,186, 94, 97,199,123,172,203,142,181, 95, 65, 36,234,240,211, 56,225,245,245, 5, 72, 1, 93, 55, 97, 15,123, 65, 77, 14,
-125,135, 61, 72,183,123,157,231, 2,223, 97, 4,120, 75, 88, 35,195,119,131, 36,169,113,132,183, 29,250,190,195,135,167, 39,108,
-187, 84,239,172,224, 39, 81, 72, 27,220,223,221, 97, 86,220, 43,129,225,157, 23, 37,242,182,225,241,254, 36,124,106,157,200,197,
- 20,209,249, 14,150, 32,129, 47, 20, 36, 81,173,243,130,189, 36, 41, 46,242,168,179,239, 58,128, 25,151,203,165, 68, 86,146,118,
-206, 99,215,193, 58,139, 24, 34, 34,145,124, 62,154, 75,190, 46, 43,186,206, 97, 94, 55,137, 49, 86,216,199, 48, 14,210,237, 88,
-192,145,193,190,111,232, 6, 47, 30,248, 78, 46,231, 18,203, 11, 8, 80, 38, 72, 7,220,121, 95,152, 1, 32,194,249,124, 46,171,
-192,125,223,181, 56,215,196,170, 20, 69, 55,160,107,128, 20, 19,254,252,167,255, 65, 85,227,169, 62,187,212,230, 13,228, 9,145,
- 30,158, 5,197,106, 0, 35, 19,141,204,128,216,182, 5,123, 8,229, 82, 54, 4,108,145, 75, 24, 79, 46, 42, 72,189,234,217,246,
-196,205,254, 59,135,152, 48,128,125, 23, 84,239, 30, 83, 25, 27,155, 36,214, 55, 67,226, 71,222, 98, 44,226, 78,102,161,209,101,
-178, 96, 42,124, 44,170, 35,247,148, 87, 49, 53,245,177, 29,195,203, 47, 55, 8, 12, 92,183, 93, 21,214, 17,169,247,106,237, 53,
-240, 62, 98,234, 59,124,188, 92,229, 60,167,234, 70,146, 66,163,250,225,179,117,214,220, 64,170,202, 37,170,180, 54, 16, 53,169,
-153, 84, 26,166,220,173, 23, 29,150, 10,251,242,222,220,105, 56, 75,205,132,160, 66,183,203,218, 33, 33,196, 37, 29,137, 55, 0,
- 49,147,155,217,212,188,126, 91, 33, 61, 86,188,232,217,186, 38,246,181, 88,198,244,217,204,155,239, 3, 99, 12,200,119,122,198,
- 48,182,249,138,176, 45, 50, 85, 81,156,111,142, 75,205, 8,219,220,129, 67,221, 16, 89, 46, 40, 59,247, 88,138,183, 50, 93,224,
-140,242,210,105,102,224, 90,168,100, 59, 29,177,232,196,178, 62, 3, 74, 85,203,221, 57,183, 93,104, 74, 21, 34, 66, 77,124,102,
- 66, 25,179,100,155, 84,226, 31,140, 98, 43,151, 71, 74, 98, 69,184,145,115,171,232, 74,146,180,132,210, 73,133,242, 86, 18,180,
-168,185,111, 56, 41, 42,128, 52, 12, 69, 68, 40,150, 9,145,229,103,108,187,216,109, 92,215, 21,223,249,182,109,165, 58,246,206,
- 98, 94,163,232,197, 57,149,145, 85, 82,101,173,128, 32, 12, 14,177,116,168, 36, 61,210, 98,227,216, 14, 87,123, 91, 17,124,229,
-149,194, 45,250,149,240, 9,137, 9,220, 4,220,228, 91,187,196,248, 85,254,124,155,207, 90, 49,179,199, 88,216,255,223,255,181,
- 43, 23,170, 67,119,110,249, 4,205, 24,178, 22, 29,199,156,120,161, 36,229,176,133,234, 18,104,167, 52, 68, 56,250,224,179,199,
- 61, 11, 78, 81,244,117,197, 37,193,104,166, 62, 58, 58,244,106, 89,241,234, 45, 15,251,134,126, 24,224,172,195,245, 58, 99, 94,
- 22,252,242,203,223,224,110,232,241, 39, 63,249, 76, 46, 34, 0, 41, 69,120,107,112, 62,159, 96,191,127,130,177, 14,251,190,203,
- 72,122,185,226,243, 31,255, 33,126,254, 87,223,105,101, 47,214, 47,164, 4,178, 22,127,240, 39,255, 37,254,242, 63,254, 91,196,
-196,232, 44,138,119,248,186,238,232,172,218,154,188,216,175,174,251, 6,115, 93,244,123, 96, 48,175, 27, 58,111,209, 15,163, 88,
-138,172, 71, 76,162,142,206, 22, 49, 16,193, 58,177,123,205,235,162,170, 98,131,105,234,225,189, 28,190,243,188,128, 72, 46,255,
-243, 48, 10, 50,148,129,206,122, 37,142, 1,211, 52,136,104, 76,187,203,196, 9,203,178, 96,217, 54,220,223,221, 97, 91, 69,169,
-158,225, 22,167,113, 68,136, 1,151,235, 82, 88,244,114,184, 49,182,101, 17, 34, 91,140, 5,117,250,244,242, 34, 32, 21, 0,155,
-134,174, 12,195, 80,240,178,121, 61, 49, 24,161,233,145,177,152,151, 5, 96,198,117, 17, 66, 92,190, 70, 30, 31, 31,203, 42,131,
- 1,172,235, 2,239,122,165,187, 65, 98,105,195, 14,195, 70, 19,231, 58, 92, 46,151,162, 17, 25, 70,205,255, 6, 99,232,122,108,
-219, 86,196,115, 89, 29, 47,151,232,142,174,235,117,221, 98,224,188,199, 95,252,244,103, 18,220,129,234,237,174,157, 96, 45,170,
-179,234,186, 40,161,157,215,184, 77,104,119, 21,176,169,128,216, 24,131,117,143, 50, 66, 85, 81,240, 22, 83, 77, 79,203,207,181,
-170,235,161, 68, 51,163, 69, 67, 72,245,249, 54,134,176,134, 40,206, 3,237,220, 73,221, 71,137, 24, 33,164,166,216,231, 82, 32,
-196, 44,188,108, 38,110, 45,190, 83,154, 29, 85,168, 83, 73, 70, 62, 60,203, 89, 9,158,146,164,149,101,237, 84,239, 61,250,232,
- 48,168,197,145, 90, 44,118, 81,166,215,211,220,182, 65, 23, 45,205,173,201, 75,135, 90, 5,185,129,215,180,127,165,134,187,158,
- 11, 7,103,108,209, 85,212, 85,109,123,161, 75, 39,155, 97, 78,104, 68,131,108,164,160,162,132, 27,109, 1,149,162,202, 88,139,
- 97, 24,240,238,221, 91, 81,187,159,207, 50, 5, 84, 81,166,136, 23, 83,225,249, 51, 3,198,249,114, 22,165, 20,228, 28,212, 20,
-172, 76,182, 19, 2, 31,107,140,172,174,154,213,238,150, 5,131, 41, 99,106,153,133,233,160,205, 16,115,130,104,241,162, 54,214,
-210,172,214,112, 29,148,220, 1, 52,105, 31,174,126, 9,242, 46,134, 11,209,171,160,250, 32, 95, 74,210,191,242, 77,202, 14,171,
-120,130,154, 24,210, 35,199, 61,213, 49, 87,179, 39,201,166, 47, 50,226,247,204,197,185,209,139,157,180, 99,207,223,147, 2, 13,
- 41, 76, 92, 66,103,101,172, 37,194, 19, 86, 57,191,252,255,214,123, 56,231,240, 95,252,217, 63,195,127,248,247,127,161, 34,164,
-132,206,139,157,168,235, 28, 76,115, 57,178, 34, 29,203,151,189,217,239,211,205,126,253, 22,103,123,168,103, 50, 17,141,203, 80,
- 94, 11,130, 58,108, 42,102, 53, 13,129,169, 5, 3, 55,235, 18,174,225, 46,124,116, 6, 80, 9,193,107, 33,255,116,144,218, 19,
- 90,148,227,177, 0, 33,224,200,112,207,151, 54,253,208,214,191,238,244,179, 31, 54,131,101,242,196,198, 52,221,255,167,172,223,
- 58,233,224,134,130, 85,153,186, 50,162,167,140, 32, 46,217,238,245, 0, 51,106, 27,154,215, 13, 33,236,152,198, 1,215,235, 5,
-227, 48,226, 23, 95,126, 9,239, 28, 62,127,247, 14, 95, 60,222,163,235, 59,188,188,188,160,239,122, 61,224,163, 28,236,206, 35,
-197, 93, 30,192,148,224,125,143,126, 58,137,133,196, 88, 21, 70, 18,146,250,217,191,253,250,215, 34, 2, 91, 5,104,228, 12, 97,
- 11, 12,107, 2, 0, 11,231, 60, 44,203,118,244,225, 52, 97,156, 38,124,246,254, 45,172,115,120,126,126,198, 60,139,232,168,115,
- 22,195,120,130,247, 86, 2, 36, 20, 28,115,189, 94,209,117, 61,140,113,186,251,223,176,199,128,209, 91, 17,203, 45, 51, 18, 3,
-167,161,199, 64, 61,214, 77,160, 49,222, 0,219, 30,145, 0,140,195,132,125,219,113, 93,132,142,215, 57,135,121, 77, 88,214, 5,
-222,121,241,119,199,128,190,235,225,157, 4,159, 48, 39,172,151, 80,160, 48,219,182,227,117,121,193,121, 28,139, 16,168,239, 58,
-116,189, 36,157, 57,235,144,144,224,157,136,224,214,117, 5,136, 17,246,132,157, 3, 46,151,171,210,234, 8,243,186,105,186,161,
-116, 94, 70,199,220,227, 56,160,239,123, 88,235,196,234,100, 13,194,190,149,176, 24,163, 44,128,204, 27,112,206,149,159, 37,172,
-128, 84, 38, 47,210,129, 75,113, 70,186, 55,142, 57, 28,136, 80,246,234,121,170,231,156,195,191,253,233,207,176,228,105, 69,217,
-157, 27, 69, 90,152, 67,172,130, 41,162, 41, 87,163, 98,227,142, 61,213,152,215, 92,188, 7, 93, 7,154, 44, 41,213, 54, 58, 22,
-163,148, 80, 9,179,133,177,164, 83,230, 72, 87,212,241, 29, 51,149,149,132, 81,110, 64,190, 60, 83,168,172,247, 92, 32,100, 27,
- 27, 55, 82,100, 99,140,126,198,249,153,205, 77,149,184,130,138, 24, 87,159,195,148, 82, 45,104, 20,195,157,152, 64,219, 94,158,
-241,206, 57,141,131, 38, 93,151, 53,231,134, 90,199, 68,213,126, 92,155,214,243,191,238,197,243,251, 43, 9,174,109, 87,142,131,
-173,149, 90,144,140, 10,230, 72,115,212, 91, 47, 16, 39, 46,161, 39, 41, 69,157,142,180, 10, 96,109,152, 56,171,224,179,125,171,
-254,207, 90,139,105,156,240,246,237, 3,206,119,103,156, 79, 83,105, 98,140,213, 48, 33,142,101,210, 42,234,118, 13,183, 77,177,
-230, 22,232,107,203,250, 47,110, 92, 60, 53, 67, 0,205,218,154,138,207,156, 72,196,176,100,244, 51,210,140,247,226, 40,144,222,
- 87, 62, 47,174, 18,230,204,138, 48,156,202,245,238, 82,189,189, 85,249,220,194,102,248,144, 24, 83,147,182,210,193, 74,197, 45,
-170,156,110, 5, 91,138, 12, 84, 91,129, 57,146, 82, 11,189, 76, 88, 6, 92, 98, 94,107, 20,106,245,133, 37,229, 22, 59, 91,145,
-136, 65,197, 35,134,129, 0, 70, 12,242,218, 67, 2,124, 55,192,247, 3,254,233, 63,255, 23,248,233,159,255, 27,165, 85,201,168,
-108,217,163, 48,187,117, 20, 19,243,155,167,221, 9, 55, 81,169, 21,206, 1,207, 8, 66, 0, 0, 31, 18, 73, 68, 65, 84, 83,175,
-228, 12, 80,160,223,177, 33, 47,176, 22,131, 31,228,231,213,132,153,102, 44,223,242,220,233,144,116,138,102, 83, 86, 99, 87, 81,
-133, 60,213, 74,118,188, 74, 75, 44,108, 67,151,107,187,243,246, 87,211, 15, 94,198,181,248, 56, 70,204,102,228,133, 24,214,184,
-101, 29,128, 15, 56,161,124,102,230,104, 85,131,106,244,175,126,122, 42,197, 80, 30, 23,230,200, 87,161,137,201,151,127,143, 1,
-167, 97,146,184, 76, 43,162,153,135,187, 59, 73,226,138,223,224,235, 15, 31,241,197,219, 71, 9, 35, 9, 17,195, 56, 2,203, 6,
- 80,196,232, 45,158, 47, 75,241,154,126,245,213,175,240,230,221,143,139, 54,209,105, 32, 13, 89, 3,195,140,249,242, 36,145,148,
-219, 43, 82, 76,216,148,204, 70, 96,244, 93,143,161,243, 18,184,226,140,226,145, 19,158,158, 94,208,247, 30, 67, 63, 96,221, 86,
-133,168, 4,172,235,130,152,188,116,143,138,242,188,191,127, 68, 74, 65, 46,240,109,195, 30,119,124,241,197,143, 4,162,178,110,
- 56,223, 61, 96, 15, 81, 64, 42,104,193, 65, 14,140,136,206,146,132,178,120, 91,226, 75, 95, 46, 51, 58, 47,228, 41, 71,178, 23,
- 31,250, 14, 33, 6,244,125, 15, 38,131,215,151,103, 81,198,159, 79,248,248,244,132, 61,136,160,205, 25,131,192, 22,235,182,192,
- 91,139,167,231, 23,156,207,103,156, 79,167,242,158,229,227,244,114,157,165, 3, 79, 9,167,105, 44,197,215,216,123,172,219,142,
- 85,115,162, 9,194, 70, 95,150, 69, 2, 87,166, 19, 98, 20,136,134,115, 22,227, 56,214,206,159,128,113, 28,203,202,109,221, 86,
- 44,203,138, 24,165, 0,233,124,135,160,140,121,129,144,152,146, 40, 54,244, 3, 66,144,176,152,160, 69,140,243,146,148,246,211,
-191,250,107,172, 10,106, 49,138,110, 45, 97, 39, 55, 93,161, 83,244, 40, 52,217, 76,198,165,161,100, 21,100,115,166,205, 29,158,
- 66, 78,146, 78,230,168,132,236,112,225,156,147,145, 98,174,245,101,179,254,243, 34, 60,212, 75, 95,238,105, 3, 86,144,137,160,
- 63, 21,188, 85, 45, 72, 5,222,146, 26,234,103, 22, 41,138,162,187,133, 66,213,194,161, 77, 35,203,141,218,141,178, 22, 9,192,
- 22, 18,136, 52,125,111, 19, 1, 93,231, 44,150,180, 23,181,119,228,132, 94, 47,179, 84, 38, 17,181,232, 41,244,182,102, 12,111,
-168, 17,196,181, 41,148,205,186, 45, 95, 78,217, 39,110, 26,230, 59,105, 94,134, 40,252,213,171,175,130, 56, 46,233,107,106, 79,
-164,230,250,207,197, 75,179,254,200,152,218,243,249,132,135,251,123,156,207, 19, 78,211, 36,223,135, 4, 36,142,170,170,183,136,
- 1, 5,252,195,166, 82, 57,147, 6, 3, 25,103, 21, 48,147,138,144, 49,243,248, 73,163,111,141,211,220,243,176, 87, 58,186,134,
- 72,177, 22, 30,153,118,136,227, 82, 90,254, 91,204,117, 37,106,106,204,183,105,222,123, 6,224,114, 85,147, 82, 53, 70,112,170,
-224,153, 18,197,209,168,213,137, 53,213, 44,239, 86,213,166,129, 28,248, 82,246,168,117,156, 92,118, 46,141, 5, 75, 53, 84,149,
-159,206, 77,196, 94,249,204, 77, 65,207,108,235, 94,170, 47,107, 85, 36, 21, 19, 58,239, 0, 11,120, 24,132, 32,202, 94,178, 14,
-253,120, 66, 63, 78,248, 63,254,247,255,173,238,201,152,177, 51, 43,208,129,203, 56, 51, 95,208, 18, 20,224, 10,250,241,182,219,
- 68,147,251, 75,191,107,230,221, 96, 83,139,198,128,110, 46,244,230, 61, 74, 21,244,168,117, 13, 29,187,241, 92, 32,229,202, 92,
-211,244,242,195,146, 88, 47,214,131,230,190,197,217, 82,209, 2,148,135,200, 84, 58,221,173, 10,245,214,222,152,242,202, 33,179,
-219, 27,149, 45, 39, 70,178, 57,198, 85,138, 54,250, 36,122,166, 22, 66,109,132,239, 81,111,223,140, 68,111, 74,139, 61, 70,116,
-142,176, 94, 47, 56, 15, 29,190,249,240, 17,211,249, 12,171, 84,184,169,247,248,127,254,211,223, 32,110, 11,222,222,159,177,135,
-160,108,106, 86,154,149,240,207, 7,111,241,210,168,240,215,249, 21,215,203, 83,249,110,167, 40,130,168, 44, 96, 50,214, 96, 24,
- 79,120,122,185,168,183, 62, 32, 68,194,253,121,144, 80,150,121, 17, 23,197,158,112,238, 12, 98, 4, 76, 39,223,165, 61,132,114,
-240,159,239,238,203,106, 37,196, 36,221,168, 35,108,187, 20,199,203,186,128,140,208,219, 94, 95, 94, 68,176, 54,140,184, 92, 47,
-162,104, 15,162, 94,191,187,187, 23,122, 27,106,156,166,119, 14,190,115, 88,215,103,217,193, 90,139,144, 18,186,126, 64, 63, 12,
-184,155, 70, 24, 67, 88,214, 21, 33,236, 88,183, 13,125,223, 97, 93, 87,124,243,221, 7,133,184, 68, 24, 18, 16,205,188,110, 2,
-211,177, 22,159,127,246,153,128,103,214, 21,175, 87,233,198, 67, 12,146,101,175,164,175,243,249, 36,227,113, 21,133,109,251,142,
- 45,136, 8,168,115, 78, 99, 82,229, 18,158, 78, 39, 56,107,209,247, 30,251, 30, 48,207, 87, 25,201, 63, 60, 0, 32,108,219, 10,
-132, 32, 29,151,230,154,119,189,199,190, 19,166,105, 44, 88,101, 3,201,153,103,146,117,128,181, 14,235,182,105,106, 30, 97,236,
-188,248,202, 67,196,207,254,230,151,226, 23,215,209,126,182, 80, 81, 35,216,202,227, 82,103,189,140, 70,213, 26,148,195,134,136,
-220,161, 80, 55,250,220, 24, 83,119,241,217,102,196, 96, 5,100,213,148,195, 24,147, 80, 1,203,106,179,249,247, 58, 25,204, 23,
-130,165,154, 88,152, 95, 27,140, 90, 83, 97,138,157,148,218, 32,166,195,142,222, 22, 87,210, 97, 2,219,216,221,140, 54, 89,197,
- 77,211, 90,104,115,103, 15,198, 22, 19, 8, 1,243, 38, 97, 74,222, 89, 44,123,128,105,210, 20,161,239,167,117, 85,125,222,138,
-225, 36,244,172, 33,142,154, 6,220, 65, 45, 65, 52,223,130,242,123,108, 38,186,153,106, 91,206, 36,211,220,220,101, 49,156, 8,
-227,162, 94,164,124,104,128,154, 68,237, 34, 46, 43, 8, 47, 34,220,223,159,113,119, 62,225,116,154,112, 58,157,165,232, 83,171,
-152, 76,160, 13,194, 46,133, 99, 73,152,211,134, 50, 79, 46, 10,179, 37, 85,155,119,106, 70,228,229,175,170,127, 0, 71, 45, 96,
- 76, 21, 41,171,128,174, 93, 13, 84,132, 48,202,251, 88,162,186,155,137, 46,163, 21, 24, 2, 46,101,249,115,249,144,142, 97, 26,
- 92,192, 32, 92,128, 41, 92, 70,173,169, 8,219,228,135,235, 5,147, 95,108,131, 49,229, 50,150, 54, 5,183, 74, 77,151,137,198,
- 2,126, 68,159, 42, 79,150,228, 15,237, 77, 38, 22,169,158, 46, 11,119,138, 53, 12,136, 0,250,174,199,221,253, 3,190,253, 13,
-225,229,245, 73,196, 55,168, 65, 38,206, 16, 54, 37, 30,229,209, 19,114,145,208,185, 67,165,116, 16,149, 52,209,105, 84,116, 6,
-205,245,213,100,201,114,179,143,166, 6,150, 94, 60,254,249,131,203, 23, 93, 66,217,195,215,168, 88,110,134,233,220,180,238,212,
-212, 7, 85, 92,152, 63, 78,211,190, 98,250, 29,123,252, 3,184,160, 13,215,249, 52, 72,167, 88, 19,243,230,134,107, 0, 12,116,
-114, 96, 90,165,127,238,108,110,168,118,200,255,172,252, 25,171,152,168, 0,104,218, 43, 95,185,212,243,182, 99,236,122,252,246,
-219, 15,120,152, 6, 60, 61, 63,227, 60,141,120,157, 87,124,249,213,215,216,214, 5,255,224, 39,159,171,154, 88,148,170, 49,138,
-221,146, 99,192,208,117,152,198, 17,252,241,169,164, 55,197,148,240,221, 55, 95,138,215,152,160,196, 64, 5,127,232, 30,204,169,
-143, 20, 68, 24,198, 30, 32,139,176, 71,128,119, 33,160,245, 29, 24, 66,162,147,145,188,140,171, 55, 85,183, 62, 60, 62,162, 31,
- 70, 77, 32, 11,194, 16,167, 14, 33, 70,201, 19, 79,178, 87, 63, 77, 19,150, 69,198,241, 32,194,243,235, 51,238,207,247, 72, 49,
- 96, 89, 23,156,166, 9,251,190, 98,221, 2,222, 60, 60, 2, 96,188,190,190,168,175,120,135,243, 29, 58,146, 29,222,188, 44,240,
-206, 97,236, 28, 98,140,152,151, 13,214,245, 24,198, 17, 33, 70, 60,191,188,106,230,184,215,252, 10,131,203,124, 45, 69, 87,223,
-143,184,191,191,199,190, 73,196,235,188,109,101,143,234,172,197,148,173,101,206,226,229,229,165,196, 77, 70, 45,134, 88, 89,252,
-167,105, 40, 19,191, 97, 24,208, 26, 31,129, 4,239, 29,188,115, 24,186, 94, 83,214,228, 25, 93,230, 69, 68, 96,170,110, 63, 77,
- 83, 57,111,146,162, 82,103,157, 6,120,235,132, 47, 96, 12,162, 79,106, 21, 18,145,210, 95,254,237,175, 68, 83, 99, 44, 78,227,
- 25,159,189,127,123,240,131,103, 71, 72,198,195,198, 36,158,224,148, 12, 16, 67, 19, 48,226, 26, 38, 19,215,240,149, 6,158,117,
- 76, 18,195,225,124, 51,182, 57, 63, 18,127, 50,150,181,153,169, 79,212,132,142, 80, 89, 45, 24,102, 36, 52, 99, 89,237,216,147,
- 70,169,150,132, 72,109, 15,179,189, 44,198, 88,196,197,249, 0,202, 41,111, 89,137,157,211, 46,185, 48, 66,170, 11, 42, 38, 96,
- 69,130, 91, 55,112,231,213, 66,166, 24, 86,189, 12,114,225, 2,189,112,217,164, 2,232,104,157, 75, 69, 8,119, 48, 20,213,248,
-215,156, 99, 97, 85,103, 85, 25,238, 71,221, 81,158,108,164,134,176,151, 50,223,226, 48, 39,204, 1, 83,212,252,243,220,229, 10,
-134,245,225,254, 14,167,105,196,249,124,214,239, 39,151,137, 32,235, 56, 63,134, 80, 3,203, 74,206,123, 22, 61, 82, 61,207,152,
-139,237,173,164, 95,150, 59,178,158,129,164,194,196,124,166, 39, 69,239,230,247,239, 72, 44,107,177,165, 26,212,149, 27, 69,110,
-238, 10, 82,203,176, 54,173, 14, 69, 97,151,133, 94, 55,240,152,102,234, 87,189,109, 64,202,187,224,146, 6, 36,187,221,164,163,
- 14, 83,236, 14, 56,140, 98,179,127,207, 20,175, 20, 55,133, 1,129,217,192, 24,174,232, 68,237,230, 89,199, 69, 22,212,140,171,
-229,129,204,100,167,252,243, 35, 8,190, 31,113, 58,223,131,163,124, 40, 57, 29,170, 38,159, 81,121, 72, 80, 72,105,242, 26, 69,
-100,101, 10,210,182, 90,215,154, 38, 51,255, 14,194, 81, 71,160, 62,248,131, 31, 15,124,116, 24,228,177, 89,251,225,165,155,112,
- 4,208,193,113, 94,190,170, 25,100,147, 10, 54,253,208, 82,231,202,142, 27, 75, 58,181,110, 55,166, 67, 5,121,164, 13,209, 39,
-227,247,106,171,227,114, 96, 1,233,112, 40,213, 46, 32,105, 14,114, 37, 16, 86,253, 36, 53, 8, 97,220, 4, 49, 51,142, 63,189,
- 30, 82,121, 99,232,213,234,247,230, 44,224,149,109, 93,113, 37,194,235,229, 2,195, 9,111,238,196,171,253,238,205,219,114,104,
- 25, 71,216,230, 43,186,190,195,124,157,209, 43, 41, 48,175, 25,172, 22, 16, 49, 69, 36,178, 7,154, 21,116, 7,183,239,171, 88,
-176,186,161,100,120,247, 67,143,206, 89,236, 81, 42,121,103, 25,123, 74, 24,144, 52,211,187,199,221,195, 27,132,176, 34, 37,224,
-187,239,191,215, 36, 57,136,176,203, 88,164,109,199,105, 58, 99, 89, 23,112,138,248,240,225, 59, 12,195, 40,151,242,188,160,115,
- 14, 79, 79, 31,224,252, 8,239, 61,182,109,215,206, 64, 59, 92,142,240,206,227,155,143,223, 32, 36, 8, 73,110,144,156,247,222,
-119, 5,141, 26, 56, 98, 26, 78,184,191,191,195,243,243, 19, 94, 95, 47, 66, 90,235, 58,217,117, 15, 35,214,109, 5, 72, 32, 45,
- 14, 6,251,186,225,227,199, 39, 12,157,199,124,189, 10,100,199,251, 34, 60,154,231, 89, 20,228, 26, 95,154, 18, 99, 24,122,204,
-171,224, 90, 67,148,144, 27,239,124,137,137,140, 12,108,235,138,238,124, 66, 84,192,141, 87,242, 27, 89, 81, 5, 67,187,153,196,
-170, 22, 14, 1,247,231,179, 80,225,116,215, 31,213,150,103,141,193, 52, 12,216,118, 97, 15, 12,253,160,221,178, 8,209,254,242,
-111,127, 13, 64,220, 6,167,233,140,127,253,175,255,165,176,223,213,119,106,116,244,189,173, 11,214,249,130,176,109, 48, 78,212,
-237, 32,194,182, 44,216,214, 89, 20,201, 89,112,197, 92,146,210,184,209,249,228,168,208, 50,215, 76,245,249,168,251, 94, 41, 70,
- 24, 50, 46,142,186, 54,136,121,116,156,244, 34,141,114,145,228,253, 54,145, 45, 58, 22,209, 51,201, 26,140,179,247,253,112, 54,
- 49, 96,185, 4,211,216,204, 77,103, 42, 98,189, 10,130,225, 34,158, 19,235,106,157,192,165,188,250, 76, 50,197, 92, 67, 44,183,
-113, 38,226, 25,146,132,185, 2,212, 34, 66,164,170, 24, 38,106,211, 64,142,235, 68,202,175,181,153,202,230, 75, 49, 49,212, 74,
-152, 10,179,131, 27,195, 76,158,160, 36,101, 45, 20, 91, 87,126,143,228,162,104, 48, 95, 92, 26,140,252, 66,198, 97,196,221,221,
- 25,211, 56,225,124,119, 70,223,139,130, 61, 42,112, 71,238,133,154, 79,144,125,189, 92, 62, 39, 21,222,101,119, 79,203, 14,105,
- 99,176,185,238,203,141,105, 26, 65,157, 52,212,245,182, 22,129,135,254, 58,239,203,179,195,137,245,123, 88, 93, 70, 6, 57,215,
-252, 56,163,117,169, 81,127, 19,227, 96, 63,251,100,170,156, 36, 8,128, 20, 47,150,178, 2,190,189,196,178,239,188, 0, 28,232,
-208, 19, 26, 21,197,193, 52, 2,173,194, 95,215,139, 79, 71,223,121,196,147,242, 8,167, 73, 51,203,168, 90,178,132,200,154,208,
- 86,210,216,128,126,156,208,245, 3,182,249,162, 76,248, 92,141, 2, 73,131, 25, 72,119,181,156,211,147,244,245, 12,189, 23,132,
-169,242, 27,152,248, 38, 41,173, 73, 82,205,100, 54,237,198,211,205, 27,124, 96,175, 55,200, 87,106,110,226, 34, 56,212,142,189,
- 28, 16,196,135,152, 87,202,255,141,118, 50, 64, 53, 49,175, 88, 13,193,213,123,107,142, 14,183, 6, 23,223,216, 9,235,191,224,
- 6, 32,147,187,124, 58,112,153,169, 68,214,102,117,112,107,196, 43,123,114,115,187,181,168, 12,130, 67, 49,212, 44, 11,202,207,
-206, 2,159, 66, 33,180,184, 46, 11,222, 79, 30,215,109,199,155,251, 19, 66,136, 26,238,209,225,250,244, 2,196, 25, 95, 45,155,
-160, 85,251, 65, 15, 32,198,186,111,101,223, 57,140, 35,188,115,216,131, 90, 71,172,208,208,176,239,101, 98,144,149,250, 25,113,
-186,239,226,211,126,190, 92,225,116,175, 43,193, 25,226, 41,157,151, 25,222, 89,188,185,191,199,233,124,134,243, 22, 47,215, 25,
-221,190, 75,190,185,181,184, 63, 77,184,206, 87, 76,195, 0,168, 72,204, 90,139,121,153, 49, 12,163,176,208, 83, 68, 8, 17,207,
-207, 79,120,184,127, 68,140, 1,157,239, 48, 78, 61,150,121,150,177,122,140,248,236,221,123, 92,231, 43, 98,100, 60,191, 60, 33,
- 36,224,225,124, 6, 25, 33,229, 69,205,109,207, 34, 50,231, 28, 98,220,241,252,252,132,203,229, 82, 44, 94,155,230,152,131, 19,
-238,166,147, 8, 77,247, 13,219,182, 98, 75,140, 24,118,204, 73, 86, 91, 33,238,216,230, 80,166, 82, 91,136,136, 41, 98,234, 58,
- 24,245,144,239,251, 46,182, 43, 16,222,220,223,201,251,170,116,198,152,132,113, 29, 53,183, 28, 32,144, 23, 60,237,186,174,194,
-112,119, 30, 49,136,176,208,104, 39, 51,244, 61,144, 61,250,170,178,239,135, 81, 38, 28, 42,102,179, 78,210,208,146,194, 90,158,
- 47, 87,124,249,237,147, 4,214,116, 61,166,243, 61,254,251,255,238,159, 23, 74, 89, 17,178,133, 29,235,114,197,190, 46, 72,251,
- 94, 2, 65, 12, 73, 22,189,165,132,113, 24, 74, 58, 88,158,214,148, 14,154,204, 15,235,105,202,161,156, 84, 19,146, 10, 12,134,
-155, 60, 6,153, 8,136,245, 41,239,131,147,210,232,114, 17,192,133, 52,151, 10, 84, 43,177, 92,102, 73, 45,123, 81,109, 80, 81,
-127,111,216,133,211, 47, 88,215,116, 32,208, 65, 29, 14,173, 42,205, 57, 87,132,206,117, 76, 74, 53,139, 66, 69,199, 8, 17, 54,
- 7,147, 52,207,115,140,226,124, 48,104, 98, 67, 53, 78, 58, 71,208,114, 70,199,222, 32,196,169,109, 24,145,100,215,156, 18,216,
- 74,126, 67, 50, 0,113,147, 44,169,148, 56,110, 46, 93,106,162,169,185,100,123,100,190,123, 37, 83, 18,100,253,114, 58, 77,184,
-187, 59, 99, 28, 39, 76,211, 8,231, 68, 35, 35,159, 65,210,208, 26, 41, 90,172,174,107, 4,214, 20,170, 70,129,147, 78, 80, 69,
-127,147,199,222,165, 59, 79,169,100, 75, 80, 14,150,201,103,103, 99, 15, 47,241,215,124,140, 37,175, 65, 89, 84,245, 69,249,114,
- 55, 71, 81, 97, 9,247, 42, 74,110,130, 75,137,111,222,232, 99,252,106, 70,195,150, 8,209,124,153,235, 14,132,155,170, 21, 13,
-107,156,155,145,123,241, 88, 55,194,179, 44, 12,104,129, 39, 69,253,173, 21,144,105,168, 75, 48, 4,167,255,204,144,168, 75, 83,
- 2, 44, 51,130, 64,184,244, 75, 36,255,108, 28,207, 8, 33, 96,219,150, 34,216,201,130,184,172,248, 55, 5, 56, 83,227, 71,141,
- 42,136,169,181, 95, 53,251, 95,106,175,228,146, 76,214,140,145,112, 16,180,214, 98, 6, 55, 64,233, 38, 54,177,221,105,151, 2,
- 1,181, 88, 96,220,128,101, 18, 14, 73,245,100, 18,110,234,226, 34,166,177, 69,151,222,188,190,219,194,162,253, 35, 53,136,224,
-210, 89,163, 82,253,184, 73,123, 43, 92,249,198, 39,223,186,226, 12, 29, 61,249, 69, 60,168,144,157,131,206,128,154, 62,157, 36,
-210,182, 21,250, 36, 38, 60, 45, 59,222,158, 71,124,253,241, 21, 29,201,248, 22, 25,169,186,239,248,226,205, 35,186,206, 99,240,
- 30,235,190, 97, 95,247,178,171,218, 66,194,182,173,184,159, 38,124,247,252,162,129, 14, 12, 52, 15,171, 51,245,195,203,202,233,
-190, 31, 48,140, 14,215,101, 69,231, 60,198,206, 97, 13, 17,222, 36,236, 33,194, 26,134,115, 3,158,175, 51, 96,128,119,239,222,
-227,205,253, 35,230,121,198, 52,201, 78,254,235,111,191,198,208,245,248,254,195, 71, 88, 3,244,189,116,223,243,124,197, 55,223,
-126,141,251,187, 7,220,157,207,216,211,134,183,111,223,130, 96, 5,178,227, 13,174,215, 11,150,101,193,195,253, 3,246,176,225,
-229,114, 5,167, 8, 99, 44,238,238,238, 48, 12,187,106, 29,212, 3,155, 34,182, 53,192,121, 81,170,115, 74,136,208, 28,110,223,
- 9,114, 18,140,117, 94,117, 68, 27, 16, 82,194,249, 36, 29, 52,169,204,150, 89,139, 32,239, 49,175,146, 74, 21, 82,230,151, 27,
- 60,222, 11, 58,115,213,236,244,172,142,238,123,177,227,101, 26,216,188,108,165,251, 25, 7,225, 70,120,239, 97, 20, 87,155, 11,
-202,190,239,241,178,111,205,232, 18,101,138, 34,130, 36, 46,138,248,174,235, 84,181,109,225,141,145,130,194, 27,124,253,225, 9,
-223,191,204, 0, 25, 12,227,132,183,239,223,227,191,250,167,127,170, 5,164,129,194, 47, 36,104,101, 93,176,175,179,118,254, 50,
-242, 77, 41, 34,174, 77,119, 85, 2, 69, 90, 31,117, 62, 72, 83,133, 61,115,235,171,110,226, 67, 73, 87,135, 41,137,125,182,209,
-135,101,212,169,179, 6, 72,174,185,240, 83, 25,177,139,168, 43, 53,107, 80,174,171, 66,189,232,243,232, 57, 54,221,127,142, 20,
- 77, 77, 71, 24, 53,148, 71,206,196,189, 4,226,196, 24,193,197,187,142, 34,136,164,146, 42, 39, 63, 47,234, 89, 71,198, 20,199,
-144,120,176, 3,194,110, 96,108,106,194, 56,249,216,252,128,144,148, 27,157, 3,175,218,222,132, 33,175, 47,236, 59,156, 77,226,
-240, 96,125,223,178,240, 45,175, 10,178, 93, 77,139, 28, 38, 58,228, 98,180, 77, 72,177,211, 90,131,211, 56,226,116, 62,227, 52,
- 77, 24,198, 65, 32,100, 86,115, 60, 82, 77,153, 36, 83,243,207,203, 57,172,200,224,156, 61, 95,167,213, 26, 19,174,250, 15,197,
-104,214, 27, 90,161, 75,197,218,215, 98,176,181, 64, 78,229, 44,229, 38, 28, 53, 39,213,165, 98,165, 38, 6,184, 9, 9, 99, 52,
-160, 47,213, 94,136,219, 68,133,114,252, 3, 22,166,118, 12, 92,194, 89,242,126,183, 8,203,234,238,247,208, 13, 38,169,214, 12,
- 25,189,248,143, 43, 93,163,185,218, 98,179, 48,229,139, 83, 2, 69, 83,106,124,207, 53,100,166,211, 41,129, 81,101, 35, 57,139,
- 45, 68, 24,141,165,203, 86,171, 4,160, 27, 39,124,252,254, 27,173,100,185,208,205,162,126, 33, 50,127, 25,168,225, 26, 80,113,
-134,181,166, 25, 47, 31, 36,232,229, 2, 71, 27, 65,202, 73, 55, 8,141, 47,189,245,234, 39, 32,153,132, 82,116, 53,136,213,186,
- 87,175,146,135,164, 84,191,226,255, 71,203,157,111,246,222,233,232,245,172, 69, 72, 14, 87, 48, 85, 31, 65,109,210, 27,181, 73,
-177,109, 42,174,214, 12,121,239, 77,135,194, 68, 88,239, 45,251, 56,231,165,215,221, 4, 19, 29, 11, 4,194, 33, 36,134,155, 66,
-230, 80,248, 28, 88,242,116,128,225,136,207,216,193,242,174,201, 79, 9,123, 98, 60, 95,174,248,234,219,239,225,140, 81,102,129,
-193, 60, 47,216, 66, 64,239,156, 68,149,190, 94, 16,173, 81, 70,188, 45,211,149,236, 26,176,100, 64, 22, 37, 44,195, 20, 43,161,
-252,121,247,109,193, 23, 63,254, 99,124,245,245,215, 24, 58, 25, 25, 51, 51,130,113,146, 49,238, 28,188,101,188,125,184,131,113,
- 30,142, 12,214,101,193,203,203, 11,186,206,225,195,199,103,225,177, 51,224,156,193,243,243, 11,158, 95, 47,248,252,139, 47, 0,
- 0,119,167, 59, 12,157, 88,240, 78,231, 51,182, 93, 58,200,138,193, 37, 12,253,136,196, 44, 86, 47, 11, 44,123,192,101,222,225,
- 44,193, 57,143,215,101, 70,239,133, 51, 63, 47,139, 92,172,234,135,151, 64, 23, 25,197,103,100,174,176,214, 71, 60, 63,191, 40,
- 58,214, 23,157,129,164,197,117, 96, 85,184,131, 22,249,189,206,226,126,154,176,135, 36, 0,157,174, 71,140, 59, 78, 99, 47,132,
- 71, 39, 94,241,190, 31,176,237, 91, 1,123, 24, 99, 17,195, 94, 64, 65, 98,255,233,225,140,197,235,117, 70,136, 17,119,227,136,
-101,153,229,188, 48,172,240, 25, 25, 63, 59,231, 16,246, 29,227, 56,104,158,186,144,239,246,109, 7, 16, 75,186,218, 47,190,252,
- 90,190,175,198,226,116, 58,227, 31,254,163,127,136, 63,250,227, 63,168,106,108,147, 9,103, 6, 91, 92, 17,194,170, 58, 8,148,
- 29, 46,154, 28,109, 20, 65,167,169,130,224,130, 51,174, 90,151, 2, 76, 57,172,215,184, 81, 44,231,174, 59,199, 15,215,115,180,
-228,110,232,101,142,200,135,121,160, 76,161,169, 73, 70,228,242, 60, 37, 54,176, 36,235,146, 4,192, 23, 34,232,193,202, 82,138,
-232,196, 50,234, 15, 33, 8, 40, 40, 6,237,226,133,239,254,122,157,113,189,206, 18, 2,164,127, 22, 91, 26,141, 84,120,242,100,
- 12,168,189,212, 83, 66,140,123,181,222, 53, 34,189,234, 80, 51,135,169,108,193,217,114,205,254,200,107, 7,249,229, 17, 73,189,
-220, 54,199,153, 2, 72, 17, 5, 40,147, 9,160, 68, 77, 50,104,179,131, 78, 42,166, 28,199, 30,211,116,194, 52,141,232,251, 94,
-200,131,106,229,204, 60, 10,178,212, 36, 88, 82,249,188,192, 45,153, 46, 85, 36,119,139,231, 78, 21, 72,147, 11, 71,163, 57, 36,
- 38, 39,251,105,246, 69, 74, 73, 21,233,173, 51,129, 15,179,202,118, 71, 65,173, 96,186, 48, 85,168,252,153, 15, 45, 90,115, 78,
- 87, 75,219, 45, 1,156,240,201,222, 53,223, 99,133,161,123,155, 31,214, 36,173,101, 49, 3,233,152, 74, 70,119,117, 68,208,138,
- 84,242,129,210,254,225,152,101, 76,158,187,209,160, 80, 6, 82, 65, 86,254, 2, 5, 16, 58, 69, 36, 18, 1,206, 17, 98, 4,250,
-105,194,215,191,249,149, 96, 16,141, 64, 4,152, 80,210,143,114,186, 18,183,157, 59, 9, 95,247,160,210,191,221, 61,255,208, 14,
- 90, 31, 62,220, 54,159, 92,147,211,168, 85,153, 31,242,209,155,111,127,106,184,247, 13, 3,192, 28,160, 49, 5,240,118,204,243,
-229,163,255,156, 74,117,101, 74, 84,108, 45, 95,233, 72,241, 69,219,121,215, 12,117,131,163, 38, 34, 63,216, 38, 91,128,184,177,
-175, 81,237, 52, 76,166,202, 48, 29, 64, 52,169,104,235,168,166,192, 29,214, 1, 37, 15, 79, 39,240,242, 25,223,223,159,240,253,
-183, 11,146,113, 66, 89,131,196,154,130, 32, 65, 45, 41,226,195,101,199,203,245,138,199,251, 59, 32, 49,182, 16,241,253,211,139,
-136,197,152,225,201, 96,217, 54, 76,195, 0,198, 19, 72,253, 2, 2,150,136, 13,228,174,218, 23,101, 20, 27,165,179, 36,150, 11,
-205,202,161,242,102,236,113,133,184, 44, 4,245, 26,209, 91,241,132,191,123,124,131,174,239,241,241,227,135,178,199, 93,150, 25,
- 97,223,132, 82, 5,224,229,227, 71,196, 40,172,132,151,215, 23,196, 16, 21,121,218, 99,232, 59,204,243, 21,206,121,140,195,136,
-125,223, 48,207, 87,244, 93, 7,211, 13,232, 7, 25,223,191, 92,102,204,243, 11,134, 65, 8,107,151, 57,160,243, 61, 12, 89, 92,
-174, 87,204,235,138,135,251, 59,116,125,143,235,117, 6,115, 66,231, 28,190,251,230, 43, 12,195,136,211,105, 66,116, 14, 86,139,
-141,160, 59,210,117, 93, 37,247,125,232,177,204, 11,134,161,211,231,214,160,239,125, 89, 91, 25, 34, 56,239, 48,142,163, 64, 87,
-182,173, 48, 1,122,141, 75,221,247, 13, 93,215,233,190,146,133,207,207,172,123,124, 96, 58, 77, 58,174,148,175, 66,231, 59, 24,
-107, 68,255, 18,165,179, 52,106, 11,204,158,243, 77,109,109,196,140,203,178,226,171,143,146, 29,239,188, 71, 55, 76,248, 87,255,
-234,191, 69,215, 75, 40,140,209, 81, 57,235,103, 29,195,142, 24, 54,181,118, 25,141, 42,181, 26, 28, 98, 75, 54, 68,217,229, 54,
- 54,173,164, 5, 59, 35, 53, 87,114, 51, 51,107,189,201,121, 21,169, 96,173,140,201,109,215,113,249,204, 44,204,114, 62, 30,234,
- 7,103, 72,163,137,169, 74,232, 58,186,206,123,227, 79,204,168,186,162, 76, 48,240, 22, 96,223, 21,218,156,136, 73, 69, 88,233,
-172,195,208,247,184, 92, 46,152, 53,138, 54,231,131, 71,212, 61,184,105, 32, 88,116, 72,227,140,106,235, 44, 72,205,106,183, 51,
-169, 62,211,220,118,243, 92, 58,245,140,118, 37,157, 6, 9,172, 69, 49,226,205,253, 20, 82, 27, 38,211, 30,118,185, 73, 18,145,
-102, 55,116,152,198, 9,125,223,193,251, 14, 67, 47, 84, 70,175,206,136,252, 89, 23,141, 1, 26, 10,160, 22, 50, 73, 87, 8,172,
- 23,113,105,102, 96, 42,244,134,184,161,230,153,218, 44,149, 60,149,218,176, 74,243,151,157, 79,183, 7, 56,234, 90,178, 81,138,
-103,250, 94,227, 13, 44,119, 5, 27, 61,163, 19,192,166,126, 38,142, 63,185,212,219,188,108,194, 77,152,182,118,145, 71,144, 74,
-245, 78,183,163,218, 86, 96, 85, 35,215,228, 80, 79, 37,228, 37,179, 2,200,164,195,133, 36, 76,143, 74, 54,139, 49,192,102,214,
-121,254,198,167, 4,219, 59,236,161, 38,152,177,122, 58,189,235,240,244,221, 87,170, 18,149, 89,176, 88, 70,160,222,244, 28,180,
-118,196, 24,186, 12,104,200, 21, 86,202,128,156,166, 34,167, 74,101, 67,195,253,253,161, 45, 27, 55,190, 13,110, 48,169,124, 99,
-233,162,188, 40,105, 4,143,148,184, 92,156,121,111, 82, 30, 92,226,195, 28,165,157,116,151,169,129, 57, 86,116,212,250,237, 42,
-230, 77, 69, 25,230,104, 87,253, 29,118,245, 92,164,136,106,150, 63,249,181,159,160,255,111,237,238,135,127,220,116,229,204, 37,
-246,165,208,244,117, 76,119,119, 30,241,252,212, 1, 97,198,170, 15,245,103,111, 31,241,229,215,223,224,139, 55,247,248,143,191,
-252, 74,209,190,114, 56,239, 49,130, 82,196,219,251,179, 36,138,177, 8,212,166,113,196, 30, 68,196,181,110, 59, 34,234,184,194,
- 84, 94,150,106, 57,184,216,172,126,251,229,223,225,241, 65, 70,234, 68, 22, 15,167, 9,175,243, 12,111, 29,140,115,232,188,197,
-249,116, 66, 2, 48, 77,247, 0, 25,124,247,253, 7, 12,189,199,186,172,240,190, 3, 57,194,229,122, 21,232,204,178,192,251, 14,
- 93,103,113,185,188,200,232,223,245,112,214, 98,232, 59,172,235, 44,162, 53,103,177,109,139,196,156, 2,120,189, 94,241,221,135,
- 39,188,125,124, 35, 10,115,103,113,217, 25,151,235,130,196,140,135,251, 71,112,218, 1, 36, 76,211,132,243,121,194,186,110,248,
-230,219,239, 50,185, 2, 32,131,211, 52,161, 27,122, 92,231, 89,158,233,141,241,242,242, 10,239, 4,199, 57, 78,131,112,196, 99,
-196,227,195,189, 10,134, 12,156,239,176,110, 27,214,117,145, 72, 88, 13,152,200, 10,232, 60,246,117,206, 73, 1, 14,104, 82, 93,
-237,212,134, 65,125,232,228, 96,173,195, 30, 54,144,245, 8, 49, 34, 6, 9, 12, 73, 33, 98, 24,196, 5,224,125,167, 98, 53, 25,
- 37,239,121,180,156, 18,126,243,221, 71, 44,187,144,242,250,113,196,227,219,119,248,111,254,217,159, 41, 39,220,169, 64,201,222,
- 28, 97, 92,198,171,100, 0, 67,174, 76, 20, 64,234,227,230,155, 51, 45,219, 74, 83,157,156,101, 13, 80,246,100, 31, 52,215,153,
-213,157,106,186, 98,166,115,230, 56, 4,232, 52, 50, 79, 53,243,227,159,184,105,144,138, 33,134,138,114,190,148,209, 68, 40,255,
-249, 60,254,252,129,211,231, 40,188,229,226,217,102,181,204, 89, 3,233, 98,187, 14,126, 89, 68, 28, 57,109,152,151, 21,219,182,
-105, 16,142, 45, 62,116,153,202, 80, 67,192,228,134, 2, 87, 27,130,146,184,153, 20, 42, 5, 46, 73,144,196,172, 1,147, 92,138,
- 39,166,170, 93, 40,175, 52, 49, 18,213,184,238, 98, 33,108,106,135, 66,151, 51, 6,125,231,209,119, 29,166,105,194, 48, 78,186,
- 10,114,240,153, 99,111,141, 94,224, 92, 32, 99,217,253, 69, 68,122,127, 9,131, 32, 54, 2, 54,206, 86,202, 28,242,197, 77, 81,
- 71,166, 8, 52,115,211, 40,171, 11,106, 48,174,181, 81, 61,222,154, 40, 83, 24,174,177, 33, 7, 54,138,244, 96, 13, 79,224,102,
- 13,155,202,197,158, 87, 17, 12,151,133, 35,212,180,151, 53,192,133, 63, 77, 27, 99, 46, 94,192,246, 50,105, 17,130,181,184, 76,
-250,125,206, 12,223, 6, 55, 90,222,180, 36,248, 18,110,131, 62, 26,210,152, 62, 48, 28,211,225,117, 36,107, 48,144,129, 5, 97,
- 7,171, 15,180,190,102,102,198,250,250,172, 85, 86, 42, 34, 19,226, 58, 73,232,189,197,182,199,242,223,181, 68,152,166,169, 60,
-184,220,142,116,210,113, 28,223,142,153, 11,132,167,233, 62,139,176, 91,149,126,101, 47,206,166, 73, 35,106,119,115,181, 52,207,
- 90,130,140,127,205, 59, 54, 82,142,124, 5,220,224,152, 87,223,200,244,164, 6,160,134,125,124, 8, 95,195,145,234, 75,159,224,
-241,126, 0, 46,167, 99, 37,170, 73,114,116,168,224,110,214, 21,133,153,123,112,202,113,139,141,188, 37,244,221, 40,240,243, 10,
- 65, 3,136, 97,173, 69,220, 3, 28, 49,254,254,155,111,145,246,136,191,159,197, 82,245,217,195, 25,145, 25,215, 69, 2, 64,214,
- 16,144,124, 77,108,234,189,199,117,158,225,157,195,221, 56, 97, 93, 63, 54, 56, 37,106, 48,191, 90,156,153,138, 69, 54,214,224,
-242,252, 44, 17,155,134,240,241,245,130,222, 81, 73,145,251,209, 23, 63,198,120,154, 68, 21,190,205,154, 28,103,149,203, 13,188,
-190,190, 96,143, 1,231,113,192,249,254, 1,206, 95, 96,173,195,211,243, 11,188,235,176,199, 0,230,136,105, 58, 99,158,103,172,
-187,196, 51,238, 33, 8,123,187,115, 88,150, 13,214,120,156, 39,143,231,151,139,166,215,109,136, 73, 34, 99,167,113, 68,138, 34,
- 50, 27,166, 17,206,202,174,121,217, 3,156, 33, 77, 91, 19, 47,186,181,132,235,199, 43, 98,130,116,235,251,142, 97,236,133,207,
-192, 12,239, 59,244, 58, 46,119, 58,133, 16, 94,250, 2, 75, 6,157,247,120,184,191,135,243, 94,152,234, 73, 56,232, 34,202, 75,
-229, 18,239,251, 30, 41,185,198,175, 29, 36, 36, 71, 15,185,148, 34, 58,223,107, 51,103, 65,185,168, 24,123, 13,102,146,113,247,
-190,111, 34,250, 98, 70, 72, 17,151,235,140,223,126,255,172,107, 36,135, 97, 58,225, 79,255,236,159,224,179,247,239, 84,252, 37,
-197, 93,177,122,106,104,120, 12, 59,246,109, 69, 12, 50,153, 17, 36,167,205,115, 36, 21, 95,241,113,178, 5, 62,160, 87, 77, 83,
-245,102, 59, 45, 84,208, 85, 20,239, 58,149, 40, 76,243, 50,110, 77, 53,100,165, 60,255,220,136,158,202,147, 95,186,189,131,207,
-185,193, 67,203,235,212,238, 17,166, 22,251,217,209, 83,220, 53, 58, 54,215,125, 64, 94,249,137, 69, 57,202,148, 20, 22,182, 51,
- 10, 74,138,240,126,197, 52, 72,225,187,172,171,252,117, 89,181,184,227, 28,118, 93,254,108,229,124, 81, 81,153,201,158,121,176,
-140,170,139,227,232, 32, 13,110,240,237, 36,121, 12,133,238,103,148, 21, 65, 69, 99, 67, 12, 21, 68,155, 82,148, 73,190,184,197,
-121, 26, 49,158, 70,140,227, 4,239,188, 76,108,244,130,207,169,118, 49,198,122,161,235,247, 51,103,153, 27,141, 85, 46,239, 17,
-231,240, 28,253,115, 26, 40,200, 72, 97, 71, 33,213,236,118, 97, 37,203,231, 82,214,188, 84,113,188,164, 43,203,122,115,225,184,
- 40,109, 52, 87,183, 46,129,155,184,236,214, 38, 78, 68,141, 38,161,229,200, 16, 92,254,226,148,156,244,163, 3,235,176,108,205,
-176,149, 3, 32,134,169,248,172,185, 17, 62,148,125, 81, 6,202, 20,244, 44,201,197,212, 78, 3,202, 24,254,216, 20, 38, 22,196,
-172,129, 65, 10, 59,114,120, 87, 72, 9, 29, 73,134,110,100,137, 41, 98,107, 64, 26,112, 0,227,196,246, 67, 22,137,131, 62, 12,
-234, 71, 85,112, 13,113,194, 30, 18,182, 24, 11, 77,142,200, 8,200,134,242, 7,196, 13, 61,173, 17, 13,222, 92,119,121,175,198,
-224, 31, 96,209, 72,144, 0,146, 62,248,134, 75,230,121, 21, 68,144, 50,237, 91,171,184, 94,209, 42, 78,201, 86,138,178, 95, 41,
- 21, 42,110, 12,230,233,134,189,124,243,146, 62,233,150,241,137,118,128, 75,234, 82,139,254, 43,196,253,170,154, 47, 22,185, 84,
-166, 9,141,235,177,153, 74, 16,114, 38, 83,161, 60,105,129, 83,187,127,210,245, 74,187,159,212,231,133,129,135,251, 19, 94,190,
- 95, 65,206, 97,112, 29,188,149,135,127, 89, 87,188, 57,245,216, 99,196, 72,157,218, 97,228, 66,142, 49,161,235,123,108,235,138,
-151,235, 21,247,119,103, 16, 8, 99,191, 23,184, 12,171,221, 49, 31, 85,198,136,131,130,149,201, 77, 12, 92, 47,175,184,187,127,
-196,247, 31,190,199, 30,118,220,157,206,136, 97, 71, 50,192,224, 58,188, 92, 94,241,244,244, 1,151,121,197,195,155,183,112, 36,
-234,236,105, 58,225,155, 15,207,232,141, 8,255,172,235,240,244,244,132,151,151, 23,156,239, 78, 24, 71,143,176, 71, 56,219,193,
- 90,135,109, 89,177,111, 43,206,211, 9,206,117,178,127,118, 6, 38, 68,113, 98, 88, 9, 78, 57, 77, 50,158,222,157,197,188,174,
-120,115,186, 71,136, 59,214,117,197,249, 52, 97, 91, 23, 44, 58,157, 72, 49,130, 92,135,126, 56, 97, 15, 9, 93,151,192,113, 71,
- 76,192, 48, 76,112,214,233, 14, 91, 2, 91, 0, 96, 24, 6, 25,115,111, 59,182,125,195,178, 73,110,251,208,119,112,157,193,221,
-116,130,247, 14,167,243, 25, 41, 37, 92, 46, 87,172,155,144,176,186,190, 23, 14,124,223, 99,219, 86, 24,146,180,180,231,167,143,
- 24,198, 81,253,225, 50,254,116,222, 23,204,167,248,212, 93, 65,143, 2, 34, 20,164, 20,209,211,128,249, 58,195,146,193,111,191,
-253, 30, 31, 47,179, 36,231,245, 3,166,243, 61,254,229,191,248,175, 75,231,149, 87,121,178,159, 23,126,124,216, 54, 65,210,238,
- 27,226,190,169,157,203,149, 29,121,241,123,183,221, 45, 83, 81,158,147, 94, 52,141, 10,166, 62,187, 69,217,206, 7,255,116,182,
-141,229, 21, 90, 22, 11,230, 21, 90, 25,211, 82,195, 93, 65,106, 28, 42,141,224, 46,229, 48, 39, 42,226, 99,163, 59,231,210,137,
-167,212,224, 98, 51, 68,172, 88,154,234,101,206, 71,132,107,158, 16,144, 22,205,214, 37,120,133, 12,141,123,144,184, 85, 0,203,
-178, 98,153, 23,204,203,130,117, 89, 75, 3, 37,103, 41,234,197, 77, 0,145, 92,200, 92,206, 80, 17,121,149,220,120,161, 85,201,
-123,108, 80,247,244,196,141,237,171, 49,181, 67,198,203, 45,102,186, 31,122,156, 78, 98,213,236,122, 41, 72, 51,149,208,123, 95,
-138,198,164,151,185, 85,204,172, 81,125, 14, 25, 91,156, 16,114,174,138,107,132, 72, 16, 5,156, 71,200, 44,162, 70,151,169,142,
-169, 78,166,140, 49,101, 93,154,184, 78, 94, 40,107,139, 82, 5,138, 29,214, 40, 55,119,135,249,129,104, 14,195,183, 35, 82, 58,
-124, 39,184,209, 71,181,238, 96, 67,140,255, 23,177, 72,216, 51, 12, 46,249,141, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+137, 80,
+ 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 1,245, 0, 0, 1, 26, 8, 6, 0, 0, 0, 8, 90,206, 70, 0,
+ 0, 10, 78,105, 67, 67, 80, 80,104,111,116,111,115,104,111,112, 32, 73, 67, 67, 32,112,114,111,102,105,108,101, 0, 0,120, 94,
+157,147,103, 84,147,103, 27,199,175,231,121,178, 7, 35, 9, 17,144,241,176,151, 76, 25, 1,100,134, 21, 1, 25, 34, 75, 20, 66,
+ 18, 32,140, 16, 67, 2, 14, 92,136,168, 64, 69, 81, 17,193,137, 84, 69, 44, 88,173,128,212,137, 40, 14,138,162,226,214,130, 20,
+ 17,181, 22,171,184,112,244, 3,231, 84,223,158,119,244,237,239,211,255, 92,227, 92,247, 53,110, 0, 70, 72,152, 84,150,139,106,
+ 0,228,200,148,138,232, 96,127, 60, 62, 33, 17, 39,247, 0, 10, 84, 32,129, 35,128, 80,148, 39, 15,159, 25, 20, 3, 0, 32, 8,
+228,227,121,209,193,254,240, 5, 4,224,245, 13, 64, 0, 0,174,217,134, 68,226, 56,252,127,104,138,228, 10, 37, 0, 18, 9, 0,
+ 83,197,146, 60, 17, 0, 82, 12, 0,217, 5, 74,185, 18, 0, 25, 5, 0, 78,106,150, 92, 9,128, 18, 0,128,163,136, 79, 72, 4,
+ 64,181, 1,128,147, 62,161,167, 0, 0, 39,117, 66,251, 2, 0, 71,156, 35, 19, 3,160, 49, 0, 32, 23,231,136,197, 0,104, 39,
+ 0,172,206, 87, 73,196, 0, 88, 24, 0,148,228, 75, 37, 5, 0,216,117, 0, 48,205, 86,229, 72, 1,176,183, 0,192,201,145, 8,
+243, 0, 8, 12, 0, 48, 85, 74, 68, 25, 0, 4, 7, 0, 96, 40, 98,162,249, 0,132,105, 0, 20, 70,250, 87, 58,245, 43,173,148,
+204, 87, 2, 0,240,115,229, 11, 20,210,244, 12, 37,110, 41,178,194, 29,221,221,121,120,136,164, 32, 91,162, 84,218, 70, 10, 69,
+ 89, 66,133, 24,231,231,230,200,133,178, 5, 0, 19, 61, 3, 0, 0, 43, 47, 58,216, 31, 23, 4,242, 93, 29,221, 93, 93,109,157,
+236, 28,191,204,233,191, 59,255, 38,241, 9,137,248,132,122, 25, 5, 8, 0, 32,220,238, 47,182,127, 23,151, 91, 7,192, 27, 3,
+192,214,125,177,165,110, 1,104, 93, 9,160,125,231,139,205,116, 39,128,122, 49, 64,203,229,175,250,225, 10, 2,249,120,134, 82,
+ 41,247,176,183, 47, 40, 40,176,147, 74, 68,118,162,140,175,234,252,207,128,191,193, 87,245,236, 4,129,124,252,207,241,224, 1,
+146, 52,161, 42, 91,137, 71, 7,251,227,162,220,236, 92,149, 2,207,147, 11, 69, 18,220,246,175, 71,252,143, 19,191,226,171,119,
+ 76,137,150,164, 73, 20, 18,153, 72,130,199, 74, 37, 5, 82, 89, 58,206,207,149,137,165, 74,105,174, 12,151,202,254,211, 18,255,
+ 97,218, 95,152,184,107, 0, 96,215,127, 2, 78,178, 29,104, 92,230, 0,246,107, 55, 16,216,116,192,146,182, 3, 0,242,231,222,
+194,168,177, 16, 9, 0,113,134,195, 19,119, 15, 0, 48,241,155,255, 21,180, 2, 0,208, 60,105, 58, 14, 0,192,143,142,193, 69,
+ 42, 69,254,132,143, 0, 0, 64, 4, 26,168, 3, 7,116,192, 0, 76,192, 18,108,193, 9,220,192, 19,124, 33, 16,166, 67, 4,196,
+ 64, 2,204, 5, 17,100, 64, 14, 40,160, 0, 10, 97, 57,148, 64, 25,172,131, 77, 80, 3, 59,160, 30, 26,160, 9, 14, 65, 43, 28,
+131,211,112, 14, 46,193, 21,232,131,187,208, 15, 67,240, 20, 70,225, 53,140, 35, 8, 66, 70,152, 8, 27,209, 65, 12, 17, 51,196,
+ 6,113, 66,120,136, 55, 18,136,132, 33,209, 72, 2,146,130,164, 35, 50, 68,133, 20, 34, 43,144, 50,164, 18,169, 65,118, 33, 13,
+200,247,200, 81,228, 52,114, 1,233, 69,110, 35, 3,200, 8,242, 59,242, 30,197, 80, 6,202, 65,245, 81,115,212, 30,229,161,126,
+104, 40, 26,131,206, 65,211,209,121,232, 66,180, 24, 93,139, 86,163,117,232, 1,180, 5, 61,141, 94, 66,251,208,126,244, 41, 58,
+134, 1, 70,199,184,152, 17,102,139,241, 48, 62, 22,129, 37, 98,105,152, 2, 91,130,149, 98, 85, 88, 29,214,132,181, 99, 93,216,
+ 53,172, 31,123,134,189, 35,144, 8,108, 2, 78,176, 37,120, 18, 66, 8,179, 8, 34,194, 60,194, 18, 66, 57,161,134,176,143,208,
+ 66,232, 36, 92, 35, 12, 16, 70, 9,159,136, 76,162, 30,209,134,232, 65, 20, 16,227,137,233,196, 2, 98, 9,177,138,184,135,120,
+132,120,150,216, 71, 28, 34,190, 38,145, 72, 92,146, 5,201,141, 20, 66, 74, 32,101,146, 22,145,202, 73,219, 72,205,164, 83,164,
+ 94,210, 32,105,140, 76, 38,235,144,109,200, 94,228, 8,178,144,172, 36,151,144,183,144, 15,144, 79,146,175,146,135,200,111, 41,
+116,138, 33,197,137, 18, 68, 73,164,200, 40, 69,148, 42,202,126,202, 9,202, 85,202, 48,101,156,170, 65, 53,163,122, 80, 35,168,
+ 98,234, 2,106, 5,181,158,218, 78,189, 76, 29,162,142,211, 52,105, 22, 52, 47, 90, 12, 45,147,182,156, 86, 77,107,162,157,165,
+221,163,189,164,211,233,198,116,119,122, 20, 93, 74, 95, 70,175,166, 31,164,159,167, 15,208,223, 49, 88, 12,107, 6,159,145,196,
+ 80, 49,214, 50,246, 50, 78, 49,110, 51, 94, 50,153, 76,115,166, 47, 51,145,169,100,174,101, 54, 48,207, 48, 31, 48,223,170,177,
+213,236,212, 4,106, 98,181,165,106,181,106, 45,106, 87,213,158,171, 83,213,205,212,253,212,231,170, 47, 84,175, 82, 63,172,126,
+ 89,253,153, 6, 85,195, 92,131,175, 33,212, 88,162, 81,171,113, 84,227,166,198,152, 38, 91,211, 81, 51, 66, 51, 71,179, 92,115,
+191,230, 5,205,199, 44, 50,203,156, 21,200, 18,179,138, 89,187, 89,103, 88,131,108,140,109,194,230,179, 69,236, 21,236,122,246,
+ 89,246, 16,135,196,177,224, 8, 56,153,156, 50,206,119,156, 30,206,168, 22, 75,203, 89, 43, 86,107,190, 86,173,214,113,173,126,
+ 46,198, 53,231, 10,184,217,220, 10,238, 33,238, 13,238,251, 73,250,147,252, 38, 73, 38,173,153,212, 52,233,234,164, 55,218,147,
+181,125,181, 37,218,165,218,205,218,125,218,239,117,112,157, 64,157, 44,157,245, 58,173, 58,247,117, 9,186,214,186, 81,186, 5,
+186,219,117,207,234, 62,155,204,153,236, 57, 89, 52,185,116,242,161,201,119,244, 80, 61,107,189,104,189, 69,122,187,245,186,245,
+198,244, 13,244,131,245,229,250, 91,244,207,232, 63, 51,224, 26,248, 26,100, 26,108, 52, 56, 97, 48, 98,200, 54,244, 54,148, 26,
+110, 52, 60,105,248, 4,215,194,253,240,108,188, 26,239,196, 71,141,244,140, 66,140, 84, 70,187,140,122,140,198,141, 45,140,103,
+ 25, 23, 25, 55, 27,223, 55,161,153,240, 76,210, 76, 54,154,116,152,140,154, 26,154,134,155, 22,154, 54,154,222, 49,163,154,241,
+204, 50,204, 54,155,117,153,189, 49,183, 48,143, 51, 95,101,222,106,254,216, 66,219, 66, 96,177,208,162,209,226,158, 37,211,210,
+199,114,158,101,157,229,117, 43,146, 21,207, 42,203,106,155,213, 21,107,212,218,197, 58,195,186,214,250,178, 13,106,227,106, 35,
+181,217,102,211, 59,133, 56,197,125,138,108, 74,221,148,155,182, 12, 91, 63,219,124,219, 70,219, 1, 59,174, 93,152, 93,145, 93,
+171,221,115,123, 83,251, 68,251,245,246, 93,246,159, 28, 92, 28,178, 29,234, 29,238, 58,178, 28,167, 59, 22, 57,182, 59,254,238,
+100,237, 36,114,170,117,186, 62,149, 57, 53,104,234,210,169,109, 83, 95, 56,219, 56, 75,156,183, 59,223,114, 97,187,132,187,172,
+114,233,112,249,232,234,230,170,112,109,114, 29,113, 51,117, 75,113,219,234,118,147,199,225, 69,242,202,121,231,221,137,238,254,
+238, 75,221,143,185,191,243,112,245, 80,122, 28,242,248,205,211,214, 51,203,115,191,231,227,105, 22,211, 36,211,234,167, 13,122,
+ 25,123, 9,189,118,121,245,123,227,222, 41,222, 59,189,251,125,140,124,132, 62,117, 62, 15,125, 77,124,197,190,123,124,135,253,
+172,252, 50,253, 14,248, 61,247,119,240, 87,248, 31,241,127,195,247,224, 47,230,159, 10,192, 2,130, 3, 74, 3,122, 2, 89,129,
+179, 2,107, 2, 31, 4, 25, 7,165, 7, 53, 6,141, 6,187, 4, 47, 10, 62, 21, 66, 12, 9, 13, 89, 31,114, 83,160, 47, 16, 9,
+ 26, 4,163,211,221,166, 47,158,222, 25,202, 8,157, 25, 90, 19,250, 48,204, 58, 76, 17,214, 30,142,134, 79, 15,223, 16,126,111,
+134,217, 12,217,140,214, 8,136, 16, 68,108,136,184, 31,105, 17, 57, 47,242,199, 40, 82, 84,100, 84,109,212,163,104,199,232,194,
+232,174,153,236,153,201, 51,247,207,124, 29,227, 31, 83, 17,115,119,150,229, 44,213,172,142, 88,245,216,164,216,134,216, 55,113,
+ 1,113,149,113,253,241,246,241,139,227, 47, 37,232, 38, 72, 19,218, 18,201,137,177,137,123, 18,199,102, 7,206,222, 52,123, 40,
+201, 37,169, 36,233,198, 28,139, 57,243,231, 92,152,171, 59, 55,123,238,241,100,245,100, 97,242,225, 20, 98, 74, 92,202,254,148,
+ 15,194, 8, 97,157,112, 44, 85,144,186, 53,117, 84,196, 23,109, 22, 61, 21,251,138, 55,138, 71, 36, 94,146, 74,201,112,154, 87,
+ 90,101,218,227,116,175,244, 13,233, 35, 25, 62, 25, 85, 25,207,164,124,105,141,244, 69,102, 72,230,142,204, 55, 89, 17, 89,123,
+179, 62,103,199,101, 55,231, 80,114, 82,114,142,202, 88,178, 44, 89,103,174, 65,238,252,220, 94,185,141,188, 68,222, 63,207, 99,
+222,166,121,163,138, 80,197,158, 60, 36,111, 78, 94,155,146,163,148, 43,187, 85,150,170,149,170,129,124,239,252,218,252,183, 5,
+177, 5,135,231,107,206,151,205,239, 94, 96,189, 96,205,130,225,133, 65, 11,191, 93, 68, 88, 36, 90,212, 81,104, 84,184,188,112,
+ 96,177,223,226, 93, 75,144, 37,169, 75, 58,150,154, 44, 45, 94, 58,180, 44,120,217,190,229,180,229, 89,203,127, 42,114, 40,170,
+ 44,122,181, 34,110, 69,123,177,126,241,178,226,193,149,193, 43, 27, 75,212, 74, 20, 37, 55, 87,121,174,218,177,154,176, 90,186,
+186,103,205,212, 53, 91,214,124, 42, 21,151, 94, 44,115, 40,171, 42,251, 80, 46, 42,191,248,141,227, 55,213,223,124, 94,155,182,
+182,167,194,181, 98,251, 58,210, 58,217,186, 27,235,125,214,239,171,212,172, 92, 88, 57,184, 33,124, 67,203, 70,124, 99,233,198,
+ 87,155,146, 55, 93,168,114,174,218,177,153,182, 89,181,185,191, 58,172,186,109,139,233,150,117, 91, 62,212,100,212,244,213,250,
+215, 54,111,213,219,186,102,235,155,109,226,109, 87,183,251,110,111,218,161,191,163,108,199,251,157,210,157,183,118, 5,239,106,
+169, 51,175,171,218, 77,218,157,191,251, 81,125,108,125,215,183,188,111, 27,246,232,238, 41,219,243,113,175,108,111,255,190,232,
+125,157, 13,110, 13, 13,251,245,246, 87, 52,162,141,170,198,145, 3, 73, 7,174,124, 23,240, 93, 91,147,109,211,174,102,110,115,
+217, 65, 56,168, 58,248,228,251,148,239,111, 28, 10, 61,212,113,152,119,184,233, 7,179, 31,182, 30, 97, 31, 41,109, 65, 90, 22,
+180,140,182,102,180,246,183, 37,180,245, 30,157,126,180,163,221,179,253,200,143,118, 63,238, 61,102,116,172,246,184,214,241,138,
+ 19,180, 19,197, 39, 62,159, 92,120,114,236,148,252,212,179,211,233,167, 7, 59,146, 59,238,158,137, 63,115,189, 51,170,179,231,
+108,232,217,243,231,130,206,157,233,242,235, 58,121,222,235,252,177, 11, 30, 23,142, 94,228, 93,108,189,228,122,169,165,219,165,
+251,200, 79, 46, 63, 29,233,113,237,105,185,236,118,185,237,138,251,149,246,222,105,189, 39,174,250, 92, 61,125, 45,224,218,185,
+235,130,235,151,250,102,244,245,222,152,117,227,214,205,164,155,253,183,196,183, 30,223,206,190,253,226, 78,254,157,241,187,203,
+238, 17,239,149,222,215,184, 95,245, 64,239, 65,221,207, 86, 63, 55,247,187,246, 31, 31, 8, 24,232,126, 56,243,225,221, 65,209,
+224,211, 95,242,126,249, 48, 84,252,136,249,168,106,216,112,184,225,177,211,227, 99, 35, 65, 35, 87,158,204,126, 50,244, 84,254,
+116,252, 89,201,175,154,191,110,125,110,249,252,135,223,124,127,235, 30,141, 31, 29,122,161,120,241,249,247,242,151, 58, 47,247,
+190,114,126,213, 49, 22, 57,246,224,117,206,235,241, 55,165,111,117,222,238,123,199,123,215,245, 62,238,253,240,120,193, 7,242,
+135,234,143, 86, 31,219, 63,133,126,186,247, 57,231,243,231, 63, 0, 3,152,243,252,228,233,233, 61, 0, 0, 0, 6, 98, 75, 71,
+ 68, 0,255, 0,255, 0,255,160,189,167,147, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24,
+ 0, 0, 0, 7,116, 73, 77, 69, 7,219, 4, 4, 19, 16, 22,110,185,205,242, 0, 0, 32, 0, 73, 68, 65, 84,120, 94,236,189,123,
+180,109, 87, 93,231,249,249,205, 57,215,115,239,115, 78, 94, 36,225, 37, 33,188, 21,161, 48,160, 85, 42, 74, 73, 40, 69, 75, 27,
+149,132,194, 6, 44, 69,161,203,238,174, 70,187, 17,170,171,122,104,141, 18, 5,202,106,180, 91,233, 38,165,229,168, 82, 75,139,
+ 72,169, 77, 15,149, 78,240, 5,104,161,166, 4, 31, 32, 96, 66,124, 0, 9, 33,185,185,231,236,189,215, 99, 62,126,253,199, 92,
+231,220,115,111,238, 59,185, 33,129,245,201,216, 57,247,156,189,246,218,115,174, 53,215,252,254, 94,107, 46,152,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,
+153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,121, 80,176,103,218,224, 1, 70,166, 87, 13, 92,109, 12,143,
+ 80,101, 3,248,233,239, 51, 51, 51, 51, 51, 51, 51, 15, 3, 4, 48,198,200, 19,255,249,117,207,252,197, 15,252,232,139, 62,253,
+103, 63,246,205,119,255,240,203,190,228, 87, 75,103,174, 57,180,205,204,204,204,204,204,204,204,121,240, 96,122,234, 2,148,223,
+243,194,167,188,225, 71, 95,252,212, 87, 92,225,187,197, 35,182, 23,205,115,191,236, 73, 79,249,202,167, 62,226,218,247,126,248,
+142, 59,142,172,198,143, 2,202, 44,238, 51, 51, 51, 51, 51, 51,231,204,131, 41,234, 6,104,191,250,170,230, 91,255,193,229,225,
+233,221, 93,247,224,143,220, 77,232, 6,158,252,228,199, 93,252,226,175,124,194, 55,126,228, 19, 71,236,199, 62,185,251, 65,160,
+ 99, 22,246,153,153,153,153,153,153,115,226,193, 20,117, 1,170,247,223,190,123,199,165, 59,229, 51,190,226, 9,219, 87,106, 80,
+226,222, 46, 97,111,143,139, 47,191,220,189,244,249, 95,248,213, 49,133, 39,189,247, 67,119,252, 49,112, 55,179,176,207,204,204,
+204,204,204,156, 53, 15,166,168, 3,136, 42,123,191,246,161,163, 31,184,179,139,151,190,224,105, 23, 61,185,182, 14,223,117,196,
+123,239,129,170,229, 5, 95,241,133, 79,123,198,227,118,158,247, 59,127,246,201,219, 87,125,184,237, 76, 59,156,153,153,153,153,
+153,153,201, 60,216,158,240,126,229,251, 14,240,152,175,124,226,214,183,255,220, 75,175,254,174,199, 53,174,222,108, 60, 88,139,
+121,212, 85,212,143,125, 44,183,126,242,238,221, 87,255,196,111,255,200,187, 63,240,137,183, 2,123,211,231,245,148,123,126, 8,
+160,170,215, 0, 23, 79,191,222, 38, 34,159,211, 70,201,231, 91,127,103,102,102,102, 30,234, 60,216,162,190,143, 1,182,129, 43,
+174,220,118,223,244,159,190,253, 9,223,247,149, 87, 46,174,236,187, 8, 36,228,138,199,208,124,193,227, 25, 53,241,191,252,204,
+251,254,195,255,249,171,127,250, 47,128,191, 33,183,247,126, 11,187,170, 94, 13, 92,125,166,237, 38,142,136,200, 45,103,218, 8,
+ 64, 85,111, 2,174,157,126,125,189,136,188,233,116,219, 63,220,249, 92,233,239,100,156, 92, 75, 54, 80,246,239,196, 0,184, 5,
+184, 13,184, 81, 68,142,156,236,179,231,130,170,158,184,255,179,229,172,199,224,204,204,204,231, 55,238, 76, 27,156, 2, 3, 36,
+ 96,235,210,101,241,197,151, 46,220,165, 73,229,192, 64,144,233,127, 34, 34,186,255, 23,217,255,251,193,187, 14,104,125,212,238,
+123,127,237,211,191,241, 99, 47,122,236,139,190,252,242,197, 69,163, 87, 56,114, 55,125,187,164,184,244, 10,254,143, 87, 63,239,
+ 21,215, 60,241,138,167,188,230,109,191,251,218,123, 87,227,123,121, 96,132,253, 58,224,141,103,218,104, 31, 85, 5,184, 17,184,
+ 89, 68,110, 56,195,230, 51, 15, 3, 38, 33,191,110,122,157,202,192,219, 55, 88,222,166,170, 55,144, 13,151,251, 35,238,215, 0,
+ 55,157,105,163,147,112, 51,240,130, 51,109, 52, 51, 51, 51,115, 62,162, 46,128, 44, 42,123,205, 15,189,240,113, 63,252,210,103,
+ 94,254,188,157,166, 40,147,152, 44,216,198,228,151, 8,226,236,113,191, 99, 12, 98,237,177,223, 37,191,151, 16,245, 42, 41, 56,
+135, 57,180,159, 16, 61,169, 19,190,253, 5, 79,255,178,103, 61,241, 17,239,120,229, 91,110,254,129, 63,250,232, 93, 63, 3, 12,
+220,127, 97, 63, 87,174, 3,174, 83,213,235,128,235,239,231,228, 62,243,217,231,143,206,180,193, 9,188, 10,184, 86, 85,175,159,
+189,230,153,153,153,135, 42,231, 35,234, 0,143,120,243, 55, 62,254, 45,223,243,229,143,126,238,184, 73,104, 18,172, 17,192,128,
+ 74,126, 97,144, 36, 89,122, 21, 48,146,125,251,164, 96, 65, 68,178,191,175, 96, 69,196, 25,177,147, 71,156, 69, 93, 1, 85,146,
+ 8,195,102,228, 25,143,187,252, 17, 55,253,240,183,252,196,247,188,245,183,158,244, 11,191,249,209, 31, 1,238,226,129,241,218,
+ 33,123, 66,167,226, 90,142,231, 90,224, 38, 85,125,193, 44,236,159, 51,220, 66,142,196,220, 34, 34, 55,195, 65,168,252, 90, 38,
+ 49,159,182,187, 26,120,187,170, 62,251, 1, 58,247, 55,144,195,251,103,226,129,248,174,153,153,153,207, 3,206, 71,212,165, 42,
+204,213,255,240,105, 23, 63, 71,215, 30,223, 15,144, 82, 22,233,131,200, 58,211,107,255, 31, 10,214, 96, 46,189,124, 18,247,132,
+ 24, 32, 77, 81,124,129, 3,133, 55, 41, 11,191, 49, 16,201,245,249, 2,227,224,217, 41, 75,243, 31,191,255,235,191,247, 57, 79,
+185,242,139,255,217, 79,189,239,251, 7, 31, 63,112,236, 11,206, 31, 17, 57,109,104,115,242,206,223,200,177, 48,237, 53,228,201,
+254, 97,153, 67,158, 57,224, 6,224,134,147,121,222,147,104,223, 8,220,168,170,111, 35,159,111,200, 99,224,129, 58,247, 55,238,
+ 27, 17, 51, 51, 51, 51, 15, 4,230, 76, 27,156, 4, 59,250,116,247, 47,254,201, 93,239, 23, 51,176, 40, 35,139, 6,218, 90,167,
+ 87, 58,246,239, 42, 81,155, 17,162, 71,170, 54,139,124, 74,144, 18, 7, 94, 57, 0, 35,164, 30, 82, 7,218, 3, 67,254, 93,199,
+105,123, 69, 53,225, 99, 34, 12,145,239,253,214,231, 92,123,211,155,191,245, 87,174,186, 98,251, 91,200,178,127, 62,253, 56,107,
+ 68,228, 70,114, 78,243,176,199,116,221, 41, 54,159,121,120,240, 2, 17,121,245,217,132,210, 69,228,213, 28,239, 81,191,238, 84,
+219,206,204,204,204,124, 54, 57, 31, 79, 29,133,187, 95,247,171,183,255,192,175,253,217,103,190,229,105, 87, 54,143, 19, 48, 73,
+ 53,229,119,133,164, 89,178, 55, 99, 50,207,250,130,173, 47,252,238,175,122,226,213,181,171, 77, 74, 9,172,205,190,117, 74,232,
+184, 66,172, 96, 30,251, 76,204, 35,158,136,108, 95,137,212,219, 16, 6,210,250, 46,116,239, 83,164,187, 62, 10,161, 3,105, 80,
+ 34, 81, 33,173, 70,158,251,244, 47,248,130,119,189,249, 91,127,250,235, 94,255,159,237,199, 63,117,244, 29, 28, 43,222,187, 32,
+136,200,109,170,122, 35,199, 60,182,243,169, 98,190, 15, 39,169,136,190,229,129, 8,237,158, 80,225,127, 94,183,155, 61, 16,251,
+ 56,145, 11,209,223, 19,218,121, 86,251, 59, 15, 15,249, 6,142, 21, 87, 94,172,170,215,156,141, 65, 48, 51, 51, 51,243, 96,114,
+ 62,162, 30,129, 53,240,225,223,185,117,245,150,223,185,117,213,112,242, 69,108, 46,125,225, 51, 46,127,229,183, 60,251,241,143,
+108, 77,105, 66,210, 28,122,239,123,116, 88, 67, 92, 99,159,252, 92,220,179,191, 13,251,248,191,123,159, 15,239,187,222,122,207,
+237,132, 91,223, 77,252,171,247, 33,182, 4, 85, 84, 96,220,140, 60,249, 81,151,238,252,202,191,252,111,126,242,249,175,125,251,
+ 61,159, 57,218,255, 38, 15, 64, 40,254, 12,220,111, 81,131, 3, 97,123, 21,217,219,191,143,113,160,170,183,113, 44, 52,124, 82,
+129, 82,213, 55,114,236,179, 55,138,200, 13,135,246,251, 42, 78,168,232,158,246,249,166,179,169,222, 87,213, 87,145,189,209,147,
+237,227,180,237, 58, 25,247,183,191,167,233,235,235,200,251,221,191, 87, 30, 46, 92,165,248,137, 2,126,248, 59,103,102,102,102,
+ 30, 18,156,143,168, 39,160, 7, 2,121, 81,152, 41,235,125,112,207,187,138,240,133,111,122,241,147,127,240,181,207,187,234,121,
+113,132, 49, 70,212, 15,104,191,129, 48,128, 83,170,175,255,103,184,103,191,244, 20, 95,113, 12,185,228, 42,138, 75, 94,137,185,
+242, 25,132, 63,252, 41, 48, 17,200, 21,242,227,198,243,140, 39, 61,242,178,183,252,147,231,189,249,229,111,252,141,111, 1,254,
+154, 11, 43,234,135, 39,242,179, 22,181,195,168,234,181,192,219, 57,189, 40, 92, 77,246, 10, 95,117,154,106,235,253,123,171, 1,
+110,214,124,139,214,219, 56,117, 4,225,106,242,173, 89,215, 76,225,228,251, 48, 9,229,219, 56,117,106, 97,191, 93,215,169,234,
+ 89, 9,231, 3,212,223,147,245,245, 38,102, 97,157,153,153,153, 57,142,243, 17,117,200,194,233,167, 23, 28, 19,116,251,184,203,
+234,111,124,219, 75,159,250,166,175,125,242,101, 79, 26,186, 68,140, 30,134, 14,130, 7, 81,164,128,234,155,127, 4,251,244,111,
+ 56,216,217,110, 55,240,174, 15,220,206,187, 62,120, 59,247,172, 58, 10, 43, 60,237, 81,151,240, 77,207,126, 34, 95,242,132, 71,
+230, 29, 63,246, 57, 72,185,133,127,239,191,129,210,229, 38, 24, 33,172, 6, 94,246,252,167, 63,235,231,222,253, 23,175,124,215,
+ 31,222,254, 6, 46,208,237,110,147,224, 29, 22,187,115, 13,223,238, 23,220,189,253,132, 63,223, 66,222,215,190,145,112,216,155,
+189,154, 99,149,246,167, 11,245, 94, 76,222,239,190,103,125, 35,199, 60,203,253,251,177,247,121,149,170,222, 38, 39, 95, 40,230,
+141,220, 87,208, 15,239,107,191,109,215,112,223,126,220,135, 11,212,223,139, 57, 94,208,143,112,172,125,199, 69, 22, 30, 96, 78,
+188, 11,226, 1, 9,189, 95,136,116,196,204,204,204,231, 47,194,253,103, 63,228,189,243,194,167, 95,242,189, 55, 92,255,148,239,
+127,204,178,105,186, 81,209, 56,128, 31,242, 86, 70, 32,172, 41,190,250,187, 40,190,230,251, 14, 62,252, 95, 62,246, 41, 94,251,
+243,239,225,182,207,236, 81, 87, 5,133, 51, 24,133, 20, 60, 46, 5,190,241,217, 79,224,127,187,238,185,180, 85, 1, 64,252,200,
+ 77,132, 63,254, 25,100,235,138,233,107,133,178, 44,120,255, 71, 62,113,199,223,251,167,255,241,235, 84,249, 51,114,138,224,148,
+168,234,235, 56,180,248,140,136,156,246, 56,156,194,131,125,193,137,121, 89, 61,205, 10,107, 83,222,247,143, 56,180,172, 42,240,
+234,147,229,118, 79,226,221,222, 34, 34,207, 62, 97,155,195,223,181,207,141,228,125, 30, 39, 10,211,119,191,157, 99,226,113, 4,
+120,194,225,237,166,144,251,219, 14,125,236, 22,242,253,248,199,165, 28, 78,227,121, 95,176,254,158,162,175,183,145,191,243,198,
+195,127, 84,213,139, 47,132, 40,170,234,173, 28,159,183, 63,238,124,156, 13, 83, 63, 15, 47, 62,115,132,147, 71, 27,110, 35,159,
+203, 27, 78, 60,254, 51, 51, 51, 51,167,227,124, 61,245,125,246, 5,253,241,175,249,154, 71,255,171, 55,190,240,170,255,214, 37,
+199,102,240, 16, 71,136, 33,139,185, 0, 26,145,203, 30,139,251,210, 87, 28,124,248, 99,119, 28,225, 21, 63,249, 46, 62,221, 5,
+218, 69,131,183,150,162,176,148, 86,176, 90, 34, 49,240,142,247,255, 37,214, 24,126,232,219,158, 7,128,125,226,223, 39,126,228,
+ 55, 32,174,192, 53, 32, 16, 70,207,179,158,112,249,149, 95,250,180, 43,191,246,253, 31,186,227,195,228, 20,193, 89,123,235,147,
+200,159,138,107,185,175,160,156, 84,156,206,192,219, 56,222,187, 60,229,189,206, 34,114,243, 20,222,222,247, 72,175, 81,213, 87,
+157, 33, 31,126,179,136, 92,127,178, 55, 36, 23,249,189,158, 99,130,178,127, 15,246, 97, 65, 60,124, 12,110, 35, 27, 45,247,105,
+223,161,182,157,105,241,150, 11,217,223,219, 56,197,254, 46,144,160,159, 88, 95,112,198,186,132,179,228, 84,233,131,171,201,231,
+227,117,170,250,176, 93,126,119,102,102,230,193,231,254,136,186, 0,114,201,194, 61,255,173,215, 61,225, 71, 95,242,140,203,158,
+ 57,244, 48,136,135,148, 67,237, 20,230, 96, 75,245, 35,238,201, 95,133, 44, 47, 59,216,193,235,127,254,125,124,236,111,143,194,
+206,146,163,171, 0, 18,177, 2,173, 21, 46, 91, 56, 46,110, 28, 59, 59, 75,126,229, 15, 62,198,243,190,232,113, 92,251,204,199,
+131,117,216,171,191,138,240,129,127,143, 60,226, 42,208, 68, 18,161,108, 74, 94,242,188,167, 92,251,254, 15,221,241,239,128,123,
+ 56, 7, 81,231,236,151,140,189,129,243,184,183, 88,143,173, 45,190,207, 25,151, 27, 21,145, 91, 52, 47, 77,186, 47,182,215,114,
+122, 49, 57,105,158,124,159, 73, 56,111,225,248, 80, 55,112, 16, 38, 63, 44, 90,111, 58, 93,251, 14,181,237, 85,156,132, 7,161,
+191,167,109,223, 3,201,212,151,195,227,227,150, 51, 24, 87,103,203,254,186,242,135,195,248,135,215,160,223,231,141,170,122,181,
+156,162, 14, 98,102,102,102,230, 48,231,115,127,247,126, 81,220,242,185, 79,216,250,190,247,253,247, 95,244, 75, 47,121,218, 37,
+207,220,108, 34,145,152, 5,221, 0, 86, 16, 43,136, 19,196, 26,196, 9,230, 81, 79, 63,216,201,199,239,188,151, 95,255,192, 95,
+ 67,219,228,219,220,140, 1,107,137, 24,246,134,200,199,239,218,112,219,167, 55,120, 21,146,181,188,251, 79,255,234, 88, 3, 46,
+123, 34,218,237, 2, 97,106,141, 66, 72, 60,245, 49,151, 60, 1,120, 36, 15, 76, 90,225,100, 92, 71,246, 34,207,181, 64,235,176,
+192, 29, 57, 7, 81, 56,108, 60,156,238,190,248, 91,206, 50, 76,123, 88, 64, 14,183,233,184, 72,196, 89,182,239,184,176,247, 9,
+ 92,200,254,222,118, 14,251,187, 95, 76, 41,132, 19,195,229,247, 71, 92,143, 0,175, 39,167, 62,158, 45, 34,215,139,200,155, 14,
+189,174, 23,145, 75,166,109, 14, 27, 45,175,154, 12,175,153,153,153,153,211,114,174,158,250,126,184,253, 81,223,249,119, 31,241,
+131,111,253,198,199,125,119,145, 44,155, 49,129, 85,208,132, 40, 72, 18,212,202, 20,122,207, 31, 17, 87, 98, 46,254,130,131, 29,
+221,126,215, 46,221,198,195,118,197,129,157,176,239, 91, 27, 3,170,220,187,242,248, 49,240,152, 29,199, 94,191, 95,147,199,148,
+ 79,183, 48,108,144,102, 11, 69, 33, 4, 30,127,197,214,229, 85,105,175, 28,198,248, 97,206,141,215,159,230,189,171,201, 34,117,
+ 53,217,131, 58,168,254, 62, 7,111,241,176,200,157,117,129,213,228, 93, 31,252,174,167,190, 55,250,108, 35, 7,167, 18,254,195,
+ 94,250, 89,237,235,196,182,157,192,133,236,239, 89,239,239,254, 48, 25,110, 39,214, 14,188,254, 20,199,255,172,152, 62,123,198,
+207,139,200,155, 84,245,102,142, 79,113,188,145,211, 27, 82, 51, 51, 51, 51,231, 36,234, 2,176, 85,219, 47,255,215,223,240,152,
+ 55,191,250,154, 71,124,197, 56, 66, 95,228, 37, 95, 53, 42,226, 19,101,105, 56, 26, 99,106, 48, 6,103, 15,238, 96, 23, 0, 13,
+ 7, 59,187,124,167,197,150, 5, 49, 65, 94, 47, 94, 39, 81,159,126,170,128, 53,172, 55,158,191,234,123,170,103, 30,106,170, 70,
+ 80, 15,161, 7,179,141,104, 66, 83,226,146, 69,209,238,180,229,197,159, 30,187,115,138, 64,200, 89,228, 44,167,188,234,235, 56,
+246,120,206,155,128,179, 45,150, 58, 92,221,124,181,230,194,175,243,225, 84, 17,130,179, 53, 46, 78,197,121,137, 48,121,219,147,
+221, 66,119, 33,251,123, 46,237, 59, 47, 38, 65,191,137,227,251,241,234, 7, 43, 66, 0, 7,233,136,215,115, 44,244,127,181,170,
+ 94, 39, 39, 20, 6,206,204,204,204, 28,230,108, 68,125, 63,148, 93, 60,245,138,250,219,126,254, 37,143,127,211,151, 92,222, 94,
+222,141, 9, 42,151, 5,221, 39,156, 79,148,141,229,159,191,251, 19, 31,124,220, 69,229, 69,223,125,205, 35, 30,215, 43,200,190,
+183,238, 61,233, 51,127,137,121,236,115, 0,120,218,163, 47,229,203,158,116, 57,191,247,225,187,192,185, 44,226,102, 18,244,253,
+117,225, 82,254,108,127,207,154, 39, 93,121,108,126,215,221, 79,194,176,139, 14, 23, 33,211, 19, 99, 52,237, 27, 5,152, 67,109,
+126,192,152,188, 39, 56, 54,201,158,169,152,235, 48,135,197,233,106, 46,236,173, 87,247,151,115, 49, 16, 78,181,237,195,169,191,
+199,113, 10, 65,127,253, 89,158,231, 7,154,195,171,216,193,195,232, 56,206,204,204,124,118, 56,147,168,239,135,219, 47,191,254,
+239, 92,242,218, 31,255,250,199,252,211, 43,235,162,220, 36, 65,218,236,130,235,152,168,147,210,151,240, 63,190,243,175,222,121,
+195,251, 62,253,203, 63,125,253, 85,223, 47, 58, 69,222,237, 84,253,238, 12,122,231,159, 29,236,216, 24,225, 95,124,243,179,249,
+250, 15,253,191,208,123,168,202, 44,236, 48, 61,205, 13,208, 4,171, 13,207,250,194, 71,243,242,175,254,162,131,207,166, 79,127,
+ 24, 85,143,196, 49,111,168,138, 17,229,158, 85,223,237,110,198, 61, 46, 16,147,176, 31,158,100,175,227,220, 43,161,111,227,252,
+ 87,166, 59, 23,193,125,168,240,112,235,239,137,130,126,195,217, 68,114, 46, 4, 34,114,228,132,226,198,107,121, 96, 30, 36, 51,
+ 51, 51,243, 57,202,233, 68, 93, 0,113, 86,158,252,134,175,123,212,143,191,246,239, 93,249,181, 33,192,198, 25,164, 50,104, 82,
+180,139, 44,156,112,251, 16,250,239,248,185,143,255,212,111,127,116,247,231,129,244,215, 71,253,157,136, 62, 85, 15, 60,117,160,
+110,137,183,191, 23,119,228,118,228,226,171, 0,120,225,179,174,226,134,127,242,247,121,205, 79,191,135,205,189, 3,212, 21,216,
+156, 79,103,244,176,233,248,146,167, 94,193, 47,189,246, 27, 88,212,249, 62,117,124, 71,252,208, 59,144,178, 2,137,160, 9, 77,
+ 17,140,225,214, 59,238,189,171, 31,227,254, 35, 89, 47, 20, 55,115, 44, 92,125,226,173,110,103,195,103, 77, 36, 62, 75, 60,108,
+250,171,249,105,108, 39, 10,250,253, 41,140,123, 32,248,108, 24, 54, 51, 51, 51, 15, 83, 78,151,123, 22,224,242, 55,126,253,163,
+127,242,251,191,226,202,175,237, 3,248,214, 33,141, 69, 19,176,137, 44,106,203,111,125,114,125,231,243,222,250, 23, 63,240,219,
+ 31,221,253,191,128,219,129, 79,124,228, 51,253, 71, 48, 2,113, 42,122,178, 38,135,216,195, 10,255,222,183, 28,247, 37,223,253,
+252, 47,226,247,127,228,197,188,230, 31,126, 49,143,191,164,162, 86,207,210, 68,190,252, 73,151,241, 19,223,243, 53,252,238, 27,
+174,227,241, 87,236, 28,108, 31,254,240,167,208,123,111,135,162, 66,167, 34, 60, 66, 4, 35,124,228,111,143,252, 21,249, 57,235,
+251, 1,252,135, 10,167,170, 58,127,168,112,190,237, 59,213,182,231,187,191,207, 26,122,252,227, 85,225,161, 33,232, 51, 51, 51,
+ 51,231,196,105,195,239,143,189,184,124,222,119,124,241, 37,207, 31,251, 4,203, 2, 41, 5, 29, 21,219, 7,170,133,229,103, 63,
+120,247, 95,252, 15,191,116,251,191,222,237,226,123,128,187,201, 15,122,169,127,247,214,189, 63,248,212,158,255,206,203,218,194,
+ 69,213,131,226,118,154,150,244,215,191, 75,120,223,143,225,190,226, 53, 7,223,243,140,199, 93,198, 91,190,243,171,248,145,151,
+ 7,238,184,103, 77, 89, 56, 30,117,201,226, 62,237,137, 31,250, 85,194,159,252, 44,212, 45, 0, 98, 44, 26, 19, 18, 19,190, 31,
+120,199,123,110,125, 31,121, 61,250, 11, 41,234,231,147,215, 60, 46,132,170, 23,104,213,179,251,193,109, 28,107,223,169,214,142,
+ 63,142,233,254,237, 83,241, 80,239,239,113, 60,196, 5,253,124,139, 24,103,102,102, 62, 15, 57,157,167,238,174,186,164,122,210,
+197,149, 37,164, 92,221,174,155, 72, 57, 70,164, 18, 94,251,174,191,185,249, 21, 63,123,235,255,188,219,197,119, 3,119, 2, 71,
+129, 17,240,159,188,119,252,131,119,124,248,200, 7, 10, 7,218, 71, 64, 17, 67,190, 95,189,221, 34,254,201,127,192,223,252, 47,
+208,205,103,142,251,194,186,112, 92,117,197,206,125, 5,221,119,196,247,191,149,240,158, 55, 32, 85,137, 88,155,243,245, 69, 5,
+ 62, 80, 24,248, 47, 31,249,212, 29,191,247,161, 59,111, 38,175,253,126, 65, 68, 93,143,127,196, 39,156,253, 36,123,226,109, 98,
+ 39, 93,180,229,179,200,225,246, 93,172,121, 57,211, 51,113,186,109, 30,234,253, 61,224,161, 44,232,154,151,238, 61,204,249,214,
+ 38,204,204,204,124,158,112, 58, 81,183, 31,186,179,251,232,223,142, 49,180,173,165,245,145,214,194,202, 38,125,217,219,111,251,
+133, 31,189,233, 83, 63, 8,124, 16,248, 12,217, 67,207,234,157, 31,242,114,231,143,255,206,157, 55, 30,245, 17,231, 35,248,148,
+171,230,166, 69,105, 88,108,145,110,253,117,198,119,188,130,248,231,239, 64,119, 63,113,210, 6,232,250, 46,210,173, 55, 51,254,
+242,119, 18,254,248,223, 66, 93,131,117, 48, 85,225,137, 41,144,222,131, 85,126,232, 23,255,248,151,129,191,156,190,255, 1, 23,
+245, 67,247, 45, 31,230,172,110, 47,154,110, 67, 58, 60, 33,191,238, 12,158,238,131,205,141, 28,159,187, 61,221,178,185,251,199,
+226,148,219, 60, 12,250, 11,156, 84,208,111,225,244,107, 22,156, 22, 85,189, 90, 85, 95,119,232,117,237,161,247,206,105,193,162,
+105,251,195, 69,153, 71, 56,203,241, 54, 51, 51,243,249,203,105,195,239,119,175,194, 31,190,228, 23, 62,254,166,215,124,213, 21,
+215, 93,218,186,157, 15,127,166,255,219,255,251,189,159,126,231,159,127,114,243,255, 0,159, 2,238, 37,123,231,135, 69, 52, 2,
+221, 95,222,213,255,250, 27,126,243,142,107,223,252, 13,143,125, 65, 88, 5,112, 6,169,236,177, 18,182,118, 27,194, 81,252,123,
+127, 24, 41,151,200,165, 79,197, 92,242, 4,112, 53, 36, 79,186,247,175,209,187,254, 28,250,123,161, 40, 96,113, 44,175,158,111,
+123, 51,232, 32,148, 75,195,191,191,249, 35, 31,250,255,254,235, 39,126,129, 28,122, 63,182, 74,205, 3,192,228,157, 95,203,125,
+159, 47,126,132,115,171,124,127, 53,199,175,189,126,147,230,199,140,158,118,177,151,233,251,175,131,179,187,159,254,124,152,170,
+172,223,196, 49, 17,185, 86, 85,223,118, 50,143,245,208, 45, 95,103, 18,169,135,108,127,225,148,130,126, 46, 11, 10,157,140,171,
+ 57, 94,136, 95,207,177,168,197, 53,154,215, 58,184,225, 76,247,154,235,177,199,232, 30, 62,198, 15,218,210,184, 51, 51, 51, 15,
+ 95, 78, 39,234, 30,184,231,247,111,219,251,119,191,127,219,222, 77,192, 22, 57,111,126, 7, 57,212,190,154,182, 57,113, 89,177,
+ 68,126,222,250, 29,255,230,221,159,122,203,179, 30,219, 62,254,165,207,188,244,137,221,238,136,108,151, 80,153,188,210, 28, 10,
+ 69,129, 20, 69,174, 96,191,251,131,132, 79,223,114,176, 59, 49, 14, 92, 9,139,229,241,123, 87, 96,140,104,106,168,171,146, 91,
+ 62,118,231,145,255,233,223,190,255,205,100, 47,189,227, 12, 79,104, 59, 25,170,167, 94, 26,237, 52,220,231,105,104,167, 67,242,
+106,105,175,230,216,147,208,246,133,238,102,242,196,127, 56,148,191, 31,230,191,150, 99,185,233,243,246, 32,207,146, 27, 56,254,
+ 49,168,175,154, 60,205, 27, 56,214,182,107,201, 66,120, 49,217, 19, 63,194, 41,114,240, 15,229,254, 78,253, 58, 89, 74,224,237,
+231, 48, 20,110, 60,143,123,215,175, 37, 27, 76,183,145,143,193,201,214,126,191,134,251, 46,145,123,203,133, 52,112,102,102,102,
+ 62,119, 56,157,168, 71,178,112, 7,178,136,155,233,111,195,244,218, 15,183,159,140, 0,172,146,234,159,254,119,191,248,241, 31,
+186,116,225,222,240, 15,158,184,243,232,254,232, 8, 91, 5, 82,219, 99,247,175, 3,136,129,178, 62,253,125,104, 10, 36,133, 33,
+146,118, 71,154, 71, 94,193,135, 63,117,100,117,253,155,126,231, 77, 71,215,254, 61, 28, 51, 50, 46, 52,183,144, 5,253,108,243,
+233, 7,136,200, 13,122,108, 1,155,125, 47,236, 90, 30, 2, 21,226,147,183,126, 61,217,187,222,143, 72,156,232,121,238,115, 4,
+184,254, 20,239, 29,240, 80,238,239, 73, 56,215,244,192, 89, 45,167,123, 10,174,230,236,235, 12,110,224, 2, 26, 56, 51, 51, 51,
+159, 91,156, 46,167,174,100,113, 94,147, 39,241,123,200,225,246,205,244,247,211,185, 52, 74, 22,254,163,187, 93,252,237,111,190,
+225,163,255,235,207,254,241,221,127, 81,151,134, 98,215,147,142,122,232,211,193, 94, 4, 65,228, 36,175,233, 63, 34, 48, 38,116,
+ 55, 32, 71, 6,154,139, 47,226,183,111, 59,122,199,215,254,192,205, 63,112,219,157,171,255, 76,110,219,134, 11,144, 75,159,184,
+153, 60,185, 94, 47,249, 65, 28,231, 44,232,251, 76,222,221,179,201,251, 59, 27, 79,255, 70,114, 40,251, 92,189,194,115, 70,242,
+ 67, 97,246,219,118, 42,110, 38, 63,246,244,172,142,193, 67,185,191, 15, 50,251,249,250,179, 58,110,228,227,240, 2, 17, 57,167,
+136,208,204,204,204,231, 55, 23,114,145, 22,200, 43,191,183,100, 47,237,139,190,227,203, 47,255,174,127,245,194, 71,127,211,163,
+119, 74, 23, 6, 37, 56,129,218, 34,206,100,207,221, 28,106,142, 42, 68,208,144,160,143, 88,159, 40, 10, 97, 55,194, 15,191,231,
+158,223,250,223,223,121,235,219,124, 76,127,200,177, 91,233,142, 45, 44,255, 48, 98, 10, 5,159,232, 37,222, 70,126,186,217,253,
+241, 6,239, 23,135,106, 9,246, 61,236, 35,228,103,182,223,175, 10,236,135,106,127, 31,108,166,227,112, 53,247,173, 77,184,133,
+ 28,110,159,133,124,102,102,230,156,185,208,162, 14, 89,216,107, 96, 7,184,242, 11, 46,169,190,230, 85,207,189,252, 69,223,126,
+205,101, 95,250,152,173,162, 64, 5, 85, 37,137,144, 14,181,198, 40, 24,213,124,235,154,192,221,125, 76,255,233,131,247,252,233,
+219,222,247,233,119,254,201,223,172,127, 13,248, 91,114,228,160,227, 97, 42,232, 51, 51, 51, 51, 51, 51, 15, 36, 15,134,168, 67,
+254,158, 18, 88, 0,219,192,149,151, 44,221,223,249,210,171,150, 95,250,226,103, 94,242,156,103, 62,186,125,228,197,149, 93, 44,
+156,148,206,136, 9, 9,221,196, 52, 30, 29,211,230, 99,159,238,238,186,241, 3,247,252,215,223,187,109,245, 7,159,188,119,188,
+ 5,248, 4,176, 75,206,161, 95,176,123,210,103,102,102,102,102,102, 30,110, 60, 88,162, 14,249,187, 12, 80,145, 67,242, 45,185,
+162,254, 18,224,138,182, 50,151,214,206,108, 23, 86,202,144, 52,244, 65,247, 54, 67,188, 91,149, 79,147, 67,236,187,228,188,249,
+154, 51, 23,234,205,204,204,204,204,204,124,222,241, 96,138,250, 62,251,226, 94,144,189,247,253,151,227,224,233,235, 64,246,192,
+253,244, 26,201, 66, 30,152,197,124,102,102,102,102,102,230,164,124, 54, 68,253, 48,251,171,194,155, 67, 63,247, 73,112,240,116,
+117,101, 22,242,153,153,153,153,153,153,211,242,217, 22,245, 19, 57,220,158, 89,196,103,102,102,102,102,102,102,102,102,102,102,
+102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,
+102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 30,214,168,234, 67,109,109,135,153,207, 2,251,
+227,224,225, 56, 30, 30,142,109,158, 57,123,228, 69, 47,122,209, 59, 49, 70,173,115,118,123,103,199, 42, 36, 69,195, 48, 12,106,
+173,141, 85, 89,177, 94,175,147,247, 94, 83, 74,130,106,126,200,121, 2, 98,216, 95,237,205, 80,150,169,114,142,132,138,247, 94,
+ 68, 68, 4,149,194, 57,134,113, 80,146,106, 89, 87,148,101, 21, 68, 36, 24, 99, 8, 33,226,189, 79, 34,146,218,182,101, 24,122,
+234,186,166, 31, 6,170,178,100,181, 90,153, 24,163,180, 77, 43,174,112, 98,172, 53,170, 68,231, 92, 24,135,209,132, 24,197, 90,
+171, 41,165, 4, 98,140, 65,140,181, 54,165,100, 54,155,141, 69, 49,228,135,189, 37, 85, 85, 64, 52, 37,213,148, 60,170, 17,103,
+ 77, 93, 85,146, 98, 76,136,104, 81, 20, 9, 85,188,247, 70,193,166,148, 68,140, 25,173, 49, 94, 85, 36,165, 40,128,136,128, 42,
+209, 88,139,181,214,132, 16,168,235, 90,134,190, 71, 85, 17, 17,170,162, 72,170, 42,170,138,130,136, 17, 20,193,136, 96,140, 33,
+134,160,235,245, 74, 72, 73, 16,209,170,105, 84,196,184, 24,163, 17, 48, 34, 32,214,210, 52, 77, 74, 41, 69, 85,245, 64, 68,196,
+105, 74,210,117,157, 90,107, 83,233, 74, 99,172, 49, 8,118,244, 35,101, 81,202, 48,142, 38,120,239,131, 15,201,216,188, 72, 95,
+ 10, 33,185,178, 50, 41, 70,147, 52, 9, 32, 77,211, 90, 99, 76, 49,142, 99, 97,140, 72, 81, 20,132, 24, 99, 12, 49,198, 24, 99,
+ 26,135,128,152,100,203,146, 24,131, 2, 52, 77, 75,140,193,146,212, 98,140,166, 24, 49,214,138, 17,172, 49,166,142, 41,133,186,
+ 44,147, 49, 70,197,152, 8,224, 67, 32,134, 0, 34,120,239,173,136, 72, 83, 85, 0, 66, 62, 22,164,148,108,225, 10,235, 67, 8,
+198,152, 96,173, 21, 4,141, 41, 98,141,181, 49,198, 34,165, 36,198, 26, 9, 33,146, 98,212,148, 18, 34,130,177,198,107, 82, 10,
+231,176,214,202, 56,142, 86, 85,169,171, 74,250, 97, 64, 68,196, 57,139,117, 78,140,136, 87, 77,253, 56,122,181,214, 74, 81,184,
+ 50,132, 96, 64, 72, 41, 73, 76, 81,157,117, 41,166, 68, 89, 20, 69, 74,201,168, 42, 33, 4, 81, 77, 24, 99, 83, 93, 87, 81,140,
+213, 20,147,128, 98,173, 85, 85, 13, 73, 53, 10,168,170,106,138,193, 90, 99, 5,129,190, 31,196,123,159,202,170,242, 58, 13,198,
+194, 57, 21, 17, 66, 8, 54,198,136,177, 6, 52,175,156,232,172, 53, 69, 89,210,117,157,169,235, 26,239, 71, 82, 74, 38,165, 36,
+206, 57,140,177, 41,166,132,115, 86, 68,140,196,152, 8, 49,136, 51, 70,139,178, 8,154, 52, 57,107,211,122,179,161, 44, 11,107,
+173, 3, 85, 73, 41, 50,250,160,206,218,100,114,155, 25,199,209,150,101,201, 56,142, 34,130, 56,231,140, 49,198,245, 67,111, 10,
+ 87, 56, 49,198,160,138, 15, 97, 52, 34, 49,132, 96,140,181,210, 52, 13,193, 7, 49, 34, 54,169, 26, 64, 5, 72, 41,145, 82, 10,
+214,154, 0,146, 47, 77, 20, 17,131, 76,179,130,181,150,144, 98, 10,222, 39,103,157,186,178, 48,128, 9, 33, 48,122, 47,109,219,
+ 0,176, 89,173,109, 82,213,186,110,162,247, 62,150, 69, 17, 99,138, 41,198,136,170, 74, 83,215, 38, 95,211,138,115,142,164, 81,
+ 11, 87, 4, 31, 66, 66,140,166, 16,213,135,144,140, 49, 18, 83, 34,165, 40, 34, 72, 97, 11,131, 32, 41,165,252, 16, 72, 49,168,
+ 38,172, 53, 73,196, 36, 99, 13, 49, 4,107,172, 37,134, 40,154, 18, 73,213,136,136, 49,198, 88, 5,103, 68,204, 24, 60,198, 24,
+113,206,217, 97, 24, 4, 69, 52,207, 25, 24, 99, 48, 34,136, 49,234,156,245, 41,166,100,140,164,148, 82, 12, 33,132, 24,147,148,
+101,105,247,143, 25,130, 22, 69, 65, 74,137, 16, 66,112,174, 16,107,173,132, 16,108, 82, 21, 99, 76,190, 94, 84, 77, 74,201,166,
+ 20,197, 57, 7, 64, 8, 1, 31,252,168, 81,125,219,182,211, 53, 97,163, 24,241, 49,196, 81, 53, 37,231, 10,188, 31,147,136, 32,
+ 34, 41,132,160, 34, 66,254,250, 68,204,115,169, 53,198,152, 73,244,213, 57,171,249, 18, 53,196, 24, 41,138,194, 42,152, 24,130,
+ 5,138,148,146, 3,108, 81,150, 70, 83,114,195, 48,104,254,184,166,162,112, 41,132,168,144, 47,136,148, 82,180,214,170,136, 80,
+148, 5,133, 43,152,222,179,170, 74,140, 49,166,152,210,254, 92,137,130,181,118,127,124, 73, 76,209,146,212,133, 24,141, 32, 41,
+ 75, 1, 70,192, 41,152,148, 18,198, 26, 66, 8, 88,147,127, 26, 99, 16, 17, 92, 81,160,154, 72, 49, 33, 34,162, 40,130,164, 24,
+227, 8, 36, 85, 69, 85, 35,228,201,189, 44,203, 36, 34,201, 90, 27, 99, 74, 18,125, 16, 31, 60,136,224,156, 75,198,152,164,170,
+234,189,199,123, 15, 40,154,123,106,243,252,110,197, 24, 73,227,152,143,119, 81, 20,140,163,183,160,249, 2, 64,172,136, 56, 80,
+151, 82,210,148,146, 26, 99,146,181, 70, 67,136, 41,132, 16, 81, 77,206, 21, 89, 79,140,193, 26, 67, 74,202, 56, 14,178, 92, 46,
+196, 57, 39, 73,147, 76,199, 78,234,186, 46, 69,164, 80,212,200,139,255,209, 63, 58,202, 36, 68,198, 90,163,104, 82,160,109, 22,
+ 82,148, 46,197, 20,117,236, 71,181, 69,193,122,181, 18, 64,130,247,200, 56,130, 49,186,223,163,164, 9, 91, 22,136, 88, 89,110,
+111,137,247,158,245,106,143,182,109,232,214,107, 92, 93,169,247, 94, 76, 34,137,179,105,123,107, 11, 48, 42,249,201,171, 24,147,
+ 7,207, 56,142, 84, 85,197, 56,142, 24, 99, 56,122,244,168,160, 72, 89, 87, 52,117, 3, 24,181,206,168, 49,134, 49, 68, 41,172,
+165,235, 58, 45,139,130,193,143,121,114,115,133, 25,251, 94,218,118,145,175, 4,129, 97,136, 24, 7,133, 45, 88,237,173, 99, 12,
+163,154,124,122, 5,231, 40,203, 50,141, 93,167, 34,194, 69, 59,219, 2,198, 68, 77,236,237,237,233,246,246,118, 26,199, 81,179,
+237,226, 88,173,214, 41,145,216,106,183,101,181, 89,137, 17, 97,107,107, 75, 54,155,142,162, 40,112, 70,216,221,221, 37,165,168,
+ 70,133, 40, 73, 16, 75, 89,215,212,101, 73, 34,177, 58,186, 2, 18,139,182,213,222,123,146,247, 32, 98,156, 43,164,105,106, 49,
+ 54, 47,131, 47,198,176,238,186, 24,198, 49,138,170,184,186, 38,198, 32,154,148,210, 21,218,182, 45,123,187, 71,141,117, 78, 20,
+ 72, 41,210,182, 11,185,247,222,123,163,136,104, 76, 72, 93,186,212,111, 58,182,118,118,196,154, 60,255,238,173, 55,162,154, 68,
+ 68, 76,211, 44,108, 81, 8,123,123,107,209,164,201, 21, 46, 13,163, 87, 17,163,181, 51, 58,166,188,184,159,179, 14,213,128,113,
+133, 56, 99,179,225, 33,162,146, 23, 2,148,105,144,166,177,239,247, 39, 51,196, 88, 98, 76, 44,151, 11, 52, 37, 66, 74,178, 94,
+175,217, 94, 44,100,111,179, 65,128,162, 40,180, 44, 10,193, 58,237,250, 46, 57,231,132,164,132, 24,104,234,154, 24,163,108, 54,
+ 27,113,206,137, 15,249, 41,187,206, 57,181,214, 72, 85, 84, 32,176,238, 58,109,202, 26, 17,197, 24, 35,128,236,237,237,177,181,
+181,197, 62,125,223, 17, 66,208,178, 44, 21, 72,227, 56,178,216, 90, 72,191,233,141,115, 78,202,178,212, 97,232, 84, 48,136, 49,
+ 98,140,145,162, 40, 36,248, 32,171,245, 10,231, 44,117, 89, 39,175, 17, 13, 17, 48, 88,103, 53,132, 17,148,100,156,211, 48,142,
+ 36,205, 6,134, 49, 34,170, 42, 97,140, 72, 33,154,148,148, 98,212,229,114, 59,105,138,210,117,157, 44,151, 75, 73, 33, 74, 63,
+246, 44,154, 86, 49, 70,251,126, 64, 53, 73,211, 52,178,183,183, 71,190,128,145, 24,188,110,111,111, 43,130,174, 86, 27, 98, 10,
+ 44,151, 91, 6,144, 16,163, 90, 81,173,203, 38, 41, 74,223,247,200,244,115,185,189, 35,221,106, 37, 33, 37,182,182,150, 8,162,
+187,123, 43, 77, 41, 98,173,165,170, 10,233,251, 65,202,186,164, 46,107, 70, 31, 12,146,100,232, 6,105,155,214,142, 49, 36, 17,
+ 73,146,167, 81, 77, 33, 74,219, 46,100,189, 94,171,106, 36, 69,149,124,254, 17, 64,155,170, 73, 42,170,195,144,231,204,113, 12,
+ 76,154,143,136, 80,215, 53, 77,211, 32, 70,180,235, 58, 77,160, 22, 36, 29,136,190, 33,248, 64, 85, 85,248, 16,232,215, 61, 69,
+229,212, 26,171,198, 26, 5, 48,198,176, 94,109, 68,242, 68,169, 34, 34,219, 59,219,154, 82, 74, 49, 70, 85,205,162, 20,162, 18,
+131, 23,177, 6, 81, 88,119,107, 49, 98, 76,221,212,106,197, 72,240, 35,195,224, 49,198, 80,213, 21,227, 56,170, 49, 70, 5,165,
+ 44,107,137, 41, 72, 30,163,213, 65, 31, 85, 84,194, 56, 10,226, 36,165,128, 70,149,162, 42, 37,198,132, 21, 68, 69,196, 57,167,
+ 86, 12, 74, 82,239,125,244, 49,138, 31, 70,221,218,218, 74, 49, 70, 29,186, 94,140, 19, 69, 39, 93,215, 40, 69, 97, 68, 36,207,
+103,174, 40,212, 26, 43,131, 31,166,227,155,143, 95, 85, 86,136,136, 32, 70,172,129, 24, 2,174, 40,180,239,187, 52,142,158,170,
+172, 52,132,160, 85,213,164,164, 49, 86, 85,153, 84, 84, 83, 8,234,125, 36,198,132,106, 62, 62, 77,211, 96,173, 48,142,163, 58,
+ 87,106, 74,201, 84, 85,101, 68, 68, 82, 74, 2,164, 16, 70,170,170, 65, 68, 88,175,215,162,170,214, 57, 35,101,153, 13,170, 97,
+ 24, 12, 96, 98,140,120,239, 89, 46,151,108, 54,155,148, 82,164, 40, 10,169,235, 70,214,235,181,214,117,173,198,144, 48,134,232,
+ 35, 24,104,235, 6, 85, 36,165,164,206, 57, 69,209, 4, 98, 68,166, 99,173, 26, 99,144,148,144,245,106,133, 24, 35, 62, 4, 17,
+144,162,176,106,140, 69, 85,197, 24, 43,162,136, 58,136, 62, 34,198, 16,194, 72, 81, 20, 84, 69, 37,123,123,123,212, 85,133,171,
+ 42, 52, 70, 82, 74, 88,107, 53,134, 16, 93, 81, 98, 12,164,148,109,113, 64,173, 21,233,199, 49, 37, 31, 53,229,246, 25, 72,196,
+ 56,205,131,165,211, 24, 83,210, 20,113,198,226,202,146,113, 28, 40,139, 34, 27, 34, 70, 36,166, 68,240, 65,247,246,246,212, 90,
+199,114,185, 16,107,140, 12,163,151,162, 40,196, 90,179,223, 71,233,251, 65, 55,155,141,170,170,150,117,137,136, 17,174,172, 0,
+ 0, 32, 0, 73, 68, 65, 84, 17,203,208,245, 74,202, 13, 2, 37,198,124,173, 26,131, 24, 83,224, 74, 35,206, 24,170,166, 33,197,
+196,102,179, 49, 34, 98,170,178, 18,121,217, 63,254,199,169,176, 22, 87, 85, 34, 36,134,209,171, 40, 98,156,209,110, 51,224, 42,
+167,126, 12, 84,101, 73,239,189, 20,214,230, 11,237,200, 17,196, 24,133,108, 6, 72, 81,208,182, 11,182, 46,222,146,187, 63,115,
+ 15, 33, 69,210, 56,130, 40, 34, 14,209, 68, 82, 69, 69,213,136, 85,227, 28,146, 80, 33,129,177,164, 20,105,154, 10,107, 45,222,
+123,234,186, 38, 37,208,164,146, 52,177, 94,173, 49,214, 96,140, 85, 99, 12,214, 57,140,113, 82,183, 13,253,102,163,227,232, 17,
+201, 86,139, 8,236,236, 92, 36, 70,140,116,131, 7,141, 56,107, 69,213,168,146,152,188,117, 69, 32, 38, 48, 86,176, 34,186, 90,
+173,168,219,154,194, 58, 17, 17,250,193, 83, 58, 7, 70,213, 76,226, 84, 20,133,134, 16,179,140, 25, 80, 4,107, 77,150, 54, 81,
+ 52,102,119,107,239,232, 81,234,166,226,232,238, 10,153, 44, 23, 99, 64, 85, 40,235,154,210, 58,250,177, 7, 17,173,202, 82,156,
+113, 32,138, 38,149,117,183,198, 40,168, 8,117,219, 98, 64,119, 87, 43,173,155,134,182,105, 49,198, 72,140, 30, 5, 45,140, 35,
+197, 40,187,123,123, 44,150, 75, 17, 35, 72, 2,149,148,246,246,246, 72, 49,169,170,138, 88, 55, 9,104,137,113, 86, 52, 69,138,
+170,148,190,239, 69, 35, 24,131,148,101,133,181,162,187, 71,247,112,133,211,177,235,243,136,154, 80, 17,154,197, 2, 35, 34, 67,
+215, 35, 70,164, 93,180, 58,140, 30, 85, 21,141, 65, 84,149,173,173,133,110, 54, 61, 59,219, 59, 32, 50,121, 31,254,192,114,238,
+134, 65,156, 49, 56,231,212,136,128, 49, 12, 93, 39, 82, 20, 26, 99,164, 42, 10,198, 16, 40,178, 97, 35,155,205, 70,139,178, 20,
+128,194, 57,196, 90,140, 8,154, 18,137, 36, 34,194, 56,120, 29,135, 1, 1,156,115, 84, 85, 37,154,192, 24, 8, 41,177, 89,175,
+105,219, 22, 85,212, 90, 97,179,233,181,169, 74, 66,138,146,141,108,161, 40, 44,206, 58,214,221, 26, 99, 44, 70, 84,196, 90, 74,
+ 87, 18, 99, 36,133, 64, 72,138,115, 86, 99,140, 18, 85, 41,157,197,217, 82, 49, 16, 83, 82,141,145,190,239,217, 90, 44,216,116,
+157, 44, 22, 45, 49, 6, 48, 78, 37, 65,212,160,198, 89,192,144, 98, 22, 59, 35, 14,107, 21, 99, 10, 82, 8, 58,248, 0, 32, 49,
+ 6, 93, 44, 22,144,146, 36,178, 71,102,173,232,224,189, 24,177,140,227,136,181, 5,206, 57, 25,135, 78,155, 69, 67,142,168, 41,
+ 26, 19,117,211,208,111, 54, 84, 85, 35, 98, 64, 99,162, 31,123, 10, 91, 80, 55,181,238,238,238, 97,157,101,217, 46, 4, 3,187,
+171, 21, 86,132,197,162, 21,128,148,162, 12,195, 0, 8,206, 57, 84, 85,187,110, 96,107,185, 64,172, 37,248,128,177, 22,163,199,
+188,171,148, 2,128,218,201,203,240, 62,104, 24, 71, 73,192, 56, 14, 7,145, 44,107, 13,203,108,112,169,247, 35,195, 16,144,210,
+192,152,112,149,195, 90, 39, 67,215, 81, 20,165,122,239,137, 41, 49, 41, 56,144,175, 39,231,140, 84,101, 61,141,133,200, 56,122,
+ 77,162, 16,243,100, 40, 34,186, 88, 44,241,126, 16, 68, 16, 21, 48, 16, 98, 16, 13,145,162, 40, 40,202,146, 77,215, 83, 90, 71,
+210, 4, 36,172, 41,116,211,109,168,170, 74, 68, 4, 3,132,148,164,180,150,110, 24, 36,105,142, 60, 44,182, 22, 18, 98,196, 88,
+ 97,179,187, 66, 21, 92, 81,176, 88, 44, 64, 19,155,205,154,170,170, 25,134, 17, 65, 16, 35, 90, 56, 71,136, 1, 17,209, 16, 3,
+133, 41,168,154,138,164,137,148, 18,130, 48,142,163, 24, 43,106, 77, 9,154,136, 36, 73, 49, 97,109,193,166, 91, 97,129,160, 42,
+154,178,149, 97,173,209,182,173,136, 94,212, 71,143,100, 71, 75,125, 8, 32,164,182,173,113,174, 84,213, 68, 74, 0,137,148,208,
+113, 28,178,240, 85, 21, 49, 70,134,161, 71, 68,196, 90,145,188,157, 76, 17, 58,161,105, 26, 0, 25,199, 81,124,244, 82,216, 98,
+ 26,163, 81,178, 1,218, 2,176, 90,173,180,109, 91,140, 49, 12,195, 32,206, 57, 68,132,190,239, 85, 85, 85,140, 96,197,128, 8,
+ 34, 66, 81, 56,196, 58,242,133, 37,144,144,170,168,136,154,164, 31,123,141,222, 75, 85, 53,196, 24,113,206,202, 56,246,120, 31,
+ 1,149,186,170, 53,169, 82, 20,133, 24,107,114,196, 67,149, 20, 35,131, 15, 44, 23, 45,125,215, 49, 70,207,178, 89,178, 90,175,
+ 40,203, 18, 99, 12,155,174, 87, 52, 81, 85, 21, 85, 85,146,146,234, 56,142, 58, 12, 3,198, 24,150,203,101,158,159,140, 21, 77,
+138, 78,194,218,117, 29,198,136,198,144, 72,154, 16,201, 81,140,170, 46,137, 97,196, 90,155,181, 99,211, 51,122, 79, 8, 65,197,
+ 90,170,170,148,182,174,177,206, 73,214,184, 32,125,223,211,182, 53, 32, 28, 61,122, 84,151,203, 37, 41, 68, 70, 63,238,183, 83,
+167, 40, 10, 93,215,163, 49, 18, 82,226,162,139, 46,202,199, 85, 19,138, 64, 10, 36, 17, 9, 49,137,181, 22,121,201,203, 94,166,
+154, 18, 26, 2,106,114, 40, 72, 21, 22,203, 45,156,115, 32,249, 98,213, 28,162, 96,140, 30, 63,122,194, 48, 16, 83,162,110, 27,
+ 70, 31, 89,182,205, 36,202,142,123,143, 28, 33,198,136,166,124,208,178,244, 9,193,143,132,152, 88,110,109,145, 82,160, 31, 3,
+190,239, 73,170, 88, 17,140,179,108,111,111, 79, 94,238,100,163,168, 34, 42,136,217, 23,148, 60, 57, 85, 77,133,152, 28,126,242,
+227,128,181,142, 20, 19, 42,121,123,235,242, 69,108,139,130,189,221, 85, 54, 50, 80, 82, 84, 72, 9,146,130, 81,150, 91, 75, 4,
+131,170,178,183,183, 55, 89,113, 6,149,156, 99, 72, 41, 79, 66, 34,134,162,172,104,155, 6, 65, 80, 32,169, 50,133,222, 81,160,
+219, 91,145, 82, 68,156,163, 42, 10, 98,140,172, 54, 27,218,186,158,250, 18, 89,119, 3, 26, 35, 34,194, 98,185,196,218, 28,161,
+ 0,195,106,111,143, 16, 98, 54,128,242,164, 4, 34,185,207, 34, 56, 91,176,189,179, 4, 4,146,210, 13, 3,214, 8,133, 43, 88,
+173, 86,104, 74,168, 1,107, 44,203,229, 18,200,231,211,199, 8, 9,202,210, 98,140, 67,140,224,135,145,132, 82, 85, 21,193,135,
+233,194, 27,104,218, 26, 77,202,222,122,143,182,110, 89,111,214,180,117,155,207, 39, 74,140,158,177, 31, 40,155,150,166,174,177,
+214,230,118, 2, 73, 19,123,123, 43, 68,148,237,157,139,176, 2,171,213, 6, 69,169,202, 44,140, 34,146,197,218, 24,214,235, 53,
+ 0, 91, 91, 91,232,116, 44, 55,235, 53,198,185, 28, 62, 3, 48,134,173,169, 47,171,205,134,229,162, 1, 21, 54, 93, 71,221,180,
+ 4, 63, 48,142, 30, 16, 22,109, 3,228,243,168,170,217, 28,145, 44,214,227,152,207,211, 56, 14,136, 24,118,118,182, 9, 33, 32,
+214, 50,246, 61, 34,194, 16, 6, 22,245,130, 76, 2, 76,158,140, 37,143,191,253,126,122,239, 17, 85,162, 42, 67,223,231,107,196,
+ 0, 10,139,186,101,211,119, 52,109, 75, 97, 76, 30,115, 33,226,156,101,244,129,178,112,132,152, 24, 71, 79, 89,150,244,125,143,
+155, 38,250,220,190,145,186,174, 8, 49,224,140, 35, 1,195,102,195, 98,177, 64,140,193,251, 0, 10,198, 57, 52,142, 24, 87,162,
+ 40,171,189, 61,170,210, 81,149, 21, 73,132, 20, 2, 34, 57,245,162,154, 64,133,193, 15, 56,235, 40,171,138, 16, 19, 6,176, 86,
+ 16, 99,217,172, 54,212, 77,193,166, 31, 40, 93,193, 48, 14,184,178,162,176,197,254, 4,157,195,230, 97,196, 7, 79,158,156, 45,
+206, 88,198, 56,210, 84, 53,198, 22,120, 63, 96,172, 99, 28,122, 82, 74,108, 45,183,240,126,160, 31, 70,202,162,156,246, 17, 32,
+101, 3,192,185, 50,143,137,186, 96,181,183,162, 46, 74,108, 89,128, 66,240, 99,182,202, 84, 48,206,128, 24,178, 5, 33, 24, 53,
+172,214, 43, 76, 30, 36,121,110,136, 74,210, 72,223, 15, 32, 89, 96,147, 38,172, 8, 93, 63, 80, 55, 21,214, 88,114,148, 47,208,
+173,215,212, 85,147, 39,228, 20,243, 28,152, 4,159, 60,209, 71,218, 69,203, 24, 3,206, 90, 98, 8,248, 16,105,234,138, 20, 82,
+158,219,138,130,126, 24,105,202, 10, 77,145,189,161,195, 21, 21,133,115, 12,126,192, 96, 72, 49,178,181,179,133, 32,244, 99,143,
+115,150, 20, 66,190, 14,167,241,100,140, 33,140, 35,221, 48, 96, 68,136,192,114,177, 32,134, 44, 34, 2, 96, 13, 77,189,152, 28,
+131, 60, 23,199,148,144, 4,166, 48,168, 26,186,245, 30,139,197,130,245,122, 77,219, 44, 48,162,140, 33, 18, 99,160, 40, 74,186,
+174,163, 40,242,245, 90,215, 53,195, 56, 98, 39, 67,123, 24, 6,140, 43,113, 70, 41,138, 44,242,217, 0, 99,186,198,243, 85,161,
+ 73, 73,170, 32, 16, 98,160,116, 37, 10,244,253,128,160, 52, 77,195,238,238, 46,144,175,235,174,235, 24,135,129,168,202, 98,185,
+192, 24, 11, 41, 29, 24,119, 41, 37,140, 49, 24, 35,140, 33,226, 68, 8, 33,224,202,146,178, 40, 88,175, 87,148, 69,137,154, 44,
+148,170,138,117,118,138,218, 66,223,247, 68,141, 44,218, 5,155,110,147, 67,236, 70,216,217,218, 38,248,128,143,121,172,146,229,
+100,210, 55, 5, 99, 80,141,132, 49,167,135,114,152, 32,191, 87,215, 37, 77,211, 98, 93,113,112,142, 66, 8, 56,235, 8,193,179,
+187,187, 59, 69, 60, 18, 85, 85, 83, 20, 5,198, 76,115,196,100,112,174, 86,107,186,126,147,175, 11, 99, 8, 49, 80,149, 21, 85,
+ 91, 49,116, 3, 49, 70,234,186,193, 90,195,232, 61,227,224,177,162,212, 77,205,106,181,199, 98,177,133, 78,115, 89, 78, 37, 88,
+172, 43,232, 55, 61, 85, 85,226, 10,135, 43, 75,156,115,196,232,113, 69, 73,191,238, 49,214, 32,215,191,236,101,186,108, 91, 84,
+149,163, 71,119, 73,201,147, 18,136,152,236, 25, 35,216,170, 98,236, 58, 82, 82,138,170,162, 46,179,152, 2,108,134, 1, 73, 32,
+ 54,231,139,219,182,101,181,187, 71,179,104, 64,132,213,209,163,217, 75, 61, 16, 49,155,243,135, 8,155, 77,143,117,134,110,211,
+ 35, 2,219,219, 57, 84,186,187,187,155, 69,180, 42, 24, 54, 29, 34, 66,211, 54, 24,201,185, 42, 49, 66, 74,145, 97,240,164,148,
+104,219,150,245,122, 67,221, 84,236,173, 86, 8,138, 17,199,246,246, 18,145,156,143,136, 42, 12,227, 64,223, 13,104, 58, 54, 96,
+ 39,163,150,148,148,170,106, 24,199, 30, 91, 56,196, 42,149,171, 88,173,178,167,221, 46, 23,140, 62,146,124,200,131, 2,193, 56,
+135, 53, 6, 5,234,170,194, 26, 65,147,178,233,123,252, 36,184, 49,129, 49,154,237,136,105,208, 44, 22, 45, 34,134, 77,183, 97,
+223, 96,104,154,134, 77,191, 65, 35,136, 36,150,203,109, 54, 67, 79,242,129,182,169,179,200, 91,131,193, 50,244,221,193,133,109,
+ 69, 88,108,109,227,253, 72, 63,116,100,139,222,210,182, 45, 81, 21,166,215, 56,142, 96,132,182,110, 17,107, 73, 49, 18,162,167,
+153, 66,107, 49,122, 6,239, 49,154, 13,156, 36,233, 96, 66, 95,175,215, 40,134, 20,198, 60, 33,107,246, 26,202,186,194,199,200,
+246,214, 50, 79, 24,206,229,208,115, 89,160, 40, 14, 67, 72, 9, 87, 20,100, 47, 53,178, 94,175,113, 83,251,166,252, 33, 0,195,
+ 48, 16, 66, 96,177, 92,102,203,116,179, 97,103,103,103,154, 48,122,170,166, 65,116,186,240,114,188, 12, 0,107, 13, 81, 65,131,
+167,170,235, 28,226, 15,129, 77,215, 81,149, 37,195, 48,208, 52, 45,155,205, 6,128,162,176, 52,205, 18, 68,241,227,136, 24,195,
+208,247,217, 19,159,206,143, 49,230,192,168, 20, 17,114,106, 60,143,189,125,175,102,242, 62,216,218,218,202, 23,190,230,218, 1,
+231,236,193,100, 53,142, 99,206,245,166, 52,237, 59,123, 98, 89,137,148,186,168,242,196,108, 12,206, 89,134,161, 39,132,200,114,
+185,196, 15, 3,163,247, 40,224, 76,246,108,242,177, 50,212, 85,133,177, 22,159,211, 77,236,123, 67, 6,101, 24, 6,234,166,193,
+143, 35,198,218, 28,134, 23,203,246, 78,190,182,214,123, 57,226,229,247,141, 38, 17,138,162, 2, 35, 20, 83,253,133, 53,194, 56,
+142,244,163,103,123,123,155,113, 28, 25,134,145,182,109, 25,252, 72, 97,237,116,140, 20,231, 12,123,123,123, 24,107, 65, 21, 87,
+ 58,250,126,164,173,107, 68, 44,125,223,209, 46, 23,144, 18,162,249, 60,143, 49,224,196,144,163, 32,142,162, 40,240, 62, 34,146,
+ 13, 85, 1, 98, 84,170,202, 82, 21, 13,253, 56, 28, 8,116,140, 57,116, 91,149, 53,101, 89, 50, 78,226,217,117, 3,165,179, 89,
+ 36,156, 35,166, 72,233, 28,171,189, 53,152, 68,200,249, 84,218,182,197,123, 79,246,244, 29, 67, 78, 21, 81, 55, 13, 5, 38,123,
+ 95, 70, 80,133,205,122, 53,153,118, 80, 47, 22,132,113,196,138,165,112,246,216,184,172, 10,138,162, 66,163, 50,106, 34,248, 30,
+212, 80, 53, 21,123,187,123, 44,218,134,126,244,108, 45,151,164, 20, 73, 33, 27,199, 34,185,182, 32,165, 68,223,247, 88,103, 25,
+135,145,229,114,201,122,157,211, 82, 33, 37, 22, 77,147,231, 60,107,243,117,168,121, 30,176, 2,195,224, 17,129,166,169, 9, 33,
+209, 84, 37, 62, 37,250,205,134,162, 40,179,113,152, 2,221,186, 35,215,131, 56,138,194, 82,215, 53, 93,215, 29, 68, 68, 21,197,
+136,153, 28,154, 60,150,186,205, 58,207, 57, 76, 78, 5,224,156, 37,132, 72, 30,194,134,170,110, 24,186, 14,177, 22, 63,250, 41,
+181,147,201, 66, 36,248, 16,113,206,229, 57,157,252,185,194, 57,234,166,193, 90,203, 56, 12,217, 72,152,198,162,160,148, 69,201,
+106,179,202,122, 83,148,121,110,236, 58,234,186, 70, 20, 98,136,140,113,196,143, 30, 52, 27, 29,139,118,193, 24, 70, 64, 80, 77,
+148, 69,129,115, 14,239, 61, 97,186,182,171,162, 0,201, 17, 62,227,236,164,115, 16, 99, 2,141,164,164, 24,129,126, 24, 17, 17,
+ 84, 20, 39,249, 28,185,162, 96,209,182,248,232, 73, 49,167, 57, 99,204,243, 89, 74,154, 69,118,114,112,202,201,129, 25,199, 62,
+143, 63,192, 88, 67, 81, 22, 44,150, 11,234, 50,207, 83,189, 31,177,198, 82,150, 37,235,205, 10,171,134, 16,115,196,122,111,119,
+151,166, 89,144, 72,116,125,199,176,233, 41,234,154, 24, 34, 91, 91, 91, 57,162, 29,114,100,169,170, 42,202,178, 68,140, 16,198,
+128,188,252,149,175, 84,103, 45,168,144, 82, 0,129,123,239, 57, 66,213,180,148, 69,129,143,158,245,222, 10,131, 1, 13, 40,194,
+214,246, 54,235,205, 6, 99, 12, 91, 23, 93,132,179,134, 97,240,244,125, 71,138, 17, 68, 49,106, 64,178,183,228,189, 39,161,148,
+101,182,212,203,194,145,139, 0,210,129, 64,138,236, 91,107, 33,123, 15, 42, 7,194, 53,140, 61, 67, 63, 96, 38, 15,185, 40,221,
+129, 72, 66,206, 51,117, 99,135,134, 4,154, 80, 49, 44, 22,249,226,117,206, 97,172,101,107,107,155, 20, 19,105,178,164,208,108,
+213, 19, 19,123,235, 61, 66, 72, 24,145,201,195, 85, 54,221,154,186,110, 8,193, 83,215, 13, 34,134,164, 74,138,137,126, 28,241,
+ 93, 71,187,181,141, 17, 97,181, 94,103,171, 78, 3,162,121, 98,136,162, 56, 21, 22,211,164, 88, 21, 57, 28,185,218, 91,129,129,
+162,172,166,226,135, 44,194, 49, 70, 54,221,134,173,229, 2,107,139, 41,213,144, 39, 89,239, 61, 93, 55, 9,185, 8, 91,109,131,
+170, 64, 74,108,250,158,237,157,157,108, 92,104, 34,133,192,238,106,149,175, 17,147, 5,160,170, 42,134, 97,160,168, 42,124,159,
+133,185, 40, 28, 99, 8,128,144, 98, 96,107,177, 96,240,158,190,239,167,235, 43,123,166, 91,203, 37,163,247, 7,109, 29,199, 17,
+177,194,122,221,101,227,105,154,224,173, 49, 52,203, 37, 26, 35,155,205, 38,123,193, 34,236,236,236, 48,244, 61, 85, 89,211,245,
+ 27, 84,149,229,246, 54, 86,228, 32, 50, 34,198,224,138,130,205,106, 69, 85, 85,244,227,136, 19,153,194,179, 66,136, 89,248,199,
+113,164,109, 26, 54,195, 64,105, 45,136,230,156, 82,210,156, 47, 93,175,242,121, 77,217,232, 40,172, 48,166, 68, 91,183, 88,129,
+168,121, 50, 29,134, 1, 17, 8, 49,178, 92,108,161, 26, 25,134, 17,107,132,163,123,123,232,116, 78,116,154,108, 68, 36,135, 84,
+ 1, 72, 24,147,235, 55, 74, 99,217,244, 29,198,101,163,108,236, 71, 32,123, 82,109,219,230,232,137, 42, 91,219, 91,121,146, 19,
+139,181,121, 98,205, 97, 62,203,126,177,211, 48,140,244,211,241,169,138, 2, 91, 20, 20,214,162, 38,215,153, 88,147, 11, 10,243,
+152, 46, 16, 81,202,170,102,232, 6,124, 24, 89, 44,183, 49, 70,217,221, 59,154, 61, 73, 85,172,115, 40,176,108, 91, 54, 93,182,
+240,141,113,144, 2, 42,150, 20, 60,229, 52, 81,196, 24,176,214, 82, 20,142, 77,215,225,140,193,231,116, 83, 30, 35, 41, 81, 85,
+ 37,222, 7, 54,155, 60, 81, 45,219, 5, 98, 5, 63,142, 88,231, 72, 36,172,177,236,173,214, 89,196, 69,178, 39, 56, 29,203,253,
+185,187,110,107,156,228,126,199,148, 38,195,113, 69, 97, 45, 85,211,128, 66,223,117, 64, 54,182,203,178,152,206, 29,184,105,146,
+ 23,201,222,227,189,247, 30, 37,132, 17, 77, 9, 20,182,151, 75, 86,155,142,166, 46,241, 62, 17,213, 83,148,229,148,186,176,185,
+175, 41, 34,170,136,179,121, 82,117, 37,136, 48,108,214, 84,109, 11, 49,145,200,227, 18,157, 34, 29, 34, 20,206,225,253, 72,225,
+202,105, 60,122,198,113, 96,209, 52,116, 93, 71, 72, 9, 99, 45, 77,219,176, 89,111,168,235, 26,208, 41,245, 84, 48,250, 30, 39,
+217,128,216, 31, 39,206, 25, 66, 72, 83,120,217,225, 99, 36, 69, 79,174,163, 2,159,252,148,254, 81,162,122, 36, 10, 98, 45,214,
+154,131,194, 98, 49, 6, 63,142, 56,103, 65, 97, 28,122,124,200, 17,199,229,114, 73,156,196,202,251, 17, 37,139,154, 74, 30,227,
+ 67, 55, 28,204,179,170, 89,228,172, 53,148,101,133, 43,243,185, 23,178,168, 15,155, 13,101,211,224,108,142, 54,228, 34, 49, 65,
+236,100,196, 14, 30, 51, 25, 68,139, 69, 75, 63,246,212, 69, 54,252,115, 90,195, 33,214,144, 66, 22, 68,227, 28, 41,122, 98, 72,
+ 8, 80, 55, 13,170, 58,253, 61, 50, 12, 67, 14,141, 43,164, 24, 41,139,146,113,244,196,148,189,102, 55,141, 57,141,199,188,126,
+177,211,245,173, 57, 13,231,172,101,140,158,194, 85, 57, 66,233, 61, 49,122,172,113,144, 20,177,217, 96, 6, 67,105, 12,222, 15,
+ 20,101,142, 62,132,232, 25,123, 63, 25,121, 57, 10,161,192,208, 13, 44,150,217, 17, 14, 33,114,239,189,247,162,147, 49,104, 38,
+179, 38,169, 30, 68,171, 69, 12,174,112,148,101,193,246,246, 54, 67,223,211, 15, 35,237,162,197, 88,155,143,111, 2,145, 8,170,
+120,239, 89,175,187, 28, 61, 82,133, 4, 81, 19,206,149,217,144, 29, 7,156,205,209, 78,113,150, 69, 89,129, 49, 88, 59,213, 97,
+189,228,229, 47,215, 20, 35,105, 26,232,201, 26,210, 24, 88,108,109, 17,124,100,236, 54,196,148,208, 20, 73,211,164,152,171, 59,
+ 45, 59, 59,219,216,162, 64, 0, 31, 19, 70, 96,111,119,151,229,178, 37,231, 51,133, 24, 35, 49, 68,246,118,143, 98, 11,139,181,
+101,254, 46,201, 66,190,239,245, 24,103,176, 38, 15,202, 41,255,196, 48,140, 56,103,216,247,160, 68, 4,239, 35,198,192,114,185,
+ 68, 85,217,108, 54,180,109,195,106,179, 57,104,227, 86,219,178,233,123, 22,237, 18,231, 44, 85, 83,211,245, 35,154,242,168,117,
+214,229,252,154, 21,162,247,136, 53,196,224,217,172,214, 44, 22, 11,186,110,141,143, 1, 77, 9,231,242,137, 88,109,214,104,130,
+ 16,179,112,138, 42,251, 49, 87, 3, 68, 17, 22,139, 22,200,147,173, 1, 54, 93,199,114,185,133, 49,134,189,213, 10, 82,162,105,
+ 26, 66,204, 97, 53,231, 28,126, 28, 97,138, 64,196,105,240, 79,249, 58, 52,105,182,164, 53,135, 42,115,104, 94,217,235, 59, 76,
+ 4, 4,218,186, 5, 3,101, 89, 97, 12, 7,158,175,247, 57,188, 43,146,189,174,178,174, 15, 68,211, 90, 71, 63,142,244,125,143,
+166,152,173,231, 50,183,217,251,145,229, 98,129, 72,238, 89,183, 89, 35,198, 2,202, 48,244, 7,147, 17, 24,140, 81,218,229, 22,
+154,242,228,191, 94,173,136,154,115, 90, 42, 66,152,242, 83, 91, 91, 91, 83, 26,230,248, 74,248,186,170,216,247,214, 83, 8,248,
+233, 66, 22, 17,118,182,183, 17,231, 24,135, 14, 85,193, 24,176, 69, 69, 8, 89, 56,141, 24,156,181, 24, 99,217,108, 58,144,196,
+178,109,201, 41, 64, 61, 8,237, 91,201,169,136,168, 17,145, 28,117,104,151, 11,186,245,138,166,105,113,101, 65,232, 71, 66, 82,
+138,194,114,239,238, 46, 85, 85, 80,186, 50,123, 47,154,232,134,142,166, 89, 96,152, 66,165, 33,176,183,183, 71,142,224,180,196,
+ 41, 63, 27,198, 64, 89,151, 7, 23,118, 55,246,140,253,136, 88, 67, 91, 85, 20,117,133,149,108,205,171,228,136, 84, 97, 11, 66,
+240,180,117,139, 18, 65, 12,171,213,138,170, 42,209,168, 84, 77,133, 21, 67, 18, 33,140,158,224,199,124, 45, 56, 7, 81, 73, 6,
+156,100,207,177,168, 12,162,202,209,163, 43,234,166, 4,133,174,239,168,171,156,183,171,235, 38,143,243,201, 64,180, 98,112,101,
+137,181, 66,240,121,146,173,203,146,148,148, 49,120,188, 31, 16,177, 7, 70,142, 17, 75,210,132,106, 64,213, 64, 10,249,122,219,
+218, 98,111,119, 23, 83,150,120,239,169, 38, 47,105,244, 3,109,187,204,226,200,190, 56,230,112,239,222,222, 30, 0,238, 88, 21,
+ 52, 41,198, 44,214, 40,229,148,190, 26,199,113, 10,131,130, 43, 29,101, 81,146, 18,180,109, 22, 0,239, 3,187,187,187,212, 85,
+133, 31, 7, 66,240,108, 45,150,120,205,158,217, 48, 14,160, 57,205, 36,211,164,151, 98, 96, 24, 60,117, 83, 35,147,103,183, 90,
+175, 25, 39, 49,176,198,162,162, 52, 77,142, 48,168,128, 43, 28,253, 48, 18, 71, 79,146,148,211, 89, 69, 65, 85,215, 36, 18, 41,
+228,116,198, 24, 19, 85, 89,100,193,244, 3, 49, 38,234,162,156, 10, 23,133,162, 42,216, 76, 5,162,144, 29,146,162, 44, 8, 33,
+ 80,150,101,142, 30, 89,203, 48,120, 96,154, 47, 82,204,243,149,234, 65,148, 51,198, 28, 81,245,222,163, 83,168,124,202,161, 83,
+216,130, 36,202,178, 89, 76,121,228, 92, 85,223,212, 53,198, 90, 20, 1,205,213,224,170, 10, 2,163, 31, 24, 70, 79,105, 75,196,
+230,240, 60,154,166,235,104,154,159,109, 65,225, 28, 26, 35,113, 50, 4,242,108,173,248, 24, 16, 5, 76, 54, 1,194, 24,168,234,
+ 58, 71,203,250, 30,166,235,166,174, 42,246, 29, 6,231, 28,227, 48,224, 83, 22,245, 16, 3,214, 58,226, 56, 82,148, 69, 22, 53,
+114, 29, 16, 41,229,107,219,144, 35, 14, 46,215, 56,105,202,133,113, 85,149, 13,144, 97,232, 41,171, 26, 63,230, 90, 16, 31, 35,
+165,181,152,162,192, 40,248,224, 49, 98, 80,129,113,236, 9, 83, 42,229, 56, 36,247,202,218, 92,220,156,103,121, 88,175,215, 24,
+ 17, 18,217,105, 21,103,166, 40,209, 26, 77, 74, 85,101,163,163,105, 90, 54,221, 58,167,104,234,138,113, 28,216,222,222, 57,136,
+168,117, 93,159, 35,163, 67,142, 20, 86,117,149,195,248, 34,108,250, 1, 3, 36, 81,246,246,118, 17,178, 67, 49,248,145,232, 3,
+ 41,229, 57,232,162,139, 46, 98, 63, 45, 54, 12, 3, 68, 5,155,219,108,191,248,153,207,248,193,178, 44,114, 94,192, 90,156, 49,
+132,148, 77,234,164,145,229,162,165,170, 27,202,170, 38, 73,206,245,212,117, 77, 85, 87,172, 87, 43,252,100, 1,111, 54,107,138,
+162,152, 66, 59, 61, 69, 81,209,119, 29,214, 88, 86,171, 85, 54, 8, 12, 88,235, 48,206,178, 88, 44,240, 62, 11, 39, 34,108, 45,
+182, 40,138,146, 68, 22,178,205,254,129,106,107,218,182,205,197,101, 83,238, 34,132, 64, 72,249,100,212, 85,133, 43, 10, 72,208,
+180, 13, 49,140, 7,214, 79, 85,229,226,189,228,115, 33,131,117,142, 20,115, 40,122,240, 35,255, 63, 93,111, 26, 43,251,125,222,
+247,125,126,219,127,159, 57,151, 87,151,164, 68,147, 18, 73,201, 18, 41,107,161,182, 74, 94, 98,215,118,109,216,174, 91, 47,117,
+155,165,118,106,160, 75,146,182, 8,146,182, 9,210, 87, 5,242,166,245,139,162, 47,138,164, 91, 12,216, 48,220, 6,129, 99, 55,
+ 94,226,196,139, 44,201,150,228, 69,139, 45, 74,162,184,138, 34, 41,138, 20, 47,239, 61,231,204,252,183,223,218, 23,207,127,142,
+ 36, 59, 29,240,130, 4, 57,103,120,102,230,183, 60,207,119,123,194, 42,149,166,179,114,112,173,222, 19,125,160,233, 54,104,200,
+ 11, 87,225,140,161,170,106,140,181, 27,156,228,168,235,134, 88, 18,228, 76,183, 27, 72, 74, 17,189,103,183, 59,147, 3, 62,231,
+173,179, 13,212,117, 69, 93, 85,212,117,205, 52,207, 2,133,131,116, 98, 70,179, 27,122,234, 90,170,176,162, 4,202,159,167, 25,
+148,102, 13, 2,249,121, 31, 8, 33, 50, 47, 11, 80,208,198,210,245,242,123, 46,203, 66, 8,158,213,123, 66,140,248, 16, 72,165,
+144, 98,164, 40,129,137,151,101,161,221, 46, 81,128,117, 93,208, 74, 81, 89, 71,221,116,180,149,197, 85,142,140,252,255, 87,239,
+137, 41,208,245, 61,203, 50, 83,114,194, 85, 21,125,223,211,117, 29,109,219, 8, 39,100,205, 86, 24, 57,170,198, 81,217,211,129,
+ 30, 32, 70,176,162, 47,160, 20,225,240,140, 65,105,125,181,145,214,117,101,154, 38,124,140,104,107,133,166,233, 58,230,117, 33,
+134, 72,211,200,225,189,174, 34, 30, 33, 23,172,117, 24,173, 9, 91,135, 83,187,138,170,170,183, 42,122,194,213, 21,109,211,210,
+ 54, 45, 77,211, 48,174,211,214,201, 72, 65,169, 97,251,103,233, 2,141,117, 2,127, 7,177, 82, 46,203, 2, 69,214,143, 81,210,
+ 17,140,199, 35,155,189,110,235,168,101,255,199,152,169,106,185,152, 86,191,226,189, 39,196, 76,211, 52,164,156,232,186, 14,191,
+174, 56, 91,145, 75,102,156, 70, 17, 74,101,133, 50,210,133,151, 12,107, 10,196, 28, 81, 40,154, 90,184,178,101, 93,200, 49, 19,
+114, 66,151,140, 82, 69,186, 46,173,229, 80,216, 58,228,101,158,184, 99,223,210, 91,199,154, 18,103,103,123,166,113, 20,173, 65,
+129,166,105, 57,191,125,155,167,159,124,138, 84, 50, 41, 71,250,182,163,233, 90,172, 86, 84,117, 77,229, 42,214,101, 38,197, 68,
+ 8, 43, 57, 70,170,186,165,108, 10,121, 99, 44, 57, 71,186,174,195,185, 10, 31, 22, 20,154,190,239,153,166,137,170,105, 88,151,
+133,190,239,136, 57,162,145,142,212,199, 40,157,188, 49,140,211, 68,136, 27, 55,221, 55,130, 28,165, 76,215,203,107,202,161,239,
+ 4,245,240, 1, 99,140,104, 19,156,136,185,156,115, 91, 71, 22,183,226, 49,110,232, 77,133,181,102,187, 36,188,112,242, 57, 11,
+188,220, 10,231, 89, 74, 97, 26, 71,234,166,217,208, 18, 71, 8,129,176,174, 87, 52, 69, 78,137, 97, 16,237,130, 54, 26, 99, 53,
+203, 52, 19,203,215,184,237,166,235, 54,138,203,162,172, 97,245,158,121, 94,182,117, 36,226, 37, 31,163, 32, 99,218, 74,113,182,
+117, 91, 49,122,138, 82, 87, 69,143,181,150,148,243, 85, 87, 26,115, 70, 43, 13,165, 8, 5,172, 12, 42,151,109,127, 71, 66,242,
+248,224,241, 33,146,163,208, 21,165,100,185,196,146,160,146, 57,101,118,187,157,172,191,146, 8, 62, 80,138, 20,251,107, 8, 2,
+117, 23,129,131,231,117,146,134, 73, 41,234,170,166,169, 43,208, 10,141,102,156, 70,180, 50, 27, 26,208,162,209,172,243,130,117,
+ 66,201,101, 32,174,171,188,103,173,113, 70,144, 23,171,205,149, 32, 49,231, 44, 77, 11, 82,180,185,173,201, 56, 53, 30, 74, 73,
+ 1,160,213, 38,124, 86,242,121, 15,187, 29, 49,202,190,214,198,146, 98,194,154,138, 92,146,136, 34, 41,164, 24, 54, 52, 83, 73,
+225,189, 44, 2,205,103,161,232,154,166,102,154, 70,114, 41,248,213, 19, 99,192, 26,195,188,174,204,243,132, 95, 61,228, 66,219,
+247, 84, 86,138, 69, 16,132, 87,171,173,228, 42, 91, 83,149, 69, 96, 90, 91, 57,195,149,182,212, 77,133,213,150, 68,162,239, 90,
+105, 16,156,163,107, 91,208,208,247,253,134, 40, 1, 40,114, 6,231, 44,203, 34, 20,155, 80,114,210,153, 89, 45, 34,205, 19, 50,
+ 91,148,160,198,149,147, 59,161,170,228,254,168,170, 26,231,234, 13,113, 19,132,193, 25,131,171, 29,202,130, 95,101, 13,168, 31,
+253,143,126,162,164,148, 68,244,226,228, 48, 46,185, 96,157,147, 75, 38, 11,148,120, 24, 15, 34,138,137,158,190,237, 56, 28, 70,
+186,166,102, 10, 1,210,201, 38,224,216,239, 7, 57,116,114,226,120, 56,144, 67,162, 20,169,118,207,206,164,186, 72, 72,151,160,
+129, 80, 50, 37,201,197,174,148, 98, 94, 22,134,190, 39,120,207, 60,207,116, 93,139, 40,124, 53, 33,120,198,113,166,173,107,170,
+166,230, 4,185, 92, 94, 94,110,157,123,102, 28,143,180,117,205,188, 44, 92,187,118, 13,103, 29, 37, 67,161,112,156,150,141,131,
+116, 87,240,141,143, 65, 56, 40,227,240,201, 19, 67,132,156,104,134,158,121, 26,165,211,220,239, 24, 15,163,116, 8,125, 71,140,
+ 9,231,172, 64,208,170,208,183, 29,211, 52, 82,148,226,218,246, 30, 79,165,120, 78,137,105,146,206,232,236,236, 12,144, 13,118,
+130,167,151,101,161,169, 27,242,198,223, 28,142, 71, 74,201, 12,251, 1, 85,164,203,206, 37,209,183, 3, 49, 39,166,121,166,107,
+107, 64, 58, 85,239, 23, 42, 39, 23, 72, 86, 5, 99,180, 8, 11,149,252,172,113,142, 18, 35,227,198, 49, 67,193, 85, 53,214,124,
+ 35,188, 60, 45, 19,221,137, 95,207,249,234, 98,182, 90,104, 7,187,117, 57, 49,138, 15,244, 4, 47,101, 41, 16,229, 57,206, 93,
+ 9, 99,208,138, 92, 32,173, 43, 69,137, 24, 80,107, 65,103,148,218, 32,189, 34,162,155, 82, 10,149,181,116,195, 64,204,155,248,
+166,128,214,133,140,102,220,132,111,125, 63,112, 82, 80,199,184,105, 27,148,166,105, 27, 66, 88,233,187,158,241,112, 64, 27, 75,
+109, 45,202, 90,170,211,129, 62,141, 64, 33,103, 69, 74, 30,109, 29,181,171, 72, 41,144, 82, 97,232,123, 46,143,151, 87, 98,203,
+161, 27,182,110, 72,214,117,206, 82, 64,196, 40, 40,150,108, 63, 64, 21,233,102, 55, 8,223, 90, 3, 89,248,184,166,170, 89,252,
+ 74, 74,145,122,235,150, 15, 71,177, 50, 82,164, 2, 87, 95,119,128,160, 96, 30, 71,156,214,124,224,157,223,194, 29,119,220, 65,
+202,153, 47, 61,255, 2, 95,124,225, 43,220,124,245, 22,221,110,207,237, 91,183,120,225,249,231,185,249,202, 43,140,227,200, 60,
+ 77,252,159, 63,243, 15,249,225, 31,250, 62,158,125,250,139, 96, 12, 95,120,250,139,252,194, 47,255, 42,143,126,225, 73,206,111,
+223,150,117,189, 61,180, 17, 94,245,250,245,107, 60,248,224,253,188,254,190,215, 83,245, 3,135,139, 3,218,110,112,191, 50, 12,
+187, 29,126,245, 84, 77,133, 95, 60, 25,209,175, 0, 28,143, 66,157,184,170,186,234,132, 15,199, 35, 42, 67,191,235, 55,158,216,
+ 18,162, 40,244,221, 38,200, 44, 36,208, 22, 99, 53, 37, 41, 10,121, 59,240, 29,197,203,231,164,148,116, 69,174,170,153, 39, 41,
+160,172,179,116,109,195,229,229, 1,241,148,219,173, 19,116,144, 18,243,178,202, 97, 8, 24,229, 88,227, 34, 23,111, 81, 20, 35,
+221,248, 9,198,236,186, 14,163, 53,151, 23, 23,128,194, 86,150, 82,138, 8,237, 40,104,182,207,160,114,212,206, 80,148,226,120,
+ 24,113, 78,138,238,186,170,177, 86,248,207,227,197,133,208,126,206,208,119, 29, 39,235, 92,202, 16,214, 25, 99, 43,129,139,173,
+ 69, 23,136, 57, 17,147, 52, 3,214, 90,180,214,132, 16,208,198, 98,156, 65, 21, 54,100, 77, 62,243,174,235,248,122, 42, 40,230,
+132,198,162,181, 32, 31,130,156, 20,194, 28,228,103,252, 74, 41, 34, 82,155,230,153,202, 58, 10, 73,206,205,166,165,168,130, 95,
+ 22,170,166,197, 88,141, 46,200,247, 20, 2,235, 26,228,226, 89, 23,172, 54,196,156, 4,189, 80,130,184, 74, 35,190, 33,157, 90,
+ 81, 80,116,109,195,234, 3, 93, 87, 19,124,162,170, 5,165, 32, 23, 66,206, 24,173, 33, 75,161,179,217,239,208,200, 69,156, 82,
+218, 32,124,182, 66, 85, 40,155,190,239,132,174,181,110, 67, 52, 29, 90, 65, 34,163,209,132,148,182, 34, 93,163, 55,177,180, 86,
+154, 66,129, 92, 0,161,158, 64,206,182,147,134, 98,245, 43,226, 43,205, 20, 4,158,223,239,118,200,205, 43,136, 67, 74,130, 92,
+158, 62,239,147, 11,231, 68, 95,230,156,165, 16,212, 90,190, 11,165,105,170,150, 24, 4, 93, 88,214,133,190,239,165,217,137, 82,
+172, 53, 77,115,117, 87, 77,211,184,161,211,224, 92, 77,138,129,197,123,156,181,120,239,113,166,194,199,133, 97,183, 19,129,102,
+ 18,219, 92, 42,101,163,236, 20, 41, 9,236,223,245, 13, 78,111, 72,215, 86,224,173,107,192, 58,235, 72, 41, 74,135,216,182, 52,
+109,203,197,197,133,192, 70,117, 77, 41,114,248, 42,132,171, 0, 69, 42, 25,165, 96, 13,145,126,227, 64,227,234, 73,235,194,249,
+133,112,120,121,227,151,135,125,203,186,202,130, 67, 41, 66,244,196, 44,226,134,182,174, 49,177,112,251, 56, 81, 74,162,106,154,
+171, 78, 82, 25, 67, 85, 75,119,188,174, 11,104,177,134, 12, 93, 75, 81,106, 59, 4, 79, 28, 73, 33,164,132,184, 66,243,118, 80,
+ 42,188, 95, 9, 33, 82, 85, 53,171, 95,153,103,185,152,189,242,136,119,112, 79, 99, 43, 60, 19,177,200, 66, 17,254, 57, 19,214,
+192,217,217, 25, 33, 6,214,113,165, 31,122, 14,151, 71,142,135, 3,104, 69, 81, 45,195,208,109, 23,148, 98,216,159, 1, 69, 4,
+ 40, 49,161, 52,236,250, 30,248, 90,101,234,189,167,170,165,163, 52, 90,170,252,170, 18,229,237,178,122,250,173,178, 51,174, 18,
+ 40, 47, 6,140, 21, 20, 34,108,174,131,202,136, 2, 90,161,136, 65, 32,186,121, 89,232,186, 22,165,229,130, 16,181,169,108,128,
+105,154, 68,152,178,125,150,243,178, 96, 82, 34, 43, 37,162, 53,103, 81, 40, 82, 72, 76, 89,196,110, 49, 70,188, 22, 14, 87,183,
+114,209,151, 34, 21,240, 52,142, 84, 77,195, 50,139,248, 70, 84,163,178, 41, 5, 41, 9,216, 74,170,201,101,158, 73, 86, 83,219,
+138, 16, 3,125, 63, 16, 82,192,137, 13,139,188,253,174,198,106, 42, 43, 66,143, 18, 10,186, 82,140,243, 76,137, 34,156,219,237,
+118,164, 20, 89,215, 25,103, 69, 9, 91, 87, 98, 3, 10, 49, 96,141,130,226,200, 41, 81, 87, 21, 62, 68,138, 42, 44,211, 4,125,
+ 71, 73,145, 82, 4,242, 22,170,160, 38,103,161, 80,188,151,245, 81,148, 28, 0,253,208, 67,129, 24, 34,174,170, 88,252,130,159,
+103,118,187,221,149, 40,205,123, 79, 91, 59,198,121,166,107,123,230,113,150,181,152, 60, 37, 59,218,166,101,245, 43,107, 16,129,
+ 89,201,137,146,217, 96,122, 67, 85, 9,167,122, 60, 92,162,183, 42, 61,198,200,225,252,130,231,158,121,138,191,243,211,255, 49,
+ 63,249,227, 63,140,174, 43,198,151, 94,225,239,254,198,111,242,219, 31,249, 40,135,227,184, 81, 52,127,241,241,217,199,159,224,
+251,255,210,183, 49, 47, 43, 95,120,234, 25,126,245,183, 62,196,239,125,228, 99, 87,255, 93,171,237,188, 67, 10,205,121,156,249,
+111,255,222,223,230,181, 55,110,112,223, 61,119,243,186,187,238,228, 95,126,228,163,252,222, 31,127,138,155,231, 7,214,101,229,
+242,112, 73,101, 52,111,125,232, 45,236,239,184,193, 97, 62,114,184, 60, 80,213,142,182,235, 80, 64, 74, 73, 14,164,224, 49,104,
+186,125, 39, 93,101,136, 40,109,241, 62, 82,215,134,117,158,161, 20,138, 49,180,149,149, 67,215, 66,166, 64,209, 88,163,209,174,
+134,156,153,231,229,234,146,161,100,218,190,195, 26,197,113, 20, 37,176,181,178,191,215,121,166,132, 72, 46,114, 57,180, 77, 75,
+ 46, 9,159, 61,186, 24, 86, 31,168,107, 71, 14,178, 31,173,182, 36, 31,241,203, 76,206,178, 63, 92,237, 24,199,137,161,239, 65,
+ 43,150,101,164,177, 13, 85,229, 40,104,252, 26,105, 59, 81, 41, 91,171,113, 27,180,123, 56,172,212,109, 75,191,219,145, 40,148,
+148, 57, 94, 28,176,149, 99,183,223, 1,137,178,105,146,156,177,148,156,200,198,162,177,244,181, 35,248, 72,202,249,138, 11, 45,
+136,112,179,174, 26,186,174, 39, 70, 17,200, 78,147,104, 11,156,181,248, 20,113,198, 81, 85, 48,142,139,192,211, 89, 58,111,165,
+ 20, 54,107,148,210,180,125,203,120, 28,229,108, 41,129,186,106, 56, 59,171, 8, 41,112, 56,151, 2,217,185, 74, 56, 89,109,152,
+166, 69, 16, 44,173, 49, 70,116, 56, 49,103,252, 50, 83, 53, 53, 86, 25,230, 85,138, 43,165,183,206, 16, 67,222,246, 67,206, 82,
+164,134,232, 73, 49, 80,183, 29,138, 66, 41,137,227, 40,194,199, 97,183,163,212, 53, 57, 70,124,140,228,109, 79, 86,174,194,108,
+ 2, 71,107,161,174,107, 74, 41, 36,239,153, 66,220, 46,241, 64, 73, 80, 57, 67,214, 25,107, 12, 85,223, 95, 21,247, 57, 23,208,
+ 66, 91,106, 43, 78, 7,183, 53, 34,202,218,171,162,209, 90,185, 28, 53,138,148, 34, 62,120,150,121, 38,171, 66,227, 26,230, 69,
+ 80,130,105, 28,161,108,154,148,146, 56, 76, 34,104,182,198,200, 30, 82, 26, 52,212, 70,186,232,227,241, 72,211,136,179, 66,190,
+ 75,152,231, 25,144,123, 46, 4, 65,204,114,201, 91, 99, 34,212,231,186, 9,155, 41,162, 35, 72,243, 76, 8,210,124, 28, 15,151,
+ 12,187, 61,227, 38,212,222,123,144, 35,198, 0, 0, 32, 0, 73, 68, 65, 84,237,246, 72,126,203, 74,206,133,156, 35,199,203, 35,
+202,168,147,116, 13,107, 5,129,178, 49, 38,154,170, 67,212,138,210, 69, 25,103,174, 22,138, 49,134,113,158,196,202,213,201, 5,
+ 45,149,168, 8,226,160, 34,204, 51, 42, 70,112, 21, 57,122, 80, 45, 41,102,134,253, 78,186,185,180, 48, 79,203,149,186,157, 18,
+ 37, 4,160, 20,230,213,147,179, 40, 66,189,247, 92,191,118,109,131,155, 2,109, 91, 51, 78,242,198, 67, 20,177,222,229,113, 83,
+ 19, 90,205,174, 23,203, 68,201,133,203,219,231,226, 55, 55, 18,120,226,156,219,120,169, 64,140, 2, 91,231, 36,139,178,107,234,
+ 77, 36, 22, 81,166,102,119,182,231,246,237,219,156,148,153, 18,162,176,193,126, 85,141,183, 30,173, 20,103,103,123,110, 95, 8,
+127, 87, 50,140,243, 44,159,211,246,229, 85,206,225,125, 32, 6, 81,116,198,197,179, 59,219,209,117,162, 78, 93,102,233, 94, 98,
+ 8, 4,239, 55,120,210,227,215, 0,170,160,181, 98,127,182, 39, 69,209, 56, 24, 45, 29,183,171,132,143,118,157,221,212,150, 82,
+ 84,105,109,183,110, 82,248,200,166,107, 4,238, 92, 87,121,126, 93, 99,141,162,218,236, 84,185, 20,170,173, 43, 57, 63, 63,151,
+207, 81, 67, 70,211,117, 29, 74,107,252, 6, 71, 42, 32,105,129,197, 82, 74, 28, 14, 35, 57, 71,114,206,196, 81,180, 7, 49,110,
+137, 74,102, 91, 43,214,208,245, 61,104, 17,195, 40, 99,216,247,131, 28, 92,193,162,180,161,175, 42,230, 73, 14,213,170,170,112,
+174, 34,172, 11, 1,131,209,144, 82,220,208,139,154, 67, 8,204,235,140, 42,154,202, 89,114, 73,204,203,132,171, 29,185, 24, 66,
+244,128, 22,234,167,106,136, 33, 80,200,162, 68,117, 21, 41, 22,150,237,243, 50,214, 10,236,218, 9, 10, 80,112,228, 28,233,251,
+ 86, 14,168,156,233,218, 78,120, 44, 37, 93, 67, 46,153, 24, 34, 67,223,179,174,158, 84, 34,108, 69,193,186, 8,148,121, 56, 92,
+ 96,173,165,118, 53, 49, 42, 80,194, 13,250, 16,216,109,112,163,113,150,186,110,184,214,206,188,233, 45,111,231,158, 27,119, 49,
+126,245, 38,191,245,251, 31,227,227,159,248, 83,150,101,225,120, 56,240,189,223,254,126,254,187,255,225,191,231, 91,191,237,253,
+ 60,247,212, 51,252,163,159,255,167, 76, 97,225, 43, 95,121,121, 43, 94,191,241, 66,191,247,181,119,241,222,183,191,141,247, 62,
+242, 54,238,190,243, 78,198,121,230,142,221,142, 23, 95,254, 42, 79,191,240,252, 55, 60, 55, 23,184,235,250,117,222,243,206,111,
+225,238, 27, 55,184,251,206,235,220,177,219,241,192,235,191,137,107,251, 61,255,242,131, 31,225, 31,255,194, 63,229,177, 39,159,
+150,181,227, 28, 15,222,123, 15, 63,242,239,255, 16,111,126,224,126,218,182,225,197,155,183,120,246,229,155,124,233,149,155, 84,
+ 8,119, 43,176, 37, 84,174,150, 78, 56, 5,114,202,212,174, 34,230, 64,229,132, 55,237,134, 30,133, 69, 91,132, 66, 74,133,170,
+169,101, 79, 56, 73, 24,107,106,131, 95, 86,150,101,101, 24,134,141, 34,130,236, 35,115, 78,164, 34,154, 19,231,196,214,232,140,
+163,144, 9,171,167, 31,122, 98,220, 68, 73, 74, 17, 83,102,215,182,196, 12,169,136,141,113, 89, 61, 80, 68, 27,144, 10,117, 87,
+145, 66, 68,169,205, 53,208, 84,148,152, 81, 22,178,214,148,148,112, 85, 77, 42,137,221,176,219,186,180,133,156,139, 32,128, 37,
+177,172, 43, 10, 67,211, 84,104,165,232,122, 41,244, 99,150,195, 90, 21,217,135, 20,133, 49, 10,165, 32,199, 8, 20,140, 22,180,
+210,214, 13,168, 76,240, 65,144,185,188,113,233, 37,137,118,128,204, 52,175, 88,109,161, 20,209, 63, 24, 77,201,133,170,169,200,
+ 57,110, 72,107,133,247, 19,226,228,169,209, 78,179,142, 43, 90, 37,140,209,228,141,174, 50,206,113, 56, 30,229, 18,168,229, 61,
+ 23, 45,252,124, 42,137,156, 34, 57,102,250, 65,212,236, 49,166,237, 44, 45, 56, 99,113, 27,165, 20, 83,162, 40,185, 88, 93, 85,
+ 81,185,106,163, 53, 60, 93,215,227,253,202, 73,252,231,215,149, 16, 3,117,211,210,183, 45, 41,103, 78,154, 41,103, 29, 41, 70,
+ 82, 46, 28,143, 7,156,171, 48,206,144, 67, 36,230, 40,159,181, 21, 97,171,213, 22, 40,178,215,139, 52,128, 26,185,138,148, 41,
+228,162,176,219, 61,134,102,235,110, 69,116,152,179, 52, 32,166,214, 88,219,136,102, 6, 69,242, 11, 99, 24, 81, 90,145, 83, 38,
+149,130, 51,210, 48, 58,231, 4,253, 84, 26, 87, 85,232, 82,112,217, 92, 61,183, 20,209,122, 89,235, 56, 30, 46, 5, 45, 89, 87,
+234, 70,206,236,178, 85,210, 39, 7,143, 15, 18,170,182,223,239,200, 57, 17,183, 80, 86, 31,253,230,226, 26,113, 78, 46,239,121,
+ 89, 54, 88,222,112, 18, 9, 59,231,136, 41,114,184,136,155,182, 77, 10,180,184,113,244, 41, 70,172, 82, 90,196, 30,243,132,223,
+ 58,213,161, 25, 88, 67, 96,156,103,154,106,235, 26,189,112, 43,117,227, 8,171,168,161,217, 42,255,237,111,144, 34,251, 59,174,
+ 19,130, 88,119, 82,138,164, 20,169, 54,193, 68,136,113,131,211, 10,109,215, 49, 47, 11,165,136, 69,162,107, 58,129,210,128,166,
+ 17,111,159,247, 2, 81, 55,141, 84, 68, 0,151, 23,151,156,188,232,194, 75, 20,178, 42,232,156,160,106, 40, 73, 32,221,170,174,
+ 57, 65,188,227, 40, 85, 83,191, 19,159,164, 53,154, 90,181, 18,196,225, 68,164,178,219,137,253,109, 28,183, 10, 55,101,234, 90,
+ 44, 57, 77, 83,115,234,184, 21,229,202, 30, 37, 98,193, 29, 41, 21,172, 53,114,152,213,242,122, 58,138, 55,243,226,226,124,243,
+ 20,139,170, 52,198, 32, 62,229, 16,200, 10, 98, 72,236,247, 3,243, 44,190,255,117, 14,194, 31,110,188, 49,112,101, 23, 42, 69,
+248,100,191,172, 20, 37,133, 68,206,153,232, 3,227, 60,225, 47, 61,117, 35,220,152, 49, 78, 4, 62,182, 38,248, 64,219, 52,172,
+ 33,160, 16,213,108, 93, 57,214,120, 90,180,142,113, 28,233,187,238, 10, 78,157,167,137,162, 68,217,236,172, 40, 55, 23,159, 24,
+186, 65, 10,139, 36,137, 95,245,246,189, 40,173, 69,181,110, 12,203, 60,211,181, 29,228,132,217, 32,125,187,121, 62, 67,140,104,
+ 43,188,186, 40,102, 87,108,181, 89,178, 4,104,184,226,215, 85, 41, 44,179,192,127, 49,105,154, 90, 60,176,165, 40,250,206, 98,
+ 92,131,202,138,162,107,194,234, 17, 15,186,226,236,172, 37,229, 36,220,181,209, 84, 78,224,210,156,133,158,145, 77, 18,113,206,
+224,140, 99, 94, 15,178,225, 22, 73, 97,139, 41,162, 16,244,161,174,164,163,169,107, 71,206,134, 20,133,238, 41, 72, 33, 83,183,
+ 53, 77, 35, 7,121,183,107,209, 24, 4, 30,214, 44, 94, 14,194, 93,147,249,137,239,232,121,223,119,252,101,108,117, 31,235,205,
+ 87,249,141, 23, 95,230,217, 47, 62,207, 23,159,126,154,211,227,227,127,242, 41,238, 24,118,188,241, 13,247,241,242,205, 87, 65,
+193,111,254,238, 71,184,125,126,193,191,233,241,194, 75, 95, 69,155, 47,240,190,119,189,147,239,249,192,191, 69,161,240,251,127,
+252, 73,190,244,229,175,112,243,230,173, 63,247,108,205,229, 52,241,103,159,127,156,127,251,219,246,124,243,253, 15,240,238,183,
+191, 21,103, 29,159,122,244,243,252,242,191,250,157,171, 11, 29,228,128,127,225,171, 55,121,244,177,199,185,235, 53,215,121,229,
+214,171,204,243,202, 29,149, 70,237,123, 94,186,188,228,230, 97, 97, 56,219, 75,145,169, 53, 86, 43, 44, 2,237,231,156,201,235,
+140,117, 13, 49,140, 88, 37, 97, 53, 49, 66, 92, 3,195, 78,232, 50,201, 25, 88,113,251, 61,243,188,114, 74,119, 43, 37, 83, 87,
+ 53,235,234, 49, 6,148,113,212, 27,106,229, 67,194, 58, 69, 44, 25, 85,138, 80, 27, 73,177, 46, 11, 77, 93,225,215, 72, 85, 27,
+ 98, 10,162,129, 49,114,168, 91,163, 55,136, 91, 99, 43,185,180,165, 0,105,129,204, 52,173,104,171, 89,131,164,131, 85,181, 32,
+ 58, 57, 25, 98, 90,105,235, 6,172,124,239,185, 72, 65,108,141, 37,172, 43,133,194,238,250,117,166,241, 32,103,143, 82, 40,231,
+168,141, 35, 7,161,113,150, 44,250, 11,201,209,144,215, 95,231,137, 92, 34, 86, 87, 88, 91,112, 78, 50, 24, 10,153, 18, 11, 99,
+156,164,123,111, 58, 65,226,178,208, 67,182, 56,178, 74, 40, 3,165,104,116,165,201, 25,154,182,193, 47, 51,125, 47,226, 80,138,
+ 36, 41, 42,173, 88,214, 5,173, 68, 41,175,181,166,105,154,173,235,222,196,200, 41,129, 86, 36,109, 24,215, 9,230, 21,173,217,
+212,235, 82,196,201,247, 38,250,152,253,126, 79, 10,153,170,170,161, 8,172, 45, 23,161,232, 35, 50, 18, 90, 99, 67, 32,101,209,
+131,132, 16, 36,109, 81, 41,154,166, 38, 68,233, 90,141,214, 34,200, 70, 80, 50,180,194,104, 75,223,186,205,205,145,136, 89, 92,
+ 81,139,151,247, 1,128, 82,184,202, 2,122, 91, 55, 9,178,132, 83,165, 44,157,255,186,172,204, 97,227,176,115,166,168, 26,173,
+244,149,139,170,174,165, 96, 43, 89,212,231, 70, 21,234,182,195,101, 68,132,152, 11,182,182, 27,157,105, 64,139, 96,122,153, 39,
+ 40,108,162,194, 66, 81,133,121,211, 29,196, 49, 82, 82, 33,102,105, 10,218,166, 33,166, 64, 10, 17,219, 52,132, 40,122, 50,165,
+228,142, 50,218,162,173, 34,103,161, 0,154,174, 38,250, 0, 25,172, 51,148, 34,148, 84, 93, 55, 24,107,174,180, 0, 33,120, 32,
+ 83,153,154, 24,196, 65, 97,235,186,134,172,104,235,158, 53,142, 44,139, 92,209,214,234,171,139, 83, 46,185,200, 56,143,196, 24,
+105, 27,169, 24, 74,146, 11,185, 31, 6,166,101,145,168, 83, 54,129,209,102,117,241, 62,176,219,237,229,208,206,226,109,237,186,
+ 30,165, 33,167, 2,218,108,138,243, 25, 87, 89,150,113,196,110,220, 68, 91,213, 87, 10,237,166,110, 88,252,194,217,217,153,124,
+ 1,165, 72,229, 86, 85, 52, 40, 14,171,135,101, 69, 85, 21,227, 56,161,149,116,185,194,145, 40,134,190,195,214, 13, 49, 68,236,
+182,232, 84, 22,158,101, 94,132,123,170,235,250,138,231, 60,241, 42, 33,136,141,175,170, 28,203, 60, 83, 87,245,149, 7, 56, 43,
+133,214, 22, 99, 20,151, 23, 23, 34, 76,139,145, 76,166,222,237, 41, 49,145,146, 71, 35,190,213, 16, 3,231,183,207,105,187, 86,
+ 20,251,227,132,181,142,146, 36, 70,117,222, 68,116,226,111,118,116,109, 45, 65, 33, 49,138,168, 79, 73,151,104,156,120, 90,141,
+ 49, 76,203, 68,142, 98,167,232,135,129,113, 58,146,181, 37,174, 11, 70, 75,149,105,172,149,170,186,136, 55,119,183,219,113,251,
+252, 54, 57,109, 28,140, 21,187,198,188, 44,196, 32, 2,165, 24, 35,198, 57,209, 88, 40,141,173,106,134,202,162, 50,236,247,123,
+166,233, 72,152,226,182,153, 65,105,197,176,235,185,188, 60,208,183, 45,151,151, 7,249,253, 54,175, 47,232,171,239,164,174,107,
+ 82,204, 2, 97, 53, 13,201,123, 34,158, 72,222, 10,181,140, 95, 22,140, 50,116,195, 64, 33, 19, 67, 96,154,228,128, 11,155, 95,
+126, 89,165, 51,175, 43,183,193,152, 14,103, 52,209,199,171, 12,129, 83, 49, 49, 77, 35,243,188, 0, 95, 91, 19, 49,106, 86, 45,
+133,192, 50, 77,236,247,178, 78, 65, 32,234, 20, 35,174,174, 25, 47, 47,197,186, 21,163,172, 89, 36,217, 46,229, 76, 91, 55, 76,
+ 91, 40,134,213, 2, 39,151, 82, 72,169,208,182,150,183,222,173,249, 27,223,254, 26,250, 55,255, 36, 31,254,232,163,188,122,235,
+ 83,124,242,209,207,243,171,191,245,187, 60,251,194,139, 92, 59,219,243,218, 27, 55,176,214,242,239,124,199,251,249,129,239,254,
+ 46, 14,199,145, 71, 31,127,146,103, 95,248, 50,181, 19,241,161,143, 97, 59,195,132, 10,121,239, 59,223,198,178,122,190,233,181,
+119,243,222,119,190,149,126,104,249,212,163,159,231,209, 47, 60,201,111,127,248,163,156,111, 1, 32, 95,123,136, 31,250,197,101,
+225, 95,127,248, 99,188,255,145, 71,184,235,238,187,121,252,241, 39,248,208, 31,254, 49,159,250,204,103,249,243, 15, 13, 60,254,
+244, 23,121,251,195,111,225, 29, 15, 63,196,239,252,254, 31,240,167,159,127,130,182,169,121,234,139,207,242,210,171,183, 49, 90,
+243,250,251,223,192,155, 30,188,159,123,239,189,151,132,116,226,126,245, 20, 10,117,213, 96,172, 68,131,174,113,165, 36,241, 33,
+175,243, 44, 33, 86, 33,202,133,115,156,112,157, 35,134, 32,231,192, 52, 35, 28,105,166,108,240,190, 13, 14,200,196, 28, 73, 65,
+227, 42,131, 53, 14,133,194,135, 9,133, 98,157, 87,170,166, 38, 3, 37,101,180, 18,248,243,132, 66,234,162, 73, 57, 94, 33, 31,
+ 18, 28, 34, 58,147,170,134,101, 93, 40,185,108,130, 52, 79,140,114,161,245, 93,199, 26,196, 17, 16,130, 52, 27,178,103,165,192,
+175,149, 37,153, 72,215,182,172, 49, 80,226,182, 14,138,192,218, 39,238, 56,248, 40,133, 96, 85,161, 96,227,185,229, 34,111,183,
+ 98,104,232,132,166,138, 49,108,133,179,132,176,212,117,205,120,220,242, 22,106,135,213,150,202, 73, 65,156, 98, 66,233, 36, 22,
+ 83,107, 8, 41, 50, 30, 36, 65, 77,208, 16, 67, 83, 55,232, 86, 75, 71,151, 18,182,178,104,196,109, 1, 66,241,105,160,170, 68,
+215, 80, 85, 82,236,215,109, 67,244,158, 83, 0,211,186,174,228,156,153,231,153,147, 79,223, 7,121,205,211,159, 82, 68,208, 89,
+140, 33,147,113,174,194, 57, 75,201,153,227,241,184,169,210, 45,182,174,168,234,138,146, 50,235,188,210,117, 45,203,186,146,130,
+167,216, 10, 66, 36,110,205,135, 20,233,106,211,167,112,117,158,248, 24, 73, 65,190,183,144, 68,159,224,172, 67,233,194,225,114,
+ 2, 37,226,191,166,149,144,176,101,154,229,130, 7,177,236, 38,225,205, 83, 46,184, 90,211,208,177, 76,203,182, 9,180,104,125,
+162, 8, 76,115,216, 82,249,146,228,120,212,141, 52, 53,243,178,108,239, 81, 26,211,227,225, 64,218,186,244,227,113, 60, 37,242,
+ 93,105,145,230,121, 33,103, 9,136,178,149, 35,120, 79,229,106,148, 65, 28, 22, 33,147,114,226,218,217, 25, 34, 12, 54, 66,233,
+173, 30,181, 74, 22, 67,240, 43,117,215, 97,182,239, 63,213,219,165, 14,133, 37,136,197,162,105,164, 19,170,235, 26,140, 97, 89,
+ 87,186,166,225,242,226, 66,224,204, 32,144,163,209,134, 57, 78,144, 11,203,188,136,128, 32, 74, 74,210, 18, 34,121, 94,216,237,
+ 6, 82, 78,212,109,139, 4,139,120,154,166,193, 86,150,121,150, 15,117,191, 27,196,147,152, 51,243, 52,145,147, 36,111, 57, 99,
+240, 25,198,121, 68,109,149, 80,206, 17,103,132,127, 94,125, 32,172, 11, 41,101,250,190,231,120, 56,208,236,119,226,119,212, 16,
+214, 5,138, 66,169,194,181,107,215,160, 40,170,218,177, 70,177, 82,121,239,201, 64,213,117, 28,183,244,186,168, 51,235,197, 5,
+117,221,110, 92, 92,141,179,134, 83,238, 49, 40,241,180,182, 18, 3,153,203,169, 99,151,215, 43,202,144,194,132,206, 18,178,225,
+ 20,168,166,226,120,140,228, 40, 11, 45,109,215,219, 50, 47,184,166,218,196, 63,114,153,246, 86,132, 50,189,235, 57, 78, 71, 66,
+240, 76, 37, 49, 79,139,132,240,172, 30, 5,132, 32,138,234, 16, 35,203, 6, 65,245,125,207, 73,128, 88, 59,217,100,139, 95, 41,
+ 41, 95,121,106, 79, 62,216, 20, 35,182,174, 57,219,159,113,126,126,206,186,174,132, 16,232,186,238,170, 96, 9, 33,160,140, 8,
+127, 82, 76, 44,179, 92,120,165,104,178,150,203,171,237, 6, 98,136, 44,203,132,219, 14, 22,138, 28, 4,211,178,130, 42,244,125,
+ 75,140, 34, 12,242,171,199,181,205,213, 97,218,180, 13,243, 52, 17, 66,144,195,201,106, 82, 73,180,173, 64,123,148,130,110, 29,
+ 57,138, 32, 46,103, 9, 89,208,218, 82,181,181,160, 71, 81,214, 68,200,153,174,170,164,131,217,232,133,147,175,159, 40, 86,185,
+121, 94,200, 41, 35, 98, 61,182, 67,121,144,138,127, 19,187,205,243, 66,219, 54,242,115, 74,177,120,207,186, 65,112,165, 20,200,
+ 17,231, 68,157,157,179,188,150, 95, 3, 93,219, 64, 73, 24, 85, 72, 40,238,218,195, 27,175, 37,222,250,154,149,183,222, 85,208,
+247,255, 24, 47, 95,140, 4, 63,243, 75,191,241, 91,124,240,163,127, 40,212, 13,112,253,142,107,124,251,251,222,205, 7,222,243,
+ 78, 46, 46, 14,220,124,245, 38, 47,190,244, 18, 31,254,248,159,240,185, 39,158,228,165, 87,110,242,245,143,147,128,231,179,143,
+ 63,197,127,245,215,255, 42, 63,253, 31,254, 40,119,156,237,121,254,197,151,249,212,103,191,192,199, 62,241, 41,137, 31,254,186,
+199, 93,175,185,206, 59, 30,126,136, 7,238,251, 38,222,253,246,183,242, 67,223,243,157,244, 55, 94,195,173, 23,191,194, 39, 63,
+247, 24,159,121,236, 9, 46, 54,244,233,244,120,228,173, 15,241, 29, 31,120, 47,181,117, 28,199, 35, 23,151, 7,126,234,199,127,
+132, 71,190,229, 73,126,230,127,251, 89, 94,120,233,171, 0, 68, 64, 5,207,119,189,243,109,220,119,239, 55, 17, 66,224,137,231,
+158,231,229,219, 7,142, 27,114, 98,177,172,126,165,113, 21,197, 66,206, 98,115, 21, 8, 90,144,190,182,173, 41, 90, 99, 81,132,
+ 53,224,122, 75, 92, 19,174, 50, 40,165,233,235,134, 80, 18,100,232,107, 41,188, 79, 26, 15,173, 13,218, 74, 87, 40,235,201,112,
+ 24, 71,134,161,199, 47, 43, 18, 93, 43,235, 66, 25, 89,167,214,218, 45, 91, 96, 97,153, 38, 52, 16,180,208,119, 73,101,162, 95,
+ 41, 69,209,184,154,162, 11, 97, 21, 46, 19, 3, 70,105, 81,238,199, 68, 83, 73,180,181,214, 91,178,162,146, 36,187, 82,144,162,
+164,192,225, 40, 5,174, 86, 90,130,123,148,218,130,100, 10, 85, 45,121,251, 49, 4,188, 22,139,210, 48,116,184, 98,168,250,129,
+147, 71,186, 20,205, 73,196,149,115,166, 50,149, 56, 76,116,129, 34, 93,235, 60, 79, 87,235,195,106, 41,170,180,209,114,169, 42,
+ 71, 8,145,182,237, 24, 6, 71, 73,210, 53,199,226,101,175, 89, 75,165,229, 44,179,206,210,234, 22,109, 12,117, 91,147, 82,160,
+239, 58,170,166,230,120, 56,114,210, 61,173,171, 52, 32,198,172,236,207,118, 88, 43,186,150,101,145,203, 57, 36, 9,145, 66, 27,
+ 86, 37,188,114,101, 45,169, 8,124,158, 67, 4,191, 48,116, 3, 62, 74, 74,163,214,154,174,105, 5,161,161,108,251, 85, 52, 25,
+ 33, 69, 86,191, 89, 58, 21, 40, 37, 14,139, 83,158,123,211,212,148, 85,222, 87,101, 12, 90, 59,234, 90,220, 18, 97,163, 44,226,
+ 26,168, 43, 71,202,226,243, 62,191,184,144,215,210, 90, 10,178,117, 69,105, 57, 47,155,173,163,134, 66,142, 17, 91, 59,162,247,
+212,174, 66,213,138,117,241,172,203, 34,247, 10,153,182,174, 55,250,192,209, 14, 3,228, 76,218,180, 3,192, 85, 83,165,181,166,
+235, 90,252,102,183, 44, 89,156, 97, 74, 9,189, 97,186, 78,104,131, 8,199,227,145,161, 27, 48,141, 22, 29,145, 21,186,195,175,
+ 30,227, 44,148,132,247, 25, 99,165, 17, 77, 49, 97,151,101, 36, 23,216, 13, 59,198,121, 65,107, 81,250, 53, 27, 55, 17, 82,160,
+168, 66,138,158,168, 10,214, 72, 7,187,219,237, 8,126, 37,132,204,116, 60,210, 54,155,117, 68, 27, 60,112,113,121, 73, 93, 85,
+ 88,224,114,148, 92,228,148, 4, 14,169, 76,225, 56, 29, 57,142, 35,187,253,126, 91,136,133,227,241,136,209, 26,183,223,211, 15,
+114,112,202,144, 20,203,225,242,192, 41,121,104,232, 7,146,118,228,184,114, 56, 28, 17, 46,220,176, 46,146,240,213,109,139,207,
+ 24, 81,151,239,247,123,150,117, 65, 41,205,178,200, 7,105,156, 65, 81, 49, 12, 29,160,185, 56, 63,167, 32,254, 92,101, 20,243,
+ 60, 49, 23,225,189,208, 90,132, 16,206,137, 40, 65,201,162, 42, 10,216, 46,146, 94, 21,110, 77, 72,231,170, 53,199,113,164,105,
+123,246,103, 59,114,201, 76,199,153, 97,104, 89,180, 68,106,158, 16,144,144,146, 92, 18,100,200,136, 71,180,106, 41, 69, 44,123,
+ 74, 43,129,138,171, 10,171,245,213,166,118,206, 17,151, 21,178,112,245, 85, 93, 1, 10,146, 34, 18, 33, 23,172,214,204,147,160,
+ 22,218,138, 18, 60,169,173,227,204,146, 13,238,204,102,231, 41, 5, 69,145,207,106, 89,208,198, 16,214,128,178,162,188,245, 62,
+146,114, 34,248, 21,103, 45, 93,215,160,117,133,209, 5, 99, 78, 65, 34,114, 88,199,228, 25,186,225,106, 17, 27,109, 49,214, 64,
+209,212,181,102,245, 43,106, 85,116, 93,143, 28,233,210, 25,107, 99,152,143, 51,174, 22,231,133, 82,144,148,240,108, 98,109,203,
+204,179,104, 42, 42, 87, 49, 12, 61, 57, 23,252, 52,177,174, 51, 41, 21, 76, 18, 81,224,149,101, 40, 37,226, 34,223,189,182,154,
+182,170,169,183,164, 45,173,244,166, 60, 21, 78,116,153, 34,151, 23,151,160,196,110, 56, 12, 3, 62,136, 98,214,213,162,224, 62,
+217, 93,150,117, 37,248,192,251,223, 92,241,174,123, 39, 6,235,120,195,107,224,158, 42,160,183,247,116, 76, 29, 47,199,111,161,
+ 43, 61, 23,183, 95, 32,248,192,127,253,211,127,141,187,239,188,193,207,253,210, 47, 19, 67,226,153,103,159,227,158, 59,111,160,
+141,230,190,215,221, 69,215,222, 75, 74, 35,111,126,240,126,110,222,186,197,229,225,200, 56, 73, 1,112,122,188,238,238, 59,249,
+193,239,254, 78,174, 95,187,198,151,191,242, 50, 74, 25,190,244,229,175, 48,205, 19,215,206,246, 92,108, 41, 86, 0, 15,190,254,
+ 94,254,230, 79,253, 21,126,224,187,190,131, 59,206,206,168,234,138,232, 61,231, 47,190,204,227,207, 60,203, 52, 47, 18,136,180,
+117, 21, 39, 36,224,242,120,196, 42,205, 59, 30,126,179,116,248, 47,191,196,115, 47,190,200,229,241,200,245,179, 61, 47,190,100,
+241, 33,114,215,141,235,188,253,225,183,160,141,230,252,252,156, 47,191,244, 50,255,215,255,243,207,241,193,115,239,235, 94,199,
+189,111,124, 35,109,211,209,247, 98, 83, 36, 75,188,174, 40,151, 21, 85,211,225,140, 35,197, 68, 33,211,237,122,198, 75,113,218,
+152, 70,168, 28,173, 69, 8,151,183,245, 20,146, 68,208, 58,163,105,251,142,117, 94, 69,157,159,229,160, 95,203,138, 49, 48, 29,
+143, 82,156,246, 3, 20,133, 15,126, 19, 98, 10,191, 28, 99,100,241,226, 21, 94, 22, 73,236,130,130, 81,208, 52, 29,214,176,137,
+ 78, 50,197, 73,116,109, 78, 17, 83, 11,199, 89, 82, 98,216, 13,162, 1,138, 34,122,211, 74, 38, 25, 30, 14, 7,177, 57, 89,205,
+208,247,200,209, 37, 22,215,156,210,134,134, 37, 74,129,121,157, 57, 69,101, 75, 1, 11,211, 58, 35,241,213, 95, 27, 36,210,117,
+ 59,156,171,201, 37,161,209, 84,218, 32, 73,124, 2,129,119, 90,179,172, 66, 41, 42,101,104, 20, 20, 37, 9,103,126,163, 0, 82,
+240,196,128,172,249,237, 28, 90, 67, 32,197,136, 49,178,114,167,113,102,216,245,140,135, 17,179,209, 86,166,174,208,218,176, 59,
+ 59,163, 36,113,129,172,155,118,167, 80, 56, 30, 39,172,150,192,168, 92,178,164,133, 26,153,144, 38,208,118, 38,229,140, 47, 9,
+208, 88,107,183, 98,165, 48,110,201,154,125,215,139,203,192, 90,214,184, 50, 47,194, 39,119, 77, 75, 85,215, 52,186,101, 89, 23,
+188,143,148,146, 68, 3,177, 93,232, 33, 4,170, 74,132, 98,243,188,112, 76, 19, 70, 11, 21,228,170,154,166,149, 4,185, 53,200,
+192, 37,165, 20,108,116,243, 52, 79,116,117,205,105,162,101, 41, 10,165,197,221, 16,163,248,237, 99,158, 73, 75,162,109,229,162,
+247,147, 80, 19, 41, 23,161, 16,141, 33, 26,153, 15,145,180,197, 21,161, 40, 36,132, 74, 40, 93, 65,117, 4,233, 40, 37,161,148,
+ 37,132,133,152, 19,164,204, 98,228, 60,119,206,145, 82,166,219,236,162,107, 10, 16,212,134, 30,104,148,146,156,150, 83,242, 97,
+ 81,133,152,164,128, 83, 70, 97, 99,146,240,151,140,168,199,109,109,161, 24, 78, 73, 82,165, 20, 84, 35,161, 22,248,149,166,170,
+176, 26,148, 49,216,174,167, 74, 18,193,184, 6,143,173, 42,129, 91,179, 64, 72,137,196,241, 82, 46,221, 92, 50, 40, 56, 30, 47,
+183,252,228, 68, 55,180, 92,156,159,211,239,118,160,164, 35, 79,171,164, 67,141,227,129,148,228,146, 17, 19,127,123,149,100,229,
+ 83,162,105,106,242, 22, 80, 96,140, 40,136,141,145,110,107, 24, 58,206,174,157,161,209,104,163, 24,103,201, 47, 47, 5, 84, 43,
+138,240,152, 11,141, 18,223,187, 95, 60,251,221,142,113, 89,196,146,129, 38, 89, 71,206,133,241, 40,197,132,120,238, 53,174, 54,
+178,201,180,166, 31, 36, 30,181,239, 59,142,203,122, 69, 83,212,109, 79,227, 54,187,220,188,208,180, 13,218, 42, 80, 34,184, 56,
+ 45, 74,109,173,216, 4, 55,174, 38,151, 76, 14,137, 84,196, 10,210,181,189,116,163,214, 50,110, 94,110,225,158,165,176,106,170,
+ 10,101, 90,150,101,194, 88,115, 85, 69, 23, 47, 42, 75,163, 13, 77, 43,214, 11,163,148,116,238,219,193,161,141, 92,214, 90, 73,
+ 66,224,186,174,226, 39, 71,209,118,221,149, 72, 36, 4, 79, 91,183,172,139,132,229,212, 77,195, 60,142, 34, 12,172, 68, 24,216,
+117,110,115, 76, 72, 90, 23, 32,225, 44, 90, 18,202, 78, 17,157,109,219,138, 88,198,214,212,109,131, 42, 98,103,140, 41,161, 80,
+148, 28,105, 59,129,215,115, 41,140,151,194,117, 15,125, 79, 33,179, 44,158,182,105,182, 78, 72, 68,115, 68, 41, 94,188,247,212,
+109, 71, 88, 87, 86,164, 42, 86,165, 80, 53, 27, 84,167,181,168,241, 83, 18,170,160,233,165,120,221,232, 13,165,196,110, 87, 57,
+ 75,200,129,130, 34,120,177, 63,174, 97,145,144,163,166, 99, 92, 22,156,179, 92,239, 50, 63,245,157,150,247,220, 7, 77,202,160,
+ 2, 40, 45, 69, 93, 41, 92,220,247, 8, 55, 95,221,241,210,205,154, 79,255,139, 95,227, 23,254,249,175,240,233,207, 62,198,159,
+127,252,139,159,253, 71,124,215, 15,127, 31,121,241, 44,175,220,162, 58, 27,152,111, 95,240,235, 31,252, 16,127,248,233,207,252,
+133,231,255, 79,255,224,191,225,111,252,237,255, 28,156,197,191,124,155,188,204, 44, 33,242,192,189,175,227,247, 62,246,199,252,
+201,159, 61,250, 13,207,175,235,154,199,158,122, 6,107, 44,239,123,231,219,185,251,198,117,230,101,225,169,103,159,227, 95,125,
+248,163,124,232, 99,127,196,147,207,126,233,234,249,167, 78,239,153,231, 94,224,119, 62,242, 49,180,214,124,224,145,119,160,181,
+229,241,103,158,230, 87,255,245, 7,121,230,249, 23, 0,168,108,197, 91,191,249, 77, 60,242,240,155,121,199,195, 15,241,213,155,
+ 55,121,242,217, 47,241,202,171,175, 2,112,113,121,224,115,143, 63,193,245,215, 92,231,254, 7, 30,228, 45, 15, 61, 68,202, 5,
+163, 34, 68,209,189,100,165,152,143, 35, 69, 43,134, 90,210, 28,179,146,131,239,196,133,215,109, 45,103,136,146, 75, 96,157, 87,
+ 10,144,163, 34, 5, 9, 92,177,141,132,245,180,109,195, 41,194,211, 86,162,248, 62,229,229, 27,107, 80,104, 82,136, 44,235,194,
+ 48, 12, 12,131,168,168,167,163, 32, 59,185, 64, 93, 91, 80, 90,104,161, 40,185,220,109,215,160,149, 8,164,210,118,102, 26,183,
+165,157, 21,168,235, 10,107, 29,211, 60, 51, 29, 47, 55, 24, 58, 48, 29,103, 64, 75,145,106,149, 64,201,182,194, 25,137,234, 77,
+254,100, 53, 44, 44,222,111,123, 16, 20,154,170,174,183,110, 79,102, 65,156, 60,223,114, 41, 20,172,171,200, 69,120,215, 92, 4,
+ 1,177,214, 33,142, 3,133, 50, 14,173, 20,181,171,176,182, 34,165,149,197,139,245, 83, 25,137,110,173,171, 26, 93, 36,166, 24,
+ 35, 60,251,105,132,116, 81, 96,180,252,238,101,187,164, 74, 41, 52, 78,242, 72,190, 94, 12,118,106, 82,162, 79,180, 77,135, 97,
+ 65, 91,135,164,215,157,210,213,228,115,146,119, 43, 40,134, 4,185, 40,148, 81,196,228,209,186,160,172,102,168, 7,142,151,151,
+164, 20, 25, 39,177,169, 74, 70, 74, 11, 44, 40,156,160,152,206, 18,163, 80,118,199,227, 72, 65, 52, 72,149, 17,222, 57,172, 66,
+ 99, 76,211,204, 48,116,244,189, 76,139,204, 69,220, 60,235,178, 72,226,226, 50, 17, 99, 32, 37,241,139,183,181, 80,204, 77,213,
+ 16,162, 76,159, 59, 30, 37, 59,197, 90, 67, 53,244,146,180, 89,100,184,215,180,161,171,198, 24, 74,144, 16, 36, 41,144,217,220,
+ 59,105,251,221,217,154,164, 69, 40,110,213, 96,146,103,201, 30,149,165,208, 76, 41,115,118,182,219, 10,188,140, 83,154,227,225,
+200, 48,236,240,139,199, 53,142,101, 89,240, 94,246,129,115,142,166,109,177, 70, 80,111,123, 10,116,153,231,153,180, 38,220,208,
+ 19, 74, 70,199,196,241, 40, 3, 19,140,171,168,107, 49,222, 31,142, 71,196,150,211,225,106, 43,126,214,174,225,242, 32, 89,210,
+195, 48,176, 4,207,197,225, 2,173, 20,251,253,158, 19,159,149, 74,193,251,149,105,154,209, 72, 37,221,239,119,196,205,251,174,
+ 0,229, 28, 57, 38, 98, 76, 84,149,219,146,187, 96,216,237,217,239,247, 80, 10,227, 60, 19,214,149,132, 36,194,181, 91,108,170,
+177,142,182,169, 56, 28, 14, 24, 45,169, 59, 10, 72, 81, 58, 15, 5,148, 2, 93, 63, 48, 30, 71,214, 24,136,211, 66, 70, 81, 43,
+ 9,241,143,193,163,173, 97, 77,146,203,219,118, 18,247, 41,156,106, 16,197,245,246,190, 84,217, 14,145,148, 25,250,254, 74, 13,
+ 57,206, 35,107, 22, 63,108, 41,133,156, 68,205,106,140, 17, 59, 70, 37, 10, 73,177,214, 72, 98,146, 53, 22,101,149,192, 49,219,
+193,122,250, 66,115, 74, 88,165, 41, 78,186, 69,171,197,147,185, 46, 43, 74,201, 37,178,122,207,176,219,145, 98,228,120, 60, 50,
+ 77,147,248,183,151, 64, 63,244, 76,199, 35, 41,137, 5, 45, 39,129,207,250, 97, 64, 89,123, 37,156, 57, 92, 94, 98, 93,133, 54,
+154,218, 57, 66,218,244, 20,165, 80,107, 17,131,164,152, 48,214, 48,141, 35,243,164,216,239,123, 14,135,145,182,105,152,253, 66,
+ 94,229,179, 72,101,227,143, 74,161,111, 91, 98,206, 40,109,168, 42,131, 42,133,146,210, 54,192, 97, 19,179,172, 1,173, 45,243,
+188, 82,136,164, 8,206, 74,145, 72,217, 38,175, 53, 53, 10, 69, 78, 34,112, 90,198,133,174,145,148, 44,215,247, 72, 38,118, 35,
+214, 19, 85, 68,195,145,146, 36, 96,229, 44, 67, 63,180, 8,164, 82, 74, 87,175,183,174,158, 82, 64, 27,177,229,117,136, 23, 59,
+165,204,225,112, 65,213, 84,244, 85,135, 82,134,123,110,116,188,235,198,200,143,189,219,113, 86, 59,202,141,215,145,173, 70,191,
+242, 10,229, 43,183,136, 85,197, 87,234, 55,160,226,253,220,184,247, 77, 12,119, 44, 20,227,248,228,103, 30,228,137, 47, 62,199,
+ 56,142,236,250,158, 55,220,251, 58,254,254,223,250,207,248, 75, 63,240, 61,164,203,145, 95,251,181,223,228,151,127,243,119,184,
+117,121,201,167, 31,253,220, 95,232,206, 1,222,247,206,183,243,189,223,241,173,228,217,147,110, 31, 24, 47, 46,121,229,230,171,
+188,122,251, 54,255,248, 23,254,111,126,253,119, 63,242, 13,207,191,118,182,231, 45, 15, 62,192,127,240,131,223,207,251,222,243,
+ 8,166,174,200,139,231,153, 63,251, 12,191,253, 7, 31,231,131, 31,253, 56, 79,127,233, 27, 85,242, 32,159,245, 59, 30,122, 51,
+143,188,237, 97,154,186, 98, 94, 87,218,166,230,218,254, 26, 55, 94,115,253,234, 82,247,209,115,126,113,201,225, 48,114,113,121,
+193, 27,223,112, 31, 63,253, 19, 63,202, 60,175,252,214,239,127,140, 83,200,210,173, 87,111,113,235,213, 91, 60,249,248,227,188,
+235,189,239,230,190,215,191, 1,219,138,221,203,207, 43,186, 54,248, 53,112,121,184,148, 92,107, 32,248,128,235, 36, 43, 59,103,
+201,222, 78, 41,161,173, 65,226,162,101, 78,117,202,153,180, 6, 72, 5, 99, 28,211, 52, 94,193,166,218,152, 77,140, 36,133, 61,
+ 8,197, 24,115, 32, 35, 49,175, 97,245, 84, 93, 77,221,202,224,169,121,158, 89, 23, 67,191,107, 65,107,210, 26,200, 69,214, 91,
+ 54, 25,131, 66, 25,131,171,107,150,121,228,242,114,193, 25,139,173, 52, 97,131,144,215, 36, 46, 19,191, 44,104, 45,195, 99,178,
+ 47,236,155, 65, 6,176, 88, 13,202,210,181,130,188, 9, 72, 39, 17,187, 74, 21,114, 18, 47, 56, 57,201,197, 92, 60, 37, 21,180,
+115,168,146, 4,149,147, 45,140, 49, 21,114,176, 1,218, 80,215,181,140, 43,206,133,148, 60,243,188, 82, 57,225,239,235,186,193,
+ 26,225,106, 37,206, 85,177,174, 51,117,211,110, 40,161,160,115,198, 74, 8, 85,223,119, 68, 31,104,155, 78, 28, 59, 41, 98,148,
+104,116,198,227, 72, 86,153, 97,163, 8,114, 18,136, 91, 25,197, 60, 77, 52,109, 43,162, 49, 43,190,125, 31,182,215,217,146, 49,
+ 75,206,168, 34, 73,117, 33,137,107,161,169, 29,110,168, 88,214, 25,165, 4,250,151, 56, 96, 45,168,113,204,120, 63, 97,141, 4,
+152,105, 45,244,104,140, 35,195,110,183,189, 39,177, 7,183,173, 20,107,218, 74, 3,116,210, 35, 20, 4,145,204, 89,220, 6,185,
+ 20,240,160,245, 73,151,160,182,130, 77, 16, 6,109, 53,243, 60,211, 53, 13, 77,221,112,138,185,141, 36,142,227, 72, 12,129,166,
+174,232,251,129,197, 47,180, 77,123,229, 30, 82,104,188, 23,100,161,109, 79, 77,169, 98, 24, 58,172,171,176,198, 48,142, 23,212,
+117, 67,219, 89,214,117,198, 41, 71,219, 52, 28, 14, 7,156, 19,159,250,197,225, 64, 93,215, 88,107, 8, 90,232, 41,201,171,151,
+225, 54,235,186,138,107, 73, 11, 2, 98,181,146, 14,175, 20,233,138, 15,135, 3, 37,102,142, 57, 93,101,111, 27,173, 4,150, 36,
+147,139, 92,220, 18,114,162, 57, 28, 15, 88, 39,214, 29, 65,152, 4, 98,234,155,134,227, 56,146,147, 84, 50, 89, 41, 40,112,214,
+247,172, 41,225,140,116,166,151,231,231,128,150,191,148, 36,248, 44,139, 4,234, 55, 77,203,225, 32,208,253,120, 56,224,106, 71,
+219, 13,180,109, 75, 41, 48,175, 43, 49,200, 70, 52,214,178, 27,122,214, 32,202,240,182,107, 25,167, 3, 93,219,209,214,149,116,
+176, 74,145,114, 97, 90, 37,136, 97, 90, 38,170,218,161, 19,172,203,138,117, 1, 48, 44,209, 19, 55,155,135,181, 14,235, 12, 70,
+ 89,234,206,201, 4,162, 34,188,134,228,223, 91,118,187, 65, 20,246, 90,102, 4, 59, 91,179, 6,137,239,115, 78, 52, 4, 93,215,
+ 49,173, 19,118,131,230,171,170,162,178,150,146, 11,227, 52, 18,194, 74,215,247, 28,143,226, 83, 44,165, 64,150,157, 43, 83,197,
+206,208, 70, 66,125,252,186, 80,148,194,167,136,206, 98,123, 1,117,245,197, 86, 85, 69,211, 84,132,144,168, 54, 71,128,113, 18,
+164, 33,155, 42, 50, 77, 19, 23, 23, 23, 24, 99, 56,219,237, 36, 62,181,239,241,193, 67,130,160, 37,146,240,226, 98,196, 90,187,
+189,190,112,181,251,221,142, 49, 28,183,234,117,150, 3,204,123,186,182,231,152, 15, 24,107, 37,145,204, 89,148, 50,130, 94,184,
+ 90,166,172,117, 29,199,233,136, 49,142, 97,232, 56, 30,142,212, 69, 16,131,156, 18,117,237,208,186,102,158, 71,180, 21, 65, 93,
+201, 17, 52, 76,231, 2,211,233,124,117,166, 49,109, 7,231,126,183, 99, 90, 60, 70, 41,169,160,173,165,169, 20, 57,109,246, 30,
+107, 33,103,166,101,197,110, 48,155, 82, 66,109,156, 82,169,156,117,164, 32,195, 34,172,214,226, 58,200, 82, 60, 93,235, 50, 63,
+246, 78,203,183,127,179,165,243, 53,186, 36, 74, 72,112,235,166,160, 12,222, 51,229,138,231,185,135,179,251,191,139,238,218, 3,
+ 28, 94,126,137,227,120,228,231,127,233,255,229, 23,127,229, 55, 56, 61,238,184,118,198, 7,222,253, 46, 94,119,231,157, 92, 60,
+251, 2,227, 60,227,172,195,123,207, 31,252,209, 39,248, 55, 61,254,214, 95,255,171,252,195,191,255,119,192, 90,210, 52,179, 78,
+ 51, 77, 83,241,224, 91,222,196,240,194,139, 60,245,236,115,127,225,103,206, 47, 46,121,219, 91,222,196,219, 31,250,102, 20,112,
+124,245, 22,175,222,186,205,135,254,232, 19,252,220, 63,251,229,205,226,245, 23, 31, 49, 70, 62,251,196, 83,116,109,195,107,206,
+206,184,227,218, 25,247,220, 37, 20,193, 61,119,221,160,239, 90,198,105,230,245,247,220,195,127,249,159,252, 53, 30,121,248, 33,
+142,211,196,241, 56,113,199,181, 59,248,193,239,254, 75, 60,253,165,231,121,236,169,175,169,233,187,182,225,117, 55,238,224, 53,
+117,197,251,222,120, 31,174,174,249,252,243, 95,225,118, 6,140,162,100,133,210,194, 47,158, 68, 64, 49, 36,214,197,147,138,240,
+155,107,240,148,176, 77,135,171,182, 97, 29, 81,132,187,203,178,160,149,116,255, 69, 65, 81,154,146, 37,180, 38,100, 25, 92, 18,
+130, 36, 73,106, 20, 93, 91, 51,142,210, 92, 40, 20,222, 47,168,109,152,145,213,138,184, 74,112, 83,211, 54,228,101, 19,188,101,
+205,154,162,136, 85,139,136,137, 83, 22,111,247, 26, 60, 33,129, 42,133,221,208, 75,103, 90,164, 91,107,173,219, 92, 37, 50,137,
+ 44,173, 98,245, 50,219, 58,148, 64, 39, 69, 57, 45,106,228,142, 6,168,107,141,179, 53,206, 34,103,138, 95, 81, 40, 92,229,208,
+ 74, 11,165, 16, 37, 42,213,108, 5,122, 12,129,170,174,153,166, 85,172,170, 74,248,246, 70, 55, 50, 43, 98, 24, 40,136,143,188,
+223,237,164, 65,202, 25, 74,194,105, 77,204, 17,163, 42,146, 42,164, 20,129,250,170,123, 79, 74, 97,180,228,150,199,224, 57, 63,
+191,184,210,234,244,189, 97, 60, 78,116,109,199, 60,207, 80, 50,211, 36, 65, 65,183, 76, 24, 0, 0, 32, 0, 73, 68, 65, 84, 58,
+125,215,225,189,199,185,138,186, 50, 27, 58,166,229,245, 5,196, 20,196,210, 90, 98, 72,164,184, 16, 98,194, 57, 72,113, 97,161,
+ 48, 12,123,180, 22,228, 77,105,177,255,230, 34, 9,122, 57, 23, 74,129,101,145, 6,101, 26, 71, 41, 44,198,137,170,174,175,206,
+197, 83,192, 77, 78, 1,175, 4, 37, 57,219,237, 48, 70,163,181,196, 97, 43, 99, 40,169, 48, 45, 51,165, 72, 33, 56,206,147,232,
+162, 38,185,155,208, 66, 25,150,156, 69,183,177, 21, 10,199, 44,130,198, 28, 19,198, 9,122, 19,151,192, 33,172,236,207,174, 1,
+138,227,225,128,210, 26,219,183,116, 93,199,197,197, 5, 80,228, 94,181,154,241,242, 64, 74, 65, 40, 89,165,160,228,237,123,148,
+ 28, 13,153,148,151,175, 80,193,170,138,204,179,136, 23, 55,159,122,198, 20, 69,200,146,105,222,212, 13,199,229, 2, 5,140, 23,
+ 23, 20,165, 64, 11,116,234, 83,164,171, 43,206,207,207, 49,198,208, 13, 18,112, 95,138, 40,133, 47, 47, 46, 64, 41,138, 82, 28,
+130, 84,173,231,231,231,210,169,107, 33,242,135,253,158, 90, 59,198,105, 38, 38,169,152, 41, 25,163, 43,114,242, 28,143, 35,125,
+ 63, 72,172,171, 54,236,119,123,230,101,198, 58,241, 84,250,101,193,184,138,195,197, 57, 17, 9,186, 57, 13, 21,161,192, 58, 47,
+ 91,110,116, 32,167,194, 97,156,168, 93,197, 56, 45,148,146, 25,250, 29, 62, 6,146,201, 52,117,139, 42, 26, 83, 27,218, 78,108,
+123,218, 24,230,113,102,191,219, 70,156, 82, 80,106,207,186,206, 24,107,216,157,237, 9, 94,108, 24, 98,203, 74,172, 94,236, 84,
+ 70, 27,166, 60,162,148, 98, 63, 12, 92, 28, 15,172,171, 92, 58, 90,159, 66, 38, 36,148,102, 28, 71,230,109, 51,149, 34, 67, 31,
+ 98, 22,206,166,100,233,166, 87,191,110,126,223,196,178,206,210,101,132, 72, 76,137,170,170, 24,186,142,101,153, 89,102,225, 24,
+ 21,138,170, 18,109,131,143, 18, 80, 83,185,147, 79, 52,178,230,149,156,133,131, 58,113,167, 41, 37, 22, 47, 30, 72, 31, 60, 86,
+ 91,198,121,102,208,157, 76,145, 67, 44,133,107,248,218,137, 19,115, 20, 77, 69, 8,104, 91,208, 70, 98, 16, 11, 74, 6,164,228,
+196,180, 44,148,109, 3, 85,117, 13, 74, 83, 55,213, 85,238,248,233,247,168, 27,153,132,135, 2,137,151, 44,236,135, 29, 90, 73,
+108,235,126, 63,112,113,113,206, 50,206, 84, 85, 77, 34,145,148, 98,104, 58,148,145, 66, 64, 91,187,217,233, 44,206, 90, 80,176,
+204, 19, 71,239,233,123, 17, 99, 94, 33, 62, 91, 0,142, 76,174, 42, 84,181,132,140, 88, 93,161, 43,197, 60,206,180,189, 84,213,
+175,237, 51, 63,248, 80,197,183,222,185,114,255,189, 6,188,162,172, 9,102,225, 79, 49, 25, 85, 70, 80,154,155,241,140,151,219,
+215,115,215, 91,191,151,186,191,155,207,253,233,167,121,226,169,103,248,224,199,255,136, 95,252,149, 95, 7,132, 94,186,231,181,
+119,241,200,195,111,230,123,191,253, 3, 60,240,250,123,169,155,154,118, 24,120,239, 59,133, 82, 80, 74,241,187, 31,251, 56,126,
+131,101,251,182,229, 13,247,125, 19,199,105,228,201, 39,159,230,222,123, 94, 75,240,146,250, 88,183, 53, 47, 62,243, 69,254,231,
+255,253,103,249,194,211,207,202, 97,167, 20,168,194, 59, 31,122,136,191,247, 55,255, 83,126,224,135,191, 31, 20, 28,190,242, 10,
+143, 62,254, 36,143, 61,245, 52, 47,189,252, 50,103,195,142,101,125,149,255,191,199,208,201,232,201,182,149,241,186, 63,255, 75,
+191,202,239,253,225, 31, 51,207, 51, 85, 85, 49,110, 41,137, 31,251,196,167, 24,231,145, 7,238,189,143,167,158,125,142, 63,125,
+236, 49,158,122,230, 75,146,250, 88, 73, 22,124, 41, 82,172,223,123,207, 61, 60,252,166, 7,184,231,206, 59,121,235, 55, 63,200,
+143,252,224,247,243,248,151,159,231,247, 62,242,113,158,120,238,203,164,252,181,105,125,187, 97,199,225, 48, 98,173,162,111,123,
+ 66,137, 80,100,112, 80, 41, 34,168, 90,147, 80,111, 90, 43, 92,213, 96,141,172,205, 18,229,162, 46, 90,206,196, 83, 34,160,173,
+106,161, 17,129,130,204, 36, 88,214,149,156, 18, 49, 23, 42, 85,216,237,122, 82,150,225, 35, 33,120,201, 37, 87,146,247,109,148,
+218,132, 78,176,172,146,141,208,110, 80,168, 49, 6,171,229,117,231,105,166,105, 27, 98,242, 40, 36,183, 62,205, 51, 40,144, 9,
+133, 3,243, 56, 51,251,121, 43,192,155,173, 33, 74,104,109, 41, 5,208,144, 98,100,245, 1,175, 61, 20,177,196,182,117, 75,161,
+ 16,124,192,182,142,206, 52,228, 92,200,136, 7,221, 85, 98,255, 61, 28, 46,233,218,118, 27, 42, 36,151,194,229,241,128,210,138,
+121,153, 57, 13,204,210, 40,218,182,147, 16, 39,107, 57,140,163, 32,105, 38, 49, 30, 71, 26, 39,123,182, 27, 6, 98, 10,130,243,
+111,154,163, 16,100,141,166, 32,197,139, 95,101,110,252,241,120,196, 56, 75,215,180,104,157, 8, 49,112, 88, 38,249, 30, 74, 70,
+ 33, 99,172,141,134,213,123,249,255,101,113, 34,185, 74,214,156,100,168, 11,157, 41, 42,242,194,120, 28,233,182, 65, 93,166, 8,
+154, 42,243, 57,182, 88,106,242,118, 46,173, 44,139, 68, 8, 91,231,152, 54,235, 25, 74,214,118, 41,210, 52,157,210,250,244,233,
+143,150, 39,200,153,109, 25,186, 14,144,252,248,190,237, 8, 57,162, 74,133, 82,194,201,155, 78, 6,192,204,235, 74,109, 12, 96,
+153, 87, 79, 73, 11,103,103,215, 40, 37, 9,215, 94, 27,234,186,103,154, 23,161,158, 11,146,244, 87, 78,235, 83, 4,146,211, 56,
+ 74,128, 87,201,144, 53,198, 74, 70,137,247,158,224,165,152, 80, 74, 83,146,248,218, 83, 18, 61,214,178, 44,180,109,127,213, 64,
+ 90,173, 21,205,208, 19, 47, 47, 56, 30, 70,218, 93, 79,177, 14,165, 21,172,146, 6, 84, 98,102, 58, 28, 80, 86, 51,229, 45,154,
+ 48, 22,226,154,100,226, 80, 57,213,149, 50, 37, 41, 1,227, 81,248, 93,245,117,255, 77,163, 88,167,137,152,243,150, 92,150,113,
+ 78, 14,225,202, 90,148,178, 76,243, 81,132, 39,201,179,219,239,177,149,101, 87,237,201,165,112,188,156,200, 42,163,214,109, 8,
+ 76,145, 46, 93, 25,131, 81,134,148, 19,187,173,219,173, 93, 67,221, 9, 63,149,115,164,169,106,142,179, 92,164,218,106, 32, 83,
+148, 70, 41,225,117,151, 84,104,109, 35,155,201,157, 68, 32,133,184, 65,235, 85, 37,179,116,143,135, 3,148, 66, 55, 12,114,128,
+110,149, 23, 74,209, 15, 59,148, 18,126,106, 89, 23, 42,109,177, 77, 37, 29,174,146, 56,217,130, 92,164, 49,137, 88, 38, 43, 69,
+163, 53,167, 73, 86,203,188,160,138,217, 20,204, 18,138,209,245,131,164,137, 21,104,235, 26, 91, 85,144, 36, 16,198,106, 25, 7,
+154,115,161,174, 68,165,125,121, 57,110,138,109, 81,107, 79,199,163, 84,180,195, 32,144, 18,112,154, 88,230, 87,177,138, 5, 91,
+209,182,205,213,160,141,227,241,200,181,107,123, 74, 17, 4, 32,167,194,238, 76, 40,135, 16, 2,231, 23, 7,250,190, 69, 83, 67,
+214, 52,125, 43, 21,168,218, 56, 71, 10,130, 8,138,199,126,153,103,246,251, 61, 86,107, 50, 21, 41, 36,129,218, 75, 6, 52,117,
+ 37,190,252,117, 93,185, 56,140,236,119, 61,181, 18, 75,165, 49,142,152, 10,139, 95, 57,141,223,205,186, 72,133, 92, 10,172, 43,
+195,126, 71,152, 87,252, 38,250,171,171, 10,215, 72, 90, 98, 12,146,220,103,140,227,242, 32,200, 67,219,116,132, 36,194,190, 98,
+ 97, 58, 92,136,230,160,170,176, 42,242,147,239,179,252,123,239,210,148,100, 64,237,200,179, 71,251, 21, 85, 89,178,219,222,157,
+ 85,228,221, 53, 94,189,254, 8,183, 94,120,149,179,235, 15,226,154,235, 60,246,153, 79,243, 39,127,246, 40,255,228, 23,255, 25,
+159,127,234, 25, 0,238,190,241, 26,254,199,127,240,119,249,206,247,191,143,235,247,223,135, 50,138,226, 3,235,171, 23,252,204,
+255,250,127,240,191,252,147,159,227,207, 63,238,184,118,198,127,241, 87,126,130, 31,255,161,239,231,129, 55, 62,128,170, 37,224,
+132,148, 73, 62, 16,231,137,103,191,244, 2,175,220,250,154,143,189, 20,161, 59,222,242,166, 7,105,155,154,231,159,248, 34,119,
+222,184, 3,231, 12, 15,189,241, 65, 66, 8,124,232, 15, 63,193,203, 27,239,125, 42,238,100, 45,203,207,131, 4,219,252,229,127,
+247,251,120,255,123,222,133,247,158,203,241,200,231,159,120,138,147,242, 25,224,181,119,221,224,189,239,120, 27,119,221,184,206,
+115, 47,188,200,111,126,240,195,124,242,115,143,113,126,241,231,237,116,112,235,246, 57,207,124,233, 57,222,254,240, 91,216, 15,
+ 29, 77,211,146,166,137,215, 53, 45, 28, 39, 62,247, 39,159,228,114, 90,120,251,123,222, 69, 63, 12, 44,235, 74,219, 85,104, 52,
+227,186, 32, 88, 81,129, 36,130, 74, 63, 77,212, 70,198,207, 30,189,167,114,154, 16, 69, 89, 28,131,167,239,100,188,168, 82, 22,
+171, 11, 37, 73,103, 88, 85,142,195, 56,162,129, 98, 45, 37, 5,188, 47, 91, 98, 96, 34,248,136, 15, 17,163, 34,221,208, 98,115,
+ 6,148, 12, 28,242,129,147, 21,202, 57,241, 79,135,224,145,184, 86, 77, 91,203, 44,108,109, 44,199,203, 75,208,154,174, 23, 91,
+174,213,150,197,139, 77, 83, 41,233,180,109,101, 24, 71,201, 33,151,238, 79, 67, 22,218,165,169, 27, 98,201,164,144,168,156, 5,
+ 83, 40, 74,115,156, 70,132,111,151,125, 93,144,121, 28,186, 8,218,121,226,221,171, 74, 70, 4, 55,109, 69, 78,133,233, 56,109,
+105,137, 5, 31, 18,235, 58,137,103, 61, 4,228,195, 80, 28,143, 19,251,205,135,126,121,126, 1, 25,102,191, 10,221, 87,215,172,
+139, 80,146, 14,209,170, 24,187, 9,167,183, 46, 21, 64, 39, 69,107, 91,150,105, 98,154, 70, 20,226,115,215, 90, 34,172,115, 76,
+152, 74, 19,252,204,236, 35,117, 35, 3,166,198,241, 40, 78,148, 34, 35,185,115,201,244, 85,133, 53, 21,117,237,160, 40,198,105,
+186,202,239,119,206,145, 75, 98,158, 37, 68,172,170,220, 21, 31,174,181, 3, 78, 19,227, 36, 9,206, 56,135, 46,130, 2,105,180,
+ 76,164, 92, 3, 57,205, 24, 35,137,109,199,105,197, 25,203,186,174,180,157,101, 9, 1,103, 29, 57,203, 57,102, 53,216, 10,185,
+116,183,142, 94, 27,131,179, 13,147, 95, 72, 65, 70, 21, 31,143, 71, 78, 97,110, 57,139,254,107, 89,102,138, 42,140, 99,160,170,
+ 28,117,101, 57, 78, 71, 74,136, 40,197, 21, 29,224,106, 73,244, 52, 86,206, 62, 17,124,107,230,101, 22, 91,107, 86,164, 28,169,
+172, 97,241,137,176,174,236,207,206,174, 32,127,103, 45,118, 93, 36,253, 38, 3,205,208, 50, 29,133,195,204, 81, 20,128, 25, 73,
+ 69,194, 85,212, 77,131,247, 11,109,221,110,202,248,196,225,112,201,110,216, 49,244,195,214, 81, 59, 42,163,169, 43,203, 41, 8,
+ 38,229, 76, 74, 30, 91,213,164, 20,169,148,145, 3,180, 51,196,148,152,150, 9,191,172,104, 37,234, 73,165, 1, 52,227, 56,177,
+219,248,217,101,155,118, 37, 97, 56, 10,173,183,142, 86,101,153, 1,174, 50,203,180,178, 44, 1,165, 12, 40,152, 22, 17,246, 93,
+ 94,142,164, 44, 67, 1,140,211, 50,194,111,241,100,157, 89, 54,107, 73, 51,244, 88,165,208, 89,212,162, 80,182, 74,106, 75,188,
+ 75, 69,194, 91,140, 38,249, 32,213, 46, 26,114, 70, 89,135, 42,162,238, 76, 49,160,109,139, 53,110, 67, 2, 16,191,253, 58, 11,
+ 47,142,228,123,167, 16,208,117, 77,152,103,162,214, 87,220, 31, 64,201, 34,242, 82, 74,161,149,120,172,141, 54,204,147, 4, 4,
+ 41,165,112,206,110,127,182, 60,119, 43, 80,222,186,174,104, 35, 83,156, 98,220, 2, 86,106,153,114,116,242,235, 78, 33,208, 84,
+ 50, 6,215,135, 81, 54, 83,222, 38,245,109,213,236,110, 55,136, 5,204, 90,170,170,190,250,247,171,151, 89,229, 10,152,166, 85,
+160,113,165,112,174,161,235, 6,142, 71,225, 69, 97,235, 26, 41,176, 9,251,230, 89,102, 34, 39, 47, 27, 74, 27,136, 62,138,101,
+ 17,141, 41, 80, 87,194,225, 94, 92, 94,176,219,157,201, 28,246,173,227,111,154,134,174, 21, 24,106,252,255,216,122,243, 96,203,
+174,235,188,239,183,247, 62,251,140,247,190,215,243, 8, 52, 26,141,110,204, 64,131, 24, 72,144, 0,193, 81, 52, 69, 81,148,168,
+145,182,134, 40,113, 41, 42,185, 34,217, 41, 39,170,164, 28, 87, 69,142,147,114, 85, 98, 59,169, 68,174,114,201,209, 20,107,178,
+ 53,144, 18, 41,113, 6, 8, 18, 0, 7, 8, 2, 65, 12,108,128, 64, 99,234, 6,208,221,232,215,239,222,123,230, 61,228,143,117,
+222, 3, 96,250, 84,113, 68,247,125,247,221,123,206, 94,107,125,235, 27, 26,209,126,202,251,104, 25,186,126,155,195,224,198,145,
+193, 57, 34, 50, 69, 68,132,240, 99,173,163, 40,242,237,201, 34,177, 26,180,162, 29, 6,178, 36,135, 12,246, 21, 43,254,235,119,
+ 5,174,217, 99,137,151, 34,106,247, 28,130, 3,183, 32, 38, 26,148, 69, 49,194,224,248,198,131,103,217,247, 3, 63,140, 59,183,
+137,214, 5,243, 67,215,113,246,165,151,248,214,183,159,224, 11,247, 63,176, 77, 64, 59,176,119, 15, 63,247, 99, 63,204,137,163,
+ 87, 80,150, 37,238,210, 2,101,196, 49,235,137,167,159, 97,209,172,216,191,123,247,118,161, 5,216,179,115, 7, 31,251,208, 7,
+248,145, 15,127,128, 99, 39,142,161,172,232,237,197,114, 86,164, 89, 58,205, 40,203,156, 52, 77,120,243, 85, 55, 45,127,254,217,
+ 47,242, 43, 63,255,247, 56,124,244,114,158,120,236, 9,254,252,115, 95,224, 47,191,248, 21,102, 69,206,139,103, 95,221,254,126,
+182,138,120, 84, 64,136,236, 88, 91,227,189,119,189,131,219,110,188,158, 29,235, 59,216,220, 92,242,204,233,211,164,169,229,192,
+222, 61,156,125,237, 28,243, 89,197, 39,126,228,135,248,129,187,239,132, 8,143, 62,249, 52,247,127,253,155, 60,246,212,211, 44,
+235, 55,152,247, 91, 87,154,166,216,196, 80, 20, 5,235,179,138,168, 20,103,206,158,229,209, 39,159,230,171,223,122,152, 51,175,
+158,163,109, 59, 94,122,249,101, 94, 62,123,150,131, 7, 15,114,226,186,107, 56,124,249,229,140,131, 68,226,162, 21, 86,137, 95,
+118,156, 26, 98, 16, 20, 40, 70, 73, 16,140, 62,128, 17, 73,217,170,150,231, 77, 43, 4,102,215,145, 60, 21,185,106,145,229, 19,
+251, 58,144, 38, 25, 16, 88, 53, 43, 20,154, 68, 27,108, 42, 70, 55, 66,230,138, 40,132,100,103,115, 49,142,217, 34,132, 90,107,
+ 72,173,248,148,135, 40,132, 97,155, 73, 18, 95, 63, 12, 84,185,236,113,179, 34, 67, 43, 72,130,197, 36,210,136,128,194, 57,105,
+ 88,203, 82,200, 88, 38,136, 74,197,121,153,208,209, 18, 56,212, 59, 71, 28, 2, 40, 71, 54,153,215,228,105, 38,182,171,222,177,
+ 88,136,173,247,214,119,186,117, 73, 91,189, 53,153, 74, 42, 96,158,151,104, 45, 67,148, 73, 69,117,128,146,231, 46,157,149,248,
+ 81,156,251,202,170,218, 62, 95,165, 1,111,145,224, 21, 61,169,131, 90,114,155,139,161, 13,122, 34, 90, 27,162, 66, 26,136,121,
+133,243, 35, 90, 27,178, 16,145,212, 77,177, 78, 70,139,220, 56, 4,249, 89, 49,200, 89, 55,155,205, 38, 63,141, 64, 58,161, 6,
+ 32, 8,215,208,119,204,170,146, 40,197,129,197,114, 65, 8,242,251,229,105, 37,107,182, 52,161, 27,122, 50,147,178,182, 38,131,
+160,235,123, 76, 46,225, 54,222,129, 81,242, 93,101, 89, 34, 42,166,152,208,182, 13, 27, 27, 27, 50, 88, 86, 98, 97,189, 92, 46,
+201,210, 68,108,130,179,140,229,106,177, 61,188,110,253,123,140, 32,201,160,130,182, 10, 34, 45,107,187, 85, 93,131,138,178,222,
+ 81, 18,129,171,148,160,213, 74, 41,234,122, 37, 18, 58,221,179, 92, 44,169, 74,177,150,110, 27,217,223,183,157, 36,252,205,102,
+ 57,227,232,153,175,173,177,149,121,191,121,233, 18,237, 36,209, 83,218,176, 88,174,208, 74, 56, 82, 49, 70,146, 16,133, 53,104,
+210,148,209, 59,230,235,235, 52,181,164, 46,229,169,196, 55,110,214, 53,120,135, 81,138,249,108, 78,223,247,219,153,221,214, 90,
+218,190,167,202, 10, 76, 34, 55,109,211,182,228,105,142, 74,164, 9,204, 18,133, 66, 14,220,205,197, 38, 99,240, 68, 38,242, 73,
+ 8,168, 56,201, 91,178,148,174,237,229,129,201,115,252,232,169, 17,104, 43, 77, 38,121,210, 56, 78,187, 17, 79, 64, 88,140, 97,
+236,132, 48, 17, 29,243, 82,220,129,154,166, 65,163, 88, 76,208, 88, 89,148,212,109, 77,215,120, 98, 1,214, 26,182, 28,200,194,
+ 48, 80,111, 46,104,181, 24,164, 24,173, 72,178,124,210, 72, 7,180, 30,100,226,115,146, 59,173, 67, 36,120, 97,201,118, 93,199,
+250,108,141,110, 16,246,123,235, 90, 49,218,232, 69,239,104,180, 33,207,196,148,224,210,230, 38, 97,130,219,203, 82,172,121,183,
+ 46, 73,143, 50, 88,173,104,251, 17,241,117, 7,148,194, 40,205,250,218, 58, 74, 79,193, 18,185, 76, 36, 62, 4,180, 23, 75,210,
+224,197, 45,206, 90,195, 86,182,186,181,150,174,219, 10, 31, 8, 84,133, 48, 58,213, 52, 17, 43,165,100,218, 54,102,155, 81,239,
+156, 20, 89,173,196,234,114,121,233,210,212,220, 64,150, 21,244,189, 4,238, 40,196,155,158,152, 97,140, 28, 36,117,189, 98,190,
+182,198,170,174,201,178, 76,224,116,132,209,169, 38, 68, 97,181,170,113, 78, 10,109,153, 87,140, 40,108, 98, 89,174,150,116, 81,
+ 14,209,188,200,233, 58,199,114,177,160,172, 42, 57,112, 50,113,233,138, 74,160,199, 52, 77,145, 88, 77,152,205,103,184, 65, 28,
+154, 86, 19,188,175,144, 3,206,102,217,118, 7, 27,167, 41,110, 24, 71,186, 81,116,255,193,123,114,171,216, 85,141,124,236,100,
+194,251,142, 21, 36,157, 34,246,129,179, 79,156, 33, 15,103,217,153,143,168, 99, 7,224,208, 62, 65, 32, 22, 11, 22,249,110,102,
+215, 92, 70, 95,119,172, 95,254, 54,230,251,175,225,225, 7, 30,228, 87,254,233,255,194,119,159,125,110,251,123,125,219, 13,215,
+241,203, 63,247,119,121,199, 45, 55,177,107,215, 14,204,196,163, 0,143,178, 9,187,119,237,228,226,197, 13,206, 95,124,163,160,
+231, 89,202,190, 61,187,184,235,246, 91, 57,126,236, 24,218, 36,196,137, 21, 91,111, 46,249,206,119, 79,241,189,231, 95,228,161,
+ 71,190,205,103,190,116, 47, 77, 43, 92,135, 60,205,248,196,143,124,132, 95,251,229,191,207,190,195,135,136, 49, 18,250,129,203,
+ 14,237,231,151,126,230,167,249,201, 31,250, 59,124,252, 23,255,225,182, 49,205, 86, 65, 7, 4, 86, 5,174,188,252, 48,215, 95,
+117, 37, 71, 47, 59,196,198,230, 38,159,255,234, 67,124,254,254,175,114,118,210,165, 3, 44, 87, 53, 95,250,234,131,236, 90, 91,
+231,248,209, 35, 20,121,198,162,110,196,175,127,122,205, 55, 55, 12,214, 24,110,190,246,106,174, 59,113,156,181,249,140,113, 24,
+ 33, 77,217,191,119, 55,207,191,248, 18, 15,127,231,201,237,215,142, 33,112,246,204, 25,234, 75,151,216,124,253, 34, 87, 28,187,
+ 18,180,164,193,245,221,128, 81,129,118,232,168,202, 10, 55, 72,200,140, 27, 70,146, 76,178, 3,210,196,226,124, 96, 94, 85,140,
+ 78,154, 88,157,200, 52,185,197,184,142, 17,113, 32,116, 35, 33, 6,114,155,137, 9,201,224, 17, 77,187,192,179,110,240,216, 44,
+ 17,123,213,224,161, 11,100, 89, 49,173, 30, 60, 67, 55,144,230,162, 83,223,220, 92, 18,163,167, 40, 43,154,118, 41,204,112, 37,
+169, 95, 49, 10, 59,186,170,230, 16, 3,193,139,185,141,209,134, 44, 19,205,184, 82, 26,147, 37, 44,150, 43, 82,107,201, 11,121,
+221,190,149,208,168,188,156,166,211, 0, 19,248, 69,219,182,211, 68,184, 37,143,139,178,115, 69,209,214, 53,179,249, 12,130,168,
+ 9,162,243, 52, 93,139, 54, 17,162,146, 51,120, 84,219,106,149,209, 9,159,197,123,143, 86,147,139, 92, 84, 56,239, 41,179,156,
+ 52, 17,195, 46,231, 35,122,154,204,157,147, 1, 67, 27,153,126, 19, 35,100, 47,173, 53,195,216, 97, 84, 66, 91, 55,228, 69,137,
+119,146, 99, 46,136,153, 38, 70, 69, 86,164, 2,145,235,200, 86, 12,243, 86, 28,112, 36, 78,228,176, 4, 63,142, 16,197, 8, 44,
+120,113,251,200, 38,137,221, 48,200,185,220, 14, 45,243,100,206,208, 59,188, 26,197, 37, 53, 72, 50,220, 27,247, 86,164, 31,251,
+169,168, 54,132, 0,202, 32, 83,250,106, 69, 63,142, 36,206, 17, 35,100,137, 37, 68,200,172, 33, 68,143, 73,100,125,154, 76,171,
+ 28, 65, 1,228, 61, 37, 86,179,213, 74,133, 16, 89, 95, 91,103,244,227, 36,143, 85,132,232,184,116,105, 19,163, 64, 41,195,108,
+109,182,141,164,224,165,193,234, 7, 73,107, 76,179,148,101,211, 78,171, 30, 25,150,138, 92,118,253, 33,136, 17, 90, 98, 19,218,
+118, 96, 54,159, 73,115,138,120,166,172,150,203,137,111, 50, 25,221,163, 69,231, 45,123,141,140,170, 44,209, 74,227, 93, 96,199,
+124, 78,221,214, 20,149,192, 55,117,221,160,181, 20, 1,107, 45, 67,219, 81,229, 5,107,107,179,109, 88, 87, 41, 69, 63, 72,183,
+177,182, 86, 1,134,182, 93,177, 54, 95,131, 8, 18, 77,234,229, 33,155,122,159,182,235, 65, 13,104,109,240,195, 72, 81,202, 3,
+209,247, 98,144,176,213, 17,197, 32,118,172,209, 57,172, 77,137,169,102,115,115, 19,165, 12, 0,202, 24,102,179, 57,132, 40,164,
+153, 40, 55, 97,150,102,211,135,175,216, 92,174,112,125,135, 14, 66,160,211, 89,134, 26, 6, 34,194, 79,235, 59,137, 38,213,137,
+ 48,162, 99, 16,147,253, 36,205, 73,109,202, 98,115, 65,235, 70,202,181,117, 48,122,123, 58, 13,132,237, 29, 77, 85,202, 36,233,
+189,103,177, 92, 18,188,167,170,100,103,183, 92, 46, 33,200, 20, 83,228, 18, 87,155,230, 37,109,219,145,151, 37,169, 78, 8,136,
+141,160,210, 66,112, 75, 72,152,205, 10,252, 4,167,165,105,138, 73, 51, 92,211, 96,140,194,251, 64,149,206, 80,106,171, 59,151,
+207,203,251,136,197, 79, 77,128,236,121,242, 9,110,212, 74, 77,138, 6, 43, 55, 96, 8,136, 1,198,140,118, 37,145,185,198,136,
+ 20, 72, 60,157, 75,162, 18, 75, 78,165, 20,194, 12, 86,216, 60, 35,207, 83,218,166,193, 40, 89,141,244,110, 36, 75, 68, 59,218,
+ 15,194,151, 40,203,140, 36,149,239, 46, 68,208, 90, 96,195,170,170, 88,173, 86,204,183,164, 34,137,232,205, 21,226,157,221,118,
+ 29,105, 50, 77,164, 74,227,156, 16,243, 0,154,182, 38,120,249,121, 85,158, 19,213, 27,144,178, 24,131, 72, 56, 13, 94, 14,176,
+ 60,149, 88,198,181,194,243,225,183,205,184,235,202,192, 94, 27, 72, 19, 13, 94, 11, 1, 46,135, 67, 55, 31, 36,158,222, 68,101,
+ 21, 95,123,240, 5,222,125, 83, 2, 23, 94,230,124,109, 57,187,127, 23, 59,111, 60,201,142, 35, 55,163,109,201,165,151, 94,230,
+244,139, 47,209, 13,111,144,207,126,246,227, 31,227, 31,253,226,207,115,228,138, 35,130,148,116, 61,193, 75,144,199,165, 75,155,
+252,245,125, 95,229,223,254,251, 63,222, 38,185, 89,147,112,229, 21,151,177,123,199, 58,239,185,243, 29,220,118,211,117,160, 32,
+ 70, 15, 83,135,159,165,150,203, 14,236,227,197, 51,103,153, 87, 5,235,107,243,237,162,222, 13, 61,159,250,252, 23,249, 7, 63,
+255,119,217,171, 21,190,233, 25,250,142,182,237,216, 92, 46,177,198,242,107,191,252, 95,241, 47,255,237,111,111,155,218,108,195,
+239, 26,110,189,225, 6, 78, 28, 59,202, 16,132,159,177, 99,190,198,109, 55, 94,203,114,185,224,161, 71,190,205,217,215,206,113,
+232,192, 62, 62,252,222,119,243,174,219,222, 70,145,137, 11,227,107, 23,206,139,138, 33,181, 52,173,124,198, 49, 70,210, 36,229,
+138,203, 15,114,248,208, 65,174, 58,114, 25, 63,251,241, 31,230,186,171,174,132,196, 50,180, 45, 46, 4, 46, 59,120,128,103, 95,
+ 60,195,198,230, 91,173,112,143, 29, 61,194,251,111, 59,201, 45, 55, 95, 79, 79,194,189,143,124,155,162,200,104, 91,145,186,185,
+209,145,164, 34,165, 20,253,122, 74,219,119, 12, 67, 71,158, 21,212,171, 70, 26, 40,163, 8,193, 35,185,245, 66,202, 26,220, 0,
+ 33, 76,254,228, 35, 67,240,104,159,160, 19, 77, 66,138, 66,109,239,113,253, 40,147, 88, 98, 83,198,174,149, 9, 90, 5,210, 52,
+ 71, 43, 65, 33,181, 78, 16,154,176,194,106,131,202,115,154, 70,140, 96,180, 22,105,170, 49,226,207, 16,162,167,176,217, 54,209,
+205, 7,113,218, 51,218,208,185,142, 84, 27,250,126,216,222,143,162, 53, 85, 90,160,140,184, 30,162,181, 12, 27,211,119, 87,150,
+229,116, 30, 74,158,197, 48, 14,216, 68,190,151,174,149, 28,243,224, 61,196, 73,149, 18, 34, 90, 5,242, 44,199, 38, 22, 20, 66,
+ 32, 28, 28,206, 69,188,135,188,200,208, 65,188,234, 53, 18, 41,236,251, 32,137,135,193,211, 7,143,209,150,182,239,164,121, 87,
+138, 97, 24,233,186,129,196,104,242, 66, 86, 14,218, 6,242,178, 68,169,200,216, 59, 36, 93, 46,161,237, 36,146, 59, 75, 51,172,
+149,116,208, 45,167,188,212, 90, 6, 47,146, 52, 98, 68,169, 72,146,166,178, 82,203, 36, 12,171,105, 26, 33,196, 41,240, 33, 48,
+ 34,103,236,170,150, 12,243, 65,137, 58, 34,198, 72,187,229, 8, 56,171, 24, 6, 81, 54, 41,165,152, 77,231, 88,244, 17, 31, 71,
+170,170,164,111, 27,154,213,146,170,170,176,121, 74, 63, 61, 59, 33, 56,202, 98,134,209, 26,163, 39, 4,123,106,162,244, 52,141,
+ 15,131,156, 89,222, 75,102, 7, 65, 77,103,106,100,158,207, 89, 46, 87,162, 71,103,100, 99, 99,131, 45, 68, 69, 39,134,194,102,
+244,174, 33,248, 72,219,245,104,101,196,182,220, 40,186,182, 7, 13,209, 69, 33, 39,134,145,182,149,179,119,213,172,152,205, 42,
+178, 52,103,109,109,141,161, 23, 79,141,100, 24, 6,250, 17,108, 98, 89, 95, 95, 67, 96,161,137,100,144, 36,140, 78,232,248,235,
+102, 7, 30, 9, 11, 89, 95, 95, 39, 6, 79,215,119, 56, 39,187,133,205,197,130, 93,187,118,226, 70,113, 39,115,163, 35, 47,114,
+154,186,161,105, 58,242,178,160, 44, 36, 96, 97, 12, 35, 70,137,141,108, 80,138, 44, 75, 73,167,172,218,224, 5,238, 81, 26,122,
+ 39,208,204,218,218, 26,193,121, 66,116,116,189,163,109,219,109,201, 86,221, 92,194, 90, 97,146, 26, 99,233,134,201, 17, 77,105,
+209, 31, 54, 13,202, 24,154,229,114,122, 16, 4,154,143, 76, 80,243, 84,128,231, 89,142, 46, 75, 84,140,120, 21,113,131, 19,216,
+ 48, 19,239,251,166,105,152,173,173,193,116, 3, 25,155, 18,131,103,232, 58, 98, 8, 56, 37,161, 40, 32,211,134,164,239,200, 3,
+ 49,145, 23, 72,171,138,229,164,231,222,154, 98,242,162,192,152, 4,109, 70,140, 77, 88,179,115, 49,231,176, 9,253, 40,196,148,
+ 97, 24,177,137, 97,177, 92,178,149, 67,158,101, 25, 90,137,228, 97,203,225,142, 32,140,214,182, 27, 9, 94,180,215,206,137,209,
+140, 82, 82, 64,131, 21, 71, 60,148, 72, 12,149, 49,100,105, 74, 4,129,218,179,108,155,184, 83,148, 37, 93,215, 9, 50,226, 36,
+188, 34,159, 10,127,150, 89,180, 17, 39,185,232, 3,198, 90,136, 22,107,253, 4,251, 91,140,181, 83,252,163,100, 46,231,105, 2,
+ 81,200,109,226, 58,101,232,134, 30,227, 29,121,146, 83,149,249,100, 76,146, 96,144, 85,130, 66,246, 89,105, 42, 93,125,240,162,
+ 63, 78,141,184, 59,117,125, 15, 90, 51,159,205, 0,217, 77, 45,222, 52,137,206,231,115,182, 60,244, 67,240,212,117,205,254,117,
+197, 63,252, 88,193,237,135, 18,104, 29,216,132, 48, 19,211, 12,125,246,117, 84, 20,127,232, 8,168, 3,107,176,183,226,238, 50,
+ 97,252,155,111, 50,220,124,130,229, 45, 31,229,200,145, 59, 72,178, 53, 66,219,176,113,230, 5,238,255,198,195,252,171,127,247,
+ 59, 60,255,210,203,172,207,215,248,165,159,249, 9, 62,241,177,143,112,248,208, 65, 8,178, 3,247, 33, 96, 18, 67,154,102, 18,
+ 15,220,182, 92,216,144, 96, 29,128,183,157,188,158,187,111,187,149,219,110,186,129,219, 79,222,196,142, 29,235,232, 36, 33, 70,
+197,235,103, 95,229,187,207, 61,207,223,126,231, 9,190,254,183,143,241,218,133,243,188,118,254,117, 94, 57,119,158, 34,207,184,
+236,192, 1,170,178,224,134,171,143,243,194,217, 87, 56,180,127, 31,137,209, 44,151, 43,190,243,221,103,248,203, 47,223,203, 31,
+190,137,129,191,117,109,195,239, 65, 12, 73,246,236, 88,103,215,100,151,123,126, 99,131,115, 23, 46,114,252,216, 81,158,123,241,
+101,206,190,118, 78,138,248,185,115,124,251,137,167,184,231,206,219, 41,210,140,126, 24,217,179,107, 23,246,197,183,202,227, 6,
+ 55,240,250,165, 77,110,188,230, 4,239,184,229,102,170,162,224,213,243, 23,240,222,243,220, 11, 47,179,177, 88,114,225,210,165,
+239, 43,232, 0,171,186,161,238, 90,210, 36,229,142,235,175,225,134, 43, 14,243, 71, 95,184,151, 23,235, 26,155,164,248, 24, 8,
+ 83,243,135,247, 66, 98, 82,144,102,130, 60,249, 24, 41, 50,209, 81,143,163, 35, 42, 69, 55,118,164, 54,157,224, 92,183, 45,113,
+ 42,242,201, 53,210,135,233, 60,144, 9, 54,177, 18,252, 66, 20,196, 49, 73, 82,130,130,121, 53,163,109, 7,208, 26,107, 20, 68,
+ 33,142,246,125, 75,132, 73, 45,130, 40, 94,154, 6,143, 39,179, 25,131,243, 16,166, 68, 73,109, 88,181, 53,209,139,212,210, 57,
+ 97,229, 71,197,182,193,151,115,114, 38,140,110,100,108, 29, 38,153, 52,227,105, 74, 28, 29,131, 31,105,155, 22,177, 60, 22,148,
+ 97, 62, 23, 9, 49, 74,220,225,250, 78,116,233,109,219, 49,140, 30, 8,152, 52,193,187, 72, 61,212,162, 4, 81,154, 60,159,154,
+ 25, 55, 50,118, 61,195, 20, 52,130,224, 89, 19, 65, 48, 33, 40, 77, 8,142, 52, 77,208, 58, 39, 4,201,137, 15, 65,220,234,154,
+174, 97,172, 71,148,150, 68, 51, 53, 58,186, 65,158,227, 16, 34, 69,106,197, 94, 53,203, 4,146,111,122,204,116,118, 58, 39,150,
+176, 70, 41,186, 32,171,204,182,235, 81, 8, 71, 70, 98, 88,197, 84, 42, 49,134,196, 36, 68, 21,112, 78, 44,144,157,247,148,147,
+ 23, 70,223,117,148,101, 73, 48, 98, 29,188, 88, 44,100, 64,234, 33, 68,133,177, 26, 55,122, 82,107,105,154, 6, 99, 51, 49,110,
+193, 48,246, 98, 72,164,209, 24, 19, 72,116, 66, 63,180, 48,245,235, 70, 41,116, 34, 89, 31,169,149,184, 91,113, 34, 21,245, 77,
+ 83, 55, 36,214,110,115,152,148,145, 0, 23, 31, 2,209,123,150, 43,225, 30, 25, 43,121, 8,171,113,196,106,131, 75,196,187,222,
+106,141, 66,203,231, 82,149, 4,231,105, 66,207,198,198, 6, 33,108,217,182,123,113,244,108,196,108, 72, 35,126, 36,193,121, 18,
+148, 38, 53, 9,179, 89,133,214, 9,206, 73, 81, 20, 15,116,137,196, 92,172, 86, 36, 90, 97,243, 84, 82,184,128, 16, 13,106, 24,
+201, 75,203,114,115, 65, 98,180,252,146, 83,183,178,170, 87, 84, 51, 49,178,175,155,134,113, 33,102, 38, 90, 43, 50, 43, 6, 35,
+105, 38,178,183, 50, 43, 9, 62,144, 88,153,180, 87,141, 68, 33,150, 86,180,163, 33, 4, 86, 77, 67,240, 66,172,200,243,156,186,
+110,168,107,145, 56, 5, 28,169,177, 12, 67, 71, 89, 86,210,237,141, 34,221,234,199, 17,191, 92,160, 66, 68,229,185,164,205,197,
+ 40, 58,102,164,163, 51, 90, 19,181,162,109,123,102,243, 10, 21, 35,217, 76, 32,104, 31, 61,221,224,133, 79, 48, 58,218,102, 74,
+253, 50,154,217,218, 28,173, 13,232,169, 96,186, 0, 81,254,142,124, 70, 65, 86, 17, 69,129,157,224,242, 44, 77,113, 94,116,210,
+179,217,108,114,213, 91,159,116,238, 30,167, 20,105, 42,144, 31, 46,208,123, 97,148,118,221, 72, 12,162, 51,175,202, 25, 73, 98,
+196,240,192, 9,116,175,149,228, 31, 55, 11, 49,134,233,199, 97,251,230, 43,242, 2,148,236,115,180,214,108,153,173, 36, 73,130,
+ 31, 6, 97,199,143, 35,101,158, 79,252,133, 14,101, 52,120,137, 76, 28,221, 72,106, 18, 92,244, 82, 48,149,194, 26, 67, 84,130,
+102,164,105,142,242,129,186, 93,161, 80,184,209, 83,205,228, 96, 41,179,140,196, 90,178, 24, 37, 8, 6, 9,162,137, 49,208, 14,
+ 3, 97,116,248,209, 99,202, 4, 9, 93,137,184, 97, 32,207,165,217,201,172,196,159,106, 38,159,236,224,105,251,158, 56, 29, 92,
+214,138,251, 92, 12,145,102, 34, 84,245, 93, 7,209, 19, 39,116, 65,107,141,154, 48,154,163,251,115,254,249, 71, 83,118,184,145,
+225, 43,167,176, 39,142,240,213,251,191, 71,182, 54,231,237,215,238,128, 36, 16,247, 29,128, 42,131,213, 10, 74, 80,175,109,192,
+197,139,240,161,119, 81, 31,254, 41,246,237, 60,129,239, 91,198,229, 38,103,206,156,225,222, 7,191,193,255,246, 27,255,142,215,
+ 55, 54, 0,248,169,143,126,152, 95,248,233, 31,103,239,222, 61,160, 52, 97, 24,104,155,150, 52, 75, 49,121,198,169,167, 78,241,
+171,255,211, 63,231,145, 39,191,203,214,149,103, 41,123,118,238,162, 42, 11,230,179, 74, 96, 53, 55,138, 20, 84,107, 46,108, 92,
+228,233,103,159,227,243, 95,253, 26, 79,156,122,118,123,253,181, 99,109,198, 71, 63,248, 1, 62,244,238,119,114,251,205, 55, 98,
+ 19, 33, 5,141,206, 97,211,130,205,197,146,197,106,193,193, 61,123,185,231, 29,183,115,234,217,211, 18, 22,195, 27, 83,250,193,
+253,123,185,242,242,203, 57,124, 96, 47, 27,155, 98, 14,117,211, 53, 39,120,219,141,215,113,223,215,191,201, 63,251, 63,255, 13,
+175,158,187, 64,158,165,220,116,245,113,174, 59,113,156,235,174,186,146, 27,175,189,134, 97, 24,121,238, 47, 62,205,215, 30,126,
+100, 27, 49,120,243,107,111, 46,150,188,244,202,171, 60,250,228,119,201,172,165, 42, 11,190,251,236,243,124,243,209,199,120,245,
+220, 5, 30,125,234,141,207,224,205,215, 51,207,191,192,170,107,120,237,194,235, 60,248,173, 71,184,253,150, 27,249, 7, 63,249,
+163,188,240,202,107,252,222, 95,125,137,186,239, 72,211, 28, 99, 4, 9, 66,139, 3,166, 86, 2, 69,230,185,216,253,250, 32,112,
+183,143, 50, 1,141, 46,146, 89,200,114,139, 79,204, 4, 79, 75, 81, 80, 10,148, 55, 66,232,154, 56, 56, 10, 25, 48, 98, 8,116,
+163, 72, 29,163,206,100,143,238, 29,152, 84,156, 23, 85,196, 7,133, 10, 3, 99,239,152,205,102, 8,113, 75, 34, 95, 93,240,216,
+ 84, 66,129, 52, 48,120, 81,227,160,129, 16, 36,107, 61, 70, 12, 34,175,236,134, 97, 59,135, 34, 34,110,141, 93,223,209,117, 29,
+229,196, 86, 7,145,170,118,117, 67,146, 89, 18,109,233, 71,177, 72, 53,198, 98,173,164,223,197, 24, 41, 42,105,100,140, 50,212,
+171, 26,148,112, 84,146, 9, 73, 35, 10, 60,173,115, 67, 63,200,254, 90,105,113, 47,211,104,162,138, 12,253, 64,223, 75, 50,229,
+ 22,129,108, 24,132, 4, 56,122,143, 49, 18,149,154,100, 9, 34,181, 18,115,158,202, 38,219,159, 5, 81,154,245,113, 20,143,255,
+196,166,146,116,167, 12, 89, 97,201,210,148, 85, 35,231,122, 89,148,180,125,139,209, 50, 92,249, 32, 65, 88,206, 13, 36, 70,200,
+220,226,186, 23,133, 59,164, 51, 98,148,117,101, 90, 20, 36,198, 16, 49,232, 98, 75,174,246, 6,239, 96,181, 18,185,245,168,132,
+ 72, 55, 12,194, 19,178,214,226, 9,130, 16,143, 61, 90,137, 37,182, 82,146,218,214,245, 45, 46, 70, 66, 31,136, 33,226,243,145,
+113,244, 36, 73,138, 77, 18, 86, 77,141, 77, 51,116, 98, 88,174, 86, 20,121,134,138, 34, 41, 12, 65, 84, 8,179,201,180,172,204,
+ 75, 76,165, 88, 46,107, 82,155,225,250,142,136,228,208,175, 26, 9,111, 25, 71,153,212, 37,157, 78,248, 34,253, 56, 50,159,205,
+ 24,135,129,190,239,137,139, 72, 85, 84, 24,147,160, 34, 36, 70,107, 66,148, 67,190,109, 87,100, 89, 78,140, 94, 66, 49,140, 88,
+138,150,165,144,210,162,139,180,174,151, 3, 29, 41, 38,206,187,237,169,111,244, 30, 55,202, 20, 58,142,142,197, 98,193,172, 90,
+155, 22,248, 98, 10,128,182,178, 11, 5,250, 81,194, 67,154,190, 69, 41, 69,234,228,230, 9, 62,176, 88,173,200,115,153,224, 23,
+139, 37, 33, 6,102,107,107,172,150, 75,180,145,136, 79,249, 96, 10,108,158, 10, 33,166,105,197, 2,213,123,202,162,100,243,210,
+ 37,188,119, 16, 5,134,103, 28,241,105, 74, 63, 12, 16,195,246, 65,175, 0,180, 34, 47, 10,250,113,156, 80, 10, 77,102,101,207,
+131,150, 46,211, 59, 97, 50, 42, 37,144,110,223, 15,216, 68,114,119,219,174, 33, 79, 11,217, 71, 27,217,237,133, 32, 58,198,182,
+174,233,181,104,205, 37,167, 89, 65,140,172,154,134, 36, 73,168, 87, 43,137, 97,237,196,188, 96,185, 88, 82, 21, 51,250, 73,187,
+ 94, 55, 53, 69,150, 11,100, 55, 53, 7, 74,222,186,232,119,251,145,204,202,107,218, 84,110,246, 52,166,216, 68,139,142, 91,201,
+ 62,136, 24, 33, 10,225, 47,203, 50,186,213,106, 90,131, 4, 80,138,160, 20,227,216, 49, 70,152, 85,115,156,146,192, 13,239,166,
+ 48, 14,196,249, 41,203, 50, 50,155,209,141, 35,120,129,245,227,232,100, 55, 52, 10,239, 96,116,163,144,215,102, 51, 33, 54,105,
+ 33,121, 56, 23, 24,227, 0, 74, 51,203,242,237,220,246, 24, 2,163,139, 88,173,233,188,120, 27, 36, 86, 76, 38,202,164,146,195,
+ 69,105, 66, 52,172,231, 66,118,243, 65, 38,136,174,149, 7,173,107,155, 9,153,240,200, 42, 38,160,141, 38, 53, 41,253,216,162,
+244, 79,176, 0, 0, 32, 0, 73, 68, 65, 84,179,179,208,252,211, 15, 38,236, 76, 1, 23,177, 55,158, 32,102, 22, 23,224,100,222,
+243,216,159,222,199, 77,191,242,147,168,139, 11,248,222, 69,180, 2,174, 57, 66, 84, 35,241,192, 58,175,141,183, 51,159, 95,137,
+235, 91,198,213,138,167,159,125,142,231, 94,124,153,167,158, 59,205,155,175,255,239,207, 62, 73, 81,164,252,212, 15,125,152,195,
+ 7,247, 75, 71, 61,140,164,121,202,231,191,112, 31, 63,255,223,254, 15,178, 79,123,211,181,103,231, 14, 50, 43, 81,191,135,246,
+239, 37,184,145,186,241,104,211,243,244,115,207,243,169, 47,220,199,103,191,252,149,109,227,151,173,235,210, 98,197,191,255,179,
+ 79,241, 87,247,126,133,143,188,239,221,124,228,125,239,225,228,245,215,178,115,125,141,113,148, 24,212,245,249, 58,215, 29,191,
+138,215, 47, 93,250,207,186,199, 53, 77,199,157,183,220,200,177, 43,142,112,213, 21,151,179, 54,155,113,230,213,215,248,204,151,
+238,229,185,231, 95,150,201, 15, 56,180,127, 31,107,243, 25,243, 89, 69,154,166,220,255,208, 55,248,230, 99, 79,112,254,194,134,
+220,211,111,186,182, 94,123, 54, 73, 52,119,175,175,115,104,239, 30,158, 59,115,150, 71, 30,127,156,199,159,249, 30, 47,157,121,
+101, 66,213,164, 1,184,236,192, 62, 76, 98,121,225,229, 51, 92,125,236, 40,183,222,116, 3, 69,150,179,111,239, 30,186,126,224,
+255,250,127,127,151, 87,206,157,167,174, 91, 94,222,184,196,209,227, 39,216,177,107, 39, 67, 55, 76,142,143, 74, 86, 81,202,224,
+180,164,173, 25, 18, 92, 20,217,110, 0,136,129,186,109, 73, 19,141,182, 25, 74, 69,186,110, 68, 27, 61, 25,216, 68,148, 73, 48,
+198,224, 6,225,247,152, 68,144, 44,107, 36,225,205,121, 71,153,231, 52,117, 75, 83,215,164,137, 36, 80,134, 24,240, 65, 17,157,
+ 99,185,116,160, 35, 70,153, 73,114,148, 19, 70,177,220, 54,105, 78, 18, 3,105, 37,154,107,231,228, 62, 78, 20, 4, 34,153,169,
+ 68, 38,235, 70, 50,107,233,219, 1,155, 89, 41,238, 78,164,170, 54,181, 12, 77, 79, 84, 65,254,251, 32,110,111, 73, 16, 56, 90,
+107,129, 98,149, 86,128,144,186,130,143, 96,141, 20,244, 44, 39,207,115,156, 27,233, 59, 41,178, 91, 83, 96,112, 1,114,209,223,
+ 11, 47, 6,241,244,176,194,177, 18,205,189, 16, 3,141, 17,228, 83, 5, 69,146, 8, 55,199, 77,168,201,170,150, 66,233,189,200,
+205, 98, 4,162, 52, 19,131, 19,105,110,153,230,164,211,148, 30, 3,232,212,136,231, 68,179,162,107, 91,148,214, 16, 60,125,223,
+225, 71, 71,154,102, 36,153,248,148,136, 97,149, 68,195, 42, 5,222, 13,104,173, 48, 70,194,150,154,182, 21, 53,139,209,244, 83,
+141, 81, 74,214, 88, 91, 86,215,160,240, 62,146,199, 72,239, 58,202,188,148, 1, 45, 70,218, 38,160,173,101,181,146,152,218,162,
+ 40,240, 94,210, 41,189, 15, 92,186,180,193,106, 53,162, 20,108,110, 58,242,178, 34,250,200, 24, 70,148,147,208,160,113, 24,201,
+243,148,178, 20,237,126,223,245, 20,179, 2,113, 28,148,245,245,174, 93,187, 8, 33, 98,179,124, 90,177,136,140, 56, 70,136, 72,
+ 77, 13,193, 79, 77,150,218, 62,199,211, 52,165, 31,187,109,155,228,173,117, 99, 2,160, 17, 54,122,154,164,116,221, 64,215,246,
+180, 77, 15, 40,178,162,192,185, 64,221, 53, 98,192, 15,219,127, 57,196, 72, 85, 86,146,112,148,166, 92,218,220,132,248, 6, 9,
+ 44, 51,194,154, 14, 33,208,246, 29, 99, 55,160,205,136, 77, 83,130,151, 55,185,117, 0, 68,239, 73,114,209, 93, 91,171,183,187,
+142,197,226, 18,198, 36, 66, 50, 65, 44,247, 70, 63,162, 72, 38,114,135, 16, 38,234,149, 4, 56,212, 43, 17,255, 51, 29, 51,121,
+ 94,160,180,132,177, 68, 20, 90, 43, 70,165, 41, 43,137, 97, 29,189, 19, 50,138, 22,162, 94,223,117, 24,165,112,131, 35, 75,115,
+196,109, 44, 76,132, 11,217, 79,135,233,166,141,222,163, 39,136, 47, 70,133,143, 65,200, 99,125,196, 7, 33, 2,150,179, 25, 93,
+211, 80,205,231,242,218, 86,162, 14, 77,162,153, 21, 21, 1,113,200, 11,193,139, 97, 78, 93, 83,148, 37, 62, 78,182,139,125, 79,
+ 81,228,242, 29,133, 73, 73, 48, 12,140, 81, 30, 84,177,133, 28,241,209, 97,180,198,121,133, 27,131,176,163,109, 66,101,170,109,
+153,154, 49,102,123,130,209, 90,163,146, 4, 59, 21,198, 16,133,179, 80,149, 18,137,185,170,151,211, 78, 72, 11,194,162,196,199,
+217,121,135, 54,154, 48,120,130, 31,209, 36,216, 52,161,235, 6,138, 52,195, 55, 11,148, 18,159, 98,165,100,197, 50, 14, 3, 69,
+ 81, 96,179, 12,155, 9, 19,221, 59,135,177, 9, 6,129,219,125, 16,184, 49,155, 86, 24,203,122,197,218,108,141,213,106, 1, 74,
+ 34,102,109,162,169, 42, 97,120,138,239,177,162,235,123, 92,140,216,196, 48, 40, 67,154, 74,104, 70,211,118,114, 24,135, 64,208,
+158, 61,187,119,240,171,239,142, 28,216, 99,137, 78,193, 60,131,186, 7, 63,242,190,227, 59, 97,111,202,201, 67,119, 19,154, 37,
+177, 94,161, 14,237, 34,204, 43, 84, 61, 64, 2,231,195,173,148,215,220, 67, 24, 58, 46,189,126,129,199, 79,125,143,135, 31,123,
+156,207,222,247, 53, 78,191,116,134,139, 83, 62,253, 63,251,199,191,202,223,255,196,143,147, 22, 57,205,106,197, 98, 85,211,118,
+ 61,198,104,158, 56,245, 12,255,243,191,254,127,222, 82,208,147, 36,225,238, 59,110,229,163, 31,124, 47,215, 28,187,146,253,123,
+119,115,217,129,253, 92, 90,174,240, 78,188,164,191,252,213, 7,249,211,207,124,118,123,194,126,243,165,181,230,182,155,111,224,
+253,119,190,157,107, 78, 92,197,190,221, 59, 40,115,241, 7,223,184,180,160,233, 59,246,238,222,201,163, 79, 62,201,127,248,244,
+231,100, 79,251,166,203, 24,195, 21,135, 15,114,242,250,235,184,241,218,171, 81, 90,108,147, 47,110, 46,248,220,125, 15,240,224,
+ 35,143,110, 79,224,207,189,248, 50, 59,230, 51,142, 94,118,152,126, 16,167,178, 79,126,246, 75,219, 8,197,155,175,143,188,255,
+ 30, 70, 55,242,195,239,127, 31, 31,122,239,221,196, 24,121,237,194,235, 12,206,209,118, 61,171,229,138,173,228,178,173, 6, 96,
+ 99, 89,243, 95,252,196,143,114,252,200, 97,126,246,167,126, 12,187,107,157,208, 15, 60,244,213,135,248, 55,191,251, 71,124,249,
+193,175,211,117,111,160, 1,207,159,126,129,119,220,245, 46,246,236,221, 11, 42, 18, 3, 84,213,140,182,111,133,199, 81, 15, 34,
+107, 29, 53, 32,147, 98,102, 37, 35, 65, 56, 39,146,139,158,199,184, 13,133,250,137,188,107,109,194,232, 2,209,131, 87, 35,125,
+235,100, 90, 74, 60,190,135, 96, 61, 81, 33,231, 8, 96,177, 12,163,124, 38,253,208, 67, 80, 68, 21, 40,243,146,113, 24,104, 90,
+177,153, 70, 1,221, 64, 84,145,182,111,240, 78,214,148, 33,232,137,112, 53,173,167,250,142,170,154, 77,242, 40, 79, 55,229,164,
+131, 60, 83, 89, 38,220,145, 16,196,243, 59, 85, 57, 74, 73, 12,173, 86,138, 64,144, 51,177,154, 49, 12,195,246, 10,205,141,146,
+105,158, 36,102,250,223, 34,175, 77,172,193, 15,158, 36,213, 56, 39, 60, 21, 61, 53, 91,121,145,147,165, 18, 97, 42,133, 80, 19,
+131, 39, 75, 18,146, 52,165,174, 87,108,217,203,110, 5, 32,101,169, 37, 24, 79,145,229,140,163,162, 31, 28,102,154,126,155, 70,
+234,136,181,150,213,230,146, 36, 23, 35,174,186, 94, 97,204, 58, 74, 41, 18, 99, 73,178, 4, 23, 2,222, 13, 4, 47,220,167,118,
+232,241, 78, 24,233,214, 90,172, 49,140,170,167,235,122, 76,154, 51, 14, 29, 42, 66,150,102, 68, 45,164,103,105, 26,145,213,106,
+144,239, 45, 4,143, 26, 38,149, 80, 12,104,165, 73,140,197,199, 64,116,146,185,145,166,150, 16, 53,222, 15,219,247,169,214,134,
+168,212,118,131,128,146,194,236,198,145,174,233,201,203, 2,173, 97,181, 88,145,165, 34,101, 27,134,145, 44,203,183, 13,100, 36,
+239,190, 64,195,212,100,104, 98, 20, 95,151,217,218, 28, 34,130, 92,167,194, 59,136,200,189,234,189, 52, 55,195,116, 63, 69, 31,
+ 40, 11,241,138, 17,181, 19, 68,162, 16,229,178,105,135,186,185,185,137,243, 30,155, 36, 40, 20,163,159,210,211, 66, 0, 47, 25,
+211, 94, 9, 81, 96,139, 16, 87,183, 13,213,108,134,142, 2,231,142,195,192,106,181,162,168, 10,188, 19,152,121,185, 88,226,189,
+ 71, 91, 75, 61,237, 59,181, 54,228, 69, 9, 42,138,206, 82,107,186,174,197, 7, 49,104, 88, 46,151,164,105,138, 82,226, 67,223,
+247, 45, 46, 76,133, 52, 73,200,172, 98,109, 62, 19,131,148,168, 73,243, 66,118, 46, 86,164, 63,221, 48, 96,179,148,224, 38,131,
+ 3,197,196, 60,118, 68,101,100, 71,100, 36, 49, 41, 91,179,210,169,163,222, 8,109,137,226,114,102,109,130, 53, 6,212,214, 94,
+ 54, 48,184, 65,200, 56,117, 45, 55, 11,128, 6,231, 70, 84,148,189,105,102, 50,234,149,252,222, 73,146,160, 99,100, 84,138,177,
+235, 48,137,193,119, 14,147,164, 40, 36, 89, 45, 42, 97,102, 2, 24,157,208,117,141, 72,182,180, 97,236,123,186,224, 81, 17, 97,
+154, 42,145,135,204,230, 51, 80,144,100, 9, 6,133,115, 72, 3, 19,132, 93,155, 37, 41,206,191,225, 23,159,167, 98, 76, 49, 14,
+ 34,119, 75,140, 17,153, 30, 16,149,184, 93,245, 65, 2, 91,178,162,192, 40,205, 48,140, 4, 13, 70,137, 3,160,154,110, 46, 9,
+192, 16,203,218,102,213,144,164, 66, 68,202,242, 92, 8, 53, 74,161, 16, 25, 91,136,242,159,235,235, 59,216,146,182,152, 68, 2,
+ 29,136, 34,123,220, 50,116,216,250,151,181,118,138,115, 12,211, 1, 52, 18,131, 6,213,138, 70, 59,136,159,119,145, 23, 20,121,
+ 78,215,117,147, 60, 70,214, 30, 54, 53,148,213,156, 68, 5,110, 63, 98,248,161,107,225,234,157,138,231,238, 59,205,133,198,113,
+199,221, 7,192,164, 40,147,162,110, 61, 10, 27, 43,168, 2,100, 22,110, 58, 1, 39,110, 65,189,254, 42, 60,250,183,108,164,135,
+ 73,174,253, 16, 42,140,156, 57,251, 10, 15,124,235,111,248,204,151,191,194, 35,143, 63,201,185, 11, 23,121,179,118,123,112,142,
+ 87,207, 95,192,104,197, 56,122, 49,208,153,205,209, 74,137, 91, 92,220,254,163, 40,165,184,242,178,195,252,189,143,125,132, 15,
+189,247,110,170,157, 59,229, 31, 56,199, 14,173, 57,115,246, 21,126,255,147,159,225, 15, 62,249,233,255,108, 65,223,146,202,221,
+118,242, 38,174, 62,118,148,121, 89,110,147,142,234, 11,173,168, 82,138,130, 11, 27,151,248,230,223, 62,254,125, 5, 29,224, 93,
+183,221,194,207,125,252, 71, 72,146,132,141,205, 77,246,237,222,197,108,231, 26,135,246,239, 99, 54,155,209,180, 29, 59,214,214,
+248,192,187,223,201, 45,215, 95,203,129,221,187, 56,126,236, 40, 90,105,254,230,241, 39,120,247, 29,111,227,179,247, 63,248,150,
+ 98, 11,224,125,228,151,127,238,103,120,251,201, 27,233,251,158, 87,206,159,103, 85, 55,236,223,189,147, 99, 71,142,112,239,131,
+223,248,190,247, 82,215, 53, 15, 63,246, 29,110,186,230, 56,167,190,251, 12,139,122,197,151, 31,250, 38,143, 62,254, 36, 95,127,
+228,177,239,251, 25, 77, 93,243,149, 47,126,137,189,251,247,115,237, 13, 55, 50,159,149, 2,243, 34,207,111,106, 45,222,129,199,
+ 83,229, 21, 17, 80, 42, 16, 81, 12,189, 35,248, 17,231,229, 48, 29, 27,207,232,166, 4,176, 65, 97, 74, 35, 8, 88,150,145,101,
+ 25,163, 26,166, 1,201,147,217,132, 49, 8,251,123,235, 11, 29,250,158, 34,151, 51,207,106, 75, 51, 54,219,164, 96,147, 36,204,
+ 83, 57, 15, 70,239, 33, 5,239, 37,105,171,168, 74, 57,107,199,129,174,119,108, 53, 28, 10, 88, 45, 22, 24,107,176,105, 70,136,
+ 14, 29,228,108,176,169,144,147,211, 60, 99,232,122, 72, 13, 89,150,203,185,215, 53, 24,157,144,166,169,232,210, 3,216,212,226,
+156, 36,134,201, 74, 85, 10,210, 48,202,158, 94, 41,133,138,138, 34, 45, 8, 65,152,229, 62, 72,180,170, 49, 18,191, 90,228, 5,
+ 38, 49, 24, 99,104,187,158,162,216,146,238,137, 91,159,210,138,166,235, 36, 42,122,112,144, 42,116, 20,200,218, 38, 41, 70, 79,
+170, 15, 45, 97, 76, 74, 49, 77,210,150,190,235, 24, 0,173, 96,115,113, 9, 21,167, 1, 98, 66,114,181, 78, 49,211,249,208, 13,
+157,152, 77,141, 35, 73,244, 24, 85,160, 77, 66, 89,106,130, 86,100,217, 12, 63, 6,154,174, 17, 40, 61, 70,148,244, 66,162, 0,
+170,132, 48,231,229,163,166, 31, 68,137,179,182, 86, 76, 67, 66,135,119, 17,166,115, 60,170, 64, 53,159,211,214, 53,109,223, 18,
+163, 98,108, 71, 84, 64,172,191,173, 97,232, 59,156, 19, 89,117,162, 36, 91,164,154, 87,168, 40,245, 99,185, 92,138, 26, 75,107,
+188,143,148,101, 62, 33,172, 61, 67,215, 76,205,132, 71,147,224, 38,178, 91, 8, 14,227, 83,138, 44,165, 29, 58,202,172, 4,131,
+160, 40, 72, 51, 30,180, 18,162,102,162, 41,179,153, 52,121,222,147, 40,173, 39, 89, 64,191,125,222,184, 32, 29, 28, 65,200, 94,
+ 40,136, 90,228, 94,179,249,124,178, 33,180,104, 12,171,122, 69,219, 52,168, 24, 37,224, 36, 70,172, 77, 89,213, 43,148, 82,172,
+ 88, 77,176,133,103,115, 99, 3, 61,117, 92, 1,241, 29, 54,214,178, 88,173,196,186,208,131, 82,145,166,110,136, 17,186, 78,228,
+ 7,195, 56, 82, 86, 21,102,112, 56, 37,236,207,214, 59,108,154,145,104, 67, 98,133,193,159,103,115,113, 92, 11,210,128, 12,163,
+184, 89, 85, 85, 33, 15,121, 42,238,101,198, 36,226,184, 54,142, 19, 1, 68,211,212, 13, 89,153, 75,231,132,144,108,130,115, 36,
+ 70,211,141, 35,125,219,137, 46, 48,202, 68, 63, 14,131, 40, 4,140,248, 53, 27, 91,138, 27, 89, 89, 10, 83,219, 40,108,102, 33,
+ 10, 51,213,135, 64,162, 53, 73, 38,157, 23, 65, 65, 12,194,164, 12, 1,180,102, 28,182,172, 85,133,113,110,140, 65, 25,141, 78,
+ 13,201, 56, 98, 18,189,125,227,225, 61,117, 83,139,199,128,147,164, 37,141, 33,205, 45, 94, 43,178,172, 64, 37,154, 36, 38,172,
+205,214,100, 55,101,237, 54,241,109,181, 20, 67,154,170,146, 36, 32,173, 20,213,124, 13,239,133, 89,155, 24, 67,211, 54, 68, 47,
+ 12,250, 44,203,104, 86,205, 54,212,166,244, 68,144,137,114, 40,104, 20, 38, 81,248, 65,208,132,126,232,100,103,103, 19, 76,146,
+160,163,154,246, 99,178, 83, 28,251, 17,155, 6, 64,216,201, 73,146, 80,216,148,190, 19, 34,102, 8,129,232, 35,104,141, 27, 58,
+178, 44,103,203, 86, 51,106,228,128,136,224,252, 64, 28,226,246,247, 60,142,129,162,200,216, 89,194,173, 87, 40,222,123, 69,228,
+248,186,134, 23, 47, 18, 67,197, 23,159,187,192, 7,143,238,128,193, 67, 15, 28, 72,136,205,130,184,163,130,197,128,182, 21,241,
+216, 49,168,222, 5,195,125,212,175,143, 52,215,191, 19, 58, 49,170, 88,213, 43, 78,191,248, 18,175,188,118,254,251, 10, 58,192,
+233,151, 94,228,197, 51,146,147,158, 24, 61, 5,134, 4, 30,252,219,111,243,232, 83, 79,179,177, 88,110,255,217, 24, 35,207, 60,
+255, 2,191,250,235,255,130, 95, 60,245,227,252,194, 79,254, 24, 87, 92,115, 21, 42, 79,161, 27,248,189, 63,251, 11,254,239,223,
+254,253,239,251, 25, 59,215,215,185,230,170, 43,120,219,245,215,241, 3,247,220,197, 85, 87, 92,206,170,105, 56,127,241, 34, 49,
+110, 53, 82,176, 62,171,120,245,252, 5, 62,249,249,123,121,226,233,103,248, 79,175,131,251,247,114,248,192, 62,180,209, 92,117,
+228, 48,218, 36,244,195,200,171,231, 47,240, 23,159,255, 50,247, 61,244, 77, 0, 46, 45, 22,188,126,113,131,187,111,191,149, 35,
+135, 15,209,212, 43,206, 93,188, 68, 98,196,201,239,205,197,118,255,238,221,220,126,242, 70,238,186,227, 54,134,190,227,213, 11,
+ 23,208, 74,241,232, 83, 79,243,215, 95,250,138, 56,208, 53, 29, 91,249,240, 32,106,132,196, 26, 82,155,210, 52, 13,175,158,191,
+192, 45, 55, 92, 79, 17, 10,174,186,252, 48, 23, 46,110,176,243,217,211,219,113,181,111,190, 98, 0,156,227,244, 83, 79,176,239,
+208, 65, 14, 94,118, 57, 1, 73,124,180,214, 18,141,196,167, 14,163, 68,138, 46, 23, 98, 59,189,190,190,134,214,211,122, 13,205,
+ 48,244,148,182, 96, 12,178,119, 30,199, 97, 66,231,132,107, 83, 20, 25, 34, 69,147,198,205, 59, 71, 36, 50, 12, 3, 76, 16,117,
+ 55, 14, 20, 69, 38,228, 92, 45,141,116,219,181, 24, 35,132, 86,107, 51, 72, 4,169,116,181, 76,171, 18, 29,171,153, 85, 51,201,
+122,119,142,170, 90, 19, 88, 63,207,241,147,174,187, 48, 21,221,196,218,239, 58, 73,251,114,206,225, 99,192,119,158,177, 31,201,
+139, 2, 63, 6, 70,213,177,149,106,167,128,196, 36,210,240,198, 64,158, 23,116, 77, 79, 32, 80, 86,179,137, 73, 47,207,161, 15,
+142, 68, 25,218,126,196, 88,131, 49, 9, 38, 81, 36, 38,135, 32, 81,216,137,150,136,104,215, 59,154,161,198,102, 41,206, 9, 20,
+156,217,140, 97,232,133,228,219,119, 88, 35,106,152, 22, 40,242,124, 82, 4, 85,248,232,105, 86, 13,121,150,203,121, 96, 18,220,
+ 48,144,164, 26,157, 72,118,188, 15, 30,157, 88, 6, 55,162,241,144, 24,186,166, 17, 94, 77,140,232, 40,113,206,110,112,160,149,
+112,146, 92,196, 88,197,216,203,112, 52, 12,210,176, 9,111, 64, 56, 65, 91, 4,232,104,163, 12, 38,105, 70,106, 53,117, 45,156,
+ 23,162,162, 42,178,237,251,107,244, 30,163, 4,142,239,218, 94,248, 5, 58, 82,229, 5, 62, 10,210, 19,198,128, 41, 68,206,189,
+ 21,248, 51,116, 18, 53,190, 92,173,240,222, 79, 69, 93, 6,212,128, 20,103, 63,250,109,142,147, 36, 86, 66,221,172, 40,210,156,
+110,136,140,227, 64, 32, 98,141,165,157,226,148,163, 17, 31,149,209, 9,236, 47, 4,101, 57,255,250,161,195, 38, 41, 73,146, 24,
+ 97,117, 6, 75,129, 72,165,108,150,210, 13, 3,110, 24, 9, 17,102, 85,201, 24, 61, 54, 17,184, 35,100,153, 24,153, 36, 2,231,
+202, 15,241,140,125, 43,161, 34, 49,160, 91,209,134,230,121, 46,230, 50,109, 15,104,162, 6,157,166,204,103,179,237, 29,129, 82,
+106,218,155, 71,105, 14, 42, 49,227,151,206,110,130, 60,162, 68,156,166, 19,100,239,198,145, 56, 73,226,134,161,163, 89, 57,214,
+119,238, 32, 73, 19, 76,148,157,247, 56, 74, 14,176,247, 65,218, 64,196,183,190,233, 58,234,229, 82, 30,166,181,117,204,212, 29,
+175,222,116,224,202, 7, 5, 76,208, 7, 40,209, 62,122,207,232, 5,122, 26,198,145,161, 22, 66,195,150, 79,239, 56,136,177, 75,
+240, 94,246,234,206,177,113,233, 18,120,209, 87, 42, 37, 41,104,202, 88,134,190, 23, 13, 38,138,170,170,152,205, 36,131, 87, 27,
+ 9,146, 33, 70,130,243,180,109,131,205, 44,122, 84, 4, 29,167, 61,141,236,227,194,116, 99,216,212, 18, 92, 68,161, 73, 83, 97,
+204,214, 77, 13,136, 1, 71,158,101,116,131,248, 55, 39,209, 10,240,224,133, 51,145,164, 57,214, 40, 6, 55, 82,149, 5, 91,154,
+245,181,217,124,106,140,192, 79, 63, 51,248, 72,106, 69, 27, 9, 2, 31,105,173,137, 1,198,177,199,104, 33, 30,106,157, 64,212,
+ 36,211, 42, 95, 52,168, 2,163, 71,165, 72,115, 97,179,107, 45, 44, 79, 99, 4, 74,207,210, 20,239, 2,193,123, 76,106, 48,163,
+ 66,231,162, 57,141, 65, 62,191, 36, 73, 73, 38, 18,165, 76,251,136,189, 46, 0, 35,239, 57,238,248,196, 73,205,218,116,176, 2,
+196, 35,187,137, 23, 58,238,140, 43,234,111,159,129, 91,126,136,254,213, 87,201, 30,123, 5,245,129, 91,224,229,134,223,250,244,
+223,240, 95,126,248, 70,212,237,239,131,252,106,130,254, 26,143,247, 7,201,252, 58,230,226, 69,124,244,156, 59,127,145,190, 31,
+233,122, 49, 69,217,170,183,239,186,237, 86,254,201,175,254, 18,135, 15,236, 37,203, 50,114,155,146, 36, 9,139, 85,205, 31,124,
+242, 47,249,141,223,253,195,109,125,248,214,117,226,232, 21,252,250, 63,254, 21,222,127,207, 93, 40, 99, 72,119,205,113,155, 43,
+254,236, 79,255,130,223,252,131,255,248,125,137,107, 32,133,250,199,126,240,131,188,231,206, 59,184,225,196, 85, 84,179, 10,107,
+ 83, 50,235,137,197,164,225,159,207,217,189,115,167,196,170,182, 47,179,107,199, 58, 87, 29,185,156,197,178,166,155,248, 44,239,
+191,235, 78,126,249,103,127,122,154, 30, 60, 23, 54, 22,236,219,179,139, 60,207, 56,255,220, 6,191,255,169,191,164,109,197,227,
+224,150,107,175,230,232,229,151,243,236,139, 47,177, 54, 43,121,253,210, 38,191,247,167,127,193,106,181,226,133,151, 95,217,126,
+111,105, 98,185,252,208, 65,174,184,236, 16,251,247,238,102,231,142,117, 54, 55,151,104,163,185,241,234,227, 60,240,173, 71, 68,
+118,245,166,130, 14,144,231, 25,183,220,112, 45,119,156,188,137, 35,135, 14,112,253,213,199,217,179,115, 7, 79,158, 58,199,203,
+175, 93, 96,185,170,217,179,103, 23,175,111, 44,104,251,110, 27,201,113,227, 64,136,129,245,121,197,149,151, 29, 6, 96, 22, 61,
+235,251,247,177,177,108, 24,130,195, 24, 69,136,226,138, 40,112,181,124, 97,117,221,146, 36,154,162, 40, 88, 53, 91, 41,142,129,
+126,209, 80,205, 74, 18, 45, 43, 39,101,132, 44,230,156,132,153, 36,137, 24, 95,137, 62, 28, 8,162,131, 31,251, 17,180,228, 7,
+ 12,106,160, 44,132,111,148, 36, 6,107, 83,154,186,193,121,199,108, 62,163,105,228,121, 54, 86,172,129,199, 97, 20, 85,132, 73,
+137,104,180,134,249, 20, 94, 53, 4, 24,134,158,152, 40,172,209, 83, 60,172,192,199, 98, 41, 43,252, 37, 55, 74,162,156, 72,148,
+ 45,131, 23,184, 59,203,172, 76,208,137, 36,173,141,195, 40,150,176, 54,161,107, 86,160,228,231,105,165,136, 74, 38,228,153,181,
+210,204,219, 12,173, 5, 85,112,110, 36,198, 64, 84, 17, 20,162,179,159, 8,170,195, 40,129, 51, 73,146,226,147,137,185,173, 21,
+ 24,200, 10,217,219, 15,206,145, 40,133, 10,158,190, 21, 15, 15, 89,115, 88, 50, 35,236,251,186, 89,225,218,158,170, 20, 37,139,
+ 82, 16,130, 33, 0,125, 87,147,104, 9,248,146,149, 64, 65, 89, 8, 4, 63,142, 35,125,219, 18, 77,130,107,197,187, 32,205,100,
+253, 85,150, 5,105,154, 78,188, 6,177, 84,109, 86, 29,214, 24,124,124, 35, 53, 14,134,109,149, 86, 80,138,182,107, 80, 74, 6,
+ 43,180, 18, 57,119,144, 70,220, 5,199, 56, 33,176, 46, 68,148,213,228, 86,228,183, 91, 19,185, 40,142, 20,137, 78,136, 90, 56,
+ 93, 38,138,116, 55, 75, 37, 43,197,227, 25,187,145, 52,155, 82,240,122,201, 59,136,217, 27,181, 10,165, 38,207, 18, 77,116, 3,
+214, 36,104, 27,165,153, 26, 6, 86,171,102, 26, 2, 91,192,224,180, 39, 25,134,145, 68, 75, 54,178, 78,160,156, 85,244,227, 72,
+ 85, 84,196, 66,118,175, 81, 69,114, 37, 38,252, 81, 41,186,213, 74,216,144,195, 64, 98,132,177, 62,244, 3, 90, 69, 10, 5, 99,
+ 55,178,182,190, 70, 12, 81,172, 23,251,145,180,200,176,147, 89, 64, 86,136,236,164,235, 26, 36,141, 45,199,251, 48,237, 15, 64,
+107,197,232,160,237, 26,138,162,148,215, 24,199, 73, 19,170,201, 50, 75,223,137,197,104, 68, 62,104,165,212,182,137,127, 83, 75,
+ 96,202,250,218, 26, 33,200,123,214, 74, 60,153,197,221,206, 51,175,102, 44,235, 37, 93, 87,163,179, 82,244,232, 89, 1, 81, 94,
+ 47,132,128, 10, 16, 8, 4,132,237,173,147, 4,173, 13,193,137,148,102, 43,203, 23, 60, 38,106,180, 14, 16, 2,117,221,189, 17,
+ 95, 56,189,214,150, 20, 13,245,134,161,255,108, 54, 35, 26,205,170,110,104,218, 22,154,192,250,250,218,180,122,200,112,110, 16,
+173, 41, 80,162,192, 42, 54, 47, 45,137, 94,164, 49, 93, 63,125, 6,178, 50, 68, 43, 77,215,104,146, 92,140,131,130, 19,233, 25,
+ 90, 86, 38,242,251, 69,162, 86,148,229,140,209,121, 18, 3,109, 63,210,249, 64, 57, 19,249, 68, 64, 80,154, 24, 65, 35,240,248,
+150, 50, 65, 39,106,187,243,116,110,164, 44, 42, 65, 4, 18,129,186,220,232,136,109, 71,154,231,184, 97,160,237,167,184,211,169,
+121,211,128, 54, 66,180, 52,198,192,116,243, 55,173, 39, 34, 48,230,214,159,205, 40, 72,147,132,166, 21, 51, 36,109,160,173, 91,
+124, 28,137,104,138, 76, 12, 58,234,186,102, 28, 13,101,105,249,111,222, 11,239,185, 42, 39,246, 14, 60, 68, 20,113,213,203, 72,
+103, 29, 55,189,239, 38, 56,176,142,202, 50,242, 99, 59,225,224, 58,241,146,226,119, 62,255, 24,165, 11,180,203, 72,153, 95,139,
+ 82,138,151, 31, 56,199,249,236,114, 14,244, 13,139,102,197,170,110, 56,117,250, 52, 15, 63,241,228, 91,194, 74,230, 85,197, 59,
+111, 59, 41, 12,246, 93,187,200,103,226,198,215,213, 43,158,250,222,115, 60,253,220,243,223, 87,208, 65, 24,222,191,249,135,255,
+145,235,142, 95,201,225,163, 71,120,236,129,135,249,194,215, 30,226,143, 63,245,153,183, 16,218,182,174, 93, 59,118,112,211,213,
+ 87,241, 11, 63,241,163, 92,125,226, 56,186,204,209, 74, 80,139,114,199, 58, 97, 24,136,163,103,244,142, 52, 23,167,181,203,246,
+237,227, 59,246, 25, 94,187,248,250,118, 65, 7, 56,251,234, 57,190,251,189,239,241,238,119,188, 3,165, 20, 85, 89,144,165,150,
+199, 79, 61,195,111,253,241,159,176,229, 61,127,237, 85,199,184,231,157,111,231,238,119,220,206, 21,135, 14,146,103, 57,235,179,
+192,129, 61,187,248,253,175, 61,196, 43,231,206,111,191,230,201, 27,174,229,231, 62,254,195,124,224,238,119, 50,155,149, 60,115,
+250, 5, 94,223,216,224,175,190,252, 85,254,224, 83,127, 73,136,188,133, 79,176,253,123,237, 92,227, 29,183,156,228,206, 91,111,
+230,232,101,135,240, 49,242,192,195,127,195,103,191,242, 32,247, 61,248,245,109, 77, 61,136,236,110,247,174,157,220,126,211,141,
+ 28, 59,114, 25,218,104, 94,125,237, 60, 69,145, 51,122,199, 15,190,231, 30,110,189,254, 90,254,248,203,247,243,212,139,103, 16,
+ 75,207, 32,235,161, 65,200, 68,243,249,156,182,239, 81, 74,211, 15, 3,206,137,212,209, 88,105, 0,183, 52,211,128, 84,150, 56,
+153,186, 40,241,132,119,193, 77,168, 70, 75, 85,206, 8, 49, 50, 70, 79,105, 51,186,190,163,168, 10,182,178,223,131, 19, 79,138,
+178, 44, 73,149, 20,193,196, 38,184,193,209,245, 61,105,106, 49, 70,144,129,206,105,170, 60,103,203, 62, 57, 77,197,132,197,230,
+201,180, 51, 13,132,216,163,117,130,209,162, 13,215,200, 68, 87,149,213,148,247, 16, 25,189, 20,249, 44,149,130,149, 24, 77,144,
+195,140,174,235,152,205,103,104,165, 24,220,192,216, 13,168, 52,193,227,209, 81, 79,201,156,154, 16, 16, 53, 65, 34, 70, 85, 32,
+207,184, 40,101, 6,210, 68,246,224,195, 32,153,228,214, 90, 86,203, 26,157, 40, 34, 17,147,165,212,203, 5, 85, 85,226,163, 52,
+250,126, 28,233,155,150,114, 94, 98,180,236,158,251, 94,114, 12,138, 60, 3,244,228, 96, 55,202,180,235, 28, 49, 74,250, 94, 81,
+ 86, 56, 31, 80,131,200,190,250, 86,194,120,146, 36,153, 8,127,134,166,110,241, 17, 98,244,168, 32,105,146,202, 24,156,119,114,
+142, 59,145,218,106,157,208,181, 43, 36, 6, 88,152,252,101, 85,177,106,154,109,235,221, 60,203,200,211, 12, 31, 37,158,117, 28,
+ 71, 89, 59, 79,239, 9, 0,173, 33,200, 0, 18,163,129, 32,209,208, 89,150,109, 75,194,109,158,145, 69, 75,154,101,212,245,138,
+174,235,241,163,163,156,149,194,191,232,196, 64,171,239, 26,252,212, 52, 72, 10,155,103, 43,175,126,152, 56, 20, 77,223, 79, 63,
+ 75,144, 21, 77, 16, 83, 28,173,177,137, 65, 41, 67,221,180, 36, 74, 43,150,109,139, 36,164, 73,238,107,130,172,144,167, 89, 12,
+162,162,235,133, 17,174,148,176, 31,189,247,114,211,132,176, 77, 82, 11, 83,118,177,143,158,208,138,211,143, 11,146, 34, 22, 66,
+164,235,167,157, 21,145,126,148, 96, 22,107,217,214,156,103,214,226, 93,164,239,197,245, 43,203,114,124,152,124,216,227,228, 48,
+100, 45, 90, 69,202, 60, 39,232,137,191, 30,193,187,145,193,141, 52, 27, 13,243,106, 46,187,254,178, 98, 28,196,212,223, 90,131,
+158, 9,196,225,125, 96,177,216,100, 86,205, 88,213, 2,143, 84, 69,129, 27,188,228,193,107, 3, 72,104,138, 49, 86,246, 28,198,
+ 16,186,158, 44,149,196,165,229, 98, 33,240,139, 77,168,235,233, 16,136,145, 48, 21,250, 24, 69,110, 82,166, 34,217, 48,102,202,
+168, 15,194,190,213, 74, 49, 58,201,176,215, 90, 51, 14, 3, 54,145,230, 42,132,192,114, 41,153,204, 76, 13, 75, 93, 75,108,223,
+244, 99,196,168,135, 72,136,128, 23, 36, 33,196, 72, 85,229,172,154,134,110,146,133,140,163, 76,216,205, 88, 79,127, 27,138,162,
+196, 90, 67, 98, 52, 42, 70, 10, 43,114,137, 56,122, 94,175, 23,176,125,240,198, 55, 33, 22, 66,202, 10,104,136, 97,130, 31, 97,
+ 25, 86,172,175,173, 17,157, 19,126,130,181,180,222,211, 44,151,248, 24,129,201, 4, 70,169, 41,213,109,133, 15,129,245,117, 33,
+196,132, 24, 9,110,196,133, 78,110, 78, 43,238,123,163, 27,232,154,134, 48, 77,244,227, 56,146, 36, 22,107, 53,248, 20, 73,181,
+ 10,180, 99, 79, 53, 19,227,154,247, 94, 25,120,207,225,138,184, 81,163,162,197,189,124, 17,125,211,126,153,166,178,130, 56,122,
+ 98, 49, 53, 87,125,143, 74,114, 56,156,242,185, 63,126,148,116, 89,115,112,119,197,197,102, 36,253,171, 63,160,190,229, 25, 22,
+ 99,197,201,219,111, 97,181, 92, 48, 43,118, 81,230, 57,143, 63, 13, 79,158,250, 30,111,190,118,174,175,115,197,101,135, 57,114,
+232, 0,197,142,157,248,190,231,222,251, 31,224,183,254,232, 79,248,220,253, 15, 1,111,133,207,111,190,246,106,126,224,158,187,
+184,227,228, 77,140,110,100, 62, 19,135,190,157,235,115,214,231, 34,103,123,243,117,253,241, 99,220,245,246,219,184,249,186,107,
+ 57,118,249, 33,142, 95,121, 37, 74, 41,158,126,252, 73, 30,249,206,147, 44,234,134, 3,123,247,112,215,173, 39,217,181,111, 31,
+105, 52, 4,231,120,233,149,215,248,242, 67,223,224,211, 95,188,143,231, 94,120,131, 53,159,103, 41, 39,111,184,150, 44, 47, 56,
+127,241,117, 14,238,221, 75, 63, 8,203,254, 95,253,230,239,240,240, 99,143, 3,112,244,242, 67,220,113,242, 70,110,188,246,106,
+118,204,103,188,114,238, 60,127,254,215, 95,224,187,167,159,167,174,107, 54,235,213,246,107,106,173,121,125, 99, 3,165,133,185,
+ 91,215, 53,253, 48,242,169, 47,124,153, 39,190,251, 52,195,248,134,123,226,127,122,165, 38,225,250,171,143,113,229,145,195,244,
+253,200, 51,167, 95,224,169,103, 78,243,192, 55,191,197,185,215, 47,190,229,207,206,103,115,174,188,252,114, 14,236,219,203,254,
+ 61,187,185,238,196, 85,236,217,189, 11, 34,220,251,192, 67, 92,118,240, 0, 15, 63,241, 36, 15, 63,244, 16,155,131,103,255,209,
+ 43,137, 65, 44, 53,173,181, 40,132,237, 92, 21, 37, 62, 72, 10, 92,240, 30,109, 21, 97,244,148,147,223, 1,136, 9, 83,140, 66,
+ 76, 91, 44, 86, 64, 64, 35,168,152, 82, 61,105, 42,105, 92,221,208, 19, 67, 96,177, 88, 10, 99, 60, 85, 19,225,181, 66,121, 73,
+142,235,219,233,128,246, 3, 49, 68,180, 49,172,173,137,164,149, 40,204,250,113,236,104,125,192,133, 72,158,167, 82, 8, 17, 2,
+ 86, 12, 18,231,218, 53,194,145,153, 85, 51,178,204,210, 13,157,112, 2,220, 72,154, 72,120,137, 27, 29, 62,136, 95,132, 49,146,
+ 34,185,197,224, 70, 9,119,193, 24, 69, 81, 84,164,115,113,138,235,251,158,188, 40,169,166, 41, 82, 24,236,162,117,207,203, 28,
+ 21,164, 9,136,163, 39, 70,200, 74, 41, 82,104,141,142,154,174,235,152,207, 38, 3,174, 16, 68,238, 71, 16,146, 95, 39,210, 87,
+148, 66, 43,168,151, 18,122, 85,205,102,194,155, 66,158,144,178,152,242,198, 9,244,157, 35, 79, 82,154,102,133, 82, 18, 75,155,
+152,132,116,242, 14, 88, 46, 22,226, 91, 17, 2,107,235,235, 36,137,101, 54, 55, 52,157, 68,157,142, 33,224,131,163,174,151, 36,
+ 90, 86,172, 27,155,155,219,187,236, 52,207, 73,181,104,187,251, 90,172,124,243, 52,133, 84,162,187,251, 94,200,173, 68,240, 65,
+114, 51, 98, 8, 96, 12,174, 31, 4,173,152,106, 75, 4,226,216,147,101, 25, 33, 74, 74,105, 81,136,247,193,188,122,131, 28, 55,
+ 91, 91, 67, 51,217, 12,123, 63,133,237, 8,233, 55,177, 41,190,239,153,207,164, 38, 37,105, 38, 28,165, 44, 67, 27, 35, 40,140,
+181, 36, 69, 65,219, 54,136, 58,195, 17,189, 40, 35,198,161,199,249, 14,162, 38, 73,140,165,200,229,141, 45,151, 75,148,150, 12,
+226, 56, 72,230,110, 0, 50,107,223,114,147, 27,155, 76,176,169,194, 71, 97,148,183, 77,199,250,250, 28, 20, 36,105, 74,179, 90,
+145,102, 41, 41, 34, 53,211, 9,219,254,183, 91,108,108,165,222,136, 88, 85, 49,210, 52,211, 13,110, 51, 98, 12,116,189, 20, 75,
+141,134,137, 96,181,181,191,219,154,230,148,146,194,238,131, 88, 57,134, 16,216,184,180,129,181, 98,173,151,166, 25, 33,120,154,
+174, 39, 75, 18,152,160,145, 24, 68, 15,111,109, 70,154, 24, 86,117,183,205,156, 84, 49,160,181,193,143,226, 68,133, 82,100,211,
+ 46, 39, 73,140, 72,184,166,247,144,217, 20,157, 36,162, 67,119,142,110,236,137,131,200,220, 18,173, 49,214, 50, 79, 83,188,115,
+ 44,155,134, 68, 41,214,119,236, 96, 75, 38,180,185, 88,160,148,102,190, 54,155,186, 59,241, 30,222,220, 92,160, 80,219, 19,253,
+ 86,227,147, 24, 67, 8,178,166,240, 49,162, 39,178, 68,130, 16, 69,134,126,148,233, 2,129,122,188,247, 72,228,161,133,105, 23,
+ 45,176,188, 48, 68, 5,150,140, 19, 57, 67,138, 79,140, 17, 73, 59, 19,178,100,112,227,212,224,129, 66,201,110,108, 54,163, 94,
+ 46,137,206,177,121,113, 58,120,181, 65,155, 9,129, 72, 83,150, 75,113, 60, 74,173,133,233,126,217, 90,215,128, 60,252, 91,176,
+104, 85, 20, 12, 62, 96,146,105,191,102, 19,236, 44,165,173,107,242,188,100, 28, 59,186,174,161, 9, 65,166,211, 40,186,123,105,
+ 48, 35,135,119, 23,124,226,102, 69,236, 29,177, 30,249,250,223,190,196,110, 19, 57,113,104, 29,117,177, 38, 94,166,225,165,215,
+208, 59,215,136,235, 5,172, 2,177, 74,137, 47,213, 92,188,184,100,223,158,117, 94, 95,180, 60,251,157,231, 81,207, 93,228,248,
+197,138, 19,119,124, 16,163, 53,217,174,157,156,122,238, 52,191,246,191,254, 31,219, 5,239,205,215,145,195, 7,216,183,123,151,
+144,123,154,134,113,144,104, 77,153, 48,223, 90,208, 1,222,117,219,219,248,240,123,239,230,150,147, 55,131,134, 83, 79,157,226,
+ 55,126,251,247,249,163, 79,127,246, 45,147,239,214,117,113,177,224,237, 39,111,228, 99, 31,254, 16,218, 38,248,174,229,161,111,
+124,139,223,252, 15,127,198,231,238,251, 26,169, 77,248,192, 93,239,228,150, 27,174,101,143,209, 52,139, 21,103, 95, 59,199,131,
+ 15, 63,194, 23,238,127,128, 83,167,159,219,126,173, 89, 89,242,225,247,191,155,123,222,126, 27, 87, 31, 59,202,174,157, 59, 40,
+179,156,197,106,197,169,231, 78, 19,252, 27,239,247,213,115, 23,168,202,156, 3,123,247,112,197,161,131,124,235,177, 39, 88, 95,
+155,147, 89,203,211,175,158,167,169,101,199,189, 62,171,248, 71,191,248, 11,188,239,157,239,224,200,161, 3,108,214, 43, 94,120,
+249, 44,247,127,253, 97,158,127,233, 12, 47,189,246,253,191,147,214,154,203, 14, 30,224,158, 59,110,229,186,107, 78,112,221,137,
+171,152, 87, 51, 78, 61,251, 4,207,191,252, 50,167,158,127,158,151, 94,121,237, 45,127,231,234, 99, 71,185,235,142, 91,185,237,
+198,235,217,189,107, 39, 49, 68,150,171,154, 44,205,216,185, 99,206, 53, 39,174, 98,213, 52,156,126,241, 12,175,190,126,137,135,
+ 31,123,156,221,167,158,225,142,119,221, 73,145, 21, 52,190, 65, 69, 69, 85, 74, 2, 97,140,145,116,106, 34, 35, 1, 49,107,233,
+ 80, 8,169,170,200, 44, 67, 63,110, 39, 18,174, 86, 75,178, 84,154, 76,231, 28,237,114, 69,185, 99, 7,121,154,178, 90,213,204,
+231,178,174, 90, 45, 86, 50,225,118, 45,222, 5,230,243, 18,109, 45, 65, 7, 50,151,163, 20, 19,156,141,196,137, 2, 62, 56, 24,
+ 71,130, 86,204, 10,113,144, 11, 46,200,253,151,230,104, 45, 5,118,203,208,102, 24, 7,108,180,196, 49,130, 17,247, 57, 51, 19,
+133, 76, 81, 22, 12,195,128, 50, 70, 16,187, 32, 8,103,223,247,204,231,115, 98,148,116,187,190,151,245,215,114,185,154, 6,128,
+ 5,105,146, 50, 91, 43,113,157, 35, 42,145,228, 41, 20, 93,215, 97,172, 33, 75, 50,210, 60, 69, 43, 67, 81,149, 98, 0, 19, 35,
+ 77,215, 73,140,114,145,209,181, 61,198, 8,113,186,105,228, 12,175,230,146,119,174, 96, 42,106,129,229, 98, 33,220, 33, 45, 41,
+161, 86,105, 76,106, 73, 76, 66,146, 8, 49, 55,205, 75,130, 27, 25, 70,135,138,162, 66,114, 97,164,156,205, 48, 17, 76,106, 38,
+ 39, 53,112,126, 82, 83,248, 72,231,100,112,138, 33,210,199, 94, 80, 71, 45, 9,117,193, 7, 98,221, 80, 7,225, 52, 17,101,133,
+144, 76, 67, 69,150,201,202,192, 36,118,226,235, 48,166,135, 0, 0, 32, 0, 73, 68, 65, 84, 56, 73,236,116,150, 21, 34,225, 54,
+ 98,255, 93,217, 10,148, 24,129,185, 81,140,176, 82,155,226, 71,199,210, 47,196,181,207,138,132, 59,122, 97,222, 43, 35,136, 71,
+223,117,219,136,101,215,118, 12,253, 32, 38,107, 65,100,191,198,202,106, 34, 68,225,119, 41, 45, 43,209,174, 19,178, 94,215,117,
+120, 39,141, 83, 93,175,136, 1,178,114,198,208,181, 36, 74, 65,136,113,130,136,102,180, 77, 45,206,104,106,162,236, 35,153,213,
+110, 20, 56, 33,203, 45,102,218,163,130,200,147, 18, 91,161,188, 76,192, 81,129, 31, 6,233,108, 16,207, 99, 99, 20, 68,129,126,
+202,170,154, 38, 96, 49,121, 72, 18, 49,164, 65, 73, 18, 18,192,232, 29,149,205, 81,106, 10,155,215, 6,152,246,222,203, 37,222,
+ 11,225,195, 24,131, 82, 18, 48, 32,157,100, 75,179,106, 8, 49, 16,130,102,177, 92, 98,141,161,156,205, 72,162,208, 65,150,151,
+ 46,225,220,136,143,138, 44, 77, 25,199,158, 97, 0,101, 52, 49,130,205, 44, 85, 81, 73, 17,210, 90,160,152, 60,103,236, 59,250,
+209, 19,130,216, 59,206,222,100, 11,155,171,148, 64, 32, 75,196, 57,205,148, 98, 69, 8,114,120,173, 86, 43, 73, 79,138,145,104,
+196,193,174,109, 58,178, 60,101,199,250, 14, 86,203, 37,117, 45,233, 67,221, 20,152,147,101, 25,169, 77,209, 74,163,180, 98,199,
+ 78,201, 22,183, 54, 33, 4, 65, 58,172,145,125,146,178,137,104, 80,149,120,190,239,220,185,147,113, 16,194,160, 77, 82,210, 60,
+221, 54, 47, 24,189, 23,232,176,109,233,251,142, 36,181,164, 90,200, 49, 58,129,177, 21,107, 74, 71, 36, 12,158,204, 90, 76,153,
+ 49, 78, 1, 49, 85, 85,209,181, 98, 39, 60, 91, 91, 35,120, 71,211,141, 68, 55, 16,135,158, 98,125,141,174,147,188,247,188, 72,
+ 81, 81, 86, 18, 91,247,139,247, 18,203, 26,130,252,255,179,249, 28,231, 28,171, 9,237, 8,193,225, 70,135, 30, 12,101, 53,201,
+118,162,228,105,167, 89,198, 98,115, 83,160,193, 84,252,252,181, 86,172,234, 21,255,221,157, 41,179, 60, 39, 46, 59,212,108, 7,
+215,237, 95,240,210,183,159,134,236,106,186, 87,158, 39, 61,188,134,186,242, 32, 97,109, 7, 28, 57,194,183,254,229,159,240,246,
+183, 31,227, 59,223,121,129, 89,128,139, 33,112,206, 5, 92,215,115,224,196, 13, 92,123,231, 15,162,181,200, 2,149, 82, 92,220,
+ 92,176,111,239,110,118,172,175,109,167,144, 93,125,236, 40,255,251, 63,249,239,121,223,199,127, 16, 87,119,184, 85,203,230,249,
+243,220,247,245,111,241,249,175,124,141,243,255, 25,169,215, 79,124,244,239,240,243, 63,241, 35, 28,216,183,151,224, 29,202, 43,
+158,127,233, 44,167, 78,191,176,221, 84, 1,220,120,226, 56,255,250,215,255, 71,241, 56, 15,142,125,187,118,161, 98, 20,164,167,
+233, 56,119,241, 18,222, 57,246,238,218, 73, 63,140, 28,189,252,144,236,228,154, 6,163, 13,123,119,238,228,158,183,223, 78,211,
+ 52,188,112,230, 21,206,190,118, 14,165, 20,239,191,235, 78,238, 60,121, 19, 71, 15, 31,226,192,190,125, 20, 89,198, 83,223,123,
+150,123, 31,252, 6,143, 60,241, 36,167, 78,159, 6,100,165,112,249,161,131,148, 69,201,238,245, 57,206, 7,142, 94,118,136, 60,
+ 75,249,255, 9,123,239, 96,205,206,251,190,239,243, 60,207,233,231,125,239,189,219, 11,118, 23,139,197, 98,177,232, 29, 32, 0,
+ 54,176, 23,145,162, 73, 21,147,150,163, 98,209, 99, 69, 78,226,140,173,113,146,153,196, 78, 50,214,140,149,201, 56,114, 34,219,
+177, 20,135,137,122,177, 26, 41,138, 18, 73,176, 8,133, 32, 81, 22,192, 46,234, 46,118,177,189,223,123,223,114,234, 83,242,199,
+239,220, 11, 80,148, 39,231, 63, 14, 23,119,239,190,239, 57,231,249,149,239,247,243,181,222,115,117,121, 69, 94,220, 38,226,192,
+245,123, 9, 33,176,103,215, 78,146, 56,230,241,111,124,155, 35,175, 29,229,240,171,175,243,248,211,207,173,255,155,148,146,103,
+ 24,164,160,139,180,102, 60, 42,249,196, 35,239, 98,188,176,200, 87,190,249,109, 30,123,250, 57,210, 56,226,249,195,111,241,224,
+181, 22,146,218,198,197, 5, 22,202,146, 81, 81,176,115,203,102,146, 52,225,236,185,139, 52,109, 67, 28,109,100,235,198,141,252,
+250, 31,126,145,229,201, 42,179, 1,206,115,229,242,101,254,226,139,127,198,157,247,222,205,181,215,238,197, 5, 16,180,177, 88,
+ 78,187,129,139,161, 1, 61,140,148,171,166, 18,171,144, 10, 20, 35, 9, 99,106,154, 26, 80, 8,103, 93, 44, 98, 93,215,209,183,
+ 66,139, 44,138,148,174,147,105,147,142, 53, 67,101, 64,146, 68, 76,167, 51, 76,108,208, 65,118,179,245,124,142, 25, 94,246,222,
+122,138, 92, 68,100,163,145, 20,246,237, 32, 54, 51, 72, 97,109, 93, 79, 28,100,212,171,145,145, 56, 32, 7,148,119, 20, 69, 65,
+172, 83,234,170,161, 31, 4,124,214, 58, 98,160,239, 37,133, 81, 41, 53, 8,239, 28,125,232,137, 61,120,103, 9, 65,222, 85,189,
+235, 89, 28, 47,202,129,107,131,192,167, 2, 36, 89, 68,215, 73,215,238,123, 7, 70,154,162,182,233, 72,211, 4,101,148,160,115,
+131,151,177,187, 50,196,113, 68,223,183,228,229,136,160,132, 6, 89,213,115,162, 40, 94, 39, 41,122, 47,218,169,166,109,152,215,
+ 18,173, 93,119, 45,161,105, 88,155, 72, 18, 2,113,154, 18, 13,157,170,179,150,206,185, 1,170, 21, 49,175, 42, 10, 85, 96,140,
+ 16,226,162,100, 16, 38, 39, 41,189, 21,229, 60, 64,211, 74, 58, 94,211, 55,140,242, 17,243,249, 28,107,165,105, 69, 67, 8, 34,
+104, 93, 99,211,107,173,241, 46, 33, 56, 79,231, 91,156,115, 36,169, 96,119,173, 19,174, 66,235,218,161,241,179, 20,163, 17,218,
+ 24,178,108,208,126, 69, 34, 76,244, 94,166,216, 81,146,200, 89, 19, 68,114,223,183, 13,206, 9,253,110,141, 76, 87, 55,205,224,
+203,151,119,224,124, 42,161, 63, 74,137,125,124, 97, 97,140, 30,214, 4, 89,150,225,156,101, 54,157,210,117, 50,242,103, 80,221,
+ 71, 81, 68,212,116, 29,182, 23, 53,165, 88,166,244,144, 61, 45, 29, 89,154, 21,120, 43,216,188,190,107,177, 93,187,254,153,143,
+ 70, 35,234, 74, 66, 5,188, 15,228,121,182,142,245, 83, 90,198, 93,121, 94,210,116, 29, 42, 8,167, 88, 8,100,201,208, 65, 74,
+176,123, 20, 9,142,118, 92,136,133, 43, 9, 17,214,201,248,168, 30,170, 73,161, 40, 5, 70,227, 49, 62, 64, 91,119,235,187, 36,
+215, 7,162, 88,147,164, 57, 81,148,208, 52,210,129,119,173,216,169,130,247, 76,166,115,122,219,147,103,114, 83, 41,165, 69,157,
+109,228,224,158, 76,196, 66,183, 22, 20, 17,148,194,161, 8, 90,225,172,144,146, 36,127, 87,118,106, 33, 4, 68,124,167,168,234,
+154, 60,139,113, 62,172,139,191, 80, 74, 94, 12, 65,246,234, 89,154, 74,193,227, 3,125,239, 40, 71,133, 60, 28,182,167, 28,151,
+204,102, 21,222,137,144,164,242, 45, 89, 94,226,173,165,181, 61, 90, 73, 55,158,167,162,222, 79,146,132, 60,203,233,173, 37, 47,
+ 10,108,223,163, 19,217,241,103, 75,139, 88,107,201,139, 12, 2, 66,158,242, 94, 30,152,224, 48, 70,139,224,113,200,139,215,136,
+154,119, 52, 42,113,222,146, 69, 17,171,211, 41,227,164,164, 10, 21, 73, 18, 19,167, 41, 25,217,240,160, 73, 39, 79, 16,241, 80,
+211,117,132,166, 70,165, 41, 74,105,230,203,203,120, 99, 80, 90,138,151, 86, 75, 71,173,148,146,226, 42, 17,236,238, 26,244,166,
+174, 4,227,155,231, 25, 65,105,156,237,165,155, 26, 23, 40, 45,150, 16,153, 10, 25,230,243,137,228,181, 35,118,165,160, 21,213,
+108,206,251,111,137,185,231,218,152,224,122, 72, 12, 42,238, 88,116, 29,139,183,238,133,171,115,210,119,236, 7,235, 81, 23, 91,
+184,231, 78, 40,238,102,199, 53,223,230, 63,252,201, 51,164, 46,176,109,156, 48,171, 44, 57, 1,118, 29,228,225,143,254, 56,113,
+154, 16,130, 48,179,189, 11,220,180,239, 58, 54, 44,140, 89,157,190,181, 27,127,237,141, 19,252,147,255,249,151,248,175,207, 95,
+224,195,239,121, 23, 73, 18,241,226, 43,175,241, 27,127,248,167,124,251,187,223, 19,101,246,112,197,145, 96, 51, 47, 95, 89,102,
+117, 58,231,134, 27,111,192,213, 53, 47, 29, 61,198, 83,135,158,231,123, 47, 28,225,210,149, 43,236,220,182,149,143,189,255, 61,
+236,221,185,131,139,151,175,114,231,205, 91,217,178,117, 11, 74, 43,136, 34, 48,134, 75, 87,175,242,212,161, 23, 56,244,210, 43,
+ 92,188,124,149, 79,125,232,125,252,196,167, 63,201,182,205,155, 65, 25, 86,103, 43, 60,247,226, 75,124,249,209,111,241,220, 75,
+175,112,121,121,133, 77, 27, 55,112, 96,239, 30,238,190,245,102,222,243,224, 3,108,217,188, 17,165, 52,231,207,159,231,202,242,
+ 50,211,106,206, 11, 47,191, 38, 83, 53,173,185,243,150,131,124,224,225,119,112,235,141, 7, 56,121,254, 34, 95,248,143,127,194,
+161, 35,175, 74,156,235,217,115, 28,123,243, 20,187,119,108,227,231,126,242,239,240,177, 71,222,205,150, 13,139,244,189,227, 55,
+254,227,159,240,212,243,207,243,242,171,199,184,180,178, 74, 89,228,212, 85,131,103, 77,112, 10,155, 55,110,100,239,174,157,236,
+216,186,133,107,118,108,227,220,229, 43,124,229,175,158,224,185,195,175,240,229, 71,191,193,172,106,214,119,239,198, 24,110,220,
+119, 29,119,221,122,144, 44,205, 80,198,112,121,121,133,181, 0, 18, 33,155,121,158, 59,242, 50, 42, 4, 62,242,222,135,248,133,
+127,241,191,114,242,204,217,245,207, 62,132,192,161,167,159,229,220,153,115, 60,244,206,135,134, 21,143,116,176,211,201,148,209,
+104,132, 39, 48,159,213,244,131,248,151, 0,125,231,240, 70,242,191,211, 52, 39, 73, 28, 93, 43,207, 43,168,161,171, 18,148,245,
+172,174, 41,242,156, 40,138,241, 40, 89, 85,122,193,221,142,199, 66,151,179,222,211,212, 53, 73,158,210,181,146, 22,231,147,192,
+172,146,164, 68,239, 3,104, 41,126,108, 47,239, 84, 20, 34,216,139, 12, 69, 42,156,245, 81, 52, 26,172,189,146, 42, 87,183, 45,
+182,235, 48, 81,196,104, 84,208, 91, 79,145, 23, 88,111,169,230,149, 76, 58,141,166,111, 91,210, 98, 36,106,234,186, 25, 86, 34,
+ 2, 73, 65, 67, 93,201,187,219,246,118,125, 44,236,131,224,155,181,137,135, 61,189, 88,134,227, 36, 89, 39,154,185,190, 71, 27,
+ 69,154,102, 76,171, 41,227,209, 88,118,216,125, 79,158,101,244,173,160,162,227, 56, 6,194,144,233, 33,153,224,109,215, 17,105,
+ 3, 14,188, 26,154, 68, 51,116,183, 8,125,174, 85,106,253,123, 12,109,131, 66,118,244,107, 89, 19, 1,153,160, 90,231,136,211,
+132, 34,205,208, 90,175,167,134,102,105, 38, 77, 83,154, 67, 80,140, 23, 68,239,229,135,119,179, 27,138,233,186,106,232, 6, 26,
+ 96, 28, 71, 16, 68,120,236,162,158,222, 89, 66, 24,148,243,193, 75,232, 76, 8,244, 33, 48, 89, 89, 38, 40,153,130,198, 70, 34,
+ 97,181,142, 40,178, 88, 68,212, 62, 48,175,231,235,133, 85, 8,176,176, 48, 70,105,209, 3,229,185,172,167,227,200,176, 58, 89,
+101,109, 2, 45,143,139,252,142,243,185,176, 78,170, 90,172,206, 90, 71, 34,184, 86, 34, 48,214,218,176,176,184,128,214,134, 40,
+138, 98,146, 36,165,235,100,220, 2,122,189, 90, 81, 42,208,204, 86,200, 75,249, 33,144, 98,187, 6,116, 76,215,213,172, 44,175,
+224,189, 88,182,188,151, 3, 40, 73, 34,170,121,197,100, 50, 97,195,134, 13,160, 20,227,114,188,158, 80, 6, 34,134,202,242,156,
+ 56,138, 68,204, 0,195,193, 21, 80, 3, 98,181,109, 44,194,132, 87,146, 59, 60,155,161,163,136,174,237, 73,178,156, 44,151,195,
+121, 50, 19, 81, 89,107, 1,122,146, 52, 37,138,100,188,219, 52,162,126,117,214, 17, 39, 41,117, 83,211, 54,154, 40, 74,165, 80,
+ 1,180,145, 14,118, 97,105, 9,188,120,176,187, 94, 14, 57, 21, 69,120, 43,244, 40, 80, 67, 49, 19, 48, 65, 70,213,125, 45, 94,
+215,222, 57,250,166, 34,207, 83, 8,142, 56, 74,100, 15,210,119, 40, 29,147,143, 71, 40,175,177,161, 39, 53, 2,250,233,157, 16,
+216, 82, 21, 81, 85,115,137, 58, 13, 30,205,224, 73, 69, 0, 50,113,156, 34, 21, 27, 82, 57,231, 25, 93,219,209, 59, 81,227, 42,
+ 21,112,214,210,211, 99,180,166,154, 86, 36, 89, 74, 95,205,135,213,131,199, 6, 33,225, 5, 36,234,116,253,133,225, 61, 73, 38,
+130, 58,135,197,107,104,154,154,216, 24, 90,103, 89, 24, 9, 71, 90,107,205,124,136,127, 37, 72,170,154,210, 18,189,235, 7,189,
+ 3, 1,232, 4,115,136,247,148,139,139,120, 5,137,214, 84, 77, 71, 26, 75,198,180, 54, 70, 88,245,214,202,164, 37,138, 96, 24,
+125,102,185, 80,234,146,212, 72, 23,227, 29, 73, 34,251,117,235,197,182, 18,128,186,146,238,200, 91,207,103,223, 81,240,185,155,
+ 60, 97, 6,152, 22,180, 33,168, 12,117,223,126,152, 55, 4,101, 64, 71, 60,250,103,207, 51, 70,115,223,167,255, 41,164, 7,216,
+100, 34,222,181,111, 51,207,157,158,112,117,181, 98,172, 13,151,242,205, 60,240,254, 79, 50,218,188, 69, 14,116,163, 81,113,204,
+236,226, 37,254,187, 95,250, 87,252,201, 95, 62,202,219,175,125,123,247,240, 79,127,254,243,124,226,163, 31, 34, 56,199,213, 43,
+ 87,216,176,180,200, 59,238,190,147,170,110,120,254,229, 87,233, 58, 1, 87,220,122,227, 1, 30,188,251, 14, 62,245,145, 15,176,
+121,227, 6,158,122,234, 25,126,241, 87,254, 29, 79, 60,125,104,253,231, 41, 13,215, 94,179,131,207,124,248, 3,220,114,240, 0,
+ 26,197,180,174,104,135, 78,230,226,233,179,252,235, 47,252, 6,191,243,167, 95,102, 94, 9, 33,235,218,221,215, 48, 42, 75, 86,
+ 86, 38,108,223,180, 17,133,231,220,133,139, 28, 63,125,134, 51, 23, 46,242,242,107,111, 16,240,108, 88,220,206, 7,222,249, 16,
+159,252,240,251,216,180,184, 72, 20, 69,156, 61,119,158,167,158,123,145,175, 62,254, 20, 79,191,240, 2, 87, 7, 14,125,153,231,
+108,223,186,153,119,220,115, 39, 91, 55,109,228,226,149,171,220,180,127, 63,143, 62,246,212,247, 9,248,198,163, 49,151,175, 92,
+229,226,229,203, 84,117,197,100, 58,227,220,165, 43, 36,113, 74,239, 28,203, 43,111, 61,243,111,191,218,182,229,154,237, 91,249,
+220, 15,127,156, 71,222,245, 48,213,108,198,153,243, 23,120,229,232, 49, 86,167,223, 31,221,234,156,227,149,163, 71,217,182,101,
+ 19,159,248,192, 35,108,219,186, 73,114, 34,146,152,121, 85, 83, 22, 57,155, 54, 44,242,213,111, 63,201, 63,255, 87,255, 7,187,
+182,111,101, 84,142,248,235, 87, 8,129,243,103,207,242,141,175, 61,202, 59, 30,126,136, 44, 47,132,140, 25,164,171,237, 58, 73,
+152, 43, 50,225, 79,104, 35,105,135,109, 35,246,216, 36,203,176,189, 23,207,184,117, 68,113, 76, 81, 22, 4,192, 7, 79,154,165,
+244, 93, 79,215,118, 3,137, 50,160,188,184, 60, 60, 34,123,137, 99, 97,174,107,101, 72, 83, 77, 91,183,244,222, 18, 33, 62,115,
+135, 19,252,169, 82, 16,222,138, 42, 94, 3,201, 40,163, 72,162,132, 44,203, 65,131,111, 28,147,174,162,200, 50,146,162,196, 91,
+ 79, 83,117,160, 2,109,144, 61,244,120, 36, 69,176,239,237,208,221,206,208,198, 16,167, 49,113, 58, 16,208,122,177,254,230, 69,
+ 42,135,186,149,160, 44,165,100,247, 31,188, 5,219,139,194,190,111, 0, 45,239,109,165,135,149,172, 56,106, 26, 43,153,237,147,
+233,148,133,241,152,182,237,169, 86, 87, 25,151, 99, 90,219,209, 55,173, 52, 66, 54, 16,180, 28,224, 89, 62, 66,105,121,255,107,
+164,160, 81, 40,178, 66, 26, 34,231, 28,222, 75, 22,123, 8, 65, 48,213, 70, 73, 83,164, 12, 69, 34,254,120,148, 65,136,114, 61,
+ 53,129, 56, 78, 73,179,156,186,158,211,249,150, 56, 21, 81,169, 15, 30,223,123,122,239, 80, 74, 99,219,142,128,168,201,189,247,
+120,223, 50,153, 88, 70,101, 73,154,166,204, 43, 17,206, 57, 39,164,212,182,149, 78, 93, 25,141, 27,244, 79,242,231,100,117,108,
+129,188, 28,147, 36,226, 16,170,155,138, 40,146, 98,198, 57, 79, 51,168,227,131, 18,215, 73, 50,156, 49,222, 59,102,243,154,241,
+194, 34, 42,200, 58,180,183, 61, 70, 27,209,124, 68, 6, 29,100,106,108,157,163,175,107,105,168,156,103, 97, 65, 50, 34,244,240,
+179,162,190,239,215,191,100,239,132,164,163,148, 26,118,172, 98,181,176,157, 69, 41, 81, 28, 43,165, 72, 98,131, 49, 37, 93,183,
+138, 49,154,174,237, 64,131,109, 26, 90, 47,149,133,209,138,174,239, 80, 90, 70,205, 74, 43,150,151, 87, 80, 90,179, 48, 42, 89,
+ 89, 94, 37,201, 34,242,116, 88,252, 43,129,159,128,120,255, 34, 35,248, 84, 19, 27,186,218, 98,226, 12, 77, 32, 73, 12,125, 93,
+211,107, 5,104,185, 57,147, 8,229, 61, 62,196,132, 94, 58,219,233,108,134,247, 22,133,166,239,221, 0, 47, 9, 52,173,236,204,
+148,214,162, 30, 7, 17, 63,244, 29, 26,137, 14,148, 63,160,134,174, 27,172,115, 52,245, 90, 88,195,154,159, 60,102,222,204, 81,
+ 74, 51, 46, 75, 66,112,172,174, 78, 8, 4,154,186,193,152,136,197,165, 37,250,174, 35,232, 53, 46,181,162,174,106,202,162, 96,
+ 58,157, 82, 19,200,243,156,178, 28,201,207, 15,129, 16, 60,193, 43,172,175,209,136, 82, 61, 77,115,156, 19,198,112,153,231,232,
+225,231,181,182,167,175,123,162, 56,198,104,131,237, 58,138, 66,152, 0,113,154,202,136, 49, 4, 18, 19,227,172,140,208,230,243,
+233,250,139, 54,142, 99,234,229,154, 48,236,125,141, 82,140, 22, 23, 8, 33, 80, 85, 51,102, 51, 75, 86, 20, 88, 43, 47, 42, 16,
+125, 67,231,172,164,175, 1,198,104,172, 86,208, 84, 4,101, 6, 37,124, 68,215, 74, 44,165, 50, 49,139, 11,169,168,251,135,151,
+107,108, 12,217, 48,134, 19,133,167, 80,153,140,137, 6,171,158,124, 14,107,124, 3,141,166,111, 59,218,208,226, 3,148,121, 70,
+108, 2,159,189, 71,243,209,173,142,223,250,237, 67,252,208, 93,219, 25,239,221, 72, 72, 19,148,235,240, 33, 66, 41,131, 42, 83,
+158,249,139,151, 57,250,198,101, 62,118,199, 30,148,142,241,179,239, 80,152,150, 27, 62,117, 11,251, 95,153,240, 91, 95, 58,196,
+233, 80,114,247,199, 62,199, 77,247, 62,140,109,135,251,245,226,101,254,245, 23,126,147, 95,249,194,111,242,246,107,231,214,173,
+ 60,112,247, 29,188,239,161,251,121,228,129,251,192, 57, 94, 56,114,132, 95,252,223,255,253,186,183,251,237,215,210,194, 2, 7,
+174,223,199,181,187,174, 33, 75, 51, 46, 93,190,202,147,207, 62,199,145,215, 68, 65, 31, 71,134, 91, 14,220,192, 67,247,222,201,
+150,141,155, 56,114,244, 24, 85,211,176, 99,155,136,193,108, 8, 24, 39, 7,201,223,251,241,207,176,115,219, 86,126,245,183,127,
+159,186,150,169,208,202,116,194,155,103,207,177,123,231, 14, 58,107, 57,126,242, 12, 71,143,191,201,137, 83,167,215,191,219,187,
+110,190,153, 59,111,189,153, 36, 26,236,136, 65,186,224,213,249,156, 67,135, 95,226,234, 16,170, 82,230, 41, 63,242,177, 15,241,
+158, 7,239,227,250, 61,187, 57,113,230, 44,199,222, 60, 69,153,231,252,194,207,253, 61,126,255,139,127,206,119, 95, 56,204,134,
+165, 69,254,246, 39, 63,194,199, 30,121, 55,179,170,225,255,252,141,223,227,143,255,226,171,120, 47,241,145,227,178,100,227,210,
+ 18,151,175,126,191,208,109,113, 97,204, 15,189,239, 61,252,216, 15,125,148,251,238,184,133, 67, 47, 30,230,213, 55,142,115,238,
+226, 21,110,190,225,122, 78, 95,184,200,165,183,129,118,118,239,220,193,135,223,251, 78,118,108,217,204,201, 51,103, 57,176,111,
+ 47, 91, 54,110,160,204, 5,233,156,165, 41,231, 46, 92,164,110,107, 22, 71, 37,167,207, 95, 4,222,138,137,125,251,200, 31, 96,
+249,234, 85, 30,253,234,215,216,127, 96, 63,215,236,222, 45,248, 86,239, 73,179,156, 92, 27,102,179, 57,121,153, 75,247,136,164,
+134,205,166, 83,108,223,163,180,194,245, 22,219, 9, 33, 83,121,225,180, 11,177, 82,179, 80, 44,200, 52, 46, 56,234,105, 69, 94,
+136,248,182,109, 91,180,210,116,117, 96, 45, 23, 98, 84,140,200,178,140, 76,133, 33,188,166, 34, 82,134,150,150, 44,206, 4,188,
+ 20,132, 69,225,253, 16,226, 97, 69,164, 54,155, 77,101,212,172,164,216,239,157,151,102,194,196,100,113,138, 30, 84,206, 77,215,
+200,223,173, 53,160,176,237, 92,222,109, 90,131,151,176, 41, 19, 69, 44, 45, 45, 17,188,103, 58,172, 44, 68,196,235,177, 67, 76,
+105, 94,148,100,113, 2,116,120, 31, 88, 88, 28,161,214, 15,165,132,201,108, 74,156, 38,100, 69,206,108, 58,101, 84, 20,204,107,
+105, 14,188,135,102,112,175,160,193,246, 29, 24, 45, 2, 51, 5,206,202, 26,206,134, 32, 26, 2,163, 16, 12,183, 20, 54, 62, 8,
+118, 58, 16,211,181,245,250,222,185,109,123, 92,232,112, 70, 13,129, 60,144, 36, 17,147,201, 42, 93,219, 81,142, 13,109, 83,129,
+135,188, 44, 69,180, 27, 32,168, 32, 76,120, 27,100,210, 17,229,116,109, 75,215, 52, 24, 45, 4,213,174,105,152,205,230, 84, 77,
+205,226, 88, 34,175,219,182, 3, 31,136, 19,131,214, 17, 62,120,108,100,215,109,146, 90, 27,242, 44, 37,142, 83, 76,100,104,219,
+ 86, 2,203,188, 71,101,172,107,165,180,150,201,112, 53,157,138,141, 53, 73,232,123,105,200, 84,146, 98,180,166,169,101,114,158,
+101, 25, 77,215,201,231, 58,159,209,181, 45, 38,142,197,197, 53, 40,250, 21,226, 60, 75, 52,196,200,193, 30,173,177,112,109,103,
+ 49, 26,210, 88, 4, 20, 65,121, 17, 65,104,185, 7, 20,224, 92, 64,107,152, 76,167,148, 69,193,120, 60, 94, 63, 32,154,174, 37,
+ 75, 51,154,166,165,173, 27,218,206,210, 91,185, 73, 66, 16,212, 32, 40,186,166, 97,101, 50, 97,148,166,204,103, 21,205,188,198,
+ 68,134, 40,203,232,187, 10,147,104, 60, 6,140, 34, 77, 36,147,216, 89,143, 81, 96,162,132,126, 86, 13,113,126,226,109,246,222,
+ 13,227,171, 32, 34, 49, 64,105, 67,176,142, 81, 49,194, 6,199,116,229, 42, 58,205,200,139, 76,132, 31,195, 77, 62,171,103,114,
+208,182, 45, 73,150,146,103, 41,101, 50,166,107, 5,206, 16, 25, 1, 3,212, 93, 75,240,110, 80,211,183,244, 86,108, 29, 33,168,
+161, 34,131,201,116, 38,181,128, 76,204,240, 67, 85,153,229, 57, 62,120,162, 36, 99, 58,157, 0,226, 71, 20,148,173, 40, 81, 71,
+ 99,121, 72, 34,163,153,205,103, 20, 69, 65, 20,100,247,146,197,137,220,212,206, 19,105,197,149,203,151, 81, 64, 57, 26, 97,131,
+ 31,246, 43,178,170,112,125, 79,150,229,116, 93, 77, 97, 12,211,249, 28,231, 61, 74, 27,138, 44,147, 49,155,148, 49,228,121, 14,
+120,226, 88, 10, 12, 66, 96,180,184, 40, 99,170, 34, 7, 45, 24,219,186,109,197,230, 22,201, 97,220, 52, 13,125,111,209, 65,212,
+253, 89,146, 49,183, 22,188, 64, 26, 70,163,177,120,123,181,160, 30,189,237,169,170,134, 34, 47,153,246, 29,105,158,227, 85, 64,
+ 49,196, 63,166, 49, 42, 4,214,244, 27,109,219, 12,156,228, 14, 59,140, 96,187,182, 27,170,232,193,194,104, 28,255,213, 71, 70,
+220,191,195, 16,174, 58,110, 40, 97,246,216, 97, 70, 55,125, 4,117,105, 25, 54, 47,162,189, 1,229, 9,111, 92,226,208, 75,103,
+216,150, 24,250, 0,225,228,215,153,252,249, 55, 88, 60,184, 8,203, 29,143, 61,245, 26,214,195, 13,143,124,138,219, 30,126, 63,
+245,116,130, 49, 26,223,121,222, 56,117,134,173, 27,151,120,215,253,247,240, 87,223,125, 6,185, 52, 91, 55,111,228,230, 3,251,
+185,243,230,131,152, 36,166,107, 27,118,110,221,202,167, 62,252, 1,206, 95,188,200, 43,199, 78,176,118,109, 92, 90,226,179,159,
+252, 40,183, 28,188,129, 3,123,247, 48, 42, 11,142,159, 60,197,249,139,151,217,177,117, 11,211,201,140,222, 58, 46, 92,185,194,
+195,247,222,195,131,119,223, 65, 64, 49,157,137,123,192, 58, 79, 20,122, 90,167,249,227,191,252, 58,255,207,239,253, 17,199, 79,
+157,226,225,251,238,225,129,187,110,227,214, 27, 15,112,221, 53,215,112,205, 53,219,137, 35, 9, 83,138, 99,195,217,243, 23,214,
+173, 96, 81, 20,173,119, 14,189,115,204,171,154,139, 87,206,240,212, 51,207,243,204,139, 71, 56,127,233, 34,189,117,236,219,179,
+139, 27,175,191,142,237, 91, 55,115,215,173, 55,139, 21, 84,107,206,156,191,192,175,255,225, 23, 57,121,230,172,116,198, 75, 27,
+216,181,125, 43, 23, 46, 47,243,210,209, 55,216,179,115, 39, 31,121,228, 93, 40,165, 56,119,225, 34,175,190,113,156, 19,167,190,
+159, 81,191,118, 93,123,205, 14,110, 58,176,159,237, 91, 55,243,198,169,211,188,246,198, 9,158,127,233, 53,158,126,254, 69, 94,
+124,245,117, 25,187,107,136,148,102,247,206, 29,220,184,239, 58, 20,242, 46,184,253,190, 3,236,219,189,139,205, 59,182,161,147,
+152, 55, 94,121,141, 95,255,195, 63,229,204,249, 11, 76,231, 21,215, 95,187,155,151,142,157,248, 62, 24,206,219, 15,244,181,171,
+109, 26,142,188,112,152,190,235,185,238,250,125,104, 45,239,132,209,168, 32,207, 51,186,186,193,197,177, 88, 86,131, 31, 14, 85,
+ 41, 18, 37, 25, 12,108,215, 11,171, 35, 72,254,119,153,139, 56,205, 24,195,234,242, 50,121, 81, 16, 25, 67, 19, 36, 37,109,237,
+119,105,154,134,174,233,152,205,103,140,199, 11,244, 93, 71, 98, 12, 33,138,112,214,145,103, 57, 93, 39,221,224,184, 24,211,246,
+114, 56,196, 73, 76, 52,172,180,178, 60,193,187, 64,213,206,136,180,104,147,102,243, 25, 13, 13,107, 44,246, 81, 57, 2,173,209,
+ 33,144, 36,130,146,206,178, 12, 27, 60, 42, 8, 31,221, 68, 67, 74,217,124, 70, 64,156, 60,121, 94,224,173,101,117, 50, 33,207,
+ 50,170,186,102, 62,157,162, 70, 37,105,158, 19,105, 77,211,118,196, 90,252,219,214,246,100,121, 38,207, 48, 98,139,109,154,142,
+ 16, 28,211,169, 28, 78,179,190, 37,234, 59,178, 60,163,109, 90, 60, 16, 71, 29, 94, 33,162, 46, 13, 93,107,209, 40,130,209,232,
+ 24,250, 94, 34,162,219,174, 23,183, 65,144, 41,114,111, 59,186,182,151,119,106, 20,209,180, 1,107,197, 25, 52, 42, 50,242, 97,
+210, 34,209,183, 50,249,152,207,231,168,225,125,101,226,152,206, 58,146, 88,156, 70, 89,146,224,227,152, 52, 75, 81,206,209,118,
+157,172, 62, 67,160,171,107,166,211, 41,229, 72,186,246,190,111,229,231, 85, 21,214, 57,212,160,199,176, 94,108,185, 77, 43, 56,
+ 91, 19,197,100,185, 8,130,155,186,102, 54, 19, 33,162, 49,134,165,165, 37, 20, 2,141, 81, 90, 34,172,189,247,196,105, 74,176,
+ 86, 16,192, 89,190,222,112,122, 47, 36,192,209,128,199,110,106,217,155, 23, 69,142, 68,244,138,198, 97, 58,153,210, 37,189, 20,
+164, 98,125,112,152, 40,194, 53, 13,210, 55, 57, 20,138,214, 90,156,245,132, 32, 62, 99,217, 21,107,180, 14,130, 46,237, 58,214,
+138, 2, 19,197, 24, 29,147, 38, 34,152, 43,179, 12,143,124, 57,198, 8,253,168,169,106,249,114,156,101,210, 15, 55,238,194, 2,
+ 77, 91,179, 58, 91, 37, 75, 12,109,221,208,169,142, 90,203, 47, 95,150, 35, 92,111,137, 11,177, 20,244,222, 98, 27, 71,153, 9,
+147, 30, 60, 93, 35, 93,238,168, 40,145, 45, 8,212, 94, 64, 9,213,116, 38,224,151,249,140, 70, 41,188,137, 89, 88, 92,160,177,
+ 22,148, 97, 50,157,145,102, 41,174,243,212,212,148, 89, 78,146,166, 56, 43,182,144,106, 62, 39, 4,207,120,188,192,108, 62,195,
+ 59,207,104, 44, 31, 48, 33, 80,247, 29,186,235, 49,105, 6,182,167, 44, 71, 98, 49,241,226,187, 78,211,181, 46, 85,188,174,109,
+213, 14, 98,152, 14,141, 60,124, 93,211,209,247,173,220, 40, 33, 48,159,201,223,153,151, 37,171,147, 9, 33,200,184,223, 59,135,
+114, 2,220,153, 12, 94,249,190,109, 41,138,130,182,109, 89, 28, 47,224,220,144,224, 99,101, 47,150,164, 41,109,211, 80,117, 45,
+163, 44,147,113,182, 19,142,117, 83, 87, 36,169,208,248, 66,128,214, 10,133,170,169,106,150, 22,199, 4,165,137,108, 79,111,101,
+ 50,208, 89, 75,111,197, 3,221,116, 45,190, 17, 16,200,134,197, 37,233,254,128,166,235,112,125, 71, 18,167, 4,196,134, 49, 30,
+212,238,227,197, 37,170,249, 20,215,117, 68, 73, 60, 40,137,251,225,198,245,160,133, 76,165,148,172, 98,178, 56,165,183,173,120,
+ 93,123,139,117,129, 34, 11,252, 79, 31, 76, 56,176, 35, 34,156,156,194, 8,118, 84,203,236,252,220,131,132, 60, 66,221,188,143,
+ 55,190,244, 60,215,109,203, 81,251,118,242,141, 67,167,217,181,161,192,250,192,201,139, 87, 89,249,149,223,229,238,155,183,195,
+155, 45, 95,124,246, 8,151, 79, 95, 96,247, 35,159,229,254, 79,254, 24,110, 58,149,202,183,183, 76,103, 51, 34,163,121,249,232,
+137,183, 29,232,112,231, 45, 7,248,233, 31,253, 12,239,124,224,110,150,198, 35, 8,129,171, 87, 87,121,250,240, 75,252,222,151,
+190,242,125, 7, 58, 8,134,245,192,190,125,236,218,190,157, 34, 47, 56,242,250,235,252,238, 23,255,156,111,126, 71, 58,250,235,
+174,221,197, 13,123,175,229,238,219,111, 69, 27,195,165,171,203,196,145,140,133,181,214,178, 42, 49,154,179, 23, 46,243,210,171,
+175,179,103,215, 78, 78,156, 57,139,181,150,213,213, 41,193, 7,182,108,222, 40,110,142,121,197,169,115, 23, 56,117,238, 2,157,
+149,188,122, 16, 65,223, 39, 62,240, 94,118,111,223, 70,172,141,124, 39, 69,206,225,215,143,114,232,165, 87,184,110,247,110, 46,
+175,172, 48,157,206, 73,227,152,253,215,237,101,251,150, 77,188,121,234, 28,191,252,107,255, 47,175, 30, 63,193,234, 68, 58,249,
+121, 85,179,125,203,102,110, 62,176,159,251,239,184,149,197,241,152,213,201, 42,175, 31,127,147, 71, 30,188,159,211, 23, 46,114,
+121,121,133, 19,167,223,218,105,103, 89,198,238, 29,219,104,154,134, 27,174,187,150,207,124,228,131,132, 16,248,211,191,124,148,
+223,253,210,159,243,220,145,151,215,139, 83,128,143,189,239, 17, 14,236,190,134, 11, 87, 87, 24,149, 18, 39,187,188,178, 74, 26,
+167,108,218,186,153, 67,207, 61, 47,140,113, 99, 88,157,206,248,205, 63,250,226,223, 56,230,127,251,245,215, 59,118,128,215, 94,
+121,149, 56, 78, 56,120,211, 77,136, 55, 59,176,178,186, 74,164, 53,101, 28,211,244, 66,105, 75,210,140,217,116, 6, 74, 44,155,
+107, 60, 6,105, 84, 68,135,180,182,131,158,207, 69, 1,238,188,136,162,146, 56, 30,132, 97, 18, 32,229,188, 99,180, 56,198, 40,
+152, 78, 87,201,211,140, 96,132,200,232,141,161,169, 59, 20,129, 52,137,105,218,142, 44,201,136,140, 28,202,222, 90,148, 54,168,
+ 54, 16,197, 9,163,209,130, 36, 96,182,141,140,105,189,164,128,205,231,213,186, 93, 42,203, 50,166, 83,177,158, 69, 81, 68,223,
+ 55,196, 81, 38,251,240,166,165,109,218,245,238, 87,210,233, 2,245, 80,156,120,239,133, 82,231,156,168,251, 21, 88, 12, 70,139,
+ 38,166,111, 29,121, 94, 98,140, 98,117, 50,197,123, 75,154,138,101, 44, 79, 83,226,209,136,201,234, 4,225,170, 27,186,121,135,
+138, 20,169,142, 6,177,178,199, 27, 67, 22,165, 36,169, 96, 86, 77, 48,196, 81,132,213,160, 48, 36, 81, 24,116, 53,138, 56, 77,
+ 81, 33,200, 36,195,245,180,109, 75, 57,146, 49,189, 10,162, 13, 82, 90,168,110,120, 47,211,102, 37, 7,238,168, 28, 49,171, 43,
+108, 93,163, 8,244,141, 38, 77,146,117,209,174, 10, 49,110,208, 74,245, 93, 67,111, 37,139, 35, 4, 17,145,155,200,176,184,176,
+ 36,187,243, 32,218, 46,130,199, 7,217,201, 43,239,241, 10, 8,136, 22,193,121,218, 86, 86, 21, 89,146, 49,175,231,140,138, 17,
+206, 90,102,243, 57,222, 75,214,134, 66, 38,166,125,223, 19, 41, 69,239,100,178,163,140,224,103,189,247,216, 94, 86,194,202,123,
+ 34,147, 96,244,192,109,113, 22, 16, 59,161, 15, 1,101, 59,116,163,136, 34,109, 6,223,101,160,199, 48,157,206,200,203, 12, 21,
+ 52, 69, 30,179,186,186,138, 82, 98,204, 25,151, 37, 74, 43,154,166,101, 58,159, 15,135,242, 24, 99, 98,241, 94,106, 77,154,164,
+168,160,208,145,166,107, 26,100, 47,154, 13,222, 72, 81,152,155, 84,212,216,177, 49, 52,157,100, 6,163, 53, 77, 61, 39, 45, 50,
+218,186,149,100,175, 52, 69,107,141,195,176,178,114,149, 40, 74, 41,242,148,186,170, 89, 94,185, 74, 49,196, 9, 42,237, 81,136,
+141,108,173, 19, 1,240, 40,140,137,177,222,139,247, 58, 4, 8,142,214,245,244,173, 96, 94,103,214,210, 54, 50,162, 42,162, 92,
+136, 69,195, 75, 32, 54, 98,139, 35, 64,221,138,178, 53,205,115,170,121,141,210,178, 35,241,206, 97,135, 63, 95, 20,185,224, 81,
+243, 28,213,203,131,233,189, 39, 73, 19, 92, 47, 29,136,137, 36,105,173, 29, 20,226,218,104,122,103,137,147,140,216, 59,234,186,
+ 38, 77, 99,170,217,156,233,234,148, 81, 57, 8,234,156, 3,231,112, 85, 3, 58,160,157,163, 88, 88, 24,118, 94,226, 11,117,222,
+226,156,195, 32,160,135, 50,207,233, 67, 24,252,227, 98, 55,155,205,103,196,145, 64, 45,162, 36, 33,142, 13,139,139,139, 16, 2,
+157,119,232, 68,124,163, 33, 40,214, 70,224,194,180,182,226,125, 55, 70,196,109,195,131, 98, 34,113, 38,204,231,115,130, 22,107,
+ 90, 93,215, 56,215,211, 52, 61,105, 34,138, 98, 99,196, 35,155,101,226, 69, 85, 8, 41,171,170, 68,180,184,184,184,128, 82,154,
+190,147,135, 53,137, 35, 41, 6,189,193,186, 64,156, 37, 40,235,249,204,221, 17, 7,182, 42,130, 13,168,107,198, 4,163,216,249,
+249,143, 18,206,212, 92,120,234, 44,219, 62,255, 57,198,155,206,241,157,239, 60,203,131, 27, 22, 88, 93,153,147, 41, 69,156, 39,
+ 84, 85,195,201, 51,151,152,102,129, 35,175, 93,166,168, 86,216,247,192,135,184,253, 83, 63,141,155,207, 69,141,174, 2,177, 86,
+108,222,176,129,199,191,251, 52,191,243,167,111,101,144, 39, 73,194,167, 63,242, 1, 30,190,239, 46, 54, 46, 46,225,189,197, 7,
+ 89, 29,120,239,215,119,210,107,215,190, 61,187,120,240,158,187,216,177,109,211, 58,220,165,239,122, 38,179, 25, 77,221,226, 9,
+108,221,180,145,159,253,220,143,177,103,231,118, 76, 36,254,114, 1,163,168,117, 42, 89, 24, 38,100,247,221,113, 59, 95,249,214,
+183,217,182,105, 3,231, 46, 93, 65, 41,197,106, 93,177,105,227, 6,174,217,182,133,215,143,191,201,191,252,183,255,215, 15,216,
+238,110,191,229, 70,118,110,221,202,166,165, 69,146, 52, 33, 54,134, 67, 71, 94,229,194,197, 75,156, 56,121,154,119,220,125, 59,
+255,248,239,255, 36, 69, 57,162, 76, 83, 30,188,231, 14,144,229, 15, 31,127,255,187,121,225, 87, 94, 93,223,117,239,222,185,131,
+ 31,250,192,251,248,232,123, 31,102,251,150,205, 88,107,249,189, 47,125,133, 95,250,119,255, 1,128,133,209,104, 61, 22,118,237,
+ 90, 40, 11,254,246, 39, 63,198,207,126,246, 71, 24,109,223,140,111, 44,213,202, 10,251,174,219,195, 13,251,246,114,230,252,133,
+239,243,163,159, 61,123,142, 7,239,186,157, 3,251,247,113,121,121,133,178,200, 57,112,221, 30,174,217,177, 3,215,138, 31,250,
+151,127,249,223,240,151,223,122,156,187,111,187,133,205, 27,151,184,120,249,251,199,252,127,253,250,155, 58,118,128, 35, 47,190,
+200,117,187,118,146, 46, 46, 50,159,213,140,202, 98, 29,248,164,181,166,154,205, 24,141, 23, 16,182, 58, 16, 32, 75, 35, 92, 28,
+175, 31,156, 0,113,148, 80,142,243,117,203,102,223, 91,250,190,101, 45,176,131,224, 65,203,193,133,115,132, 40,146, 68,198,183,
+253,140, 44,207,233, 93, 71, 22, 37,184, 48,172,159,189, 16, 37,181, 18, 60,181,209, 34,196,234,154,134, 36, 30,145,231,185, 88,
+144,135,127, 79,219, 52,148,101,129, 82,129,121, 53, 76, 65, 99,121,134,186,174,195, 16,201,202,203, 75,192,205,104, 44,110,149,
+ 44, 19, 16,138,245,158, 16,188, 88,211,134, 80,166, 53,144,214,242,138, 99,113,113,145,128,129, 32,214, 99, 99, 52,206,203,248,
+216,104, 33,183, 21,121, 73,223,182,116,182, 97,188, 48, 30,118,244, 49, 54,114,248,222,209,251,158, 40,137,200, 76, 12, 74, 88,
+ 27, 10, 77,172, 68, 53,238,172, 27, 66,187,122, 20, 34,120, 35, 40, 76,164, 7,155,159, 33,205,101,189,216,214,173, 0,208,180,
+ 6,223,145,166, 5, 11,227, 5,170,166,194,182,158, 50, 23,128,149,247, 94,162,165,157, 4,137, 25,173, 9, 62,144,105, 9,191,
+ 65, 27,148,245,248, 72,192,103,101,158, 12,194,103,153,126,122,111,169, 7,145,154,164,142,122,154, 86,194,101,226, 52,149,200,
+219, 36, 89,119, 93, 64, 88,111,198,156,147,166,120,117, 54,161,204, 37,238, 54,138, 18,186,182,166,179,150,102,104,142,148, 82,
+160,196, 10,232,155, 6,171,148,112,231,171, 74,138,181,217, 12, 29,203, 55, 29,197, 17, 12, 65, 55,163,178,100,222,200,170,197,
+246, 61, 81,211,212, 68,133, 4,180,116, 93, 35,191,252,116, 70,156,230,216,222,177,176,176, 32, 98,180, 72, 60,117, 4,112,214,
+146,231, 57,189,179,212, 77, 7,116,140,203, 17,214, 10, 22,177,110,107, 10, 83,226,135, 27, 18, 10, 96, 77, 0, 0, 32, 0, 73,
+ 68, 65, 84, 41, 73, 83, 22,135, 93, 45, 72,101, 51,157,174,210, 33, 7, 97,215,117,244,157,165, 40, 51,214,128,247, 77, 35, 99,
+167,144,231, 68,137, 98, 94,245, 88,219, 19, 39, 11, 40, 45,118,140,233, 68, 48,135,224, 81, 74,198, 16,145, 22, 68,108, 57, 46,
+209, 74,147,165, 9,109,223, 83, 13, 29,175,142, 99,130,151, 15,207, 24, 67,146,101,196, 38,162,105,106,218, 86,124,243,197,168,
+ 20,113,131, 23, 95,100,221,136,194, 63, 29,246,217, 66, 94,179, 76,167, 83, 70,101,137,210,154, 40,210,128,198,186,185, 76, 20,
+250, 14, 99, 52,147,217,140, 16, 60, 73,156, 8,137, 41, 73, 49, 65,145,164, 41,233,144, 34, 22, 69, 17,107,190,215, 36,137,153,
+ 15,190,209,114,128,146, 88,231,232,170, 10,163, 21,104, 81,243,163, 20,243,170,162, 44, 37,133, 77,107,177,190, 20, 89,129, 49,
+ 6, 19,139,103,213, 4,249, 76,156,179, 50, 54,139,196, 3,218,117, 3,191, 95,107, 80,138,174,110,209,145, 36, 85,105, 60,211,
+249,156, 40,146,194, 75,136, 87, 50, 89,201,147, 4,149, 21, 72,204,100,192,117, 45,189,115, 36,113, 2, 26,230, 85,197,168, 20,
+ 7, 65,219, 52,204,231,115,230, 72, 23, 99,144,157,187,118, 65,212,177, 65,192, 52, 75, 75, 99,169,136,103, 51,177,201, 40, 77,
+221,214,120, 39, 72,198, 60,203,104,155,142,155,118, 24,126,244, 46,131,175,122,168, 28, 36,146,203,174,174,118,252,230, 31, 60,
+203,193,205, 5,219,204, 18, 69, 20, 51,222,186,200,252,252, 85, 40, 71,212,203, 83,220,124, 74, 84,102,180, 73,194,209,211,171,
+108,238, 42, 22,182,239,225,174,159,248,199, 82,124,186, 30,163, 12,147, 89,197,185,243, 23,248,179, 71,191,197,151,191,249, 24,
+ 55,221,112, 61, 15,220,121, 27,155, 55,110,196, 57,199,195,247,221, 67, 28, 27,170, 70, 84,197,211,249, 42,255,254,183,126,143,
+ 95,251,237, 63, 96,237, 50,198,112,231, 45, 55,243,209,247, 62,204,189,183,221, 76,154,166,108, 88, 24,163,141,140, 46,191,251,
+252, 97, 60,129,189,187,119,113,221,238,107,104,154,138,224,229,123,109,134, 85, 67, 81, 20,196,145,144, 19,157,115, 60,243,226,
+ 17,190,240,251,127,204,137, 83,167, 57,120,253, 62, 14, 94,191,151,251,239,188,157, 7,239,190,139, 56, 49,156, 62,123,145,215,
+ 78,156,228,154,237, 91, 57,123,113, 43,103,207,203, 94, 89, 43,120,255, 3,247,179, 97,105, 17,109, 34,124,144,200,227,199,159,
+254, 30, 71,142, 30, 99,247,206, 29, 68, 38,226,200,235,199,249,216, 35,239,228,246,155, 14, 16, 21, 5,243,201, 42,199, 79,157,
+225,215,126,231, 15, 89,153,202,139, 42, 75, 19,118,109,223, 10,222,114,238,194, 37, 54,111, 88,162, 44, 74,254,214, 71, 63,200,
+ 43,199, 78,240,165,175,127,243, 7, 14,116,128,139, 87,174,242,171,191,245,251,188,235,190,123, 56,136,226,216,201, 83,252,220,
+127,243,207,120,229,141, 19,104, 61, 32, 69,135, 43, 54, 17, 87, 87, 39, 60,243,226, 97,222,243,192,253,220,125,203,205,108,220,
+176,196,142, 45,155,176,206,114,238,226, 21, 46, 93,190,196, 35, 15, 63,192,155,167,207,240,212,161,231,127,224,239,251,155,186,
+242,255,212,245,192,157,119,240,207,127,238,167,121,252,197, 87,120,236,240, 75,212,141, 88, 53,113, 18,220, 84,230, 37,171,171,
+ 43,148, 69,137, 71,172, 95,182,149, 66, 75, 16,212,142,105, 53, 35,116,158,180,143,229, 57, 64, 0, 35,210, 73,150,178,171, 29,
+ 21, 56, 27,200,116, 74, 85,205,241, 85, 77, 54,184, 99,214,146,221,214,138,101,103, 28, 58, 72, 10,102, 91,139,136, 22, 52,117,
+211, 80,183, 83,198,101, 73, 49, 42, 89,157,172,138,208, 87, 5,108,103, 41,203, 17,214, 89, 50,147, 17,220, 80,152,251,128, 82,
+ 17, 11,163,148,182,151,104, 82,101,213,240,185, 75,209, 82,142, 75,122,107, 73,179, 20, 91,213,140,199, 11,178, 47, 95,120, 11,
+ 76,227,189, 39, 86,134,149,149, 21,178, 44, 19, 6,134,237,113, 90,203,180, 82,203, 59, 53, 38,166,174,231, 18,218, 18, 88, 31,
+ 61,119,157, 80,232, 70, 99, 17, 49,218,174,195, 5, 9,119, 9, 72, 78,135, 54,178, 98,213, 90, 99,188, 33, 82, 17,104,112,222,
+137, 72, 23,134,128, 42,201,165,136,227,152, 36,214,160, 2, 26,141,243, 26, 59,216, 8,179, 52,167,239,166,204,167, 83,226,165,
+133,193,149, 32,141,196, 40, 23,231, 79,221,183,146,134, 87,148,210, 56,181, 82,212, 16,192, 42,249, 14,199,227, 18, 99, 98,250,
+ 94,126,215,213,213, 41, 90, 54,133,104,173,153,215, 53,161,170, 88, 19,100, 75,152, 85,144,213,163,151,148, 69,140,166,154,205,
+ 33, 4,170, 90,112,181, 90, 33,105,121,193, 51,159,205, 24,149, 37, 12,127,103,100, 34, 72,131, 36,177,121, 89,255,180, 93, 55,
+ 96,133,193,123,135, 11,129,113,185,136,142,100, 42,224,131, 88,201, 81, 16, 65, 96,117,178, 76, 81,148, 34, 6, 32, 12,164, 55,
+ 69,240,195,216,195, 24,172,245,204,230, 51,169,110,178, 28,163, 53,132,152,121, 45,106,190, 85, 47, 7, 75, 18,199,104, 99,152,
+ 76, 39, 68, 38,102,109, 15, 32,166,254, 24,239, 25,188,203,200,151,161, 53, 10, 79, 81,230, 40,239,169,171, 57,101, 89,208,247,
+142, 36,150,151,118,215,182,200,193,173,152, 87, 83,140,146,236, 94, 19, 69, 72,124,167,161,235,123,234,186, 38,207, 10,178,188,
+192,104, 77,221,180,232, 40,146,110,113,243,102, 8,129, 16, 36,152, 64,194, 82, 36,187,215,187, 64,154, 37,224,197,159, 89,205,
+ 43, 66, 44, 22,189,170,174,222, 98,209, 59, 71,219,118, 2,118, 80, 10,147, 36,204,235, 90,172, 36,201, 8,215,181,120,167,152,
+ 85, 51,188, 21,197,164,237, 58, 64,211,216, 6,124, 96,214,206,208, 74, 68,105,241,216, 48,155, 13,160,254,225,128,107,187,150,
+114, 60, 38, 32,190,253,182,239,135, 36,181,128,183,129, 16, 39,196, 81, 74, 98, 96,222,212, 76, 39, 19,162, 52, 21, 36,235,124,
+142, 89, 75,160,211,154,213,201,132, 44,203, 48, 38, 70, 32, 8, 29, 38, 50, 84, 85, 45,133, 68,239,241,198,130,181, 67,112, 65,
+ 16,172,107, 39,138,109,172, 69,101,153,208,145,180,150,157,109, 8,224,123, 8,144, 36, 25, 77, 99, 9, 62,224,140, 71,217,192,
+218,251,217,121, 47,130,192,217, 32,204,243, 16, 84, 64, 13, 83,210,117,118,189, 23,178,210,104, 52, 18,223,172,151, 10,118, 13,
+ 80, 19,153,136,166,173,113, 46,240, 51,247,100,112,201, 66,223,162, 22,199, 80, 87,168, 45, 35,190,247,149,151, 81,147, 41,102,
+251, 34,225,165,151, 56,126,230, 18,243, 30, 46,204, 45,253,108,142,235,122, 62,253,200, 65, 46,119, 61, 95,122,225, 60,155,234,
+ 57,182,159,112,243,143,253, 11,156, 87, 88,219,201,248,206,119, 28, 59,113,138,175, 63,254, 36,143, 62,241, 29,206,158,191, 72,
+ 81,100, 28, 59,121,134,143,127,224, 17, 30,190,231, 78,236, 48, 86, 11, 65,246,221, 62,120,110, 61,176,159, 31,122,255,123,249,
+198,147, 79, 49,175,106,130,115, 28,220,127, 29,247,222,113, 43, 27,151, 22, 6, 27,214, 85,190,243,220, 97, 30,125,252, 9,250,
+193,231,252, 15,127,242,115,124,224,157,239,192, 90, 43, 63,183, 19, 43,229,120, 36,133,162, 82,138,162, 44, 56,117,246, 28, 23,
+ 46, 94, 98,219,230, 77, 28, 63,121,138,163, 39, 78,146,196, 17,251,246,236, 97,117,186, 42,250, 8, 5, 59,183,109,230,214, 3,
+ 55,240,250,137,147,235,135,250, 63,249, 7, 63,203,189,119,220,138, 82,138,201,116,202,177, 19, 39,249,250, 19, 79,242,149,111,
+ 62, 70, 24,166, 12, 91,183,110,225,192,117,123, 16, 63,113, 67,179, 50,225,209,199,191,195,247, 94,120,145,203,203, 43, 44,175,
+200,232,189,105, 59,158, 59,252, 10,155, 55,110,228,193,123,239, 34, 73, 82,158,120,246, 16,255,242,223,252, 42,163, 60,227,129,
+ 59,111,227,220,133, 75,156, 56,115,150,135,238,189,155,235,247,236,226,200,171, 71,121,224,174,219,216,191,111,175,168,212, 31,
+123,146,175, 63,246, 4,151,150, 87,135,239,223,227,135,123, 66,107, 77,239, 60,109,215, 82,100, 5, 87,150,151, 89, 90, 28,177,
+123,199, 54,202,133, 49,243,233,156,229,149,115,188,252,250, 49,190,254,196,119,177,214, 82, 22,249,250,100,110,237,250, 79, 29,
+232,111, 63,236, 55,110, 88,226,230,253,251,248,137, 79,127,146,206,123,238, 61,120, 3, 70,107,190,254,244, 33,156, 21,184, 76,
+112, 65,172,151,193, 51,157, 79,137,146, 4, 19, 12, 81,102, 8,138,117,118, 3, 30,130, 6,223,123,116, 42,227,208,186,126, 75,
+112,219,119, 82,204,171, 8,166,171,171,120,164, 49,154, 78, 39,148, 69, 41,160,170, 56,194, 3,137, 49,204,230,115,172,115,140,
+203, 49,126, 24,227, 3,184,190, 39, 56,129,147,180,109, 77,154,102,235,123,222,214, 53, 56,215,145,166,249,186,182, 8,130, 20,
+114,109,131,237, 69,156,170,148,194, 71, 67, 14, 3, 30, 23, 2,211,169, 20,240,193, 9,249, 50,120, 79,111,123,226, 40, 38, 73,
+ 4,206,163,181, 6, 13,193,138, 46, 64, 27,153,212, 9, 68, 39,224,135,127,103, 26, 71,168,161,129, 81,200, 36,183,107,133, 36,
+ 90,142, 74, 81,218, 43, 72,162, 8, 13, 66,169,243, 97,176,244, 65,146, 24, 2,178,171,238,144,247, 80, 63,172, 90, 76, 44,201,
+141,113, 44,194,223, 53,122, 39, 64,146,102,184,174, 35,205, 50,234,186,145, 41, 68, 57, 98, 62,159,177,186,186, 74, 89,142, 17,
+ 87,151,161,174,107, 57,124,187,158,200, 68,116, 77, 67, 48,154, 98,180, 64,223,201,148, 44,138, 34, 20, 82, 80, 56,231, 80, 70,
+ 0, 90, 16,134,221,185,136,144, 67, 16,241,180,115, 30,173,100, 84, 62, 26,151,196,177,156,125,109,219, 98,173, 4,146, 41,173,
+112,195, 26,101,218,203,191, 59,205, 50, 70,163,145,112, 68, 52,204,231, 21,138,150, 40, 18,213,187,216,197,197, 10, 41,187,116,
+ 9, 17,107,234, 26, 31, 28,161,151,105,111, 28,199, 36, 89,138,235, 45, 81, 26, 71,116, 33, 48,155,174,162,148, 84, 5,113, 44,
+156,247, 56,202,240, 4,146, 40, 38, 30,231,216,222, 82, 85,213,186, 16,197,123, 57,136,198,227, 5, 25,153, 38,153, 84,107, 38,
+224,189,236,210,141, 5, 23, 60,202,117,168, 78,242,198, 35,173,135,253,141, 71,163, 80, 58, 2,239,152, 76, 69,208, 48,159,138,
+237, 66, 33,227,122, 81,228, 15,121,219, 38, 37, 4,225,191, 27, 35,217,228,104, 69,166, 99, 73, 52, 83,114,168, 66,178,126, 67,
+218, 97,252,225,157, 3,197,176,247, 22,107, 77,240, 34, 82,168,231,242,161,165,113,204,120, 60,150, 74,210, 89, 12, 26, 33, 72,
+ 9,143, 55,248,128, 66,132,106,193, 11, 52,192,104,141, 14, 80,117, 29,189,117,248,222,226,131,135, 52, 69,161, 72,135,145,203,
+108, 50, 33,138, 34,178, 52,165,235,122, 86, 87, 86, 8, 58,162,200, 69,245, 8, 16,194,224,223,183,150,206, 5, 84,223,163, 85,
+ 4, 38, 34, 68, 80, 14, 2,187,182,239, 81,189, 5,165,137, 34,131,237,160, 40, 74,230,115, 25,213,121,239,113,222,211,181, 29,
+218, 24, 70,227,177,176,148,157, 76, 50,214, 42,211,162, 44, 80,104,162, 88,172,133,137,137, 9,201,208,113, 47, 46,202,205,233,
+ 61, 73, 20,225,140,193,120, 47,251,159, 88,172,104,214, 90,180, 81, 3,245, 72, 94,154, 90,173, 33, 57, 7,170, 93,112, 68,218,
+ 12, 28, 4, 73,181,155, 78, 37, 45, 75, 41, 67,154, 27,122, 39,150, 17, 23, 68,113, 15,224, 66,192, 12, 93,207,166, 18,150, 18,
+ 77,243,234,235,244,171, 51,202,219, 14, 16,142,158, 68,223,125, 19, 47,157, 92, 38, 75,140,132,209, 44, 25,174,223, 18,147,189,
+235, 38, 88,241,124,233, 91,199,120,223, 29,187, 72, 14,238,224,107,191,255, 12,215,218,138,105, 51,231,182, 31,249, 47, 88,188,
+241, 46,234,129,110,232,188,103,117, 58,101, 58,159,115,233,234, 50, 39, 78,159,101,101, 50, 97,101, 50,225,145, 7,238,103,177,
+ 44, 57,119,233,178,140,242,156,216, 88,226, 72, 92, 7, 93,223,113,238,226,165,183, 14, 23,173,153,207,102, 28,123,243, 20,163,
+162, 32,207, 82,254,232,203, 95,229,119,254,236, 47,197, 33,225, 97,215,246,173,124,239,133, 23,201,210,132,219,111, 58, 72, 20,
+ 9, 55, 65, 5, 89, 35,133,224,135,200, 95,184,188,188,194,229,229, 21, 94, 63,254, 38,189,117,236,220,186,149, 91,110,188,129,
+ 59,111, 61,136,137, 98,102,179,138,243, 23, 47,243,216,119,159,225, 43,223,254,171,245, 81,244,131,247,222,197,223,253,244, 39,
+ 72,226,132,203,203, 87, 57,122,226, 36,199, 79,157,225,165,215,223,160,233, 58,118,110,221,202,205, 55,236,227,134,235,174,101,
+199,150, 45,236,220,182,149, 36, 78,184,112,249, 10, 90,107,158,122,238, 69,222,120,243, 36,107,215,134,165, 69, 62,246,200,187,
+248,224, 59, 31, 98,255,222,189, 20, 89,138, 81,138,155, 14,236,231, 79,190,242, 53,222,126, 29, 58,242, 18, 31,121,207, 67,252,
+194, 63,248, 25,118,236,217,141,111, 59, 78,188,121,146, 50,207,185,102,251,118,118,110,223,250, 3, 57,236,187,118,108,231,254,
+ 59,111, 99, 60,124,255, 90,107, 54, 45,109, 32,207,211,117,177,103,150, 38,156,187,178,204,249, 75,151,120,229,141, 19,252, 77,
+215, 95,239,212,215,254,119, 8,129,178,200,185,245,198, 3,252,252,127,246, 89, 30,188,231, 14, 46, 92,188,194, 43,175,191,193,
+149, 85,217,217,199, 93,203, 42,138, 60,205,105,130,248,191,149, 22,133,117,219,246,196,169,166,106, 26, 34, 12,202,200, 94, 50,
+ 50,134, 36,205,196,190, 22, 68,177, 29, 8, 36, 81,130, 14,138,160,100,101,217,247,162, 37, 49,145,161,183, 29,190,147, 3, 73,
+ 33,231, 69, 18, 39,216,222,146,151, 37, 10,177, 52,105,164, 8, 87, 64,150,202, 58,166,105, 42,188,245,116, 93, 75,100, 34,234,
+190, 70, 27,205,124, 94,145, 36, 9, 81,156,144,196,130,198,110, 42, 73,101,180,206,210, 87, 29, 62, 4,210, 36,167,163, 39, 86,
+242, 46, 82,200,142,220, 5, 25,109,163,196,182,170,181, 8, 94, 55,108,216,128,115, 50, 70,158, 78, 39, 88,235,168,235,150, 40,
+ 74,200,210,140, 36, 12, 54,180, 68,240,192,105, 34,113,181,109, 83,163, 81,228, 69,142, 81, 6, 23, 36, 79, 66, 5,232,113,224,
+ 60, 38,150, 29,120,219,214,235,211,209,182,107,233,123, 75,146,164, 4, 37,192, 29,171, 2,202, 57,210, 56,165, 30,132,198,107,
+233,119,104,141,237, 4, 45,190,174, 37, 74, 18,138, 60, 34, 54, 18,107, 90,215,115, 89, 13, 20, 5,158,192,188,105,196, 59,159,
+166,120, 39, 25,240, 74,105,108,175,134,230,241, 45,234,166,247,242,255,187,222, 81,148, 5,221,138,112,245,197,166, 40,255,157,
+199, 17, 17,209,118, 29,243,249,156,197, 13,130,174,149,247,167,236,190, 3,129,198,116, 40, 28,214,202,217,209, 54, 13,157,210,
+ 20,163, 2, 29,132, 66,218, 91, 75,215,121,180,209, 36,105,138, 50,134,190,235,208, 74,166,203,109,219,160,148, 56,182,122,235,
+ 16, 54, 75,141,124,117,138, 40, 4,135,115, 61,163,162, 68, 25,197,116, 54, 97, 62,173,197,179, 30, 26,202,188,144,155, 44,136,
+196, 30, 15, 81, 36, 57,220, 32, 48, 21,239, 61,121, 94, 80,181, 67,134,173,245,160, 64,107,225,251,182,109,143,237,107,154,186,
+146, 67, 60, 73,232,251, 78, 2, 92,130, 35,139, 19,150, 87, 86, 8, 33,144,143, 70, 24,163,105,171, 22, 31, 68, 20, 22,153, 24,
+231, 2, 1, 17,220, 41,229,152,207,122,138,241,152,249,108,130, 66,147,101, 37,105,106,168,157,151,155, 35, 8,113, 9,173, 9,
+ 94,186,252,174,233,112, 72,184,138, 86, 66,102,114,206, 17, 90,161,229,245,109, 47, 55, 80,112,244,125, 75, 97, 70,180,189,144,
+147,210, 36,149, 74,180, 20, 5,125,221, 74, 17, 80,230,249, 32,166, 11,148,197, 8,219,203,206, 84,245,142, 60, 77, 48, 69, 73,
+219,182,196,145, 33, 74,228, 6, 16, 97,132, 96, 28,131,119, 52, 85, 53, 76, 17, 2,104, 69, 89,142,165,226, 94, 93,197,163,192,
+ 8, 92, 33,142, 52,243, 86,226, 23, 67,240, 96, 12,113,146,208,214, 45,198, 68, 84, 85,195,226,120, 12, 74, 83,215, 53,182, 17,
+248, 14,222, 83,213, 53, 90, 65,235,100, 15,156,198,195,129, 84,183,194,211, 71,175,115, 7,202, 34, 99, 77, 32, 18, 37,242,130,
+ 72,226, 20,143, 84,140,227,241, 24,165,164,123,200,210, 20,173,141,172, 34, 6, 12,112, 85, 87,152, 40,194, 59, 75,111,133,225,
+ 63,157, 76, 41,114,217, 61,165, 89,202,210,210,162,144,164, 84, 36,255, 30,215, 19,167, 25,222, 90,156,146,110,199, 68,134,121,
+ 39,157,192,123,111,207,217, 52,155, 49,155, 54, 44,220,127, 16, 70, 41,140,111,196, 95, 92, 70,173,206,177,101,193,177,139,171,
+220,240,212, 51,100,183,109, 34, 20, 9,106, 73,115,195,245, 91,184,229,142, 61, 92,124,237, 28,106,117,198,164,153, 19,111,221,
+199,142,123, 63,194,116,101, 21, 20,146, 80,215, 73,178,214,202,100,194, 87,191,253,248, 58, 53,238, 83, 31,124, 63, 63,243,217,
+207,176,125,243,102,122,219, 83,213, 13, 73, 28,145,165,201,240,178,116,108,220,176, 81,196, 57,195,117,195,117,215,242,137, 15,
+190,159,189,187,119,178,123,251, 54,162, 36,225,253,239,126, 24,167, 20, 95,255,171, 39,121,231,253,247,242,241,247,189,139, 93,
+ 59,182,147,166, 49,206, 58,185, 23,128,222, 58, 66, 24, 58, 8,215, 19,105, 73, 70,172,219,142, 44, 73,136, 35,131,243,142,233,
+172, 98,121,117,202,166, 5,177,220, 52,109,195,172,109,176, 86, 10,115,173, 53,174,119,124,231,153, 67,236,191,110, 47,101,145,
+115,237,174,107, 88, 89,157,208,180, 13,183,236,191,158,219,111, 62,200,190,107,119,113, 96,239, 94,182,111,221, 76, 28, 25, 94,
+ 61,118,156,167, 14,189,200,235,199,143,115,224,186,189, 28,123,243, 20,193,121, 60,129, 13, 75,139, 60,242,208, 59,248,216,135,
+222, 71, 91,213,124,243,201,239,242,235,127,244, 69, 94,124, 89,160, 52,117,211,178,113,105,129,235,247, 94,203,107,199, 78,240,
+ 63,254,111,255,150,203,203, 43,252,244,143,254, 45,230,117,205,115, 47,190,204,215, 30,127,146, 67, 71, 94,229,220,165, 31, 68,
+199,158, 60,115,150,159,250,209, 79,241, 15, 63,255, 83, 40,165,184,120,246, 60, 85,219, 48, 30,149,116, 85,197, 55,158,124,138,
+ 11,151,175,208,119, 61, 43,147, 31, 28,243,175, 93,107, 7,250,219, 15,243,181,235,174, 91,110,226,191,253,249,207,115,255,189,
+119,115,249,210,101, 46,173, 44,243, 7,127,254, 53,108,223,113,233,234, 50,101,145,115,105, 50,231,192,205, 55,201,238, 53, 54,
+168, 32,192,172, 36,149,162, 43, 78,132, 38, 23, 66, 88,159, 56, 85,179,138,153,235, 25, 47, 44, 34,146, 56, 37, 19, 20, 13,177,
+137,177,193, 14,211, 45,177, 48,181,117,135, 86, 26,163,145,213, 88,211,145, 4,185,135, 84, 16, 93, 80, 24, 58,193, 56,150,212,
+180,134, 6, 21, 25,178, 36,195,100, 74,146,225, 20, 68,196,232, 72, 80,221,113, 28, 81,215, 13,222,201,123,221, 57, 79,211,123,
+180,138, 25,141, 10, 97, 82, 56,121,247,116,182, 35,139,228,125,134,150,209, 54, 14,186, 97, 2, 17,167, 49,244, 50, 97,211,136,
+ 24, 48, 31,160, 54, 93, 35,164, 58,111, 29, 81,100, 80, 38,162,105,154, 97,157,105,152, 15,144, 24, 60,180,182, 29,138,159,136,
+ 40,141,132,238, 54,236,145,109, 43, 83, 63,107, 61, 4,153,172, 6, 60,121, 33, 92,141,122, 46, 54,174,208, 59, 90, 44, 38,150,
+134,206,182, 61,222, 8,143,222, 4, 1,165, 41,173, 80, 4, 64,161,149, 34, 32,140, 19,215, 6,178,108, 56, 67,130, 39,142, 34,
+188, 22,241, 30, 65, 2, 84, 58,107,137, 85, 60,248,192, 45,133, 41, 1, 79,215,201, 72,189,109,107, 60, 80,228, 5,163,209,120,
+ 0,180, 5,172, 87,168, 16,208, 58,162, 11, 29, 90, 7,156, 11,116,157, 37,202,228,185,141,163, 8,239,101, 90,147,101, 49,214,
+ 27, 76, 4, 73, 42, 81,181,206, 73, 12,107,221,213,164,121, 70,174, 11, 64, 92, 75,226,252, 72,134,247,236,224, 84,179,146,171,
+146,164, 25, 62, 52, 56,223, 19, 27,209,110, 36, 69, 74, 84, 85,115,146, 56,198, 12,232,193, 81, 57,166,106, 26,218, 90, 70,140,
+243,186,166,247,130, 30, 85, 40,132,229, 17,145, 71, 50, 94, 8,192,108, 58, 71,101, 26,239, 60,113, 30,145,198, 18,252,226,157,
+165,170,106, 97,186, 43,233,224,250,182,165,235, 91, 70,163,145,140,164,134, 78,204, 59,161, 32,137,224, 34, 34,142, 3,218,136,
+213, 46, 40,197,104, 52,166,179,178,151,169, 42,177, 96,116,109,141, 10, 10,235, 44, 93, 39,184,215,209,184, 92, 31,147,228, 38,
+149,108, 93,173,137,227,136, 52,203,176,182, 5,164, 10, 13,206,209,216,142,113,150, 49,155, 85,140,202, 66, 0, 11,157,149,112,
+132, 97, 31, 30, 16,172,109, 81, 20, 40,173, 9,222,161,134,151,134, 28,216,145,248,204,149,172, 42, 66, 47, 7, 17, 65,129,151,
+ 7, 95, 1,227,241, 88, 14, 48,100, 52, 63, 26, 13,100, 40,109,152,204,103,132, 97,162, 16, 25, 37, 59,147,133, 5,172, 21, 5,
+254,218,232,105,113, 97, 68,215,217,225, 6,214, 36,145, 6, 35, 15,201,120, 32,246,205,103,115,242, 34,197,186,128,243, 61,163,
+ 98,132, 87,129,166, 17,232, 79,211, 52,100,121,129, 82,226, 85, 77,146,100,253, 64,247,206,209,244, 30, 21,100,221, 96,187, 78,
+186,130,182, 93, 31,137, 47, 95,189,138,210, 18, 91,105,173, 37, 49, 49,137, 49, 92,189,114, 5,101,204, 80, 88, 40,148, 49,100,
+105, 70, 85,137,250,215, 5, 69,164, 21, 42,104,140,137,200,146,140, 36, 77, 80, 40,130,115, 84,109,143, 54,146, 93, 12,129, 60,
+203, 89,200, 21,127,255,221, 9,239,221,163, 8, 62,102,113,255,221,208,123,130, 13,144,192,147,135,207,112,215,109,187, 88,173,
+ 58,142, 29,187,140,106, 91,194,178,230,235,127,124,132,233, 74, 75,227, 60,103,206, 92,226,185, 51, 19,182,245, 29,103,171,142,
+247,124,232,199,153, 13,163,243, 36, 73,137,146,132,145,137, 57,126,250, 52,255,232,159,255, 34, 77,219,113,231,205, 7,249,249,
+159,250, 59,188,235,254,123, 0,152,215, 53,117,211,144,165, 41, 27, 55, 44,145, 38, 25,117, 93,113,252,228, 73, 94,127,227, 56,
+111,156, 20, 11,215,199,223,247, 30,254,135,127,244,159, 83,230, 57, 81, 28,177, 50,157,241,226, 43,175,242,221,231, 15,243,133,
+ 63,248, 35,218,166, 99,223,158, 93, 92,184,116,137,205, 27, 55, 18, 25,141, 11, 16, 58, 17, 58,122,239,209, 73, 10, 10,108,239,
+192, 40,102, 85,197,233,179,231, 56,117,238, 28, 73, 28,113,253,158,221, 60,120,247,237, 92,123,205, 14,118,108,219, 34,157,197,
+188,230,252,197, 75,172, 14,197,136,168,153, 21,104, 77,111,123, 94,120,245, 20, 95,126,244, 91,188,118,236, 56,187,119,236,160,
+ 28, 21,108,223,178,153,253,123,246,172, 91, 55,143,158, 56,201, 95,124,235,113,190,246,216, 19,188,246,198, 9,154, 86,198,159,
+ 27,151,150,184,245,192,126,122,219,243,196,211,207,242,224,221,119,112,117,121,133,201,108,198,226,120,196,229,171, 87,215,149,
+246,163, 98,196,103,127,248,227,252,221, 31,251, 12,222, 90,230,179, 57,229,168,228,228,169,211,152,200, 48,155,215,156,187,116,
+137, 53, 40,207,218, 85, 22, 57,123,174,217,201, 87,191,253, 56,251,175,221,195,135,223,243, 46, 54,111,219, 70, 95, 87, 40, 68,
+ 47,146,196, 17,207, 29,126,137, 19,103,206,177, 48, 42,248,255,187,214, 14,115, 99, 12, 90, 73,193,116,248,181,163, 28, 63,117,
+134, 61,187,174,225,208,145,151, 57,126,234, 12, 79, 63,255,194, 15, 4,199, 76,102, 83,238,185,239, 62, 64,246,210, 4,232,218,
+134,222,246,195,222, 28, 76, 20,129, 19, 90,152, 15,158, 34, 45,232,187,142,200,104,122,165,176,222, 97,219, 97, 60,237,189,236,
+187,131, 20,204,114,255, 39,184,222,211, 90,121,223,168, 97,242, 23,197, 17,229,104,204,100,117,149,162,144, 72, 88,135,100,146,
+171, 16,176,120,250, 70, 14,236, 36, 73,240,222, 18,122, 77,150,165,180,189, 37,137, 19, 92,144,112,173, 44,203,228,240, 85, 29,
+ 85, 5, 26, 77, 82,100, 96,229,247,153,205, 7, 43,238,112,128,180,157,136,134,141, 49,195, 59, 12, 20,210,185,134, 16, 24,141,
+ 70,184,185, 35, 31,101,168, 0, 62,120, 76,156,201, 10, 75,169, 97,146,229,134, 68,206,142,214,119, 56,235,208,145, 98,222,182,
+168, 70,166, 30, 90,107,162, 97, 58,105,135,251,190,243,129,206,138,165,212, 57,185, 39,138,145,176,238,243, 36, 99, 54,159,139,
+136,109,148, 12,182,102, 8, 46,144,100, 9, 72, 31, 41,152,218, 52,198, 90,139,115,129, 44,205, 49,166, 71,196,105, 18, 15,221,
+ 52,141, 20, 12, 67, 97, 81,140, 10,188,135,128,216,144,141, 54,226,165,215, 2, 98,179,214,210, 89,153, 28, 52,109, 67, 20, 37,
+ 44,140,199,244,118, 13,159,107,193, 40, 84, 47, 19,104, 23,160, 30,144,173,137,145, 24, 92,219, 91,180,214,180,173, 21, 49,117,
+150, 65,144, 6, 52, 40, 43,154,181, 0,120,168,186,102,248,108,220,224,162, 16,145,122,221,182,100, 89,182, 30,203, 13, 3,146,
+214,202, 26,194, 90, 73,146,139, 8, 30, 81, 42,203, 23, 43,163, 95,200,146, 88,140,239,121, 74, 52,228,246,214,117, 75,215,119,
+120,175, 17,120,190, 84,194,113, 28, 49,175,103,168, 88,246,184, 11, 67,199,214,219, 30,239, 29,113, 34, 59,222,182,106, 64, 43,
+ 70,165, 88,176,226, 88,212,130,174,183, 64,160,234, 26,140, 21, 14,175,137, 52,147,201, 42,193,137,200, 42, 77,115,138, 82,170,
+226, 52,149,131, 41,184, 32, 15,108, 44, 54,187,166,106, 89,190,218, 50, 94, 90,162,158,205,241, 64, 90,100,228, 67, 39,234,176,
+232, 72, 88,243,210,249,139,173, 33, 4,201,106,183,206, 82,183,205, 80, 9,105, 57, 96,188,167,173,107, 58,165, 6,165,115, 66,
+150, 8,131,215,123, 33,161, 69,145, 84,169, 12,251, 26, 20,224,197,107,108,140,236,136,148, 30,246,247,136, 88, 35,142, 98,170,
+106, 78, 28,167,164,177, 97,113, 97, 76, 83,183,210,241,105, 67, 51,116,255, 33, 64, 94, 20, 50,138,114, 30, 99, 98,138, 34,161,
+109,123,124,232, 8, 42, 37,137, 34,146,209,136,190,105, 72,178,148, 40,137,105,123,199,194,194, 8,130,200, 23, 12,138,116,156,
+ 9,165,206, 24,218,174, 65,171, 72, 70,251, 48,164,228, 37,212,182,195,213, 45, 73, 89,144, 12,190, 88,173,165, 74, 23,207,172,
+ 8,230, 8, 65, 16,141, 1, 26, 47,135,246,218, 67,127,117,101, 69, 4, 48,193,209, 54,130,252, 76,210,140,216,232, 65, 93,107,
+129, 88,138,138,182,149, 44,120, 39, 49,130,182,111,177,214, 15,104,205,192,231,223,153,243,222,221, 17,161,177,176,160, 9,111,
+ 78,248,242,183, 94, 99, 92, 24,222,249,222,131,228,227,156,173, 75, 25,135,142,156,227,163, 15, 93,135,191,126, 3,255,247, 23,
+158, 34,153,205,217,150,167,108, 42, 82,158,120,234, 24,222, 65,134,229,134,251,222,205,232,224, 3, 76,134,169,209,108,190,204,
+115, 71, 94,166,237,122,254,251,255,229,151,215, 15,178,209, 72, 62,187, 51, 23, 46,136, 78,193, 72, 58,215,226,104, 68, 28,197,
+212, 77, 69,221,180, 76,230, 21, 95,253,246,147, 92, 93, 94, 33,137, 35, 30,186,239,110,209,114, 24, 67,104, 26, 14,191,126,148,
+ 39,158, 57,196,147,207, 60,207,214,141,155,216,187,107, 23,159,253,225,143,179,115,219,102,124,240,111, 77,188,122, 17,191, 20,
+131,151,119, 84, 22,212,109,203,179,207,191,192, 99,223,123,150,139, 87,174, 98,123,241, 49, 23,163,146,165,197, 5,182,108,218,
+ 72,221,180,124,235,187,207,240,236, 11,135,185,186,188, 66,239,228, 37,160, 81,220,184,255,122, 20,138, 55,207,156,227, 91, 79,
+ 60,197,209, 55,222,100,203,166, 77, 60,124,223, 93, 60,112,207, 93,248,222, 98,157, 69, 27, 67,215,203,126,250,250, 61,187,249,
+166,137,214, 63, 7,128,213,233,148, 13, 27,150,248,137, 79,127,130,157,219,182, 50,171, 42,190,245,228, 83,188,252,198,155,156,
+ 60,125, 78,188,193, 3, 92,200,123,203,179, 47, 30,102,219,230, 77,220,115,235, 45,140, 71, 37,175,188,118,148,191,250,222, 51,
+ 92,190,116,153, 77, 27,151,216,176, 52,230,194,197,183, 0, 51,251,247,237,229,159,253,151, 63,199,117,187,174, 97, 97, 60, 98,
+243,166, 13,120, 60,161,169,112,206,113,236,205, 83,188,126,252, 77,156,235,217,127,237,181, 28,123,243, 52, 71,143,203, 90,224,
+111, 18,197, 41,165, 8, 10,242, 36, 97,105,113,129, 71, 30,124,128, 27,246, 94,203,197,203,151,217,181, 99, 59, 7,247,239,227,
+229,215,223,224,240, 43, 71,121,250,197,195,235,223,193,219,175, 43, 23, 47,242,220, 51,207,114,199,157,119,138,173, 43,136,103,
+ 61, 77, 83,140,142,168,231, 21, 68,253, 48,109, 12,160,196,174,102,123, 75, 57, 42,101, 93, 53,140,130,181,150,124, 10,235, 61,
+179,217,156, 52, 78, 80, 70, 2,165,148,134, 34,149, 41,103,164,133, 37,144,231, 57,120,233,234,133,219, 14,105, 58,172,240,102,
+115,140, 82,152, 88, 44,103,214,247,195,244, 84, 44,107,214, 90,146, 52,162,107, 61,233, 56,197,245,110,125,154,224,122, 71,148,
+ 69,248,193,186,106,204, 16,157,154,101,116, 77, 75,146, 68,164,105, 70,211,214,232, 72,210,215,100, 52,222,174,143,130,155,182,
+147, 67, 20, 17, 53, 10,200, 72,186, 83,109, 12,211,233, 42,163,209, 2,202,139,103, 61,120,135, 11,142,182,181,164, 89, 76,211,
+200, 42,179, 44, 75, 41, 2,140, 34, 14,134, 36,138, 9,193, 99,123, 75,156,102, 56,219,210,247, 45,125,239,240, 78,248, 10,113,
+ 20,145,229,249,186,248,110, 97, 97,129,116, 88,113, 42,163, 40, 75,225, 1,244,189, 24,179,149,146,105,109, 8,130,230,214, 26,
+ 66, 80, 68, 73,138, 82,129,122,152,134, 68, 90, 83,183, 13,113, 42, 78,159,186,171, 81,206, 97,189,193,117, 34, 84,141, 84,132,
+235,100,242,168,104,214,119,230,105, 33,252,118,141,194,133,126,104,202,132, 98, 89,215, 21, 11,163, 49,161,151, 68, 83,215, 75,
+243, 25,197, 17,109,211, 14,211, 78, 57,236,187,206, 66,240,244,189, 52,140,107,235,209, 16, 2,113, 18,139,104, 46, 8,131,190,
+175, 42,148,150,243,201,246,142,233,108, 10, 65,145,196, 17,202, 67,164,180,161,105, 90, 34, 19,200,199, 11,148,101,194,100, 54,
+163,243,129, 16, 20,177,137,137,226, 68,246,231, 26, 17, 69,133,181, 27, 69,160, 33,131, 91, 3, 23, 96,214, 77, 89,190,122, 21,
+ 97,208,106, 52,138,182, 22,245,100, 18, 27,226, 56,163,235, 68,173,222,119,146,145,142, 82,148,229,136,214, 54,228,105,193,244,
+255, 99,236,205, 99, 44,187,238,251,206,207, 57,247,220,245,109, 85,213,221,213, 75,117,245,194,222,200,102,179,185,147, 34, 69,
+ 81, 20, 45,201,148,100, 57,180,156, 56,182,227,216, 14,108,140,147, 9, 48,177, 17,100, 48,147, 1,102,226, 1,130, 56, 64,156,
+ 89, 16, 15,236,137, 19,195,206,120,145,101, 43,150, 20, 91,178,100, 90,162,196, 22, 73, 81,220,155,189,144,189,239,107, 45,239,
+189,187,223,123,206,252,241,187, 85, 18,109, 79, 48, 23, 40,116,131,236,170,122,239,190,123,239, 57,191,223,239,251,253,124, 87,
+ 37,180, 69,183, 93, 34, 87, 99,105, 84, 77, 27,138,231,115, 45, 71,189,181, 96,180,136, 19,162, 80,148,233,214,194,234,202, 18,
+253,100, 64,154, 79, 73,199, 53,165,201, 25, 13,135,164, 69,137,167,101,145,243,117, 0,218, 17,250,129,248,184, 59, 47,169,239,
+ 25,194,192, 39, 47, 43, 92, 93, 49, 24, 12,240, 60, 1, 45,212,117, 69,145,103, 84,149,216,192,180, 18,190,187,181,150, 48,140,
+229,117,105, 97,171,143,199,171, 36, 65,132,214,134,178, 22,171, 65,158, 73, 32,192,112, 56,164,160, 32,233,201, 5,154,229,242,
+223,122, 70,163,149,161, 40, 37,130,111,146,166, 12,250,125,129,254, 55,142,184,215, 19,127,187, 18,170,159, 35,196, 57, 40,235,
+ 18,173,252,110,148, 80, 96, 65,218,111, 86, 34, 74,179, 52, 67,121, 90,152,203, 77,131,241, 13,174,174,128, 22,231, 20,117, 45,
+ 59,206,113, 42,169,107, 0,101,110,169, 16, 82,214, 96, 52,162,172, 42,218,186, 37,142, 67,162, 72,130, 86,148, 21,111,104, 94,
+ 20,216,238, 2,156,142,199, 56, 45,243, 97,141, 38, 67,110,144, 42,207, 8,195, 0, 28, 56, 79, 83,215, 53,107, 10, 92,133,146,
+ 27,184,117,244,250, 98, 41,178, 22,102,122, 13, 79,236, 14, 37, 27,221, 87,184,165,138,223,251,211, 55,217, 57,236,113,245,250,
+132,115,111, 94,224,240,222,121,188,186,229,169, 7, 23,217,244,224, 46,190,240,185,215, 9,178,130, 1,160, 90,168, 45,140,122,
+ 49,211,172, 96, 82, 42,246, 62,254,105,150,167, 41, 56, 73,104,202, 75, 73, 86,250,234,243, 71, 88, 90, 17, 75,218,254, 59,118,
+241,233, 31,248, 48,187, 22,183,173, 51,171,163, 48, 34, 12, 3,140,231,117,110,136,150,227,167, 78,243, 43,255,215,111,242,198,
+ 59, 18, 62,114,247,254,125,140,134, 3,153, 95,118, 66, 24,163, 52, 23,175, 92,103,121,188,202,190, 93, 59,121,228,254,123,152,
+ 25, 13,241,131,144,182,109,201,242, 66, 2, 49,128,208,247,120,249,245,147,252,234,111,254, 54,207,126,244, 41, 6,131, 1, 51,
+163, 33,107,194,157,185,153, 17,187,119, 46,112,199,194, 86, 33,170,149, 21,111, 29,127,151,119, 78,188,203,185,203, 87,214, 95,
+ 63,128,197,241,242,235,111,178,101,195, 28, 15,222,119, 15, 77,219,114,115,121,153,219,171,171,156, 58,123,142,231,142,188,204,
+ 35,247, 30,226,222,131,119, 49,236, 43, 62,251,141,111,242,252,139,175,114,244,189,147,148,197,247, 22,244, 13,179,179,124,234,
+233, 39,121,236,193,251,216,187, 99, 59,113, 28,115,245,198, 77, 54,111,222,204,229,235, 55, 89,157, 76, 40,235,154,143, 63,249,
+ 4, 7,247,238, 34, 73, 18, 30, 60,124, 55,187, 23,183, 19, 4, 1,203,171,171, 56, 39,226,162,207,127,237, 47,185,240,125,254,
+245,181,227, 84, 23,249,250,248,195, 15,240,143,126,234,239,226,249,129,136,194, 16, 17, 80, 89, 73, 49,113,246,194, 69,174,222,
+188, 69,104, 68,228, 10,223,171,198,191,255, 88,171, 48,181,242, 56,184,111, 47, 59, 22,182,177,119,247, 14,238,216,185, 29,223,
+248,156,191,114,149, 55,142,158,224,236,133,139,156,189,116, 89, 44, 94,223,119,104, 45,224,155,251,239,190, 11,207,192,114,154,
+118,139,185, 71,211,180, 84,174, 34,136, 3,153,103,231,185,136,151,180,100,179, 43,179,198,243, 78, 40,138,140,184,215,239, 0,
+ 51, 33, 38, 14,104, 59, 59,173, 54,134,193, 80,236,104,117, 45,227, 22, 79, 75, 24, 74, 85,150, 88,235, 72,146,152,186,174,137,
+227,164, 19, 99,181,157, 67, 72,212,224,190,241,105,170,134,210,214, 20,101, 65, 93, 75,229, 91, 20,157,247,186,150,141,132,209,
+ 30,120, 8,190, 22, 17,218,181,174,194,215, 1, 70, 25,209,186,104, 15,144,234, 60, 10, 3,154,202,145, 53, 25,195,225,144,164,
+ 43,194,172,109,145, 43, 75,161,149, 38, 43,114,160,203,125,119,174, 19, 52, 43,242, 52,197,121,154, 54,207,240,141, 79, 85,150,
+130, 97,117,208,235, 39,180, 85, 75, 81, 21, 52, 85,131,214,178,160,175, 69,188,182, 14,217,224,251,225,186, 35, 39, 52,146, 14,
+ 87,178,150, 76,166, 49,158, 17, 65, 97, 35, 66,194,193,160,143,198, 81,181, 22,172, 69,155,206,239,222, 54,212,213,247, 54,109,
+190,241,105, 90,113, 39,105, 45,137,146,214,130,167,228,252,183, 78,198, 53, 81, 16,211, 88, 75, 18,136,184,219, 41,193,233,122,
+190, 79, 81,164,180,142, 46, 64, 6,218,166,162,170, 37,255, 93,107, 1, 64, 57,219, 50, 28, 74,148,185, 31,202,102,198,215,158,
+ 16, 63,157, 67,185, 78,247,228,132, 19, 95, 55, 21, 26,233,126, 78,210, 9, 65,224, 19,198, 49,117,183,118,216, 86, 84,241,233,
+100,130, 49, 30,198,121, 88, 28, 85, 81, 97, 43,105,199,151,121,151, 14, 10,210,219,111,235, 6,191,179, 37, 24,165,200,106,105,
+195, 52,173,165,172,197,159,151,101, 25,173,181,248, 54, 96, 50, 73,101, 30,100,197,203,172, 61,143,116, 50,166,169, 43,146, 56,
+ 38, 12, 3,170,170, 64,105,189,110,253,144, 10,184,145, 5, 91,107, 26,101, 25,141,102,168, 91, 75,150,166, 40,237, 9,248, 32,
+ 8,112,101,141,100,119, 43,208, 22,112, 18, 71,170, 96, 48, 26,137, 8,164, 44, 72,194,132,162, 44,153,102, 25,206, 66, 63,142,
+152,102,185,192, 81,172,195,248, 18, 95, 87,150,146, 59,172,149,143,209,144,166, 83, 6,131, 1,147,233, 68, 90,217,158, 38, 14,
+ 67,178, 52, 35, 47,178,245,139, 96, 50,153, 72, 92, 97,211,226,172,144,173,242, 50,239, 82,206, 74,226, 36,161,110, 27,138, 76,
+110, 36,135,176,179,189,110,174, 45, 27,150,158,132, 57, 20, 89, 71,114,147,120, 68, 5, 12, 70, 3,166,147, 41, 69, 89,118,231,
+ 73,110,114,237,105,146,222,154,138, 18, 76, 32,130, 61,207,151,202,122,146,166,235,149,128, 82, 16, 69, 9,113, 36,224, 22, 15,
+ 8, 76, 64, 94,230,132,113,140,111, 4, 28,147, 78, 86, 5, 77,216,134,210,182,107, 91, 65, 12, 26,201,227,117,206,117,163,142,
+190,116, 27,111,214, 65, 69, 0, 0, 32, 0, 73, 68, 65, 84,144, 7,132,179,173, 8, 66,156,235, 30, 96,178, 17, 12,163, 16,207,
+ 57,134,131, 1,109, 20,145,149, 37,101,150,209,139, 99,166, 43, 43, 36,131, 1,253, 32, 38, 43, 43,148,167,153, 78, 5,150,162,
+181, 70,107,213,253,169, 73,146, 30,158,239, 99, 34,169,186,218,166,165,214, 21, 15, 44,132,248, 19,135,211, 45,132, 9, 47,125,
+251, 45,252,186,230,145, 67,187, 56,242,250,123,188,121,230, 54,131, 64,177,113,247, 38, 22, 63,122,128,179,223, 60, 75,177,154,
+ 50,208, 45,241,168, 71,177,154, 49,231,124,166,109,195, 96, 38,196,219,124, 23,105,188,129,114, 58, 69,119,182,185,211, 23, 46,
+241,165,175,125,157,207,127,249,107,221, 77,239,177,123,251, 2, 27,230,102, 25,246,250, 36, 73, 36,231, 84,201,152, 40,239,132,
+146,158, 17,113,223,187,167,207, 0, 48, 26, 12,120,246,227, 79,179,103,113, 1,173, 52,160,241, 13,156, 60,123,150,175,125,235,
+ 8,195, 65,159,103,158,122,146,103,159,121, 26,133, 38, 75, 83, 86,166, 83,198,147,105, 39, 54,212, 20,165,199,175,255,238, 31,
+114,238,194, 37,254,248,203, 95,227,217,103, 62,202,161, 3,251,137, 59, 96,208,183,191,243, 58,202, 41,182,204,207, 51, 55, 59,
+131,115,142, 93,139,219, 24, 14,251, 52,109,203,137, 83,103,214,175, 91,173, 53, 7,247,239,161,215,239,113,254,210,101,250,253,
+ 62,163,193,128,217,193,128,199, 31,126,128,126,146,160, 21,120,158, 98,219,252, 70,158,120,228, 33,246,239,220,193,139,175,191,
+197,103,191,248,103, 20, 85, 69, 28,199, 12,146,152,165,149, 85,105, 57,171, 78, 36,166,100,129,169, 91,203,206,237, 11, 44,173,
+142,121,249,181,215,121,232,240, 65,126,244,147, 31, 99,219,230,121,218,198,113,227,246, 45, 46, 92,189,198,119,222, 56,202,242,
+202, 42,121,241,254,197, 19, 96, 56,232,115,104,255, 94, 46, 93,187,193,103,191,248,101,138,162,224, 23,254,222,143,177,101,211,
+ 38,150,199, 99, 46, 95,187,129,115,142,125,187,119, 82,148, 21, 87,111,222,226,237,247, 78,203,189,245, 95, 57, 6,189, 30, 7,
+247,237,101, 52,236, 51,153, 78,184,124,245, 58,123,118,239, 68, 3,111, 30, 63,201,241, 83,167,121,247,236, 57,110,221, 94,122,
+ 95, 87, 98,237, 8,130,128, 61,187,119,242,212,163, 15,113,244,204,121, 94, 56,122, 2,165, 36, 74, 89, 68, 89, 21,174,149, 13,
+133,214, 29, 50, 53, 48,178, 96,226,208,128, 31, 68,180, 85,141,142, 34,146,141, 27,100, 1, 27, 14, 25,204,111, 66,153,144,182,
+133,241,245,203,228,215,174,145, 45,221,166, 46,107,146, 68,170,116,167,132,131, 17,134, 1, 96, 73, 83, 97,253, 39, 73, 76, 85,
+202,136,208,143, 68,136,149,248, 17, 56,141,117, 93, 59,216,218,238, 79,161, 11, 26,101,168,108, 69,139,116, 18,162, 40,162, 40,
+ 36,254,212,248,157, 62, 72, 27,218, 86,236,107,114, 95,130,231, 27,166, 89, 70, 28,117, 97, 84,117,139, 49,166,203,138,144,191,
+ 43, 37,197,149,164,110,122,221,198,163,135,179,174, 3,100,121,104,103,168,235, 70,196,198,141,193, 24,131, 70, 90,252,194,157,
+151,222,121, 94, 22,194,243,232,142,182,109,208,141, 71, 28,203,168, 37,138,164,112,106,149,195,213,242,220,107, 91, 11, 8,229,
+212, 55,154, 40,140,177, 88,170,162,193,154, 26, 91, 59,122,253, 62, 90, 41, 64, 49,153,140, 49,190, 17, 16,140,107,152,164, 41,
+129,246,100, 65, 54,194,251,143, 67,201, 66,175,242, 2,227, 39, 20,117, 73, 28, 69,210,197,232,216,237,242,120,116,164,233, 84,
+120,252, 73,140, 42, 42,177,218, 25, 31,171, 13,147, 46,235, 98, 48, 26, 96, 60, 13, 78,184, 3, 81, 24, 97,125,131,179,138,178,
+200, 59,219,183,193, 86,138,214,181,132, 38, 4,107, 5,179,141, 67, 7,170, 99,201, 40, 28,130,211,245, 67,233, 16, 5,161, 66,
+105, 41,138, 38,147, 20, 13,152,186,110,104, 93,139,175, 36, 83, 29,231,104,156,235, 68, 96, 61,180,111,136,140, 1,235,232,245,
+ 18,178,162, 20,117,185,131,160,151,208,180, 22, 84, 23, 99, 88, 8, 52, 38,207, 50,172,107,137,195,136,213,213, 85,218,182, 93,
+191,248,181, 22, 84,158, 83,221,236, 84,105,140,167,232,117,116,174, 53, 1,150,139,161,170, 45,161,209, 56,165,104,157, 37, 95,
+ 93,161,117,150,166, 41, 9,195, 62,195,193, 16, 80, 4, 56, 34, 43,148,187,188, 44, 48, 70,222,164,118, 64, 43, 94,251,233, 84,
+192,252,190,145,147,105,173,101,117, 85, 30, 86, 69, 89,224, 28, 52, 85, 73,107, 45, 97,146, 96,180, 94,247,135,175,174, 44,119,
+ 39, 84, 54, 64, 97, 24, 83, 55, 53, 77,219,202, 69, 97, 12,126, 32,190,204, 52, 77,153,164, 41, 73,191,143,239,137,159,178, 42,
+ 5,249, 23, 4, 1,218, 72,139, 42, 73,250,120, 90,126,102,210, 19, 59, 87, 83, 73,110,121, 24, 5,120,200,255,107,235,154,178,
+ 17,123, 31,214, 49,201, 82,156,149,221,100, 28,134,164, 89,134, 83, 80, 22, 25,182, 21,209, 5, 74, 84,146,189, 94, 15,172, 8,
+123,156, 82, 34,126,180, 80, 55, 21,101,103,165,147,212, 60,217, 41,123,158, 71,216,239, 81, 87, 53, 14,139,107, 93, 23,111,234,
+161,149,194, 79, 34,234,218,162, 13,248,129,191,254,222,155,198,138, 26,190,123,159,233,100, 2, 74, 49, 29,143,229,243,244, 12,
+218, 51,168,214,174, 43,228,173, 69, 58, 27,206, 9,198, 81, 75, 75,209,120, 62,142, 22,231, 12, 73,149,194,133, 41, 28, 88,128,
+ 91, 25,103,206,173, 48,235,105, 78, 94,184, 66,158,149,236,185,107, 27, 27, 99,160, 31,225,206, 77,249,230,137,235, 12,235,146,
+217,141, 51,232,208,176,178,154, 50,108, 45,169,245,208,227, 41, 91, 31,123,140,229, 84,184,201,190,231, 49,232, 39,108,152,153,
+225,198,210,247, 84,216, 79,126,224, 17,126,230,199,126,132,187,247,239, 35,142, 66,154,166,145,107,195,182,180,182, 83,232, 55,
+142, 75,215,175,241,127,252,135,223, 38,235, 64, 37,247, 31, 60,192,129,125,123, 72,122, 9,145, 9,112,202,113,229,230, 45,190,
+254,237, 87,112,206,241,139, 63,247,211,124,236, 67,143,145,103, 57, 90,105, 17, 60, 69,161,204,150, 93,200,112,216,103,118, 52,
+ 34,244,125, 0,110,175,172,114,229,250, 13,222, 58,126,130,171, 55,110,241,202,235, 71,153, 25, 13,121,228,254,195,236,220,190,
+176, 46,212,210, 90,115,245,198, 77, 94,127,231,248, 58, 22, 22,164, 5,125,248,192, 62, 22,183,108,230, 43,207,191,192,210,202,
+106,247,158, 2,118,108,219,198, 71, 30,127, 24, 99, 12, 85, 93, 49, 77, 51,166,233,148,215,142,157,224,205, 99, 39, 40,186,121,
+247, 48, 73,248,212, 71, 63,194,211, 79,124,128,109,243, 27,177,109,195, 52,147,241,212,131,247,220,205,119, 95,127,139,133, 45,
+155, 24, 14, 19,142,189,123,134, 99,167,206,242,240,165,107,204,205,109, 32, 79, 51,206,158,191,200, 27, 39,222,229,196,233,211,
+ 28,127,247,204,251,152,238,107,199,189,119,221,197, 15,127,236, 41,118, 47, 46,176,101,126, 35, 87,174,221, 96,121,117, 76, 24,
+ 4,156,187,120,133,183, 78,156,224,157,119,207,112,238,210, 69,110, 47,173,190, 47, 80,230,191,118, 84,109,141, 83,142,141,179,
+179,236, 88,216,198,230, 13, 27,216,187,115, 7, 75,203, 43,188,119,246, 28,239,158, 57,199,149,235, 55,186, 74,239,253,135,181,
+150,217,225,128, 65,210,163, 31, 69,252,216, 83,143,114,199,134, 1,191,245, 23, 71,168,154, 86, 68,197,182,107,183,183, 13,174,
+116,221, 2,231, 17,198, 62,161,141,168,109,197,194,125,247,114,224,227,207, 16,205,111, 39, 10,103, 80, 68,120,202, 18, 41, 24,
+205, 41, 18, 50, 86,199, 49,151,190, 83,112,107,229, 38,103, 79,254, 71,110, 29, 63,137,115,142,186,250,158, 63, 60,138, 66,113,
+145,180,181,116, 10, 42, 97, 25,212,105,221, 45,244, 82, 52, 41,165,169,235,138,126,210, 71, 25, 15, 87, 57,140,103,168,171,154,
+ 32, 10, 36,123,221,128,197,210,235,197, 88, 0, 7,161,239, 83,213, 45,214, 9,111,162,170, 75,226,112,128,197,145,229, 41,211,
+166, 38,137, 98, 28,154,182,118, 52,212,120,120,248,120,210, 14,110, 26,170,178,160,215, 27,224, 44,235,163, 56,177,105,105,104,
+101,129,114,185,216,195, 68,169,159,118, 5,137,108,150,215, 70, 24,158,242,136,147,132,178,204,136,162,132,166, 41, 41,170,156,
+186, 18, 49,223,154, 88,204,143,186,145, 93,207,167,237, 70, 78,117, 85, 49,169, 39, 12, 7, 67,156,107,214,171,127,133,108, 94,
+ 21, 30,131,193, 64, 34, 75,235,239, 89,226,106, 39,122, 0,215,182,120,190, 79,221,182, 52, 85, 45, 35,147, 74,158,203,105,211,
+118, 58,162,136, 16, 1,104,181,206, 82,169, 10, 63, 52,242,204,143, 99,122,122, 64, 83, 87,148,101, 14, 14,137,154, 77,101, 3,
+218, 75, 98, 60, 29,144,167, 25,126, 20,227,154, 90, 10,224,110, 60, 82,235,150, 42, 47,240,140, 66, 41, 15, 79, 41,154,182, 37,
+ 10, 4, 22,150, 78,133,221, 31,135,177,116,151, 20, 34, 98,117,150,186,113, 56, 45,128, 30,227,121, 6,207, 25,252,192,167, 40,
+114,137,198, 84,138,166,181, 76,166, 19,250,163, 1,117, 94,211, 90,135,178, 18,220, 78, 32, 21,225, 52,205,136,162,110, 62,160,
+141, 88,169,180, 33, 52,166, 3,171, 72,200,128,109,132,186, 19,199, 17,198,136,237,195, 51, 30,217,100,138,115,162, 30,108,109,
+ 3, 86,250,248,253,193, 64, 60,160, 85, 69, 18, 14,105,108, 67,228, 27,204,204,136,213,213, 21,234,178, 34, 83, 41, 65, 16,147,
+ 36, 49,190, 9,232,247,125, 92, 20,209,210,225, 24,107,129, 63, 4,161,192, 12, 70,163, 17,227,241,152, 60,149,214, 73,210, 79,
+104,173,149, 29,170, 18,176, 6,214, 50,238,136,114,211, 60,135, 86,102, 24, 22,215, 9,248, 58, 15,106,145, 97, 76, 64, 91,137,
+170,179, 68,129,214, 12,250, 67,194, 36,150, 0, 28, 64,105,205, 96, 48, 68, 41, 39, 29, 7, 37, 59,187,166,181, 29,169, 79, 17,
+246, 66,124,101, 72,171, 66,226, 65,157, 35, 78,122,172, 78,229,117, 0, 40, 79, 97,109,140,109,101, 81,142,146, 88, 20,166,147,
+ 9, 97,224, 19, 39, 50,127,149, 24, 74,193, 32, 70,161,207,116, 50,198,243,215,210,135,228, 70, 91,251, 2, 73, 61,243,148,136,
+ 10,135,131, 62, 85,221, 18, 4, 30, 42, 18, 49, 15, 86, 32, 52, 85, 89,160,117,151,162,167, 69,105,186,150,180,102, 34,169,100,
+167, 83,217,232,133,157,120,206,182, 82,221,251,218,195,243, 13, 90,201,239, 84, 74,173,111,144,180,115,242,121, 89,208,190,232,
+ 18,138, 42,103,110,118,196,161, 45,138,103, 31,140,113,117, 12,190,225,202,217, 11,108, 26,134, 84,149,101,233,242, 42, 87,155,
+150, 79, 29,216, 14,167,223,133, 65,143,223,253,202,171,196,105,202,236,220, 16,211, 15,168, 38, 21,202, 4, 92, 45, 27,198,117,
+195,124, 60, 68,111,217, 79, 83,148,104, 44, 40,195,151,159, 63,194,191,249,141,255,184,238,195, 94,216,186,153,159,124,246,135,
+ 56,184,247, 14,146, 56, 36,240,252,110,115,215, 80,212,150,170,106, 72,243,156, 52,203,121,233,213,183, 56,122,226, 20, 32,158,
+251, 15, 62,242, 32, 27, 6, 3, 70,189, 30,218,243,184,121,123,137,127,255,123,127,196,183,191,251, 26, 79, 62,242, 16,207, 60,
+245, 4, 97,224, 75,162, 20,173,140,157,154,150, 65,191, 71,224, 7, 24, 79,216,255,135, 14,236,227,181,163,199, 40,171,154,227,
+167,206, 18,135, 33,187,182,111, 99,126,211, 28, 55,110, 46,177, 99, 97, 27,247,220,185,143,165,213, 49,227,201,148,149,149, 49,
+151,174, 92, 35, 12,252,174, 2,147, 77,198,191,252,103,255,132,135,239,189,135, 47,253,197,215,241,141,199,120, 50, 97,227,220,
+ 44, 15, 30, 62,196,234,100,149,147,167,206,178,111,239,110,234,166,165,174, 91, 38,211,148,119,222,125,143, 55,142,157, 96,237,
+152,157, 25,112,123,121,133,107,215,111, 48, 55,232,163,251,125,110, 46, 47,243,231,207,127,139, 35, 47,191,202,141,165, 21, 30,
+127,240, 62,126,233,231,127,134, 67,247, 30,194,230, 69, 87,109,213, 52,109,195,214,173, 91, 57,113,238, 2, 47,189,246,230,186,
+111,126,237,152, 25,246,217, 48, 59,203,194,214,205, 28,186,115, 63, 91,231, 55, 48,236, 15,217, 48, 59,199,120, 50, 97,156,102,
+204,206,142, 88,220,186,149, 56,138, 49,190,230,246,242, 91,252,255, 57, 14,221,185,159, 45,243, 27,153, 29,142,232, 69, 33, 73,
+156,176,127,207, 46,242, 34,231, 63,125,254, 11, 60,119,228, 37, 38,147,201,186,184,239,111, 58,180,214, 12, 98,159, 94,185,140,
+ 93,170,248,228,254,237,220, 49,251,131,252,187, 23,223,230,250,181, 37, 73,206,243, 12, 10,209,218, 52,181,136,177,156,133, 61,
+ 31,123,154,195,159,254,113,166,174, 71, 61,185,136,139,231,152, 84, 45,225, 57,203,198,131,138, 45,131, 10, 92,131,175, 20, 27,
+250, 25,246,137, 4,239,229,157,120,209, 47,163,230,254, 3, 55,143, 60,135,246,100,161,243, 58, 17, 99, 28,199,120, 94, 68,219,
+ 52,244, 58,202,100,145,229, 93, 7, 80,238, 79,207, 19, 31,243, 36,157,208,235, 73,183, 45,203,196,145,148, 77, 37, 70,185,174,
+ 27,140, 19, 91,166,114,138,186,174,233,245,123, 64,131, 31,248,184, 86, 98,172,149,130,178,148,209, 2, 56,234,218,210,184, 70,
+170,236, 70, 17,248, 1,181,171,169,211,148, 94,175, 71, 89,105,170, 74, 58,140,107,137,154,129, 39,233,154, 74, 43, 98, 99, 8,
+186,188,118,107, 91,140,242,208,190, 7,173,100,118, 24, 95, 97, 2,121,150, 52,173,108,164,181,214,152, 32,164,238, 52, 15,214,
+182, 84, 85,131,214,146,145,142, 21,103, 64, 89,213,160, 58, 0, 22,146,140,214,180,142, 65, 95, 34,111,171,166,192,152, 62,214,
+ 74, 39, 50,233,119,127,119,162, 99,105,170,134,162,200,133,146,106,132,151,239,121,138,186,118,148,141,136,211,234,186,198,181,
+ 45,147, 73, 74,224,107,180,231, 75, 23,179,155,131,135, 97, 72, 54, 77,169,173,197,247, 52, 73, 24,119,157,132,182, 75, 80,243,
+132, 30, 8,224, 32, 47, 75,122,131,190, 20, 90, 8,164,199,182, 45, 26, 3, 74,224,100,147,241, 88, 58, 55, 26, 65,253, 58,135,
+179,142, 73,190, 42, 69,154,147,248,216,181,103,123, 28,132, 34, 8,172,138, 82,218, 19,157,239,178,169, 26,242, 44, 23, 98, 92,
+211, 80,231, 53, 81, 63,198, 88,139, 49, 33, 85, 37, 31,180,179, 22,207,192,120,101,138,242,164, 29,217, 84, 37,218, 51, 20, 85,
+201,218,220, 27,101,241,124, 31,107, 29,121, 81, 97,188,150, 48,137, 73,167, 41, 73,210,163,104,106,130, 78, 32, 50, 94, 89, 1,
+219, 50, 29, 79, 48, 81, 23,107,168, 44, 65,224,131,147, 40, 66,173, 53, 73,191, 71,219, 86,136,119,221, 82, 20, 21,158,231, 83,
+213, 37,198,247, 40,203,134, 36,142,208, 90, 98,249,172,131, 94, 47, 98, 56, 28, 72,114, 78, 43,162, 63,173, 20, 85, 91,161,141,
+ 2, 37,228,185,217,153, 25, 97,253, 42,133, 31,135,157,157,196,117,221, 9,169,106,173,211, 52,121,177,222, 85,176, 40,180,115,
+140,167, 83,225,153,215, 37, 78,201,142,186,215, 19, 54, 50, 74,168, 73,161, 31,128, 22,235, 92, 94, 20,100,227, 76, 22, 90, 28,
+ 10,205,104, 56, 32,157,174,121,184,101,241,195,130,195,202, 44,197,243,169,203, 2, 63,233, 49, 24, 14, 0,249,112,163, 64,144,
+190,113, 23, 36, 80,181,226,119, 77,211,140, 40,137,240, 61,169, 0,203,170,146,121,163,231,161,148, 34, 43,114, 4, 26,100,168,
+235,154, 40, 10,200,178, 28,108, 75,152, 72,104, 79, 89,150, 20,157, 0,112,212, 31,173,143, 81,194, 32, 96, 60, 30,163,149,146,
+156,251, 70,102, 85, 46, 8, 80,221, 3, 37,238, 13,192, 58,198,147, 49, 78, 9, 70, 84, 28, 9, 6,101, 52,158,243,104,176,100,
+147,177, 60,184,124,195,223,127, 72,243,201,125, 6,221, 88,240, 13, 20,150,119,206, 47,209, 58, 71, 72, 75, 89, 53,124,230,131,
+187,177, 69, 9,126,194,234,155, 23,152, 92,184,205, 29,129,166,110, 90,218, 76, 54,161,211,178,198,122,154,186,204, 73, 30,253,
+ 65,252, 36, 33,114, 98,231,211, 90, 90,180,251,118,237,228, 59,111, 28, 5, 44,123, 23,183,179,113,102,136,164, 4,202,124,173,
+181, 66,107,114,173,164,239,189,125,236, 36, 95,253,214,183,121,241,245, 55,153,164,226,101, 61,176,123, 39,158,241,169,172,220,
+224,198, 57,230,102, 70, 60,243,212,135, 88, 89, 93,229,177,135,238,197, 55, 62,211, 44, 19, 33,140, 82,221,168,198, 97,248,158,
+ 77,229,252,149,171, 28,220,183,135, 39, 30,126,128, 23, 94,121,141, 43,215,110,112,247,129,125,100, 69,197,214,249,121, 94,123,
+251, 24,171,211, 9, 89,209, 97,116,149, 34, 45,114,198,147, 41, 89, 94, 80,149,178,160,239,223,189,139,167, 31,127,132,162,172,
+216, 56, 59,195,243, 47,189,194, 35,247, 30,226, 99, 79,126,144,187,246,237, 17,193,107, 83, 33,225, 60, 53,211, 44,227,250,141,
+219, 92,189,254, 87,108,102, 14,118, 45, 46,176,184,176, 21,173, 53, 89,150,145,103, 57, 15,220,125, 39,187,183, 47,242,221,163,
+239,112,236,196,123,252,238,159,124,137, 31,173, 43,246, 46,110, 39,203, 11,166,121,198,233,115, 23,121,254,165, 87,200,202,146,
+217,209,224,125,139,122, 20, 69,220,181,119, 15,143, 63,120, 31, 59, 22,182,163,112,235, 27, 27, 2,159,126,146,176, 58,157,112,
+233,202,117, 62,251,197, 47, 83,219,150, 45,155, 54, 48, 55,154, 1,254,191, 43,245, 93,219,183,113,239,161,131,244,227,136,126,
+146,176, 99,251, 2,119,236,216,206,230,141, 27, 8, 2,159,229,229, 49,223,124,249,187,172,142, 39,127,237,123, 85,247,144,212,
+ 90, 51, 55, 35,163,141,133, 65,204,230, 94, 66, 18,133,188, 24,142,248,218,214,237, 44,254,248,189,220,145,102,172, 94, 56,207,
+205, 99,199,184,117,241, 60, 97, 16, 81,215, 13,113, 47, 97,243, 19,143,179,117,251, 63, 96,195, 92,197,102,215,112, 98,226,227,
+215,134,217, 89,195,197,183, 52,199, 95,248, 18, 15,126,226, 7,153,161, 33,176, 16,234, 16,194, 9,229,193, 33,171, 95,113,212,
+ 75, 31, 97,238,193,138,165, 87,159,199, 15, 36,197,210,186,182,203, 13, 7, 79,203,216, 71, 57, 71,220,139,193, 42,164, 37, 41,
+193, 46, 18, 64, 35, 42,238,181,130, 71,107,181,206, 31, 87, 74,252,254,158, 18, 1, 92,235, 44,227,241,152, 56,144,249,125,145,
+ 23,132, 97, 72,158,127, 79,121, 95,116,207, 58,191, 43,230,188, 78, 28,232,251,210, 85,171,235, 82,138, 1, 13,249, 84, 42,112,
+219, 54,120, 81, 68,223, 55,228, 69,142, 66,145,101, 89,231,251,118,132, 81, 72,213, 97,105,139,186, 36, 54, 49,170, 22,127,127,
+221, 72,248,140, 82, 10,237, 60,148, 60,186,208,104,130,192,224, 92, 67,211, 56,194,126,216,193,189, 44,195,193,112,189,184,112,
+173, 35,234,138,139,162, 40, 8, 67,159,149, 46,133,112,253,185,234, 28, 78, 57, 60,132,190, 25,132,221,230,193,105,140,111,104,
+218,150,209,112, 72,107,155,245,238, 67,227,156,108,190,125, 31,139,235,198, 2, 66, 98,173, 10,137,171, 53, 90,147, 78, 38,120,
+ 61, 35, 27, 7, 45, 93,102, 31, 31,194, 0,227, 5,212,101, 73,235, 26,166,227, 9, 90,107,134,195, 1, 65, 24, 34, 84,188,150,
+ 64, 7, 40, 43, 96,154, 52, 21, 48, 80, 63,233,173,191,238,170,170,186,110,128, 80, 65,197, 13,213, 41,245,109,131,113, 14,198,
+227,137,192, 79, 20, 96, 12,214, 57,241, 94, 43,141,103,124, 92, 99,169,241, 36,173, 11, 67, 94, 84,132,158,134, 70,201, 73,106,
+ 60,234,172, 20, 63,163,175, 69,133,231, 28, 73,220, 67, 4, 24,208,182,142,198,214,248,129, 32, 12,135,253,152,213,201, 20,176,
+232, 36,160,182, 34,186, 67, 43, 73, 45, 67, 97, 77,194,120,117, 76, 16, 5,196, 97, 68,152, 68,184,212,226,180,135,175, 37,217,
+204, 54, 13, 70, 43,172,178,196, 81,130,117,142, 40, 14, 59,225, 91, 67,191,159,224,156,162,170,235,245, 7, 51, 74, 46,142, 34,
+ 47, 73,122, 61,112, 96, 91, 24,141, 70,100,133,132,209,107,173,177,109,195,234,202,152,182,109, 69,200, 87,148, 84,181,131,166,
+197, 79,122, 4,190,208,219,112,144,165, 5, 86,131, 14, 13,129,167,168,178,148,202, 51,148, 77,131,175, 4, 91, 59,157, 8,231,
+ 89,105, 81,110,250,129,207,120, 50, 33, 49, 1, 85,213, 80,219,134,178,172,187,234, 94,145, 21, 37, 97, 32, 42,203,201,116,138,
+250,190, 74,119, 58, 21, 52, 97,146, 36, 76,198, 99,218,182,233, 22, 82,153,245, 27, 95, 54, 66,206,201,142,222, 31, 6, 20, 69,
+ 6, 78,118,183,105,154, 18,133, 33,113, 34, 97, 21, 34, 54, 12, 40,171,162, 19,154,104, 60, 4, 74, 17, 70, 34,176,105,171, 22,
+144,155,123,210, 97,119,149, 18, 22, 1, 78, 90,117,173,149, 25, 87,175, 23, 51, 26,141, 40,138,138, 56, 14,240,140, 79, 93,151,
+164,121, 70,228, 75,190,112,213, 84,100, 89,129,171,107, 44, 80,150, 53,207,220,219,231,211, 7,125,220,184,198, 29, 63,139, 58,
+188, 7,106,203, 3,123,231,249,214,155,103, 73,107,120,242,193,157,204,110,222,196,215,190,115,138,143,253,192,126,222,121,238,
+ 36,195,126,136,171, 91,138,213,156, 97, 18,114, 43,171, 40, 90,135,106, 36,228, 97,211, 61, 31,134, 70, 58, 62, 73, 28, 51,205,
+ 51,142,117,129, 38, 96,249,228, 15, 60,197, 47,255,226, 63, 98,118, 52,194, 57,217,244,173, 45,188, 0, 85, 35, 26,130,157, 59,
+ 22,120,232,222, 67,156, 58,123,142,219, 75,203, 4, 65,192,220,236, 12,129, 49,212,141, 44,144, 0,215,110,221,226,189, 51,103,
+187,185,116, 79,236, 61, 85,141, 67, 82,179,180,238, 56,247,214,161, 74,137,148,245, 61,159, 61, 59, 22,249,196, 71, 62,204,252,
+166, 13,156, 57,119,145,162,168,216,181,125, 27, 81, 24,240,241, 39, 63, 72,150, 21,220,184,121,147,217, 14, 12,148, 68, 17, 51,
+195, 62, 73, 28, 73,118,182,115, 60,253,248, 35, 40, 99,152, 44,175,226, 80,220,119,247,157,220,123,247, 93,236, 90,220, 38,225,
+ 34, 14,156,115,148,117,205,120, 60,229,173,227,239,242,173, 87, 94,101, 60,249,158,247,251,129, 67, 7,249,216,147, 31,100,126,
+110, 6,215,182,140, 83, 81,251, 31,121,229, 85, 38, 89, 78,154,101,172,140, 39,108,217, 52, 71, 89,213,120, 74, 81,213,162, 13,
+ 88,187, 46, 38,211,148,231,190,253,242, 95,131,204, 20, 69,193,139,175,189, 73, 81, 86,252,131, 31, 95,100,207,142, 69,122,189,
+ 4, 47, 12,137, 64, 22, 35,223,112,123,121, 21, 63,240,121,243,173,147,188,125,236, 36,215,111,255,245,246,253,247, 31,195,126,
+159,237,243,155,120,252,225, 7,216, 48, 51,226,226,149,235, 24, 79, 80,199,121, 86,112,246,194, 69, 86,198,227,191,241,123,165,
+123, 5,179,163, 17,127,247,147, 31,227,224,174,237,124,224,192, 46, 86, 55,108,228,249, 54,230,252,220, 54,102,171, 2, 87, 23,
+120,241, 28,219, 54,111, 97,225,161,135, 88,122,247, 61,206,124,227,235,108,223,179,155,197, 39, 30,231,149,151,222,160,125, 83,
+227,187,136,227, 71,175,178,113,199, 22,246,253,104,193,227,132,252,235,155,142,119,142, 30,103,119,244, 41,102, 62, 50,224,138,
+154,208,183,138,241,119,134, 84,183,161,169, 20, 99, 59, 7, 87,119, 51,179,255, 38,249,155,111, 98,173,160, 69, 69,128, 85, 83,
+ 57,121,142,153,192,144,231,165, 44, 56,174, 69,107,221, 81,226,100,179,186, 58, 25, 75, 46,188,214,235,163,184, 36,233, 3,142,
+ 44,205, 8, 34,131,242, 20, 81, 18,130, 21,167, 82,168, 67,114,151,119,138,123,181,206, 51,239, 15,250, 88,219, 82, 84, 13,117,
+ 81,227,172, 40,182,227,158,184,144,252, 80, 18, 46,113,146,254,104,157,136,170, 39,227, 49,113, 44,128,162,186, 43,244,202,170,
+160,117, 14,219,180,248, 81, 72,209,217,246,178, 52,195,181, 45,241,104, 64, 93,213, 2,225, 25,196,208,202,184,208,243,124, 81,
+186, 43, 69,211, 56, 76, 96,161,155,197, 75,182,187,162,169,106,122,113, 66, 90,230, 20,101,177,222,214,247,125, 95, 92, 10,218,
+ 9, 12, 8,213, 85,203, 57,248,172,143, 57,140,241, 72,211, 41,244, 18, 89, 19,180, 20, 63, 77, 83,137, 72,206, 51,132, 97,199,
+ 26,241, 20, 85,209,144,150, 57,180, 50,227,174,242,156,214, 10, 3, 37,207, 36, 38, 86,105, 25, 51,103,121, 78, 24,134, 88,219,
+ 74,231,210,105,172, 45,241,181, 34, 79, 51,217, 20, 33, 74,119,107, 45,211, 78,247,211, 79,250,228,101, 78,145,101,120,221,104,
+206, 57, 71,221, 93, 3,189, 94,143,126, 95,136,118,147,233, 4,173, 20,198,248, 1, 2,121,209,221,204,213,145,244, 7, 2, 68,
+ 1,170, 74,252,144,158, 49,196,195, 17,121,158, 75,194, 79, 43, 57,183,182,181,208,214, 16,134, 4,190, 37,208, 62, 89, 81, 18,
+ 5,129, 88,101,170,138, 40,138,165, 98,119, 9, 85,219,160,149,164,209, 12,122, 73,183,123, 84,180,117,221,137,234, 34, 57,161,
+ 56,178, 92,170,216,170,168,104, 26,105,219, 40,235, 72,211, 28,175,219,181, 40,100, 99,129, 82,244,135,125, 17,227, 52, 13,253,
+129, 60,224,112,226,183, 86,158,248,254,162, 56, 98,154,102,212,121, 67, 20,137, 16, 77,121, 66, 83, 3, 69, 47,234,137,240,173,
+200,197, 62, 22,199, 76,179,156,172, 40,240,156, 8, 66,124, 95,230, 72,165,149,124,227, 56,138,209,166, 22,104, 75,235, 24,151,
+153,204,146, 0,215, 54, 84, 40, 84,145,227,180,194,214,150,209, 64,110,174, 60, 47,153, 25,205,118,113,167, 33,109,230,196,238,
+230, 27,130, 32, 32,137, 34, 89,176, 29,132,145, 88, 11, 1,180,145, 77, 19, 90, 9,118, 82,131, 23,196,180, 69, 70, 18,199, 24,
+207,195, 11,124,234,170, 97,208,139, 41,203,140, 50,203,197,223,216,141, 24,112, 98, 7,108,170,138, 40, 12,240,253,112,189,243,
+224,124, 17,233, 40, 79, 84,174,109,219,205,218, 92,189,206, 35, 22, 32,145,136,198,214,132, 57,189, 36, 1,165,164,253,213, 56,
+194, 88,145,244, 34,154,182, 37,233,199,164,147,150,166,106,152,148, 18, 1,107,173,240,223,215, 14,223, 40,126,226,240, 0, 74,
+ 80,182, 70, 61,118, 16, 87,183, 80,107, 54,110,236, 81,213,240, 99, 79, 29,192,205, 12,249,253, 47,191,129,110, 45,202,143, 65,
+ 41,246,223,177,145, 11, 39,174,226,183,142,242,230,152,155,211, 22, 19, 26, 92,149,177,233,254, 79,162,194, 30,174,173, 81,218,
+227,198,237, 37,190,242,252, 11,252,193, 23,255,140,170,170,152, 25, 13,249,192,125,135,168,154,134,105, 33,237, 99,180, 94,215,
+ 46, 56,231,104,218,134,178,170,249,230, 75,223,229, 87,255,239,223, 90,127,205, 79, 62,250, 16,255,244,231,127,134,189,187,118,
+176, 50,153, 82,228, 5,121, 85,178,109,126,158, 31,254,216, 83,252,200,199,127,128,198, 89, 86,199, 19,222, 62,249, 30, 23, 46,
+ 95,226,214,242,132,133,173,243,220,119,240, 78,102,134, 67,156, 21,245,176,117,112,238,202, 21,206, 95,190, 66,222, 85, 76, 70,
+195,201, 51,231,185,122,227, 6,151,175, 94, 99,255,238,157,242,112,112,150,172, 44, 56,122,226, 4, 95,248,218, 55, 56,115,254,
+ 2,187,183, 47,112,255,225, 67,236,220,190,192,205,155,183,176,214,177, 99,219, 22, 22,183,109,198,120,134,183, 79,190,135,209,
+134,133,173,155, 9,252, 0,237,160,223, 75,216,179,115,145, 95,251,157,179,220, 90, 94, 33,142, 99,118, 46, 72, 46,251,133,203,
+ 87,216,187,184,157, 52, 47, 49, 94,141,231,121, 76,242,130,203,215,174, 83, 86, 37,195, 94,159,127,253,207,255, 41, 73, 44,153,
+ 13, 85, 83,177, 58,158, 48,158, 76,153,102, 25,253, 78, 87,242,253,199,134,217, 89, 6,253, 30,113, 28,115,234,220, 5,126,253,
+119,254,128,166,174,248,204, 39, 62, 78, 8, 50, 39,116,142,153,217, 89,134,189, 27, 28,220,191,151, 52,207, 57,121,234, 52,127,
+245, 88,171, 92, 0, 70, 67,225, 83, 92,190,113,139, 23, 95,125,157,237, 91,182, 48,191,105,142,247,206,158, 5,103, 89, 92,216,
+ 70, 16, 4,108,217, 52,207,210,202,251, 23,246,109, 91,230, 25, 38, 9,147, 60,231,163, 31,120,132,159,253, 59,207,178,178, 97,
+196,231,147, 77, 76,129,102,105, 25,117,253,138, 36, 49,250, 50,174, 51,190,194,211, 62,219,239, 63,196,252,253,247,224,199, 9,
+239,189,124,132,247,222, 58,205,198,187,192, 87,150, 73,125,154,125, 15,111,229,122, 22,242,175,254, 80,241,157,175, 30, 97,235,
+190,207, 16, 71,154, 83,151, 83,110, 63, 95, 19, 14, 7,204, 60, 14, 55,223, 80, 84, 83,135,169, 27, 10,183,141,102,203, 65, 54,
+173,172,144,221,188,129, 87,251, 52,181,104, 94,148,210,212,186,146,182,174,214, 52,182, 33,233,197, 93,197,169, 1,233,250, 72,
+ 90, 91, 74,191,223,199, 83,154, 52,203, 80,128,211, 10, 95, 25,154,170, 33, 10, 34,113,214,180, 13, 89, 38,214,220,126,191, 71,
+235,164,248, 87, 90,198,152,181,171, 41,139,138,178, 46,193, 57,134,195,161,156, 56,235, 8,131,128,186,109,168,114, 69, 81, 21,
+221,134, 14,140, 9,208, 74, 83, 20, 85,247,239, 29, 69, 85, 18,135,226, 81,119,214, 10,174, 58, 48,100, 89, 70,210,143,208,202,
+144, 78, 83,217,156, 42,203,120, 37,197, 41,203,176, 47, 17,223,227,137,164, 40,246,226, 24,180,162,169, 27,170, 90,244, 31,101,
+167, 16, 47,170, 90,248, 31, 78,212,234,211,233, 84, 52, 59, 74, 49,236, 64, 77,147, 84,208,213,206,202, 38, 36, 48, 62,173, 3,
+223, 91, 67,179,214, 50,190,173, 21,129,145, 52,201,254, 64,146, 47,167,211,148, 40, 73, 8,180, 36,171, 69,126, 0,130,251,199,
+ 79,250, 52,174,193,211, 30,121, 41, 73,121, 10,136,251,125,250,253,190,116,135,181,237, 54, 5, 30,190,241, 0, 17, 12, 27, 63,
+164, 44,203,245, 78, 71,191,215,167,105, 43, 38,233,132, 48, 12,241,163, 8,103, 91,140, 31,208, 58, 65,181, 59, 16, 93, 86,167,
+ 77, 26, 13, 7,212,117,131,119,207,125,247,253,139, 56,233, 17,197, 49,113, 28,147,196, 9,126, 16,224,135, 1, 73, 24,225,148,
+ 39, 73, 55, 97,212,205, 7, 60, 66, 35,249,179,117,235,232, 69, 17, 69, 91, 11,211,187,133,170, 99, 6, 71,113,136, 67,230, 60,
+214, 89,166, 89, 23, 39, 26, 69, 40, 28, 85, 93, 17,134, 62,126, 16,128, 18,241,134,246, 52,101, 41,184, 63,249,176, 20,163,209,
+136,182,105,164, 29,106,165, 98,246, 59,113, 86, 47, 78,240,125,153, 65, 88, 43, 34, 44,173, 58, 6,113, 24,224,172,164,135, 85,
+181,100, 31,215, 77, 67, 93,203,207, 8,195,152,178,206,169,235, 6,156,163,169, 91, 1,207,216, 6,219,249,129, 21, 8,187,188,
+149, 92, 94, 63,240,233,245, 36, 91, 55,142, 67,162, 48,196, 58,105,145, 27, 35,243,246,182,150, 72,212,225,112, 64, 20,134,235,
+118, 10,227, 9, 73,201, 41,201, 32,110,172,235, 62,204,128, 40,142,100, 23,104,164,237, 35, 81,123, 98,249, 90, 67,178,134,129,
+112,232,109,107, 37,171, 89,203,236, 42,233,245, 48,218, 35, 79, 83,252,206,158, 87,183, 13, 14, 71, 47, 78,104,173, 84, 70,141,
+ 21,129,138, 85,130,163, 12,252,128, 52,205,104,155,150,166,149, 81, 73, 85,118,177,176,165, 32, 45,157,131,214,181,196, 65,140,
+ 67,117,154, 8,169, 72,139,172, 64,160, 63, 82,129,150, 85, 73,183,207, 88, 7, 54,104, 60, 17,116, 56,121,255,190,239, 19, 24,
+131,241,229,134,232, 37,201, 58,218,119, 52, 26,177,113,144,240,153,125, 62,241, 64,227,122, 17,147, 99, 87,249,214, 75, 23,216,
+ 65,134,142,123, 28,220, 49,224, 70, 1,255,249,249, 99, 68,105, 73,108, 32, 93, 78,185,120, 99, 74,210, 11,153, 95,156, 37,207,
+ 26, 86,202,138,113,217, 50, 51, 59, 96,121,218,114,248, 51,255, 77, 7,197,104,240, 60, 77, 18, 71,244,226,152,155,183,151, 56,
+127,229, 42,143, 62,120, 47, 31,249,192,163,236, 94,220,206,205,219, 75,244,146, 88,206, 99,211,118,239, 81, 54,182,189, 36,102,
+231,194, 54,180,242, 56,113,250, 52, 77,219,114,230,194, 69, 62,247,167, 95, 97,146,101,108,223,186,133,198, 89,112,142,170,150,
+196,188,188,172, 72,115,105,157,158,185,120,153,239,188,249, 54,175,188,121,148,227,167,206, 50,158, 78, 49,158, 88,213,218, 86,
+ 16,157, 90, 41, 86,199,171,156, 62,127,145,235,183,151,200,243,130,172, 44, 56,112,199, 46, 14,223,181,159,209,160,207,252,198,
+ 13,180,214,114,227,214,109, 78,158,185,192,123,167,207,146,230, 57,155, 55,110,228,209, 7,238,227,193,123,238,198, 83, 26,237,
+121,132, 97, 64, 89, 86,188,113,236, 4, 47,190,250, 6,199,222, 59,197,176,223, 99,227,134, 89,202,170,226,252,229,171, 92,185,
+118,157,149,241,132,155,183,151,176,206,113,239,193, 3, 60,251,177,167,121,248,222,123, 24,141, 6,132, 65, 64, 24,134,220, 94,
+ 90,166,105, 45, 87,174,223, 96,231,194, 54,126,242,111,125,138,205,155, 55,145,103, 5,173,109,169, 91,177,221,220, 92, 90,226,
+203,223,120,129, 63,123,238,235,220,252,190, 42,221, 24,195,198,217, 89, 62,249,244,147,252,202,255,240, 75,252,247,255,237,207,
+243,232,125,135,153, 25, 14,232,247,122,114,109,213, 13,101, 89, 49, 77, 83,130,192,103, 97,203,102,222, 59,123,158, 75, 87,175,
+177,210,233, 54,254,166,227,174, 61,123, 56,116, 96, 31,143,221,127, 15, 31,126,236, 17,230,102,103,208,218, 99, 97,235,102,254,
+225,255,244,191,114,253,250, 77,122, 73,204,181,155,183, 56,119,233,242,251,190,247,127,249,165,127,204,194,150,121, 62,241,196,
+163, 60,243,204, 71,121,185,213, 44, 31,254, 52, 89, 53,224,250,233,247,152, 92,189, 64, 48, 59, 79,163, 60, 26,103,152, 89,216,
+ 65,156, 68,180,117, 73,101,122,244,251,187, 9,195, 33,111,191,241, 29,178, 44,227,142,167,183, 16,239,158, 97,241,161,157,252,
+227,109,240,249, 63, 85,124,227, 79,126,135,141,243,119,242,211,191,178,147,207, 44, 42,150, 98,159,227, 47, 77,185, 92,252, 23,
+218,203,135,176, 62,168, 18, 84,110, 8,146,141, 48, 9,137,239,236,227,166,215,241, 42, 9, 91,241,187, 74,205, 40,143, 32, 12,
+ 8, 67,161,183, 9,139,221, 91, 23,209,149,101, 69, 93,139,248, 75,107,233,172,105, 45,217, 13,190,239, 19,132,210,166,173,107,
+169,100,139,188, 68, 41, 17,231,213,141,197, 89,249, 57,173,149,118,184,115,224,144,197,122,109,131, 27,135, 50, 66,173,234,154,
+182,105, 9,163, 8,167, 4, 24,213,212,178,169, 8, 67, 73, 82, 51,129, 47,213,112, 43, 63,215,247,125, 38,211, 41,109,219,116,
+ 54, 62,159, 56, 74,168,155, 22,165,133,108,231,105,143,178,200,177,173,216,190,202,188, 36, 73,228,217,155, 23, 37,206, 54, 56,
+229, 17, 69, 1, 56, 77, 83, 87, 24, 95, 52, 14, 97, 24,144,167, 41,182,109,137, 19,177,214, 74, 44,110, 42, 58, 31, 35, 54,109,
+223, 55,228, 89, 78, 85,213, 56,219,118,105,110,174,243,128,171, 14, 92,227, 81, 54,141, 36,178, 85,178,241, 41,171, 18,141,194,
+243, 3,242, 60,149,243, 93,214, 40, 45,150,234,186,110,136,195,136,181,140, 16,209, 24, 57,162,208, 16,134,129, 20,195, 78,126,
+ 79, 85, 10,126,220, 24,175, 43,172,100, 60, 37,233,124,226,163, 15, 2,129,159, 53, 29, 7, 65,206,121, 67, 93,201,243, 90,107,
+ 77, 24, 10,217, 83,123, 26,163, 61, 15,107,161,169,107,188,192, 16, 24,153,111, 7, 90,178,117, 93,219, 96,149,162, 72, 37, 17,
+109, 56,232,147,215, 37, 73, 24, 49, 28,244, 88, 89, 89, 37,240, 67,122,189,184,171,234, 26,166,211, 41,211,105,129,163, 5, 43,
+184,187, 32,148,139, 50,203, 51,172,131,126,175, 39,232, 82,207,208,212, 37,158, 31,162,252, 0,223, 15, 80,174, 37,203,133, 58,
+231, 25,205, 96,102, 22,156, 37,108, 91,198,227, 85,154,182,145,228, 49, 2, 52,154,162,170,112,109, 75,181, 42,150, 25,173,101,
+182,186, 70, 39, 11, 99, 1,159, 96, 1,173,105,173,224, 78,251,253, 33,158, 39, 86,177,170,174,232,247, 36, 65, 8, 31,166,153,
+204,102, 6,189, 1,211,116,140, 82, 66,134, 19,214,176,128, 31,164,253, 45,162,178,214,182, 12,131, 96,253, 65, 81, 87, 21, 77,
+ 43, 21, 71,221,138, 71, 61,142, 35, 18, 99,176,136, 79,113, 45,179, 56, 43, 74,140, 39, 55,223,200,151,246, 11, 8, 37,108, 13,
+114, 99,155,174,229, 21, 11, 77,168,168, 42,226, 94, 15,219, 54, 76, 38,171,224, 20,198, 51,148,174, 20, 50,159,231, 97,181,134,
+ 86,102, 61, 85, 93, 75,100,172, 82,221, 57,182,235,176,134,181,138,167,110,106,106,231, 72,162, 24,171, 44,211, 73, 42,226,187,
+200,209, 54, 53, 65, 32,249,237, 77,211, 16, 37, 33, 69, 86,146, 36, 66,172,234, 15,250,164,185, 92,100, 40,181, 62,139,175,170,
+138,208, 15, 73, 43, 73,175,147,202, 92, 51, 26,205,210,182, 45,177,103, 48, 61, 31,165, 53, 78,149,120, 90,227,148,199, 91, 95,
+ 59,206,201,115,203, 80,183,152,133, 24,183,115, 6,117, 41,224,171, 47,188,193, 92, 90,208,219, 62,139,239, 20, 87,110,143, 41,
+166, 21,231,207,220,100,219,194, 28,243,187, 54, 81,221,154,224, 95, 89,166, 31,107, 54,237,187,143,193,112, 68, 93, 8,214,215,
+ 2,199, 79,157,230,151,127,245,215,120,247,236, 57,230,102,236,159,167,254, 0, 0, 32, 0, 73, 68, 65, 84,102,152, 25, 14,169,
+218,134,255,253,183,126,135,127,255,187,159,227,115,191,254,191,177,123,251, 2,101,150, 97, 45,221, 56,195,112,225,226, 18,127,
+244,231, 95,229,237,119, 78,242,193,135,238,103,215,142,237, 60,114,248, 16,101, 89, 51,201,114,242, 60,199,212,102,125, 68,210,
+182,146,131,108,140, 97,154,103,124,251,187,175,241,226,171,111, 98, 60,205, 19, 15, 61,192,195,247,220,205,129, 59,118, 74, 55,
+170,174,200,203,146,107,183,110,145, 21, 21,227,201,148, 51,231, 46, 0,112,232,192, 94,154, 61,119, 48, 55, 59,195,166,141, 27,
+200,179,156,105, 94,240,238,217, 11, 92,188,116,133,214, 57,182,204,207,115,240,192, 62,118, 47, 46, 0,242, 96, 76,167, 37, 55,
+110,221, 34, 43, 10,182,204,111,228,228,153,115, 92,187,113,147,183, 78,190,203,236,112,196, 96,208,227,210,229, 43,252,171, 95,
+251, 77,138, 74,238, 29, 99, 12,199, 78,190,199,220,104,196,204,160,207,194,150,205,200,100, 78,174,145,115,151,175,176, 97,102,
+196,177,119, 79,179,121,227, 70,146, 56, 98, 56,232, 96, 83, 85,205,106,154,130,131,173,155,230,200,254,138, 85,204, 90,203,202,
+202, 10,223,120,241, 59,108,158,155,229, 39,158,253, 33,246,238,218, 9, 56, 17,236, 53, 66, 22, 67,193,242,202, 42,175,188,253,
+ 14,151,175, 94,231,141,163,199,222,151,207,254,253, 71, 18, 69,108, 95,216,194,222, 59,118,178,109,243, 60, 27,231,230, 40,203,
+146,171,215,111, 96,140,225,224,222,195,236,219,185,200, 31,124,233,207,184,177,116,155,183, 79,188,135, 68, 72, 57,118,109,223,
+206,120, 58,229,103,254,254, 79,176,124,249, 50,102,227, 54,142,247, 54,177, 57, 28,226,143, 20,223,250,227, 85,174,167, 23,208,
+233, 53,198,231, 7,164,201,132, 59,102,158, 97,223,174, 13, 44, 87,151, 41, 90,131,119,122, 59, 7, 63,158,113,161,136,217,251,
+192, 67,220,245,224,189,204,108,184,139,129,239,216,184,105,194,117, 23, 17,132, 62,115, 27,246,177,255,208, 94, 94,187,169,248,
+232,188,227,242, 88,115,251,124,192,210,202,117,220,150, 35, 28,250,133, 39,112,165, 99,238,181,128,233, 45, 32,216,207, 52,221,
+198,230, 31,127, 24, 83, 92,226,250,171, 47, 49,185,113,153,233,141, 91,232, 90, 2,103,234,166,193,243,188,174,197,174,161, 91,
+ 0, 36,134, 89, 84,209,161, 9,214,149,230, 65,232,227,106,104,202, 70,148,228, 93, 70, 71,210, 75,100,177,182,226,175, 22, 20,
+183, 66, 59,241,222,131, 0,171, 68, 52, 39, 72,215, 34, 47,136,147, 24, 17, 0,211,133,166,244,186, 34, 68,242, 34,138,170, 34,
+ 78, 36,212, 9, 11, 65, 20, 98, 43,217, 76, 40,232,212,228, 9, 32,214,105, 95, 27,226, 80,248, 13,203,203,203,180,173, 93,255,
+157,101, 91, 49,205, 38,244,226, 68, 70,131, 93, 49,144, 77,179,245, 54,116, 91,213, 32, 13, 82,188, 48, 18, 23, 84, 89, 33,169,
+105,194, 20, 88, 94, 94,198,247,253,117,242,168, 0,114, 20, 89, 62, 37,203,243,174,123, 41,160,155,178, 24,227,105, 1,102, 5,
+ 65,128, 69, 58,254,190,103, 72,211,148,192, 15,229,253,141, 39, 36, 73, 31,219, 52,132,129, 79,221, 10,190,183,223,239,119,227,
+103, 71,221,214,104,227, 81,150, 93, 58,157,246,112, 88,226, 94,132,173, 69, 24,232, 92,215,141,214, 62,174,182,223,123,134,150,
+ 37, 74, 1, 86,224,103,198,217,110, 28, 35,208,182,198, 90,166,147, 49, 14,186,238,158, 86,242, 13,120,228,121, 65, 27, 56,156,
+109,215, 37,243, 73,210,195,120,134,202,175,177,109, 67,158, 23, 24,227,201, 92, 38, 14,153, 25,141, 40, 43, 1,158,120, 90, 99,
+ 60,161,173, 85,101, 73,158,151, 40,164,151,227,105,205,196, 54,210,186,141,123,212,149,204, 90,171,202,162,181,194, 96,169, 17,
+207,157,103, 98,250, 38,194,104, 69,154, 23, 68, 81,136,167, 52,206, 73,154,149,107, 45, 14,249, 80,211,116, 74, 93, 87,244,227,
+ 4,165, 61,166,211, 20, 63, 8,152, 78,166,244,146,164,147,248, 75, 53,159,213, 57, 81, 24, 81,148, 37,198,215, 96, 91,106, 43,
+202,197, 32, 8,152,172,174,226,140, 71,224, 73, 16, 64, 81, 23,216,182,161,151,244,209,158,204,166,180,167,164,115, 16, 24, 80,
+146,245,187,166,206, 76,162, 72, 20,228, 70,210,229,130, 80, 22,104, 95, 27,194,153, 25,154,166,162, 44, 11,218, 86,102,142,113,
+175, 3,203, 20, 5, 45, 1,182,206,240,180,166,110, 44, 73, 18, 49, 24,244,112, 64,211, 52,152,208,224, 35,104, 65,103,101,230,
+189,186,178,130,109,133, 41,221,105,241, 64,201,200,100, 52,136,200,211, 12,227,121, 4, 81, 76, 24, 39,212,117,141, 86, 96, 29,
+ 2, 45,112,142, 36,142,201,242, 92, 84,254,173,195,118,200,198, 73, 58, 1, 52, 78, 43, 92, 55,111,178, 86,224, 58, 0,202, 58,
+250,125,217, 96,104, 45,193, 59,161,239,131, 47,246,184, 53, 11,161, 50, 34,192,140,130,132,186,173,208,158, 33,240, 58, 66, 97,
+145, 73,184, 67, 45, 16,138,251,246, 39, 36, 27,124,138, 83,215, 56,118,226, 58,123, 54,207, 49, 41,115,152,233,163, 90,205, 31,
+ 30, 57,201, 48,203,137, 54,246,241, 35,159,219, 55, 38,172, 76, 27,102,251, 49, 54,212, 84, 78,115,250,204, 13,206, 46,165, 88,
+173, 88, 94, 77,217,241,204,135, 4,163,232,186, 86, 85,219,178,101,227, 70,254,217, 63,252, 57,137, 87,125,238,121, 62,241,225,
+ 39,248,236, 23,191,194, 87,159,255, 22, 0,255,242,255,252, 13,126,238, 39,255, 14, 59,182,110,145,138,161, 42,153, 9,135,108,
+216, 48,203,249,139, 87, 57,115,233, 10,198, 24,246,239,222,197,198,217, 57,130,192,144,151,117,215,129, 18, 50,148, 69,146,168,
+ 60,227, 49, 55, 26,242,221,183,143,242,230,177,147, 52, 77,195,142,133,237,108,223,182,133,214,201,188,116,109,142,230,172, 99,
+195,204, 44,158, 82,160, 44,253, 94,194,165,107, 55,120,230,169, 39,249,216, 19,143, 97,173,165,108,106,202,186, 33, 10, 2,230,
+ 55,204, 81, 54, 53,179,195, 1, 15, 29, 62,196,129,189,187,217,181,125, 27, 85,213,144, 23, 34, 80,171,155,154, 99,175,156,230,
+245,163, 39,248,224,195,247,243,147,127,235, 83,220, 94, 94,166,177, 13,131,126,143, 93,139,219,185,239,208, 1, 94,122,237, 45,
+ 54,111,216,192,189, 7, 15,240,161, 15, 60,204,227, 15,220, 71, 20, 6,152,142,192,232, 27,143, 13,115,179,108,153,223,196, 83,
+143, 61,194,155,199, 78,178, 58,158,176, 60,158,224,251, 62,198, 24,209, 10,164,240,159, 62,255, 37,158, 59,242,226,186, 18, 31,
+196, 93,114,255,221,119,115,232,206,189,236,219,181, 19, 20, 92,186,118,189,219, 52,200,136,199,120,154,178,110,184,126,243, 22,
+ 75,203, 43, 44, 45,173,240,155,127,240, 71,127, 45,167,254,251,143,162,170,100,227,233, 16, 39, 72, 20,178, 58, 73, 73,243,146,
+ 23, 94,125,137, 81,127,192,167, 63,250, 17, 94,120,229, 53,254,242,200,203,239,251,222,197,133,173, 44,110,157, 7,107,137, 3,
+143, 42,190,131,219,103, 87,152,185, 39,166, 88,133,235,231,222,230,102,117,137,213,201, 53,226,180,160, 63,220,195, 29, 63,181,
+ 5, 46, 67,154, 40,170, 19,139,252,236,179, 13,155, 93,204, 11, 55, 45, 85, 54, 33,153,124, 16,127,139, 99,113, 62,229, 49, 55,
+224, 13, 82,236,109,159, 7, 62,112, 47,143, 60,171,248,141,255,241,109,254,249, 63,185,135, 75,159,203, 89,186,254, 50,151, 79,
+191,205,227, 31,254, 69, 6,198, 81, 84,142,229, 59,110, 49, 77, 94, 39,186,242, 36, 91, 54,247,112, 87, 6,108,123,100, 27,135,
+ 30,126,132,218,203, 88,201, 13, 55,191, 62,230,242,197, 63,230,218, 11, 95,135, 78,159, 83, 85,149,136, 52,181,250,222, 88,194,
+ 9, 5,210,247, 12, 74,105, 60,207,199,170, 6, 29,200,104,169,174, 91, 60, 79,244, 83, 40,141,179,205,186,199, 92, 41,105,203,
+107,221,141,228,112, 20,117, 5,173,165,181, 45,190,246,201,203, 18,221,117,165,124,223,103,220,233, 21,180,146,116,182,178, 20,
+176, 83,232, 7, 56, 7,190, 31,128,103,168,203,138, 97,127, 8, 90, 73,101,236, 68,103,132,150,215,107,180, 65,107, 1,225,136,
+194,188,179,190,213, 13,211,102,130,111, 2,130,126,178,238,194, 41,170, 66,232,112, 72,107,222,181, 45,216, 26, 77,208, 97, 99,
+ 13,227,110,156,108,173,165,182,130,109,181,206, 82,149, 53,189,164, 71, 28,198,228,121,134,179,150, 48,138,164,155, 8, 88,219,
+ 74, 87, 36, 8, 41,112,120, 90, 8,161, 94,173, 41,235, 18, 47,208,244,147, 30,121, 93,200,134,165, 75,176,212,161,150, 44, 17,
+211, 85,209,168,174,107,171,104,202,146,198, 85,132,113,136,175, 13,141,146, 49,182, 84,240,150,178, 40, 4, 50,230, 37, 34,160,
+ 51, 94,247, 12,115,216,166, 6,231, 48,158,196, 87,123,218,116, 5,171,216,202, 81, 10,111,239,254,125,255, 34, 12,101,174, 46,
+105,101, 25,117, 35,190, 63,153, 55, 43, 64,110,106,173, 61, 2,223,199,243, 60,129,111, 84, 53,198,120,120,158,161,169,107,180,
+ 82, 40,237,161, 65,102,175, 64,212, 19,196,105, 11, 52, 77,141,181, 22,227,251,164,185,168,250,228,203,147,106, 91,105, 76,224,
+ 83, 21,165, 16,163, 20, 18,118,225, 32, 43,114,178, 52,147,202, 95, 41,134,163, 1, 56,228,131,104, 45,226,183,119, 29,225, 77,
+ 22,184,166,181,210, 18,214, 2,238,215, 40,252, 48, 88,111,249, 55,141, 21, 63,162,146,174,158,181,150,108, 42,177,135,217,100,
+ 66, 83,215,194,170, 47, 75,170,170, 38, 10, 67,176,194, 94,110,173, 69, 89, 81, 71,135, 97, 72, 16, 5,100,211,156,166,169,169,
+234, 26, 63, 8,145, 76,117,211,109,144, 20,158, 9, 48,198, 35, 8, 34,180, 22,218, 94, 58, 77, 49,126,136,117,173,160, 18,173,
+235,198, 17,136,176, 14,153,227, 87,101,133, 82,144,117, 96,156,182,109, 40,243, 2, 79, 9,220, 38, 10, 67,208, 2,245,175,171,
+138, 40,138, 8,194, 16,207, 8, 27,216,235, 58, 47,214, 58, 81, 78,123,158, 8,107,148, 19,226,149,239, 19, 4,226,183,151, 44,
+243,150, 56, 78,208, 74, 34, 65, 91,219,210, 54,210,110, 15,140, 33, 8, 66,202,166,150, 7,183, 82, 52, 77,139,223, 93,252, 97,
+ 20, 18, 4, 17, 65, 20, 33, 54, 60, 89,192,227, 40,166, 42, 75,154, 86,124,238,198, 23,120,134,103,124,158,186, 51,228,191,251,
+144, 38,246, 13, 95,125,238, 56, 56,197,249,113,206, 93,243, 1,243,143, 30,224,246,235,231, 57,122,252, 10, 27, 3,104, 26, 15,
+ 47, 50,220, 94,173, 89, 45,107,140,118,132, 90,145, 27,195, 40, 54, 56, 20, 65,219,176,229,192,125,108, 57,252,145,117,207,232,
+154, 45, 81,107,205,177,247, 78,241, 91,127,248,121,138,170, 98,227,204, 12,175,189,125,148,149, 78, 21, 61, 73, 83, 4,142, 35,
+115,175,192,247, 89,238, 44,100, 87,174, 95,167,181,150, 93,139,219, 57,124,240, 0,115,179, 35,105,205,181, 22,112,216, 86, 68,
+ 49,107, 26,131, 45,155, 54,177,113,118,134,188, 40,185,116,245, 10, 23,174, 92, 99,105,101,149, 73,154,242, 19, 63,252, 73, 54,
+109,152, 19,177,101,215,246, 11, 3,195,120,154,113,233,202,117,222, 60,246, 46,215,110,221,224,205, 99, 39,185,120,245, 26,253,
+ 36, 34, 12, 66,154,182, 97, 52, 26,114,245,198, 13,142,189,123,138,155,203, 43,204,205,140,184,231,192,126,182,109,222,132,214,
+154,149,241,132,223,254,220,127,230,247,254,228,207, 24, 79,166,132,161,207,173,219, 75,204,204,140,120,244,222,123,152, 25,142,
+ 56,115,254, 2,127,242,213,231, 88,157,140,217, 56, 59, 75,191,151, 16, 70, 33,179,163, 33,155,231, 55,144,196, 17, 81,224, 19,
+199, 33,253, 68,240,184,158, 39,144,166, 29,219,183,177,115, 97, 43, 81, 24,178,180,188,194, 36,205, 88, 90, 94,101,101, 60,102,
+247,226,118, 94,125,235, 40,227,169,184, 3, 0,154,182,229,198,173, 91, 44,110,219,202,135, 30,125,152,125, 59, 23,217,180, 97,
+110,189, 3,176, 54,139,181,173, 48,201, 79,159,191,200,107,239, 28,103, 58, 77,185,245, 87,132,118,107,199,236,112,192,211, 31,
+124,156,195,119,238,229,142,197,237,204,140,134, 84,117,205,229,235, 55, 24,245,251, 92,186,122,149,255,249,223,254, 59,130, 64,
+236, 71,223,255,122, 0,158,126,236, 17, 62,252,129, 71,233, 5, 1,215,111,222,228,187,167,110,242,226,242,121, 14,126,224, 46,
+222,250, 2, 92, 56,119,132,213, 43,215,113,166,166, 88, 46,217,186,240, 9,126,234,231,103, 56,115,198,227,230,137,156, 45, 11,
+ 35,146,197,130, 23,111, 5,124,249,207,255,128, 81,188,136,190, 60,207,230, 3,138,197,216,178, 9,195, 91, 85,192,241,175, 57,
+142,124,251,119, 72,212, 3,156, 63,113,139,252,202, 60, 55, 47,124,147,115,239,252, 62,129, 63,226,161, 39,127,144,251, 14, 59,
+254,246,156,230, 68,157,112,229,155, 83,198,225, 95,144,212, 15, 48, 24, 57,130,173,160, 43, 72, 92,192,246, 97,198,204,157, 3,
+194,244, 17,184,107, 51,171,167,143, 82,230,185,220,147, 81, 72, 91,181,235,207,229,178,170,104, 91, 75,156, 68, 20,181,224, 89,
+ 3,223,144,165, 5,101, 33,207, 42, 17, 1,247, 48,158, 71, 89, 87, 4,126,176,142,237,182, 86, 42, 66,207, 51,107,109, 93,162,
+ 36, 70,107, 79, 52, 80,202,129, 18, 93,142,131,174,147, 40,182,202,178, 20, 12,170, 31,248,228,185, 96, 85,141,231, 73,156,116,
+ 43,246,191,178, 20, 14,123,107, 91,170,186,164, 42,228, 62, 82, 74,194,195,130,110,236, 19,134, 33,190,231, 17, 39,146,148,215,
+ 90, 1,116, 89,219, 16,116,248, 92,227,203,189, 90,215, 13, 89,145,209,212,109, 55, 62,148, 48, 44, 79,203,151,241, 12, 85, 85,
+ 83, 87,194,164,151,156,117, 89, 99,250,189,132,178, 18,239,127,211,141, 9,202,170, 20,183, 76,183,182, 85,107, 8,104, 68, 88,
+ 46,209,208, 5,129, 31,210,116,186,176,186,110,169,203, 18, 99,124,240,196, 34,103, 29, 20,101, 78, 81,148, 98,217,179,150,186,
+145, 77,147,164,195,149, 56, 37, 93,128,186,145, 77, 82, 81,100,157,150, 76,200,170,107, 0, 29,112, 52,173,188,191,181,177,134,
+179,174,203, 91,119, 24,231,196,195,220, 84, 13, 24, 81,115,199, 81, 76, 99,107, 36,210,173,160,106, 82,226, 56,166,202,115, 82,
+235, 48,218, 35, 8,101, 7,159,165, 41, 81, 28,225,112,221,236, 81,230, 0, 81, 20, 19, 6, 62,147, 60, 23,171,153,167,112, 86,
+201,191, 43, 43,234,186, 97,101,105, 5, 63, 8, 58,206,118,139,194, 80,230, 5, 74,105,218,170,198,196, 17, 81, 28,227,154,150,
+ 64,251,232, 72,209, 90, 65,247,161, 28,171,227, 85,226, 40, 34,207, 82,226, 40, 36, 8,101,198,174, 60, 77, 23, 20,135, 66, 84,
+213, 86, 1,198, 48, 77,167,248,158, 68,238,181,101,138,211,242, 48, 25,175, 44,211, 32, 11,106,155, 73, 4, 44, 97, 68, 28, 4,
+ 98, 85, 42, 75,105,179,244, 19, 60, 45, 40, 71, 19, 26, 60, 79,194, 38, 66, 47, 18,234,143, 51,114, 62,235,154,186,177, 68,161,
+135,242, 36,101, 73,135,178,232,218,198,225,249, 6,219,200, 76, 43,240, 61,138,178, 34,203,228, 3,138, 66,241, 60,130,216, 78,
+202,178, 68,121, 74, 40, 90, 26, 92, 43, 80, 26,173,165,229, 38,155, 8,153, 99,151,157,237,111, 50,153, 48, 24,141, 40,202,130,
+178,168,240,194,128, 94, 24,172,183,252,203,178,196, 51, 62,190,245,240, 60,153,121, 37,113, 68,145, 78,137,194,176, 91,192, 11,
+146, 36,166, 41, 42, 90,235,136,251,162,173,200,178, 9, 69, 85,202, 92,188, 63,192, 83,128, 54,221, 69, 86,211,235,197,148, 77,
+ 69,211, 74,199, 97, 50,153,162,208, 20,121, 65, 20,135,164,105, 78,165, 21,158, 39,237,189, 79, 31,242,249,133, 39,123,152,178,
+193, 93,158, 80,174,230,220,182,138,220, 58,252, 34, 7,101,120,238,173,203,236,223,187,153, 91,167,174,163, 76,133,201,125, 86,
+243,146, 32, 14,152,150, 53,123,119,207,179, 82,228, 52,105,203,230,166, 38, 83,150, 98,120, 7,101,211,174,223,160, 69, 5, 75,
+ 43, 43,252,250,255,243, 89,190,246,194, 17,108,235,248,165,159,255, 25,110, 45, 45,173,243,191, 55,111,216,192,207,254,237, 31,
+230,201,199, 62,192, 90,216, 77,222,117,157, 78,158, 57,203,238,197, 5,158,249,200,147,108,155,223, 72, 89, 73,154,149, 66, 9,
+205, 79,119,194, 80, 34,226, 36,198, 57,199, 95, 30,121,137,223,252,253, 63,124, 95,251,184,159,244,248,244,211, 31,102,126,211,
+ 70,138, 92,108,101,158,241,240,181,168,226,171,170,226,202,245, 27, 92,189,113,157,186,105,177,182, 32,240,125,241,110,231, 57,
+243, 27,230, 88, 94, 89,229,115,255,229,207, 5,122, 17, 4, 60,243,228, 7,185,123,255, 30, 86,198, 99,110,175,172,114,244,196,
+ 41,254,222,179,159,102,199,194, 54,190,248, 23,223,224,174,189,187,121,246,227, 79,179,119,215, 46, 17,177,245,250,244,250, 61,
+250,253, 62,183,142,173,112,245,214, 45, 14,223,121,128,249, 13, 93,200, 76,215, 77,242,125,159,192,243,201,202, 92, 90,134,206,
+201,140,208,186,117, 84,105,175,215, 99,121,101,149,179, 23, 47,243,250, 59,199,249,194, 87,159,235, 70, 72,239, 63,170,186,225,
+181,119,142,243, 35, 63,248, 81,130,112, 35,170,187, 22,229,162,182,212,133,248,134,211, 44,103, 97,235, 86, 14,223,185,143,119,
+ 78,190,139, 66,227,248,235, 63,111,121, 60,225, 47,143,124,155,199, 31,124,128,221,139,139, 68, 65,192,210,234,152,125,187,119,
+114,226,189, 83,156,191,116,133, 48, 12,249,211,231,158, 95,255,158,181, 42,246,142, 29,210, 45,153,223, 48,199,107, 71,143, 49,
+ 23, 7,156,189,117,129,228,145,199,185, 49, 86, 92,184,240, 22,109, 53,166,113,224,150, 3,218,122,202,236,142, 59,113,206,242,
+234,183, 53,126,127,150,221,251,224,220,106,194,159,127,247,235,120,109,203,244,245, 1,225,162, 98, 9,199, 55, 47,135, 60,127,
+ 74,145, 21, 16, 13, 28,161,222,195,135,127,162,230,199,126,124, 47,158, 43,249, 55,255,230, 7,176,211, 11, 60,242,212,207,242,
+157,111, 95,225,230,242, 2,230,167,115, 86,142, 68, 92,187,152, 51, 45, 94,163,127,215, 39, 57,244, 67,155, 9,135, 22,223,105,
+174, 76,225,141, 47, 14,216,242, 36, 18,254,114,226, 48,131,195, 31,225,198,145, 47, 48,205, 51,162, 32, 34,140,100, 46,235, 5,
+ 30,137,150, 57,123, 81, 86,180, 77,131,135, 56, 18, 80,170,211, 31, 9,150,212, 57,233, 90,235,174,120,176, 8, 66,217, 40,113,
+ 66, 57, 44,158,246,137, 34,137,105, 45,154,150, 56, 73,186,133,197, 82,215,210,114, 14,253,128, 52,157,210, 27, 12,200,166, 83,
+217,172,106,141,115, 74, 10,163,166,193,181,178, 72, 77,107,209, 3,137,200, 11,154,218, 18,132,210, 81,144,133,202, 18,245, 18,
+148,147, 8,219,194, 73, 18, 90,127, 40,177,216,158, 18,235, 89, 93,137, 53, 51, 8, 2, 4,185,161,232, 69, 9,121, 41,130,222,
+170,150, 14,179,115, 22,207, 51, 56,165, 8,219, 0,133,232,184,122,253, 24,109,181,184,123,154, 46,100,203, 90,214,232,120,190,
+239,147, 21, 21,198,200,184,181,177, 45,218,122,196,113, 8, 4,212,117, 43,254,126, 11,131,209,144,186,172,137, 34,161,157,102,
+133,184, 8, 42,223,163,159,244,165,170,142, 68, 39,165,148,140,186,148, 82, 20,133, 20, 74,117, 93, 19,154, 16,235, 42,104,165,
+ 91, 34,175, 33,236,186,121,226, 26,104, 1,231,106,172,149, 77, 48, 40,122,113,140,246, 20, 85, 85, 99, 36,144, 68, 22, 73,223,
+211, 56, 35, 39,171, 45, 37,176, 35,232, 90, 90,121,158,203, 9,178, 22,167,228, 33,166, 61,141, 78, 34,166,147, 9,214, 58, 81,
+ 45,218, 64, 36,251, 26,156,115, 36, 78,145,217,169,156, 44, 44,211, 52, 19,116, 96, 35, 59, 46,207,182,172,174, 78,240, 60,176,
+ 90,211,214,130,167,212, 74, 54, 12,113, 24,177, 58, 94,149, 54,120, 47,193, 15, 60,156,114,184,214, 18,134,134, 52,157, 98, 60,
+ 77, 20,199,224,105, 60,227,201,204,162, 19,116,161, 4,189,231, 33, 90, 1, 15,225,104,219,182, 38,238, 37, 84,117, 69,150,166,
+180,109, 67,191,215, 35,205,115, 90, 5, 58,140,113,109, 67, 86,228, 36, 97,136, 53,190, 88,150,166, 41,218,211, 12,251, 67, 26,
+107,177,182, 37,207, 11,172,149,132, 34,165, 52, 70,139, 95, 82, 18,209,114,241,141, 55, 13, 85,215,142,244, 60, 33, 6, 57,103,
+ 73,162,144,166,173,113, 86,253,191,116,189,105,144,109,215,117,223,247,219,195, 25,239,208,195,235, 55,227,205,120,120,120, 32,
+230, 65, 36, 72,129,164, 72,112,176, 68,217,148,104,201,146,101,121, 72,108,203,178, 29,219,149,148,237,138,171, 18, 59,223,146,
+170, 72,174,138,203,169, 74,148,196,150, 83, 82, 85,108, 41, 17, 21, 90,164, 68, 74, 36, 1,129, 34, 1,130, 36, 72, 98,198,155,
+199,158,187,239,189,231,158,113,239,157, 15,235,116,147, 80,228,141,111, 0,222,235,211,247,238,179,247, 90,255,245, 31, 36,240,
+ 68,201,152, 42,205,115,172,210, 72, 60,171,167,170,107, 26,223, 96,181, 37,138, 4,225, 80, 58, 48,155,206,122, 98,161, 48,202,
+149, 82, 2,139, 43, 35, 23,115, 89,225,188,199, 85, 30, 87,215,125,245, 45,222,236, 70, 43,130, 14,212, 77,133, 53,166,239,152,
+ 64, 5, 48,198, 50,234,165,125,198, 72, 5,232,189,199,104, 9,212,145, 78, 95, 33, 57,190,154, 60, 19, 18,160,233,139, 15, 19,
+ 69,208, 19,233,210, 52, 65, 41,129,232,157, 23, 3,163,186, 46, 49, 70,113,246,200,128,191,243, 76,130,221,109,241,219, 37,111,
+ 93, 95, 99,176, 52,230,218,205,109,150,134, 9, 7, 22, 45, 91,175,222, 64,117,158,163, 71,199, 52, 77,203,238,237,109,166,119,
+ 39,116, 88, 6, 70, 83, 18,136, 18,195,217,165, 21, 94,127,241, 18,102, 16,179,123,224, 20,199,143,158,101, 86,204,176, 10,162,
+ 8,188,239,200,210,132, 79,127,252,163,172,111,110,113,251,238, 93,202,186,102,125,107, 91, 2, 89,108,196, 99, 15, 93, 36, 78,
+ 83,102,243, 25,227,193, 16, 19, 25,210, 36,230,224,210, 18,247,159, 59,221,135,114,204,153,151,226,127,160, 16, 98, 96,154,136,
+ 23,184,213, 26, 23,137,135,247,230,238,148,166,109,184,112,246, 12, 85,213,114,119, 99, 93, 46, 21, 60, 95,254,250, 75,220,115,
+236, 24,247,223,123, 86,186,213,190, 51,234,186,142,237,201,116,127, 94,218,118,142,189,100,182,227, 71, 14,179,184,180, 72, 62,
+200, 49, 81,196,211,143, 63,194, 91, 87,174,209,180, 45, 75,139, 11,136, 79,120,198,160,237, 40,171,146, 95,248, 71,255,152, 44,
+201,120,223, 99,143,226,188,231,185,111,188, 76,211,118, 92, 56,119,134,170,156,243,218,155,239,128,247,172, 28, 88,166,106, 26,
+ 30,186,239, 60, 63,251,147,159,164, 40, 74,146, 68, 52,201,206,121,202,166, 17, 40, 87,201,243, 57, 31,164,203,170, 43,150, 22,
+ 22, 24,143,134,228,105,202, 27,239, 92,102, 50,157,252,153, 23,250,242,210, 34, 63,253,201,103, 57,113,244, 48, 75, 11,226,175,
+176,103,232,177,191,180, 24,173, 88, 99,121,245,205, 87,249,234,159,188,200,198,246, 14, 74,201,193,255,195,235,200,193, 21,254,
+230,207,255, 69,206,156, 60,129,107, 91, 22,151, 22, 5, 33,172, 42,254,251,255,249,127,227,163,239,127, 47, 85,221,188,203, 78,
+246,145,139, 23, 56,123,250, 4, 95,127,249, 21, 62,242,163,239, 99,105, 97,129,170,169,184,117,231, 14,225,192, 50, 85,108, 57,
+249,192, 99,220,124,110, 27,127,240, 45,166,107,219,152,131, 16,214, 98,162, 67,129, 60, 74,248,226, 38, 76, 55,239,112,252,248,
+ 81, 54, 94, 9,184, 54, 48,187,123,133,232,198, 33,218, 3,199,209, 63, 6,187,141,166,250, 58,204, 87, 97,180, 28, 56,254,144,
+230,131,139, 31, 38, 43, 20,135,114,199,151,148,231,196, 89,207,112,241,199,121,252, 49, 56,242,179, 71,249,236, 63,251, 42,223,
+127,105,136,171,238,112,245,157, 63,162,173,214,248,248, 95, 56,204,169, 3, 5, 47, 62,151,209,181,158,174, 82, 92,250,126,193,
+119, 95,105, 56,186,184,196,234,205,107, 76,231,150,209, 61,103,153, 95,121, 11,231, 90, 58,239, 72,140,197,117,242,158,169, 16,
+176,113, 34,104,146,247,168,214,245,193, 73, 14, 27, 89,130,243, 52,206,227, 58,137, 6,173,170, 82, 46,217,121,199,112, 48, 36,
+210,134,214, 59,130,243,189, 38, 92,147, 70,162,181, 54, 73,132, 82,150,209,200,176,187,187, 75,221, 54,104, 37, 81,181,251,228,
+ 45,192,198, 34, 43, 12, 4,108, 44, 74, 15,173, 21,109,235,169,234,134,209,112, 72,100, 34, 26,215,208,214, 53,105, 38, 26,245,
+170, 44, 25, 12, 7, 4, 45,179,255,170,106,177, 90,216,242,132,192, 96, 56, 32,137, 98,196,182,186, 4,148,240, 6,130, 5, 20,
+ 40, 77,146,166, 24,163,152, 79, 69, 54,102,148, 33, 30,198,125, 97, 35,200,157, 15, 14,109, 20,243, 89,205, 32,150, 78,190,115,
+146,235,110,140,140,236,116, 36,161,100,131,124, 64,213, 54, 20,197, 28,109, 52,105, 18,227, 90,133,141,117,223,177, 11,175,170,
+169, 91,242, 60,239, 11, 16,225, 61,236,201,140,181, 22, 31,126, 29, 25, 92, 39,129,106,173, 10,164, 89,202,188, 42, 48, 38,222,
+ 63, 55,189,247,132,224,153,207, 11,130, 7, 27,217,253,145, 24, 40, 42, 47, 77, 65, 27,199,104,196,184,199,118, 93,199,116, 50,
+193,216, 8, 71,197, 48, 31, 72, 11,111, 20,181,119, 88, 45,115,220,186,174, 24,228, 25,222,119,148,101,141,107, 27,188, 55, 40,
+133,204,106,123,120, 35, 24, 69, 93, 75,229, 84,215, 21, 90,107, 70, 11,139, 66,244, 10, 18,183,105,227,152,166,243, 24,231,136,
+109, 66,211,181,100,217,144,166,109,232,130, 36, 25, 25,173, 73,210, 12, 31, 58,188,151,234,110, 58,157,146, 36,146,197,174, 67,
+ 32, 74,196, 65, 40, 31, 12,105,187, 26, 67,134,235,101, 87,249, 96, 68, 83, 86,232, 40,238,245,129, 66,251, 87,253, 7,107,180,
+ 92,122, 93,221, 80,206, 69,243,173,181,194, 40, 41, 46,242, 52, 70,233,148,198,181,148,101, 69, 8,134, 36, 77, 36,122,176,243,
+ 76, 11,209,244, 70, 81, 76,232, 28,229,238, 46,117,156, 16, 69, 9,249, 64,170,223, 98, 62, 71, 43, 69,146,101,184,186, 6,239,
+105,157,167,235,154,253,131, 79,245, 7,142, 2,140,181, 12, 7, 3,102,197,156,224,107,177,127,236,132,104,101,172, 64,230, 33,
+ 4, 90,215,225, 59,113,153,202,178, 62,198,208, 90,138, 98, 66,154,100, 88, 19, 51,111, 42,178, 56,198,121,177,132, 36, 72,124,
+104,240,161,127,110,241, 18, 46, 10, 33,176,165,195,124,191, 11,171,145,151, 82,245, 27, 95, 27, 67, 89,139, 5,112,232,159, 86,
+ 43, 49,136,208,157,252, 62,243, 89, 65, 54, 28, 80,245, 30,251,198,187,222, 39, 95,162,105,235,222,149, 46,138, 98,148, 53, 68,
+ 81, 78,219,212,188,255,180,194,214, 17,171, 47,190,194, 92,107,166, 62,162,242, 29, 7, 6, 9,247,173,164, 44, 61,124,154, 23,
+191,189, 74,186,144,113,227,218, 58,199, 79,172,176,180,178,200,183, 95,189,142, 41, 91,102, 69, 1,145,124, 6,151,175,175, 67,
+100,240,109,195,142, 30,113,122, 56,166, 42, 10,136, 45, 93, 39,133, 73, 49, 47,249,194, 87,158,163,152, 21,124,232,233,247, 18,
+188,227,238,218,198,190,255,247,238,100,202,194,104, 68,158,230, 68,113, 36, 99,135,190,187, 64, 65,211,116, 84, 77,131, 11, 30,
+ 29, 2,202, 72,177, 24, 16,153,166,214,208, 57,113,100,244,174, 99,123,119,151, 87,222,124,155,187, 27,235,242, 46, 12, 7,156,
+185,231, 56,127,253,103, 62,205,125,231,206,202, 69,238, 58, 57,131,144, 68,181,213,245, 13,238,172,173,239, 63,211,120, 56,100,
+117,107,139, 71,147,251, 69, 42,170, 68,101, 48,153, 21, 92,186,122,157, 15,189,255, 41, 86,150,151,105, 93,199,214,246, 14,215,
+110,223,225,232,225,195,252,210, 47,252, 60,191,249, 59,159,227, 27,175,188,194, 63,253,229,191,197,251, 30,123, 88,100,162, 62,
+ 48,153, 21,108,239,238,242,219, 95,248, 18, 90,193,131,247,221,199,104, 56,224,238,218, 70, 63, 18, 49, 61,209,175, 69,181, 10,
+109,251, 16, 30, 37, 6, 39, 87,111,222,230,243, 95,254, 42,111, 92,190,202, 48,207, 57,118,228, 16,127,244,194,215,185,187,246,
+ 3,171,218, 31, 94, 91,219, 59,252,223,159,255, 18,191,252, 87,127,158, 44,205,136,163,104, 95, 25,178, 55, 51, 13,109,203,238,
+172,224,214,157, 85, 14, 44, 45, 48, 24, 14,216,216,252, 65,172, 43,252,160,211, 62,188,114,128, 51,247, 28,231,252,233,147,196,
+177,252, 93,151,174,221, 96,117,109,157, 44,142,248,149,255,245,223,160,181, 24,114, 52, 77, 47,123,234, 28,159,250,232,143,145,
+218,136, 43,215,110,240,208,125,231,185,126,251, 46,163, 60,195, 25,131,125,252,125,140, 22,199,108, 47,124,147,225,204, 51, 88,
+206,176, 85,142, 95,212,196,117,204,202,145,192, 3, 43,129, 75, 71, 69,110,151,168,148, 86, 37,148,211,134, 98,109, 11,123,208,
+ 82,188,160,152, 60, 24,152,151,146, 47,145,220,147,243,246,119, 53,127,239,239,183,156, 9, 49, 96, 24,239, 26,142, 28,134,106,
+118,144,175,124,229, 58,199,142,159, 36,139, 22,184,250,202,127,224,212,217, 79,112,248,232, 7, 56,121,254, 40,249,251,145, 6,
+227, 81,184,252, 27,138,237,187,155,108,109,191, 67, 49,187, 74,115,224, 97,102, 59, 55,217,222, 89,165,155, 41,242, 40,161,152,
+ 10,114,185, 83, 20, 36, 73,138, 71,200,111,145,138,133,192,213, 58, 76,146, 16,188,204,103,157,115, 52, 78, 50, 50, 0, 98, 19,
+211,181, 14,173,196,107, 96, 54,159, 51, 26, 13, 48, 40, 60,158,121, 37,112, 61, 74,161, 21,152, 90,140,110,178, 44,101, 60, 30,
+227,218,142,182,237, 64, 9,177,172,109, 91,140, 18,168, 94, 35, 46,112, 58,104,108, 34,146, 93,231, 68, 33, 82, 85, 53,113,212,
+107,201,157,216,203, 42, 45, 25,246,101, 49,151,177,130,115, 50,134,236, 57, 63, 33,136,231, 72, 89,213,146,214,150, 70,184,186,
+165,233, 60,211, 86,200,154, 89, 38,163, 3,231, 91,130,146, 8, 99,215,138,246, 62, 4,133,181,170, 31, 29, 59, 65, 55,172, 32,
+ 21, 33, 40, 58, 87, 19, 27,139,182, 26,130, 40,136,228,153, 34, 49, 77,171, 74,218,186,161,246, 34,167,219,115,254,115,173, 60,
+167, 82,129,249,124, 78, 28,203,184,215,117,157,112,248,148,194, 88, 75,231, 3,166,149,115,101,143,147,210,212, 13,174,245, 36,
+137, 38,138,114,186,174, 69,130,124, 2,253,116,143, 64,160, 44,231, 61,105, 91, 28, 7, 65, 72,128,113,156, 0, 26,115,238,252,
+249,127,225,189, 35,142, 19,246,194, 70,166,211, 25,243,249, 12,239,101, 78, 90,245, 2,251,189, 57,136, 15, 98,202,161,145, 4,
+ 37, 9, 74, 81, 36, 89,142,182, 10,223,207, 69,180, 53, 72,164,164, 16,135, 80, 26,155,196, 4, 7,177, 49,100,249, 0, 99, 99,
+146, 36, 23, 88, 58, 52,228,201,128,182,103,226,230,121, 74, 93, 86,228, 61,225, 77,146,108, 68,178,230,156, 35,120, 15, 94, 24,
+159,197, 76,242,107,203,178, 32,142, 82, 49,145, 25, 10, 11,124, 50,153,236,179, 8,219,166,145,153, 74, 87, 83,204, 10,186,126,
+ 94, 28, 89,201, 91, 23,152,182,166,107, 29,113, 28, 99,180,161,237, 2,121,158,202,115,244,124, 2,173,197,199, 62,138, 44, 58,
+138,241, 94, 73, 21,213,111, 86, 99, 45,105, 42, 29,109,231,101,166,109,172, 84,123,174,109, 9, 62, 16,148, 39,178,166,151,249,
+ 9,140,146, 36, 9,145,149,106,113, 15,138, 71, 9,186, 16,167,113,127, 32,138,228,208,185,222,181, 46,207, 65,203,207, 47,203,
+146,180,191,232,181, 17, 24,168,170,164, 74, 31, 14,115, 76, 95,189,134, 16,152, 21, 18, 10,163, 12,226, 56, 85,204,176,218,246,
+ 80,180, 39,138, 4,161,217,147, 90, 25,173,137,162, 8,109,122, 95,252,166, 33, 4,217, 23,218, 72,209,177,247, 50, 39,113,130,
+115, 29, 10,153, 29,197,113,210,111,118, 97,233, 43, 43,233,108,143, 31,130, 7,109,205,224,240, 2, 75, 79,156,227,214,213, 77,
+124,235,176,177,225, 35, 63,251, 36,193,107, 94,126,233, 42,195,229, 1,219, 59, 53,219,211,134,165,161,165,243,138,166,131,179,
+247, 29, 39,143, 21,170, 21, 18,229,137,243,135,217,220, 42, 24, 63,244,113,146,225, 88, 20, 22, 90,163,251, 3,110,117,125,131,
+231, 95,124, 25,148,226,240,202, 50,187,179, 25,111, 93,190,178, 63,111,157,151, 53, 40,201, 57,200,211, 20, 37,152, 30, 62, 64,
+240, 94,102, 92, 65, 2, 59, 4,142,146,130, 44, 16,196, 52,195, 57,153, 27,182, 29,239, 92,190,202, 87,190,254, 77,222,236, 67,
+ 95,246,144, 16, 9,191, 16,200,108, 60, 28,238, 67,248,214, 90,186,174,229,198,237,187,188,117,233,114,111,206, 36,252,131, 35,
+ 43, 7, 56,114,240, 32, 11,227, 33, 90,107,190,240,149, 63,230, 11, 95,121,129,115,167, 79,240,227, 31,126,134,165,197, 5, 92,
+231,184,185,186,202,181, 27,183,249,147,151,191,205,151, 94,248, 58,193, 7,142, 31, 62,200,180,152,211, 52, 13,231, 78,157,100,
+121,113, 76,154,102,164, 73, 44, 16, 94, 8,220,127,238, 44,247,157, 59, 77, 26,199,236, 39,241, 5,241, 43,104,218,150,186, 17,
+175, 8,109,100,143,142, 7, 3,142, 31, 57,204,250,214, 54,159,255,242,243,188,242,218, 27,204,138, 31, 4, 33,129, 20, 30, 73,
+ 28, 99,163,136, 56,178,124,228,153,167,121,244,226,125,140, 71, 3, 25,147,245,255, 72, 73, 36,246,195, 89,154,178, 51,157,242,
+239,126,251,179, 60,247,141,151,216, 75,176,251,211,107,117, 99,147,121, 89,179, 52, 30,179,188,184,200,221,245,117, 94,121,237,
+ 13,126,245,215,254, 45, 69, 89, 83,246, 4,171,189,220,137, 7,238, 61,203,235,239, 92,226,196,177,163, 60,245,200, 67,220, 94,
+223,192,121, 73,105, 60,126,104,133,239,121,197,209, 15,127, 26, 53,111,153,110, 95,195,212, 21,147,170, 70, 71, 57,201,194,136,
+195, 43, 71, 56,118,232, 33,182,135,154,237,244,251, 84,217, 21,194,210,148, 3,247, 13, 57,218, 62,201,234,250, 2,183, 95,249,
+ 34, 59, 55,214,216,126,187,100,123,190,203,234, 43, 95,224,205,151,159, 71,233,123,200,158, 89,226, 53, 91,242, 98, 97, 89,255,
+ 19,232,102,138,174, 80,108,237,166, 92,255,226,103,185,255, 3, 63,198, 99,207,252, 24, 63,241, 15, 79,241,212, 95,184,159,123,
+158, 58,193,198,215, 58, 94, 91,187,195,237, 47, 78,184,117,233, 26, 59,235,111,176,179,253, 26,174,105,136,176,148,213, 38,205,
+124, 29,215,238, 48,202, 91,234,121, 41, 23, 83,211,160,181,162,169, 27, 34,107,232,188,220, 8,137,141,233,156, 67,121, 48, 86,
+179,119,238, 11, 47, 74,211,248,142, 44,149,177,145,177,154, 52,205,246,205,138,210, 36,161,174, 69,254,181,231,178, 41,217,235,
+194, 69,242, 94, 76, 98, 90,215, 82, 87,245, 62,116, 93, 54,117,127,158,201, 8, 44,244, 13,149, 40, 99, 4,102, 15, 62,136,211,
+ 28, 30,163, 36, 24,166, 11, 29,157,247,180,174, 19,249, 86,219, 10,195,183,191,119,124,240,125,238, 68, 71,232,207,151,184, 39,
+ 84, 71,145,161,235, 58,240, 16,144, 81, 99,154,200,204, 91, 44,104, 3, 11,163,113,143, 32, 68,184,224, 81,200, 25, 24,250,182,
+ 69, 35, 81,203,214, 88,108,223,165, 27, 19, 17, 69,137, 52,128,168,158,195, 36,127, 34,178, 6, 99, 98,180,213, 68,218,138, 67,
+ 98, 28,225,219,150,233,124, 38,198,101, 77,133,182, 6,133, 32, 11,222, 59,172, 49,216,190,193,234, 58,201, 79, 55, 61,177,209,
+123, 39, 92, 49, 39,191,107, 18, 75, 19,219, 58, 33,240, 53, 77, 37,223,107, 79,104, 77, 18, 65, 45,172, 49, 50,131,182, 54,194,
+117,142,178, 40,164,147,174,123, 13,227, 92,170,130,202,121,118, 38,219,226,211,173,140, 72,158,154, 25, 62, 4, 34, 99, 73,211,
+ 24,141, 36,249,180,109,131,115, 66,128,115, 56, 18,147,136,243, 80, 38,151, 74,227, 68, 51,174,219, 78, 40,248,214, 80,148, 13,
+113,220,103,212, 38,253,161,226, 3,109,191, 41,172, 50,140, 7, 35,170, 90,100, 7,131, 60,167, 44, 11,124, 16,246,116, 8,142,
+201,238, 14, 40, 69,221,116,216, 40,194, 57,217, 20,170,239, 60,141, 81, 52,141,120, 28, 71, 70, 83,151, 21,174,107,201, 50, 49,
+ 94, 17, 22,183, 20, 40,174, 19,178,156,210, 86,146,209,180,100,171, 55, 93,135, 1, 76, 20,225,186,128,119,158,200, 68,100, 75,
+ 18,131, 42,243, 23,131,235, 36,125, 72,107, 97,154, 71, 81,111, 85,168, 32,177, 22,165, 60,185, 77, 41,203, 57,121,146, 18,229,
+ 67,102,243,130,121, 93, 51, 72,179,126,134, 2,147,217, 76, 42, 48,181, 71, 38, 82,228,131,156,106, 38, 81,136, 2,231, 66,215,
+ 57,138,233, 20,165,100, 90, 36,122, 72,233, 46,141,181,242,221,244,159, 71,219, 51,230, 65,145, 15,115,124,219,178,103,135,152,
+228, 41, 54, 78,240,190, 99,107,107,147,241,120,129,166,174,164,203, 15, 1,109,181,108, 88,109,164,187, 81,162,147,117, 33,160,
+ 75, 24,141,196, 40,194, 24, 48,246, 7,206,115,243,182,149, 75, 13,136,146, 68, 96,193, 72, 99,108, 10, 11, 6, 14, 15,216,253,
+218,101, 84,231,121,246,175, 60,197, 91, 95,124,157, 59,127,114,153, 91, 91, 83,244,100,142, 25,165, 80,213,245,242, 75,139, 0,
+ 0, 32, 0, 73, 68, 65, 84,148, 69,195,155,101,195,141,173,130,241, 32,102, 58, 45, 81,141, 99,117,123, 78,215, 54,108, 79,106,
+ 14,157, 60, 65,117,228, 4,211,233, 84,186, 18,239, 81,202,224,125,203,213,155,183,121,243,202, 53, 78, 28, 57, 76, 93,183,188,
+113,233, 42, 55,123, 11, 83,173,224,158, 35,135, 56,123,226, 4, 89,146,160,180,204,124,149,150, 94,165,233, 28,157,151,217,155,
+116,140, 94, 62, 87, 15,190,145,238, 1,132,156,227, 58,199,230,238, 46, 27, 59, 63,204,220,214, 28, 59,124,136, 15,191,247, 73,
+ 30,125,207,253,156, 59,125,138, 61,249,208, 94,199,190, 59,153,114,253,214, 45,174,223,190,187,255,167,182,119,118,185,179,182,
+206,218,198, 6,167,238, 57,142, 66,113,223,217,211,252,204,167, 62, 65, 28, 89, 78, 30, 63, 38,135, 91, 8,204,231, 21,175,190,
+115,153, 43, 55,110, 50,159,207, 57,116,112,133, 71, 31,184,159, 39, 30,126, 15, 23,238, 61,199,104, 48, 32,207,115,182,118,239,
+178, 61,153,114,254,228, 49,182,119,119,184,179,190,198, 3,245, 25, 14,174, 28, 16,194,156,141,152,247,223,187, 86, 66, 58, 53,
+218,112,119,125,131,141,205, 45,166,179,130,178,105, 57,123,242, 30, 62,244,244,147,188,240,141,111,239,203,226,246,150, 15,112,
+250,248, 49,126,225, 51, 63,201,123, 46, 92,224,248,145,131, 88,173,217,153,206,168,235, 22,109,157,164,223,117,142,221, 89, 65,
+ 81,150, 52,181,232,110, 31,127,240, 1, 94,121,253,205,253,192, 28,144, 46,125,113, 60,230,254,243,103, 57,119,242, 4,159,252,
+208,143,114,240,192,146,112, 78, 80, 98, 42,163,244,187, 34,104,247,214,137, 99, 71,121,250,137,199,248,245,127,255, 59,252, 87,
+127,251,175,115,241,236, 25,222,184,124,153, 3,195, 1,119, 90,199,237, 99,167,120,122, 48,102,245,123, 1,223, 42,170,214, 83,
+ 59, 67,182,184,140, 74, 3, 39, 14, 31, 66,157,222,228,202,181, 43, 44,173, 44,114,226,224,163, 44, 41, 25, 70, 31,248,144,226,
+220, 39, 14,242,235,255,244,125,188,253,181, 95, 37,160,112,170,165,154,172, 49, 90, 58,193,226,226, 50,235,191,171,104,167, 41,
+122, 25,202,137,198, 53, 1,101, 21, 22,184,115,231, 26,159, 57, 12, 59, 94,177, 24,207,120,144,140, 63, 74, 53,169,183,172,191,
+122,128,118,233, 43,116,203,183,217,185,226, 81, 6,242,197, 19,128,163,235,230,160,161,109, 45, 46,206,241,174,101, 54,107,123,
+123, 88,139,115,245,254, 5, 49,159,207, 33, 67,206,131,216,226,130, 39,141, 83,246, 36,166, 81,170,177,157, 7, 37,196,219,224,
+ 3, 30, 71,158, 15, 80, 10,202,121,137,141, 34, 58, 23,168, 42, 33,130,198,113, 76,150,100,204,138, 2, 79, 13,206,147, 15,135,
+204,166, 83,162, 40, 17,136,217,118, 88,246, 92, 69, 69,102,220,118,173, 72, 93,211, 12,218, 6, 79, 64, 25, 69,104, 28,104,113,
+186, 83, 78, 97,209,160, 45, 77,215, 73,144, 86, 36,231,160, 79, 28,169,143,113, 46, 96, 85,160,237, 58,138,162, 96,113,113,113,
+ 63, 15,125, 60, 26, 11,234,216,212,196, 54,162,238, 90,124,144, 89,185,209, 6,109,197,141,212, 5, 71,158, 38, 56,215,251,156,
+120, 5, 10, 58, 60,101, 85,202,229,173, 12,109,127, 79,248,174,197,155, 4,180, 66,123, 48,145, 36, 86,138, 72, 64,208,131, 16,
+132, 7,208,245,168, 66,219, 8, 99,125, 52, 26, 49,221,157,145,102, 9,217, 64, 44,120,187,198, 19,130,140,161,246,208, 8,231,
+ 2,117, 51, 71, 43, 49,241,217, 11,147, 42,171, 90, 84, 78,218, 16, 60, 68,113,210,195,247, 1,165, 2,179,121, 65, 98, 99,172,
+119,142,186,113, 52,213,132, 40,138, 1,205,188, 44,233,186,110,223,104,197, 59, 47,198,252, 33, 96, 35, 75,211, 58,232, 96,144,
+229, 76,103, 19, 90, 31, 24, 12,134,116, 78,230,186,214, 10,171, 89, 25, 17,253,135, 0,131,193,136,178,174,152, 87, 21, 73, 20,
+139,183,111,223,109, 87, 77, 67, 26,107, 60,129, 16, 60, 89,150,138,102,181,117,116, 14,182, 55, 55,177,214, 48, 28, 14,137,163,
+120, 31, 10,205, 7, 35,234,170, 17, 87,186,166, 3,163,136,242, 49,177, 81,116, 94,168, 53,105,146,144,196, 49,117, 37,122,197,
+ 60, 23, 34, 4, 4,134,131, 1,147,201, 46,117,221, 73, 81,162,132, 48, 17, 2,232,196,138, 47,183, 86, 24, 45,225, 41,149,209,
+168,126, 62, 50,212,154, 56, 49,212,117,139,141,250, 88, 84, 99, 72,172, 66, 25, 77,232,192,187,192,100,178, 3,222, 67,158,227,
+154, 10,124, 64,143,199, 88, 19,131, 15, 4, 31,152,119, 13,227, 68, 2, 68, 58,231, 80, 8, 40,111,173,193,185,142,182,107,200,
+178, 1, 85, 85, 49, 24,102,116,109, 75,146,196,244,101, 50,109,221, 48, 43,102, 8, 25, 68, 83, 85, 53,131, 97, 36,115, 31,173,
+ 25, 14,134, 40, 45, 82,151, 36, 73,100,104,143,176,173,171,186, 36, 78, 82,180, 54,228,153, 64, 73,218, 42,230,115,201, 42,222,
+222,222,194,196, 17,126,111,195,181,142,100,144,236,147, 60,156,243,248, 42, 16, 27, 75,211,214,248, 78, 72, 41, 77,219,226,154,
+138,209,120, 44, 7,132,119, 20, 69,177, 79,230, 83, 74,241,227,239, 25,240,231, 31,137, 9, 74,179,245,199,151,249,245,255,248,
+125,254,225,207, 62, 1,111,110,241,149,111, 94,231,196,161, 5,230, 77,199,194,161, 17,219, 59, 5,233,242,152,196,119,108, 23,
+162,219,244,117,199, 91, 87,119, 56,117, 48, 97, 16,107,140, 77,136, 76,224,246, 52, 38, 45, 43,102,197,148, 3, 11, 75,228, 89,
+ 42,213,118,208,156, 56,126,148,243,167, 79,113,252,240,129,253, 8,206,189,229, 3,220, 93,151,184,208,131, 43, 7,176,235,107,
+172, 44, 47, 67, 63,162,235,188,167,169, 27,233, 80,148,140, 39,172,181,104, 69, 15,189, 75,248, 11,192,250,214, 54,219, 59,187,
+162,216,248,193, 79, 96, 86,204,152, 20,115,218,206, 49, 47,231, 61,164, 38,164,193,166,233,184,187,190,193,247,223,124,135, 31,
+ 94,198,136,172,174, 40,107,118,167, 83,198,195,156,243,167, 79,113,226,216, 81,170,178, 98,109,115,139, 63,248,234, 31,243,213,
+111,188,196,229,235, 55, 1, 72, 99, 25, 59, 45, 14,135, 52,206, 49,200, 51, 70, 3, 73,151,186,117,119,149,231, 95,124,153,231,
+ 95,124,153,105, 81,240,216,131, 23, 57,115,207,113,150,198, 35,146, 40, 98,144, 74,130,151,105, 13,174,171,152, 85,229, 62, 4,
+254,234, 91,111,115,245,230, 45, 54,183,119,120,245,173, 75,204,171,138,200, 24,134,195, 1,237,110,183,223, 25,231, 89, 74,100,
+ 35,222,184,114,149,255,230,127,252, 87,252,226,103,126,146, 79,127,242, 89,150, 71, 99,185,184, 21, 24, 31,129,149, 46, 37, 75,
+ 19,110,220,190,195,239,254,193, 31,241,253,183,223, 65, 3,197,252,221,241,170, 82,240, 11,212,254,248,131, 15,240,224,133,123,
+241,222,243,220, 75,223,226,247,159,251, 26,177,209,220,115,244, 8,215,111,189, 91,211,174, 81,252,254,115, 47,240,143,127,233,
+111,240,215,254,226,159,231,155,223,123,141,159,253,137,143,179,177,189,197,225, 3, 75,188,176,189,203,248,108, 74,211,129, 57,
+163,240,175,105,154,118, 78,154, 45, 51,156, 28,193, 13,214,153,181,155, 84, 27,175,115,242,216,123, 56, 58, 88,102,108, 96, 52,
+128, 52,106,184,177,155,240,205,207, 46,112,244,200, 2, 27,247,188,151,237,237, 75,196, 78, 49, 58,121,129, 52,215, 76,118,222,
+226,238,205, 71, 41, 11, 69,121,123,151,134, 6, 91,119, 68,139, 71,217, 45,110, 51, 26, 61, 10,143,193,218, 31,194, 89, 60, 75,
+202, 18,135, 29,244, 99, 99,138, 87, 20,213,173, 3,196,227,171, 28, 61,123, 15, 90, 31,195,123, 79, 61,221,193, 59, 80, 68,120,
+149,161,143, 30,228,128,106,152,174,173,245, 77,149, 20,158, 69, 49,103, 56,148,145,106,215, 57, 90,215, 49,202, 13,202, 7,106,
+215,129, 19, 27,104,130,200,199,180, 6,155,138,211,103,219,118,130,188,117, 34,211,234,234, 78, 20, 49, 58, 67,107,100, 68,167,
+ 53, 54, 54,184, 38,224,244, 15,102,199,214,106, 48,138,208, 34,145,175, 93, 71,154,230, 40, 37,126, 24, 0,117, 37,141,194,104,
+ 52,162,235,186,158,116,166,152,236,150, 68,177,197, 90,185,143,178,222,193,179,235,246,220,227, 58, 92, 39,119, 13, 8,132,110,
+173,240,143,234,174, 37, 79, 50, 90, 47, 42,171,121, 81, 96,210,132, 65,146,163,242,189,112,154,110, 95,134,231,235,146,166, 21,
+ 47,253,186, 81, 24, 29, 48,202,146, 36,154,186, 1,229, 21, 42, 50,196, 26,202,121, 77, 20,107,230,187,149,188,247, 86,202,149,
+ 52,203,233,218,154, 56,142,112,206,209,118, 45, 81, 28,209,213, 29,193, 73, 33,225,187,142,170, 44,209, 86, 36,125,222, 67,146,
+137,135,126,211, 52,228, 89, 78,168, 75,249, 93,140,233,201,199, 74,154,136,182, 37, 74, 18,210, 52, 70, 41, 35,104, 72, 89, 49,
+ 28, 14,240,120, 9,183, 65, 76,137,156,114,216,178,135, 74, 76,100, 73,141,100,128, 55, 77, 45, 21, 77, 36, 21,214,172,152, 10,
+ 52, 18, 20, 85,211,176, 48, 90, 64,230,187, 82, 53,136,181, 94,199,116, 42, 25,229,101, 85, 73,194,218,112, 40,210,131,224, 73,
+148, 34,142, 45,222,201,172,174, 42,230,184,222,226,207,152,158, 16,134, 71, 43,209, 30,206,231, 21,205,188, 68,117, 45, 26,143,
+243, 29,211, 93,135,210, 10,155,103, 40,101, 8,200,156, 70, 57,133,138, 4,246,110,155,138,225,226, 18,105, 36, 6, 8,109,219,
+ 10,113,195, 66, 8, 82, 45, 26, 45, 94,185,114,117, 42,162,200,146,101, 3, 80, 10,133, 48,212,187,214,209,118,123,157,135,200,
+ 14,178,108,128,238, 73,112,109,219, 49, 30,143,177,145,161, 42, 11,180,181,212,101, 73,219,212, 12,243, 1,173,247,212,197,174,
+ 64, 80,243, 57,179,237,109,148,150, 68,167,217,100,130,210, 16,124, 64, 25, 67, 26, 37, 0,228, 67,241,161,111,218,150, 56, 77,
+216, 35,155, 4,232, 53,159, 17,109,221,130, 81, 36,214, 80,213, 53,243,249, 28,173, 13,222, 59,198,121, 78, 67, 64, 43, 3,193,
+147, 36, 17,185,201,152, 21, 51,180,150, 11,189,105, 58,242, 52,197, 7, 77, 85,215, 36, 81,130,243, 29, 96, 40,230, 37,113, 28,
+ 49,157,148,248,174, 19,253,104,108, 72,227, 20,149, 72,103, 90,206,231, 61,123, 83, 62,189,166,105, 48, 90,163,172,194, 96,132,
+140,131, 34,210, 22,147,199,116, 77, 67, 28,247, 47,103, 38,208, 94, 8,129, 11,135, 29,127,243,253, 67,226,162,198,167, 25, 95,
+121,233, 6, 79, 63,116, 28,245,196, 41,190,247, 59,223,230,137,135,142,211,121, 48,107, 51, 38,109,199,122, 19, 40,110,110,113,
+250,232, 50,171, 69, 1,218,208,248,192,241,149,140,115,199, 70, 52,211,134, 77, 31, 24,141, 44,117,126,132,233,172,160,107,196,
+ 4,162,172,106, 22, 70, 35,230, 85,205, 86,159, 58,166, 20,220, 94,125,119,114, 24,200, 5,154,167, 9,193, 7,162, 56,233,199,
+ 70,226, 21, 32, 48,116, 77,235, 28, 4,135,209, 18,191,169,181, 70, 43, 77,211, 31,166, 93,219,113,251,206, 93,238,174, 75, 71,
+187,183,146, 52,238,209,129,203, 60,253,196, 35, 16,232, 11, 84,205,100, 90,240,205,239,189,198,235,151, 46,113,240,192, 18,171,
+125, 76,233,194,120,196, 79,124,228, 25, 30,186,255, 34, 7,150, 22, 24, 13,228,128,246,206,247,251, 35, 34, 4,197, 7,222,251,
+ 4,163,241,136, 47,127,237, 27,188,254,246, 37,170,166,161,233, 58, 86, 14, 44,243, 51, 63,241, 73, 86, 22,199, 82,144,119, 13,
+ 89,154,112,225,236, 25,156,115,188,115,245, 6,211,217,156,197,241,152,199, 31,126,143, 32, 7, 90,161,124,223,185, 24,141, 15,
+114,193,238, 76, 39,188,117,233, 26,127,240,220,243,236,206,138,119,205,171,255,244,242, 1, 62,249,225,103,120,252,161,139, 36,
+ 81,132,235,187,151, 56,137,233,156, 23,174, 5, 34, 89,173,218,134, 27,183,238,176, 51,157,145,231, 41,101, 89,255,153,221, 54,
+136, 55,251,251,159,120,148,199, 31,122,128,151,190,251, 42, 91, 59, 59,164, 73,202,231,255,240, 43, 0,226, 65,222,175, 56,178,
+164, 89, 74,158,138,132,244,179, 95,252, 50,255,242,159,255,215,124,237,155,223,226,249,151, 94,230,177,139, 23,136, 15, 29, 98,
+ 54,171,184,248,240, 71,105, 47, 7, 70, 39, 3,206, 46, 98,140, 37,205, 22, 97,169,225,216,202, 34,231, 30,254, 49, 70,139,138,
+140,128, 86,158, 40, 40,230,117,160,241, 49, 81, 22,216,184,181,202,230,157, 27,124,236, 47,253, 21,120, 6,118, 60, 12, 45,124,
+251,191,253, 42,119,174,255, 49,170,147, 92,243,170,153,225, 19, 69,232, 60, 81,185,205,246,238,117,104, 75,190,243,219, 96, 51,
+248,238,239,143,105, 62, 26,200,173, 38,190,172, 8,157,163, 42, 60, 77,172,137, 87,214, 56,152, 61, 67, 62,238,112,237, 58,107,
+171,176,118, 51, 98,186,150,211,109,174,112,207, 51, 15, 16,191,252, 5,138,219,107, 24,107,240, 65, 96,218, 16, 20,113, 26,203,
+ 60,217, 70, 84,117, 77,215,138, 73, 76,231,157, 4, 47,229, 25,131, 65, 38,176,122,219,244,242, 40, 79, 85,149,189, 14,190, 37,
+205, 82,145,224, 90,201, 81,207,178, 76, 70,180, 54, 34,178, 49,198,104,218,174, 35,201, 18,124, 23, 40,138, 41, 10, 77,158, 15,
+247,121, 77,117,211, 16,233, 8,155,199, 36,105, 74, 93,213, 20, 69,193,104, 52, 38, 31,230, 66,192,179,134,166,115,212,141,188,
+ 59,123, 8, 88,167, 20, 74, 26,105,226, 52, 69, 35,209,208, 74,131,209,150,208, 9,156,237,130,100, 84,180,109,219,123, 65,148,
+228, 70, 28,245, 92,213,145, 13, 50,234,166, 6,223, 17, 69,105, 63,130,245, 16, 60,206,129, 87, 45,177,142,132, 15, 16, 28,174,
+107, 37, 86, 60, 4,108, 72,201,146,132,166,115,148,197,140,198,136,148, 78, 76,116, 20,121,154, 83,119,114,127, 38,113,194,238,
+ 92, 92,241,226, 94,162, 23,250,226,201, 53, 53, 16,200,178, 12, 21,250,115, 51, 40,188,235, 40, 59, 9,204,146,207, 89, 3, 26,
+165, 13,229,188,192, 24, 75, 8,194, 1,240, 78,156, 64,173,177,253,168, 60,162,235, 28,214, 90, 75,154, 72,158,235,188,174,105,
+ 93, 75,222, 75, 2,240, 66,144,136, 18,137, 75,245,222,163,186,208,235,235,122,195,145, 44,101, 54,153,177, 51,217,197,232,136,
+174, 19,237, 93,227, 28,126, 54, 97, 48, 24, 33,158,185, 83,160,103,249, 58, 79, 28, 69,212,149,116, 53,131,209, 2, 74,105,102,
+179, 25,113, 18,137,252, 66, 25,130, 53, 61, 60,163, 8, 74, 28,186,112, 10, 87, 8,211, 17, 31,192, 90, 92, 39,158,196,218, 70,
+100,195, 17,104,201, 16,222,151, 10, 89, 3, 88,172, 17, 24,170,174,155, 94,230, 0, 90, 11,241, 70, 98, 90,133, 37, 58, 30,141,
+169,219,150,162, 16, 89, 89,108, 45,202, 26,230,243, 89,255,103,164,131,159, 78, 39, 66, 96, 83,144,197, 17,243, 70, 10,164,157,
+221, 29,210, 92,248, 9,157,107, 5,177,104, 61, 62,202, 25,102, 17,173,243, 84,115, 49, 94, 9, 4,138,217, 28,198,138,196,136,
+ 4, 48, 50,134,174,238, 80, 74,147,102, 57,214, 40,156,181,178,193,156, 35, 82, 17,157,247,148, 85, 69,146, 38,251,190,206,202,
+ 90, 6,145,104,137,139,162, 20, 82,159,239, 24, 13, 71,204,139, 18,239,101, 3, 76,103,243, 30,186, 7,188,152,217,228,153, 88,
+ 80, 22,197,156, 44, 77,133, 46,222, 87,226, 26, 25, 77, 84,181,188, 36,211,233, 20, 99, 52, 1, 8, 94, 65,240,168,166,247,148,
+ 14,141, 36, 30, 53, 98,208, 35,254,255, 29,211, 66,140, 41, 70,195, 33, 30,205, 47,127, 48, 35,186,182,137, 63,113,128,233,155,
+119,153, 79,102, 60,240,190, 83,168,203, 59,220,222, 44, 57,115,239, 10, 77,237, 25,159, 61,200,107,175,175, 82,116,129, 56,143,
+185,116,117, 19, 29, 91, 14,140, 98,202,121,195,249,195, 35, 54,175,108,224,203,138,193,145,101, 54,215,107, 46,141, 91, 98,189,
+ 77,158,198,124,254,203, 95,229,218,237,187,252,151,255,249, 95, 99,109,115,139,223,252,157,207, 9, 7,163,144,125,240,195,203,
+ 24,195,163, 15,222,207,193, 3,203,125, 1,234,217, 35,102,185,190, 24, 33, 72, 49,230,156,195, 43,141,209,158,128, 72,132,124,
+127, 48,228,121,206,169,123,142,115,103,117,157, 51, 39, 78,240,253,183,222, 1, 60,105,148,240,192,249,123,185,120, 94, 96,112,
+173,197,249, 48,178, 2, 45,111,237,238,240,135,207,255,201,187,158,105, 58, 43,184,126,243, 46, 43,139,203,156, 63,115,138,241,
+ 48, 71, 3, 38,142,136, 9, 52, 90, 34,144, 23, 71, 99,154,186, 98, 97, 56, 96, 60, 26,178,181,189,131,247,158,187,235, 27, 28,
+ 60,176,132,209,138,233,180,144,121,101,219,137, 4,237,230, 45,110,221,189,203,169,227,199,184,189,182,198,195,205,125,104, 45,
+197, 9,125,103,142,146, 28,232,206,117,188,246,205,119,120,253,157,119, 88, 90, 90, 98, 58, 47,255,147, 23,186,214, 66,170,107,
+154,154, 99, 71,142,112,252,208, 65, 34, 43, 42, 2, 23,100,188,214,118,226,211,125,119,245, 46,223,121,237, 13, 54,119, 38,188,
+241,246, 37,238,108,108,254, 39, 67, 87, 70,163, 1,207,254,232,251,248,171,159,249,243, 84, 77,195,100, 58,225,183,255,227, 23,
+ 57,184,178,204,185, 83, 39,184,116,237,134,100, 63,244,107, 60, 26,115,248,224, 1,154,166,225,252,217, 51,212,117,205,191,255,
+236,239,113,224,192, 18, 79,189,231, 34, 63,245,137,103,249, 7,255,239, 23, 56,254,193,191,204, 3,103, 83, 54,111, 42,150, 34,
+ 69,122,247, 32, 62,205,208,157,102,253,246, 27,140, 55, 30,229,248,199,192,133, 18, 95,165, 60,148,117,148,193,113, 73,101,188,
+189, 14,155,207, 7, 86,239,220,192, 23, 59,252,244,167, 43, 30, 32,229, 75, 76,120,135,154,196, 30,102,107,243,115,196,217, 89,
+ 22,150, 14, 81,149,235,132,185, 64,219,179,174,229,214,141,231, 24, 14, 79,241,122,254, 18, 39,252, 83,216,105,224,245,207,105,
+242,149, 49,235,183, 2,243,106, 66, 89,213,236,126,127,139,165,247,140,185,240,224, 65, 34, 29,216,216,136, 80,103,166, 28,247,
+154,235, 47, 20,204,215,143, 82,221,188,143,243, 31,252, 0, 59,197,231,185,241,197,207, 83,207, 10,156, 19,195,147,209, 96,128,
+ 75, 45,213,124, 78, 85, 85,216, 56, 38,162, 15,132,154, 78, 69,174,155,102, 52,157, 36,155, 13,242, 12,231,122, 25, 88,240,196,
+ 73, 76,112,162,105, 23,107,104,145,180, 10,113, 78, 46,120, 85, 43,162, 36,218,183, 55,149,184,237, 12,188, 71,107, 35,234,169,
+174,163, 33,128,213,120, 39,103,116,150,100,116,190,163,158,206, 73,243,140, 68, 69,164, 74, 84, 75,214, 68, 34,179, 11,158, 60,
+151,249,129, 22, 66, 11, 10,185,240,139,233, 76,254,155,214, 76,250, 52, 54,211,143,180, 6,131,129, 16,234,138, 57,181,150,172,
+246, 16, 28,145, 54,253, 22,247,152,216, 16,218,128,241,129,214,123,156,115, 56, 3, 90,199,232, 84,184, 31, 26, 69,221, 84,114,
+238,150, 37,226, 55, 98,101, 44,101, 44, 77, 83,209,116,130, 88, 42, 15,243,102,142,181, 98,201,251,195,163, 93,231, 68, 54, 7,
+ 80,213, 45,101, 91,147, 69, 41,157,239, 36,131, 68, 43, 84, 0,213, 57, 92,219,146, 12, 50, 84, 80, 56,183, 23,185, 11,120,143,
+ 49, 30,109, 13, 58, 8, 90,209,185, 86, 70, 36,214, 98, 59,231,169,230, 5,193,119, 40, 47,208,217,172,110,177,105,194,108, 62,
+ 35, 79,210,126,200, 47, 76, 60, 27, 71,204,231,115,218,178,146, 88,185,206,163,140, 72,172,146, 40,234, 61,179,101, 78,168, 98,
+113,202,170, 42,209,158, 15,135, 98, 75,218,117, 29,243,121,181, 15, 9,215,109,139,239, 28,214,198, 56, 20,243,201, 4,215, 57,
+240, 14, 31,199,140,135,185, 64,189, 65, 81,215, 5, 93, 43,201, 99,195,225,152,200, 88,166,173, 99, 56, 90,192, 68, 6,163,181,
+ 4,164, 36, 9, 81, 20, 19,199,182,255,176,123, 31,248,158,176, 81, 7,145,104,164,113, 44,241,168, 86, 92,123, 34, 35,250,241,
+121, 81, 64, 8, 12, 71, 35,185, 48, 21, 68, 90, 72,111, 58,136, 13,103,154,230,152,200,208,180, 13, 74,121, 22,134, 67,118,119,
+119, 9, 90, 83,205,230,160, 32,104, 45, 46, 64,214, 98,130,163,115, 49, 73,154,201, 92, 7,197,180,156,211,248,142, 65,128,121,
+211, 72,246,124,154,246,218,116, 33,180, 76,103, 51,226, 56, 22, 34, 71, 16, 86,101,211, 52,194,178,239, 28,121,150, 82, 78, 11,
+188,247,236,238, 76, 24, 45, 12, 73,147,140,233,108, 70,154,229, 24, 45, 93,178, 15, 50,247,181, 86,140,132,170,170, 21,201, 71,
+ 80, 76,103, 19,242, 60,167,174, 43,138, 98,142,162,119,238, 83,138, 56,203, 16,167,165,140, 36,201, 8, 61,241,175,115,158,160,
+ 28,113,154, 97,180, 6, 60,197,108,142, 42,171,253,141,108,180,192,212, 40,113, 13,115, 77,199,123, 78, 68,156, 95,206, 40, 47,
+223,198,174, 44,241,221, 27,219,156,124,224, 36, 87,215,167,168, 59, 19, 54,138,134,197,141, 57,163, 3, 67,170,206,115,244,158,
+ 5, 54,222,174,120,224,190,227,220, 94,221,225,246,173, 93,226,160,200, 83,205,206,110,201,201,251,142,243,214, 91, 55, 89, 95,
+221,225,192,193,148, 60, 31,114,244,216, 81,118,119,119,121,237,237,203,124,230,199, 63,193, 32,207, 24, 55, 67,158,126,252, 17,
+ 46, 95,191, 73,219,182, 44,140,134, 84,155, 63,184, 4,210, 36,102,117,117,147, 31,121,228, 97,150, 23, 37,121, 77,247,251,181,
+237, 53,233, 46, 4, 8,158, 56,138,133,163,209,118, 56,215, 9,212,166, 20,177,145,223,115,115,123,155,119,174,223,228,251,111,
+189,213,195,203, 41,195, 65, 46, 12, 96, 45, 63,171,233,100,230,182,189, 59,103,125,107,155,133,209,136,229,197,197,119,117,169,
+ 7,151,151, 88, 88, 24,115,242,196, 49, 6, 89, 66, 98, 35,201,124, 86,138, 16, 20,155,187,235,124,246, 11,127,200,111,124,246,
+115,252, 89,235,220,233,147, 76,166,162, 25,222, 59, 84,138,170,230,230, 29, 49,193,121,229,181, 55,249,196, 51, 79,243,222, 39,
+ 30, 3, 5,109, 39,103,192,222, 24, 97,212,171, 97, 86,150, 22,121,235,242, 85,190,250,141,151,184,121,231, 46,127, 90,182,182,
+188,184,200,201, 99, 71,246,223,231,197,241,152,199, 30,188, 72, 22, 75,228,172, 72, 48, 5, 45, 10,161,165, 40, 11,238,172,174,
+243,250,219,151,120,251,234,117,222,186,116,133,157,233,236,255, 71,182,139,109,132,178,138,163, 43, 43,124,224,169,199,249,248,
+135,126, 20,148,230,157, 43,215,249,222, 27,111,115,103,109,149, 23, 95,249, 46,214, 90,254,244,106, 91,201,194, 94, 24, 14,120,
+251,210, 21, 62,240,212, 99, 56,231,248,139, 31,255, 8,231,207, 30,227, 87, 94,122,133, 59,117,199,242,247, 18,252,227, 49,119,
+ 86, 3, 7,159,129,163, 7,143,114,205,141,105,119,183,169,234, 93,174, 69,151, 56,233, 31,227,162,202, 80,153, 2, 98,190, 4,
+ 76,118, 96,245,115,129,116, 5, 30,126,250, 71, 24,141, 3, 47,111, 40, 62,255, 50, 20,119,198,164,135,224,207,253,243, 67,204,
+255,201,199,184,118,233,139,236,108,172,160,149,162,243, 13,229,116,139,233,214, 53,234,114,131, 3,143, 63,205,206,231,190, 65,
+148, 85,116, 43, 79,113,244, 68, 70,219, 4,238, 94,131,178,155,178,179,125,135,217,214, 58, 7,238,190,143, 51, 15, 7,238,190,
+ 10,107, 55, 51,170,119, 52,234, 88,199,161,139, 29,187,241, 6,198, 60, 77,242, 36,156,188,244,139,228, 31,251, 40,147,221,223,
+102,118,249,117,238, 92,186, 14, 90, 51,219,221,101,207,180, 69,119, 26,149,200,249, 27, 69, 17, 10, 69,221,118,212,117,133,247,
+129,214, 57,234,166, 33, 79, 50,170, 90, 82,202, 20, 26,107, 53, 65, 65,146,166,208,137,181, 47, 65,102,201, 11, 75, 75, 24, 5,
+131,108, 0, 10,145,225,150, 21, 89,150, 81, 22, 98,234,133, 66,220,220, 26, 79,156,198,196, 61,176,210,212, 53,174,115,180,147,
+ 41, 1,137,130, 30,140, 70,180,174,221,151,184, 1,160,100, 76,235,234, 18,107, 4, 1,234,124,199,238,116,210,143,178,216,183,
+191,222, 51,237,114,222, 49, 24, 13, 80, 40,148,134,217,108, 78, 20, 25,108,148,224, 90, 7, 72,199, 75,255, 89, 72,177, 18, 32,
+244,169,138, 89, 74, 18, 37,236, 89,198,170, 56,238,239, 39,112,157,103,214, 21,253,243, 41, 28,130, 14,198,177, 37,138, 12,222,
+ 91,105,218, 8, 36,105, 70,150, 37,116,206,211,212,210,252,234,160, 9, 74,145, 70, 41,174, 19, 75, 94, 19, 91, 66, 28, 83,183,
+ 93, 47, 35, 20,141,126, 85,149, 24,101,176,177,152,225,148,253,187, 50, 24, 73,116, 43, 64,112, 14,171,148,198,196, 49,206, 25,
+116, 45, 14,102,131,124,132,177,150,178,169, 80,185, 34, 77,165,106,115,206, 67,112, 2, 9,244, 90,185, 36, 77, 40,166, 19, 90,
+ 39,142, 99, 89,150, 17,105,141,235, 58,242, 60,163,106, 42,188,239, 24,228,189,253,160,150,174, 59,232, 61, 39,182,132,200,104,
+166, 69,137,115, 45, 81,148,145, 36, 57, 85, 40, 8, 90, 73,178,152,181, 52, 77, 13,104, 70,163, 69, 92, 39,196, 8, 23,196, 20,
+ 38,138, 82,177, 40, 53,154,249,188,192,166, 49, 90,203,188,163,107, 29,243,217,140, 82, 11, 1, 68,107, 57,116,187,166, 69,119,
+ 29,241, 96, 32,142, 60, 33, 80,183,142,102, 62,195, 36, 9,131,124, 15,142,151,229,157, 72,234,124, 16,120, 89, 91, 77,215, 57,
+210, 60,237,117,245,154,160, 3,227,133, 49,179, 89,193,104,152,227,130, 98, 58,157,146, 15, 6,253,220,186,215, 69,122, 40, 93,
+129,247, 48, 30, 12,169,186,134,157,157, 29, 70,131, 33, 89,158,211, 52,189, 86,223, 24,154, 90, 60,240,235,186,166,152, 77,241,
+206,147,228, 57,214, 90,218,182,233, 67, 10,132,213, 42,145,133, 13,187,219,187, 12,134,226, 0, 86, 85, 21,186,135,173,188,247,
+ 68,113, 74,158, 89,156,239,104, 27,153,249, 4, 99,208, 70, 54,159,243,142,241,104,132,107, 59,118,167,187,224, 28,117,219, 18,
+250, 25,186, 54,134,114, 46,155,116, 52, 24,210, 4,169,136,231,165, 64,246,113, 36, 17,137, 0, 85,213,244, 82, 56,241, 11, 48,
+ 90,179,219, 54,228,110, 9,174,207,208,193,193,172,226, 59,111,175,113,234,216, 2,195, 40,227,234,198, 28, 87,181,220, 94,159,
+177, 84, 5,150, 87,114, 86,215,119, 41,107,199,237, 27,171, 4,167, 88, 28,138,206,253,220,137,101,238,172, 79,185, 17, 2, 71,
+207, 30,101,251,237,187,188,121,117,139, 35,247,173,176,190,181,201,175,254, 47,255, 7,222,123,242, 84,124,155, 1,126,250,199,
+ 63,206,107,239, 92,230,173, 75, 87,185,124,227, 38, 63,188,172,181, 28, 57,188, 66,154, 72,224, 75,100, 77,255, 57, 75, 71,210,
+116, 29,117, 93,203,190,141, 44, 73,146, 48, 24, 40,202,121,217,207,181, 52,145, 53, 12,135, 57, 71, 15, 31,102,121,113,204,202,
+242, 50,155,189,223,244,193,229, 37,238, 59,123,154,135,239,191,143,241,104,184,239, 94,101,173,228, 40,191,125,245,250,187, 46,
+ 75, 99, 12, 7, 15, 44,113,242,216, 97,178, 60, 19, 22,179,145,125, 39, 14, 89,112,236,208, 10,191,240,211,159, 98, 60, 26,240,
+251,207,191,192,213, 27,183,247,255,142,197,133, 49,159,250,200,135,136,172,161,152, 75,226, 97, 20, 73,168,206, 35, 15, 94,100,
+ 48,200,120,234,145,135,185,231,216,177,125,190,132, 15, 94, 72,143, 74,147,196, 34,181, 49,218,160,181,140, 49,110,221, 89, 21,
+102, 49, 26,221, 51,159, 1, 80,112,225,220,105,158,122,248, 65,182,118, 38, 40, 99, 56,114,112,133,160, 4, 6,221, 51,180,217,
+222,217,101,123,119,202,234,230, 38,111, 93,185,206,119, 94,123,131,219,171, 27,220, 94, 93,123,151,116, 13,164,227,127,230,125,
+ 79,242,151, 62,245, 9,134,195, 33,227,209,144, 36, 18, 57,218,241,163, 71,217,157,205,216,218,149,174,126,143,112, 24,130,168,
+ 97,130,243,236, 78, 11,234,121,201,225,147,199,201,243,156,149,229,101,126,242,189,143,240,224,209, 49,255,236,245,235,124,251,
+250, 29,178, 96, 89,187,241, 26,191,253, 47,199, 16,191, 70,252,123,207,240,232, 79,120,174,253,198,253, 68,250, 57,226,116, 72,
+215, 77,248,141,255,203,112,250,231, 58,234, 47, 68, 76, 31,243, 44,166,129, 59,191,103,184,187, 19,248,159,254,118,160, 34,240,
+ 34, 5, 78, 65,254, 73,207,230,221, 69,174,255, 22, 92,123,253, 58,199,207,124,132,213, 91,223, 97,237,230,139,184,174, 37, 77,
+ 79,240,193, 79,253, 12, 93,118,158,131,135,142,242,201,191, 81,241, 63,252,103,159,231,214,218,171,160, 98,234,246, 36,201,214,
+ 97,102, 59, 87,153,172,191,206,206,234,247, 41,103,171, 28,125,248, 89,206, 28, 40,121,167,200, 72,125,198,164,201,113,151, 87,
+105,143,122,226,149,187,204,111,127,153,249, 55,127, 12, 19,131,106,142,210, 22, 31,225,222,207, 60,194,201,187,183,184,250,252,
+ 11,116, 93, 39,103,136, 55,248,224,233,124,139,111, 37, 64,196,123,135,118,244, 16,122,239, 20,169,161,233, 58, 34,107,123, 53,
+132,194, 88, 5, 94, 36, 95, 38,137, 25,198,210,200, 41,173,229,146, 67, 16,196, 44, 77,201, 7, 25, 77, 85, 51,153,245, 23,174,
+ 10,248, 86,148, 65, 38,200,104,119,239, 43, 79,147,148,206,138,100,178,170,106,154,182,197,214, 53, 81, 28, 51,153, 76,208, 90,
+147, 13, 6, 88,163,192,119, 36, 73,134,243,158,122, 54,195, 40,141,177, 26, 19, 71,116,181, 72,154,211, 36,161, 40, 10,242, 97,
+ 78,172, 98,130, 11,104,163,153,236, 76,176, 86,200,189,138, 57,163,209, 8,107,141,232,245,219,142,216,198, 4,235,112, 78, 80,
+128,214,183,168, 82,225,124, 71,167, 20,169,181, 56,163,240,157, 71, 69, 9,177, 82, 61, 41,217,161,181,176,228, 85, 80, 4,229,
+246, 81, 79, 61, 50,236,236,236,244, 5,149, 39,142,123, 15, 16,163, 40,203,154,178,152,209, 69, 9, 73, 18, 81, 55, 45,150,128,
+107, 91,154,182, 99, 48,200,112, 72,162,103,100, 52, 65, 73,190, 74, 62, 24, 17, 37,177, 68,214,246,239,224,124, 94,136, 59, 96,
+ 64,152,210,179,121, 67,208, 22,172,165,152,207, 80,198,178,184,184,136, 81, 17, 58, 10,140,135, 86,188,251,149, 71, 12,240, 75,
+242, 60, 23, 72,222, 8, 45,127,148, 11, 3, 51,202,135, 52,117,205,124, 86,146, 13,114,106,215, 50,153, 76, 5, 48,209, 74,244,
+213, 38,166, 85,142,196, 70,120,215,177, 48, 26,225, 28,204,139,153, 48,116,211, 24, 23, 60,117,213, 96, 81, 36, 61,193,205, 7,
+153, 25, 27, 99, 49, 90, 51, 88, 92,194, 7,143,199,227, 74,113,230, 49,218,226,219,150, 54,120,138, 98, 46, 50, 7,107,152, 77,
+133, 12, 88,215, 53,161, 39,107,204,166,146, 65,235, 67,192, 43, 5,173, 88, 8,214,198,146,143,229, 50,117,149,228, 22,171, 32,
+ 26,205,225,226, 34,104, 77,219, 84,116,109,203,172,149, 57,164,233, 45, 22,135,163, 81, 15,163,120,201,107,103,175, 99, 13, 61,
+116, 99, 89, 24, 47, 50, 47, 75,154,182,193, 55,125,240, 65, 81, 96,202,154, 40,182,184,178,146,138, 47,138,228, 37,176,134,224,
+ 19,156,106,105,170, 74,120, 11, 93,135,119, 14, 87, 9, 12, 58,155, 21, 12,134, 35,154,166, 98, 62,155,203, 51,217,136, 56,141,
+169,102, 5,195,241, 24, 77, 96, 62, 47,165,176, 82,138,182,235,104,157,200, 79,172,181,120, 15, 77,112,216,216,146, 14,135,212,
+187,187,236,205,193,147, 56, 38,120, 49, 67, 0,169,111,235,170,162, 10, 97,191, 51,247,222,227,141,161,154,205, 4,154,243,189,
+113, 72,240,228,217, 0,155, 88,142, 45,122, 88,182,196, 71,206, 81, 94,223,228, 64,100, 40,118, 43, 14,223,119,152,237,237,130,
+137,107,152, 77, 28,179,162,225,206,180, 96, 82,117,196,145,226,192,129, 69,108, 98,185,118,121, 29,140,165,213,138,225, 88,138,
+160,119,174,174, 83, 57,207,177,195,203,100, 11, 75,236,108,108,115,254,204, 25,218,174,225,236,169, 83,180,181,116,228, 85,221,
+ 16, 27,241, 33, 88, 24,143,216, 91,214, 90,158,124,232, 65, 62,244,222,167,184,120,254,156,124,182,192,215,191,253, 93,102,197,
+140,251,239, 61, 75, 18, 11,207, 97, 15, 74, 22,185, 33, 24,212,254,124, 89,107,177,161,221,220,217,165,106, 91,134,121, 74, 81,
+ 36,236, 78,166, 92,189,121,155, 39, 31,121,112,255, 66,239,218,134,155,183,215,120,225, 91,223,225,247,191,252, 60, 74,139,235,
+218,222,202,211,148,149,229,101,150, 22, 22, 56,188,180, 68, 22, 71, 84, 61, 27,188, 85, 98,181,185, 59,153,242,235,191,245, 59,
+124,233,143,255, 4,173, 68,151,189,231,185, 62, 30, 14,185,126,235, 54, 11,163, 1, 93,231,101,164,134,196, 62,162,224,208,129,
+101,242, 44,103,113, 60,164,105, 26, 26,165, 69, 45, 16,216,143, 76, 21,111,117, 67, 8, 74,194,152,246,139, 14,201,112,184,120,
+246, 20,131,108,192,116, 94,112,119, 99,139,219,107, 27, 60,254,224, 3,128, 92,180,117, 85,147,196, 81,207, 31,144,189,214,117,
+ 29,175,189,245, 14, 95,121,225,235,188,113,249, 42,127,214,210, 90,243,119,255,234,207,225, 58, 97, 96,167,113, 76,240,210,177,
+188,252,234,235,188,242,198, 91, 36,214,188, 11,110,223,155,189,106, 5, 79, 60,246, 16,223,122,245, 13,110,220,190,195,249,123,
+207,240,228,253,231,249,224,189,199, 56,180,148,243, 15,175,108, 19, 31, 60,135,223,250, 58, 42, 93,224,238,237,215, 65, 93,225,
+228, 7,150,120,253, 91,151,248, 11,159, 58,193,123, 46,156, 96,251,234, 18,118, 62, 35,184, 17,223,187,253,107,152,223,252,187,
+ 44, 28, 9,124,247, 87, 94,231,246,157,215,217,184,241, 26,143, 61,249,119,136, 89, 33, 9,138, 7, 85,198, 21, 26, 54,232,168,
+ 6,160,199,129,118, 82,113,253,234,175,241,200, 19,255, 4,251, 12, 84,110,135, 39,223,191,200, 19, 31, 41,184,178, 61, 96,237,
+ 69,120,243,102,206,127,241,191,127,140,111,252,198, 38,191,247,111,255, 29, 75,135, 78, 18,174, 4,234,122,135,205,181, 87,169,
+230,119, 24,143, 30,230,241,135, 21, 21,158,221, 78, 81,198,129, 16, 6, 84, 37,180, 87, 59,226,131, 45, 59,238,155,184,111, 93,
+ 96,144, 46,208,185, 9,235,119, 54,185,252,198, 75, 60,251,247, 62,192,195, 23, 46,114,243,235, 95,231,237,223,255, 3,138, 98,
+ 34,151,156,142, 8,157,167,168,103, 56, 39, 40, 94,146,196, 52,117,189,223,232,196,153,161,172, 43, 84, 35, 35, 38,107, 45,206,
+ 73,122,155, 15, 98, 21, 27,199,113,223,181, 54,116, 33,144,198, 63, 32,128,197, 73, 66, 76,130,243,158,214,181,196,217,128,162,
+ 40,240, 94, 10,200, 40, 18,213, 85, 93, 74,211, 6, 66,208, 46,138,130,114, 62, 23,117, 80,150, 98,163, 24, 90,209,131, 43, 27,
+211, 53, 29, 38, 50, 12, 70, 35,138,121, 73,221, 54, 36, 74,100,201,113, 8,146,229, 62, 24,210,204, 43,154,206, 17, 69,110,223,
+232,200, 40,141,138, 98,202,178,100,103,119,135,225,104,132,213,146,152,233, 67, 75,235, 2, 10,136,147, 24, 26,176,177, 65, 57,
+131,111, 42,140, 49,164, 90,138,144,182,146,164, 74,221,105,148,134,186,172, 72,211,140,162,156,147,245,176,121, 23,246, 66,172,
+212,254,216, 35, 77, 19,180, 6,173, 52,214, 40,186, 22,140, 22, 15,253,182,107,104, 59, 48,218,160,172,166,152,149, 36, 89,194,
+104, 48,160,109, 27,178, 36,195, 19, 48, 64,235, 68, 78, 92,150,165,164,131,246,103,144,185,231,212,233,127,209,118, 45,121,146,
+136,137,125,112, 68, 70,230,169, 33, 4,242,193,128,249,188,196,251, 32,240, 45, 34,141,138,250, 42,190, 40, 68, 86,102,209,164,
+153,248,141,139, 5,169, 24,166, 52,109, 77,150,101,180,173,104,219, 65, 32,184,170,107, 72,147,140,121, 81,160,181,161,235,106,
+ 34, 43, 49,164,193,131,178,146,176, 22, 20,232, 32,217,185, 85, 45, 23, 89,231, 28,227,133,133,125,168,196, 90, 75, 85, 86, 68,
+145,101, 62, 47,145,168,209, 78,146,132, 50,113, 78,155, 20, 5,206,121, 49, 76,209,154,214, 59, 33,148,161, 36,164,164,169, 81,
+222,161,148, 65, 37, 9,202,106,218, 89, 65,112,253,191, 83, 98, 92, 19,156, 35,205, 68, 50, 50,200, 7, 12,134, 35,170,121, 73,
+ 64,186, 88,165,228, 32,108, 59, 71,154,164, 82, 17,183,130,110,120, 15,222,139,252,192, 24, 45, 94,218, 74,245, 7,167,196, 78,
+ 14, 70, 3,108, 36, 95,206, 96, 52, 18, 82, 75,127, 56, 42, 20,109,183,167,247, 84,224,122,212, 32,182,178, 65,250,138,115,188,
+176, 64, 28, 75, 42, 94, 93,149,196,145,165,170, 42,230,243, 57, 54, 18, 43, 82,133,204,157, 66, 8, 20, 69, 65, 85, 85,253,104,
+ 66,226, 7,231,179, 57, 81, 44, 16,113, 80,138,241,194, 2, 33, 32,151,138, 86,196, 81, 66,108, 13, 45,142,224, 97, 60, 26, 73,
+ 48,194, 64,224,254,182,235, 24, 13,135, 36,177,152, 47, 88,107,153, 87, 37,143, 28, 55,252,211,103, 15,160,171, 6,134, 9,147,
+181, 25,151, 39, 45,247, 28, 95, 36, 51,210, 73,230, 73,204,242,193, 5,186,174, 99,107, 86,179, 51,235,208, 26,246, 36,102, 55,
+ 54,167,140, 53, 68,163,148, 91,243,138, 99, 71, 14,160,124,199,218,214,132,241,161,227,216, 19,143,176,188, 48,102,107,119,151,
+181,141, 77,140, 86, 44, 45, 46,162, 16, 43, 99, 31, 2,183,239,174,243,237,239,189,198,238, 76,180,224, 43, 75,139,220,123,230,
+ 36, 71, 15, 29, 98,105, 60,139,139,172,119, 0, 0, 32, 0, 73, 68, 65, 84,162,115,158, 59,171,235,124,241,185, 23,120,253,237,
+ 75, 92, 60,119,134, 56, 22,133, 68,158,103,162,123,245, 93,207,236,223,123, 47, 68,122, 98,181, 97,109, 99,131, 43,215,111,242,
+202, 27,111,208,118, 29, 39,143, 31, 67, 41,120,252, 61,247,115,248,208, 10, 74, 41,202,178, 1, 45,146,196,229,165, 69,222,190,
+114,109,255, 98, 2, 33, 76, 94,187,125,139, 83, 71,143,114,226,216, 81,146, 56,197, 7,135, 67,244,227, 1,120,251,202, 53,190,
+246,205,111,113,253,214, 42,117, 43,233, 93,135, 14, 44,243,240,197,251, 56,125,207,113,142, 28, 92,225,208,242, 50, 54, 50, 40,
+ 52,179,162,160,236, 17, 20, 33,243,196,228,121,142,181,226,155, 93, 85,226, 58,232,189,200,247,234,170,162,115,129,171, 55,110,
+113,229,214,109,110,221, 89,101,214,135, 99,164,113,204,211, 79, 62,198, 79, 62,251, 33,126,228,177, 71, 56,117,252, 24, 7, 22,
+ 23, 88, 88, 24, 51,239, 11, 79,239,101,134, 46,102, 35,226,190,168,128, 51, 39,142,243,206,245,155, 92,190,118,131, 31, 94,143,
+ 62,112, 63, 15, 93, 56,207,229, 27, 55,248,169,143, 63,203,169,147,199,233,218,134, 36,142,241,206,243,230,229, 75, 20, 69,197,
+239,124,225, 75,124,247,181, 55,251, 3,243,221,171,115,142, 44, 77,121,255, 19,143,242,157,215,223,228, 99,239,123,140, 95,250,
+232,251, 24,159, 60,205,175,110,182,172,220,255, 44,199,142,222,199,139,191,251,235,184,162, 99,118,103,155,248,158,154, 52,177,
+236,110,214, 52, 15, 62,200, 79,221,223,241,226,151, 15,226,210,183,105, 26, 75, 83,236, 50, 81,175, 49,172, 31,227,254, 95, 60,
+ 4,119, 78,243,137,159,249, 40, 79,189, 55,231,101,173,240,195,146, 57, 26,255,102,198,246,215, 82,118,239, 40,154, 29, 77, 93,
+ 40, 86,239,190,200, 79,253,226,251,249,229,159,115,220,169,115, 46,126,180, 33,197,179,144, 26, 78,156,107, 73,189,230,187,159,
+ 77,232,218, 5,182,107,197,157, 75, 47,225, 66,199,189,143,126,154,195,135, 31,229,224,209, 21, 46, 60,253, 75, 60,249,151, 74,
+ 94,233,198,172,126, 45, 80,108,109, 51,153,222,164,174,118,232,234, 9, 21, 19,182, 54,111, 17, 85,135,169,154,154,217,228, 58,
+211,233, 13, 54,215,175,177,184,226, 57,120,241, 2,201,129, 3, 28,185,112, 63,211,155, 55,169,166, 19, 92,112, 12, 7, 66, 98,
+171,235, 70,152,237,168, 30,238,214,236, 69, 69, 91, 43,179,104, 99, 45,170, 47,220,173,149, 68,207, 40, 18, 47,143, 16,130, 92,
+140,113, 76, 8,162, 13,223,243,209,104,234, 22,148,199, 96, 33,136,239, 66,158,231,162, 74, 42,107, 80, 90,206,138,180, 87, 69,
+ 41,241,126,183, 54, 2,223,187, 24,182, 29,193, 24,130,119, 56, 15,179, 98, 38, 90,123,231,208, 90, 17,153, 8,173,229, 29, 44,
+138, 2,165,165, 64,109,218, 22,107, 12,202,104,217, 67,190,143, 82, 86, 10, 3,248, 32,234,161,186,105,240,190,219, 15, 8,114,
+174, 5,175,168,219,154,186,110,241,248,158,103,208,107,199,219, 86,172,208,179,132,174,237,208, 70, 9,233,206,119,194,245,242,
+129,166,173,169,234, 26,143,100,146,212, 85,141,239,156,248, 7, 68,113, 79,178, 53,100, 89, 70,211,180,251,168, 5, 94, 46,117,
+239, 61,218,168,254, 61,172, 17,137,184, 34,141, 34, 65, 68,230, 37,174, 31, 3, 39,177, 52,171, 16, 48,103,238,189,247, 95, 4,
+ 68,170,211, 57,135, 65,161,140, 84, 64,131,129,196,211,165,105, 74, 28, 9,115,213, 40, 67,156,198, 68, 61,227,218, 88, 75,221,
+ 84,168, 32,155, 1, 37,158,194, 62,132,158, 36,213,146,101, 41,105,154,146, 38,146, 65, 94,204, 75,226, 36,162,174,106,134,163,
+ 33, 74,107, 36, 8,165,235, 9,107, 2, 43,196,113, 34, 17,166, 94, 98, 97,211, 36, 37,142, 83,210, 36, 66,161, 41,155, 18,107,
+236, 62, 60, 35, 95,166,196,126,182,141,176,238,187, 78, 14,170, 16, 2,113, 26, 67,128,186,105, 48,214, 96, 35, 43,158,240,229,
+ 28, 81, 28,123,241, 38,118,142,208,121,240, 14,237, 29,161, 19,153, 86,232,187,249,206,181,189, 60,164, 55,127, 25, 14,101, 19,
+ 26, 35, 5,143,213, 68, 86,152,142, 77, 93, 19, 69, 49, 74,137, 29,224, 96,144, 17, 69, 9,157,151,248,215,170,239, 32,247,204,
+253,247, 42,225, 56, 21, 8, 81,136, 38, 34,111, 51, 70,147,196,169,144,141, 98,201,180, 79, 83,145,236,165, 73, 74,146, 36,189,
+247,179,140, 13,186, 32,210, 15,109, 35,154,170,162,115,142,186, 44,169,189,167,154,205,228,231,151,194,102,199, 43,218,182,166,
+169, 36, 26,208, 70, 18, 0,163, 8, 88,107,137,226,132, 56, 22,103,184,124, 56,144,240, 25,160,173, 91,140, 49, 12, 70, 67,234,
+174,193,117, 45, 73,146,226,188, 16,240, 58,215, 71,106, 58,199,133,227, 41,255,250, 23, 14, 99, 38,115, 56,182, 64,245,230, 29,
+ 94,248,246, 77, 50,173,216, 94,157, 50,155, 87, 28, 61,177,204,247, 46,111,177,180, 52, 96,101,101,140,153,149,160, 3,211, 54,
+ 80,151, 29,149, 3,213,182,140,148,112, 54, 34, 99, 88,157, 52, 52, 65,225,234,150, 93, 63, 38,189,231,126,234,170,226,157, 43,
+215,248,192,143, 60,206, 7,158,124,140, 98, 94,226, 93,160,238, 90,118,103, 83,222,186,114,141,111,188,242, 61,246, 36, 88,214,
+ 90,238, 59,125,138, 7, 46,156, 35, 73, 18,118,119,119,249, 87,255,230,255,228,202,141,219,156, 63,125,146,251,207,223, 75,192,
+ 99,148, 34,142, 4,177,168,155,150, 14,241, 82,104,157,239,173,122, 21,119, 55, 54,248,198,183,191,207,139,175,124,143,186,172,
+ 9,192,210,226, 2,207, 60,245, 4,239,125,244, 81,178, 76,120, 42, 85, 83,115,227,246, 93, 46, 95,191,201, 75,175,124,247, 93,
+ 76,121,173,224,211,159,248, 40,255,248,151,255, 22,239,185,112,158, 73, 49,163,110, 91,108, 47,169,116,125,199,123,103,109,131,
+ 83, 39,238, 97,105,113,196,180, 40,122,111,111, 56,127,246, 20, 63,250,212,147, 92, 60,127,142, 3,203,139, 12,178, 92,242, 17,
+162, 72, 56, 22, 73, 66,150, 74,108,234,158,146,165,109, 91,202,170,198, 7,233, 26,246,238,203,189,121,252,193,165, 5,214,182,
+119,184,210,203,230, 66,240, 60,250,192, 69, 30,121,240, 1, 78, 29, 59,194,193,149,101,210, 52,161, 44, 43,138,249,156,121, 15,
+203, 14,178,108,191,224,126,227,210, 85,254,224,249, 23,248,245,255,240,255,112,249,218, 77,218, 31, 58,204,146, 52,230,239,255,
+226, 95,166,110, 26,214,183, 39, 60,253,196, 35, 44, 12,135,100,105,198,242,226, 2,198,104, 94,123,251, 10,191,245,249, 63, 96,
+123,103, 71, 84, 8, 63,180,100,188,165,176, 81,196,218,198, 38, 31,121,250, 71,120,232,220, 73, 62,118,246, 24,238,190,251,249,
+239, 46,223,226,208,217,247,242, 96,125, 31,201, 84,177,182,170,112,217, 14,167, 79,125,152,144,237, 98,188,103,102,103,220,252,
+146,225,131,127,238, 32,241,131, 67,110, 60, 55,161, 93,154, 83, 77,230, 56,213,144, 44,150,164,151,207,112,225, 17,195,135, 62,
+212,224,142,196, 68,163,130, 11,196,220,104, 18,166,135,119, 89, 63,152, 18, 94, 87, 84, 46, 80,236,108,179,122,231,219,188,241,
+234, 27, 92,237, 46,112,241,169,132,197, 92,116,205,101,168,153,105,199, 36, 41,113,183, 50,254,248,181,127,205,179,255,232,103,
+249,204, 63,120,130, 79,254,149, 31,225,195,207, 46,112,236,147,247,112,248,201, 71, 97,235, 46, 69, 50, 38, 73, 34, 54,190,163,
+216, 90,187, 75, 61,223,160,169,119, 41,231, 59,120, 61, 97,178,118,139, 60, 62,135,243, 80,206,215,152, 78,110, 81, 79,111,147,
+100, 53,199, 31,188, 72, 51, 47,209,113,202,241,135, 31,129,106, 78,181,185, 73, 20,217,126,174, 30, 75, 33,215, 27,103, 69,145,
+216,128,167,169,152, 7, 89,109, 8,136,219, 28,200,236,121,255,115, 55,154,160,250, 4, 51, 39,100, 94,101,164,136, 52, 86, 20,
+ 20,109,235,228,255,137, 13, 6, 69,219, 73,167,158,246, 42, 31,231,189, 52,110,173,116,247,243, 66, 92, 69,155,174, 33, 77, 82,
+ 68,242, 41,217,237, 98,101, 43, 92,173,178,148,200,227,170,174,136,172,149,182, 81, 9,135,165,235, 58,178, 60,199, 70,194,214,
+ 55, 61,226, 36,169,107,209,126,179, 97, 35,131,247, 10,163, 85,175, 58, 82, 52,181,152,236, 24, 43,114, 57,171, 34, 90,223,137,
+ 52,218,121, 76, 18, 99, 35,205,222,172,187,109,228, 50,175,234,154, 36, 75, 9, 65, 92,245,140,214, 40,132, 7, 16,199, 17, 1,
+ 25, 71,181,173, 52,181,194,115,242,196,169,248,181, 40,163,247, 97,255, 44, 77, 81,202, 96,180,218,127,223,172, 86,116, 72,234,
+169, 60,127,140,115,162,100,144,239,197, 98,147, 36, 37,215, 18, 0,162, 80, 44, 46,141, 49, 38, 66, 43,153,243,213,243, 10,175,
+ 68, 42,224,189,124, 96,174,233,112,157,216, 96, 58,231, 48, 74, 30,102, 54,155, 74,133, 20,196, 57, 43,201, 36,242,179,170, 29,
+145,145,206, 34,138, 98, 70,227,177,200, 8,140,103, 94, 86,242,133,181,142, 44,143,161,131,166,110,100,134,216,182, 68, 73,132,
+213, 25, 93,215,201, 37,210,212,251, 29, 82,150,231, 76,167,194, 72,175,235, 90, 36, 56, 74,114,202,199,227, 49,206, 57,118,118,
+118, 72,123,187, 85,215, 58,130,250,255,168,122,211, 88,203,178,243, 60,239, 89,107,237,241,204,247,222,170, 91,195,173,169,107,
+232,170,174,234,169,186,155,205,166,154, 51, 41,153,163, 72, 73,212, 96,203,176, 4, 7,177, 29, 72, 78,144,252, 9, 18,248, 7,
+129,196, 72,144,193, 1,108, 35, 65, 16, 40, 48, 98, 8,134,172,216,146, 40,137,164, 68,138,115,179,155, 61, 86, 15,213,213,213,
+ 93,243,116,231,225,140,123, 90,123,173,252,248,246,189, 98, 14, 80,232, 31, 85,125,207, 61,231,236,179,215, 90,239,247,190,207,
+235, 64, 41,108, 89,225,195,128,186, 42, 9, 7, 61, 92, 86,224, 74, 7, 65, 64,171,215,199, 40, 24, 77,167,248,218,162,146, 0,
+109, 66, 18, 99,168,112,152, 70,194,156,102, 2,194,137,162,184,201,125,202,236, 85, 16,185, 51, 64, 19, 54, 52, 34,235, 28, 74,
+ 5,140,199, 51,210, 52, 33, 48, 10, 23,199,146, 55, 71,129,119,114,234,243,224,113,148,121, 37,198,140,170,196, 4, 34,137,197,
+ 73, 66, 85,228,228,121, 73, 18, 71, 68,145,180, 8, 69, 97,140,199,145,101, 57, 38, 12,168,242,146,218,215,205, 13, 53,145, 11,
+ 93,107, 58,105,202,120, 58, 69,141, 70,224, 61,114,165, 75, 75, 26, 85,137, 52,255, 90,146, 48,197, 4,187,108,255,148, 34,207,
+ 69, 66, 85, 96, 66, 41,127,241,181, 72,242, 50, 27, 50,148, 85,221,176,255, 97, 60, 25,209,105,119,154, 83,167,195, 53,114,214,
+239,127, 34, 37, 24,213,248, 78,194,242,207,110,242,131,159, 92,167,221,107, 99,125,205, 96,177, 67,105, 45, 87,223, 91,163,104,
+165,220, 29, 23, 20,171, 83, 86, 55, 11, 58,113,128,179,142, 35, 7, 98,110,109,207,232,104,197,194,254, 30, 53, 10,159, 89, 22,
+ 18,184, 55,181,168, 72, 49,216,183,159, 52,137,121,225,229,183,248,214, 15,126, 76, 81, 85, 92, 56,115, 70, 12,109,174,198, 57,
+145,165, 23, 6, 18, 15,219,108, 28,220, 71, 15, 31,226,196,177, 35,180,211,148,178, 42, 57,184,127, 31, 23, 31,189,192, 31,253,
+249,183, 64, 41,110,221,189,195,225, 3, 7,161,149, 48,153, 73,254, 31, 64, 21, 18,107,195,139,185, 76, 43,205,202,218, 6, 63,
+125,245,181,255, 95,101,168, 54,154,135, 79,158,216,203, 89, 59, 47,204,248,126,167, 77, 20, 73, 86,251,231, 31,231,206,156,166,
+211,110,113,127,121,149,125,131, 30,175, 93,126,151,141,205, 33,167,142, 31,225, 19,207,125, 72,190, 99, 78, 72,135, 63,124,241,
+103,188,252,246,187,236, 52, 6, 59,231,225,221,171,215, 56,125,228, 8, 79, 94, 56, 71, 18,202, 6, 51,138,130, 61, 37, 64,164,
+ 86,185,161,238,150,108, 84,181,100,155,173,149,215, 81,217, 10,101, 26,185,213,123, 94,121,251, 50,183,126,238,100,125,246,212,
+ 67,156, 58,113,140,162, 40,216,254,185,134,187,105,150, 81,215, 53, 73, 20, 17,104, 77, 85, 21,108,108,101,220, 91, 89,227,218,
+205, 91, 76,178,156,162,170, 25,142,199,164,105,202, 63,249,237,223,224,238,131,101,126,242,202,235,196,105,204,210,225, 67,252,
+250, 23,127,145,118, 75,188, 42,157,118,139,241,120,202,226,226, 2,199,143, 28, 2,239,246, 16,186, 63,255, 8,130, 64, 22, 27,
+239,152,235, 47, 48,151,134,252,183,191,243,219,252,171, 91,247,248,118,112,138,207,252,234,111,208,115,112,184, 5,151,223,208,
+ 60,244,249, 37, 6,219, 31,229,208,103, 15,243,157,127,209,197,219,159,225, 70,235, 12, 55,127,196,255,240,191,124,136, 47,253,
+151,158,135, 31,254, 36, 55,236, 79,169,247, 77,201,242, 49,107,179,235,164, 75,251,137,151, 31,231,210, 56,161,211,181,188,243,
+ 39,109,190,240, 21,207, 91,225, 20,187,222, 39,177,158,173, 20,220, 20, 50, 63, 69,123,205, 35,207,126,137,131,189, 46,243,139,
+ 21,181,106,209,242, 51, 22,116, 76,225,193,228, 49,171, 78, 17,110,244, 41, 94,200,104,253,122,139,162,140,217,140, 50, 92,165,
+176,151, 60,213,214, 1,174,127,235, 18,118, 27, 86,183, 53,206,230,148,217,144,186,154, 82,102, 19,170,157, 21, 58,189,148, 90,
+205,176,211,154,188, 24, 83,229, 59, 84, 46,103,231,218, 10,161, 43, 8, 90,210,152,166, 12, 28,255,212,167,241, 42, 96,227,221,
+119,176,174,162, 46,228, 32,161,140, 34,159,230,120, 60,113,146,160,117, 64,150, 77,240,181, 44,122,104,129, 70,201, 88, 77,174,
+165,186,150,150, 48,165, 20, 69, 89, 99, 66, 69,164, 3,156,134,160, 33, 71,186,154,166,161,173,148,195, 71, 16, 82,185,154,172,
+200, 8,117, 68, 24, 5, 88,229, 8,131,128,241,112, 72,156, 36, 40, 20,237,118, 87, 24,236, 74,137,209, 52, 47,136,162, 4,144,
+231, 47,138, 98,207,109, 63, 28,142,196,165,239,133,103, 16,132,162,176,230,121, 69, 24,106,134,195, 17, 73,146, 48,155,137,170,
+ 27,198,205, 56,203,104, 90,105,194,116, 60, 38, 43, 10,226, 36, 38,140, 35, 57,189,123,161,235, 69,122,215,104,106,137,211, 72,
+154,219,208,120, 95,211,110,181, 41,109, 9, 78, 99,156, 69, 41, 41,220,154, 85, 5,210,178,230, 1,143,247, 10,188, 71, 7,162,
+ 16, 79,167, 83, 60,158, 52, 73,246, 20, 68,175, 60,206,122,218,237, 20, 91, 8,152,199,123,143, 64,104, 68, 97, 11,189,167,174,
+196, 67,146,166, 41, 65,144, 80, 22, 2, 61, 83, 90, 17,136,105,172,102,126,110,110,239,201,140, 17,204,158, 54,134, 36,149,156,
+180, 2, 20, 34, 21,214, 86,161,226, 64,226, 9,214, 33,155, 54, 37,174, 7, 45,192,211,201,120, 76,145,231,180,187, 29, 66, 19,
+ 48,203,102, 40, 20,181,243,141, 99, 82, 62,112,173,161,180,130, 67, 45,242,130, 86,218, 34,203,103,212,153, 84,139,182,187,109,
+177,235,231, 57,161,145,211,105, 68,136,245,142,233,108, 74,156,164, 68, 70,227,148,107,230,214, 70, 22,237, 74, 98,119,237,118,
+155,162,144, 17,128, 49,130, 59,245, 74, 73,169,188,243, 12,230,230, 41,203,130,202,123, 76,171, 77,191,211,145,211,184,149, 66,
+ 13, 19,134, 13,152,223, 54, 51, 73, 8,146,132, 26,168, 93, 77,167,221, 2,106, 84, 24,144,132, 9, 14,135,171, 4,177,106, 66,
+ 67, 62,203, 81, 72, 37, 95,171,213, 34, 43,144,153, 75, 32,241,191,178,170, 4, 14,225, 20,179,166,155, 61,138, 18,234,186,162,
+214,154, 94,175, 39,239,151, 82,120,231, 24,141, 70,236,214, 83,182,124, 10, 94,177,189,189,141,115,130,156,149,249,167, 35,136,
+ 34,140, 87, 84,149, 37,136, 34,162,184,201, 92, 55, 55,110,226, 24,202, 18,156, 5,235,113,117, 13, 90,163,125,205,116, 60, 69,
+199, 82,172,209,233,180,136, 91, 45,138, 60,167,246, 66,140,195,203,162, 48, 30,143,201,139,130, 36, 77,165,205,205, 86,152, 32,
+160,219,238, 50, 28, 15,137,130, 0,175, 21,173, 40, 37, 12, 20,199,146, 16, 52,168,194,241,198,219, 43,244, 15,116, 49, 24,230,
+ 83,195,212, 91,236,250,136,238, 92,151,253, 70,177, 98,165,134,176,172, 42,124,172,137, 59,154,237,202,177,216,142,104,121,199,
+129,195, 3,148,175, 25,205, 42,214, 39, 5, 40, 71,156, 24, 14, 28, 62,202, 95,189,248, 50,127,252,231,127,201,234,198, 38,115,
+189,110, 35,185,149,148,149,197,213,150,173,225,136,247,110,220,100,123,231,111, 43, 61, 15,236,155,163,215,105,145,103, 37, 30,
+ 89,164, 55,119,134, 56,231, 24, 78, 38, 28, 90, 60, 64, 96,116, 67,135,146,215,175,180,240, 0,234, 90,230,208, 89, 94, 16, 69,
+ 1,251,231,230,248,248,115,207,240,234, 91,239, 74,129,145, 82,204,117,187, 28, 95, 58, 4,138, 70,222,182, 24, 19,178, 49, 28,
+241,202, 27,111,178,186,182,206,207, 63,214, 54,183, 88, 93,223,228,232,210, 18, 89, 89, 17,152,128,183,223,123,143, 31,191,252,
+ 50, 65, 16,240,216,185, 51, 84,182,230,237,119,175, 10,229, 80,137,167, 65, 43,120,236,225, 51,124,229,115,159,225,216,225,195,
+ 24,165,152, 21, 57,117, 19,195, 83,205,185, 88, 41,201,196, 58, 39,114,170,173, 69,213,170,172,148, 89,224,100,196,166,148, 66,
+149, 21, 31,220,184,201,194,160,223,196, 67,229,241,236,147,143,243,200,169,135, 72,226,132,218,213,123,244,183,221,140,127,191,
+219, 38,137, 19,194, 64,138,105,130,181, 13,174, 92,187,201,207, 46,189,185,247, 51,178, 44,227,245,203,239,242,143,254,238,111,
+208,237,116, 41,202,138,115,167, 78, 48,156, 76,169,109, 77,146, 36,236,159,159,227, 39,175,190,206,127,247, 47,255, 15, 62,250,
+236, 51, 66, 96, 12, 4, 39, 90, 86,146, 32,208, 90,203, 38, 34, 8, 56,123,242, 56, 39,143, 28,230,183,158,125,148, 63, 88,219,
+230,221,197,231,249,252, 83, 79,241,181, 1,252,137, 85, 96, 70, 92,157,188, 69,111,249, 34,203,179, 0, 51,132, 36,254, 8,203,
+ 27,223,165,123,120,145,104,238, 41, 30,188,251, 45,254,244,159,127,140,143,255,126,155,163, 47, 61, 79,112, 36, 96,109,120,131,
+233,120,147,187, 15,126,138, 58, 81, 48,254,246,121, 78,253, 90, 27,245, 17,120,153, 9,199, 49,220,222, 55, 68,189, 50,192,110,
+123,214, 86, 87,184,121,245,155,116,187,199,120,254,107,135,184,252,141, 26,151,133,180, 91, 50,103,173,128,241, 78,200,164,242,
+204,214, 21,249, 84,115, 96, 95,202,198, 79, 61,135,159,243, 82,217, 25,230,232, 15, 39,184, 91, 26, 55,105,161, 30,186, 77,118,
+231, 3,182, 87,161,182, 83,202, 98, 19,197, 22,170,220,102,233,244,211,180,188, 98, 56, 27, 82,230,219,104, 95,163,169,153,236,
+ 76, 48, 58, 32,216,127, 1, 51,155, 50,219,186,134, 41,106, 78,127,230,211,100, 91, 27,108,221,190,133,197, 66, 73, 99,242, 18,
+ 80, 77,228, 61, 89,150, 19,234, 16,111,100,228,163,188,172, 3, 90, 43,130, 72,218,206,112, 30, 33, 94, 66,171, 45, 17,174,170,
+217,244, 87, 85, 73,237, 61, 97, 24, 0, 6,231, 5,111,154, 91, 75, 16, 70, 40,165, 41,203,156, 98, 55, 69,233, 37, 30, 7,226,
+135,210, 70,209,233,244,152,101, 51,180, 21, 21,160, 40,132, 88,167, 3,213,156,180, 67,146, 56, 98, 50,153, 82,149, 21,131, 65,
+ 95,212,138,188,108, 64, 93, 33, 98, 51,145,180,142,110,174,187,162,144,126, 13, 81,121, 51,226, 84,224, 76,211,233, 12,188, 36,
+120,146, 52, 37, 14,165,232,198, 24, 67, 18, 39,104,165,153, 76,166,120,239,136,195,144, 56, 77, 8,116, 32, 41, 40, 15, 85, 81,
+162,180,168, 2, 74, 25,140,169, 9,180,192,194,148, 18,192,151,242,158,184,149,160,240,100,179, 76,156,241,113, 72, 89, 57,116,
+ 68,163,214,166,204,242,137, 28, 24,172, 0,107, 64, 73,143, 74, 16,160,117,192,184,241, 71,116,187,109, 64, 24, 48,230,161, 51,
+103,190,222, 74, 99,116, 20, 80,219,166, 61,167, 16, 70,174, 45, 45,227,241,136, 60,207, 49, 90,203, 34, 26,135,104, 35, 11, 71,
+ 86, 22,164,137,104,249, 85, 85, 82,213, 22,235,100,151, 47,243, 22, 1, 14,104, 52, 73, 26, 19,199, 9, 26,141,214, 30,163,164,
+118, 51,142,147,189, 57, 77, 24,134,248,210, 50,157, 77, 37, 75,238, 29, 69,150,147,101,210, 68, 83, 86, 37,202,104,180, 50,104,
+ 45, 50,168, 81, 26,175,197,136,230,125, 3, 9,177, 53, 56,203,116, 58,145,216, 89, 96,240, 90, 34,105,114,129,133, 36,105, 74,
+218,106,161,209,130, 3, 12, 3,186, 29,169,199,139, 34,233,140,175, 75,185,240,226, 56, 34, 8,197,172, 22,197, 82, 95, 42, 25,
+118, 40,138,146,170, 20, 28,161,245, 78,162, 25,174,166,211,105, 19, 24,105, 84,139, 99,145, 97,156, 23,127, 64, 24, 4, 12, 71,
+ 35,138, 82,164,156,178,148,190,245, 60,147, 29,114, 59, 77,165,117, 14, 57,205,149,133,244,203,187, 38,215,168, 43,137, 0,162,
+ 20,210,107,111,169,189,163,174, 45, 81, 20, 82, 90,233, 10, 54,129,220,194,203,170, 32, 52, 1,217,108,134, 43, 75,112, 78,200,
+111,200,226,132,131,164, 97,144,123,231,240, 10,218, 29, 49, 79, 41,173,165,231,216, 9,121,202, 89,105,233,114,222,211,106,181,
+196,163,160, 20,217,108,134,215,178,153, 42, 43,193, 83, 86,101,133,242, 96, 93,141,114,150, 95, 28,204,232,183, 67, 70, 43, 27,
+172,110,103, 92,190, 61,100, 33, 9,248,204, 87, 47,114,237,210, 29, 90,161, 66,185, 26,141,167,152, 9,111,252, 55, 63,247, 4,
+ 79, 62,114,152,160, 42,184,180, 81, 48,208, 80,100,150,253,139, 29,214,134, 25, 87,223, 93, 33, 9, 20,251,186, 9,105, 89,177,
+239,153,207,147,121,153, 29,223,190,191, 76,150,229, 92,124,244,188,220,104, 42,139,117, 53, 97, 24, 96,109,205,234,250, 22,195,
+241,152, 36, 73,120,244,220,195,180,211,132, 52,137,153,229, 5, 87,174, 93,231,238,253,101,134,147, 9,157, 52,101, 99,123,167,
+185, 38,197, 23, 33,134, 54,217,160,218,170, 34, 47, 42,102,179, 25, 97, 16, 96,157,227,237,171, 31,176,186,182, 78, 43,141,233,
+245,186, 92,188,112,142,135,142, 29,193, 24,131,171, 93,227,124, 23,185,238,206,253,101,150,215,183,104,110,107,128,196,129,246,
+ 45, 12, 88, 58,120,128, 99, 71, 14,242,228,249, 71, 88,152, 27,176, 51,154,176,188,182,206,160,221,161,149,198,164,105,139,155,
+247,238,115,227,246,109,106,231,152, 27, 12,216, 55, 47,115,237,253,243,115,196, 81, 36,167,128,102, 3, 89,213,174, 25,171, 64,
+ 16, 72,148,169,174,101,246,184,203,249, 14, 67,169, 84,149, 58,224, 12,175, 60, 63,126,245,117,254,227, 55,191,203,221,101,193,
+215, 62,117,225, 28, 79, 63,254, 40,131,110, 71, 70, 1,205,168, 75, 33,210,103,175,211,226,228,209, 37,230,251, 61,217,144, 7,
+134,215,223,124,135,245,237,109,225, 86, 52,180,195,135,142, 31, 37,208,134,253,115, 3,158,188,112,142,178, 44,200,203, 10,156,
+ 35, 77, 98,226, 40, 38, 12, 3,150, 14, 30,224,219, 63,124,129,191,248,238,247,153,204,102, 20,101, 69,191,223, 99,105,113,145,
+173, 29, 49,115, 42, 5,157, 78,139,165, 3,251,248,239,255,254, 47,243, 29, 23,242,103,171, 37, 15,151,191,198,129, 68, 49, 60,
+ 0,104,184,185, 12,107, 63,140, 56, 50,183,143,216, 5,220,248,171, 7,172,221,124, 13,142,239,112,240,228,195,156, 59,244, 5,
+206,124,248, 12,151, 95,251, 17,119,223,128,197,191, 51, 71,111,115,137, 96,120,136,120, 62,199, 71,154,113,182, 69,181, 48, 98,
+188, 81,114,124,255, 2, 73,187,224, 21, 66,222,186,222,230,254,223,192, 91,175,254,136,123,215,126,138,241,134,231,191,242,187,
+ 12,239,193,213, 55, 94,228,200,147, 71, 8, 59, 83, 20,158,150,138, 25,221, 11,248,224,167,240,226, 75, 63,196, 5,251,249,248,
+239,205, 83,119, 35, 76, 58,166,174,218,228,111, 5,108, 41,207,240,186,165,202, 55,176,227,140, 96,223, 42, 97,125, 0, 19, 44,
+ 16, 39,154, 32,210,116,250, 7,233,117, 79, 17, 31,177,148,163, 25,217,108,140,181, 5,206, 91, 66, 3,243,135,218,116,118,158,
+160, 51,137,184,249,102,201, 68,223,199, 79,199, 12, 78,156, 32,223,222,193, 78, 38,236, 22,249, 24, 19,162, 60,104,163,168,189,
+148, 13,129,108,214, 0,188,149,186,103, 87, 75,226,105,214, 44,144,202,123, 60, 66, 80, 11, 76,128, 86, 30,191, 27,142, 80,186,
+249, 33, 30, 95,203, 38, 76, 27,133,243, 18,219,149,222,247,148,162,144,197,180, 44, 69,165, 85, 14,208,134, 36,137,241,202,131,
+115,114, 64,177, 53, 56, 47, 5, 69,222, 55, 99, 89,241, 17,121,239, 69,149,171, 42,156, 83,196,113, 66, 24, 6, 77, 68,204,130,
+210,178,126, 68, 50,142,202,139,138,218, 85,212,181,124,143, 59,173,142,156,182, 93, 77,171,149, 96,109,133,148,188, 72,229,112,
+ 16,232,189,145,148, 54,138,241,100, 2, 90,206, 71, 26, 5, 10,194, 88,126,159, 56, 22,178,163, 54,186,153,127, 75,115,157, 9,
+ 4,218, 86,149,149,252, 61, 74, 76,126, 97, 40,108, 19, 68,110, 79, 98,241, 22, 24, 99,192, 75,218, 76,107, 69, 89, 74,115, 98,
+104,196,171, 85,150,229, 30, 9,214,156, 57,247,200,215, 77, 24,201, 41,220, 57, 38,179, 9,206, 59,202,178, 36, 47,114,234,186,
+217, 85, 86,226, 22, 47, 75,105,185,153, 76, 38,242,161, 54, 50,155, 68,186, 12,187,185,228,162, 44,247,130,249,129, 49,212,206,
+ 99,140, 97,150,101,224,100,190, 93, 85, 21, 97, 28,224,107,133, 87, 14, 85,215,140,198, 35,148,247,180, 58, 29,130, 64, 78,106,
+ 74,203,233,219,215,150,162, 40,201,203, 2,213, 48,199, 37, 78,209,100, 34,203,146,217,108, 74, 62,203, 40, 10,121,209,165,173,
+132, 58,132,194, 4,242,187, 77,167, 83,164,194, 46, 0,133, 20,164,152, 6,220,111, 52,101, 85,237, 93,152,187,109, 82,182,150,
+147,127, 24, 72, 78,191,215,235, 34, 99,134,230,228,163, 27,102,178,247,205,191,147,114, 14,107,197, 36,231, 61, 76,178,169,176,
+174,157,144,149,148,214, 34,189, 34,181,125,222,123,210, 36,197,132,134,217,108, 70,183,221,197, 3,133,173,152,141, 39,100,121,
+142, 49, 1,212, 22,175, 37, 74,166,144, 44,111, 89,138,145,194,218,122, 79,161,136,227,152,233,116, 38, 6,168, 66,124, 5, 38,
+208, 96, 12, 38,140, 9,210,148,164,211,161, 86,154, 42,203,209,157, 20,103, 29, 73,183, 39, 78,205, 64,162, 44, 73,154, 74,227,
+ 90,158, 33,228, 35,143,173, 36,166, 86, 89,139,210, 82, 18, 83,217,154, 64, 75,157,163, 9, 52,214,137, 99, 94, 42, 32,107,190,
+252,108,143,254,129, 46,223,250,246, 59,204, 47,244,184,183, 57,230,203,207,157,128,201,140,247,111,109,227,203,138,153, 87,220,
+220,156,225,188, 32,130,215, 39, 5,104,205,141,229, 9, 3,155,115,122,169, 79, 61,155, 49, 28, 22,244,230, 90,140,119, 50, 86,
+103, 37, 65,229,136,181,162,117,225, 19,188,248,230,101,254,248,155,127,205,252,160,199,151, 62,243, 73, 14, 31, 88,100,151,230,
+167,144,108,249, 44,207,184,245,224, 62, 27,155,219, 88,107, 57,184,111,158,179,167, 30, 34, 8, 67,226, 32,164,219,233,240,199,
+223,252, 43,105,109,235,117, 57,118,228, 16,221,118,202,129,197,253, 50,122,153, 78, 24, 78,166,220,185,191, 66, 86,136, 95,193,
+121, 79,175,219, 97,115,123,139,239,253,228,103,172,111,111,147,198, 9,135, 15,238,231,212,241, 99, 28, 59,124, 24,239, 61, 69,
+ 41,209, 22,219, 48, 6, 14, 44,238,103, 52,157,176,186, 46, 13,103,199,150, 14,243,249, 79,125,140,103, 30,127,148, 67, 7, 22,
+ 89,152,235,147, 21, 5,255,219,255,245,111,200,242,156,163, 75, 75, 28, 91, 58,140,209,154,237,209,152,235,183,110,115,127,101,
+ 21, 91,215,116,219, 45,206,157,122,136,163,135, 15, 50,215,239,129, 19,112, 78,101,107,234, 90,230,150,182, 81,126, 52,138,210,
+138,169,115,151,190, 21, 26,197,234,218, 22, 47,188,254, 6, 87,222,191,206,149,107,215,177,117,205,161,253,251, 57,251,208, 9,
+214, 54, 55,169,107,199,115, 79, 63,205, 99,231,206, 16, 24,217, 32,217, 74,148, 29,163,164,254,114,208,239, 73,140, 21,207,234,
+198, 54,255,246, 63,252, 41,255,230,255,253, 51,238,220, 95,102, 50,157, 17, 6,134,231,159,190,200,243,207, 92,228,217,139, 79,
+ 64,179,153,181,206, 51,153, 76,232,180,219,244,186, 93, 60,158,209,120,194,189,213, 53,250,157, 54, 63,187,244, 22,213,110, 66,
+192,123,142, 46, 29, 34, 77, 83,182,119,134, 98,160,237,118,248,236,227,103,217,234,205,243,205, 97, 70, 84, 36, 76,111,107,182,
+239, 47,113,245,199,158,236,148,226, 59,255,254, 15, 9,182,247,211,155, 91,160,172, 60,183,238, 94, 98, 52,190, 67,188, 56, 97,
+188, 60,226,206,235, 43,100,197,113,242,241, 3, 30,188,255, 93,238,190,188, 65,101,143,209,159,235,227,215,207,208, 46, 33,218,
+111,176,120,108,107,192,202,104,139, 27,203, 14, 59, 12,233,245, 99,202, 53,203,233, 71, 78,208, 57, 56,199,133, 95,120,158,227,
+ 71, 34,146, 8,198, 27, 41,163, 97,135,217,193,136, 95,107,197, 76,112,124,227, 79, 52,111, 92,186, 11, 65,206, 39,190,252, 97,
+186,251, 67,204,251,176,176,148,176,229, 32, 75, 97,250,130, 98, 56, 41,168,171, 29,242,108,139, 48, 29,113,242, 23,158,224,226,
+135, 63,199,209,207, 29,226,224, 19,251,104,157,156,199, 7, 53,238,190, 37, 78, 2,230,207,247,177,227,138,170,128,168,189,128,
+ 26, 56, 54,163, 91, 20,203,143,177,121,191, 98,251,238,123, 84,106,136,159, 77, 89,122,246, 25,182,174, 94, 97, 50, 26,137, 41,
+205, 89,185, 15,150, 21, 6, 3, 22,172,171,168,170, 26,165,164, 27,195,163, 48,161,134, 26, 92, 45,157,226,182, 22,130,167,119,
+205,162,229, 64, 25,137,108, 90,219,116,154,135, 17, 74,215, 56, 47,240, 42, 87, 53,184, 86, 91, 19, 68, 33,117, 45,133, 38,218,
+232,189,131, 80, 28,133,228,147, 25,179,188, 32, 48, 1, 85, 85, 80, 53,255, 95, 20,202,166, 53,142, 34,198,227, 9,121,222,204,
+216, 51, 89, 3,234, 90, 82, 44, 97, 96, 8, 76, 36, 92,252, 40, 66,123,133, 50, 13, 22,188,150,181, 41, 10,197, 68,237,189,195,
+104, 57,196,149, 85, 51,106,118,194,166,168,172, 69, 35,233, 47,163,204,222,127,193,239,213,203,134, 97, 76,153,231,212, 78, 42,
+107,165,233,209,163,181, 33,203,164,193, 52,108,140,163, 82,234, 21,131, 17,229,204, 4, 70,242,247,181,197,122, 79, 85, 20,242,
+157,173,229,253, 83, 70,148, 18,165, 52,214, 89,108,237, 9, 66,131, 9, 3,148,147, 81,160, 89, 58,118,226,235, 69,145, 19,134,
+ 49, 40, 71,158, 23,164, 13,183,217,123,121,177, 90,107, 90, 73, 66, 20, 5, 72, 78, 27,145,147,227,152, 64,129, 50, 1,149, 45,
+ 68, 18, 78, 91,224,161,104,192, 15, 50, 91,118,196, 97,132, 87, 98, 22,168,172,184, 0,165, 5, 39,100, 50, 25,145,207,114,202,
+186,196,150, 21,157,118, 27, 19,134, 4,141, 81,193,107,232,164, 41, 69, 51,255, 52, 81, 64, 49,203, 68,218,177,210, 78,100,243,
+140,170,201, 74,107, 32, 76, 82,130, 56, 70,225,155,185,134,212,199, 22,101, 9, 74, 19, 39, 82, 50, 83, 85, 5,121, 33, 51,232,
+178, 42,197, 48,104,119,111,124, 80, 86, 2, 47, 8,162,160, 57,101,213,180,218,109,170,178, 38,142, 2,210, 86,139, 56,142,155,
+ 2, 16,217,193, 69, 81,132,243,142,172, 1,236, 72,150,208, 51,157, 78, 4,195,155,151, 24,221,196,205,162,144, 36,149,156,125,
+ 89, 21,104, 37, 13, 62,237,118, 7, 5,242,193,149, 2, 62, 1,192,137, 73, 35, 10, 67,186,221, 30,222,123, 81, 26,180,166,223,
+235, 18,133, 33,237,118,151, 48,138, 80, 10,170,178,196,123, 49, 17,117,250, 93, 58,237, 46,105,171, 37,207,153,196, 24,109,228,
+ 2,196,131, 54, 40,165,105,183, 90,164, 73, 10, 26,170,186, 66,225, 65,137,179,223,215,210,195, 12, 50,234,240,174,150, 25,123,
+115,130, 53, 70,240,179, 66, 89, 42, 49, 74, 83, 21, 83,254,155, 47,245,121, 60,180,176,145,113,249,218, 42,195, 89,129,213,138,
+143, 94, 56,204,247,222,188,207,201,135, 15, 50,153,214,220, 94,159, 98, 13,180,250,109,250,174,198, 87,142,235,247,182,137, 93,
+133,113,138,220,107, 58,237, 20,172,229,193,118,198, 86,229,232,167, 33,157, 36, 96,234, 19,122,103,159,101,115, 52,229,131,155,
+ 55, 89, 94,219,160,221,105,115,238,212, 67, 36, 81,140, 86,138, 86,154, 18,133,210, 68,183,182,190,197,253,149, 85,156,115,124,
+244, 67, 79,209,235,118,105,181, 82, 6,189, 46, 55,239,223,231,123, 47,188, 4,192,230,246, 14, 59,195, 49,199,151, 14,146, 38,
+ 9,105,154,176,185,181,205,139,175,191,197, 7, 55,110,177,185, 61,100,126,208,103,190,223, 39,137, 99,198,147, 25,235, 91, 91,
+ 18, 25,107, 37,100,121,206,161,253,251, 56,182,116,152,202, 86,148, 85,197,100, 58,227,214,253,251,124,255,167,175,240,237, 31,
+252,152, 59,247,238,237,157,211,135,227, 49,235,155,162, 34,180,211,148, 51, 15,157,192,104,205,100, 42,144,154, 50,207, 56,121,
+252, 40, 97, 16,242,239,254,236, 47,121,235,189,247, 81, 90,211,235,180,120,236,252, 57, 62,247,137,231,233,117, 58,123,167,150,
+170,170,196,212,231,164, 49,177,118, 14,165,228,244,228,156, 39, 47, 75,156,173,137,162,144,219,247, 30,112,245,198, 77,174, 92,
+189,198,245, 59,119,217,218, 25, 82,219,154,247,111,222,226,187, 47,188,196,120, 50,229, 43,191,244, 41, 62,246,204, 69,106,100,
+134,110,173, 3,239,216,109,239,171, 42,139,209,138,105,150,115,231,254, 3,222,120,251, 50,223,251,233,207, 24,142, 39,123,155,
+ 96,231, 60,107, 91, 59,252,198,151, 62,207,225, 3,251, 73,194,136, 89, 94,138,179, 94, 41,246,205, 15,152, 31, 12,208, 40,238,
+173,174,242,222,181, 27, 92,185,118,131,188, 44,246, 12,133,237,180, 5,206,211, 74, 98,246, 13, 6, 12,167, 99,118,134, 99,126,
+237, 87,190,192,247,231, 14, 17, 71,109,220, 77,195,198,198, 6,147,237, 53,142,156, 63,205,209, 71, 21, 87,254,232, 1,215, 62,
+248, 83, 86,215,114,238,220,188,196,237,171,127,141,117, 99,194,246, 8,123, 55, 99,107,227, 62,235,183, 95, 97,123,245, 61,166,
+163, 21,242,157,107,108,174,188,205,218,157, 91, 20,101,135,246,226, 57,226,201, 49, 58, 69, 74,208, 45, 40,235, 33,149, 46,153,
+149, 59, 12,215,110, 51, 77,175,177, 89,189, 65,209,190,195,182,191,202,131,234, 38,147,185,156,254, 35, 41,135,125,135,185, 25,
+156, 91,242,220,160,102,243,128,225,112,175,207,252, 47, 30,196, 15, 10,226, 27, 33,251,206,194, 98,154, 51, 29, 5,172,191,227,
+153,228,154, 98,178, 67, 86,172, 51,155,172, 98,163,154,227,131, 95,100,127, 39, 98,120,219, 96, 55, 61,113,207, 97,217,102,156,
+111,179,208,190,200,210, 51, 39, 57,122,190,197,172,158,192,116,137,110,114,136,118,127,202,237,217,139, 12,175,175,115,239,131,
+ 43,236,140,110, 17,100, 83, 6, 39,143, 51,127,228, 40, 59,119,239,160,106, 81, 76,113,130,217,245, 90, 78,236, 74,107, 2, 45,
+ 10,142, 49,210, 78, 25, 6, 98, 52,222,245,103,132,161,222,187,222,202,170, 0, 36,223,237, 61,132,161,180, 54,106, 37, 38,207,
+208,200, 1,208, 90, 75,146, 36,152, 32, 96,154, 77,169,107, 49,230,250,218, 35,109,152,138,233,108, 42,235,142,242, 84,174, 38,
+208, 66,106,147,145,146, 16, 59, 5,155, 44, 10,130,120,154,170, 6,240, 84,227,156,197,218, 26,105,148,212,148, 69,142, 14, 69,
+ 74, 47,102, 25, 81, 28,225, 60, 20,121, 78, 24, 72,148, 90, 43, 67, 28, 70,123, 30, 39,109, 52, 85, 93,161,181,166,170, 44,157,
+110,143,162,204,155, 53, 82,227,189, 66,233, 64, 98,123,145,172,117, 90,131, 14, 12,121,150, 97,148,198,121, 65,191,234,192, 8,
+ 39, 5,168,189,149,104,108,221,176, 62,106,143,117, 78, 14,148,209,110,135,138,252, 28,143, 28, 24,109, 41,117,228, 74, 41, 52,
+136, 74, 92, 74,172, 26, 20,230,196,169,211, 95,223,149,174,202,210, 2,142,162,168,216,133,248, 7,129, 38, 12, 35,180,150, 38,
+183,162, 40, 8,141, 65,105, 45,178,123, 93,179, 91, 18, 82,215,150, 56,140,200,138,140, 36, 73,169,202, 18,103,155,142,238,102,
+113, 41,139,130, 40,140,176,181, 21, 98,151, 22,110,182,181, 21, 85,150,131,115, 88,239,241, 90, 19, 52, 51,240, 36, 78,208,198,
+160,181,156,172, 91,105,139,178, 40, 32, 16, 89, 28, 35,115, 63,165,128,218, 17,244,251,164,177, 84,152, 6, 65, 72, 93,203,102,
+ 34, 8, 66, 57,145, 27, 89,140,228,185,155, 11, 52, 12, 9, 77,196,174,227, 81, 36,160, 18,165, 84, 51,139, 7,231,189,204,170,
+149, 64, 73,140, 22, 99,194,174,137,111, 58,155, 80,100, 37, 69, 85,144,198, 41, 97, 28, 82, 22, 57,101, 41,210,166,119, 14,101,
+ 45, 97, 43, 37, 73, 98,162, 64,158, 75, 43,249,210,212,117, 77, 20, 75,239,113, 85, 85, 84, 78,228, 34,109, 52,157, 86,155, 36,
+142,101,102,221,233,210,106,181,155, 15, 92,228, 83,163, 21,105,187,221, 92,160,142,188, 20,174,187, 9, 2,208,194, 16, 15, 3,
+153, 97,161, 96,150,231,242,190,106,137,159, 41,165,232,117,187, 98,126, 68, 49, 12,164, 36, 0, 0, 32, 0, 73, 68, 65, 84,178,
+167,121,158,147,196,194, 34,136,226, 8,188,200,205,202, 4,196, 97, 68, 89,149,132, 81,204, 46,139, 88,174, 25,223, 92, 47, 6,
+165,100, 86,251, 15, 62,217,229, 87, 6,154,157, 15,110,145, 7,134,183,215, 39, 4, 97,200, 66, 39,226,204,193, 14, 47,189,187,
+206,161,253, 93,226,185, 54,171,155, 99, 98,160, 76, 18, 76,150, 67,105,137,210,144,188, 2,141, 35,238, 68, 92,203, 43,206, 29,
+ 26,224,125,197,104, 92, 17,246, 98,234,210, 98,211, 24, 14, 60,202, 59,239, 95,227,205,119,223,227,204,137,227,252,103,127,255,
+183, 24,244,186,160,188, 92, 15,198,208, 74, 83, 70,147, 9,111, 92,126,151,123,141,156,124,225,225, 51, 92,188,112,158, 52, 78,
+120,255,218,117,126,252,202, 27,140,199, 99,138,178, 66,163,120,232,216, 17, 60,138,249,193,128, 94,183,195,100,154, 49, 26,141,
+217, 30,143,104,167, 45,206,156, 56,202,161,197,253, 56,239,249,209, 75,175,242,193,141, 91, 56,231, 56,249,208, 9, 62,245,220,
+135, 56,117,226, 24,129, 49,123,137, 9,165,164, 91,189,213, 74, 88,223,220,100, 52,153,226,189,176,203,101,193,133,253, 11, 11,
+ 92, 56,115, 90,102,121, 73, 66, 93, 91,182, 70, 99,138,188, 36, 47, 75,230,123, 93,202,170,228,214,189,251, 20, 69,201,233, 19,
+199,120,250,177, 11,156, 58,118,148,178,172, 24, 77, 39, 56,231, 40,173,124,159,109,105,201,139, 18, 87,215, 2,236,104,188, 51,
+114,131, 48,188,119,253, 38,175,190,115,133,247,111,220,228,189,155,183, 73,162,144,185, 94,151, 94,175, 75,183,211,102, 56,153,
+208,138, 83,254,171,127,244,187,236,159,159,167,157,166, 50, 54, 42, 11,196, 56, 40,247, 0,208, 40,163, 41,203,130,245,173, 29,
+ 94,126,243, 29,174,221,186, 43, 53,184, 40, 6,253, 62, 15,159, 60,206, 51,143, 63, 70,158,205, 56,121,236, 24,147,217,140,229,
+245, 13,174, 94,191,197,229,247, 63, 96, 56, 26,115,230,196,113, 22,247,205,115,251,222, 3, 94,122,227, 77,222,187,126,131,173,
+237, 29,108, 45,174,247,162, 44,105,181, 82, 22,247,239,227, 99, 31,186,200,103, 30, 59, 71,111, 97,158,203, 71, 79,208, 61,124,
+138, 11,253, 47, 99,162, 71,216,183,255, 89,158,124,226, 97,158,122, 90,211,159,243, 60,254,213,135,153,172, 28,228, 39,127,241,
+175,169,170, 33,167,206,127,153, 83,143,125,158,213,245,191, 65,141, 10,198, 59,235, 76,134, 15, 24,174, 94,193,217, 29, 76,160,
+201, 38, 27,148,197,140,139,207,125,133,127,249,251, 1,243, 79,149, 44, 95, 29,192, 74,159,135, 23,142,112,246,241, 3, 80,134,
+212, 97, 27,148, 38,175,114,170,220, 82,151, 21,113,127,142, 98,184,198, 56, 31,179, 28,220, 99, 43, 41,249,201,118,193,149,181,
+138,141,173, 91,220,203, 94,103,243,206,207,152,218, 29,166, 7,107,150,103,134, 89,216, 33,233,103,228, 43, 33,107,119, 61,247,
+151,175,145,109,223,102,103,243, 6, 45,125,145, 15,255,206, 25,138, 7,158, 7, 55,183,152, 78,182, 40,214, 70,196, 29,208,245,
+ 54,177,254, 8,113,117,154,157,252, 3,218,225,152,201,118, 7, 85, 47,209,162,135, 74,215,241,253, 33,122,167, 96,186,178, 76,
+127, 62,161,125,240, 48, 97,183, 71,239,240, 1,214,175, 94,149,241, 80, 94,176, 91,151,108,203, 26,173, 69,209, 44, 43, 41, 43,
+113, 30,112,144,205,102,194,246,119, 2, 39,139,195, 4,148, 36,137, 90,173, 54,187,213,161,104,233, 36, 79, 82,145,194,203,170,
+ 36,140, 35,140, 14,228,254, 18, 69, 68,161,244,142,163, 20, 69,217,112, 37,242,146, 52, 77,136, 99, 73, 13,133, 65, 83, 26, 19,
+ 4, 88, 87, 11, 70, 91,139,170, 96,173,147,238,145, 44,103,143,133, 94, 91,140,214,244, 7, 3,146, 36, 1,212,158,177,217,249,
+221, 84, 81,216,248, 62, 42,146, 36,198,104, 37, 81, 78,103, 17,176,140, 84,210,106, 37,163,211, 56, 18,186, 92,188,187,166, 4,
+145, 28, 10,139, 2,239,154,124,126, 40, 45,153, 89,150,163,141, 20,143, 56, 28,120,223,172,149, 21,214,123, 66, 19, 53,170,120,
+137, 49, 80, 59, 43,107, 97,131, 28,151,100, 1,194,203, 15, 35, 52, 30,165,100,109, 52,205,159, 32,136,208, 40,210,150,164, 76,
+204,249,199,159,248,122,154,166,123,179, 80,231,100, 78,208, 78,219,132,241,238, 2, 39, 11, 14,190,233,223, 53, 33,206, 59,146,
+ 88,110, 64,121, 94, 73,148, 36,145, 15,168,174,107,226, 80,102,237,173,118, 11, 64,100,137,192, 80,228, 57, 69, 81,160,149, 68,
+ 79, 4,100, 34,187,154,162,144,121,175,119, 82, 39,231,106, 75, 94,136,204, 27,132,205,124, 58,138, 81, 72, 44,161,246, 22, 59,
+157, 65, 19, 11,219, 45, 54, 81, 73, 76,128,100,176,203, 90,106,254,170,170, 89,120,179, 41,229,116, 74, 49,205,152,101, 51, 10,
+ 91,202, 9,190,176, 34,225, 76,198,141,163, 60, 32, 14, 99, 60,178,104,214, 94,176,178, 50,139,150,162,250,162,148,126,246,218,
+213, 82,214,145,237,214,161,234,189, 15,214, 24, 3, 90,161,181, 17,195,155,147,214,157,202,150,120, 20, 85,158,203, 28,190,174,
+105,119,186, 40,165,169,234,154, 78, 35,159,199, 81, 76, 24, 69,160, 60,142, 6,189,106,100, 83,161,148,106, 34,134, 49, 73,171,
+ 69,158, 77,169,202,146,176, 89,252, 29, 30,229, 61, 73,146, 10,125,207,138, 47,161, 42,133,220, 84, 53,187, 90,173, 27, 3,136,
+ 86,152, 48, 36, 10, 67,166,211, 9,198, 72, 38,187, 40, 10,249, 92,160, 81, 34,228,154,240, 32, 20,185, 40, 68, 41,233,111,183,
+141, 52, 90, 85, 22,165, 37,111,249,159,159,130, 63,251,203,159,241,220, 67,115,176,208,231, 7,183, 70,140,157,226,233, 19, 11,
+184,178,230,221,235,107,164, 73, 64,183,155, 16,226,121,176, 57, 67,215,138,118, 36, 70, 69,103, 45,101,104,232, 56, 72,128,145,
+209,108,207, 60,222,107, 70,227,140, 44,171, 88,236,196,164,221, 30, 89,255, 36,111,188,123,133, 87, 47,189,195,242,250, 58, 74,
+ 41,142, 28, 62, 68, 28,197, 56,239,161, 81,159,182,134, 67,126,250,234, 27,108,110,239, 48, 63, 24,112,252,232, 33,122,221, 46,
+131,110,135,118,187,205,205,187,247,184,117,255, 1, 85,101, 57,120, 96, 63,251,247,237,163,221, 74, 57,121,252, 24,139, 11,243,
+ 12,122, 93, 54,119,134,172,111,108, 50,153,205, 56,124, 64, 36,246, 94,183,195,173,123,210, 18, 22, 69,194,173,158,239,247, 56,
+180,127, 31,104, 77, 86, 72,153,134, 84, 95,138,195,246,234,141,219,141, 99,220,162, 3,195,133,135,207,242,133, 79,127,130, 79,
+124,228, 89, 14,237,223, 71, 28, 69, 88,107,217, 25,238,112,111,121,141,233,116,194,163,103, 79,113,108,105, 73, 20, 18, 15, 91,
+ 59, 59,220, 95, 89,227,202, 7,215, 57,119,250, 36, 94, 41,242, 89,198,116,150, 51, 26, 79,168,108, 37, 35,170, 70,241, 73, 99,
+ 1,231, 84,182,198,123, 8,140, 38, 47, 5,222,116,127,121,153,187, 15, 86,168,157,227,233,199, 30,229,196,209, 35,204,102, 51,
+134,227, 9, 43,235,235,220,188,115,143,163,135, 15,209,237,182, 37,202,217,156,226,118,199,108, 0, 85,105,121,229,210,219,252,
+193,191,255, 15,188,253,222,251, 76, 26, 15, 74,148, 68, 60,249,232,121,190,240,137,143,242, 11, 79, 95,228,248,209, 37,182,135,
+ 67,174, 92,187,201,123, 31, 92,103,117,125,157,157,225,136,201,108, 70,183,219, 97,105,113, 63,221, 78,135, 63,250,243,111,114,
+111,121,149,110,167, 69, 20, 4, 20,101,197,209, 67, 7, 48, 38, 96, 97,208,231, 83, 23, 78,242,143,191,250, 75, 92,222,183, 72,
+118,224, 12, 31,251,228,111,112,234, 57, 69,148,247,112,197, 4,223, 85,204, 93, 8,120,122,193,242,164,209, 92,124,126,142, 99,
+ 95,253, 45, 62,252,212,231,248,229,223, 59,197,199, 63, 17,242,210, 95,140, 24,173,188,129,183, 57,249,246, 93, 54, 30,188,139,
+171, 75, 76, 16, 98,171,140,185,131, 15, 81,215, 29,126,248,114,159,183, 94, 16,131,213,205,187, 87, 9,203, 69,126,239,195,112,
+118, 33,228,244, 98,139,179, 7, 14,113,246,192, 73,142,158,127,148, 67,103, 30,103,174,125,130,164,125,144,193,252, 17,186,105,
+ 11,103, 34, 66,227,200,166, 83,134,155,107,228,121,133, 69,211,154, 59, 76, 57,217,102,150,109,114,239,238, 85,174,221,184,205,
+ 78,172,112,155, 57,229,112,131, 34,219,194, 24,199,169,179,191,206, 51,207,143,217, 62, 24,115,247,229, 33,121,182, 77, 85,101,
+228,122, 76, 64,193,214,237,187,140, 55, 59, 44,191,255, 6,149, 93,103,226,215, 72,220, 35, 84,182, 67,234, 99, 14, 30,156,177,
+244,248, 81, 6, 39, 14,209, 61,184,136, 78, 90,216,218, 19,247,186,204, 29, 94, 98,235,198, 7,114,159,174, 10,202,210,226,169,
+ 1,105,116,116,181,107,146, 80,226, 92,215, 70, 35,136,109, 89,144,146, 36, 33,140, 66,162, 40,110, 36,119,225,114, 76,167,179,
+230,148, 94,225,154,181, 13,104,238,245,242,239, 60, 10, 26,121, 57, 12, 67,217, 4, 42, 64,121,217,212, 90,203,180, 65,100, 91,
+ 91, 18, 71, 49, 69, 46,153,111,239,220, 30, 30,182,174, 43, 4,131,157,211,237,116,137, 34, 77,146,180,208, 90,224, 83,187, 28,
+141,178,202,101,132, 88, 20, 8, 4,199, 17, 68, 33,149,173,104, 39,109, 92,237,192, 11, 10,214,121,249, 93,243,188,160,174,133,
+ 60,231, 28,242,158,184,102,246,109, 2, 81,159,181,116,175,231,121,142, 87,178,158,105,154,220, 63, 77,145,152, 7,221,216, 12,
+148,106,202,163,156, 5,148,248, 14,208,120,106,108,227,215,170,170, 26,105,169, 51,212, 30,170, 34,151, 38,186, 32,192,121, 73,
+ 1, 8,130, 25,204,217, 71,206,127,221,121, 49, 22,180,219, 45,132,207,156,144,103,153,204,219,242,130, 60,151,197,171, 44, 5,
+192,239,113,104, 29,136,219, 58, 12, 41,138,188,201,110, 87,120,118, 35, 12,178,184, 43, 60, 65, 20,162,106, 57,165,183, 91, 29,
+130, 40, 36,155, 9,240,164, 40, 10,202, 92,100,113,175, 5, 73, 27, 37, 9,101, 37, 51,249, 52,138, 41, 43,201, 42,102, 83,233,
+204, 46, 43,113, 89,227, 60,213,116,130, 50,205,204,221,203,204,212,101, 57,121, 89,137,193,174,200,168,203, 18, 91, 20,148,121,
+134,111,164,198,218, 53,185,243,102,177,218, 53,255, 5, 97, 32, 27,156,178,196, 58, 75, 43, 77,137, 99,153,255, 27, 45,181,130,
+ 85,115,130, 79,219, 41,206, 90, 58,157, 54, 90,105,112,194, 68, 54,129, 72, 83, 74, 41,166,179, 25, 81,163, 56, 40, 47,117,167,
+ 26,246, 54, 11,206, 11,146, 39,106,181, 8,140,204,210,165, 14, 87,160, 12, 38, 16,108,226, 44, 23, 51,138,181, 86,226, 31, 86,
+220,198,182,182,127, 43, 87, 69, 6,148,166, 44, 74,170,102,134,238,188,156, 80, 65,226,104,187,104,222, 40,144, 93,119,237,100,
+134,102,157,199, 27,185,192,229,245,218,198,133,170, 9, 35, 67,104,100,110,111, 2, 3, 30,156,173,247,164, 54,239,164,206, 48,
+140, 69,238, 21,128,132,199, 86, 53,157,118,202,163,102,147,147,139, 45, 22, 63,118,129, 75, 47,221,192,100, 21,243, 73,200, 82,
+ 39, 32,212,138,155,247,118, 40, 43, 71,237, 21,183, 87,199,204,106,135,245,142,131,139,125,138,233,140,254,252,128,178,170,233,
+196, 1,173,110, 72, 47,141,217,206, 28, 90, 57,102,133,163,182,158, 68, 43,186,237, 22,249,129, 71,137, 3,195,131,245, 45, 54,
+182,182,248,167,191,251,247,216,183,111,129, 60,203,101,134,229,193,104, 77,183,221, 97,121,101,141,219, 15, 86,152,206,102,156,
+ 62,126,140, 35,135, 14, 81, 84, 37,127,245,195, 23,120,249,210,219, 76,166, 98,194,153, 76,103,108,110,239, 48, 26,141, 89, 58,
+176,143, 67, 7, 23,137, 35,241, 86,220,121,176,194,160,215,197,161, 56,184,111, 30,148,226,133, 87, 94, 99,121,109,163,153, 43,
+ 10,207, 96,113,255, 62,210, 40,164,174, 4, 55, 59,158, 76,249,222, 75,175,240,141,191,254, 62,183,239,203, 73,219,123, 71,183,
+211,101,174,215,101,255,160,207,190,185, 1, 38, 8,168,157,160, 55,175,220,184,137,115,142,202, 58,106,239, 88, 92, 88,224, 7,
+ 47,190,204, 11,175,190,190, 55, 99,124,254,153, 39,233,181, 59,180, 91, 45, 58, 45,169, 80,181,214,146,101, 57,181,131,208,104,
+218,173, 54, 73,218,200,151,141,186, 82,213,162, 14, 77,154,156,251,202,250, 38,221,118,155,185,185,190,108,236,170,138,185,254,
+128,127,246, 79,255, 49, 23, 31, 61,207,160,219, 37, 8, 2,234,198, 83,225,172,163, 40,197, 80, 89, 59, 33,142, 45,175,174,177,
+188,177,193,250,198, 22,187,178,123,109,107,178,162,224, 31,124,237,171,104,173,153,140, 39,108,236, 12,121,255,230, 77, 86,214,
+ 55,185,187,188,194,246,112,204,163,103,207,240, 11, 79, 95,100,208,239,147,231, 5,163,201,148,183,174, 92,197, 90,203,135,158,
+124,156,118,171, 69, 59, 77,121,228,204, 73,170,233,136,223,249,244,115,252,136,136,159,153, 62, 31,255,213,191,203,151,247, 89,
+ 62, 66,204,107, 55, 20,215, 70,223, 35,216,126,132, 40, 80,108,244, 53,111,188, 9,179,165, 0,151,195,234,107,158,182,130,122,
+209,177,118,251,105, 94,254,206,191, 96,107,245, 22,198,196,156,122,250,119,249,231,255,247,159,178,185,115,142,245,187,175, 17,
+ 37, 57,179,233, 42,247,238,189,202,214,214, 53,214,214,150,153,110, 46,115,253,246,144,173,228, 8,203, 61, 77,149,104,156,246,
+ 36, 6, 14, 39, 25,131,176,100, 95, 63,228,200,190,132,163,173,136,179,211, 46,231,143,247, 56,187,216,227,240, 82,155,199,207,
+156,224,196,217,147, 16,157, 67, 37, 29,170,209, 14,101, 53,163,178, 37,182, 86,100, 91, 31, 48,141,110, 19, 45,205, 56,246,228,
+ 18,135,206, 46, 80,143, 98, 22,159, 26, 48, 84,138,123, 47, 84, 20,249, 29,202,124,194,184, 88,161,206, 51,102,227, 27, 60,184,
+181, 67, 54,126, 64,181,185,194,206,246, 61,186,157, 71,208, 54, 33, 43, 52,180,199,204,205,197, 28,125,228, 36, 81, 26, 48,153,
+100,212, 86, 81, 89,136,251, 61,226,118,139,241,157,219, 98, 14, 54, 90, 34,184,141,170, 26, 4,114, 16,171, 43,161, 80,198,177,
+160, 96,147, 52,101, 23, 4, 54,205,102,212, 86,242,215,181,151,232,101,109,107, 57,136,213, 98,168, 76, 83,169,123,142, 66,161,
+145,102,217,148, 26, 79,108, 2,178, 60,111, 22, 60, 77,183,219, 65,107, 67,214,120,124,118,199,144, 73, 44,192, 28, 99,100,190,
+108,140,252,153,140,199,152,192,200,193, 81,107,156,171,105,183,123, 4,129, 36,187,148, 23,201, 59, 10, 5, 48,163,148, 22, 21,
+ 33,203,208, 70, 42,128,163, 32,162, 40, 11, 57,204, 40, 72,147,148, 40,150,241,107, 85, 85,162, 56, 55,135,193,218, 86,148,165,
+224,158,165, 57, 78,161, 67,233,108, 15,147, 72, 40,148, 38,192,214,226, 93,177, 86,164,124,173, 53, 13, 58, 76,214, 45,215,204,
+198,141, 24,209,141,105, 10,162,148,172,165,222, 59,180, 10,104, 76, 12, 4, 81, 68, 96, 12,161,146,238,145,186,150,251,140,173,
+ 44,230,212,217,115, 95,247, 94,218,168,148, 82, 40,163, 80, 94, 17, 37, 33,113, 36,249, 57,101, 20, 50,156, 23,176,140,214,134,
+ 32, 48, 84,165,116,108,135,198,160, 77,132, 14,154, 30,229, 48,220,155,197, 79,167, 83,153,207,164, 9,113, 20, 33,237,105,229,
+158,132,162,149,100,203,227, 52,161,200,114,156,146, 88,142,171,107,201,112, 59,135,210, 6,163,101,143, 19, 54, 82, 79, 94,228,
+ 20,147, 25,106,111,203,231,101,147, 3,160, 21, 40, 80, 94,161,144,252,164, 66, 94, 23,129,228, 88,149,214,244, 6,131,102,166,
+211,162,221,110,137,129, 33,144, 5,172,170,107, 92, 45,145,140, 36, 73, 72, 19, 1,232, 4, 97,136,242,194, 61, 23, 7,164,219,
+ 51, 26,133, 65, 64, 81,150, 2,204,177, 22,129,206,252,109,126, 54,138, 99,249, 89,173,150, 80,129,148,162,221, 74,136,162, 88,
+220,227,206,209,238,116, 80, 74,156,150,117,109,229,189,139, 35,108, 41,181,179,222,121,226, 40,166, 44,115, 76, 40,227, 4,107,
+ 75,194, 40, 36,155,102,216, 74,242,216, 40, 77, 28, 39, 84, 85,137, 71,230, 66,187,191,163,209, 1, 85, 85,211,106,181,136, 34,
+217,221,181,210,148,221,222,115,165, 36, 42, 98, 76,136,115, 21,182,170,229, 39, 52,139,184,181, 22,154,217,172, 0,111, 82,194,
+ 56,198, 86, 21,190,246,224,193, 43, 79,160, 52,157, 20,254,225, 99, 41, 39,246,183, 40, 55, 70,220,222,204, 89, 28,180,201,203,
+146,150, 82,164,177,193,107,205,120,156, 49, 44, 28, 59,179,146,110,108,192,123,142, 29,223, 71, 49, 46,137, 66,133, 9, 13,207,
+ 62,118,132,241,182,208,204, 2,229,209, 97,196,190, 78, 76, 55,128,135,142,117,153, 78, 28,247,147, 37,126,244,242, 43,188,121,
+249, 93,180, 54,252,189,175,126, 25,229, 60,121, 89, 72, 84,203, 75, 52,199, 89,203,191,253,147,111,176,181, 51, 36, 12, 13,115,
+253, 62, 73, 20,112, 96,223, 2, 7,247,239, 39, 10, 12,203,107, 27,123,112,160, 52,142,249,149,207,127,150,103, 30,123, 12,231,
+ 28, 15,214,214,249,222,139, 47,115,247,193, 50,113, 51,170, 56,123,250, 36,113, 24,176,188,190,133,194, 51,223,239,113,238,244,
+105, 62,242,244, 19,204,247,250, 98,166,115, 14, 91,123, 70,147, 17,163,225, 8,143,103,117, 93,106, 86, 61,144,101, 57, 91, 59,
+ 59,188,249,254,251, 20,165,144, 30, 59,237, 22,215,110,222,226,189,107, 55, 89, 94, 91, 39, 12, 12,219,195, 49,167, 79, 28,165,
+172, 44, 87,174,221,216, 91, 52,127,253,139,159,231,244,201, 99,196, 97, 72,218,248, 7,218,109,233, 49,136,227,136,185,193,128,
+ 94, 75,212,179,170, 42, 41,170,170,153,177, 11,155,127,113,223, 28, 55,239, 61,224,205, 43, 87,249,208, 19, 23, 56,176,176, 64,
+167,211,102,184, 51,228,216,225, 67,156, 61,115, 82,110,132,120,217,252,214, 22,229, 60,165,171,200,102,197, 94, 17,200,165,203,
+ 87,120,241,181, 75,188,247,193,117,156,247,156,126,232, 4, 31,127,238,105, 78,157, 56,193,206,206,136,163,135, 23,217,183, 48,
+143,173, 29,227,225,152, 44,203,233,117, 59,140, 39, 19,110,223,123,192, 19,231,207,241,228,249,179, 56, 87,179,186,181,197,230,
+230, 22,179,188, 96,117, 99,147,243,103, 31,230,209,179,167, 24, 79,166,156, 90, 28,240,181,143,126,136,213,197, 37,254,240,214,
+ 10, 71,220,231,105,221,158,227,181,171,134,239, 47,194,149, 23, 96,229,103,223,101, 56,214,220,157, 44,242,224,182,230,253, 23,
+182, 89,126, 45,229,210,143, 54, 25,109,121,110,191, 27,115,245,101, 67,145,149,212,132,184, 32,231,185,223,255, 79,248,135,255,
+243,239,241,155, 75, 80,238, 59,194,189,229, 1,195,173,119,240,197, 14,181, 15,105,247, 15,113,226,201,175,146,232, 83, 60,253,
+229,135,248,157, 47, 90, 46, 95,210, 20,115,158, 60, 80,236,204, 20,155,195,128,113, 22, 81,135, 10, 87, 66, 85,107,102, 45, 15,
+181,167,111, 20,167, 3,197,163,222,112, 65, 27, 62,177,160,249,236, 66,204,226,241, 1,227,155, 15, 67,176,201,172,156, 80,148,
+178, 16,140, 71, 25,107,171, 43, 24, 85,211,238,222,231,193, 75, 23,232, 31, 87,220,252,217,148, 98,114,141,162, 24,146,175,108,
+225,163,156,217,250, 26,171,247,150, 41,134,247, 24, 77,110,227,198,138,238,226,163, 4, 81, 27,107, 53,195,229, 9,173,185, 9,
+173, 99, 23, 9, 91, 3, 84,189, 3,101, 65,153,123,170,170,166,125,248, 32, 81, 96, 40,214,215,208,186,105,103,108, 12,150,182,
+174, 36,213, 98, 20,173,180,133,214, 10,231,157, 40,175, 65,128,195, 81,151, 37, 40,208,104,108, 41, 41,143, 36,105,201, 61, 48,
+138,136, 26, 83, 91, 89, 22,104,211, 68,163, 75, 75,160, 53,179,162, 32, 14, 2,202,202,162,180,223,131,200,196, 81, 4, 64,171,
+149, 18, 55, 74,100, 24,134, 4, 38,160,200,115, 49, 84,163,136, 35,137,159,105,173,232,247,187, 68, 81, 66, 85, 20,148, 85, 51,
+207, 54,178,238, 20,121,142,115, 16, 54,235, 65,154,182,196,112, 23,199, 84,149,165,176, 82, 48,211,234,180,169,107,129,162,133,
+145, 28,138,210, 68,106, 84,195, 48, 36,107,104,171,181,171, 73,155,113,166,119,158, 89,158, 97,144, 57,154,140,112, 3,130, 64,
+114,243,117,237, 80, 70,212, 45,213, 40, 20, 42,208,212, 85, 19, 93,198,161,145,251,116, 16, 5, 68, 97, 68,218,110,201,162,175,
+ 53, 74, 27,226, 40,100,183,120,167,182, 50, 2,175,107,217, 76, 7, 69,145,163, 3,137, 45, 89,231, 26, 62,174, 44,158,189, 78,
+135,193, 96,192,222,195,203,172, 15, 20, 74,121,188, 0,218, 80, 58, 34,112,226,238,243,181,107,224, 28, 1,101,145,227,189,116,
+158,163, 60,113,148,146,229, 25,206,187,189, 69,216, 40, 41,109,209, 74,211,106,119,152,236,236, 96,189,162,221,109, 49,203, 10,
+122,189, 14, 74, 25,108, 93,147, 68, 49, 40, 69,162, 20,129,214,140,178, 2,133,131,184,141, 55, 26,234, 90,200,103, 70,145,215,
+142, 52, 12, 1,207,100,214, 56, 14,181, 68,188, 38,147, 25,221, 94,135, 48,140,152,159, 75,152,204,166,100, 89, 70, 20, 9,187,
+189,213,105,145,186,152, 32, 12,152,140,199,140,134, 67,230,230,230,100, 81,140, 34,226, 36,194, 33,146, 74,154,164, 76, 38, 19,
+146, 56, 69, 41,136,188, 71, 69, 49, 40, 47, 85,173,120, 32,197,218, 28,101, 52, 74,137,233, 80,135, 33,161,247, 50,243,247,146,
+251,176,181, 44,168,113, 28, 19, 70,226,186, 47,202,130,114, 34, 94,135, 86,218,110,204,125, 21,105,218,198,123,113,165,122,100,
+ 87,215,106,220,247, 74, 41,166,147,169, 40, 40,182, 38,140, 26, 44,172, 81, 84,165,101,102, 11,188,151, 84, 67, 18, 71, 50,102,
+ 49,134, 52, 16,127, 65, 81,148, 4,129,128, 21,156,147,124,179,173, 43,140,146,174,123, 95,215, 12, 71, 99,162,230,139, 86,150,
+ 5,161, 17, 90,146,173, 43,130, 56,164,204, 4,183,248,185, 51,134,133, 99, 3,124,160,120,243,123, 87,136,147,128,119, 94,190,
+ 65,255,244, 33,214,198, 57,105, 88,179,110, 21,167, 31, 89,226,221,247,151,169,172,135, 16,130,208, 48,220, 30, 51,119,120,192,
+202,157, 77, 14, 44,245,217, 28,142, 89,191,189,206, 54,134,202, 24,250,115, 41,137,118,116,250, 9, 11, 11, 61,244,160,195, 45,
+109, 56,176, 48, 79,175,221,161,170,107,238,173,172,112,234,216, 81, 30,220,218, 96,233,208,126, 49,117,137,159,132,221,226,153,
+208,132,184, 90, 32, 18,171,155,219,252,197,223,252,128,183,222,125,143,159,127,140,167, 83,242,162,164,172,100,254, 53, 30,143,
+233,119, 59, 40, 20, 15, 86,214,152,155,235,115,235,206, 61, 14, 29,216,207,246,206, 14,107,155, 91,244,187, 93,206, 63, 44, 0,
+149,162, 44,112, 94, 10, 50,108,109,233,117,122,124,236,217,167,121, 42, 59, 47, 11,243, 7,215,247,158,107,126,110,192, 23, 62,
+253,113,142, 47, 45, 17,133, 2,127,185,117,127,153,247,174,223,228,193,234, 26, 81, 24,179, 48,223,227,193,218,134, 84,106,214,
+ 53,105, 18, 51, 63, 24,112,233,242, 21, 78, 30, 59, 76,191,223,103,115,103,200, 27,239, 92,230,196,177, 35, 44,244,251, 0, 68,
+ 70,204,174,142, 93,233, 93, 97,109,197,172,200,217,220,220,230,141, 43,239,179,177,177,201,145,131, 7, 49, 97, 68,154,166, 28,
+ 88,152,163, 21, 71,220,121,176,204,205, 91,119,153, 27,244,247, 54,237,181,173,169,156, 19, 7,176,134,149,149, 13,110,220,190,
+203, 7, 55,111, 53,149,179,242,184,118,243, 22,211,217,148, 63,250,215,255, 43, 43, 27, 27,132,129,224,138,119, 70, 19,170,186,
+102,103, 52,226,165,215,223, 98,125,123,155,207,124,244, 35,156, 61,121, 66,110,208,101,197,157,187, 15, 88,223, 25,146, 23,194,
+222,190,244,206,101,206,158,248, 60, 95,120,238, 41,142,118, 98, 62,250,252,135,248,175,223,188, 73,100,186,108,222,218, 97,118,
+235, 30,251,146, 99,164,203, 83, 76,153,178,189,177, 70, 52,122, 25,181,114,153,181,118,139,201,218, 45,170,108,147,238,220, 2,
+ 58, 60, 8,222,162,107,143, 83, 37,227,157,251,156,251,205,175,193,253, 22,223,250, 63,215,249,230,208,178,117,237, 30,227,225,
+117,156,237,161,205, 26,115, 11, 75, 28,152,127,156, 11,143, 7,252,234,103, 61, 27,204,248,211,187,109, 12, 30,103, 21,147, 33,
+216,106, 67,186, 34,104,145, 14,187,196,129,166, 46, 60,250,186, 98,114, 74,177, 21, 41,110, 82,210,198,114,208,135, 12, 48, 28,
+ 38,100, 65,135, 60,252,153,138,197,252, 57,182, 94,240,108,181,127,202,221,219,239,146, 91, 69, 60,232,177,158,215,108,143,135,
+ 36,250, 15, 89,249,131, 47,178,189,118,159,108,178, 67, 93,173,195, 32, 67, 45, 23,140,239,111,113,244,233,199, 88,189, 84, 80,
+172, 79,232,157, 56, 71,109, 11,202,106,130,210, 33,217,208,114,237,242, 45, 90, 71, 54,201,175, 45,226,247, 87,164,117, 5,117,
+129,215, 29,166,219, 5,253,115,231,217,186,113,131,108,189, 41,240, 81, 74, 76,186, 97, 72, 43, 78,112,206, 49,155,102,162,236,
+ 70, 17, 30,100, 83,239, 60,113,154,162,181,102, 52, 26, 17, 4, 1, 85,109,169,236,140,176,185,246,180,210,180,219, 45,166,211,
+ 41,211,201,223,154, 39, 99,147, 16,107,141,115, 86, 70,134,182,220, 83,254, 64, 10, 75,118,179,229,227,241, 24, 19,132, 36, 81,
+ 76, 24,132, 36,129, 33, 47, 74,162, 72,211,237,119, 49,218,200,166,181,200,177,214,161,148,102,107,107, 11,173, 20,221, 78,151,
+ 48, 8,137, 99, 33,221,137, 67, 62, 20, 85,173,250,185, 90,241, 40,100, 54,149, 90,215, 32, 72,240,206,227, 93, 13, 65,208,128,
+204,124,115,112,178,152, 64, 75,114, 75, 22, 72,188, 23,154,168,172,144, 90,230,229,181,224,151,131, 32,146, 84, 10, 21, 74, 5,
+152, 38,250, 23, 52,135, 64,231,128,230, 96,171, 42,221,108, 20,196,188,231,149,162,174, 74, 74,239,169,107, 79,220,160,217, 37,
+ 34, 24,200,162, 30, 4,130,111, 12,195,144,178,156,238,189,193,214, 66, 86, 20,180,195, 93,254,110, 13, 26,112, 50,228, 23,100,
+157,204,109, 3, 45, 89,185,218, 72,187,147,115,158, 36,141,228,244, 56,155, 81, 85,117, 99,190, 19,195, 85,208, 60, 57, 72,220,
+193, 59,201, 54,218,177,196,208,188,243, 34,143, 55,187,248,110, 83,131, 89, 89, 75,158,201,239,154, 77,166, 64, 77,216,235,147,
+ 79, 38,180,187,125, 92, 16, 72, 25,129,214,152, 40,198,107, 40,178,138,118, 18, 51,203, 51,156, 50, 96,118, 37,109,169, 4,212,
+ 90,211,238,118,153,140, 70,104, 99,136, 66,233, 3, 86, 90,204, 8,187, 25,122, 87,215, 40, 15,101,158,163, 20, 24, 99,152,140,
+199, 40, 37,156,226,188,200,232,116,100, 39,156,101, 50,103, 81, 74,209, 78, 4, 5,152, 68, 97,147,145, 23, 82, 27, 64,187,213,
+218,171,131,213, 90, 55,124,117,207, 44,207, 9, 3,189,231, 80,223,149,233,241, 52, 23,156,151,145, 72, 37,167,200, 94,183,143,
+ 54,138,162, 40, 41,138,130,110,183, 67,167,219, 17, 67, 81,131,130,141,211, 24,144, 2, 1,173,193,218,154, 60,159, 81, 85,133,
+124,241, 84,133, 14, 2,104,230, 52, 32, 39,132, 60,111,220,161, 86,124, 13,222,123,100, 11,226,155, 89,143,152,190,116,187, 41,
+ 1,137, 18,138,198, 20,216,141, 74,190,246,228, 0,188,195, 15,107, 86,135, 83,206,158, 56,192, 40, 12,137,202, 18, 95,215,204,
+ 61, 52,207,131,247,239,241,248,201,125,156, 58,177,159,245,183,215, 24,151, 53,214, 24,210, 73,205,226,129,132,120,190,205,108,
+103, 70,149, 6,244, 78, 44,178,122,123,131, 56, 82, 76,103, 37,190,174, 8,102, 53, 7,231, 66,212,254, 83, 28,159, 63,200,112,
+123, 11,235, 28,103, 79, 30,103,190,223,227,245,203,239,241,250,219,151,185,120,254, 28, 7, 23,165,133,237, 39,175,188,202,218,
+198, 22, 0, 14,215,200,139, 16, 7,134, 95,254,236, 39,249,200, 83, 79,240,157,159,188,200,173,219,119, 64,105,122,157, 14,171,
+155, 27,204,242, 28,239, 60,139,251,247,113,116, 50, 33,137, 98,134,147, 9,121,158,115,127,101,149,118, 43,101,223,220,128, 32,
+ 8,200,139, 2,231, 16, 42,160, 73,169,108,213, 72,145, 21, 56,216, 26, 21,140, 39, 99,249, 92, 81,226,129, 80,138,131, 11,243,
+116, 91,109,105, 57,107, 28, 73, 95,252,212,199,137,227,152,191,248,206,247,153,102, 25, 39,150, 14,115,254,204,105, 94,124,245,
+ 53, 64,170, 92,159,126,236, 2, 31,251,240,211,152, 48,228,219, 63,252, 9,227,233,148, 65,167, 37,133, 51, 97, 32,114,187,171,
+193,202,171,246,222, 83, 89,201,176,175,172,111,242,210,165,183,120,235,221,247,240,222,243,165,207,126,138, 71, 78,157,164,215,
+235, 72,217,146,173, 88, 58,116,168, 65, 65,211,156,218,132,210,104, 2, 67, 20,138,250, 83,150, 37,203,107,107, 92,187,115,135,
+159,127,244, 59,109,186,237, 54, 87,174, 93,231,212,137,227, 20, 69,193,253,213,117,174,221,188,197,181,155,183,184,251, 96,153,
+205,161,192,126,162, 32,224,220,169,147,164,105,204,160,215, 98,154,101, 92,190,250, 1, 81, 24,113,241,145,179, 76,139,130,215,
+ 46,189,201,255,244,143,126,139, 99,199,143,242,191,223,223,102,187,170,208, 85,135,251,247,222,100,238,208,179, 60,255, 79, 60,
+191,125, 36,165,240,142,127,198,127,202,223,252,217,255,136,198, 98,162, 46,101,166, 57,112,168, 96,117,237, 38, 38,120, 0, 53,
+248, 58,167,152,109,176,179,126, 29,245,210,109, 22,162,231,240, 15, 70,212, 85,142,155,148,148,211, 7, 44,157,251, 34, 91,227,
+255,136,137, 42,206, 62,125,145, 39, 63,229,169,189,226,167,223,111, 17, 5,158,185,199, 21,211,202,179,189,115,157, 67,131, 83,
+ 80,121,184, 13,219,235,138,110,223,115,228,163, 25,213,161, 8,191,110,152,100,158,205,205,132,181, 15, 52,247,207, 67,145,122,
+102,175,192,193,167, 35, 92,191,198,215,138,246, 51, 10,126,242, 60, 65,112,156,205,222,139,172, 77, 50, 20, 1,133, 53, 76,179,
+ 85,116,252,255, 80,229, 61,150,111,190, 79, 16, 76,104, 13, 45,179, 98,139, 78, 43,226, 23,190,242, 41,202, 95,250, 24,111,191,
+248, 3,138,145,162, 88, 93,195,122,145,159,203,122, 68,118,117,204,141,185,111, 19,149,159, 35,187, 54, 99,225,161, 49,117, 57,
+165,115,176, 77, 94, 65,225, 21,199,158,255, 24,215,190,245,231,104, 20, 94, 11, 43,189,118, 18,239,242,222, 19, 38,130,159, 46,
+114, 71,110,171,102,175,172, 8,162,144,241,120, 76,187,221,197,171,154,196, 39, 56,229,176,165, 37,214,193,158,250,213,110,183,
+209, 8,185, 52,203, 50,124,237,176,206, 54,247, 72, 79, 81, 90, 33, 96, 42, 69, 20, 54,166,180, 48, 68, 16,198, 94,144,215, 89,
+ 70,210, 74,113,181,163,213, 18,240, 77,145,149, 4, 73,176,103,240, 86,104, 70,195, 17, 56, 71,229, 28, 91,219, 91,104,163, 25,
+244, 7,226,121, 34,196,150,242, 51, 39,147, 9,105,154, 64, 93, 83, 3,189, 94, 15,165, 20,147,201, 4,137, 12, 59,252,238,104,
+179,150,247, 33, 77, 99, 2, 99,176,222,131,247,205,104, 88, 70,102,214,213, 68,129,148,150, 5, 58,160, 82,224,156, 28,156,189,
+243,232, 80,188, 94,248, 26,239, 37,125,228,108,141, 14, 26, 35,159,246, 40, 35,222,169,170,174, 48, 40,180, 9, 80,129, 33,140,
+ 26, 92,175,242,212,214,145,166,137,200,239, 71,142,159,248,122,171, 37,174, 64, 99, 4,200, 31, 71, 17, 97, 16, 18, 24,141,114,
+210,138, 22,132, 1,129, 9, 81, 90,184,224,129, 9,197, 9,237, 85,179, 3, 17,253,223,123, 71, 89, 86,132, 65, 36,208,137, 40,
+ 33,142,163,189,153,117, 20, 68,120, 37, 51,140,202, 74, 94, 55,140,195, 61, 21, 32,155,137,164,174,194,136,186, 18,147, 28,222,
+ 83, 22,150, 44,207,246, 28,241,149, 19, 10, 93, 86, 90,116,104,246,102, 45,253,193, 64, 40, 65,129, 66, 57,145,139, 77, 32, 82,
+116, 16,135,180, 82,145,217,119,231, 63, 74, 41,156, 21,105,219, 32,198,174, 93,124, 38, 90,102,232, 81,104,216,217, 25, 50,203,
+164, 53, 40,159, 78,201,242,156,118,167,211,128, 5,132,228, 19, 69, 49,224,177,182,162,211,145,120,217,120, 50,161,172, 4,252,
+ 33,196, 46, 33,188,205, 50, 41,158, 49, 74, 28,244, 73,154,138,156, 95, 11, 84, 33,106,226, 20,147,201, 20,163, 21, 74, 25,130,
+208,176, 7,136, 8, 12, 70, 9, 80, 69, 25,132, 73,236, 37,242, 80, 86, 82,122, 99,173, 69, 43, 67,167,221, 98, 54,157, 81, 86,
+210, 64,151,164, 9,198, 52,152,217,162, 32, 12, 99,140,209,141, 97,207, 82,238,114, 0,202,140, 36,138, 80, 78, 92,159,104,193,
+ 9, 23,141,177,164,211,106, 17, 70,194,121, 87, 78, 90,188,140,209, 36, 73, 74,171,149,240,241,211, 49,159,122, 40,193,123,141,
+178,112,251,238, 58,216,138,229,141, 25, 61, 20, 39, 78, 47,146,151,142,153,134, 72,107, 34,231, 25,142,102,228, 30,148, 49,204,
+138,146,201,176,100, 56,202, 88,236,132,220,191,189, 69, 21, 71,140,198, 37, 71,143, 45,128,245,156, 90,232, 80,216,154, 91,247,
+ 55, 48, 7,207, 97,227, 62,239, 92,189,198,143, 94,126,149, 89, 86, 48,215,239, 18, 4, 98, 62,252,238, 79, 94,228,253, 27, 55,
+121,232,248, 17,118,139,114, 54,182,135,128, 34,137, 99,186,173, 22,199,142, 44,241,250, 91,151,249,119,223,248, 38, 91,219, 59,
+120,164,194,244,194,153, 83, 28, 61,120,136,249,193,128,162,204,113, 30,214,214, 55,216,216,218,226,222,242, 42,120,207, 52,203,
+ 89, 93,223,100, 50,157, 49,158, 78, 73,211,132,126,183, 45,227,151, 64,210, 18,117, 93, 51,158,101, 24,173, 40,173,229,165, 55,
+222,228,202, 7,215,126,142, 99,174, 57,123,250, 20,173, 84,192, 77,253, 78, 27,101, 12,117,109,185,122,227, 22, 55,110,223,165,
+170, 74, 54,135, 99,174,223,190,195,115, 79, 61,193, 11,175,188, 70, 93, 59,142, 29, 57,204, 71, 46, 62, 65, 18,199,124,235,123,
+ 63,196, 1,157,118,135,249, 65,143, 78,167, 3, 52, 72, 79, 95, 75,205,176, 21,150,182,173,189,204,231, 2, 67,158, 21,108,236,
+ 12,169,202,146,202, 90, 6,189, 30, 73, 34,228, 48,241,104, 56,170,178,164,176, 21,117,237, 8,194,144,126, 87,106, 81,147, 52,
+161,221, 74,233,180,219,184,218,114,127,121, 21,231,197,152,248,233,231,159,227,239,124,236,163,124,252,185, 15, 17, 6, 1,181,
+151,114,160,229,181,117,102, 69,193,237,123,203,108,236,236,112,250,196, 49, 62,249,145, 15,115,234,216, 18,247, 87,214,153,101,
+ 5, 73, 20,113,233,242, 21,148,130,249,249,121, 62,249,228, 35,152,170,224, 19, 31,122,156,111,168,136,119, 86,135, 28,159,251,
+ 47,168,214,142,179,122,255, 5, 6, 11,154,125,238, 17, 54,142, 42,246, 71,246,255,227,234, 61,131, 44, 77,207,243,188,235,125,
+191,124, 98,135,233,233,158,156,118,119,102,243, 34, 46, 0, 9, 0, 1, 38, 65,164,105, 72, 36, 69,145, 46,154, 18,109, 75,116,
+ 82, 73, 42,149,202,101,151,203, 42,201,233,143,237,146, 93, 22, 21, 44,202,180, 89, 50, 77,145,146, 72, 89,162, 37,146, 16, 40,
+ 36, 18, 88, 44, 54,239,204,236,228,208,185,251,244, 9, 95,126,131,127, 60, 95, 15, 72,119,213,254, 65,245, 98,187, 79,159,243,
+189,239,115, 63,247,125,221,124,176, 53,230,189,111,254, 54,101,113,139, 43,159,252,243,252,232,159,251, 51,252,237,191,250, 3,
+240,125, 63,196,239,252, 47,127,141,182,158, 50, 94,123,137,149, 19, 31,102,245,196,171,216,197,130,252,240, 6,197,116, 6, 38,
+ 32, 78,135, 24,103,248,158,191,241, 51,216, 7,125,204,169, 61,194, 75,142,205,215, 51, 14, 79, 12,249,222,151, 42,138, 73,192,
+205,175,192,189,249,155,100,219,207, 50,216,240, 92, 58,157,243,242, 89,205, 87,126, 79,179,252, 9,248, 76, 95,241,193, 65, 72,
+126, 15,234,109, 69,179, 5,109, 11,197, 67, 79,176,167, 24,127, 68,209,198,158,188,210,152, 80, 81,191, 14,222,130,178, 35,138,
+ 7,235, 44,159,153, 50,159,202,107,226,145,225, 97,237, 66,132,155, 52,236, 61,254,128,249,254, 93,230,123, 59,156,254,158,239,
+ 99,116,238, 26,145,214,172,156, 90,101,146, 79,168,119, 43,108,163,113,205,156,122,113, 64,185,216, 69,219, 29,194,179,240,248,
+ 59, 15, 89, 52,219, 52, 7,123,140, 79,157,196, 56,193,126,135,253, 30, 89, 28,145,239,239,162,129,166,170, 17, 47,144,161,109,
+ 91, 49,139,121,143, 69,154,217,162, 40, 34,238,252, 52,199, 19,176,114, 80, 86,165, 28,246, 97,136,181,178,226, 51, 70,136,157,
+117, 91,203, 90, 20, 5,218, 83, 22, 21, 77, 85, 17,119,113,223, 56,142, 9,181,228,193,157,247,180,221, 48,150,196, 82, 28,230,
+189, 23, 54,134,147, 33,195, 24, 67,218,147, 42,217,170,227, 71, 40,232,124, 1, 93,244, 76, 9, 86,252,216,176,157, 36, 49, 65,
+ 16, 9,168,169,147,250,189,131,193, 80, 62, 51,249, 98,193,160, 63, 4,165, 59, 35, 96, 76, 18,201,239, 11, 16,133, 49,210, 57,
+ 47,107,215, 0, 13, 90,158,153,206,122,210, 84, 62,203,241,147,245, 67,210, 69, 0,229,249,107,141, 35, 8,100,255,175,117, 32,
+ 42,176,146,146, 28, 81, 74, 29,173,147, 52,154, 14, 35,241, 58,104,228,119,174, 91, 81, 72,240, 40,223,213, 28, 91,107, 40,196,
+192, 81,114, 0, 0, 32, 0, 73, 68, 65, 84, 10,217,221, 58, 20,189,238, 5,153,207,102,221, 35, 70, 19, 68,225,147, 27,139,245,
+ 30,103, 4,143, 39,117,160,190,107, 41, 3, 90,249,224,203, 63, 93, 67, 79, 99,208,202, 51, 24, 14,209, 97,132,214, 30,111,193,
+121, 79,150,100, 36,169, 68,165,140, 49,204,102, 83, 28,144,244, 6, 34,227,134, 49,253,161, 56, 26,171,170, 64, 41,141,210,154,
+249,124, 38,251, 4,213, 16,103,210,152,165, 2, 41,169, 8,131,206,160, 54, 47,159,160, 51,179, 84, 26,134, 64, 16,125,129, 22,
+ 7,121,209,181, 77, 89, 43, 37, 46, 32,251,239,229,229, 37, 2, 45,142,255,197,108,134,181,150, 52, 75, 40,230,185, 76, 78,202,
+129,129,201,228,136,241,120,136,214, 33,113, 20, 98,172,196,207,134,131, 1, 14,197,124, 62, 35,140, 98,162, 64, 98,100, 32,209,
+181,166, 44,177, 70,154,164,142,205, 24, 97,168,165,244, 94,107,148,119,204, 22, 11, 20,142, 56, 73,101,111,105, 12,190,161,219,
+103,131, 10, 20, 89,156, 33, 62, 73, 77,152,132,120,207,119, 87, 36,222,163, 98,217, 57, 89, 47, 81,143,217,108, 14,120, 1, 25,
+ 0,105, 36,254,135,170,146,215, 65, 33, 18,144,119,134,166,169,100,149, 82,138,113, 74, 41, 69,152,200,107, 27,199,113,247, 1,
+ 21,120,194,177,180,239,189,167,174, 43,201,135, 86, 53, 63,253,209,101, 48,160, 98, 13,135, 11,134,163,140,163,173, 9,132, 16,
+123,195,244,209, 1, 91, 22, 22, 73,192,162,109, 25,182,208,139, 35,182,242,146, 75,202,163, 71, 61, 10,227, 72,181,230, 48, 9,
+ 57,127,121,149,235, 15,167,180, 94,146, 20,206,123,222,107, 91,158, 59,127,130,222, 78,203,108, 94,241,216,236,241,104,123, 23,
+ 16, 53, 37, 12, 67, 86,151,150,249,173,127,243, 13,140, 49, 60,255,204,211,164, 81,204,165,243,231,120,248,120,139,165,225, 0,
+231, 28,103, 54, 54, 72,210,132,182,105,121,255,206, 93,142,163,140,222, 58,202,178,228,238,163,199, 92, 58,127,134,178, 42,187,
+ 91,120,205,218,234, 42, 74, 41,202,186,101,115,123, 23, 99, 26,174, 94,185, 66,221, 54,148,149, 40, 32,222,251, 39,239, 73,231,
+165,235,160, 42, 43,182,103, 51,222,122,239, 58,111,223,248,128,214, 28, 31,232, 16,133,138,201,116, 66, 18, 93, 96,117,121,153,
+ 40,142, 8,116,192,214,209, 17, 55,238,222, 99,158,231,164,105,202,167, 62,242, 33, 54, 78, 44,179,123,120,136,243, 96,172,128,
+101,234, 86, 64, 73,147,249,156, 55,175,223,224,228,234, 9,202,186, 18,136, 80, 28, 19,132, 1,166, 59,208, 77, 43,221, 13, 42,
+ 8,152,204,231,220,121,244,152,219, 15, 31,162,149,124,142,171,186,101, 58,159, 75,222,126,216,103,177, 88, 80,148, 21,162, 14,
+ 10,209,113,121, 41,147, 14,231, 48, 36,237, 76, 80, 85, 93,145,196, 82, 46,212,230, 5, 75,227, 17, 89,191,199,247,124,234,163,
+ 24,107,112,214,161,240,108,237,238,177,185,179,203,119,222,121,143, 71, 59,187,224, 60, 27, 39, 78,112,254,244, 6,253,126,159,
+217,162,224,239,253, 95,255,136,229,209,144,213,213,101,222,187,113,139, 19,171,203, 36, 88,126,238, 79,254, 49,254,201,172,225,
+157,195, 93, 62,241,197,191,204, 95, 60, 11,255,240,181, 51,212,237,103,136,227,125, 30, 84, 48, 81,138,175,252, 66,194,221,215,
+190,193, 51,175,252, 4,113,111, 70,112,226, 89,222,120, 29,126,244, 55, 38,244,122, 67, 86,206,127,142, 72, 31,112,246,226,103,
+249,220,231,255, 8, 31,255,177,154, 95,248,235, 63,197,175,253,157,115,156,189,242,253, 28,213, 71,236, 62, 56,100,116,242, 5,
+212, 27,138,213,143,101,172,142, 63, 65,230,150,185, 60, 88,227,227,167, 11, 22,192,191,250,181, 3, 94,127,237,111,162,215,246,
+137,139,139,240,247, 71, 56,179, 68,255,212, 89,118,238,254, 54,246,239, 39,252,227,151,190,143,245,107, 79,243,217,255, 72,241,
+ 34, 49, 87, 84,202,175,207, 53,155,255, 66,113,184, 11, 47,172,120, 22,143, 20, 46,131,217,212,163,198,138,182,240,184, 72, 17,
+170, 19, 44,110,188,194,169,243,138, 76, 61, 96,127,186,160,154, 23,248,126,159, 79,124,241, 57,198,111, 69, 60,186,254, 46,204,
+ 83,214,178, 63, 78,245,158, 99,118, 98,159,216,230, 92,220,216,224,205, 71,111,209, 62,246,180,182,166,204, 15,176,139, 93,170,
+188,199,209,254, 93,122, 67,197,244,214, 54,113,223,227, 77,141,138, 82, 76,227, 48, 13,244, 47, 61, 77,250,240, 30,211,205, 71,
+ 88,239, 8,148, 38,141, 19, 22,121, 78, 94, 44, 68, 97, 53, 78, 96, 84, 64, 24,198,164,105,140,247, 50,252, 89, 47,242,121, 89,
+148,212,212,244,210, 76,250, 34,196,150, 33,103,132,175, 37, 3,175, 35, 25,142,162,136,131,201,132, 44, 73,232,245,251, 98, 28,
+211, 90,192, 93, 64, 93,151, 68, 81,194,120, 60, 22,208, 76, 85,162,148,102, 56, 26,146,231, 11,234, 74, 26, 63, 7, 61, 57,148,
+143, 41,117,121, 94,210, 52, 21,109,183, 95,183,221,123, 85, 20,227,128, 40,150, 9, 91,146, 72, 61, 22,249, 66,146, 77, 81,194,
+162, 88,144, 36, 41,206, 90,233,107,143, 35,130, 40, 38,246,177,236,228,123, 41,199, 42,119,190,200,113,181, 35,203, 18,210, 84,
+146, 43,109,219, 32, 29,238,138,180,159, 18,162, 9,162,136,241,104, 76,219, 53,193, 1,210, 73,162,192,187, 6,144,134, 54,229,
+ 21,202,120, 90, 20,117, 93,163,148,156, 35, 79,124,112, 90,163, 91, 69,163, 27,210, 56, 33,140, 66,113,115,167,189, 30,222,123,
+102, 71, 83, 80, 1,206,137, 64,238,148,195, 27,195,228,232, 72, 14, 11, 96,212, 31, 96, 90, 49,181, 5, 74,209,235,103, 40, 37,
+ 77, 79, 74,129,115,142,249, 98, 78,191,223,167, 44, 75,122,189, 62, 69, 89,200, 30, 65, 9,211, 59, 8,100,242,180, 86,120,220,
+211,201, 20, 99, 29, 42,138,100,202,246, 17, 73,183, 67, 55,182,165,105,228,102,167,212,177,203, 29,134,163, 17, 77, 91,211, 52,
+ 21,163,209,152, 50,207,233,117,208,141, 65,218, 99,190,152, 51, 24, 12,240, 74,120,213,101,158,163,130, 0, 29,199, 12,135, 99,
+240, 86,204, 75,198,112, 52,157,202, 67, 53, 73,152,205,166, 40,165,209,161,192, 15, 52, 33, 85, 81, 10, 88, 39, 0,237,161,168,
+ 90,192, 51,159,231, 34,241,116, 47,112, 47, 77, 9, 34, 65,129,102,105, 79, 34, 15, 58,192,180, 34,111,155,166, 65, 43,245,196,
+ 33, 28,198,178,159,153,205,230, 4, 81, 72, 47, 73, 41, 22,115,210, 94,134,242, 80,148, 21,222, 91,210, 52, 3, 37,100,176,168,
+187,193,210, 29,240,242,119, 59,194, 58, 79,160, 66,156,239,148,135, 64,138,109,194, 32,192,105,197,112, 56,144, 75,137,150,189,
+ 77, 81, 20,146,129, 31, 8, 22,209, 59, 80,120, 92, 83, 17,165, 25,182,181,204,155, 25, 89,154, 17,106, 77, 89,213, 88,196, 32,
+167, 91, 97,212,199,161,152, 71,156,179,244,178, 30, 69, 89,210, 26,195,247, 94, 77, 89,239,201,161,230, 19,184,115,111, 7,237,
+ 13, 85,209,240,252,198, 8,151, 23,168, 72, 49,176,158,126, 24, 82, 28,213,188,190, 61,165, 1, 74, 15,211, 56, 64,233,152,139,
+103,123,236, 62,156, 48,143, 34, 30,151,150, 44,137,152,148, 13, 55,238, 79,192,193,106,148,114,247,168,100,148,141, 48, 10,218,
+ 34, 39,236,214, 27,222,123,214, 86,150,105, 90,195,203,207, 93,229,189, 15,238,112,235,222,125, 62,242,210,243,196, 58, 36, 73,
+ 18,154,166,225,112, 58,227, 43,223,124,141,239,121,245,163, 60,251,212, 21,190,231,147, 31,231,234,229,139, 92,191,117,151,157,
+131, 3, 38, 71,115, 54,183,119,153,206,133,253,239,148, 22,197, 74,105,182,118,101, 90, 71, 57, 86,150,151,184,122,249, 2,107,
+107,171, 76,166,115,230,243,156,209,112, 64,146, 74,191,116,160,197,213,154,166, 41,167,179,148,245, 19,171,172,157, 56,193,191,
+252,221,175,114,252, 37,117,189,136, 1,198,125,247,162,121,225,204, 25,174,156, 63,203, 7,119,238, 83, 85, 21,191,255,250, 27,
+124,248,197,231,104,157,227,233,139, 23,184,116,241, 60,159,254,216,135, 49,198, 48,201,115,250, 89,198,217, 83, 27, 60,117,225,
+ 2, 47, 62,253, 20,101, 46,128,162,192,218,238,242, 37, 88, 76,165, 20,182,182, 76,142, 38, 28, 28, 28,145, 87, 21, 87,206,157,
+101, 99,125,157,143,191,242, 2, 87,206,159, 35,203, 50,132,200, 21,146,166, 13, 71,179, 25,120, 71,218,173,210,172,181, 84, 85,
+197,111,125,245, 27,252,155,111,124,147,155,119,239,241, 7,123,225,211, 36,230,165,103,174, 96,172, 35, 63,146, 97, 97,182, 88,
+ 48, 91, 44, 24, 13, 7,140,250, 18, 83, 43,129, 69, 94, 48, 57,154,226,172,227,204,198, 58,151,207,159,101,123,255,144,197,162,
+224,212,201, 53, 62,116,245, 41,214,134, 49,118,253, 20,215, 31,237,113,138, 31, 97, 41,131, 95,226,144, 7, 55, 87,136,117,200,
+222,214, 61,118, 31,255, 75,212,239, 90, 92,208, 50,219,186, 69,128, 35, 27, 39,132, 91, 83,226,100, 76,211,204, 56,216,220,231,
+218,103,255, 83, 70, 97, 69,126, 84,242,198,155,135, 60,188,183,138, 14, 60,233,240,101,182,239,126,139,229,245,167, 56,127,237,
+223,225,234,243, 63,192,230,157,111,178,163,191,193,112,112,138,253, 15, 12,215,171,130,191,255, 63, 94,231,222,219,191,200,226,
+240, 13,134,163, 85,242, 34,167,215, 75,137, 82, 33, 78,154,119, 10, 92,171,177,190,101,247,225, 47,114,233,254, 15,176,245,206,
+207,240,194,231, 62,194,103, 62,167,208,206,179, 61, 83,220,121,243,109, 78,252,153, 23,184,252, 74,129,219,239,177,255, 14,236,
+ 28, 42,172,170,200,231, 33, 83,167,152,108, 77,152, 95,159,177,124,165,230,218,185, 13,174,215,134,235,239,222,192,183,150,171,
+207, 93,226,212,249, 85,246,110, 42, 86,214, 95, 34,159,222,166,186, 53, 99,177, 92,113,114, 20,178,177, 58,230,254,189, 67,188,
+ 5,111,114,240, 53,110,150, 50,221, 59,224,227,159,252, 16,247,110,123, 50, 45,141,106, 1,150,214, 11,187,188,105, 67,206,124,
+242,211, 52,255,252, 55,240,177,193, 89, 79, 89, 55,244,135, 3,176,130, 82, 77, 51,153, 88,189,181,228, 69, 65,110,100,141, 26,
+234, 4,111,133,216,214,207,122,128,163,172, 27,172, 51,114, 88,107, 24,244,135,120, 44,197,162,194,169,174,151,163, 42,241, 70,
+ 12, 96,101, 85, 19, 71, 17,227,229, 37,156,113, 68,105, 44, 64, 46, 35, 16,172,214, 26,250,131, 1,206,203, 97, 28,133, 17,117,
+221, 60, 49,189,133, 97, 36,131, 84, 83,147, 38, 9, 85, 93,226,189,248,105,218,186, 34, 73, 99,226, 48, 4, 39, 62,161, 40,137,
+136, 98,241, 57,101, 89,198,108, 54,199,133, 82, 30, 54, 91, 44,192, 41, 84,160,169, 90,131, 54,158, 56, 14,176, 22, 22,243, 41,
+222,122, 70,195, 33, 89, 42,151, 30,239, 5,164, 19, 4,242, 25, 46, 59,117, 54,159,119, 43,133, 52,165,151,166, 68, 81,210,249,
+147, 68,233,118, 14,188,119,204,243,156,225, 96, 0, 14, 60,150, 64, 71,228,197,156, 48,136,200,122, 25, 10,133,243,134,162,168,
+ 72,123, 25,120,121,166,135,199, 59,225,249,124, 46, 15, 96, 0,103, 24,142, 70,180,198, 62,121, 64,226,193,122,217,125, 28,118,
+109, 80,120,209,251,199,163, 49, 90, 59,145, 14, 60,210,145, 30, 72,215,122, 16, 72,188,224,152, 54, 22,105,113,203,135, 90, 99,
+218,150,217,108,134,119, 86,246,205,189, 30,161, 82,148, 85,137, 71,118,235,222, 11,126, 47, 77, 82,140,151,168,153, 87,138,193,
+ 80,138, 87,240,114, 67, 51,173, 72,249, 90, 11,213, 74,105,217, 79,162,160, 40,115,180,134, 48, 8,113, 14,185, 40, 24, 41, 89,
+209,161,102, 62, 47,186, 67, 48, 36,138, 2, 2, 21,203,234, 65,105,136, 19,188,119,164, 62,197,180,146, 23, 28, 12,134,196,169,
+116,235,226, 60,160, 37,255,235, 45,101,221,160, 91,141,177, 45, 40,232,247,134,180, 70, 74, 13,218,170, 34,212, 33,105, 63,195,
+ 35, 4, 35,103, 92, 23, 29, 9,133, 99,239, 60, 89,175,143, 49,194, 84,206,250, 61,154,178, 38,140, 2, 22, 51, 49,149,180,199,
+ 30,132,182,101, 48, 26, 49,159, 77,241, 58,192, 52, 21,173, 23,196,237,210, 96,137,162, 42,152,119, 77, 88,129, 10,104, 76,131,
+228, 55,229, 1,239,241, 40,171, 58, 23,123, 12,117, 77,109, 12,253,126,159,249, 98, 33,232,198, 80, 46, 94,105, 58,160, 23, 4,
+242,254, 80,199,121,121,161, 43,181, 13, 29,229,200,200, 84,143,227, 39, 94, 22,118, 61, 9,168,237,130,111,189,185,201,234, 40,
+ 33, 11, 20, 58,207, 57,172, 28,117,181,224,228,234, 0,156,165,202, 91, 84,168,176, 30, 86,179,128,184,159,145, 6,176,121,119,
+159,178,110,185,104, 71,108, 79, 11,114,235,201,116, 40,156,120, 5, 77,107, 73,138,134,239, 20, 5, 39,226, 28,178, 17,227,209,
+ 80, 14,142,249,140,157,253, 3, 86,150,150,216, 61,152,112,112, 56, 33, 77, 99, 54,183,119,121,230,242, 69,178, 36,161,106, 26,
+130, 32,224,147, 31,126,133, 23,159,189, 74, 28,132,108,156, 88,225,206,253,135,220,121,248, 0,231, 96,117,121,204,211, 87, 46,
+178,126, 98,153, 32, 8,196,157,219, 52,236,237, 31,176,127,112, 32, 31,164, 48,228,233, 75, 23, 56,117,114,141,209,112, 64, 47,
+ 73, 49, 39, 86,209, 8,194,248,189, 7, 15, 57,177,180, 36,151, 62,173,104,218,230,137, 73,108,105, 52,146,131, 18,193,107,174,
+ 46,141, 89, 93, 94,102, 52, 24,136,185,174,105,152,206,231, 60,122,188, 37,254, 11, 5,103, 54,214,137,163,136,229, 94, 74, 47,
+142,185,121,235, 46, 79, 93, 56,135, 86,154,239,188,251, 30,101, 37,205,105, 55,238,221,163,223, 79,185,116,238, 28, 58, 16,146,
+162,168, 57,138, 48,140,137, 34,185,240,158, 92, 61, 65,150,222,163,159,166,220,121,240,136,121,158,115,233,236,105, 94,188,118,
+149, 94, 26, 83, 53, 70, 38,125,173,208, 90,250,210,195, 78,157, 42,107,136,195,144, 87, 95,126,145, 94, 18,115,230,244, 41,190,
+250,205,215,200, 11,185, 4,129,230,197,107, 87, 41,202, 10,173, 52,243, 60,231,183,191,250,117,254,245, 55,190,197,246,238, 46,
+117, 35, 83, 74, 28,135,244,122, 61,150,150, 70, 24, 43,151,248, 31,252,236, 31,225, 95,124,233,171, 60,115,241, 60,243, 60, 39,
+193,243,226,149, 11,252,230,214, 4,107, 35,124,180,206,209,183,225,245, 47, 39, 28, 29,126,131,186,125,192,116,243, 93,140,158,
+ 96, 26,131,109,107,202,249,125,118,239,126,141,103, 95,253, 17, 84, 82, 66, 24, 97,138, 57, 77,181,160,250,214,255, 46,156,133,
+112, 76,191,191,142,179,215,112, 65,204,231,127,248, 23,217,222,254, 21, 6, 39, 71, 92, 58,255, 83,124,250,167, 21,223,254,245,
+ 19,188,246,155,127, 19, 14,193,228, 37,179,195, 59,228,139, 41,144, 18, 70, 61,230,179, 41, 56,195,220,182, 4, 69,133, 55,226,
+252,118, 78, 50,201,197,180,229,253,163,127,202,248,196, 55,184,254,149, 51,252,234,127, 55, 32, 12,199, 56,159, 83,230,143, 56,
+250,169,159,225, 83, 95,252,105,254,236, 79, 84,152,143,102,212, 95,131,195,226,144, 96,227, 17, 90, 29, 49,123,111,143,157,251,
+223,225,193, 59,219, 28,124,228, 2, 87, 63,245, 18,170, 45,185,243,232, 17,173,247,156, 91, 26, 50, 62,223, 48, 59,124,132,105,
+ 61,249, 60,167, 50, 7, 52, 71,142,229,193,128,251,227,199, 48,201,208,170,123,222,198, 17, 71,243, 28,180,230,249, 15, 61,143,
+137,196,148,101, 10,131,200,126, 1,101, 9,193,104,200,234,181,231,216,123,247, 45, 22,139, 5, 0,149,119, 12, 6, 3,154,170,
+ 33,246, 33, 58, 12,105,172, 20,240, 4, 65, 32,133, 41,109,131,246, 10,148, 72,227, 97, 16,147,101, 82, 13, 93, 85, 18, 49, 5,
+240, 94,145,100, 49,206, 41,192,131, 19, 92,118,221, 72,243,166, 67,204,186, 97, 20, 82, 85,149,172, 21, 3, 77,104,132,158,217,
+ 84, 21, 85, 93, 99,189,101,121,184, 68,214,235, 9,147,161,145,172,189, 53, 93,219, 40,142,193, 96,196, 98, 54,235, 84, 81,197,
+ 98,158, 19, 45, 69,194,149,215, 10,219, 90,106, 85, 96, 29, 79, 82, 33, 81, 20, 81,149, 37, 88,143,199,161,172,167,110,229,103,
+175, 42, 25, 30,156,147, 60,250, 60,159,147, 37,242,236, 11,117,216, 41,174,186,139,171,137,209,216,122, 71, 91,212, 18, 27,111,
+ 42,194, 32,166,151,117,175, 91,253,221, 6, 76,173, 84,183,214,141, 81,200,128,148, 36, 25, 85, 83, 19, 84, 21,113,154,209, 52,
+150, 40, 12,187,182, 82,233, 53, 9,171, 90,178,165, 32,149,148, 14, 40, 43,105, 91,210, 74,178,229, 58,234,152,232,165, 33, 74,
+ 98,188, 5,237, 29,121, 81,128,129,253,253,125,113,223,105,205,104, 52, 38,234,178,140, 97,231, 46, 86,240,221,203, 1,194, 13,
+159, 77,167, 79,178,226, 65, 28,145,232,128, 16,168, 90, 35,160, 16, 28, 30,223, 25,223, 2,134,195, 33,166,144,238,101,217, 5,
+183,232,208, 49, 26, 15, 17, 44, 97,139,246,158,233,116,202,120, 52,194, 41, 1,228, 47,138,156, 48, 12, 73, 2,153,150,140,107,
+200, 23,237, 19,167,121, 47,203, 24, 15,229,161,170,117, 32, 19,141,130, 56,203, 8,117, 32, 96,130, 88, 99,172,144,130,134,195,
+126, 39,165,122,138,162,236,118, 53, 1,195, 76, 76, 26,248,174, 76,192, 6,228,101,133,214,190,139,114, 36, 93,238,191,161,236,
+100,127, 99,165,174, 20,160,232, 58,130, 23,139, 57,253,254,128,178, 44, 1, 41,216,145,166, 58, 1, 59,104,173, 65,137,206, 30,
+ 5, 17, 10, 24, 12, 71,184,182,193,212,210,164, 54, 24,246, 65,195, 96, 48,192, 26,219,177,137, 29, 65, 24,176,152, 47, 80, 74,
+ 49,236, 15, 64, 75,132, 81,163,168,170, 26,165,165,133,109, 62,159,161,149, 98, 48, 30,227,172, 65,218,128, 22, 56, 47, 52, 35,
+165, 20,129, 14, 48,129,236,250, 21,158, 48, 12, 8, 58,249,236,169,147, 9,103,199, 1, 62,246,224, 52,191,245,187,215,137,181,
+163,215, 24, 84,172,201, 91, 79,164, 21,203, 43,125,194, 44, 97,247, 32,103,175,168,137,179,140,181,165, 30,179,105, 73, 98, 65,
+ 7, 80, 98,169,112,132,182,165,137, 99, 78, 37,154,133,245, 28,196, 1,163,220, 80, 97,169,172,231,103, 63,119,133,215,231,240,
+126,173,121,234,226, 69, 0,154,214,112,239,225, 38,167,214,215, 57,127,106,157,247, 63,184,213,145,158,132, 38,184,178,188,196,
+112, 48,196, 76,167,114,160,100, 41,189, 94,143, 69, 89,113,229,194, 89, 14, 38,215,184,191,185, 37,232,224,166,237,128, 68, 17,
+195,129, 80,195,210, 36,101,107,111, 31,231, 97, 94,148, 76,102, 11, 30,108,109, 51,156,246, 57,189,113,146, 32, 12, 40,171,154,
+ 71,155,219,178,166,170,196,189,189,185,187,203,214,222, 62, 71,147, 41,187,135,135, 79, 14,116,224, 9,120,165,105, 26, 22,121,
+193,160,151,226, 3, 49,185,205,115,105,138,178,214,242, 96,115,147,211,167,214, 73,162,132,253,122, 74, 94,150, 12,251,125,234,
+166,230,252,233, 83,188,246,230,187, 84,101,197,242,112,200,222,193,132,241,112, 72,154,196, 36,174, 3,105, 32,107,129,163,233,
+140,173,157, 61,126,231,235,191,207,131,199, 2,205,121,249,185,171, 92, 58,123,134,115,167, 79, 49,207,115,142,233,146,130,234,
+148, 88,107, 28, 73,197,101,219,200, 94,126, 82, 76,248,123,255,247,175,113,243,131, 59, 44,254,192, 3, 27,164, 17, 43, 47, 74,
+130, 64, 61,161, 73, 14,135, 67,174, 94,185, 72, 85, 87, 28, 28, 78,104, 90,195,234,242, 42,175,190,252, 34,103,214,215, 9,130,
+128,170,109,232,101, 61, 62,246,202,243,188,254,246,123, 44,143,199,156,233, 71,236, 39, 3,222, 62,170,176, 83, 56,124,244, 53,
+222,254, 90, 69, 81,236, 48, 61, 56, 96,253,202,171, 20, 71, 71,180,213, 29, 26,151,210,148, 51,166, 91,239, 48, 88,251, 36,229,
+ 98, 78, 61,249, 54, 74,245,112,222, 83,206,118,217,158,220,224,204, 51, 31, 38, 28, 94,162,170,142, 48,174,162,154,239,177,178,
+250, 2,103,127,232, 69,130,173, 17,135,179,155,188,249,255, 60,195,187,111,191,207,193, 27,183, 56,154, 30, 18, 41, 47,197, 73,
+182, 37, 8,196,192, 20,132, 1,253,225, 18, 58, 8, 37, 70,213, 4,114, 88, 24, 35,223,151, 68, 88, 83,179,255,232, 30, 97,186,
+139,210,138, 40,238,211, 54, 57,206, 25,222,255,234,127,195,163, 27,255,136,199,247,255, 22, 63,247,159,173,208,255, 99,142,131,
+ 95, 57, 67,249,193, 22,225,232,144, 96,240, 30,213,236, 38,139,195,125, 30,189, 22, 16,182,151,184,242, 61, 47,224,238, 95,103,
+111,145, 99,173,229,226,210,136,157,237,119, 48,238,105,138,197, 2,171, 74,108, 81,147,249,132,208,213,132,233, 16,223, 38,224,
+ 79, 48, 58,191,198,209,116,202,157,251,143,120,233,165,107,156, 56,127, 30, 76,203,246,163, 45,116,101,169,156,130,221,144, 66,
+ 55,244, 47, 94, 99,243,157, 55, 8,130,142,242,217,235, 81, 20,133, 12, 34,222, 83, 55,210,136,230, 90,139,193, 49,234,247,137,
+146,132,182,109,177,206, 18, 41,241,230,180,166,197, 89,241, 81, 69, 90, 19,119,103, 68, 89,150, 79,158,101, 85, 94, 80, 85, 98,
+ 54,110, 26, 71, 24, 58,230, 93,241,146,242,138, 52, 77, 80, 74, 19, 5, 49,121, 81, 98,109, 75,191,215,199, 42, 11,129,116,161,
+135,177,144, 52,171, 69,217, 93, 52, 34,242,197,156,162, 40, 25, 47, 45,211,180, 13,101,158, 3, 98, 72,139,162,152, 65, 24, 51,
+ 95, 44,104,141,235,218,219, 20,222, 43,105, 85,211, 33, 89, 38,208,181, 99,179, 50,208, 77,209,162, 70,180,206,208, 84, 21,139,
+118,193,112, 56,196, 33, 19,119, 26, 39,148, 85,142,115,162, 82,235, 48, 32,201, 50, 84, 43,137, 24, 99, 12,243,197, 66,124,232,
+222, 19,167, 41,222, 88,210, 36,198, 58,199, 98,190, 64,114,235,224,157, 37,141, 69, 13, 46, 75,249,249,179,180, 7,222, 83, 27,
+169,125, 13,206, 95,186,252,215,226, 56,166,151,246, 58,103,120,136,119, 14, 21, 4,164, 73, 66,156, 36, 79,246,184,182,187,137,
+213,117, 77,107, 26,232, 94, 96,227, 61,174,105,176,120,170,178,162,234,130,251,199,255, 84, 85, 69, 83,149, 84,117, 67, 85,150,
+148, 69,142,113, 86,226, 17, 89,138, 83, 96,234, 70,222, 0,198,118,136, 87,129,223,247,211, 12,227,189,180,170,101, 25, 73, 42,
+109,111,105, 42, 8, 67,229,229, 98,144,116, 38,132,186,203,136, 59,227,192, 11, 20, 37, 77, 82,234,166,150,233,223,203, 4,111,
+141,161,159,245, 57, 46, 46,232,245,123, 36, 81, 68,191,215,163,200, 75,154, 70,246, 60, 65, 20, 48, 91,228,224, 28,105,150,113,
+220, 62, 86, 84,242,130, 26, 35, 88,191,227,120,148,105,164, 8, 39, 10, 35,156, 23, 71,122, 20,134, 52, 77, 11, 74, 46, 62, 73,
+146, 62,121,184, 89, 35, 93,196,214, 26,146, 68,184, 0,199,208,155, 48,148,120,153,105,101, 15, 25, 4,226, 41,136,162, 24,103,
+ 28,141,109,112, 86,144,176, 81, 20, 17,197, 49,166,105,196,245,174,180, 48,135,195, 64,232,119, 85, 69, 93,137, 49, 36,203, 50,
+156,151,181, 7, 94,227, 76, 67,191,151, 17,199, 9, 69,158,139, 18,210, 31,208, 90, 49, 67, 69, 81,132,214, 98, 38, 83, 90,246,
+195,105, 42, 4, 37,227, 44,117, 89, 98,173,236,214,173,181,252,204, 39,251, 60,119, 34,128, 89,203,111,255,179, 55, 65,105, 70,
+253, 8, 95, 52,180, 58,160,172, 44, 89, 34,145,168,123, 7, 5,139,142,242, 4,138,222, 60,199, 56, 69, 54, 72, 88, 26, 68,236,
+238, 45,136,181, 96, 22, 7,120,242,188,161,104, 28,213,162, 98,222, 90, 62,113,225, 4,203,235, 3, 62,216,202,153,215, 21, 19,
+191,198,227,189, 93,222,189,121, 11, 99, 44,195, 65,159,103,159,186, 66,211,212, 76, 23, 5,171,203, 99, 94,126,254, 89,214,215,
+ 86,121,253,237,119,249,218,107,175, 99,173,101,109,121,137, 44, 77,233,101,146, 78,216,220,217,103,247,224,160,251,176,180,108,
+156, 60,193,250,202, 10,151,207,157, 37,138, 99,250,221,101,174,168,106,102,243, 5,211,249,172,163,102, 41,206,156,218,144,215,
+ 51,148,201, 98,255,112,194,141,219,146, 51,111,141,225,236,169,117,206,159, 57,205,139,207, 60,197,195,205,109,246, 14, 39, 79,
+ 30, 18, 90,193,120, 56,224,249,171, 79, 49, 30, 14,112,116, 83,128,119,220,121,240,152,189,195, 3,180, 86,156,219, 56,197,249,
+179,167, 89, 95, 89,226,236,233, 13, 78, 44, 47, 83,148, 57,189,180,199,228,104,202,245, 59,119, 56,152, 28, 17, 70, 17,175,190,
+242,162,228,240, 19, 97, 37,104, 64, 12, 75,142, 32, 80, 4, 97,200,202,120,200,206,238, 1,121, 89, 98,172, 99,208, 19,131, 93,
+214, 77, 94,199,158,147,214, 88, 90, 99,208,154,238,179, 38, 32,167,214, 24,246, 15, 14,185,253,232, 17, 85, 85, 63, 57,208, 47,
+159, 63,203,149, 11, 23,232,247, 82,178, 44, 67,233,128, 91,119,239,243,230,123,215,121,239,230,109,142,230,139, 39,223,223, 90,
+195,234,242, 50, 87,206,159, 99,216, 23,196,168, 49,162, 16, 28, 59,141,215, 51,197,107,109, 76,142, 99,190,151,179,115,251, 3,
+170, 98,143, 83,159,252, 83,252,202, 47,124,129,191,240,197,103,248, 78,240,227, 92,255,250,175, 48,219,121,141,124, 54,225,197,
+239,255,207,249, 31,190,241, 63,241,133,159,253, 49,190,242,203, 31,240,248,230,175,227,155, 35, 22, 7, 55,184,244,252, 79,211,
+ 31,159,160,156, 61,162,174,102, 76,247,110,179,125,247,107, 16,151,164, 43,154,163, 15,230,108,222,125,135,111,254,206,223,229,
+230,107, 63, 79, 93, 76,136,211, 62, 62,177, 68, 58, 36, 77, 50, 2, 52, 86,137,177, 86,171, 8,239, 28,182,117, 56, 44,222, 88,
+180,130, 48,136, 9,131, 8, 84, 32, 64, 33, 99,240,182,193,212, 5,214, 74, 18,164, 46,115,142,246,111, 81,205,238,146, 46,125,
+145, 23,158,211,220,120, 39,226,206,187,239,114, 52,187,193,254,141,119, 41, 15,197,119, 20,244,207,112,238,252,159, 38,227, 10,
+ 27, 87,114, 14, 15,143, 88,148, 37,147,124, 78,225,182,201, 31, 55, 84,249, 17, 20, 57, 62,170,228, 0, 41, 74,194, 19,125,124,
+153, 16,143,214, 24,246,215,136,198,150,189,189,125,206,173,175, 97,146, 51,120,165,104,138, 67,249,155,168, 8,223,243, 88, 52,
+ 58,138,232,101, 33,205,254, 62,141, 49,221,228, 28,208, 58,241,156,212,149, 68,109,109, 55,193,151, 85, 37, 44,145,178, 38, 47,
+114, 76,107,200,250, 25, 81, 20,139, 98, 24,106,194, 56,162, 40,229,162,123,124, 89,213, 65, 64,210,121,118,162, 72,232,110, 89,
+146, 49, 28,138, 41,217,122,143, 53, 50,224,228,121, 73,214, 75,137,162, 24, 21,120, 76,219, 61,219,189,195, 91, 8,148,252,127,
+ 25,231,105,219,154,193, 64, 98,204, 32, 14,245, 36,145,178, 42, 73,128,120, 60, 82, 52,118,108,148,174, 75,137, 20,155, 86, 80,
+202,101, 93, 61, 97,144, 56,231,232,150,124,120,173,137,147,176,147,218, 21,198, 88, 90,219,146,166,178, 66, 69, 9,251,222, 57,
+136, 98, 57, 11, 90,107,136,194,152, 36,142, 72,211, 46,153, 20,137,153, 22, 39, 20, 62,235, 28,182, 51,164,166,169,156, 7, 97,
+ 20,225,177, 84, 69,133,239,148, 93,239, 5,235,173,148,196,230,194, 40,142, 49,173, 37,111, 10,194, 84, 38, 63,165,101,103, 88,
+148, 37, 73, 42,192, 20,239, 61,198,202, 47, 57,232, 15,240, 56,230,243, 5,198,123,108,219, 18,120,158,228,168,181, 10, 8, 66,
+193,136,250,182,197, 1,214,131,115,134,227, 56, 68,154,101, 68,129,152,213,198,163, 17, 42, 73,112, 70, 12, 98,121, 81, 48, 28,
+ 12, 8,117,136, 10, 35, 84, 43,113, 9,211, 29, 50, 56,240, 74,236, 58,198,123,185, 13, 43, 5, 78,110, 88,182,109, 73,226,132,
+188, 46,232,101, 61,170,186, 66,163, 81,129, 2, 39, 57,112,165, 21, 69, 83,208, 11,123,132,113,204,124, 62, 35,205, 18,180,142,
+ 73,251, 61,138,197,140, 69,190, 0, 47, 84, 36,215, 73,206,109, 83,209, 58, 24, 15,135, 79,110,108,109,107,152, 78,167,178, 87,
+215, 1, 65, 16, 82, 52, 45,105,154, 18, 7, 65, 87,122, 33,196,175, 40,146,219,151, 67, 12, 36, 98,174, 11,233,197, 33,200,221,
+142, 56, 12, 5, 77,136, 35,205, 82,180,215, 82,100,208,189,174,214,202, 94, 93,133, 10,229, 53, 54, 55, 20, 69, 33, 21,167, 65,
+192,160, 63,192,121, 79,211,136, 2,163,181,166,110, 91, 6,131, 1, 65, 16, 16,199, 93,146, 65, 41, 26,211,130, 23, 89,125,177,
+200,233,101, 25, 85,231,164, 87, 94,209, 26,139, 14,196, 15, 80, 20, 5, 65, 32,222,137,227, 62,225, 40,138, 72,123, 61,180,146,
+255, 78, 63, 40,249,225,231,123,120, 3,223,121,253, 54, 77,217,240,176,180, 92, 25,103, 12,174,108, 16,134, 33, 43,242,190,101,
+239,241, 1,211,188,165, 55, 16, 94,244,160,174,152, 70, 1, 35,103,184,243, 96,143, 75,231,215, 24,102, 9,173,243, 60,119,225,
+ 4, 62, 14,121,231,198, 22,222, 59, 98, 15,103,135, 41,147,163, 25,245,102, 77,218, 79,208,253,152,179,235, 3,146, 81,159, 43,
+151, 46,240,206,251, 55,165, 76,199, 91,158,185,114,153, 47,125,253,155,124,253,181,215,153,205, 23,252,187,127,242, 71, 8,163,
+144, 40, 8,121,254,234, 83,124,248,133,231, 56,179,177,142,210, 34, 71,159, 63,179,193, 59, 55,111,162,129,231,174, 92, 38, 8,
+ 66, 6, 93,218,193, 58,207,225,116,198,187, 55, 63,224,219,111,190,205,253,173, 29, 34, 29,112,233,218,121,206,109,156, 34,212,
+ 26, 97,172, 59,170,186, 17,195, 79, 79,226,147,117,211,202,100, 83,215,124,233, 43, 95,231,205,247,111,240, 7,191, 70,195, 17,
+ 27,235,107, 20,121, 69, 81, 86,242,158, 9, 2,238,111,110,113,127,243, 49,101, 85,163, 81,204,230, 11,172, 49, 98,164,113,150,
+225,176, 71,154,164,180,166,229,214,195,135, 28,167, 65,118,246, 14, 56,156,206, 57,127,250,180,224,134,129,214,121,140,145, 24,
+101, 85, 55,108,239,238,114,239,209, 38,187,135,178, 86, 91, 26, 14,168,154,234, 73,113, 74,221,212, 40, 20,129, 86, 79, 46,197,
+117, 45, 60,172,178,146,203,242,193,225,132,111,190,249, 14,243,121,254,135,126,159,135,155, 91, 60,125,241, 2,147,217,156,193,
+193,132,105,103,224,219,221, 63,192, 56,129, 24, 73, 14, 23,174, 94,188,200,171,175,188, 72, 20, 71, 24,231,112, 94,128, 73, 85,
+221, 8,221,176,169,168, 8,184, 91, 22,244,207, 62, 15,239, 30, 80,230,111,176,122,250, 42, 31,190,118,145, 67, 74, 26,239, 89,
+ 89,137,248,216,247,253,247,220,124,243, 31,178,182,190,202,247,254,216, 95,100,217, 27, 28, 57, 31,255,194,127,193,100,239,117,
+166, 59,239,242,244, 71,255, 28, 63,250, 23,254,107, 30,221,134,111,253,203,191,206,246,187,191, 74, 91,239,177,116,242,147,164,
+189,148,205,119,190, 77,253,208, 50,221,185, 65,147,111,129, 85, 88, 60, 26, 75,224, 18,226, 0, 90, 39, 6, 72,144,135,188,107,
+ 42,194, 44,237, 84, 59, 13,218, 99,116,141,175, 74, 76, 37,132, 66,165, 21, 97,220,195, 19,162,148, 69,249, 0, 29,136,177, 83,
+ 27,184,251,198,191,226, 23,255,171,159,228,159,255,157,207,162, 19, 77, 53,187, 9,213, 22, 59,251, 59,164,107, 49,131,254, 69,
+ 54, 46,124, 47, 31,249,208, 85,158,126,206,241,157,247,254, 40,107,203, 59,220,189, 87, 96, 49, 4,190,196,154,247,153, 77, 10,
+210,108, 70,207,196,212,170,102,243,246, 99,174,126,254, 44,126,170, 80,234, 4, 97,118,142,231, 94, 57,199,239,127,229,203,188,
+123,231, 62,103,244, 10,108,173, 48,186,168,209,174,193,171,132,214, 6,168,125, 77,179,225,232,159,127,138,228,246, 45,138,188,
+192, 58, 3, 42,198,183, 18,117,246, 86,234,154,171,170, 34, 95, 44,232, 15,135, 4, 40,156,183,184,133, 60,135,102,211, 25,105,
+218, 99,208, 23, 3,155,105, 91,180, 82,148,121,142,245,158, 56,136,176,174, 37, 64,114,226,109,219,118,145,173,238, 25, 86, 74,
+231,185, 34,166,200, 11,130, 72,100,231,227,181,107, 18,119,157, 34, 81,132,239,100,127, 21, 4, 4,206, 63,129,179,212,141,184,
+212,157,115,164,113,138,183,142, 72, 7, 44, 10, 89, 43, 40,173, 89, 90, 26, 97,173, 18, 64, 86, 18, 83,218, 86,134,220, 40,196,
+ 57,143,178, 14,143,144, 29,189,242, 68, 90, 99,180,198,181, 45,113, 44, 42, 66,211, 52, 20, 85, 73,150,196,228,185,172,161,134,
+131, 97,247,187, 68, 24, 83,163,131,174,229,210, 41,188,179,232, 32,194,105, 97,228, 43, 45, 36,185,172,215, 39,176,210,134, 42,
+248, 91,105,255, 20, 16, 78,138,105, 26,202,186,198,121,137,201,133, 97, 72,216,182, 45,113, 20,209, 42,217,101,232, 72, 36,232,
+208,134,180,173,236,176, 37,183, 12, 81, 16,211, 26,153, 36,181,214,244, 6,125, 2, 96,230, 61,166,110, 4, 22,211, 97,253,196,
+ 60, 38, 31,108,239,229, 54, 97,173,197, 57, 75,221, 24,194, 0, 22,139, 5,201, 49,221,202, 88, 4,144,223, 33, 77,131, 0, 21,
+ 6,224, 44, 82, 74,191, 16,211,155,214, 68, 73,136,181, 78, 28,242,129,194, 26, 65, 22, 22,121,142, 53,226,108, 68, 67,160, 66,
+145,194,157,163, 49, 13,253,176, 71, 24, 10,173, 77, 76,109,210,167,222,154, 22,107, 13,206, 68, 88, 45, 57, 89, 61, 28,117,210,
+145,195, 55, 21, 73,156, 1,142,162,168, 16, 44,166,133, 80,128, 59, 58, 14,160,213, 66, 88, 10, 53,104, 69,128, 24,231,208, 1,
+253,190, 60, 36,243,121,142,210,242,191,151, 69, 69, 20, 5, 56,235, 33, 22,230,186, 14, 98, 66, 93,209, 90, 81, 70, 92, 39,249,
+ 43,173, 72,162,132, 54,240,228,139, 90,246,162, 14, 66, 29,136, 92,223,235, 51, 91,204, 24, 13,134,228,197, 2, 29, 74, 5,166,
+199,177,200, 23,164, 73,202, 96,208,167,169, 91,156,175, 8,227, 37, 60,226, 10, 13,181, 38,136, 18,140,105, 72,211,238, 38,172,
+ 60, 71,221, 37,101,212, 33, 80,149,151,254,244,227,135,186, 49, 98,244,171,155, 26,221, 72,206,187,110,106,126,228,165, 24,173,
+ 20, 71,215, 55,121,240,232,136, 74, 69, 88, 99,169,210,148,226,241,148,197,162,126, 34,205,158,185,176,194,198,138,195,134, 1,
+243,194,226, 12, 36,145,146,181,143, 15,176, 90,177,118,122,196, 8,197,242, 90,159,111,188,189,201,236, 96, 70,144, 36, 68,253,
+144,105,217, 48,142, 99, 8, 35,206,156, 25, 51,181, 61,220,112,196,226,254, 67,166, 71, 98,124, 68, 11, 22,245,240,104,198,149,
+139,231,120,235,230, 7,180,198,176,181,119,192,168, 63,224,233,203, 23,201,139,146,126, 47,163,105, 13,101,119,145,125,231,198,
+ 45,110,223,127,200,228,104,202,189,205,109,126,242, 71,190,192,229,179,167, 41,170,130,166,117, 76,142,166,172,175,173,113,237,
+233,203, 56, 15, 59,251, 7,108,110,109, 49, 26, 12, 88, 93, 93,166,172,106,106, 85,115,112, 56, 17, 20,237,162, 96,101,121,204,
+211,231,207, 10,248, 34, 78,248,240, 75, 47, 80, 84, 21,215,111,223,227,248,235,104, 54, 99,119,239, 0,123,229, 41, 28, 80, 55,
+ 45, 42, 81,100,105,198,137,165, 37,118,246, 14,228,130,237, 60,143,183,182,233,247,123, 12,189,168, 2, 89,146,112,239,209, 38,
+183,238,222,103,239, 96,130,214,154,147,171, 43, 12,178,132,126, 63, 67, 35,165, 77, 30, 89, 77, 88,107,201,203,146,182,181,236,
+ 28, 28, 0, 14,165, 69,154, 63,125,242, 36,227, 97,159,178,170, 57,154, 30,241,173,183,222, 99,231,224, 16,111, 90, 94,121,254,
+ 57, 94,188,246, 52,163,209,136,198, 88,166, 71, 71,188,117,253,102,119,184,253,225,175,126,191, 47,204, 4, 99,120,239,214, 45,
+ 46,156, 57,195,209,116,198,163,205,109,118, 15, 15,255,208,247, 38, 89, 66,127,208, 39, 10,165,112,201, 59, 97, 34, 52, 70, 90,
+223,134, 81, 64,144,245,105,107,232, 77, 95,224,143,254,145, 87, 24, 13,223,194,198,223, 98,251, 46,252,173,255, 54,195, 70,138,
+131,217, 67,246, 55, 95,103,253,153, 79,209, 31,213,188,243,205,155, 76,182,175,113,176, 91,178,247,232,203,156,189,250,125,188,
+240,249,191,130,246, 71,188,113,127,193,137, 31,238,243,131,127,252,191,100,235,239,252,199,220,190,255,207,168,201,169,166,183,
+217,125,251,125,146, 72, 97, 77, 69,237, 51,140,149,110, 10, 87, 22, 88, 21,144, 12,135, 68,222, 99, 12, 40, 23,160,124, 75,235,
+ 28,218, 24,180, 86,184,214,128,149,106,205,188,220,231,252,199, 62,195,199, 62,243,151,248,173, 95,254, 75,204, 30,223,251,255,
+189, 82, 50,247, 41, 29,161, 3,216,187,251, 53,242,163,219,164,113,143,214,228, 84,101, 37,188,136,201, 50,189,203,151,185,246,
+145, 31,103,240,167,225,124, 90,114,242,217, 83,252,234, 63,120,129,122,245,235,220,127, 60, 37,212, 10,189, 54, 33,155,123,118,
+ 30,220,161,151,105,116,147,179,124,118, 29, 53,140, 9,131,150, 32, 94, 70,133,167, 40, 31,133,188,250,105,205, 55,127,239, 75,
+132,247,222, 33,152,158,103,115,246,152, 19, 61, 69,239, 84,132,117, 41,225,201, 0,183, 19, 98,206, 68,156,124,241, 37,138,217,
+ 20,186,131, 84,197, 18, 93, 30, 44, 13,169,234,154,193,160,131, 98,181, 13, 97,156, 18, 6, 17,253,225, 16,229, 69, 25,170,235,
+ 18,239,165,162, 57,237,165,100,129,116, 80, 76,167, 83,233, 79,239, 84, 84, 83,181, 36,169,196,161, 21, 18,213,114,192,116, 54,
+165,151,244,136,194,144,178, 22,183,119, 89, 60, 3,234,183, 0, 0, 32, 0, 73, 68, 65, 84,139,153,216,122,135, 51, 30,219,138,
+138,224,148,135, 22,226, 48, 70, 7, 9,198, 8,184,166,169,181, 24,250,202,188,123,223,101,164,189,140,186,148,125,253, 98, 33,
+195, 75,160, 21,243, 60, 39,136, 2,188, 23,128,151, 6, 44, 50, 28, 6, 1,130, 40,199,227,218,110,170,239,212,108,107,196,167,
+228,156,127,194, 67,113,222, 33,133, 47, 18, 29,142,124,130,238,212, 91,139,102, 58,159,227,157,160,162, 37, 82, 45, 94, 37,143,
+100,216, 65, 24, 48, 94, 73, 41, 77, 93,139, 71, 37, 75, 68,141, 16,227,171, 35,184,244,244, 51,127, 45, 8, 67,130, 48,164,109,
+ 91,180, 87, 36, 89,130,107,133,253, 93,213, 34, 67, 31,227,245,140, 49,180,214, 16, 6, 65,151, 87,142,137,147,152, 32, 8,177,
+166,197,180, 13,113, 28, 99,240,104, 47,198, 59,175,228,128,119,222,147, 47, 22, 40, 37, 57,117, 80,120, 99, 58, 57, 79,131, 18,
+218,143,115, 16, 37,177, 24,153,170,138,254,160,223,237,176, 11,234,186, 22,153, 34,148,139,195,124, 54, 23, 57, 74, 75,135,121,
+ 81,150,221, 1, 41, 69, 3, 77,221,208,239,245, 59,150,239,119,249,245, 34,103, 7,228, 69, 33,176, 20,223, 85, 84,118, 30, 3,
+141, 98, 62, 19, 66, 80,146,100,160,132, 32, 23, 70,130,130,109,234,250, 73,254, 60, 10, 68, 54,201,203,130, 64,135,104, 68, 2,
+ 42, 91,217,113,224,160,174,106,142,107, 55,219, 70, 46, 21,131,129, 56,100,211, 36, 33,236,164,218, 36, 22,249, 71,242,140, 50,
+177,164,169,220, 40,219, 86,100,254,170,170, 48,157,122,225,156,197, 56,203,104, 56,164,234,110,190,198, 88, 52,160, 3,185,212,
+180,149,228, 57, 61, 30, 99, 45, 26, 49,201,181,206,210,212,173, 56, 76,147, 4,239,160, 53, 13,117,247,253,113,154,210,148, 53,
+ 90, 43,185,241, 42,213,193, 39, 60,222,119,147, 69, 16,224,157,195, 24, 97,234,255,236,167, 70,156,221, 24,242,123,223,190,207,
+163,220, 50,157, 22,168, 80,211,150, 45, 89,162, 56,117,110,204, 83,207,158, 97,152, 70, 84,101,195,172,182, 92, 60,127,146, 83,
+231,151,105,227,152,182,178, 84,104,150,178,136,179,103,199,212,139,150,253, 73, 78, 47,209,244,134, 9, 59,123, 11,206,157, 95,
+225,226,165, 85,118,247, 23, 92,187,176,194,227,205, 35,130, 40,160,137, 87, 48,195,179, 92,191,123,143,111,190,245, 62,117,211,
+224,156,103,216,239, 19,133,154, 48, 12,184,251,224, 49, 59,123, 7,108,172,173, 82,213, 53, 7, 71, 83,230,121,193,112, 48,100,
+216,239,227,149, 40, 57, 39, 87,151,104, 90,195,238,193,132,170,170,184,118,229, 50,195,225,144,162, 16,121, 58,138, 34,154,186,
+102,123,255,176,171, 40,157, 97,157,103,216,235, 19,104,152, 47, 22, 60,216,220,225,246,253,251,220,121,248,152, 32, 80, 34,181,
+101, 61,162, 56, 98,145,231,188,246,230, 59,127,136,186, 6,176,178, 52,226,244,250, 73,150,199, 35,210, 36, 70, 41, 79, 99, 12,
+ 71,147, 41,179,188, 32, 47,114, 22,121, 65,191,151,241,252,213,167, 57,119,106,131,193, 96,192,184,223,151, 62,114,219, 50,157,
+206,216,218,219,103, 60, 28,114,245,169, 75,196, 81,200,104, 48,120,162,184, 53, 77, 87,236, 99, 44,222, 89, 86,150,198, 20, 85,
+205,195,173,237, 78,230, 6,188,103,101,121,137, 36, 73, 56, 60,154, 49, 91, 44, 56, 56, 60, 96,239,240,136,211, 27, 39,249,240,
+ 11,207, 19,197, 33, 97, 32, 38,209,217, 34, 71, 1, 15, 54,183,158,252, 46,113, 20,114,225,236, 25,146, 56,102,101, 60,148, 85,
+ 69,158,179, 40,114, 26, 99,186,159,163,125,242,253,105,154,242,220,149, 75,172, 46, 45, 17,133, 33, 90, 7, 40,132, 72,217,182,
+134, 75,195,136,155,189, 1,237,137,117,190,240, 83,255, 22, 63,247,105, 79,190,186,206,155, 95,255, 54, 59,143,110, 48, 43, 31,
+113,176,243, 22,211,253,247,216,125,240, 53,138,253, 15,240,107, 53,197,214,148,173,135,215, 57,154,126,192,225,222,251, 28,110,
+127, 7,165,160,169, 14,169,118, 15, 41, 95,159,178,251,157, 93,138,249, 67,142,230, 15, 88,204,238,145, 79, 30,227,155, 9, 77,
+155, 83, 85, 37,214,214, 40,111,209, 42,124,162, 48, 88,227, 59,226,166,165,174, 74,242,163,125,130,104,133,124,114, 15,175, 2,
+194,113,204,120,184, 65,111,121,141,143,253, 7, 63,199,191,253, 39,254, 46, 31,253,196,211, 92,188,246, 23, 80,241, 42, 31,251,
+244, 95,161, 63, 78, 48,214,112,234,169,143, 49,126,250, 18,229,108,143, 54, 95, 96,109, 77, 93, 44, 40,102, 7,148,109,142,106,
+ 44,104, 77,148,244, 89,191,240,121,206, 61,253, 33,146,171,240,250,227,152,133,131,173,111,157,100,245,220, 54,147,131, 61,242,
+133,172, 59,207, 93,221, 32,212,142,195,123,178, 18,121,245,167,255, 61,206, 63,119,137, 69,115, 68, 59,141, 72,211, 83,152,166,
+ 7,213,136,245,243,142,189, 71,247, 89, 63, 59, 96,251,173, 71,184, 98,159,165,181, 37,194,222, 24,116,132, 42, 52,110, 24,146,
+173,244,153, 61,184,195,252,112, 34,235, 57, 99, 73,226, 84,124, 53, 74,211, 88, 43, 52,201, 72,156,230, 65, 20, 96,107,131,241,
+ 98,190, 59,110,105, 43,202, 18,173,229,185,237,156,149, 75,166, 51, 84,101, 37, 76, 12,117, 12,245,146, 41,180,174,164,118, 91,
+107, 69, 81, 20, 18, 25,141, 98,121, 15,234,128, 40,145,166,208,198,180, 56,107, 72,178, 4, 77,167,140, 57, 81, 82,148, 14,240,
+ 14,130, 64, 19, 69, 98,128,110, 91,233, 71,119, 94, 98,218,116, 42, 90,211,182,180,214,146,165, 25, 81, 87,206,130,147,231,167,
+242, 78, 38,105,143, 60,111, 91,193,150,103, 89, 70, 85, 85, 68,145,196,216,154,182,145, 53,139, 7,211, 26,138,170,100, 49,159,
+ 35,224, 48,131, 87, 30,239, 44,202, 43,188,183, 28,195,169,234,166, 6,239,228,119,139, 34,156,241,232, 72,192,106, 90,123, 76,
+219,173,156,147,132,168, 51,171,134, 58, 68,216, 36, 45, 97,221, 52,228,121,222, 25, 95, 28,173, 7,231, 45, 30, 37,157,232,153,
+128,250,123,113,130,242,224,156,195, 26, 35,181,167, 93,254, 54,208, 1, 97, 42, 96,148, 98, 62,103,122, 52,195,187,227,134,158,
+128,164,223, 39, 8, 52, 69,177, 64,121,240,157,148, 29, 39, 50,197,233,160,203,193,123,143, 14, 66,194, 72,110,107, 86,203, 77,
+191,233, 28,202,199,149,139,179,217, 76,164,237, 56,198, 57,135,107, 26,230,109,203,160,215, 35, 12, 3,202, 60,167,169,235, 39,
+114,179,210,154,241,120, 36, 63,151,119, 36,113,194,113,211, 24, 64,150, 37, 84, 85, 75,150,165, 40, 36,110,179,168, 42, 20, 94,
+118, 69, 70,170,247,202, 70, 72,115, 90,107,188, 18,179,156,183,246,137, 35, 20, 20,179,197, 92,110,176,221, 68, 94,151, 34,189,
+ 28,199,241,162, 40, 22,195, 80, 44, 15,216, 36,142,197, 25, 95, 11,153, 77,224, 32, 78, 38, 2, 5,189, 56,165,245,142, 40, 77,
+233, 5, 1,206,137,236,217, 84, 21,222, 59, 70,227, 49, 82, 62, 35,255, 78, 20, 74, 28, 49, 47,142,113,188,146, 61,183,222,129,
+210, 16, 40,138,170, 68, 55,181, 68,166,186,201,187,153, 52, 12,250,125,116, 24,146,245, 66,142,171,105,155, 64, 16,145, 77, 45,
+206,127,231, 28, 97, 40,135,188,169, 5, 51,234,189, 56,124, 7,189, 30,207, 93, 24,114,235, 75,239,114,251, 96,206, 78,233, 57,
+ 57,238,115, 38,241, 28, 46, 44,135,185,163,124, 56,195,212,150,135,247, 15, 57,127,113, 21, 85,182,236,207, 23,164,101,196,169,
+ 83, 35,252,198,128,189,195, 18,141,167,245, 33,227, 97,196,193, 86,201,195,123,135, 28, 89, 69,233, 60, 39,151,251,212,149, 34,
+ 12, 2,230, 85,203,211, 87, 55,120,240,240, 8,103, 43, 6, 23, 52,151, 79,159,230,163, 47,191,216, 21,157,180,172,173, 46, 75,
+ 26,163, 44, 73,146,136,195,163, 35,126,243,203, 95,227, 99, 47,191, 40,187,193, 64, 58,150,131, 80,110,231, 90,105, 6,163, 49,
+ 97, 24, 16,135, 17,167, 46,158,103,109,117,149,253,201, 33,248,239,254, 45,111,220,190,203, 27,239,190,199,214,222, 1,253, 36,
+ 97,125,117, 25,148,103,111,114, 36,173,101,145,240,215,195, 72,160, 27,171, 43,203,224, 29,147,195, 9,147,121,193,172, 51, 76,
+ 30,127, 13,251,125, 94,188,250, 12,207, 63,243, 20,235,107,171,100,105, 66,211, 58,170,170,226,214,195, 71,188,254,246,187, 18,
+171, 65,166,233, 52,137,233,247,196,107,162,149,230,193,230, 38,239,223,188,205,206,193,132, 40,138,184,112,230, 20,163,209,136,
+181,213, 85, 33,190,213, 45,173,109, 59,165, 42,160, 44, 23, 76,142,166,220,184,119,159,199, 91, 59, 79, 36,251,186,109, 25,244,
+123,114, 9, 73, 98,198,195, 62,167, 78,158,192, 26,139,115,176,123, 56, 97, 58,155,178,186,178, 74, 28,198,172,173, 46,243,161,
+ 23,158,125, 34,215, 31,127,153,214,178,179,127,192,181, 43, 23,185,116,238, 28, 59,251, 7,188,246,214,187,124,227,245, 55,158,
+252,183,142,191,210, 56, 33, 77, 98, 38,211, 57, 85,221,176,186,178, 76,150, 36,228,101, 73, 81, 86, 96, 12,237,160,199,219,147,
+ 57,195,242, 85,202,187,158,223, 60,225,216,158,104, 76,120,145,249,163,127,141,217, 15,193, 55, 52,213, 17,135, 15,127,159,229,
+141,151,152, 92,255, 22,145,154, 99,170, 22,111, 29, 85,181,199,108,247,125, 76, 61,227,228,249, 43,148, 85,197,124,118, 23, 91,
+ 22,236, 63,250,125,172,105, 73,135, 39,169,138, 61,218,162,196,217, 2,173, 83, 8, 98,154,182,192,216,130,147,167, 94, 97,122,
+120,155,166,154, 49, 57,242, 12,135, 99,146,112,206,171,127,230,151,249,165,191,247,131,252,141,223,189,205,254,157,175,208, 95,
+122,145,179,245,135,152,159,126,204,225,246, 27,108,237,125,192,242, 31,125,134,240,129,231,135,126,252, 63, 33, 94,129,179,155,
+207,240,103,191,255, 20,139,111,195,183,126,239, 43, 44,158,127,192,143,255,137,159,226, 47,253,233, 23,168,235, 61,188,145, 90,
+ 92,167, 29,117, 57, 39,233,173, 82,149, 59, 60,122,235,155,236,223, 62, 77,101,167,220, 48, 2,115,225,145,227,165,151,159,226,
+189, 91,183,120,240,224, 8, 29,104, 62,249,253,159,227,250,250, 42,211,135, 45,197,189,139,236, 31,236,115,102,109,192,187,183,
+230,212,205,156, 40,136, 56,218,119,172, 6, 79,177,118,106,194,218,114,198,228,169, 37,234,173, 57,202, 7, 40,111,208, 65,140,
+ 33, 68,135, 10,107, 50,206,124,236, 83,216, 47,255, 14, 69, 94,116,206,108, 71,158,151,196,177, 36,120, 84,172, 48,166, 22, 53,
+211,121, 26, 35,221,230,117, 85,138, 36, 30,197, 4,129, 39,207,231, 24, 35, 29, 31,113, 24, 82,149,149, 12, 80, 26,180,146,148,
+142, 53,142,168,215, 35,246,157, 34, 27,199,148,101, 13, 30,170,178,192,117,205,112,116,251,248, 97,156, 97,141,163,156,139,164,
+239,189,135, 56,166,170, 74, 66, 45, 42,112,156,166,120,223, 16,198, 49,145,145,214,205,166,149, 94, 12,165, 53, 2,163, 9, 40,
+138,138,197, 98, 65,220,193,185,140,247,104,237,209, 8, 19,196, 99,177,173,239, 12,143, 41, 77, 93, 17,199, 41, 85, 85, 80, 85,
+ 53,199,101, 97,129, 82, 4, 97, 36, 67,134,149,203,131,177,194,147, 15,181, 70, 37,154, 56,141, 25, 69, 17,166, 53, 44, 22,115,
+202, 90,134,192,193,120,140, 82,138,182,169, 73,179,148,170,172,233,245, 82,132,210, 90, 17, 69, 9, 77,107,233,101,201, 19, 95,
+ 66, 88, 87, 21, 89,214,147,219,139,238,170, 86,181, 28,118,214, 57,234,170, 32, 80,138,186,236,218,187,186, 73,182,210, 98,140,
+104,202,146, 44,235, 17, 69, 1,218, 75, 20,193, 6, 45,243,163, 2,133, 76,116,165,105, 33, 12,232, 15,135,180, 85,133,105, 26,
+150,150,150,145, 72, 84,141,212,226,137,147,218, 91,177,237,231,121, 78, 20, 69, 76,243,239, 58,131,195, 32, 32,140, 99,156, 49,
+212,149, 68, 2,122, 89,134, 87,138, 0,205,108,190, 0, 60,195,225, 72,214, 4, 70, 92,238,129,181, 68, 58, 96, 60, 30,227,172,
+ 24,204,154,198,144,102, 17,105, 44, 5, 3, 42,168, 9, 9, 48,182,193, 52, 13,202,139,204, 49, 28, 14, 64,105,234,170,194, 90,
+ 71, 22, 71,168, 56,166,223, 23, 23,252,241,126, 52, 12, 3, 60,154,162,168,136,226, 8,129,247, 75,195, 90,191,215,147,216, 88,
+231, 24, 22,140,172,184,223, 77,211, 60,145,102,122,189,222, 31, 98, 33, 75, 61,109,204,104, 52, 0,107,176,208, 41, 7, 9,113,
+ 20,117,127, 35, 33,235,229,101, 41, 78,238,166,197, 5, 0,130,194,237, 15,229, 98,227,156,148,152, 56, 52, 97,160,197, 47,160,
+ 20,105, 47,163,236,224, 65,166,109,137,136,200, 59,170,159,113,142, 36, 77,169,138, 2,194, 16,175, 28, 97, 24, 16,198, 17,174,
+181,232, 40,233, 18, 18, 13,105,150,241,151,255, 88,159,225,221,109,190,190, 95,112, 54,142, 89, 90, 15, 89,203, 18, 22,211, 5,
+207, 60,189, 66, 59,205,105, 45, 84,165,225,220,133, 21, 70,253,140,249,131, 9,249,162,165,143,103,235,193, 33, 39, 78,173,208,
+ 31,103,180,222,162, 35,205,162,128,229,141, 85,150,178,144,253,123,251,132, 97,200,221,157, 25, 23, 55, 86, 8, 35,205, 86,168,
+ 25, 57, 69,210,131,133,145, 38,178, 36, 10, 88, 25, 15, 5,212,128,231,193,230, 54, 47, 93,123,138,181,149, 85,158,189,124,137,
+217,162, 64, 43,136, 66,205,231, 63,249, 42,131, 65,143,165,177, 92, 42,107, 99, 9,148, 98, 81, 20,236,237, 31,242,220, 51,151,
+ 88, 91, 89,161, 40, 43,226, 72, 51,157,231, 4, 74,225,112, 44,202,146, 36, 73, 88, 93, 26,163,181,102,208,239,145,165, 49,189,
+ 36,193, 3, 73, 36,200,225,178, 44,105,181, 72,241,209,250, 58,161,214,180, 77, 77, 91,127,215, 80, 6, 48, 28,246,185,118,229,
+ 18,131,110,170, 14,195,136, 32,244,212,117, 73, 81,150, 12,250, 61,230,197, 2,239,228, 53,215, 74, 99,172, 35,212, 18, 85, 91,
+ 30, 13,229,111, 22, 71,172,173, 44,211, 58,139,183,146, 75, 63,206,141,183, 70,218,253, 60,158, 48, 10, 57,119,230, 20,253, 97,
+159,167,206,157,229,119,190,241, 45, 14,143,142, 88, 91, 30,179,178,180,196,169,147,235, 44,143,135, 44,141, 70,204,230, 51,140,
+ 53,244,123, 25, 39, 87,150,153, 45, 10,250,253, 62, 89,146,224, 85,194,124,186,201,160,223,227,213, 15,189,204, 59, 55,110,138,
+ 99, 30, 77, 22, 11,214,115,216, 73,249,207, 92,186,128,177, 45,239,223,186,203,209,244,187,159,237, 36, 14, 57,185,178,242, 36,
+218, 51, 28, 12,168,203,138, 69, 33, 77,132,167,151, 6,188, 30, 47,195,180, 98,126, 24,240,229,127,210, 48,251,165,123, 52,237,
+ 33,119, 95,251,121, 2, 59,193, 71, 3,218,178,101,190,127, 11,143,226,252,211,127,138,251, 55,255, 54,181,254, 61,124, 53, 16,
+100,117,181, 67,113,240,144,241,250,139,228,147, 55,177,237, 18, 77,171,169,230, 91,228,147, 45,194,116,137, 40,138,241,117,131,
+199, 99,141, 71,135, 13, 78,105,162, 36, 97,125,227,227, 12, 86,206, 99,124, 75,253,248, 77, 22,243, 25, 77,101,200,143,118,152,
+108,190,205,255,252,139, 63,196,237,189, 95, 39, 68,147, 13, 91,202,122,206,157,239,124,153, 15, 93,252,179,124,228, 63,172, 25,
+ 48,231,249, 31, 83,252, 31,255,107,194,198, 52,228,217,203, 27,252,196, 73,203,207,199, 1, 85, 1,109, 83, 83, 54,154,241,201,
+ 23,120,116,253,159,162,195,140, 80, 5,104, 29,163, 84, 75, 62,223,227,224,241,107, 52, 85,205,104,249, 44, 56, 69, 67,133, 89,
+ 76, 40,203, 57,139, 67,197,203,159,127,154,233,228,136,155,183,110,179,178,180,196,181, 87, 94, 96,231,236,148,233, 3,152, 76,
+114,198,237, 17, 54, 57,164, 89,156, 35, 28,203,126,123,127, 59, 36, 57,127,146,166, 88,112,249,242,105,194, 15, 63, 67,156,166,
+236,237,206,113,100, 40,229,240,155,154,102, 3,178,165,117,178,149,101, 60, 14,215, 58, 26,228, 64, 53,181, 37, 78, 53,206, 66,
+146, 68,180,109,195,108, 62,103, 52, 24, 48,159,119,224,171,194,208, 42, 89, 97,202,100, 57,199,219,148, 48, 78,232,247,250, 56,
+103,177, 45,160, 32,142, 82,210, 76, 99,141, 28,184, 2,113, 17, 35,158,117, 22,229, 53,198,181,204,231,115, 52, 10,180, 98, 60,
+ 30, 17, 4,154,180,223, 19, 58,167, 87,162, 18, 68, 17, 1, 93,187, 90,105,187,131, 82,166,127,156,197, 25,203,172,157, 17,133,
+ 1,189, 94,159,186,110,201,250,125,172, 49, 36,105,130,214,194,253,168,235, 6,231,187,210, 43, 2,188,210,232,192,163,188, 70,
+ 69, 41,214,250, 39,102,100,169, 94,253, 3,148, 82, 21,208,216, 6,172, 64,122,188,150,103,174, 45, 11, 89,219, 58,135,142, 98,
+122, 89,159,198, 72,154, 96, 62,157, 50, 26,141,101,117,218, 90,194, 64,225, 0,229, 29,206,107,188, 55,196, 81,208,241, 96,178,
+238,231,162,203,149,107, 69, 18,133,196, 73,138,179,158, 40, 14,186,135,135,200, 99, 74, 43,226, 80,126,184,197, 98, 65, 8, 68,
+189, 30,139,197,130,192,180, 20,139, 5, 94, 1,214,201, 36,128,220, 82, 20,128, 14,233, 15, 50, 98,237,112,202,176,178,212,231,
+196, 74,196,201,113, 64,217, 68,224, 45, 1, 45,251, 51,135,210,150,195,185, 33,192, 81, 21, 2,106, 81, 65,200, 96, 56, 64,119,
+211,177,242, 30,107, 44,211,249,148,162, 44, 25,142, 71,178,145, 82,224,189,224, 55,143,163, 98, 97,228, 64, 65, 89, 22,120, 13,
+190,149,108,189, 82,158,106,177, 32,233,247, 65, 73,134,221,180,134,217, 76,162, 5,233,113,181,164,179,228,115, 41,102, 73,211,
+148, 52,235, 63,113, 71, 58,103,104,140,200,209,141, 49,164,137,236, 54,143, 93,236,105, 26, 51, 30,167, 88,235,104,203,138, 94,
+175,135,193, 19, 68,177, 40, 10,133, 24, 78,148,213, 68,105,194,124, 49, 71, 58,124,187,140,189,214, 88,107,186,216,134, 76,206,
+253, 94,175, 51,178, 89,240,116, 17, 67, 71, 28,197,178, 99, 9, 2,146, 40,238,220,228,178, 50,105,218, 22,175, 5,160,208, 58,
+139, 66,145, 13, 50, 2, 29,161, 84,183,131, 74, 51,218,186,164,152,207,229,117,139, 83,104, 26, 76,219, 96,140, 71, 91,233, 99,
+ 87, 74,145, 26, 97, 57,211, 8,196, 33,203, 50,134, 89,203,103, 47,167,188,253,149,135,156, 62,119,130, 50,175, 57,186,181,203,
+150, 61,226,212,153, 37,170,195, 57,213, 81,142,215,176,124,114,196,222,206,156,250,112,142, 53,150, 52,211, 12,251, 25,113,168,
+217,189,191,205,126, 20, 80,151,134,126, 47, 98,176, 58,226,104, 90, 16,102,203,212, 86,112,218,139,189, 5,239, 46, 44, 69,109,
+ 96, 39,103,199, 42, 78,174,140,216,217, 47,137,203,130, 52, 14, 57,185,118,130, 94,154,137,225,179, 18,201,124, 60, 28, 50, 30,
+ 13,233,167, 9,251,147, 35, 38,211, 25, 31,127,101,149,181,213,101, 81, 63,218,134,200, 88,170,182,193, 53,134,107, 87, 46,162,
+208, 44, 47,141,104,236, 49,252,200, 51,153,207,169,234,150,201,228,136,121, 94, 50,157,207,137,194,136,217,162,224,226,217,179,
+ 92, 56,125, 74,228,229,214,160, 2,197, 44, 47, 24,100, 61,130, 48,122, 34,157, 71, 81,216, 93, 66,191,251, 53,159,231, 28, 78,
+231, 92,186,112,142, 36,146,130,156, 44, 73, 80, 75,203, 60,247,212, 37,246,247, 14,216,222,219, 39,138, 67,126,232,243,159,229,
+ 51,159,248,104,215,195,110,201,139,146,233,108,202,222,225,132,131,201,148, 69, 81, 48,157,207,159, 80,227,188,247,156, 60,113,
+ 66, 46,218,136, 76,217,139,101,210,223,222, 59,228,230,189, 7, 66,203, 67,246,248, 97, 24,144,101, 9,222,121,166,243, 5,183,
+ 31,110,114,251,193, 35, 86,151,199,172, 46,143,233,247, 50,234,186,229,253, 15,238,242,123,223,126,157, 47,255,254,107,128,184,
+247,151,151,151, 25, 69, 3,226, 48,166,215, 75,165,116,198, 88,250,253,140,162,148, 7,250,229,179,167,121, 20,133,236,239, 79,
+112,120,166,139,156,247,111,222,166,174,107, 78,174,172,112,254,236, 41,118, 15, 15, 57,156,205, 48,101,133, 27,158,228,250,108,
+198,209,246, 20,115,248, 14, 59,230, 13,202,249, 30,197, 98,139,166,156, 96,234, 9,145,123,196,188,156, 51,222,120,149,159,248,
+185, 95,231,244, 58,124,245,171,207,243,111,126,237,139, 56,119, 72, 91,151, 56,107,248,194,159,255,199,124,232, 83, 63,200,255,
+251,127,254, 60, 55,222,249, 5,108,155, 51, 8,157,152,130, 71, 27, 24,103, 72,199,167,217, 88,123, 22, 79,200,131,247,254, 49,
+ 39,206, 62, 67,156,157,197,148, 11, 38, 59,239,226,125, 35, 32, 43, 99,113,192, 71,127,246, 39,121,254, 7, 94,224,222,252, 87,
+248,204,143,253, 85,122, 61,184,254, 15,174, 83,244,102,108,126,233, 13,182,244, 63,101,240, 67, 95,228,185,160,226, 11,122,137,
+248,207,121,254,245,111, 20,252,251,159,235,161, 84, 72,190, 7, 63,249, 55, 62,205, 82,246, 50,255,219, 95,125,157, 87, 62,247,
+ 19, 36, 39,167, 60,124,237,117,154,178, 34,202, 50,156, 15, 80,109,193,225,209,251, 56,103,168,203,109,130,176,135,215,158, 38,
+ 63,164,156,239, 81, 78, 34, 2,237,249,216,103, 62,204,141,123, 15,121,231,225, 99,174,157, 58, 69, 22, 26,110, 29,252, 22,139,
+253,134,217,214, 54, 57, 19,122,107,207,178, 40, 14,233, 71, 25,206, 57,242, 59,171,140,175,213, 36,222, 17, 45,159, 99,184, 54,
+ 34,111,175, 83, 30,148, 52,141,146,181, 93, 99,169,138,150,165,103, 94, 96,250,213, 47,201,224,129,134, 72,163, 99,255,196,235,
+164,154,238, 25,214, 25,188,100,215,238, 1,135,181, 82, 7,253,255,113,245,230, 65,182, 37,245,157,223, 39, 51,207,126,151,186,
+181,191,170,122,251,210,111,105,186,105,232,102, 17, 13, 26, 64, 44, 2, 9, 4,218, 16,114, 88, 88, 97,141, 53,227,112,140,229,
+109, 38, 36,123, 52, 76,196, 88, 19, 35,107, 20, 35, 91, 19, 26, 75,193, 16, 10,225, 9,203,163,205, 26, 9,129, 9, 22, 1, 3,
+116,211, 52, 13,189,190,125,169,122,181,215,221,207,150,231,156, 76,255,145,247, 61,201,190,127,117, 71,116,215,173, 91,247,156,
+147,153,191,239,247,251,249, 6,179,103,202,120,154, 18, 71, 53,117,237,198,202,237, 86,135,218,186,251, 45,155,102, 52,182,161,
+177, 13,129, 23, 58,227, 97,237,228,203, 82, 23,180,146, 22,181,116, 90,125,232, 7,140, 39, 35,176,204,222, 75,208,237,118,161,
+246,144,210, 80, 27, 67,107, 70,153, 43,180, 70,121,138, 80,249,152, 6,188,218,149, 53, 53,198, 48, 30, 79,240, 60,143,128,192,
+ 73, 86,198, 98,165,165,200,107,130,208,199, 24,133,174, 43,138, 50,199, 15, 66, 20,130,166, 41,241, 9, 49,198, 82,150, 53,190,
+239, 12,211, 77, 83,209,212, 21, 38,112,136,245,216, 11,201, 11,151,161,143,163,104,118, 31,105,138,162,196, 26, 67, 96, 12,202,
+ 11, 8,149, 37,240,125,234,186, 38, 77, 51,130,192,163,106, 92, 79,188,206,115,148,231, 58,228,211,212, 17,230,146,196,145, 87,
+171,170,198,107, 37, 9,121,158,187,246, 45, 99,220, 34,173, 20, 69,233,190, 20, 33,132, 59,225, 2,117, 89,146,101,206,193,169,
+173,197,111,156,153,133,198,184, 72,135,169,193, 83, 46, 42, 21,119, 16,233,152,227,203, 33, 79, 62, 58,207,211,231,218, 60,178,
+ 17, 19,213, 13,221, 86,128,138, 37,120,146,208, 19,212,198, 98, 60, 15,207, 88,178,198,237,254, 74,109,232,143,107, 14, 70, 21,
+187, 35,184,126,216,240,226,118,195, 94, 95, 83, 84,165,163, 92,249,206, 48,167, 75,141,239,251,180, 91, 29,138, 34,127, 56,166,
+ 87, 74, 81, 78, 75,194,216,197,238,164,149, 8,207, 49,121, 39, 89, 70, 18, 4,216,166,162,110, 4,147,201,196,141,101,102,187,
+ 44, 37, 93,109,108,146,180, 93, 26, 0, 75, 24, 6,179,108,184,235,104,211,165, 67,250,161,132, 59,133, 11,129,244,228, 67,232,
+ 78,145,167,132, 73,130,105, 44,202,247,201,138, 2, 36, 68, 15, 8, 99,158,135, 48, 10,207,115, 76,225,180,110,168,109, 77,171,
+221,114, 70, 59, 43,176, 74, 0,110,138, 97, 76, 77,221, 88,252,208, 3,227,200,113, 77, 89, 50,219,118,161,132, 36, 8, 36,121,
+229,186,129, 45, 78,171,210,165,227,223,215,210, 73, 39, 65, 16, 16,250,177,211, 42,173,165,221,237, 82, 27, 67, 83, 88, 60, 47,
+192, 83, 2, 63, 12,104, 2,133, 39,189, 89,199,123,141,144, 2, 55, 79,146, 72, 11, 86, 24,202,178,160,170, 52, 79, 63, 50, 71,
+250,226, 54,223,191, 49,224,210, 69,159,185,192,103,126,177,197,141,187,135,116,139, 26,198, 83,146, 56,162, 20,130, 75,167, 22,
+ 24, 30,101,132,115, 17,235, 38,101,100, 61, 58, 73,200, 92,228,145,103, 21,163, 52,167, 29, 75, 84, 83,147,239, 13,168,144,220,
+217,236, 83, 90,129, 39, 36, 94, 47, 34,108, 44,101, 97, 8, 60,197,135,223,184,193,171,247, 14, 96,222, 99,231,112,192,180,204,
+184,113,231, 30,217,108,145,122,238,133, 23, 57,182,180,200,155, 94,255, 24,111,127,203, 83,220,223, 63,152,221, 0, 21,105,158,
+ 35,143, 32, 74,102,101, 8,158, 2,227, 18, 15, 39,214,215,152,230, 14,108, 33,132, 32, 76, 66, 78,110, 28,103, 50,158,112,237,
+222, 38,186,114, 6, 46,207,243,156, 27,213,247, 57,177,182, 74,167,221, 98,107,119,151,175,127,251,121, 14,142, 6, 51,109, 46,
+228, 98,199, 85,179, 74, 92,212,209,138,153,147, 20,152,239,205,113,241,204,169,153,131,215, 80, 53,142,142,101,140, 97,103,255,
+128,207,127,245,155,140,198, 19,140, 49,212,186, 98, 48, 26,241,202,141, 91,204,119, 59, 40, 41,168, 27,195,104,234,202,129, 48,
+246,225, 66,222,235,118, 57,117,124,157,197,158, 27,227,233,178,196, 54, 21,237, 56, 33, 9, 3,170,166,161, 63, 30,225,251,254,
+ 67, 8,204, 52,203,216, 59, 56,228,240,176,207,198,218, 42,171, 43,139,188,229,245,143,179,208,237,240,217, 47,127,149,115,167,
+ 78,160,164, 64, 72, 65,171, 21,179,182,186,202,219,158,124,130,225,100, 74,191, 63,164,219,117,113,184, 75,103, 79,115,108,245,
+ 24,173,216,113,174,163, 40,226,248,218, 10, 95,254,214, 51,236,238, 31,242,183, 95, 81, 24,112,246,204, 73,222,254,228, 19,180,
+219, 9,147,137,243, 14,164, 89, 78,172, 20,207,103,154,254,225, 17,227,221, 29,116,191, 33, 47,107,154,108,200,116,120,143,166,
+158,114,252,242, 79,226, 9,143,181,243,239,102,237,141,111, 34,175, 13,223,125,246, 14,190, 45,185,252,142, 95, 97,235,230,231,
+ 88, 59,249, 54,222,244,206, 95,228,252,207, 90, 90,115,130,247,101,127,159, 32,110,115,235,234,159, 81, 55, 25,173,200,201, 35,
+203,199,222,192,149,215,255, 60,143,189,107,133,246,155, 45,223,248, 55,255, 13,223,249,236, 63,100,122,248, 26, 85,145, 81, 85,
+ 19,108, 51, 75,253, 8,197, 19,255,201, 7, 56,247,150, 55, 19, 46,173,178,125,245, 11,252,213, 63,254, 12, 79,189,229,227,248,
+106,153,115, 63,185,200,137,143,253, 43,134, 95, 29, 34, 63, 11, 63,252,225, 57,254,205,102,134, 88,138,233, 15, 70,252, 65,217,
+ 98, 65, 66, 16,194,151,126, 29,114,153,211, 52,199, 41,215,158,231, 71, 30,255, 12,205, 79,167, 60,247,189,223,230,197, 63,254,
+ 83,234, 98,138, 53,146,192, 38, 72, 26,154,124, 72, 45, 39, 32, 61,116, 62,196,212,110, 18,182,117,119, 15,239,249, 21,206, 63,
+177,202,183, 95,186,205,203,183,238,112,238,244,113, 78, 61, 22,242,202, 23,110,177,191,125,141,170, 37, 88, 89, 56,162, 41, 2,
+ 10,127, 17, 63, 10, 41, 11,197,214,107,146,211,103,199, 12, 95, 48, 20,221,101,188,213, 45, 66,255,144,163,164, 68, 29,134,152,
+151, 53, 53,154,213, 75, 61,218,203,203,244,183,238, 33,133,163, 51,214, 90, 83, 25,141, 39, 60,226, 40, 36, 47, 12,173, 86,139,
+233,216,153,224,242,188, 36,138, 34,140,169,103, 58,117, 62,243, 23, 65, 85,106, 12,238,144, 98,112, 60,247,124, 90,208, 88,215,
+121,238, 43,127,166, 31, 59,200, 25,194, 80, 53,142, 7, 15,118,150,152, 40,232,180,187,142,208,153, 78,157, 54, 15,228, 69, 70,
+ 89,104,215,174,169, 20,186,114, 62,161, 40,114,114,171, 8, 4,214, 6,120,165,131,164, 85,117, 77, 83,215,100,121,138,176,110,
+ 13,108,183, 90,212,166,161, 74, 93,140,211,152,154,170,170, 41, 10,199,142,240,253,128,178,156,186,197, 92, 72, 55,117,182, 51,
+105, 64,184, 54, 67,165,156, 15, 44, 8, 44,166,113,252,252,102,118,136,243, 2,133,239,197,232,178, 32, 78, 60,242, 76,187,120,
+185,174, 80,129, 55, 75, 78, 57, 35,185,174, 53,158, 23, 64,211, 56,217,185,221,198, 90, 39,103, 8,161, 80,167,207,157,255,100,
+ 24,134,164,147, 9, 82, 41,176,174,146,179,211,234,208,152,134,222,156,171, 89, 20, 56,178, 85, 57, 27, 25, 10, 99, 64, 74, 76,
+227,112,150,115,237, 54,113, 43, 33, 12, 2,142,205,123,188,231,177, 22,255,245, 7,143,241,143,126,108,157, 31,122, 93,143,243,
+107, 49,115,158,160,211, 14, 8, 18, 15,111,170,201,191,191,197,193,205, 35, 70,183,250, 12,174,239,211,108,143,153, 31,229,216,
+ 65,206,124,161, 88, 78,124, 78,109, 68, 60,122, 49,225, 7, 47, 38,124,248, 77, 17, 63,112, 94,240,232, 9,143, 56,240,144,210,
+145,216,172,116, 81,157,172, 40, 72, 98, 87, 48,210, 84, 46,134,240, 0,178,225, 78,191,160,132,196,212, 46, 2,166,164,107,239,
+201,242, 12,207, 11, 80, 56, 64, 75, 81, 56, 23,163,231,121,132,129,203,157, 6,177,195,166,250,129, 79, 90,148, 60, 40,166, 23,
+194,129, 56,176,204,140,110, 17,126,228,227,121,206,240, 86,230, 26,161,112,200, 91, 41,145, 74,184,113,126, 94,224,121, 30, 73,
+226,232, 67,190,239, 60, 10, 46,194,228,145,149, 26, 47,116, 90,120,145, 23, 52,198, 1, 59,164,112,155, 21,165,156,222,171,188,
+217, 63, 7, 62,158, 31,240,160, 40, 64, 42,167, 81, 25, 99, 8, 98,183, 25,241,124,135,116,213,181,166, 54,142,177, 44,172,161,
+ 49, 32,149,132, 74,227,199,142,111,172, 43,167,117, 85, 85,245,208,220, 18,120, 33,126, 16, 98,172,115,231, 35, 5,166,113,201,
+131, 15, 92, 10, 9, 14,118, 24, 79, 52,105, 85, 17,183,157, 54,246, 19,239, 56,207,233,165,152,111,220, 29,224,231,174,219, 61,
+ 8, 3,134,211, 28,173, 27, 22,218, 45,188, 94,143,181,197, 14,181,145, 76,170, 6,225,251,168,118, 66, 21, 68, 84, 64,104, 5,
+194, 87, 52, 85,205,177,185,144, 91,141,229, 68, 39,162,156, 20, 12,166, 37,139,115, 45,222,249,246,199, 56, 53, 31,240,249,155,
+130,229, 78, 68,212,233,113,247,254, 54,147, 52,101,121,113,158,183,191,249, 73, 90, 73,204,203,215,110,112,253,246, 93,172,133,
+110,183,195,169,141,117,167,169, 87, 26, 93,106,116,173, 41, 74,103, 0, 42,202,130,105,150, 81,215,206, 52,218,142, 99, 90,113,
+ 64,187,211, 97,174,149, 32,128,251, 59,251, 12,199, 19,122,221, 14, 79, 62,254, 24,139,243,115, 8, 41,153,159,235,113, 48, 24,
+178,127,112, 68,187,221,226,220,169,147,172, 47, 47, 98,112,139, 65, 94,213,236, 31,246, 31,130,158,138,162,100,154,229,188,233,
+141,143,177,212,235, 81, 20,153,139,172, 52, 13,158,242,232,117,218,220,221,218, 98, 60, 77,177,184, 49,122,224,251,184, 61,159,
+139,132, 93,191,179,201,112,226, 34,161, 82, 41,148,146, 8,229,162,165,243,115, 29,124, 79,185,113,189, 82,196, 81, 68, 28, 71,
+116, 58,109,186,173, 22,135,131,145,171,194,204,156,164,229, 16,182, 11, 88, 99,248,230,243, 47,240,245,103,191,195,238,254,161,
+227, 74, 88,216, 56,182,134,177,134,151, 94,189,202,112,154,178,189,183, 79, 83, 55,120,161,143, 68,112, 98, 99, 29, 41, 20,171,
+203,139,108, 28, 59,230, 30,124, 74, 81,148, 37,123,251, 71, 28, 28, 13,120, 0,189, 2, 39, 69, 29, 30,245, 73,226,248, 97,237,
+234,209,112,200,104, 60, 38, 80,138,111,214, 10,225,183,208,119, 43, 70,155,207, 51,233, 95,101,188,251, 10,211,225, 77,146,222,
+121,218,203,167, 88, 60,118,142, 34,157,112,180,119,135,131,173,219,244,143,174, 50, 62,186,142, 9, 21,167,159,254, 25,122,193,
+ 2,163,189,109,110, 62, 95,114,245, 25,197,209,157,187,100,197,208, 77,238, 84,128,176,150,160,189,204,242,201,215,227,203,144,
+173,219, 99,110,126,105, 76, 83, 12,217,191,243, 13, 70,123,223,195,179, 37,117, 99, 40,139, 17,173,222, 34, 39,223,253,102,214,
+159,120, 3, 42, 92, 98,126,116,153, 78,122,154,142,191, 74, 97,246,145, 23,119, 56, 57, 60,206,209,203,130, 19,139, 49, 95,249,
+236,203,180,127,120,153, 79,255,242,151,185,249,185,109,190,250,103,191, 73,127,251,205,244,174,180,185,242, 70,193,240, 96, 11,
+ 61,233,243,209,143,156,230,231,126,250, 10,205,233, 46,119,190, 92, 83, 23,123,212,173,130,116,231, 0,161, 36,107,231,222, 77,
+ 81, 14,232, 46, 93,161,214, 83, 23, 43,179,198,105,209,126,139, 78,247, 28,189,197,183,178,114, 33,166,174, 6, 28,238, 28, 49,
+158,164,156, 60,177,206,234,169,101,210,233, 24,175,215, 34, 94,235, 96, 71, 33,200, 4,132, 65,219,154,114, 60,161, 14,250, 28,
+170, 62, 76, 78,113,112,245, 21,226,100,204,104, 48,166, 28,184,166, 53, 83, 25,170,184,161,219, 14,233,223,185,237,184,236,158,
+114,227,102,203, 44, 26,172,102,220,139,140, 56,137,153, 78, 83, 30,196,153,141,177,248,129,135,242,124, 26, 99,105,181, 90, 68,
+ 97, 76, 20,199, 20,121,225,238,197, 74, 19,197, 33,158,231,170, 85, 75,237, 76,206,186, 44, 41,203,226,161,113, 13,235, 72,167,
+ 66, 40, 39,141, 10,137,240, 28,109, 51, 12,253,153,175, 72,162, 60, 65, 93,215,184,102,201,138,178,200, 31,122,181, 28, 96,204,
+201,176,190,239, 32, 98, 97,228, 33,172,156, 25,208,156,254, 93, 85,122, 6, 28,114,159,195,121,164, 20, 8,183, 73, 7,119, 82,
+ 70, 64, 85,149, 72,165,200,139,194, 73, 20,141,118,105,142,218, 32, 4,248, 65,136,175,148,203,212, 91,156,139, 61,137,103,134,
+ 63, 59,123,191,154, 48,244, 29,223, 0,135,118, 86,190, 66, 34,176,198,144, 23,249, 76, 58, 23, 8, 36,190, 63,235,154,168,170,
+ 10,173, 43,172,112,176,120, 41, 93, 78, 79, 8,232, 4, 29, 80,238,151,158, 76, 38, 84, 85,133, 23,132,132, 51,247,185,139, 54,
+213,180,147, 4,169, 28, 34,246,131, 79,248,252,231, 79, 47,177,232, 73, 68, 35,192,247,224,168, 96,235,218, 14,223,217, 26, 82,
+ 53,176,177, 16,115,127, 84, 57,253, 68, 74,247,221, 52,208, 13, 53,234,222,144,188,182,160,107, 38,158, 79, 71, 9,214,150, 90,
+ 92, 92,239,145,235,134, 43, 43,243, 92,121,164,195,143,190,217,167,202, 53, 71,253,156,235,123, 37,127,244,237, 49,207,221,178,
+ 40,229,211,105, 57, 20,161, 21, 80,149, 53, 74,250, 84, 85,195,131,206,219,170,118,153,241,209,100,132,163, 3, 42,202, 50,163,
+ 48, 32,132,195,180, 6, 94, 64,148, 68,110,151, 56,219,209,101,233,148,105,150,209,138, 18, 68,224, 48,178,121,150,225, 41, 69,
+145,231,180,219, 29,178, 60,163, 46,106,164,112, 39,178,164,157,208,212,238,228, 69,227,226,121,121,153, 17,122, 1,181,109, 40,
+203, 18,165,102,250, 56,206, 93,169,124,223,237, 42, 77,131, 47, 37, 37,150, 36, 78,168,171,154,170,169,168, 10,253,112,247, 24,
+ 70, 33, 82,184,113,170, 47, 61,198,147, 49,173, 86,130,214, 21, 65, 20,224, 9, 15,233,187,135,169,213, 13,194,119,210,129,122,
+240,125, 35, 64,184,139, 13,229, 65, 99,220, 5, 42, 96, 50,113, 27, 35,132,107, 53,122, 16, 77,244,124,215, 62,132, 49,180,103,
+154,253,106,199, 99,186,111, 88, 57,189,204,222,221, 3,242, 82,179,212,137,176,199, 23,241,179,146, 88,221, 99,126, 41,100,154,
+230,220,190,123,136, 39, 4,253,162,161, 95,230, 44,207, 9,164,145, 12, 74,203, 74, 28,224,117, 18,154,184, 77,166,107,210,124,
+194,178,103, 24,164,154,131, 72,114,117, 63, 37, 86,138, 61, 93, 51, 85,150,188,180,124,229,185, 59, 12,210,146,247,191,229, 56,
+ 23,218, 37, 85,216,229,242,242, 58, 11,189, 46,219,123,251, 20, 90, 59, 98,149, 16, 44,204,245, 56,185,118,140,175, 62,243, 29,
+130,192,155,109,232, 60,140,113,236,104,172,113, 27, 87,225,160, 68, 15,226,119,161,239, 58,231,117,109,176, 51, 35,105,221, 88,
+218,237,132,105,158, 81,213, 13,183,238,109, 82,148, 5, 39,214, 86, 25, 79,166,120, 74,210,234,180,216,219, 63,112,104,229,215,
+ 93, 33,137, 34, 86, 22,122, 44, 47, 45,178,187,187, 71,127, 56, 68, 74,201, 83,175,127,140,183, 63,245, 6,132, 16,220,190,183,
+201,119, 95,126,149, 19,235,235, 60,249,248,235,184,179,181,197,215,159,123,126, 22, 59,115,175,251,187,123,232, 74,227,201,199,
+ 92,180,172,210, 24,227,122, 12,164,112, 27,240, 90, 74,142,250, 3,178, 44, 99,117,105,137, 36,118,230, 76,233, 41, 60,229, 92,
+229, 66,184, 60,172,105,204,195,147,250,100,154,114,239,254, 54,143, 95,122,132, 99, 43, 43,140,211,140,123,219,187, 52, 85,195,
+205, 27,155,124,232, 61,239, 98,174,219,193, 83,174, 24,169, 63, 24, 16, 5, 1,167,143,175,115,230,228, 9,158,184,114, 9, 63,
+112,249,250,122,246, 0,172,107, 23,165, 91,152,239,113,246,204, 9,158,127,245, 21,254,255, 74, 4, 5, 63, 0, 0, 32, 0, 73,
+ 68, 65, 84, 47, 63,240,105,181, 90, 28, 13, 71,120,126,192,112, 50,101, 48, 24, 97,165,224, 96, 84,208,238,172,209, 4,231, 17,
+241, 54,173,100,149,211, 23,223,196,252,229,119,115,242,209, 55,240,210, 23, 63,205,225,253,111,129,237,185, 83,146,177, 88,209,
+ 64, 93, 50,190,191, 3,229, 33,166, 2, 41,219, 4,135, 45, 26, 37,104,242, 1,147,225, 22, 86, 84, 72, 41,193,139,136,194, 4,
+157,239,178, 53, 60, 64, 24,139,193, 80,228, 83,140,244, 48, 34, 32,207, 7,164,147, 17,237,222,105, 46,126,244, 3,100,163,125,
+178,225,152,110,239, 60,171,193, 6, 39,222,181,206,229,167, 50,254,248,247, 19,126,240,131,150,239,255,165,224,254,237,251,252,
+225,111,254, 34,195,253,219,148,213,167,105,183,142,113,227,153,223,161, 51,191,200,165,139,199,120,237,223, 27,190,112,245, 63,
+ 16,200,136,197,229, 53,126,252,141,130, 63,216,143,249, 15,191, 87,113,231,217, 79,147,247,191, 73,255,104,199,129, 73,144,180,
+123,231, 57,218,126,158, 17, 47, 17,180,143, 65, 61,193, 15, 59, 68,254, 18,173,197,243,172,108,188,141,167,223,247, 52, 52,150,
+122,237,144,157, 59, 59, 20,195, 1, 47,223,184,199,217,181, 69,222,252,193,247, 51,127,233, 28,123,155,215,121,205,110, 83,237,
+182,168,181,165,172,166,232,180,143,188, 49,166,222, 24, 83,236,127,129, 60,219, 97, 58, 25, 18,205,181, 1,183,161, 19,194,167,
+220, 18,180, 47,175,210, 91, 61, 70, 61, 29, 99,172, 75,241,168, 32,192, 26, 87, 97,218,106,181, 8,227, 8,176, 68,137, 91,176,
+235, 89,252,120, 60,113,164,207,164,213, 34,207, 93,250,164,105,106,119,210,182, 13, 90, 87, 76, 39, 83,172,117,102,233, 40,114,
+217,255, 44, 77,241,130,128,170, 44,156, 84,169, 32, 14, 99, 60, 79,145,101, 19,172,173, 72, 90, 45,186,221, 46,142, 72, 87,147,
+ 36, 17,214, 70, 84, 85,133, 51,108,103,164, 19,141,105, 26, 38, 19,119,130,174,102,135,147, 7,239,101,172, 37,240, 13,186,170,
+241,195,144, 52,157,226, 7, 17, 69, 49,157, 45,232,206,247,164,117, 13,216,153,220,105,102,239, 9, 96,208,149,187,174,180,113,
+254, 12, 35, 93, 12,176, 21,116,144,202,153,157, 49,206,184,109, 49, 88, 83,227,249, 1,233, 52,199,247,221,232,223,213,114, 67,
+ 16, 68, 40, 85, 51, 29,187,146, 25, 1,179,245,215,113,228,149, 18,152, 6,148, 39,241,148, 82,120,126,131,135, 71, 16,197, 40,
+207,141,154,211,105, 14, 2,148,239, 19,133,174, 94,180, 19,199, 14,241, 58,117,174,201,168, 21,211,157,235,145,166, 83,222,118,
+ 62,225,191,127, 95,139,147,243, 1, 40,119,114, 70, 72,236, 75,123,252, 31,207,222,162,180,150,185,216,167,241, 36,183,183, 38,
+ 44,100, 25,158,173,169, 43,136, 60,193, 80, 41,242, 56,230, 88,173,241,148, 71, 7,203, 94,224,187, 60,251,209,148, 23, 38, 21,
+152,134, 47,190,118, 72,215,247, 88, 89,108,113,110, 41,102,237,220, 42,107,111, 93,224, 7, 47,204,209,207, 75,174,109, 23,124,
+235, 86,201, 55,110,228,108, 13, 92, 97, 74,165,181,211,155, 43,137, 17, 16, 71, 17,211, 52,197, 83,110,108,164,148, 3,142, 96,
+ 27,178,204, 97, 5,195,208, 65, 4,176, 60, 52,154,197,113,139,172,200,105,108,141, 41, 5,166,169, 8,163,152, 34,207,104,199,
+ 45,202,178,116,209,136, 32,164,105,106,140, 53,140, 70, 99,252, 48, 0, 51,139, 45,104,237, 70, 52,190, 71,163, 13, 22,225, 98,
+100,101,129,181, 14, 41, 91,164, 41,214,130, 21,130,106, 54, 38,242, 60, 15,211, 52, 40, 3,249, 76, 83,210,165, 6,172,203,165,
+ 43,137,177, 14, 71, 57, 28,141, 80,210,229,230,181,209,152, 28, 34,223, 71,155,134,116, 58,165,193,162,156,131, 3,225, 43,170,
+ 60,119, 16, 19,137,219, 53, 42, 69,171,149,204, 22, 52, 55,254,111,181,156, 38,230, 60, 13, 96, 60,139,180,179,147,150,181, 44,
+ 31, 30,178,190,182,200,159,191,120,192,201,149, 57, 14,182,251,116,143,247,192,151, 92,255,206, 45,162,105, 70, 21, 10, 40, 12,
+ 39,174, 28,231,214,141, 29,142,180,166,103,160, 21, 88, 70,131, 41,219,135, 57,231, 67,203,168, 61,135,173,156, 75,251,120, 59,
+162,210, 37,157, 80, 65, 3,102, 62,162,204, 52,211,170,193, 7,226,110, 72, 58,173,121,246,197, 93,110,222, 63, 32, 89,191,136,
+174,151,137, 48,124,248,189,239,225,165,171, 55,144, 66,114,208, 31,208,237,118, 25,140, 71, 92,191,125,151,124, 70,253,155, 78,
+178,217,196, 69,208, 24,139,178,150,210, 52,120,194,225,112, 31,236,200, 29,184,194,245, 11,184,133,176,102,190,215,230,244,241,
+227, 8, 33,184,191,119,192,221,123, 91, 4,190,199,202,226, 2, 82, 74,124,229,145, 68, 17,231, 78,158, 96,174,219, 65, 90,102,
+167, 83, 73,146, 36, 20, 51,163,206,194,124,143,179,199, 55,152,155,233,142, 47, 95,187,193,112, 60, 37,140,250,236, 31,236,187,
+ 13,102,224,234,144,245, 44, 14,249,224,247,185,179,181, 77,161, 43, 78,110,172,113,114,125, 29,140,225,149, 27,154, 73,150, 19,
+122,142, 35,255,216,197, 11, 44,205,119,145,210,163,212, 5,166,169,105,172, 64, 97, 41,117,197,238,225, 33, 82,226, 22, 54,192,
+ 24,216,220,217,227, 47,191,252, 53,218,173,132,165,197, 5,214, 86,150,217, 63, 56,228,117, 23, 31, 97,247,176,207,210,194, 2,
+171, 75,139, 44,244,122,156, 59,121,156, 94,175,199, 35,103, 78,115,225,204, 41, 36,206,192,105,102,159,183,169, 52,129,239,234,
+ 49,139, 50, 39, 14, 67,226, 32, 98, 82,185, 50,164,211,199,215, 57,125, 98,131,147,107,171,188,237,169, 55,146,151, 21,247,119,
+247, 28, 94, 54,207,105, 38, 33,198, 79, 48,219, 78,225,187,244,206,255,138,149,165,183,177, 56, 39,137, 98,193,214, 22,244, 58,
+103,233,111,125,155, 70,223,198, 88, 15, 83, 21, 24, 1, 70,151, 12, 14,175,211, 10, 26,188,104,129,202,198, 96,112, 70,173, 42,
+103,210,191,142, 71, 76,216, 57,129, 12, 18,234, 98, 72,218, 79,177,102, 14,107, 4,117, 61,165,212, 19,170,108,128,197, 98,131,
+ 13, 54, 30,253, 33,158,122,239, 47,112,191,248, 35,178,221, 33,113,251,144, 50, 77,185,190, 58,161,122,111,139,253, 97,194, 23,
+254,242,147,252,197,239, 23,140, 7, 87, 17,254, 60,119, 94,248, 60, 0,127,245,169,167,241,165,160, 50, 22,171,230,185,243,234,
+151,185,252,230, 31,103,239,230,151,152, 12,143,120,236, 3,191,206,223,251, 93,184,253,173,207,113,255,198,103,201,135, 47,145,
+246, 55,201, 68, 77, 28,198, 92,121,235, 79, 81,148,219,120, 65,143,163,251,223,103,110,113, 68, 16,175,130, 39,233,116, 79,176,
+178,246, 20,151, 95,247, 52,137,103, 57,251,145, 49, 7,191,247, 97, 46, 92, 60,228,149,151,174, 99,116,206,245,187,219, 92, 82,
+ 62,226,123,107, 44, 62,186,192,241,243,127,205,205,187,247,169,171, 0, 93, 15,169,203, 49, 77,190,207,218,198, 26,250,216, 46,
+131,231,238, 50,189,119,159, 83,111,121,156, 96,165, 70,111, 43, 80, 1, 81, 20, 83, 35, 88,185,116,133,251,207, 62, 75,211,104,
+146,150,211,117,117,149, 97,172,117,240,178, 48,196, 90, 48, 85, 61, 43,111, 49,232,162, 66, 5,138, 40, 72,192, 74, 90, 73,155,
+ 52,117, 73, 16,167, 29, 55,120,158, 68, 41,215, 12, 56,157, 78,145, 66,208,238,116,240, 3,119,136, 9,219, 29,106, 93,206,198,
+206, 25,224, 10, 88,154,202, 33, 87,149,116,198, 85, 41, 21,142,210,233,162,188,174, 95, 32,198, 90, 87,126, 34,132,160,221,110,
+ 35,165,164,105, 12,217, 12, 59,107,140, 51, 73, 59,100, 57,204,121, 29, 26,107, 72,162,158,123, 14, 54, 46, 18,140,181,110, 51,
+109, 26,140,177, 68,145, 27,249,131,235, 54,145,190,116, 61,242,161,143,148,222,204,145,223, 96,141,139,137,251, 42,192,151, 30,
+133, 46, 41, 10, 77,219,115,206,250, 32,112,135,102, 55,133,112,211,131,105,154,186,117,197, 56,179,160,242,124,234,217,228,220,
+ 15, 67, 64, 96, 76,141,167,148,196, 15, 28,132,197,137,250,110,164, 94, 27,135,245, 75,162, 4, 33,220,142, 60, 47,115,166,153,
+235,204,150,158,164,156, 57,187,223,113,165,199, 63,251,209, 57, 18, 37,104,114,139,188,185,197,159,124,227, 6,231, 87,186, 28,
+166, 37,117, 63, 99,101, 46,100, 89,122,108, 30,140,104,101,154,181,197,132,186,145, 88,109, 72, 22,219,200,221, 17,129,209,100,
+ 86, 48, 45,157,209,110,189, 46,201,240, 40,133,135, 15,120,141,230,148,240,144, 77, 77,146,121, 92,191,175,249,214,213, 3, 30,
+ 89,159,231,226,201,121,230,219, 93,222,250,232, 60,111,189, 84,240,247,139,156,151,239,105,254,236,123, 41,127,241,157,193,236,
+116,238,198,208,141,169,105,183,219, 84,181, 35,114,213, 77,131, 53, 53,198, 88,192, 53,168, 85, 85,237,200,118,157, 14,147,201,
+ 4, 97,157,193, 46,138, 18,210, 52,115, 84, 36, 47, 64, 72, 65,146,180, 41, 75,151,135,140,163,132,188, 44,144, 40,164,112, 48,
+ 31, 83,107,130, 32,166,154,209,196,124, 47, 38, 47, 11, 60, 36, 97, 24,206,220,132, 46,211,175,243,210,149, 45,132, 62,113,232,
+220,140, 0,147,201,196, 45, 8,198,184,139,122, 86,120,160,107,119,106, 15,148,194, 0,173, 36,161, 44, 75,202,170,118,241, 58,
+229, 8,112, 58,207, 29, 99, 63, 12, 81,141,101,154, 78,105, 69, 45,116,154,211,208,208,105,119,221, 40, 11, 7, 72,104,170, 26,
+161, 60, 55,190, 50,134,188,174, 41,243,156, 78,171,195,120, 58, 70, 2, 70, 56, 40, 77,224,123,180,187, 93,142,138,156,139, 43,
+ 9, 87, 15,167, 20,135, 41, 63,250,150,115, 48, 42,216, 31, 23,172,157, 91,230,254,181, 29,240, 20,131,189, 17, 89,238,138, 99,
+234,113,202,246,168,166, 76,115,138,170,226,106,161,144,197,136, 78,171,228,228, 98,155, 32, 48, 12, 83, 75,173, 60,148, 87, 49,
+ 61, 40, 24, 27,103,192, 89, 92,138, 89,153, 75,184,101, 83,146, 0, 84,101, 17,249,152,204,171, 25,239,236,242,189, 87,174, 1,
+ 78,150,185,179,181, 53,227, 57, 75, 78,159,216,224,160, 63,160,105, 26,178,178,192, 11,188, 25, 9,205,101, 89, 67,223, 39,106,
+ 39,179, 83,137,243, 17,148,186, 36, 43, 11,164,117, 27, 93,173, 53, 81,224, 8,110,197, 12,113, 44,146,152,166, 49,244, 71, 35,
+108, 99,200,138,130,205,205,251,156, 58,181,193,226,252, 60,157, 86,204,104,146, 82,104,205,205,123,247,156,254, 13, 28, 30,245,
+121,237,230, 45,252, 64,113,225,204, 25,148,148,228, 69, 78,175,221,162, 44, 74,142,134, 99, 23,223,116,135, 3, 30,164, 35, 66,
+223,167,221,110,209,110,185, 22,189, 19, 39, 87, 49,166,230,214,230, 22,198, 24,210,162,100, 52, 77,153,230, 57,194, 10, 55,102,
+244, 21,101, 81,146,149, 26,223,115,145,181,197,249,121,170,198, 50,158,166, 12,199, 99,226, 40,228, 29,111,126,146,199, 46, 94,
+160,219,233, 82, 87,154,254, 96, 72,154,229, 28, 91, 93,229,233,167,222,192,165,115,103,168,106,215, 93,173, 16,156, 63,115, 10,
+107, 45,121,233,224, 66, 74, 74,116,229,226,153,117, 29, 97,140,161, 40, 75, 22,231, 23,121,228,244,105, 78,157,216,224,165,215,
+174, 97,140,225,206,214, 54,163, 73,202, 56,205,169,154,134,139,103,206,112,119,107, 7,161, 4,163,209,132,197,192,199,106, 67,
+149, 27, 4, 25,117,177,197,245, 23,255,156,215,244,132,198,100,232,186,162, 41,115,178,209, 17,202,236,209,212, 10, 93, 67, 85,
+229,164,131,187, 52,248,228,149,198,230,215, 16,178,227,252, 6,141,165, 44, 83,178,209, 38,143,191,255, 87,121,223,175,253, 12,
+213, 51,130,111,255,197, 95,113,227,213, 63,192, 19, 35,106, 13,186,152,210,216,146,108,184, 73, 54,218,230,252,219,127,129,127,
+249, 23,255,140, 13, 52, 63,247,223,254, 57,241, 74,194,193,214, 22,157,203,119, 73, 95,251, 34,195,255,249, 2,202,196,216, 44,
+228,254,171,255, 59,253,163, 67, 46,158, 63,195,239,253,206,191,230, 39, 62,246,113, 58, 29,103,224, 5,120,238,185,103,249,204,
+167,255, 45,255,250,119,127,149,160,123,146,203,111,250, 4, 82,231, 60,247,231,255,140,241,193, 77,138,209, 93,138,209, 53,214,
+ 31,121, 31,225,169, 8, 63, 61,197,135,254,139,127,200,215,191,251, 41,182, 95,253, 22,158, 23,224,183, 22, 89,191,248, 62,178,
+209, 22,141, 18,248,137, 79, 58,172, 24, 16, 48,248, 70,143,115,239, 55,232,175, 93, 97,229,112,204, 84,231, 72,223,227,246,222,
+ 54,103,162, 67,166, 95, 93, 68,116,125,218,199, 39,244,175,121, 52,197,128, 70,231,164,211, 62,111, 95,127,138,104,161,199, 11,
+165, 70,150, 79,113,230, 7, 86,217,187,191, 67, 1,180, 90,109,188,160,131,221,211,176,186, 78,123,190,203,184,127,136,174, 42,
+242,194, 65,181,162, 40,198,224, 76,154,101, 89,162, 60,159,172,116, 60,144,192,139,144,184,182, 55, 99,205,172, 32,169,193,243,
+ 44,121, 94,211,212, 6,102,135,153, 36,105,205, 70,236,134,225,112, 68,183,219, 37,207, 50,164, 20,248,126, 8, 52,104,157, 19,
+120,142,253,224,251, 30,158,240, 64, 72, 38,211,130, 48,116, 90, 52,141,196, 52, 53,214, 24,172,117,154,252,252,252,252,195,251,
+201, 90,151,236, 49,141, 68, 8,139, 64, 48, 24,244,137,227,136, 40, 74,168,109, 77,160, 34, 30, 52, 27, 6,145,143,111, 93,206,
+ 93, 73, 71, 40,181, 66, 56,195,246,236,103, 26,155,160,117,142, 47,221,239, 96,177,120,128, 49,238,164,239,169,128,198,212, 24,
+ 41,136, 91,174,117,205, 90, 65, 43,113,207,149,241,120, 76,156, 56,148, 57, 56,223, 73,173, 28,173, 46,207, 75,230, 58, 1, 94,
+ 28, 83, 27,167,243, 59,105,163, 70,173,159, 60,249, 73,173,181, 43,102,152,157,196, 30,116,227, 58, 3,128,155,231, 27,107, 25,
+ 79, 38,128,164,221,105, 59, 16,191,181,124,228, 41,143,127,250,193, 69, 2,169,192, 90,190,251,249, 87,185,182, 61, 98, 46, 14,
+208,194,178,180, 58,207, 98, 39, 96,161,215,166,221, 13,157, 1,109,156, 49,210,134,126,209,144,132, 30,221, 78,204,222, 56,163,
+237, 43,108,203, 39,110,183,136,103, 78, 68, 19, 39,172, 31, 95, 66, 87,154,157,189, 49,141, 53, 40,169,136, 3,143, 58,205, 8,
+179, 28, 93,148,140, 74,193,100,100,216,188,121,192,170, 10, 81,237,132,245, 51, 93,222,117, 33,228, 35,143,133, 92, 92,139, 25,
+228, 53,131,204,115,139,103,233, 58,205,235,202,237,226,124, 47, 32, 73, 90, 14, 58,144, 23,232,217,184, 48, 75, 83,226, 40, 66,
+215, 53,158,144,100, 51, 80,141,174, 28, 99,221, 21, 55,148, 72,207,181,153,105, 93, 98, 27, 67, 51,187,128,132,242,240,125,143,
+ 34,203,104,106, 75,171,149, 32,165,165,200,115,234,198, 17,251,106,237, 96, 22, 90, 59, 7,125, 20, 69, 40,161,176, 2,210,233,
+ 20,215, 95,238,163,164,116,122,104, 18, 57,247,104,228,152,216, 81, 24, 62, 4,207,120, 74,128, 82, 46, 99, 29,132,179, 5,168,
+228, 1, 5,175,210,154,186,177, 96, 13,117, 93, 97,113,133, 0, 66, 56,164,163,139, 96,101, 84, 85,133,107, 96,115,252,126, 61,
+ 27,191, 11, 4,141, 0, 93, 85,142, 37, 96, 12,190, 39,248,224,220,148, 91,123, 35, 74,171,248, 59,143,172,240,214, 75,199, 80,
+143,174, 83,222,216, 98,123, 90,209,155,159,163,117,108,142,110, 39,230,240,238, 46, 7,218, 32,124, 69,207, 26,130,166,161, 70,
+ 80,251,174, 2, 81, 98,232,133,138,133, 72,210,207, 74,142,198, 5,185,177,244, 90, 1,227, 97,201,227,151, 87,169,149, 65,215,
+130,188,180,132,145,194,150, 53,231,186, 33,113, 28,161,231, 78, 51,201, 51, 90,115, 61,110,223,217,164,174, 43, 46,157,191, 64,
+232,251,164, 89,202,120,154,114, 56, 24, 18,248, 51, 79, 6,130,110, 59,113, 30, 13, 41,136,194,128, 56,114, 83,169,198,184, 17,
+ 92, 81,104,210, 60,163,210, 46,235, 93,213,110,170, 83, 53, 46, 71,158,101, 57,165,214,132, 97, 64, 24, 4,100, 69,193,120, 50,
+101, 48,158,112,119,107, 27, 33, 5, 82, 42,210,194, 65,151, 90, 81,140, 17,130,105,154,225,123, 30,103, 78, 28,103,227,216, 10,
+ 66, 72,174,221,190,203,171, 55, 28,187, 61, 74, 98,164,132, 27,119, 55, 57, 60,250,255, 18,216,166, 89, 70, 28,134,180, 91, 9,
+243,115, 61, 54, 86, 87, 88, 92,152, 71,107, 61,187, 78, 65, 74,151, 1, 95,232,205,145,180, 18,170,170,162,208,174, 44, 38, 47,
+ 10,124,169,104, 76,197, 65,127,200, 81,127,192,238,193, 33, 85, 85,115,227,206, 61,250,163, 49, 79, 63,245, 70, 30,125,228, 2,
+ 69,145,243,226,245,155, 92,189,113,139,159,252,224,251,185,116,238, 12,157,118,155,147,235,235,172, 46, 45,144,132, 46,143, 31,
+135,225,195,222,130, 40,244,241, 61,223, 37, 88,164,160,170,106, 14,250,135,124,249, 27,207,146,102, 25,187,135, 7, 96, 93,145,
+212, 66,175, 75, 18,199,172,173, 44, 51,223,235,209, 31, 12,185,119,127,155,241,100, 76, 99, 45,245,226, 26,117,218, 65,103, 71,
+232, 98,192,100, 56, 64, 23,125,242,244,136,124,188, 77, 58,184, 77, 58,222, 68, 8,159,108,114,139,209,209,125, 72, 30,225,117,
+111,254, 53,126,246,231,254, 37,143,190,245,105,158,253,226,215,232,239,190, 64,105,142,168, 38, 71, 20,147,219,116,122, 23,248,
+ 59, 63,242, 47, 88,121, 51, 36,151, 33,220, 57,199,238,221, 87, 25,142,191,141, 40, 50, 42, 61,160, 24,109, 50, 58,186, 70,119,
+254, 28,237,249, 85, 94,249,122,202, 55, 95,129,229, 39, 78,241,249, 95,254, 37, 94,184,179,200,246,189,231,232,223,221, 97, 50,
+218, 97,119,251,203,188,240,229,223, 38,242,106,254,207, 63,252,191,248, 87,191,245,191,241,134, 39,159,194,213,107,242,112,250,
+179,190,190,193, 15,255,200,143,242,171,191,250,171, 36,170,224, 51,191,247, 73,198,227, 93,226,120,145,127,240,107,191,205,139,
+ 47,254, 25,163,221, 17, 31,252,196, 23,176,186, 97,255,254,243, 12, 54, 23,185,241,245, 63, 70, 40, 69,111,229, 81,100,224,113,
+226,202, 7, 88, 56,247, 78,198,247, 95, 38,111, 38,228,118,204,225,240,128,155,215, 53,197,221,121, 14,174,237,177,176, 62, 97,
+175, 63, 34, 8, 19,140, 41,200,237, 17,163, 91, 57,253,173,107, 72,125,136,206, 20,117, 93, 96,171,140,170, 28,177,188,177, 66,
+220,105,211,154,107,147,116,222, 65,216, 36, 68,221, 49, 83, 81,225,235, 5,148, 23,162,100, 64,211, 46,176,147, 67,244,100, 76,
+ 89, 57,239,137,167, 60,138,135,178,162, 37,136, 66,148,242,241, 61, 55,109, 50,184, 82, 33, 7, 1,107,208, 85,133, 49,110, 65,
+ 18, 74, 18,248, 46, 86, 93,104, 77, 85,215, 15, 97, 95,238,239, 38, 65, 88, 23,231,172,221,228,204, 77, 17, 5, 40, 65, 16, 4,
+ 84,181, 70, 74, 39, 13, 51,219, 32, 87, 51, 41,205, 0, 77,163,193,184,205,186, 16,130,178, 40, 40,138,156,178, 44,103,204,122,
+215,223, 17, 4, 1,217,204, 8, 39,173,164, 49,134,188, 44,104,234, 26,129, 3,214,212, 51, 26,105,109, 28,156,172,110, 26,170,
+170,114, 50,158, 46, 49,198,121,136,210, 44,197,204,100,133,186,118,224,165,198, 54, 14,236, 38, 37, 74, 42,231,227, 41, 10, 44,
+ 14, 47,237, 5, 1,101, 81, 56,160,140,242, 30, 78,108,165,231, 17, 4, 1,211,204,149,115, 9, 92, 18, 43,207, 11,148,146,168,
+ 51,231, 47,124, 50, 10,102, 4, 51, 63, 32,240, 61,130, 48, 68, 40,133,169, 12, 89,158,131, 16,100,121, 78, 93, 53,184, 72,130,
+ 43, 31,185,178, 30,240, 43,239,157,199, 7, 68, 13,175,124,241, 85,166,101,197,217,227, 11,104,211, 80, 87,208,142, 2, 84,168,
+152,159,107, 33,164, 64, 37, 62, 50,118,208, 24, 41, 37,105, 81, 51,152, 22, 12, 52,180, 60, 40,203, 6,101,106,124, 44,198, 66,
+103,213,229,145,139, 66, 67,101,232,246, 34,150,122, 45, 84, 43,100, 58,156, 80, 26, 67, 55, 78,232,133,138,166, 72, 73, 15, 70,
+188,118,175, 15,133,207, 66,114, 26,218,115,180,230, 66, 46,157, 12,249,200, 19, 45,126,248, 74,200,164,180,228, 38,196, 8,159,
+166,254, 91, 61,237, 72, 7,212, 81,146,164,213,194, 15, 2, 84, 16, 32,149,239, 0, 4,190,143,110, 92,181,105, 24,134,206, 37,
+238,133,248, 82, 96, 77,253, 48,222,229,121, 46, 26, 24,249, 62, 65,232,187, 47, 36, 8,144, 56,246,176,174,181,235,201,149,130,
+ 48, 8,168,234, 26, 99, 27, 90,113,139,170,118,117,131,197,172, 60, 0,152,213, 7, 86,238, 2,240,156,249, 73, 74,233,114,152,
+128,193,186,239, 46, 8, 0, 9, 86, 34,133,114, 38, 42, 3,190,231,185,180,128,148, 68, 97, 12,166, 38,142,163,135,191,171,239,
+249, 76,211, 9,101, 89,226, 8, 72,150, 40,113,165, 57, 97, 16, 98,140,153,141,157,157,238,223, 78, 92,255,181,174, 42,194, 56,
+ 98,125, 33,225,157,157, 41,198, 15, 25,213, 6, 83, 22,156,152, 15, 17, 43,115,232,173, 1,247,119, 39,108, 95,221,165,219, 75,
+ 88, 93,239,177,127,152, 49,108, 44, 82, 55,116,165,219,188,236,234,134,229,249, 22, 13,208, 86, 1,147,180,196,247, 37,105, 37,
+120,121,119,140,174, 44, 43,221,128,233, 40,163,189,208, 97, 58,173, 40, 39, 14,136,227, 18,216,146, 56,145, 20,133,193,172, 93,
+194, 26, 75, 24, 39, 76,210, 41,187,135,125, 46,157, 59,131,174, 42, 6,163, 49,183,238,109,178,189,183,207, 96, 52,166,106, 12,
+167, 54, 86, 89, 91, 94, 98,121, 97,129,249,158, 51,186,213,117,253,112, 98, 83, 53,174, 88, 36, 47, 53,133, 46,209,186, 38, 43,
+ 28,155,253,104, 56, 96, 50,157,162,171,154, 48,240, 73,162,144,166,113,177,152, 7,139,103, 81, 58,154, 97, 89, 85, 44,244,122,
+ 52,198,176,179,183,143, 43, 59, 42, 25, 78, 38,204,117,219,180,227, 24,207,247,153, 76,167, 20,133, 3, 29,157, 59,121,156,139,
+103,207, 97,113,180,182,191, 13,109, 89,232,245, 56,177,190,202,165,115,103, 56,115,242, 56,101, 85, 83, 87, 21,253,209,152,237,
+189,125,210,204,105,230, 94,224,160, 22, 82,130, 16,142, 38,168,117,197, 36, 77, 41, 43, 77, 85, 59, 73, 65, 87,154,173,221, 61,
+172,117,253,215,151, 47,158, 99, 52, 28,241,181,111,127,135, 47,124,237,155,108,172, 46,243,223,253,226,207,115,233,236, 25,150,
+150, 22, 28,193, 49,203,153, 95, 88, 64, 8,215, 40, 24, 5,142,161, 16,135,161,227, 74,204, 28,200,214, 56,130, 99,224, 7, 40,
+ 79,241, 71,159,253,127,104,106,119,253,174, 44, 46,114,225,204, 41, 30, 57,119,138,249,185, 57,142, 45, 46, 98,172,161,168,106,
+ 68, 93,179,216,109,179, 31,118,208,227,152,186,200, 49,233, 93,178,105, 78, 54,217, 38, 27,109, 81,230,125,242,225, 22,217,116,
+159,139,111,253, 37, 94,247,131,255,156, 15,125,226,147,252,194,167, 62,206, 79,125,124,157,159,253,129,152,119,188,177,203,251,
+254,193, 7, 57,108, 62,193,222,173,255, 72,214,191, 79,144,172,113,229,233,159, 99,176,125,135,215,254,239, 87,185,251,215, 7,
+ 12, 38, 7,212, 89,202,238,245,111, 81,142,110,146,167, 7,120,254, 60, 27,103,223,205,177,115,239,163,206,166,188,248,215,191,
+133,156,187, 71,254,138,207,179, 55, 54, 24,164, 5,254,218,132,159,253,216,255,196,119,191,250, 5,190,255,165, 95,231,237,111,
+122, 61,175, 94,187,193,133, 11, 23, 30,202, 56,238, 36,101, 24, 14,135,206, 21, 13, 15, 39,113, 63,240,182,183,243,159,125,226,
+231,248,204,167,255, 87,188,222, 57,206, 60,246,195,220,187,250, 61,146,206, 25,182,238,124,139,239,126,225,159, 19,172, 70, 40,
+219,240,202, 51,159, 98,229,216, 99, 60,246,142, 95, 97,235,198, 95, 49, 57,186, 71,149, 78, 40, 38,123,164,251, 55,153, 28,222,
+ 99,116,120,157, 81,255, 42, 7,247, 95, 38,175, 4,213,120,196,220,162, 98, 56,153,208, 76, 13,117,121, 68,222,223, 99,176,125,
+147,226,112,135,246,194, 2,166, 81,152,170, 66,120,146,238,114,155,249,165,121,180, 46,185,191,121,196,209,102, 73,195, 22,197,
+116, 76,160, 54,240, 68,132, 20, 30,229,164,192,139,166,140,183,183, 48,141,165,174, 43,116,161, 1,225, 38,186,194, 67,224,122,
+218,165,116, 13,106,113,156,184,231,142,239,185,131,199,236, 26, 53,198,101,220,125, 63,194, 24,231, 35, 10, 66, 87, 94, 21,120,
+ 10,148,162,210,185, 51,174, 38,177, 75,241,132,161, 51, 8,206, 34, 96, 98,118, 16,245, 61, 31, 36, 4,126,128,175,220, 51, 38,
+137, 92,203,101, 81,204,154, 73,197,108,193,175,107,154,198, 34,165, 35,184, 9,233,166,213, 90, 59,115, 91, 81,148, 46, 61,229,
+ 73, 2, 47, 64, 72, 71, 21, 13,194,144,162,112,212,202,110,187,131,107,227, 12,102,165, 45,181,115,173,123,238, 20,175,117, 69,
+ 24, 37, 36,113, 76, 24,134,142, 33, 97, 28, 29,206, 15,125,210, 52,117,174,127,229, 3,130, 86, 28,163,164, 71, 93,107, 66,223,
+ 71, 72, 15, 83, 59,248, 87, 28, 70,228, 89,129, 49,205, 76, 90, 46,209,186,162,213, 78, 64, 8,188,186,170,200, 11, 87,161, 23,
+135, 49,133,118, 38,174, 32,142,105,164,128, 74,144,166, 41, 86, 48,211,214, 37,141,177,232, 98,202, 63,126,207, 26,173,110, 4,
+219, 99,254,250, 43, 47, 50, 40, 60, 90, 17,188,120, 99,151, 36,142, 24, 22, 53,141, 74,217, 88,237, 50, 28,166,108,238, 15, 89,
+ 91,234,241,200,202, 60,233,210, 28,195,113,137, 23, 74, 48,150,147, 82,178,119,251, 0, 61,204,144, 8,246,171,134, 14,144,231,
+ 5, 65,187, 77,216,138,144,190, 91,120, 43, 41, 81,186,161,179,212,165,109, 93,233, 73, 97,225,232,104,200,112,154,113,114,101,
+153, 94, 16,208, 76,143, 40,142, 52,247,246,142,104,135,150, 19, 79,172,177,177,152,241, 79,222, 15,163,188,225,217, 77,203,167,
+158, 81,236, 13, 37,105,158,209,235, 58,208, 12,194, 57,217,149,231, 35,234, 26, 7,222,175,176,181, 97,174, 51,231,178,128,158,
+156, 97, 83, 93, 68,205, 25,243, 4,204, 38, 29, 18, 80,129, 67,239, 54,117, 69, 24, 70, 40, 47, 36,150, 53,198, 90, 26,173,103,
+ 6, 55,103, 52, 52,184,197, 27,220,132, 36,140,194, 89, 36, 67, 80, 87,213,172,159,184, 68,212, 46, 98, 17, 4, 17,249, 44,191,
+ 14, 22, 41, 93, 38,221, 26, 11,194, 61, 44,218,157, 54,166,169, 31, 70,163,156,166,211,224,205, 50,142, 86, 56, 39,180,177, 13,
+129, 23,184,253, 0, 46, 37,160,117, 77,173, 53, 74, 57,243, 72, 43,142,176, 64,109, 12,121,238,112,133, 46,183, 31,240,143,222,
+217, 97,126,144,243,213,205,148,227, 85, 69,154,213,216,121,103, 36,252,238,189, 1,147,195, 49,210,212,212,186,192,214, 93,182,
+ 51, 77,183, 19, 49,191,216,101,112,107, 23,213, 88,188, 36,100, 50, 74, 17,129, 27,109,175, 44,182, 56, 48, 32, 61,231,131, 24,
+231,154, 73,217,208,238, 68,140,139, 26, 43, 4, 19,221,176,177,212,102,146,107,166, 90,240,253, 65,131, 45, 70, 44,157, 74,169,
+181,230,235, 47,126,159,171,183,238,242,232, 35, 23, 16, 51, 95, 64,183,211, 70, 72, 65, 94,150,236,236, 29,224, 43,193,194, 92,
+151, 32,116, 61,231, 78, 30,153,193,122,180,251, 78,132,177,132,145,107, 43,204,180, 70,219, 26, 33,228,195,141,105,183,219,117,
+ 36, 68, 37, 57,121,252, 56,113,224, 51, 45, 74, 6,253,225, 67, 87,236,124,111,142, 99, 43,139, 4,158, 34, 47, 53,171, 75,139,
+ 92,191,123,151,189,163, 35,130,192,115, 52, 54, 33, 73,162,128,227,107,107,100,121,206,193, 96,192,171, 55,110, 50, 63, 55,199,
+193,225,145,115,252,254,173, 87,127, 56,228, 59, 47, 78,217, 59, 56,226, 93, 79,191,133, 94,183, 11, 64,183,211,134,198, 56,108,
+177, 82,108,168, 85,206,158, 58, 9,128,239, 41, 64, 17, 45, 44,144, 68, 17,211,212,213,188, 86,149, 75,132, 60,120,165,121,198,
+173,219,119,121,236,145,243, 20,117,205,137,181, 53,238,110,237,240,233,127,255,103,188,229,245,143,147,102, 57, 95,125,230, 89,
+ 46,157, 59,205,111,125,242,127, 36,105, 37,120,202,115,254, 20,235,146, 49,158,146,100,133,195,126, 14,116,197,222,209, 33,215,
+174,223, 98,115,119,143, 83,235,107, 92,191,115, 23,112,242, 72,167,221,113,233, 18,223, 33,158, 59,173, 22,199,150, 22,168, 3,
+143,238,234, 18,155,194,167,208, 41, 89,166, 73, 39,215, 8,154, 22, 70, 27,170,202, 81,197,210,116,151,197,181,183,113,252,220,
+ 91,233,118, 83, 38,229, 22, 95,251,178,166,185, 46,248,221, 73,131,103,231,136, 60,159, 51,107, 11,188,254,159,254, 41,193,155,
+224,185,223,217, 99,243,234, 31, 83,234,109, 36, 30,122,111,159,154,154, 60,221,227,196,227, 63,206,220,234,101, 78,158,122, 23,
+107,231,231, 17,218,178,125,191, 79,127,235, 5,218, 87, 42,122, 39, 79,114,237,243,127,202,222,245,207,243,248,199,127,140,133,
+ 83,143,115,227,142,229,214,139,127,200, 92,183,197, 87,254,227, 55, 30,202, 36, 0,167, 78,157, 98,123,123,155,191,253,250,204,
+103, 62,195,199, 62,246, 49,192,221,175, 39, 79,157,230,143,255,240, 15,248,249,191,247, 95,242,111,255,201,123, 72, 39, 55,121,
+221,219,127,149,165,229,199,208,147, 91,108, 60,249, 58,218,199,143,243,182, 75,191, 66, 93,140, 25, 14, 95, 64, 26,201,225,230,
+ 51,140,247, 95,197,216,134, 48, 89,198, 51, 83,140, 86,148,153,135, 14,143,136, 77, 70, 58, 44, 56,222,173, 89,233, 36,220, 25,
+110,163, 76,133,191, 80, 97,238, 29, 82, 11, 11, 75, 53,137, 76, 48, 44,226,139, 57,114,235,106,148, 35, 21,224,117,183,217,190,
+145, 50, 26,222,199,107, 37, 44, 28, 55, 32, 61,132, 8,240,109,136,109,205,225,121, 30,158,231, 72,161, 66, 8, 38,211, 9,117,
+ 13,117, 85,184, 9, 78, 20, 51,153, 78, 9,227,208, 77, 67,181,198, 11, 60,148,112, 39, 79, 41,220,129,106,182,214,162,140,155,
+238, 40, 92, 83, 38,128, 15,216,166,194, 90,152, 76,199,200,217, 61,141, 48, 51,249,211,130,112, 26,121, 81,234,217,223,191, 38,
+ 75, 83, 66,223,167,156, 25,206,226, 56, 70, 40,137, 48, 2, 33,113, 19,234,202, 32,148, 37, 12, 66, 4, 80,134, 30,158,144,140,
+ 70, 35,192,153,218,154,170, 34, 10, 34,194, 56,164,221,118,125, 6,126,232, 14, 62,211,105, 70,156, 56, 24, 87, 94,150, 4, 65,
+ 72,158, 23, 36,201,172,100, 38, 12, 41,139, 2,227,187,104,103,187,213,166, 44, 92,117,111,154,166,180, 59, 29,166,105, 74, 20,
+184, 52, 83, 86,148, 4,190, 34, 73, 58,248,190,164, 44, 43,130,208,163,169, 26,132,114, 45,150, 97,227, 83, 85, 53, 77, 93,145,
+151, 37, 89,150,187, 83,255,201, 51,103, 62,233,249,158,227, 64, 55, 53,117, 99, 48,128,242, 60,242, 44,119, 99,118, 33,136,195,
+ 24,229, 75,148,116,172,221,143,189,169,205,187, 95, 55,135,189, 61,228,247,255,244, 57, 50, 45, 8, 16, 72, 33,104,117, 19,202,
+198, 50, 62,202,169,117,195,116, 90, 80, 26, 75, 90, 84,228, 89,197, 96,156, 35,164,194,111,121,132,202,167,237, 41,132, 18,120,
+ 73, 64,214, 52,120, 65,196,177, 51, 75,140,199, 5,249, 36, 67,167, 57,121, 63,133,170, 66, 73, 65, 24,170,135,227,102,155, 23,
+ 72,233, 17,122, 30,158, 39,137,227, 0,131,160, 29,135,232,105,206,225,206, 62,227,131, 67,134, 89, 77,207,244, 8,223,255, 97,
+196,198, 49, 34, 15,206, 45, 90,126,234,209,136, 51, 43, 30,149,240,153,148,146, 82, 59, 44,170,239,251, 40, 57,171, 73,108, 28,
+176,165,105, 92, 43,143, 3,226, 72,164, 16,179, 18,129,153, 81,162,174,145, 74, 17,248, 78,183, 23, 66, 58,215,145,157, 85,210,
+ 22, 25,122, 70, 18,171,202,210,185, 56,181,126,232,202,215,165, 99, 5, 71, 97, 8,214,197, 28,202, 82,227,121,138, 86,210,154,
+141, 52,163, 25,157, 72,160,164,164,177,142,128, 22,197,173,135,145,140, 7,153,198, 70,215,232, 82, 99,173, 33, 77, 83,167,193,
+ 87,142,251, 93,106, 77, 81,150, 84,117,237,234,252,154, 6,207,243,221,130, 94,187,207, 11,238,239, 80,215, 53, 40,233,162,125,
+126,128, 84,174,150, 87, 41,143, 39, 55, 44, 63,255,120,136, 74, 53,223, 59, 72, 49,185,230,202, 74,204,226, 19,103, 16, 71, 53,
+183,238, 31, 81,140,115,172, 82,120, 94, 64, 38,224,222,189, 33,139, 11, 9,107,107, 61,142,198, 37,163, 32, 64,230, 37,158, 20,
+212,153,102,190, 21,226,181, 66, 94,220, 25,211,154,139,233,250,146, 90, 55, 44,118, 35, 68, 28, 16, 36, 1, 7, 35, 77, 88, 87,
+156, 94,235, 32,246,118,233,166, 35, 98, 93, 17, 78,135,164, 11,167, 48, 42, 96,253,248, 6,251,253, 62,251, 7,135, 12, 38, 19,
+ 78, 30, 91,193, 26,183,136,244, 7, 99, 44,150,203, 23,206,179,190,188,140,174, 53,105,150,147, 87, 21,198, 58,250,222,131, 90,
+200,131,254,128,157,253, 35,238,110,109,187,186,224,217, 38,238,129,166,221, 73, 18,172, 49, 12,199, 19,146, 56,100,117,101,153,
+ 78,156, 48, 78,167,236, 31, 29, 81, 85, 53,113, 28, 18,135,238, 4, 18,133, 62,221, 78,155, 55,189,254, 49, 94,189,126,139,162,
+212, 28, 91, 90,100,117,101,137, 48,240,216,220,217,101,255,112,128,146, 46,182,232, 12, 58, 33,119,182,182, 49,230,111, 98, 96,
+ 0, 22, 8, 66,159,193,104, 68, 20,132, 84,117,197,247, 95,189,198,230,238, 30,186,114,250, 95, 81,150,140, 70, 35,170,166,161,
+174,106,218,173, 4, 99, 26,124, 63, 96, 97,126,142,165,133, 5,186,157, 22, 22,193,214,206, 46,186,170, 88, 90, 88, 96,101,121,
+ 9,223,115, 93,238, 55,238,221,227,194,153, 83, 92, 58,123,134,205,157, 29,158,127,233,101, 78,108,172,243,163, 63,244, 46, 22,
+230,231, 8, 3,151,224, 16, 82,160,148, 55, 27, 79,186, 78,179, 74, 87,232, 90, 51, 28, 78,216, 62, 56,228,251,175, 92,229,133,
+ 87, 94,193,226,204,121,111,121,226, 49, 46,159, 63, 75,175, 55, 71, 59,142, 88,152,159, 99,174,211, 65, 41,197, 66, 40,152, 42,
+143,215, 38, 21,137, 58,206,217,115, 31,231,228, 35, 31,226,214,107, 95, 64,235,109,162, 25,158, 83,218,136, 43,239,248,187,132,
+143, 15, 96,109, 27, 86, 39,216,102, 64,176, 18,208,170, 66,146, 78,200, 96,120,139,123, 55,158,225,206, 43,175,226,237,159,231,
+242,229, 57,174,189,252, 42,186,158,162,203, 49,186,158, 80,102, 3,138,241, 22, 74, 37,172,156,120, 61,197,120,135,251, 87, 95,
+225,240,168,192,122, 22, 33,134,196,151, 2,164,170, 89,125,252, 73,206, 62,253, 30,198, 7,125,110,253,233,231,249,246, 95,252,
+ 38, 7, 91, 47,240, 7,191,255, 25, 46, 95,185,252,240, 20,238,251,254,140,168, 6,103,207,158,101, 48, 24, 0,240, 39,127,242,
+ 39,108,108,108,240,228,147, 79,226, 12, 95, 41,173, 78,151,149,197, 69,254,240,223,253, 59, 26,109,184,242,150, 95, 34, 12, 23,
+ 89, 57,241, 4,126,147, 32, 7, 57, 38,214, 28,110, 94,101,247,214, 95, 51,218,188, 77, 62, 57, 32,180, 57,181, 30,225, 5,115,
+ 51,169,173, 4, 83, 83,235,156, 50, 27,144, 79,247,232,223,219,226,204,185, 99,140,210,140,201, 81,159,164,211,230,252,133,211,
+ 28,187,240, 62, 54,222,176, 70, 94, 12, 49, 83, 15, 25,204,163,154, 30,115,167, 90, 4,212,204,181, 91, 76,205,144,189,239,189,
+202,194,153, 99,132,209,113,132,104, 17, 68, 49,141, 17,132,139, 21,163, 59,215,152,142, 70,212,117, 77, 16,248, 4, 65,136,231,
+185,123, 62,207, 51,180, 46,220,148, 70,186,174, 8,135,187,150, 78, 26,132,217, 84,172, 65,121, 64,211, 56,222,137, 46, 65, 8,
+ 55,209,244, 3, 60,165,102, 19,101, 55, 97,117, 44,134,134, 48,138, 9,194,144,166,110, 48,141, 33, 8,157, 59,222, 17,232, 52,
+ 88,251,208, 71, 33,132,171,248,149,184,195,155,167, 60, 48, 22, 83, 59,140,157,167, 36, 85, 89, 18, 5,179,123, 60,116,189, 28,
+101, 89, 18, 5, 17, 81,236,106,188,235, 74,227,251,129, 35,125, 54, 13, 81, 20, 0,179,145, 63,194,149,110,205,254,189,170, 43,
+119, 0,172, 93,207,137,123,246,251,120,106,150, 91,247, 67, 87,146, 38, 28,154, 93,107,141, 20,224, 40,171,194,173, 45, 22, 60,
+ 33, 9,194,128,186,118,241, 62,107,133, 59,124, 96,104,181,218, 15,159,213,106,113,117,245,147,181,174,103,186,151,187,201,226,
+ 56,162,169,140, 3, 97, 88,215,198, 85,228, 25, 90, 87,104,173, 73,252,154, 79,126,104,137,164, 49,124,238,243,223,199,214, 22,
+ 26, 69,170,107,138,188, 38,157,230, 52,121, 3,166,193,247,220,207,205, 38, 5,117,250, 32, 39,104, 56, 60, 28,179,127,127,204,
+225,112,194,110, 63, 99,107,103, 76,109,225,216, 82,151,165, 99,115,116,123, 9,199,214,230,153, 20, 13,253,221, 9,190,117, 37,
+ 43, 85, 94,208, 4, 62,158,196,157,164,125, 15,233, 73, 26,128,198,128, 16, 8, 79, 17, 40,197,116, 58,101, 92,164,212, 69, 73,
+ 39, 12,216, 56,117, 28,206,111,192,214, 24, 54, 39,208,138, 97,169,205,169, 57,120,207, 41,120,207, 5,137, 22,138,155, 71, 56,
+109,185,200,221,164,192, 15, 72,243,212,197,246,106,227, 10, 92,148,219,145,250, 15, 71,140, 46, 39, 88,228,153, 51,118,212, 13,
+250, 1, 34,116,182, 80, 40, 41,103,141, 61, 30, 81, 20,131, 0,173, 43,167,163, 24,103,148, 19, 66, 58, 92,169,214, 8,233, 76,
+ 17,113, 24, 26,152,209,168, 0, 0, 32, 0, 73, 68, 65, 84,130,112, 58,121,213,184,178,150, 44, 77, 41,170,191,233,218,205,138,
+212,189,175,105,144, 82,184,159, 41, 5, 65, 24,144,231, 5,141, 49, 36,173,152,192, 15,241, 60, 31,107,113,211, 7,225,168,112,
+121, 85, 57,150,114,237,118,194, 81, 24,242, 55,197, 50, 46, 67,239,254,191,134,166,114,163,105, 79,214,252, 47, 31, 89, 97,110,
+111, 72,169, 53,189, 32,224,252,217, 85,206,182, 20,226,220, 26,183,190,119, 3,161, 66,166,135, 83, 50, 97,105,202,138,171,219,
+ 19, 2, 12, 77, 18,178,119, 52,193,148, 37, 98, 54,242, 58,125,106, 1,209,248, 40,101,105,164, 36,144,146,133, 86, 68, 92, 55,
+172, 45,196,196,129,207,104,162, 25,104,203,120,144,242, 99,235,134,227,113,205,169,121,143,245,121,197,106, 34, 80,101,202,174,
+154,231,176,246, 41,102,139,211,214,206, 62,203,139,139, 78,239,246,157,174,121,111,103,135,253,131, 35, 6,253, 33,253,241, 8,
+139,123, 0, 87, 51,175, 68,109, 12,149,174,216,239, 15,216,220,221, 35,203,115,198,147, 41,133,214, 88, 99, 88, 94, 92, 96,101,
+105,129, 40,112, 55, 82, 57,251, 46,178,220,229,103,227, 40,160,219,110, 83,228, 5,135,131, 33,190,239, 19, 6, 1, 2, 92, 5,
+170,144,204,119, 90, 28,246, 7,140,211, 12,132,228,220,201, 13, 14,251, 67,110,111,110, 57,167, 43,150, 56, 8, 88, 63,182,194,
+252, 92,111,246,223, 78,220, 74, 14, 32, 36,199,143, 45,115, 98,125,141,185, 78,151,225,120, 76, 81,186,216,142, 67,215, 42,134,
+227, 49,165,214,140,211, 12, 33, 44,237, 56,166,172,106,138,178, 36, 8,125,162, 32,164,215,237, 18, 5, 62, 89,145,115,127,127,
+159,201, 52,229,216,242, 34,127,247,103,126,130, 44,203,249,246,247, 94,228,214,221, 77,150,151, 22, 88, 94,152,103,190, 55, 71,
+ 83, 27,122,237, 22,203,139,243, 68, 65,136,177,198, 29, 12,140,157,193, 55, 64, 74,197, 52, 77, 41, 42,253,176, 70,182, 59,215,
+225, 91,207,191,192,214,238,254,195,145,244,218,202, 18,221, 86,155, 36,137, 57,117, 98,131,181,149, 21,186,157, 22,129, 31,176,
+224,215,236, 54,146,155,163, 9,231, 46,125,136, 55,190,225, 73, 46,253,244, 42, 27,139,159,224,234,119,191,194,225,214,203, 52,
+ 70,112,233, 7,254, 83, 22,158,110, 97,170, 93,199,167,176,146, 32,233,210,233,157, 35,219, 46,105, 50,197,120,180, 75, 89, 14,
+ 41,235, 9,251,219, 47,144,143, 79,145,151,135,140, 14,110,160,203, 41,117,153,146,141,119,152, 12,238, 32,253,136,166, 25, 59,
+ 83, 97,182, 67,149, 31,178,123,243,107,164,237,155, 72, 99,136,230,219,172,174, 62,129,127,111, 25,244, 35,220,125,233, 47,217,
+188,246, 69,124, 41,249,221, 79,125,138, 32,112, 72,232,143,126,244,163, 92,187,230, 12,155,151, 46, 93,226, 59,223,249, 14,191,
+241, 27,191,241,112,115,246,165, 47,125,137, 95,254,229, 95,166,170, 42, 6,131, 1,195,225,144,133,222, 28,183,183,251,232,238,
+ 59,105,183, 59, 76, 71,219,140,167, 91, 28,110,223,100,220,191, 79,177,189, 71,127,239, 38,147,187,219,148,147,125,140,206,201,
+116, 78,123,254, 36, 65,178,140,109, 74,144,110,194, 39,132,166,204, 71,232,108,143,114, 58,164, 46,125,174,188,241, 18,163,241,
+132, 74, 9,142,175,175,224, 7, 27,136, 78,139,160, 25,146,251,160,138, 46, 97,251, 56,202, 44,209, 57, 86, 99,167, 41,115,199,
+150, 57,246,200, 89,162, 56, 32, 27, 41,194,112, 17, 37, 99,132, 31,224,117, 83,188, 42,165,232, 31, 56,142,199, 36,163,172, 10,
+172, 49, 52,214,245, 81,232,178, 34, 12, 92, 81,139,167, 92,101,117, 16,184, 73,100,211, 52,148, 69, 49,243, 21, 57,205, 89, 8,
+ 1, 98,182,104, 25, 75,165, 93,118, 29, 28, 64,203, 69,168,221, 40, 90, 41,229,186, 27,148, 43, 64, 18, 72, 60,207,245,148,171,
+ 25,216,203,152,154, 86,146, 96,165,116,148, 59,227, 12,124,229,172, 49, 13,107,103, 30, 39,167,211,107,173, 49,214,149,124, 53,
+ 77,253,240,125,155,166,161,221,233,224,121,138, 52,205,168, 26, 59,251, 59, 75,130, 96,102,136, 51,194,249, 7, 66,133, 47, 3,
+231,124, 15, 92, 29,172, 51,235, 57,204,243,131,207,212, 84,110,212,175,148, 66, 73,133,176, 22,221, 84, 32,133,243, 26, 52,134,
+166,214, 46, 81, 98,220, 36,215,117,167, 4,248,190,235, 95,209, 90,211,212, 13,141, 49,168,229,181,181, 79, 38,237,132, 56,138,
+ 9,130,144, 32,112, 59,140,188, 44,200,139, 2, 97,221,197,161,188,192,145,208, 4,124,232,177,132,247, 62,182,192,214, 51,183,
+248,246,205, 67,176, 2, 33, 26, 86,219, 1,237, 0, 90,157,152, 36, 14, 89, 90,155,163,159, 87, 12,227,128, 56, 14, 64, 41,194,
+ 78, 66,220,107,161,133,135,242, 61,218,129, 7,181, 69,232,138, 42, 45,217, 57, 76,177, 52, 96,156,206,215,154,143,233, 45,119,
+152, 86, 13,165,113, 95, 88,209,207,169, 50, 77,218,159, 16,134,146,202, 10, 44, 2, 99,107, 60, 95, 97, 43,208,121, 77, 81,214,
+248,161,196, 75,124,228,204,233, 43,111,110,178,255,210,107,236,108,237,176, 32,187,200,141,211, 16,118, 97,109,133,246,124,155,
+183, 46,107, 62,112, 9,146, 8,142,198,154,146,104, 86,120,227,216,193, 2, 40,234,146, 90, 87, 76,167,153,107, 21,242, 61, 44,
+174,126,207, 97, 2,243, 89,155,151, 51, 84,180,219, 9, 73,156, 60,108, 99, 11,195, 0, 41, 45, 8, 23,107, 8,130, 0, 79, 66,
+ 16, 38,132,161, 51,147, 56,199,163,161,174, 27,164, 16,228,101,230,204, 37,101, 73, 93, 59, 19,155,239,187, 98, 0,165, 20,129,
+ 10,208,181,235, 10,126,208, 67, 28,206,140, 57,117, 83,131,176, 4, 65,132, 99,126, 59,232, 65, 99,102,220,240, 48,164,152, 25,
+ 0, 91, 73, 7,169,228,195, 81,175,239, 59,189, 71, 8, 75,158,185, 90, 88, 33,221, 73,236,127,120,111,155, 39, 79,182,176, 35,
+ 77,221, 24, 34, 95,177, 74,133,152,139, 17, 97,139, 63,255,220, 43, 44, 31,235,146,143, 50,198,133,139,199,141,116, 67, 35, 64,
+ 52, 13,210,192, 36,117,117,129,166,106, 24, 14, 50,170,172, 36,144,130,178, 21, 82,215, 13,177, 7,158, 4,211,212,108,143, 10,
+142, 38, 5,218, 90,230, 22,187,156,142, 27,246,239, 29, 96, 60,129,175, 75,238,223,159,114,103,164, 57, 50, 1,155, 38,230,254,
+222, 1, 47, 94,189, 69,150,103,196, 81, 64, 20, 6, 88, 1,195,209,152,219,155,247,201,139,130,178,114,189,247,106,102,228,210,
+117, 77, 81,148,164,105,202, 36,205, 41,180,235, 54, 62, 56, 26,176,179,127, 64, 20, 4, 60,126,249, 17, 46,158, 59,141,239,249,
+228, 69,193,238,225,209, 67,237,221, 90,139, 84,146,105,150,177,181,179,203,253,221, 61, 74, 93, 57, 12,164, 5,207, 83,248,158,
+ 98,190,211,225,216,202, 50, 22,203,189,251, 59,172, 44, 46,176,186,188,132,177, 6, 79, 42,186,157, 14, 73, 28, 82, 55,134,254,
+104,236,244, 66, 97, 57, 60, 26, 80, 91,227, 38, 57, 64,174, 53,163,201,132,178, 44,104,197, 17,147,233,212,193, 81,202,146,122,
+246,112,170, 42,231,217,232,117,186, 46, 98,132, 59, 81, 11, 4,237, 56,162,212, 46, 79, 91,215, 53, 95,249,198, 51, 88,224,204,
+137,227,124,226,167, 62,202,227, 87, 46,145, 36, 9,237, 36, 97,123,119,143,235,183,238,144,229,110,212,215, 31,142, 8, 3,231,
+143,217,239, 15,220,103, 20,150, 6,135, 11,101,182,208,143, 70, 99,238,222,223,230,115, 95,254, 26, 95,250,250, 55,185,183,179,
+203, 96, 86,141,219,155,235,242,248,229, 71, 88, 91, 93,225,196,250, 26, 77, 93,179,189,191,207,214,206, 62, 66,192,122, 18,240,
+141,163,140, 65,158, 35,170,101,238,220, 30,241,242,215, 94, 99,243,218,183,240,147,121, 44,138,249,213, 11, 44,189,227, 28,197,
+100, 11, 35, 20,214, 86,156,184,252, 14,206, 55, 79,145, 28, 38,236,220, 25, 48, 28, 28,146,231, 57,217,180,143, 78,143,200,179,
+125, 70,253,187,255, 47, 89,111, 26, 44,233,117,159,247,253,206, 57,239,222,219,221,215,217,103, 48,152,193, 50, 0, 1, 8, 32,
+ 8,130, 27, 36, 74, 20, 37, 81,164, 41,198,138,100, 41,145, 25,149, 75, 86, 89,118,236,170, 40,169, 44, 76,170, 98, 85,202,249,
+ 16,167, 82,254,160, 36, 21,187, 98,149,101, 71,148,236, 72,148,184,239, 43, 8,144, 0,102, 0, 12,102,189,115,239,157,219,119,
+235,190,189,188,111,191,251, 57,249,112,250,142,168, 74, 87, 77, 77, 1, 31,230,206,116,247,123,206,127,121,158,223, 67,153,231,
+ 28,110,127,159,241,225,219, 12,246,222, 32, 75, 14,169, 69,135,206,252,121,242,120,135, 60,222, 37, 79,122,140,135,155, 76,250,
+ 93,130, 69,159,248,240, 46,157,249,147, 84,215, 67, 70, 73,137,164, 65,154, 76,216,185,249,101, 46, 93,126,148, 79,127,250, 63,
+165,174,109, 28,241,167, 63,253,105,142, 89, 7,135,135,135,252,193, 31,252, 1,199,182, 72,176, 98,177, 95,252,197, 95,196,247,
+125,142,142,142, 24,143,199, 12,142, 6,180, 35,197, 55,127,112, 19, 93, 13, 72, 70,219, 36,195, 45, 38,195, 91,140, 14,110, 18,
+ 31,110,144,246, 70,104, 45,113,253, 22,203, 23,222,207,226,169,167, 88,123,248,227,204, 45, 63, 78,150,236, 81, 22, 99,164,212,
+152, 90,163,235, 10, 97,106, 28, 63, 66,139, 54,142,154, 99,233,116,147,126,156, 48, 42, 75,134,147, 46,253,171, 99,202,244, 62,
+237,217, 22,249,168, 65,216, 56,129,169,231, 41,107,143,176, 53, 64, 73,193,242,147,239, 34,171, 18, 38,101, 2,233, 44, 66,182,
+173,187,102, 92,224,207,230, 12, 54,238, 76, 97, 74,102,218,133, 42,124,207, 67, 74,137, 13, 32,177,130,183,188,176,106,120, 41,
+132,229, 71, 96,208, 70, 16, 69,225, 3,225,152,235, 90,168, 87,165, 43, 91, 4, 8, 11, 92,145,202,102,173, 43,199, 42,236, 29,
+ 71,145,231, 25, 74, 89,162,163,114, 28,210,212,198,187, 42, 37,241, 93,123,233, 35, 4,198, 64, 94,100, 96,236,185, 22, 6,193,
+116, 90, 36, 16, 66,210, 8, 35, 92,207,179,123,245,233, 89, 31,248, 1,142,107, 19,208,180,182,150, 99, 41, 1, 20,158,239,226,
+187, 14,181,169, 40,138,154,188,200,237,228, 44,152,138, 67,133,180,231,184, 84, 8, 45,112, 61, 7,215,119,241,124, 43, 24,151,
+142,178,247, 21, 53, 97, 20, 61, 40,102,140,182,172, 16, 41,166,225, 50,142, 5, 73, 25, 99, 59,121,140, 5,209, 32,133,213, 2,
+ 96,211, 50,165,227,160,117,109,125,234,147, 73,138,106, 57, 8, 35, 72,198, 9, 94,224, 81,215, 53, 81, 35, 34,205, 82, 28, 41,
+113, 93, 59, 74,105, 70, 1, 31,125,178, 9,187, 19,190,244,242,109, 60,227, 50, 19,194,185, 51, 11, 76,106,197,221, 44, 39,147,
+146, 70,109, 24, 29, 76, 88,154,235,112,121,173,141, 41, 13,165, 20,180, 3, 75,189,217, 27,229,228,147, 2,215,145, 36,163,132,
+ 58,242,105, 74,104, 73, 24,244, 38, 28,237, 38, 40, 71,209,158,241, 17,174,207,233,115, 43, 40, 95, 81,150, 5, 55,175,117,169,
+227, 28,199, 19,244,118,198,132, 11, 21, 66,121, 52, 34, 73, 81,129,227, 59, 84, 85,141, 18, 22, 70, 83, 85, 22,149,138,209,108,
+221,186, 67, 54,153,208,153,155, 67, 46,204,160,203, 26,243,246, 30,234,204, 41,204,229,199,160,125,157,133,123,183,249,173,103,
+125,126,227,169, 6,223,189, 91,242,135,223, 19,220,239,107,134,113, 76, 85,150, 15,170,108,129, 29,143,244,122,125,148,227,160,
+171, 18, 91, 94, 88, 92,108, 24,248, 72,229, 32,177, 94, 73, 36,160,141, 29, 79, 42,152, 76, 18, 28,215,238,174, 28,215,163, 44,
+ 52,210, 83,140,147, 4,215, 81,132, 65,136, 86,160, 1, 33,108, 5,215,104,216,208, 3, 59,213, 55, 68, 81,131, 58, 47,153,148,
+233, 84, 53, 47,112, 2, 31,169, 13,195, 41, 20,196, 81, 10,103, 10,111,200,178,148, 44,213, 4, 65,132,223,182,249,233, 2,104,
+ 54,155, 36,113,140,214,182, 16, 1, 91, 17,142,226,120, 42, 46, 41, 9, 67, 31,109, 32,153, 76,248,224,165, 6, 31,190,210,196,
+140,107,136, 34, 66, 81,240,217, 63,252, 34,191,252,137,103,105,173,173,115,237, 91,215, 9, 77, 69, 60, 74,233,116, 66,122,117,
+ 73, 93, 27, 78, 46,132,120, 74,112, 56, 42,153, 20, 37,190,107, 88,241, 20,194, 11,233, 13, 6,180, 67, 23,213,112,208, 70, 18,
+180,219,148,227, 24,215, 21, 28, 72,143,104,109,134,211,115, 29,112, 36, 66, 42, 94,126,103,147, 79, 61,229,243,206,189, 30, 63,
+216,179,227,169,219, 67,195,155, 91,119, 25,156,239, 48, 19,218, 4, 49, 37, 32,158,100, 28, 13,198,140,198, 19,146, 52,101,182,
+211, 33,207,114,146, 52, 37, 10, 2,178,188, 64,136,132,108,250, 96, 10, 64,107, 77,171,213,100,103,247,128,120, 50,225,242, 67,
+231,121,226,242,195,156, 62,177, 78,146,166, 96,236,148,227,244,234, 42,183, 54, 55, 57,236, 13,240, 93, 69, 20, 88,166,115, 85,
+ 91,139,156,205, 9,208,244,142,142, 24, 39, 9,163,113,140, 82, 14,231, 79,159,100,109,121,133,102, 35, 98,117,121,145, 44,203,
+185,191,187,203, 96, 28,219, 93,119,105, 5,122,235,171,203, 20, 69,193,193,209,144,108,186,163, 7, 43,144, 44,138,130,162,176,
+ 2,190,192, 15, 8,131,192,118, 0, 85,133, 18,130,249,217, 89, 38, 89,138,209,246, 2, 57, 62,228,243, 12,148, 16, 76,210,140,
+165,197, 5, 6,195, 17, 95,249,206, 15,208, 6, 92,101,159,209,175,127,247,251,116, 58, 29,222,188,254, 14,155, 59, 93,250,131,
+ 17,131,209,136,254,112,100,137,132,202,101, 56, 78,184,250,206, 77, 58,237, 38,171,243, 11, 60,114,249, 34,151,207,157,102,105,
+126, 1,223,119, 41,117,205, 40,153,144,231, 37,151,206,159,227, 43,223,249, 30, 27,219,127,189, 91,246,125,159,229,197, 69,102,
+103, 58, 52, 66,159,163,209,152,237,157, 93, 54,119,118, 9, 60,143,250,210,105,186,121,141,200, 43,134,249, 22,121,113, 72, 89,
+164,100,131,251, 84,197, 24, 45, 10,102,214,223, 77, 62, 57,192, 15, 34,208,134,165,213,199,120,247,217,139, 92, 89, 78,249, 15,
+255, 38,100,220,235,146,140, 15, 64,121, 20,147, 9,121, 62, 33, 27, 15,209,161,193,115, 86,104,206, 93, 32,155, 12, 8,231, 47,
+242,208, 35,191,193,175,255,246,167,168,133,230,223,253,203, 63,227,181,175,125,134,178, 58,226,210, 51,255,132,143,252,254,239,
+113,115,252, 13,174,253,217,255,201,225,246, 30,209, 80,162,117,132,215,200, 57,218,123, 21,128,139, 23,207, 51, 28,142, 57, 78,
+144, 60, 38,112, 2, 28, 11,230,128,191,177,111,247, 60,143,110,183, 75,146, 36,244,122, 61,235,203,174, 43,100,177, 69, 50,208,
+212,249, 17,249,164,135,231, 84,120,158,195, 68, 91, 30, 70, 81, 38, 44,159,124,146,149,179, 47,177,119,255,107, 12,118, 94,198,
+107,172,161,194, 89, 84, 58,192, 80,130,168, 16,142,135,227, 70,184,209, 42, 11, 39,159,193,241,206,176,122,186,203,189,173,109,
+242,209,132, 18,141, 95,230,108,124,239, 13,214, 95,124, 28, 47,104, 81,212, 49, 66, 53, 72, 14,125, 68,190,132, 59,123, 31,243,
+218, 18,171, 79,190, 7,101,190,199,225,155,150, 3,224,169, 22,121,218,199, 91,154,165,209,106, 19, 86, 86,184,165,148, 75,158,
+167, 20, 21,228,105, 58,189, 68, 35,234,170, 98,156,196,248, 78, 77,166, 43, 75,171,116,220,169,103, 28, 52, 26,148, 21, 73,151,
+149,141,242,118,188, 0, 87, 8,194, 70, 99,138, 41,175,241,253, 6, 18,195,104, 52, 38, 8, 3,164,176,186,168, 48, 12,241,253,
+ 0, 41, 5, 70, 67, 60, 25, 91, 47,184,231,146,231, 25,186,210,104,169,113,180, 3, 24,219, 16, 57, 86, 96,156, 36, 99,219,176,
+ 8, 65, 48, 77,236,172,116,141,146, 14,129,231, 99,124, 97, 19,215,164, 67,145,167, 40,207, 7,108,163,233,251, 10,107, 53, 75,
+ 45, 66,184, 46, 65, 58,120,222, 52, 66, 88, 8,242,220,134,167,213,166, 68, 27,235,155,215,181, 1, 36, 69,154, 35, 92, 73, 81,
+ 90,136,152, 31, 6,164,137,141, 26,111,132, 17,134, 26,207, 11,240, 93, 43,188, 46,138, 12, 5,100, 85, 65,153, 91,171,180, 5,
+194, 41,156, 48,138, 80,142, 34, 73, 82, 76,101,149,181,158, 12,104,181, 90, 54,192, 3, 65,109, 64, 84,246, 80,158,137, 60,214,
+231, 35,126,244,213,215, 89,137,124, 86,215,231, 8, 91, 17, 27,123, 9,119,146, 9,107,115, 45,222,119,105, 5,215, 81,140,227,
+ 4,223,115, 73, 38, 41,133,208, 28,198,134,253,113,201, 76, 0, 70, 72,102,218, 30, 46,146, 19, 75, 13, 92, 37, 41,107, 67,158,
+ 27, 14,218, 99,210, 52,229,104,152, 65, 92, 80, 22, 49,221,110,159, 51,171, 45,188,118,192,227,239, 58,193,238,246, 17,135,119,
+251,184, 66,147, 29,165, 52, 23, 93,142,186, 49, 50,148,104,161,136, 2,159, 70, 43, 64, 83, 67,101, 31,166,225,225, 17,131, 73,
+ 78, 93,212,152,120,194,194,246, 14,254, 36, 39,205, 19,228,173, 27,228,175,188,198,222,254, 1,103, 79,205,226, 62,255, 16,206,
+ 36,225,125,245, 38,207,157,158,225,218, 78,206, 95, 92, 83,252,229,235,125, 10,227, 82, 78,223,108,233, 42,226,241,152, 34,207,
+192, 24,148, 84,180, 90,129, 21, 94, 57, 10, 41, 20, 6,240,141, 99, 87, 15,213, 49, 56,166,196,113, 92,180,182, 68, 35,131,198,
+ 11,124,202,170,176,227,170,210,218, 10,125,223,231,216,114,232, 52, 35,178, 44,179,149,165, 18,152, 90,163, 12, 24, 71,226,212,
+210,106, 33, 92, 23, 83, 27, 38,211,125,249,113, 86,189,204, 50,194, 70, 68,165, 53,237,102,147, 52,203, 8,188, 8, 95,218,174,
+210,243, 60, 90,205, 38, 89,158,227,251, 33, 45,215, 35,205, 83,204,212,114, 34,165, 36,141,107,106, 12, 15, 45, 9,126,255,165,
+ 22, 78, 38,192,119,160, 72, 24,119,123,152, 12,154,202, 65,100,134,187, 91, 7,180, 27, 62,227,222,152,229,149, 54,243, 99, 69,
+222, 9, 9,128, 44, 45,249,196,207, 61,199,253,123,123,188,246,214, 13,158,121,248, 20,107,255,248,191,132,254, 14, 27,255,250,
+143,217,216,216,224,222, 36,101,238,116,139,100, 28, 83,104,197,176, 86,228,247, 14, 89, 59,216, 98,206, 41, 25,142, 75,214,141,
+ 64,159, 92,225,143,126, 28, 51,123,110,157,192,149, 60, 27,236,115,226,254, 30,127,154,167, 4, 51, 77, 26,129,181, 8, 14,134,
+ 67, 70, 73, 66,173, 53,158,239,210, 12,237,212, 2, 96,115,103,135,181,229, 37, 43,104,113,109,103, 33,149,196,117, 61,154, 81,
+104, 47,167,178,228,157,219,119, 25,140, 70, 60,218, 63, 98,105,113, 30, 41,108,225,118,204, 10,152,237,180, 56,232, 29, 17,165,
+ 19,194,208, 39,242, 3,124,223, 69,199,246,231, 72, 1,117, 93,147,229, 5,187,251, 7,220,190,183, 5, 2,171,212, 21,130,178,
+170,152,237,116, 8,195,144,173,157, 46, 70, 8, 27, 78, 51, 63,103,197, 99, 97, 72,224,123,127,227, 98, 7, 91,124,173, 47, 45,
+177,190,186,194,226,194, 12, 85, 81, 49, 24,199, 12, 71, 99,146, 73,202,252,204, 28,135,253, 62,221,253, 3,188, 32,160,153, 5,
+132, 81,132,231,251, 76, 50,139,194, 29, 39,127, 29,155, 90,214,182, 91,190,183,179, 71,216,235, 51, 78, 38, 96,108,102,244, 49,
+244,198, 81,146,113,146, 48, 78, 18, 14,143,250,156, 92, 93,102, 48,138,217,222, 63, 96,107,167,203, 99, 15, 93,160,211,105, 49,
+142, 19,118,186,187,220,220,184,199,237,173,251, 28,244,143, 30,252,156, 48, 12, 57,127,114,157,147,171,171, 4,129,199,237,123,
+ 91,124,225,155,223,101,247,224,128,186,212,156, 61,181,198,130,171, 89,121,254,253, 76,202, 13,146,123, 91, 20,185, 75, 58, 25,
+144,167, 67, 76, 21,115,180,127,151,249,149,135,208,131,132, 76,184, 52,102, 91,228,111,214,124,245, 14,124,219, 13,248,241,203,
+159,165,223,253, 38,179, 11, 15, 51,183,116, 25,137,194, 17, 30,114, 73,144, 31,140,240, 26, 29,162,112,141,143,255,206,151,120,
+232, 83,146, 70,195,240,119, 91,134,215, 72,217,221,255, 56,173,198, 42,243,115, 39,121,247, 7, 79,176,115, 4,147, 87, 44,104,
+166,186,254, 38, 78, 59, 37,175,109, 26, 96, 26,219, 28,249, 26,232,118,187,180, 90, 45, 90,173, 22, 65, 16, 60,152,122,253,228,
+ 69,126,252, 18, 66, 48, 24, 12,200,178,140,193, 96,192,112, 56,164,223,239,115,184,219,101,113, 49,226,242, 47,252, 43,238,188,
+242,191,176,241,189,127, 65,166, 13,105,230, 83,202, 18,225, 43,170,193,128, 81,255, 30,242,246,215,200,235, 62, 90, 37,140,251,
+ 93,180,153,224, 6,179, 72,225, 82,155, 28, 71, 66, 56,115,154,149,211, 31,228,131, 31,252, 40,237, 14,220,188,215,231,225, 71,
+182,121,229, 91, 47, 19,132, 17, 23,158, 56, 75,107,254,113,134,174, 3,193, 1,122,191,133,241, 20,210,117, 24, 15,106, 58,110,
+ 66, 60,217,163,247,149, 69, 68,148, 80,215, 7,160,207,129, 22, 40,111,158,164,216,161,125,242, 4,189,155, 55,240,131,128,241,
+120, 8, 72,178, 73, 6, 72,234,218,160,117, 49, 61,239, 4,195,241, 16,199,113,153,153,181,151,103, 51,138, 0,155,173, 94,151,
+ 53, 90, 10, 28, 71,226, 7, 1, 2, 43, 40,174,178,154, 48,244,173, 93,179, 54,104, 41,192,128,169, 13,113, 26,219, 80,171,169,
+ 0,185,170,172,224,213,104,131, 81, 80,215, 21, 94, 16,112,108,209,174,107,195,120, 26,168,164,149, 75,216, 8,167,232, 86, 75,
+229,204, 50,141,156,238,220,181,227,216,179, 85, 8,132, 84,140, 70, 35,187, 62,168,107,170, 90,211,104, 54,241, 60, 7,155,163,
+ 94,146,166, 25,190,231, 32, 28,166, 83,138, 10,203,107,208, 54, 29,211, 88,189, 84, 81, 79,139, 0,173,113, 92, 23, 42,208, 85,
+ 69, 73, 14,194,134,222, 84,117,197,100, 42,120, 21, 34,199,117, 61,180, 99, 35,186, 71,163, 49, 74,185, 68,141, 6, 85,109,115,
+ 8,202,162,192, 81,210,114,221, 35,223,167,114, 28, 91, 93,229, 57,198,181, 88,204, 40,138,108,231, 38,236, 23,112,174,225,208,
+172, 75,174,223,216,231,244,202, 12,131, 74,243,246,246,152, 76, 73, 94,120,242, 36, 11,179,109, 94,191,118,135, 72, 27, 22,151,
+102, 25, 85,138, 63,191, 89,243,173,237,146,193,196,144,103, 54, 28, 67, 42, 75, 60,171,116, 65,168, 71,184, 10,222,123, 97,150,
+185,150,207,211,115,109,150, 59,109,206,158, 50,108,238, 15,209,121,193,248, 40,101,171,159,160,246, 71,236,251, 62,139, 39,103,
+ 89,185,124,130,254,253, 67,234,172, 96,178, 59, 68,181, 2,116,156,163, 35,123, 17, 86,177,134, 10,162,134, 71, 89,212,108,238,
+107, 92,105, 71,143, 71,113,202,214,157,123,204,246,250,148, 74, 18,133, 33,189,195, 67,146,225,128,131, 97,147,181,249,139,232,
+115,143,195, 67,119,241,186, 47,243,244,236, 1, 79,159,153,240,119, 95,104,243,185,171, 19,254,236,181, 17, 7,163, 12,167,246,
+137,154, 77,164,214, 36, 83, 48, 79,224,135, 72,199, 33,203, 50,130, 32, 96, 52,178, 17,147,158,231,208,104, 54,145, 66, 33, 28,
+107,133,144, 50,160,172, 10, 27,217,170, 44,157, 72, 34,113, 29,119, 42,184,171, 31,236,220,227,113,108, 43,222, 40,178,233, 80,
+202, 70, 15, 42,161,240,219,109, 52,134, 60,205, 30,132,238, 72,101, 63, 91,235,179,183,163, 56, 83,215,212,181,161, 17, 69,118,
+ 20, 86,215, 4, 97,104,255,238,128,231, 56, 36,241,152, 32, 12, 81, 82, 17, 68, 1,121,105,113,178, 89, 89,178, 58,227,242,207,
+ 62,185,200,140,239, 98, 74, 3,162,134,102, 72,228,123,168, 0, 68,171,137,206, 75,134, 53, 52,165, 34, 75,115,220, 65, 74,212,
+105,176, 30,185, 92,249,240, 35,208, 8, 48, 23,207,211,222,137,217,248,131, 13, 2, 71, 65,235, 3,208,130,179,255,249,195,132,
+255,219, 63,229,230,171,239,208,221, 62, 98,198, 8,140, 35, 89, 31,236,241,124, 43,231,214, 94,202,155,147,146,131,113, 69, 86,
+105,158, 56,217,228, 35,171, 6,143, 93, 68,173, 40,218, 30, 31,123,238,113,146, 31,192,203,230,175,167, 39, 8,137,169, 43,124,
+207,103,174,211, 97,128, 77, 86,131,140,170,180,254, 85,207,181,123, 80, 12, 96,236,126,125,107,167,203,126,175, 79, 24,132,180,
+154, 13, 86,167, 28,243,225, 48,166, 44, 75,198, 19, 27, 17, 92, 27, 8, 92, 91,153, 15,227, 4,144, 52, 91, 13, 22,231,231,201,
+178,140,225, 56, 65, 42,135,197,217, 89,252,169,127,123, 48, 26,115,106,125,157,115,167, 79, 16,120, 46, 69, 89, 82,105, 77, 94,
+ 20, 52,163,136, 97,124, 64, 93,213,108,238,236,242,240,185,211,156, 59,115,138,185,185, 89,126,124,245, 45,142,134,195, 7, 23,
+ 67, 93,215,100, 69,129, 16, 32,106,235, 74, 88,244, 92, 90,141,144,157,189, 67, 64, 35, 37, 28, 28, 14,184,191,211,101,105, 97,
+129, 90, 27, 92,101, 39,112,244, 7,244,142, 6,108,108,109, 63,248, 51,171, 90,243,253, 31,189,134,227, 72,180,182, 72,217, 70,
+ 16, 34,165,156, 94,234, 14,141,200,230, 55, 39,147,148,219,155,247,121,228,194, 57,146, 36,230,251,175,190,198,238,222, 62,103,
+ 78,158, 96, 20, 79,184,122,227, 6,215,174,223, 36, 77, 83,126,242,229, 57, 14, 43,203, 75,196,147, 9,174,163,120,248,220, 89,
+ 22,230,231,120,231,214,109, 94,121,227, 45, 26,158,199,209,234, 9,212,233,247, 35,126,108,152,228, 95,165, 30, 71, 76,226, 62,
+186,202, 41,178, 1, 82,130,227,185,228,241,136,186,168,201, 15,119,169,117,194,254,193,159,147,141,187,148,233,158,237,154,132,
+ 34,203,198,100,217, 30,130, 18,109, 98,116, 5, 71,197, 61,206,158,253, 4,239,251,117,232,191,110,216,236,194, 63,124,201,224,
+153,136,157, 31,221,226,228,197,231,217,186,243, 53,238,236,172, 35,223, 43,208,223,138,104, 59,151,184,123,237,243,248,167, 5,
+158, 55,195,184,158,112,172, 95,220,222,220,162,219,237,210,239,247, 57,127,254, 60, 47,189,244, 18,159,251,220,231, 30,252,155,
+143,187,245,227,223, 47, 95,190, 76, 81, 20,116,187, 93, 70,163, 17,123,123,123, 36, 73, 66,119,167,203,120,184, 67,118,255,109,
+ 6, 59,175,147,166, 41,235,103,126,137,199,222,255, 15,248,230,255,251,155,100,131, 17, 31,253,173,127,203,107,111,252, 79, 28,
+190,245,125,106,157, 18, 52,230,112, 76, 70,133,100,102,249, 9,162,206, 9,202,100, 64, 26,111,161,132,131, 31,118,168, 26,112,
+233,103,161,249,131, 57,190,255,253, 39, 88, 88,190,197, 81, 47,230,246,253, 29,158,121,246, 25, 90,171,235,220,126,235, 42,123,
+ 59, 7, 20, 90, 33,235,144,186, 44, 56,186,237, 19, 46,127,135,253,171, 10, 25,190,133,107, 22,104,206, 62, 67, 93, 84,104, 35,
+168,119, 26, 4,157, 69,202,234, 45,164, 35,240, 28, 43,254, 82, 66,226, 56,182,240,205,210, 12,141,166, 42,109,243,104,140, 61,
+143, 70, 73,130, 80,130,118,179, 77, 24,134, 16, 50,157,114,164, 40, 57, 21,234,106,112,124, 11,152, 65, 67, 18,143,113, 92, 69,
+ 16, 88,252,171,214, 26,229, 42,202, 50,199, 15, 45, 38,187,172,172,211,167,170,114,180, 86,152,194, 22,223,150, 75,239, 32,165,
+ 93, 53, 23,133,181,225,153, 41,250,213,117,173, 5, 20, 33,168,140,198,100, 57, 96,208, 74,225, 56,246,162, 55,166,182,211, 48,
+169,166,130, 61, 31,223, 23,148,121, 65, 16,184,148,133, 61,183,209, 9,157, 78,203,238,188,107,131, 23,184, 20, 89,137,148, 22,
+237,141, 54, 8,229, 82,215, 86, 88, 29, 52, 27, 80, 85,212, 83, 65,173,214,214,137,213,104, 52,112, 28,133, 64,144,167, 41, 81,
+ 20, 0,150, 61, 82,151, 37,186, 54, 76,138, 17, 74, 56,168,229,245,245,207, 76,210,220, 10,125,170,138,186,214, 86, 29,157, 91,
+232, 72, 93,215, 8, 37,201,211,148, 36,142,121,239, 5,143, 43, 58,102,123,107,128,240, 29,110,198, 53,107,235, 51,124,236,189,
+151,216,220,233,243,197, 47,253,144, 23,159, 58,199,153,135,207,112,123,172,249,253, 47, 29,241,214,161,166,212,118,119,235, 5,
+ 1, 72, 65, 35,136,192, 24,198,163, 49,227,172,100, 82,193, 94, 21,242,246,126,197,183,118, 21,223,222,133,151,247, 12,165,112,
+ 88, 91,106,113,229,124, 27,207,143, 72,180, 64, 43,193,209,222,144,170,174, 9, 26, 33, 11,167,230,145,129, 75,220, 29, 32,181,
+134, 92, 35, 93,137,227, 9,138,162,166,174, 52, 2,141, 31, 74,130,192,167,170, 12,210,245,169,138,156, 50, 25, 51, 25,197, 68,
+157, 54,107, 63,245, 36, 71,247,182, 48,101,197,236, 35,231, 16,141, 14,212, 9, 98, 80, 96, 80,136,245, 25,218,202,240,204,170,
+228,111, 61,217,224,201,211, 13,210, 82,178, 63,177, 59,143, 90,107,102,102,218, 72,199,153,238, 50,203,169, 72,206, 10,130,220,
+ 32,180,149,162,132,162, 44, 48,102,186,239,102,250,223,218,216,157,142,167,108,133,104, 52,198, 8, 92,199,238,206,131, 32,152,
+250,218,107, 42, 93, 19,248, 1, 2,133,242, 20,142,242, 16,104,226,113, 12,198, 16, 53,155,132, 65,136,227,185,182, 40, 51, 86,
+252,102,187,254, 2,215,115,145,210,194,108,170,233, 14,222, 17, 54, 3,190, 40,173,104, 3, 3,101,109,253,241,202,117,185,184,
+ 18,240, 63,127,114,150,245,200, 69,151, 6,124, 15,145, 85, 24, 35,168,239,222,229,222,230, 33,103, 78,206,227, 62,116,154,123,
+111,222,103,101,185,137,114, 61,118,122, 9, 79, 62,180,200,197,159,189, 4,169,230,230,183,110, 51,247,240, 9,196,242, 44, 23,
+159,127,142,236,198, 38,193,179,239, 67,168, 54,140,191, 74,203,196, 52,235,146,197, 78,139,106, 52,166, 87, 73, 30, 46, 15,121,
+171,155,112,237,238,136,205,163,138,111,236, 86,188,222,211, 52, 71, 35, 92,161,249,214,198,132,222, 56, 39,170, 83,178,209, 8,
+199,241,120,181,106, 35,180, 65, 72, 5, 24,170, 90,227,121, 46,142,227,178,123,112,192, 36,181, 35,110,131,181,156,181,155, 13,
+ 90,141,198,116, 95,231, 19,249, 62,101, 93,211,157, 38,138,133,129,181, 2,214,181,125,255,247, 15,251,108,222,239,146, 21, 57,
+117, 81,216, 52,195,170, 70, 57, 46,142,231, 66,109,201,106, 6,193,112,108, 19,214, 38, 89,198,202,226, 34, 39, 87,151,167,144,
+ 22, 69,187,217, 36, 8,124, 28, 37, 17, 8, 22,167,152,217,133,185, 14,219,187,251,132,158, 75, 24,250,244, 7, 35, 70,163, 49,
+221,253,125,126, 50, 12, 69, 74, 73,167,217, 64, 41,135, 81, 28,147,230, 22, 57, 57, 28,143, 73,211,140,163,225,144,195,190, 13,
+ 80,209,198, 16, 5, 1,237,118,147,197,185, 57, 90,205, 6,158,227, 48,219,110,113,239,126,151,100,146,162, 92,135,208,183,147,
+140,170,170,136,179, 9, 69, 81,219,241,168, 49,212, 90,115,172,204, 85, 82, 17,133, 62,174,231,178,188,176,192,139,207, 61,131,
+ 49,154,123,247,187, 12,198, 49,105,154, 50,223,110, 51,140, 99,134, 83, 5,248,241, 43,240,125, 30, 62,119,134,179, 39,215,121,
+227,250,117,254,215,255,235,143,248,250,183,127,192,245, 59, 22,227,235, 40, 7,177,188,134,147, 60,143,170,230,217,185,249, 13,
+124,221, 67,214, 9,165, 72, 72,199,251,180,102, 47,178,124,238, 2,105,190,199,220,169,117,102,231, 79,112,255,213,239,208,112,
+211,233,216, 58, 97,166, 25,146,143,182, 24, 30,188, 69,158, 13, 49,117,193, 68, 13, 81,185,173,223,214, 46,254, 50,167, 95,156,
+229,157,191,128,123, 55, 55, 25,126,233, 22,131,107, 19,210,113,159,209,112,131,254,193,171, 76, 98,151,131,239,237,112,112,239,
+101, 82,255, 46, 94, 75,145,244, 51,162, 21,151,191,243,233,127,193, 56,206,184,251,246,231,201,211,156,199, 31,127,156,170,170,
+ 72,211,148, 43, 87,174,240,229, 47,127,249,255, 87,208, 28,191,126,247,119,127, 23, 99, 12,221,110,151,131,131, 3, 14, 15, 15,
+233,118,187,236,237,238,176,189,185, 77,119,243,171, 12,122,111, 50,179,244, 8,238,236,105,238,190,249,111, 24, 14,110, 16, 69,
+107, 4,209, 25,246,239,252,128,246,204, 89,150, 78, 62, 99,173,150, 90, 18,205,158, 98,118,253, 9,148,113,113, 2, 31,191,177,
+ 72, 89, 12,201,226, 46,189,110, 73,127,120,150,232,195,208,251,209, 58,237,185, 29, 6,195, 3,106, 36,101, 94,227, 12,214, 9,
+ 58,154,209,248, 62,121,236, 97,170,138, 42,207, 40,243,140,168,147, 49,220,124,147,131,187,215,201,147, 17, 11, 39,159, 65, 98,
+ 3,160, 74,157, 33,163, 33,249,254,125,178,180,192,143, 92, 16, 18,199,179,169,107,186,156,198,167,186, 14,158,103, 87,142,237,
+118, 11, 41,108,182, 68, 93,213, 54, 44,165,212, 32, 13, 74, 58,100, 89,142, 82, 18,199, 83,214,233, 52,125,246, 66, 63, 36,108,
+132,212, 83, 95,188,214, 26,131, 61, 99,149, 82, 84, 83, 93,140,227,216, 59,231,248, 30,211, 90, 79, 5,140,154, 98,250,255,234,
+218, 70, 90,107,163, 31, 20,199,141, 40,194,241, 93, 2,207,181,103,121, 94, 16, 70,161,237,250,141, 45,154, 29,207,138, 76,125,
+ 63,196,115, 29,187,235, 23, 80,107,195,113, 84,108,158,102, 24, 93, 83,149, 53, 65, 24,224,121,238,116, 79,238,131,182,118, 98,
+223,183,235,209,102,179,137,235, 42, 2, 47,192,117, 45, 58, 86, 40,129,148, 54,202,219,145,146, 73, 50, 33,207, 83, 52,150, 14,
+ 41,165,162,214,154,108, 42, 66,148, 8,219,228,173,157, 58,253, 25,165, 36, 66,218, 8, 73, 63,240,144,210,181, 42,111,215, 65,
+ 41, 97,199,203, 69,129,214,154, 23, 47, 53,105,141,199,236,238, 13, 49,173, 38,137,208,252,202,251, 31,227,219, 63,190,203, 43,
+ 95,121,133, 95,249,213,151,136,230,102,216, 60,136,249,204, 87, 6,148,194, 67,184,118,244, 44,133,196,117, 28,202,210, 94, 42,
+186,214,100,105,250,224,128,242, 3, 31,229,168,105,133,100, 24, 23,112,243,200,240,185, 55,251,124,109, 91,226, 69, 62,167,151,
+219,156, 91,109, 18,206, 68, 76, 10,193,224,104,200,209,254,152,249,249, 54,173,213, 14,198,177,209,116,249, 48, 67, 23, 26,215,
+147, 56,129, 67,158,215, 40, 5, 80,147,230, 5, 69, 86, 18, 69, 14,218, 21,212, 21, 68,126, 72,235,201,135,144,189, 33,155,183,
+ 55, 57,137, 11,151,206, 35,110,189,205,155,255,207, 23,184,253,230, 38, 75,227, 10,231,217, 71, 49,126, 3,199,119, 56,213,145,
+124,248,178,226,133,115,138,208, 87,196, 25, 76,106,151,170,178,187,206,168, 17,225,185, 14,142,103, 41, 99,121,105,221, 3,181,
+ 49,152,202,138,157,140,177, 93,144, 31,134,184,238,148, 2, 39, 36,149, 54, 24, 97, 80,182,207,196,115, 45,104,161,168,107, 28,
+ 37,166,150, 17, 27,249,233, 40,187, 31,154,196, 49, 66, 74,148,148,248,129,135,169, 44,193, 40, 12, 67, 60,165, 44,198, 80, 57,
+120,174, 75, 94,228,196,113,108,247, 95,142,135,157, 12,106, 28,215,153, 86,149, 26, 33, 37,158,114,144, 2,158, 62, 45,249,175,
+126,174,205,137,200,179,153,244,128,184,181,129,233,116, 16,105, 65,117,253,109,134,185,102,253,242,105,148,113,185,119,255,144,
+221,253, 49,207, 61,185,198, 66,211,227,252, 7, 30, 6, 41,248,241, 55,111,241,234,205, 67,158,252,208,187,160,209, 65,168,130,
+224,145,117,132, 76, 48,233, 91,136,239,255, 37,188,122,141, 57, 39,103,101,109,134, 11,231, 78,114,237,246, 30,106,120,200,247,
+238,166,108,151,146, 63,221,129, 31,165,146, 65,173, 56,219, 16,220,136, 53,135,165,224,135, 91, 21,215,246,107,222,238, 21,236,
+143,114,246,130,101, 43, 28,212,150,128,151,101, 25,203, 11,139,248,174,226,238,116, 20,124,172,192, 46,202,138, 48,240,241,124,
+ 31,207, 85, 56,202,157,162, 26,199, 28, 30, 29, 61, 80,151,102, 69,137,231, 90, 59, 74, 20,248,108,237,238, 97,180, 21, 6, 61,
+241,200, 69, 78,174,173,226,123, 54,204, 36,244, 3,214, 87,150, 80,174,203,214,125,187, 71,182, 22, 21,203,197,182,149,183,100,
+146,165, 86, 72, 84,228,100, 69,201, 78,183,203,237,205,109,210, 52,195,230,154,219,117,142,116, 20,121, 94, 76,247,237,150, 79,
+ 0, 32,140,101, 37, 52,166, 69,130, 49,134,188,178,157, 74, 57,237,254,141,177,168, 91,163, 13, 73,154,226,187, 14, 94,232,211,
+ 10, 34,148, 35,233, 15,135,220,221,218, 33,205,172,106,217,192,212,142, 99, 5, 66, 18,112,166,251,193,192,117, 81,202,225,212,
+250, 42,141, 40,100,105,126,158,153, 86,139, 11,103, 79,241,212, 99,143,240,252, 51, 79, 50,219,238, 48, 30,143, 57, 24, 14,185,
+113,103,131, 94,223,162,154,143, 95,107, 43, 75,188,239,185,167,121,238,201, 39,152,105,218,120,227,113, 50,225,240,168,207,112,
+ 58, 22, 93,152,153,193, 52, 58,100,229, 12,158,187, 72, 69, 72, 58, 57,162,146,109, 12,109,150,214,158,229,244, 99,127,139,170,
+177,133,246, 21, 65, 24,176, 30,253, 42, 59,119,239,113,255,222,143,136,227,156, 44,143, 73, 38,214, 22,218,108,122,144,167,228,
+105,138,142, 83,252,246, 10, 74, 5,204, 45, 60, 66,221, 93, 99,123,231, 6,177, 28, 51, 78,118,137,247,222,162, 50, 19, 14,239,
+189, 66,146,220, 99, 60,186, 71, 26,103,140, 6, 67,210,250,109, 46,127,248,151,241,102,218,196,241,144,149,149, 79,240,230, 15,
+254,152,146,251, 12,143, 70, 44,116, 58,120,190, 79,154, 90,246,249,249,243,231,185,118,237, 26, 54,156,195, 10, 99, 23, 22, 22,
+120,233,165,151,184,116,233, 18,219,219,219,236,237,237,217, 72, 39, 39, 14, 0, 0, 32, 0, 73, 68, 65, 84,203,124,111,143,221,
+189, 61,226,241, 0,209, 60, 73, 69,135,248,224, 30,179,203, 87, 80,202,112,180,245, 93,202, 92,211, 94, 58,193,230, 91,255,158,
+ 52,219,231,169, 15,253,183, 60,247,177,127,200,187,126,250,215,120,234,103,127,139, 70,251,121,186, 55,191, 76,154,246, 40,210,
+ 17,249,100, 76, 93, 38,148,233, 62,147,120,147,131,157,187,228,187,143, 19,133, 1,227,238,125, 26,115, 25,131,120, 66,158,142,
+200,250,134,180, 59,162,214, 93, 76, 17, 81,150, 96, 68, 77, 89,166,212,147,152,229, 11, 45,142,186,125,162,213, 14,173,246, 57,
+140,158, 65, 48, 13,131, 81,135, 4, 58, 33, 31,143,201,139,124,202, 68, 0, 37,173, 51,200, 11, 67, 28,215, 3,105,139,215, 52,
+203, 30, 8,133,143, 47, 58, 41, 36, 2,141,209,118,130,152,101, 5,174,227,160,148,107, 69,166,190,101,110, 88,245,188,143,235,
+ 58,248,174, 21,159, 85,245, 79,160,190,107, 11,148, 9, 2, 31,223,183,169,153, 54,170,219, 94,238, 66, 90,244,185,125, 25,116,
+ 85,227,184, 14, 82, 10,164,235, 80,164, 25,126, 24, 32,140, 70, 41,135,188, 40,241, 61,143, 44,203,168,117, 77, 81,228,232, 90,
+227,251, 30,249, 20,119, 43,132, 5,238,164, 19,155,232,102,243,208, 53,181,174,169,234,210,162,183,141, 13,238, 54, 24, 43,194,
+115,108, 50,167, 49, 6, 41, 45, 31,163,170,107,138, 42,167, 46, 45,131,165, 44, 44, 33, 47,205, 50,108,194, 92,102,207,179, 41,
+249,179, 42, 11,148,144,212,194,170,245,213,137,211,103, 62, 83, 86, 21,209,148, 18,102,229, 95, 80,148, 21,121,110,227, 65,109,
+ 22,172, 85,109,255,204,163, 13,210,157,125,164, 17,140,189,128, 43,103, 23, 89, 94,155,231,135,127,249,109,158,127,241, 10,141,
+229,121,100, 85,242,207,190,222,227,198, 65,134,114, 29, 92,199,193, 81,118,188,232, 56,142, 37,229,160, 25,143, 99,180,182,163,
+ 96,109, 4,233,100,130,146,194, 10, 69,166,135,157,158, 90,140,178,170,228,106, 55,227,175,222, 25,241,213,205,146,133,197, 57,
+ 46,173,183, 89,157,111, 18, 11,201,173,205, 62,121,146, 50, 55, 19,178,118,126,133, 82, 11,242,163, 24,145,151,148,181,193,109,
+ 89,246,122, 85,104,130,208, 65,152, 26, 35, 13, 2,195, 36, 47,233,143, 38,164,119,182, 73,142,198,212,198,218,194,154, 23,151,
+ 17,111,110,177,121,243, 6,157,192, 99,233,204, 69,120,244, 69,152,123, 2,221,242, 64, 57,136,149, 69,230,101,205, 79,173, 42,
+ 62,250, 68,200,229,101, 65, 63,158,112,175, 87, 32,165,131, 54,118,164, 62, 78, 18, 26, 81,132,114, 60,234,218,142, 47, 93,207,
+102,172,123, 65,128,231,122,160, 13,121, 89,146,231,185, 29, 39, 41, 57,253, 28,114,140, 0, 79, 57, 24,163,209, 70, 83,149, 53,
+121,150,114, 44,106, 43, 43, 27, 23,234,121,222, 95,119,231, 88,222, 64, 85, 90, 52, 40,218,170,161,179,212, 10, 48,140,177,162,
+ 62,199,115, 65,104,235,159,116, 28,124,215, 67, 27,131,146,130,134,111,248,221, 15, 52,249,157, 15, 45, 50, 35, 37, 70,215, 32,
+ 92, 76,111,196,238,119, 95,165,121,122, 13,177,176,192,228,218,155,220,232,165, 92,122,223,243,152, 86,196,133, 11, 43,220,185,
+181,199,214,222,144,199,206,207, 17, 45,205,195, 70,143, 47,126,239, 54,225,164,224,209, 83,103, 49, 15, 61, 7, 91,111,192,205,
+219,240,217,127, 7, 95,252, 19, 68, 54, 64,188,117,147, 31,255,224, 46,222,221, 91, 12,119, 54,169,189,136,253,218,225,213,187,
+ 71,124, 97, 23,246,181, 36, 80, 48, 35, 12, 7, 19,205, 59, 49, 28,149,112, 61, 21,220, 45, 5, 55,198,130, 55,134, 53,205, 78,
+219,106, 1,138,130,193,104,204, 40, 78,216,239, 29, 48, 74, 98,146, 36,181,246,180,233,158,179,174,107,194,169,208, 48, 47,202,
+105,232, 9, 28,244,250, 12, 71, 35,170,170, 66, 79,223, 85,207,179,204,127,163, 13,157,118,203,218, 84,140,161,211,234,208, 8,
+ 3, 90,205, 6,237,102,139,153, 78, 19,199,117,233,238,238,211,157,102,184,219, 2,162, 36,240,125,230,230,102,153,237, 52,201,
+178,140,254, 96, 72,154,229, 76,178,156,221,195, 67, 6,195, 49, 69, 93,210,106, 68,172, 44, 46,218, 66,175,172,112, 28,133,148,
+214, 26,115,156,170,102,128,100,146,210, 31,142,136, 39, 41,121, 89, 18,199, 49, 90, 91, 81,156,231,121, 72, 36, 89,110, 35,133,
+141,177,156,119, 97,140,117, 72, 72,195, 65,239,136,173,157,238,131,139,183,170, 42,180,174,113,164, 68, 77, 45,156,142,148,140,
+226,152, 56, 73,104,132, 33, 47, 62,251, 20,247,119,118,137,194,136, 23,159,123,154, 95,122,233, 67,204,206,118, 40,203,146, 71,
+ 46, 94, 96,125,121, 25, 37, 4, 71,131, 17,247,182,187, 28, 23, 33, 96,199,251,141, 32,176,223,127,207, 35, 77, 83,246, 14, 14,
+153,164,211,104,103, 33,152,109, 55,144,142,195, 56,174, 25, 15, 15, 9,103, 86, 57,243,200, 39, 56,241,196,111,178,254,216, 71,
+185,120,229,227, 92,254, 7,239, 98,239,155,239, 80, 57, 67,200, 50, 14,239,222, 32,203, 74,178,225,109,160,164, 78, 19,234, 50,
+ 38, 30,247, 56, 26,196, 52,154, 77,178,108,192,204,234,211, 52,230,207,128,169, 49,210,229,104,247, 46, 71,251,111,147,197, 93,
+ 38,241, 14,105,218, 39,143,123,244,246, 55, 88, 90,126,142,209,225, 45, 78,159, 61,197,103, 63,251,247,249,198,215, 79,226, 76,
+ 36,163,219,123, 76,244, 30,111,125,233, 15,185,247,214, 23,104,159, 61,135,223,118, 57,218,217,199,157,174,223,198,227, 49,190,
+239,211,106,181,104,183,219,156, 58,117,138, 19, 39, 78, 48, 55, 55,199,201,147, 39,233,245,122,236,236,236,176,191,191, 79,175,
+215, 99, 56, 28, 98,180,134, 50,167, 8,207, 16,181,207, 18,180, 22, 8, 58,107, 40,229,210,158, 61,193,242,217, 39,105, 62,182,
+ 70,160, 22,136,247, 14,233,204, 61, 68,247,214, 53,238,254,248, 91,108, 93,127,139,108,180,199,168,191, 65, 85,140, 41,171,152,
+ 44,217, 37, 75, 14, 81,194, 96,170, 9, 89,178, 67,127,227,117,200,124, 70, 19,232,204, 15, 56, 58,236, 89,168, 84, 16,147,108,
+239, 50,216,221, 32, 58,189,128,142,167, 35,222, 42,167,152, 12, 88, 60, 51,195, 83,191,248, 18, 69, 59,196, 12, 13, 66,181, 16,
+178,129, 46, 51,210,193, 1,158, 59,162, 26, 15, 80, 82, 81,212, 21,197, 20,222,148,150, 5, 66, 27, 92,215, 78, 3,117,109,236,
+153, 85,150,228, 85, 73,173,177,147, 43, 37, 30,224, 97, 29,199,238,163,193,144, 36,241,116, 53, 38,145, 18,132,148,118,116, 45,
+132,253, 78,215,102,106,179,117,108,244,181, 82,211, 70, 69, 78,199,243,214,174,118, 12,199,177,123,117, 61, 29,199, 75,140,209,
+148,165,166,170, 43,234,170,158, 62,103,142,213,175,104,131,198,254, 12,215,179,170,126, 33, 28, 43, 84,205, 10,176,125, 40,121,
+ 86,144,229,133,109, 14, 92, 15, 41,148,237,160, 29, 9,218, 38, 93, 86,117,101,207,126,165,152,228, 41, 69, 89,216,230, 54,203,
+236,202,184,178,169,114,190,103,227,107,109,130, 98,129, 96, 58,101, 46,203,159,152,210,253,181,240,178,172, 44,208, 71, 8,129,
+ 90, 92, 91,251,140, 16, 2,229, 40,202,170, 32,142, 19,178,204, 34,232,142,109, 23,157, 78,199, 94, 22,142,195,139,151,155,184,
+195,152,251, 8, 38,253,152,119, 63,113,150,254, 65, 31, 38, 9,231,158,123,130, 50, 43,217, 30,228,252,223,215,106,140,182, 33,
+ 14, 82,185,212,117, 73, 85,218,234,201, 15,124,140, 54,228,121, 65, 20, 69, 0,100,217, 4, 4, 20,213, 49, 7,189,192,104, 91,
+ 85, 53, 27, 13,171,220, 53,150,156,230, 53, 59,188,221, 51,124,125, 91,115,107,172, 57,191,214,225,225,181, 6, 6,101,253,239,
+ 59, 67,230,230, 27,204,172,204, 98,132, 67, 54,152,224, 74,129, 19,249,168,200, 71, 27, 9,194, 80,230, 21,195,113,134, 86,176,
+ 59,202, 56,138, 99,124, 89, 89,240,129, 22, 44,185, 62,119, 95,191, 74, 58,153, 16,250, 46,243,203, 75,112,110, 1,234, 49,226,
+139,175,112,120,117,131, 70, 30, 66,238, 98,124, 23,183,233,113,114,193,225,231, 30, 10,248,200,101,159,213, 25, 67,127, 52, 97,
+ 99,223,138, 35,180, 49,120,158,107, 43,120,207,163,214, 54, 71, 93, 9, 69, 94, 22,100,211, 93,184,231,218,236,115, 33,196,180,
+170, 5,129, 77,188,178, 57,217, 14, 70,107,148,176, 62,206,193, 96, 64,150,102,148, 85, 69,145,219,188,224,172,176, 95,146, 34,
+183,107,128,122, 42,120,171,167,157,155, 16,208,104, 88, 33,143,169,236, 88, 44, 47,172,253,201,243, 61, 58,161,225, 87,158,109,
+241,251, 63, 63,203, 51,203, 33,178,182, 29, 45,194, 10,244,118,190,241, 50, 85,154,210,153,159, 69, 12,135,148,183, 55,240,219,
+ 77,246,181,131,172,114, 34,233,112,238, 68,155,175,127,127,131,231, 46, 46,225,244,142,216, 62,156, 48,236, 14,152,155,111,226,
+ 86, 53,114,243,109,188,163, 13,234,207,127,155,205,215, 55,152,241, 21, 98,101, 22,230,103, 89, 91,159, 39,233, 79,216,221, 41,
+184,181,209,101, 48,169,200,218, 51,236,141, 10,138,178, 38,215,130, 74, 10,134, 53, 28,105,112,149, 32,182,119, 28, 61, 45, 8,
+132,161,116,125, 90, 81, 72,156, 21,118, 44, 61, 73,153,164, 41,253,193,200,226, 94,203,242,193,119,220,242,164, 21,198,216, 46,
+ 53,207,203, 7,227,191, 48, 8,145, 74, 81,213, 54,195,124, 97,110,150, 19, 43, 75, 68, 65,240,160,171, 12,166,138, 91,215,117,
+ 30,128,145,242,162, 98, 48, 24,146,166, 25,147,116,242,224, 18,158,237,180, 88, 93, 90,100,117,113,158,245,229,101,102, 58, 45,
+139,126, 44,115, 66,215,163, 63, 28, 83, 87,211,135,215, 96, 11, 50, 99, 71,225,118, 98,102,200,138,146,252, 39,138, 18, 41,152,
+142,240, 29, 92,101,187,144,178, 44, 41,170,233,231,141, 33,201,114,142, 49,179,205,102,132,171, 92,178,178,192,119,220, 41,139,
+189,207,177,253, 74, 10, 59,214, 87,202,153,118,151,118,165, 80, 85,118,135,254,241,143,252, 12, 63,117,229, 49,110,222,219,164,
+211,106,113,246,228, 58,147, 44,227,222,214, 54, 85, 85,243,220,187,174,176,180, 56,143, 82,138,157,189, 61,226,100,242, 55,198,
+239, 74, 24, 30, 62,127,158,243,167, 78,178,177,117,159,111,255,240,199,220,220,216,228,176,215,167, 40,115, 60,207,163,168,106,
+ 38,131, 17,181,144, 80,197, 24,160,152,196,164,135,183, 72,147, 30,253,237,171,136,225,195, 36,227, 46,147,244, 58,117,146,162,
+ 83,135,222,246, 53,116,157, 48, 25, 29, 97,234,156,178,180, 32, 22, 83,167, 40,191,205,115, 31,255,223,121,244,167,254, 62,189,
+221, 87,169,138,120,154,246,165, 25, 13,238, 48, 60,186, 67,157, 14,105, 54, 87, 89, 57,243, 33,158,121,207,111,242, 63,252,243,
+231,184,181,119,138,195,240, 38,250,252,187,121,249, 79, 62,199,214,230, 31, 83,246,239,211, 62,119, 18,103, 52, 68,122,139,156,
+185,244, 27,104,185,193,160,223,163, 28,196, 36,249,132,209,112,196, 96, 48,160,217,108,218,231,177,180, 7,183, 82,118,162,114,
+124,153,143,199, 86, 28,108,187, 61,197,222,206, 14,222,194, 83,148,197, 24, 71,122, 20,121,143, 50, 27, 34,164,139,244,230, 40,
+247,246,153,176,207,112,227, 22,105,218, 69,134, 1,121, 49, 36,141,247,217,185,253, 53, 6,187, 63,194, 11,218,100,147, 30,101,
+188,143,114,124, 92, 63,176, 36, 53, 41,169,234,148, 73,122,136,174, 52,147,131, 35, 22, 86, 93,246,118,118,168,171,154, 78, 39,
+ 96,120,112, 64,120,102, 9, 49,176, 13,158,214, 57,166, 28, 33, 85,202,252,185,135,104, 71, 62, 59, 71, 27,168,116, 30, 33, 29,
+202, 34,163,202,143,112,194,152,222,246,134,213, 6, 9,129,239,248,212, 66, 79,191, 83,138,100, 50, 65, 10, 51,189, 76,193,113,
+ 61,234,178, 38, 12,124,210, 73, 74, 81,150, 68, 65, 52, 93, 63,154, 7, 29,113,173,107,170,170,162,170,108, 84,248,241,217, 38,
+164, 64, 98, 39,205,121, 94,160,177,190,118,229, 88, 68,183,209,122,250,126, 91,186,167,235, 40,164,156, 54, 61, 2,234,218,174,
+146,106,109,172,157, 88, 41,219,245, 87,182, 1, 45,203,130, 32, 10, 48,218, 34,163, 29,101, 99,172, 61,199,193,245, 44, 1, 79,
+ 9,200,179,156,172, 44,208, 85, 73, 81, 91,186,157,214, 21, 70, 74,202,188, 66,136, 41, 67, 68, 72, 60,223,183, 19,113,163,166,
+205, 68,136,114, 29, 42, 93, 17, 5, 33,101, 89,161,148,197, 57,143,199, 35,203, 54, 81, 18,132,164,168, 74,154, 97,131,192, 15,
+112, 61, 23,229, 90, 0,150,174, 42,252, 32, 66, 74,129, 58,117,238,252,103,142,247,191, 18,135,178,182, 7, 79, 24,134, 68,141,
+136, 96,202,203, 61, 78,235, 58,217, 17,204,232,152,109, 45,121,100,182,193, 35, 79,156,225,141,191,250, 22,167,158,126,204,250,
+133, 29,193, 55,111,103,188,188, 17,227, 70,190,125,227,141,198,243,108,224, 67, 93, 89,161,150, 51,221,125, 24,160, 42, 44, 43,
+ 88, 8,203,188,213, 90, 19, 70, 33,161,231,163,141,161,209,140,136, 34, 43,210,105, 54,155,182, 90, 41,107,210,162,224, 32,145,
+124,229,102,204,181, 36,224,236,122,135,115,171, 77, 28,223, 97,239, 96, 76, 18, 79,240, 26, 30,179, 39,231,153,236, 15,201,247,
+ 7, 80, 85,224, 59, 24, 71, 64,165,193,104, 60,229, 16,249, 46,157,192,161,192,142, 74,246, 6, 25,241,126,223,238, 66, 85,197,
+120,156, 35,141,166,189,181,203,240, 59,223,231,206,157, 59,120,145, 79,243,241,243,232,237, 3,110, 93,221,162,232, 87, 52, 79,
+158,131,135,214,233,132,146, 71, 87, 28, 62,246, 88,155, 79, 62,221, 33, 3, 38,153, 33, 46,106, 92,215,183, 16, 17, 37, 16,194,
+238,211,243, 44, 67, 58,214,131, 89, 85, 54, 32,192, 86,200,199,118, 5, 7,199,115, 16, 6,226,100, 66, 28,143,153, 36,201,212,
+147,105, 47,219, 40, 10,112, 93,135,162,172,108,162,207,116, 10,162, 28, 27, 49,235,123, 30,174,231, 81, 85,213, 52,125, 40,152,
+ 62, 40,149,221, 3, 59,146,118, 0,191,240, 84,139,255,250,151,231,249,192,133, 38, 13, 97, 64,131,177,124, 29,132,227, 32,222,
+190, 77,247,218, 59,156,255, 59, 31, 71,108,109,145,188,241, 6,106,146,208,137,154,188,225,118,112,140,226,250,159,127,145,185,
+249, 89, 94,190, 63,228,249,139,139,188,252,239,191, 66,186,184, 70, 20,184, 84,104,110,222,219,229,202, 67, 11,176,210, 66, 62,
+255, 36, 51,207, 95, 65, 92,190, 0,221, 49,148,138, 27,111,109, 99, 92,135, 51, 75, 1,171,235, 29,188, 42,227,153,142,230,253,
+ 43,138,243,126,137,172, 53, 18,216, 45, 20,169,134, 75,179,112, 54, 82,252,244,186,226,209,182,226,133, 37,184, 87,181, 8,124,
+143,188,182, 4,171,124,170, 37,208,198, 96, 16,148,101,249, 19,151,140,173,216,237,175,105, 12,171,146,228,121,206, 56,153,144,
+229, 25,142,107,185,210,129,239, 49, 63, 51, 67, 24,250,214,118, 86, 91,120,196, 36,203,144, 66, 97,209,187,214,175, 94, 22, 37,
+163, 56,102,191, 63,120,112,161,218, 85,138, 71,173, 53,237,102,131, 32,240, 9, 60, 15, 37, 37,121, 89, 50, 24, 14, 56, 26,142,
+168,181,205,107,111, 70,214, 10, 84,107, 75, 51, 28, 78, 38,196,201,228,111,252,253, 13,118, 71,237,185, 14, 70, 64, 89, 84,244,
+134, 3,122,253, 33,166,174,105, 68, 17,235, 43, 75,150,186, 5,116,154, 77,102, 58,109,206,158, 88, 71, 74,201,225,112, 72, 89,
+216,132,172, 90,215, 24, 64,107, 67, 85, 91,186, 96, 16,134,132,190,205,134, 56,123,242, 4,255,205,239,253, 61,140, 49,188,252,
+198, 53,102,154, 13,180, 49,220,188,179,193, 27,239,220,224,189,207, 62,205,195, 15, 93, 32,116, 93,150, 22, 22,112,149,226,141,
+183,223, 97,239,208,230,193, 47,205,207,241, 43, 31,253, 8, 63,245,196, 99,246, 59, 37,108,254,251, 48,142, 25,197, 9, 6,136,
+ 66,159, 86,163,193,218,210, 60,197,100, 72,145,141, 9,162, 16,227, 68,148, 89, 13,198,118, 95,241,222, 38,229,184, 75,233,239,
+147, 29, 30, 17,202, 54, 73,233, 98,242, 1,121, 62, 1,108, 82,156,208, 96,168, 89,189,242, 40, 39, 46,255, 58,105,220,103,176,
+123, 21, 93, 39,104,157, 34, 85, 72,145, 12,200,227, 46,141,246,105, 86,207,188,192, 83, 31,122,158, 23,255,179,132,247, 24,143,
+252,197, 22, 95,248,204,159,242,249,127,254,223,145,140,182,105,157, 94,100,255,198, 29,188,118,131,230, 76,136, 50, 77,154,179,
+ 79, 19, 52,215, 49,209, 54, 91,175,189,197,218,218, 10,227, 81,194, 96, 56,160,215,235, 97,140,193, 42,161, 45, 3,126, 28,199,
+ 76, 38, 9, 15, 44,178,211, 11,125, 52,236,179,181,123,196,204,218,211, 12,246,126, 68,157,143, 40,211, 3,234,124, 76,145,142,
+ 40,179, 33,233,232, 62,227,189, 30,101, 58, 32,141,123, 40,147,160,243, 49,233,248, 62,233,224, 30,167, 30,249, 20, 11, 39,159,
+ 39,136, 22,145, 82,129, 99,161, 83, 82, 64, 93,229, 40,169, 44,109, 46, 27,147, 12, 15,233,204, 10, 28, 71, 49, 30, 39,120,205,
+ 6, 47,124,248,131,204,157, 62,193, 32,238, 82, 29,217, 72, 79, 93, 21,184,205,146, 76, 43, 58,174, 79, 50,216,167,136, 93,164,
+156, 5,157, 83, 20, 67,130, 70, 74,213, 63,176,148, 63,233, 34, 29,235,244, 9,124, 11, 40,146,211, 75, 78,107,109,173, 97,101,
+ 65,224,219,125,179,239, 7,212,117,133,227, 57,214, 29,228, 74, 42,109, 35, 85, 65,211,136, 26,184,174,157,248, 54,162, 6,194,
+ 17,164, 73,106, 57, 34,158,135,231, 7,248,254,116, 7,238,219, 72,109, 49,125, 54,108,222,123, 72,141, 13,225, 66, 9,164,144,
+ 15,198,244,174,163, 48, 66,145,166, 25, 69,110,133,105,218,212, 96, 20,121,145, 17, 4,161,237,208,165,196,113, 29,108,210, 26,
+ 40, 37, 40,170,250,193,217, 97,159, 27,137, 84,118, 45, 86,148, 53,122,122,167, 58,174,131,239,249, 52,162, 8, 33, 21, 85, 89,
+ 81,105, 59, 25,240, 3,159, 50, 47, 41,139, 10,132,197,163,199, 73, 74,173,107,210, 44,197,102,114, 64,179, 17, 77,125,243, 57,
+190, 63,213, 88,213, 37,173, 86,123,186, 46, 87,168,197,213,181,207, 4,129,229,225, 42, 71,218,253,196,116,188,152,231, 25,117,
+101, 43, 36, 43,134,168,185,188,234,115, 38, 44,217,233, 38, 60,115, 97,137,118,203,231,230,183,127,136, 60,119,129,165,118, 72,
+ 89,212,124,107,171,100, 51, 22,228,233, 4, 33, 21,181,193, 34,104,171, 26,229, 56, 8, 97,168,203,154, 70,212, 32, 12,124, 2,
+223, 39, 8,124,106,109,115, 98, 45, 12, 68,130,208,184,142, 69,163, 42,105,223,220,178,182,185,188,206,180,179,172,235, 26, 47,
+ 8,232, 15, 38,124,103, 35,231,229,125,129,244,124,222,253,240, 44, 8, 56,232,165, 36,195,152,217,181,121,162,197, 25,146,163,
+ 9,229,225, 24,165, 53,210,247, 16, 82, 35,164, 75, 16, 58, 40, 45,241, 67, 23, 79,186, 24, 33,240,252,128, 58,175,113,165,164,
+150, 46,217, 36, 97,103,239,144,195, 3, 59,202, 58,117,234, 4,206,179,151, 16, 72,178,173, 46,162,174, 81,147, 10,247, 0,246,
+222,233,210,116, 60,104,186, 68,190,224,197,211, 30,191,248, 68,155, 15, 95, 10, 89,138,172,232,232,246,126,134,192,166, 13,217,
+149,182,121, 80, 41, 30, 35, 4,149,178,196, 58, 57,237,144,171,178, 32, 30,141,169,211, 20,234, 10, 45, 29, 26, 81, 68,163,101,
+ 69,105,210,113,113, 92, 7,129, 68, 9, 75,110,114, 92,151,162,200, 16, 8,132, 4, 47, 8,240, 29,143, 99, 98,221,201,121,151,
+ 15, 61,236,241,247, 62, 48,195,239,188,111,158, 15, 94,233, 80, 92,221,102,231,206, 1,115,235,179,152, 90, 35, 92,151,228,234,
+ 54,119,111,236,177,176,218,102,113,126, 14,115,233, 12, 59, 91, 99,226,112,134,238,107,219, 52, 28,205,235,222, 44, 59,163,148,
+245,165, 38,114,216,231,167,127,225,221, 36,219, 93,100, 24, 17,206,117,216, 62,140,145, 24,150, 58, 1,235, 63,115,145,250,250,
+ 33,223,254,234,117,242,123, 99,230,255,246, 39,224,153,247,194,140, 96,238,233, 11,136, 59, 7, 28,108,110,209,206, 51, 46,158,
+157,103,213,131,179, 47,158,225, 61,191,250, 36,191, 26,214, 60,213,200,249,196, 42, 60, 61, 3, 71,147,154,162,208,196,149,228,
+122,162,249,226,150, 33,156,237,160, 28, 43,202, 17,210, 90, 11,179,172,152,138, 18,173,104,174,124,160,196,197, 30,254,128, 16,
+199, 89,234, 54,132,196, 96,199,213, 54,168,194, 48,211,110,227,249,118,114, 37,165,181,151, 84,117, 77, 89,215,164,153, 77,248,
+147,194, 80, 21,182, 56, 11,131,112,186,230,201,167,123,234,138,100, 58, 89,113,167, 19, 25, 99, 12,117, 85,113,115, 99,147,123,
+219,247,113, 93, 91,124, 28,239,242, 60,127, 10, 23,170, 43, 92,101, 19, 17, 93,199,195, 96, 30,116,215, 74, 89,146,150, 82,210,
+ 34,111, 51,187, 98, 49, 88,165,109,154,102,150,250,102, 52,253,193,144,131,126,159,205,157, 93, 14,143, 6, 28,244,122,104,109,
+117, 52,229,180,147,180, 43, 32, 69, 24,248,132,190, 11, 82,210,110, 52,248,131,255,226, 31,177,180, 48,207, 96,156,240,185, 47,
+127,131,192,247,120,229,234, 91,244,142, 6,252,143,255,228,247,248,192,135,222,103, 39, 12,105, 10, 24,132,148,116,247,247,185,
+119,191, 75,150, 91, 54, 64,150, 23, 8,105,112, 29,151,219,247,238,115,239,254, 54, 66, 8,138,210,130,149,178,188,160, 50,154,
+213,249,121, 58,243, 29,222,185,177, 73,216,138,144, 74,145, 87, 22, 15, 42, 5,140,134, 27,148,197, 0,252, 49,189,157,125,154,
+186, 34, 25, 31,144, 79,250,212,181,193, 24,139,112, 54,216,236,107,116,141, 43, 5,113,191, 75, 85,141,168,210, 33,101,157,227,
+ 5,115, 68,205, 21, 46,188,251,215, 88,191,244, 1, 86, 79, 60,194,228, 8,118,110, 6,108,174, 11,238,126,222,163,183,159,177,
+253,246, 31,209,104,159,162,213, 92,102,116,176, 69,218, 27, 34, 42,159,249, 25,159,189,189,107, 44, 44,190, 64,235,209, 21,110,
+255,224, 11, 28,237, 28,176,114, 98, 13, 49,221,149,218,233,163, 29,249,234,233,103,118, 44,212, 58,158, 66,230,105,198,205,119,
+222,225,111,255,253, 55,249,189,255,227,215,248,210,191,252, 87,136,218,218, 13,165, 52,232,124, 66, 93,199, 24, 93,160,133, 67,
+153, 13,152, 91,121,156,165,133,167,217,191,247, 77, 38,147, 93,102,215,223,197,185,199, 62,133,239,180,104,116,214, 9, 90, 43,
+212,186, 34,203,134, 96,114,180, 41,169,203,132, 42, 29,147,197,187,148,217,128, 81,127,196,217,135, 79,147, 26, 77,146,165, 24,
+ 20,237,206, 9, 28, 89,112,116,127,128, 18, 17, 72, 77,168, 34,154,243,138,221,221, 30, 42,139, 41, 50,133,235,206, 2,130,162,
+ 24,227,182, 38,148,131, 61,106,109, 41,104,121, 54,221, 7, 79,108, 42,102,232, 91, 31,185,235,218,103,231, 56, 47,192, 66,187,
+114,187, 14, 18,224, 78, 59, 85,223,117,145, 74,224, 56,158,189, 37,165, 64, 9, 7, 93,107, 92,199,234,137,170,186, 36, 29, 79,
+208,210,224,123, 54,225, 82, 40,187,198,173,167,171,174, 73,154, 34,164, 64, 24, 16,106, 26,200,229, 56, 15,244, 72, 90,215, 72,
+233, 32,208, 8, 37, 73,211, 20, 93,219, 54,220,115, 92,164,178,107,100,137,109,170,116, 85,225,122, 62,142,114,237,101,111, 12,
+ 85,109, 11,121,163, 45,133,213,178, 82,192,247, 61, 26,141, 6,199,132,206,186,182,184,230, 99,150,137,239,123, 84,186,166,174,
+236,247, 53,159,142,225,143, 1, 53,182,240,176, 56,112,235, 69, 23, 56,158,135,227, 40,138,172,192,243,236, 51, 95,215,246, 59,
+166, 78,156, 62,243, 25,233, 88,195,125,154,218,241,199,177,128,192,247, 3, 92,101,209,117,158,111,153,187, 51, 77,143,119,207,
+195,155,221, 17,221, 94,194,220, 76, 68,182,213,229,107, 91, 9,207, 61,118, 18,148,225,115,111,142, 57, 44, 4,158,251, 19,152,
+ 81,215, 69,185, 10, 11, 98,201,173,181, 75, 42,202,178, 66,160,144,158, 67, 24, 6, 88, 38,181, 21, 69, 56,142,139,235, 56, 8,
+105, 16,210,114,120,229, 52,146,212, 26,252,205,212,251,107, 85,189,160,153,228, 53,175,117, 51,254,114,163,166, 51,219,226,226,
+137, 54, 81,160,216,223, 61, 98, 56,204, 89, 61,191, 68,208,242,137,123, 49,229, 32,193, 76, 42,100, 39,160,172, 53,165, 46, 41,
+178, 18,133,161,174,160,166, 34, 10,172,248,225,242,165,243,156,121,252, 10,189,237,251,168, 72,145,100, 5, 45, 63, 36,212, 14,
+201, 59,183, 57, 58, 56,196, 13, 45,255,247,254,221,187, 92,191,179,197,155,183, 14,232,152, 22,205, 15,191, 15,102, 58, 56,105,
+202,236,172,199,149,211, 33, 63,255, 68,147,255,228, 61, 77, 78,204, 24,102, 90,129,165,223,185, 62, 26, 27,199,153, 38, 9, 89,
+158,145,231,185,165,189, 1,147,241,152,100, 52,166, 46, 50,132,177,226, 37, 33, 37,141,102, 19,141, 29,209,103,105,138,231,218,
+ 11,219, 8,144,142,162, 42,173, 56,175,210,154,192,115,152,137, 60,206,174,120, 60,119,193,231,151,158, 10,249,237, 15,204,241,
+145, 71,155,156,104,123,248,161,203,228,245, 46,255,250, 75,215,153,157,107,176,118,118, 9,169,128, 84,243,165,239, 92,103,166,
+213, 96,233,172,101,168, 51,204,249,147,111,222, 64,248, 30,167,147,125,148,239,179, 57,179,200,222, 48,227,133, 39,207,160,251,
+125, 90, 39,215,216,248,234,203, 60,244,158, 43,204,173,205,243,141,239,220,228,220,185,101, 46,172,205, 16, 22,130,127,251,217,
+ 87,112,141, 33, 29,166,156,249,216,199,236, 63,226,181, 31, 34,239,222,199,247, 92,102,126,254, 5,252,197, 5, 88, 95,131,247,
+ 61,203,240, 27, 55,217,251,230, 53,226,220,176,219, 79, 25,151,134,197,134,199,187,102, 21, 79,204, 10, 90,142,225,122, 95,115,
+191,148,180, 58, 29,180,177, 83, 38,109, 4,102,250,221,138, 2, 27, 76,164,181,161,172,108,231,100, 87, 80, 14,158,107, 5, 53,
+ 24,166,130, 49,193,120, 60,126, 48, 85,114, 93,135,102, 20,225, 58, 46,249, 84,129,122,216,235, 91,126,192,180,211,146, 64,109,
+ 32, 47,237,184,220, 96,147,158,142, 70, 67,234,170, 70, 96,136,130,144,229,185, 57,187,238,240,172,191, 53,158,138,231,138,178,
+ 66, 74, 69,146,196, 8,160,211,178,163,219,238,126,143,131, 94, 31, 93,105,171,208, 15,125,164,176,251, 64, 93,107, 43,136, 19,
+ 6, 71, 72,187, 46,168, 74,148,227, 16,250, 46,205,168,129,114, 92, 26,145, 21,211, 37,137, 37,127, 25, 99, 21,196,121, 94, 79,
+187, 38, 27, 95,219,105, 54, 49, 88,132,103, 58,117,199,232, 90,115,233,194, 57, 62,249,209, 15,179,180,178,194,221,141, 13,238,
+108,110,179,179,183,199,214, 78,151, 79,254,252,135,249,232,135,222,143, 41, 43,146,120, 76, 94,149, 12,134, 67,242,178,228, 71,
+ 87,223,228,229,215,175, 2,176, 48, 55,199,211,143, 95,102,125,105, 9,165, 28,198,241,152, 52, 45,216, 59,236, 19, 79, 87, 80,
+190,239,115,114,121,137,185,153, 25, 90,179,179,140, 26, 17,107,231, 94,164, 28,119,169,178,132,178, 44, 25, 39, 59,140,246,222,
+102, 97,245, 52, 70,246,169,165, 96,184,185, 67, 49,238,177,122,225,231,113,130,101,134,135, 87, 17,198, 22,116,152,154, 44,142,
+241,194, 0, 93, 23,228,105, 76, 85,142, 80,202,163, 53,119,142, 86,235, 44,239,255,239, 95, 64,111, 55,105,127, 24,146, 93,184,
+243,131, 87,121,253, 63, 92,101,111, 99,131,154,140,147,231,126,129,229, 83, 47, 80,228, 7,196,253,187, 8,165,200,253,146,114,
+152, 16,205, 43,230, 87,222,207, 83,143,254, 71,184, 51, 43, 92,251,238,103, 57,218,223, 99,126,105, 9,223,179,118, 73, 99,254,
+186, 8,179, 19, 80,171,216, 22, 82,146, 78, 18,238,110,108,144, 59, 46,179,139,167,248,206,159,221, 98,255,222,151,112, 3,159,
+108,146,160, 92,159,118,187, 65,145,151, 40,229,145,229, 57,181, 78,248,208, 39,255,156,143,252,246,175,242,222,127,250,143,120,
+254,249,127, 76,150,173,113,176,247, 67, 38,227, 61,134,195, 77,178,172,199,252,194, 35,204,173, 94,161, 54, 80, 23, 99,138, 73,
+140,209, 25,117,149,162,107,144, 34,162, 25,206,178,126,110,129,131,225,128, 50,207, 72, 55, 5,142,159, 50,201,143, 16,186,131,
+112, 2,140,136, 88,190,184, 68, 62, 58,100,184,183,131,191, 60,139,206, 59, 72, 21, 80,155, 20,194, 4,167, 72,112,204,212, 58,
+219,136, 40,203, 10,105, 12,158, 31, 32,132, 65, 27, 77, 58, 73,201, 51, 27, 87, 92,228,133,221, 33, 43, 73,224, 7,160,107,140,
+180,138,247,170,172,201,171,146, 73,146,216,241,186,174,241,125, 31, 37, 21,101,157,131, 84, 86,133, 30,133,120,158, 75,146,166,
+ 84,149,229,178,107,172,112,172, 40, 75,132, 17, 56,174, 68, 57, 62,101,153,147,167,185, 45,200,141, 65, 9,123,215, 84,149,181,
+154,161, 13,199,248, 85, 12,148,101, 69, 85, 90,200,147, 54,160,181,253,252, 48,218,170,236,167,133,185,227, 89, 27, 50, 26,252,
+ 32, 36, 12,236,136,188,170,172, 55,255, 39, 35,172,237,159,107,247,233,101, 81,226, 57, 14, 6,137, 55, 5,218, 56,174,157,170,
+ 4,190, 77,125, 19, 66,146,229, 25, 69,145,147,166,233,116,234, 34,112, 61, 23,195, 52, 77, 85,131,144,194,178,223,139,178,102,
+146,196,120,126, 0,194,146,105,138,178,162,204,173, 72, 13, 12, 89, 94, 80,148, 57,163,180,224, 63, 62, 31,112,245,118, 15,141,
+228,198, 70,143, 48,233, 51,191,188,192,217,243,107,148, 69,197, 95,188, 61,162, 59,200, 41,139,130, 90,192,146, 42,121,118, 85,
+240,246,174, 85, 5, 98, 12,198, 88,108,158, 20, 18, 67,141,174,107, 43,194,194, 86,175, 22,244, 47, 24,197, 35,242,188,160, 42,
+ 74, 27, 46, 99,106, 70,195,216,230,218,154,122,218,221,218, 15, 64, 27, 99, 35, 78, 93, 23,140,224,157, 35,195,215,239,215,140,
+ 76,192,251, 30,157,195,115, 96,227, 94,143,200,243, 56,253,232, 26,153, 86,164,117, 77,213,155, 16, 52, 67,220,192, 71, 74, 40,
+128,163, 44,199,199,224,250,118,212,114,120, 24,179,218,182,161, 1, 7,189, 62,153,174,216,223, 29, 49,222,221, 97,111,123,135,
+ 60,206,152, 89, 90, 96,233,133,167,200, 54,238, 51,216,223,103, 33,242, 89, 95, 95,197,189,112, 22,241,118,143,111,126,225, 21,
+182,239,246, 89,214, 33,234,196, 58, 78, 51,224,210,170,207,139,143,183,248,248, 51,109,126,233,177, 38, 31,186,164, 56, 59,171,
+152,107, 8, 90, 13,215,190, 39,166,102,112, 52,198,213,133,253,226, 97,199,246,198, 88,143,163,231,123, 56,174,131,235, 88, 97,
+ 93, 93, 85,204,132, 6, 95, 25, 92,165,121,250,116,192, 79, 63,222,224, 83,207,118,248,165,103, 58,252,214,139, 29,126,249,241,
+ 6, 47,158,246,121,116,201,167,237, 74,132,152,254,172, 65,193, 95,125,254, 42, 51,142,224,131, 63,115, 5,227, 9,168, 5,223,
+254,194, 85,214, 22,103, 56,181,220,192, 19,192,214, 54,183, 7, 37,219,219, 3,154,157, 16, 39,157, 32, 71, 41,147, 83, 39, 25,
+100, 5,126,173, 89,116, 11,190,250, 39,223,225,197,167, 79, 32, 79,173,115,115,163,199,253,110,159,164, 18,204, 55, 61,178,241,
+255, 71,212,155, 6, 89,118,222,231,125,191,247,236,231,238,247,246,222, 61,221,211,179, 1,179, 0, 24, 44, 36, 0, 2, 4, 64,
+ 2, 36,196,181, 40,128, 20, 23,173,137,149, 40,114, 36,151, 45,149,163,184,236,114,204,146,147,216, 85,177,163,164, 42,169,138,
+ 28,165, 34, 43,178,203, 46,209,162, 41, 81, 20, 37,113, 1, 1, 18, 43, 1,204, 96, 6,179, 47, 61,189, 47,119, 63,251,250,230,
+195,123, 7,234, 47, 51, 53, 53,213,213,125,187,239,249,111,207,243,123, 98,162, 56,199,172,152,244,163,140,131,215,222, 97,248,
+131, 31, 50,255,192, 60, 20, 46, 65, 38, 40,194, 12,227, 51, 79,163,205,207, 64,191,199,248,229,183, 89,122,242, 17, 26, 39, 86,
+105,203,152, 54, 41,125, 47, 38,200, 74, 26,150, 70,195,128,143, 46,219,172, 54,108, 86, 12, 37, 12, 27,101, 16, 22, 37, 69, 33,
+ 16, 40,117,233, 96,228, 17, 76, 10,200,221,143,187,103,140, 90,165, 66, 81, 42,146, 84,150, 23, 20,185, 74,214,203, 38,171,104,
+215,113, 38, 90, 16, 73, 28,167,248, 97,192,200, 11,240,195,144, 78,163,165, 86,235,185, 90, 97, 75, 41,169, 85, 43,212,170, 21,
+246,246,123,164, 89, 54,249,247,146, 40, 77,213,116,173, 43,166,127, 16,132,164,105,142, 44, 37, 81,146, 16, 37, 9,154,174, 43,
+190,124, 89,126,128, 86, 77, 50,197, 82,207, 11,229,249, 21,154, 70, 54, 57,211, 84,109, 71,101, 59,107,234,119, 33,207,115, 74,
+ 9, 18,137, 97,104,212, 43, 85,164, 80, 52,195,162, 44,169,184,206, 36,218, 81, 9,144, 28,199, 97,186,221,194, 11, 67,178,201,
+ 89,172, 40,212,186,244,185, 39, 63,194,247,127,242, 42,207, 61,249, 24,171, 39,142, 17,123, 1, 27,219,219,220,222,220,230,225,
+251, 78,115,252,200, 97, 46, 95,191,201,203,111,188,133, 23, 70, 44,207,207,179,223,237,115,233,250, 13,222,191,126,139,107,183,
+214, 0,152,159,153,226,161,251,206, 48, 59, 51,141,231,251,236,238,119,209, 13,125, 82,236, 4,166,174, 49, 51,213,230,244, 61,
+ 39,120,226,225, 7, 48,218, 83,164, 75,171, 24,241, 44,113,170,145,250,119,232,110,188, 73, 50, 62,224,190,199,127,155,106,107,
+137, 40,190,138,110, 66,237,232, 2,159,253,226, 31,242,167,255,231,139,188,122,243, 12,251,195, 31,145, 13, 6, 72, 81,128,212,
+ 84, 97, 31, 15,104, 53, 92, 70,253,117,242, 44,166, 51,251, 24, 11,171, 31,227,240,234,147, 28, 57, 5, 23,191,189,193,248, 29,
+143,254,206, 38,126,184,134,231,223,102,212,187,138,223,187, 73,165,190,168,222, 39, 90,157,100,240, 62,101, 37, 39, 31,100, 72,
+189, 73,226, 27, 56, 86,194, 91, 47,125,131,197,149,103,121,228,217,191,199, 79, 95,250,191,217, 88, 95,195,247,198,212, 26, 13,
+116, 93,133, 33,221,157,204,165,148,132,126,192,141,219,215,216,220,216, 69,119,166,169, 84, 59,120,189,139,244,119, 95, 33,215,
+ 82,242,196, 65, 3,210, 96,164,206, 66, 66, 80, 96,145, 39, 17,134,238,242,208,103,255, 49, 91,215,250,108,124,127,131,222,102,
+206,248,224, 22,221,157,243,132,254, 30, 69,212,195,169, 76,211,156, 62,142, 99, 58,104,214, 36, 37, 45, 30,145, 23, 17,166, 89,
+199,112,218, 84, 59, 71,145, 70,139,197,123,218,140,186, 93, 2,127, 68,181,101, 49,190,190, 67,152,246,169, 86,103, 41,114, 11,
+221,236, 64, 62,207,202,131,135,168,235, 57,194,178, 40,162, 42,142,213, 65, 20,146, 50, 75,176, 43, 49,222,158, 74,234, 76,226,
+ 24,132,134,105,155, 84, 92,133, 34, 55,116,245,220,215,117, 67, 9,234, 38,231,223,138,237,144,166, 25,186,110, 42,216,150,169,
+ 19, 78,178, 52,242, 66,241,222, 93,183,130, 31, 40,125,140,105,154,104,168, 97,180, 82,113,201,242, 18, 83,183, 17, 2,208, 52,
+ 64,163, 90,113, 41, 10,149,189,161,178,216,149, 47, 93,109,186,116, 37, 76, 78, 99,138, 44,167, 90,169,161, 0, 50,170, 25, 55,
+ 12, 75,225,211,109, 27, 83, 87, 2, 85,203,180,177, 93,133,179,181, 12,101,143,141, 35, 5,144, 49, 39,234,120, 41, 75, 12, 83,
+ 39,138, 34, 92, 91,101,104,168, 97,117,146, 0,151,231, 19,221,148, 10,224,178, 44, 27,161,233, 8, 77, 97, 99,133, 6, 32, 16,
+134,218,164,154,166,141, 2,142, 25,196,147, 13, 66,154, 36,228,101,138,174, 25,248, 65,128,109,171,232,244,162, 44, 48,116, 77,
+ 32,132, 82,201,122,163, 33,134,105,161,161,163, 21, 5, 73,166,214, 92,102,163,142,117,247,190, 24,229,116, 51,131,229, 41,135,
+ 81, 44,176, 28,131, 97,210, 36,235, 71,196,121,138,105,152, 28,153,173,177,238,199, 68, 73,130, 76, 82,142,203, 61,254,199,191,
+255, 27, 28,254,195,239,242, 7,111, 7,232,186,129,105, 9,242, 36,158,100, 77,223, 85,188,170, 65,237, 46,233, 75,136, 16, 33,
+ 4,150,101, 98, 57, 46, 89,158, 19,134, 42,156,196,180, 44, 84,238,110, 65, 74, 73, 89,128, 97,187,196,229, 36,247,187, 84, 89,
+181,105, 2,175,110, 11, 46, 14, 52,158, 95,157,226,177,227, 46,126,119,192,149,203,187,204,206, 55, 89, 60,212,198,239,122,108,
+223,220,165,171, 25,204,213,109,186,113, 74, 16,102,184, 75, 77,216,235, 67,163, 66,175, 59, 96,236,251,212, 42, 46, 2,131,186,
+ 97, 18,105, 5, 73, 17,162, 87,116,200, 37,169, 31, 66,223,199,118, 92, 26,157, 38, 20, 26,254, 96, 76,229,175,223,160, 55, 28,
+226,140, 6,148,133,198,109,179, 74, 43,222,225,206,214, 14,109, 39,167,102, 10,132,233,178, 48, 63,199,212,252, 20,167,143,207,
+128,151,130,200,161,128,110,152,226,152,130,219,227, 8, 87, 10,124, 36,105, 92, 96, 9, 29,175, 40,113,132,192,177, 76, 34, 13,
+230,108, 65,197,214, 41,164, 70, 77,215,168, 25,128,105,128,169, 65,170, 62, 31, 89,129,148, 2,153, 65,105,168,105, 63,187,190,
+141,233, 86, 25, 30,244,105, 76,215,249,216, 71,239, 65, 28,170, 66, 63,225,218,107, 87, 25, 6, 9, 94, 16,211, 63, 24,242,212,
+177, 14,232, 26, 27,235, 1,199, 15, 53,217,234,250, 52,107,109,220,222, 16, 35,207,232,143, 60,180, 35, 29, 1, 41, 15,238, 0,
+ 0, 32, 0, 73, 68, 65, 84,172,204,229,228,252, 4, 0, 83,232, 92,120,111,135, 67, 77, 7, 47, 8,185,182,109,112,223,145,105,
+ 18, 36,166,144,172,141, 66,188,124,143, 47, 61,126,152,232,242, 14,127,242,131, 27, 80,192,124,167,201,243, 95,253, 34,242,205,
+215, 17, 69,143,217, 95,123, 1, 49, 40,144, 51,117, 26, 63,251, 44,173, 48,100,245,245, 55,184,242,199, 63,100,187, 31, 18, 20,
+ 64,146,177, 98, 58,108, 9,147, 39,173, 49,103, 83,141, 11, 98,134,126, 82,210, 11, 51,188, 36, 71,215, 77,220,170, 70,150,164,
+ 42,101, 15,117,231,204,211,148, 40, 78,176, 38,246,151,187,133, 78,211, 13, 36,130, 36, 78,217,218, 85,194,175, 70,189,134,101,
+170, 53,124,197,113, 8,227,144,173,253, 61,116, 33,104,183,154,212,170, 85,106,213, 10, 73,154,114,112,208, 37,203,255,246, 6,
+158,229, 5,113, 20,147,214,114,146, 84,101,173,151,121,193,208, 27, 51,242, 3,242, 60,167,234,186, 72,164,242,170,187, 46,207,
+ 63,253, 36,255,213,215,190,200,234,161, 67,236,247,250,156,187,116,133,139, 87,174,177,182,185,201,103, 62,254, 52,166,105,242,
+215, 47,191,198,149,155, 55, 25,142, 21,168,200,182, 76,218,141, 58,243,179,115, 28,244,251,244,135, 67,188, 32, 32,157,156, 29,
+ 12, 93,163, 86,107, 32,130,128,209, 56,197,106, 26,100, 69,129,109,153, 74,252,147, 43,127,245,145,195,203, 28,244,123,196, 73,
+170,236,117,166,193,237,245,117,222,186,240, 62, 69, 81,176,115,112,192,183,254,234,251,236,247,250, 60,254,200,131,188,248,153,
+231,177, 44,131,209,216,227,218,173, 53,222,124,247, 60, 0, 21,215, 33,140, 98,110,222,190,195,161,121,133,200,157,158,234,176,
+177,189, 67, 24,134,147,124,235, 2, 39, 78, 8,147,132,177,239,211,181, 59,120,221, 45, 26,250, 50,245,246, 67, 56,245,123,152,
+ 90,241, 57,243,224, 47,241,224,195,117,194, 4,174,188,247, 56,175,191,243, 27, 96,103,188,127,238,123,252,203,255,247,151,233,
+238, 92,161,179,124,130, 96,111,143,178, 63,166, 16, 41, 66,211,137,163, 62,235,235, 87,153,157, 94,100, 56,220,225,129,207,252,
+ 93,206,156,169, 50,220,146,184,142,192,182, 77,214,110,253, 64,173,112,131, 93,162,225, 46,195,131, 75, 68,195, 45, 76,167,133,
+ 91,107, 3, 14,210, 90,161,220,123,153,212, 52,208,130,152, 36,149, 92,243,215, 49,200,185,244,210, 59, 44,157,120,129, 71, 62,
+249, 15,121,251,111,254, 21, 7,221, 17, 7,221, 55,209, 45, 27, 91, 23,152,142,163,156, 40, 97,130, 68,199,114, 27, 52,103, 14,
+ 41,129,151, 5,186,110,171,100,196,177,199,153, 79,255, 46,221,141, 31,115,243,157,255,200,216, 15,113, 28, 3, 77,207, 40, 73,
+ 41,211,156, 27, 87,191,141,165, 85, 41,199, 3,162,120,132,215,187,134, 33, 76,236, 70, 7,239,224, 22,195,189,247,149, 72, 76,
+ 88, 36,217,136, 60, 13,209,245, 42,122,197, 4,205,192,112,167,105,116, 78,226,212,231,232,109,238,113,244,196, 49,222,252,201,
+235,196,121, 64,123,193,165,191,213, 67,180, 35,180,192, 0,105,144, 5,146,189,247,235, 44,220,255, 48,114,247, 50,113, 47, 70,
+ 51, 4,213,122,155, 40, 29, 82,107, 79,211,151,146, 48, 12, 63, 56,225, 80, 40,199,142,102,169,233,247,238,246, 48,138, 99,202,
+201,217,181, 68, 1,100,164, 86,226,184, 54,190,239, 81,171,214, 40,165, 10, 96,177,109, 75,229, 80,160,108, 97,222,200, 71, 51,
+116, 26,141, 6, 73,156,128, 40, 64, 72,108,219, 33,207, 99, 44,221, 68, 72, 65,213,169, 34,133, 68, 22, 5, 66, 51, 16,174,141,
+144, 58, 69,174,192, 93, 37,146, 82,148,164, 69,174,162,102, 77, 19,169, 73, 10,153,171, 63,179, 76,217,242, 38,201,109,170, 56,
+ 73,194, 52,194, 54, 93,156,170, 3, 18, 66, 63,160,222,168, 2,106,123, 86, 88, 6, 97,162, 96, 8,134,166,226,187,133, 16,106,
+ 91,157, 21,200,172,160,200, 18, 12,211,198,173,184, 4,113, 66,173, 90,193, 52, 44,116,189, 68,150, 37,217, 36,158, 85,145, 68,
+ 53,165,143,144, 18, 41, 33, 75, 74,252,194, 67, 8,131, 34,135,188, 72, 48, 13, 19,189, 51, 51,243,117,195, 48,136, 83,229,171,
+ 46,210, 68, 77, 0, 19, 81,143,110, 24, 20,233, 4,162, 82,150,228, 18,142,204,185, 44, 58, 57,131, 32,195,116, 44, 82,161, 67,
+154,114,226,196, 34,174,169,241,214, 70,204,102, 48,137, 9,117,108, 30,168, 6,108,190,115,129,207,221, 91, 97, 43, 49,216,141,
+ 13,138, 2,198,222,152, 44, 83,209,160, 82, 74,133, 93, 53, 84,176,132, 16, 10,120, 82,173,213, 72,147, 68,121,207,227,140,178,
+ 84, 12, 92,211, 52, 40,203,146, 44, 47, 65,128,163, 91, 32, 4,154, 20, 24,186,174,206, 6, 66, 7, 77,181, 8,121, 14,151,187,
+ 37,175,246, 29,142, 29,106,112,255, 33,135, 59,155, 3,118,183,251,160,105,212,102,106,228, 94,140, 72, 10,172, 76, 41,255,147,
+ 56,197,138, 82,186, 65,194, 32, 81,141, 79,189,162, 99, 87, 77,218,213, 26,199, 79, 28,165,223, 27, 80,150, 57, 89, 38, 25,250,
+ 17,182, 55, 34, 74, 50, 70,131, 49,121,150,210,156,110, 49,246, 98,110,111,239,146, 73, 73,179, 90,195, 16, 57,105, 24,225,239,
+119,185, 52,138,184,186,239,163, 89, 85, 70,126,198,219,111,175,179,152,164, 88,171, 77,200, 75, 74, 77,195,109,216,152, 82, 48,
+231, 58, 76, 53, 28,102, 43, 54, 75,117,151,133,134,205, 74,195,102,177, 97, 51, 87,179, 88,112, 13,154,166, 70, 69, 55,168, 11,
+ 29, 83, 47,193,178, 16, 5,200,205, 24,209, 84, 94,208, 82,128, 48, 64, 84, 45, 68, 94,112,237,173, 59,252,217,197, 93, 30, 90,
+170,225,222,183,204,225, 83,115,104, 77,135,245, 31, 94,229,149, 31, 95,227,214,222,152,102,221, 38, 77,115, 54,135, 17, 71,134,
+ 93,236,229,101,222, 90, 27,208,172,217,216,174,141,211,114,176,215,118, 56,252,232, 73,134, 26, 88, 58,220, 59,219, 96,119,125,
+151,131, 59, 3,218, 39, 87,217,190,115,128, 64,195, 47, 37,118,154,179,222, 11, 72, 28, 3,199, 48,168, 90, 22,213, 52,163, 51,
+ 85,229,221,107, 7, 76, 91,130,249, 67, 45,242, 32,161,113,123,147,139, 23,111,176,116,207, 50,223,252,230, 57, 94,125,245, 58,
+135, 53,147,202, 51,191,140,152,255,121,202,229, 38,211,115, 9, 71, 30, 58,202,253,159,248, 16,103, 58, 53, 30,110,232,252,217,
+165, 93, 46,237,102,248,121,202,188,150,115,172,105,178,212,116,169,155, 26,162, 80, 57,246, 94,156,144, 77,214,161,160, 26, 28,
+115,162, 97, 72,115,181, 6,151,178, 36,157, 20,221, 18,137,174, 11, 42,182, 67,179, 81,199, 48, 4, 66, 83,224, 33, 93, 83, 54,
+154,233, 78,155, 70,189,142, 59,185,187,215,106, 10,244, 18,198, 9,163,177,143, 16,138, 90,165,105,234,110,175,136,116,106,229,
+119,246,228,189,252,214,127,253, 43,124,236,241, 71,137,146,132,107, 55,111,209,106, 52,249,213,175,188,200, 47,190,248,121,206,
+156, 56,193,239,253,193, 31,241, 31,190,245, 23,252,187,111,254, 57,221,193,128,167, 30,253, 16,157,102,147,183, 46,188,207,126,
+175, 79,183, 63,196,243,125,144, 37, 71,150,151,121,225, 83,207, 81,117, 29, 94,122,237, 77,230,231,102,185,240,189,111,243,220,
+147,143,211,105, 54, 40,133,192, 27,143, 41,203, 82,173, 46,139,156,229,133,121,166, 59, 29, 28,215,166, 81,171,179, 48, 51, 3,
+ 82,114,225,202,117,132, 16,220, 90,223,228,196,220, 44,205, 73,227,178,186,180, 64,148,100,220, 90,223, 96,113,126,150, 63,248,
+151,191,139,101, 41,193,166, 31, 70, 92,191,181,198,235,231, 46,124,160, 39,184,231,232, 42,135,151, 22, 88, 90,152, 99, 52, 86,
+ 56,219,177,239,115,208, 27,144,102, 25,182,105, 48, 51, 61,197,153, 19, 71,169, 87, 42,236, 73,139,222,206, 22, 66,118, 40,138,
+130, 50,135,230,124,139, 56,236,115,229,252,109,174, 92,124, 23,137, 67, 25,148, 28,108,188,129, 48,251, 92,185,120,149, 40,216,
+ 36,233,245, 40,205,128, 44, 74, 41,101,166, 86,241,178, 36,139,198, 68,113,206,161,147,143,241,232, 39,190,202,212,243,146,141,
+ 87, 97,112, 21,182,238, 92,100,115,243,101,188,254, 26,145,183, 75, 18, 28,176,119,243, 37, 90,211, 39,121,242,153,255, 21,111,
+188, 65, 20,244, 56,124,223,231,249,141,111,255, 47,248, 23, 28,174, 94,248, 22,166,225, 80,117, 12, 6,227, 24, 97, 86,208,179,
+ 29,116, 57,160, 49,255,136, 18, 86,153, 21, 28,183, 65,174, 85, 41, 75, 23, 97, 84,113,170,179, 56,181, 22,186,238, 80,171, 58,
+ 84,170, 54,186, 97,146,187,130, 34,204, 41,164,100,247,234, 95, 50,216, 62, 79, 81,164,184,149, 54,150,161, 97, 56,109,100, 17,
+145,166, 49,142, 40, 73, 34,159, 36,236,225, 15,238,112,239, 19,191,206,199,255,197,215, 56,246,165,167, 89,174,189, 8, 69, 3,
+175,127,131, 44,233,145, 36, 93,194,241, 14,121, 30, 99,218, 46,134, 89,193,176,218, 84,234,179, 52,235, 71, 40,114,155,234, 92,
+140, 85,198,108,110,239, 49,187,188,192,217,167,158, 36,183, 10,252,237,144, 66,115, 49,244, 42,121, 98, 48,222,141,105, 44,148,
+228,118,137,203, 10,134, 93, 65,232, 18,179, 17, 35,162, 49, 90,169,126,183, 45, 75,157,170,202, 92,137, 85,163, 40,156, 4,152,
+168,196, 71, 41,164, 18,112,150, 37,149, 74,133, 48,140,137, 99,197,104, 40, 41,137,162,148, 90,173,170,206, 20, 82, 34, 12, 77,
+ 5, 9, 73, 40, 39, 66, 58,149,144, 25,145,102,202, 1, 84,102,114, 82, 68, 53,146, 84,221,243, 85,115,160,220, 45,119,195,183,
+164,144,216,150,129,105, 88,152,134,161,248,239,186,129,169,171,120, 87, 93,168,247,118, 94, 72,162,192, 39, 78, 99,181,249,146,
+ 26,154,132, 48, 74, 73,147,152, 34, 43,168, 55,235,100,105,166,166,233,201, 93,221,212, 84, 74, 92,148,166,216,150, 73, 89,230,
+104,134,162, 41,102, 89, 66,154, 23,228,121, 74,158, 37,234,107,141, 83,197,147,144, 37,113,156, 82,169,186,100,121, 76,181, 82,
+ 65, 51, 84, 30,136,105, 42,141,141,107,171,191,155,134,137,174, 41,109, 66, 28,199,232,179, 11, 11, 95,183, 76, 91,217,161,178,
+ 28,211, 86,201, 53,142,109, 83,173,215,149,194,110,194,204,181, 76, 19,203, 48, 9,116,155, 47,204,231,156, 91, 27,208,170,185,
+140,147,140, 90,171, 66,104, 86, 57,212,118,217, 30,132,188,183,175,236, 8,166,105,226,104,176,168,249, 36, 81,193,153,101,135,
+191,184,145, 19,134,202, 71,235, 58, 46,182,171,160, 31,121,150,168, 9, 92, 55,168, 76,132, 5,105,148, 96,219, 38,182,101,127,
+ 96,245,210,117,141, 52,141,149,159, 88,215,208,165, 64,119,212, 29,185,226,222, 21, 97,232,100, 69, 14, 40,149,163,169, 43,165,
+ 99, 24,197,188,181,149,113,110, 92,225,228, 74,131,133,186,206, 70, 63, 32, 78, 11,230, 23,167,104,182, 45,242, 56,199, 50, 52,
+202,170, 73,171, 83, 67,160, 19,102, 5,157,150,133,149,231, 8, 41,233, 71, 9,110,161,196, 89, 94, 24,227,197, 41,251,195, 24,
+ 47, 77, 40,203,140,208,243, 40, 74,137,227,184, 20,105, 66,236, 7,212, 42, 46,171, 39, 79,160, 59, 14,123,155,155,248,121,130,
+135,193,172,169,177,220,168, 83,175, 90,108,244,250, 88,162,100,106,177, 73,112,101,159, 43, 87,186,116,111,141, 48,198, 1,149,
+133, 38, 98,125,204,250,205, 30,205,169, 42,138, 8,162,129,173, 35, 44, 19, 81,106,224, 8, 68,213, 86,147,185,107,192,173, 17,
+127,254,173,243,188,116,109,143, 71, 14, 79, 33, 53, 13, 97,107, 80, 72,174,253,232, 38,223,120,121,141,211,135,106,124,252,233,
+123,185,179,214,163,229,216,104,182,206,247,190,249, 14,155,155, 3,108, 10,142, 31,158, 38, 14, 51, 42,142, 69,197,177, 41, 26,
+ 85,230, 90, 53, 94,238,135, 72,199,228,206,126,192,194, 98,147, 90,127,139,206,241,101, 78, 28, 91, 38, 11, 83, 58,182, 70,255,
+198, 38,169,110,112,232,233, 71,185,112, 99,151, 13, 75,167, 55, 78,209,133, 84,133,213,178,200,194,140, 99,171,211, 76,205, 55,
+120,243,226,174,226,166, 87, 92, 70, 61,143, 91,126,204,157,131, 62,211,117,139, 69,199, 98,237,218, 54, 11,135,167,216,219,236,
+ 49, 43, 35,204,163,115, 36,255,233,255, 33,217,220,161,123,144,209,120,234, 65,120,230, 89,120,246, 19,252,204, 11,247,241,179,
+243, 14, 43,185, 71, 61, 25, 33,211,136, 97,191,199,130,145, 49, 8, 18,106, 90,193, 82,171, 74,187, 98,145,100, 5,113, 81, 2,
+ 10,192,100, 24, 10,226,195,228, 14,122, 55,154, 88,197, 55,104,170,176, 79, 2,110, 20, 48, 3, 64,160,107,224, 58, 46,213, 74,
+133,102,163,142,101,169,135, 67, 16, 69, 28,244,250,120,129, 15,104, 88,134, 66, 48, 23, 69, 78,197,117, 57,123,234, 94,158,126,
+236, 17, 62,247,137,143,161,235, 6,223,121,233,101,222,120,231, 28,131,177,199,217, 83,247,112,230,222, 19,220,127,234, 30,222,
+126,239, 34,127,253,202,171,188,117,254, 2,179, 83, 29, 62,254,196, 99,220,115,228, 8,149,138, 75,153, 23, 92,186,126,147,205,
+157, 93,224,238,198, 75,240,210,107,111,240,206,197,203,204, 78,117,248, 87,255,248, 31, 18,197, 49, 63,252,241,235, 32, 4, 27,
+ 59, 59, 12,198, 30, 66, 8,126,238, 51, 63,195, 63,255,239,254, 1,191,246, 11, 95,230,193, 51,247,114,227,230, 58, 35,207,195,
+ 11, 61,118,118,187, 31,232, 15,158,123,242, 35,252,202,215,190,196,247, 95,254, 9,223,123,229, 85, 46,221,184,205,181,155,183,
+ 24,251, 62,255,226, 31,253, 54,135, 22, 22,232, 15, 71,244,135, 35,214, 54,182,184,122,123,141,115, 23, 47, 3, 48, 55, 61,197,
+220,204, 52,166,101, 81,117, 20, 27, 99,228,143,233, 14,134,140,198, 62, 73,154,242,225, 7,207,242,244,163,143, 48,213,110,225,
+ 24, 58,119,122, 35,250,131, 30,100, 26, 81,156, 35,243, 8, 93,207, 8,130, 49,113,150,145,197, 67,186,251,111, 19,133, 62,133,
+215, 35, 60, 56,160, 98, 37,236,109,223,161, 72,250, 68,221, 30,237,165, 19, 68,221, 29,100, 89, 32, 44, 3, 33, 74,242,100,204,
+244,161,227,140,123, 58,225,218,105,134,221,125, 54,110,157,103,119,235, 77,130,225, 29,198,189,107, 12, 55,223, 33,142,251, 28,
+127,236,215,120,224,163,255, 45,143,252,163, 21, 30,248,249, 51, 92,251,206, 26,130, 49, 95,252,226, 41,194,222,135,248,201,119,
+254, 55, 12,219, 66, 24, 22,150,227,224, 15, 70,244, 61,143, 48, 12, 88, 58,114, 63,245,214, 81,194,193,117,102,166,151,152,155,
+110,211,104, 55,104, 55,154,232,174, 67, 22,101,160,169,130,163,153,166, 34, 56,230, 32,243,132, 48,136, 41, 74,137, 48, 12,236,
+106,139, 95,249,157,119,241,178,140,237,155, 63,161, 76,124,164, 86,165, 49,125,134,157,219,239,114,235,226,183, 8, 6, 87,104,
+180,151, 8, 46, 85,232,191, 62,102,224,117, 57, 88,123,141,254,254,121,133,139,213, 43, 52,167, 79,210,158, 62, 67,169,149,144,
+ 7,202,131, 93, 42,248,152,208, 42,140,118,186, 44, 28,113, 24,116,251, 68,105, 74,103,254, 4, 75, 71,143,227, 37, 59,196, 59,
+133,154, 22, 77,131, 44, 41,137,251, 41,213, 78,140, 72, 58,104, 78, 7, 93, 70,248,250, 30,101,232,227, 31,108, 35,132,138,151,
+174, 84, 42, 36,121, 66,158,229,212, 42, 85,188, 96,140,105, 90, 56, 21,135,162, 40, 48,109,149, 61,145,166, 41,213,106, 5,109,
+178,150, 79, 39, 96,151, 44, 79,113, 44,231,131,213,120, 81,128, 99,153, 10,142, 36,149,232, 21,193,100,216, 83,182,105, 77, 8,
+149, 94,166,105, 88,134,137,208, 76, 36, 18, 75,179, 16,154,142,102, 42, 1,163,208, 84,224, 82, 81, 40,166, 73, 57, 41,180,149,
+170,114, 90, 37, 89,250, 1, 35, 66, 9, 0, 37, 89,150,160,233, 2, 77, 83,175,155,122, 0,168,122,150,166, 25, 66,168,231, 66,
+156, 36, 10,106, 35, 37,134,110, 42, 93,152,102,168,211,131,110,146,164, 42, 23, 64,215, 13, 37,116, 22,144,165,201,100,157,175,
+147, 37,169,226,220,151, 96,155,186, 18, 7, 26,138,105, 31,133,209, 7,254,246,187, 86,105,195, 52,209, 15, 31, 59,254,245, 48,
+142,168,212,234, 84, 92, 87, 5,125, 56, 46,150, 99,163, 78,140,130, 56,141,209,133,142,110, 26,164,121,193, 48,130,199, 86, 76,
+ 66, 63, 32,205, 75, 90, 51,109,118, 47,223,164,182, 56,199,242,180, 75,197, 16,252,231,243, 93,213,209,148, 37,131, 40,229,225,
+106, 72, 82, 72,202, 34,102,108, 54,217, 28, 68, 56,142,178,185,105,104,120,222, 24,132,134,101,216, 24,150,202,251,142,162,136,
+106,173,138, 97,152,132, 81, 68,158, 39, 31,172, 48, 16, 66,117, 41, 19,165, 55, 20, 80,170, 20,157,188, 40,200,211,156, 44, 87,
+107,125, 77,155, 8,152, 12,117,195, 42, 37,236,247, 61, 94,186, 25,177, 85, 58,252,204,125,211, 20, 89,202,216,139, 17,133, 96,
+126,101,134, 36,138, 41,122, 1, 50, 43,168,216, 26,118,179,138, 81,148, 36, 93, 15, 41, 36,251,195,144,181, 81,192, 40, 72,104,
+ 84, 45, 92, 75,167, 98, 27, 56,134,192,176, 4,110,205,193,170, 58, 4, 67,143, 36,203,209,144,152, 26, 76,181, 58,132, 99,143,
+245,245, 93,170,121, 74,165,204,112, 53,147, 90,171, 65, 30, 39, 68,131, 62,119,194,140,107, 23,182,184,121,179,139, 17,230,244,
+ 70, 1, 87,135, 17,103,102,218,196, 67,159, 45, 47,101,126,181, 13,142,142,220, 77,184,252,211, 77,204, 81,136,187,218, 68,244,
+ 50,174,191,177,198,173,247,247,185,125, 99,159,191,249,193, 21,230,155, 22, 95,250,236, 25, 88,168, 33, 28, 29, 17, 22,252,213,
+ 95, 94,224,234,149, 61, 62,247,208, 34,139, 79, 28,231,181,239, 95,229,237, 43,251, 76, 89, 37,242,192,227,234,251,187, 76, 55,
+ 29,170,205, 58, 51,115, 13,110,173,117, 81, 57,221, 14,107,123, 49,203, 71,103, 40,198, 1, 91, 94, 73, 24,103,172, 30,158, 70,
+120, 33, 23,174,239,115,242,145, 83,204,206,119,200, 70, 62,236,109,176, 59, 78, 89,152,169, 49, 16, 38, 94,223,231,190,134,201,
+244,116,131,165,197, 22,185, 38,152, 89,104, 50,213,116, 89,219, 26, 96,100, 57,211,117,139, 65, 82, 82,169, 85,216,222, 15,152,
+173, 89, 56,148, 92,218, 30, 81,111, 86, 57,216, 30,179,230,197,220, 90, 91, 39,250,201,247,185,248,250, 57,174,172,141,240, 6,
+ 41,199,142, 31,133, 99,159,130,198,115,208,121, 26,253,100,147,229,211, 54,247,127,248, 56, 31,121,236, 4, 79,205,215,232,246,
+ 60,244, 60,225,100,219, 98, 94,100, 44, 53, 52, 78,205,213,153,106,214, 40, 74,240, 19,117,215,211,244,187,171, 54,141,188, 84,
+ 62,255,187, 69,190,148, 42,136,197,178, 76,144,168, 53,119,179,142, 16, 74, 56,119,245,246, 29,164, 44, 97,114,219, 46, 81, 15,
+161,254,112,248,193, 42, 49,138, 18, 86,151, 22, 57,121,252, 24,179, 83,109,142,175,174,224,216, 22,255,230,223,253, 9,223,248,
+139,239, 50,246, 3,190,240,201,103,249,248, 71, 30,101,121,113,158,222, 96,200,239,253,193,191,229,253,107,215,121,242, 67, 15,
+241,137,167,158,228,236,169,123, 56,178,188,196, 56, 8,184,116,237, 6, 63,121,243, 29,238,170, 4,166, 90,109, 92,219,100, 52,
+246, 57,113,116,149,127,246,219,191,201, 67,103, 78,241,111,255,228,155,252,229,143, 94,225,141,243, 23,185,118,227, 38, 66,194,
+ 63,253,173,223,224,119,254,201,111,177,176, 56,199,168,215,103,111,175, 71,163, 89,195,243, 3,110,175,111, 79,154, 17,120,248,
+190,211,124,250, 99, 31,101,182,211,230,252,165, 43,108,237, 29,208,105,214, 9,227,132,189,131, 30,207, 60,250, 33,142, 31, 94,
+102, 48,242, 72,226,132,115,151, 46,243,202,155,111,115,208,235, 3,202,146,179, 48, 61,205,194,220, 12,142,107, 79, 30,148,146,
+225,216,155,104, 6, 36,171, 75,139,104,154, 96, 48,244,216, 61,232,178, 55, 10,241,163, 16,145,166, 8, 67, 35,244, 14, 48,117,
+159, 36, 76,200,227,128, 52, 29, 19, 5,125,130,241, 26,142, 46, 9,188, 17,245,186,133,150, 14, 9,130, 30, 69, 33,104, 47, 62,
+128,187,220, 36, 30,122,100,129,175,238,235,148, 4,131, 3,156,154,206,254,230, 85,226,184,139, 55,188,134,215,189,141,105, 55,
+153, 95,122,134,246,242,199,153, 89,250, 8,149, 70, 27,153,103,220,121,115,196,246, 91, 16,244,118,185,179,241, 71, 92,123,185,
+195,143,191,247,175, 41, 11,143,208, 27, 80,171, 53,105, 55, 27, 52, 38,147,101, 28,134,116,183,175, 50,218,191, 76,156,131,211,
+152,161,221,110, 80,106, 26, 66,215, 57,216,239,210,106,181, 73,211,140, 36,205,104,212,219, 8,145, 17,199, 41, 65, 24, 81, 74,
+129, 38,192,208, 52, 42,109,139,141,235,111,178,119,251,199,100,101,159,113,127,135,231,190,252,251,252,230,255,245, 15,248,189,
+127,242, 11, 44, 63,252,219,200,252, 44,221,225, 59,248,227, 62,227,131,107,244,182,222,102,180,243, 54, 73, 52,166, 57,119,134,
+206,145, 39, 88,185,247,147,180,155, 39, 16,134, 75,156,142, 33, 25,147,167, 99,146, 34, 65, 19,130, 48, 74,145,254, 8,183, 37,
+ 24,132, 30, 34,211,240,215,218,216,149,125,198,187, 33,101, 89,193,210,116, 48, 12,178, 72, 98,215,199,152, 98, 10, 3,151,146,
+148, 76, 59,128,196, 39,233, 30,160, 25, 58,154, 80,133, 19, 9,174,237, 40, 36,121, 81,144,229, 42,246,216,182,109,242, 36,157,
+ 56, 74, 84,161, 69, 67, 13,145,150, 69, 94,170, 76,118,169,196, 40, 72, 41, 40,100, 73, 94, 40,107,155,178,158,161,200,115,154,
+138, 33, 85,170,122, 99,114, 27, 55,144, 18, 74, 89, 32, 21,250, 1, 77,215,208, 80,193, 77, 66,232,147,134, 70,229,146,255,173,
+ 0, 85,144,164, 9, 69, 89, 78, 44,103,106,139, 13,106,218,215, 52, 93, 21,225, 76,109,154,117,221,192, 48, 13, 44,211,192,180,
+237, 73, 3,144,147, 77,116, 52,174,235, 16,248,170,113,213, 53,227,131,134, 64,137,201, 77,194, 64,157,221,234,245, 58, 26,154,
+218, 64,219,206,228,255,223,165,240,133,200, 82, 53,235,166,165, 80,186,192, 7,193, 65,101, 81,160,207,175,172,124,221,118, 28,
+100, 89, 2, 18, 77, 24,228,121, 78,158,229, 56,142,139,148, 82,101,170,203,156, 56, 80, 68, 28,219,182,217,142,117,190,112, 76,
+231,218,246,152,249,169, 42,254,126,159,199, 87,235, 76, 47,116,208,164,228, 74, 31, 34,148, 87,208, 52, 76, 78,184, 49,213,138,
+ 73,106,187, 76,215, 13, 94, 95, 87,162,185,172, 80, 62,190,178, 80, 43,152, 36, 85, 84,179, 18,144, 66, 39, 75, 19,101,243,178,
+ 20,161, 71,215, 13,245,131,207,239, 50,168, 53, 37, 54, 50,149,242, 60, 47, 11,178, 52,166, 20,146, 34, 85, 34,191, 34, 77, 40,
+100, 73, 24, 5,148, 69,134,208, 52,116, 20, 92,127,125,207,231,219, 87,125,124,105,242,212,153, 89,178, 50,103,119,103, 0,182,
+193,244,202, 20,141,153, 6,133, 23, 50,218, 29,147,248, 41,211, 43, 83, 84,166,154,220,220, 25, 17,164, 25, 13, 91, 80,119, 77,
+156,138, 69,197,182,212,246, 32,203,137,251, 35,226, 4, 6,101,134, 38, 75,116, 75, 50,242, 50, 70,158,199,112, 52,162, 82, 53,
+240,199, 33,102,163, 74,165, 83, 99, 60,244,201,226,152,110, 63,160,145,197, 52,243,140,218, 84, 29,183,102, 81,198, 49,185,161,
+115,103,167,207, 91,155, 1,155,195,152,147, 14,156, 63,183,197, 79, 94,187, 69,127,119,136, 39, 74,166,242,156, 63,251,254, 85,
+ 6,155, 35, 60, 47,226,212, 74,139,103, 62,121, 31,171, 79, 29, 67, 4, 37,201,122, 23,163,208,248,209,119,207, 83,244, 2, 76,
+ 75,163, 95,113, 56,247,211, 77,210,141, 46,245, 50,227, 96, 16,131, 99,171,160,133,161,207,212,161, 54, 69,156, 49,142, 82,144,
+ 16, 69, 25,134, 33,184,190, 61,160,234,152,104, 82, 50, 70,144,231, 25, 31,251,240, 41,174,158,187,136,239,212, 89,152,111,147,
+ 68, 17, 55,126,122,153,177,229,114, 97,237,128,135, 31, 59,205,153,185, 22,199, 78,206,177,124,255, 9,102,141,156,235, 91, 67,
+210, 65, 68,144,151,244,187, 33,113,160,104,122,154,109, 81,107, 59,116, 26, 54,174, 16,120, 81,134, 68, 39,136, 82, 68, 81, 16,
+106,170, 75, 46,139,132, 78,205,165, 82,183, 9,178, 28,111,109,143,197,108, 4,167, 62, 10,154,137, 22,189,206,249,255,227,155,
+ 44,124,241,211,136, 7,190,132,245,212, 23,120,240,133,179,124,178,161,177,190,182,131,159,230,204,184, 58, 29, 81, 82,205, 67,
+ 74, 4,141,218, 4,136, 36,117,132, 38,144, 69, 65, 86,228, 19, 37,109, 78, 81,228,184,149, 10,160, 44,112,165, 84,226,206,177,
+ 31, 50, 24,143,137,146,152, 90,165, 66,165,162,172,153, 97, 20, 50, 24,141,217,222,221, 39,140, 99,142, 29, 94, 38,140, 98,162,
+ 36,102,106,170,205, 67,247,157,230,185, 39, 31,231,145,251,239, 99,107,239,128,215,223, 61,207,237,141, 77,166, 59, 29,158,121,
+252, 67, 60,120,223,105, 90,173, 6, 63,122,253,167,188,115,241, 18,247, 28, 61,194,115, 79,126,132, 71,206,158, 97,101, 81, 77,
+197,215,111,221,230,251,175,190,201, 96, 60,198, 52, 77, 78, 30, 59, 74,187,221,226,218,173, 53, 78,158, 56,198,127,243, 11, 95,
+225,171, 95,126,129,171,215,110,112,103,115,155,245,173, 45,110,222,217,224,240,161, 69,254,217,111,255, 38, 95,125,241, 11,148,
+105, 14, 89,129, 38, 37,215,110,221,226,246,250, 38,151,111,220,226,250,237, 53, 0,154,245, 58, 31,121,248, 65,158,122,244, 67,
+ 12,125,143, 11, 87,174,225,123, 42, 29,235,190,147,247,240,196,135, 30,228,197, 79, 61, 15,154,248, 32, 21,238,210,245,219,188,
+254,206,185,137,183,216, 85,216, 78, 83,217,128,154,141,154,178,241,221,186,195,198,246, 14,131,209,152,133,185, 89, 58,157, 54,
+ 65, 20,179,181,187, 75, 20, 39, 32,116, 66, 33, 72, 14,186,104, 89,132,209, 60,142, 86, 6,228,233,128, 44,141,137, 34,159, 34,
+ 29, 17,238, 95, 35,246,251,204, 44, 46,112,208,235, 18, 91, 18, 35,207,169,212,143,242,194, 47,254, 49,187,187,151,105,157,232,
+ 80, 95, 58, 68,216, 29,145, 39, 62,121, 22,145,250, 93,234, 13, 73,119,227, 10,195,253,107,164,209,136, 19,143,254, 18, 63,247,
+123, 47,242,236,175, 60,196,199,191,242, 32,121,247, 44,183, 47,191, 69,111,253, 77,182,175,124,135,225,254, 85,138,168,228,210,
+ 79,255,119,178,224, 54,178,180, 65,183,240,189, 33, 73,156,147, 21,106,245, 91,173, 85, 17,186,198,104, 52,166,226, 24,232,166,
+134,109, 25,120,253, 46, 73, 18, 17,199, 41,163,209, 46, 69,154, 32,101,134, 83,169,160,107, 26,190,231, 83,150, 32,144,104,134,
+114,224,136, 76, 16, 12,239,144, 37, 30, 97,175,203,225,211,159,227,211, 95,253,167, 20, 35,104,175,130,223,134, 67,206, 49,174,
+ 92,188, 68,111,251, 45,226,104, 31,175,123, 29,127,112,155,250,236, 9,102, 15, 61,138,237,180, 8,134,123,244,187, 23, 8, 70,
+183, 72,199, 7,228, 69,136, 46, 82,226, 36, 32,139,199,100,177, 79, 20,244,168, 84, 11, 6,131,144,188,240,240,182, 60,178,112,
+131, 44, 2,221,106, 82, 0,162,132,178,204, 8, 6, 61,154,171, 2,173,152, 35, 75,125, 34,185,133,136, 67, 68, 48, 34, 73, 19,
+ 28,219, 37,142,212, 68,154,164,202,226,230, 86,149,239, 59, 12, 67, 52, 77,113, 16,202,178,192,243, 60, 60,207,131,178, 68,232,
+ 10,213,166, 9,129,134,178, 59,234,134, 65, 57, 33,187,149, 37,228,185,162,127,102, 89,174,138, 54, 32,229,196, 90,154, 42,180,
+121,158,151,164,105, 70,158, 23,228,185, 66, 39,167,169, 90,115,167,105,142,161, 41, 13, 22,168,252,242,178, 84,144,175, 44, 83,
+ 81,169,150,169, 10,110,165, 86, 67,215,197,132,249,174, 54, 1, 69, 41, 49,116,161, 82, 15, 45, 53,105, 43,135, 67, 73,153,103,
+184, 78, 5,219,177,112, 28, 7, 74,229, 52, 65,211,208,144, 19,253,136,114,213, 24,154,129,166, 43,197,187, 97,168,116, 54, 67,
+ 40, 7, 75,197,117,201, 10, 5,206, 17, 66,213, 66,197,208, 80, 65, 95,213, 90,131, 44, 75,112, 39,140, 23, 67, 2,134,105,226,
+ 58, 46, 57, 37,102, 81, 78, 10,188,192, 15, 2,106,213, 42,194,210, 16,165, 64,119,117, 60,223, 35,207,114, 46,237, 21,120, 39,
+ 26, 52,221, 1,222,238,144, 71, 30, 56,130,183,191, 71,253,244, 49,204,170,206,175, 62, 82,227,127,122,105,196, 48, 41,144, 6,
+ 68, 82,103,144,150,184, 54, 44,212, 20,134, 47,207, 85,180,168,242,162, 23,164, 89, 73, 24,250,140,199, 30,154,174, 81,173, 86,
+177, 28,149,249, 29,140,199,220,141,197, 44,203,146, 82,149,125,242, 60, 39, 41, 37, 50,138, 0,129,101, 89, 32,149, 13,161, 40,
+115,100, 33, 85,179,146, 40,111, 56,154,160,234, 58, 0, 20,121, 65,106, 91,164,105,204, 27,251,112,237, 71, 49,159, 57, 82,229,
+211,103, 58,172,175,239,113,123, 99, 68,167, 97,211,153,233, 96,152, 54,221,173, 17,149,237, 62,237, 67, 83,180,170, 46,145, 31,
+ 81, 17,130, 44,136, 41,100, 78,156, 65, 81, 66,221, 49, 41,132, 78, 82,100,108,238,121, 28, 94,104, 35, 76,141, 66, 43,241,163,
+128, 78,179, 74, 41,116,220,233, 38, 82,147,148, 69,142, 81,209, 17,169,202,124,239,231,146,150,107, 82,213, 74,250,221, 49,190,
+132,162, 98, 96, 69, 5,117, 77,195, 74, 18,190,245,195, 27, 8, 89, 80,113, 29,244,154,197, 65, 40,121,233,181,219, 84,130,152,
+ 76, 55, 40,220, 10, 75,167,151, 16, 83, 14,189, 55,110,243,202, 79, 55, 72,210,156,168,225,208, 26,248,180,108, 21,247,186,221,
+ 75, 88, 24,141,232, 88, 58,251,185,192,148,202, 69,160,233, 58,153, 97,224,216, 22,221, 94,128,110,185,168,173,125,137,227, 24,
+136,168, 32,117, 93,202,241,152,147,182,132, 48,230,245,181, 61, 62,253,165, 79,241,159, 94, 57,207, 67,103, 14,227, 11,131,113,
+161,241,233,255,242, 5,254,228,247,191,193,171, 23,183,120,225, 83, 31, 66, 72,137,220,223, 99,107,119,140, 63,140,153,153,111,
+208,104, 85, 57,216, 29, 97,153, 38,195,184,224,212,170,203,246,251, 59,232, 53,139,123, 31, 92, 66, 20, 26,253,222,152, 52, 47,
+ 25,237,122, 10,219, 91,171,178,237,123, 20,150,201,120,127,196,122,162,172, 39,143, 20, 33, 34,185,138, 52,102,144,175, 95, 96,
+237,202, 22,103,175, 13,144, 79,157, 70, 24, 77,164,251, 16,226,203, 53,126,233,200, 20, 63,252,247, 47,113,241,122, 23,199,200,
+200, 42, 58,149, 97, 72, 63, 78,168,219, 46, 58, 25,253,220, 64,104, 58,182, 1,210, 84, 55,188, 52, 43, 25,141, 60, 58,173, 6,
+165, 4, 81, 22, 20, 66, 0,106,162,200,114,157, 40, 73,232, 15,199,148,185,234,242, 43,142,133, 62,213,230,232,202, 33,142,173,
+ 30,230,175, 94,122, 5,128, 99, 43,203,124,236,209, 15,113,234,196, 49,202, 66,242,147,183,222,230,214,198, 6, 0,171,135, 22,
+169, 84, 42,236, 29, 28,176,185,187,207,159,124,251, 47, 57,122,120,153,207,127,226, 89, 78, 30, 63,202,202,226, 60, 97, 20,211,
+ 31,142, 57,119,233, 42,107, 27,155, 88,150,197, 35,247,159,166,217,168,243,250,219,231, 89,152,157,225,103, 63,249, 44,159,255,
+196, 51, 12,119,247,185,112,249, 26,123,251, 7,120, 81,204,195,247,157,230, 75,159,253, 20, 47,126,230,121,132,174, 83,166,202,
+ 98,227,135, 33, 81,156,176,187,223, 85, 74,225,201,199,116,167, 69,156,198, 8, 93,176,190,185, 77,163, 86,227,228,241,227,236,
+247,187,152,186,206,226,220, 44, 67,127,140,208,116,198,190,207,214,222, 1,239,189,127,233,131, 88,215, 32,140,168,215,170, 76,
+181,219, 44,205,205, 80,115, 29,182,247,186,244,199, 99,110,175,111, 80,173,184,180, 26, 13,246, 15,122, 56,182, 42,252, 85,215,
+ 1,203, 98, 99,111, 64,158, 69,180, 78, 30,103,230,208, 71,177,153, 98,253,253,127, 67, 52,186, 65,146, 22,132,227, 62,121, 89,
+178,124,250,115, 84,235, 45,130,225, 55, 72,210, 6,166,158,178,250,212,175,115,244,239, 9,222,121,231, 20,251,201, 62, 78,189,
+198,189,159,253, 2, 87,254,244, 63,144,101, 17,195,222, 38, 92, 53,104, 77,205, 97,102, 33, 65, 82, 80, 90, 29,178,169,140,170,
+ 12, 57, 35, 42, 92,122,222,196,120,165,134,231,175, 19,141,118,176, 43,211,156,122,228,215,184,169,213,185,241,222, 31,115,230,
+153,255, 2,167, 58,205,141,183,254,144, 40, 30,146, 23, 46, 66, 40,225,146, 97, 25,212,106, 21,108, 75, 71,228,146, 60,151,212,
+107, 53,134, 35, 15,199, 54,208,169,128,102,145,197, 17,161,239, 97,187, 85, 74,169,161, 91, 6,134, 6, 21,199,161, 36,167, 72,
+ 50,138, 82,146,164, 5,102,109,134, 7, 62,254,247, 89,191,147,178,181,105,114,241, 85, 65,150,198, 4,209, 85,252, 96,143,254,
+157, 31,163,145, 19,197, 30,102,117, 14, 74,131,193,206, 57,208, 13,202,188, 36, 13,251, 68,209, 1, 50, 79,112, 43, 85, 74, 97,
+ 80,228, 35, 10,125,164,222,255, 34,167,162, 57, 56,142,134, 63, 24,224,104, 17,123, 63,189,129,125,104,150,165,206, 17,162, 72,
+ 0, 9,121, 18,146, 38, 9,131,219,151,233, 44,156, 34,246,199, 36, 86, 68, 11, 65,130,160,200, 36,165,165,208,214, 89,154, 41,
+248, 74,213, 69, 74, 65,152, 69, 56,150, 74, 74, 43,178,156,161, 55, 84,194,213, 82,145, 72,117,223,167, 86,171, 98,219, 14,134,
+105,226,104, 6,165,204,209, 52, 73,158, 42,231, 70,153, 43,114,155,101,169, 13,111,158, 38, 36,153,164, 90,173, 1,234,253,170,
+ 9, 40, 75, 0, 57,217,208, 40,186, 91,148, 36,184,147, 65, 44, 77, 99,116,221, 32,207, 21,200, 69, 8,129,169,171,216,112,203,
+208,208, 52, 3,128, 52, 43, 73,100,138,107,155, 68,147,162,138,166, 97,152,146, 56, 84, 40, 91, 77,131, 92, 66,181,226,226, 5,
+ 62,150,105,226, 56, 14, 97, 24, 32, 75,168,214, 92,202, 82,113, 43, 12, 93,167,200,115,188,201,196,109,234, 58,225,228,253,146,
+ 20, 49,186,174,166,121, 83, 55, 24,141,198, 72,160, 81,107,144, 21,202, 98,234, 86,106, 72, 89, 82, 20,146, 32,136,148,103,125,
+241,240,225,175,151,101,169,216,236,121, 73,145, 42,114, 13,154, 90, 47,198, 81, 68, 26,197,234,182,145, 43,248, 73,156,196, 36,
+113,204,133,177,193, 11,167,234, 92,223,232, 50, 85,177,121,236,193,163, 92,127,245, 45, 22, 31, 57,205,146, 9, 81,154,113,117,
+164, 99, 11,248,204,124,204,238,182,207,176,144,216,134,198,251, 97, 93, 37,146, 25, 10,145,154,102, 41,134,101,225,218, 54,201,
+196, 74, 99,219, 14, 97, 28, 77,190, 73, 37,128, 51, 52,109,178, 94,209,208, 13, 37,104, 80,221, 21, 8,161, 97,232, 26,134, 97,
+160, 27,218, 7, 47,166, 99, 43,191,123,165, 82,193,182, 76,242, 44, 67, 72,197,224, 46,242,140,138,171,186,227, 36, 45,120,111,
+ 55,229,135,155,146,138,107,112,246,136, 75,146, 73,182,246, 61, 12, 67, 99,102,182, 73,123,177, 73,212,247,104, 38, 9, 53, 71,
+ 67, 68, 25,113,152, 82,100,146,221, 32, 37, 13, 34, 74, 93,167, 90,181,209,117,131,153, 86,133,154,173,225,186, 14,162, 40,168,
+213,212,138,102,184, 55,100,148,230,100,210,192, 21,106,141, 35,100,161,114,235,115,137, 38, 5,169,148, 56,186,142, 35,115, 60,
+215,198, 74, 50,156, 60,167, 76, 11,218,115,117, 62,250,225, 21,110,247, 85, 80,142, 22, 5,180,211,152,214,124,135,143,125,254,
+ 33,156,162, 64,248, 17, 87,126,186,206,133,247,182,176, 76,157,170, 44,105, 70, 41,109, 87, 99, 92,104, 28, 62,185, 64, 49, 14,
+ 49,146,132,113, 86,160,139,146,220, 50, 97,228,179, 61, 8,201, 36, 20,125,143,250, 84,147,222, 40,196,180, 13,116,205, 68,215,
+193, 15, 18, 42, 89,130,158, 36,236, 7, 5, 50,202,240,227,156, 99,247,204, 19,103, 37,237, 86,149, 97,152,241,167, 63,188,202,
+126, 16,179,229,229, 88,105,128,214,238,240, 87, 63,186,192,189,179, 21,218, 71,150,184,190,209,195, 49, 13,206,221,220,163,229,
+ 86,240,227, 8, 27,112,171, 14, 32,217,217, 15,209, 77,131,205,245, 33,155, 7, 35,102, 90, 14,129, 31, 18, 21,130, 76,104,244,
+198, 49,227,177,143, 7, 44,206,212,177, 50, 73, 25,140,152,126,226, 48,232,109, 56,246, 12,237,141,119,248,241,203,239,176,228,
+ 93,193, 60,162,163,229,219,176,127, 17, 49,244, 89,125,238, 97, 30,251,149,231, 57, 43,116,246,182,246, 9,163,152,134, 13,165,
+ 48,153,157,238, 32,202,148, 40, 43,136, 11,165,212,189,203, 78, 7,197, 77,215, 13,117,119,215,117, 29,161, 43, 48,132, 40, 21,
+ 37, 48, 12,194,137,216, 78,195,212,117, 6, 99,159,191,243,149, 47,210,110,214,185,120,245, 58, 97, 28,243,169,143, 61,205,145,
+213, 37,242,188,100,107,127,159, 55,223,125,143,237,221, 61, 6,227, 49,135,151,150,152,238, 52, 89, 61,180,196,230,246, 46,183,
+214, 55,120,244,161, 7,104, 84, 43, 72, 36,157, 70,147,173,221, 61,222, 58,127,129, 87,223, 57,135,231, 7, 28, 59,188,204,220,
+204, 52,227,177,199, 65,111,192,223,249,202, 11,188,248,153,231,153,157,157,229,173,115,239,177,185,179,195,119, 95,250, 9, 81,
+ 28,115,108,245, 48,207, 62,241, 24, 71,151,151, 41,139,130, 96,228,145,229, 57,221, 94,159, 91, 27, 91, 28,244,250,172,109,109,
+211,157,100,160, 47,204,206, 43, 2, 62, 94, 0, 0, 32, 0, 73, 68, 65, 84,242,232,217,251, 88,154,155, 83,223,167,128,183, 47,
+ 94,130, 18,230,102,166,112, 93,135, 70,181, 78, 20, 70, 12,189, 49,175,253,244, 28,223,123,237, 53,144,138,151,191, 52, 63,199,
+253, 39, 79,112,255,201,123, 89, 89, 90,156,224,162, 75,188, 32,100,107,119,143,195, 75,139, 76,181, 90,104,186, 18, 39,105, 66,
+ 61,131,210, 52,102,125,171,139, 33, 37,179, 15, 63, 72,167,241, 8,199, 87,159,166, 54,253, 73,110,223,252, 46,197,240, 54, 78,
+115,150,179,207,253,207,172, 44, 63,135,219, 58,202,213,119,255, 12, 67,198,248,113, 76,163,174,113,251, 37,155,178, 16,164,189,
+ 46, 73,209, 3, 93,167, 98, 46,210,223,126, 31,205,118, 72,194, 49,131,131, 77,114, 89, 99,113,229, 56, 26, 41,214,246, 51,156,
+251, 27,155,239,252,233,144,183,191,241,231, 92,121,243, 95,147,120,123, 80,166,204, 28,122,140,163,247,127,142,207,127,237,107,
+ 44,172,126, 1,187,185,160, 20,250,211,139, 10,205, 26,121,128, 64,163, 36, 8,122,196,193,136,192,143,105,117,166,200,210,148,
+253,238,144, 40, 14,201,147, 20,219,210, 40, 53,157, 52, 11, 41, 10, 73,197,173, 81,115, 13,116,129, 2,166,136,130, 66,104,100,
+ 73,140, 31,133, 20, 69,129, 91,169, 49,183,250, 56,126,111,155,200,223, 97, 28,222,164, 31,190, 71,175,119,139,112,188, 70,165,
+115, 31,213,246, 41, 78,156,253, 42, 31,254,244, 31,225, 56, 14,221,221,183,240,246, 46,144, 4,251,228,193, 30,101,188, 15,153,
+143,208, 93, 52,189,128, 34, 34, 9,123, 20,201,128, 44,244, 41, 40, 89, 88,153,103,103,111, 15,167,217,164,109, 88, 88, 75, 77,
+234,167,230,200,246, 44,138, 44,166,200, 60,210,168, 71,153,239,209,158, 62,198,120,208,163, 48,134,212, 69,138,215, 61, 64, 22,
+ 57,113,170, 6, 46, 89, 74,220,138,139,105,152, 4, 97, 64, 89, 22, 8, 77,128,166,232,142, 97, 16, 97,234, 38, 73,166,182,130,
+160, 72,131,105,154, 98,232, 38,166,101, 18,199, 10, 33,156,101,249,100, 74,151,100,133, 36,207, 75,116, 3,116, 67,167,204, 75,
+202,162, 32, 77, 84,236,178,242,130,231,232, 19,189, 66, 65, 1, 37, 24,134, 58,129,100,105, 65, 81, 78,236,159,165,130,224, 24,
+186, 65,150, 41, 0,140, 68, 96,217, 22, 81, 28, 65, 89, 78, 28, 47, 74, 80,235, 88, 10, 44, 21, 69, 33, 69, 89,168,128, 45,211,
+ 84, 2, 64,169,134, 78, 41, 5, 81, 18,227,186, 46,182, 99,147, 23, 5, 81, 24, 33, 4, 84,220, 10, 89, 81, 82,173, 84, 20, 46,
+183, 90,197,182,108, 10, 10, 69,192, 43, 10, 5,194, 41, 75,132,208,201,178,148, 40,142, 84, 82,156,105,169, 51,130,174, 77,156,
+ 46, 10,208,163,207,175,172,124,221,152,172,175, 45, 91,125, 65,134,161, 83,202,146, 50, 83, 64, 20,203, 54,213, 93, 66, 64,146,
+198,232,154, 32,205, 10,162,180,100, 39,145,124,229,254, 38,111, 93,217,195,110,205,242,192, 35, 15, 19,159,127, 7,115,182,205,
+153,195, 13,186,113,201, 49, 57, 98, 78, 87,247,176,131, 97, 68,173, 94,225, 39,219, 37, 73,150,161, 25, 26,119,209,148,174,237,
+ 18,196, 49,245,122,157, 44,203, 20,245, 71, 87, 42,247, 40, 82, 29,161,162,237, 40, 46,119, 18, 39,148,148, 40, 72,141, 18, 68,
+ 68,161, 2,183, 40,241,130, 84, 91, 7, 9,154,174, 79,196, 11, 42,194, 47, 75, 51, 76,211, 32,138, 35,229, 3,212, 53,132, 6,
+186,174,211,239, 15, 57,183, 21,240,198, 70, 76,195,209, 56,181,210,160,148, 18,111, 24, 33,179, 18,167,221,192,157,107, 82, 38,
+ 25, 65,146,179,114,118, 21, 89, 22,108,237,140,209, 12,157,186,161, 97,186, 58, 69,150,163, 9, 69, 1,210,116,129,174, 43, 49,
+ 71,150,166,164,189, 17, 46,130, 86,167, 70,187,209, 84,185,227, 21, 3, 97, 27,148, 65, 66, 75, 47, 16, 89, 78, 32, 53,136, 83,
+ 42, 81, 70, 67,148, 52, 22, 58,196,227,152,177,161,177, 63, 8,177,135, 62,179,173, 58,233, 40, 96, 84,171,177,122,124,158, 27,
+239,222,225,234,141, 62,155,219,125,252,113, 68,211,212,105, 76,213, 40,210,148,217,154, 77, 92,106, 60,247,226,163,152, 81,194,
+214,206, 24, 89, 72, 66, 77,167, 51,221,160, 49,213, 32,139, 83, 74,199,160,165,149,152, 53,151, 60,205,240,125,149, 26,148, 38,
+ 25, 1, 58, 69,156, 83,198, 49, 34, 7,199, 54, 40,114, 69,101, 10, 10,201,153,229, 41, 54,250, 30, 39,142,204,243, 31,127,240,
+ 62,165, 31,240,234, 0,158,104,230,124,227,202,136, 63,125,233, 58,231,111,239, 67,150,114,122,105,138,235,251, 62,253,131,144,
+212,210,249,240,233, 89, 66, 9,241, 56,197,172, 91, 68,185, 34,162,137, 40,161, 86,183, 25,120, 9,139,179, 29,110,239,244,232,
+102,153,114, 81,196, 57,135,107, 14, 85, 91, 71, 23,202, 59,190, 82,152,112,246, 5, 48,103,112,179,219,124,255, 47, 95, 98,111,
+123,139,242,220, 5,166,155, 6,218, 92, 29,217,106, 35,151,159,135,169, 23, 49, 30,126,140,211,143,154, 44,140, 60, 94,185,176,
+ 13, 82, 61,112, 98, 97, 98,139,146,172, 4,169,169, 27,157, 16, 66, 5, 32,153, 38, 66, 66, 41, 4,119,185,206,186,161,131, 44,
+ 63,128,253,100,121,142, 44, 11,229, 29,215,117,190,242,185, 79,177,223, 31,176,182,177,197,200,243, 89, 89,156,167,226,186, 56,
+150,137,169, 27,116, 7, 3,206, 95,185,138,231, 7,156, 58,126,132, 99,135, 87, 40,100,201, 59, 23, 47,177,182,181,131,134, 96,
+186,211, 97, 97,118, 22,195,212,185,112,249, 26,239, 93,190,202,165,107, 55,152,233,116,120,226,225,135, 56,177,186,204, 96, 56,
+102,175,215,103,122,106, 74,165,183, 9, 65,152,196, 92,188,118,147,191,121,229, 85, 22,103,166,121,242, 67, 15,243,200,253,103,
+176, 77,147, 60, 75,241,130,128,131, 94,143,119, 47, 95,229,252,197,203,188,113,254, 2,151,175,223, 4,212,234,253,212,241, 99,
+172, 44, 45, 48, 61,221, 33, 78, 98, 46, 95,191, 69,127, 48, 2, 77,112,124,117,133,123,142,172, 18,133, 17,165, 44, 73,178,148,
+243,151,174,114,237,214, 26,134, 97,176, 52, 55,195,253, 39,239,225,241,135, 31,160,217,168, 3, 16, 37, 9, 23,175,222,224,237,
+139, 23, 25, 12,199, 44,206,207,177,178,184,192,242,194, 44, 83,237,214,100,155, 87,144,164, 49, 70, 9,113, 94,208, 62,178,130,
+223,215, 25,141, 35, 44,167,129,211, 58,134,217, 92,165, 61,191,140,102, 86, 8,253, 29, 6, 7,215,208, 76,139,131,205,243, 74,
+183, 35, 35,242,112,147, 48,142, 17, 82, 16,123, 99, 10, 25, 48, 55,255, 17,100,153, 49,222,187,137, 20,106,181,153,197, 93,122,
+221, 3,218,173, 6,123,189,155,236,239,189, 71,232, 93,197,247,175, 67,153,227, 52, 23,153, 95,125,134, 74,179, 69, 22,251,108,
+ 94, 31, 83, 10,141,192,223, 97,116,112,157, 32,220,167, 94,159, 34,242,246,128,146,214,212, 20,149,198, 17, 21,249, 90,230, 56,
+141, 54,181, 90,133, 50, 47, 16, 18,208, 4, 73, 28,169,172,241, 66,137,190,164,156, 48,192,213,120, 73,152,230,100,113,200, 96,
+239, 6,199, 79,126, 22,127,212,195,114, 90, 88,110,141, 40,241,241, 71,119, 24, 13,214,136,198,187, 68,222, 38,131,173,119,248,
+200,199,255, 7,254,249,191,255,101,126,241,171, 15,208,124, 72,199,202,142,145,228, 45,250,219,231, 9, 14,174, 16, 39, 62, 70,
+117,129,250,252,131, 88,118,139, 60, 26, 32,147, 0, 10, 21,244, 83,202,130, 82, 26, 28, 62,115,156,106,179, 73,183, 55,164,181,
+ 60,199,195,207,126,150,234,116,131, 97,116,157,188,171, 86,212, 69,234, 1, 3,166,206, 30, 33, 58, 72,176, 58, 48, 85,119,241,
+118,182, 0,137,166, 25,228, 89,170, 38,110,195, 64,215, 84,242,164, 46, 52,194, 88, 41,221,227, 9,253, 48, 47,114, 28,219, 70,
+104, 2,215,117, 85,140,105,166,168,166,142,235, 98, 77,124,228, 66,211,144,133, 36,201, 21,144,198, 52,116, 74, 32, 12, 19,242,
+ 92, 1,212,114,169, 82, 42,243, 34,195,182, 29,178, 68,161,133,245, 73,141, 51,116,147,178,148,104,134,174,116,100,150,242,199,
+ 35, 85, 83,158,231,185, 26, 54, 77,229, 0, 19, 66,168,207, 33,139,191,109, 42, 16,147,196,209,187,209,204,242,131,149,122,158,
+ 37,216,142, 67, 28, 71, 88,166, 73,154, 42, 34,165,156,232, 9, 12, 67,159,128,194, 20,214,185,148, 37,182,107,131, 80, 44,121,
+211,212,209,132, 10,181,169,184, 85, 12, 83, 21,245,187, 25, 31, 73,146,146,101, 74, 41,159, 68, 9,105,146, 98, 24, 38,250,204,
+220,252,215,179, 92, 25,253,165,212, 64, 83,177,154,138,126,164, 34,240,148,186, 87,146, 37,234,222, 41, 75,197,189,205,178,140,
+ 59,221,152,216,173,242,185, 51, 83,188,250,246,251, 76,223,115, 63,115,191,252,243,100,223,250, 22, 86,219,225,241,165,130, 86,
+127,159, 11, 7, 41,155, 82,195, 45, 5,238,194, 28, 23,122, 74, 49,108,232, 42,156, 68, 22,138,137, 45,165, 98,228, 10, 29, 52,
+161, 51,246,198,148, 40, 95, 99, 89, 42,144,135,109,219,232, 66, 82,160, 40, 61,134,166,136, 81, 97, 24, 42,243,191, 16,196,113,
+ 68, 18, 79,136,108,113, 76,146,168, 41,171,152,176,118,243, 76, 33,102, 85, 23,151, 80,228, 25,113, 20,147, 36, 41,134,174, 17,
+197, 49,195,168,228,124, 79,240,234,122,200, 82,199,224,244,225, 38,227, 32,103,212, 27, 49, 28,134,172, 30,159,199,170, 87,201,
+ 2, 31,167, 89, 33, 49, 45, 42, 81, 76,141, 12,162, 84,169, 42,145, 80, 20, 36, 72,100, 57, 65,137,238,141,137,117, 3,203,128,
+220,177,216, 57,240,209, 76,129,174,149,228, 73,137,149,169,168,200,220,182,233, 44,116, 16,162,196,201, 83,146, 66,224,182, 92,
+136, 67,138, 18,202, 56,101,170,213,192,172,219,136, 52, 97, 24,196,236,245,125,140,145,207,220,145, 89, 42, 6,148, 97, 74,197,
+210, 9,187, 62, 86, 41,137,163,148,176, 98,179,183, 61,224,230,173,125,166,230, 26,148, 89,134,149,229,164,104,140,178,156,134,
+173,209,234, 52, 40,188,132, 94, 34, 41,243, 18,167, 98,146,249, 49, 90, 89,146, 70, 57, 38, 57, 83,157, 26,113, 92,112,223,131,
+135,104,205,182,200,179,146,141,110,200,242, 66,147, 40,136,232, 44,206,211, 31, 70,228,227, 17,233,212, 20,121,148,242,171, 31,
+ 59, 74, 44, 37, 87,247, 2,222,189,227,113,223, 61,179,124,230,153,251,136, 19, 21, 96,242,209, 7, 79, 16, 69, 1,123,153,164,
+106,219,172,111,123,120, 89,198,201, 51,139,172, 44,182,216,220, 28, 98, 86,109, 74, 83, 39, 74, 80, 10, 84, 29, 22,230,235,212,
+ 27, 85, 66, 63,229,122, 47,228,242,245, 59,136,203, 63,100, 78, 95, 67, 27, 5,116,187, 67, 60, 63, 98,225,216, 97,230,190,242,
+187,200,230,211, 8,221, 71,216,171,106, 37, 47,115, 68,239, 28,115, 71, 90,204,151, 57,127,245,238, 38,142, 14,126,146, 35,117,
+147,186,169,145,100, 5, 97, 86, 82, 76,238,235,154, 38,208, 12,181, 61,146,147, 14, 63,138, 18,198,129,106, 64,213,184, 33,105,
+ 53,155, 88,134,133, 99,219, 60,251,145,199,232, 15,250,220,217,218, 97,107,119,143,118,179,201,195,103,238,165, 81,171, 83, 20,
+ 5,155, 59, 59,188,119,249, 26, 21,215,225, 11,207, 63,199,177,213,101,182,118,246,248,206, 15, 94,102,118,106,138,135,238, 63,
+ 69,179,209,192, 52, 12, 46, 93,191,201, 91,231, 47,114,254,210, 21,146, 44,231,241,135, 30,228,200,225, 37, 92,199,225,149,159,
+190, 75,127, 52,226,248,202, 33, 26,245, 58, 51, 83,109, 76,221, 96,107,119,159,107,183,110,163, 27, 58, 71, 86,150,105, 53,234,
+ 20,101, 73,148, 36, 12,189, 17,123,253, 17,183,214, 55,184,112,249, 58, 55,215,215,255, 86,136, 99,155,156,190,231, 4,103, 79,
+223,139,134, 80,105,109, 81,196,238,126, 23,144, 28, 62,180,136, 99,219,116,123, 3,188, 40, 34,142, 82,138, 60,103, 56,246,144,
+ 64,179, 86,165,211,106,225, 5, 62,227,113,128,101,153,120,126,192,112,236,177,179,127,128,101, 90,124,245,243,159,226,158,163,
+ 71, 38,211, 75,129,161,235, 84, 43, 46,243,211,211, 44,174,204,179, 95, 74,242, 56, 69,147, 14,163,209, 1,253,221,247, 9,250,
+183, 17, 2,170, 85,157, 36, 76, 39,246,165, 0, 77,151,140,187,107,200, 44,198,243, 99, 90, 21, 24,247,175, 51,246,122, 36,195,
+ 29,138, 72,167, 53,117,150,217,163,143, 33, 12, 23,239,224,186, 42, 14,166, 69,153,134, 12,246,239, 80,119, 11,146,254, 13,250,
+ 7, 55, 73,188, 93,210,120, 72,115,250, 52,135,207,254, 28,173, 70,157,122,245, 30,188, 96,135,238,222, 69,250,187, 87,145, 2,
+ 92,183, 67, 99,230, 36, 81,184,207, 96,255,125,210, 84, 35, 11,183,177,234, 54,245, 90, 7,215,118,176, 76,147,146,130,178,200,
+201,115,181,190,157,157,153, 35, 43, 84,212,178,105,233, 96,187, 20,152,200, 34, 39,139, 66, 50,127,192,115,255,223, 43,188,242,
+123,127,151,223,248,239,127,157,133,175,253, 42,231,254,230, 10,195,189,243,100,105, 64, 26, 13,137,227, 46,201,112,141,188,200,
+ 57,243,196,239,176,190, 6,239,190,172,241,198,127, 30,178,181,126,157, 56, 31, 35, 52,147,153,195, 31,227,232,233, 47,115,226,
+204,215, 88, 60,242,113,164, 81, 33, 47, 33,142,135, 20,105, 76, 81, 36,232,118, 3,221,157,161, 76,107,172,158, 93, 37,244, 6,
+ 4,113,130, 62,154,193, 10,230,209,228, 26,221,205, 62,154,168, 80,150, 1,165,223,227,228, 19,247,225, 46,206, 50, 61, 55, 79,
+103,169, 67,247,198,117,242, 44, 70,161,150,133,194,127, 27, 6,119, 99,131, 77,203, 66,232, 42, 31,193, 50, 21, 64,171, 82,169,
+ 98,154,198,228, 30, 94,160, 11, 21,196, 34,132,186, 91,235, 19, 5,186,148, 74,225,110, 91, 54, 69, 81, 80,169, 85, 17, 2,164,
+ 4,203, 50,201,243, 84,121,220, 75, 64,104, 68, 81, 72, 94,228,148,148, 36, 81, 76, 18, 39, 8, 33,209,181, 9,134, 91, 83,110,
+ 23,195, 52,209, 53,161,128, 51,166,161,224,107, 5,138,222, 55, 1,216, 84,171, 21, 21, 58, 99, 90,228, 69,134,105,216,216,150,
+ 73, 16,133,216,182, 69,156,164, 84,171, 46, 72,141, 40, 81,241,187,101,145, 35,180,137,179, 70, 51,201,178, 76, 5, 48,153,198,
+ 7, 91,169, 60, 87, 2, 90, 74, 37, 44, 76,178, 12,132, 34, 98,218,142,173, 78,205,233,132,128,169,169,228, 68, 77, 8,132, 80,
+167, 26, 33,116,178, 60, 67,159, 93, 90,252,186,242,126, 22,228, 64, 20, 40,198,117,146,196, 20, 82,117, 16, 89,145,145,165,138,
+ 88, 85,113, 93,234,141,186,130,236,107,170,219, 90,239, 23,180,166,106,124,249,193, 89,190,253,221, 31,179,251,230, 5,106,211,
+ 11,108,188,126,142,205,219, 93,222,237,195,126,152,112,250,232, 52,159,127,234, 8,191,255,230,128,157,177,178, 38,196,113,140,
+227, 42,219, 92,146,166,104, 2,245, 67, 43, 74,130, 40, 84,136, 90,211, 80, 54, 1, 38, 5, 95,168, 85,142, 20,146, 52, 78,136,
+146,152, 36, 86,183,191, 44,203,112, 92, 21, 60, 47, 52, 53,157, 27,154,166,136, 68,226,110, 18,151,196,180, 45, 12,161, 41,118,
+175, 0,211, 50, 48, 12, 91,137, 87, 18,213, 53, 54, 26, 53, 76,195,100,156,148, 92,232,155,156, 59, 40,145, 90,193,153,195, 77,
+154,245, 10,187,187, 30,105,156, 96,235, 58,113,119, 76,255,192,195,208, 5, 83,135,103,145,182,131,191, 55, 38,237, 7, 20, 18,
+ 8, 19,110,245,149,122,210, 17, 26, 39, 31, 88, 97,127,163,199,214, 80, 5,134,212,234, 6,101, 20, 19,247, 35, 52, 93,144,149,
+ 80,100, 5,134,101, 80,140, 35,202, 66,195,154,170,162, 89, 22,222,254,136,206,124,155, 34, 76,145, 21,245,218,148,163,128, 74,
+195,165,110,234,200, 36,195,172, 59,164, 94,132, 85, 22, 56, 83,117,226,170, 67, 90,148, 96, 27,180, 91, 53, 85,111,226,140, 59,
+227,148,118,205, 98,234,240, 12,253, 59,125, 66, 63,161,217,170, 18, 75, 73,179,238,114,115,115,132, 87,192,234,242, 20,254, 40,
+ 38, 19, 18,163,148,104, 18, 44, 67,167,247,255, 51,245,166,177,114,165,249,121,223,239, 61,251,169, 58, 85,117,247,253,242,114,
+105,146,205,102, 55,123,157,238,158,158,105,181,102,145,108, 45,176, 70,138, 44, 89, 89,164, 36, 16, 18,197, 1, 98, 97,236, 36,
+112, 0, 1, 3, 4, 2,146,248, 75,228, 5, 48,178, 32, 49, 98, 59,142, 37, 56,146,162, 25, 89,138,198, 35,207,140,122, 52, 61,
+189, 76, 55,201,238,230, 78,222,253,222,218,171,206,250,158,247,188, 39, 31,222, 34, 39,245,137, 32,200, 91,203, 61,117,222,255,
+242, 60,191, 39, 46,136,167, 5,169,170,152,228,154,211,222, 4,207,243, 57,191,214, 34, 78, 18, 46, 60,181,206,238,245,123, 76,
+114,201,159,159, 42,134,143, 78,120,106,115,142, 71,227,156,127,249, 95,255, 21,126,231, 15,111,240,197,151,206,176,182,214,225,
+249,203,235, 70, 69, 61, 76,217, 89,108,240,209,225,148,162, 44,113,202, 26,225,186,108,175, 68, 28,199, 5,227,188, 98,216,157,
+ 18,117, 26,172,174,180,144,177, 34,176, 5, 69, 44,177, 34,159, 65, 42,177, 43, 69, 36, 10, 30,125,242, 9, 39,123, 7,212,158,
+205,134,208, 44,183,230,104,189,241, 69,176, 59, 80, 13,168,179, 79,169,117,129,136,191, 11, 15,238,194, 36, 97,243,234, 38,163,
+189, 1, 31,239, 15,169,180,166,233, 59,224,122, 4,174, 67, 81, 41,210,162, 66, 88, 53,117,101, 38, 59,198,111, 94, 27,197,173,
+ 99, 84,190,105,158, 27,177,140, 54, 88, 76,207, 53,215,217,179, 87, 46,177,182,178,194,116, 50,229,225,193, 33, 43,139, 11,172,
+175, 44, 19,134, 1,211, 52,229,207,254,226, 47,185,251,104, 15,219,178,185,242,212,121,124,215,229,143,190,249,231, 12,198, 99,
+ 46,156,217, 98,121,113,145, 70,224,115,102,115,131,254,112,200,222,193, 33,131,241,132, 48,240,121,246,210, 5, 58,173, 54,133,
+148,220,123,184,203,100, 58,165, 17,132,180,162, 38,173,168,193, 52, 73,184,121,251, 14, 31,223,189,207,202,226, 34, 27,203, 75,
+ 56,174,137,151,140,179,140,209,120,194,163,253, 67,134,163, 17, 90,107,210, 60,167, 55, 24,114,102,107,131, 47,190,241, 58, 23,
+206,158, 97,174,221,162, 63, 30,177,119,120,200,225,113,151,113,156,224, 56, 46,235, 75,243,180,162, 8,207, 53, 55,172, 7,251,
+251,188,251,209, 13, 30,238, 30,144,203,130, 82,105,243,186,215,215,217,218, 88, 5, 4, 7, 39,167,236, 31, 30, 51,223,105,243,
+ 99,175,191,194,249,237, 45,146, 52,103, 26, 39, 76,226, 41,121, 46,105, 71, 77,132, 99,211,110, 70,220,159,102,100,131, 33, 81,
+216, 36,137, 39,228,197,136,116,244,144,201,240, 62,161, 7,185,172,144,217, 16,165, 18,202,116, 2,228, 36,211, 67, 90,209, 28,
+105, 41,113, 44, 27,183, 74,168,171, 9, 74, 57,188,241,203,191,195,207,124,245, 26,147, 71, 11, 56, 27, 21,167, 31,191,135,176,
+125,106,215,166, 42, 75,250,189, 93, 44,203,193,210, 26, 85,140, 80,197,128, 70,103,149, 40,106,226,216, 30, 59, 91, 47,146,230,
+ 41, 39, 7,239,145, 77, 15,176,236,128,149,181,151, 88, 92,127,154,179, 23,255, 42,157,133,151,120,241,167,126,155,254,201, 77,
+122,187,215,177,221,128,249,197, 5, 66,223, 37,151, 21, 85, 37,113, 29,131,191, 86, 85,141,237,218, 84,117,133,227, 5, 80, 41,
+ 84,145, 32,211,156, 60,143,233, 44, 93,226,115,207,253, 93,254,233, 31,151,124,227,223,214, 28,127, 56,229,104,239, 61, 78,111,
+253, 62, 54, 57, 89,114, 66, 49,124,196,232,232, 67,230,214,158, 39,104,175,176,251,233, 15,121,180,127,147, 52,121,192,120,116,
+155,201,232, 17,101,222,103,121,227,179, 68,115, 23, 41,178, 19,250,221, 91,148,121, 23,203,170, 1, 65, 89, 87,120,193, 60, 78,
+176,128, 27, 44, 97,185,139,228, 19,197,214,133, 57, 14, 79, 79,209, 65,193,104,183, 38,138,166,164,213, 20, 87,175, 96, 1,110,
+ 67,112,230,236, 2,107, 23, 54, 17,237,121,194,133,121, 22,206,110,176,119,253, 6, 42,205, 41,117,105, 28, 73,149,156, 17,229,
+ 32, 47,114, 60,199,104,170, 60,223,195,117, 93,168, 43,195,128,247,141, 53,172, 44, 75, 92,223, 8, 78, 77,162,153, 79, 85,155,
+241,122,150, 75,164, 44,104,183, 91, 8, 97, 82,218,152,217,217,148,172,240,124, 67,151,115,109,123, 38,208,179, 8,253,192,132,
+ 90,149, 37, 69, 33,201,165, 68, 85,154, 90, 51, 19,105,219, 80,139, 89, 1,192, 12,223,106, 48,210,104, 77, 93, 27, 47,189, 97,
+176, 99,180, 93,162,194, 16, 25, 77,160,139,231, 25,177,157, 99,153, 3,215, 17, 14, 21, 26,215,118, 80,165,194,182, 4,142,103,
+220,101, 32,112, 45,155, 44,205,113, 61,199, 52,164,133, 36, 12, 76,162,158,227,152,136,238, 34,147,179,137,130,111,210,217,102,
+ 35,119,219, 49,223,223, 52, 73,144,170, 48,124,248,205,179,103,191,102,219, 46,182, 35, 40,178, 2, 97, 11,154, 97, 19, 85, 43,
+ 80, 26,207,183, 9,252, 0,215,113,104, 54, 27,184,179, 49,161,101,219,198, 82,230,121,216,174,195,251,123, 83, 70, 86,131, 95,
+254,220, 58,227, 56,231,198,253, 35, 6,150,207,167, 83, 65,203,183,121,235,149, 29, 62,115,117,155, 15,119, 71,252,243, 31,166,
+102, 60, 81, 41, 4, 2, 44, 16,181, 97, 34,215,181,198, 18, 22,142,239,131, 22,212,104, 30,103,124,171,202,100, 60,171,153, 77,
+ 64,202, 18,223,245, 41, 43,133, 37, 52, 6,202,111,161,102,234, 70, 85,150, 88,182,217,181,219,174,192,245,124,162,102, 19, 91,
+216, 79,170, 70,165, 74, 96,198,253,246, 92, 28,207, 67, 22, 5,150,227,224,123, 30, 89,110, 16,130,165, 82, 20,248,220,153,184,
+124,255,176,198,119,107, 54,215,218,204, 69, 30,147, 73,142,240, 61,142,211,146, 84,193, 83, 23, 86, 16,158, 77,107,173, 67,115,
+125,142,104,173,131,146,138, 32, 45,240,107,141,198,162,189, 16,144,166,138, 88,129,182,106, 34, 27,100, 47, 51,201, 67,218, 34,
+181, 29,116, 89, 34,147, 28,116, 69,170,148,185,112,167, 41,110,163, 1, 53, 36,189, 4,167, 29, 34,100,137, 78,115, 28,219,166,
+177,208, 97,124, 58, 33, 29,101,180, 92,155,220,245,176, 29, 27,187, 80, 52,151,219, 88,182, 3,186, 98, 90,214,104, 27,238, 29,
+ 37,172,183,124,162,118,147,108,154, 18,232,138,112,169,197,209,238,144, 96,185,205, 97, 55,102,125, 41, 98,123, 99,142,105, 94,
+ 18,116, 34,148,231,160,149,241,171,142, 22, 66,220, 86,147, 70, 20, 48, 42, 20,213, 84, 18, 87,138, 87, 94,187,194,173, 27,187,
+108,157, 93,197, 17, 53,235,147, 46,223,235, 42,106,199, 34, 31, 79,120,235, 51, 87,184,246,220,121,158, 90,107, 81, 90, 53,117,
+109,209, 59,237,115,122, 56,230,185,167, 55, 88,220, 92, 99, 45,178,216, 63,154,208,112,109,180,174,200, 42,205, 27,215,182,185,
+181, 55,102,148,152, 28,102, 91,193, 56,206,112, 3,143, 44,242,152,156, 38, 52, 91, 1,157,134,135, 42, 53, 58,116,113,180,102,
+255,112, 72,154,103,228,117,205, 86,121,138,181, 89,130,234, 34,142, 62, 69,124,251,155,188,255,127,254, 9, 31,191,127,151,227,
+189, 62,190,170,152,107, 53,248,167,223,121, 96,108, 43,218, 68, 41,218,158,143,107, 65, 82,148,148, 10, 28,215,198,117, 44,192,
+ 56, 48,102,139, 2, 28,215,166,225, 7,212,212,148,186,162,148, 37,143,195,121, 26,190,207,246,198, 58, 39,253, 62,183,239, 61,
+ 34,138,154, 52, 27, 33,237,102,147,110,175,207,222,225, 17,189,209, 8,223,119, 57,187,185, 73, 20, 69,124,124,239, 62,163,177,
+ 17,220,196,113,202, 59, 31, 94, 55, 59, 54, 4,195,201,132,251,187,251, 20, 82,114,126,103,155,213,149,101, 38,211, 9,239, 93,
+255,132,201, 52,166,221,110,113,249,220, 89, 86, 22, 22,136,154, 17,105,150,209, 31,142, 56,233,247,185,247,208,112,219,251,195,
+ 17,131,225,144,105,156, 97, 91, 32,132,241,247,246, 7, 35, 14, 79, 78, 25, 79,166, 60,218, 63, 68,149, 37, 81, 20,113,247,225,
+ 67,190,253,206,251,124,255,131, 15, 25,199, 9,139,237, 22,205, 70,147, 51,155, 27, 56,142,195, 52,142,169, 42,205,241, 73,151,
+ 56, 79, 57,119,230, 12, 95,124,227, 85,182,214,215, 89,156, 55, 24,221,241, 52, 38, 78, 98,206,239,108,243,165, 55, 94, 99,101,
+113,145,193,104, 52,227,153,107,186,253, 1,113, 28,211,108, 54, 41,178, 2, 71,192,254,113,151,188,214,212, 73, 76,224,194,116,
+116, 64,220,189,133,204,115, 58, 11, 77,170, 98, 98,190,251,217, 16, 41,167,184,222, 2, 69, 50, 98, 58, 60, 50, 35,202,220,228,
+213,111,109,157, 33, 43, 21, 47,191,245,171,252,151,159,133,155,253,179, 84,113, 64,150, 30, 48, 58,185,143,133,141, 99, 57,212,
+186, 38, 30,159, 50, 29, 62, 34, 73, 70,200,162,100,126,190, 67, 99,190,197,201,222, 13, 30,222,125,143,222,201, 71, 20,113,159,
+ 90, 64,212,217, 38,106,173,210, 92,156,227,210, 75,215, 40,114, 24,236,125, 72,163,189,129,204, 39, 76,135,251, 76,198, 99,164,
+ 84,196,211, 41, 73,156, 35,101,133,214,224,217, 26,207, 6,215, 54,153, 14,105, 94,160,100,133,174, 5, 81,103,141, 75,111,252,
+ 71,140,251,167, 36,163, 91, 76, 79,111,211, 59,248,152, 90, 79, 24, 15,119,153,118, 63,165, 76,123, 72, 89,177,124,241, 43, 44,
+110,191, 76, 50,250,148, 34,143, 17,114, 66, 42,123,228,211, 46,114,122, 68,145,246,241,230,207, 81, 22, 3,134,195, 59,200,188,
+ 75, 50, 61,162,152,116, 81, 90, 98,213, 96,185, 30,142, 29, 96,249, 33, 66,120, 84,165, 69,123,189, 65,224, 10,250,167, 7, 88,
+141,140,227,247, 63,193,143,108, 22, 86,158, 65,215, 1,110, 35, 98,254, 76,147,102,232, 16,118, 26,212,162, 65,115,101,141,139,
+175,191, 74,255,222, 93,146,254, 0,199,179, 81, 82,225,186, 38,161,176, 40, 36,181, 37,208,181, 6, 33, 40,242,148,178,172,177,
+ 48,246, 45,203,182, 8,195,198,147,113, 55,181,198,113,252, 39,186,169,170, 82,184,182, 57,116,149,148, 96,153,174,214,177, 60,
+176,160,204,115, 30,167, 82, 58,182,139, 31,120,232,186,158,173, 0, 44, 3, 58,242,205,253, 94, 32,112, 61,143, 52,141, 1, 65,
+ 35, 52, 14, 24, 85,150,168, 89, 51,107,217, 6,140,102, 98,115, 53, 85,109,226,101,203, 92,146,102, 25, 85,165,113, 28,155, 56,
+142,169,181,201, 72,127, 28, 89,158,101, 25, 8,112, 61,151,170,210, 64,133,227,122, 84, 90, 81,150, 18,199,119,141, 21,187, 52,
+ 20, 75, 44,115, 30,151,170,164, 86, 2, 63,244,158,104,121,146,105, 76,150,103,198,190,102,139, 39, 99,125, 33,108,115,150,109,
+237,236,124,205,178,141, 34,144, 90, 80,213, 53,129,111,108, 39,142,101,227,206, 80,123,186, 86,212,152,110,164,174, 13, 82, 83,
+ 87,179, 4, 55,173, 41, 11,201,221,190,228, 91,247, 50,222,184,188,192, 79,190,178,201,185,115,203,108,175, 47,240,234,181, 29,
+162,185,136,143,238,245,248,135, 63,200,201,132,121,163, 88,214,147, 61, 73,158, 26,206,181,227, 62, 22, 68,152,221, 61,150,101,
+128, 2,128,235,216,179,209, 71, 64,165,141,157,168,170, 53,182,176, 0, 1, 66, 32,132,192,113, 29,108,203,164,239, 80, 67,171,
+213, 34, 12, 26, 4,190,161,162,121,190, 1,240, 75,105, 4,128,245,236,162,170,235, 26,215,117, 41,149,196,181, 76,110, 46, 48,
+171,194, 12,155,186,210,154,172,130,235,253,154,155, 67,151, 7,195,132,167, 86, 2,106,171,166,219, 77,152, 38, 18, 37, 37,253,
+145, 41, 6,206,108, 47,224,123, 46, 11,203, 17,195,163, 1,200,138,104, 41,100,109,125,145,211,221, 62, 19, 89, 18, 56, 46, 45,
+ 27,168, 43,170, 18,124, 7,156,186,166, 22, 22,181,176,152,223, 94, 32,159,100,212,149, 70, 38, 37,107,231,151, 9, 90, 62,195,
+254, 20,145, 43,156, 60,199, 90,154, 71,184, 46,233,241,192, 4,231, 8,141,194,248,235,109,207, 34, 25, 36,236, 79,114,210, 68,
+210,246, 61,220, 86,131,162, 22, 68,150,169, 66,219,171, 77,198,199, 19, 28,199, 4,130, 84,150,197,238,193,132,245,141, 54,129,
+210, 56,145,207,234, 98,147,211,238,144, 78,211,236,198, 44, 85,226, 47, 69,124,114,167,207, 56, 45,153, 28,199,180, 26, 14,130,
+154,107, 23, 86,104,180, 27,236, 61, 58,161,156, 91,100,124,239, 33,218,134, 79,134, 53,151, 90, 53, 43,235, 75, 92,189,176, 70,
+ 40, 20, 77,203,226,207,190,127,135, 13,223,230,163,253, 30, 15,142,198, 92, 92,239,208,106,132,168,204, 32, 40,157, 90,115,103,
+111,196,202,218, 60,159,127,237,105,198,163, 33,227,126,134, 44, 36,150,168,153,102, 21,207, 63,181,198,213, 43,107,124,247, 7,
+ 15,136, 86, 58, 56,190,199, 97,162, 81,185,100,146, 20, 12, 10,201, 52, 47, 72,123,167,112,253, 99,246,223,126,143, 7,223,254,
+136,235,183, 30,113,146, 75,122,147, 2, 47, 50, 8,212,175,253,239,111,211, 77, 13,144,102,161, 97,179,209,180, 80, 88,164, 74,
+208,240, 93, 82, 41, 41, 74,101, 32, 22,194, 92,123,186,174,209,218,236,244,147, 60, 65, 22,229,108, 84,102, 4, 49,157, 86,196,
+112, 50,165, 29, 69, 12, 70, 99,110,223,187,111,176,171,142,209,141,180, 90, 77,134, 99, 3, 98, 25, 12, 70,156,217,220, 36, 77,
+ 83,190,251,206,251,132,129, 79,156,166,156,244,122, 76,227,148, 52,205, 40,148, 34, 73,115,110,223,127,192,214,250, 42,215,158,
+190, 68,167,213,100, 56,153,242,238,245,155, 40,165,120,241,153,167,121,227,213, 23,217, 92, 91,123,130,217, 60,233,245,249,228,
+206, 61,226, 52, 99,161,213,194,247,125, 26,205,144,247,175,223,228,232,164,199,249,157,109, 70,211, 9,239,124,240, 17, 73,102,
+ 48,177,150,109,131,101,210,197,180,214,108,173,173,177,181,110, 48,175,182,235,242,214,171, 47,177,190,186,202,193,241, 49,221,
+193,144,119, 63,186,193,123,215, 63, 33,207, 37,181,174,208,117, 77,212, 48, 49,179,174, 99, 83,105, 35, 56, 12,130,192, 32,115,
+211,156,188, 48,184,220, 56,137, 25,140, 38,200,178, 36, 10, 27, 51,164,109,205,104, 52, 97,156, 85,164,131, 17,165, 44,152,111,
+183,160, 76,217,126,233, 87,120,250,133,223,160,119,240, 93, 70,189, 61,212,244,128, 74,149, 44,108, 94, 99,231,218, 47,211,106,
+109,160, 43,197,164,255,128,133,249, 5,230, 23,151,104,134, 46, 71, 71,183,249,206,157,139,108,158,105,163,226,243, 4,139, 43,
+132,231,154, 28,223,248, 62, 85, 85, 82,215, 26,215, 11, 16,182, 71, 93, 85,232, 74, 50,236,238,210,153,219,164, 46, 99, 6, 71,
+ 55,233,238,125, 64,169, 37,148, 5, 88, 22,194, 50,218,147,116,226, 16, 70,171, 56,205, 8, 81, 57,248,225, 50,216, 37,147,222,
+ 61,100,174,168,106,176, 29, 1,181,160,148, 5, 89, 46,205,251, 47, 42,178,178, 66, 87, 53,181,150,248,205, 5,118,174,253, 20,
+ 90,151,100,227, 67,100, 62, 38, 47,122,228,105,151, 52, 62, 38, 8,230,184,250,230,111,241,214,175,254, 35,126,233, 31,253, 38,
+ 95,250, 79,127,134,133,207,189,206,238, 55,111, 19,143, 30, 34,179, 62,121,210, 67,170, 49, 50, 59, 37, 29,239,227,218, 77,242,
+180,139, 46, 98, 74, 21,163,202, 4, 89, 78,209,121, 31, 93, 37,136, 90,204, 40,111,198,213, 35,112,200,198, 22,235, 79, 45, 50,
+ 60, 61,225,226,229, 29,156,200, 99,233,234, 57, 90, 23,155,180,197, 42,205,214, 38,174,179, 66,116,182,133, 87,244, 80, 2,210,
+145, 32,215,154,229,157, 13, 6,247, 30, 48,236,247, 80, 85,101,196, 93,150,141,229,216,200,188, 64, 43, 69,169, 36, 2,115,175,
+247,252,128, 82, 21,216,246,204,202, 60, 43,136,107,173, 73,210,204,116,212,182, 57, 59,178, 34,157, 77,145, 33, 8, 3, 44,203,
+ 16, 30, 85, 85, 26,231,147, 16,179,117,178,166,200,243, 39,231,149,231,249, 88,150, 57, 55, 44,203,162, 44, 37,178, 48,113,166,
+186, 82, 88,182,137,193,214,212, 68,205, 8,234,218,116,229,218, 88,228,202, 74,225,205,214,190,246,172, 0,148,165, 68,204, 94,
+ 71,154,166, 52, 26,205, 89,215, 95,226,218,230, 60, 41,242, 28, 11, 76, 65,163, 53,142,237, 24, 77,152,235, 98, 89,206,108,237,
+ 13,181,170,159, 88,216, 84, 37,201,115, 35, 80, 87,170, 2, 1, 82, 22,152,232,101, 27,165, 75,148, 44,177, 28, 97,196,187,139,
+107,107, 95,211, 90, 35,139,156, 90, 99,198, 32,142, 32,137, 19, 42,165,168,209, 4,129,107, 42,155,194, 84, 21, 38,195, 54,101,
+154,196,100, 89, 70,150, 25,191, 93, 89,150,140,211,146,127,253,233,152,155, 39,102,151, 50,204, 20, 63,120,208,227, 15,223, 63,
+226,247,239, 86, 60,154, 84,200,194,132,189, 60, 46, 10,202,178, 36,106, 69, 8, 75, 24,113,130, 44,241, 3,223,236, 91,148, 66,
+230, 57,101, 41,113,109,155,176,209,192,181,109,252,192,228,129,251,129, 79, 35,108, 16,250, 1, 65, 35,164,217,108,206, 98,100,
+109,162,102, 19,173,161, 44, 11,148, 86,134, 74,231,185, 20, 69, 78,158,102, 72,105, 80,184,237, 78,155, 48, 12, 12,232, 64,153,
+184, 76,128, 70,163, 73,216,108, 26,213,188, 59,139,136, 13, 27, 4,129,111, 10, 32,219,229,180, 12,248,222,113,133,180, 60,190,
+242,230, 14, 23, 54, 23, 80,181, 32,201, 10,234,172,156, 85,227, 10,187,130, 96,161,137, 27,120, 56,161,207,104,146,225, 2,251,
+227,130, 81, 89, 17, 42,133, 19, 53, 9,231,155, 68,237,144, 50, 43,240, 27, 30, 80,113,246,242, 58,181,227, 18,119, 39,224, 57,
+ 44,111, 47,210, 8, 60,250,167, 9,219, 79,175, 80, 20,154,114,154, 34,147,130,178,170,201,149, 6, 85,211, 88,110,147, 74, 67,
+139,242, 26, 62,183,246, 71, 52,116,141, 78, 50,108, 85, 97,229, 5,170, 40,105, 45, 55,104,117, 26, 28,239,143, 40,170,154,222,
+ 84,178,126,126,137,249,208, 99,125,189, 77,239,222, 49,163,227, 49,193, 82,155, 34, 85,212, 66,240,204,185,121, 42,223,133, 81,
+138,242,124, 34, 71,243,211, 63,254, 52, 45, 75,176,178,208, 96,117,109,193, 20, 85, 2,142, 31,157,242,241,195, 30,175,108,133,
+188, 55,168,200, 1,145,196,188,249,202, 5, 84,169,176, 92,193, 71,119,187, 92, 88,139, 24, 38, 5,143, 14, 99,198,211,156,206,
+ 98,131,126, 42, 73, 51, 69,162,161, 72, 10,110,239,246,216, 94,110,176,179,216,226,206,225,152,197,166, 75, 82,104,206,159, 95,
+228,238,254,128, 55,158,219,225,242, 86,135,119,175, 31,176,185,212,162,200,115,236,105, 6,190, 67,232,123,248,186,194,179, 32,
+ 41, 50,246, 78, 7,164,212,204,175,181,193,178,233,199, 57, 10,129,231,217,220,124,216,167, 59, 46,104,135, 22,174,214, 52, 45,
+139,208, 22,100,182,161,207, 5,142,203, 36,147,148,186,194,115, 28, 44,219,194, 70, 80,150, 18,165, 43, 51,210,195,104, 83,168,
+ 33,203,115,230,230, 58, 4, 51, 11,103, 94, 72,122,163,201,172, 83, 30,206,194, 32, 36,227, 56,229,184,107,112,186, 74, 41, 26,
+ 13,159,135,251,135,248,174,131, 82, 21,147,105, 76, 24,248,184,190,135,109, 9,163,148, 31, 79, 88, 90,152,103,123, 99,221,168,
+123,117,197,173,123, 15, 9,131,128,159,253,242, 23,216, 94, 95,195,247, 60,164,148,220,121,180, 71,127, 56,226,254,195,125, 60,
+215,101,126,174,131, 16,130, 43,231,207,115,239,209, 46,135,167, 93,210, 52, 67, 85,154, 81, 28, 51, 24,142,120,252,152,235,180,
+ 89, 95, 93,102,123,109,141, 92, 74,142,187, 61,234, 26, 70,163, 49, 73,150,211, 12, 3,186,131, 33,239, 93,255,152,253,227,147,
+ 39, 86,182, 70,163, 65,146,164,244, 6, 3,166,211,152,124,134,230, 77,178,148,105,156,226,216, 54,185,148, 36,121, 78,154,101,
+140,166, 9, 15,247,246,169,133,197,226, 92, 7, 85,205, 70,165,133,228,180, 59,102,233,133,107,196,199,125,108,187,198,107,118,
+ 56,251,210,207,178,188,248, 58,238,252,231,144, 50, 37,238,223,195, 34,163,177,176,134, 23,172,208, 90,188,136,223, 90, 34, 30,
+222,103,208, 61, 66,149, 18,207,241, 57,222,255,148,209,241,117,238,221,238, 99,135,203,136, 18,202,188, 98,237,194,143,113,238,
+226,207,209,240,219,156, 30,126,128,176,102, 36, 75, 97, 81,169,156,238,193, 61, 60,175, 77,115,174,141,231,218, 84,217, 0, 45,
+187,212, 66, 97, 91, 21,186, 78, 24,143,134, 36,201,128, 50, 47,144,186, 36,238,125,130,227, 53, 25,236,189,207,194,234, 83, 4,
+209, 38,233,100, 15, 85,196, 96, 9, 44,219, 8,145,107, 44,108,167,166,200,198,228,211, 17,151,191,240,119, 80,211,152,124,122,
+ 23, 41, 75,100, 49, 34,141,251, 72,217, 39, 27,237, 33,227, 30,231,159,249, 10,182, 88,227,224,157,154,143,255,240, 14,123,127,
+121,143,225,241, 7,164,241, 49,121, 58, 64,231, 35,228,244,136,164,127,139, 60,139,113,194, 8,173, 10, 84,153,160,138, 33, 74,
+ 78,209,114,138,140,247,169,100,134,176, 29, 80, 18,180,162,214, 10,163,181,106, 80,198, 30, 59, 87, 22, 25,140, 7, 92,121,246,
+ 18, 79,159,251, 59,204, 95, 88,197,109, 60,164,108,249,184,249, 69, 26,245, 85,162,240, 50,222,186, 11,245,132,188, 63, 32,207,
+ 20, 86,145, 48,237,118,201,165, 73,157,204,243,156,192,247,159, 28,218, 97, 16,226,123, 62,142,235, 82,228, 41,150,101, 19,134,
+161,137, 79,173, 20,150,237, 32,139,226, 73, 49, 24, 54,155,102,167,140, 5, 55,221,163,207, 0, 0, 32, 0, 73, 68, 65, 84,212,
+248,158, 75, 86, 72,147,167, 32, 75, 60,207,165,209, 8,169,197,140,250,102, 27,200,139, 99, 25, 97,118, 89, 22, 6,183, 58,123,
+126, 47,240, 41,149, 25,247, 55,155, 77, 44,203,184,172,124,215, 37,207,228, 44, 60,197, 53, 74,125, 85, 18,120,230,236, 49,104,
+214,140, 74, 43,163, 17,176, 12,237,180, 82,245,140,242,150,206, 4,119, 37,143, 93,117,165, 52,220,251, 74, 87, 79,158,211,113,
+ 92,227,238,114, 93,234, 90, 83, 11,147, 0,167,148, 17,191, 85,101, 97,166,214,194, 8,192, 93,215, 69,212, 21,105,154,226, 58,
+ 46, 0,129,107, 82,225,236,149,245,245,175, 85,149,185, 81, 99, 65,173, 13,120,223,182, 4,209,108, 71,102,212,231, 25, 73, 98,
+218,126, 41,205,206,221,158, 89,120,170,202, 68, 90, 62, 38, 2, 69, 81,196,253,110,202,159,223,137,121,247, 4,174, 15, 29,246,
+242,144,130, 25,106,214, 53,106,122,199,245,104, 54, 27, 56,142, 67,154,166, 70,217, 55,131,123,152, 72,190,194, 40,216, 49, 35,
+ 65, 33,140,181,160,214,181,249,101, 0, 6,180,111, 68, 22,178, 40,204, 14,126,246,203,179, 44,203,140,212, 29, 19, 78, 33,101,
+129,231,250,184,142, 75, 45, 52,170, 44,177, 45, 3, 62,168,117, 5,194, 84,109,158,235,226,249, 62,182,109,146,132, 64,240,120,
+ 18, 96,170, 59,102,157,126, 65,145, 73,100, 5,183,251,146, 63,121, 80,113,175,159,242,236,217, 57,174, 93, 88, 36,181,106, 70,
+163,156,201, 32,102, 48,202, 72, 51,137,219,105,112,122, 52, 38,157,164,180,214, 22, 24, 14, 83, 52,176,180, 24,241,220,179, 91,
+198,206,231,122,120,243, 33,227, 71, 3,116, 81, 33, 26, 77,156,192, 38, 25,231,216,142,203,217,237, 14,135,187, 61, 6,199, 35,
+ 22,150, 59,172,172,183,233,118,167,200, 10,174,188,118,142, 70, 43, 96,146, 85,172,174,207,147,164, 5, 50, 78, 25, 41, 65, 45,
+224,249,231,183,176,173,154, 60, 41, 40,139,138,181, 43,235, 52,252,128,150, 39, 56,232,103,204,109, 44,178, 55, 78,120,106,123,
+ 9, 93, 74,154,205,128, 82, 88,220, 58, 77,241, 61,139, 48,176, 73, 38, 18, 44,155,192,117, 56, 24,165,140,135, 57, 43,243, 13,
+ 94,250,220, 21,162,192,225,222,225,152,205,141, 22,150, 45, 80,142,199,250,250, 28,223,120,119,151,186, 72,121,102, 46, 96,100,
+133,244,122, 49, 10,193,229,167,214, 16, 74,179,215,139,249,157,127,245, 62,255,213,175,125,137,221,253, 19,110, 63,236,177,179,
+210,225, 27,223,189,195,175,124,233, 34, 31,220, 57,101,156, 41,164,172, 56,234, 38, 92, 59, 19,241,151,247,135,132,142, 77,169,
+ 53,103,182, 87,200, 11,197,159,189,243, 0,233, 8, 6,131, 20,203,115,241,178,156, 52, 47,113, 2,151, 65, 89,177,182,216, 70,
+ 4, 30,221,178,162, 0, 86, 86,150,232, 37, 5,148, 37,231,150, 90, 92,221,156,231,133,203,155,252,194,151,174,242,135,127,246,
+ 33,150,237,240,187,191,245, 83,236, 31,143,248,222,189, 46, 65,224,145, 40, 24, 36, 25,141,192, 37, 43, 52,181, 48, 25, 9,150,
+ 96, 6,160, 48,215,201, 99,252,164, 25,155,153,107,230,194,153,109,110,221,123,192,112, 50, 97, 52, 30, 81,170,138, 76, 74, 38,
+147,152, 56, 73,233,180, 35, 26, 97,192,105,127, 64, 24,152, 52,175, 70, 16, 80, 42,133,231,251,100,121, 78,150,229, 4, 65,192,
+242,252, 60,247,118,247,176, 45,139,207,190,252,162,169,161,108,139, 44,147,124,124,231, 54,207, 94,190,196,218,202, 18,243,115,
+ 29,100, 33, 25, 77,167, 20, 89,206,100,154,240,195, 79, 62, 69, 85, 21,237,102,147,115, 59,219,188,252,220, 21,110,220,186,203,
+237, 7, 15,105, 69, 17, 81, 24,208,237, 15, 24,204,146,225,154, 97,200,206,230, 58, 23,119,182,169,133, 96, 56, 28,209,138, 26,
+212, 24, 38,196,197,115,103,104, 69, 17,113,156,113,247,209, 46,174,237, 18, 53, 66, 86,151,150,184,114,254, 28,155, 27,171, 88,
+ 66,144, 21, 5, 73,150,211, 31,140, 72,242,130,209,104,196,112, 52, 38,151, 5,113,156,112, 58, 24,178,127,120,196, 36,142, 89,
+154,239,208,105,181, 72,139,156,172, 80,148, 69, 70,146,197,180,159,125,137,168,249, 10,167,187,183,112,215, 60,196,162,195,225,
+167,183,144,105, 15, 63, 88,160,181,242, 12,237,229,107, 8,145, 34,243, 41,217,244,152, 82, 38,184, 65, 68, 62,218, 39,203, 99,
+162,214, 28,121, 26,211, 12, 53,121,114,159,253,251,223,101,216,189, 71, 17, 15,185,248,242, 47,240, 55,254,241,103,217, 88,254,
+247, 72,135, 83, 14,238,126, 7, 61,115, 49,216,142, 75, 85,102,140,135,143,232, 29,237, 83, 85, 22, 69, 54,165, 22,109,230,230,
+154, 44,172,110, 98, 5,115, 8,127,137,108,176, 75,220,189,197,180,127,159,120,112, 31, 55,232,112,241,149, 95,230,249, 47,252,
+ 23,188,246,227,127,147,151,222,250, 91, 52,162,139,196,233, 49, 73,247, 46,102, 98,170,145,105, 66,228,108,243, 55,255,241, 67,
+254,238,111, 63,203, 36,252, 9, 30,190,255, 54,217,248, 30, 85,153,163,228,136,114,188, 79,145, 28,209, 94,126, 14, 17, 70,244,
+ 7, 55, 25,117, 63, 34, 29, 61, 36, 25, 31, 48,234,223, 34, 62,252, 62, 34, 59, 34,155,236, 51, 73, 78,112,252, 53,126,242,175,
+255, 51, 44,207,165,123,240, 14, 85,153, 81,170, 12,165, 98,234, 98,202,184,191, 75,123,229, 42, 53, 53,186,146, 80,107, 30, 71,
+165, 90,150,133, 82, 54,100, 54, 27, 23, 58,116, 39, 93,252,198, 23,137,188,121, 14, 15, 62,161, 19, 76,112,244, 34,115, 27,219,
+204,191,238,178,216,154,199,237,109, 81,150,219,184,173, 67, 38,143,118, 57,188,243, 41,182,229, 60,233,150,243,188,192,117,141,
+224, 43, 73, 50, 2,223, 35, 73, 83, 26,141, 6,174,235,162,148,233,168,149, 82, 4,129, 89, 1, 23, 69, 97,108,126,181,198,247,
+125,132,101, 68,108,190, 31, 96,217, 38,164, 69,235,138, 48, 12,177,132,133,204, 82,242,162,160,148, 5,165, 86, 88,216, 88,182,
+225,177, 91,150, 32,205,115, 16, 2,224, 9, 83,160,170, 52,147,233,132, 60,207,159, 52,130,238, 76,192,166,103,220, 19, 0, 75,
+ 24, 23,149, 65,219, 26,130,160,214, 70,135, 6, 38, 63,165,213,106,225, 7, 1,212,181,209, 14, 56, 14, 82, 25, 87,153,241,224,
+155,247, 87, 87,181, 25,225,215,181, 41,110, 28, 23,207,119,169, 84, 69,232, 26,244, 48,149, 17, 90, 63, 65,229, 42,227,255,215,
+ 74,225, 58,206, 19,231,128,189,185,115,246,107, 97,163, 65,224, 5,132,179, 12,216,192,247,141,231, 13, 72,147,148, 44,137,141,
+218, 23,140,183,123, 54,130,171, 1,223,243,240, 67,227,201, 14,103,200, 63, 33, 4,174,235, 34,149, 36, 77, 51,146, 52,155,101,
+192,218,104, 93, 83, 86,138, 60,203, 8, 3, 31,203,182,177,109, 19, 90,239,121, 46,182, 99, 97, 9, 27,215,247,103,182, 52, 11,
+207,243, 8,195,144, 40,108, 96,193,147,231,151, 51,106,147,170,140, 39,177,209,106, 64,109,129, 96,166,116,175,140, 93,174,170,
+102, 89,188, 38,196,222,158,141, 53, 60,199,198, 11, 12,123, 56, 45, 76,245,168,100,105,166, 3,165,161, 13, 73, 41,169,107,112,
+ 3,159,186,214, 70,124, 55, 59,216,227,105,130,176,141, 95,209,113, 76,138,215,113, 42,248,227, 79,199,124,247,238, 41, 11,145,
+199,213,139,203, 92,188,180, 70, 45, 4, 19,165,185,123,175,199, 66, 39,196,109, 71,244, 39, 41,253,196, 92,164,155, 43,109,210,
+ 84,210, 59,141,233, 29, 15,105,181, 26, 4,139, 45,104, 25, 15,105,127,144,178,113,102,158,198, 66,131,131,227, 17, 94,224,227,
+216, 54, 97, 20,114,208,157,226, 52, 67,236,102,192,112, 16,131,134,179, 23,151,145,170, 34,180, 61, 42, 33, 72, 85,201,210, 92,
+131, 50,206, 89,217, 90,100,191,151, 34,171,154,213,181,136, 70, 51,164,118,109,122,227,130,193,112,202,114,187,193,194, 92,192,
+225,193,152,120,154, 98,135, 30,131,113,198, 56, 43,241, 85, 69,149,230,244,166, 5, 15,123, 9,131, 81,134, 22,154,254, 56, 99,
+114, 60,224,189,143, 15, 57,232, 39, 28,239,118,241, 29,155,214,124, 11,109,185,188,249,242, 89,254,167,111,239,241,157,187, 67,
+222,216,106,112,239,116,202,232,184,199,165,139, 91,180,231, 35, 58,237,128,223,251,198,135,252,202, 79,191,196,211, 59,243, 44,
+204, 53,184,184,179, 68, 39,180, 89, 88,152,227,229, 75,171,156, 89,105, 35,149, 98,107, 53, 2,215,230,233,229, 54,187,163,148,
+147,238,148, 82,106, 60,215, 38,143,115,108,207,101, 56,201, 25,141, 50,230, 23,155,180,162,128,176, 19,144,196,138, 58,244,144,
+133,166,112, 61,218,157, 22,194,179, 56,179,181,192,224,160,199, 82,123,142,141,213,121, 28,149, 32, 86, 90,116, 31,245,248,206,
+173, 33, 43, 77,135, 87,159,219,230,235,239,238, 49, 77,115,188,102, 68, 94, 42, 42, 93,227, 57, 22, 73, 97, 80,148,182, 16,232,
+122, 54,170, 22, 38,222, 84,207, 14,116,102,183,130,249,185, 22,167,189, 62,221,193, 0, 33, 44,150, 22,230,217, 90, 95, 37,205,
+114,142,187, 61, 92,215,230, 11,159,125,141, 7,187,123, 92, 58,127,150,215, 95,122, 30, 89, 42, 6,227, 49,227, 56, 38, 73, 18,
+230,219, 29,158, 58,123,134,209,100,202,163,253, 3, 44,199, 34,203, 11,131,153,212, 53,127,254,151,239,144,230, 5, 43,203, 75,
+230, 26,119, 28, 99,169, 19,130,178,210, 28,119,187,124,122,239, 1,158,227,210,140, 26,160, 53, 31,220,188,197,187,215,111,146,
+ 23, 5,219,235,171, 68,205, 6, 15,247, 15,159,116,219, 81,179,201,250,202, 50, 11, 11, 29, 60,203,194, 15, 2,230,218, 45,211,
+ 49, 8,200,210,156,180,200, 41,103,187, 77,219, 50,107,176,178,170, 64,107,146, 36, 67,105, 77,224,123,166, 0,178,109,116, 85,
+ 81, 86, 38, 10, 55, 73, 83, 38, 73, 70, 60, 77,204,120,214,182,153,235,116,102, 92,128,153, 58,127, 60,197,170, 53, 89, 46,137,
+162, 13,220,249,171,148,147, 1, 75, 94,139,201,112, 72,146, 14,201,211, 35,210,201, 46,195,147, 27, 52, 92, 69,145, 39,164,201,
+ 41, 69, 60, 64, 87, 57,232,140, 42,203, 25,141,199,108, 63,253,227,156, 30,222,197,177, 36, 77, 39, 39,233,125, 76,239,240, 83,
+214,214,190,192,191,243,215, 46, 81, 12, 45,236,214, 23,217,122,238, 21, 58, 43,155, 88,150, 67, 35,218,194,114,125,138,184,139,
+235, 88,228,197,128, 74,229,100,201, 41,241,100, 66, 16,206,225,160, 41,210, 17,105, 50,101,212,189, 65,210,251,136, 98,122,132,
+ 19, 46, 17,205,175,146,229,135,140, 83,200,210,132,229,237, 23, 88, 90,123, 9,187, 53,207,180,119,151,124,122,204,243, 63,245,
+ 53,254,243,119,255, 71, 94,123, 46,163, 93, 91,200, 51, 46,211,163,231, 56,186,253, 45,122,135,223,161,156,236,161,138, 12,183,
+177, 78,208, 90,193,118, 53, 50,137,145, 50,166,212, 5, 74, 78, 16,218, 70, 85, 41, 74,123, 44,109,189,201,213,207,125,149, 87,
+191,244,223,210,106,173,130,239, 51, 62,189,203,112,239, 47,176, 28,135,206,252,211, 44,156,121,131,203,175,253, 6, 27,103,191,
+128, 16, 22,121, 62, 66, 87,102, 84, 76,173,168,116, 73, 85, 22, 36,211,148,106, 52,100,235,133,203,220, 31,127,128, 58,126,153,
+253,247, 63,162, 59,186, 77, 29,245,136,212, 57,236,164, 73,248, 92,205,122, 91, 32, 38, 46,201,224, 34,209,149, 54, 34,233,146,
+ 13, 71,179, 3, 91, 81, 85,102,175, 94,149,138, 32, 52,204, 2, 89,150, 8,203, 0, 88, 74, 85,206, 58, 82,163, 83, 73,227, 20,
+203,182,112, 61,131,103, 54,124, 21,115, 29, 21,165,164, 44,171,217,180,217, 71,230, 5, 74, 25,223,184, 57,203,108, 42, 37,113,
+ 61,207, 76,150,139,146, 74, 87,232,178, 36, 73, 19,178, 44,163,174, 77,254,186,233,158, 21, 85, 85,153,189,184,239, 97,213, 22,
+182,107,116, 86, 97,232,227,186, 30, 88,166,217, 83, 74,161, 42, 69, 94, 24, 59, 93, 24,250, 4, 97,128,176, 5,142,227, 97, 91,
+224,121, 70,180,167, 42,163,251,114,125,151, 74, 25, 93,152, 17, 8,106, 28, 63,160, 72, 51,100,110,146, 35, 31, 55,151,105,145,
+227,185, 30, 82,150, 38, 40, 42, 48,222,248,122, 86,108, 9,203, 8,244, 30, 55,164,246,250,153, 51, 95, 51, 8, 76, 69, 85,149,
+248,110, 64,158,167,200, 66, 82, 20, 5, 74,105,108,107,150,215, 12, 52,163, 8,119,150,225, 93, 74, 3, 6,176, 93,119,182,107,
+ 51,105, 87,197,108,188,142, 54, 59, 9,173,140, 95, 59,142, 19,146, 52, 37,207, 50, 2,207,163,194, 32, 0,127,180,163,215,212,
+181,217, 97, 11, 49,123,145,142,131,231, 26,120,140,172, 12,252, 38,240,125,108, 4, 85,165,113, 29, 7,173,161,209, 52, 70,253,
+ 74, 73, 74, 85,146, 39, 41, 73,156,206,108,110,230,239, 52,198, 54, 7,204,170,177,177, 25,183, 52, 66, 44, 71,128, 6, 97,153,
+ 80, 0,223,247, 77,176,194,204, 71, 47, 75,131, 25, 44,138,226,201,110,196, 17,230,115,145,165, 1,243,100, 89,134, 99,187, 76,
+167, 19, 14,199, 37,223,123, 88,240,199, 31,158, 16,103,138, 87, 46,173,241,185, 23,182, 89, 91,106, 48,209, 53,177,172,232,199,
+ 37,121, 98,246, 48,165,172, 41,198, 9,181,148,120,158,199,112, 90,112, 52,201,169, 5, 36,131, 12, 45, 43, 60,223,197,118, 45,
+ 14,239, 15,208,186,100,233,236, 42, 31, 63,234, 81, 87,130,147, 94,140, 43,106,130,208, 35,206, 37,241,180, 32,242, 92,118,111,
+238,177,180,181,104,170,225,105, 78, 60, 72,200, 51, 69,225,217,224, 89,200, 76,211,235, 79,232,247, 51, 30, 28,141,104,122, 1,
+ 47,189,176,129,194, 34,158,164,132,182,195,131,126, 74, 33,140,226,125,103,163,195,242,218, 28,105, 34, 25,196, 18,225, 90, 88,
+ 26, 90,190,203, 40,149, 12,135, 57,145, 0, 71, 64,161, 53, 27, 91,203,228, 85, 73,171,233,115,123,111,194,113, 33,248,123,191,
+254, 57,238,117,115,228,116,200,193,221, 61,218, 65,200,197,203,103,216, 88,108,242,225,221, 35,182,183,151,104, 71, 77, 84,109,
+209,154,111,240,195, 79,143,177, 91, 77, 86,214, 34,206,110,175,176,184,212, 70,184, 46,171,203,115,188,112,245, 28,171, 29,159,
+ 71,147, 4,106,155,133,165, 38, 63,255,249,139,228,147,220,116,192,185,164, 20, 22,169,182,105,204, 53,184,184,210,230, 56, 41,
+185,190, 63,161,206, 11, 78, 39, 37,100, 57, 77,173,177,171,130, 15, 31, 30,115,255, 52,101,120, 56,225, 91, 63,220, 99,127,146,
+243,246,157, 46,127,244,189, 71,180,155, 46,170, 22,160, 43, 74,199, 71, 85, 26,215,178,144, 85,253, 68,128, 99,114, 9, 64, 41,
+101, 70,232,213,143, 18,224,148, 82, 92, 56,179, 61, 75, 33, 91,162, 63, 28,224, 59, 46,191,246,139,127,141,222,112,204, 73,191,
+135,239,186, 92, 62,183,195,254,113,151,237,181, 21,174, 94,190,200, 83,103,207,112,127,111,159,241,120,138,148,138,149,229, 69,
+ 94,125,238, 89,230,231,231, 56, 56, 62, 37, 75, 51, 90,173,136,229,165, 69, 60,199,101,239,240,136,185, 86,139,173,213,101, 54,
+ 86, 86,248,198,183,191,131, 45, 4,237, 40, 98, 56,153,240,111,190,247, 14,253,193,144,192,247, 57,127,118,135,102,240,152, 83,
+ 93,178,177,182,202,171, 47, 94,227,180,215,231,240,180, 71,154,101, 8, 44, 54,215,151, 57,187,185,110,212,232,179, 68,168, 52,
+205,140,144,180,210,102,116,158,102,196,179, 2,190,212,149,137,195,196, 76, 40,106,140, 83, 64,215,179,149, 68,245,120, 50,102,
+160, 82,150,101, 35,168, 77,145,108,155,226,222,115, 28, 26,141, 0,199, 50,159,107, 16,120,164, 89,198,164,215, 37,138, 58, 76,
+199, 39, 36,131, 30,161,147, 33, 68,193,120,112, 68, 58, 61, 37,159, 30,145, 13,119, 9,156, 12, 75, 23,228,113, 31,153,156, 82,
+ 38, 61,160,160, 84,146,203,175,254, 2,103,158,251, 37,154,243,215,184,127,227, 79,232,117,187,236,156, 59,135, 31, 54, 72,213,
+ 49,247,246, 94,226,151,254, 93,151, 87, 94,169,232,118,175,160,234, 22, 27, 23,223,224,181,183,190,202,231,126,230, 55, 57,222,
+251,152,222,193, 71, 8,225, 97, 91,198, 79, 92, 41,201,168,127,130,240, 86, 32, 63,132,233,125,202,228,216, 88, 85,171,154, 96,
+110, 3,215,149,212, 74, 34,115, 69, 50,222,229,120,239, 7,244, 14,175, 51, 29,223,167,189,120,137, 87,191,252,219,188,244,250,
+ 95, 71,222,247, 56, 92, 9,184,241,117,151,254,183, 32,173, 10, 52, 54,150, 29, 17,180,206,179,253,194,127,192,107,159,251, 91,
+132,237, 11,140,123,119, 40,101, 66,153, 13, 40,243, 1,121, 58,160,152, 30, 82,101, 19,206,191,240,171,108, 93,249,105,172, 70,
+131,238,193,135, 28,239,253, 37,195,222,125,116, 93,225,183,215, 89, 92,127,157,206,230,139,204,207,157,195,114, 3,100, 50, 36,
+147, 9,170,140,169,138,161,185,175, 87, 57,149, 76, 40,229,152, 50, 31, 50, 62,121,200,203, 63,241, 38,107,103,150,216,143,191,
+139,234,199,100,167, 61, 54,159,217,224,204,235, 13, 74,235, 1,199, 93,139,190,104,227, 30, 66, 53,134,211, 7, 54,209,181,101,
+146,253,219, 20,113,140,176,109, 2,207, 69, 74, 99,101,149,133,164,144,146, 70, 24,152, 61, 59, 16, 69, 77, 51, 9, 86, 37,150,
+109, 86, 92, 38,221,172, 34, 8, 60, 35, 56, 19, 22,150, 45,176, 45,227, 34, 48,244,181,153, 42, 60, 51, 83,229, 26,195, 39,177,
+108, 27,219,113,168, 85,133, 31,122,179,231,169, 41, 74, 69, 93,107,180,170,176,109, 11,223, 51,135,118, 89,152, 48,153, 60,207,
+201,139, 28,219,113, 16,194,132,175, 88, 64,158, 21, 8, 33,240,131,199,123,113, 15, 33, 4, 90, 27,173,136,235,186, 76, 38, 99,
+ 92,223, 37, 75,115,124,207,197,100,194,135, 80, 11,234, 90, 16,204,166,113,126,224, 81, 73,115,190, 65,141,229,185, 20,165,137,
+124,181, 53, 36, 89, 74, 24,134, 56,142,141,227,216,248,190, 71, 16,134,132,225,172, 17, 15, 2, 92,215, 38,207, 11,236,149,141,
+141,175, 85,101, 73, 93,153,165,189,235, 90,120, 65, 96,254,236,121, 8,171, 70,107,195,234,181, 45,135,178,204,177, 92,199,140,
+162,108, 19,158, 82,107,205, 92, 59, 34,240, 3,108, 64, 22, 37,205, 40, 50, 59,111,207, 16,226, 74,165,208,182,241, 28, 86,234,
+ 71,227,117,215,113, 24, 77, 38,100, 73, 76,150,167,100,105, 78,150,207,114,214,165, 73,233, 17,152, 76, 94,215,178,113, 60,135,
+162, 44, 76, 49,225,121,148,101, 65,163,209, 32,147, 41, 69, 81,144, 36, 41, 50,151,168,202,216, 12, 30,131, 0,202,178, 68,149,
+138, 60,207,209, 88,104,173, 40,165,164,217,106, 97, 91, 54, 89, 86, 82, 72,137,192,198, 11, 27,212,218,194,114, 28,132,112, 9,
+ 27,161,129, 88,216,198,210, 36,106,139,168,217, 64, 35,240, 61, 23,219,117,145,101,142, 16, 22,174,107, 35, 11,243,154,100,165,
+200,165,230,250, 97,198,239,189,127,204,183,110, 15,232, 38, 21, 95,188,186,206,165,173, 5,118, 86, 35,180,170,112,103,194,142,
+206,114,135,197,149, 14,235, 27,139, 28,159, 78,136,108, 88,155,111,178,180,220,194,241, 28, 6,221,152,227, 65,204,218,230, 60,
+ 73,109,243, 96,175,207,105, 63,197,247, 28,154,117, 73,203,247, 89, 93,110,209, 10, 92,138, 76,113,120, 60,102,110,103,129,253,
+227, 41, 74, 8,100, 42, 57,119,126,149,149,181, 22, 55,238,116,201,138,138, 78,232,160,170,154,163,126,138,210, 53, 97,195,129,
+ 74, 51, 28, 38, 28,141,114,164,214, 36, 73, 73,154, 11,227, 80,176, 45,186,170,166,219, 75, 40,235,138,166, 5,142,101,211,233,
+132,228,129,203, 47,190,121,145,115, 59,139,108,157, 93,102,235,220, 26, 8, 11, 71, 88,252,111, 95,191,201, 63,249,214,109,254,
+187, 95,255, 60,235,171,243, 84,115,115,100, 65,135,187, 67,201,111,255,171,143,249, 39, 95,127,159, 59,253,132,191,184,221, 99,
+ 41,242,217,239, 79,152,228, 5,183,247, 39,156,198,146, 63,254,254,125, 90, 65,136,170, 53,227, 84,209,110,134,252,249,167, 39,
+180, 67,139,237,205, 69,174,158, 89, 70,186, 14,235,107,115, 4,205,128,139,231,151,184,122,110,133,133,197, 14, 97, 20, 50,206,
+ 37, 63,184,211,195,173,107,242, 74,242,242,249, 69, 90,205,128,200,119, 41,138,146,192,210,244, 75, 88, 92,157,195,241, 93,114,
+ 33,176, 52,220, 57,154, 32,181, 96,173,227,147,150,154, 73, 81,161,171,138,188,182, 24,103, 18, 91, 8, 44,171,166, 80,198,191,
+ 46,132,153, 4, 57,182, 17, 12, 22,255, 63,204, 42,192,213,203, 79,225,249, 62, 87,159, 58, 79,171, 21,113,249,252,121, 52,130,
+134,239,209,105,183, 57,234,118, 57,191,115,134,157,141, 53, 38, 73,194,242,226, 18,142,101, 33,132,160,217,104, 50,142, 19, 54,
+215, 86,184,116,126,135,255,251, 79,254, 13,167,189, 30,171, 43, 75,124,230,218, 85,132,101,115,243,214, 29,242,162,224,243,159,
+121, 17,219,178,120,251,131,143,184,251,224, 17, 73,154, 97, 91, 54,113, 18, 51,153,198, 28,119,123,148, 85, 73, 85, 86, 79, 60,
+176,221,225,136,173,213, 21,234, 26, 14, 79,187, 36,105,138, 44, 37,173, 86,196,198,234, 10,237,150, 25, 49, 78,147,132,219, 15,
+ 30,114,210,237,145,164, 25, 91,235,171,216,182,209, 9, 32,106,108,199,157,117, 47, 21, 8, 19,162, 36,102,135,187,168,107,140,
+245, 71, 60, 57,240,181,214, 51, 33,146, 17,109, 90, 70,217,132,231,184, 52,194,144, 48, 52, 55,107,111, 6,235, 72,227, 49,121,
+ 26,211,104,132, 84,197,132,170, 44, 16,149, 36,244,106,242,201, 41,101,218,101, 58, 62,164,115,230,175, 48, 58,185, 75,169,143,
+136,194, 38,129,103, 68,105, 27,231, 95,160,185,252, 20,253,195, 79,144,249,144,185,149,103, 73,166, 61,146,201, 41, 75, 75,107,
+132,110,193,176,119,139,239,191, 29, 80,251,151, 8, 95, 16,244,110, 70,244, 14,110,179,126,246, 57,230,191, 44,184,118,249, 23,
+ 73,179, 54, 7,183,255, 95,170,210, 16,191, 42,149,162,228,132,100,180, 75,154,100, 84,150, 79,109,249,232,178, 36,108,180,104,
+182,218,132,157, 21,227,238,241,182,176,180,195,168,247, 41,147,163,119,152, 28,127,128,227, 47,226,183, 58, 12,123, 15, 72, 78,
+ 20,197,163, 85,100, 6, 71,221, 93,166,227, 67, 38,189, 27,172,110,126,158,159,249,143,191,202,171,191,241, 34,151,127,118,129,
+ 69,123,135,147, 3,197,100,120,155,170,136,145,121, 31, 53, 61, 96,122,122, 3,141, 67, 56,183, 69,158, 13, 72,135, 7, 72,105,
+ 68,115,121,214, 67,102,167,204, 45, 95, 99,121,237,121,180, 83, 19, 15,246, 24,245,111, 51,233,127,130,140,247,201,199,187,200,
+180,143, 37,106,132, 46, 16,228, 80,230,136, 42,161, 40, 50,158,121,243, 85,158,121,249, 26, 11, 13,141,183,172,240,183, 91, 68,
+219,103, 88, 92,222,129,186, 64,143,118, 25,237,127, 66,127,247, 41,234, 10,166,105,197,240,193, 49,205,179, 46,241,163,123,168,
+ 60,167,174, 5,158,103,132,169,213,172,131,173,103,235, 83,219,114,145,101, 65, 81, 20, 84, 26, 30,179, 33,194, 70,136,241,153,
+128,109,187, 40, 85,128, 54, 34,213,162, 40,158,216,175,125,223, 51,187,110,106, 84, 85,146,166, 41, 65, 16,162,181,177,171,201,
+ 18,252,192,195,114, 28,170,218, 20,223,181,112, 40, 75,109, 16,222,129,143,170,161,214, 70,100, 87,215, 53, 50,207,141,197,214,
+ 49,228,182,114,246,221,209,202, 56, 24,192, 50, 13,107,216, 4,109,162, 87, 29,215,153,105,206,204,110,252,241,195,117, 77, 65,
+227, 57, 14, 74,105,148, 84, 84,148, 32,106, 28,219, 64,102,116, 53,203, 54,113,141,229, 47, 77, 19, 74, 37,177,132,192,113, 92,
+ 35,232,171, 5,170,148,212,186,198,178, 29,138, 66, 34, 94,127,235,173, 26, 4,149, 86,200,162,196,243,124,124,223,200,231,133,
+ 48, 85,180,214, 26,173,181, 9, 75, 41, 37,147,209,248,201,158, 16, 75,224,218,198,238, 38, 48,251,245, 36, 75,105, 71,109, 44,
+219,168, 3,245,108,172, 50, 26, 12,208,149,162,209,104,146,100, 70, 32, 99,217,182,121,129, 90, 97,190,203, 53,216,166,107,182,
+ 44,135,170, 42,205,152, 57, 12, 13,135,126,246, 51,109, 33, 0,141,192, 1, 97,212,249,195,225,136,186,174,141,208, 1,129,210,
+154,105,154, 18,184, 30,147,233,132, 74, 85,212,194, 4,212,152,132, 28,155,249,185, 57,116,173,177,133, 33, 18,217,130, 89,225,
+160,160, 22, 56,182,139,235, 58, 88,179, 49, 99, 85,105,146,105,130,174,103, 83,130,218,236, 78, 12,225,168,194,113, 28,116, 85,
+ 49, 26, 12, 40,181,201, 19,246, 29,199,144,199, 48,147,136,142,171,153, 15, 52,255,254,171,171,252,216,211, 43,172,181,108, 70,
+227,156, 73,156,114,127,127,200, 52, 41, 57, 57, 26, 18,186, 54, 11,203, 45, 2,215, 38,181, 45,172, 66, 35,199, 49,150,107, 49,
+181, 93,210,113,138,111, 11,206,181,124,180,165,241, 29,155, 52,215, 52, 86,219,196,189, 9,161,231,242,224,100,202,184,168,104,
+251, 14, 59,171, 17,101, 90,144,229, 21,125, 85, 99,219,166, 97,178,230, 34,138,222, 24,215,178,216, 94,244,233,141, 11,250,133,
+162,214,130,200,179, 41, 53, 40, 81,131,212, 96, 9,174, 61,189, 76, 89, 84,220,221, 29,162, 68, 77,123,190, 77,226,216,156,139,
+ 92,222,122,245, 2, 89, 37,176, 92, 11, 37, 43, 30, 30,143,249,163,119, 30,226,217, 22, 63,255,197,103,120,251, 81,193,255,250,
+157,125, 98, 41,112, 92,193,217, 85,151,191,113,185,197,171,103,219,236,108,175, 16,119, 71,104, 27, 74, 85,113, 58, 41,152,102,
+ 37, 55,247, 83,110, 30, 77,113, 60,219, 20, 77, 82,147,103,102,226,224,139,138,159,126,237, 28,109, 15, 46,173,183,240, 60,143,
+ 90, 87, 28,244, 19, 22, 91, 62, 75,109,131, 97,244,108,193,221,163, 17,247, 15, 70,204,135, 54,183, 78,167, 28, 29,198,216,190,
+195, 66,211, 67, 72,137,244, 60, 22, 35,143,173,149, 5,236,208, 98,216,157,240,207,255,244, 19, 62,218, 29,242,202,133,101,172,
+186,230,189, 71, 3,180, 16, 28, 22, 22,126,224, 27,245,186,237, 48,136,115,236, 48,196,183, 29,108, 27, 84,101,174,139, 52,203,
+205,161, 53,123,188,249,218,203,124,249,141,215, 57,233,245, 89, 90, 92,160, 44, 75, 70,227, 9,101, 85,209,237,247,201,115,201,
+202,210, 2,207, 61,125, 25,223,117,185,113,247, 46,119,238, 63, 66, 41,197, 92,187, 77, 16,120, 92, 58,119, 22, 89, 42,254,224,
+ 79,191,137,174, 53,159,125,233,121, 46,157, 63,207,100, 26,243,254,141,143, 89, 91, 94,194,178, 45, 62,184,249, 9,131,209, 4,
+ 81,215,172, 46, 47,178,186,184, 72,119, 56,226,189,143, 62, 6, 75,115,233,236, 89,206,110,110,160,180,230,193,238,222,147,176,
+ 25,106,144, 74,113,239,225, 30,195,241,152,185,185, 57, 46,158, 59, 67, 20,132,164,121,206,221,135,187, 76,227, 41, 43, 11, 11,
+252,228, 91,159,231,185, 43,151,145,165,228,131,143,110,114, 50, 24, 18,204, 66, 49, 74, 85,161, 74,245,100, 29,230,186, 6,236,
+ 65, 93, 35, 44, 27,106,140,157,105,118,143,112, 28,199,124, 71, 49,119, 83,203,118,152,239,180, 8,124,143, 44, 47, 40, 74, 51,
+ 41,235,245,251,168,162, 64,250, 75,184, 65,139,197,213,117, 6, 39,199, 84,181,166, 21, 69, 36,147, 62,101,243, 89,158,255,236,
+ 87, 9,220, 37,110,191,255,191,112,231,230,239, 82,201, 62,182, 29,114,229, 51,111,146,203,144, 44,153, 34,179, 9,181, 46, 81,
+ 37,140,142,110,178,185,177,129, 31,132, 12,166, 83, 58, 75,203,164, 73, 11,191,115, 1,199,182,168,170,156,107,159,249, 53,190,
+252,213,139,188,190,156,115,123, 28,240, 7,255,125,198,173, 27,255,128,221, 7,223,100,235,220, 91, 76,142,111,243,201, 7,255,
+ 12, 44, 15,219,179,177,181,139,182, 28,180,150,180, 23, 55,120,241,231,126, 30,185, 63, 96,154, 54,201, 51,201,164,127, 19, 57,
+222,195, 9,151, 88,217,249, 2, 94,228,227,123, 29,130,246, 89,194,185, 22,148,130, 98,154,147,203, 83, 6,135, 55,216,186,244,
+ 87,249,202,223,251, 34, 94, 2,163,155, 48, 58,133, 15,190,253, 54, 15,111,253, 62,131,195,119,153,246,238, 82,219, 37,157,197,
+103,185,252,218,175,147,103, 61, 38,221,187, 84,165, 70, 8, 65, 89,101,104,153, 35,211, 3,188,112,153,185,245,151,209,197, 20,
+ 69,137, 42, 51,100, 58, 64, 23, 3,228,116,143, 82,213,184,150,192,115, 44,202,186, 50,247, 99, 89, 50,156, 12,217, 60,123,141,
+175,252,230, 31, 16,132,224,159,127,132,144, 67, 6,131, 61,134, 73, 65,171,185, 68,232,218,148,253, 35, 82,177, 64,245,224, 50,
+ 89, 38, 25,246,239, 82, 4, 31,224,244,238,209,127,112,223, 76,105,103,223,139,186,174, 25, 79,198,102, 71, 37,140, 99, 9, 76,
+ 82,167,109, 89,216,174,141,146, 21,174, 45,112,125, 31,165, 36, 85,101, 4,114,150, 99, 19, 79, 13, 35,164, 17,181,177, 0,165,
+ 53,121,154, 98, 89, 14,163,241, 8,234, 26,203,113,105,183,219, 8, 97,145, 36, 9,186, 6,106, 65, 20, 53, 40,114, 73,154,165,
+ 8,219, 98,174,221,198,158, 21,210,117,173,145,178,152,253,219,138, 60,203,177, 44, 11,199,115,152,239,204,145, 36, 9, 53,134,
+207,175, 52,100,169, 73, 51,108,183,219,100, 50,163,152,145,242, 26, 97, 64,146,100, 8, 33,232,116, 90,216,182, 75,146,166, 88,
+179,245,113,212,108,206, 62, 8, 77, 89, 25, 80,153, 16, 80, 42,133,107,187,179,244,212,217, 8, 95, 41, 99, 95,110, 52,168,181,
+ 81,226, 87,165, 36, 78,204,132, 93,124,254, 75, 95,174,139,194,116,190, 96, 70,222,173, 86,147,186,174,201,211, 2, 47,112,141,
+ 88,161, 52,185,178,211,241, 4,173, 53,237,168,245,163, 40, 83,173,153, 76, 98,168,107,106, 12,223, 55, 75, 50,163, 64,111,181,
+169, 49,225, 41,227,241,144, 74, 25, 91, 88, 24,134, 56,182,192,178,140, 87, 60, 8, 3,132, 53, 67,184, 22,138, 52, 79,141, 56,
+ 64,153,136,189, 70, 20, 33,132, 69,165,202, 89, 53, 47,136, 90, 45,179,203,214,154,209,120, 68,173,107,218,157, 14,106,214, 53,
+185,190,225,236, 90,152,159,155, 23,102,239,168,245,227, 93,132,192,117,108,230, 23,230,112,132,133, 22,166, 50, 51, 99, 22, 35,
+180, 51,207, 89, 33,149,194,158,249, 7, 17,230, 0, 79,226, 20,199,115,176, 16,100, 73,134, 70, 27,209,158,101,145, 76, 99, 83,
+109, 33, 16,212,230,255,233,154, 86, 59, 66,104, 65, 86,100,216,182,197,250, 66,196,122, 75,240,153, 85,193,151,158, 94,228,210,
+198,156, 41, 18,138,130, 94,150, 81,230,154,147,211, 9,247, 78,198,108, 47, 7,124,112,239,148,208,242, 56,127,110,149,197, 70,
+192,254, 97, 15,207,243,145,181,166, 63,200,112, 93, 65, 62, 78,201,149,198,141,124,220, 90, 48,201, 36,205,170,162,185, 16, 34,
+ 28, 23,178,146,211, 36,195,179, 5, 89,161, 57,123,126,153,189, 7, 93,243, 90, 29,115,210,207,135, 46,183,186, 41,129, 13,107,
+157, 6, 82, 74,166,133, 96,234, 11, 94,189,186,202,207,189,241, 28,147,241,136,193, 40,103,172,106, 58, 77,159,249, 86, 72, 43,
+112, 57, 29,197,124,251,250, 46, 55, 30,196,108,173, 52,120,246,242, 58,223,248, 36,230,253, 19,152, 22, 38, 93,111, 60, 30, 19,
+250, 51, 91,137, 5, 75, 97, 77, 39,106,114,174, 93, 51, 76, 36,221,113,129,210, 53,123, 3,179,203, 47,102, 78, 5,215, 55,172,
+129, 74, 87, 68,141,144, 36, 73,104, 52, 26, 38,248, 66, 20,156, 91,242, 89,107,212, 92, 93,116,136,243, 10,148,226,245, 75,107,
+ 68,145, 71,224, 57, 4,158, 67,232, 90,100,165, 38, 79, 36,119,142,198,228, 73,206,211, 23, 87,144,165,226,189,235, 71,220,186,
+115, 74,179, 1, 87,182,150,185,175, 29,254,229, 95,220,229, 43, 47,172,211, 9,124,254,135,223,191,142,237,219, 44, 47, 68, 28,
+156,164,248,161,207, 52, 43,152,230, 37, 11, 59,231,112,130, 6, 69, 28, 83,201, 28,153,165, 84,165, 34,151, 6,178, 4,102, 77,
+244,183,127,253, 63,100, 52,153,112,243,246, 61,238,220,127,192, 36, 78,233,180, 90,196,105,202, 92,167,205,171,207, 63,203,198,
+234, 10,182, 37,248,238,123, 31,114,218,235, 18,133,134, 17,241,212,206, 25,222,124,237,101,238, 62,216,229, 95,252, 63,223, 96,
+ 99,101,133, 87,158,123, 6,215,177,105,183,219, 92,190,112,142, 78,171,197,237, 7, 15,153, 76, 38,252,240,227,219, 60, 60, 56,
+100,103, 99,157,102, 35,100,239,240,136,239,189,255, 33,235,171,203, 92,121,234, 2, 43,179,194,226,131, 27,159,112,127,111,159,
+243,219, 91,204,207,117, 40, 85,201,163,131, 35,226, 36,229,194,206, 54, 11,157, 14,211, 36,101, 18,199,244,134, 35, 60,203,226,
+ 39,222,250, 28,207, 95,189,194,198,234, 10,142,101, 49, 77, 18,222,126,239,135, 12, 70, 35, 4,130,162, 44,153,196,177,225,233,
+ 55, 27, 70,124,106, 25, 58,101,205,143,214,110,230,128, 55,135,123, 28,167, 12,227, 41, 90, 41, 60,215,163,217, 8,104,206,184,
+ 12,165, 50,188,136,193,196, 20, 42, 43,173,144,158,242, 89,126,230,167,216,187,249, 14, 66,143,152,159, 95,163, 53, 63,135,142,
+ 94, 1,171, 61,179, 28,186,104, 85,112,120,247, 79,129, 26, 75,247, 88, 92,217, 32, 30,101,100,217,152, 82,198, 56, 53,168, 90,
+209,233, 68, 44,116, 86,201,100, 66,127, 56,166,221, 10,176,133,205,104, 48, 96,146, 78,112,194,115,188,244, 19,191,197,127,243,
+247, 63,195, 27,150,203,239, 51,226,214,191,232,240,224, 32, 99,126, 57, 96,109, 94,240,123,255,240,239,243,189,111,254,109,108,
+175,137,227,120,212,181, 64, 8,155,178, 42,217, 62,127,141,229,149, 53,100,218,163,223, 61, 33,147, 37,142,215, 33, 92,188, 72,
+123,233, 50, 97,224, 19, 70, 77,150,206,254, 44,162, 86,244, 14,191,199,180,123, 74, 58,125,136,204, 99, 46,191,246,159,112,249,
+245, 87,200, 15,161,136, 39,120, 11, 17,163,147, 93,246,239,190,205,116,112,159,249,165, 75,172,172,191,196,213,151, 46,130,174,
+249,228,227,135,220,254,232,119, 25,157,222, 70, 43, 51,213,208,229,132, 34, 62,166, 22, 62,139,103, 94,161,170, 76,218,161, 42,
+198,212, 42,167, 46,167, 84,114, 76,237, 52, 17,117,133, 99,105,168, 45,226, 60,165, 44, 74, 60,215, 34,203, 74,190,240,159,125,
+157,213,198, 21,214, 54, 44,188, 57, 72, 39,167,184, 27,119, 40,210, 35, 62,189,251,128,197,230, 28,139,107,235, 36,101,147,228,
+ 70, 65,247,232,128,172,177,135, 55,120,196,224,222, 39, 84, 85,133, 82,154,102,100, 14, 52, 1,232,186, 70, 22,198,190, 5, 16,
+ 69,209, 19,202,103, 16, 4, 40, 85,206, 38, 98, 2,203, 49, 99,240,170, 52, 92,145,178,170,104, 55, 91, 70,200,173, 36,174,227,
+ 51, 25,143,168,171,218, 76,165, 42,147, 87,223,142, 90,179,166, 84, 60,209,121, 61, 9, 10,211,154,199, 62,242,102, 51, 66, 8,
+243,154, 12,113, 52, 67, 96, 58,125,207,241,104,181, 91, 51, 62, 5,100, 89, 10, 66,224,187,254,140, 94,170,113, 28, 11, 33,106,
+ 4, 70, 99, 83,228,146, 66,154,162,160, 25, 53, 9,253, 16, 48,163,117,171, 6,109, 25,135,190,133, 17, 53, 87,162, 70,101, 5,
+126,163,129,109,217,148, 50, 51,235,105, 97,211,108, 24,252,172,235, 26, 86,126, 50,141,169,170, 10,219,182,177,183,207,157,251,
+218,227, 76, 87,223, 55, 40, 75,195, 75, 55,233, 48,194,178, 40,139,130,172, 48,226, 2, 0,219,182,104, 52, 77, 8, 10,192,116,
+ 58, 69,235,154, 48, 8,112, 93,143, 52, 73,241, 92,151, 92, 26,148,230, 52, 49,184,214,118,187, 77, 16, 62,222,125, 27, 5,100,
+ 61, 27,147,219,174,139,133, 0,203, 84, 71,166,251,181,129,154, 90, 27, 48,141,174,140,157,193,216,132,106,138, 34,159,125,152,
+ 53, 69,110,178,128,189, 32,192, 17, 80,234,146, 74, 42,180,134,178,148, 63, 18,227,249,190, 9, 87, 17, 22,186,170,176,234,138,
+ 70,163,137, 16,150,177,219,200, 98,246, 62, 53, 89, 38,141,109,194,182,204, 84, 65,216, 84, 26,100, 33, 13, 76,160,174, 13,255,
+ 91, 24,241, 70, 94, 20, 6, 84,163, 43,154, 81,227,201,206, 35,240, 3, 28,207,129,122,182,111,105, 4,132,126,136,227,185,140,
+146,156,110,172,121,255, 72,241,135, 55,134,124,253,250, 41, 63,184,219, 99,152,107, 66,223, 97,101,169,205,214,230, 2,175, 92,
+125,138,179,235, 75,188,120,105,149,181,133, 38,157,208,166,144,154,104, 46, 32,171, 42,100, 94,240,202,165, 85,206,111,207,225,
+216, 14, 11,145,205, 87,190,244, 28, 47,191,116,158, 51,243, 62, 31,222,235, 98,105,120,227,229,109, 22, 22,218, 56, 22, 72, 28,
+ 46,108,180,121,243,217,109,150, 22,155, 44, 69, 46, 23,182,231,248,202,151,159,231,236,206, 34, 79,159, 93,224,210,106,135,103,
+ 47,173,113,254,252, 18, 59, 11, 33, 75,139, 17,109,223,167,237, 59, 20,182, 77, 16,134,172, 47, 68, 44,182, 2, 38, 73,206,255,
+245,111,111,243,175,223,219,103,103,125,142,179, 59,203,220, 79, 93,254,143, 15, 19,110,158, 84,168,218,126, 50,241,105,132, 33,
+113,146, 80, 86, 10,199,114,232,197,166,104,184,221,147,220, 62,138,217, 31,100, 28,143,114, 42, 12, 25, 80, 87,149,153,234,216,
+246, 19,241,162,101,217,164,211,137, 81,132,151, 10,237, 55,121,112,154,242, 96,234,240,205,123, 41, 55,123, 21,223,123, 48, 7,
+ 98,131, 16, 0, 0, 32, 0, 73, 68, 65, 84,225,127,254,214, 67,222,190,117, 66, 35,244, 56, 62, 29,211,108,120, 44, 52,125,176,
+ 96,125, 53, 98,125,185,141,231,185,248,174,224,185,167, 86,184,176,185,128,171, 37,125, 4, 39, 73,197,235, 79,175,178,222,176,
+120,247,198, 1, 39,147,132,170, 18,140,227, 12, 74, 73, 5,132,190,207, 52,251,255,168,122,179, 88,203,178,243,190,239,183,214,
+ 94,123, 60,195,157,111, 77,221, 93, 61, 84,179,155,100,115, 16, 73, 49, 98,147, 52,105, 65, 20, 67, 75,166, 28, 13,136, 37,200,
+146, 32, 25, 80, 16,199,136, 13, 89,158, 32,196, 12,226, 0,126,200, 96,228, 37, 72,148, 68, 8, 98, 36,144, 25,217,138,108,208,
+ 26, 18,205,164, 68, 54, 91,156,123,170,234,174,170,174,186,117,235,142,103,220,243, 26,242,240,237, 91,132,251,169,128, 70, 85,
+157,186,123,159,181,190,239, 63,138,130,125,239,218, 53,226, 52, 35, 45, 10,246, 46, 95,197,100, 41,121, 81, 72,217, 11, 96,123,
+199,131,227, 35,178, 52,231,228,252,156,217, 98, 73,145,165,148,117, 69,221,118,172,150,107,238, 62, 56,100,190, 92, 81, 53, 13,
+111,220,126,155,197,114,197, 98,181, 38, 75, 83, 41, 63,234, 36,236, 98,182, 92, 74,101,163, 86,172,202,138,178,105, 72, 34,141,
+ 11,162,180,189,117,247, 30, 47,125,243, 91,204,103, 75,146, 44,102,127,123,135, 36, 77,184,121,251, 46,207,223,120,134, 23,222,
+241, 12,143, 93,185, 76,219,118, 28, 28, 31,115, 54,155,147, 23, 25,219, 91, 27,160, 52,119,239,221,103, 92,140,185,178,191, 71,
+ 20, 41,170,186, 97,190, 92,225,157,227,234,149, 75, 92,222,223,151, 34,151, 36,198, 35,234,225, 60,203,184,247,224,144, 55,223,
+190,199,249,124,206,108,185,164, 72, 82,242, 44, 19, 1,156,150, 56, 78, 31, 60,189,247,120,103, 33, 72,241,197,241,108,198,157,
+123,247,153,205, 22,196, 73,204,100, 92, 48,202,115,161,207,156,195,186,142,186,233,134,115, 64, 17, 17,136,146,136,173,247,189,
+ 23,147,188,155,229,249,140,197,217,125,178, 75, 99,148, 11,172,150, 71,212,229, 41,235,243,183, 41,203,131, 71,103,141,115,208,
+ 46,239,145, 23, 9,121,162, 72, 99,131,199, 17,250,142,182,169,232,186,134, 52, 86,108,111,110,179, 44, 59,214,203, 53, 79,223,
+120,134,237,233, 38,145, 42, 89,157,125,135,223,253,141,146,111, 47,223,199,248, 67, 41,233, 99,138,228,118,194,124, 9, 59, 63,
+ 9, 63,244, 51,207,163,226,255,148,215,191,244,235,116,213, 17,206,214,184,190, 34,184,134,197,233, 93,202, 70,145,231, 91, 16,
+ 69, 68, 42, 70, 71, 26, 95,159,145,166, 49,249,120, 3,101, 58,178,228, 49, 20, 17,203,147,123,156, 62,124,137,229,193,215, 48,
+217, 38,121,122,153,178,205,169,117, 70,185,120,200,226,224,219, 84,235, 99,234,102, 65,156,110,243,241,207,252, 36, 79, 63,191,
+141,243,154, 91,111,156,178,120,248, 58,171,229, 3,150,167,175,208, 47,223,162, 46,239,210,148, 39, 4,149,178,251,248,199, 89,
+159,126,147,190,153,225,109,133,107, 23, 4,187,198,119,115, 86,203,135,196,163,199,176, 93, 73,215,214,228, 89, 70,145, 8, 12,
+220,180,150,190, 93,144,111, 95,166, 94, 29,211,185, 77,180, 25,115,126, 18, 56,124,237,144, 70,159, 17,183,107,206, 22,231, 36,
+241, 68,154,219, 78, 87, 52,205,130,182, 59,164, 59,121, 72,179, 92, 72,236,234, 96, 99,118,222, 99,187, 14,165, 2,113,150,136,
+102, 42,120,250,182,149, 51,216, 8,180, 61, 30, 10, 79,180,142,168,171,106,184, 84, 69,131,149, 38, 25, 77, 47,194,179,182,105,
+ 49, 90, 68,204,113,154,208, 54, 29, 40, 8,206,209,180, 98,145, 70, 5,218,170, 37,120,201, 93,111, 91,185,167,188,119, 56,231,
+233,123,249, 60, 77, 85, 19,212,144, 98, 58, 64,241, 1, 17, 93,247,157, 31,104,100, 81,211, 95,136,236,146, 88,238,212,190, 23,
+173, 64, 20, 69,196,177,161,174, 27, 2,138, 60,205, 30,157, 99,121,150, 97,123, 71, 98, 98, 2, 82,174,166, 34,141, 15,129,216,
+196, 84, 85, 5,120,178,124, 68,150,101,128,116,112,244,189,165,109, 90,154,182,193,251,192,100, 99,138,137, 34,212,135, 62,250,
+177,112, 1,181, 39, 73, 60,112, 92,142, 72, 27, 20,208,217,158, 40,210, 3,124, 17, 33, 56,132, 36,237,244,174,167,107, 58, 2,
+158,182,181, 76, 38, 83, 34, 21,177,172, 74,240,110,176,164, 41,130,210, 40, 29,177,177, 33,113,126,206, 15,118, 50,165, 72, 98,
+241,141,247, 93,135,127, 4,141,203,176,224,131,100,194,167,121, 38,144,135,150,191, 94, 56,203,136,174,107, 88,151, 82, 26,159,
+101, 25,206, 59,210, 36,102, 60,222, 16, 14,127,128,253,163,200, 16,199, 17,109,219, 11, 60,110, 61, 74,131,119, 14, 99,244, 35,
+139, 80,215,119,244, 78,248,189, 56,142,176, 78,126,168, 33, 4,130, 82,196, 81,132, 86,129,206, 5,241,204,231, 57,117,221,208,
+119, 45,105,146,226,181,162,169, 43,172,149,164,161,241,120, 76,211, 52,104, 21,145,166,223,229, 83,234,186, 70,105, 77,150, 36,
+195, 11,214, 51,153, 78, 9, 3,188, 51, 30,141,136, 76,204,106,177,224,210,196,176,159, 90,158,158, 88, 94,124,126,159,107,227,
+148,235, 87, 55, 48,145, 38,213, 2, 99,250,182, 71, 5,143,211,129,186, 15,120,109,208,214,225,149,199, 4, 69,146,202,118,180,
+ 92,247, 36, 69,138, 13,154, 88, 7, 9,245, 24, 66,117, 76, 36, 41, 73, 90, 71, 88,107,241, 1,148,130,216, 72,229, 96, 28, 41,
+148,142,200,140,162,237,157, 12, 52,218,176,232, 58,190,117,243,152,255,231,207,223,228,107,111,157,242,253,223,251, 52, 87,174,
+ 94,230,255,125, 99,193,183, 30,212,172,170,146,216, 36,108,109,110,202,144,136, 8, 33,189,247,172,215,107,226, 72,147,230, 57,
+ 85, 89,210,118, 61, 46,120,242,172, 32, 56,135,117, 14,235, 29,249,224,196, 8, 33, 96,157, 35, 29, 54,252,213,106,137,239, 90,
+200, 10,138, 52,166,237, 58,166,147, 41,193,123,225,197,203,122,160,118, 68,236,162, 35,205,149,177, 33,154, 31,242, 19,223,123,
+133,159,248,196,115,116,214,225,156, 3,100,152,212, 70, 97,208,228,105,204,186,110,249,191,127,239, 85,222,247, 61, 79,113,116,
+239,156, 47,254,197, 91,252,225,235, 39, 24, 99, 88,218,192, 78,166,153, 53,208, 39, 57, 71,171,146,170,181, 60,255,158,119, 99,
+138, 41,182,235, 69,252,210, 59,180, 25, 6, 72,173,169,170,138,123,183,110, 50,205, 50,118,182, 55,120,112,124,202,254,238, 54,
+169, 73,184,118,245, 50,101, 93,243,230, 91,119, 57,157,207,185,122,121,159, 34,203,104,154,134, 85, 41, 33, 48,219,219, 91, 92,
+218,222,100, 50, 26, 49, 95,173,216,218,152,130,210,178, 81, 69,226, 22,153,142, 10,166,211, 49,119,239, 31,242,165,151,191, 78,
+221,212,108,109,108,176,191,179, 13, 90,243,202,235,111,240,153, 79,124,156,103,158,186, 78, 93,215, 28,157,207,120,245,245,155,
+188,250,230,109,158,124,226, 49, 46,239,238,162,148,226,245, 91,111,242,161,247,190,192,229, 75,251,124,253,149,215, 56, 60, 60,
+ 98, 85,149,108,109,110,240,248,213,171,188,243,153, 39,121,236,202,101,166,163, 49, 81, 28,225,157,231,149, 55,110,241,205,215,
+222,224,240,228, 4,173, 13,211,113, 65,154, 36,196, 73, 76,145,166, 20,121, 54, 8,246, 86,116, 93, 71,211,182, 4, 2,139,229,
+154,213,170,164,233,164, 48, 39, 75, 12,211,241,152,201,100,130,137, 13,120, 79, 64, 68, 83,117,211,210, 89, 75,162, 3,182,235,
+ 81, 59, 55,200, 38,215, 88, 55,134,135,111,127,135, 84,149, 60,243,142,231, 89, 55,154, 85, 41, 48,173,247, 13,205,242,152,221,
+ 39, 62,204,165,235,159,164,158, 29,242,210,239,252, 50,151,158,121,142, 60,153,178, 57, 25, 51,159,157,179,108,114, 30,127,215,
+ 95,197,119, 29, 7,111,124,158,103,158,124, 74,132,192, 65, 46,132, 16, 20,121,166,104,124,198,218, 78,209,233,147,108,236, 60,
+ 67,140,163,111,123, 62,240,169,159,230,159,255, 34,124,129, 5, 47,253,230,132,223,255,151,191,198,201,237, 63, 97,231,218,247,
+ 18, 66,203,205,175,254, 95,156, 29,124, 13,157, 21,100,217,246,192,135, 74,191,198,104,235, 18,207,188,247, 19,196,145, 99,177,
+ 4,162, 49,245,226,132,234,236, 59,120,165,184,242,236,103,217,220,122, 2, 27, 60,147,173,109,218,166,161, 89,157, 19,130,163,
+ 44, 15, 25,231,151,185,241,142, 31, 67,233, 2, 59,174, 41,237, 57,253,225,109,102, 39,183, 57,188,243,135, 28,223,254, 34,217,
+232,113,254,242,143,255, 47, 60,247,119,223, 77,248,227,192, 31,255,230,255,201,171,127,242,143, 72,139, 9,125, 22, 99,203, 57,
+190, 77,248,216,103,255, 59, 84,182,199,209,155, 95,224,224,245,223,166,111,103, 4, 20,125,215, 99,189,198,181, 11,174, 61,255,
+195,100,155,215,200,211, 45,210, 98, 7,175,192, 86,231, 88,247,128,241,214,156,245,242,156,189, 27,239,198,205, 55, 72, 47, 7,
+ 92,215,114,246,246, 77, 38,101,205,106,245,144,120,120,174, 38,142, 9,192,186,148, 90,239, 34, 47,112,193,131,119, 88, 27, 48,
+ 70,224,242, 60,203, 72,243,156,224,164, 48,201, 40, 40,235,154,190,239, 24, 23, 57,235,166,129,160,201,178,152, 44,203, 33, 4,
+170,178,146,203,124, 88, 6,171,170, 38, 49, 9, 23,125,247, 81, 20,161,180,122, 20,132,147, 12, 27,191,137, 52, 89, 33,155,116,
+223,246, 24,173, 49, 89, 10,214, 18, 84, 4, 58,224, 90, 17, 95,167, 3, 34,172,144,182, 70, 65,169, 69, 55,146,101, 25,126,104,
+128, 19,250, 54, 80,151, 53,163,113, 65, 83,215, 68,198,176,185,185,137,115,158,166,111,193, 57,148,142, 81, 74,196,149, 73, 26,
+ 83,151, 13, 89,150,224,131,150, 42,226, 8,186, 70,114, 91,236, 32,240, 67, 49, 12, 57, 17, 6, 37,165, 42, 90, 71, 2, 47,171,
+193,135,173, 21, 0, 81,164,136, 76,140,209, 26,239,229,162, 88, 46,151,100, 89,134, 49, 9, 62,246,143,138,238,163, 40, 2,173,
+ 25, 23, 5,179,249,140,160,181,112, 24, 90, 83,174,215, 52, 77,135, 49, 18,170, 49, 42, 10,180,146,136,187,162, 24,177, 14, 1,
+237,197,123,152,101, 25, 23,138,217,245,122,141,247,142, 16, 28,105, 58, 38, 55,210,172, 22, 37, 49, 46, 72,237,168, 87,158,190,
+239,217,222,222,198, 24, 67,213,180, 4,107, 73,243,140,174,237, 69, 44, 97, 27,146, 36,165,170, 42, 76,100,228, 48,240, 1,107,
+ 35,138,209,136,216, 24,177,218,180, 45, 10,192, 24, 66,104,177, 94, 74,109,240,158,108, 60, 25, 56,142,136,209,192,129, 4,231,
+ 24,143, 39, 4,111,105,157, 99, 52, 30, 83,150, 37,184, 32, 49,130,198,224,109, 71,221,244, 36,177, 40, 29,241, 50, 56,172,214,
+ 37, 38,214, 2, 67, 3, 74,155,225,128,140, 97, 16, 34,206, 58,195,188,213,188, 81,102,124,225,206, 41,137,114, 60, 54,213, 92,
+ 25, 71,188,231, 82,202,118,226,217,219, 25, 51, 41, 82, 46,109,141, 88, 85, 45,143, 93, 78,169, 74, 71,158,229,114,161, 33, 28,
+119, 58, 73, 1,200, 98,177, 54,101, 38,150,151,179,211,100, 89, 68,215, 5,186,182, 33, 67, 97, 35,225,110, 92,217,178,232, 29,
+111, 29,174,105,219,142,147, 69,197, 55,239, 47, 89,215,150, 81,172,121, 80, 58,182,166, 57,197,214, 30, 91,207,239,242,219,135,
+ 61,231, 55, 15, 81, 65, 56,169,116,240,153,206,231,115, 76,100, 48,169,228, 11,120, 16, 47,169,214,128, 34, 47, 70,196,137,101,
+ 62, 95,208, 55,141,148, 28,104,141, 81, 12,233, 76, 5,214, 90,234, 70,224,171, 52, 75,201, 39, 19, 98, 38,172,171,146,174,239,
+153, 76, 38,180, 93, 71, 28,199,152, 40,102,178,145,208, 54,210,148, 4,138, 36, 73,152, 91, 7,163,199,249,213,151, 23, 44,186,
+215,249,207, 62,243, 78,214, 77,160,183,142,117,227,120, 98,119,204,218, 90,154,206,242,249, 63,189,197,170,215, 52,203,146,235,
+ 79,109, 99,148,227,230,105,197,183, 15, 86, 68,131,165,134,224,113, 62,176, 51, 29,113, 41, 73,104,231, 39,152,209, 20,165,135,
+159, 95,111,209, 94,222,101,165, 20,163,209,136,221,237,109, 14, 14, 14, 88, 55, 13,109,221, 48, 42,114,142,203,115,202,186,226,
+177, 43, 87,248,208,251, 94,224,225,201, 41,247, 30, 28,202,214, 26,199,128, 84, 62, 70, 90,177, 90,151, 28,159,157,211, 89,203,
+249, 92,114,223, 55, 38, 35,105,114,138,132, 15, 63, 60, 58,225,230,157,187,172, 86,107,122,103,201, 51,161, 0, 54, 54, 54, 64,
+193,237,131, 3, 76, 34, 34,157,163,211, 51, 14, 79,206,208, 90,211,117, 29,155,147, 49, 27,211, 9, 7, 15,143,176,206,115,124,
+122,202, 40, 23, 65, 83, 80,178,145, 39,131, 45,169,235, 58,150,170,194,104,205,249, 98,206,189,135, 71,212, 77,139,179, 14,101,
+ 20,101, 89,178, 90,173,216,222,218, 36, 53,134,190,235,153, 45, 87, 88, 43,116,138,119, 1, 23, 60, 73,108,216,217,222, 28, 84,
+244, 21,206,203, 51,233,123, 89, 42, 98, 99, 8,206,209,129, 4,239, 24,131, 14,142, 24, 69, 93, 61,164,139, 18,182, 71, 19,178,
+199,247, 56, 59,182,180,117, 73,140, 97,123, 28, 88, 45, 86,148,213, 18,215, 46,217,123,242, 47,113,253,217, 79,177,191,189,205,
+254,245,143,243,210,239,254, 35, 30,220,253, 14,171,233, 22,147,157,125,222,241,194, 15,161, 77, 65, 58,122,156,227,251,127,206,
+ 55,190,249, 50,207, 63,255, 30,198,211, 13, 90,235,192, 7,202,178,163,108, 22,140,243, 57,109,117,155,183,223,254, 2, 77,189,
+166, 94,157,114,112,255, 43,156, 29,255,247,252,212,175,196,252,226, 95,115, 92,218,253, 5,222,126,229, 23,240, 10,158,255,121,
+ 40,151,127,151,127,246,161, 79,115,120,247,247,177, 33,225, 34,116,198, 59,203,234,228, 54,183,191, 99,120,242,198,123,113,139,
+ 59,204,206,142,232,250,142,100,180,207,104,231,157,108, 94,122, 23,187,123,207, 19, 84, 77, 94,108, 48, 95,223, 97,126,252, 38,
+235,217, 91, 88,187, 38,190, 52, 97,182,122,131, 64, 68,104,122,130,178,148,171, 57, 33,138, 41,166,143,241,131, 63,245,175,120,
+241,211, 31,102,244,129,192,173,127,227,185,249,202, 87,137,242,148, 43,239,249, 49, 14,190,249, 27,172,142,103, 92,191,241,227,
+252,216,207,255,111,108, 94,134,111,126,227, 30,237,149,235,184,233,123,185,247,197, 47,210, 55, 21, 96, 48,104, 66, 82,208,212,
+ 71, 4,213, 83,135,183, 69, 83,228, 45,161, 45,233,219, 35,162,253, 45, 30, 30, 30, 98,146, 49,244,151,137, 87,129, 46,158,211,
+189,125, 68,241,216, 62,179,179,134, 36,145,179, 78,161, 80, 90, 49, 25, 79, 88,175, 75, 34, 45,244,165, 2,198,147, 9,125, 47,
+ 40,172,247, 94, 28, 89,189, 32,198,102, 52,194, 90,169, 10,111, 58,241,122, 39,153,164,147,198,102,112, 57,121, 79, 28,197, 84,
+205,138, 16, 68, 35,166, 52,244, 77,207,198,198, 6, 23,101, 46,109,211, 50,153, 22, 68, 58, 70, 43, 45, 41,165, 26, 22,171,133,
+252,185, 38,197,245, 61, 89,118, 17,136,227, 72,211,152, 81, 38,113,178,117, 93, 19,169,128, 34,193, 7, 79,145, 20, 4, 29,240,
+206, 98,123,177,220,181,173,240,235,206, 57,186, 89, 43, 25, 45, 90,188,247,105,154,146,133, 20,111, 2, 65, 65, 91,215, 4,175,
+168,214, 21,105,150,128,146, 90,113, 34, 9,183,233,123, 41, 86,139, 34, 77,150,102,148, 77,245,200,174,109, 46,210,104, 34, 37,
+ 98,149,225, 46, 7, 2,174,151, 73,196, 4,168,235, 53, 74, 69, 44,151, 75,225, 51, 52,162,152, 79, 98, 50,159,211,183, 29, 65,
+ 41,154,170, 38, 75, 51,244,176, 29, 71, 70, 26,119,242,209, 8,156,163, 30,184,197, 85, 89, 50, 46, 68, 92,215, 91,199,198,198,
+198, 35,174,188,105, 91,226, 56, 38, 49,134,173,173, 45,130, 23,200,163,105, 26, 66,164, 25, 79,198,120,103,153,140, 71,104, 37,
+112,120,164,245,224, 15, 86, 67,104,135, 92, 96,163,241, 8,235, 45, 93, 59,252,254, 16,104,251,142, 81,158,203, 69, 48, 30,163,
+ 35,141,237, 36,229, 39,137, 83,241, 16, 58,143,181, 61,182,233, 8, 97,232,203, 86,138,196, 72,171, 14, 4,240, 16,116, 32, 4,
+135, 14, 82,181,105,219,150,209,104, 68,185, 88, 81,213, 18,237, 58,158, 76,136,148,180,210, 9, 34, 34,177,147,180,173,164, 84,
+121, 79, 91,119, 52, 93, 67,146,165, 76,141,136,255,116,148, 96,187,134,166,235, 5,238,209, 96,147,140,239,156, 91,222,172, 18,
+254,191,123, 45, 33, 64,232,164,146,243,137,141, 64,145,104,180,237,120,118, 47,103,219,244,108, 25,152,154, 64,100, 12, 69, 18,
+120,253,141, 35,154,166,225,234, 19,151, 88,173,106, 66, 93,115, 84, 90, 94, 61, 44,217, 25, 41,188,210,172,215, 13,235, 14,124,
+170,249,242, 61,195,126,218,115,117, 75,177,177, 57,229,218,200,240,179, 63,242, 65,158,125, 98,135,255,227,107, 51,254,224,139,
+103,180, 71, 45,238,160, 36, 40,153,134,219,186, 6,173, 81, 33, 48,217,216, 32,205, 82, 52, 74, 2,134, 42,201,218, 87, 64, 63,
+188,204, 73,146, 64, 16,126, 53, 73, 83,161,106,198, 99, 25,236, 66,160,107,231,172, 86, 43, 81,200, 42, 37, 16,150,119,164,121,
+ 70,156,166,108, 38, 9, 40,134,103,230,136, 34,233, 66, 78,146,100,176,140, 40,146, 52, 70, 34, 22, 21, 74, 27,186,108,194,231,
+223,132,231,190,254,128, 79,189,255, 42, 95,125,237, 33,127,246,250, 67,234, 85,207,103, 95,124,154,103,174,109,242,163, 47,222,
+224,247,191,118,159, 63,251,202,109,138, 88,241,212,227,219,124,223,247, 60,193,205,249, 45,206,150, 45,214, 42, 90, 23,248, 43,
+ 31,188,204, 63,254,165, 95,164, 89,207,120,233, 27,175,241,167,183, 23,124,233,181, 99,188, 82,120,231, 97, 72,199,170,202, 18,
+173, 20, 87,175, 93, 97,107,156, 99,189,231,225,209, 41, 85,221, 16,199, 49, 91,155, 91, 44,203,146,170,174,121,226,177,171,236,
+239,237, 82, 85, 21,109, 39, 10,224,224, 47,104, 41,133,175, 61, 93,215,241,224,225, 49, 93,215, 49, 29,143,169,219, 26, 99, 18,
+180,130, 75, 59, 59,168, 40,226,242,254, 14, 39,231, 51,230,243, 5,206, 57, 38,147, 41, 31,124,207, 11, 28, 28, 29,203, 64, 21,
+ 44,109,219, 12, 69, 25,142, 7, 15,143, 73,140,225,185, 27,207,240,236,147, 79,136, 11,197,118,204, 22, 75,154,186, 33, 82,154,
+197,114,197,253,240, 96, 8,250,128,141,201, 8, 23, 2,103,243, 5,203,178, 36,120, 73,212,235,250,134,170,145,184,231,170,233,
+184,188,231,217,222,220,160,208, 26, 19, 25,234,182,148,243, 70,105,210, 98,132,117,142,186,110,112,214,177,174, 42,218, 94,188,
+196,251,241, 54, 86, 41, 34,173, 25,101,153, 12, 75,218,209, 59, 57,124,227,170, 98,214, 30, 17, 5,141,117, 45,147,241,152,213,
+106,197,124,126,206,222,165, 43,160, 44,143, 61,126,149, 94, 93, 7,150,188,254,245, 95,231, 91,125,133, 34,112,237,157,159,198,
+135, 30,187,190,207,238,165,235,212,179, 55, 88,204, 78,240,221, 28,163, 44, 89, 82,112,116,240, 54, 62, 60, 73,154, 38, 36,169,
+161,109,196, 67, 92,174,107, 70,147, 17, 79,109, 77,176,221, 54,171,213,132,108,114,202,253,215,255, 41,191,245,223,252, 3,174,
+252,114,207,187, 62,214,114,118,111,196,171,175, 28, 17,127,254, 18, 31,248,143,231,252,210, 43,191,203,127,251,158, 79,113,248,
+214, 31, 0, 9,113,154,226,180, 67, 57,197,217,241,235,184,222,113,249,234,117,178,145, 39,213,158,174,174, 8,229,109,108,245,
+128,104,244, 62,116,156,211,184,138,245,209, 67,154,229,219,172,231,183, 24,111, 62, 77,150,239, 82, 87, 43,178,241, 62,237,114,
+ 78, 89, 30, 96,187,154,174, 60,163,107,206,137,182,159, 99,118, 55,112,231,117,197,253,131,151, 89,158,221, 98,189,126,128,214,
+154,237,167, 62,196,187,174,253, 32,223,247,233,255,132,249, 44,240,210,111,253, 58,103,103,175, 98,219,115, 66,190, 32,217,219,
+192, 30, 88,130,111,177, 58, 33, 10,138,208, 45,105, 92, 3,244,132,182,199,211, 19, 97,241,125, 67, 87, 41, 50,237,169, 14,206,
+232,168, 48,161,195,108,104, 70,163,156,126,240,148, 55,117,131,243,210, 33, 97,140, 38,203,114,198, 69,193, 98,189, 20,113,178,
+142,112,206, 19,130, 34, 43, 10,148,247,196, 70,236,205,178,108, 9, 31,239,157,151, 14,117, 19, 40,215,107,242, 52, 25, 40, 97,
+ 9,207, 49,198,144,229, 35,214,171,149, 44, 85, 3, 10,185, 94,175,152, 78,167,128,108,196, 4,201, 14, 24,143, 71,120,165, 48,
+ 90,122, 79,234,186, 38, 78, 83,148,146,168,218,216,136,229, 25, 20, 93, 43,129,102,137,201,136, 19, 45, 3,136, 86,216,208,211,
+ 44, 91, 92, 16,101,124,156,136, 48,244, 2, 21,151, 65,160,161,139,122, 82,159, 19, 69, 6,235,123,186,186, 71,233,239, 6,186,
+ 5, 47,176,127,219, 53, 82, 80, 19, 2,145,210,132, 8,146, 84,154,217,186,174, 37,142,228, 12,213, 58, 34,186,254,244, 51,159,
+147, 43, 28, 34, 45,214, 0,231, 3, 90, 73, 72, 76, 18,137,194,123,189, 46,169,170, 26,231, 29, 23,246, 26, 99, 34,186,182,131,
+ 16, 72, 19, 67,219, 43,178, 60,195, 43, 15, 74, 38,136,166,105, 6,249,189, 35, 78, 50,180,209, 34, 16,240, 18, 92,223, 15, 34,
+ 57, 9,250, 55,143,120,175,174,151,139, 58,138,244, 35, 27,156, 7,108, 8,143,224,109,173, 68, 60,145,166,169,124, 49,156,244,
+241, 94, 60, 80,231, 28, 93,215,161,149, 84,212, 69,145,196,240, 37, 81, 76, 64,120, 71,173, 65,161,105,218,150,200, 68,195,139,
+160,229, 65, 15,158,118,165,196, 3, 89, 85, 21, 74,137, 71,176,183,146, 36,148,198,241, 35, 56,185, 11,129, 60, 73, 4, 25, 8,
+129,136,239, 54,120, 53,141,244,223,250,190,151,225, 3, 30, 77,137,117, 93,211,116, 50,197, 69, 90, 99, 18,185,128,170,114, 61,
+248,159, 37,160, 71,134, 11,105, 43, 34, 64, 62, 46, 72,147,148,222, 5, 44,138,133,143, 89,153, 9,231,161,224,205,117,194, 43,
+205,148,159,248,200, 85,222, 58, 91,241,157,163,150,149, 74,121,187,116,140, 47,239,243,176,134, 54,210,236, 95,127,140, 19, 31,
+145,239,239, 50,218,223,165,247, 49,155,219,155,108,110,111,243,194,149,109, 62,116, 99,194,203, 15,215,188, 50,131,247, 63,190,
+205, 7,174,109,242, 61, 31,122,146, 63,191,189,230,191,254,119,119,135,119, 5,186,222,226,113,196,137,160, 17,182,109,101, 24,
+ 83, 18,209, 40,150,164, 24,173, 35,226, 88,178,142,219,182,165,235, 59,234,166,166,169,106,170,186,198, 12,239, 77,215, 75,113,
+130,247, 14,147, 36,180, 93, 39,124,146, 18,113,203,120, 50, 38, 73,146, 97,250, 85,180, 93,135, 49,137,108,118,198, 72,104, 68,
+156, 80,149, 53,222,203, 80, 38, 48, 94,205, 69, 45,106,221, 58,254,240,173, 37, 87, 70,138,207,188,247, 42,239,189,177,203,245,
+171, 19, 78,207, 74, 38,211,132, 44,141,121,254,169, 45,174, 95,154,242,214,173, 19,226,113,138, 27, 77, 24,133,192, 56,209,252,
+216, 15,190,192, 31,126,251,144, 59,183, 79,249,235,239, 79,201,187, 25, 79,110, 41,246,167,134,175, 30,116, 40, 37,207,141,225,
+ 32,113,206, 17, 71, 17, 65,107,222,251,204,147,108,111,110,241,220, 51, 79,114,121,127,159,253,221,109,178, 52, 97,148,201,176,
+ 73,240,162, 93,201,114,225, 5,135,119,166,172, 27, 41,251, 24, 50, 19, 86,213, 26,130,232, 92,198,197,120,208,126,104,230,235,
+ 53,199,167,167, 52, 77,143,138, 52, 27,211, 41,105, 18, 99,189, 99, 99, 60, 98, 99, 50, 25,172,151,163, 65,196, 38,190,223,229,
+122,205,124,181, 36, 77, 82,138, 60,199, 68,154,243,243, 57,179,197,146,186,109,168,234,230,145, 69,117,216, 10,232,251,158,217,
+114, 77, 83,213,244, 67, 46,246, 69,135,252,149,189, 93,242, 44,101,190, 90,163,148,100,224, 43,229,241, 33, 32,121, 20,138, 60,
+207,196,182,167,165, 84, 67, 43,205,168, 16, 11,169, 15, 98, 95,210,132, 71,223, 51,239, 61,145,145, 36,178,222, 5, 84, 4,164,
+ 59,120, 28,179,217,156,182,119,148,101,195,179,207, 62,203,184,216, 36, 47,114,146, 56, 3, 29,209,217,138,213,249, 33, 77,121,
+ 74,181, 58, 96,117,242, 6, 17,107,188,147,152,219, 52, 10,104,223, 16,186, 21,137, 86, 20,121, 74,221, 59,162, 40,112,118,118,
+198,106,189,166,200,115, 70,227,124, 88,114,214, 88,235, 8, 90, 17, 69, 41, 6,199,242,228,109, 30,190,253,103,252,203,255,253,
+ 53,190,252, 71,142, 7, 15,238,113,239,141, 47,176,255,252, 71,249, 59,239,203,184,229,225,217,231,127,154,189,107, 63, 78, 18,
+107,150,103,183,137,226, 13,176,107, 92, 91,211,172,143, 89,156, 31, 82, 87, 53,117,121, 78,189, 56,199,186,142,221, 43,151,152,
+157,158, 50, 63,126,147,227,155, 95, 98,126,118,147,166, 60,161, 24, 95,230,169,247,255, 36,251,151,223, 71,190,181,197,104,122,
+137,174,153,179, 56,121,147,122,121,192,122,246, 6,193, 57,146,209, 54,101,221, 51, 91,220,162, 46, 79,168, 87, 39,212,213, 57,
+182, 58,197,182,231, 92,187,241, 89, 86,229,138,251, 55,127,159,245,250,129,120,211,155, 25,170, 92,209,172, 42, 38,187, 55, 88,
+ 47, 14,113, 77, 5, 64, 62,218, 3,223,225,187, 21,202,246,152, 44, 37,210,150, 34,141,217,217,217,165,237, 61,171, 85,141,237,
+150, 96, 59, 18, 12,147, 34,197,249,142,166,149,250, 93,103, 37,122,220,245, 14,165, 21, 74, 67, 18, 27, 20, 10,231,123, 98, 19,
+201,115,110, 91,210, 60,147, 68,211,166,145, 51,161,105, 37, 31,164,105, 9, 90, 68,215,106, 56,139,162,225,220,141, 34, 77, 80,
+160,149, 65, 33, 67,128,142, 35,240, 98,147,107,234, 86,254, 28, 31,168,235, 18, 41, 10,235, 40,178,161, 25,206, 91,226, 36,166,
+ 92, 11, 26,109,134, 37,213,245,130, 26,162, 35,218,182, 37, 47,114, 65, 57,179,140, 60,207,233,135, 64, 29,107, 5,205, 75, 77,
+ 78,154,100,228,121, 70,158,100, 36, 89,138,179,158, 56, 78,240,182,147, 62, 18, 20,222, 5,241,189,107, 77,219, 53,164,105, 2,
+120, 17,237, 5,168,202, 53, 89, 38,218,154, 72, 43,113,139,132,128, 13, 2,193,247, 93, 79,116,237,137,235,159,187, 80,131,135,
+ 32, 13, 65, 90,107,154,166, 21,158,218, 90,202,170,194,123, 79, 64, 20,170, 70, 27,178, 76,120,205,200, 12, 13, 52, 65, 4,105,
+214, 90,146, 88, 82,229,154,174, 17, 49,157, 86,152,139,254,215, 65, 24,161, 35, 67, 89,151, 56, 43, 54,175, 40,254,110,191,186,
+ 49, 82, 38, 99,123, 79,219,117,114,137, 71,154, 72, 9,124, 66, 8,104, 99, 4,146, 11, 34,106, 88,173,214,116,157,132,222,132,
+ 32,201, 64,109,219,139,152,174,170,104,235, 26,235,130,228,206, 59,121,112,109, 43, 23,173,116,201, 75, 16, 0, 72,175,109, 8,
+ 97, 8,231,207,137,227, 88, 84,150, 94,196, 19,109, 43,133,244,214,246, 16, 46,212,237,154,160, 53,174,119, 52, 85, 37, 60,220,
+ 32,208, 75, 18,105,227,105,219,134,190, 23,200,178,110, 27,113, 28,104, 17,129,196, 70,252,238,189,181,104,165,233,186, 22,107,
+ 45,197,104, 68,150,103, 98, 53,204, 50, 92,240, 82, 20,160, 68, 37,106, 98,105, 36,138,163, 24,165,165,218,207, 90,139, 87,138,
+143, 92,139,249,235,239, 45,248,194,159,189,205,227,143,109,115,247,193,140, 98,179, 32, 74, 82,186,214,145, 38, 25,165, 15, 60,
+253,248, 14,190,180,168,206, 51, 73, 52, 89, 26,115,109, 26,243,244,165,156, 95,253,210, 61, 14,215, 29,214, 69,252,220,139,215,
+248,212, 39,158,229,164, 51,252, 23,255,246, 30,181,143, 8, 62, 12, 1, 36, 14,165, 60,202,203, 48,164, 77,140,235, 26,250,160,
+ 32, 72,114,148, 28,196, 17,205, 0,177, 22, 69, 65,172, 99, 64,211,118, 45,121, 42,150, 41,165,213, 48, 4,201,159,107,226,139,
+254,225,140, 16, 4, 81,202,242, 28,208,131,226, 83, 4, 88, 58,138,208, 90,160,218,222,246,146, 42, 21, 44, 40,105,238, 19,248,
+ 77,129, 10,104, 29,147,166, 6,175, 34, 94, 58,232,185, 62,106,120,108,119, 66,145, 37,236,239, 20,130, 36,184, 64,239, 61,155,
+ 27, 99,158,125,106, 31,215, 91,110, 61,152,227,231, 43,222,113,117,139, 75,211, 2,187, 90,178,181,145,242,217, 23,159, 65,197,
+ 26,235, 33,198,243,213,187, 11, 14,207, 75, 8,158,206,182,164, 38, 25, 98,148, 13, 40,184,126,105,151,219,119,239, 97,189,167,
+110,234, 33,134,185,230,116, 49,167,170, 27,146, 56,230,225,209, 49,171,178,228,224,225, 17, 15, 79,207,168,155,134,211,243,115,
+150,203, 53,117,221, 80, 14, 91,173,208, 85,226, 48,145, 38, 67, 79,150, 74,226, 96,100, 52, 33,120,242,225,221,246,206, 51, 95,
+174, 56,159,207, 57,157,207,121,112,116,202,170,148,195,108,177, 92, 81,213, 13, 16,184,188,183,199,100, 44,221,214, 23, 91,195,
+100, 52,126,164,230, 79,210,148,205,201,136,141,233, 20,173, 7, 20, 74,139,232, 76, 71,134, 0, 92,221,223,227,137,107, 87,208,
+145,216, 60, 79,102,231,204, 22, 11,140,137,137, 77, 44, 72,152,243,116, 93,143, 15, 66,189,229,113, 66,154, 37, 84,117,195,217,
+124, 78, 85,215, 98, 27, 76, 18,162, 72, 44,176, 4,209,245,152, 40,134, 72, 14, 66,148,161,243, 25,243,249, 57,193,123,166,147,
+ 17,157,237,135,214,197, 30,231, 97,117,126, 74,228,155, 65,253,125, 68,183, 62,198,219, 5,202,247, 16, 52,193,117,232,216, 80,
+140, 71,140,198, 19,210, 98,196,178, 92,146, 38, 9,193, 6,146,193,207,127,116,116, 68, 85,137, 23,122, 52, 30,211,117,142,217,
+108, 54,124,239,115,214,171, 5, 69,220, 16,181,119, 56,185,243, 59, 60,120,227,119, 57,189,253, 69,110,127,253, 37,110, 53,255,
+ 17, 63,241,177,158, 79,222,208, 60,224, 18,233,228, 67, 60,245,158, 31,230,195,159,250,175,248,193,159,249,199,236, 62,249,163,
+188,246,231,191,134, 11,146,207, 17,186, 14,175,160, 90,156,211,181, 37,121,210,176,154, 29,208,148,167,180,245, 57,116,115,130,
+210,100,147,199,233,108,197,236,228, 38,179,243, 91, 44,207,238,178,120,240, 13,214, 39,223,196,117,107,118,175,127,130,113,182,
+ 77, 90,108,178, 58,185,203,114,118,139,245,252, 62,125,179,162,171,239,179,154, 29,144, 77,159, 98,181,188, 71, 85, 30, 97,155,
+146,190,155,227,250, 21,190,159,161, 53,140,118,222, 69, 94,236, 10, 31, 29, 37,164,197,132,224, 59,250,186, 36,205, 99,124, 39,
+165, 95,197,104, 76,219,181, 66,193, 42,133,107, 86,120,111,201, 76,198,246,214,136,186,153,211,219, 22,239, 44,109,215, 83, 20,
+ 57, 38, 75, 41, 75,161,248,180,142,113,206, 2,138,217,233,140,172,200, 0, 68, 17,222,201,125,161,181, 68,133,151, 85, 35, 75,
+143,214,244,118, 16, 66,218,158, 72, 71,152, 56,162,235, 44,145,150,193,192, 68,241,208,153,160, 73, 82,121,159, 46,206, 24,239,
+122, 84, 36,103,188, 70,145,100, 9, 93,223, 19,156,228,174, 24,109, 32, 72,195,102,211,182,120, 68,251, 37,100, 53,160,196, 91,
+158, 38,153, 12, 20, 94,203,103, 72, 98,210, 56, 38,138, 13,209, 48,160, 92,228, 88,228,121, 70, 60,116, 58, 84, 85,137, 82,138,
+170, 90,203,249, 25,137,176,187,109, 26, 46,234,156,181, 70,190, 43,120, 70,121, 65,223,203, 61,165, 53, 72, 79,139,160, 0,209,
+227, 79, 62,245,185, 72,171, 65,189,106, 36,123, 92, 43, 80, 74,254, 81, 1,242, 44, 38, 49, 41,121,145,201,135,138, 36, 72,191,
+170, 74,162, 72,252,219, 38,210,120,157,200,164,100, 37,180,223, 59, 47, 31,160, 40,104, 58, 73,229, 17, 78, 25,210, 52,126,228,
+225,139,227, 88, 90,167,218, 22,148, 76,236, 23, 28,100,150, 37, 24,147, 16,199,178,237,121, 36,154, 86,161,112,189,101,181, 30,
+ 96,110, 96, 60,154,160, 81,100,133,148,179,120, 4,125,104, 26, 81, 7,134, 16, 96,168,150,141, 34, 9,206,183, 85,133, 11,138,
+201,116,140,235, 3,253,192,245, 37, 38, 65, 27, 77, 85, 87, 36, 73,130,117, 98, 23,184,200,234, 77,210, 4,105,208,145, 90,206,
+166,109,232, 7, 24, 8, 2,113, 18,227,131, 88, 37,186,190, 35, 56,249,117,164, 34,172,147,162,123,239,189, 12, 33,195, 38, 89,
+ 87, 13, 73,158, 80,150, 21, 23,181,180, 89, 33, 74,207,170,174,240,202,147,167,133,252,187,162, 24, 53,188,233,129, 64,231,228,
+ 69, 86, 74,146,187, 66,215,242, 79, 62,115,141,215,190,249, 22,223,252,250, 27,156,246, 70, 46, 43, 29,161,202, 30, 95, 85, 20,
+ 17,236,239,142,121,229,173, 19,178,166, 98,172,122, 46, 79, 83,186,166, 35, 9,158,127,246,135,119, 56, 90,183,216, 30,174,108,
+166,252,207,127,255,175,176,116,240,247, 62,127,139,219,103,149, 12,110, 77, 75, 22, 39, 16,137,157,163,233,106,121,217,116, 16,
+232, 89,121,178, 34,151,144, 9, 45, 95, 1, 63,100, 22, 95,212, 17,246, 3, 42, 99,146,152,174,105, 64,235, 1, 1, 81,131,187,
+ 64,225,250, 94, 4,112,113, 76, 59,160, 26, 93,215,226,156,195,133, 48,240,215, 61,146,108, 24,136,180,162,181, 61,227,209, 68,
+ 6,206,174,195, 6,113, 67,120, 2,145,209, 40, 21, 73, 67,148,243,252,241,205, 57, 55,166,129, 23,158,216,166,108,122, 17, 70,
+133, 0, 65, 81, 55,162,148,221,155, 36,188,176, 99,184,114,117,135, 91, 71, 53,166,169, 57, 89,212,204,208,252,240, 71,158, 98,
+111,115, 68,221, 57,138, 84,168,167,151,238,150,148, 85, 73,132,162,110,106,148, 14,104, 37,220,163, 15,138, 44,138,120,229,230,
+155,220,186,115,151,195,147, 51,102,139, 5,135, 71,199,204,230, 11,238, 31, 30,113, 58,155,115,116,122,198,124,185, 98, 85,150,
+178, 45, 55, 45, 93,223, 63,138,107,222,152, 76,184,188,191, 39,223, 23, 29,177,177,187, 75, 49, 25,203, 80,170,101, 0, 55,198,
+ 12,195,208,176,185, 16, 48,209,208,107,224, 29,103,179, 25, 7,135, 71,172,171,154, 11,120,114, 49, 64,149, 69,150,179,179,181,
+ 69, 80, 18,224, 52, 95, 45,105,187,158, 36, 54, 92,185,114,137, 43,219,219,152, 68, 54, 36,231, 60,214,123,156,119,204,206,231,
+188,126,251, 46,227,124,196,254,206, 22,105, 42, 8,206,233,217,140,217, 98,201,195,147, 99,230,139, 37,199,103,231,204,151, 43,
+250,129, 39, 77,147,152,178,106, 36, 52, 42, 4,154,182,101,177, 90, 49, 91, 44, 89, 87, 53,222, 89, 70,121, 78,150,166,120, 47,
+136,157,216,146, 26,210,233, 62,155, 91,155, 52,229,138, 40,214,132,160, 57, 61, 57,130,225,123,145,100, 9,109, 35, 97, 77,147,
+ 34, 35, 78, 13, 58,244, 24, 35,142,129,243,217,154,227,195, 59, 44,207,142, 56, 60, 58,225,248,232, 1, 93,211, 48, 30,141,233,
+172,124, 87,139,162, 96, 60, 26,227, 92,201,106,177,226,244,252,156,201,120,194,214,214, 54,145,246,180, 14, 98,147,202,153,163,
+ 20,163,209,148,237,173, 41,151,246,246,217,220,119, 28, 61,120,153,127,245, 91, 45,183, 86,239,100,227,131, 10,123, 47,231,225,
+189,183,248,232,139, 79,176,179, 27,152,108,237, 51,218,249, 48,247,223,248, 19,218,245, 49,232,152, 72, 27,140, 73, 88, 47,142,
+169,150,103,104,191, 68,133, 6,215, 28, 83,151,231,168,126,142, 86, 45,203,249, 67,170,179,251,156, 31,124,153,213,209, 55,168,
+151,183, 73, 70,251,236, 94,255, 56,239,122,255,207, 82,164,219, 60,245,194,243,236,237,190,139,227,163, 59, 44, 79,223,160, 93,
+221,161, 57,123,157, 98,242, 52,147,189,119, 18, 97,201,199, 59,172, 23, 15,104, 87,119, 9,118, 69,219,159,226,109,198,120,231,
+ 6,251,215,191,159,235,239,248, 4,219,143,191,143,182, 60,167,173,142, 9,190,167,199,144,196, 26,232, 25,101, 6,235, 32, 50,
+ 9, 85,125, 6,173,160,165,211,105,193,114,249, 16,219,183,100,121, 46,225, 95,163,130,170,108, 72,146, 24,112, 88,235, 72, 19,
+131,183, 22,107,165,182, 56, 47,114,209,211, 84, 53,189,237, 49,137, 80,118,203, 82,212,239,121,150, 19,153,132, 36,145,226, 49,
+ 99, 12, 33,210, 4,239, 73,211,140, 60, 17,158,187,183, 14, 21,164, 19, 61,138,227,129,163,239, 40, 70, 5,206,123, 70,163, 17,
+ 73, 28,211, 13, 17,177,121, 94,128,146, 69, 45, 54,154,182,151,134,207,216,136,230, 9,148,200,163,188, 27,218, 66,229,251, 85,
+150,149,156,127,214,203,121,166,244,163, 0,154,246, 34,221, 52, 72,244, 45, 12,231,181, 10,172, 6,103, 73,211, 52, 88, 43,193,
+ 86,197,104,132,119,110, 8, 70, 83, 40, 31, 30,157,147,214,245,168, 72, 65, 80,196,198,160,148, 36, 47, 70,143, 93,191,254, 57,
+165, 53,200, 2,131,117,158,216,200, 95,134,247,100, 89, 70,211,246, 36,169,108,206,177, 49, 18,159,167, 21,120,143, 13,110, 8,
+252, 16,222, 54, 4,233,148, 14, 46,144,141, 10,226,200,224, 58,139, 49, 9,193, 13,226,167,216,160, 34, 45,121,182,182, 35, 75,
+ 51,218,190, 37,248,128, 29, 96,237,174,235,176,206,146,101,169,108,129,195, 67, 98, 56,192,215,171, 21,101, 85, 14,246,129,152,
+209, 40, 39,104,141,209,145, 92,254,214,177, 90, 47,209, 65,242,234,139,241,152,241,104, 68,158,229,128, 52,228,164,105,138, 87,
+138,241,116, 76, 20, 69, 92,228,242,218,206,138, 7,223, 65,154, 9,199,107,140, 28,142, 10,201,181,191,224,123,173,181, 52, 67,
+ 56, 65, 8,129, 98, 60, 66, 69,234,223,203, 9, 63, 9, 75, 0, 0, 32, 0, 73, 68, 65, 84,207,111,170,134,222,246, 4, 37,151,
+212,120, 60, 38,207,115,148,252,216,209, 90, 81,215,173,240,194, 54, 48, 29,143,232,173,101, 84,140,228, 50,114,194, 59, 37,137,
+ 12, 77, 10,217, 76,211, 44, 39, 78,100,211,205,179, 12,107, 61, 62, 56, 92,223,243,193,235, 83, 62,126, 69,241, 23,247,214, 44,
+108, 76,148, 68, 60,117, 73,244, 3,213,172,100,127,175, 96,188, 53,226, 75,183, 78,217, 75, 35, 82,235,217,154,102,196, 33,144,
+230, 49,255,227,151,239,115,127,222, 16, 71,154,186,131,255,225, 23,191,143, 43, 91, 35,254,206,111,222,227,238, 66,218,200,100,
+192,113,100, 69, 38, 23,110, 36,185,248, 42, 40,186,178, 68,235, 8,156, 39, 49, 18,121, 88, 87,149,124, 1,252,197,151, 74,126,
+ 61,153, 78, 6,136,171,196, 13,238, 3,169,195,149,173,188,235,186, 71,112,237,186, 90,227,157, 80, 43,192,144, 90,152, 12,195,
+102, 44, 83,183,119, 36, 73, 74,240,129,174,235,136, 35, 25, 24,146, 56, 17, 58,196, 57, 20,154, 44, 75, 72,147, 76, 56,235, 16,
+241,218,237,135, 28, 30,157,243,193,103,247,112, 94,188,212, 90, 11,186,212, 44,215, 60, 60, 56, 98,243,210, 37,174, 95,223, 99,
+190,110, 80,235,134, 47, 31,158,145,228,134,127,241,123,175,242,246,237, 51,126,251,171,119,249,228,251, 31, 99, 51,143,248,163,
+ 55, 78, 89, 53, 94,168, 35,107,233, 26, 41, 21,234,122, 75, 99,123, 54,243,130, 34,207,232,123,203,168,200,169,235,150,205,233,
+132,221,237,109,210, 56, 38,205, 82,182, 54, 37, 76, 35,207,114, 54, 38,242,222, 84,117,205,104, 52,226,198,147, 79,112,245,242,
+ 37, 2,130, 76, 41, 4,137,218,185,124,153,237,221, 29,116,154,162, 99,121, 38, 1, 65,158,188, 15, 92, 84,197,234,129,102,210,
+ 81,132, 15,129,190,151,129, 22, 36, 44,230,124,190, 96, 54,159,163,149, 38, 54, 17, 77,215,211,181, 61, 77, 39, 54,157,174,179,
+ 28,158,158,242,224,225, 17,214, 9, 77,180, 88,172, 57, 61,159, 83, 14,158,246, 7, 71, 71, 88,107,217,217,222,100,127,123,139,
+221,237, 45,182,166, 83, 46,237,237,145,165, 9,167,231, 51,170, 90,162,102,211, 84,138,153,138, 44,103, 52, 42,200, 83,105,106,
+ 12, 65,134,237,182,109, 89, 87, 53, 77,219,162, 35,121,207,162,225,255,107,173,176,253, 10, 19, 79, 24,109,108,163,157, 35, 73,
+ 97,111,111,159, 36, 78,105,218,154, 44,205, 41,178,148,211,243, 99,140,201, 8,192,100, 58,197,117, 45,243,249,138,107,207,253,
+135, 60,245,238, 31,197,121,199,106,113,128,107,151, 4, 20,214, 71,168,200, 8,197,228,123,156, 21,157, 64,106, 32,224,153, 47,
+214, 84,101, 73, 62,158, 50,202,115,146, 56,198,217,142,166,174, 7,209,167,156, 19, 93,227,104,150, 15,208,213,107,124,231,207,
+ 62,207,183,254,205,203,220,125,243,203, 60,120,235, 43, 52,230, 6, 63,251,115, 35,174,221, 48,180,179,167,185,246,158,159, 34,
+219,216,162, 94,157,177, 58,123, 11,103, 7, 61, 80, 61, 99,189, 92, 48,159, 29, 83,151, 43,218,186,100,185,156,225,218, 53,169,
+169, 9,110, 5,174, 71,227, 81, 10,188, 45,113, 42,166,152, 92,197,134,192,157,155, 47,179, 88, 46, 89, 46,110, 82,207, 95,161,
+155,223,164,179,138,231, 62,242,183,185,122,253, 69,162,108,194, 11,239,255, 33,130,154,208, 84,247,153, 63,252, 22,213,236,140,
+189, 39,191,159, 27,239,255, 27,220,120,238, 47, 17, 66,130,237, 78, 9,225,148,106,118, 31,219, 59,242, 52, 33, 73, 32, 56, 79,
+239, 53,231,179,115,156,183, 20,105,193,214,206, 46, 79, 62,253, 24, 85,179, 32, 73, 98,218, 78,242, 6, 70,227, 17,206, 65,219,
+212,152,120,208, 44,165, 41,182,151, 2, 23,173, 53,197,100,132,210,122,184,108,123, 57, 27, 8,104, 68,255,212, 59,247,200,134,
+230,125, 24,150, 55,169,229,206, 82,217,154,219, 78,238,145, 56, 54,232, 40, 22, 29, 71, 16,109,149,237, 45, 89,146,224, 93, 32,
+203, 11,218,166, 37, 47, 10, 65,112,181,145,184,226, 84,144, 71,133,148, 23,121,235, 72, 50,137,129, 77, 98, 67, 58,160,185,202,
+122,210, 44,197, 5, 79,112, 1,147,198,143, 80, 65, 51,160,148,242,201, 3,125,215, 62, 66,168,154, 70, 10,210, 66,240, 2,173,
+183, 13,218, 24,210, 84, 4,227,113, 28,147,166, 41,125,223,147,100, 41,113, 28, 99,251,142, 56, 78,200,226,148,139, 52, 61, 29,
+ 71,242,157,184,250,248,227,159, 83, 74,161,144, 47, 58,128, 4,250,119, 4, 37, 28,181,137, 69, 25,222,247, 61,104,169, 36,245,
+206, 97,210, 20,223, 59,170,186,161,235, 45,125,215, 2,210, 92,131,146,182, 25,201,209,149, 90,185, 52, 77,136,141,168,215,219,
+174,195, 89, 43,255, 88, 19, 1,154, 8,169,105,236, 58, 41,200,200,243,156,222, 58,180,138,104,187,150,178, 44,105,154,134,182,
+ 17,129,197,133,232, 32,132,128,245, 14, 29,228, 18, 14, 33,176, 44, 75,250, 33,191, 30, 16,110,114,176,149, 85, 77, 45, 92,176,
+214, 76,166,147, 71, 60, 73,223, 58,218,190, 37,205,133, 62,232,218, 22,180,252, 80, 9,208,214, 45, 85, 61,192, 36,107, 17, 48,
+ 69,177, 8,250, 76, 28, 51, 46, 10,208, 32, 17, 2,158,182,110,137,147, 88, 46, 7,165,240,206,202,101,156, 74,101, 95,108, 98,
+140, 73,176,214,163,209,228,227,156,120,240, 55,102, 3, 47,211,245, 29, 65,228,177, 2,249, 40, 45, 47, 46, 16,233,136,186,145,
+ 2, 19, 17,108, 24,186,174, 37,207, 11,126,226,221, 25,245,186,228,164,234, 89,174, 26,246, 70, 25, 81,172, 88,247,129,189,189,
+ 49,227,113,193,205,179, 10,223,116,108,116, 61, 86, 5,118,115,195, 31,223, 93,240,191,126,249, 1,139,186, 35, 85,154,211, 6,
+ 62,250,174, 29,254,201,207,124,146, 95,250,205, 59,124,251, 97,135,142,228,115, 68, 70,252,227,105,146, 12,162, 23, 79,156, 24,
+218,166, 69, 25,131, 27, 54,106,235,196, 61,160, 7,142,220,249, 64,145,231,164,105, 78, 81,100,212,173,216,154,130, 12,191,160,
+ 20,163,241, 88,166,236, 60, 39, 73, 18,121,238, 3, 7, 28, 25,177, 65, 78,167,211,193, 11,218,147,198, 41,145,249, 46, 95,223,
+116, 50, 44, 74,246,186,167,110,154, 71,207, 52,205,114, 18, 35, 81,199, 90, 71, 82, 1,153,165,140,178,132,247,108, 6,222,255,
+142, 75,244, 46,160, 99, 77, 20, 2,202, 40,210, 81,198,100,123,155, 16,107,180,247,124,253,246, 41, 7, 51,113, 53,164, 69,198,
+ 26,207,201, 89,205, 91, 7, 11, 62,251,226, 13, 54, 70, 49, 47,222,216,102,119, 58,226,168, 12,180,206, 93,184, 65,137,147, 4,
+111, 29,135, 15,143, 72, 76,196, 83,143, 95,227,241,171,151,216,222,220,224,210,222, 30,151,119,183,217,221,217,230,242,222, 46,
+219,155, 27,108,109, 78,201,210,132,221,173, 45,182, 54, 54,112,214,178,183,189,197,222,246, 46, 33, 56,113,114, 12,223, 95,111,
+ 45,221, 64,219, 20,163,156,241,120,196,104, 50, 97,178,185, 73,148, 37, 68, 38, 33,138,227, 65, 4,235, 8, 32,207, 82, 75,143,
+129,136, 64,191,251, 95,150,101,196,137, 33, 75, 83,138, 60, 37, 79, 19,182, 54, 55, 48, 38,226,244,124,198,114,181,102,185, 46,
+153, 45, 22, 88,231,217,216,152,112,109,127, 23,133,162,119, 78, 16,186,174,103, 58, 30,147,198, 49,227,201, 68,108, 57, 0,136,
+ 11,163,109, 27, 58, 59,244, 79, 88, 75,154, 9, 18,103, 34,205,198,120,204,230,116,202,222,246,150,244, 26,148, 53,139,229,138,
+211,243, 25, 0, 23,141,143, 62,120, 82,173, 8,253,156,216, 87,178,233,147, 14, 72,144, 29, 80,165,154,243,249, 57, 4,197,206,
+238, 46,203,245,138,174,233,208,145, 97,115, 99,131,233, 19,239,100,243,242, 71,217,127,252,163, 92,190,254, 81, 76, 86,176,154,
+221,163,111, 86,152, 88,150, 1,173, 60,109, 39,154,161,174,115, 56, 63,124,219,131, 99,126,122,204,249,217, 67,234,182, 97, 58,
+221, 96, 50,153,226, 66, 96, 62,159,179, 92, 86, 98, 95, 11, 17,193,247, 60,113,117, 11,215,220,161, 61,255, 54,171,147,111,240,
+240,173, 63,226,203, 47, 63,205,139,127,237, 50, 31,123,111,224,240,222,148,100,251, 35, 92,127,239, 15,240,158, 15,253, 45, 62,
+252, 3,255,128, 15,126,242,151,248,218, 31,253, 79, 4,101, 73,227, 92, 56,104,165, 8, 65, 81,119,115,214,231, 71, 52,205, 26,
+250, 37,101,121, 78, 87,173,113,174, 34, 43, 70,144,102,172,151,199, 60,184,245,219, 28,188,250, 27, 52,103,175,210,206,239,208,
+ 86, 53,147,107, 31,102,247,234,247, 48,221,188,193,237,155,255,150, 59, 55,255,148,249,201,183,177,237,219,172, 86,247,137,204,
+ 6,187, 79,254,101,118,175,126,148,117,249,144,131,219,127,192,234,236, 14, 76,206,113,103,119,177,173, 34,137, 3,203,243, 83,
+154,166, 98,126,118, 76, 26,199,100,121,202,229,203,151, 24,143, 38, 24,147, 81,213, 75,218,182, 39,142, 21, 70,105, 84, 36,124,
+180,240,216, 45,109,219, 19,188, 32,177, 93, 47,177,222,125,223, 17,199, 17, 74, 73, 92,170,137, 83, 18, 19,225, 81,172, 6, 21,
+250,104, 52,162,243,150, 44,201,176,182, 35,207, 11,146, 36,197,245, 29, 77,223, 13,195,172,108,187,145, 82,180,253, 96,143,236,
+ 44, 62, 4,188,135, 98, 92, 96,125, 64, 71, 9,222,139,146,190,237, 59,186,166,195,196,146, 69,210, 54, 50, 4,184,193, 70, 86,
+ 55,210, 50,231,125, 0,239, 49,137,161,115,150, 68, 39, 4, 2,190,183,232, 56, 65, 69,223, 13, 90,138,147, 24,212, 16, 46, 99,
+ 7, 13,146,181,162,251, 72, 12, 77, 85,203, 18,231, 61,101, 93, 19,169,139,103, 28, 48, 70, 50, 13,186,174, 69, 71,114, 79, 56,
+235, 9,200, 66,237,144,240,229,104,186,181,253,185,178, 92, 83, 87, 53, 77,223, 62, 18,135, 69, 90,108, 6,178,169, 8, 84,153,
+ 13,144,178,137, 13, 77,221, 8,212,233, 68, 16,144,102, 25,145,138,165, 21, 39, 77, 36, 61, 74, 65, 85,215,131, 4, 95,136,125,
+235, 69,157,156,196,178, 93, 73,135,185,168, 73,227, 56,150,203,110,248,162,186,225, 11,175,133,232, 31,190, 20, 8, 7, 99, 34,
+178, 44,163, 40, 50,178, 44,127,196,185,117,141,248, 18,219, 74, 4, 82, 69, 81,200, 75,211, 75,215,174, 15,194,249,166,137,240,
+155,214, 90,130, 18,203, 66,215,181,164,105, 78, 83,214, 67,195,142, 17,200,167,151, 52,162,229,106, 77,215,247,212,117,131,245,
+150, 40,146, 52,187,188, 40, 6,136, 62,224,157,192, 35, 33,132,225, 65, 68,131,175, 58, 34, 56,135,142, 20,125,103,233,109, 47,
+ 27,109,111,177,125,199,104, 34,106,239, 36, 78, 8,195, 36,169, 17,104,166,183,189,188, 20, 78,132,127,214, 90, 8,208,245,162,
+126,135, 32, 13, 93,206, 98,116,140,237, 42,126,229, 7, 46,241,197,215,143,233,219, 64, 19, 2,219,153, 38,219,219,100,146,138,
+ 40,241,238,193,140,157, 84,241, 67, 31,188,198, 70,166,208,193,115,167,236,249,181,175, 28,224,189, 71, 71,242,242, 87, 1,254,
+233, 79,127,152,187,243,158, 95,253,147, 3, 25,184,162, 88, 4,122,157, 37, 73,100,130,149,109,106,176,237, 41,132,126,208, 10,
+105, 51,210, 76, 38,147,193,115,156,224,156,165,119,223,173, 72, 20,177, 37,140, 70, 35,249,187,141,161,239, 58,156,247,120,239,
+ 30, 9,237, 58,219,201,207,171,174, 9, 90,132,103, 98,173, 20, 65,213,106,177, 34, 78,132,163,170,203, 82,166,232, 68,114,195,
+ 93, 8, 52,149,116, 27,247,109,135, 40,112, 61,182,147, 65,213,104,131, 51, 25,151,210,150,143, 61,183,135,117,142,166,181,124,
+235,235,119, 48, 81, 68, 49, 22,127,172, 14,240,240,104,206,239,253,197, 3,172, 14,172, 23, 53,135,109, 79,236, 20, 47,236,228,
+ 28,172,106,254,234, 71,110,144, 38, 17,153,129, 23,118, 13,159,122,207, 30, 73,146,240,246, 2,226, 56,165,183,242,111,203,138,
+ 17,111,190,117, 27, 2,100, 73,194,198,116,204,198,120, 76, 8,210,117, 16, 25, 67,145, 38,152,200, 48, 30,141, 41,138,140,120,
+ 24, 92,198,227, 66, 4, 64,128, 30, 10, 79, 76,108,112,206, 82, 87, 21, 73, 18, 19,180, 34, 56,201,106,232,218,150, 56,206, 40,
+138,156, 46, 4,138,141, 13,242,241,148, 56,205, 81,145,108,236,222,123,250, 94, 96,239,139,255, 76, 20,177, 57,157, 14,233,127,
+ 82,188, 18,188,103, 93, 86,244,253,144,239,142,108,246,203, 33,213,170,200, 51,182, 55, 54, 80, 90, 44,171,171,117,201,225,209,
+ 49,117,215,202,240,154, 74,181,164, 11,210, 27,209,118,146,119,209, 89,233,193, 22,177, 81, 74, 49, 8, 35, 37, 63, 99,160,196,
+ 0,175, 2,109,215,138, 82, 62,120, 73,123, 84, 26,107, 29, 77,211,209,119, 53,182, 89, 82,171, 17,248, 64, 20,137, 74,184,105,
+ 42,178, 44, 97, 52, 26,211, 84, 45, 71,135,199, 44,203, 37,171,178,100, 58, 25,179,185, 53,225,193,219,223, 98,125,126,135,166,
+ 57, 39, 29,239, 51,221,123,146,106,118, 15, 19,123,198,163, 49,125,107, 49,177, 2,235,104,122,241, 58,163, 7, 61,208,208,200,
+229,250,138,197,108, 38,212,139,214,236,110,239,176,185,181,129,119, 18,100,210,117, 45,203,213, 10,208, 68, 38,231,233, 27,239,
+ 32, 51,129,179,147,175,240, 23, 47,143,184, 57,127, 1,163, 21,185, 82, 28,188,249, 58, 39,103,119,248,228, 15,127,144,255,242,
+103, 71,204,246,254, 33,175,191,244,219,148,203, 91, 56,215,226, 21, 40,129, 35,145, 52,206,138,245,106,142,235, 45,182, 93, 83,
+215, 37,171,243, 3,210, 80,209, 54, 15,240,109,137,173, 78,137,162,158,201,120,130,199, 96,251, 21, 85, 87, 73, 79,123,187,230,
+244,205,127,199,226,240, 43,180,139, 67, 98,109,208,233, 6, 46, 68, 56, 91,113,118,248, 77, 22,179,155,180,203,183,168, 15,110,
+115,120,247, 54, 58,245,172, 86, 51,218,170,197, 58, 79,148,196, 88, 23, 40,171,134,221,157,109,146, 56, 39,205, 71,244,182,198,
+ 24,141, 49, 49,214,247, 84, 77, 11,222, 19,153,136,196,136,110, 38,120, 63,228,129, 40, 26,219, 51, 30,141,168,202,138,182,105,
+192, 43,148,130, 85, 85,210,119, 22,147, 38,210,189, 16, 25,186,166, 69, 41, 77, 8,146, 99, 82, 87,205,240,238, 36,162,215, 73,
+178, 97,227,214, 84,101, 77,219, 86, 52,109, 71, 80,160,252,176,184, 33,225, 96,105,154,146,103,185, 44,158, 3, 68, 15,146, 22,
+122,177,160,118,125, 47,155,187,181, 8,242,107,169, 7, 45,140, 50,226,238,144,214, 79, 11, 62,208,117,162,239,176,214, 98,140,
+148,198, 56,103, 7,175,185,195,152, 68,144, 77,165,176, 93, 79,103,165,137,180,105, 91,218,186,166,170,133,190,150,123, 46,150,
+140,251, 94,218,225,180,209,164,105,246, 72, 12, 30,237, 93,190,244,185,206, 74, 3,153,179,146, 76,214,180, 13,109,215,210,118,
+ 18, 31,219,247, 61,222, 75,151,108, 50,168, 2,147,120,152,166,188,127,100,215,105,157, 28, 30, 26, 81,123,119,182, 99, 84,136,
+ 37,192,123,225, 80,219, 97,227, 50,177,180,175, 69, 58,194, 13,208, 90,240,158,182,239,240,189, 29,194, 99,134,188,104, 37,156,
+ 65,150,100, 68, 17, 4, 23, 0,177,146,165,105, 38, 27, 65, 85, 82, 13,124, 99,219,118,140, 39, 27, 36,105, 66, 89,150,140,199,
+ 99,225, 70,188,195,214, 53,152,152,245,122, 77,219,214,228,249,136,216,196, 52,157,248, 6, 81,225,209,195,168,234,106,184,120,
+ 59,234,186, 36,132, 64,146,138, 64, 80,135, 65,137, 27, 2, 1, 79, 20, 37,195,150,156,160,156, 76,113,105, 42,188,141,120, 26,
+133, 7,146, 54, 31, 25, 90,108,144,217, 42, 77, 83,121, 73,188,199,218,142, 96,123, 92,111, 89,204,231, 82, 16,144,138,150, 65,
+107, 9, 75,144, 92, 1,205,122, 93,162, 8,226, 9, 86,138, 40,138,177,174,231, 51,207,111,242,129,199,114,222,122,184,224,232,
+188, 34,110,122,182,119, 10, 66,100,120, 98,119,194, 73, 99,201,199, 41,145, 11, 28, 28,204,185,251,214,125, 94,123,184,224, 95,
+188,124, 76,213, 43, 70,169, 88,206, 26, 27,248,123,159,122, 7, 63,255,201,103,216,221, 48, 28,206, 58,222, 56,174,229,103,222,
+ 55,116, 93, 43,131, 10,210,105,156, 13, 66, 34,103, 59,156,149,132,164,166,105, 80, 64,146,196, 56,144,119,103, 24,192,138,172,
+ 32, 50, 17, 89,158,146,165,178,189,245,173,216, 25,157,115, 20,169, 4, 10, 53,157, 92,194, 74,129, 15, 72,254,255, 64,229,228,
+ 89, 54, 60,203,150, 98, 84,176, 92,174,104,155, 70, 60,205,195,164,127,129,140, 4, 39,162,202, 40,210,140, 71, 35,140, 86,244,
+222,146,199,153, 20,157,172, 75,142,230, 37, 47, 62, 53,102,111,163, 64, 41,216,216, 26,177,152, 87,140, 71, 25, 32, 92,253,214,
+230,132,143,127,224,113,102, 71, 43,150,139, 21, 75, 15,215,198, 41,121,164,121,104, 29,143,237,142,120,231,245, 93,150,101,203,
+173,151,191,195,179,239,122,134,231,118, 52,207,238, 25,190,125,100, 89,172, 27, 34, 29, 49,217,152, 18,169,192,233,233, 41, 1,
+161, 96,218,190,227,238,131,135, 76, 70, 35, 46, 26, 12,211, 44, 37, 54,250,223, 83,134,167,177, 28,130,162,234,143, 48,145,196,
+ 25, 59, 47,122,133,213,114,197,254,246, 22, 89, 49,166,172, 74,146, 88,168, 27, 59, 64,117,206, 73,184, 79, 80, 10,226,152,116,
+ 50,102, 50,158, 14, 22, 60,133, 25, 6,236,174,147,195, 55,139, 69,200,105,180, 18,159,176, 22, 43,166,115,246,209,118, 31,130,
+100, 47,172,203,154, 36, 77,216,218,152, 18, 39, 9,125, 47, 74,225,170,172,105,173,124,230,209,168, 96, 52, 88, 90,125,240,148,
+117,131,181,146,149, 95, 53, 13,179,217,130,211,249, 28,128, 11, 27,232,133,149,104, 84,228, 67,254,129, 99, 62,151, 68, 65, 99,
+132, 62,147, 11,194,144, 23, 5,163,233, 14,173,133,217,249, 17,211,233,148,241,100,130, 30, 4, 79, 89,158,146, 23, 19, 25,242,
+250, 14, 99,192, 53, 75,146,168,103,189, 62,163, 90, 62,164, 90, 30,208,172,238, 99, 98,205,252,252, 84, 96,126, 35,237,144, 30,
+ 81, 84,163, 52,222,131,235, 28, 30,199, 69,213,110,219,214,232, 40,162,174, 43, 78, 78,142,229,253,156,140,216,222,221, 37, 77,
+114,156,243,116,109,133,115, 78,218,190,180,161, 93,158,179,186,247,231,188,245,229,207,243,242, 23,255, 53, 55, 95,253, 83, 30,
+222,249, 35,238,189,246,175,153, 45,223,193,223,248,145, 39,249,244,247,194, 51,191,240, 11,108,142,255, 22, 77,125, 70,215,172,
+ 25, 21, 79,112,227, 63,248,155,156, 29,188,130,109,206,136, 76, 74,164,101, 35,140,116, 66,240, 29,179,179, 3, 92,189,130, 80,
+ 18, 66, 79,219, 52,156,156,156,208, 89, 71,176, 13,211,196, 82, 46,239, 80,206,222, 38, 74,198, 82,226,162, 3, 93, 91,227,124,
+ 79, 22,230, 44,230, 55, 89, 60,252, 26,205,242, 45,186,229, 3,202,250,148, 88, 25,108,235,168,170, 30,101, 12, 33, 68, 40, 36,
+207,124,111,255,146,104, 72, 76,194,230,116,131,197,252, 33,162, 28, 31,206,171,129,214,105,123, 11,222, 83,140, 38,130,186, 37,
+ 41,101, 85,203,185, 17, 15,226,218,174, 35,207, 83,250,222,145,198, 41, 73, 46,195,174,138, 34,150,203, 21, 10,133, 82, 1, 23,
+ 4,221,188,104, 16,245,222, 65, 20, 97,189,197, 24,113,134, 92,208,179, 94, 5, 34, 21, 83,140, 82, 84, 20, 63,130,185, 47, 54,
+226, 56, 74,228,247,246, 61, 93,103, 31,161,196, 23,142,171, 52, 73,196,198,220,203,253,169,181,198, 91, 71, 80, 98,179, 78,139,
+130, 36, 17,142, 62, 50, 67,193,140,147,122, 88,231, 29, 89, 38, 20,172,247,208, 59, 75,223, 54,162,159,136,165, 5,181,107, 59,
+188,247,132, 11, 36,173,239,105,154, 70, 16,222, 97,209,113,174, 39, 82,114,206, 38, 70,172,189,209,149,199, 31,255, 92,223,247,
+ 20,163, 17,221,160,166, 19,245,178, 38, 73, 50,250,190, 39, 79, 83,178, 52, 37, 78, 98,156,183,168, 32,254,219,166,235,152,142,
+ 36, 37,174,109, 90, 92, 47,101, 12,189,237, 41,138,130, 81, 49,162,106, 42,148,142, 30,217, 95, 36, 26,239,187,229,242,102, 56,
+ 44,162,196, 16, 71, 18, 67,136, 15, 3,252,154,226,189, 69, 71, 17,206,127,215, 30, 21, 25, 9, 16, 72,147, 76, 10,231, 35,121,
+ 88, 77, 45, 16,235,100, 60, 65, 33, 48,123,164, 34,146, 76, 46,209, 44, 77, 49, 89, 70,181,150,252,247, 16,148,108,231,241, 16,
+166,225, 36, 93, 44, 54,137, 8,224, 66, 0,133,124,102, 39, 8, 69, 20, 9, 18, 33,222, 97, 79,154,230,136,194, 61, 30, 54, 10,
+ 77,103, 7,181,126,164, 49, 74,126,248,125,215,211,247,189, 12, 54,173, 84, 11,226, 61, 12,105, 67,203, 85, 73, 89,138,170,185,
+170,165,198,210, 57,129,170,101,208,234,104,170,230,209,139, 37,141,122,134,178, 44,197,250,144, 73,174,118, 20, 69,252,220, 7,
+198,196,161,231, 59,175,158,240,112, 81,113,117,123, 68,167, 20,151, 31,219, 70,197,138,215, 94, 63,228,250,245, 29,158,120,242,
+ 18,189,179,220, 95,246,172,250,136, 31,124,247, 62, 47, 62, 53,229, 43,119,230,196, 90,115,218,193,223,252,204,115,236,142, 21,
+ 74,167,124,228,233, 13, 94,186,187,230,104, 81,147, 38,169, 8, 26, 7, 85,112,215,117, 52,131,240,209, 59, 79, 94, 72, 56, 79,
+154,165,244,157,208, 32,125,211,208,181,237,208,174, 39, 25,206, 33, 72, 26, 32, 40,170,101,137, 11, 30,231, 61, 27, 27, 27, 3,
+234, 35,155, 54, 4,178, 44, 39,142,165, 15, 57,142, 53, 27, 27,155,143,220, 14,138, 1,182,235,164,195, 96, 60,153,200, 80,104,
+ 18,156, 23,248, 61, 49, 2, 89, 37,195,196, 29,105,141,209, 26, 80,244, 93,131,117,142,181, 55,188,249,198, 93,126,244, 35, 79,
+225,188, 80, 6,219,187,155,164, 35,201, 0,215,145,160, 59,160,121,225,198, 30, 55,239, 30,243,250,225,130,203,105, 74,174, 35,
+ 74, 2,135,231, 53,159,254,208,147,168,200,240,250, 55, 94,229,233, 75, 19,172, 73,184,178,145,242,151,158, 46,120,245, 20,206,
+107, 43,195,134,142,216,157, 78,184,125,247, 30,111, 31, 28,112,124,118, 46,169,107,211, 9,189,179, 34, 94,109,218, 1, 38,148,
+188,134, 40,138,104,187, 30,130,180, 61, 41,173,233,251,142,182,151, 82, 36,133,160, 24, 39,167,103,220,184,118,133,107, 87, 46,
+203,118, 99,133,107,108,219, 86,168,167,201,132,182, 21, 95,119,158, 9, 29,146, 22, 5,163,173, 77, 54,166, 83,246, 47, 95,101,
+103,127, 31,147, 36,172,203, 10,231, 29, 6,136,146,152,113,158,147,164,169,108,254, 93,247, 8,226, 6,134,134,197,158, 81, 81,
+ 80,100,114,118,104,173, 89, 87, 21, 85, 93,115,116,114,202,170,172, 8,222, 51, 30,141, 40,114,105,115,212,145,166,237, 58, 25,
+ 0,154,134,114, 80,190,123,239,232,156, 69,107, 40, 6,129,213,233,249,156,249,114, 73, 64,220, 42,109,215,145, 37,226, 2, 72,
+134, 33,110, 76,195,186,215,196,113,194,124,121,142,235, 69,115,224,250,158,213,114,142, 54,129,107, 87,175,146, 23,194, 93, 78,
+199, 27,244,109,197, 40,245, 76,114,232,235, 35, 92,183,164, 41,207,217,123,242, 19,216,206,115,242,240, 53,170,197, 49, 62,241,
+ 36, 68,100,249,132,174,171, 32,138, 8, 65, 14,108,107, 3, 38, 74, 64,137,171, 70,233, 8,219,182,172,103, 39,172, 22, 51,150,
+229,138, 52, 49,108,239,238, 83, 20, 19,148, 86,172,150, 11, 80, 30, 31, 34, 20,150, 60,238, 80,205,125,170,211,183,184,180, 51,
+162,158,253, 5,191,115,107,151,252,251,158, 65,121,216,140, 50,174,222,248, 44, 87,158,252, 17,254,246,175,252,231,252,236,223,
+255, 0, 79,255,195, 95,166,187,253,189,220,251,246,231,233,219, 37, 58, 78,233,154, 5,222, 10,236,223,247, 53, 77,185,162,108,
+ 87,216, 74,108,157,174,111,233,218, 53,243,211, 99, 92, 51,163,175,206,176,141,132, 14,173,206,207,232,154,142,182, 41, 89, 47,
+207,105,150, 71,116,205,106,128,245, 91,112,160, 72, 24,111,108, 50,154, 78, 24, 23, 5,227,241, 6, 62, 88,226, 44,231,242,229,
+ 43, 52, 93, 79,211,181,108,108,100,156,158, 30,226, 9,196,145,193, 58, 71, 98,140,184,134,188, 88,182, 64,138, 88, 52, 16,153,
+255,159,169, 55,141,213,244, 60,239,251,126,247,250, 44,239,123,182, 57,179,147, 28, 46, 34, 41, 82, 11,101, 74,138, 29, 43, 74,
+ 98,171,137,147,218, 73,156,182, 64, 3, 3, 65,139, 34, 69,186, 32, 77,138,164, 40,208, 6, 45,136, 22,104, 10, 20, 41,250,169,
+ 69,191,181,105, 81,160, 46,130,214,110, 98,103,115, 28, 47,177,100,199,146,172,136, 18, 37,238,228, 12,103, 57,115,214,119,121,
+182,123,235,135,235, 57,163, 18, 32, 6,130, 56, 56,231,188,231,121,238,251,186,254,171,147,140,137, 92,216,108, 55, 44,150, 45,
+148, 34,185, 7,118, 22, 28,231,200,197,217, 57, 41,101, 22,139, 6,109, 53,214,202,240,231, 47, 41,166,148,104,124,141, 65, 97,
+172,161,219,138,218,125, 24, 71, 74,209, 56,171, 24,250, 64,136,210, 2, 23,130, 92,146,168,130, 54, 96,180,197,123,135,181, 78,
+138, 83, 98,100, 24, 70, 64,205, 86, 73, 47,223,255,114,135, 16,196,254, 54, 14, 65,254, 28, 3,211, 56,209,204,201,116,206,122,
+124, 83,163,181, 33,206,255,109, 74,162, 94,247, 85,141,213,134,144, 3,228, 66,158,147, 84, 75,201,179,248, 87, 44,208,165, 20,
+186,190,147,207, 65, 57,154, 69, 43, 67,173, 51,130,116,148,130,185,118,243,214, 27,149,175,192, 72,219, 90, 85,121,236, 12,241,
+ 93, 78,200,218, 72,157,104,202, 89,188,147,189, 64, 72,165,100,170,166, 66, 43, 77,152, 2,139,101, 35, 48,159,245,248, 74, 46,
+210, 18, 5, 34, 53,198,146,138,180,152, 93,146,254, 74,169,249,112, 79,120, 87,209,247, 29, 90, 73, 11, 79,229,189,240, 20, 70,
+166, 38,165, 20,219,245,154, 97,232, 81, 69, 17,162,168,198, 67, 16,159,252,182,151,176,253,157,197, 14,219, 94, 38, 96,171, 12,
+139,229, 18,101, 68, 15,224,156,199, 26, 35,124, 74,150, 94,118,177, 17,116, 24, 35, 86, 35, 85,212,147,131,161, 36, 17,212, 41,
+ 5,218,104,138,202, 51,167,157,113,174, 34,151, 60, 83, 1,150,245,172, 22,190, 20,179,165, 16,200,177, 80, 84, 65,230,122, 17,
+111,169,121,146, 63, 95,173,216, 94, 92,208,109,182,116,219, 78,130, 60,138, 64,246,101, 62,152,149,146,202,219, 24, 69, 0, 18,
+ 98, 36, 83, 8,227,196, 52,141,178,125,106, 69,156, 18,211, 28, 55,235, 13,252,149,159,190, 77, 55, 36,190,243,193, 49,103,161,
+240,226,237, 5, 71,167, 3,239,127,116,194, 71, 31,157, 16, 98,230,199, 62,251, 52, 33, 68,214,239, 63,224,215,222, 57,230,151,
+127,112,198,207,124,238, 58,177,100,190,241,225, 57, 41, 23, 82,210,252,141, 63,249, 60,227,102, 75,189,123,128, 33,243,229, 59,
+ 59,252,243,123,145, 92,100, 8,211,118, 46,229,153, 38,156,159,251,132,139,136,218,152, 63,143,202,121,138,146,180,178,252,228,
+210,111,216,221,217, 65,205,252,252,234,226, 66,130, 30,166, 81, 68,132, 74,126, 15,101,182, 12,106, 61, 35, 35, 49, 49, 14, 61,
+ 90, 75, 18, 96,237, 37, 93,204,104,205,102,179,194,121, 39,207, 71,152,228,239,148, 4, 73, 68,124,178,213, 94, 66,251,194, 39,
+167,153,107,243,222,163,157,104, 46,126,248,201,138,113,125,193,171,207, 28, 96,180, 98,115,122,193,119,190,241, 93, 30,124,248,
+ 9,235,211, 13,109, 91, 17, 83,224,227, 15, 31,112,231, 83, 79,243,222,187,199,188,127,190, 97, 19, 39,116, 83,147, 41,252,249,
+159,252, 20,185, 64,214,134,205,253, 71,188,244,226,211,172,199, 72,213, 56,126,226, 78,195,135,103,137,147,190, 80,148,160, 34,
+119,110,221, 96, 10, 1,173, 12,117, 83,179,221,110,248,240,238,125,238, 61,124,196,233,197, 5,155, 77,199,131, 71, 71,124,124,
+255, 17, 79,223,188, 1, 69,208, 42, 40,179,165, 75,160, 67,230,207, 94, 43, 9,173,248,248,254, 67,190,244,234,167,249,243, 95,
+251, 99,188,252,236, 29,134,177,231,124, 45,186,144,237,182, 67,145,177,174, 38,198,132,115, 6,103,141,212, 1,207, 89, 12,162,
+210,181,236,236,239,131,243,104, 95,201, 69, 58, 35,244,214,106,172,243, 98, 21,141, 63, 18,218,245,195,192,166,235,104,155,134,
+131,221, 93,105,148, 34,179,157, 21,246, 93,215,243,248,244,140, 16, 3,187,203, 5, 59,139, 86,196,165, 85, 5,133, 39, 3,246,
+ 48,142,114, 48,215,210, 43, 97,140,102,189,237, 56, 59,191, 16, 30,113,118,155,196,152, 68,177,175, 21,222, 89,234,186, 38, 82,
+216,219, 91, 80, 45,246, 57, 61, 57,103,184,220,224, 82, 96, 24, 38, 86,171, 45, 59,109,195,217,197,138,237,102,139,164, 17,214,
+172,214,107,214,171,115, 22,139, 5, 7,251,123,220,184,126,147, 43,159,250,211,188,254, 83,127,147, 79,191,254, 11, 28,222,254,
+ 34,105,152, 80,213,130,235, 55,111, 17,135,158, 41,140,104, 20, 74, 23,156, 5,180,167,148, 89,159,144, 17, 68, 77, 65,152, 68,
+193,223,111, 71, 30, 62,120,192,102,115, 78, 24, 37, 38,218,218, 22, 99, 5,142, 26,166, 17,171, 29,245, 98,159,157,221, 43, 12,
+221,154,147,247,127,139,127,252,127,252, 3,190,241,143,238,242,253,111,191,195, 15,190,251, 79,121,251,187,127,151,179,243,207,
+114,251,250,117, 70, 13, 79,125,245,101,238, 28,254,117,116,229,233, 87,143,185,118,231,143,241,229,159,255,155,116,167,103,172,
+ 79,126,128,177, 14,235, 90,180,177, 79,196,199,113, 26,192,205,133, 35, 67,199, 52,142,140, 93,135,156, 68,114, 14, 9,203,103,
+ 72,185, 96,141,195,250, 90, 54,206,162,168, 91,135,206,226, 15, 15, 17,180,213,178,208,117, 29,149,175,120,230,169, 91, 92, 92,
+ 60,162,239,182,146, 73, 96, 44, 90, 41,170, 90, 58,192, 75, 18, 24, 91, 41,169, 60,237, 7,137,116,214, 20,226, 36, 22,205, 97,
+ 24,177,206,145, 67,162,239, 59,114, 18,171,170,160, 78,145,113, 74,144,193,105, 73,160, 12,211,132,175, 23, 24,107, 40, 72,106,
+ 97,152, 2, 5,133,177,146,146,234,180, 38,230, 12, 37, 83,213,181,208, 43, 49,144,178,108,251, 82,116, 54,162,148, 21,196, 53,
+ 76, 51, 34, 42, 45,159, 85,221,226,172,145,129, 20, 65, 35,149, 49, 84,222,211,111,183,196, 40, 22,187, 97,232, 81, 70,116, 31,
+ 41,102,140,187,204, 58,137,228, 20,197, 61, 82,196,145, 83, 87, 13,198, 58,138, 41,178, 48,106,104,155, 5, 33,142,196, 32,161,
+ 78, 77,211, 18, 99, 96,177,108,197,198,107, 60, 41, 73, 88,156, 82, 10,179,119,245,234, 27, 90,203,129, 59,205, 24,125, 98,134,
+202,199,137, 49,200,118,149,115,193, 58, 79,213, 84,178,145, 33, 66,150,130, 64, 36, 49,198, 57,137, 45, 80, 47, 90, 12,200,225,
+ 98, 44, 93,183,101, 28, 39, 52,138, 48, 6,156,247, 79, 4, 80,206,139,185,126, 24,122,218,118, 49,115,164,154,152, 37,253, 43,
+166, 64, 70, 68,102, 97,146, 73, 36,196, 64,206,229, 9,132, 33,200, 64, 35, 7,130, 18,200, 50,132, 72,229,107,148,214,196, 49,
+160, 84,161,228, 72, 76, 65, 68, 90,174,166, 91, 93, 16,231,139,116, 12,210,194, 51,142, 82,124,175,149,198,215, 30,148,154, 61,
+233, 89,212,232, 41,202, 84,101, 52, 33,137, 7, 50, 4,225,186,107, 47,131,208,216,247, 84,181,199,186, 25,126,214, 10,231,106,
+121,248, 66, 96,181,237, 24, 55, 27,152, 70, 72, 17,144,238,237,221,253,125,172,151,193, 99,103,103,135,166,169,209, 69, 58,218,
+173,153,253,215, 83, 68, 69, 73,191, 27, 39,137, 76,212,170,176,216, 89, 82, 87,142,207, 93, 53,252,201,231, 90,190,241,230, 61,
+206,199, 66,109, 20, 79, 93, 93,178, 25, 2, 7,203,134,253,253,154,157,118,193,197,144,240,149,101,232, 38,126,249,247, 63,198,
+ 42,248,214, 71,103,252,254,135, 23, 24,165,232, 19,236,215,142,191,250,103, 95,161,100,205,238,149, 29, 82, 72,236, 47, 52, 78,
+ 25,254,224,254, 32,189, 0,182, 66, 81,136,169, 96,108, 65, 35, 47,107,152,228, 5, 80,128,178, 6,139,120,209, 21,138,189,189,
+ 61, 25,134,140, 65, 35, 94,115,249,156, 36,100, 34, 76,146, 9, 62, 12, 19,211, 36,116,205, 48, 14,116,155,142,161,239,228,247,
+219,247,156, 30, 61,230,232,225, 3, 46, 78,142, 57, 63, 59, 98,123,118,206,250,244,140,237,249, 57, 23, 39,199,172, 78, 79, 88,
+159,157,178, 58, 63,225,226,228,148,179,179, 83,134,113,196,122,143,175, 90,172,117, 12,227, 64,140,153, 41,136,112,211, 25,205,
+222,193, 30,215,236,134, 27,123, 45,191,244,203, 95,231,251,223,124,155,215,190,244, 18,159,121,253, 85, 78,143, 79,233, 78, 47,
+ 88,221,127, 8,214,241,237,123, 27,225,227, 20, 4,101,216,109, 61,219, 33,112,239,180,231,249,155,251, 92,191,126,192,187,223,
+249, 30,207,190,242, 18, 7,121,100,147, 20,149,213,188,254,116,203,175,252,203,199,104,215, 16, 74,134, 48,241,210,157, 59, 28,
+238,239,114,176,187, 67, 55,138,210,215, 59,207,149,189, 93, 36,174,217,114,251,198, 53,154,186,225, 9,239,173, 68, 77,235,102,
+ 13,202, 20, 3,170, 64, 65,137, 72,179,100,190,243,131, 31,242,252,211,183,217, 89,180,124,238, 83,207,241,233,231,159,229,193,
+209, 17,219,110,139,214, 82,154,177, 92,180,132,113, 96,232, 71, 66,156,168, 43, 63,211, 69, 10,103, 28,211, 56,144, 50,130, 28,
+149, 76, 31, 18, 67,134, 82,121,124,187, 96,247,224,144,106,209,208, 44, 90,161,214,188,167,235,122, 78, 79,207,200, 37,179,187,
+ 92,176,191,187, 71,219,212,108,250,238, 73,104, 70, 63,140,108, 59,209,186, 92,217,223,229,202,222,158, 88,205,148, 20,200,148,
+ 34,157,244,155,237,192,106,179,150,195,218,121,110, 92,187,202,162,149, 16, 15, 95,215,236, 95,189,198, 11, 47,190,196,222,254,
+ 62,174, 89, 16,149, 34, 20,205,186,223, 98,116,196,250, 93,250,126, 36,132, 68,183, 29, 40, 37,225,172,165, 40,197,225,225, 53,
+226, 56,177,222,172,153,198, 45,211, 52,225,253,130,195,171,135, 52,213,130,163,147, 35, 22, 75,248,240,157,223,227,124,125, 68,
+189,123,147,229,206,211,216,122,151,144, 44, 37, 30,179, 57,123, 8, 69, 3,130, 62,121, 87, 83,148, 8,162,132, 51,130,156, 3,
+ 40, 13, 90, 80, 9,163, 13, 33,102,186,110,205,249,217, 35,214,155, 53, 33, 68,118,118,247, 89,180, 75, 92,213, 16,166,129,179,
+243,115,172,243,140,125,160, 54, 19, 11,238, 50,156,254, 30,103,247,254, 57, 97,245, 46,167,199,191,205,175,253,234,111,241,214,
+ 63,252, 1,247,127,239,152,113,115,159,172, 45, 79,189,248,103,248, 47,127,229, 63,225,191,250, 51,159,225, 15,255,181, 63,207,
+221, 55, 95,231,254,131,127,194,180,221, 98,171, 6, 85, 52,227,246, 49,207,189,250,231,232, 46, 30, 16,198, 11,170,106,137,118,
+141, 84, 77,107, 73,182,140, 12,168, 44,249, 24, 70, 59, 18,138, 41, 38,172,113, 24,103,184,242,212, 23,217,191,253, 41,214,143,
+239, 49, 70,209, 58,104, 45,231,224,115,207, 61,139, 86, 35,199,199,143, 72, 33, 16, 66, 34,134, 64, 2, 41, 40,234,165,148, 43,
+165,136, 70,203,185, 93, 9,162, 91,183,141,136,171,157,216, 91, 47, 46, 46, 72, 57, 81, 53, 21,227, 36, 20, 2,170, 96,157,166,
+228, 68,206, 81,244, 57,186,176,104, 26,114, 28,137, 73,172,113,214, 58,148, 81,228, 16,192, 24,166, 94, 28, 73, 70,105,124, 93,
+209, 52, 66, 5, 54, 77, 75,213, 8, 4, 47, 10,115,105, 17,165, 36,118,150, 45,181,175,169, 43, 79,221,136,147, 38, 38,209, 68,
+197, 73, 98,152,101,169, 21,181,190,243,158,105,148, 4,213, 18, 69,215, 85,162, 8,202, 99,144,128, 28, 25,248, 64,165,196,152,
+ 20, 69,153,249,107, 34, 33,100, 50,167,211,182, 45, 73,139, 31,125,154, 70,161,129,226,132,119, 78, 46,118, 38, 64,227,156,197,
+ 28, 92,187,246,134, 2,124, 83, 83, 87, 53, 33, 38,140, 82, 98,191,170, 28, 97,146,132,174,118,209, 98,149,126, 2,127,143,227,
+ 64,237,100,139, 46, 73, 34, 59,199, 48, 96,173, 36,228, 88, 87,177, 94,173, 25,167,129,148, 68, 69, 91,114,150,131,123, 10,104,
+163,152,166, 72, 85,213,164, 40,118, 4,177,198,201, 64, 81,138, 34,142, 35,253, 48,206,220,161,166,174,101,146,119, 86,134,136,
+221,157, 93, 36,149,205,208,117, 3,211, 56, 81, 72,132, 16,217, 93, 74,174,240,118, 43, 92,184,160, 14,242, 65,143,227,132,210,
+138,170,109, 81, 74,172, 77, 97,134,109, 65,160,203, 75, 17,150,244,234, 10,231, 81, 82, 2,100,168, 72, 83,162,246,149, 40,249,
+ 71,209, 12,164, 24, 33, 35, 89,240, 9, 10, 25, 95,215,168, 34,220,187,112, 60,153,205,106, 5,243,240,160,180, 66,165,136, 90,
+ 46,105, 42, 17,240, 9, 92,169, 72, 69,114,188, 55,107, 41,191,152, 38, 41,127, 40, 74,201,240, 50, 79,210,198, 26, 9, 33,241,
+142,159,122,105, 65, 19, 59,126,227, 7,167,236,235, 64, 9, 35,253,249,134, 43, 75,199, 64, 33, 63,120,128,207, 91,198,147, 51,
+190,249,214, 35,254,207,175,127, 76,181,168,249,220, 51, 87,184,123,178, 33,231, 66,166,112, 17, 20, 63,254,220, 30,255,193,159,
+253, 34,111, 62, 88,243,205,247,207,185,190,215,112,243,160,226,169,133,226, 23,191,121, 76,204, 69,166,207, 36,130,142,190,147,
+130, 2, 99,204,147, 24, 71, 73,214, 19, 49, 87, 74, 66,207,180,109,139, 53, 82,156,144,163,136, 0,211,157, 0, 0, 32, 0, 73,
+ 68, 65, 84,180,116,141,147, 88,207,114, 73,212,141,104, 8, 82, 73, 56,235,136, 33,130,214,108,215, 43,214,103,231,108,207, 47,
+ 24,186, 30, 85, 34,206, 72,170,146, 74,133,162,229,229, 71, 41, 80, 6, 81,132,203,134,158,147,248,218,135,237,150,238,252,132,
+211,199, 39,140,227, 32,249,243,206,226,125, 77,229, 5,161, 74,185,112,116,214,241, 31,253,233,151,249, 83, 95,251, 60, 95,248,
+241, 79,179,187,191, 71,136,137,235,183,111,176,127,227, 42,215, 94,120,134,253, 43, 7,188,247,193, 35, 62, 62,234, 80,227,128,
+174, 44, 73,105, 80,133,111,124,255, 62, 55,119, 27, 62,247,210, 83,188,247,245, 63,224,234, 11,207, 80, 59,203,161,205,108, 35,
+ 56,103,120,238,176,226, 91,159, 12,196,172,196,218,181,222, 96,172, 97,217, 46,184,178,191,203,222,206, 14,215, 15,247,217,219,
+ 89,178,179, 92,176,183, 20,136, 83,162,112,231, 50, 10, 0,165,102,174, 78,236, 3, 74, 73,165,176,181, 34, 28, 10, 33,178,233,
+ 58,190,252,218,231, 40, 49, 99,180,230, 11,159,126,145,109,223,243,240,241, 9, 69,101,106,239,185,172, 27, 30,134,158,203,158,
+ 4,217,150, 59,252,252,238, 85,117,133,117,179,174, 68,192, 24, 57,252, 41,212, 77,195,149,195, 67,124,211,176,127,120,200,237,
+ 59,207,176,119,237, 42,217, 88,186, 16,201, 74,218, 24, 69,165, 44, 89, 0, 49, 37,166, 16,184, 88,111,152, 66,196,214, 53,109,
+211,114,153,204,229,156, 5,163,216,221, 63, 96,177,183, 71,181,179, 68, 85, 13, 83, 74, 84,237,130,197,206, 46,251,135, 87, 80,
+ 70,154, 35,199, 16,208, 90,188,194, 24, 67, 24, 69,212,186,179,220,193,152,106,166,205, 68, 63,180,179,179,100, 59,140,212,222,
+115,253,230, 13,154,186,197, 59, 67,158, 70, 86,235, 51,214,235, 21,253,208,113,114,188, 34,118,231, 44,220,200,249,241,187, 28,
+125,244,251,156, 61,254, 30,171,135,255, 18,237,106,158,255,226, 95,100,177,124,134,126,245,128,245,217,199,179,240,183,146,126,
+128, 84, 72,100,116,206, 34,202, 66, 99,172,192,202, 80, 80,242, 11,164,164,244, 4,189, 92,173, 86,156,158, 62,102,125,190,194,
+ 55, 53,139,197, 18,239,133,107, 29,199,192,166,235, 25,167,140,117, 13,215,110, 61,205,237,155,215,240,249, 49,103,143,191,205,
+209, 71,191,197,253,143,190,206,201,189,175,115,126,252, 54,235,163,159,229,236,229,138,163,115,199,179, 55, 95,229,250,115,255,
+ 46,227,240,144,205,217, 93,250,254,132,207,255,220,223,226, 63,254,123,127,155, 23,175,255, 13,182, 93,199,246,228,123,136, 41,
+217,162,172,166,196,192,139,175,253,155,124,246,143,255,101,226,240,144,110,125, 66,206,226,197, 21, 4, 49,210, 30, 60, 13,195,
+ 17,202,108, 80,197, 74, 33,149, 81,236, 46,107,246, 15, 22,172,214,103, 84,206, 83,183, 53,151,105,128, 77, 85,201,153, 89, 10,
+253,208, 63, 89,244,170,202, 11,226,148,193,123, 63,111,183,113, 22, 92, 79, 51,109, 38,239,169,175, 28,117, 37,193, 92,117, 93,
+ 83, 57, 75, 76, 65, 84,229,206, 81, 53, 13, 85, 37,252,183, 42,112, 25, 80, 37,121, 23, 22,231, 28,245,140, 28, 12,189,244, 13,
+104, 35, 34, 54,103, 12, 41, 69, 22,139, 5,117, 85,137, 94, 40, 4,140, 23, 75, 92, 41, 8, 29, 6, 80, 10, 18,112,148, 89,180,
+ 53, 41,103,186,217, 83,191, 88, 44,112,206, 17, 75, 98, 81, 55,210,214,137, 34,229, 72, 74,242,119, 52, 82, 40,227,157,103, 26,
+122,113,150, 25, 75, 12,129,166,105, 5, 77, 28, 39,188,119,104,173, 97,254,218,121, 44,140, 99, 63, 11,239, 68,172, 61,142, 35,
+230,250,237,219,111, 40,165,168,107, 41,215,232,250,142, 41, 69, 33,255, 67,100,119,111, 79, 32,101,163, 68,185, 28, 5, 66, 13,
+ 83,152, 5, 60, 78, 36,254, 41, 49, 14,211,204, 37, 1, 69,211, 15, 3,139,118, 33,176,179,210, 56,111,209,202,162,141, 38, 37,
+249, 59,198, 58, 66, 14, 18,232, 16, 2, 97,154,200, 69,114,215,181, 50,100,164,145,124,154, 2,149,179, 56,231, 69, 65, 30, 2,
+117,227, 41, 72,116,158, 81, 90, 38,124,109,241, 94, 4, 21,185,136, 50, 93, 27, 45,254,199, 28,136, 97,142,165, 45,145, 56, 37,
+129, 69,114,145,224,129,186, 22,241,158,153,249,113,148,132, 1,244,226,131, 68,105,164, 7, 94, 20,139, 49, 73, 22,183,214, 26,
+212,172, 60,180, 70,116, 1, 90, 94,214,156,103,191,104, 8,196,105, 34, 12,195,124, 33, 21,200, 5, 85, 10, 69,105,240, 30,111,
+165,197, 12,228,151,182,186, 56,103, 28,132, 94,104, 22,205,204, 59, 90,150,203,133,240, 57,117,141, 46, 80, 87, 14, 21, 3, 31,
+125,240,152, 55,126,254, 83, 12, 1, 86,155, 53,215,215,159,240,213,219,138,183,222, 59,230, 23,127,247, 17,215,237,192,194,193,
+209,217,192,175,188,121,194,187,167, 35,187,251, 11,254,204, 79,190,192, 87, 94,187,205,219,119,207,216, 12,145, 95,248, 19,159,
+225, 47,253,220,103,248,163, 95,120,154,255,230, 23,191,199,223,252,165, 31,242, 75,191,243, 17,255,211, 63,250, 0,231, 20, 95,
+251,220,109,134,190,227, 55,222, 58, 98, 28,132,231, 79, 81, 6,158,162, 96,232,199, 89,188,101,208, 69,154,238,198, 41,226,189,
+196,240, 14,227, 56,243,201,178,165,107, 45,226,149,213,102, 69,138,137,152,101, 67, 13, 51, 79, 79, 73, 12,171, 51,198, 77,135,
+ 46, 17,107, 20,205,210, 3,154,174, 11,144, 21,237, 94, 75, 85,121,218,157, 37, 78,131,117, 78,208,146,218, 99,148,240,192,181,
+ 19, 97, 83, 24, 35, 57, 71,194,216,145,134,115, 98,119,134, 83,133,106,177,195, 20, 3, 85, 45,213,150,156,125,194, 87, 94,190,
+201,166, 11,132, 40,150,180, 52,255,190,167, 20,177,218,240,249, 87,110,114,103,191,225,237,119,143,248,251, 63, 56,229,104,221,
+243,210,245, 5,109,227,121,176,158,248,218,103,174,114,250,206,219, 52, 87,175,179,220, 95, 98, 84,226,192, 41,250, 88,184,181,
+191, 96, 24, 6,190,251,176,199, 85, 53,125,183,229,222, 39,247, 89,111, 59,158,186,121,141,182,185,132,156, 13,149,115,243, 97,
+144,208,179, 43, 69,168, 26, 25,229, 83,138,196, 44, 2, 36,107, 44,144,133, 82, 50,138,166,170,184,247,224, 17,191,251,237,127,
+201,103, 94,121,137,253,189, 93,114,206,124,254,229, 23, 41, 40, 30,175, 87,108,214, 27,200,176,218,172,200, 41, 99,156,197, 89,
+141, 86, 6,163, 20,155,174, 35,164, 31,101, 3, 56, 39,149,184,109,219, 82, 87, 82,219, 60, 77, 65,146, 32,147, 40,119,173, 21,
+151, 75, 12,129,221,131,125, 92, 85, 97,189, 20,241, 28, 94,191,193, 98,119,135,189, 43,135,236,238,237,113,243,233,167,177,117,
+131,173,106, 78, 86, 43,182,211,196, 98,111,143,122,185,195,114,177,164,106, 91, 57, 51,114,102,177,104, 49,214, 50,244, 61, 79,
+236,149, 70, 97,140,197, 58, 75,215, 13, 40, 37,101, 26,206,123,148, 49, 76,161,103,177, 92,178,187, 60, 96,154,132,107, 77, 41,
+115,101,127,159,163, 71, 15,184,253,212,109,124,229,104,218,134,179,179, 51,214, 91,233,128,151, 90, 75, 17, 40,109, 55, 43, 14,
+246, 26,118,170, 72,109, 39,186,245, 99,162, 62, 99,239,240, 89,218,221, 87,120,250,213,159,227,250,115, 95,165, 20,197,249,227,
+ 31,224,188,195, 32, 53,179,170, 36, 74,201, 56, 47,156,106,153,183, 52, 74,153,135,244,140,226,114, 88, 18, 65,173, 82, 19,221,
+122, 77,183,217,112,116,114,134,179,134,221,253,125,209,160, 20,232,183, 27,206,143,207,216,108,214, 44,247,174,112,176,127,200,
+225,222, 30,187, 77, 65,135,142,202,172,185,247,209,175,243,141,191,255,125,190,251, 15,222,228,135,223,251, 22,247, 62,250, 29,
+210,120,130,111, 26, 62,253,197,191,202, 79,255, 27,255, 33,239,127, 7, 62,249,193,247,104,246,158,194, 47,247,217, 60,254, 1,
+ 83,140,168, 98, 88, 92,121,142,103, 95,251, 5,134,205, 39,228,188, 33,247,167, 20,192, 57,203, 98,209, 72,112,203,246, 30,237,
+ 82, 51, 94,108,136,122,135, 97, 12, 44, 23, 13,119,238,220, 98,219,157,211,143, 35,222,203,153, 24, 99,154,183,113, 79, 41,101,
+222,190,101,168, 52,198,130,150, 86, 52, 51, 11, 63, 67,156,209, 13,144, 77,120, 26,153,198,241,137, 5,242,210,101, 20,231,229,
+160,174, 27, 46,109,114,117,211,204, 11,223,230,201,162, 70, 41,136,141, 56, 64,206,179, 19, 41,178, 92,182,178, 96,230,132,100,
+174,152,217,170,219, 83, 12,196,113,194,213, 21, 37, 11,218, 48,206,116,103,152, 34, 41,102, 22,115, 27, 97,140,137, 49, 70,218,
+ 70,116, 66, 83, 20, 94, 93,171,185, 74,213, 56,172, 19,132,210, 24,135, 51,150, 41,142, 76, 83,100, 12,145,106,190,107,141, 81,
+128, 76, 15,222, 59,177,221, 90,201,218, 16, 5,190, 37,169, 68,201,130,154, 72, 6,135, 1, 20,230,218,173,219,111,196, 52,243,
+189, 74,201, 7, 31,194, 19,110,203, 88, 67, 73, 98,150,247, 94,252,130,151,113,176,144, 9, 99,160,228,132, 54, 22,231,107,198,
+177, 71,105,195,182,235,229, 7,145,187, 13,111, 43,249,229, 40,133,243,146,123,171,173,196,140, 94,202,253,173,145,225,162,170,
+106,172, 21,126, 83, 33,182,174, 20,195,108,159, 81, 18,167, 26, 2, 57, 6,156,151, 23,161,235,182, 36,165, 4,150, 14,115,197,
+170,154,149,225, 90,147,138,180,249, 56, 47, 81,172, 77,211,206,156,142,212, 42, 38, 50,226, 7, 4,233,213,157,152,194,136,175,
+ 60,117, 93, 83, 87, 21,211, 32,209,174, 82, 15, 43,131,133, 53, 34,164, 80, 74,179,187,187,195,101,114,214, 48, 13,172, 47, 86,
+148, 52,209,143, 35,171,174,163,219, 10,180,103,180, 66, 91, 79,105, 91, 84,211,136,226, 56,202, 64, 51,205, 14, 1, 17,114, 20,
+188,117,212,181,151,141,181,200, 65,101,140, 70,197,200,180,217,178,219,122, 76,206, 40, 50,222, 41,254,218,207, 60,207,179,251,
+ 21,223,187,191,229,227, 11, 56, 29, 20, 83, 26, 57, 25,225,222,201,200, 31,121,237, 14,168,204,155, 15,183,124,233,185, 67,254,
+243,191,248,135, 57, 95,245, 28,236, 52, 28, 54,142,247, 30,158,243,249,103,174,240,185,103,174,241, 95,252,239,191,199,175,127,
+239, 49,141, 41, 84, 78, 30,180, 95,251,131,251, 60,222,142,252,197,159,127,141,255,251,119, 62,102, 74,114, 97,182,205, 44,212,
+155, 31,172,170,146,108,119,165, 37, 74,120, 26, 6,214, 27, 73,231, 43, 72, 54,254, 56, 72,134,243,106,181, 22, 20,199, 24,188,
+ 19,255,254,118,187, 33,140, 35,106, 28, 32,142,108,215, 91,246,106,201, 66,223,223, 91,178, 92, 46,104,125, 67,219, 88,249,218,
+198,208, 86, 13,181,115,248,102,129,173, 28, 90, 25, 46,241,140, 82, 20,168,130,183, 2,183, 57,235,200, 9,134, 56, 81, 55, 26,
+149, 71, 54, 39, 71, 84, 8,138,227,154, 29,190,254,189, 79,248,241, 27,138,107, 87,118,168, 23, 13,214,123,156,214,172, 78,206,
+232, 63,185, 71,169, 27, 78, 62,190,203,197,249,154,173,111,249,191,190,245,128, 97, 76, 92,175,224,198, 65,203,135,199,107, 62,
+126,239, 49,175, 47, 7,202,141,155,236, 44, 23,216, 44,241, 19,123, 14, 54, 33,241,242,173,150,223,126,251,130, 71,231, 91,156,
+175,217, 95,212,228, 92,184,121,237, 16,231, 42, 82, 78, 80,178, 60, 35,204, 5, 49, 10,204, 19, 36, 2,121,111,149,230, 50,153,
+ 80,107,249,223,218, 8,116, 94,114,161,169, 43, 86,235, 45,191,245,141,223, 99,154, 38,158,127,230,105, 52,138,219,215, 14,153,
+134,137,247,238,222,165, 31,122,234,186, 34,132,200,208,247, 76, 97, 18, 59, 92, 16,177,234,165,224,205, 90,129,101,167,105,144,
+173,212,123, 64,210,180,250, 81,248, 76,209,187,200,214, 92, 85,149, 64,153, 86,220, 32,155,237, 22,165, 10, 41, 70, 81,212, 27,
+ 67,237, 5, 9, 72,113,182,123, 42, 37,112,236,188, 45,245,221, 64, 65, 16, 55,107,103,232, 58,200, 38,148,147, 56, 45,214,221,
+134, 97, 28,104, 91,209,240,244,125,143, 86,200,251,106, 53, 90,201,185,176, 92,238,208,182, 45,186, 20,234,182,102,119,255,128,
+146, 53,103,167,143, 57, 59, 59,230,236,244, 28,231, 20,149,111, 9,169, 32, 34,179,200,118,211, 11, 5, 16, 38, 14, 14,174,210,
+ 46,118, 49, 17, 76, 60,229,226,236, 61, 78, 79,238,145,115,102,239,218,171,212,203,171,220,120,238,143,227, 22, 87, 56,185,247,
+ 7,160, 12, 96,200, 69,244, 56, 37,203, 59, 0, 5,163, 20, 86,107,180, 53,164,164,128,196, 52,137, 93, 78,105,169,155,109, 42,
+135,245,142,213,234,140,213,106,139,177, 21,251,135, 87,216,191,114,128, 54,138,227,227, 99,206, 79, 78, 88,111, 87,132, 56, 17,
+ 81,212,237, 14,183, 15,119, 40,221, 7,172, 79,190,201,209, 71,191, 75,127,252, 93,186,213, 3, 74,127, 74,183,254,136,183,126,
+247,239,115,247,205, 95,229,209,221,223,227,236,209,191, 96,216,124, 68, 9, 91, 74, 82, 28, 62,251, 69,118,247,159,101,117,252,
+251,108, 31,253, 62,227,249,199, 36,213, 34, 5, 44,142,172,107,198,237, 72,200,150,169,177,164, 28,209, 49,176,216, 89,112,253,
+160,229,241,201,125,156,243, 56, 45,136,228,101,171, 24, 10,182, 93, 71,138, 81,104,212,148, 24,163, 36, 10, 78,227,136,140,142,
+ 5,148,154,105,224,129, 41, 72,238,132,196,164, 10,170,219,182, 45,222, 75,122,168,247, 82,227,170,180, 98, 74,153,156, 11, 33,
+140,242,245,221,101, 42,169, 67,156, 55,242, 12,139,133,218, 98,141, 66, 91, 43, 40,180,182,116,221,102,126,167, 20, 41, 77,196,
+ 49,226,106, 63, 11,155, 5, 85,188,180,210,122,239,112,117,197,208, 15, 12,195, 72, 38, 97, 49,140, 81,188,247, 10,201, 82,168,
+ 42,207, 24, 36,182, 60,134,128,245,243,251,100, 68,244,231,157, 71, 33,214,184,113,184,108,116, 19, 68, 78, 18,230, 34,222, 90,
+209, 68, 88, 73,181,115, 78,208,181, 20,197,202,233,173, 3,173, 48,123,135, 87,223,168,155,154,245,122, 61,255,192, 34,100, 83,
+ 70,100,244,206, 73,208, 71,187,108, 33,201,225, 50,246,210,237,188,179,148, 75,204, 58,153,186, 54,155, 13, 85,189, 16,184, 58,
+ 68,198, 81, 18,112, 74, 44, 12, 65, 20,188,149,171,137, 73,242,176,149,177,104,133, 88,225,250, 1, 93,228,128,146,127,133, 23,
+ 47,136, 95, 91, 89, 77, 91,215,104, 37, 9, 95,185, 20,124, 37, 80,199,118,187, 33, 21,184,140, 7,245, 78,184,122,109,196, 71,
+238,156,149,105,222, 42,225, 27, 11,140,227,132,245, 30,138,240,184,227, 56, 82,162,120, 20,115,150,182, 47,165,228, 23,146,227,
+ 92, 94, 81, 57,114,146, 92,237,148, 19, 6,192,136,239,182,246, 53, 74,203,134, 61, 77, 2,153,167, 41, 48, 78,211, 19,197,109,
+206, 98,195,218,219,223,167,105, 26,106,103,113, 90,227,188,195,121, 43, 15,133, 2,148,162,105, 26,150,139, 5, 37, 71, 82,138,
+244,155, 53, 58, 78, 28,236, 44, 88, 54, 13,228, 66,229, 13, 77, 93,179,190, 88,113,122,122, 74,183,217,240,183,254,210, 87,121,
+112,124,193,183,223,122, 68,177, 30,127,101,159,207,190,120,141,227,251, 39,180,182,208,238,183,216,221, 67,194,118,195,131,141,
+164,120,197,162,248,210, 75,135,252,107,127,228, 5,254,220, 31,122,142, 12,252,226,215,223,227,159,189,249,144,186, 50, 12,211,
+136, 41, 9,173, 50,173,183,124,253,135, 71, 60,187, 80, 28, 13,142, 62, 91,106, 95, 17, 99,192, 89,241,139,231, 57,143,191, 20,
+129,218, 75, 46,172, 55, 27, 10,138,208, 15,228, 28,105,170, 26,227,156,120,141, 83, 32,230, 8, 37, 49,206, 46, 1,103, 53,169,
+219,224,188,163,219,246,212, 46,227,149,193, 56, 77, 28, 35,211,148, 68,181,108, 10, 37, 43,198,174,163,109,107,148, 50,212, 85,
+ 75,158, 70,170,182,198,104,139, 49, 22, 13,100, 36, 7, 61, 5, 69,206,145,186,114, 80, 52,195,166,112,177,142,140, 89,177,222,
+142,108, 55, 43,210,180,229,100, 53,240,230,183,127,200,163,183,223,103,120,240,144,238,225, 3,134, 62,240,255,254,147,239,240,
+214, 59,119,249,253,223,125,135,175,127,231, 46,191,254, 7,247, 56, 61, 91,243,229, 23,111,242,147,159,185,201,201, 89,135,169,
+ 13, 83, 82,124,247,238, 5,255,214,191,243,179,184,197, 14, 57, 38, 22, 70,225,235, 6, 93,121,118, 27,139,202,153,195,189,154,
+223,124,103, 69, 42,133,197,222, 46,121, 24,168,124,133,119, 6,239, 28, 33,202,134,145,231,173,206, 40,129,222,245, 37,116, 91,
+ 68,253, 95,138,232, 91,138, 82, 51,132, 42,255,148,146,103, 52,170,193,251,138,119, 62,248,152,183,223,255,128, 79,191,244, 2,
+203,229,146,231,110,223,166, 27, 6,142, 78, 79,229, 48, 76, 17,103,165, 85,106,185,179,164,105,127,180,253,196, 24,201, 68,188,
+175,240,115, 6,192, 56, 12,116,195,196,184,221, 16, 99,100,103,185,196, 87,158,170,174,232,182,221, 76, 27,137,207,119,189,150,
+ 40,204,202, 73,150,133,179,210, 87,208,247,189,188, 99,179,144,246, 50, 81,172,169, 43,182,221, 70,236,104, 74,146,227,234,170,
+ 33,230, 72,201,133, 75,223,240,166,239, 80,206,163,180,102,236, 6,208, 72,207,180,157,185,205, 65,232, 43,101, 50, 33,118, 24,
+147,105, 91, 81, 28,175, 87, 43,214,219, 53, 23, 23,107,169,213,204, 16,147,194, 56,131, 50, 21,144,197,109, 98, 12, 41, 12,128,
+150,108,248,170,230,202,222, 62, 71, 71, 15, 73,195, 41, 75,215,209,159,189,203,197,163,111,179, 61,251,128,229,173,207,242,169,
+215,255,109,154,234, 6,167,247,127,151, 76,134,172, 80, 41,115,112,184,135,119, 14,171,192, 24, 40,165, 80,251,134,162,228, 25,
+213, 90,129,176, 78,164,148, 9, 49,147,139,198,105,185,140,186,205, 57,235,237,134,147,147,115,140,174, 56, 56,184,194,114,103,
+143,170,113,132, 81, 66, 82, 54,235, 53, 25, 48,198,177,183, 92, 82, 59, 77,223, 93, 96,129,171,215, 14,185,117,253, 10, 78,111,
+ 8,171,123, 12,231,239, 51, 92,220,101,115,126,196, 94, 91,115,227,198, 85,108,217,176, 57,121,155,245,197, 67, 54,231, 27,206,
+214, 27, 66, 40,140,227,150,113,140,132,113, 69,202, 19, 90,123,226, 54, 18,131, 66, 27,168,236, 72,204, 61,138,194, 20, 2,214,
+ 57,182,155,141,156,137, 37,163, 75, 33, 23,197,162,169, 89,236, 44,216,108, 37, 37,210, 24, 35,136,171,175,228, 44, 45, 96,213,
+ 76,155, 90,113,171,136, 94, 39,224, 43, 73,208, 52,222,146,103, 61,152,113, 21,198, 88, 17,123,206,168,150,132,162, 73, 79,199,
+ 48,140,104,171, 81, 40,250,205,134, 2,244,189, 60,159,211, 56, 97,189, 44,146,130, 58, 15,196, 81,146, 14,149, 82,132,105,132,
+ 34,195, 73, 83,139,253, 54, 38,161,178,198,126,132,130, 92,186,218,224,189, 37,147,231,225,199,163,180, 32,148,228, 76,229,189,
+ 44,173, 70, 49, 12,146,204,152,139,136,231,180,149,108, 10, 41,186, 73,228, 36, 25, 19, 57, 11, 90, 29,210, 12,247,231,132, 82,
+ 26,148,232,172, 52, 66,119, 94,234,193,204,225,141, 27,111,168,121, 91, 30, 71, 57, 76, 54, 93, 71, 8,179,207,175,136, 64,204,
+ 91, 11,136, 90, 56,165, 36, 31,244,252, 33,116,221,150,190, 23, 65,128,117,158,213,106,197, 24,132,255,117,198,162,157, 23,241,
+ 91, 20,139,144, 82,144,178,134, 28,209, 86,130, 33, 98, 74, 51, 87, 81,144,239, 92, 2, 29, 40,178,161,148,140, 68,192, 86,158,
+177,239,168,235, 90,154,205,114,126, 66, 3, 40,107,137, 81,166,193, 49, 76,196, 97, 68, 91, 67,152,164,199,221, 88, 17, 21, 80,
+ 10,149, 19,152, 35,134, 32,218, 21,107, 72, 33,145,178,248, 36, 99, 14,236,180, 11, 57,180, 98,192, 59,207,102,189,193,206,106,
+202, 92,102,145, 94,144, 7,170,148, 52, 59, 3, 70, 66,144,200, 87,239, 37,104,101, 49,167,228, 85, 85,197, 98,103, 7,103, 69,
+121, 74, 46,172,215, 43,198, 16, 41, 69,177,172, 27,177,247,104,205,249,209, 49,222,105, 90,165,168, 43,203,222,222, 46,185,192,
+102,125,134,213,133,163, 71, 15,120,248,224,136,205,249,138,211,179, 51, 82, 14,220,216,173,249,247,126,234,121,222,186,119,198,
+209,105,207,131,147, 45,119, 79,123,174, 95, 89,240,175,126,229, 69,222,251,240, 62, 62,142,148,238,130,159,124,253, 37, 76,152,
+248,233,215,111,240,244,142,225,202,194, 49, 20,217, 22,190,242,217, 91,252,149,255,249,235, 20, 45, 23,131,100,134,139, 39, 20,
+192, 24,197, 63,125,243,152,135,167,231, 79,160,196,186, 18,235,154,113, 78, 32, 36, 36,184, 4, 37, 10,213,146, 1,141,192,144,
+ 65,162,117,167, 24, 89, 54, 53,206, 11,236,181,179, 20,159,106, 28,122,198,245, 10,131,198, 90,131,138, 29,206, 89, 10,150,146,
+ 11,186,241,114, 1,104, 43, 47,147,177,108,182,219,121,155,169,177,149, 76,230,221,197, 26,173,193,105,141,245, 21,149,215, 80,
+ 20,222, 91,198, 41,146,139,248,230,149, 85,212,173,188,124,211, 24,233,182, 9,173, 18,127,249, 75, 87,216,247,138,243,227, 53,
+171,117, 15,155, 11,226,197, 41,123,181,225,221,163,158,172, 13, 55,111, 95,227,143,253,248, 11, 92,189,178,199,149,235, 7, 84,
+149,227,221,143,143,248,224,120,224,221, 71,107, 94,125,254,144,175,126,250, 54,215,247, 61, 87,118, 27,106,167,249,205,239, 63,
+226, 87,127,112,193,123, 31, 29,241,218,205,150, 87, 95,185,201,111,190,117,198, 89, 87,240,149,167, 15,145,119,223,125,143, 77,
+215, 73,169,138, 53,130,212,230,242,228,162,206, 37, 11,204,157, 50, 99, 8,160, 4,146,207, 69,160,120,103,133, 59,212, 90, 58,
+ 28, 46,219,219,154,202,211,180, 13,171,205,150,239,254,240, 29,118,155,134, 43, 7,251, 60,255,212,109, 30, 62, 62,230,254,163,
+ 35,156, 49, 44,118,118,176,198, 82,213, 53, 49, 39,218,186,193, 56,113,145,228, 92,136, 69,106, 48, 55,221,134,113, 8, 88,163,
+ 68, 83,162, 21,151, 17,208,221,166,155,203,136, 60, 49,199, 25, 38,119,148,156,232,123,177,108, 94,114,164,221, 32, 27,140,120,
+198, 45, 93,223,163,181,102, 12, 35,139,118, 73,202, 25,111,101, 88, 47,185,176,222,174,133,242, 81, 10,173, 97,156, 38,154,170,
+194, 96,240,190, 34, 71,225,231,173,150, 16, 16,231, 29, 77,211,144,162,124,134,185,100,166, 36,121, 10,171,109,160,219,244,196,
+ 24, 72, 69,196,158,122,166, 27,141,154, 83, 16,211,156,190,167,165, 75,226,241,241, 9,155,243, 21, 15,142, 30,146, 82, 98,179,
+ 89,115,118,190, 34, 77, 3,251, 7, 11,106,103,209,241, 49,155,243,247,136,212,236,221,252, 49,250,213,125,198,126, 53, 15, 89,
+ 9, 84,102,152, 70,198, 41,138, 6, 5,133,115,134, 82, 52,153,132, 54,242,245,208, 96, 93, 75, 41, 2,181,230, 82, 80, 73,224,
+102,239, 20, 67,223,177,217,174,121,244,240, 33,171,213, 10,235, 43,246,246,175,114,120,120,141,102,209, 80,178,156, 79,171,109,
+ 79,229, 91,177, 91,117, 35,165, 68,198,110, 67,223,141,120,107, 88, 46, 42, 42, 99,185,216,116,124,114,116,202,217,217,134, 97,
+154,152, 98,161,144,240, 70, 20,253, 10, 89,248,116,209,228,162,200,121,100,217,102, 14, 15, 12,123,187, 21,206, 25, 82, 42,116,
+163,156,207,198, 90,186,237,150, 52, 37, 66, 39, 91,119,209,115, 62,199,248,163,158,241,186,174,233,135,129, 24, 3,198, 72, 99,
+167,175,228, 62,162, 20, 98,146,220,246,186, 18, 33,110,211,212, 56, 35,219,182,210, 6, 20,244,219, 45, 33, 38,156,158,163,179,
+131, 56, 50, 74,129,144, 2, 67, 55,200,146,186,179,192, 25, 81,181,231, 36, 52, 86,152,100, 24,170,156,220, 73,149, 23, 10,175,
+170, 42,156,151,222,243, 39,217,236, 41,161,138, 2, 20,237,178,197, 85, 30,235,141, 64,250, 65,158,151, 24,231,236,130,185,235,
+194, 57, 65, 51,251,105,100, 24,100,136,173, 43, 89, 84, 55,155, 13,227, 48,138,205,214,136, 11,173,174,107, 41,241, 74,242,156,
+135, 48, 17,166,145,113, 18, 23, 71, 1,164,138,217,224,180,160, 90, 57,103,204,213,155,183,223,184,132, 20,156,247,194,103, 86,
+115,137, 70,140,104,101,208, 86, 97,180,148, 95, 24, 99,176,243, 33,190, 94,111,132, 79,205, 25,173, 20,245, 98,137,210,226,235,
+206, 73,218,116, 82, 42,148, 44, 85,136,151, 62, 64,217,132, 3, 99,148, 23,189,223,246,144, 19, 41, 74,101,163,118,179, 13, 33,
+ 69,148, 2,163, 52,218,136, 26, 80, 33, 91,118, 76, 18,229,199,255,239,107, 40,235, 40, 73, 14, 12,177,194, 73,248,195, 44, 65,
+149,112,143,113, 36,151,196,101, 27,154,146,125,155,113, 28, 69,113, 95,120, 34,232, 82, 74, 17,115, 70, 21,129,123,166, 41, 60,
+161, 30, 46,185, 76,173, 21,139, 69, 75, 12,129,156,149, 64,245,117, 69, 85, 73,250, 87, 93, 55, 24,165, 72, 8,220, 40,193, 49,
+242, 34,142, 99, 79,158, 38, 22,222,145,195,128, 43,137,179,163,135,228, 56,177,119,101,135,177,219,178, 89,175,216, 14, 61,167,
+ 39, 39, 76,211,192,197,197,185,248,214,167,128,214, 18,182,160,173, 34, 38,240, 86,241,159,254,133,159,228,237, 15, 30,242,224,
+180,231,108, 8,220,216,109, 88, 58,205,189,243,192, 79,124,254, 6,191,253,237,251,188,119, 60,178,176,153,195,214,177, 61, 95,
+241,210, 43,207,210,238,239,145,114,198,228,194,217,122,226,191,255,229,239,210, 24,131,175, 28,218, 56, 17,251, 81,112,206,227,
+141,198,233, 34,225, 45,219, 13, 57, 79, 56,223, 96,236, 44,134, 75,137, 88, 10, 74, 43, 98, 76,172, 87, 27, 98, 8,148, 40,124,
+ 21, 57,163, 42, 79,227, 28,221, 48,208,182, 18,219,170,141, 97, 88,159,179, 89, 93,112,251,112,143,167,175,182,220,187,247, 0,
+ 79, 33, 39,133,170,101,107,149, 24, 98,201, 46, 56,187, 88,203, 97,156, 19,214,137,104,210, 20, 69, 70, 99,172,134,148, 72, 41,
+ 48, 13, 61,113,144, 42,199,166,174,112, 94,244, 15, 20,200,243,115, 84,102,139, 78, 78,145,255,236,107, 79,243, 51,159,187,201,
+171,159,185,195,207,124,245, 21, 62,255,218, 11,216, 27,183,121,234,165,231,249,252, 79,124,129, 47,124,238, 54, 79, 63,117,200,
+215,254,196,235, 60,119,231, 22,223,254,230, 7, 60, 26, 18,183,174, 44,248,254,135, 39,124,114,209,203,176,154, 3,255,240,219,
+ 31,241,149,207, 60,197,127,247, 75,111,242,243,255,237,175,241,191,126,253, 49,125,125,192,255,242,207,143,248,175,255,238,183,
+ 24,207, 54,252,204, 23,111,243,207,222,185, 96, 10, 35,149,175, 32, 11,207,152, 75, 17,196, 38, 37, 74,153,139,147, 46, 7, 95,
+ 5, 97, 30,134,225,210, 70, 40, 27,130,210,151,217,238,162,154, 87, 90,254,212, 74, 63,177,174,166,148,248,240,147, 7, 44,219,
+134, 69,211,112,231,246, 77,254,224,135,239, 80, 80,180,109, 75,204,145, 20, 34,117,221,112,233,145,119, 78, 50,180, 43, 39,137,
+130, 18,178, 33, 57,234,109,219, 80,123, 15, 73,177,237,182, 52,237,130, 82,230,115, 32, 23,194, 48, 60, 25, 0,199, 97,224, 50,
+116,202,213,126, 70, 26, 10, 59,187,187,178, 1, 25, 3,200,123, 39,170,112, 81, 15, 43,163,153,134,203, 86, 64, 17, 51,229, 44,
+ 27,141, 49,134,172,228,189, 46, 26,134, 78,130,155, 72,153, 24,203, 12,169, 66, 85, 9, 10,224,230,207,101,103,113,192,118, 20,
+161,173, 65,163, 84,134, 98, 80, 74,158,145, 56, 11,121,149, 50,128, 28,230,117, 93,179,104, 29,253,212, 19,199,136, 54,224,140,
+ 98,219,201,129,126,245,218, 21, 20,145,254,236, 99,212,112,159,208,221,147,140,112, 13,245,194, 73,170,221, 80, 24,167, 8, 69,
+ 99,148, 34,150,132, 38,113,120,176,203,222,206,130,146,178,228,101,100, 37,153,226, 51,253,152,179, 12, 86, 40, 89,198,202, 76,
+177,104,165,136,211, 72,183, 93,113,252,248,136,227,227, 99,142, 79,206,232,123, 41,226,241,222,178,237, 4, 22,158,210,196,241,
+209, 57,219, 97,100, 12, 35,231,155, 45,167,171,129,117, 47,233,142, 70, 59,140, 5,173,244, 92,110, 37, 86,171,164, 10, 97,234,
+ 9, 99,196, 85,176,220,209,236,239, 58,118,118,229, 25,117,222,177, 90,175, 24,134,158,146, 37, 59, 66,228, 69,162, 8, 55,222,
+ 18, 98, 98,111,119,201, 56, 4,198,105,124,130,206, 12,195, 40,104,146,147,114, 22,235,172,164, 64,230,252,196, 45,101,140,104,
+150,172,181,148,172,232,135,142,105,144, 75,174,170, 36,112, 71,161,176,109,133,243,114, 25, 75,120,151, 17,129,182, 42, 18,174,
+100,228,142,169,171, 26, 41, 4, 74,104,165, 89, 46, 90,180, 86,164, 20,159,136, 67,101,144, 81,180,109, 35, 89, 44, 69, 42,178,
+ 47,243, 82,226, 76, 51, 41,138, 92,176,243,215,181,202, 96,140, 37,151, 36, 97, 55, 69, 52, 47, 0, 37,101, 74,148, 0,168, 68,
+ 66, 35, 98,215, 16, 2,227,165, 6,129,140,209,134,202, 75, 84, 51,243, 59,226,156, 36,211,149, 82, 48,214,227, 42,137, 34,247,
+181,147,193,121,255,234,181, 55,180,117, 92, 86,125,250, 74, 38,159, 97,232,101,178, 77,137, 52, 12,140, 97,148, 23,218,154, 31,
+ 97,249,169, 80, 74,146,214,164,182,197,104, 77,137, 50,113, 85,149,164,139,229, 52, 79,150, 70, 67, 41,148, 4,117, 83, 19,194,
+ 68,142, 17,173,138,168, 25,189,167,169, 43, 10, 69,248,121, 99,101, 87, 47, 2, 57,100, 20, 58, 39, 54, 93,143, 51,162, 4,141,
+ 41, 17,114, 34, 71, 41, 61,153,198,137,148, 11,222, 87,196, 56,137,223,214,206, 65, 2, 74,106,242,140,214, 84,190,198, 91, 63,
+115,190,242,162, 59, 43, 86, 50, 50, 52,139, 70, 30, 12, 35, 23, 71,229,165, 14,182,170,156, 64,155, 57,179, 92, 74,159,119, 46,
+ 50,245,139, 22, 64,242,199,181, 22,229,126, 76, 34,244,240,222, 11,140, 26, 36, 72, 35,246, 29, 67,183,162, 63, 63,147, 48,136,
+245, 5,105,234, 8, 97, 22,156,105,197,197,217, 74, 38,241,186, 18,207,124, 9, 79,224,155,152,227, 44,140, 16, 62,102,247,202,
+ 62,190,118, 16, 19,127,253, 47,188,206,195,251,231,220, 63,186, 64, 25, 71, 85, 50,215,246,107,206,250, 76, 84, 53, 95,126,237,
+ 14,159,187, 85,243,206,135,143,248,228,209,154,139,245,192, 79,255,244,107, 76, 33,161, 83,145,174, 97,173,248, 31,254,222,247,
+132,187, 87, 26,107,180,136,242,128, 16, 39,217,206,149,108,241, 86,137, 66,118, 28,122,198,152,136, 81,132, 39,146,126, 52,206,
+209,188, 9,141, 92,230, 69, 21,176, 22, 99, 61, 49, 39,129, 98,103,168,245,248,163,143, 88,157, 93,112,243,234, 33,215, 23,150,
+ 78, 53,212,198,114,124,122, 65,181,187, 20, 17,102, 41,180, 85,197,114,103, 23,109, 61, 39,143,143,169, 42, 71, 85,137,144,176,
+100,201, 86, 71, 23,225, 41,181,193, 58,199,114,119, 23,171, 69,112, 57, 77, 19,149,175,104,171,150, 97,154,112, 86, 32,207, 66,
+ 33,160,249,133, 31, 59,224,166,141,188,191,245, 60,124,188,226, 96,111,193,171, 47,223, 0,237,248,213,223,120,135,183,222,252,
+136, 46, 91, 94,127,253,121,140,130, 95,255,167,111, 49,110,183,220,190,190,224, 68,213,156,159,172,121,247,164, 99, 61,102, 30,
+175, 2,143, 47, 70,254,206,111,188,205,239,188,117, 4, 64,197,196, 65,219,112,101,233,232,183,107,254,241,155,247,121,120,178,
+226,249,167,175,240,193,209, 6,107, 29,253, 52,112,250,248,132,103,159,186, 77, 83,123,180, 17,212, 66, 46, 51,201,109,160,128,
+181,142,146, 51, 49,101,148, 42, 20,212, 19, 88, 94, 43, 48, 86, 42,138,115,150,119,176,114, 98, 23, 51, 90, 34,124, 99,138, 28,
+159,156, 50,244, 3,109,219,114,176,187,195,131,147, 83, 66, 16,119,137,212, 17,203, 65,180,217,110,132,199,110,151,244, 67, 39,
+195,188,213,148, 40,104,218, 56, 74, 40, 81,200,137,186,170, 24, 58,169,210,172, 42,201, 42,112,214,211,247, 29,206,137,240,231,
+114,179,208, 70,104,164,203,124,130,113,144, 66, 11,239, 37, 17,210,215, 53,181,151,128,168, 48,142,104, 5,190,146, 84,189,148,
+196,173, 99,180,158,173,179,210, 32,183,186, 16,193,159, 20,121,120,166, 32,145,164,250,178,157, 49, 10,221, 83,114,194,184,194,
+110,123,141,110, 28,184,116,115,136,229, 12,174, 29, 30, 82, 47, 26,134,190,135, 82,112, 94,225,140,151,172,240, 4, 26, 77,162,
+144,167,196, 48,141, 52,149, 97, 24, 2,143,142,206, 56, 57,185, 96,179, 21,180, 37, 14,107,249,255,198, 45,155,213, 57, 41, 26,
+158,121,246, 89,114,145,110,132,172, 21,196, 12, 69,172,170,155,174,103, 24, 34, 33, 22,114,129,102,206,203, 15,179, 87, 58, 35,
+225, 40, 10,135,177,106, 30, 58, 68, 44, 88,207,240,112,219, 84,180,181,195, 57, 77,154, 70,210, 20, 33, 11,154, 82, 47, 12, 97,
+144,180,208, 97, 28,200, 33,208, 56,197,254, 97,139, 53, 94, 46, 37,163,216, 93, 46,217,221,113,224,119,241,139, 37,121, 74, 88,
+ 91,248, 67, 95,254, 18,215,174, 47,169,189,158, 59, 58,102, 81,162, 82, 12, 51,106,187, 88,182,104,165,102,219, 94, 79,204,145,
+113, 24,165,211, 92,219,249,174,145, 18,146,237,118,141,171, 43, 4, 25, 20,218, 33,167, 44,209,229,198,161,209, 96, 52, 70,139,
+248,184,160,158, 8,199, 82, 22,189,213, 24, 38, 22,139,197,156,124, 40,142, 23,103,173, 84,109, 15,129, 24, 39, 25,148,130,216,
+163, 83,146,231,180,242,179,242,190,150,122,226,122,182, 66, 59, 43,137,138, 10,113, 4, 25, 12,174,146, 64,172,203, 58,108,227,
+220, 60, 52,107,180,250, 81, 63, 74, 14, 9,109, 53, 80,230, 33, 91,162,200,157,183,144, 5, 93,186,228, 24,164,175,162,162,242,
+ 14,103, 12, 18,228, 53, 48, 77, 1, 55,223, 27, 90, 41,172,113,248,218,227,172,166,114, 66, 61, 90,111, 69, 49,159, 37,252,169,
+228,140,217,187,118,237,141,156, 11,109, 83, 51, 5,233, 46,175, 42,105,191, 73, 89,166,223, 39,155, 43,136, 88, 44,198,121,202,
+ 45, 79,188,224, 2,251, 5, 66, 22,137,190, 88,200,252,252,175, 68,240, 57, 47, 29,202, 18, 21, 42, 91, 93,219,182,144,211, 12,
+147,143, 88, 43, 63,104, 74, 73, 46, 89, 13, 34,206, 19,191, 58, 32,193, 0, 97,132,114,153,232,230,177,222, 99,140, 23,127,173,
+115, 52,117, 67, 83,215, 72,210,155, 76,118,214,201, 67, 96,140,168,204, 67, 76, 79, 80, 5,241, 26, 43,180, 17, 91, 15, 74, 38,
+243, 24, 38,180, 49, 51,119,193,147, 11,157,156, 9, 57, 75, 36,105, 41,228, 60, 7,101,228, 66,215,109,197, 2, 23, 35,218,104,
+ 66, 16,127,172, 85,176, 93,157, 50,117,107,166, 77,143,177, 26,103, 69, 4,103, 43, 75, 74,112,120,253,144,148,147,108,201,139,
+ 5,149,247,140,253, 64, 93, 45, 68,148,152, 50,237,156,220, 84, 55, 13,139,189, 29,198,113,224,248,108,197, 78,229,248,115, 47,
+239,241,222,221, 99,182, 17, 2,133, 62,100, 14,118,106,214,219,158, 76,225,254,241,150, 43,215,175,241,252, 83,251,252,218,119,
+238,113, 17, 44,255,250, 79,189,194,227,109, 34,132, 68,235, 44,109,235,249,219,255,207,119,241, 51,199, 89,148,130, 44, 47,173,
+213,154,109, 63,224,156, 69,106, 60, 33,199, 2, 42,227, 50, 84, 59, 11,154,166, 69,105, 17,110, 45,218,150,161,239, 81, 41,145,
+141, 97,127,127, 95,120,246, 36, 69, 36,148, 76,183,221,112,113,252, 8,163, 10,159,253,194,103,120,249,133, 79,241,226,231, 94,
+227,124,219,179, 62,121, 68, 23, 10, 86, 87,104,163,240, 77,141,245, 13,174,174, 88, 95, 92,176,216, 89,176,179,179, 75, 65,144,
+144,105, 10, 96,196,174,232, 27, 73,251,203, 90,182,132,245,166, 71,250,140, 45, 41,203,168, 88, 87, 21,139,157, 22,107, 43,162,
+ 82,188,180,111,248, 11,183, 70,206, 7,195,218,120,180,130,123, 15,206,216, 76,146,234,180,238, 39, 30,156,245,188,247,201, 5,
+239,127,178,230,124,232,248,254,221, 53,235,108, 88,120,203,199,103, 29, 63,188,123,194, 39, 23, 19,232,140,215, 6,173, 50, 65,
+ 73,159,186,209,114, 56,253,248, 87,191,192,254,173,107, 92,189,118,149, 91, 55,111,112,239, 34,210,245, 35, 23,155, 14,173, 53,
+ 49, 6,218,186, 97,117,113,193,178,105,177, 70,132,113,218,104, 25, 54,103,205, 66, 46,146, 58,152,139,188, 29,114,159,107, 64,
+150,249, 82,202,140,154, 21,200, 32,162, 90, 5, 74,202, 95,114,206, 12, 33,112,118,177,162, 27, 70, 84, 73, 4, 52, 99,140, 84,
+222, 49, 76,210,174, 23,230,195, 80,105,177, 8,214, 77,139, 49, 14,111, 36,210, 82, 41,249,158, 83,148,252,238,190,235,229,114,
+156,191, 86,138,114,168,250,186, 97, 26, 36,106, 56,151,140, 55,150, 41,140,226,122, 40,242, 30,134, 56, 1, 18,199,106,173,163,
+223,110,231,128,160,106,182, 10, 9, 79,170,181,192,192,214, 73, 0, 81, 63, 77,115,110,131,102, 26,167,249,130,200,120, 39,194,
+ 92,129, 68, 35,211, 40, 23,124, 65,130,147, 20, 25, 99, 50,139,197,174,156,103,121,214,225, 16,153,146, 52, 85,134, 73, 50, 60,
+ 66,152,168,235, 10, 99, 45, 99, 63,144,138,162,148,217,143, 78,102,154,164,196,233,153,219,183,105,218,134,166,242,148,162, 56,
+184,122, 13, 20,228,172,201,168, 89, 20, 92,211, 54, 13, 79,221,188,193,193,238, 2, 41,206, 82,144, 18,227, 36, 2, 79,171, 53,
+ 82, 70, 50,176,191, 92,178,179,183,139,213,210,150,153, 98, 98,119,119, 15,230,203, 68,232,129, 12, 69, 97,156, 20,128,108,187,
+ 94,104, 49, 36, 38,252,157, 0, 0, 32, 0, 73, 68, 65, 84,235,200,218, 96,172, 38, 39,136, 83,164, 31, 38, 98, 54, 56,171,240,
+149, 52,141,105, 11,227, 32,159,149,119, 30,215, 46, 89,109,122,198,144,217,158, 60, 34,229, 45,139,182, 37,134, 76,211,236, 83,
+121, 79, 74, 35, 6,141,182, 90, 58, 23,188, 67, 25, 77,237,106, 36,197,109, 75, 46,226, 92, 80, 74, 17,163,120,187, 21, 82, 73,
+124, 9,211, 79,163, 60, 63,195, 52,208,247,146,239,209,119, 61, 49, 78, 40,109,176, 90, 19,166, 72,201,226, 74,154,130, 36, 25,
+ 90, 43, 63,191, 82,115, 70,198, 48,226,189, 99, 12, 3,146,248, 38,129, 93,114,128, 3, 48,111,194, 10,165, 68,201, 63, 14, 17,
+239,100, 1, 64, 41, 65, 45,141,216,207, 36, 0, 75,129, 18, 93, 75,206, 25, 40,164, 84,136, 33,146,147, 36,142,166, 48, 39,186,
+ 25,205,101,186,160,214,134,156,132, 42,139,229, 50,198, 57,130, 50,148, 34,165, 81,222, 9,165,124, 25, 65,238,156,133, 92, 24,
+227,132, 46, 18, 10,212,245, 18, 80, 38,129, 99, 80, 84, 38, 77, 51, 21,150,196, 30, 58,142, 19,206, 59,204,141,219, 79,191,145,
+ 75,194,122,129,227, 52,224,125, 69,136, 18,133,167, 99,164,110, 26,234,170,166,148, 34, 17,157,222,203,131, 54, 72, 3,218, 48,
+141,172, 86, 43,182,219,142,161,235, 8,211, 32,226,185, 92,152,194,196, 48,116,243, 70, 81,232,186,142, 41, 76, 84, 78,184, 10,
+ 16,133,189, 49,154,202, 75, 78,180,178, 26, 10,164,156,229, 0, 42,242,155,168,172, 68,163,106,107,105,170, 90, 30,202,105,148,
+ 3, 99, 10,132, 56, 49,244, 18,127,104,140, 65,147, 73,185, 60,137,102, 13, 65,138, 35,140, 17, 33,133, 22, 92,232, 73,217,199,
+ 20, 3, 90, 89,198,105, 96,232, 39,114,152, 4,130,177,150,205,118,246, 29, 54, 13, 41,103, 66,140, 79,236, 77, 85, 45,159,141,
+117, 94, 30, 86,173,241,214,226,170,138, 28, 37, 45,106,234,123,226,102, 69,154, 36,145,207,213, 21,139,229, 18, 87,139,215, 63,
+103,133,247,162,252, 94,157,175,169,219,138,237,118, 67,142, 73,106, 67,189,136, 64,180,213,120, 91,211, 79, 61,219,109,143,175,
+ 29,117,189,203,237,155, 55, 25,198,196, 83,187,153,143,128,167, 66,207,117,167, 56,233, 2,123,251, 13, 99, 86, 92, 91, 8, 52,
+125,180, 25, 25,116,203,181, 70,243,173,251, 3,231, 83,164, 11,153,245,152,120,229,206, 62,239,191,251,128,255,237,183, 63,192,
+168,130,114, 6,173, 29, 57, 10, 60,149,149,116,108,143, 83, 64,101,225, 30,115,201, 24,101,196, 65, 16, 37,233,105,103,111, 95,
+224, 95,173,240,214, 50, 4, 81, 30, 55,173,184, 14,148,146, 11,166, 91, 95,144,183, 91,190,252,233,155,252,236,159,248,163,124,
+230,229, 23,120,250,217, 27,196,169,231,195,247,223,231, 43,175,127,154,211, 62,201,133, 80,137,179, 96, 26, 7, 46, 86, 23,180,
+117, 77,179,187, 16,187, 87,201, 51,140, 39,141,110,125,215, 81, 91, 75, 74, 5,109, 13, 77,179,224,248,248,152,202, 91,156,119,
+226,203,214,134,152, 19, 83, 63,200,179, 57, 26,254,212,181,145, 91,215,118, 57, 9, 5,172, 97,175,245, 76, 70, 51,132,204,118,
+ 72, 12, 41, 83, 45, 26,174, 63,119,141,118,191,225,147,143, 86, 68,103,121,254,133,235,220,188,115,141,183,190,255, 9,167,219,
+129, 71,171,248,100, 99,206, 74,161,234, 6,175,228, 64, 31,134,145,189,221,150, 23,110,222,226,165, 23, 94,224,217,103,239,240,
+226,157, 59,188,250,202,107,188,112,235, 22,215,175,239,177,108, 37,228,226,250,222,190, 64,135, 81, 26,165, 52,138,152, 50, 32,
+ 8, 81,201,133,148, 5, 30, 44, 5,164, 9, 79, 46,241,203,128,154, 31, 29,168,160,141, 92,150, 49, 73,247,185, 66, 46,254, 41,
+ 72, 62,251,249,197,154, 24, 35,182,150, 12,135,237, 86, 90,163,140,210,120, 87,205, 73,145, 98,247,220,174,215,140,147,148, 64,
+ 89, 35,161, 25,165,100, 74,146,142,132,170,174,209,198, 48, 77, 18, 40,148,146,188,207,198,206, 60,104, 46,243,115, 32, 98, 81,
+173, 45,227, 36, 73,137,195,216,211,212, 13, 90, 23, 17, 49,105,203, 56, 78, 52,245,220,131,128,148,106,132, 40, 84,154, 64,211,
+153, 20, 4, 37,146,247,175,166,118,158, 24, 34, 83,144,246, 66,113, 7,104, 80,138, 24, 3, 49,204,231,194,216,163, 84,160, 93,
+104,154,166,101,119,103,193,206,114,143,113,140,156,175, 86,196, 80, 68,156,151, 36, 55,222,251,154,110,186,236,196,136,160,120,
+242,121, 91,109,104,155,150,245,249, 57,103,171, 19,114,154,184,122,112, 5,140,197, 26,241, 74,147,179,112,181, 70,241,254,135,
+ 31, 51,134,204,114,167,225,252,108,197,181,235,215,209,202,204,130,189,140, 85,144, 74,100,181,190, 32, 77,137, 97, 74, 18,218,
+ 18, 38,166, 48,177,191,183,135,162,204,203,145,151, 1,219,202,187, 18,227,136, 49, 21,168, 66,140,153, 56, 77, 88,123,233,220,
+113,242, 89,206,103, 74,179,239,201, 67, 70, 27,241,145, 23,219,112,114,118, 78, 24, 34, 90, 5, 82,232,231, 75, 78,122,238,173,
+ 49, 28, 28,222,164, 31,214,108,214, 23,132,146, 80,128,243,213,124, 30, 75, 80, 87, 41,242,179,138, 82,221, 97,157, 67,219, 31,
+ 21, 52,237, 44,151, 40, 43,246, 86,178, 56,148,166,105, 34, 78,153, 66,158, 7,198, 8, 40,218,166, 65,198, 49, 41,114, 49, 90,
+134,249,166, 93,224, 43, 7, 69, 2,141,140,209,164, 92, 40, 89,212,134,117, 93, 9,194,107, 61,149, 19,173,136, 46,133,166,109,
+197,221, 21, 47,235,132,133, 94,213, 70,232,170, 20, 35, 41, 77,228,185, 13,173,164, 4, 69, 60, 53,185,136, 37,249, 50,111,228,
+146,198, 3,200,162,120,198,217,217,133, 98, 61, 86, 9,239,173,200, 56,237, 73, 57,201,160,172, 20, 69, 43,166, 57,147,165, 36,
+ 41, 41, 18,237,138, 60,207, 49, 73, 64,214, 56, 10,250, 57,133,137,156, 69, 47, 32,237,156,162,126,215, 26,204,149, 27, 55,223,
+208, 64, 81,242,129, 89,227,184,244,253, 57,231, 69,216,101,140, 8,186,102, 65, 67,152,166, 39,240,197, 56,202, 7, 97,125, 69,
+ 63,183, 96, 21, 36,167,246, 98,117,129, 72,248,211, 92,115, 39,155,148,209,210,246, 20, 83, 20,190, 44, 78,140,253,128,247,118,
+134, 81,107, 50,242,119,170,153,223, 15,147, 4, 15,148,146, 81, 69,188,159, 5,168, 91, 49,221,251,202,163,208,243,244, 22, 8,
+227,248, 68,205,168,103,200, 38,134,137,144, 4, 2,218,246,226,203, 69,203,180,102,157,197, 91, 71, 81,144,194, 68, 46, 2,213,
+199, 41,144,201, 79, 32, 45, 73, 9, 26,169,106, 81,206, 86, 94,146,227,156, 23, 37,175,115,210, 50,165,140,240, 45,214,106,202,
+250, 19,158,185,234,184,121,243,128,221,218,240,218, 23, 94,225,225,221,135,172,186,158,166, 94, 80, 20,104, 5,125, 55, 48, 78,
+145,182,173,112,182,198, 56, 75,214,130,145,212, 77,203, 24, 7,206,207,215, 24,239,112, 85,195,193,254, 62, 74,105,202, 56,176,
+ 94,111,201,202,240,149,189,129,127,255,199,110,178, 58,186,160,105, 43,150,113,226,246,149,150,227,190, 48,197,204,162, 50,124,
+114,220,177, 13,129, 59,207, 95,103, 79,103,254,199, 95,121,155,207,191,124,157,131, 74,241,209, 15, 63,226, 95,252,214,183,248,
+205, 7, 2,173, 78, 67,160, 89,180, 24,132,139, 82, 40,116, 1, 95,121,134,105, 34,165, 68,229,107, 48,134,126, 59,208, 54, 2,
+119,118,227, 72, 49,138,113, 20,241, 92, 70, 34,118,173, 53,172,207, 78, 25, 46, 46,232,251,158,102,236,248,218,237,154,157, 59,
+207, 97, 43,207,221, 15,239,114,255,189,143,104,134, 83,142, 30,175,216, 61,216,101,183, 93,112,255,147, 7, 12,195,200, 56, 73,
+121,135,177,138,213,102, 77,127,118, 65,140, 3, 10,135,115,208,173, 54, 20, 3,222, 40,182,155, 11,198, 52, 97,149,161,204, 52,
+207, 48,140,104,149, 41,200, 37,128, 42,196,144,201,227,200,178, 86,252,165,175,221,225, 27,247, 35,215,246,119,185,125,208,176,
+ 29, 35,215,158,186,194,197,102,226,209,201,154, 27,135, 75,206,207,183,248, 69,197,250,104,205,163,199, 43,142,207, 7,158,221,
+205,252,189,111,222,231,123,239, 31,209,107,205,201, 86, 54, 69,138,162, 88,141,182, 21, 49,102, 82,201,168,146,217,108, 70,124,
+211,240,224,232,136, 97,156,248,240,227,187, 60, 56,186, 71,213, 58, 30, 62,184,203,149, 27, 75,110,221,185,202,176,150, 60,119,
+ 51,111,234,227, 52,205, 27,223,172,202, 77,146,199, 96,180,216,247, 46,189,220, 41, 11,178,166,129, 48, 15, 1,133,121, 75,138,
+153,152, 34, 83, 76,179,248, 72,218, 4,167,249,114,180, 64, 40,138,126, 16, 72,222, 90, 71, 63,191,231,151, 29, 6,206, 57,198,
+ 65,222, 19,231, 28,221, 56,204,200,154, 70,207, 97, 52, 33, 8,220,105,180,193, 58, 47, 98, 34, 43, 5, 78,165, 8,207, 94,213,
+146,222, 21, 66,198, 24,233, 98, 32,201,249,177,221,110,197, 47,239,188, 12,130, 70,156, 45, 97, 26, 73,185,208, 46, 22, 56,103,
+ 81,104, 54,235, 53,138, 68,211, 46,168,107,241,244, 86, 85, 67, 46,179,109, 42,103,156,175,160, 20,148, 1,149, 51, 20, 48,206,
+ 98,144,204,237,202,123,233, 63, 79, 61,168,128,115, 25,223,238, 49,246,114,121,146, 19,164,130,118,142, 91,183,110, 83, 89, 47,
+219,229, 60, 92,169, 34,195,252, 98,185, 64, 27,135,246,142,177,159, 24,167, 34,135,186,175, 24,199,158,139,243, 11,134, 97,100,
+181, 90,211,245, 43,194,208, 51,197,137,245,234,130, 92, 68,148,120,229,234, 13,198, 56,205,195,153, 12,108, 86,201, 96, 97,108,
+ 77,200, 96,181, 34, 37,113,150,236, 52,158,131, 43, 7,178, 33,150,194,122,117,206,102,179,229, 50, 71,195, 59,169,161, 45,104,
+ 82,142,108,183, 29, 25,216, 89,212, 84,190,166,104,136,147, 84,120, 42, 83,179,237, 38,182,219, 21, 87,118,106,110,220,186,134,
+213,154, 24,164,173, 50, 23,141,202, 25,163, 21,198, 89,110, 92,127,154, 82, 18, 97,146, 66, 18,237, 36, 46,181,169,235, 89,236,
+ 42,119,138, 50,179, 29, 18,216,110, 58,194, 36, 73,159,190,170,230, 51, 84, 58, 33,140, 21,254,187,109, 91,218, 86, 6, 49, 9,
+180, 74, 72, 93, 12, 79, 4,215,214, 73,118, 7,136, 77,110,156, 41,148, 28, 5, 37, 26,198, 17, 82, 18,240, 42,101,225,188,231,
+239, 71, 27,201,136, 87, 86,114, 32,172,147, 97, 34, 4,201,104,177,102, 30, 82,179,184,170, 40, 69,242, 5, 0,138,216, 13, 1,
+196, 82, 37,209,229, 40, 69, 70,138,185, 64,158, 59,209,101,105, 64,129, 46, 92,210,103,105, 70, 87,148, 81,228,152,169,171, 70,
+ 62, 43,167, 69,220,107, 13,206, 24,140, 19,143,127,201, 82,114, 22,130,252,153, 98, 36,132, 17,235, 60, 85,229,136, 89,222,115,
+115,120,227,230, 27,121,158,216,189,243, 79,124,129, 74, 41,169,202, 84,122,134,157, 2, 74,171,217, 50, 35,124, 67,179,216,145,
+ 45, 34, 37,172,146, 15,123,156,228, 65,204, 89, 38, 25,129, 56,100,155, 19,155,152, 76, 57, 50,101, 11, 92, 81,178,112,114, 49,
+202, 37,110,172,157,197, 45,145, 28, 5, 10,243,222, 83,148,136,127,156,151,239,161,118,238,137,135, 79, 41, 0, 41, 86,185,140,
+ 15, 20, 72,166,208,247, 18, 90, 48, 78,129, 48,206,125,184, 37, 51,133,132,168,215, 3, 83,148,224,140,161,239,169, 23, 11,185,
+156, 42,129,104,198, 49,160,181,194, 59,177,187, 25,109,225,114, 35, 82, 82, 49,232,156, 52,189,153,121, 11, 48,136,143,119, 89,
+182, 76,219, 11, 62,251,249,207,176,187,191, 43, 97, 50, 97,228,229, 87, 94,224,171,255,202, 31,230,252,244,140,213,106,133,171,
+106,180, 41,248,202,210,119,115, 79,123, 85,129,115,132, 49,145,179,162,170, 37,107,122,209, 46,161,204,214,194,156,240,174,102,
+231,202, 33,203, 69,139, 61,255,132,159,248,252,211,248,202,241,240,116,203,160, 12, 59, 41,114,231,160,229,189,147,129, 71,219,
+136, 93, 56, 94,125,241, 58,167,155,200,151,126,236, 57,222,124,231, 19,126,235,221, 19,126,243, 91,159,240,253,187,231,108, 98,
+225,131, 73, 20,160,139,157, 37, 41,202,229,167, 84,193, 42,197,152, 35, 74, 43, 42,231,229, 50,113,226,243,188,108,109, 27, 99,
+196, 21, 73,222, 83, 70,202, 11,188,213,196,190,103,245,232, 1, 97, 18, 33,224,157,167,238,240, 66,119,252,255, 49,245, 38, 65,
+150,101,247,121,223,239, 12,119,124, 83,206, 83,205,213, 85,213,232, 9,221,232, 6, 26, 68, 3, 4, 65, 16, 2, 5, 18,148,194,
+146, 77,209, 33,135,229,240, 20,146, 67, 22,195,246,206, 11, 7, 54,142,240,214, 27,109,188,241,194, 86,200,178, 77,219, 52, 45,
+135, 69, 91,164, 8,142,104,140,221,232,121,170, 57, 43,231,151,239,189,251,238,120,206,241,226,127,179,160, 70, 32,186, 17,168,
+206,202,124,117,239, 57,255,225,251,126, 31, 43, 47, 92,103,230, 39,156,220, 59,101,103, 99,139,168, 46,249,236,188,230,209,209,
+ 49,105, 54,225,157,247, 63, 5, 87, 83, 21, 75,162, 84, 82,255,102,231, 11,140,119,140, 55, 87, 25, 12,215,232,218,138,131,131,
+ 35,210, 65, 74,108,228, 32, 49, 64,164, 13,109,111,185, 90, 27,143,136,179,156,233,233, 28,229,101, 42,213,182,178,163, 62, 57,
+ 17, 32,199,223,124,121,139,131,211,138, 75,155, 9,222,196,172,236,172,240,204,222, 26,135,211,146,237, 73,206,234, 40, 99,144,
+192,225,147,130,163,179,130,214,138, 40,107,111,109,133, 70,195,217,162,226,241,172,161, 44,165, 24,148, 78,221, 18,140, 2, 39,
+ 9,113, 73, 38, 49,137,207,220,186, 74,177, 44,250, 98,185, 65, 91,205,217,233, 9, 93, 72, 56, 62, 58, 3,175,136, 76,130,111,
+127, 17,150, 2, 32,153,206, 1,130,140,250,146, 68, 96, 36,242,162,203,179,237,131, 8,167,154,174,235,119,238, 34,168,147,174,
+ 71,172, 62,242,247,154,249, 98, 65, 81, 44, 69,104,216,143, 30,163, 52, 37,201,114,218,186,195, 68,150,174,174,201, 7,131,254,
+243,146,241,101,221,246, 62,220, 68,216,211,105, 28, 97,180,208, 40, 47,126,127, 17,188,201,129,164, 16,223,177, 96, 59, 37,105,
+ 80,194,138,106, 4, 6,212,144,231, 57,117, 93,147, 36,169,224, 67, 59, 79, 54,200, 81, 64, 91,213, 96,196,211, 27, 66, 0, 5,
+174,237, 88,214,203, 94,196,234,122, 43,156, 20,111, 89,150, 82, 87, 13, 73,150,128,151, 41, 69, 20,197, 68, 70,227,130,176,182,
+117,255,185,169,128,136,158,156, 8, 49, 37,184,163,194, 90, 88, 93,217, 70, 41,241,152,163,197,130,151,166, 17,129,142,141,205,
+109,210,124, 64,150, 38, 76, 70, 3, 38, 43,235,180,222,177,152,139, 43, 0,101,208, 70,129,130,209, 32, 71, 5, 77,217, 84,116,
+173,116,126, 77,211,209,120,135,198,200, 88,188, 3, 27,193,198,218, 58,222, 7,202,106,137, 81, 6,107, 64, 91, 75,221, 54,100,
+113,254, 84, 11,164,145,113,240,178, 89, 82, 87, 53,190,147,196, 59, 71, 36,107, 80, 20, 4, 97, 91,232, 40,198, 32,216, 93, 31,
+ 68,135, 96, 99,177,128, 5, 45,225, 42, 77, 7,179,233, 49,205,114, 38, 69,162, 71, 52, 11, 86, 19, 16, 52, 56,202, 96, 34,129,
+ 28,137, 32, 83,177,182,190, 75, 80,142,162,152,202,222, 60,207,159, 78,135, 22,139, 57,218, 26, 66,240, 44,151, 75,186, 78,214,
+ 44,113, 28,209,182,194, 89,215, 74, 38, 24,109, 35, 17,217, 89, 38, 25, 3,210,141, 27,186, 78,138,136, 36, 77,104,218, 6,231,
+ 58,241,169, 39, 6,213, 23, 59,109,211, 17,144, 98, 77, 68,179, 2,104,210,218, 18,160,223,167, 55,212,109, 43, 29,183,162,215,
+216,136,123,196,154, 62, 2,182,243, 8,244, 76,238, 57,133,162,108,132, 79, 66,144, 79, 85,166, 50, 30, 77, 32,120,240, 29,178,
+114, 12, 30,215,201, 90, 76,222, 73, 73,113,211, 70,222, 5,107, 45, 86, 9,215,196, 41, 48, 90, 38, 14,109,211,208,182, 53, 1,
+232,154, 6,101,100,221,224,250,247, 72,107, 69,218,139,145,149,209,184,182,195, 59, 89, 1,180,109, 43,133, 89, 8,132, 0,102,
+125,107,251,123,114, 89,246, 68, 52,163,233,154, 94,112, 96, 52,224,169,170,138, 36, 75,196,151,158, 10,136,197, 70, 34,106,144,
+113, 12, 44, 22,146, 53,174,148,146, 29,116,156, 50,204, 82,242,193,128, 44, 19,105,254, 69,206,186, 40, 25, 35,193, 55,142,134,
+146,162, 99, 68,201, 26, 69,130,138, 85,214,146, 38,177, 84,226, 74,113, 17, 82,161,141,116,249, 4, 25, 47,150, 85,133,239,250,
+ 92,103, 31, 48,177, 17, 15,180, 85,184,224,201, 51,233,228,101,255,102,136,250,253,190,233, 21,194,105,146, 97, 35, 75,215,186,
+167,221, 79,154,138,255,118,177, 40,136,210, 4,215,182, 52,173, 40, 53,155, 86,252,140, 77,213, 80, 86, 37,193, 5, 58,239, 41,
+171, 26,171,148,116,219,109,131, 14, 29,105, 59,229,252,232,144,149,141, 45, 22,231, 5,243,186,100,107,107,141, 89,227, 57, 91,
+ 46,185,113,253, 50,247, 62,248,132, 44,203,168,218,138,233, 89,137, 38, 98,122, 94,224,156, 99,144, 79, 88, 25,175,178, 50, 26,
+ 17, 69, 26,107, 21,229,124, 65,177, 40,200, 83, 65, 46,198,253,132, 64,105,176, 73, 70, 58, 59,224,255,122,243, 35,174,174, 79,
+168, 59, 79,156,197, 68,218,178,112, 45,137, 81,188,244,242, 85,142, 26,133,118,158, 60,143,104,150, 29,239,124,180, 79,177,104,
+201, 34, 79,237, 53, 47, 95,155,240,193, 76,114,223, 37, 93, 47,162, 94,150,152,126,135, 41, 35,240,154, 40,146,252,110,165, 53,
+ 93,213,226, 93, 75, 32,192,133, 86,161,170,112,109, 67,121, 62,165, 56, 63, 35,183,134, 81,170,249,237,127,235,219,252,251,127,
+247,239, 17,187, 22,167, 2, 87, 94,255, 22,227,201,170, 88, 84,226,192, 34,192,225,233, 28,167,107, 54,247, 54,185,255,240, 0,
+231, 90, 58,192,234,128,247, 10,107, 13, 54,177, 88, 35,144,155,211,163, 19,108, 34, 96,155,131,179, 25,101, 81, 64, 8,104, 99,
+232,186, 6, 27,203, 40,205,198, 49,211,249,185, 88,168,186,142, 65, 44, 46, 14,109, 44,113, 26,241,245, 27, 67, 8,129,120,101,
+133,221,221, 9,103,247,142,185,127,239,152, 60,177, 52, 77,135, 81,138,123,167, 37,147, 65,202,230,192,114,239,176, 96,119, 53,
+ 39,142, 21,179,121,195,189,253, 41, 54,142, 57,152,215,116, 78, 70, 48, 1, 37,123,239, 78,144,203, 26,249,190,126,235, 55,126,
+ 21,107, 52,123,151,214,217, 88,223,100,122, 54,227,116, 58,227,195,119,223,103,103,103,139, 44,233,195,124, 26, 81,215,130, 28,
+ 2,206,139,162, 92,105, 45,239,104, 95, 24,119,253,243,235,156,192, 75,234,186,162,115,190,239,174,228,152, 58, 62, 59,227,244,
+124,202,225,225, 17, 7,199,199,204, 22, 75,102,243, 5, 62,128, 54,162,224,237, 58,143, 81,208, 6,112,157,160,141,179,254,178,
+ 29,142, 71,196, 54,166,109,107, 98,155,144, 13, 18,240, 10, 15, 50, 14,212,154,200,136,221,208, 33, 1, 22, 90,235,167, 10,122,
+173, 37, 52,230,194,146, 19, 39, 9,113,175, 78, 14, 94, 44, 75,206,203,191,147,231, 3, 41,204, 3,232, 72,242, 32,234,178, 34,
+ 4, 47, 42,248,186, 21,245,115,211,225,232, 63,131,182,195,133,174, 63,216,133,223,237, 58, 79,156, 70, 44,151,101,175, 17,145,
+ 95,107,180, 17,116,171, 22,226,164, 64,176,236,211,198,161,107, 59,170,122, 73,221, 76,201,243,140,213,245, 13, 86, 70, 67, 38,
+ 43, 35,202,229, 57,218, 52,212,205, 41,174, 91,146,103, 6,173, 65,105,197,112, 48, 65, 41, 67,221, 84, 40,101,250,159,169,101,
+109,117, 12, 74, 49, 28, 14, 81,193,163,173,194,183, 8, 19,196,136,232,214, 88,141,213, 17, 54,146, 4, 63, 57, 23,107,148,145,
+134,101,101, 50, 65, 27, 43,170,247,190, 91, 84, 65, 99, 35, 69,240,142, 14,141,210, 22,156,236,215,181, 54, 36,189,182,168,235,
+ 2,145, 53,216, 40, 33, 77, 35, 98, 27,225,149, 97, 94,148, 52,203,146,197,217, 49,117, 49, 21,241,160,141,250,231,214, 97, 12,
+ 12,178, 1,249, 80, 44,190, 42,136, 78, 67, 41, 69, 83,215, 84,149, 68,110,175,174,237, 97, 35,205,124,113,134, 81, 18,150,226,
+ 58,177, 2,214,117,139,181,162,191,176, 70, 4,172, 70,235,167,211,147,166,174,169,171,234,169, 88,178,170, 91,162, 72,236,137,
+214, 24,226, 88,244, 82, 74, 75,116, 51, 90,226,184, 67, 80, 2, 23, 82, 26,165, 33,137,229,126,177, 86,130,181,226,254, 18, 84,
+ 33,144,229, 25, 38,138,208, 65,145, 36,114, 39,217,200,210,186, 14,173, 68,124, 40, 94,116,176, 70, 38,183,218, 72,182,130,172,
+130, 65,196,168, 94,158,183,224, 9, 94,247, 13,165, 20,210, 65, 1, 1,180, 50,125,225,106,209, 26,172,141,233,235, 13,130, 7,
+ 99,165,217, 13, 74, 65, 16,108,108,108, 35, 2,112,225, 18,107, 91, 89, 97, 4,144,198, 24,240,254,226,123,144,201, 99, 8,160,
+181,124,214,210,116, 58,204,230,222,165,239, 41,173,251, 67, 58, 98, 89, 22, 40, 45,208,153, 36,142, 89, 46,151, 76,198,163,167,
+106,107, 5,132, 0,243, 69,239, 97,108,107,218, 86,194, 90,180,214, 36,249,128,209,112, 40,163,252, 88,208,117,222,123,148,214,
+212,181,164, 99,217, 40,194, 7,193,135,198,113,132,210, 50,110, 81, 70, 19,245, 23, 60, 65, 42,144,162, 40, 88,150, 37, 85,245,
+175,197,142,106,129,111,160,197,247,170,180, 36, 75,105,109,201,178,148,160,164,122, 53, 74, 30,128,178, 92,202,168,176,255, 62,
+ 4,156, 33,213,190, 82, 74,198, 47, 73,207,255,206, 82,180,150, 4,171,139,104, 74,155,197, 61,112, 70,224, 59, 77, 45,193, 48,
+ 73, 42,145,122, 23, 74,127,173,192,135, 64, 98, 97,107,108, 24,102, 67, 70, 99,195,147, 71,135,216, 60, 39,203,135,252,240, 39,
+159,178,185,190,131, 53,154,127,241, 7,127,204,221,199,231, 60,220, 63, 37,132,136,151, 94,122,153, 36, 77, 24, 12,115, 46,108,
+ 20, 46,116,204,166,231,184,186,161,152, 47,201,243, 68, 58,144,197,146,241,202, 42, 73,158,211, 17, 24,143,115,102,197,130,217,
+209, 17,255,221, 63,250, 6,101,211, 50, 47, 90,158, 28, 23, 12, 86, 18, 78, 91,197,179,159,187,196,214,192,210, 46, 11, 78, 78,
+150, 28, 30,206,136,146, 8,181, 44, 73, 85,195,239,254,141, 23, 24,174,142,184,182,150,243, 47, 62, 60, 37,142, 45, 70,105,210,
+ 76,246,146,202,121, 90, 2,137,149,202,183,127,206, 9,222,227,219,150, 40,137, 9, 90, 17, 17,225,131,195,230, 18,142,240,236,
+ 70,198, 87, 95,186,202,206,234,132,201,100,133, 47,127,237, 87,249,201,219, 63,103,122,239, 99,242, 43, 55, 81, 73, 66, 28, 37,
+ 44,202,130,193, 40,102, 56, 76,121,251,237,159,113,190, 40,120,252,240,136,101, 53, 71,148,248, 17,203,162, 69, 25, 72, 7, 57,
+109,231,112,109,135,107, 36,233,200,198,226,206, 80, 14,156, 2,109, 59,234,214,179, 44, 43,180, 49,140, 39, 35,218, 74, 24,202,
+ 10, 72, 18, 75, 89, 55,120, 58, 54, 54,183,208, 74,243, 91, 47,174, 48,157, 85, 96, 12,235,169, 38, 89, 31, 17,180,102, 81,181,
+228,145,230,232,193, 25,105, 30,115,124, 94, 49,200, 35,102, 11,199,102,110,105,188,102,119,103,133,195,147, 25,251,139,146,243,
+ 69,139,150,251, 22,148,198, 1, 81,108,137,148, 2, 21,240,173,231,235, 95,252, 2, 33, 40, 92,211, 49,159,205, 49,157, 23,229,
+255,206, 30,235,235,171, 12,134, 99,172,141,168,139,165, 28,238, 61,212,199, 5,121,169, 67, 8,210, 97, 42, 89, 47,249, 32,107,
+179, 16, 46, 14, 33,245,244,255,171,154, 22, 13, 60,120,248,136,101, 33, 9, 92,129, 30, 53, 27,228,125, 41,138, 37,222, 7,214,
+ 86, 87,136,140, 70,197, 25, 73,150,210,117, 29, 23,162, 87,173, 20, 24, 77, 85,247,160, 11, 35,151, 87,148,244,201, 84,173,100,
+ 75, 59, 47,155, 79, 27,201,103, 45, 34, 59, 89,163, 41, 37,170,125,109, 52, 42,120,186, 86, 58,186,170, 22, 61, 76, 54,200,165,
+145,232,223, 83,231,100,247, 24, 41, 17,196, 41, 37,225, 64,117,221, 48, 24, 12,145,192, 15,104,155,150,225,112, 72, 20, 75,220,
+110, 85, 85,196,113, 76,135,167,170, 43,185,224, 34, 25,255, 11,157, 50, 32,209,198, 98,175,147,110,205,226,157,199, 70, 34,190,
+189, 80,216,151,203, 25,193, 21,248, 80,211,117, 11,186,182,162,243, 50,218, 37, 56,180, 85,132,208, 80, 86,103, 4, 21,200,243,
+ 21, 38, 43, 43, 98, 15, 14,129, 72, 9, 65,113, 52, 30, 96,180,102, 52, 90,225,210,222, 14,147,149, 21,156,215,212, 85,129,214,
+210, 9, 2,228,121,196,100, 60, 98, 60, 26, 18, 39, 9,121, 98,201,211,148,201,100,157,241,120,181,159,136, 10,117,206, 88, 67,
+154,198, 24,101, 25,230, 67,246, 46,237,161,144,168,232, 97,150, 97,140, 38, 77, 34,172, 86,216,216,146, 70, 49, 77, 83, 81, 87,
+ 75, 22,103,231,116,109,137,247,237, 83, 14,133, 88,255,250,231,180,147,142, 51, 27,164,228,105,206,120, 60, 38,138, 37, 8,233,
+130, 56,216,182, 13, 85,219, 81,215, 37,235,235, 59,189,134,166, 4,239,101, 79,236,229,179,174, 26,241,121,183, 77, 39, 66,103,
+ 68, 92,109,181, 37,120, 17,150, 53,173, 16, 29, 67, 63,233,109,234, 6,109,196,198,216,180,109,223,209,182,196, 70,114,206,219,
+174,165,109,106,170,170, 34,244,235, 35,163, 21,160, 9,174,195, 1,174,117,232,224,233, 60,136,125,205,163,149,228,106,152,190,
+184, 72,227,244,105,129,220,185, 11,253, 74,143, 41, 15,200, 59, 66,192,117,226, 67,239, 90, 65, 77, 7, 60,244,197,176,136,214,
+ 36,152, 70,105,113, 7,249,224,161,127, 87, 59,231, 8,136, 53,184,245,194, 38, 33,200, 4,212,185,126, 61,164,181,168,250,147,
+152, 40, 73, 80,200,215, 14,158,126,194,165, 80, 94,145, 38,130,144,150,226, 36, 35,141, 4,159,222,180,173, 16,229, 8, 34,104,
+ 51, 74,227,157, 99,178, 50, 33,142,172, 84, 9, 94, 72, 80,129, 64,185, 44,105,234, 37,101, 89,209, 58,193, 67,102, 89,250,180,
+234, 73, 51,177,117, 89, 43, 18,255,182,105,105,157, 99,185, 44,169,170, 26,215,255, 64, 89, 34,120, 86,107, 69,252,226, 59,129,
+145, 4, 2,177,181,180,222, 61, 77, 76, 19,148,160, 40,190,155,126,180,223,180, 98, 97,176, 81, 68,181, 20,175,124, 62, 28,160,
+140, 34,138,108,239, 65,116,164,121, 38,202,199,182,198,107,200,210,193,211,159, 69, 48,172,138, 40,145,156,220,170,174,200,146,
+132, 98,177,120, 42,196, 83, 72, 66, 91,214,119, 25, 18, 30, 16, 97,181,230, 34,196,190,170, 42,130, 82,100,105,130, 82,200,101,
+ 60,123,204,238,213,203, 60,249,240,109,214, 38, 57, 54,139, 56, 62, 47,113, 93, 96,119,117,194,221,143, 62, 65,197, 9, 47,124,
+254, 37, 94,255,210,171,252,131,127,240,239,241,159,254,195,127,200, 55,191,241, 75,252,159,191,247, 63,241,226,222,136,111,255,
+218, 95, 99,111,111,151,122, 81, 65, 44,158,251,208,212,164, 89,130,177,154, 56,177, 12,135, 57,139,226,156,227,131, 35, 62,250,
+240, 83,233,190, 42,207,119,238, 76,120,245,206, 85, 94,127,229, 26,179,121,193,209,121,195,202, 40,227,180,168, 72,108, 68, 82,
+213,220, 76, 3,239, 62, 89,112,184,104,121,233,133, 75, 92,218,154,240, 95,255,179,159,225, 48,172,143, 19,238,158, 44,153,151,
+162, 14, 55,214,160,189,198,171,142,182,115, 98, 55,210,134,224,156,116,238,120,178, 36, 34, 40,241,242, 59,239, 88,223,222,230,
+141, 47,126,129, 27,147, 17,207,239, 14,113, 54,227,248,224,156,175,252,218, 55,184,127,120,198,221,183,223, 99,237,242, 13, 46,
+223,185, 67, 85, 58, 54,183, 55,216, 63, 56,228, 15,127,239,255,224,157,143, 63, 36,201, 44, 85,221,225, 48, 24,175, 88,150,142,
+209,234, 4, 29, 69,212,174, 35, 77, 82,134,195, 17,101, 19,152, 47, 43,188, 11, 44,150, 37, 73,154,225, 20,212, 69, 67, 89,203,
+ 11,163, 34, 73,101,170,138, 5, 73,150,145,229, 3,206,166,103,104, 52,137,141,152, 21, 21,217, 32,101, 49,157,114,123, 59,229,
+ 87, 94,188,204,163,211, 18, 90,207,218,234,144,120,144,112,242,248,140,198,117, 44,203,150, 98, 86,114,214, 8,123,122,117, 24,
+ 51,202, 99, 58, 5,233,100,192,201,253, 99,238,159,148,156,150, 93,159,189,167, 80,202,224,189, 28, 12,198, 40,178, 56, 35, 79,
+ 35,118,198, 17,227,200,176,190,182,198,104, 56,226,193,195,123,232, 56,230,240,240, 9,237,178,164,243,134,217,124,129,114,191,
+224, 38,128, 8, 72, 85, 8, 4,164, 27,245,157, 19, 14,130,115,148, 85, 67, 80,178,202,146, 7,146,190, 24,237, 40,235,150,179,
+217, 57, 98, 51, 18,110,180,214, 50, 82, 85, 74,163,131,167,170, 26,150,203,130,243,197, 66, 14, 50,215,145,196, 9,117,211,200,
+106,174,173,251, 98, 57,193,185,150,160, 36, 80,167,174,170, 94,100, 27, 75,222,130,150,160, 39,201,130,246, 56, 39, 23, 80, 18,
+ 37, 2,122,106, 58, 81, 56, 43, 73, 33, 52,198, 66,240, 4,175,250, 29, 97,194,124, 62,151,213,132, 11, 36, 3,113,217, 44,138,
+ 5,117,211,112, 1, 28, 49,218,244,204,135,166,255,185, 58,140,149,176,160,225, 96,128, 3,178, 84, 0, 31, 46,116, 79,139, 34,
+217, 9,203,244,206, 94,172, 8, 0,173, 20,101, 83,139, 51,192, 57, 46, 82, 19,147, 36,161, 42, 75,218, 86,138,194, 56, 21,202,
+153, 53, 98,239,108,154,166, 23,120,117,100,137, 37,132,130,186, 94, 82,213, 37,171,147, 9, 93, 55,103, 56,146,119,165,170, 5,
+103,171, 77,204,241,225, 1, 59,151,175, 17,188, 76, 84, 92,159,167, 93,148, 11,154,178, 98,177,152, 50, 28, 78,200, 7, 35,124,
+ 48,184,224, 89, 93, 29, 11,119, 61, 79, 25,228, 25, 86, 55,172,173, 76, 64, 71, 88, 3,163,225,144, 64,203,100, 48, 96,190,156,
+ 81, 87, 21,231,231,115,166,167, 39,194,189, 40, 23, 44,230, 37, 93,219,161,173,150, 78, 22, 77, 8,210,237,203,165,167,228, 44,
+ 11,158,206, 75,134,120, 85, 11,249,113,152,203,218,117, 58,155, 19, 90,207,133,181,217,251, 64, 93,214,108,237, 92,193,104,197,
+124,126, 70,154,103,104, 52, 77,235,122, 65,101,159, 77,222,182,196, 54, 65,107,225,245, 71,241, 47, 92, 82,229,178,194,185, 14,
+208, 79,191, 23, 16,149,122,146,245,185,234,189,240,217,119, 29, 74, 5,134,195, 49, 58,182, 61,173, 46,160, 85,144, 34,197,137,
+181, 76, 71,146,164,168,228,138,148, 14, 55, 4,148,150,247,178,237, 58, 92,224,169, 29, 27, 47,100, 69,173, 13, 81, 44, 48,157,
+ 72, 91, 80,253,148, 76,133,167,151, 50, 2,124, 68, 91,225,121, 92,112, 33,228,194,150,175, 79, 80,125,161, 21,203, 59,220,137,
+ 40, 80, 71, 6,163,101,199,143,247, 79,139, 26, 21,130, 88,190,251, 73,169,141,197,213,101,173,208,246, 2,226, 96,112,222, 99,
+148,162,108, 58,140,146,189,189, 25,172,174,126, 79,198,118,226,227,142,173, 37, 73,133, 77, 92, 46,151,228,195,156,197,108, 78,
+ 85, 85,180,174, 21,177, 15, 64, 16,161, 74,240, 80,214,130,128,117,222,209,186, 86,130, 89,186, 78, 46, 95,223, 17, 89, 25, 17,
+ 27,163,241, 78, 14,218,166, 23,222,200,174, 79,198, 33, 77, 35,118,145,184,191,240, 35, 35, 30,189,164, 23, 81, 68, 81,244,116,
+ 90,112,161,214, 95, 86, 21,160,168, 27,177,147, 57,215,145,165, 9,117,221, 16,240, 20, 69, 65,211,200,161, 24,153,136, 69, 89,
+210,182, 18,223, 87, 53, 53,174,199, 77,118,157, 39,142, 99, 34, 99, 88,204,231,208, 63, 76,113,146, 80, 46, 11,108, 28, 81, 45,
+ 27,156, 2,180,161, 92, 10,249, 8, 64,161, 73,210,132,106,185,100,195, 44, 24, 12, 86,120,249,185, 91,252,191,255,223, 91,108,
+237, 93, 98, 86, 26, 46, 93,185,202,100,117,147, 79, 62,248,144, 47,125,229,117,158,187,113,137, 87,158,191,205, 11, 47, 61,203,
+217,201, 19,158,124,248, 54,255,248,191,253,199,156, 62,126,200,139,183,183,201, 98,195,147, 79, 63, 98,165,171,169,155,146, 78,
+ 43,140, 82,220,125,188,207,225,254, 49, 71,211, 51,246, 31,159,112,114, 60, 69, 69, 17,107, 27,235,236, 93,190,194,112,180,134,
+159, 31,241,183,191,243,121,202,162,230,234,206,132,227,186,229,189,253, 57,167,251, 51, 74,215,145, 26,233,162,242, 60,230,133,
+231,175,112, 84, 53,104,107,120,237,153, 45,254,247, 63,255,128, 66, 25,190,120,103,135, 63,125,231, 49, 27,155, 19,217,223,160,
+176,253,218,163,170,106, 6,121, 38, 15,186,181,156,159, 23, 68,177, 68, 53, 62,123,125,139,111,190,241, 26,215,118,246, 40,102,
+ 5,143, 31,124, 70,131,230,201,147, 83,190,250,237, 95,102,188,181,199,244,241, 41,175,126,233, 75,172, 93,189,142, 66,224, 12,
+ 77, 83,240,224,179, 79,121,251,253, 15,185,122,105,194,199,247, 78, 65,197, 12,211,132,208,235, 34,226, 56, 33,205, 6,156,158,
+ 45,152,140,198, 52,117,197,104, 56,100, 56,204,177, 70, 51,200, 19,226, 52, 19,241,162,213,108,238,174, 51, 28,142,161, 3, 21,
+ 41, 58, 31,152, 78,207,104,170, 37,171,147, 85,134,163, 1, 27, 27, 27,156,158, 76,137,146,152,196, 87,252,238,119,158,231,206,
+213, 85,126,250,201, 33, 31, 60,156, 81,148, 45,179,121,197,229,157, 49,103,179,138,213,173, 21,138,147, 57,227,201, 0,173, 20,
+179,170,102,103,107,140, 77, 99,158,191,190,193,159,255,236, 62,159,158, 20,180, 46,224, 84,127, 81,224, 9,166, 31,149,123,153,
+ 64, 93,219, 91,103,148, 41,158, 28,159,243,228,224, 49,199, 79, 30,178,183,181,197,149,221, 77,182, 86, 86,121,244,228,132,170,
+147,139,105,111,115,157,233,249, 2, 99, 52, 77,215,209, 52,141, 92,222, 65,246,140, 33,132,190,107,145,139, 92,246,205, 10,124,
+223, 93, 4, 65, 46,215, 85,197,108,190, 32,142, 18,148,238, 87, 24, 86, 32, 28, 90, 43, 60,130,228,108,187,142,166,107,169,138,
+ 57,231,103,103, 76, 79, 78,152, 77,207,105,155, 26, 21, 2,101, 93,147,231, 41,117, 45,209,143,105,154, 18, 37,137,116,204, 74,
+172,114, 1,208, 65,225,251,195,222,216,168,199, 49, 87,212,117,135, 82, 26,250,110,166,110, 26, 57,224,180, 34,201, 82,138,229,
+ 82,120,232, 54, 6, 37,157,138, 54, 17,117, 37,147,132,193,104,132, 10, 34, 96,106,125,139,210, 86, 70,248,136,160,212, 5,143,
+198,147,102, 25, 16,232,234, 14,165,165, 83,146,119, 85,108,173, 77, 43,239,175,137,101,212,125,129,187,110,234, 26,250,145,166,
+119, 78,206,150,126,149, 23,197, 61, 69,175,110,136, 34, 5, 70,126,230,160,132, 82,233,156,116,139,222, 95, 64, 90, 22, 44,151,
+103, 64, 71, 20, 69,120,223, 34, 59,110, 71,215, 46,137,162,192,114,113,204, 96, 56, 98,178,178,202,198,218, 6,217, 32, 33,182,
+ 49, 77,187, 4, 29,136, 98,203,233,249, 9,109, 43, 44,139,217,226,140,114, 57,103, 81, 44, 88, 20, 51,208,158, 54,120,180,238,
+184,126,253, 22, 79, 14,159,176, 44, 10, 76, 20,115,114,116, 74, 81,212,116,109,131,234,207,207, 36,146,105,166, 50, 6,193,210,
+ 6,130, 19,240,215,250,234, 42, 43,147,137,188,147, 85,137, 86, 10,101,100, 20,223,214, 53,117, 43, 98,231,193,112,136,119, 34,
+ 40,243, 33, 16, 16, 1,109,221, 53, 84,197,130, 52, 29,179,186,182, 3,202, 81,150, 5,170, 23,136,213,189,219, 32, 77, 83,148,
+ 82, 84,203, 5,157,247,180,174, 69, 41, 71,189,108, 81, 70, 38, 22,198, 42, 6,195, 1, 93, 85,227,188, 39,142, 5, 21,171,251,
+ 21, 84, 26, 11,138, 56,138, 37, 60,133, 16,122,203,155,135,208,139, 42, 91, 33,239, 5,231,209,200, 36, 85, 44,202,125,176,138,
+138,176, 90,196,152, 4, 79,211,136, 75, 35, 31,228, 36, 73, 66,232,159,153, 40, 53,104,228,114, 6,225, 60,104, 45,118, 55,240,
+ 82, 16,225,241,157,132,193, 0,178,162,232,223,123,109, 52, 40,112,174,215,150,105,133, 87,208, 53,237,211,130, 61,168,128,239,
+196,138,136, 17,155,184, 82, 2, 63,146, 36, 83,135,214,146,191,226,131,196,177, 38,113, 76,219,120,172,209, 4, 47,154, 53,179,
+186,185,249, 61, 2, 76, 70, 57,121, 30,145, 36, 18,145,186, 40, 10, 34,219, 71,189,105,141,235, 58,134, 3, 1,174, 68,253, 37,
+219, 54, 45,141, 19,139, 88, 64, 20,226,214, 70, 79,213,225, 18, 74, 0,202,106,162, 52,150,253,102,232, 80,198,162,141,140,112,
+149,214,168, 40,166, 40,151, 64,192,198, 49,101, 41,191,119, 20, 89,108, 95,117,187,254,191, 93, 43,106,211, 40,137,193,183,132,
+122, 78,221, 74, 38,116,113, 62,165, 46, 75,206,206, 78, 89,206, 11, 34, 3,109,117, 46,138, 85,165, 9,125,214,177, 15,142,174,
+169,101,244,130, 88,124, 20, 98, 35, 48,214, 8, 74,176,169,169, 90,137, 3,149,232,190, 64, 28, 25, 34,163,209, 74, 99, 98,219,
+ 19,191, 28,195,225, 16, 23, 60, 67,189,164,169, 29, 47,127,237,117,222,253,225, 15, 41,170,115,110, 61,119,155,221,205, 21, 60,
+154, 87,190,240, 69,154,166,229, 59,191,254, 77, 30, 60, 62,224,222,135, 31,112,101,119,147,247,255,248, 15,217, 75, 3,223,255,
+201,135,124,249,229,231, 73, 71, 67,154, 38,166, 73, 86, 89, 26,203,201,209, 9,155,107, 99, 9, 51, 25, 79, 72, 71, 67,174, 93,
+187,202,205,155,215,153,172, 14,184,114,249, 18,235,171, 99, 86, 87, 87, 24,140, 70,188,255,224,148,239, 62, 19,179, 58, 30, 50,
+211,154,103,175,108,242,242,157, 29, 62, 58, 89,210, 46,107, 12,220,182, 41, 0, 0, 32, 0, 73, 68, 65, 84,178,214,115, 80,180,
+ 48,200,217,203, 21, 87,119,215, 25,175, 12,169,170,134,255,245,207, 31,242,232,112,201,239,254,246, 23,248,253,191,252,140, 72,
+137, 50,212,196,150,174,113, 68,105, 66,108, 12,231,197,130, 40,178, 52,157,163,168, 91,110, 93, 90,231,155,223,120,141,103,118,
+119,228, 26, 27,142,216,189,118, 29,109, 60,203,105,195,171,111,188,140, 51, 35, 30,220, 59,229,214,157,103, 49,195,156, 75,123,
+187,104, 95, 65,181,224,173,119, 62,226,175,254,228,143, 89, 54, 45,179,233,146,203,207, 92,101,144,164, 84,213,156,170,241,100,
+163, 1,173, 51,140,135, 67, 44,226,137,206,242, 1,222,137,205, 48,205,100,244, 62,200, 19,150,101, 69, 28, 69,184, 70,246,120,
+ 77,215,177, 50, 24,178,182,182,142, 50,150, 98,185,164, 44,101, 60, 56, 91, 44, 48, 74, 81,181,158,235,171,150,255,234,119, 94,
+163, 37,224, 27,199,131, 39, 83,182, 39, 25,211,166,197, 85, 29, 15,206, 22, 92,222,158,176,119,117,131,155,151, 87, 56, 58,152,
+179, 61,136, 57,157, 86,140, 38, 25,155,147, 33,111,190,183,207,123,251, 51,210, 72, 64, 76,157, 20,242,172,165, 49, 78,105, 18,
+ 43,186,144,213,241,132, 71,251,103, 76,198, 25,203,162, 22,113, 81,170, 57, 61, 61,166, 41, 75,178,209, 16, 29,103,252,230, 55,
+191,206,175,127,237, 43,252,244,157,247,144,156,106,193, 97,138,125, 76,192, 22,162,169, 48, 98,239,106, 59, 73, 89,236, 90, 41,
+ 55,149,128, 73,188, 19, 80, 83, 81, 44,209, 70,172,127, 23,214,183,139,169, 89, 28, 11, 12,196, 70, 34,178,130, 94, 12,213, 79,
+ 99,187,182,161,169,106,138,217,148,211,195, 99,186,182, 5, 47,147, 0,107, 98, 90, 87,201, 42,204, 59,154,166,166,237, 92, 47,
+ 2, 4, 19, 5,249,122, 81,132,181,138, 54,116,228, 73, 76,116,177, 10,195, 83,183, 29,117,219, 48, 26, 14,168,202, 2, 99,148,
+192,150, 90,153, 2, 88, 19, 99,251, 51,193,249,128,228, 59, 40,140,130, 44,149,184, 98,165, 84,127,192,121,146, 56,145,177,125,
+ 44,201,141,145,150,159, 81, 43,131, 10, 82,200, 24,107, 9,161,161,237,106,154, 70, 50, 7,154,166,101,144, 75,161,104,181,238,
+ 63,155,132,170,146,136,101,133,116,248,109,227,168,170,178,159, 32,202,247,154, 38, 98,229,173,234, 90, 20,248, 61,149, 44,137,
+ 34, 58,215,176, 92, 46, 5,202, 83, 85, 68,145, 1,213,224,155, 26, 99, 91,188, 91,160,104, 88, 20,167, 24, 85,145,167, 26, 27,
+193,217,244, 16, 21, 26, 84,168, 81,186,195,106,135,214, 14,107, 29,105,140,216,166, 84, 75,240, 82,212, 93,190,116,157,143, 63,
+249, 8,107, 45,131,209, 8,241, 86, 43, 8, 30,130, 67,153, 95,172, 93,180,130,224,133,199, 46,157,101, 68, 62,200, 25,142, 70,
+212, 77, 43,103,162,145, 0, 31,165,149,248,173,107,135,177,134,149,201,132,193, 64,226, 82,181,150, 47,143, 14, 20, 11, 89,119,
+ 6,163,216, 92,191, 66, 20,107,142, 79,143,168, 42, 73,167, 84,113, 76,215,180,148,101,137, 15,224,125, 32, 78, 6, 40,167,201,
+ 6,162,129, 74,211, 4,165, 13,137,149, 20,208,193, 96, 32, 5, 69,219,144, 38, 66,233,172, 59, 79,211,137,210,125, 89, 11,223,
+189,118,221, 83,154,165,168,237,197, 46,230,157,239, 63, 7,215,107, 21,132,163, 47, 58, 45,233,166,181,149, 21,114, 63,184,193,
+251, 30,156,166, 69, 55,214, 5, 72,226, 72,114, 70,180, 17,123,154, 53, 82,212, 24, 67,112, 13,198, 42,160,159, 92, 56, 73,160,
+172,170,134,174,105,101, 63, 31,196,109,165, 21,160,100,178,108,148,172,200, 34, 43, 26,138,166,170, 9,206, 11, 60, 45,137,112,
+109, 35,107, 3,231, 80, 8, 73,209, 0, 30, 8, 78,120, 50,226,138, 17, 71,128,185,116,245,218,247, 18,109,192, 10,142,174, 88,
+204,101,183,165, 36,204,193,218,158, 64, 21,197, 40, 20,117, 93,179, 44, 75,148, 82,189,141, 76,150,245,198,200, 62,222,181,141,
+120,255, 8,146, 85, 27, 75, 8,138, 40, 6,229, 15, 48, 4,240,174,235, 69, 52, 10, 21, 4,118,144,166, 82,137,185, 86,172, 35,
+206, 59,178, 60, 39, 77, 18,118, 54,198, 92, 89,143, 81,237, 57,227,212, 49, 61,122, 72,164, 78,249,194,179,207,241,155,223,120,
+131,175,254,210,243,188,241,149,215,184,117,237, 18,207,222,190,201,157, 91,219,236,110,174,241, 43,111,188,206, 87,190,240, 60,
+ 59, 91, 19, 12, 29,153,214,172, 78, 38,220,190,113,137,157,141, 1,155, 27, 35, 82,211, 17,154, 37,147, 36,144, 42, 69, 22,199,
+204,151, 37,174,117, 92,228,124,163,117,191, 15,146, 73, 4,206,137, 62,192, 70, 40,173, 73,195,146,205,220,242,133, 47,127,145,
+233,233,140,197,221,143,216,216,217,228,236,228, 4, 48,188,242,234, 43,172,164, 17,151,183,215,121,244,224, 46,215,111,222,192,
+215,142,119,222,252, 43,124, 85,242,251, 63,254,132,247, 30,156,242,165, 87,110,114,248,240, 33, 77, 61,231,189,187,119,153,158,
+207, 56, 95, 46,216,220,217, 34,143, 53,181,107,217, 88, 29,177, 40, 22,156,157, 30, 81,204,166,204, 23,115, 78, 78, 78,101,108,
+122,122,194, 39,251,103,116,139, 5,223,249,229,231,200, 93,199,124,190,228,199, 63,189,139, 43, 43, 38,177,229, 60, 55, 92,219,
+156,208,181,142,135, 39, 37, 79, 30, 28,114,120, 60,101, 77,181,188,127,120,206,173,157, 1,191,245,245,219,252,241,207,159,112,
+ 58, 43,209,180,196,113, 66, 23,160,152, 23,162, 76, 13, 16,169,142, 33,138, 97,164, 56, 63, 47,249, 59,191,249, 29, 14, 78, 78,
+ 24,142,214, 25,175,109,210, 46,230,184,229,130,235, 55,175, 51,171, 20,155, 91, 55,249,202, 27,111,112,180, 56,161,169, 75,254,
+224,247,254, 55,126,252,195, 55,249,211, 55,127,204,178,108, 57, 58, 58,162,174, 90,130,214,148,101, 69,150,106,158, 28, 47, 40,
+ 43,197,249,188, 98,109,117,131,191,245,221, 95, 35,205, 82,214, 55, 55,121,225,206, 45,142,143,142, 57,159, 79, 9, 65, 2,126,
+130,131, 52,205, 8, 33, 96,141, 97, 56,204, 80,198, 18,148, 32, 43,173,210,172,172,172, 98,227,136,101,185,164,173, 75,170,174,
+ 99,144, 15,249,198,179,107, 84,139, 5,159,222, 59,227,222,195, 83,212, 96,128, 73, 35, 22,243, 18, 22, 53,227,224,152,157, 87,
+ 44,171,150, 60, 50,204,170, 6, 19,132,131, 62, 45, 61,123, 59, 99, 62,254,236,136, 79, 14,102,120, 45, 47,176, 67,225, 58,197,
+ 51,155, 3,206,106,217, 29, 43,163,153,228, 41,155, 43, 3, 30, 31, 77,137,140,161,108, 28,167, 39, 51,158, 28,157,114,124,178,
+192, 97,169,186,150, 59,215,175,241,165,207,191,200,229,221,109,222,122,255, 35,166,179, 25, 23,121,207,214, 70,116, 78,186, 98,
+ 64, 44, 46,253,190,216, 59,255,180,115,183, 90, 19, 20, 56, 39,170,236, 11, 30,133, 15, 1,133,140,250, 36,215, 89,192, 75, 70,
+ 27, 46, 2, 85,158,126,241, 32,163,105, 57,139, 68,141,221,148,194, 3, 40,231, 51,138,249, 28,215, 9, 12,195,251,126,199,143,
+216,171,242, 65, 66,215,202,110, 81, 5,112,125,145,237, 93, 0, 28,101, 35,246, 88, 99, 44, 81,100,104,234,154, 56,146,236,243,
+182,109,201, 7, 3,170,166,161,109,101,181,224, 26, 97, 55, 88,163, 48, 74,124,231, 77, 91, 11,200,166,215, 6, 25,101,229, 32,
+118,162, 7,104,154, 6,141, 20, 55,157,115,148,117, 69, 18,247,188,255, 70,190,239,225,112, 72, 85,213,132,254, 60, 2,177,235,
+213,149, 36,213,225, 69,137,144,101, 25, 24,232, 92,192, 70, 17, 89,154,210,180,142, 36,210,148,139,146, 52, 23, 1, 86, 89, 85,
+ 88, 45, 81,211, 4, 25,189, 86, 85, 69, 64, 78,245,182, 21,218,164,182, 17,139, 98, 33, 16,146,166, 98, 89,136,232,184,235, 36,
+138, 51,138, 44,197,114, 65,231,164, 99,203,178, 84,120, 31,181,192, 87,186,166,161,174, 27, 97, 25,116, 53,217, 96,200,181, 43,
+215,136,211,132,241,104,192,120, 52,194,104, 81,246, 71, 54,162,117,242,135, 26,130,251,197,136, 88,105, 84,191,147, 61, 95, 44,
+229,242, 51,146,233,173,180,150, 75,221,104,240,224,113,180,117, 67,148,196, 68,113,202,202,202,132,241,202, 10, 70, 25,177, 20,
+187, 86, 70,195, 93, 71, 93, 87,140,198,107,128, 99, 81, 76, 73,210, 12,171, 46,196,171,153, 20, 30,131, 1,214, 24,188,212, 21,
+212,149, 32,197,147, 68,148,238,131, 44, 39, 50, 18, 90,226,156,132, 80, 21, 85, 45,130, 62, 45, 43, 23, 89,225, 40, 52, 50,125,
+210, 90, 70,247,109, 43,211, 22,173, 52,113, 36,197,175,234,255,163,141,192,205, 46, 66,194,180, 66,132,216, 70,139, 43,161, 19,
+207,186,232,165,100, 69, 21,188, 88,169, 93,219,208, 5,193, 94,107, 45, 98,185, 72,235,167, 34, 79, 41,190,101,106,230,125, 32,
+205,250,156,248,254, 47, 31,124,191,186,104,159, 90, 38,101,114, 36,107,161,214, 11, 34, 88, 7, 5, 42,244,197, 57, 40, 21, 16,
+ 5,126,175,169,233,133,149,145,213,180,157,136,156,204,229,235,215,191,103, 19,201,242, 22, 59,150,160, 8,179,129,248, 3,171,
+186,193, 26,241,140, 86,125,200,194,197, 14, 66,178,207,101,249, 79, 8,196,218, 18,180,116,178,203,101,249,244, 7, 51, 70, 58,
+ 1,140,236, 23, 35, 35, 30, 70, 27, 75,199, 78, 8, 16,160,243, 29,190,115,172, 76,198,228,131, 20,154,146,149,129, 35, 90, 76,
+153, 31, 62,228,227,119, 63,193,119, 21,239,126,114,204,241, 89,195,215,126,249,235,108,239,236, 17, 15, 19, 38,171,107, 16,106,
+118,119,198, 76, 70, 99,238, 60,123,147,189, 75, 59,124,242,222,187, 60, 57, 61,230,246, 11, 47,242,220,243,207,113,235,230, 21,
+190,253,205,175,178, 49, 30,242,237,191,246,117,252,114,198,134,246,252,225, 31,253, 8,186,130,117, 83,146,151,167, 76,212,130,
+216,213, 24,229,233, 90, 71,240, 29, 69, 85,179, 44,150, 84,117, 77,217,139,247,234,186, 38,138, 12,227,200,177,181,125, 73, 82,
+215,134, 3,190,255,175,254,138,224, 91,214, 7, 35, 94,251,242,171,124,240,163, 31,113,188,255,128,163,227, 39,196, 70, 83, 21,
+ 37,127,246,253,239,163,109,224,199,239, 61,226,221,199, 83, 70, 58,112,247,209, 35,222,252,100,202, 59,247, 78, 88,212, 2, 58,
+ 49,113,196,201,241,148, 79, 30, 61,230,201,147,125, 14,206, 78, 56, 62, 58,231,120,118, 78, 81,118, 24, 29, 49,156,140,177, 38,
+162, 89, 86, 92,127,230, 6, 7,115,199,111,127,126, 76, 50, 30,241,103,127,245, 46,239,125,240, 4,223, 5,102, 62,176,150,199,
+188,187,191, 96,255,116, 78, 92,201,158, 88,215, 53,126, 36,149,247, 43,235, 17,235,235,171,252,201,123,251, 60, 56,152,211,212,
+ 45,195,204,242, 95,254,163,191,203,206,213,203,188,241,194,179,188,112,231, 38,137, 59,229,218,218, 26,119,238,220,198,163,169,
+171, 6,167, 12,187, 55,159,225,232,241, 1,239,255,252, 99,158,127,245,203, 4, 50, 86,247, 46, 51, 24, 90, 30,220,255,132,229,
+249, 25,111,253,240,109, 62,249,244, 83,118,247,182,120,241,115,207,243,248,225,125, 82, 11,235,107, 99,214,214,183,120,240,248,
+136, 96, 50,156, 75,120,253,151, 94,227,149,207,191,192,215,191,252, 58,239,189,245, 41, 94,181,236,172,175,209, 52, 45,135,143,
+247,169,154, 14,213, 58, 84,212,143, 97,109, 68,231, 21,117, 41,232,227, 44, 73, 89, 20, 11,242, 81,138,178, 50,122, 78,227,148,
+225,104,140,177, 17,227,113,206,188,116,140,148,227,223,252,218, 77,230, 39,103, 92, 75, 2, 3, 11, 15,155,192,218,250,128,182,
+238, 56, 84,154,177, 85, 68,206,241,112,127,206,185,135,224, 2,161,237, 24, 13, 82,214,214,135,232,174,225,222,147, 41,167,149,
+235, 15, 14,177,185,108,142, 51,206,155, 95,236,225,106, 87,209,225, 80, 38,166,108, 28,105,154,144,245, 7,240,245,171,215,248,
+209,123, 31,227, 9,252,198, 55,191,193,218,104,204,112,144,243,198,151,190,192,225,201, 9,135, 39,199,114, 0, 18,168,235,154,
+186,169,233,218,142, 44,203, 40,138, 37,113, 36,238, 14,148, 2, 36, 88, 71, 33,126,245,166, 31,159,138, 26, 90,190, 71,175,130,
+184, 21, 90, 17,128, 74,222,184,248,221, 77,127, 64, 6, 2, 73,212,195,162,148,238,247,191, 14,117,209,225, 5, 79,181, 44, 41,
+ 23, 5, 40, 73,231, 75,211, 76, 4, 64,198, 18,247,221,174,141,162,126, 12, 45,235, 57,185, 44, 37, 35,125, 48, 24,160,144, 21,
+128, 54, 90, 14,126, 99,168,235, 26, 99, 45, 89,154,138, 38, 38, 4,137,134,109, 68, 33,156,101, 49, 93, 43,184, 97, 31, 36,127,
+ 26,228,176,206,210,132,197, 66,210,227,154,182,145,177,109,150,209, 52,162, 15,201,115,113,226,164, 73,138,243, 29, 81,156,160,
+149, 56, 96,140,178, 44,171, 26,109,100, 47, 31, 37, 17,105, 44,197, 78, 83, 75,248, 7, 86, 70, 49, 94,123,177, 11, 40, 40,155,
+ 70,180, 40,145, 48, 45,234,166,195, 35,107,134,225,104,212,239,143, 19,226, 52, 97,185, 40, 69, 35,160, 4,205, 93,213,226, 10,
+ 72, 99, 97,111,104, 45, 97, 69, 32,168,216, 44,205,105,186,134,216,104, 41,238,226, 8, 97,131, 71,114, 30,107,152,207,166,236,
+236, 92, 37, 75, 34, 20,154,179,233, 20,148, 98, 56, 26,139,235,192, 73, 23,170, 20,160,100, 52,156, 68, 49,222,137,104, 56, 50,
+ 22,215,201,152, 24,173, 9,161, 67, 41, 35,173,184,146,221,112,231, 28, 77, 37,159,103,189,172, 80, 38,102,109,101, 13, 99,122,
+155, 88, 87,245,163,236, 14,223, 5,182,182,118, 56,159, 30,225, 93,135, 64,104, 18,172, 22, 96,209,114,185,196, 43,112, 77,131,
+ 22,157,160,104,157, 26, 17, 55,251,206, 81,213,194,251,183, 70,146,204, 12, 10,163, 69,187, 5, 90,196,118,218,115, 97, 29, 83,
+ 70, 61,125,158, 49,170, 39,222,245,218,137, 0, 23, 12,120, 29, 12, 4,228,125,242, 34,160, 3,104,186, 86,222, 95, 45,158,114,
+ 99,165,121,141, 34,139,233, 63, 35, 99,196, 63,158,167, 57,206,117,200,154, 72, 8,172, 90,107, 52,194, 83, 73, 18, 1,205, 16,
+100, 50, 45,148,197,190, 56,142,164, 59, 15, 94, 70,240, 54,178,196, 81,140,210, 32, 60,150,240,116, 74, 34,223,168, 20, 10, 1,
+ 17,215, 61,253,154,253,244, 65, 43, 48, 91,123,187,223,107,107,241, 69,227, 3, 93,159, 48, 19, 39, 49,139, 98, 9,206, 97,172,
+ 36,212, 60, 29,189, 71,130, 94,189,248,223, 26,225,255, 10, 68,192,138,210, 92, 5, 81,137,123,135, 81,146,194, 38,214,139,136,
+196, 10,126,207, 57, 71, 87,119,248, 32, 29,239, 48,139, 25,196,150,237,220,161,230, 15, 73,172,162,153,213, 24, 2,127,249,222,
+ 35, 90, 61,194, 14,134,124,235,215,190,204,183,191,245,101,174,238,109,178,179,181,206,253, 15, 63,129,229,140,229,233,148,135,
+159, 29, 80,206, 11,172,246,188,245,179,247,112, 13, 60,115,249, 10,143, 62,189, 11,193,115,247,227,123,132, 96,121,255,131,247,
+248,211, 63,248,127, 48,157,227,100, 90,240,254,221,135,156, 46, 28, 15, 78,107,238, 77, 91, 78, 11,199,238,181, 17,169, 63,103,
+123,160, 49,245, 9,169,246,164,186,197, 24, 65,117, 22,203,134,200, 6, 82,230,188,240,194,203, 40, 87,115,126, 94, 17,165, 3,
+ 14,239,125,204,151,191,252, 18,183,158,191,205,242,252,132,174, 94, 98,179,140,199, 39, 11,254,217, 63,255,115,166,231,251,196,
+ 86,113,122,240,132,233,121, 77,225, 96,125,103,139, 75, 87,110,178,182,178,198,104,156,177, 62, 78, 49, 77,133, 14,134, 69,209,
+ 81, 86, 45, 10, 75, 22,229,108,109,111,177,189,181,201,202,120,140,242, 29,224, 73,122,145, 96, 85, 20,236,159,206,184,179, 25,
+243,252,237,109,110,236,109,177, 58,180,124, 58, 93,178, 59,201, 88, 91, 31, 50, 61,175,185,180, 61,198, 36, 49,167, 39,115, 80,
+134,245, 72,203,197,148, 37, 92,219, 91,231,159,255,100,159,131,147, 37, 46, 4,206, 23, 21,245,236,132, 91,119,118,153,159, 21,
+188,245,147,191, 4,103,121,254,249,235,108, 95,187,202,139, 47,189, 72, 50,200,217,185,252, 12,190,236, 40, 43,205,175,255, 27,
+127,139,173,237,109,158,185,181,201, 40, 73,249,167,255,195, 63,229,173,183,222, 38, 40,195,123,239,127,200,246,230,132,174, 88,
+114, 54, 59, 35,120,136, 6, 57,201, 32,165, 11,154,131,195, 99,190,240,202,171,252, 59,191,243,183,137, 18,205,104,176,202,103,
+247,238, 98,115,249, 25, 63,250,240, 67,108, 36,113,181, 33, 82, 8, 74,184,194, 70,194, 66,207,226, 4, 31, 36,120, 65, 71,150,
+ 97, 54,161,172, 42,234,170,230,232,108,138, 15, 30, 27,193,114, 89,246, 22,203,140,251,143,142,248,111,254,195,175,114,103,164,
+249,163,159, 31,146,142, 18, 94,188,181, 71,211, 42,170,214,241,165,107, 19, 74,165, 40,130, 97,111,103,204,214, 40,230,100, 90,
+144, 79, 6,172,174,230,152, 36, 33,104,203,143,223,217,231,188, 17,117,171,214, 98, 67,107, 92,203,246,234,152,243,170,195,106,
+ 75,215,120,206,231, 37,139,249,146,196, 26,138,122,137,239, 28, 15,159, 28,114, 52,157,179,177,189, 69,177, 88,240,157,175,127,
+141, 60,207,153,205, 11,148,130, 23,110,221, 98, 99,117,141,199,135, 7,228,105,202, 27,175,189,194, 47,189,250, 10,191,253, 91,
+223,225,119,190,251,215, 57,155,207,249,236,193, 35,178, 84,146,236,130,119,104, 99, 49,214,210,117,178,191,171,170, 82, 68, 75,
+145,193,249,142, 44,203, 73,146, 8, 23,100, 52, 25,124, 63, 81, 0,154,182,166,169,101, 28,216,180,253,136, 58,138,176, 86, 99,
+181,140,251, 66,232, 29,249, 65, 84,244,117, 89, 50,159,158,178,152,207, 25,140, 6, 84, 85,213,239,154, 61,109, 43,129, 34, 73,
+ 58,144,125,104,239, 42,169,155,150,178,172, 88, 46, 75,188,119, 88,107, 48, 72, 96,197, 5,248, 35,138, 99,154,166,166,105, 26,
+178,172,207, 95, 15, 94, 64, 37,131, 28,215, 57,180,146,241,127, 81, 20, 34,102,109, 26,210, 52, 38,203,228,224,109, 59, 79, 28,
+ 11,131, 33, 79, 19,150,165, 32,107,139, 69, 65,211,119,206,117, 83,209,117, 98, 57, 75, 18,193, 77, 23, 69,137,242, 80,213, 2,
+161,137,147,132,128, 8,105,157,235,136,163, 30,254,161, 36, 49, 75, 27,177,198,217, 88,118,183, 33, 64,250,116,229,225, 9, 58,
+160,131,197,196, 18, 13, 28,197, 98, 53,139, 35, 97,220,171,200,200,148,176, 7,139, 24, 19,131, 18,135,128,119, 30,173, 44,117,
+ 93,226,157,251, 69,225,148, 38,212, 85, 67,215, 53,156,159,159,178,182,186, 65,146,231,124,252,233, 39,220,187,251,128,114, 81,
+176,190,185, 65, 32,160,116, 76,231,164,179, 75,250, 34, 74,217,136,206, 5, 20,189, 40, 83, 3, 30,130, 22, 80,138,137, 36, 97,
+175,243, 98, 99,149,196,178, 14, 23, 20, 93, 83,129, 86, 12, 7, 67,130, 10,232,160, 9,253, 13,234, 67,192,152,136,155, 55, 62,
+199,209,233, 19,113,168,104, 97,245, 27,101, 5, 27, 29, 2,131, 52, 37, 32,164, 63,239,100,202,147,101, 25, 30, 97,241, 7, 39,
+162,109, 23, 2, 42, 8,169,209,117, 29,177, 53,125,176,145,252,158, 1,143,242,136, 93, 12,121,142,165,185,148, 75, 93,163, 80,
+125, 71, 46, 78,169, 64,231, 29, 81, 36,251,234,128,238,173,127,209,211, 38,182, 44, 10, 20,129,178, 17,124,173,115,194, 79,177,
+ 90,156, 91,105,154, 98,250,123, 45, 77, 37, 89,205,245,154,171,174, 19, 14,204, 69, 69, 33,117,176,124,167,170,191,176, 53,154,
+ 46, 92, 88, 50,133, 28,137,145, 10,167,243, 29, 70,253,162, 32, 81, 10, 8, 34,248, 19,240,145, 60, 3, 38,146, 95,111,182, 47,
+ 95,250,158, 24,245,101,127,214, 57,177,163, 68, 54, 18,111, 97,100,105,170, 6,109,109, 15,102,232,228,161,119, 30,239,101,103,
+230,124,215, 43, 65,133, 28,166,188,122, 58, 26,180, 70,120,235,113, 34, 48,123, 97,172, 75,103, 30, 71, 17,147, 60, 98,115,104,
+217,157, 88,170,227,125,220,124, 65, 20,197, 52,102, 64, 53, 95,242,210, 11,183, 88,217,217,229,171,111,124,145,239,254,245,215,
+249,141,111,253, 18,147,216,241,236,181,219,124,248,206,187,164,137,101,101, 48,192,219, 8, 21,101,108,238,237,114, 86,183,156,
+ 45, 22, 40,175,168,107, 17, 8,253,252,157,183,120,114,255, 9, 73,182,130,195,243,224,195,247, 73,147,148,149, 75, 87, 88,189,
+116,157, 16, 28,179,197,146,174,106,184, 53,130,241,230,132,151,190,120,139, 56, 91,163,168, 27,246,118,118,217, 92, 29,113,237,
+210, 54, 55,110, 92, 98,107, 53,102,111, 96,217,222, 25,115,117,247, 10, 89,154,226, 58, 69, 58, 24, 80,207, 14,153,157, 30,241,
+202,107,175,114,112,120,206,193,254, 99, 92,209,176,178,185,194, 7,239,127,202,120,104,137, 99,203,116,214, 49,173, 52,233,120,
+194,231,110, 93,227,206,157,103,208,193, 83,159, 31, 99, 92, 75,100, 83,124,156,209,118,158,237,237, 13, 54, 55,214, 88, 29, 77,
+ 88, 89,145,138, 59,137, 98, 76, 36, 52,165, 65,214,239,182, 98, 65, 63, 70,121,198, 15, 62, 59,231,223,125,101,141,166,109,217,
+222, 91, 39,195,241,246,126,193,251,143,231,108, 71,112, 62,175,200, 7,137, 40,129, 81, 52, 93,203,104, 20,179,123,123, 23, 99,
+ 45,191,255,231,247,233, 2,116,190,197,123,216, 63, 56, 99,190,191,207,193,254, 19,130,170,217, 94, 91,225,224,238, 19,148,206,
+113,222,115,237,214, 45,118,214,215,249,241, 59,159,242, 31,255, 23,127,159,183,127,250, 54,159,190,243, 38,191,255,251,255, 55,
+ 63,127,247, 46, 46,116, 92,219, 91,167,114, 29,150, 14, 93, 45,120,112,124, 72,227, 58, 78,230,115,226,212,177,178,190,194,225,
+ 97,199,206,246, 21,126,237, 87,223,160, 90, 44,228,101, 12, 29,183,111, 95, 99,107,125,135, 65, 54, 96,239,242, 21,218,170,225,
+240,248, 72, 0, 43, 78,118,157, 90,203,190,206, 59, 41, 40, 9, 14, 79, 32,138, 19,170,170, 34,181,146, 40,181,108,106,166,103,
+133, 76,136,186,150,209,100, 72,211, 53,252,103,223,190,131, 90, 31,115,248,233, 62, 15,206, 27,110, 94,158, 16,235,192,209,180,
+ 36, 29,100,172,103,150,135,251, 51,146, 52,226,184,104, 57,154, 87,108, 56, 79,172, 90, 38,163,140, 43, 59, 67,126,240,211, 71,
+ 60, 58, 47, 41, 29,120, 15,173, 11, 20,165, 39, 75, 97,255,172,192,119, 13, 86,105,242, 65,134,209,150,217,124, 73, 81, 54, 76,
+231,243,126,204,105,168,154,150, 39, 7,199,188,254,242, 75,236,108,110,114, 62,155, 73,200, 71,211,176,185,177,198, 23, 63,255,
+ 34,175,190,244, 60,183,111, 92,227,234,165, 61, 70,131,156,206, 57,190,252,202,203,172,173,142,249,236,254, 67,170,166,253,215,
+118,118,162,150,247,128,243, 50,105,139,172,197, 26, 75, 28, 37,228,131, 33,193, 59, 66, 95, 96, 43,241,202,241, 20, 18,211,117,
+120, 39, 35,251,174,109,159, 42,199,165,227,144,108,104, 25,231, 75,160,146, 86,138, 98, 81, 48, 59, 61,195, 57,199,100, 60,145,
+208, 39, 99,112, 94,132,100,174,235, 16,213,117, 32,137, 99, 1,148,120, 73,170, 82, 90,247,225, 47, 49,139,178,144,149,130, 15,
+100,105, 46,133,128,147,216, 86, 29,132, 19,145, 94,240, 26,148, 48, 51, 68, 23,211, 50, 30, 15,177, 54,198, 60,197,227, 10, 5,
+ 51, 77,227,167,103, 93, 28, 71, 88,163,105, 90,177,253, 57, 31, 24, 14,134, 34, 88,210,114,128,198,113, 68,217,212,226,177,239,
+167, 12, 89, 26,147,196, 9, 74, 41,210,184,103,140, 55, 13, 77,215,209, 58,153,136,136,159, 92, 82, 32, 91,231,169, 91,143, 82,
+ 2,199,105,218, 70,116, 16, 93,219, 55, 64,173, 56, 9,218,134,224, 3, 65,137,176,242,194,169,115, 49,214, 85, 74,252,227, 30,
+ 65,122, 55,117, 3, 90,124,214, 93, 43, 54,191,224, 59,246, 15, 30,146, 37, 67, 86, 87, 54,120,244,248, 33, 10,133,137, 20,169,
+ 77, 9, 58, 16, 27, 97,193, 71,113, 66, 89, 86, 68,198, 64, 80, 16, 12,160,145,241,188, 40,224, 55,183,183,216,217, 94,103, 60,
+ 94,145,239,191,172, 8,186, 7,191,116, 30,231,101,220,110, 34, 67,150,102, 68,113,134,209,200,133,101,132, 0,105,149,229,202,
+181,219, 20,203, 25,222,181, 82, 16,249,142, 52, 77,233,218,150, 40,150,162, 65,194,178, 18,154, 70, 50, 1,146, 56, 21, 49,102,
+ 47,240,140,250,137,114,100,228, 18,142,147, 68, 68,151, 90, 46,108,131, 8,204,100,107, 32, 16, 23,173, 5,182, 3,160,140,124,
+142,178, 94,234,213,240,253,104,191,110, 90,170,170, 0,165,250,105, 68, 37,233,158,173, 32, 90, 59,215, 82, 45,155,167,133, 2,
+128, 54,154,186,109,159, 78,178, 47, 86, 7, 38, 18,113,232,133, 24, 21,196, 81, 32, 47, 13,253, 37, 45, 99,116,130,216,237,156,
+ 11,116, 93, 75,100, 45,194, 8,144,247,229,130, 83, 33,157,185,194, 24, 80, 24, 36, 16, 77,166, 9,190, 19,160,142,217,185,124,
+249,123, 42,120,186,198, 81, 55, 45, 38,178,100, 89, 70, 0,218,170, 34, 78, 18,177, 83, 57, 73, 67,178,253, 7,233,188,208,121,
+140,141,128, 64,154,101,132, 32, 49,155,141,235,168,151, 37,222, 43,148,149,221,162, 49, 17, 26, 17,219, 68,120, 6,110,193, 68,
+205,104,102,199,196, 70,243,225, 7, 31, 50, 43, 61,215,158,185,193,206,213, 29,190,248,194, 29, 94,122,225, 38,207,124,238, 38,
+ 7,247, 62,165,155, 23,204,247, 79,216,191,255,136,163,253, 67, 22,243, 51,106,231,104,171,154,135,143, 78, 57, 56,153, 83, 55,
+ 37,119,239,221, 39,142, 98,138,101,205,244,248,132, 36,130,227,233,156,120,176,138,139, 34, 54, 54, 87,136, 6, 49,101,213,144,
+173,110,210, 25,205, 96,117, 66,187, 60,225, 87,126,249, 13, 78,159, 60,225,254,180,100, 62, 47,185,121,101,135, 47,126,229, 11,
+156,207,206,200, 87,115,232,114,156, 78,121,255,221, 79,105, 23,231,132, 97, 2, 38, 39, 86, 26, 29, 13,152, 79,207,201,135, 49,
+ 71,239,255,132,207,189,248, 26,123,151,174,162,147,148, 7, 71, 51,178, 44,230,238,254, 17,167, 39,103,156,205, 91,234,198,179,
+104, 20,151,118, 55,105, 26,199,116, 49,231,248,224,144,199,143,246, 57, 93,150,116, 68, 44,202, 37, 85, 89, 96,141,116, 4,103,
+ 39, 83, 33, 39, 57, 71, 23,196, 35,217, 53, 53, 10, 69, 48,154,101, 81, 19,124,160,169, 58, 78,143, 14, 57, 92, 24,214,183,134,
+188,126, 99,204,124,209,176,189, 61,225,214,149, 21,226,216,242,238,253, 41,117, 39, 54,168,224, 68, 53,218, 41,205,217,225,156,
+227,131,115,242, 73,198,127,255,253,135,210, 37,121,100, 87, 27,160,158, 47,233,234,134,157,171, 87,185,113,121,151, 43,123,187,
+ 84,217, 42, 55,238,220, 38, 31,173,242,135,255,242, 47,248, 91,255,246,119,249,227, 63,252, 51,126,248, 23,255,138, 55,223,252,
+ 49,119, 94,122,137,124,146,242,243,183,223, 34, 31,231, 92,219,217,228,221,119,222,229,238,225, 19,118,175,108,227,149,230,250,
+245, 75,172,172,110,131, 94,193,154,152,255,252,119,255, 62,170,110,184,127,239, 51,210, 40, 98, 49, 59,231,240,240, 4, 29,199,
+252,217, 15,254,146,114, 81,114,116,116, 74,211,214,228,195, 1, 93, 23, 72,162, 72,246,130,117, 43,121,205, 81, 68,156, 72, 2,
+ 97, 62,204,201,243, 49, 85, 93,163,157, 99, 56, 72, 25, 78,198, 52,190,227,232,100,202,225,209, 1,117, 3,127,243,133, 53, 54,
+135, 57,235, 3,203,163,233,146,179,131, 5, 15, 31, 31,179, 49,206,248,104,255,156,183,222,217,103, 47,215, 60,115,121,204,216,
+ 4,236,116,193,245,117, 75, 98, 34,146,200, 48,140, 3,199,211,154,119,247,167,204,107,233, 48,149, 2, 99,224,242, 90,206,227,
+179,154,206, 67,221, 73, 16,132,115,129,241, 56, 19, 39,137,211, 36,131, 33, 69,217,178, 88,148,148, 85,197,175,127,253,171,108,
+109,174, 83, 84, 21,197,114,201,124, 81, 48, 91, 20, 84,101, 77,177, 44, 57,157,158,115, 62, 95,208,116,142,178,170, 56,159,205,
+216,222,216,224,185, 59,183,184,255,232, 49, 69, 47,174,211, 90, 34, 87, 47,178,214,219,166, 5,173,159,118,192,206,183, 68, 54,
+233,217, 11, 18,128, 97,227, 8, 2,148,149, 92,102, 73,108, 69, 95,162,144,113,161,150,195,201, 24, 67,150, 36, 12,135,195, 94,
+ 21, 12,129, 14, 99, 35, 34,173,169,170,154,147,163, 99, 20, 74,224, 53,253, 69,104, 76,132, 15,130, 35, 70, 9, 27, 35,234, 39,
+ 43,101, 89,136,146, 57,200, 40,218,244, 35,252,206,201, 57, 21,199, 9,229,178,164,110, 91, 18, 43,226,199, 56,146,177,123, 20,
+197, 36,121, 66,154, 36, 20,203,165,172, 72, 16, 18,164, 53, 50, 45, 92, 46, 43, 33, 30,170, 32,156,137, 86,184, 19,109, 43,164,
+ 50,231, 36,194,185,173, 27,153, 60, 58, 9, 14, 89, 46,151,164,137,140,224, 67,215, 81, 85, 37,105,150, 34,214, 60,219, 11, 51,
+ 91,210, 56, 33, 4,121, 6, 27,215,146, 38, 25, 98,171,115,210, 53, 90, 75,150,102, 16,164, 8,186,176, 38,133, 16,200,243, 12,
+148,136, 28,163, 40,145, 49,124, 63,150,109,155,142,124,144,139,240,175,207, 18,111,218,134, 44, 74,105,125, 71,158,166,180,222,
+139, 80, 76,107,158, 60,186,203,104, 52,102, 48, 90,225,244,248,136,243,243, 57, 59, 59, 91,236,238,108,115,116,122, 44, 80,160,
+224, 89, 95, 95,167, 88, 46,105, 59,113, 38,120, 4, 79,220,245, 49,175,117, 89,179, 88,116,152, 88, 19,167,137, 76, 8,218, 14,
+ 66, 63, 26,118,158,160, 68, 17,158, 15,114,129,244, 76,198, 56,231, 69, 76, 88,139, 8,178,109, 28,151,118,175, 81, 55, 5, 93,
+ 43, 88,213, 56,138,192,131,178,138,184,255,108,125,215,162,173,101,144,231, 24, 35,240,152, 98, 89,208,212, 45, 73, 42, 16, 26,
+165,132,183, 46,104, 89,139, 10,226, 59, 15,114,227,202, 13,216, 79,203,148,234,245, 32,198,200,245,170, 68, 35, 34, 98,118, 5,
+ 74,225, 93,139,239,121,244,190, 19, 39, 85,211,117, 98,179,238, 58, 2,138, 65,150, 81,214,178,122, 93, 22, 5,229,114, 9, 8,
+ 78, 60,138, 44,222, 9,217,206, 7,241,178,167,105,175, 63,178, 17,222,251,254, 34, 87, 40, 37,255,140, 82,104, 43, 19,131, 40,
+ 18,215,142,128,224,100, 71, 30, 89, 9,119,177,218,224,233,197,141, 90, 73, 17, 3, 4, 20,198, 88, 92, 63, 93, 11, 4,204,222,
+149, 43,223,187, 16, 21,200, 71, 33,123,192,178, 88,210,120, 25, 27, 92, 32, 90, 37, 34, 83,225, 3, 50, 66, 49,138, 44,141,241,
+ 46,144, 38, 73, 95,177, 11,244,191,115,142, 36,151, 7,175, 11,142,221,141, 49,119, 46,165,108, 71, 37,155, 67,133, 81, 53,111,
+254,236, 3, 46, 61,115,135,193, 36,230,243,175,188,196, 87,191,242, 26, 43,171, 9,153,129,179,233, 49,167,197,146, 52,201, 25,
+229, 99,178,124,204,206,173,155,232, 84,108,110,135,179, 83,138,162,160,152,117, 60, 57,155, 19,172,229,163,207,238, 83, 54,208,
+121,207,241,241,148, 39,247,238, 18, 69, 17, 42,196,196, 43, 99,214,215, 87, 89, 20, 2,114,209,193,179,117,249, 10, 15, 62,124,
+155,163,247,126,142, 63, 63, 99, 45, 55, 92,191,117,153,103,158,219,224,241,225, 25, 63,250,241,125,126,246,179, 15,184,251,193,
+ 35,174, 95,218,195, 15,115, 94,252,252, 29,156, 10, 28, 45, 74,118,119,111, 99, 9, 60,190,123, 31, 19,229, 60,115,243, 6,127,
+249, 23,127,193,165,189, 93,174,220,186,195, 95,253,217,247,121,242,120, 31, 19, 25, 30,157,158,242,240,201, 25, 77, 93,211, 89,
+131,182, 17,211,229,140,166, 11,156,206,103, 40, 44,193,200,126, 43, 50, 17, 26, 71, 98,123,246,175,181,180, 93,131, 81, 10, 23,
+ 28, 58, 82,104, 31,104,202, 10,229, 3, 45,242, 0, 57,196, 78, 17, 39,150, 65,146, 16,107,207,159,188,179,207,214, 32,226,245,
+155, 27, 28, 47, 27,108,208, 92,185, 52,225,149, 59,187, 92,218, 28,147,231,146, 94,230,103, 21,163, 24,242, 72,163, 2, 76,139,
+150, 31, 60,106,120,246,250,101,158,123,238, 10,197, 98,193,188,168,232,148,101,178,146,241,149, 55, 94,229,210,213,103, 89,189,
+124,153,217,162,228,238, 39,239,177,182,115,155,223,251, 39,255, 11,139,249,140, 63,249,139, 55, 41,231, 1, 21,149,140, 6,138,
+ 63,250,151,223,231,232,224,152, 36,141,120,247,157,119, 89, 84, 51,162,108,192,141,155,183, 88, 89,221,225,193,253, 57, 90,173,
+ 16, 25,203,213, 43, 91,108,172,174,113,247,195, 15, 56, 57, 43,136,146,136,149,213, 53,110, 61,251, 60, 63,251,233, 79,185,121,
+243, 58,113,150, 80, 54, 53,179,233,148,193,112,136, 2,170,114,193,124, 58,197, 27, 77,190,178,134, 25,230,104,155, 82,213,142,
+170,105, 41,170, 37, 54, 73,112, 78,179,152, 78,209, 33,144,167, 41,151, 47,237,144, 38, 25, 71,135, 11, 42, 87,241, 55, 94,221,
+ 35, 29,196,252,233, 79, 31,243,228,180,160,241,138, 52,137, 88, 85, 13, 59, 73, 32, 74, 44, 89,217,146, 27,133,242,158,217, 40,
+ 39, 68,150,135,199, 5,243,131,115,118,110,237,146, 36,134, 31,125,118, 70, 31,131,140, 83,176, 51, 78,121, 52,173,101,111, 24,
+148,116, 57,174, 99,190, 40, 89,214, 13, 40,143, 85,129, 52,205,200,242,148,163,227, 83,174, 94,190,196, 87,190,240, 50,222,133,
+ 30,234,209,112, 50,157,114,112,114,194,241,201,153,216,183,250,206,165,174,106,186,206,177, 44, 75,124, 8,236,110,110,112,116,
+114,198,188, 40, 72,162, 8,173,149, 8,171,188, 56, 61,150,101, 33, 32,150,214,209, 53, 13,222,181,160,132, 57,173,251, 81, 37,
+ 64, 28,247, 17,167,198, 98, 99, 81,219,163,100,175, 42,121, 12, 65, 52, 51,202, 16, 71, 22,215,213,164,105,132,107,131, 28, 86,
+177, 33,137, 35,206,207,166,156, 28, 29,227,186,142, 36,203, 8,222,247,133,133, 20,142,244, 29,211,124,126, 78,215,182,253,184,
+213, 82, 20, 18, 2,213,116, 45, 89,154, 81, 87, 18,216, 97,172,236,186,151,203, 5, 62, 72, 71,219,212, 45,206, 7,177, 0, 41,
+100,223, 8, 24, 27,177,172,151,104, 45,233,144,131,129,140,124, 5, 77,157, 60,189, 36,196,110, 23, 8, 78,138,150,166, 21, 60,
+118,154, 38,184,214, 75, 87, 93,149, 84,101,217, 35,111,187,126,252, 41,152,218, 56,137,104,218, 26,107, 35,202,170,162,237,106,
+242,108, 64, 89,215, 68, 70,252,238,178,109,149,139,253, 2,151,154, 38,137,120,194,157,196,130, 90, 27,201,228, 64, 75,199,172,
+149, 76, 26, 76, 28,209, 84,181, 28,236, 74, 81,215, 21,121, 62,160,234,196,210,171,130,146,127,238,126,161,238, 63, 57,218,103,
+ 48,200,184,115,251, 89,180,214,220,188,113,147,131,131,125,230, 69, 77,189, 44,137, 76,196,198,250, 26,211,217,188,183, 33,138,
+168, 49, 4, 89, 29, 97, 68,236,231,130,163,169, 90,188,119, 68, 38,162,241,194, 16, 81, 10, 8,154,224, 37,149, 50,120, 69, 89,
+203,115,190,186,182, 70,215,122,230,231, 83,170,186,146, 9,141,243,172,175,109, 51, 43,206,232, 90, 73,190,187, 0,206,212, 85,
+ 3, 78,240,225, 77,219, 98,172,238,167, 58, 18,229, 76,240, 68,177,216,225, 64,118,216,173,119,226, 37,111,157,132, 39, 5,240,
+222,211,133, 32,197,167,220,237, 68,145,145, 75, 80,110,249, 94,248,136, 40,242,149,248, 61,186, 86, 8,120,244,157,189, 4,178,
+136, 6, 44, 73, 19,170,186,150, 41,118, 85, 35,180, 70, 17, 3,218,126,245,105, 76, 31,115, 28,100, 21,133, 82, 18,207,170,149,
+ 76,169,229,147,237, 53, 49,253, 95, 65,130,136,188, 15,224,131,188, 10, 62,224,131, 80,251,148, 86,196,177,237,215, 75, 10,133,
+188,239,114,103,203, 24,255, 23,122, 7,133,217,190,116,233,123, 23, 30, 58,188,146,223, 67, 41, 17,103, 92,140, 4, 26,161, 65,
+ 9, 8, 64,146,210,172, 18, 65,128,209,162,120,140, 35, 73,202,146, 9,142,194, 59,199,202, 48,227,213,207, 95,226,141,151, 47,
+ 49,212, 29,223,255,163, 31,240,227,247,238,113, 54, 93, 64,186,193,127,244,159,252, 61,190,244,218, 45,174,108,110, 96,234,142,
+ 58, 56,134,249,136,245,181, 13,182,118,119,121,241,198, 85, 14,239,221,231,100, 86,225, 77,194,167, 15,222,229, 71, 63,253,136,
+186, 53,156,204, 91,138,165, 34,216,148,120, 52, 96,177,108,216,218,220, 18,202, 90,150,178,183,185,205,218,230, 26,163,124,194,
+222,205, 27, 36,169, 97,113,240,128,135, 31,125,192,233,225, 1, 7,135, 7, 60,252,248, 1,197,193, 17, 89, 30,147, 43,195,229,
+189,171,100,195, 85,210, 44, 97, 20, 89,190,248,210,117,234, 14,166,141,230,227, 79, 15,104, 92,203,219, 63,255,132,123,159, 28,
+144,153, 1,235, 59, 19,238,126,248, 62, 77,221,145,230, 67,158,123,254, 58,159,189,255, 30,223,254,206,119,249,225, 15,127,198,
+193,241, 41, 81,164,120,247,163,143,232,128,213,237, 13,246,143,207,105, 59, 37, 10,212, 96,217,218,217,100, 99,101, 66,158, 68,
+ 4,223,177, 50, 30,203, 31, 16,138,124, 48, 68, 41, 77,237, 69,101,107,147,152, 16,126,225,195,180, 74, 10, 43,229, 2, 33,120,
+ 76,128,166,170,233,202,146,135, 7,103,216, 44, 97,176,185,193,247, 31, 42,110,109, 89, 46,175,196, 56, 2,109,175, 68, 30,141,
+ 99,110,236,172,240,252,237, 93, 38,235, 25,121, 18,177,119,121,157, 95,249,218, 29,190,244,185,109, 30,157, 46,121,235,225,130,
+235,219,171, 12, 82,207,237,155,187,204,102, 21, 15,143,102, 28, 29, 29, 10, 93, 42, 74,248, 31,255,201,255, 78, 99,229,226, 0,
+ 0, 32, 0, 73, 68, 65, 84,204,131,131, 71, 36,217, 10,251,103, 71,172,110,239,240, 43,191,250,117,126,240,230, 15,184,119,239,
+ 3,166,179, 25,227, 73,202,179,183,111,242,185,103,175, 82,204,102,172,172,174,240,210,107,207, 17,212,136,207, 62, 59,230, 91,
+223,250, 6,127,231,119,190,203,217,193,140,160,106,158,185,118,153,247, 62,250,132, 75, 55,110, 66, 8,156,157,156,242,193, 71,
+ 31,112,227,153,155,220,187,119,151,199, 15, 31, 16,186,154,193,104,192, 98, 62,227,193,131,187,144, 88,198, 91,187, 68,121, 46,
+234,210, 32, 1, 60, 38,205, 80, 74,147,100, 35,108,154, 82,187, 14,147,164, 96, 45,117,227,112, 8,159,225,202,213, 45, 62, 62,
+170,249, 15,222,216,198, 90,203,202, 40,227,211,135,167, 68,193,161,130,226,115,207,109,243,149,103,119,169,235,134,251,203,142,
+ 42, 4, 86,242,132,194, 91,110,110,229, 28, 31, 45,177, 10, 30, 44, 97, 77, 57,222,123,116, 74,231,165,162, 94,118, 48,138, 53,
+199, 69,199,255,207,212,155, 60,105,118,157,103,126,191,115,206,157,191, 41,243,203,204,154, 11, 85, 40, 20,134, 2, 1,112,210,
+ 72,177, 37,138, 86,107,160,228,232,104,183,187,189,144, 29,209,142,182, 28,225,176,151, 94,216,225, 13,189,245,206,255,129,195,
+ 59, 71,203, 45, 59,100,169, 37, 53,213, 52,155,110,113,130, 8,130,152, 11, 5,212,156,149, 89, 57,126,195,157,207,224,197,123,
+ 51,217,136, 64,144,136, 42, 36,178,190,188,247,156,119,120,158,223,147,196,138, 72,203, 62, 77,107,200,227, 64,223,122,148,239,
+113, 93, 45,227, 54, 99,184,122,105, 11,235, 60,223,250,198,111, 81,214,245,208, 29, 11,134, 53,139, 83,166,179, 49,215, 46, 95,
+226,210,206, 22,206, 58, 22,235, 53,117,211,178,174, 42, 22,203, 53,214, 58,110,189,112, 21,231, 28,123, 7, 71, 72,148,228, 48,
+174, 78, 99,186,222, 97, 34, 77,223,137, 45, 53,205, 18,218,166, 37,210, 66,118,140, 98,137, 74, 62,187,180,133, 78, 39,135,125,
+ 20, 11, 41, 77, 32, 48, 10, 16,142,120,146, 36,148, 39,167,224, 17, 31,176,142, 48, 90, 88,240,145, 49,196,137,226,244,100,201,
+233,225, 33, 58,138, 72,243, 92,118,148,195,193,220,180, 66,168,204,242, 12,241,224,123,210, 68, 98,161,227, 36, 35, 16, 40,242,
+156,170,110,206,125,196, 38, 18,141,143,214,162,224,238,251,142, 52, 77,233, 59, 73,117, 19,191, 58,232, 32, 59,233,162,144,127,
+110, 26,201,253, 78,146,136,213, 74, 24,252, 69, 94,200,222, 90, 9,125, 50, 88,136,163,136,214,118, 36,145, 0, 82,196,206, 38,
+161, 50,102, 88, 83,100, 89, 2, 65,138,242, 72, 69,212,125, 75, 26, 71,160,149, 8,234,144,195,185, 30, 82, 36, 3, 1,231,123,
+ 41,212,253, 0,194,137, 4,194,162,181,166,119,110, 56,139, 3,130,252,149, 96,150,224, 37,231,194,246,110, 0,125,201, 46, 95,
+121,209, 43,196,145, 88,254,218,186, 34, 4, 65,126,123,229,193, 91,198,179, 57,215,175, 94, 35,205, 18,158, 60,222,197,232,136,
+201,116, 44,141,152,150,116,179,222,185,161,171,149,203,112, 50, 25, 15, 35,101,249,254, 61, 10,107, 61,146,118, 39,186, 40, 0,
+143,197, 59, 75,219, 89, 97,144,244, 61, 77,211,161,116,196,120, 52,162,105,106,170,170,193, 58, 75, 85,174,209, 26,110,223,186,
+ 67, 85,157,130,119,244,118, 40, 14,116, 16,198,136,150,108,143,186, 19,122, 92,219,137, 43, 33,207,114, 17, 40,247, 45,103,246,
+ 66, 89,123,244,160, 2, 97, 88, 5,248, 97,172,125,166,108, 87,200, 51, 72,144, 21, 17, 94,128, 76,193,137,109,205,251, 32,157,
+182, 10,164, 73,140, 81,146, 54, 23,144, 20, 82,163,100,181, 19,197, 50,189, 18,230,193,160,116,135,115,225,180,216, 31,101, 98,
+115, 70, 67,108, 91, 73,180,211,250,204, 30,170,126,161, 77, 75, 99, 66,144,207,209,163,112,214, 19, 25, 69, 80,178, 22,144,104,
+ 87,225,200, 40, 37, 36,213, 56, 22, 77, 2, 65, 84,241, 74,203,213,174,228,250,198, 92,188,114,229,219,210,159,139,194,239, 12,
+200,208,117, 29, 32, 30, 84,180,162,237, 44, 40, 1,210, 4,206,212,147,242, 50, 6, 37, 8,192,224, 29, 46,104,174,238, 76,248,
+149,183, 46, 51,203,224,193, 39, 31,240,151,127,241, 35,126,246,179,207,249,194, 43, 55, 56, 90, 47,248,135,223,250, 71,124,235,
+ 91,191,204,238,163, 7,124,252,246,251,220,253,224, 33,211,157, 75,204,183, 55,232,155, 21,251,247,239,177,247,241,199,188,253,
+227, 31,115,176,238, 89,181,150,167,251,251, 20,209,132,171, 59,215,208, 89,194,120, 54,101,103,103,204,147,207, 62,197,150, 21,
+ 91, 99,241,186, 94,216,185,200,229,157, 77,154,234,136,141,233,152,205,217,152, 8,120,240,225, 79,217,125,112,192, 55,255,224,
+ 27, 92,188,122,157, 75, 47,190,206,215,190,249, 15,248,242,215,190,200,139,175,188, 74,155, 20,132,182,162,238, 44,205,241,138,
+235, 55,174,176,108,122, 94,123,229, 53,222,250,194, 29, 54,162,134,235, 87,174,178, 53,158,114,251,213,151, 40, 70, 57,123, 79,
+ 31, 81,149, 13,243,205, 77,242, 34,226,233,189, 79,185,241,194, 45,238,223,251,152,100,126, 17,173, 45,239,126,240, 41,202,196,
+ 60, 63, 94,179,247,244,144,249,116,147, 34,207,153, 77,198, 92,189,116,153,141,209,136,174,237,168, 22,167,196, 73,130,245,208,
+180, 53, 26, 69,112,158,190,151,144, 20,165, 12,161,247,242,194, 84, 37,182,183,180,189,163,247, 34, 82, 42,187, 14, 23,143,176,
+105,134, 79, 50, 70,243, 45,162,188,192,196, 9,206,117,252,237,167, 11,218, 30,190,124, 37, 35,137, 13,125, 43,213, 98,221, 89,
+240,142,241, 56,231,226,165, 77,230, 91, 83, 57,196,141,226,155,183, 71,252,224,211, 61, 92, 60, 65,197, 99, 62,189,183, 75,154,
+ 68,156, 46, 75,234,178,225,233,238, 62, 63,249,241,143, 89,151, 37,111,190,241, 10, 87, 46,204,217,218, 24,241,250,155,111,240,
+215,255,215,159,243,241,135,239, 83,228, 10, 21,207,112,193,176,174, 90,162, 44,229,231,239,221, 35, 30,143, 88,174, 19,182,183,
+ 47,242, 95,254,139, 63,230,206,157, 59,124,118,239, 25,127,247,221, 15,249,163, 63,252, 42,159,125,244, 25, 71,213,146, 87, 95,
+125,133,170,170, 80, 33, 80,181, 53,143, 31, 60,225,249,193, 33,171,197,130,163,227, 35,158, 62,190,207,162,237,216,188,120,149,
+ 98, 52,165, 15,225, 60, 98, 51, 73, 51,214,101,133,242, 8,243,121,216,171,102,105,134, 50, 49,141, 19,140,164, 13,154, 16, 39,
+172,202,134,101,235,152,198,138, 95,121, 93, 0, 64,125,213,113,112,184,102,209,120,126,231,215, 94,100,115, 50,226,234,245, 77,
+ 94,185, 58, 39,209,138, 79,142, 74,126,112,247,144,175,189,121,153,175,190,113,141,211,189, 35,108,158,243,242,157,107, 84, 77,
+207, 71,143, 78,137, 34, 69,239,225,181,203, 83, 30, 29,183, 76,166,133, 8,215,186, 30,215, 67,150,107,210, 60,161, 15, 1,229,
+ 3, 40,104,234,154,197,114,197,106, 93,242,251,223,252,109,170,170,162, 29,172, 95, 89,150, 50,157,142,185,126,241, 34,211,201,
+152,120, 24,205, 6, 47,190,251,174, 23, 30, 67,158,166, 76,198, 35,110, 94,189, 74,154, 36, 60,125,182, 55, 88, 52,165,219,246,
+ 33,144, 21, 35,180, 49, 44, 86, 43,188, 71,192, 44,145,198, 91, 75, 91,215,178,171, 30, 4, 94,222, 75,146, 90,128,243, 83, 36,
+138, 34, 41,254, 99,137,189,244,222,146, 68,138, 52,206,136, 82,177,106, 25, 37, 23, 65, 28, 75, 88,147, 6,180,242, 44, 78,151,
+ 44, 79, 78,136,162,136, 56,207, 9,214,129,134,174,237, 72, 98, 9,242,136,147,152,170,170, 72,116, 68, 49, 42,100,247, 27,203,
+247, 83,174,133, 46,215,187, 30,156,199, 58, 97,155, 39,177, 68, 67, 39,137,228, 77,212, 85, 77,100,228,162,244,222,163,181, 92,
+124, 81, 28,147, 68, 17,109, 39,246, 49,144, 81,112,211,182, 18,252,212, 11,185, 50,205, 50, 92,239,177, 72,194,163, 50,146, 94,
+ 56,158, 20,131,245, 79, 44,189, 33,192,186, 92,145,102,137,188, 99,157, 32,115,229,118, 22, 12,106,164, 5,201,173,130, 60,139,
+142, 51,108,106, 39,235, 0,148,116,161, 42, 96,173,132,240, 68, 81, 76,111,123,146, 56, 57,255, 28, 1,234,186, 34,132, 64,150,
+164,152, 88, 46,140,214,246, 56,239,135, 51, 67, 97,116, 0,101,232,155,150,197,233, 49, 73,146, 51,153,110,114,120,116,196,226,
+100, 73,231, 45,105,150, 66,208,152, 56, 38,142, 19,154, 78, 24, 7, 74, 27,146, 60, 69, 35, 59, 97,201, 21,151,206,176,235,197,
+ 18, 56, 31, 96, 53, 89,156,208,180, 45,103,224,157,179,191,101,130, 33,171, 29,201, 44,240,146,165,209,118,100, 69,193,214,246,
+ 21,122, 87,161,241,131,176,213, 16, 69, 9,125,219,224, 53,164,113,194,114,181, 58,123,224,100,170,228,122,121,214, 6, 61, 66,
+ 50, 48, 42,204, 48,189, 56, 19,196,165, 73,130, 66,166, 69,125, 47, 2,231, 16, 6,175,189,147, 32,167, 16,160,119,150,190, 19,
+114, 97,108, 12, 74, 11,247, 63,120, 40,235,146,190,239,105, 90,201,138, 56, 11, 54, 27,229,178, 2, 49, 90, 86, 63,103,204, 7,
+209, 81, 72,162, 40, 94,246,237, 70,107,108,239,240, 65,138,245,179, 52, 58,185,103,173,172, 26,148, 25,166, 47, 18,226, 18,130,
+151,248, 91,165, 57, 11, 99,242,200,127,195,121, 17,176, 6,163,135, 62, 92,166, 25,114, 19,128,217,186,116,233,219, 90,137,226,
+213, 90, 43,254, 78,132, 64,101,173, 35, 78, 5,176, 31,156,208,118,148, 2,163,101, 68,215,216,134, 34,205, 81, 40,178, 72,177,
+153,107,110,108,103,232,174,228, 95,255,205, 15,121,247,131,199,116,141,163, 0, 46, 94,152,112, 84,173,249,253, 63,248, 22,191,
+250,213, 87,217,123,122,196,250,249,146,163,163, 19,222,252,202,155, 36, 81,203,195,159,191,203,147,123,247,169, 27,143, 29, 93,
+196, 37,219,164,147, 45, 70,163, 9, 69, 81, 80,182, 21,173,235, 73, 10,195,165,139,155, 60,184,247,128, 56,207,184,121,117,139,
+ 59, 95,120,133, 11, 23,119,184,125,251, 5, 62,125,255, 7,188,247,211,183,249,240,189,143, 56,122,182, 71,189, 62,228,243,251,
+ 79,184,122,243, 58, 63,255,240, 93, 30, 61,218,229,234,213, 29, 30,127,242, 17,127,246, 47,255,140,159,253,253,123, 60,123,190,
+199, 81, 89,241,228,160,226,180,106,120,178,187, 15, 40,158,237, 30,179, 46, 79,249,240, 39, 63, 1,109, 88,149,107,178,209,152,
+229,209, 9,121, 18,113,249,218,101,186,186,225,104,127,143,157,237, 25,171,186,225, 96, 89,113,233,218,101,190,247,255,126, 79,
+216,227, 93,192,247,142,151, 95,125,145, 81, 81,136, 93, 37,142,233,250,142,147,211, 99,170,213,138,108, 58, 1,109,200,178,148,
+201,120,131,170,179,196,185,240,226, 39,147, 13,162, 84,248,214, 65,105,154,120, 68, 60, 26, 99, 70, 99, 66, 90,224, 77,130, 41,
+ 70, 40, 29, 51,158, 76,145, 90, 52,156,219,120,228,129,210,188,255,172,225,187,159, 46,201,210,132, 81, 10,179, 34, 33,210, 10,
+165, 4, 96, 97, 61,244,214,177,191,234,248,127,222,127,206,255,250,239,142,249,249, 33, 60,122,186, 79,164, 12,111,189,245, 5,
+ 14,142, 79, 89,213,167,232, 40,208, 54, 22,239,123,166,147, 28,235, 58,126,246,238,207,217,123,254,156,195,221, 93,190,255,246,
+207,177, 64, 60,218,226,218,139,183,152,111, 94,224,241,147, 61,214,109,160, 44, 35,102,243, 11,252,119,255,237,191,224,247,127,
+239,119,104,106, 79,219,172,121,244,104,151,143,223,185,203,225,179, 79,121,251,157,119,184,113,227, 6,239,255,252, 61, 62,191,
+255,128,227,197, 9,101, 93,131, 49, 34, 82, 59,122, 14,177, 33,228, 19,198,147, 25, 58,142,112, 10,122, 43, 64, 20,207, 32,242,
+ 50, 70, 24,202,202,160,140,198, 59, 69,227,134,184,204, 16,208, 42,194, 68,177,136,140,186,150, 52, 77,249,209,195,146,255,236,
+ 11, 27,108,142,199,252,244,222, 46, 39,149, 99,115, 26,243, 96,111,197,245,235,115, 44, 6,231, 20,151, 47,111,242,198,173, 11,
+152,206,241,231, 63,126,204,131,167, 39, 28, 46, 26,102,121,132, 77, 51,170,117,203,143, 63, 57,162, 48, 16, 27,205,183,190,112,
+ 1,159,229,124,246,228,148, 56, 54,232,212,128, 49,100,105, 12,116, 40,165,241, 38, 69, 71, 26, 55,224, 55,215,235,134,111,252,
+250,175,160,149,166,110,133,172, 21,188,103,156, 23, 40,163,229, 61,117,194, 76, 48,145,208,171,242, 60,227,210,206, 54, 91, 27,
+ 51,138, 92,210,155,182, 55, 55, 25, 21, 57,251,135, 71,212, 93,135,117, 34, 80, 90,151, 53,113,146, 50, 26, 21,196, 73,130,119,
+ 78, 92, 48,193,203,101,102,229, 28, 56, 75, 63,243, 33,136,240, 40, 18, 43, 80, 8,129, 51,248, 84, 28,137,109,205,245,157,248,
+199,211, 20, 99, 16,202, 27,142,200, 68,140, 38, 25,206, 74,199,100,140,104, 53, 86,167, 11,234,245,138, 44,207, 49,113,130,237,
+ 59,250, 78,196, 72,206,121,180,134,209,100,130, 86,131,152, 77, 75,160,137,243,150, 44, 73, 73, 83, 9,239,144,216, 76,139,137,
+ 99,108,111, 25,141,100, 66, 99,173, 35, 78, 98, 52,129, 44,203,100, 63, 26,160, 44,215,162,177,208, 70, 28, 16,113, 6, 90, 50,
+204,207, 40,151,206,245,152, 65, 64,140, 67, 70,242,109, 35, 35, 99, 37, 35, 90,173, 52,125,219,176, 92, 46,177,214,225,123, 75,
+146, 13, 33, 85,222, 19,199,137, 20, 66,195,193,108, 34, 3, 90, 81,100, 25,105,146, 96,212,176,226, 68,209,212,213,128, 79, 85,
+168, 72,196,136, 33, 40,204,208,141,141, 10,233, 30,189, 11,232, 72,139,208,206, 91,116, 16,144, 73, 58,156, 45, 81, 44,123, 96,
+239,165,163,143,211,132,190,109, 89, 46,143,240, 1,182,231, 23,120,248,232, 49,155, 27,115,180,210,168, 32,196,178,233,120, 74,
+164,133,175, 15,136, 16,203, 8,100, 42,132,128, 81,195,245,170, 13,174,111,153,111,204, 24,141, 38,204,166, 83, 41, 8,234, 14,
+ 71,128, 48, 36, 4, 58, 71,154,164,108,110,206,200,179, 92,116, 23,145,166,235, 90,108, 47, 83,150, 60, 27, 97,125, 3, 74,176,
+212,214, 89, 70, 89,198, 25,107,193,104,185,232,146, 52,197, 35, 34,238, 60, 47,144, 96, 30, 81,200, 27, 37,157,120,192, 99, 76,
+ 36, 20, 64,231,206, 59,103, 97, 87,200,231, 47, 35,109,141, 15,210, 44, 69, 38, 34,224, 65,121,122, 43,133, 95, 20, 75,145, 16,
+ 96,112,142,156,145, 2, 37, 8, 72,186,112, 75,217,212,132,224, 25,101, 66, 27, 52, 70, 83, 55, 53, 77,221,208,116, 13,206, 75,
+ 64,145,181,189,216, 49,173,192,124,206,248, 47, 40, 47,169,113, 62,156,251,237,189, 19,193,155,115,126,176,253,197,128,116,230,
+206, 74,178, 98,158, 74,114, 97,215, 54,228, 73, 42,141,152,150,168, 88,147, 22,163,111,159, 93,212,157,243,116,109,131, 11,129,
+ 56,137,201,211,140,190, 29, 88,180, 70,200, 74,121,150, 73,170, 88,215, 17,107,205, 56,215,140, 88,227,234, 21,180, 29, 79, 30,
+ 63,135,104,206,246,118,193,151,190,116,135,249,198,152, 98,178,193, 27, 95,252, 34, 55,175,237,112,229,226, 20,175,144, 60,234,
+211, 19,174,109,110,240,236,201, 39,220,255,232, 1,206, 37, 68, 27,151, 81,227, 57,163,233,148,157, 75,219,140,198, 57, 15, 31,
+ 63,101, 50, 47,216,222,154, 97, 28, 60, 59, 56, 97, 60, 54,220,186,121,129,136,154,119,223,255,140, 7,247,119,121,247,131,187,
+252,251, 31,253,128,191,253,247,159,178, 88,116,148,117,207,202,121,246, 14, 78,121,184,191,230,195,207,118, 57, 90,172,241,238,
+148,187, 31,126,200,221, 7,207, 8, 38,230,241,222, 41, 93,187,102, 89,247, 84,173, 35, 40,205,243,229,146,131,227, 5, 85,231,
+ 56, 61, 62, 21,219,204,198, 6,247, 30, 62, 37,118, 45, 70,123, 84,128,195,253, 3, 38, 23,175,114,244,252, 57,167,171, 22, 51,
+189,196,222,163,207,120,251,157, 15, 40,171,158, 52, 31,161,180,102,190, 49,195,104,205,201,209, 41, 18,106, 47, 84,166, 52, 79,
+ 65, 25,146, 52,103,123,123, 27, 31, 52, 46, 64,145, 23,242,176,165, 49,189, 54, 88, 29, 81,121, 8, 73,206,108, 54, 37, 74,114,
+ 90,247, 11,171, 68,100,228,107,212,117,141, 49,134,104,240,222, 38, 81, 76,211,212, 56, 43,156,103,167, 51,126,240,249,146,191,
+253,188,229,207,222,121,206,251,187,107,222,123,238,248,116,127,205, 95,126,188,224,127,249, 55,143,249, 63,223, 95,242,131,251,
+ 13,207, 43,137,195,140,178,156,117, 89,242,236,233, 46,255,252,143,255,136,131,131, 67,142, 15, 78,200, 83, 67,150, 69, 4, 13,
+203,202, 98,240, 84,199,107,246,202, 21,191,246,214, 23,249,230, 55,126,139, 95,250,234,151,249,103,255,236,159, 50,159,108,210,
+ 52, 37,111,190,241, 69,126,251,183,191,206,133,157, 13,110, 93,188,192,103,247,239, 18, 37, 41,235,213, 18,219, 59,254,244, 95,
+254, 57, 71,171, 39,184,174,197,232,136, 94,201,110, 77,188,155,129,123,247,238,113,120,116, 72,190,177, 77,103,101,167,229,131,
+ 20, 35,130,122,132,222,203,104, 91,178,194, 53, 4,135,243,162, 3,209, 70,252,182, 33,200, 11,229,135,170,184,169, 42, 9,188,
+136, 19, 84, 44, 7,237,111,220, 24, 65,112,188,123,255,136,169, 81, 28, 29,173,121,254,188,228,230,141, 45,130, 82,172,234, 14,
+ 29,197,188,118,107,155, 75,179, 4,211, 59,136, 19,102,190, 39,217,154,178, 51, 73,248,193,251, 15, 57,109, 52,177,118, 92,158,
+101,124,235,151, 94,228,251,247, 42,130,181,216,225,207,149,143, 11,170, 82,196, 77, 90, 89,230, 91,219, 4, 29, 51,155, 22,180,
+ 93,195,139,215,175,177, 53,159, 75,183,224, 4, 24,210, 90, 25,235,149,131, 95,187,110, 26,172,117,244,206, 49,155, 76,152,140,
+ 70, 4, 37, 59,225,170,105,168,171,154,160, 96, 92, 20,236,237, 31,210,180, 29, 90, 1, 38,146,209,251,112,177,231,211, 49,203,
+229, 10,219,247,244,157,168,208,179, 44, 3,192,218, 97,135,170, 53,117, 85, 15,122,149,128,210,114, 40,170,190,165,238, 26,233,
+122, 80, 24,165, 24,229, 19,122,223,147,165, 25,214,246, 52,117, 75, 50, 36, 84, 89, 39,140,110,231,193,246, 61,235,211, 19,148,
+247, 20, 27,211,115, 53,186,236, 13, 37, 77, 49, 40,232,157, 35,142, 34,178, 44,165,239,123,220, 0,128,137,134,238, 61,142, 35,
+ 18, 19, 19, 84, 32,137, 99,218,182,193,123, 71,211, 52,104, 19,227,130,248,237,189,242,180,141,172, 29,204,176,235,246,200,100,
+178,173,170,225,185, 56, 75,188, 19, 53, 59, 33,200,179,227,157, 8, 71,173,149, 3,188,107,104,219,238,188, 91, 11, 65,114,201,
+207,178,195, 65,244, 16,222,203,174, 62, 77, 4, 88,163,181,162, 26,144,184,235,245, 90, 92, 5,198,144,166, 9,171,213,146,182,
+105, 33,200,244,225, 44,153, 82, 41,141,239,101, 90, 19,153, 72,206,235,190, 31, 52, 7, 45,218, 68,120, 47,204,114, 99, 12,121,
+ 54, 34,138, 69,224, 39, 29,170,103,181, 58,166,235, 74, 70,163, 41, 39, 39,199,140,198, 57,202, 24,150,167, 11, 66,232, 89, 47,
+151,108,110,111,138,255,223,181, 40, 47, 29,242, 96, 82,195, 35, 93,174,179,150,211,213,154,197, 98,141,115,129,124, 60,194, 40,
+ 77, 85,175,137, 52, 4, 4,229,219,245, 29,145,209,100,133, 92,234,151, 47, 95, 98, 60,154,202,200,186,174,136,147,148,201,116,
+ 78,215,174,105,171,154, 60, 77,176, 65,114, 18, 8,138, 44, 73, 7, 1, 25,228, 73, 70,156,100,210,245, 50, 4,123, 5, 41, 52,
+ 68,240, 40, 63, 39, 29, 16, 56,142, 54,180,157,197, 58,177,225,245, 93,135, 10,160,181,198, 15,151,166, 50,200,136,155,128,235,
+ 29, 46,120,212, 80, 76,181,125, 71,150,101,231,235,157, 52,149, 11,148, 32, 5,151, 50, 34,104, 60,211,103,244, 3, 58, 55, 32,
+122,157,190,149,176, 25,173, 20, 85, 89,227,149,180, 92,194,210,111, 65,169, 95, 76,142, 34,161, 95,102,113,140,115, 1, 79,160,
+119,131, 78,196, 73,252,114,158,138,176,209,246,146, 40, 24,153,152,178,170,208,177, 58, 95,209,152,164, 40,190,221,182,173,140,
+ 42,134,135, 27, 36,209, 70,252,234,226,213,179,157,101,148,102,128,236, 30,182, 38, 9, 23,230, 41,169,209,188,254,198,151,184,
+253,210,203,120,229,249,143,255,201,127,202,215,190,254,171,148,213,146,227, 39, 7,252,230, 55,191,193,139, 87, 46,179,145, 9,
+178,176,152, 78,185,117,227, 22, 31,254,248,135,252,240,175,191, 67,223,151, 84, 86, 83, 76, 38,152, 44, 39,104,205,233,201,130,
+253,163, 3,154,178,162,115,138,241, 40,231,224,240,136,227,211, 35, 78, 23,107, 54, 55, 71,188,251,209,167,252,249, 95,252,127,
+252,228,103,143,120,118,184,226,241,254, 9,207,143,150,172, 78, 26, 28, 80,108,206,232, 2, 44,150, 53, 85, 39,149,158, 11,129,
+222,194,162, 82, 44, 42, 72,211, 92,254,172,214, 81,183, 1, 92, 43,150,178,122, 65,185, 90,225,109,199,163, 71,251, 52, 85,205,
+201,178,103, 99,172,184,245,194,117,210,174,228,210,149,109,148,201,216,220,153,147,109,238,240,244,179, 79,197,127,175, 2, 15,
+247, 15, 89, 87, 13,243,217, 38, 59,155,155,108,109, 78,136, 77, 4,206, 49,157,111,208,212, 75,156,237,177,189, 35, 54,209,208,
+ 41,196,244, 77, 79,215, 54, 64,224,116, 93,211, 27, 3, 38,193,250, 64,211, 91,108,111,137,180, 84,231, 77, 37,201, 74, 26,217,
+191, 20,121,113,190,171,233,187,134,200, 8, 91, 32, 40, 56, 79,202,115,144,166, 49,160, 88,174,106,172,137,121,178, 12,124,240,
+108,205,199,167,134,143,247, 86,232, 84, 0, 32, 62,136, 16,202, 7, 81, 7,107,109,168,123,207,199,119,239,241,133, 23,111, 66,
+156,243,116,119,159,201, 44, 33, 79, 10, 42,103, 41,203, 64,190,177,195,155,175,221, 33,159,108,242,194,139, 47,242,197, 55, 94,
+231,238,189,135,244, 77,224,198,173,171,252,246, 55,190,206,100, 99,139, 7, 31, 61,230,187,223,253, 30,219,155, 41, 39,171,150,
+163,163, 5, 63,254,119,239,112,247,209,187,236,236,236, 48,219,156, 17, 98, 9,123, 88,175,215,172,170,154,199,123,251,116, 74,
+147,142,167, 24, 99, 80,202, 96,155,138,180, 24,225,189, 39,203,114, 80, 26, 81,202, 4,122, 39,227, 62,235,129, 32, 47,146,117,
+146, 67, 44, 56, 81, 3, 4,148, 49,210,225, 41,133,137, 98, 12,154,247,119, 43,254,233, 91, 51,110, 94,220,224,241,201,138,253,
+221, 99,146,241,152,253,163, 37,167, 71, 37, 47,221,186, 64,232,100,178,181,238, 91,110, 93,152,208,250,192,199,247,247,137, 21,
+ 60,179,154,184,183,252,207,255,197,215,184,125,113,196,193, 73, 77, 86, 36,252,225,157, 57,255,247, 7, 11,182,166,194,150, 86,
+ 8, 20,166, 24, 21,164,249,152, 72, 39,172,214,173,120,117,189, 16,226, 22,203, 37, 95,250,194, 27,248, 32,144,152, 85, 89, 82,
+ 86, 21,157,237,232,173,167,110,106,170, 70,236, 63,113, 60, 80, 25,189,165,170,107,202,170,166,170, 27,170,182,165,170, 27,154,
+170, 6, 5,199, 39, 11,185, 36,187,150,253,253, 61,142,143,142, 40,203,146,186,172,216,216,220, 98, 50, 42,136, 83,129,164, 64,
+192,232,179,142, 71,212,188,105, 38, 29,149,137, 18,178, 34, 39, 73, 18, 20, 72,110, 66, 31, 8,218, 19,148,248,176, 81, 1,219,
+123,182, 54,230,180, 93, 75,211,116,231, 59, 74,217,121,134,193,154, 6,182,111, 8,109, 75,148,102, 76, 70, 99, 1,190,164, 25,
+157,179,212,101, 61,172, 1, 44,105,154, 51, 46, 38, 36,137,228, 48,244,189,100,177, 71,113, 76,215, 53,164,137, 4, 50,181, 67,
+113,146,166, 49, 77, 45,161, 81,218, 8, 60,230, 28,189,105, 20,202, 24,156,245,180, 77,131, 36, 2,202,202, 70, 84,250,178, 55,
+141,226,136,190,237, 73,243, 12,223, 7,116,172, 16,220,172, 38,205,114,226, 40, 65, 34, 52,115,122, 43, 99,237,178,170,144,112,
+ 18,185,160,116, 36,133, 66,146, 36, 84,101,137,237, 58,154,174, 37,203,114,226,232,204,121, 36,187, 84,231, 68, 68,214,214, 13,
+120, 47,207,181,146, 17, 59, 10, 12,160,180, 22, 61,147, 70, 46,208,161, 3,142, 34, 17, 4,162,229, 57,143,227, 68, 68,129,121,
+ 34,144, 31,163, 41, 70,134, 43,151,174,242,228,241, 46,207, 15,143,184,124,113,155,131,195, 5,179,249, 6,125,215,179, 60, 89,
+136,112,108, 80, 98,203, 8, 94,166, 28,145, 14,120,101, 72,148, 96, 83,235, 70, 50,202,139,209,136, 40, 78,134,238, 83, 19,134,
+189,179, 13,142,174,109,169,234, 22,107, 97,123,123,131, 0, 44,150, 43,132, 26, 40, 33, 98,139,245, 49,231,192, 23,163, 9, 30,
+146, 52, 38,142,164, 99,213, 81, 68,215,183,120,235,134, 14, 93, 52, 93,105,148,208,212, 13, 62,120,178, 36,147, 70, 20,141,210,
+114,241, 7, 31,136, 77, 36, 90, 27,206,106, 45, 17, 67,234,160, 9, 90,147,166, 9, 81, 44,118, 55,144, 31,153,172,151,228,189,
+203,135,152,238,115,124,186, 18,231,135,132,132, 73,100,234,127,136, 94,206,139,130,186,109, 9,222,203,100, 7,177, 32,234,200,
+ 96,173,165,170,106,202,213, 90,222,241,197, 66,166,101,145, 0,117,226, 97,157,149, 70, 41, 54,120,166,147, 9, 73, 26, 15, 59,
+117,153,196, 56,235,132, 47,160,144,233, 68, 43, 57, 40, 38, 27,143,191,237,189, 23, 47,161, 26, 54, 38, 65, 62,136, 36,138,206,
+237, 32,194,222,109, 1, 71,106, 75, 62,250,240,125, 78,151, 21,191,250, 43, 95,227,149,219,215, 8,182,164,200, 18, 62,185,123,
+159, 52, 79,200,163,148, 59, 47,223,230,249,238, 99,140,114, 92,120,225, 26,189,239,176,203, 5,247, 63,124,143,163,123,159,144,
+ 23, 83,230, 47, 92, 99,239,232,128, 69,233,233,186,134,195,131, 35,166,211, 49,137, 86, 28,159,172,169,214, 43,102,147,130,147,
+231,187,140,139, 9, 95,250,149, 55,152,109, 77,185,253,202,109,190,250,230, 29, 94,124,225, 6,119,238,188,200,181,235,151,193,
+213,100,121,202,237, 23, 47,115,253,250, 38,243,139, 27, 92,186,176,195,151,222,188,197,229, 75, 59,188,252,210, 11,236,236,108,
+243,242,203,215,216,220,202,153,110,140, 89,156,118,108,111,109,242,252,104,197,245, 91,115,118,174,205,137, 83,152,140, 34, 10,
+ 19,243,141,175,255, 50, 95,254,210, 29,110,222,122,129,110,177, 38,119, 37,163, 81, 1,113,198,214,165, 75,148, 39,199,244, 42,
+229,201,179,167,120,165,120,118,112,202,170, 44,201,199, 83,166, 27,115, 38,211, 9, 77,213,162,227,136,128, 34, 53,134,106,177,
+100,177,172,185,124,245, 10,206, 15,156,238,174,167,174, 75,186,222,178,118,134,178,111,229, 64, 13,103,130, 15,113, 29, 4, 37,
+194,154, 52, 79,135,135, 71,128, 21,222,139,127,120,185, 92, 50,202,243,161,242, 51,128, 34,141, 35,210, 36,165,239,100,151,149,
+100, 41, 70,105,218,174, 27,198,145,114,200,116,157,149,177, 85,128, 44, 21, 38,119,150, 8,165,203, 5,233, 98,189,142,104,170,
+134, 43, 23,182,184,247,217, 83,226,172, 32,164,176,125,233, 50, 87, 47, 93,229,203, 95,249, 34, 87, 46, 93,225,206, 23, 95,231,
+248,248,136,173,157, 45,137,225,205, 34,238, 63,120,128,247,158,190,107,121,250,108,151, 63,255,235,191, 98,239,217,231,156,158,
+158,242,108,127,159, 31,253,224,135,188,250,234, 75,220,120,241, 10,125,223,179, 88,173,249,244,243,135, 44,155,142,182, 15,152,
+ 36, 33, 50, 17,222,123,146, 44,149,195,194, 7,178,193, 47,140, 22,207,179, 49, 6, 15,152,200,160,149, 38, 50, 17, 90,201,126,
+ 54, 73, 18,226, 36, 22,133,247,176,131,147,216, 71,135,242, 78,246, 93,190,167,235, 61, 65, 43,190,124, 61,227,214,213, 77, 22,
+ 39, 53,167,135, 75,174,238,140,168,215, 53, 63,189,187,199,113,128,173, 89, 70,145,196,212,189,227,194,246,140,215, 95,216,226,
+193,163, 35,158, 29,183,172, 78, 86,252,242,155,215,121,243,230, 22,127,242,135,175,243,187, 95,189, 14,206,241,127,252,236, 57,
+117,231, 48,177, 68,123,142,139, 20, 99, 12,218, 32,151,179, 15,180,195,250, 43,248,192,227,253, 67,238,188,252,146, 28, 14,214,
+210,244, 61, 71, 39, 39,148,101,133,181,142,101, 41, 44,251,166, 23,235,149, 11, 30,235,252,249,129,210,118,130, 17, 93, 46, 86,
+ 28, 45, 22, 20,163,156,229,106,197,186,170,137,181,166,108, 26,180, 81,244, 77, 75,239, 44,117, 93,129,254, 69,214,181,142, 13,
+145,209,114, 9,245, 29,182,235,168,235,150,179,232, 97,188,199,104, 48,169, 30,118,206,144,100, 99,194,176, 67,204,139,140,106,
+181,162,110, 42,148,226,252,207, 21,199, 2, 61,209, 42, 34,206, 34, 89,241, 89, 47,233,124,125, 77,215,116,164,163, 17, 70, 27,
+153, 64, 69, 17, 89, 38,187, 76,233, 60,173, 60,255,131,192,175,239, 90, 58,235,200, 6,145, 95,219,247,216,174, 35, 27, 73, 14,
+184,136,169,212,217,121, 78,154,102, 40, 52,157,149, 11, 71, 13,157,165,115, 3, 78,181,179,100, 69, 14, 90,172, 86,145, 49,180,
+182,197, 68,226,207, 6, 17,229,245,189, 40,232,235,106, 77,240, 48, 26,229,228, 69,142,100, 96, 20, 56, 39, 42,237,128, 8, 14,
+141,145,209,107, 61,184, 20,198, 67,212,172,247,146,136, 22, 27,161,123, 74,164,115, 71, 8, 18, 73, 42,151,114, 74, 20, 25,218,
+170,166,237, 68,137,173,141, 68, 76, 39, 73, 34, 36, 53, 47,118,173,179,164,190,179,164,203, 52, 23, 46, 66,223, 75,104,138, 66,
+ 49,154,141,185,116,249, 6, 7,123,251,188,245,197, 47,177,251,244, 41, 58, 17,206, 64, 90,164,212, 77,207,100, 60,165,239, 5,
+ 61,172,180, 70, 17, 49,154, 20,164, 70,208,209,210, 4, 56,108, 47,209,218, 50, 69, 72,136, 35, 72,134,192,155,182,233,104,219,
+ 30,239, 58,132,195,174, 49, 74, 10,162,114,189,166,235, 90,230,155, 23,105,154, 53, 93, 91,203,115, 94,213,228, 69, 78,185, 94,
+ 19, 80,231,207,127, 32,144,197, 9, 4, 33,176,165,169,144,221,226, 72,166, 52, 74,203,228,210, 12,151,103, 20,137,157,218,107,
+137,251, 62, 35,189,157,187,190, 20,100, 81, 68,211, 52, 2,168,106, 91,218, 86, 32, 71,103, 90, 18,107, 45,113, 28,137,214, 76,
+ 5, 78, 79, 23,244,157, 36, 82,158,229,222, 39, 73,130, 49,178,223, 78,178,140, 44, 21, 91,165,252, 28,196,243,144,102, 41, 18,
+158,102, 68, 7, 16, 15,185, 11, 89,118,158, 76,218,181, 45,113,244, 11,194,107,150,166, 18,146,228, 3, 40,117,142, 8,110, 59,
+ 89, 83,157,221,205, 73, 28,203, 5, 63,219,222,254,118,146, 74, 69,217,180, 45,117,211,160, 20,148,171, 53,177, 22, 56,129,137,
+ 12,145, 54, 20,186,230,224,209, 35, 14,246, 78,249,189, 63,252, 22,127,244,187,191, 70,174, 34, 30,124,250, 41,159,191,247, 30,
+ 71, 75,203,111,254,206,239,178,185, 57,198,250, 22, 21,122,102, 59, 51, 46, 94,152,113,239,147,159,179, 60, 94,177,251,100,143,
+ 7, 31,127,196,169,213,148,241, 24, 29, 39,120,175, 72,179, 17, 7, 39, 75, 46,236,108,210,215,199,156,156, 28, 17,101, 57, 23,
+ 47, 93,228,141, 55,238,240,165, 47,190,193,229, 11, 27, 28,236,238,210, 46, 27,158, 63,121,198,163,187,247,233, 7, 78,240,163,
+135,187,184,166,231,149,151,111,208,156, 30,242,240,238, 3,170,253, 67,182,178,132, 56, 74,152,111,205,168, 23, 75,138, 60, 38,
+143,103,188,118,235, 53,210, 40, 98, 60,202,120,245,181, 87,249,245,175,125, 21,237, 19,158,237,238,226, 77,196,229, 27, 23, 72,
+210,152, 59, 47,221, 98,156, 40,182, 55, 82,246, 31, 62, 66,235, 64,165, 21, 35, 20,165, 85, 60, 63, 57,226,244,120,193,231,143,
+158,209, 13,123, 23,165, 61,139,147,138,107, 87, 47,208,247, 29,199, 39,199,232, 56, 65, 43, 13, 74,170, 71,219,148,226,225, 93,
+173,169,235,154, 16, 2,141, 78, 89,180,210, 97, 57,235, 16,123,207, 74, 14,236,174,149, 96, 21, 6,127,165, 15, 68, 38, 66, 1,
+171,213,138,170, 42,169,171,122, 24, 23,118,231, 59, 61,107,197, 75,107,157,103,148,231,178,227,177, 98, 21, 10, 67, 57,154,164,
+ 9,214,246,228,121, 78,100, 18,186,190,147,209,208,240,235, 38,138,136, 80, 40, 51,140,181, 85, 76,185, 60,226,246,237,107, 92,
+220,218, 98, 99,115,131,194, 71, 92,191,180,205,116, 99,147,245,106, 69,112,242,125,237, 62,221,231,253,247,223,231,228,228,136,
+182,107,121,242,232, 17,119,239,222,165,108, 26,232, 53,206,203,203,180,183,187, 79,215, 46,200, 70, 9,167,101,197,186,181,172,
+ 59, 71,148,228,146, 49, 96,164,242, 78, 51, 25,147, 38,145, 16,187,208,144, 68,137, 4, 57,120,143, 66,118,233,222, 73, 69,222,
+ 54,253, 48,117,144,174,221,123, 79,219,181, 56,103,113,222, 10, 20,164,151,132,179,224,135, 80,162, 97, 23,250,233,222,138,175,
+191, 52,101,107,146,241,226,205, 29,156,117,208,119,172,214, 61,139,206,241,238,195, 21,243, 2, 46,110, 77,240,168,115,229,236,
+173, 23,183,233,234,134, 77,229,184,122,109,147,182,247,212,173,227,111, 63, 62,229,127,248,171, 93, 78,107,203,104, 99,134, 73,
+ 18, 78,235,146, 85,221,211,245, 34, 48,202,210,152, 34, 75, 24, 21, 5, 69, 94,144,230, 5, 65, 41, 46,239,108,243,242,141,235,
+164,105,202,184,200,152, 78, 38,244,214,243,232,233, 83,246, 14, 14,168,234,154,147,197,138,163,211, 83,161, 63,198,178, 31,175,
+135, 14,189,237,122, 14, 79, 78,217,221,127,206,230,108,194,201,106, 69, 93, 53,226,229,174,155,243, 34,208, 57,203,100, 58,165,
+110, 26,234,178, 38,138, 68,233, 77,128,141,249, 22, 90, 5,142, 14, 23,244,214, 81,228, 9, 89, 86,208,117, 43,250, 1, 84, 85,
+ 87,146,236, 85, 20, 35,210, 98, 4,193,163, 6,129, 82, 91,182,152, 36,161, 24, 23,244,182,195, 91,209, 13, 68, 73, 66,176,142,
+ 36,137,241, 94,128, 48,174, 23,149,119,185, 60,165,170, 42,162, 40, 38,202, 98, 92, 39, 58,145, 98, 52, 18, 70,120,219,210,187,
+158, 73, 81, 80,213,237,249, 62,213, 90, 75,145,231, 40, 4,252, 18,199, 67,194,163, 49,231,239,155, 31,126,222,198, 72,252,106,
+181, 46,241,125, 47, 43,132,166,195,186,158,174,174,105,215, 21,182,183,116, 77,141,183, 86,236,114, 78,172,108,103, 7,187,144,
+205, 18,124, 80,244,193, 19, 37, 9,160,105,234, 10,113, 7, 64,112, 78, 64, 50, 94,194,102,186,174, 99, 52,202, 49, 70,146,194,
+178, 92, 46,130, 51,161,151,128,127,100,202, 38, 42,115,185,148, 36, 81, 78,130, 78, 20,210, 69,246, 93, 71, 20, 37,242,117, 18,
+ 9,186, 73,226, 76, 2,102,148,162,107,197, 85, 96,173, 69,105, 67, 83,201, 5,114,122,114,130,179,150,151,111,191, 66,146,164,
+124,252,201, 93, 54,103, 83,234,186,165, 40, 10,214,101,201,246,124,142, 54, 17,189, 21,144, 14, 74, 40,116,202,104,156,147,189,
+182, 6,156, 10,248, 94, 38,159, 58, 82,164,153,124, 6, 93, 47,207,159, 48,245, 3, 78, 57,170,117,201,108, 54, 97, 54, 25,179,
+ 92, 87, 44,151,242, 76,229,121,198,179,221,135,132, 32,236,147,182,149,196,188, 52, 73, 40,171,146,128,240,248,125, 16, 76,113,
+211, 86, 8,178, 88,166,115, 74, 43,154,225, 78,112, 94, 18,247, 92,144,104, 96,215, 91, 76,146,160,181, 56,135,140, 17, 17,154,
+115,142, 56, 77,208,145,156,137, 73, 28, 83, 53,146, 0,121, 22, 37,222, 91,153,154, 57,231, 68,197,111, 45,109,219, 75,119,236,
+ 7,167, 68, 8,128,196,132,103,169, 0,146,210, 76,114,232,147, 36, 30, 40,132, 50, 1,207,114, 33,208,157,141,235,179, 84,154,
+ 20, 23,164,240, 91,151, 37,189, 19, 54, 76, 83, 55,232,200,176, 46, 75,153,128, 4, 48,145, 44, 67,210, 88, 50, 89,140,150, 70,
+ 70, 43,141, 41,102,179,111,183,125,135,209, 2,168, 16, 9,190,120, 17, 37,154,212,241,210,141,109, 70,122,197,143,126,240, 17,
+ 93,235,248,147, 63,249, 99,178, 80,178, 62,170, 40,166, 27,252,236,167,111, 51,187,118,131,255,228, 63,255,231,232,196,242,224,
+243,123,204, 71, 35,202,227, 67,252,209,115, 62,255,228, 19, 30, 61, 91,147,111, 94,225,147,251, 79, 56, 12, 41,183,238,188,193,
+ 11, 87,231,188,255,254,199,180, 78,179, 89, 36,244,182, 65,121, 69,213, 42,174, 94,189,206,173,151, 95,165, 72, 13,245, 98,193,
+131,251,159,241,103,127,250,175, 56, 93,214,212, 93,224,211,251,247,121,248,108,143,174,135,189,195, 5, 85,181, 70,231, 5,139,
+117,197,243,189, 37,214, 69,140,102, 19, 92,215,176, 90,173, 25, 23, 27,220,249,194, 91,236, 92,184,204,175,254,218, 87,185,124,
+121,147,117, 89, 51, 73, 51, 86, 39, 11,110,223,184,140,235, 27, 78,142,123,182,230, 59, 40, 45, 7,205, 59, 31,190,205,123,239,
+191,203,123,239,126, 66,154, 90,246, 79, 61,149,115,116,222,208,184,136,199,123, 79, 57, 89, 86, 56,219, 19, 23, 25,168,152, 81,
+145, 82,100, 25, 89, 20,179, 90, 44, 25,141, 11, 76,108,232,186, 14, 23, 60,121,145, 51,222,152,147, 20, 17, 77, 85,115,186, 88,
+144,110,110,177,172, 69, 1,235,188,140,186,206, 84,204,178, 52, 10,244,125, 55,168, 43,219,193,147,236, 41,235,146,196, 68,131,
+194,243,236,247,203,142,242,172, 18,141,227, 88,210,232, 66, 32,205, 50,218,186,162,105, 69,152,213,246, 29,237, 48, 54,138,226,
+ 68, 44, 57,177,112,193,123, 20,192,223,152, 0, 0, 32, 0, 73, 68, 65, 84,235,228,130,111, 90,122, 47,182,155, 56,205, 80, 4,
+214, 86,113,178, 92,177, 94,175, 40,208,212, 85, 73,189, 94,114,112,188,228,241,227,199,132,166,229,254,131,135, 44, 23,167,172,
+ 86, 21,229,106, 77, 93, 86,120,161, 61,112,124,124,200,100,154,114,225,202, 22, 30,197,186,169, 49,197,148,164,152,146,100, 57,
+ 38,146, 49,175, 82,106,248, 95, 8, 65, 70,229,182,109,104,250,142, 40,142,241, 46, 16,197,134,166,170,164, 4,145, 47, 15, 65,
+ 58,194,174,235,192, 13,241,159,177,164,123, 57,239,206,126, 11,214, 90, 52,129, 56, 77, 68,153,220,119,231, 88, 83,147,141,121,
+190,234,249,253, 87,198,216,160,120,225,133,109, 46, 92,221, 70,121, 71,230, 3,127,248, 91,183,121,243,206,101,130, 7,197,224,
+141, 30, 62,167, 91,215, 54,185,250,194, 14, 79,158, 30,177,179, 53,225, 7,247,142,248, 31,255,244, 35,246, 78, 42,166,211, 41,
+ 90, 15, 42,104,165,101, 90,160, 52,104,197,104, 60, 35,202, 50,106,103,135, 17,177, 36,139,185,224,249,135,255,224,235,204, 70,
+ 5,121,158,147, 14, 34,171,186,105,248,252,241, 46,167,139, 37,167,235, 37, 71, 39,167, 28,158, 44,132,206, 21, 2, 85,211,178,
+174, 74, 78,151, 75,238, 63,126,130, 71, 88,213,199, 39,167,212, 3, 1,171,179, 18, 47,154, 23, 99,166,211, 41,117, 85, 18, 2,
+ 50,170,244, 94,192, 41,113,224,240,249, 33,214, 65, 89, 55,231, 5,225,133,157, 57,206,138,178,248,228,104, 73, 26, 69, 44, 27,
+161,207,101, 89, 70,150,103,180, 85,141, 2,108,215, 12, 29,232,136, 56, 17,145,166, 15,158,241,116,131,174, 23, 75, 80, 90,164,
+ 36, 90,139,179,163,183, 2, 20,241,129,182, 94, 99,251, 64,146, 38,100,121,142, 30, 58, 35,137,158,108,233,250,158,201,100, 74,
+ 93, 85,242,249,164, 41,109,219, 98,140,193, 89,203,106,177, 16,231,142,181,148,171, 37,190,237, 40,151, 43, 78,143,159,179,124,
+190, 71,181, 88,162,131, 67,227,105, 87, 75,130,109,113, 77,141,175, 43, 92,223,226,235,138,174, 42,161,235,233,170,138,174,174,
+ 8,109,143, 9, 18,142,211,181, 13,174,109,229,223,107, 91,250,170,166, 92,157,210, 55,141, 80,201,202, 21,101, 89,226,218,150,
+182,105,168, 42, 9,191,170,214, 13,171,213,146, 56,138,206,159, 61,107,173,164,188,197,241, 48, 81,144,139,197,246,150,166,237,
+206, 59,185, 56, 82,160, 21,113, 20,225, 92, 79,211,244, 12,193,216, 50,249, 65,201,136,120,232,250,147, 36,161,105, 58, 41, 78,
+ 21, 2,122, 49, 17, 90,123, 60,129,141,209,156, 71, 79,119,153,111, 93,192, 59, 71, 18, 71,232,160, 56, 58, 57,225,194,197, 29,
+249,172,123,139, 86, 96, 48,160, 3, 93,235, 81,218, 13,103,148,168,201,227, 56, 98,103,123,147, 81, 49,102, 50, 25, 99,180,193,
+246, 34, 22, 11, 33,224,154,118, 56,210, 20,105,158,203, 5,104, 61,117, 83, 49,159,111,209,182,107,214,235, 21,145,142,200,243,
+ 12,163, 52,101, 89,146,166, 25,177,145,192,175,178, 42, 57,139, 73,141,226,152,186,148,127, 62,155, 94, 26, 99, 48, 90,138, 84,
+163,135, 21,178,115, 40, 45,120, 99, 99,212,249,249,120,134,147,174, 43,113, 19, 40, 96, 50, 30, 81, 85, 18,211,237, 7,139,105,
+150, 72,138,105, 20, 9,128,173,179,253,160, 61,233,168,234, 90, 32, 59,157,208,228,148, 82, 56,215,203, 26, 72, 49, 80,239,192,
+182, 61, 30,232, 59,153, 56,248, 16,206,167, 67, 93, 39, 89, 42,189,237,137, 6,161, 98,221,212, 8,210,218, 16,153,152,166,150,
+117, 78,150,231, 36,177,160,157,215,229, 90,126,159,151, 9,152,186,122,251,118,104,172,140, 88, 20,103, 73, 78, 43,169,148,210,
+152, 87,111, 78,249,251, 31,190,143,111,225,229, 87,111,242, 75,111,189, 74,181, 56, 38,141,102,188,241,203, 95,225,217,209, 9,
+243, 11, 23,120,233,149, 23,233,251,146,221,187,159,147,160,105, 67,203,179,123,239,177,247,248, 25, 46,191,196,198,165,107, 4,
+ 19, 19,199,138,249, 60,227,239,190,255, 35, 9,129,199,115,253,210,156,131,167, 79,136, 77, 96, 54,154, 97,139, 9,241,100,147,
+128,161, 90,158, 82,158, 28,242,244,240, 57,227, 60,227,241,163, 3,162,108,204,116,154,178, 60, 93, 48,205, 19,234, 94, 70,167,
+ 58, 27, 83, 76,103,108,204, 70,236,108,108,177,119,248, 20,215,195,178,116,236,204, 55, 96,125,128,143, 50, 54, 46,108,178, 56,
+ 56,165,200, 34,170, 85,137, 11, 10,175, 12,101,219,242,234, 27,175, 65,148, 98, 88,115,239,227, 79,249,232,179,231, 76, 55, 13,
+171,165, 88,249, 50, 51, 97,150,197, 92,221,154,113,218,214, 60,123,126, 72,143,161,152,140,104, 26,203,133,249, 5,140,234,232,
+234, 6,148, 38,232,132, 52,137,197, 30,227, 45,105, 44,145,160,139, 85,201,120, 82,208,215, 53, 93, 58,198, 7,197,170, 44,113,
+ 94,118,195, 82, 4,244, 4,103,153,142, 70,104,173,169, 26,241,230,106,165,207,109, 20, 74, 41, 76,164, 25,143,167, 44,151, 75,
+ 20, 96,162,132, 52,137, 24,138, 87, 66,240,178, 63, 82,138,217,120,138, 50, 10,219,118, 84,109,131, 54,154,209,104, 36,106, 98,
+ 28, 27,179, 13,233,104, 16,241,135, 68,104, 10, 22, 19,175, 17, 79,177, 40,120,147, 72,212,215,125,215, 8,166,181,107,152,140,
+198,120,215,145,105, 77,100, 20, 81,156, 97, 76,196,186,109, 88,173, 78, 49,197, 24,101, 18, 44, 82, 17,163, 4,118, 19, 0,163,
+204, 80, 1, 55,104, 35,187, 43,235,197, 34, 18, 28,184, 65,161,155, 38, 9,113, 38, 17,193,206, 89,138, 34,103,185, 92,162, 35,
+131, 63, 75, 42,210,145,140,227, 29,195, 45,175,176, 78,166, 15, 90,203, 5,138,119,231, 29, 80,154,167,152, 16, 73, 87, 73,160,
+169, 26, 70, 69,142, 86,138,219,115,205,127,255, 31, 93,231, 11,215, 11, 18, 45,227,255, 72, 11,254,213, 58, 15,193,227, 3, 24,
+ 37,123,225,200,104,196,155, 13,117,239,249,223,223, 62,224,127,251,187,103, 28,156, 44, 80,109, 75, 58,155, 48,157,204,232,186,
+142,120,216,217, 73,112,131, 40, 88, 21, 66,199,243, 40,246,246,158, 97,187,158,139, 87,175,242, 95,253,163,111,113,231,230, 77,
+202, 86,226, 62, 9,176, 42, 75,234,182,229,254,195,199,172,170,146, 34,205, 40, 70, 5,207, 15, 14,145,136,213,148,166,169, 56,
+ 93,174, 41,171,154,173,205, 25, 0,207,246, 15, 88,151, 21, 54,136,192,231,224,248,152,166,110,184,112,233, 50,222, 87, 28,236,
+159, 50,223,222, 34, 4, 41,242,109, 47,130,159,224,228,135,229, 60, 82,160,102,134,241, 40, 3,107, 89,183,150,190, 21,124,169,
+ 6,210, 60,149, 21,158, 23,244,103,213, 52,216,222,146,196, 9, 12,123,106,107, 45,121, 49,198,104,205,186, 92,227,157, 5,173,
+105,154,138,166, 21,139,142, 70,145, 36, 50, 46, 86, 33, 16,180,193, 97, 72,243,156, 36,207, 24, 21,178,135, 14,214, 99,189, 48,
+228,125,219, 17,250,150,214, 5, 34, 45, 22,220,182,151,255,127,105,107,204,201, 90, 10,217, 68, 71,232, 88,139, 64, 82, 9,139,
+195,186,142,208, 5,225,179, 35,239, 80,148, 36,242,189, 41, 61,124, 15,138,128, 92, 14, 77, 45,120,233, 60,207, 81,177,236,111,
+235,186,230, 12,177, 27, 37,146,213,221, 59, 75,172,196, 87, 45, 35,107,143, 50, 6, 53,236, 73,215,235, 53, 2,155, 1, 21, 20,
+ 58, 18,161, 93, 54,206, 73,210,152, 52,203,229,242,178, 14,173, 21, 73,172,209, 81, 34,151, 98, 8, 56, 31,164, 19,236,237,240,
+ 19,240, 16, 36,119, 91, 25, 67,164,164,155, 12,200,239,245, 46, 80,213, 37, 32, 9,114,177,142, 9, 33,226,116,217,178, 57,221,
+ 64, 71, 48,202, 71, 60,121,250,136,186,106,153,111,205,152,109,204, 57, 62, 57,161, 92,158,162,163,132,190,115,191, 56, 47, 16,
+152, 82,154,165,236,108,205, 73,243,140, 60, 21,198,127,185, 90,241,116,239, 25, 77, 45,236,244, 36,210,204,231,219, 92,188,120,
+113, 56,167, 60,182,179,228, 89, 76,146,229,252,253, 79,254,134, 44,203,153, 78, 39,120, 15, 33,184, 97, 29,225, 89, 87, 43, 17,
+185, 69,194, 76,177,214,201,152,221,136, 74, 93, 10, 78, 6,212,111, 68, 8, 34, 16, 60,107, 90, 69, 28, 41, 98, 74, 59, 76,232,
+ 84,144,143, 44, 26,166, 36,214,185,193,126, 41,159, 85,154,165,224,160,237,106,214,235,138,174,179,104,141, 20, 5, 78,240,195,
+125,223,145,100,177, 88,227,146,152, 60,207, 25,143,198,152,225,130,118,225, 23,118,196,166,237,200,226,148,160, 3,193,203,250,
+130, 16, 88, 45,151, 20,227, 49,206, 90,208,208, 53, 98, 45,175,155,154, 60, 31, 17, 25,141,243, 98,209,211,200, 52,195,121,207,
+106,181, 36, 4,177, 4,170,107,175,191, 30,244,176,116, 15, 61,196, 70, 49,154,196,140,148,101,239,241, 62, 93, 85,243, 79,254,
+241,239,161, 66, 79, 74,202,238,211, 71,204, 54,119,120,225,197,155,132,209,132,203,215,174,208,183,107,142, 15,158,211,173,151,
+116, 77,199,120, 54,101,113,184,207,223,252,235,239,176,121,225, 6,215,110,190,128, 67, 17,124,203,209,254, 46, 15,159, 62, 99,
+ 62,159, 19,108,207,201,201, 41, 69,146,114,235,198,117,174,221,188,197,229,155, 47, 19, 92, 75,189, 60,225,189,159,189,195,222,
+243, 35,238,126,242,144, 19,167,152,196,129,108,148,145, 36, 17,243, 89,142, 82, 17,143,246, 79, 73, 66, 67,150, 38, 52, 93, 71,
+ 80, 49, 38, 54,148,235, 26,128,178,214,140, 38, 16, 25, 25,131,196,113,132,107,107, 66,128,241,120,130, 15, 14,173, 83,217,141,
+100, 57,182,235,201,139, 28,223, 91, 76,168, 57, 56, 90, 49,153,111, 48,157,140,153,231, 35, 78, 86,167, 82, 21,245, 29, 7, 71,
+199,114,184,198, 25,197,120, 76, 28,197, 36,103,200, 75, 5, 81,156,161, 12, 24, 34,250,186,165,117, 45,106, 80, 92,219,166, 33,
+ 4,139,203,102,172,187,112, 94,197,142, 71, 99,170,166,101, 60, 42, 48, 74,227,149, 60,162, 89, 34,135, 14,136,157,165,119, 98,
+101,106,234,154,141,141, 77,130,117,216, 40,194,123, 71,145,166,216, 65, 12,102,134, 7,183,183,150,200,104,154,186,161, 40, 36,
+202, 16,165,168, 43, 25,243, 4, 32, 45,114,240,129, 52, 75, 72,163, 20, 84, 64,155, 4,235, 44, 77,215, 97, 76, 12,202,211,247,
+210,149,170, 72, 19,250,128, 54, 34,102, 92,213, 53,190, 19, 15,169, 81,129,196,104,206,178, 1,242, 60,103, 93,213,140, 70, 99,
+ 18, 35, 89,196, 90,137,224,170,174,219, 97,213,169,134,137, 65, 68, 59, 80,179,100,252, 40, 30, 76,219,117,231,221,123,158,231,
+178,143,213,138,190, 23,241,213,104, 52,146, 21, 68,223, 35, 88, 10,206, 95,240,188, 72,209, 58, 62,127,121, 8, 67, 10, 88, 36,
+ 80,149,166,174,137, 18, 17,134,213,117, 73, 50,136,112, 92,240,116, 77,131,138, 99,110, 76, 13, 47,109,101,204, 71, 9, 47,204,
+ 98,110,238, 20, 36, 38,160,130,165,106, 61,139,198,146,199, 26,143, 98,217,122, 14,106,120,231,241,154, 15,246, 58,148, 22,146,
+214,114,185,132, 32,226, 67,140,193,245,253,249,116, 37,156, 21,105,122,216,145,102, 25, 7,143,158,160,199, 99, 38,163, 49,175,
+220,188,206, 63,254,205, 95, 39,137, 13,182,179,180,189,120,102,243, 92,108,167,103, 62, 90,173, 53,123, 7,135,124,240,201,167,
+ 50,134, 12, 74,198,197, 74, 49,202, 83,154,166, 99, 89,174,233,218,142,186,105,137,162,136,135,123,187, 44, 78,151, 24,109,216,
+220,218,160,235, 58,206,224, 38, 93,219,145, 36,146,154, 85,215, 53,202, 59,172,245, 88,219,161,148,240, 14,186, 94,216,227, 0,
+ 59,179, 24,215,244,144,102,180,206, 81, 87, 61,243,233,152, 40, 75,176,109,199,217, 85,109,180, 34, 77, 98,185,164,173,195,196,
+ 50,234,111,219, 94,158,117,229, 89,173,106,156,147,175,171, 21,164,121, 6,189,136,219, 34,163,207,187, 45,173, 53, 58,138,240,
+193,210, 55, 61,109,215, 19, 25,205,107,175,222, 70, 71,154,201, 36,231,173, 59,183,105, 87, 39,140,211,132,103,207, 23,252,217,
+119,126,194, 56,207, 64,105, 48,195,225,220,159,121,241,165, 0, 8, 94,225, 97,248,126, 52,232,232,252,123, 9, 65,114, 5,218,
+170,145,233, 65, 20, 13,151,139,161,174, 74,166,211, 41, 61,129,152,132, 16, 58,214,235, 53,206,245, 24, 29,147,196,131, 50,126,
+ 56,240,219, 97,221,229,177, 24, 21,163,180, 34, 24,136, 80,162,239,232,123, 58, 39, 9,115, 65, 41,146, 44, 99,182, 49,149, 16,
+153, 32, 94,235, 0, 76,199, 83,148, 54, 40,173,100,157,224, 29, 58,112, 46,152, 77, 83,209, 73, 68,137,112, 13, 80,162,163,234,
+173,197, 53, 29, 42,213,132,160, 89, 29,183,164,105, 6, 65,177,170, 74,146, 36, 97, 99, 99,198,114,185, 26,128, 63, 96,173, 25,
+214, 92, 10,135,147,105,160,239,241, 14,180,142, 72,242,132,113, 49, 98,190, 57, 99, 52,158,208, 54, 53,203, 69, 73,239,123,180,
+150,116,196, 73, 49, 2,196,175,157,102, 49,182,109,184,242,229,215,233, 85,195,135,255,230, 59,244,182, 30,214, 98, 35, 76, 44,
+122,158, 44,203,232,250,158, 40, 74,196,213, 19,155, 33,162,148,243, 29,248,122,189, 6,100,133, 49, 25, 77, 48,145, 62,231, 25,
+160, 53,222,122, 66,144,244,205,206, 74,161, 51, 26, 21,148,165,116,235, 81, 20,145,166,153, 76,123,180, 38,201,115, 18, 35,231,
+ 65,211,118, 28, 31, 30, 10, 87,164,107,207, 59,125, 31,164,227,118,206, 17, 37, 41, 59, 91, 91, 66, 10,212, 26,207, 64,141,115,
+ 22, 19,157, 1,155, 4,210,150, 37, 57,214,187, 1,168, 3,105, 28, 83,174,215,228, 69,193,114,121, 10, 65,211,116, 13, 1, 89,
+191,108,108,108, 12, 83,214,150,190, 21,107,103,154,166,216, 86, 82,243,212,237,175,124, 53,104, 99,232,109, 79,223,116, 92,152,
+231, 60,252,228, 30,116,142, 87, 95,186,204,141,107, 87,105,214, 75, 32,225,181, 55,223,160,172, 75,138, 60,131, 40,225,165, 59,
+ 55,176,173,103,113,178, 96,190, 51,197,150, 13,159,124,250, 25,113,191,226,223,126,231,251,108, 92,122,153,203,151, 47,242,248,
+249, 62, 15,238,127,142,111, 79,233, 58,104,173,226,229, 91,215,184,120,105,206,206,252, 50,171,211, 35,166,227,130,199, 39, 43,
+ 46,143, 99,254,213, 95,189, 77,131,167, 24, 68,136, 27,243, 12,213, 15,202,222, 60,101, 52, 78, 89,157,214,216,206,178, 92, 87,
+140,210,152,101,221,177,150,162,134, 36,210, 2, 46, 48, 25,145,150, 7, 88, 17,200, 50,217,195, 86, 85, 69,217,136,186,120, 99,
+ 99, 74,142,176,141,139, 81,129,201, 82,116, 60,198,105, 77,154,196,156, 30, 60, 27, 70, 87,129, 56,203,176,189, 40,116, 15,247,
+ 15,201, 39, 57,135,135,107,218, 62,112,245,210, 22, 55,175, 95, 65,105, 56, 62, 60, 97,115,186,193,100,115,202,201,241, 17,235,
+229,154,182,174,241,200, 37, 19, 37, 67,186,143, 78,104, 85,204,114,189, 6, 37,118,151,217,108,134, 82,122,168,218,213,240,123,
+ 35,206,172, 50, 81, 20,201, 65, 82, 11, 81,201, 24,195,120, 60,198,123,135, 69,168, 67,121,122, 54,186, 14,210, 5,122, 47, 59,
+114, 47, 97, 22, 66, 50,211,104, 35, 94,217,166,235,241,125, 79,239, 29, 12,191, 86, 20, 99,210, 44, 70,171, 33,193, 41, 40, 92,
+240,244,182,195,121, 68, 37, 62, 84,254, 70, 71, 40,131,116, 75, 94,196, 70, 33, 72,100, 98,235, 90, 98, 37,236,122, 81,185,230,
+164, 81, 2, 90, 44, 49,224,233, 58,207,104,156, 83,150, 37,193, 6,188,242,232,179,238,200,251,193, 83,142,216, 85,188, 0, 59,
+240, 34,180, 50,113, 76,150,202,158,172,239,196, 23,155,164, 41,214,123, 34, 99, 8, 65,170,218,179, 75,175, 44, 75, 8, 65,124,
+166, 94,120,219, 74, 41,138,241,152,186,148, 68, 58, 81, 80,247, 68, 70,126, 45, 74, 18,217,201, 57, 71, 22, 15,135, 33, 82,205,
+ 71,145,120,152,227, 52,193,245, 61, 90,131,138,132, 58,149,166, 25,113, 28, 9, 67,188,151,149, 86,158,139,240, 74, 5, 69,211,
+ 84,152, 56,197,219, 30,162,136, 40,156,245,184, 10,137,107, 28, 50,209,189,151,112, 22, 99,248,141, 55, 95,227,171,175,191, 10,
+ 1,186,222,194,176,223,108,218, 14,215,247,180,125,127,126,201,159,156,156,240,236,224,128,166,149,177,228,124, 99,131, 16, 2,
+187,251,207,105,218,142,166,235,112,189, 99, 52,202,249,236,201, 19,214,235, 21,193, 7, 38,211, 41,235, 85, 41, 10,119, 43, 96,
+142, 52,145, 48,141,195,227, 19,102,147, 41,243,217,152,166, 90,114,186, 88, 18,180, 34, 38,176,110,193,202,153,201,214, 40, 38,
+142, 98,124, 28, 97,173,231,248,184,100,115, 62, 69, 7, 75,240,210,133, 10, 39,187,167,152, 76,233,187, 30,123, 38, 94,114, 3,
+195,155,128,239, 44, 22, 79,221,180, 72, 33, 32,190,100, 29,201,164, 37, 56,133,210,210,105,186,222, 81,150, 53,193, 57,174, 93,
+189,196,215,126,237, 75,124,243, 55,191,206,254,254, 83,142, 15, 15,185,119,247, 46,161,235, 72,243, 20, 21, 37,252,197,247,223,
+197,104, 3, 70, 46,111, 25,215,246, 67, 49, 40, 63,123,133, 18,158, 0, 17,113, 36, 57,219,222,202,231,105,173, 39,207, 82,122,
+215,147, 36, 25, 38, 74,208,202, 17,208, 52,117, 45,239,140,151,120,217,170,238, 72, 83, 37, 99, 95, 18,156,147, 93,188, 82,138,
+ 96, 3, 54, 8,198, 20, 32, 74, 19,112,158,172,200,233,186,142,174,173,209, 42,162,110, 4, 88,162,213,217,239, 85, 68, 73,202,
+100,107, 78, 94,164,172, 86, 21, 74, 41, 54,166, 27,114,137, 43, 77,223,118,152, 40, 26,196,102,158, 40,138, 57,163,192,233, 97,
+ 74,128,247, 36,105, 70, 89,174, 40,138,130,170, 44,137,162,136, 55,222,248, 50,222, 26,190,251,189,239,177,177,185, 77, 28,197,
+204,198, 19, 14,219, 19,244, 58,224,227,136,182,148,181,151, 67, 38, 84,249, 32, 80,244, 65,236,119, 65,121, 70,249,132,141,141,
+ 9, 89,150,209,182, 50,121,243,182,195,217,150,124,188,201,149,151, 94,103,114, 41,101,245,224, 25,229, 98,197, 87,254,155,255,
+154,233, 44, 99,255,157, 31,115,247,237, 31,113,239,239,127, 66, 20,199,140,139, 49, 81, 26,209,117,150,200, 40,140, 73, 88,173,
+215, 4, 5,120, 24, 21, 57,206, 5,234,186, 36, 43, 10,234,245, 10,231,165,185, 25,143,199,164, 73,116, 46,106, 60, 19,193, 37,
+ 73,194,122,189, 34,141, 19, 44,129,166,109, 24, 23, 99,170,178,164, 24,201, 4, 9,163,193, 43,234,182, 38, 75, 36,249,239,232,
+240,144,222, 74,170, 95,148,196,120,231,113,214, 18, 37, 9,117, 85, 97,180,161, 24, 21,204, 55, 54, 7,215,149, 37, 75, 98,206,
+184, 7, 33, 4,180,150,201,164,214,230, 23,205, 69,211,208,116, 29,227,129,138,185, 90,172,206,255, 59,117, 93,145, 23, 5, 69,
+ 81, 80,183, 13, 69, 38,168, 99,217,243,151,140, 70, 35,105, 12,110,190,245,229, 32,180, 89,197,149,173, 12, 86,199,108,111,109,
+176,179,181,197,108,180,193,225,254, 30,113,156,114,251,213,215,209,227, 49, 18, 99,152,162,241,236,237,237,226,188, 65, 39,129,
+103, 15,158,176,181, 57,227,217,147,135,252,205,223,252, 29, 47, 94,185, 70, 60,201,240, 94,243,195,183,223,163, 35, 48, 74, 20,
+243, 34, 98, 84,196,124,235, 15,126, 23,173,197,239,122,120, 90,161,178,148,197,201, 1,247, 62,185,199,238,209,154,217,230, 38,
+151, 46,108, 49,202, 19,154,213, 41, 31,221,123, 70,215,122,146, 92, 99, 91,143,247, 96,242,148, 73, 30, 35,202,196, 20,163, 12,
+104, 79, 30, 75,126,173, 87,208,181,194,153,118, 4,162, 56, 35,120,203,201, 98, 69,150,101,248,222, 14,228,165, 64, 28, 27,140,
+ 10,196, 70,145,103, 57, 73, 62, 99,107,123,206,225,242,148, 80, 87, 56,235, 57,126,190, 75, 31,231,172,143,151,108,108,100,204,
+119, 46,176,127,184,224,149,151,110,112,245,226, 6,139,163, 35,242, 52,147,253,102,221,115,235,246, 77, 30, 63,124,132,119,208,
+183, 13,101,221,145,231, 49,206,122,150, 77,143, 77,199,228,121, 78,215,247,180,117,205,120, 60,197,121,139,243,226,185, 78, 99,
+ 81,142,158,253,125,246,151, 11, 1,239, 7, 53, 42,162,162,205,139, 2, 19,197,104, 37, 49,183,125, 91, 67,100,100,100,232,145,
+228, 50, 21,152,140,198,231, 95,239,204, 58,226,156,165,111, 27, 84,148, 16,130,120,122, 35, 19,147,142,114,162, 65,152,227,156,
+167,119, 78, 58,104, 20,249, 40,167,179,194,245,142,149,161,115,158, 36,214,120,111,105, 91, 1, 70, 84,235, 21,222,203,110,238,
+236, 5,202,210,116, 88, 43,136, 31, 84,212,192,134, 72, 71, 88,111,207, 31,238,179, 63,175,181, 30, 19, 73, 55,115, 86,160,116,
+125, 71, 93, 85,231, 93, 81, 62,146, 76,236,224, 21, 12, 15,185, 82, 34,152,147,181,129,116, 36, 85, 85,201,222, 54,142,137,135,
+ 29,163, 88,227,132, 50,181, 94,151, 76, 38, 19, 66, 8, 44, 87, 75, 70, 99, 25,223,181, 93,135,216,196, 60,190,149, 78, 56, 77,
+ 82,188, 10, 67,209,208, 98,162, 88,214, 73, 81, 36,151,123, 28,227,188,165,200,134,100,178,224,168,170, 26, 55,140,237,138,209,
+ 8, 80,242,153,214, 53,227,241, 24,215, 91, 78, 79,142,153,111,111,159,251,177,171, 97,205,114, 38,154, 74,181,226, 55,222,188,
+ 35, 62,244, 32, 76,236,222, 59,198, 69, 65, 18, 39, 84, 77, 67, 89,214,104, 45, 98, 66, 17, 63, 74,226, 83, 85, 85, 28, 28,159,
+176, 88,151,120, 47, 23,101,100, 36,115,188,172, 91,238, 61,124, 32,187,238, 56, 34,142, 50,156,109,113, 30,250,174,193,122, 71,
+232, 44,173,237, 89,174, 42, 54,102, 83,174, 92,220,166,106, 75,154,213,138,178,105, 73, 99, 67,219,180,180,189,162,243,112,105,
+163, 32,203, 82, 26,215, 98, 59,207,241,170, 99,190, 57,198,119, 18,142, 17,199, 49, 93,211, 16,143, 70, 48, 76,104,122, 43,157,
+ 78,232,228, 2, 11, 38,224,156, 68,121, 70,146,109, 1, 72,193,234,172, 32,111,157,115, 98,231, 75, 12, 95,121,237, 5,110,191,
+120,137,107, 87,174,240,206, 59,239,113,225,242, 53,110,220,188,206,123,239,252,148,135,159,125,196,133, 75, 87, 49,186, 96,178,
+ 53,231,238,227, 99, 30, 61,221,163,111,106,210, 52,197,185, 32,239, 11,158,182,119, 36,121, 49, 76, 7, 18,218, 70, 40, 97,125,
+239,228, 6, 65,227, 67, 7,206,227, 29,120, 5,113, 44,170,124, 19, 71,196, 74,120, 9,211, 73, 70,211,116,148,101, 41, 34,204,
+ 72,179, 42, 43,130,212,165,140, 70, 41,125,223, 18,188,161,239, 28, 81,172, 65,129, 66,200,104, 77, 45, 81,183, 73,106, 88, 13,
+211,199,255,240, 47,241,162,199,196,121, 1, 70,226, 68,181,137,152,140, 39,116,214, 18,107,201, 44, 7,104, 7,191,115,150,101,
+ 88,111,113, 93, 15, 58,162,239,196,223, 62, 26,229,172,214, 43,129, 17,229, 18,172,178, 49,217,226,224,168, 97, 93,149,120, 43,
+ 42,240,113, 81,208,218,142,141,201, 6, 79,247,247,240,206, 99,130,172, 69, 38,147, 2, 31, 2, 85,213,200,214, 43,200, 74, 32,
+ 77, 18,210, 52, 99, 60, 46,232,186,142,166,170, 88,173, 78,248,159,126,114,159,167,223, 57,194,206,127, 14,135,247,104,154,154,
+104,126,147,106,109,217, 41, 42, 54,183,183, 48,179, 49,205,186,100,241,124,143,189, 15, 63,224,243, 31,253,132,102,185,162,235,
+ 58, 17,253, 53,141, 20,130, 38,198,245, 45, 65, 41,166,211, 41, 74, 41, 22,139,197,112,129,138,101, 77, 41, 5, 30,138, 81,134,
+210, 98,105, 60,155,244,165, 89, 74, 83,215,140,198, 99,202,178, 2, 2,197,120, 74, 85, 85,140,178,140,229,106, 45,147, 67,103,
+ 41,203, 53,189, 21,174,128, 2,108, 8,100,137,172, 14,250,182,147, 49,191, 54,204,183,230, 40,165,104,219,179,201,227, 96, 59,
+238,123,242,124, 68, 8,126, 56,155, 33, 30, 2,142, 66,112,148,117,141,193,200,212,216,123, 78, 79, 79,137, 99,129, 2,101,121,
+ 70,219,137,208, 52,104,121, 33,210, 52, 39,141, 53, 93,219, 99, 54, 46, 94,253,118, 18,167, 76,138,140, 75, 89,205,238,222, 33,
+229,170,230,248,104, 69,145, 21,108, 93,218, 98,186, 57, 99, 89,119, 92,186, 58,199, 13,150,150,135,247,239,163,162, 9, 81,146,
+114,237,202,101,146, 40, 97,239,240,128,123,159,124,130,137, 98,234, 96, 73,162, 20, 19,107, 22,167,251,204,138,156, 91,215,230,
+ 92,152, 79,248,173,111,252, 38, 42,138,249,183,223,251, 62,127,249,221,159, 99, 66, 7, 6, 22,203,138,202, 6, 46,110, 77,121,
+235,173, 87, 56, 57, 62,230,131,143, 31,113,112,184,162, 15,158,209,198, 24, 19,231, 92,185,114,133,203, 87, 47,115, 97, 99, 76,
+ 49,158,144, 68, 49,249,104,130,142, 53, 77,111, 41, 61,244, 38,197,170, 8,171, 34, 26,239, 25, 77,230,232, 52,195, 36, 41,105,
+ 49, 6, 19,209, 5, 80, 89,198,120,182, 69, 54,157, 65, 92,112,120,178, 18,191, 99, 95,179, 90, 30,226,186, 14,215,174, 56,122,
+126,192,165,141,152,205, 44, 98,123, 62, 99,126,225, 2, 91,179, 13,174, 94,190,128,246,142,216, 57,158,238,239, 51, 29,143,216,
+221, 59,198, 36, 17, 71,123,207,241, 78,211,181, 37, 39,139, 21,182,107,137, 3,172,170,150,100,126,137,188, 24, 73, 85, 60,236,
+212,162, 68,120,192, 42,104,178, 52,161,119,226,177,245, 67,183,105,173, 48,141,173, 21,240,197,217, 37, 23, 69, 9, 81, 36, 15,
+183, 82,138,190, 19, 63,182, 30, 58,194,179,238, 39, 78, 98,116, 16, 12,103,215,183, 56,215,163, 6,129,100,215,247,180,125, 3,
+ 33,112, 70, 85, 50, 90, 30, 88, 99, 12, 65,169,225,240, 9, 68,145, 40,114,155,170,166,175,101,231,222,212,165,196, 49, 34, 7,
+146,109,235,225,114,208,195,161,219,227,157,208,181,228,189,146,125,165,140,204, 56,199, 48,202, 30,223, 2, 1,201, 84, 6,124,
+ 24,236, 59, 67, 71,110, 69, 49, 26,199, 49,113,146,160,148,172, 18, 20,226,201,109,134,145, 25, 8,172,164,235, 36, 14, 51, 73,
+196, 63,219,117,157,192, 27, 34, 65,133,118,125, 79, 93,203,106,160, 25, 14,229, 51, 69,177,132,125,200,215,102,232, 62, 76,100,
+168, 59,121, 73,195,255, 79,214,155, 4,107,154,166,231, 89,215, 59,126,195, 63,156, 49,231,204,202,154,171,171,231,110, 73,238,
+182,100,183, 44, 89, 29,216, 14,194, 54,182, 33,194, 1, 54, 94, 0, 17, 4, 11, 96,203, 74, 17,176, 96,201, 10, 88, 19, 1, 1,
+ 94, 56, 48, 54, 50,118, 16,132,101, 9,201, 18, 45,169,187,122,170,234,154, 51,171,114, 62,211,255,255,223,252, 14, 44,158,239,
+156, 34,130,172,101,102,101,158,115,254,239,123,223,231,185,159,251,185,238, 24, 65,105,114, 78, 98, 94,156, 38, 20,178, 59, 74,
+202,140,195, 36,243, 60,101,240,174, 32,231,136,176,188,133,120,149,147,108, 35,104, 35,197, 76,215,247,242,181, 58,119, 85,116,
+104,107, 49,202, 96, 11,143,178,134,231,155, 13, 38, 74,113,115,190,217, 9, 70, 87, 25,172,213,156,111,183,236,102,124,106, 63,
+137,225,170, 31,122,206,206, 55,188, 56, 59, 23,163,147,145,245,213, 16,194,188,158, 37,207,219,102,152, 8,202, 48,198,204,110,
+183, 19, 34, 88,146, 57,224, 98,177,194,149, 37, 77,211,226, 77,166, 27, 59,140,173,200, 9,170,229, 66, 70, 53,217, 98, 45, 20,
+ 38, 49, 78,176,233, 39,140,202, 95, 56,141,195,196, 16,193, 59,207, 75,183,143,209, 78,240,177,211,144,175, 70, 41,198, 8, 21,
+ 15,173,192,234, 89, 18, 31, 73, 42, 18,166, 72,219,141,116,227, 36,107,111, 41,176, 94,120,156, 51,188,252,210, 29,190,255,235,
+127,142,111,126,251, 91, 24, 95,147, 72, 40,227, 8, 57,113,239,222, 43,100, 21,185,247,202, 93,142,174,221,225,155,223,249, 14,
+229, 98,193,209,245, 61,126,254,254,199,156,156,237,132, 95,144, 5,120,210,181, 61,218, 9,151, 59, 36, 41,220,114,202,228, 52,
+145,194,196, 52, 13,140,161, 35,133,204,174, 27, 48, 42, 51,197, 9, 53,203,185, 26,121,231, 46,205, 79, 49, 68, 10,235,184,132,
+159,120, 91,160,141, 34, 5, 73,216, 26,167,132,113,150,213,254, 26,111,229, 29, 5, 69, 76, 89,212,129, 48,161,181,193, 40, 40,
+ 74,135,177,226,226,175,170,146,152, 38,250, 62,200, 22, 80,223,178,187,216,201, 59, 20,164,224, 80, 74,242, 32,148, 49, 92, 6,
+243, 72, 32,140,236,108, 43,160,172,164,193,177,133,195, 25,131, 68,239,202,200,161, 31, 90, 92,161,217,109, 71, 14, 15, 14,232,
+250,137,170, 52, 52,109,195,114,177,164,168,106,250,174, 33,102,208, 78, 81, 23, 37,206, 26,198, 32,231,148, 86, 51, 74, 60, 71,
+114, 28, 73, 73, 20,194,182,221,112,112,253, 87,248,141, 95,251,183,249,240,135, 79,121,242,238,207,152,204, 25,122,108,113, 94,
+243,232,207, 54,244,126,160,127,254,144,184,184, 11, 39,111, 80,222,191,203,209,151,190,198,235,191,250, 43,156, 63,254,140,147,
+207, 30,144, 81,212, 85,137,245, 22, 73,218, 43,137,211, 36,227, 16,253, 5, 56,169, 40, 74,140,145,231,107, 24,197,112,156,179,
+176, 56,140,150, 36, 71,231, 28, 17, 41, 46,189,251,255, 24, 45, 99,144,237,142,194,145, 67, 36,147, 40,124, 37, 96,175, 73, 20,
+ 72,121, 95, 11,114, 78,243,179, 44, 42,161, 66, 54,149, 64,140,163, 41,201,168, 83, 95, 54, 29,227, 40, 42,219, 56,209,143, 3,
+109,211,208,247, 3, 90,201,246,130, 43, 4, 99, 92, 85, 53,105,154, 8, 97, 98, 26, 3,198,201,182,132,183, 22,231, 60,206, 9,
+ 78,185,240, 30,245,165, 95,254,243,121,223, 13,156, 61,125,202,151,191,254,117,110,223, 56,102,187, 57,225,173, 47,125,141,186,
+244,124,248,238, 79,185,247,250,219, 28, 28,238,113,122,242,130, 97,156,128, 68, 12, 19,245,122,159,221,118, 67,202,176,185,216,
+240,226,233, 19,154,118,203,187, 63,251,136,216, 7,118,195,196,235,175,222,227,163, 15, 62,228,218,129,230,181,215,110,115,122,
+ 62, 48, 69, 69, 24, 2,143,159,158,114,253,246,117, 66,180,168,220,115,122,182,101, 24, 50,123,149,226,116,215,115,222,138,204,
+185, 87, 87, 88,171, 57,216, 91, 81, 20,142,179,147, 19,134,190,165, 55, 75, 22,203, 5,235,131,125,250,249, 48, 12, 99, 32,145,
+208, 74,179, 94,173,216,181, 45,101, 89,210,117,253, 60,247,150,185,140, 47, 11, 54,155, 45, 48, 95,138, 78, 0, 7,109, 43, 17,
+142, 83, 8, 88, 21, 73, 67,143, 75, 19,103,231, 91,194,152, 88,249,204, 75, 47, 93,227,205, 55,223,230,112,127,205,174, 27,249,
+236,228,148,216,140,108, 78, 94,224,106, 71, 31, 70, 64,200, 78,253, 40, 7,163,175, 42,154, 77,195,197,182,167, 56,190,142,245,
+ 5,164, 36,171, 57,195, 56,207,212,229,251, 5, 36, 51,122, 28,209, 70,130,115,100,134, 39, 64,140, 75,217, 61,147,233,154,142,
+170,148,212,162,128, 24, 52,198,190,231,242,175,210,250,139,185, 99, 76, 81, 76,105,115,229,154, 66, 36,107,208,104,148, 6, 55,
+255, 61,125, 43,107,141, 69, 81,208,117, 45,206, 22, 40, 37,115, 50,109, 37,167,120, 12, 73,140, 83, 57,163,209,210,145,207,251,
+223,198,202,236, 58, 78, 19, 67, 47,133,130,119,158,148, 19,133,247,160,100, 77, 78,107, 9,187, 16,148,231,116,117, 16,150,101,
+ 73, 98, 54,131,104, 43, 42,202, 92,145,123,111,153,166, 52,175, 89, 37,145,178,149,161,170, 10,153,151, 41, 37, 56,201, 52, 7,
+ 92, 24, 71, 72, 1, 16, 83,214,197,197, 5,146,227, 45,123,173,198, 57,202,178, 38,230, 32, 38, 48,196,180, 19,179, 4,137,116,
+ 93,135, 54,179,123,216,121,166, 81,226, 34, 77, 86,104,107,216,108, 54, 12, 51, 88,130, 44,242,230,106,185, 34,107,197,246,226,
+ 66, 62, 3, 99,217,223,223, 67, 41,129,250,108, 47, 54, 72, 38,178, 34,132, 12, 68,170,197, 18,146,128, 43,154,166,101,177, 90,
+ 97,180,152, 18,245, 60,123,159,198,113, 30, 73, 68,170,194,243,245,123,119,176,198, 8,185, 42, 68, 36, 5, 75, 36,108,165,213,
+ 23, 93,109,150,153, 97, 74, 9,201,190,206,144, 19,253,208,147,145,127,227,243, 77,139,210,134,205,102,139,183, 18,243,104,204,
+ 44, 73,167, 68,219,238,164, 64,204,145,194,106, 54,231,167,244,227,200,209,209, 17,133, 47, 89, 44, 74,218,190, 99, 26,122,242,
+ 36, 74, 76,211,116,140, 10,150,222,179, 94, 47,169,188,134,178, 4,231,249,244,189, 7,252,230, 95,248, 42,175,191,126,151,223,
+249, 39,191, 71, 23, 43, 78,119, 23,226, 54,206,114,167, 27, 99, 24,187, 1,140, 98,177,168, 56, 63,223,176,127,176,228,215,190,
+243, 45, 94,186,115,147,156, 6,234, 82, 54, 54,110,220,124,133, 23,167, 27,142, 14, 14, 24,134,129,231, 79, 31, 98,157,229,163,
+ 15, 63, 32, 77, 80,239, 47,185, 56,127,206,147,199,207,152, 66,224,249,233, 5, 95,253,214,203, 36,231, 57,121,220,241,147, 31,
+ 61, 96,189,191,162,172, 42,138, 66,214,219,166,105, 96, 74,145, 48, 4, 84,202,248,170, 36,229,128,201,138,102, 55,128,133, 89,
+ 80,248,255,253,210, 70, 65, 18,191, 65, 81, 57,185, 60,148,161,172, 28,113,140,116,253,128,183, 98,116, 59, 56,216, 35,147, 56,
+191,216,114, 9, 51,233,118, 27,188,243, 24,173,176, 69,133, 86,242,174, 27,227,102,232,143, 66, 27, 9,129,106,187,129,190,147,
+ 47,196, 24, 49,208,165, 44, 51,222,162, 90, 8,151,193, 57,246,246,247,231,179, 0, 66, 24,197, 92, 55,138, 33,107,185, 92, 50,
+ 77, 2,191,138, 73, 14, 15,165, 69,181, 20,212,180, 38,135,130,253,131, 35, 32, 81, 22,150,135,159,125,198,254,225, 17,235,186,
+166, 29,250,121,222, 46, 82,188,172,225, 37,114,152,232,251, 29,195, 56,112,116,243,155,132,246, 83,188,151,142,243,151,126,235,
+191,225,237,175,127,159,119, 63,248,151,108,206,127,134,218,255,148, 35, 51,241,202,159,251, 22, 79,158,183, 60,251,209,142,131,
+151, 59,186, 41,243,202,237,255,152, 48,108, 80, 86,145,243,115,170,151,158,241,226,135,127,194, 31,254,163,127, 72, 74, 17,141,
+152,106, 19,144,131, 4,144,173,246,246,200, 49,211,181, 59, 64,204,104,222, 23, 56, 39,171,147,160,240,222,147,115,102,187,221,
+ 16, 66, 96,189, 94, 95,153,233, 54,155, 45,190, 40,175, 10,119,173, 36, 4,200, 40, 77,210,138,113,104,105,154,110,158,191,207,
+ 27, 10, 49, 96,181, 36,182,161, 68, 9,205, 41,227,171, 98, 86, 19,228, 44,206, 57,225, 92, 49,191,175,150,221,230, 28,235, 12,
+ 93, 55,226,189,101,177, 92, 93,169,141,204,197,126, 74, 34,241,147, 50,166,176,128,168,108, 49,201,179, 37,219, 52, 10,245,253,
+223,252,102,254, 87,191,251, 19,222,120,253, 53,254,222,223,251,235,156,159, 60, 99,232, 58, 78, 55,129,189,195, 61,156, 50,188,
+253,181,183,249,228,147, 79, 0,201, 0, 94, 47, 61,103, 31,254,148,237, 24,241,135, 55,217,156,157,243,193, 7, 31,208,199,142,
+143, 63,120, 66, 63,141,124,251,235, 95,165,139, 19, 58,244,252,225, 31,254,148,122,149, 57,223, 40,190,252,230, 29,142, 14,247,
+248,244,211,207, 88, 29, 28,145,177,244,221,150,208,158,115,118,218, 49, 76, 98, 76,113,149,164, 80, 93, 59, 58, 20, 19,147, 53,
+228,156,104,218,145,245,241, 53,250, 56, 95, 26,195,136,213,138,106,177, 36,197,200,249, 70, 92,128,133,117,248,170, 18,137, 47,
+140,108,206, 55,164, 36, 6,165,122,177, 32,165, 60, 83,124,150, 92,174, 40,104,173,217,109, 46,168, 22, 11,249,240,230,234, 54,
+ 76,137,212, 93, 16,167,129,105,183, 97,127,111,205,221,187, 47,177, 95,123,180, 77, 84,149,227,249,217,150,166,237,161,221,241,
+217,211, 23, 44, 15,174,179,109, 27,152, 50,170,176, 88,144, 48,138,227, 91,104, 95,224,172, 37, 71,176, 86,179,219, 53,148, 85,
+ 33, 43, 60, 74,205, 21,242,192, 98,185,100,236,133, 33, 92, 23, 98,144,209, 86,220,210,228, 76,219,181, 40, 12, 85,225, 1, 4,
+221,235,156,152,110,114, 38,146,208,232,171,139, 93,246,113,197,145,171,149,146,181, 55,239, 25,123,217,157,117,133, 1,109,152,
+134,158,190, 31,112, 70,228, 80, 99, 20,202, 56,100,205,197,131,146,148, 40,165,212,149, 84,152, 17,147, 87, 66,188, 1, 90,201,
+108, 90,118, 74,165, 43,191,220,229, 76,211,116, 53,143, 86, 90,240,195, 41, 8,185, 42,199, 76, 89,200,197, 63, 76, 35, 99,215,
+161,180,102, 49, 31, 58,174, 16,120, 68,206,153, 97,234, 9,253, 72, 72, 34,117,173, 86, 43,198, 97, 64,219,153,171,140,116, 27,
+ 93,211,200, 8, 38, 37,114, 8,146, 55,157, 51,109,223,179, 94, 46,137, 73,186, 94,157, 52, 69, 85,176,217,110,209,214,162,114,
+ 98,177, 88,194,188, 2,179,221,236,200, 73,230,145, 86, 25, 92,225,100, 77, 46, 68,118,205, 22,131, 84,231,171,245,106, 94, 11,
+149, 61,248,189,189,125,218,182, 67, 25,195,162, 46,201, 25, 98, 12,116,157,200,169, 26, 77, 72,129,213,106,193, 56, 74,113, 52,
+142, 35,218, 40,250, 94, 94,212, 75,230,128,179,150,140,196, 68, 22, 86,243,230,157, 91, 28, 44,197,108,148,230, 74, 46,134, 73,
+ 40,122,200,229,168,103,213, 34,101,249,189,148,101,132, 67, 78,180,253,200,147,166,231,124,179,157, 99, 76, 27,170,170,102, 24,
+122, 66, 24,209,218,225, 10,131, 74, 82,144,200, 95, 37, 42,202,217,147, 71,104,171,133, 25,144, 97,189,191, 71,219,237, 40,177,
+224, 44,121, 24, 24,115,224, 98,211,114,243,104,159,213,193, 30, 54, 13,124,231,144,110, 71, 0, 0, 32, 0, 73, 68, 65, 84,245,
+ 59, 95,229,143,255,236, 29,126,254,163, 39,188,118,111,193, 66, 5,254,220,215,126,137,227,187, 95,226,209,197,134, 15, 63,249,
+ 88,246,154,137,220,185,113,196,195,207,158,179,237, 6,110, 94, 59,228, 59,223,250, 10, 7,135, 7, 36,173, 81, 90,100,121,140,
+166,107, 51,171,178, 64,171,132, 54,137,139,205, 25,195,208,240,222,207,127,206,241,173,155, 24,111,120,240,193, 7, 60,127,252,
+132,107,135,215, 89,237, 95,227,254,151, 95,163,233, 79, 24,119,137,127,249,187, 63,100,187, 29, 81,214,208,119, 13,144, 56,191,
+144,121,241,229, 47,173,193, 98,153,144,176,143,170,246,148,117,205,106, 89,163,141,162,217,236,136, 65,118,165,141, 83,160, 53,
+ 85,225,137, 25,200, 2, 79,105,155,134,182, 21,196,246,209,254, 30, 1,136, 99,162, 92, 8,159,189,105, 91,172, 51,180,219, 6,
+155, 65,103,136,100,178,146,162, 44,142,226,191, 48,206,201, 56, 40, 8,247, 63,166, 68,152, 34,211, 20,241, 78,140,150, 25, 69,
+140, 3,100,217,191, 94,237,239,227, 75, 49,110, 45, 22, 43, 32,211, 52, 50,139, 77, 36,250,174, 37,133, 68,189, 92, 17,134,158,
+ 93,219,178, 92, 44,132,172,151, 5,231,187,109, 70,194,168, 24,251,158,132,158,179,228, 21, 85,185,160,176,138,179,237, 6, 89,
+ 18, 16,111, 72, 14,129,166,223,240,143,159, 61,166,235, 20,159,252, 1,124,218,255, 30, 93,187,165,253,197,117,158, 62,124, 74,
+179,251,144,237,217,251,232,245, 41,199, 7, 37,111,254,249,239, 82,149,158,135, 15, 94,112,241,248, 33,109,119,198,151,222,252,
+247,137,221, 13,114,238, 72,169,101,211,124,194,237, 47, 7,250, 23, 79,248,163,127,248, 63,145, 81, 76,211, 4, 25,194, 56,162,
+157, 16,217,150,203, 37,231,231,231,132, 16,101, 11, 96,190,100,149, 82,179,228,109,112,214, 49,134,137,161,107,196,103,160, 20,
+101, 89,178,219,108,201, 72,115,152,231,162,224,236,244,148,105,154,176,222,211,119,210, 48,138,156, 62, 16, 99,194, 88,139, 51,
+ 5, 85, 93,162,149,128,104,166,161,199, 21, 37,253,208,206,119,205,229, 72, 85, 46,125,239, 61,155,139, 13,227, 56, 92, 81, 17,
+181,214, 87,231,195,106,181,194, 24, 81, 71, 19, 98, 82, 14, 73, 8,163,203,197,146,102,183, 37,101,137,108, 30,135, 1,181, 48,
+ 38,191,241,230,203,252,197,239,126,155,190,221,113,254,236, 25,213,209, 13,190,242, 75,223, 97,185,231, 24,186,150,161,237,136,
+227,132, 41, 42,153, 75,182, 59, 30,253,228, 79, 25,205, 62, 57, 71,126,242,222,123, 4, 83,162,172,227, 96,233,105,183, 59,116,
+232,185,118,239,144, 15,222,127,128, 53,146,198,133, 6,151, 71, 30, 63,219, 17, 34,100, 29,217,182, 3,133,207,236,182,129,110,
+204,236,173, 23, 44,170,130,131,195, 61, 20,138,102,215,201, 5,179, 92,226,170, 10,111, 61,197,124,232,119,109, 39,251,140,222,
+ 80, 87, 53,195, 40,146,236,165,236,161,181, 44,232,135, 48,178,217,236, 68,158, 70,179, 58,216, 71, 1,219,139,205,124, 80, 25,
+246,246,101,213, 39, 76,194, 81, 38,101,140,117, 87, 38, 43,137,141,148,151, 35,143, 45, 46,193,209,178,134, 52,210, 77, 19,125,
+219,224,157,102, 10,138,182,105, 89,213, 5,221, 48,226,124,193, 24, 3,231,155,134,195,187,247,169,215,251,164,217, 76,212,247,
+ 35,198,104,166, 65, 92,143, 83, 28, 65,201, 10, 10,104, 36, 18,114,139, 82,226, 14, 45, 75,161,187, 57,107, 81,198, 48, 52, 29,
+190, 42,101, 46,233, 61,125, 63, 96,181,228,247,230,156,105,251,118,118,121,138,132, 8,160,140, 97,189, 88,206,135, 51,120, 95,
+ 50,166,112,149,144,165,181, 33,199,200,118,187,197, 91, 71, 86, 95,204,162,198,190, 7,163,201, 73,145,115, 68,238, 77,145,158,
+197, 36, 39, 52,183,170, 40, 64,137,147, 61,197, 72,211,245, 44,102,211,149,243, 30,235,253,220,197, 15, 76,105,194,233,153, 2,
+229, 61,230,234,194, 14,172, 86,245, 21,224, 65, 43, 69, 89, 47, 8,227,132,182, 26,103, 29,214, 9,230,181,109,133, 55,238,156,
+163,174,107, 98, 8,108,230,181,204,186, 44, 65, 65, 59,179,202, 67, 72,148,165, 71, 27,195,182,217,206,225, 21,179,153, 50, 25,
+166, 73,114,146,235, 69, 45,206,116,173, 33,231,249,101, 21, 36,169,247, 34, 81,182,109, 43,230, 20,184,170,190,201,176,221, 54,
+ 44,151, 53,155,205, 22,235,140,124,158, 89, 34, 37, 21, 48,165,136,183, 94,230,228, 70, 46,232,102,183, 35, 43, 69, 34, 97,148,
+193, 23, 78, 58,246,203,217,121,140,162, 92, 40, 37,110,218, 36, 91, 20,214, 88,110,238,175,120,227,206, 45,156,177, 84,101, 33,
+ 44,242,113,186, 58,192,174,244,159,156,174,222,141,148, 97,215, 15, 60,222,117, 76, 65,246,126, 85,148,195,102, 28, 7,178,138,
+130,141,118,142, 75,104, 79,140,151,251,253, 34,149,231, 20, 73, 99,207,122, 89,113,122,122,202,246,124,195,241,225, 49,203,189,
+138, 56, 70,124, 89, 48,244, 61,161,107, 56, 59,189, 96,117,120,192,173,195, 53,237,180,225,214,237,155,108,250, 45,159,124,250,
+156,105, 59,176,244,240,230, 43,119,120,245,245,175,241,181,111,126,139,189,227, 91, 20,245, 10, 83, 12,156,158,238,232, 59,137,
+ 73,109,155,150,186, 42,241,149,101,189, 60,164,223, 54, 12,211,200,201,227,231,196,105,226,225,147, 79, 73,161,229,217,217, 41,
+143, 63,254,136,101, 85,163, 77, 73,139,229, 87,191,247, 75,188,243,195,119,184,113,227,136,212, 91,246, 15,214, 60,123,250, 25,
+205,121,195,207, 63,121, 72, 31, 3,103,103,195,229,200, 28,208,212,133,101,181,191,224,233,147, 51, 86,123,107, 14, 15,215,242,
+ 25, 33, 5, 99,179,237,102, 39,190, 39,142, 3, 89,101, 50,154, 28, 36, 78,212,213, 21,206,202,103, 28, 83, 66,197, 68, 34, 65,
+ 22,233, 61,166,105,246,141, 72, 30,184, 6,180, 45, 80, 38,160,180, 39,197, 1,225,156, 27,198,174,199,105,201, 52, 8, 25, 25,
+133, 25, 77,118,115,170, 25,153,148, 35, 67, 59,119,237,214, 48,205, 70,200,156, 34, 83, 18,201,217,152,138,213,122, 77,189,183,
+194, 91,233, 84,219,118, 71, 86,153,189,213, 30,153, 44, 80,154, 24, 80,202,176, 88,200, 69, 19, 99, 38,199, 64,215, 70,206,207,
+ 58,234,197,146,245,222, 1,199,215,175,241,232,209, 35,218, 93, 67,189, 92,177,221, 54, 24, 73,249,165,111, 47,120,227, 27,127,
+143,255,236,159,255,215,124,175, 28,248,201, 88,240,127,253,183,207,201,183,255, 53,237,217, 57, 15,126, 0, 93,211, 49, 54, 79,
+208,234,156,227,183, 15,185,251,230,171, 84,181,102,106, 26,218,166, 35,244, 61, 71,119,239,112,242,254, 77, 98, 56,166,105, 79,
+ 56,123,252,135,220,252,230, 33,175,254,242,215,249,240,255,248,199,252,228, 95,252, 14,198, 24,134,113, 68,107, 61,119,227,162,
+104, 54, 93,203,216, 14,226, 11,201, 82,236, 23, 51,254, 92,161, 88,174,151, 0,244,157, 48,236,149, 82,132,113,164, 90, 44, 25,
+134,129,178, 44,201, 40, 84,202,156,111, 55,244,221, 23, 89, 26,117, 93, 19, 99, 98, 28,134,121,156,103,169,202,133,148,221, 90,
+198,158, 57, 70,152,199, 74,105,110, 10,202, 75, 85,180, 23, 42, 96,204,145,205,249, 5, 41,137,218,184, 88, 44,230,145,160,176,
+251, 99,148,144,161,190,235,240,222,163,172, 21,197, 81, 73,177,161,148,140,212, 82, 74,168,255,226, 63,255, 7, 57, 54, 3, 79,
+159, 63,231,252,244,156,107, 47,221,231,207,255,229,239,131, 30,249,236,227,143, 88, 90,207,197,243,167,168,110, 75,111, 60,166,
+ 90,241,254,123,239,115,242,236,140, 59, 47,223,231, 98,179,229,255,254,127,254,132,107,135,251,188,249,214, 29, 54, 39, 39, 84,
+ 42,115,227,238,109,126,252,139, 79, 9,131,229, 87,126,229,151,120,246,232, 1,239,125,240, 46,237,110, 32, 91,197, 48, 69,154,
+102,194, 88,135, 82,134,101, 93,139, 91,240,112,159,164, 50, 9, 77, 55, 4,154,166,199, 22, 30,173,161,240, 5,195, 56, 72,229,
+148, 51, 99, 63,178,221,109, 88, 46,106,154,174, 99,177, 92,163,114,162, 27, 70, 82,152, 83,171,188, 23, 83,195, 32,177,149,243,
+213, 70, 70, 46,191,105, 24,168,170, 5,253,208,125,113,121, 91,195, 24,228,129, 46,189, 39,134, 4, 57,146, 21, 56, 55, 31,198,
+ 22,226, 16,152,134,134, 56, 77, 28,238, 31, 64,152, 72, 49,202,229,167, 52, 71, 55,111,209,108, 79, 56, 57,191,160, 92, 31,205,
+135,233,101, 95, 43,191, 92, 33,152,215,177,239, 73, 6,233, 88,179,250,162,210,139,145,205,118, 75, 81,136,108,212,247,146, 42,
+ 21,163,160, 31, 75, 95,208,116, 45,222, 11, 21,206, 24, 67, 85,215,192, 44,129,133, 68, 74,145, 24, 19, 77, 35,107, 30,151,157,
+251,162,170, 48, 69, 49,119,224,142, 41, 74,220,164,115,142, 93,211, 98,173,158, 31, 28, 9, 47,208, 90, 32, 23,121,254, 41,134,
+ 41,201,133,231, 20, 58, 27,124,233,209,222,162, 98,102,179, 17,147,156, 84,207,115,247,162, 5,167,184, 90, 46,201, 90, 51,116,
+ 2, 28,185,124,144,181,150,157,121,249, 30, 53,235,245, 18,148, 28,102, 33, 73,242,213, 48,211,192,180, 82,248,170,160,174,106,
+ 98,140,132, 48, 18, 70,145,217,173,115,108, 54, 27, 4,247, 41,142, 87,173, 13,235,245, 18,201,128,206,236,154, 29,139,121,255,
+127,187,107, 40, 11,139,209,142,156, 18, 89, 9,184, 70, 27,115, 53, 79,207, 49, 98,173, 4,132, 56,107,101, 45,101,126,137,250,
+ 97,192, 57,161,216,141,227,136, 51,142, 62, 12, 20, 78,204, 65,211, 52,205,135,128,112,171,173, 22, 5,168,237,135,171, 78,193,
+ 24, 11, 22,134, 78, 8,119, 57,231,249, 80,150,177,196,229,191,149, 1,103, 61,105, 30, 41, 24,109,137, 49,224,173,225,229, 27,
+199,236, 45,106, 86,117,141,154,139, 56, 9, 68, 19, 40, 69, 70,130,111,158,157,111,120,177,221, 97,138,146,105, 26,233,123,217,
+136,144,100,179, 5,237, 12,159, 41, 10,199, 56,245, 40, 12,222,139,145, 75, 86, 44,101,228,226,156,151, 11,106, 12,120, 27,184,
+ 56,123,193,110, 19, 57,188,118,136, 10,163,236,208,102,153,235, 14,155, 11, 9, 69, 81,142, 91,199,135,116,161,197, 90, 75,189,
+180,152,178,226,253,119, 31,224,146, 28,112,235,253, 26,147, 39,142,143,239,240,214, 27, 95,162, 25, 58,222,124,227,203, 68, 37,
+210,114,215,110,249,228,195, 79,200,147,226,250,221, 53,239,253,226,167,188,243,195,119, 41, 10,195,209,237, 99, 62,255,236, 5,
+201,214, 92,219, 43, 49, 56,234,250,128,213, 81,197,233,201, 5,143, 30, 61,102, 24, 58, 82,182,140, 65,186,231,203, 88,105,171,
+ 68,206, 76, 25, 25, 57,105,133,245,102, 54, 18,182,212,101,201,110,215,226,157,199, 23,158,161,159, 8,113,194,106,145,186,167,
+ 97, 16,214, 66, 78, 56, 47, 10, 85,156, 2,182, 20, 55,187,213, 18,145,219,141, 66,115, 43,173, 56,167,141, 17,178, 88,138, 18,
+181,108,141, 92,180,174, 40,152,210, 68, 10,210,149,229,164, 88,148, 5,206, 25,198,126,100,202, 66,180, 11,137, 43,216,208,229,
+ 28, 95,161, 24,163,168,105,206, 9,138, 84,101, 25,155,134, 28,137, 1, 80,130,240, 53, 78,228,249,178, 44, 56, 56, 62,162,217,
+ 53,180,109, 75, 85,150,116,189,100, 81,164, 44,251,239, 49,201, 28,190, 40,215,196,209,208, 77, 35,175,189,250, 22,211,208,241,
+249,231,159,115,255,254,107, 60,124,244, 8, 16,223, 79, 6,254,194,223,249,239,185,190,247,155,252, 7,255,213,192,103, 91,199,
+ 31,254, 67,197,147,247,127, 7,142,126,193, 24, 61,213,197, 27,152,210,160,117,143,185,159, 88,215, 6,149, 55,168,126, 36, 12,
+163,156,214, 94, 49,140,138,223,255, 31,255, 21,159,254,232,127,103,169,207,248,202, 91,111,114,253,222,171,220,249,238,111,242,
+ 39,127,240, 7, 60,124,247,103, 24,107,175,124, 32, 83, 16, 68,236, 56,118, 88, 99,217,110,197, 32, 90,184,130,118,236, 33, 39,
+234,170,164,170, 23, 88,107, 24,135,158, 48, 74, 0, 18,192,222,222,158, 40,182, 90,146, 75, 99, 8, 20,101, 73,223,246, 92,236,
+ 46, 40,138, 66, 10,219,196,124, 94,237,145,194, 68, 85, 47,232,102,159,203, 20, 38,124,233,201, 25, 20,210,204, 93,222, 69,245,
+106, 41,133,114, 22,131, 49, 41,211,116, 59, 82,202,196, 20,176, 86,200,146,144, 48,218, 18,162,208, 48, 47, 27,205,194, 21,212,
+171, 5,228,204,197,102,131,158,207, 62,235,178,225,217,139,231,236, 29, 95,227,229, 47,127,157,123,175,223,199,154,129,231,159,
+124,198, 18, 89,220, 31,187,115, 62,255,244,115,146, 93,114,118,254,115, 94,156,181,188,242,218,107,124,242,240, 17,159,124,242,
+ 17, 38, 12, 20,241,132, 15,126,118, 66,109, 28,185,114,252,228,199, 13,119,110,221,231,165,123, 55,121,246,236, 19,254,232,157,
+159, 19, 66,160, 94, 21,108,206, 70,118, 77,100,181,168,240, 78,179, 90,175, 89, 46,150,140, 33,240,252,244,156,100, 10,138,170,
+ 38, 78, 9,101,197,185,233,125,129,178, 22,155, 34, 77,219,206, 51,193,145,229,106,201,208,117, 44, 22,181, 60,176, 81, 88,234,
+ 90, 41,234,197, 74,126,146,177, 98,212, 6,231, 10, 2,153,237,102,139,243, 30,103, 29,219, 40,180,158,220, 3, 57, 83, 45, 69,
+162,209,122,162, 44,106,148,149,117, 46,136,164, 89,242,143, 97, 66, 43, 43,128,152,224,112,165,167, 9, 19,218,120,148,201,104,
+ 87,162,140,226,197,110, 75,138, 5,139,195,155, 50, 11,209,146,173, 43,105, 66, 82, 77,251, 66, 98,245,138,178, 34,171, 12, 30,
+113,244,134, 72, 63,201,195,165, 81,132, 32,115, 30,145,183,197, 56, 35,159,162,172, 92,133,152, 88, 46, 87,180,205,142, 24, 38,
+250,113, 66,229,185, 35,176, 22, 95, 56,134,193,162,173,149, 61,200,166,161,233, 91, 42, 36,246,113, 28,164, 67, 69,137, 65,174,
+ 46, 75,198,161,199,106, 51,119, 6, 1, 98,152,187,126,193, 20,106,139, 68, 0, 42,197, 52, 31,110, 58, 43,162,130,148, 34, 33,
+ 76, 56, 39,193, 50, 58,105,150,171, 37,221,208, 51, 78,211,149, 51,187, 31, 6,138, 82,168, 75, 93, 47,152,226,245,106, 69,211,
+ 52, 76, 83, 96, 24, 58,233,252, 53, 87,149,104,206, 25,227, 28, 68,153, 63, 23, 69,129,117,158,161, 29,177,179,211, 87,152,216,
+150, 97,232, 88, 86, 75,218, 78,224, 65, 93,119, 25,124, 34, 78,241, 69,181,160, 42, 74,134,177, 7, 21, 68,218,103,142,112, 5,
+140,179, 44,170, 5,109,215,145,145,181,190,174,145, 25,157, 51,134,144, 2,106, 38, 95,101, 45, 74,133,146, 35,141, 41, 70, 24,
+ 36, 46,181,240, 22, 99, 37, 53,106, 12,146,179,237,180, 38,229, 68, 55, 14,172, 87,146, 2,101, 23,178,238, 50, 12, 3,151, 89,
+226,128, 20, 61, 41,205,234, 83,198, 41,135, 4,208,201,165, 25, 82,226,221, 71, 79,201, 83,228,232, 96, 69,233, 61,251,117, 45,
+ 92,119,165,216, 52, 29, 23, 93, 63, 83,168, 50,222, 88,250,166, 33, 68,217,207, 94,173,150, 80,130, 68,173, 6, 1,249, 36, 73,
+177, 10, 25,186,113,144, 85,196,152,200, 89, 93,113,244,187,174, 99, 74,137, 24, 29,202, 45,169, 23, 59, 30, 63,122,130,119,112,
+172, 14, 56,186,118, 76,215,246,184,253,125,154,179, 83,134, 20,248,236,217, 11,142, 15,247,152,166,196,131,135,103,184,162,225,
+ 43,223,124,139,161, 63,227,167,239,124,206,230,201, 14,239, 97, 84, 79,249,217, 47,222,231,100,171,184,113,252,127,210, 15,112,
+237,198, 62,214, 5,154,126, 32, 13, 14,245, 30, 60,124,208,241,202,189,138,147,211,142,199, 63, 61,227,206,237,155,124,237,235,
+ 95,225, 39, 63,255, 17,239,255,226, 49,199,215, 90,134, 15, 70,186,182,167,112, 22,235, 10,150,171, 61, 22, 40,150,235, 5,183,
+238,220, 96,234, 54, 52,173, 24, 83, 67,215, 19,201,156,159,119,196, 41,208,134, 40, 77, 68, 55, 65,128, 33, 12,226,248,182,158,
+ 85, 89, 49,196,137,195,189, 21, 93,223,211,238,182, 48, 94,154, 76,165,248, 52, 74,145,180, 38, 27, 25, 43,150,235, 53,219,139,
+115,226, 52, 74,129,158,164,232, 45, 93,137, 54, 50,243, 86,200,142,117, 93, 84,132,105,162,217,117,140, 83,207,233,230,156,210,
+150,212,139, 18, 23,193, 22,154, 0,228,172, 36,245,220,123,172,213,178,111,239, 28, 69, 81, 8,191, 35, 36,180,215, 48,105,156,
+ 50, 20,165, 22, 19,238, 56,155,180, 66,224, 66,105, 78,158,190, 96,185, 94, 49,140, 82,148,174,150,203, 25,156,149,216, 12, 95,
+228,165,135,112,138,119, 5, 94, 27, 62,123,248,128,215, 94,123, 13,197, 67, 34, 19,123,203,154,243,237,134, 28, 70,174,191,252,
+ 93,136, 79,120,244,236,127,229,159,254,119,127,147,183,254,110,166,212,153,174, 81, 12,244, 28, 92,115,220,123,237, 21,234,175,
+ 12, 88, 94, 48, 13,129,102,151, 81,106, 73,142, 91,242, 56, 49,197,128, 50, 53,241,247,255, 17,187,159,252, 14, 97,151, 88,220,
+217,227,201,227, 39,196, 96,216,215,191,207,117,149,249,112,104,177,177, 16,243,235, 48,162,102,142,129,247, 30,107, 61, 7, 86,
+204,199, 57,101, 66, 10, 76, 51,161, 47,196,196,254,222, 30,160,100,108,150, 51,100, 33, 79,150,101,121,181, 42, 91, 86, 21, 40,
+ 25,133,105, 37,155, 91, 90,107,246,246,246,174,112,195,120, 71, 76, 25, 95, 85,104, 32,182,147,140, 72, 98, 68, 88,239,158,104,
+ 38,166,152,216,156,159, 83,150, 5,198, 20,116,131, 96,192, 87,171, 61,249,240, 83, 98,215, 74,225, 27,166,145,221,188, 5, 19,
+179, 52, 82,128,168, 66, 41,209, 53,221,236,219, 90, 96,173,198,124,245,213,155,191,189, 58,216,231,198,221,123,220,126,233, 30,
+155,211,231, 60,121,240,128,182,105,193, 40,158, 63,249,140, 31,252,224,199,140,148,244, 40, 98, 84, 68, 50,109,211,242,199, 63,
+120,135,243,166,103,237, 34,182,116,188,116,239, 22,174, 94,113,231,206,171,124,235,155, 95,231,211,103,143,249,189, 63,249, 9,
+127,250,238,199, 92,191,121, 11,239, 44,187,109,199,114,185,224,232,112,193,193,222,146,101,189,100, 10,129,118, 10, 92,180, 19,
+217,127,193,199,157,194,136, 86,134,162, 44,164,155,209,146, 25,108,140,161,219, 9,125, 13, 99,152, 6,113, 29, 99, 20,214,203,
+131,236,188, 24,104,166, 48,225,188,124,208,211, 56, 93,145,126, 84,146,131,202, 88, 49,162,145, 97,185,222, 35, 6, 89,147, 26,
+198,145,162, 18,147,196, 37,101, 72,205,165,214, 56, 13,232,172,241,133,199,249, 2,109,172, 56, 18,141, 96, 20, 83,146, 85, 37,
+231, 69,250, 77, 73,146,237,172,243, 84,133, 48,126,149,145,213,179, 16,163, 96, 91,167,145, 41, 8,239, 58, 6, 49,109,141, 81,
+ 58,182,164, 50,198, 56,185,200, 21, 84,101,205, 20,165, 10,157,122, 65,116,122, 47,251,228,206, 59, 98,200, 66, 93,115, 30, 95,
+ 72, 18, 24,113,230,154, 91,203, 24, 70,170,170,102, 26, 70, 50,137,186,170, 49, 86, 2, 4, 52, 90, 12,117,198,224,157,204,238,
+156,147,176,136,194, 59,140,182,178, 34, 21, 35,171,229, 10, 82, 66,165,217,213, 62,107,250,146, 74, 52, 81, 47,106, 82, 20,233,
+118, 57,227, 34, 37,183,218,147,200,160,196, 8, 50, 12, 51, 83, 90,103, 22,245, 98,158,253,207, 93,170,209, 20, 85,137, 68,166,
+202,159, 23,135,180, 65, 91,129,105,104, 45,240, 14,149, 36,244, 37, 14, 35,190, 40,112,198,136,211, 63, 76, 8,250, 86,220,254,
+214,185,121, 45, 19,218,174,149,148, 49,231,197, 52,164,196,160,101,189, 56,207,165,251, 22, 87,173,214,154,161, 23, 10,159, 85,
+106,222,253,207, 18,250, 1,236,218,158,170,240,104,107,196,123,144,196, 73, 91, 85, 2,245,145,103, 82,130,100, 82,138, 68, 18,
+101, 81, 94,249, 27,250,105,152,215, 50,153, 11, 75, 61,127,182,197, 85,183,229,156,195,106, 25, 5,121, 39, 14,237,194,137,209,
+211,204,202, 66, 66,209,180, 29,103, 93, 71,200,138,110, 18, 51,213, 37,226,115,140,113, 86, 24,122, 82,140,172,214, 43,198,169,
+151,238, 47, 4,214,139, 37, 83, 28,145, 89,255,132,202, 51,111,123, 86,135, 46, 67, 43, 46,255,205, 97, 24,168,202,146,168, 12,
+139,245, 62,138,158,162,240, 52, 77,199,217,233, 57,123,203,146,106,177, 7,190, 64,135,128, 51,138,152,193, 24, 77,225,133,197,
+ 62,245, 81,232, 99, 78, 83,151, 5, 33,106, 86,213, 17,245,222,154,151,238, 30,179,216,187,193,241,205,107,220,189,127,155,163,
+235, 55, 88, 45,246, 80,186,224,238,221, 87,120,227,181,151,241,206,211,108, 18,175,190,122,151,172, 50, 31,127,252, 49,231,231,
+ 98,114,188,255,202,203,252,210,183,191,206,171,175,223,163,168, 11,238,222,185, 75, 85, 74,177, 25, 98, 36,142,153, 7, 15, 63,
+ 39,135,200,249,197,134,166,147,177, 89,136, 35, 41,102, 96, 86,100,250, 22,107, 12, 33,206,207,107,138,130, 91, 78,137,243,179,
+139, 43, 83,235,208,181,160,231, 64,149, 73,246, 60,148, 86,168, 12,227, 52,208,183, 13,113,148,203,133, 36, 84, 57,173, 12, 25,
+145,212,141,149,142, 62, 70, 25, 13,214, 11,233,252,246,246, 15,240,222,129,130, 16, 38, 98, 78, 44, 87,178,129,160,141,152, 93,
+195, 40,187,210, 70, 27,172, 85,148,197, 28,200,148,226, 60, 74,145,150, 49, 43, 53,191,219,150,148, 37,166,214, 26, 77,225, 45,
+ 97, 24,136, 83,160,111, 91,250, 77, 75,179,221,176,221, 53,194,165, 0,148, 18, 25, 89,240,165, 10,231, 61,195, 16,185,118,227,
+ 58,143, 31,127,206,157, 59,119,217,110,183, 12,237, 57, 55, 94,255,117,148,222,162, 72,148,139,175, 82,239, 28,163,130, 39,143,
+ 30,208,159, 60, 99,161,191,196, 91, 95,255, 14,250,228, 26,187, 23, 43, 56,104, 88,196, 19, 50, 10,173, 50,113, 8,164,121, 12,
+166, 46,206,121,243,229,251,156,156, 60,102, 28, 34,207,155,145, 41, 79, 76,198,176,244,150,227,131,154, 20, 21, 89, 9,232, 41,
+103,225, 60, 20, 69, 41,231, 40,151, 27, 42, 35,222, 58, 22, 85, 65, 85,120, 74,239,177, 26,241,109,197,137,117, 85,210,244, 35,
+150,140,117,197,172,114, 68,180,177,140,109, 75, 81, 8, 23, 2,164, 67,175,235, 57, 93, 77, 73,192, 15,243,121,191,217,136, 50,
+ 90, 85,178,150,102,220, 76,192,155,228,124, 79,136, 79,161,172, 10,114,144,247,113,138, 19, 85, 89, 93, 41, 14,118, 62,199,141,
+ 17,204,248,114,177,192,106, 43, 76, 21,163,232, 59, 97,219,151,101, 73,223,203,136,209,252,141,191,242,151,126,219,175,111,240,
+250,219,111, 96, 85,228,211, 7,143, 88, 46,214,156,239, 26,212,176,229,207,126,240, 67,138,245, 77,202,194,243,236,197, 11, 78,
+ 78, 95, 80,151, 21,214, 27, 46,206,159, 82, 21,142,131, 61,207,178, 92,160, 23,123, 88,103, 57,217,158,242,187, 63,120,135,159,
+190,247,128,194, 84,236,175, 87,228, 49, 96, 49,220,186,113,107,222,205, 14,140,217,144,203, 10, 83, 47,233, 83, 34,103,131, 47,
+ 10,186,182,103, 28, 7, 98,150,132,177, 75,211, 64, 10,130, 43, 53,218, 16,114,196, 42,133,214, 32,212, 39, 37,149, 86, 63, 16,
+ 70,217,199,204,179,195,113,154,194,149, 83, 59,196, 72, 8,145,162,172,168,170, 26,201, 29,118, 34,171, 12, 61, 57, 9, 81, 42,
+132,128,117,118, 54, 85, 32,151,115,144, 53,177, 28,133, 36, 53, 14, 35,100,153,227,203,139, 52,231,113,167,132, 47, 10,198, 97,
+ 32,199, 40,242, 77, 20,232,129, 50,226,176,239,187, 14,175, 13,218, 40, 98, 86, 56,173, 80, 78,214,217,166, 32, 88, 67,133,204,
+110,181,182,120, 43,243,227, 75, 72,134,184,176,179, 36,245, 76, 19, 49, 71,226, 24, 80, 89, 93,117,153,164, 68,204,226,116,207,
+ 89,118,122,115, 74, 88, 51,239,111, 43,197,122,181, 22,217,110,154, 56, 59, 23, 90,222,101, 82,144,208,213, 36,181,104,156, 38,
+ 10,127,153, 38,166,113,222,207, 7,132, 98,219,182, 36, 96,183,221,208,247,146,231,238,172, 97, 10, 51,210,117, 86, 6,178, 18,
+122,149, 72,237,226, 28,111,187, 14,237,164, 80,186,244, 67,164, 40,232, 73, 51,171, 52,164,203,234,116,182,136, 41,249,158,140,
+152, 0,208, 40,180, 18,122,157,247,130,141,148, 23,108, 98, 81, 47,153,194,196,122,185, 68,105, 51,203,241, 35,133,247,104, 35,
+224,152,182,149,241,133,115,194, 5, 40, 10,249, 62, 99,148,128, 9,111,197,208,215, 13, 18, 93,170,148,194, 59, 49, 54,165, 44,
+187,226, 49,103,152,199, 28,211, 36,100, 55, 73,197, 50,244,189, 20,143,144,217,117, 45, 99, 63,161,148,102,156,228, 96,140, 49,
+206,197,148, 96, 78,133, 0, 40,251,245, 33,136,106,163,200,146,197, 16, 34, 83, 12,164, 16,100, 71, 58, 69, 65,227,230, 68, 51,
+136,156,159, 97,126, 31,144, 11, 40, 38,124,225, 49, 86,248,215, 40,152,166,145,114, 30,211, 8, 48, 72, 16,153,117, 93, 17,131,
+116, 37, 83,144,159, 95, 81,120, 41,250,172, 17, 47,128,179,120, 47,217,245,122, 86, 9,134,113,194, 88,195, 16, 38,156, 95,144,
+ 66,162,170, 52,109,219,243,236,100, 75,123,241, 28, 87, 56,246,143,175, 19,135,142,132,172, 41, 78,195,196,249,105, 71, 89,149,
+244, 99,194, 87, 37, 74, 59,180,146, 17, 85, 78,160,181,130,105,160,178,142, 23,143,206,249,240, 23, 79,153, 58,104,182, 35,155,
+147, 11, 66,219,241,232,233, 57,123,235, 21,138,196,249,217, 22,235, 11, 22,213,130,131,195,125,114, 63,241,233, 71, 15,121,248,
+224,115,114, 12,108,183, 59,158, 63, 59,151,162,188,172, 24,135,134,118,215,112,113,113, 78, 28,132, 90,216,238, 26,156,117, 50,
+118,139, 1, 53, 77, 82, 92,149, 82, 40,151,139,133,236,133, 43, 41,246,141, 55, 18, 31, 27, 2, 78, 43,118,187,150,190, 29, 89,
+174,151, 2, 58,137,129,178,148,159,183, 87,146, 20,232, 75, 47,208,162, 44, 23, 74, 57,119,119,195, 56, 97,149, 2, 50, 83,202,
+116,109, 75,140,145,178,178, 52, 23, 27,170,186,146, 98,106,156, 80,218,202, 92,156, 76,181,218,195, 22,210, 69,166, 44,103, 65,
+214,138, 20,147,156,149,206,162, 72,232, 40, 69, 74, 72, 19, 82,176, 4, 98,134, 20,229,185,205, 74,138,202,156,242,188,142, 38,
+116,189, 24, 2,121, 10,228, 40, 23,237,120,185,217,227, 97, 24, 36,243,224,252,252,148,107,215,175,211, 53, 23, 40,191,207, 87,
+191,251, 31,129,234, 9,195,134, 41,100,114,120,153,237,243,134,103, 79,223, 97,251,226, 67, 94,122,253,223,228,175,254, 3, 40,
+191,106, 25, 63, 89,178,249,240, 22,219,229, 6, 63,157,146,141,199,164,192,201,227, 71, 44,142,174,241,248,199,239,176,178, 16,
+200,252,218, 47,127,155,151,110, 92, 99,127,125, 8,198, 81,236, 47, 89, 30, 93,103,127,127,143,219, 55,110,242,202,173,107,188,
+118,235, 38,215,150, 14,167, 50, 47,221,189,206,241,254,146, 47,191,245, 10,215,214,158, 28, 58,202,202,112,113,113,194, 94,109,
+ 41, 92,100,243,226, 25,214, 4,118,155, 11, 86,118,192,230,142,238,226, 25,213,184, 99,115,113,206,243,231,207, 41, 77, 98,187,
+219, 49,182, 13,199,135, 75, 14,246, 22, 28, 46, 60,125,183,165,242,154,169, 31,208,214, 19,198,137, 41, 68, 20, 2,146,154,198,
+ 48,251, 45, 2, 85, 85, 99,188,163,240, 51,221,207, 90,198, 40, 13, 69,233, 10,154,174,193,168,153,186, 9, 87,205, 82, 8, 66,
+230,148, 81,230,165,249, 89,227,140, 67,207, 77, 80,202, 9,187,190,253, 58,251,215,246, 57, 63, 61,229,221,159,125,132,171, 86,
+140, 26, 32,241,179,143,158,112,112,235, 21,250,161,165,139, 3, 79,159,159,144,135,137,103, 47, 54,188,246,234, 61, 20,142,251,
+247, 86,220, 58,188,206,163, 39,207,121,252,249, 35, 82, 84,124,244,217, 57,135,135,135,188,118,231,158,200,131, 90,205,213,160,
+230,244,252,148,102, 12,140, 9,172, 47,168, 92,164,111,229, 50,213,198,146, 67,146,174,220, 21,180, 77,195,166, 9,212, 44, 40,
+230, 11,161, 27, 36, 19,153, 8,182,168,200, 57, 98, 11,100, 94, 57, 12,248, 66, 46, 6,103, 12,125, 63,226, 11,133,178,154, 85,
+185,154, 15, 30, 71,152,190,200,189, 53, 70, 14,249, 52,131, 66, 66,152,104,187, 14, 53,255,151, 82, 64,107, 71,225, 61,201,201,
+ 78,183,115,194,239,109,155, 86,138,147,208,161,181,194,102,203, 24, 71,188, 47, 49, 42,203,177,170, 20, 33, 76,172,214, 75, 50,
+179, 33, 10,169,240,134, 56, 81, 20, 11, 22, 94,214,211,242,124,176, 19,198,249,207,204, 39, 70,206, 12,243,140,215, 57, 75, 72,
+ 19,139,197,138,144, 68, 46,238,199,137,194,137,241,195, 90,131, 47, 11, 82, 76,104, 5, 93, 39,102, 58, 48,216,156, 25, 98, 68,
+147, 89, 20, 37,104, 57,228, 83, 8,108, 54, 27,194, 20, 65,101,150,203, 53, 32,115, 26,107,173,204,209,148, 20, 58,253, 40,187,
+240, 41, 74,212,107, 6, 22,203, 37,219,205,197, 28,174, 49,178,219,109,229, 18,214,178,151,171,140, 56, 62,199,221,142, 80,120,
+ 70,107, 69,238,157, 15,143,105,144, 64,161,170,168, 48, 70,138,176, 16, 37,202, 49,140,178, 79,190, 88,214,242,181,140,129,148,
+ 50,101,237, 81, 73, 76, 93,219, 94,224, 64,139,170, 34, 4,185,240,201, 98,120, 65, 9,122, 23,165,240,206, 49,204, 44,229, 97,
+ 28, 81, 89, 58,153,126, 24, 57, 59, 61, 99,181, 90,113, 25, 89,153,149,228, 94,119,131, 20, 66,151,169,103,105, 24,232,227,132,
+130, 43, 31,195,122,111,239,170,112,138, 49, 82, 22,165,132, 65,140, 61, 93, 43, 88,222, 75,114, 84,105, 44,125,156,115,189,181,
+ 34, 69, 49,206, 36, 45,238,101, 16,165, 0, 18,147,146,203,126, 10,129, 97, 2,165, 1, 37,159, 69,156, 11,182, 52,102, 57,168,
+181,144, 4,251,190, 23,243,167, 49, 56, 99, 80,200,159,157,154, 22, 20,212,139, 90, 46,241,186,154,163, 63, 35, 74,121,188, 23,
+110,126,219, 74,112, 70,215,182, 87,144,163, 16,228,103, 16,115, 20,170,159,210, 24,163, 80, 57, 83, 85, 37,117,233,233,250,129,
+126,232, 88, 45, 87,104, 37,161, 64,221,110,203,209,177,231,252,236,148,166,203,196, 23, 47, 80,185,195,248, 21, 62,206,161, 47,
+203, 18,101, 28,153, 76,123,113, 70,223,122,140,118,244, 93,207,114,165,168,138,130,174,153, 8, 74,211, 79, 18,180,179,183, 94,
+208, 77, 61,149,247, 88, 11,219,221,150,117, 93, 49, 14,145,174,151,247,183, 12, 25, 76, 34,119,138,202, 27,148, 50,104,171,104,
+183, 27, 49,143,213, 43,129,189,232,192,249,139,115,180,181,188,252,210, 75,236, 54, 27,240, 5,206, 88,214,123,107,218,205,134,
+ 23, 23, 23, 8,226, 80, 46, 62, 49, 91, 73,129,152,156,172, 97,102,165,209,202, 80, 91, 81,104, 92, 89,243,252,228, 57,165, 47,
+ 41,235,146, 7,159, 60,162,189,104, 41,235, 82,252, 13, 90,100,249,108,148, 36,171,149, 21,202, 10, 55,190,116,142,110,236, 49,
+ 58,147, 19,164,217, 72,215,110, 26,146, 18,144, 16,202,176, 90,237,177,107, 55, 68, 38,148,113, 76,125, 79, 81, 85,216,218,194,
+ 84,207,157, 95, 66,107,132,125, 81,214,236, 6, 37,231,101, 63,160,147,197,228,140,210, 86, 30, 46,101, 73,105,146, 49,145, 83,
+164, 32,238,120, 99, 12, 41,107, 49,229, 41, 37, 69,166,210, 88, 50, 99,215, 51,120,199,162, 90,115,113,114,194,106,185,224,103,
+ 63,122,135, 87,126,249,109,222,254,119,255, 83,190,178,248, 45,202,241,251,252,139,127,254, 59,124,252,139,223,231,211, 15,126,
+159, 28, 26,198,237, 67,138,245,155,188,253,230, 93,110,232,129, 50, 79,172,255,122,131,122,176,230,231,255,243,109,206,247, 62,
+226,112, 61, 80,151, 37,239,253,248, 39,220,234, 39,238,222,190,203, 31,253,111,255, 11,247,191,242, 6,183,238,223,192,132,142,
+227,162,196,215, 75, 40, 60,213,106, 69,172, 39, 52,137,202, 24,116, 72,124,222,238, 88,239,105, 54,155, 11,246,246,246,120,233,
+232,144,226,238, 45,190,249,237,175,176, 62,144,153,249,193,205,235, 60,123,246, 12, 66, 98, 28, 58,218,139,142,156, 21,159, 61,
+125,202,222,254, 62,247, 94,126,157,211, 23,207, 72,237, 64,123,190,227,230,221,155, 60,127,241, 57,102, 81,240,244,209, 51,134,
+ 33,114,216, 6, 78, 78,159,114,227,206,130,156, 12, 93, 23,216,126,122,129, 45, 28,161, 75,228,164,200, 65,147,149,150,230, 42,
+ 75,188,111,176,134,105,144,177,207,106, 85,145,178, 34,117,153, 77,179,101,111,181, 34,165, 68,211, 52, 8,135,194,162, 16, 58,
+103,206, 9,137,184,117,224,196,108,109,102,133,208,252,141,191,253,215,126,251,226,233, 83, 30,124,250,132,128,102,239,112, 73,
+ 97,231, 64,122,224,201,227,207,105,198, 13,239,191,251,144, 97,154,248,198, 55,190,202,225,141, 3,188,201,156,157,110, 40, 11,
+195,131,135,159,241,139,207,123, 46,182, 61,202,120,110, 92, 59,162,210,137,105,234, 81,179,180,211,245, 19,187, 49,210, 68, 48,
+174,160, 94, 45, 41, 11,201, 61, 30, 71,145,144,173,115, 76,211, 72,214, 10,239,102,167, 57, 16,131,184, 7,229,126,203, 92, 2,
+244,149, 74,104,103,209, 90,190, 89, 51, 75,166, 33, 70, 89, 91,210, 51,150, 49, 67,210, 26,239, 68,194,118, 94, 24,223,214,121,
+188,243,178,131,236, 11,180, 17, 67,152,144,173, 2, 86, 65, 89, 87,104, 45, 38,138,171,104, 72,113,153, 96,157,196,233,137, 36,
+106,209,142, 89, 62, 41,216,237,182, 36, 32,198,137,213,114,201, 52, 75, 43,113, 10,114,233, 40,133, 47, 42,212, 12,187, 80, 64,
+211, 73,230,112,140, 73,214,215, 16,137, 64, 41, 49,119,153,249, 82,159,130,112,178,199, 94,246,219, 67,148,249,237, 52, 74,180,
+ 34, 74,216,213,114,105, 75,231, 56, 6, 1, 46,164, 24, 65,139,243, 54,132,200,230, 66,210,186, 18,204,217,191, 18,142, 16,162,
+ 24,177, 22,139, 5,133, 43,100,159,220,104,198, 81,192, 47, 33,202,108,109,185, 92,208,204, 72,219,156, 18,203,121, 37,195,120,
+ 79, 85,214,210, 13,205,210,177,153,127, 86,104,233,244,125, 81, 80, 56, 39,115,171,105, 34,164,217,156,134,124,240,151, 60,236,
+170,170,174,128, 12,214, 59, 46,119,222,219,221,142,126, 28, 9, 33,130, 81, 12, 99, 32, 78,163,116, 84,133, 23,243, 99, 22,243,
+ 8, 74,232, 82, 83,152,208, 74, 19, 82, 4, 37,172,111,235, 12,109,211,210, 52, 13,109,215, 73, 90, 19,224,141, 65,205,238,244,
+205,230,130, 48, 78,148,139, 5, 33,136,124, 45, 46,102, 80, 86,147,162,132,223,228,156,169, 23,181,236,246,134,140,247,134,139,
+179, 11, 54,231,103,164, 44, 56,206,122,177,160,240,133,208,240,170, 26,133,172,152,121,231, 41, 11, 47, 82,168,179, 98, 78, 52,
+ 82,168,149, 69,137,183,134,114, 54, 86, 26, 37, 51,125,165, 64,169,140, 74, 80,148,229, 23, 43, 54, 97,206,208,118,194, 14,240,
+133, 40, 73,253, 56, 48, 78,113, 6,116,212,120, 35,241,202, 0, 41, 39, 82, 78, 92, 38,122, 25, 5,187,166,101, 10,242,121, 75,
+ 74, 87,148,223, 51, 10,107,103,114, 99,204,179,178, 36,221,196, 52,142,115,180,164, 99, 82,178, 46,186,172, 45,227, 24, 57, 57,
+ 27, 24,251, 29,198,120,202,186,160, 90,172,177,165, 67, 33,115,250, 20,165, 72,113,214,144,178,160,120,115, 20,183,190,241, 18,
+210, 19, 83, 66,107, 73, 95,219,236, 90,124, 89,210, 77, 35, 10,241,130,148,229, 2,107, 4,216,163,208,148, 69, 73, 54, 10,157,
+181, 20, 2, 89, 49, 41,112, 90,163, 84, 66,153,136,154, 6, 54,109,131,113, 37,123,171, 37,198,137, 49, 42,197,192,174,233,136,
+ 33, 9,190, 53,201,187, 21, 98,128,152,137, 42,146,145,104,106,101,229,235,211,214, 50, 13, 3, 99,211, 50,244,130, 14,174,235,
+ 18,109, 20, 73, 9, 89,209, 91, 7, 70, 46, 74,131, 64,146,138,162,148, 85, 74, 37,134,220, 16, 2, 99, 43,115,125,239,189,188,
+ 15, 10,180, 22,114,159,177, 90,176,197,179, 63, 71, 25, 69,142,137, 20, 2,125, 63,208,245, 29,164,136, 74, 10,140,198, 21, 5,
+210,171,167,203,154,155,218,151, 20,101, 65,225, 29,101,233,169, 43, 73,255,178, 90,168,139,203, 69, 37,103,165, 49,216, 89, 6,
+158, 79, 23,201,199,176,138,118, 23, 41,170,130,245,222, 62,103,167,103,124,249, 43,111,243,189,255,228, 63,100,124,240, 37,126,
+245,239, 95,227,251,191, 50,242,215,254,246, 43,132,226, 55,248,218, 55,126,157,226,248, 85,170,229, 91,124,251,251,127,159,251,
+255,222, 5, 31,133, 5,207,254,153,101,243, 83,207,240, 76,241,244,243,142,207,223,251, 9,161,236, 88, 93, 63, 68,181, 13, 31,
+253,252,231,228,161,229,241, 7, 31,242,157,239,125,151,223,248,203,127,137, 63,254,189, 63,194,105,205,194, 89, 72,129,131,253,
+ 21, 78,129, 87,138,246,226,132,161, 61, 71,155, 12, 42,145, 98,160,170,197,155,227, 11,207,215,190,242,109, 94,190,255, 58,167,
+207, 54,252,179,127,250, 59,164,177,167, 86, 53, 43, 42,108,208,152, 62, 80,216,138,187,183,238,241,252,227, 79,113,195,192,129,
+ 53,108, 63,255,132,253,202,114,123,127,159,240,108,195,129, 43,216, 47,107,150,139, 5,223,253,206,119,185,127,235, 30,175,190,
+250, 50,135,199, 7,124,239,183,190, 75,185, 92,178,168, 44,218, 70,108, 24,176,121, 68,231,200,216,205, 41,124, 36,134, 40, 16,
+170,144,210,149, 90, 25, 66, 36, 41, 45,138,160, 54, 20,133, 39,198,132, 47,203,171,119,189,235,122,134,113,148,145,141,179, 3,
+113,176,193, 0, 0, 32, 0, 73, 68, 65, 84, 87, 40,103,243,214,203,119,127, 91, 25,207,241,141, 99,172,143,140,231,167,116,159,
+127,194,159,252,193,191,230, 7, 63,124,135,231, 23, 29,219, 54,112,116,184,198, 41,197,246,228, 41,139,149,226,253,247, 63,102,
+127,191,102,204,158,207,159,183, 28,238,239,113,227,230, 53,246,247,151,140, 83,123,245,128, 55,205, 72,147, 52,197,122,133,175,
+106,172,247,114,153, 27,139,181,194, 98,247,222, 51,133,136,164, 11, 65,154,231, 33,202, 24,188,181,140,227, 64, 74, 95,144,206,
+ 64,102,204, 40,141,213, 10,180, 66,163, 25,131, 72,103,206, 90,114, 2,239, 44,237, 40,156,230,105, 12,179,211, 90,144,146, 41,
+102,180, 18,101,215, 24, 67,211, 52,140,227,196, 24, 5, 88,162,181,146, 74, 55, 76,232,156,176, 86,211,117, 45, 93, 63,208, 52,
+130, 27, 53,214, 18,131,204,143, 47,209,165,117, 37, 24,196,170, 40,201, 81, 16,167,114, 56,203,225, 38,124,117, 77, 86,153,190,
+ 31, 17,167,166, 69,187,185, 56,112,238,234,112,246,133,100,238,106, 20, 33,141, 40, 5, 49, 38,198, 48,162, 16,233, 69,228,112,
+ 35,180, 56, 68,174, 14, 33,147,114,162,217, 53,228, 44,121,203, 57,102, 48,154,186, 20,137,239, 98,179, 97, 24,100, 36,113,233,
+250,143, 49,201, 78,164, 51, 87, 70, 66,173, 5,213, 90,213, 37, 57, 43,140,179,212,149, 68, 91, 86, 85, 69,211, 54, 84, 11,201,
+ 15,174,171, 10,227, 28, 67,223, 11,100,134,204, 24,133,217,175,181, 18,165,196,200,193,171,149, 98, 24,231, 0, 2,173,113,179,
+210,114,153,131,172,140,166, 46,229,192, 73, 73,246,208, 67, 16,120, 3, 89,164, 64, 99,133, 8,167,141, 33, 12,129,178,244,132,
+ 73, 36,170,105,154,176, 78, 46,134,126, 20,247,249, 52, 5,172, 53,178,119,157, 69,158,183,214, 51, 12,189,144,223,130,164,192,
+229,148, 8,243,200, 97,106, 59,134, 40,100, 44,109, 53,139,122, 65, 76, 82,152,173, 87,107,140, 54,116,187, 29,101, 93, 32,206,
+197,200, 48, 77, 24, 37, 47,226,118,187,187,218, 42,176,222,203, 92,205, 75,215, 31, 83, 68,231,140, 53, 70, 14,116,163,201, 41,
+ 50,134,137,110, 28, 25,198,158, 24, 51, 49,201,243,103,141, 96, 45,101,168,132,200,191,136,103, 35,165,200,200,156,124,135, 96,
+ 57,189, 19, 7,118,211,236, 68,181, 48, 10,131, 92,144,101, 85,114,153,192,231,189,103,187,221, 50, 78,227,213, 40,198, 23,158,
+182, 31,209,206, 80,250,130,194, 21,160, 52,206, 27,166,113,162, 40,196, 36,151, 98,160,172, 75, 66, 24, 49,179, 4,136,146,159,
+109, 12,146,116,229,138,138,106,181, 79, 85, 22, 44, 10,195, 20, 18,103,155,150, 97, 28,133,130,101, 11, 41,118,170, 26,227, 60,
+198,149, 88,239,104,119, 23,244,187,158, 41, 73,220,112,215, 13,196, 65,242,172, 83,134, 20, 71, 98,210,184,114,193, 56,244, 72,
+206,245, 68, 70,224, 83,101, 85,210,182, 59, 10,103, 64, 37,134, 97, 98,111,127,133, 45, 10,246,215,123,236, 31,172,177,222,113,
+243,230, 45,234,245, 62,109,211,242,210,173, 59,124,231, 27, 95,230,252,244, 57, 39, 79,158,178,180, 98, 84, 77, 41, 97,212,252,
+115, 87, 26,107,156,100,112,207, 99, 11,227, 28,113,146, 45,130,105, 26, 37,154, 21,168, 87, 11, 92, 81, 80, 47,150,104,109,217,
+ 91,237, 81, 45,151,184,186,162,222, 91, 65, 4, 61, 95,198,205,197,134, 49,200,120, 81,194,125, 36, 27, 61,106,105,164, 67, 78,
+ 56, 83,176, 88,173, 8,211,192,110,219, 72, 0,201,148, 72, 57, 82,150, 2, 56,185, 12, 6, 34,139, 41,117,236,123,156,145,188,
+109, 49, 89, 26,140, 70,222,169, 40,107, 95,133,243,243,255, 39,187,219,202, 24, 28,144,149, 6, 5, 86,107,194, 40, 78,116,239,
+101,215, 61,164,136,240,203,225,254,203,111, 16,148,133, 24,248,246,223,250, 62,254,250, 61, 46,222,191,206,247,127,253,144,111,
+148,142, 35, 44, 15,238,195, 65,130,235,235, 3,170,131,125, 66, 55,162, 30,236, 81,220,134, 79,222,129,159,191,215,243,232,253,
+ 39, 60,127,254, 30,211, 48, 82,171, 99,220,177,167, 82, 29,207, 62,250,132,105, 26, 88,183, 59,170,178, 66, 37,203,131,143, 31,
+176,218,223,227,230, 43, 47,243,232,197, 9,103, 23, 39,100, 18,103, 79,158,176,217, 94, 64,136,108,206, 79,177,198,176, 92, 46,
+176, 69, 37,216,228,194,163,179,152, 36,167,182,227,206,221, 91, 28, 30, 29,114,237,218, 49, 67,232,249,197, 39, 31,144, 21, 44,
+247,247, 48, 38, 19,167, 6, 73, 68, 43, 57,186,125,196, 39,103, 47,120,120,114, 74,185,191, 38,146,233,211,196,179,147, 19,250,
+177,231,248,232,136,235,235,125,250,243,134,251, 55,238,241,198,253,151, 48,113,228,165,251,183,249,206,175,253, 42, 47,189,250,
+ 50,155,102,135,183,153,167,143, 63,131,126, 36,237, 54,220,185,126, 13,171,102, 67,102,136,216,249,243, 8,113, 34,228,140, 47,
+ 10,180,181,178,105, 17, 35, 33, 73,110,123, 86,208,119, 61, 67,223, 51,142,178, 34,109,254,198,223,252,171,191,109, 82,203,238,
+201, 99, 62,248,211, 63,230,221,119,126,204,159,254,248, 67, 46,198,204,179,109,203,170, 46,249,210,151,238,192,212,114,180, 48,
+188,246,246,107,124,250,217, 11,186, 62,241,225,195, 11,148, 22,102,122, 81, 9,235,122, 28, 6,226,152,136, 65, 49, 98, 25,180,
+ 97,185, 90,163,141,204, 62,141,177,116, 77, 71,215,183, 24,235,228, 64,138, 9,157,213, 60,147,118, 48,207,129, 98,152, 31, 50,
+ 95, 96,140, 2,165, 69, 74, 82,242,118,101, 34,211, 24,209,136,129,170, 27,123, 57,152,146,194,186,185,227, 67, 1,114,201,213,
+101, 77,136, 95,172,147, 13, 97,158, 33,229, 44,107, 66, 49, 50,141,129,148, 19,211,216,203, 33,172, 20,222,201,218,209, 48, 13,
+244, 93, 47,221, 73,146,189,108, 41, 6,102, 60,168, 18, 35, 95, 74,113,102,147, 79,104, 5,109, 47,115,105, 73,252, 81,196,105,
+ 66, 41,139, 47, 60, 73,101,198, 65,176,168,205, 56, 8,177, 47, 65,154, 15,251,156,179,204, 84, 98, 70, 43, 43, 47, 82,134,148,
+ 18,222, 22,178,250, 96, 44, 49,139,116, 43,178,178,188,176, 83,148,117, 40,231,156,228,239, 90, 33, 30,109,182,219,171, 89, 78,
+ 93,215, 44, 22, 11,202,178,164,174, 75, 98,146, 78, 34,205,151,241, 48,140,196, 44,204,119,227,196,156, 53,116, 61, 33,139, 75,
+122,189,150,139, 77,107, 61,147,203,164,179,142, 41,205,127,151, 99, 26,229,107,115,206,145, 64,208,136, 93,135, 47,132,181,108,
+181, 66, 25,195, 52, 6,150,235, 53,222, 9,182,209, 88, 73,107, 19,188,107,100, 81,151, 24, 37,236,229, 75, 23,168,202, 50,202,
+112, 86,208,150,162, 76, 76, 44, 74,249,179, 67,136,144, 35,198,200,158, 57,200, 60, 92,105,197, 20, 34, 85, 89,204,115,107,217,
+249,212, 90, 46, 79,101,228,123, 42, 86, 75,150, 85, 77, 89, 87,212,165,204,200,235,170,198,151, 2, 16,210, 90, 48,158,133, 47,
+229,123, 47, 43,188, 51,244,195, 72, 81,120, 66, 24, 89, 45, 87,172, 86,107, 22,203,138,186, 40, 9,147,252,121,103, 29,137,204,
+ 20, 5, 38,145, 51,156,158,158,179, 59,191,160,219, 53,194,136,232,251, 43,201, 91, 27, 49, 42, 93,166, 65, 41,102,229, 42,201,
+207, 34,130,152,247,208,160,196,204,122,249,123, 33,200,187,217,117, 61, 33, 10,214,210, 90, 59,143, 87,132, 70, 87,150, 37, 85,
+ 85, 80, 20, 2, 66, 18,188,105,193, 52,201,124,112, 24, 58,208,178, 73, 97,180,152, 50,157, 47,216,110, 55,212,181,164, 10, 86,
+117, 69,225, 61, 97,154, 88,173,150,148,115, 39, 56,197, 9,109, 29,217, 22, 50, 7,118, 26,111,101, 19, 4, 5,198, 56,140, 85,
+ 92,156,157,146, 82,196, 23, 75,142,111, 92,163, 92,200,170,101, 93, 47,137,105, 96,154, 90, 52, 17, 27, 3,218, 36,156, 17,191,
+202,122,111,193,241,209, 33,215,175, 31,162, 83, 36, 13, 29, 71,139,146,213,122,143,187, 55,174,161,141,230, 91,223,248, 18,199,
+135,135, 92, 63, 60,102,111,111,197,173,155,119,184,126,237, 22, 7, 7,199,236,175, 86, 52,167,167,188,120,254,140,231, 23, 23,
+ 20,133, 71, 23, 14, 91, 22, 44, 87, 53,251,135,107,154, 38, 16, 99,194,104,200, 33,146,166,129,105,108, 25,167, 30,166, 1,147,
+ 19, 33, 6,124,225,217,219, 63,192, 21, 53,213,162,196,218, 98, 94,131,116,100, 20,202, 64,232, 70,242, 20,196, 55, 84,175,168,
+150, 21, 89, 69,134,166, 99, 10, 1,227, 28,154, 72, 84, 18, 96,227,202, 2,171, 36, 56,169,107, 90,156, 17,163,168,179,226,198,
+ 38,137, 81,211, 24, 73, 18,203, 41,145,146, 66, 27,133,210, 86, 58,189, 16, 32,167,121,124,144,241, 86,208,181, 90, 67, 38,145,
+148,188,135, 0, 49, 5,178,209, 56, 99, 40, 23, 37, 42, 9,126, 90, 27, 67,206, 64,140,184,162, 16, 79,136,114,115,241, 48, 50,
+134,145,190, 54, 76,238,128,125,243, 29,142,126,185,226,245, 42,242, 63,180,138,127,242, 95, 94,112,239,251, 37,203,183,224,241,
+ 31, 91,118,219, 63,224,201,103,207, 49,143,239,178,255, 87, 50, 11,237,160,223,227,120,249, 10, 95,254,181,175,115,243,206, 91,
+ 84,247, 3,102, 58,227,193,159,253,144,222, 56, 14, 73,212,198,241,224,193, 99,186,174,227,123,127,241,123,220,191,255, 42,203,
+189, 37, 97, 28, 57,121,113, 66,215,180,172,171, 5,245,162,162,233, 58,210,108, 18, 62,220, 59,148,196, 54,101,136, 99,224,201,
+103,159, 19, 38,145,245,183,155,142,131,253, 3,234,253, 67,146,205,252, 91,255,206,223,165, 94, 45, 81, 73,241,214,107,111,112,
+124,227, 6, 15, 63,249,152,113,154,120,252,252,156, 91,119,239,114,231,229,151,217, 13, 35,183, 94,186,205,205, 59,183,209, 30,
+222,249,217,143,169,151, 53, 79, 95, 60,101,187, 61,167,212,158,107,171, 21,219,205, 5,195,118, 75,161, 20, 47,221,190,205,215,
+190,242, 54,127,235,239,252, 27, 28,221, 90,115,239,213, 91,156, 53, 47,216,156,183,108, 78,159, 82,229,158, 66, 79, 84, 22,188,
+ 10,168, 60, 73,241,175,141,108,251,148,158, 24, 34, 86, 95, 42,203,151,136,112,217,127, 55,118,120,250,219, 31,191,251, 33,231,
+ 39, 79,120,247,163,207,120,239,225, 41,209,122,186,113, 7,211,196, 65, 53,240,252,249, 83,232,123, 72, 35,159, 61, 62,199,153,
+ 37, 81, 23,188,254,198,109,156,179,220,188,126, 13,231, 28,221,102, 67,215, 14,248,229, 1,245,209, 49, 56,137,107, 28,194,120,
+101, 30,114,222, 51, 78, 66,130,107,154,150,174,235,232,154,134,110,232,133,203, 61,141,212, 69,129,247,110,238, 22, 58,180,146,
+249,166,209,138,148,132, 61,158,115, 38, 43, 37, 29,130,179,132,152,241,206, 16,115, 38, 79, 17, 91, 90,250,110,184,122,200, 99,
+ 76, 12,211, 72, 93,150, 2, 64, 49,194,226,190,116, 36, 79, 65,102,183, 89,205, 73, 80,133, 71, 33, 1, 6,245, 98,193, 52,200,
+238,116, 63,140,212,181,236, 55, 67, 70,220,142,176, 90,175,200, 58, 81, 23,158,172, 5, 16, 19, 66, 68,105,136, 33, 73,216,197,
+ 24, 24,167,192, 20,229,239,213, 86, 76, 45,166,240,168, 12, 9,129,122, 72,146,146,124,189, 67, 63,145,179, 68, 27,118,221, 56,
+ 23, 52,178,183, 28,149, 72,229, 78,203, 76, 62, 38, 8,211,128,153, 37,218,194, 23, 36, 18,117, 41,169,109, 49,140,130,198,205,
+153,213,106,129,247,114,128,199, 40, 35, 5, 95, 84, 40, 18, 77, 55, 80,120,203,174,237,240, 86,246,175,235,229,146,169,151,238,
+181,172, 75,156, 17, 83, 99,206, 66, 56,146,164, 33,217, 67,191,220, 19,181,214,210,245, 61, 90, 27, 73,242,178, 18,118,130, 18,
+ 73, 92, 43,133, 8,191,154,161,239,200, 42, 83, 22, 5, 70,207, 10,132, 18, 56,131, 54, 66,194, 75, 49,211,244, 61, 93,215, 82,
+184,121,139, 64, 75, 39, 97,172,160,100, 47, 59,240,162, 42,103,149, 98, 98, 24, 37,145, 73, 33, 74, 73, 10,178, 91,190, 94, 44,
+103, 89,217, 81, 22, 37, 69, 33, 89,228,213, 98, 65, 85, 85,114, 65, 89,145,175, 81, 74,100,249,185,232,177, 74,137,105,211, 26,
+121,158,167,129,186,174,104,154,157,108,108, 20, 82, 56,104, 52,214,137,154, 82,120,249,154, 51,194, 10,239, 71, 57,132,117,134,
+182,239, 8, 83,162,235, 91,166, 97,132, 48,128,210,164, 41, 16, 21, 84,179,195,214, 89,115, 85, 60, 93,102, 0,164,148, 49, 40,
+148,247,152,153, 37,208,181, 45,218, 24,170, 43, 57, 94, 92,181, 18,126,145,152,226,196,216, 75, 70,250, 48,200,248, 71, 43, 69,
+206, 89,156,189, 89,212,146,190,111,165, 16,142, 65, 2,135,130,152, 24,199, 81,120,249, 33, 70,202,170,160,107, 90,138, 74, 2,
+ 77,156,177, 20,165,176,182,211,252,124, 56,239,102, 87,176,167, 90, 44,169, 86,123, 68,227,233,134,129,205,102,203,208,118, 56,
+227, 41, 43, 75,223,245, 24, 37,120,204, 97, 26,217, 54, 59,142,175,221,226,112,181,100,239, 96,143,253,253, 21, 7,135, 43,172,
+ 43, 57,190,115,139,227,107,199,220,184,113,204,122,111, 77,189,168,177,121, 96,187,221,240,244,217, 41,247,110, 95,227,124,179,
+101,156, 34,159, 62,248,156,166,109,121,248,248, 25, 93,219,114, 92, 86,116, 93, 67,211, 53,252,191, 68,189,217,143, 95,103,122,
+231,247,121,151,179,254,150, 90, 73, 22, 73, 81,162, 36,106,111,117,203, 45,245, 98,123, 98,140,237,241, 0, 99,231, 38,152,228,
+ 38,185, 72, 46, 18, 36, 64,242, 71,232, 95, 9,130, 4,152, 36,131,100,110, 28, 4, 72,224, 24, 51,158,113,119,219,189,169,213,
+106,146, 90, 40,238,181,215,111, 59,219,187,229,226, 57, 85,173, 27, 53, 68, 54, 89,245,171,115,222,247,121,190,107,223, 15,180,
+ 94, 49,223,191,206,247,127,240, 9,171,182,163,172, 38, 60,123,121,196,206, 86,133,241,142,205,226, 66,156, 37,117,129,172,186,
+134,162,174,152,205,230, 68,165,104, 54, 43,212, 8,211, 95,156, 47, 70,173,128, 60,151,122,124, 31, 76,150,163,128, 44,183,108,
+154, 53, 42,137,246, 69, 37,161,164, 78,142,206, 48, 56,206,150, 27, 46, 86, 98, 57, 20, 10, 82, 46,250,162, 44,177, 70,211,172,
+214,210, 87, 95, 20, 87,142,140, 60,183,132,232, 9, 73,222,170, 44,183, 40, 45,130, 79, 65,221,204,149, 91, 8,173,136, 73,161,
+ 71,212, 74, 41,121, 70,173, 22,212, 65, 25, 37,121, 10,101,137,213,226, 20, 32,198,241,185, 22, 11,174, 45, 10,116, 76,120, 10,
+178,172, 70,105,195,206,205,187, 20, 59, 57,166,218,163, 12,175, 48,185,184,193,111,190, 80,252,237,255,254,136,221, 59, 7,124,
+250,103, 48,207, 6,126,246,247,150,243,147, 83,224,136,124,126,151,131, 79, 44, 59,119, 97,231, 13,152,246,138,235,115,216,250,
+ 56,225, 31,238,211,237, 86,196,229,183, 60,123,122,200, 43,101,226,183,191,251, 29, 15,239,223,231,131,247,222,198,133,142,159,
+255,250, 39, 60,124,248, 37, 27,215,176,189, 61, 71,229,150,166, 89, 99, 51,203,198, 57, 54,125, 15,198, 80,213, 5,161,151,160,
+173,163,231,207,121,241,226,144,182,217,240,236,219,199, 60,248,226,115,238,189,126,143,183, 94,191, 71,219, 37,222,126,231, 61,
+146,131,161,237,217,219,217,102, 90,151, 24, 21,169,108,198,245,235, 7,244,139, 13,171, 77, 71, 86,100,252,221, 79,254, 22,114,
+197,143,254,248,143,120,246,236, 24,165, 3,219,251,219, 84, 59,219, 36,155,113,188,188, 32, 36, 9,144,201,242,138,212, 13,188,
+243,246,219,252,246,243,251,152,220,240,246, 27,111,177, 55,221,229, 71,223,255,136,143, 63,252, 62,175,191,254, 22,123,251,251,
+148, 91, 53, 47, 78, 22,248,110,131, 29, 54,228,180,236,207, 75,240, 3,209,117, 99, 47,129,102,189, 89, 83, 79, 42,140,209,104,
+109, 48,251,243,233,167, 93, 82, 92,180,145,163,179, 5,182,200,177, 25, 84,202, 19,135, 1, 51, 90,213,108, 53,227,246,237, 55,
+249,232,195, 15,249,237,163,199, 52,237,134,174,233,137,125,207,209,225, 17,171,197, 26, 51,219, 66,215, 91, 68,173, 40,202, 2,
+141, 64,216,222,201,132,107,243, 81, 49,107, 45, 32,182,158,166,235,136,128,177,210,124,165,243,156,174,109,113, 78,194, 70,242,
+ 60,151,198, 31, 45,219,184, 82,138, 20, 32, 4,143, 50, 22,173, 51,220,200, 83,103,202,192, 16,208, 90, 4, 80, 58,137,114,212,
+ 38, 32, 37, 73, 87, 11, 16, 72,184, 16,165, 34, 48,122,156, 79,248,224,104,154,134,224, 61, 69, 33, 66, 21, 31, 18,211,170, 30,
+183,101, 81,115,107,212, 21, 61,160,149,180,123,205,183,183, 72, 41, 50,203,229,133,104, 55, 18,220, 80,150,149,240,203, 89, 41,
+211,114, 89,226, 34,164, 24, 69, 1,105,132, 90,232,250,158,224, 68,217, 28,220, 64,102, 13,131,235,200,181,166,237, 55,164, 32,
+161, 8,121,158,200, 50,133,142,129,174,239,137, 94, 54, 46,165, 32,134, 64,215,172, 41,140, 36,210,233, 36,205,107,133,213,227,
+231, 31, 88,173, 37, 66,215,104,129,163,226, 8,183,133, 32, 22,140,141,211,178, 33,152,130,164, 53,206, 57, 76, 33,225, 20, 62,
+ 37, 66,144,203,104, 24,122, 18, 2,251, 40, 37, 13, 68, 49, 4, 73,253, 82, 34, 28,106,154,102, 68, 47, 18, 70, 75,169,132, 53,
+ 98,235, 1, 72, 17,220,224, 70,238, 23,114,155, 95,169,229, 87,155, 13,174,239,233,135,129,249,124, 46,207,208, 48,144, 84, 68,
+169,116,117, 17, 5, 34,109,211,210, 15,210, 64,103,146,162,247, 3,101, 89,179, 89,175,176, 69, 33,150,198, 76, 82,209,126,223,
+216, 6,121, 81,140,202,222, 72,112, 1, 31, 60, 38, 55, 87,122, 1,241,160,143,225, 30,222,139, 22, 33,136, 88, 76,236, 50, 99,
+ 13,110, 16, 29, 64,110, 37, 76, 70, 27, 77, 94, 20,172,155, 53, 42,203, 24, 66,196, 5,113, 67,120,231,197,179,109, 12, 6, 67,
+145, 21,130, 52, 88,131, 54,150,245,122, 77,145,231,116, 77, 11, 49,162,178, 76,222,147, 32, 21,165,113,156,196, 93, 76, 20,121,
+ 38,156,105,138,216,220,224,252, 0, 62, 80,229,162,133,233,122, 17, 25, 53,155, 13,153,201,174,134, 76, 99, 52, 10,121, 38, 44,
+ 25,218,200, 69,155,231,185, 64,223, 38, 35, 4, 47,241,201, 87,195,174, 97, 90, 85, 56, 47, 14, 5,173, 68,137,159,143,104,134,
+247,129,220, 74, 38,185, 66, 49,184, 65, 6,135,193, 17, 92, 32, 47, 75, 25,236, 66, 36, 5,241,236,134, 24, 48,153,150,191, 51,
+ 47, 8, 86,179, 90,119, 44, 22,107, 72,142, 20, 6,242,172,100,103,255, 26,219,211, 57,171,205, 5, 90, 91, 50,165,168,139, 10,
+ 91,213,108,109,239,178,179,181,195,189,123,119, 89, 44, 55,212,121,197,214,214,140, 62, 52,152,124,198,102, 8,188,243,193,251,
+ 28,220,186,197,206,206,117,174,221, 60, 96,182,179, 79, 84,114, 62,157,172, 22, 60,124,242,132,229, 98,205,116, 82,147, 89,205,
+199,223,127,143,103, 79, 30,163, 52,188,114,251, 54,123, 7,215,153,207,182,248,230,249, 49, 65, 41,110,190,118,155,152,224,244,
+108,133, 79,134,166,105,121,121,120, 74,215,183, 56, 60,139,205, 64,215, 73,202, 92,158,105, 82, 26,216,172,150, 68,231,104, 55,
+ 11, 66, 63,208,174,215,184,161,195,228, 5, 86,103,132, 36, 81,161,214, 74, 80, 76, 12, 27,182, 39, 53,147,122,194, 16,250, 43,
+ 79,117,239,122, 92,219,146,188, 36,152,249,206, 97,114,209, 95,248,193,145,155,156,172,148,172,140, 56,210, 54,209,251, 17,171,
+148, 37, 36,211, 66,225,168, 56, 90,184, 0,137, 43,213, 98,101, 64,141, 20,131, 56, 84,146,146,116,181,205,102,131, 45, 68, 7,
+ 3, 74,106,114,209,160, 34, 93,204,152,207,182,152, 86, 51,110,125,231,207,233,187,231,236,239,220,224,229,163,199,124,251,228,
+144,195,211,134, 77,251, 25, 83,243, 1,195, 15, 20, 15, 87,150,103,127, 15,171,126,205,214,238,119,120,253,141,154,249, 29, 24,
+126, 1,237, 99,208,219,162, 49,153, 56, 17,100, 30,125,177, 5,215,207,121,241,229,231,188,253,254, 59,252,233, 63,249, 17,239,
+125,240, 38,215,110,236, 49, 0, 63,252,195, 63,225,205,119, 62,224,224,224, 85,246, 14,110,114,227,230, 45,190,124,246, 45, 71,
+ 47, 95,208,132,192,175,126,245, 27,206, 23, 23,188,120,249,130,175, 31,127, 75,239,155,241,217, 13,232, 20,240,109,203,245,253,
+107,228, 81, 65, 50, 28,189, 56,196, 40,205, 95,255,155,191,230,229,211, 23,188,120,250,132, 39, 79,190,229,249,211,231, 60,127,
+241,152,212,119,252,226, 23,159,241,139, 47,126,195,245, 27,215,120,242,228, 5,207,143,142,184,117,227, 26,215,234, 93,142,190,
+ 61,228,244,197, 41, 58, 25,148,119, 28,190, 56,230,124,117, 65, 63,108,216,218,218, 98,178, 37, 69,104,203,118,195,233,197,154,
+123,239,188,195, 7, 31,188, 71,150, 89, 22,235, 83,162,119,220,220,218,227,213,253, 3,222,188,125,139,174,237,121,235,187, 31,
+177,179,179,199,124, 50,199,118, 23,204,106,197, 7,111, 92,103,187, 54,108, 23,176, 85, 74,234,103,110, 45,230,214,254,246,167,
+222,193,241,241, 9,211, 89,197,214, 86, 69,219,111,120,113, 60,112,227, 90,197,172,154,160, 39,219,232,204,114,186, 56,225,255,
+251,135, 95,224,154,158,194,102,116,203, 37, 77,235,136,217, 4, 53,223, 70,103,217,213,196,223,247, 29,121, 46, 37, 24,195,224,
+ 73, 41,142, 9, 94,134,213,122, 69, 63, 54,210,224,165,103, 90,163,153,204, 38,163,112, 39,199, 24, 73,105, 2,241,100,214, 69,
+ 41, 7, 76, 38, 74,217,204, 90,134,110, 64, 43,168,170,154,193,121, 12,137,144, 4,174, 50, 70, 68, 68,110,232, 81, 90,163,180,
+ 68,114, 70,128, 40,151, 74, 76,137, 24,127, 47, 28, 41, 51,131,201, 52,126,240,191, 31, 12, 70,123,219,114,181, 34,184,129, 16,
+ 36, 55, 92,105, 81, 21,199, 24,153,212, 21, 85, 89, 96,178, 28,130,163, 31, 15, 51, 99, 12,195,248, 2, 38, 18, 62, 38,170,178,
+ 34, 37, 80,218,224,189,195, 57, 79,150,105,242,178, 70, 41,208, 86,179, 89,175,137, 33,136,247,154, 68,153,215,100,133,197, 24,
+ 17,207,132, 48,126,150,192, 48,244, 12,131, 84,253,229, 70,227, 98,162, 42, 10,252,232,119, 21,117,190,103, 24, 6, 72,160,180,
+166,158,212, 87,222,205,178,172,232, 93, 79,105, 51, 92, 82, 24, 13,214,138, 69, 76, 41,195, 48,116,227,118,166, 8, 97,192,106,
+169, 98, 85,252,126,200,210, 74, 68,138, 97,144, 11, 64,143, 62,209,178,172, 36,130, 22,200,199,242,130, 60, 23, 20,198, 24, 67,
+ 74,226,211, 87, 90,134, 58,173,245, 85,161,142, 26, 17, 22,225,134,115, 41,235,113,129,174, 27, 19,229,140, 40,234,227, 8,241,
+ 15,221,216,188, 20, 71, 17, 83, 18,238, 88, 54, 84,241,154,102,153,165,172, 10,138, 82,106,122,125, 24,107, 15,147, 12,156, 67,
+215, 83,213,210, 69,238,189, 84,219,198, 24,137,163,173, 81,105, 69,145, 23,148, 69,193,166,105,233,218,150, 77,179,166, 61, 95,
+208, 71,127,245,107,151,122,139,174,235, 4,162,182, 86,236,119, 41, 1,162, 37, 80, 74,209,245, 45, 40,185, 4,137, 34,254,204,
+242,140, 62,120,162,243,168,144, 80,153, 65,249, 32,208,168, 82, 2,253,143,161, 52,101, 89,160, 84, 34,183, 34,252, 28,156, 20,
+232,244, 78, 58,193,251, 97,184,122,127,218,145,115, 11, 62,138, 31,185,172,137, 41, 48,155,205,232,251,129,162,172,105,186,158,
+161,239,152,205,102,114,180,167, 68,223,245, 76,234, 26,165, 53,253,184,217, 15,195,192,164,174,209, 35,154,162,128,162, 44,176,
+163, 15, 55,207,243,171,244,188, 16, 2,190, 31,100, 75, 53,178, 13, 26,107,177, 86,124,209, 74, 9,140, 95, 86, 21, 41, 42,202,
+122, 70, 52, 57,109,211,209,187, 13,205,122, 77,210,138, 73, 81,161, 85,100,221,244, 44, 87, 39,172, 87, 29,174,117, 40, 20,126,
+136,188,118,231, 14,171,139,115,126,250,243,207,177,100, 60,254,242, 62,117,189, 3,198, 34,233,112,154,204,230,116,157,227,233,
+243,231,220,185,125, 29, 16,186,109, 58,171, 88, 47,207, 57,124,121,200,217,233, 57,221,166,227,236, 98,195,151, 15,191,226,155,
+135, 95,243,242,249, 9, 81, 25, 76, 86,112,116,116, 66,215,174,217,172, 26,140,150,140, 2,105,255, 50, 66,241,216, 76,170,159,
+ 83,196,196, 68,223,116,164, 20, 32,120,156,139,104,107,132,115,239,165, 19, 60,120,169, 50, 94,109, 22, 12, 67, 71, 86, 40, 76,
+ 94,211,108, 26, 12, 10, 51,166,190,229,153, 5,101,104,250, 14, 60,148,243,138,162,200,199,103, 83, 66,140, 34, 1,239, 28,151,
+137,116, 41, 70,212, 72, 54, 38, 47,131,189, 15,145, 52,210, 93,131,247,196, 32,110, 35,109, 52, 68, 9,117, 82, 90,163,146, 65,
+ 25, 33, 48, 47,145,170,224,123,169, 14, 86, 18,175, 26, 73,232,148,152,236,204,128,138,155,119,239,177,123,235, 13, 94, 62,251,
+ 28,125,120,134,206, 20,213,206, 27, 76,247,183,241,253, 49,145, 10,215,237,242,236,223, 71, 94,156, 60, 37,162,184,254,246, 13,
+102, 51,184,115, 67,241,202,187,107,210, 91,107,118, 95,139, 76,246, 11, 94,126,147, 56,189,128,126,169,121,241,240,115,218,245,
+125,186,166,103,219,247, 84,182,196,164,156,195,179, 11,190,248,236,215, 60,122,248,128, 95,255,236, 51,158, 60,120,196,176, 14,
+252,225,199,127,196,237, 59,111,178,185,232,120,252,236, 5,239,188,251, 93,254,252,175,254,138, 63,253,103,255,140, 31,252,232,
+135,220,186,123,155,174,109, 89,156, 30,113,122,118, 68,211,245, 84,101,206,111,127,253, 43, 30,124,254, 25,143,238, 63,224,175,
+255,183,127,205,251,239,223,227,171, 47,126,205,116, 90,176, 90, 94,112,122,122,194,225,241, 11,209,176, 68,216,221,217,226,205,
+ 55,238,146,169,140, 71, 15,190,226,193,103,191,225,233,151, 95,209, 95, 52,220,222,187,129, 86,138,147,195,151, 52,125,207,209,
+233, 17, 33, 4, 30, 63,121,202,201,225, 9, 58, 70,142,159,159,241,244,219,167, 24,114,238,220,122,157,163,179,115,202, 73,205,
+ 43,119, 94, 65,197, 30, 19, 19, 63,251,233, 47, 40,171, 9,255,237,255,240,223,243,230,119,222,194,217,138,255,251,255,250, 15,
+124,246,224, 9,205,197, 41, 58,116, 76,242,140,247,239,189, 66, 21,123,212, 91,119,174,167,179,243,115,108,110,169, 42,205,224,
+ 90, 94,191,123, 11,163, 20,219,213, 22, 47, 95, 28,177,116,158, 48, 90,213,110, 94,223,193,166,177,125, 44,171, 48,179, 57,110,
+144,124,225, 56,180, 56,159,100, 35,211,138,178,148, 8, 79,231, 60,235,213,138,217,214, 22, 40,197,197,249,130,110,232,241, 41,
+ 9,172,175, 53,187,251,251,194,177, 14,131,180, 33,185,136,119, 61, 85, 37, 73,107,109,219, 73, 45,161,209,116, 93, 55,198,231,
+137, 79,219,216, 76,132, 94, 93,135,201,115,102,211, 25,193, 15, 18, 46,225, 3,218,138,176, 69,107,141, 40,197,147, 76,162, 74,
+ 35,249,203, 17, 99, 44,209, 57,180, 17,203,128,206,198,205, 95, 33, 34,162,213,138,168,100, 75,214,249,216,234,150,229, 87, 2,
+161,189,189, 93,180, 82, 44, 23, 23, 40, 99, 40,235, 26,133,193,121, 73, 45, 42,202, 90,190,135,194,210,247,158,188,204, 80, 9,
+156, 19,123,157,120,241, 27,178,188,144,131,117, 62,199, 40,197,122,189,190,218,128,178, 76,144, 0, 98, 68,105,217,244,228,159,
+ 8, 40,214,171, 21, 90, 43,234,122,130, 82,106, 20,212, 41,180,181,152, 36,232, 70, 76,145,204,230, 36,165,184, 12, 51, 89,173,
+ 87,148, 89,142,215, 25, 67,239,176, 86, 68,120, 33, 4,214,237, 6, 19,145,106,195, 81,240,165,208,164, 36,133, 44, 89, 46, 28,
+123, 89, 86, 68,239,217,108, 54,100, 89,198,100, 82, 95,121,155,219,182,163,235,186,223, 31,236,234, 82, 65, 28,137, 62, 18, 1,
+157, 20, 81, 11, 71,138, 18,136, 90, 43, 9,120, 49,198, 80, 87, 21, 62,136, 90, 31, 96, 62,159,143, 48,240, 32,220, 94,136,120,
+231,232,219,129,249,214, 76,168,146,174, 19,190,105,211, 9,205,172, 21, 69,158, 99, 76,142, 49, 34, 48,235, 7,201,221, 47,139,
+ 2,146, 36, 24,118,109,135, 15, 3,243,217,124,132,164,185,210, 73, 84,149, 92,250,144,104,187, 22,149,196, 46,163, 53, 88,155,
+139,189,205,218, 17,154,215,108, 54,157,252,188, 46,191,102, 37, 45,120,198, 40,134, 97, 76,192, 83, 10,165, 36,135,223,121,207,
+ 98,185,100,125,177,248,253,103, 77, 36,155, 76,168,178,140,114, 82, 49,173, 39,160,228,231,217,108,214,114, 81,154,145, 95,179,
+150,139,197,130, 34,151,160, 33,173, 69, 45,190, 94,173, 0,152, 77,103,162, 55, 81,154,171,127,146,132, 61,181,193,225,122, 25,
+130,231,211, 41,171,205,134, 20, 18, 74, 39,166,245,148,203,188, 8,239, 61,211,233,148,213,168,205,152,212, 18, 86, 19, 83,132,
+196,213,191, 39,147, 9,164, 72, 68,126, 22,140, 67,250,101, 6, 65,102, 37, 60,135, 17,105, 26, 92,184, 66,127, 66, 28,195, 67,
+218, 30,239,122,114, 29,241, 67, 51,234, 91, 12, 69, 57,161,154, 78, 9, 14,110,223,220,227,241,179,231,220,189,113,157, 39, 47,
+142,216,221,217,226,249,227,151, 20,117,205, 43,119, 95,103,123,183,102,121,122,193,233,233, 57,167,199,135,172,218,150,221,221,
+ 29,166,147, 9,171,118,160,158, 72,115,227,102,189,196, 69, 71,112, 70, 18, 45, 99, 79,179, 22, 45,128, 86,134,178,206,241, 67,
+ 68,155, 52,118, 16,100,236,237,237,161,240, 48,210, 44, 49, 56, 89, 0,124,164,119, 61,222, 37, 50, 35,150, 35,173, 52, 26, 65,
+ 10, 81,150,128,167,239, 34, 74,203,146, 97,172,102, 62,171,152, 78,107, 86,231,167, 24, 45,205,145,182,152, 81,149, 21,145, 68,
+ 82,145,110,104, 89,174, 54, 84,185,132,204,100,198,140, 52,135,135, 97, 32, 21,133, 44, 60, 68,164,195,219, 98, 12,128,184,104,
+148,145,168,107,140,146,161, 54, 66,150, 25, 82, 82,168,145, 50, 81, 81, 9,119, 27, 68, 63,148,229, 66,157,105, 3,205,170,145,
+231, 86, 27,134,161,103, 82,214,156, 52, 25,243,173, 25, 31,253,229, 95,240,248,244, 25,149,178, 92,187,251, 1,106,245, 38,197,
+214, 29, 54,203, 83,194,202,145,205,247,240,110,160, 57,127, 78,114, 45,245,245, 15,121,243, 59, 63,230,205, 55, 19,211, 15, 96,
+189, 11, 3, 16,255,167,196,195, 71, 11, 38,215,183, 49, 73,113,255,243,127,197,249,226, 95,163, 82,224, 45,213,178, 51,173,120,
+229,214,171,108,214, 43,142,159, 63, 99,112, 29,237,106,129,210,142,105, 93,130,178, 60,125,124,204,214,206, 54,186,204,121,251,
+253,143, 56,186, 56, 99,182,181,195,245,189, 3,238,189,251, 54, 69,174,184,184, 56,227,197,147,111,217,157,205,233,155, 13,207,
+238,223,199,173,206, 25, 54, 75, 25,160,242,156,213,234,152, 98, 62, 39,120, 77,194, 16, 85,228,218,141, 61, 50, 85,240,236,240,
+152,114, 58,231,171,175, 30, 9,141,188,232,152,204,183,200,202,140,253,131, 3, 94,191,115,135, 95,127,241, 27,166,251,187,196,
+168,153,239, 78,121,229,224, 0,163, 51, 30,124,241, 53,205,234,130, 79, 62,249, 49,219,243,125, 30,127,251, 72, 34,132,195,134,
+ 87,111,189,194,249,225, 33, 23,203, 51,146, 75, 28, 95,156,179,181,119,147,233,254, 62,206,247,104, 11,125,231,248,252, 55,247,
+185,118,107,206,151,191,253, 18,205,192,141, 27, 7,152,170,224,211,172,158,176,191, 55,101,111, 94, 19, 93,207,193,238, 62,171,
+101,195,163,111, 31,115,255,210,170,166, 44, 55,246,118, 72,222, 51, 96, 72,245, 22,118, 50, 37, 41,133, 34, 97,115,201, 16,159,
+ 78, 37,128, 94,143,169, 99,139,197, 5,155, 77, 67, 54, 78,128, 49,201, 3, 18, 19,163, 32, 74,182,150, 4, 40,147,161,180,248,
+ 55,101, 83, 46,232, 93,143,213, 22,163,180,164,180,105, 17,114,136,213, 69, 54,191,224,157,136,115,188, 23,232, 89, 43, 54, 77,
+ 67, 12,162, 88,212, 86,178,227, 3,137, 52,194, 82, 42, 41,180,146,230,183, 72, 66,165, 36, 91,186,147,124,107,163, 20,155,182,
+145,169, 85, 65,223, 15,164,190,165,218,218, 98,190,181, 69, 61,169,201,173, 92,218, 18, 5, 41, 73, 96,221, 48, 16, 98,194,104,
+139, 86, 70, 98, 89,203, 26, 99, 36, 25, 79, 98, 33, 37,154,179,105, 26, 66,140, 20,101, 41,147,182,243,196, 36, 27,126,166, 69,
+224,102, 50,225,196,172,145, 32, 26,163, 53, 41, 68,188, 15, 16,197, 43,238, 66, 36,179, 2,239,103, 99,186,216,208,139,226, 93,
+ 94, 72, 73,215,147, 44,115, 35, 77, 80, 86, 84,216, 36,133, 54, 82, 21,184,110, 68,200,103,172,161,109,214, 52, 77, 39,241,136,
+101, 54, 94, 96,137, 20,196,190, 18,130, 84,147, 26,173, 80, 74,179, 92, 44,208,200, 69, 21,163,136,213,170,170, 66, 43, 13, 90,
+182, 69,208,164, 36,219,245,224, 61,222,139,200,203, 24, 73,121,147, 65, 68,178,226,203,162,144, 67, 68, 11,215, 56,116, 29,121,
+ 38,195,136,244,127, 75,223,113, 72,137,194, 90,140,177,184,222,143, 67,228, 64, 94,150,196, 24,197,129, 96, 12,151, 73,121,178,
+125,167,113,219,215,228, 89, 78, 85,148,216,108,228, 35,157,168,135,141, 22, 69,190, 92,126, 82, 3,219,117,157,112,213, 74, 6,
+176,201,100, 74,215,183,132, 40,109,110, 41,201,144,153,101, 6, 53,110,109,198, 90,140, 18,254,123, 24, 68,151,145, 23,185,168,
+139, 51, 81,179,202,207, 71,190,255, 75, 39,130,205, 50, 90, 47, 85,171,202,136, 39, 90, 27, 9,176,209,198,160, 34,156,156,157,
+225,157,199, 24, 67, 89, 86, 20,121, 33,200,204,224,168,235,154,182,149,175,173,200,139, 43,100,198,230, 22,107, 50,161, 52,162,
+160, 72, 38,207, 36, 11,191,170,176,121, 46,219,126,223,147,103,242,253,167, 40,194, 60,239, 37, 64,169,174,107, 98,140,227,239,
+145,166,186,110,232,153, 76, 43,242, 66,132,117,117, 85,163,181,102,179,110, 48,198, 92,169,242, 1, 46,131,144, 98, 12,132, 36,
+ 8,133, 15,226,239,183, 54, 67,143, 54, 79,163, 53,218, 26,234,249,140,217,246, 46,245,246, 53, 58, 23, 73,118, 34,126,244, 77,
+ 75, 63, 12,156,157,158,177, 88, 54,156, 45, 55,244,206,209, 12, 13,131,119, 12, 41,210,181, 45,223, 60,250,150,211,179,115, 22,
+171, 5, 46,138, 29,244, 98,189,225,248,228, 2,231, 4,242,119,222, 97,178,130, 60, 23,202, 44, 37, 73, 19,155,205,183,169,235,
+156, 34, 31, 93, 38, 86, 6,188,178,172,200,203,140, 24, 29,203,229,134,136, 22, 84, 46, 36,130, 50, 20,213,140,178,154, 49,221,
+222, 33,159,204,200,235, 9,213,124,139,124, 62, 39, 43,106, 76,145,145,151, 37,117, 93, 81, 79, 43,138, 44,167, 42, 37,198,217,
+ 39,112, 94,232, 41,137, 20,238, 73, 62, 72, 98, 95, 61,165,200, 10,202,162, 34, 38,209,194,104, 43, 26, 27,133, 34,105, 35,161,
+ 68, 41, 16,125, 32,186,129,166,151,224, 28,157, 27, 84, 72, 66, 69,198, 81,104,170,224, 82,247, 35,182,170,203,119, 68, 40, 41,
+ 61, 14,127,106, 68, 26,243,162,192, 40, 37,249,232, 33, 18,130,228,230,171,224, 9, 58,167, 55,129,204,192,143,255,227,191, 68,
+175,223, 65,115, 64, 62,185,133, 26,114,154,147,103,156, 62,255,140,211,231,191,164, 57,253,138,174, 57, 67, 39, 77,138, 21,235,
+245, 62,231,135,112,242,121,226,225,255,249,148, 71, 15,127,202,203, 23,255,128, 15,138,166,219,176, 60,125,200,250,226, 51,186,
+197, 25,117,145,177,103, 61, 62,207,248,230,193, 23,172, 47, 46, 80, 73,232, 98,148, 98,136, 10,111, 50, 38,123, 59, 84,211, 25,
+127,240,221, 15,217,217,170,200,148,231,218, 78,201,209,243,175, 56,252,246, 43, 94,124,251, 45,126,179,161, 74, 25,235,229,146,
+179,229,154,243,229, 9,186,202, 56, 61, 59,167,156, 22,216, 73, 65, 52,134, 27,123,215, 80,202,114,122,124,193,151,143, 14, 57,
+ 93, 12,100,198,242, 31,254,237, 63,160,162, 97,107, 86,241,234,237, 3,222,187,247, 54,111,222,189, 77,235, 59, 94,123,255, 30,
+118, 34, 86,222,144, 6,110, 28,220,166,217, 56,218, 77,195,246,108,194,193,245,235,220,255,234, 27,110,238,110, 51, 52, 75,126,
+249,171,159,243,244,249, 17,191,189,255,128,131,107,215,168, 39,115,190,254,242, 43,202,170,228,222, 91,175,163,115,197,173,155,
+ 7, 76,103,115, 94,127,227, 77, 62,250,222,219,248, 97, 65,215, 52,124,247, 15, 62,228,248, 98,144,187,250,206,237,189,244,206,
+ 91,175, 82,198,134, 95,253,234, 75,200, 75,118,175, 79, 24,156,229,219,199, 71,108,205,182,152,111, 77,201,116,226,124,217, 16,
+170, 57, 93,144, 40,188, 73, 37, 23,120,153,203,161,170, 98,194, 13, 29,203,245,154, 24,146,164, 99, 13, 94, 46, 32, 64, 41,197,
+100, 58,197,251, 32,182,167,178, 96,189, 90,131, 18,213,251,206,238, 30,102,132,122,180,146, 96,142,205,152,166,148,101,185,252,
+154,143,100,101, 70,138,162,238,181,153,101, 60,119, 81, 90, 51,155, 76, 81, 74,177,222,108,228, 0, 45, 75, 41, 68, 8,178,205,
+166, 36,124,104, 24, 47, 79,173, 53,201, 39, 80, 34, 50, 11, 49,113,153, 46,182, 94,175, 9, 33, 82, 79, 74,134,110,160,223,108,
+152,237,238,140,185,232, 3,147, 73,197,224,122, 92,219, 83, 77, 68,241, 77, 2, 23,165,163,189,172, 42,148,210,244,110, 32,248,
+128,243,105,132,204,228,210,107,154, 22,173, 69, 21,222,118, 13,196, 68, 93,215, 2, 95, 42,153,152,147, 15, 18,248,162, 53, 41,
+ 70,218, 70, 2, 56,228, 69, 83,152,204,144, 61,248,193, 76, 0, 0, 32, 0, 73, 68, 65, 84,231, 5,198, 88,217,176,181,108,103,
+145,136,213, 82, 86,162,181, 33, 70,177, 75,196, 40, 47,175, 50,150,105, 93, 99,140, 38,203, 11, 82,136,244, 94,202, 32,172,181,
+172,215, 43,166,211, 41, 93,215, 83, 85, 57,126, 24,136, 42,161,146, 70, 41, 65, 99,140,201,104, 54,155,171,203, 67, 37,105, 13,
+ 3,152,205,183, 40,114, 43, 67,142,143,100,133, 37, 70,208, 90,141,201,118, 74,146,169,148,130, 40,145,161,253,208,145,231, 57,
+202,168,177,231, 89, 19, 71,161, 98, 76,162,224,206,115, 9,184,201,179,140, 77,219,146,136, 24,165, 49,121, 6, 94,236,121,109,
+219,178,181, 37,165, 63,171,213,134, 34,207,105, 91,137, 46,213, 74, 11,149,161, 44,104, 81, 93, 91, 43,186,130,190,111, 89,173,
+ 54,120,239,198, 44,131, 12,146, 38, 70,199, 48, 72, 9, 67, 81,230,180,141, 36,183,109,109,111,163,148,108,185, 23, 23,231, 72,
+196,167, 97,123,123, 7,231, 60,147,105,205,106,211, 80, 87, 21, 41, 74,136,132, 54,150, 20, 34, 32,150, 20, 31, 28,106,164,146,
+ 72,242, 44, 24, 99, 88,174, 86, 44, 47, 46, 8, 33, 48,157,206, 32, 37,108,158,225, 7,249,115, 55, 27,249, 58, 83, 8,108,239,
+238,210, 15, 61,211,122,194,242,236,140,157,235,215, 89,175,215, 35, 61, 98,136, 4, 20, 26,107,172, 8, 52,181, 56, 58,154,182,
+187,106,131, 2, 8, 81,248,239, 20, 37,100,166, 40, 43, 46,197,140, 34, 18, 21,212,228,210, 51,157, 24,181, 28, 93,143,214,137,
+233,108,126, 53, 4,181, 93,131,213,118, 12,202, 72, 40, 35,162, 61,177,164,138, 35, 68, 2,167, 36,142, 56, 43, 75, 84,140, 72,
+ 68,115,207,102, 35,145,151, 66,127,200, 96, 38,138,127, 65, 46, 46, 23,130, 60,191,180,254,136, 54, 67,105, 65,152,172, 53,120,
+ 55,200,150,106, 37,129,209, 88,137, 26, 86, 81, 16, 25,205, 37,170,160, 73,201,143,239, 98, 69,138,130,174,153, 92,210, 33,125,
+146,176, 21,162, 34, 68,137,114, 46,171, 10,107,164,145, 81,242,218, 35,198,100,104, 43, 73,108, 69, 38, 28,103,231, 29, 85, 33,
+136,101,145, 75, 46,120,140, 81, 52, 5, 90,225,163,248,200, 19,137, 16, 28,121,150, 99,162,104,125, 12,112,113,126,129, 82, 9,
+ 99, 21,222, 71,234,124, 66, 61,219, 34, 27, 3,117, 98, 24, 56, 61, 61,199, 26, 72, 62,209, 71, 71, 93, 77, 49, 38, 48,108, 26,
+240,145,141,115, 4,151,196, 18,101, 52,182,204, 73, 81,104,210, 76, 27,148,205,200,114, 43,190,251, 8,200,222, 68,244,142,164,
+ 68, 75, 20, 73, 50,240,107, 77, 89,150, 52,171, 5, 33, 36,225,246,253, 64, 61,219,230, 59,255,205,127,199,234,197, 51,252,242,
+156,107, 31,254, 17, 59,205, 63,103,119,242, 29,134,176, 97,239, 96,198,206, 63,143,116,255,168,248,237, 79,159,113,244,242, 39,
+232,204, 98, 41,241,241, 28,163,114,146, 79,168, 34, 99,113,250, 45,253,250, 5,217,252, 58,219, 55, 63, 32, 44, 23, 92, 28,253,
+156,102,248, 41,217,102,193,171,247,238,240, 74,115,206,171,247,238,241,219,135, 15,104, 23, 43,250,174,101,179,148, 38,182,249,
+100,194, 43,175, 73, 84,237,100, 90,177,187,119, 11,165, 18,199, 39,199, 76,171,146,190,239, 5, 17,206, 75, 76, 8,180,231,231,
+232, 0, 49, 14,220,120,101, 7,157, 89,218,190,103,181, 90,177, 60, 57,101,240,112,124,124, 76,240,137,235, 59, 37,207,207, 58,
+206,163, 66, 37, 79, 8, 25,215,166, 80,217,241,249,247,134,182, 15, 28, 28,236,177,247,218,107,188,243,201, 39,100,181,229,232,
+240,136,235, 55,246, 25,218, 14,213, 39,142,143,206,185,184,184,224,155, 39,223,146, 98,226,248,248,136, 20,224, 7, 63,248, 1,
+186, 40, 41,178,140,235,123,115,126,242,247, 63,227,119,247,239,243,241, 39, 31, 49,223,221,230,218,141, 27,180,189, 35, 43, 43,
+214,171, 37,135,207,158,208,119,129, 31,254,240, 35, 98,130,206,123,204, 31,125,252,206,167,167, 47,159,240,217,231,207, 40,119,
+114, 2,150,175, 31, 47,185,180,170,229,165,197, 71,207,106, 72,184,162, 38,144,176, 73,210,147,242, 66,170, 89,149,146, 52, 43,
+165, 20,203,213,146, 24,226, 21,231, 54,244, 29, 85, 85, 10, 60,104, 44,171,205,134,161,151, 13,164,235, 7,166,117, 77, 85, 77,
+ 40, 43,225,248, 4,194, 94,144,105, 75,215,119,100, 69, 33,219, 97, 38, 61,222,144,232,154, 14,144,248,189,232,228,194,247,206,
+163,181,197,121, 71,239, 28, 42, 41,176, 6, 98, 32, 33, 23, 36,230,114,251, 50, 24, 37,135, 92,138,113,124, 81,149,168, 63,173,
+180, 94,245,189, 67, 91, 5, 42, 17, 35,228, 35, 79,166,148,162,170,171, 81, 80, 39,154,129,162, 42,105,214, 13,206, 7, 76,158,
+ 83,228, 21, 93, 63, 32,109, 59,145,190,243, 88, 43,129, 54, 41,164,171,200,218,178,202, 81,218,140, 16, 41,212,165,132, 60,196,
+ 36,133, 30,209,123,250, 65, 66, 36,218,166,145,131, 52, 74,229,233,165,106, 61, 69, 17, 36,245, 93, 71,179,105,104, 70,120, 84,
+ 4,116, 18, 94, 64, 12,100,121, 78, 81,138, 90, 61,161, 73, 35, 45,146,148,160, 39,155,166, 65,105,131,205, 45,235,213, 18,165,
+ 68,164,146,231,150,190,109,201, 50,217,246, 51, 43,221,226, 70, 75, 22,248,166,105, 48,214,160, 73,100, 38,163,170,164,109, 79,
+105,117,245,153, 54,109, 75,136, 9, 9,125,137,146,209,110, 51,172, 17, 78,158,148, 70,142, 46, 74,226, 91,146, 84,184, 34,207,
+ 25,134, 65,182,127, 47,112,127, 76,178,101,251, 16, 36,142, 55, 47,176,214, 72, 42, 97, 8, 12,163, 23, 61,207,115,113, 91,216,
+ 92,160, 95,173,176, 70,116, 21,130,102, 8, 21,144, 82,162, 27, 6,218,174,161,237, 68,144,119,169,149,168,235, 41,197,101, 66,
+ 97, 38, 53,188,195,224,198,207, 48, 17, 83, 26,253,218, 29, 33,201, 51,234,124, 32, 47,114,124, 20,155, 98,150,101,172, 87, 43,
+ 50, 35,109, 92,222,245, 4,239,209,198,208,118,221, 56,132, 73,186, 98,158, 75, 8, 75, 8,129, 68,164,235,228,226, 44,202,146,
+ 24, 5,237,240, 78,158,137,232, 3,164, 36, 98,171, 92,132, 82,253,224,216,218,221, 38, 38,176,151,226, 55, 35,226, 71,163, 13,
+ 73,201, 80, 21, 82,194,121,217,230,250,190,167, 40, 10,146, 70,180, 38,222, 95,233, 9, 38,117, 77,150,101, 92, 6, 26, 93, 62,
+115, 77,211, 48, 12, 18, 79, 44,246,183, 1,107,115,218,174, 97,189, 90,225,134,129,233,100,138,181,146, 97,158, 21, 5, 6,200,
+114, 9, 47, 1,201,134, 80, 74,126,230,160,198,247, 48,162,180, 80, 23,153,149,194, 24,165,212, 21, 69, 85, 21, 5, 85, 89, 92,
+253,183, 44,147,164, 71,107, 37,175, 32,137, 6, 82, 32,107,147, 93,253, 93, 0,214,142,191,174,228,243,184,180,139,134, 16, 5,
+105, 52, 25, 62, 10, 13,167,116, 38,208,115,140,216, 92,160,119,249,122, 50,234,186, 20,239,120, 20, 47,124, 82,138,186,172, 80,
+ 42, 65, 38, 2,224,148, 34,117, 61, 17, 17,112, 8, 12, 67, 79, 54, 42,147,187,182,197,245,157, 12,137, 49,200,179,160, 13,137,
+ 75, 27, 90,192, 39,133,206,114, 73,131, 51, 22, 18,164,152,200,242, 12, 31, 68,215, 80,228, 66,119,145,148,212,127,170, 68, 63,
+120, 74,107,160,109, 9, 40,202,106, 74,136, 18,245,106,173, 98,232, 29,121,158,227, 91,161,134,180, 50,120, 36,151, 96,232, 59,
+122,231, 81, 36,180,146, 8,236,126,112, 12,125, 47,148,202,184, 72,120, 39, 81,221,121, 38,203,137,205, 12, 97, 24,216,121,235,
+109,102,111,127, 66,104, 91,154,179, 35,178,201,117,118,202,143,168,183,175,209,135, 64,169, 12,127,246, 47, 54,252,151, 31, 20,
+116,255,116, 70,251,237,123,104,155,147, 87,115, 22, 47,239,179,186,120,198,224, 27,218,213, 83,250,230, 20,155, 79,217,191,249,
+ 99,230, 59, 63,166,156,191,139,118, 61,245,205, 30, 53, 44, 56, 58, 95,115,244,248, 9,103,139,134,106,123,143,231,199, 23, 60,
+ 61, 90,208,167, 64, 52,137, 77,239, 41,178,140,227,163, 99,158, 61, 63,226,229,211,231,188, 56, 60,100,177, 88,242,213,227,231,
+188, 60,191, 32, 36,197,108, 62, 97,189, 89,242,245,225, 49,222,194,139,139, 5,203,117,199,163,103,135,244,109,207,225,170, 35,
+ 88, 11, 89, 78, 93,151, 68,215,115,251,218, 54,223,125,231, 54,223,121, 99,159,119, 95,223,231,123,239,222,162,174, 13,153, 81,
+ 84, 89, 2,211, 49, 47, 65, 7,135, 95, 47, 57,125,252,136, 71,191,249, 10,203,132,217,214, 53, 54, 93,199,175,126,245, 27,214,
+ 23, 39,148,181, 12,104, 49, 69,202,249, 12,147, 89,222,126,243, 46, 58, 58,222,126,255, 29,254,254,103, 63,231,155,111,190,164,
+ 9,137, 55,239,221, 99, 0,158, 61,127,204,246,238, 62,175,191,126,151,211,147,115,110,221, 60,224, 59,239,190,139, 86,154,174,
+113,156, 47,214,152,219,219,197,167, 23,253,192,100,119,194,197, 69, 98,103,247, 58,247,238,221, 38,203, 51, 14,174,239, 99,109,
+198,162,131, 84,212,162,218, 85, 34,144,136,222, 17,130, 19,111,106, 85,203, 75, 18,101,107,234,251,158,162, 20,235,134,181,134,
+229,106, 67, 12,194, 65,198, 16,168, 38, 21,185,150, 34,136,193, 57,108,145,143,135,142,102,185, 90, 10,164,236,196,250, 84,228,
+242,240,232,145,151, 42,203, 66,184,225, 32,155,142, 64,218,154,224,221, 85, 94, 53,200,198,131, 54, 36, 37,158, 99,177, 68, 69,
+ 46,211,196, 18, 1, 21,195,168,108,246, 24, 45, 83,175, 81, 90,224,248,241, 48,181, 86,186,191, 3, 98,101,170,167,242,189, 94,
+214,159,166,148, 48, 70,145, 21, 57, 46, 42,156, 31,200, 50, 9, 94, 49,153, 29, 55, 87,233,187,141,209, 19,149, 8,195,172, 21,
+171,203,208,247, 24, 45, 33, 58, 50,245,122,130, 31, 88, 45, 87,180,109, 59, 42,203,133,147,213, 90,170, 73,171,170, 34,203, 51,
+170,178,226,210, 58,214,119,195, 8,213,137,117,176,239,100,171,202, 50, 3, 74,172, 95, 10, 48, 74, 4,128,121,145,145, 0, 63,
+136,248, 44,132, 32, 16, 36,154, 50,151,139, 48, 68,199,101, 53,234, 48, 12, 12,163,202, 61,164, 68,102, 37, 12,198,111, 90,166,
+179, 25,211,217,148,170,174,176,153, 97,179,218,208,119, 29,206,185,209, 99, 45,141, 83, 49,202,255,150, 65, 70, 46,151, 48, 14,
+ 41,121,150, 35,221,223,129,204,100,132, 24, 73, 49,140,207,133,194, 90, 9, 54,241,195, 64,244, 34,190, 83, 90, 56,245,161, 27,
+ 72, 36,234,122,138, 70,154,239,140,145,182,179,162,144,156,237,204, 88, 98, 18,237, 66, 8, 14,239,130,216, 4,187,142,190,149,
+106,198,182,237,200, 50,225,214,147,214, 88, 35,186,131, 75,110, 58, 43,178,171,195, 76, 91, 73, 30,212, 90,203,175, 27, 73, 53,
+212, 90,144,153, 34, 47,100,120,181, 98, 7,234,122,233,124, 79, 41, 49,155,206,132, 82, 24, 6,134,224, 25,250, 1,165,181, 8,
+ 50, 23, 11,250, 94, 40, 39, 61,102,181, 27, 45, 98,205,161,151, 26,204,170, 46, 49,185,101, 62,223, 18, 84,201, 26,108, 38, 53,
+157, 69, 81,210,108, 90, 80,137,118, 28, 30,139, 34,191,130,208,141,181,148, 69, 41, 92,108, 33,136, 87,150,101, 72,244,167,120,
+248,187, 94,120,237,203, 75, 28, 24, 47,192,113,176,138,242, 60, 74,151,180,252,183,162,200, 41,198,237,249,247, 67,144,167,235,
+ 37,103,192,135,192, 48,120,250,126,180, 23, 42,161, 31, 52,138,168,196, 74, 23,188,191, 18, 1,186, 32,239,165, 84, 14,143,121,
+ 17,121, 65, 26, 63,227,124, 20,211, 46,151, 11,124,140, 99,157,173,148, 10, 41, 45,214, 74, 18,144, 34,160, 81, 8, 21, 87,149,
+ 5, 89, 46,250, 26,173,165, 71,225,178, 98,119, 50,153,160,140, 12,179, 69,158, 49, 56,177,139, 86,117,137,181, 6,173, 33,196,
+ 4, 81,114, 47,108,102, 48, 73,130,127,228,179,148, 36,204, 34, 47, 80,136,126,227,210,179,239,131, 56, 86,210,248,236,232,244,
+251,184,105,173, 69,223, 19,137,178, 65, 91,113, 40, 24,107, 9, 24, 34, 10,101,229,207,204,203, 10,155, 89, 94, 28, 30,210, 54,
+ 66, 1,229,214, 80,150, 19,138, 42, 27, 19, 3, 29,165,138,104, 12, 58,151,220, 0,172,184, 50, 20,145,172,200,201, 50,249, 26,
+148, 21, 65, 41,128,209,154,168, 4, 81,245, 33, 74, 66,157, 82, 34,162, 75, 92, 13,234, 74, 25,196,143,111,232,219,158,174, 29,
+168,174, 95,231,181,247, 63,161, 46, 42, 22, 47, 30,115,247,173,247, 89,189,204, 32,214, 12,155, 83, 90,235,152,253,193, 30,247,
+179,196,151,255, 6, 78, 14, 79,184, 56,252, 45,229,244,128,143,255,228,207,184,125,243,143,121,247,123,127, 72,181,253,135, 76,
+167,119,248,254,247,254, 19,222,252,175, 95,227, 47,255,179,158,255,226,207, 13,155,234, 3,170, 87,114,218,179, 47,217,156, 55,
+220,124,229, 38,175, 30, 92,231,214,107,175,240,238, 59, 31,240,221, 15,223,227,240,244,130,168, 11,206, 47, 78,120,250,236, 5,
+ 23,171, 53,202, 20,172, 83,226,218,181,125,162,205,120,245,238,171,132,164,168,167,146,161,254,228,197, 17, 93,132,195,139, 13,
+245,100, 78, 94,101,216, 44,167, 11,137,191,248,139, 63, 37, 69,168, 38, 19,202,106,142,174,119, 24, 84,197,215, 79,142,217,217,
+219,167, 13,150, 24, 12,123,251,215, 56,184,121,139,131, 91,183,185,121,243, 54,215, 15, 14,216,222,222, 98, 50, 47, 8,161,165,
+ 46,193,159, 31,179, 60, 61,161,217,180,236,220,220,103,182,119,141, 69,179,228,248,232, 37,123,219,187,220,123,227, 53,230, 91,
+ 51, 34,158,175,190,122, 68, 74, 3,235,214,241,197,151, 15,120,255,131,119,177,198,112,253,198,117,124,212,120,159,120,254,252,
+ 41,206, 15,184, 94,113,125,111,155,229,226,130,219,119,222,224,238,221, 55, 49, 55, 94,187,254,233,164,218,101,189,144,203,200,
+135,158,174,237,137, 93,207,225,225, 17,203,144, 97,139,138, 48,114,157,110,112,104, 21,152,212, 53,147, 82,242,195,141, 26,225,
+235,222,209,180,107,170,170, 36,198, 68,215,245,108, 26, 81,248,154,220, 18,130,248,107, 1,241,178,230,118, 84,138, 59,148,209,
+232, 20, 33, 69, 73,142, 74,162,136, 55,153,229,178, 65,172, 44, 75, 82,130,186,146,186, 79,149,192, 5,217,236,134,193,203, 36,
+235, 3, 69, 94, 16,224,234, 32, 75, 73,141,191, 79,184,120, 55,136,226, 62, 38,225,164, 99,144,205, 54, 47,114, 66, 20,254, 8,
+ 45, 48,160, 27, 15,102, 20, 4, 47, 9,100,153, 21,129, 72,179,217, 96,198, 23, 93, 27,139,205, 44,125,231, 48, 70, 4,100, 42,
+ 33, 86, 41,109,113, 65, 62,223,152,196, 82,150, 98,164,105,197,246,101, 52, 52,155, 13,151,161, 44,109,219,145,146,192,148, 54,
+147,109,118, 58,157, 51,157, 78,200,115, 73,242, 66,107,114,109,198,182, 54,217, 58, 7, 39, 49,176, 49, 37,225,146,181,161, 27,
+122,138, 60,195, 13,178, 29,228, 69, 78,223,202,244,173,148, 70, 27, 4, 2,205, 51,140, 22, 30, 47, 17, 5,190, 12,129,210,230,
+226,253,181,178, 49, 92, 34, 8,140, 80,188, 75,158,114, 76,152, 51, 70,211,183, 61, 41, 9,116,238, 99, 24,149,246,210,188, 39,
+113,176, 94,188,253, 33,202, 33,145,198, 33, 17, 41, 54, 9, 33, 80,213, 21,144, 4,217, 72, 17,107,101,123, 75, 49,146,149, 37,
+110,252, 30,195,229,229,174, 20,179,249, 28,173, 24,133,111, 66, 99, 40, 45,246,195, 97, 24,104, 70, 47,114,150,203, 48,115,201,
+175, 55, 77, 51,110,104, 82, 16, 35,151, 66, 66,196,128,146, 39,224,253, 88,201,233, 69, 39, 96,172, 8,211,250,174,191, 66, 18,
+108, 38,121,229,218, 88,102, 91,115, 82,138, 20, 69,137, 34,225,134,225,138,135, 46, 11, 81,170,203,193, 25,152, 84, 21,110,112,
+116,141, 36,172,245,157, 12,118, 49, 73,145,203, 37,191,105, 50, 75,234,123, 76,150,137,136, 82,203, 86,104,140,166,235,122,140,
+209, 50, 48, 41,133,178,178, 17, 94,186, 8,186, 70, 98,128,139, 50, 31,245, 0, 45,118, 68, 74,186,110, 84,224,119, 29,198,202,
+229,230, 6,119, 37, 68, 84,106, 20,107, 18, 5, 5,235, 5,201,200,203,130,166, 21,125,193,165, 39, 63,105, 40,243,130,222,121,
+188, 27, 8, 65,116, 11,222,185,241,226,144, 11, 80, 41,209,204,164, 20,241,227,239,201,242, 18, 97,222,100, 41,200,172, 44, 11,
+202,200, 22,175,181, 64,229,155,205,154,222,201,160,105,173, 97,117,177,192, 15, 82, 27,172,180, 68,172, 26, 52, 74, 9, 2,144,
+103,114,193,199, 24,200,115, 75,240,126, 44,198,145,208,166,204, 94,110,243,114, 81,167,152,208, 36,124,132, 73, 45, 90,139,193,
+ 15,116, 99,138,164, 27,122,156, 27, 72, 49,160, 77, 70, 63,116,216, 44,103,189,222,224, 6,129,127,221,232, 54, 40,114,177,155,
+218, 44, 35,183,130,244,148,165, 52, 55,118, 67, 39,231, 83,140,160, 36,195, 65, 22, 14, 63,110,236, 50,196,103, 70,226,112,181,
+181, 4, 20,237,224,197,235, 62, 14, 66,222,247, 44,150, 23,248, 0,211,122, 42,105,107,198,242,226,228,156,160, 3, 85,166,200,
+243,146,162,170,233,154,158,114, 58,193,142,148,197,224, 59, 76, 82,104, 20,164,203,197, 35, 98,243, 2,109,140,160, 64, 54, 71,
+154, 49,133, 34, 53,214, 10,154,213, 7, 66, 76, 52,109, 35,231,205, 48,240,214, 39, 63,198, 29,193,242,236, 17, 7,175,190,206,
+203, 71,103, 52,155, 19,186,254, 57,131,107, 56,253,242, 21, 30,253,123,197,211,251, 95,114,244,252, 11, 66,236,248,224,141, 31,
+242, 71,255, 21,236,127,164,185,254, 35,199,254, 15, 13,219, 92,231,224, 22,124,252,113, 96, 31,131, 82,137,120, 96, 57,254,249,
+107,228,215, 95,112,254,205,151, 20,211,109, 94,221,223,230,198,193, 29,114, 74,166, 91,219,184,182,225,237,187,119, 56,184,125,
+135,191,251,233,103, 36,109,168,115,195, 78, 93,177, 88, 45, 8, 67,195,217,217, 5, 46, 14,180,141,196, 78, 95,172, 59, 12,240,
+230,235,175,240,218,221, 27,120, 52,251, 55, 14, 56,189, 88,209,116, 29,247, 63,251, 21,169, 91,115,118,177,100,162, 28,182,208,
+148,251,123,124,117,180,226,217,105,195,223,253,226, 62, 47,143, 23,156, 95, 52,248,161,195,135, 64, 31, 20, 90,101,228,249,148,
+ 42,155, 9,226,151, 25,166,179, 2, 19, 18, 97,211, 16, 93,228,246,157, 91, 92,123,245, 38,153, 45,249,251,191,249,183, 92,159,
+ 76,241,157,148,255, 44,215, 27,118,246,182,121,121,178,230,141,183, 15,152, 76, 74,214,203,150,186,168,249,246,193, 55, 16,193,
+ 90, 77,116, 45,203,102,195,207,254,225,151, 52,155, 21,247,191,184,143,121,227,246,237, 79, 31, 60,252,154,182,221, 80, 23, 34,
+220,233,150, 75,214,141,163,207,167,148, 19, 41,114, 15,222, 97,141,136,158,230,179, 25,214,202,212,150, 89,177, 55,245, 77,199,
+106,211,224,131, 84,200,117, 93,127,229, 31,159,111,109, 81,149, 18,209, 55, 12,210, 47,219, 15,131,228,120,219,140, 97,132,247,
+154,205,102,220, 12, 19, 85, 81,146, 21, 57, 77,179,161,107, 59,134,190,191,130,217,148, 2,109, 20,171,205, 90,188,176, 65, 4,
+ 55,151,155,155,210,114, 1, 93, 86, 10, 58, 39, 94, 77,231,195,200,167, 9, 55,228,251, 30,109, 45,201, 11,116,105,115, 57,232,
+ 66, 8, 87, 54, 40,109, 45,198,202, 22, 5,178,157, 40,132,207,119,193,211,182, 29,146,135,109,233, 7,137, 25,245,222, 97, 76,
+ 38,131,201,120,129,103,218,208,245, 45,209, 7,217, 54, 99, 28,225, 97, 75,145,231,114,193, 42, 17,154,129,112,204,187,219,187,
+148, 85, 73, 34,145,231,146,145,158,148, 4, 81,136,136,208, 99,172, 97,181, 94,203, 5,222,117,212,117, 37,225, 37, 10,234,186,
+162, 24,225,211, 60, 47,196, 3,221,182,248,224, 70, 65,154, 66,171, 68,223, 13, 72,189,172,192,154,198, 10, 61, 81,215,178, 21,
+244,195, 64,223,183,100, 86,190,134, 97,232,137, 94,236,102, 50, 52, 37,202, 82, 58,209,135,190,163,172,107, 98,138, 68, 31,112,
+193, 9,196,154, 46,171, 58, 45,151,109, 66, 74, 75, 53,174, 81, 26, 99,165, 98, 20,196, 59,223,182,253, 85,106,214, 48, 12,152,
+164, 68, 96,233, 35, 86,233,171,139,193, 88,129, 74,179,204,210, 54,194,195,202, 6,233, 80,200,118,191, 88, 44,144,228, 64,233,
+ 89,111, 54, 13, 74,201, 22,126,217,204, 87, 21, 21, 46, 56,140,214, 76,167, 51,170,170, 28, 81,144, 12, 55,120,108,158,161,212,
+229,246, 47,190,107,101, 12, 49,136,202,187,105, 26, 18,137,249,124, 38,193, 60,121, 78, 8, 18,231, 43, 2,183, 72,215,180,228,
+121,129,214,242,231,116,125, 71, 93,142, 69, 53, 62, 48,157, 77,152, 76,166, 76, 39, 19,170,186,166,200,115,202,178,144,152,214,
+220, 18, 81,100,133,196,243,102,153,192,211,131,151, 75, 0, 45,221, 6, 41, 37, 46,171,130,137,114,161,136, 72,111, 64, 41, 17,
+218,137, 48,117, 20, 3,142,180,130,181, 98,187,235, 90, 41,139,200,139,156,161, 27,104, 91,121, 71,252,224,133,202, 25,109,112,
+ 93, 55,112,105,225, 90, 46, 23,116, 93, 71, 94,228,144, 18, 69,149, 99,141,229, 50, 67,254,114, 64,113,206, 81,213,181,112,219,
+232, 43,244, 35, 51,153,240,223, 70,209,118, 45,137,196,100, 50,149,115,165, 31,132,203, 31,209, 38,161,160, 18, 85, 89,162,148,
+ 18,255,127, 8,100,153, 56, 57,188, 27, 36, 90,120, 92, 16,148,209,104, 37,177,184, 74, 41, 54,237, 6, 72, 99,128,148, 98,211,
+116, 76, 39, 19,178, 60, 19,109,200, 56,224,163, 68, 47, 0, 66, 13,153, 49,166,119,240, 3,179,217,148, 34,207,176, 70,236,136,
+ 69,110,233,250,126,180,229, 33,150, 70, 36,191,193, 57, 39,150,190, 92, 68,192, 32,202,114,133, 44, 3, 74,137,112, 52,211,146,
+ 22,104,180, 65, 43, 75, 66,242,191,149, 82, 24, 43,207, 11, 74,206,173, 24, 32, 42,197,108,190,139,201,114, 18, 10,239,123, 86,
+155, 53, 74,102, 4,174, 95,219,231,240,197, 9,139, 77, 39,142, 6, 19, 73,195, 64, 10, 80,149, 5, 69, 81, 97, 50, 73, 38, 75,
+ 10, 6, 39,168,165, 86,242,220, 40,173,168,138,156, 17,152, 32, 51,242,247,116, 93, 75,211,202,179, 62, 12, 3,146,148,103, 24,
+218,150,131,219,119,168,247, 74,194,102,129, 78,208, 45, 90, 54,221, 6,239,207,241,205, 57,155,147,103,172,206, 31,114,126,241,
+ 21,221,234, 57, 41, 69,178,236,117,178, 88,210,220,135,195,127,167, 89,125,171, 56,125,174,200,106,120,243,221,158, 71,169,224,
+ 56, 45,249,151,121,201, 23,199,138, 23, 15, 58,150,205,231,156,190, 60, 66,119, 3,123,117,205,191,250, 95,254,103,126,242,239,
+254,142,179,139, 37, 63,253,229,103,188, 56, 58,228,253,247,239,241,230,189,215,177, 36,180,142, 76,234, 25,157,139,100,185, 37,
+185, 72, 34,208,110, 54,220,216,153, 75,187,222,166,225,226, 98,133,138, 25, 39,231,167, 12,237,192, 86, 93,243,171,223, 62,192,
+ 13,145, 89,101, 57, 95,174,105, 46,214,104,173,121,245,181, 3,110,222,220,227, 15,190,255, 30,123,123,187,108,223, 56,224,167,
+191,249,156, 85,219,115,180, 88,115,190, 89, 51,221, 18, 90, 4,114, 78, 47, 86, 44,215, 14,141,102,247,250, 46,219,211,130,176,
+216,240,197, 23,223,240, 39,127,246, 31, 97,234,138,255,247,111,254,134,227,103,135, 84,198,160, 2, 24, 60,239,125,240, 46, 47,
+142, 94, 48, 41, 51, 66, 27,208, 88, 62,255,205,125, 94,187,121,128,213,145, 95,253,230,115,158,124,243, 45,119, 94,125,141,229,
+122,195,243, 39, 79, 49,147, 50,251,212,187, 78,210,181,156, 99,211,116,132,124, 74,168,166,194, 59, 90,205,208,110, 48, 70, 83,
+ 22, 21,211,178, 64,105, 88, 45, 86,116,157,240,183, 41,193,186,221,144, 82,100, 54,159, 97,173, 97,112, 30,165,165, 64, 62,207,
+196,195,106,180, 25, 47, 5, 81, 41, 58,231,113,193, 51,155,207,177, 74, 38,178,126,240,227,161,195,213, 97,151,146,240,168,151,
+ 91, 81,145, 23,172,215, 27, 98, 8, 76, 38, 19,201,197, 5,218,126,160, 40,138, 81,184, 34, 73, 91, 49,130,210,194,129,106,173,
+137, 17,146,151, 82, 19,149,210, 21,239,230,131,244,147,103, 89, 38, 91, 92,130,161,239, 37,225, 12, 81,109,103,153,148, 98, 56,
+231,112,110, 64, 43,141, 50,138,190, 19,216,214,218, 49,179, 25, 80, 6,134,118,144,233,221, 57, 36, 23, 10,202, 82, 14, 58,201,
+ 43,239, 41,235, 26,141,244,105,247,125, 47, 27, 93,138,148,101, 77, 61,147,226, 15,101,196,210, 5,138, 97, 12, 67,185,252,179,
+ 66,144,108,239,166,105,174,190,118,239, 29,179,177,225, 39,196,241,144, 34, 94, 69,129, 26,133, 64,153, 49,144,130,136,187, 98,
+144,204,242,178,172, 32, 70,138, 82, 96,216, 24,194,184, 69,140,189,243, 36, 72,138,217,108,122,117, 89, 89, 35, 93,229,214, 26,
+ 65, 77,252,128,244, 64,215, 68,239,229,255, 75, 16,222,167,147, 33, 40,145, 32,138,104,209,104,177,141,133, 81,169, 62, 12,210,
+254, 86, 20, 50,208,204,166, 83,113, 49, 24, 43, 8,129,146,176,142,178,172,176,214, 96, 71, 8, 92, 41, 69, 57,138,177,148,146,
+118,188,229,114,141,247, 14,173,141,232, 2,180,198, 57,225,131, 73,210, 37, 63,116, 66, 45,204,166, 19,138, 82,254,206, 75,174,
+217, 57, 73, 57, 52,151,104,198,248,188,200,229,105,197, 23, 92, 8,188,156,146,244, 95, 39,228, 98,213, 74, 54,233,161,107,209,
+218,176, 94,175,105, 55, 27, 98, 18,183, 69,223,201,102,158, 98, 98, 50,157, 10, 4, 27, 3, 54,151,170, 87, 82,196,245, 3,109,
+215,114,153,181,175,149, 34,164,128,181,226,251,191, 44, 90,185,204,127,207, 70, 8, 92, 33,130,196,224,189,240,196,105, 76, 63,
+ 84, 80,100, 25,109, 35,239,174, 15,129,105, 93,227, 99, 64,178,249, 69, 83, 18,156,151, 20, 65,239,169,202,223, 43,218,139,170,
+ 4, 24, 7, 30, 67, 76,129,182,105,175, 6, 84,109,164,131,254,114, 72,108,154, 6,173, 45, 68, 65,158,138, 44, 19,145,154, 81,
+ 4,239,232,187, 1, 63,186, 14,180, 17,255, 58, 41, 49,190, 46, 12,125,143, 82,138,193,139,203, 68,208,186,132, 31, 6, 80,226,
+165, 46,139, 74,126,182,198,140,212, 23,104, 37, 3,190,119,254,106, 3,110,187, 22, 21,133,131,222,172,215,116, 93,135, 50,154,
+162, 16,189,142,181,150,102,172,214, 21,237,143,196, 66,183,173, 68, 62,163,204,136, 66, 6,105, 22,180,226,140,145, 6, 45,197,
+102,211, 16, 99, 26,159, 47, 79, 81,228,216,204,140, 29, 9,107,154,213, 70,158, 29,210, 88,216, 36, 20,159,116, 95,120,202,162,
+132,241,172, 35,137, 67, 70, 41,129,230,149, 86,100, 99, 68,111, 2,234,178,196, 5, 89,134,202,122,138,115,194,255,123, 18,109,
+223, 18,156,163,170, 50, 25, 22,116, 98,112,129,100, 51,186,182, 17,251, 97,244,100, 54,103, 50,153,146,101,134,170,158, 82,100,
+151,141,140,242,185,183,205,134,245,106,141,235, 27, 17,174,170, 40, 93, 0, 69, 77, 94, 26,136,242, 14, 12,110,192, 42,112,171,
+ 53,183,118, 94,101,229, 90,250,163, 11,108, 85,211,247, 61, 90, 89,188, 91,208,172, 79, 88, 47, 15,233, 22,207,104,215, 79,216,
+172, 94,114,118,250,144, 71, 95,159,112,212,205, 56,124,121,193,225,131,111, 56, 63,123,198,186,221,197,185,138, 95,254,109,226,
+217,255, 83,243,104, 13, 79,207, 21, 79, 30,126, 75, 27, 30,178,120,246, 88,206,214,197, 41, 15,190,126, 64,138,142,157,107,215,
+165,118,245,181, 87,217,157, 77,105, 47, 46, 56, 59,190,160,117,134,253,173,109, 81,180,215, 53, 31,255,232, 15,201, 38, 19, 78,
+ 23, 45,139,245,154,139,197, 9, 95, 62,122, 74,183, 58,230,244,228,132,237, 74,243,205,211, 67,206, 47,206,216,154,239,112,239,
+205, 55, 89,118, 3, 77,144, 2,166,211,214,113,190,114, 52, 27,199, 87, 95, 63,231,228,232,156,112,113, 78,150, 28, 59,243, 93,
+ 94,121,245, 46,123,251,215, 40,102,215,248,221,131, 71,100,153,231,198,254,174,164,243,101,150, 69,235, 89,119, 17, 83,214, 76,
+203,130,179,151,199,236,236,236,240, 87,255,233, 95,241, 63,254,175,255, 7,135,207,143,216,170, 51,126,247,219,111, 96,179,193,
+120,207,234,116,201,239, 30, 62,102, 43,215, 92,159,207,217,175, 75,113, 4, 77, 38, 28, 47,123,190,255,209,247,136, 67,164,115,
+ 61,198,170,240,105, 89, 86, 56,151,232,163, 38,205,118, 80,121, 73, 26,225,173, 20, 69, 56, 99,179, 28,107, 20,101, 85,178, 94,
+173, 9, 81,194, 13,188,243,252,231,223,223,231,231, 79,150, 76,167, 83, 82,146,182, 53, 80, 76,103, 51,121,201, 99, 64,105, 17,
+198, 40,173, 41,170,138,178, 44, 69,236,164, 68,229,238,147, 4, 35,136,119,220,176,181,181, 37, 47,133,201, 36, 16, 68, 43,156,
+247,227,116,158, 51,184,129,178,168,240, 65,250,204,255,226,141,146, 63,190, 59,229, 55,199,158,182,105, 80,198, 80,100, 37,131,
+ 27,248,238,117,203,141,218,240,114,229,209, 70, 60,216, 36, 17, 91,201, 54, 45,254,117,225,137,199,204,243,174,151,131,119, 16,
+174, 58,211,210, 83, 94, 20, 5, 93, 63,224,157, 67,107,197,122,181,193,123,225,203, 50, 43, 54,177,162, 40,228,238, 75,233, 10,
+118,213, 90, 33, 45,106, 3,160,198,173,188,191,186,232, 0, 38,179, 25,193,139,218,123, 54, 19, 21,255,101,160, 71,138,191,183,
+ 85, 9, 28, 41,155, 78, 24,197,106,114,208,138,170,123,112,130, 4,244,131,192,236,205, 40,178, 11, 65,172,111, 90,107,208, 50,
+245,247,195, 32, 54, 21, 99, 48,122,228,132,187, 94,124,169,113,172,247,244,158, 44,207, 71, 72, 85,210,209,148,177,132,193, 97,
+172,108,242, 33, 4,146, 10, 87,195, 79,150,143, 27, 96, 46,141,105,130,168,136,234,183,174,100, 59,117,131, 84,204, 10,228, 45,
+ 23,187,209, 98, 43,148,132, 47,209, 93, 24, 45,212, 6, 73,224,107,109,164,193,239, 18, 26, 7,105,198,210,154,241, 80,245, 44,
+ 46,206, 71,231,132,168,149,235,122, 66,240,158,170, 42, 80, 90,148,209, 49,197,209, 70,101,113,109,139, 25,249,228,162, 40, 25,
+156, 67, 43,133, 50,178, 1,183,109, 79, 59, 66,248, 77,211,141,223, 91, 70, 82,130, 6, 93,217, 51,141, 65,197, 68,219,108,228,
+235,115, 66, 79, 64,148,159,183, 21,120,222, 7, 73,168,179,185,197,216, 66,210,248, 12, 34,116, 28, 28,193, 15,116,221, 64,211,
+173, 9, 94,212,232,130, 30,216,171,237, 42,145,196, 30, 55, 94,178, 33, 72,248,136, 54, 2,147, 74, 36,175, 88, 20, 51, 35,205,
+139, 67, 47, 3,245,165, 42,124, 90, 75,199,119,215, 54, 24,101, 41, 10, 65,206, 38, 85,133,228,124, 71, 98,144, 27, 54, 43,228,
+103,218,181, 61,109,215,144, 84, 66, 41, 17,118, 58, 39, 29, 1,222, 57,218,182,231, 50,159,190,170,132,114, 41,171,146,164, 20,
+221, 32, 3,148,235,189,136, 7,179,140,224, 60,206,251,241,253, 16,154,197,123, 41,239,145,207, 87, 46,234,188,144, 8, 97, 65,
+ 88,122,250,161,199,123, 39,139, 0,162, 33,232, 58,105,174,114,110, 16,136,221, 90,202,170,196,106, 9,186,209, 6, 98, 12, 12,
+131, 8,237,242, 76,196,137,155,102,131,115, 14,101,140,208, 91, 41, 81,148,114,254, 40,160,109, 27,148, 26, 93, 0, 67, 75,215,
+ 54,168, 17,113, 89,175,215, 20, 85, 77,140,162, 95,144,118,193, 75,167, 9,104, 13, 42, 41,218,205, 90, 40,173, 82,184,125, 17,
+117, 90, 20, 80, 21,162, 23,136, 49, 1,226, 32,208, 90, 3, 92,157, 37, 62, 69,217,154,199, 33, 32, 2, 49, 70,208,130, 66, 22,
+165, 20,227,128,133, 76, 74,162,130, 2,146, 80,149,229,164, 64,107,233,115,136,120,156,219,224, 6,199,102,181,193,140,103, 87,
+ 85, 85,212,211, 41, 89, 46, 67,100, 61,155,202, 55, 16,229,239, 19, 59,173,199,181, 34,118,118,110,160,237,156,100, 51, 52, 43,
+ 22,103, 47, 25,178,156, 87, 63,254, 14,214,215,184, 33,151,225,109, 88,210,175,142,240,253, 2,215,158,227,251, 83,146,235, 24,
+124,131,107, 79, 88,191,252,156,229,197, 3,150,203,111, 88,156,127,197,226,232, 62, 15,126,254, 25, 71,247,127,202,225,241, 3,
+142,142, 29,103,207, 79, 56, 57,124,192,106,243, 5,171,167, 95,209, 13,158,229,233, 49,214, 90,114,221,179, 59, 77, 76,102,150,
+127,252,233, 79,248,187,127,252,130,118,253,140, 44, 11, 20, 5,156,173,207, 73, 41,177,108, 29, 67,215,240,254,187,239,242,227,
+ 79,190,203,187,223,121,143,106, 94,243,218,107,175,115,238, 20,201, 64, 8,142,105,157, 51, 52, 27,142, 78, 47, 88, 13,142,175,
+158,188,164, 42, 75, 46,214, 23,124,253,248,148,243,166,147,178,166,190,229,124,181, 96,208,134,182,107,209, 58,178,220, 56,190,
+124,244, 45, 55,111, 94,227,245,123,247,248,201,103, 95,210,180,107,114,165, 36,225, 79,195,100, 20,152,230, 85,205,166,151,110,
+ 10, 23, 52, 63,254,209,247,184,125,123,143,124, 59, 35,155,150, 40,229,241,125,160,200, 75, 62,252,240, 67,102, 55,238, 16,140,
+225,225,195, 47, 57,126,242,148, 45, 91,242,198,193, 1, 55,119,118,184,243,218, 29, 66, 12,152,237,186,252,116, 72,138, 70,231,
+228,243,237,241,161,146, 9,204, 13, 61, 26,225,185, 38,101,197,116, 54,189,186,236, 51, 43,222, 88,128, 55,118,115,246,166, 37,
+223,156,117,120,239,201,108,134, 25,197, 34,235,102,131, 27,188,240,143,110,192,249, 56,114,215, 18,149, 90, 86, 37,121, 89, 81,
+148, 21, 85, 85,142,117,172,163, 98,214,136, 32, 35,203, 11,218,182, 69,105,197,116, 62, 39, 33,147,164,205, 45,202, 24,140,214,
+220,221,214, 60,190,232,217,171, 44, 47,151,142, 44, 23,111,187,119, 3, 55,103, 57, 7, 83,195, 44,215, 28,174, 3, 41,129, 74,
+ 81, 56,180, 20, 69,100, 52, 66,144,214, 10,140,135, 86, 76, 39, 83, 57, 44,189, 40, 62,141, 82,228, 54, 71,107,177, 74,109, 54,
+ 98,183, 83, 74,145,198,131, 66,193,213,159, 83,150,178,213, 8,247, 53,218,208,162,194, 69,143, 27, 91,193,172, 21, 11, 88,150,
+ 73, 41, 66, 61,169, 80, 72, 87,183,181, 86,196, 69, 93,199,186,217,208,117,189, 88,119, 82, 18, 63,113,219,142,176, 47,104, 99,
+199,207, 88,138,101, 68, 52, 40,151,176, 86, 8,140,167,197,238,227,156,132,140,244, 93, 7, 74,141,150, 52, 69,215,180,116,189,
+112,240, 9, 25, 6,242, 66,210,184,186,182,197, 71,129,209, 67, 8,114, 48, 7,143, 11,151,169,120, 99,142,188, 23,113,148, 12,
+ 50, 98, 33,234,189, 92,144,198,138,239, 57,203, 50,162,151, 45, 83,107,233, 33,183,214,160,188,156,128,110, 60,216,251,190,103,
+ 62,159, 11,151, 59,136,136,145, 56,122,204,211, 8, 93,134, 40,135, 94, 16,197,250,249,249, 57, 77,215,140,188,116,162,174, 74,
+ 38,147, 41,193, 59,234,233, 4,165,197,245,224,198,207, 73,134, 25, 35,130,174, 74,160, 92,197,200,103,142, 63,251, 77, 35,142,
+141,204,102,244,163,216,237, 82,216, 85, 85,149, 8,245,162,216,156, 36,235, 94,218,214, 46,121,253,211,147, 19,234,201,132,186,
+158,144,153,140,122, 50,197, 26, 81,202,163,100,200,236, 7,225,248,220, 32,195,226,246,246, 14, 2,217,119,104, 3,206,123, 66,
+144,109,238,114, 88,184,220, 44,253, 88,215,139,146,159, 77, 63,170,248,203,170,194,245,142,178, 44, 68,151, 98, 68, 39, 97,148,
+ 18,206,186, 44, 89,175, 86,196,148, 40,108, 38,124,176, 19,221, 64,219,182,227,123, 40, 86, 82, 99, 47,155, 12, 37, 48, 39, 9,
+ 4, 70, 28,228,115, 28,186,238, 10, 46, 7, 69, 85, 85,244,189, 32, 54, 33,120, 36,174,183,160, 40,114,114,155,131, 6, 31, 61,
+ 34, 26, 23,154,163, 24,173,170, 32,234,241,245,122, 3, 73, 93,137, 53,157, 11, 72,216,147, 29,105, 42,205,116, 50,165,115, 18,
+ 50,149, 82,186, 18,144, 38, 4, 62,175,234, 74,168, 5,107,175, 6,218,245,122,131,181,150,201,100, 66,210,224,125, 32, 18, 5,
+ 61, 24,164,219,160,200,165,104,102,185, 92,208, 15,221,213,115,223,117,173, 32, 0, 94,222,129,174,151,129,188,200, 11,170,162,
+ 66, 42,125, 97, 50,157, 18,122, 17, 19,183,109,135, 31,251, 47,148, 82, 99,178,166, 22,100, 38, 1,200,242,112, 25, 8, 36,122,
+ 3, 5, 73,134, 38,173, 68,119,226,157, 12,230,222,137,138,221,141,200, 74,223, 13,212,147,114, 68,222, 34, 89, 46,194,224,132,
+162, 40, 75,202,233,156,188,154, 48, 56,169,238,156, 76,107,194,144,104, 90, 71, 59, 56,178,220,144,229,134,227,211, 35,150, 23,
+ 11,250,166, 33, 6, 79, 34, 18, 83,162,107, 27,138,170,162,168,106,202,170,134, 20,228,204, 24, 6,202,178, 34, 5, 73, 48,204,
+171,154, 20,122,124, 57,225,245, 79,254, 9,167, 47,133,158, 67, 25, 84, 44,209,182, 66,233, 9, 74, 89,108, 62, 71,155,154,232,
+ 26, 98,127, 74, 24, 78,105, 23, 47,104, 86, 79,233, 87,143, 89,159,127, 77,191,121, 78, 63,156,226,134, 51, 46, 78, 30,115,126,
+252,128,110,253, 53,205,243,111,104, 86, 47,152,221,124,133,183,223,184,203,235,175,188,206, 55, 79, 30,145,134,129, 44,182,124,
+243,248, 2,149, 20,165, 6,133,104,124, 46,150, 27,126,244,227, 15,120,235,141, 59,252,240,135, 31, 17,124,199, 55, 95,127,205,
+166, 93,177,190, 88, 51,184,142, 15,223,123, 19,232,168,115,139, 49, 3,131,111, 24, 66,226, 95,254,213, 63,229,199, 63,248, 46,
+206,123,142,206, 78,169,202, 1,149, 2,147, 89,198,201,249, 5,154,128, 15, 61,231,103, 13,250, 15, 97,249, 0, 0, 32, 0, 73,
+ 68, 65, 84, 47,207,215,188, 60, 89,179,127,109,151,135,143,158,243,236,217, 17,239,189,243, 22, 77,219,243,205,225, 25, 88, 88,
+ 54,107,130, 78,216,124, 74, 86,149, 88,147,179,110, 68,103,180,217,120,118,111,221,166,206,119,248,240,189, 15,216,217,223,227,
+147, 31,126,204,179,163, 23,228,117, 65, 49,153,242,198, 91,247,120,253,131,119,104, 76,201,195,167, 47, 56, 94, 92,240,203,127,
+252, 57,143,159, 30,210, 15,107, 76,190,189,243,105,175, 44,245, 84, 46,203,228, 37,204,226,114,155,213, 74,201,100, 49,173,201,
+108,142, 81,146,106,214, 53,173,216, 72,146,120,244, 94,217,202,249,226, 68, 30,182,182,235, 25,134,158,161, 27,164, 96, 37, 38,
+ 62,190, 51,227,187, 7, 37, 15,207,199,188,239, 32, 66,184, 97, 16,161, 91,158,139,122, 84, 82,218, 2, 54,203, 88,175,214, 24,
+ 35, 30,202, 75,207,106, 89, 20,226, 13, 29,183, 88,165, 52,235,245,154,119,111, 84, 60, 58,115,220,219,207,121,218,104,180,178,
+ 35, 68,174, 56,152, 89, 66, 74, 28,204, 44, 15, 79,122, 98, 10,151,232,158, 64,147, 70, 9,111,154,229, 84, 69,197, 48, 10,162,
+ 82, 16,145, 86,158,101, 36, 47,219,182,181,162,162,191, 12,112, 9, 41,146,103, 5, 69, 89,225, 6,129,117,251, 65, 20,191, 33,
+ 74,177,201,149,199, 86, 41, 80,137,161,151, 80, 21,171, 37,197,233,242, 98, 17,244,161, 32,141,137,119,206,245,244,189, 4,129,
+144, 18,198,104,138,162, 28,127, 62, 70, 44, 95, 65,210,172, 98, 8, 76,103,179, 81,148,150,174, 46, 85,107, 44,117, 93, 50,157,
+206,200,172,101, 54,159, 81, 22,165, 92,188,200,102,123, 57,148,160, 69, 39, 17,162,240,253,193, 75, 39,183,181, 57, 26, 37,212,
+ 65,150,139, 29, 45,151, 18,148,232,228,114, 54,214,162,116, 68,172, 84, 25, 62, 38,121,177,234,138,170, 44,201,243, 82,134,138,
+ 40, 25,236,221,120,249,217,113,243,204,108,198,102, 20, 94,213, 85, 41, 94,117, 31, 40,138, 12,141,192,237, 90, 11,239,152,146,
+ 8, 19, 67,240,144,210,232,129,143, 44, 22, 11, 46,109,126,101, 85, 9,212, 92,148, 12,126,192, 90,121,126, 4, 14,214, 76,166,
+ 83,170,170,162,105, 91,250,190, 99, 54,159,209,180, 45,243, 75,116, 41, 4, 66,252,255,153,122,147, 47,203,211, 51,191,235,243,
+ 78,191,233, 14, 17,145,115, 86,102, 85, 86,214, 32,169, 84, 85,146, 90,234,150,186,101, 9, 75,234,182,218,134, 67, 27, 48,108,
+ 76,115, 0,195, 18,150, 44,216,233, 15, 96, 3,102, 9,135,195, 57,172,188,198,112,236,182,161, 77,183,187,229,110, 13,141,164,
+ 82,205, 83,206, 25,115,220,225, 55,189, 19,139,231,119, 67,228,162, 42,171,114,136, 27,119,120,223,231,249,142, 66, 89, 88,251,
+155,120, 94, 99,140,212,211, 22,142,232, 69,220,231,163,188,239,199, 52,146, 67, 18,177, 88,223, 75,125,100, 85,211, 15, 3,214,
+104,138,186,196, 88, 39, 98,205,224,167,146, 22, 71,240,145,170,169,105, 55, 27, 82, 78, 92,187,126, 29,163, 53,199,199,199, 24,
+167, 56,216, 59,160,174, 11,209,163,228,137,255, 15, 82,209, 89, 56, 81, 60, 27, 35, 65, 58,187,203, 94, 91, 35,138,255, 9,177,
+ 49, 90,220, 15, 67,223,147,114,166,174, 43,129,248,145, 1,217, 21, 22,239, 5, 9, 89,111, 54,148,117,197, 24, 3, 70,107, 86,
+155, 13,151,229, 45,133,168,246, 69, 73,157,241,253,120,105,113, 26,187, 22, 59,189, 78,198, 24,241,192,183, 45,166, 42,104, 42,
+121,204,130,114,140, 52,181,216,229,114,206,248,224, 81, 90, 84,231, 93, 39,186,131, 93,134, 4, 64,206,138,217,108, 62, 13, 39,
+134,237,182, 99,177,152, 81,150,165,160, 10, 77, 51,241,247, 21, 41, 38,138,157,184,203,137, 72,112, 12, 35,214, 56,252, 56,200,
+115, 48,209, 59,214, 57,156,117,147,213,174, 96,232, 59,180, 49, 68, 47,139,199,142, 86, 32,103,150,203, 57, 85, 89,162,140, 38,
+250,223, 56, 2, 64, 1,210, 5,127,113,126, 78, 76,153,210, 22,211,112, 33,150,187, 97, 24, 24, 7, 79,202,145,249,108,142,177,
+134, 97,144, 75, 92, 41,225,215,181,209,228, 44,255, 13,210,139, 17,147,184,126,148,145,231, 65, 32,125,233, 4, 87,104, 66, 24,
+ 40, 75,209, 93,140,163,167, 46, 36, 20, 74, 27,195,249,249, 25,237,102,203,234, 98, 69,225,236,165,189,206, 22, 82, 89,237,170,
+ 6, 87,213,100, 52,109, 43, 5, 78,203,189, 37,139,229,146,162,174,200, 19, 98, 55,244, 29,153, 64,142,129, 24, 6,198,126, 64,
+ 25, 69,221,204,177,165,156, 91, 85, 81, 11, 98, 18, 35,179,249,146,230,202, 77,238,188,241, 21, 46,158, 72, 80, 86,138,153,170,
+185, 65,181,124,145,122,113,139,170,190,138, 45,231, 24, 91, 18,195, 5,219,195, 95,146,218,199,228, 52,160,140, 67,153, 5,205,
+222,109, 80, 21, 67,247,156,216,157, 49,116,207, 25,183, 79,232,207, 63,103,230, 6, 54,221, 22,101, 28,143, 63,249,144,119,127,
+241, 99,142,143,123,134,216,113,124,177, 5, 35,108,207, 38, 40,182,190,164, 50,150, 20, 71,158, 63,124,194,231, 15, 30,240,240,
+253, 95,242,211,159,252, 53, 15, 30, 63,230,221, 95,255,138,118,123,198,222,158,102,244, 91, 54,235, 22, 83, 70,234,166,225,245,
+ 47,188,130,182,142,177,111,249,197, 47,222,225,209,103,143,168, 10,203,172,170, 89,204, 75, 74,101, 24,186,145, 89, 83,225,131,
+ 33, 89, 75, 23, 34, 62, 68,158, 60, 59,103,181,238,120,126,116,198,195,199, 79,217, 14,158,213,197, 72, 85, 55,156, 94,116,156,
+174,214, 28,159,173,121,240,248, 17,206, 64, 72,153,235,183,175,147,147,167,182, 21,245,188, 70,149, 53,232,134, 43,183,239,240,
+226,189, 87,120,253,139,175,177,191,156,241,249,251, 31,176, 93,121,190,253,237,239,242,119,254,238, 15,185,113,251, 6,255,251,
+159,252, 9,223,253,230, 91,220,126,225, 69, 76,115,229,234,143,114, 18,101,108,219,118, 19,103, 56,229,250, 42,129,198,227,196,
+237,236, 84,214,187,122,206,237,102, 75, 89,149, 92,157, 57,246, 43,205, 69,180,156,111, 37,102,178,168,138, 75, 81, 80,217, 52,
+ 92,173, 50,179, 66,243,229,235, 5,159, 95, 0, 89,147,141, 2,196,106,178,109,123, 82,218,121, 54,101, 51, 49, 70, 18,219,138,
+162,160, 27, 58,170,170, 98, 24,123,129,225, 10, 57,176, 66, 16, 1,212,239,220,157,241,231, 15, 91, 94,191,226, 56, 92,143,108,
+ 70, 79, 24,197,214,245,245, 23, 42,254,230, 73,199,139,251, 5, 39,219, 64,151, 20, 36, 41,165,103,130,178,131, 23, 88,204,236,
+132, 89,218, 48,244, 82, 93,233,156,155,196, 99,194,153, 95,172, 87,128, 64, 95,214,152, 73, 71, 32,200,198,206, 71,237, 7,201,
+ 28, 87, 90,242,204,189,247,212,213,196, 11, 35, 23, 37,198, 16,115,152,182,127, 51, 77,254, 35, 69, 89, 96,148, 52,194,105, 35,
+116,134,202,146,112,229, 10, 43, 16,115,240,212, 85, 35,201, 86,133,120,146,187, 78,158, 35,107, 12,179,249,156, 89,211,136,232,
+170,174, 25,199,145,102, 54, 19,184, 79,239,188,218, 5, 85, 41, 9, 97,245,164, 96,175,170,138,170,148,173,187,106, 26, 42, 87,
+210, 79,219,233, 56,117,210, 91, 43,240, 55,106, 87, 53, 11, 99,144,246,175,174, 27, 32, 79,220,103, 18, 15,120, 89, 78,106,239,
+ 32,232, 72, 63, 12,194,117, 26,205, 46,222,117,167, 57,216,109,117, 42,107, 22,139, 25,125, 63, 18,189,167,237,122,217, 14,124,
+ 64,130,116,162,108, 7, 69, 33, 42,246,174, 99, 24, 7,102, 77, 77, 51, 5,170,104,165, 47, 57,246,157,104,201, 90,249,158,141,
+145, 3,180,112,238,146, 91, 94, 46,151,116, 93,135, 31,197,241, 48, 14, 3,214, 20, 66,231,100,197,124, 62,199,149, 82,104, 49,
+180, 29, 69, 93, 92, 34, 45, 41, 41,198,126, 82,149,107,141,239,123,202,178,100,181,186,144,173, 54, 11, 45,208,247, 3, 17,113,
+ 28, 8,156, 26, 65,139,189, 74, 59,195,208, 15,108,183, 91,214,171, 11,250, 97,100,209, 52,104, 35,225, 36, 77, 85, 79,149,181,
+162, 98,239, 71,249, 26,128,112,219,157,104, 50,196,250, 39,126,246,186,174, 47,109,161, 18,224,227,113, 86, 90,228, 70,239,113,
+ 70,180, 44,198, 90,176, 82, 80,130, 2,165, 96, 28, 70, 82,140,236,236,144,214, 73,117,110, 12,129,161,147,193, 61,101,177,175,
+ 53, 77, 69,202,106,178, 54, 74,178, 97,223,203, 5, 93,186,130, 24, 51,227, 56, 80, 58,121,175,182,219, 45,195, 40,129, 47,187,
+ 72, 98,107,228,178,115, 78,130,159,234, 90,162,160,209,147, 70, 65,107,134, 97,188, 20,220,118,125,143,181, 34, 16, 21,203,157,
+208, 17,227,232,233,187, 78,168,190,233,179,212,141, 3,227, 32,138,252,170, 18,202,165, 40, 74,186,201, 51,174,148,193,149,210,
+222,104,157,136, 41,157,115,184, 66,232,129,157,115,165,172,106,170,178,164, 40,172,112,249,133,155,180, 45,146, 43,224,123, 17,
+245,206,102, 51,134,126, 96,177, 88,194, 52,228, 72, 63,193,120,169, 25,137, 49,226,156,168,225, 99,146, 97, 52,199, 73, 67,148,
+ 68, 7,164,146,104, 17,124,136,204,102, 13, 10,177, 55,218, 73,166,224,189, 8,133,197,134, 87, 78,200,129,100, 97,140,126, 36,
+199,132, 15, 65,202, 97, 6,201,237,239,251,145,110, 28,197,153,227, 44,205,254, 18,237,170,203,207, 37, 81,206,247,178,170,192,
+104, 10, 55,147, 90,223,126,152, 28, 31, 45,125,187,189,116,102,164, 36,195, 74,123,177,102,240, 35,111,127,249, 27, 84, 87,246,
+ 57,121,184, 38,196,136, 85, 73, 94,199,228, 32, 5,198,216, 17,134, 53, 67,119, 74, 12, 27, 72, 26,138, 5,245,254,171, 92,189,
+243, 29, 94,122,229,239,241,202,151,255, 1,117,115,147,144,161,219, 60,195,164, 11,218,139,167,108, 79, 62, 99, 28, 70,110,124,
+237,235,228,113,205,102,181,165, 93,173,121,249,245, 43, 92,172, 70, 78, 87,153, 46, 42,124,208, 36, 13, 33, 71,214,109,226,162,
+207,156,117,176,245,240,224,120,228,116,171,216,250, 68, 59, 42, 58,159,121,252,228,132,143, 62,122, 68, 83, 55,188,255,254,115,
+ 2, 22,180,230, 75, 95,249, 50,127,250,167, 63,103,190, 92,224,170,125,238,220,189,197,124,111,206,242,234, 77,138,170,226,238,
+203,247, 88,117,145,251,175,188,204,205, 91,119, 25,199,129, 87,239,223,101,189,217,146, 82, 96, 54,155, 17, 99, 98,185, 60, 96,
+140,129,231,103, 27,110,220,184,193,241,201,154,151,238,223,231,183,191,246, 13,206, 47,206,248, 95,255,201, 63,229,201,251,239,
+ 51,142, 3,215,246,231, 28, 63,249,156,207,127,249, 14,207, 62,251,132, 7,159, 61,226,222,107, 95,228,244, 98,195,155,111,189,
+193,227, 39, 15, 72,221,134,127,252,223,253,143,124,252,225, 51,254,254,223,255, 35,138,162,224,179,135,159, 50, 47, 13,234,250,
+ 75,247,178, 34, 83, 86,213, 37, 44,165,148,216,109, 84, 76,232, 66,161, 18, 20,187, 45,175,174, 9,126, 36,103,197,102,179, 34,
+ 38,120,235, 70,193,141, 69,193, 81,155,248,203, 79,206,168,103, 53,219,141,132,210, 44,151,123,146,242, 99, 51,223,186,227,120,
+231,249,200, 91, 55, 75,254,207,143, 59,140, 21,238, 58,229,192,183, 94, 90,242,171,195, 72,187,105,169,103, 53,171,213, 10,241,
+134, 10, 12,106,157,197, 15, 35,237,208, 81, 87,229, 37,180, 61,246, 61,111,220,154, 1,240,241,105,228,213,101, 32,167,204,223,
+ 60,235, 41,141, 84, 8,138, 5, 75,243,149, 91, 37, 40,197, 47,159, 11, 58,208,249, 1,171, 13, 49,201,101,178,183, 92,226,156,
+180, 80,117,253, 64, 78,129,197,108, 78,142,137,243,139,115, 82, 18,184,180,105, 36,225, 12, 32, 43, 81,197,174,214, 91, 10, 43,
+150,185,161, 31,176, 86, 83,213, 51,174, 28,236,163,148,226, 98,181,154,182, 77,177,221,244,131,240,166,198,149, 40, 96, 28, 35,
+ 33, 73,247,111, 89,150,204, 38,117,110,206,144,153,196, 51,211,143,221,229, 57,159, 55, 19, 82,177,198, 56,199,102,181,161,105,
+ 26,250,190, 99, 54,155, 49,250,113,242,176, 86, 8, 47,216,209,212, 13,253,216, 17,130,208, 44, 9, 41, 91,137, 41,226, 72,114,
+225,100, 13, 58, 19,163, 88, 1, 67, 16, 36, 69, 41,195,122,179,130,233,177, 40,165,152,207, 23, 24, 45,145,186, 6, 5, 70, 46,
+ 0, 16, 30, 59,107, 48, 88,129,250, 13,164,144, 39,216, 95, 68,140, 49, 10,183,105, 11, 71,233,164,171,217, 40, 67, 66, 82,195,
+130,151,109,209,143, 82,193,169,149,216,127,132,167,150,193, 42,120,207,249,197, 5, 89,193,222,222, 2, 87,200, 65,185,221,180,
+236,237, 45, 80, 74, 98, 93,199,113, 68,116, 8,242,248,139,233,178,219,229,185,111, 59, 25,106,135,190,167,170,107,156,147, 76,
+240,157,248, 44,132,128,210,134, 28, 3,100,168,170, 57, 99,144, 50,150,172,196,166,233, 10, 77, 24,188,240,226, 57, 96, 50, 84,
+179, 26,109,133,115,179,197,196,165,186, 2, 83, 8,242,181,221,110, 49,166,160, 52,153,139,149,160, 13, 70,105,102,243,138,190,
+235,137,209, 83, 22, 37, 87,246, 15, 88,173,215,244, 99,207,124,177, 71, 78,153, 16,164, 43,186,221,182,216,202,137,231,222, 22,
+178,193,247,242,216, 65,248,232, 20,228,179,225,131, 64,232, 85, 49, 13,157,219, 45,133,115,184,170, 34,132, 68,214, 83,187,161,
+ 45,104, 91,225,139,199, 78, 82, 3,115, 18, 77,133,181, 86,222, 7, 49, 81, 55,205, 37, 10,149,115,158, 6,143, 10, 41,117,170,
+104, 39,139,230, 14,173, 82, 74,178,229,179, 18,209,162,124, 15, 37,202,100,186,173,100, 51, 56, 39, 46,151,178,172,232,123,225,
+168,173,117,140,227, 4,119,215, 21, 86, 89, 66,142, 88, 45, 90,152, 97, 24,105,154,138,126,232, 37, 92,202, 58,202,194,136,128,
+214,201,166, 30,114, 34,140, 34,226,157, 47,247,176, 90, 51,134,192,208,119,192,228,151,143,226, 12, 9, 33, 48,155,149, 82, 87,
+140,156,129,123, 7,251,248, 81,154, 10,197, 75, 47, 20,222,172,153,113,113,126, 78, 85,200, 16,188,191,183, 79,140,158, 49, 68,
+ 17, 7, 42,197,197,197, 5, 57, 38,234,249,156,178,170, 80, 70, 51,142,114,137, 43,160,112, 53, 41, 11,164,110,140, 97,103,177,
+203, 57, 79, 2,216,192,114,185,148,133, 43, 75,112,142, 45, 44, 90,137,152, 14, 50,125,215, 51,140, 3,209,123,161,148,172,187,
+ 28,170,119,155,254,224, 7, 64, 83,215, 37,219,173,136,247,180, 82, 44, 22,191,233, 83,184, 12,155,233,123,140, 86, 20, 90,145,
+141,161, 44,157,136, 8, 55, 61, 33, 73, 74, 95,244, 98,111, 43, 92, 65, 81, 21,220,126,245, 13, 94,127,235,251, 60,121,222,178,
+218, 4,180, 10, 24, 91,146,213,140,224, 19, 33,180,228,176, 37, 14, 39,168,188, 38,169,125,246,110,188, 65,213,220, 96,255,218,
+151,184,118,235,235,188,122,239,128, 39,143,122, 30, 62,250, 51,158,124,246, 23,108, 46, 62,162, 59,127,140, 41, 15,184,251,165,
+ 63, 98,239,106,201,233,234,159,242,249, 95,255, 27,210,122,133, 9,158,166, 42,120,118,114,134, 66,196,179, 69, 93, 17,195,200,
+ 11,183,247, 24,123, 79, 84,226,134,113, 70,241,210, 75,119,184,117,251, 22,203,189,134,247,223,251,152,235,183,246,113,166, 98,
+181,218, 48,116, 3,139,253, 5,255,207,159,254, 37,215,111, 93,103, 62,111,208,185,228,206,157,155, 20, 69,197,193,193, 1,159,
+124,242, 1,175,190,126,159,232, 21, 62,122, 62,250,224, 19,202,178,102, 28, 70,180, 65,180, 34, 81,241,254,251,239,227,189,232,
+136,106,231,104,187, 13, 89, 23,168,152, 8, 97,164, 94,204,100,121, 29, 6,230,179,130, 47,188,124,151, 7,159, 61,161, 91, 95,
+240, 15,254,232, 15,201,195,150,255,231, 79,254, 37, 31, 61,217,162, 42, 40,234, 37,215,175, 93,197,135,129,190, 61,166,174,102,
+236,205,175,210,204,175,243,197, 55,191,136,239,206, 48,251,215,174,253,168, 44, 43,198,177, 39,103,241,230,186,162,148,169, 49,
+ 71, 22,243, 5,245,172,145, 11, 22, 16, 47,171, 21, 59,198,212, 1,124,109,102,216,250,204, 27, 87, 13, 63,123, 44, 10, 80,180,
+194, 24, 75, 74,138, 24, 2,165, 73,188,180,231,248,249, 81,228,229, 61,195, 43, 7,150,207, 46, 36,206, 81,101,205,219, 55, 45,
+247,247, 12,159,156,202,166, 38, 16,179, 69,107,203, 27,215, 13,223,184,237,248,213,225,150,210, 85,148,101, 33,126,213,193, 83,
+ 54, 13, 43, 15,199,157, 28, 24, 95,185, 81,176, 40, 13, 31, 60,219, 74,145,139, 54,242,120, 20,220, 90,136,178,246,241,121, 63,
+ 93,150, 76, 47,124, 36,133, 9,218, 66, 16, 9,157, 69,137, 92, 56,199,118,179,154, 46, 34,205,114, 57, 93, 18,131, 88,239,154,
+186, 33, 39, 48,182, 32,134, 65, 60,242, 81, 42, 46,151, 51, 81, 52,251, 32,252,102,202, 98, 99,114,147,221,199, 89,233, 57,247,
+ 99, 32, 43, 17,217,148,101,193,206, 43, 60, 78, 27,227,118,179,101, 28,195,165, 8, 41,198,192, 98, 49, 39,197, 41,121, 46, 75,
+ 27,153,168,135,229, 57, 43, 11,135, 38, 99,157,136,138,194, 36,174, 42, 11, 75, 81,214, 20,149,244,135, 91, 35,135, 66, 89,137,
+255,222,149, 5,182,168,177,133,195, 21, 53,133, 43, 80,100, 52,194,109, 86,117,125,105,133, 26,135,129,113,138,118, 45, 38,122,
+ 36,250, 64,221, 52,196,148,233,123,129, 24,141,145, 0, 28,109, 52,209, 39,124,140,104, 35,156, 98, 81,148, 84,149,132,139,164,
+ 44,251,186, 66, 54,197,148, 68, 1, 44, 33, 53, 98,203, 75, 81,120,201,148,224,252,252,140,205, 70,148,255, 41, 75, 98, 93,138,
+153,166,169,105,219,158,253,253,125,134,113, 64,101,129, 55,155,186,153,160, 78,105, 8,147, 60, 0,169, 30, 29,134,158,186,174,
+241,222, 83, 24, 51, 13, 59, 82, 32, 52,140, 3,206, 58,244,116,128,213,179, 25, 70,203, 38, 26,131,167,172, 26,170,194, 49, 12,
+157, 12, 33, 19,164,186, 88,204,169,234, 90,178, 2,170,154,126, 12, 56,103,112, 85, 73, 82, 10,223, 13,248, 44,130,168,156, 35,
+121,106,180,171,202,234, 18, 13,155,213, 53,117, 51, 67, 41, 68, 8,214,118,210, 17,144, 36,164,199, 88,195,102,187,161,174,100,
+152,155, 55, 11,162,151, 45, 86,172,118, 29, 41, 37,178, 23, 71,135,117,210,146,166, 51,210,109,144, 4,137,179,214, 50,132,128,
+115,130,194, 56,187,131,198, 37, 79,127, 71,155,164, 44,194, 73, 91, 20, 2,245,106, 61,217, 30,101, 72,149, 54,185,124,169,100,
+ 95,111,183,236,226,105,235,178,198, 88,217,108, 71, 63,149, 11,105, 75, 66,184,252,114,178,149,237,244, 36, 33, 68,188, 31,104,
+102,179, 75,241,156,181,154,170,106,228,245,214, 74,138, 75,172,136, 1, 85,150,196,194, 28, 68,212,103,173,224,176,187,139, 43,
+129, 8,223,140, 22, 13,202,208, 49, 14,162,238, 47,156,116, 38, 84,149, 8, 93,229,146, 23,241,105, 8, 98,205,173, 39,164,107,
+ 71,131,149, 69, 73, 74,114,110,180,219,158, 93, 28,179,208, 90, 17, 63, 4,202,194,224, 71, 79, 81,216, 75,104,124, 54,111,216,
+182,178,209,199, 32,150,196,170,172,132,110,200,138,132,198, 26, 13, 25, 81,184,231,140, 41,166,104,236,182,165,174,100, 57, 49,
+218,112,122,118, 74, 57,169,230, 79,143,142, 88,236, 45, 49,147,211,162,170,165,115, 98,179,217,226,202,130,174,239,217, 53,243,
+213,147,197, 79, 91,177,212, 90,107,165, 61,179,151, 76,133,162,172, 48,198,137,166,194, 57, 58,159,240,227, 40, 77,134,179, 18,
+180,194,217, 82, 6,115,160,110, 42, 73,166,235, 7,186,205,134,123, 47,190,202,232,123,186,110,139, 51,137, 66, 39,186,213,115,
+252,112, 74,242,103,248,205,115,198,237, 17,177,223,160,220, 82,158,247,217, 28,239,230,116, 87,231, 28, 29,157,113,254,228, 29,
+206, 87,159,224,187, 51,108,117,133,235,119,255, 22, 95,251,254,127,203,119,254,155,223,195,110,222,100, 44, 31,177,126,250, 41,
+198, 56,240, 61,103,103, 91,118,169,133, 59,237,136, 82,134,118,235,105,251,132,206, 80,106, 67, 10,153,245,166,231,244,108,197,
+227, 79,159, 83, 87, 13,167, 71, 27,222,251,245,103,212,245,146, 91, 55,239,160, 44,188,246,218, 43,236,237,239,241,187,191,247,
+ 59,188,116,247, 5, 30, 60,122,194, 95,253,245,207,208,174, 96, 24, 51, 15, 30, 62, 69, 27,105,178,236,134,142,253,131, 37,111,
+191,249, 54, 31,124,252, 9,219,182,163,105,106,110,223,190,197,213, 43, 87,217,108, 86, 92,108, 90, 73,130,140, 61, 33,120,124,
+ 12,244,221,150,161,237,184,123,251, 58,101,105,105,187,142,122, 94,211, 69,205,225,233, 5, 79,142,207, 80,203, 25, 47,223, 59,
+224,133,125,199, 11,183, 28,113,220, 98,178, 34,118, 45,243,198,145, 83, 71,191, 57,225,189,247,126,141,198, 98,234,229,254,143,
+140,150,124, 95, 91, 56,118, 29,216, 51,151,248,221,251, 87, 56, 30,144, 3,198, 57,186,209,139,186, 58, 4, 54,171, 53,221, 40,
+ 30,210,171,181,136, 77,158,174, 60,119, 14, 42, 78, 59,133,182, 5, 95,185,225,184, 53, 83, 28,118,138,118, 76,124,251,165,138,
+159, 62, 30,248,248, 44,240,157,151, 42,126,121, 20,209, 24, 20,154,153, 83, 52, 5,188,122,189, 96,229, 21,117,161,249,226,245,
+146,175,191, 80,112,209, 71,254,245,231, 50,161,123, 63,162,140,226, 63,253,218, 1, 63,125,180, 1,196,234,210,110,183,244,221,
+192,188,176,244, 73,113,216,203, 99, 2, 72, 74, 46,139, 27,115, 81,224, 63, 91,121,148, 2,166,233,210,247,129, 16, 61, 32,188,
+181,252, 28,102, 77, 35, 86,179, 81, 56,191,229, 98,201,224, 61, 89,105,148, 21, 79,191, 79,114, 65,161, 32, 68,143,117,150,186,
+172, 48, 19, 36,174,180, 40, 90,131, 15, 56, 99, 25, 71,233,146,182,211,225, 25, 83, 36,166, 81, 26,157,198,145,190,147,116,177,
+140, 92,246,222, 7, 36,119, 89, 19,130,120,139,179,146,148,181,162,112, 19,100, 46,170,215,194,136, 90, 89,148,207,153,193,123,
+ 98, 86,212,181, 36,239, 41, 99, 25, 67,194,143,129,152, 64, 59, 71, 72, 96, 10, 17,136, 37, 85,209,183,129,152, 21, 33,128,118,
+ 98, 1,236,167,239, 57,230, 68, 14, 2,165,165, 20,169,202, 18, 66,160,237, 58, 20, 2,125, 22, 69, 65,219, 9, 92,109,140, 66,
+105, 69,204, 65,222,248,109,135,202, 17, 84, 34,142, 35, 41, 73,187, 95,215,182,116, 93, 71,183, 90,211,247, 98, 33, 82, 40, 46,
+206,165, 12,200,123,143, 86,162,244, 23,190, 49,211,247,157, 8, 7,131, 8, 31,181,214, 44,150, 11,102,179, 25,219,109,203,222,
+222,146,148, 68, 48,232, 10, 9,209,104,135,128,210, 14, 61, 89, 23, 71, 47,133, 20,126,244,100,165, 36,230,117, 24, 8, 81, 10,
+125, 68,141, 44,131,133, 12, 28,121,218,138, 20,209, 15, 24,131, 8,187,178, 12, 96,198, 26,202,186, 36, 41, 67, 51,111, 72,214,
+ 16,201, 20,117, 61, 53, 3,106,140,113,211, 97, 95, 98,181,161,180,150,186,116, 88, 45, 62,230, 52,245, 3, 84,149,164,190, 41,
+ 45, 67,116, 89, 85, 92,185,122,141,144, 19,219,190,167,174,231, 19, 66, 99,176,214, 16,145,172,118,163, 21,189, 31,201, 41,203,
+175, 25,161, 7,140, 19, 28, 38, 69, 41, 3, 26,130,212,212, 38,101,201, 74, 17, 19,164, 9,182, 29,250, 30, 17,133,137,202, 95,
+231, 76,240, 35,133,150, 98, 25,103, 45, 69,225,168,172, 8, 74,201, 19, 36, 63,109,176, 33, 68, 70, 47,240,110,206,137,156, 60,
+243,249, 12, 99,165, 56,104,244,253, 52,236,105,209,183, 36, 73, 89, 83,218,138,166,102, 28, 9, 73,202, 69,180, 50,216, 41, 39,
+ 34, 6,121,253,171,105, 3,115, 74,144, 60,163, 52, 57,102,210,216, 17,163,103,185,156,161,115, 4,210,228,128, 72,151, 72,139,
+208,117,153, 89, 45,180, 85, 12,158, 24,196, 38, 42, 27,122,186,252, 92,141,227,128,115,150,186,150,140, 13, 99, 52, 93, 55,200,
+144, 86,214, 12, 99,192,216, 2,165, 11, 81,216, 27,135,247, 18, 93,156, 51,140, 62, 80, 55, 51, 82, 14, 98, 25, 43,203, 75, 23,
+ 64, 97, 45, 82,188, 83, 51,159,205,233,250,142, 56, 10, 69, 23,252,200, 48, 74, 52,242,172,150,130,153,110,221, 34,206, 25, 9,
+136, 74, 25,180, 83,196,152,196,158, 55,244,236, 95, 57,152,178, 35, 2,155,205,150,126,179, 17,145,170,214,140,163, 56,119, 82,
+146, 36,206,161,151,242,166,178,148,109,125,232, 7, 57, 43,147, 32, 30,198, 90, 68, 67,100, 24,188,167,172, 42,116, 89, 99,138,
+138,109, 39,150, 73,114,230, 96, 95,196,196,193,167, 75,247, 82, 72, 61,235,243, 83,110,126,225, 21,226, 88,200,231,116, 92,195,
+112, 72,236, 78,216,174,142,137,249,140,176, 57, 99,200, 3,205,149,183, 41,212,154,210,110, 57, 63,126,200,234,147,159,113,254,
+248, 29,214, 23,159,178, 57,251, 20,223,159,163,203, 57, 69, 49,163, 41, 23, 92,233,110,115,244,112,195,217,163,143,232,253,103,
+248,110, 67, 93, 56,222,252,242,171,226,124, 24, 35,197, 78,187,226, 69,188,172,180,228, 2,116, 62, 18, 66, 38,250, 64,223, 74,
+ 77,241,241,201, 25,171,213, 26,235, 12,161,235,120,118,120, 72,244,154,118,221,178, 55,223,231, 96,121,133,162,104, 56,216,187,
+206,237,235,215,121,237,222, 77,238,190,112,131,243,243, 51,222,123,247, 99, 78, 47,206, 56, 63, 91,241,201,167,159, 83,150,138,
+227,227, 35,186,118,205,131,207, 31,242,193,123, 31,113,126,186, 66,105,199,188,172,185,114,237, 58,207, 15,159, 10, 82, 58,233,
+153, 70, 63,242,252,249, 49, 71,167, 39, 12,237,138,227,195, 83, 46,182, 29,174, 50, 92,191,126,192,226,202,117, 94,125,227,109,
+154,107,119,185,113,243,101,190,248,229, 47,241,131, 63,248, 30,199,167, 39, 92,185,186,228,222,189, 23,113, 85,230,198, 65,195,
+213, 91,123,152,217,254,193,143,152, 18,225,200,194,185,165,148,168,234, 5,223,124,193,241,206,161,191,204,254, 30,134,145,209,
+143,162,112,213, 34,222, 48,133,229,173, 27, 5,203,202,241,193, 89,226,205,235, 5, 31,175,192,106,195,239,222,177, 92,169, 13,
+239,159,202, 22,253,226,210,176, 14,154,164, 11,148, 50,220,158, 91,142,123, 69, 78,153,235, 77,102, 51,102,230,133,226,165,165,
+225,238,210,176, 26, 51, 31,156,101,158,108,193, 88, 17,190, 85, 69,133,210,240,149, 27, 37,239, 28, 6, 98, 18,174, 55,231,140,
+177, 21,237,208,243,246,173,134, 95, 62, 90, 99,180,194, 21,146,158, 68, 74,220, 94, 72,168,196,147,149,240,185, 62,196,233,131,
+ 29,240, 65,184, 33,235,100,195, 5,137,158, 53,214,210, 52, 13,182,144, 77, 52,132, 64, 81,151,148,214, 81, 76,155,125,206, 9,
+223,143, 64,130, 44,138,211,210, 21,164, 32,170,121,103, 5, 45,232,135, 97,122,154,101, 3, 26,134,145,174,109,233, 7, 9, 41,
+ 17, 88, 59,139,142, 33,200, 54,102, 39, 75,149,168,242, 45, 89, 65, 8, 34, 78, 74, 41, 79,225, 26,194, 15,255,251,175, 41,222,
+ 63, 55,104,165,209, 90, 84,248, 74,103, 9, 40,201,137,186,172, 40,156,136,208,134, 65, 20,230, 10,228, 80, 36, 67, 18, 45, 69,
+ 89, 90,250,161, 35,103,232,218, 14,107, 37,239, 61,103, 81, 20,171, 44, 27,121, 86,153,162,172, 68,208, 55,138,231,218, 57, 17,
+ 31, 65, 38, 70,169,140,253,227,175, 44,248,213,161, 71,101,216, 65,156, 85, 93, 81,150,229, 4,231, 22, 24, 43,138,102,165, 20,
+193, 11,119, 31,194,174,117,205,139, 96,176, 31,232, 7,201,190,254,175,126,112,159, 31,127,124,202,206,105, 80, 78, 90,128,174,
+235,217,219,219,195,251,192, 56,241,246,214, 56,124,140,132, 40, 25, 7,104,225, 51,253,232,177, 78, 83,213, 21,222,143,148,174,
+ 64,107, 25,150,186,190,151,150, 56,196, 86,149,115,134, 40,182, 66,239,167, 44,242,186,161,169,107, 57,196, 99,162,172, 75,134,
+110, 16, 8,216,139,168,168,105,154,201,166, 55,202,247,228, 61,206,217,233,235, 15, 56, 59, 5, 44, 13, 3, 99, 47,101, 61,174,
+ 40,232,183, 45, 93, 55,117,160, 71,129,235,253,196, 21, 15, 93, 79,219,110,209, 70,182,192,166,105, 24, 6,143, 70,160,237, 16,
+ 34,117, 93,131,154, 44, 82, 57,139,208, 45, 68,172,214,178, 45,151, 37,182,144,214,191,162, 16,107, 18, 74,226, 73,165,122,119,
+ 10, 60,201,146,212,150,115,166, 40, 74, 57,192,131,196,236,218, 66,194,102,114, 70, 62, 31, 57, 83,150, 37,198, 73, 84,106, 97,
+ 11, 52,242,107,125,247,155,244,189,157, 70, 71,107, 77, 12, 82,198,146,131, 64,204,229,228,195,206, 41, 9,138,164, 69,196,105,
+139, 66, 6,112, 47, 78, 10,231, 10,198, 41,211, 98, 55, 56, 23, 14,138,178,144,174,249,186,166,109, 59,161, 6,178,216, 31,171,
+178,162,174, 42,234,186, 70,235, 41,192,200, 24, 12, 10,235,204, 37,205, 7,242,122,187, 66,162,127,141,145,250, 96,239,101,187,
+ 82, 89, 62,234,213, 46,160,200, 24, 65, 42,122, 79, 89, 58, 98, 12,180,125,135,100,253,100,246,246,246,101, 24,180,150,205, 86,
+172,142,163,151,104,106, 99,100,128, 40, 74,201,175, 48, 70,226, 92,245,244,125,133, 24, 81, 89,161,173, 8,131, 13,154,106, 86,
+225,172, 37,199, 76,215,181,151,232, 85, 12,178,224,236, 82,249, 82,146, 14,128,189,189, 61, 92, 81,209,174, 55, 20,101, 65, 83,
+ 87,226,228,152,132,196,101, 37, 3,139,247,126,210, 60, 56,214, 23,103,211,162, 87, 80, 21,210, 20, 56,246,189,124, 62, 42, 89,
+ 90,146, 17,113,101, 74,226, 28,200, 49, 98,172, 33, 39, 56, 60, 60,230,181,175,254, 22,185,124,157,196, 13,250, 49, 49,108,142,
+104, 47,158, 97,178,167,219,118, 84,123, 95,224,238, 87,254,152,131,171, 95,102,115,246,128,238,236, 67, 26, 19,240,221, 33,227,
+250, 49,219,243, 7,244, 23,159, 51,118, 71,172,143, 62, 36,165, 64, 80,129,167, 15, 63,227,226,228, 83,214,167,143,232,211, 51,
+186,147, 99,220,124,129, 63, 89,225, 99,102,232, 58,188, 79,151,116,208, 46, 97, 51,198, 76, 74,114,110,197, 56, 45, 84, 49, 78,
+151,190,102,103,185,221,180, 29, 39,199,199,156, 94,156,243,217,131, 7,252,252,167,191,224,209,103,159,113, 48,107, 88,109, 58,
+ 62,248,248, 1,105, 28,169,172,230,235, 95,251, 10,247,239,189,196, 87,223,254, 18,223,250,157,111,208,173,123,246,247,150,236,
+ 45, 26,174, 95,191,198,171, 47,223,102,117,113,206,179,103, 71,108,186,150,199,207,158, 49,140,153,193, 71,122, 31,233, 6,201,
+145, 48, 86,208,146,100, 10,198, 0,154,140, 31, 7,158, 30, 30,243,209, 71,159,240,206,187, 31,113,247,206,139,180,195,134, 63,
+251,215, 63,229,227, 7,143,121,239,215,239,208, 84,115,190,240,230,219,220,123,237, 13,190,254,219,223,224,252,248, 12, 51,219,
+223,251, 81,206,242,134, 8,193,139,245,166, 18,104,230,246, 76,241,124,213,179, 25,197, 11,238,189, 8,138, 34, 80,150,226, 53,
+119,101, 69,101, 20, 93,212, 28,135,154,151,151,208,229,146,168, 11,172,130, 59, 11,197, 59,167,144,209,188,118,160,121,184,206,
+244,201,112,238, 45,223,189,147,248,164, 21,168,247,198, 76,252,167, 63, 63,177,124,124,158,120,239, 40,112,220, 37,250, 40, 48,
+120,202, 89,184,214,156,208, 74,178,195,111,204, 13, 71,109,194, 88,133, 70, 4,101,134,200,253,131,146, 15, 78, 71, 17, 31,105,
+ 13, 36, 98,130, 91, 75,225, 23,159, 94, 8,167, 24,130, 84, 18,198, 36, 97, 40, 57, 75, 74, 26,232,203, 45, 59, 79, 48,168,209,
+134,118,219, 94, 90,158, 80,234,146,251, 50, 70,226, 53,171,178, 70,163,216,110, 55,104, 43, 69, 41,214,137, 2, 86, 96,120,129,
+ 55,165, 80,195, 95, 30,154, 40,133, 54,150,229, 98,142, 53, 98, 21,172,106,177, 4,250, 65,172,128,193, 75, 42,152,108, 81,146,
+189,110,180, 12, 30,221, 32, 7,230,175,143, 18, 49,253,230,247,198, 24, 24,122,241,236,170,105, 75, 84, 10,200,162,250,119,133,
+ 40,243,253,180,169, 56,107,201,201, 11, 34, 48, 9,201, 4,214, 20,255,116, 14, 97, 18,153, 25, 80, 50, 12,168, 44,131, 5,211,
+193,217,245, 61,255,229,239,222,228, 23,207,132,207,213,214,240,179, 7,107, 1,240,141, 36, 16,230, 36, 98,185, 24, 2, 85, 37,
+141,119, 97, 26, 60,118,155, 68,206,121,226,191, 69,192,232,189,151,204,114, 35,153,243,191,247,218, 85,126,125, 36,158,254,186,
+ 17, 36,194,143, 3,243,249,130, 16,197,221,176,171,171,109,251, 94, 90,208,208, 40,101, 40,172, 80, 14, 57,103,113, 32, 36, 69,
+ 24, 3, 59,223,191,214,138,190, 23, 17,152,154, 46, 70,129,126,101,192, 43,157,155,124,251,129, 49,136,160,179, 40, 75,134,126,
+ 32, 38, 17,150, 69, 31, 80,214, 96,141,145, 96,160,178, 36, 4,225,226,149, 22, 11, 24, 74,106, 86,199, 81,226,125, 37,230, 56,
+144,201,211,243, 33, 49,193,174, 40,104,187, 45,221,182,165,168, 10,150,139, 61,202,178, 70, 43,209,112,132, 32, 52, 89, 63,140,
+ 40,197, 20,230, 34,104,144, 66, 68, 87, 74,201,107,110,139, 2,109,100,176,132,204,208, 15,104, 45,249,244, 40, 53, 93,210, 74,
+126, 30, 37,156,201, 90, 55,205,240,226,142, 80, 74, 95, 34, 24, 97,244,147,250,221, 77, 92,173, 12,101, 49, 70, 36,113, 47,177,
+ 43, 18,113,206, 77,255,150,247, 80, 10, 73, 96,248, 36,182, 39,173, 37,128,168, 44, 75,172,182, 98,223, 76, 25,152,114,201,147,
+192,253, 18, 91, 42,208,186, 43, 10, 82,140,248, 32, 81,170, 40,125,105,249, 82, 74,132,156,198, 9,237, 54, 6,225,239, 99,244,
+196, 36,181,172,125,223,211, 15,195, 52,244, 72,250,225,208,139,235,100, 71,129,249,209, 83, 55,146,226,231,138, 41,117, 82,229,
+203,225, 83,234,113,229,107, 13, 99, 32, 78,226, 49,208,236,237, 45, 39,101,187,208, 39, 77,221,160,173,228,239, 87, 77,131,115,
+165, 12,252, 93, 7,136,222,195,123,143, 45,221, 36,188, 77, 12,131, 4,226,100,178, 12, 64, 9, 17,216, 78, 95,119, 28, 61,243,
+197, 66, 28, 59, 41, 51,134, 72, 93, 85, 84, 51, 25, 58,197, 93,163,104,102,205, 4,187, 75,202, 94, 76,146,244, 87, 85, 59, 33,
+107,184,204,172, 64,113,137,112, 88, 43, 94,254, 98,218,244,227,100,231,139, 65,188,235,101,221,160, 92, 65,200, 25,171, 45,117,
+ 93, 49,110, 90,190,250,189,239,177,233,230,144,247, 80, 58,146,245, 12, 76,133, 91,190,204,205, 87,127,200,171, 95,251,143, 89,
+ 94,125,153,152, 2,232,130,179,167,191,162, 95, 31,226, 22,150,154,129,110,125, 68,101, 19,253,250,132,229,193, 29, 92, 85, 49,
+182,103,116,219, 51,218,238, 57,193,159,161,218, 21,231, 23, 79,177,243, 6,191, 94,209,111, 55,144, 53,189, 23, 65,117, 89, 23,
+184,202,161,208, 24,162,220, 21, 89,225,140, 66, 89, 71, 89,149,132, 4, 67, 28,105,251,129,182, 23,235,225, 56, 6, 98,146,130,
+ 31,109, 13, 99, 8,124,242,240, 33,199, 39,103,228,156, 56,111,183,156,159, 95,112,118,126,198,118,181,229,218,222, 21, 14, 31,
+ 61,101,111, 62,231,244,236,130, 79, 63,125,204, 87,222,120, 5,114,226,233,225, 67,110,223,186,129, 85, 35, 63,248,253,223,226,
+245, 55, 95,227,245, 47,222,147,193,176,146,129, 41,132,200,122,211, 51,140,145,171,215,174,210,143, 61,155, 77,207, 48,102,108,
+ 41,105,157,239,127,240, 1,231,231, 23,108,135,196,119,191,241, 13, 62,124,116,204,255,251,206, 67,198,205, 19,254,230,151, 31,
+241,214,111,127,155,236, 71, 76,189, 92,254,136,233, 16, 52, 19,143, 89,215, 53, 42,103,116,246,236,213,150, 39,231, 3,105,130,
+ 34,141, 49, 24, 39,202,192, 56,125,224,190,120,144,249,240, 44,211, 71,168, 12, 52, 38,115,216,193,149, 66, 68, 32,141, 83, 60,
+217, 68,190,112, 69,243,224, 34,209,249, 72,140,114,225, 31,174, 61, 47,205, 2,133, 78, 24,149,120,180,146,131, 93, 41,208, 90,
+248, 43,165,245, 52,213,154,203, 41,255,100, 80, 60,111, 51, 10, 57,116,148,118,248,232,153, 59,205,221, 61,203,231,107,232,251,
+ 14, 9,172,145, 18,143,111,189,180,224,157,231, 45,237, 16,197, 90,180,187,212,163, 64,125,214,200,212,170,152, 90,194, 74, 81,
+188,122,239, 5, 98,215,178,169,198, 44,153,241, 18, 18, 34,181,174, 9,217,136, 98, 18, 56,215, 88, 75,105,196,207,171,148,168,
+157,157,149,100,175,144, 68, 81,159,145, 72, 73,178, 8,209,102,149,164,189, 25, 35,109,114, 78,235, 9,206,202,160,242, 36,134,
+ 17,196, 83, 46, 26, 79,240,146,213,110,148,154, 42,102, 69, 64, 19,130,248,224,115,222,165, 82,201,215,138, 49,146,208, 64,100,
+ 28, 2,237, 86,194,115,140,182, 12, 83, 66,224,208,119,196,152,232,218,150,113,232, 24, 7,121,140,214,202,239,105,167,176, 27,
+ 99, 12, 62,202, 6, 46, 7,177, 97, 24, 71,190,245,202, 1,255,234,215, 79,241,163, 71, 10, 85,164,129,172,112, 2, 13,238, 50,
+216, 11,231,176,206,209,247, 35,174, 40,104,234,250,242, 2, 79, 41, 49,155,137, 0, 18, 20,117, 37,218,135, 12, 40,165,248,214,
+ 43, 7,252,229, 39,103, 50, 88,218, 41,200, 38,139, 26, 24, 4,162,172,154,154,148, 20,201,123,170, 89, 45, 72,148, 23,216, 95,
+ 44,123, 18,120,148, 98,160,169,107,250,118, 43,177,182, 81,154,255,156,115,147,246, 65,120,104,224,114, 83, 15, 33, 96,157,101,
+ 62,155, 33,121,230,162,111,176,206, 97,181, 5, 45,226, 35,227,156,216,200, 98,132, 44, 86, 50, 31, 2, 41, 72,240,209,206,203,
+109, 11, 71,205, 13,126,187, 0, 0, 32, 0, 73, 68, 65, 84, 78,194, 3,238, 54,226,178,172, 80, 89,146, 3,115,134,152,229, 18,
+ 45, 75, 73, 79,235,186,158,178, 22,151, 1, 40,234,166, 20,251, 80, 41,218,128,221,123,207,104,113,180,148,101, 57,105, 88,148,
+160, 15, 73, 46,232,162,144, 65, 43, 36,249,252, 11,127, 45, 30,235,148,229,249, 78, 81, 84,216,109,219,146,179, 68,152,166,233,
+220,112,182,152, 6, 56, 65,179, 0,102, 51, 25, 80,131, 15,204,231,226,203, 14, 73,154,216,118, 61, 4, 49, 69,118, 54, 81,231,
+ 10,234, 74,114, 14, 10,231, 64,107, 36, 88, 72, 6, 13,165, 21, 90, 75,204,173, 54,130,238, 41, 45, 23,145, 66, 33,150,215,192,
+206,134, 25, 98,196,149,133,228, 54, 36,161,164,202,105, 19,150, 48, 35,161, 96,140,153,132, 97, 73,168,152,170,170,232,186,142,
+148, 51,205,172,145, 97,101,232,101, 43,238, 59,114,204, 56,103, 41,138,138,193, 75,207,128, 43, 10,218,205, 6, 63,120, 50, 34,
+104, 3,133, 54,146, 26, 55,122, 41, 89,138, 81,170,141, 85,202,120, 47, 23,175,214,176,221,110, 69,151, 48,244, 36,149, 65,201,
+192, 81, 86,165,208,118,149, 92,170,214, 56,154,166, 70, 41,132,250,202, 2, 35, 43,164, 87, 65, 43, 17,123,150, 69, 65,158,134,
+203,156,197,198,105,180,153,146,230, 2,101, 85,177, 11,155, 41, 39,100,163,176,150,170,145, 4, 56, 73, 25, 20,235,157,159, 22,
+132,157,190,199, 26,131,155,232,137,162, 16,189, 65,240,129,170, 42,136, 62,211, 44,151,116, 49, 81, 54,115,172, 54, 84,229,146,
+211,211,115,226,216, 18, 99,135,213, 21,229,242, 54,174,220, 39,229,145,246,236, 41,221,197, 99,124,119, 68, 24,215,108,206,159,
+ 49,172, 87, 96,106,114,232, 56, 63, 63,103,113,247,223,162, 57,184, 79,244, 23,104,191, 97, 28,207, 8,221, 57, 99,127, 68, 69,
+207,108,102,105,163,151, 16,156,177,103,221,245,130, 72, 25, 9,175,242,163,116,139,100, 13,219,118,192, 39,209, 87, 12,222,211,
+247, 35,235,205, 86, 56,120, 35, 22,101, 31, 34,153,196, 24, 51, 99, 23,200, 42,210,118, 35,235,245,138, 77, 43,141,153, 33, 72,
+250,233,122, 59, 50, 91, 30,240,232,240, 25,171,109,199, 7, 31,126, 72,210,145,189,253, 25,235,190,195,149,146, 4, 90,149, 53,
+219,237, 64,191,238, 56, 62, 94, 51,180,137, 31,252,224,251, 44, 22, 75, 14,159, 62,225,222,139,119,145,200, 97, 39, 1, 91, 24,
+198,152, 80,122, 55, 96,101,174, 93,187,202,152, 6, 54,219, 21, 71,199,199, 28,204, 43, 10,122,246,151,115, 30, 60,125,194,159,
+253,217,143, 57,124,250, 28, 51, 91,238,253, 40,100,121, 99,186, 66, 96,222,178,148,176,138,118, 24,121,227, 90,201,167,171,132,
+ 53,146,200, 84, 86,226, 87,215, 86, 84,242, 7,141,229, 90, 5,159,117,142,161, 15, 28,182,153,239,191,164,248,155,195,196,111,
+ 93,135,159, 60, 75,124,231,174,229,167,143, 7,190,120,205,242,240, 34,224,149, 76,188, 77,161,217,175, 12,218,104,238, 45, 96,
+ 81, 40,238,237, 41,102,133,229,230, 92, 19,179,112,241, 98,155,144, 56,211, 98,234, 2,142, 49, 97,180, 37, 36,225,188,139, 66,
+146,181,102,165,230,206,210,240,241,153, 92,104, 41,103,137, 90, 85,138,111,223,155,243, 23,159,119,196,156, 48, 10,124,140,148,
+101, 73, 76,226, 65,206, 73, 94, 88,137,130,149, 8, 70,107, 37,122, 85, 33,135, 52,211,166, 2, 16,131,240,227,187,130,135,174,
+235, 37,177, 11, 4,202, 53, 48,248,192,191,243, 90,201,231,103, 35, 51, 19,248,123,175, 85, 28,109, 2,227,232,249,251, 95,154,
+243,171,231, 61,127,252,141,235, 60,239, 44, 7, 69,224,239,190, 86,115, 58, 72,223,244,223,125,173,226,227, 21,252,131, 55, 23,
+156,248,146, 23,246, 43,254,189, 47, 47,217,228, 18,237, 44,255,193,155, 75,222, 59, 17, 11, 74,204,145,255,236, 27, 87,248,201,
+131, 21,255,232,119,174,160,128,191,243,133, 37,111,223,110, 8,170,224,222, 65,193,247,238, 55,124,249,186,229, 98, 59,114,120,
+209,179, 95, 4,254,240,245,134,175,223, 46,200,209,243,195,215,106,126,249, 92, 14, 70,165, 37, 49,208,104,205,127,241,205,171,
+ 88, 99,249,222, 43, 53,111,223,170,104,135,192,106,144,129,238, 63,255,230, 13,126,235,238,156,215,174, 20,156,247,129,127,248,
+205,219, 0,124,235,149, 3,126,231,229, 37,127,246,222, 51,254,209, 55,175,243,243,199, 91,174,212,134,239,223,175,248,214,189,
+ 25,247,175, 84,156,118,208,143,153,255,228,235,123,104,165,248,238, 75, 37,111, 92, 47, 72,186, 96, 80,229, 4,187, 11,215,119,
+115, 89,242, 71, 95,187,193,239,189,178, 79, 83, 22,220, 90, 22,252,249,251,135, 44, 75,197, 31,124, 97,159,111,221,107,120,245,
+122,197, 38,202,247, 87, 86, 13,125, 63,113,203, 86, 6, 40,148, 92, 80,206,202,123,197, 24, 73, 90, 27, 38,110, 94,233,132,179,
+142, 24, 97,214,212, 4,239, 65, 75,169,144,213, 6, 87, 20, 20,214,226,202, 74,148,238, 78,170,122,135, 97,192, 22, 82,107,171,
+148,186,132,101, 37,168,197, 17,131,252, 61,243, 41,116,164,235, 90,140,181,204,154, 25, 74,131, 70, 73, 44,235,212,116,183,152,
+ 75,109,233, 56, 14,130,136, 24, 5, 89, 30,147,209,134,182,149, 50,144,162, 44,126, 19, 70, 19, 60, 90, 65, 81, 86,132, 16, 9,
+126,164,158,213,164, 8,125, 55,224,156, 32, 50,100,200,242, 15, 82, 10, 19,156, 46,149,199, 98,103, 77,151,155,120,244,162,159,
+136, 33,225,199, 1,148,160, 36,206,149, 84,117, 67, 85,138,237, 81,186, 17,226,229,214, 45, 77,142,160,146,124, 45,241,201, 75,
+179,161,112,236,224, 92,193,124, 46, 60,179,115,146, 69,160,216, 5, 20,101,218,190, 67,107, 77,225, 44, 41, 74,200, 79,140,145,
+162,116,232,196, 37,138, 98,173, 97,103,185,243, 97,196,106, 17,113, 42,165, 48,106, 10, 25,210, 6,197, 52, 4,199, 56,109,210,
+162,198, 23, 59, 94, 77,152,144,135,126,148, 94,250,194, 57,186,109,135,181,118,162,233, 36, 61, 48, 33,131,137, 20, 59,137,248,
+ 83, 33,209,209,243,229, 28,128,249,124, 46,175, 75, 20, 36, 73, 91, 35,103,166,150,243,203, 57, 17,154,133, 16, 96,162,123, 64,
+145,173, 88,247,178,146,120,225,132,196,110,107,173, 41, 10, 59, 13, 83, 83,224,211, 40,212, 80,219,183, 82,174,179,217,224,202,
+146, 56,142, 12, 94,194,154,250,190,191,188,140,219,174,157, 92, 45,146,204,185, 91,208,132,162,168, 73, 41, 81, 24, 67, 89,136,
+157,181,237, 90,164,165,210, 76,239, 69,177,226,141, 94, 68,204,104, 69,156,206, 75,165, 18, 57, 11,242,165, 39, 20, 32,164,200,
+102,117,193,213, 91,123,172, 79, 78,233,187,115,114,232, 32, 13,228,216,145, 82,160, 95,159,208,110, 31,226,251,167,116,155,231,
+104,213, 66,244,116,235,141,208, 32,245, 93, 94,124,251, 31,242,194, 43, 63,192,184, 61,134, 97, 75,127,254, 25,121,120,134,138,
+ 27,250,205, 49, 97,123, 68,115,227, 38,185,208, 12,237,200,112,126, 66, 63, 72,222, 64, 86, 96,141,162,106, 42,200, 10,171, 45,
+206,149, 52, 69,129,118, 18,160,102,140,162,169, 27,102,117,131,213,134, 89, 85, 81, 53, 37, 77, 53, 99, 62,107,152,205, 27,140,
+145,172, 18, 87,150, 56, 35,159, 13,239,101, 57, 25,199,145,227,231,199,104, 87, 50,107, 22,220,123,237, 85,208,150,144, 50, 71,
+ 71,167, 28,157,158,240,252,120,203,173,107, 7, 56, 34,159,126,254,148,251,119,174,211,204, 74, 62,249,224, 51,172,202, 28,236,
+ 95,225,245,251, 47,113,116,116,130,228,183,120,218,118,100, 62,171,101,121,139,137, 97,232, 89,111, 70,114, 46,152, 47, 14, 24,
+188,231,232,248,156,122,111, 15,173, 13, 95,188,127,151, 55,223,124,129,178,174, 48,123, 87,175,254,200, 26,195,172,105, 0, 73,
+114,202, 89, 96,183,110, 16,165,250,249,152,137, 74,166,240,148,145,233, 29,133, 82,112,103,174, 89,141,208, 38, 9,157, 40,139,
+130,152, 51,183,103,134,187,243,204, 47,206, 37,151,250,214, 92,179, 87,105,158,182, 10,143, 12, 4, 49, 41, 94,223,139,252,213,
+145,229,176, 85,220,168, 51, 63, 59,214,236, 21,146,161,253,197,131,204,171, 7,154, 69, 85,160,108,193,152,132,235,179, 90, 10,
+ 15, 82,146,248,204, 29,239, 69,134,211,117,203,135,199, 83,194, 86,206,228,152,201, 90,224,198, 95, 62,239,133, 15,203, 73, 42,
+ 6,209,184,194,145,124, 32,230, 56, 13, 11, 34,106, 49, 78, 32, 17,107, 37, 32, 6,228,215, 0,148, 22,101,239, 78, 61,170,141,
+192,245, 33,198, 75,184, 94,254,128,124,173, 27, 11,203,225,217,150, 47, 93, 47,248,252,124,228,238,210,114,116,209,178, 95, 59,
+ 62, 95, 5,238,238,215,156,247,137, 55,174, 57,158,108, 34,183, 26,197,170, 15, 44, 74,205,199, 71, 29,183, 22,142,109,212,188,
+126,160,121,188,201,188, 48,215,108,198,204, 94,101,120, 62, 8,183, 95,186,130, 47, 95,179,252,250, 36,243,149, 91, 5, 79,182,
+240,151, 15, 7,214,209,240,123,119, 12,143, 87,129,191,126,158, 57,237,225, 91,119, 10, 62,219, 24,190,119,191,226,221, 67,207,
+143, 31, 39,246, 27,195, 11, 11,195,187, 39, 17,231,204,164,112,151, 13,234,173, 27,150,135,171,192,159,188,119,194,225,122,224,
+111,191,126,133,247,142,101,147,251,171, 79,207,248,217,195, 53,199, 91,207,119, 94, 89,242,191,253,228,144,175,191,184,224,127,
+248, 23, 31,241,215,159,175, 80, 10,190,249,242, 62,239, 28, 6,254,246,203, 37,159, 94, 36,254,242,129, 68,138,126,245, 86,201,
+187,135, 45, 95,189, 93,241,209,225,150,127,245,209, 57,235, 96,248,237, 59, 21, 31,158, 70,118,225, 35,125,223,243,239,126,229,
+ 38,239, 60,109,249, 23,239,157,176, 44, 53,247,174,214,252,248,195, 99,254,232,183,110,243,193,201,200, 95, 61,246,180, 65,243,
+141,219,142,247, 79, 38,216, 86,201,193,175,141, 64,201,206,186, 9,237,144,226,156, 16, 35, 97, 42,178,112,147,157,174, 44, 75,
+202,210, 78,151,177, 40,143,165,123, 91, 84,221, 41, 75,126,185,209,226, 45,207, 25,198, 49,224,140,198,104,177, 71, 73, 15,188,
+160, 40,174,152,234, 55, 67, 4, 53,213,159, 26,131, 70,145,149,194, 15,130, 28,184,178,160, 42, 11, 54,155, 13,131,151,244,186,
+209,123, 17, 73,181, 45,243,249,140, 48,109,124, 77, 89, 78, 2, 77, 25, 80,172,149, 33,185,239,122,209, 21,244,237, 20,139,235,
+129, 36, 94,235, 36,151,169,117,210, 35,110,172, 92,178,187,116, 54, 51,233, 62, 98,146,207,254, 14,238,213, 90,145,149, 92,208,
+ 74, 11,138, 36,209,177,162,152, 23, 90, 41, 2,114, 17,185,194,161,180,166,116, 37,163,151,128,161,166,110, 64, 25,140,146,164,
+202,221,182,167,181, 38, 5,217, 74, 7, 63, 37, 78,142, 35, 33, 38, 98, 16,196, 68,107,185,136,180, 54, 83,143,128,102,219, 74,
+126, 68, 89, 74,237,242,118,187,249,205, 66, 82, 72,207, 4, 73,208, 51,239, 61, 77, 83, 34, 77,121,115,234,178,154, 98, 99, 65,
+ 41,125,137, 20, 20, 86,168,143, 20, 3,222,203,160, 30, 99,162, 27, 7, 10,171,137, 33, 82,184,130,210,149,248, 16, 8,147,246,
+ 97,156, 68,125,205,124, 6, 33,224, 74, 41,103, 82, 90,156, 29, 74,137, 35, 99,236,101,160,240, 99, 96, 24, 71,180, 18,212,103,
+ 28, 71,250,161,159,244, 17, 35, 85, 85, 17, 67,160,105, 26,154,170, 65,107, 77, 63, 72, 7,133, 32, 16,146,224, 87,215, 13, 40,
+104,219,142,190,235,132,202,170, 43,108, 81, 78,239, 63,241,251, 75,176,214, 20,166,149,127, 19,191, 59, 12, 35,121, 55,160, 76,
+131, 80, 36, 19, 82, 96, 24,122,113, 24,164,200,182,109, 25,125,160,105,106,170,178, 32, 36,209,251,136, 91,161,188,220,222,243,
+244, 57, 25,199, 65, 6, 30, 55,117, 3,244,129, 43,139, 57,235,243, 71,244,219, 51, 84, 92,163,194,134,236, 47,136,227, 25, 57,
+245,248,237, 49, 35, 39,228,213, 25, 93,183,129,108,184,255,213,223,231,224,206, 55,105,174,190, 66, 53,191, 65,206,129, 24, 7,
+250,238,156, 97,115, 72, 28, 54,140,237, 6, 53,123,145,229,173,111, 83,220, 42, 25, 47,158, 51, 55, 37,202, 21,148,205,156,102,
+ 49, 39, 40,141, 79, 25,180,197,167, 64, 54,154,140,162, 31, 70, 82,204,132, 36,168, 83, 12,129,164, 50,221, 32, 67, 17, 90,177,
+218,108,216,182, 29,227, 48, 16,146, 20, 50,121, 47,122, 18, 99, 20,198, 41, 68,143,166,105,219, 21,135,135, 71,124,244,225,199,
+156,157,111, 88, 93,116, 92,189,126,139,131,253,107, 24,237, 88,175, 59,222,255,248, 33, 69, 85,147,124,135,213, 5,101,109,248,
+236,241, 51,198,228,121,244,236, 25, 55,175, 31,176,183,220, 67, 41,195,114,111, 73, 28, 35,175,190,124,143,174,239,152, 53, 13,
+ 87,175,236,211, 13, 29, 99, 63,161,144, 90,177,222,108, 89,245,158,213,214, 19, 70,203,124,113,128, 45, 75,129,246,180,209,196,
+113,154, 4,199, 17,183, 88, 80, 84, 21,143, 86, 61, 55, 43,120,254, 92, 36,250, 59,101,182, 82,144, 19, 60, 88, 37,186, 49, 82,
+ 20, 3, 33, 40,146,202, 60, 94,103,190,243, 66,226,215,167,194,185,190,127, 14,223,127, 65, 99, 53, 92,140, 98,223, 73, 41,113,
+180, 85, 28,220, 85,228, 16, 56, 11,153,131, 10, 78,182,145,243, 78,161, 77,230, 87, 49,179, 95,194,157,121,226,107, 87,225, 89,
+171,120,231, 68, 26,208,156, 43, 9, 97,151, 62, 37,246, 23,227, 52, 54,218,203, 3,209,153,146, 96, 61, 70, 25, 64, 46,246, 68,
+ 36,105, 80,100,129,143, 98,100, 12, 34,126, 49, 90, 54, 12,116,166,176, 5,145,241, 18, 10, 86, 90, 88, 25,165,101, 88, 48,218,
+144,173,136,210,188, 31,209,198, 80, 58, 71, 50,102,250, 0,101,146,247, 68, 20,167,109,228,206,126,193,178, 54,252,243,247, 78,
+249, 15,191,118,157,123, 87,107, 46, 6,193,129,142,219,200, 75,251,142,121, 9,127,254,121,203, 15, 95,107,120,241, 74, 67,151,
+ 20,179,249,156,243, 1,110,212, 48,115,138, 63,127,226,249,225, 61,203,205, 70,113,222, 39, 32, 49,140,210, 51, 14, 83, 59, 21,
+240,225,153, 71,105,197,147, 11,143,190, 83,241,209,137,100,179, 63,108, 3,127,251,197, 37,125,223,179, 44,231,124,114, 50,144,
+148,226,147, 99,185, 16,253, 56,242,199,191,181,100,247,227,127,249,171, 67,160,226,103,159, 30, 19, 82,226,241,185,163,114,114,
+176,190,125,123,206, 87,239, 94, 99, 86, 76,151, 64,206, 12,157,184, 20,230,243,249,164,160,149,139,121,221,109,216,171,102,252,
+234,221, 11,138,178,226,221,103, 45,223,120,161,186,140,217,252,116,165,240, 49,243,217,241,150,239,191, 34,121,249,114, 64, 72,
+ 68,233, 65,227,120,231,201, 10,109, 44,239, 31,118,124,247,117,185,128,175,207, 75,110, 46,171,203,199,155,115,190,180,252,108,
+183, 82,196, 17,166,205,164,235,149, 80, 57, 86,163, 81, 24, 5,125, 24, 80, 74, 4, 94,218, 40,116,102,130, 45,243,165, 23, 30,
+100,136, 5,208,102, 87, 38,162, 46, 55,255,166,145,237, 88, 11, 67,195,182,235, 38,177,153,161,239,132,170,176, 78, 32, 84, 20,
+184,137,127,119,214, 98,235,134,140, 88, 15,119, 1, 66,198, 24,105, 41,180,150,205,102, 35,151,170, 18, 61, 2,169,144,190, 2,
+ 20,165, 19,116, 96,189, 90,137, 32,204, 76, 58, 1, 35,205,104,187,166,192,232, 69,168, 26,240,164, 44,144,120, 24, 71,138,186,
+102, 24, 90, 32, 99,173,102, 8, 9,149,229,231,217, 40,200, 25,200, 16, 35,186,148,220,248,186,170,209,211,134,106,180, 5,165,
+168,156, 60, 38,159, 18, 78,105,180, 85,196, 48, 2,162, 78, 95,175,215,146,172, 22, 38, 15,182,150,109,103, 72,153, 16,132, 54,
+ 17,174, 93, 44, 61,133,179,216,170,148, 75,221, 8, 58,224,187,129,110,144,154, 88,173, 20,123,123,123, 2,175,118, 82, 94,210,
+182,173, 4,125,228,204,184,237,209, 90,102,234,221,171, 39,249, 27,137,164, 20, 58,107,140, 45, 72,121,162,106,162, 39,163, 88,
+ 44,102,180, 91,240,227, 72,202, 48,155, 53,172,214, 27,182, 91,225,180, 71,239, 89, 46, 22,184,210,161,179,180, 83, 74,111, 70,
+196,251, 64, 14,129, 20,132,150, 83, 90,250,226,253,232,177,214, 81,205, 26,156, 21,157,192,102,187, 37, 38, 48,206, 18, 39, 23,
+ 66, 38,177, 88, 44,167,109,119, 39,206,147,160,161, 89,211, 16, 70,209,171,168,156, 39,132, 81, 82,220,148,146,239, 79,187, 41,
+153,176,146,124,254,221,133,238, 40, 40,156,132,100,197, 24,169,220, 84,159, 26, 90,198, 97,196,104,197,106,181, 66, 27,205, 98,
+177, 96,103,241,220,108,214,204,102,141, 80, 70,101, 73, 72, 66,203, 86,181, 68,240,142,227,200,102,179, 1,165, 88,206, 37,221,
+ 47, 4, 79,129,124, 22, 99, 16,170,161, 31, 31, 18,163,231, 11,175,188,202,179,103, 79, 57, 57,121,142,161, 33,250, 53,218, 22,
+116,195,136, 34, 67,232,216,108, 47,168,174,125,157,131, 23,190, 74,221,180,140,195,167, 28,125,250, 33, 81,149, 56, 83, 51,116,
+107,180,134,250,202,107,244,221, 57,179,131, 43,220,126,245, 15,169,231, 55, 25,250,119, 89,222, 61,230,149,151, 10,254,234, 39,
+127, 33,195, 39,226, 96,218,157, 77,253, 68, 35,110,219, 14, 10,199,232, 69,183,226,202,226,210, 13, 98,203,146, 89, 93,179, 94,
+175,200,198, 50,219,155,179,186, 88,211,121, 41,117, 26,167,112, 38, 51,159,227,202, 6,231, 52, 41, 68, 74, 91,200,224,225, 61,
+221,118,141,181,150, 15,222, 59,167, 41,155,203, 51,249,224,202, 85,182,219, 45,167,171,129,238,226, 17,110, 94, 51,155, 45,184,
+186,127, 32, 26,128,170, 96, 76, 61,247,238,223,161,223,182,236, 47, 43,202,178,230,198,181, 27,164, 48,114,116,122,113,169, 21,
+233,182, 29,167,103,167,144, 96,177, 47, 17,192, 15,142,142, 72, 89, 99,119, 77, 83, 32, 74, 75,167, 20,245,108,198,106,179,102,
+ 86, 55,124,190, 41,248,206, 93,120,188, 10, 28,109,214,148,165,164,174,229, 28,196,154,225, 36, 11,157, 20, 49, 74,120,173, 23,
+ 26,228,226, 39, 49,250,136, 86,240,127,124, 26,185, 82,139, 77, 72,105,133, 86,146,152,116,218,107,230, 46,112,218, 37,222, 57,
+113,188,113, 37,162, 80,220, 89,100,242,229, 71, 50,243,120,157,104,156,226,247, 95, 84,252,179, 79, 90,118, 94,240,157,101, 39,
+ 27, 77,142, 35,117, 89, 19,115,148,130,132, 4, 57, 75, 96, 76,142, 50, 72,164,148, 80, 19,216,103, 92,193, 56,169, 90,181, 18,
+ 49,203,124, 57,131, 36,118, 56,163, 69,236, 70, 18,158,113, 23, 46,155, 21, 24, 18, 40, 38, 37,101, 66,249, 1,171, 45,166, 50,
+132, 49, 8,156,161, 21, 38,103,206,218,200,223,122,185,225,151,207, 36,203,252,243,139,200,155,183,102,252,228,113,135, 51,150,
+243, 46,240,237,235,150, 95, 62, 31, 72,100, 62, 57,245,188,125,171,228,157, 19, 41,157, 57,235,100,187,126,247, 36,161,209, 60,
+ 88, 37,190,116,205,241,179,167, 34,106, 43,236,148, 87, 15, 56, 51, 13, 48, 81,158,223,182,221, 2, 21, 71, 39, 71,178,109,106,
+128, 37,155,245, 5,171,161,225,229, 3,195,187, 79, 47,184,119, 93,248,235,213,197, 25,255,253, 63,123, 42,219,198,255,239, 82,
+ 54,214, 81, 89, 75, 59,121,126, 85, 86,124,235,254,146,127,254,235, 83, 30,158,174,121,241,202,140,127,251,173,235, 40, 45,219,
+158, 37, 18, 2, 68, 57,117,104,215, 91, 78, 55, 3,119,154,200,225,224,121,235,246,130,139, 62,225,140,160, 26,163,151,104,221,
+122,186, 72, 47, 86, 23,151, 27,134, 53,150,179,214,243,234,213,130,247,159,183,188,117, 71,134, 14,101, 12, 71,155,145,159,127,
+118,202,199, 39, 29, 49,138, 69,113,239, 96, 15, 99, 44, 77, 35,124,214, 48, 74,232,140, 31, 39,129,164,247,132,156, 49, 78,170,
+127,179,206, 56, 35,250,128,245,182,165, 40,166, 20,177,114,215,234, 22, 9,190,199,152, 2,114, 98,151, 96, 6,160,180, 92, 48,
+162, 87,213,148, 85, 69, 14, 1,107, 11,200, 35,125, 63, 96,156,192,192, 70,235,203,237, 50, 26,141, 81,153,108, 37, 30,213,143,
+130, 24, 92,191,126,141, 24, 34,235,245,234,146,139, 94,238,237, 49, 14,227,196,155, 90,218,190,101, 54,107,200, 25,206, 47, 86,
+164,148, 56, 61, 57,101,255, 96, 57,193,173, 34,190,179,246, 55,234,237,156, 19,101, 85,139,255, 60,102, 82,142, 56,107,136, 65,
+ 77,155,185,102,222, 84,196, 44,207, 69,206, 25,163, 36, 99, 65, 20,213,210,167,173,178, 4,165,228,148,105,251, 45,206, 56,170,
+186,162,223,246,104,103,241, 41,162,130, 12, 6, 49, 7, 82,144, 96,148, 12, 20,174, 16,216, 63, 39, 4,108, 23,117,135,178,134,
+162,114, 24,165, 41,173, 35,197,132, 41, 10,172,214,108,187,169,223, 32, 38,230,243, 25,155,118, 75,214, 34,252,202, 57,131,150,
+130,168, 20, 18,235,245, 26, 87, 72,222,248,162,158,225,128, 24,165,231,192, 88,203,106,181, 37, 38, 73,112, 20, 47,189, 70,233,
+ 41, 69, 47,103, 22,139,185,120,226,155, 70, 66,124,156,148, 73,245,219, 14,200,151,207, 67,233, 10,188,143,172,183,107,225,246,
+149,232,139,140,142,151,212, 66, 81,136, 32, 77, 98, 98, 5,178, 78,200,240,210,164, 76, 8, 3,130, 0,106,150,203, 57,221,208,
+145, 83,162,107,123,230,139,153, 8, 12,199,129, 97, 24,132, 70, 73,105, 26, 78, 51,117, 93,179,217,108,169,103, 13,139,165,197,
+ 71, 25,106,186,190,157,104,200,169,137,174,221, 82,148, 5,131, 15,244,189, 80, 45, 89,137,198, 98, 62,151,194, 40,217, 60, 37,
+125, 47,132, 68,215,110,167,206,139,201,159,111,180, 12,175, 73, 92, 70, 77, 35, 45,134,206, 57,180, 86,132, 24, 56, 63,191, 96,
+177, 88, 72,110, 66, 41,131,189,179, 14,178,166,116, 5,103, 23, 71, 92,187,118,139,249,108,159,245,232, 40,170,125,186,179,207,
+ 24,218,141,124,110,178,167,237, 3, 87,238,253, 29,110,127,225,135,248,177,231,226,228,207,168,236,136, 29, 7,250, 77, 43, 62,
+249, 20, 73,190, 69,145,169, 22,119,169,175,188,142, 8, 55, 51, 33, 52, 64,193,147,195,167,172,214,107,252, 56, 82,214, 37,123,
+123,123,196, 40,206, 31,146,184,168,150,243, 57,237,216, 83, 20,110,122,109, 52,214, 86,236,234,169,101,176, 17, 20,162, 42, 75,
+236, 21,203,249,217, 41, 74, 25,212, 76, 62, 19,155,205, 86,158,107,237,112, 69, 73,182,134, 24, 51, 67,140,168,170,161, 40, 75,
+226, 56,224,115,164,170,106, 84,134,177,223, 72, 38,135,110, 56, 95,175,153,133,204,230,244,156,243,245,134,251,119,110,242,215,
+127,249,115,116, 81,224, 94,251, 2, 62,121,170,166,224,195,207, 62,101, 28, 61,119,111,223,228,254,189,219, 92,172,183,156,173,
+ 54,104, 91,112,255,213,151,233,186, 45,199,207,207,216,172, 6, 82, 24,248,236,243, 19,108,140, 9,180, 28,124, 69, 49, 41,145,
+135,145,162, 40,201,104,140,211,252,197,179,196,223,122,121,193,175,158,109,249,228,164,135, 17,118, 42,216,245, 40,105, 79, 65,
+ 27,222,190,213,112,119,105,120,180,138,252,244,153,225,176,203, 20,206,146, 39,104,123,213, 1, 89, 20,150,114, 38, 38,158,110,
+ 19, 47, 45, 52,103,109,224,209, 69,224, 91,119, 44, 79,214,137,127,243,216,163,141,108, 86, 41, 38,238, 46, 12, 87,106,205,170,
+143,252,240,190,229, 95, 62,178,196, 73,141,111,173, 6, 4, 6, 97,130,213,173, 50,116,161, 99, 87,136, 16, 96,130, 89,157,192,
+140, 57,202,159,209, 18,191, 57,140, 3, 41, 38, 9,122, 49, 2, 71, 22,133, 52, 52,133,148, 40,157,196,179, 42, 37, 28,104, 74,
+242, 28,144,193, 85,133, 32, 23, 65,190, 6,128,168,233,165,168,165, 85, 6,165,224,208,151,212, 13, 60,233, 34,111, 41,232,146,
+165,106, 12, 23,189,192,151, 15, 47, 34,133,171,121,214,101,222, 70,177,246,162,176,127,116,186,226,119,239, 20,188,251,124, 75,
+196,240,233,185,229,141,171,134, 46, 25,254,163, 55, 10,254,201,175, 59, 81,207,193,101,210, 94, 81, 20,151, 10, 94,128,152,130,
+ 36,105,201,111, 67, 43,248,191,223, 59,226, 15,222,184,206, 55, 95,156,241,254, 81, 75, 76,153,170,169, 17, 5,184,165, 44, 69,
+ 88, 4, 96,245,174, 98, 86,134, 7, 77,230, 23,143, 54,252,193,151, 14,200, 28,240,139,199, 83,234,150, 43,248,224,176,229, 31,
+126,243, 5,172, 86,252,207, 63,126, 38,143,171, 44,249,103,239, 60,227, 15,223,188,205,149, 89,193,106, 76,252,228,137,199, 22,
+ 50,132,236,218,194,118, 66,171,161,235,249,175,127,255, 21,254,167, 31, 63,199,104,205,159,126,120,198, 15,190,120,133,239,125,
+233, 6,191,120, 36, 49,189,164,196,191,124,247,132,239,190,126,192, 31,188,121, 83, 2, 59,128,127,252,127,125, 34,209,183,141,
+192,151,110,226, 93,141,173,113,198, 16,156, 69, 66, 84, 18,170,220, 93, 47,162,172,206, 57,177, 90,201, 69,201,102, 55, 86,202,
+ 15,165, 36,144,100,231, 24,144, 3, 93,113,124,124,140,248,165, 21,203,253,125, 36, 58, 87,242,221, 33,139,189,113, 66,123, 98,
+ 20, 27,141, 86,242,243, 4, 56, 91, 82,213,210,237, 46,105, 94,137,217, 98, 65,223,247,114, 56,175, 86, 2,105, 23, 82,108,132,
+ 18,113, 85,142,137,186,169, 24, 71,113, 95, 40, 20,171,243,115, 92, 89, 80,150,194,135, 26, 99,233,186, 45,104, 51, 69,236, 38,
+156,179, 84,165, 12,113,179,153, 60,239, 90,203,115,148,147, 84,119,142,195,136,115, 5,179,102, 70, 24, 60, 62,250, 75,136,184,
+ 44, 74,129,159,157, 8, 89,199,224,153, 55, 53,125, 24, 5,214,118,226,170,168, 84,198, 88,241,254,251,161, 39, 89,177, 31,166,
+ 28, 25,123,137,123, 85,206,226,202, 18,149, 96,189, 93,177, 88, 44,216,180, 45,219,237,154,162, 40, 25,166,216, 83,101, 20,202,
+ 77,240,126,150,132, 70,101, 20, 77, 51,163,177, 53,193, 7, 6,111, 81, 8,146,150, 50, 12,109, 55, 57,102, 32,134,145, 97,144,
+215,175, 44, 29,206, 86,244,125, 71, 70,188,226,219,205,150,139,139, 21,243,197,140,224, 35,101, 51, 35,120, 17,112, 22,206,201,
+ 81,161, 53,218, 72, 76,246,102,122,124, 99, 28, 48, 38,147, 19,104, 43, 67, 2,136,237, 52,198,132, 50, 34, 76,148,115, 71,116,
+ 10, 33, 4, 80,134,186, 46, 25, 7, 77,215,182, 20,181, 68,188,230,156, 88,175,214,211,249,136, 36, 67, 14, 35, 49,100,234,122,
+134, 8, 24, 19,166,156,154, 15, 83, 20, 1,105,204, 68,173,217,108,215,148,101,141, 85, 89,138,109,178, 68, 86, 55,179, 70,212,
+252,126, 36, 90, 79, 93,213,244,163, 68, 48,215,179, 25,227, 40, 46,153,156,225, 98,189,146, 20,202,156, 89, 44,132,211,183, 90,
+226,187,215,235, 53, 34, 2,213,204,102, 66, 9,173,214,107, 78, 79, 79, 88,204,151,204,230, 51,138,186,132,152, 73, 89,244, 42,
+ 99, 28, 57, 59, 61,226,224,250,125,106,247, 50, 57, 42, 10, 74,116,123, 66,191, 57,196, 52, 55,185,249,242, 91, 28, 92,125,147,
+ 56,244,172,207, 62,102,243,244, 1, 55,246, 10,150,123, 11,246,155, 37,103,167, 71,156,157, 60,103, 86, 21, 20,213, 28,239,159,
+ 18,182, 37,231,195,154,245,249, 12,223,157,208, 92, 9, 83, 8, 82, 64, 37,113, 75,157, 30,159, 74, 84,178,147, 80, 26,109, 45,
+ 67,219,177,183,220, 67,208,184, 36, 3, 75, 12,204,103,115, 64, 74,200,230,243, 5,213,100, 81,221, 45, 27,219,173,124, 62,203,
+178,160, 31,123,206,207, 79,209,214, 82, 92,234, 67, 42,102,141, 19,202, 98, 18, 11,174,215, 27,198,126,192, 40,176, 69, 65,191,
+222,146, 99,135,118, 6,109, 44,154,132, 15,153,143, 31,159,176, 60,184,130,213,240,241,195,143,152,207,230,248, 35,184,255,242,
+ 29,110, 94,185,202,131,195, 39,148,206,145, 47, 34,123,117, 37,133, 94,193,147,148,226,230, 11,215, 56, 57, 60,165, 90,236,209,
+133, 17,117,227,165,151,243, 24, 36,213,136,105, 26,159,213,211,100, 17, 70, 22,243,134,174,107,177,206,241,253, 23, 11,158,110,
+ 34, 49, 6,148, 86, 24,227, 72, 49, 18, 98,224,171,183, 27,254,230, 73,199,195,139,192,160,170,233,141, 43, 91,128,181, 83,243,
+ 86,148,109,183, 48,194,241,161, 51,111, 94, 17,126,252,163,149, 37, 36,137, 93, 44,139,146,126,236,169,156,116,175,203, 68, 37,
+188,198,215,110,215,188,121, 77,243,108, 19,248,215, 79, 52,253,244, 65, 69,107,140,158, 26,151,166,240, 16,177, 23, 41,180, 50,
+196, 48,146,149, 18,248,202, 75, 50, 86,233, 10,146,206, 40,126,147,224,150,145,203, 90, 4, 31, 2,151,146, 51,214, 73,151, 58,
+211,175,203,223,171,167,225, 70,161, 53, 16, 37,104, 69,101,112,149, 67, 43, 65, 17,164,243, 91, 42, 81,181, 17,155,214,238,207,
+ 41,148,252,191, 36, 16,217, 14, 42, 26, 67,164,107,183,228, 12,195, 32,157,210,218,218, 75,107,159,179, 18, 6,179, 83,179,106,
+163,177, 88,178,202,108,219, 13,179,122,198,182,237, 80, 58,115,113,118, 78,140,114,160, 43, 5,101,237, 40, 92,197,208,247, 20,
+133, 28,178, 95,187,123,192,253, 43, 13,127,242,209,150,205,102,195, 78, 69, 46,155, 65, 35, 30,251,148,177,133,100,189,167, 20,
+ 64, 11, 39,105,148,136,201,178,151, 65, 44, 42,133,193, 76,147,124, 36,103,129, 46,125, 24,136, 99,164,158,207, 88,204,102,151,
+ 16,161, 32, 42, 82, 66,179, 94,173, 4, 57,209, 26, 63, 14, 52,243, 5,227,216, 51,108,101,155, 50,206,161,221,212,185,173,192,
+ 90, 39, 23,164, 15,236,124,169,222,123,129,216,149,153, 4,157, 6,235,204,255,215,212,185, 44, 57,146, 92,103,250,115,247,184,
+ 33, 2, 64, 34,171,216,205,238,166, 52, 50, 45, 40,141,141,233, 5,180,158,247,153,103,224,219,205, 86,102, 99, 54, 27,173,164,
+ 33,135,236, 98, 87, 86, 34, 1,196,197,175, 90,252, 30,104, 46,203, 44,179, 18,136,240,203, 57,255,249, 47,188,190,190,106, 70,
+185,174,204,243, 76,138, 34, 72,118,157, 98, 75,167,105, 34,231,204,251,251,187,222, 17,122, 71, 49,198, 10,207, 59, 90,235,196,
+144, 13, 1, 87,139,200, 84,164, 30, 72, 49,202, 27,190,100,186,110,224,112,232, 41,136,185,154,115,170,127, 51, 97, 44,136, 88,
+148, 72, 49,243,219, 31,190,231, 48, 78,124,253,250, 11,135,195,129, 28, 21,215,234,189,162, 83,115,140,207,181, 34,114,146,198,
+ 62,178, 11,181,245, 61, 0, 40, 6, 52,212,131,255,124,126,161,235, 26, 30,203,204,161,250,148,207,143, 7,195,112, 0, 83, 52,
+191,142, 81, 38, 74, 81, 22,164, 24,193,177, 41, 41,202,179,239,122, 74, 74,224, 12,166, 40,236,199,212, 61, 32,168, 74,136, 80,
+169,112,242, 62,143,191,126, 92,177, 69,251,191,237,218,218,181, 75, 34,181,203, 21,219,190,193, 25,153, 79,221, 31, 55,160,218,
+ 14, 59, 67,204, 50,202,161,160,130,203, 72, 71, 61, 77, 19, 20,184,207,119,216,215, 77,210,172,185,105, 6,141, 17,182,141,151,
+179,208,156,219,253, 74,223,138,111,144,129,156, 50,199,151, 35,141, 21,196, 92,128,211,254,179,215,107,221, 35,134,211,233,132,
+ 49,202,174, 31,122, 53, 59, 88,237,247,199,227, 70, 8, 34,217,198,148,216, 21, 52,214, 37,214, 85,126, 1,187,228,209, 88,203,
+ 52, 42,140, 38,133, 68,211,137, 88,233,183,149,174,111, 49, 78, 77,143,197, 62,125,222,115,145,134,122, 93, 87,166,227,137,224,
+ 21,109,188,219,241,166,156, 89,214,149,174,109,235,120, 16,114, 73,244, 93,203,252, 88, 16,143, 66,110,132,203,178,208,247, 3,
+203,242, 80,241,242,120,208, 87,247,186,199,227,129,181,150,105, 26,121,204, 66, 10,166, 73, 22,216, 49,104, 84, 82,138, 98,179,
+ 95, 78, 39, 0, 62,174, 31,132, 24,158,197,119, 41,165, 58,252, 9,217,108,154,134,190, 85,241,153, 73, 88,219,176, 5, 79,223,
+ 12,252,254, 95,254,149,235, 60,177,172,129,156, 86, 44,153,156, 35, 93,127, 33,185, 9,131,163,132, 27,113,125, 99,190,254, 39,
+ 54,222,232, 90,135,197, 50, 93, 62,131,129,243,229,147,172,174, 23,207,234,103,190,190,221, 88, 99,166,164,192,116, 50,204,239,
+127,101, 91,103, 5,216,196,200,241,120,228,246,184,113, 58,190,212, 2, 54,179,108, 1,103,149, 79,241,120, 60, 56, 12, 7,154,
+166,146, 21, 75,225,126,159, 57, 30,229, 47, 81, 12, 44,143, 5, 31, 87,230,251,194, 99,190,211,183,106,152,138, 19, 34,234,156,
+163,105,101, 33,220,181,213, 67,128,130, 69, 97, 99,195,120, 32, 39,221,135,228,204,253,126, 35,231,140,181,144,125,196,149,204,
+208, 56, 82,178,188,190, 76,124,250,116,225,183,223,125,230,118,191,241,229,151, 95, 72, 65,205,194,233,120,224, 47,127,253,133,
+ 63,127,249, 66,223,117,188,158, 95, 88,214,192,241,114,100, 89, 87,200,137,142,140, 57,126,247, 67, 41, 20,198,241,136,143,146,
+110, 12,135, 3, 41, 4, 94,206, 39, 40, 89,135, 37,134,206, 57,254,251,103, 25,103,236,115, 2,153, 36, 88,254,239,207, 43,133,
+150,143,251, 77,176, 88,237, 8, 93,133,242, 0,233,112, 83,196,162,142, 42,231, 44, 63,246, 82,248, 63, 95, 60,214,181,181, 75,
+ 20,241, 44,231, 12, 86, 11,199,100,170,230, 78,255,117, 6, 54,191, 9, 74,107, 44, 57,232,103, 73,114,167,138,169,106,101, 83,
+161, 24, 3, 70, 46, 96,214, 74,190,131,115,144, 18,166,105,100, 11,106, 1, 44, 37, 87,247,176, 40,102,172, 65,190,230, 41,213,
+ 9, 93, 17,228,215,182, 10,238,176, 77, 67,197, 9, 68,228,177,246,249,189,199,113,170, 4, 44, 29,182, 57,103, 78,117,115,148,
+ 82,184,221,110, 24,163, 3,224,120, 56,176,134, 80, 9, 58,154, 53,198, 36, 40, 52, 91, 91,159,153, 32,195,156, 50, 33,122, 82,
+144, 54,247,229,124,102,219, 86, 14,253,129,251,253,142, 49,133, 97, 16, 68,215,182, 13, 31,215, 43, 93,223,241,113,171, 29, 40,
+133,190, 85, 97,245,191,254,231,239, 41,165,112, 93, 35,255,251, 63,102,222, 86,185,215,125,123,127,167,228,204,186, 6,134,161,
+ 37, 70,121, 98,239, 36,192, 76,253,210,104,252,208, 58,135,109, 13,173, 83, 71,178,255,156, 15, 34,158,152,162,223, 9, 91,192,
+ 96,233,186,150, 97, 26,232,218,134,109,211,220, 91,114, 51,133,139,244,189,236,118,119,184, 95,107, 72,186,249,146, 11, 57,201,
+135,125, 24,196,158,166, 64, 12, 43, 52, 86,227, 15, 0, 84, 84,236,114,166,203,229,194,234, 87,186,166,161, 20, 93, 94,187,212,
+200,212, 2, 84,142,116, 15,166, 81,129, 28,126, 91, 73, 89,169,111, 33,120,218, 78,198, 32,165, 40,122,213,111, 27,198, 57,161,
+ 2, 64, 74,169,162, 71,178, 89,213,133,151,217,230,149,226,116,249,218,186,126,150,251, 3,156, 36,108,231,243,153,219,253,206,
+167,207,159,101,246,212,183, 52,214, 65, 42,164, 34,200,181, 32, 55,192, 16, 2, 77,245, 72, 88,183, 5,249, 10, 56,142,199,233,
+215,226,232,118, 99, 60,142,148, 92,176,182,193, 88,232,186,150, 28, 35,183,251, 93,114,180,146, 9, 62, 84,227,156,142, 98, 44,
+231,203, 11,100, 17,250,118,123,213,253,130,147,196,113,119,171,179, 28,167, 19,243,178,114,191,125,232, 29, 88,203, 79, 63,253,
+ 68,240,158,219,252, 96, 28,122, 12,213, 38, 24, 88,171, 94,127, 91,150,167,242,228,227,126,163,228,200,249,244, 66,211,200,156,
+197, 24, 56, 29, 79,234, 62,209,161,121,123,127,231,248,242,194,208, 75,239, 63,207,179,198, 17,206,242,243,151,159,235,186, 3,
+107, 13,198,128,117,150,177, 31,184, 94,175,140,211,132, 49,133, 20,147,236,115, 15, 7, 76, 35, 2, 98,223,247,228,162,200, 86,
+139,227,250,241, 78, 41, 5,103, 13,175,151, 87,156, 83, 10, 94, 8,190,206,229, 13,247, 90, 16, 58, 39,147,165,166, 21,217,112,
+ 24,250,234, 59,191, 39,204, 57,166,211, 72,168,169,140, 49, 74, 50,183,159,109,235,250,192,251,122, 65, 26,195,216,244,132,232,
+159, 69,122, 65, 69,200,178,136,112,152, 49,116, 53,110, 58,166, 68, 73,137,109,147,193,209, 22, 2, 14, 40,166, 48,223, 31, 88,
+ 35, 30,193,241,120,228,118,187,113, 58, 77, 60,101,201, 70, 68, 81, 16,162,103,173,197,135,136,247, 27, 37,107, 45, 29, 14, 7,
+214,117,227,124, 62,178, 46, 27,166, 49, 28,250, 94,146,196,176,255,237,138, 4, 26,199, 97, 24, 88,183, 25,231, 26, 46,151, 11,
+123, 78,128,143,129,184, 37,166,211, 68,223,141,252,246,167,223,243,246,245,157,235,199,131,214, 21,188, 95, 57,141, 61,166,157,
+216, 66, 33,196, 66,242, 55, 76,222, 56,182,134, 71, 94, 41, 94,151, 73, 74,133,182,111,121,185,124,230,187,239,127,228,114, 62,
+178,110,158, 63,253,199,191,179,249, 13, 72,252,252,245,207,213,246, 86,225, 64,253,161,231,113,127, 96,145,164,205, 89,199,235,
+229,162, 6, 41, 38,222,174,223,200, 49,241,250,250, 9,107, 91,214,117,195, 82, 8,193,115,121,125, 1, 11,223,190,126, 99, 89,
+ 36,229, 76, 69,161, 59,121, 71,132,178,198,196,141,117,188,124,190,112,232, 15,213,154, 89,196,220,161, 31, 48,141, 37, 70, 79,
+215,180,228,156,184, 94,175, 24,227,248,252,249, 19,239,223,174,196, 24,120,121,121, 33,250,133,235,219,149,109,126, 48, 90,205,
+250, 59,107,248,225,251,207, 24,211,242,221,111,190, 83,145,213, 21, 73,236,214,141,113,232,248,242,229,157,247,143, 25,215,203,
+140,202,117,199,211, 31,134, 67,245,250,118,191,206,254,114,154, 75, 0,236, 0, 0, 14, 85, 73, 68, 65, 84, 22, 73,101, 56, 28,
+ 40,177,208,245, 45,141,133, 55,239,120,219,224,109, 45,124, 93, 10, 95, 55,248,186,138, 21,171,217,180, 36, 26,174, 17, 27,216,
+ 88,121,104, 15, 67, 79,201,210,120, 90, 43,211,141,182,109,248,237,177,193, 88,195,219, 86,212, 9,185,218, 9, 85, 34, 70, 99,
+ 29,100, 93,102, 33, 40, 43, 58, 4,117, 48, 41, 41,204, 35,108,155, 14, 41, 35, 51, 14,221, 2,234, 38, 10,130, 57, 75,145,179,
+144,177,186,224,173, 83,134,182, 41,234,180, 98,204,184,162,207,208, 56, 17,128, 82,133,210,219,166,161, 27, 6,105,144,157,131,
+178,123, 98, 75, 34,100, 43,172,216, 84, 54,173,117, 13,227,216, 75,147,158,148, 61, 28, 98,228, 56, 77,164,148,116,153,120,165,
+166, 57,163,164, 48,219,182, 88,171, 88,201, 20, 21, 64,211, 15, 67,237,194, 42,177,171,173, 48,178,117, 24,168,210, 26, 43,205,
+ 42,114,222,218,163, 43,141,181,248,176,137,169,237, 28,185,232,162,239, 58,197,229,134,109,133,214,241,111,127,122,240,239, 55,
+248,183,255,252,198,219,125,101, 11, 91,237, 38, 13, 49,200, 68, 67, 27, 93, 78, 91, 41, 37,194,166,192,136, 84, 20, 56,145, 75,
+ 33, 91, 67,218, 60,177, 94,118,182,105, 72, 33,177,250, 72, 88,107,174,187, 53, 20,189, 26, 10,130,202,230,101,169,239, 84, 69,
+ 88,219, 52,140,195,128,179, 6,103, 45,174,105,158,157,157, 64, 19, 65,222,125, 63,208, 15, 74, 40,147,220,102, 3, 43,253,242,
+ 62,183,182, 86, 44,100,107, 12,231,151, 23,172,115, 88, 35,130,157,115, 82, 48,236, 57,215, 93,215, 17,163,100,141,165, 20,134,
+113,164, 31, 42,140,237, 28,203,166,196,179,156,228, 71,222,182,213,159, 60,137,161,189, 51,128,173,181,218, 51, 69,197,147,179,
+ 86,240,178, 83,128,198, 56,142,140,227, 81, 16,116,140, 80, 17,145,177,151, 60,204,214, 34, 41, 39,201,167,118, 31, 6, 31,148,
+217,190, 75,192, 66, 12,172,203, 10, 5, 14,227, 1,185,136,173,207, 98,168,237,123,158, 76,255,232, 73, 89,107,170,109, 91,172,
+ 51,248,109, 67,153, 15,158,176,220,201,214,241,242,114, 98,153, 85, 80, 96,228,255, 62,207,119,230,101,150, 12,172,238,163,125,
+127,133,160, 24,101, 99,149,170,120,185, 92,100,124,147,170, 75,151,209,200, 0,224,118,191, 97, 16,186,165,132, 64,153, 63,249,
+ 45, 80,138,138,221,143,143, 43,227, 65,115,255,219,227,174, 46,185,235,113,214, 62, 37, 90, 49,168, 0, 44, 69,172,101,231,108,
+101,139, 79,156,207, 39, 78,211,145,148, 19,227,112,224,126,187, 17, 83,100, 91, 87, 68,140,109,171, 30,220,203,142, 53,138,101,
+ 62, 12,154,183, 90,231,216,181,215,182,158, 67, 93,219,212, 51,171,118,161,125, 47, 83, 35,219, 16,147,162,165, 77, 41, 52,174,
+ 90,108, 35,168,125, 24, 6,134,161,197, 89,169, 99,230,249, 65, 74,153, 20,101, 98,212,180, 45, 77,211,161,160,155, 12,197,168,
+144,175, 72,200, 60, 43,128, 40,103,161, 83, 80, 83,242, 74, 86, 67,179, 44, 26, 13,244,125, 53,174,129,156, 18,201, 71,205,112,
+205,175,129, 69,216,204, 60,175,152, 44,164,100,183, 2, 14,245,243,110,222, 87,190,199, 64,202,137,195,112, 96, 89, 84,240,184,
+ 70, 81,211, 62,250,154,218, 87,221, 51, 77, 97, 89, 54, 17,249,166, 81, 49,189,141,171,151, 60,244,125, 53, 5, 10, 26,183, 62,
+230, 7,126, 91, 89,230, 15, 62,191,190,112, 24, 26,242,122,101, 58, 54,252,227, 63,254,158,151,227,145,134,141,184,124, 99,234,
+224,119, 63,126,162,111,224,242,233, 71,126,243,195,239, 56,159, 94, 57,191, 92,104,108,195,251,199, 27,215,183,191, 18,214,111,
+216,182,193, 53,142, 57,172, 92,223,127, 86,129, 82, 11,150,241,120, 20, 25,181,109,193, 89, 53, 22,130, 5,233,187,142,143,219,
+141,249,227,131, 12, 44,203, 42,187,221,117, 22,250,156, 19,167,227,132,171, 77,218,253, 49, 51, 28,122,134,190,231,244,162,248,
+234,105,154, 24,107,240, 86,206,138,252,117,141, 37, 38,101, 56,116,125, 75, 76,213,166,119,213,115, 63, 30, 71,188,247,202,238,
+200,114,149, 60,157,206, 52,206,226,218,142,195,113,226,112, 58,225, 14, 35, 25, 73,183,115,129,144, 19,203,250,160,235,122,254,
+252,243,149, 20, 3,247, 77,161, 75,197, 90,114,201,252,221,143,223, 97, 1,119,249,254,199, 63,108, 62,144,139,161,117,178, 22,
+117,206, 17, 99,168,139, 93, 78, 87, 90,124, 98,199,199, 20,185, 94,175, 44,243,242,180,159,116, 85, 30,211,181,186,164, 93, 61,
+232, 4, 21, 26,114, 12,148, 90,165,108,219,198,158,241,252,243, 45,240,229, 46, 2, 72,142, 9,191,110,132,117,227,241,184,211,
+181, 45,247,219, 77,225, 10,233, 87, 56,212, 53, 13, 6,158,255,127,219,138,237, 46, 59, 64,193,118, 33, 69, 74, 80, 55,130, 81,
+ 37,213,184,134,156, 10,228, 92,225, 76,232,134, 14, 76,133, 54, 75,193,123, 79,244, 98,189, 75, 71,106, 73,245,162,114,206,233,
+ 98,168,223,105,135, 31, 13,144, 75,161,107, 45,198,128,177,234,190,141,149,182, 31, 98, 45, 6,204, 51,133,203,236, 23,130,115,
+ 53,209, 39, 83, 74,169,217,220, 42,176,250,182,165, 24,165,146, 61,185, 0,126,171,159, 71,196,169,177, 31, 84,180, 36, 25,104,
+172,155,236, 85,187, 86,135, 97, 72,137, 61, 85,107,158,133, 56, 88, 11,109,127,224,245,242,153,166, 17, 19, 56,134,200,120,152,
+ 84,125, 71, 89, 23,182,174,193,135, 32,187,212,182,129, 10, 11, 82, 59, 11, 44, 66, 61,114,160,248, 72,113, 21, 42,110, 28,109,
+211,178, 6,205, 8,117, 12,169,170,133, 2, 57, 81,140,229,208,247,136,168, 25, 33, 6,166,227,137,174, 83, 14,253,182,109, 98,
+ 66,119,146, 8,165,160,153,110,206, 25,178,114,166, 91,215,224,154,134,214,233,239, 89, 39,164, 69,242,167, 68, 66,102, 64, 42,
+ 38,101, 54,130,129, 24,115,229, 6, 20,150, 69,134, 60,109,219, 19,146,103,143,206,237, 42, 74,163,215,108, 43,159, 64,204,211,
+221, 4, 37,212,103, 99,234, 59, 44, 73, 69, 79,223,245, 26,207, 88,171,184, 86,235, 48, 78,113,167, 77,227,120,220,111, 60,238,
+ 11, 44, 51, 63,252,195, 63,208,119, 29,183,199,131,195, 56,202,201, 46,139,251,112, 62,157,104,218,134,101,145,108,169,235,164,
+125,223,255, 70, 65,209,200, 26,233,236,126, 14, 26, 13,200, 12, 71,207,191, 0,166,136,227, 97,138,246, 2, 70,251,103, 11, 30,
+ 91,187,126,211, 88, 78,211, 9,139, 97, 89, 87,205,222,187,129,113,156, 24,250,142,182,235, 24,134, 3,195, 32, 45,115, 41, 50,
+211, 25, 70,133, 3,149,146,184,125,220,217, 54,197,199, 62,238, 15,117,189, 77,131, 41,202, 3,143, 41, 19,194,246,180,225, 61,
+158, 39,166,105,122,158, 11,235,178,208,238,103, 80,202,116,109,143,181,186, 40,183,117, 99,154, 70,142,167, 19, 25,217,202, 58,
+251,171,235,224,227, 33,253,127,215, 10, 37,137, 65, 54,205,135,218, 65, 7, 31,159, 69,154,126,215, 9, 58,143, 53,176, 38,122,
+134,126,160, 63, 40, 94,117, 31,185, 24, 91, 45, 84,123,249, 93,128, 56, 8,206, 58,186, 65,114, 57, 80, 19, 65, 46,228,146, 53,
+106,171, 29,251, 60,207, 28,143, 39,196,167,200,245,188,145,108, 87, 94, 3,253, 19,113, 10, 73,242,170,182,147,174,189,237,187,
+103,184, 76,211, 72,102,107, 10,250,187,219, 90, 17, 26,101,189, 15,117,239,104,238, 46, 68, 39, 4,153, 44, 57, 35, 37,205, 90,
+141,144,140, 1,138, 70,122,187,220, 19, 35, 52,199, 86, 94,128,102,199, 10,144, 26, 15, 35,141,211,216,171,152,140, 53,130,254,
+ 99, 82, 64,140, 69, 60,152,182,239,100,156,211,171, 9,218,145,193, 29,201,241,219,194,199,253,141,199,253,157,152, 55,110,183,
+ 27, 95,190,252,127, 92,107, 25,198,145, 79,159, 63,209, 52,150,191,252,242, 51, 95, 31, 55,126,249,229, 47,124,251,250, 23, 66,
+ 88,176, 46, 97, 27,195,229,101,162,233, 45,239,183, 27, 95,223,190,176,172, 55, 82,146,225, 23, 6,154, 78,170,131, 16, 35,253,
+208,211, 54,202, 85,232, 91,237,203,152, 18, 33, 5,250,182,231, 48,141,116, 93,199,230,245, 92, 82, 86,110, 65, 73,137,166, 21,
+129, 52,198,192,182,174,248,202,187,242, 81, 77, 64,215,201,188,167,109, 91,188,223,248,120,255, 70,223,117,156,166, 19,125,171,
+166,102, 60, 28,104,156,101, 24, 58,160, 54, 54,165, 84,196, 90,118,199, 33,101,230,135,252, 6,188,247, 76,199,145,166,237,104,
+186,129,225,116,226,254,113, 35,230, 82,243, 17,116,201, 59,219,211,119, 35,215,249, 70,235, 12, 63,255,245, 23,166,227,133,109,
+ 91,113, 47,223,255,248, 7, 57,156,117,228,168, 44,244,117,173,241,141, 93,139,179,130,178,223,222,222,184,221,239, 60,150, 71,
+ 13,217, 16,252,233, 58, 17,124,230,121, 37,248, 21,103, 84,101,110,155,242,150,173,181,220,110, 31,210, 83, 86,167,178,174,211,
+124,249,126,251,224,126,127,176, 60, 30, 44,243,194,253,118,103, 89, 87,124,237, 94, 98, 12, 90, 68, 41,226,183,149,213,123,214,
+ 69,129, 31,222,111,132, 77, 22,169, 49,200, 30,116, 79,210,218,115,160,155, 70, 7,105, 73, 69,164,146,248, 43, 31, 96,223,132,
+ 5,109, 66,101, 25, 43,184,230, 48,142,130,229,114,126, 22, 10,198, 90,138,217, 97,215,204, 26,106, 20,167,113,244,125, 87,253,
+154, 97,119,125,235,219,166, 30, 8,170, 14,151,213, 51,175, 51, 32,111,237, 20,117, 8,199,156,235,115, 73,114, 50, 74, 74,134,
+ 75, 69,197, 1, 69,240, 78, 74,117,131,230,252,236,152, 74,206, 28, 70, 5,162,228,148, 43, 36, 46, 84,165,100, 88,183, 77,135,
+124, 74, 52, 77, 67, 8,137,203,249,194,203,229,149,113, 60,210,182,114,123,123,204,218,132,166, 49, 4,191,103, 0,151,170,185,
+149, 17, 79, 14,158, 28, 2,164, 4,109,207, 48, 42,104,194,182, 45,182,237,200, 70,159,149, 92,112,109, 71, 65, 5, 82, 49, 64,
+ 54, 80,231,163, 56,205,128, 89, 61, 49, 40, 60,133,146,161,177, 4, 31,136, 89,208,125,204, 42,114,214,109,211, 12,175,190, 3,
+ 99,170,225,135,181, 80, 10,214, 64, 49,242,172, 95,231,133,152,180, 41,149,165,221, 67,222,173, 94,115, 37, 17,106, 46, 90, 12,
+ 21,154, 54,164, 36,149,128,113,114,253,243,222,179,109, 1,191,121,252,186,214,185,105,199,186,137,141, 28, 99,124, 34, 11, 77,
+167,142,100,215, 84,191,156, 79,196, 20,249,238,251,239,105, 92,203,227, 33,217,143,116,217, 74, 6, 11, 33,210,118, 45, 63,253,
+253,223,243,250,242,194,199,253,131,199,227, 78, 41,242,242,126,125,125,149,182, 27,139,223,212, 81,205,243, 90, 71, 0,210,190,
+ 55, 77, 3, 89, 29, 69,140,241,121,241, 77,211,164,207,234, 61,109,211,171,219,236,196,198,246,161, 34, 90, 22,114,142,204,143,
+153,243,233,196,233,116, 36,132,192, 52,158, 53,175,221, 86,198, 65,243,215,195,225,128, 12,118, 60, 22,199,178,173, 42,168, 27,
+185,117,197, 16,153,231,149,233, 48,242,237,253,157,157, 43,242,250,233,149,105,156, 24, 58, 57,157,133, 32, 91,228, 67,223,211,
+246, 67,157, 75,110,108, 62, 48, 77, 71,198,241,192,245,237, 27,185, 20,124, 8,213,105, 49, 35, 47,117,234,243, 81, 55,218, 15,
+ 42, 6,215,154,233,222,247,154,225,150, 82,240,171,244,238,174,145, 82, 67,207,197, 85,223, 1,217, 77,203,234,183,199, 26, 87,
+ 3, 95, 84, 20, 72,153,163, 56,103, 17, 12,103,233,182, 87,253, 13,191,122, 66,148, 78, 60,166, 68, 88,189, 46,211,126,160,237,
+123, 89,179, 30, 6,173, 63, 12, 57,203,153,176,235, 53, 98,108,218,134, 82, 34, 49,232, 82,177, 70,196, 68, 53, 81, 25, 87,207,
+171,190, 23,186, 33, 55, 52, 95, 81, 39,131,175,141,144,173, 78,132,109,219,114,156, 38,168,251, 68,231, 25, 76,135, 3,185,228,
+218,177,235,140,235,251,254,201,145,136, 81,159, 11,224, 56,141,164,146,113,141, 5, 99,241, 91, 96,173, 69,132,247, 10, 67,105,
+219,150, 82, 52,142,212, 25,147,159, 5,110, 74,137,121,153, 89,182,141,105, 26,240, 94,239, 52, 6,241, 66,250,174, 37,149,204,
+186,120,250,182,161, 96,160,128, 53,106,200,114,146, 83,223,252,184, 19,194,131,247,111, 95,184, 47, 55, 98, 86,198,196,222,233,
+ 90, 7, 49, 4,238,243, 85,163, 65,178,194,113,234,103,185,221, 62,104,218, 22,231,148, 61,225,156, 35, 4, 89,102, 27,148,159,
+225,189, 66,114, 54, 95,209,185,190,211,217, 90,132, 32, 31,143, 19,206,137, 67, 19,162,103,243, 43, 33,200, 35,192, 53, 78, 72,
+216,208, 85,142, 19,207,177, 18, 69, 41,151,125,219,242,152, 31, 56,167,188,136,224,149,218,121,191,127,232,188,136,158, 63,254,
+241,143, 88, 7,183,235, 13,239,229,172,249,254,237, 27,165, 20,250, 65, 89, 24,146,160,194,219,219, 27,215,143, 43,247,109,227,
+177,109, 92,223,110, 60,230,141,227, 73, 5,224,247,151,223,112,156,206,252,240,119,255,141,247,247,159, 25,134, 35,175,175, 47,
+152,223,253,243,191, 20, 31,163, 14,199,176, 34,182,185, 94,160,115,174,194, 52,234, 92,247,185,114,219,245,200,192, 64,241,163,
+198, 88,193,247, 20,117,102,251, 97,153,179,190,115,209,194,181, 86,222,237,187,103,242, 14,111, 83, 15, 88,138,230,243,227, 56,
+ 62,103, 61, 90, 67, 50,218,223,188, 32, 95,193,110,142,169, 74,126,118,184,101,247,163, 7,205, 54, 37, 61, 82, 48, 68, 83, 97,
+ 36, 5,124, 8, 42,205,200,199, 56,231,244,132,181,247,177,131, 49,210, 42,215, 47,240,156, 33, 27,163,136,208, 93,251,188,207,
+ 71,157,115, 28, 90,145,132,156, 83,103, 29, 83,212,198, 12,129,130, 56, 4, 24, 65,144, 57,103, 74,209,124,117, 39,231, 52,141,
+171,135,162,125, 62,235, 92,132, 18,236, 14, 90,214,212, 72, 80,171,120, 70, 91,225, 71, 87,165,125,185, 84,183, 35,239,107,199,
+104,201,185, 16,124,100,183,218,220,181,142,165, 20, 48, 72,118,101, 45, 49,249,231, 37,190, 27, 85,144,249, 21,122,173, 29, 52,
+ 70,227,139,156,210,254, 80, 32, 86, 34,136,145,102,118,239,168,169,143,144,156,117,153,215,191,185,255, 44, 24,200, 9,156,197,
+ 97,235,179, 55,207,239, 92,114,214, 5,221,117,207, 78, 61, 86, 84,102,127,102,214,238,207, 77,197, 90,168,240,172,115,246,137,
+ 14, 88,107,159,105, 91,114, 54, 43, 44,181,208,244, 65, 7,135, 14,221,106,247,234,132,236,148, 82,234,103,214,102,223,201, 64,
+133, 95,215,117, 65,235,162,169,235,117, 28, 39,140, 81,250, 82,215,117,148,162, 2,213,135, 80,139, 43,143, 41,226,174, 12,131,
+ 14,194,231,165,239,181, 94, 40,242,209,110,187,246,185, 86,114,206,207,207,178, 67,253, 77,163,247,158,234,158,205, 41,129, 49,
+132, 24, 52,175,173,151,122,206, 10,121,113,214,214,247,184,178,199,156,182,173,186,174,166,105, 89,183,141,130,144,138,191,253,
+190,206, 57,141, 85,156,123,118,166, 49,166,231, 90, 10, 81,240,235,186, 44,250, 59, 78,221,178,247,190, 34, 30,242,115,104,154,
+ 61, 28, 70,228,196,117,219, 80,112, 11, 60, 30, 31, 40, 77,108,224, 56, 29,217,188, 7, 3,195,112, 16,127,193,235,121, 30, 14,
+242,203,240,126,211,231,202,185, 34, 52,186, 36, 49,144, 99, 82,126,189,179,236,138, 13,191,249,231,165,222, 52, 13,235,186,233,
+146,161,214,163,200, 10, 89,223,175, 60,247, 96,211,234,236, 96,127,207, 77,163,243, 33, 43, 74,245,111, 57, 25, 79,206, 73,150,
+ 99,221,254, 12,158,163,153,122, 62,237,159,197, 57,117,252,185, 72, 29,241, 92, 83, 73,255, 86,193,102,159,255,151,173,231,148,
+181, 42,148,172,173, 99,186,253,247,202,126,193,107,125,238, 13, 76, 74, 21,246,119,226,164,236,200, 96, 41, 26,163, 56, 39,223,
+121,235,246,179, 73,104, 86,170, 4, 47, 21,173,242,127,119,127,115,126,165, 84,131,147,172, 65,241,221,133,189,112, 62,159, 78,
+ 66, 88, 42,111,160,212,223,169, 15, 82,223,209, 24,160,136,107,208,183,207, 98,232,215,187, 34, 60,247,246,190,206,246, 34,251,
+112,144,186, 37,132,192,237,118, 35,214,130,107,127, 7,122,206, 58,175,196,187, 41,245, 60, 77, 20, 74,109,202, 76, 29,231,100,
+ 40, 26,191,197, 20, 1,233,245, 47,151, 11, 6, 83,173,177,245,220,212,152,118,156, 95,206,116,173, 60, 49,230,121,230,118,251,
+ 38,121,120, 41,132, 53,114,122, 57,113, 58,159,105,219,230,185,222,150,117,225,118,191,107,189, 88,141,199, 98, 76, 24, 99, 57,
+157,206, 79,238,140,223, 60, 95,191,126, 85, 99, 75,169, 5, 80,196, 22, 56,247, 3,253, 48,240,195,231, 11, 5,195,208, 31,193,
+194, 63,253,143,127,226,255,253,233, 79,252, 23, 41,188,202,126,100,132,236,135, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
};
diff --git a/source/blender/editors/datafiles/startup.blend.c b/source/blender/editors/datafiles/startup.blend.c
index ef2fd052dea..3ad353f21bf 100644
--- a/source/blender/editors/datafiles/startup.blend.c
+++ b/source/blender/editors/datafiles/startup.blend.c
@@ -1,1148 +1,957 @@
/* DataToC output of file <startup_blend> */
-int datatoc_startup_blend_size= 409636;
+int datatoc_startup_blend_size= 363524;
char datatoc_startup_blend[]= {
66, 76, 69, 78,
- 68, 69, 82, 45,118, 50, 53, 54, 82, 69, 78, 68, 32, 0, 0, 0, 16,108,245, 96,255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 71, 76, 79, 66, 32, 1, 0, 0, 32,107,245, 96,255,127, 0, 0,196, 0, 0, 0, 1, 0, 0, 0, 32, 32, 32, 48, 0, 0, 0, 0,
-250, 0, 0, 0, 1, 0, 0, 1,104, 15,253, 2, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 16, 0, 0,128, 32, 4, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 47,114,111,111,116, 47,117,110,116,105,116,108,101,100, 46, 98,108,101,110,100, 0, 0, 0, 0,
-168,217,206, 0, 0, 0, 0, 0, 40, 0, 0, 0, 48, 0, 0, 0, 80,108,245, 96, 32, 0, 0, 0, 16,108,245, 96,255,127, 0, 0,
-104, 93,115, 4, 0, 0, 0, 0,240,122,245, 96,255,127, 0, 0, 56,135,206, 4, 0, 0, 0, 0,240,107,245, 96,255,127, 0, 0,
- 32,220,206, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 16,108,245, 96,255,127, 0, 0, 32, 0, 0, 0, 82, 69, 78, 68,
-104, 93,115, 4, 0, 0, 0, 0, 82, 69, 78, 68, 32, 0, 0, 0, 16,108,245, 96,255,127, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 5, 0, 0, 0, 5, 0, 0, 0, 64,108,245, 96,255,127, 0, 0, 9,235,206, 0, 0, 0, 0, 0,248, 56,252, 2, 0, 0, 0, 0,
-104, 93,115, 4, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-104, 93,115, 4, 0, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,128,108,245, 96,255,127, 0, 0, 87, 77, 0, 0, 24, 1, 0, 0,
- 24, 61,252, 2, 0, 0, 0, 0,102, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 87,105,110, 77, 97,110, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,104, 23,198, 4, 0, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0,
-120, 62,252, 2, 0, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,131,240, 2, 0, 0, 0, 0,
- 56,131,240, 2, 0, 0, 0, 0, 56,131,240, 2, 0, 0, 0, 0, 40,132,240, 2, 0, 0, 0, 0, 40,132,240, 2, 0, 0, 0, 0,
- 40,132,240, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,120, 62,252, 2, 0, 0, 0, 0,103, 1, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,132,240, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-104, 15,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,129, 7, 28, 0,126, 7, 4, 4, 0, 0, 0, 0, 1, 0,238, 3,
- 0, 0, 1, 0, 0, 0, 0, 0, 56,238, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 72, 19, 14, 3, 0, 0, 0, 0,216,104,218, 4, 0, 0, 0, 0,216,104,218, 4, 0, 0, 0, 0,
-136,239, 13, 3, 0, 0, 0, 0,136,219, 13, 3, 0, 0, 0, 0, 24,221, 13, 3, 0, 0, 0, 0, 24,221, 13, 3, 0, 0, 0, 0,
- 88,240, 13, 3, 0, 0, 0, 0,184, 43, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 78, 0, 0,208, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 65,110,105,109, 97,116,
-105,111,110, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-200, 64,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0,168, 72,252, 2, 0, 0, 0, 0,232, 84,252, 2, 0, 0, 0, 0,
- 88, 85,252, 2, 0, 0, 0, 0,184,153,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200, 64,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
- 56, 65,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0, 56, 65,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0,
-200, 64,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-168, 65,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0, 56, 65,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-248, 66,252, 2, 0, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0,
-136, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-104, 67,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 44, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-184, 68,252, 2, 0, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,220, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0,
- 72, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,220, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
- 40, 69,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,132, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 44, 6,132, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-120, 70,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2,132, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0,
- 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-232, 70,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-160, 2,140, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
- 56, 72,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,100, 3, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-200, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,100, 3, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-168, 72,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24, 73,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 56, 65,252, 2, 0, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 24, 73,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136, 73,252, 2, 0, 0, 0, 0,168, 72,252, 2, 0, 0, 0, 0,
- 56, 65,252, 2, 0, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-136, 73,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248, 73,252, 2, 0, 0, 0, 0, 24, 73,252, 2, 0, 0, 0, 0,
-168, 65,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-248, 73,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104, 74,252, 2, 0, 0, 0, 0,136, 73,252, 2, 0, 0, 0, 0,
-136, 66,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-104, 74,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216, 74,252, 2, 0, 0, 0, 0,248, 73,252, 2, 0, 0, 0, 0,
-200, 64,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-216, 74,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72, 75,252, 2, 0, 0, 0, 0,104, 74,252, 2, 0, 0, 0, 0,
- 24, 66,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 72, 75,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184, 75,252, 2, 0, 0, 0, 0,216, 74,252, 2, 0, 0, 0, 0,
-248, 66,252, 2, 0, 0, 0, 0,216, 67,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-184, 75,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40, 76,252, 2, 0, 0, 0, 0, 72, 75,252, 2, 0, 0, 0, 0,
-104, 67,252, 2, 0, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 40, 76,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152, 76,252, 2, 0, 0, 0, 0,184, 75,252, 2, 0, 0, 0, 0,
- 24, 66,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-152, 76,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8, 77,252, 2, 0, 0, 0, 0, 40, 76,252, 2, 0, 0, 0, 0,
- 72, 68,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 8, 77,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120, 77,252, 2, 0, 0, 0, 0,152, 76,252, 2, 0, 0, 0, 0,
-200, 64,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-120, 77,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232, 77,252, 2, 0, 0, 0, 0, 8, 77,252, 2, 0, 0, 0, 0,
-216, 67,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-232, 77,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88, 78,252, 2, 0, 0, 0, 0,120, 77,252, 2, 0, 0, 0, 0,
-104, 67,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 88, 78,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200, 78,252, 2, 0, 0, 0, 0,232, 77,252, 2, 0, 0, 0, 0,
- 40, 69,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-200, 78,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56, 79,252, 2, 0, 0, 0, 0, 88, 78,252, 2, 0, 0, 0, 0,
- 40, 69,252, 2, 0, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 56, 79,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168, 79,252, 2, 0, 0, 0, 0,200, 78,252, 2, 0, 0, 0, 0,
-152, 69,252, 2, 0, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-168, 79,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24, 80,252, 2, 0, 0, 0, 0, 56, 79,252, 2, 0, 0, 0, 0,
-136, 66,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 24, 80,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136, 80,252, 2, 0, 0, 0, 0,168, 79,252, 2, 0, 0, 0, 0,
-216, 67,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-136, 80,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248, 80,252, 2, 0, 0, 0, 0, 24, 80,252, 2, 0, 0, 0, 0,
- 8, 70,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-248, 80,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104, 81,252, 2, 0, 0, 0, 0,136, 80,252, 2, 0, 0, 0, 0,
- 40, 69,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-104, 81,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216, 81,252, 2, 0, 0, 0, 0,248, 80,252, 2, 0, 0, 0, 0,
- 8, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-216, 81,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72, 82,252, 2, 0, 0, 0, 0,104, 81,252, 2, 0, 0, 0, 0,
-232, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 72, 82,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184, 82,252, 2, 0, 0, 0, 0,216, 81,252, 2, 0, 0, 0, 0,
- 72, 68,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-184, 82,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40, 83,252, 2, 0, 0, 0, 0, 72, 82,252, 2, 0, 0, 0, 0,
-216, 67,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 40, 83,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152, 83,252, 2, 0, 0, 0, 0,184, 82,252, 2, 0, 0, 0, 0,
-248, 66,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-152, 83,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8, 84,252, 2, 0, 0, 0, 0, 40, 83,252, 2, 0, 0, 0, 0,
-184, 68,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 8, 84,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120, 84,252, 2, 0, 0, 0, 0,152, 83,252, 2, 0, 0, 0, 0,
-200, 71,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-120, 84,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232, 84,252, 2, 0, 0, 0, 0, 8, 84,252, 2, 0, 0, 0, 0,
-136, 66,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-232, 84,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120, 84,252, 2, 0, 0, 0, 0,
-120, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
- 88, 85,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40, 89,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-136, 66,252, 2, 0, 0, 0, 0, 56, 65,252, 2, 0, 0, 0, 0,168, 65,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,162,252, 2, 0, 0, 0, 0,200,162,252, 2, 0, 0, 0, 0,
- 72, 86,252, 2, 0, 0, 0, 0,184, 87,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72, 86,252, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,184, 87,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184, 87,252, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 86,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69,
- 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0,
- 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
- 18, 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,128, 63, 0, 0,128, 63,
- 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 40, 89,252, 2, 0, 0, 0, 0,
-194, 0, 0, 0, 1, 0, 0, 0,184,113,252, 2, 0, 0, 0, 0, 88, 85,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0,
- 72, 68,252, 2, 0, 0, 0, 0,184, 68,252, 2, 0, 0, 0, 0, 24, 66,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 45, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,219, 1, 0, 0, 4, 4, 74, 1,220, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,120,112,252, 2, 0, 0, 0, 0,120,112,252, 2, 0, 0, 0, 0, 24, 90,252, 2, 0, 0, 0, 0,
-136, 91,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24, 90,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-136, 91,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0,
- 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0, 74, 1, 31, 0, 74, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 45, 6, 0, 0,118, 7, 0, 0,189, 1, 0, 0,219, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 74, 1, 31, 0, 0, 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, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 91,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 24, 90,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 67, 0,128, 86,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 1,128,156, 67, 2,128,222,195, 0, 0, 0, 0, 57, 1, 0, 0, 74, 1, 0, 0, 0, 0, 0, 0,188, 1, 0, 0,
- 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 0, 0,188, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 4, 6, 0, 74, 1,189, 1, 57, 1,189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 45, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,188, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 74, 1,189, 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,248, 92,252, 2, 0, 0, 0, 0,
-216,110,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248, 92,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
-152, 94,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,220,255, 57, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-152, 94,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 56, 96,252, 2, 0, 0, 0, 0,248, 92,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114,
+ 68, 69, 82, 95, 86, 50, 53, 54, 82, 69, 78, 68, 0, 0, 0, 32,191,255,231,240, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
+ 0, 0, 0,250, 83, 99,101,110,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66,
+ 0, 0, 1, 24,191,255,230,232, 0, 0, 0,196, 0, 0, 0, 1, 32, 32, 32, 54, 0, 6, 0, 0, 0,250, 0, 0, 0, 1, 1, 0,
+ 4,212, 43, 0, 2,152,190, 32, 0, 0, 16, 0, 0, 4, 32,128, 0, 0,140,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 0, 0, 0,168, 4,211,175,144, 0, 0, 1,103, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 77, 87,105,110, 77, 97,110, 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, 4,211,176,208, 4,211,176,208, 4,211,176,208, 4,211,176,208,
+ 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 60,106,112, 10, 60,106,112,
+ 0, 0, 0, 16, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 4,218,173, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,209, 39,160, 4,209, 39,160, 4,209, 39,160, 4,209, 40, 96, 4,218,173, 32,
+ 4,209, 40, 96, 68, 65, 84, 65, 0, 0, 0,148, 4,211,176,208, 0, 0, 1,104, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,209, 48, 16, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 43, 0, 0, 0, 0, 0,115, 99,114,101,101,110, 0, 0, 0, 0, 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, 96, 7,128, 4,128, 0, 0, 0, 0,
+ 0, 1, 3,238, 0, 0, 0, 0, 0, 1, 0, 0, 4,209,122, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
+ 4,217, 22, 16, 10, 60,118,160, 10, 60,118,160, 4,217,193,112, 4,217, 28,192, 4,217,192,128, 4,217,192,128, 10, 60, 48, 32,
+ 9,182,206, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, 0,148, 4,211,177,144, 0, 0, 0,190, 0, 0, 0, 1,
+ 4,211,245,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 65,110,105,109, 97,116,105,111,110, 0, 46, 48, 48, 49,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,211,176, 96, 4,211,182, 80, 4,211,182,144,
+ 4,211,189,144, 4,211,189,208, 4,211,241,144, 0, 0, 0, 0, 0, 0, 0, 0, 2,152,190, 32, 0, 0, 0, 0, 0, 0, 0, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,176, 96,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,211,178, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,211,178, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,211,178,144, 4,211,176, 96, 0, 0, 0, 0, 0, 0, 4, 97,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,178,144, 0, 0, 0,191, 0, 0, 0, 1, 4,211,178,208, 4,211,178, 80,
+ 0, 0, 0, 0, 7,118, 4, 97, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,178,208, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,211,179, 16, 4,211,178,144, 0, 0, 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,179, 16,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,211,179, 80, 4,211,178,208, 0, 0, 0, 0, 0, 0, 4, 70, 0, 0, 0, 1, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,211,179, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,211,179,144, 4,211,179, 16, 0, 0, 0, 0, 7,118, 4, 70,
+ 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,179,144, 0, 0, 0,191, 0, 0, 0, 1, 4,211,179,208, 4,211,179, 80,
+ 0, 0, 0, 0, 6, 44, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,179,208, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,211,180, 16, 4,211,179,144, 0, 0, 0, 0, 6, 44, 4, 70, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,180, 16,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,211,180, 80, 4,211,179,208, 0, 0, 0, 0, 6, 44, 1,220, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,211,180, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,211,180,144, 4,211,180, 16, 0, 0, 0, 0, 7,118, 1,220,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,180,144, 0, 0, 0,191, 0, 0, 0, 1, 4,211,180,208, 4,211,180, 80,
+ 0, 0, 0, 0, 0, 0, 0,132, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,180,208, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,211,181, 16, 4,211,180,144, 0, 0, 0, 0, 6, 44, 0,132, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,181, 16,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,211,181, 80, 4,211,180,208, 0, 0, 0, 0, 2,160, 0,132, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,211,181, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,211,181,144, 4,211,181, 16, 0, 0, 0, 0, 2,160, 4, 70,
+ 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,181,144, 0, 0, 0,191, 0, 0, 0, 1, 4,211,181,208, 4,211,181, 80,
+ 0, 0, 0, 0, 0, 0, 1,140, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,181,208, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,211,182, 16, 4,211,181,144, 0, 0, 0, 0, 2,160, 1,140, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,182, 16,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,211,182, 80, 4,211,181,208, 0, 0, 0, 0, 6, 44, 3,100, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,211,182, 80, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,182, 16, 0, 0, 0, 0, 7,118, 3,100,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,182,144, 0, 0, 0,192, 0, 0, 0, 1, 4,211,182,208, 0, 0, 0, 0,
+ 4,211,178, 80, 4,211,178,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,182,208, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,211,183, 16, 4,211,182,144, 4,211,178, 80, 4,211,179, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,211,183, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,211,183, 80, 4,211,182,208, 4,211,178,144, 4,211,179, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,183, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,211,183,144,
+ 4,211,183, 16, 4,211,179, 16, 4,211,179, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,183,144,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,211,183,208, 4,211,183, 80, 4,211,176, 96, 4,211,179,144, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,211,183,208, 0, 0, 0,192, 0, 0, 0, 1, 4,211,184, 16, 4,211,183,144, 4,211,178,208,
+ 4,211,179,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,184, 16, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,211,184, 80, 4,211,183,208, 4,211,179, 80, 4,211,179,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,211,184, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,211,184,144, 4,211,184, 16, 4,211,179,144, 4,211,180, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,184,144, 0, 0, 0,192, 0, 0, 0, 1, 4,211,184,208, 4,211,184, 80,
+ 4,211,178,208, 4,211,180, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,184,208, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,211,185, 16, 4,211,184,144, 4,211,180, 16, 4,211,180, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,211,185, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,211,185, 80, 4,211,184,208, 4,211,176, 96, 4,211,180,144,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,185, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,211,185,144,
+ 4,211,185, 16, 4,211,179,208, 4,211,180,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,185,144,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,211,185,208, 4,211,185, 80, 4,211,179,144, 4,211,180,208, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,211,185,208, 0, 0, 0,192, 0, 0, 0, 1, 4,211,186, 16, 4,211,185,144, 4,211,180,144,
+ 4,211,180,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,186, 16, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,211,186, 80, 4,211,185,208, 4,211,180,144, 4,211,181, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,211,186, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,211,186,144, 4,211,186, 16, 4,211,180,208, 4,211,181, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,186,144, 0, 0, 0,192, 0, 0, 0, 1, 4,211,186,208, 4,211,186, 80,
+ 4,211,179, 16, 4,211,181, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,186,208, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,211,187, 16, 4,211,186,144, 4,211,179,208, 4,211,181, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,211,187, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,211,187, 80, 4,211,186,208, 4,211,181, 16, 4,211,181, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,187, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,211,187,144,
+ 4,211,187, 16, 4,211,180,144, 4,211,181,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,187,144,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,211,187,208, 4,211,187, 80, 4,211,181, 16, 4,211,181,208, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,211,187,208, 0, 0, 0,192, 0, 0, 0, 1, 4,211,188, 16, 4,211,187,144, 4,211,181,144,
+ 4,211,181,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,188, 16, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,211,188, 80, 4,211,187,208, 4,211,180, 16, 4,211,182, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,211,188, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,211,188,144, 4,211,188, 16, 4,211,179,208, 4,211,182, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,188,144, 0, 0, 0,192, 0, 0, 0, 1, 4,211,188,208, 4,211,188, 80,
+ 4,211,179, 80, 4,211,182, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,188,208, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,211,189, 16, 4,211,188,144, 4,211,180, 80, 4,211,182, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,211,189, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,211,189, 80, 4,211,188,208, 4,211,182, 16, 4,211,182, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,189, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,211,189,144,
+ 4,211,189, 16, 4,211,179, 16, 4,211,181,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,189,144,
+ 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,189, 80, 4,211,181, 80, 4,211,181,208, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 96, 4,211,189,208, 0, 0, 0,194, 0, 0, 0, 1, 4,211,192,160, 0, 0, 0, 0, 4,211,179, 16,
+ 4,211,178, 80, 4,211,178,144, 4,211,179, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 4, 71, 0, 0, 4, 97,
+ 7, 7, 7,119, 0, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 4,211,245,144, 4,211,245,144, 4,211,190, 96,
+ 4,211,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,190, 96,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,211,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 68,148, 32, 0, 0, 0, 0, 0, 65,208, 0, 0,
+ 0, 0, 0, 0, 68,238,224, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 0, 25,
+ 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3,
+ 0, 4, 4, 12, 0, 10, 7,119, 0, 26, 7,119, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 7,118, 0, 0, 4, 71, 0, 0, 4, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,119, 0, 26,
+ 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,211,191,128, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,190, 96, 0, 0, 0, 0,
+ 69,109,240, 0,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,109,255,255,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,112,
+ 0, 0, 7,129, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7,111, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0,
+ 0, 0, 7,111, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 2, 0, 0, 0, 1, 3, 3, 0, 2, 4, 0, 0, 10, 7,129, 0, 2, 7,112, 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, 4, 97, 0, 0, 4, 97, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,211,192,160, 0, 0, 0,194, 0, 0, 0, 1,
+ 4,211,213,176, 4,211,189,208, 4,211,179,144, 4,211,180, 16, 4,211,180, 80, 4,211,178,208, 0, 0, 0, 0, 0, 0, 6, 45,
+ 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 1,219, 4, 4, 1, 74, 1,220, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,211,212,176, 4,211,212,176, 4,211,193, 48, 4,211,194, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,211,193, 48, 0, 0, 0,195, 0, 0, 0, 1, 4,211,194, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67,160, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 67,165, 0, 0, 0, 0, 0, 0, 65,248, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 73, 0, 0, 0, 0, 0, 0, 0, 30, 67,137,128, 0, 65,200, 0, 0, 67,137,128, 0, 65,200, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1, 74, 0, 31, 1, 74, 0, 31, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 45, 0, 0, 7,118, 0, 0, 1,189, 0, 0, 1,219, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 74, 0, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,194, 80, 0, 0, 0,195, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,211,193, 48, 0, 0, 0, 0, 67,165, 0, 0,196, 86,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,156,128, 1,
+195,222,128, 2, 0, 0, 0, 0, 0, 0, 1, 57, 0, 0, 1, 74, 0, 0, 0, 0, 0, 0, 1,188, 0, 0, 0, 0, 0, 0, 1, 62,
+ 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1, 56, 0, 0, 0, 0, 0, 0, 1,188, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 1, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 1, 74,
+ 1,189, 1, 57, 1,189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 45, 0, 0, 7,118, 0, 0, 0, 0,
+ 0, 0, 1,188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 74, 1,189, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,211,195,112, 4,211,211, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,211,195,112, 0, 0, 0,193, 0, 0, 0, 1, 4,211,196,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84,
+ 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84,
+ 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,
+101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,220,
+ 1, 57, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,211,196,224, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,211,198, 80, 4,211,195,112, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 57, 1, 61, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56, 96,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
-216, 97,252, 2, 0, 0, 0, 0,152, 94,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,135, 1, 57, 0, 61, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,111,255, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-216, 97,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,120, 99,252, 2, 0, 0, 0, 0, 56, 96,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
-105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 57, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,211,198, 80, 0, 0, 0,193, 0, 0, 0, 1, 4,211,199,192, 4,211,196,224, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,120, 99,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
- 24,101,252, 2, 0, 0, 0, 0,216, 97,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,255,111, 1, 57, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 58,254, 57, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,211,199,192,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,211,201, 48, 4,211,198, 80, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,
+110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,140, 1, 57, 0,203,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
- 24,101,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,184,102,252, 2, 0, 0, 0, 0,120, 99,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110,
- 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110,
- 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,
-111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 57, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,211,201, 48, 0, 0, 0,193, 0, 0, 0, 1, 4,211,202,160,
+ 4,211,199,192, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,
+110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,
+110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 58, 1, 57, 0, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,184,102,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
- 88,104,252, 2, 0, 0, 0, 0, 24,101,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,211,202,160, 0, 0, 0,193, 0, 0, 0, 1, 4,211,204, 16, 4,211,201, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,164,253, 57, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,254, 34, 1, 57, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
- 88,104,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,248,105,252, 2, 0, 0, 0, 0,184,102,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,211,204, 16, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,211,205,128, 4,211,202,160, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104,
+ 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104,
+ 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,164, 1, 57, 0,102, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253, 57, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,211,205,128, 0, 0, 0,193, 0, 0, 0, 1, 4,211,206,240, 4,211,204, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,248,105,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
-152,107,252, 2, 0, 0, 0, 0, 88,104,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 10, 1, 57, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,242,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,211,206,240, 0, 0, 0,193, 0, 0, 0, 1, 4,211,208, 96, 4,211,205,128, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,
+111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,242,
+ 1, 57, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-152,107,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 56,109,252, 2, 0, 0, 0, 0,248,105,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,211,208, 96, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,211,209,208, 4,211,206,240, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,
114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,
114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 56,109,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
-216,110,252, 2, 0, 0, 0, 0,152,107,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,194,252, 57, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-216,110,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,109,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 57, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,120,112,252, 2, 0, 0, 0, 0,159, 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,
- 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
-184,113,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,168,118,252, 2, 0, 0, 0, 0, 40, 89,252, 2, 0, 0, 0, 0,
-200, 64,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0,104, 67,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0,131, 0, 0, 0, 15, 15, 44, 6,132, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,117,252, 2, 0, 0, 0, 0,136,117,252, 2, 0, 0, 0, 0,
-168,114,252, 2, 0, 0, 0, 0, 24,116,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,114,252, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 24,116,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,116,252, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,114,252, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67,
- 0, 0, 0, 0, 0, 0, 72, 66,112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0,
- 18, 0, 0, 0,105, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65,
- 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 44, 6,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 26, 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,136,117,252, 2, 0, 0, 0, 0,
-170, 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, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0,168,118,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,104,125,252, 2, 0, 0, 0, 0,
-184,113,252, 2, 0, 0, 0, 0, 72, 68,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0,
-184, 68,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 99, 3, 0, 0,
- 3, 3, 74, 1,135, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,122,252, 2, 0, 0, 0, 0,
-120,122,252, 2, 0, 0, 0, 0,152,119,252, 2, 0, 0, 0, 0, 8,121,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-152,119,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 8,121,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 74, 1, 26, 0, 74, 1, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0, 74, 3, 0, 0, 99, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1, 26, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 8,121,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,119,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,156, 67, 0,128,173,195, 0, 0, 0, 0,
- 57, 1, 0, 0, 74, 1, 0, 0, 18, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0, 56, 1, 0, 0, 18, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 74, 1,109, 1, 57, 1, 91, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,118, 7, 0, 0,221, 1, 0, 0, 73, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 1,109, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0,
-120,122,252, 2, 0, 0, 0, 0,163, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,218, 1, 57, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,211,209,208, 0, 0, 0,193, 0, 0, 0, 1, 4,211,211, 64, 4,211,208, 96, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,216,123,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 16, 0, 0, 0,216,123,252, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0,
- 14, 0, 0, 0, 14, 0, 0, 0, 56,124,252, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 56,124,252, 2, 0, 0, 0, 0,
-216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,
-232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,
-232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
-232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
-232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,
-232,190,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,104,125,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
-200,138,252, 2, 0, 0, 0, 0,168,118,252, 2, 0, 0, 0, 0, 8, 70,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,
-216, 67,252, 2, 0, 0, 0, 0,152, 69,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
-133, 0, 0, 0, 69, 4, 0, 0, 1, 1,139, 3,193, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 56,137,252, 2, 0, 0, 0, 0, 56,137,252, 2, 0, 0, 0, 0, 88,126,252, 2, 0, 0, 0, 0, 24,132,252, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 88,126,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,127,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 98, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,138, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65,
- 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,139, 3,
- 26, 0,139, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
-133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,252,194, 1, 57, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,200,127,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 56,129,252, 2, 0, 0, 0, 0,
- 88,126,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,
-255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,
- 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0,161, 2, 0, 0,
-159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,167, 3, 0, 0, 5, 0,
- 3, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 56,129,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,168,130,252, 2, 0, 0, 0, 0,
-200,127,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67,
- 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,
-120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
-159, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0,
- 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,168,130,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 24,132,252, 2, 0, 0, 0, 0,
- 56,129,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 96,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,
- 0,128, 96,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,147, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,
-148, 3,163, 0,130, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 43, 6, 0, 0,
-159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
- 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 24,132,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-168,130,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161, 2, 0, 0, 43, 6, 0, 0,
-159, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139, 3,167, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,133,252, 2, 0, 0, 0, 0,
- 68, 65, 84, 65,104, 3, 0, 0,136,133,252, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,107, 82,144, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,
-184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63,
- 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,
-176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190,
- 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64, 0, 0,128, 63, 89,180,236, 62,209,249,224,190,
- 48,180, 81,191,184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 63,
-138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65,211, 48,186, 62, 11, 16, 79, 63,
-144,199, 64,188, 0, 0,135,180,163, 15,188,190,102, 75, 53, 62,223,125, 81, 63, 0, 0,104, 51,207,107,117,194, 81,204,216, 65,
- 40,156, 5,194,136,247,159,192,121, 62,114, 66,214,253,213,193, 94,225, 3, 66,236, 7,160, 64, 68,239,209, 62, 51,177,205,190,
-184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63,
- 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193, 0, 0,128, 63, 89,180,236, 62,209,249,224,190,
- 48,180, 81,191,184,158, 81,191, 65,158,131, 63,142,225, 88, 62, 26, 63,185, 62, 35, 44,185, 62, 38, 11,117,188,207,156,122, 63,
-138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 9,185,108, 65,214,211,111, 65, 99,181, 12, 64, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 99,181, 12, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 92, 62, 55, 63, 56,186,224,190,
-237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 14, 43, 0, 59, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 30, 33, 12, 66, 85,152,137, 66,116, 27,126, 66, 0, 0, 0, 0,
- 68, 65, 84, 65, 72, 1, 0, 0, 56,137,252, 2, 0, 0, 0, 0,154, 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, 1, 0, 0, 0, 51, 51, 51, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63,
- 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0,200,138,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40,147,252, 2, 0, 0, 0, 0,
-104,125,252, 2, 0, 0, 0, 0, 40, 69,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0, 88, 71,252, 2, 0, 0, 0, 0,
- 8, 70,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,133, 0, 0, 0,139, 1, 0, 0,
- 2, 2,160, 2, 7, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,145,252, 2, 0, 0, 0, 0,
-120,145,252, 2, 0, 0, 0, 0,184,139,252, 2, 0, 0, 0, 0, 8,144,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-184,139,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 40,141,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128,100, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 40, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,159, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 2, 26, 0,160, 2, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,133, 0, 0, 0,158, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 40,141,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,152,142,252, 2, 0, 0, 0, 0,184,139,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0, 91,195, 0, 0, 0, 0,
-200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0,237, 0,200, 0,219, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0,237, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-152,142,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 8,144,252, 2, 0, 0, 0, 0, 40,141,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,211,211, 64,
+ 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,209,208, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 8,144,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,142,252, 2, 0, 0, 0, 0,
- 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 16,193, 0, 0, 32, 65,
- 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 18, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 18, 0, 0, 0,198, 1, 0, 0, 18, 0, 0, 0,236, 0, 0, 0,111, 18,131, 58,111, 18,131, 58, 0,124,146, 72, 0, 80, 67, 71,
- 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0,159, 2, 0, 0,159, 0, 0, 0,139, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 1,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,170, 1, 57, 0, 0,
+ 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
-120,145,252, 2, 0, 0, 0, 0,158, 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, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 4,211,212,176, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,146,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,184,146,252, 2, 0, 0, 0, 0, 16, 1, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,255, 0, 0, 0,160, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,211,213,176,
+ 0, 0, 0,194, 0, 0, 0, 1, 4,211,217,112, 4,211,192,160, 4,211,176, 96, 4,211,180,144, 4,211,180,208, 4,211,179,144,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 43, 0, 0, 0, 0, 0, 0, 0,131, 15, 15, 6, 44, 0,132, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,211,216,128, 4,211,216,128, 4,211,214, 64, 4,211,215, 96, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,214, 64, 0, 0, 0,195, 0, 0, 0, 1, 4,211,215, 96,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68,137,160, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,197,128, 0, 0, 0, 0, 0,
+ 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 43, 0, 0, 0, 0, 0, 0, 0, 25, 68,202,224, 0, 65,200, 0, 0, 68,202,224, 0,
+ 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 6, 44, 0, 26, 6, 44,
+ 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 43, 0, 0, 0, 0, 0, 0, 0, 25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 44, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0, 40,147,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,184,153,252, 2, 0, 0, 0, 0,
-200,138,252, 2, 0, 0, 0, 0,232, 70,252, 2, 0, 0, 0, 0,136, 66,252, 2, 0, 0, 0, 0,120, 70,252, 2, 0, 0, 0, 0,
- 88, 71,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,141, 1, 0, 0, 69, 4, 0, 0,
- 12, 12,160, 2,185, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,152,252, 2, 0, 0, 0, 0,
-104,152,252, 2, 0, 0, 0, 0, 24,148,252, 2, 0, 0, 0, 0,248,150,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 24,148,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,136,149,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,106, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 40, 68, 0, 0, 0, 0, 0, 0,208, 65,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,215, 96,
+ 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,214, 64,192, 64, 0, 0, 67,126, 0, 0, 0, 0, 0, 0, 66, 72, 0, 0,
+192, 17,189,112, 67,125, 70,246, 0, 0, 0, 0, 66, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 43, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 6, 43, 0, 0, 0, 18, 0, 0, 0,105,
+ 63,128, 0, 0, 66, 72, 0, 0, 72,146,124, 0, 66, 72, 0, 0, 61,204,204,205, 65, 32, 0, 0, 0, 72, 0, 0, 0, 0, 2, 0,
+ 0, 4, 4, 0, 0, 8, 6, 44, 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6, 43, 0, 0, 0, 26, 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 44, 0,106,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,159, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65, 0,192,103, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,160, 2, 26, 0,160, 2, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 2, 0, 0,141, 1, 0, 0,166, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,188, 4,211,216,128, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-136,149,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,248,150,252, 2, 0, 0, 0, 0, 24,148,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 55, 67, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 64, 35,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 8, 4, 0, 0, 2, 0, 3, 3, 0, 0, 2, 4, 6, 0,200, 0,159, 2,200, 0,141, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,167, 1, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0,159, 2, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-248,150,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,149,252, 2, 0, 0, 0, 0,
- 0, 0, 32,193, 0, 0,104, 68, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 32,193, 0, 0,104, 68, 0, 64, 35,196, 0, 0, 0, 0,
-199, 1, 0, 0,216, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,198, 1, 0, 0, 18, 0, 0, 0,158, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,146, 72, 0, 64, 28, 70,
- 10,215, 35, 60, 0, 0, 72, 66, 74, 0, 0, 0, 0, 0, 0, 2, 0, 0, 2, 4, 4, 0,216, 1,159, 2, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0, 0, 0,159, 2, 0, 0,167, 1, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 1,159, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 68, 65, 84, 65, 0, 0, 0, 96, 4,211,217,112, 0, 0, 0,194,
+ 0, 0, 0, 1, 4,211,222,112, 4,211,213,176, 4,211,180, 16, 4,211,182, 16, 4,211,182, 80, 4,211,180, 80, 0, 0, 0, 0,
+ 0, 0, 6, 45, 0, 0, 7,118, 0, 0, 1,221, 0, 0, 3, 99, 3, 3, 1, 74, 1,135, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,211,220, 64, 4,211,220, 64, 4,211,218, 0, 4,211,219, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,218, 0, 0, 0, 0,195, 0, 0, 0, 1, 4,211,219, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67,244,128, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 67,165, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 1, 0, 0,
-104,152,252, 2, 0, 0, 0, 0, 17, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 73, 0, 0, 0, 0, 0, 0, 0, 25, 67, 66, 0, 0, 65,200, 0, 0, 67, 66, 0, 0, 65,200, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1, 74, 0, 26, 1, 74, 0, 26, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 45, 0, 0, 7,118, 0, 0, 3, 74, 0, 0, 3, 99, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 74, 0, 26, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,219, 32, 0, 0, 0,195,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,211,218, 0, 0, 0, 0, 0, 67,131,128, 0,194,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67,156,128, 0,195,173,128, 0, 0, 0, 0, 0, 0, 0, 1, 57, 0, 0, 1, 74, 0, 0, 0, 18, 0, 0, 1,108, 0, 0, 0, 0,
+ 0, 0, 1, 56, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1, 56, 0, 0, 0, 18, 0, 0, 1,108, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 6, 18, 0, 0, 0, 2, 3, 3, 0, 0, 4, 0,
+ 0, 6, 1, 74, 1,109, 1, 57, 1, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 45, 0, 0, 7,118,
+ 0, 0, 1,221, 0, 0, 3, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 74, 1,109, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0,244, 4,211,220, 64, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,211,221, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 0, 0, 0, 12, 4,211,221, 96, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14,
+ 4,211,221,160, 68, 65, 84, 65, 0, 0, 0,168, 4,211,221,160, 0, 0, 0,216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 1,
+ 2,152,190, 32, 0, 19, 0, 0, 0, 1, 0, 1, 2,152,190, 32, 0, 20, 0, 0, 0, 1, 0, 1, 2,152,190, 32, 0, 21, 0, 1,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,120,240, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,202, 32,
+ 0, 0, 0, 0, 0, 1, 0, 1, 4,213,128,192, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,214, 32, 0, 0, 0, 0, 0, 1, 0, 1,
+ 4,213,127, 16, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,208, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,117,128, 0, 0, 0, 0,
+ 0, 1, 0, 1, 2,152,196, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,116,240, 0, 21, 0, 0, 0, 1, 0, 1, 2,152,190, 32,
+ 68, 65, 84, 65, 0, 0, 0, 96, 4,211,222,112, 0, 0, 0,194, 0, 0, 0, 1, 4,211,229,208, 4,211,217,112, 4,211,181, 16,
+ 4,211,181, 80, 4,211,179,208, 4,211,180,208, 0, 0, 0, 0, 0, 0, 2,161, 0, 0, 6, 43, 0, 0, 0,133, 0, 0, 4, 69,
+ 1, 1, 3,139, 3,193, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,211,228,160, 4,211,228,160, 4,211,223, 0,
+ 4,211,227,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,223, 0,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,211,224, 32, 0, 0, 0, 0, 0, 0, 0, 0, 68,117, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
+ 0, 0, 0, 0, 68, 98,192, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,138, 0, 0, 0, 0, 0, 0, 0, 25,
+ 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3,
+ 0, 4, 4, 12, 0, 10, 3,139, 0, 26, 3,139, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,161,
+ 0, 0, 6, 43, 0, 0, 0,133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,139, 0, 26,
+ 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,211,224, 32, 0, 0, 0,195, 0, 0, 0, 1, 4,211,225, 64, 4,211,223, 0, 0, 0, 0, 0,
+ 67, 15, 0, 0,196, 70, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 15, 0, 0,196, 70,127,255, 0, 0, 0, 0, 0, 0, 0,143,
+ 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 3, 43, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0,
+ 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 3, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 64, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 3, 44, 0,143, 3, 26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,161, 0, 0, 2,161, 0, 0, 0,159, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3,167, 0, 0, 0, 5, 0, 3, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,225, 64, 0, 0, 0,195, 0, 0, 0, 1,
+ 4,211,226, 96, 4,211,224, 32, 0, 0, 0, 0, 67, 16, 0, 0,194,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 16,102,231,
+194,206, 0, 0, 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142,
+ 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 0,160,
+ 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,161, 0, 0, 6, 43, 0, 0, 0,159,
+ 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,211,226, 96, 0, 0, 0,195, 0, 0, 0, 1, 4,211,227,128, 4,211,225, 64, 0, 0, 0, 0, 67, 35, 0, 0,196, 96,128, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 35, 0, 0,196, 96,128, 0, 0, 0, 0, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18,
+ 0, 0, 3,147, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18,
+ 0, 0, 3,147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 10, 0, 0,
+ 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 3,148, 0,163, 3,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6, 43, 0, 0, 6, 43, 0, 0, 0,159, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,227,128, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,226, 96,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,161, 0, 0, 6, 43, 0, 0, 0,159, 0, 0, 4, 69, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,139, 3,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,152, 86, 32, 68, 65, 84, 65, 0, 0, 3, 68, 2,152, 86, 32, 0, 0, 0,153,
+ 0, 0, 0, 1, 63,144, 82,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,140, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 13, 28,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 76,215, 74,
+ 0, 0, 0, 0, 62,209,239, 68,190,205,177, 51, 63, 81,158,184, 0, 0, 0, 0, 63,105,119, 70, 62, 70, 74,143,190,185, 44, 35,
+ 0, 0, 0, 0,188, 89, 84,162, 63,101, 33,166, 62,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193,111,211,214,
+ 63,128, 0, 0, 62,209,239, 69, 63,105,119, 70,188, 89, 84,176, 0, 0, 0, 0,190,205,177, 53, 62, 70, 74,142, 63,101, 33,166,
+ 0, 0, 0, 0, 63, 81,158,185,190,185, 44, 35, 62,228, 61, 43, 0, 0, 0, 0, 65, 68, 96,164,192,173,121,111, 64,213,209,248,
+ 63,128, 0, 0, 62,236,180, 89,190,224,249,209,191, 81,180, 48,191, 81,158,184, 63,131,158, 65, 62, 88,225,142, 62,185, 63, 26,
+ 62,185, 44, 35,188,117, 11, 38, 63,122,156,207,190,228, 84,138,190,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0, 65,108,185, 9,
+ 65,111,211,214, 62,186, 48,211, 63, 79, 16, 11,188, 64,199,144,180,135, 0, 0,190,188, 15,163, 62, 53, 75,102, 63, 81,125,223,
+ 51,104, 0, 0,194,117,107,207, 65,216,204, 81,194, 5,156, 40,192,159,247,136, 66,114, 62,121,193,213,253,214, 66, 3,225, 94,
+ 64,160, 7,236, 62,209,239, 68,190,205,177, 51, 63, 81,158,184, 0, 0, 0, 0, 63,105,119, 70, 62, 70, 74,143,190,185, 44, 35,
+ 0, 0, 0, 0,188, 89, 84,162, 63,101, 33,166, 62,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193,111,211,214,
+ 63,128, 0, 0, 62,236,180, 89,190,224,249,209,191, 81,180, 48,191, 81,158,184, 63,131,158, 65, 62, 88,225,142, 62,185, 63, 26,
+ 62,185, 44, 35,188,117, 11, 38, 63,122,156,207,190,228, 84,138,190,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0, 65,108,185, 9,
+ 65,111,211,214, 64, 12,181, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 12,181, 99, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 12,181, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63, 55, 62, 92,190,224,186, 56,190,148,203,237,190,234,236, 3, 65,111,211,214, 65,111,211,214, 0, 0, 0, 0,
+ 0, 0, 0, 0, 59, 0, 43, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 66, 12, 33, 30, 66,137,152, 85,
+ 66,126, 27,116, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 0, 4,211,228,160, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 0, 1, 0, 7, 2,152,196, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 8, 8, 0, 0, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 61,204,204,205, 67,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 96, 4,211,229,208, 0, 0, 0,194, 0, 0, 0, 1, 4,211,236, 96, 4,211,222,112, 4,211,180,144, 4,211,181,144,
+ 4,211,181,208, 4,211,181, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,159, 0, 0, 0,133, 0, 0, 1,139, 2, 2, 2,160,
+ 1, 7, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,211,234,224, 4,211,234,224, 4,211,230, 96, 4,211,233,192,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,230, 96, 0, 0, 0,195,
+ 0, 0, 0, 1, 4,211,231,128, 0, 0, 0, 0, 0, 0, 0, 0, 68,100,128, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0,
+ 68, 40, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,159, 0, 0, 0, 0, 0, 0, 0, 25, 68,103,192, 0,
+ 65,200, 0, 0, 68,103,192, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12,
+ 0, 10, 2,160, 0, 26, 2,160, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,159,
+ 0, 0, 0,133, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,160, 0, 26, 0, 0, 0, 1,
+ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0,248, 4,211,231,128, 0, 0, 0,195, 0, 0, 0, 1, 4,211,232,160, 4,211,230, 96, 0, 0, 0, 0, 67, 72, 0, 0,
+193,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 72, 0, 0,195, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0, 0, 0,217,
+ 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199,
+ 0, 0, 0, 18, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 6, 10, 0, 0, 0, 2, 3, 3, 0, 0, 4, 0, 0, 6, 0,217, 0,237, 0,200, 0,219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,159, 0, 0, 1,139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,217, 0,237, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,232,160, 0, 0, 0,195, 0, 0, 0, 1, 4,211,233,192,
+ 4,211,231,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 2, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,153,252, 2, 0, 0, 0, 0,
-194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,147,252, 2, 0, 0, 0, 0,200, 71,252, 2, 0, 0, 0, 0,
-216, 67,252, 2, 0, 0, 0, 0,248, 66,252, 2, 0, 0, 0, 0, 56, 72,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0, 1, 1, 74, 1,225, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 56,161,252, 2, 0, 0, 0, 0, 56,161,252, 2, 0, 0, 0, 0,168,154,252, 2, 0, 0, 0, 0,
- 24,156,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,154,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 24,156,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0,165, 67, 0, 0, 0, 64, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0,
- 0,128,164, 67, 0, 0,200, 65, 0,128,164, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 0, 10, 0, 74, 1, 24, 0, 74, 1, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0,101, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,159, 0, 0, 2,159, 0, 0, 0,159, 0, 0, 1,139,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 68, 65, 84, 65, 40, 1, 0, 0, 24,156,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,168,154,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,233,192,
+ 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,232,160,193, 16, 0, 0, 67,130, 0, 0,192,160, 0, 0, 64,160, 0, 0,
+ 0, 0, 0, 0, 67,122, 0, 0,193, 16, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,236,
+ 0, 0, 0, 18, 0, 0, 1,198, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 1,198, 0, 0, 0, 18, 0, 0, 0,236,
+ 58,131, 18,111, 58,131, 18,111, 72,146,124, 0, 71, 67, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4, 0, 0, 0, 1,199, 0,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217,
+ 0, 0, 2,159, 0, 0, 0,159, 0, 0, 1,139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,199, 0,237,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,208, 4,211,234,224, 0, 0, 0,158, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 45, 6, 0, 0,118, 7, 0, 0,101, 3, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 74, 1,225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-136,157,252, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,136,157,252, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,
- 24,255, 13, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 66, 80, 64, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0,
-221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
-191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63,
-223,149, 47, 63, 55, 70, 58, 63,192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, 56, 53,101, 63, 0, 0, 0, 0,
- 7,165, 39, 63,150, 84, 28,191, 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63,
- 3,201,194, 63, 34, 49,132,191,244,250, 39,191, 8,165, 39,191,143,164,206, 63,124, 38,130, 63,180,164, 28, 63,149, 84, 28, 63,
-179,153,196,188, 42,119, 58, 64, 8,108,228,190, 50,247,227,190, 82, 21, 64,191,204,230,156,191,216, 49, 49, 65,152, 9, 52, 65,
-231, 70,158, 62, 23,234,167, 62,128,206,159,187, 0, 0,168,180, 59,189,199,189,147,167,196, 61,206,223,140, 62, 0, 0,248, 51,
-211,120, 21,194,145, 5, 2, 66, 10,136,213,193,193,214,159,192,219, 38, 19, 66,197,173,255,193,158,101,210, 65,173, 40,160, 64,
-221,149, 47, 63, 85,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
-191, 56, 49,188, 54, 53,101, 63, 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63,
- 3,201,194, 63, 34, 49,132,191,244,250, 39,191, 8,165, 39,191,143,164,206, 63,124, 38,130, 63,180,164, 28, 63,149, 84, 28, 63,
-179,153,196,188, 42,119, 58, 64, 8,108,228,190, 50,247,227,190, 82, 21, 64,191,204,230,156,191,216, 49, 49, 65,152, 9, 52, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-241, 22, 72, 63, 78,162,246,190, 44, 8, 90,190, 3, 35,171,190, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-202, 4, 51, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 56,161,252, 2, 0, 0, 0, 0,154, 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,
- 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 0, 0, 0, 0, 0,
- 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,
-104, 15,253, 2, 0, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 82, 67,111,109,112,111,115,105,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0,152,170,252, 2, 0, 0, 0, 0,
-200,179,252, 2, 0, 0, 0, 0, 56,180,252, 2, 0, 0, 0, 0, 40,232,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
- 88,165,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0,
-232,164,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-200,165,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
- 24,167,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0,
-168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-136,167,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24, 6, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-216,168,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,
-104,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
- 72,169,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,152,170,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,171,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 8,171,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,171,252, 2, 0, 0, 0, 0,
-152,170,252, 2, 0, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,120,171,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,171,252, 2, 0, 0, 0, 0,
- 8,171,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,232,171,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,172,252, 2, 0, 0, 0, 0,
-120,171,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 88,172,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,172,252, 2, 0, 0, 0, 0,
-232,171,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,200,172,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,173,252, 2, 0, 0, 0, 0,
- 88,172,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 56,173,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,173,252, 2, 0, 0, 0, 0,
-200,172,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,168,173,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,174,252, 2, 0, 0, 0, 0,
- 56,173,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 24,174,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,174,252, 2, 0, 0, 0, 0,
-168,173,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,136,174,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,174,252, 2, 0, 0, 0, 0,
- 24,174,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,248,174,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,175,252, 2, 0, 0, 0, 0,
-136,174,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,104,175,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,175,252, 2, 0, 0, 0, 0,
-248,174,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,216,175,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,176,252, 2, 0, 0, 0, 0,
-104,175,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 72,176,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,176,252, 2, 0, 0, 0, 0,
-216,175,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,184,176,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,177,252, 2, 0, 0, 0, 0,
- 72,176,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 40,177,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,177,252, 2, 0, 0, 0, 0,
-184,176,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,152,177,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,178,252, 2, 0, 0, 0, 0,
- 40,177,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 8,178,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,178,252, 2, 0, 0, 0, 0,
-152,177,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,120,178,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,178,252, 2, 0, 0, 0, 0,
- 8,178,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,232,178,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,179,252, 2, 0, 0, 0, 0,
-120,178,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 88,179,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,179,252, 2, 0, 0, 0, 0,
-232,178,252, 2, 0, 0, 0, 0,216,168,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,200,179,252, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 88,179,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0, 56,180,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 8,184,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,232,164,252, 2, 0, 0, 0, 0, 88,165,252, 2, 0, 0, 0, 0,
-168,166,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0,
- 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 14,253, 2, 0, 0, 0, 0,
-216, 14,253, 2, 0, 0, 0, 0, 40,181,252, 2, 0, 0, 0, 0,152,182,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 40,181,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,152,182,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-152,182,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,181,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
-112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,111, 7, 0, 0, 18, 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,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
- 8,184,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,248,188,252, 2, 0, 0, 0, 0, 56,180,252, 2, 0, 0, 0, 0,
- 40,170,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,136,167,252, 2, 0, 0, 0, 0,200,165,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15, 94, 1,100, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,187,252, 2, 0, 0, 0, 0,216,187,252, 2, 0, 0, 0, 0,
-248,184,252, 2, 0, 0, 0, 0,104,186,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,184,252, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,104,186,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,110, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0,128,161, 67, 0, 64, 40, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 26, 0, 94, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,186,252, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248,184,252, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67,
- 0, 0, 0, 0, 0, 0, 72, 66, 50, 51, 74,193,154,209,131, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0,
- 18, 0, 0, 0, 73, 0, 0, 0, 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65,
- 72, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 4, 8, 0, 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,216,187,252, 2, 0, 0, 0, 0,
-170, 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, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0,248,188,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,136,213,252, 2, 0, 0, 0, 0,
- 8,184,252, 2, 0, 0, 0, 0, 24,167,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,168,166,252, 2, 0, 0, 0, 0,
-136,167,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 69, 4, 0, 0,
- 4, 4, 94, 1,225, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,212,252, 2, 0, 0, 0, 0,
- 72,212,252, 2, 0, 0, 0, 0,232,189,252, 2, 0, 0, 0, 0, 88,191,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-232,189,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 88,191,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, 0, 0, 0, 0, 0, 0,248, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 31, 0, 94, 1, 31, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 39, 4, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 88,191,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,189,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128,174, 67, 0, 64,112,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67,254,127,112,196, 0, 0, 0, 0,
- 77, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0, 0, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,193, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 94, 1,194, 3, 77, 1,194, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 38, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,194, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,200,192,252, 2, 0, 0, 0, 0,168,210,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-200,192,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,194,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,
-120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,
-120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,211,235,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 88, 4,211,235,224, 0, 0, 1, 16, 0, 0, 0, 1, 2,152,190, 32, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,194,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
- 8,196,252, 2, 0, 0, 0, 0,200,192,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,211,236, 96, 0, 0, 0,194,
+ 0, 0, 0, 1, 4,211,241,144, 4,211,229,208, 4,211,181,144, 4,211,179, 16, 4,211,181, 80, 4,211,181,208, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2,159, 0, 0, 1,141, 0, 0, 4, 69, 12, 12, 2,160, 2,185, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,211,240, 80, 4,211,240, 80, 4,211,236,240, 4,211,239, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,236,240, 0, 0, 0,195, 0, 0, 0, 1, 4,211,238, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68,106, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68, 40, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 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,159, 0, 0, 0, 0, 0, 0, 0, 25, 68,103,192, 0, 65,200, 0, 0, 68,103,192, 0, 65,200, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 2,160, 0, 26, 2,160, 0, 26, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,159, 0, 0, 1,141, 0, 0, 1,166, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,160, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,135,255, 76, 1, 61, 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, 68, 65, 84, 65, 0, 0, 0,248, 4,211,238, 16, 0, 0, 0,195,
+ 0, 0, 0, 1, 4,211,239, 48, 4,211,236,240, 0, 0, 0, 0, 67, 55, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 72, 0, 0,196, 35, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 2,158, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 4, 8, 0, 0, 0, 2, 3, 3, 0, 0, 4, 2,
+ 0, 6, 0,200, 2,159, 0,200, 2,141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,199,
+ 0, 0, 1,167, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 2,159, 0, 0, 0, 2,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0,248, 4,211,239, 48, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,238, 16,193, 32, 0, 0, 68,104, 0, 0,
+194, 0, 0, 0, 0, 0, 0, 0,193, 32, 0, 0, 68,104, 0, 0,196, 35, 64, 0, 0, 0, 0, 0, 0, 0, 1,199, 0, 0, 1,216,
+ 0, 0, 0, 18, 0, 0, 2,158, 0, 0, 0, 0, 0, 0, 1,198, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1,198,
+ 0, 0, 0, 18, 0, 0, 2,158, 0, 0, 0, 0, 0, 0, 0, 0, 72,146,124, 0, 70, 28, 64, 0, 60, 35,215, 10, 66, 72, 0, 0,
+ 0, 74, 0, 0, 0, 0, 2, 0, 0, 0, 4, 2, 0, 4, 1,216, 2,159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,200, 0, 0, 2,159, 0, 0, 1,167, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1,216, 2,159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 24, 4,211,240, 80, 0, 0, 1, 17, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,152,190, 32, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,211,241,144,
+ 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,236, 96, 4,211,182, 16, 4,211,179,208, 4,211,179, 80, 4,211,182, 80,
+ 0, 0, 0, 0, 0, 0, 6, 45, 0, 0, 7,118, 0, 0, 3,101, 0, 0, 4, 69, 1, 1, 1, 74, 0,225, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,211,244, 96, 4,211,244, 96, 4,211,242, 32, 4,211,243, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,242, 32, 0, 0, 0,195, 0, 0, 0, 1, 4,211,243, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68,102, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 67,165, 0, 0, 64, 0, 0, 0,
+ 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 73, 0, 0, 0, 0, 0, 0, 0, 23, 67,164,128, 0, 65,200, 0, 0, 67,164,128, 0,
+ 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 0, 12, 0, 10, 1, 74, 0, 24, 1, 74,
+ 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 45, 0, 0, 7,118, 0, 0, 3,101, 0, 0, 3,101,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,211,243, 64,
+ 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,242, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 45,
+ 0, 0, 7,118, 0, 0, 3,101, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 74, 0,225,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,152, 90, 32,
+ 68, 65, 84, 65, 0, 0, 3, 68, 2,152, 90, 32, 0, 0, 0,153, 0, 0, 0, 1, 64, 13,255, 24, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 64, 80, 66,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 65,154,
+191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 77, 1, 72, 0, 0, 0, 0, 63, 47,149,221,190,162,126, 85, 63, 39,165, 8,
+ 0, 0, 0, 0, 63, 58, 70, 51, 62,159,251,225,191, 28, 84,149, 0, 0, 0, 0,188, 49, 56,191, 63,101, 53, 54, 62,227,247, 50,
+ 0, 0, 0, 0,190,173, 38, 90,190,192,221,254,193, 52, 9,152, 63,128, 0, 0, 63, 47,149,223, 63, 58, 70, 55,188, 49, 56,192,
+ 0, 0, 0, 0,190,162,126, 87, 62,159,251,228, 63,101, 53, 56, 0, 0, 0, 0, 63, 39,165, 7,191, 28, 84,150, 62,227,247, 50,
+ 0, 0, 0, 0, 64,239,101,110,192,208, 62,151, 64,170,255, 77, 63,128, 0, 0, 63,194,201, 3,191,132, 49, 34,191, 39,250,244,
+191, 39,165, 8, 63,206,164,143, 63,130, 38,124, 63, 28,164,180, 63, 28, 84,149,188,196,153,179, 64, 58,119, 42,190,228,108, 8,
+190,227,247, 50,191, 64, 21, 82,191,156,230,204, 65, 49, 49,216, 65, 52, 9,152, 62,158, 70,231, 62,167,234, 23,187,159,206,128,
+180,168, 0, 0,189,199,189, 59, 61,196,167,147, 62,140,223,206, 51,248, 0, 0,194, 21,120,211, 66, 2, 5,145,193,213,136, 10,
+192,159,214,193, 66, 19, 38,219,193,255,173,197, 65,210,101,158, 64,160, 40,173, 63, 47,149,221,190,162,126, 85, 63, 39,165, 8,
+ 0, 0, 0, 0, 63, 58, 70, 51, 62,159,251,225,191, 28, 84,149, 0, 0, 0, 0,188, 49, 56,191, 63,101, 53, 54, 62,227,247, 50,
+ 0, 0, 0, 0,190,173, 38, 90,190,192,221,254,193, 52, 9,152, 63,128, 0, 0, 63,194,201, 3,191,132, 49, 34,191, 39,250,244,
+191, 39,165, 8, 63,206,164,143, 63,130, 38,124, 63, 28,164,180, 63, 28, 84,149,188,196,153,179, 64, 58,119, 42,190,228,108, 8,
+190,227,247, 50,191, 64, 21, 82,191,156,230,204, 65, 49, 49,216, 65, 52, 9,152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 72, 22,241,190,246,162, 78,190, 90, 8, 44,
+190,171, 35, 3, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 51, 4,202, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 7, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 0,
+ 4,211,244, 96, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 7, 2,152,196, 32, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 2, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8,
+ 0, 0, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 60, 35,215, 10, 67,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 0, 83, 78, 0, 0, 0,148, 4,211,245,240, 0, 0, 0,190, 0, 0, 0, 1,
+ 4,212, 43, 0, 4,211,177,144, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 67,111,109,112,111,115,105,116,105,110,103, 0,103, 46,
+ 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,211,246,176, 4,211,249,240, 4,211,250, 48,
+ 4,211,255,112, 4,211,255,176, 4,212, 38,176, 0, 0, 0, 0, 0, 0, 0, 0, 2,152,190, 32, 0, 0, 0, 0, 0, 0, 0, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,246,176,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,211,246,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,211,246,240, 0, 0, 0,191, 0, 0, 0, 1, 4,211,247, 48, 4,211,246,176, 0, 0, 0, 0, 0, 0, 4, 97,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,247, 48, 0, 0, 0,191, 0, 0, 0, 1, 4,211,247,112, 4,211,246,240,
+ 0, 0, 0, 0, 7,118, 4, 97, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,247,112, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,211,247,176, 4,211,247, 48, 0, 0, 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,247,176,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,211,247,240, 4,211,247,112, 0, 0, 0, 0, 0, 0, 4, 70, 0, 0, 0, 1, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,211,247,240, 0, 0, 0,191, 0, 0, 0, 1, 4,211,248, 48, 4,211,247,176, 0, 0, 0, 0, 7,118, 4, 70,
+ 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,248, 48, 0, 0, 0,191, 0, 0, 0, 1, 4,211,248,112, 4,211,247,240,
+ 0, 0, 0, 0, 6, 24, 0,100, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,248,112, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,211,248,176, 4,211,248, 48, 0, 0, 0, 0, 7,118, 0,100, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,248,176,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,211,248,240, 4,211,248,112, 0, 0, 0, 0, 6, 24, 4, 70, 0, 0, 0, 1, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,211,248,240, 0, 0, 0,191, 0, 0, 0, 1, 4,211,249, 48, 4,211,248,176, 0, 0, 0, 0, 0, 0, 1,172,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,249, 48, 0, 0, 0,191, 0, 0, 0, 1, 4,211,249,112, 4,211,248,240,
+ 0, 0, 0, 0, 6, 24, 1,172, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,249,112, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,211,249,176, 4,211,249, 48, 0, 0, 0, 0, 3, 0, 1,172, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,211,249,176,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,211,249,240, 4,211,249,112, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,211,249,240, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,249,176, 0, 0, 0, 0, 6, 24, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,250, 48, 0, 0, 0,192, 0, 0, 0, 1, 4,211,250,112, 0, 0, 0, 0,
+ 4,211,246,240, 4,211,247, 48, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,250,112, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,211,250,176, 4,211,250, 48, 4,211,246,240, 4,211,247,176, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,211,250,176, 0, 0, 0,192, 0, 0, 0, 1, 4,211,250,240, 4,211,250,112, 4,211,247, 48, 4,211,247,240,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,250,240, 0, 0, 0,192, 0, 0, 0, 1, 4,211,251, 48,
+ 4,211,250,176, 4,211,247,176, 4,211,247,240, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,251, 48,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,211,251,112, 4,211,250,240, 4,211,247,112, 4,211,248,112, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,211,251,112, 0, 0, 0,192, 0, 0, 0, 1, 4,211,251,176, 4,211,251, 48, 4,211,248, 48,
+ 4,211,248,112, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,251,176, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,211,251,240, 4,211,251,112, 4,211,247,240, 4,211,248,176, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,211,251,240, 0, 0, 0,192, 0, 0, 0, 1, 4,211,252, 48, 4,211,251,176, 4,211,247,176, 4,211,248,176, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,252, 48, 0, 0, 0,192, 0, 0, 0, 1, 4,211,252,112, 4,211,251,240,
+ 4,211,248, 48, 4,211,248,176, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,252,112, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,211,252,176, 4,211,252, 48, 4,211,247,240, 4,211,248,112, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,211,252,176, 0, 0, 0,192, 0, 0, 0, 1, 4,211,252,240, 4,211,252,112, 4,211,247,176, 4,211,248,240,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,252,240, 0, 0, 0,192, 0, 0, 0, 1, 4,211,253, 48,
+ 4,211,252,176, 4,211,248,176, 4,211,249, 48, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,253, 48,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,211,253,112, 4,211,252,240, 4,211,248,240, 4,211,249, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,211,253,112, 0, 0, 0,192, 0, 0, 0, 1, 4,211,253,176, 4,211,253, 48, 4,211,248,240,
+ 4,211,249,112, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,253,176, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,211,253,240, 4,211,253,112, 4,211,249, 48, 4,211,249,112, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,211,253,240, 0, 0, 0,192, 0, 0, 0, 1, 4,211,254, 48, 4,211,253,176, 4,211,246,176, 4,211,249,176, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,254, 48, 0, 0, 0,192, 0, 0, 0, 1, 4,211,254,112, 4,211,253,240,
+ 4,211,249,176, 4,211,249,240, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,254,112, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,211,254,176, 4,211,254, 48, 4,211,247,112, 4,211,249,240, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,211,254,176, 0, 0, 0,192, 0, 0, 0, 1, 4,211,254,240, 4,211,254,112, 4,211,248, 48, 4,211,249,240,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,254,240, 0, 0, 0,192, 0, 0, 0, 1, 4,211,255, 48,
+ 4,211,254,176, 4,211,249,112, 4,211,249,176, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,211,255, 48,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,211,255,112, 4,211,254,240, 4,211,249, 48, 4,211,249,240, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,211,255,112, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 4,211,255, 48, 4,211,246,176,
+ 4,211,248,240, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,211,255,176, 0, 0, 0,194, 0, 0, 0, 1,
+ 4,212, 2,128, 0, 0, 0, 0, 4,211,247,176, 4,211,246,240, 4,211,247, 48, 4,211,247,240, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 7,118, 0, 0, 4, 71, 0, 0, 4, 97, 7, 7, 7,119, 0, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
+ 4,212, 42,160, 4,212, 42,160, 4,212, 0, 64, 4,212, 1, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,212, 0, 64, 0, 0, 0,195, 0, 0, 0, 1, 4,212, 1, 96, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68,148, 32, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,238,224, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 7,119, 0, 26, 7,119, 0, 26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 4, 71, 0, 0, 4, 96, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 7,119, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 1, 96, 0, 0, 0,195, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,212, 0, 64, 0, 0, 0, 0, 69,109,240, 0,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,109,255,255,
+192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,112, 0, 0, 7,129, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7,111,
+ 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 7,111, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 2, 0, 0, 0, 1, 3, 3, 0, 2, 4, 0, 0, 10, 7,129,
+ 0, 2, 7,112, 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, 4, 97,
+ 0, 0, 4, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96,
+ 4,212, 2,128, 0, 0, 0,194, 0, 0, 0, 1, 4,212, 6, 64, 4,211,255,176, 4,211,249,240, 4,211,248, 48, 4,211,248,112,
+ 4,211,247,112, 0, 0, 0, 0, 0, 0, 6, 25, 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 0, 99, 15, 15, 1, 94, 0,100, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 5, 80, 4,212, 5, 80, 4,212, 3, 16, 4,212, 4, 48, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 3, 16, 0, 0, 0,195, 0, 0, 0, 1,
+ 4,212, 4, 48, 0, 0, 0, 0, 0, 0, 0, 0, 68,110,128, 0, 0, 0, 0, 0, 65,208, 0, 0, 67,161,128, 0, 68, 40, 64, 0,
+ 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 93, 0, 0, 0, 0, 0, 0, 0, 25, 68,202,224, 0, 65,200, 0, 0,
+ 68,202,224, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1, 94,
+ 0, 26, 1, 94, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 25, 0, 0, 7,118, 0, 0, 0, 0,
+ 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 94, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,212, 4, 48, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 3, 16,192, 64, 0, 0, 67,126, 0, 0, 0, 0, 0, 0,
+ 66, 72, 0, 0,193, 74, 51, 50, 67,131,209,154, 0, 0, 0, 0, 66, 72, 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, 93, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1, 93, 0, 0, 0, 18,
+ 0, 0, 0, 73, 63,128, 0, 0, 66, 72, 0, 0, 72,146,124, 0, 66, 72, 0, 0, 61,204,204,205, 65, 32, 0, 0, 0, 72, 0, 0,
+ 0, 0, 2, 0, 0, 4, 4, 0, 0, 8, 1, 94, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6, 25, 0, 0, 7,118, 0, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 94, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,188, 4,212, 5, 80, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 68, 65, 84, 65, 0, 0, 0, 96, 4,212, 6, 64,
+ 0, 0, 0,194, 0, 0, 0, 1, 4,212, 27, 80, 4,212, 2,128, 4,211,248, 48, 4,211,248,176, 4,211,247,240, 4,211,248,112,
+ 0, 0, 0, 0, 0, 0, 6, 25, 0, 0, 7,118, 0, 0, 0,101, 0, 0, 4, 69, 4, 4, 1, 94, 3,225, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,212, 26, 80, 4,212, 26, 80, 4,212, 6,208, 4,212, 7,240, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 6,208, 0, 0, 0,195, 0, 0, 0, 1, 4,212, 7,240,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,160, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 67,175, 0, 0, 0, 0, 0, 0,
+ 65,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 93, 0, 0, 0, 0, 0, 0, 0, 30, 67,137,128, 0, 65,200, 0, 0, 67,137,128, 0,
+ 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1, 94, 0, 31, 1, 94,
+ 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 25, 0, 0, 7,118, 0, 0, 4, 39, 0, 0, 4, 69,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 94, 0, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 7,240,
+ 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 6,208, 0, 0, 0, 0, 67,174,128, 0,196,112, 64, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67,166,127,255,196,112,127,254, 0, 0, 0, 0, 0, 0, 1, 77, 0, 0, 1, 94, 0, 0, 0, 0, 0, 0, 3,193,
+ 0, 0, 0, 0, 0, 0, 1, 82, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1, 76, 0, 0, 0, 0, 0, 0, 3,193,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 3, 10, 0, 0, 0, 1, 0, 7,
+ 0, 18, 4, 0, 0, 6, 1, 94, 3,194, 1, 77, 3,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 25,
+ 0, 0, 7,118, 0, 0, 0,101, 0, 0, 4, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 94, 3,194,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,212, 9, 16, 4,212, 24,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 9, 16, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 10,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,255,220, 1, 76, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 10,128,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212, 11,240, 4,212, 9, 16, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,135, 1, 76, 0, 61,
+ 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, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
- 8,196,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,197,252, 2, 0, 0, 0, 0,104,194,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 11,240, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 13, 96,
+ 4,212, 10,128, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,111, 1, 76, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,197,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
- 72,199,252, 2, 0, 0, 0, 0, 8,196,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212, 13, 96, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 14,208, 4,212, 11,240, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,140,254, 76, 1,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,254,140, 1, 76, 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
- 72,199,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,200,252, 2, 0, 0, 0, 0,168,197,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,
-105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,
-105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,200,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
-136,202,252, 2, 0, 0, 0, 0, 72,199,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 14,208, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212, 16, 64, 4,212, 13, 96, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,
+116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,
+116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 58, 1, 76, 0, 58, 0, 20, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 34,254, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 16, 64, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 17,176, 4,212, 14,208,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-136,202,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,204,252, 2, 0, 0, 0, 0,232,200,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,
-103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253, 76, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 34, 1, 76, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,204,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
-200,205,252, 2, 0, 0, 0, 0,136,202,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212, 17,176, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 19, 32, 4,212, 16, 64, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,
+105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,164,
+ 1, 76, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 19, 32, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212, 20,144, 4,212, 17,176, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 10,253, 76, 1,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-200,205,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,207,252, 2, 0, 0, 0, 0, 40,204,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,
-109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,
-109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 10, 1, 76, 0,130, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 20,144, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 22, 0, 4,212, 19, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,207,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
- 8,209,252, 2, 0, 0, 0, 0,200,205,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,252,242, 1, 76, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,218,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 22, 0,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212, 23,112, 4,212, 20,144, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
+ 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,218, 1, 76, 0, 0,
+ 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
- 8,209,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,210,252, 2, 0, 0, 0, 0,104,207,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 23,112, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 24,224,
+ 4,212, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,194, 1, 76, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,210,252, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,209,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212, 24,224, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 23,112, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,170,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,
- 72,212,252, 2, 0, 0, 0, 0,159, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,136,213,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
-232,226,252, 2, 0, 0, 0, 0,248,188,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,
-216,168,252, 2, 0, 0, 0, 0, 40,170,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
- 0, 0, 0, 0,171, 1, 0, 0, 1, 1, 23, 3,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 88,225,252, 2, 0, 0, 0, 0, 88,225,252, 2, 0, 0, 0, 0,120,214,252, 2, 0, 0, 0, 0, 56,220,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,120,214,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,232,215,252, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 69, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65,
- 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 23, 3,
- 26, 0, 23, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 3, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,252,170, 1, 76, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,232,215,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 88,217,252, 2, 0, 0, 0, 0,
-120,214,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,
-255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0,
- 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 1, 3, 0, 0,
- 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,146, 1, 0, 0, 5, 0,
- 3, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 4,212, 26, 80, 0, 0, 0,159,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 88,217,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,218,252, 2, 0, 0, 0, 0,
-232,215,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67,
- 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,
-120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
- 26, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0,
- 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,200,218,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 56,220,252, 2, 0, 0, 0, 0,
- 88,217,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,
- 0, 0,184,195, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,129, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,
-130, 1,163, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 23, 6, 0, 0,
- 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
- 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 56,220,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-200,218,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 23, 6, 0, 0,
- 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 3,146, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,221,252, 2, 0, 0, 0, 0,
- 68, 65, 84, 65,104, 3, 0, 0,168,221,252, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0, 36,101,230, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,171, 98, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-154, 65,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0, 72, 1, 77,190, 0, 0, 0, 0,221,149, 47, 63, 85,126,162,190,
- 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63,
- 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63,223,149, 47, 63, 55, 70, 58, 63,
-192, 56, 49,188, 0, 0, 0, 0, 87,126,162,190,228,251,159, 62, 56, 53,101, 63, 0, 0, 0, 0, 7,165, 39, 63,150, 84, 28,191,
- 50,247,227, 62, 0, 0, 0, 0,110,101,239, 64,151, 62,208,192, 77,255,170, 64, 0, 0,128, 63, 3, 6,158, 63, 92,224,143,191,
-244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63, 0,127,159,188,126,242, 74, 64,
- 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65, 25, 25,195, 62, 12,250,206, 62,
- 0,247,196,187, 0, 0,150,180,203,132,183,189, 61,175,180, 61,245,110,129, 62, 0, 0,120, 51,211,120, 21,194,144, 5, 2, 66,
- 9,136,213,193,193,214,159,192,219, 38, 19, 66,196,173,255,193,157,101,210, 65,173, 40,160, 64,221,149, 47, 63, 85,126,162,190,
- 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,191, 56, 49,188, 54, 53,101, 63,
- 50,247,227, 62, 0, 0, 0, 0, 90, 38,173,190,254,221,192,190,152, 9, 52,193, 0, 0,128, 63, 3, 6,158, 63, 92,224,143,191,
-244,250, 39,191, 8,165, 39,191,170,164,167, 63,132,167,141, 63,180,164, 28, 63,149, 84, 28, 63, 0,127,159,188,126,242, 74, 64,
- 8,108,228,190, 50,247,227,190,221,212, 27,191, 39,197,170,191,216, 49, 49, 65,152, 9, 52, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,241, 22, 72, 63, 78,162,246,190,
- 44, 8, 90,190, 3, 35,171,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,162, 30,184, 58, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,
-237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 72, 1, 0, 0, 88,225,252, 2, 0, 0, 0, 0,154, 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, 1, 0, 0, 0, 51, 51, 51, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,255, 0, 0, 0,160, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 96, 4,212, 27, 80, 0, 0, 0,194, 0, 0, 0, 1, 4,212, 34,176, 4,212, 6, 64, 4,211,249,176, 4,211,249,112,
+ 4,211,249, 48, 4,211,249,240, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 6, 23, 0, 0, 0, 0, 0, 0, 1,171, 1, 1, 3, 23,
+ 1,172, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,212, 33,128, 4,212, 33,128, 4,212, 27,224, 4,212, 32, 96,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 27,224, 0, 0, 0,195,
+ 0, 0, 0, 1, 4,212, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,102, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0,
+ 68, 69,192, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 22, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0,
+ 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12,
+ 0, 10, 3, 23, 0, 26, 3, 23, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 6, 23,
+ 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 23, 0, 26, 0, 0, 0, 1,
+ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0,248, 4,212, 29, 0, 0, 0, 0,195, 0, 0, 0, 1, 4,212, 30, 32, 4,212, 27,224, 0, 0, 0, 0, 67, 15, 0, 0,
+196, 70, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 15, 0, 0,196, 70,127,255, 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0,160,
+ 0, 0, 0, 18, 0, 0, 3, 43, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142,
+ 0, 0, 0, 18, 0, 0, 3, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0,
+ 0, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 3, 44, 0,143, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 3, 1, 0, 0, 0, 26, 0, 0, 1,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 1,146, 0, 0, 0, 5, 0, 3, 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 30, 32, 0, 0, 0,195, 0, 0, 0, 1, 4,212, 31, 64,
+ 4,212, 29, 0, 0, 0, 0, 0, 67, 16, 0, 0,194,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 16,102,231,194,206, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0,
+ 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 0,160, 0,120, 0,143,
+ 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 6, 23, 0, 0, 0, 26, 0, 0, 0, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 31, 64,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,212, 32, 96, 4,212, 30, 32, 0, 0, 0, 0, 67, 35, 0, 0,196,108,192, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67, 35, 0, 0,195,184, 0, 0, 0, 0, 0, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 1,129,
+ 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 1,129,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 7,
+ 0, 18, 0, 0, 0, 6, 0,180, 1,130, 0,163, 1,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 23,
+ 0, 0, 6, 23, 0, 0, 0, 26, 0, 0, 1,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
+ 0, 0, 0, 4, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,212, 32, 96, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 31, 64, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63,
- 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0,232,226,252, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40,232,252, 2, 0, 0, 0, 0,
-136,213,252, 2, 0, 0, 0, 0,104,168,252, 2, 0, 0, 0, 0, 56,166,252, 2, 0, 0, 0, 0,248,167,252, 2, 0, 0, 0, 0,
-216,168,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0, 69, 4, 0, 0,
- 16, 16, 24, 6,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,230,252, 2, 0, 0, 0, 0,
-184,230,252, 2, 0, 0, 0, 0,216,227,252, 2, 0, 0, 0, 0, 72,229,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-216,227,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 72,229,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128, 41, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,173, 1, 0, 0,198, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 6, 23, 0, 0, 0, 26, 0, 0, 1,171, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 23, 1,146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,152, 94, 32, 68, 65, 84, 65, 0, 0, 3, 68, 2,152, 94, 32, 0, 0, 0,153, 0, 0, 0, 1,
+ 63,230,101, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 98,171,118, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,191,128, 65,154,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 77, 1, 72, 0, 0, 0, 0,
+ 63, 47,149,221,190,162,126, 85, 63, 39,165, 8, 0, 0, 0, 0, 63, 58, 70, 51, 62,159,251,225,191, 28, 84,149, 0, 0, 0, 0,
+188, 49, 56,191, 63,101, 53, 54, 62,227,247, 50, 0, 0, 0, 0,190,173, 38, 90,190,192,221,254,193, 52, 9,152, 63,128, 0, 0,
+ 63, 47,149,223, 63, 58, 70, 55,188, 49, 56,192, 0, 0, 0, 0,190,162,126, 87, 62,159,251,228, 63,101, 53, 56, 0, 0, 0, 0,
+ 63, 39,165, 7,191, 28, 84,150, 62,227,247, 50, 0, 0, 0, 0, 64,239,101,110,192,208, 62,151, 64,170,255, 77, 63,128, 0, 0,
+ 63,158, 6, 3,191,143,224, 92,191, 39,250,244,191, 39,165, 8, 63,167,164,170, 63,141,167,132, 63, 28,164,180, 63, 28, 84,149,
+188,159,127, 0, 64, 74,242,126,190,228,108, 8,190,227,247, 50,191, 27,212,221,191,170,197, 39, 65, 49, 49,216, 65, 52, 9,152,
+ 62,195, 25, 25, 62,206,250, 12,187,196,247, 0,180,150, 0, 0,189,183,132,203, 61,180,175, 61, 62,129,110,245, 51,120, 0, 0,
+194, 21,120,211, 66, 2, 5,144,193,213,136, 9,192,159,214,193, 66, 19, 38,219,193,255,173,196, 65,210,101,157, 64,160, 40,173,
+ 63, 47,149,221,190,162,126, 85, 63, 39,165, 8, 0, 0, 0, 0, 63, 58, 70, 51, 62,159,251,225,191, 28, 84,149, 0, 0, 0, 0,
+188, 49, 56,191, 63,101, 53, 54, 62,227,247, 50, 0, 0, 0, 0,190,173, 38, 90,190,192,221,254,193, 52, 9,152, 63,128, 0, 0,
+ 63,158, 6, 3,191,143,224, 92,191, 39,250,244,191, 39,165, 8, 63,167,164,170, 63,141,167,132, 63, 28,164,180, 63, 28, 84,149,
+188,159,127, 0, 64, 74,242,126,190,228,108, 8,190,227,247, 50,191, 27,212,221,191,170,197, 39, 65, 49, 49,216, 65, 52, 9,152,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 72, 22,241,190,246,162, 78,190, 90, 8, 44,190,171, 35, 3, 65,111,211,214, 65,111,211,214, 0, 0, 0, 0, 0, 0, 0, 0,
+ 58,184, 30,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 72,229,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,227,252, 2, 0, 0, 0, 0,
- 0, 0, 32,193, 0, 0, 0, 68, 0, 0, 32,193, 0, 0, 0, 68,128,195,217,195,192,225,108, 68,240,130,178,193, 24,148, 5, 68,
- 7, 6, 0, 0, 24, 6, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0, 6, 6, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70,
-236, 81,184, 61, 10,215, 19, 64, 10, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0, 24, 6,127, 2, 7, 6,109, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0,199, 1, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 1, 0, 0,
-184,230,252, 2, 0, 0, 0, 0,171, 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, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 55, 62, 92,
+190,224,186, 56,190,148,203,237,190,234,236, 3, 0, 1, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 0, 4,212, 33,128, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 7,
+ 2,152,196, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 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, 1,
+ 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 8, 8, 0, 0, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 61,204,204,205,
+ 67,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0,
+ 0, 7, 0, 10, 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, 68, 65, 84, 65, 0, 0, 0, 96,
+ 4,212, 34,176, 0, 0, 0,194, 0, 0, 0, 1, 4,212, 38,176, 4,212, 27, 80, 4,211,248,240, 4,211,247,176, 4,211,248,176,
+ 4,211,249, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 23, 0, 0, 1,173, 0, 0, 4, 69, 16, 16, 6, 24, 2,153, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,212, 37,128, 4,212, 37,128, 4,212, 35, 64, 4,212, 36, 96, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 35, 64, 0, 0, 0,195, 0, 0, 0, 1,
+ 4,212, 36, 96, 0, 0, 0, 0, 0, 0, 0, 0, 68, 41,128, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,195, 0, 0,
+ 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 23, 0, 0, 0, 0, 0, 0, 0, 25, 68,189,224, 0, 65,200, 0, 0,
+ 68,189,224, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 6, 24,
+ 0, 26, 6, 24, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 23, 0, 0, 1,173,
+ 0, 0, 1,198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 24, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 19, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,123,246, 98, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,212, 36, 96, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 35, 64,193, 32, 0, 0, 68, 0, 0, 0,193, 32, 0, 0,
+ 68, 0, 0, 0,195,217,195,128, 68,108,225,192,193,178,130,240, 68, 5,148, 24, 0, 0, 6, 7, 0, 0, 6, 24, 0, 0, 0, 18,
+ 0, 0, 2,126, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 18,
+ 0, 0, 2,126, 63,128, 0, 0, 63,128, 0, 0, 70,250, 0, 0, 70,250, 0, 0, 61,184, 81,236, 64, 19,215, 10, 0, 10, 0, 0,
+ 0, 0, 0, 3, 0, 0, 4, 0, 0, 0, 6, 24, 2,127, 6, 7, 2,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 23, 0, 0, 1,199, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 6, 24, 2,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,160, 0, 0, 0, 40,232,252, 2, 0, 0, 0, 0,
-194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,226,252, 2, 0, 0, 0, 0,120,164,252, 2, 0, 0, 0, 0,
-104,168,252, 2, 0, 0, 0, 0, 72,169,252, 2, 0, 0, 0, 0,184,169,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 6, 6, 0, 3,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,104,237,252, 2, 0, 0, 0, 0,104,237,252, 2, 0, 0, 0, 0, 24,233,252, 2, 0, 0, 0, 0,
-248,235,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,233,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-136,234,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 64, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0, 0, 3, 26, 0, 0, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,255, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,252, 4,212, 37,128, 0, 0, 0,171, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,234,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-248,235,252, 2, 0, 0, 0, 0, 24,233,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 64, 19,215, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,152,190, 32, 0, 0, 0, 0, 0, 0, 0, 0, 63, 98,246,123, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 0, 0, 0, 96, 4,212, 38,176,
+ 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 34,176, 4,211,246,176, 4,211,248,240, 4,211,249,112, 4,211,249,176,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,255, 0, 0, 0, 0, 0, 0, 1,171, 6, 6, 3, 0, 1,172, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2,152, 98, 32, 2,152, 98, 32, 4,212, 39, 64, 4,212, 41,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 39, 64, 0, 0, 0,195, 0, 0, 0, 1, 4,212, 40, 96,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67,215, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68, 64, 0, 0, 0, 0, 0, 0,
+ 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,255, 0, 0, 0, 0, 0, 0, 0, 25, 68, 63,192, 0, 65,200, 0, 0, 68, 63,192, 0,
+ 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 3, 0, 0, 26, 3, 0,
+ 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,255, 0, 0, 0, 0, 0, 0, 0, 25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 40, 96,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,212, 41,128, 4,212, 39, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 4, 0, 3, 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, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,235,252, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,136,234,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
- 0, 0,128,191, 0, 0, 0, 64, 0, 0,146,190, 0,128,164, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,146, 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, 26, 0, 0, 1,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
+ 0, 0, 0, 4, 0, 3, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,255, 2, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 3,146, 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,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,212, 41,128, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 40, 96, 0, 0, 0, 0,
+ 67,128, 0, 0, 0, 0, 0, 0, 67,128, 0, 0,191,128, 0, 0, 64, 0, 0, 0,190,146, 0, 0, 63,164,128, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 1,146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 33, 0, 0,104,237,252, 2, 0, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,255, 0, 0, 0, 26, 0, 0, 1,171, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1,146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,
-154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 32,248, 2,152, 98, 32, 0, 0, 0,164, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,240, 0, 0, 0, 0, 0, 0, 62,153,153,154, 0, 0, 0, 0,
+ 0, 0, 0,100, 62,153,153,154, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1271,7 +1080,7 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1401,3947 +1210,2954 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,
-216,160,254, 2, 0, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 82, 68,101,102, 97,117,108,116, 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,136, 16,253, 2, 0, 0, 0, 0, 88, 21,253, 2, 0, 0, 0, 0,200, 21,253, 2, 0, 0, 0, 0,
- 56, 29,253, 2, 0, 0, 0, 0,168, 29,253, 2, 0, 0, 0, 0, 40, 66,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 48,150, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-104, 17,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0,
-248, 16,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 4, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-216, 17,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,232, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
- 40, 19,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7,232, 3, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
-184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-152, 19,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 44, 6,232, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,120, 20,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 44, 6, 52, 3, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120, 20,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-232, 20,253, 2, 0, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 52, 3, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88, 21,253, 2, 0, 0, 0, 0,
-120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
- 88, 21,253, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 96, 0, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 21,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0, 56, 22,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0,
-104, 17,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 22,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0,168, 22,253, 2, 0, 0, 0, 0,200, 21,253, 2, 0, 0, 0, 0,248, 16,253, 2, 0, 0, 0, 0,
- 72, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,168, 22,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0, 24, 23,253, 2, 0, 0, 0, 0, 56, 22,253, 2, 0, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,
-184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 24, 23,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0,136, 23,253, 2, 0, 0, 0, 0,168, 22,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
-184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,136, 23,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0,248, 23,253, 2, 0, 0, 0, 0, 24, 23,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
- 40, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248, 23,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0,104, 24,253, 2, 0, 0, 0, 0,136, 23,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0,
- 40, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,104, 24,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0,216, 24,253, 2, 0, 0, 0, 0,248, 23,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
-152, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,216, 24,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0, 72, 25,253, 2, 0, 0, 0, 0,104, 24,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,
-152, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 72, 25,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0,184, 25,253, 2, 0, 0, 0, 0,216, 24,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,
- 8, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,184, 25,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0, 40, 26,253, 2, 0, 0, 0, 0, 72, 25,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
- 8, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 26,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0,152, 26,253, 2, 0, 0, 0, 0,184, 25,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,
-120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,152, 26,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0, 8, 27,253, 2, 0, 0, 0, 0, 40, 26,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0,
-120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 8, 27,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0,120, 27,253, 2, 0, 0, 0, 0,152, 26,253, 2, 0, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0,
-120, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,120, 27,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0,232, 27,253, 2, 0, 0, 0, 0, 8, 27,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
-232, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,232, 27,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0, 88, 28,253, 2, 0, 0, 0, 0,120, 27,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
-232, 20,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88, 28,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0,200, 28,253, 2, 0, 0, 0, 0,232, 27,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
- 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200, 28,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0, 56, 29,253, 2, 0, 0, 0, 0, 88, 28,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0,
- 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56, 29,253, 2, 0, 0, 0, 0,
-192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 28,253, 2, 0, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0,
- 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,168, 29,253, 2, 0, 0, 0, 0,
-194, 0, 0, 0, 1, 0, 0, 0,120, 33,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,
-248, 16,253, 2, 0, 0, 0, 0,104, 17,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,126, 7, 0, 0,233, 3, 0, 0, 4, 4, 0, 0, 7, 7,127, 7, 28, 0, 1, 0, 0, 0, 0, 0, 7, 0, 8, 0,
-120, 29,225, 2, 0, 0, 0, 0, 72,160,254, 2, 0, 0, 0, 0, 72,160,254, 2, 0, 0, 0, 0,152, 30,253, 2, 0, 0, 0, 0,
- 8, 32,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 96, 15, 3, 0, 0, 0, 0,
-120, 98,223, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152, 30,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 8, 32,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,126, 7, 0, 0,233, 3, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-127, 7, 26, 0, 2, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-136, 31,225, 2, 0, 0, 0, 0, 8, 59,223, 4, 0, 0, 0, 0, 8, 59,223, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,232, 38,157, 4, 0, 0, 0, 0,152,247, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8, 32,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152, 30,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0,
- 0, 0, 0, 0, 1,192,237, 68, 0, 0, 0, 0, 0, 0, 0, 64,110, 7, 0, 0,127, 7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,109, 7, 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,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3,
- 2, 0, 0, 4, 10, 0,127, 7, 2, 0,110, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,126, 7, 0, 0, 3, 4, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-127, 7, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-152, 30,225, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152,146,157, 4, 0, 0, 0, 0, 56,251, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120, 33,253, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
-184,132,253, 2, 0, 0, 0, 0,168, 29,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0, 8, 20,253, 2, 0, 0, 0, 0,
-120, 20,253, 2, 0, 0, 0, 0,216, 17,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,
- 0, 0, 0, 0, 51, 3, 0, 0, 4, 4, 82, 1, 52, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 24, 25,225, 2, 0, 0, 0, 0,
- 8,125,253, 2, 0, 0, 0, 0, 8,132,253, 2, 0, 0, 0, 0,104, 34,253, 2, 0, 0, 0, 0,216, 35,253, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 83,223, 2, 0, 0, 0, 0,184, 64,159, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,104, 34,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,216, 35,253, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,169, 67,
- 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65,
- 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 82, 1,
- 31, 0, 82, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,
- 21, 3, 0, 0, 51, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 1, 31, 0, 4, 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, 0, 0,136, 28,225, 2, 0, 0, 0, 0,
-136,135,101, 4, 0, 0, 0, 0,136,135,101, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-248,143,159, 4, 0, 0, 0, 0,152, 0, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,216, 35,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-104, 34,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,169, 67, 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,160, 67,
- 0, 64, 69,196, 0, 0, 0, 0, 65, 1, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 20, 3, 0, 0, 0, 0, 0, 0, 74, 1, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 20, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 82, 1,
- 21, 3, 65, 1, 21, 3, 0, 0, 56, 77, 99, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,
- 0, 0, 0, 0, 20, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 1, 21, 3, 5, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 26,225, 2, 0, 0, 0, 0,
- 24, 49,115, 4, 0, 0, 0, 0,232,145, 99, 4, 0, 0, 0, 0, 72, 37,253, 2, 0, 0, 0, 0,104,123,253, 2, 0, 0, 0, 0,
-152,150,154, 4, 0, 0, 0, 0,200, 5, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 72, 37,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 38,253, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 40, 27,225, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95,
- 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95,
- 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 65, 1, 36, 0,
- 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 38,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,136, 40,253, 2, 0, 0, 0, 0, 72, 37,253, 2, 0, 0, 0, 0, 24, 48,145, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, 0,148,
+ 4,212, 43, 0, 0, 0, 0,190, 0, 0, 0, 1, 4,212,182,208, 4,211,245,240, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 68,101,
+102, 97,117,108,116, 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,
+ 4,212, 43,192, 4,212, 46,128, 4,212, 46,192, 4,212, 51, 0, 4,212, 51, 64, 4,212,143,112, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2,152,190, 32, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 12, 0, 0, 0, 0, 0, 0, 0, 53,222, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 20, 4,212, 43,192, 0, 0, 0,191, 0, 0, 0, 1, 4,212, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212, 44, 0, 0, 0, 0,191, 0, 0, 0, 1, 4,212, 44, 64,
+ 4,212, 43,192, 0, 0, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212, 44, 64, 0, 0, 0,191,
+ 0, 0, 0, 1, 4,212, 44,128, 4,212, 44, 0, 0, 0, 0, 0, 7,128, 4,128, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20,
+ 4,212, 44,128, 0, 0, 0,191, 0, 0, 0, 1, 4,212, 44,192, 4,212, 44, 64, 0, 0, 0, 0, 7,128, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 20, 4,212, 44,192, 0, 0, 0,191, 0, 0, 0, 1, 4,212, 45, 0, 4,212, 44,128, 0, 0, 0, 0,
+ 0, 0, 4,101, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,212, 45, 0, 0, 0, 0,191, 0, 0, 0, 1, 4,212, 45, 64,
+ 4,212, 44,192, 0, 0, 0, 0, 7,128, 4,101, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,212, 45, 64, 0, 0, 0,191,
+ 0, 0, 0, 1, 4,212, 45,128, 4,212, 45, 0, 0, 0, 0, 0, 6, 64, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20,
+ 4,212, 45,128, 0, 0, 0,191, 0, 0, 0, 1, 4,212, 45,192, 4,212, 45, 64, 0, 0, 0, 0, 6, 64, 4,101, 0, 0, 0, 1,
+ 68, 65, 84, 65, 0, 0, 0, 20, 4,212, 45,192, 0, 0, 0,191, 0, 0, 0, 1, 4,212, 46, 0, 4,212, 45,128, 0, 0, 0, 0,
+ 6, 64, 3,160, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212, 46, 0, 0, 0, 0,191, 0, 0, 0, 1, 4,212, 46, 64,
+ 4,212, 45,192, 0, 0, 0, 0, 7,128, 3,160, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212, 46, 64, 0, 0, 0,191,
+ 0, 0, 0, 1, 4,212, 46,128, 4,212, 46, 0, 0, 0, 0, 0, 0, 0, 0,124, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20,
+ 4,212, 46,128, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 46, 64, 0, 0, 0, 0, 6, 64, 0,124, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 46,192, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 47, 0, 0, 0, 0, 0, 4,212, 44, 0,
+ 4,212, 44, 64, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 47, 0, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,212, 47, 64, 4,212, 46,192, 4,212, 44, 0, 4,212, 44,192, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,212, 47, 64, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 47,128, 4,212, 47, 0, 4,212, 44, 64, 4,212, 45, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 47,128, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 47,192, 4,212, 47, 64,
+ 4,212, 44,192, 4,212, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 47,192, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,212, 48, 0, 4,212, 47,128, 4,212, 43,192, 4,212, 45, 64, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,212, 48, 0, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 48, 64, 4,212, 47,192, 4,212, 44,128, 4,212, 45, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 48, 64, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 48,128,
+ 4,212, 48, 0, 4,212, 44,192, 4,212, 45,128, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 48,128,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,212, 48,192, 4,212, 48, 64, 4,212, 45, 0, 4,212, 45,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 48,192, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 49, 0, 4,212, 48,128, 4,212, 45, 64,
+ 4,212, 45,192, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 49, 0, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,212, 49, 64, 4,212, 48,192, 4,212, 45,128, 4,212, 45,192, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,212, 49, 64, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 49,128, 4,212, 49, 0, 4,212, 45, 0, 4,212, 46, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 49,128, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 49,192, 4,212, 49, 64,
+ 4,212, 44,128, 4,212, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 49,192, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,212, 50, 0, 4,212, 49,128, 4,212, 45,192, 4,212, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,212, 50, 0, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 50, 64, 4,212, 49,192, 4,212, 43,192, 4,212, 46, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 50, 64, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 50,128,
+ 4,212, 50, 0, 4,212, 44,192, 4,212, 46, 64, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 50,128,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,212, 50,192, 4,212, 50, 64, 4,212, 45,128, 4,212, 46,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 50,192, 0, 0, 0,192, 0, 0, 0, 1, 4,212, 51, 0, 4,212, 50,128, 4,212, 45, 64,
+ 4,212, 46,128, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212, 51, 0, 0, 0, 0,192, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,212, 50,192, 4,212, 46, 64, 4,212, 46,128, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96,
+ 4,212, 51, 64, 0, 0, 0,194, 0, 0, 0, 1, 4,212, 54, 16, 0, 0, 0, 0, 4,212, 44,192, 4,212, 44, 0, 4,212, 44, 64,
+ 4,212, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,128, 0, 0, 4,102, 0, 0, 4,128, 7, 7, 7,129, 0, 27, 0, 1,
+ 0, 0, 0, 0, 0, 7, 0, 8, 2, 23,154,128, 4,212,182,112, 4,212,182,112, 4,212, 51,208, 4,212, 52,240, 0, 0, 0, 0,
+ 0, 0, 0, 0, 10, 62,229,240, 9,182,150, 80, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 51,208, 0, 0, 0,195, 0, 0, 0, 1,
+ 4,212, 52,240, 0, 0, 0, 0, 0, 0, 0, 0, 68,159, 32, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,240, 32, 0,
+ 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,128, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0,
+ 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 7,129,
+ 0, 26, 7,129, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,128, 0, 0, 4,102,
+ 0, 0, 4,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,129, 0, 26, 0, 2, 0, 1, 0, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,155,208, 10, 62,245,176, 10, 62,245,176,
+ 0, 0, 0, 0, 0, 0, 0, 0, 10, 62,133,240, 10, 62,165, 96, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,212, 52,240, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 51,208, 0, 0, 0, 0, 69,109,240, 0,192,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68,238, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 7,112, 0, 0, 7,129, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7,111, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 7,111, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 2, 0, 0,
+ 0, 1, 3, 3, 0, 2, 4, 0, 0, 10, 7,129, 0, 2, 7,112, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,128, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 23,155, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,212, 54, 16, 0, 0, 0,194, 0, 0, 0, 1, 4,212,135,128, 4,212, 51, 64,
+ 4,212, 45, 64, 4,212, 45,192, 4,212, 46, 0, 4,212, 44,128, 0, 0, 0, 0, 0, 0, 6, 65, 0, 0, 7,128, 0, 0, 0, 0,
+ 0, 0, 3,159, 4, 4, 1, 64, 3,160, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 2, 23,151,128, 4,212,134,128, 4,212,134,128,
+ 4,212, 54,160, 4,212, 55,192, 0, 0, 0, 0, 0, 0, 0, 0, 2, 21, 14,224, 10, 62,163, 32, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,212, 54,160, 0, 0, 0,195, 0, 0, 0, 1, 4,212, 55,192, 0, 0, 0, 0, 0, 0, 0, 0, 67,160, 0, 0, 0, 0, 0, 0,
+ 65,208, 0, 0, 0, 0, 0, 0, 67,160, 0, 0, 0, 0, 0, 0, 65,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 63, 0, 0, 0, 0,
+ 0, 0, 0, 30, 67,137,128, 0, 65,200, 0, 0, 67,137,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1, 64, 0, 31, 1, 64, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6, 65, 0, 0, 7,128, 0, 0, 3,129, 0, 0, 3,159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 64, 0, 31, 0, 3, 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, 0,
+ 2, 23,153,240, 2, 20,235, 96, 2, 20,235, 96, 0, 0, 0, 0, 0, 0, 0, 0, 4,217, 22,128, 4,218,180,224, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212, 55,192, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212, 54,160,
+ 0, 0, 0, 0, 67,160, 0, 0,196, 96, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,151,128, 0,196, 96, 64, 0, 0, 0, 0, 0,
+ 0, 0, 1, 47, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 3,128, 0, 0, 0, 0, 0, 0, 1, 74, 0, 0, 0, 0, 0, 0, 0, 17,
+ 0, 0, 0, 0, 0, 0, 1, 46, 0, 0, 0, 0, 0, 0, 3,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 64, 0, 0, 0, 3, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 1, 64, 3,129, 1, 47, 3,129, 0, 0,
+ 10, 62,153, 32, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 6, 65, 0, 0, 7,128, 0, 0, 0, 0, 0, 0, 3,128, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 3,129, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,152, 64, 9,187,150, 16, 10, 60,131, 0, 4,212, 56,224, 4,212,133, 16,
+ 4,218,181,224, 4,218,184,224, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 56,224, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212, 58, 80, 0, 0, 0, 0, 2, 23,152,208, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
+111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
+111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,220, 1, 47, 0, 36, 0, 0, 0, 0,
+ 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 58, 80, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 59,192, 4,212, 56,224,
+ 9, 88,241,224, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 65, 1, 61, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 43, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,135, 1, 47, 0, 61, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 43,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212, 59,192, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 61, 48, 4,212, 58, 80, 9, 88,243,144, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,
+114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,111,
+ 1, 47, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,136, 40,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 42,253, 2, 0, 0, 0, 0,
-232, 38,253, 2, 0, 0, 0, 0,120, 51,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 65, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 61, 48, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212, 62,160, 4,212, 59,192, 9, 89, 1, 16, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
+105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
+105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,140, 1, 47, 0,203, 0, 0, 0, 0, 0, 0, 0, 6,
+ 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 42,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,200, 43,253, 2, 0, 0, 0, 0,136, 40,253, 2, 0, 0, 0, 0, 8, 70,110, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 62,160, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 64, 16, 4,212, 61, 48, 9, 88,253,176,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 65, 1,203, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 45, 0, 0, 0,
+ 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,254, 58, 1, 47, 0, 58, 0, 20, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,200, 43,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 45,253, 2, 0, 0, 0, 0,
- 40, 42,253, 2, 0, 0, 0, 0, 56, 68,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 64, 16,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212, 65,128, 4,212, 62,160, 9, 88,255, 96, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105,
- 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 65, 1, 58, 0,
- 20, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 45,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 8, 47,253, 2, 0, 0, 0, 0,200, 43,253, 2, 0, 0, 0, 0, 24, 71,145, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0,108,117,114, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 65, 1, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 47, 0, 0, 0,
+ 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32,
+ 77,111,116,105,111,110, 32, 66,108,117,114, 0,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 34, 1, 47, 0, 0,
+ 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 65,128, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 66,240,
+ 4,212, 64, 16, 9, 88,245, 64, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 8, 47,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 48,253, 2, 0, 0, 0, 0,
-104, 45,253, 2, 0, 0, 0, 0,216, 53,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253, 65, 1,102, 0,
- 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,164, 1, 47, 0,102, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0,
+ 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 48,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 72, 50,253, 2, 0, 0, 0, 0, 8, 47,253, 2, 0, 0, 0, 0,120, 62,145, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212, 66,240, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 68, 96, 4,212, 65,128, 9, 88,250, 80, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253, 65, 1,130, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 49, 0, 0, 0,
+ 0, 0,253, 10, 1, 47, 0,130, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 68, 96, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212, 69,208, 4,212, 66,240, 9, 88,246,240, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
+114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
+114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 72, 50,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 51,253, 2, 0, 0, 0, 0,
-168, 48,253, 2, 0, 0, 0, 0,184, 56,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,
-110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 65, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 52, 1, 47, 0,190, 0, 0, 0, 0,
+ 0, 4, 0, 6, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 51,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,136, 53,253, 2, 0, 0, 0, 0, 72, 50,253, 2, 0, 0, 0, 0,152, 59,145, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 69,208, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 71, 64, 4,212, 68, 96,
+ 9, 88,248,160, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 51, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,218, 1, 47, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 0, 0, 51,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,136, 53,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 55,253, 2, 0, 0, 0, 0,
-232, 51,253, 2, 0, 0, 0, 0, 8, 82,145, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 65, 1, 0, 0,
- 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212, 71, 64, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 72,176, 4,212, 69,208, 9, 89, 2, 48, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,
+112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,194,
+ 1, 47, 0, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 55,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,200, 56,253, 2, 0, 0, 0, 0,136, 53,253, 2, 0, 0, 0, 0,232, 84,145, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 72,176, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212, 74, 32, 4,212, 71, 64, 9, 89, 3,224, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 7, 0, 0, 0, 0, 0, 53, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,170, 1, 47, 0, 0, 0, 0, 0, 0, 0, 4, 0, 7,
+ 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,200, 56,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 58,253, 2, 0, 0, 0, 0,
- 40, 55,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 74, 32, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 75,144, 4,212, 72,176, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,116,101,120,116,117,114,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41,255, 65, 1,179, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 58,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 8, 60,253, 2, 0, 0, 0, 0,200, 56,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,255, 41, 1, 65, 0,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 75,144,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212, 77, 0, 4,212, 74, 32, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,112,112,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102,254, 65, 1,171, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,102, 1, 65, 0,171,
+ 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 77, 0, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 78,112,
+ 4,212, 75,144, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,110,102,108,117,101,110, 99,101,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 8, 60,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 61,253, 2, 0, 0, 0, 0,
-104, 58,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,105,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,105,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,110,102,108,117,101,110, 99,
-101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,213,253, 65, 1, 36, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,110,102,108,117,101,110, 99,101,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,110,102,108,117,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 61,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 72, 63,253, 2, 0, 0, 0, 0, 8, 60,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,213, 1, 65, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212, 78,112, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 79,224, 4,212, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0,
+ 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0,
+ 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,252,103, 1, 65, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 72, 63,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 64,253, 2, 0, 0, 0, 0,
-168, 61,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,101,118,105,101,119, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 79,224, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212, 81, 80, 4,212, 78,112, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,
+114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,
+114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,101,118,105,101,119, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,254, 65, 1,186, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 87, 1, 65, 0,186, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 64,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,136, 66,253, 2, 0, 0, 0, 0, 72, 63,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 81, 80, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 82,192, 4,212, 79,224,
0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,254, 65, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,136, 66,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 68,253, 2, 0, 0, 0, 0,
-232, 64,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 32, 83, 97,
-109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,253, 65, 1,212, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 3, 1, 65, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 68,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,200, 69,253, 2, 0, 0, 0, 0,136, 66,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,105,110,103,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212, 82,192, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 84, 48, 4,212, 81, 80, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
+ 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
+ 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,115, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,
+101, 32, 83, 97,109,112,108,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 23,
+ 1, 65, 0,212, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101, 95,109, 97,112,112,105,110,103,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 32, 77, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 84, 48, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212, 85,160, 4,212, 82,192, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101,
+ 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,105,109, 97,103,101,
+ 95,109, 97,112,112,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,109, 97,103,101, 32, 77, 97,112,112,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211,253, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,211, 1, 65, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 85,160, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 87, 16, 4,212, 84, 48, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,200, 69,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 71,253, 2, 0, 0, 0, 0,
- 40, 68,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108,111,114,115, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,254, 65, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 71,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 8, 73,253, 2, 0, 0, 0, 0,200, 69,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,254, 63, 1, 65, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 67,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 87, 16,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212, 88,128, 4,212, 85,160, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95, 99,108,111,117,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,108,111,117,100,115, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,161,253, 7, 1,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,161, 1, 7, 0,158,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 88,128, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 89,240,
+ 4,212, 87, 16, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,119,111,111,100, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 8, 73,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 74,253, 2, 0, 0, 0, 0,
-104, 71,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,119,111,111,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,119,111,111,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,111,111,100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,119,111,111,100, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139,253, 7, 1,180, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,111,111,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,139, 1, 7, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 74,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 72, 76,253, 2, 0, 0, 0, 0, 8, 73,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212, 89,240, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 91, 96, 4,212, 88,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0,
+ 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 80,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 80,108,117,103,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0,
+ 0, 0,254, 27, 1, 7, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 91, 96, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212, 92,208, 4,212, 89,240, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,118,
+111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,118,
+111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,111,114,111,110,111,105, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 72, 76,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 77,253, 2, 0, 0, 0, 0,
-168, 74,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,118,111,114,111,110,111,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,111,114,111,110,111,105, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,123, 1, 7, 0,196, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,123,253, 7, 1,196, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 77,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,136, 79,253, 2, 0, 0, 0, 0, 72, 76,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 92,208, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 94, 64, 4,212, 91, 96,
0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 80,111,105,110,116, 32, 68,101,110,115,105,116,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,253, 7, 1,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,136, 79,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 81,253, 2, 0, 0, 0, 0,
-232, 77,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,116,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,116,117,114, 98,117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,117,114, 98,117,108,101,110,
- 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,253, 7, 1,102, 0,
- 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,140, 1, 7, 0,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 81,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,200, 82,253, 2, 0, 0, 0, 0,136, 79,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212, 94, 64, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 95,176, 4,212, 92,208, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
+ 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,116,117,114, 98,117,108,101,110, 99,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84,
+ 85, 82, 69, 95, 80, 84, 95,112,111,105,110,116,100,101,110,115,105,116,121, 95,116,117,114, 98,117,108,101,110, 99,101, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,117,114, 98,
+117,108,101,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 14,
+ 1, 7, 0,102, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,139,253, 7, 1,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 95,176, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212, 97, 32, 4,212, 94, 64, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114,
+ 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109,117,115,103,114,
+ 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,117,115,103,114, 97,118,101, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,139, 1, 7, 0,180, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,200, 82,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 84,253, 2, 0, 0, 0, 0,
- 40, 81,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,109, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,109, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,114, 98,108,101, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,253, 7, 1,183, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 97, 32, 0, 0, 0,193, 0, 0, 0, 1, 4,212, 98,144, 4,212, 95,176, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 84,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 8, 86,253, 2, 0, 0, 0, 0,200, 82,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 77, 97,114, 98,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,253,136, 1, 7, 0,183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27,254, 7, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212, 98,144,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212,100, 0, 4,212, 97, 32, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
+ 80, 84, 95,109, 97,103,105, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,103,105, 99, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 27, 1, 7, 0, 36,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 8, 86,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168, 87,253, 2, 0, 0, 0, 0,
-104, 84,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,100,105,115,116,111,114,116,101,100,110,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,100,105,115,116,111,114,116,101,100,110,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,116,111,114,116,101,
-100, 32, 78,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,211,253, 7, 1,108, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,100, 0, 0, 0, 0,193, 0, 0, 0, 1, 4,212,101,112,
+ 4,212, 98,144, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,100,105,115,116,111,114,116,101,100,
+110,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,100,105,115,116,111,114,116,101,100,
+110,111,105,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,116,111,114,116,101,100, 32, 78,111,105,115,101, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,211, 1, 7, 0,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168, 87,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 72, 89,253, 2, 0, 0, 0, 0, 8, 86,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212,101,112, 0, 0, 0,193, 0, 0, 0, 1, 4,212,102,224, 4,212,100, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95, 98,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66,108,101,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,254, 7, 1, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0,254, 2, 1, 7, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,102,224, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212,104, 80, 4,212,101,112, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,115,
+116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95, 80, 84, 95,115,
+116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 72, 89,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232, 90,253, 2, 0, 0, 0, 0,
-168, 87,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 88, 84, 85, 82, 69, 95,
- 80, 84, 95,115,116,117, 99, 99,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,117, 99, 99,105, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,183, 1, 7, 0,136, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,183,253, 7, 1,136, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232, 90,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,136, 92,253, 2, 0, 0, 0, 0, 72, 89,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,104, 80, 0, 0, 0,193, 0, 0, 0, 1, 4,212,105,192, 4,212,102,224,
0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,109,111,100,105,102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 77,111,100,105,102,105,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,160, 0,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,136, 92,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40, 94,253, 2, 0, 0, 0, 0,
-232, 90,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
- 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
- 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212,105,192, 0, 0, 0,193, 0, 0, 0, 1, 4,212,107, 48, 4,212,104, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,255,209, 0, 36, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,184,
+ 0,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40, 94,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,200, 95,253, 2, 0, 0, 0, 0,136, 92,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,115,
-104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 95,109,101,115,
-104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,107, 48, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212,108,160, 4,212,105,192, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,
+114,111,112,115, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,
+114,111,112,115, 95,109,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,
+115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,160, 0,209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,255,209, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212,108,160, 0, 0, 0,193, 0, 0, 0, 1, 4,212,110, 16, 4,212,107, 48, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,110,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,110,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,200, 95,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104, 97,253, 2, 0, 0, 0, 0,
- 40, 94,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
-110,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
-110,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,111,114,109, 97,108,115, 0,
+ 0, 0, 0, 0, 78,111,114,109, 97,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78,255,209, 0, 58, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,255, 78, 0,209, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104, 97,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 8, 99,253, 2, 0, 0, 0, 0,200, 95,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,110, 16,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212,111,128, 4,212,108,160, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
+115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,101,116,116,105,110,103,115,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 18, 0,209, 0, 36,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83,101,116,116,105,110,103,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18,255,209, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,111,128, 0, 0, 0,193, 0, 0, 0, 1, 4,212,112,240,
+ 4,212,110, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95,103,114,111,117,112,
+115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95,103,114,111,117,112,
+115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,101,114,116,101,120, 32, 71,114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,174, 0,209, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212,112,240, 0, 0, 0,193, 0, 0, 0, 1, 4,212,114, 96, 4,212,111,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 8, 99,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,100,253, 2, 0, 0, 0, 0,
-104, 97,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
-118,101,114,116,101,120, 95,103,114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
-118,101,114,116,101,120, 95,103,114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,101,114,116,101,120, 32, 71,
-114,111,117,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,174,254,209, 0, 76, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,100,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 72,102,253, 2, 0, 0, 0, 0, 8, 99,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0, 0, 0, 0, 0,
+ 83,104, 97,112,101, 32, 75,101,121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,115,104, 97,112,101, 95,107,101,121,115, 0, 0, 0, 0, 0, 0,
+ 0, 0,254, 74, 0,209, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,112,101, 32, 75,101,121,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,114, 96, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212,115,208, 4,212,112,240, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,117,118, 95,116,
+101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,117,118, 95,116,
+101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 32, 84,101,120,116,117,114,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74,254,209, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,237, 0,209, 0, 69, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 72,102,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,103,253, 2, 0, 0, 0, 0,
-168,100,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
-117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,
-117,118, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 32, 84,101,120,116,117,
-114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,237,253,209, 0, 69, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,103,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,136,105,253, 2, 0, 0, 0, 0, 72,102,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,115,208, 0, 0, 0,193, 0, 0, 0, 1, 4,212,117, 64, 4,212,114, 96,
0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95, 99,111,108,111,114,115, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 95, 80, 84, 95,118,101,114,116,101,120, 95, 99,111,108,111,114,115, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 86,101,114,116,101,120, 32, 67,111,108,111,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,253,209, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,136,105,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,107,253, 2, 0, 0, 0, 0,
-232,103,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,144, 0,209, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94,255, 65, 1,126, 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, 2, 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, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212,117, 64, 0, 0, 0,193, 0, 0, 0, 1, 4,212,118,176, 4,212,115,208, 9, 88,112, 16, 0, 0, 0, 0, 77, 65, 84, 69,
+ 82, 73, 65, 76, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69,
+ 82, 73, 65, 76, 95, 80, 84, 95, 99,111,110,116,101,120,116, 95,109, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,107,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,200,108,253, 2, 0, 0, 0, 0,136,105,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 94,
+ 1, 47, 0,126, 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, 2, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 80,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,118,176, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212,120, 32, 4,212,117, 64, 9, 88,113,192, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,112,114,101,118,
+105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,112,114,101,118,
+105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,254, 65, 1,136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,190, 1, 47, 0,136, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212,120, 32, 0, 0, 0,193, 0, 0, 0, 1, 4,212,121,144, 4,212,118,176, 9, 88,117, 32,
+ 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,100,105,102,102,117,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,200,108,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,110,253, 2, 0, 0, 0, 0,
- 40,107,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95,100,105,102,102,117,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95,100,105,102,102,117,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,102,102,117,115,101, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,103,254, 65, 1, 63, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,100,105,102,102,117,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68,105,102,102,117,115,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,110,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 8,112,253, 2, 0, 0, 0, 0,200,108,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,112,101, 99,117,108, 97,114, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,254,103, 1, 47, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,112,101, 99,117,108, 97,114, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83,112,101, 99,117,108, 97,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,121,144,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212,123, 0, 4,212,120, 32, 9, 88,118,208, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,112,101, 99,117,108, 97,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95,115,112,101, 99,117,108, 97,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,112,101, 99,117,108, 97,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,253, 65, 1, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,252, 1, 47, 0, 83,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,123, 0, 0, 0, 0,193, 0, 0, 0, 1, 4,212,124,112,
+ 4,212,121,144, 9, 88,120,128, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 8,112,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,113,253, 2, 0, 0, 0, 0,
-104,110,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,148,253, 65, 1, 80, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,148, 1, 47, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,113,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 72,115,253, 2, 0, 0, 0, 0, 8,112,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,116,114, 97,110,115,112, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212,124,112, 0, 0, 0,193, 0, 0, 0, 1, 4,212,125,224, 4,212,123, 0, 9, 88,122, 48, 0, 0, 0, 0,
+ 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,116,114, 97,110,115,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,116,114, 97,110,115,112, 0, 0, 0, 0, 0, 0,
+ 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,116,114, 97,110,115,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,112, 97,114,101,110, 99,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84,114, 97,110,115,112, 97,114,101,110, 99,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124,253, 65, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0,253,124, 1, 47, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,125,224, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212,127, 80, 4,212,124,112, 9, 88,123,224, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,
+109,105,114,114,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,
+109,105,114,114,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,105,114,114,111,114, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 72,115,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,116,253, 2, 0, 0, 0, 0,
-168,113,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95,109,105,114,114,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95,109,105,114,114,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77,105,114,114,111,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,100, 1, 47, 0, 0, 0, 20, 0, 0,
+ 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,253, 65, 1, 0, 0,
- 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,116,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,136,118,253, 2, 0, 0, 0, 0, 72,115,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,127, 80, 0, 0, 0,193, 0, 0, 0, 1, 4,212,128,192, 4,212,125,224,
+ 9, 88,125,144, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 83,117, 98,115,117,114,102, 97, 99,101, 32, 83, 99, 97,116,116,101,114,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,253, 65, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 76, 1, 47, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212,128,192, 0, 0, 0,193, 0, 0, 0, 1, 4,212,130, 48, 4,212,127, 80, 9, 88,131, 48, 0, 0, 0, 0, 77, 65, 84, 69,
+ 82, 73, 65, 76, 95, 80, 84, 95,115,116,114, 97,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69,
+ 82, 73, 65, 76, 95, 80, 84, 95,115,116,114, 97,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,114, 97,
+110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 52,
+ 1, 47, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,136,118,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,120,253, 2, 0, 0, 0, 0,
-232,116,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95,115,116,114, 97,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95,115,116,114, 97,110,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,114, 97,110,100, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,253, 65, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,130, 48, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212,131,160, 4,212,128,192, 9, 88,132,224, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,111,112,116,105,
+111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,111,112,116,105,
+111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 76, 1, 47, 0,208, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,120,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,200,121,253, 2, 0, 0, 0, 0,136,118,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212,131,160, 0, 0, 0,193, 0, 0, 0, 1, 4,212,133, 16, 4,212,130, 48, 9, 88,134,144,
+ 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95,115,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,252, 65, 1,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 0, 0, 83,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,252, 52, 1, 47, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,200,121,253, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,123,253, 2, 0, 0, 0, 0,
- 40,120,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95,115,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,133, 16,
+ 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 4,212,131,160, 9, 88,147,128, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
+ 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76,
- 95, 80, 84, 95,115,104, 97,100,111,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,111,119, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,252, 65, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,123,253, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,121,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 84, 69, 82, 73, 65, 76, 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28,252, 65, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,248, 0, 0, 0, 8,125,253, 2, 0, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 8,132,253, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 0, 0, 0, 0, 0, 24, 31,101, 4, 0, 0, 0, 0,
-255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72,126,253, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,184,127,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 32,209, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0, 0,209, 68, 0, 0,200, 65, 0, 0,209, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,137, 6, 26, 0,137, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 6, 0, 0,149, 3, 0, 0,174, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,137, 6, 26, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,127,253, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 40,129,253, 2, 0, 0, 0, 0, 72,126,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 67,
- 0, 64,101,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 67, 0, 64,101,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0,
- 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0,
- 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,240, 0,149, 3,223, 0,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,240, 0,149, 3, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,129,253, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,152,130,253, 2, 0, 0, 0, 0,184,127,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,179, 68,
- 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 5, 0, 0,
- 0, 0, 0, 0, 59, 0, 0, 0, 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68, 0, 0,108, 66, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,153, 5, 60, 0,153, 5, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 89, 3, 0, 0,148, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 60, 0, 0, 0, 4, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,130,253, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,129,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,175, 68,
- 0, 0,137,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177, 68, 0, 64, 86,196, 0, 0, 0, 0,136, 5, 0, 0,153, 5, 0, 0,
- 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0,135, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,135, 5, 0, 0,
- 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 2, 2, 0, 0, 2, 0, 3, 3, 2, 0, 0, 4, 6, 0,153, 5, 89, 3,136, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,240, 0, 0, 0,136, 6, 0, 0, 0, 0, 0, 0, 88, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,153, 5, 89, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,104, 0, 0, 0, 8,132,253, 2, 0, 0, 0, 0,
-162, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,125,253, 2, 0, 0, 0, 0, 72,126,253, 2, 0, 0, 0, 0,
-152,130,253, 2, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 5, 0,255,255,255,255, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,184,132,253, 2, 0, 0, 0, 0,
-194, 0, 0, 0, 1, 0, 0, 0,168,137,253, 2, 0, 0, 0, 0,120, 33,253, 2, 0, 0, 0, 0,136, 16,253, 2, 0, 0, 0, 0,
-232, 20,253, 2, 0, 0, 0, 0, 88, 21,253, 2, 0, 0, 0, 0, 40, 19,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 15, 15, 44, 6, 96, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-168,239,224, 2, 0, 0, 0, 0,136,136,253, 2, 0, 0, 0, 0,136,136,253, 2, 0, 0, 0, 0,168,133,253, 2, 0, 0, 0, 0,
- 24,135,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,240, 13, 3, 0, 0, 0, 0,
-104, 14,160, 4, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,133,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 24,135,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 44, 6, 26, 0, 6, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-184,241,224, 2, 0, 0, 0, 0, 40, 61,102, 4, 0, 0, 0, 0, 40, 61,102, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 72,235,215, 4, 0, 0, 0, 0, 40, 11, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,135,253, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,168,133,253, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,
-112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 18, 0, 0, 0, 69, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2,
- 4, 0, 0, 4, 8, 0, 44, 6, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 43, 6, 0, 0, 26, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 44, 6, 70, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-200,240,224, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,104, 12, 14, 3, 0, 0, 0, 0,232, 17, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,136,136,253, 2, 0, 0, 0, 0,170, 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,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
-168,137,253, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 40, 66,254, 2, 0, 0, 0, 0,184,132,253, 2, 0, 0, 0, 0,
- 8, 20,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,184, 18,253, 2, 0, 0, 0, 0,120, 20,253, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0, 53, 3, 0, 0,231, 3, 0, 0, 3, 3, 82, 1,179, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 8, 0,168,236,224, 2, 0, 0, 0, 0,120,141,253, 2, 0, 0, 0, 0,120,141,253, 2, 0, 0, 0, 0,
-152,138,253, 2, 0, 0, 0, 0, 8,140,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,252, 13, 3, 0, 0, 0, 0, 8, 75,223, 4, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,138,253, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 8,140,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,169, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 1, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 66, 67, 0, 0,200, 65, 0, 0, 66, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 82, 1, 26, 0, 82, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0,206, 3, 0, 0,231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 1, 26, 0, 8, 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, 0, 0,184,238,224, 2, 0, 0, 0, 0, 72,244,101, 4, 0, 0, 0, 0, 72,244,101, 4, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,191,216, 4, 0, 0, 0, 0, 72, 23, 14, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,140,253, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,138,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,131, 67,
- 0, 0,232,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,160, 67, 0, 0, 7,195, 0, 0, 0, 0, 65, 1, 0, 0, 82, 1, 0, 0,
- 18, 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0,
- 18, 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 82, 1,153, 0, 65, 1,135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 45, 6, 0, 0,126, 7, 0, 0, 53, 3, 0, 0,205, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 1,153, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,200,237,224, 2, 0, 0, 0, 0,216,171,101, 4, 0, 0, 0, 0,216,171,101, 4, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 0,159, 4, 0, 0, 0, 0,232, 26, 14, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0,120,141,253, 2, 0, 0, 0, 0,
-163, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 83,115, 4, 0, 0, 0, 0, 56, 83,115, 4, 0, 0, 0, 0,
-216,142,253, 2, 0, 0, 0, 0, 0,115,101, 32, 83, 99,117,108,112,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 3, 0,
- 68, 65, 84, 65, 16, 0, 0, 0,216,142,253, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0, 42, 11, 0, 0, 42, 11, 0, 0,
- 56,143,253, 2, 0, 0, 0, 0, 68, 65, 84, 65,160,178, 0, 0, 56,143,253, 2, 0, 0, 0, 0,216, 0, 0, 0, 42, 11, 0, 0,
- 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
- 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 72,220,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,232,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,232,226,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 72,214,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 0, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 2, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 4, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 6, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 8, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 10, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 12, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 14, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 16, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 18, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 20, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 22, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 24, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 26, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 28, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 30, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 32, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 34, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 36, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 38, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 40, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 42, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 44, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 46, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 48, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 50, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 52, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 54, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 56, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 58, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 60, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 62, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 64, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 66, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 31, 0, 68, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 30, 0,255,255, 3, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
- 30, 0,255,255, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 40,207,255, 2, 0, 0, 0, 0,
- 31, 0, 0, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 2, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 4, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 6, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 8, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 10, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 12, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 14, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 16, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 18, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 20, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 22, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 24, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 26, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 28, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 30, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 32, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 34, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 36, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 38, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 40, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 42, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 44, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 46, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 48, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 50, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 52, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 54, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 56, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 58, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 60, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 62, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 64, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 66, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 68, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 70, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 72, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 74, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 76, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 78, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 80, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 82, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0,
- 31, 0, 0, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 2, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 4, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 6, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 8, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 10, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 12, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 14, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 16, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 18, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 20, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 22, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 24, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 26, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 28, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 30, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 32, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 34, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 36, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 38, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 40, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 42, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 44, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 46, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 48, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 50, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 31, 0, 0, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 2, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 4, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 6, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 8, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 10, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 12, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 14, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 16, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 18, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 20, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 22, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 24, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 26, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 28, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 30, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 32, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 34, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 36, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 38, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 40, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 42, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 44, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 46, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 48, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 50, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 52, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 54, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 56, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 58, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 60, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 62, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 64, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 66, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 68, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 70, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 72, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 74, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 76, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 78, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 80, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 82, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 84, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 86, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 88, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 90, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 92, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 94, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,
- 31, 0, 96, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 21, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 23, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 25, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 27, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 29, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 31, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 33, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 34, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 35, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 36, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 37, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 38, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 39, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 40, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 41, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 42, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 43, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 44, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 45, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 46, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 47, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 48, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 49, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 50, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 51, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 52, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 53, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 54, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 55, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 56, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 57, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 58, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 59, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 60, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 61, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 62, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 63, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 64, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 65, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 66, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 67, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 68, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 69, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 70, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 71, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 72, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 73, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 74, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 75, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 76, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 77, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 78, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 79, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 80, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 81, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 82, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 83, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 84, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 85, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 86, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 87, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 88, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 89, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 90, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 91, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 92, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 93, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 94, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 95, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 31, 0, 96, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0,
- 31, 0, 0, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 2, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 4, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 6, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 8, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 10, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 12, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 14, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 16, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 18, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 20, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 22, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 24, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 26, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 28, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 30, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 32, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 34, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 35, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 36, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 37, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 38, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 39, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 40, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 41, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 42, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 43, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 44, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 45, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 46, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 47, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 48, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 49, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 50, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 51, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 52, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 53, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 54, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 55, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 56, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 57, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 58, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 59, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 60, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 61, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 62, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 63, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 64, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 65, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 66, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 67, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 68, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 69, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 70, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 71, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 72, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 73, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 74, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 75, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 76, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 77, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 78, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 79, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 80, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 81, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 82, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 83, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 84, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 85, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 86, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 87, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 88, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 89, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 90, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 91, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 92, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 93, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 94, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 95, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0,
- 31, 0, 96, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,168, 63,252, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0, 88,163,252, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 0, 0, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
- 31, 0, 2, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
- 31, 0, 4, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
- 31, 0, 6, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
- 31, 0, 8, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0,
- 31, 0, 10, 0, 1, 0, 0, 0, 24, 61,252, 2, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 31, 0, 1, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 31, 0, 3, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 31, 0, 5, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 31, 0, 7, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 31, 0, 9, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 31, 0, 11, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 31, 0, 13, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 31, 0, 15, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 31, 0, 17, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 31, 0, 19, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0, 40, 66,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-168,137,253, 2, 0, 0, 0, 0,232, 20,253, 2, 0, 0, 0, 0, 72, 18,253, 2, 0, 0, 0, 0,152, 19,253, 2, 0, 0, 0, 0,
- 88, 21,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 97, 0, 0, 0,231, 3, 0, 0,
- 1, 1, 44, 6,135, 3, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0,168,242,224, 2, 0, 0, 0, 0, 88,102,254, 2, 0, 0, 0, 0,
-216,126,254, 2, 0, 0, 0, 0, 24, 67,254, 2, 0, 0, 0, 0, 56, 97,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,184, 18, 14, 3, 0, 0, 0, 0,184, 95,216, 4, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 24, 67,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,136, 68,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 64,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,197, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 43, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 44, 6, 26, 0, 44, 6, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 6, 0, 0, 97, 0, 0, 0,122, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 6, 26, 0, 10, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,253,224, 2, 0, 0, 0, 0, 72,102,101, 4, 0, 0, 0, 0,
- 72,102,101, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,229,114, 4, 0, 0, 0, 0,
-136, 35, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-136, 68,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,184, 92,254, 2, 0, 0, 0, 0, 24, 67,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 32, 67, 0, 0, 37,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255, 63, 37,196, 0, 0, 0, 0,
-143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,148, 2, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,148, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,149, 2,143, 0,149, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0, 83, 1, 0, 0,231, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,149, 2, 11, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0,
-160, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,249,224, 2, 0, 0, 0, 0,200,132,101, 4, 0, 0, 0, 0,
-200,132,101, 4, 0, 0, 0, 0,248, 69,254, 2, 0, 0, 0, 0, 24, 91,254, 2, 0, 0, 0, 0,136, 53,219, 4, 0, 0, 0, 0,
- 56, 39, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-248, 69,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,152, 71,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232, 29,149, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
-111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
-111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22,254,143, 0,210, 1, 0, 0, 0, 0, 0, 0, 39, 0,
- 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 71,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
- 56, 73,254, 2, 0, 0, 0, 0,248, 69,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,211,254,143, 0, 21, 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
- 56, 73,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,216, 74,254, 2, 0, 0, 0, 0,152, 71,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
- 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
- 98,114,117,115,104, 95,116,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,252,143, 0,213, 1, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 74,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
-120, 76,254, 2, 0, 0, 0, 0, 56, 73,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83,116,114,111,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 66,254,143, 0,121, 0, 0, 0, 0, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-120, 76,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 78,254, 2, 0, 0, 0, 0,216, 74,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 95, 80, 84, 95, 99,117,115,116,111,109, 95,112,114,111,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,115,116,111,109, 32, 80,
+114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 28, 1, 47, 0, 0,
+ 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 4,212,134,128, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 0, 1,
+ 0, 0, 0, 0, 9,190,172, 32, 0, 0, 21,255, 0, 0, 0,160, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,212,135,128,
+ 0, 0, 0,194, 0, 0, 0, 1, 4,212,139, 64, 4,212, 54, 16, 4,212, 43,192, 4,212, 46, 64, 4,212, 46,128, 4,212, 45, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 63, 0, 0, 0, 0, 0, 0, 0,123, 15, 15, 6, 64, 0,124, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 23,122, 48, 4,212,138, 80, 4,212,138, 80, 4,212,136, 16, 4,212,137, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 9,182,166, 64, 9,182,163,176, 68, 65, 84, 65, 0, 0, 0,248, 4,212,136, 16, 0, 0, 0,195, 0, 0, 0, 1, 4,212,137, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68,140, 32, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,200, 0, 0, 0, 0, 0, 0,
+ 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 63, 0, 0, 0, 0, 0, 0, 0, 25, 68,202,224, 0, 65,200, 0, 0, 68,202,224, 0,
+ 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 6, 64, 0, 26, 6, 64,
+ 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 63, 0, 0, 0, 0, 0, 0, 0, 25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 64, 0, 26, 0, 5, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,123,128, 9,187,123, 96, 9,187,123, 96, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,218,185,224, 4,218,190,224, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,137, 48,
+ 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212,136, 16,192, 64, 0, 0, 67,126, 0, 0, 0, 0, 0, 0, 66, 72, 0, 0,
+194,103,218, 88, 67,141,147, 40, 0, 0, 0, 0, 66, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 63, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 6, 63, 0, 0, 0, 18, 0, 0, 0, 97,
+ 63,128, 0, 0, 66, 72, 0, 0, 72,146,124, 0, 66, 72, 0, 0, 61,204,204,205, 65, 32, 0, 0, 0, 72, 0, 0, 0, 0, 2, 0,
+ 0, 4, 4, 0, 0, 8, 6, 64, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6, 63, 0, 0, 0, 26, 0, 0, 0,123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 64, 0, 98,
+ 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,122,240,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,218,191,224, 2, 21, 2,112, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,188, 4,212,138, 80, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 68, 65, 84, 65, 0, 0, 0, 96, 4,212,139, 64, 0, 0, 0,194,
+ 0, 0, 0, 1, 4,212,143,112, 4,212,135,128, 4,212, 45,192, 4,212, 45,128, 4,212, 45, 0, 4,212, 46, 0, 0, 0, 0, 0,
+ 0, 0, 6, 65, 0, 0, 7,128, 0, 0, 3,161, 0, 0, 4,100, 3, 3, 1, 64, 0,196, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,
+ 2, 23,120, 80, 4,212,142, 16, 4,212,142, 16, 4,212,139,208, 4,212,140,240, 0, 0, 0, 0, 0, 0, 0, 0, 10, 62,166,160,
+ 9,190,175,144, 68, 65, 84, 65, 0, 0, 0,248, 4,212,139,208, 0, 0, 0,195, 0, 0, 0, 1, 4,212,140,240, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67,244,128, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 67,160, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 63, 0, 0, 0, 0, 0, 0, 0, 25, 67, 66, 0, 0, 65,200, 0, 0, 67, 66, 0, 0, 65,200, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1, 64, 0, 26, 1, 64, 0, 26, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 65, 0, 0, 7,128, 0, 0, 4, 75, 0, 0, 4,100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0, 26, 0, 7, 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, 0, 2, 23,121,160, 9,187,113,240, 9,187,113,240, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,217, 20,160, 2, 22,237, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,140,240, 0, 0, 0,195,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,212,139,208, 0, 0, 0, 0, 67,131,128, 0,194,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67,151,128, 0,195, 24, 0, 0, 0, 0, 0, 0, 0, 0, 1, 47, 0, 0, 1, 64, 0, 0, 0, 18, 0, 0, 0,169, 0, 0, 0, 0,
+ 0, 0, 1, 46, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1, 46, 0, 0, 0, 18, 0, 0, 0,169, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 6, 18, 0, 0, 0, 2, 3, 3, 0, 0, 4, 12,
+ 0, 6, 1, 64, 0,170, 1, 47, 0,152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 65, 0, 0, 7,128,
+ 0, 0, 3,161, 0, 0, 4, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 64, 0,170, 0, 8, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,121, 16, 9,187,117,144,
+ 9,187,117,144, 0, 0, 0, 0, 0, 0, 0, 0, 4,217, 13, 64, 4,209,111,128, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0,244, 4,212,142, 16, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 9,188, 90,160, 9,188, 90,160, 4,212,143, 48, 0,115,101, 32, 83, 99,117,108,112,116, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 0, 0, 0, 12, 4,212,143, 48, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 11, 42, 0, 0, 11, 42,
+ 2,116,176, 32, 68, 65, 84, 65, 0, 0,133,248, 2,116,176, 32, 0, 0, 0,216, 0, 0, 11, 42, 0, 0, 0, 0, 0, 2, 0, 1,
+ 2,152,190, 32, 0, 19, 0, 0, 0, 1, 0, 1, 2,152,190, 32, 0, 20, 0, 0, 0, 1, 0, 1, 2,152,190, 32, 0, 21, 0, 1,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,120,240, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,202, 32,
+ 0, 0, 0, 0, 0, 1, 0, 1, 4,213,128,192, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,214, 32, 0, 0, 0, 0, 0, 1, 0, 1,
+ 4,213,127, 16, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,208, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,117,128, 0, 0, 0, 0,
+ 0, 1, 0, 1, 2,152,196, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,116,240, 0, 21, 0, 0, 0, 1, 0, 1, 2,152,190, 32,
+ 0, 30,255,255, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 1, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 4,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 7, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 9, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 12,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 15, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 17, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 20,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 23, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 25, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 28,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 31, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 33, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 36,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 39, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 41, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 44,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 47, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,152,190, 32, 0, 30,255,255, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 2,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 5, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 7, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 10,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 13, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 15, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 18,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 21, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 23, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 26,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 29, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 31, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 34,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,152,190, 32,
+ 0, 31, 0, 37, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,152,190, 32, 0, 31, 0, 39, 0, 1, 0, 0,
+ 2,152,190, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,152,190, 32, 0, 30,255,255, 0, 1, 0, 0, 2,152,254, 32, 0, 30,255,255,
+ 0, 1, 0, 0, 2,153, 2, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 6, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 10, 32,
+ 0, 30,255,255, 0, 1, 0, 0, 2,153, 14, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 18, 32, 0, 30,255,255, 0, 1, 0, 0,
+ 2,153, 22, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 26, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 30, 32, 0, 30,255,255,
+ 0, 1, 0, 0, 2,153, 34, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 38, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 42, 32,
+ 0, 30,255,255, 0, 1, 0, 0, 2,153, 46, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 50, 32, 0, 30,255,255, 0, 1, 0, 0,
+ 2,153, 54, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 58, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 62, 32, 0, 30,255,255,
+ 0, 1, 0, 0, 2,153, 66, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 70, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 74, 32,
+ 0, 30,255,255, 0, 1, 0, 0, 2,153, 78, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 82, 32, 0, 30,255,255, 0, 1, 0, 0,
+ 2,153, 86, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 90, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153, 94, 32, 0, 30,255,255,
+ 0, 1, 0, 0, 2,153, 98, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153,102, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153,106, 32,
+ 0, 30,255,255, 0, 1, 0, 0, 2,153,110, 32, 0, 30,255,255, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 0, 0, 1, 0, 0,
+ 2,152,254, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 3,
+ 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,152,254, 32,
+ 0, 31, 0, 6, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 8, 0, 1, 0, 0,
+ 2,152,254, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 11,
+ 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,152,254, 32,
+ 0, 31, 0, 14, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 16, 0, 1, 0, 0,
+ 2,152,254, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 19,
+ 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,152,254, 32,
+ 0, 31, 0, 22, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 24, 0, 1, 0, 0,
+ 2,152,254, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 27,
+ 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,152,254, 32,
+ 0, 31, 0, 30, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 32, 0, 1, 0, 0,
+ 2,152,254, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 35,
+ 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,152,254, 32,
+ 0, 31, 0, 38, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 40, 0, 1, 0, 0,
+ 2,152,254, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 43,
+ 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,152,254, 32,
+ 0, 31, 0, 46, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 48, 0, 1, 0, 0,
+ 2,152,254, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 51,
+ 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,152,254, 32,
+ 0, 31, 0, 54, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 56, 0, 1, 0, 0,
+ 2,152,254, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 59,
+ 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,152,254, 32,
+ 0, 31, 0, 62, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 64, 0, 1, 0, 0,
+ 2,152,254, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 67,
+ 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,152,254, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,152,254, 32,
+ 0, 30,255,255, 0, 1, 0, 0, 4,213,116,240, 0, 30,255,255, 0, 1, 0, 0, 4,213,117,128, 0, 30,255,255, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 30,255,255, 0, 1, 0, 0, 4,213,128,192, 0, 30,255,255, 0, 3, 0, 0, 2,152,196, 32, 0, 30,255,255,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 30,255,255, 0, 1, 0, 0, 2,152,208, 32, 0, 30,255,255, 0, 1, 0, 0, 4,211,177,144,
+ 0, 30,255,255, 0, 1, 0, 0, 4,211,245,240, 0, 30,255,255, 0, 1, 0, 0, 4,212, 43, 0, 0, 30,255,255, 0, 1, 0, 0,
+ 4,212,182,208, 0, 30,255,255, 0, 1, 0, 0, 4,212,247,144, 0, 30,255,255, 0, 1, 0, 0, 4,213, 50,160, 0, 30,255,255,
+ 0, 1, 0, 0, 4,213, 74,240, 0, 30,255,255, 0, 1, 0, 0, 4,213,127, 16, 0, 30,255,255, 0, 1, 0, 0, 4,211,175,144,
+ 0, 30,255,255, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 1, 0, 1, 0, 0,
+ 2,153, 2, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 4,
+ 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 2, 32,
+ 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 9, 0, 1, 0, 0,
+ 2,153, 2, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 12,
+ 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 2, 32,
+ 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 17, 0, 1, 0, 0,
+ 2,153, 2, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 20,
+ 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 2, 32,
+ 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 25, 0, 1, 0, 0,
+ 2,153, 2, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 28,
+ 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 2, 32,
+ 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 33, 0, 1, 0, 0,
+ 2,153, 2, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 36,
+ 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 2, 32,
+ 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 41, 0, 1, 0, 0,
+ 2,153, 2, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 44,
+ 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 2, 32,
+ 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 49, 0, 1, 0, 0,
+ 2,153, 2, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 52,
+ 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 2, 32,
+ 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 57, 0, 1, 0, 0,
+ 2,153, 2, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 60,
+ 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 2, 32,
+ 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 65, 0, 1, 0, 0,
+ 2,153, 2, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 68,
+ 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 2, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 6, 32,
+ 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 3, 0, 1, 0, 0,
+ 2,153, 6, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 6,
+ 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 6, 32,
+ 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 11, 0, 1, 0, 0,
+ 2,153, 6, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 14,
+ 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 6, 32,
+ 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 19, 0, 1, 0, 0,
+ 2,153, 6, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 22,
+ 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 6, 32,
+ 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 27, 0, 1, 0, 0,
+ 2,153, 6, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 30,
+ 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 6, 32,
+ 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 35, 0, 1, 0, 0,
+ 2,153, 6, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 38,
+ 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 6, 32,
+ 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 43, 0, 1, 0, 0,
+ 2,153, 6, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 46,
+ 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 6, 32,
+ 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 51, 0, 1, 0, 0,
+ 2,153, 6, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 54,
+ 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 6, 32,
+ 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 59, 0, 1, 0, 0,
+ 2,153, 6, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 62,
+ 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 6, 32,
+ 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 67, 0, 1, 0, 0,
+ 2,153, 6, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 6, 32, 0, 31, 0, 0,
+ 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 10, 32,
+ 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 5, 0, 1, 0, 0,
+ 2,153, 10, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 8,
+ 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 10, 32,
+ 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 13, 0, 1, 0, 0,
+ 2,153, 10, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 16,
+ 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 10, 32,
+ 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 21, 0, 1, 0, 0,
+ 2,153, 10, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 24,
+ 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 10, 32,
+ 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 29, 0, 1, 0, 0,
+ 2,153, 10, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 32,
+ 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 10, 32,
+ 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 37, 0, 1, 0, 0,
+ 2,153, 10, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 40,
+ 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 10, 32,
+ 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 45, 0, 1, 0, 0,
+ 2,153, 10, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 48,
+ 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 10, 32,
+ 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 53, 0, 1, 0, 0,
+ 2,153, 10, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 56,
+ 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 10, 32,
+ 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 61, 0, 1, 0, 0,
+ 2,153, 10, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 64,
+ 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 10, 32,
+ 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 10, 32, 0, 31, 0, 69, 0, 1, 0, 0,
+ 2,153, 10, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 2,
+ 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 14, 32,
+ 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 7, 0, 1, 0, 0,
+ 2,153, 14, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 10,
+ 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 14, 32,
+ 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 15, 0, 1, 0, 0,
+ 2,153, 14, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 18,
+ 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 14, 32,
+ 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 23, 0, 1, 0, 0,
+ 2,153, 14, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 26,
+ 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 14, 32,
+ 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 31, 0, 1, 0, 0,
+ 2,153, 14, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 34,
+ 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 14, 32,
+ 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 39, 0, 1, 0, 0,
+ 2,153, 14, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 42,
+ 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 14, 32,
+ 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 47, 0, 1, 0, 0,
+ 2,153, 14, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 50,
+ 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 14, 32,
+ 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 55, 0, 1, 0, 0,
+ 2,153, 14, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 58,
+ 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 14, 32,
+ 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 63, 0, 1, 0, 0,
+ 2,153, 14, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 66,
+ 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 14, 32,
+ 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 14, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 1, 0, 1, 0, 0,
+ 2,153, 18, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 4,
+ 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 18, 32,
+ 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 9, 0, 1, 0, 0,
+ 2,153, 18, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 12,
+ 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 18, 32,
+ 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 17, 0, 1, 0, 0,
+ 2,153, 18, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 20,
+ 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 18, 32,
+ 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 25, 0, 1, 0, 0,
+ 2,153, 18, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 28,
+ 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 18, 32,
+ 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 33, 0, 1, 0, 0,
+ 2,153, 18, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 36,
+ 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 18, 32,
+ 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 41, 0, 1, 0, 0,
+ 2,153, 18, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 44,
+ 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 18, 32,
+ 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 49, 0, 1, 0, 0,
+ 2,153, 18, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 52,
+ 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 18, 32,
+ 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 57, 0, 1, 0, 0,
+ 2,153, 18, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 60,
+ 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 18, 32,
+ 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 65, 0, 1, 0, 0,
+ 2,153, 18, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 68,
+ 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 18, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 22, 32,
+ 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 3, 0, 1, 0, 0,
+ 2,153, 22, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 6,
+ 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 22, 32,
+ 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 11, 0, 1, 0, 0,
+ 2,153, 22, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 14,
+ 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 22, 32,
+ 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 19, 0, 1, 0, 0,
+ 2,153, 22, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 22,
+ 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 22, 32,
+ 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 27, 0, 1, 0, 0,
+ 2,153, 22, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 30,
+ 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 22, 32,
+ 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 35, 0, 1, 0, 0,
+ 2,153, 22, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 38,
+ 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 22, 32,
+ 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 43, 0, 1, 0, 0,
+ 2,153, 22, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 46,
+ 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 22, 32,
+ 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 51, 0, 1, 0, 0,
+ 2,153, 22, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 54,
+ 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 22, 32,
+ 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 59, 0, 1, 0, 0,
+ 2,153, 22, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 62,
+ 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 22, 32,
+ 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 67, 0, 1, 0, 0,
+ 2,153, 22, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 22, 32, 0, 31, 0, 0,
+ 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 26, 32,
+ 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 5, 0, 1, 0, 0,
+ 2,153, 26, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 8,
+ 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 26, 32,
+ 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 13, 0, 1, 0, 0,
+ 2,153, 26, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 16,
+ 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 26, 32,
+ 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 21, 0, 1, 0, 0,
+ 2,153, 26, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 24,
+ 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 26, 32,
+ 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 29, 0, 1, 0, 0,
+ 2,153, 26, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 32,
+ 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 26, 32,
+ 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 37, 0, 1, 0, 0,
+ 2,153, 26, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 40,
+ 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 26, 32,
+ 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 45, 0, 1, 0, 0,
+ 2,153, 26, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 48,
+ 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 26, 32,
+ 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 53, 0, 1, 0, 0,
+ 2,153, 26, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 56,
+ 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 26, 32,
+ 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 61, 0, 1, 0, 0,
+ 2,153, 26, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 64,
+ 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 26, 32,
+ 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 26, 32, 0, 31, 0, 69, 0, 1, 0, 0,
+ 2,153, 26, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 2,
+ 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 30, 32,
+ 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 7, 0, 1, 0, 0,
+ 2,153, 30, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 10,
+ 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 30, 32,
+ 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 15, 0, 1, 0, 0,
+ 2,153, 30, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 18,
+ 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 30, 32,
+ 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 23, 0, 1, 0, 0,
+ 2,153, 30, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 26,
+ 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 30, 32,
+ 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 31, 0, 1, 0, 0,
+ 2,153, 30, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 34,
+ 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 30, 32,
+ 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 39, 0, 1, 0, 0,
+ 2,153, 30, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 42,
+ 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 30, 32,
+ 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 47, 0, 1, 0, 0,
+ 2,153, 30, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 50,
+ 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 30, 32,
+ 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 55, 0, 1, 0, 0,
+ 2,153, 30, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 58,
+ 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 30, 32,
+ 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 63, 0, 1, 0, 0,
+ 2,153, 30, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 66,
+ 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 30, 32,
+ 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 30, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 1, 0, 1, 0, 0,
+ 2,153, 34, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 4,
+ 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 34, 32,
+ 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 9, 0, 1, 0, 0,
+ 2,153, 34, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 12,
+ 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 34, 32,
+ 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 17, 0, 1, 0, 0,
+ 2,153, 34, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 20,
+ 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 34, 32,
+ 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 25, 0, 1, 0, 0,
+ 2,153, 34, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 28,
+ 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 34, 32,
+ 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 33, 0, 1, 0, 0,
+ 2,153, 34, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 36,
+ 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 34, 32,
+ 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 41, 0, 1, 0, 0,
+ 2,153, 34, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 44,
+ 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 34, 32,
+ 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 49, 0, 1, 0, 0,
+ 2,153, 34, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 52,
+ 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 34, 32,
+ 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 57, 0, 1, 0, 0,
+ 2,153, 34, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 60,
+ 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 34, 32,
+ 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 65, 0, 1, 0, 0,
+ 2,153, 34, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 68,
+ 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 34, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 38, 32,
+ 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 3, 0, 1, 0, 0,
+ 2,153, 38, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 6,
+ 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 38, 32,
+ 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 11, 0, 1, 0, 0,
+ 2,153, 38, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 14,
+ 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 38, 32,
+ 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 19, 0, 1, 0, 0,
+ 2,153, 38, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 22,
+ 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 38, 32,
+ 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 27, 0, 1, 0, 0,
+ 2,153, 38, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 30,
+ 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 38, 32,
+ 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 35, 0, 1, 0, 0,
+ 2,153, 38, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 38,
+ 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 38, 32,
+ 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 43, 0, 1, 0, 0,
+ 2,153, 38, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 46,
+ 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 38, 32,
+ 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 51, 0, 1, 0, 0,
+ 2,153, 38, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 54,
+ 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 38, 32,
+ 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 59, 0, 1, 0, 0,
+ 2,153, 38, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 62,
+ 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 38, 32,
+ 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 67, 0, 1, 0, 0,
+ 2,153, 38, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 38, 32, 0, 31, 0, 0,
+ 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 42, 32,
+ 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 5, 0, 1, 0, 0,
+ 2,153, 42, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 8,
+ 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 42, 32,
+ 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 13, 0, 1, 0, 0,
+ 2,153, 42, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 16,
+ 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 42, 32,
+ 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 21, 0, 1, 0, 0,
+ 2,153, 42, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 24,
+ 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 42, 32,
+ 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 29, 0, 1, 0, 0,
+ 2,153, 42, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 32,
+ 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 42, 32,
+ 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 37, 0, 1, 0, 0,
+ 2,153, 42, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 40,
+ 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 42, 32,
+ 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 45, 0, 1, 0, 0,
+ 2,153, 42, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 48,
+ 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 42, 32,
+ 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 53, 0, 1, 0, 0,
+ 2,153, 42, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 56,
+ 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 42, 32,
+ 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 61, 0, 1, 0, 0,
+ 2,153, 42, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 64,
+ 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 42, 32,
+ 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 42, 32, 0, 31, 0, 69, 0, 1, 0, 0,
+ 2,153, 42, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 2,
+ 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 46, 32,
+ 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 7, 0, 1, 0, 0,
+ 2,153, 46, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 10,
+ 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 46, 32,
+ 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 15, 0, 1, 0, 0,
+ 2,153, 46, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 18,
+ 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 46, 32,
+ 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 23, 0, 1, 0, 0,
+ 2,153, 46, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 26,
+ 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 46, 32,
+ 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 31, 0, 1, 0, 0,
+ 2,153, 46, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 34,
+ 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 46, 32,
+ 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 39, 0, 1, 0, 0,
+ 2,153, 46, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 42,
+ 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 46, 32,
+ 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 47, 0, 1, 0, 0,
+ 2,153, 46, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 50,
+ 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 46, 32,
+ 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 55, 0, 1, 0, 0,
+ 2,153, 46, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 58,
+ 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 46, 32,
+ 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 63, 0, 1, 0, 0,
+ 2,153, 46, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 66,
+ 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 46, 32,
+ 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 46, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 1, 0, 1, 0, 0,
+ 2,153, 50, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 4,
+ 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 50, 32,
+ 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 9, 0, 1, 0, 0,
+ 2,153, 50, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 12,
+ 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 50, 32,
+ 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 17, 0, 1, 0, 0,
+ 2,153, 50, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 20,
+ 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 50, 32,
+ 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 25, 0, 1, 0, 0,
+ 2,153, 50, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 28,
+ 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 50, 32,
+ 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 33, 0, 1, 0, 0,
+ 2,153, 50, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 36,
+ 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 50, 32,
+ 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 41, 0, 1, 0, 0,
+ 2,153, 50, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 44,
+ 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 50, 32,
+ 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 49, 0, 1, 0, 0,
+ 2,153, 50, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 52,
+ 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 50, 32,
+ 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 57, 0, 1, 0, 0,
+ 2,153, 50, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 60,
+ 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 50, 32,
+ 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 65, 0, 1, 0, 0,
+ 2,153, 50, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 68,
+ 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 50, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 54, 32,
+ 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 3, 0, 1, 0, 0,
+ 2,153, 54, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 6,
+ 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 54, 32,
+ 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 11, 0, 1, 0, 0,
+ 2,153, 54, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 14,
+ 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 54, 32,
+ 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 19, 0, 1, 0, 0,
+ 2,153, 54, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 22,
+ 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 54, 32,
+ 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 27, 0, 1, 0, 0,
+ 2,153, 54, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 30,
+ 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 54, 32,
+ 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 35, 0, 1, 0, 0,
+ 2,153, 54, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 38,
+ 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 54, 32,
+ 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 43, 0, 1, 0, 0,
+ 2,153, 54, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 46,
+ 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 54, 32,
+ 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 51, 0, 1, 0, 0,
+ 2,153, 54, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 54,
+ 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 54, 32,
+ 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 59, 0, 1, 0, 0,
+ 2,153, 54, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 62,
+ 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 54, 32,
+ 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 67, 0, 1, 0, 0,
+ 2,153, 54, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 54, 32, 0, 31, 0, 0,
+ 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 58, 32,
+ 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 5, 0, 1, 0, 0,
+ 2,153, 58, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 8,
+ 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 58, 32,
+ 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 13, 0, 1, 0, 0,
+ 2,153, 58, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 16,
+ 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 58, 32,
+ 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 21, 0, 1, 0, 0,
+ 2,153, 58, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 24,
+ 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 58, 32,
+ 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 29, 0, 1, 0, 0,
+ 2,153, 58, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 32,
+ 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 58, 32,
+ 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 37, 0, 1, 0, 0,
+ 2,153, 58, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 40,
+ 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 58, 32,
+ 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 45, 0, 1, 0, 0,
+ 2,153, 58, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 48,
+ 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 58, 32,
+ 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 53, 0, 1, 0, 0,
+ 2,153, 58, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 56,
+ 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 58, 32,
+ 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 61, 0, 1, 0, 0,
+ 2,153, 58, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 64,
+ 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 58, 32,
+ 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 58, 32, 0, 31, 0, 69, 0, 1, 0, 0,
+ 2,153, 58, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 2,
+ 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 62, 32,
+ 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 7, 0, 1, 0, 0,
+ 2,153, 62, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 10,
+ 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 62, 32,
+ 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 15, 0, 1, 0, 0,
+ 2,153, 62, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 18,
+ 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 62, 32,
+ 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 23, 0, 1, 0, 0,
+ 2,153, 62, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 26,
+ 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 62, 32,
+ 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 31, 0, 1, 0, 0,
+ 2,153, 62, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 34,
+ 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 62, 32,
+ 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 39, 0, 1, 0, 0,
+ 2,153, 62, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 42,
+ 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 62, 32,
+ 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 47, 0, 1, 0, 0,
+ 2,153, 62, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 50,
+ 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 62, 32,
+ 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 55, 0, 1, 0, 0,
+ 2,153, 62, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 58,
+ 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 62, 32,
+ 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 63, 0, 1, 0, 0,
+ 2,153, 62, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 66,
+ 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 62, 32,
+ 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 62, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 1, 0, 1, 0, 0,
+ 2,153, 66, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 4,
+ 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 66, 32,
+ 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 9, 0, 1, 0, 0,
+ 2,153, 66, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 12,
+ 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 66, 32,
+ 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 17, 0, 1, 0, 0,
+ 2,153, 66, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 20,
+ 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 66, 32,
+ 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 25, 0, 1, 0, 0,
+ 2,153, 66, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 28,
+ 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 66, 32,
+ 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 33, 0, 1, 0, 0,
+ 2,153, 66, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 36,
+ 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 66, 32,
+ 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 41, 0, 1, 0, 0,
+ 2,153, 66, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 44,
+ 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 66, 32,
+ 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 49, 0, 1, 0, 0,
+ 2,153, 66, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 52,
+ 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 66, 32,
+ 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 57, 0, 1, 0, 0,
+ 2,153, 66, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 60,
+ 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 66, 32,
+ 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 65, 0, 1, 0, 0,
+ 2,153, 66, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 68,
+ 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 66, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 70, 32,
+ 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 3, 0, 1, 0, 0,
+ 2,153, 70, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 6,
+ 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 70, 32,
+ 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 11, 0, 1, 0, 0,
+ 2,153, 70, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 14,
+ 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 70, 32,
+ 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 19, 0, 1, 0, 0,
+ 2,153, 70, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 22,
+ 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 70, 32,
+ 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 27, 0, 1, 0, 0,
+ 2,153, 70, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 30,
+ 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 70, 32,
+ 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 35, 0, 1, 0, 0,
+ 2,153, 70, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 38,
+ 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 70, 32,
+ 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 43, 0, 1, 0, 0,
+ 2,153, 70, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 46,
+ 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 70, 32,
+ 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 51, 0, 1, 0, 0,
+ 2,153, 70, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 54,
+ 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 70, 32,
+ 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 59, 0, 1, 0, 0,
+ 2,153, 70, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 62,
+ 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 70, 32,
+ 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 67, 0, 1, 0, 0,
+ 2,153, 70, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 70, 32, 0, 31, 0, 0,
+ 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 74, 32,
+ 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 5, 0, 1, 0, 0,
+ 2,153, 74, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 8,
+ 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 74, 32,
+ 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 13, 0, 1, 0, 0,
+ 2,153, 74, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 16,
+ 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 74, 32,
+ 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 21, 0, 1, 0, 0,
+ 2,153, 74, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 24,
+ 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 74, 32,
+ 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 29, 0, 1, 0, 0,
+ 2,153, 74, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 32,
+ 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 74, 32,
+ 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 37, 0, 1, 0, 0,
+ 2,153, 74, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 40,
+ 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 74, 32,
+ 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 45, 0, 1, 0, 0,
+ 2,153, 74, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 48,
+ 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 74, 32,
+ 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 53, 0, 1, 0, 0,
+ 2,153, 74, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 56,
+ 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 74, 32,
+ 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 61, 0, 1, 0, 0,
+ 2,153, 74, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 64,
+ 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 74, 32,
+ 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 74, 32, 0, 31, 0, 69, 0, 1, 0, 0,
+ 2,153, 74, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 2,
+ 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 78, 32,
+ 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 7, 0, 1, 0, 0,
+ 2,153, 78, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 10,
+ 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 78, 32,
+ 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 15, 0, 1, 0, 0,
+ 2,153, 78, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 18,
+ 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 78, 32,
+ 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 23, 0, 1, 0, 0,
+ 2,153, 78, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 26,
+ 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 78, 32,
+ 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 31, 0, 1, 0, 0,
+ 2,153, 78, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 34,
+ 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 78, 32,
+ 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 39, 0, 1, 0, 0,
+ 2,153, 78, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 42,
+ 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 78, 32,
+ 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 47, 0, 1, 0, 0,
+ 2,153, 78, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 50,
+ 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 78, 32,
+ 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 55, 0, 1, 0, 0,
+ 2,153, 78, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 58,
+ 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 78, 32,
+ 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 63, 0, 1, 0, 0,
+ 2,153, 78, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 66,
+ 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 78, 32,
+ 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 78, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 1, 0, 1, 0, 0,
+ 2,153, 82, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 4,
+ 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 82, 32,
+ 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 9, 0, 1, 0, 0,
+ 2,153, 82, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 12,
+ 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 82, 32,
+ 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 17, 0, 1, 0, 0,
+ 2,153, 82, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 20,
+ 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 82, 32,
+ 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 25, 0, 1, 0, 0,
+ 2,153, 82, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 28,
+ 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 82, 32,
+ 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 33, 0, 1, 0, 0,
+ 2,153, 82, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 36,
+ 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 82, 32,
+ 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 41, 0, 1, 0, 0,
+ 2,153, 82, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 44,
+ 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 82, 32,
+ 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 49, 0, 1, 0, 0,
+ 2,153, 82, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 52,
+ 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 82, 32,
+ 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 57, 0, 1, 0, 0,
+ 2,153, 82, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 60,
+ 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 82, 32,
+ 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 65, 0, 1, 0, 0,
+ 2,153, 82, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 68,
+ 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 82, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 86, 32,
+ 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 3, 0, 1, 0, 0,
+ 2,153, 86, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 6,
+ 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 86, 32,
+ 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 11, 0, 1, 0, 0,
+ 2,153, 86, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 14,
+ 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 86, 32,
+ 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 19, 0, 1, 0, 0,
+ 2,153, 86, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 22,
+ 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 86, 32,
+ 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 27, 0, 1, 0, 0,
+ 2,153, 86, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 30,
+ 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 86, 32,
+ 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 35, 0, 1, 0, 0,
+ 2,153, 86, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 38,
+ 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 86, 32,
+ 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 43, 0, 1, 0, 0,
+ 2,153, 86, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 46,
+ 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 86, 32,
+ 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 51, 0, 1, 0, 0,
+ 2,153, 86, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 54,
+ 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 86, 32,
+ 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 59, 0, 1, 0, 0,
+ 2,153, 86, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 62,
+ 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 86, 32,
+ 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 67, 0, 1, 0, 0,
+ 2,153, 86, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 86, 32, 0, 31, 0, 0,
+ 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 90, 32,
+ 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 5, 0, 1, 0, 0,
+ 2,153, 90, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 8,
+ 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 90, 32,
+ 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 13, 0, 1, 0, 0,
+ 2,153, 90, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 16,
+ 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 90, 32,
+ 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 21, 0, 1, 0, 0,
+ 2,153, 90, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 24,
+ 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 90, 32,
+ 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 29, 0, 1, 0, 0,
+ 2,153, 90, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 32,
+ 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 90, 32,
+ 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 37, 0, 1, 0, 0,
+ 2,153, 90, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 40,
+ 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 90, 32,
+ 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 45, 0, 1, 0, 0,
+ 2,153, 90, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 48,
+ 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 90, 32,
+ 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 53, 0, 1, 0, 0,
+ 2,153, 90, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 56,
+ 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 90, 32,
+ 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 61, 0, 1, 0, 0,
+ 2,153, 90, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 64,
+ 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 90, 32,
+ 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 90, 32, 0, 31, 0, 69, 0, 1, 0, 0,
+ 2,153, 90, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 2,
+ 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153, 94, 32,
+ 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 7, 0, 1, 0, 0,
+ 2,153, 94, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 10,
+ 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153, 94, 32,
+ 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 15, 0, 1, 0, 0,
+ 2,153, 94, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 18,
+ 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153, 94, 32,
+ 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 23, 0, 1, 0, 0,
+ 2,153, 94, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 26,
+ 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153, 94, 32,
+ 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 31, 0, 1, 0, 0,
+ 2,153, 94, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 34,
+ 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153, 94, 32,
+ 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 39, 0, 1, 0, 0,
+ 2,153, 94, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 42,
+ 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153, 94, 32,
+ 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 47, 0, 1, 0, 0,
+ 2,153, 94, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 50,
+ 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153, 94, 32,
+ 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 55, 0, 1, 0, 0,
+ 2,153, 94, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 58,
+ 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153, 94, 32,
+ 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 63, 0, 1, 0, 0,
+ 2,153, 94, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 66,
+ 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153, 94, 32,
+ 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 94, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 1, 0, 1, 0, 0,
+ 2,153, 98, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 4,
+ 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153, 98, 32,
+ 0, 31, 0, 7, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 9, 0, 1, 0, 0,
+ 2,153, 98, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 12,
+ 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153, 98, 32,
+ 0, 31, 0, 15, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 17, 0, 1, 0, 0,
+ 2,153, 98, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 20,
+ 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153, 98, 32,
+ 0, 31, 0, 23, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 25, 0, 1, 0, 0,
+ 2,153, 98, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 28,
+ 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153, 98, 32,
+ 0, 31, 0, 31, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 33, 0, 1, 0, 0,
+ 2,153, 98, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 36,
+ 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153, 98, 32,
+ 0, 31, 0, 39, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 41, 0, 1, 0, 0,
+ 2,153, 98, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 44,
+ 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153, 98, 32,
+ 0, 31, 0, 47, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 49, 0, 1, 0, 0,
+ 2,153, 98, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 52,
+ 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153, 98, 32,
+ 0, 31, 0, 55, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 57, 0, 1, 0, 0,
+ 2,153, 98, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 60,
+ 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153, 98, 32,
+ 0, 31, 0, 63, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 65, 0, 1, 0, 0,
+ 2,153, 98, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 68,
+ 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153, 98, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153,102, 32,
+ 0, 31, 0, 1, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 3, 0, 1, 0, 0,
+ 2,153,102, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 6,
+ 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153,102, 32,
+ 0, 31, 0, 9, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 11, 0, 1, 0, 0,
+ 2,153,102, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 14,
+ 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153,102, 32,
+ 0, 31, 0, 17, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 19, 0, 1, 0, 0,
+ 2,153,102, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 22,
+ 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153,102, 32,
+ 0, 31, 0, 25, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 27, 0, 1, 0, 0,
+ 2,153,102, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 30,
+ 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153,102, 32,
+ 0, 31, 0, 33, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 35, 0, 1, 0, 0,
+ 2,153,102, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 38,
+ 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153,102, 32,
+ 0, 31, 0, 41, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 43, 0, 1, 0, 0,
+ 2,153,102, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 46,
+ 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153,102, 32,
+ 0, 31, 0, 49, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 51, 0, 1, 0, 0,
+ 2,153,102, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 54,
+ 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153,102, 32,
+ 0, 31, 0, 57, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 59, 0, 1, 0, 0,
+ 2,153,102, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 62,
+ 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153,102, 32,
+ 0, 31, 0, 65, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 67, 0, 1, 0, 0,
+ 2,153,102, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153,102, 32, 0, 31, 0, 0,
+ 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153,106, 32,
+ 0, 31, 0, 3, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 5, 0, 1, 0, 0,
+ 2,153,106, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 8,
+ 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153,106, 32,
+ 0, 31, 0, 11, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 13, 0, 1, 0, 0,
+ 2,153,106, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 16,
+ 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153,106, 32,
+ 0, 31, 0, 19, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 21, 0, 1, 0, 0,
+ 2,153,106, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 24,
+ 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153,106, 32,
+ 0, 31, 0, 27, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 29, 0, 1, 0, 0,
+ 2,153,106, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 32,
+ 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153,106, 32,
+ 0, 31, 0, 35, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 37, 0, 1, 0, 0,
+ 2,153,106, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 40,
+ 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153,106, 32,
+ 0, 31, 0, 43, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 45, 0, 1, 0, 0,
+ 2,153,106, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 48,
+ 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153,106, 32,
+ 0, 31, 0, 51, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 53, 0, 1, 0, 0,
+ 2,153,106, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 56,
+ 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153,106, 32,
+ 0, 31, 0, 59, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 61, 0, 1, 0, 0,
+ 2,153,106, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 64,
+ 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153,106, 32,
+ 0, 31, 0, 67, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153,106, 32, 0, 31, 0, 69, 0, 1, 0, 0,
+ 2,153,106, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 2,
+ 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,153,110, 32,
+ 0, 31, 0, 5, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 7, 0, 1, 0, 0,
+ 2,153,110, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 10,
+ 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,153,110, 32,
+ 0, 31, 0, 13, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 15, 0, 1, 0, 0,
+ 2,153,110, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 18,
+ 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,153,110, 32,
+ 0, 31, 0, 21, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 23, 0, 1, 0, 0,
+ 2,153,110, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 26,
+ 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,153,110, 32,
+ 0, 31, 0, 29, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 31, 0, 1, 0, 0,
+ 2,153,110, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 34,
+ 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,153,110, 32,
+ 0, 31, 0, 37, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 39, 0, 1, 0, 0,
+ 2,153,110, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 42,
+ 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,153,110, 32,
+ 0, 31, 0, 45, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 47, 0, 1, 0, 0,
+ 2,153,110, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 50,
+ 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,153,110, 32,
+ 0, 31, 0, 53, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 55, 0, 1, 0, 0,
+ 2,153,110, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 58,
+ 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,153,110, 32,
+ 0, 31, 0, 61, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 63, 0, 1, 0, 0,
+ 2,153,110, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 66,
+ 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,153,110, 32,
+ 0, 31, 0, 69, 0, 1, 0, 0, 2,153,110, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 1, 0, 1, 0, 0,
+ 2,153,114, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 4,
+ 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,153,114, 32,
+ 0, 31, 0, 7, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 9, 0, 1, 0, 0,
+ 2,153,114, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 12,
+ 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,153,114, 32,
+ 0, 31, 0, 15, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 17, 0, 1, 0, 0,
+ 2,153,114, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 20,
+ 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,153,114, 32,
+ 0, 31, 0, 23, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 25, 0, 1, 0, 0,
+ 2,153,114, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 28,
+ 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,153,114, 32,
+ 0, 31, 0, 31, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 33, 0, 1, 0, 0,
+ 2,153,114, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 36,
+ 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,153,114, 32,
+ 0, 31, 0, 39, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 41, 0, 1, 0, 0,
+ 2,153,114, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 44,
+ 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,153,114, 32,
+ 0, 31, 0, 47, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 49, 0, 1, 0, 0,
+ 2,153,114, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 52,
+ 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,153,114, 32,
+ 0, 31, 0, 55, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 57, 0, 1, 0, 0,
+ 2,153,114, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 60,
+ 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,153,114, 32,
+ 0, 31, 0, 63, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 65, 0, 1, 0, 0,
+ 2,153,114, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 68,
+ 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,153,114, 32, 0, 31, 0, 0, 0, 1, 0, 0, 4,213,116,240,
+ 0, 31, 0, 1, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 2, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 3, 0, 1, 0, 0,
+ 4,213,116,240, 0, 31, 0, 4, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 5, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 6,
+ 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 7, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 8, 0, 1, 0, 0, 4,213,116,240,
+ 0, 31, 0, 9, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 10, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 11, 0, 1, 0, 0,
+ 4,213,116,240, 0, 31, 0, 12, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 13, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 14,
+ 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 15, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 16, 0, 1, 0, 0, 4,213,116,240,
+ 0, 31, 0, 17, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 18, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 19, 0, 1, 0, 0,
+ 4,213,116,240, 0, 31, 0, 20, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 21, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 22,
+ 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 23, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 24, 0, 1, 0, 0, 4,213,116,240,
+ 0, 31, 0, 25, 0, 1, 0, 0, 4,213,116,240, 0, 31, 0, 0, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 1, 0, 1, 0, 0,
+ 4,213,117,128, 0, 31, 0, 2, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 3, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 4,
+ 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 5, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 6, 0, 1, 0, 0, 4,213,117,128,
+ 0, 31, 0, 7, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 8, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 9, 0, 1, 0, 0,
+ 4,213,117,128, 0, 31, 0, 10, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 11, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 12,
+ 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 13, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 14, 0, 1, 0, 0, 4,213,117,128,
+ 0, 31, 0, 15, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 16, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 17, 0, 1, 0, 0,
+ 4,213,117,128, 0, 31, 0, 18, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 19, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 20,
+ 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 21, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 22, 0, 1, 0, 0, 4,213,117,128,
+ 0, 31, 0, 23, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 24, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 25, 0, 1, 0, 0,
+ 4,213,117,128, 0, 31, 0, 26, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 27, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 28,
+ 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 29, 0, 1, 0, 0, 4,213,117,128, 0, 31, 0, 30, 0, 1, 0, 0, 4,213,117,128,
+ 0, 31, 0, 0, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 2, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 5,
+ 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,152,214, 32,
+ 0, 31, 0, 8, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 10, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 13,
+ 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,152,214, 32,
+ 0, 31, 0, 16, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 18, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 21,
+ 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,152,214, 32,
+ 0, 31, 0, 24, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 26, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 29,
+ 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,152,214, 32,
+ 0, 31, 0, 32, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 34, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 37,
+ 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,152,214, 32,
+ 0, 31, 0, 40, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 42, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 45,
+ 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,152,214, 32,
+ 0, 31, 0, 48, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 50, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 53,
+ 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,152,214, 32,
+ 0, 31, 0, 56, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 58, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 61,
+ 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,152,214, 32,
+ 0, 31, 0, 64, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 66, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 69,
+ 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 70, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 71, 0, 1, 0, 0, 2,152,214, 32,
+ 0, 31, 0, 72, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 73, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 74, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 75, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 76, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 77,
+ 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 78, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 79, 0, 1, 0, 0, 2,152,214, 32,
+ 0, 31, 0, 80, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 81, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 82, 0, 1, 0, 0,
+ 2,152,214, 32, 0, 31, 0, 83, 0, 1, 0, 0, 2,152,214, 32, 0, 31, 0, 0, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 1,
+ 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 2, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 3, 0, 1, 0, 0, 4,213,128,192,
+ 0, 31, 0, 4, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 5, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 6, 0, 1, 0, 0,
+ 4,213,128,192, 0, 31, 0, 7, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 8, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 9,
+ 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 10, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 11, 0, 1, 0, 0, 4,213,128,192,
+ 0, 31, 0, 12, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 13, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 14, 0, 1, 0, 0,
+ 4,213,128,192, 0, 31, 0, 15, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 16, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 17,
+ 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 18, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 19, 0, 1, 0, 0, 4,213,128,192,
+ 0, 31, 0, 20, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 21, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 22, 0, 1, 0, 0,
+ 4,213,128,192, 0, 31, 0, 23, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 24, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 25,
+ 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 26, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 27, 0, 1, 0, 0, 4,213,128,192,
+ 0, 31, 0, 28, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 29, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 30, 0, 1, 0, 0,
+ 4,213,128,192, 0, 31, 0, 31, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 32, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 33,
+ 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 34, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 35, 0, 1, 0, 0, 4,213,128,192,
+ 0, 31, 0, 36, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 37, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 38, 0, 1, 0, 0,
+ 4,213,128,192, 0, 31, 0, 39, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 40, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 41,
+ 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 42, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 43, 0, 1, 0, 0, 4,213,128,192,
+ 0, 31, 0, 44, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 45, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 46, 0, 1, 0, 0,
+ 4,213,128,192, 0, 31, 0, 47, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 48, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 49,
+ 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 50, 0, 1, 0, 0, 4,213,128,192, 0, 31, 0, 51, 0, 1, 0, 0, 4,213,128,192,
+ 0, 31, 0, 0, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 2, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 5,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 8, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 10, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 13,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 16, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 18, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 21,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 24, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 26, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 29,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 32, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 34, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 37,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 40, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 42, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 45,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 48, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 50, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 53,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 56, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 58, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 61,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 64, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 66, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 69,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 70, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 71, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 72, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 73, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 74, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 75, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 76, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 77,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 78, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 79, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 80, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 81, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 82, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 83, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 84, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 85,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 86, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 87, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 88, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 89, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 90, 0, 1, 0, 0,
+ 2,152,196, 32, 0, 31, 0, 91, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 92, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 93,
+ 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 94, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 95, 0, 1, 0, 0, 2,152,196, 32,
+ 0, 31, 0, 96, 0, 1, 0, 0, 2,152,196, 32, 0, 31, 0, 0, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 1, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 3, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 4,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 6, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 7, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 8, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 9, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 11, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 12,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 14, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 15, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 16, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 17, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 19, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 20,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 22, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 23, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 24, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 25, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 27, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 28,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 30, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 31, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 32, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 33, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 35, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 36,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 38, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 39, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 40, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 41, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 43, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 44,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 46, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 47, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 48, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 49, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 51, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 52,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 54, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 55, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 56, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 57, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 59, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 60,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 62, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 63, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 64, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 65, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 67, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 68,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 70, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 71, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 72, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 73, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 74, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 75, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 76,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 77, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 78, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 79, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 80, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 81, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 82, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 83, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 84,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 85, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 86, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 87, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 88, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 89, 0, 1, 0, 0,
+ 2,152,202, 32, 0, 31, 0, 90, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 91, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 92,
+ 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 93, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 94, 0, 1, 0, 0, 2,152,202, 32,
+ 0, 31, 0, 95, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 96, 0, 1, 0, 0, 2,152,202, 32, 0, 31, 0, 0, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 1, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 2, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 3,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 4, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 5, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 6, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 7, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 8, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 9, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 10, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 11,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 12, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 13, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 14, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 15, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 16, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 17, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 18, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 19,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 20, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 21, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 22, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 23, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 24, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 25, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 26, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 27,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 28, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 29, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 30, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 31, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 32, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 33, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 34, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 35,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 36, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 37, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 38, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 39, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 40, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 41, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 42, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 43,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 44, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 45, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 46, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 47, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 48, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 49, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 50, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 51,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 52, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 53, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 54, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 55, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 56, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 57, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 58, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 59,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 60, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 61, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 62, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 63, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 64, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 65, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 66, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 67,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 68, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 69, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 70, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 71, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 72, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 73, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 74, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 75,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 76, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 77, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 78, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 79, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 80, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 81, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 82, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 83,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 84, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 85, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 86, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 87, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 88, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 89, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 90, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 91,
+ 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 92, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 93, 0, 1, 0, 0, 2,152,208, 32,
+ 0, 31, 0, 94, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 95, 0, 1, 0, 0, 2,152,208, 32, 0, 31, 0, 96, 0, 1, 0, 0,
+ 2,152,208, 32, 0, 31, 0, 0, 0, 1, 0, 0, 4,211,177,144, 0, 31, 0, 1, 0, 1, 0, 0, 4,211,177,144, 0, 31, 0, 2,
+ 0, 1, 0, 0, 4,211,177,144, 0, 31, 0, 3, 0, 1, 0, 0, 4,211,177,144, 0, 31, 0, 4, 0, 1, 0, 0, 4,211,177,144,
+ 0, 31, 0, 5, 0, 1, 0, 0, 4,211,177,144, 0, 31, 0, 6, 0, 1, 0, 0, 4,211,177,144, 0, 31, 0, 7, 0, 1, 0, 0,
+ 4,211,177,144, 0, 31, 0, 8, 0, 1, 0, 0, 4,211,177,144, 0, 31, 0, 9, 0, 1, 0, 0, 4,211,177,144, 0, 31, 0, 0,
+ 0, 1, 0, 0, 4,211,245,240, 0, 31, 0, 1, 0, 1, 0, 0, 4,211,245,240, 0, 31, 0, 2, 0, 1, 0, 0, 4,211,245,240,
+ 0, 31, 0, 3, 0, 1, 0, 0, 4,211,245,240, 0, 31, 0, 4, 0, 1, 0, 0, 4,211,245,240, 0, 31, 0, 5, 0, 1, 0, 0,
+ 4,211,245,240, 0, 31, 0, 6, 0, 1, 0, 0, 4,211,245,240, 0, 31, 0, 7, 0, 1, 0, 0, 4,211,245,240, 0, 31, 0, 8,
+ 0, 1, 0, 0, 4,211,245,240, 0, 31, 0, 9, 0, 1, 0, 0, 4,211,245,240, 0, 31, 0, 0, 0, 1, 0, 0, 4,212, 43, 0,
+ 0, 31, 0, 1, 0, 1, 0, 0, 4,212, 43, 0, 0, 31, 0, 2, 0, 1, 0, 0, 4,212, 43, 0, 0, 31, 0, 3, 0, 1, 0, 0,
+ 4,212, 43, 0, 0, 31, 0, 4, 0, 1, 0, 0, 4,212, 43, 0, 0, 31, 0, 5, 0, 1, 0, 0, 4,212, 43, 0, 0, 31, 0, 6,
+ 0, 1, 0, 0, 4,212, 43, 0, 0, 31, 0, 7, 0, 1, 0, 0, 4,212, 43, 0, 0, 31, 0, 8, 0, 1, 0, 0, 4,212, 43, 0,
+ 0, 31, 0, 9, 0, 1, 0, 0, 4,212, 43, 0, 0, 31, 0, 0, 0, 1, 0, 0, 4,212,182,208, 0, 31, 0, 1, 0, 1, 0, 0,
+ 4,212,182,208, 0, 31, 0, 2, 0, 1, 0, 0, 4,212,182,208, 0, 31, 0, 3, 0, 1, 0, 0, 4,212,182,208, 0, 31, 0, 4,
+ 0, 1, 0, 0, 4,212,182,208, 0, 31, 0, 5, 0, 1, 0, 0, 4,212,182,208, 0, 31, 0, 6, 0, 1, 0, 0, 4,212,182,208,
+ 0, 31, 0, 7, 0, 1, 0, 0, 4,212,182,208, 0, 31, 0, 8, 0, 1, 0, 0, 4,212,182,208, 0, 31, 0, 9, 0, 1, 0, 0,
+ 4,212,182,208, 0, 31, 0, 0, 0, 1, 0, 0, 4,212,247,144, 0, 31, 0, 1, 0, 1, 0, 0, 4,212,247,144, 0, 31, 0, 2,
+ 0, 1, 0, 0, 4,212,247,144, 0, 31, 0, 3, 0, 1, 0, 0, 4,212,247,144, 0, 31, 0, 4, 0, 1, 0, 0, 4,212,247,144,
+ 0, 31, 0, 5, 0, 1, 0, 0, 4,212,247,144, 0, 31, 0, 6, 0, 1, 0, 0, 4,212,247,144, 0, 31, 0, 7, 0, 1, 0, 0,
+ 4,212,247,144, 0, 31, 0, 8, 0, 1, 0, 0, 4,212,247,144, 0, 31, 0, 9, 0, 1, 0, 0, 4,212,247,144, 0, 31, 0, 0,
+ 0, 1, 0, 0, 4,213, 50,160, 0, 31, 0, 1, 0, 1, 0, 0, 4,213, 50,160, 0, 31, 0, 2, 0, 1, 0, 0, 4,213, 50,160,
+ 0, 31, 0, 3, 0, 1, 0, 0, 4,213, 50,160, 0, 31, 0, 4, 0, 1, 0, 0, 4,213, 50,160, 0, 31, 0, 5, 0, 1, 0, 0,
+ 4,213, 50,160, 0, 31, 0, 6, 0, 1, 0, 0, 4,213, 50,160, 0, 31, 0, 7, 0, 1, 0, 0, 4,213, 50,160, 0, 31, 0, 8,
+ 0, 1, 0, 0, 4,213, 50,160, 0, 31, 0, 9, 0, 1, 0, 0, 4,213, 50,160, 0, 31, 0, 0, 0, 1, 0, 0, 4,213, 74,240,
+ 0, 31, 0, 1, 0, 1, 0, 0, 4,213, 74,240, 0, 31, 0, 2, 0, 1, 0, 0, 4,213, 74,240, 0, 31, 0, 3, 0, 1, 0, 0,
+ 4,213, 74,240, 0, 31, 0, 4, 0, 1, 0, 0, 4,213, 74,240, 0, 31, 0, 5, 0, 1, 0, 0, 4,213, 74,240, 0, 31, 0, 6,
+ 0, 1, 0, 0, 4,213, 74,240, 0, 31, 0, 7, 0, 1, 0, 0, 4,213, 74,240, 0, 31, 0, 8, 0, 1, 0, 0, 4,213, 74,240,
+ 0, 31, 0, 9, 0, 1, 0, 0, 4,213, 74,240, 0, 31, 0, 0, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 1, 0, 1, 0, 0,
+ 4,213,127, 16, 0, 31, 0, 2, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 3, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 4,
+ 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 5, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 6, 0, 1, 0, 0, 4,213,127, 16,
+ 0, 31, 0, 7, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 8, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 9, 0, 1, 0, 0,
+ 4,213,127, 16, 0, 31, 0, 10, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 11, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 12,
+ 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 13, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 14, 0, 1, 0, 0, 4,213,127, 16,
+ 0, 31, 0, 15, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 16, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 17, 0, 1, 0, 0,
+ 4,213,127, 16, 0, 31, 0, 18, 0, 1, 0, 0, 4,213,127, 16, 0, 31, 0, 0, 0, 1, 0, 0, 4,211,175,144, 0, 31, 0, 1,
+ 0, 1, 0, 0, 4,211,175,144, 0, 31, 0, 2, 0, 1, 0, 0, 4,211,175,144, 0, 31, 0, 3, 0, 1, 0, 0, 4,211,175,144,
+ 0, 31, 0, 4, 0, 1, 0, 0, 4,211,175,144, 0, 31, 0, 5, 0, 1, 0, 0, 4,211,175,144, 0, 31, 0, 6, 0, 1, 0, 0,
+ 4,211,175,144, 0, 31, 0, 7, 0, 1, 0, 0, 4,211,175,144, 0, 31, 0, 8, 0, 1, 0, 0, 4,211,175,144, 0, 31, 0, 9,
+ 0, 1, 0, 0, 4,211,175,144, 0, 31, 0, 10, 0, 1, 0, 0, 4,211,175,144, 0, 31, 0, 0, 0, 1, 0, 0, 4,213,120,240,
+ 0, 31, 0, 1, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 2, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 3, 0, 1, 0, 0,
+ 4,213,120,240, 0, 31, 0, 4, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 5, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 6,
+ 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 7, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 8, 0, 1, 0, 0, 4,213,120,240,
+ 0, 31, 0, 9, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 10, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 11, 0, 1, 0, 0,
+ 4,213,120,240, 0, 31, 0, 12, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 13, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 14,
+ 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 15, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 16, 0, 1, 0, 0, 4,213,120,240,
+ 0, 31, 0, 17, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 18, 0, 1, 0, 0, 4,213,120,240, 0, 31, 0, 19, 0, 1, 0, 0,
+ 4,213,120,240, 0, 31, 0, 20, 0, 1, 0, 0, 4,213,120,240, 68, 65, 84, 65, 0, 0, 0, 96, 4,212,143,112, 0, 0, 0,194,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,212,139, 64, 4,212, 46, 64, 4,212, 44,192, 4,212, 45,128, 4,212, 46,128, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 63, 0, 0, 0,125, 0, 0, 4,100, 1, 1, 6, 64, 3,232, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8,
+ 2, 23,124, 16, 4,212,181, 64, 4,212,181, 64, 4,212,144, 0, 4,212,180, 32, 0, 0, 0, 0, 0, 0, 0, 0, 4,218,169,144,
+ 10, 50,177, 16, 68, 65, 84, 65, 0, 0, 0,248, 4,212,144, 0, 0, 0, 0,195, 0, 0, 0, 1, 4,212,145, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68,113, 64, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,200, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 6, 63, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 6, 64, 0, 26, 6, 64, 0, 26, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 63, 0, 0, 0,125, 0, 0, 0,150, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 64, 0, 26, 0, 9, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,131,144, 10, 60,148, 64, 10, 60,148, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 20,239,176, 10, 49,184, 32, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,145, 32, 0, 0, 0,195,
+ 0, 0, 0, 1, 4,212,166, 96, 4,212,144, 0, 0, 0, 0, 0, 67, 32, 0, 0,196, 61,128, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 15, 0, 0,196, 61,128, 0, 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 2,245, 0, 0, 0, 0,
+ 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 2,245, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 3, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0,
+ 0, 6, 0,160, 2,246, 0,143, 2,246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159,
+ 0, 0, 1,111, 0, 0, 4,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 2,246, 0, 10, 0, 5,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0,160, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,129, 80, 9,187,125,240,
+ 9,187,125,240, 4,212,146, 64, 4,212,164,240, 9,190,178,144, 2, 21, 12,224, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212,146, 64, 0, 0, 0,193, 0, 0, 0, 1, 4,212,147,176, 0, 0, 0, 0, 9, 90,207,176, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,253,233, 0,143, 1,255, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,147,176, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212,149, 32, 4,212,146, 64, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
+111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
+111,108,115, 95, 98,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,211, 0,143, 1, 21, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,149, 32, 0, 0, 0,193, 0, 0, 0, 1, 4,212,150,144, 4,212,147,176,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,101,
+120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,101,
+120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 88, 0,143, 1,213, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212,150,144, 0, 0, 0,193, 0, 0, 0, 1, 4,212,152, 0, 4,212,149, 32, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87,
+ 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87,
+ 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,115,116,114,111,107,101, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116,114,111,
+107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 66,
+ 0,143, 0,121, 0, 0, 0, 0, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,152, 0, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212,153,112, 4,212,150,144, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
98,114,117,115,104, 95, 99,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,117,114,118,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,143, 0,231, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,164, 0,143, 0,231, 0, 0, 0, 0, 0, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 78,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
-184, 79,254, 2, 0, 0, 0, 0,120, 76,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114, 97,110, 99,101,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212,153,112, 0, 0, 0,193, 0, 0, 0, 1, 4,212,154,224, 4,212,152, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114,
+ 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114,
+ 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 65,112,112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95, 97,112,112,101, 97,114, 97,110, 99,101,
+ 0, 0, 0, 0, 0, 0,253, 96, 0,143, 0,133, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65,112,112,101, 97,114, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 96,253,143, 0,133, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-184, 79,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 88, 81,254, 2, 0, 0, 0, 0, 24, 78,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
- 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
- 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55,254,143, 0, 36, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 81,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
-248, 82,254, 2, 0, 0, 0, 0,184, 79,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,115,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 52,253,143, 0,225, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,154,224,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212,156, 80, 4,212,153,112, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,116,111,111,108,115, 95, 98,114,117,115,104, 95,116,111,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,111,111,108, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 55, 0,143, 0, 36,
+ 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-248, 82,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,152, 84,254, 2, 0, 0, 0, 0, 88, 81,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
- 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116,
- 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,145,253,143, 0,132, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,156, 80, 0, 0, 0,193, 0, 0, 0, 1, 4,212,157,192,
+ 4,212,154,224, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,115,121,109,
+109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,115,121,109,
+109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,121,109,109,101,116,114,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 52, 0,143, 0,225, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 84,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
- 56, 86,254, 2, 0, 0, 0, 0,248, 82,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212,157,192, 0, 0, 0,193, 0, 0, 0, 1, 4,212,159, 48, 4,212,156, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,115, 99,117,108,112,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 87,101,105,103,104,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 39,254,143, 0,124, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,253,145, 0,143, 0,132, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
- 56, 86,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,216, 87,254, 2, 0, 0, 0, 0,152, 84,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
-119,101,105,103,104,116,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
-119,101,105,103,104,116,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,159, 48, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212,160,160, 4,212,157,192, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
+111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,
+111,108,115, 95,119,101,105,103,104,116,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87,101,105,103,104,116, 32, 84,111,111,108,115,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,181,253,143, 0,190, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 39, 0,143, 0,124, 0, 0, 0, 0,
+ 0, 4, 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, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 87,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
-120, 89,254, 2, 0, 0, 0, 0, 56, 86,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,112,114,111,106,101, 99,116,112, 97,105,110,116, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,160,160, 0, 0, 0,193, 0, 0, 0, 1, 4,212,162, 16, 4,212,159, 48,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,
+105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,119,101,105,103,104,116,112, 97,
+105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,112,114,111,106,101, 99,116,112, 97,105,110,116, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,181, 0,143, 0,190, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 80,114,111,106,101, 99,116, 32, 80, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,241,252,143, 0, 9, 1, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212,162, 16, 0, 0, 0,193, 0, 0, 0, 1, 4,212,163,128, 4,212,160,160, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87,
+ 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,112,114,111,106,101, 99,116,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87,
+ 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,112,114,111,106,101, 99,116,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,111,106,
+101, 99,116, 32, 80, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,241,
+ 0,143, 1, 9, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-120, 89,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 91,254, 2, 0, 0, 0, 0,216, 87,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,163,128, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212,164,240, 4,212,162, 16, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
118,101,114,116,101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,
118,101,114,116,101,120,112, 97,105,110,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197,253,143, 0,146, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 91,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,120, 89,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,105,111,110,115, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,146,253,143, 0, 80, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-184, 92,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200, 95,254, 2, 0, 0, 0, 0,136, 68,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 33, 67, 0, 0, 90,195, 0, 0, 0, 0, 0, 0, 0, 0,227,102, 16, 67, 24, 30, 90,195, 0, 0, 0, 0,
-143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,216, 0,143, 0,216, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159, 0, 0, 0,123, 0, 0, 0, 82, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,216, 0, 12, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184,250,224, 2, 0, 0, 0, 0,232,142,112, 4, 0, 0, 0, 0,
-232,142,112, 4, 0, 0, 0, 0, 40, 94,254, 2, 0, 0, 0, 0, 40, 94,254, 2, 0, 0, 0, 0, 88, 54,219, 4, 0, 0, 0, 0,
-232, 42, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
- 40, 94,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-168,251,224, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,
-112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,
-112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,101,114, 97,116,111,114, 0,114,116,101,120, 32, 67,111,
-108,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 39, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200, 95,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 56, 97,254, 2, 0, 0, 0, 0,184, 92,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 67, 0,192,115,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 35, 67, 0,192,115,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
- 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 0, 6, 0,180, 0,207, 3,163, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 43, 6, 0, 0, 43, 6, 0, 0,123, 0, 0, 0,231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-184,244,224, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56, 97,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,200, 95,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-160, 0, 0, 0, 43, 6, 0, 0,123, 0, 0, 0,231, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-140, 5,109, 3, 13, 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,
-200,243,224, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,232, 73, 14, 3, 0, 0, 0, 0, 24, 73, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-168, 98,254, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,168, 98,254, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,
- 0, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,143,174,226, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,218,205, 76,190, 0, 0, 0, 0,
- 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,
-162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,210,111,193, 0, 0,128, 63,
- 68,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62,166, 33,101, 63, 0, 0, 0, 0,
-185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0, 62, 95, 68, 65, 51,120,173,192,115,208,213, 64, 0, 0,128, 63,
-178,157,229, 62,176, 34, 54,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63, 8,149,175, 62, 9, 46,185, 62, 35, 44,185, 62,
-145,180,109,188,241,227,202, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,161,108, 65, 33,210,111, 65,
-190,240,191, 62, 90,116, 85, 63, 32,179, 70,188, 0, 0,240, 50,103, 75,104,190,190,239,223, 61, 34, 98, 1, 63, 0, 0,180, 51,
-230,117,117,194, 58,213,216, 65,166,161, 5,194, 64,255,159,192,240, 49,114, 66,195,242,213,193,139,218, 3, 66,228, 0,160, 64,
- 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190, 0, 0, 0, 0,
-162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33,210,111,193, 0, 0,128, 63,
-178,157,229, 62,176, 34, 54,191,222,160, 81,191,184,158, 81,191,117, 90,127, 63, 8,149,175, 62, 9, 46,185, 62, 35, 44,185, 62,
-145,180,109,188,241,227,202, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,161,108, 65, 33,210,111, 65,
- 78, 75,185, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 75,185, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 78, 75,185, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 33,210,111, 65,160,228,143, 65, 0, 0, 0, 0, 0, 0, 0, 0,
-237,200,168, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 32, 33, 12, 66, 84,152,137, 66,
-113, 27,126, 66, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 88,102,254, 2, 0, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0,
-168,109,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 24, 0, 0, 0, 0,
- 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,205,204,204, 61, 0, 64,156, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0,255,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232,103,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 88,105,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 50, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0,224,239, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0, 0,209, 68, 0, 0,200, 65, 0, 0,209, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0,127, 7, 26, 0,127, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,126, 7, 0, 0,207, 3, 0, 0,232, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-127, 7, 26, 0, 0, 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, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,105,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-200,106,254, 2, 0, 0, 0, 0,232,103,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 67, 0,128,115,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 95, 67,255,191,115,196, 0, 0, 0, 0,223, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 4, 6, 0,240, 0,207, 3,223, 0,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-240, 0,207, 3, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,106,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 56,108,254, 2, 0, 0, 0, 0, 88,105,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,179, 68, 0, 0, 0, 0, 0, 0,112, 66,
- 0, 0, 0, 0, 0,224,209, 68, 0, 0, 0, 0, 0, 0,112, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 6, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0,
- 0, 0,179, 68, 0, 0,108, 66, 0, 0,179, 68, 0, 0,108, 66, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0,143, 6, 60, 0,143, 6, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-240, 0, 0, 0,126, 7, 0, 0,147, 3, 0, 0,206, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-143, 6, 60, 0, 0, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,108,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,200,106,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0,104,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,224,209, 68, 0, 64, 96,196, 0, 0, 0, 0,126, 6, 0, 0,143, 6, 0, 0, 0, 0, 0, 0,146, 3, 0, 0,
- 0, 0, 0, 0,142, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 6, 0, 0, 18, 0, 0, 0,146, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 8, 4, 0, 0, 2, 0, 3, 3,
- 4, 0, 0, 4, 6, 0,143, 6,147, 3,143, 6,129, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-240, 0, 0, 0,126, 7, 0, 0, 0, 0, 0, 0,146, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-143, 6,147, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,104, 0, 0, 0,168,109,254, 2, 0, 0, 0, 0,162, 0, 0, 0, 1, 0, 0, 0,
- 56,113,254, 2, 0, 0, 0, 0, 88,102,254, 2, 0, 0, 0, 0,232,103,254, 2, 0, 0, 0, 0, 56,108,254, 2, 0, 0, 0, 0,
- 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 0,255,255, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88,110,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-200,111,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 48, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0,224,197, 68, 0, 0,200, 65, 0,224,197, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 47, 6, 0, 0, 93, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,111,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 88,110,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,241, 67, 0,128, 90,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,224,195, 68, 0, 64,111,196, 0, 0, 0, 0, 31, 6, 0, 0, 48, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0,
- 0, 0, 0, 0, 30, 6, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 30, 6, 0, 0, 18, 0, 0, 0,206, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3,
- 0, 0, 0, 4, 6, 0, 48, 6,207, 3, 31, 6,189, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48, 6,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0, 56,113,254, 2, 0, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0,
-216,126,254, 2, 0, 0, 0, 0,168,109,254, 2, 0, 0, 0, 0, 88,110,254, 2, 0, 0, 0, 0,200,111,254, 2, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,114,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,
-152,114,254, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0, 93, 0, 0, 0, 93, 0, 0, 0,248,114,254, 2, 0, 0, 0, 0,
- 68, 65, 84, 65,208, 5, 0, 0,248,114,254, 2, 0, 0, 0, 0,216, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 0, 0,
-232,190,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
-168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
-152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
-200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 88,206,255, 2, 0, 0, 0, 0, 30, 0,255,255, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,255,255, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 1, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 3, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 5, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 6, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 7, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 9, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 10, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 11, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 13, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 14, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 15, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 17, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 18, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 19, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 21, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 22, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 23, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 24, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 25, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 26, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 27, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 28, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 29, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 30, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 31, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 33, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,121,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-136,122,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0,198, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0,224,197, 68, 0, 0,200, 65, 0,224,197, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0, 48, 6, 26, 0, 48, 6, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 47, 6, 0, 0, 93, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136,122,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-248,123,254, 2, 0, 0, 0, 0, 24,121,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 4, 0, 3, 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, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248,123,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-104,125,254, 2, 0, 0, 0, 0,136,122,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 47, 6, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 7, 0, 4, 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, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,125,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,248,123,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 38,192, 0, 0,102, 64, 0,192,179,191, 0,224, 25, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 6, 0, 0, 0, 0, 0, 0,207, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 47, 6, 0, 0,119, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 48, 6,207, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 33, 0, 0,216,126,254, 2, 0, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 56,113,254, 2, 0, 0, 0, 0, 24,121,254, 2, 0, 0, 0, 0,104,125,254, 2, 0, 0, 0, 0,
- 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65, 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,
-154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,197, 0,143, 0,146, 0, 0, 0, 0, 0, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212,164,240, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 4,212,163,128, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,105,111,110,115,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,105,109, 97,103,101,112, 97,105,110,116, 95,111,112,116,105,111,110,115,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79,112,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,253,146, 0,143, 0, 80, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,166, 96,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,212,168,240, 4,212,145, 32, 0, 0, 0, 0, 67, 33, 0, 0,195, 90, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67, 16,102,227,195, 90, 30, 24, 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,215,
+ 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,215,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 3, 10, 0, 0, 0, 1, 0, 7,
+ 0, 18, 4, 0, 0, 6, 0,160, 0,216, 0,143, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0,159, 0, 0, 0,151, 0, 0, 1,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,216,
+ 0, 11, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,129,224,
+ 9,187,141, 0, 9,187,141, 0, 4,212,167,128, 4,212,167,128, 10, 48,164, 48, 10, 60, 56, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212,167,128, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,130,112,
+ 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79,112,101,114, 97,116,111,114, 0,111,114, 32,116,111, 32, 83,101,108,101, 99,116,101,100, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,255,216, 0,144, 0, 16, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,168,240,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,212,180, 32, 4,212,166, 96, 0, 0, 0, 0, 67, 52, 0, 0,196,158, 96, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67, 35, 0, 0,196,158, 96, 0,195,142,128, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 3,213,
+ 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 3,213,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 1, 10, 0, 0, 0, 1, 0, 7,
+ 0, 18, 4, 0, 0, 6, 0,180, 3,214, 0,163, 3,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 63,
+ 0, 0, 6, 63, 0, 0, 0,151, 0, 0, 4,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
+ 0, 0, 0, 4, 0, 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,125, 96,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,212,170, 16, 4,212,178,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212,170, 16, 0, 0, 0,193, 0, 0, 0, 1, 4,212,171,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,254,122, 0,163, 1,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,171,128,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212,172,240, 4,212,170, 16, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,
+101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 18, 0,163, 0, 80,
+ 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, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,172,240, 0, 0, 0,193, 0, 0, 0, 1, 4,212,174, 96,
+ 4,212,171,128, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,118,105,101,119, 51,100, 95,112,114,111,
+112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,118,105,101,119, 51,100, 95,112,114,111,
+112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,212, 0,163, 1, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212,174, 96, 0, 0, 0,193, 0, 0, 0, 1, 4,212,175,208, 4,212,172,240, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,118,105,101,119, 51,100, 95,110, 97,109,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,118,105,101,119, 51,100, 95,110, 97,109,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 73,116,101,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,252,152, 0,163, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,175,208, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212,177, 64, 4,212,174, 96, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,118,105,
+101,119, 51,100, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,118,105,
+101,119, 51,100, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,115,112,108, 97,121, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,251, 65, 0,163, 1, 63, 0, 0, 0, 0,
+ 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,177, 64, 0, 0, 0,193, 0, 0, 0, 1, 4,212,178,176, 4,212,175,208,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 98, 97, 99,107,103,114,111,117,110,100, 95,105,109, 97,
+103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 98, 97, 99,107,103,114,111,117,110,100, 95,105,109, 97,
+103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 97, 99,107,103,114,111,117,110,100, 32, 73,109, 97,103,101,115, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,104, 0,163, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212,178,176, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 4,212,177, 64, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87,
+ 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95,111,114,105,101,110,116, 97,116,105,111,110,115, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87,
+ 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95,111,114,105,101,110,116, 97,116,105,111,110,115, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,
+115,102,111,114,109, 32, 79,114,105,101,110,116, 97,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 80,
+ 0,163, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,180, 32, 0, 0, 0,195, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,212,168,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0, 0, 6, 63, 0, 0, 0,151,
+ 0, 0, 4,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,160, 3,206, 0, 12, 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, 2, 23,124,208, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 10, 60, 93, 80, 4,218,178,144, 0, 0, 0, 0, 2,152,132, 32, 68, 65, 84, 65, 0, 0, 3, 68,
+ 2,152,132, 32, 0, 0, 0,153, 0, 0, 0, 1, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,206,251, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 6,141,191,128, 0, 0,128, 0, 0, 0,
+128, 0, 0, 0,190, 76,210, 10,128, 0, 0, 0, 62,209,239, 68,190,205,177, 51, 63, 81,158,184, 0, 0, 0, 0, 63,105,119, 70,
+ 62, 70, 74,143,190,185, 44, 35, 0, 0, 0, 0,188, 89, 84,162, 63,101, 33,166, 62,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,193,111,210, 33, 63,128, 0, 0, 62,209,239, 68, 63,105,119, 70,188, 89, 84,176, 0, 0, 0, 0,190,205,177, 52,
+ 62, 70, 74,142, 63,101, 33,166, 0, 0, 0, 0, 63, 81,158,185,190,185, 44, 35, 62,228, 61, 43, 0, 0, 0, 0, 65, 68, 95, 62,
+192,173,120, 51, 64,213,208,115, 63,128, 0, 0, 62,229,157,178,191, 38, 78,123,191, 81,169,114,191, 81,158,184, 63,127, 90,117,
+ 62,160, 82,160, 62,185, 53,157, 62,185, 44, 35,188,109,180,145, 63,185, 65,249,190,228, 72,216,190,228, 61, 42, 0, 0, 0, 0,
+ 0, 0, 0, 0, 65,108,171, 31, 65,111,210, 33, 62,191,240,221, 63, 85,116, 84,188, 70,177, 32, 51,212, 0, 0,190,126,103,189,
+ 61,245, 64, 99, 63, 13,178,164, 50, 32, 0, 0,194,117,112,201, 65,216,208,182,194, 5,158,222,192,159,251,235, 66,114, 54,221,
+193,213,247, 29, 66, 3,221, 58, 64,160, 4, 26, 62,209,239, 68,190,205,177, 51, 63, 81,158,184, 0, 0, 0, 0, 63,105,119, 70,
+ 62, 70, 74,143,190,185, 44, 35, 0, 0, 0, 0,188, 89, 84,162, 63,101, 33,166, 62,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,193,111,210, 33, 63,128, 0, 0, 62,229,157,178,191, 38, 78,123,191, 81,169,114,191, 81,158,184, 63,127, 90,117,
+ 62,160, 82,160, 62,185, 53,157, 62,185, 44, 35,188,109,180,145, 63,185, 65,249,190,228, 72,216,190,228, 61, 42, 0, 0, 0, 0,
+ 0, 0, 0, 0, 65,108,171, 31, 65,111,210, 33, 63,182,184,123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,182,184,123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,182,184,123, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 55, 62, 92,190,224,186, 56,190,148,203,237,190,234,236, 3, 65,111,210, 33,
+ 65,111,210, 33, 0, 0, 0, 0, 0, 0, 0, 0, 58,166,112,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,
+ 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 66, 12, 33, 32, 66,137,152, 85, 66,126, 27,113, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 0, 4,212,181, 64, 0, 0, 0,154,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 51, 51, 51, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 7, 2,152,196, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 24, 8, 0, 0, 0, 0, 66, 12, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 61,204,204,205, 68,122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3,255,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, 0,148, 4,212,182,208, 0, 0, 0,190, 0, 0, 0, 1, 4,212,247,144, 4,212, 43, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 71, 97,109,101, 32, 76,111,103,105, 99, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,212,183,144, 4,212,186,208, 4,212,187, 16, 4,212,192, 16, 4,212,192, 80,
+ 4,212,242, 48, 0, 0, 0, 0, 0, 0, 0, 0, 2,152,190, 32, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,183,144, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,212,183,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,183,208,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,212,184, 16, 4,212,183,144, 0, 0, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,212,184, 16, 0, 0, 0,191, 0, 0, 0, 1, 4,212,184, 80, 4,212,183,208, 0, 0, 0, 0, 7,128, 4,128,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,184, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,212,184,144, 4,212,184, 16,
+ 0, 0, 0, 0, 7,128, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,184,144, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,212,184,208, 4,212,184, 80, 0, 0, 0, 0, 0, 0, 4,100, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,184,208,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,212,185, 16, 4,212,184,144, 0, 0, 0, 0, 7,128, 4,100, 0, 0, 0, 1, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,212,185, 16, 0, 0, 0,191, 0, 0, 0, 1, 4,212,185, 80, 4,212,184,208, 0, 0, 0, 0, 0, 0, 1,184,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,185, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,212,185,144, 4,212,185, 16,
+ 0, 0, 0, 0, 6, 32, 1,184, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,185,144, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,212,185,208, 4,212,185, 80, 0, 0, 0, 0, 6, 32, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,185,208,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,212,186, 16, 4,212,185,144, 0, 0, 0, 0, 7,128, 1,184, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,212,186, 16, 0, 0, 0,191, 0, 0, 0, 1, 4,212,186, 80, 4,212,185,208, 0, 0, 0, 0, 5, 64, 1,184,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,186, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,212,186,144, 4,212,186, 16,
+ 0, 0, 0, 0, 5, 64, 4,100, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,186,144, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,212,186,208, 4,212,186, 80, 0, 0, 0, 0, 1, 68, 1,184, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,186,208,
+ 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 4,212,186,144, 0, 0, 0, 0, 1, 68, 4,100, 0, 0, 0, 1, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,212,187, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,212,187, 80, 0, 0, 0, 0, 4,212,183,208, 4,212,184, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,187, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,212,187,144,
+ 4,212,187, 16, 4,212,183,208, 4,212,184,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,187,144,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,212,187,208, 4,212,187, 80, 4,212,184, 16, 4,212,184,208, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,212,187,208, 0, 0, 0,192, 0, 0, 0, 1, 4,212,188, 16, 4,212,187,144, 4,212,184,144,
+ 4,212,184,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,188, 16, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,212,188, 80, 4,212,187,208, 4,212,184,144, 4,212,185, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,212,188, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,212,188,144, 4,212,188, 16, 4,212,185, 16, 4,212,185, 80, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,188,144, 0, 0, 0,192, 0, 0, 0, 1, 4,212,188,208, 4,212,188, 80,
+ 4,212,184, 80, 4,212,185,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,188,208, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,212,189, 16, 4,212,188,144, 4,212,185, 80, 4,212,185,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,212,189, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,212,189, 80, 4,212,188,208, 4,212,183,144, 4,212,185, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,189, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,212,189,144,
+ 4,212,189, 16, 4,212,183,144, 4,212,185,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,189,144,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,212,189,208, 4,212,189, 80, 4,212,184,208, 4,212,185,208, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,212,189,208, 0, 0, 0,192, 0, 0, 0, 1, 4,212,190, 16, 4,212,189,144, 4,212,184, 80,
+ 4,212,185,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,190, 16, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,212,190, 80, 4,212,189,208, 4,212,185, 80, 4,212,185,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,212,190, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,212,190,144, 4,212,190, 16, 4,212,186, 16, 4,212,186, 80, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,190,144, 0, 0, 0,192, 0, 0, 0, 1, 4,212,190,208, 4,212,190, 80,
+ 4,212,184,208, 4,212,186, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,190,208, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,212,191, 16, 4,212,190,144, 4,212,185,208, 4,212,186, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,212,191, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,212,191, 80, 4,212,190,208, 4,212,185, 16, 4,212,186,144,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,191, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,212,191,144,
+ 4,212,191, 16, 4,212,186, 16, 4,212,186,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,191,144,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,212,191,208, 4,212,191, 80, 4,212,184,144, 4,212,186,208, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,212,191,208, 0, 0, 0,192, 0, 0, 0, 1, 4,212,192, 16, 4,212,191,144, 4,212,186, 80,
+ 4,212,186,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,192, 16, 0, 0, 0,192, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,212,191,208, 4,212,186,144, 4,212,186,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96,
+ 4,212,192, 80, 0, 0, 0,194, 0, 0, 0, 1, 4,212,195, 32, 0, 0, 0, 0, 4,212,184,144, 4,212,183,208, 4,212,184, 16,
+ 4,212,184,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,128, 0, 0, 4,101, 0, 0, 4,128, 7, 7, 7,129, 0, 28, 0, 1,
+ 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 4,212,247, 48, 4,212,247, 48, 4,212,192,224, 4,212,194, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,192,224, 0, 0, 0,195, 0, 0, 0, 1,
+ 4,212,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,133,160, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,240, 32, 0,
+ 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,128, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0,
+ 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 7,129,
+ 0, 26, 7,129, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,128, 0, 0, 4,101,
+ 0, 0, 4,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,129, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,212,194, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212,192,224, 0, 0, 0, 0, 69,109,240, 0,192,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68,238, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 7,112, 0, 0, 7,129, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7,111, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 7,111, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 2, 0, 0,
+ 0, 1, 3, 3, 0, 2, 4, 0, 0, 10, 7,129, 0, 2, 7,112, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,128, 0, 0, 4,127, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,129, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,212,195, 32, 0, 0, 0,194, 0, 0, 0, 1, 4,212,216, 48, 4,212,192, 80,
+ 4,212,185,144, 4,212,185, 80, 4,212,185,208, 4,212,184, 80, 0, 0, 0, 0, 0, 0, 6, 33, 0, 0, 7,128, 0, 0, 0, 0,
+ 0, 0, 1,183, 4, 4, 1, 96, 1,184, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,212,215, 48, 4,212,215, 48,
+ 4,212,195,176, 4,212,196,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,212,195,176, 0, 0, 0,195, 0, 0, 0, 1, 4,212,196,208, 0, 0, 0, 0, 0, 0, 0, 0, 67,160, 0, 0, 0, 0, 0, 0,
+ 65,208, 0, 0, 0, 0, 0, 0, 67,176, 0, 0, 0, 0, 0, 0, 65,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 95, 0, 0, 0, 0,
+ 0, 0, 0, 30, 67,137,128, 0, 65,200, 0, 0, 67,137,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1, 96, 0, 31, 1, 96, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6, 33, 0, 0, 7,128, 0, 0, 1,153, 0, 0, 1,183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 96, 0, 31, 0, 0, 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, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,196,208, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212,195,176,
+ 0, 0, 0, 0, 67,175,128, 0,196, 86,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,167,127,255,195,204,127,255, 0, 0, 0, 0,
+ 0, 0, 1, 79, 0, 0, 1, 96, 0, 0, 0, 0, 0, 0, 1,152, 0, 0, 0, 0, 0, 0, 1, 78, 0, 0, 0, 0, 0, 0, 0, 17,
+ 0, 0, 0, 0, 0, 0, 1, 78, 0, 0, 0, 0, 0, 0, 1,152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 64, 0, 0, 0, 1, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 1, 96, 1,153, 1, 79, 1,153, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 33, 0, 0, 7,128, 0, 0, 0, 0, 0, 0, 1,152, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 96, 1,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,212,197,240, 4,212,213,192,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,197,240, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212,199, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
+111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,
+111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,220, 1, 78, 0, 36, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,199, 96, 0, 0, 0,193, 0, 0, 0, 1, 4,212,200,208, 4,212,197,240,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,135, 1, 78, 0, 61, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,
-120,240,254, 2, 0, 0, 0, 0,104, 15,253, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 82, 71, 97,109,101, 32, 76,111,103,105, 99, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 24,168,254, 2, 0, 0, 0, 0,
-216,176,254, 2, 0, 0, 0, 0, 72,177,254, 2, 0, 0, 0, 0, 40,233,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212,200,208, 0, 0, 0,193, 0, 0, 0, 1, 4,212,202, 64, 4,212,199, 96, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,
+114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,111,
+ 1, 78, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-216,162,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,
-104,162,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
- 72,163,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-152,164,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,
- 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
- 8,165,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 24, 6,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24, 6, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
- 88,166,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,172, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0,
-232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 5,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-200,166,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 56, 5, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 64, 1,172, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 24,168,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,168,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,136,168,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,168,254, 2, 0, 0, 0, 0,
- 24,168,254, 2, 0, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,248,168,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,169,254, 2, 0, 0, 0, 0,
-136,168,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,104,169,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,169,254, 2, 0, 0, 0, 0,
-248,168,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,216,169,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,170,254, 2, 0, 0, 0, 0,
-104,169,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 72,170,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,170,254, 2, 0, 0, 0, 0,
-216,169,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,184,170,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,171,254, 2, 0, 0, 0, 0,
- 72,170,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 40,171,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,171,254, 2, 0, 0, 0, 0,
-184,170,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,152,171,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,172,254, 2, 0, 0, 0, 0,
- 40,171,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 8,172,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,172,254, 2, 0, 0, 0, 0,
-152,171,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,120,172,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,172,254, 2, 0, 0, 0, 0,
- 8,172,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,232,172,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,173,254, 2, 0, 0, 0, 0,
-120,172,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 88,173,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,173,254, 2, 0, 0, 0, 0,
-232,172,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,200,173,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,174,254, 2, 0, 0, 0, 0,
- 88,173,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 56,174,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,174,254, 2, 0, 0, 0, 0,
-200,173,254, 2, 0, 0, 0, 0, 40,164,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,168,174,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,175,254, 2, 0, 0, 0, 0,
- 56,174,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 24,175,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,175,254, 2, 0, 0, 0, 0,
-168,174,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,136,175,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,175,254, 2, 0, 0, 0, 0,
- 24,175,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,248,175,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,176,254, 2, 0, 0, 0, 0,
-136,175,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,104,176,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,176,254, 2, 0, 0, 0, 0,
-248,175,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,216,176,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-104,176,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0,168,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0, 72,177,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 24,181,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,104,162,254, 2, 0, 0, 0, 0,216,162,254, 2, 0, 0, 0, 0,
- 40,164,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0,
- 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,239,254, 2, 0, 0, 0, 0,
-232,239,254, 2, 0, 0, 0, 0, 56,178,254, 2, 0, 0, 0, 0,168,179,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 56,178,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,168,179,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-168,179,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,178,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
-112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,111, 7, 0, 0, 18, 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,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
- 24,181,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,168,205,254, 2, 0, 0, 0, 0, 72,177,254, 2, 0, 0, 0, 0,
-120,165,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 72,163,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,171, 1, 0, 0, 4, 4, 94, 1,172, 1, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,204,254, 2, 0, 0, 0, 0,104,204,254, 2, 0, 0, 0, 0,
- 8,182,254, 2, 0, 0, 0, 0,120,183,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,182,254, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,120,183,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,175, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 1, 0, 0,
- 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 94, 1, 31, 0, 94, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0,141, 1, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 94, 1, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,183,254, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,182,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,174, 67,
- 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,255,127,166, 67,255,127,198,195, 0, 0, 0, 0, 77, 1, 0, 0, 94, 1, 0, 0,
- 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 76, 1, 0, 0,
- 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0, 94, 1,141, 1, 77, 1,141, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 25, 6, 0, 0,118, 7, 0, 0, 0, 0, 0, 0,140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 94, 1,141, 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,
-232,184,254, 2, 0, 0, 0, 0,200,202,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,184,254, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,136,186,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255, 76, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,136,186,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,188,254, 2, 0, 0, 0, 0,
-232,184,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255, 76, 1, 61, 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, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,202, 64, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212,203,176, 4,212,200,208, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
+105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,100,105,109,101,110,115,
+105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,140, 1, 78, 0,203, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,188,254, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,200,189,254, 2, 0, 0, 0, 0,136,186,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212,203,176, 0, 0, 0,193, 0, 0, 0, 1, 4,212,205, 32, 4,212,202, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,254, 58, 1, 78, 0, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,200,189,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,104,191,254, 2, 0, 0, 0, 0,
- 40,188,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,205, 32,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212,206,144, 4,212,203,176, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,
-110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254, 76, 1,203, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,104,191,254, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 8,193,254, 2, 0, 0, 0, 0,200,189,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
+ 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 97,109,112,108,101,100, 32,
+ 77,111,116,105,111,110, 32, 66,108,117,114, 0,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 34, 1, 78, 0, 0,
+ 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254, 76, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,206,144, 0, 0, 0,193, 0, 0, 0, 1, 4,212,208, 0,
+ 4,212,205, 32, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 8,193,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,168,194,254, 2, 0, 0, 0, 0,
-104,191,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,
-112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254, 76, 1, 0, 0,
- 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,164, 1, 78, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212,208, 0, 0, 0, 0,193, 0, 0, 0, 1, 4,212,209,112, 4,212,206,144, 0, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,168,194,254, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 72,196,254, 2, 0, 0, 0, 0, 8,193,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
+ 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,253, 10, 1, 78, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253, 76, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,209,112, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212,210,224, 4,212,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
+114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,
+114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,242, 1, 78, 0, 0, 0, 0, 0, 0,
+ 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 72,196,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,232,197,254, 2, 0, 0, 0, 0,
-168,194,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253, 76, 1,130, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,210,224, 0, 0, 0,193, 0, 0, 0, 1, 4,212,212, 80, 4,212,209,112,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,
+103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,218, 1, 78, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,232,197,254, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,136,199,254, 2, 0, 0, 0, 0, 72,196,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212,212, 80, 0, 0, 0,193, 0, 0, 0, 1, 4,212,213,192, 4,212,210,224, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,
+112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,194,
+ 1, 78, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252, 76, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,213,192, 0, 0, 0,193, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,212,212, 80, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 98, 97,107,101, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,136,199,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 40,201,254, 2, 0, 0, 0, 0,
-232,197,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
- 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252, 76, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,170, 1, 78, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 40,201,254, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,200,202,254, 2, 0, 0, 0, 0,136,199,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,216, 4,212,215, 48, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252, 76, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 21,255, 0, 0, 0,160, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,212,216, 48, 0, 0, 0,194, 0, 0, 0, 1,
+ 4,212,221,240, 4,212,195, 32, 4,212,183,144, 4,212,185, 16, 4,212,185, 80, 4,212,185,144, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6, 31, 0, 0, 0, 0, 0, 0, 1,183, 17, 17, 6, 32, 1,184, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,212,221,144, 4,212,221,144, 4,212,216,192, 4,212,220,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,212,216,192, 0, 0, 0,195, 0, 0, 0, 1, 4,212,217,224, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 74, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,196, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6, 31, 0, 0, 0, 0, 0, 0, 0, 25, 68, 63,192, 0, 65,200, 0, 0, 68, 63,192, 0, 65,200, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 6, 32, 0, 26, 6, 32, 0, 26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 31, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 6, 32, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,200,202,254, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 40,201,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,217,224, 0, 0, 0,195, 0, 0, 0, 1,
+ 4,212,220,112, 4,212,216,192, 0, 0, 0, 0, 67, 92, 0, 0,195,207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 75, 0, 0,
+195,207, 0, 0, 0, 0, 0, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 1,157, 0, 0, 0, 0, 0, 0, 0,202,
+ 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 1,157, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 3, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 0,220,
+ 1,158, 0,203, 1,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26,
+ 0, 0, 1,183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 1,158, 0, 0, 0, 4, 0, 3, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252, 76, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,212,219, 0, 4,212,219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,212,219, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73,
+ 67, 95, 80, 84, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73,
+ 67, 95, 80, 84, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,111,112,
+101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,196,
+ 0,203, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0,104,204,254, 2, 0, 0, 0, 0,
-159, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,220,112, 0, 0, 0,195, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,212,217,224, 0, 0, 0, 0, 68,160, 0, 0, 0, 0, 0, 0, 67,112, 0, 0,195, 31, 80, 0, 68,179,234, 0,
+194,235,159,188, 67,178,231,239, 0, 0, 5, 51, 0, 0, 5, 68, 0, 0, 0, 18, 0, 0, 1,157, 0, 0, 0, 0, 0, 0, 5, 50,
+ 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 5, 50, 0, 0, 0, 18, 0, 0, 1,157, 63,128, 0, 0, 63,128, 0, 0,
+ 70,250, 0, 0, 70,250, 0, 0, 63, 0, 0, 0, 63,154,225, 72, 0, 10, 0, 0, 0, 0, 0, 3, 0, 0, 4, 0, 0, 0, 5, 68,
+ 1,158, 5, 51, 1,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 6, 31, 0, 0, 0, 26,
+ 0, 0, 1,183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 68, 1,158, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 52,
+ 4,212,221,144, 0, 0, 0,172, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 96, 4,212,221,240, 0, 0, 0,194, 0, 0, 0, 1, 4,212,224,192, 4,212,216, 48, 4,212,186, 16,
+ 4,212,186, 80, 4,212,184,208, 4,212,185,208, 0, 0, 0, 0, 0, 0, 5, 65, 0, 0, 7,128, 0, 0, 1,185, 0, 0, 4, 99,
+ 9, 9, 2, 64, 2,171, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,152,136, 32, 2,152,136, 32, 4,212,222,128,
+ 4,212,223,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,222,128,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,212,223,160, 0, 0, 0, 0, 0, 0, 0, 0, 67,230, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
+ 0, 0, 0, 0, 68, 16, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 63, 0, 0, 0, 0, 0, 0, 0, 25,
+ 67,181,128, 0, 65,200, 0, 0, 67,181,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3,
+ 0, 4, 4, 12, 0, 10, 2, 64, 0, 26, 2, 64, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 65,
+ 0, 0, 7,128, 0, 0, 1,185, 0, 0, 1,210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 0, 26,
+ 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,212,223,160, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212,222,128, 0, 0, 0, 0,
+ 67,181,128, 0, 0, 0, 0, 0, 67,218,128, 0, 0, 0, 0, 0, 68, 1,248,131, 0, 0, 0, 0, 68, 20, 63,118, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 63, 0, 0, 0, 0, 0, 0, 2,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 35,215, 10,
+ 68,122, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 4, 0, 0, 10, 2, 64, 2,145, 2, 64, 2,145, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 65, 0, 0, 7,128, 0, 0, 1,211, 0, 0, 4, 99, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 64, 2,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 2,136, 2,152,136, 32, 0, 0, 0,166, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0,168,205,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 24,213,254, 2, 0, 0, 0, 0,
- 24,181,254, 2, 0, 0, 0, 0,248,161,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0, 8,165,254, 2, 0, 0, 0, 0,
-120,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0,171, 1, 0, 0,
- 17, 17, 24, 6,172, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,212,254, 2, 0, 0, 0, 0,
-136,212,254, 2, 0, 0, 0, 0,152,206,254, 2, 0, 0, 0, 0, 24,211,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-152,206,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 8,208,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,151, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,195, 68, 0, 0, 0, 0, 0, 0,208, 65,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192, 63, 68, 0, 0,200, 65, 0,192, 63, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 24, 6, 26, 0, 24, 6, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 6, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 6, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 8,208,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 24,211,254, 2, 0, 0, 0, 0,152,206,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 92, 67, 0, 0,201,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0, 0,201,195, 0, 0, 0, 0,
-203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,146, 1,203, 0,146, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,171, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0,146, 1, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,120,209,254, 2, 0, 0, 0, 0,120,209,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
-120,209,254, 2, 0, 0, 0, 0,193, 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, 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111,112,101,114,116,
-105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 79, 71, 73, 67, 95, 80, 84, 95,112,114,111,112,101,114,116,
-105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196,255,203, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,211,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,208,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 0, 0, 0, 0,112, 67,
- 0, 80, 31,195, 0,234,179, 68, 1, 0,224,194, 0, 0,176, 67, 43, 5, 0, 0, 60, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0,
- 0, 0, 0, 0, 42, 5, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 42, 5, 0, 0, 18, 0, 0, 0,145, 1, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,250, 70, 0, 0,250, 70, 0, 0, 0, 63, 72,225,154, 63, 10, 0, 0, 0, 0, 0, 3, 0,
- 0, 0, 0, 4, 0, 0, 60, 5,146, 1, 43, 5,128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-220, 0, 0, 0, 23, 6, 0, 0, 26, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 60, 5,146, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 0, 0, 0,136,212,254, 2, 0, 0, 0, 0,172, 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,
- 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 7, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 24,213,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
-200,219,254, 2, 0, 0, 0, 0,168,205,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0,
- 40,164,254, 2, 0, 0, 0, 0,232,165,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,
-173, 1, 0, 0, 69, 4, 0, 0, 9, 9, 62, 2,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232,216,254, 2, 0, 0, 0, 0,232,216,254, 2, 0, 0, 0, 0, 8,214,254, 2, 0, 0, 0, 0,120,215,254, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 8,214,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,120,215,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128, 15, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,181, 67, 0, 0,200, 65,
- 0,128,181, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 62, 2,
- 26, 0, 62, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,
-173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,120,215,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,214,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,181, 67, 0, 0, 0, 0, 0,128,218, 67, 0, 0, 0, 0,131,248, 1, 68,
- 0, 0, 0, 0, 78,176, 16, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0, 62, 2,
-127, 2, 62, 2,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 5, 0, 0,118, 7, 0, 0,
-199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2,127, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,212,224,192, 0, 0, 0,194, 0, 0, 0, 1, 4,212,242, 48,
+ 4,212,221,240, 4,212,186,144, 4,212,186,208, 4,212,186, 80, 4,212,186, 16, 0, 0, 0, 0, 0, 0, 1, 69, 0, 0, 5, 63,
+ 0, 0, 1,185, 0, 0, 4, 99, 1, 1, 3,251, 2,171, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,212,241, 0,
+ 4,212,241, 0, 4,212,225, 80, 4,212,239,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0,248, 4,212,225, 80, 0, 0, 0,195, 0, 0, 0, 1, 4,212,226,112, 0, 0, 0, 0, 0, 0, 0, 0, 68, 98, 64, 0,
+ 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,126,192, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,250,
+ 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 3,251, 0, 26, 3,251, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 69, 0, 0, 5, 63, 0, 0, 1,185, 0, 0, 1,210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3,251, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,152, 2, 0, 0,232,216,254, 2, 0, 0, 0, 0,166, 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, 9, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,226,112, 0, 0, 0,195, 0, 0, 0, 1, 4,212,227,144,
+ 4,212,225, 80, 0, 0, 0, 0, 67, 15, 0, 0,196, 70, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 15, 0, 0,196, 70,127,255,
+ 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 3, 43, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0,
+ 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 3, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 3, 44, 0,143,
+ 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 69, 0, 0, 1, 69, 0, 0, 1,211, 0, 0, 4, 99,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,145, 0, 0, 0, 5, 0, 3, 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, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,227,144,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,212,228,176, 4,212,226,112, 0, 0, 0, 0, 67, 16, 0, 0,194,206, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67, 16,102,231,194,206, 0, 0, 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119,
+ 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 7,
+ 0, 18, 4, 0, 0, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 69,
+ 0, 0, 5, 63, 0, 0, 1,211, 0, 0, 1,211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
+ 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,212,228,176, 0, 0, 0,195, 0, 0, 0, 1, 4,212,239,224, 4,212,227,144, 0, 0, 0, 0,
+ 67, 52, 0, 0,196,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 35, 0, 0,196,109, 0, 0,195,145,128, 0, 0, 0, 0,163,
+ 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 2,144, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0,
+ 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 2,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 64, 0, 0, 0, 1, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 0,180, 2,145, 0,163, 2,145, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 63, 0, 0, 5, 63, 0, 0, 1,211, 0, 0, 4, 99, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 4,212,229,208, 4,212,238,112, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,229,208, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,212,231, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,111, 98,106,101, 99,116,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,122, 0,163, 1,110, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,212,231, 64, 0, 0, 0,193, 0, 0, 0, 1, 4,212,232,176, 4,212,229,208, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,254, 18, 0,163, 0, 80, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,232,176,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,212,234, 32, 4,212,231, 64, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,118,105,101,119, 51,100, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,118,105,101,119, 51,100, 95,112,114,111,112,101,114,116,105,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,105,101,119, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,212, 0,163, 1, 38,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,234, 32, 0, 0, 0,193, 0, 0, 0, 1, 4,212,235,144,
+ 4,212,232,176, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,118,105,101,119, 51,100, 95,110, 97,109,
+101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,118,105,101,119, 51,100, 95,110, 97,109,
+101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73,116,101,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,152, 0,163, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,200,219,254, 2, 0, 0, 0, 0,
-194, 0, 0, 0, 1, 0, 0, 0, 40,233,254, 2, 0, 0, 0, 0, 24,213,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0,
-168,167,254, 2, 0, 0, 0, 0,200,166,254, 2, 0, 0, 0, 0, 88,166,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 1, 0, 0, 55, 5, 0, 0,173, 1, 0, 0, 69, 4, 0, 0, 1, 1,247, 3,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152,231,254, 2, 0, 0, 0, 0,152,231,254, 2, 0, 0, 0, 0,184,220,254, 2, 0, 0, 0, 0,
-120,226,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184,220,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 40,222,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0,192,125, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,246, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0,247, 3, 26, 0,247, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 1, 0, 0, 55, 5, 0, 0,173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-247, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,212,235,144, 0, 0, 0,193, 0, 0, 0, 1, 4,212,237, 0, 4,212,234, 32, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,118,105,101,119, 51,100, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,118,105,101,119, 51,100, 95,100,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 40,222,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-152,223,254, 2, 0, 0, 0, 0,184,220,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0,
- 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0, 43, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 1, 0, 0, 65, 1, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0,127, 2, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68,105,115,112,108, 97,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,252,128, 0,163, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,152,223,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 8,225,254, 2, 0, 0, 0, 0, 40,222,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194, 0, 0, 0, 0,
- 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0,
- 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0,199, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,237, 0, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,212,238,112, 4,212,235,144, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 98, 97,
+ 99,107,103,114,111,117,110,100, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95, 98, 97,
+ 99,107,103,114,111,117,110,100, 95,105,109, 97,103,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97, 99,107,103,114,111,117,110,100, 32, 73,
+109, 97,103,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,104, 0,163, 0, 0, 0, 20, 0, 0,
+ 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 8,225,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-120,226,254, 2, 0, 0, 0, 0,152,223,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,192,108,196, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 35, 67, 0,128, 23,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,111, 2, 0, 0,
- 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,111, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 0, 6, 0,180, 0,112, 2,163, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 55, 5, 0, 0, 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,212,238,112, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 4,212,237, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95,111,114,105,101,
+110,116, 97,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,114, 97,110,115,102,111,114,109, 95,111,114,105,101,
+110,116, 97,116,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,109, 32, 79,114,105,101,110,116, 97,116,105,111,110,115, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,226,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,225,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 80, 0,163, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,212,239,224, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,212,228,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 65, 1, 0, 0, 55, 5, 0, 0,199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-247, 3,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232,227,254, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,232,227,254, 2, 0, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,
-190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 49,123, 61, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,128, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
-190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 49,123, 61, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
-149, 53,207, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,115,130, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,121,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
-190, 35, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 49,123, 61, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,111, 18,131,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 1, 69, 0, 0, 5, 63, 0, 0, 1,211, 0, 0, 4, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 3,251, 2,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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,152,140, 32, 68, 65, 84, 65, 0, 0, 3, 68, 2,152,140, 32, 0, 0, 0,153, 0, 0, 0, 1, 61, 30, 35,190, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,117, 69,219, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,128, 0, 0, 0,
+187, 3, 18,111,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61, 30, 35,190, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,117, 69,219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+187, 3, 18,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 65,207, 53,149, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,133,153, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+195,249,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61, 30, 35,190, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,117, 69,219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+187, 3, 18,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,149, 53,207, 65,214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0,
-240, 11, 81, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 65,207, 53,149, 65,111,211,214, 0, 0, 0, 0, 0, 0, 0, 0, 61, 80, 57,221, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 55, 62, 92,190,224,186, 56,190,148,203,237,
+190,234,236, 3, 0, 1, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 0, 4,212,241, 0, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 7, 2,152,196, 32, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 3, 0, 0, 0, 1, 0, 3,
+ 0, 0, 8, 8, 0, 0, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 61,204,204,205, 68,122, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 68, 65, 84, 65, 0, 0, 0, 96, 4,212,242, 48, 0, 0, 0,194,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,212,224,192, 4,212,185, 16, 4,212,184,144, 4,212,186,208, 4,212,186,144, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 67, 0, 0, 1,185, 0, 0, 4, 99, 3, 3, 1, 68, 2,171, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,212,245, 0, 4,212,245, 0, 4,212,242,192, 4,212,243,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,242,192, 0, 0, 0,195, 0, 0, 0, 1, 4,212,243,224, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67,244,128, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 67,162, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0,152,231,254, 2, 0, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 67, 0, 0, 0, 0, 0, 0, 0, 25, 67, 83, 0, 0, 65,200, 0, 0, 67, 83, 0, 0, 65,200, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1, 68, 0, 26, 1, 68, 0, 26, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 67, 0, 0, 1,185, 0, 0, 1,210, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 68, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,212,243,224, 0, 0, 0,195,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,212,242,192, 0, 0, 0, 0, 67,131,128, 0,194,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67,153,128, 0,196, 31,192, 0, 0, 0, 0, 0, 0, 0, 1, 51, 0, 0, 1, 68, 0, 0, 0, 18, 0, 0, 2,144, 0, 0, 0, 0,
+ 0, 0, 1, 50, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1, 50, 0, 0, 0, 18, 0, 0, 2,144, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 6, 18, 0, 0, 0, 2, 3, 3, 0, 0, 4, 12,
+ 0, 6, 1, 68, 2,145, 1, 51, 2,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 67,
+ 0, 0, 1,211, 0, 0, 4, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 68, 2,145, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0,244, 4,212,245, 0, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,212,246, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 0, 0, 0, 12, 4,212,246, 32, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14,
+ 4,212,246, 96, 68, 65, 84, 65, 0, 0, 0,168, 4,212,246, 96, 0, 0, 0,216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 1,
+ 2,152,190, 32, 0, 19, 0, 0, 0, 1, 0, 1, 2,152,190, 32, 0, 20, 0, 0, 0, 1, 0, 1, 2,152,190, 32, 0, 21, 0, 1,
+ 0, 1, 0, 0, 2,152,190, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,120,240, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,202, 32,
+ 0, 0, 0, 0, 0, 1, 0, 1, 4,213,128,192, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,214, 32, 0, 0, 0, 0, 0, 1, 0, 1,
+ 4,213,127, 16, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,208, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,117,128, 0, 0, 0, 0,
+ 0, 1, 0, 1, 2,152,196, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,116,240, 0, 21, 0, 0, 0, 1, 0, 1, 2,152,190, 32,
+ 0, 0, 83, 78, 0, 0, 0,148, 4,212,247,144, 0, 0, 0,190, 0, 0, 0, 1, 4,213, 50,160, 4,212,182,208, 0, 0, 0, 0,
+ 0, 0, 0, 0, 83, 82, 83, 99,114,105,112,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,212,248, 80, 4,212,251,208, 4,212,252, 16, 4,218,196,240, 4,213, 1,208, 4,213, 47,112,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2,152,190, 32, 0, 0, 0, 0, 0, 0, 0, 6, 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, 53,222, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,248, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,212,248,144,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,248,144, 0, 0, 0,191,
+ 0, 0, 0, 1, 4,212,248,208, 4,212,248, 80, 0, 0, 0, 0, 0, 0, 4,128, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20,
+ 4,212,248,208, 0, 0, 0,191, 0, 0, 0, 1, 4,212,249, 16, 4,212,248,144, 0, 0, 0, 0, 7,128, 4,128, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 20, 4,212,249, 16, 0, 0, 0,191, 0, 0, 0, 1, 4,212,249, 80, 4,212,248,208, 0, 0, 0, 0,
+ 7,128, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,249, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,212,249,144,
+ 4,212,249, 16, 0, 0, 0, 0, 0, 0, 4, 20, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,249,144, 0, 0, 0,191,
+ 0, 0, 0, 1, 4,212,249,208, 4,212,249, 80, 0, 0, 0, 0, 7,128, 4, 20, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20,
+ 4,212,249,208, 0, 0, 0,191, 0, 0, 0, 1, 4,212,250, 16, 4,212,249,144, 0, 0, 0, 0, 5,240, 4, 20, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 20, 4,212,250, 16, 0, 0, 0,191, 0, 0, 0, 1, 4,212,250, 80, 4,212,249,208, 0, 0, 0, 0,
+ 5,240, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,250, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,212,250,144,
+ 4,212,250, 16, 0, 0, 0, 0, 0, 0, 1,144, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,250,144, 0, 0, 0,191,
+ 0, 0, 0, 1, 4,212,251, 16, 4,212,250, 80, 0, 0, 0, 0, 5,240, 1,144, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20,
+ 4,212,251, 16, 0, 0, 0,191, 0, 0, 0, 1, 4,212,251, 80, 4,212,250,144, 0, 0, 0, 0, 2,248, 1,144, 0, 0, 0, 1,
+ 68, 65, 84, 65, 0, 0, 0, 20, 4,212,251, 80, 0, 0, 0,191, 0, 0, 0, 1, 4,212,251,144, 4,212,251, 16, 0, 0, 0, 0,
+ 5,240, 3, 68, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,251,144, 0, 0, 0,191, 0, 0, 0, 1, 4,212,251,208,
+ 4,212,251, 80, 0, 0, 0, 0, 7,128, 3, 68, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,212,251,208, 0, 0, 0,191,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,212,251,144, 0, 0, 0, 0, 2,248, 4, 20, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,212,252, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,212,252, 80, 0, 0, 0, 0, 4,212,248,144, 4,212,248,208, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,252, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,212,252,144, 4,212,252, 16,
+ 4,212,248,144, 4,212,249, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,252,144, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,212,252,208, 4,212,252, 80, 4,212,248,208, 4,212,249,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,212,252,208, 0, 0, 0,192, 0, 0, 0, 1, 4,212,253, 16, 4,212,252,144, 4,212,249, 80, 4,212,249,144,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,253, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,212,253, 80,
+ 4,212,252,208, 4,212,249,144, 4,212,249,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,253, 80,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,212,253,144, 4,212,253, 16, 4,212,249, 16, 4,212,250, 16, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,212,253,144, 0, 0, 0,192, 0, 0, 0, 1, 4,212,253,208, 4,212,253, 80, 4,212,248, 80,
+ 4,212,250, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,253,208, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,212,254, 16, 4,212,253,144, 4,212,249, 80, 4,212,250, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,212,254, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,212,254, 80, 4,212,253,208, 4,212,249,208, 4,212,250,144, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,254, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,212,255, 16, 4,212,254, 16,
+ 4,212,250, 16, 4,212,250,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,255, 16, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,212,255, 80, 4,212,254, 80, 4,212,250, 80, 4,212,251, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,212,255, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,212,255,208, 4,212,255, 16, 4,212,250,144, 4,212,251, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,212,255,208, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 0, 16,
+ 4,212,255, 80, 4,212,250, 16, 4,212,251, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 0, 16,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,213, 0, 80, 4,212,255,208, 4,212,249,208, 4,212,251, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 0, 80, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 0,144, 4,213, 0, 16, 4,212,249,144,
+ 4,212,251,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 0,144, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,213, 0,208, 4,213, 0, 80, 4,212,249, 16, 4,212,251,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,213, 0,208, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 1, 16, 4,213, 0,144, 4,212,251, 80, 4,212,251,144, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 1, 16, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 1, 80, 4,213, 0,208,
+ 4,212,249, 80, 4,212,251,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 1, 80, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,213, 1,144, 4,213, 1, 16, 4,212,249,208, 4,212,251,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,213, 1,144, 0, 0, 0,192, 0, 0, 0, 1, 10, 62,170,240, 4,213, 1, 80, 4,212,251, 16, 4,212,251,208,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 10, 62,170,240, 0, 0, 0,192, 0, 0, 0, 1, 4,218,196,240,
+ 4,213, 1,144, 4,212,250, 80, 4,212,250,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,218,196,240,
+ 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 10, 62,170,240, 4,212,248, 80, 4,212,250, 16, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 1,208, 0, 0, 0,194, 0, 0, 0, 1, 4,213, 4,160, 0, 0, 0, 0, 4,212,249, 80,
+ 4,212,248,144, 4,212,248,208, 4,212,249,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,128, 0, 0, 4, 21, 0, 0, 4,128,
+ 7, 7, 7,129, 0,108, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 2, 23,154,128, 4,213, 50, 64, 4,213, 50, 64, 4,213, 2, 96,
+ 4,213, 3,128, 0, 0, 0, 0, 0, 0, 0, 0, 9,182,164, 16, 10, 50,217,240, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 2, 96,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,213, 3,128, 0, 0, 0, 0, 0, 0, 0, 0, 68,133,160, 0, 0, 0, 0, 0, 65,208, 0, 0,
+ 0, 0, 0, 0, 68,240, 32, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,128, 0, 0, 0, 0, 0, 0, 0, 25,
+ 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3,
+ 0, 4, 4, 12, 0, 10, 7,129, 0, 26, 7,129, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 7,128, 0, 0, 4,103, 0, 0, 4,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,129, 0, 26,
+ 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,155,208,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,213, 3,128, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 2, 96, 0, 0, 0, 0,
+ 68,240, 0, 0, 0, 0, 0, 0, 65, 48, 0, 0, 0, 0, 0, 0, 68,238, 0, 0, 0, 0, 0, 0, 66,164, 0, 0, 0, 0, 7,112,
+ 0, 0, 7,129, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 7,111, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0,
+ 0, 0, 7,111, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 2, 2, 0, 0, 0, 1, 3, 3, 0, 2, 4, 0, 0, 10, 7,129, 0, 82, 7,112, 0, 82, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,128, 0, 0, 4, 21, 0, 0, 4,102, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 7,129, 0, 82, 0, 0, 0, 0, 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, 23,155, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 4,160, 0, 0, 0,194, 0, 0, 0, 1,
+ 4,213, 30, 96, 4,213, 1,208, 4,212,250, 16, 4,212,251, 80, 4,212,251,144, 4,212,249, 16, 0, 0, 0, 0, 0, 0, 5,241,
+ 0, 0, 7,128, 0, 0, 0, 0, 0, 0, 3, 67, 4, 4, 1,144, 3, 68, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,151,128,
+ 4,213, 24,176, 4,213, 24,176, 4,213, 5, 48, 4,213, 6, 80, 0, 0, 0, 0, 0, 0, 0, 0, 10, 50,219, 80, 10, 60, 71, 64,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,213, 5, 48, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 6, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67,160, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 67,200, 0, 0, 0, 0, 0, 0, 65,248, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,143, 0, 0, 0, 0, 0, 0, 0, 30, 67,137,128, 0, 65,200, 0, 0, 67,137,128, 0, 65,200, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 1,144, 0, 31, 1,144, 0, 31, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,241, 0, 0, 7,128, 0, 0, 3, 37, 0, 0, 3, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1,144, 0, 31, 0, 0, 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, 0, 2, 23,153,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 6, 80, 0, 0, 0,195, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,213, 5, 48, 0, 0, 0, 0, 67,199,128, 0,196, 86,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,191,127,254,
+196, 73, 63,254, 0, 0, 0, 0, 0, 0, 1,127, 0, 0, 1,144, 0, 0, 0, 0, 0, 0, 3, 36, 0, 0, 0, 0, 0, 0, 1,126,
+ 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 1,126, 0, 0, 0, 0, 0, 0, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 1, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 1,144,
+ 3, 37, 1,127, 3, 37, 0, 0, 10, 62,135, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 5,241, 0, 0, 7,128, 0, 0, 0, 0,
+ 0, 0, 3, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,144, 3, 37, 0, 0, 0, 0, 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, 23,152, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,213, 7,112, 4,213, 23, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,213, 7,112, 0, 0, 0,193, 0, 0, 0, 1, 4,213, 8,224, 0, 0, 0, 0, 2, 23,152,208, 0, 0, 0, 0, 66, 85, 84, 84,
+ 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84,
+ 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,
+101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,220,
+ 1,126, 0, 36, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 8,224, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,213, 10, 80, 4,213, 7,112, 9, 88,241,224, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8, 0, 0, 0, 0,
- 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 40,233,254, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,200,219,254, 2, 0, 0, 0, 0,152,164,254, 2, 0, 0, 0, 0,184,163,254, 2, 0, 0, 0, 0,
-168,167,254, 2, 0, 0, 0, 0, 56,167,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,
-173, 1, 0, 0, 69, 4, 0, 0, 3, 3, 64, 1,153, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-248,236,254, 2, 0, 0, 0, 0,248,236,254, 2, 0, 0, 0, 0, 24,234,254, 2, 0, 0, 0, 0,136,235,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 24,234,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,136,235,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,160, 67,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 83, 67, 0, 0,200, 65,
- 0, 0, 83, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 64, 1,
- 26, 0, 64, 1, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,
-173, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,136,235,254, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24,234,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,151, 67,
- 0, 64, 27,196, 0, 0, 0, 0, 47, 1, 0, 0, 64, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 46, 1, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 46, 1, 0, 0, 18, 0, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0, 64, 1,
-127, 2, 47, 1,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 0, 0,
-199, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1,127, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 24, 1, 0, 0,248,236,254, 2, 0, 0, 0, 0,163, 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, 3, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,238,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0, 88,238,254, 2, 0, 0, 0, 0,
-217, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0,184,238,254, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0,
-184,238,254, 2, 0, 0, 0, 0,216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
- 19, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0,
- 21, 0, 1, 0, 1, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0,232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0,232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0,
- 21, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0,
-190, 0, 0, 0, 1, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,216,160,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 83, 99,114,105,112,116,105,110,103, 0,103, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0,
- 40,248,254, 2, 0, 0, 0, 0,200, 1,255, 2, 0, 0, 0, 0, 56, 2,255, 2, 0, 0, 0, 0,120, 63,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-152,241,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-232,242,254, 2, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,
-120,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
- 88,243,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-168,244,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 5, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0,
- 56,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
- 24,245,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232, 5,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-104,246,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0,
-248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,184, 1, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-216,246,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,232, 5, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 44, 3, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 40,248,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,248,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,152,248,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,249,254, 2, 0, 0, 0, 0,
- 40,248,254, 2, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 8,249,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,249,254, 2, 0, 0, 0, 0,
-152,248,254, 2, 0, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,120,249,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,249,254, 2, 0, 0, 0, 0,
- 8,249,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,232,249,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,250,254, 2, 0, 0, 0, 0,
-120,249,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 88,250,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,250,254, 2, 0, 0, 0, 0,
-232,249,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,200,250,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,251,254, 2, 0, 0, 0, 0,
- 88,250,254, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 56,251,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,251,254, 2, 0, 0, 0, 0,
-200,250,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,168,251,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,252,254, 2, 0, 0, 0, 0,
- 56,251,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 24,252,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,252,254, 2, 0, 0, 0, 0,
-168,251,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,136,252,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,252,254, 2, 0, 0, 0, 0,
- 24,252,254, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,248,252,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,253,254, 2, 0, 0, 0, 0,
-136,252,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,104,253,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,253,254, 2, 0, 0, 0, 0,
-248,252,254, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,216,253,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,254,254, 2, 0, 0, 0, 0,
-104,253,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 72,254,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,254,254, 2, 0, 0, 0, 0,
-216,253,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,184,254,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,255,254, 2, 0, 0, 0, 0,
- 72,254,254, 2, 0, 0, 0, 0,168,244,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 40,255,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,255,254, 2, 0, 0, 0, 0,
-184,254,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,152,255,254, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8, 0,255, 2, 0, 0, 0, 0,
- 40,255,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 8, 0,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120, 0,255, 2, 0, 0, 0, 0,
-152,255,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,120, 0,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232, 0,255, 2, 0, 0, 0, 0,
- 8, 0,255, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,232, 0,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88, 1,255, 2, 0, 0, 0, 0,
-120, 0,255, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0, 88, 1,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200, 1,255, 2, 0, 0, 0, 0,
-232, 0,255, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 0, 0, 0,200, 1,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 88, 1,255, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0, 56, 2,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 8, 6,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0, 8,242,254, 2, 0, 0, 0, 0,120,242,254, 2, 0, 0, 0, 0,
-200,243,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0,
- 7, 7,119, 7, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 70,255, 2, 0, 0, 0, 0,
- 40, 70,255, 2, 0, 0, 0, 0, 40, 3,255, 2, 0, 0, 0, 0,152, 4,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 40, 3,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,152, 4,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 32,148, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-152, 4,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 3,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,240,109, 69, 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,
-112, 7, 0, 0,129, 7, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,111, 7, 0, 0, 18, 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,128, 63, 0, 0,128, 63, 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
- 8, 6,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,152, 30,255, 2, 0, 0, 0, 0, 56, 2,255, 2, 0, 0, 0, 0,
-168,244,254, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 72,247,254, 2, 0, 0, 0, 0,232,242,254, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 43, 3, 0, 0, 4, 4,142, 1, 44, 3, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 29,255, 2, 0, 0, 0, 0, 88, 29,255, 2, 0, 0, 0, 0,
-248, 6,255, 2, 0, 0, 0, 0,104, 8,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,248, 6,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,104, 8,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 67,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, 0, 0,248, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,141, 1, 0, 0,
- 0, 0, 0, 0, 30, 0, 0, 0, 0,128,137, 67, 0, 0,200, 65, 0,128,137, 67, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,142, 1, 31, 0,142, 1, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 13, 3, 0, 0, 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 31, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104, 8,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 6,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,198, 67,
- 0,128, 86,196, 0, 0, 0, 0, 0, 0, 0, 0,254,127,190, 67,254, 63, 67,196, 0, 0, 0, 0,125, 1, 0, 0,142, 1, 0, 0,
- 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
- 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 1, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,142, 1, 13, 3,125, 1, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 12, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 13, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-216, 9,255, 2, 0, 0, 0, 0,184, 27,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 9,255, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,120, 11,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 85, 84, 84, 79, 78, 83, 95, 80, 84, 95, 99,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 67,111,110,116,101,120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220,255,124, 1, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,120, 11,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 13,255, 2, 0, 0, 0, 0,
-216, 9,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,114,101,110,100,101,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135,255,124, 1, 61, 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, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,135, 1,126, 0, 61, 0, 0, 0, 0, 0, 0, 0, 6,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 13,255, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,184, 14,255, 2, 0, 0, 0, 0,120, 11,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 10, 80, 0, 0, 0,193, 0, 0, 0, 1, 4,213, 11,192, 4,213, 8,224, 9, 88,243,144,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,108, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,111,255,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 76, 97,121,101,114,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,255,111, 1,126, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,184, 14,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 88, 16,255, 2, 0, 0, 0, 0,
- 24, 13,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 11,192,
+ 0, 0, 0,193, 0, 0, 0, 1, 4,213, 13, 48, 4,213, 10, 80, 9, 89, 1, 16, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95,100,105,109,101,110,115,105,111,110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,105,109,101,110,115,105,111,
110,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140,254,124, 1,203, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,140, 1,126, 0,203,
+ 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 88, 16,255, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,248, 17,255, 2, 0, 0, 0, 0,184, 14,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,110,103, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 13, 48, 0, 0, 0,193, 0, 0, 0, 1, 4,213, 14,160,
+ 4,213, 11,192, 9, 88,253,176, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,
+110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95, 97,110,116,105, 97,108,105, 97,115,105,
+110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65,110,116,105, 45, 65,108,105, 97,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 58, 1,126, 0, 58, 0, 20, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0,
+ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,254,124, 1, 58, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,248, 17,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,152, 19,255, 2, 0, 0, 0, 0,
- 88, 16,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,117,108,108, 32, 83, 97,109,
-112,108,101, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,254,124, 1, 0, 0,
- 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,152, 19,255, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0, 56, 21,255, 2, 0, 0, 0, 0,248, 17,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,213, 14,160, 0, 0, 0,193, 0, 0, 0, 1, 4,213, 16, 16, 4,213, 13, 48, 9, 88,255, 96, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0,
+ 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,109,111,116,105,111,110, 95, 98,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 97,109,112,108,101,100, 32, 77,111,116,105,111,110, 32, 66,108,117,114, 0,108,117,114, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,164,253,124, 1,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0,254, 34, 1,126, 0, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 16, 16, 0, 0, 0,193,
+ 0, 0, 0, 1, 4,213, 17,128, 4,213, 14,160, 9, 88,245, 64, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104,
+ 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,104,
+ 97,100,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83,104, 97,100,105,110,103, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 56, 21,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,216, 22,255, 2, 0, 0, 0, 0,
-152, 19,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253,164, 1,126, 0,102, 0, 0, 0, 0,
+ 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,253,124, 1,130, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 17,128, 0, 0, 0,193, 0, 0, 0, 1, 4,213, 18,240, 4,213, 16, 16,
+ 9, 88,250, 80, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,216, 22,255, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,120, 24,255, 2, 0, 0, 0, 0, 56, 21,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,111,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 79,117,116,112,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,253, 10, 1,126, 0,130, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242,252,124, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64,
+ 4,213, 18,240, 0, 0, 0,193, 0, 0, 0, 1, 4,213, 20, 96, 4,213, 17,128, 9, 88,246,240, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68,
+ 69, 82, 95, 80, 84, 95,112,101,114,102,111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,101,114,102,
+111,114,109, 97,110, 99,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,242,
+ 1,126, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,120, 24,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 24, 26,255, 2, 0, 0, 0, 0,
-216, 22,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
- 84, 95,112,111,115,116, 95,112,114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111,
- 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,252,124, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 20, 96, 0, 0, 0,193, 0, 0, 0, 1,
+ 4,213, 21,208, 4,213, 18,240, 9, 88,248,160, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,
+114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,112,111,115,116, 95,112,
+114,111, 99,101,115,115,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,111,115,116, 32, 80,114,111, 99,101,115,115,105,110,103, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,218, 1,126, 0, 0, 0, 0, 0, 0, 0, 4, 0, 6,
+ 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24, 26,255, 2, 0, 0, 0, 0,
-193, 0, 0, 0, 1, 0, 0, 0,184, 27,255, 2, 0, 0, 0, 0,120, 24,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 21,208, 0, 0, 0,193, 0, 0, 0, 1, 4,213, 23, 64, 4,213, 20, 96, 9, 89, 2, 48,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80, 84, 95,115,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,252,124, 1, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 0, 0, 83,116, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,252,194, 1,126, 0, 0, 0, 20, 0, 0, 0, 4, 0, 6, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0,184, 27,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24, 26,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 23, 64,
+ 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 21,208, 9, 89, 3,224, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 69, 78, 68, 69, 82, 95, 80,
84, 95, 98, 97,107,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 97,107,101, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,252,124, 1, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,248, 0, 0, 0, 88, 29,255, 2, 0, 0, 0, 0,
-159, 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, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 21, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0,152, 30,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,248, 36,255, 2, 0, 0, 0, 0,
- 8, 6,255, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0,
-168,244,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 0, 0, 0, 0,183, 1, 0, 0,
- 18, 18,243, 2,184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 35,255, 2, 0, 0, 0, 0,
- 40, 35,255, 2, 0, 0, 0, 0,136, 31,255, 2, 0, 0, 0, 0,248, 32,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-136, 31,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,248, 32,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,192, 77, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,242, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,243, 2, 26, 0,243, 2, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-248, 32,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 31,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128, 60, 68, 0, 0, 0, 0, 0, 0, 48, 65, 0, 0, 0, 0, 0,128, 56, 68, 0, 0, 0, 0, 0, 0,207, 67,
-226, 2, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,225, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,243, 2,158, 1,226, 2,158, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0, 26, 0, 0, 0,183, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2,158, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-104, 34,255, 2, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 64, 0, 0, 0, 0, 0, 0, 0,216, 34,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,
-216, 34,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,136, 1, 0, 0, 40, 35,255, 2,
- 0, 0, 0, 0,175, 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, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 34,255, 2,
- 0, 0, 0, 0,104, 34,255, 2, 0, 0, 0, 0, 62, 62, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248, 36,255, 2,
- 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 88, 50,255, 2, 0, 0, 0, 0,152, 30,255, 2, 0, 0, 0, 0,104,246,254, 2,
- 0, 0, 0, 0,184,247,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,136,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0, 69, 4, 0, 0, 1, 1,243, 2,141, 2, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 48,255, 2, 0, 0, 0, 0,200, 48,255, 2, 0, 0, 0, 0,232, 37,255, 2,
- 0, 0, 0, 0,168, 43,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232, 37,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0, 88, 39,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68, 0, 0, 0, 0,
- 0, 0,208, 65, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,242, 2, 0, 0, 0, 0, 0, 0,
- 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,243, 2, 26, 0,243, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,243, 2, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88, 39,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,200, 40,255, 2, 0, 0, 0, 0,232, 37,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 64, 70,196,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67,255,127, 70,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,
- 43, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,
- 43, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,160, 0, 44, 3,143, 0, 26, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,245, 2, 0, 0,245, 2, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0,115, 2, 0, 0, 5, 0, 3, 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, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200, 40,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0, 56, 42,255, 2, 0, 0, 0, 0, 88, 39,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 67, 0, 0,206,194,
- 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67, 0, 0,206,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,
-119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,
-119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,211, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56, 42,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0,168, 43,255, 2, 0, 0, 0, 0,200, 40,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0,128,142,196,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67, 0, 0, 26,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 0,
-121, 2, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 0,
-121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 0, 0, 0,
- 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0,122, 2,163, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,231, 5, 0, 0,231, 5, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168, 43,255, 2, 0, 0, 0, 0,195, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 42,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,245, 2, 0, 0,231, 5, 0, 0,211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,243, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 24, 45,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0, 24, 45,255, 2, 0, 0, 0, 0,153, 0, 0, 0,
- 1, 0, 0, 0, 1, 0,140, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,159,148,168, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 1,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,225,215,163,188,
- 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190,
- 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193,
- 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,176, 84, 89,188, 0, 0, 0, 0, 53,177,205,190,142, 74, 70, 62,166, 33,101, 63,
- 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,164, 96, 68, 65,111,121,173,192,248,209,213, 64,
- 0, 0,128, 63,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62, 9, 46,185, 62,
- 35, 44,185, 62,147,180,109,188, 27,227,150, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,
-214,211,111, 65,116,234,191, 62,189,117, 85, 63,128, 32, 71,188, 0, 64,130,182,126, 42,156,190, 75,140, 22, 62,123,250, 45, 63,
- 0, 0, 2, 54,215,104, 25,196,135,132,135, 67, 37, 9,167,195,136,252, 71,194, 3, 54, 25, 68,160, 87,135,195,205,209,166, 67,
-151,254, 71, 66, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62, 35, 44,185,190,
- 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,211,111,193,
- 0, 0,128, 63,180,157,229, 62,180,115, 7,191,222,160, 81,191,184,158, 81,191,118, 90,127, 63, 12,148,130, 62, 9, 46,185, 62,
- 35, 44,185, 62,147,180,109,188, 27,227,150, 63,129, 63,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0, 96,132,111, 65,
-214,211,111, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190,214,211,111, 65,214,211,111, 65, 0, 0, 0, 0,
- 0, 0, 0, 0,143,185, 30, 59, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0,200, 48,255, 2, 0, 0, 0, 0,154, 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, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0, 72,214,255, 2,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 0, 8, 8,
- 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 88, 50,255, 2, 0, 0, 0, 0,194, 0, 0, 0,
- 1, 0, 0, 0,184, 56,255, 2, 0, 0, 0, 0,248, 36,255, 2, 0, 0, 0, 0,152,241,254, 2, 0, 0, 0, 0, 24,245,254, 2,
- 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0,248,245,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-243, 2, 0, 0, 0, 0, 0, 0,183, 1, 0, 0, 18, 18,244, 2,184, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,232, 54,255, 2, 0, 0, 0, 0,232, 54,255, 2, 0, 0, 0, 0, 72, 51,255, 2, 0, 0, 0, 0,184, 52,255, 2,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 72, 51,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,184, 52,255, 2,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0,
- 0, 0, 61, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68,
- 0, 0,200, 65, 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4,
- 10, 0,244, 2, 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 26, 0,
- 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,184, 52,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 72, 51,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 60, 68, 0, 0, 0, 0, 0, 0, 65, 67, 0, 0, 0, 0,
- 0,192, 56, 68, 0, 0, 0, 0, 0, 0,207, 67,227, 2, 0, 0,244, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 2, 0, 0, 0, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 2, 2, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4,
- 10, 0,244, 2,158, 1,227, 2,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-243, 2, 0, 0, 26, 0, 0, 0,183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,158, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 40, 54,255, 2, 0, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0,152, 54,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 4, 0, 0, 0,152, 54,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,136, 1, 0, 0,232, 54,255, 2, 0, 0, 0, 0,175, 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, 18, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 40, 54,255, 2, 0, 0, 0, 0, 40, 54,255, 2, 0, 0, 0, 0, 62, 62, 62, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252,170, 1,126, 0, 0,
+ 0, 0, 0, 0, 0, 4, 0, 7, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 4,213, 24,176, 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 0, 1,
+ 0, 0, 0, 0, 10, 62,134, 96, 0, 0, 21,255, 0, 0, 0,160, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 30, 96,
+ 0, 0, 0,194, 0, 0, 0, 1, 4,213, 37,192, 4,213, 4,160, 4,212,251, 16, 4,212,251,208, 4,212,249,208, 4,212,250,144,
+ 0, 0, 0, 0, 0, 0, 2,249, 0, 0, 5,239, 0, 0, 1,145, 0, 0, 4, 19, 1, 1, 2,247, 2,131, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 23,124, 16, 4,213, 36,144, 4,213, 36,144, 4,213, 30,240, 4,213, 35,112, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,217, 14, 64, 4,218,186,224, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 30,240, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 32, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 98, 64, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68, 61,192, 0, 0, 0, 0, 0,
+ 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,246, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0,
+ 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 2,247, 0, 26, 2,247,
+ 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,249, 0, 0, 5,239, 0, 0, 1,145, 0, 0, 1,170,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,247, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,131,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 32, 16,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,213, 33, 48, 4,213, 30,240, 0, 0, 0, 0, 67, 15, 0, 0,196, 70, 64, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67, 15, 0, 0,196, 70,127,255, 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 3, 43,
+ 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 3, 43,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 7,
+ 0, 18, 0, 0, 0, 6, 0,160, 3, 44, 0,143, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,249,
+ 0, 0, 2,249, 0, 0, 1,171, 0, 0, 4, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,105,
+ 0, 0, 0, 5, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,129, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,213, 33, 48, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 34, 80, 4,213, 32, 16, 0, 0, 0, 0,
+ 67, 16, 0, 0,194,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 16,102,231,194,206, 0, 0, 0, 0, 0, 0, 0, 0, 0,143,
+ 0, 0, 0,160, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0,
+ 0, 0, 0,142, 0, 0, 0, 18, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 64, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 0,160, 0,120, 0,143, 0,102, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,249, 0, 0, 5,239, 0, 0, 1,171, 0, 0, 1,171, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,129,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 34, 80, 0, 0, 0,195, 0, 0, 0, 1,
+ 4,213, 35,112, 4,213, 33, 48, 0, 0, 0, 0, 67, 35, 0, 0,196,142,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 35, 0, 0,
+196, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 2,121, 0, 0, 0, 0, 0, 0, 0,162,
+ 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 2,121, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180,
+ 2,122, 0,163, 2,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,239, 0, 0, 5,239, 0, 0, 1,171,
+ 0, 0, 4, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,125, 96, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,213, 35,112, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 34, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,249, 0, 0, 5,239, 0, 0, 1,171, 0, 0, 4, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2,247, 2,105, 0, 0, 0, 0, 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, 23,124,208, 0, 0, 0, 0, 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,152,144, 32, 68, 65, 84, 65, 0, 0, 3, 68, 2,152,144, 32, 0, 0, 0,153, 0, 0, 0, 1, 63,140, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,172, 56,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+191,128, 1, 80,191,128, 0, 0,128, 0, 0, 0,128, 0, 0, 0,188,163,215,226,128, 0, 0, 0, 62,209,239, 68,190,205,177, 51,
+ 63, 81,158,184, 0, 0, 0, 0, 63,105,119, 70, 62, 70, 74,143,190,185, 44, 35, 0, 0, 0, 0,188, 89, 84,162, 63,101, 33,166,
+ 62,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193,111,211,214, 63,128, 0, 0, 62,209,239, 69, 63,105,119, 70,
+188, 89, 84,176, 0, 0, 0, 0,190,205,177, 53, 62, 70, 74,142, 63,101, 33,166, 0, 0, 0, 0, 63, 81,158,185,190,185, 44, 35,
+ 62,228, 61, 43, 0, 0, 0, 0, 65, 68, 96,164,192,173,121,111, 64,213,209,248, 63,128, 0, 0, 62,229,157,178,191, 10, 96,101,
+191, 81,160,222,191, 81,158,184, 63,127, 90,117, 62,133,101,205, 62,185, 46, 9, 62,185, 44, 35,188,109,180,145, 63,154, 37, 28,
+190,228, 63,129,190,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0, 65,111,132, 96, 65,111,211,214, 62,191,236,217, 63, 85,117, 54,
+188, 70,247, 0,182, 32,192, 0,190,152,221,112, 62, 19, 93,163, 63, 42, 77, 51, 54, 4, 32, 0,196, 25,104,215, 67,135,132,133,
+195,167, 9, 37,194, 71,252,136, 68, 25, 54, 3,195,135, 87,158, 67,166,209,205, 66, 71,254,151, 62,209,239, 68,190,205,177, 51,
+ 63, 81,158,184, 0, 0, 0, 0, 63,105,119, 70, 62, 70, 74,143,190,185, 44, 35, 0, 0, 0, 0,188, 89, 84,162, 63,101, 33,166,
+ 62,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193,111,211,214, 63,128, 0, 0, 62,229,157,178,191, 10, 96,101,
+191, 81,160,222,191, 81,158,184, 63,127, 90,117, 62,133,101,205, 62,185, 46, 9, 62,185, 44, 35,188,109,180,145, 63,154, 37, 28,
+190,228, 63,129,190,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0, 65,111,132, 96, 65,111,211,214, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 55, 62, 92,190,224,186, 56,
+190,148,203,237,190,234,236, 3, 65,111,211,214, 65,111,211,214, 0, 0, 0, 0, 0, 0, 0, 0, 59, 29,227,107, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 0, 4,213, 36,144, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 7, 2,152,196, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 3, 0, 0, 0, 1, 0, 3,
+ 0, 0, 8, 8, 0, 0, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 60, 35,215, 10, 67,250, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 37,192, 0, 0, 0,194,
+ 0, 0, 0, 1, 4,213, 42,112, 4,213, 30, 96, 4,212,248, 80, 4,212,250, 80, 4,212,250,144, 4,212,250, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,239, 0, 0, 0, 0, 0, 0, 1,143, 18, 18, 5,240, 1,144, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 23,189, 16, 4,213, 40,224, 4,213, 40,224, 4,213, 38, 80, 4,213, 39,112, 0, 0, 0, 0, 0, 0, 0, 0, 10, 60, 69,128,
+ 10, 62,142,208, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 38, 80, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 39,112, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67,160,128, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,190, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 5,239, 0, 0, 0, 0, 0, 0, 0, 25, 68,189,224, 0, 65,200, 0, 0, 68,189,224, 0, 65,200, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 5,240, 0, 26, 5,240, 0, 26, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,239, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,240, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,190, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 39,112, 0, 0, 0,195,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 38, 80, 0, 0, 0, 0, 68, 61,192, 0, 0, 0, 0, 0, 67, 79, 0, 0, 0, 0, 0, 0,
+ 68,187,224, 0, 0, 0, 0, 0, 67,187, 0, 0, 0, 0, 5,223, 0, 0, 5,240, 0, 0, 0, 0, 0, 0, 1,117, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,222, 0, 0, 0, 0, 0, 0, 1,117, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 2, 2, 0, 0, 0, 1, 3, 3, 0, 2, 4, 0,
+ 0, 10, 5,240, 1,118, 5,223, 1,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,239,
+ 0, 0, 0, 26, 0, 0, 1,143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,240, 1,118, 0, 0, 0, 0,
+ 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, 23,189,208, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 28, 4,213, 40,144, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+ 4,209, 36, 64, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 4,209, 36, 64, 0, 0, 0, 0, 0, 0, 0, 1,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1,104, 4,213, 40,224, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 14, 0, 0, 0, 0, 9,188,198, 96, 9,188,196, 96, 4,213, 40,144, 4,213, 40,144, 62, 62, 62, 32, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -5350,228 +4166,178 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,121,116,104,111,110, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,160, 0, 0, 0,184, 56,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,120, 63,255, 2, 0, 0, 0, 0,
- 88, 50,255, 2, 0, 0, 0, 0,216,246,254, 2, 0, 0, 0, 0, 56,244,254, 2, 0, 0, 0, 0,200,243,254, 2, 0, 0, 0, 0,
- 72,247,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 69, 4, 0, 0,
- 3, 3,142, 1, 25, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136, 60,255, 2, 0, 0, 0, 0,
-136, 60,255, 2, 0, 0, 0, 0,168, 57,255, 2, 0, 0, 0, 0, 24, 59,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-168, 57,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 24, 59,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128,244, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0,199, 67, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,141, 1, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,128,149, 67, 0, 0,200, 65, 0,128,149, 67, 0, 0,200, 65,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,142, 1, 26, 0,142, 1, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 45, 3, 0, 0, 70, 3, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
- 24, 59,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 57,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0,128,131, 67, 0, 0,228,194, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,190, 67, 0, 0,109,195, 0, 0, 0, 0,
-125, 1, 0, 0,142, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 0, 0, 0,124, 1, 0, 0, 18, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 18, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,142, 1,255, 0,125, 1,237, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 5, 0, 0,118, 7, 0, 0, 71, 3, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,142, 1,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 1, 0, 0,
-136, 60,255, 2, 0, 0, 0, 0,163, 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, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,232, 61,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,232, 61,255, 2, 0, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0,
- 14, 0, 0, 0, 14, 0, 0, 0, 72, 62,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,224, 0, 0, 0, 72, 62,255, 2, 0, 0, 0, 0,
-216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 19, 0, 0, 0, 1, 0, 1, 0,
-232,190,255, 2, 0, 0, 0, 0, 20, 0, 0, 0, 1, 0, 1, 0,232,190,255, 2, 0, 0, 0, 0, 21, 0, 1, 0, 1, 0, 0, 0,
-232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,168,211,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
-232,232,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
-232,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0,
- 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 0, 0, 0, 1, 0, 1, 0,
-232,190,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,120, 63,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,184, 56,255, 2, 0, 0, 0, 0, 24,245,254, 2, 0, 0, 0, 0, 88,243,254, 2, 0, 0, 0, 0,
-184,247,254, 2, 0, 0, 0, 0,104,246,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
-185, 1, 0, 0, 69, 4, 0, 0, 9, 9,244, 2,141, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 72, 67,255, 2, 0, 0, 0, 0, 72, 67,255, 2, 0, 0, 0, 0,104, 64,255, 2, 0, 0, 0, 0,216, 65,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,104, 64,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,216, 65,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 61, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,224,189, 68, 0, 0,200, 65,
- 0,224,189, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,244, 2,
- 26, 0,244, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
-185, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,216, 65,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-104, 64,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,189, 68, 0, 0, 0, 0, 0,192, 22, 68,248,150, 23, 68, 8, 41,100, 68,
-120,125, 46, 67, 68, 65,214, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0, 0, 0, 0, 0,114, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 10,215, 35, 60, 0, 0,122, 68, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 4, 10, 0,244, 2,
-115, 2,244, 2,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,243, 2, 0, 0,
-211, 1, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244, 2,115, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,152, 2, 0, 0, 72, 67,255, 2, 0, 0, 0, 0,166, 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, 9, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
- 0, 0, 0, 0, 12, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,
-231, 1, 0, 0,243, 1, 0, 0,122, 1, 0, 0,124, 1, 0, 0,231, 1, 0, 0,243, 1, 0, 0, 4, 0, 0, 0,124, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0,
-190, 0, 0, 0, 1, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,120,240,254, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 85, 86, 32, 69,100,105,116,105,110,103, 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,216, 71,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0,
- 88, 75,255, 2, 0, 0, 0, 0,184, 79,255, 2, 0, 0, 0, 0, 40, 80,255, 2, 0, 0, 0, 0, 72,124,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-216, 71,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0,216, 71,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
- 40, 73,255, 2, 0, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0, 40, 73,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0,
-184, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-152, 73,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 40, 73,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-232, 74,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196, 3, 70, 4, 1, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-120, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196, 3, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 88, 75,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200, 75,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 72, 72,255, 2, 0, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-200, 75,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56, 76,255, 2, 0, 0, 0, 0, 88, 75,255, 2, 0, 0, 0, 0,
- 72, 72,255, 2, 0, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 56, 76,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168, 76,255, 2, 0, 0, 0, 0,200, 75,255, 2, 0, 0, 0, 0,
-184, 72,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-168, 76,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24, 77,255, 2, 0, 0, 0, 0, 56, 76,255, 2, 0, 0, 0, 0,
-152, 73,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 24, 77,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136, 77,255, 2, 0, 0, 0, 0,168, 76,255, 2, 0, 0, 0, 0,
-152, 73,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-136, 77,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248, 77,255, 2, 0, 0, 0, 0, 24, 77,255, 2, 0, 0, 0, 0,
-216, 71,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-248, 77,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104, 78,255, 2, 0, 0, 0, 0,136, 77,255, 2, 0, 0, 0, 0,
-216, 71,255, 2, 0, 0, 0, 0,152, 73,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-104, 78,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216, 78,255, 2, 0, 0, 0, 0,248, 77,255, 2, 0, 0, 0, 0,
-120, 74,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-216, 78,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72, 79,255, 2, 0, 0, 0, 0,104, 78,255, 2, 0, 0, 0, 0,
- 8, 74,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 72, 79,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184, 79,255, 2, 0, 0, 0, 0,216, 78,255, 2, 0, 0, 0, 0,
- 40, 73,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-184, 79,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 79,255, 2, 0, 0, 0, 0,
- 40, 73,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
- 40, 80,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,248, 83,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-152, 73,255, 2, 0, 0, 0, 0, 72, 72,255, 2, 0, 0, 0, 0,184, 72,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,140,255, 2, 0, 0, 0, 0,232,140,255, 2, 0, 0, 0, 0,
- 24, 81,255, 2, 0, 0, 0, 0,136, 82,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24, 81,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,136, 82,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,136, 82,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 81,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69,
- 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0,
- 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
- 18, 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,128, 63, 0, 0,128, 63,
- 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,248, 83,255, 2, 0, 0, 0, 0,
-194, 0, 0, 0, 1, 0, 0, 0, 72,124,255, 2, 0, 0, 0, 0, 40, 80,255, 2, 0, 0, 0, 0,216, 71,255, 2, 0, 0, 0, 0,
-152, 73,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0,232, 74,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 6, 6,196, 3, 70, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,216, 90,255, 2, 0, 0, 0, 0,216, 90,255, 2, 0, 0, 0, 0,232, 84,255, 2, 0, 0, 0, 0,
-104, 89,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232, 84,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 88, 86,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 67, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0, 0,113, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0,192, 41, 68, 0, 0,200, 65, 0,192, 41, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0,196, 3, 26, 0,196, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,195, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-196, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 88, 86,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-104, 89,255, 2, 0, 0, 0, 0,232, 84,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 67, 0, 96,133,196, 0, 0, 0, 0,
- 0, 0, 0, 0,254,255, 74, 67,254,127,133,196, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 43, 4, 0, 0,
- 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 43, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0,
- 18, 0, 0, 4, 6, 0,220, 0, 44, 4,203, 0, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-220, 0, 44, 4, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 87,255, 2, 0, 0, 0, 0,
-200, 87,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,200, 87,255, 2, 0, 0, 0, 0,193, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 42, 0, 0, 2, 42,
+ 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 42,112, 0, 0, 0,194, 0, 0, 0, 1, 4,213, 47,112, 4,213, 37,192, 4,212,251, 80,
+ 4,212,249,208, 4,212,249,144, 4,212,251,144, 0, 0, 0, 0, 0, 0, 5,241, 0, 0, 7,128, 0, 0, 3, 69, 0, 0, 4, 19,
+ 3, 3, 1,144, 0,207, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,120, 80, 4,213, 45, 64, 4,213, 45, 64, 4,213, 43, 0,
+ 4,213, 44, 32, 0, 0, 0, 0, 0, 0, 0, 0, 10, 62,144,240, 4,217, 21,160, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 43, 0,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,213, 44, 32, 0, 0, 0, 0, 0, 0, 0, 0, 67,244,128, 0, 0, 0, 0, 0, 65,208, 0, 0,
+ 0, 0, 0, 0, 67,200, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,143, 0, 0, 0, 0, 0, 0, 0, 25,
+ 67,149,128, 0, 65,200, 0, 0, 67,149,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3,
+ 0, 4, 4, 12, 0, 10, 1,144, 0, 26, 1,144, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,241,
+ 0, 0, 7,128, 0, 0, 3, 69, 0, 0, 3, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,144, 0, 26,
+ 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,121,160,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,213, 44, 32, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 43, 0, 0, 0, 0, 0,
+ 67,131,128, 0,194,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,191,128, 0,195, 35, 0, 0, 0, 0, 0, 0, 0, 0, 1,127,
+ 0, 0, 1,144, 0, 0, 0, 18, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 1,126, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0,
+ 0, 0, 1,126, 0, 0, 0, 18, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 6, 18, 0, 0, 0, 2, 3, 3, 0, 0, 4, 12, 0, 6, 1,144, 0,181, 1,127, 0,163, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,241, 0, 0, 7,128, 0, 0, 3, 95, 0, 0, 4, 19, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1,144, 0,181, 0, 0, 0, 0, 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, 23,121, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,244, 4,213, 45, 64, 0, 0, 0,163, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,188,191,144, 9,188,191,144, 4,213, 46, 96,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 0, 0, 0, 12, 4,213, 46, 96,
+ 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 14, 4,213, 46,160, 68, 65, 84, 65, 0, 0, 0,168, 4,213, 46,160,
+ 0, 0, 0,216, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 1, 2,152,190, 32, 0, 19, 0, 0, 0, 1, 0, 1, 2,152,190, 32,
+ 0, 20, 0, 0, 0, 1, 0, 1, 2,152,190, 32, 0, 21, 0, 1, 0, 1, 0, 0, 2,152,190, 32, 0, 0, 0, 0, 0, 1, 0, 1,
+ 4,213,120,240, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,202, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,128,192, 0, 0, 0, 0,
+ 0, 1, 0, 1, 2,152,214, 32, 0, 0, 0, 0, 0, 1, 0, 1, 4,213,127, 16, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,208, 32,
+ 0, 0, 0, 0, 0, 1, 0, 1, 4,213,117,128, 0, 0, 0, 0, 0, 1, 0, 1, 2,152,196, 32, 0, 0, 0, 0, 0, 1, 0, 1,
+ 4,213,116,240, 0, 21, 0, 0, 0, 1, 0, 1, 2,152,190, 32, 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 47,112, 0, 0, 0,194,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 42,112, 4,212,250, 80, 4,212,249, 80, 4,212,251,208, 4,212,251, 16, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 2,247, 0, 0, 1,145, 0, 0, 4, 19, 9, 9, 2,248, 2,131, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 23,181, 48, 2,152,148, 32, 2,152,148, 32, 4,213, 48, 0, 4,213, 49, 32, 0, 0, 0, 0, 0, 0, 0, 0, 10, 60, 74, 16,
+ 10, 60, 74,208, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 48, 0, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 49, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67,230, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68, 62, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,247, 0, 0, 0, 0, 0, 0, 0, 25, 68,189,224, 0, 65,200, 0, 0, 68,189,224, 0, 65,200, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 2,248, 0, 26, 2,248, 0, 26, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,247, 0, 0, 1,145, 0, 0, 1,170, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,248, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 23,183, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 49, 32, 0, 0, 0,195,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 48, 0, 0, 0, 0, 0, 68,189,224, 0, 0, 0, 0, 0, 68, 22,192, 0, 68, 23,150,248,
+ 68,100, 41, 8, 67, 49, 44,113, 67,212,233,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,247, 0, 0, 0, 0, 0, 0, 2,104, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 35,215, 10, 68,122, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 4, 0,
+ 0, 10, 2,248, 2,105, 2,248, 2,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,247,
+ 0, 0, 1,171, 0, 0, 4, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,248, 2,105, 0, 0, 0, 0,
+ 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, 23,181,240, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 2,136, 2,152,148, 32, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 32, 0, 0, 0, 0, 0, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0,
+ 61,204,204,205, 0, 0, 1,231, 0, 0, 1,243, 0, 0, 1,122, 0, 0, 1,124, 0, 0, 1,231, 0, 0, 1,243, 0, 0, 0, 4,
+ 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0, 0,148,
+ 4,213, 50,160, 0, 0, 0,190, 0, 0, 0, 1, 4,213, 74,240, 4,212,247,144, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 85, 86,
+ 32, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,213, 51, 96, 4,213, 53, 32, 4,213, 53, 96, 4,213, 55,224, 4,213, 56, 32, 4,213, 64, 80, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2,152,190, 32, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 51, 96, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 51,160, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 51,160, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 51,224,
+ 4,213, 51, 96, 0, 0, 0, 0, 0, 0, 4, 97, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 51,224, 0, 0, 0,191,
+ 0, 0, 0, 1, 4,213, 52, 32, 4,213, 51,160, 0, 0, 0, 0, 7,118, 4, 97, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20,
+ 4,213, 52, 32, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 52, 96, 4,213, 51,224, 0, 0, 0, 0, 7,118, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 52, 96, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 52,160, 4,213, 52, 32, 0, 0, 0, 0,
+ 0, 0, 4, 70, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 52,160, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 52,224,
+ 4,213, 52, 96, 0, 0, 0, 0, 7,118, 4, 70, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 52,224, 0, 0, 0,191,
+ 0, 0, 0, 1, 4,213, 53, 32, 4,213, 52,160, 0, 0, 0, 0, 3,196, 4, 70, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20,
+ 4,213, 53, 32, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 52,224, 0, 0, 0, 0, 3,196, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 53, 96, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 53,160, 0, 0, 0, 0, 4,213, 51,160,
+ 4,213, 51,224, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 53,160, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,213, 53,224, 4,213, 53, 96, 4,213, 51,160, 4,213, 52, 96, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,213, 53,224, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 54, 32, 4,213, 53,160, 4,213, 51,224, 4,213, 52,160, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 54, 32, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 54, 96, 4,213, 53,224,
+ 4,213, 52, 96, 4,213, 52,160, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 54, 96, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,213, 54,160, 4,213, 54, 32, 4,213, 52, 96, 4,213, 52,224, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,213, 54,160, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 54,224, 4,213, 54, 96, 4,213, 51, 96, 4,213, 53, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 54,224, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 55, 32,
+ 4,213, 54,160, 4,213, 51, 96, 4,213, 52, 96, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 55, 32,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,213, 55, 96, 4,213, 54,224, 4,213, 52,224, 4,213, 53, 32, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 55, 96, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 55,160, 4,213, 55, 32, 4,213, 52,160,
+ 4,213, 52,224, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 55,160, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,213, 55,224, 4,213, 55, 96, 4,213, 52, 32, 4,213, 53, 32, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,213, 55,224, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 55,160, 4,213, 52, 32, 4,213, 52,160, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 56, 32, 0, 0, 0,194, 0, 0, 0, 1, 4,213, 58,240, 0, 0, 0, 0,
+ 4,213, 52, 96, 4,213, 51,160, 4,213, 51,224, 4,213, 52,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 4, 71,
+ 0, 0, 4, 97, 7, 7, 7,119, 0, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 4,213, 74,144, 4,213, 74,144,
+ 4,213, 56,176, 4,213, 57,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,213, 56,176, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 57,208, 0, 0, 0, 0, 0, 0, 0, 0, 68,148, 32, 0, 0, 0, 0, 0,
+ 65,208, 0, 0, 0, 0, 0, 0, 68,238,224, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0, 0,
+ 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 7,119, 0, 26, 7,119, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 4, 71, 0, 0, 4, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,119, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 57,208, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 56,176,
+ 0, 0, 0, 0, 69,109,240, 0,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,109,255,255,192, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 7,112, 0, 0, 7,129, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7,111, 0, 0, 0, 0, 0, 0, 0, 17,
+ 0, 0, 0, 0, 0, 0, 7,111, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 2, 0, 0, 0, 1, 3, 3, 0, 2, 4, 0, 0, 10, 7,129, 0, 2, 7,112, 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, 4, 97, 0, 0, 4, 97, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 58,240, 0, 0, 0,194,
+ 0, 0, 0, 1, 4,213, 64, 80, 4,213, 56, 32, 4,213, 51, 96, 4,213, 52, 96, 4,213, 52,224, 4,213, 53, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,195, 0, 0, 0, 0, 0, 0, 4, 69, 6, 6, 3,196, 4, 70, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2,152,152, 32, 2,152,152, 32, 4,213, 59,128, 4,213, 63, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 59,128, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 60,160, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67,215, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,113, 0, 0, 0, 0, 0, 0, 65,208, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,195, 0, 0, 0, 0, 0, 0, 0, 25, 68, 41,192, 0, 65,200, 0, 0, 68, 41,192, 0, 65,200, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 3,196, 0, 26, 3,196, 0, 26, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,195, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,196, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 60,160, 0, 0, 0,195,
+ 0, 0, 0, 1, 4,213, 63, 48, 4,213, 59,128, 0, 0, 0, 0, 67, 91, 0, 0,196,133, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67, 74,255,254,196,133,127,254, 0, 0, 0, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 4, 43, 0, 0, 0, 0,
+ 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 4, 43, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 3, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0,
+ 0, 6, 0,220, 4, 44, 0,203, 4, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219,
+ 0, 0, 0, 26, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 4, 44, 0, 0, 0, 4,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,213, 61,192, 4,213, 61,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 64, 4,213, 61,192, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
73, 77, 65, 71, 69, 95, 80, 84, 95,103,112,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
71,114,101, 97,115,101, 32, 80,101,110, 99,105,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,174,255,202, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,
-104, 89,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 86,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 67,154,153, 41,191,205,204,212, 63,154,153,149,191,205,204, 10, 64,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,232, 2, 0, 0, 0, 0, 0, 0, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 0,195, 3, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 2, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 33, 0, 0,
-216, 90,255, 2, 0, 0, 0, 0,164, 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, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65,
- 0, 0, 0, 0,154,153,153, 62, 0, 0, 0, 0,100, 0, 0, 0,154,153,153, 62,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,255,174, 0,202, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 63, 48, 0, 0, 0,195,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 60,160, 0, 0, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 67,128, 0, 0,191, 41,153,154,
+ 63,212,204,205,191,149,153,154, 64, 10,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,232, 0, 0, 0, 0, 0, 0, 4, 44, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 0, 0, 3,195,
+ 0, 0, 0, 26, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,232, 4, 44, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 32,248, 2,152,152, 32, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 65,240, 0, 0, 0, 0, 0, 0, 62,153,153,154, 0, 0, 0, 0, 0, 0, 0,100, 62,153,153,154, 0, 0, 0,100, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -5693,7 +4459,6 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -5702,6 +4467,7 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -5823,445 +4589,375 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
- 72,124,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 83,255, 2, 0, 0, 0, 0,
-232, 74,255, 2, 0, 0, 0, 0,120, 74,255, 2, 0, 0, 0, 0, 8, 74,255, 2, 0, 0, 0, 0, 40, 73,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 69, 4, 0, 0, 1, 1,178, 3, 70, 4, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,139,255, 2, 0, 0, 0, 0, 88,139,255, 2, 0, 0, 0, 0,
- 56,125,255, 2, 0, 0, 0, 0, 56,134,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,125,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,168,126,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,102, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,128,108, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177, 3, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,178, 3, 26, 0,178, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,178, 3, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,126,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,184,129,255, 2, 0, 0, 0, 0, 56,125,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67,
- 0, 0,109,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 67, 0, 0,109,196, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0,
- 0, 0, 0, 0,179, 3, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 0, 0, 0, 0,179, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,180, 3,143, 0,180, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,146, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,160, 0,180, 3, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24,128,255, 2, 0, 0, 0, 0, 24,128,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 24,128,255, 2, 0, 0, 0, 0,
-193, 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, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,
-100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80, 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,
-100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,254,143, 0,190, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,184,129,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,132,255, 2, 0, 0, 0, 0,
-168,126,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 67, 0, 0,242,194, 0, 0, 0, 0, 0, 0, 0, 0,231,102, 16, 67,
- 91, 90,242,194, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,160, 0,
-120, 0,143, 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197, 3, 0, 0,100, 4, 0, 0,
- 26, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 0, 0, 0, 6, 0,
- 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40,131,255, 2, 0, 0, 0, 0, 40,131,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 64, 80, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 0,
+ 4,213, 58,240, 4,213, 53, 32, 4,213, 52,224, 4,213, 52,160, 4,213, 52, 32, 0, 0, 0, 0, 0, 0, 3,197, 0, 0, 7,118,
+ 0, 0, 0, 0, 0, 0, 4, 69, 1, 1, 3,178, 4, 70, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213, 73, 96,
+ 4,213, 73, 96, 4,213, 64,224, 4,213, 72, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0,248, 4,213, 64,224, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,102, 0, 0,
+ 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,108,128, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,177,
+ 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 3,178, 0, 26, 3,178, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 3,197, 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3,178, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 88, 1, 0, 0, 40,131,255, 2, 0, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 66, 0, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 68,144,
+ 4,213, 64,224, 0, 0, 0, 0, 67, 32, 0, 0,196,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 15, 0, 0,196,109, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 3,179, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0,
+ 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 3,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 3, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 0,160, 3,180, 0,143,
+ 3,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,197, 0, 0, 4,100, 0, 0, 0,146, 0, 0, 4, 69,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 3,180, 0, 0, 0, 5, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213, 67, 32,
+ 4,213, 67, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 67, 32,
+ 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
+ 84, 95,116,111,111,108,115, 95,111, 98,106,101, 99,116,109,111,100,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 84,
+111,111,108,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254, 42, 0,143, 1,190,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 68,144, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 71, 32,
+ 4,213, 66, 0, 0, 0, 0, 0, 67, 33, 0, 0,194,242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 16,102,231,194,242, 90, 91,
+ 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0,
+ 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 3, 10, 0, 0, 0, 1, 0, 7, 0, 18, 4, 0, 0, 6, 0,160, 0,120, 0,143,
+ 0,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,197, 0, 0, 4,100, 0, 0, 0, 26, 0, 0, 0,145,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 0,120, 0, 0, 0, 6, 0, 34, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213, 69,176,
+ 4,213, 69,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 69,176,
+ 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 69, 87, 51, 68, 95, 80,
84, 95,108, 97,115,116, 95,111,112,101,114, 97,116,111,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79,112,101,114, 97,116,111,114,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,255,144, 0, 16, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,200,132,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 56,134,255, 2, 0, 0, 0, 0,184,129,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,
- 0,128,126,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 67,255,191,126,196, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0,
- 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0,
- 18, 0, 0, 0, 12, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 0, 13, 4,163, 0,251, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 56,134,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,132,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,101, 4, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 18, 3, 44, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,168,135,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 3, 0, 0,168,135,255, 2, 0, 0, 0, 0,
-153, 0, 0, 0, 1, 0, 0, 0,161, 58,190, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,140, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 13,128,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,
- 74,215, 76,190, 0, 0, 0, 0, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62,
- 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 25, 95,192, 0, 0,128, 63, 69,239,209, 62, 70,119,105, 63,160, 84, 89,188, 0, 0, 0, 0, 52,177,205,190,142, 74, 70, 62,
-166, 33,101, 63, 0, 0, 0, 0,185,158, 81, 63, 35, 44,185,190, 43, 61,228, 62, 0, 0, 0, 0,188,173, 54, 64,136, 95,161,191,
-147,231,198, 63, 0, 0,128, 63,169,255, 27, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62,
- 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,
-100, 98, 82, 64, 0, 25, 95, 64, 97, 66,141, 62,204, 23, 29, 63,192, 60, 18,188, 0, 0, 96,179,195, 15,188,190,130, 75, 53, 62,
-216,125, 81, 63, 0, 0,192,179,115, 77,100,193, 16,173,201, 64,181,148,248,192,203,247,159,192,233, 74, 87, 65,246, 46,190,192,
- 88,106,234, 64, 45, 8,160, 64, 68,239,209, 62, 51,177,205,190,184,158, 81, 63, 0, 0, 0, 0, 70,119,105, 63,143, 74, 70, 62,
- 35, 44,185,190, 0, 0, 0, 0,162, 84, 89,188,166, 33,101, 63, 42, 61,228, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 25, 95,192, 0, 0,128, 63,169,255, 27, 63,208,249,224,190, 48,180, 81,191,184,158, 81,191,254,123,173, 63,140,225, 88, 62,
- 26, 63,185, 62, 35, 44,185, 62,150,126,161,188,206,156,122, 63,138, 84,228,190, 42, 61,228,190, 0, 0, 0, 0, 0, 0, 0, 0,
-100, 98, 82, 64, 0, 25, 95, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 92, 62, 55, 63, 56,186,224,190,237,203,148,190, 3,236,234,190, 0, 25, 95, 64, 0, 25, 95, 64,
- 0, 0, 0, 0, 0, 0, 0, 0, 18,106,224, 58, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 72, 1, 0, 0, 88,139,255, 2, 0, 0, 0, 0,
-154, 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, 1, 0, 0, 0, 51, 51, 51, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 7, 0,
- 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 3, 0,
- 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,205,204,204, 61, 0, 0,250, 67, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 78, 0, 0,208, 0, 0, 0,120,141,255, 2, 0, 0, 0, 0,
-190, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 70,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 86,105,100,101,111, 32, 69,100,105,116,105,110,103, 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,152,142,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,
-216,147,255, 2, 0, 0, 0, 0, 72,155,255, 2, 0, 0, 0, 0,184,155,255, 2, 0, 0, 0, 0,104,182,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
-152,142,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0,152,142,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 97, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-232,143,255, 2, 0, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 97, 4, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0,
-120,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
- 88,144,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-118, 7, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-168,145,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 16, 2, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,168,145,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0,
- 56,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
- 24,146,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0,168,145,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 70, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0,
-191, 0, 0, 0, 1, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 16, 2, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0,
-104,147,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 16, 2, 0, 0, 0, 0,
- 68, 65, 84, 65, 32, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,191, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7,100, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-216,147,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,148,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 8,143,255, 2, 0, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 72,148,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,184,148,255, 2, 0, 0, 0, 0,216,147,255, 2, 0, 0, 0, 0,
- 8,143,255, 2, 0, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-184,148,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 40,149,255, 2, 0, 0, 0, 0, 72,148,255, 2, 0, 0, 0, 0,
-120,143,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 40,149,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,152,149,255, 2, 0, 0, 0, 0,184,148,255, 2, 0, 0, 0, 0,
- 88,144,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-152,149,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 8,150,255, 2, 0, 0, 0, 0, 40,149,255, 2, 0, 0, 0, 0,
-200,144,255, 2, 0, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 8,150,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,120,150,255, 2, 0, 0, 0, 0,152,149,255, 2, 0, 0, 0, 0,
-152,142,255, 2, 0, 0, 0, 0,168,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-120,150,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,232,150,255, 2, 0, 0, 0, 0, 8,150,255, 2, 0, 0, 0, 0,
- 88,144,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-232,150,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 88,151,255, 2, 0, 0, 0, 0,120,150,255, 2, 0, 0, 0, 0,
-168,145,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 88,151,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200,151,255, 2, 0, 0, 0, 0,232,150,255, 2, 0, 0, 0, 0,
-136,146,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-200,151,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 56,152,255, 2, 0, 0, 0, 0, 88,151,255, 2, 0, 0, 0, 0,
- 24,146,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 56,152,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,168,152,255, 2, 0, 0, 0, 0,200,151,255, 2, 0, 0, 0, 0,
- 56,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-168,152,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 24,153,255, 2, 0, 0, 0, 0, 56,152,255, 2, 0, 0, 0, 0,
-232,143,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 24,153,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,136,153,255, 2, 0, 0, 0, 0,168,152,255, 2, 0, 0, 0, 0,
-168,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-136,153,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,248,153,255, 2, 0, 0, 0, 0, 24,153,255, 2, 0, 0, 0, 0,
-152,142,255, 2, 0, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-248,153,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,104,154,255, 2, 0, 0, 0, 0,136,153,255, 2, 0, 0, 0, 0,
-200,144,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-104,154,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,216,154,255, 2, 0, 0, 0, 0,248,153,255, 2, 0, 0, 0, 0,
- 56,145,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-216,154,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 72,155,255, 2, 0, 0, 0, 0,104,154,255, 2, 0, 0, 0, 0,
- 88,144,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
- 72,155,255, 2, 0, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,154,255, 2, 0, 0, 0, 0,
- 56,145,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
-184,155,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,136,159,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 88,144,255, 2, 0, 0, 0, 0, 8,143,255, 2, 0, 0, 0, 0,120,143,255, 2, 0, 0, 0, 0,200,144,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 97, 4, 0, 0, 7, 7,119, 7, 27, 0, 1, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,190,255, 2, 0, 0, 0, 0, 88,190,255, 2, 0, 0, 0, 0,
-168,156,255, 2, 0, 0, 0, 0, 24,158,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,168,156,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 24,158,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,148, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0,128,237, 68, 0, 0,200, 65, 0,128,237, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 71, 4, 0, 0, 96, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0, 24,158,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,156,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,109, 69,
- 0, 0,128,192, 0, 0, 0, 0, 0, 0, 0, 0,255,255,109, 69, 0, 0, 0,192, 0, 0, 0, 0,112, 7, 0, 0,129, 7, 0, 0,
- 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,111, 7, 0, 0,
- 18, 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,128, 63, 0, 0,128, 63,
- 2, 0, 0, 0, 1, 0, 3, 3, 2, 0, 0, 4, 10, 0,129, 7, 2, 0,112, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 4, 0, 0, 97, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,136,159,255, 2, 0, 0, 0, 0,
-194, 0, 0, 0, 1, 0, 0, 0,120,164,255, 2, 0, 0, 0, 0,184,155,255, 2, 0, 0, 0, 0,152,142,255, 2, 0, 0, 0, 0,
-168,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,232,143,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 15, 15,119, 7,100, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 88,163,255, 2, 0, 0, 0, 0, 88,163,255, 2, 0, 0, 0, 0,120,160,255, 2, 0, 0, 0, 0,
-232,161,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,120,160,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
-232,161,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,137, 68, 0, 0, 0, 0, 0, 0,208, 65,
- 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0,
- 0,224,202, 68, 0, 0,200, 65, 0,224,202, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3,
- 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,232,161,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,120,160,255, 2, 0, 0, 0, 0, 0, 0, 64,192, 0, 0,126, 67, 0, 0, 0, 0, 0, 0, 72, 66,
-112,189, 17,192,246, 70,125, 67, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0, 18, 0, 0, 0, 73, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 72, 66, 0,124,146, 72, 0, 0, 72, 66,205,204,204, 61, 0, 0, 32, 65, 72, 0, 0, 0, 0, 0, 0, 2,
- 4, 0, 0, 4, 8, 0,119, 7, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0,118, 7, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-119, 7, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 88,163,255, 2, 0, 0, 0, 0,170, 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,
- 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,
-120,164,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0, 8,174,255, 2, 0, 0, 0, 0,136,159,255, 2, 0, 0, 0, 0,
-168,145,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0,104,147,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0, 15, 2, 0, 0, 8, 8,119, 7,171, 1, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,172,255, 2, 0, 0, 0, 0,200,172,255, 2, 0, 0, 0, 0,
-104,165,255, 2, 0, 0, 0, 0, 88,171,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,104,165,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,216,166,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0,224,238, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,
- 0, 0, 0, 0, 25, 0, 0, 0, 0, 96,191, 68, 0, 0,200, 65, 0, 96,191, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0,119, 7, 26, 0,119, 7, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,101, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,119, 7, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 1, 0, 0,216,166,255, 2, 0, 0, 0, 0,
-195, 0, 0, 0, 1, 0, 0, 0,232,169,255, 2, 0, 0, 0, 0,104,165,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 67,
- 0,128,200,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 67, 0,128,200,195, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0,
- 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0,
- 0, 0, 0, 0,144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,
- 10, 3, 0, 0, 1, 0, 7, 0, 18, 0, 0, 4, 6, 0,220, 0,145, 1,203, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,155, 6, 0, 0,118, 7, 0, 0,127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,220, 0,145, 1, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 72,168,255, 2, 0, 0, 0, 0, 72,168,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0, 72,168,255, 2, 0, 0, 0, 0,
-193, 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, 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83, 99,101,110,101, 32, 80,114,101,118,105,101,119, 47, 82,101,110,100,101,114, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,171,255,203, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,216, 0,144, 0, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 71, 32, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 72, 64,
+ 4,213, 68,144, 0, 0, 0, 0, 67, 35, 0, 0,196,126,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 35, 0, 0,196,126,191,255,
+ 0, 0, 0, 0, 0, 0, 0,163, 0, 0, 0,180, 0, 0, 0, 18, 0, 0, 4, 12, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0,
+ 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 18, 0, 0, 4, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 7, 0, 18, 0, 0, 0, 6, 0,180, 4, 13, 0,163,
+ 3,251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 7,118, 0, 0, 0, 26, 0, 0, 4, 69,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 72, 64,
+ 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 71, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,101,
+ 0, 0, 7,118, 0, 0, 0, 26, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 18, 4, 44,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,152,186, 32,
+ 68, 65, 84, 65, 0, 0, 3, 68, 2,152,186, 32, 0, 0, 0,153, 0, 0, 0, 1, 63,190, 58,161, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 13, 28,
+191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190, 76,215, 74, 0, 0, 0, 0, 62,209,239, 68,190,205,177, 51, 63, 81,158,184,
+ 0, 0, 0, 0, 63,105,119, 70, 62, 70, 74,143,190,185, 44, 35, 0, 0, 0, 0,188, 89, 84,162, 63,101, 33,166, 62,228, 61, 42,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 95, 25, 0, 63,128, 0, 0, 62,209,239, 69, 63,105,119, 70,188, 89, 84,160,
+ 0, 0, 0, 0,190,205,177, 52, 62, 70, 74,142, 63,101, 33,166, 0, 0, 0, 0, 63, 81,158,185,190,185, 44, 35, 62,228, 61, 43,
+ 0, 0, 0, 0, 64, 54,173,188,191,161, 95,136, 63,198,231,147, 63,128, 0, 0, 63, 27,255,169,190,224,249,208,191, 81,180, 48,
+191, 81,158,184, 63,173,123,254, 62, 88,225,140, 62,185, 63, 26, 62,185, 44, 35,188,161,126,150, 63,122,156,206,190,228, 84,138,
+190,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0, 64, 82, 98,100, 64, 95, 25, 0, 62,141, 66, 97, 63, 29, 23,204,188, 18, 60,192,
+179, 96, 0, 0,190,188, 15,195, 62, 53, 75,130, 63, 81,125,216,179,192, 0, 0,193,100, 77,115, 64,201,173, 16,192,248,148,181,
+192,159,247,203, 65, 87, 74,233,192,190, 46,246, 64,234,106, 88, 64,160, 8, 45, 62,209,239, 68,190,205,177, 51, 63, 81,158,184,
+ 0, 0, 0, 0, 63,105,119, 70, 62, 70, 74,143,190,185, 44, 35, 0, 0, 0, 0,188, 89, 84,162, 63,101, 33,166, 62,228, 61, 42,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 95, 25, 0, 63,128, 0, 0, 63, 27,255,169,190,224,249,208,191, 81,180, 48,
+191, 81,158,184, 63,173,123,254, 62, 88,225,140, 62,185, 63, 26, 62,185, 44, 35,188,161,126,150, 63,122,156,206,190,228, 84,138,
+190,228, 61, 42, 0, 0, 0, 0, 0, 0, 0, 0, 64, 82, 98,100, 64, 95, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 55, 62, 92,190,224,186, 56,190,148,203,237,
+190,234,236, 3, 64, 95, 25, 0, 64, 95, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58,224,106, 18, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 0,
+ 4,213, 73, 96, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 7, 2,152,196, 32, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 3, 0, 0, 0, 1, 0, 3, 0, 0, 8, 8,
+ 0, 0, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 61,204,204,205, 67,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 7, 0, 10, 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, 0, 83, 78, 0, 0, 0,148, 4,213, 74,240, 0, 0, 0,190, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,213, 50,160, 0, 0, 0, 0, 0, 0, 0, 0, 83, 82, 86,105,100,101,111, 32, 69,100,105,116,105,110,103, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213, 75,176, 4,213, 78,112, 4,213, 78,176,
+ 4,213, 82,240, 4,213, 83, 48, 4,213,103,208, 0, 0, 0, 0, 0, 0, 0, 0, 2,152,190, 32, 0, 0, 0, 0, 0, 0, 0, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 75,176,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,213, 75,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,213, 75,240, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 76, 48, 4,213, 75,176, 0, 0, 0, 0, 0, 0, 4, 97,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 76, 48, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 76,112, 4,213, 75,240,
+ 0, 0, 0, 0, 7,118, 4, 97, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 76,112, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,213, 76,176, 4,213, 76, 48, 0, 0, 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 76,176,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,213, 76,240, 4,213, 76,112, 0, 0, 0, 0, 0, 0, 4, 70, 0, 0, 0, 1, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,213, 76,240, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 77, 48, 4,213, 76,176, 0, 0, 0, 0, 7,118, 4, 70,
+ 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 77, 48, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 77,112, 4,213, 76,240,
+ 0, 0, 0, 0, 7,118, 2, 16, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 77,112, 0, 0, 0,191, 0, 0, 0, 1,
+ 4,213, 77,176, 4,213, 77, 48, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 77,176,
+ 0, 0, 0,191, 0, 0, 0, 1, 4,213, 77,240, 4,213, 77,112, 0, 0, 0, 0, 3, 76, 4, 70, 0, 0, 0, 1, 68, 65, 84, 65,
+ 0, 0, 0, 20, 4,213, 77,240, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 78, 48, 4,213, 77,176, 0, 0, 0, 0, 0, 0, 2, 16,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 78, 48, 0, 0, 0,191, 0, 0, 0, 1, 4,213, 78,112, 4,213, 77,240,
+ 0, 0, 0, 0, 3, 76, 2, 16, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 4,213, 78,112, 0, 0, 0,191, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,213, 78, 48, 0, 0, 0, 0, 7,118, 0,100, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 78,176,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,213, 78,240, 0, 0, 0, 0, 4,213, 75,240, 4,213, 76, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 78,240, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 79, 48, 4,213, 78,176, 4,213, 75,240,
+ 4,213, 76,176, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 79, 48, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,213, 79,112, 4,213, 78,240, 4,213, 76, 48, 4,213, 76,240, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,213, 79,112, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 79,176, 4,213, 79, 48, 4,213, 76,176, 4,213, 76,240, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 79,176, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 79,240, 4,213, 79,112,
+ 4,213, 76,240, 4,213, 77, 48, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 79,240, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,213, 80, 48, 4,213, 79,176, 4,213, 75,176, 4,213, 77,112, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,213, 80, 48, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 80,112, 4,213, 79,240, 4,213, 76,176, 4,213, 77,176,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 80,112, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 80,176,
+ 4,213, 80, 48, 4,213, 77,112, 4,213, 77,240, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 80,176,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,213, 80,240, 4,213, 80,112, 4,213, 77,240, 4,213, 78, 48, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 80,240, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 81, 48, 4,213, 80,176, 4,213, 77,176,
+ 4,213, 78, 48, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 81, 48, 0, 0, 0,192, 0, 0, 0, 1,
+ 4,213, 81,112, 4,213, 80,240, 4,213, 77, 48, 4,213, 78,112, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
+ 4,213, 81,112, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 81,176, 4,213, 81, 48, 4,213, 76,112, 4,213, 78,112, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 81,176, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 81,240, 4,213, 81,112,
+ 4,213, 77,112, 4,213, 78,112, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 81,240, 0, 0, 0,192,
+ 0, 0, 0, 1, 4,213, 82, 48, 4,213, 81,176, 4,213, 75,176, 4,213, 76,112, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 24, 4,213, 82, 48, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 82,112, 4,213, 81,240, 4,213, 76,240, 4,213, 77,176,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 82,112, 0, 0, 0,192, 0, 0, 0, 1, 4,213, 82,176,
+ 4,213, 82, 48, 4,213, 77, 48, 4,213, 78, 48, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 82,176,
+ 0, 0, 0,192, 0, 0, 0, 1, 4,213, 82,240, 4,213, 82,112, 4,213, 76,176, 4,213, 77,240, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 24, 4,213, 82,240, 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 82,176, 4,213, 77, 48,
+ 4,213, 77,240, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 83, 48, 0, 0, 0,194, 0, 0, 0, 1,
+ 4,213, 86, 0, 0, 0, 0, 0, 4,213, 76,176, 4,213, 75,240, 4,213, 76, 48, 4,213, 76,240, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 7,118, 0, 0, 4, 71, 0, 0, 4, 97, 7, 7, 7,119, 0, 27, 0, 1, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0,
+ 4,213,109,224, 4,213,109,224, 4,213, 83,192, 4,213, 84,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,213, 83,192, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 84,224, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68,148, 32, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,238,224, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 0, 25, 68,237,128, 0, 65,200, 0, 0, 68,237,128, 0, 65,200, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 7,119, 0, 26, 7,119, 0, 26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 4, 71, 0, 0, 4, 96, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 7,119, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 84,224, 0, 0, 0,195, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,213, 83,192, 0, 0, 0, 0, 69,109,240, 0,192,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,109,255,255,
+192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,112, 0, 0, 7,129, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 7,111,
+ 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 7,111, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 2, 0, 0, 0, 1, 3, 3, 0, 2, 4, 0, 0, 10, 7,129,
+ 0, 2, 7,112, 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, 4, 97,
+ 0, 0, 4, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96,
+ 4,213, 86, 0, 0, 0, 0,194, 0, 0, 0, 1, 4,213, 89,192, 4,213, 83, 48, 4,213, 75,176, 4,213, 77,112, 4,213, 78,112,
+ 4,213, 76,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 0, 99, 15, 15, 7,119, 0,100, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213, 88,208, 4,213, 88,208, 4,213, 86,144, 4,213, 87,176, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 86,144, 0, 0, 0,195, 0, 0, 0, 1,
+ 4,213, 87,176, 0, 0, 0, 0, 0, 0, 0, 0, 68,137,160, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,238,224, 0,
+ 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 0, 25, 68,202,224, 0, 65,200, 0, 0,
+ 68,202,224, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 7,119,
+ 0, 26, 7,119, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0, 0,
+ 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,119, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,213, 87,176, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 86,144,192, 64, 0, 0, 67,126, 0, 0, 0, 0, 0, 0,
+ 66, 72, 0, 0,192, 17,189,112, 67,125, 70,246, 0, 0, 0, 0, 66, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0, 18,
+ 0, 0, 0, 73, 63,128, 0, 0, 66, 72, 0, 0, 72,146,124, 0, 66, 72, 0, 0, 61,204,204,205, 65, 32, 0, 0, 0, 72, 0, 0,
+ 0, 0, 2, 0, 0, 4, 4, 0, 0, 8, 7,119, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0, 26, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7,119, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,188, 4,213, 88,208, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 68, 65, 84, 65, 0, 0, 0, 96, 4,213, 89,192,
+ 0, 0, 0,194, 0, 0, 0, 1, 4,213, 97, 64, 4,213, 86, 0, 4,213, 77,112, 4,213, 77,240, 4,213, 77, 48, 4,213, 78,112,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0,101, 0, 0, 2, 15, 8, 8, 7,119, 1,171, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,213, 96, 64, 4,213, 96, 64, 4,213, 90, 80, 4,213, 95, 32, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 90, 80, 0, 0, 0,195, 0, 0, 0, 1, 4,213, 91,112,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 28, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,238,224, 0, 0, 0, 0, 0,
+ 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0, 0, 0, 0, 0, 25, 68,191, 96, 0, 65,200, 0, 0, 68,191, 96, 0,
+ 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 7,119, 0, 26, 7,119,
+ 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 0,101, 0, 0, 0,126,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,119, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 91,112,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,213, 94, 0, 4,213, 90, 80, 0, 0, 0, 0, 67, 92, 0, 0,195,200,128, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67, 75, 0, 0,195,200,128, 0, 0, 0, 0, 0, 0, 0, 0,203, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 1,144,
+ 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 1,144,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 3, 10, 0, 0, 0, 1, 0, 7,
+ 0, 18, 4, 0, 0, 6, 0,220, 1,145, 0,203, 1,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,155,
+ 0, 0, 7,118, 0, 0, 0,127, 0, 0, 2, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,220, 1,145,
+ 0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,213, 92,144, 4,213, 92,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 64, 4,213, 92,144, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 83, 69, 81, 85, 69, 78, 67, 69, 82, 95, 80, 84, 95,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 83, 99,101,110,101, 32, 80,114,101,118,105,101,119, 47, 82,101,110,100,101,114, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,255,171, 0,203, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 94, 0,
+ 0, 0, 0,195, 0, 0, 0, 1, 4,213, 95, 32, 4,213, 91,112,196,112, 0, 0, 68,112, 0, 0,196, 7, 0, 0, 68, 7, 0, 0,
+196,112, 0, 0, 68,112, 0, 0,196, 7, 0, 0, 68, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 70, 59,128, 0, 70, 59,128, 0, 55, 39,197,172, 71,195, 80, 0, 0, 0, 0, 0, 0, 0, 0, 6,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 6,154, 0, 0, 2, 15, 0, 0, 2, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
+ 0, 0, 0, 7, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,213, 95, 32, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,213, 94, 0, 0, 0, 0, 0,
+ 67,122, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 67,122, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 1,144, 0, 0, 0, 18, 0, 0, 6,154, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18,
+ 0, 0, 6,154, 0, 0, 0, 18, 0, 0, 1,144, 65, 32, 0, 0, 64,128, 0, 0, 72,146,124, 0, 66, 0, 0, 0, 60, 35,215, 10,
+ 66,200, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 8, 6,155, 1,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,154, 0, 0, 0,127, 0, 0, 2, 15, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 6,155, 1,145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 4,213, 96, 64, 0, 0, 0,160, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 64,128, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96,
+ 4,213, 97, 64, 0, 0, 0,194, 0, 0, 0, 1, 4,213,103,208, 4,213, 89,192, 4,213, 77,240, 4,213, 76,176, 4,213, 77,176,
+ 4,213, 78, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 0, 0, 2, 17, 0, 0, 4, 69, 2, 2, 3, 76, 2, 53, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,102, 80, 4,213,102, 80, 4,213, 97,208, 4,213,101, 48, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213, 97,208, 0, 0, 0,195, 0, 0, 0, 1,
+ 4,213, 98,240, 0, 0, 0, 0, 0, 0, 0, 0, 68,100,128, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68, 83, 0, 0,
+ 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 0, 0, 0, 0, 0, 0, 0, 25, 68,103,192, 0, 65,200, 0, 0,
+ 68,103,192, 0, 65,200, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 3, 76,
+ 0, 26, 3, 76, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 0, 0, 2, 17,
+ 0, 0, 2, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 76, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,213, 98,240, 0, 0, 0,195, 0, 0, 0, 1, 4,213,100, 16, 4,213, 97,208, 0, 0, 0, 0, 67, 72, 0, 0,193,112, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 72, 0, 0,196, 2, 64, 0, 0, 0, 0, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18,
+ 0, 0, 2, 26, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18,
+ 0, 0, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 6, 10, 0, 0,
+ 0, 2, 3, 3, 0, 0, 4, 0, 0, 6, 0,217, 2, 27, 0,200, 2, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 2, 43, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,217, 2, 27, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213,100, 16, 0, 0, 0,195, 0, 0, 0, 1, 4,213,101, 48, 4,213, 98,240,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,232,169,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 88,171,255, 2, 0, 0, 0, 0,
-216,166,255, 2, 0, 0, 0, 0, 0, 0,112,196, 0, 0,112, 68, 0, 0, 7,196, 0, 0, 7, 68, 0, 0,112,196, 0, 0,112, 68,
- 0, 0, 7,196, 0, 0, 7, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 6, 0, 0,
- 15, 2, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 7, 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, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 88,171,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232,169,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67,
- 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,144, 1, 0, 0, 18, 0, 0, 0,154, 6, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,154, 6, 0, 0, 18, 0, 0, 0,144, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64,
- 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 8, 0,155, 6,
-145, 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,154, 6, 0, 0,
-127, 0, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,155, 6,145, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,240, 0, 0, 0,200,172,255, 2, 0, 0, 0, 0,160, 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, 8, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 64, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0, 8,174,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
-104,182,255, 2, 0, 0, 0, 0,120,164,255, 2, 0, 0, 0, 0,136,146,255, 2, 0, 0, 0, 0, 88,144,255, 2, 0, 0, 0, 0,
- 24,146,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0,
- 17, 2, 0, 0, 69, 4, 0, 0, 2, 2, 76, 3, 53, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-184,180,255, 2, 0, 0, 0, 0,184,180,255, 2, 0, 0, 0, 0,248,174,255, 2, 0, 0, 0, 0, 72,179,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,248,174,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,104,176,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,100, 68, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 83, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0,192,103, 68, 0, 0,200, 65,
- 0,192,103, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 76, 3,
- 26, 0, 76, 3, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0,
- 17, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 3, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,104,176,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,216,177,255, 2, 0, 0, 0, 0,
-248,174,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67, 0, 0,112,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 67,
- 0, 64, 2,196, 0, 0, 0, 0,200, 0, 0, 0,217, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0,199, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0,199, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 10, 6, 0, 0, 2, 0, 3, 3, 0, 0, 0, 4, 6, 0,217, 0,
- 27, 2,200, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216, 0, 0, 0,
- 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 27, 2, 0, 0, 2, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,216,177,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 72,179,255, 2, 0, 0, 0, 0,
-104,176,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 3, 0, 0, 75, 3, 0, 0,
- 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
- 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 72,179,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-216,177,255, 2, 0, 0, 0, 0, 0, 0, 16,193, 0, 0,130, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 0, 0,122, 67,
- 0, 0, 16,193, 0, 0, 32, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0, 18, 0, 0, 0,114, 2, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,114, 2, 0, 0, 18, 0, 0, 0, 26, 2, 0, 0,111, 18,131, 58,111, 18,131, 58,
- 0,124,146, 72, 0, 80, 67, 71, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0,115, 2,
- 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 0, 75, 3, 0, 0,
- 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 2, 27, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65,240, 0, 0, 0,184,180,255, 2, 0, 0, 0, 0,158, 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, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 0, 0, 3, 75, 0, 0, 2, 43, 0, 0, 4, 69, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248, 4,213,101, 48, 0, 0, 0,195,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,213,100, 16,193, 16, 0, 0, 67,130, 0, 0,192,160, 0, 0, 64,160, 0, 0, 0, 0, 0, 0,
+ 67,122, 0, 0,193, 16, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 2, 26, 0, 0, 0, 18,
+ 0, 0, 2,114, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 2,114, 0, 0, 0, 18, 0, 0, 2, 26, 58,131, 18,111,
+ 58,131, 18,111, 72,146,124, 0, 71, 67, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0,
+ 0, 0, 2,115, 2, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217, 0, 0, 3, 75,
+ 0, 0, 2, 43, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,115, 2, 27, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0,208, 4,213,102, 80, 0, 0, 0,158, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-248,181,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,248,181,255, 2, 0, 0, 0, 0, 16, 1, 0, 0, 1, 0, 0, 0,
-232,190,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 0, 0, 0,104,182,255, 2, 0, 0, 0, 0,194, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 8,174,255, 2, 0, 0, 0, 0,248,146,255, 2, 0, 0, 0, 0, 24,146,255, 2, 0, 0, 0, 0,
-200,144,255, 2, 0, 0, 0, 0, 56,145,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
- 17, 2, 0, 0, 69, 4, 0, 0, 8, 8, 42, 4, 53, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 24,189,255, 2, 0, 0, 0, 0, 24,189,255, 2, 0, 0, 0, 0, 88,183,255, 2, 0, 0, 0, 0,168,187,255, 2, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 88,183,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,200,184,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,248, 67, 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 64,133, 68,
- 0, 0, 0, 0, 0, 0,208, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 4, 0, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 64, 50, 68, 0, 0,200, 65,
- 0, 64, 50, 68, 0, 0,200, 65, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 2, 0, 3, 3, 4, 0, 12, 4, 10, 0, 42, 4,
- 26, 0, 42, 4, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
- 17, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 4, 26, 0, 0, 0, 1, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,213,103, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 88, 4,213,103, 80, 0, 0, 1, 16, 0, 0, 0, 1, 2,152,190, 32, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,200,184,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 56,186,255, 2, 0, 0, 0, 0,
- 88,183,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 4,213,103,208, 0, 0, 0,194, 0, 0, 0, 1,
+ 0, 0, 0, 0, 4,213, 97, 64, 4,213, 78, 48, 4,213, 77,176, 4,213, 76,240, 4,213, 77, 48, 0, 0, 0, 0, 0, 0, 3, 77,
+ 0, 0, 7,118, 0, 0, 2, 17, 0, 0, 4, 69, 8, 8, 4, 42, 2, 53, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,213,108,224, 4,213,108,224, 4,213,104, 96, 4,213,107,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0,248, 4,213,104, 96, 0, 0, 0,195, 0, 0, 0, 1, 4,213,105,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67,248, 0, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0, 68,133, 64, 0, 0, 0, 0, 0, 65,208, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 4, 41, 0, 0, 0, 0, 0, 0, 0, 25, 68, 50, 64, 0, 65,200, 0, 0, 68, 50, 64, 0, 65,200, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 0, 4, 4, 12, 0, 10, 4, 42, 0, 26, 4, 42, 0, 26, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 77, 0, 0, 7,118, 0, 0, 2, 17, 0, 0, 2, 42, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4, 42, 0, 26, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 7, 0, 0,118, 7, 0, 0,
- 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0,
- 4, 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, 68, 65, 84, 65, 0, 0, 0,248, 4,213,105,128, 0, 0, 0,195, 0, 0, 0, 1,
+ 4,213,106,160, 4,213,104, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0, 56,186,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,168,187,255, 2, 0, 0, 0, 0,
-200,184,255, 2, 0, 0, 0, 0, 0, 0,240,195, 0, 0,240, 67, 0, 0,135,195, 0, 0,135, 67, 96,187,216,196, 96,187,216, 68,
-244, 43, 91,196,244, 43, 91, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 4, 0, 0, 0, 0, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0,128, 59, 70, 0,128, 59, 70,172,197, 39, 55, 0, 80,195, 71, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 4, 0, 0, 42, 4,
- 27, 2, 42, 4, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 3, 0, 0,118, 7, 0, 0,
- 43, 2, 0, 0, 69, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 4, 27, 2, 0, 0, 7, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,118, 0, 0, 7,118, 0, 0, 2, 43,
+ 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 4, 0, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,248,
+ 4,213,106,160, 0, 0, 0,195, 0, 0, 0, 1, 4,213,107,192, 4,213,105,128,195,240, 0, 0, 67,240, 0, 0,195,135, 0, 0,
+ 67,135, 0, 0,196,216,187, 96, 68,216,187, 96,196, 91, 43,244, 68, 91, 43,244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 41, 0, 0, 0, 0,
+ 0, 0, 2, 26, 0, 0, 0, 0, 0, 0, 0, 0, 70, 59,128, 0, 70, 59,128, 0, 55, 39,197,172, 71,195, 80, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 0, 0, 4, 0, 0, 0, 4, 42, 2, 27, 4, 42, 2, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 3, 77, 0, 0, 7,118, 0, 0, 2, 43, 0, 0, 4, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 42, 2, 27, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 40, 1, 0, 0,168,187,255, 2, 0, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 56,186,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67, 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0,122, 67,
- 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 18, 0, 0, 0,201, 2, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0,201, 2, 0, 0, 18, 0, 0, 0, 75, 1, 0, 0, 0, 0, 32, 65, 0, 0,128, 64,
- 0,124,146, 72, 0, 0, 0, 66, 10,215, 35, 60, 0, 0,200, 66,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0,202, 2,
- 76, 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, 1, 0, 1, 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, 68, 65, 84, 65, 0, 0, 0,248, 4,213,107,192, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 4,213,106,160,
+ 0, 0, 0, 0, 67,122, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 67,122, 0, 0, 0, 0, 0, 0, 65, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 1, 75, 0, 0, 0, 18, 0, 0, 2,201, 0, 0, 0, 0, 0, 0, 0, 17,
+ 0, 0, 0, 18, 0, 0, 2,201, 0, 0, 0, 18, 0, 0, 1, 75, 65, 32, 0, 0, 64,128, 0, 0, 72,146,124, 0, 66, 0, 0, 0,
+ 60, 35,215, 10, 66,200, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 2,202, 1, 76, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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,
- 68, 65, 84, 65,240, 0, 0, 0, 24,189,255, 2, 0, 0, 0, 0,160, 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, 8, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,216, 4,213,108,224, 0, 0, 0,160,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 64, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 0, 0, 8, 6, 0, 0,232,190,255, 2, 0, 0, 0, 0,151, 0, 0, 0, 1, 0, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,128, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67,
+ 0, 0, 5,128, 2,152,190, 32, 0, 0, 0,151, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83, 67, 83, 99,101,110,101, 0,116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+ 4,213,110, 64, 0, 0, 0, 0, 2,152,196, 32, 4,213,120,240, 0, 0, 0, 0, 4,213,112,128, 4,213,113, 32, 4,213,112,128,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 67, 83, 99,101,110,101, 0,116, 97,103,101, 0, 97,105,110, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 56,197,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0,168,211,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0, 56,201,255, 2, 0, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1,
+ 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,113,112, 2,208, 58, 32, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 1, 0, 0, 0,
- 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168,201,255, 2, 0, 0, 0, 0,
- 56, 40,160, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172, 68, 63,128, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 1, 0, 0, 0,
-250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0, 6, 0, 50, 0,141, 0,128, 7, 56, 4, 8, 0, 8, 0, 0, 0, 24, 0, 17, 0, 0, 0, 0, 0, 90, 0, 1, 0,
- 0, 0, 0, 0, 81, 0, 0, 0, 23, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 8, 0, 24, 0, 10, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,205,255, 2, 0, 0, 0, 0,104,205,255, 2, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 5, 0, 2, 0, 1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0,100,
+ 0, 0, 0, 1, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,128, 1,224, 0, 60,
+ 0, 32, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 6, 0, 50, 0,141, 7,128, 4, 56, 0, 8, 0, 8, 0, 0, 0, 24, 0, 17,
+ 0, 0, 0, 0, 0, 90, 0, 1, 0, 0, 0, 0, 0, 0, 0, 81, 0, 33, 0, 23, 0, 0, 0, 2, 0, 0, 0, 0, 0,128, 0, 0,
+ 0, 0, 0, 8, 0, 24, 0, 10, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,116, 80, 4,213,116, 80,
+ 0, 0, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 1, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 5, 0, 2, 0, 1, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
47, 47, 98, 97, 99,107, 98,117,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -6272,404 +4968,384 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 31, 5, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 0, 0, 0,128, 63, 0, 0,128, 63,
-173, 2, 95, 0,154,153,217, 63, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 76, 69, 78, 68, 69, 82, 95, 82, 69, 78, 68, 69, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68,172, 0, 0, 0, 0,128, 63,102,166,171, 67, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-208,205,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-120,233,222, 2, 0, 0, 0, 0, 1, 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,205,204, 28, 65, 0, 0, 0, 0,
- 32, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 5, 0, 60, 0, 5, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 2,224, 1, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0,128, 7, 56, 4,205,204,204, 61, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,195,245, 28,193, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0, 56,197,255, 2, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-232,197,255, 2, 0, 0, 0, 0,168,199,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 96, 0, 0, 0,232,197,255, 2, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,168,199,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,110,101,116,119,111,114,107, 95,114,101,110,100,101,114, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152,198,255, 2, 0, 0, 0, 0,
-152,198,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,
-152,198,255, 2, 0, 0, 0, 0, 8, 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,115,101,114,118,101,114, 95, 97,100,100,114,101,115,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 72,199,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 68, 65, 84, 65, 12, 0, 0, 0, 72,199,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 91,100,101,102, 97,117,108,116, 93, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,168,199,255, 2,
- 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,197,255, 2, 0, 0, 0, 0, 6, 0, 0, 0,
-112,111,115,101, 95,116,101,109,112,108, 97,116,101,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0,127, 0, 0, 0,
- 1, 0, 0, 0,200,200,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
-198, 2,182, 1, 72,220,255, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,200,200,255, 2, 0, 0, 0, 0,127, 0, 0, 0,
- 1, 0, 0, 0, 56,201,255, 2, 0, 0, 0, 0, 88,200,255, 2, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0,
-149, 3,243, 2,232,226,255, 2, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,201,255, 2, 0, 0, 0, 0,127, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,200,255, 2, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 4, 0, 0,
-157, 0, 23, 2, 72,214,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,192, 1, 0, 0,168,201,255, 2, 0, 0, 0, 0,147, 0, 0, 0,
- 1, 0, 0, 0,184,203,255, 2, 0, 0, 0, 0, 56,204,255, 2, 0, 0, 0, 0,184,204,255, 2, 0, 0, 0, 0, 0, 0,128, 63,
- 1, 0, 1, 0,205,204, 76, 63, 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63,111, 18,131, 58,205,204,204, 61, 0, 0, 1, 0,
- 32, 0, 32, 0, 32, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 80, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255, 50, 0, 10, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 50, 0, 10, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 50, 0, 10, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 62, 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,128, 63,
- 10,215, 35, 60,205,204,204, 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 0,205,204,204, 61,205,204,204, 61,102,102,166, 63,
- 0, 0,192, 63, 0, 0,240, 65, 72,225,122, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 67, 2, 0, 3,
- 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 35, 0, 0, 0,204,197,121, 63,
- 0, 0, 0, 63, 68, 65, 84, 65, 56, 0, 0, 0,184,203,255, 2, 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,136,103, 1, 3,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 1, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 0, 0, 0, 56,204,255, 2,
- 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,200,255,128,
- 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,184,204,255, 2, 0, 0, 0, 0,145, 0, 0, 0, 1, 0, 0, 0,152,172, 1, 3,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,100,100,128, 1, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
- 1, 0, 0, 0,124, 7,231, 65,255, 74, 20, 65, 54, 86,123, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 88, 0, 0, 0,104,205,255, 2, 0, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 5, 31, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,204,205, 63, 76,204,205, 63, 76,204,205, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 62,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 16, 63,128, 0, 0, 63,128, 0, 0,
+ 2,173, 0, 95, 63,217,153,154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 66, 76, 69, 78, 68, 69, 82, 95, 82, 69, 78, 68, 69, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,172, 68, 63,128, 0, 0, 67,171,166,102, 63,128, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,116,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,209, 15, 64,
+ 0, 1, 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, 65, 28,204,205, 0, 0, 0, 0, 0, 32, 0, 32, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 0, 5,
+ 0, 60, 0, 5, 0, 1, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,128, 1,224, 0, 60,
+ 0, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0,180, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5,
+ 7,128, 4, 56, 61,204,204,205, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+193, 28,245,195, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 76, 4,213,110, 64, 0, 0, 0, 8,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,110,192, 4,213,112, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 76, 4,213,110,192, 0, 0, 0, 8,
+ 0, 0, 0, 1, 4,213,112, 0, 0, 0, 0, 0, 6, 0, 0, 0,110,101,116,119,111,114,107, 95,114,101,110,100,101,114, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,111, 64, 4,213,111, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 76, 4,213,111, 64, 0, 0, 0, 8,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115,101,114,118,101,114, 95, 97,100,100,114,101,115,115, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,111,192, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 68, 65, 84, 65, 0, 0, 0, 12, 4,213,111,192, 0, 0, 0, 0,
+ 0, 0, 0, 1, 91,100,101,102, 97,117,108,116, 93, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 76, 4,213,112, 0, 0, 0, 0, 8,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,213,110,192, 6, 0, 0, 0,112,111,115,101, 95,116,101,109,112,108, 97,116,101,115, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 28, 4,213,112,128, 0, 0, 0,127,
+ 0, 0, 0, 1, 4,213,112,208, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 2,208, 1,231, 2,152,202, 32,
+ 68, 65, 84, 65, 0, 0, 0, 28, 4,213,112,208, 0, 0, 0,127, 0, 0, 0, 1, 4,213,113, 32, 4,213,112,128, 0, 0, 0, 1,
+ 0, 0, 0, 2, 0, 0, 4, 0, 3,162, 3, 41, 2,152,208, 32, 68, 65, 84, 65, 0, 0, 0, 28, 4,213,113, 32, 0, 0, 0,127,
+ 0, 0, 0, 1, 0, 0, 0, 0, 4,213,112,208, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 4, 0, 0,159, 2, 73, 2,152,196, 32,
+ 68, 65, 84, 65, 0, 0, 1,152, 4,213,113,112, 0, 0, 0,147, 0, 0, 0, 1, 4,213,115, 48, 4,213,115,128, 4,213,115,208,
+ 63,128, 0, 0, 0, 1, 0, 1, 63, 76,204,205, 66,180, 0, 0, 0, 9, 0, 1, 63,128, 0, 0, 58,131, 18,111, 61,204,204,205,
+ 0, 0, 0, 1, 0, 32, 0, 32, 0, 32, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 2,153,106, 32, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 80,
+ 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5,255,255, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 72, 0, 0, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66,200, 0, 0, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 72, 0, 0, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 72, 0, 0, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 72, 0, 0, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 66, 72, 0, 0, 0, 50, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 72, 0, 0, 0, 0, 0, 0, 62,128, 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, 63,128, 0, 0, 60, 35,215, 10, 61,204,204,205, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,
+ 61,204,204,205, 61,204,204,205, 63,166,102,102, 63,192, 0, 0, 65,240, 0, 0, 63,122,225, 72, 61,204,204,205, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 2, 67, 0, 3, 2, 0, 1, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0,
+ 0, 0, 0, 35, 63,121,197,204, 63, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 36, 4,213,115, 48, 0, 0, 0,146, 0, 0, 0, 1,
+ 2,153, 30, 32, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 1, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 36, 4,213,115,128, 0, 0, 0,146, 0, 0, 0, 1, 2,153, 30, 32, 0, 0, 0, 0,
+200,200,255,128, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 88, 4,213,115,208, 0, 0, 0,145, 0, 0, 0, 1, 2,153, 82, 32, 0, 0, 0, 0,255,100,100,128, 0, 0, 0, 1,
+ 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 65,231, 7,124, 65, 20, 74,255, 63,123, 86, 54, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 72, 4,213,116, 80, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 82,101,110,100,101,114, 76, 97,121,101,114, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 15, 0, 0, 0, 0, 0,255,127, 0, 0,
- 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0,136, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 21, 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, 67, 65, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 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, 4, 0, 0, 0, 0, 63,205,204,204, 61,
- 0, 0,200, 66, 0, 0, 12, 66,161, 14,234, 64, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 0, 0,216, 1, 0, 0, 40,207,255, 2, 0, 0, 0, 0, 33, 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, 76, 65, 76, 97,109,112, 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, 32, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 72,209,255, 2,
- 0, 0, 0, 0, 2, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,205,204, 76, 61,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 11, 3, 0, 1, 0, 0, 0, 0, 2, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111, 18,131, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,211,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,
- 64, 1, 0, 0, 72,209,255, 2, 0, 0, 0, 0, 75, 1, 0, 0, 1, 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,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 2, 0, 1, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,243, 4, 53,191,242, 4, 53, 63,242, 4, 53,191,
-243, 4, 53, 63,216,210,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 24, 0, 0, 0,216,210,255, 2,
- 0, 0, 0, 0, 73, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 56,211,255, 2, 0, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 87, 79, 0, 0,224, 1, 0, 0,168,211,255, 2, 0, 0, 0, 0,126, 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, 87, 79, 87,111,
-114,108,100, 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,114, 99, 80, 61,114, 99, 80, 61,114, 99, 80, 61,
-199, 54, 36, 60,199, 54, 36, 60,199, 54, 36, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 28, 65, 0, 0, 0, 0, 0, 0, 32, 0,
-128, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 64, 0, 0,200, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0,112, 65, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 32, 65, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 61, 0, 0, 5, 0, 0, 0, 0, 0, 10,215,163, 59,
- 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,216,213,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,
- 40, 0, 0, 0,216,213,255, 2, 0, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 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, 79, 66, 0, 0,
-208, 4, 0, 0, 72,214,255, 2, 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,
-114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,206,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
- 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 42,254,141, 63,192, 57, 49, 60, 34,159, 80, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-222,149, 47, 63, 53, 70, 58, 63,222, 56, 49,188, 0, 0, 0, 0, 86,126,162,190,227,251,159, 62, 55, 53,101, 63, 0, 0, 0, 0,
- 7,165, 39, 63,149, 84, 28,191, 51,247,227, 62, 0, 0, 0, 0,110,101,239, 64,150, 62,208,192, 78,255,170, 64, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 1, 0,128, 63, 1, 0,128, 51, 1, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0,128, 63, 1, 0,128, 51, 0, 0, 0, 0,
- 2, 0, 0,179, 2, 0, 0,167, 1, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 53, 1, 0, 0, 41, 1, 0,128,168, 0, 0,128, 63,
-221,149, 47, 63, 86,126,162,190, 8,165, 39, 63, 0, 0, 0, 0, 51, 70, 58, 63,225,251,159, 62,149, 84, 28,191, 0, 0, 0, 0,
-192, 56, 49,188, 55, 53,101, 63, 52,247,227, 62, 0, 0, 0, 0, 90, 38,173,190, 0,222,192,190,152, 9, 52,193, 0, 0,128, 63,
- 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,187,225, 16, 63, 0, 0,128, 63,
-205,204,204, 62,237, 54, 32, 63, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0,
- 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,219,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,152, 0, 0, 0,104,219,255, 2, 0, 0, 0, 0,117, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 79, 66, 0, 0,208, 4, 0, 0, 72,220,255, 2,
- 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0,232,226,255, 2, 0, 0, 0, 0, 72,214,255, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 97,223, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
-250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,
-250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104,225,255, 2, 0, 0, 0, 0,184,225,255, 2, 0, 0, 0, 0, 1, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 1, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68, 0, 79, 66, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
-100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201, 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62,
- 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 8,226,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88,124, 99, 4, 0, 0, 0, 0, 24,132, 99, 4,
- 0, 0, 0, 0, 25, 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, 0, 0, 0, 0, 68, 65, 84, 65,
- 8, 0, 0, 0,104,225,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 4, 0, 0, 0,184,225,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,152, 0, 0, 0,
- 8,226,255, 2, 0, 0, 0, 0,117, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 72, 0, 0, 0, 79, 66, 0, 0,208, 4, 0, 0,232,226,255, 2, 0, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 72,220,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 66, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 40,207,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0,
- 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154,112,130, 64,183,178,128, 63,
-112,236,188, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,123, 38, 63, 87, 43, 98, 61,229,229,238, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54,236,148,190, 25,134,116, 63,236, 13, 98,189, 0, 0, 0, 0,221,102, 69,191,
- 57,174, 76,190, 34,194, 26, 63, 0, 0, 0, 0, 37,255, 16, 63,241,161, 95, 62,164,111, 75, 63, 0, 0, 0, 0,154,112,130, 64,
-183,178,128, 63,112,236,188, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 1, 0,128, 50, 0, 0, 0,179, 0, 0, 0, 0, 1, 0,128, 50,
- 1, 0,128, 63, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 1, 0, 0, 39,
- 1, 0, 0, 52, 1, 0,128, 39, 0, 0,128, 63, 54,236,148,190,221,102, 69,191, 38,255, 16, 63, 0, 0, 0, 0, 24,134,116, 63,
- 57,174, 76,190,239,161, 95, 62, 0, 0, 0, 0,237, 13, 98,189, 35,194, 26, 63,166,111, 75, 63, 0, 0, 0, 0,209, 19, 13, 63,
-241, 65,102,190, 10, 10,231,192, 0, 0,128, 63, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 68, 0,
- 79, 66, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 56,180,150,201,
- 0, 0,128, 63,169, 19,208, 60, 0, 0,128, 63,205,204,204, 62,229,208, 34, 62, 0, 0, 0, 0,143,194,117, 61, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 5, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,232,255, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,152, 0, 0, 0, 8,232,255, 2, 0, 0, 0, 0,
-117, 0, 0, 0, 1, 0, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-205,204,204, 61,205,204, 76, 62, 10,215,163, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 0, 0, 0,
- 77, 65, 0, 0, 32, 3, 0, 0,232,232,255, 2, 0, 0, 0, 0, 35, 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, 77, 65, 77, 97,116,101,114,105,
- 97,108, 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, 1, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 10,215, 35, 60, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 50, 0,205,204, 76, 62, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62,
- 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 2, 0, 2, 0,
- 50, 0, 0, 6, 0, 0,128, 63, 0, 0,128, 63, 18, 0, 18, 0, 10,215,163, 59, 10,215,163, 59, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 4, 0, 67, 0, 64, 3, 67, 0, 64, 3, 1, 0, 4, 0, 12, 0, 4, 0, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0,128, 64, 0, 0, 0, 63,205,204,204, 61, 0, 0, 0, 63,205,204,204, 61,205,204,204, 61, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 88,236,255, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,184,237,255, 2, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,111,148, 26, 63,111,148, 26, 63,111,148, 26, 63,
-205,204, 76, 61,205,204,204, 61,102,102,166, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 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, 68, 65, 84, 65, 16, 1, 0, 0,
- 88,236,255, 2, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-200,142, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 40, 0, 0, 0,184,237,255, 2, 0, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0,
- 32, 0, 0, 0, 96, 0, 0, 0, 0, 0, 1, 0, 51, 0, 51, 0, 40,238,255, 2, 0, 0, 0, 0,120,254,255, 2, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 16, 0, 0, 40,238,255, 2, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15,255,255, 0, 0, 0, 0, 0, 0,127,255, 0, 0, 0, 0, 0, 0, 0, 3,
+ 0, 0, 0, 0, 0, 0, 67, 65, 0, 0, 0,104, 4,213,116,240, 0, 0, 0, 21, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 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, 4, 63, 0, 0, 0, 61,204,204,205, 66,200, 0, 0,
+ 66, 12, 0, 0, 64,234, 14,161, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 76, 65, 0, 0, 1,108, 4,213,117,128, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 76, 65, 76, 97,109,112, 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, 32, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 65,239,255,247,
+ 66,150, 0, 0, 62, 25,153,154, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 4,213,119, 32, 0, 2, 0, 0, 63,128, 26, 46,
+ 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 61, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 11, 64, 0, 3, 0, 1, 0, 0, 0, 2, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 58,131, 18,111, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,120,160,
+ 68, 65, 84, 65, 0, 0, 1, 16, 4,213,119, 32, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 2, 0, 1, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191, 53, 4,243, 63, 53, 4,242,191, 53, 4,242,
+ 63, 53, 4,243, 4,213,120, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 4,213,120, 96, 0, 0, 1, 74, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 32, 4,213,120,160, 0, 0, 0, 11,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 87, 79, 0, 0, 1,112, 4,213,120,240, 0, 0, 0,126, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 87, 79, 87,111,114,108,100, 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, 61, 80, 99,114, 61, 80, 99,114,
+ 61, 80, 99,114, 60, 36, 54,199, 60, 36, 54,199, 60, 36, 54,199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 28,204,205, 0, 0, 0, 0,
+ 0, 0, 0, 32, 0,128, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,160, 0, 0, 65,200, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 65,112, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 65, 32, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 61, 76,204,205, 0, 0, 0, 5, 0, 0, 0, 0,
+ 59,163,215, 10, 0, 0, 0, 0, 62,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,213,122,144, 68, 65, 84, 65, 0, 0, 0, 32, 4,213,122,144, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,
+ 0, 0, 4, 28, 2,152,196, 32, 0, 0, 0,114, 0, 0, 0, 1, 2,152,202, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 79, 66, 67, 97,109,101,114, 97, 0, 97,109,101,114, 97, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,213,116,240, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 64,239,101,110,192,208, 62,150, 64,170,255, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,141,254, 42, 60, 49, 57,192, 63, 80,159, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 47,149,222, 63, 58, 70, 53,
+188, 49, 56,222, 0, 0, 0, 0,190,162,126, 86, 62,159,251,227, 63,101, 53, 55, 0, 0, 0, 0, 63, 39,165, 7,191, 28, 84,149,
+ 62,227,247, 51, 0, 0, 0, 0, 64,239,101,110,192,208, 62,150, 64,170,255, 78, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 1, 51,128, 0, 1,
+179, 0, 0, 1, 0, 0, 0, 0, 51, 0, 0, 0, 63,128, 0, 0, 51,128, 0, 1, 0, 0, 0, 0,179, 0, 0, 2,167, 0, 0, 2,
+ 63,128, 0, 1, 0, 0, 0, 0, 53, 0, 0, 1, 41, 0, 0, 1,168,128, 0, 1, 63,128, 0, 0, 63, 47,149,221,190,162,126, 86,
+ 63, 39,165, 8, 0, 0, 0, 0, 63, 58, 70, 51, 62,159,251,225,191, 28, 84,149, 0, 0, 0, 0,188, 49, 56,192, 63,101, 53, 55,
+ 62,227,247, 52, 0, 0, 0, 0,190,173, 38, 90,190,192,222, 0,193, 52, 9,152, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0,
+ 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
+ 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56, 63,128, 0, 0, 63, 16,225,187, 63,128, 0, 0, 62,204,204,205, 63, 32, 54,237,
+ 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 1, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,213,122,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 0, 0, 0,144, 4,213,122,224, 0, 0, 0,117, 0, 0, 0, 1,
+ 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 62, 76,204,205,
+ 60,163,215, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 79, 66, 0, 0, 4, 28, 2,152,202, 32, 0, 0, 0,114,
+ 0, 0, 0, 1, 2,152,208, 32, 2,152,196, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 67,117, 98,101, 0,112,104,101,114,101,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,182,152, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,128,192,
+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,
+ 0, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,213,123,160, 4,213,123,208, 0, 0, 0, 1, 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, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 68,
+ 79, 66, 0, 0, 0, 7, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,201,150,180, 56,
+ 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 34,208,229, 0, 0, 0, 0, 61,117,194,143, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 1, 64, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,124, 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, 9,182,150,192, 9,182,157,176, 0, 0, 0, 25,
+ 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,
+ 68, 65, 84, 65, 0, 0, 0, 4, 4,213,123,160, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4,
+ 4,213,123,208, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,144, 4,213,124, 0, 0, 0, 0,117,
+ 0, 0, 0, 1, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205,
+ 62, 76,204,205, 60,163,215, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 79, 66, 0, 0, 4, 28, 2,152,208, 32,
+ 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0, 0, 2,152,202, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,213,117,128, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 6, 0, 0, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,130,112,154,
+ 63,128,178,183, 64,188,236,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,123,229, 61, 98, 43, 87,
+ 63,238,229,229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,190,148,236, 54, 63,116,134, 25,189, 98, 13,236, 0, 0, 0, 0,
+191, 69,102,221,190, 76,174, 57, 63, 26,194, 34, 0, 0, 0, 0, 63, 16,255, 37, 62, 95,161,241, 63, 75,111,164, 0, 0, 0, 0,
+ 64,130,112,154, 63,128,178,183, 64,188,236,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 50,128, 0, 1,179, 0, 0, 0, 0, 0, 0, 0,
+ 50,128, 0, 1, 63,128, 0, 1, 51, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 39, 0, 0, 1, 52, 0, 0, 1, 39,128, 0, 1, 63,128, 0, 0,190,148,236, 54,191, 69,102,221, 63, 16,255, 38, 0, 0, 0, 0,
+ 63,116,134, 24,190, 76,174, 57, 62, 95,161,239, 0, 0, 0, 0,189, 98, 13,237, 63, 26,194, 35, 63, 75,111,166, 0, 0, 0, 0,
+ 63, 13, 19,209,190,102, 65,241,192,231, 10, 10, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 1,
+ 0, 0, 0, 68, 79, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 0,
+201,150,180, 56, 63,128, 0, 0, 60,208, 19,169, 63,128, 0, 0, 62,204,204,205, 62, 34,208,229, 0, 0, 0, 0, 61,117,194,143,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 1, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 64, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,124,192, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 0, 0, 0,144, 4,213,124,192, 0, 0, 0,117, 0, 0, 0, 1, 0, 0,192, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 62, 76,204,205, 60,163,215, 10, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 77, 65, 0, 0, 2,160, 2,152,214, 32, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2,208, 66, 32, 0, 0, 0, 0, 77, 65, 77, 97,116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 76,204,205, 63, 76,204,205,
+ 63, 76,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63, 76,204,205, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 60, 35,215, 10, 0, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 50, 62, 76,204,205,
+ 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 2, 0, 50, 0, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 18, 0, 18, 59,163,215, 10,
+ 59,163,215, 10, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 64, 0, 67, 3, 64, 0, 67, 0, 1, 0, 4, 0, 12, 0, 4,
+ 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64,128, 0, 0, 63, 0, 0, 0, 61,204,204,205, 63, 0, 0, 0, 61,204,204,205,
+ 61,204,204,205, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 4,213,125,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,126,192, 63, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63, 26,148,111, 63, 26,148,111, 63, 26,148,111, 61, 76,204,205, 61,204,204,205, 63,166,102,102, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 16, 4,213,125,128, 0, 0, 0, 24, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,127, 16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 32, 4,213,126,192, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 32,
+ 0, 0, 0, 96, 0, 0, 0, 1, 0, 52, 0, 52, 2,152,218, 32, 2,117, 64, 32, 68, 65, 84, 65, 0, 0, 16, 0, 2,152,218, 32,
+ 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, 0, 2, 2, 2, 51, 2, 2, 2, 51,
+ 6, 6, 6,153, 6, 6, 6,153, 6, 6, 6,153, 4, 4, 4,102, 3, 3, 3,102, 2, 2, 2, 51, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 51, 8, 8, 8,153, 11, 11, 11,204, 13, 13, 13,255, 12, 12, 12,255,
+ 12, 12, 12,255, 11, 11, 11,255, 10, 10, 10,255, 10, 10, 10,255, 9, 9, 9,255, 9, 9, 9,255, 9, 9, 9,255, 4, 4, 4,102,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 3, 3, 51, 10, 10, 10,153, 18, 18, 18,255, 20, 20, 20,255, 22, 22, 22,255, 23, 23, 23,255, 22, 22, 22,255,
+ 20, 20, 20,255, 19, 19, 19,255, 16, 16, 16,255, 14, 14, 14,255, 11, 11, 11,255, 10, 10, 10,255, 9, 9, 9,255, 9, 9, 9,255,
+ 9, 9, 9,255, 8, 8, 8,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7, 7, 7,102, 19, 19, 19,204, 27, 27, 27,255, 31, 31, 31,255, 32, 32, 32,255, 33, 33, 33,255, 33, 33, 33,255, 31, 31, 31,255,
+ 30, 30, 30,255, 27, 27, 27,255, 25, 25, 25,255, 22, 22, 22,255, 19, 19, 19,255, 16, 16, 16,255, 12, 12, 12,255, 10, 10, 10,255,
+ 10, 10, 10,255, 10, 10, 10,255, 10, 10, 10,255, 4, 4, 4,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,153,
+ 29, 29, 29,255, 37, 37, 37,255, 40, 40, 40,255, 42, 42, 42,255, 42, 42, 42,255, 43, 43, 43,255, 41, 41, 41,255, 40, 40, 40,255,
+ 38, 38, 38,255, 36, 36, 36,255, 33, 33, 33,255, 30, 30, 30,255, 27, 27, 27,255, 24, 24, 24,255, 20, 20, 20,255, 16, 16, 16,255,
+ 12, 12, 12,255, 10, 10, 10,255, 10, 10, 10,255, 10, 10, 10,255, 7, 7, 7,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,102, 37, 37, 37,255,
+ 44, 44, 44,255, 48, 48, 48,255, 50, 50, 50,255, 51, 51, 51,255, 51, 51, 51,255, 50, 50, 50,255, 49, 49, 49,255, 48, 48, 48,255,
+ 45, 45, 45,255, 43, 43, 43,255, 41, 41, 41,255, 37, 37, 37,255, 34, 34, 34,255, 31, 31, 31,255, 28, 28, 28,255, 24, 24, 24,255,
+ 20, 20, 20,255, 15, 15, 15,255, 11, 11, 11,255, 10, 10, 10,255, 11, 11, 11,255, 7, 7, 7,153, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13,102, 41, 41, 41,255, 50, 50, 50,255,
+ 54, 54, 54,255, 57, 57, 57,255, 58, 58, 58,255, 59, 59, 59,255, 59, 59, 59,255, 58, 58, 58,255, 57, 57, 57,255, 55, 55, 55,255,
+ 53, 53, 53,255, 51, 51, 51,255, 48, 48, 48,255, 45, 45, 45,255, 41, 41, 41,255, 38, 38, 38,255, 35, 35, 35,255, 31, 31, 31,255,
+ 27, 27, 27,255, 23, 23, 23,255, 17, 17, 17,255, 12, 12, 12,255, 11, 11, 11,255, 11, 11, 11,255, 5, 5, 5,102, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 36, 36,204, 53, 53, 53,255, 59, 59, 59,255,
+ 63, 63, 63,255, 65, 65, 65,255, 66, 66, 66,255, 66, 66, 66,255, 66, 66, 66,255, 65, 65, 65,255, 64, 64, 64,255, 62, 62, 62,255,
+ 60, 60, 60,255, 57, 57, 57,255, 54, 54, 54,255, 51, 51, 51,255, 48, 48, 48,255, 44, 44, 44,255, 41, 41, 41,255, 37, 37, 37,255,
+ 33, 33, 33,255, 29, 29, 29,255, 24, 24, 24,255, 19, 19, 19,255, 13, 13, 13,255, 11, 11, 11,255, 12, 12, 12,255, 3, 3, 3, 51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 19, 19,102, 56, 56, 56,255, 64, 64, 64,255, 68, 68, 68,255,
+ 71, 71, 71,255, 73, 73, 73,255, 74, 74, 74,255, 74, 74, 74,255, 73, 73, 73,255, 72, 72, 72,255, 71, 71, 71,255, 69, 69, 69,255,
+ 67, 67, 67,255, 64, 64, 64,255, 61, 61, 61,255, 58, 58, 58,255, 54, 54, 54,255, 50, 50, 50,255, 47, 47, 47,255, 43, 43, 43,255,
+ 39, 39, 39,255, 34, 34, 34,255, 30, 30, 30,255, 25, 25, 25,255, 19, 19, 19,255, 13, 13, 13,255, 12, 12, 12,255, 10, 10, 10,204,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54,255, 66, 66, 66,255, 72, 72, 72,255, 77, 77, 77,255,
+ 79, 79, 79,255, 81, 81, 81,255, 81, 81, 81,255, 81, 81, 81,255, 80, 80, 80,255, 79, 79, 79,255, 77, 77, 77,255, 75, 75, 75,255,
+ 73, 73, 73,255, 70, 70, 70,255, 67, 67, 67,255, 63, 63, 63,255, 60, 60, 60,255, 56, 56, 56,255, 52, 52, 52,255, 49, 49, 49,255,
+ 44, 44, 44,255, 40, 40, 40,255, 35, 35, 35,255, 30, 30, 30,255, 24, 24, 24,255, 18, 18, 18,255, 12, 12, 12,255, 12, 12, 12,255,
+ 6, 6, 6,102, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 22,102, 67, 67, 67,255, 76, 76, 76,255, 81, 81, 81,255, 84, 84, 84,255,
+ 87, 87, 87,255, 88, 88, 88,255, 88, 88, 88,255, 88, 88, 88,255, 87, 87, 87,255, 86, 86, 86,255, 84, 84, 84,255, 82, 82, 82,255,
+ 79, 79, 79,255, 76, 76, 76,255, 73, 73, 73,255, 69, 69, 69,255, 65, 65, 65,255, 62, 62, 62,255, 58, 58, 58,255, 54, 54, 54,255,
+ 49, 49, 49,255, 45, 45, 45,255, 40, 40, 40,255, 35, 35, 35,255, 29, 29, 29,255, 23, 23, 23,255, 16, 16, 16,255, 12, 12, 12,255,
+ 12, 12, 12,204, 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49,204, 76, 76, 76,255, 84, 84, 84,255, 89, 89, 89,255, 92, 92, 92,255,
+ 94, 94, 94,255, 95, 95, 95,255, 95, 95, 95,255, 95, 95, 95,255, 94, 94, 94,255, 93, 93, 93,255, 91, 91, 91,255, 88, 88, 88,255,
+ 85, 85, 85,255, 82, 82, 82,255, 79, 79, 79,255, 75, 75, 75,255, 71, 71, 71,255, 67, 67, 67,255, 63, 63, 63,255, 59, 59, 59,255,
+ 55, 55, 55,255, 50, 50, 50,255, 45, 45, 45,255, 40, 40, 40,255, 34, 34, 34,255, 28, 28, 28,255, 21, 21, 21,255, 13, 13, 13,255,
+ 14, 14, 14,255, 0, 0, 0, 0, 14, 14, 14,102, 70, 70, 70,255, 85, 85, 85,255, 92, 92, 92,255, 97, 97, 97,255,100,100,100,255,
+102,102,102,255,102,102,102,255,103,103,103,255,102,102,102,255,101,101,101,255, 99, 99, 99,255, 97, 97, 97,255, 94, 94, 94,255,
+ 91, 91, 91,255, 88, 88, 88,255, 84, 84, 84,255, 81, 81, 81,255, 77, 77, 77,255, 72, 72, 72,255, 68, 68, 68,255, 64, 64, 64,255,
+ 59, 59, 59,255, 55, 55, 55,255, 50, 50, 50,255, 44, 44, 44,255, 39, 39, 39,255, 32, 32, 32,255, 25, 25, 25,255, 17, 17, 17,255,
+ 13, 13, 13,255, 7, 7, 7,102, 24, 24, 24,102, 80, 80, 80,255, 93, 93, 93,255,100,100,100,255,104,104,104,255,107,107,107,255,
+109,109,109,255,109,109,109,255,109,109,109,255,109,109,109,255,107,107,107,255,106,106,106,255,103,103,103,255,100,100,100,255,
+ 97, 97, 97,255, 94, 94, 94,255, 90, 90, 90,255, 86, 86, 86,255, 82, 82, 82,255, 77, 77, 77,255, 73, 73, 73,255, 69, 69, 69,255,
+ 64, 64, 64,255, 59, 59, 59,255, 54, 54, 54,255, 49, 49, 49,255, 43, 43, 43,255, 36, 36, 36,255, 29, 29, 29,255, 21, 21, 21,255,
+ 14, 14, 14,255, 10, 10, 10,153, 29, 29, 29,102, 89, 89, 89,255,100,100,100,255,107,107,107,255,112,112,112,255,114,114,114,255,
+116,116,116,255,116,116,116,255,116,116,116,255,115,115,115,255,114,114,114,255,112,112,112,255,110,110,110,255,107,107,107,255,
+104,104,104,255,100,100,100,255, 96, 96, 96,255, 92, 92, 92,255, 87, 87, 87,255, 83, 83, 83,255, 78, 78, 78,255, 73, 73, 73,255,
+ 68, 68, 68,255, 63, 63, 63,255, 58, 58, 58,255, 52, 52, 52,255, 46, 46, 46,255, 40, 40, 40,255, 33, 33, 33,255, 24, 24, 24,255,
+ 17, 17, 17,255, 13, 13, 13,204, 46, 46, 46,153, 95, 95, 95,255,107,107,107,255,114,114,114,255,118,118,118,255,121,121,121,255,
+122,122,122,255,123,123,123,255,123,123,123,255,122,122,122,255,122,122,122,255,120,120,120,255,118,118,118,255,114,114,114,255,
+110,110,110,255,106,106,106,255,101,101,101,255, 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255, 83, 83, 83,255, 78, 78, 78,255,
+ 73, 73, 73,255, 68, 68, 68,255, 62, 62, 62,255, 56, 56, 56,255, 50, 50, 50,255, 44, 44, 44,255, 36, 36, 36,255, 28, 28, 28,255,
+ 19, 19, 19,255, 12, 12, 12,204, 47, 47, 47,153,101,101,101,255,113,113,113,255,120,120,120,255,125,125,125,255,127,127,127,255,
+129,129,129,255,130,130,130,255,130,130,130,255,131,131,131,255,131,131,131,255,131,131,131,255,129,129,129,255,125,125,125,255,
+120,120,120,255,113,113,113,255,108,108,108,255,103,103,103,255, 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255, 82, 82, 82,255,
+ 77, 77, 77,255, 72, 72, 72,255, 66, 66, 66,255, 60, 60, 60,255, 54, 54, 54,255, 47, 47, 47,255, 39, 39, 39,255, 31, 31, 31,255,
+ 22, 22, 22,255, 12, 12, 12,204, 48, 48, 48,153,106,106,106,255,118,118,118,255,126,126,126,255,131,131,131,255,134,134,134,255,
+135,135,135,255,137,137,137,255,138,138,138,255,142,142,142,255,147,147,147,255,149,149,149,255,148,148,148,255,142,142,142,255,
+133,133,133,255,124,124,124,255,115,115,115,255,108,108,108,255,102,102,102,255, 97, 97, 97,255, 92, 92, 92,255, 87, 87, 87,255,
+ 81, 81, 81,255, 75, 75, 75,255, 69, 69, 69,255, 63, 63, 63,255, 57, 57, 57,255, 49, 49, 49,255, 42, 42, 42,255, 33, 33, 33,255,
+ 24, 24, 24,255, 9, 9, 9,153, 32, 32, 32,102,109,109,109,255,123,123,123,255,131,131,131,255,136,136,136,255,140,140,140,255,
+142,142,142,255,144,144,144,255,148,148,148,255,156,156,156,255,168,168,168,255,176,176,176,255,177,177,177,255,168,168,168,255,
+153,153,153,255,137,137,137,255,124,124,124,255,114,114,114,255,107,107,107,255,101,101,101,255, 96, 96, 96,255, 90, 90, 90,255,
+ 85, 85, 85,255, 79, 79, 79,255, 72, 72, 72,255, 66, 66, 66,255, 59, 59, 59,255, 52, 52, 52,255, 44, 44, 44,255, 35, 35, 35,255,
+ 26, 26, 26,255, 10, 10, 10,153, 17, 17, 17, 51,110,110,110,255,127,127,127,255,136,136,136,255,142,142,142,255,145,145,145,255,
+148,148,148,255,151,151,151,255,159,159,159,255,174,174,174,255,195,195,195,255,212,212,212,255,216,216,216,255,204,204,204,255,
+179,179,179,255,154,154,154,255,135,135,135,255,121,121,121,255,112,112,112,255,106,106,106,255, 99, 99, 99,255, 94, 94, 94,255,
+ 88, 88, 88,255, 82, 82, 82,255, 76, 76, 76,255, 69, 69, 69,255, 62, 62, 62,255, 54, 54, 54,255, 46, 46, 46,255, 37, 37, 37,255,
+ 26, 26, 26,255, 6, 6, 6,102, 0, 0, 0, 0,107,107,107,255,130,130,130,255,140,140,140,255,146,146,146,255,150,150,150,255,
+153,153,153,255,158,158,158,255,169,169,169,255,191,191,191,255,219,219,219,255,246,246,246,255,254,254,254,255,237,237,237,255,
+204,204,204,255,170,170,170,255,145,145,145,255,127,127,127,255,117,117,117,255,110,110,110,255,103,103,103,255, 97, 97, 97,255,
+ 91, 91, 91,255, 85, 85, 85,255, 78, 78, 78,255, 71, 71, 71,255, 64, 64, 64,255, 55, 55, 55,255, 47, 47, 47,255, 37, 37, 37,255,
+ 25, 25, 25,255, 3, 3, 3, 51, 0, 0, 0, 0, 65, 65, 65,153,129,129,129,255,142,142,142,255,149,149,149,255,154,154,154,255,
+158,158,158,255,163,163,163,255,176,176,176,255,199,199,199,255,232,232,232,255,255,255,255,255,255,255,255,255,255,255,255,255,
+220,220,220,255,181,181,181,255,151,151,151,255,132,132,132,255,121,121,121,255,113,113,113,255,106,106,106,255,100,100,100,255,
+ 94, 94, 94,255, 87, 87, 87,255, 80, 80, 80,255, 73, 73, 73,255, 65, 65, 65,255, 57, 57, 57,255, 48, 48, 48,255, 38, 38, 38,255,
+ 16, 16, 16,153, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 21, 51,127,127,127,255,143,143,143,255,152,152,152,255,157,157,157,255,
+161,161,161,255,165,165,165,255,177,177,177,255,198,198,198,255,227,227,227,255,253,253,253,255,255,255,255,255,250,250,250,255,
+217,217,217,255,181,181,181,255,153,153,153,255,135,135,135,255,124,124,124,255,117,117,117,255,110,110,110,255,103,103,103,255,
+ 96, 96, 96,255, 89, 89, 89,255, 82, 82, 82,255, 74, 74, 74,255, 66, 66, 66,255, 57, 57, 57,255, 48, 48, 48,255, 35, 35, 35,255,
+ 10, 10, 10,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 93, 93,204,141,141,141,255,153,153,153,255,159,159,159,255,
+163,163,163,255,167,167,167,255,174,174,174,255,188,188,188,255,209,209,209,255,228,228,228,255,234,234,234,255,224,224,224,255,
+200,200,200,255,173,173,173,255,151,151,151,255,136,136,136,255,127,127,127,255,119,119,119,255,112,112,112,255,105,105,105,255,
+ 98, 98, 98,255, 90, 90, 90,255, 83, 83, 83,255, 75, 75, 75,255, 66, 66, 66,255, 57, 57, 57,255, 46, 46, 46,255, 24, 24, 24,204,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 51,134,134,134,255,151,151,151,255,160,160,160,255,
+164,164,164,255,167,167,167,255,171,171,171,255,178,178,178,255,189,189,189,255,200,200,200,255,202,202,202,255,195,195,195,255,
+180,180,180,255,163,163,163,255,148,148,148,255,137,137,137,255,129,129,129,255,121,121,121,255,114,114,114,255,107,107,107,255,
+ 99, 99, 99,255, 91, 91, 91,255, 83, 83, 83,255, 74, 74, 74,255, 65, 65, 65,255, 55, 55, 55,255, 41, 41, 41,255, 7, 7, 7, 51,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49,102,145,145,145,255,157,157,157,255,
+164,164,164,255,167,167,167,255,170,170,170,255,172,172,172,255,176,176,176,255,180,180,180,255,179,179,179,255,174,174,174,255,
+165,165,165,255,155,155,155,255,145,145,145,255,137,137,137,255,130,130,130,255,122,122,122,255,115,115,115,255,107,107,107,255,
+ 99, 99, 99,255, 91, 91, 91,255, 82, 82, 82,255, 73, 73, 73,255, 63, 63, 63,255, 50, 50, 50,255, 22, 22, 22,153, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 78, 78,153,149,149,149,255,
+160,160,160,255,166,166,166,255,168,168,168,255,169,169,169,255,170,170,170,255,169,169,169,255,167,167,167,255,164,164,164,255,
+158,158,158,255,151,151,151,255,144,144,144,255,137,137,137,255,130,130,130,255,123,123,123,255,115,115,115,255,106,106,106,255,
+ 98, 98, 98,255, 89, 89, 89,255, 80, 80, 80,255, 70, 70, 70,255, 58, 58, 58,255, 27, 27, 27,153, 3, 3, 3, 51, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 80,153,
+150,150,150,255,160,160,160,255,165,165,165,255,167,167,167,255,167,167,167,255,166,166,166,255,163,163,163,255,160,160,160,255,
+155,155,155,255,149,149,149,255,143,143,143,255,137,137,137,255,129,129,129,255,121,121,121,255,113,113,113,255,105,105,105,255,
+ 96, 96, 96,255, 86, 86, 86,255, 76, 76, 76,255, 63, 63, 63,255, 38, 38, 38,204, 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 78, 78, 78,153,147,147,147,255,157,157,157,255,161,161,161,255,163,163,163,255,162,162,162,255,160,160,160,255,157,157,157,255,
+152,152,152,255,147,147,147,255,141,141,141,255,135,135,135,255,127,127,127,255,119,119,119,255,110,110,110,255,101,101,101,255,
+ 91, 91, 91,255, 80, 80, 80,255, 66, 66, 66,255, 32, 32, 32,153, 7, 7, 7, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,134,134,134,255,148,148,148,255,154,154,154,255,155,155,155,255,154,154,154,255,152,152,152,255,
+147,147,147,255,142,142,142,255,136,136,136,255,130,130,130,255,122,122,122,255,114,114,114,255,104,104,104,255, 93, 93, 93,255,
+ 81, 81, 81,255, 54, 54, 54,204, 22, 22, 22,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 73, 73,153,103,103,103,204,137,137,137,255,140,140,140,255,140,140,140,255,
+137,137,137,255,133,133,133,255,127,127,127,255,120,120,120,255,113,113,113,255,102,102,102,255, 91, 91, 91,255, 64, 64, 64,204,
+ 28, 28, 28,102, 6, 6, 6, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, 46,102, 72, 72, 72,153,
+ 72, 72, 72,153, 92, 92, 92,204, 88, 88, 88,204, 81, 81, 81,204, 54, 54, 54,153, 35, 35, 35,102, 16, 16, 16, 51, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0,144, 0, 2,117, 64, 32, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -6693,8 +5369,6 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0,144, 0, 0,
-120,254,255, 2, 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, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -7823,6 +6497,20 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69,
+ 0, 0, 1, 48, 4,213,127, 16, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84, 69, 84,101,120, 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, 62,128, 0, 0, 64,160, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 64, 0, 0, 0, 64, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 32, 0, 0,
+ 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 1, 0, 1, 0, 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 60,204,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 2, 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, 4,213,128,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 32, 4,213,128,112, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 32,
+ 0, 0, 0, 96, 0, 0, 0, 1, 0, 16, 0, 15, 2,152,236, 32, 2,117,224, 32, 68, 65, 84, 65, 0, 0, 16, 0, 2,152,236, 32,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -7846,22 +6534,7 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69, 0, 0,112, 1, 0, 0,200,142, 0, 3, 0, 0, 0, 0,
- 31, 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, 84, 69, 84,101,120, 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,128, 62, 0, 0,160, 64,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0,128, 63, 0, 0, 0, 64, 0, 0, 0, 64, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 7, 0, 8, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 1, 0,
- 3, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204,204, 60, 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, 2, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,136,144, 0, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,
-136,144, 0, 3, 0, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0, 32, 0, 0, 0, 96, 0, 0, 0,
- 0, 0, 1, 0, 16, 0, 15, 0,248,144, 0, 3, 0, 0, 0, 0, 72,161, 0, 3, 0, 0, 0, 0, 68, 65, 84, 65, 0, 16, 0, 0,
-248,144, 0, 3, 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, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -7965,6 +6638,7 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0,144, 0, 2,117,224, 32, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -7989,8 +6663,6 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0,144, 0, 0, 72,161, 0, 3, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9118,7 +7790,20 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,
+ 0, 0, 1, 24, 4,213,128,192, 0, 0, 0, 46, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 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, 4,213,130, 0, 4,213,136, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,213,131,176, 4,213,134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4,213,130, 48, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4,213,132,128, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,134,192,
+ 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12,
+ 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 51,128, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 4, 63,128, 0, 4,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 67, 0, 30, 0, 6, 0, 1, 0, 1, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 4,213,130, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,152,214, 32,
+ 68, 65, 84, 65, 0, 0, 1, 84, 4,213,130, 48, 0, 0, 1, 81, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,131,176, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9127,7 +7812,15 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,160, 4,213,131,176, 0, 0, 0, 52, 0, 0, 0, 8, 63,128, 0, 0,
+ 63,127,255,255,191,128, 0, 0, 73,230, 73,230,182, 26, 1, 0, 63,128, 0, 0,191,128, 0, 0,191,128, 0, 0, 73,230,182, 26,
+182, 26, 1, 0,191,128, 0, 1,191,127,255,253,191,128, 0, 0,182, 26,182, 26,182, 26, 1, 0,191,127,255,250, 63,128, 0, 3,
+191,128, 0, 0,182, 26, 73,230,182, 26, 1, 0, 63,128, 0, 4, 63,127,255,247, 63,128, 0, 0, 73,230, 73,230, 73,230, 1, 0,
+ 63,127,255,245,191,128, 0, 5, 63,128, 0, 0, 73,230,182, 26, 73,230, 1, 0,191,128, 0, 3,191,127,255,250, 63,128, 0, 0,
+182, 26,182, 26, 73,230, 1, 0,191,127,255,255, 63,128, 0, 0, 63,128, 0, 0,182, 26, 73,230, 73,230, 1, 0, 68, 65, 84, 65,
+ 0, 0, 1, 84, 4,213,132,128, 0, 0, 1, 81, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9136,93 +7829,82 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,144, 4,213,134, 0, 0, 0, 0, 49, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 1,
+ 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 1,
+ 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 35,
+ 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 5,
+ 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 35, 0, 0, 0, 6,
+ 0, 0, 0, 7, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 84, 4,213,134,192, 0, 0, 1, 81, 0, 0, 0, 5, 0, 0, 0, 4,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,213,136, 64,
+ 0, 0, 0, 6, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67,111,108, 0, 0, 0, 0, 0, 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, 75,138,139, 0, 0, 0, 6, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 67,111,108, 0, 0, 0, 0, 0, 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, 75,138,139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,120, 4,213,136, 64, 0, 0, 0, 48,
+ 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 7,
+ 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 2,
+ 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 7,
+ 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 2, 0, 0, 66, 82,
+ 0, 0, 2,204, 2,152,254, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 65,100,100, 0,104, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,138, 32, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0,176, 1, 0, 0,152, 49, 1, 3, 0, 0, 0, 0, 46, 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,
- 77, 69, 67,117, 98,101, 0,112,104,101,114,101, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 51, 1, 3, 0, 0, 0, 0,
-232, 58, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,152, 53, 1, 3, 0, 0, 0, 0,
- 88, 56, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 51, 1, 3, 0, 0, 0, 0,
- 1, 0, 0, 0, 5, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-168, 54, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 56, 57, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,128, 51, 0, 0, 0,180, 0, 0, 0, 0, 4, 0,128, 63, 4, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 30, 0, 6, 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, 68, 65, 84, 65, 8, 0, 0, 0,152, 51, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0,232,232,255, 2, 0, 0, 0, 0, 68, 65, 84, 65,104, 1, 0, 0,232, 51, 1, 3, 0, 0, 0, 0,
- 80, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,152, 53, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75,
+ 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33,
+ 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 16, 2,152,254,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 16, 4,213,138, 32, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,126,215, 14, 61,194,189, 54,191,126,215, 14,
+ 61,194,189, 46, 4,213,139, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,192, 0, 0, 0,152, 53, 1, 3, 0, 0, 0, 0,
- 52, 0, 0, 0, 8, 0, 0, 0, 0, 0,128, 63,255,255,127, 63, 0, 0,128,191,230, 73,230, 73, 26,182,255,127, 1, 0, 0, 0,
- 0, 0,128, 63, 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, 26,182,255,127, 1, 0, 0, 0, 1, 0,128,191,253,255,127,191,
- 0, 0,128,191, 26,182, 26,182, 26,182,255,127, 1, 0, 0, 0,250,255,127,191, 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73,
- 26,182,255,127, 1, 0, 0, 0, 4, 0,128, 63,247,255,127, 63, 0, 0,128, 63,230, 73,230, 73,230, 73,255,127, 1, 0, 0, 0,
-245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182,230, 73,255,127, 1, 0, 0, 0, 3, 0,128,191,250,255,127,191,
- 0, 0,128, 63, 26,182, 26,182,230, 73,255,127, 1, 0, 0, 0,255,255,127,191, 0, 0,128, 63, 0, 0,128, 63, 26,182,230, 73,
-230, 73,255,127, 1, 0, 0, 0, 68, 65, 84, 65,104, 1, 0, 0,168, 54, 1, 3, 0, 0, 0, 0, 80, 1, 0, 0, 5, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 88, 56, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,144, 0, 0, 0, 88, 56, 1, 3, 0, 0, 0, 0, 49, 0, 0, 0, 12, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 4, 0, 0, 0,
- 0, 0, 35, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0,
- 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 6, 0, 0, 0,
- 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65,104, 1, 0, 0, 56, 57, 1, 3, 0, 0, 0, 0,
- 80, 1, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,232, 58, 1, 3, 0, 0, 0, 0, 6, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 84, 92, 10, 0, 0, 0, 0, 6, 0, 0, 0, 64, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,111,108, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 84, 92, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0,232, 58, 1, 3, 0, 0, 0, 0,
- 48, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0,
- 7, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 2, 1, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 6, 0, 0, 0,
- 7, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 2,
- 66, 82, 0, 0,240, 2, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 65,100,100, 0,104, 46,
- 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 72, 64, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,139, 96, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 62,128, 0, 0, 63,107,133, 31, 0, 0, 0, 0, 63, 64, 0, 0, 61,163,215, 10, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 2, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 6, 32,
+ 2,152,254, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,111, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 0, 0, 4,213,139,192, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9230,92 +7912,43 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
- 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 16, 60, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 72, 64, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,216, 65, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 35, 0, 4, 4, 4,
+ 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 62,199,174, 20, 62,199,174, 20, 62,199,174, 20,
+ 62,199,174, 20, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 2,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,139,192, 0, 0, 1, 76, 0, 0, 0, 1,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114, 4,213,141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,216, 65, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 88, 66, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0,168, 59, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,111, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,152, 69, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,141, 0, 0, 0, 1, 74,
+ 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0,
+ 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 6, 32,
+ 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 10, 32, 2,153, 2, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,117,114, 0, 46,
+ 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,141, 96, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
-192, 66, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0,152, 69, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186, 40, 71, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
- 40, 71, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 88, 66, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,108,117,114, 0, 46,
- 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,232, 74, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -9323,1290 +7956,1203 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
- 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 16, 72, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 6,108,
+ 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232, 74, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,120, 76, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16,
+ 4,213,141, 96, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0,
+ 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,126,215, 14, 61,194,189, 54,191,126,215, 14, 61,194,189, 46, 4,213,142,160,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 48, 4,213,142,160, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0,
+ 63,107,133, 31, 0, 0, 0, 0, 63, 64, 0, 0, 61,163,215, 10, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 66, 82, 0, 0, 2,204, 2,153, 10, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 14, 32, 2,153, 6, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 66, 82, 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,143, 0,
+ 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,120, 76, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,248, 76, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0,168, 71, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 66,114,117,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0, 56, 80, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 35, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10,
+ 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0,
+ 0, 0, 0, 33, 0, 0, 0, 0, 63,128, 0, 0, 62,199,174, 20, 62,199,174, 20, 62,199,174, 20, 62,199,174, 20, 63,128, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 10,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,143, 0, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,
+191,127,255,224,186,255, 97,114, 4,213,144, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0,
- 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
- 96, 77, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0, 56, 80, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186,200, 81, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,144, 64, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 14, 32, 0, 0, 1, 80, 0, 0, 0, 1,
+ 2,153, 18, 32, 2,153, 10, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, 97,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 4,213,144,160, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0,
+ 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-200, 81, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
-248, 76, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108, 97,121, 0, 48,
- 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,136, 85, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 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, 0, 0, 0, 35,
+ 8, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 62,199,174, 20, 62,199,174, 20,
+ 62,199,174, 20, 62,199,174, 20, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 14,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,144,160, 0, 0, 1, 76,
+ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114, 4,213,145,224, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,145,224,
+ 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0,
+ 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204,
+ 2,153, 18, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 22, 32, 2,153, 14, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108,
+111,110,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,146, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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, 0,
- 35, 0, 0, 0, 4, 4, 4, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
- 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,176, 82, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,136, 85, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 24, 87, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 24, 87, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,152, 87, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 72, 82, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,108,111,110,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,216, 90, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 35, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102,
+ 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16,
+ 2,153, 18,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0,
+ 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 16, 4,213,146, 64, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,126,215, 14, 61,194,189, 54,191,126,215, 14, 61,194,189, 46,
+ 4,213,147,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 48, 4,213,147,128, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 62,128, 0, 0, 63,107,133, 31, 0, 0, 0, 0, 63, 64, 0, 0, 61,163,215, 10, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 22, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 26, 32, 2,153, 18, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,114,101, 97,115,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 4,213,147,224, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
- 0, 88, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0,216, 90, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
- 14,215,126,191, 46,189,194, 61,104, 92, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 35, 0, 4, 6, 4, 0, 0, 0, 0,
+ 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205,
+ 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 62,199,174, 20, 62,199,174, 20, 62,199,174, 20, 62,199,174, 20,
+ 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 22,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,147,224, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,190,175, 97,228,
+ 63,112,131, 50,191,127,243,218,188,157,183, 10, 4,213,149, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-104, 92, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
- 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
-152, 87, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 67,114,101, 97,115,101,
- 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 40, 96, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,149, 32, 0, 0, 1, 74, 0, 0, 0, 4,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 61, 35,215, 10,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 26, 32, 0, 0, 1, 80,
+ 0, 0, 0, 1, 2,153, 30, 32, 2,153, 22, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68, 97,114,107,101,110, 0, 48, 54, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,149,128, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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, 0,
- 35, 0, 0, 0, 4, 6, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
- 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0, 80, 93, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 40, 96, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,228, 97,175,190, 50,131,112, 63,218,243,127,191, 10,183,157,188,184, 97, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 0, 0, 0, 35, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 26,108, 0, 0, 0, 24,
+ 0, 0, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,149,128,
+ 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0,191,126,215, 14, 61,194,189, 54,191,126,215, 14, 61,194,189, 46, 4,213,150,192, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,184, 97, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215, 35, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 56, 98, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0,232, 92, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68, 97,114,107,101,110, 0, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,120,101, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48,
+ 4,213,150,192, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,107,133, 31,
+ 0, 0, 0, 0, 63, 64, 0, 0, 61,163,215, 10, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82,
+ 0, 0, 2,204, 2,153, 30, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 34, 32, 2,153, 26, 32, 0, 13,160, 0, 0, 0, 0, 0,
+ 66, 82, 68,114, 97,119, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,151, 32, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
-160, 98, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0,120,101, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
- 14,215,126,191, 46,189,194, 61, 8,103, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 35, 8, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75,
+ 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33,
+ 62, 0, 0, 0, 63,128, 0, 0, 62,199,174, 20, 62,199,174, 20, 62,199,174, 20, 62,199,174, 20, 63,128, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 16, 2,153, 30,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 16, 4,213,151, 32, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 3, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,
+186,255, 97,114, 4,213,152, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
- 8,103, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
- 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 56, 98, 1, 3, 0, 0, 0, 0, 5, 0,109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 68,114, 97,119, 0, 46,
- 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,200,106, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,152, 96, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 34, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 38, 32,
+ 2,153, 30, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,105,108,108, 47, 68,101,101,112,101,110, 0, 48, 48, 49, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 0, 0, 4,213,152,192, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0,
- 35, 0, 0, 0, 0, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62,
- 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,240,103, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,200,106, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 88,108, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 88,108, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,216,108, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0,136,103, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,105,108,108, 47, 68,101,101,112,101,110, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0, 24,112, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 35, 0, 4, 4, 4,
+ 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62,199,174, 20, 62,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 34,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,152,192, 0, 0, 1, 76, 0, 0, 0, 1,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114, 4,213,154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,154, 0, 0, 0, 1, 74,
+ 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0,
+ 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 38, 32,
+ 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 42, 32, 2,153, 34, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,108, 97,116,116,101,
+110, 47, 67,111,110,116,114, 97,115,116, 0, 48, 48, 49, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,154, 96, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
- 64,109, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0, 24,112, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186,168,113, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-168,113, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
-216,108, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 70,108, 97,116,116,101,
-110, 47, 67,111,110,116,114, 97,115,116, 0, 48, 48, 49, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104,117, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 35, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 62,199,174, 20, 62,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 38,108,
+ 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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, 0,
- 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62,
- 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,144,114, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,104,117, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,248,118, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16,
+ 4,213,154, 96, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0,
+ 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114, 4,213,155,160,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,118, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,120,119, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 40,114, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 71,114, 97, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,184,122, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 48, 4,213,155,160, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0,
+ 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 66, 82, 0, 0, 2,204, 2,153, 42, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 46, 32, 2,153, 38, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 66, 82, 71,114, 97, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,156, 0,
+ 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
- 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
-224,119, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0,184,122, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186, 72,124, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,
+ 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0,
+ 0, 0, 0, 33, 62, 0, 0, 0, 62,128, 0, 0, 63,128, 0, 0, 62,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 42,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,156, 0, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,
+191,127,255,224,186,255, 97,114, 4,213,157, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
- 72,124, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
-120,119, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 73,110,102,108, 97,116,
-101, 47, 68,101,102,108, 97,116,101, 0, 48, 48, 49, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 8,128, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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, 0,
- 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62,
- 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 16, 1, 0, 0, 48,125, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 8,128, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,152,129, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,157, 64, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 46, 32, 0, 0, 1, 80, 0, 0, 0, 1,
+ 2,153, 50, 32, 2,153, 42, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 73,110,102,108, 97,116,101, 47, 68,101,102,108, 97,116,
+101, 0, 48, 48, 49, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 4,213,157,160, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0,
+ 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 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, 0, 0, 0, 35,
+ 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63, 64, 0, 0, 63, 64, 0, 0, 63, 64, 0, 0,
+ 62,128, 0, 0, 62,128, 0, 0, 62,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 46,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,157,160, 0, 0, 1, 76,
+ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114, 4,213,158,224, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,152,129, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 24,130, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0,200,124, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76, 97,121,101,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0, 88,133, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,158,224,
+ 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0,
+ 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204,
+ 2,153, 50, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 54, 32, 2,153, 46, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76, 97,
+121,101,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,159, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
-128,130, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0, 88,133, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186,232,134, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 35, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102,
+ 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0,
+ 63,128, 0, 0, 62,199,174, 20, 62,199,174, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16,
+ 2,153, 50,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0,
+ 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 16, 4,213,159, 64, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114,
+ 4,213,160,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 48, 4,213,160,128, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 54, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 58, 32, 2,153, 50, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76,105,103,104,116,101,110, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 4,213,160,224, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-232,134, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 24,130, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 76,105,103,104,116,101,
-110, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,168,138, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 4, 4, 0, 0, 0, 0,
+ 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205,
+ 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 54,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,160,224, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,126,215, 14,
+ 61,194,189, 54,191,126,215, 14, 61,194,189, 46, 4,213,162, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
- 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,208,135, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,168,138, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61, 56,140, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,162, 32, 0, 0, 1, 74, 0, 0, 0, 4,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,107,133, 31, 0, 0, 0, 0, 63, 64, 0, 0, 61,163,215, 10,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 58, 32, 0, 0, 1, 80,
+ 0, 0, 0, 1, 2,153, 62, 32, 2,153, 54, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,105,120, 0,104, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,162,128, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 56,140, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,184,140, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0,104,135, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,105,120, 0,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,248,143, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
+ 0, 0, 0, 35, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63, 51, 51, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 58,108, 0, 0, 0, 24,
+ 0, 0, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,162,128,
+ 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0,191,126,215, 14, 61,194,189, 54,191,126,215, 14, 61,194,189, 46, 4,213,163,192, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
- 32,141, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48,
+ 4,213,163,192, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,107,133, 31,
+ 0, 0, 0, 0, 63, 64, 0, 0, 61,163,215, 10, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82,
+ 0, 0, 2,204, 2,153, 62, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 66, 32, 2,153, 58, 32, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 77,117,108,116,105,112,108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,164, 32, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0,248,143, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
- 14,215,126,191, 46,189,194, 61,136,145, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-136,145, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
- 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
-184,140, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 77,117,108,116,105,112,
-108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 72,149, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75,
+ 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33,
+ 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 16, 2,153, 62,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 16, 4,213,164, 32, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,126,215, 14, 61,194,189, 54,191,126,215, 14,
+ 61,194,189, 46, 4,213,165, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
- 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,112,146, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,165, 96, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 62,128, 0, 0, 63,107,133, 31, 0, 0, 0, 0, 63, 64, 0, 0, 61,163,215, 10, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 66, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 70, 32,
+ 2,153, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 78,117,100,103,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 0, 0, 4,213,165,192, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 72,149, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,216,150, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,216,150, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 88,151, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 8,146, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 78,117,100,103,101, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,152,154, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 35, 0, 4, 4, 4,
+ 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 62,128, 0, 0, 63,128, 0, 0, 62,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 66,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,165,192, 0, 0, 1, 76, 0, 0, 0, 1,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114, 4,213,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,167, 0, 0, 0, 1, 74,
+ 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0,
+ 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 70, 32,
+ 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 74, 32, 2,153, 66, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,105,110, 99,104, 47,
+ 77, 97,103,110,105,102,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,167, 96, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
-192,151, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0,152,154, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186, 40,156, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
- 40,156, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 88,151, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,105,110, 99,104, 47,
- 77, 97,103,110,105,102,121, 0, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,232,159, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 6, 0, 0, 0, 35, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63, 64, 0, 0,
+ 63, 64, 0, 0, 63, 64, 0, 0, 62,128, 0, 0, 62,128, 0, 0, 62,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 70,108,
+ 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0,
- 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0,128, 62,
- 0, 0,128, 62, 0, 0,128, 62, 68, 65, 84, 65, 16, 1, 0, 0, 16,157, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,232,159, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,120,161, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,120,161, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,248,161, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0,168,156, 1, 3, 0, 0, 0, 0, 65,119, 13, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 80,111,108,105,115,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0, 56,165, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16,
+ 4,213,167, 96, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0,
+ 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114, 4,213,168,160,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 48, 4,213,168,160, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0,
+ 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 66, 82, 0, 0, 2,204, 2,153, 74, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 78, 32, 2,153, 70, 32, 0, 1,174,232,
+ 0, 0, 0, 0, 66, 82, 80,111,108,105,115,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,169, 0,
+ 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 35, 0, 0, 0, 4, 4, 4, 1, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 7, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
- 96,162, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0, 56,165, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186,200,166, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-200,166, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
-248,161, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,114, 97,112,101,
- 47, 80,101, 97,107,115, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,136,170, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 35, 1, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10,
+ 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0,
+ 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62,199,174, 20, 62,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 74,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,169, 0, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,
+191,127,255,224,186,255, 97,114, 4,213,170, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,170, 64, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 78, 32, 0, 0, 1, 80, 0, 0, 0, 1,
+ 2,153, 82, 32, 2,153, 74, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,114, 97,112,101, 47, 80,101, 97,107,115, 0, 48,
+ 48, 49, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 4,213,170,160, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0,
+ 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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, 0,
- 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 0, 0,128, 62,
- 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,176,167, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,136,170, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 24,172, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 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, 0, 0, 0, 35,
+ 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62,199,174, 20,
+ 62,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 78,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,170,160, 0, 0, 1, 76,
+ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114, 4,213,171,224, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 24,172, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,152,172, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 72,167, 1, 3, 0, 0, 0, 0, 52,195, 13, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83, 99,117,108,112,116, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,216,175, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,171,224,
+ 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0,
+ 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204,
+ 2,153, 82, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 86, 32, 2,153, 78, 32, 0, 1,184,102, 0, 0, 0, 0, 66, 82, 83, 99,
+117,108,112,116, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,172, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 35, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0,160,119, 78, 63,
- 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
- 0,173, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0,216,175, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186,104,177, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 35, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102,
+ 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 63, 78,119,160,
+ 63,128, 0, 0, 62,199,174, 20, 62,199,174, 20, 62,199,174, 20, 62,199,174, 20, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16,
+ 2,153, 82,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0,
+ 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 16, 4,213,172, 64, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114,
+ 4,213,173,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 48, 4,213,173,128, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 86, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 90, 32, 2,153, 82, 32,
+ 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,101, 97,114, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 4,213,173,224, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-104,177, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
-152,172, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,101, 97,114, 0,
- 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 40,181, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 35, 0, 0, 4, 4, 0, 0, 0, 0,
+ 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205,
+ 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 86,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,173,224, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1,
+ 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,126,215, 14,
+ 61,194,189, 54,191,126,215, 14, 61,194,189, 46, 4,213,175, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0,
- 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 80,178, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 40,181, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,184,182, 1, 3, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,175, 32, 0, 0, 1, 74, 0, 0, 0, 4,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,107,133, 31, 0, 0, 0, 0, 63, 64, 0, 0, 61,163,215, 10,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 90, 32, 0, 0, 1, 80,
+ 0, 0, 0, 1, 2,153, 94, 32, 2,153, 86, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,111,111,116,104, 0, 48, 48, 49,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,175,128, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,184,182, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 56,183, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0,232,177, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,109,111,111,116,104, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,120,186, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 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,
+ 0, 0, 0, 35, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63, 64, 0, 0, 63, 64, 0, 0,
+ 63, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 90,108, 0, 0, 0, 24,
+ 0, 0, 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, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,175,128,
+ 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114, 4,213,176,192, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
-160,183, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48,
+ 4,213,176,192, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215,
+ 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82,
+ 0, 0, 2,204, 2,153, 94, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153, 98, 32, 2,153, 90, 32, 0, 0, 0, 0, 0, 0, 0, 0,
+ 66, 82, 83,110, 97,107,101, 32, 72,111,111,107, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,177, 32, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0,120,186, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186, 8,188, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
- 8,188, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 56,183, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,110, 97,107,101, 32,
- 72,111,111,107, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,200,191, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75,
+ 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33,
+ 62, 0, 0, 0, 62,128, 0, 0, 63,128, 0, 0, 62,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 16, 2,153, 94,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 16, 4,213,177, 32, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2,
+ 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,
+186,255, 97,114, 4,213,178, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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, 0,
- 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,240,188, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,178, 96, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153, 98, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153,102, 32,
+ 2,153, 94, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,111,102,116,101,110, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 0, 0, 4,213,178,192, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,200,191, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186, 88,193, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 88,193, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,216,193, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0,136,188, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,111,102,116,101,110, 0, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0, 24,197, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 35, 0, 0, 4, 4,
+ 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 62, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153, 98,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,178,192, 0, 0, 1, 76, 0, 0, 0, 1,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+191,126,215, 14, 61,194,189, 54,191,126,215, 14, 61,194,189, 46, 4,213,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,180, 0, 0, 0, 1, 74,
+ 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,107,133, 31, 0, 0, 0, 0, 63, 64, 0, 0,
+ 61,163,215, 10, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153,102, 32,
+ 0, 0, 1, 80, 0, 0, 0, 1, 2,153,106, 32, 2,153, 98, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,117, 98,116,114, 97,
+ 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,180, 96, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
- 64,194, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0, 24,197, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61,
- 14,215,126,191, 46,189,194, 61,168,198, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-168,198, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
- 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
-216,193, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 83,117, 98,116,114, 97,
- 99,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0,104,202, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153,102,108,
+ 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0,
+ 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16,
+ 4,213,180, 96, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0,
+ 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,126,215, 14, 61,194,189, 54,191,126,215, 14, 61,194,189, 46, 4,213,181,160,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0,
- 35, 0, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,144,199, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0,104,202, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63, 14,215,126,191, 54,189,194, 61, 14,215,126,191, 46,189,194, 61,248,203, 1, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 48, 4,213,181,160, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0,
+ 63,107,133, 31, 0, 0, 0, 0, 63, 64, 0, 0, 61,163,215, 10, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 66, 82, 0, 0, 2,204, 2,153,106, 32, 0, 0, 1, 80, 0, 0, 0, 1, 2,153,110, 32, 2,153,102, 32, 0, 0, 0, 0,
+ 0, 0, 0, 0, 66, 82, 84,101,120, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,182, 0,
+ 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,248,203, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62, 31,133,107, 63, 0, 0, 0, 0, 0, 0, 64, 63, 10,215,163, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0,120,204, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 40,199, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,101,120, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0,184,207, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 35, 8, 0, 4, 4, 0, 0, 0, 0, 0, 0, 0, 10,
+ 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 51, 51, 51, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0,
+ 0, 0, 0, 33, 62, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62,199,174, 20, 62,199,174, 20, 63,128, 0, 0,
+ 68, 65, 84, 65, 0, 0, 1, 16, 2,153,106,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,182, 0, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,
+191,127,255,224,186,255, 97,114, 4,213,183, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,183, 64, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204, 2,153,110, 32, 0, 0, 1, 80, 0, 0, 0, 1,
+ 2,153,114, 32, 2,153,106, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,104,117,109, 98, 0, 48, 48, 49, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 4,213,183,160, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0,
+ 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 35, 0, 0, 0, 4, 4, 0, 8, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51, 51, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 20,174,199, 62, 20,174,199, 62, 0, 0,128, 63, 68, 65, 84, 65, 16, 1, 0, 0,
-224,204, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0,184,207, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186, 72,209, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 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, 0, 0, 0, 75,
+ 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102, 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0, 62,128, 0, 0, 63,128, 0, 0, 62,128, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 2,153,110,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16, 4,213,183,160, 0, 0, 1, 76,
+ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0,
+ 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114, 4,213,184,224, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
- 72,209, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 66, 82, 0, 0,240, 2, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 79, 1, 0, 0, 1, 0, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
-120,204, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,104,117,109, 98, 0,
- 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 8,213, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 48, 4,213,184,224,
+ 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0,
+ 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0, 2,204,
+ 2,153,114, 32, 0, 0, 1, 80, 0, 0, 0, 1, 0, 0, 0, 0, 2,153,110, 32, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,119,
+105,115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 4,213,185, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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, 0,
- 75, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62, 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0, 48,210, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0,
- 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 68, 65, 84, 65, 64, 1, 0, 0, 8,213, 1, 3, 0, 0, 0, 0,
- 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67,
- 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,224,255,127,191,114, 97,255,186,152,214, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 75, 63,102,102,102,
+ 61,204,204,205, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,204,204,205, 0, 0, 0, 0, 0, 0, 0, 33, 62, 0, 0, 0,
+ 62,128, 0, 0, 63,128, 0, 0, 62,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 16,
+ 2,153,114,108, 0, 0, 0, 24, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0,128, 0, 0,
+ 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 68, 65, 84, 65,
+ 0, 0, 1, 16, 4,213,185, 64, 0, 0, 1, 76, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 0, 4, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,191,127,255,224,186,255, 95, 46,191,127,255,224,186,255, 97,114,
+ 4,213,186,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,152,214, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 0, 0,240, 2, 0, 0, 24,215, 1, 3, 0, 0, 0, 0,
- 79, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200,209, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 66, 82, 84,119,105,115,116, 0, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 0, 88,218, 1, 3, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 75, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0,
- 75, 0, 0, 0,102,102,102, 63,205,204,204, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 62,
- 0, 0,128, 62, 0, 0,128, 63, 0, 0,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 1, 0, 0,
-128,215, 1, 3, 0, 0, 0, 0, 24, 0, 0, 0, 1, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
-205,204, 76, 62, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 68, 65, 84, 65, 64, 1, 0, 0, 88,218, 1, 3, 0, 0, 0, 0, 75, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,
- 0, 0, 0, 0, 0, 0,128, 63, 4, 0, 0, 0, 0, 0,128, 67, 0, 0, 0, 0, 0, 0,128, 63,224,255,127,191, 46, 95,255,186,
-224,255,127,191,114, 97,255,186,232,219, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,
-232,219, 1, 3, 0, 0, 0, 0, 73, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 62,
-215,163,112, 63, 0, 0, 0, 0, 0, 0, 64, 63,143,194,117, 61, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
- 85, 83, 69, 82,112, 13, 0, 0, 32,163,141, 1, 0, 0, 0, 0,189, 0, 0, 0, 1, 0, 0, 0, 33, 8, 17, 1, 63, 2, 0, 0,
- 5, 0, 0, 0, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 0, 48, 4,213,186,128, 0, 0, 1, 74, 0, 0, 0, 4, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 62,128, 0, 0, 63,112,163,215, 0, 0, 0, 0, 63, 64, 0, 0, 61,117,194,143, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 85, 83, 69, 82, 0, 0, 13, 72, 1, 86,143, 0, 0, 0, 0,189, 0, 0, 0, 1, 1, 17, 8, 33, 0, 0, 6, 63,
+ 0, 0, 0, 5, 47,116,109,112, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -10661,21 +9207,20 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 35, 0, 0, 0, 2, 0, 94, 1, 8, 0, 0, 0, 3, 0, 0, 0, 56, 52, 39, 1, 0, 0, 0, 0,
- 6, 0, 2, 0, 0, 8, 0, 0, 2, 0, 0, 0, 68,172, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0,128, 0, 0, 0, 72, 0, 0, 0,
- 0, 0, 64, 0, 5, 0, 2, 0, 40,234, 1, 3, 0, 0, 0, 0, 40,234, 1, 3, 0, 0, 0, 0,184, 74, 14, 3, 0, 0, 0, 0,
-184, 74, 14, 3, 0, 0, 0, 0, 56,198, 14, 3, 0, 0, 0, 0, 56,198, 14, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,232, 62, 1, 3, 0, 0, 0, 0,232, 52,219, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 35, 0, 0, 0, 2, 1, 94, 0, 0, 0, 8, 0, 0, 0, 3, 0, 39, 52, 56, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0,172, 68, 0, 0, 0, 36, 0, 0, 0, 2, 0, 0, 0,128, 0, 0, 0, 72,
+ 0, 0, 0, 64, 0, 5, 0, 2, 2,153,132, 32, 2,153,132, 32, 4,218,198,160, 4,218,198,160, 4,218,203, 80, 4,218,203, 80,
+ 0, 0, 0, 0, 0, 0, 0, 0, 4,213,136,224, 4,213,189,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 2, 0, 25, 0, 1, 0, 20, 0, 20,
+ 0, 0, 0, 1, 0, 0, 0, 0, 63, 76,204,205, 63, 76,204,205, 63, 76,204,205, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 63,128, 0, 0,191,100, 90, 30, 62,153,153,154, 63,102,102,102, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
+ 62,254,250, 31, 63, 0, 0, 9, 63, 25,153,156, 0, 0, 0, 0, 62, 76,204,205, 62, 76,204,205, 62, 76,204,205, 63,128, 0, 0,
+ 63, 22,135, 44, 62,235,133, 32, 62,125,243,184, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 63, 76, 73,195, 63, 86,135, 42,
+ 63,128, 0, 0, 0, 0, 0, 0, 61,135, 43, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 62, 93, 47, 16,190,200,180, 58,
+190, 93, 47, 24, 0, 0, 0, 0, 0, 14, 0, 0, 0, 25, 0, 15, 0,120, 0, 60, 0, 3, 0, 5, 0, 0, 0,128, 0, 0, 0, 0,
+ 31,144, 0, 15, 0, 6, 0, 25, 0, 8, 0, 10, 0,200, 0, 0, 0,100, 0,100, 0, 0, 0, 0, 0, 2, 0, 1, 0, 10, 0, 50,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 2, 0,
- 25, 0, 1, 0, 20, 0, 20, 0, 1, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63,205,204, 76, 63,205,204, 76, 63, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 30, 90,100,191,154,153,153, 62,102,102,102, 63, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0, 31,250,254, 62, 9, 0, 0, 63,156,153, 25, 63, 0, 0, 0, 0,205,204, 76, 62,205,204, 76, 62,
-205,204, 76, 62, 0, 0,128, 63, 44,135, 22, 63, 32,133,235, 62,184,243,125, 62, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
-195, 73, 76, 63, 42,135, 86, 63, 0, 0,128, 63, 0, 0, 0, 0, 1, 43,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
- 16, 47, 93, 62, 58,180,200,190, 24, 47, 93,190, 0, 0, 0, 0, 14, 0, 0, 0, 25, 0, 15, 0,120, 0, 60, 0, 3, 0, 5, 0,
-128, 0, 0, 0, 0, 0, 0, 0,144, 31, 15, 0, 6, 0, 25, 0, 8, 0, 10, 0,200, 0, 0, 0,100, 0,100, 0, 0, 0, 0, 0,
- 2, 0, 1, 0, 10, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -10685,796 +9230,799 @@ char datatoc_startup_blend[]= {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 2, 0, 2, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
- 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,
- 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 30, 0, 0, 40,234, 1, 3, 0, 0, 0, 0,186, 0, 0, 0, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255,
- 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255,
- 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255,153,153,153,255, 90, 90, 90,255,
- 0, 0, 0,255,255,255,255,255, 1, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 86,128,194,255,255,255,255,255,
-255,255,255,255, 0, 0, 0,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,
- 0, 0, 0,255,255,255,255,255, 1, 0, 15, 0,241,255, 0, 0, 25, 25, 25,255,153,153,153,255,100,100,100,255, 25, 25, 25,255,
- 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255, 90, 90, 90,255,
- 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 25, 25, 25,255,180,180,180,255,153,153,153,255,128,128,128,255,
- 0, 0, 0,255,255,255,255,255, 1, 0,236,255, 0, 0, 0, 0, 0, 0, 0,255, 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,
-255,255,255,255,204,204,204,255, 1, 0, 15, 0,241,255, 0, 0, 0, 0, 0,255, 63, 63, 63,255, 86,128,194,255,255,255,255,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 25, 25, 25,230, 45, 45, 45,230,100,100,100,255,
-160,160,160,255,255,255,255,255, 0, 0, 25, 0,236,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255,255,255,255,255,
-255,255,255,255, 0, 0, 0,255, 0, 0, 38, 0, 0, 0, 0, 0, 25, 25, 25,255,128,128,128,255,100,100,100,255, 25, 25, 25,255,
- 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50,180, 80, 80, 80,180,100,100,100,180,128,128,128,255,
- 0, 0, 0,255,255,255,255,255, 1, 0, 5, 0,251,255, 0, 0, 0, 0, 0,255,190,190,190,255,100,100,100,180, 68, 68, 68,255,
- 0, 0, 0,255,255,255,255,255, 0, 0, 5, 0,251,255, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 86,128,194,255, 0, 0, 0,255,
- 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,115,190, 76,255, 90,166, 51,255,240,235,100,255,215,211, 75,255,
-180, 0,255,255,153, 0,230,255, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-130,130,130,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
- 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
-255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,204, 0,153,255, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
- 32, 0, 0,255, 0, 32, 0,255, 0, 0,128,255, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
-255,255,255,255, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
-240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76,255, 0, 0, 0, 0,250,250,250,255, 15, 15, 15,255,
-114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-160,160,160,100,127,112,112,100,255,140, 25,255,250,250,250,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,130,130,130,255,
- 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,250,250,255,250,250,250,255,250,250,250,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100,
- 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,
-128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
-128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
- 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
-255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
- 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
-240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,
-114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255,
- 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,
-124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100,
- 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255,144,144, 0,255,
-128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
-128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-116,116,116,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
- 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
-255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 81,105,135,255,109, 88,129,255, 78,152, 62,255, 46,143,143,255,169, 84,124,255,126,126, 80,255,162, 95,111,255,109,145,131,255,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0,255,255,255, 10,255,133, 0, 60,255,133, 0,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
- 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
-240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255,110,110,110,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,
-114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,132,132,132,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
- 94, 94, 94,255,172,172,172,255, 17, 27, 60,100, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,195,195,195,255,
- 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,143,143,143,255,198,119,119,255,
-255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,
-128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
-128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,100, 0, 0,255, 0, 0,200,255,128, 0, 80,255,
- 95, 95, 0,255, 0,100, 50,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
- 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
-255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0, 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
- 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
-240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,
-114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255,
- 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,255,255,255,219, 37, 18,255,
-255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,
-144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0,155,155,155,160,
-100,100,100,255,108,105,111,255,104,106,117,255,105,117,110,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,
- 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,
-255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,
- 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,
-128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,
-128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,
-165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255,
- 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,
-255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,
-255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,
-200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,
-240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,
-240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0,
- 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255,
- 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255,
- 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,
-255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80,
- 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255,
- 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,
-240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 96,128,255,255,255,255,255,255, 0,170, 0,255,220, 96, 96,255,220, 96, 96,255,
- 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 0, 0,255,189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0,
-247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, 30,145, 9,255, 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0,
- 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0,169, 41, 78,255,193, 65,106,255,240, 93,145,255, 0, 0, 0, 0,
- 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, 36,120, 90,255, 60,149,121,255,111,182,171,255, 0, 0, 0, 0,
- 75,112,124,255,106,134,145,255,155,194,205,255, 0, 0, 0, 0,244,201, 12,255,238,194, 54,255,243,255, 0,255, 0, 0, 0, 0,
- 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0,111, 47,106,255,152, 69,190,255,211, 48,214,255, 0, 0, 0, 0,
-108,142, 34,255,127,176, 34,255,187,239, 91,255, 0, 0, 0, 0,141,141,141,255,176,176,176,255,222,222,222,255, 0, 0, 0, 0,
-131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, 8, 49, 14,255, 28, 67, 11,255, 52, 98, 43,255, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 80, 0, 0, 0,
-232, 62, 1, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,136, 63, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
+ 63,128, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
+ 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
+ 63, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0,
+ 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 0, 0, 30, 80, 2,153,132, 32, 0, 0, 0,186, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68,101,102, 97,
+117,108,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,
+153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,
+153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 1, 0, 15,255,241, 0, 0, 25, 25, 25,255,
+153,153,153,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 0, 1, 0, 0, 0, 25, 0, 0, 0, 0, 0,255,
+ 70, 70, 70,255, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 1, 0, 15,255,241, 0, 0, 0, 0, 0,255,
+ 70, 70, 70,255, 70, 70, 70,255,255,255,255,255, 0, 0, 0,255,255,255,255,255, 0, 1, 0, 15,255,241, 0, 0, 25, 25, 25,255,
+153,153,153,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 25,255,
+180,180,180,255,153,153,153,255, 90, 90, 90,255, 0, 0, 0,255,255,255,255,255, 0, 1,255,236, 0, 0, 0, 0, 25, 25, 25,255,
+180,180,180,255,153,153,153,255,128,128,128,255, 0, 0, 0,255,255,255,255,255, 0, 1,255,236, 0, 0, 0, 0, 0, 0, 0,255,
+ 70, 70, 70,255, 70, 70, 70,255,255,255,255,255,255,255,255,255,204,204,204,255, 0, 1, 0, 15,255,241, 0, 0, 0, 0, 0,255,
+ 63, 63, 63,255, 86,128,194,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 25,255,236, 0, 0, 0, 0, 0,255,
+ 25, 25, 25,230, 45, 45, 45,230,100,100,100,255,160,160,160,255,255,255,255,255, 0, 0, 0, 25,255,236, 0, 0, 0, 0, 0,255,
+ 0, 0, 0, 0, 86,128,194,255,255,255,255,255,255,255,255,255, 0, 0, 0,255, 0, 0, 0, 38, 0, 0, 0, 0, 25, 25, 25,255,
+128,128,128,255,100,100,100,255, 25, 25, 25,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 50, 50, 50,180,
+ 80, 80, 80,180,100,100,100,180,128,128,128,255, 0, 0, 0,255,255,255,255,255, 0, 1, 0, 5,255,251, 0, 0, 0, 0, 0,255,
+190,190,190,255,100,100,100,180, 68, 68, 68,255, 0, 0, 0,255,255,255,255,255, 0, 0, 0, 5,255,251, 0, 0, 0, 0, 0,255,
+ 0, 0, 0, 0, 86,128,194,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0,115,190, 76,255,
+ 90,166, 51,255,240,235,100,255,215,211, 75,255,180, 0,255,255,153, 0,230,255, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,130,130,130,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255,
+ 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255,
+ 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
+144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255,
+ 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 57, 57, 57,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,
+ 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255,
+ 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255,204, 0,153,255,
+ 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 32, 0, 0,255, 0, 32, 0,255, 0, 0,128,255, 0, 0, 0, 0, 34,221,221,255,
+ 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,
+219, 37, 18,255,240,255, 64,255,240,144,160,255,255,255,255,255, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255,
+ 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 76, 76,255,
+ 0, 0, 0, 0,250,250,250,255, 15, 15, 15,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,145,145,145,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100,255,140, 25,255,250,250,250,255, 0, 0, 0,255,
+241, 88, 0,255, 0, 0, 0, 40,130,130,130,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255,
+ 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,
+255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255,
+ 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,
+240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255,
+ 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,250,250,255,
+250,250,250,255,250,250,250,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,
+255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,
+255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,
+219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0,
+ 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0,
+ 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255,
+ 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255,
+ 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255,
+ 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
+144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255,
+ 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0,
+ 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255,
+ 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0,
+ 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255,
+ 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,
+219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255,
+ 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255,
+ 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,
+241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255,
+ 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,
+255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255,
+ 80,200,255, 80, 12, 10, 10,128,255,140, 0,255, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,
+240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255,
+ 64,192, 48,255,240,144,160,255, 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128,
+ 0, 0, 0,255,255,133, 0,255, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,107,107,107,255, 0, 0, 0, 0, 0, 0, 0,255,
+255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,102,102,102,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,255,255,255,150, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,150,150,150,100,112,112,112,100, 96,192, 64,255, 94, 94, 94,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,
+255,140, 25,255, 79,101, 73,255,135,177,125,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,
+219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 12, 10, 10,128,
+255,140, 0,255, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0,
+ 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255,
+ 82, 96,110,255,124,137,150,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0,255,255,133, 0,255,
+ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116,116,116,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255,
+ 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255,
+ 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
+144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255,
+ 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81,105,135,255,109, 88,129,255, 78,152, 62,255, 46,143,143,255,169, 84,124,255,
+126,126, 80,255,162, 95,111,255,109,145,131,255,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 53, 53, 53,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,
+ 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255,
+ 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0,
+255,255,255, 10,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255,
+ 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,
+219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255,
+ 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255,110,110,110,255,
+ 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,132,132,132,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255, 94, 94, 94,255,172,172,172,255, 17, 27, 60,100, 94, 94, 94,255, 0, 0, 0,255,
+241, 88, 0,255, 0, 0, 0, 40,195,195,195,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255,
+ 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,
+255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255,
+ 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,
+240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255,
+ 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,153,153,153,255, 0, 0, 0, 0, 0, 0, 0,255,
+255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,143,143,143,255,198,119,119,255,255, 0, 0,255, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,
+255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,
+219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0,
+ 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0,
+ 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0,
+100, 0, 0,255, 0, 0,200,255,128, 0, 80,255, 95, 95, 0,255, 0,100, 50,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255,
+ 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255,
+ 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
+144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255,
+ 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,173,173,173,255,127,112,112,100, 0, 0, 0, 0,
+ 91, 91, 91,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255,
+ 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0,
+ 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255,
+ 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,
+219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255,
+ 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 57, 57,255,
+ 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,
+241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255,
+ 0, 0, 0,255,255,255,255,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,
+255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255,
+ 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,
+240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255,
+ 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 4, 0,155,155,155,160,100,100,100,255,111,106,100,255,104,106,117,255,105,117,110,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,100,100,100,255, 0, 0, 0, 0, 0, 0, 0,255,
+255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,
+255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,
+219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0,
+ 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0,
+ 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,114,114,114,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255,
+ 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,
+127,112,112,100, 0, 0, 0, 0, 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255,
+ 85,187, 85,255,255,255,255,255, 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255,
+ 75, 75, 75,255, 0, 0, 0, 0, 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 34,221,221,255, 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,
+144,144, 0,255,128, 48, 96,255,219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255,
+ 64,144, 48,255,128, 48, 96,255, 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,255, 0, 0, 0, 0, 0, 0, 0,255,255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,114,114,114,255, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,165,165,165,255, 0, 0, 0,255, 0, 0, 0,255,
+255,255,255,255,165,165,165,127, 0, 0, 0,255, 0, 0, 0,255,255,255,255,255,160,160,160,100,127,112,112,100, 0, 0, 0, 0,
+ 64, 64, 64,255, 0, 0, 0,255,241, 88, 0,255, 0, 0, 0, 40,255,140, 25,255, 8, 48, 8,255, 85,187, 85,255,255,255,255,255,
+ 0, 0, 0,255,255,133, 0,255, 0, 0, 0,255,255,160, 0,255,219, 37, 18,255,255, 32, 32,255, 75, 75, 75,255, 0, 0, 0, 0,
+ 0, 0, 0, 18,255,133, 0, 60,255,133, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,221,221,255,
+ 35, 97,221,255,200,200,200,255, 80,200,255, 80, 0, 0, 0, 0, 0, 0, 0, 0, 96,192, 64,255,144,144, 0,255,128, 48, 96,255,
+219, 37, 18,255,240,255, 64,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0,255,144,144, 0,255, 64,144, 48,255,128, 48, 96,255,
+ 0, 0, 0,255,240,255, 64,255, 64,192, 48,255,240,144,160,255, 0, 0, 0, 0, 0, 0, 0, 0, 96,128,255,255,255,255,255,255,
+ 0,170, 0,255,220, 96, 96,255,220, 96, 96,255, 3, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,255,255,255,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,154, 0, 0,255,
+189, 17, 17,255,247, 10, 10,255, 0, 0, 0, 0,247, 64, 24,255,246,105, 19,255,250,153, 0,255, 0, 0, 0, 0, 30,145, 9,255,
+ 89,183, 11,255,131,239, 29,255, 0, 0, 0, 0, 10, 54,148,255, 54,103,223,255, 94,193,239,255, 0, 0, 0, 0,169, 41, 78,255,
+193, 65,106,255,240, 93,145,255, 0, 0, 0, 0, 67, 12,120,255, 84, 58,163,255,135,100,213,255, 0, 0, 0, 0, 36,120, 90,255,
+ 60,149,121,255,111,182,171,255, 0, 0, 0, 0, 75,112,124,255,106,134,145,255,155,194,205,255, 0, 0, 0, 0,244,201, 12,255,
+238,194, 54,255,243,255, 0,255, 0, 0, 0, 0, 30, 32, 36,255, 72, 76, 86,255,255,255,255,255, 0, 0, 0, 0,111, 47,106,255,
+152, 69,190,255,211, 48,214,255, 0, 0, 0, 0,108,142, 34,255,127,176, 34,255,187,239, 91,255, 0, 0, 0, 0,141,141,141,255,
+176,176,176,255,222,222,222,255, 0, 0, 0, 0,131, 67, 38,255,139, 88, 17,255,189,106, 17,255, 0, 0, 0, 0, 8, 49, 14,255,
+ 28, 67, 11,255, 52, 98, 43,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 72, 4,213,136,224, 0, 0, 0,187, 0, 0, 0, 1, 4,213,137, 80, 0, 0, 0, 0,
105,111, 95,115, 99,101,110,101, 95, 51,100,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 80, 0, 0, 0,136, 63, 1, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,200, 8, 2, 3, 0, 0, 0, 0,
-232, 62, 1, 3, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,102, 98,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,200, 8, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,
-104, 9, 2, 3, 0, 0, 0, 0,136, 63, 1, 3, 0, 0, 0, 0,105,111, 95, 97,110,105,109, 95, 98,118,104, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,104, 9, 2, 3, 0, 0, 0, 0,
-187, 0, 0, 0, 1, 0, 0, 0, 8, 10, 2, 3, 0, 0, 0, 0,200, 8, 2, 3, 0, 0, 0, 0,105,111, 95, 97,110,105,109, 95,
- 99, 97,109,101,114, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,
- 8, 10, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,168, 10, 2, 3, 0, 0, 0, 0,104, 9, 2, 3, 0, 0, 0, 0,
-105,111, 95,109,101,115,104, 95,112,108,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 80, 0, 0, 0,168, 10, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0, 72, 11, 2, 3, 0, 0, 0, 0,
- 8, 10, 2, 3, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,111, 98,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 72, 11, 2, 3, 0, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0,
-232, 52,219, 4, 0, 0, 0, 0,168, 10, 2, 3, 0, 0, 0, 0,105,111, 95,115, 99,101,110,101, 95,120, 51,100, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0,232, 52,219, 4, 0, 0, 0, 0,
-187, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72, 11, 2, 3, 0, 0, 0, 0,105,111, 95,109,101,115,104, 95,
-115,116,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 78, 65, 49,120,227, 0, 0,
-168,160,120, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69,228, 11, 0, 0, 42,110,101,120,
-116, 0, 42,112,114,101,118, 0, 42,100, 97,116, 97, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,120,
-109,105,110, 0,120,109, 97,120, 0,121,109,105,110, 0,121,109, 97,120, 0, 42,112,111,105,110,116,101,114, 0,103,114,111,117,
-112, 0,118, 97,108, 0,118, 97,108, 50, 0,116,121,112,101, 0,115,117, 98,116,121,112,101, 0,102,108, 97,103, 0,110, 97,109,
-101, 91, 51, 50, 93, 0,115, 97,118,101,100, 0,100, 97,116, 97, 0,108,101,110, 0,116,111,116, 97,108,108,101,110, 0, 42,110,
-101,119,105,100, 0, 42,108,105, 98, 0,110, 97,109,101, 91, 50, 52, 93, 0,117,115, 0,105, 99,111,110, 95,105,100, 0, 42,112,
-114,111,112,101,114,116,105,101,115, 0,105,100, 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,105,108,101,100, 97,116, 97, 0,
-110, 97,109,101, 91, 50, 52, 48, 93, 0,102,105,108,101,112, 97,116,104, 91, 50, 52, 48, 93, 0,116,111,116, 0,112, 97,100, 0,
- 42,112, 97,114,101,110,116, 0,119, 91, 50, 93, 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,100, 91, 50, 93, 0, 99,104, 97,
-110,103,101,100, 95,116,105,109,101,115,116, 97,109,112, 91, 50, 93, 0, 42,114,101, 99,116, 91, 50, 93, 0, 42,111, 98, 0, 98,
-108,111, 99,107,116,121,112,101, 0, 97,100,114, 99,111,100,101, 0,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 98,112, 0, 42,
- 98,101,122,116, 0,109, 97,120,114, 99,116, 0,116,111,116,114, 99,116, 0,118, 97,114,116,121,112,101, 0,116,111,116,118,101,
-114,116, 0,105,112,111, 0,101,120,116,114, 97,112, 0,114,116, 0, 98,105,116,109, 97,115,107, 0,115,108,105,100,101, 95,109,
-105,110, 0,115,108,105,100,101, 95,109, 97,120, 0, 99,117,114,118, 97,108, 0, 42,100,114,105,118,101,114, 0, 99,117,114,118,
-101, 0, 99,117,114, 0,115,104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112,111,115, 0,114,101,108, 97,116,105,
-118,101, 0,116,111,116,101,108,101,109, 0,112, 97,100, 50, 0, 42,119,101,105,103,104,116,115, 0,118,103,114,111,117,112, 91,
- 51, 50, 93, 0,115,108,105,100,101,114,109,105,110, 0,115,108,105,100,101,114,109, 97,120, 0, 42, 97,100,116, 0, 42,114,101,
-102,107,101,121, 0,101,108,101,109,115,116,114, 91, 51, 50, 93, 0,101,108,101,109,115,105,122,101, 0, 98,108,111, 99,107, 0,
- 42,105,112,111, 0, 42,102,114,111,109, 0,116,111,116,107,101,121, 0,115,108,117,114,112,104, 0, 42,108,105,110,101, 0, 42,
-102,111,114,109, 97,116, 0, 98,108,101,110, 0,108,105,110,101,110,111, 0,115,116, 97,114,116, 0,101,110,100, 0,112, 97,100,
- 49, 0,102,108, 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,112, 97,100, 91, 52, 93, 0, 42,110, 97,109,101, 0,110,108,
-105,110,101,115, 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0, 42,115,101,108,108, 0, 99,117,114, 99, 0,115,101,108, 99,
- 0,109, 97,114,107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,102, 0,117,110,100,111, 95,112,111,115, 0,117,110,100,111,
- 95,108,101,110, 0, 42, 99,111,109,112,105,108,101,100, 0,109,116,105,109,101, 0,115,105,122,101, 0,115,101,101,107, 0,112,
- 97,115,115,101,112, 97,114,116, 97,108,112,104, 97, 0, 99,108,105,112,115,116, 97, 0, 99,108,105,112,101,110,100, 0,108,101,
-110,115, 0,111,114,116,104,111, 95,115, 99, 97,108,101, 0,100,114, 97,119,115,105,122,101, 0,115,104,105,102,116,120, 0,115,
-104,105,102,116,121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 42,100,111,102, 95,111, 98, 0, 42,115, 99,101,110,101, 0,
-102,114, 97,109,101,110,114, 0,102,114, 97,109,101,115, 0,111,102,102,115,101,116, 0,115,102,114, 97, 0,102,105,101, 95,105,
-109, 97, 0, 99,121, 99,108, 0,111,107, 0,109,117,108,116,105, 95,105,110,100,101,120, 0,108, 97,121,101,114, 0,112, 97,115,
-115, 0,105, 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0, 42, 97,110,105,109, 0, 42,114,114, 0, 42,114,
-101,110,100,101,114,115, 91, 56, 93, 0,114,101,110,100,101,114, 95,115,108,111,116, 0,108, 97,115,116, 95,114,101,110,100,101,
-114, 95,115,108,111,116, 0,115,111,117,114, 99,101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,112, 97,103,101,102,108, 97,
-103, 0,116,111,116, 98,105,110,100, 0,120,114,101,112, 0,121,114,101,112, 0,116,119,115,116, 97, 0,116,119,101,110,100, 0,
- 98,105,110,100, 99,111,100,101, 0, 42,114,101,112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,102,105,108,101, 0, 42,112,
-114,101,118,105,101,119, 0,108, 97,115,116,117,112,100, 97,116,101, 0,108, 97,115,116,117,115,101,100, 0, 97,110,105,109,115,
-112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95,121, 0,103,101,110, 95,116,121,112,101, 0, 97,115,112,120, 0, 97,
-115,112,121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101,103, 0, 98,108,101,110,100,116,121,
-112,101, 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, 51, 50, 93, 0,112,114,111,106,120,
- 0,112,114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102,115, 91, 51, 93, 0,115,105,122,101,
- 91, 51, 93, 0,114,111,116, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,108, 0,112,109, 97,112,116,
-111, 0,112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,104,105, 99,104, 95,111,117,
-116,112,117,116, 0, 98,114,117,115,104, 95,109, 97,112, 95,109,111,100,101, 0,112, 97,100, 91, 55, 93, 0,114, 0,103, 0, 98,
- 0,107, 0,100,101,102, 95,118, 97,114, 0, 99,111,108,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,110,111,114,102, 97, 99, 0,
-100,105,115,112,102, 97, 99, 0,119, 97,114,112,102, 97, 99, 0, 99,111,108,115,112,101, 99,102, 97, 99, 0,109,105,114,114,102,
- 97, 99, 0, 97,108,112,104, 97,102, 97, 99, 0,100,105,102,102,102, 97, 99, 0,115,112,101, 99,102, 97, 99, 0,101,109,105,116,
-102, 97, 99, 0,104, 97,114,100,102, 97, 99, 0,114, 97,121,109,105,114,114,102, 97, 99, 0,116,114, 97,110,115,108,102, 97, 99,
- 0, 97,109, 98,102, 97, 99, 0, 99,111,108,101,109,105,116,102, 97, 99, 0, 99,111,108,114,101,102,108,102, 97, 99, 0, 99,111,
-108,116,114, 97,110,115,102, 97, 99, 0,100,101,110,115,102, 97, 99, 0,115, 99, 97,116,116,101,114,102, 97, 99, 0,114,101,102,
-108,102, 97, 99, 0,116,105,109,101,102, 97, 99, 0,108,101,110,103,116,104,102, 97, 99, 0, 99,108,117,109,112,102, 97, 99, 0,
-107,105,110,107,102, 97, 99, 0,114,111,117,103,104,102, 97, 99, 0,112, 97,100,101,110,115,102, 97, 99, 0,108,105,102,101,102,
- 97, 99, 0,115,105,122,101,102, 97, 99, 0,105,118,101,108,102, 97, 99, 0,112,118,101,108,102, 97, 99, 0,115,104, 97,100,111,
-119,102, 97, 99, 0,122,101,110,117,112,102, 97, 99, 0,122,101,110,100,111,119,110,102, 97, 99, 0, 98,108,101,110,100,102, 97,
- 99, 0,110, 97,109,101, 91, 49, 54, 48, 93, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,101, 0, 42,115,116,110, 97,
-109,101,115, 0,115,116,121,112,101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,114,101,115,117,108,116, 0,
- 42, 99,102,114, 97, 0,100, 97,116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0, 40, 42,105,110,115,116, 97,
-110, 99,101, 95,105,110,105,116, 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41, 0,118,101,114,115,105,111,
-110, 0, 97, 0,105,112,111,116,121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93, 0,105,109, 97,116, 91, 52,
- 93, 91, 52, 93, 0,111, 98,105,109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,105,101,119,115, 99, 97,108,
-101, 0,110,111,116,108, 97,121, 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101, 99, 97,108, 99, 0,108, 97,
-115,116,115,105,122,101, 0,102, 97,108,108,111,102,102, 95,116,121,112,101, 0,102, 97,108,108,111,102,102, 95,115,111,102,116,
-110,101,115,115, 0,114, 97,100,105,117,115, 0, 99,111,108,111,114, 95,115,111,117,114, 99,101, 0,116,111,116,112,111,105,110,
-116,115, 0,112,100,112, 97,100, 0,112,115,121,115, 0,112,115,121,115, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0,111,
- 98, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0, 42,112,111,105,110,116, 95,116,114,101,101, 0, 42,112,111,105,110,116,
- 95,100, 97,116, 97, 0,110,111,105,115,101, 95,115,105,122,101, 0,110,111,105,115,101, 95,100,101,112,116,104, 0,110,111,105,
-115,101, 95,105,110,102,108,117,101,110, 99,101, 0,110,111,105,115,101, 95, 98, 97,115,105,115, 0,112,100,112, 97,100, 51, 91,
- 51, 93, 0,110,111,105,115,101, 95,102, 97, 99, 0,115,112,101,101,100, 95,115, 99, 97,108,101, 0, 42, 99,111, 98, 97, 0,114,
-101,115,111,108, 91, 51, 93, 0,105,110,116,101,114,112, 95,116,121,112,101, 0,102,105,108,101, 95,102,111,114,109, 97,116, 0,
-101,120,116,101,110,100, 0,115,109,111,107,101,100, 95,116,121,112,101, 0,105,110,116, 95,109,117,108,116,105,112,108,105,101,
-114, 0,115,116,105,108,108, 95,102,114, 97,109,101, 0,115,111,117,114, 99,101, 95,112, 97,116,104, 91, 50, 52, 48, 93, 0, 42,
-100, 97,116, 97,115,101,116, 0, 99, 97, 99,104,101,100,102,114, 97,109,101, 0,110,111,105,115,101,115,105,122,101, 0,116,117,
-114, 98,117,108, 0, 98,114,105,103,104,116, 0, 99,111,110,116,114, 97,115,116, 0,115, 97,116,117,114, 97,116,105,111,110, 0,
-114,102, 97, 99, 0,103,102, 97, 99, 0, 98,102, 97, 99, 0,102,105,108,116,101,114,115,105,122,101, 0,109,103, 95, 72, 0,109,
-103, 95,108, 97, 99,117,110, 97,114,105,116,121, 0,109,103, 95,111, 99,116, 97,118,101,115, 0,109,103, 95,111,102,102,115,101,
-116, 0,109,103, 95,103, 97,105,110, 0,100,105,115,116, 95, 97,109,111,117,110,116, 0,110,115, 95,111,117,116,115, 99, 97,108,
-101, 0,118,110, 95,119, 49, 0,118,110, 95,119, 50, 0,118,110, 95,119, 51, 0,118,110, 95,119, 52, 0,118,110, 95,109,101,120,
-112, 0,118,110, 95,100,105,115,116,109, 0,118,110, 95, 99,111,108,116,121,112,101, 0,110,111,105,115,101,100,101,112,116,104,
- 0,110,111,105,115,101,116,121,112,101, 0,110,111,105,115,101, 98, 97,115,105,115, 0,110,111,105,115,101, 98, 97,115,105,115,
- 50, 0,105,109, 97,102,108, 97,103, 0, 99,114,111,112,120,109,105,110, 0, 99,114,111,112,121,109,105,110, 0, 99,114,111,112,
-120,109, 97,120, 0, 99,114,111,112,121,109, 97,120, 0,116,101,120,102,105,108,116,101,114, 0, 97,102,109, 97,120, 0,120,114,
-101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0, 99,104,101, 99,107,101,114,100,105,115,116, 0,110, 97, 98,108, 97, 0,
-105,117,115,101,114, 0, 42,110,111,100,101,116,114,101,101, 0, 42,112,108,117,103,105,110, 0, 42,101,110,118, 0, 42,112,100,
- 0, 42,118,100, 0,117,115,101, 95,110,111,100,101,115, 0,108,111, 99, 91, 51, 93, 0,114,111,116, 91, 51, 93, 0,109, 97,116,
- 91, 52, 93, 91, 52, 93, 0,109,105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0,109,111,100,101, 0,116,111,116,101,120, 0,
-115,104,100,119,114, 0,115,104,100,119,103, 0,115,104,100,119, 98, 0,115,104,100,119,112, 97,100, 0,101,110,101,114,103,121,
- 0,100,105,115,116, 0,115,112,111,116,115,105,122,101, 0,115,112,111,116, 98,108,101,110,100, 0,104, 97,105,110,116, 0, 97,
-116,116, 49, 0, 97,116,116, 50, 0, 42, 99,117,114,102, 97,108,108,111,102,102, 0,115,104, 97,100,115,112,111,116,115,105,122,
-101, 0, 98,105, 97,115, 0,115,111,102,116, 0, 99,111,109,112,114,101,115,115,116,104,114,101,115,104, 0,112, 97,100, 53, 91,
- 51, 93, 0, 98,117,102,115,105,122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114,115, 0,102,105,108,116,101,114,116,121,
-112,101, 0, 98,117,102,102,108, 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, 95,115, 97,109,112, 0,114, 97,121, 95,
-115, 97,109,112,121, 0,114, 97,121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97,109,112, 95,116,121,112,101, 0, 97,114,
-101, 97, 95,115,104, 97,112,101, 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, 97, 95,115,105,122,101,121, 0, 97,114,
-101, 97, 95,115,105,122,101,122, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,114, 97,121, 95,115, 97,109,112, 95,109,
-101,116,104,111,100, 0,116,101,120, 97, 99,116, 0,115,104, 97,100,104, 97,108,111,115,116,101,112, 0,115,117,110, 95,101,102,
-102,101, 99,116, 95,116,121,112,101, 0,115,107,121, 98,108,101,110,100,116,121,112,101, 0,104,111,114,105,122,111,110, 95, 98,
-114,105,103,104,116,110,101,115,115, 0,115,112,114,101, 97,100, 0,115,117,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,
-115,117,110, 95,115,105,122,101, 0, 98, 97, 99,107,115, 99, 97,116,116,101,114,101,100, 95,108,105,103,104,116, 0,115,117,110,
- 95,105,110,116,101,110,115,105,116,121, 0, 97,116,109, 95,116,117,114, 98,105,100,105,116,121, 0, 97,116,109, 95,105,110,115,
- 99, 97,116,116,101,114,105,110,103, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,101,120,116,105,110, 99,116,105,111,110, 95,
-102, 97, 99,116,111,114, 0, 97,116,109, 95,100,105,115,116, 97,110, 99,101, 95,102, 97, 99,116,111,114, 0,115,107,121, 98,108,
-101,110,100,102, 97, 99, 0,115,107,121, 95,101,120,112,111,115,117,114,101, 0,115,107,121, 95, 99,111,108,111,114,115,112, 97,
- 99,101, 0,112, 97,100, 52, 91, 54, 93, 0, 42,109,116,101,120, 91, 49, 56, 93, 0,112,114, 95,116,101,120,116,117,114,101, 0,
-112, 97,100, 54, 91, 54, 93, 0,100,101,110,115,105,116,121, 0,101,109,105,115,115,105,111,110, 0,115, 99, 97,116,116,101,114,
-105,110,103, 0,114,101,102,108,101, 99,116,105,111,110, 0,101,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,116,
-114, 97,110,115,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,114,101,102,108,101, 99,116,105,111,110, 95, 99,111,
-108, 91, 51, 93, 0,100,101,110,115,105,116,121, 95,115, 99, 97,108,101, 0,100,101,112,116,104, 95, 99,117,116,111,102,102, 0,
- 97,115,121,109,109,101,116,114,121, 0,115,116,101,112,115,105,122,101, 95,116,121,112,101, 0,115,104, 97,100,101,102,108, 97,
-103, 0,115,104, 97,100,101, 95,116,121,112,101, 0,112,114,101, 99, 97, 99,104,101, 95,114,101,115,111,108,117,116,105,111,110,
- 0,115,116,101,112,115,105,122,101, 0,109,115, 95,100,105,102,102, 0,109,115, 95,105,110,116,101,110,115,105,116,121, 0,109,
-115, 95,115,112,114,101, 97,100, 0,109, 97,116,101,114,105, 97,108, 95,116,121,112,101, 0,115,112,101, 99,114, 0,115,112,101,
- 99,103, 0,115,112,101, 99, 98, 0,109,105,114,114, 0,109,105,114,103, 0,109,105,114, 98, 0, 97,109, 98,114, 0, 97,109, 98,
- 98, 0, 97,109, 98,103, 0, 97,109, 98, 0,101,109,105,116, 0, 97,110,103, 0,115,112,101, 99,116,114, 97, 0,114, 97,121, 95,
-109,105,114,114,111,114, 0, 97,108,112,104, 97, 0,114,101,102, 0,115,112,101, 99, 0,122,111,102,102,115, 0, 97,100,100, 0,
-116,114, 97,110,115,108,117, 99,101,110, 99,121, 0,118,111,108, 0,102,114,101,115,110,101,108, 95,109,105,114, 0,102,114,101,
-115,110,101,108, 95,109,105,114, 95,105, 0,102,114,101,115,110,101,108, 95,116,114, 97, 0,102,114,101,115,110,101,108, 95,116,
-114, 97, 95,105, 0,102,105,108,116,101,114, 0,116,120, 95,108,105,109,105,116, 0,116,120, 95,102, 97,108,108,111,102,102, 0,
-114, 97,121, 95,100,101,112,116,104, 0,114, 97,121, 95,100,101,112,116,104, 95,116,114, 97, 0,104, 97,114, 0,115,101,101,100,
- 49, 0,115,101,101,100, 50, 0,103,108,111,115,115, 95,109,105,114, 0,103,108,111,115,115, 95,116,114, 97, 0,115, 97,109,112,
- 95,103,108,111,115,115, 95,109,105,114, 0,115, 97,109,112, 95,103,108,111,115,115, 95,116,114, 97, 0, 97,100, 97,112,116, 95,
-116,104,114,101,115,104, 95,109,105,114, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,116,114, 97, 0, 97,110,105,115,
-111, 95,103,108,111,115,115, 95,109,105,114, 0,100,105,115,116, 95,109,105,114, 0,102, 97,100,101,116,111, 95,109,105,114, 0,
-115,104, 97,100,101, 95,102,108, 97,103, 0,109,111,100,101, 95,108, 0,102,108, 97,114,101, 99, 0,115,116, 97,114, 99, 0,108,
-105,110,101, 99, 0,114,105,110,103, 99, 0,104, 97,115,105,122,101, 0,102,108, 97,114,101,115,105,122,101, 0,115,117, 98,115,
-105,122,101, 0,102,108, 97,114,101, 98,111,111,115,116, 0,115,116,114, 97,110,100, 95,115,116, 97, 0,115,116,114, 97,110,100,
- 95,101,110,100, 0,115,116,114, 97,110,100, 95,101, 97,115,101, 0,115,116,114, 97,110,100, 95,115,117,114,102,110,111,114, 0,
-115,116,114, 97,110,100, 95,109,105,110, 0,115,116,114, 97,110,100, 95,119,105,100,116,104,102, 97,100,101, 0,115,116,114, 97,
-110,100, 95,117,118,110, 97,109,101, 91, 51, 50, 93, 0,115, 98,105, 97,115, 0,108, 98,105, 97,115, 0,115,104, 97,100, 95, 97,
-108,112,104, 97, 0,115,101,112,116,101,120, 0,114,103, 98,115,101,108, 0,112,114, 95,116,121,112,101, 0,112,114, 95, 98, 97,
- 99,107, 0,112,114, 95,108, 97,109,112, 0,109,108, 95,102,108, 97,103, 0,100,105,102,102, 95,115,104, 97,100,101,114, 0,115,
-112,101, 99, 95,115,104, 97,100,101,114, 0,114,111,117,103,104,110,101,115,115, 0,114,101,102,114, 97, 99, 0,112, 97,114, 97,
-109, 91, 52, 93, 0,114,109,115, 0,100, 97,114,107,110,101,115,115, 0, 42,114, 97,109,112, 95, 99,111,108, 0, 42,114, 97,109,
-112, 95,115,112,101, 99, 0,114, 97,109,112,105,110, 95, 99,111,108, 0,114, 97,109,112,105,110, 95,115,112,101, 99, 0,114, 97,
-109,112, 98,108,101,110,100, 95, 99,111,108, 0,114, 97,109,112, 98,108,101,110,100, 95,115,112,101, 99, 0,114, 97,109,112, 95,
-115,104,111,119, 0,112, 97,100, 51, 0,114, 97,109,112,102, 97, 99, 95, 99,111,108, 0,114, 97,109,112,102, 97, 99, 95,115,112,
-101, 99, 0, 42,103,114,111,117,112, 0,102,114,105, 99,116,105,111,110, 0,102,104, 0,114,101,102,108,101, 99,116, 0,102,104,
-100,105,115,116, 0,120,121,102,114,105, 99,116, 0,100,121,110, 97,109,111,100,101, 0,115,115,115, 95,114, 97,100,105,117,115,
- 91, 51, 93, 0,115,115,115, 95, 99,111,108, 91, 51, 93, 0,115,115,115, 95,101,114,114,111,114, 0,115,115,115, 95,115, 99, 97,
-108,101, 0,115,115,115, 95,105,111,114, 0,115,115,115, 95, 99,111,108,102, 97, 99, 0,115,115,115, 95,116,101,120,102, 97, 99,
- 0,115,115,115, 95,102,114,111,110,116, 0,115,115,115, 95, 98, 97, 99,107, 0,115,115,115, 95,102,108, 97,103, 0,115,115,115,
- 95,112,114,101,115,101,116, 0,109, 97,112,116,111, 95,116,101,120,116,117,114,101,100, 0,112, 97,100, 52, 0,103,112,117,109,
- 97,116,101,114,105, 97,108, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0, 42, 98, 98, 0,105, 49, 0,106, 49, 0,107, 49, 0,105,
- 50, 0,106, 50, 0,107, 50, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,122, 0,113,117, 97,116, 91, 52,
- 93, 0,101,120,112,120, 0,101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115, 0, 42,109, 97,116,
- 0, 42,105,109, 97,116, 0,101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,115, 0, 42, 42,109,
- 97,116, 0,102,108, 97,103, 50, 0,116,111,116, 99,111,108, 0,119,105,114,101,115,105,122,101, 0,114,101,110,100,101,114,115,
-105,122,101, 0,116,104,114,101,115,104, 0, 42,108, 97,115,116,101,108,101,109, 0,118,101, 99, 91, 51, 93, 91, 51, 93, 0, 97,
-108,102, 97, 0,119,101,105,103,104,116, 0,104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0,104,105,100,101, 0,118,
-101, 99, 91, 52, 93, 0,109, 97,116, 95,110,114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114,101,115,111,108,117, 0,
-114,101,115,111,108,118, 0,111,114,100,101,114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, 0,102,108, 97,103,118,
- 0, 42,107,110,111,116,115,117, 0, 42,107,110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101,114,112, 0,114, 97,100,
-105,117,115, 95,105,110,116,101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,119, 0,104, 0,110,117,114, 98,
-115, 0, 42,107,101,121,105,110,100,101,120, 0,115,104, 97,112,101,110,114, 0,110,117,114, 98, 0, 42,101,100,105,116,110,117,
-114, 98, 0, 42, 98,101,118,111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120,116,111,110, 99,117,114,118,
-101, 0, 42,112, 97,116,104, 0, 42,107,101,121, 0, 98,101,118, 0,100,114, 97,119,102,108, 97,103, 0,116,119,105,115,116, 95,
-109,111,100,101, 0,116,119,105,115,116, 95,115,109,111,111,116,104, 0,115,109, 97,108,108, 99, 97,112,115, 95,115, 99, 97,108,
-101, 0,112, 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120,116, 49, 0,101,120,
-116, 50, 0,114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99,116,110,117, 0, 42,
-108, 97,115,116,115,101,108, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, 0,108,105,110,101,100,105,
-115,116, 0,115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0,117,108,112,111,115, 0,117,
-108,104,101,105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, 0, 42,115,116,114, 0, 42,
-115,101,108, 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, 91, 50, 52, 93, 0, 42,118,
-102,111,110,116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111,110,116, 98,105, 0,115,101,
-112, 99,104, 97,114, 0, 99,116,105,109,101, 0,116,111,116, 98,111,120, 0, 97, 99,116, 98,111,120, 0, 42,116, 98, 0,115,101,
-108,115,116, 97,114,116, 0,115,101,108,101,110,100, 0, 42,115,116,114,105,110,102,111, 0, 99,117,114,105,110,102,111, 0,101,
-102,102,101, 99,116, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, 99,101, 0, 42,116,102, 97, 99,101, 0, 42,109,118,101,
-114,116, 0, 42,109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42,109, 99,111,108, 0, 42,109,115,116,105, 99,107,121, 0,
- 42,116,101,120, 99,111,109,101,115,104, 0, 42,109,115,101,108,101, 99,116, 0, 42,101,100,105,116, 95,109,101,115,104, 0,118,
-100, 97,116, 97, 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,116,111,116,101,100,103,101, 0,116,111,116,102, 97, 99,101,
- 0,116,111,116,115,101,108,101, 99,116, 0, 97, 99,116, 95,102, 97, 99,101, 0,101,100,105,116,102,108, 97,103, 0, 99,117, 98,
-101,109, 97,112,115,105,122,101, 0,115,109,111,111,116,104,114,101,115,104, 0,115,117, 98,100,105,118, 0,115,117, 98,100,105,
-118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, 0, 42,109,114, 0, 42,112,118, 0, 42,116,112, 97,103,101, 0,117,118,
- 91, 52, 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, 0,116,114, 97,110,115,112, 0,116,105,108,101, 0,117,110,119,114, 97,112,
- 0,118, 49, 0,118, 50, 0,118, 51, 0,118, 52, 0,101,100, 99,111,100,101, 0, 99,114,101, 97,115,101, 0, 98,119,101,105,103,
-104,116, 0,100,101,102, 95,110,114, 0, 42,100,119, 0,116,111,116,119,101,105,103,104,116, 0, 99,111, 91, 51, 93, 0,110,111,
- 91, 51, 93, 0,112, 97,100, 91, 50, 93, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,105,110,100,101,120, 0,102, 0,105,
- 0,115, 91, 50, 53, 54, 93, 0,116,111,116,100,105,115,112, 0, 40, 42,100,105,115,112,115, 41, 40, 41, 0,118, 91, 52, 93, 0,
-109,105,100, 0,118, 91, 50, 93, 0, 42,102, 97, 99,101,115, 0, 42, 99,111,108,102, 97, 99,101,115, 0, 42,101,100,103,101,115,
- 0, 42,118,101,114,116,115, 0,108,101,118,101,108,115, 0,108,101,118,101,108, 95, 99,111,117,110,116, 0, 99,117,114,114,101,
-110,116, 0,110,101,119,108,118,108, 0,101,100,103,101,108,118,108, 0,112,105,110,108,118,108, 0,114,101,110,100,101,114,108,
-118,108, 0,117,115,101, 95, 99,111,108, 0, 42,101,100,103,101, 95,102,108, 97,103,115, 0, 42,101,100,103,101, 95, 99,114,101,
- 97,115,101,115, 0, 42,118,101,114,116, 95,109, 97,112, 0, 42,101,100,103,101, 95,109, 97,112, 0, 42,111,108,100, 95,102, 97,
- 99,101,115, 0, 42,111,108,100, 95,101,100,103,101,115, 0,115,116, 97, 99,107,105,110,100,101,120, 0, 42,101,114,114,111,114,
- 0,109,111,100,105,102,105,101,114, 0,115,117, 98,100,105,118, 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,
-115, 0, 42,101,109, 67, 97, 99,104,101, 0, 42,109, 67, 97, 99,104,101, 0,100,101,102, 97,120,105,115, 0,112, 97,100, 91, 54,
- 93, 0,108,101,110,103,116,104, 0,114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, 0, 42,111, 98, 95, 97,114,109, 0,
- 42,115,116, 97,114,116, 95, 99, 97,112, 0, 42,101,110,100, 95, 99, 97,112, 0, 42, 99,117,114,118,101, 95,111, 98, 0, 42,111,
-102,102,115,101,116, 95,111, 98, 0,111,102,102,115,101,116, 91, 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, 0,109,101,114,103,
-101, 95,100,105,115,116, 0,102,105,116, 95,116,121,112,101, 0,111,102,102,115,101,116, 95,116,121,112,101, 0, 99,111,117,110,
-116, 0, 97,120,105,115, 0,116,111,108,101,114, 97,110, 99,101, 0, 42,109,105,114,114,111,114, 95,111, 98, 0,115,112,108,105,
-116, 95, 97,110,103,108,101, 0,118, 97,108,117,101, 0,114,101,115, 0,118, 97,108, 95,102,108, 97,103,115, 0,108,105,109, 95,
-102,108, 97,103,115, 0,101, 95,102,108, 97,103,115, 0, 98,101,118,101,108, 95, 97,110,103,108,101, 0,100,101,102,103,114,112,
- 95,110, 97,109,101, 91, 51, 50, 93, 0, 42,100,111,109, 97,105,110, 0, 42,102,108,111,119, 0, 42, 99,111,108,108, 0,116,105,
-109,101, 0, 42,116,101,120,116,117,114,101, 0,115,116,114,101,110,103,116,104, 0,100,105,114,101, 99,116,105,111,110, 0,109,
-105,100,108,101,118,101,108, 0,116,101,120,109, 97,112,112,105,110,103, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0,117,
-118,108, 97,121,101,114, 95,110, 97,109,101, 91, 51, 50, 93, 0,117,118,108, 97,121,101,114, 95,116,109,112, 0, 42,112,114,111,
-106,101, 99,116,111,114,115, 91, 49, 48, 93, 0, 42,105,109, 97,103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111,114,
-115, 0, 97,115,112,101, 99,116,120, 0, 97,115,112,101, 99,116,121, 0,115, 99, 97,108,101,120, 0,115, 99, 97,108,101,121, 0,
-112,101,114, 99,101,110,116, 0,102, 97, 99,101, 67,111,117,110,116, 0,102, 97, 99, 0,114,101,112,101, 97,116, 0, 42,111, 98,
-106,101, 99,116, 99,101,110,116,101,114, 0,115,116, 97,114,116,120, 0,115,116, 97,114,116,121, 0,104,101,105,103,104,116, 0,
-110, 97,114,114,111,119, 0,115,112,101,101,100, 0,100, 97,109,112, 0,102, 97,108,108,111,102,102, 0,116,105,109,101,111,102,
-102,115, 0,108,105,102,101,116,105,109,101, 0,100,101,102,111,114,109,102,108, 97,103, 0,109,117,108,116,105, 0, 42,112,114,
-101,118, 67,111,115, 0,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112, 97,114,101,110,116,105,110,118, 91, 52, 93,
- 91, 52, 93, 0, 99,101,110,116, 91, 51, 93, 0, 42,105,110,100,101,120, 97,114, 0,116,111,116,105,110,100,101,120, 0,102,111,
-114, 99,101, 0, 42, 99,108,111,116,104, 79, 98,106,101, 99,116, 0, 42,115,105,109, 95,112, 97,114,109,115, 0, 42, 99,111,108,
-108, 95,112, 97,114,109,115, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 0,112,116, 99, 97, 99,104,101,115, 0, 42,120,
- 0, 42,120,110,101,119, 0, 42,120,111,108,100, 0, 42, 99,117,114,114,101,110,116, 95,120,110,101,119, 0, 42, 99,117,114,114,
-101,110,116, 95,120, 0, 42, 99,117,114,114,101,110,116, 95,118, 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118,101,114,116,
-115, 0,110,117,109,102, 97, 99,101,115, 0, 42, 98,118,104,116,114,101,101, 0, 42,118, 0, 42,100,109, 0, 99,102,114, 97, 0,
-111,112,101,114, 97,116,105,111,110, 0,118,101,114,116,101,120, 0,116,111,116,105,110,102,108,117,101,110, 99,101, 0,103,114,
-105,100,115,105,122,101, 0, 42, 98,105,110,100,105,110,102,108,117,101,110, 99,101,115, 0, 42, 98,105,110,100,111,102,102,115,
-101,116,115, 0, 42, 98,105,110,100, 99, 97,103,101, 99,111,115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,121,
-110,103,114,105,100, 0, 42,100,121,110,105,110,102,108,117,101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0, 42,
-112, 97,100, 50, 0,100,121,110,103,114,105,100,115,105,122,101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,100,
-121,110, 99,101,108,108,119,105,100,116,104, 0, 98,105,110,100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42, 98,105,110,100,119,
-101,105,103,104,116,115, 0, 42, 98,105,110,100, 99,111,115, 0, 40, 42, 98,105,110,100,102,117,110, 99, 41, 40, 41, 0, 42,112,
-115,121,115, 0,116,111,116,100,109,118,101,114,116, 0,116,111,116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97, 99,
-101, 0,112,111,115,105,116,105,111,110, 0,114, 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,101,
-112, 97, 0,118,103,114,111,117,112, 0,112,114,111,116,101, 99,116, 0,108,118,108, 0,115, 99,117,108,112,116,108,118,108, 0,
-116,111,116,108,118,108, 0,115,105,109,112,108,101, 0, 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120, 84,
- 97,114,103,101,116, 0,118,103,114,111,117,112, 95,110, 97,109,101, 91, 51, 50, 93, 0,107,101,101,112, 68,105,115,116, 0,115,
-104,114,105,110,107, 84,121,112,101, 0,115,104,114,105,110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,117,
- 98,115,117,114,102, 76,101,118,101,108,115, 0, 42,111,114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,116,
- 91, 50, 93, 0,111,114,105,103,105,110, 79,112,116,115, 0,111,102,102,115,101,116, 95,102, 97, 99, 0, 99,114,101, 97,115,101,
- 95,105,110,110,101,114, 0, 99,114,101, 97,115,101, 95,111,117,116,101,114, 0, 99,114,101, 97,115,101, 95,114,105,109, 0, 42,
-111, 98, 95, 97,120,105,115, 0,115,116,101,112,115, 0,114,101,110,100,101,114, 95,115,116,101,112,115, 0,105,116,101,114, 0,
-115, 99,114,101,119, 95,111,102,115, 0, 97,110,103,108,101, 0, 42,108, 97,116,116, 0,112,110,116,115,119, 0,111,112,110,116,
-115,117, 0,111,112,110,116,115,118, 0,111,112,110,116,115,119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,
-101,119, 0,102,117, 0,102,118, 0,102,119, 0,100,117, 0,100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105,
- 99,101,100, 97,116, 97, 0,108, 97,116,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101,
- 99, 91, 56, 93, 91, 51, 93, 0, 42,115, 99,117,108,112,116, 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114,
- 50, 0,112, 97,114, 51, 0,112, 97,114,115,117, 98,115,116,114, 91, 51, 50, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,
-120,121, 0, 42,112,114,111,120,121, 95,103,114,111,117,112, 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,
-105,111,110, 0, 42,112,111,115,101,108,105, 98, 0, 42,112,111,115,101, 0, 42,103,112,100, 0, 97,118,115, 0, 42,109,112, 97,
-116,104, 0, 99,111,110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108,115, 0,100,101,102, 98, 97,115,101, 0,109,111,
-100,105,102,105,101,114,115, 0,114,101,115,116,111,114,101, 95,109,111,100,101, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99,
-116, 99,111,108, 0,100,108,111, 99, 91, 51, 93, 0,111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,114,
-111,116, 91, 51, 93, 0,100,113,117, 97,116, 91, 52, 93, 0,114,111,116, 65,120,105,115, 91, 51, 93, 0,100,114,111,116, 65,120,
-105,115, 91, 51, 93, 0,114,111,116, 65,110,103,108,101, 0,100,114,111,116, 65,110,103,108,101, 0,111, 98,109, 97,116, 91, 52,
- 93, 91, 52, 93, 0, 99,111,110,115,116,105,110,118, 91, 52, 93, 91, 52, 93, 0,108, 97,121, 0, 99,111,108, 98,105,116,115, 0,
-116,114, 97,110,115,102,108, 97,103, 0,112,114,111,116,101, 99,116,102,108, 97,103, 0,116,114, 97, 99,107,102,108, 97,103, 0,
-117,112,102,108, 97,103, 0,110,108, 97,102,108, 97,103, 0,105,112,111,102,108, 97,103, 0,105,112,111,119,105,110, 0,115, 99,
- 97,102,108, 97,103, 0,115, 99, 97,118,105,115,102,108, 97,103, 0, 98,111,117,110,100,116,121,112,101, 0,100,117,112,111,110,
- 0,100,117,112,111,102,102, 0,100,117,112,115,116, 97, 0,100,117,112,101,110,100, 0,115,102, 0,109, 97,115,115, 0,100, 97,
-109,112,105,110,103, 0,105,110,101,114,116,105, 97, 0,102,111,114,109,102, 97, 99,116,111,114, 0,114,100, 97,109,112,105,110,
-103, 0,109, 97,114,103,105,110, 0,109, 97,120, 95,118,101,108, 0,109,105,110, 95,118,101,108, 0,109, 95, 99,111,110,116, 97,
- 99,116, 80,114,111, 99,101,115,115,105,110,103, 84,104,114,101,115,104,111,108,100, 0,114,111,116,109,111,100,101, 0,100,116,
- 0,100,116,120, 0,101,109,112,116,121, 95,100,114, 97,119,116,121,112,101, 0,112, 97,100, 49, 91, 51, 93, 0,101,109,112,116,
-121, 95,100,114, 97,119,115,105,122,101, 0,100,117,112,102, 97, 99,101,115, 99, 97, 0,112,114,111,112, 0,115,101,110,115,111,
-114,115, 0, 99,111,110,116,114,111,108,108,101,114,115, 0, 97, 99,116,117, 97,116,111,114,115, 0, 98, 98,115,105,122,101, 91,
- 51, 93, 0, 97, 99,116,100,101,102, 0,103, 97,109,101,102,108, 97,103, 0,103, 97,109,101,102,108, 97,103, 50, 0, 42, 98,115,
-111,102,116, 0,115,111,102,116,102,108, 97,103, 0, 97,110,105,115,111,116,114,111,112,105, 99, 70,114,105, 99,116,105,111,110,
- 91, 51, 93, 0, 99,111,110,115,116,114, 97,105,110,116,115, 0,110,108, 97,115,116,114,105,112,115, 0,104,111,111,107,115, 0,
-112, 97,114,116,105, 99,108,101,115,121,115,116,101,109, 0, 42,115,111,102,116, 0, 42,100,117,112, 95,103,114,111,117,112, 0,
-102,108,117,105,100,115,105,109, 70,108, 97,103, 0,114,101,115,116,114,105, 99,116,102,108, 97,103, 0,115,104, 97,112,101,102,
-108, 97,103, 0,114,101, 99, 97,108, 99,111, 0, 98,111,100,121, 95,116,121,112,101, 0, 42,102,108,117,105,100,115,105,109, 83,
-101,116,116,105,110,103,115, 0, 42,100,101,114,105,118,101,100, 68,101,102,111,114,109, 0, 42,100,101,114,105,118,101,100, 70,
-105,110, 97,108, 0,108, 97,115,116, 68, 97,116, 97, 77, 97,115,107, 0,115,116, 97,116,101, 0,105,110,105,116, 95,115,116, 97,
-116,101, 0,103,112,117,108, 97,109,112, 0,112, 99, 95,105,100,115, 0, 42,100,117,112,108,105,108,105,115,116, 0, 99,117,114,
-105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,111,114,105,103,108, 97,121, 0,110,111, 95,100,114, 97,119, 0, 97,110,105,
-109, 97,116,101,100, 0,111,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111,114, 99,111, 91, 51, 93, 0,100,101,102,108,101, 99,116,
- 0,102,111,114, 99,101,102,105,101,108,100, 0,115,104, 97,112,101, 0,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,
-107,105,110,107, 95, 97,120,105,115, 0,122,100,105,114, 0,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,100, 97,109,112,
- 0,102, 95,102,108,111,119, 0,102, 95,115,105,122,101, 0,102, 95,112,111,119,101,114, 0,109, 97,120,100,105,115,116, 0,109,
-105,110,100,105,115,116, 0,102, 95,112,111,119,101,114, 95,114, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,112,
-100,101,102, 95,100, 97,109,112, 0,112,100,101,102, 95,114,100, 97,109,112, 0,112,100,101,102, 95,112,101,114,109, 0,112,100,
-101,102, 95,102,114,105, 99,116, 0,112,100,101,102, 95,114,102,114,105, 99,116, 0,112,100,101,102, 95,115,116,105, 99,107,110,
-101,115,115, 0, 97, 98,115,111,114,112,116,105,111,110, 0,112,100,101,102, 95,115, 98,100, 97,109,112, 0,112,100,101,102, 95,
-115, 98,105,102,116, 0,112,100,101,102, 95,115, 98,111,102,116, 0, 99,108,117,109,112, 95,102, 97, 99, 0, 99,108,117,109,112,
- 95,112,111,119, 0,107,105,110,107, 95,102,114,101,113, 0,107,105,110,107, 95,115,104, 97,112,101, 0,107,105,110,107, 95, 97,
-109,112, 0,102,114,101,101, 95,101,110,100, 0,116,101,120, 95,110, 97, 98,108, 97, 0, 42,114,110,103, 0,102, 95,110,111,105,
-115,101, 0,119,101,105,103,104,116, 91, 49, 51, 93, 0,103,108,111, 98, 97,108, 95,103,114, 97,118,105,116,121, 0,114,116, 91,
- 51, 93, 0,116,111,116,100, 97,116, 97, 0,102,114, 97,109,101, 0,116,111,116,112,111,105,110,116, 0,100, 97,116, 97, 95,116,
-121,112,101,115, 0, 42,100, 97,116, 97, 91, 56, 93, 0, 42, 99,117,114, 91, 56, 93, 0,101,120,116,114, 97,100, 97,116, 97, 0,
-115,116,101,112, 0,115,105,109,102,114, 97,109,101, 0,115,116, 97,114,116,102,114, 97,109,101, 0,101,110,100,102,114, 97,109,
-101, 0,101,100,105,116,102,114, 97,109,101, 0,108, 97,115,116, 95,101,120, 97, 99,116, 0, 99,111,109,112,114,101,115,115,105,
-111,110, 0,110, 97,109,101, 91, 54, 52, 93, 0,112,114,101,118, 95,110, 97,109,101, 91, 54, 52, 93, 0,105,110,102,111, 91, 54,
- 52, 93, 0,112, 97,116,104, 91, 50, 52, 48, 93, 0, 42, 99, 97, 99,104,101,100, 95,102,114, 97,109,101,115, 0,109,101,109, 95,
- 99, 97, 99,104,101, 0, 42,101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,105,116, 41, 40, 41, 0,108,105,110, 83,116,
-105,102,102, 0, 97,110,103, 83,116,105,102,102, 0,118,111,108,117,109,101, 0,118,105,116,101,114, 97,116,105,111,110,115, 0,
-112,105,116,101,114, 97,116,105,111,110,115, 0,100,105,116,101,114, 97,116,105,111,110,115, 0, 99,105,116,101,114, 97,116,105,
-111,110,115, 0,107, 83, 82, 72, 82, 95, 67, 76, 0,107, 83, 75, 72, 82, 95, 67, 76, 0,107, 83, 83, 72, 82, 95, 67, 76, 0,107,
- 83, 82, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 75, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 83, 95, 83, 80, 76, 84, 95,
- 67, 76, 0,107, 86, 67, 70, 0,107, 68, 80, 0,107, 68, 71, 0,107, 76, 70, 0,107, 80, 82, 0,107, 86, 67, 0,107, 68, 70, 0,
-107, 77, 84, 0,107, 67, 72, 82, 0,107, 75, 72, 82, 0,107, 83, 72, 82, 0,107, 65, 72, 82, 0, 99,111,108,108,105,115,105,111,
-110,102,108, 97,103,115, 0,110,117,109, 99,108,117,115,116,101,114,105,116,101,114, 97,116,105,111,110,115, 0,119,101,108,100,
-105,110,103, 0,116,111,116,115,112,114,105,110,103, 0, 42, 98,112,111,105,110,116, 0, 42, 98,115,112,114,105,110,103, 0,109,
-115,103, 95,108,111, 99,107, 0,109,115,103, 95,118, 97,108,117,101, 0,110,111,100,101,109, 97,115,115, 0,110, 97,109,101,100,
- 86, 71, 95, 77, 97,115,115, 91, 51, 50, 93, 0,103,114, 97,118, 0,109,101,100,105, 97,102,114,105, 99,116, 0,114,107,108,105,
-109,105,116, 0,112,104,121,115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,108,115,112,114,105,110,103, 0,103,111, 97,
-108,102,114,105, 99,116, 0,109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,108, 0,100,101,102,103,111, 97,108, 0,118,
-101,114,116,103,114,111,117,112, 0,110, 97,109,101,100, 86, 71, 95, 83,111,102,116,103,111, 97,108, 91, 51, 50, 93, 0,102,117,
-122,122,121,110,101,115,115, 0,105,110,115,112,114,105,110,103, 0,105,110,102,114,105, 99,116, 0,110, 97,109,101,100, 86, 71,
- 95, 83,112,114,105,110,103, 95, 75, 91, 51, 50, 93, 0,101,102,114, 97, 0,105,110,116,101,114,118, 97,108, 0,108,111, 99, 97,
-108, 0,115,111,108,118,101,114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,116,111,116,112,111,105,110,116,107,101,121,
- 0,115,101, 99,111,110,100,115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108, 0, 98, 97,108,108,100, 97,109,112, 0, 98,
- 97,108,108,115,116,105,102,102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,111,101,100,103,101, 0,109,105,110,108,111,
-111,112,115, 0,109, 97,120,108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,108,118,101,114, 95, 73, 68, 0,112,108, 97,
-115,116,105, 99, 0,115,112,114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115, 99,114, 97,116, 99,104, 0,115,104,101, 97,
-114,115,116,105,102,102, 0,105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99, 97, 99,104,101, 0, 42,101,102,102,101, 99,
-116,111,114, 95,119,101,105,103,104,116,115, 0,108, 99,111,109, 91, 51, 93, 0,108,114,111,116, 91, 51, 93, 91, 51, 93, 0,108,
-115, 99, 97,108,101, 91, 51, 93, 91, 51, 93, 0,112, 97,100, 52, 91, 52, 93, 0, 42,102,109,100, 0,115,104,111,119, 95, 97,100,
-118, 97,110, 99,101,100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,105,111,110,120,121,122, 0,112,114,101,118,
-105,101,119,114,101,115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,105, 68,105,115,112,108, 97,121, 77,111,100,
-101, 0,114,101,110,100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 86, 97,108,
-117,101, 0,118,105,115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,111,115,105,116,121, 69,120,112,111,110,101,
-110,116, 0,103,114, 97,118,120, 0,103,114, 97,118,121, 0,103,114, 97,118,122, 0, 97,110,105,109, 83,116, 97,114,116, 0, 97,
-110,105,109, 69,110,100, 0, 98, 97,107,101, 83,116, 97,114,116, 0, 98, 97,107,101, 69,110,100, 0,103,115,116, 97,114, 0,109,
- 97,120, 82,101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0,105,110,105, 86,101,108,121, 0,105,110,105, 86,101,108,122,
- 0, 42,111,114,103, 77,101,115,104, 0, 42,109,101,115,104, 83,117,114,102, 97, 99,101, 0, 42,109,101,115,104, 66, 66, 0,115,
-117,114,102,100, 97,116, 97, 80, 97,116,104, 91, 50, 52, 48, 93, 0, 98, 98, 83,116, 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,
-122,101, 91, 51, 93, 0,116,121,112,101, 70,108, 97,103,115, 0,100,111,109, 97,105,110, 78,111,118,101, 99,103,101,110, 0,118,
-111,108,117,109,101, 73,110,105,116, 84,121,112,101, 0,112, 97,114,116, 83,108,105,112, 86, 97,108,117,101, 0,103,101,110,101,
-114, 97,116,101, 84,114, 97, 99,101,114,115, 0,103,101,110,101,114, 97,116,101, 80, 97,114,116,105, 99,108,101,115, 0,115,117,
-114,102, 97, 99,101, 83,109,111,111,116,104,105,110,103, 0,115,117,114,102, 97, 99,101, 83,117, 98,100,105,118,115, 0,112, 97,
-114,116,105, 99,108,101, 73,110,102, 83,105,122,101, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 65,108,112,104, 97, 0,102,
- 97,114, 70,105,101,108,100, 83,105,122,101, 0, 42,109,101,115,104, 83,117,114,102, 78,111,114,109, 97,108,115, 0, 99,112,115,
- 84,105,109,101, 83,116, 97,114,116, 0, 99,112,115, 84,105,109,101, 69,110,100, 0, 99,112,115, 81,117, 97,108,105,116,121, 0,
- 97,116,116,114, 97, 99,116,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,
-101, 82, 97,100,105,117,115, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0,118,101,
-108,111, 99,105,116,121,102,111,114, 99,101, 82, 97,100,105,117,115, 0,108, 97,115,116,103,111,111,100,102,114, 97,109,101, 0,
-109,105,115,116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114, 98, 0,122,101,110,114, 0,122,101,110,103,
- 0,122,101,110, 98, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,101, 0,101,120,112, 0,114, 97,110,103,101,
- 0,108,105,110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,121, 0, 97, 99,116,105,118,105,116,121, 66,
-111,120, 82, 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,117,115,105,111,110, 82,101,115, 0,112,104,
-121,115,105, 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109, 97,120,108,111,103,105, 99,115,116,101,112,
- 0,112,104,121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,112, 0,109,105,115,105, 0,109,105,115,116,
-115,116, 97, 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,116, 97,114,114, 0,115,116, 97,114,103, 0,
-115,116, 97,114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,115,116, 97,114,109,105,110,100,105,115,116,
- 0,115,116, 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,101, 0,100,111,102,115,116, 97, 0,100,111,
-102,101,110,100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,100,105,115,116, 0, 97,111,100,105,115,116,
-102, 97, 99, 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,111,109,111,100,101, 0, 97,111,115, 97,109,
-112, 0, 97,111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,
- 97,111, 95, 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111, 95, 97,112,112,114,111,120, 95,101,114,114,
-111,114, 0, 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,111,110, 0, 97,111, 95,105,110,100,105,114,
-101, 99,116, 95,101,110,101,114,103,121, 0, 97,111, 95,101,110,118, 95,101,110,101,114,103,121, 0, 97,111, 95,112, 97,100, 50,
- 0, 97,111, 95,105,110,100,105,114,101, 99,116, 95, 98,111,117,110, 99,101,115, 0, 97,111, 95,112, 97,100, 0, 97,111, 95,115,
- 97,109,112, 95,109,101,116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,109,101,116,104,111,100, 0, 97,111, 95, 97,
-112,112,114,111,120, 95,112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116, 97, 98,108,101,115,
- 0,112, 97,100, 91, 51, 93, 0,115,101,108, 99,111,108, 0,115,120, 0,115,121, 0, 42,108,112, 70,111,114,109, 97,116, 0, 42,
-108,112, 80, 97,114,109,115, 0, 99, 98, 70,111,114,109, 97,116, 0, 99, 98, 80, 97,114,109,115, 0,102, 99, 99, 84,121,112,101,
- 0,102, 99, 99, 72, 97,110,100,108,101,114, 0,100,119, 75,101,121, 70,114, 97,109,101, 69,118,101,114,121, 0,100,119, 81,117,
- 97,108,105,116,121, 0,100,119, 66,121,116,101,115, 80,101,114, 83,101, 99,111,110,100, 0,100,119, 70,108, 97,103,115, 0,100,
-119, 73,110,116,101,114,108,101, 97,118,101, 69,118,101,114,121, 0, 97,118,105, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50,
- 56, 93, 0, 42, 99,100, 80, 97,114,109,115, 0, 42,112, 97,100, 0, 99,100, 83,105,122,101, 0,113,116, 99,111,100,101, 99,110,
- 97,109,101, 91, 49, 50, 56, 93, 0, 99,111,100,101, 99, 84,121,112,101, 0, 99,111,100,101, 99, 83,112, 97,116,105, 97,108, 81,
-117, 97,108,105,116,121, 0, 99,111,100,101, 99, 0, 99,111,100,101, 99, 70,108, 97,103,115, 0, 99,111,108,111,114, 68,101,112,
-116,104, 0, 99,111,100,101, 99, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 83,112, 97,116,105,
- 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,116,121, 0,107,101,121,
- 70,114, 97,109,101, 82, 97,116,101, 0, 98,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 99,111,100,101, 99, 84,121,112,101,
- 0, 97,117,100,105,111, 83, 97,109,112,108,101, 82, 97,116,101, 0, 97,117,100,105,111, 66,105,116, 68,101,112,116,104, 0, 97,
-117,100,105,111, 67,104, 97,110,110,101,108,115, 0, 97,117,100,105,111, 67,111,100,101, 99, 70,108, 97,103,115, 0, 97,117,100,
-105,111, 66,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 95, 99,111,100,101, 99, 0,118,105,100,101,111, 95, 98,105,116,114,
- 97,116,101, 0, 97,117,100,105,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95,109,105,120,114, 97,116,101, 0,
- 97,117,100,105,111, 95,118,111,108,117,109,101, 0,103,111,112, 95,115,105,122,101, 0,114, 99, 95,109,105,110, 95,114, 97,116,
-101, 0,114, 99, 95,109, 97,120, 95,114, 97,116,101, 0,114, 99, 95, 98,117,102,102,101,114, 95,115,105,122,101, 0,109,117,120,
- 95,112, 97, 99,107,101,116, 95,115,105,122,101, 0,109,117,120, 95,114, 97,116,101, 0,109,105,120,114, 97,116,101, 0,109, 97,
-105,110, 0,115,112,101,101,100, 95,111,102, 95,115,111,117,110,100, 0,100,111,112,112,108,101,114, 95,102, 97, 99,116,111,114,
- 0,100,105,115,116, 97,110, 99,101, 95,109,111,100,101,108, 0, 42,109, 97,116, 95,111,118,101,114,114,105,100,101, 0, 42,108,
-105,103,104,116, 95,111,118,101,114,114,105,100,101, 0,108, 97,121, 95,122,109, 97,115,107, 0,108, 97,121,102,108, 97,103, 0,
-112, 97,115,115,102,108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0, 42, 97,118,105, 99,111,100,101, 99,100, 97,116, 97, 0,
- 42,113,116, 99,111,100,101, 99,100, 97,116, 97, 0,113,116, 99,111,100,101, 99,115,101,116,116,105,110,103,115, 0,102,102, 99,
-111,100,101, 99,100, 97,116, 97, 0,115,117, 98,102,114, 97,109,101, 0,112,115,102,114, 97, 0,112,101,102,114, 97, 0,105,109,
- 97,103,101,115, 0,102,114, 97,109, 97,112,116,111, 0,116,104,114,101, 97,100,115, 0,102,114, 97,109,101,108,101,110, 0, 98,
-108,117,114,102, 97, 99, 0,101,100,103,101, 82, 0,101,100,103,101, 71, 0,101,100,103,101, 66, 0,102,117,108,108,115, 99,114,
-101,101,110, 0,120,112,108, 97,121, 0,121,112,108, 97,121, 0,102,114,101,113,112,108, 97,121, 0, 97,116,116,114,105, 98, 0,
-102,114, 97,109,101, 95,115,116,101,112, 0,115,116,101,114,101,111,109,111,100,101, 0,100,105,109,101,110,115,105,111,110,115,
-112,114,101,115,101,116, 0,109, 97,120,105,109,115,105,122,101, 0,120,115, 99,104, 0,121,115, 99,104, 0,120,112, 97,114,116,
-115, 0,121,112, 97,114,116,115, 0,119,105,110,112,111,115, 0,112,108, 97,110,101,115, 0,105,109,116,121,112,101, 0,115,117,
- 98,105,109,116,121,112,101, 0,113,117, 97,108,105,116,121, 0,100,105,115,112,108, 97,121,109,111,100,101, 0,114,112, 97,100,
- 49, 0,114,112, 97,100, 50, 0,115, 99,101,109,111,100,101, 0,114, 97,121,116,114, 97, 99,101, 95,111,112,116,105,111,110,115,
- 0,114, 97,121,116,114, 97, 99,101, 95,115,116,114,117, 99,116,117,114,101, 0,114,101,110,100,101,114,101,114, 0,111, 99,114,
-101,115, 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97, 0,102,114,115, 95,115,101, 99, 0,101,100,103,101,105,110,116,
- 0,115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,105,115,112,114,101, 99,116, 0,108, 97,121,101,114,115, 0, 97,
- 99,116,108, 97,121, 0,109, 98,108,117,114, 95,115, 97,109,112,108,101,115, 0,120, 97,115,112, 0,121, 97,115,112, 0,102,114,
-115, 95,115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115, 0, 99,111,108,111,114, 95,109,103,116, 95,102,108, 97,103, 0,
-112,111,115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117,101, 0,112,111,115,116,115, 97,116, 0,100,105,116,104,101,114,
- 95,105,110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95,111,115, 97, 0, 98, 97,107,101, 95,102,105,108,116,101,114, 0,
- 98, 97,107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102,108, 97,103, 0, 98, 97,107,101, 95,110,111,114,109, 97,108, 95,
-115,112, 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95,115,112,108,105,116, 0, 98, 97,107,101, 95,109, 97,120,100,105,
-115,116, 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116, 0, 98, 97,107,101, 95,112, 97,100, 0, 98, 97, 99,107, 98,117,
-102, 91, 49, 54, 48, 93, 0,112,105, 99, 91, 49, 54, 48, 93, 0,115,116, 97,109,112, 0,115,116, 97,109,112, 95,102,111,110,116,
- 95,105,100, 0,115,116, 97,109,112, 95,117,100, 97,116, 97, 91, 49, 54, 48, 93, 0,102,103, 95,115,116, 97,109,112, 91, 52, 93,
- 0, 98,103, 95,115,116, 97,109,112, 91, 52, 93, 0,115,101,113, 95,112,114,101,118, 95,116,121,112,101, 0,115,101,113, 95,114,
-101,110,100, 95,116,121,112,101, 0,115,101,113, 95,102,108, 97,103, 0,112, 97,100, 53, 91, 53, 93, 0,115,105,109,112,108,105,
-102,121, 95,102,108, 97,103, 0,115,105,109,112,108,105,102,121, 95,115,117, 98,115,117,114,102, 0,115,105,109,112,108,105,102,
-121, 95,115,104, 97,100,111,119,115, 97,109,112,108,101,115, 0,115,105,109,112,108,105,102,121, 95,112, 97,114,116,105, 99,108,
-101,115, 0,115,105,109,112,108,105,102,121, 95, 97,111,115,115,115, 0, 99,105,110,101,111,110,119,104,105,116,101, 0, 99,105,
-110,101,111,110, 98,108, 97, 99,107, 0, 99,105,110,101,111,110,103, 97,109,109, 97, 0,106,112, 50, 95,112,114,101,115,101,116,
- 0,106,112, 50, 95,100,101,112,116,104, 0,114,112, 97,100, 51, 0,100,111,109,101,114,101,115, 0,100,111,109,101,109,111,100,
-101, 0,100,111,109,101, 97,110,103,108,101, 0,100,111,109,101,116,105,108,116, 0,100,111,109,101,114,101,115, 98,117,102, 0,
- 42,100,111,109,101,116,101,120,116, 0,101,110,103,105,110,101, 91, 51, 50, 93, 0,112, 97,114,116,105, 99,108,101, 95,112,101,
-114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97,120, 0,115,104, 97,100, 98,117,102,115, 97,109,112,108,101, 95,109, 97,120,
- 0, 97,111, 95,101,114,114,111,114, 0,116,105,108,116, 0,114,101,115, 98,117,102, 0, 42,119, 97,114,112,116,101,120,116, 0,
- 99,111,108, 91, 51, 93, 0,109, 97,116,109,111,100,101, 0,102,114, 97,109,105,110,103, 0,114,116, 49, 0,114,116, 50, 0,100,
-111,109,101, 0,115,116,101,114,101,111,102,108, 97,103, 0,101,121,101,115,101,112, 97,114, 97,116,105,111,110, 0, 42, 99, 97,
-109,101,114, 97, 0, 42, 98,114,117,115,104, 0, 42,112, 97,105,110,116, 95, 99,117,114,115,111,114, 0,112, 97,105,110,116, 95,
- 99,117,114,115,111,114, 95, 99,111,108, 91, 52, 93, 0,112, 97,105,110,116, 0,115,101, 97,109, 95, 98,108,101,101,100, 0,110,
-111,114,109, 97,108, 95, 97,110,103,108,101, 0,115, 99,114,101,101,110, 95,103,114, 97, 98, 95,115,105,122,101, 91, 50, 93, 0,
- 42,112, 97,105,110,116, 99,117,114,115,111,114, 0,105,110,118,101,114,116, 0,116,111,116,114,101,107,101,121, 0,116,111,116,
- 97,100,100,107,101,121, 0, 98,114,117,115,104,116,121,112,101, 0, 98,114,117,115,104, 91, 55, 93, 0,101,109,105,116,116,101,
-114,100,105,115,116, 0,115,101,108,101, 99,116,109,111,100,101, 0,101,100,105,116,116,121,112,101, 0,100,114, 97,119, 95,115,
-116,101,112, 0,102, 97,100,101, 95,102,114, 97,109,101,115, 0,110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91,
- 51, 93, 0,114, 97,100,105, 97,108, 95,115,121,109,109, 91, 51, 93, 0,108, 97,115,116, 95,120, 0,108, 97,115,116, 95,121, 0,
-108, 97,115,116, 95, 97,110,103,108,101, 0,100,114, 97,119, 95, 97,110, 99,104,111,114,101,100, 0, 97,110, 99,104,111,114,101,
-100, 95,115,105,122,101, 0, 97,110, 99,104,111,114,101,100, 95,108,111, 99, 97,116,105,111,110, 91, 51, 93, 0, 97,110, 99,104,
-111,114,101,100, 95,105,110,105,116,105, 97,108, 95,109,111,117,115,101, 91, 50, 93, 0,100,114, 97,119, 95,112,114,101,115,115,
-117,114,101, 0,112,114,101,115,115,117,114,101, 95,118, 97,108,117,101, 0,115,112,101, 99,105, 97,108, 95,114,111,116, 97,116,
-105,111,110, 0, 42,118,112, 97,105,110,116, 95,112,114,101,118, 0, 42,119,112, 97,105,110,116, 95,112,114,101,118, 0, 42,118,
-112, 97,105,110,116, 0, 42,119,112, 97,105,110,116, 0,118,103,114,111,117,112, 95,119,101,105,103,104,116, 0, 99,111,114,110,
-101,114,116,121,112,101, 0,101,100,105,116, 98,117,116,102,108, 97,103, 0,106,111,105,110,116,114,105,108,105,109,105,116, 0,
-100,101,103,114, 0,116,117,114,110, 0,101,120,116,114, 95,111,102,102,115, 0,100,111,117, 98,108,105,109,105,116, 0,110,111,
-114,109, 97,108,115,105,122,101, 0, 97,117,116,111,109,101,114,103,101, 0,115,101,103,109,101,110,116,115, 0,114,105,110,103,
-115, 0,118,101,114,116,105, 99,101,115, 0,117,110,119,114, 97,112,112,101,114, 0,117,118, 99, 97,108, 99, 95,114, 97,100,105,
-117,115, 0,117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,122,101, 0,117,118, 99, 97,108, 99, 95,109, 97,114,103,105,110,
- 0,117,118, 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,118, 99, 97,108, 99, 95,109, 97,112, 97,108,105,103,110, 0,117,
-118, 99, 97,108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108, 97,103, 0,117,118, 95,115,101,108,101, 99,116,109,111,100,101,
- 0,117,118, 95,112, 97,100, 0,103,112,101,110, 99,105,108, 95,102,108, 97,103,115, 0, 97,117,116,111,105,107, 95, 99,104, 97,
-105,110,108,101,110, 0,105,109, 97,112, 97,105,110,116, 0,112, 97,114,116,105, 99,108,101, 0,112,114,111,112,111,114,116,105,
-111,110, 97,108, 95,115,105,122,101, 0,115,101,108,101, 99,116, 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, 95,116,104,
-114,101,115,104, 0, 97,117,116,111,107,101,121, 95,109,111,100,101, 0, 97,117,116,111,107,101,121, 95,102,108, 97,103, 0,114,
-101,116,111,112,111, 95,109,111,100,101, 0,114,101,116,111,112,111, 95,112, 97,105,110,116, 95,116,111,111,108, 0,108,105,110,
-101, 95,100,105,118, 0,101,108,108,105,112,115,101, 95,100,105,118, 0,114,101,116,111,112,111, 95,104,111,116,115,112,111,116,
- 0,109,117,108,116,105,114,101,115, 95,115,117, 98,100,105,118, 95,116,121,112,101, 0,115,107,103,101,110, 95,114,101,115,111,
-108,117,116,105,111,110, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,105,110,116,101,114,110, 97,108, 0,
-115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,101,120,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,108,
-101,110,103,116,104, 95,114, 97,116,105,111, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,108,105,109,105,116, 0,115,
-107,103,101,110, 95, 97,110,103,108,101, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 99,111,114,114,101,108, 97,116,105,
-111,110, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,115,121,109,109,101,116,114,121, 95,108,105,109,105,116, 0,115,107,
-103,101,110, 95,114,101,116, 97,114,103,101,116, 95, 97,110,103,108,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,
-114,101,116, 97,114,103,101,116, 95,108,101,110,103,116,104, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116,
- 97,114,103,101,116, 95,100,105,115,116, 97,110, 99,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,111,112,116,105,
-111,110,115, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 95,
-112, 97,115,115,101,115, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110,115, 91, 51, 93, 0,115,107,103,
-101,110, 95,109,117,108,116,105, 95,108,101,118,101,108, 0, 42,115,107,103,101,110, 95,116,101,109,112,108, 97,116,101, 0, 98,
-111,110,101, 95,115,107,101,116, 99,104,105,110,103, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 95, 99,111,110,
-118,101,114,116, 0,115,107,103,101,110, 95,115,117, 98,100,105,118,105,115,105,111,110, 95,110,117,109, 98,101,114, 0,115,107,
-103,101,110, 95,114,101,116, 97,114,103,101,116, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,114,101,116, 97,114,
-103,101,116, 95,114,111,108,108, 0,115,107,103,101,110, 95,115,105,100,101, 95,115,116,114,105,110,103, 91, 56, 93, 0,115,107,
-103,101,110, 95,110,117,109, 95,115,116,114,105,110,103, 91, 56, 93, 0,101,100,103,101, 95,109,111,100,101, 0,115,110, 97,112,
- 95,109,111,100,101, 0,115,110, 97,112, 95,102,108, 97,103, 0,115,110, 97,112, 95,116, 97,114,103,101,116, 0,112,114,111,112,
-111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,
-111, 98,106,101, 99,116,115, 0, 97,117,116,111, 95,110,111,114,109, 97,108,105,122,101, 0,115, 99,117,108,112,116, 95,112, 97,
-105,110,116, 95,115,101,116,116,105,110,103,115, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,
-100, 95,115,105,122,101, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,100, 95,117,110,112,114,
-111,106,101, 99,116,101,100, 95,114, 97,100,105,117,115, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,
-105,101,100, 95, 97,108,112,104, 97, 0,116,111,116,111, 98,106, 0,116,111,116,108, 97,109,112, 0,116,111,116,111, 98,106,115,
-101,108, 0,116,111,116, 99,117,114,118,101, 0,116,111,116,109,101,115,104, 0,116,111,116, 97,114,109, 97,116,117,114,101, 0,
-115, 99, 97,108,101, 95,108,101,110,103,116,104, 0,115,121,115,116,101,109, 0,115,121,115,116,101,109, 95,114,111,116, 97,116,
-105,111,110, 0,103,114, 97,118,105,116,121, 91, 51, 93, 0,113,117,105, 99,107, 95, 99, 97, 99,104,101, 95,115,116,101,112, 0,
- 42,119,111,114,108,100, 0, 42,115,101,116, 0, 98, 97,115,101, 0, 42, 98, 97,115, 97, 99,116, 0, 42,111, 98,101,100,105,116,
- 0, 99,117,114,115,111,114, 91, 51, 93, 0,116,119, 99,101,110,116, 91, 51, 93, 0,116,119,109,105,110, 91, 51, 93, 0,116,119,
-109, 97,120, 91, 51, 93, 0,108, 97,121, 97, 99,116, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0, 42,101,
-100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115,116, 97,116,115, 0, 97,117,100,105,111, 0,116,114, 97,
-110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0, 42,115,111,117,110,100, 95,115, 99,101,110,101, 0, 42,115,111,117,110,
-100, 95,115, 99,101,110,101, 95,104, 97,110,100,108,101, 0, 42,115,111,117,110,100, 95,115, 99,114,117, 98, 95,104, 97,110,100,
-108,101, 0, 42,102,112,115, 95,105,110,102,111, 0, 42,116,104,101, 68, 97,103, 0,100, 97,103,105,115,118, 97,108,105,100, 0,
-100, 97,103,102,108, 97,103,115, 0,112, 97,100, 54, 0,112, 97,100, 53, 0, 97, 99,116,105,118,101, 95,107,101,121,105,110,103,
-115,101,116, 0,107,101,121,105,110,103,115,101,116,115, 0,103,109, 0,117,110,105,116, 0,112,104,121,115,105, 99,115, 95,115,
-101,116,116,105,110,103,115, 0, 98,108,101,110,100, 0,118,105,101,119, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,
-118,105,101,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,105,110,118, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,
-109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,105,110,118, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116,111,
- 98, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,116,119,109, 97,116, 91, 52, 93,
- 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99, 0, 99, 97,109,100,120, 0, 99, 97,109,100,121,
- 0,112,105,120,115,105,122,101, 0, 99, 97,109,122,111,111,109, 0,116,119,100,114, 97,119,102,108, 97,103, 0,114,102,108, 97,
-103, 0,118,105,101,119,108,111, 99,107, 0,112,101,114,115,112, 0, 99,108,105,112, 91, 54, 93, 91, 52, 93, 0, 99,108,105,112,
- 95,108,111, 99, 97,108, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 42,108,111, 99, 97,108,118,100, 0, 42,114,
-105, 0, 42,114,101,116,111,112,111, 95,118,105,101,119, 95,100, 97,116, 97, 0, 42,100,101,112,116,104,115, 0, 42,115,109,115,
- 0, 42,115,109,111,111,116,104, 95,116,105,109,101,114, 0,108,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,108,112,101,114,
-115,112, 0,108,118,105,101,119, 0,103,114,105,100,118,105,101,119, 0,116,119, 97,110,103,108,101, 91, 51, 93, 0,112, 97,100,
-102, 0,114,101,103,105,111,110, 98, 97,115,101, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97,108,
-101, 0, 98,108,111, 99,107,104, 97,110,100,108,101,114, 91, 56, 93, 0,108, 97,121, 95,117,115,101,100, 0, 42,111, 98, 95, 99,
-101,110,116,114,101, 0, 98,103,112,105, 99, 98, 97,115,101, 0, 42, 98,103,112,105, 99, 0,111, 98, 95, 99,101,110,116,114,101,
- 95, 98,111,110,101, 91, 51, 50, 93, 0,100,114, 97,119,116,121,112,101, 0,111, 98, 95, 99,101,110,116,114,101, 95, 99,117,114,
-115,111,114, 0,115, 99,101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0,112,105,118,111,116, 95,108, 97,115,116, 0,
-103,114,105,100, 0,110,101, 97,114, 0,102, 97,114, 0,103,114,105,100,108,105,110,101,115, 0,103,114,105,100,102,108, 97,103,
- 0,103,114,105,100,115,117, 98,100,105,118, 0,109,111,100,101,115,101,108,101, 99,116, 0,107,101,121,102,108, 97,103,115, 0,
-116,119,116,121,112,101, 0,116,119,109,111,100,101, 0,116,119,102,108, 97,103, 0, 97,102,116,101,114,100,114, 97,119, 95,116,
-114, 97,110,115,112, 0, 97,102,116,101,114,100,114, 97,119, 95,120,114, 97,121, 0, 97,102,116,101,114,100,114, 97,119, 95,120,
-114, 97,121,116,114, 97,110,115,112, 0,122, 98,117,102, 0,120,114, 97,121, 0,110,100,111,102,109,111,100,101, 0,110,100,111,
-102,102,105,108,116,101,114, 0, 42,112,114,111,112,101,114,116,105,101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116,
- 0,104,111,114, 0,109, 97,115,107, 0,109,105,110, 91, 50, 93, 0,109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,
-109, 97,120,122,111,111,109, 0,115, 99,114,111,108,108, 0,115, 99,114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116,
- 0,107,101,101,112,122,111,111,109, 0,107,101,101,112,111,102,115, 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,
-121, 0,111,108,100,119,105,110,120, 0,111,108,100,119,105,110,121, 0, 42,116, 97, 98, 95,111,102,102,115,101,116, 0,116, 97,
- 98, 95,110,117,109, 0,116, 97, 98, 95, 99,117,114, 0,114,112,116, 95,109, 97,115,107, 0,118, 50,100, 0, 42, 97,100,115, 0,
-103,104,111,115,116, 67,117,114,118,101,115, 0, 97,117,116,111,115,110, 97,112, 0, 99,117,114,115,111,114, 86, 97,108, 0,109,
- 97,105,110, 98, 0,109, 97,105,110, 98,111, 0,109, 97,105,110, 98,117,115,101,114, 0,114,101, 95, 97,108,105,103,110, 0,112,
-114,101,118,105,101,119, 0,112, 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, 0, 42,112,105,110,105,100, 0,
-114,101,110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, 0,122,101, 98,114, 97, 0,122,111,111,109,
- 0,116,105,116,108,101, 91, 51, 50, 93, 0,100,105,114, 91, 50, 52, 48, 93, 0,102,105,108,101, 91, 56, 48, 93, 0,114,101,110,
- 97,109,101,102,105,108,101, 91, 56, 48, 93, 0,114,101,110, 97,109,101,101,100,105,116, 91, 56, 48, 93, 0,102,105,108,116,101,
-114, 95,103,108,111, 98, 91, 54, 52, 93, 0,115,111,114,116, 0,100,105,115,112,108, 97,121, 0, 97, 99,116,105,118,101, 95, 98,
-111,111,107,109, 97,114,107, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 0,115,101,108,115,116, 97,116,101, 0,102, 95,102,
+ 68, 65, 84, 65, 0, 0, 0, 72, 4,213,137, 80, 0, 0, 0,187, 0, 0, 0, 1, 4,213,186,224, 4,213,136,224,105,111, 95,115,
+ 99,101,110,101, 95,102, 98,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 0, 0, 0, 72, 4,213,186,224, 0, 0, 0,187, 0, 0, 0, 1, 4,213,187, 80, 4,213,137, 80,105,111, 95, 97,110,105,109, 95,
+ 98,118,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 72,
+ 4,213,187, 80, 0, 0, 0,187, 0, 0, 0, 1, 4,213,187,192, 4,213,186,224,105,111, 95,109,101,115,104, 95,112,108,121, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 72, 4,213,187,192,
+ 0, 0, 0,187, 0, 0, 0, 1, 4,213,188, 48, 4,213,187, 80,105,111, 95,115, 99,101,110,101, 95,111, 98,106, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 72, 4,213,188, 48, 0, 0, 0,187,
+ 0, 0, 0, 1, 4,213,188,160, 4,213,187,192,105,111, 95,115, 99,101,110,101, 95,120, 51,100, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 72, 4,213,188,160, 0, 0, 0,187, 0, 0, 0, 1,
+ 4,213,189, 16, 4,213,188, 48,105,111, 95,109,101,115,104, 95,115,116,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 72, 4,213,189, 16, 0, 0, 0,187, 0, 0, 0, 1, 4,213,189,128,
+ 4,213,188,160,105,111, 95,109,101,115,104, 95,117,118, 95,108, 97,121,111,117,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 72, 4,213,189,128, 0, 0, 0,187, 0, 0, 0, 1, 0, 0, 0, 0, 4,213,189, 16,
+105,111, 95, 99,117,114,118,101, 95,115,118,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 78, 65, 49, 0, 0,229, 88, 3, 18, 32, 32, 0, 0, 0, 0, 0, 0, 0, 1, 83, 68, 78, 65, 78, 65, 77, 69, 0, 0, 12, 2,
+ 42,110,101,120,116, 0, 42,112,114,101,118, 0, 42,100, 97,116, 97, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120,
+ 0,121, 0,120,109,105,110, 0,120,109, 97,120, 0,121,109,105,110, 0,121,109, 97,120, 0, 42,112,111,105,110,116,101,114, 0,
+103,114,111,117,112, 0,118, 97,108, 0,118, 97,108, 50, 0,116,121,112,101, 0,115,117, 98,116,121,112,101, 0,102,108, 97,103,
+ 0,110, 97,109,101, 91, 51, 50, 93, 0,115, 97,118,101,100, 0,100, 97,116, 97, 0,108,101,110, 0,116,111,116, 97,108,108,101,
+110, 0, 42,110,101,119,105,100, 0, 42,108,105, 98, 0,110, 97,109,101, 91, 50, 52, 93, 0,117,115, 0,105, 99,111,110, 95,105,
+100, 0, 42,112,114,111,112,101,114,116,105,101,115, 0,105,100, 0, 42,105,100, 98,108,111, 99,107, 0, 42,102,105,108,101,100,
+ 97,116, 97, 0,110, 97,109,101, 91, 50, 52, 48, 93, 0,102,105,108,101,112, 97,116,104, 91, 50, 52, 48, 93, 0,116,111,116, 0,
+112, 97,100, 0, 42,112, 97,114,101,110,116, 0,119, 91, 50, 93, 0,104, 91, 50, 93, 0, 99,104, 97,110,103,101,100, 91, 50, 93,
+ 0, 99,104, 97,110,103,101,100, 95,116,105,109,101,115,116, 97,109,112, 91, 50, 93, 0, 42,114,101, 99,116, 91, 50, 93, 0, 42,
+111, 98, 0, 98,108,111, 99,107,116,121,112,101, 0, 97,100,114, 99,111,100,101, 0,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42,
+ 98,112, 0, 42, 98,101,122,116, 0,109, 97,120,114, 99,116, 0,116,111,116,114, 99,116, 0,118, 97,114,116,121,112,101, 0,116,
+111,116,118,101,114,116, 0,105,112,111, 0,101,120,116,114, 97,112, 0,114,116, 0, 98,105,116,109, 97,115,107, 0,115,108,105,
+100,101, 95,109,105,110, 0,115,108,105,100,101, 95,109, 97,120, 0, 99,117,114,118, 97,108, 0, 42,100,114,105,118,101,114, 0,
+ 99,117,114,118,101, 0, 99,117,114, 0,115,104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112,111,115, 0,114,101,
+108, 97,116,105,118,101, 0,116,111,116,101,108,101,109, 0,112, 97,100, 50, 0, 42,119,101,105,103,104,116,115, 0,118,103,114,
+111,117,112, 91, 51, 50, 93, 0,115,108,105,100,101,114,109,105,110, 0,115,108,105,100,101,114,109, 97,120, 0, 42, 97,100,116,
+ 0, 42,114,101,102,107,101,121, 0,101,108,101,109,115,116,114, 91, 51, 50, 93, 0,101,108,101,109,115,105,122,101, 0, 98,108,
+111, 99,107, 0, 42,105,112,111, 0, 42,102,114,111,109, 0,116,111,116,107,101,121, 0,115,108,117,114,112,104, 0, 42,108,105,
+110,101, 0, 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0,108,105,110,101,110,111, 0,115,116, 97,114,116, 0,101,110,100,
+ 0,112, 97,100, 49, 0,102,108, 97,103,115, 0, 99,111,108,111,114, 91, 52, 93, 0,112, 97,100, 91, 52, 93, 0, 42,110, 97,109,
+101, 0,110,108,105,110,101,115, 0,108,105,110,101,115, 0, 42, 99,117,114,108, 0, 42,115,101,108,108, 0, 99,117,114, 99, 0,
+115,101,108, 99, 0,109, 97,114,107,101,114,115, 0, 42,117,110,100,111, 95, 98,117,102, 0,117,110,100,111, 95,112,111,115, 0,
+117,110,100,111, 95,108,101,110, 0, 42, 99,111,109,112,105,108,101,100, 0,109,116,105,109,101, 0,115,105,122,101, 0,115,101,
+101,107, 0,112, 97,115,115,101,112, 97,114,116, 97,108,112,104, 97, 0, 99,108,105,112,115,116, 97, 0, 99,108,105,112,101,110,
+100, 0,108,101,110,115, 0,111,114,116,104,111, 95,115, 99, 97,108,101, 0,100,114, 97,119,115,105,122,101, 0,115,104,105,102,
+116,120, 0,115,104,105,102,116,121, 0, 89, 70, 95,100,111,102,100,105,115,116, 0, 42,100,111,102, 95,111, 98, 0, 42,115, 99,
+101,110,101, 0,102,114, 97,109,101,110,114, 0,102,114, 97,109,101,115, 0,111,102,102,115,101,116, 0,115,102,114, 97, 0,102,
+105,101, 95,105,109, 97, 0, 99,121, 99,108, 0,111,107, 0,109,117,108,116,105, 95,105,110,100,101,120, 0,108, 97,121,101,114,
+ 0,112, 97,115,115, 0,105, 98,117,102,115, 0, 42,103,112,117,116,101,120,116,117,114,101, 0, 42, 97,110,105,109, 0, 42,114,
+114, 0, 42,114,101,110,100,101,114,115, 91, 56, 93, 0,114,101,110,100,101,114, 95,115,108,111,116, 0,108, 97,115,116, 95,114,
+101,110,100,101,114, 95,115,108,111,116, 0,115,111,117,114, 99,101, 0,108, 97,115,116,102,114, 97,109,101, 0,116,112, 97,103,
+101,102,108, 97,103, 0,116,111,116, 98,105,110,100, 0,120,114,101,112, 0,121,114,101,112, 0,116,119,115,116, 97, 0,116,119,
+101,110,100, 0, 98,105,110,100, 99,111,100,101, 0, 42,114,101,112, 98,105,110,100, 0, 42,112, 97, 99,107,101,100,102,105,108,
+101, 0, 42,112,114,101,118,105,101,119, 0,108, 97,115,116,117,112,100, 97,116,101, 0,108, 97,115,116,117,115,101,100, 0, 97,
+110,105,109,115,112,101,101,100, 0,103,101,110, 95,120, 0,103,101,110, 95,121, 0,103,101,110, 95,116,121,112,101, 0, 97,115,
+112,120, 0, 97,115,112,121, 0,116,101,120, 99,111, 0,109, 97,112,116,111, 0,109, 97,112,116,111,110,101,103, 0, 98,108,101,
+110,100,116,121,112,101, 0, 42,111, 98,106,101, 99,116, 0, 42,116,101,120, 0,117,118,110, 97,109,101, 91, 51, 50, 93, 0,112,
+114,111,106,120, 0,112,114,111,106,121, 0,112,114,111,106,122, 0,109, 97,112,112,105,110,103, 0,111,102,115, 91, 51, 93, 0,
+115,105,122,101, 91, 51, 93, 0,114,111,116, 0,116,101,120,102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,108, 0,112,
+109, 97,112,116,111, 0,112,109, 97,112,116,111,110,101,103, 0,110,111,114,109, 97,112,115,112, 97, 99,101, 0,119,104,105, 99,
+104, 95,111,117,116,112,117,116, 0, 98,114,117,115,104, 95,109, 97,112, 95,109,111,100,101, 0,112, 97,100, 91, 55, 93, 0,114,
+ 0,103, 0, 98, 0,107, 0,100,101,102, 95,118, 97,114, 0, 99,111,108,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,110,111,114,
+102, 97, 99, 0,100,105,115,112,102, 97, 99, 0,119, 97,114,112,102, 97, 99, 0, 99,111,108,115,112,101, 99,102, 97, 99, 0,109,
+105,114,114,102, 97, 99, 0, 97,108,112,104, 97,102, 97, 99, 0,100,105,102,102,102, 97, 99, 0,115,112,101, 99,102, 97, 99, 0,
+101,109,105,116,102, 97, 99, 0,104, 97,114,100,102, 97, 99, 0,114, 97,121,109,105,114,114,102, 97, 99, 0,116,114, 97,110,115,
+108,102, 97, 99, 0, 97,109, 98,102, 97, 99, 0, 99,111,108,101,109,105,116,102, 97, 99, 0, 99,111,108,114,101,102,108,102, 97,
+ 99, 0, 99,111,108,116,114, 97,110,115,102, 97, 99, 0,100,101,110,115,102, 97, 99, 0,115, 99, 97,116,116,101,114,102, 97, 99,
+ 0,114,101,102,108,102, 97, 99, 0,116,105,109,101,102, 97, 99, 0,108,101,110,103,116,104,102, 97, 99, 0, 99,108,117,109,112,
+102, 97, 99, 0,100, 97,109,112,102, 97, 99, 0,107,105,110,107,102, 97, 99, 0,114,111,117,103,104,102, 97, 99, 0,112, 97,100,
+101,110,115,102, 97, 99, 0,103,114, 97,118,105,116,121,102, 97, 99, 0,108,105,102,101,102, 97, 99, 0,115,105,122,101,102, 97,
+ 99, 0,105,118,101,108,102, 97, 99, 0,102,105,101,108,100,102, 97, 99, 0,115,104, 97,100,111,119,102, 97, 99, 0,122,101,110,
+117,112,102, 97, 99, 0,122,101,110,100,111,119,110,102, 97, 99, 0, 98,108,101,110,100,102, 97, 99, 0,110, 97,109,101, 91, 49,
+ 54, 48, 93, 0, 42,104, 97,110,100,108,101, 0, 42,112,110, 97,109,101, 0, 42,115,116,110, 97,109,101,115, 0,115,116,121,112,
+101,115, 0,118, 97,114,115, 0, 42,118, 97,114,115,116,114, 0, 42,114,101,115,117,108,116, 0, 42, 99,102,114, 97, 0,100, 97,
+116, 97, 91, 51, 50, 93, 0, 40, 42,100,111,105,116, 41, 40, 41, 0, 40, 42,105,110,115,116, 97,110, 99,101, 95,105,110,105,116,
+ 41, 40, 41, 0, 40, 42, 99, 97,108,108, 98, 97, 99,107, 41, 40, 41, 0,118,101,114,115,105,111,110, 0, 97, 0,105,112,111,116,
+121,112,101, 0, 42,105,109, 97, 0, 42, 99,117, 98,101, 91, 54, 93, 0,105,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111, 98,105,
+109, 97,116, 91, 51, 93, 91, 51, 93, 0,115,116,121,112,101, 0,118,105,101,119,115, 99, 97,108,101, 0,110,111,116,108, 97,121,
+ 0, 99,117, 98,101,114,101,115, 0,100,101,112,116,104, 0,114,101, 99, 97,108, 99, 0,108, 97,115,116,115,105,122,101, 0,102,
+ 97,108,108,111,102,102, 95,116,121,112,101, 0,102, 97,108,108,111,102,102, 95,115,111,102,116,110,101,115,115, 0,114, 97,100,
+105,117,115, 0, 99,111,108,111,114, 95,115,111,117,114, 99,101, 0,116,111,116,112,111,105,110,116,115, 0,112,100,112, 97,100,
+ 0,112,115,121,115, 0,112,115,121,115, 95, 99, 97, 99,104,101, 95,115,112, 97, 99,101, 0,111, 98, 95, 99, 97, 99,104,101, 95,
+115,112, 97, 99,101, 0, 42,112,111,105,110,116, 95,116,114,101,101, 0, 42,112,111,105,110,116, 95,100, 97,116, 97, 0,110,111,
+105,115,101, 95,115,105,122,101, 0,110,111,105,115,101, 95,100,101,112,116,104, 0,110,111,105,115,101, 95,105,110,102,108,117,
+101,110, 99,101, 0,110,111,105,115,101, 95, 98, 97,115,105,115, 0,112,100,112, 97,100, 51, 91, 51, 93, 0,110,111,105,115,101,
+ 95,102, 97, 99, 0,115,112,101,101,100, 95,115, 99, 97,108,101, 0, 42, 99,111, 98, 97, 0,114,101,115,111,108, 91, 51, 93, 0,
+105,110,116,101,114,112, 95,116,121,112,101, 0,102,105,108,101, 95,102,111,114,109, 97,116, 0,101,120,116,101,110,100, 0,115,
+109,111,107,101,100, 95,116,121,112,101, 0,105,110,116, 95,109,117,108,116,105,112,108,105,101,114, 0,115,116,105,108,108, 95,
+102,114, 97,109,101, 0,115,111,117,114, 99,101, 95,112, 97,116,104, 91, 50, 52, 48, 93, 0, 42,100, 97,116, 97,115,101,116, 0,
+ 99, 97, 99,104,101,100,102,114, 97,109,101, 0,110,111,105,115,101,115,105,122,101, 0,116,117,114, 98,117,108, 0, 98,114,105,
+103,104,116, 0, 99,111,110,116,114, 97,115,116, 0,115, 97,116,117,114, 97,116,105,111,110, 0,114,102, 97, 99, 0,103,102, 97,
+ 99, 0, 98,102, 97, 99, 0,102,105,108,116,101,114,115,105,122,101, 0,109,103, 95, 72, 0,109,103, 95,108, 97, 99,117,110, 97,
+114,105,116,121, 0,109,103, 95,111, 99,116, 97,118,101,115, 0,109,103, 95,111,102,102,115,101,116, 0,109,103, 95,103, 97,105,
+110, 0,100,105,115,116, 95, 97,109,111,117,110,116, 0,110,115, 95,111,117,116,115, 99, 97,108,101, 0,118,110, 95,119, 49, 0,
+118,110, 95,119, 50, 0,118,110, 95,119, 51, 0,118,110, 95,119, 52, 0,118,110, 95,109,101,120,112, 0,118,110, 95,100,105,115,
+116,109, 0,118,110, 95, 99,111,108,116,121,112,101, 0,110,111,105,115,101,100,101,112,116,104, 0,110,111,105,115,101,116,121,
+112,101, 0,110,111,105,115,101, 98, 97,115,105,115, 0,110,111,105,115,101, 98, 97,115,105,115, 50, 0,105,109, 97,102,108, 97,
+103, 0, 99,114,111,112,120,109,105,110, 0, 99,114,111,112,121,109,105,110, 0, 99,114,111,112,120,109, 97,120, 0, 99,114,111,
+112,121,109, 97,120, 0,116,101,120,102,105,108,116,101,114, 0, 97,102,109, 97,120, 0,120,114,101,112,101, 97,116, 0,121,114,
+101,112,101, 97,116, 0, 99,104,101, 99,107,101,114,100,105,115,116, 0,110, 97, 98,108, 97, 0,105,117,115,101,114, 0, 42,110,
+111,100,101,116,114,101,101, 0, 42,112,108,117,103,105,110, 0, 42,101,110,118, 0, 42,112,100, 0, 42,118,100, 0,117,115,101,
+ 95,110,111,100,101,115, 0,108,111, 99, 91, 51, 93, 0,114,111,116, 91, 51, 93, 0,109, 97,116, 91, 52, 93, 91, 52, 93, 0,109,
+105,110, 91, 51, 93, 0,109, 97,120, 91, 51, 93, 0,109,111,100,101, 0,116,111,116,101,120, 0,115,104,100,119,114, 0,115,104,
+100,119,103, 0,115,104,100,119, 98, 0,115,104,100,119,112, 97,100, 0,101,110,101,114,103,121, 0,100,105,115,116, 0,115,112,
+111,116,115,105,122,101, 0,115,112,111,116, 98,108,101,110,100, 0,104, 97,105,110,116, 0, 97,116,116, 49, 0, 97,116,116, 50,
+ 0, 42, 99,117,114,102, 97,108,108,111,102,102, 0,115,104, 97,100,115,112,111,116,115,105,122,101, 0, 98,105, 97,115, 0,115,
+111,102,116, 0, 99,111,109,112,114,101,115,115,116,104,114,101,115,104, 0,112, 97,100, 53, 91, 51, 93, 0, 98,117,102,115,105,
+122,101, 0,115, 97,109,112, 0, 98,117,102,102,101,114,115, 0,102,105,108,116,101,114,116,121,112,101, 0, 98,117,102,102,108,
+ 97,103, 0, 98,117,102,116,121,112,101, 0,114, 97,121, 95,115, 97,109,112, 0,114, 97,121, 95,115, 97,109,112,121, 0,114, 97,
+121, 95,115, 97,109,112,122, 0,114, 97,121, 95,115, 97,109,112, 95,116,121,112,101, 0, 97,114,101, 97, 95,115,104, 97,112,101,
+ 0, 97,114,101, 97, 95,115,105,122,101, 0, 97,114,101, 97, 95,115,105,122,101,121, 0, 97,114,101, 97, 95,115,105,122,101,122,
+ 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 0,114, 97,121, 95,115, 97,109,112, 95,109,101,116,104,111,100, 0,116,101,
+120, 97, 99,116, 0,115,104, 97,100,104, 97,108,111,115,116,101,112, 0,115,117,110, 95,101,102,102,101, 99,116, 95,116,121,112,
+101, 0,115,107,121, 98,108,101,110,100,116,121,112,101, 0,104,111,114,105,122,111,110, 95, 98,114,105,103,104,116,110,101,115,
+115, 0,115,112,114,101, 97,100, 0,115,117,110, 95, 98,114,105,103,104,116,110,101,115,115, 0,115,117,110, 95,115,105,122,101,
+ 0, 98, 97, 99,107,115, 99, 97,116,116,101,114,101,100, 95,108,105,103,104,116, 0,115,117,110, 95,105,110,116,101,110,115,105,
+116,121, 0, 97,116,109, 95,116,117,114, 98,105,100,105,116,121, 0, 97,116,109, 95,105,110,115, 99, 97,116,116,101,114,105,110,
+103, 95,102, 97, 99,116,111,114, 0, 97,116,109, 95,101,120,116,105,110, 99,116,105,111,110, 95,102, 97, 99,116,111,114, 0, 97,
+116,109, 95,100,105,115,116, 97,110, 99,101, 95,102, 97, 99,116,111,114, 0,115,107,121, 98,108,101,110,100,102, 97, 99, 0,115,
+107,121, 95,101,120,112,111,115,117,114,101, 0,115,107,121, 95, 99,111,108,111,114,115,112, 97, 99,101, 0,112, 97,100, 52, 91,
+ 54, 93, 0, 42,109,116,101,120, 91, 49, 56, 93, 0,112,114, 95,116,101,120,116,117,114,101, 0,112, 97,100, 54, 91, 54, 93, 0,
+100,101,110,115,105,116,121, 0,101,109,105,115,115,105,111,110, 0,115, 99, 97,116,116,101,114,105,110,103, 0,114,101,102,108,
+101, 99,116,105,111,110, 0,101,109,105,115,115,105,111,110, 95, 99,111,108, 91, 51, 93, 0,116,114, 97,110,115,109,105,115,115,
+105,111,110, 95, 99,111,108, 91, 51, 93, 0,114,101,102,108,101, 99,116,105,111,110, 95, 99,111,108, 91, 51, 93, 0,100,101,110,
+115,105,116,121, 95,115, 99, 97,108,101, 0,100,101,112,116,104, 95, 99,117,116,111,102,102, 0, 97,115,121,109,109,101,116,114,
+121, 0,115,116,101,112,115,105,122,101, 95,116,121,112,101, 0,115,104, 97,100,101,102,108, 97,103, 0,115,104, 97,100,101, 95,
+116,121,112,101, 0,112,114,101, 99, 97, 99,104,101, 95,114,101,115,111,108,117,116,105,111,110, 0,115,116,101,112,115,105,122,
+101, 0,109,115, 95,100,105,102,102, 0,109,115, 95,105,110,116,101,110,115,105,116,121, 0,109,115, 95,115,112,114,101, 97,100,
+ 0,109, 97,116,101,114,105, 97,108, 95,116,121,112,101, 0,115,112,101, 99,114, 0,115,112,101, 99,103, 0,115,112,101, 99, 98,
+ 0,109,105,114,114, 0,109,105,114,103, 0,109,105,114, 98, 0, 97,109, 98,114, 0, 97,109, 98, 98, 0, 97,109, 98,103, 0, 97,
+109, 98, 0,101,109,105,116, 0, 97,110,103, 0,115,112,101, 99,116,114, 97, 0,114, 97,121, 95,109,105,114,114,111,114, 0, 97,
+108,112,104, 97, 0,114,101,102, 0,115,112,101, 99, 0,122,111,102,102,115, 0, 97,100,100, 0,116,114, 97,110,115,108,117, 99,
+101,110, 99,121, 0,118,111,108, 0,102,114,101,115,110,101,108, 95,109,105,114, 0,102,114,101,115,110,101,108, 95,109,105,114,
+ 95,105, 0,102,114,101,115,110,101,108, 95,116,114, 97, 0,102,114,101,115,110,101,108, 95,116,114, 97, 95,105, 0,102,105,108,
+116,101,114, 0,116,120, 95,108,105,109,105,116, 0,116,120, 95,102, 97,108,108,111,102,102, 0,114, 97,121, 95,100,101,112,116,
+104, 0,114, 97,121, 95,100,101,112,116,104, 95,116,114, 97, 0,104, 97,114, 0,115,101,101,100, 49, 0,115,101,101,100, 50, 0,
+103,108,111,115,115, 95,109,105,114, 0,103,108,111,115,115, 95,116,114, 97, 0,115, 97,109,112, 95,103,108,111,115,115, 95,109,
+105,114, 0,115, 97,109,112, 95,103,108,111,115,115, 95,116,114, 97, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,109,
+105,114, 0, 97,100, 97,112,116, 95,116,104,114,101,115,104, 95,116,114, 97, 0, 97,110,105,115,111, 95,103,108,111,115,115, 95,
+109,105,114, 0,100,105,115,116, 95,109,105,114, 0,102, 97,100,101,116,111, 95,109,105,114, 0,115,104, 97,100,101, 95,102,108,
+ 97,103, 0,109,111,100,101, 95,108, 0,102,108, 97,114,101, 99, 0,115,116, 97,114, 99, 0,108,105,110,101, 99, 0,114,105,110,
+103, 99, 0,104, 97,115,105,122,101, 0,102,108, 97,114,101,115,105,122,101, 0,115,117, 98,115,105,122,101, 0,102,108, 97,114,
+101, 98,111,111,115,116, 0,115,116,114, 97,110,100, 95,115,116, 97, 0,115,116,114, 97,110,100, 95,101,110,100, 0,115,116,114,
+ 97,110,100, 95,101, 97,115,101, 0,115,116,114, 97,110,100, 95,115,117,114,102,110,111,114, 0,115,116,114, 97,110,100, 95,109,
+105,110, 0,115,116,114, 97,110,100, 95,119,105,100,116,104,102, 97,100,101, 0,115,116,114, 97,110,100, 95,117,118,110, 97,109,
+101, 91, 51, 50, 93, 0,115, 98,105, 97,115, 0,108, 98,105, 97,115, 0,115,104, 97,100, 95, 97,108,112,104, 97, 0,115,101,112,
+116,101,120, 0,114,103, 98,115,101,108, 0,112,114, 95,116,121,112,101, 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,
+109,112, 0,109,108, 95,102,108, 97,103, 0,100,105,102,102, 95,115,104, 97,100,101,114, 0,115,112,101, 99, 95,115,104, 97,100,
+101,114, 0,114,111,117,103,104,110,101,115,115, 0,114,101,102,114, 97, 99, 0,112, 97,114, 97,109, 91, 52, 93, 0,114,109,115,
+ 0,100, 97,114,107,110,101,115,115, 0, 42,114, 97,109,112, 95, 99,111,108, 0, 42,114, 97,109,112, 95,115,112,101, 99, 0,114,
+ 97,109,112,105,110, 95, 99,111,108, 0,114, 97,109,112,105,110, 95,115,112,101, 99, 0,114, 97,109,112, 98,108,101,110,100, 95,
+ 99,111,108, 0,114, 97,109,112, 98,108,101,110,100, 95,115,112,101, 99, 0,114, 97,109,112, 95,115,104,111,119, 0,112, 97,100,
+ 51, 0,114, 97,109,112,102, 97, 99, 95, 99,111,108, 0,114, 97,109,112,102, 97, 99, 95,115,112,101, 99, 0, 42,103,114,111,117,
+112, 0,102,114,105, 99,116,105,111,110, 0,102,104, 0,114,101,102,108,101, 99,116, 0,102,104,100,105,115,116, 0,120,121,102,
+114,105, 99,116, 0,100,121,110, 97,109,111,100,101, 0,115,115,115, 95,114, 97,100,105,117,115, 91, 51, 93, 0,115,115,115, 95,
+ 99,111,108, 91, 51, 93, 0,115,115,115, 95,101,114,114,111,114, 0,115,115,115, 95,115, 99, 97,108,101, 0,115,115,115, 95,105,
+111,114, 0,115,115,115, 95, 99,111,108,102, 97, 99, 0,115,115,115, 95,116,101,120,102, 97, 99, 0,115,115,115, 95,102,114,111,
+110,116, 0,115,115,115, 95, 98, 97, 99,107, 0,115,115,115, 95,102,108, 97,103, 0,115,115,115, 95,112,114,101,115,101,116, 0,
+109, 97,112,116,111, 95,116,101,120,116,117,114,101,100, 0,115,104, 97,100,111,119,111,110,108,121, 95,102,108, 97,103, 0,103,
+112,117,109, 97,116,101,114,105, 97,108, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0, 42, 98, 98, 0,105, 49, 0,106, 49, 0,107,
+ 49, 0,105, 50, 0,106, 50, 0,107, 50, 0,115,101,108, 99,111,108, 49, 0,115,101,108, 99,111,108, 50, 0,122, 0,113,117, 97,
+116, 91, 52, 93, 0,101,120,112,120, 0,101,120,112,121, 0,101,120,112,122, 0,114, 97,100, 0,114, 97,100, 50, 0,115, 0, 42,
+109, 97,116, 0, 42,105,109, 97,116, 0,101,108,101,109,115, 0,100,105,115,112, 0, 42,101,100,105,116,101,108,101,109,115, 0,
+ 42, 42,109, 97,116, 0,102,108, 97,103, 50, 0,116,111,116, 99,111,108, 0,119,105,114,101,115,105,122,101, 0,114,101,110,100,
+101,114,115,105,122,101, 0,116,104,114,101,115,104, 0, 42,108, 97,115,116,101,108,101,109, 0,118,101, 99, 91, 51, 93, 91, 51,
+ 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,104, 49, 0,104, 50, 0,102, 49, 0,102, 50, 0,102, 51, 0,104,105,100,
+101, 0,118,101, 99, 91, 52, 93, 0,109, 97,116, 95,110,114, 0,112,110,116,115,117, 0,112,110,116,115,118, 0,114,101,115,111,
+108,117, 0,114,101,115,111,108,118, 0,111,114,100,101,114,117, 0,111,114,100,101,114,118, 0,102,108, 97,103,117, 0,102,108,
+ 97,103,118, 0, 42,107,110,111,116,115,117, 0, 42,107,110,111,116,115,118, 0,116,105,108,116, 95,105,110,116,101,114,112, 0,
+114, 97,100,105,117,115, 95,105,110,116,101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,101,114,110, 0,119, 0,104, 0,110,
+117,114, 98,115, 0, 42,107,101,121,105,110,100,101,120, 0,115,104, 97,112,101,110,114, 0,110,117,114, 98, 0, 42,101,100,105,
+116,110,117,114, 98, 0, 42, 98,101,118,111, 98,106, 0, 42,116, 97,112,101,114,111, 98,106, 0, 42,116,101,120,116,111,110, 99,
+117,114,118,101, 0, 42,112, 97,116,104, 0, 42,107,101,121, 0, 98,101,118, 0,100,114, 97,119,102,108, 97,103, 0,116,119,105,
+115,116, 95,109,111,100,101, 0,116,119,105,115,116, 95,115,109,111,111,116,104, 0,115,109, 97,108,108, 99, 97,112,115, 95,115,
+ 99, 97,108,101, 0,112, 97,116,104,108,101,110, 0, 98,101,118,114,101,115,111,108, 0,119,105,100,116,104, 0,101,120,116, 49,
+ 0,101,120,116, 50, 0,114,101,115,111,108,117, 95,114,101,110, 0,114,101,115,111,108,118, 95,114,101,110, 0, 97, 99,116,110,
+117, 0, 42,108, 97,115,116,115,101,108, 0,115,112, 97, 99,101,109,111,100,101, 0,115,112, 97, 99,105,110,103, 0,108,105,110,
+101,100,105,115,116, 0,115,104,101, 97,114, 0,102,115,105,122,101, 0,119,111,114,100,115,112, 97, 99,101, 0,117,108,112,111,
+115, 0,117,108,104,101,105,103,104,116, 0,120,111,102, 0,121,111,102, 0,108,105,110,101,119,105,100,116,104, 0, 42,115,116,
+114, 0, 42,115,101,108, 98,111,120,101,115, 0, 42,101,100,105,116,102,111,110,116, 0,102, 97,109,105,108,121, 91, 50, 52, 93,
+ 0, 42,118,102,111,110,116, 0, 42,118,102,111,110,116, 98, 0, 42,118,102,111,110,116,105, 0, 42,118,102,111,110,116, 98,105,
+ 0,115,101,112, 99,104, 97,114, 0, 99,116,105,109,101, 0,116,111,116, 98,111,120, 0, 97, 99,116, 98,111,120, 0, 42,116, 98,
+ 0,115,101,108,115,116, 97,114,116, 0,115,101,108,101,110,100, 0, 42,115,116,114,105,110,102,111, 0, 99,117,114,105,110,102,
+111, 0, 42,109,102, 97, 99,101, 0, 42,109,116,102, 97, 99,101, 0, 42,116,102, 97, 99,101, 0, 42,109,118,101,114,116, 0, 42,
+109,101,100,103,101, 0, 42,100,118,101,114,116, 0, 42,109, 99,111,108, 0, 42,109,115,116,105, 99,107,121, 0, 42,116,101,120,
+ 99,111,109,101,115,104, 0, 42,109,115,101,108,101, 99,116, 0, 42,101,100,105,116, 95,109,101,115,104, 0,118,100, 97,116, 97,
+ 0,101,100, 97,116, 97, 0,102,100, 97,116, 97, 0,116,111,116,101,100,103,101, 0,116,111,116,102, 97, 99,101, 0,116,111,116,
+115,101,108,101, 99,116, 0, 97, 99,116, 95,102, 97, 99,101, 0,115,109,111,111,116,104,114,101,115,104, 0,115,117, 98,100,105,
+118, 0,115,117, 98,100,105,118,114, 0,115,117, 98,115,117,114,102,116,121,112,101, 0,101,100,105,116,102,108, 97,103, 0, 42,
+109,114, 0, 42,112,118, 0, 42,116,112, 97,103,101, 0,117,118, 91, 52, 93, 91, 50, 93, 0, 99,111,108, 91, 52, 93, 0,116,114,
+ 97,110,115,112, 0,116,105,108,101, 0,117,110,119,114, 97,112, 0,118, 49, 0,118, 50, 0,118, 51, 0,118, 52, 0,101,100, 99,
+111,100,101, 0, 99,114,101, 97,115,101, 0, 98,119,101,105,103,104,116, 0,100,101,102, 95,110,114, 0, 42,100,119, 0,116,111,
+116,119,101,105,103,104,116, 0, 99,111, 91, 51, 93, 0,110,111, 91, 51, 93, 0,117,118, 91, 50, 93, 0, 99,111, 91, 50, 93, 0,
+105,110,100,101,120, 0,102, 0,105, 0,115, 91, 50, 53, 54, 93, 0,116,111,116,100,105,115,112, 0, 40, 42,100,105,115,112,115,
+ 41, 40, 41, 0,118, 91, 52, 93, 0,109,105,100, 0,112, 97,100, 91, 50, 93, 0,118, 91, 50, 93, 0, 42,102, 97, 99,101,115, 0,
+ 42, 99,111,108,102, 97, 99,101,115, 0, 42,101,100,103,101,115, 0, 42,118,101,114,116,115, 0,108,101,118,101,108,115, 0,108,
+101,118,101,108, 95, 99,111,117,110,116, 0, 99,117,114,114,101,110,116, 0,110,101,119,108,118,108, 0,101,100,103,101,108,118,
+108, 0,112,105,110,108,118,108, 0,114,101,110,100,101,114,108,118,108, 0,117,115,101, 95, 99,111,108, 0, 42,101,100,103,101,
+ 95,102,108, 97,103,115, 0, 42,101,100,103,101, 95, 99,114,101, 97,115,101,115, 0, 42,118,101,114,116, 95,109, 97,112, 0, 42,
+101,100,103,101, 95,109, 97,112, 0, 42,111,108,100, 95,102, 97, 99,101,115, 0, 42,111,108,100, 95,101,100,103,101,115, 0,115,
+116, 97, 99,107,105,110,100,101,120, 0, 42,101,114,114,111,114, 0,109,111,100,105,102,105,101,114, 0,115,117, 98,100,105,118,
+ 84,121,112,101, 0,114,101,110,100,101,114, 76,101,118,101,108,115, 0, 42,101,109, 67, 97, 99,104,101, 0, 42,109, 67, 97, 99,
+104,101, 0,100,101,102, 97,120,105,115, 0,112, 97,100, 91, 54, 93, 0,108,101,110,103,116,104, 0,114, 97,110,100,111,109,105,
+122,101, 0,115,101,101,100, 0, 42,111, 98, 95, 97,114,109, 0, 42,115,116, 97,114,116, 95, 99, 97,112, 0, 42,101,110,100, 95,
+ 99, 97,112, 0, 42, 99,117,114,118,101, 95,111, 98, 0, 42,111,102,102,115,101,116, 95,111, 98, 0,111,102,102,115,101,116, 91,
+ 51, 93, 0,115, 99, 97,108,101, 91, 51, 93, 0,109,101,114,103,101, 95,100,105,115,116, 0,102,105,116, 95,116,121,112,101, 0,
+111,102,102,115,101,116, 95,116,121,112,101, 0, 99,111,117,110,116, 0, 97,120,105,115, 0,116,111,108,101,114, 97,110, 99,101,
+ 0, 42,109,105,114,114,111,114, 95,111, 98, 0,115,112,108,105,116, 95, 97,110,103,108,101, 0,118, 97,108,117,101, 0,114,101,
+115, 0,118, 97,108, 95,102,108, 97,103,115, 0,108,105,109, 95,102,108, 97,103,115, 0,101, 95,102,108, 97,103,115, 0, 98,101,
+118,101,108, 95, 97,110,103,108,101, 0,100,101,102,103,114,112, 95,110, 97,109,101, 91, 51, 50, 93, 0, 42,100,111,109, 97,105,
+110, 0, 42,102,108,111,119, 0, 42, 99,111,108,108, 0,116,105,109,101, 0, 42,116,101,120,116,117,114,101, 0,115,116,114,101,
+110,103,116,104, 0,100,105,114,101, 99,116,105,111,110, 0,109,105,100,108,101,118,101,108, 0,116,101,120,109, 97,112,112,105,
+110,103, 0, 42,109, 97,112, 95,111, 98,106,101, 99,116, 0,117,118,108, 97,121,101,114, 95,110, 97,109,101, 91, 51, 50, 93, 0,
+117,118,108, 97,121,101,114, 95,116,109,112, 0, 42,112,114,111,106,101, 99,116,111,114,115, 91, 49, 48, 93, 0, 42,105,109, 97,
+103,101, 0,110,117,109, 95,112,114,111,106,101, 99,116,111,114,115, 0, 97,115,112,101, 99,116,120, 0, 97,115,112,101, 99,116,
+121, 0,115, 99, 97,108,101,120, 0,115, 99, 97,108,101,121, 0,112,101,114, 99,101,110,116, 0,102, 97, 99,101, 67,111,117,110,
+116, 0,102, 97, 99, 0,114,101,112,101, 97,116, 0, 42,111, 98,106,101, 99,116, 99,101,110,116,101,114, 0,115,116, 97,114,116,
+120, 0,115,116, 97,114,116,121, 0,104,101,105,103,104,116, 0,110, 97,114,114,111,119, 0,115,112,101,101,100, 0,100, 97,109,
+112, 0,102, 97,108,108,111,102,102, 0,116,105,109,101,111,102,102,115, 0,108,105,102,101,116,105,109,101, 0,100,101,102,111,
+114,109,102,108, 97,103, 0,109,117,108,116,105, 0, 42,112,114,101,118, 67,111,115, 0,115,117, 98,116, 97,114,103,101,116, 91,
+ 51, 50, 93, 0,112, 97,114,101,110,116,105,110,118, 91, 52, 93, 91, 52, 93, 0, 99,101,110,116, 91, 51, 93, 0, 42,105,110,100,
+101,120, 97,114, 0,116,111,116,105,110,100,101,120, 0,102,111,114, 99,101, 0, 42, 99,108,111,116,104, 79, 98,106,101, 99,116,
+ 0, 42,115,105,109, 95,112, 97,114,109,115, 0, 42, 99,111,108,108, 95,112, 97,114,109,115, 0, 42,112,111,105,110,116, 95, 99,
+ 97, 99,104,101, 0,112,116, 99, 97, 99,104,101,115, 0, 42,120, 0, 42,120,110,101,119, 0, 42,120,111,108,100, 0, 42, 99,117,
+114,114,101,110,116, 95,120,110,101,119, 0, 42, 99,117,114,114,101,110,116, 95,120, 0, 42, 99,117,114,114,101,110,116, 95,118,
+ 0, 42,109,102, 97, 99,101,115, 0,110,117,109,118,101,114,116,115, 0,110,117,109,102, 97, 99,101,115, 0,116,105,109,101, 95,
+120, 0,116,105,109,101, 95,120,110,101,119, 0, 42, 98,118,104,116,114,101,101, 0, 42,118, 0, 42,100,109, 0, 99,102,114, 97,
+ 0,111,112,101,114, 97,116,105,111,110, 0,118,101,114,116,101,120, 0,116,111,116,105,110,102,108,117,101,110, 99,101, 0,103,
+114,105,100,115,105,122,101, 0, 42, 98,105,110,100,105,110,102,108,117,101,110, 99,101,115, 0, 42, 98,105,110,100,111,102,102,
+115,101,116,115, 0, 42, 98,105,110,100, 99, 97,103,101, 99,111,115, 0,116,111,116, 99, 97,103,101,118,101,114,116, 0, 42,100,
+121,110,103,114,105,100, 0, 42,100,121,110,105,110,102,108,117,101,110, 99,101,115, 0, 42,100,121,110,118,101,114,116,115, 0,
+ 42,112, 97,100, 50, 0,100,121,110,103,114,105,100,115,105,122,101, 0,100,121,110, 99,101,108,108,109,105,110, 91, 51, 93, 0,
+100,121,110, 99,101,108,108,119,105,100,116,104, 0, 98,105,110,100,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 42, 98,105,110,100,
+119,101,105,103,104,116,115, 0, 42, 98,105,110,100, 99,111,115, 0, 40, 42, 98,105,110,100,102,117,110, 99, 41, 40, 41, 0, 42,
+112,115,121,115, 0,116,111,116,100,109,118,101,114,116, 0,116,111,116,100,109,101,100,103,101, 0,116,111,116,100,109,102, 97,
+ 99,101, 0,112,111,115,105,116,105,111,110, 0,114, 97,110,100,111,109, 95,112,111,115,105,116,105,111,110, 0, 42,102, 97, 99,
+101,112, 97, 0,118,103,114,111,117,112, 0,112,114,111,116,101, 99,116, 0,108,118,108, 0,115, 99,117,108,112,116,108,118,108,
+ 0,116,111,116,108,118,108, 0,115,105,109,112,108,101, 0, 42,102,115,115, 0, 42,116, 97,114,103,101,116, 0, 42, 97,117,120,
+ 84, 97,114,103,101,116, 0,118,103,114,111,117,112, 95,110, 97,109,101, 91, 51, 50, 93, 0,107,101,101,112, 68,105,115,116, 0,
+115,104,114,105,110,107, 84,121,112,101, 0,115,104,114,105,110,107, 79,112,116,115, 0,112,114,111,106, 65,120,105,115, 0,115,
+117, 98,115,117,114,102, 76,101,118,101,108,115, 0, 42,111,114,105,103,105,110, 0,102, 97, 99,116,111,114, 0,108,105,109,105,
+116, 91, 50, 93, 0,111,114,105,103,105,110, 79,112,116,115, 0,111,102,102,115,101,116, 95,102, 97, 99, 0, 99,114,101, 97,115,
+101, 95,105,110,110,101,114, 0, 99,114,101, 97,115,101, 95,111,117,116,101,114, 0, 99,114,101, 97,115,101, 95,114,105,109, 0,
+109, 97,116, 95,111,102,115, 0,109, 97,116, 95,111,102,115, 95,114,105,109, 0, 42,111, 98, 95, 97,120,105,115, 0,115,116,101,
+112,115, 0,114,101,110,100,101,114, 95,115,116,101,112,115, 0,105,116,101,114, 0,115, 99,114,101,119, 95,111,102,115, 0, 97,
+110,103,108,101, 0, 42,108, 97,116,116, 0,112,110,116,115,119, 0,111,112,110,116,115,117, 0,111,112,110,116,115,118, 0,111,
+112,110,116,115,119, 0,116,121,112,101,117, 0,116,121,112,101,118, 0,116,121,112,101,119, 0,102,117, 0,102,118, 0,102,119,
+ 0,100,117, 0,100,118, 0,100,119, 0, 42,100,101,102, 0, 42,108, 97,116,116,105, 99,101,100, 97,116, 97, 0,108, 97,116,109,
+ 97,116, 91, 52, 93, 91, 52, 93, 0, 42,101,100,105,116,108, 97,116,116, 0,118,101, 99, 91, 56, 93, 91, 51, 93, 0, 42,115, 99,
+117,108,112,116, 0,112, 97,114,116,121,112,101, 0,112, 97,114, 49, 0,112, 97,114, 50, 0,112, 97,114, 51, 0,112, 97,114,115,
+117, 98,115,116,114, 91, 51, 50, 93, 0, 42,116,114, 97, 99,107, 0, 42,112,114,111,120,121, 0, 42,112,114,111,120,121, 95,103,
+114,111,117,112, 0, 42,112,114,111,120,121, 95,102,114,111,109, 0, 42, 97, 99,116,105,111,110, 0, 42,112,111,115,101,108,105,
+ 98, 0, 42,112,111,115,101, 0, 42,103,112,100, 0, 97,118,115, 0, 42,109,112, 97,116,104, 0, 99,111,110,115,116,114, 97,105,
+110,116, 67,104, 97,110,110,101,108,115, 0,101,102,102,101, 99,116, 0,100,101,102, 98, 97,115,101, 0,109,111,100,105,102,105,
+101,114,115, 0,114,101,115,116,111,114,101, 95,109,111,100,101, 0, 42,109, 97,116, 98,105,116,115, 0, 97, 99,116, 99,111,108,
+ 0,100,108,111, 99, 91, 51, 93, 0,111,114,105,103, 91, 51, 93, 0,100,115,105,122,101, 91, 51, 93, 0,100,114,111,116, 91, 51,
+ 93, 0,100,113,117, 97,116, 91, 52, 93, 0,114,111,116, 65,120,105,115, 91, 51, 93, 0,100,114,111,116, 65,120,105,115, 91, 51,
+ 93, 0,114,111,116, 65,110,103,108,101, 0,100,114,111,116, 65,110,103,108,101, 0,111, 98,109, 97,116, 91, 52, 93, 91, 52, 93,
+ 0, 99,111,110,115,116,105,110,118, 91, 52, 93, 91, 52, 93, 0,105,109, 97,116, 95,114,101,110, 91, 52, 93, 91, 52, 93, 0,108,
+ 97,121, 0, 99,111,108, 98,105,116,115, 0,116,114, 97,110,115,102,108, 97,103, 0,112,114,111,116,101, 99,116,102,108, 97,103,
+ 0,116,114, 97, 99,107,102,108, 97,103, 0,117,112,102,108, 97,103, 0,110,108, 97,102,108, 97,103, 0,105,112,111,102,108, 97,
+103, 0,105,112,111,119,105,110, 0,115, 99, 97,102,108, 97,103, 0,115, 99, 97,118,105,115,102,108, 97,103, 0, 98,111,117,110,
+100,116,121,112,101, 0,100,117,112,111,110, 0,100,117,112,111,102,102, 0,100,117,112,115,116, 97, 0,100,117,112,101,110,100,
+ 0,115,102, 0,109, 97,115,115, 0,100, 97,109,112,105,110,103, 0,105,110,101,114,116,105, 97, 0,102,111,114,109,102, 97, 99,
+116,111,114, 0,114,100, 97,109,112,105,110,103, 0,109, 97,114,103,105,110, 0,109, 97,120, 95,118,101,108, 0,109,105,110, 95,
+118,101,108, 0,109, 95, 99,111,110,116, 97, 99,116, 80,114,111, 99,101,115,115,105,110,103, 84,104,114,101,115,104,111,108,100,
+ 0,114,111,116,109,111,100,101, 0,100,116, 0,100,116,120, 0,101,109,112,116,121, 95,100,114, 97,119,116,121,112,101, 0,112,
+ 97,100, 49, 91, 51, 93, 0,101,109,112,116,121, 95,100,114, 97,119,115,105,122,101, 0,100,117,112,102, 97, 99,101,115, 99, 97,
+ 0,112,114,111,112, 0,115,101,110,115,111,114,115, 0, 99,111,110,116,114,111,108,108,101,114,115, 0, 97, 99,116,117, 97,116,
+111,114,115, 0, 98, 98,115,105,122,101, 91, 51, 93, 0, 97, 99,116,100,101,102, 0,103, 97,109,101,102,108, 97,103, 0,103, 97,
+109,101,102,108, 97,103, 50, 0, 42, 98,115,111,102,116, 0,115,111,102,116,102,108, 97,103, 0, 97,110,105,115,111,116,114,111,
+112,105, 99, 70,114,105, 99,116,105,111,110, 91, 51, 93, 0, 99,111,110,115,116,114, 97,105,110,116,115, 0,110,108, 97,115,116,
+114,105,112,115, 0,104,111,111,107,115, 0,112, 97,114,116,105, 99,108,101,115,121,115,116,101,109, 0, 42,115,111,102,116, 0,
+ 42,100,117,112, 95,103,114,111,117,112, 0,102,108,117,105,100,115,105,109, 70,108, 97,103, 0,114,101,115,116,114,105, 99,116,
+102,108, 97,103, 0,115,104, 97,112,101,102,108, 97,103, 0,114,101, 99, 97,108, 99,111, 0, 98,111,100,121, 95,116,121,112,101,
+ 0, 42,102,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 42,100,101,114,105,118,101,100, 68,101,102,111,114,
+109, 0, 42,100,101,114,105,118,101,100, 70,105,110, 97,108, 0,108, 97,115,116, 68, 97,116, 97, 77, 97,115,107, 0,115,116, 97,
+116,101, 0,105,110,105,116, 95,115,116, 97,116,101, 0,103,112,117,108, 97,109,112, 0,112, 99, 95,105,100,115, 0, 42,100,117,
+112,108,105,108,105,115,116, 0, 99,117,114,105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,111,114,105,103,108, 97,121, 0,
+110,111, 95,100,114, 97,119, 0, 97,110,105,109, 97,116,101,100, 0,111,109, 97,116, 91, 52, 93, 91, 52, 93, 0,111,114, 99,111,
+ 91, 51, 93, 0,100,101,102,108,101, 99,116, 0,102,111,114, 99,101,102,105,101,108,100, 0,115,104, 97,112,101, 0,116,101,120,
+ 95,109,111,100,101, 0,107,105,110,107, 0,107,105,110,107, 95, 97,120,105,115, 0,122,100,105,114, 0,102, 95,115,116,114,101,
+110,103,116,104, 0,102, 95,100, 97,109,112, 0,102, 95,102,108,111,119, 0,102, 95,115,105,122,101, 0,102, 95,112,111,119,101,
+114, 0,109, 97,120,100,105,115,116, 0,109,105,110,100,105,115,116, 0,102, 95,112,111,119,101,114, 95,114, 0,109, 97,120,114,
+ 97,100, 0,109,105,110,114, 97,100, 0,112,100,101,102, 95,100, 97,109,112, 0,112,100,101,102, 95,114,100, 97,109,112, 0,112,
+100,101,102, 95,112,101,114,109, 0,112,100,101,102, 95,102,114,105, 99,116, 0,112,100,101,102, 95,114,102,114,105, 99,116, 0,
+112,100,101,102, 95,115,116,105, 99,107,110,101,115,115, 0, 97, 98,115,111,114,112,116,105,111,110, 0,112,100,101,102, 95,115,
+ 98,100, 97,109,112, 0,112,100,101,102, 95,115, 98,105,102,116, 0,112,100,101,102, 95,115, 98,111,102,116, 0, 99,108,117,109,
+112, 95,102, 97, 99, 0, 99,108,117,109,112, 95,112,111,119, 0,107,105,110,107, 95,102,114,101,113, 0,107,105,110,107, 95,115,
+104, 97,112,101, 0,107,105,110,107, 95, 97,109,112, 0,102,114,101,101, 95,101,110,100, 0,116,101,120, 95,110, 97, 98,108, 97,
+ 0, 42,114,110,103, 0,102, 95,110,111,105,115,101, 0,119,101,105,103,104,116, 91, 49, 51, 93, 0,103,108,111, 98, 97,108, 95,
+103,114, 97,118,105,116,121, 0,114,116, 91, 51, 93, 0,116,111,116,100, 97,116, 97, 0,102,114, 97,109,101, 0,116,111,116,112,
+111,105,110,116, 0,100, 97,116, 97, 95,116,121,112,101,115, 0, 42,100, 97,116, 97, 91, 56, 93, 0, 42, 99,117,114, 91, 56, 93,
+ 0,101,120,116,114, 97,100, 97,116, 97, 0,115,116,101,112, 0,115,105,109,102,114, 97,109,101, 0,115,116, 97,114,116,102,114,
+ 97,109,101, 0,101,110,100,102,114, 97,109,101, 0,101,100,105,116,102,114, 97,109,101, 0,108, 97,115,116, 95,101,120, 97, 99,
+116, 0, 99,111,109,112,114,101,115,115,105,111,110, 0,110, 97,109,101, 91, 54, 52, 93, 0,112,114,101,118, 95,110, 97,109,101,
+ 91, 54, 52, 93, 0,105,110,102,111, 91, 54, 52, 93, 0,112, 97,116,104, 91, 50, 52, 48, 93, 0, 42, 99, 97, 99,104,101,100, 95,
+102,114, 97,109,101,115, 0,109,101,109, 95, 99, 97, 99,104,101, 0, 42,101,100,105,116, 0, 40, 42,102,114,101,101, 95,101,100,
+105,116, 41, 40, 41, 0,108,105,110, 83,116,105,102,102, 0, 97,110,103, 83,116,105,102,102, 0,118,111,108,117,109,101, 0,118,
+105,116,101,114, 97,116,105,111,110,115, 0,112,105,116,101,114, 97,116,105,111,110,115, 0,100,105,116,101,114, 97,116,105,111,
+110,115, 0, 99,105,116,101,114, 97,116,105,111,110,115, 0,107, 83, 82, 72, 82, 95, 67, 76, 0,107, 83, 75, 72, 82, 95, 67, 76,
+ 0,107, 83, 83, 72, 82, 95, 67, 76, 0,107, 83, 82, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 83, 75, 95, 83, 80, 76, 84, 95, 67,
+ 76, 0,107, 83, 83, 95, 83, 80, 76, 84, 95, 67, 76, 0,107, 86, 67, 70, 0,107, 68, 80, 0,107, 68, 71, 0,107, 76, 70, 0,107,
+ 80, 82, 0,107, 86, 67, 0,107, 68, 70, 0,107, 77, 84, 0,107, 67, 72, 82, 0,107, 75, 72, 82, 0,107, 83, 72, 82, 0,107, 65,
+ 72, 82, 0, 99,111,108,108,105,115,105,111,110,102,108, 97,103,115, 0,110,117,109, 99,108,117,115,116,101,114,105,116,101,114,
+ 97,116,105,111,110,115, 0,119,101,108,100,105,110,103, 0,116,111,116,115,112,114,105,110,103, 0, 42, 98,112,111,105,110,116,
+ 0, 42, 98,115,112,114,105,110,103, 0,109,115,103, 95,108,111, 99,107, 0,109,115,103, 95,118, 97,108,117,101, 0,110,111,100,
+101,109, 97,115,115, 0,110, 97,109,101,100, 86, 71, 95, 77, 97,115,115, 91, 51, 50, 93, 0,103,114, 97,118, 0,109,101,100,105,
+ 97,102,114,105, 99,116, 0,114,107,108,105,109,105,116, 0,112,104,121,115,105, 99,115, 95,115,112,101,101,100, 0,103,111, 97,
+108,115,112,114,105,110,103, 0,103,111, 97,108,102,114,105, 99,116, 0,109,105,110,103,111, 97,108, 0,109, 97,120,103,111, 97,
+108, 0,100,101,102,103,111, 97,108, 0,118,101,114,116,103,114,111,117,112, 0,110, 97,109,101,100, 86, 71, 95, 83,111,102,116,
+103,111, 97,108, 91, 51, 50, 93, 0,102,117,122,122,121,110,101,115,115, 0,105,110,115,112,114,105,110,103, 0,105,110,102,114,
+105, 99,116, 0,110, 97,109,101,100, 86, 71, 95, 83,112,114,105,110,103, 95, 75, 91, 51, 50, 93, 0,101,102,114, 97, 0,105,110,
+116,101,114,118, 97,108, 0,108,111, 99, 97,108, 0,115,111,108,118,101,114,102,108, 97,103,115, 0, 42, 42,107,101,121,115, 0,
+116,111,116,112,111,105,110,116,107,101,121, 0,115,101, 99,111,110,100,115,112,114,105,110,103, 0, 99,111,108, 98, 97,108,108,
+ 0, 98, 97,108,108,100, 97,109,112, 0, 98, 97,108,108,115,116,105,102,102, 0,115, 98, 99, 95,109,111,100,101, 0, 97,101,114,
+111,101,100,103,101, 0,109,105,110,108,111,111,112,115, 0,109, 97,120,108,111,111,112,115, 0, 99,104,111,107,101, 0,115,111,
+108,118,101,114, 95, 73, 68, 0,112,108, 97,115,116,105, 99, 0,115,112,114,105,110,103,112,114,101,108,111, 97,100, 0, 42,115,
+ 99,114, 97,116, 99,104, 0,115,104,101, 97,114,115,116,105,102,102, 0,105,110,112,117,115,104, 0, 42,112,111,105,110,116, 99,
+ 97, 99,104,101, 0, 42,101,102,102,101, 99,116,111,114, 95,119,101,105,103,104,116,115, 0,108, 99,111,109, 91, 51, 93, 0,108,
+114,111,116, 91, 51, 93, 91, 51, 93, 0,108,115, 99, 97,108,101, 91, 51, 93, 91, 51, 93, 0,112, 97,100, 52, 91, 52, 93, 0, 42,
+102,109,100, 0,115,104,111,119, 95, 97,100,118, 97,110, 99,101,100,111,112,116,105,111,110,115, 0,114,101,115,111,108,117,116,
+105,111,110,120,121,122, 0,112,114,101,118,105,101,119,114,101,115,120,121,122, 0,114,101, 97,108,115,105,122,101, 0,103,117,
+105, 68,105,115,112,108, 97,121, 77,111,100,101, 0,114,101,110,100,101,114, 68,105,115,112,108, 97,121, 77,111,100,101, 0,118,
+105,115, 99,111,115,105,116,121, 86, 97,108,117,101, 0,118,105,115, 99,111,115,105,116,121, 77,111,100,101, 0,118,105,115, 99,
+111,115,105,116,121, 69,120,112,111,110,101,110,116, 0,103,114, 97,118,120, 0,103,114, 97,118,121, 0,103,114, 97,118,122, 0,
+ 97,110,105,109, 83,116, 97,114,116, 0, 97,110,105,109, 69,110,100, 0, 98, 97,107,101, 83,116, 97,114,116, 0, 98, 97,107,101,
+ 69,110,100, 0,103,115,116, 97,114, 0,109, 97,120, 82,101,102,105,110,101, 0,105,110,105, 86,101,108,120, 0,105,110,105, 86,
+101,108,121, 0,105,110,105, 86,101,108,122, 0, 42,111,114,103, 77,101,115,104, 0, 42,109,101,115,104, 83,117,114,102, 97, 99,
+101, 0, 42,109,101,115,104, 66, 66, 0,115,117,114,102,100, 97,116, 97, 80, 97,116,104, 91, 50, 52, 48, 93, 0, 98, 98, 83,116,
+ 97,114,116, 91, 51, 93, 0, 98, 98, 83,105,122,101, 91, 51, 93, 0,116,121,112,101, 70,108, 97,103,115, 0,100,111,109, 97,105,
+110, 78,111,118,101, 99,103,101,110, 0,118,111,108,117,109,101, 73,110,105,116, 84,121,112,101, 0,112, 97,114,116, 83,108,105,
+112, 86, 97,108,117,101, 0,103,101,110,101,114, 97,116,101, 84,114, 97, 99,101,114,115, 0,103,101,110,101,114, 97,116,101, 80,
+ 97,114,116,105, 99,108,101,115, 0,115,117,114,102, 97, 99,101, 83,109,111,111,116,104,105,110,103, 0,115,117,114,102, 97, 99,
+101, 83,117, 98,100,105,118,115, 0,112, 97,114,116,105, 99,108,101, 73,110,102, 83,105,122,101, 0,112, 97,114,116,105, 99,108,
+101, 73,110,102, 65,108,112,104, 97, 0,102, 97,114, 70,105,101,108,100, 83,105,122,101, 0, 42,109,101,115,104, 83,117,114,102,
+ 78,111,114,109, 97,108,115, 0, 99,112,115, 84,105,109,101, 83,116, 97,114,116, 0, 99,112,115, 84,105,109,101, 69,110,100, 0,
+ 99,112,115, 81,117, 97,108,105,116,121, 0, 97,116,116,114, 97, 99,116,102,111,114, 99,101, 83,116,114,101,110,103,116,104, 0,
+ 97,116,116,114, 97, 99,116,102,111,114, 99,101, 82, 97,100,105,117,115, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101,
+ 83,116,114,101,110,103,116,104, 0,118,101,108,111, 99,105,116,121,102,111,114, 99,101, 82, 97,100,105,117,115, 0,108, 97,115,
+116,103,111,111,100,102,114, 97,109,101, 0,109,105,115,116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114,
+ 98, 0,122,101,110,114, 0,122,101,110,103, 0,122,101,110, 98, 0,102, 97,115,116, 99,111,108, 0,101,120,112,111,115,117,114,
+101, 0,101,120,112, 0,114, 97,110,103,101, 0,108,105,110,102, 97, 99, 0,108,111,103,102, 97, 99, 0,103,114, 97,118,105,116,
+121, 0, 97, 99,116,105,118,105,116,121, 66,111,120, 82, 97,100,105,117,115, 0,115,107,121,116,121,112,101, 0,111, 99, 99,108,
+117,115,105,111,110, 82,101,115, 0,112,104,121,115,105, 99,115, 69,110,103,105,110,101, 0,116,105, 99,114, 97,116,101, 0,109,
+ 97,120,108,111,103,105, 99,115,116,101,112, 0,112,104,121,115,117, 98,115,116,101,112, 0,109, 97,120,112,104,121,115,116,101,
+112, 0,109,105,115,105, 0,109,105,115,116,115,116, 97, 0,109,105,115,116,100,105,115,116, 0,109,105,115,116,104,105, 0,115,
+116, 97,114,114, 0,115,116, 97,114,103, 0,115,116, 97,114, 98, 0,115,116, 97,114,107, 0,115,116, 97,114,115,105,122,101, 0,
+115,116, 97,114,109,105,110,100,105,115,116, 0,115,116, 97,114,100,105,115,116, 0,115,116, 97,114, 99,111,108,110,111,105,115,
+101, 0,100,111,102,115,116, 97, 0,100,111,102,101,110,100, 0,100,111,102,109,105,110, 0,100,111,102,109, 97,120, 0, 97,111,
+100,105,115,116, 0, 97,111,100,105,115,116,102, 97, 99, 0, 97,111,101,110,101,114,103,121, 0, 97,111, 98,105, 97,115, 0, 97,
+111,109,111,100,101, 0, 97,111,115, 97,109,112, 0, 97,111,109,105,120, 0, 97,111, 99,111,108,111,114, 0, 97,111, 95, 97,100,
+ 97,112,116, 95,116,104,114,101,115,104, 0, 97,111, 95, 97,100, 97,112,116, 95,115,112,101,101,100, 95,102, 97, 99, 0, 97,111,
+ 95, 97,112,112,114,111,120, 95,101,114,114,111,114, 0, 97,111, 95, 97,112,112,114,111,120, 95, 99,111,114,114,101, 99,116,105,
+111,110, 0, 97,111, 95,105,110,100,105,114,101, 99,116, 95,101,110,101,114,103,121, 0, 97,111, 95,101,110,118, 95,101,110,101,
+114,103,121, 0, 97,111, 95,112, 97,100, 50, 0, 97,111, 95,105,110,100,105,114,101, 99,116, 95, 98,111,117,110, 99,101,115, 0,
+ 97,111, 95,112, 97,100, 0, 97,111, 95,115, 97,109,112, 95,109,101,116,104,111,100, 0, 97,111, 95,103, 97,116,104,101,114, 95,
+109,101,116,104,111,100, 0, 97,111, 95, 97,112,112,114,111,120, 95,112, 97,115,115,101,115, 0, 42, 97,111,115,112,104,101,114,
+101, 0, 42, 97,111,116, 97, 98,108,101,115, 0,112, 97,100, 91, 51, 93, 0,115,101,108, 99,111,108, 0,115,120, 0,115,121, 0,
+ 42,108,112, 70,111,114,109, 97,116, 0, 42,108,112, 80, 97,114,109,115, 0, 99, 98, 70,111,114,109, 97,116, 0, 99, 98, 80, 97,
+114,109,115, 0,102, 99, 99, 84,121,112,101, 0,102, 99, 99, 72, 97,110,100,108,101,114, 0,100,119, 75,101,121, 70,114, 97,109,
+101, 69,118,101,114,121, 0,100,119, 81,117, 97,108,105,116,121, 0,100,119, 66,121,116,101,115, 80,101,114, 83,101, 99,111,110,
+100, 0,100,119, 70,108, 97,103,115, 0,100,119, 73,110,116,101,114,108,101, 97,118,101, 69,118,101,114,121, 0, 97,118,105, 99,
+111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 42, 99,100, 80, 97,114,109,115, 0, 42,112, 97,100, 0, 99,100, 83,105,
+122,101, 0,113,116, 99,111,100,101, 99,110, 97,109,101, 91, 49, 50, 56, 93, 0, 99,111,100,101, 99, 84,121,112,101, 0, 99,111,
+100,101, 99, 83,112, 97,116,105, 97,108, 81,117, 97,108,105,116,121, 0, 99,111,100,101, 99, 0, 99,111,100,101, 99, 70,108, 97,
+103,115, 0, 99,111,108,111,114, 68,101,112,116,104, 0, 99,111,100,101, 99, 84,101,109,112,111,114, 97,108, 81,117, 97,108,105,
+116,121, 0,109,105,110, 83,112, 97,116,105, 97,108, 81,117, 97,108,105,116,121, 0,109,105,110, 84,101,109,112,111,114, 97,108,
+ 81,117, 97,108,105,116,121, 0,107,101,121, 70,114, 97,109,101, 82, 97,116,101, 0, 98,105,116, 82, 97,116,101, 0, 97,117,100,
+105,111, 99,111,100,101, 99, 84,121,112,101, 0, 97,117,100,105,111, 83, 97,109,112,108,101, 82, 97,116,101, 0, 97,117,100,105,
+111, 66,105,116, 68,101,112,116,104, 0, 97,117,100,105,111, 67,104, 97,110,110,101,108,115, 0, 97,117,100,105,111, 67,111,100,
+101, 99, 70,108, 97,103,115, 0, 97,117,100,105,111, 66,105,116, 82, 97,116,101, 0, 97,117,100,105,111, 95, 99,111,100,101, 99,
+ 0,118,105,100,101,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,105,111, 95, 98,105,116,114, 97,116,101, 0, 97,117,100,
+105,111, 95,109,105,120,114, 97,116,101, 0, 97,117,100,105,111, 95,118,111,108,117,109,101, 0,103,111,112, 95,115,105,122,101,
+ 0,114, 99, 95,109,105,110, 95,114, 97,116,101, 0,114, 99, 95,109, 97,120, 95,114, 97,116,101, 0,114, 99, 95, 98,117,102,102,
+101,114, 95,115,105,122,101, 0,109,117,120, 95,112, 97, 99,107,101,116, 95,115,105,122,101, 0,109,117,120, 95,114, 97,116,101,
+ 0,109,105,120,114, 97,116,101, 0,109, 97,105,110, 0,115,112,101,101,100, 95,111,102, 95,115,111,117,110,100, 0,100,111,112,
+112,108,101,114, 95,102, 97, 99,116,111,114, 0,100,105,115,116, 97,110, 99,101, 95,109,111,100,101,108, 0, 42,109, 97,116, 95,
+111,118,101,114,114,105,100,101, 0, 42,108,105,103,104,116, 95,111,118,101,114,114,105,100,101, 0,108, 97,121, 95,122,109, 97,
+115,107, 0,108, 97,121,102,108, 97,103, 0,112, 97,115,115,102,108, 97,103, 0,112, 97,115,115, 95,120,111,114, 0, 42, 97,118,
+105, 99,111,100,101, 99,100, 97,116, 97, 0, 42,113,116, 99,111,100,101, 99,100, 97,116, 97, 0,113,116, 99,111,100,101, 99,115,
+101,116,116,105,110,103,115, 0,102,102, 99,111,100,101, 99,100, 97,116, 97, 0,115,117, 98,102,114, 97,109,101, 0,112,115,102,
+114, 97, 0,112,101,102,114, 97, 0,105,109, 97,103,101,115, 0,102,114, 97,109, 97,112,116,111, 0,116,104,114,101, 97,100,115,
+ 0,102,114, 97,109,101,108,101,110, 0, 98,108,117,114,102, 97, 99, 0,101,100,103,101, 82, 0,101,100,103,101, 71, 0,101,100,
+103,101, 66, 0,102,117,108,108,115, 99,114,101,101,110, 0,120,112,108, 97,121, 0,121,112,108, 97,121, 0,102,114,101,113,112,
+108, 97,121, 0, 97,116,116,114,105, 98, 0,102,114, 97,109,101, 95,115,116,101,112, 0,115,116,101,114,101,111,109,111,100,101,
+ 0,100,105,109,101,110,115,105,111,110,115,112,114,101,115,101,116, 0,109, 97,120,105,109,115,105,122,101, 0,120,115, 99,104,
+ 0,121,115, 99,104, 0,120,112, 97,114,116,115, 0,121,112, 97,114,116,115, 0,119,105,110,112,111,115, 0,112,108, 97,110,101,
+115, 0,105,109,116,121,112,101, 0,115,117, 98,105,109,116,121,112,101, 0,113,117, 97,108,105,116,121, 0,100,105,115,112,108,
+ 97,121,109,111,100,101, 0,114,112, 97,100, 49, 0,114,112, 97,100, 50, 0,115, 99,101,109,111,100,101, 0,114, 97,121,116,114,
+ 97, 99,101, 95,111,112,116,105,111,110,115, 0,114, 97,121,116,114, 97, 99,101, 95,115,116,114,117, 99,116,117,114,101, 0,114,
+101,110,100,101,114,101,114, 0,111, 99,114,101,115, 0,112, 97,100, 52, 0, 97,108,112,104, 97,109,111,100,101, 0,111,115, 97,
+ 0,102,114,115, 95,115,101, 99, 0,101,100,103,101,105,110,116, 0,115, 97,102,101,116,121, 0, 98,111,114,100,101,114, 0,100,
+105,115,112,114,101, 99,116, 0,108, 97,121,101,114,115, 0, 97, 99,116,108, 97,121, 0,109, 98,108,117,114, 95,115, 97,109,112,
+108,101,115, 0,120, 97,115,112, 0,121, 97,115,112, 0,102,114,115, 95,115,101, 99, 95, 98, 97,115,101, 0,103, 97,117,115,115,
+ 0, 99,111,108,111,114, 95,109,103,116, 95,102,108, 97,103, 0,112,111,115,116,103, 97,109,109, 97, 0,112,111,115,116,104,117,
+101, 0,112,111,115,116,115, 97,116, 0,100,105,116,104,101,114, 95,105,110,116,101,110,115,105,116,121, 0, 98, 97,107,101, 95,
+111,115, 97, 0, 98, 97,107,101, 95,102,105,108,116,101,114, 0, 98, 97,107,101, 95,109,111,100,101, 0, 98, 97,107,101, 95,102,
+108, 97,103, 0, 98, 97,107,101, 95,110,111,114,109, 97,108, 95,115,112, 97, 99,101, 0, 98, 97,107,101, 95,113,117, 97,100, 95,
+115,112,108,105,116, 0, 98, 97,107,101, 95,109, 97,120,100,105,115,116, 0, 98, 97,107,101, 95, 98,105, 97,115,100,105,115,116,
+ 0, 98, 97,107,101, 95,112, 97,100, 0, 98, 97, 99,107, 98,117,102, 91, 49, 54, 48, 93, 0,112,105, 99, 91, 49, 54, 48, 93, 0,
+115,116, 97,109,112, 0,115,116, 97,109,112, 95,102,111,110,116, 95,105,100, 0,115,116, 97,109,112, 95,117,100, 97,116, 97, 91,
+ 49, 54, 48, 93, 0,102,103, 95,115,116, 97,109,112, 91, 52, 93, 0, 98,103, 95,115,116, 97,109,112, 91, 52, 93, 0,115,101,113,
+ 95,112,114,101,118, 95,116,121,112,101, 0,115,101,113, 95,114,101,110,100, 95,116,121,112,101, 0,115,101,113, 95,102,108, 97,
+103, 0,112, 97,100, 53, 91, 53, 93, 0,115,105,109,112,108,105,102,121, 95,102,108, 97,103, 0,115,105,109,112,108,105,102,121,
+ 95,115,117, 98,115,117,114,102, 0,115,105,109,112,108,105,102,121, 95,115,104, 97,100,111,119,115, 97,109,112,108,101,115, 0,
+115,105,109,112,108,105,102,121, 95,112, 97,114,116,105, 99,108,101,115, 0,115,105,109,112,108,105,102,121, 95, 97,111,115,115,
+115, 0, 99,105,110,101,111,110,119,104,105,116,101, 0, 99,105,110,101,111,110, 98,108, 97, 99,107, 0, 99,105,110,101,111,110,
+103, 97,109,109, 97, 0,106,112, 50, 95,112,114,101,115,101,116, 0,106,112, 50, 95,100,101,112,116,104, 0,114,112, 97,100, 51,
+ 0,100,111,109,101,114,101,115, 0,100,111,109,101,109,111,100,101, 0,100,111,109,101, 97,110,103,108,101, 0,100,111,109,101,
+116,105,108,116, 0,100,111,109,101,114,101,115, 98,117,102, 0, 42,100,111,109,101,116,101,120,116, 0,101,110,103,105,110,101,
+ 91, 51, 50, 93, 0,112, 97,114,116,105, 99,108,101, 95,112,101,114, 99, 0,115,117, 98,115,117,114,102, 95,109, 97,120, 0,115,
+104, 97,100, 98,117,102,115, 97,109,112,108,101, 95,109, 97,120, 0, 97,111, 95,101,114,114,111,114, 0,116,105,108,116, 0,114,
+101,115, 98,117,102, 0, 42,119, 97,114,112,116,101,120,116, 0, 99,111,108, 91, 51, 93, 0,109, 97,116,109,111,100,101, 0,102,
+114, 97,109,105,110,103, 0,114,116, 49, 0,114,116, 50, 0,100,111,109,101, 0,115,116,101,114,101,111,102,108, 97,103, 0,101,
+121,101,115,101,112, 97,114, 97,116,105,111,110, 0, 42, 99, 97,109,101,114, 97, 0, 42, 98,114,117,115,104, 0, 42,112, 97,105,
+110,116, 95, 99,117,114,115,111,114, 0,112, 97,105,110,116, 95, 99,117,114,115,111,114, 95, 99,111,108, 91, 52, 93, 0,112, 97,
+105,110,116, 0,115,101, 97,109, 95, 98,108,101,101,100, 0,110,111,114,109, 97,108, 95, 97,110,103,108,101, 0,115, 99,114,101,
+101,110, 95,103,114, 97, 98, 95,115,105,122,101, 91, 50, 93, 0, 42,112, 97,105,110,116, 99,117,114,115,111,114, 0,105,110,118,
+101,114,116, 0,116,111,116,114,101,107,101,121, 0,116,111,116, 97,100,100,107,101,121, 0, 98,114,117,115,104,116,121,112,101,
+ 0, 98,114,117,115,104, 91, 55, 93, 0,101,109,105,116,116,101,114,100,105,115,116, 0,115,101,108,101, 99,116,109,111,100,101,
+ 0,101,100,105,116,116,121,112,101, 0,100,114, 97,119, 95,115,116,101,112, 0,102, 97,100,101, 95,102,114, 97,109,101,115, 0,
+110, 97,109,101, 91, 51, 54, 93, 0,109, 97,116, 91, 51, 93, 91, 51, 93, 0,114, 97,100,105, 97,108, 95,115,121,109,109, 91, 51,
+ 93, 0,108, 97,115,116, 95,120, 0,108, 97,115,116, 95,121, 0,108, 97,115,116, 95, 97,110,103,108,101, 0,100,114, 97,119, 95,
+ 97,110, 99,104,111,114,101,100, 0, 97,110, 99,104,111,114,101,100, 95,115,105,122,101, 0, 97,110, 99,104,111,114,101,100, 95,
+108,111, 99, 97,116,105,111,110, 91, 51, 93, 0, 97,110, 99,104,111,114,101,100, 95,105,110,105,116,105, 97,108, 95,109,111,117,
+115,101, 91, 50, 93, 0,100,114, 97,119, 95,112,114,101,115,115,117,114,101, 0,112,114,101,115,115,117,114,101, 95,118, 97,108,
+117,101, 0,115,112,101, 99,105, 97,108, 95,114,111,116, 97,116,105,111,110, 0, 42,118,112, 97,105,110,116, 95,112,114,101,118,
+ 0, 42,119,112, 97,105,110,116, 95,112,114,101,118, 0, 42,118,112, 97,105,110,116, 0, 42,119,112, 97,105,110,116, 0,118,103,
+114,111,117,112, 95,119,101,105,103,104,116, 0, 99,111,114,110,101,114,116,121,112,101, 0,101,100,105,116, 98,117,116,102,108,
+ 97,103, 0,106,111,105,110,116,114,105,108,105,109,105,116, 0,100,101,103,114, 0,116,117,114,110, 0,101,120,116,114, 95,111,
+102,102,115, 0,100,111,117, 98,108,105,109,105,116, 0,110,111,114,109, 97,108,115,105,122,101, 0, 97,117,116,111,109,101,114,
+103,101, 0,115,101,103,109,101,110,116,115, 0,114,105,110,103,115, 0,118,101,114,116,105, 99,101,115, 0,117,110,119,114, 97,
+112,112,101,114, 0,117,118, 99, 97,108, 99, 95,114, 97,100,105,117,115, 0,117,118, 99, 97,108, 99, 95, 99,117, 98,101,115,105,
+122,101, 0,117,118, 99, 97,108, 99, 95,109, 97,114,103,105,110, 0,117,118, 99, 97,108, 99, 95,109, 97,112,100,105,114, 0,117,
+118, 99, 97,108, 99, 95,109, 97,112, 97,108,105,103,110, 0,117,118, 99, 97,108, 99, 95,102,108, 97,103, 0,117,118, 95,102,108,
+ 97,103, 0,117,118, 95,115,101,108,101, 99,116,109,111,100,101, 0,117,118, 95,112, 97,100, 0,103,112,101,110, 99,105,108, 95,
+102,108, 97,103,115, 0, 97,117,116,111,105,107, 95, 99,104, 97,105,110,108,101,110, 0,105,109, 97,112, 97,105,110,116, 0,112,
+ 97,114,116,105, 99,108,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 95,115,105,122,101, 0,115,101,108,101, 99,116,
+ 95,116,104,114,101,115,104, 0, 99,108,101, 97,110, 95,116,104,114,101,115,104, 0, 97,117,116,111,107,101,121, 95,109,111,100,
+101, 0, 97,117,116,111,107,101,121, 95,102,108, 97,103, 0,114,101,116,111,112,111, 95,109,111,100,101, 0,114,101,116,111,112,
+111, 95,112, 97,105,110,116, 95,116,111,111,108, 0,108,105,110,101, 95,100,105,118, 0,101,108,108,105,112,115,101, 95,100,105,
+118, 0,114,101,116,111,112,111, 95,104,111,116,115,112,111,116, 0,109,117,108,116,105,114,101,115, 95,115,117, 98,100,105,118,
+ 95,116,121,112,101, 0,115,107,103,101,110, 95,114,101,115,111,108,117,116,105,111,110, 0,115,107,103,101,110, 95,116,104,114,
+101,115,104,111,108,100, 95,105,110,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,116,104,114,101,115,104,111,108,100, 95,
+101,120,116,101,114,110, 97,108, 0,115,107,103,101,110, 95,108,101,110,103,116,104, 95,114, 97,116,105,111, 0,115,107,103,101,
+110, 95,108,101,110,103,116,104, 95,108,105,109,105,116, 0,115,107,103,101,110, 95, 97,110,103,108,101, 95,108,105,109,105,116,
+ 0,115,107,103,101,110, 95, 99,111,114,114,101,108, 97,116,105,111,110, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,115,
+121,109,109,101,116,114,121, 95,108,105,109,105,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95, 97,110,103,
+108,101, 95,119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,108,101,110,103,116,104, 95,
+119,101,105,103,104,116, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,100,105,115,116, 97,110, 99,101, 95,119,
+101,105,103,104,116, 0,115,107,103,101,110, 95,111,112,116,105,111,110,115, 0,115,107,103,101,110, 95,112,111,115,116,112,114,
+111, 0,115,107,103,101,110, 95,112,111,115,116,112,114,111, 95,112, 97,115,115,101,115, 0,115,107,103,101,110, 95,115,117, 98,
+100,105,118,105,115,105,111,110,115, 91, 51, 93, 0,115,107,103,101,110, 95,109,117,108,116,105, 95,108,101,118,101,108, 0, 42,
+115,107,103,101,110, 95,116,101,109,112,108, 97,116,101, 0, 98,111,110,101, 95,115,107,101,116, 99,104,105,110,103, 0, 98,111,
+110,101, 95,115,107,101,116, 99,104,105,110,103, 95, 99,111,110,118,101,114,116, 0,115,107,103,101,110, 95,115,117, 98,100,105,
+118,105,115,105,111,110, 95,110,117,109, 98,101,114, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,111,112,116,
+105,111,110,115, 0,115,107,103,101,110, 95,114,101,116, 97,114,103,101,116, 95,114,111,108,108, 0,115,107,103,101,110, 95,115,
+105,100,101, 95,115,116,114,105,110,103, 91, 56, 93, 0,115,107,103,101,110, 95,110,117,109, 95,115,116,114,105,110,103, 91, 56,
+ 93, 0,101,100,103,101, 95,109,111,100,101, 0,101,100,103,101, 95,109,111,100,101, 95,108,105,118,101, 95,117,110,119,114, 97,
+112, 0,115,110, 97,112, 95,109,111,100,101, 0,115,110, 97,112, 95,102,108, 97,103, 0,115,110, 97,112, 95,116, 97,114,103,101,
+116, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0,112,114,111,112,111,114,116,
+105,111,110, 97,108, 95,111, 98,106,101, 99,116,115, 0, 97,117,116,111, 95,110,111,114,109, 97,108,105,122,101, 0,115, 99,117,
+108,112,116, 95,112, 97,105,110,116, 95,115,101,116,116,105,110,103,115, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,
+117,110,105,102,105,101,100, 95,115,105,122,101, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,117,110,105,102,105,101,
+100, 95,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,100,105,117,115, 0,115, 99,117,108,112,116, 95,112, 97,105,110,
+116, 95,117,110,105,102,105,101,100, 95, 97,108,112,104, 97, 0,116,111,116,111, 98,106, 0,116,111,116,108, 97,109,112, 0,116,
+111,116,111, 98,106,115,101,108, 0,116,111,116, 99,117,114,118,101, 0,116,111,116,109,101,115,104, 0,116,111,116, 97,114,109,
+ 97,116,117,114,101, 0,115, 99, 97,108,101, 95,108,101,110,103,116,104, 0,115,121,115,116,101,109, 0,115,121,115,116,101,109,
+ 95,114,111,116, 97,116,105,111,110, 0,103,114, 97,118,105,116,121, 91, 51, 93, 0,113,117,105, 99,107, 95, 99, 97, 99,104,101,
+ 95,115,116,101,112, 0, 42,119,111,114,108,100, 0, 42,115,101,116, 0, 98, 97,115,101, 0, 42, 98, 97,115, 97, 99,116, 0, 42,
+111, 98,101,100,105,116, 0, 99,117,114,115,111,114, 91, 51, 93, 0,116,119, 99,101,110,116, 91, 51, 93, 0,116,119,109,105,110,
+ 91, 51, 93, 0,116,119,109, 97,120, 91, 51, 93, 0,108, 97,121, 97, 99,116, 0,108, 97,121, 95,117,112,100, 97,116,101,100, 0,
+ 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 0, 99,117,115,116,111,109,100, 97,116, 97, 95,109, 97,115,107, 95,
+109,111,100, 97,108, 0, 42,101,100, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 42,115,116, 97,116,115, 0, 97,
+117,100,105,111, 0,116,114, 97,110,115,102,111,114,109, 95,115,112, 97, 99,101,115, 0, 42,115,111,117,110,100, 95,115, 99,101,
+110,101, 0, 42,115,111,117,110,100, 95,115, 99,101,110,101, 95,104, 97,110,100,108,101, 0, 42,115,111,117,110,100, 95,115, 99,
+114,117, 98, 95,104, 97,110,100,108,101, 0, 42,102,112,115, 95,105,110,102,111, 0, 42,116,104,101, 68, 97,103, 0,100, 97,103,
+105,115,118, 97,108,105,100, 0,100, 97,103,102,108, 97,103,115, 0,112, 97,100, 54, 0,112, 97,100, 53, 0, 97, 99,116,105,118,
+101, 95,107,101,121,105,110,103,115,101,116, 0,107,101,121,105,110,103,115,101,116,115, 0,103,109, 0,117,110,105,116, 0,112,
+104,121,115,105, 99,115, 95,115,101,116,116,105,110,103,115, 0, 98,108,101,110,100, 0,118,105,101,119, 0,119,105,110,109, 97,
+116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,105,110,118, 91, 52, 93,
+ 91, 52, 93, 0,112,101,114,115,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,105,110,118, 91, 52, 93, 91, 52, 93, 0,
+118,105,101,119,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,112,101,114,115,109, 97,116,111, 98, 91, 52, 93, 91, 52, 93, 0,
+116,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99, 0, 99, 97,109,
+100,120, 0, 99, 97,109,100,121, 0,112,105,120,115,105,122,101, 0, 99, 97,109,122,111,111,109, 0,116,119,100,114, 97,119,102,
+108, 97,103, 0,114,102,108, 97,103, 0,118,105,101,119,108,111, 99,107, 0,112,101,114,115,112, 0, 99,108,105,112, 91, 54, 93,
+ 91, 52, 93, 0, 99,108,105,112, 95,108,111, 99, 97,108, 91, 54, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 42,108,111,
+ 99, 97,108,118,100, 0, 42,114,105, 0, 42,100,101,112,116,104,115, 0, 42,115,109,115, 0, 42,115,109,111,111,116,104, 95,116,
+105,109,101,114, 0,108,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,108,112,101,114,115,112, 0,108,118,105,101,119, 0,103,
+114,105,100,118,105,101,119, 0,116,119, 97,110,103,108,101, 91, 51, 93, 0,112, 97,100,102, 0,114,101,103,105,111,110, 98, 97,
+115,101, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97,108,101, 0, 98,108,111, 99,107,104, 97,110,
+100,108,101,114, 91, 56, 93, 0,108, 97,121, 95,117,115,101,100, 0, 42,111, 98, 95, 99,101,110,116,114,101, 0, 98,103,112,105,
+ 99, 98, 97,115,101, 0, 42, 98,103,112,105, 99, 0,111, 98, 95, 99,101,110,116,114,101, 95, 98,111,110,101, 91, 51, 50, 93, 0,
+100,114, 97,119,116,121,112,101, 0,111, 98, 95, 99,101,110,116,114,101, 95, 99,117,114,115,111,114, 0,115, 99,101,110,101,108,
+111, 99,107, 0, 97,114,111,117,110,100, 0,112,105,118,111,116, 95,108, 97,115,116, 0,103,114,105,100, 0,110,101, 97,114, 0,
+102, 97,114, 0,103,114,105,100,108,105,110,101,115, 0,103,114,105,100,102,108, 97,103, 0,103,114,105,100,115,117, 98,100,105,
+118, 0,109,111,100,101,115,101,108,101, 99,116, 0,107,101,121,102,108, 97,103,115, 0,116,119,116,121,112,101, 0,116,119,109,
+111,100,101, 0,116,119,102,108, 97,103, 0, 97,102,116,101,114,100,114, 97,119, 95,116,114, 97,110,115,112, 0, 97,102,116,101,
+114,100,114, 97,119, 95,120,114, 97,121, 0, 97,102,116,101,114,100,114, 97,119, 95,120,114, 97,121,116,114, 97,110,115,112, 0,
+122, 98,117,102, 0,120,114, 97,121, 0,110,100,111,102,109,111,100,101, 0,110,100,111,102,102,105,108,116,101,114, 0, 42,112,
+114,111,112,101,114,116,105,101,115, 95,115,116,111,114, 97,103,101, 0,118,101,114,116, 0,104,111,114, 0,109, 97,115,107, 0,
+109,105,110, 91, 50, 93, 0,109, 97,120, 91, 50, 93, 0,109,105,110,122,111,111,109, 0,109, 97,120,122,111,111,109, 0,115, 99,
+114,111,108,108, 0,115, 99,114,111,108,108, 95,117,105, 0,107,101,101,112,116,111,116, 0,107,101,101,112,122,111,111,109, 0,
+107,101,101,112,111,102,115, 0, 97,108,105,103,110, 0,119,105,110,120, 0,119,105,110,121, 0,111,108,100,119,105,110,120, 0,
+111,108,100,119,105,110,121, 0, 42,116, 97, 98, 95,111,102,102,115,101,116, 0,116, 97, 98, 95,110,117,109, 0,116, 97, 98, 95,
+ 99,117,114, 0,114,112,116, 95,109, 97,115,107, 0,118, 50,100, 0, 42, 97,100,115, 0,103,104,111,115,116, 67,117,114,118,101,
+115, 0, 97,117,116,111,115,110, 97,112, 0, 99,117,114,115,111,114, 86, 97,108, 0,109, 97,105,110, 98, 0,109, 97,105,110, 98,
+111, 0,109, 97,105,110, 98,117,115,101,114, 0,114,101, 95, 97,108,105,103,110, 0,112,114,101,118,105,101,119, 0,116,101,120,
+116,117,114,101, 95, 99,111,110,116,101,120,116, 0,112, 97,116,104,102,108, 97,103, 0,100, 97,116, 97,105, 99,111,110, 0, 42,
+112,105,110,105,100, 0,114,101,110,100,101,114, 95,115,105,122,101, 0, 99,104, 97,110,115,104,111,119,110, 0,122,101, 98,114,
+ 97, 0,122,111,111,109, 0,116,105,116,108,101, 91, 51, 50, 93, 0,100,105,114, 91, 50, 52, 48, 93, 0,102,105,108,101, 91, 56,
+ 48, 93, 0,114,101,110, 97,109,101,102,105,108,101, 91, 56, 48, 93, 0,114,101,110, 97,109,101,101,100,105,116, 91, 56, 48, 93,
+ 0,102,105,108,116,101,114, 95,103,108,111, 98, 91, 54, 52, 93, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 0,115,101,108,
+ 95,102,105,114,115,116, 0,115,101,108, 95,108, 97,115,116, 0,115,111,114,116, 0,100,105,115,112,108, 97,121, 0,102, 95,102,
112, 0,102,112, 95,115,116,114, 91, 56, 93, 0,115, 99,114,111,108,108, 95,111,102,102,115,101,116, 0, 42,112, 97,114, 97,109,
115, 0, 42,102,105,108,101,115, 0, 42,102,111,108,100,101,114,115, 95,112,114,101,118, 0, 42,102,111,108,100,101,114,115, 95,
110,101,120,116, 0, 42,111,112, 0, 42,115,109,111,111,116,104,115, 99,114,111,108,108, 95,116,105,109,101,114, 0, 42,108, 97,
@@ -11491,356 +10039,363 @@ char datatoc_startup_blend[]= {
116, 0,111,118,101,114,119,114,105,116,101, 0,108,105,118,101, 95,101,100,105,116, 0,112,105,120, 95,112,101,114, 95,108,105,
110,101, 0,116,120,116,115, 99,114,111,108,108, 0,116,120,116, 98, 97,114, 0,119,111,114,100,119,114, 97,112, 0,100,111,112,
108,117,103,105,110,115, 0,102,105,110,100,115,116,114, 91, 50, 53, 54, 93, 0,114,101,112,108, 97, 99,101,115,116,114, 91, 50,
- 53, 54, 93, 0, 42,100,114, 97,119, 99, 97, 99,104,101, 0, 42,112,121, 95,100,114, 97,119, 0, 42,112,121, 95,101,118,101,110,
-116, 0, 42,112,121, 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98,114,111,119,115,101,114, 99, 97,108,108, 98, 97, 99,107,
- 0, 42,112,121, 95,103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97,115,116,115,112, 97, 99,101, 0,115, 99,114,105,112,116,
-110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99,114,105,112,116, 97,114,103, 91, 50, 53, 54, 93, 0, 42,115, 99,114,105,112,116,
- 0, 42, 98,117,116, 95,114,101,102,115, 0, 42, 97,114,114, 97,121, 0, 99, 97, 99,104,101,115, 0, 99, 97, 99,104,101, 95,100,
-105,115,112,108, 97,121, 0,114,101,100,114, 97,119,115, 0, 42,105,100, 0, 97,115,112,101, 99,116, 0, 42, 99,117,114,102,111,
-110,116, 0,109,120, 0,109,121, 0, 42,101,100,105,116,116,114,101,101, 0,116,114,101,101,116,121,112,101, 0,116,101,120,102,
-114,111,109, 0,116,105,116,108,101, 91, 50, 52, 93, 0,109,101,110,117, 0,110,117,109,116,105,108,101,115,120, 0,110,117,109,
-116,105,108,101,115,121, 0,118,105,101,119,114,101, 99,116, 0, 98,111,111,107,109, 97,114,107,114,101, 99,116, 0,115, 99,114,
+ 53, 54, 93, 0,109, 97,114,103,105,110, 95, 99,111,108,117,109,110, 0, 42,100,114, 97,119, 99, 97, 99,104,101, 0, 42,112,121,
+ 95,100,114, 97,119, 0, 42,112,121, 95,101,118,101,110,116, 0, 42,112,121, 95, 98,117,116,116,111,110, 0, 42,112,121, 95, 98,
+114,111,119,115,101,114, 99, 97,108,108, 98, 97, 99,107, 0, 42,112,121, 95,103,108,111, 98, 97,108,100,105, 99,116, 0,108, 97,
+115,116,115,112, 97, 99,101, 0,115, 99,114,105,112,116,110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99,114,105,112,116, 97,114,
+103, 91, 50, 53, 54, 93, 0, 42,115, 99,114,105,112,116, 0, 42, 98,117,116, 95,114,101,102,115, 0, 42, 97,114,114, 97,121, 0,
+ 99, 97, 99,104,101,115, 0, 99, 97, 99,104,101, 95,100,105,115,112,108, 97,121, 0,114,101,100,114, 97,119,115, 0, 42,105,100,
+ 0, 97,115,112,101, 99,116, 0, 42, 99,117,114,102,111,110,116, 0,109,120, 0,109,121, 0, 42,101,100,105,116,116,114,101,101,
+ 0,116,114,101,101,116,121,112,101, 0,116,101,120,102,114,111,109, 0,108,105,110,107,100,114, 97,103, 0,116,105,116,108,101,
+ 91, 50, 52, 93, 0,109,101,110,117, 0,110,117,109,116,105,108,101,115,120, 0,110,117,109,116,105,108,101,115,121, 0,115,101,
+108,115,116, 97,116,101, 0,118,105,101,119,114,101, 99,116, 0, 98,111,111,107,109, 97,114,107,114,101, 99,116, 0,115, 99,114,
111,108,108,112,111,115, 0,115, 99,114,111,108,108,104,101,105,103,104,116, 0,115, 99,114,111,108,108, 97,114,101, 97, 0,114,
-101,116,118, 97,108, 0,112,114,118, 95,119, 0,112,114,118, 95,104, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 41, 40,
- 41, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 95,101,118,101,110,116, 41, 40, 41, 0, 40, 42,114,101,116,117,114,110,
-102,117,110, 99, 95, 97,114,103,115, 41, 40, 41, 0, 42, 97,114,103, 49, 0, 42, 97,114,103, 50, 0, 42,109,101,110,117,112, 0,
- 42,112,117,112,109,101,110,117, 0, 42,105,109,103, 0,108,101,110, 95, 97,108,108,111, 99, 0, 99,117,114,115,111,114, 0,115,
- 99,114,111,108,108, 98, 97, 99,107, 0,104,105,115,116,111,114,121, 0,112,114,111,109,112,116, 91, 50, 53, 54, 93, 0,108, 97,
-110,103,117, 97,103,101, 91, 51, 50, 93, 0,115,101,108, 95,115,116, 97,114,116, 0,115,101,108, 95,101,110,100, 0,102,105,108,
-116,101,114, 91, 54, 52, 93, 0, 42, 97,114,101, 97, 0, 42,115,111,117,110,100, 0,115,110,100,110,114, 0,102,105,108,101,110,
- 97,109,101, 91, 50, 53, 54, 93, 0, 98,108,102, 95,105,100, 0,117,105,102,111,110,116, 95,105,100, 0,114, 95,116,111, 95,108,
- 0,112,111,105,110,116,115, 0,107,101,114,110,105,110,103, 0,105,116, 97,108,105, 99, 0, 98,111,108,100, 0,115,104, 97,100,
-111,119, 0,115,104, 97,100,120, 0,115,104, 97,100,121, 0,115,104, 97,100,111,119, 97,108,112,104, 97, 0,115,104, 97,100,111,
-119, 99,111,108,111,114, 0,112, 97,110,101,108,116,105,116,108,101, 0,103,114,111,117,112,108, 97, 98,101,108, 0,119,105,100,
-103,101,116,108, 97, 98,101,108, 0,119,105,100,103,101,116, 0,112, 97,110,101,108,122,111,111,109, 0,109,105,110,108, 97, 98,
-101,108, 99,104, 97,114,115, 0,109,105,110,119,105,100,103,101,116, 99,104, 97,114,115, 0, 99,111,108,117,109,110,115,112, 97,
- 99,101, 0,116,101,109,112,108, 97,116,101,115,112, 97, 99,101, 0, 98,111,120,115,112, 97, 99,101, 0, 98,117,116,116,111,110,
-115,112, 97, 99,101,120, 0, 98,117,116,116,111,110,115,112, 97, 99,101,121, 0,112, 97,110,101,108,115,112, 97, 99,101, 0,112,
- 97,110,101,108,111,117,116,101,114, 0,112, 97,100, 91, 49, 93, 0,111,117,116,108,105,110,101, 91, 52, 93, 0,105,110,110,101,
-114, 91, 52, 93, 0,105,110,110,101,114, 95,115,101,108, 91, 52, 93, 0,105,116,101,109, 91, 52, 93, 0,116,101,120,116, 91, 52,
- 93, 0,116,101,120,116, 95,115,101,108, 91, 52, 93, 0,115,104, 97,100,101,100, 0,115,104, 97,100,101,116,111,112, 0,115,104,
- 97,100,101,100,111,119,110, 0, 97,108,112,104, 97, 95, 99,104,101, 99,107, 0,105,110,110,101,114, 95, 97,110,105,109, 91, 52,
- 93, 0,105,110,110,101,114, 95, 97,110,105,109, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 91, 52, 93,
- 0,105,110,110,101,114, 95,107,101,121, 95,115,101,108, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 91, 52,
- 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 95,115,101,108, 91, 52, 93, 0,119, 99,111,108, 95,114,101,103,117,108,
- 97,114, 0,119, 99,111,108, 95,116,111,111,108, 0,119, 99,111,108, 95,116,101,120,116, 0,119, 99,111,108, 95,114, 97,100,105,
-111, 0,119, 99,111,108, 95,111,112,116,105,111,110, 0,119, 99,111,108, 95,116,111,103,103,108,101, 0,119, 99,111,108, 95,110,
-117,109, 0,119, 99,111,108, 95,110,117,109,115,108,105,100,101,114, 0,119, 99,111,108, 95,109,101,110,117, 0,119, 99,111,108,
- 95,112,117,108,108,100,111,119,110, 0,119, 99,111,108, 95,109,101,110,117, 95, 98, 97, 99,107, 0,119, 99,111,108, 95,109,101,
-110,117, 95,105,116,101,109, 0,119, 99,111,108, 95, 98,111,120, 0,119, 99,111,108, 95,115, 99,114,111,108,108, 0,119, 99,111,
-108, 95,112,114,111,103,114,101,115,115, 0,119, 99,111,108, 95,108,105,115,116, 95,105,116,101,109, 0,119, 99,111,108, 95,115,
-116, 97,116,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, 0, 98, 97, 99,107, 91, 52, 93, 0,116,105,116,108,101, 91,
- 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,
-105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,
-120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,105,116,108,101, 91,
- 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 95,104,105,
- 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116, 95,116,105,116,108,101, 91, 52, 93, 0,108,105,115,116, 95,116,
-101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,112, 97,110,101,108, 91, 52, 93, 0,
-112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 91, 52, 93, 0,112, 97,110,
-101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104, 97,100,101, 49, 91, 52, 93, 0,115,104, 97,100,101, 50, 91, 52,
- 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100, 91, 52, 93, 0,119,105,114,101, 91, 52, 93, 0,115,101,108,101,
- 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0, 97, 99,116,105,118,101, 91, 52, 93, 0,103,114,111,117,112, 91, 52, 93,
- 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,116,114, 97,110,115,102,111,114,109, 91, 52, 93, 0,118,101,
-114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 91, 52, 93,
- 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 95,115,101, 97,109, 91, 52, 93, 0,101,100,103,
-101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, 95,102, 97, 99,101,115,101,108, 91, 52, 93, 0,101,100,103,101, 95,
- 99,114,101, 97,115,101, 91, 52, 93, 0,102, 97, 99,101, 91, 52, 93, 0,102, 97, 99,101, 95,115,101,108,101, 99,116, 91, 52, 93,
- 0,102, 97, 99,101, 95,100,111,116, 91, 52, 93, 0,101,120,116,114, 97, 95,101,100,103,101, 95,108,101,110, 91, 52, 93, 0,101,
-120,116,114, 97, 95,102, 97, 99,101, 95, 97,110,103,108,101, 91, 52, 93, 0,101,120,116,114, 97, 95,102, 97, 99,101, 95, 97,114,
-101, 97, 91, 52, 93, 0,112, 97,100, 51, 91, 52, 93, 0,110,111,114,109, 97,108, 91, 52, 93, 0,118,101,114,116,101,120, 95,110,
-111,114,109, 97,108, 91, 52, 93, 0, 98,111,110,101, 95,115,111,108,105,100, 91, 52, 93, 0, 98,111,110,101, 95,112,111,115,101,
- 91, 52, 93, 0,115,116,114,105,112, 91, 52, 93, 0,115,116,114,105,112, 95,115,101,108,101, 99,116, 91, 52, 93, 0, 99,102,114,
- 97,109,101, 91, 52, 93, 0,110,117,114, 98, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,118,108,105,110,101, 91,
- 52, 93, 0, 97, 99,116, 95,115,112,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,117,108,105,110,101, 91,
- 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,118,108,105,110,101, 91, 52, 93, 0,108, 97,115,116,115,101,108, 95,112,111,105,
-110,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,102,114,101,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,117,116,111,
- 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,108,105,103,110, 91,
- 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,102,114,101,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108,
- 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,
-108,101, 95,115,101,108, 95, 97,108,105,103,110, 91, 52, 93, 0,100,115, 95, 99,104, 97,110,110,101,108, 91, 52, 93, 0,100,115,
- 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,111,117,116,112,117,116, 91, 52, 93,
- 0, 99,111,110,115,111,108,101, 95,105,110,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,102,111, 91, 52,
- 93, 0, 99,111,110,115,111,108,101, 95,101,114,114,111,114, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95, 99,117,114,115,111,
-114, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101, 0,102, 97, 99,101,100,111,116, 95,115,105,122,101, 0, 98,112,
- 97,100, 91, 50, 93, 0,115,121,110,116, 97,120,108, 91, 52, 93, 0,115,121,110,116, 97,120,110, 91, 52, 93, 0,115,121,110,116,
- 97,120, 98, 91, 52, 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, 0,115,121,110,116, 97,120, 99, 91, 52, 93, 0,109,111,118,
-105,101, 91, 52, 93, 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99,101,110,101, 91, 52, 93, 0, 97,117,100,105,111, 91, 52, 93,
- 0,101,102,102,101, 99,116, 91, 52, 93, 0,112,108,117,103,105,110, 91, 52, 93, 0,116,114, 97,110,115,105,116,105,111,110, 91,
- 52, 93, 0,109,101,116, 97, 91, 52, 93, 0,101,100,105,116,109,101,115,104, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,104, 97,
-110,100,108,101, 95,118,101,114,116,101,120, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,101,108,
-101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,105,122,101, 0,104,112, 97,100, 91, 55,
- 93, 0,112,114,101,118,105,101,119, 95, 98, 97, 99,107, 91, 52, 93, 0,115,111,108,105,100, 91, 52, 93, 0,116,117,105, 0,116,
- 98,117,116,115, 0,116,118, 51,100, 0,116,102,105,108,101, 0,116,105,112,111, 0,116,105,110,102,111, 0,116,115,110,100, 0,
-116, 97, 99,116, 0,116,110,108, 97, 0,116,115,101,113, 0,116,105,109, 97, 0,116,105,109, 97,115,101,108, 0,116,101,120,116,
- 0,116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0,116,108,111,103,105, 99, 0,116,117,115,101,114,112,
-114,101,102, 0,116, 99,111,110,115,111,108,101, 0,116, 97,114,109, 91, 50, 48, 93, 0, 97, 99,116,105,118,101, 95,116,104,101,
-109,101, 95, 97,114,101, 97, 0,109,111,100,117,108,101, 91, 54, 52, 93, 0,115,112,101, 99, 91, 52, 93, 0,100,117,112,102,108,
- 97,103, 0,115, 97,118,101,116,105,109,101, 0,116,101,109,112,100,105,114, 91, 49, 54, 48, 93, 0,102,111,110,116,100,105,114,
- 91, 49, 54, 48, 93, 0,114,101,110,100,101,114,100,105,114, 91, 49, 54, 48, 93, 0,116,101,120,116,117,100,105,114, 91, 49, 54,
- 48, 93, 0,112,108,117,103,116,101,120,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,115,101,113,100,105,114, 91, 49, 54,
- 48, 93, 0,112,121,116,104,111,110,100,105,114, 91, 49, 54, 48, 93, 0,115,111,117,110,100,100,105,114, 91, 49, 54, 48, 93, 0,
-105,109, 97,103,101, 95,101,100,105,116,111,114, 91, 50, 52, 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 91, 50, 52,
- 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 95,112,114,101,115,101,116, 0,118, 50,100, 95,109,105,110, 95,103,114,
-105,100,115,105,122,101, 0,116,105,109,101, 99,111,100,101, 95,115,116,121,108,101, 0,118,101,114,115,105,111,110,115, 0,100,
- 98,108, 95, 99,108,105, 99,107, 95,116,105,109,101, 0,103, 97,109,101,102,108, 97,103,115, 0,119,104,101,101,108,108,105,110,
-101,115, 99,114,111,108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, 97,103,101, 0,117,115,101,114,112,114,101,102,
- 0,118,105,101,119,122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, 0, 97,117,100,105,111,100,101,118,105, 99,101,
- 0, 97,117,100,105,111,114, 97,116,101, 0, 97,117,100,105,111,102,111,114,109, 97,116, 0, 97,117,100,105,111, 99,104, 97,110,
-110,101,108,115, 0,100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97,110,115,111,112,116,115, 0,109,101,110,117,
-116,104,114,101,115,104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 50, 0,116,104,101,109,101,115,
- 0,117,105,102,111,110,116,115, 0,117,105,115,116,121,108,101,115, 0,107,101,121,109, 97,112,115, 0, 97,100,100,111,110,115,
- 0,107,101,121, 99,111,110,102,105,103,115,116,114, 91, 54, 52, 93, 0,117,110,100,111,115,116,101,112,115, 0,117,110,100,111,
-109,101,109,111,114,121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116, 0,103,112, 95,101,117, 99,108,105,
-100,101, 97,110,100,105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,101,116,116,105,110,103,115, 0,116,
- 98, 95,108,101,102,116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,115,101, 0,108,105,103,104,116, 91,
- 51, 93, 0,116,119, 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,119, 95,104, 97,110,100,108,101,115,
-105,122,101, 0,116,119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,116,101,120, 99,111,108,108,101, 99,
-116,114, 97,116,101, 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,103,116,104,114,101,115,104,111,108,100,
- 0,109,101,109, 99, 97, 99,104,101,108,105,109,105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0,102,114,
- 97,109,101,115,101,114,118,101,114,112,111,114,116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, 99,101,
-110,116,101,114, 95,100,105, 97, 0,114,118,105,115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99,101,110,
-116, 95,102,105,108,101,115, 0,115,109,111,111,116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109,105,116,
- 0,110,100,111,102, 95,112, 97,110, 0,110,100,111,102, 95,114,111,116, 97,116,101, 0, 99,117,114,115,115,105,122,101, 0, 99,
-111,108,111,114, 95,112,105, 99,107,101,114, 95,116,121,112,101, 0,105,112,111, 95,110,101,119, 0,107,101,121,104, 97,110,100,
-108,101,115, 95,110,101,119, 0,115, 99,114, 99, 97,115,116,102,112,115, 0,115, 99,114, 99, 97,115,116,119, 97,105,116, 0,112,
- 97,100, 56, 0,118,101,114,115,101,109, 97,115,116,101,114, 91, 49, 54, 48, 93, 0,118,101,114,115,101,117,115,101,114, 91, 49,
- 54, 48, 93, 0,103,108, 97,108,112,104, 97, 99,108,105,112, 0,116,101,120,116, 95,114,101,110,100,101,114, 0,112, 97,100, 57,
- 0,112, 97,100, 49, 48, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,
-111,118,101,114,108, 97,121, 95, 99,111,108, 91, 51, 93, 0, 97,117,116,104,111,114, 91, 56, 48, 93, 0,118,101,114,116, 98, 97,
-115,101, 0,101,100,103,101, 98, 97,115,101, 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99,101,110,101, 0,102,
-117,108,108, 0,116,101,109,112, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, 0,100,111, 95,114,101,102,114,101,115,
-104, 0,100,111, 95,100,114, 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100,114, 97,119, 95,112, 97,105,110,116, 99,
-117,114,115,111,114, 0,100,111, 95,100,114, 97,119, 95,100,114, 97,103, 0,115,119, 97,112, 0,109, 97,105,110,119,105,110, 0,
-115,117, 98,119,105,110, 97, 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101,114, 0, 42, 99,111,110,116,101,120,116,
- 0,104, 97,110,100,108,101,114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, 42,118, 49, 0, 42,118, 50, 0, 42,116,
-121,112,101, 0,112, 97,110,101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,101, 91, 54, 52, 93, 0,100,114,
- 97,119,110, 97,109,101, 91, 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115,105,122,101,120, 0,115,105,122,101,121,
- 0,108, 97, 98,101,108,111,102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, 0, 99,111,110,116,114,111,108, 0,115,
-110, 97,112, 0,115,111,114,116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42, 97, 99,116,105,118,101,100,
- 97,116, 97, 0,108,105,115,116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115,105,122,101, 0,108,105,115,116, 95,108,
- 97,115,116, 95,108,101,110, 0,108,105,115,116, 95,103,114,105,112, 95,115,105,122,101, 0,108,105,115,116, 95,115,101, 97,114,
- 99,104, 91, 54, 52, 93, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,115,112, 97, 99,101,116,121,112,
-101, 0,104,101, 97,100,101,114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104, 97,110,100,108,101,114,115, 0,
- 97, 99,116,105,111,110,122,111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114, 99,116, 0,115,119,105,110,105,
-100, 0,114,101,103,105,111,110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,100,111, 95,100,114, 97,119, 95,111,
-118,101,114,108, 97,121, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 0, 42,104,101, 97,100,101,114,115,116,
-114, 0, 42,114,101,103,105,111,110,100, 97,116, 97, 0,115,117, 98,118,115,116,114, 91, 52, 93, 0,115,117, 98,118,101,114,115,
-105,111,110, 0,112, 97,100,115, 0,109,105,110,118,101,114,115,105,111,110, 0,109,105,110,115,117, 98,118,101,114,115,105,111,
-110, 0, 42, 99,117,114,115, 99,114,101,101,110, 0, 42, 99,117,114,115, 99,101,110,101, 0,102,105,108,101,102,108, 97,103,115,
- 0,103,108,111, 98, 97,108,102, 0,114,101,118,105,115,105,111,110, 0,102,105,108,101,110, 97,109,101, 91, 50, 52, 48, 93, 0,
-110, 97,109,101, 91, 56, 48, 93, 0,111,114,105,103, 95,119,105,100,116,104, 0,111,114,105,103, 95,104,101,105,103,104,116, 0,
- 98,111,116,116,111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,105,102,116, 91, 51, 93, 0,103,
- 97,109,109, 97, 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,100,105,114, 91, 49, 54, 48, 93, 0,100,111,110,101, 0,115,116,
- 97,114,116,115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,100, 97,116, 97, 0, 42, 99,114,
-111,112, 0, 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111,108,111,114, 95, 98, 97,108, 97,110, 99,101, 0, 42,105,110,
-115,116, 97,110, 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,114,114,101,110,116, 95,112,114,
-105,118, 97,116,101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115, 0,101,110,100,111,102,115, 0,
-109, 97, 99,104,105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,112, 0,115, 97,116, 0,109,117,
-108, 0,104, 97,110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, 0, 42,115,116,114,105,112, 0, 42,
-115, 99,101,110,101, 95, 99, 97,109,101,114, 97, 0,101,102,102,101, 99,116, 95,102, 97,100,101,114, 0,115,112,101,101,100, 95,
-102, 97,100,101,114, 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42,115,101,113, 51, 0,115,101,113, 98, 97,115,101, 0,
- 42,115, 99,101,110,101, 95,115,111,117,110,100, 0,108,101,118,101,108, 0,112, 97,110, 0,115, 99,101,110,101,110,114, 0,109,
-117,108,116,105, 99, 97,109, 95,115,111,117,114, 99,101, 0,115,116,114,111, 98,101, 0, 42,101,102,102,101, 99,116,100, 97,116,
- 97, 0, 97,110,105,109, 95,115,116, 97,114,116,111,102,115, 0, 97,110,105,109, 95,101,110,100,111,102,115, 0, 98,108,101,110,
-100, 95,109,111,100,101, 0, 98,108,101,110,100, 95,111,112, 97, 99,105,116,121, 0, 42,111,108,100, 98, 97,115,101,112, 0, 42,
-112, 97,114,115,101,113, 0, 42,115,101,113, 98, 97,115,101,112, 0,109,101,116, 97,115,116, 97, 99,107, 0, 42, 97, 99,116, 95,
-115,101,113, 0, 97, 99,116, 95,105,109, 97,103,101,100,105,114, 91, 50, 53, 54, 93, 0, 97, 99,116, 95,115,111,117,110,100,100,
-105,114, 91, 50, 53, 54, 93, 0,111,118,101,114, 95,111,102,115, 0,111,118,101,114, 95, 99,102,114, 97, 0,111,118,101,114, 95,
-102,108, 97,103, 0,111,118,101,114, 95, 98,111,114,100,101,114, 0,101,100,103,101, 87,105,100,116,104, 0,102,111,114,119, 97,
-114,100, 0,119,105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0,102, 67,108, 97,109,112, 0,102, 66,111,111,115,116, 0,
-100, 68,105,115,116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, 67,111,109,112, 0, 83, 99, 97,108,101,120, 73,110,105,
- 0, 83, 99, 97,108,101,121, 73,110,105, 0, 83, 99, 97,108,101,120, 70,105,110, 0, 83, 99, 97,108,101,121, 70,105,110, 0,120,
- 73,110,105, 0,120, 70,105,110, 0,121, 73,110,105, 0,121, 70,105,110, 0,114,111,116, 73,110,105, 0,114,111,116, 70,105,110,
- 0,105,110,116,101,114,112,111,108, 97,116,105,111,110, 0,117,110,105,102,111,114,109, 95,115, 99, 97,108,101, 0, 42,102,114,
- 97,109,101, 77, 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101,100, 0,108, 97,115,116, 86, 97,108,105,100, 70,114, 97,109,
-101, 0, 98,117,116,116,121,112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,116,111,116,112, 97,114,116, 0,110,111,
-114,109,102, 97, 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, 97, 99, 0,116,101,120,102, 97, 99, 0,114, 97,110,100,108,
-105,102,101, 0,102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116,115,105,122,101, 0,109, 97,120,108,101,110, 0,100,101,102,
-118,101, 99, 91, 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105,102,101, 91, 52, 93, 0, 99,104,105,108,100, 91, 52, 93, 0,
-109, 97,116, 91, 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114,109,117,108,116, 0,115,116, 97,116,105, 99,115,116,101,112,
- 0,111,109, 97,116, 0,116,105,109,101,116,101,120, 0,115,112,101,101,100,116,101,120, 0,102,108, 97,103, 50,110,101,103, 0,
-118,101,114,116,103,114,111,117,112, 95,118, 0,118,103,114,111,117,112,110, 97,109,101, 91, 51, 50, 93, 0,118,103,114,111,117,
-112,110, 97,109,101, 95,118, 91, 51, 50, 93, 0, 42,107,101,121,115, 0,109,105,110,102, 97, 99, 0,110,114, 0,117,115,101,100,
- 0,117,115,101,100,101,108,101,109, 0, 42,112,111,105,110, 0,114,101,115,101,116,100,105,115,116, 0,108, 97,115,116,118, 97,
-108, 0, 42,109, 97, 0,107,101,121, 0,113,117, 97,108, 0,113,117, 97,108, 50, 0,116, 97,114,103,101,116, 78, 97,109,101, 91,
- 51, 50, 93, 0,116,111,103,103,108,101, 78, 97,109,101, 91, 51, 50, 93, 0,118, 97,108,117,101, 91, 51, 50, 93, 0,109, 97,120,
-118, 97,108,117,101, 91, 51, 50, 93, 0,100,101,108, 97,121, 0,100,117,114, 97,116,105,111,110, 0,109, 97,116,101,114,105, 97,
-108, 78, 97,109,101, 91, 51, 50, 93, 0,100, 97,109,112,116,105,109,101,114, 0,112,114,111,112,110, 97,109,101, 91, 51, 50, 93,
- 0,109, 97,116,110, 97,109,101, 91, 51, 50, 93, 0, 97,120,105,115,102,108, 97,103, 0,112,111,115,101, 99,104, 97,110,110,101,
-108, 91, 51, 50, 93, 0, 99,111,110,115,116,114, 97,105,110,116, 91, 51, 50, 93, 0, 42,102,114,111,109, 79, 98,106,101, 99,116,
- 0,115,117, 98,106,101, 99,116, 91, 51, 50, 93, 0, 98,111,100,121, 91, 51, 50, 93, 0,111,116,121,112,101, 0,112,117,108,115,
-101, 0,102,114,101,113, 0,116,111,116,108,105,110,107,115, 0, 42, 42,108,105,110,107,115, 0,116, 97,112, 0,106,111,121,105,
-110,100,101,120, 0, 97,120,105,115, 95,115,105,110,103,108,101, 0, 97,120,105,115,102, 0, 98,117,116,116,111,110, 0,104, 97,
-116, 0,104, 97,116,102, 0,112,114,101, 99,105,115,105,111,110, 0,115,116,114, 91, 49, 50, 56, 93, 0, 42,109,121,110,101,119,
- 0,105,110,112,117,116,115, 0,116,111,116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,107,115, 0,118, 97,108,111, 0,
-115,116, 97,116,101, 95,109, 97,115,107, 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,112, 91, 51, 50, 93, 0, 98,108,
-101,110,100,105,110, 0,112,114,105,111,114,105,116,121, 0,101,110,100, 95,114,101,115,101,116, 0,115,116,114,105,100,101, 97,
-120,105,115, 0,115,116,114,105,100,101,108,101,110,103,116,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,
-105,110, 0,114,101,102,101,114,101,110, 99,101, 95,100,105,115,116, 97,110, 99,101, 0,109, 97,120, 95,100,105,115,116, 97,110,
- 99,101, 0,114,111,108,108,111,102,102, 95,102, 97, 99,116,111,114, 0, 99,111,110,101, 95,105,110,110,101,114, 95, 97,110,103,
-108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95,103,
- 97,105,110, 0,112, 97,100, 51, 91, 50, 93, 0,112,105,116, 99,104, 0,115,111,117,110,100, 51, 68, 0,112, 97,100, 54, 91, 49,
- 93, 0, 42,109,101, 0,108,105,110, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103, 86,101,108,111, 99,105,116,121,
- 91, 51, 93, 0,108,111, 99, 97,108,102,108, 97,103, 0,100,121,110, 95,111,112,101,114, 97,116,105,111,110, 0,102,111,114, 99,
-101,108,111, 99, 91, 51, 93, 0,102,111,114, 99,101,114,111,116, 91, 51, 93, 0,108,105,110,101, 97,114,118,101,108,111, 99,105,
-116,121, 91, 51, 93, 0, 97,110,103,117,108, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 42,114,101,102,101,114,101,
-110, 99,101, 0,109,105,110, 0,109, 97,120, 0,114,111,116,100, 97,109,112, 0,109,105,110,108,111, 99, 91, 51, 93, 0,109, 97,
-120,108,111, 99, 91, 51, 93, 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111,116, 91, 51, 93, 0,109, 97,116,112,
-114,111,112, 91, 51, 50, 93, 0, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,100,105,115,116,114,105, 98,117,116,105,
-111,110, 0,105,110,116, 95, 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,108,111, 97,116, 95, 97,114,103,
- 95, 49, 0,102,108,111, 97,116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,101, 91, 51, 50, 93, 0, 42,116,
-111, 79, 98,106,101, 99,116, 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,101, 91, 54, 52, 93, 0,108,111,
- 97,100, 97,110,105,110, 97,109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,111, 97,116, 95, 97,114,103, 0,
- 42,115,117, 98,116, 97,114,103,101,116, 0,103,111, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108,101, 0, 97,116,116,
-101,110,117, 97,116,105,111,110, 0,100,105,115,116, 97,110, 99,101, 0, 42, 99, 97, 99,104,101, 0, 42,112,108, 97,121, 98, 97,
- 99,107, 95,104, 97,110,100,108,101, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98,106,101, 99,116, 0,100,117,112,108,105,
- 95,111,102,115, 91, 51, 93, 0, 42,112,114,111,112, 0, 99,104,105,108,100, 98, 97,115,101, 0,114,111,108,108, 0,104,101, 97,
-100, 91, 51, 93, 0,116, 97,105,108, 91, 51, 93, 0, 98,111,110,101, 95,109, 97,116, 91, 51, 93, 91, 51, 93, 0, 97,114,109, 95,
-104,101, 97,100, 91, 51, 93, 0, 97,114,109, 95,116, 97,105,108, 91, 51, 93, 0, 97,114,109, 95,109, 97,116, 91, 52, 93, 91, 52,
- 93, 0,120,119,105,100,116,104, 0,122,119,105,100,116,104, 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97,100, 95,
-104,101, 97,100, 0,114, 97,100, 95,116, 97,105,108, 0, 98,111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97,115,101,
- 0, 42,101,100, 98,111, 0, 42, 97, 99,116, 95, 98,111,110,101, 0, 42, 97, 99,116, 95,101,100, 98,111,110,101, 0, 42,115,107,
-101,116, 99,104, 0,108, 97,121,101,114, 95,117,115,101,100, 0,108, 97,121,101,114, 95,112,114,111,116,101, 99,116,101,100, 0,
-103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,122,101, 0,103,104,111,115,116,116,121,112,101, 0,112, 97,116,104,
-115,105,122,101, 0,103,104,111,115,116,115,102, 0,103,104,111,115,116,101,102, 0,112, 97,116,104,115,102, 0,112, 97,116,104,
-101,102, 0,112, 97,116,104, 98, 99, 0,112, 97,116,104, 97, 99, 0, 42,112,111,105,110,116,115, 0,115,116, 97,114,116, 95,102,
-114, 97,109,101, 0,101,110,100, 95,102,114, 97,109,101, 0,103,104,111,115,116, 95,115,102, 0,103,104,111,115,116, 95,101,102,
- 0,103,104,111,115,116, 95, 98, 99, 0,103,104,111,115,116, 95, 97, 99, 0,103,104,111,115,116, 95,116,121,112,101, 0,103,104,
-111,115,116, 95,115,116,101,112, 0,103,104,111,115,116, 95,102,108, 97,103, 0,112, 97,116,104, 95,116,121,112,101, 0,112, 97,
-116,104, 95,115,116,101,112, 0,112, 97,116,104, 95,118,105,101,119,102,108, 97,103, 0,112, 97,116,104, 95, 98, 97,107,101,102,
-108, 97,103, 0,112, 97,116,104, 95,115,102, 0,112, 97,116,104, 95,101,102, 0,112, 97,116,104, 95, 98, 99, 0,112, 97,116,104,
- 95, 97, 99, 0, 99,111,110,115,116,102,108, 97,103, 0,105,107,102,108, 97,103, 0,115,101,108,101, 99,116,102,108, 97,103, 0,
- 97,103,114,112, 95,105,110,100,101,120, 0, 42, 98,111,110,101, 0, 42, 99,104,105,108,100, 0,105,107,116,114,101,101, 0, 42,
- 99,117,115,116,111,109, 0, 42, 99,117,115,116,111,109, 95,116,120, 0,101,117,108, 91, 51, 93, 0, 99,104, 97,110, 95,109, 97,
-116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,104,101, 97,100,
- 91, 51, 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51, 93, 0,108,105,109,105,116,109,105,110, 91, 51, 93, 0,108,105,109,
-105,116,109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,101,115,115, 91, 51, 93, 0,105,107,115,116,114,101,116, 99,104, 0,
-105,107,114,111,116,119,101,105,103,104,116, 0,105,107,108,105,110,119,101,105,103,104,116, 0, 99,104, 97,110, 98, 97,115,101,
- 0, 42, 99,104, 97,110,104, 97,115,104, 0,112,114,111,120,121, 95,108, 97,121,101,114, 0,115,116,114,105,100,101, 95,111,102,
-102,115,101,116, 91, 51, 93, 0, 99,121, 99,108,105, 99, 95,111,102,102,115,101,116, 91, 51, 93, 0, 97,103,114,111,117,112,115,
- 0, 97, 99,116,105,118,101, 95,103,114,111,117,112, 0,105,107,115,111,108,118,101,114, 0, 42,105,107,100, 97,116, 97, 0, 42,
-105,107,112, 97,114, 97,109, 0,112,114,111,120,121, 95, 97, 99,116, 95, 98,111,110,101, 91, 51, 50, 93, 0,110,117,109,105,116,
-101,114, 0,110,117,109,115,116,101,112, 0,109,105,110,115,116,101,112, 0,109, 97,120,115,116,101,112, 0,115,111,108,118,101,
-114, 0,102,101,101,100, 98, 97, 99,107, 0,109, 97,120,118,101,108, 0,100, 97,109,112,109, 97,120, 0,100, 97,109,112,101,112,
-115, 0, 99,104, 97,110,110,101,108,115, 0, 99,117,115,116,111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,
-114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,109, 97,114,107,101,114, 0, 42,115,111,117,114, 99,101, 0, 42,102,105,108,
-116,101,114, 95,103,114,112, 0,102,105,108,116,101,114,102,108, 97,103, 0, 97,100,115, 0,116,105,109,101,115,108,105,100,101,
- 0, 42,103,114,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, 97,114,115,112, 97, 99,101,
- 0,101,110,102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, 0,108,105,110, 95,101,114,114,111,114, 0,114,111,116, 95,
-101,114,114,111,114, 0, 42,116, 97,114, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,114,111,
-116, 79,114,100,101,114, 0,116, 97,114,110,117,109, 0,116, 97,114,103,101,116,115, 0,105,116,101,114, 97,116,105,111,110,115,
- 0,114,111,111,116, 98,111,110,101, 0,109, 97,120, 95,114,111,111,116, 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,
-112,111,108,101,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,
-110,116,119,101,105,103,104,116, 0,103,114, 97, 98,116, 97,114,103,101,116, 91, 51, 93, 0,110,117,109,112,111,105,110,116,115,
- 0, 99,104, 97,105,110,108,101,110, 0,120,122, 83, 99, 97,108,101, 77,111,100,101, 0,114,101,115,101,114,118,101,100, 49, 0,
-114,101,115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102,108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101,
- 91, 51, 93, 0,108,111, 99,107,102,108, 97,103, 0,102,111,108,108,111,119,102,108, 97,103, 0,118,111,108,109,111,100,101, 0,
-112,108, 97,110,101, 0,111,114,103,108,101,110,103,116,104, 0, 98,117,108,103,101, 0,112,105,118, 88, 0,112,105,118, 89, 0,
-112,105,118, 90, 0, 97,120, 88, 0, 97,120, 89, 0, 97,120, 90, 0,109,105,110, 76,105,109,105,116, 91, 54, 93, 0,109, 97,120,
- 76,105,109,105,116, 91, 54, 93, 0,101,120,116,114, 97, 70,122, 0,105,110,118,109, 97,116, 91, 52, 93, 91, 52, 93, 0,102,114,
-111,109, 0,116,111, 0,109, 97,112, 91, 51, 93, 0,101,120,112,111, 0,102,114,111,109, 95,109,105,110, 91, 51, 93, 0,102,114,
-111,109, 95,109, 97,120, 91, 51, 93, 0,116,111, 95,109,105,110, 91, 51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 0,114,111,
-116, 65,120,105,115, 0,122,109,105,110, 0,122,109, 97,120, 0,112, 97,100, 91, 57, 93, 0, 99,104, 97,110,110,101,108, 91, 51,
- 50, 93, 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0,115,116,114,105,100,101, 95, 97,120,105,115, 0, 99,117,114,109,111,
-100, 0, 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 0, 97, 99,116,111,102,102,115, 0,115,116,114,105,100,101,
-108,101,110, 0,115, 99, 97,108,101, 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100,101, 99,104, 97,110,110,101,108,
- 91, 51, 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110,112,117,116, 0,104, 97,115,111,
-117,116,112,117,116, 0,100, 97,116, 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112,101, 0, 42,110,101,119, 95,115,
-111, 99,107, 0,110,115, 0,108,105,109,105,116, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 0,105,110,116,101,114,110, 0,
-115,116, 97, 99,107, 95,105,110,100,101,120, 95,101,120,116, 0,108,111, 99,120, 0,108,111, 99,121, 0,111,119,110, 95,105,110,
-100,101,120, 0,116,111, 95,105,110,100,101,120, 0, 42,116,111,115,111, 99,107, 0, 42,108,105,110,107, 0, 42,110,101,119, 95,
-110,111,100,101, 0,108, 97,115,116,121, 0,111,117,116,112,117,116,115, 0, 42,115,116,111,114, 97,103,101, 0,109,105,110,105,
-119,105,100,116,104, 0, 99,117,115,116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117,
-115,116,111,109, 52, 0,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97,
- 0,116,111,116,114, 0, 98,117,116,114, 0,112,114,118,114, 0, 42, 98,108,111, 99,107, 0, 42,116,121,112,101,105,110,102,111,
- 0, 42,102,114,111,109,110,111,100,101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0,110,111,100,
-101,115, 0,108,105,110,107,115, 0, 42,115,116, 97, 99,107, 0, 42,116,104,114,101, 97,100,115,116, 97, 99,107, 0,105,110,105,
-116, 0,115,116, 97, 99,107,115,105,122,101, 0, 99,117,114, 95,105,110,100,101,120, 0, 97,108,108,116,121,112,101,115, 0, 42,
-111,119,110,116,121,112,101, 0,112, 97,100, 50, 91, 50, 93, 0, 40, 42,112,114,111,103,114,101,115,115, 41, 40, 41, 0, 40, 42,
-115,116, 97,116,115, 95,100,114, 97,119, 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, 42,116,
- 98,104, 0, 42,112,114,104, 0, 42,115,100,104, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101,
-115, 0,109, 97,120,115,112,101,101,100, 0,109,105,110,115,112,101,101,100, 0,112,101,114, 99,101,110,116,120, 0,112,101,114,
- 99,101,110,116,121, 0, 98,111,107,101,104, 0,103, 97,109,109, 97, 0, 99,117,114,118,101,100, 0,105,109, 97,103,101, 95,105,
-110, 95,119,105,100,116,104, 0,105,109, 97,103,101, 95,105,110, 95,104,101,105,103,104,116, 0, 99,101,110,116,101,114, 95,120,
- 0, 99,101,110,116,101,114, 95,121, 0,115,112,105,110, 0,119,114, 97,112, 0,115,105,103,109, 97, 95, 99,111,108,111,114, 0,
-115,105,103,109, 97, 95,115,112, 97, 99,101, 0,104,117,101, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103,
-116,104, 0,102, 97,108,112,104, 97, 0,107,101,121, 91, 52, 93, 0, 97,108,103,111,114,105,116,104,109, 0, 99,104, 97,110,110,
-101,108, 0,120, 49, 0,120, 50, 0,121, 49, 0,121, 50, 0,102, 97, 99, 95,120, 49, 0,102, 97, 99, 95,120, 50, 0,102, 97, 99,
- 95,121, 49, 0,102, 97, 99, 95,121, 50, 0, 99,111,108,110, 97,109,101, 91, 51, 50, 93, 0, 98,107,116,121,112,101, 0,114,111,
-116, 97,116,105,111,110, 0,103, 97,109, 99,111, 0,110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120, 98,108,
-117,114, 0, 98,116,104,114,101,115,104, 0, 42,100,105, 99,116, 0, 42,110,111,100,101, 0, 97,110,103,108,101, 95,111,102,115,
- 0, 99,111,108,109,111,100, 0,109,105,120, 0,116,104,114,101,115,104,111,108,100, 0,102, 97,100,101, 0,109, 0, 99, 0,106,
-105,116, 0,112,114,111,106, 0,102,105,116, 0,115,108,111,112,101, 91, 51, 93, 0,112,111,119,101,114, 91, 51, 93, 0,108,105,
-102,116, 95,108,103,103, 91, 51, 93, 0,103, 97,109,109, 97, 95,105,110,118, 91, 51, 93, 0,108,105,109, 99,104, 97,110, 0,117,
-110,115,112,105,108,108, 0,108,105,109,115, 99, 97,108,101, 0,117,115,112,105,108,108,114, 0,117,115,112,105,108,108,103, 0,
-117,115,112,105,108,108, 98, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98,108,101, 0,109, 97,120,116, 97, 98,108,101,
- 0,101,120,116, 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, 0, 42, 99,117,114,118,101, 0, 42,116, 97,
- 98,108,101, 0, 42,112,114,101,109,117,108,116, 97, 98,108,101, 0,112,114,101,115,101,116, 0, 99,104, 97,110,103,101,100, 95,
-116,105,109,101,115,116, 97,109,112, 0, 99,117,114,114, 0, 99,108,105,112,114, 0, 99,109, 91, 52, 93, 0, 98,108, 97, 99,107,
- 91, 51, 93, 0,119,104,105,116,101, 91, 51, 93, 0, 98,119,109,117,108, 91, 51, 93, 0,115, 97,109,112,108,101, 91, 51, 93, 0,
-120, 95,114,101,115,111,108,117,116,105,111,110, 0,100, 97,116, 97, 95,114, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,103, 91,
- 50, 53, 54, 93, 0,100, 97,116, 97, 95, 98, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,108,117,109, 97, 91, 50, 53, 54, 93, 0,
-115, 97,109,112,108,101, 95,102,117,108,108, 0,115, 97,109,112,108,101, 95,108,105,110,101,115, 0, 97, 99, 99,117,114, 97, 99,
-121, 0,119, 97,118,101,102,114,109, 95,109,111,100,101, 0,119, 97,118,101,102,114,109, 95, 97,108,112,104, 97, 0,119, 97,118,
-101,102,114,109, 95,121,102, 97, 99, 0,119, 97,118,101,102,114,109, 95,104,101,105,103,104,116, 0,118,101, 99,115, 99,111,112,
-101, 95, 97,108,112,104, 97, 0,118,101, 99,115, 99,111,112,101, 95,104,101,105,103,104,116, 0,109,105,110,109, 97,120, 91, 51,
- 93, 91, 50, 93, 0,104,105,115,116, 0, 42,119, 97,118,101,102,111,114,109, 95, 49, 0, 42,119, 97,118,101,102,111,114,109, 95,
- 50, 0, 42,119, 97,118,101,102,111,114,109, 95, 51, 0, 42,118,101, 99,115, 99,111,112,101, 0,119, 97,118,101,102,111,114,109,
- 95,116,111,116, 0,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,109,116,101,120, 0, 42,105, 99,111,110, 95,
-105,109, 98,117,102, 0,105, 99,111,110, 95,102,105,108,101,112, 97,116,104, 91, 50, 52, 48, 93, 0,105, 99,111,110, 95,109,111,
-100,101, 0,110,111,114,109, 97,108, 95,119,101,105,103,104,116, 0,111, 98, 95,109,111,100,101, 0,106,105,116,116,101,114, 0,
-115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,114, 97,100,105,117,115, 0,115,109,111,111,116,104, 95,115,116,114,111,
-107,101, 95,102, 97, 99,116,111,114, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0,115, 99,117,108,112,116, 95,112,108, 97,
-110,101, 0,112,108, 97,110,101, 95,111,102,102,115,101,116, 0,115, 99,117,108,112,116, 95,116,111,111,108, 0,118,101,114,116,
-101,120,112, 97,105,110,116, 95,116,111,111,108, 0,105,109, 97,103,101,112, 97,105,110,116, 95,116,111,111,108, 0, 97,117,116,
-111,115,109,111,111,116,104, 95,102, 97, 99,116,111,114, 0, 99,114,101, 97,115,101, 95,112,105,110, 99,104, 95,102, 97, 99,116,
-111,114, 0,112,108, 97,110,101, 95,116,114,105,109, 0,116,101,120,116,117,114,101, 95,115, 97,109,112,108,101, 95, 98,105, 97,
-115, 0,116,101,120,116,117,114,101, 95,111,118,101,114,108, 97,121, 95, 97,108,112,104, 97, 0,117,110,112,114,111,106,101, 99,
-116,101,100, 95,114, 97,100,105,117,115, 0, 97,100,100, 95, 99,111,108, 91, 51, 93, 0,115,117, 98, 95, 99,111,108, 91, 51, 93,
- 0, 97, 99,116,105,118,101, 95,114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, 97, 99,116,105,118,101, 95,
-109, 97,115,107, 0, 42,108, 97,121,101,114,115, 0,116,111,116,108, 97,121,101,114, 0,109, 97,120,108, 97,121,101,114, 0,116,
-111,116,115,105,122,101, 0, 42,112,111,111,108, 0, 42,101,120,116,101,114,110, 97,108, 0,118,101,108, 91, 51, 93, 0,114,111,
-116, 91, 52, 93, 0, 97,118,101, 91, 51, 93, 0, 42,103,114,111,117,110,100, 0,119, 97,110,100,101,114, 91, 51, 93, 0,114,101,
-115,116, 95,108,101,110,103,116,104, 0,112, 97,114,116,105, 99,108,101, 95,105,110,100,101,120, 91, 50, 93, 0,100,101,108,101,
-116,101, 95,102,108, 97,103, 0,110,117,109, 0,112, 97,114,101,110,116, 0,112, 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117,
-118, 91, 52, 93, 0,102,111,102,102,115,101,116, 0,114,116, 91, 50, 93, 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104,
- 97,105,114, 0, 42, 98,111,105,100, 0,100,105,101,116,105,109,101, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0,104, 97,
-105,114, 95,105,110,100,101,120, 0, 97,108,105,118,101, 0,115,112,114,105,110,103, 95,107, 0,112,108, 97,115,116,105, 99,105,
-116,121, 95, 99,111,110,115,116, 97,110,116, 0,121,105,101,108,100, 95,114, 97,116,105,111, 0,118,105,115, 99,111,115,105,116,
-121, 95,111,109,101,103, 97, 0,118,105,115, 99,111,115,105,116,121, 95, 98,101,116, 97, 0,115,116,105,102,102,110,101,115,115,
- 95,107, 0,115,116,105,102,102,110,101,115,115, 95,107,110,101, 97,114, 0,114,101,115,116, 95,100,101,110,115,105,116,121, 0,
- 98,117,111,121, 97,110, 99,121, 0, 42, 98,111,105,100,115, 0, 42,102,108,117,105,100, 0,100,105,115,116,114, 0,112,104,121,
-115,116,121,112,101, 0, 97,118,101,109,111,100,101, 0,114,101, 97, 99,116,101,118,101,110,116, 0,100,114, 97,119, 0,100,114,
- 97,119, 95, 97,115, 0,100,114, 97,119, 95,115,105,122,101, 0, 99,104,105,108,100,116,121,112,101, 0,114,101,110, 95, 97,115,
- 0,115,117, 98,102,114, 97,109,101,115, 0,114,101,110, 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,
-121,115, 95,115,116,101,112, 0, 97,100, 97,112,116, 95, 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,
-116,102,114,111,109, 0,105,110,116,101,103,114, 97,116,111,114, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,
-115,112,108,105,116, 0, 98, 98, 95, 97,110,105,109, 0, 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98,
- 95,116,105,108,116, 0, 98, 98, 95,114, 97,110,100, 95,116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0,
+101,116,118, 97,108, 0, 97, 99,116,105,118,101, 95, 98,111,111,107,109, 97,114,107, 0,112,114,118, 95,119, 0,112,114,118, 95,
+104, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 41, 40, 41, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 95,101,
+118,101,110,116, 41, 40, 41, 0, 40, 42,114,101,116,117,114,110,102,117,110, 99, 95, 97,114,103,115, 41, 40, 41, 0, 42, 97,114,
+103, 49, 0, 42, 97,114,103, 50, 0, 42,109,101,110,117,112, 0, 42,112,117,112,109,101,110,117, 0, 42,105,109,103, 0,108,101,
+110, 95, 97,108,108,111, 99, 0, 99,117,114,115,111,114, 0,115, 99,114,111,108,108, 98, 97, 99,107, 0,104,105,115,116,111,114,
+121, 0,112,114,111,109,112,116, 91, 50, 53, 54, 93, 0,108, 97,110,103,117, 97,103,101, 91, 51, 50, 93, 0,115,101,108, 95,115,
+116, 97,114,116, 0,115,101,108, 95,101,110,100, 0,102,105,108,116,101,114, 91, 54, 52, 93, 0, 42, 97,114,101, 97, 0, 42,115,
+111,117,110,100, 0,115,110,100,110,114, 0,102,105,108,101,110, 97,109,101, 91, 50, 53, 54, 93, 0, 98,108,102, 95,105,100, 0,
+117,105,102,111,110,116, 95,105,100, 0,114, 95,116,111, 95,108, 0,112,111,105,110,116,115, 0,107,101,114,110,105,110,103, 0,
+105,116, 97,108,105, 99, 0, 98,111,108,100, 0,115,104, 97,100,111,119, 0,115,104, 97,100,120, 0,115,104, 97,100,121, 0,115,
+104, 97,100,111,119, 97,108,112,104, 97, 0,115,104, 97,100,111,119, 99,111,108,111,114, 0,112, 97,110,101,108,116,105,116,108,
+101, 0,103,114,111,117,112,108, 97, 98,101,108, 0,119,105,100,103,101,116,108, 97, 98,101,108, 0,119,105,100,103,101,116, 0,
+112, 97,110,101,108,122,111,111,109, 0,109,105,110,108, 97, 98,101,108, 99,104, 97,114,115, 0,109,105,110,119,105,100,103,101,
+116, 99,104, 97,114,115, 0, 99,111,108,117,109,110,115,112, 97, 99,101, 0,116,101,109,112,108, 97,116,101,115,112, 97, 99,101,
+ 0, 98,111,120,115,112, 97, 99,101, 0, 98,117,116,116,111,110,115,112, 97, 99,101,120, 0, 98,117,116,116,111,110,115,112, 97,
+ 99,101,121, 0,112, 97,110,101,108,115,112, 97, 99,101, 0,112, 97,110,101,108,111,117,116,101,114, 0,112, 97,100, 91, 49, 93,
+ 0,111,117,116,108,105,110,101, 91, 52, 93, 0,105,110,110,101,114, 91, 52, 93, 0,105,110,110,101,114, 95,115,101,108, 91, 52,
+ 93, 0,105,116,101,109, 91, 52, 93, 0,116,101,120,116, 91, 52, 93, 0,116,101,120,116, 95,115,101,108, 91, 52, 93, 0,115,104,
+ 97,100,101,100, 0,115,104, 97,100,101,116,111,112, 0,115,104, 97,100,101,100,111,119,110, 0, 97,108,112,104, 97, 95, 99,104,
+101, 99,107, 0,105,110,110,101,114, 95, 97,110,105,109, 91, 52, 93, 0,105,110,110,101,114, 95, 97,110,105,109, 95,115,101,108,
+ 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 91, 52, 93, 0,105,110,110,101,114, 95,107,101,121, 95,115,101,108, 91, 52,
+ 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 91, 52, 93, 0,105,110,110,101,114, 95,100,114,105,118,101,110, 95,115,
+101,108, 91, 52, 93, 0,119, 99,111,108, 95,114,101,103,117,108, 97,114, 0,119, 99,111,108, 95,116,111,111,108, 0,119, 99,111,
+108, 95,116,101,120,116, 0,119, 99,111,108, 95,114, 97,100,105,111, 0,119, 99,111,108, 95,111,112,116,105,111,110, 0,119, 99,
+111,108, 95,116,111,103,103,108,101, 0,119, 99,111,108, 95,110,117,109, 0,119, 99,111,108, 95,110,117,109,115,108,105,100,101,
+114, 0,119, 99,111,108, 95,109,101,110,117, 0,119, 99,111,108, 95,112,117,108,108,100,111,119,110, 0,119, 99,111,108, 95,109,
+101,110,117, 95, 98, 97, 99,107, 0,119, 99,111,108, 95,109,101,110,117, 95,105,116,101,109, 0,119, 99,111,108, 95, 98,111,120,
+ 0,119, 99,111,108, 95,115, 99,114,111,108,108, 0,119, 99,111,108, 95,112,114,111,103,114,101,115,115, 0,119, 99,111,108, 95,
+108,105,115,116, 95,105,116,101,109, 0,119, 99,111,108, 95,115,116, 97,116,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48,
+ 93, 0, 98, 97, 99,107, 91, 52, 93, 0,116,105,116,108,101, 91, 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,104,101,
+ 97,100,101,114, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,105,116,108,101, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,
+101,120,116, 91, 52, 93, 0,104,101, 97,100,101,114, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0, 98,117,116,116,111,110, 91,
+ 52, 93, 0, 98,117,116,116,111,110, 95,116,105,116,108,101, 91, 52, 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 91, 52,
+ 93, 0, 98,117,116,116,111,110, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,108,105,115,116, 91, 52, 93, 0,108,105,115,116,
+ 95,116,105,116,108,101, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116, 91, 52, 93, 0,108,105,115,116, 95,116,101,120,116,
+ 95,104,105, 91, 52, 93, 0,112, 97,110,101,108, 91, 52, 93, 0,112, 97,110,101,108, 95,116,105,116,108,101, 91, 52, 93, 0,112,
+ 97,110,101,108, 95,116,101,120,116, 91, 52, 93, 0,112, 97,110,101,108, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0,115,104,
+ 97,100,101, 49, 91, 52, 93, 0,115,104, 97,100,101, 50, 91, 52, 93, 0,104,105,108,105,116,101, 91, 52, 93, 0,103,114,105,100,
+ 91, 52, 93, 0,119,105,114,101, 91, 52, 93, 0,115,101,108,101, 99,116, 91, 52, 93, 0,108, 97,109,112, 91, 52, 93, 0, 97, 99,
+116,105,118,101, 91, 52, 93, 0,103,114,111,117,112, 91, 52, 93, 0,103,114,111,117,112, 95, 97, 99,116,105,118,101, 91, 52, 93,
+ 0,116,114, 97,110,115,102,111,114,109, 91, 52, 93, 0,118,101,114,116,101,120, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,
+101,108,101, 99,116, 91, 52, 93, 0,101,100,103,101, 91, 52, 93, 0,101,100,103,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,
+101,100,103,101, 95,115,101, 97,109, 91, 52, 93, 0,101,100,103,101, 95,115,104, 97,114,112, 91, 52, 93, 0,101,100,103,101, 95,
+102, 97, 99,101,115,101,108, 91, 52, 93, 0,101,100,103,101, 95, 99,114,101, 97,115,101, 91, 52, 93, 0,102, 97, 99,101, 91, 52,
+ 93, 0,102, 97, 99,101, 95,115,101,108,101, 99,116, 91, 52, 93, 0,102, 97, 99,101, 95,100,111,116, 91, 52, 93, 0,101,120,116,
+114, 97, 95,101,100,103,101, 95,108,101,110, 91, 52, 93, 0,101,120,116,114, 97, 95,102, 97, 99,101, 95, 97,110,103,108,101, 91,
+ 52, 93, 0,101,120,116,114, 97, 95,102, 97, 99,101, 95, 97,114,101, 97, 91, 52, 93, 0,112, 97,100, 51, 91, 52, 93, 0,110,111,
+114,109, 97,108, 91, 52, 93, 0,118,101,114,116,101,120, 95,110,111,114,109, 97,108, 91, 52, 93, 0, 98,111,110,101, 95,115,111,
+108,105,100, 91, 52, 93, 0, 98,111,110,101, 95,112,111,115,101, 91, 52, 93, 0,115,116,114,105,112, 91, 52, 93, 0,115,116,114,
+105,112, 95,115,101,108,101, 99,116, 91, 52, 93, 0, 99,102,114, 97,109,101, 91, 52, 93, 0,110,117,114, 98, 95,117,108,105,110,
+101, 91, 52, 93, 0,110,117,114, 98, 95,118,108,105,110,101, 91, 52, 93, 0, 97, 99,116, 95,115,112,108,105,110,101, 91, 52, 93,
+ 0,110,117,114, 98, 95,115,101,108, 95,117,108,105,110,101, 91, 52, 93, 0,110,117,114, 98, 95,115,101,108, 95,118,108,105,110,
+101, 91, 52, 93, 0,108, 97,115,116,115,101,108, 95,112,111,105,110,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,102,114,101,
+101, 91, 52, 93, 0,104, 97,110,100,108,101, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101, 99,116, 91,
+ 52, 93, 0,104, 97,110,100,108,101, 95, 97,108,105,103,110, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95,102,114,
+101,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95, 97,117,116,111, 91, 52, 93, 0,104, 97,110,100,108,101, 95,
+115,101,108, 95,118,101, 99,116, 91, 52, 93, 0,104, 97,110,100,108,101, 95,115,101,108, 95, 97,108,105,103,110, 91, 52, 93, 0,
+100,115, 95, 99,104, 97,110,110,101,108, 91, 52, 93, 0,100,115, 95,115,117, 98, 99,104, 97,110,110,101,108, 91, 52, 93, 0, 99,
+111,110,115,111,108,101, 95,111,117,116,112,117,116, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,105,110,112,117,116, 91, 52,
+ 93, 0, 99,111,110,115,111,108,101, 95,105,110,102,111, 91, 52, 93, 0, 99,111,110,115,111,108,101, 95,101,114,114,111,114, 91,
+ 52, 93, 0, 99,111,110,115,111,108,101, 95, 99,117,114,115,111,114, 91, 52, 93, 0,118,101,114,116,101,120, 95,115,105,122,101,
+ 0,111,117,116,108,105,110,101, 95,119,105,100,116,104, 0,102, 97, 99,101,100,111,116, 95,115,105,122,101, 0, 98,112, 97,100,
+ 0,115,121,110,116, 97,120,108, 91, 52, 93, 0,115,121,110,116, 97,120,110, 91, 52, 93, 0,115,121,110,116, 97,120, 98, 91, 52,
+ 93, 0,115,121,110,116, 97,120,118, 91, 52, 93, 0,115,121,110,116, 97,120, 99, 91, 52, 93, 0,109,111,118,105,101, 91, 52, 93,
+ 0,105,109, 97,103,101, 91, 52, 93, 0,115, 99,101,110,101, 91, 52, 93, 0, 97,117,100,105,111, 91, 52, 93, 0,101,102,102,101,
+ 99,116, 91, 52, 93, 0,112,108,117,103,105,110, 91, 52, 93, 0,116,114, 97,110,115,105,116,105,111,110, 91, 52, 93, 0,109,101,
+116, 97, 91, 52, 93, 0,101,100,105,116,109,101,115,104, 95, 97, 99,116,105,118,101, 91, 52, 93, 0,104, 97,110,100,108,101, 95,
+118,101,114,116,101,120, 91, 52, 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,101,108,101, 99,116, 91, 52,
+ 93, 0,104, 97,110,100,108,101, 95,118,101,114,116,101,120, 95,115,105,122,101, 0,104,112, 97,100, 91, 55, 93, 0,112,114,101,
+118,105,101,119, 95, 98, 97, 99,107, 91, 52, 93, 0,115,111,108,105,100, 91, 52, 93, 0,116,117,105, 0,116, 98,117,116,115, 0,
+116,118, 51,100, 0,116,102,105,108,101, 0,116,105,112,111, 0,116,105,110,102,111, 0,116,115,110,100, 0,116, 97, 99,116, 0,
+116,110,108, 97, 0,116,115,101,113, 0,116,105,109, 97, 0,116,105,109, 97,115,101,108, 0,116,101,120,116, 0,116,111,111,112,
+115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0,116,108,111,103,105, 99, 0,116,117,115,101,114,112,114,101,102, 0,116,
+ 99,111,110,115,111,108,101, 0,116, 97,114,109, 91, 50, 48, 93, 0, 97, 99,116,105,118,101, 95,116,104,101,109,101, 95, 97,114,
+101, 97, 0,109,111,100,117,108,101, 91, 54, 52, 93, 0,115,112,101, 99, 91, 52, 93, 0,100,117,112,102,108, 97,103, 0,115, 97,
+118,101,116,105,109,101, 0,116,101,109,112,100,105,114, 91, 49, 54, 48, 93, 0,102,111,110,116,100,105,114, 91, 49, 54, 48, 93,
+ 0,114,101,110,100,101,114,100,105,114, 91, 49, 54, 48, 93, 0,116,101,120,116,117,100,105,114, 91, 49, 54, 48, 93, 0,112,108,
+117,103,116,101,120,100,105,114, 91, 49, 54, 48, 93, 0,112,108,117,103,115,101,113,100,105,114, 91, 49, 54, 48, 93, 0,112,121,
+116,104,111,110,100,105,114, 91, 49, 54, 48, 93, 0,115,111,117,110,100,100,105,114, 91, 49, 54, 48, 93, 0,105,109, 97,103,101,
+ 95,101,100,105,116,111,114, 91, 50, 52, 48, 93, 0, 97,110,105,109, 95,112,108, 97,121,101,114, 91, 50, 52, 48, 93, 0, 97,110,
+105,109, 95,112,108, 97,121,101,114, 95,112,114,101,115,101,116, 0,118, 50,100, 95,109,105,110, 95,103,114,105,100,115,105,122,
+101, 0,116,105,109,101, 99,111,100,101, 95,115,116,121,108,101, 0,118,101,114,115,105,111,110,115, 0,100, 98,108, 95, 99,108,
+105, 99,107, 95,116,105,109,101, 0,103, 97,109,101,102,108, 97,103,115, 0,119,104,101,101,108,108,105,110,101,115, 99,114,111,
+108,108, 0,117,105,102,108, 97,103, 0,108, 97,110,103,117, 97,103,101, 0,117,115,101,114,112,114,101,102, 0,118,105,101,119,
+122,111,111,109, 0,109,105,120, 98,117,102,115,105,122,101, 0, 97,117,100,105,111,100,101,118,105, 99,101, 0, 97,117,100,105,
+111,114, 97,116,101, 0, 97,117,100,105,111,102,111,114,109, 97,116, 0, 97,117,100,105,111, 99,104, 97,110,110,101,108,115, 0,
+100,112,105, 0,101,110, 99,111,100,105,110,103, 0,116,114, 97,110,115,111,112,116,115, 0,109,101,110,117,116,104,114,101,115,
+104,111,108,100, 49, 0,109,101,110,117,116,104,114,101,115,104,111,108,100, 50, 0,116,104,101,109,101,115, 0,117,105,102,111,
+110,116,115, 0,117,105,115,116,121,108,101,115, 0,107,101,121,109, 97,112,115, 0, 97,100,100,111,110,115, 0,107,101,121, 99,
+111,110,102,105,103,115,116,114, 91, 54, 52, 93, 0,117,110,100,111,115,116,101,112,115, 0,117,110,100,111,109,101,109,111,114,
+121, 0,103,112, 95,109, 97,110,104, 97,116,116,101,110,100,105,115,116, 0,103,112, 95,101,117, 99,108,105,100,101, 97,110,100,
+105,115,116, 0,103,112, 95,101,114, 97,115,101,114, 0,103,112, 95,115,101,116,116,105,110,103,115, 0,116, 98, 95,108,101,102,
+116,109,111,117,115,101, 0,116, 98, 95,114,105,103,104,116,109,111,117,115,101, 0,108,105,103,104,116, 91, 51, 93, 0,116,119,
+ 95,104,111,116,115,112,111,116, 0,116,119, 95,102,108, 97,103, 0,116,119, 95,104, 97,110,100,108,101,115,105,122,101, 0,116,
+119, 95,115,105,122,101, 0,116,101,120,116,105,109,101,111,117,116, 0,116,101,120, 99,111,108,108,101, 99,116,114, 97,116,101,
+ 0,119,109,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,103,116,104,114,101,115,104,111,108,100, 0,109,101,109, 99,
+ 97, 99,104,101,108,105,109,105,116, 0,112,114,101,102,101,116, 99,104,102,114, 97,109,101,115, 0,102,114, 97,109,101,115,101,
+114,118,101,114,112,111,114,116, 0,112, 97,100, 95,114,111,116, 95, 97,110,103,108,101, 0,111, 98, 99,101,110,116,101,114, 95,
+100,105, 97, 0,114,118,105,115,105,122,101, 0,114,118,105, 98,114,105,103,104,116, 0,114,101, 99,101,110,116, 95,102,105,108,
+101,115, 0,115,109,111,111,116,104, 95,118,105,101,119,116,120, 0,103,108,114,101,115,108,105,109,105,116, 0,110,100,111,102,
+ 95,112, 97,110, 0,110,100,111,102, 95,114,111,116, 97,116,101, 0, 99,117,114,115,115,105,122,101, 0, 99,111,108,111,114, 95,
+112,105, 99,107,101,114, 95,116,121,112,101, 0,105,112,111, 95,110,101,119, 0,107,101,121,104, 97,110,100,108,101,115, 95,110,
+101,119, 0,115, 99,114, 99, 97,115,116,102,112,115, 0,115, 99,114, 99, 97,115,116,119, 97,105,116, 0,112, 97,100, 56, 0,118,
+101,114,115,101,109, 97,115,116,101,114, 91, 49, 54, 48, 93, 0,118,101,114,115,101,117,115,101,114, 91, 49, 54, 48, 93, 0,103,
+108, 97,108,112,104, 97, 99,108,105,112, 0,116,101,120,116, 95,114,101,110,100,101,114, 0,112, 97,100, 57, 0,112, 97,100, 49,
+ 48, 0, 99,111, 98, 97, 95,119,101,105,103,104,116, 0,115, 99,117,108,112,116, 95,112, 97,105,110,116, 95,111,118,101,114,108,
+ 97,121, 95, 99,111,108, 91, 51, 93, 0, 97,117,116,104,111,114, 91, 56, 48, 93, 0,118,101,114,116, 98, 97,115,101, 0,101,100,
+103,101, 98, 97,115,101, 0, 97,114,101, 97, 98, 97,115,101, 0, 42,110,101,119,115, 99,101,110,101, 0,114,101,100,114, 97,119,
+115, 95,102,108, 97,103, 0,102,117,108,108, 0,116,101,109,112, 0,119,105,110,105,100, 0,100,111, 95,100,114, 97,119, 0,100,
+111, 95,114,101,102,114,101,115,104, 0,100,111, 95,100,114, 97,119, 95,103,101,115,116,117,114,101, 0,100,111, 95,100,114, 97,
+119, 95,112, 97,105,110,116, 99,117,114,115,111,114, 0,100,111, 95,100,114, 97,119, 95,100,114, 97,103, 0,115,119, 97,112, 0,
+109, 97,105,110,119,105,110, 0,115,117, 98,119,105,110, 97, 99,116,105,118,101, 0, 42, 97,110,105,109,116,105,109,101,114, 0,
+ 42, 99,111,110,116,101,120,116, 0,104, 97,110,100,108,101,114, 91, 56, 93, 0, 42,110,101,119,118, 0,118,101, 99, 0, 42,118,
+ 49, 0, 42,118, 50, 0, 42,116,121,112,101, 0,112, 97,110,101,108,110, 97,109,101, 91, 54, 52, 93, 0,116, 97, 98,110, 97,109,
+101, 91, 54, 52, 93, 0,100,114, 97,119,110, 97,109,101, 91, 54, 52, 93, 0,111,102,115,120, 0,111,102,115,121, 0,115,105,122,
+101,120, 0,115,105,122,101,121, 0,108, 97, 98,101,108,111,102,115, 0,114,117,110,116,105,109,101, 95,102,108, 97,103, 0, 99,
+111,110,116,114,111,108, 0,115,110, 97,112, 0,115,111,114,116,111,114,100,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0,
+ 42, 97, 99,116,105,118,101,100, 97,116, 97, 0,108,105,115,116, 95,115, 99,114,111,108,108, 0,108,105,115,116, 95,115,105,122,
+101, 0,108,105,115,116, 95,108, 97,115,116, 95,108,101,110, 0,108,105,115,116, 95,103,114,105,112, 95,115,105,122,101, 0,108,
+105,115,116, 95,115,101, 97,114, 99,104, 91, 54, 52, 93, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0, 98,117,116,
+115,112, 97, 99,101,116,121,112,101, 0,104,101, 97,100,101,114,116,121,112,101, 0,115,112, 97, 99,101,100, 97,116, 97, 0,104,
+ 97,110,100,108,101,114,115, 0, 97, 99,116,105,111,110,122,111,110,101,115, 0,119,105,110,114, 99,116, 0,100,114, 97,119,114,
+ 99,116, 0,115,119,105,110,105,100, 0,114,101,103,105,111,110,116,121,112,101, 0, 97,108,105,103,110,109,101,110,116, 0,100,
+111, 95,100,114, 97,119, 95,111,118,101,114,108, 97,121, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 0, 42,
+104,101, 97,100,101,114,115,116,114, 0, 42,114,101,103,105,111,110,100, 97,116, 97, 0,115,117, 98,118,115,116,114, 91, 52, 93,
+ 0,115,117, 98,118,101,114,115,105,111,110, 0,112, 97,100,115, 0,109,105,110,118,101,114,115,105,111,110, 0,109,105,110,115,
+117, 98,118,101,114,115,105,111,110, 0, 42, 99,117,114,115, 99,114,101,101,110, 0, 42, 99,117,114,115, 99,101,110,101, 0,102,
+105,108,101,102,108, 97,103,115, 0,103,108,111, 98, 97,108,102, 0,114,101,118,105,115,105,111,110, 0,102,105,108,101,110, 97,
+109,101, 91, 50, 52, 48, 93, 0,110, 97,109,101, 91, 56, 48, 93, 0,111,114,105,103, 95,119,105,100,116,104, 0,111,114,105,103,
+ 95,104,101,105,103,104,116, 0, 98,111,116,116,111,109, 0,114,105,103,104,116, 0,120,111,102,115, 0,121,111,102,115, 0,108,
+105,102,116, 91, 51, 93, 0,103, 97,109,109, 97, 91, 51, 93, 0,103, 97,105,110, 91, 51, 93, 0,100,105,114, 91, 49, 54, 48, 93,
+ 0,100,111,110,101, 0,115,116, 97,114,116,115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 0, 42,115,116,114,105,112,
+100, 97,116, 97, 0, 42, 99,114,111,112, 0, 42,116,114, 97,110,115,102,111,114,109, 0, 42, 99,111,108,111,114, 95, 98, 97,108,
+ 97,110, 99,101, 0, 42,105,110,115,116, 97,110, 99,101, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42, 42, 99,117,
+114,114,101,110,116, 95,112,114,105,118, 97,116,101, 95,100, 97,116, 97, 0, 42,116,109,112, 0,115,116, 97,114,116,111,102,115,
+ 0,101,110,100,111,102,115, 0,109, 97, 99,104,105,110,101, 0,115,116, 97,114,116,100,105,115,112, 0,101,110,100,100,105,115,
+112, 0,115, 97,116, 0,109,117,108, 0,104, 97,110,100,115,105,122,101, 0, 97,110,105,109, 95,112,114,101,115,101,101,107, 0,
+ 42,115,116,114,105,112, 0, 42,115, 99,101,110,101, 95, 99, 97,109,101,114, 97, 0,101,102,102,101, 99,116, 95,102, 97,100,101,
+114, 0,115,112,101,101,100, 95,102, 97,100,101,114, 0, 42,115,101,113, 49, 0, 42,115,101,113, 50, 0, 42,115,101,113, 51, 0,
+115,101,113, 98, 97,115,101, 0, 42,115, 99,101,110,101, 95,115,111,117,110,100, 0,108,101,118,101,108, 0,112, 97,110, 0,115,
+ 99,101,110,101,110,114, 0,109,117,108,116,105, 99, 97,109, 95,115,111,117,114, 99,101, 0,115,116,114,111, 98,101, 0, 42,101,
+102,102,101, 99,116,100, 97,116, 97, 0, 97,110,105,109, 95,115,116, 97,114,116,111,102,115, 0, 97,110,105,109, 95,101,110,100,
+111,102,115, 0, 98,108,101,110,100, 95,109,111,100,101, 0, 98,108,101,110,100, 95,111,112, 97, 99,105,116,121, 0, 42,111,108,
+100, 98, 97,115,101,112, 0, 42,112, 97,114,115,101,113, 0, 42,115,101,113, 98, 97,115,101,112, 0,109,101,116, 97,115,116, 97,
+ 99,107, 0, 42, 97, 99,116, 95,115,101,113, 0, 97, 99,116, 95,105,109, 97,103,101,100,105,114, 91, 50, 53, 54, 93, 0, 97, 99,
+116, 95,115,111,117,110,100,100,105,114, 91, 50, 53, 54, 93, 0,111,118,101,114, 95,111,102,115, 0,111,118,101,114, 95, 99,102,
+114, 97, 0,111,118,101,114, 95,102,108, 97,103, 0,111,118,101,114, 95, 98,111,114,100,101,114, 0,101,100,103,101, 87,105,100,
+116,104, 0,102,111,114,119, 97,114,100, 0,119,105,112,101,116,121,112,101, 0,102, 77,105,110,105, 0,102, 67,108, 97,109,112,
+ 0,102, 66,111,111,115,116, 0,100, 68,105,115,116, 0,100, 81,117, 97,108,105,116,121, 0, 98, 78,111, 67,111,109,112, 0, 83,
+ 99, 97,108,101,120, 73,110,105, 0, 83, 99, 97,108,101,121, 73,110,105, 0, 83, 99, 97,108,101,120, 70,105,110, 0, 83, 99, 97,
+108,101,121, 70,105,110, 0,120, 73,110,105, 0,120, 70,105,110, 0,121, 73,110,105, 0,121, 70,105,110, 0,114,111,116, 73,110,
+105, 0,114,111,116, 70,105,110, 0,105,110,116,101,114,112,111,108, 97,116,105,111,110, 0,117,110,105,102,111,114,109, 95,115,
+ 99, 97,108,101, 0, 42,102,114, 97,109,101, 77, 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101,100, 0,108, 97,115,116, 86,
+ 97,108,105,100, 70,114, 97,109,101, 0, 98,117,116,116,121,112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,116,111,
+116,112, 97,114,116, 0,110,111,114,109,102, 97, 99, 0,111, 98,102, 97, 99, 0,114, 97,110,100,102, 97, 99, 0,116,101,120,102,
+ 97, 99, 0,114, 97,110,100,108,105,102,101, 0,102,111,114, 99,101, 91, 51, 93, 0,118,101, 99,116,115,105,122,101, 0,109, 97,
+120,108,101,110, 0,100,101,102,118,101, 99, 91, 51, 93, 0,109,117,108,116, 91, 52, 93, 0,108,105,102,101, 91, 52, 93, 0, 99,
+104,105,108,100, 91, 52, 93, 0,109, 97,116, 91, 52, 93, 0,116,101,120,109, 97,112, 0, 99,117,114,109,117,108,116, 0,115,116,
+ 97,116,105, 99,115,116,101,112, 0,111,109, 97,116, 0,116,105,109,101,116,101,120, 0,115,112,101,101,100,116,101,120, 0,102,
+108, 97,103, 50,110,101,103, 0,118,101,114,116,103,114,111,117,112, 95,118, 0,118,103,114,111,117,112,110, 97,109,101, 91, 51,
+ 50, 93, 0,118,103,114,111,117,112,110, 97,109,101, 95,118, 91, 51, 50, 93, 0, 42,107,101,121,115, 0,109,105,110,102, 97, 99,
+ 0,110,114, 0,117,115,101,100, 0,117,115,101,100,101,108,101,109, 0, 42,112,111,105,110, 0,114,101,115,101,116,100,105,115,
+116, 0,108, 97,115,116,118, 97,108, 0, 42,109, 97, 0,107,101,121, 0,113,117, 97,108, 0,113,117, 97,108, 50, 0,116, 97,114,
+103,101,116, 78, 97,109,101, 91, 51, 50, 93, 0,116,111,103,103,108,101, 78, 97,109,101, 91, 51, 50, 93, 0,118, 97,108,117,101,
+ 91, 51, 50, 93, 0,109, 97,120,118, 97,108,117,101, 91, 51, 50, 93, 0,100,101,108, 97,121, 0,100,117,114, 97,116,105,111,110,
+ 0,109, 97,116,101,114,105, 97,108, 78, 97,109,101, 91, 51, 50, 93, 0,100, 97,109,112,116,105,109,101,114, 0,112,114,111,112,
+110, 97,109,101, 91, 51, 50, 93, 0,109, 97,116,110, 97,109,101, 91, 51, 50, 93, 0, 97,120,105,115,102,108, 97,103, 0,112,111,
+115,101, 99,104, 97,110,110,101,108, 91, 51, 50, 93, 0, 99,111,110,115,116,114, 97,105,110,116, 91, 51, 50, 93, 0, 42,102,114,
+111,109, 79, 98,106,101, 99,116, 0,115,117, 98,106,101, 99,116, 91, 51, 50, 93, 0, 98,111,100,121, 91, 51, 50, 93, 0,111,116,
+121,112,101, 0,112,117,108,115,101, 0,102,114,101,113, 0,116,111,116,108,105,110,107,115, 0, 42, 42,108,105,110,107,115, 0,
+116, 97,112, 0,106,111,121,105,110,100,101,120, 0, 97,120,105,115, 95,115,105,110,103,108,101, 0, 97,120,105,115,102, 0, 98,
+117,116,116,111,110, 0,104, 97,116, 0,104, 97,116,102, 0,112,114,101, 99,105,115,105,111,110, 0,115,116,114, 91, 49, 50, 56,
+ 93, 0, 42,109,121,110,101,119, 0,105,110,112,117,116,115, 0,116,111,116,115,108,105,110,107,115, 0, 42, 42,115,108,105,110,
+107,115, 0,118, 97,108,111, 0,115,116, 97,116,101, 95,109, 97,115,107, 0, 42, 97, 99,116, 0,102,114, 97,109,101, 80,114,111,
+112, 91, 51, 50, 93, 0, 98,108,101,110,100,105,110, 0,112,114,105,111,114,105,116,121, 0,101,110,100, 95,114,101,115,101,116,
+ 0,115,116,114,105,100,101, 97,120,105,115, 0,115,116,114,105,100,101,108,101,110,103,116,104, 0,109,105,110, 95,103, 97,105,
+110, 0,109, 97,120, 95,103, 97,105,110, 0,114,101,102,101,114,101,110, 99,101, 95,100,105,115,116, 97,110, 99,101, 0,109, 97,
+120, 95,100,105,115,116, 97,110, 99,101, 0,114,111,108,108,111,102,102, 95,102, 97, 99,116,111,114, 0, 99,111,110,101, 95,105,
+110,110,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101, 95,111,117,116,101,114, 95, 97,110,103,108,101, 0, 99,111,110,101,
+ 95,111,117,116,101,114, 95,103, 97,105,110, 0,112, 97,100, 51, 91, 50, 93, 0,112,105,116, 99,104, 0,115,111,117,110,100, 51,
+ 68, 0,112, 97,100, 54, 91, 49, 93, 0, 42,109,101, 0,108,105,110, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103,
+ 86,101,108,111, 99,105,116,121, 91, 51, 93, 0,108,111, 99, 97,108,102,108, 97,103, 0,100,121,110, 95,111,112,101,114, 97,116,
+105,111,110, 0,102,111,114, 99,101,108,111, 99, 91, 51, 93, 0,102,111,114, 99,101,114,111,116, 91, 51, 93, 0,108,105,110,101,
+ 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93, 0, 97,110,103,117,108, 97,114,118,101,108,111, 99,105,116,121, 91, 51, 93,
+ 0, 42,114,101,102,101,114,101,110, 99,101, 0,109,105,110, 0,109, 97,120, 0,114,111,116,100, 97,109,112, 0,109,105,110,108,
+111, 99, 91, 51, 93, 0,109, 97,120,108,111, 99, 91, 51, 93, 0,109,105,110,114,111,116, 91, 51, 93, 0,109, 97,120,114,111,116,
+ 91, 51, 93, 0,109, 97,116,112,114,111,112, 91, 51, 50, 93, 0, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,100,105,
+115,116,114,105, 98,117,116,105,111,110, 0,105,110,116, 95, 97,114,103, 95, 49, 0,105,110,116, 95, 97,114,103, 95, 50, 0,102,
+108,111, 97,116, 95, 97,114,103, 95, 49, 0,102,108,111, 97,116, 95, 97,114,103, 95, 50, 0,116,111, 80,114,111,112, 78, 97,109,
+101, 91, 51, 50, 93, 0, 42,116,111, 79, 98,106,101, 99,116, 0, 98,111,100,121, 84,121,112,101, 0,102,105,108,101,110, 97,109,
+101, 91, 54, 52, 93, 0,108,111, 97,100, 97,110,105,110, 97,109,101, 91, 54, 52, 93, 0,105,110,116, 95, 97,114,103, 0,102,108,
+111, 97,116, 95, 97,114,103, 0, 42,115,117, 98,116, 97,114,103,101,116, 0,103,111, 0, 42,110,101,119,112, 97, 99,107,101,100,
+102,105,108,101, 0, 97,116,116,101,110,117, 97,116,105,111,110, 0,100,105,115,116, 97,110, 99,101, 0, 42, 99, 97, 99,104,101,
+ 0, 42,112,108, 97,121, 98, 97, 99,107, 95,104, 97,110,100,108,101, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98,106,101,
+ 99,116, 0,100,117,112,108,105, 95,111,102,115, 91, 51, 93, 0, 42,112,114,111,112, 0, 99,104,105,108,100, 98, 97,115,101, 0,
+114,111,108,108, 0,104,101, 97,100, 91, 51, 93, 0,116, 97,105,108, 91, 51, 93, 0, 98,111,110,101, 95,109, 97,116, 91, 51, 93,
+ 91, 51, 93, 0, 97,114,109, 95,104,101, 97,100, 91, 51, 93, 0, 97,114,109, 95,116, 97,105,108, 91, 51, 93, 0, 97,114,109, 95,
+109, 97,116, 91, 52, 93, 91, 52, 93, 0, 97,114,109, 95,114,111,108,108, 0,120,119,105,100,116,104, 0,122,119,105,100,116,104,
+ 0,101, 97,115,101, 49, 0,101, 97,115,101, 50, 0,114, 97,100, 95,104,101, 97,100, 0,114, 97,100, 95,116, 97,105,108, 0, 98,
+111,110,101, 98, 97,115,101, 0, 99,104, 97,105,110, 98, 97,115,101, 0, 42,101,100, 98,111, 0, 42, 97, 99,116, 95, 98,111,110,
+101, 0, 42, 97, 99,116, 95,101,100, 98,111,110,101, 0, 42,115,107,101,116, 99,104, 0,108, 97,121,101,114, 95,117,115,101,100,
+ 0,108, 97,121,101,114, 95,112,114,111,116,101, 99,116,101,100, 0,103,104,111,115,116,101,112, 0,103,104,111,115,116,115,105,
+122,101, 0,103,104,111,115,116,116,121,112,101, 0,112, 97,116,104,115,105,122,101, 0,103,104,111,115,116,115,102, 0,103,104,
+111,115,116,101,102, 0,112, 97,116,104,115,102, 0,112, 97,116,104,101,102, 0,112, 97,116,104, 98, 99, 0,112, 97,116,104, 97,
+ 99, 0, 42,112,111,105,110,116,115, 0,115,116, 97,114,116, 95,102,114, 97,109,101, 0,101,110,100, 95,102,114, 97,109,101, 0,
+103,104,111,115,116, 95,115,102, 0,103,104,111,115,116, 95,101,102, 0,103,104,111,115,116, 95, 98, 99, 0,103,104,111,115,116,
+ 95, 97, 99, 0,103,104,111,115,116, 95,116,121,112,101, 0,103,104,111,115,116, 95,115,116,101,112, 0,103,104,111,115,116, 95,
+102,108, 97,103, 0,112, 97,116,104, 95,116,121,112,101, 0,112, 97,116,104, 95,115,116,101,112, 0,112, 97,116,104, 95,118,105,
+101,119,102,108, 97,103, 0,112, 97,116,104, 95, 98, 97,107,101,102,108, 97,103, 0,112, 97,116,104, 95,115,102, 0,112, 97,116,
+104, 95,101,102, 0,112, 97,116,104, 95, 98, 99, 0,112, 97,116,104, 95, 97, 99, 0, 99,111,110,115,116,102,108, 97,103, 0,105,
+107,102,108, 97,103, 0,115,101,108,101, 99,116,102,108, 97,103, 0, 97,103,114,112, 95,105,110,100,101,120, 0, 42, 98,111,110,
+101, 0, 42, 99,104,105,108,100, 0,105,107,116,114,101,101, 0, 42, 99,117,115,116,111,109, 0, 42, 99,117,115,116,111,109, 95,
+116,120, 0,101,117,108, 91, 51, 93, 0, 99,104, 97,110, 95,109, 97,116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,109, 97,
+116, 91, 52, 93, 91, 52, 93, 0,112,111,115,101, 95,104,101, 97,100, 91, 51, 93, 0,112,111,115,101, 95,116, 97,105,108, 91, 51,
+ 93, 0,108,105,109,105,116,109,105,110, 91, 51, 93, 0,108,105,109,105,116,109, 97,120, 91, 51, 93, 0,115,116,105,102,102,110,
+101,115,115, 91, 51, 93, 0,105,107,115,116,114,101,116, 99,104, 0,105,107,114,111,116,119,101,105,103,104,116, 0,105,107,108,
+105,110,119,101,105,103,104,116, 0, 99,104, 97,110, 98, 97,115,101, 0, 42, 99,104, 97,110,104, 97,115,104, 0,112,114,111,120,
+121, 95,108, 97,121,101,114, 0,115,116,114,105,100,101, 95,111,102,102,115,101,116, 91, 51, 93, 0, 99,121, 99,108,105, 99, 95,
+111,102,102,115,101,116, 91, 51, 93, 0, 97,103,114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,103,114,111,117,112, 0,105,
+107,115,111,108,118,101,114, 0, 42,105,107,100, 97,116, 97, 0, 42,105,107,112, 97,114, 97,109, 0,112,114,111,120,121, 95, 97,
+ 99,116, 95, 98,111,110,101, 91, 51, 50, 93, 0,110,117,109,105,116,101,114, 0,110,117,109,115,116,101,112, 0,109,105,110,115,
+116,101,112, 0,109, 97,120,115,116,101,112, 0,115,111,108,118,101,114, 0,102,101,101,100, 98, 97, 99,107, 0,109, 97,120,118,
+101,108, 0,100, 97,109,112,109, 97,120, 0,100, 97,109,112,101,112,115, 0, 99,104, 97,110,110,101,108,115, 0, 99,117,115,116,
+111,109, 67,111,108, 0, 99,115, 0, 99,117,114,118,101,115, 0,103,114,111,117,112,115, 0, 97, 99,116,105,118,101, 95,109, 97,
+114,107,101,114, 0, 42,115,111,117,114, 99,101, 0, 42,102,105,108,116,101,114, 95,103,114,112, 0,115,101, 97,114, 99,104,115,
+116,114, 91, 54, 52, 93, 0,102,105,108,116,101,114,102,108, 97,103, 0, 97,100,115, 0,116,105,109,101,115,108,105,100,101, 0,
+ 42,103,114,112, 0,110, 97,109,101, 91, 51, 48, 93, 0,111,119,110,115,112, 97, 99,101, 0,116, 97,114,115,112, 97, 99,101, 0,
+101,110,102,111,114, 99,101, 0,104,101, 97,100,116, 97,105,108, 0,108,105,110, 95,101,114,114,111,114, 0,114,111,116, 95,101,
+114,114,111,114, 0, 42,116, 97,114, 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0,114,111,116,
+ 79,114,100,101,114, 0,116, 97,114,110,117,109, 0,116, 97,114,103,101,116,115, 0,105,116,101,114, 97,116,105,111,110,115, 0,
+114,111,111,116, 98,111,110,101, 0,109, 97,120, 95,114,111,111,116, 98,111,110,101, 0, 42,112,111,108,101,116, 97,114, 0,112,
+111,108,101,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 0,112,111,108,101, 97,110,103,108,101, 0,111,114,105,101,110,
+116,119,101,105,103,104,116, 0,103,114, 97, 98,116, 97,114,103,101,116, 91, 51, 93, 0,110,117,109,112,111,105,110,116,115, 0,
+ 99,104, 97,105,110,108,101,110, 0,120,122, 83, 99, 97,108,101, 77,111,100,101, 0,114,101,115,101,114,118,101,100, 49, 0,114,
+101,115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102,108, 97,103, 0,115,116,117, 99,107, 0, 99, 97, 99,104,101, 91,
+ 51, 93, 0,108,111, 99,107,102,108, 97,103, 0,102,111,108,108,111,119,102,108, 97,103, 0,118,111,108,109,111,100,101, 0,112,
+108, 97,110,101, 0,111,114,103,108,101,110,103,116,104, 0, 98,117,108,103,101, 0,112,105,118, 88, 0,112,105,118, 89, 0,112,
+105,118, 90, 0, 97,120, 88, 0, 97,120, 89, 0, 97,120, 90, 0,109,105,110, 76,105,109,105,116, 91, 54, 93, 0,109, 97,120, 76,
+105,109,105,116, 91, 54, 93, 0,101,120,116,114, 97, 70,122, 0,105,110,118,109, 97,116, 91, 52, 93, 91, 52, 93, 0,102,114,111,
+109, 0,116,111, 0,109, 97,112, 91, 51, 93, 0,101,120,112,111, 0,102,114,111,109, 95,109,105,110, 91, 51, 93, 0,102,114,111,
+109, 95,109, 97,120, 91, 51, 93, 0,116,111, 95,109,105,110, 91, 51, 93, 0,116,111, 95,109, 97,120, 91, 51, 93, 0,114,111,116,
+ 65,120,105,115, 0,122,109,105,110, 0,122,109, 97,120, 0,112, 97,100, 91, 57, 93, 0, 99,104, 97,110,110,101,108, 91, 51, 50,
+ 93, 0,110,111, 95,114,111,116, 95, 97,120,105,115, 0,115,116,114,105,100,101, 95, 97,120,105,115, 0, 99,117,114,109,111,100,
+ 0, 97, 99,116,115,116, 97,114,116, 0, 97, 99,116,101,110,100, 0, 97, 99,116,111,102,102,115, 0,115,116,114,105,100,101,108,
+101,110, 0,115, 99, 97,108,101, 0, 98,108,101,110,100,111,117,116, 0,115,116,114,105,100,101, 99,104, 97,110,110,101,108, 91,
+ 51, 50, 93, 0,111,102,102,115, 95, 98,111,110,101, 91, 51, 50, 93, 0,104, 97,115,105,110,112,117,116, 0,104, 97,115,111,117,
+116,112,117,116, 0,100, 97,116, 97,116,121,112,101, 0,115,111, 99,107,101,116,116,121,112,101, 0, 42,110,101,119, 95,115,111,
+ 99,107, 0,110,115, 0,108,105,109,105,116, 0,115,116, 97, 99,107, 95,116,121,112,101, 0, 42,115,116, 97, 99,107, 95,112,116,
+114, 0,115,116, 97, 99,107, 95,105,110,100,101,120, 0,108,111, 99,120, 0,108,111, 99,121, 0,111,119,110, 95,105,110,100,101,
+120, 0, 42,103,114,111,117,112,115,111, 99,107, 0,116,111, 95,105,110,100,101,120, 0, 42,108,105,110,107, 0, 42,114,101, 99,
+116, 0,120,115,105,122,101, 0,121,115,105,122,101, 0, 42,110,101,119, 95,110,111,100,101, 0,108, 97,115,116,121, 0,111,117,
+116,112,117,116,115, 0, 42,115,116,111,114, 97,103,101, 0,109,105,110,105,119,105,100,116,104, 0,108, 97, 98,101,108, 91, 51,
+ 50, 93, 0, 99,117,115,116,111,109, 49, 0, 99,117,115,116,111,109, 50, 0, 99,117,115,116,111,109, 51, 0, 99,117,115,116,111,
+109, 52, 0,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0, 42,116,104,114,101, 97,100,100, 97,116, 97, 0,116,111,
+116,114, 0, 98,117,116,114, 0,112,114,118,114, 0, 42, 98,108,111, 99,107, 0, 42,116,121,112,101,105,110,102,111, 0, 42,102,
+114,111,109,110,111,100,101, 0, 42,116,111,110,111,100,101, 0, 42,102,114,111,109,115,111, 99,107, 0, 42,116,111,115,111, 99,
+107, 0,110,111,100,101,115, 0,108,105,110,107,115, 0, 42,115,116, 97, 99,107, 0, 42,116,104,114,101, 97,100,115,116, 97, 99,
+107, 0,105,110,105,116, 0,115,116, 97, 99,107,115,105,122,101, 0, 99,117,114, 95,105,110,100,101,120, 0, 97,108,108,116,121,
+112,101,115, 0,112, 97,100, 50, 91, 50, 93, 0, 40, 42,112,114,111,103,114,101,115,115, 41, 40, 41, 0, 40, 42,115,116, 97,116,
+115, 95,100,114, 97,119, 41, 40, 41, 0, 40, 42,116,101,115,116, 95, 98,114,101, 97,107, 41, 40, 41, 0, 42,116, 98,104, 0, 42,
+112,114,104, 0, 42,115,100,104, 0, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101,115, 0,109, 97,
+120,115,112,101,101,100, 0,109,105,110,115,112,101,101,100, 0, 99,117,114,118,101,100, 0,112,101,114, 99,101,110,116,120, 0,
+112,101,114, 99,101,110,116,121, 0, 98,111,107,101,104, 0,103, 97,109,109, 97, 0,105,109, 97,103,101, 95,105,110, 95,119,105,
+100,116,104, 0,105,109, 97,103,101, 95,105,110, 95,104,101,105,103,104,116, 0, 99,101,110,116,101,114, 95,120, 0, 99,101,110,
+116,101,114, 95,121, 0,115,112,105,110, 0,119,114, 97,112, 0,115,105,103,109, 97, 95, 99,111,108,111,114, 0,115,105,103,109,
+ 97, 95,115,112, 97, 99,101, 0,104,117,101, 0,116, 49, 0,116, 50, 0,116, 51, 0,102,115,116,114,101,110,103,116,104, 0,102,
+ 97,108,112,104, 97, 0,107,101,121, 91, 52, 93, 0, 97,108,103,111,114,105,116,104,109, 0, 99,104, 97,110,110,101,108, 0,120,
+ 49, 0,120, 50, 0,121, 49, 0,121, 50, 0,102, 97, 99, 95,120, 49, 0,102, 97, 99, 95,120, 50, 0,102, 97, 99, 95,121, 49, 0,
+102, 97, 99, 95,121, 50, 0, 99,111,108,110, 97,109,101, 91, 51, 50, 93, 0, 98,107,116,121,112,101, 0,114,111,116, 97,116,105,
+111,110, 0,103, 97,109, 99,111, 0,110,111, 95,122, 98,117,102, 0,102,115,116,111,112, 0,109, 97,120, 98,108,117,114, 0, 98,
+116,104,114,101,115,104, 0, 42,100,105, 99,116, 0, 42,110,111,100,101, 0, 97,110,103,108,101, 95,111,102,115, 0, 99,111,108,
+109,111,100, 0,109,105,120, 0,116,104,114,101,115,104,111,108,100, 0,102, 97,100,101, 0,109, 0, 99, 0,106,105,116, 0,112,
+114,111,106, 0,102,105,116, 0,115,108,111,112,101, 91, 51, 93, 0,112,111,119,101,114, 91, 51, 93, 0,108,105,102,116, 95,108,
+103,103, 91, 51, 93, 0,103, 97,109,109, 97, 95,105,110,118, 91, 51, 93, 0,108,105,109, 99,104, 97,110, 0,117,110,115,112,105,
+108,108, 0,108,105,109,115, 99, 97,108,101, 0,117,115,112,105,108,108,114, 0,117,115,112,105,108,108,103, 0,117,115,112,105,
+108,108, 98, 0,115,104,111,114,116,121, 0,109,105,110,116, 97, 98,108,101, 0,109, 97,120,116, 97, 98,108,101, 0,101,120,116,
+ 95,105,110, 91, 50, 93, 0,101,120,116, 95,111,117,116, 91, 50, 93, 0, 42, 99,117,114,118,101, 0, 42,116, 97, 98,108,101, 0,
+ 42,112,114,101,109,117,108,116, 97, 98,108,101, 0,112,114,101,115,101,116, 0, 99,104, 97,110,103,101,100, 95,116,105,109,101,
+115,116, 97,109,112, 0, 99,117,114,114, 0, 99,108,105,112,114, 0, 99,109, 91, 52, 93, 0, 98,108, 97, 99,107, 91, 51, 93, 0,
+119,104,105,116,101, 91, 51, 93, 0, 98,119,109,117,108, 91, 51, 93, 0,115, 97,109,112,108,101, 91, 51, 93, 0,120, 95,114,101,
+115,111,108,117,116,105,111,110, 0,100, 97,116, 97, 95,114, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,103, 91, 50, 53, 54, 93,
+ 0,100, 97,116, 97, 95, 98, 91, 50, 53, 54, 93, 0,100, 97,116, 97, 95,108,117,109, 97, 91, 50, 53, 54, 93, 0,115, 97,109,112,
+108,101, 95,102,117,108,108, 0,115, 97,109,112,108,101, 95,108,105,110,101,115, 0, 97, 99, 99,117,114, 97, 99,121, 0,119, 97,
+118,101,102,114,109, 95,109,111,100,101, 0,119, 97,118,101,102,114,109, 95, 97,108,112,104, 97, 0,119, 97,118,101,102,114,109,
+ 95,121,102, 97, 99, 0,119, 97,118,101,102,114,109, 95,104,101,105,103,104,116, 0,118,101, 99,115, 99,111,112,101, 95, 97,108,
+112,104, 97, 0,118,101, 99,115, 99,111,112,101, 95,104,101,105,103,104,116, 0,109,105,110,109, 97,120, 91, 51, 93, 91, 50, 93,
+ 0,104,105,115,116, 0, 42,119, 97,118,101,102,111,114,109, 95, 49, 0, 42,119, 97,118,101,102,111,114,109, 95, 50, 0, 42,119,
+ 97,118,101,102,111,114,109, 95, 51, 0, 42,118,101, 99,115, 99,111,112,101, 0,119, 97,118,101,102,111,114,109, 95,116,111,116,
+ 0,111,102,102,115,101,116, 91, 50, 93, 0, 99,108,111,110,101, 0,109,116,101,120, 0, 42,105, 99,111,110, 95,105,109, 98,117,
+102, 0,105, 99,111,110, 95,102,105,108,101,112, 97,116,104, 91, 50, 52, 48, 93, 0,110,111,114,109, 97,108, 95,119,101,105,103,
+104,116, 0,111, 98, 95,109,111,100,101, 0,106,105,116,116,101,114, 0,115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,
+114, 97,100,105,117,115, 0,115,109,111,111,116,104, 95,115,116,114,111,107,101, 95,102, 97, 99,116,111,114, 0,114, 97,116,101,
+ 0,114,103, 98, 91, 51, 93, 0,115, 99,117,108,112,116, 95,112,108, 97,110,101, 0,112,108, 97,110,101, 95,111,102,102,115,101,
+116, 0,115, 99,117,108,112,116, 95,116,111,111,108, 0,118,101,114,116,101,120,112, 97,105,110,116, 95,116,111,111,108, 0,105,
+109, 97,103,101,112, 97,105,110,116, 95,116,111,111,108, 0,112, 97,100, 51, 91, 53, 93, 0, 97,117,116,111,115,109,111,111,116,
+104, 95,102, 97, 99,116,111,114, 0, 99,114,101, 97,115,101, 95,112,105,110, 99,104, 95,102, 97, 99,116,111,114, 0,112,108, 97,
+110,101, 95,116,114,105,109, 0,116,101,120,116,117,114,101, 95,115, 97,109,112,108,101, 95, 98,105, 97,115, 0,116,101,120,116,
+117,114,101, 95,111,118,101,114,108, 97,121, 95, 97,108,112,104, 97, 0,117,110,112,114,111,106,101, 99,116,101,100, 95,114, 97,
+100,105,117,115, 0, 97,100,100, 95, 99,111,108, 91, 51, 93, 0,115,117, 98, 95, 99,111,108, 91, 51, 93, 0, 97, 99,116,105,118,
+101, 95,114,110,100, 0, 97, 99,116,105,118,101, 95, 99,108,111,110,101, 0, 97, 99,116,105,118,101, 95,109, 97,115,107, 0, 42,
+108, 97,121,101,114,115, 0,116,111,116,108, 97,121,101,114, 0,109, 97,120,108, 97,121,101,114, 0,116,111,116,115,105,122,101,
+ 0, 42,112,111,111,108, 0, 42,101,120,116,101,114,110, 97,108, 0,118,101,108, 91, 51, 93, 0,114,111,116, 91, 52, 93, 0, 97,
+118,101, 91, 51, 93, 0, 42,103,114,111,117,110,100, 0,119, 97,110,100,101,114, 91, 51, 93, 0,114,101,115,116, 95,108,101,110,
+103,116,104, 0,112, 97,114,116,105, 99,108,101, 95,105,110,100,101,120, 91, 50, 93, 0,100,101,108,101,116,101, 95,102,108, 97,
+103, 0,110,117,109, 0,112, 97,114,101,110,116, 0,112, 97, 91, 52, 93, 0,119, 91, 52, 93, 0,102,117,118, 91, 52, 93, 0,102,
+111,102,102,115,101,116, 0,114,116, 91, 50, 93, 0,112,114,101,118, 95,115,116, 97,116,101, 0, 42,104, 97,105,114, 0, 42, 98,
+111,105,100, 0,100,105,101,116,105,109,101, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0,104, 97,105,114, 95,105,110,100,
+101,120, 0, 97,108,105,118,101, 0,115,112,114,105,110,103, 95,107, 0,112,108, 97,115,116,105, 99,105,116,121, 95, 99,111,110,
+115,116, 97,110,116, 0,121,105,101,108,100, 95,114, 97,116,105,111, 0,112,108, 97,115,116,105, 99,105,116,121, 95, 98, 97,108,
+ 97,110, 99,101, 0,121,105,101,108,100, 95, 98, 97,108, 97,110, 99,101, 0,118,105,115, 99,111,115,105,116,121, 95,111,109,101,
+103, 97, 0,118,105,115, 99,111,115,105,116,121, 95, 98,101,116, 97, 0,115,116,105,102,102,110,101,115,115, 95,107, 0,115,116,
+105,102,102,110,101,115,115, 95,107,110,101, 97,114, 0,114,101,115,116, 95,100,101,110,115,105,116,121, 0, 98,117,111,121, 97,
+110, 99,121, 0,115,112,114,105,110,103, 95,102,114, 97,109,101,115, 0, 42, 98,111,105,100,115, 0, 42,102,108,117,105,100, 0,
+100,105,115,116,114, 0,112,104,121,115,116,121,112,101, 0, 97,118,101,109,111,100,101, 0,114,101, 97, 99,116,101,118,101,110,
+116, 0,100,114, 97,119, 0,100,114, 97,119, 95, 97,115, 0,100,114, 97,119, 95,115,105,122,101, 0, 99,104,105,108,100,116,121,
+112,101, 0,114,101,110, 95, 97,115, 0,115,117, 98,102,114, 97,109,101,115, 0,100,114, 97,119, 95, 99,111,108, 0,114,101,110,
+ 95,115,116,101,112, 0,104, 97,105,114, 95,115,116,101,112, 0,107,101,121,115, 95,115,116,101,112, 0, 97,100, 97,112,116, 95,
+ 97,110,103,108,101, 0, 97,100, 97,112,116, 95,112,105,120, 0,114,111,116,102,114,111,109, 0,105,110,116,101,103,114, 97,116,
+111,114, 0, 98, 98, 95, 97,108,105,103,110, 0, 98, 98, 95,117,118, 95,115,112,108,105,116, 0, 98, 98, 95, 97,110,105,109, 0,
+ 98, 98, 95,115,112,108,105,116, 95,111,102,102,115,101,116, 0, 98, 98, 95,116,105,108,116, 0, 98, 98, 95,114, 97,110,100, 95,
+116,105,108,116, 0, 98, 98, 95,111,102,102,115,101,116, 91, 50, 93, 0, 99,111,108,111,114, 95,118,101, 99, 95,109, 97,120, 0,
115,105,109,112,108,105,102,121, 95,114,101,102,115,105,122,101, 0,115,105,109,112,108,105,102,121, 95,114, 97,116,101, 0,115,
105,109,112,108,105,102,121, 95,116,114, 97,110,115,105,116,105,111,110, 0,115,105,109,112,108,105,102,121, 95,118,105,101,119,
112,111,114,116, 0,116,105,109,101,116,119,101, 97,107, 0,106,105,116,102, 97, 99, 0,101,102,102, 95,104, 97,105,114, 0,103,
-114,105,100, 95,114,101,115, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, 99, 0,116, 97,110,112,104, 97,115,101, 0,
-114,101, 97, 99,116,102, 97, 99, 0,111, 98, 95,118,101,108, 91, 51, 93, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102,
- 97, 99, 0,114, 97,110,100,114,111,116,102, 97, 99, 0,114, 97,110,100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115,
-105,122,101, 0,114,101, 97, 99,116,115,104, 97,112,101, 0, 97, 99, 99, 91, 51, 93, 0,100,114, 97,103,102, 97, 99, 0, 98,114,
-111,119,110,102, 97, 99, 0,100, 97,109,112,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116,104, 0, 99,104,105,108,100, 95,
-110, 98,114, 0,114,101,110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116,115, 0, 99,104,105,108,100,115,
-105,122,101, 0, 99,104,105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,100, 0, 99,104,105,108,100,
-102,108, 97,116, 0, 99,108,117,109,112,112,111,119, 0,107,105,110,107, 95,102,108, 97,116, 0,107,105,110,107, 95, 97,109,112,
- 95, 99,108,117,109,112, 0,114,111,117,103,104, 49, 0,114,111,117,103,104, 49, 95,115,105,122,101, 0,114,111,117,103,104, 50,
- 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114,111,117,103,104, 50, 95,116,104,114,101,115, 0,114,111,117,103,104, 95,
-101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95,115,104, 97,112,101, 0, 99,108,101,110,103,116,104, 0, 99,108,101,110,
-103,116,104, 95,116,104,114,101,115, 0,112, 97,114,116,105,110,103, 95,102, 97, 99, 0,112, 97,114,116,105,110,103, 95,109,105,
-110, 0,112, 97,114,116,105,110,103, 95,109, 97,120, 0, 98,114, 97,110, 99,104, 95,116,104,114,101,115, 0,100,114, 97,119, 95,
-108,105,110,101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, 97,116,104, 95,101,110,100, 0,116,114, 97,105,
-108, 95, 99,111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0,100,117,112,108,105,119,101,105,103,104,116,115,
- 0, 42,101,102,102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, 98, 0, 42, 98, 98, 95,111, 98, 0, 42,112,100, 50, 0,
- 42,112, 97,114,116, 0, 42,112, 97,114,116,105, 99,108,101,115, 0, 42, 42,112, 97,116,104, 99, 97, 99,104,101, 0, 42, 42, 99,
-104,105,108,100, 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104,101, 98,117,102,115, 0, 99,104,105,108,100, 99, 97, 99,
-104,101, 98,117,102,115, 0, 42, 99,108,109,100, 0, 42,104, 97,105,114, 95,105,110, 95,100,109, 0, 42,104, 97,105,114, 95,111,
-117,116, 95,100,109, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101, 0,116,114,101,101, 95,102,
-114, 97,109,101, 0, 99,104,105,108,100, 95,115,101,101,100, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, 97, 99,104,
+114,105,100, 95,114, 97,110,100, 0,103,114,105,100, 95,114,101,115, 0,101,102,102,101, 99,116,111,114, 95, 97,109,111,117,110,
+116, 0,112, 97,114,116,102, 97, 99, 0,116, 97,110,102, 97, 99, 0,116, 97,110,112,104, 97,115,101, 0,114,101, 97, 99,116,102,
+ 97, 99, 0,111, 98, 95,118,101,108, 91, 51, 93, 0, 97,118,101,102, 97, 99, 0,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,
+100,114,111,116,102, 97, 99, 0,114, 97,110,100,112,104, 97,115,101,102, 97, 99, 0,114, 97,110,100,115,105,122,101, 0, 97, 99,
+ 99, 91, 51, 93, 0,100,114, 97,103,102, 97, 99, 0, 98,114,111,119,110,102, 97, 99, 0,114, 97,110,100,108,101,110,103,116,104,
+ 0, 99,104,105,108,100, 95,110, 98,114, 0,114,101,110, 95, 99,104,105,108,100, 95,110, 98,114, 0,112, 97,114,101,110,116,115,
+ 0, 99,104,105,108,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,110,100,115,105,122,101, 0, 99,104,105,108,100,114, 97,
+100, 0, 99,104,105,108,100,102,108, 97,116, 0, 99,108,117,109,112,112,111,119, 0,107,105,110,107, 95,102,108, 97,116, 0,107,
+105,110,107, 95, 97,109,112, 95, 99,108,117,109,112, 0,114,111,117,103,104, 49, 0,114,111,117,103,104, 49, 95,115,105,122,101,
+ 0,114,111,117,103,104, 50, 0,114,111,117,103,104, 50, 95,115,105,122,101, 0,114,111,117,103,104, 50, 95,116,104,114,101,115,
+ 0,114,111,117,103,104, 95,101,110,100, 0,114,111,117,103,104, 95,101,110,100, 95,115,104, 97,112,101, 0, 99,108,101,110,103,
+116,104, 0, 99,108,101,110,103,116,104, 95,116,104,114,101,115, 0,112, 97,114,116,105,110,103, 95,102, 97, 99, 0,112, 97,114,
+116,105,110,103, 95,109,105,110, 0,112, 97,114,116,105,110,103, 95,109, 97,120, 0, 98,114, 97,110, 99,104, 95,116,104,114,101,
+115, 0,100,114, 97,119, 95,108,105,110,101, 91, 50, 93, 0,112, 97,116,104, 95,115,116, 97,114,116, 0,112, 97,116,104, 95,101,
+110,100, 0,116,114, 97,105,108, 95, 99,111,117,110,116, 0,107,101,121,101,100, 95,108,111,111,112,115, 0,100,117,112,108,105,
+119,101,105,103,104,116,115, 0, 42,101,102,102, 95,103,114,111,117,112, 0, 42,100,117,112, 95,111, 98, 0, 42, 98, 98, 95,111,
+ 98, 0, 42,112,100, 50, 0, 42,112, 97,114,116, 0, 42,112, 97,114,116,105, 99,108,101,115, 0, 42, 42,112, 97,116,104, 99, 97,
+ 99,104,101, 0, 42, 42, 99,104,105,108,100, 99, 97, 99,104,101, 0,112, 97,116,104, 99, 97, 99,104,101, 98,117,102,115, 0, 99,
+104,105,108,100, 99, 97, 99,104,101, 98,117,102,115, 0, 42, 99,108,109,100, 0, 42,104, 97,105,114, 95,105,110, 95,100,109, 0,
+ 42,104, 97,105,114, 95,111,117,116, 95,100,109, 0, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,108, 97,116,116,105, 99,101,
+ 0,116,114,101,101, 95,102,114, 97,109,101, 0, 98,118,104,116,114,101,101, 95,102,114, 97,109,101, 0, 99,104,105,108,100, 95,
+115,101,101,100, 0,116,111,116,117,110,101,120,105,115,116, 0,116,111,116, 99,104,105,108,100, 0,116,111,116, 99, 97, 99,104,
101,100, 0,116,111,116, 99,104,105,108,100, 99, 97, 99,104,101, 0,116, 97,114,103,101,116, 95,112,115,121,115, 0,116,111,116,
107,101,121,101,100, 0, 98, 97,107,101,115,112, 97, 99,101, 0, 98, 98, 95,117,118,110, 97,109,101, 91, 51, 93, 91, 51, 50, 93,
0,118,103,114,111,117,112, 91, 49, 50, 93, 0,118,103, 95,110,101,103, 0,114,116, 51, 0, 42,114,101,110,100,101,114,100, 97,
@@ -11869,939 +10424,943 @@ char datatoc_startup_blend[]= {
97,117,108,116, 99,111,110,102, 0,116,105,109,101,114,115, 0, 42, 97,117,116,111,115, 97,118,101,116,105,109,101,114, 0, 42,
103,104,111,115,116,119,105,110, 0,103,114, 97, 98, 99,117,114,115,111,114, 0, 42,115, 99,114,101,101,110, 0, 42,110,101,119,
115, 99,114,101,101,110, 0,115, 99,114,101,101,110,110, 97,109,101, 91, 51, 50, 93, 0,112,111,115,120, 0,112,111,115,121, 0,
-119,105,110,100,111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0, 97,
-100,100,109,111,117,115,101,109,111,118,101, 0, 42,101,118,101,110,116,115,116, 97,116,101, 0, 42, 99,117,114,115,119,105,110,
- 0, 42,116,119,101, 97,107, 0,100,114, 97,119,109,101,116,104,111,100, 0,100,114, 97,119,102, 97,105,108, 0, 42,100,114, 97,
-119,100, 97,116, 97, 0,109,111,100, 97,108,104, 97,110,100,108,101,114,115, 0,115,117, 98,119,105,110,100,111,119,115, 0,103,
-101,115,116,117,114,101, 0,105,100,110, 97,109,101, 91, 54, 52, 93, 0,112,114,111,112,118, 97,108,117,101, 0,115,104,105,102,
-116, 0, 99,116,114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,109,111,100,105,102,105,101,114, 0,109, 97,112,
-116,121,112,101, 0, 42,112,116,114, 0,105,116,101,109,115, 0,115,112, 97, 99,101,105,100, 0,114,101,103,105,111,110,105,100,
- 0,107,109,105, 95,105,100, 0, 40, 42,112,111,108,108, 41, 40, 41, 0, 42,109,111,100, 97,108, 95,105,116,101,109,115, 0, 98,
- 97,115,101,110, 97,109,101, 91, 54, 52, 93, 0, 97, 99,116,107,101,121,109, 97,112, 0, 42, 99,117,115,116,111,109,100, 97,116,
- 97, 0, 42,112,121, 95,105,110,115,116, 97,110, 99,101, 0, 42,114,101,112,111,114,116,115, 0,109, 97, 99,114,111, 0, 42,111,
-112,109, 0, 42,101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0, 42, 99,111,101,102,102,105, 99,105,101,110,116,
-115, 0, 97,114,114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,101,114, 0, 97,109,112,108,105,116,117,100,101,
- 0,112,104, 97,115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104, 97,115,101, 95,111,102,102,115,101,116, 0,118,
- 97,108,117,101, 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,101,102,111,114,101, 95,109,111,100,101, 0, 97,
-102,116,101,114, 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,108,101,115, 0, 97,102,116,101,114, 95, 99,121,
- 99,108,101,115, 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,102,105, 99, 97,116,105,111,110, 0,115,116,101,
-112, 95,115,105,122,101, 0, 42,114,110, 97, 95,112, 97,116,104, 0,112, 99,104, 97,110, 95,110, 97,109,101, 91, 51, 50, 93, 0,
-116,114, 97,110,115, 67,104, 97,110, 0,105,100,116,121,112,101, 0,116, 97,114,103,101,116,115, 91, 56, 93, 0,110,117,109, 95,
-116, 97,114,103,101,116,115, 0,118, 97,114,105, 97, 98,108,101,115, 0,101,120,112,114,101,115,115,105,111,110, 91, 50, 53, 54,
- 93, 0, 42,101,120,112,114, 95, 99,111,109,112, 0,118,101, 99, 91, 50, 93, 0, 42,102,112,116, 0, 97,114,114, 97,121, 95,105,
-110,100,101,120, 0, 99,111,108,111,114, 95,109,111,100,101, 0, 99,111,108,111,114, 91, 51, 93, 0,102,114,111,109, 91, 49, 50,
- 56, 93, 0,116,111, 91, 49, 50, 56, 93, 0,109, 97,112,112,105,110,103,115, 0,115,116,114,105,112,115, 0, 42,114,101,109, 97,
-112, 0,102, 99,117,114,118,101,115, 0,115,116,114,105,112, 95,116,105,109,101, 0, 98,108,101,110,100,109,111,100,101, 0,101,
-120,116,101,110,100,109,111,100,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,103,114,111,117,112,109,111,100,101, 0,107,101,
-121,105,110,103,102,108, 97,103, 0,112, 97,116,104,115, 0,116,121,112,101,105,110,102,111, 91, 54, 52, 93, 0, 97, 99,116,105,
-118,101, 95,112, 97,116,104, 0, 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,116,114, 97, 99,107,115, 0, 42, 97, 99,116,115,
-116,114,105,112, 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,101,115, 0, 97, 99,116, 95, 98,108,101,110,100,
-109,111,100,101, 0, 97, 99,116, 95,101,120,116,101,110,100,109,111,100,101, 0, 97, 99,116, 95,105,110,102,108,117,101,110, 99,
-101, 0,114,117,108,101, 0,111,112,116,105,111,110,115, 0,102,101, 97,114, 95,102, 97, 99,116,111,114, 0,115,105,103,110, 97,
-108, 95,105,100, 0,108,111,111,107, 95, 97,104,101, 97,100, 0,111,108,111, 99, 91, 51, 93, 0,113,117,101,117,101, 95,115,105,
-122,101, 0,119, 97,110,100,101,114, 0,102,108,101,101, 95,100,105,115,116, 97,110, 99,101, 0,104,101, 97,108,116,104, 0,115,
-116, 97,116,101, 95,105,100, 0,114,117,108,101,115, 0, 99,111,110,100,105,116,105,111,110,115, 0, 97, 99,116,105,111,110,115,
- 0,114,117,108,101,115,101,116, 95,116,121,112,101, 0,114,117,108,101, 95,102,117,122,122,105,110,101,115,115, 0,108, 97,115,
-116, 95,115,116, 97,116,101, 95,105,100, 0,108, 97,110,100,105,110,103, 95,115,109,111,111,116,104,110,101,115,115, 0, 98, 97,
-110,107,105,110,103, 0, 97,103,103,114,101,115,115,105,111,110, 0, 97,105,114, 95,109,105,110, 95,115,112,101,101,100, 0, 97,
-105,114, 95,109, 97,120, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95, 97, 99, 99, 0, 97,105,114, 95,109, 97,120,
- 95, 97,118,101, 0, 97,105,114, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,106,117,109,
-112, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,
- 97, 99, 99, 0,108, 97,110,100, 95,109, 97,120, 95, 97,118,101, 0,108, 97,110,100, 95,112,101,114,115,111,110, 97,108, 95,115,
-112, 97, 99,101, 0,108, 97,110,100, 95,115,116,105, 99,107, 95,102,111,114, 99,101, 0,115,116, 97,116,101,115, 0, 42,115,109,
-100, 0, 42,102,108,117,105,100, 95,103,114,111,117,112, 0, 42, 99,111,108,108, 95,103,114,111,117,112, 0, 42,119,116, 0, 42,
-116,101,120, 95,119,116, 0, 42,116,101,120, 95,115,104, 97,100,111,119, 0, 42,115,104, 97,100,111,119, 0,112, 48, 91, 51, 93,
- 0,112, 49, 91, 51, 93, 0,100,120, 0,111,109,101,103, 97, 0,116,101,109,112, 65,109, 98, 0, 98,101,116, 97, 0,114,101,115,
- 91, 51, 93, 0, 97,109,112,108,105,102,121, 0,109, 97,120,114,101,115, 0,118,105,101,119,115,101,116,116,105,110,103,115, 0,
-110,111,105,115,101, 0,100,105,115,115, 95,112,101,114, 99,101,110,116, 0,100,105,115,115, 95,115,112,101,101,100, 0,114,101,
-115, 95,119,116, 91, 51, 93, 0,100,120, 95,119,116, 0,118, 51,100,110,117,109, 0, 99, 97, 99,104,101, 95, 99,111,109,112, 0,
- 99, 97, 99,104,101, 95,104,105,103,104, 95, 99,111,109,112, 0, 42,112,111,105,110,116, 95, 99, 97, 99,104,101, 91, 50, 93, 0,
-112,116, 99, 97, 99,104,101,115, 91, 50, 93, 0, 98,111,114,100,101,114, 95, 99,111,108,108,105,115,105,111,110,115, 0,116,105,
-109,101, 95,115, 99, 97,108,101, 0,118,111,114,116,105, 99,105,116,121, 0,118,101,108,111, 99,105,116,121, 91, 50, 93, 0,118,
-101,108, 95,109,117,108,116,105, 0,118,103,114,112, 95,104,101, 97,116, 95,115, 99, 97,108,101, 91, 50, 93, 0,118,103,114,111,
-117,112, 95,102,108,111,119, 0,118,103,114,111,117,112, 95,100,101,110,115,105,116,121, 0,118,103,114,111,117,112, 95,104,101,
- 97,116, 0, 42,112,111,105,110,116,115, 95,111,108,100, 0, 42,118,101,108, 0,109, 97,116, 95,111,108,100, 91, 52, 93, 91, 52,
- 93, 0, 0, 0, 84, 89, 80, 69,203, 1, 0, 0, 99,104, 97,114, 0,117, 99,104, 97,114, 0,115,104,111,114,116, 0,117,115,104,
-111,114,116, 0,105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102,108,111, 97,116, 0,100,111,117, 98,108,101, 0,
-118,111,105,100, 0, 76,105,110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76,105,115,116, 66, 97,115,101, 0,118,101, 99, 50,
-115, 0,118,101, 99, 50,102, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68, 80,114,111,112,101,114,116,121, 68, 97,116, 97,
- 0, 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97,114,121, 0, 70,105,108,101, 68, 97,116, 97, 0,
- 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118,101,114, 0, 79, 98,106,101, 99,116, 0, 73,112,
-111, 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105,112,108,101, 0, 73,112,111, 0, 75,101,121, 66,
-108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101,120,116, 76,105,110,101, 0, 84,101,120,116, 77,
- 97,114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108,101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,
-103,101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71, 80, 85, 84,101,120,116,117,114,101, 0, 97,110,
-105,109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120, 0, 84,101,120, 0, 80,108,117,103,105,110, 84,
-101,120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0, 69,110,118, 77, 97,112, 0, 73,109, 66,117,102,
- 0, 80,111,105,110,116, 68,101,110,115,105,116,121, 0, 86,111,120,101,108, 68, 97,116, 97, 0, 98, 78,111,100,101, 84,114,101,
-101, 0, 84,101,120, 77, 97,112,112,105,110,103, 0, 76, 97,109,112, 0, 67,117,114,118,101, 77, 97,112,112,105,110,103, 0, 86,
-111,108,117,109,101, 83,101,116,116,105,110,103,115, 0, 77, 97,116,101,114,105, 97,108, 0, 71,114,111,117,112, 0, 86, 70,111,
-110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69,108,101,109, 0, 66,111,117,110,100, 66,111,120, 0, 77,
-101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,111, 0, 84,101,120,116, 66,111,120, 0, 69,100,
-105,116, 78,117,114, 98, 0, 71, 72, 97,115,104, 0, 67,117,114,118,101, 0, 80, 97,116,104, 0, 83,101,108, 66,111,120, 0, 69,
-100,105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, 70, 97, 99,101, 0, 77, 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0,
- 77, 86,101,114,116, 0, 77, 69,100,103,101, 0, 77, 68,101,102,111,114,109, 86,101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,
-105, 99,107,121, 0, 77, 83,101,108,101, 99,116, 0, 69,100,105,116, 77,101,115,104, 0, 67,117,115,116,111,109, 68, 97,116, 97,
- 0, 77,117,108,116,105,114,101,115, 0, 80, 97,114,116,105, 97,108, 86,105,115,105, 98,105,108,105,116,121, 0, 77, 68,101,102,
-111,114,109, 87,101,105,103,104,116, 0, 77, 84,101,120, 80,111,108,121, 0, 77, 76,111,111,112, 85, 86, 0, 77, 76,111,111,112,
- 67,111,108, 0, 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77, 73,110,116, 80,114,111,112,101,114,116,121, 0,
- 77, 83,116,114,105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103, 83,112, 97, 99,101, 70, 97, 99,101, 0, 77, 68,
-105,115,112,115, 0, 77,117,108,116,105,114,101,115, 67,111,108, 0, 77,117,108,116,105,114,101,115, 67,111,108, 70, 97, 99,101,
- 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 69,100,103,101, 0, 77,117,108,116,105,
-114,101,115, 76,101,118,101,108, 0, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,117, 98,115,117,114,102, 77,111,100,
-105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,117,
-114,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,117,105,108,100, 77,111,100,105,102,105,101,114, 68, 97,116,
- 97, 0, 77, 97,115,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,114, 97,121, 77,111,100,105,102,105,101,114,
- 68, 97,116, 97, 0, 77,105,114,114,111,114, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,100,103,101, 83,112,108,105,
-116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,101,118,101,108, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0,
- 66, 77,101,115,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,107,101, 77,111,100,105,102,105,101,114, 68,
- 97,116, 97, 0, 83,109,111,107,101, 68,111,109, 97,105,110, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 70,108,111,
-119, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 68,105,115,112,
-108, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 85, 86, 80,114,111,106,101, 99,116, 77,111,100,105,102,105,
-101,114, 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,111,
-116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67, 97,115,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0,
- 87, 97,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,109, 97,116,117,114,101, 77,111,100,105,102,105,101,
-114, 68, 97,116, 97, 0, 72,111,111,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,102,116, 98,111,100,121, 77,
-111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,
-111,116,104, 0, 67,108,111,116,104, 83,105,109, 83,101,116,116,105,110,103,115, 0, 67,108,111,116,104, 67,111,108,108, 83,101,
-116,116,105,110,103,115, 0, 80,111,105,110,116, 67, 97, 99,104,101, 0, 67,111,108,108,105,115,105,111,110, 77,111,100,105,102,
-105,101,114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101,101, 0, 83,117,114,102, 97, 99,101, 77,111,100,105,102,105,101,114, 68,
- 97,116, 97, 0, 68,101,114,105,118,101,100, 77,101,115,104, 0, 66, 86, 72, 84,114,101,101, 70,114,111,109, 77,101,115,104, 0,
- 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 68,101,102, 73,110,102,108,117,101,110, 99,
-101, 0, 77, 68,101,102, 67,101,108,108, 0, 77,101,115,104, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116,
- 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,
-116,105, 99,108,101, 83,121,115,116,101,109, 0, 80, 97,114,116,105, 99,108,101, 73,110,115,116, 97,110, 99,101, 77,111,100,105,
-102,105,101,114, 68, 97,116, 97, 0, 69,120,112,108,111,100,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,117,108,
-116,105,114,101,115, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 77,111,100,105,102,105,
-101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 83,104,114,105,110,107,119,114,
- 97,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,105,109,112,108,101, 68,101,102,111,114,109, 77,111,100,105,102,
-105,101,114, 68, 97,116, 97, 0, 83,104, 97,112,101, 75,101,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,111,108,
-105,100,105,102,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83, 99,114,101,119, 77,111,100,105,102,105,101,114, 68,
- 97,116, 97, 0, 69,100,105,116, 76, 97,116,116, 0, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,114,111,117,
-112, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101, 0, 98, 71,
- 80,100, 97,116, 97, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,103,115, 0, 98, 77,111,116,105,111,110, 80, 97,
-116,104, 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,114,116, 68,101,102,108,101, 99,116, 0, 83,111,
-102,116, 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 68,117,112,108,105, 79, 98,106,101, 99,116, 0, 82, 78, 71, 0, 69,102,
-102,101, 99,116,111,114, 87,101,105,103,104,116,115, 0, 80, 84, 67, 97, 99,104,101, 69,120,116,114, 97, 0, 80, 84, 67, 97, 99,
-104,101, 77,101,109, 0, 80, 84, 67, 97, 99,104,101, 69,100,105,116, 0, 83, 66, 86,101,114,116,101,120, 0, 66,111,100,121, 80,
-111,105,110,116, 0, 66,111,100,121, 83,112,114,105,110,103, 0, 83, 66, 83, 99,114, 97,116, 99,104, 0, 87,111,114,108,100, 0,
- 66, 97,115,101, 0, 65,118,105, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99,
- 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 83,101,116,116,105,110,103,115, 0, 70, 70, 77,112,
-101,103, 67,111,100,101, 99, 68, 97,116, 97, 0, 65,117,100,105,111, 68, 97,116, 97, 0, 83, 99,101,110,101, 82,101,110,100,101,
-114, 76, 97,121,101,114, 0, 82,101,110,100,101,114, 68, 97,116, 97, 0, 82,101,110,100,101,114, 80,114,111,102,105,108,101, 0,
- 71, 97,109,101, 68,111,109,101, 0, 71, 97,109,101, 70,114, 97,109,105,110,103, 0, 71, 97,109,101, 68, 97,116, 97, 0, 84,105,
-109,101, 77, 97,114,107,101,114, 0, 80, 97,105,110,116, 0, 66,114,117,115,104, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,
-101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 66,114,117,115,104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,
-108,101, 69,100,105,116, 83,101,116,116,105,110,103,115, 0, 84,114, 97,110,115,102,111,114,109, 79,114,105,101,110,116, 97,116,
-105,111,110, 0, 83, 99,117,108,112,116, 0, 86, 80, 97,105,110,116, 0, 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 98,
- 83,116, 97,116,115, 0, 85,110,105,116, 83,101,116,116,105,110,103,115, 0, 80,104,121,115,105, 99,115, 83,101,116,116,105,110,
-103,115, 0, 69,100,105,116,105,110,103, 0, 83, 99,101,110,101, 83,116, 97,116,115, 0, 68, 97,103, 70,111,114,101,115,116, 0,
- 66, 71,112,105, 99, 0, 82,101,103,105,111,110, 86,105,101,119, 51, 68, 0, 82,101,110,100,101,114, 73,110,102,111, 0, 82,101,
-116,111,112,111, 86,105,101,119, 68, 97,116, 97, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111,111,116,104, 86,105,
-101,119, 83,116,111,114,101, 0,119,109, 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107,
- 0, 86,105,101,119, 50, 68, 0, 83,112, 97, 99,101, 73,110,102,111, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, 68,111,112,101,
- 83,104,101,101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108,101, 83,101,108,
-101, 99,116, 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, 0,119,109, 79,
-112,101,114, 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, 0, 84,114,101,
-101, 83,116,111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, 97,103,101, 0,
- 83, 99,111,112,101,115, 0, 72,105,115,116,111,103,114, 97,109, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83,112, 97, 99,101, 84,
-101,120,116, 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 84,105,109,101,
- 67, 97, 99,104,101, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, 97, 99,101, 76,
-111,103,105, 99, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 0, 67,111,110,115,111,108,101, 76,105,110,101, 0, 83,112, 97,
- 99,101, 67,111,110,115,111,108,101, 0, 83,112, 97, 99,101, 85,115,101,114, 80,114,101,102, 0, 83,112, 97, 99,101, 83,111,117,
-110,100, 0, 83, 99,114, 65,114,101, 97, 0, 98, 83,111,117,110,100, 0,117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,
-116,121,108,101, 0,117,105, 83,116,121,108,101, 0,117,105, 87,105,100,103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,
-100,103,101,116, 83,116, 97,116,101, 67,111,108,111,114,115, 0, 84,104,101,109,101, 85, 73, 0, 84,104,101,109,101, 83,112, 97,
- 99,101, 0, 84,104,101,109,101, 87,105,114,101, 67,111,108,111,114, 0, 98, 84,104,101,109,101, 0, 98, 65,100,100,111,110, 0,
- 83,111,108,105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101,102, 0, 98, 83, 99,114,101,101,110, 0, 83, 99,114, 86,101,
-114,116, 0, 83, 99,114, 69,100,103,101, 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112,101, 0,117,105, 76, 97,121,
-111,117,116, 0, 83,112, 97, 99,101, 84,121,112,101, 0, 65, 82,101,103,105,111,110, 0, 65, 82,101,103,105,111,110, 84,121,112,
-101, 0, 70,105,108,101, 71,108,111, 98, 97,108, 0, 83,116,114,105,112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,112,
- 0, 83,116,114,105,112, 84,114, 97,110,115,102,111,114,109, 0, 83,116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110, 99,
-101, 0, 83,116,114,105,112, 80,114,111,120,121, 0, 83,116,114,105,112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,113,
-117,101,110, 99,101, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111,119, 86, 97,114,
-115, 0, 84,114, 97,110,115,102,111,114,109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97,114,115, 0, 83,
-112,101,101,100, 67,111,110,116,114,111,108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, 69,102,102, 0,
- 80, 97,114,116, 69,102,102, 0, 80, 97,114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114,111,112,101,114,
-116,121, 0, 98, 78,101, 97,114, 83,101,110,115,111,114, 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, 98, 84,111,117,
- 99,104, 83,101,110,115,111,114, 0, 98, 75,101,121, 98,111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114,111,112,101,114,
-116,121, 83,101,110,115,111,114, 0, 98, 65, 99,116,117, 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101,108, 97,121, 83,
-101,110,115,111,114, 0, 98, 67,111,108,108,105,115,105,111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97,114, 83,101,110,
-115,111,114, 0, 98, 82, 97,110,100,111,109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, 0, 98, 65,114,
-109, 97,116,117,114,101, 83,101,110,115,111,114, 0, 98, 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,110,
-115,111,114, 0, 98, 67,111,110,116,114,111,108,108,101,114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114, 0,
- 98, 69,120,112,114,101,115,115,105,111,110, 67,111,110,116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,116,
-117, 97,116,111,114, 0, 98, 65,100,100, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,110,
- 65, 99,116,117, 97,116,111,114, 0, 83,111,117,110,100, 51, 68, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0,
- 98, 69,100,105,116, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,116,
-111,114, 0, 98, 80,114,111,112,101,114,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,117,
- 97,116,111,114, 0, 98, 73,112,111, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,111,
-114, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,117,
- 97,116,111,114, 0, 98, 82, 97,110,100,111,109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,116,
-117, 97,116,111,114, 0, 98, 71, 97,109,101, 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121, 65,
- 99,116,117, 97,116,111,114, 0, 98, 84,119,111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,114,
-101,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 98, 65,114,109, 97,
-116,117,114,101, 65, 99,116,117, 97,116,111,114, 0, 71,114,111,117,112, 79, 98,106,101, 99,116, 0, 66,111,110,101, 0, 98, 65,
-114,109, 97,116,117,114,101, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, 86,101,114,116, 0, 98, 80,111,115,101, 67,104, 97,
-110,110,101,108, 0, 98, 73, 75, 80, 97,114, 97,109, 0, 98, 73,116, 97,115, 99, 0, 98, 65, 99,116,105,111,110, 71,114,111,117,
-112, 0, 83,112, 97, 99,101, 65, 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 98, 67,111,
-110,115,116,114, 97,105,110,116, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,111,110,
-115,116,114, 97,105,110,116, 84, 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110,115,116,114, 97,105,110,116, 0,
- 98, 75,105,110,101,109, 97,116,105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,112,108,105,110,101, 73, 75, 67,111,
-110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116,
- 97,116,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107,101, 67,111,110,
-115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83, 97,109,
-101, 86,111,108,117,109,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115, 76,105,107,101, 67,111,110,115,
-116,114, 97,105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110,
- 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0,
- 98, 68, 97,109,112, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, 80, 97,116,104,
- 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0,
- 98, 82,105,103,105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,108, 97,109,112,
- 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97,105,110,116, 0,
- 98, 84,114, 97,110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 80,105,118,111,116, 67,111,110,115,116,
-114, 97,105,110,116, 0, 98, 76,111, 99, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 76,105,
-109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,
-110,116, 0, 98, 68,105,115,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,104,114,105,110,107,119,
-114, 97,112, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 77,111,100,105,102,105,101,114, 0, 98, 65,
- 99,116,105,111,110, 83,116,114,105,112, 0, 98, 78,111,100,101, 83,116, 97, 99,107, 0, 98, 78,111,100,101, 83,111, 99,107,101,
-116, 0, 98, 78,111,100,101, 76,105,110,107, 0, 98, 78,111,100,101, 0, 98, 78,111,100,101, 80,114,101,118,105,101,119, 0,117,
-105, 66,108,111, 99,107, 0, 98, 78,111,100,101, 84,121,112,101, 0, 78,111,100,101, 73,109, 97,103,101, 65,110,105,109, 0, 78,
-111,100,101, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 66,105,
-108, 97,116,101,114, 97,108, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111,100,101, 73,
-109, 97,103,101, 70,105,108,101, 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89,115, 0, 78,
-111,100,101, 84,119,111, 70,108,111, 97,116,115, 0, 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100,101, 86,101,
-114,116,101,120, 67,111,108, 0, 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112,116, 68,105,
- 99,116, 0, 78,111,100,101, 71,108, 97,114,101, 0, 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, 76,101,110,
-115, 68,105,115,116, 0, 78,111,100,101, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 78,111,100,101, 67,111,108,111,114,
-115,112,105,108,108, 0, 84,101,120, 78,111,100,101, 79,117,116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, 80,111,105,110,
-116, 0, 67,117,114,118,101, 77, 97,112, 0, 66,114,117,115,104, 67,108,111,110,101, 0, 67,117,115,116,111,109, 68, 97,116, 97,
- 76, 97,121,101,114, 0, 67,117,115,116,111,109, 68, 97,116, 97, 69,120,116,101,114,110, 97,108, 0, 72, 97,105,114, 75,101,121,
- 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 66,111,105,100, 80, 97,114,116,105, 99,108,101, 0, 66,111,105,100, 68, 97,
-116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,112,114,105,110,103, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0,
- 80, 97,114,116,105, 99,108,101, 84, 97,114,103,101,116, 0, 80, 97,114,116,105, 99,108,101, 68,117,112,108,105, 87,101,105,103,
-104,116, 0, 80, 97,114,116,105, 99,108,101, 68, 97,116, 97, 0, 83, 80, 72, 70,108,117,105,100, 83,101,116,116,105,110,103,115,
- 0, 80, 97,114,116,105, 99,108,101, 83,101,116,116,105,110,103,115, 0, 66,111,105,100, 83,101,116,116,105,110,103,115, 0, 80,
- 97,114,116,105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 0, 75, 68, 84,114,101,101, 0, 80, 97,114,116,105, 99,108,101, 68,
-114, 97,119, 68, 97,116, 97, 0, 76,105,110,107, 78,111,100,101, 0, 98, 71, 80, 68,115,112,111,105,110,116, 0, 98, 71, 80, 68,
-115,116,114,111,107,101, 0, 98, 71, 80, 68,102,114, 97,109,101, 0, 98, 71, 80, 68,108, 97,121,101,114, 0, 82,101,112,111,114,
-116, 76,105,115,116, 0,119,109, 87,105,110,100,111,119, 77, 97,110, 97,103,101,114, 0,119,109, 87,105,110,100,111,119, 0,119,
-109, 75,101,121, 67,111,110,102,105,103, 0,119,109, 69,118,101,110,116, 0,119,109, 83,117, 98, 87,105,110,100,111,119, 0,119,
-109, 71,101,115,116,117,114,101, 0,119,109, 75,101,121, 77, 97,112, 73,116,101,109, 0, 80,111,105,110,116,101,114, 82, 78, 65,
- 0,119,109, 75,101,121, 77, 97,112, 0,119,109, 79,112,101,114, 97,116,111,114, 84,121,112,101, 0, 70, 77,111,100,105,102,105,
-101,114, 0, 70, 77,111,100, 95, 71,101,110,101,114, 97,116,111,114, 0, 70, 77,111,100, 95, 70,117,110, 99,116,105,111,110, 71,
-101,110,101,114, 97,116,111,114, 0, 70, 67, 77, 95, 69,110,118,101,108,111,112,101, 68, 97,116, 97, 0, 70, 77,111,100, 95, 69,
-110,118,101,108,111,112,101, 0, 70, 77,111,100, 95, 67,121, 99,108,101,115, 0, 70, 77,111,100, 95, 80,121,116,104,111,110, 0,
- 70, 77,111,100, 95, 76,105,109,105,116,115, 0, 70, 77,111,100, 95, 78,111,105,115,101, 0, 70, 77,111,100, 95, 83,116,101,112,
-112,101,100, 0, 68,114,105,118,101,114, 84, 97,114,103,101,116, 0, 68,114,105,118,101,114, 86, 97,114, 0, 67,104, 97,110,110,
-101,108, 68,114,105,118,101,114, 0, 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0, 65,110,105,109, 77, 97,112, 80, 97,
-105,114, 0, 65,110,105,109, 77, 97,112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0, 78,108, 97, 84,114, 97, 99,107, 0,
- 75, 83, 95, 80, 97,116,104, 0, 75,101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,118,101,114,114,105,100,101, 0, 73,
-100, 65,100,116, 84,101,109,112,108, 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,111,105,100, 82,117,108,101, 71,111,
- 97,108, 65,118,111,105,100, 0, 66,111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,108,108,105,115,105,111,110, 0, 66,
-111,105,100, 82,117,108,101, 70,111,108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,100, 82,117,108,101, 65,118,101,114,
- 97,103,101, 83,112,101,101,100, 0, 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0, 66,111,105,100, 83,116, 97,116,101,
- 0, 70, 76, 85, 73, 68, 95, 51, 68, 0, 87, 84, 85, 82, 66, 85, 76, 69, 78, 67, 69, 0, 0, 0, 84, 76, 69, 78, 1, 0, 1, 0,
- 2, 0, 2, 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 16, 0, 24, 0, 16, 0, 4, 0, 8, 0, 16, 0, 16, 0, 32, 0,
- 96, 0, 72, 0, 72, 2, 0, 0, 40, 0,144, 0,208, 4,112, 0, 36, 0, 56, 0,112, 0,128, 0,168, 0, 96, 0, 40, 0, 48, 0,
-176, 0, 16, 0,136, 0, 40, 0, 8, 6,240, 1, 0, 0, 0, 0, 0, 0, 16, 1,112, 1,120, 1, 24, 0, 8, 3,200, 0, 0, 0,
- 88, 0, 40, 1,240, 0,136, 0,216, 1, 64, 1, 88, 0, 32, 3,104, 0, 88, 1, 0, 0,128, 0,104, 0,208, 0, 80, 0, 8, 0,
- 16, 0, 32, 0, 0, 0,216, 1, 0, 0, 0, 0, 0, 0,176, 1, 20, 0, 48, 0, 64, 0, 24, 0, 12, 0, 16, 0, 4, 0, 8, 0,
- 8, 0, 0, 0, 40, 0,128, 0, 48, 0, 8, 0, 16, 0, 8, 0, 8, 0, 4, 0, 4, 0, 0, 1, 32, 0, 16, 0, 16, 0, 64, 0,
- 24, 0, 12, 0, 64, 0, 80, 0,104, 0,120, 0,128, 0, 96, 0,128, 0,160, 0, 96, 0, 88, 0,136, 0, 88, 0,112, 0, 16, 1,
- 56, 0,192, 0,184, 0,232, 0, 88, 0,120, 0,136, 0,224, 0,136, 0,248, 0, 80, 0,136, 0, 0, 0,152, 0, 40, 0, 16, 2,
-160, 0, 0, 0,120, 0, 0, 0, 0, 0, 96, 0, 8, 0, 8, 0, 48, 1,112, 0, 0, 2,104, 0, 96, 0, 88, 0, 96, 0,200, 1,
-144, 0,136, 0, 80, 0,136, 0,112, 0, 16, 0, 16, 1, 48, 0, 0, 0,144, 0,176, 0,104, 0, 48, 0, 24, 0,120, 0,152, 0,
-120, 1,224, 0,192, 0, 0, 0, 72, 0, 32, 0,176, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,224, 1, 40, 0,184, 0,152, 0,
- 64, 0, 64, 0, 24, 0, 88, 0, 0, 4, 64, 0, 24, 0, 16, 0,104, 0, 96, 0, 24, 0,240, 2, 48, 0, 16, 0,168, 0, 88, 0,
- 96, 0, 56, 0,192, 1, 32, 0, 8, 0, 24, 0, 80, 2, 0, 0, 0, 0, 88, 0,104, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 72, 1, 56, 0,144, 0, 64, 0,240, 0, 40, 0,248, 0,240, 0, 96, 2,104, 0, 0, 0,168, 0, 0, 0, 24, 1, 16, 0, 16, 0,
- 40, 33,128, 16, 24, 16,216, 0,152, 2,120, 2, 64, 0, 24, 0,216, 0, 32, 1, 72, 0,200, 2, 40, 0,136, 1,104, 0,216, 0,
-160, 0,136, 1, 24, 1, 32, 0,232, 0, 32, 0, 32, 0,112, 2,120, 1, 16, 0, 88, 30, 80, 0, 56, 0,112, 13,208, 0, 32, 0,
- 40, 0, 88, 1, 0, 0, 0, 0, 0, 0, 40, 1, 0, 0, 32, 1, 88, 0, 16, 0, 8, 0, 44, 0, 0, 1,240, 0,200, 1, 32, 1,
- 32, 0, 12, 0, 24, 0, 52, 0, 16, 0, 24, 0, 24, 0, 32, 0, 72, 1, 0, 0, 64, 0, 64, 0, 48, 0, 8, 0, 48, 0, 72, 0,
-104, 0, 40, 0, 8, 0, 72, 0, 44, 0, 40, 0,108, 0, 72, 0, 72, 0, 96, 0,104, 0, 60, 0,128, 0, 80, 0, 80, 0, 16, 0,
- 96, 0, 32, 0, 72, 0, 88, 0, 24, 0, 80, 0,112, 0, 84, 0, 32, 0, 96, 0, 56, 0, 56, 0,112, 0,140, 0, 4, 0, 24, 0,
- 16, 0, 8, 0, 88, 0, 40, 0, 40, 1,200, 0, 16, 0,248, 1, 4, 0, 40, 0,120, 0, 0, 1, 88, 0, 56, 0, 88, 0,128, 0,
- 80, 0,120, 0, 24, 0, 56, 0, 48, 0, 48, 0, 48, 0, 8, 0, 40, 0, 72, 0, 72, 0, 48, 0, 48, 0, 24, 0, 56, 0,104, 0,
- 16, 0,112, 0, 96, 0, 56, 0, 28, 0, 28, 0, 28, 0, 56, 0, 24, 0, 72, 0,168, 0, 40, 0,144, 0, 56, 0,232, 0, 0, 0,
- 0, 0, 0, 0, 16, 0, 40, 0, 28, 0, 12, 0, 12, 0, 16, 1, 44, 0, 24, 0, 8, 0, 64, 0, 32, 0, 24, 0, 16, 0, 24, 0,
- 32, 0, 8, 0, 96, 0, 20, 0, 32, 0, 12, 0, 56, 0, 24, 0, 72, 0,240, 0, 24, 0, 56, 0, 56, 0, 20, 0, 16, 0, 64, 0,
- 40, 0, 32, 0,192, 0, 52, 0, 32, 2,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 32, 0, 40, 0,192, 0, 40, 0, 24, 1,
-224, 0,168, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0,120, 0, 0, 0,104, 0, 24, 0, 24, 0, 16, 0, 24, 0, 8, 0, 16, 0,
- 24, 0, 20, 0, 20, 0, 56, 0, 24, 2, 40, 1, 16, 0,104, 0, 0, 1, 40, 0,200, 0,104, 0,112, 0,168, 0, 32, 0, 80, 0,
- 56, 0, 80, 0, 64, 0,104, 0, 72, 0, 64, 0,128, 0, 0, 0, 0, 0, 0, 0, 83, 84, 82, 67,144, 1, 0, 0, 10, 0, 2, 0,
- 10, 0, 0, 0, 10, 0, 1, 0, 11, 0, 3, 0, 11, 0, 0, 0, 11, 0, 1, 0, 9, 0, 2, 0, 12, 0, 2, 0, 9, 0, 3, 0,
- 9, 0, 4, 0, 13, 0, 2, 0, 2, 0, 5, 0, 2, 0, 6, 0, 14, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0, 15, 0, 4, 0,
- 4, 0, 7, 0, 4, 0, 8, 0, 4, 0, 9, 0, 4, 0, 10, 0, 16, 0, 4, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0,
- 7, 0, 10, 0, 17, 0, 4, 0, 9, 0, 11, 0, 12, 0, 12, 0, 4, 0, 13, 0, 4, 0, 14, 0, 18, 0, 10, 0, 18, 0, 0, 0,
- 18, 0, 1, 0, 0, 0, 15, 0, 0, 0, 16, 0, 2, 0, 17, 0, 0, 0, 18, 0, 4, 0, 19, 0, 17, 0, 20, 0, 4, 0, 21, 0,
- 4, 0, 22, 0, 19, 0, 9, 0, 9, 0, 0, 0, 9, 0, 1, 0, 19, 0, 23, 0, 20, 0, 24, 0, 0, 0, 25, 0, 2, 0, 26, 0,
- 2, 0, 17, 0, 4, 0, 27, 0, 18, 0, 28, 0, 20, 0, 8, 0, 19, 0, 29, 0, 19, 0, 30, 0, 21, 0, 31, 0, 0, 0, 32, 0,
- 0, 0, 33, 0, 4, 0, 34, 0, 4, 0, 35, 0, 20, 0, 36, 0, 22, 0, 5, 0, 4, 0, 37, 0, 4, 0, 38, 0, 2, 0, 39, 0,
- 2, 0, 40, 0, 4, 0, 41, 0, 23, 0, 6, 0, 24, 0, 42, 0, 2, 0, 43, 0, 2, 0, 44, 0, 2, 0, 15, 0, 2, 0, 17, 0,
- 0, 0, 45, 0, 25, 0, 21, 0, 25, 0, 0, 0, 25, 0, 1, 0, 26, 0, 46, 0, 27, 0, 47, 0, 16, 0, 48, 0, 16, 0, 49, 0,
- 2, 0, 43, 0, 2, 0, 44, 0, 2, 0, 50, 0, 2, 0, 51, 0, 2, 0, 52, 0, 2, 0, 53, 0, 2, 0, 17, 0, 2, 0, 54, 0,
- 7, 0, 9, 0, 7, 0, 10, 0, 4, 0, 55, 0, 7, 0, 56, 0, 7, 0, 57, 0, 7, 0, 58, 0, 23, 0, 59, 0, 28, 0, 7, 0,
- 19, 0, 29, 0, 12, 0, 60, 0, 16, 0, 61, 0, 2, 0, 43, 0, 2, 0, 62, 0, 2, 0, 63, 0, 2, 0, 35, 0, 29, 0, 16, 0,
- 29, 0, 0, 0, 29, 0, 1, 0, 7, 0, 64, 0, 7, 0, 58, 0, 2, 0, 15, 0, 2, 0, 44, 0, 2, 0, 65, 0, 2, 0, 17, 0,
- 4, 0, 66, 0, 4, 0, 67, 0, 9, 0, 2, 0, 7, 0, 68, 0, 0, 0, 18, 0, 0, 0, 69, 0, 7, 0, 70, 0, 7, 0, 71, 0,
- 30, 0, 13, 0, 19, 0, 29, 0, 31, 0, 72, 0, 29, 0, 73, 0, 0, 0, 74, 0, 4, 0, 75, 0, 7, 0, 58, 0, 12, 0, 76, 0,
- 28, 0, 77, 0, 19, 0, 78, 0, 2, 0, 15, 0, 2, 0, 79, 0, 2, 0, 80, 0, 2, 0, 17, 0, 32, 0, 6, 0, 32, 0, 0, 0,
- 32, 0, 1, 0, 0, 0, 81, 0, 0, 0, 82, 0, 4, 0, 21, 0, 4, 0, 83, 0, 33, 0, 10, 0, 33, 0, 0, 0, 33, 0, 1, 0,
- 4, 0, 84, 0, 4, 0, 85, 0, 4, 0, 86, 0, 4, 0, 87, 0, 4, 0, 12, 0, 4, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0,
- 34, 0, 15, 0, 19, 0, 29, 0, 0, 0, 91, 0, 4, 0, 88, 0, 4, 0, 92, 0, 12, 0, 93, 0, 32, 0, 94, 0, 32, 0, 95, 0,
- 4, 0, 96, 0, 4, 0, 97, 0, 12, 0, 98, 0, 0, 0, 99, 0, 4, 0,100, 0, 4, 0,101, 0, 9, 0,102, 0, 8, 0,103, 0,
- 35, 0, 3, 0, 4, 0,104, 0, 4, 0,105, 0, 9, 0, 2, 0, 36, 0, 15, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 15, 0,
- 2, 0, 17, 0, 7, 0,106, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0,109, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0,
- 7, 0,113, 0, 7, 0,114, 0, 28, 0, 77, 0, 24, 0,115, 0, 37, 0, 14, 0, 38, 0,116, 0, 4, 0,117, 0, 4, 0,118, 0,
- 4, 0,119, 0, 4, 0,120, 0, 0, 0,121, 0, 0, 0,122, 0, 0, 0,123, 0, 0, 0, 35, 0, 2, 0,124, 0, 2, 0,125, 0,
- 2, 0,126, 0, 2, 0, 17, 0, 4, 0, 67, 0, 39, 0, 32, 0, 19, 0, 29, 0, 0, 0, 32, 0, 12, 0,127, 0, 40, 0,128, 0,
- 41, 0,129, 0, 42, 0,130, 0, 42, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0, 2, 0,123, 0, 2, 0, 17, 0, 2, 0,134, 0,
- 2, 0, 15, 0, 4, 0,135, 0, 2, 0,136, 0, 2, 0,137, 0, 2, 0,138, 0, 2, 0,139, 0, 2, 0,140, 0, 2, 0,141, 0,
- 4, 0,142, 0, 4, 0,143, 0, 35, 0,144, 0, 22, 0,145, 0, 7, 0,146, 0, 4, 0,147, 0, 2, 0,148, 0, 2, 0,149, 0,
- 2, 0,150, 0, 2, 0,151, 0, 7, 0,152, 0, 7, 0,153, 0, 43, 0, 63, 0, 2, 0,154, 0, 2, 0,155, 0, 2, 0,156, 0,
- 2, 0,157, 0, 24, 0,158, 0, 44, 0,159, 0, 0, 0,160, 0, 0, 0,161, 0, 0, 0,162, 0, 0, 0,163, 0, 0, 0,164, 0,
- 7, 0,165, 0, 7, 0,166, 0, 7, 0,167, 0, 2, 0,168, 0, 2, 0,169, 0, 2, 0,170, 0, 2, 0,171, 0, 2, 0,172, 0,
- 2, 0,173, 0, 0, 0,174, 0, 0, 0,175, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,179, 0, 7, 0,180, 0,
- 7, 0, 54, 0, 7, 0,181, 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0,
- 7, 0,188, 0, 7, 0,189, 0, 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0, 7, 0,193, 0, 7, 0,194, 0, 7, 0,195, 0,
- 7, 0,196, 0, 7, 0,197, 0, 7, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0, 7, 0,201, 0, 7, 0,202, 0, 7, 0,203, 0,
- 7, 0,204, 0, 7, 0,205, 0, 7, 0,206, 0, 7, 0,207, 0, 7, 0,208, 0, 7, 0,209, 0, 7, 0,210, 0, 7, 0,211, 0,
- 7, 0,212, 0, 7, 0,213, 0, 7, 0,214, 0, 7, 0,215, 0, 45, 0, 15, 0, 0, 0,216, 0, 9, 0,217, 0, 0, 0,218, 0,
- 0, 0,219, 0, 4, 0,220, 0, 4, 0,221, 0, 9, 0,222, 0, 7, 0,223, 0, 7, 0,224, 0, 7, 0,225, 0, 4, 0,226, 0,
- 9, 0,227, 0, 9, 0,228, 0, 4, 0,229, 0, 4, 0, 35, 0, 46, 0, 6, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0,
- 7, 0,230, 0, 7, 0, 64, 0, 4, 0, 61, 0, 47, 0, 5, 0, 2, 0, 17, 0, 2, 0, 34, 0, 2, 0, 61, 0, 2, 0,231, 0,
- 46, 0,225, 0, 48, 0, 17, 0, 24, 0,158, 0, 39, 0,232, 0, 49, 0,233, 0, 7, 0,234, 0, 7, 0,235, 0, 2, 0, 15, 0,
- 2, 0,236, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0,237, 0, 4, 0,238, 0, 2, 0,239, 0, 2, 0,240, 0, 4, 0,123, 0,
- 4, 0,135, 0, 2, 0,241, 0, 2, 0,242, 0, 50, 0, 22, 0, 2, 0, 17, 0, 2, 0,243, 0, 7, 0,244, 0, 7, 0,245, 0,
- 2, 0,134, 0, 2, 0,246, 0, 4, 0,247, 0, 4, 0,248, 0, 24, 0,158, 0, 4, 0,249, 0, 2, 0,250, 0, 2, 0,251, 0,
- 9, 0,252, 0, 7, 0,253, 0, 7, 0,254, 0, 2, 0,255, 0, 2, 0, 0, 1, 2, 0, 1, 1, 2, 0, 2, 1, 7, 0, 3, 1,
- 7, 0, 4, 1, 47, 0, 5, 1, 51, 0, 13, 0, 4, 0, 6, 1, 4, 0, 7, 1, 2, 0, 8, 1, 2, 0, 17, 0, 2, 0, 9, 1,
- 2, 0, 10, 1, 24, 0,158, 0, 7, 0, 11, 1, 4, 0, 12, 1, 0, 0, 13, 1, 7, 0, 14, 1, 4, 0, 15, 1, 4, 0,123, 0,
- 44, 0, 63, 0, 19, 0, 29, 0, 31, 0, 72, 0, 7, 0, 16, 1, 7, 0, 17, 1, 7, 0, 18, 1, 7, 0, 19, 1, 7, 0, 20, 1,
- 7, 0, 21, 1, 7, 0, 22, 1, 7, 0, 23, 1, 7, 0, 24, 1, 7, 0, 67, 0, 7, 0, 25, 1, 7, 0, 26, 1, 7, 0, 27, 1,
- 7, 0, 28, 1, 7, 0, 29, 1, 7, 0, 30, 1, 7, 0, 31, 1, 7, 0, 32, 1, 7, 0, 33, 1, 7, 0, 34, 1, 7, 0, 35, 1,
- 7, 0, 36, 1, 2, 0, 37, 1, 2, 0, 38, 1, 2, 0, 39, 1, 2, 0, 40, 1, 2, 0, 41, 1, 2, 0, 42, 1, 2, 0, 43, 1,
- 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,236, 0, 7, 0, 44, 1, 7, 0, 45, 1, 7, 0, 46, 1, 7, 0, 47, 1, 4, 0, 48, 1,
- 4, 0, 49, 1, 2, 0, 50, 1, 2, 0, 51, 1, 2, 0, 9, 1, 2, 0,121, 0, 4, 0, 21, 0, 4, 0,118, 0, 4, 0,119, 0,
- 4, 0,120, 0, 7, 0, 52, 1, 7, 0, 53, 1, 7, 0, 87, 0, 37, 0, 54, 1, 52, 0, 55, 1, 28, 0, 77, 0, 39, 0,232, 0,
- 45, 0, 56, 1, 47, 0, 5, 1, 48, 0, 57, 1, 22, 0,145, 0, 50, 0, 58, 1, 51, 0, 59, 1, 0, 0, 60, 1, 0, 0,175, 0,
- 53, 0, 8, 0, 7, 0, 61, 1, 7, 0, 62, 1, 7, 0,166, 0, 4, 0, 17, 0, 7, 0, 63, 1, 7, 0, 64, 1, 7, 0, 65, 1,
- 24, 0, 42, 0, 54, 0, 72, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 15, 0, 2, 0, 17, 0, 4, 0, 66, 1, 2, 0,169, 0,
- 2, 0, 67, 1, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,179, 0, 7, 0, 68, 1, 7, 0, 69, 1, 7, 0, 70, 1,
- 7, 0, 71, 1, 7, 0, 72, 1, 7, 0, 73, 1, 7, 0, 74, 1, 7, 0, 75, 1, 7, 0, 76, 1, 7, 0, 77, 1, 7, 0, 78, 1,
- 55, 0, 79, 1, 2, 0,243, 0, 2, 0, 67, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0, 80, 1, 7, 0, 81, 1, 7, 0, 82, 1,
- 7, 0, 83, 1, 7, 0, 84, 1, 2, 0, 85, 1, 2, 0, 86, 1, 2, 0, 87, 1, 2, 0, 88, 1, 0, 0, 89, 1, 0, 0, 90, 1,
- 2, 0, 91, 1, 2, 0, 92, 1, 2, 0, 93, 1, 2, 0, 94, 1, 2, 0, 95, 1, 7, 0, 96, 1, 7, 0, 97, 1, 7, 0, 98, 1,
- 7, 0, 99, 1, 2, 0,100, 1, 2, 0, 87, 0, 2, 0,101, 1, 2, 0,102, 1, 2, 0,103, 1, 2, 0,104, 1, 7, 0,105, 1,
- 7, 0,106, 1, 7, 0,107, 1, 7, 0,108, 1, 7, 0,109, 1, 7, 0,110, 1, 7, 0,111, 1, 7, 0,112, 1, 7, 0,113, 1,
- 7, 0,114, 1, 7, 0,115, 1, 7, 0,116, 1, 2, 0,117, 1, 0, 0,118, 1, 28, 0, 77, 0, 43, 0,119, 1, 2, 0,120, 1,
- 0, 0,121, 1, 22, 0,145, 0, 56, 0, 18, 0, 7, 0,122, 1, 7, 0,123, 1, 7, 0,124, 1, 7, 0,125, 1, 7, 0,126, 1,
- 7, 0,127, 1, 7, 0,128, 1, 7, 0,129, 1, 7, 0,130, 1, 7, 0,131, 1, 2, 0,132, 1, 2, 0,133, 1, 2, 0,134, 1,
- 2, 0,135, 1, 7, 0,136, 1, 7, 0,137, 1, 7, 0,138, 1, 7, 0,139, 1, 57, 0,124, 0, 19, 0, 29, 0, 31, 0, 72, 0,
- 2, 0,140, 1, 2, 0, 17, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,141, 1, 7, 0,142, 1, 7, 0,143, 1,
- 7, 0,144, 1, 7, 0,145, 1, 7, 0,146, 1, 7, 0,147, 1, 7, 0,148, 1, 7, 0,149, 1, 7, 0,150, 1, 7, 0,151, 1,
- 7, 0,152, 1, 7, 0,153, 1, 7, 0,154, 1, 7, 0,155, 1, 7, 0,156, 1, 7, 0,157, 1, 7, 0,158, 1, 7, 0,159, 1,
- 7, 0,160, 1, 56, 0,161, 1, 7, 0,162, 1, 7, 0,163, 1, 7, 0,164, 1, 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1,
- 7, 0,168, 1, 2, 0,169, 1, 2, 0,170, 1, 2, 0,171, 1, 0, 0,172, 1, 0, 0,173, 1, 7, 0,174, 1, 7, 0,175, 1,
- 2, 0,176, 1, 2, 0,177, 1, 7, 0,178, 1, 7, 0,179, 1, 7, 0,180, 1, 7, 0,181, 1, 2, 0,182, 1, 2, 0,183, 1,
- 4, 0, 66, 1, 4, 0,184, 1, 2, 0,185, 1, 2, 0,186, 1, 2, 0,187, 1, 2, 0,188, 1, 7, 0,189, 1, 7, 0,190, 1,
- 7, 0,191, 1, 7, 0,192, 1, 7, 0,193, 1, 7, 0,194, 1, 7, 0,195, 1, 7, 0,196, 1, 7, 0,197, 1, 7, 0,198, 1,
- 0, 0,199, 1, 7, 0,200, 1, 7, 0,201, 1, 7, 0,202, 1, 4, 0,203, 1, 0, 0,204, 1, 0, 0,101, 1, 0, 0,205, 1,
- 0, 0, 60, 1, 2, 0,206, 1, 2, 0,207, 1, 2, 0,120, 1, 2, 0,208, 1, 2, 0,209, 1, 2, 0,210, 1, 7, 0,211, 1,
- 7, 0,212, 1, 7, 0,213, 1, 7, 0,214, 1, 7, 0,215, 1, 2, 0,154, 0, 2, 0,155, 0, 47, 0,216, 1, 47, 0,217, 1,
- 0, 0,218, 1, 0, 0,219, 1, 0, 0,220, 1, 0, 0,221, 1, 2, 0,222, 1, 2, 0,223, 1, 7, 0,224, 1, 7, 0,225, 1,
- 43, 0,119, 1, 52, 0, 55, 1, 28, 0, 77, 0, 58, 0,226, 1, 22, 0,145, 0, 7, 0,227, 1, 7, 0,228, 1, 7, 0,229, 1,
- 7, 0,230, 1, 7, 0,231, 1, 2, 0,232, 1, 2, 0, 67, 0, 7, 0,233, 1, 7, 0,234, 1, 7, 0,235, 1, 7, 0,236, 1,
- 7, 0,237, 1, 7, 0,238, 1, 7, 0,239, 1, 7, 0,240, 1, 7, 0,241, 1, 2, 0,242, 1, 2, 0,243, 1, 4, 0,244, 1,
- 4, 0,245, 1, 12, 0,246, 1, 59, 0, 4, 0, 19, 0, 29, 0, 0, 0,247, 1, 60, 0, 2, 0, 35, 0,144, 0, 61, 0, 26, 0,
- 61, 0, 0, 0, 61, 0, 1, 0, 62, 0,248, 1, 4, 0,249, 1, 4, 0,250, 1, 4, 0,251, 1, 4, 0,252, 1, 4, 0,253, 1,
- 4, 0,254, 1, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,255, 1, 2, 0, 0, 2, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 1, 2,
- 7, 0, 2, 2, 7, 0, 3, 2, 7, 0, 4, 2, 7, 0, 5, 2, 7, 0, 6, 2, 7, 0, 7, 2, 7, 0, 8, 2, 7, 0, 21, 0,
- 7, 0, 9, 2, 7, 0, 10, 2, 63, 0, 20, 0, 19, 0, 29, 0, 31, 0, 72, 0, 62, 0,248, 1, 12, 0, 11, 2, 12, 0, 12, 2,
- 12, 0, 13, 2, 28, 0, 77, 0, 57, 0, 14, 2, 0, 0, 17, 0, 0, 0, 15, 2, 2, 0, 16, 2, 2, 0,168, 0, 2, 0, 35, 0,
- 7, 0, 61, 1, 7, 0,166, 0, 7, 0, 62, 1, 7, 0, 17, 2, 7, 0, 18, 2, 7, 0, 19, 2, 61, 0, 20, 2, 27, 0, 11, 0,
- 7, 0, 21, 2, 7, 0, 22, 2, 7, 0, 23, 2, 7, 0,245, 0, 2, 0, 52, 0, 0, 0, 24, 2, 0, 0, 25, 2, 0, 0, 26, 2,
- 0, 0, 27, 2, 0, 0, 28, 2, 0, 0, 29, 2, 26, 0, 7, 0, 7, 0, 30, 2, 7, 0, 22, 2, 7, 0, 23, 2, 2, 0, 26, 2,
- 2, 0, 29, 2, 7, 0,245, 0, 7, 0, 35, 0, 64, 0, 21, 0, 64, 0, 0, 0, 64, 0, 1, 0, 2, 0, 15, 0, 2, 0, 31, 2,
- 2, 0, 29, 2, 2, 0, 17, 0, 2, 0, 32, 2, 2, 0, 33, 2, 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 36, 2, 2, 0, 37, 2,
- 2, 0, 38, 2, 2, 0, 39, 2, 7, 0, 40, 2, 7, 0, 41, 2, 26, 0, 46, 0, 27, 0, 47, 0, 2, 0, 42, 2, 2, 0, 43, 2,
- 4, 0, 44, 2, 65, 0, 5, 0, 2, 0, 45, 2, 2, 0, 31, 2, 0, 0, 17, 0, 0, 0, 35, 0, 2, 0, 67, 0, 66, 0, 4, 0,
- 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 46, 2, 7, 0, 47, 2, 67, 0, 4, 0, 12, 0, 48, 2, 68, 0, 49, 2, 4, 0, 50, 2,
- 0, 0, 90, 0, 69, 0, 68, 0, 19, 0, 29, 0, 31, 0, 72, 0, 62, 0,248, 1, 12, 0, 51, 2, 12, 0, 12, 2, 67, 0, 52, 2,
- 24, 0, 53, 2, 24, 0, 54, 2, 24, 0, 55, 2, 28, 0, 77, 0, 70, 0, 56, 2, 30, 0, 57, 2, 57, 0, 14, 2, 12, 0, 58, 2,
- 7, 0, 61, 1, 7, 0,166, 0, 7, 0, 62, 1, 2, 0,168, 0, 2, 0, 87, 0, 2, 0, 59, 2, 2, 0, 60, 2, 7, 0, 61, 2,
- 7, 0, 62, 2, 4, 0, 63, 2, 2, 0, 35, 0, 2, 0, 16, 2, 2, 0, 17, 0, 2, 0, 64, 2, 7, 0, 65, 2, 7, 0, 66, 2,
- 7, 0, 67, 2, 2, 0, 34, 2, 2, 0, 35, 2, 2, 0, 68, 2, 2, 0, 69, 2, 4, 0, 70, 2, 9, 0, 71, 2, 2, 0, 21, 0,
- 2, 0, 93, 0, 2, 0, 64, 0, 2, 0, 72, 2, 7, 0, 73, 2, 7, 0, 74, 2, 7, 0, 75, 2, 7, 0, 76, 2, 7, 0, 77, 2,
- 7, 0, 78, 2, 7, 0, 79, 2, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0, 82, 2, 0, 0, 83, 2, 71, 0, 84, 2, 72, 0, 85, 2,
- 0, 0, 86, 2, 59, 0, 87, 2, 59, 0, 88, 2, 59, 0, 89, 2, 59, 0, 90, 2, 4, 0, 91, 2, 7, 0, 92, 2, 4, 0, 93, 2,
- 4, 0, 94, 2, 66, 0, 95, 2, 4, 0, 96, 2, 4, 0, 97, 2, 65, 0, 98, 2, 65, 0, 99, 2, 73, 0, 41, 0, 19, 0, 29, 0,
- 31, 0, 72, 0, 62, 0,248, 1, 12, 0,100, 2, 28, 0, 77, 0, 30, 0, 57, 2, 57, 0, 14, 2, 74, 0,101, 2, 75, 0,102, 2,
- 76, 0,103, 2, 77, 0,104, 2, 78, 0,105, 2, 79, 0,106, 2, 80, 0,107, 2, 81, 0,108, 2, 73, 0,109, 2, 82, 0,110, 2,
- 83, 0,111, 2, 84, 0,112, 2, 84, 0,113, 2, 84, 0,114, 2, 4, 0, 51, 0, 4, 0,115, 2, 4, 0,116, 2, 4, 0,117, 2,
- 4, 0,118, 2, 2, 0,168, 0, 2, 0,119, 2, 7, 0, 61, 1, 7, 0,166, 0, 7, 0, 62, 1, 7, 0,120, 2, 4, 0, 59, 2,
- 2, 0,121, 2, 2, 0, 17, 0, 2, 0,122, 2, 2, 0,123, 2, 2, 0, 16, 2, 2, 0,124, 2, 85, 0,125, 2, 86, 0,126, 2,
- 76, 0, 8, 0, 9, 0,127, 2, 7, 0,128, 2, 4, 0,129, 2, 0, 0, 17, 0, 0, 0,130, 2, 2, 0, 66, 1, 2, 0,131, 2,
- 2, 0,132, 2, 74, 0, 7, 0, 4, 0,133, 2, 4, 0,134, 2, 4, 0,135, 2, 4, 0,136, 2, 2, 0, 31, 2, 0, 0,137, 2,
- 0, 0, 17, 0, 78, 0, 5, 0, 4, 0,133, 2, 4, 0,134, 2, 0, 0,138, 2, 0, 0,139, 2, 2, 0, 17, 0, 87, 0, 2, 0,
- 4, 0,140, 2, 7, 0, 23, 2, 79, 0, 3, 0, 87, 0,141, 2, 4, 0,142, 2, 4, 0, 17, 0, 77, 0, 6, 0, 7, 0,143, 2,
- 2, 0,144, 2, 2, 0, 31, 2, 0, 0, 17, 0, 0, 0,139, 2, 0, 0,145, 2, 80, 0, 4, 0, 0, 0,230, 0, 0, 0,176, 0,
- 0, 0,177, 0, 0, 0,178, 0, 88, 0, 6, 0, 39, 0,127, 2, 0, 0, 17, 0, 0, 0,130, 2, 2, 0, 66, 1, 2, 0,131, 2,
- 2, 0,132, 2, 89, 0, 1, 0, 7, 0,146, 2, 90, 0, 5, 0, 0, 0,230, 0, 0, 0,176, 0, 0, 0,177, 0, 0, 0,178, 0,
- 4, 0, 35, 0, 81, 0, 1, 0, 7, 0,147, 2, 82, 0, 2, 0, 4, 0,148, 2, 4, 0, 15, 0, 75, 0, 7, 0, 7, 0,128, 2,
- 39, 0,127, 2, 0, 0, 17, 0, 0, 0,130, 2, 2, 0, 66, 1, 2, 0,131, 2, 2, 0,132, 2, 91, 0, 1, 0, 7, 0,149, 2,
- 92, 0, 1, 0, 4, 0,150, 2, 93, 0, 1, 0, 0, 0,151, 2, 94, 0, 1, 0, 7, 0,128, 2, 95, 0, 3, 0, 4, 0,152, 2,
- 0, 0, 90, 0, 7, 0,153, 2, 96, 0, 4, 0, 7, 0,230, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 97, 0, 1, 0,
- 96, 0,129, 2, 98, 0, 5, 0, 4, 0,154, 2, 4, 0,155, 2, 0, 0, 17, 0, 0, 0, 31, 2, 0, 0,145, 2, 99, 0, 2, 0,
- 4, 0,156, 2, 4, 0,155, 2,100, 0, 10, 0,100, 0, 0, 0,100, 0, 1, 0, 98, 0,157, 2, 97, 0,158, 2, 99, 0,159, 2,
- 4, 0, 51, 0, 4, 0,116, 2, 4, 0,115, 2, 4, 0, 35, 0, 77, 0,160, 2, 85, 0, 14, 0, 12, 0,161, 2, 77, 0,160, 2,
- 0, 0,162, 2, 0, 0,163, 2, 0, 0,164, 2, 0, 0,165, 2, 0, 0,166, 2, 0, 0,167, 2, 0, 0,168, 2, 0, 0, 17, 0,
- 84, 0,112, 2, 84, 0,114, 2, 2, 0,169, 2, 0, 0,170, 2, 86, 0, 8, 0, 4, 0,171, 2, 4, 0,172, 2, 74, 0,173, 2,
- 78, 0,174, 2, 4, 0,116, 2, 4, 0,115, 2, 4, 0, 51, 0, 4, 0, 35, 0,101, 0, 9, 0,101, 0, 0, 0,101, 0, 1, 0,
- 4, 0, 15, 0, 4, 0, 66, 1, 4, 0,175, 2, 4, 0, 35, 0, 0, 0, 18, 0, 38, 0,116, 0, 0, 0,176, 2,102, 0, 7, 0,
-101, 0,177, 2, 2, 0,178, 2, 2, 0,161, 2, 2, 0,179, 2, 2, 0, 88, 0, 9, 0,180, 2, 9, 0,181, 2,103, 0, 3, 0,
-101, 0,177, 2, 24, 0,158, 0, 0, 0, 18, 0,104, 0, 5, 0,101, 0,177, 2, 24, 0,158, 0, 0, 0, 18, 0, 2, 0,182, 2,
- 0, 0,183, 2,105, 0, 5, 0,101, 0,177, 2, 7, 0, 85, 0, 7, 0,184, 2, 4, 0,185, 2, 4, 0,186, 2,106, 0, 5, 0,
-101, 0,177, 2, 24, 0,187, 2, 0, 0, 69, 0, 4, 0, 66, 1, 4, 0, 17, 0,107, 0, 13, 0,101, 0,177, 2, 24, 0,188, 2,
- 24, 0,189, 2, 24, 0,190, 2, 24, 0,191, 2, 7, 0,192, 2, 7, 0,193, 2, 7, 0,184, 2, 7, 0,194, 2, 4, 0,195, 2,
- 4, 0,196, 2, 4, 0, 88, 0, 4, 0,197, 2,108, 0, 5, 0,101, 0,177, 2, 2, 0,198, 2, 2, 0, 17, 0, 7, 0,199, 2,
- 24, 0,200, 2,109, 0, 3, 0,101, 0,177, 2, 7, 0,201, 2, 4, 0, 88, 0,110, 0, 10, 0,101, 0,177, 2, 7, 0,202, 2,
- 4, 0,203, 2, 4, 0, 35, 0, 2, 0, 88, 0, 2, 0,204, 2, 2, 0,205, 2, 2, 0,206, 2, 7, 0,207, 2, 0, 0,208, 2,
-111, 0, 3, 0,101, 0,177, 2, 7, 0, 35, 0, 4, 0, 15, 0,112, 0, 6, 0,101, 0,177, 2,113, 0,209, 2,114, 0,210, 2,
-115, 0,211, 2, 7, 0,212, 2, 4, 0, 15, 0,116, 0, 11, 0,101, 0,177, 2, 44, 0,213, 2, 7, 0,214, 2, 4, 0,215, 2,
- 0, 0,208, 2, 7, 0,216, 2, 4, 0,217, 2, 24, 0,218, 2, 0, 0,219, 2, 4, 0,220, 2, 4, 0, 35, 0,117, 0, 12, 0,
-101, 0,177, 2, 24, 0,221, 2, 39, 0,222, 2, 4, 0, 88, 0, 4, 0,223, 2, 7, 0,224, 2, 7, 0,225, 2, 7, 0,226, 2,
- 7, 0,227, 2, 0, 0,219, 2, 4, 0,220, 2, 4, 0, 35, 0,118, 0, 3, 0,101, 0,177, 2, 7, 0,228, 2, 4, 0,229, 2,
-119, 0, 5, 0,101, 0,177, 2, 7, 0,230, 2, 0, 0,208, 2, 2, 0, 17, 0, 2, 0,231, 2,120, 0, 8, 0,101, 0,177, 2,
- 24, 0,158, 0, 7, 0,230, 2, 7, 0,245, 0, 7, 0,104, 0, 0, 0,208, 2, 2, 0, 17, 0, 2, 0, 15, 0,121, 0, 21, 0,
-101, 0,177, 2, 24, 0,232, 2, 0, 0,208, 2, 44, 0,213, 2, 24, 0,218, 2, 2, 0, 17, 0, 2, 0, 35, 0, 7, 0,233, 2,
- 7, 0,234, 2, 7, 0,235, 2, 7, 0, 65, 2, 7, 0,236, 2, 7, 0,237, 2, 7, 0,238, 2, 7, 0,239, 2, 4, 0,217, 2,
- 4, 0,220, 2, 0, 0,219, 2, 7, 0,240, 2, 7, 0,241, 2, 7, 0, 87, 0,122, 0, 7, 0,101, 0,177, 2, 2, 0,242, 2,
- 2, 0,243, 2, 4, 0, 67, 0, 24, 0,158, 0, 7, 0,244, 2, 0, 0,208, 2,123, 0, 10, 0,101, 0,177, 2, 24, 0,158, 0,
- 0, 0,245, 2, 7, 0,246, 2, 7, 0,247, 2, 7, 0,239, 2, 4, 0,248, 2, 4, 0,249, 2, 7, 0,250, 2, 0, 0, 18, 0,
-124, 0, 1, 0,101, 0,177, 2,125, 0, 7, 0,101, 0,177, 2, 38, 0,116, 0,126, 0,251, 2,127, 0,252, 2,128, 0,253, 2,
-129, 0,254, 2, 12, 0,255, 2,130, 0, 13, 0,101, 0,177, 2, 77, 0, 0, 3, 77, 0, 1, 3, 77, 0, 2, 3, 77, 0, 3, 3,
- 77, 0, 4, 3, 77, 0, 5, 3, 74, 0, 6, 3, 4, 0, 7, 3, 4, 0, 8, 3, 7, 0,212, 2, 7, 0, 35, 0,131, 0, 9, 3,
-132, 0, 7, 0,101, 0,177, 2, 77, 0, 0, 3, 77, 0, 10, 3,133, 0, 11, 3,134, 0, 9, 3, 4, 0, 12, 3, 4, 0, 7, 3,
-135, 0, 4, 0,101, 0,177, 2, 24, 0,158, 0, 4, 0, 13, 3, 4, 0, 35, 0,136, 0, 2, 0, 4, 0, 14, 3, 7, 0, 23, 2,
-137, 0, 2, 0, 4, 0,119, 0, 4, 0, 15, 3,138, 0, 24, 0,101, 0,177, 2, 24, 0,158, 0, 0, 0,208, 2, 2, 0, 16, 3,
- 2, 0, 17, 0, 2, 0, 66, 1, 2, 0, 35, 0,136, 0, 17, 3, 4, 0, 18, 3, 7, 0, 19, 3, 4, 0, 51, 0, 4, 0, 20, 3,
-137, 0, 21, 3,136, 0, 22, 3, 4, 0, 23, 3, 4, 0, 24, 3, 4, 0, 25, 3, 4, 0, 15, 3, 7, 0, 26, 3, 7, 0, 27, 3,
- 7, 0, 28, 3, 7, 0, 29, 3, 7, 0, 30, 3, 9, 0, 31, 3,139, 0, 8, 0,101, 0,177, 2,140, 0, 32, 3,133, 0, 11, 3,
- 4, 0, 33, 3, 4, 0, 34, 3, 4, 0, 35, 3, 2, 0, 17, 0, 2, 0, 54, 0,141, 0, 8, 0,101, 0,177, 2, 24, 0, 42, 0,
- 2, 0,249, 0, 2, 0, 17, 0, 2, 0,198, 2, 2, 0, 54, 0, 7, 0, 36, 3, 7, 0, 37, 3,142, 0, 5, 0,101, 0,177, 2,
- 4, 0, 38, 3, 2, 0, 17, 0, 2, 0, 39, 3, 7, 0, 40, 3,143, 0, 8, 0,101, 0,177, 2, 0, 0, 41, 3, 0, 0, 42, 3,
- 0, 0,167, 2, 0, 0, 43, 3, 0, 0, 44, 3, 0, 0, 88, 0, 0, 0,145, 2,144, 0, 3, 0,101, 0,177, 2,145, 0, 45, 3,
-129, 0,254, 2,146, 0, 10, 0,101, 0,177, 2, 24, 0, 46, 3, 24, 0, 47, 3, 0, 0, 48, 3, 7, 0, 49, 3, 2, 0, 50, 3,
- 2, 0, 51, 3, 0, 0, 52, 3, 0, 0, 53, 3, 0, 0,183, 2,147, 0, 9, 0,101, 0,177, 2, 24, 0, 54, 3, 0, 0, 48, 3,
- 7, 0, 55, 3, 7, 0, 56, 3, 0, 0, 66, 1, 0, 0,198, 2, 0, 0, 57, 3, 0, 0, 35, 0,148, 0, 1, 0,101, 0,177, 2,
-149, 0, 8, 0,101, 0,177, 2, 0, 0,208, 2, 7, 0,119, 0, 7, 0, 58, 3, 7, 0, 59, 3, 7, 0, 60, 3, 7, 0, 61, 3,
- 4, 0, 17, 0,150, 0, 9, 0,101, 0,177, 2, 24, 0, 62, 3, 4, 0, 63, 3, 4, 0, 64, 3, 4, 0, 65, 3, 7, 0, 66, 3,
- 7, 0, 67, 3, 2, 0,198, 2, 2, 0, 17, 0,151, 0, 3, 0,152, 0, 68, 3, 4, 0, 50, 2, 0, 0, 90, 0,152, 0, 29, 0,
- 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 32, 2, 2, 0, 33, 2, 2, 0, 69, 3, 2, 0, 17, 0, 2, 0, 70, 3, 2, 0, 71, 3,
- 2, 0, 72, 3, 2, 0, 67, 0, 0, 0, 73, 3, 0, 0, 74, 3, 0, 0, 75, 3, 0, 0,223, 1, 4, 0, 35, 0, 7, 0, 76, 3,
- 7, 0, 77, 3, 7, 0, 78, 3, 7, 0, 79, 3, 7, 0, 80, 3, 7, 0, 81, 3, 26, 0, 82, 3, 28, 0, 77, 0, 30, 0, 57, 2,
- 79, 0,106, 2, 0, 0, 69, 0, 7, 0, 83, 3, 7, 0, 84, 3,151, 0, 85, 3,153, 0, 3, 0,153, 0, 0, 0,153, 0, 1, 0,
- 0, 0, 18, 0, 62, 0, 3, 0, 7, 0, 86, 3, 4, 0, 17, 0, 4, 0, 35, 0, 24, 0,126, 0, 19, 0, 29, 0, 31, 0, 72, 0,
-154, 0, 87, 3, 2, 0, 15, 0, 2, 0, 88, 3, 4, 0, 89, 3, 4, 0, 90, 3, 4, 0, 91, 3, 0, 0, 92, 3, 24, 0, 36, 0,
- 24, 0, 93, 3, 24, 0, 94, 3, 24, 0, 95, 3, 24, 0, 96, 3, 28, 0, 77, 0, 70, 0, 56, 2, 62, 0,248, 1,155, 0, 97, 3,
-155, 0, 98, 3,156, 0, 99, 3, 9, 0, 2, 0,157, 0,100, 3,158, 0,101, 3,159, 0,102, 3, 12, 0,103, 3, 12, 0,100, 2,
- 12, 0, 12, 2, 12, 0,104, 3, 12, 0,105, 3, 4, 0, 66, 1, 4, 0,106, 3, 57, 0, 14, 2, 0, 0,107, 3, 4, 0, 16, 2,
- 4, 0,108, 3, 7, 0, 61, 1, 7, 0,109, 3, 7, 0,110, 3, 7, 0,166, 0, 7, 0,111, 3, 7, 0, 62, 1, 7, 0,112, 3,
- 7, 0, 2, 2, 7, 0,113, 3, 7, 0,114, 3, 7, 0,115, 3, 7, 0,116, 3, 7, 0,117, 3, 7, 0,118, 3, 7, 0,246, 2,
- 7, 0,119, 3, 7, 0,234, 0, 4, 0,120, 3, 2, 0, 17, 0, 2, 0,121, 3, 2, 0,122, 3, 2, 0,123, 3, 2, 0,124, 3,
- 2, 0,125, 3, 2, 0,126, 3, 2, 0,127, 3, 2, 0,128, 3, 2, 0,129, 3, 2, 0,130, 3, 2, 0,131, 3, 4, 0,132, 3,
- 4, 0,133, 3, 4, 0,134, 3, 4, 0,135, 3, 7, 0,136, 3, 7, 0, 92, 2, 7, 0,137, 3, 7, 0,138, 3, 7, 0,139, 3,
- 7, 0,140, 3, 7, 0,141, 3, 7, 0,209, 0, 7, 0,142, 3, 7, 0,143, 3, 7, 0,144, 3, 7, 0,145, 3, 2, 0,146, 3,
- 0, 0,147, 3, 0, 0,148, 3, 0, 0,149, 3, 0, 0,150, 3, 7, 0,151, 3, 7, 0,152, 3, 12, 0,153, 3, 12, 0,154, 3,
- 12, 0,155, 3, 12, 0,156, 3, 7, 0,157, 3, 2, 0,148, 2, 2, 0,158, 3, 7, 0,129, 2, 4, 0,159, 3, 4, 0,160, 3,
-160, 0,161, 3, 2, 0,162, 3, 2, 0,241, 0, 7, 0,163, 3, 12, 0,164, 3, 12, 0,165, 3, 12, 0,166, 3, 12, 0,167, 3,
-161, 0, 58, 1,162, 0,168, 3, 58, 0,169, 3, 2, 0,170, 3, 2, 0,171, 3, 2, 0, 50, 2, 2, 0,172, 3, 7, 0,121, 2,
- 2, 0,173, 3, 2, 0,174, 3,145, 0,175, 3,133, 0,176, 3,133, 0,177, 3, 4, 0,178, 3, 4, 0,179, 3, 4, 0,180, 3,
- 4, 0, 67, 0, 12, 0,181, 3, 12, 0,182, 3, 12, 0,183, 3,163, 0, 14, 0,163, 0, 0, 0,163, 0, 1, 0, 24, 0, 36, 0,
- 7, 0,246, 2, 7, 0, 63, 1, 7, 0,247, 2, 7, 0,239, 2, 0, 0, 18, 0, 4, 0,248, 2, 4, 0,249, 2, 4, 0,184, 3,
- 2, 0, 15, 0, 2, 0,185, 3, 7, 0,250, 2,164, 0, 12, 0,164, 0, 0, 0,164, 0, 1, 0, 24, 0, 42, 0, 4, 0,186, 3,
- 4, 0,148, 2, 4, 0,187, 3, 4, 0, 15, 0, 4, 0,188, 3, 7, 0, 63, 1, 7, 0,189, 3, 7, 0,190, 3, 7, 0,146, 2,
-161, 0, 40, 0, 4, 0, 17, 0, 2, 0,191, 3, 2, 0,192, 3, 2, 0,239, 2, 2, 0,193, 3, 2, 0,194, 3, 2, 0,195, 3,
- 2, 0,196, 3, 2, 0,197, 3, 7, 0,198, 3, 7, 0,199, 3, 7, 0,200, 3, 7, 0,201, 3, 7, 0,202, 3, 7, 0,203, 3,
- 7, 0,204, 3, 7, 0,205, 3, 7, 0,206, 3, 7, 0,207, 3, 7, 0,208, 3, 7, 0,209, 3, 7, 0,210, 3, 7, 0,211, 3,
- 7, 0,212, 3, 7, 0,213, 3, 7, 0,214, 3, 7, 0,215, 3, 7, 0,216, 3, 7, 0,217, 3, 7, 0,218, 3, 7, 0,219, 3,
- 7, 0,220, 3, 7, 0,221, 3, 7, 0,222, 3, 7, 0,223, 3, 7, 0,224, 3, 44, 0,159, 0,165, 0,225, 3, 7, 0,226, 3,
- 4, 0,186, 2,166, 0, 5, 0, 58, 0,226, 1, 7, 0,227, 3, 7, 0,228, 3, 2, 0, 17, 0, 2, 0,229, 3,167, 0, 5, 0,
-167, 0, 0, 0,167, 0, 1, 0, 4, 0, 15, 0, 4, 0,230, 3, 9, 0, 2, 0,168, 0, 9, 0,168, 0, 0, 0,168, 0, 1, 0,
- 4, 0,231, 3, 4, 0,232, 3, 4, 0,233, 3, 4, 0, 17, 0, 9, 0,234, 3, 9, 0,235, 3, 12, 0,236, 3,129, 0, 21, 0,
-129, 0, 0, 0,129, 0, 1, 0, 4, 0, 17, 0, 4, 0,237, 3, 4, 0,238, 3, 4, 0,239, 3, 4, 0,240, 3, 4, 0,241, 3,
- 4, 0,242, 3, 4, 0,232, 3, 4, 0,148, 2, 2, 0,243, 3, 2, 0, 54, 0, 0, 0,244, 3, 0, 0,245, 3, 0, 0,246, 3,
- 0, 0,247, 3, 0, 0,248, 3, 12, 0,249, 3,169, 0,250, 3, 9, 0,251, 3,170, 0, 1, 0, 7, 0, 30, 2,160, 0, 30, 0,
- 4, 0, 17, 0, 7, 0,252, 3, 7, 0,253, 3, 7, 0,254, 3, 4, 0,255, 3, 4, 0, 0, 4, 4, 0, 1, 4, 4, 0, 2, 4,
- 7, 0, 3, 4, 7, 0, 4, 4, 7, 0, 5, 4, 7, 0, 6, 4, 7, 0, 7, 4, 7, 0, 8, 4, 7, 0, 9, 4, 7, 0, 10, 4,
- 7, 0, 11, 4, 7, 0, 12, 4, 7, 0, 13, 4, 7, 0, 14, 4, 7, 0, 15, 4, 7, 0, 16, 4, 7, 0, 17, 4, 7, 0, 18, 4,
- 7, 0, 19, 4, 7, 0, 20, 4, 4, 0, 21, 4, 4, 0, 22, 4, 7, 0, 23, 4, 7, 0,142, 3,162, 0, 54, 0, 4, 0,232, 3,
- 4, 0, 24, 4,171, 0, 25, 4,172, 0, 26, 4, 0, 0, 35, 0, 0, 0, 27, 4, 2, 0, 28, 4, 7, 0, 29, 4, 0, 0, 30, 4,
- 7, 0, 31, 4, 7, 0, 32, 4, 7, 0, 33, 4, 7, 0, 34, 4, 7, 0, 35, 4, 7, 0, 36, 4, 7, 0, 37, 4, 7, 0, 38, 4,
- 7, 0, 39, 4, 2, 0, 40, 4, 0, 0, 41, 4, 2, 0, 42, 4, 7, 0, 43, 4, 7, 0, 44, 4, 0, 0, 45, 4, 4, 0,120, 0,
- 4, 0, 46, 4, 4, 0, 47, 4, 2, 0, 48, 4, 2, 0, 49, 4,170, 0, 50, 4, 4, 0, 51, 4, 4, 0, 79, 0, 7, 0, 52, 4,
- 7, 0, 53, 4, 7, 0, 54, 4, 7, 0, 55, 4, 2, 0, 56, 4, 2, 0, 57, 4, 2, 0, 58, 4, 2, 0, 59, 4, 2, 0, 60, 4,
- 2, 0, 61, 4, 2, 0, 62, 4, 2, 0, 63, 4,173, 0, 64, 4, 7, 0, 65, 4, 7, 0, 66, 4,129, 0, 67, 4, 12, 0,255, 2,
-166, 0, 68, 4, 7, 0, 69, 4, 7, 0, 70, 4, 7, 0, 71, 4, 0, 0, 72, 4,145, 0, 51, 0,144, 0, 73, 4, 2, 0, 15, 0,
- 2, 0, 74, 4, 2, 0, 75, 4, 2, 0, 76, 4, 7, 0, 77, 4, 2, 0, 78, 4, 2, 0, 79, 4, 7, 0, 80, 4, 2, 0, 81, 4,
- 2, 0, 82, 4, 7, 0, 83, 4, 7, 0, 84, 4, 7, 0, 85, 4, 7, 0, 86, 4, 7, 0, 87, 4, 4, 0, 88, 4, 4, 0, 89, 4,
- 7, 0, 90, 4, 4, 0, 91, 4, 7, 0, 92, 4, 7, 0, 93, 4, 7, 0, 94, 4, 73, 0, 95, 4, 73, 0, 96, 4, 73, 0, 97, 4,
- 0, 0, 98, 4, 7, 0, 99, 4, 7, 0,100, 4, 28, 0, 77, 0, 2, 0,101, 4, 0, 0,102, 4, 0, 0,103, 4, 7, 0,104, 4,
- 4, 0,105, 4, 7, 0,106, 4, 7, 0,107, 4, 4, 0,108, 4, 4, 0, 17, 0, 7, 0,109, 4, 7, 0,110, 4, 7, 0,111, 4,
- 77, 0,112, 4, 7, 0,113, 4, 7, 0,114, 4, 7, 0,115, 4, 7, 0,116, 4, 7, 0,117, 4, 7, 0,118, 4, 7, 0,119, 4,
- 4, 0,120, 4,174, 0, 76, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0,169, 0, 2, 0, 67, 1, 2, 0,101, 1, 2, 0,121, 4,
- 7, 0,122, 4, 7, 0,123, 4, 7, 0,124, 4, 7, 0,125, 4, 7, 0,126, 4, 7, 0,127, 4, 7, 0,147, 1, 7, 0,149, 1,
- 7, 0,148, 1, 7, 0, 67, 0, 4, 0,128, 4, 7, 0,129, 4, 7, 0,130, 4, 7, 0,131, 4, 7, 0,132, 4, 7, 0,133, 4,
- 7, 0,134, 4, 7, 0,135, 4, 2, 0,136, 4, 2, 0, 66, 1, 2, 0,137, 4, 2, 0,138, 4, 2, 0,139, 4, 2, 0,140, 4,
- 2, 0,141, 4, 2, 0,142, 4, 7, 0,143, 4, 7, 0,144, 4, 7, 0,145, 4, 7, 0,146, 4, 7, 0,147, 4, 7, 0,148, 4,
- 7, 0,149, 4, 7, 0,150, 4, 7, 0,151, 4, 7, 0,152, 4, 7, 0,153, 4, 7, 0,154, 4, 2, 0,155, 4, 2, 0,156, 4,
- 2, 0,157, 4, 2, 0,158, 4, 7, 0,159, 4, 7, 0,160, 4, 7, 0,161, 4, 7, 0,162, 4, 2, 0,163, 4, 2, 0,164, 4,
- 2, 0,165, 4, 2, 0,166, 4, 7, 0,167, 4, 7, 0,168, 4, 7, 0,169, 4, 7, 0,170, 4, 7, 0,171, 4, 7, 0,172, 4,
- 7, 0,173, 4, 2, 0,174, 4, 2, 0,175, 4, 2, 0,176, 4, 2, 0,177, 4, 2, 0,178, 4, 2, 0, 17, 0, 7, 0,179, 4,
- 7, 0,180, 4, 28, 0, 77, 0, 43, 0,119, 1, 2, 0,120, 1, 2, 0,181, 4, 22, 0,145, 0,175, 0, 8, 0,175, 0, 0, 0,
-175, 0, 1, 0, 4, 0,120, 3, 4, 0,182, 4, 4, 0, 17, 0, 2, 0,183, 4, 2, 0,184, 4, 24, 0,158, 0,176, 0, 13, 0,
- 9, 0,185, 4, 9, 0,186, 4, 4, 0,187, 4, 4, 0,188, 4, 4, 0,189, 4, 4, 0,190, 4, 4, 0,191, 4, 4, 0,192, 4,
- 4, 0,193, 4, 4, 0,194, 4, 4, 0,195, 4, 4, 0, 35, 0, 0, 0,196, 4,177, 0, 5, 0, 9, 0,197, 4, 9, 0,198, 4,
- 4, 0,199, 4, 4, 0, 67, 0, 0, 0,200, 4,178, 0, 17, 0, 4, 0,201, 4, 4, 0,202, 4, 4, 0,203, 4, 4, 0,204, 4,
- 4, 0,205, 4, 4, 0,206, 4, 4, 0,207, 4, 4, 0,208, 4, 4, 0,209, 4, 4, 0,210, 4, 4, 0,211, 4, 4, 0,212, 4,
- 2, 0,213, 4, 2, 0,214, 4, 4, 0,215, 4, 4, 0,216, 4, 4, 0, 87, 0,179, 0, 15, 0, 4, 0, 15, 0, 4, 0,203, 4,
- 4, 0,217, 4, 4, 0,218, 4, 4, 0,219, 4, 4, 0,220, 4, 7, 0,221, 4, 4, 0,222, 4, 4, 0, 88, 0, 4, 0,223, 4,
- 4, 0,224, 4, 4, 0,225, 4, 4, 0,226, 4, 4, 0,227, 4, 18, 0, 28, 0,180, 0, 7, 0, 4, 0,228, 4, 7, 0,229, 4,
- 7, 0,230, 4, 7, 0,231, 4, 4, 0,232, 4, 2, 0, 17, 0, 2, 0, 35, 0,181, 0, 11, 0,181, 0, 0, 0,181, 0, 1, 0,
- 0, 0, 18, 0, 57, 0,233, 4, 58, 0,234, 4, 4, 0,120, 3, 4, 0,235, 4, 4, 0,236, 4, 4, 0, 35, 0, 4, 0,237, 4,
- 4, 0,238, 4,182, 0,110, 0,176, 0,239, 4,177, 0,240, 4,178, 0,241, 4,179, 0,242, 4, 4, 0, 12, 3, 4, 0,120, 0,
- 4, 0, 46, 4, 7, 0,243, 4, 4, 0,244, 4, 4, 0,245, 4, 4, 0,246, 4, 4, 0,247, 4, 2, 0, 17, 0, 2, 0,248, 4,
- 7, 0,249, 4, 7, 0,250, 4, 7, 0,251, 4, 7, 0,252, 4, 7, 0,253, 4, 2, 0,254, 4, 2, 0,255, 4, 2, 0, 0, 5,
- 2, 0, 1, 5, 2, 0,240, 0, 2, 0, 2, 5, 4, 0, 3, 5, 2, 0, 4, 5, 2, 0, 5, 5, 2, 0, 88, 1, 2, 0,104, 0,
- 2, 0, 6, 5, 2, 0, 7, 5, 2, 0, 8, 5, 2, 0, 9, 5, 2, 0, 10, 5, 2, 0, 11, 5, 2, 0, 12, 5, 2, 0, 13, 5,
- 2, 0, 14, 5, 2, 0, 89, 1, 2, 0, 15, 5, 2, 0, 16, 5, 2, 0, 17, 5, 2, 0, 18, 5, 4, 0, 19, 5, 4, 0, 66, 1,
- 4, 0, 20, 5, 2, 0, 21, 5, 2, 0, 22, 5, 2, 0, 23, 5, 2, 0,245, 1, 2, 0, 24, 5, 2, 0, 25, 5, 2, 0, 26, 5,
- 2, 0, 27, 5, 16, 0, 28, 5, 16, 0, 29, 5, 15, 0, 30, 5, 12, 0, 31, 5, 2, 0, 32, 5, 2, 0, 33, 5, 7, 0, 34, 5,
- 7, 0, 35, 5, 7, 0, 36, 5, 7, 0, 37, 5, 4, 0, 38, 5, 7, 0, 39, 5, 7, 0, 40, 5, 7, 0, 41, 5, 7, 0, 42, 5,
- 2, 0, 43, 5, 2, 0, 44, 5, 2, 0, 45, 5, 2, 0, 46, 5, 2, 0, 47, 5, 2, 0, 48, 5, 7, 0, 49, 5, 7, 0, 50, 5,
- 7, 0, 51, 5, 0, 0, 52, 5, 0, 0, 53, 5, 4, 0, 54, 5, 2, 0, 55, 5, 2, 0,223, 1, 0, 0, 56, 5, 7, 0, 57, 5,
- 7, 0, 58, 5, 0, 0, 59, 5, 0, 0, 60, 5, 0, 0, 61, 5, 0, 0, 62, 5, 4, 0, 63, 5, 2, 0, 64, 5, 2, 0, 65, 5,
- 7, 0, 66, 5, 7, 0, 67, 5, 2, 0, 68, 5, 2, 0, 69, 5, 7, 0, 70, 5, 2, 0, 71, 5, 2, 0, 72, 5, 4, 0, 73, 5,
- 2, 0, 74, 5, 2, 0, 75, 5, 2, 0, 76, 5, 2, 0, 77, 5, 7, 0, 78, 5, 7, 0, 67, 0, 34, 0, 79, 5, 0, 0, 80, 5,
-183, 0, 9, 0,183, 0, 0, 0,183, 0, 1, 0, 0, 0, 18, 0, 2, 0, 81, 5, 2, 0, 82, 5, 2, 0, 83, 5, 2, 0, 87, 0,
- 7, 0, 84, 5, 7, 0, 67, 0,184, 0, 7, 0, 2, 0,203, 2, 2, 0, 66, 1, 2, 0, 67, 3, 2, 0, 85, 5, 7, 0, 86, 5,
- 7, 0, 67, 0, 34, 0, 87, 5,185, 0, 5, 0, 7, 0, 88, 5, 0, 0, 15, 0, 0, 0, 87, 0, 0, 0, 67, 0, 0, 0,223, 1,
-186, 0, 28, 0, 7, 0,134, 4, 7, 0,135, 4, 2, 0, 66, 1, 2, 0, 17, 0, 2, 0, 89, 5, 2, 0,181, 4, 2, 0,137, 4,
- 2, 0,138, 4, 2, 0,139, 4, 2, 0,140, 4, 2, 0,141, 4, 2, 0,142, 4,185, 0, 90, 5, 2, 0,254, 4, 2, 0,255, 4,
- 2, 0, 0, 5, 2, 0, 1, 5, 2, 0,240, 0, 2, 0, 2, 5, 2, 0, 91, 5, 2, 0, 92, 5,184, 0, 93, 5, 2, 0, 94, 5,
- 2, 0, 4, 5, 2, 0, 7, 5, 2, 0, 8, 5, 7, 0, 95, 5, 7, 0, 87, 0,187, 0, 6, 0,187, 0, 0, 0,187, 0, 1, 0,
- 4, 0,231, 3, 0, 0,244, 3, 4, 0, 17, 0, 24, 0, 96, 5,188, 0, 4, 0,189, 0, 97, 5, 9, 0, 98, 5, 0, 0, 99, 5,
- 4, 0, 88, 0,190, 0, 8, 0,188, 0,100, 5, 2, 0, 17, 0, 2, 0, 35, 0, 2, 0,101, 5, 2, 0,102, 5, 2, 0,103, 5,
- 4, 0, 87, 0, 9, 0,104, 5,191, 0, 6, 0, 2, 0,104, 0, 2, 0,237, 3, 2, 0,105, 5, 2, 0,197, 2, 4, 0, 17, 0,
- 7, 0,214, 2,192, 0, 14, 0, 2, 0, 17, 0, 2, 0,106, 5, 2, 0,107, 5, 2, 0,108, 5,191, 0,109, 5, 9, 0,104, 5,
- 7, 0,110, 5, 7, 0, 54, 0, 4, 0,111, 5, 4, 0,112, 5, 4, 0,113, 5, 4, 0,114, 5, 38, 0,116, 0, 24, 0,158, 0,
-193, 0, 4, 0,193, 0, 0, 0,193, 0, 1, 0, 0, 0,115, 5, 7, 0,116, 5,194, 0, 14, 0,188, 0,100, 5, 4, 0, 88, 0,
- 4, 0,117, 5, 7, 0,118, 5, 7, 0,119, 5, 7, 0,120, 5, 4, 0,121, 5, 4, 0,122, 5, 7, 0,123, 5, 7, 0,124, 5,
- 4, 0,125, 5, 7, 0,126, 5, 7, 0,127, 5, 4, 0, 35, 0,195, 0, 7, 0,188, 0,100, 5, 2, 0, 17, 0, 2, 0, 35, 0,
- 4, 0, 34, 0, 4, 0,128, 5, 79, 0,129, 5, 9, 0,104, 5,196, 0, 81, 0,195, 0,130, 5,195, 0,131, 5,194, 0, 87, 3,
- 7, 0,132, 5, 2, 0,133, 5, 2, 0,134, 5, 7, 0,135, 5, 7, 0,136, 5, 2, 0,237, 3, 2, 0,137, 5, 7, 0,138, 5,
- 7, 0,139, 5, 7, 0,140, 5, 2, 0,141, 5, 2, 0,111, 5, 2, 0,142, 5, 2, 0,143, 5, 2, 0,144, 5, 2, 0,145, 5,
- 7, 0,146, 5, 7, 0,147, 5, 7, 0,148, 5, 2, 0,149, 5, 2, 0,150, 5, 2, 0,151, 5, 2, 0,152, 5, 2, 0,153, 5,
- 2, 0,154, 5, 2, 0,155, 5, 2, 0,156, 5,190, 0,157, 5,192, 0,158, 5, 7, 0,159, 5, 7, 0,160, 5, 7, 0,161, 5,
- 2, 0,162, 5, 2, 0,163, 5, 0, 0,164, 5, 0, 0,165, 5, 0, 0,166, 5, 0, 0,167, 5, 0, 0,168, 5, 0, 0,169, 5,
- 2, 0,170, 5, 7, 0,171, 5, 7, 0,172, 5, 7, 0,173, 5, 7, 0,174, 5, 7, 0,175, 5, 7, 0,176, 5, 7, 0,177, 5,
- 7, 0,178, 5, 7, 0,179, 5, 7, 0,180, 5, 2, 0,181, 5, 0, 0,182, 5, 0, 0,183, 5, 0, 0,184, 5, 0, 0,185, 5,
- 24, 0,186, 5, 0, 0,187, 5, 0, 0,188, 5, 0, 0,189, 5, 0, 0,190, 5, 0, 0,191, 5, 0, 0,192, 5, 0, 0,193, 5,
- 0, 0,194, 5, 2, 0,195, 5, 2, 0,196, 5, 2, 0,197, 5, 2, 0,198, 5, 2, 0,199, 5, 0, 0,200, 5, 0, 0,181, 4,
- 4, 0,201, 5, 2, 0,202, 5, 2, 0, 87, 0, 4, 0,203, 5, 7, 0,204, 5, 7, 0,205, 5,197, 0, 8, 0, 4, 0,206, 5,
- 4, 0,207, 5, 4, 0,208, 5, 4, 0,209, 5, 4, 0,210, 5, 4, 0,211, 5, 4, 0, 51, 0, 4, 0,116, 2,198, 0, 4, 0,
- 7, 0,212, 5, 0, 0,213, 5, 0, 0,214, 5, 2, 0, 17, 0,199, 0, 4, 0, 7, 0,215, 5, 4, 0, 17, 0, 4, 0,216, 5,
- 4, 0, 54, 0, 38, 0, 42, 0, 19, 0, 29, 0, 31, 0, 72, 0, 24, 0, 96, 5,174, 0,217, 5, 38, 0,218, 5, 12, 0,219, 5,
-175, 0,220, 5, 24, 0,221, 5, 7, 0,222, 5, 7, 0,223, 5, 7, 0,224, 5, 7, 0,225, 5, 4, 0,120, 3, 4, 0,226, 5,
- 4, 0,227, 5, 2, 0, 17, 0, 2, 0, 60, 1, 52, 0, 55, 1,200, 0,228, 5,196, 0,229, 5,201, 0,230, 5,182, 0,176, 0,
-180, 0,231, 5, 12, 0, 98, 0, 12, 0,232, 5, 9, 0,233, 5, 9, 0,234, 5, 9, 0,235, 5, 9, 0,236, 5,202, 0,237, 5,
- 2, 0,238, 5, 2, 0,239, 5, 2, 0,241, 0, 2, 0,240, 5, 4, 0,241, 5, 4, 0,242, 5, 12, 0,243, 5,185, 0, 90, 5,
-186, 0,244, 5,198, 0,245, 5,157, 0,100, 3,199, 0,246, 5,203, 0, 11, 0,203, 0, 0, 0,203, 0, 1, 0, 39, 0,232, 0,
- 37, 0, 54, 1, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0,104, 0, 7, 0,247, 5, 2, 0,248, 5, 2, 0, 17, 0, 7, 0, 67, 0,
-204, 0, 38, 0, 7, 0,249, 5, 7, 0,250, 5, 7, 0,251, 5, 7, 0,252, 5, 7, 0,253, 5, 7, 0,254, 5, 7, 0,255, 5,
- 7, 0, 0, 6, 7, 0, 1, 6, 7, 0, 73, 1, 7, 0, 2, 6, 7, 0, 3, 6, 7, 0, 4, 6, 7, 0, 5, 6, 7, 0,165, 0,
- 2, 0, 6, 6, 2, 0, 7, 6, 4, 0, 35, 0, 2, 0, 8, 6, 2, 0, 9, 6, 2, 0, 10, 6, 2, 0,248, 5, 7, 0, 11, 6,
- 7, 0, 12, 6, 62, 0, 13, 6,157, 0,100, 3,204, 0, 14, 6,205, 0, 15, 6,206, 0, 16, 6,207, 0, 17, 6,208, 0, 18, 6,
-209, 0, 19, 6, 7, 0, 20, 6, 2, 0, 21, 6, 2, 0, 22, 6, 7, 0, 23, 6, 7, 0, 24, 6, 7, 0, 25, 6,210, 0, 55, 0,
-211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 7, 0, 1, 6, 7, 0, 73, 1,
- 7, 0, 87, 0, 4, 0, 30, 6, 2, 0, 10, 6, 2, 0,248, 5, 24, 0, 96, 5, 24, 0, 31, 6, 12, 0, 32, 6,203, 0, 33, 6,
-210, 0, 14, 6, 0, 0, 34, 6, 4, 0,120, 3, 4, 0,226, 5, 2, 0, 35, 6, 2, 0, 36, 6, 2, 0, 37, 6, 2, 0, 38, 6,
- 2, 0,223, 1, 2, 0, 17, 0, 2, 0, 15, 2, 2, 0, 39, 6, 7, 0,109, 0, 7, 0, 40, 6, 7, 0, 23, 6, 7, 0, 41, 6,
- 7, 0, 42, 6, 7, 0,165, 0, 7, 0,222, 5, 2, 0, 43, 6, 2, 0,245, 1, 2, 0, 44, 6, 2, 0, 45, 6, 2, 0, 46, 6,
- 2, 0, 47, 6, 2, 0, 48, 6, 2, 0, 49, 6, 2, 0, 50, 6, 2, 0, 7, 6, 12, 0, 51, 6, 12, 0, 52, 6, 12, 0, 53, 6,
- 2, 0, 54, 6, 2, 0,130, 2, 2, 0, 55, 6, 0, 0, 56, 6, 0, 0, 57, 6, 9, 0, 58, 6,157, 0,100, 3,212, 0, 24, 0,
- 16, 0, 34, 0, 16, 0, 61, 0, 15, 0, 59, 6, 15, 0, 60, 6, 15, 0, 61, 6, 7, 0, 62, 6, 7, 0, 63, 6, 7, 0, 64, 6,
- 7, 0, 65, 6, 2, 0, 66, 6, 2, 0, 67, 6, 2, 0, 68, 6, 2, 0, 69, 6, 2, 0, 70, 6, 2, 0, 17, 0, 2, 0, 71, 6,
- 2, 0, 72, 6, 2, 0, 73, 6, 2, 0, 74, 6, 2, 0, 75, 6, 2, 0, 38, 6, 7, 0, 76, 6, 4, 0, 77, 6, 4, 0, 78, 6,
-211, 0, 6, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,213, 0, 8, 0,
-211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 0, 0, 79, 6, 0, 0,175, 0,
-214, 0, 14, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6,
-215, 0, 81, 6, 12, 0, 82, 6, 2, 0, 66, 1, 2, 0, 83, 6, 4, 0, 17, 0, 7, 0, 84, 6, 4, 0, 38, 6,216, 0, 20, 0,
-211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,205, 0, 15, 6,212, 0, 80, 6,
- 2, 0, 85, 6, 2, 0, 86, 6, 2, 0, 87, 6, 2, 0, 88, 6, 2, 0, 71, 6, 2, 0, 89, 6, 0, 0, 17, 0, 0, 0,181, 4,
- 9, 0, 56, 2, 4, 0, 90, 6, 4, 0, 91, 6, 19, 0, 92, 6,217, 0, 18, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
- 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6, 7, 0, 80, 2, 7, 0, 81, 2, 2, 0, 85, 6, 2, 0, 93, 6,
- 2, 0, 94, 6, 2, 0, 95, 6, 4, 0, 17, 0, 7, 0, 96, 6, 4, 0,248, 5, 4, 0, 35, 0,157, 0,100, 3,218, 0, 17, 0,
- 0, 0, 97, 6, 0, 0, 98, 6, 0, 0, 99, 6, 0, 0,100, 6, 0, 0,101, 6, 0, 0,102, 6, 2, 0, 15, 0, 2, 0, 17, 0,
- 2, 0,103, 6, 2, 0,104, 6, 2, 0,166, 1, 2, 0,105, 6, 4, 0,106, 6, 4, 0,107, 6, 2, 0,108, 6, 2, 0, 35, 0,
- 0, 0,109, 6,219, 0, 16, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 4, 0,110, 6,218, 0,111, 6,
-220, 0,112, 6, 12, 0,113, 6, 12, 0,114, 6,221, 0,115, 6,209, 0,116, 6,222, 0,117, 6, 2, 0,118, 6, 2, 0,119, 6,
- 2, 0,120, 6, 2, 0, 67, 0,223, 0, 15, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,
- 2, 0, 29, 6,212, 0, 80, 6, 12, 0,121, 6,224, 0,122, 6, 0, 0,123, 6,225, 0,124, 6, 2, 0, 17, 0, 2, 0,125, 6,
- 2, 0,126, 6, 2, 0,127, 6,226, 0, 25, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 4, 0, 17, 0,
- 39, 0,222, 2, 37, 0, 54, 1, 55, 0,128, 6,227, 0,129, 6,228, 0,130, 6,157, 0,100, 3, 7, 0,131, 6, 7, 0, 80, 2,
- 7, 0, 81, 2, 7, 0, 96, 6, 7, 0,132, 6, 7, 0,133, 6, 2, 0,134, 6, 2, 0,135, 6, 2, 0,136, 6, 2, 0,137, 6,
- 0, 0,138, 6, 0, 0,139, 6, 0, 0,140, 6, 0, 0, 38, 6,229, 0, 11, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
- 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 2, 0, 83, 6, 2, 0, 17, 0, 4, 0, 35, 0,215, 0, 81, 6,212, 0, 80, 6,
-230, 0, 29, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 34, 0,141, 6,
- 4, 0,142, 6, 4, 0,143, 6, 2, 0, 88, 0, 2, 0,144, 6, 2, 0,145, 6, 0, 0,146, 6, 0, 0,147, 6, 4, 0,148, 6,
- 4, 0,149, 6, 4, 0,150, 6, 2, 0,151, 6, 2, 0,152, 6, 2, 0,153, 6, 2, 0,154, 6, 7, 0,155, 6, 15, 0,156, 6,
- 15, 0,157, 6, 4, 0,158, 6, 4, 0,159, 6, 0, 0,160, 6, 0, 0,161, 6, 9, 0,162, 6,231, 0, 10, 0, 19, 0, 29, 0,
- 9, 0,163, 6, 9, 0,164, 6, 9, 0,165, 6, 9, 0,166, 6, 9, 0,167, 6, 4, 0, 88, 0, 4, 0,168, 6, 0, 0,169, 6,
- 0, 0,170, 6,232, 0, 10, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,231, 0,171, 6,
- 2, 0, 88, 0, 2, 0,144, 6, 4, 0, 87, 0, 9, 0,172, 6,233, 0, 3, 0,233, 0, 0, 0,233, 0, 1, 0, 7, 0,173, 6,
-234, 0, 11, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,212, 0, 80, 6, 12, 0,174, 6,
- 4, 0,175, 6, 4, 0, 35, 0, 4, 0, 17, 0, 4, 0,176, 6,235, 0, 25, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
- 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6, 19, 0,177, 6, 19, 0, 78, 0, 2, 0, 17, 0, 2, 0,144, 6,
- 7, 0,178, 6, 9, 0,179, 6, 7, 0, 80, 2, 7, 0, 81, 2, 7, 0, 96, 6, 7, 0, 25, 6, 7, 0,180, 6, 7, 0,181, 6,
- 52, 0, 55, 1, 52, 0,182, 6, 4, 0,183, 6, 2, 0,184, 6, 2, 0, 35, 0,157, 0,100, 3,236, 0, 10, 0,211, 0, 0, 0,
-211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 2, 0, 17, 0, 2, 0,129, 3, 4, 0, 35, 0,
-157, 0,100, 3,237, 0, 42, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,
-212, 0, 80, 6,220, 0,112, 6, 0, 0,185, 6, 0, 0, 98, 6, 0, 0, 99, 6, 2, 0, 15, 0, 2, 0,186, 6, 2, 0, 17, 0,
- 2, 0,103, 6, 9, 0,179, 6, 4, 0,106, 6, 4, 0,187, 6, 4, 0,188, 6, 4, 0,107, 6, 15, 0,189, 6, 15, 0,190, 6,
- 7, 0,191, 6, 7, 0,192, 6, 7, 0,193, 6, 7, 0,178, 6, 2, 0,194, 6, 2, 0,231, 0, 2, 0,166, 1, 2, 0,105, 6,
- 2, 0, 35, 0, 2, 0, 87, 0, 2, 0,195, 6, 2, 0,196, 6, 9, 0,197, 6, 9, 0,198, 6, 9, 0,199, 6, 9, 0,200, 6,
- 9, 0,201, 6, 2, 0,202, 6, 0, 0,203, 6, 49, 0,204, 6,238, 0, 7, 0,238, 0, 0, 0,238, 0, 1, 0, 4, 0,205, 6,
- 4, 0, 21, 0, 0, 0, 81, 0, 4, 0,206, 6, 4, 0, 15, 0,239, 0, 14, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6,
- 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6, 4, 0,145, 6, 4, 0, 35, 0, 12, 0,207, 6, 12, 0,208, 6, 0, 0,209, 6,
- 0, 0,210, 6, 4, 0,211, 6, 4, 0,212, 6,240, 0, 6, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6,
- 4, 0, 35, 0, 0, 0,213, 6,241, 0, 15, 0,211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6,
-242, 0,214, 6,212, 0, 80, 6,243, 0,215, 6, 2, 0, 66, 1, 2, 0,216, 6, 2, 0, 80, 2, 2, 0, 81, 2, 2, 0, 17, 0,
- 2, 0,136, 6, 4, 0, 67, 0,244, 0, 7, 0,244, 0, 0, 0,244, 0, 1, 0, 0, 0,217, 6, 2, 0,218, 6, 2, 0,219, 6,
- 2, 0,220, 6, 2, 0, 35, 0,245, 0, 12, 0, 2, 0,219, 6, 2, 0,221, 6, 2, 0,222, 6, 0, 0,183, 2, 2, 0,223, 6,
- 2, 0,224, 6, 2, 0,225, 6, 2, 0,226, 6, 2, 0,227, 6, 2, 0, 71, 6, 7, 0,228, 6, 7, 0,229, 6,246, 0, 18, 0,
-246, 0, 0, 0,246, 0, 1, 0, 0, 0,244, 3,245, 0,230, 6,245, 0,231, 6,245, 0,232, 6,245, 0,233, 6, 7, 0,234, 6,
- 2, 0,235, 6, 2, 0,236, 6, 2, 0,237, 6, 2, 0,238, 6, 2, 0,239, 6, 2, 0,240, 6, 2, 0,241, 6, 2, 0,242, 6,
- 2, 0,243, 6, 2, 0,244, 6,247, 0, 10, 0, 0, 0,245, 6, 0, 0,246, 6, 0, 0,247, 6, 0, 0,248, 6, 0, 0,249, 6,
- 0, 0,250, 6, 2, 0,251, 6, 2, 0,252, 6, 2, 0,253, 6, 2, 0,254, 6,248, 0, 8, 0, 0, 0,255, 6, 0, 0, 0, 7,
- 0, 0, 1, 7, 0, 0, 2, 7, 0, 0, 3, 7, 0, 0, 4, 7, 7, 0,247, 5, 7, 0, 35, 0,249, 0, 18, 0,247, 0, 5, 7,
-247, 0, 6, 7,247, 0, 7, 7,247, 0, 8, 7,247, 0, 9, 7,247, 0, 10, 7,247, 0, 11, 7,247, 0, 12, 7,247, 0, 13, 7,
-247, 0, 14, 7,247, 0, 15, 7,247, 0, 16, 7,247, 0, 17, 7,247, 0, 18, 7,247, 0, 19, 7,247, 0, 20, 7,248, 0, 21, 7,
- 0, 0, 22, 7,250, 0, 96, 0, 0, 0, 23, 7, 0, 0, 24, 7, 0, 0,249, 6, 0, 0, 25, 7, 0, 0, 26, 7, 0, 0, 27, 7,
- 0, 0, 28, 7, 0, 0, 29, 7, 0, 0, 30, 7, 0, 0, 31, 7, 0, 0, 32, 7, 0, 0, 33, 7, 0, 0, 34, 7, 0, 0, 35, 7,
- 0, 0, 36, 7, 0, 0, 37, 7, 0, 0, 38, 7, 0, 0, 39, 7, 0, 0, 40, 7, 0, 0, 41, 7, 0, 0, 42, 7, 0, 0, 43, 7,
- 0, 0, 44, 7, 0, 0, 45, 7, 0, 0, 46, 7, 0, 0, 47, 7, 0, 0, 48, 7, 0, 0, 49, 7, 0, 0, 50, 7, 0, 0, 51, 7,
- 0, 0, 52, 7, 0, 0, 53, 7, 0, 0, 54, 7, 0, 0, 55, 7, 0, 0, 56, 7, 0, 0, 57, 7, 0, 0, 58, 7, 0, 0, 59, 7,
- 0, 0, 60, 7, 0, 0, 61, 7, 0, 0, 62, 7, 0, 0, 63, 7, 0, 0, 64, 7, 0, 0, 65, 7, 0, 0, 66, 7, 0, 0, 67, 7,
- 0, 0, 68, 7, 0, 0, 69, 7, 0, 0, 70, 7, 0, 0, 71, 7, 0, 0, 72, 7, 0, 0, 73, 7, 0, 0, 74, 7, 0, 0, 75, 7,
- 0, 0, 76, 7, 0, 0, 77, 7, 0, 0, 78, 7, 0, 0, 79, 7, 0, 0, 80, 7, 0, 0, 81, 7, 0, 0, 82, 7, 0, 0, 83, 7,
- 0, 0, 84, 7, 0, 0, 85, 7, 0, 0, 86, 7, 0, 0, 87, 7, 0, 0, 88, 7, 0, 0, 89, 7, 0, 0, 90, 7, 0, 0, 91, 7,
- 0, 0, 92, 7, 0, 0, 93, 7, 0, 0, 94, 7, 0, 0, 95, 7, 0, 0, 96, 7, 0, 0, 97, 7, 0, 0, 98, 7, 0, 0, 99, 7,
- 0, 0,100, 7, 0, 0,101, 7, 0, 0,102, 7, 0, 0,103, 7, 0, 0,104, 7, 0, 0,105, 7, 0, 0,106, 7, 0, 0,107, 7,
- 0, 0,108, 7, 0, 0,109, 7, 0, 0,110, 7, 0, 0,111, 7, 0, 0,112, 7, 0, 0,113, 7, 0, 0,114, 7, 0, 0,115, 7,
- 0, 0,116, 7, 0, 0,117, 7,251, 0, 5, 0, 0, 0,118, 7, 0, 0, 47, 7, 0, 0, 49, 7, 2, 0, 17, 0, 2, 0, 35, 0,
-252, 0, 25, 0,252, 0, 0, 0,252, 0, 1, 0, 0, 0, 18, 0,249, 0,119, 7,250, 0,120, 7,250, 0,121, 7,250, 0,122, 7,
-250, 0,123, 7,250, 0,124, 7,250, 0,125, 7,250, 0,126, 7,250, 0,127, 7,250, 0,128, 7,250, 0,129, 7,250, 0,130, 7,
-250, 0,131, 7,250, 0,132, 7,250, 0,133, 7,250, 0,134, 7,250, 0,135, 7,250, 0,136, 7,250, 0,137, 7,251, 0,138, 7,
- 4, 0,139, 7, 4, 0, 35, 0,253, 0, 3, 0,253, 0, 0, 0,253, 0, 1, 0, 0, 0,140, 7,254, 0, 5, 0, 4, 0, 17, 0,
- 4, 0, 35, 0, 7, 0,129, 2, 7, 0,141, 7, 7, 0, 30, 2,255, 0, 90, 0, 4, 0, 17, 0, 4, 0,142, 7, 4, 0,143, 7,
- 0, 0,144, 7, 0, 0,145, 7, 0, 0,146, 7, 0, 0,147, 7, 0, 0,148, 7, 0, 0,149, 7, 0, 0,150, 7, 0, 0,151, 7,
- 0, 0,152, 7, 0, 0,153, 7, 4, 0,154, 7, 2, 0,155, 7, 2, 0,156, 7, 2, 0,157, 7, 2, 0,158, 7, 4, 0,159, 7,
- 4, 0,160, 7, 4, 0,161, 7, 4, 0,162, 7, 2, 0,163, 7, 2, 0,164, 7, 4, 0,165, 7, 4, 0,166, 7, 4, 0,167, 7,
- 4, 0,168, 7, 4, 0,169, 7, 4, 0,207, 6, 4, 0,170, 7, 2, 0,171, 7, 2, 0,172, 7, 2, 0,173, 7, 2, 0,174, 7,
- 12, 0,175, 7, 12, 0,176, 7, 12, 0,177, 7, 12, 0,178, 7, 12, 0,179, 7, 0, 0,180, 7, 2, 0,181, 7, 2, 0,182, 7,
- 2, 0,183, 7, 2, 0,184, 7, 2, 0,185, 7, 2, 0,186, 7, 2, 0,187, 7, 2, 0,188, 7,254, 0,189, 7, 2, 0,190, 7,
- 2, 0,191, 7, 2, 0,192, 7, 2, 0,193, 7, 2, 0,194, 7, 2, 0,195, 7, 2, 0,196, 7, 2, 0,197, 7, 4, 0,198, 7,
- 4, 0,199, 7, 2, 0,200, 7, 2, 0,201, 7, 2, 0,202, 7, 2, 0,203, 7, 2, 0,204, 7, 2, 0,205, 7, 2, 0,206, 7,
- 2, 0,207, 7, 2, 0,208, 7, 2, 0,209, 7, 2, 0,210, 7, 2, 0,211, 7, 2, 0,212, 7, 2, 0,213, 7, 2, 0,214, 7,
- 2, 0,215, 7, 2, 0,216, 7, 2, 0,181, 4, 0, 0,217, 7, 0, 0,218, 7, 7, 0,219, 7, 2, 0,162, 5, 2, 0,163, 5,
- 2, 0,220, 7, 2, 0,221, 7, 7, 0,222, 7, 47, 0,223, 7, 7, 0,224, 7, 4, 0,223, 1, 0, 0,225, 7, 0, 1, 22, 0,
- 19, 0, 29, 0, 12, 0,226, 7, 12, 0,227, 7, 12, 0,228, 7, 12, 0, 26, 6, 38, 0,116, 0, 38, 0,229, 7, 2, 0,230, 7,
- 2, 0,231, 7, 2, 0,232, 7, 2, 0,233, 7, 2, 0,234, 7, 2, 0,235, 7, 2, 0,236, 7, 2, 0,237, 7, 2, 0,238, 7,
- 2, 0,239, 7, 2, 0,240, 7, 2, 0, 35, 0,209, 0,241, 7, 9, 0,242, 7, 2, 0,243, 7, 1, 1, 5, 0, 1, 1, 0, 0,
- 1, 1, 1, 0, 1, 1,244, 7, 13, 0,245, 7, 4, 0, 17, 0, 2, 1, 7, 0, 2, 1, 0, 0, 2, 1, 1, 0, 1, 1,246, 7,
- 1, 1,247, 7, 2, 0, 29, 5, 2, 0, 17, 0, 4, 0, 35, 0, 3, 1, 25, 0, 3, 1, 0, 0, 3, 1, 1, 0, 4, 1,248, 7,
- 5, 1,117, 6, 0, 0,249, 7, 0, 0,250, 7, 0, 0,251, 7, 2, 0,252, 7, 2, 0,253, 7, 2, 0,254, 7, 2, 0,255, 7,
- 2, 0, 0, 8, 2, 0, 35, 0, 2, 0, 17, 0, 2, 0, 1, 8, 2, 0, 2, 8, 2, 0, 3, 8, 4, 0, 4, 8, 3, 1, 5, 8,
- 9, 0, 6, 8, 4, 0, 7, 8, 4, 0, 8, 8, 4, 0, 9, 8, 4, 0, 10, 8, 0, 0, 11, 8,242, 0, 22, 0,242, 0, 0, 0,
-242, 0, 1, 0, 1, 1,246, 7, 1, 1,247, 7, 1, 1, 12, 8, 1, 1, 13, 8, 0, 1, 14, 8, 15, 0, 49, 0, 0, 0, 27, 6,
- 0, 0, 15, 8, 2, 0, 72, 6, 2, 0, 73, 6, 2, 0, 16, 8, 2, 0, 35, 0, 2, 0,234, 7, 2, 0,206, 6, 2, 0, 17, 0,
- 6, 1,248, 7, 12, 0, 17, 8, 12, 0, 26, 6, 12, 0, 18, 8, 12, 0, 19, 8, 7, 1, 24, 0, 7, 1, 0, 0, 7, 1, 1, 0,
-212, 0, 80, 6, 15, 0, 20, 8, 15, 0, 21, 8, 2, 0, 72, 6, 2, 0, 73, 6, 2, 0, 22, 8, 2, 0, 23, 8, 2, 0, 24, 8,
- 2, 0, 17, 0, 7, 0, 76, 2, 2, 0,254, 7, 2, 0,255, 7, 2, 0,233, 7, 2, 0, 25, 8, 2, 0,238, 7, 2, 0,181, 4,
- 8, 1,248, 7, 12, 0, 26, 8, 12, 0, 27, 8, 12, 0, 18, 8, 0, 0, 28, 8, 9, 0, 29, 8, 9, 1, 14, 0, 0, 0, 30, 8,
- 2, 0, 31, 8, 2, 0, 32, 8, 2, 0, 33, 8, 2, 0, 34, 8, 2, 0, 16, 5, 2, 0, 11, 5, 0, 1, 35, 8, 38, 0, 36, 8,
- 4, 0, 37, 8, 4, 0, 38, 8, 4, 0, 39, 8, 4, 0, 35, 0, 0, 0, 40, 8, 10, 1, 3, 0, 0, 0, 41, 8, 4, 0, 42, 8,
- 4, 0, 43, 8, 11, 1, 4, 0, 4, 0,142, 6, 4, 0, 44, 8, 4, 0,148, 6, 4, 0, 45, 8, 12, 1, 2, 0, 4, 0, 46, 8,
- 4, 0, 47, 8, 13, 1, 5, 0, 7, 0, 48, 8, 7, 0, 49, 8, 7, 0, 50, 8, 4, 0, 17, 0, 4, 0, 35, 0, 14, 1, 6, 0,
- 0, 0, 51, 8, 0, 0, 99, 6, 41, 0,129, 0, 2, 0,104, 0, 2, 0, 15, 5, 4, 0, 35, 0, 15, 1, 14, 0, 15, 1, 0, 0,
- 15, 1, 1, 0, 4, 0, 54, 0, 4, 0, 21, 0, 4, 0, 26, 0, 4, 0, 52, 8, 4, 0, 53, 8, 4, 0, 54, 8, 10, 1, 55, 8,
- 0, 0, 51, 8, 14, 1, 94, 3, 11, 1, 56, 8, 12, 1, 57, 8, 13, 1, 58, 8, 16, 1, 12, 0, 0, 0,247, 1, 9, 0,217, 0,
- 0, 0,218, 0, 4, 0,221, 0, 4, 0,229, 0, 9, 0,222, 0, 7, 0,224, 0, 7, 0,225, 0, 9, 0, 59, 8, 9, 0, 60, 8,
- 9, 0,226, 0, 9, 0,228, 0, 17, 1, 48, 0, 17, 1, 0, 0, 17, 1, 1, 0, 9, 0, 61, 8, 9, 0, 24, 0, 0, 0, 25, 0,
- 4, 0, 17, 0, 4, 0, 15, 0, 4, 0, 21, 0, 4, 0, 85, 0, 4, 0, 62, 8, 4, 0, 63, 8, 4, 0, 53, 8, 4, 0, 54, 8,
- 4, 0, 64, 8, 4, 0,240, 0, 4, 0, 65, 8, 4, 0, 66, 8, 7, 0, 67, 8, 7, 0, 35, 0, 7, 0, 68, 8, 7, 0, 69, 8,
- 4, 0,120, 0, 4, 0, 70, 8, 15, 1, 71, 8, 28, 0, 77, 0, 38, 0,116, 0, 24, 0, 72, 8, 41, 0,129, 0, 7, 0, 73, 8,
- 7, 0, 74, 8, 16, 1, 56, 1, 17, 1, 75, 8, 17, 1, 76, 8, 17, 1, 77, 8, 12, 0, 78, 8,243, 0,215, 6, 9, 0, 79, 8,
- 7, 0,254, 3, 7, 0, 80, 8, 7, 0, 81, 8, 4, 0, 82, 8, 4, 0, 83, 8, 7, 0, 84, 8, 9, 0, 85, 8, 4, 0, 86, 8,
- 4, 0, 87, 8, 4, 0, 88, 8, 7, 0, 89, 8, 18, 1, 4, 0, 18, 1, 0, 0, 18, 1, 1, 0, 12, 0, 90, 8, 17, 1, 91, 8,
-200, 0, 11, 0, 12, 0, 92, 8, 12, 0, 78, 8, 12, 0, 93, 8, 17, 1, 94, 8, 0, 0, 95, 8, 0, 0, 96, 8, 4, 0, 97, 8,
- 4, 0, 98, 8, 4, 0, 99, 8, 4, 0, 35, 0, 16, 0,100, 8, 19, 1, 4, 0, 7, 0,101, 8, 7, 0, 67, 3, 2, 0,102, 8,
- 2, 0,103, 8, 20, 1, 6, 0, 7, 0,104, 8, 7, 0,105, 8, 7, 0,106, 8, 7, 0,107, 8, 4, 0,108, 8, 4, 0,109, 8,
- 21, 1, 13, 0, 7, 0,110, 8, 7, 0,111, 8, 7, 0,112, 8, 7, 0,113, 8, 7, 0,114, 8, 7, 0,115, 8, 7, 0,116, 8,
- 7, 0,117, 8, 7, 0,118, 8, 7, 0,119, 8, 4, 0,228, 2, 4, 0,120, 8, 4, 0,121, 8, 22, 1, 2, 0, 7, 0, 88, 5,
- 7, 0, 35, 0, 23, 1, 5, 0, 7, 0,122, 8, 7, 0,123, 8, 4, 0, 88, 0, 4, 0,184, 2, 4, 0,124, 8, 24, 1, 6, 0,
- 24, 1, 0, 0, 24, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0, 54, 0, 25, 1, 8, 0, 25, 1, 0, 0,
- 25, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0, 54, 0, 7, 0, 21, 0, 7, 0,120, 0, 26, 1, 45, 0,
- 26, 1, 0, 0, 26, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0,236, 0, 2, 0, 40, 4, 2, 0,126, 8,
- 7, 0,127, 8, 7, 0, 86, 0, 7, 0,241, 2, 4, 0,128, 8, 4, 0, 79, 0, 4, 0,186, 2, 7, 0,129, 8, 7, 0,130, 8,
- 7, 0,131, 8, 7, 0,132, 8, 7, 0,133, 8, 7, 0,134, 8, 7, 0,238, 2, 7, 0, 53, 1, 7, 0,135, 8, 7, 0,136, 8,
- 7, 0, 35, 0, 7, 0,137, 8, 7, 0,138, 8, 7, 0,139, 8, 2, 0,140, 8, 2, 0,141, 8, 2, 0,142, 8, 2, 0,143, 8,
- 2, 0,144, 8, 2, 0,145, 8, 2, 0,146, 8, 2, 0,147, 8, 2, 0, 15, 2, 2, 0,148, 8, 2, 0, 12, 2, 2, 0,149, 8,
- 0, 0,150, 8, 0, 0,151, 8, 7, 0,234, 0, 27, 1,152, 8, 58, 0,226, 1, 28, 1, 16, 0, 28, 1, 0, 0, 28, 1, 1, 0,
- 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,125, 8, 2, 0,236, 0, 7, 0,233, 2, 7, 0,234, 2, 7, 0,235, 2, 7, 0, 65, 2,
- 7, 0,236, 2, 7, 0,237, 2, 7, 0,153, 8, 7, 0,238, 2, 7, 0,240, 2, 7, 0,241, 2,225, 0, 5, 0, 2, 0, 15, 0,
- 2, 0,154, 8, 2, 0, 17, 0, 2, 0,155, 8, 19, 0,177, 6,224, 0, 3, 0, 4, 0, 66, 0, 4, 0,156, 8,225, 0, 2, 0,
- 29, 1, 7, 0, 29, 1, 0, 0, 29, 1, 1, 0, 0, 0, 18, 0, 2, 0, 15, 0, 2, 0, 17, 0, 4, 0, 20, 0, 9, 0,157, 8,
- 30, 1, 5, 0, 0, 0, 18, 0, 7, 0, 73, 1, 7, 0,158, 8, 4, 0,159, 8, 4, 0, 35, 0, 31, 1, 4, 0, 2, 0, 15, 0,
- 2, 0, 17, 0, 2, 0, 87, 0, 2, 0, 67, 0, 32, 1, 4, 0, 0, 0, 18, 0, 57, 0,160, 8, 7, 0, 73, 1, 7, 0, 35, 0,
- 33, 1, 6, 0, 2, 0,161, 8, 2, 0,162, 8, 2, 0, 15, 0, 2, 0,163, 8, 0, 0,164, 8, 0, 0,165, 8, 34, 1, 5, 0,
- 4, 0, 15, 0, 4, 0, 35, 0, 0, 0, 18, 0, 0, 0,166, 8, 0, 0,167, 8, 35, 1, 3, 0, 4, 0, 15, 0, 4, 0, 35, 0,
- 0, 0, 18, 0, 36, 1, 4, 0, 2, 0,168, 8, 2, 0,169, 8, 2, 0, 17, 0, 2, 0, 35, 0, 37, 1, 6, 0, 0, 0, 18, 0,
- 0, 0,170, 8, 2, 0,171, 8, 2, 0,238, 2, 2, 0, 66, 1, 2, 0, 67, 0, 38, 1, 5, 0, 0, 0, 18, 0, 7, 0, 67, 3,
- 7, 0,131, 4, 2, 0, 17, 0, 2, 0,198, 2, 39, 1, 3, 0, 0, 0, 18, 0, 4, 0,186, 2, 4, 0,168, 8, 40, 1, 7, 0,
- 0, 0, 18, 0, 7, 0,131, 4, 0, 0,172, 8, 0, 0,173, 8, 2, 0, 66, 1, 2, 0, 87, 0, 4, 0,174, 8, 41, 1, 4, 0,
- 0, 0,175, 8, 0, 0,176, 8, 4, 0, 15, 0, 7, 0,202, 2, 42, 1, 3, 0, 24, 0,177, 8, 0, 0,178, 8, 0, 0,179, 8,
- 43, 1, 18, 0, 43, 1, 0, 0, 43, 1, 1, 0, 2, 0, 15, 0, 2, 0,180, 8, 2, 0, 17, 0, 2, 0,181, 8, 2, 0,182, 8,
- 2, 0,183, 8, 2, 0, 87, 0, 2, 0, 67, 0, 0, 0, 18, 0, 9, 0, 2, 0, 44, 1,184, 8, 24, 0, 42, 0, 2, 0,105, 5,
- 2, 0, 80, 8, 2, 0,185, 8, 2, 0, 35, 0, 45, 1, 11, 0, 0, 0, 18, 0, 0, 0, 15, 0, 0, 0,186, 8, 2, 0, 17, 0,
- 2, 0,198, 2, 2, 0,187, 8, 4, 0,188, 8, 4, 0,189, 8, 4, 0,190, 8, 4, 0,191, 8, 4, 0,192, 8, 46, 1, 1, 0,
- 0, 0,193, 8, 47, 1, 4, 0, 34, 0,141, 6, 0, 0,140, 7, 4, 0, 66, 1, 4, 0, 17, 0, 44, 1, 18, 0, 44, 1, 0, 0,
- 44, 1, 1, 0, 44, 1,194, 8, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,195, 8, 2, 0,183, 8, 2, 0,180, 8, 2, 0,196, 8,
- 2, 0, 67, 0, 2, 0,223, 1, 0, 0, 18, 0, 9, 0, 2, 0, 48, 1,184, 8, 43, 1,197, 8, 2, 0, 13, 0, 2, 0,198, 8,
- 4, 0,199, 8, 49, 1, 3, 0, 4, 0,212, 2, 4, 0, 35, 0, 24, 0, 42, 0, 50, 1, 12, 0,155, 0,200, 8, 2, 0, 15, 0,
- 2, 0, 17, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0, 18, 0, 0, 0,201, 8, 2, 0,202, 8, 2, 0,203, 8, 2, 0,204, 8,
- 2, 0,205, 8, 7, 0,206, 8, 51, 1, 8, 0, 7, 0,207, 8, 7, 0,208, 8, 7, 0,209, 8, 7, 0,210, 8, 7, 0,211, 8,
- 7, 0,212, 8, 7, 0,213, 8, 7, 0,214, 8, 52, 1, 13, 0, 2, 0, 17, 0, 2, 0,216, 6, 4, 0, 87, 0, 4, 0, 67, 0,
- 2, 0,215, 8, 7, 0,254, 3, 7, 0,216, 8,243, 0,215, 6, 51, 1,217, 8, 2, 0, 15, 0, 2, 0,245, 1, 2, 0,241, 5,
- 2, 0,218, 8, 53, 1, 11, 0, 4, 0,212, 2, 2, 0, 15, 0, 2, 0, 17, 0, 24, 0, 42, 0, 73, 0,219, 8, 0, 0, 18, 0,
- 7, 0,220, 8, 7, 0,221, 8, 7, 0,137, 3, 2, 0,222, 8, 2, 0,223, 8, 54, 1, 5, 0, 2, 0, 15, 0, 2, 0, 87, 0,
- 4, 0, 35, 0, 38, 0,116, 0, 24, 0, 96, 5, 55, 1, 5, 0, 4, 0, 35, 0, 4, 0, 15, 0, 0, 0, 18, 0, 0, 0,166, 8,
- 24, 0, 42, 0, 56, 1, 13, 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,180, 8, 2, 0,138, 3, 7, 0,224, 8, 7, 0,225, 8,
- 7, 0,181, 4, 7, 0,150, 3, 7, 0,109, 3, 7, 0,112, 3, 7, 0,226, 8, 7, 0,227, 8, 24, 0,228, 8, 57, 1, 10, 0,
- 2, 0, 17, 0, 2, 0, 15, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0, 18, 0, 0, 0,201, 8, 2, 0, 87, 0, 2, 0, 67, 0,
- 2, 0,223, 1, 2, 0,245, 1, 58, 1, 8, 0, 24, 0, 42, 0, 7, 0,235, 2, 7, 0,229, 8, 7, 0,230, 8, 7, 0, 35, 0,
- 2, 0, 87, 0, 2, 0,198, 2, 7, 0, 67, 0, 59, 1, 12, 0, 2, 0, 15, 0, 2, 0, 66, 1, 2, 0, 17, 0, 2, 0,238, 2,
- 2, 0,212, 2, 2, 0,231, 8, 4, 0, 35, 0, 7, 0,232, 8, 7, 0,233, 8, 7, 0,234, 8, 7, 0,235, 8, 0, 0,236, 8,
- 60, 1, 9, 0, 2, 0, 17, 0, 2, 0, 15, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0, 18, 0, 2, 0,181, 4, 2, 0, 61, 0,
- 2, 0,237, 8, 2, 0,238, 8, 61, 1, 7, 0, 4, 0,186, 2, 4, 0,239, 8, 4, 0,240, 8, 4, 0,241, 8, 7, 0,242, 8,
- 7, 0,243, 8, 0, 0,172, 8, 62, 1, 7, 0, 0, 0,244, 8, 24, 0,245, 8, 0, 0,178, 8, 2, 0,246, 8, 2, 0, 87, 0,
- 4, 0, 67, 0, 0, 0,179, 8, 63, 1, 6, 0, 2, 0, 17, 0, 2, 0, 15, 0, 4, 0,127, 8, 4, 0, 86, 0, 0, 0,247, 8,
- 0, 0,248, 8, 64, 1, 1, 0, 4, 0, 17, 0, 65, 1, 6, 0, 0, 0, 90, 0, 2, 0, 15, 0, 2, 0, 17, 0, 4, 0,249, 8,
- 7, 0,250, 8, 34, 0,141, 6, 66, 1, 4, 0, 0, 0,145, 2, 2, 0, 17, 0, 4, 0, 15, 0, 24, 0, 42, 0, 67, 1, 2, 0,
- 4, 0, 15, 0, 4, 0, 61, 6, 68, 1, 6, 0, 0, 0,175, 8, 0, 0,176, 8, 4, 0, 15, 0, 7, 0, 23, 2, 24, 0, 46, 3,
- 24, 0,251, 8, 48, 1, 10, 0, 48, 1, 0, 0, 48, 1, 1, 0, 48, 1,194, 8, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,180, 8,
- 2, 0,252, 8, 0, 0, 18, 0, 9, 0, 2, 0, 24, 0, 42, 0,243, 0, 16, 0, 19, 0, 29, 0, 0, 0, 32, 0, 35, 0,144, 0,
- 9, 0,217, 0, 35, 0,253, 8, 28, 0, 77, 0, 7, 0,254, 3, 7, 0,254, 8, 7, 0,216, 8, 7, 0,207, 8, 7, 0,208, 8,
- 7, 0,255, 8, 4, 0, 88, 0, 4, 0, 35, 0, 9, 0, 0, 9, 9, 0, 1, 9, 69, 1, 6, 0, 69, 1, 0, 0, 69, 1, 1, 0,
- 24, 0, 42, 0, 9, 0, 2, 9, 2, 0,241, 0, 0, 0,183, 2, 58, 0, 4, 0, 19, 0, 29, 0, 12, 0, 3, 9, 4, 0,125, 0,
- 7, 0, 4, 9, 70, 1, 27, 0, 70, 1, 0, 0, 70, 1, 1, 0, 18, 0, 5, 9, 70, 1, 36, 0, 12, 0, 6, 9, 0, 0, 18, 0,
- 7, 0, 7, 9, 7, 0, 8, 9, 7, 0, 9, 9, 7, 0, 10, 9, 4, 0, 17, 0, 7, 0, 11, 9, 7, 0, 12, 9, 7, 0, 13, 9,
- 7, 0, 73, 1, 7, 0, 23, 2, 7, 0, 14, 9, 7, 0,184, 2, 7, 0, 15, 9, 7, 0, 16, 9, 7, 0, 17, 9, 7, 0, 18, 9,
- 7, 0, 19, 9, 7, 0,166, 0, 4, 0,125, 0, 2, 0,142, 5, 2, 0,181, 4, 71, 1, 25, 0, 19, 0, 29, 0, 31, 0, 72, 0,
- 12, 0, 20, 9, 12, 0, 21, 9, 12, 0, 22, 9, 70, 1, 23, 9, 9, 0, 24, 9, 9, 0, 25, 9, 4, 0, 17, 0, 4, 0, 35, 6,
- 2, 0,242, 2, 2, 0, 90, 6, 4, 0, 26, 9, 4, 0,125, 0, 4, 0, 27, 9, 2, 0, 28, 9, 2, 0, 29, 9, 2, 0, 30, 9,
- 2, 0, 31, 9, 4, 0, 32, 9, 4, 0, 33, 9, 4, 0, 34, 9, 4, 0, 35, 9, 4, 0, 36, 9, 4, 0, 37, 9, 72, 1, 2, 0,
- 7, 0,143, 2, 4, 0, 17, 0,159, 0, 5, 0, 72, 1, 38, 9, 4, 0,184, 2, 4, 0, 39, 9, 4, 0, 40, 9, 4, 0, 17, 0,
-158, 0, 16, 0, 4, 0, 41, 9, 4, 0, 42, 9, 4, 0, 43, 9, 4, 0, 44, 9, 2, 0, 45, 9, 2, 0, 46, 9, 2, 0, 47, 9,
- 2, 0,241, 0, 2, 0, 48, 9, 2, 0, 49, 9, 2, 0, 50, 9, 2, 0, 51, 9, 4, 0, 52, 9, 4, 0, 53, 9, 4, 0, 54, 9,
- 4, 0, 55, 9, 73, 1, 41, 0, 73, 1, 0, 0, 73, 1, 1, 0, 18, 0, 5, 9, 12, 0,164, 3, 0, 0, 18, 0, 2, 0, 17, 0,
- 2, 0, 56, 9, 2, 0, 57, 9, 2, 0, 58, 9, 2, 0,123, 3, 2, 0, 59, 9, 4, 0, 63, 2, 4, 0, 34, 9, 4, 0, 35, 9,
- 70, 1, 60, 9, 73, 1, 36, 0, 73, 1, 61, 9, 12, 0, 62, 9,159, 0,102, 3, 24, 0, 63, 9, 73, 1, 64, 9, 7, 0, 61, 1,
- 7, 0,166, 0, 7, 0, 65, 9, 7, 0, 2, 2, 7, 0,114, 3, 7, 0,116, 3, 2, 0,146, 3, 2, 0, 35, 0, 7, 0, 66, 9,
- 7, 0, 67, 9, 7, 0,119, 3, 7, 0, 68, 9, 7, 0, 69, 9, 7, 0, 70, 9, 7, 0, 71, 9, 7, 0, 72, 9, 7, 0, 73, 9,
- 7, 0, 74, 9, 7, 0, 75, 9, 7, 0, 56, 2,156, 0, 14, 0, 12, 0, 76, 9, 68, 0, 77, 9, 2, 0, 17, 0, 2, 0, 78, 9,
- 7, 0, 92, 2, 7, 0, 79, 9, 7, 0, 80, 9, 12, 0, 81, 9, 4, 0, 82, 9, 4, 0, 83, 9, 9, 0, 84, 9, 9, 0, 85, 9,
-158, 0,101, 3, 0, 0, 86, 9, 74, 1, 1, 0, 4, 0, 83, 9, 75, 1, 12, 0, 4, 0, 83, 9, 7, 0,192, 8, 2, 0, 87, 9,
- 2, 0, 88, 9, 7, 0, 89, 9, 7, 0, 90, 9, 2, 0, 91, 9, 2, 0, 17, 0, 7, 0, 92, 9, 7, 0, 93, 9, 7, 0, 94, 9,
- 7, 0, 95, 9, 76, 1, 7, 0, 76, 1, 0, 0, 76, 1, 1, 0, 12, 0, 96, 9, 4, 0, 17, 0, 4, 0, 97, 9, 0, 0,244, 3,
-251, 0, 98, 9,155, 0, 7, 0, 19, 0, 29, 0, 12, 0, 99, 9, 12, 0, 76, 9, 12, 0,100, 9, 12, 0, 98, 0, 4, 0, 17, 0,
- 4, 0,101, 9,215, 0, 5, 0, 19, 0,102, 9, 12, 0, 76, 9, 58, 0,103, 9, 4, 0,104, 9, 4, 0, 17, 0, 77, 1, 13, 0,
-211, 0, 0, 0,211, 0, 1, 0, 12, 0, 26, 6, 4, 0, 27, 6, 7, 0, 28, 6, 2, 0, 29, 6,212, 0, 80, 6,155, 0, 97, 3,
-215, 0,105, 9, 0, 0, 66, 1, 0, 0, 83, 6, 2, 0, 17, 0, 7, 0,106, 9, 78, 1, 8, 0, 78, 1, 0, 0, 78, 1, 1, 0,
- 76, 1,107, 9, 28, 0, 77, 0, 12, 0,103, 3, 4, 0, 17, 0, 0, 0, 18, 0, 4, 0,231, 7, 79, 1, 5, 0, 79, 1, 0, 0,
- 79, 1, 1, 0, 28, 0, 77, 0, 2, 0, 17, 0, 0, 0,108, 9, 80, 1, 14, 0, 80, 1, 0, 0, 80, 1, 1, 0, 9, 0, 2, 0,
- 2, 0, 15, 0, 2, 0, 17, 0, 0, 0,109, 9, 0, 0,110, 9, 0, 0,108, 9, 7, 0,111, 9, 7, 0,112, 9, 4, 0, 35, 0,
- 28, 0, 77, 0, 7, 0,113, 9, 7, 0,114, 9, 81, 1, 9, 0, 81, 1, 0, 0, 81, 1, 1, 0, 24, 0,115, 9, 0, 0,245, 2,
- 7, 0,116, 9, 2, 0,117, 9, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,118, 9, 82, 1, 7, 0, 34, 0,141, 6, 18, 0, 5, 9,
- 4, 0, 17, 0, 4, 0,119, 9, 12, 0,120, 9, 24, 0,115, 9, 0, 0,245, 2, 83, 1, 15, 0, 24, 0,115, 9, 2, 0,121, 9,
- 2, 0, 17, 0, 2, 0,122, 9, 2, 0,123, 9, 0, 0,245, 2, 24, 0,124, 9, 0, 0,125, 9, 7, 0,126, 9, 7, 0, 23, 2,
- 7, 0,127, 9, 7, 0,128, 9, 2, 0, 15, 0, 2, 0, 66, 1, 7, 0, 73, 1, 84, 1, 6, 0, 24, 0,115, 9, 7, 0, 38, 9,
- 2, 0,129, 9, 2, 0,130, 9, 2, 0, 17, 0, 2, 0,131, 9, 85, 1, 6, 0, 24, 0,115, 9, 4, 0,132, 9, 4, 0,133, 9,
- 4, 0, 88, 0, 4, 0, 35, 0, 0, 0,245, 2, 86, 1, 4, 0, 24, 0,115, 9, 4, 0, 17, 0, 4, 0,132, 9, 0, 0,245, 2,
- 87, 1, 4, 0, 24, 0,115, 9, 4, 0, 17, 0, 4, 0,132, 9, 0, 0,245, 2, 88, 1, 4, 0, 24, 0,115, 9, 4, 0, 17, 0,
- 4, 0,132, 9, 0, 0,245, 2, 89, 1, 2, 0, 4, 0, 17, 0, 7, 0,254, 3, 90, 1, 2, 0, 24, 0,115, 9, 0, 0,245, 2,
- 91, 1, 10, 0, 24, 0,115, 9, 4, 0,134, 9, 7, 0,119, 0, 4, 0, 17, 0, 2, 0,139, 6, 2, 0,135, 9, 2, 0, 87, 0,
- 2, 0, 67, 0, 7, 0,136, 9, 0, 0,245, 2, 92, 1, 10, 0, 24, 0,115, 9, 2, 0, 15, 0, 2, 0, 48, 4, 4, 0, 85, 0,
- 4, 0, 86, 0, 7, 0,229, 8, 7, 0,230, 8, 4, 0, 35, 0,155, 0,200, 8, 0, 0,245, 2, 93, 1, 4, 0, 24, 0,115, 9,
- 4, 0,124, 3, 4, 0,137, 9, 0, 0,245, 2, 94, 1, 4, 0, 24, 0,115, 9, 4, 0,124, 3, 4, 0, 35, 0, 0, 0,245, 2,
- 95, 1, 6, 0, 24, 0,115, 9, 7, 0,119, 0, 7, 0, 58, 3, 4, 0,138, 9, 2, 0,124, 3, 2, 0,125, 3, 96, 1, 6, 0,
- 24, 0,115, 9, 4, 0,139, 9, 4, 0,140, 9, 7, 0,141, 9, 7, 0,142, 9, 0, 0,245, 2, 97, 1, 16, 0, 24, 0,115, 9,
- 24, 0, 61, 9, 4, 0, 15, 0, 7, 0,143, 9, 7, 0,144, 9, 7, 0,145, 9, 7, 0,146, 9, 7, 0,147, 9, 7, 0,148, 9,
- 7, 0,149, 9, 7, 0,150, 9, 7, 0,151, 9, 2, 0, 17, 0, 2, 0, 35, 0, 2, 0, 87, 0, 2, 0, 67, 0, 98, 1, 3, 0,
- 24, 0,115, 9, 4, 0, 17, 0, 4, 0, 15, 2, 99, 1, 5, 0, 24, 0,115, 9, 4, 0, 17, 0, 4, 0, 35, 0, 7, 0,152, 9,
- 0, 0,245, 2,100, 1, 10, 0, 24, 0,115, 9, 0, 0,245, 2, 2, 0,153, 9, 2, 0,154, 9, 0, 0,155, 9, 0, 0,156, 9,
- 7, 0,157, 9, 7, 0,158, 9, 7, 0,159, 9, 7, 0,160, 9,101, 1, 5, 0, 24, 0,115, 9, 0, 0,245, 2, 7, 0,192, 2,
- 2, 0,161, 9, 2, 0, 17, 0,102, 1, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0,162, 9,
- 7, 0,163, 9, 2, 0, 17, 0, 2, 0, 15, 2,103, 1, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0,
- 7, 0,162, 9, 7, 0,163, 9, 2, 0, 17, 0, 2, 0, 15, 2,104, 1, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0,
- 7, 0, 10, 0, 7, 0,162, 9, 7, 0,163, 9, 2, 0, 17, 0, 2, 0, 15, 2,105, 1, 7, 0, 24, 0,115, 9, 0, 0,245, 2,
- 7, 0, 73, 1, 7, 0, 82, 1, 2, 0, 17, 0, 2, 0, 66, 1, 4, 0, 35, 0,106, 1, 5, 0, 24, 0, 46, 3, 7, 0, 73, 1,
- 2, 0, 50, 3, 0, 0, 52, 3, 0, 0,164, 9,107, 1, 10, 0,107, 1, 0, 0,107, 1, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0,
- 0, 0,165, 9, 7, 0, 16, 1, 7, 0, 17, 1, 2, 0, 96, 9, 2, 0,166, 9, 24, 0, 42, 0,108, 1, 22, 0,108, 1, 0, 0,
-108, 1, 1, 0, 2, 0, 17, 0, 2, 0, 66, 1, 2, 0,167, 9, 2, 0,168, 9, 28, 0, 77, 0,155, 0,200, 8, 24, 0,158, 0,
- 7, 0, 85, 0, 7, 0, 86, 0, 7, 0,169, 9, 7, 0,170, 9, 7, 0,171, 9, 7, 0,172, 9, 7, 0,231, 2, 7, 0,173, 9,
- 7, 0,202, 8, 7, 0,174, 9, 0, 0,175, 9, 0, 0,176, 9, 12, 0,105, 3,109, 1, 8, 0, 7, 0, 30, 2, 7, 0,229, 8,
- 7, 0,230, 8, 9, 0, 2, 0, 2, 0,177, 9, 2, 0,178, 9, 2, 0,179, 9, 2, 0,180, 9,110, 1, 18, 0,110, 1, 0, 0,
-110, 1, 1, 0,110, 1,181, 9, 0, 0, 18, 0,109, 1,182, 9, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0,183, 9, 2, 0,184, 9,
- 2, 0,185, 9, 2, 0,186, 9, 4, 0, 87, 0, 7, 0,187, 9, 7, 0,188, 9, 4, 0,189, 9, 4, 0,190, 9,110, 1,191, 9,
-111, 1,192, 9,112, 1, 33, 0,112, 1, 0, 0,112, 1, 1, 0,112, 1,193, 9, 0, 0, 18, 0, 2, 0, 15, 0, 2, 0, 17, 0,
- 2, 0, 52, 8, 2, 0, 80, 8, 2, 0,194, 9, 2, 0,144, 6, 2, 0,184, 9, 2, 0,154, 8, 12, 0,195, 8, 12, 0,195, 9,
- 19, 0,177, 6, 9, 0,196, 9, 7, 0,187, 9, 7, 0,188, 9, 7, 0, 65, 2, 7, 0,197, 9, 2, 0,198, 9, 2, 0,199, 9,
- 7, 0,200, 9, 7, 0,201, 9, 2, 0,202, 9, 2, 0,203, 9, 9, 0,204, 9, 16, 0,205, 9, 16, 0,206, 9, 16, 0,207, 9,
-113, 1,145, 0,114, 1,208, 9,115, 1,209, 9,111, 1, 8, 0,111, 1, 0, 0,111, 1, 1, 0,112, 1,210, 9,112, 1,211, 9,
-110, 1,212, 9,110, 1,191, 9, 4, 0, 17, 0, 4, 0, 35, 0, 52, 0, 22, 0, 19, 0, 29, 0, 31, 0, 72, 0,157, 0,100, 3,
- 12, 0,213, 9, 12, 0,214, 9,109, 1,215, 9, 12, 0,216, 9, 4, 0, 15, 0, 4, 0,217, 9, 4, 0,218, 9, 4, 0,219, 9,
- 4, 0, 17, 0, 4, 0, 35, 0, 12, 0,220, 9,115, 1,221, 9, 4, 0,222, 9, 9, 0,223, 9, 9, 0,224, 9, 4, 0,225, 9,
- 9, 0,226, 9, 9, 0,227, 9, 9, 0,228, 9,116, 1, 6, 0, 4, 0,118, 0, 4, 0,120, 0, 4, 0,154, 8, 0, 0,229, 9,
- 0, 0,230, 9, 2, 0, 35, 0,117, 1, 16, 0, 2, 0,254, 7, 2, 0,255, 7, 2, 0,231, 9, 2, 0,232, 9, 2, 0,233, 9,
- 2, 0, 65, 0, 7, 0,230, 2, 7, 0,234, 9, 7, 0,235, 9, 2, 0, 88, 1, 0, 0,236, 9, 0, 0,237, 9, 2, 0,238, 9,
- 2, 0, 35, 0, 4, 0,239, 9, 4, 0,240, 9,118, 1, 9, 0, 7, 0,241, 9, 7, 0,242, 9, 7, 0,255, 8, 7, 0, 67, 3,
- 7, 0,243, 9, 7, 0, 96, 6, 2, 0, 65, 3, 0, 0,244, 9, 0, 0, 35, 0,119, 1, 4, 0, 7, 0,245, 9, 7, 0,246, 9,
- 2, 0, 65, 3, 2, 0, 35, 0,120, 1, 3, 0, 7, 0,247, 9, 7, 0, 67, 8, 7, 0, 13, 0,121, 1, 7, 0, 0, 0,247, 1,
- 2, 0, 13, 5, 2, 0, 14, 5, 2, 0, 15, 5, 2, 0,203, 4, 4, 0,120, 0, 4, 0, 46, 4,122, 1, 9, 0, 7, 0,248, 9,
- 7, 0,249, 9, 7, 0,250, 9, 7, 0, 76, 2, 7, 0,251, 9, 7, 0,252, 9, 7, 0,253, 9, 2, 0,254, 9, 2, 0,255, 9,
-123, 1, 8, 0, 2, 0, 0, 10, 2, 0, 1, 10, 2, 0, 2, 10, 2, 0, 3, 10, 7, 0, 4, 10, 7, 0, 5, 10, 7, 0, 6, 10,
- 7, 0, 7, 10,124, 1, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0,125, 1, 2, 0, 0, 0,160, 0, 0, 0, 8, 10,126, 1, 1, 0,
- 0, 0, 18, 0,127, 1, 10, 0, 0, 0, 9, 10, 0, 0, 10, 10, 0, 0, 89, 6, 0, 0, 11, 10, 2, 0,231, 9, 2, 0, 12, 10,
- 7, 0, 13, 10, 7, 0, 14, 10, 7, 0, 15, 10, 7, 0,173, 9,128, 1, 2, 0, 9, 0, 16, 10, 9, 0, 17, 10,129, 1, 11, 0,
- 0, 0, 15, 5, 0, 0, 15, 0, 0, 0, 65, 3, 0, 0, 67, 3, 0, 0, 18, 10, 0, 0,104, 0, 0, 0,145, 2, 7, 0, 19, 10,
- 7, 0, 20, 10, 7, 0, 21, 10, 7, 0, 22, 10,130, 1, 8, 0, 7, 0,161, 8, 7, 0,119, 0, 7, 0,237, 9, 7, 0,149, 2,
- 7, 0, 23, 10, 7, 0,230, 0, 7, 0, 24, 10, 4, 0, 15, 0,131, 1, 4, 0, 2, 0, 25, 10, 2, 0, 26, 10, 2, 0, 27, 10,
- 2, 0, 35, 0,132, 1, 8, 0, 7, 0, 28, 10, 7, 0,192, 2, 7, 0, 29, 10, 7, 0, 48, 8, 7, 0, 49, 8, 7, 0, 50, 8,
- 7, 0, 30, 10, 7, 0, 31, 10,133, 1, 6, 0, 2, 0, 32, 10, 2, 0, 33, 10, 7, 0, 34, 10, 7, 0, 35, 10, 7, 0, 36, 10,
- 7, 0, 37, 10,134, 1, 1, 0, 0, 0, 18, 0,135, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 17, 0, 2, 0, 38, 10,
-136, 1, 10, 0, 2, 0,232, 3, 2, 0, 17, 0, 7, 0,131, 4, 7, 0, 39, 10, 7, 0, 40, 10, 7, 0, 41, 10, 7, 0, 42, 10,
-135, 1, 43, 10,135, 1, 44, 10,135, 1, 45, 10, 55, 0, 11, 0, 4, 0, 17, 0, 4, 0, 61, 0, 4, 0, 46, 10, 4, 0, 47, 10,
- 16, 0, 48, 10, 16, 0, 49, 10,136, 1, 50, 10, 7, 0, 51, 10, 7, 0, 52, 10, 7, 0, 53, 10, 7, 0, 54, 10,228, 0, 10, 0,
- 4, 0, 96, 9, 4, 0, 55, 10, 7, 0, 56, 10, 7, 0, 57, 10, 7, 0, 58, 10, 7, 0, 59, 10, 7, 0, 8, 0, 7, 0, 10, 0,
- 4, 0, 66, 1, 4, 0,235, 2,227, 0, 18, 0, 4, 0,123, 0, 4, 0, 60, 10, 4, 0, 61, 10, 7, 0, 62, 10, 4, 0, 63, 10,
- 7, 0, 64, 10, 7, 0, 65, 10, 4, 0, 66, 10, 7, 0, 67, 10, 4, 0, 68, 10, 7, 0, 69, 10,228, 0, 70, 10, 7, 0, 71, 10,
- 7, 0, 72, 10, 7, 0, 73, 10, 7, 0, 74, 10, 4, 0, 75, 10, 4, 0, 35, 0,137, 1, 4, 0, 39, 0,222, 2, 7, 0, 76, 10,
- 7, 0,155, 1, 7, 0, 35, 0,189, 0, 35, 0, 19, 0, 29, 0,137, 1, 77, 10, 55, 0, 43, 10, 43, 0, 78, 10, 49, 0, 79, 10,
- 22, 0,145, 0, 0, 0, 80, 10, 4, 0, 81, 10, 4, 0, 35, 0, 7, 0, 82, 10, 2, 0,247, 5, 2, 0, 83, 10, 4, 0,104, 0,
- 4, 0, 17, 0, 7, 0, 84, 10, 4, 0, 73, 2, 4, 0, 85, 10, 7, 0, 86, 10, 7, 0, 87, 10, 7, 0, 88, 10, 7, 0,155, 1,
- 4, 0, 89, 10, 7, 0, 90, 10, 0, 0, 91, 10, 0, 0, 92, 10, 0, 0, 93, 10, 0, 0,223, 1, 7, 0, 94, 10, 7, 0, 95, 10,
- 7, 0, 96, 10, 7, 0, 97, 10, 4, 0, 98, 10, 7, 0, 99, 10, 7, 0,100, 10, 7, 0,101, 10,138, 1, 10, 0, 4, 0, 15, 0,
- 4, 0,119, 0, 4, 0, 17, 0, 4, 0,185, 3, 4, 0,102, 10, 4, 0,103, 10, 4, 0,104, 10, 0, 0, 90, 0, 0, 0, 18, 0,
- 9, 0, 2, 0,139, 1, 1, 0, 0, 0, 40, 8, 84, 0, 7, 0,138, 1,105, 10, 4, 0,106, 10, 4, 0,107, 10, 4, 0,108, 10,
- 4, 0, 35, 0, 9, 0,109, 10,139, 1,110, 10,140, 1, 5, 0, 7, 0,143, 2, 7, 0,212, 2, 7, 0, 23, 2, 2, 0,119, 2,
- 2, 0, 35, 0,141, 1, 5, 0, 7, 0,143, 2, 7, 0,111, 10, 7, 0,112, 10, 7, 0,113, 10, 7, 0,212, 2,142, 1, 5, 0,
- 24, 0,114, 10,143, 1, 20, 0, 7, 0,215, 5, 7, 0,115, 10, 7, 0, 54, 0,144, 1, 3, 0, 7, 0,116, 10, 4, 0,117, 10,
- 4, 0,118, 10,145, 1, 7, 0, 4, 0,119, 10, 4, 0,120, 10, 4, 0,121, 10, 7, 0,122, 10, 7, 0,123, 10, 7, 0,124, 10,
- 7, 0, 54, 0,146, 1, 8, 0,146, 1, 0, 0,146, 1, 1, 0, 24, 0, 42, 0, 4, 0,249, 0, 2, 0, 17, 0, 2, 0, 66, 1,
- 7, 0,212, 2, 7, 0,169, 8,147, 1, 6, 0,147, 1, 0, 0,147, 1, 1, 0, 24, 0, 42, 0, 2, 0,197, 2, 2, 0, 17, 0,
- 2, 0,125, 10,148, 1, 17, 0,141, 1,179, 3,141, 1,126, 10,140, 1,127, 10,141, 1,152, 8,142, 1,128, 10, 4, 0, 79, 0,
- 7, 0,212, 2, 7, 0,241, 2, 7, 0,129, 10, 4, 0,119, 10, 4, 0,130, 10, 7, 0,123, 10, 7, 0,124, 10, 7, 0,104, 0,
- 4, 0,131, 10, 2, 0, 17, 0, 2, 0,132, 10,149, 1, 13, 0, 7, 0,133, 10, 7, 0,245, 0, 7, 0,116, 10, 7, 0,134, 10,
- 7, 0,135, 10, 7, 0,136, 10, 7, 0,137, 10, 7, 0,138, 10, 7, 0,139, 10, 7, 0,140, 10, 7, 0,141, 10, 4, 0, 17, 0,
- 4, 0, 35, 0,150, 1,115, 0, 19, 0, 29, 0, 31, 0, 72, 0,151, 1,142, 10,149, 1,143, 10,166, 0, 68, 4, 4, 0, 17, 0,
- 2, 0, 15, 0, 2, 0,153, 9, 2, 0,144, 10, 2, 0,145, 10, 2, 0,146, 3, 2, 0,146, 10, 2, 0,147, 10, 2, 0,148, 10,
- 2, 0,149, 10, 2, 0,150, 10, 2, 0,151, 10, 2, 0,152, 10, 2, 0,153, 10, 2, 0,113, 5, 2, 0,154, 10, 2, 0,155, 10,
- 2, 0,156, 10, 2, 0,157, 10, 2, 0,158, 10, 2, 0, 12, 2, 2, 0,145, 8, 2, 0,120, 8, 2, 0,159, 10, 2, 0,160, 10,
- 2, 0,195, 3, 2, 0,196, 3, 2, 0,161, 10, 2, 0,162, 10, 2, 0,163, 10, 2, 0,164, 10, 7, 0,165, 10, 7, 0,166, 10,
- 7, 0,167, 10, 2, 0, 63, 5, 2, 0,168, 10, 7, 0,169, 10, 7, 0,170, 10, 7, 0,171, 10, 7, 0,127, 8, 7, 0, 86, 0,
- 7, 0,241, 2, 7, 0,133, 8, 7, 0,172, 10, 7, 0,173, 10, 7, 0,174, 10, 4, 0,128, 8, 4, 0,126, 8, 4, 0,175, 10,
- 7, 0,129, 8, 7, 0,130, 8, 7, 0,131, 8, 7, 0,176, 10, 7, 0,177, 10, 7, 0,178, 10, 7, 0,179, 10, 7, 0,180, 10,
- 7, 0,181, 10, 7, 0,182, 10, 7, 0,183, 10, 7, 0,184, 10, 7, 0,137, 3, 7, 0,104, 0, 7, 0,185, 10, 7, 0,186, 10,
- 7, 0,187, 10, 7, 0,188, 10, 7, 0,189, 10, 7, 0,190, 10, 7, 0,191, 10, 4, 0,192, 10, 4, 0,193, 10, 7, 0,194, 10,
- 7, 0,195, 10, 7, 0,196, 10, 7, 0,197, 10, 7, 0,198, 10, 7, 0,204, 0, 7, 0,199, 10, 7, 0,222, 3, 7, 0,220, 3,
- 7, 0,221, 3, 7, 0,200, 10, 7, 0,201, 10, 7, 0,202, 10, 7, 0,203, 10, 7, 0,204, 10, 7, 0,205, 10, 7, 0,206, 10,
- 7, 0,207, 10, 7, 0,208, 10, 7, 0,209, 10, 7, 0,210, 10, 7, 0,211, 10, 7, 0,212, 10, 7, 0,213, 10, 7, 0,214, 10,
- 7, 0,215, 10, 7, 0,216, 10, 7, 0,217, 10, 4, 0,218, 10, 4, 0,219, 10, 58, 0,169, 3, 12, 0,220, 10, 58, 0,221, 10,
- 24, 0,222, 10, 24, 0,223, 10, 28, 0, 77, 0,161, 0, 58, 1,161, 0,224, 10,140, 0, 47, 0,140, 0, 0, 0,140, 0, 1, 0,
-150, 1,225, 10,148, 1,226, 10,145, 1, 61, 9,169, 0,250, 3, 9, 0,251, 3,152, 1,227, 10,152, 1,228, 10, 12, 0,229, 10,
- 12, 0,230, 10,125, 0,231, 10,133, 0,232, 10,133, 0,233, 10, 24, 0,234, 10, 24, 0,235, 10, 24, 0, 36, 0, 12, 0,120, 9,
- 0, 0, 18, 0, 7, 0,234, 0, 7, 0, 12, 3, 7, 0,236, 10, 4, 0,186, 2, 4, 0,237, 10, 4, 0, 17, 0, 4, 0,128, 8,
- 4, 0,238, 10, 4, 0,239, 10, 4, 0,240, 10, 2, 0,241, 0, 2, 0,241, 10, 2, 0,242, 10, 2, 0,243, 10, 0, 0,244, 10,
- 2, 0,245, 10, 2, 0,246, 10, 2, 0,247, 10, 9, 0,248, 10,129, 0, 67, 4, 12, 0,255, 2, 12, 0,249, 10,144, 1,250, 10,
- 4, 0,251, 10, 4, 0,252, 10,153, 1,253, 10,154, 1,254, 10, 7, 0,255, 10,127, 0, 37, 0,155, 1, 0, 9, 7, 0, 37, 4,
- 7, 0, 0, 11, 7, 0, 1, 11, 7, 0,215, 5, 7, 0,147, 3, 7, 0,137, 3, 7, 0, 2, 11, 7, 0, 75, 2, 7, 0, 3, 11,
- 7, 0, 4, 11, 7, 0, 5, 11, 7, 0, 6, 11, 7, 0, 7, 11, 7, 0, 8, 11, 7, 0, 38, 4, 7, 0, 9, 11, 7, 0, 10, 11,
- 7, 0, 11, 11, 7, 0, 39, 4, 7, 0, 35, 4, 7, 0, 36, 4, 7, 0, 12, 11, 7, 0, 13, 11, 4, 0, 14, 11, 4, 0, 88, 0,
- 4, 0, 15, 11, 4, 0, 16, 11, 2, 0, 17, 11, 2, 0, 18, 11, 2, 0, 19, 11, 2, 0, 20, 11, 2, 0, 21, 11, 2, 0, 22, 11,
- 2, 0, 23, 11, 2, 0,181, 4,166, 0, 68, 4,128, 0, 9, 0,155, 1, 24, 11, 7, 0, 25, 11, 7, 0, 26, 11, 7, 0,227, 1,
- 7, 0, 27, 11, 4, 0, 88, 0, 2, 0, 28, 11, 2, 0, 29, 11, 58, 0,226, 1,156, 1, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0,
- 7, 0, 1, 2, 7, 0, 30, 11,157, 1, 6, 0,157, 1, 0, 0,157, 1, 1, 0,156, 1, 38, 9, 4, 0,247, 0, 2, 0, 31, 11,
- 2, 0, 17, 0,158, 1, 5, 0,158, 1, 0, 0,158, 1, 1, 0, 12, 0, 32, 11, 4, 0, 33, 11, 4, 0, 17, 0,159, 1, 9, 0,
-159, 1, 0, 0,159, 1, 1, 0, 12, 0,118, 0,158, 1, 34, 11, 4, 0, 17, 0, 2, 0, 31, 11, 2, 0, 35, 11, 7, 0, 89, 0,
- 0, 0, 36, 11,157, 0, 6, 0, 19, 0, 29, 0, 12, 0, 31, 5, 4, 0, 17, 0, 2, 0, 37, 11, 2, 0, 38, 11, 9, 0, 39, 11,
-160, 1, 6, 0, 12, 0, 40, 11, 4, 0, 41, 11, 4, 0, 42, 11, 4, 0, 17, 0, 4, 0, 35, 0,209, 0, 43, 11,161, 1, 17, 0,
- 19, 0, 29, 0,162, 1, 44, 11,162, 1, 45, 11, 12, 0, 46, 11, 4, 0, 47, 11, 2, 0, 48, 11, 2, 0, 49, 11, 12, 0, 50, 11,
- 12, 0, 51, 11,160, 1, 52, 11, 12, 0, 53, 11, 12, 0, 54, 11, 12, 0, 55, 11, 12, 0, 56, 11,163, 1, 57, 11, 12, 0, 58, 11,
-209, 0, 59, 11,162, 1, 31, 0,162, 1, 0, 0,162, 1, 1, 0, 9, 0, 60, 11, 4, 0,232, 7, 2, 0, 61, 11, 2, 0, 35, 0,
- 0, 1, 62, 11, 0, 1, 63, 11, 0, 0, 64, 11, 2, 0, 65, 11, 2, 0, 66, 11, 2, 0,254, 7, 2, 0,255, 7, 2, 0, 67, 11,
- 2, 0, 68, 11, 2, 0,185, 3, 2, 0,206, 6, 2, 0, 69, 11, 2, 0, 70, 11, 2, 0,222, 9,164, 1, 71, 11,165, 1, 72, 11,
-166, 1, 73, 11, 4, 0, 74, 11, 4, 0, 75, 11, 9, 0, 76, 11, 12, 0, 51, 11, 12, 0, 18, 8, 12, 0, 77, 11, 12, 0, 78, 11,
- 12, 0, 79, 11,167, 1, 17, 0,167, 1, 0, 0,167, 1, 1, 0, 0, 0, 80, 11, 18, 0, 28, 0, 2, 0, 81, 11, 2, 0, 15, 0,
- 2, 0, 13, 0, 2, 0, 82, 11, 2, 0, 83, 11, 2, 0, 84, 11, 2, 0, 85, 11, 2, 0, 86, 11, 2, 0, 17, 0, 2, 0, 87, 11,
- 2, 0, 29, 0, 2, 0, 35, 0,168, 1, 88, 11,169, 1, 10, 0,169, 1, 0, 0,169, 1, 1, 0, 12, 0, 89, 11, 0, 0, 80, 11,
- 2, 0, 90, 11, 2, 0, 91, 11, 2, 0, 17, 0, 2, 0, 92, 11, 4, 0, 93, 11, 9, 0, 94, 11,163, 1, 7, 0,163, 1, 0, 0,
-163, 1, 1, 0, 0, 0, 80, 11, 0, 0, 95, 11, 12, 0,178, 7, 4, 0, 96, 11, 4, 0, 17, 0,221, 0, 14, 0,221, 0, 0, 0,
-221, 0, 1, 0, 0, 0, 80, 11, 18, 0, 28, 0,170, 1,248, 7, 9, 0, 97, 11, 9, 0, 98, 11,168, 1, 88, 11,160, 1, 99, 11,
- 12, 0,100, 11,221, 0,101, 11, 5, 1,117, 6, 2, 0, 17, 0, 2, 0,181, 4,171, 1, 8, 0,171, 1, 0, 0,171, 1, 1, 0,
- 9, 0, 2, 0, 9, 0,102, 11, 0, 0,244, 3, 2, 0, 15, 0, 2, 0, 17, 0, 7, 0,103, 11,172, 1, 5, 0, 7, 0,104, 11,
- 4, 0,105, 11, 4, 0,106, 11, 4, 0, 66, 1, 4, 0, 17, 0,173, 1, 6, 0, 7, 0,107, 11, 7, 0,108, 11, 7, 0,109, 11,
- 7, 0,110, 11, 4, 0, 15, 0, 4, 0, 17, 0,174, 1, 5, 0, 7, 0,229, 8, 7, 0,230, 8, 7, 0,212, 2, 2, 0, 26, 2,
- 2, 0, 27, 2,175, 1, 5, 0,174, 1, 2, 0, 4, 0, 51, 0, 7, 0,111, 11, 7, 0,229, 8, 7, 0,230, 8,176, 1, 4, 0,
- 2, 0,112, 11, 2, 0,113, 11, 2, 0,114, 11, 2, 0,115, 11,177, 1, 2, 0, 34, 0,171, 6, 18, 0, 5, 9,178, 1, 3, 0,
- 16, 0,116, 11, 4, 0, 17, 0, 4, 0, 35, 0,179, 1, 6, 0, 7, 0,104, 0, 7, 0,214, 2, 7, 0,117, 11, 7, 0, 35, 0,
- 2, 0,240, 0, 2, 0,118, 11,180, 1, 5, 0, 7, 0,119, 11, 7, 0,119, 0, 7, 0, 39, 9, 7, 0, 40, 9, 4, 0, 17, 0,
-181, 1, 6, 0, 19, 0,177, 6, 0, 0,120, 11, 0, 0,121, 11, 2, 0,122, 11, 2, 0, 17, 0, 4, 0,123, 11,182, 1, 7, 0,
-182, 1, 0, 0,182, 1, 1, 0, 0, 0,244, 3,181, 1,124, 11, 2, 0,125, 11, 2, 0, 15, 0, 7, 0, 58, 0,183, 1, 7, 0,
- 12, 0,126, 11, 0, 0,127, 11, 9, 0,128, 11, 7, 0, 58, 0, 7, 0,103, 11, 4, 0, 15, 0, 4, 0, 17, 0,184, 1, 3, 0,
- 7, 0,129, 11, 4, 0, 17, 0, 4, 0, 35, 0,185, 1, 15, 0,185, 1, 0, 0,185, 1, 1, 0, 76, 1,107, 9,183, 1, 59, 0,
- 12, 0,105, 3, 27, 0, 47, 0,184, 1,130, 11, 4, 0, 51, 0, 7, 0, 58, 0, 2, 0, 17, 0, 2, 0, 9, 1, 4, 0,131, 11,
- 0, 0,120, 11, 4, 0,132, 11, 7, 0,133, 11,186, 1, 2, 0, 0, 0,134, 11, 0, 0,135, 11,187, 1, 4, 0,187, 1, 0, 0,
-187, 1, 1, 0,155, 0, 46, 3, 12, 0,136, 11,188, 1, 24, 0,188, 1, 0, 0,188, 1, 1, 0, 12, 0,137, 11,155, 0,200, 8,
-187, 1,138, 11, 12, 0,139, 11, 12, 0,105, 3, 0, 0,244, 3, 7, 0,103, 11, 7, 0,140, 11, 7, 0, 85, 0, 7, 0, 86, 0,
- 7, 0,169, 9, 7, 0,170, 9, 7, 0,231, 2, 7, 0,173, 9, 7, 0,202, 8, 7, 0,174, 9, 2, 0,141, 11, 2, 0,142, 11,
- 2, 0, 87, 0, 2, 0, 15, 0, 4, 0, 17, 0, 4, 0, 67, 0,189, 1, 6, 0,189, 1, 0, 0,189, 1, 1, 0, 12, 0,137, 11,
- 4, 0, 17, 0, 4, 0,148, 2, 0, 0,244, 3,190, 1, 11, 0,190, 1, 0, 0,190, 1, 1, 0, 19, 0,177, 6, 0, 0,143, 11,
- 4, 0,123, 11, 2, 0,144, 11, 2, 0, 35, 0, 0, 0,120, 11, 4, 0,131, 11, 2, 0, 17, 0, 2, 0,145, 11,191, 1, 8, 0,
-191, 1, 0, 0,191, 1, 1, 0, 12, 0,146, 11, 0, 0,244, 3, 0, 0,147, 11, 2, 0, 17, 0, 2, 0,145, 11, 4, 0,148, 11,
-192, 1, 5, 0,192, 1, 0, 0,192, 1, 1, 0, 0, 0,120, 11, 4, 0,131, 11, 7, 0,202, 2, 31, 0, 12, 0,155, 0, 97, 3,
-155, 0,149, 11,187, 1,138, 11, 12, 0,150, 11,188, 1,151, 11, 12, 0,152, 11, 12, 0,153, 11, 4, 0, 17, 0, 4, 0,241, 0,
- 2, 0,154, 11, 2, 0,155, 11, 7, 0,156, 11,193, 1, 2, 0, 19, 0, 29, 0, 31, 0, 72, 0,194, 1, 5, 0,194, 1, 0, 0,
-194, 1, 1, 0, 4, 0, 15, 0, 4, 0, 17, 0, 0, 0, 18, 0,195, 1, 6, 0,194, 1,157, 11, 24, 0, 42, 0, 4, 0,158, 11,
- 7, 0,159, 11, 4, 0,160, 11, 4, 0, 96, 9,196, 1, 3, 0,194, 1,157, 11, 4, 0,158, 11, 7, 0,161, 11,197, 1, 8, 0,
-194, 1,157, 11, 24, 0, 42, 0, 7, 0, 61, 1, 7, 0,162, 11, 7, 0, 12, 3, 7, 0,255, 8, 4, 0,158, 11, 4, 0,163, 11,
-198, 1, 5, 0,194, 1,157, 11, 7, 0,164, 11, 7, 0, 80, 8, 7, 0,237, 2, 7, 0, 54, 0,199, 1, 3, 0,194, 1,157, 11,
- 7, 0,255, 8, 7, 0,165, 11,143, 1, 4, 0, 7, 0,166, 11, 7, 0,187, 10, 2, 0,167, 11, 2, 0, 66, 1,200, 1, 14, 0,
-200, 1, 0, 0,200, 1, 1, 0, 12, 0,168, 11, 12, 0,169, 11, 12, 0,170, 11, 0, 0, 18, 0, 4, 0, 29, 0, 4, 0, 17, 0,
- 4, 0,171, 11, 7, 0,172, 11, 4, 0,160, 11, 4, 0, 96, 9, 7, 0,254, 3, 7, 0,239, 2,151, 1, 23, 0, 4, 0,158, 11,
- 4, 0,173, 11, 7, 0,174, 11, 7, 0,235, 2, 7, 0,175, 11, 7, 0,216, 8, 7, 0,166, 11, 7, 0,176, 11, 7, 0,214, 2,
- 7, 0, 62, 10, 7, 0,131, 4, 7, 0,177, 11, 7, 0,178, 11, 7, 0,179, 11, 7, 0,180, 11, 7, 0,181, 11, 7, 0,182, 11,
- 7, 0,183, 11, 7, 0,184, 11, 7, 0,185, 11, 7, 0,186, 11, 7, 0,187, 11, 12, 0,188, 11,113, 0, 40, 0,112, 0,189, 11,
-201, 1,143, 10, 58, 0,190, 11, 58, 0,221, 10, 58, 0,191, 11,202, 1,192, 11, 40, 0,159, 0, 40, 0,193, 11, 40, 0,194, 11,
- 7, 0,195, 11, 7, 0,196, 11, 7, 0,197, 11, 7, 0,198, 11, 7, 0,199, 11, 7, 0,231, 7, 7, 0,200, 11, 7, 0,155, 1,
- 7, 0,201, 11, 4, 0,202, 11, 4, 0,203, 11, 4, 0,204, 11, 4, 0, 88, 0, 4, 0, 35, 0, 4, 0,205, 11, 2, 0,206, 11,
- 2, 0,207, 11, 4, 0,208, 11, 7, 0,214, 2, 4, 0,209, 11, 7, 0,210, 11, 4, 0,211, 11, 4, 0,212, 11, 4, 0,213, 11,
-129, 0,214, 11, 12, 0,215, 11,166, 0, 68, 4, 4, 0,216, 11, 7, 0,217, 11, 7, 0,218, 11, 4, 0, 67, 0,114, 0, 12, 0,
-112, 0,189, 11,140, 0, 32, 3, 7, 0,122, 1, 7, 0,231, 7, 7, 0,219, 11, 7, 0,220, 11, 7, 0,221, 11, 2, 0,222, 11,
- 2, 0,223, 11, 2, 0,224, 11, 2, 0, 15, 0, 4, 0, 88, 0,115, 0, 13, 0,112, 0,189, 11,131, 0, 9, 3,133, 0, 11, 3,
- 7, 0, 38, 9, 7, 0,225, 11, 7, 0,226, 11, 7, 0, 63, 1, 7, 0,227, 11, 4, 0,129, 9, 4, 0, 7, 3, 2, 0, 15, 0,
- 2, 0, 35, 0, 4, 0, 67, 0, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0};
+119,105,110,100,111,119,115,116, 97,116,101, 0,109,111,110,105,116,111,114, 0,108, 97,115,116, 99,117,114,115,111,114, 0,109,
+111,100, 97,108, 99,117,114,115,111,114, 0, 97,100,100,109,111,117,115,101,109,111,118,101, 0, 42,101,118,101,110,116,115,116,
+ 97,116,101, 0, 42, 99,117,114,115,119,105,110, 0, 42,116,119,101, 97,107, 0,100,114, 97,119,109,101,116,104,111,100, 0,100,
+114, 97,119,102, 97,105,108, 0, 42,100,114, 97,119,100, 97,116, 97, 0,109,111,100, 97,108,104, 97,110,100,108,101,114,115, 0,
+115,117, 98,119,105,110,100,111,119,115, 0,103,101,115,116,117,114,101, 0,105,100,110, 97,109,101, 91, 54, 52, 93, 0,112,114,
+111,112,118, 97,108,117,101, 0,115,104,105,102,116, 0, 99,116,114,108, 0, 97,108,116, 0,111,115,107,101,121, 0,107,101,121,
+109,111,100,105,102,105,101,114, 0,109, 97,112,116,121,112,101, 0, 42,112,116,114, 0,105,116,101,109,115, 0,115,112, 97, 99,
+101,105,100, 0,114,101,103,105,111,110,105,100, 0,107,109,105, 95,105,100, 0, 40, 42,112,111,108,108, 41, 40, 41, 0, 42,109,
+111,100, 97,108, 95,105,116,101,109,115, 0, 98, 97,115,101,110, 97,109,101, 91, 54, 52, 93, 0, 97, 99,116,107,101,121,109, 97,
+112, 0, 42, 99,117,115,116,111,109,100, 97,116, 97, 0, 42,112,121, 95,105,110,115,116, 97,110, 99,101, 0, 42,114,101,112,111,
+114,116,115, 0,109, 97, 99,114,111, 0, 42,111,112,109, 0, 42,101,100, 97,116, 97, 0,105,110,102,108,117,101,110, 99,101, 0,
+ 42, 99,111,101,102,102,105, 99,105,101,110,116,115, 0, 97,114,114, 97,121,115,105,122,101, 0,112,111,108,121, 95,111,114,100,
+101,114, 0, 97,109,112,108,105,116,117,100,101, 0,112,104, 97,115,101, 95,109,117,108,116,105,112,108,105,101,114, 0,112,104,
+ 97,115,101, 95,111,102,102,115,101,116, 0,118, 97,108,117,101, 95,111,102,102,115,101,116, 0,109,105,100,118, 97,108, 0, 98,
+101,102,111,114,101, 95,109,111,100,101, 0, 97,102,116,101,114, 95,109,111,100,101, 0, 98,101,102,111,114,101, 95, 99,121, 99,
+108,101,115, 0, 97,102,116,101,114, 95, 99,121, 99,108,101,115, 0,114,101, 99,116, 0,112,104, 97,115,101, 0,109,111,100,105,
+102,105, 99, 97,116,105,111,110, 0,115,116,101,112, 95,115,105,122,101, 0, 42,114,110, 97, 95,112, 97,116,104, 0,112, 99,104,
+ 97,110, 95,110, 97,109,101, 91, 51, 50, 93, 0,116,114, 97,110,115, 67,104, 97,110, 0,105,100,116,121,112,101, 0,116, 97,114,
+103,101,116,115, 91, 56, 93, 0,110,117,109, 95,116, 97,114,103,101,116,115, 0,118, 97,114,105, 97, 98,108,101,115, 0,101,120,
+112,114,101,115,115,105,111,110, 91, 50, 53, 54, 93, 0, 42,101,120,112,114, 95, 99,111,109,112, 0,118,101, 99, 91, 50, 93, 0,
+ 42,102,112,116, 0, 97,114,114, 97,121, 95,105,110,100,101,120, 0, 99,111,108,111,114, 95,109,111,100,101, 0, 99,111,108,111,
+114, 91, 51, 93, 0,102,114,111,109, 91, 49, 50, 56, 93, 0,116,111, 91, 49, 50, 56, 93, 0,109, 97,112,112,105,110,103,115, 0,
+115,116,114,105,112,115, 0, 42,114,101,109, 97,112, 0,102, 99,117,114,118,101,115, 0,115,116,114,105,112, 95,116,105,109,101,
+ 0, 98,108,101,110,100,109,111,100,101, 0,101,120,116,101,110,100,109,111,100,101, 0,103,114,111,117,112, 91, 54, 52, 93, 0,
+103,114,111,117,112,109,111,100,101, 0,107,101,121,105,110,103,102,108, 97,103, 0,112, 97,116,104,115, 0,116,121,112,101,105,
+110,102,111, 91, 54, 52, 93, 0, 97, 99,116,105,118,101, 95,112, 97,116,104, 0, 42,116,109,112, 97, 99,116, 0,110,108, 97, 95,
+116,114, 97, 99,107,115, 0, 42, 97, 99,116,115,116,114,105,112, 0,100,114,105,118,101,114,115, 0,111,118,101,114,114,105,100,
+101,115, 0, 97, 99,116, 95, 98,108,101,110,100,109,111,100,101, 0, 97, 99,116, 95,101,120,116,101,110,100,109,111,100,101, 0,
+ 97, 99,116, 95,105,110,102,108,117,101,110, 99,101, 0,114,117,108,101, 0,111,112,116,105,111,110,115, 0,102,101, 97,114, 95,
+102, 97, 99,116,111,114, 0,115,105,103,110, 97,108, 95,105,100, 0,108,111,111,107, 95, 97,104,101, 97,100, 0,111,108,111, 99,
+ 91, 51, 93, 0,113,117,101,117,101, 95,115,105,122,101, 0,119, 97,110,100,101,114, 0,102,108,101,101, 95,100,105,115,116, 97,
+110, 99,101, 0,104,101, 97,108,116,104, 0,115,116, 97,116,101, 95,105,100, 0,114,117,108,101,115, 0, 99,111,110,100,105,116,
+105,111,110,115, 0, 97, 99,116,105,111,110,115, 0,114,117,108,101,115,101,116, 95,116,121,112,101, 0,114,117,108,101, 95,102,
+117,122,122,105,110,101,115,115, 0,108, 97,115,116, 95,115,116, 97,116,101, 95,105,100, 0,108, 97,110,100,105,110,103, 95,115,
+109,111,111,116,104,110,101,115,115, 0, 98, 97,110,107,105,110,103, 0, 97,103,103,114,101,115,115,105,111,110, 0, 97,105,114,
+ 95,109,105,110, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120, 95,115,112,101,101,100, 0, 97,105,114, 95,109, 97,120,
+ 95, 97, 99, 99, 0, 97,105,114, 95,109, 97,120, 95, 97,118,101, 0, 97,105,114, 95,112,101,114,115,111,110, 97,108, 95,115,112,
+ 97, 99,101, 0,108, 97,110,100, 95,106,117,109,112, 95,115,112,101,101,100, 0,108, 97,110,100, 95,109, 97,120, 95,115,112,101,
+101,100, 0,108, 97,110,100, 95,109, 97,120, 95, 97, 99, 99, 0,108, 97,110,100, 95,109, 97,120, 95, 97,118,101, 0,108, 97,110,
+100, 95,112,101,114,115,111,110, 97,108, 95,115,112, 97, 99,101, 0,108, 97,110,100, 95,115,116,105, 99,107, 95,102,111,114, 99,
+101, 0,115,116, 97,116,101,115, 0, 42,115,109,100, 0, 42,102,108,117,105,100, 95,103,114,111,117,112, 0, 42, 99,111,108,108,
+ 95,103,114,111,117,112, 0, 42,119,116, 0, 42,116,101,120, 95,119,116, 0, 42,116,101,120, 95,115,104, 97,100,111,119, 0, 42,
+115,104, 97,100,111,119, 0,112, 48, 91, 51, 93, 0,112, 49, 91, 51, 93, 0,100,120, 0,111,109,101,103, 97, 0,116,101,109,112,
+ 65,109, 98, 0, 98,101,116, 97, 0,114,101,115, 91, 51, 93, 0, 97,109,112,108,105,102,121, 0,109, 97,120,114,101,115, 0,118,
+105,101,119,115,101,116,116,105,110,103,115, 0,110,111,105,115,101, 0,100,105,115,115, 95,112,101,114, 99,101,110,116, 0,100,
+105,115,115, 95,115,112,101,101,100, 0,114,101,115, 95,119,116, 91, 51, 93, 0,100,120, 95,119,116, 0,118, 51,100,110,117,109,
+ 0, 99, 97, 99,104,101, 95, 99,111,109,112, 0, 99, 97, 99,104,101, 95,104,105,103,104, 95, 99,111,109,112, 0, 42,112,111,105,
+110,116, 95, 99, 97, 99,104,101, 91, 50, 93, 0,112,116, 99, 97, 99,104,101,115, 91, 50, 93, 0, 98,111,114,100,101,114, 95, 99,
+111,108,108,105,115,105,111,110,115, 0,116,105,109,101, 95,115, 99, 97,108,101, 0,118,111,114,116,105, 99,105,116,121, 0,118,
+101,108,111, 99,105,116,121, 91, 50, 93, 0,118,101,108, 95,109,117,108,116,105, 0,118,103,114,112, 95,104,101, 97,116, 95,115,
+ 99, 97,108,101, 91, 50, 93, 0,118,103,114,111,117,112, 95,102,108,111,119, 0,118,103,114,111,117,112, 95,100,101,110,115,105,
+116,121, 0,118,103,114,111,117,112, 95,104,101, 97,116, 0, 42,112,111,105,110,116,115, 95,111,108,100, 0, 42,118,101,108, 0,
+109, 97,116, 95,111,108,100, 91, 52, 93, 91, 52, 93, 0, 0, 0, 84, 89, 80, 69, 0, 0, 1,202, 99,104, 97,114, 0,117, 99,104,
+ 97,114, 0,115,104,111,114,116, 0,117,115,104,111,114,116, 0,105,110,116, 0,108,111,110,103, 0,117,108,111,110,103, 0,102,
+108,111, 97,116, 0,100,111,117, 98,108,101, 0,118,111,105,100, 0, 76,105,110,107, 0, 76,105,110,107, 68, 97,116, 97, 0, 76,
+105,115,116, 66, 97,115,101, 0,118,101, 99, 50,115, 0,118,101, 99, 50,102, 0,114, 99,116,105, 0,114, 99,116,102, 0, 73, 68,
+ 80,114,111,112,101,114,116,121, 68, 97,116, 97, 0, 73, 68, 80,114,111,112,101,114,116,121, 0, 73, 68, 0, 76,105, 98,114, 97,
+114,121, 0, 70,105,108,101, 68, 97,116, 97, 0, 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,112,111, 68,114,105,118,
+101,114, 0, 79, 98,106,101, 99,116, 0, 73,112,111, 67,117,114,118,101, 0, 66, 80,111,105,110,116, 0, 66,101,122, 84,114,105,
+112,108,101, 0, 73,112,111, 0, 75,101,121, 66,108,111, 99,107, 0, 75,101,121, 0, 65,110,105,109, 68, 97,116, 97, 0, 84,101,
+120,116, 76,105,110,101, 0, 84,101,120,116, 77, 97,114,107,101,114, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108,
+101, 0, 67, 97,109,101,114, 97, 0, 73,109, 97,103,101, 85,115,101,114, 0, 83, 99,101,110,101, 0, 73,109, 97,103,101, 0, 71,
+ 80, 85, 84,101,120,116,117,114,101, 0, 97,110,105,109, 0, 82,101,110,100,101,114, 82,101,115,117,108,116, 0, 77, 84,101,120,
+ 0, 84,101,120, 0, 80,108,117,103,105,110, 84,101,120, 0, 67, 66, 68, 97,116, 97, 0, 67,111,108,111,114, 66, 97,110,100, 0,
+ 69,110,118, 77, 97,112, 0, 73,109, 66,117,102, 0, 80,111,105,110,116, 68,101,110,115,105,116,121, 0, 86,111,120,101,108, 68,
+ 97,116, 97, 0, 98, 78,111,100,101, 84,114,101,101, 0, 84,101,120, 77, 97,112,112,105,110,103, 0, 76, 97,109,112, 0, 67,117,
+114,118,101, 77, 97,112,112,105,110,103, 0, 86,111,108,117,109,101, 83,101,116,116,105,110,103,115, 0, 77, 97,116,101,114,105,
+ 97,108, 0, 71,114,111,117,112, 0, 86, 70,111,110,116, 0, 86, 70,111,110,116, 68, 97,116, 97, 0, 77,101,116, 97, 69,108,101,
+109, 0, 66,111,117,110,100, 66,111,120, 0, 77,101,116, 97, 66, 97,108,108, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,
+111, 0, 84,101,120,116, 66,111,120, 0, 69,100,105,116, 78,117,114, 98, 0, 71, 72, 97,115,104, 0, 67,117,114,118,101, 0, 80,
+ 97,116,104, 0, 83,101,108, 66,111,120, 0, 69,100,105,116, 70,111,110,116, 0, 77,101,115,104, 0, 77, 70, 97, 99,101, 0, 77,
+ 84, 70, 97, 99,101, 0, 84, 70, 97, 99,101, 0, 77, 86,101,114,116, 0, 77, 69,100,103,101, 0, 77, 68,101,102,111,114,109, 86,
+101,114,116, 0, 77, 67,111,108, 0, 77, 83,116,105, 99,107,121, 0, 77, 83,101,108,101, 99,116, 0, 69,100,105,116, 77,101,115,
+104, 0, 67,117,115,116,111,109, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 0, 80, 97,114,116,105, 97,108, 86,105,115,
+105, 98,105,108,105,116,121, 0, 77, 68,101,102,111,114,109, 87,101,105,103,104,116, 0, 77, 84,101,120, 80,111,108,121, 0, 77,
+ 76,111,111,112, 85, 86, 0, 77, 76,111,111,112, 67,111,108, 0, 77, 70,108,111, 97,116, 80,114,111,112,101,114,116,121, 0, 77,
+ 73,110,116, 80,114,111,112,101,114,116,121, 0, 77, 83,116,114,105,110,103, 80,114,111,112,101,114,116,121, 0, 79,114,105,103,
+ 83,112, 97, 99,101, 70, 97, 99,101, 0, 77, 68,105,115,112,115, 0, 77,117,108,116,105,114,101,115, 67,111,108, 0, 77,117,108,
+116,105,114,101,115, 67,111,108, 70, 97, 99,101, 0, 77,117,108,116,105,114,101,115, 70, 97, 99,101, 0, 77,117,108,116,105,114,
+101,115, 69,100,103,101, 0, 77,117,108,116,105,114,101,115, 76,101,118,101,108, 0, 77,111,100,105,102,105,101,114, 68, 97,116,
+ 97, 0, 83,117, 98,115,117,114,102, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 77,111,100,
+105,102,105,101,114, 68, 97,116, 97, 0, 67,117,114,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,117,105,108,
+100, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77, 97,115,107, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,
+114,114, 97,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 77,105,114,114,111,114, 77,111,100,105,102,105,101,114, 68,
+ 97,116, 97, 0, 69,100,103,101, 83,112,108,105,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66,101,118,101,108, 77,
+111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 77,101,115,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,
+111,107,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,109,111,107,101, 68,111,109, 97,105,110, 83,101,116,116,105,
+110,103,115, 0, 83,109,111,107,101, 70,108,111,119, 83,101,116,116,105,110,103,115, 0, 83,109,111,107,101, 67,111,108,108, 83,
+101,116,116,105,110,103,115, 0, 68,105,115,112,108, 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 85, 86, 80,
+114,111,106,101, 99,116, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101, 99,105,109, 97,116,101, 77,111,100,105,102,
+105,101,114, 68, 97,116, 97, 0, 83,109,111,111,116,104, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67, 97,115,116, 77,
+111,100,105,102,105,101,114, 68, 97,116, 97, 0, 87, 97,118,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 65,114,109,
+ 97,116,117,114,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 72,111,111,107, 77,111,100,105,102,105,101,114, 68, 97,
+116, 97, 0, 83,111,102,116, 98,111,100,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 77,111,100,
+105,102,105,101,114, 68, 97,116, 97, 0, 67,108,111,116,104, 0, 67,108,111,116,104, 83,105,109, 83,101,116,116,105,110,103,115,
+ 0, 67,108,111,116,104, 67,111,108,108, 83,101,116,116,105,110,103,115, 0, 80,111,105,110,116, 67, 97, 99,104,101, 0, 67,111,
+108,108,105,115,105,111,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 66, 86, 72, 84,114,101,101, 0, 83,117,114,102,
+ 97, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,101,114,105,118,101,100, 77,101,115,104, 0, 66, 86, 72, 84,
+114,101,101, 70,114,111,109, 77,101,115,104, 0, 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0,
+ 77, 68,101,102, 73,110,102,108,117,101,110, 99,101, 0, 77, 68,101,102, 67,101,108,108, 0, 77,101,115,104, 68,101,102,111,114,
+109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 77,111,100,105,
+102,105,101,114, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 0, 80, 97,114,116,105, 99,108,101,
+ 73,110,115,116, 97,110, 99,101, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,120,112,108,111,100,101, 77,111,100,105,
+102,105,101,114, 68, 97,116, 97, 0, 77,117,108,116,105,114,101,115, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,
+117,105,100,115,105,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,
+110,103,115, 0, 83,104,114,105,110,107,119,114, 97,112, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,105,109,112,108,
+101, 68,101,102,111,114,109, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83,104, 97,112,101, 75,101,121, 77,111,100,105,
+102,105,101,114, 68, 97,116, 97, 0, 83,111,108,105,100,105,102,121, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 83, 99,
+114,101,119, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 69,100,105,116, 76, 97,116,116, 0, 76, 97,116,116,105, 99,101,
+ 0, 98, 68,101,102,111,114,109, 71,114,111,117,112, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 98, 65, 99,116,
+105,111,110, 0, 98, 80,111,115,101, 0, 98, 71, 80,100, 97,116, 97, 0, 98, 65,110,105,109, 86,105,122, 83,101,116,116,105,110,
+103,115, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, 0, 66,117,108,108,101,116, 83,111,102,116, 66,111,100,121, 0, 80, 97,
+114,116, 68,101,102,108,101, 99,116, 0, 83,111,102,116, 66,111,100,121, 0, 79, 98, 72,111,111,107, 0, 68,117,112,108,105, 79,
+ 98,106,101, 99,116, 0, 82, 78, 71, 0, 69,102,102,101, 99,116,111,114, 87,101,105,103,104,116,115, 0, 80, 84, 67, 97, 99,104,
+101, 69,120,116,114, 97, 0, 80, 84, 67, 97, 99,104,101, 77,101,109, 0, 80, 84, 67, 97, 99,104,101, 69,100,105,116, 0, 83, 66,
+ 86,101,114,116,101,120, 0, 66,111,100,121, 80,111,105,110,116, 0, 66,111,100,121, 83,112,114,105,110,103, 0, 83, 66, 83, 99,
+114, 97,116, 99,104, 0, 87,111,114,108,100, 0, 66, 97,115,101, 0, 65,118,105, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,
+105, 99,107,116,105,109,101, 67,111,100,101, 99, 68, 97,116, 97, 0, 81,117,105, 99,107,116,105,109,101, 67,111,100,101, 99, 83,
+101,116,116,105,110,103,115, 0, 70, 70, 77,112,101,103, 67,111,100,101, 99, 68, 97,116, 97, 0, 65,117,100,105,111, 68, 97,116,
+ 97, 0, 83, 99,101,110,101, 82,101,110,100,101,114, 76, 97,121,101,114, 0, 82,101,110,100,101,114, 68, 97,116, 97, 0, 82,101,
+110,100,101,114, 80,114,111,102,105,108,101, 0, 71, 97,109,101, 68,111,109,101, 0, 71, 97,109,101, 70,114, 97,109,105,110,103,
+ 0, 71, 97,109,101, 68, 97,116, 97, 0, 84,105,109,101, 77, 97,114,107,101,114, 0, 80, 97,105,110,116, 0, 66,114,117,115,104,
+ 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 66,114,117,115,
+104, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,101, 69,100,105,116, 83,101,116,116,105,110,103,115, 0, 84,114, 97,110,115,
+102,111,114,109, 79,114,105,101,110,116, 97,116,105,111,110, 0, 83, 99,117,108,112,116, 0, 86, 80, 97,105,110,116, 0, 84,111,
+111,108, 83,101,116,116,105,110,103,115, 0, 98, 83,116, 97,116,115, 0, 85,110,105,116, 83,101,116,116,105,110,103,115, 0, 80,
+104,121,115,105, 99,115, 83,101,116,116,105,110,103,115, 0, 69,100,105,116,105,110,103, 0, 83, 99,101,110,101, 83,116, 97,116,
+115, 0, 68, 97,103, 70,111,114,101,115,116, 0, 66, 71,112,105, 99, 0, 82,101,103,105,111,110, 86,105,101,119, 51, 68, 0, 82,
+101,110,100,101,114, 73,110,102,111, 0, 86,105,101,119, 68,101,112,116,104,115, 0, 83,109,111,111,116,104, 86,105,101,119, 83,
+116,111,114,101, 0,119,109, 84,105,109,101,114, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,101, 76,105,110,107, 0, 86,105,
+101,119, 50, 68, 0, 83,112, 97, 99,101, 73,110,102,111, 0, 83,112, 97, 99,101, 73,112,111, 0, 98, 68,111,112,101, 83,104,101,
+101,116, 0, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0, 70,105,108,101, 83,101,108,101, 99,116,
+ 80, 97,114, 97,109,115, 0, 83,112, 97, 99,101, 70,105,108,101, 0, 70,105,108,101, 76,105,115,116, 0,119,109, 79,112,101,114,
+ 97,116,111,114, 0, 70,105,108,101, 76, 97,121,111,117,116, 0, 83,112, 97, 99,101, 79,111,112,115, 0, 84,114,101,101, 83,116,
+111,114,101, 0, 84,114,101,101, 83,116,111,114,101, 69,108,101,109, 0, 83,112, 97, 99,101, 73,109, 97,103,101, 0, 83, 99,111,
+112,101,115, 0, 72,105,115,116,111,103,114, 97,109, 0, 83,112, 97, 99,101, 78,108, 97, 0, 83,112, 97, 99,101, 84,101,120,116,
+ 0, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83,112, 97, 99,101, 84,105,109,101, 67, 97, 99,
+104,101, 0, 83,112, 97, 99,101, 84,105,109,101, 0, 83,112, 97, 99,101, 78,111,100,101, 0, 83,112, 97, 99,101, 76,111,103,105,
+ 99, 0, 83,112, 97, 99,101, 73,109, 97, 83,101,108, 0, 67,111,110,115,111,108,101, 76,105,110,101, 0, 83,112, 97, 99,101, 67,
+111,110,115,111,108,101, 0, 83,112, 97, 99,101, 85,115,101,114, 80,114,101,102, 0, 83,112, 97, 99,101, 83,111,117,110,100, 0,
+ 83, 99,114, 65,114,101, 97, 0, 98, 83,111,117,110,100, 0,117,105, 70,111,110,116, 0,117,105, 70,111,110,116, 83,116,121,108,
+101, 0,117,105, 83,116,121,108,101, 0,117,105, 87,105,100,103,101,116, 67,111,108,111,114,115, 0,117,105, 87,105,100,103,101,
+116, 83,116, 97,116,101, 67,111,108,111,114,115, 0, 84,104,101,109,101, 85, 73, 0, 84,104,101,109,101, 83,112, 97, 99,101, 0,
+ 84,104,101,109,101, 87,105,114,101, 67,111,108,111,114, 0, 98, 84,104,101,109,101, 0, 98, 65,100,100,111,110, 0, 83,111,108,
+105,100, 76,105,103,104,116, 0, 85,115,101,114, 68,101,102, 0, 98, 83, 99,114,101,101,110, 0, 83, 99,114, 86,101,114,116, 0,
+ 83, 99,114, 69,100,103,101, 0, 80, 97,110,101,108, 0, 80, 97,110,101,108, 84,121,112,101, 0,117,105, 76, 97,121,111,117,116,
+ 0, 83,112, 97, 99,101, 84,121,112,101, 0, 65, 82,101,103,105,111,110, 0, 65, 82,101,103,105,111,110, 84,121,112,101, 0, 70,
+105,108,101, 71,108,111, 98, 97,108, 0, 83,116,114,105,112, 69,108,101,109, 0, 83,116,114,105,112, 67,114,111,112, 0, 83,116,
+114,105,112, 84,114, 97,110,115,102,111,114,109, 0, 83,116,114,105,112, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 83,
+116,114,105,112, 80,114,111,120,121, 0, 83,116,114,105,112, 0, 80,108,117,103,105,110, 83,101,113, 0, 83,101,113,117,101,110,
+ 99,101, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 87,105,112,101, 86, 97,114,115, 0, 71,108,111,119, 86, 97,114,115, 0, 84,
+114, 97,110,115,102,111,114,109, 86, 97,114,115, 0, 83,111,108,105,100, 67,111,108,111,114, 86, 97,114,115, 0, 83,112,101,101,
+100, 67,111,110,116,114,111,108, 86, 97,114,115, 0, 69,102,102,101, 99,116, 0, 66,117,105,108,100, 69,102,102, 0, 80, 97,114,
+116, 69,102,102, 0, 80, 97,114,116,105, 99,108,101, 0, 87, 97,118,101, 69,102,102, 0, 98, 80,114,111,112,101,114,116,121, 0,
+ 98, 78,101, 97,114, 83,101,110,115,111,114, 0, 98, 77,111,117,115,101, 83,101,110,115,111,114, 0, 98, 84,111,117, 99,104, 83,
+101,110,115,111,114, 0, 98, 75,101,121, 98,111, 97,114,100, 83,101,110,115,111,114, 0, 98, 80,114,111,112,101,114,116,121, 83,
+101,110,115,111,114, 0, 98, 65, 99,116,117, 97,116,111,114, 83,101,110,115,111,114, 0, 98, 68,101,108, 97,121, 83,101,110,115,
+111,114, 0, 98, 67,111,108,108,105,115,105,111,110, 83,101,110,115,111,114, 0, 98, 82, 97,100, 97,114, 83,101,110,115,111,114,
+ 0, 98, 82, 97,110,100,111,109, 83,101,110,115,111,114, 0, 98, 82, 97,121, 83,101,110,115,111,114, 0, 98, 65,114,109, 97,116,
+117,114,101, 83,101,110,115,111,114, 0, 98, 77,101,115,115, 97,103,101, 83,101,110,115,111,114, 0, 98, 83,101,110,115,111,114,
+ 0, 98, 67,111,110,116,114,111,108,108,101,114, 0, 98, 74,111,121,115,116,105, 99,107, 83,101,110,115,111,114, 0, 98, 69,120,
+112,114,101,115,115,105,111,110, 67,111,110,116, 0, 98, 80,121,116,104,111,110, 67,111,110,116, 0, 98, 65, 99,116,117, 97,116,
+111,114, 0, 98, 65,100,100, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 65, 99,116,105,111,110, 65, 99,116,
+117, 97,116,111,114, 0, 83,111,117,110,100, 51, 68, 0, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0, 98, 69,100,
+105,116, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,114, 0, 98, 83, 99,101,110,101, 65, 99,116,117, 97,116,111,114, 0,
+ 98, 80,114,111,112,101,114,116,121, 65, 99,116,117, 97,116,111,114, 0, 98, 79, 98,106,101, 99,116, 65, 99,116,117, 97,116,111,
+114, 0, 98, 73,112,111, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 97,109,101,114, 97, 65, 99,116,117, 97,116,111,114, 0, 98,
+ 67,111,110,115,116,114, 97,105,110,116, 65, 99,116,117, 97,116,111,114, 0, 98, 71,114,111,117,112, 65, 99,116,117, 97,116,111,
+114, 0, 98, 82, 97,110,100,111,109, 65, 99,116,117, 97,116,111,114, 0, 98, 77,101,115,115, 97,103,101, 65, 99,116,117, 97,116,
+111,114, 0, 98, 71, 97,109,101, 65, 99,116,117, 97,116,111,114, 0, 98, 86,105,115,105, 98,105,108,105,116,121, 65, 99,116,117,
+ 97,116,111,114, 0, 98, 84,119,111, 68, 70,105,108,116,101,114, 65, 99,116,117, 97,116,111,114, 0, 98, 80, 97,114,101,110,116,
+ 65, 99,116,117, 97,116,111,114, 0, 98, 83,116, 97,116,101, 65, 99,116,117, 97,116,111,114, 0, 98, 65,114,109, 97,116,117,114,
+101, 65, 99,116,117, 97,116,111,114, 0, 71,114,111,117,112, 79, 98,106,101, 99,116, 0, 66,111,110,101, 0, 98, 65,114,109, 97,
+116,117,114,101, 0, 98, 77,111,116,105,111,110, 80, 97,116,104, 86,101,114,116, 0, 98, 80,111,115,101, 67,104, 97,110,110,101,
+108, 0, 98, 73, 75, 80, 97,114, 97,109, 0, 98, 73,116, 97,115, 99, 0, 98, 65, 99,116,105,111,110, 71,114,111,117,112, 0, 83,
+112, 97, 99,101, 65, 99,116,105,111,110, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,
+114, 97,105,110,116, 67,104, 97,110,110,101,108, 0, 98, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,111,110,115,116,114,
+ 97,105,110,116, 84, 97,114,103,101,116, 0, 98, 80,121,116,104,111,110, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 75,105,
+110,101,109, 97,116,105, 99, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,112,108,105,110,101, 73, 75, 67,111,110,115,116,
+114, 97,105,110,116, 0, 98, 84,114, 97, 99,107, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 97,116,101,
+ 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 76,111, 99, 97,116,101, 76,105,107,101, 67,111,110,115,116,114,
+ 97,105,110,116, 0, 98, 83,105,122,101, 76,105,107,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83, 97,109,101, 86,111,
+108,117,109,101, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114, 97,110,115, 76,105,107,101, 67,111,110,115,116,114, 97,
+105,110,116, 0, 98, 77,105,110, 77, 97,120, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 67,111,110,
+115,116,114, 97,105,110,116, 0, 98, 76,111, 99,107, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 68, 97,
+109,112, 84,114, 97, 99,107, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 70,111,108,108,111,119, 80, 97,116,104, 67,111,110,
+115,116,114, 97,105,110,116, 0, 98, 83,116,114,101,116, 99,104, 84,111, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,105,
+103,105,100, 66,111,100,121, 74,111,105,110,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 67,108, 97,109,112, 84,111, 67,
+111,110,115,116,114, 97,105,110,116, 0, 98, 67,104,105,108,100, 79,102, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 84,114,
+ 97,110,115,102,111,114,109, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 80,105,118,111,116, 67,111,110,115,116,114, 97,105,
+110,116, 0, 98, 76,111, 99, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 82,111,116, 76,105,109,105,116,
+ 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,105,122,101, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0,
+ 98, 68,105,115,116, 76,105,109,105,116, 67,111,110,115,116,114, 97,105,110,116, 0, 98, 83,104,114,105,110,107,119,114, 97,112,
+ 67,111,110,115,116,114, 97,105,110,116, 0, 98, 65, 99,116,105,111,110, 77,111,100,105,102,105,101,114, 0, 98, 65, 99,116,105,
+111,110, 83,116,114,105,112, 0, 98, 78,111,100,101, 83,116, 97, 99,107, 0, 98, 78,111,100,101, 83,111, 99,107,101,116, 0, 98,
+ 78,111,100,101, 76,105,110,107, 0, 98, 78,111,100,101, 80,114,101,118,105,101,119, 0, 98, 78,111,100,101, 0,117,105, 66,108,
+111, 99,107, 0, 98, 78,111,100,101, 84,121,112,101, 0, 78,111,100,101, 73,109, 97,103,101, 65,110,105,109, 0, 78,111,100,101,
+ 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 68, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 66,105,108, 97,116,
+101,114, 97,108, 66,108,117,114, 68, 97,116, 97, 0, 78,111,100,101, 72,117,101, 83, 97,116, 0, 78,111,100,101, 73,109, 97,103,
+101, 70,105,108,101, 0, 78,111,100,101, 67,104,114,111,109, 97, 0, 78,111,100,101, 84,119,111, 88, 89,115, 0, 78,111,100,101,
+ 84,119,111, 70,108,111, 97,116,115, 0, 78,111,100,101, 71,101,111,109,101,116,114,121, 0, 78,111,100,101, 86,101,114,116,101,
+120, 67,111,108, 0, 78,111,100,101, 68,101,102,111, 99,117,115, 0, 78,111,100,101, 83, 99,114,105,112,116, 68,105, 99,116, 0,
+ 78,111,100,101, 71,108, 97,114,101, 0, 78,111,100,101, 84,111,110,101,109, 97,112, 0, 78,111,100,101, 76,101,110,115, 68,105,
+115,116, 0, 78,111,100,101, 67,111,108,111,114, 66, 97,108, 97,110, 99,101, 0, 78,111,100,101, 67,111,108,111,114,115,112,105,
+108,108, 0, 84,101,120, 78,111,100,101, 79,117,116,112,117,116, 0, 67,117,114,118,101, 77, 97,112, 80,111,105,110,116, 0, 67,
+117,114,118,101, 77, 97,112, 0, 66,114,117,115,104, 67,108,111,110,101, 0, 67,117,115,116,111,109, 68, 97,116, 97, 76, 97,121,
+101,114, 0, 67,117,115,116,111,109, 68, 97,116, 97, 69,120,116,101,114,110, 97,108, 0, 72, 97,105,114, 75,101,121, 0, 80, 97,
+114,116,105, 99,108,101, 75,101,121, 0, 66,111,105,100, 80, 97,114,116,105, 99,108,101, 0, 66,111,105,100, 68, 97,116, 97, 0,
+ 80, 97,114,116,105, 99,108,101, 83,112,114,105,110,103, 0, 67,104,105,108,100, 80, 97,114,116,105, 99,108,101, 0, 80, 97,114,
+116,105, 99,108,101, 84, 97,114,103,101,116, 0, 80, 97,114,116,105, 99,108,101, 68,117,112,108,105, 87,101,105,103,104,116, 0,
+ 80, 97,114,116,105, 99,108,101, 68, 97,116, 97, 0, 83, 80, 72, 70,108,117,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,
+114,116,105, 99,108,101, 83,101,116,116,105,110,103,115, 0, 66,111,105,100, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,
+105, 99,108,101, 67, 97, 99,104,101, 75,101,121, 0, 75, 68, 84,114,101,101, 0, 80, 97,114,116,105, 99,108,101, 68,114, 97,119,
+ 68, 97,116, 97, 0, 76,105,110,107, 78,111,100,101, 0, 98, 71, 80, 68,115,112,111,105,110,116, 0, 98, 71, 80, 68,115,116,114,
+111,107,101, 0, 98, 71, 80, 68,102,114, 97,109,101, 0, 98, 71, 80, 68,108, 97,121,101,114, 0, 82,101,112,111,114,116, 76,105,
+115,116, 0,119,109, 87,105,110,100,111,119, 77, 97,110, 97,103,101,114, 0,119,109, 87,105,110,100,111,119, 0,119,109, 75,101,
+121, 67,111,110,102,105,103, 0,119,109, 69,118,101,110,116, 0,119,109, 83,117, 98, 87,105,110,100,111,119, 0,119,109, 71,101,
+115,116,117,114,101, 0,119,109, 75,101,121, 77, 97,112, 73,116,101,109, 0, 80,111,105,110,116,101,114, 82, 78, 65, 0,119,109,
+ 75,101,121, 77, 97,112, 0,119,109, 79,112,101,114, 97,116,111,114, 84,121,112,101, 0, 70, 77,111,100,105,102,105,101,114, 0,
+ 70, 77,111,100, 95, 71,101,110,101,114, 97,116,111,114, 0, 70, 77,111,100, 95, 70,117,110, 99,116,105,111,110, 71,101,110,101,
+114, 97,116,111,114, 0, 70, 67, 77, 95, 69,110,118,101,108,111,112,101, 68, 97,116, 97, 0, 70, 77,111,100, 95, 69,110,118,101,
+108,111,112,101, 0, 70, 77,111,100, 95, 67,121, 99,108,101,115, 0, 70, 77,111,100, 95, 80,121,116,104,111,110, 0, 70, 77,111,
+100, 95, 76,105,109,105,116,115, 0, 70, 77,111,100, 95, 78,111,105,115,101, 0, 70, 77,111,100, 95, 83,116,101,112,112,101,100,
+ 0, 68,114,105,118,101,114, 84, 97,114,103,101,116, 0, 68,114,105,118,101,114, 86, 97,114, 0, 67,104, 97,110,110,101,108, 68,
+114,105,118,101,114, 0, 70, 80,111,105,110,116, 0, 70, 67,117,114,118,101, 0, 65,110,105,109, 77, 97,112, 80, 97,105,114, 0,
+ 65,110,105,109, 77, 97,112,112,101,114, 0, 78,108, 97, 83,116,114,105,112, 0, 78,108, 97, 84,114, 97, 99,107, 0, 75, 83, 95,
+ 80, 97,116,104, 0, 75,101,121,105,110,103, 83,101,116, 0, 65,110,105,109, 79,118,101,114,114,105,100,101, 0, 73,100, 65,100,
+116, 84,101,109,112,108, 97,116,101, 0, 66,111,105,100, 82,117,108,101, 0, 66,111,105,100, 82,117,108,101, 71,111, 97,108, 65,
+118,111,105,100, 0, 66,111,105,100, 82,117,108,101, 65,118,111,105,100, 67,111,108,108,105,115,105,111,110, 0, 66,111,105,100,
+ 82,117,108,101, 70,111,108,108,111,119, 76,101, 97,100,101,114, 0, 66,111,105,100, 82,117,108,101, 65,118,101,114, 97,103,101,
+ 83,112,101,101,100, 0, 66,111,105,100, 82,117,108,101, 70,105,103,104,116, 0, 66,111,105,100, 83,116, 97,116,101, 0, 70, 76,
+ 85, 73, 68, 95, 51, 68, 0, 87, 84, 85, 82, 66, 85, 76, 69, 78, 67, 69, 0, 0, 84, 76, 69, 78, 0, 1, 0, 1, 0, 2, 0, 2,
+ 0, 4, 0, 4, 0, 4, 0, 4, 0, 8, 0, 0, 0, 8, 0, 12, 0, 8, 0, 4, 0, 8, 0, 16, 0, 16, 0, 20, 0, 76, 0, 52,
+ 2, 40, 0, 0, 0, 32, 0,140, 4, 28, 0, 92, 0, 36, 0, 56, 0, 84, 0,112, 0,124, 0, 56, 0, 24, 0, 40, 0,120, 0, 12,
+ 0,104, 0, 36, 5,128, 1,156, 0, 0, 0, 0, 0, 0, 1, 16, 1, 48, 1, 84, 0, 24, 3, 8, 0,168, 0, 0, 0, 72, 1, 32,
+ 0,164, 0,132, 1,108, 1, 16, 0, 88, 2,160, 0, 76, 1, 60, 0, 0, 0,108, 0,104, 0,148, 0, 56, 0, 8, 0, 16, 0, 20,
+ 0, 0, 1, 92, 0, 0, 0, 0, 0, 0, 1, 24, 0, 20, 0, 44, 0, 60, 0, 20, 0, 12, 0, 12, 0, 4, 0, 8, 0, 8, 0, 0,
+ 0, 28, 0, 84, 0, 32, 0, 8, 0, 12, 0, 8, 0, 8, 0, 4, 0, 4, 1, 0, 0, 32, 0, 12, 0, 16, 0, 64, 0, 24, 0, 12,
+ 0, 40, 0, 64, 0, 80, 0,100, 0,108, 0, 80, 0,108, 0,128, 0, 76, 0, 72, 0,120, 0, 72, 0, 84, 0,204, 0, 48, 0,168,
+ 0,160, 0,172, 0, 72, 0,104, 0,116, 0,196, 0,112, 0,224, 0, 64, 0, 92, 0, 0, 0,144, 0, 32, 1,244, 0,112, 0, 0,
+ 0, 88, 0, 0, 0, 0, 0, 76, 0, 8, 0, 8, 0,244, 0, 88, 1,148, 0, 84, 0,108, 0, 72, 0, 72, 1,176, 0,120, 0,116,
+ 0, 64, 0,128, 0, 92, 0, 12, 0,224, 0, 40, 0, 0, 0, 92, 0,156, 0, 72, 0, 48, 0, 20, 0,120, 0,144, 1, 88, 0,208,
+ 0,180, 0, 0, 0, 68, 0, 20, 0, 96, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,112, 0, 28, 0,176, 0,144, 0, 64, 0, 60,
+ 0, 24, 0, 72, 3,232, 0, 56, 0, 20, 0, 16, 0,100, 0, 84, 0, 16, 2,204, 0, 36, 0, 16, 0,156, 0, 80, 0, 88, 0, 36,
+ 1,152, 0, 32, 0, 8, 0, 24, 2, 56, 0, 0, 0, 0, 0, 72, 3, 68, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 40, 0,140,
+ 0, 48, 0,208, 0, 88, 0,216, 0,216, 2, 96, 0, 60, 0, 0, 0,120, 0, 0, 0,244, 0, 12, 0, 12, 32,248, 16,112, 16, 24,
+ 0,192, 2,136, 2, 80, 0, 40, 0, 12, 0,188, 0,252, 0, 52, 2,140, 0, 28, 1,104, 0, 88, 0,188, 0, 96, 1, 92, 1, 16,
+ 0, 32, 0,224, 0, 32, 0, 32, 2,112, 1,120, 0, 16, 30, 80, 0, 72, 0, 56, 13, 72, 0,148, 0, 20, 0, 24, 1, 64, 0, 0,
+ 0, 0, 0, 0, 0,248, 0, 0, 1, 24, 0, 88, 0, 16, 0, 8, 0, 44, 0,252, 0,212, 1,168, 0,216, 0, 16, 0, 12, 0, 24,
+ 0, 52, 0, 16, 0, 20, 0, 16, 0, 24, 1, 56, 0, 0, 0, 56, 0, 52, 0, 48, 0, 8, 0, 44, 0, 72, 0,104, 0, 40, 0, 8,
+ 0, 72, 0, 44, 0, 40, 0,108, 0, 72, 0, 68, 0, 76, 0, 80, 0, 60, 0,128, 0, 76, 0, 60, 0, 12, 0, 92, 0, 32, 0, 68,
+ 0, 80, 0, 16, 0, 76, 0,108, 0, 84, 0, 28, 0, 96, 0, 56, 0, 56, 0,108, 0,140, 0, 4, 0, 20, 0, 12, 0, 8, 0, 80,
+ 0, 24, 1, 16, 0,144, 0, 16, 1,192, 0, 4, 0, 40, 0,104, 1, 24, 0, 64, 0, 44, 0, 72, 0,116, 0, 60, 0,112, 0, 16,
+ 0, 52, 0, 44, 0, 44, 0, 44, 0, 8, 0, 36, 0, 68, 0, 64, 0, 44, 0, 44, 0, 20, 0, 52, 0, 96, 0, 12, 0,108, 0, 92,
+ 0, 52, 0, 28, 0, 28, 0, 28, 0, 52, 0, 20, 0, 60, 0,140, 0, 36, 0,124, 0, 32, 0, 12, 0,212, 0, 0, 0, 0, 0, 16,
+ 0, 40, 0, 28, 0, 12, 0, 12, 1, 16, 0, 44, 0, 24, 0, 8, 0, 64, 0, 32, 0, 24, 0, 8, 0, 24, 0, 32, 0, 8, 0, 96,
+ 0, 20, 0, 32, 0, 12, 0, 44, 0, 20, 0, 68, 0,240, 0, 24, 0, 56, 0, 52, 0, 20, 0, 16, 0, 64, 0, 28, 0, 20, 0,180,
+ 0, 60, 2, 48, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 20, 0, 24, 0,172, 0, 28, 0,168, 0,148, 0,152, 0, 0,
+ 0, 0, 0, 0, 0,104, 0, 0, 0, 96, 0, 0, 0, 88, 0, 20, 0, 24, 0, 16, 0, 20, 0, 8, 0, 8, 0, 24, 0, 20, 0, 20,
+ 0, 48, 1,208, 1, 28, 0, 16, 0, 68, 1, 0, 0, 20, 0,160, 0, 88, 0, 96, 0,152, 0, 20, 0, 56, 0, 48, 0, 68, 0, 56,
+ 0, 92, 0, 64, 0, 56, 0, 96, 0, 0, 0, 0, 83, 84, 82, 67, 0, 0, 1,145, 0, 10, 0, 2, 0, 10, 0, 0, 0, 10, 0, 1,
+ 0, 11, 0, 3, 0, 11, 0, 0, 0, 11, 0, 1, 0, 9, 0, 2, 0, 12, 0, 2, 0, 9, 0, 3, 0, 9, 0, 4, 0, 13, 0, 2,
+ 0, 2, 0, 5, 0, 2, 0, 6, 0, 14, 0, 2, 0, 7, 0, 5, 0, 7, 0, 6, 0, 15, 0, 4, 0, 4, 0, 7, 0, 4, 0, 8,
+ 0, 4, 0, 9, 0, 4, 0, 10, 0, 16, 0, 4, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 17, 0, 4,
+ 0, 9, 0, 11, 0, 12, 0, 12, 0, 4, 0, 13, 0, 4, 0, 14, 0, 18, 0, 10, 0, 18, 0, 0, 0, 18, 0, 1, 0, 0, 0, 15,
+ 0, 0, 0, 16, 0, 2, 0, 17, 0, 0, 0, 18, 0, 4, 0, 19, 0, 17, 0, 20, 0, 4, 0, 21, 0, 4, 0, 22, 0, 19, 0, 9,
+ 0, 9, 0, 0, 0, 9, 0, 1, 0, 19, 0, 23, 0, 20, 0, 24, 0, 0, 0, 25, 0, 2, 0, 26, 0, 2, 0, 17, 0, 4, 0, 27,
+ 0, 18, 0, 28, 0, 20, 0, 8, 0, 19, 0, 29, 0, 19, 0, 30, 0, 21, 0, 31, 0, 0, 0, 32, 0, 0, 0, 33, 0, 4, 0, 34,
+ 0, 4, 0, 35, 0, 20, 0, 36, 0, 22, 0, 5, 0, 4, 0, 37, 0, 4, 0, 38, 0, 2, 0, 39, 0, 2, 0, 40, 0, 4, 0, 41,
+ 0, 23, 0, 6, 0, 24, 0, 42, 0, 2, 0, 43, 0, 2, 0, 44, 0, 2, 0, 15, 0, 2, 0, 17, 0, 0, 0, 45, 0, 25, 0, 21,
+ 0, 25, 0, 0, 0, 25, 0, 1, 0, 26, 0, 46, 0, 27, 0, 47, 0, 16, 0, 48, 0, 16, 0, 49, 0, 2, 0, 43, 0, 2, 0, 44,
+ 0, 2, 0, 50, 0, 2, 0, 51, 0, 2, 0, 52, 0, 2, 0, 53, 0, 2, 0, 17, 0, 2, 0, 54, 0, 7, 0, 9, 0, 7, 0, 10,
+ 0, 4, 0, 55, 0, 7, 0, 56, 0, 7, 0, 57, 0, 7, 0, 58, 0, 23, 0, 59, 0, 28, 0, 7, 0, 19, 0, 29, 0, 12, 0, 60,
+ 0, 16, 0, 61, 0, 2, 0, 43, 0, 2, 0, 62, 0, 2, 0, 63, 0, 2, 0, 35, 0, 29, 0, 16, 0, 29, 0, 0, 0, 29, 0, 1,
+ 0, 7, 0, 64, 0, 7, 0, 58, 0, 2, 0, 15, 0, 2, 0, 44, 0, 2, 0, 65, 0, 2, 0, 17, 0, 4, 0, 66, 0, 4, 0, 67,
+ 0, 9, 0, 2, 0, 7, 0, 68, 0, 0, 0, 18, 0, 0, 0, 69, 0, 7, 0, 70, 0, 7, 0, 71, 0, 30, 0, 13, 0, 19, 0, 29,
+ 0, 31, 0, 72, 0, 29, 0, 73, 0, 0, 0, 74, 0, 4, 0, 75, 0, 7, 0, 58, 0, 12, 0, 76, 0, 28, 0, 77, 0, 19, 0, 78,
+ 0, 2, 0, 15, 0, 2, 0, 79, 0, 2, 0, 80, 0, 2, 0, 17, 0, 32, 0, 6, 0, 32, 0, 0, 0, 32, 0, 1, 0, 0, 0, 81,
+ 0, 0, 0, 82, 0, 4, 0, 21, 0, 4, 0, 83, 0, 33, 0, 10, 0, 33, 0, 0, 0, 33, 0, 1, 0, 4, 0, 84, 0, 4, 0, 85,
+ 0, 4, 0, 86, 0, 4, 0, 87, 0, 4, 0, 12, 0, 4, 0, 88, 0, 0, 0, 89, 0, 0, 0, 90, 0, 34, 0, 15, 0, 19, 0, 29,
+ 0, 0, 0, 91, 0, 4, 0, 88, 0, 4, 0, 92, 0, 12, 0, 93, 0, 32, 0, 94, 0, 32, 0, 95, 0, 4, 0, 96, 0, 4, 0, 97,
+ 0, 12, 0, 98, 0, 0, 0, 99, 0, 4, 0,100, 0, 4, 0,101, 0, 9, 0,102, 0, 8, 0,103, 0, 35, 0, 3, 0, 4, 0,104,
+ 0, 4, 0,105, 0, 9, 0, 2, 0, 36, 0, 15, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 15, 0, 2, 0, 17, 0, 7, 0,106,
+ 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0,109, 0, 7, 0,110, 0, 7, 0,111, 0, 7, 0,112, 0, 7, 0,113, 0, 7, 0,114,
+ 0, 28, 0, 77, 0, 24, 0,115, 0, 37, 0, 14, 0, 38, 0,116, 0, 4, 0,117, 0, 4, 0,118, 0, 4, 0,119, 0, 4, 0,120,
+ 0, 0, 0,121, 0, 0, 0,122, 0, 0, 0,123, 0, 0, 0, 35, 0, 2, 0,124, 0, 2, 0,125, 0, 2, 0,126, 0, 2, 0, 17,
+ 0, 4, 0, 67, 0, 39, 0, 32, 0, 19, 0, 29, 0, 0, 0, 32, 0, 12, 0,127, 0, 40, 0,128, 0, 41, 0,129, 0, 42, 0,130,
+ 0, 42, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0, 2, 0,123, 0, 2, 0, 17, 0, 2, 0,134, 0, 2, 0, 15, 0, 4, 0,135,
+ 0, 2, 0,136, 0, 2, 0,137, 0, 2, 0,138, 0, 2, 0,139, 0, 2, 0,140, 0, 2, 0,141, 0, 4, 0,142, 0, 4, 0,143,
+ 0, 35, 0,144, 0, 22, 0,145, 0, 7, 0,146, 0, 4, 0,147, 0, 2, 0,148, 0, 2, 0,149, 0, 2, 0,150, 0, 2, 0,151,
+ 0, 7, 0,152, 0, 7, 0,153, 0, 43, 0, 65, 0, 2, 0,154, 0, 2, 0,155, 0, 2, 0,156, 0, 2, 0,157, 0, 24, 0,158,
+ 0, 44, 0,159, 0, 0, 0,160, 0, 0, 0,161, 0, 0, 0,162, 0, 0, 0,163, 0, 0, 0,164, 0, 7, 0,165, 0, 7, 0,166,
+ 0, 7, 0,167, 0, 2, 0,168, 0, 2, 0,169, 0, 2, 0,170, 0, 2, 0,171, 0, 2, 0,172, 0, 2, 0,173, 0, 0, 0,174,
+ 0, 0, 0,175, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,179, 0, 7, 0,180, 0, 7, 0, 54, 0, 7, 0,181,
+ 0, 7, 0,182, 0, 7, 0,183, 0, 7, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0, 7, 0,187, 0, 7, 0,188, 0, 7, 0,189,
+ 0, 7, 0,190, 0, 7, 0,191, 0, 7, 0,192, 0, 7, 0,193, 0, 7, 0,194, 0, 7, 0,195, 0, 7, 0,196, 0, 7, 0,197,
+ 0, 7, 0,198, 0, 7, 0,199, 0, 7, 0,200, 0, 7, 0,201, 0, 7, 0,202, 0, 7, 0,203, 0, 7, 0,204, 0, 7, 0,205,
+ 0, 7, 0,206, 0, 7, 0,207, 0, 7, 0,208, 0, 7, 0,209, 0, 7, 0,210, 0, 7, 0,211, 0, 7, 0,212, 0, 7, 0,213,
+ 0, 7, 0,214, 0, 7, 0,215, 0, 7, 0,216, 0, 7, 0,217, 0, 45, 0, 15, 0, 0, 0,218, 0, 9, 0,219, 0, 0, 0,220,
+ 0, 0, 0,221, 0, 4, 0,222, 0, 4, 0,223, 0, 9, 0,224, 0, 7, 0,225, 0, 7, 0,226, 0, 7, 0,227, 0, 4, 0,228,
+ 0, 9, 0,229, 0, 9, 0,230, 0, 4, 0,231, 0, 4, 0, 35, 0, 46, 0, 6, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178,
+ 0, 7, 0,232, 0, 7, 0, 64, 0, 4, 0, 61, 0, 47, 0, 5, 0, 2, 0, 17, 0, 2, 0, 34, 0, 2, 0, 61, 0, 2, 0,233,
+ 0, 46, 0,227, 0, 48, 0, 17, 0, 24, 0,158, 0, 39, 0,234, 0, 49, 0,235, 0, 7, 0,236, 0, 7, 0,237, 0, 2, 0, 15,
+ 0, 2, 0,238, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 0,239, 0, 4, 0,240, 0, 2, 0,241, 0, 2, 0,242, 0, 4, 0,123,
+ 0, 4, 0,135, 0, 2, 0,243, 0, 2, 0,244, 0, 50, 0, 22, 0, 2, 0, 17, 0, 2, 0,245, 0, 7, 0,246, 0, 7, 0,247,
+ 0, 2, 0,134, 0, 2, 0,248, 0, 4, 0,249, 0, 4, 0,250, 0, 24, 0,158, 0, 4, 0,251, 0, 2, 0,252, 0, 2, 0,253,
+ 0, 9, 0,254, 0, 7, 0,255, 0, 7, 1, 0, 0, 2, 1, 1, 0, 2, 1, 2, 0, 2, 1, 3, 0, 2, 1, 4, 0, 7, 1, 5,
+ 0, 7, 1, 6, 0, 47, 1, 7, 0, 51, 0, 13, 0, 4, 1, 8, 0, 4, 1, 9, 0, 2, 1, 10, 0, 2, 0, 17, 0, 2, 1, 11,
+ 0, 2, 1, 12, 0, 24, 0,158, 0, 7, 1, 13, 0, 4, 1, 14, 0, 0, 1, 15, 0, 7, 1, 16, 0, 4, 1, 17, 0, 4, 0,123,
+ 0, 44, 0, 63, 0, 19, 0, 29, 0, 31, 0, 72, 0, 7, 1, 18, 0, 7, 1, 19, 0, 7, 1, 20, 0, 7, 1, 21, 0, 7, 1, 22,
+ 0, 7, 1, 23, 0, 7, 1, 24, 0, 7, 1, 25, 0, 7, 1, 26, 0, 7, 0, 67, 0, 7, 1, 27, 0, 7, 1, 28, 0, 7, 1, 29,
+ 0, 7, 1, 30, 0, 7, 1, 31, 0, 7, 1, 32, 0, 7, 1, 33, 0, 7, 1, 34, 0, 7, 1, 35, 0, 7, 1, 36, 0, 7, 1, 37,
+ 0, 7, 1, 38, 0, 2, 1, 39, 0, 2, 1, 40, 0, 2, 1, 41, 0, 2, 1, 42, 0, 2, 1, 43, 0, 2, 1, 44, 0, 2, 1, 45,
+ 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0,238, 0, 7, 1, 46, 0, 7, 1, 47, 0, 7, 1, 48, 0, 7, 1, 49, 0, 4, 1, 50,
+ 0, 4, 1, 51, 0, 2, 1, 52, 0, 2, 1, 53, 0, 2, 1, 11, 0, 2, 0,121, 0, 4, 0, 21, 0, 4, 0,118, 0, 4, 0,119,
+ 0, 4, 0,120, 0, 7, 1, 54, 0, 7, 1, 55, 0, 7, 0, 87, 0, 37, 1, 56, 0, 52, 1, 57, 0, 28, 0, 77, 0, 39, 0,234,
+ 0, 45, 1, 58, 0, 47, 1, 7, 0, 48, 1, 59, 0, 22, 0,145, 0, 50, 1, 60, 0, 51, 1, 61, 0, 0, 1, 62, 0, 0, 0,175,
+ 0, 53, 0, 8, 0, 7, 1, 63, 0, 7, 1, 64, 0, 7, 0,166, 0, 4, 0, 17, 0, 7, 1, 65, 0, 7, 1, 66, 0, 7, 1, 67,
+ 0, 24, 0, 42, 0, 54, 0, 72, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0, 15, 0, 2, 0, 17, 0, 4, 1, 68, 0, 2, 0,169,
+ 0, 2, 1, 69, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 0,179, 0, 7, 1, 70, 0, 7, 1, 71, 0, 7, 1, 72,
+ 0, 7, 1, 73, 0, 7, 1, 74, 0, 7, 1, 75, 0, 7, 1, 76, 0, 7, 1, 77, 0, 7, 1, 78, 0, 7, 1, 79, 0, 7, 1, 80,
+ 0, 55, 1, 81, 0, 2, 0,245, 0, 2, 0, 67, 0, 7, 0,107, 0, 7, 0,108, 0, 7, 1, 82, 0, 7, 1, 83, 0, 7, 1, 84,
+ 0, 7, 1, 85, 0, 7, 1, 86, 0, 2, 1, 87, 0, 2, 1, 88, 0, 2, 1, 89, 0, 2, 1, 90, 0, 0, 1, 91, 0, 0, 1, 92,
+ 0, 2, 1, 93, 0, 2, 1, 94, 0, 2, 1, 95, 0, 2, 1, 96, 0, 2, 1, 97, 0, 7, 1, 98, 0, 7, 1, 99, 0, 7, 1,100,
+ 0, 7, 1,101, 0, 2, 1,102, 0, 2, 0, 87, 0, 2, 1,103, 0, 2, 1,104, 0, 2, 1,105, 0, 2, 1,106, 0, 7, 1,107,
+ 0, 7, 1,108, 0, 7, 1,109, 0, 7, 1,110, 0, 7, 1,111, 0, 7, 1,112, 0, 7, 1,113, 0, 7, 1,114, 0, 7, 1,115,
+ 0, 7, 1,116, 0, 7, 1,117, 0, 7, 1,118, 0, 2, 1,119, 0, 0, 1,120, 0, 28, 0, 77, 0, 43, 1,121, 0, 2, 1,122,
+ 0, 0, 1,123, 0, 22, 0,145, 0, 56, 0, 18, 0, 7, 1,124, 0, 7, 1,125, 0, 7, 1,126, 0, 7, 1,127, 0, 7, 1,128,
+ 0, 7, 1,129, 0, 7, 1,130, 0, 7, 1,131, 0, 7, 1,132, 0, 7, 1,133, 0, 2, 1,134, 0, 2, 1,135, 0, 2, 1,136,
+ 0, 2, 1,137, 0, 7, 1,138, 0, 7, 1,139, 0, 7, 1,140, 0, 7, 1,141, 0, 57, 0,125, 0, 19, 0, 29, 0, 31, 0, 72,
+ 0, 2, 1,142, 0, 2, 0, 17, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 7, 1,143, 0, 7, 1,144, 0, 7, 1,145,
+ 0, 7, 1,146, 0, 7, 1,147, 0, 7, 1,148, 0, 7, 1,149, 0, 7, 1,150, 0, 7, 1,151, 0, 7, 1,152, 0, 7, 1,153,
+ 0, 7, 1,154, 0, 7, 1,155, 0, 7, 1,156, 0, 7, 1,157, 0, 7, 1,158, 0, 7, 1,159, 0, 7, 1,160, 0, 7, 1,161,
+ 0, 7, 1,162, 0, 56, 1,163, 0, 7, 1,164, 0, 7, 1,165, 0, 7, 1,166, 0, 7, 1,167, 0, 7, 1,168, 0, 7, 1,169,
+ 0, 7, 1,170, 0, 2, 1,171, 0, 2, 1,172, 0, 2, 1,173, 0, 0, 1,174, 0, 0, 1,175, 0, 7, 1,176, 0, 7, 1,177,
+ 0, 2, 1,178, 0, 2, 1,179, 0, 7, 1,180, 0, 7, 1,181, 0, 7, 1,182, 0, 7, 1,183, 0, 2, 1,184, 0, 2, 1,185,
+ 0, 4, 1, 68, 0, 4, 1,186, 0, 2, 1,187, 0, 2, 1,188, 0, 2, 1,189, 0, 2, 1,190, 0, 7, 1,191, 0, 7, 1,192,
+ 0, 7, 1,193, 0, 7, 1,194, 0, 7, 1,195, 0, 7, 1,196, 0, 7, 1,197, 0, 7, 1,198, 0, 7, 1,199, 0, 7, 1,200,
+ 0, 0, 1,201, 0, 7, 1,202, 0, 7, 1,203, 0, 7, 1,204, 0, 4, 1,205, 0, 0, 1,206, 0, 0, 1,103, 0, 0, 1,207,
+ 0, 0, 1, 62, 0, 2, 1,208, 0, 2, 1,209, 0, 2, 1,122, 0, 2, 1,210, 0, 2, 1,211, 0, 2, 1,212, 0, 7, 1,213,
+ 0, 7, 1,214, 0, 7, 1,215, 0, 7, 1,216, 0, 7, 1,217, 0, 2, 0,154, 0, 2, 0,155, 0, 47, 1,218, 0, 47, 1,219,
+ 0, 0, 1,220, 0, 0, 1,221, 0, 0, 1,222, 0, 0, 1,223, 0, 2, 1,224, 0, 2, 1,225, 0, 7, 1,226, 0, 7, 1,227,
+ 0, 43, 1,121, 0, 52, 1, 57, 0, 28, 0, 77, 0, 58, 1,228, 0, 22, 0,145, 0, 7, 1,229, 0, 7, 1,230, 0, 7, 1,231,
+ 0, 7, 1,232, 0, 7, 1,233, 0, 2, 1,234, 0, 2, 0, 67, 0, 7, 1,235, 0, 7, 1,236, 0, 7, 1,237, 0, 7, 1,238,
+ 0, 7, 1,239, 0, 7, 1,240, 0, 7, 1,241, 0, 7, 1,242, 0, 7, 1,243, 0, 2, 1,244, 0, 2, 1,245, 0, 4, 1,246,
+ 0, 2, 1,247, 0, 2, 0, 35, 0, 12, 1,248, 0, 59, 0, 4, 0, 19, 0, 29, 0, 0, 1,249, 0, 60, 0, 2, 0, 35, 0,144,
+ 0, 61, 0, 26, 0, 61, 0, 0, 0, 61, 0, 1, 0, 62, 1,250, 0, 4, 1,251, 0, 4, 1,252, 0, 4, 1,253, 0, 4, 1,254,
+ 0, 4, 1,255, 0, 4, 2, 0, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 2, 1, 0, 2, 2, 2, 0, 7, 0, 5, 0, 7, 0, 6,
+ 0, 7, 2, 3, 0, 7, 2, 4, 0, 7, 2, 5, 0, 7, 2, 6, 0, 7, 2, 7, 0, 7, 2, 8, 0, 7, 2, 9, 0, 7, 2, 10,
+ 0, 7, 0, 21, 0, 7, 2, 11, 0, 7, 2, 12, 0, 63, 0, 20, 0, 19, 0, 29, 0, 31, 0, 72, 0, 62, 1,250, 0, 12, 2, 13,
+ 0, 12, 2, 14, 0, 12, 2, 15, 0, 28, 0, 77, 0, 57, 2, 16, 0, 0, 0, 17, 0, 0, 2, 17, 0, 2, 2, 18, 0, 2, 0,168,
+ 0, 2, 0, 35, 0, 7, 1, 63, 0, 7, 0,166, 0, 7, 1, 64, 0, 7, 2, 19, 0, 7, 2, 20, 0, 7, 2, 21, 0, 61, 2, 22,
+ 0, 27, 0, 11, 0, 7, 2, 23, 0, 7, 2, 24, 0, 7, 2, 25, 0, 7, 0,247, 0, 2, 0, 52, 0, 0, 2, 26, 0, 0, 2, 27,
+ 0, 0, 2, 28, 0, 0, 2, 29, 0, 0, 2, 30, 0, 0, 2, 31, 0, 26, 0, 7, 0, 7, 2, 32, 0, 7, 2, 24, 0, 7, 2, 25,
+ 0, 2, 2, 28, 0, 2, 2, 31, 0, 7, 0,247, 0, 7, 0, 35, 0, 64, 0, 21, 0, 64, 0, 0, 0, 64, 0, 1, 0, 2, 0, 15,
+ 0, 2, 2, 33, 0, 2, 2, 31, 0, 2, 0, 17, 0, 2, 2, 34, 0, 2, 2, 35, 0, 2, 2, 36, 0, 2, 2, 37, 0, 2, 2, 38,
+ 0, 2, 2, 39, 0, 2, 2, 40, 0, 2, 2, 41, 0, 7, 2, 42, 0, 7, 2, 43, 0, 26, 0, 46, 0, 27, 0, 47, 0, 2, 2, 44,
+ 0, 2, 2, 45, 0, 4, 2, 46, 0, 65, 0, 5, 0, 2, 2, 47, 0, 2, 2, 33, 0, 0, 0, 17, 0, 0, 0, 35, 0, 2, 0, 67,
+ 0, 66, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 2, 48, 0, 7, 2, 49, 0, 67, 0, 4, 0, 12, 2, 50, 0, 68, 2, 51,
+ 0, 4, 2, 52, 0, 0, 0, 90, 0, 69, 0, 68, 0, 19, 0, 29, 0, 31, 0, 72, 0, 62, 1,250, 0, 12, 2, 53, 0, 12, 2, 14,
+ 0, 67, 2, 54, 0, 24, 2, 55, 0, 24, 2, 56, 0, 24, 2, 57, 0, 28, 0, 77, 0, 70, 2, 58, 0, 30, 2, 59, 0, 57, 2, 16,
+ 0, 12, 2, 60, 0, 7, 1, 63, 0, 7, 0,166, 0, 7, 1, 64, 0, 2, 0,168, 0, 2, 0, 87, 0, 2, 2, 61, 0, 2, 2, 62,
+ 0, 7, 2, 63, 0, 7, 2, 64, 0, 4, 2, 65, 0, 2, 0, 35, 0, 2, 2, 18, 0, 2, 0, 17, 0, 2, 2, 66, 0, 7, 2, 67,
+ 0, 7, 2, 68, 0, 7, 2, 69, 0, 2, 2, 36, 0, 2, 2, 37, 0, 2, 2, 70, 0, 2, 2, 71, 0, 4, 2, 72, 0, 9, 2, 73,
+ 0, 2, 0, 21, 0, 2, 0, 93, 0, 2, 0, 64, 0, 2, 2, 74, 0, 7, 2, 75, 0, 7, 2, 76, 0, 7, 2, 77, 0, 7, 2, 78,
+ 0, 7, 2, 79, 0, 7, 2, 80, 0, 7, 2, 81, 0, 7, 2, 82, 0, 7, 2, 83, 0, 7, 2, 84, 0, 0, 2, 85, 0, 71, 2, 86,
+ 0, 72, 2, 87, 0, 0, 2, 88, 0, 59, 2, 89, 0, 59, 2, 90, 0, 59, 2, 91, 0, 59, 2, 92, 0, 4, 2, 93, 0, 7, 2, 94,
+ 0, 4, 2, 95, 0, 4, 2, 96, 0, 66, 2, 97, 0, 4, 2, 98, 0, 4, 2, 99, 0, 65, 2,100, 0, 65, 2,101, 0, 73, 0, 39,
+ 0, 19, 0, 29, 0, 31, 0, 72, 0, 62, 1,250, 0, 28, 0, 77, 0, 30, 2, 59, 0, 57, 2, 16, 0, 74, 2,102, 0, 75, 2,103,
+ 0, 76, 2,104, 0, 77, 2,105, 0, 78, 2,106, 0, 79, 2,107, 0, 80, 2,108, 0, 81, 2,109, 0, 73, 2,110, 0, 82, 2,111,
+ 0, 83, 2,112, 0, 84, 2,113, 0, 84, 2,114, 0, 84, 2,115, 0, 4, 0, 51, 0, 4, 2,116, 0, 4, 2,117, 0, 4, 2,118,
+ 0, 4, 2,119, 0, 7, 1, 63, 0, 7, 0,166, 0, 7, 1, 64, 0, 2, 0,168, 0, 2, 2, 61, 0, 2, 2,120, 0, 2, 0, 17,
+ 0, 2, 2,121, 0, 2, 2,122, 0, 0, 2,123, 0, 0, 2,124, 0, 2, 2, 18, 0, 85, 2,125, 0, 86, 2,126, 0, 76, 0, 8,
+ 0, 9, 2,127, 0, 7, 2,128, 0, 4, 2,129, 0, 0, 0, 17, 0, 0, 2,130, 0, 2, 1, 68, 0, 2, 2,131, 0, 2, 2,132,
+ 0, 74, 0, 7, 0, 4, 2,133, 0, 4, 2,134, 0, 4, 2,135, 0, 4, 2,136, 0, 2, 2, 33, 0, 0, 2,137, 0, 0, 0, 17,
+ 0, 78, 0, 5, 0, 4, 2,133, 0, 4, 2,134, 0, 0, 2,138, 0, 0, 2,139, 0, 2, 0, 17, 0, 87, 0, 2, 0, 4, 2,140,
+ 0, 7, 2, 25, 0, 79, 0, 3, 0, 87, 2,141, 0, 4, 2,142, 0, 4, 0, 17, 0, 77, 0, 4, 0, 7, 2,143, 0, 2, 2,144,
+ 0, 0, 0, 17, 0, 0, 2,139, 0, 80, 0, 4, 0, 0, 0,232, 0, 0, 0,176, 0, 0, 0,177, 0, 0, 0,178, 0, 88, 0, 6,
+ 0, 39, 2,127, 0, 0, 0, 17, 0, 0, 2,130, 0, 2, 1, 68, 0, 2, 2,131, 0, 2, 2,132, 0, 89, 0, 1, 0, 7, 2,145,
+ 0, 90, 0, 5, 0, 0, 0,232, 0, 0, 0,176, 0, 0, 0,177, 0, 0, 0,178, 0, 4, 0, 35, 0, 81, 0, 1, 0, 7, 2,146,
+ 0, 82, 0, 2, 0, 4, 2,147, 0, 4, 0, 15, 0, 75, 0, 7, 0, 7, 2,128, 0, 39, 2,127, 0, 0, 0, 17, 0, 0, 2,130,
+ 0, 2, 1, 68, 0, 2, 2,131, 0, 2, 2,132, 0, 91, 0, 1, 0, 7, 2,148, 0, 92, 0, 1, 0, 4, 2,149, 0, 93, 0, 1,
+ 0, 0, 2,150, 0, 94, 0, 1, 0, 7, 2,128, 0, 95, 0, 3, 0, 4, 2,151, 0, 0, 0, 90, 0, 7, 2,152, 0, 96, 0, 4,
+ 0, 7, 0,232, 0, 7, 0,176, 0, 7, 0,177, 0, 7, 0,178, 0, 97, 0, 1, 0, 96, 2,129, 0, 98, 0, 5, 0, 4, 2,153,
+ 0, 4, 2,154, 0, 0, 0, 17, 0, 0, 2, 33, 0, 0, 2,155, 0, 99, 0, 2, 0, 4, 2,156, 0, 4, 2,154, 0,100, 0, 10,
+ 0,100, 0, 0, 0,100, 0, 1, 0, 98, 2,157, 0, 97, 2,158, 0, 99, 2,159, 0, 4, 0, 51, 0, 4, 2,117, 0, 4, 2,116,
+ 0, 4, 0, 35, 0, 77, 2,160, 0, 85, 0, 14, 0, 12, 2,161, 0, 77, 2,160, 0, 0, 2,162, 0, 0, 2,163, 0, 0, 2,164,
+ 0, 0, 2,165, 0, 0, 2,166, 0, 0, 2,167, 0, 0, 2,168, 0, 0, 0, 17, 0, 84, 2,113, 0, 84, 2,115, 0, 2, 2,169,
+ 0, 0, 2,170, 0, 86, 0, 8, 0, 4, 2,171, 0, 4, 2,172, 0, 74, 2,173, 0, 78, 2,174, 0, 4, 2,117, 0, 4, 2,116,
+ 0, 4, 0, 51, 0, 4, 0, 35, 0,101, 0, 9, 0,101, 0, 0, 0,101, 0, 1, 0, 4, 0, 15, 0, 4, 1, 68, 0, 4, 2,175,
+ 0, 4, 0, 35, 0, 0, 0, 18, 0, 38, 0,116, 0, 0, 2,176, 0,102, 0, 7, 0,101, 2,177, 0, 2, 2,178, 0, 2, 2,161,
+ 0, 2, 2,179, 0, 2, 0, 88, 0, 9, 2,180, 0, 9, 2,181, 0,103, 0, 3, 0,101, 2,177, 0, 24, 0,158, 0, 0, 0, 18,
+ 0,104, 0, 5, 0,101, 2,177, 0, 24, 0,158, 0, 0, 0, 18, 0, 2, 2,182, 0, 0, 2,183, 0,105, 0, 5, 0,101, 2,177,
+ 0, 7, 0, 85, 0, 7, 2,184, 0, 4, 2,185, 0, 4, 2,186, 0,106, 0, 5, 0,101, 2,177, 0, 24, 2,187, 0, 0, 0, 69,
+ 0, 4, 1, 68, 0, 4, 0, 17, 0,107, 0, 13, 0,101, 2,177, 0, 24, 2,188, 0, 24, 2,189, 0, 24, 2,190, 0, 24, 2,191,
+ 0, 7, 2,192, 0, 7, 2,193, 0, 7, 2,184, 0, 7, 2,194, 0, 4, 2,195, 0, 4, 2,196, 0, 4, 0, 88, 0, 4, 2,197,
+ 0,108, 0, 5, 0,101, 2,177, 0, 2, 2,198, 0, 2, 0, 17, 0, 7, 2,199, 0, 24, 2,200, 0,109, 0, 3, 0,101, 2,177,
+ 0, 7, 2,201, 0, 4, 0, 88, 0,110, 0, 10, 0,101, 2,177, 0, 7, 2,202, 0, 4, 2,203, 0, 4, 0, 35, 0, 2, 0, 88,
+ 0, 2, 2,204, 0, 2, 2,205, 0, 2, 2,206, 0, 7, 2,207, 0, 0, 2,208, 0,111, 0, 3, 0,101, 2,177, 0, 7, 0, 35,
+ 0, 4, 0, 15, 0,112, 0, 6, 0,101, 2,177, 0,113, 2,209, 0,114, 2,210, 0,115, 2,211, 0, 7, 2,212, 0, 4, 0, 15,
+ 0,116, 0, 11, 0,101, 2,177, 0, 44, 2,213, 0, 7, 2,214, 0, 4, 2,215, 0, 0, 2,208, 0, 7, 2,216, 0, 4, 2,217,
+ 0, 24, 2,218, 0, 0, 2,219, 0, 4, 2,220, 0, 4, 0, 35, 0,117, 0, 12, 0,101, 2,177, 0, 24, 2,221, 0, 39, 2,222,
+ 0, 4, 0, 88, 0, 4, 2,223, 0, 7, 2,224, 0, 7, 2,225, 0, 7, 2,226, 0, 7, 2,227, 0, 0, 2,219, 0, 4, 2,220,
+ 0, 4, 0, 35, 0,118, 0, 3, 0,101, 2,177, 0, 7, 2,228, 0, 4, 2,229, 0,119, 0, 5, 0,101, 2,177, 0, 7, 2,230,
+ 0, 0, 2,208, 0, 2, 0, 17, 0, 2, 2,231, 0,120, 0, 8, 0,101, 2,177, 0, 24, 0,158, 0, 7, 2,230, 0, 7, 0,247,
+ 0, 7, 0,104, 0, 0, 2,208, 0, 2, 0, 17, 0, 2, 0, 15, 0,121, 0, 21, 0,101, 2,177, 0, 24, 2,232, 0, 0, 2,208,
+ 0, 44, 2,213, 0, 24, 2,218, 0, 2, 0, 17, 0, 2, 0, 35, 0, 7, 2,233, 0, 7, 2,234, 0, 7, 2,235, 0, 7, 2, 67,
+ 0, 7, 2,236, 0, 7, 2,237, 0, 7, 2,238, 0, 7, 2,239, 0, 4, 2,217, 0, 4, 2,220, 0, 0, 2,219, 0, 7, 2,240,
+ 0, 7, 2,241, 0, 7, 0, 87, 0,122, 0, 7, 0,101, 2,177, 0, 2, 2,242, 0, 2, 2,243, 0, 4, 0, 67, 0, 24, 0,158,
+ 0, 7, 2,244, 0, 0, 2,208, 0,123, 0, 10, 0,101, 2,177, 0, 24, 0,158, 0, 0, 2,245, 0, 7, 2,246, 0, 7, 2,247,
+ 0, 7, 2,239, 0, 4, 2,248, 0, 4, 2,249, 0, 7, 2,250, 0, 0, 0, 18, 0,124, 0, 1, 0,101, 2,177, 0,125, 0, 7,
+ 0,101, 2,177, 0, 38, 0,116, 0,126, 2,251, 0,127, 2,252, 0,128, 2,253, 0,129, 2,254, 0, 12, 2,255, 0,130, 0, 13,
+ 0,101, 2,177, 0, 77, 3, 0, 0, 77, 3, 1, 0, 77, 3, 2, 0, 77, 3, 3, 0, 77, 3, 4, 0, 77, 3, 5, 0, 74, 3, 6,
+ 0, 4, 3, 7, 0, 4, 3, 8, 0, 7, 3, 9, 0, 7, 3, 10, 0,131, 3, 11, 0,132, 0, 7, 0,101, 2,177, 0, 77, 3, 0,
+ 0, 77, 3, 12, 0,133, 3, 13, 0,134, 3, 11, 0, 4, 3, 14, 0, 4, 3, 7, 0,135, 0, 4, 0,101, 2,177, 0, 24, 0,158,
+ 0, 4, 3, 15, 0, 4, 0, 35, 0,136, 0, 2, 0, 4, 3, 16, 0, 7, 2, 25, 0,137, 0, 2, 0, 4, 0,119, 0, 4, 3, 17,
+ 0,138, 0, 24, 0,101, 2,177, 0, 24, 0,158, 0, 0, 2,208, 0, 2, 3, 18, 0, 2, 0, 17, 0, 2, 1, 68, 0, 2, 0, 35,
+ 0,136, 3, 19, 0, 4, 3, 20, 0, 7, 3, 21, 0, 4, 0, 51, 0, 4, 3, 22, 0,137, 3, 23, 0,136, 3, 24, 0, 4, 3, 25,
+ 0, 4, 3, 26, 0, 4, 3, 27, 0, 4, 3, 17, 0, 7, 3, 28, 0, 7, 3, 29, 0, 7, 3, 30, 0, 7, 3, 31, 0, 7, 3, 32,
+ 0, 9, 3, 33, 0,139, 0, 8, 0,101, 2,177, 0,140, 3, 34, 0,133, 3, 13, 0, 4, 3, 35, 0, 4, 3, 36, 0, 4, 3, 37,
+ 0, 2, 0, 17, 0, 2, 0, 54, 0,141, 0, 8, 0,101, 2,177, 0, 24, 0, 42, 0, 2, 0,251, 0, 2, 0, 17, 0, 2, 2,198,
+ 0, 2, 0, 54, 0, 7, 3, 38, 0, 7, 3, 39, 0,142, 0, 6, 0,101, 2,177, 0, 4, 3, 40, 0, 2, 0, 17, 0, 2, 3, 41,
+ 0, 7, 3, 42, 0, 0, 0,160, 0,143, 0, 8, 0,101, 2,177, 0, 0, 3, 43, 0, 0, 3, 44, 0, 0, 2,167, 0, 0, 3, 45,
+ 0, 0, 3, 46, 0, 0, 0, 88, 0, 0, 2,155, 0,144, 0, 3, 0,101, 2,177, 0,145, 3, 47, 0,129, 2,254, 0,146, 0, 10,
+ 0,101, 2,177, 0, 24, 3, 48, 0, 24, 3, 49, 0, 0, 3, 50, 0, 7, 3, 51, 0, 2, 3, 52, 0, 2, 3, 53, 0, 0, 3, 54,
+ 0, 0, 3, 55, 0, 0, 2,183, 0,147, 0, 9, 0,101, 2,177, 0, 24, 3, 56, 0, 0, 3, 50, 0, 7, 3, 57, 0, 7, 3, 58,
+ 0, 0, 1, 68, 0, 0, 2,198, 0, 0, 3, 59, 0, 0, 0, 35, 0,148, 0, 1, 0,101, 2,177, 0,149, 0, 11, 0,101, 2,177,
+ 0, 0, 2,208, 0, 7, 0,119, 0, 7, 3, 60, 0, 7, 3, 61, 0, 7, 3, 62, 0, 7, 3, 63, 0, 4, 0, 17, 0, 2, 3, 64,
+ 0, 2, 3, 65, 0, 4, 0, 35, 0,150, 0, 9, 0,101, 2,177, 0, 24, 3, 66, 0, 4, 3, 67, 0, 4, 3, 68, 0, 4, 3, 69,
+ 0, 7, 3, 70, 0, 7, 3, 71, 0, 2, 2,198, 0, 2, 0, 17, 0,151, 0, 3, 0,152, 3, 72, 0, 4, 2, 52, 0, 0, 0, 90,
+ 0,152, 0, 29, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 2, 34, 0, 2, 2, 35, 0, 2, 3, 73, 0, 2, 0, 17, 0, 2, 3, 74,
+ 0, 2, 3, 75, 0, 2, 3, 76, 0, 2, 0, 67, 0, 0, 3, 77, 0, 0, 3, 78, 0, 0, 3, 79, 0, 0, 1,225, 0, 4, 0, 35,
+ 0, 7, 3, 80, 0, 7, 3, 81, 0, 7, 3, 82, 0, 7, 3, 83, 0, 7, 3, 84, 0, 7, 3, 85, 0, 26, 3, 86, 0, 28, 0, 77,
+ 0, 30, 2, 59, 0, 79, 2,107, 0, 0, 0, 69, 0, 7, 3, 87, 0, 7, 3, 88, 0,151, 3, 89, 0,153, 0, 3, 0,153, 0, 0,
+ 0,153, 0, 1, 0, 0, 0, 18, 0, 62, 0, 3, 0, 7, 3, 90, 0, 4, 0, 17, 0, 4, 0, 35, 0, 24, 0,127, 0, 19, 0, 29,
+ 0, 31, 0, 72, 0,154, 3, 91, 0, 2, 0, 15, 0, 2, 3, 92, 0, 4, 3, 93, 0, 4, 3, 94, 0, 4, 3, 95, 0, 0, 3, 96,
+ 0, 24, 0, 36, 0, 24, 3, 97, 0, 24, 3, 98, 0, 24, 3, 99, 0, 24, 3,100, 0, 28, 0, 77, 0, 70, 2, 58, 0, 62, 1,250,
+ 0,155, 3,101, 0,155, 3,102, 0,156, 3,103, 0, 9, 0, 2, 0,157, 3,104, 0,158, 3,105, 0,159, 3,106, 0, 12, 3,107,
+ 0, 12, 3,108, 0, 12, 2, 14, 0, 12, 3,109, 0, 12, 3,110, 0, 4, 1, 68, 0, 4, 3,111, 0, 57, 2, 16, 0, 0, 3,112,
+ 0, 4, 2, 18, 0, 4, 3,113, 0, 7, 1, 63, 0, 7, 3,114, 0, 7, 3,115, 0, 7, 0,166, 0, 7, 3,116, 0, 7, 1, 64,
+ 0, 7, 3,117, 0, 7, 2, 4, 0, 7, 3,118, 0, 7, 3,119, 0, 7, 3,120, 0, 7, 3,121, 0, 7, 3,122, 0, 7, 3,123,
+ 0, 7, 2,246, 0, 7, 3,124, 0, 7, 0,236, 0, 7, 3,125, 0, 4, 3,126, 0, 2, 0, 17, 0, 2, 3,127, 0, 2, 3,128,
+ 0, 2, 3,129, 0, 2, 3,130, 0, 2, 3,131, 0, 2, 3,132, 0, 2, 3,133, 0, 2, 3,134, 0, 2, 3,135, 0, 2, 3,136,
+ 0, 2, 3,137, 0, 4, 3,138, 0, 4, 3,139, 0, 4, 3,140, 0, 4, 3,141, 0, 7, 3,142, 0, 7, 2, 94, 0, 7, 3,143,
+ 0, 7, 3,144, 0, 7, 3,145, 0, 7, 3,146, 0, 7, 3,147, 0, 7, 0,211, 0, 7, 3,148, 0, 7, 3,149, 0, 7, 3,150,
+ 0, 7, 3,151, 0, 2, 3,152, 0, 0, 3,153, 0, 0, 3,154, 0, 0, 3,155, 0, 0, 3,156, 0, 7, 3,157, 0, 7, 3,158,
+ 0, 12, 3,159, 0, 12, 3,160, 0, 12, 3,161, 0, 12, 3,162, 0, 7, 3,163, 0, 2, 2,147, 0, 2, 3,164, 0, 7, 2,129,
+ 0, 4, 3,165, 0, 4, 3,166, 0,160, 3,167, 0, 2, 3,168, 0, 2, 0,243, 0, 7, 3,169, 0, 12, 3,170, 0, 12, 3,171,
+ 0, 12, 3,172, 0, 12, 3,173, 0,161, 1, 60, 0,162, 3,174, 0, 58, 3,175, 0, 2, 3,176, 0, 2, 3,177, 0, 2, 2, 52,
+ 0, 2, 3,178, 0, 7, 2,120, 0, 2, 3,179, 0, 2, 3,180, 0,145, 3,181, 0,133, 3,182, 0,133, 3,183, 0, 4, 3,184,
+ 0, 4, 3,185, 0, 4, 3,186, 0, 4, 0, 67, 0, 12, 3,187, 0, 12, 3,188, 0, 12, 3,189, 0,163, 0, 14, 0,163, 0, 0,
+ 0,163, 0, 1, 0, 24, 0, 36, 0, 7, 2,246, 0, 7, 1, 65, 0, 7, 2,247, 0, 7, 2,239, 0, 0, 0, 18, 0, 4, 2,248,
+ 0, 4, 2,249, 0, 4, 3,190, 0, 2, 0, 15, 0, 2, 3,191, 0, 7, 2,250, 0,164, 0, 12, 0,164, 0, 0, 0,164, 0, 1,
+ 0, 24, 0, 42, 0, 4, 3,192, 0, 4, 2,147, 0, 4, 3,193, 0, 4, 0, 15, 0, 4, 3,194, 0, 7, 1, 65, 0, 7, 3,195,
+ 0, 7, 3,196, 0, 7, 2,145, 0,161, 0, 40, 0, 4, 0, 17, 0, 2, 3,197, 0, 2, 3,198, 0, 2, 2,239, 0, 2, 3,199,
+ 0, 2, 3,200, 0, 2, 3,201, 0, 2, 3,202, 0, 2, 3,203, 0, 7, 3,204, 0, 7, 3,205, 0, 7, 3,206, 0, 7, 3,207,
+ 0, 7, 3,208, 0, 7, 3,209, 0, 7, 3,210, 0, 7, 3,211, 0, 7, 3,212, 0, 7, 3,213, 0, 7, 3,214, 0, 7, 3,215,
+ 0, 7, 3,216, 0, 7, 3,217, 0, 7, 3,218, 0, 7, 3,219, 0, 7, 3,220, 0, 7, 3,221, 0, 7, 3,222, 0, 7, 3,223,
+ 0, 7, 3,224, 0, 7, 3,225, 0, 7, 3,226, 0, 7, 3,227, 0, 7, 3,228, 0, 7, 3,229, 0, 7, 3,230, 0, 44, 0,159,
+ 0,165, 3,231, 0, 7, 3,232, 0, 4, 2,186, 0,166, 0, 5, 0, 58, 1,228, 0, 7, 3,233, 0, 7, 3,234, 0, 2, 0, 17,
+ 0, 2, 3,235, 0,167, 0, 5, 0,167, 0, 0, 0,167, 0, 1, 0, 4, 0, 15, 0, 4, 3,236, 0, 9, 0, 2, 0,168, 0, 9,
+ 0,168, 0, 0, 0,168, 0, 1, 0, 4, 3,237, 0, 4, 3,238, 0, 4, 3,239, 0, 4, 0, 17, 0, 9, 3,240, 0, 9, 3,241,
+ 0, 12, 3,242, 0,129, 0, 21, 0,129, 0, 0, 0,129, 0, 1, 0, 4, 0, 17, 0, 4, 3,243, 0, 4, 3,244, 0, 4, 3,245,
+ 0, 4, 3,246, 0, 4, 3,247, 0, 4, 3,248, 0, 4, 3,238, 0, 4, 2,147, 0, 2, 3,249, 0, 2, 0, 54, 0, 0, 3,250,
+ 0, 0, 3,251, 0, 0, 3,252, 0, 0, 3,253, 0, 0, 3,254, 0, 12, 3,255, 0,169, 4, 0, 0, 9, 4, 1, 0,170, 0, 1,
+ 0, 7, 2, 32, 0,160, 0, 30, 0, 4, 0, 17, 0, 7, 4, 2, 0, 7, 4, 3, 0, 7, 4, 4, 0, 4, 4, 5, 0, 4, 4, 6,
+ 0, 4, 4, 7, 0, 4, 4, 8, 0, 7, 4, 9, 0, 7, 4, 10, 0, 7, 4, 11, 0, 7, 4, 12, 0, 7, 4, 13, 0, 7, 4, 14,
+ 0, 7, 4, 15, 0, 7, 4, 16, 0, 7, 4, 17, 0, 7, 4, 18, 0, 7, 4, 19, 0, 7, 4, 20, 0, 7, 4, 21, 0, 7, 4, 22,
+ 0, 7, 4, 23, 0, 7, 4, 24, 0, 7, 4, 25, 0, 7, 4, 26, 0, 4, 4, 27, 0, 4, 4, 28, 0, 7, 4, 29, 0, 7, 3,148,
+ 0,162, 0, 54, 0, 4, 3,238, 0, 4, 4, 30, 0,171, 4, 31, 0,172, 4, 32, 0, 0, 0, 35, 0, 0, 4, 33, 0, 2, 4, 34,
+ 0, 7, 4, 35, 0, 0, 4, 36, 0, 7, 4, 37, 0, 7, 4, 38, 0, 7, 4, 39, 0, 7, 4, 40, 0, 7, 4, 41, 0, 7, 4, 42,
+ 0, 7, 4, 43, 0, 7, 4, 44, 0, 7, 4, 45, 0, 2, 4, 46, 0, 0, 4, 47, 0, 2, 4, 48, 0, 7, 4, 49, 0, 7, 4, 50,
+ 0, 0, 4, 51, 0, 4, 0,120, 0, 4, 4, 52, 0, 4, 4, 53, 0, 2, 4, 54, 0, 2, 4, 55, 0,170, 4, 56, 0, 4, 4, 57,
+ 0, 4, 0, 79, 0, 7, 4, 58, 0, 7, 4, 59, 0, 7, 4, 60, 0, 7, 4, 61, 0, 2, 4, 62, 0, 2, 4, 63, 0, 2, 4, 64,
+ 0, 2, 4, 65, 0, 2, 4, 66, 0, 2, 4, 67, 0, 2, 4, 68, 0, 2, 4, 69, 0,173, 4, 70, 0, 7, 4, 71, 0, 7, 4, 72,
+ 0,129, 4, 73, 0, 12, 2,255, 0,166, 4, 74, 0, 7, 4, 75, 0, 7, 4, 76, 0, 7, 4, 77, 0, 0, 4, 78, 0,145, 0, 51,
+ 0,144, 4, 79, 0, 2, 0, 15, 0, 2, 4, 80, 0, 2, 4, 81, 0, 2, 4, 82, 0, 7, 4, 83, 0, 2, 4, 84, 0, 2, 4, 85,
+ 0, 7, 4, 86, 0, 2, 4, 87, 0, 2, 4, 88, 0, 7, 4, 89, 0, 7, 4, 90, 0, 7, 4, 91, 0, 7, 4, 92, 0, 7, 4, 93,
+ 0, 4, 4, 94, 0, 4, 4, 95, 0, 7, 4, 96, 0, 4, 4, 97, 0, 7, 4, 98, 0, 7, 4, 99, 0, 7, 4,100, 0, 73, 4,101,
+ 0, 73, 4,102, 0, 73, 4,103, 0, 0, 4,104, 0, 7, 4,105, 0, 7, 4,106, 0, 28, 0, 77, 0, 2, 4,107, 0, 0, 4,108,
+ 0, 0, 4,109, 0, 7, 4,110, 0, 4, 4,111, 0, 7, 4,112, 0, 7, 4,113, 0, 4, 4,114, 0, 4, 0, 17, 0, 7, 4,115,
+ 0, 7, 4,116, 0, 7, 4,117, 0, 77, 4,118, 0, 7, 4,119, 0, 7, 4,120, 0, 7, 4,121, 0, 7, 4,122, 0, 7, 4,123,
+ 0, 7, 4,124, 0, 7, 4,125, 0, 4, 4,126, 0,174, 0, 76, 0, 19, 0, 29, 0, 31, 0, 72, 0, 2, 0,169, 0, 2, 1, 69,
+ 0, 2, 1,103, 0, 2, 4,127, 0, 7, 4,128, 0, 7, 4,129, 0, 7, 4,130, 0, 7, 4,131, 0, 7, 4,132, 0, 7, 4,133,
+ 0, 7, 1,149, 0, 7, 1,151, 0, 7, 1,150, 0, 7, 0, 67, 0, 4, 4,134, 0, 7, 4,135, 0, 7, 4,136, 0, 7, 4,137,
+ 0, 7, 4,138, 0, 7, 4,139, 0, 7, 4,140, 0, 7, 4,141, 0, 2, 4,142, 0, 2, 1, 68, 0, 2, 4,143, 0, 2, 4,144,
+ 0, 2, 4,145, 0, 2, 4,146, 0, 2, 4,147, 0, 2, 4,148, 0, 7, 4,149, 0, 7, 4,150, 0, 7, 4,151, 0, 7, 4,152,
+ 0, 7, 4,153, 0, 7, 4,154, 0, 7, 4,155, 0, 7, 4,156, 0, 7, 4,157, 0, 7, 4,158, 0, 7, 4,159, 0, 7, 4,160,
+ 0, 2, 4,161, 0, 2, 4,162, 0, 2, 4,163, 0, 2, 4,164, 0, 7, 4,165, 0, 7, 4,166, 0, 7, 4,167, 0, 7, 4,168,
+ 0, 2, 4,169, 0, 2, 4,170, 0, 2, 4,171, 0, 2, 4,172, 0, 7, 4,173, 0, 7, 4,174, 0, 7, 4,175, 0, 7, 4,176,
+ 0, 7, 4,177, 0, 7, 4,178, 0, 7, 4,179, 0, 2, 4,180, 0, 2, 4,181, 0, 2, 4,182, 0, 2, 4,183, 0, 2, 4,184,
+ 0, 2, 0, 17, 0, 7, 4,185, 0, 7, 4,186, 0, 28, 0, 77, 0, 43, 1,121, 0, 2, 1,122, 0, 2, 4,187, 0, 22, 0,145,
+ 0,175, 0, 8, 0,175, 0, 0, 0,175, 0, 1, 0, 4, 3,126, 0, 4, 4,188, 0, 4, 0, 17, 0, 2, 4,189, 0, 2, 4,190,
+ 0, 24, 0,158, 0,176, 0, 13, 0, 9, 4,191, 0, 9, 4,192, 0, 4, 4,193, 0, 4, 4,194, 0, 4, 4,195, 0, 4, 4,196,
+ 0, 4, 4,197, 0, 4, 4,198, 0, 4, 4,199, 0, 4, 4,200, 0, 4, 4,201, 0, 4, 0, 35, 0, 0, 4,202, 0,177, 0, 5,
+ 0, 9, 4,203, 0, 9, 4,204, 0, 4, 4,205, 0, 4, 0, 67, 0, 0, 4,206, 0,178, 0, 17, 0, 4, 4,207, 0, 4, 4,208,
+ 0, 4, 4,209, 0, 4, 4,210, 0, 4, 4,211, 0, 4, 4,212, 0, 4, 4,213, 0, 4, 4,214, 0, 4, 4,215, 0, 4, 4,216,
+ 0, 4, 4,217, 0, 4, 4,218, 0, 2, 4,219, 0, 2, 4,220, 0, 4, 4,221, 0, 4, 4,222, 0, 4, 0, 87, 0,179, 0, 15,
+ 0, 4, 0, 15, 0, 4, 4,209, 0, 4, 4,223, 0, 4, 4,224, 0, 4, 4,225, 0, 4, 4,226, 0, 7, 4,227, 0, 4, 4,228,
+ 0, 4, 0, 88, 0, 4, 4,229, 0, 4, 4,230, 0, 4, 4,231, 0, 4, 4,232, 0, 4, 4,233, 0, 18, 0, 28, 0,180, 0, 7,
+ 0, 4, 4,234, 0, 7, 4,235, 0, 7, 4,236, 0, 7, 4,237, 0, 4, 4,238, 0, 2, 0, 17, 0, 2, 0, 35, 0,181, 0, 11,
+ 0,181, 0, 0, 0,181, 0, 1, 0, 0, 0, 18, 0, 57, 4,239, 0, 58, 4,240, 0, 4, 3,126, 0, 4, 4,241, 0, 4, 4,242,
+ 0, 4, 0, 35, 0, 4, 4,243, 0, 4, 4,244, 0,182, 0,110, 0,176, 4,245, 0,177, 4,246, 0,178, 4,247, 0,179, 4,248,
+ 0, 4, 3, 14, 0, 4, 0,120, 0, 4, 4, 52, 0, 7, 4,249, 0, 4, 4,250, 0, 4, 4,251, 0, 4, 4,252, 0, 4, 4,253,
+ 0, 2, 0, 17, 0, 2, 4,254, 0, 7, 4,255, 0, 7, 5, 0, 0, 7, 5, 1, 0, 7, 5, 2, 0, 7, 5, 3, 0, 2, 5, 4,
+ 0, 2, 5, 5, 0, 2, 5, 6, 0, 2, 5, 7, 0, 2, 0,242, 0, 2, 5, 8, 0, 4, 5, 9, 0, 2, 5, 10, 0, 2, 5, 11,
+ 0, 2, 1, 90, 0, 2, 0,104, 0, 2, 5, 12, 0, 2, 5, 13, 0, 2, 5, 14, 0, 2, 5, 15, 0, 2, 5, 16, 0, 2, 5, 17,
+ 0, 2, 5, 18, 0, 2, 5, 19, 0, 2, 5, 20, 0, 2, 1, 91, 0, 2, 5, 21, 0, 2, 5, 22, 0, 2, 5, 23, 0, 2, 5, 24,
+ 0, 4, 5, 25, 0, 4, 1, 68, 0, 4, 5, 26, 0, 2, 5, 27, 0, 2, 5, 28, 0, 2, 5, 29, 0, 2, 5, 30, 0, 2, 5, 31,
+ 0, 2, 5, 32, 0, 2, 5, 33, 0, 2, 5, 34, 0, 16, 5, 35, 0, 16, 5, 36, 0, 15, 5, 37, 0, 12, 5, 38, 0, 2, 5, 39,
+ 0, 2, 5, 40, 0, 7, 5, 41, 0, 7, 5, 42, 0, 7, 5, 43, 0, 7, 5, 44, 0, 4, 5, 45, 0, 7, 5, 46, 0, 7, 5, 47,
+ 0, 7, 5, 48, 0, 7, 5, 49, 0, 2, 5, 50, 0, 2, 5, 51, 0, 2, 5, 52, 0, 2, 5, 53, 0, 2, 5, 54, 0, 2, 5, 55,
+ 0, 7, 5, 56, 0, 7, 5, 57, 0, 7, 5, 58, 0, 0, 5, 59, 0, 0, 5, 60, 0, 4, 5, 61, 0, 2, 5, 62, 0, 2, 1,225,
+ 0, 0, 5, 63, 0, 7, 5, 64, 0, 7, 5, 65, 0, 0, 5, 66, 0, 0, 5, 67, 0, 0, 5, 68, 0, 0, 5, 69, 0, 4, 5, 70,
+ 0, 2, 5, 71, 0, 2, 5, 72, 0, 7, 5, 73, 0, 7, 5, 74, 0, 2, 5, 75, 0, 2, 5, 76, 0, 7, 5, 77, 0, 2, 5, 78,
+ 0, 2, 5, 79, 0, 4, 5, 80, 0, 2, 5, 81, 0, 2, 5, 82, 0, 2, 5, 83, 0, 2, 5, 84, 0, 7, 5, 85, 0, 7, 0, 67,
+ 0, 34, 5, 86, 0, 0, 5, 87, 0,183, 0, 9, 0,183, 0, 0, 0,183, 0, 1, 0, 0, 0, 18, 0, 2, 5, 88, 0, 2, 5, 89,
+ 0, 2, 5, 90, 0, 2, 0, 87, 0, 7, 5, 91, 0, 7, 0, 67, 0,184, 0, 7, 0, 2, 2,203, 0, 2, 1, 68, 0, 2, 3, 71,
+ 0, 2, 5, 92, 0, 7, 5, 93, 0, 7, 0, 67, 0, 34, 5, 94, 0,185, 0, 5, 0, 7, 5, 95, 0, 0, 0, 15, 0, 0, 0, 87,
+ 0, 0, 0, 67, 0, 0, 1,225, 0,186, 0, 28, 0, 7, 4,140, 0, 7, 4,141, 0, 2, 1, 68, 0, 2, 0, 17, 0, 2, 5, 96,
+ 0, 2, 4,187, 0, 2, 4,143, 0, 2, 4,144, 0, 2, 4,145, 0, 2, 4,146, 0, 2, 4,147, 0, 2, 4,148, 0,185, 5, 97,
+ 0, 2, 5, 4, 0, 2, 5, 5, 0, 2, 5, 6, 0, 2, 5, 7, 0, 2, 0,242, 0, 2, 5, 8, 0, 2, 5, 98, 0, 2, 5, 99,
+ 0,184, 5,100, 0, 2, 5,101, 0, 2, 5, 10, 0, 2, 5, 13, 0, 2, 5, 14, 0, 7, 5,102, 0, 7, 0, 87, 0,187, 0, 6,
+ 0,187, 0, 0, 0,187, 0, 1, 0, 4, 3,237, 0, 0, 3,250, 0, 4, 0, 17, 0, 24, 5,103, 0,188, 0, 4, 0,189, 5,104,
+ 0, 9, 5,105, 0, 0, 5,106, 0, 4, 0, 88, 0,190, 0, 8, 0,188, 5,107, 0, 2, 0, 17, 0, 2, 0, 35, 0, 2, 5,108,
+ 0, 2, 5,109, 0, 2, 5,110, 0, 4, 0, 87, 0, 9, 5,111, 0,191, 0, 6, 0, 2, 0,104, 0, 2, 3,243, 0, 2, 5,112,
+ 0, 2, 2,197, 0, 4, 0, 17, 0, 7, 2,214, 0,192, 0, 14, 0, 2, 0, 17, 0, 2, 5,113, 0, 2, 5,114, 0, 2, 5,115,
+ 0,191, 5,116, 0, 9, 5,111, 0, 7, 5,117, 0, 7, 0, 54, 0, 4, 5,118, 0, 4, 5,119, 0, 4, 5,120, 0, 4, 5,121,
+ 0, 38, 0,116, 0, 24, 0,158, 0,193, 0, 4, 0,193, 0, 0, 0,193, 0, 1, 0, 0, 5,122, 0, 7, 5,123, 0,194, 0, 14,
+ 0,188, 5,107, 0, 4, 0, 88, 0, 4, 5,124, 0, 7, 5,125, 0, 7, 5,126, 0, 7, 5,127, 0, 4, 5,128, 0, 4, 5,129,
+ 0, 7, 5,130, 0, 7, 5,131, 0, 4, 5,132, 0, 7, 5,133, 0, 7, 5,134, 0, 4, 0, 35, 0,195, 0, 7, 0,188, 5,107,
+ 0, 2, 0, 17, 0, 2, 0, 35, 0, 4, 0, 34, 0, 4, 5,135, 0, 79, 5,136, 0, 9, 5,111, 0,196, 0, 82, 0,195, 5,137,
+ 0,195, 5,138, 0,194, 3, 91, 0, 7, 5,139, 0, 2, 5,140, 0, 2, 5,141, 0, 7, 5,142, 0, 7, 5,143, 0, 2, 3,243,
+ 0, 2, 5,144, 0, 7, 5,145, 0, 7, 5,146, 0, 7, 5,147, 0, 2, 5,148, 0, 2, 5,118, 0, 2, 5,149, 0, 2, 5,150,
+ 0, 2, 5,151, 0, 2, 5,152, 0, 7, 5,153, 0, 7, 5,154, 0, 7, 5,155, 0, 2, 5,156, 0, 2, 5,157, 0, 2, 5,158,
+ 0, 2, 5,159, 0, 2, 5,160, 0, 2, 5,161, 0, 2, 5,162, 0, 2, 5,163, 0,190, 5,164, 0,192, 5,165, 0, 7, 5,166,
+ 0, 7, 5,167, 0, 7, 5,168, 0, 2, 5,169, 0, 2, 5,170, 0, 0, 5,171, 0, 0, 5,172, 0, 0, 5,173, 0, 0, 5,174,
+ 0, 0, 5,175, 0, 0, 5,176, 0, 2, 5,177, 0, 7, 5,178, 0, 7, 5,179, 0, 7, 5,180, 0, 7, 5,181, 0, 7, 5,182,
+ 0, 7, 5,183, 0, 7, 5,184, 0, 7, 5,185, 0, 7, 5,186, 0, 7, 5,187, 0, 2, 5,188, 0, 0, 5,189, 0, 0, 5,190,
+ 0, 0, 5,191, 0, 0, 5,192, 0, 24, 5,193, 0, 0, 5,194, 0, 0, 5,195, 0, 0, 5,196, 0, 0, 5,197, 0, 0, 5,198,
+ 0, 0, 5,199, 0, 0, 5,200, 0, 0, 5,201, 0, 0, 5,202, 0, 0, 5,203, 0, 2, 5,204, 0, 2, 5,205, 0, 2, 5,206,
+ 0, 2, 5,207, 0, 0, 5,208, 0, 0, 4,187, 0, 4, 5,209, 0, 2, 5,210, 0, 2, 0, 87, 0, 4, 5,211, 0, 7, 5,212,
+ 0, 7, 5,213, 0,197, 0, 8, 0, 4, 5,214, 0, 4, 5,215, 0, 4, 5,216, 0, 4, 5,217, 0, 4, 5,218, 0, 4, 5,219,
+ 0, 4, 0, 51, 0, 4, 2,117, 0,198, 0, 4, 0, 7, 5,220, 0, 0, 5,221, 0, 0, 5,222, 0, 2, 0, 17, 0,199, 0, 4,
+ 0, 7, 5,223, 0, 4, 0, 17, 0, 4, 5,224, 0, 4, 0, 54, 0, 38, 0, 44, 0, 19, 0, 29, 0, 31, 0, 72, 0, 24, 5,103,
+ 0,174, 5,225, 0, 38, 5,226, 0, 12, 5,227, 0,175, 5,228, 0, 24, 5,229, 0, 7, 5,230, 0, 7, 5,231, 0, 7, 5,232,
+ 0, 7, 5,233, 0, 4, 3,126, 0, 4, 5,234, 0, 4, 5,235, 0, 4, 5,236, 0, 4, 5,237, 0, 2, 0, 17, 0, 2, 1, 62,
+ 0, 52, 1, 57, 0,200, 5,238, 0,196, 5,239, 0,201, 5,240, 0,182, 0,176, 0,180, 5,241, 0, 12, 0, 98, 0, 12, 5,242,
+ 0, 9, 5,243, 0, 9, 5,244, 0, 9, 5,245, 0, 9, 5,246, 0,202, 5,247, 0, 2, 5,248, 0, 2, 5,249, 0, 2, 0,243,
+ 0, 2, 5,250, 0, 4, 5,251, 0, 4, 5,252, 0, 12, 5,253, 0,185, 5, 97, 0,186, 5,254, 0,198, 5,255, 0,157, 3,104,
+ 0,199, 6, 0, 0,203, 0, 11, 0,203, 0, 0, 0,203, 0, 1, 0, 39, 0,234, 0, 37, 1, 56, 0, 7, 2, 82, 0, 7, 2, 83,
+ 0, 7, 0,104, 0, 7, 6, 1, 0, 2, 6, 2, 0, 2, 0, 17, 0, 7, 0, 67, 0,204, 0, 37, 0, 7, 6, 3, 0, 7, 6, 4,
+ 0, 7, 6, 5, 0, 7, 6, 6, 0, 7, 6, 7, 0, 7, 6, 8, 0, 7, 6, 9, 0, 7, 6, 10, 0, 7, 6, 11, 0, 7, 1, 75,
+ 0, 7, 6, 12, 0, 7, 6, 13, 0, 7, 6, 14, 0, 7, 6, 15, 0, 7, 0,165, 0, 2, 6, 16, 0, 2, 6, 17, 0, 4, 0, 35,
+ 0, 2, 6, 18, 0, 2, 6, 19, 0, 2, 6, 20, 0, 2, 6, 2, 0, 7, 6, 21, 0, 7, 6, 22, 0, 62, 6, 23, 0,157, 3,104,
+ 0,204, 6, 24, 0,205, 6, 25, 0,206, 6, 26, 0,207, 6, 27, 0,208, 6, 28, 0, 7, 6, 29, 0, 2, 6, 30, 0, 2, 6, 31,
+ 0, 7, 6, 32, 0, 7, 6, 33, 0, 7, 6, 34, 0,209, 0, 55, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36,
+ 0, 7, 6, 37, 0, 2, 6, 38, 0, 7, 6, 11, 0, 7, 1, 75, 0, 7, 0, 87, 0, 4, 6, 39, 0, 2, 6, 20, 0, 2, 6, 2,
+ 0, 24, 5,103, 0, 24, 6, 40, 0, 12, 6, 41, 0,203, 6, 42, 0,209, 6, 24, 0, 0, 6, 43, 0, 4, 3,126, 0, 4, 5,234,
+ 0, 2, 6, 44, 0, 2, 6, 45, 0, 2, 6, 46, 0, 2, 6, 47, 0, 2, 1,225, 0, 2, 0, 17, 0, 2, 2, 17, 0, 2, 6, 48,
+ 0, 7, 0,109, 0, 7, 6, 49, 0, 7, 6, 32, 0, 7, 6, 50, 0, 7, 6, 51, 0, 7, 0,165, 0, 7, 5,230, 0, 2, 6, 52,
+ 0, 2, 5, 30, 0, 2, 6, 53, 0, 2, 6, 54, 0, 2, 6, 55, 0, 2, 6, 56, 0, 2, 6, 57, 0, 2, 6, 58, 0, 2, 6, 59,
+ 0, 2, 6, 17, 0, 12, 6, 60, 0, 12, 6, 61, 0, 12, 6, 62, 0, 2, 6, 63, 0, 2, 2,130, 0, 2, 6, 64, 0, 0, 6, 65,
+ 0, 0, 6, 66, 0, 9, 6, 67, 0,157, 3,104, 0,211, 0, 24, 0, 16, 0, 34, 0, 16, 0, 61, 0, 15, 6, 68, 0, 15, 6, 69,
+ 0, 15, 6, 70, 0, 7, 6, 71, 0, 7, 6, 72, 0, 7, 6, 73, 0, 7, 6, 74, 0, 2, 6, 75, 0, 2, 6, 76, 0, 2, 6, 77,
+ 0, 2, 6, 78, 0, 2, 6, 79, 0, 2, 0, 17, 0, 2, 6, 80, 0, 2, 6, 81, 0, 2, 6, 82, 0, 2, 6, 83, 0, 2, 6, 84,
+ 0, 2, 6, 47, 0, 7, 6, 85, 0, 4, 6, 86, 0, 4, 6, 87, 0,210, 0, 6, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35,
+ 0, 4, 6, 36, 0, 7, 6, 37, 0, 2, 6, 38, 0,212, 0, 8, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36,
+ 0, 7, 6, 37, 0, 2, 6, 38, 0, 0, 6, 88, 0, 0, 0,175, 0,213, 0, 14, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35,
+ 0, 4, 6, 36, 0, 7, 6, 37, 0, 2, 6, 38, 0,211, 6, 89, 0,214, 6, 90, 0, 12, 6, 91, 0, 2, 1, 68, 0, 2, 6, 92,
+ 0, 4, 0, 17, 0, 7, 6, 93, 0, 4, 6, 47, 0,215, 0, 21, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36,
+ 0, 7, 6, 37, 0, 2, 6, 38, 0,205, 6, 25, 0,211, 6, 89, 0, 2, 6, 94, 0, 2, 6, 95, 0, 2, 6, 96, 0, 2, 6, 97,
+ 0, 2, 6, 80, 0, 2, 6, 98, 0, 2, 6, 99, 0, 0, 0, 17, 0, 0, 0, 35, 0, 9, 2, 58, 0, 4, 6,100, 0, 4, 6,101,
+ 0, 19, 6,102, 0,216, 0, 18, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36, 0, 7, 6, 37, 0, 2, 6, 38,
+ 0,211, 6, 89, 0, 7, 2, 82, 0, 7, 2, 83, 0, 2, 6, 94, 0, 2, 6,103, 0, 2, 6,104, 0, 2, 6,105, 0, 4, 0, 17,
+ 0, 7, 6,106, 0, 4, 6, 2, 0, 4, 0, 35, 0,157, 3,104, 0,217, 0, 16, 0, 0, 6,107, 0, 0, 6,108, 0, 0, 6,109,
+ 0, 0, 6,110, 0, 0, 6,111, 0, 0, 6,112, 0, 4, 6,113, 0, 4, 6,114, 0, 4, 6,115, 0, 2, 0, 15, 0, 2, 0, 17,
+ 0, 2, 6,116, 0, 2, 6,117, 0, 2, 1,168, 0, 2, 6,118, 0, 0, 6,119, 0,218, 0, 16, 0,210, 0, 0, 0,210, 0, 1,
+ 0, 12, 6, 35, 0, 4, 6, 36, 0, 4, 6,120, 0,217, 6,121, 0,219, 6,122, 0, 12, 6,123, 0, 12, 6,124, 0,220, 6,125,
+ 0,208, 6,126, 0,221, 6,127, 0, 2, 6,128, 0, 2, 6,129, 0, 2, 6,130, 0, 2, 0, 67, 0,222, 0, 15, 0,210, 0, 0,
+ 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36, 0, 7, 6, 37, 0, 2, 6, 38, 0,211, 6, 89, 0, 12, 6,131, 0,223, 6,132,
+ 0, 0, 6,133, 0,224, 6,134, 0, 2, 0, 17, 0, 2, 6,135, 0, 2, 6,136, 0, 2, 6,137, 0,225, 0, 25, 0,210, 0, 0,
+ 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36, 0, 4, 0, 17, 0, 39, 2,222, 0, 37, 1, 56, 0, 55, 6,138, 0,226, 6,139,
+ 0,227, 6,140, 0,157, 3,104, 0, 7, 6,141, 0, 7, 2, 82, 0, 7, 2, 83, 0, 7, 6,106, 0, 7, 6,142, 0, 7, 6,143,
+ 0, 2, 6,144, 0, 2, 6,145, 0, 2, 6,146, 0, 2, 6,147, 0, 0, 6,148, 0, 0, 6,149, 0, 0, 6,150, 0, 0, 6, 47,
+ 0,228, 0, 11, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36, 0, 7, 6, 37, 0, 2, 6, 38, 0, 2, 6, 92,
+ 0, 2, 0, 17, 0, 4, 0, 35, 0,214, 6, 90, 0,211, 6, 89, 0,229, 0, 31, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35,
+ 0, 4, 6, 36, 0, 7, 6, 37, 0, 2, 6, 38, 0, 34, 6,151, 0, 4, 6,152, 0, 4, 6,153, 0, 2, 0, 88, 0, 2, 6,154,
+ 0, 2, 6,155, 0, 0, 6,156, 0, 0, 6,157, 0, 4, 6,158, 0, 4, 6,159, 0, 4, 6,160, 0, 2, 6,161, 0, 2, 6,162,
+ 0, 2, 6,163, 0, 2, 6,164, 0, 7, 6,165, 0, 15, 6,166, 0, 15, 6,167, 0, 4, 6,168, 0, 4, 6,169, 0, 0, 6,170,
+ 0, 0, 6,171, 0, 2, 6,172, 0, 0, 2,183, 0, 9, 6,173, 0,230, 0, 10, 0, 19, 0, 29, 0, 9, 6,174, 0, 9, 6,175,
+ 0, 9, 6,176, 0, 9, 6,177, 0, 9, 6,178, 0, 4, 0, 88, 0, 4, 6,179, 0, 0, 6,180, 0, 0, 6,181, 0,231, 0, 10,
+ 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36, 0, 7, 6, 37, 0,230, 6,182, 0, 2, 0, 88, 0, 2, 6,154,
+ 0, 4, 0, 87, 0, 9, 6,183, 0,232, 0, 3, 0,232, 0, 0, 0,232, 0, 1, 0, 7, 6,184, 0,233, 0, 11, 0,210, 0, 0,
+ 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36, 0, 7, 6, 37, 0,211, 6, 89, 0, 12, 6,185, 0, 4, 6,186, 0, 4, 0, 35,
+ 0, 4, 0, 17, 0, 4, 6,187, 0,234, 0, 26, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36, 0, 7, 6, 37,
+ 0, 2, 6, 38, 0,211, 6, 89, 0, 19, 6,188, 0, 19, 0, 78, 0, 2, 0, 17, 0, 2, 6,154, 0, 7, 6,189, 0, 9, 6,190,
+ 0, 7, 2, 82, 0, 7, 2, 83, 0, 7, 6,106, 0, 7, 6, 34, 0, 7, 6,191, 0, 7, 6,192, 0, 52, 1, 57, 0, 52, 6,193,
+ 0, 4, 6,194, 0, 2, 6,195, 0, 2, 0,243, 0, 12, 6,196, 0,157, 3,104, 0,235, 0, 10, 0,210, 0, 0, 0,210, 0, 1,
+ 0, 12, 6, 35, 0, 4, 6, 36, 0, 7, 6, 37, 0, 2, 6, 38, 0, 2, 0, 17, 0, 2, 3,135, 0, 4, 0, 35, 0,157, 3,104,
+ 0,236, 0, 42, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36, 0, 7, 6, 37, 0, 2, 6, 38, 0,211, 6, 89,
+ 0,219, 6,122, 0, 0, 6,197, 0, 0, 6,108, 0, 0, 6,109, 0, 2, 0, 15, 0, 2, 6,198, 0, 2, 0, 17, 0, 2, 6,116,
+ 0, 9, 6,190, 0, 4, 6,113, 0, 4, 6,199, 0, 4, 6,200, 0, 4, 6,201, 0, 15, 6,202, 0, 15, 6,203, 0, 7, 6,204,
+ 0, 7, 6,205, 0, 7, 6,206, 0, 7, 6,189, 0, 2, 6,207, 0, 2, 0,233, 0, 2, 1,168, 0, 2, 6,208, 0, 2, 0, 35,
+ 0, 2, 0, 87, 0, 2, 6,209, 0, 2, 6,210, 0, 9, 6,211, 0, 9, 6,212, 0, 9, 6,213, 0, 9, 6,214, 0, 9, 6,215,
+ 0, 2, 6,216, 0, 0, 6,217, 0, 49, 6,218, 0,237, 0, 7, 0,237, 0, 0, 0,237, 0, 1, 0, 4, 6,219, 0, 4, 0, 21,
+ 0, 0, 0, 81, 0, 4, 6,220, 0, 4, 0, 15, 0,238, 0, 14, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36,
+ 0, 7, 6, 37, 0, 2, 6, 38, 0, 4, 6,155, 0, 4, 0, 35, 0, 12, 6,221, 0, 12, 6,222, 0, 0, 6,223, 0, 0, 6,224,
+ 0, 4, 6,225, 0, 4, 6,226, 0,239, 0, 6, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36, 0, 4, 0, 35,
+ 0, 0, 6,227, 0,240, 0, 15, 0,210, 0, 0, 0,210, 0, 1, 0, 12, 6, 35, 0, 4, 6, 36, 0, 7, 6, 37, 0,241, 6,228,
+ 0,211, 6, 89, 0,242, 6,229, 0, 2, 1, 68, 0, 2, 6,230, 0, 2, 2, 82, 0, 2, 2, 83, 0, 2, 0, 17, 0, 2, 6,146,
+ 0, 4, 0, 67, 0,243, 0, 7, 0,243, 0, 0, 0,243, 0, 1, 0, 0, 6,231, 0, 2, 6,232, 0, 2, 6,233, 0, 2, 6,234,
+ 0, 2, 0, 35, 0,244, 0, 12, 0, 2, 6,233, 0, 2, 6,235, 0, 2, 6,236, 0, 0, 2,183, 0, 2, 6,237, 0, 2, 6,238,
+ 0, 2, 6,239, 0, 2, 6,240, 0, 2, 6,241, 0, 2, 6, 80, 0, 7, 6,242, 0, 7, 6,243, 0,245, 0, 18, 0,245, 0, 0,
+ 0,245, 0, 1, 0, 0, 3,250, 0,244, 6,244, 0,244, 6,245, 0,244, 6,246, 0,244, 6,247, 0, 7, 6,248, 0, 2, 6,249,
+ 0, 2, 6,250, 0, 2, 6,251, 0, 2, 6,252, 0, 2, 6,253, 0, 2, 6,254, 0, 2, 6,255, 0, 2, 7, 0, 0, 2, 7, 1,
+ 0, 2, 7, 2, 0,246, 0, 10, 0, 0, 7, 3, 0, 0, 7, 4, 0, 0, 7, 5, 0, 0, 7, 6, 0, 0, 7, 7, 0, 0, 7, 8,
+ 0, 2, 7, 9, 0, 2, 7, 10, 0, 2, 7, 11, 0, 2, 7, 12, 0,247, 0, 8, 0, 0, 7, 13, 0, 0, 7, 14, 0, 0, 7, 15,
+ 0, 0, 7, 16, 0, 0, 7, 17, 0, 0, 7, 18, 0, 7, 6, 1, 0, 7, 0, 35, 0,248, 0, 18, 0,246, 7, 19, 0,246, 7, 20,
+ 0,246, 7, 21, 0,246, 7, 22, 0,246, 7, 23, 0,246, 7, 24, 0,246, 7, 25, 0,246, 7, 26, 0,246, 7, 27, 0,246, 7, 28,
+ 0,246, 7, 29, 0,246, 7, 30, 0,246, 7, 31, 0,246, 7, 32, 0,246, 7, 33, 0,246, 7, 34, 0,247, 7, 35, 0, 0, 7, 36,
+ 0,249, 0, 97, 0, 0, 7, 37, 0, 0, 7, 38, 0, 0, 7, 7, 0, 0, 7, 39, 0, 0, 7, 40, 0, 0, 7, 41, 0, 0, 7, 42,
+ 0, 0, 7, 43, 0, 0, 7, 44, 0, 0, 7, 45, 0, 0, 7, 46, 0, 0, 7, 47, 0, 0, 7, 48, 0, 0, 7, 49, 0, 0, 7, 50,
+ 0, 0, 7, 51, 0, 0, 7, 52, 0, 0, 7, 53, 0, 0, 7, 54, 0, 0, 7, 55, 0, 0, 7, 56, 0, 0, 7, 57, 0, 0, 7, 58,
+ 0, 0, 7, 59, 0, 0, 7, 60, 0, 0, 7, 61, 0, 0, 7, 62, 0, 0, 7, 63, 0, 0, 7, 64, 0, 0, 7, 65, 0, 0, 7, 66,
+ 0, 0, 7, 67, 0, 0, 7, 68, 0, 0, 7, 69, 0, 0, 7, 70, 0, 0, 7, 71, 0, 0, 7, 72, 0, 0, 7, 73, 0, 0, 7, 74,
+ 0, 0, 7, 75, 0, 0, 7, 76, 0, 0, 7, 77, 0, 0, 7, 78, 0, 0, 7, 79, 0, 0, 7, 80, 0, 0, 7, 81, 0, 0, 7, 82,
+ 0, 0, 7, 83, 0, 0, 7, 84, 0, 0, 7, 85, 0, 0, 7, 86, 0, 0, 7, 87, 0, 0, 7, 88, 0, 0, 7, 89, 0, 0, 7, 90,
+ 0, 0, 7, 91, 0, 0, 7, 92, 0, 0, 7, 93, 0, 0, 7, 94, 0, 0, 7, 95, 0, 0, 7, 96, 0, 0, 7, 97, 0, 0, 7, 98,
+ 0, 0, 7, 99, 0, 0, 7,100, 0, 0, 7,101, 0, 0, 7,102, 0, 0, 7,103, 0, 0, 7,104, 0, 0, 7,105, 0, 0, 7,106,
+ 0, 0, 7,107, 0, 0, 7,108, 0, 0, 7,109, 0, 0, 7,110, 0, 0, 7,111, 0, 0, 7,112, 0, 0, 7,113, 0, 0, 7,114,
+ 0, 0, 7,115, 0, 0, 7,116, 0, 0, 7,117, 0, 0, 7,118, 0, 0, 7,119, 0, 0, 7,120, 0, 0, 7,121, 0, 0, 7,122,
+ 0, 0, 7,123, 0, 0, 7,124, 0, 0, 7,125, 0, 0, 7,126, 0, 0, 7,127, 0, 0, 7,128, 0, 0, 7,129, 0, 0, 7,130,
+ 0, 0, 7,131, 0, 0, 7,132, 0,250, 0, 5, 0, 0, 7,133, 0, 0, 7, 61, 0, 0, 7, 63, 0, 2, 0, 17, 0, 2, 0, 35,
+ 0,251, 0, 25, 0,251, 0, 0, 0,251, 0, 1, 0, 0, 0, 18, 0,248, 7,134, 0,249, 7,135, 0,249, 7,136, 0,249, 7,137,
+ 0,249, 7,138, 0,249, 7,139, 0,249, 7,140, 0,249, 7,141, 0,249, 7,142, 0,249, 7,143, 0,249, 7,144, 0,249, 7,145,
+ 0,249, 7,146, 0,249, 7,147, 0,249, 7,148, 0,249, 7,149, 0,249, 7,150, 0,249, 7,151, 0,249, 7,152, 0,250, 7,153,
+ 0, 4, 7,154, 0, 4, 0, 35, 0,252, 0, 3, 0,252, 0, 0, 0,252, 0, 1, 0, 0, 7,155, 0,253, 0, 5, 0, 4, 0, 17,
+ 0, 4, 0, 35, 0, 7, 2,129, 0, 7, 7,156, 0, 7, 2, 32, 0,254, 0, 90, 0, 4, 0, 17, 0, 4, 7,157, 0, 4, 7,158,
+ 0, 0, 7,159, 0, 0, 7,160, 0, 0, 7,161, 0, 0, 7,162, 0, 0, 7,163, 0, 0, 7,164, 0, 0, 7,165, 0, 0, 7,166,
+ 0, 0, 7,167, 0, 0, 7,168, 0, 4, 7,169, 0, 2, 7,170, 0, 2, 7,171, 0, 2, 7,172, 0, 2, 7,173, 0, 4, 7,174,
+ 0, 4, 7,175, 0, 4, 7,176, 0, 4, 7,177, 0, 2, 7,178, 0, 2, 7,179, 0, 4, 7,180, 0, 4, 7,181, 0, 4, 7,182,
+ 0, 4, 7,183, 0, 4, 7,184, 0, 4, 6,221, 0, 4, 7,185, 0, 2, 7,186, 0, 2, 7,187, 0, 2, 7,188, 0, 2, 7,189,
+ 0, 12, 7,190, 0, 12, 7,191, 0, 12, 7,192, 0, 12, 7,193, 0, 12, 7,194, 0, 0, 7,195, 0, 2, 7,196, 0, 2, 7,197,
+ 0, 2, 7,198, 0, 2, 7,199, 0, 2, 7,200, 0, 2, 7,201, 0, 2, 7,202, 0, 2, 7,203, 0,253, 7,204, 0, 2, 7,205,
+ 0, 2, 7,206, 0, 2, 7,207, 0, 2, 7,208, 0, 2, 7,209, 0, 2, 7,210, 0, 2, 7,211, 0, 2, 7,212, 0, 4, 7,213,
+ 0, 4, 7,214, 0, 2, 7,215, 0, 2, 7,216, 0, 2, 7,217, 0, 2, 7,218, 0, 2, 7,219, 0, 2, 7,220, 0, 2, 7,221,
+ 0, 2, 7,222, 0, 2, 7,223, 0, 2, 7,224, 0, 2, 7,225, 0, 2, 7,226, 0, 2, 7,227, 0, 2, 7,228, 0, 2, 7,229,
+ 0, 2, 7,230, 0, 2, 7,231, 0, 2, 4,187, 0, 0, 7,232, 0, 0, 7,233, 0, 7, 7,234, 0, 2, 5,169, 0, 2, 5,170,
+ 0, 2, 7,235, 0, 2, 7,236, 0, 7, 7,237, 0, 47, 7,238, 0, 7, 7,239, 0, 4, 1,225, 0, 0, 7,240, 0,255, 0, 24,
+ 0, 19, 0, 29, 0, 12, 7,241, 0, 12, 7,242, 0, 12, 7,243, 0, 12, 6, 35, 0, 38, 0,116, 0, 38, 7,244, 0, 4, 7,245,
+ 0, 4, 0, 87, 0, 2, 7,246, 0, 2, 7,247, 0, 2, 7,248, 0, 2, 7,249, 0, 2, 7,250, 0, 2, 7,251, 0, 2, 7,252,
+ 0, 2, 7,253, 0, 2, 7,254, 0, 2, 7,255, 0, 2, 8, 0, 0, 2, 0, 35, 0,208, 8, 1, 0, 9, 8, 2, 0, 2, 8, 3,
+ 1, 0, 0, 5, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 8, 4, 0, 13, 8, 5, 0, 4, 0, 17, 1, 1, 0, 7, 1, 1, 0, 0,
+ 1, 1, 0, 1, 1, 0, 8, 6, 1, 0, 8, 7, 0, 2, 5, 36, 0, 2, 0, 17, 0, 4, 0, 35, 1, 2, 0, 25, 1, 2, 0, 0,
+ 1, 2, 0, 1, 1, 3, 8, 8, 1, 4, 6,127, 0, 0, 8, 9, 0, 0, 8, 10, 0, 0, 8, 11, 0, 2, 8, 12, 0, 2, 8, 13,
+ 0, 2, 8, 14, 0, 2, 8, 15, 0, 2, 8, 16, 0, 2, 0, 35, 0, 2, 0, 17, 0, 2, 8, 17, 0, 2, 8, 18, 0, 2, 8, 19,
+ 0, 4, 8, 20, 1, 2, 8, 21, 0, 9, 8, 22, 0, 4, 8, 23, 0, 4, 8, 24, 0, 4, 8, 25, 0, 4, 8, 26, 0, 0, 8, 27,
+ 0,241, 0, 22, 0,241, 0, 0, 0,241, 0, 1, 1, 0, 8, 6, 1, 0, 8, 7, 1, 0, 8, 28, 1, 0, 8, 29, 0,255, 8, 30,
+ 0, 15, 0, 49, 0, 0, 6, 36, 0, 0, 8, 31, 0, 2, 6, 81, 0, 2, 6, 82, 0, 2, 8, 32, 0, 2, 0, 35, 0, 2, 7,250,
+ 0, 2, 6,220, 0, 2, 0, 17, 1, 5, 8, 8, 0, 12, 8, 33, 0, 12, 6, 35, 0, 12, 8, 34, 0, 12, 8, 35, 1, 6, 0, 24,
+ 1, 6, 0, 0, 1, 6, 0, 1, 0,211, 6, 89, 0, 15, 8, 36, 0, 15, 8, 37, 0, 2, 6, 81, 0, 2, 6, 82, 0, 2, 8, 38,
+ 0, 2, 8, 39, 0, 2, 8, 40, 0, 2, 0, 17, 0, 7, 2, 78, 0, 2, 8, 14, 0, 2, 8, 15, 0, 2, 7,249, 0, 2, 8, 41,
+ 0, 2, 7,254, 0, 2, 4,187, 1, 7, 8, 8, 0, 12, 8, 42, 0, 12, 8, 43, 0, 12, 8, 34, 0, 0, 8, 44, 0, 9, 8, 45,
+ 1, 8, 0, 14, 0, 0, 8, 46, 0, 2, 8, 47, 0, 2, 8, 48, 0, 2, 8, 49, 0, 2, 8, 50, 0, 2, 5, 22, 0, 2, 5, 17,
+ 0,255, 8, 51, 0, 38, 8, 52, 0, 4, 8, 53, 0, 4, 8, 54, 0, 4, 8, 55, 0, 4, 0, 35, 0, 0, 8, 56, 1, 9, 0, 3,
+ 0, 0, 8, 57, 0, 4, 8, 58, 0, 4, 8, 59, 1, 10, 0, 4, 0, 4, 6,152, 0, 4, 8, 60, 0, 4, 6,158, 0, 4, 8, 61,
+ 1, 11, 0, 2, 0, 4, 8, 62, 0, 4, 8, 63, 1, 12, 0, 5, 0, 7, 8, 64, 0, 7, 8, 65, 0, 7, 8, 66, 0, 4, 0, 17,
+ 0, 4, 0, 35, 1, 13, 0, 6, 0, 0, 8, 67, 0, 0, 6,109, 0, 41, 0,129, 0, 2, 0,104, 0, 2, 5, 21, 0, 4, 0, 35,
+ 1, 14, 0, 14, 1, 14, 0, 0, 1, 14, 0, 1, 0, 4, 0, 54, 0, 4, 0, 21, 0, 4, 0, 26, 0, 4, 8, 68, 0, 4, 8, 69,
+ 0, 4, 8, 70, 1, 9, 8, 71, 0, 0, 8, 67, 1, 13, 3, 98, 1, 10, 8, 72, 1, 11, 8, 73, 1, 12, 8, 74, 1, 15, 0, 12,
+ 0, 0, 1,249, 0, 9, 0,219, 0, 0, 0,220, 0, 4, 0,223, 0, 4, 0,231, 0, 9, 0,224, 0, 7, 0,226, 0, 7, 0,227,
+ 0, 9, 8, 75, 0, 9, 8, 76, 0, 9, 0,228, 0, 9, 0,230, 1, 16, 0, 48, 1, 16, 0, 0, 1, 16, 0, 1, 0, 9, 8, 77,
+ 0, 9, 0, 24, 0, 0, 0, 25, 0, 4, 0, 17, 0, 4, 0, 15, 0, 4, 0, 21, 0, 4, 0, 85, 0, 4, 8, 78, 0, 4, 8, 79,
+ 0, 4, 8, 69, 0, 4, 8, 70, 0, 4, 8, 80, 0, 4, 0,242, 0, 4, 8, 81, 0, 4, 8, 82, 0, 7, 8, 83, 0, 7, 0, 35,
+ 0, 7, 8, 84, 0, 7, 8, 85, 0, 4, 0,120, 0, 4, 8, 86, 1, 14, 8, 87, 0, 28, 0, 77, 0, 38, 0,116, 0, 24, 8, 88,
+ 0, 41, 0,129, 0, 7, 8, 89, 0, 7, 8, 90, 1, 15, 1, 58, 1, 16, 8, 91, 1, 16, 8, 92, 1, 16, 8, 93, 0, 12, 8, 94,
+ 0,242, 6,229, 0, 9, 8, 95, 0, 7, 4, 4, 0, 7, 8, 96, 0, 7, 8, 97, 0, 4, 8, 98, 0, 4, 8, 99, 0, 7, 8,100,
+ 0, 9, 8,101, 0, 4, 8,102, 0, 4, 8,103, 0, 4, 8,104, 0, 7, 8,105, 1, 17, 0, 4, 1, 17, 0, 0, 1, 17, 0, 1,
+ 0, 12, 8,106, 1, 16, 8,107, 0,200, 0, 11, 0, 12, 8,108, 0, 12, 8, 94, 0, 12, 8,109, 1, 16, 8,110, 0, 0, 8,111,
+ 0, 0, 8,112, 0, 4, 8,113, 0, 4, 8,114, 0, 4, 8,115, 0, 4, 0, 35, 0, 16, 8,116, 1, 18, 0, 4, 0, 7, 8,117,
+ 0, 7, 3, 71, 0, 2, 8,118, 0, 2, 8,119, 1, 19, 0, 6, 0, 7, 8,120, 0, 7, 8,121, 0, 7, 8,122, 0, 7, 8,123,
+ 0, 4, 8,124, 0, 4, 8,125, 1, 20, 0, 13, 0, 7, 8,126, 0, 7, 8,127, 0, 7, 8,128, 0, 7, 8,129, 0, 7, 8,130,
+ 0, 7, 8,131, 0, 7, 8,132, 0, 7, 8,133, 0, 7, 8,134, 0, 7, 8,135, 0, 4, 2,228, 0, 4, 8,136, 0, 4, 8,137,
+ 1, 21, 0, 2, 0, 7, 5, 95, 0, 7, 0, 35, 1, 22, 0, 5, 0, 7, 8,138, 0, 7, 8,139, 0, 4, 0, 88, 0, 4, 2,184,
+ 0, 4, 8,140, 1, 23, 0, 6, 1, 23, 0, 0, 1, 23, 0, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 8,141, 0, 2, 0, 54,
+ 1, 24, 0, 8, 1, 24, 0, 0, 1, 24, 0, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 8,141, 0, 2, 0, 54, 0, 7, 0, 21,
+ 0, 7, 0,120, 1, 25, 0, 45, 1, 25, 0, 0, 1, 25, 0, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 8,141, 0, 2, 0,238,
+ 0, 2, 4, 46, 0, 2, 8,142, 0, 7, 8,143, 0, 7, 0, 86, 0, 7, 2,241, 0, 4, 8,144, 0, 4, 0, 79, 0, 4, 2,186,
+ 0, 7, 8,145, 0, 7, 8,146, 0, 7, 8,147, 0, 7, 8,148, 0, 7, 8,149, 0, 7, 8,150, 0, 7, 2,238, 0, 7, 1, 55,
+ 0, 7, 8,151, 0, 7, 8,152, 0, 7, 0, 35, 0, 7, 8,153, 0, 7, 8,154, 0, 7, 8,155, 0, 2, 8,156, 0, 2, 8,157,
+ 0, 2, 8,158, 0, 2, 8,159, 0, 2, 8,160, 0, 2, 8,161, 0, 2, 8,162, 0, 2, 8,163, 0, 2, 2, 17, 0, 2, 8,164,
+ 0, 2, 2, 14, 0, 2, 8,165, 0, 0, 8,166, 0, 0, 8,167, 0, 7, 0,236, 1, 26, 8,168, 0, 58, 1,228, 1, 27, 0, 16,
+ 1, 27, 0, 0, 1, 27, 0, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 8,141, 0, 2, 0,238, 0, 7, 2,233, 0, 7, 2,234,
+ 0, 7, 2,235, 0, 7, 2, 67, 0, 7, 2,236, 0, 7, 2,237, 0, 7, 8,169, 0, 7, 2,238, 0, 7, 2,240, 0, 7, 2,241,
+ 0,224, 0, 5, 0, 2, 0, 15, 0, 2, 8,170, 0, 2, 0, 17, 0, 2, 8,171, 0, 19, 6,188, 0,223, 0, 3, 0, 4, 0, 66,
+ 0, 4, 8,172, 0,224, 0, 2, 1, 28, 0, 7, 1, 28, 0, 0, 1, 28, 0, 1, 0, 0, 0, 18, 0, 2, 0, 15, 0, 2, 0, 17,
+ 0, 4, 0, 20, 0, 9, 8,173, 1, 29, 0, 5, 0, 0, 0, 18, 0, 7, 1, 75, 0, 7, 8,174, 0, 4, 8,175, 0, 4, 0, 35,
+ 1, 30, 0, 4, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 0, 87, 0, 2, 0, 67, 1, 31, 0, 4, 0, 0, 0, 18, 0, 57, 8,176,
+ 0, 7, 1, 75, 0, 7, 0, 35, 1, 32, 0, 6, 0, 2, 8,177, 0, 2, 8,178, 0, 2, 0, 15, 0, 2, 8,179, 0, 0, 8,180,
+ 0, 0, 8,181, 1, 33, 0, 5, 0, 4, 0, 15, 0, 4, 0, 35, 0, 0, 0, 18, 0, 0, 8,182, 0, 0, 8,183, 1, 34, 0, 3,
+ 0, 4, 0, 15, 0, 4, 0, 35, 0, 0, 0, 18, 1, 35, 0, 4, 0, 2, 8,184, 0, 2, 8,185, 0, 2, 0, 17, 0, 2, 0, 35,
+ 1, 36, 0, 6, 0, 0, 0, 18, 0, 0, 8,186, 0, 2, 8,187, 0, 2, 2,238, 0, 2, 1, 68, 0, 2, 0, 67, 1, 37, 0, 5,
+ 0, 0, 0, 18, 0, 7, 3, 71, 0, 7, 4,137, 0, 2, 0, 17, 0, 2, 2,198, 1, 38, 0, 3, 0, 0, 0, 18, 0, 4, 2,186,
+ 0, 4, 8,184, 1, 39, 0, 7, 0, 0, 0, 18, 0, 7, 4,137, 0, 0, 8,188, 0, 0, 8,189, 0, 2, 1, 68, 0, 2, 0, 87,
+ 0, 4, 8,190, 1, 40, 0, 4, 0, 0, 8,191, 0, 0, 8,192, 0, 4, 0, 15, 0, 7, 2,202, 1, 41, 0, 3, 0, 24, 8,193,
+ 0, 0, 8,194, 0, 0, 8,195, 1, 42, 0, 18, 1, 42, 0, 0, 1, 42, 0, 1, 0, 2, 0, 15, 0, 2, 8,196, 0, 2, 0, 17,
+ 0, 2, 8,197, 0, 2, 8,198, 0, 2, 8,199, 0, 2, 0, 87, 0, 2, 0, 67, 0, 0, 0, 18, 0, 9, 0, 2, 1, 43, 8,200,
+ 0, 24, 0, 42, 0, 2, 5,112, 0, 2, 8, 96, 0, 2, 8,201, 0, 2, 0, 35, 1, 44, 0, 11, 0, 0, 0, 18, 0, 0, 0, 15,
+ 0, 0, 8,202, 0, 2, 0, 17, 0, 2, 2,198, 0, 2, 8,203, 0, 4, 8,204, 0, 4, 8,205, 0, 4, 8,206, 0, 4, 8,207,
+ 0, 4, 8,208, 1, 45, 0, 1, 0, 0, 8,209, 1, 46, 0, 4, 0, 34, 6,151, 0, 0, 7,155, 0, 4, 1, 68, 0, 4, 0, 17,
+ 1, 43, 0, 18, 1, 43, 0, 0, 1, 43, 0, 1, 1, 43, 8,210, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 8,211, 0, 2, 8,199,
+ 0, 2, 8,196, 0, 2, 8,212, 0, 2, 0, 67, 0, 2, 1,225, 0, 0, 0, 18, 0, 9, 0, 2, 1, 47, 8,200, 1, 42, 8,213,
+ 0, 2, 0, 13, 0, 2, 8,214, 0, 4, 8,215, 1, 48, 0, 3, 0, 4, 2,212, 0, 4, 0, 35, 0, 24, 0, 42, 1, 49, 0, 12,
+ 0,155, 8,216, 0, 2, 0, 15, 0, 2, 0, 17, 0, 7, 8,143, 0, 7, 0, 86, 0, 0, 0, 18, 0, 0, 8,217, 0, 2, 8,218,
+ 0, 2, 8,219, 0, 2, 8,220, 0, 2, 8,221, 0, 7, 8,222, 1, 50, 0, 8, 0, 7, 8,223, 0, 7, 8,224, 0, 7, 8,225,
+ 0, 7, 8,226, 0, 7, 8,227, 0, 7, 8,228, 0, 7, 8,229, 0, 7, 8,230, 1, 51, 0, 13, 0, 2, 0, 17, 0, 2, 6,230,
+ 0, 4, 0, 87, 0, 4, 0, 67, 0, 2, 8,231, 0, 7, 4, 4, 0, 7, 8,232, 0,242, 6,229, 1, 50, 8,233, 0, 2, 0, 15,
+ 0, 2, 5, 30, 0, 2, 5,251, 0, 2, 8,234, 1, 52, 0, 11, 0, 4, 2,212, 0, 2, 0, 15, 0, 2, 0, 17, 0, 24, 0, 42,
+ 0, 73, 8,235, 0, 0, 0, 18, 0, 7, 8,236, 0, 7, 8,237, 0, 7, 3,143, 0, 2, 8,238, 0, 2, 8,239, 1, 53, 0, 5,
+ 0, 2, 0, 15, 0, 2, 0, 87, 0, 4, 0, 35, 0, 38, 0,116, 0, 24, 5,103, 1, 54, 0, 5, 0, 4, 0, 35, 0, 4, 0, 15,
+ 0, 0, 0, 18, 0, 0, 8,182, 0, 24, 0, 42, 1, 55, 0, 13, 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 8,196, 0, 2, 3,144,
+ 0, 7, 8,240, 0, 7, 8,241, 0, 7, 4,187, 0, 7, 3,156, 0, 7, 3,114, 0, 7, 3,117, 0, 7, 8,242, 0, 7, 8,243,
+ 0, 24, 8,244, 1, 56, 0, 10, 0, 2, 0, 17, 0, 2, 0, 15, 0, 7, 8,143, 0, 7, 0, 86, 0, 0, 0, 18, 0, 0, 8,217,
+ 0, 2, 0, 87, 0, 2, 0, 67, 0, 2, 1,225, 0, 2, 5, 30, 1, 57, 0, 8, 0, 24, 0, 42, 0, 7, 2,235, 0, 7, 8,245,
+ 0, 7, 8,246, 0, 7, 0, 35, 0, 2, 0, 87, 0, 2, 2,198, 0, 7, 0, 67, 1, 58, 0, 12, 0, 2, 0, 15, 0, 2, 1, 68,
+ 0, 2, 0, 17, 0, 2, 2,238, 0, 2, 2,212, 0, 2, 8,247, 0, 4, 0, 35, 0, 7, 8,248, 0, 7, 8,249, 0, 7, 8,250,
+ 0, 7, 8,251, 0, 0, 8,252, 1, 59, 0, 9, 0, 2, 0, 17, 0, 2, 0, 15, 0, 4, 8,143, 0, 4, 0, 86, 0, 0, 0, 18,
+ 0, 2, 4,187, 0, 2, 0, 61, 0, 2, 8,253, 0, 2, 8,254, 1, 60, 0, 7, 0, 4, 2,186, 0, 4, 8,255, 0, 4, 9, 0,
+ 0, 4, 9, 1, 0, 7, 9, 2, 0, 7, 9, 3, 0, 0, 8,188, 1, 61, 0, 7, 0, 0, 9, 4, 0, 24, 9, 5, 0, 0, 8,194,
+ 0, 2, 9, 6, 0, 2, 0, 87, 0, 4, 0, 67, 0, 0, 8,195, 1, 62, 0, 6, 0, 2, 0, 17, 0, 2, 0, 15, 0, 4, 8,143,
+ 0, 4, 0, 86, 0, 0, 9, 7, 0, 0, 9, 8, 1, 63, 0, 1, 0, 4, 0, 17, 1, 64, 0, 6, 0, 0, 0, 90, 0, 2, 0, 15,
+ 0, 2, 0, 17, 0, 4, 9, 9, 0, 7, 9, 10, 0, 34, 6,151, 1, 65, 0, 4, 0, 0, 2,155, 0, 2, 0, 17, 0, 4, 0, 15,
+ 0, 24, 0, 42, 1, 66, 0, 2, 0, 4, 0, 15, 0, 4, 6, 70, 1, 67, 0, 6, 0, 0, 8,191, 0, 0, 8,192, 0, 4, 0, 15,
+ 0, 7, 2, 25, 0, 24, 3, 48, 0, 24, 9, 11, 1, 47, 0, 10, 1, 47, 0, 0, 1, 47, 0, 1, 1, 47, 8,210, 0, 2, 0, 15,
+ 0, 2, 0, 17, 0, 2, 8,196, 0, 2, 9, 12, 0, 0, 0, 18, 0, 9, 0, 2, 0, 24, 0, 42, 0,242, 0, 16, 0, 19, 0, 29,
+ 0, 0, 0, 32, 0, 35, 0,144, 0, 9, 0,219, 0, 35, 9, 13, 0, 28, 0, 77, 0, 7, 4, 4, 0, 7, 9, 14, 0, 7, 8,232,
+ 0, 7, 8,223, 0, 7, 8,224, 0, 7, 9, 15, 0, 4, 0, 88, 0, 4, 0, 35, 0, 9, 9, 16, 0, 9, 9, 17, 1, 68, 0, 6,
+ 1, 68, 0, 0, 1, 68, 0, 1, 0, 24, 0, 42, 0, 9, 9, 18, 0, 2, 0,243, 0, 0, 2,183, 0, 58, 0, 4, 0, 19, 0, 29,
+ 0, 12, 9, 19, 0, 4, 0,125, 0, 7, 9, 20, 1, 69, 0, 28, 1, 69, 0, 0, 1, 69, 0, 1, 0, 18, 9, 21, 1, 69, 0, 36,
+ 0, 12, 9, 22, 0, 0, 0, 18, 0, 7, 9, 23, 0, 7, 9, 24, 0, 7, 9, 25, 0, 7, 9, 26, 0, 4, 0, 17, 0, 7, 9, 27,
+ 0, 7, 9, 28, 0, 7, 9, 29, 0, 7, 9, 30, 0, 7, 1, 75, 0, 7, 2, 25, 0, 7, 9, 31, 0, 7, 2,184, 0, 7, 9, 32,
+ 0, 7, 9, 33, 0, 7, 9, 34, 0, 7, 9, 35, 0, 7, 9, 36, 0, 7, 0,166, 0, 4, 0,125, 0, 2, 5,149, 0, 2, 7, 2,
+ 1, 70, 0, 25, 0, 19, 0, 29, 0, 31, 0, 72, 0, 12, 9, 37, 0, 12, 9, 38, 0, 12, 9, 39, 1, 69, 9, 40, 0, 9, 9, 41,
+ 0, 9, 9, 42, 0, 4, 0, 17, 0, 4, 6, 44, 0, 2, 2,242, 0, 2, 6,100, 0, 4, 9, 43, 0, 4, 0,125, 0, 4, 9, 44,
+ 0, 2, 9, 45, 0, 2, 9, 46, 0, 2, 9, 47, 0, 2, 9, 48, 0, 4, 9, 49, 0, 4, 9, 50, 0, 4, 9, 51, 0, 4, 9, 52,
+ 0, 4, 9, 53, 0, 4, 9, 54, 1, 71, 0, 2, 0, 7, 2,143, 0, 4, 0, 17, 0,159, 0, 5, 1, 71, 9, 55, 0, 4, 2,184,
+ 0, 4, 9, 56, 0, 4, 9, 57, 0, 4, 0, 17, 0,158, 0, 16, 0, 4, 9, 58, 0, 4, 9, 59, 0, 4, 9, 60, 0, 4, 9, 61,
+ 0, 2, 9, 62, 0, 2, 9, 63, 0, 2, 9, 64, 0, 2, 0,243, 0, 2, 9, 65, 0, 2, 9, 66, 0, 2, 9, 67, 0, 2, 9, 68,
+ 0, 4, 9, 69, 0, 4, 9, 70, 0, 4, 9, 71, 0, 4, 9, 72, 1, 72, 0, 41, 1, 72, 0, 0, 1, 72, 0, 1, 0, 18, 9, 21,
+ 0, 12, 3,170, 0, 0, 0, 18, 0, 2, 0, 17, 0, 2, 9, 73, 0, 2, 9, 74, 0, 2, 9, 75, 0, 2, 3,129, 0, 2, 9, 76,
+ 0, 4, 2, 65, 0, 4, 9, 51, 0, 4, 9, 52, 1, 69, 9, 77, 1, 72, 0, 36, 1, 72, 9, 78, 0, 12, 9, 79, 0,159, 3,106,
+ 0, 24, 9, 80, 1, 72, 9, 81, 0, 7, 1, 63, 0, 7, 0,166, 0, 7, 9, 82, 0, 7, 2, 4, 0, 7, 3,119, 0, 7, 3,121,
+ 0, 2, 3,152, 0, 2, 0, 35, 0, 7, 9, 83, 0, 7, 9, 84, 0, 7, 3,124, 0, 7, 9, 85, 0, 7, 9, 86, 0, 7, 9, 87,
+ 0, 7, 9, 88, 0, 7, 9, 89, 0, 7, 9, 90, 0, 7, 9, 91, 0, 7, 9, 92, 0, 7, 2, 58, 0,156, 0, 16, 0, 12, 9, 93,
+ 0, 68, 9, 94, 0, 2, 0, 17, 0, 2, 0, 35, 0, 4, 9, 95, 0, 4, 0, 87, 0, 7, 2, 94, 0, 7, 9, 96, 0, 7, 9, 97,
+ 0, 12, 9, 98, 0, 4, 9, 99, 0, 4, 9,100, 0, 9, 9,101, 0, 9, 9,102, 0,158, 3,105, 0, 0, 9,103, 1, 73, 0, 1,
+ 0, 4, 9,100, 1, 74, 0, 12, 0, 4, 9,100, 0, 7, 8,208, 0, 2, 9,104, 0, 2, 9,105, 0, 7, 9,106, 0, 7, 9,107,
+ 0, 2, 9,108, 0, 2, 0, 17, 0, 7, 9,109, 0, 7, 9,110, 0, 7, 9,111, 0, 7, 9,112, 1, 75, 0, 7, 1, 75, 0, 0,
+ 1, 75, 0, 1, 0, 12, 9,113, 0, 4, 0, 17, 0, 4, 9,114, 0, 0, 3,250, 0,250, 9,115, 0,155, 0, 7, 0, 19, 0, 29,
+ 0, 12, 9,116, 0, 12, 9, 93, 0, 12, 9,117, 0, 12, 0, 98, 0, 4, 0, 17, 0, 4, 9,118, 0,214, 0, 6, 0, 19, 9,119,
+ 0, 12, 9, 93, 0, 58, 9,120, 0, 0, 9,121, 0, 4, 9,122, 0, 4, 0, 17, 1, 76, 0, 13, 0,210, 0, 0, 0,210, 0, 1,
+ 0, 12, 6, 35, 0, 4, 6, 36, 0, 7, 6, 37, 0, 2, 6, 38, 0,211, 6, 89, 0,155, 3,101, 0,214, 9,123, 0, 0, 1, 68,
+ 0, 0, 6, 92, 0, 2, 0, 17, 0, 7, 9,124, 1, 77, 0, 8, 1, 77, 0, 0, 1, 77, 0, 1, 1, 75, 9,125, 0, 28, 0, 77,
+ 0, 12, 3,107, 0, 4, 0, 17, 0, 0, 0, 18, 0, 4, 7,247, 1, 78, 0, 5, 1, 78, 0, 0, 1, 78, 0, 1, 0, 28, 0, 77,
+ 0, 2, 0, 17, 0, 0, 9,126, 1, 79, 0, 14, 1, 79, 0, 0, 1, 79, 0, 1, 0, 9, 0, 2, 0, 2, 0, 15, 0, 2, 0, 17,
+ 0, 0, 9,127, 0, 0, 9,128, 0, 0, 9,126, 0, 7, 9,129, 0, 7, 9,130, 0, 4, 0, 35, 0, 28, 0, 77, 0, 7, 9,131,
+ 0, 7, 9,132, 1, 80, 0, 9, 1, 80, 0, 0, 1, 80, 0, 1, 0, 24, 9,133, 0, 0, 2,245, 0, 7, 9,134, 0, 2, 9,135,
+ 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 9,136, 1, 81, 0, 7, 0, 34, 6,151, 0, 18, 9, 21, 0, 4, 0, 17, 0, 4, 9,137,
+ 0, 12, 9,138, 0, 24, 9,133, 0, 0, 2,245, 1, 82, 0, 15, 0, 24, 9,133, 0, 2, 9,139, 0, 2, 0, 17, 0, 2, 9,140,
+ 0, 2, 9,141, 0, 0, 2,245, 0, 24, 9,142, 0, 0, 9,143, 0, 7, 9,144, 0, 7, 2, 25, 0, 7, 9,145, 0, 7, 9,146,
+ 0, 2, 0, 15, 0, 2, 1, 68, 0, 7, 1, 75, 1, 83, 0, 6, 0, 24, 9,133, 0, 7, 9, 55, 0, 2, 9,147, 0, 2, 9,148,
+ 0, 2, 0, 17, 0, 2, 9,149, 1, 84, 0, 6, 0, 24, 9,133, 0, 4, 9,150, 0, 4, 9,151, 0, 4, 0, 88, 0, 4, 0, 35,
+ 0, 0, 2,245, 1, 85, 0, 4, 0, 24, 9,133, 0, 4, 0, 17, 0, 4, 9,150, 0, 0, 2,245, 1, 86, 0, 4, 0, 24, 9,133,
+ 0, 4, 0, 17, 0, 4, 9,150, 0, 0, 2,245, 1, 87, 0, 4, 0, 24, 9,133, 0, 4, 0, 17, 0, 4, 9,150, 0, 0, 2,245,
+ 1, 88, 0, 2, 0, 4, 0, 17, 0, 7, 4, 4, 1, 89, 0, 2, 0, 24, 9,133, 0, 0, 2,245, 1, 90, 0, 10, 0, 24, 9,133,
+ 0, 4, 9,152, 0, 7, 0,119, 0, 4, 0, 17, 0, 2, 6,149, 0, 2, 9,153, 0, 2, 0, 87, 0, 2, 0, 67, 0, 7, 9,154,
+ 0, 0, 2,245, 1, 91, 0, 10, 0, 24, 9,133, 0, 2, 0, 15, 0, 2, 4, 54, 0, 4, 0, 85, 0, 4, 0, 86, 0, 7, 8,245,
+ 0, 7, 8,246, 0, 4, 0, 35, 0,155, 8,216, 0, 0, 2,245, 1, 92, 0, 4, 0, 24, 9,133, 0, 4, 3,130, 0, 4, 9,155,
+ 0, 0, 2,245, 1, 93, 0, 4, 0, 24, 9,133, 0, 4, 3,130, 0, 4, 0, 35, 0, 0, 2,245, 1, 94, 0, 6, 0, 24, 9,133,
+ 0, 7, 0,119, 0, 7, 3, 60, 0, 4, 9,156, 0, 2, 3,130, 0, 2, 3,131, 1, 95, 0, 6, 0, 24, 9,133, 0, 4, 9,157,
+ 0, 4, 9,158, 0, 7, 9,159, 0, 7, 9,160, 0, 0, 2,245, 1, 96, 0, 16, 0, 24, 9,133, 0, 24, 9, 78, 0, 4, 0, 15,
+ 0, 7, 9,161, 0, 7, 9,162, 0, 7, 9,163, 0, 7, 9,164, 0, 7, 9,165, 0, 7, 9,166, 0, 7, 9,167, 0, 7, 9,168,
+ 0, 7, 9,169, 0, 2, 0, 17, 0, 2, 0, 35, 0, 2, 0, 87, 0, 2, 0, 67, 1, 97, 0, 3, 0, 24, 9,133, 0, 4, 0, 17,
+ 0, 4, 2, 17, 1, 98, 0, 5, 0, 24, 9,133, 0, 4, 0, 17, 0, 4, 0, 35, 0, 7, 9,170, 0, 0, 2,245, 1, 99, 0, 10,
+ 0, 24, 9,133, 0, 0, 2,245, 0, 2, 9,171, 0, 2, 9,172, 0, 0, 9,173, 0, 0, 9,174, 0, 7, 9,175, 0, 7, 9,176,
+ 0, 7, 9,177, 0, 7, 9,178, 1,100, 0, 5, 0, 24, 9,133, 0, 0, 2,245, 0, 7, 2,192, 0, 2, 9,179, 0, 2, 0, 17,
+ 1,101, 0, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 9,180, 0, 7, 9,181, 0, 2, 0, 17,
+ 0, 2, 2, 17, 1,102, 0, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 9,180, 0, 7, 9,181,
+ 0, 2, 0, 17, 0, 2, 2, 17, 1,103, 0, 8, 0, 7, 0, 7, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 9,180,
+ 0, 7, 9,181, 0, 2, 0, 17, 0, 2, 2, 17, 1,104, 0, 7, 0, 24, 9,133, 0, 0, 2,245, 0, 7, 1, 75, 0, 7, 1, 84,
+ 0, 2, 0, 17, 0, 2, 1, 68, 0, 4, 0, 35, 1,105, 0, 5, 0, 24, 3, 48, 0, 7, 1, 75, 0, 2, 3, 52, 0, 0, 3, 54,
+ 0, 0, 9,182, 1,106, 0, 10, 1,106, 0, 0, 1,106, 0, 1, 0, 2, 0, 15, 0, 2, 0, 17, 0, 0, 9,183, 0, 7, 1, 18,
+ 0, 7, 1, 19, 0, 2, 9,113, 0, 2, 9,184, 0, 24, 0, 42, 1,107, 0, 22, 1,107, 0, 0, 1,107, 0, 1, 0, 2, 0, 17,
+ 0, 2, 1, 68, 0, 2, 9,185, 0, 2, 9,186, 0, 28, 0, 77, 0,155, 8,216, 0, 24, 0,158, 0, 7, 0, 85, 0, 7, 0, 86,
+ 0, 7, 9,187, 0, 7, 9,188, 0, 7, 9,189, 0, 7, 9,190, 0, 7, 2,231, 0, 7, 9,191, 0, 7, 8,218, 0, 7, 9,192,
+ 0, 0, 9,193, 0, 0, 9,194, 0, 12, 3,110, 1,108, 0, 8, 0, 7, 2, 32, 0, 7, 8,245, 0, 7, 8,246, 0, 9, 0, 2,
+ 0, 2, 9,195, 0, 2, 9,196, 0, 2, 9,197, 0, 2, 9,198, 1,109, 0, 19, 1,109, 0, 0, 1,109, 0, 1, 1,109, 9,199,
+ 0, 0, 0, 18, 1,108, 9,200, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 9,201, 0, 2, 9,202, 1,108, 9,203, 0, 2, 9,204,
+ 0, 2, 0, 87, 0, 7, 9,205, 0, 7, 9,206, 0, 4, 9,207, 1,109, 9,208, 0, 4, 9,209, 0, 4, 0, 67, 1,110, 9,210,
+ 1,111, 0, 4, 0, 0, 9,211, 0, 2, 9,212, 0, 2, 9,213, 0, 4, 0, 35, 1,112, 0, 34, 1,112, 0, 0, 1,112, 0, 1,
+ 1,112, 9,214, 0, 0, 0, 18, 0, 2, 0, 15, 0, 2, 0, 17, 0, 2, 8, 68, 0, 2, 8, 96, 0, 2, 9,215, 0, 2, 6,154,
+ 0, 2, 9,204, 0, 2, 8,170, 0, 12, 8,211, 0, 12, 9,216, 0, 19, 6,188, 0, 9, 9,217, 0, 7, 9,205, 0, 7, 9,206,
+ 0, 7, 2, 67, 0, 7, 9,218, 0, 0, 9,219, 0, 2, 9,220, 0, 2, 9,221, 0, 7, 9,222, 0, 7, 9,223, 0, 2, 9,224,
+ 0, 2, 9,225, 0, 9, 9,226, 0, 16, 9,227, 0, 16, 9,228, 0, 16, 9,229, 1,111, 0,145, 1,113, 9,230, 1,114, 9,231,
+ 1,110, 0, 8, 1,110, 0, 0, 1,110, 0, 1, 1,112, 9,232, 1,112, 9,233, 1,109, 9,234, 1,109, 9,235, 0, 4, 0, 17,
+ 0, 4, 0, 35, 0, 52, 0, 23, 0, 19, 0, 29, 0, 31, 0, 72, 0,157, 3,104, 0, 12, 9,236, 0, 12, 9,237, 1,108, 9,238,
+ 0, 12, 9,239, 0, 4, 0, 15, 0, 4, 9,240, 0, 4, 9,241, 0, 4, 9,242, 0, 4, 0, 17, 0, 4, 0, 35, 0, 12, 9,243,
+ 0, 12, 8,211, 0, 12, 9,216, 0, 4, 9,244, 0, 9, 9,245, 0, 9, 9,246, 0, 4, 9,247, 0, 9, 9,248, 0, 9, 9,249,
+ 0, 9, 9,250, 1,115, 0, 6, 0, 4, 0,118, 0, 4, 0,120, 0, 4, 8,170, 0, 0, 9,251, 0, 0, 9,252, 0, 2, 0, 35,
+ 1,116, 0, 16, 0, 2, 8, 14, 0, 2, 8, 15, 0, 2, 9,253, 0, 2, 9,254, 0, 2, 9,255, 0, 2, 0, 65, 0, 2, 6,189,
+ 0, 2, 10, 0, 0, 7, 2,230, 0, 7, 10, 1, 0, 7, 10, 2, 0, 2, 1, 90, 0, 0, 10, 3, 0, 0, 10, 4, 0, 4, 10, 5,
+ 0, 4, 10, 6, 1,117, 0, 9, 0, 7, 10, 7, 0, 7, 10, 8, 0, 7, 9, 15, 0, 7, 3, 71, 0, 7, 10, 9, 0, 7, 6,106,
+ 0, 2, 3, 69, 0, 0, 10, 10, 0, 0, 0, 35, 1,118, 0, 4, 0, 7, 10, 11, 0, 7, 10, 12, 0, 2, 3, 69, 0, 2, 0, 35,
+ 1,119, 0, 3, 0, 7, 10, 13, 0, 7, 8, 83, 0, 7, 0, 13, 1,120, 0, 7, 0, 0, 1,249, 0, 2, 5, 19, 0, 2, 5, 20,
+ 0, 2, 5, 21, 0, 2, 4,209, 0, 4, 0,120, 0, 4, 4, 52, 1,121, 0, 9, 0, 7, 10, 14, 0, 7, 10, 15, 0, 7, 10, 16,
+ 0, 7, 2, 78, 0, 7, 10, 17, 0, 7, 10, 18, 0, 7, 10, 19, 0, 2, 10, 20, 0, 2, 10, 21, 1,122, 0, 8, 0, 2, 10, 22,
+ 0, 2, 10, 23, 0, 2, 10, 24, 0, 2, 10, 25, 0, 7, 10, 26, 0, 7, 10, 27, 0, 7, 10, 28, 0, 7, 10, 29, 1,123, 0, 2,
+ 0, 7, 0, 5, 0, 7, 0, 6, 1,124, 0, 2, 0, 0, 0,160, 0, 0, 10, 30, 1,125, 0, 1, 0, 0, 0, 18, 1,126, 0, 10,
+ 0, 0, 10, 31, 0, 0, 10, 32, 0, 0, 6, 98, 0, 0, 10, 33, 0, 2, 9,253, 0, 2, 10, 34, 0, 7, 10, 35, 0, 7, 10, 36,
+ 0, 7, 10, 37, 0, 7, 9,191, 1,127, 0, 2, 0, 9, 10, 38, 0, 9, 10, 39, 1,128, 0, 11, 0, 0, 5, 21, 0, 0, 0, 15,
+ 0, 0, 3, 69, 0, 0, 3, 71, 0, 0, 10, 40, 0, 0, 0,104, 0, 0, 2,155, 0, 7, 10, 41, 0, 7, 10, 42, 0, 7, 10, 43,
+ 0, 7, 10, 44, 1,129, 0, 8, 0, 7, 8,177, 0, 7, 0,119, 0, 7, 10, 4, 0, 7, 2,148, 0, 7, 10, 45, 0, 7, 0,232,
+ 0, 7, 10, 46, 0, 4, 0, 15, 1,130, 0, 4, 0, 2, 10, 47, 0, 2, 10, 48, 0, 2, 10, 49, 0, 2, 0, 35, 1,131, 0, 8,
+ 0, 7, 10, 50, 0, 7, 2,192, 0, 7, 10, 51, 0, 7, 8, 64, 0, 7, 8, 65, 0, 7, 8, 66, 0, 7, 10, 52, 0, 7, 10, 53,
+ 1,132, 0, 6, 0, 2, 10, 54, 0, 2, 10, 55, 0, 7, 10, 56, 0, 7, 10, 57, 0, 7, 10, 58, 0, 7, 10, 59, 1,133, 0, 1,
+ 0, 0, 0, 18, 1,134, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 2, 0, 17, 0, 2, 10, 60, 1,135, 0, 10, 0, 2, 3,238,
+ 0, 2, 0, 17, 0, 7, 4,137, 0, 7, 10, 61, 0, 7, 10, 62, 0, 7, 10, 63, 0, 7, 10, 64, 1,134, 10, 65, 1,134, 10, 66,
+ 1,134, 10, 67, 0, 55, 0, 11, 0, 4, 0, 17, 0, 4, 0, 61, 0, 4, 10, 68, 0, 4, 10, 69, 0, 16, 10, 70, 0, 16, 10, 71,
+ 1,135, 10, 72, 0, 7, 10, 73, 0, 7, 10, 74, 0, 7, 10, 75, 0, 7, 10, 76, 0,227, 0, 10, 0, 4, 9,113, 0, 4, 10, 77,
+ 0, 7, 10, 78, 0, 7, 10, 79, 0, 7, 10, 80, 0, 7, 10, 81, 0, 7, 0, 8, 0, 7, 0, 10, 0, 4, 1, 68, 0, 4, 2,235,
+ 0,226, 0, 18, 0, 4, 0,123, 0, 4, 10, 82, 0, 4, 10, 83, 0, 7, 10, 84, 0, 4, 10, 85, 0, 7, 10, 86, 0, 7, 10, 87,
+ 0, 4, 10, 88, 0, 7, 10, 89, 0, 4, 10, 90, 0, 7, 10, 91, 0,227, 10, 92, 0, 7, 10, 93, 0, 7, 10, 94, 0, 7, 10, 95,
+ 0, 7, 10, 96, 0, 4, 10, 97, 0, 4, 0, 35, 1,136, 0, 4, 0, 39, 2,222, 0, 7, 10, 98, 0, 7, 1,157, 0, 7, 0, 35,
+ 0,189, 0, 34, 0, 19, 0, 29, 1,136, 10, 99, 0, 55, 10, 65, 0, 43, 10,100, 0, 49, 10,101, 0, 22, 0,145, 0, 0, 10,102,
+ 0, 7, 10,103, 0, 2, 6, 1, 0, 2, 10,104, 0, 4, 0,104, 0, 4, 0, 17, 0, 7, 10,105, 0, 4, 2, 75, 0, 4, 10,106,
+ 0, 7, 10,107, 0, 7, 10,108, 0, 7, 10,109, 0, 7, 1,157, 0, 4, 10,110, 0, 7, 10,111, 0, 0, 10,112, 0, 0, 10,113,
+ 0, 0, 10,114, 0, 0, 10,115, 0, 7, 10,116, 0, 7, 10,117, 0, 7, 10,118, 0, 7, 2,235, 0, 7, 10,119, 0, 4, 10,120,
+ 0, 7, 10,121, 0, 7, 10,122, 0, 7, 10,123, 1,137, 0, 10, 0, 4, 0, 15, 0, 4, 0,119, 0, 4, 0, 17, 0, 4, 3,191,
+ 0, 4, 10,124, 0, 4, 10,125, 0, 4, 10,126, 0, 0, 0, 90, 0, 0, 0, 18, 0, 9, 0, 2, 1,138, 0, 1, 0, 0, 8, 56,
+ 0, 84, 0, 7, 1,137, 10,127, 0, 4, 10,128, 0, 4, 10,129, 0, 4, 10,130, 0, 4, 0, 35, 0, 9, 10,131, 1,138, 10,132,
+ 1,139, 0, 5, 0, 7, 2,143, 0, 7, 2,212, 0, 7, 2, 25, 0, 2, 2,124, 0, 2, 0, 35, 1,140, 0, 5, 0, 7, 2,143,
+ 0, 7, 10,133, 0, 7, 10,134, 0, 7, 10,135, 0, 7, 2,212, 1,141, 0, 5, 0, 24, 10,136, 1,142, 0, 20, 0, 7, 5,223,
+ 0, 7, 10,137, 0, 7, 0, 54, 1,143, 0, 3, 0, 7, 10,138, 0, 4, 10,139, 0, 4, 10,140, 1,144, 0, 7, 0, 4, 10,141,
+ 0, 4, 10,142, 0, 4, 10,143, 0, 7, 10,144, 0, 7, 10,145, 0, 7, 10,146, 0, 7, 0, 54, 1,145, 0, 8, 1,145, 0, 0,
+ 1,145, 0, 1, 0, 24, 0, 42, 0, 4, 0,251, 0, 2, 0, 17, 0, 2, 1, 68, 0, 7, 2,212, 0, 7, 8,185, 1,146, 0, 6,
+ 1,146, 0, 0, 1,146, 0, 1, 0, 24, 0, 42, 0, 2, 2,197, 0, 2, 0, 17, 0, 2, 10,147, 1,147, 0, 17, 1,140, 3,185,
+ 1,140, 10,148, 1,139, 10,149, 1,140, 8,168, 1,141, 10,150, 0, 4, 0, 79, 0, 7, 2,212, 0, 7, 2,241, 0, 7, 10,151,
+ 0, 4, 10,141, 0, 4, 10,152, 0, 7, 10,145, 0, 7, 10,146, 0, 7, 0,104, 0, 4, 10,153, 0, 2, 0, 17, 0, 2, 10,154,
+ 1,148, 0, 15, 0, 7, 0,247, 0, 7, 10,155, 0, 7, 10,138, 0, 7, 10,156, 0, 7, 10,157, 0, 7, 10,158, 0, 7, 10,159,
+ 0, 7, 10,160, 0, 7, 10,161, 0, 7, 10,162, 0, 7, 10,163, 0, 7, 10,164, 0, 7, 10,165, 0, 4, 0, 17, 0, 4, 10,166,
+ 1,149, 0,121, 0, 19, 0, 29, 0, 31, 0, 72, 1,150, 10,167, 1,148, 10,168, 0,166, 4, 74, 0, 4, 0, 17, 0, 4, 0, 54,
+ 0, 2, 0, 15, 0, 2, 9,171, 0, 2, 10,169, 0, 2, 1,103, 0, 2, 10,170, 0, 2, 3,152, 0, 2, 10,171, 0, 2, 10,172,
+ 0, 2, 10,173, 0, 2, 10,174, 0, 2, 10,175, 0, 2, 10,176, 0, 2, 10,177, 0, 2, 10,178, 0, 2, 10,179, 0, 2, 5,120,
+ 0, 2, 10,180, 0, 2, 10,181, 0, 2, 10,182, 0, 2, 10,183, 0, 2, 10,184, 0, 2, 2, 14, 0, 2, 8,161, 0, 2, 8,136,
+ 0, 2, 10,185, 0, 2, 10,186, 0, 2, 3,201, 0, 2, 3,202, 0, 2, 10,187, 0, 2, 10,188, 0, 2, 10,189, 0, 2, 10,190,
+ 0, 7, 10,191, 0, 7, 10,192, 0, 7, 10,193, 0, 7, 10,194, 0, 2, 5, 70, 0, 2, 10,195, 0, 7, 10,196, 0, 7, 10,197,
+ 0, 7, 10,198, 0, 7, 8,143, 0, 7, 0, 86, 0, 7, 2,241, 0, 7, 8,149, 0, 7, 10,199, 0, 7, 10,200, 0, 7, 10,201,
+ 0, 7, 10,202, 0, 4, 8,144, 0, 4, 8,142, 0, 4, 10,203, 0, 4, 10,204, 0, 7, 8,145, 0, 7, 8,146, 0, 7, 8,147,
+ 0, 7, 10,205, 0, 7, 10,206, 0, 7, 10,207, 0, 7, 10,208, 0, 7, 10,209, 0, 7, 10,210, 0, 7, 10,211, 0, 7, 10,212,
+ 0, 7, 10,213, 0, 7, 3,143, 0, 7, 0,104, 0, 7, 10,214, 0, 7, 10,215, 0, 7, 10,216, 0, 7, 10,217, 0, 7, 0,205,
+ 0, 7, 10,218, 0, 4, 10,219, 0, 4, 10,220, 0, 7, 10,221, 0, 7, 10,222, 0, 7, 10,223, 0, 7, 10,224, 0, 7, 10,225,
+ 0, 7, 0,204, 0, 7, 10,226, 0, 7, 3,228, 0, 7, 3,226, 0, 7, 3,227, 0, 7, 10,227, 0, 7, 10,228, 0, 7, 10,229,
+ 0, 7, 10,230, 0, 7, 10,231, 0, 7, 10,232, 0, 7, 10,233, 0, 7, 10,234, 0, 7, 10,235, 0, 7, 10,236, 0, 7, 10,237,
+ 0, 7, 10,238, 0, 7, 10,239, 0, 7, 10,240, 0, 7, 10,241, 0, 7, 10,242, 0, 7, 10,243, 0, 7, 10,244, 0, 4, 10,245,
+ 0, 4, 10,246, 0, 43, 1,121, 0, 58, 3,175, 0, 12, 10,247, 0, 58, 10,248, 0, 24, 10,249, 0, 24, 10,250, 0, 28, 0, 77,
+ 0,161, 1, 60, 0,161, 10,251, 0,140, 0, 50, 0,140, 0, 0, 0,140, 0, 1, 1,149, 10,252, 1,147, 10,253, 1,144, 9, 78,
+ 0,169, 4, 0, 0, 9, 4, 1, 1,151, 10,254, 1,151, 10,255, 0, 12, 11, 0, 0, 12, 11, 1, 0,125, 11, 2, 0,133, 11, 3,
+ 0,133, 11, 4, 0, 24, 11, 5, 0, 24, 11, 6, 0, 24, 0, 36, 0, 12, 9,138, 0, 0, 0, 18, 0, 7, 0,236, 0, 7, 3, 14,
+ 0, 7, 11, 7, 0, 7, 11, 8, 0, 4, 2,186, 0, 4, 11, 9, 0, 4, 0, 17, 0, 4, 8,144, 0, 4, 11, 10, 0, 4, 11, 11,
+ 0, 4, 11, 12, 0, 4, 11, 13, 0, 2, 0,243, 0, 2, 11, 14, 0, 2, 11, 15, 0, 2, 11, 16, 0, 0, 11, 17, 0, 2, 11, 18,
+ 0, 2, 11, 19, 0, 2, 11, 20, 0, 9, 11, 21, 0,129, 4, 73, 0, 12, 2,255, 0, 12, 11, 22, 1,143, 11, 23, 0, 4, 11, 24,
+ 0, 4, 11, 25, 1,152, 11, 26, 0,131, 3, 11, 1,153, 11, 27, 0, 7, 11, 28, 0,127, 0, 37, 1,154, 9, 16, 0, 7, 4, 43,
+ 0, 7, 11, 29, 0, 7, 11, 30, 0, 7, 5,223, 0, 7, 3,153, 0, 7, 3,143, 0, 7, 11, 31, 0, 7, 2, 77, 0, 7, 11, 32,
+ 0, 7, 11, 33, 0, 7, 11, 34, 0, 7, 11, 35, 0, 7, 11, 36, 0, 7, 11, 37, 0, 7, 4, 44, 0, 7, 11, 38, 0, 7, 11, 39,
+ 0, 7, 11, 40, 0, 7, 4, 45, 0, 7, 4, 41, 0, 7, 4, 42, 0, 7, 11, 41, 0, 7, 11, 42, 0, 4, 11, 43, 0, 4, 0, 88,
+ 0, 4, 11, 44, 0, 4, 11, 45, 0, 2, 11, 46, 0, 2, 11, 47, 0, 2, 11, 48, 0, 2, 11, 49, 0, 2, 11, 50, 0, 2, 11, 51,
+ 0, 2, 11, 52, 0, 2, 4,187, 0,166, 4, 74, 0,128, 0, 9, 1,154, 11, 53, 0, 7, 11, 54, 0, 7, 11, 55, 0, 7, 1,229,
+ 0, 7, 11, 56, 0, 4, 0, 88, 0, 2, 11, 57, 0, 2, 11, 58, 0, 58, 1,228, 1,155, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6,
+ 0, 7, 2, 3, 0, 7, 11, 59, 1,156, 0, 6, 1,156, 0, 0, 1,156, 0, 1, 1,155, 9, 55, 0, 4, 0,249, 0, 2, 11, 60,
+ 0, 2, 0, 17, 1,157, 0, 5, 1,157, 0, 0, 1,157, 0, 1, 0, 12, 11, 61, 0, 4, 11, 62, 0, 4, 0, 17, 1,158, 0, 9,
+ 1,158, 0, 0, 1,158, 0, 1, 0, 12, 0,118, 1,157, 11, 63, 0, 4, 0, 17, 0, 2, 11, 60, 0, 2, 11, 64, 0, 7, 0, 89,
+ 0, 0, 11, 65, 0,157, 0, 6, 0, 19, 0, 29, 0, 12, 5, 38, 0, 4, 0, 17, 0, 2, 11, 66, 0, 2, 11, 67, 0, 9, 11, 68,
+ 1,159, 0, 6, 0, 12, 11, 69, 0, 4, 11, 70, 0, 4, 11, 71, 0, 4, 0, 17, 0, 4, 0, 35, 0,208, 11, 72, 1,160, 0, 17,
+ 0, 19, 0, 29, 1,161, 11, 73, 1,161, 11, 74, 0, 12, 11, 75, 0, 4, 11, 76, 0, 2, 11, 77, 0, 2, 11, 78, 0, 12, 11, 79,
+ 0, 12, 11, 80, 1,159, 11, 81, 0, 12, 11, 82, 0, 12, 11, 83, 0, 12, 11, 84, 0, 12, 11, 85, 1,162, 11, 86, 0, 12, 11, 87,
+ 0,208, 11, 88, 1,161, 0, 32, 1,161, 0, 0, 1,161, 0, 1, 0, 9, 11, 89, 0, 4, 7,248, 0, 2, 11, 90, 0, 2, 0, 35,
+ 0,255, 11, 91, 0,255, 11, 92, 0, 0, 11, 93, 0, 2, 11, 94, 0, 2, 11, 95, 0, 2, 8, 14, 0, 2, 8, 15, 0, 2, 11, 96,
+ 0, 2, 11, 97, 0, 2, 3,191, 0, 2, 6,220, 0, 2, 11, 98, 0, 2, 11, 99, 0, 2, 11,100, 0, 2, 0, 67, 1,163, 11,101,
+ 1,164, 11,102, 1,165, 11,103, 0, 4, 11,104, 0, 4, 11,105, 0, 9, 11,106, 0, 12, 11, 80, 0, 12, 8, 34, 0, 12, 11,107,
+ 0, 12, 11,108, 0, 12, 11,109, 1,166, 0, 17, 1,166, 0, 0, 1,166, 0, 1, 0, 0, 11,110, 0, 18, 0, 28, 0, 2, 11,111,
+ 0, 2, 0, 15, 0, 2, 0, 13, 0, 2, 11,112, 0, 2, 11,113, 0, 2, 11,114, 0, 2, 11,115, 0, 2, 11,116, 0, 2, 0, 17,
+ 0, 2, 11,117, 0, 2, 0, 29, 0, 2, 0, 35, 1,167, 11,118, 1,168, 0, 10, 1,168, 0, 0, 1,168, 0, 1, 0, 12, 11,119,
+ 0, 0, 11,110, 0, 2, 11,120, 0, 2, 11,121, 0, 2, 0, 17, 0, 2, 11,122, 0, 4, 11,123, 0, 9, 11,124, 1,162, 0, 7,
+ 1,162, 0, 0, 1,162, 0, 1, 0, 0, 11,110, 0, 0, 11,125, 0, 12, 7,193, 0, 4, 11,126, 0, 4, 0, 17, 0,220, 0, 14,
+ 0,220, 0, 0, 0,220, 0, 1, 0, 0, 11,110, 0, 18, 0, 28, 1,169, 8, 8, 0, 9, 11,127, 0, 9, 11,128, 1,167, 11,118,
+ 1,159, 11,129, 0, 12, 11,130, 0,220, 11,131, 1, 4, 6,127, 0, 2, 0, 17, 0, 2, 4,187, 1,170, 0, 8, 1,170, 0, 0,
+ 1,170, 0, 1, 0, 9, 0, 2, 0, 9, 11,132, 0, 0, 3,250, 0, 2, 0, 15, 0, 2, 0, 17, 0, 7, 11,133, 1,171, 0, 5,
+ 0, 7, 11,134, 0, 4, 11,135, 0, 4, 11,136, 0, 4, 1, 68, 0, 4, 0, 17, 1,172, 0, 6, 0, 7, 11,137, 0, 7, 11,138,
+ 0, 7, 11,139, 0, 7, 11,140, 0, 4, 0, 15, 0, 4, 0, 17, 1,173, 0, 5, 0, 7, 8,245, 0, 7, 8,246, 0, 7, 2,212,
+ 0, 2, 2, 28, 0, 2, 2, 29, 1,174, 0, 5, 1,173, 0, 2, 0, 4, 0, 51, 0, 7, 11,141, 0, 7, 8,245, 0, 7, 8,246,
+ 1,175, 0, 4, 0, 2, 11,142, 0, 2, 11,143, 0, 2, 11,144, 0, 2, 11,145, 1,176, 0, 2, 0, 34, 6,182, 0, 18, 9, 21,
+ 1,177, 0, 3, 0, 16, 11,146, 0, 4, 0, 17, 0, 4, 0, 35, 1,178, 0, 6, 0, 7, 0,104, 0, 7, 2,214, 0, 7, 11,147,
+ 0, 7, 0, 35, 0, 2, 0,242, 0, 2, 11,148, 1,179, 0, 5, 0, 7, 11,149, 0, 7, 0,119, 0, 7, 9, 56, 0, 7, 9, 57,
+ 0, 4, 0, 17, 1,180, 0, 6, 0, 19, 6,188, 0, 0, 11,150, 0, 0, 11,151, 0, 2, 11,152, 0, 2, 0, 17, 0, 4, 11,153,
+ 1,181, 0, 7, 1,181, 0, 0, 1,181, 0, 1, 0, 0, 3,250, 1,180, 11,154, 0, 2, 11,155, 0, 2, 0, 15, 0, 7, 0, 58,
+ 1,182, 0, 7, 0, 12, 11,156, 0, 0, 11,157, 0, 9, 11,158, 0, 7, 0, 58, 0, 7, 11,133, 0, 4, 0, 15, 0, 4, 0, 17,
+ 1,183, 0, 3, 0, 7, 11,159, 0, 4, 0, 17, 0, 4, 0, 35, 1,184, 0, 15, 1,184, 0, 0, 1,184, 0, 1, 1, 75, 9,125,
+ 1,182, 0, 59, 0, 12, 3,110, 0, 27, 0, 47, 1,183, 11,160, 0, 4, 0, 51, 0, 7, 0, 58, 0, 2, 0, 17, 0, 2, 1, 11,
+ 0, 4, 11,161, 0, 0, 11,150, 0, 4, 11,162, 0, 7, 11,163, 1,185, 0, 2, 0, 0, 11,164, 0, 0, 11,165, 1,186, 0, 4,
+ 1,186, 0, 0, 1,186, 0, 1, 0,155, 3, 48, 0, 12, 11,166, 1,187, 0, 24, 1,187, 0, 0, 1,187, 0, 1, 0, 12, 11,167,
+ 0,155, 8,216, 1,186, 11,168, 0, 12, 11,169, 0, 12, 3,110, 0, 0, 3,250, 0, 7, 11,133, 0, 7, 11,170, 0, 7, 0, 85,
+ 0, 7, 0, 86, 0, 7, 9,187, 0, 7, 9,188, 0, 7, 2,231, 0, 7, 9,191, 0, 7, 8,218, 0, 7, 9,192, 0, 2, 11,171,
+ 0, 2, 11,172, 0, 2, 0, 87, 0, 2, 0, 15, 0, 4, 0, 17, 0, 4, 0, 67, 1,188, 0, 6, 1,188, 0, 0, 1,188, 0, 1,
+ 0, 12, 11,167, 0, 4, 0, 17, 0, 4, 2,147, 0, 0, 3,250, 1,189, 0, 11, 1,189, 0, 0, 1,189, 0, 1, 0, 19, 6,188,
+ 0, 0, 11,173, 0, 4, 11,153, 0, 2, 11,174, 0, 2, 0, 35, 0, 0, 11,150, 0, 4, 11,161, 0, 2, 0, 17, 0, 2, 11,175,
+ 1,190, 0, 8, 1,190, 0, 0, 1,190, 0, 1, 0, 12, 11,176, 0, 0, 3,250, 0, 0, 11,177, 0, 2, 0, 17, 0, 2, 11,175,
+ 0, 4, 11,178, 1,191, 0, 5, 1,191, 0, 0, 1,191, 0, 1, 0, 0, 11,150, 0, 4, 11,161, 0, 7, 2,202, 0, 31, 0, 12,
+ 0,155, 3,101, 0,155, 11,179, 1,186, 11,168, 0, 12, 11,180, 1,187, 11,181, 0, 12, 11,182, 0, 12, 11,183, 0, 4, 0, 17,
+ 0, 4, 0,243, 0, 2, 11,184, 0, 2, 11,185, 0, 7, 11,186, 1,192, 0, 2, 0, 19, 0, 29, 0, 31, 0, 72, 1,193, 0, 5,
+ 1,193, 0, 0, 1,193, 0, 1, 0, 4, 0, 15, 0, 4, 0, 17, 0, 0, 0, 18, 1,194, 0, 6, 1,193, 11,187, 0, 24, 0, 42,
+ 0, 4, 11,188, 0, 7, 11,189, 0, 4, 11,190, 0, 4, 9,113, 1,195, 0, 3, 1,193, 11,187, 0, 4, 11,188, 0, 7, 11,191,
+ 1,196, 0, 8, 1,193, 11,187, 0, 24, 0, 42, 0, 7, 1, 63, 0, 7, 11,192, 0, 7, 3, 14, 0, 7, 9, 15, 0, 4, 11,188,
+ 0, 4, 11,193, 1,197, 0, 5, 1,193, 11,187, 0, 7, 11,194, 0, 7, 8, 96, 0, 7, 2,237, 0, 7, 0, 54, 1,198, 0, 3,
+ 1,193, 11,187, 0, 7, 9, 15, 0, 7, 11,195, 1,142, 0, 4, 0, 7, 11,196, 0, 7, 10,215, 0, 2, 11,197, 0, 2, 1, 68,
+ 1,199, 0, 14, 1,199, 0, 0, 1,199, 0, 1, 0, 12, 11,198, 0, 12, 11,199, 0, 12, 11,200, 0, 0, 0, 18, 0, 4, 0, 29,
+ 0, 4, 0, 17, 0, 4, 11,201, 0, 7, 11,202, 0, 4, 11,190, 0, 4, 9,113, 0, 7, 4, 4, 0, 7, 2,239, 1,150, 0, 23,
+ 0, 4, 11,188, 0, 4, 11,203, 0, 7, 11,204, 0, 7, 2,235, 0, 7, 11,205, 0, 7, 8,232, 0, 7, 11,196, 0, 7, 11,206,
+ 0, 7, 2,214, 0, 7, 10, 84, 0, 7, 4,137, 0, 7, 11,207, 0, 7, 11,208, 0, 7, 11,209, 0, 7, 11,210, 0, 7, 11,211,
+ 0, 7, 11,212, 0, 7, 11,213, 0, 7, 11,214, 0, 7, 11,215, 0, 7, 11,216, 0, 7, 11,217, 0, 12, 11,218, 0,113, 0, 40,
+ 0,112, 11,219, 1,200, 10,168, 0, 58, 11,220, 0, 58, 10,248, 0, 58, 11,221, 1,201, 11,222, 0, 40, 0,159, 0, 40, 11,223,
+ 0, 40, 11,224, 0, 7, 11,225, 0, 7, 11,226, 0, 7, 11,227, 0, 7, 11,228, 0, 7, 11,229, 0, 7, 7,247, 0, 7, 11,230,
+ 0, 7, 1,157, 0, 7, 11,231, 0, 4, 11,232, 0, 4, 11,233, 0, 4, 11,234, 0, 4, 0, 88, 0, 4, 0, 35, 0, 4, 11,235,
+ 0, 2, 11,236, 0, 2, 11,237, 0, 4, 11,238, 0, 7, 2,214, 0, 4, 11,239, 0, 7, 11,240, 0, 4, 11,241, 0, 4, 11,242,
+ 0, 4, 11,243, 0,129, 11,244, 0, 12, 11,245, 0,166, 4, 74, 0, 4, 11,246, 0, 7, 11,247, 0, 7, 11,248, 0, 4, 0, 67,
+ 0,114, 0, 12, 0,112, 11,219, 0,140, 3, 34, 0, 7, 1,124, 0, 7, 7,247, 0, 7, 11,249, 0, 7, 11,250, 0, 7, 11,251,
+ 0, 2, 11,252, 0, 2, 11,253, 0, 2, 11,254, 0, 2, 0, 15, 0, 4, 0, 88, 0,115, 0, 13, 0,112, 11,219, 0,131, 3, 11,
+ 0,133, 3, 13, 0, 7, 9, 55, 0, 7, 11,255, 0, 7, 12, 0, 0, 7, 1, 65, 0, 7, 12, 1, 0, 4, 9,147, 0, 4, 3, 7,
+ 0, 2, 0, 15, 0, 2, 0, 35, 0, 4, 0, 67, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+};
diff --git a/source/blender/editors/datafiles/subtract.png.c b/source/blender/editors/datafiles/subtract.png.c
index 475f20b3eff..65d90fec33d 100644
--- a/source/blender/editors/datafiles/subtract.png.c
+++ b/source/blender/editors/datafiles/subtract.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/subtract.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <subtract_png> */
int datatoc_subtract_png_size= 10173;
diff --git a/source/blender/editors/datafiles/texdraw.png.c b/source/blender/editors/datafiles/texdraw.png.c
index 42f9f08d1d7..5123c4ed292 100644
--- a/source/blender/editors/datafiles/texdraw.png.c
+++ b/source/blender/editors/datafiles/texdraw.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/texdraw.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <texdraw_png> */
int datatoc_texdraw_png_size= 9462;
diff --git a/source/blender/editors/datafiles/thumb.png.c b/source/blender/editors/datafiles/thumb.png.c
index 132ee0788fa..cbab665181d 100644
--- a/source/blender/editors/datafiles/thumb.png.c
+++ b/source/blender/editors/datafiles/thumb.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/thumb.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <thumb_png> */
int datatoc_thumb_png_size= 9098;
diff --git a/source/blender/editors/datafiles/twist.png.c b/source/blender/editors/datafiles/twist.png.c
index ee5f6a105ba..6075173c37b 100644
--- a/source/blender/editors/datafiles/twist.png.c
+++ b/source/blender/editors/datafiles/twist.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/twist.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <twist_png> */
int datatoc_twist_png_size= 10889;
diff --git a/source/blender/editors/datafiles/vertexdraw.png.c b/source/blender/editors/datafiles/vertexdraw.png.c
index 65977d10d99..2117bfa45bd 100644
--- a/source/blender/editors/datafiles/vertexdraw.png.c
+++ b/source/blender/editors/datafiles/vertexdraw.png.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/datafiles/vertexdraw.png.c
+ * \ingroup eddatafiles
+ */
/* DataToC output of file <vertexdraw_png> */
int datatoc_vertexdraw_png_size= 10253;
diff --git a/source/blender/editors/gpencil/CMakeLists.txt b/source/blender/editors/gpencil/CMakeLists.txt
index 4269c590a14..71199ee9580 100644
--- a/source/blender/editors/gpencil/CMakeLists.txt
+++ b/source/blender/editors/gpencil/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/gpencil/drawgpencil.c b/source/blender/editors/gpencil/drawgpencil.c
index 7ef17542ea4..598c0e5fa26 100644
--- a/source/blender/editors/gpencil/drawgpencil.c
+++ b/source/blender/editors/gpencil/drawgpencil.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/gpencil/drawgpencil.c
+ * \ingroup edgpencil
+ */
+
#include <stdio.h>
#include <string.h>
@@ -76,6 +81,7 @@ enum {
GP_DRAWDATA_ONLYV2D = (1<<2), /* only draw 'canvas' strokes */
GP_DRAWDATA_ONLYI2D = (1<<3), /* only draw 'image' strokes */
GP_DRAWDATA_IEDITHACK = (1<<4), /* special hack for drawing strokes in Image Editor (weird coordinates) */
+ GP_DRAWDATA_NO_XRAY = (1<<5), /* dont draw xray in 3D view (which is default) */
};
/* thickness above which we should use special drawing */
@@ -118,7 +124,7 @@ static void gp_draw_stroke_buffer (tGPspoint *points, int totpoints, short thick
/* if there was a significant pressure change, stop the curve, change the thickness of the stroke,
* and continue drawing again (since line-width cannot change in middle of GL_LINE_STRIP)
*/
- if (fabs(pt->pressure - oldpressure) > 0.2f) {
+ if (fabsf(pt->pressure - oldpressure) > 0.2f) {
glEnd();
glLineWidth(pt->pressure * thickness);
glBegin(GL_LINE_STRIP);
@@ -155,7 +161,7 @@ static void gp_draw_stroke_point (bGPDspoint *points, short thickness, short sfl
glEnd();
}
else {
- int spacetype= 0; // XXX make local gpencil state var?
+ // int spacetype= 0; // XXX make local gpencil state var?
float co[2];
/* get coordinates of point */
@@ -175,8 +181,12 @@ static void gp_draw_stroke_point (bGPDspoint *points, short thickness, short sfl
/* if thickness is less than GP_DRAWTHICKNESS_SPECIAL, simple dot looks ok
* - also mandatory in if Image Editor 'image-based' dot
*/
+#if 0
if ( (thickness < GP_DRAWTHICKNESS_SPECIAL) ||
((spacetype==SPACE_IMAGE) && (sflag & GP_STROKE_2DSPACE)) )
+#else
+ if(1) /* when spacetype is back uncomment the check above */
+#endif
{
glBegin(GL_POINTS);
glVertex2fv(co);
@@ -212,7 +222,7 @@ static void gp_draw_stroke_3d (bGPDspoint *points, int totpoints, short thicknes
/* if there was a significant pressure change, stop the curve, change the thickness of the stroke,
* and continue drawing again (since line-width cannot change in middle of GL_LINE_STRIP)
*/
- if (fabs(pt->pressure - oldpressure) > 0.2f) {
+ if (fabsf(pt->pressure - oldpressure) > 0.2f) {
glEnd();
glLineWidth(pt->pressure * thickness);
glBegin(GL_LINE_STRIP);
@@ -379,7 +389,7 @@ static void gp_draw_stroke (bGPDspoint *points, int totpoints, short thickness_s
mt[1]= mb[1] * pthick;
athick= len_v2(mt);
dfac= pthick - (athick * 2);
- if ( ((athick * 2) < pthick) && (IS_EQ(athick, pthick)==0) )
+ if ( ((athick * 2.0f) < pthick) && (IS_EQF(athick, pthick)==0) )
{
mt[0] += (mb[0] * dfac);
mt[1] += (mb[1] * dfac);
@@ -495,14 +505,41 @@ static void gp_draw_strokes (bGPDframe *gpf, int offsx, int offsy, int winx, int
continue;
if (!(dflag & GP_DRAWDATA_ONLYI2D) && (gps->flag & GP_STROKE_2DIMAGE))
continue;
- if ((gps->points == 0) || (gps->totpoints < 1))
+ if ((gps->points == NULL) || (gps->totpoints < 1))
continue;
/* check which stroke-drawer to use */
if (gps->totpoints == 1)
gp_draw_stroke_point(gps->points, lthick, gps->flag, offsx, offsy, winx, winy);
- else if (dflag & GP_DRAWDATA_ONLY3D)
+ else if (dflag & GP_DRAWDATA_ONLY3D) {
+ const int no_xray= (dflag & GP_DRAWDATA_NO_XRAY);
+ int mask_orig;
+ if(no_xray) {
+ glGetIntegerv(GL_DEPTH_WRITEMASK, &mask_orig);
+ glDepthMask(0);
+ glEnable(GL_DEPTH_TEST);
+
+ /* first arg is normally rv3d->dist, but this isnt available here and seems to work quite well without */
+ bglPolygonOffset(1.0f, 1.0f);
+ /*
+ glEnable(GL_POLYGON_OFFSET_LINE);
+ glPolygonOffset(-1.0f, -1.0f);
+ */
+ }
+
gp_draw_stroke_3d(gps->points, gps->totpoints, lthick, debug);
+
+ if(no_xray) {
+ glDepthMask(mask_orig);
+ glDisable(GL_DEPTH_TEST);
+
+ bglPolygonOffset(0.0, 0.0);
+ /*
+ glDisable(GL_POLYGON_OFFSET_LINE);
+ glPolygonOffset(0, 0);
+ */
+ }
+ }
else if (gps->totpoints > 1)
gp_draw_stroke(gps->points, gps->totpoints, lthick, dflag, gps->flag, debug, offsx, offsy, winx, winy);
}
@@ -511,7 +548,8 @@ static void gp_draw_strokes (bGPDframe *gpf, int offsx, int offsy, int winx, int
/* draw grease-pencil datablock */
static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy, int cfra, int dflag)
{
- bGPDlayer *gpl, *actlay=NULL;
+ bGPDlayer *gpl;
+ // bGPDlayer *actlay=NULL; // UNUSED
/* reset line drawing style (in case previous user didn't reset) */
setlinestyle(0);
@@ -536,8 +574,8 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
continue;
/* if layer is active one, store pointer to it */
- if (gpl->flag & GP_LAYER_ACTIVE)
- actlay= gpl;
+ // if (gpl->flag & GP_LAYER_ACTIVE)
+ // actlay= gpl;
/* get frame to draw */
gpf= gpencil_layer_getframe(gpl, cfra, 0);
@@ -550,7 +588,11 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
QUATCOPY(tcolor, gpl->color); // additional copy of color (for ghosting)
glColor4f(color[0], color[1], color[2], color[3]);
glPointSize((float)(gpl->thickness + 2));
-
+
+ /* apply xray layer setting */
+ if(gpl->flag & GP_LAYER_NO_XRAY) dflag |= GP_DRAWDATA_NO_XRAY;
+ else dflag &= ~GP_DRAWDATA_NO_XRAY;
+
/* draw 'onionskins' (frame left + right) */
if (gpl->flag & GP_LAYER_ONIONSKIN) {
/* drawing method - only immediately surrounding (gstep = 0), or within a frame range on either side (gstep > 0)*/
@@ -563,8 +605,8 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
/* check if frame is drawable */
if ((gpf->framenum - gf->framenum) <= gpl->gstep) {
/* alpha decreases with distance from curframe index */
- fac= (float)(gpf->framenum - gf->framenum) / (float)gpl->gstep;
- tcolor[3] = color[3] - fac;
+ fac= 1.0f - ((float)(gpf->framenum - gf->framenum) / (float)(gpl->gstep + 1));
+ tcolor[3] = color[3] * fac * 0.66f;
gp_draw_strokes(gf, offsx, offsy, winx, winy, dflag, debug, lthick, tcolor);
}
else
@@ -576,8 +618,8 @@ static void gp_draw_data (bGPdata *gpd, int offsx, int offsy, int winx, int winy
/* check if frame is drawable */
if ((gf->framenum - gpf->framenum) <= gpl->gstep) {
/* alpha decreases with distance from curframe index */
- fac= (float)(gf->framenum - gpf->framenum) / (float)gpl->gstep;
- tcolor[3] = color[3] - fac;
+ fac= 1.0f - ((float)(gf->framenum - gpf->framenum) / (float)(gpl->gstep + 1));
+ tcolor[3] = color[3] * fac * 0.66f;
gp_draw_strokes(gf, offsx, offsy, winx, winy, dflag, debug, lthick, tcolor);
}
else
diff --git a/source/blender/editors/gpencil/editaction_gpencil.c b/source/blender/editors/gpencil/editaction_gpencil.c
index 6ea8b77cc71..34cddfbc463 100644
--- a/source/blender/editors/gpencil/editaction_gpencil.c
+++ b/source/blender/editors/gpencil/editaction_gpencil.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/gpencil/editaction_gpencil.c
+ * \ingroup edgpencil
+ */
+
#include <stdio.h>
#include <string.h>
diff --git a/source/blender/editors/gpencil/gpencil_buttons.c b/source/blender/editors/gpencil/gpencil_buttons.c
index e6d22e3049f..79fcbb0e49d 100644
--- a/source/blender/editors/gpencil/gpencil_buttons.c
+++ b/source/blender/editors/gpencil/gpencil_buttons.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/gpencil/gpencil_buttons.c
+ * \ingroup edgpencil
+ */
+
#include <stdio.h>
#include <string.h>
@@ -68,8 +73,9 @@
/* make layer active one after being clicked on */
static void gp_ui_activelayer_cb (bContext *C, void *gpd, void *gpl)
{
+ /* make sure the layer we want to remove is the active one */
gpencil_layer_setactive(gpd, gpl);
-
+
WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
}
@@ -83,10 +89,12 @@ static void gp_ui_dellayer_cb (bContext *C, void *gpd, void *gpl)
WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX please work!
}
+
+
/* ------- Drawing Code ------- */
/* draw the controls for a given layer */
-static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
+static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl, const short is_v3d)
{
uiLayout *box=NULL, *split=NULL;
uiLayout *col=NULL, *subcol=NULL;
@@ -117,9 +125,11 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
subrow= uiLayoutRow(row, 0);
/* active */
+ block= uiLayoutGetBlock(subrow);
icon= (gpl->flag & GP_LAYER_ACTIVE) ? ICON_RADIOBUT_ON : ICON_RADIOBUT_OFF;
- uiItemR(subrow, &ptr, "active", 0, "", icon);
-
+ but= uiDefIconBut(block, BUT, 0, icon, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0.0, 0.0, 0.0, 0.0, "Set active layer");
+ uiButSetFunc(but, gp_ui_activelayer_cb, gpd, gpl);
+
/* locked */
icon= (gpl->flag & GP_LAYER_LOCKED) ? ICON_LOCKED : ICON_UNLOCKED;
uiItemR(subrow, &ptr, "lock", 0, "", icon);
@@ -138,7 +148,7 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
sprintf(name, "%s (Hidden)", gpl->info);
else
sprintf(name, "%s (Locked)", gpl->info);
- uiItemL(subrow, name, ICON_NULL);
+ uiItemL(subrow, name, ICON_NONE);
/* delete button (only if hidden but not locked!) */
if ((gpl->flag & GP_LAYER_HIDE) && !(gpl->flag & GP_LAYER_LOCKED)) {
@@ -165,7 +175,7 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
uiBlockSetEmboss(block, UI_EMBOSS);
/* name */
- uiItemR(subrow, &ptr, "info", 0, "", ICON_NULL);
+ uiItemR(subrow, &ptr, "info", 0, "", ICON_NONE);
/* delete 'button' */
uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -189,17 +199,17 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
/* color */
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "color", 0, "", ICON_NULL);
- uiItemR(subcol, &ptr, "alpha", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(subcol, &ptr, "color", 0, "", ICON_NONE);
+ uiItemR(subcol, &ptr, "alpha", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
/* stroke thickness */
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "line_width", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(subcol, &ptr, "line_width", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
/* debugging options */
if (G.f & G_DEBUG) {
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "show_points", 0, NULL, ICON_NULL);
+ uiItemR(subcol, &ptr, "show_points", 0, NULL, ICON_NONE);
}
/* right column ................... */
@@ -207,8 +217,12 @@ static void gp_drawui_layer (uiLayout *layout, bGPdata *gpd, bGPDlayer *gpl)
/* onion-skinning */
subcol= uiLayoutColumn(col, 1);
- uiItemR(subcol, &ptr, "use_onion_skinning", 0, "Onion Skinning", ICON_NULL);
- uiItemR(subcol, &ptr, "ghost_range_max", 0, "Frames", ICON_NULL); // XXX shorter name here? i.e. GStep
+ uiItemR(subcol, &ptr, "use_onion_skinning", 0, "Onion Skinning", ICON_NONE);
+ uiItemR(subcol, &ptr, "ghost_range_max", 0, "Frames", ICON_NONE); // XXX shorter name here? i.e. GStep
+
+ if(is_v3d) {
+ uiItemR(subcol, &ptr, "show_x_ray", 0, "X-Ray", ICON_NONE);
+ }
}
}
@@ -227,6 +241,7 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
bGPDlayer *gpl;
uiLayout *col, *row;
short v3d_stroke_opts = STROKE_OPTS_NORMAL;
+ const short is_v3d= CTX_wm_view3d(C) != NULL;
/* make new PointerRNA for Grease Pencil block */
RNA_id_pointer_create((ID *)gpd, &gpd_ptr);
@@ -238,10 +253,10 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
uiTemplateID(col, C, ctx_ptr, "grease_pencil", "GPENCIL_OT_data_add", NULL, "GPENCIL_OT_data_unlink");
/* add new layer button - can be used even when no data, since it can add a new block too */
- uiItemO(col, "New Layer", ICON_NULL, "GPENCIL_OT_layer_add");
+ uiItemO(col, "New Layer", ICON_NONE, "GPENCIL_OT_layer_add");
row= uiLayoutRow(col, 1);
- uiItemO(row, "Delete Frame", ICON_NULL, "GPENCIL_OT_active_frame_delete");
- uiItemO(row, "Convert", ICON_NULL, "GPENCIL_OT_convert");
+ uiItemO(row, "Delete Frame", ICON_NONE, "GPENCIL_OT_active_frame_delete");
+ uiItemO(row, "Convert", ICON_NONE, "GPENCIL_OT_convert");
/* sanity checks... */
if (gpd == NULL)
@@ -250,16 +265,16 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
/* draw each layer --------------------------------------------- */
for (gpl= gpd->layers.first; gpl; gpl= gpl->next) {
col= uiLayoutColumn(layout, 1);
- gp_drawui_layer(col, gpd, gpl);
+ gp_drawui_layer(col, gpd, gpl, is_v3d);
}
/* draw gpd drawing settings first ------------------------------------- */
col= uiLayoutColumn(layout, 1);
/* label */
- uiItemL(col, "Drawing Settings:", ICON_NULL);
+ uiItemL(col, "Drawing Settings:", ICON_NONE);
/* check whether advanced 3D-View drawing space options can be used */
- if (CTX_wm_view3d(C)) {
+ if (is_v3d) {
if (gpd->flag & (GP_DATA_DEPTH_STROKE|GP_DATA_DEPTH_VIEW))
v3d_stroke_opts = STROKE_OPTS_V3D_ON;
else
@@ -268,16 +283,16 @@ static void draw_gpencil_panel (bContext *C, uiLayout *layout, bGPdata *gpd, Poi
/* drawing space options */
row= uiLayoutRow(col, 1);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "VIEW", NULL, ICON_NULL);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "CURSOR", NULL, ICON_NULL);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "VIEW", NULL, ICON_NONE);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "CURSOR", NULL, ICON_NONE);
row= uiLayoutRow(col, 1);
uiLayoutSetActive(row, v3d_stroke_opts);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "SURFACE", NULL, ICON_NULL);
- uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "STROKE", NULL, ICON_NULL);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "SURFACE", NULL, ICON_NONE);
+ uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "STROKE", NULL, ICON_NONE);
row= uiLayoutRow(col, 0);
uiLayoutSetActive(row, v3d_stroke_opts==STROKE_OPTS_V3D_ON);
- uiItemR(row, &gpd_ptr, "use_stroke_endpoints", 0, NULL, ICON_NULL);
+ uiItemR(row, &gpd_ptr, "use_stroke_endpoints", 0, NULL, ICON_NONE);
}
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index b699d27dd89..2baefc2de8e 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/gpencil/gpencil_edit.c
+ * \ingroup edgpencil
+ */
+
#include <stdio.h>
@@ -196,6 +201,7 @@ void GPENCIL_OT_data_add (wmOperatorType *ot)
ot->name= "Grease Pencil Add New";
ot->idname= "GPENCIL_OT_data_add";
ot->description= "Add new Grease Pencil datablock";
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* callbacks */
ot->exec= gp_data_add_exec;
@@ -243,6 +249,7 @@ void GPENCIL_OT_data_unlink (wmOperatorType *ot)
ot->name= "Grease Pencil Unlink";
ot->idname= "GPENCIL_OT_data_unlink";
ot->description= "Unlink active Grease Pencil datablock";
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* callbacks */
ot->exec= gp_data_unlink_exec;
@@ -279,6 +286,7 @@ void GPENCIL_OT_layer_add (wmOperatorType *ot)
ot->name= "Add New Layer";
ot->idname= "GPENCIL_OT_layer_add";
ot->description= "Add new Grease Pencil layer for the active Grease Pencil datablock";
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* callbacks */
ot->exec= gp_layer_add_exec;
@@ -329,6 +337,7 @@ void GPENCIL_OT_active_frame_delete (wmOperatorType *ot)
ot->name= "Delete Active Frame";
ot->idname= "GPENCIL_OT_active_frame_delete";
ot->description= "Delete the active frame for the active Grease Pencil datablock";
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* callbacks */
ot->exec= gp_actframe_delete_exec;
@@ -483,7 +492,7 @@ static void gp_stroke_to_bezier (bContext *C, bGPDlayer *gpl, bGPDstroke *gps, C
copy_v3_v3(p3d_prev, p3d_cur);
copy_v3_v3(p3d_cur, p3d_next);
- if (i < tot) {
+ if (i + 1 < tot) {
gp_strokepoint_convertcoords(C, gps, pt+1, p3d_next);
}
}
@@ -544,9 +553,10 @@ static int gp_convert_poll (bContext *C)
{
bGPdata *gpd= gpencil_data_get_active(C);
ScrArea *sa= CTX_wm_area(C);
+ Scene *scene= CTX_data_scene(C);
/* only if there's valid data, and the current view is 3D View */
- return ((sa && sa->spacetype == SPACE_VIEW3D) && gpencil_layer_getactive(gpd));
+ return ((sa && sa->spacetype == SPACE_VIEW3D) && gpencil_layer_getactive(gpd) && (scene->obedit == NULL));
}
static int gp_convert_layer_exec (bContext *C, wmOperator *op)
@@ -593,6 +603,7 @@ void GPENCIL_OT_convert (wmOperatorType *ot)
ot->name= "Convert Grease Pencil";
ot->idname= "GPENCIL_OT_convert";
ot->description= "Convert the active Grease Pencil layer to a new Object";
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* callbacks */
ot->invoke= WM_menu_invoke;
diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h
index 7ae68d194b3..6ecdc2b054b 100644
--- a/source/blender/editors/gpencil/gpencil_intern.h
+++ b/source/blender/editors/gpencil/gpencil_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/gpencil/gpencil_intern.h
+ * \ingroup edgpencil
+ */
+
#ifndef ED_GPENCIL_INTERN_H
#define ED_GPENCIL_INTERN_H
diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c
index 55b2d2aa73d..f2efada8406 100644
--- a/source/blender/editors/gpencil/gpencil_ops.c
+++ b/source/blender/editors/gpencil/gpencil_ops.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/gpencil/gpencil_ops.c
+ * \ingroup edgpencil
+ */
+
+
#include <stdlib.h>
#include <stddef.h>
#include <stdio.h>
diff --git a/source/blender/editors/gpencil/gpencil_paint.c b/source/blender/editors/gpencil/gpencil_paint.c
index 06e67128496..96e7cedf18a 100644
--- a/source/blender/editors/gpencil/gpencil_paint.c
+++ b/source/blender/editors/gpencil/gpencil_paint.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/gpencil/gpencil_paint.c
+ * \ingroup edgpencil
+ */
+
+
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
@@ -379,10 +384,18 @@ static short gp_stroke_addpoint (tGPsdata *p, int mval[2], float pressure)
return GP_STROKEADD_INVALID;
}
+
+/* temp struct for gp_stroke_smooth() */
+typedef struct tGpSmoothCo {
+ short x;
+ short y;
+} tGpSmoothCo;
+
/* smooth a stroke (in buffer) before storing it */
static void gp_stroke_smooth (tGPsdata *p)
{
bGPdata *gpd= p->gpd;
+ tGpSmoothCo *smoothArray, *spc;
int i=0, cmx=gpd->sbuffer_size;
/* only smooth if smoothing is enabled, and we're not doing a straight line */
@@ -393,17 +406,31 @@ static void gp_stroke_smooth (tGPsdata *p)
if ((cmx <= 2) || (gpd->sbuffer == NULL))
return;
- /* apply weighting-average (note doing this along path sequentially does introduce slight error) */
- for (i=0; i < gpd->sbuffer_size; i++) {
+ /* create a temporary smoothing coordinates buffer, use to store calculated values to prevent sequential error */
+ smoothArray = MEM_callocN(sizeof(tGpSmoothCo)*cmx, "gp_stroke_smooth smoothArray");
+
+ /* first pass: calculate smoothing coordinates using weighted-averages */
+ for (i=0, spc=smoothArray; i < gpd->sbuffer_size; i++, spc++) {
+ const tGPspoint *pc= (((tGPspoint *)gpd->sbuffer) + i);
+ const tGPspoint *pb= (i-1 > 0)?(pc-1):(pc);
+ const tGPspoint *pa= (i-2 > 0)?(pc-2):(pb);
+ const tGPspoint *pd= (i+1 < cmx)?(pc+1):(pc);
+ const tGPspoint *pe= (i+2 < cmx)?(pc+2):(pd);
+
+ spc->x= (short)(0.1*pa->x + 0.2*pb->x + 0.4*pc->x + 0.2*pd->x + 0.1*pe->x);
+ spc->y= (short)(0.1*pa->y + 0.2*pb->y + 0.4*pc->y + 0.2*pd->y + 0.1*pe->y);
+ }
+
+ /* second pass: apply smoothed coordinates */
+ for (i=0, spc=smoothArray; i < gpd->sbuffer_size; i++, spc++) {
tGPspoint *pc= (((tGPspoint *)gpd->sbuffer) + i);
- tGPspoint *pb= (i-1 > 0)?(pc-1):(pc);
- tGPspoint *pa= (i-2 > 0)?(pc-2):(pb);
- tGPspoint *pd= (i+1 < cmx)?(pc+1):(pc);
- tGPspoint *pe= (i+2 < cmx)?(pc+2):(pd);
- pc->x= (short)(0.1*pa->x + 0.2*pb->x + 0.4*pc->x + 0.2*pd->x + 0.1*pe->x);
- pc->y= (short)(0.1*pa->y + 0.2*pb->y + 0.4*pc->y + 0.2*pd->y + 0.1*pe->y);
+ pc->x = spc->x;
+ pc->y = spc->y;
}
+
+ /* free temp array */
+ MEM_freeN(smoothArray);
}
/* simplify a stroke (in buffer) before storing it
@@ -1225,7 +1252,46 @@ static void gp_paint_cleanup (tGPsdata *p)
gp_paint_strokeend(p);
/* "unlock" frame */
- p->gpf->flag &= ~GP_FRAME_PAINT;
+ if (p->gpf)
+ p->gpf->flag &= ~GP_FRAME_PAINT;
+}
+
+/* ------------------------------- */
+
+static void gpencil_draw_exit (bContext *C, wmOperator *op)
+{
+ tGPsdata *p= op->customdata;
+
+ /* clear edit flags */
+ G.f &= ~G_GREASEPENCIL;
+
+ /* restore cursor to indicate end of drawing */
+ WM_cursor_restore(CTX_wm_window(C));
+
+ /* don't assume that operator data exists at all */
+ if (p) {
+ /* check size of buffer before cleanup, to determine if anything happened here */
+ if (p->paintmode == GP_PAINTMODE_ERASER) {
+ // TODO clear radial cursor thing
+ // XXX draw_sel_circle(NULL, p.mvalo, 0, p.radius, 0);
+ }
+
+ /* cleanup */
+ gp_paint_cleanup(p);
+ gp_session_cleanup(p);
+
+ /* finally, free the temp data */
+ MEM_freeN(p);
+ }
+
+ op->customdata= NULL;
+}
+
+static int gpencil_draw_cancel (bContext *C, wmOperator *op)
+{
+ /* this is just a wrapper around exit() */
+ gpencil_draw_exit(C, op);
+ return OPERATOR_CANCELLED;
}
/* ------------------------------- */
@@ -1240,14 +1306,14 @@ static int gpencil_draw_init (bContext *C, wmOperator *op)
p= op->customdata= gp_session_initpaint(C);
if ((p == NULL) || (p->status == GP_STATUS_ERROR)) {
/* something wasn't set correctly in context */
- gp_session_cleanup(p);
+ gpencil_draw_exit(C, op);
return 0;
}
/* init painting data */
gp_paint_initstroke(p, paintmode);
if (p->status == GP_STATUS_ERROR) {
- gp_session_cleanup(p);
+ gpencil_draw_exit(C, op);
return 0;
}
@@ -1260,40 +1326,6 @@ static int gpencil_draw_init (bContext *C, wmOperator *op)
/* ------------------------------- */
-static void gpencil_draw_exit (bContext *C, wmOperator *op)
-{
- tGPsdata *p= op->customdata;
-
- /* clear edit flags */
- G.f &= ~G_GREASEPENCIL;
-
- /* restore cursor to indicate end of drawing */
- WM_cursor_restore(CTX_wm_window(C));
-
- /* check size of buffer before cleanup, to determine if anything happened here */
- if (p->paintmode == GP_PAINTMODE_ERASER) {
- // TODO clear radial cursor thing
- // XXX draw_sel_circle(NULL, p.mvalo, 0, p.radius, 0);
- }
-
- /* cleanup */
- gp_paint_cleanup(p);
- gp_session_cleanup(p);
-
- /* finally, free the temp data */
- MEM_freeN(p);
- op->customdata= NULL;
-}
-
-static int gpencil_draw_cancel (bContext *C, wmOperator *op)
-{
- /* this is just a wrapper around exit() */
- gpencil_draw_exit(C, op);
- return OPERATOR_CANCELLED;
-}
-
-/* ------------------------------- */
-
/* update UI indicators of status, including cursor and header prints */
static void gpencil_draw_status_indicators (tGPsdata *p)
{
@@ -1568,6 +1600,18 @@ static int gpencil_draw_invoke (bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
+/* gpencil modal operator stores area, which can be removed while using it (like fullscreen) */
+static int gpencil_area_exists(bContext *C, ScrArea *satest)
+{
+ bScreen *sc= CTX_wm_screen(C);
+ ScrArea *sa;
+
+ for(sa= sc->areabase.first; sa; sa= sa->next)
+ if(sa==satest)
+ return 1;
+ return 0;
+}
+
/* events handling during interactive drawing part of operator */
static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
{
@@ -1580,7 +1624,6 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
if (ELEM4(event->type, RETKEY, PADENTER, ESCKEY, SPACEKEY)) {
/* exit() ends the current stroke before cleaning up */
//printf("\t\tGP - end of paint op + end of stroke\n");
- gpencil_draw_exit(C, op);
p->status= GP_STATUS_DONE;
estate = OPERATOR_FINISHED;
}
@@ -1603,7 +1646,6 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
}
else {
//printf("\t\tGP - end of stroke + op\n");
- gpencil_draw_exit(C, op);
p->status= GP_STATUS_DONE;
estate = OPERATOR_FINISHED;
}
@@ -1616,7 +1658,6 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
*/
if (CTX_wm_area(C) != p->sa) {
//printf("\t\t\tGP - wrong area execution abort! \n");
- gpencil_draw_exit(C, op);
p->status= GP_STATUS_ERROR;
estate = OPERATOR_CANCELLED;
}
@@ -1630,13 +1671,14 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
gp_paint_initstroke(p, p->paintmode);
if (p->status == GP_STATUS_ERROR) {
- gpencil_draw_exit(C, op);
estate = OPERATOR_CANCELLED;
}
}
}
}
+
+
/* handle mode-specific events */
if (p->status == GP_STATUS_PAINTING) {
/* handle painting mouse-movements? */
@@ -1649,7 +1691,6 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
/* finish painting operation if anything went wrong just now */
if (p->status == GP_STATUS_ERROR) {
//printf("\t\t\t\tGP - add error done! \n");
- gpencil_draw_exit(C, op);
estate = OPERATOR_CANCELLED;
}
else {
@@ -1684,16 +1725,25 @@ static int gpencil_draw_modal (bContext *C, wmOperator *op, wmEvent *event)
}
}
- /* update status indicators - cursor, header, etc. */
- gpencil_draw_status_indicators(p);
+ /* gpencil modal operator stores area, which can be removed while using it (like fullscreen) */
+ if(0==gpencil_area_exists(C, p->sa))
+ estate= OPERATOR_CANCELLED;
+ else
+ /* update status indicators - cursor, header, etc. */
+ gpencil_draw_status_indicators(p);
/* process last operations before exiting */
switch (estate) {
case OPERATOR_FINISHED:
/* one last flush before we're done */
+ gpencil_draw_exit(C, op);
WM_event_add_notifier(C, NC_SCREEN|ND_GPENCIL|NA_EDITED, NULL); // XXX need a nicer one that will work
break;
+ case OPERATOR_CANCELLED:
+ gpencil_draw_exit(C, op);
+ break;
+
case OPERATOR_RUNNING_MODAL|OPERATOR_PASS_THROUGH:
/* event doesn't need to be handled */
//printf("unhandled event -> %d (mmb? = %d | mmv? = %d)\n", event->type, event->type == MIDDLEMOUSE, event->type==MOUSEMOVE);
diff --git a/source/blender/editors/include/BIF_gl.h b/source/blender/editors/include/BIF_gl.h
index 85244a85613..873b4e52a20 100644
--- a/source/blender/editors/include/BIF_gl.h
+++ b/source/blender/editors/include/BIF_gl.h
@@ -35,7 +35,7 @@
#ifndef BIF_GL_H
#define BIF_GL_H
-#include "../../../../extern/glew/include/GL/glew.h"
+#include "GL/glew.h"
/*
* these should be phased out. cpack should be replaced in
diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index d19d3549fad..1ca33e73656 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -585,6 +585,11 @@ void ED_keymap_animchannels(struct wmKeyConfig *keyconf);
/* generic time editing */
void ED_operatortypes_anim(void);
void ED_keymap_anim(struct wmKeyConfig *keyconf);
+
+ /* space_graph */
+void ED_operatormacros_graph(void);
+ /* space_action */
+void ED_operatormacros_action(void);
/* ************************************************ */
diff --git a/source/blender/editors/include/ED_fileselect.h b/source/blender/editors/include/ED_fileselect.h
index 6b91779b832..1eedd7ec782 100644
--- a/source/blender/editors/include/ED_fileselect.h
+++ b/source/blender/editors/include/ED_fileselect.h
@@ -75,6 +75,13 @@ typedef struct FileLayout
float column_widths[MAX_FILE_COLUMN];
} FileLayout;
+typedef struct FileSelection {
+ int first;
+ int last;
+} FileSelection;
+
+struct rcti;
+
struct FileSelectParams* ED_fileselect_get_params(struct SpaceFile *sfile);
short ED_fileselect_set_params(struct SpaceFile *sfile);
@@ -88,7 +95,8 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar);
FileLayout* ED_fileselect_get_layout(struct SpaceFile *sfile, struct ARegion *ar);
int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar);
-int ED_fileselect_layout_offset(FileLayout* layout, int clamp_bounds, int x, int y);
+int ED_fileselect_layout_offset(FileLayout* layout, int x, int y);
+FileSelection ED_fileselect_layout_offset_rect(FileLayout* layout, const struct rcti* rect);
void ED_fileselect_layout_tilepos(FileLayout* layout, int tile, int *x, int *y);
diff --git a/source/blender/editors/include/ED_keyframes_draw.h b/source/blender/editors/include/ED_keyframes_draw.h
index c697f8cc435..3c1bb814c82 100644
--- a/source/blender/editors/include/ED_keyframes_draw.h
+++ b/source/blender/editors/include/ED_keyframes_draw.h
@@ -146,5 +146,11 @@ void gpl_to_keylist(struct bDopeSheet *ads, struct bGPDlayer *gpl, struct DLRBT_
/* Comparator callback used for ActKeyColumns and cframe float-value pointer */
short compare_ak_cfraPtr(void *node, void *data);
+/* Comparator callback used for ActKeyBlocks and cframe float-value pointer */
+short compare_ab_cfraPtr(void *node, void *data);
+
+/* Checks if ActKeyBlock can be used (i.e. drawn/used to detect "holds") */
+short actkeyblock_is_valid(ActKeyBlock *ab, struct DLRBT_Tree *keys);
+
#endif /* ED_KEYFRAMES_DRAW_H */
diff --git a/source/blender/editors/include/ED_markers.h b/source/blender/editors/include/ED_markers.h
index 728d9253760..f804e052301 100644
--- a/source/blender/editors/include/ED_markers.h
+++ b/source/blender/editors/include/ED_markers.h
@@ -36,6 +36,7 @@
struct wmKeyConfig;
struct bContext;
struct bAnimContext;
+struct Scene;
struct TimeMarker;
/* Drawing API ------------------------------ */
@@ -53,6 +54,8 @@ void draw_markers_time(const struct bContext *C, int flag);
ListBase *ED_context_get_markers(const struct bContext *C);
ListBase *ED_animcontext_get_markers(const struct bAnimContext *ac);
+int ED_markers_post_apply_transform(ListBase *markers, struct Scene *scene, int mode, float value, char side);
+
struct TimeMarker *ED_markers_find_nearest_marker(ListBase *markers, float x);
int ED_markers_find_nearest_marker_time(ListBase *markers, float x);
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index d486a8f2fef..b55af8ec388 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -75,6 +75,7 @@ struct Material;
struct Object;
struct rcti;
struct wmOperator;
+struct ToolSeetings;
// edge and face flag both
#define EM_FGON 2
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index f1665f2b165..93ce82fa483 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -95,14 +95,14 @@ void ED_area_swapspace(struct bContext *C, ScrArea *sa1, ScrArea *sa2);
void ED_screens_initialize(struct wmWindowManager *wm);
void ED_screen_draw(struct wmWindow *win);
void ED_screen_refresh(struct wmWindowManager *wm, struct wmWindow *win);
-void ED_screen_do_listen(struct wmWindow *win, struct wmNotifier *note);
+void ED_screen_do_listen(struct bContext *C, struct wmNotifier *note);
bScreen *ED_screen_duplicate(struct wmWindow *win, struct bScreen *sc);
bScreen *ED_screen_add(struct wmWindow *win, struct Scene *scene, const char *name);
void ED_screen_set(struct bContext *C, struct bScreen *sc);
void ED_screen_delete(struct bContext *C, struct bScreen *sc);
void ED_screen_set_scene(struct bContext *C, struct Scene *scene);
void ED_screen_delete_scene(struct bContext *C, struct Scene *scene);
-void ED_screen_set_subwinactive(struct wmWindow *win, struct wmEvent *event);
+void ED_screen_set_subwinactive(struct bContext *C, struct wmEvent *event);
void ED_screen_exit(struct bContext *C, struct wmWindow *window, struct bScreen *screen);
void ED_screen_animation_timer(struct bContext *C, int redraws, int refresh, int sync, int enable);
void ED_screen_animation_timer_update(struct bScreen *screen, int redraws, int refresh);
@@ -154,6 +154,7 @@ int ED_operator_console_active(struct bContext *C);
int ED_operator_object_active(struct bContext *C);
int ED_operator_object_active_editable(struct bContext *C);
int ED_operator_object_active_editable_mesh(struct bContext *C);
+int ED_operator_object_active_editable_font(struct bContext *C);
int ED_operator_editmesh(struct bContext *C);
int ED_operator_editmesh_view3d(struct bContext *C);
int ED_operator_editmesh_region_view3d(struct bContext *C);
diff --git a/source/blender/editors/include/ED_sequencer.h b/source/blender/editors/include/ED_sequencer.h
index 39eb66e56e9..cd22a5c6ca4 100644
--- a/source/blender/editors/include/ED_sequencer.h
+++ b/source/blender/editors/include/ED_sequencer.h
@@ -29,7 +29,7 @@
#ifndef ED_SEQUENCER_H
#define ED_SEQUENCER_H
-#define SEQ_ZOOM_FAC(szoom) (szoom > 0)? (szoom) : (szoom == 0)? (1.0) : (-1.0/szoom)
+#define SEQ_ZOOM_FAC(szoom) ((szoom) > 0.0f)? (szoom) : ((szoom) == 0.0f)? (1.0f) : (-1.0f/(szoom))
/* in space_sequencer.c, for rna update function */
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index 3ab634afeff..d4d7f971b74 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -77,6 +77,7 @@ enum {
TFM_TIME_SLIDE,
TFM_TIME_SCALE,
TFM_TIME_EXTEND,
+ TFM_TIME_DUPLICATE,
TFM_BAKE_TIME,
TFM_BEVEL,
TFM_BWEIGHT,
diff --git a/source/blender/editors/include/ED_util.h b/source/blender/editors/include/ED_util.h
index 06c9c12444e..7261d348928 100644
--- a/source/blender/editors/include/ED_util.h
+++ b/source/blender/editors/include/ED_util.h
@@ -40,7 +40,7 @@ struct ARegion;
struct uiBlock;
struct wmOperator;
struct wmOperatorType;
-struct EditMesh;
+struct BMEditMesh;
struct Mesh;
/* ed_util.c */
diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index 5d45415c3b3..88ccd58f4a1 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -65,11 +65,15 @@ void uvedit_uv_deselect(struct BMEditMesh *em, struct Scene *scene, struct BMLoo
int ED_uvedit_nearest_uv(struct Scene *scene, struct Object *obedit, struct Image *ima, float co[2], float uv[2]);
-/* uvedit_unwrap.c */
+/* uvedit_unwrap_ops.c */
void ED_uvedit_live_unwrap_begin(struct Scene *scene, struct Object *obedit);
void ED_uvedit_live_unwrap_re_solve(void);
void ED_uvedit_live_unwrap_end(short cancel);
+/* single call up unwrap using scene settings, used for edge tag unwrapping */
+void ED_unwrap_lscm(struct Scene *scene, struct Object *obedit, const short sel);
+
+/* uvedit_draw.c */
void draw_uvedit_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene, struct Object *obedit);
#endif /* ED_UVEDIT_H */
diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index 37541722682..37c146a810c 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -85,6 +85,7 @@ float *give_cursor(struct Scene *scene, struct View3D *v3d);
int initgrabz(struct RegionView3D *rv3d, float x, float y, float z);
void window_to_3d(struct ARegion *ar, float *vec, short mx, short my);
void window_to_3d_delta(struct ARegion *ar, float *vec, short mx, short my);
+void window_to_3d_vector(struct ARegion *ar, float *vec, short mx, short my);
void view3d_unproject(struct bglMats *mats, float out[3], const short x, const short y, const float z);
/* Depth buffer */
@@ -160,7 +161,7 @@ void view3d_region_operator_needs_opengl(struct wmWindow *win, struct ARegion *a
void view3d_get_view_aligned_coordinate(struct ViewContext *vc, float *fp, short mval[2]);
void view3d_get_transformation(struct ARegion *ar, struct RegionView3D *rv3d, struct Object *ob, struct bglMats *mats);
-/* XXX should move to arithb.c */
+/* XXX should move to BLI_math */
int edge_inside_circle(short centx, short centy, short rad, short x1, short y1, short x2, short y2);
int lasso_inside(short mcords[][2], short moves, short sx, short sy);
int lasso_inside_edge(short mcords[][2], short moves, int x0, int y0, int x1, int y1);
@@ -176,13 +177,15 @@ int ED_view3d_context_activate(struct bContext *C);
void ED_view3d_draw_offscreen(struct Scene *scene, struct View3D *v3d, struct ARegion *ar,
int winx, int winy, float viewmat[][4], float winmat[][4]);
-struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey, unsigned int flag);
-struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype);
+struct ImBuf *ED_view3d_draw_offscreen_imbuf(struct Scene *scene, struct View3D *v3d, struct ARegion *ar, int sizex, int sizey, unsigned int flag, char err_out[256]);
+struct ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype, char err_out[256]);
Base *ED_view3d_give_base_under_cursor(struct bContext *C, short *mval);
void ED_view3d_quadview_update(struct ScrArea *sa, struct ARegion *ar, short do_clip);
+int ED_view3d_lock(struct RegionView3D *rv3d);
+unsigned int ED_view3d_datamask(struct Scene *scene, struct View3D *v3d);
unsigned int ED_viewedit_datamask(struct bScreen *screen);
#endif /* ED_VIEW3D_H */
diff --git a/source/blender/editors/include/UI_icons.h b/source/blender/editors/include/UI_icons.h
index b2a353b0647..25e20909f34 100644
--- a/source/blender/editors/include/UI_icons.h
+++ b/source/blender/editors/include/UI_icons.h
@@ -35,7 +35,7 @@
once for interface_api.c for the definition of the RNA enum for the icons */
/* ICON_ prefix added */
-DEF_ICON(BLENDER)
+DEF_ICON(NONE)
DEF_ICON(QUESTION)
DEF_ICON(ERROR)
DEF_ICON(CANCEL)
@@ -50,8 +50,8 @@ DEF_ICON(DISCLOSURE_TRI_RIGHT)
DEF_ICON(RADIOBUT_OFF)
DEF_ICON(RADIOBUT_ON)
DEF_ICON(MENU_PANEL)
+DEF_ICON(BLENDER)
#ifndef DEF_ICON_BLANK_SKIP
- DEF_ICON(BLANK002)
DEF_ICON(BLANK003)
#endif
DEF_ICON(DOT)
diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h
index 55d7d0c219d..e0f34410673 100644
--- a/source/blender/editors/include/UI_interface.h
+++ b/source/blender/editors/include/UI_interface.h
@@ -322,6 +322,7 @@ void uiBlockSetEmboss(uiBlock *block, char dt);
void uiFreeBlock(const struct bContext *C, uiBlock *block);
void uiFreeBlocks(const struct bContext *C, struct ListBase *lb);
void uiFreeInactiveBlocks(const struct bContext *C, struct ListBase *lb);
+void uiFreeActiveButtons(const struct bContext *C, struct bScreen *screen);
void uiBlockSetRegion(uiBlock *block, struct ARegion *region);
@@ -639,9 +640,6 @@ void UI_exit(void);
#define UI_LAYOUT_OP_SHOW_TITLE 1
#define UI_LAYOUT_OP_SHOW_EMPTY 2
-/* for more readable function names */
-#define ICON_NULL 0
-
uiLayout *uiBlockLayout(uiBlock *block, int dir, int type, int x, int y, int size, int em, struct uiStyle *style);
void uiBlockSetCurLayout(uiBlock *block, uiLayout *layout);
void uiBlockLayoutResolve(uiBlock *block, int *x, int *y);
@@ -722,6 +720,7 @@ void uiTemplateList(uiLayout *layout, struct bContext *C, struct PointerRNA *ptr
/* items */
void uiItemO(uiLayout *layout, const char *name, int icon, const char *opname);
void uiItemEnumO(uiLayout *layout, const char *opname, const char *name, int icon, const char *propname, int value);
+void uiItemEnumO_value(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value);
void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value);
void uiItemsEnumO(uiLayout *layout, const char *opname, const char *propname);
void uiItemBooleanO(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value);
diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h
index 9c3a378608b..e5ae09cd8e1 100644
--- a/source/blender/editors/include/UI_resources.h
+++ b/source/blender/editors/include/UI_resources.h
@@ -43,12 +43,14 @@
#define DEF_VICO(name) VICO_##name,
typedef enum {
-#define BIFICONID_FIRST (ICON_BLENDER)
/* ui */
#include "UI_icons.h"
BIFICONID_LAST
-#define BIFNICONIDS (BIFICONID_LAST-BIFICONID_FIRST + 1)
} BIFIconID;
+
+#define BIFICONID_FIRST (ICON_NONE)
+#define BIFNICONIDS (BIFICONID_LAST-BIFICONID_FIRST + 1)
+
#undef DEF_ICON
#undef DEF_VICO
@@ -159,6 +161,7 @@ enum {
TH_VERTEX,
TH_VERTEX_SELECT,
TH_VERTEX_SIZE,
+ TH_OUTLINE_WIDTH,
TH_EDGE,
TH_EDGE_SELECT,
TH_EDGE_SEAM,
diff --git a/source/blender/editors/interface/CMakeLists.txt b/source/blender/editors/interface/CMakeLists.txt
index 09ea9f9ad7e..cf0c903e0a5 100644
--- a/source/blender/editors/interface/CMakeLists.txt
+++ b/source/blender/editors/interface/CMakeLists.txt
@@ -32,6 +32,7 @@ set(INC
../../python
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c
index 674ad8d4a49..166046aa64e 100644
--- a/source/blender/editors/interface/interface.c
+++ b/source/blender/editors/interface/interface.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface.c
+ * \ingroup edinterface
+ */
+
+
#include <float.h>
#include <limits.h>
#include <math.h>
@@ -115,8 +120,8 @@ void ui_block_to_window_fl(const ARegion *ar, uiBlock *block, float *x, float *y
gy += block->panel->ofsy;
}
- *x= ((float)sx) + ((float)getsizex)*(0.5+ 0.5*(gx*block->winmat[0][0]+ gy*block->winmat[1][0]+ block->winmat[3][0]));
- *y= ((float)sy) + ((float)getsizey)*(0.5+ 0.5*(gx*block->winmat[0][1]+ gy*block->winmat[1][1]+ block->winmat[3][1]));
+ *x= ((float)sx) + ((float)getsizex)*(0.5f+ 0.5f*(gx*block->winmat[0][0]+ gy*block->winmat[1][0]+ block->winmat[3][0]));
+ *y= ((float)sy) + ((float)getsizey)*(0.5f+ 0.5f*(gx*block->winmat[0][1]+ gy*block->winmat[1][1]+ block->winmat[3][1]));
}
void ui_block_to_window(const ARegion *ar, uiBlock *block, int *x, int *y)
@@ -156,13 +161,13 @@ void ui_window_to_block_fl(const ARegion *ar, uiBlock *block, float *x, float *y
sx= ar->winrct.xmin;
sy= ar->winrct.ymin;
- a= .5*((float)getsizex)*block->winmat[0][0];
- b= .5*((float)getsizex)*block->winmat[1][0];
- c= .5*((float)getsizex)*(1.0+block->winmat[3][0]);
+ a= 0.5f*((float)getsizex)*block->winmat[0][0];
+ b= 0.5f*((float)getsizex)*block->winmat[1][0];
+ c= 0.5f*((float)getsizex)*(1.0f+block->winmat[3][0]);
- d= .5*((float)getsizey)*block->winmat[0][1];
- e= .5*((float)getsizey)*block->winmat[1][1];
- f= .5*((float)getsizey)*(1.0+block->winmat[3][1]);
+ d= 0.5f*((float)getsizey)*block->winmat[0][1];
+ e= 0.5f*((float)getsizey)*block->winmat[1][1];
+ f= 0.5f*((float)getsizey)*(1.0f+block->winmat[3][1]);
px= *x - sx;
py= *y - sy;
@@ -450,10 +455,10 @@ static void ui_draw_linkline(uiLinkLine *line)
if(line->from==NULL || line->to==NULL) return;
- rect.xmin= (line->from->x1+line->from->x2)/2.0;
- rect.ymin= (line->from->y1+line->from->y2)/2.0;
- rect.xmax= (line->to->x1+line->to->x2)/2.0;
- rect.ymax= (line->to->y1+line->to->y2)/2.0;
+ rect.xmin= (line->from->x1+line->from->x2)/2.0f;
+ rect.ymin= (line->from->y1+line->from->y2)/2.0f;
+ rect.xmax= (line->to->x1+line->to->x2)/2.0f;
+ rect.ymax= (line->to->y1+line->to->y2)/2.0f;
if(line->flag & UI_SELECT)
glColor3ub(100,100,100);
@@ -502,6 +507,38 @@ static int ui_but_equals_old(uiBut *but, uiBut *oldbut)
return 1;
}
+/* oldbut is being inserted in new block, so we use the lines from new button, and replace button pointers */
+static void ui_but_update_linklines(uiBlock *block, uiBut *oldbut, uiBut *newbut)
+{
+ uiLinkLine *line;
+ uiBut *but;
+
+ /* if active button is LINK */
+ if(newbut->type==LINK && newbut->link) {
+
+ SWAP(uiLink *, oldbut->link, newbut->link);
+
+ for(line= oldbut->link->lines.first; line; line= line->next) {
+ if(line->to==newbut)
+ line->to= oldbut;
+ if(line->from==newbut)
+ line->from= oldbut;
+ }
+ }
+
+ /* check all other button links */
+ for(but= block->buttons.first; but; but= but->next) {
+ if(but!=newbut && but->type==LINK && but->link) {
+ for(line= but->link->lines.first; line; line= line->next) {
+ if(line->to==newbut)
+ line->to= oldbut;
+ if(line->from==newbut)
+ line->from= oldbut;
+ }
+ }
+ }
+}
+
static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut **butpp)
{
uiBlock *oldblock;
@@ -550,6 +587,15 @@ static int ui_but_update_from_old_block(const bContext *C, uiBlock *block, uiBut
oldbut->x2= but->x2; oldbut->y2= but->y2;
oldbut->context= but->context; /* set by Layout */
+ /* typically the same pointers, but not on undo/redo */
+ /* XXX some menu buttons store button itself in but->poin. Ugly */
+ if(oldbut->poin != (char *)oldbut) {
+ SWAP(char *, oldbut->poin, but->poin)
+ SWAP(void *, oldbut->func_argN, but->func_argN)
+ }
+
+ ui_but_update_linklines(block, oldbut, but);
+
BLI_remlink(&block->buttons, but);
ui_free_but(C, but);
@@ -754,7 +800,7 @@ void uiEndBlock(const bContext *C, uiBlock *block)
else if(block->dobounds == UI_BLOCK_BOUNDS_POPUP_CENTER) ui_centered_bounds_block(C, block);
else if(block->dobounds) ui_popup_bounds_block(C, block, block->dobounds);
- if(block->minx==0.0 && block->maxx==0.0) uiBoundsBlock(block, 0);
+ if(block->minx==0.0f && block->maxx==0.0f) uiBoundsBlock(block, 0);
if(block->flag & UI_BUT_ALIGN) uiBlockEndAlign(block);
block->endblock= 1;
@@ -771,10 +817,10 @@ void ui_fontscale(short *points, float aspect)
aspect= sqrt(aspect);
pointsf /= aspect;
- if(aspect > 1.0)
- *points= ceil(pointsf);
+ if(aspect > 1.0f)
+ *points= ceilf(pointsf);
else
- *points= floor(pointsf);
+ *points= floorf(pointsf);
}
}
@@ -790,14 +836,14 @@ static void ui_but_to_pixelrect(rcti *rect, const ARegion *ar, uiBlock *block, u
gx= (but?but->x1:block->minx) + (block->panel?block->panel->ofsx:0.0f);
gy= (but?but->y1:block->miny) + (block->panel?block->panel->ofsy:0.0f);
- rect->xmin= floor(getsizex*(0.5+ 0.5*(gx*block->winmat[0][0]+ gy*block->winmat[1][0]+ block->winmat[3][0])));
- rect->ymin= floor(getsizey*(0.5+ 0.5*(gx*block->winmat[0][1]+ gy*block->winmat[1][1]+ block->winmat[3][1])));
+ rect->xmin= floorf(getsizex*(0.5f+ 0.5f*(gx*block->winmat[0][0]+ gy*block->winmat[1][0]+ block->winmat[3][0])));
+ rect->ymin= floorf(getsizey*(0.5f+ 0.5f*(gx*block->winmat[0][1]+ gy*block->winmat[1][1]+ block->winmat[3][1])));
gx= (but?but->x2:block->maxx) + (block->panel?block->panel->ofsx:0.0f);
gy= (but?but->y2:block->maxy) + (block->panel?block->panel->ofsy:0.0f);
- rect->xmax= floor(getsizex*(0.5+ 0.5*(gx*block->winmat[0][0]+ gy*block->winmat[1][0]+ block->winmat[3][0])));
- rect->ymax= floor(getsizey*(0.5+ 0.5*(gx*block->winmat[0][1]+ gy*block->winmat[1][1]+ block->winmat[3][1])));
+ rect->xmax= floorf(getsizex*(0.5f+ 0.5f*(gx*block->winmat[0][0]+ gy*block->winmat[1][0]+ block->winmat[3][0])));
+ rect->ymax= floorf(getsizey*(0.5f+ 0.5f*(gx*block->winmat[0][1]+ gy*block->winmat[1][1]+ block->winmat[3][1])));
}
@@ -868,15 +914,14 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
static void ui_is_but_sel(uiBut *but)
{
- double value;
- int lvalue;
+ double value; /* only initialized when needed, to avoid calling when not used */
short push=0, true=1;
- value= ui_get_but_val(but);
-
if(ELEM3(but->type, TOGN, ICONTOGN, OPTIONN)) true= 0;
if( but->bit ) {
+ int lvalue;
+ value= ui_get_but_val(but);
lvalue= (int)value;
if( BTST(lvalue, (but->bitnr)) ) push= true;
else push= !true;
@@ -897,21 +942,24 @@ static void ui_is_but_sel(uiBut *but)
case BUT_TOGDUAL:
case ICONTOG:
case OPTION:
- if(value!=but->hardmin) push= 1;
+ value= ui_get_but_val(but);
+ if(value != (double)but->hardmin) push= 1;
break;
case ICONTOGN:
case TOGN:
case OPTIONN:
+ value= ui_get_but_val(but);
if(value==0.0) push= 1;
break;
case ROW:
case LISTROW:
+ value= ui_get_but_val(but);
/* support for rna enum buts */
if(but->rnaprop && (RNA_property_flag(but->rnaprop) & PROP_ENUM_FLAG)) {
if((int)value & (int)but->hardmax) push= 1;
}
else {
- if(value == but->hardmax) push= 1;
+ if(value == (double)but->hardmax) push= 1;
}
break;
case COL:
@@ -928,40 +976,6 @@ static void ui_is_but_sel(uiBut *but)
else but->flag &= ~UI_SELECT;
}
-/* XXX 2.50 no links supported yet */
-#if 0
-static int uibut_contains_pt(uiBut *UNUSED(but), short *UNUSED(mval))
-{
- return 0;
-
-}
-
-static uiBut *ui_get_valid_link_button(uiBlock *block, uiBut *but, short *mval)
-{
- uiBut *bt;
-
- /* find button to link to */
- for (bt= block->buttons.first; bt; bt= bt->next)
- if(bt!=but && uibut_contains_pt(bt, mval))
- break;
-
- if (bt) {
- if (but->type==LINK && bt->type==INLINK) {
- if( but->link->tocode == (int)bt->hardmin ) {
- return bt;
- }
- }
- else if(but->type==INLINK && bt->type==LINK) {
- if( bt->link->tocode == (int)but->hardmin ) {
- return bt;
- }
- }
- }
-
- return NULL;
-}
-#endif
-
static uiBut *ui_find_inlink(uiBlock *block, void *poin)
{
uiBut *but;
@@ -1081,166 +1095,6 @@ void ui_delete_linkline(uiLinkLine *line, uiBut *but)
MEM_freeN(line);
//REDRAW
}
-/* XXX 2.50 no links supported yet */
-#if 0
-static void ui_delete_active_linkline(uiBlock *block)
-{
- uiBut *but;
- uiLink *link;
- uiLinkLine *line, *nline;
- int a, b;
-
- but= block->buttons.first;
- while(but) {
- if(but->type==LINK && but->link) {
- line= but->link->lines.first;
- while(line) {
-
- nline= line->next;
-
- if(line->flag & UI_SELECT) {
- BLI_remlink(&but->link->lines, line);
-
- link= line->from->link;
-
- /* are there more pointers allowed? */
- if(link->ppoin) {
-
- if(*(link->totlink)==1) {
- *(link->totlink)= 0;
- MEM_freeN(*(link->ppoin));
- *(link->ppoin)= NULL;
- }
- else {
- b= 0;
- for(a=0; a< (*(link->totlink)); a++) {
-
- if( (*(link->ppoin))[a] != line->to->poin ) {
- (*(link->ppoin))[b]= (*(link->ppoin))[a];
- b++;
- }
- }
- (*(link->totlink))--;
- }
- }
- else {
- *(link->poin)= NULL;
- }
-
- MEM_freeN(line);
- }
- line= nline;
- }
- }
- but= but->next;
- }
-
- /* temporal! these buttons can be everywhere... */
- allqueue(REDRAWBUTSLOGIC, 0);
-}
-
-static void ui_do_active_linklines(uiBlock *block, short *mval)
-{
- uiBut *but;
- uiLinkLine *line, *act= NULL;
- float mindist= 12.0, fac, v1[2], v2[2], v3[3];
- int foundone= 0;
-
- if(mval) {
- v1[0]= mval[0];
- v1[1]= mval[1];
-
- /* find a line close to the mouse */
- but= block->buttons.first;
- while(but) {
- if(but->type==LINK && but->link) {
- foundone= 1;
- line= but->link->lines.first;
- while(line) {
- v2[0]= line->from->x2;
- v2[1]= (line->from->y1+line->from->y2)/2.0;
- v3[0]= line->to->x1;
- v3[1]= (line->to->y1+line->to->y2)/2.0;
-
- fac= dist_to_line_segment_v2(v1, v2, v3);
- if(fac < mindist) {
- mindist= fac;
- act= line;
- }
- line= line->next;
- }
- }
- but= but->next;
- }
- }
-
- /* check for a 'found one' to prevent going to 'frontbuffer' mode.
- this slows done gfx quite some, and at OSX the 'finish' forces a swapbuffer */
- if(foundone) {
- glDrawBuffer(GL_FRONT);
-
- /* draw */
- but= block->buttons.first;
- while(but) {
- if(but->type==LINK && but->link) {
- line= but->link->lines.first;
- while(line) {
- if(line==act) {
- if((line->flag & UI_SELECT)==0) {
- line->flag |= UI_SELECT;
- ui_draw_linkline(line);
- }
- }
- else if(line->flag & UI_SELECT) {
- line->flag &= ~UI_SELECT;
- ui_draw_linkline(line);
- }
- line= line->next;
- }
- }
- but= but->next;
- }
- bglFlush();
- glDrawBuffer(GL_BACK);
- }
-}
-#endif
-
-/* ******************************************************* */
-
-/* XXX 2.50 no screendump supported yet */
-
-#if 0
-/* nasty but safe way to store screendump rect */
-static int scr_x=0, scr_y=0, scr_sizex=0, scr_sizey=0;
-
-static void ui_set_screendump_bbox(uiBlock *block)
-{
- if(block) {
- scr_x= block->minx;
- scr_y= block->miny;
- scr_sizex= block->maxx - block->minx;
- scr_sizey= block->maxy - block->miny;
- }
- else {
- scr_sizex= scr_sizey= 0;
- }
-}
-
-/* used for making screenshots for menus, called in screendump.c */
-int uiIsMenu(int *x, int *y, int *sizex, int *sizey)
-{
- if(scr_sizex!=0 && scr_sizey!=0) {
- *x= scr_x;
- *y= scr_y;
- *sizex= scr_sizex;
- *sizey= scr_sizey;
- return 1;
- }
-
- return 0;
-}
-#endif
/* *********************** data get/set ***********************
* this either works with the pointed to data, or can work with
@@ -1271,9 +1125,9 @@ void ui_get_but_vectorf(uiBut *but, float *vec)
}
else if(but->pointype == CHA) {
char *cp= (char *)but->poin;
- vec[0]= ((float)cp[0])/255.0;
- vec[1]= ((float)cp[1])/255.0;
- vec[2]= ((float)cp[2])/255.0;
+ vec[0]= ((float)cp[0])/255.0f;
+ vec[1]= ((float)cp[1])/255.0f;
+ vec[2]= ((float)cp[2])/255.0f;
}
else if(but->pointype == FLO) {
float *fp= (float *)but->poin;
@@ -1310,9 +1164,9 @@ void ui_set_but_vectorf(uiBut *but, float *vec)
}
else if(but->pointype == CHA) {
char *cp= (char *)but->poin;
- cp[0]= (char)(0.5 +vec[0]*255.0);
- cp[1]= (char)(0.5 +vec[1]*255.0);
- cp[2]= (char)(0.5 +vec[2]*255.0);
+ cp[0]= (char)(0.5f + vec[0]*255.0f);
+ cp[1]= (char)(0.5f + vec[1]*255.0f);
+ cp[2]= (char)(0.5f + vec[2]*255.0f);
}
else if(but->pointype == FLO) {
float *fp= (float *)but->poin;
@@ -1357,6 +1211,17 @@ int ui_is_but_unit(uiBut *but)
return 1;
}
+int ui_is_but_rna_valid(uiBut *but)
+{
+ if (but->rnaprop==NULL || RNA_struct_contains_property(&but->rnapoin, but->rnaprop)) {
+ return TRUE;
+ }
+ else {
+ printf("property removed %s: %p\n", but->drawstr, but->rnaprop);
+ return FALSE;
+ }
+}
+
double ui_get_but_val(uiBut *but)
{
PropertyRNA *prop;
@@ -1536,7 +1401,7 @@ static double ui_get_but_scale_unit(uiBut *but, double value)
int unit_type= uiButGetUnitType(but);
if(unit_type == PROP_UNIT_LENGTH) {
- return value * scene->unit.scale_length;
+ return value * (double)scene->unit.scale_length;
}
else if(unit_type == PROP_UNIT_AREA) {
return value * pow(scene->unit.scale_length, 2);
@@ -1576,7 +1441,7 @@ static void ui_get_but_string_unit(uiBut *but, char *str, int len_max, double va
int unit_type= uiButGetUnitType(but);
int precision= but->a2;
- if(scene->unit.scale_length<0.0001) scene->unit.scale_length= 1.0; // XXX do_versions
+ if(scene->unit.scale_length<0.0001f) scene->unit.scale_length= 1.0f; // XXX do_versions
/* Sanity checks */
if(precision>7) precision= 7;
@@ -1593,8 +1458,8 @@ static float ui_get_but_step_unit(uiBut *but, float step_default)
step = bUnit_ClosestScalar(ui_get_but_scale_unit(but, step_default), scene->unit.system, unit_type);
- if(step > 0.0) { /* -1 is an error value */
- return (step/ui_get_but_scale_unit(but, 1.0))*100;
+ if(step > 0.0f) { /* -1 is an error value */
+ return (float)((double)step/ui_get_but_scale_unit(but, 1.0))*100.0f;
}
else {
return step_default;
@@ -1663,18 +1528,13 @@ void ui_get_but_string(uiBut *but, char *str, int maxlen)
if(ui_is_but_unit(but)) {
ui_get_but_string_unit(but, str, maxlen, value, 0);
}
- else if(but->a2) { /* amount of digits defined */
- if(but->a2==1) BLI_snprintf(str, maxlen, "%.1f", value);
- else if(but->a2==2) BLI_snprintf(str, maxlen, "%.2f", value);
- else if(but->a2==3) BLI_snprintf(str, maxlen, "%.3f", value);
- else if(but->a2==4) BLI_snprintf(str, maxlen, "%.4f", value);
- else if(but->a2==5) BLI_snprintf(str, maxlen, "%.5f", value);
- else if(but->a2==6) BLI_snprintf(str, maxlen, "%.6f", value);
- else if(but->a2==7) BLI_snprintf(str, maxlen, "%.7f", value);
- else BLI_snprintf(str, maxlen, "%.4f", value);
+ else {
+ int prec= (int)but->a2;
+ if(prec==0) prec= 3;
+ else CLAMP(prec, 1, 7);
+
+ BLI_snprintf(str, maxlen, "%.*f", prec, value);
}
- else
- BLI_snprintf(str, maxlen, "%.3f", value);
}
else
BLI_snprintf(str, maxlen, "%d", (int)value);
@@ -1768,8 +1628,8 @@ int ui_set_but_string(bContext *C, uiBut *but, const char *str)
if(but->type==NUMABS) value= fabs(value);
/* not that we use hard limits here */
- if(value<but->hardmin) value= but->hardmin;
- if(value>but->hardmax) value= but->hardmax;
+ if(value < (double)but->hardmin) value= but->hardmin;
+ if(value > (double)but->hardmax) value= but->hardmax;
ui_set_but_val(but, value);
return 1;
@@ -1840,8 +1700,8 @@ void ui_set_but_soft_range(uiBut *but, double value)
float fmin, fmax, fstep, fprecision;
RNA_property_float_ui_range(&but->rnapoin, but->rnaprop, &fmin, &fmax, &fstep, &fprecision);
- softmin= (fmin == -FLT_MAX)? -1e4: fmin;
- softmax= (fmax == FLT_MAX)? 1e4: fmax;
+ softmin= (fmin == -FLT_MAX)? (float)-1e4: fmin;
+ softmax= (fmax == FLT_MAX)? (float)1e4: fmax;
/*step= fstep;*/ /*UNUSED*/
/*precision= fprecision;*/ /*UNUSED*/
}
@@ -1855,8 +1715,8 @@ void ui_set_but_soft_range(uiBut *but, double value)
else
softmin= soft_range_round_down(value, softmin);
- if(softmin < but->hardmin)
- softmin= but->hardmin;
+ if(softmin < (double)but->hardmin)
+ softmin= (double)but->hardmin;
}
else if(value-1e-10 > softmax) {
if(value < 0.0)
@@ -1864,7 +1724,7 @@ void ui_set_but_soft_range(uiBut *but, double value)
else
softmax= soft_range_round_up(value, softmax);
- if(softmax > but->hardmax)
+ if(softmax > (double)but->hardmax)
softmax= but->hardmax;
}
@@ -2048,7 +1908,7 @@ void ui_check_but(uiBut *but)
{
/* if something changed in the button */
double value;
- float okwidth;
+// float okwidth; // UNUSED
// int transopts= ui_translate_buttons();
ui_is_but_sel(but);
@@ -2067,14 +1927,14 @@ void ui_check_but(uiBut *but)
case NUMSLI:
case HSVSLI:
value= ui_get_but_val(but);
- if(value < but->hardmin) ui_set_but_val(but, but->hardmin);
- else if(value > but->hardmax) ui_set_but_val(but, but->hardmax);
+ if(value < (double)but->hardmin) ui_set_but_val(but, but->hardmin);
+ else if(value > (double)but->hardmax) ui_set_but_val(but, but->hardmax);
break;
case NUMABS:
value= fabs( ui_get_but_val(but) );
- if(value < but->hardmin) ui_set_but_val(but, but->hardmin);
- else if(value > but->hardmax) ui_set_but_val(but, but->hardmax);
+ if(value < (double)but->hardmin) ui_set_but_val(but, but->hardmin);
+ else if(value > (double)but->hardmax) ui_set_but_val(but, but->hardmax);
break;
case ICONTOG:
@@ -2102,7 +1962,7 @@ void ui_check_but(uiBut *but)
/* safety is 4 to enable small number buttons (like 'users') */
- okwidth= -4 + (but->x2 - but->x1);
+ // okwidth= -4 + (but->x2 - but->x1); // UNUSED
/* name: */
switch( but->type ) {
@@ -2124,27 +1984,20 @@ void ui_check_but(uiBut *but)
value= ui_get_but_val(but);
if(ui_is_but_float(but)) {
- if(value == FLT_MAX) sprintf(but->drawstr, "%sinf", but->str);
- else if(value == -FLT_MAX) sprintf(but->drawstr, "%s-inf", but->str);
+ if(value == (double) FLT_MAX) sprintf(but->drawstr, "%sinf", but->str);
+ else if(value == (double) -FLT_MAX) sprintf(but->drawstr, "%s-inf", but->str);
/* support length type buttons */
else if(ui_is_but_unit(but)) {
char new_str[sizeof(but->drawstr)];
ui_get_but_string_unit(but, new_str, sizeof(new_str), value, TRUE);
BLI_snprintf(but->drawstr, sizeof(but->drawstr), "%s%s", but->str, new_str);
}
- else if(but->a2) { /* amount of digits defined */
- if(but->a2==1) sprintf(but->drawstr, "%s%.1f", but->str, value);
- else if(but->a2==2) sprintf(but->drawstr, "%s%.2f", but->str, value);
- else if(but->a2==3) sprintf(but->drawstr, "%s%.3f", but->str, value);
- else if(but->a2==4) sprintf(but->drawstr, "%s%.4f", but->str, value);
- else if(but->a2==5) sprintf(but->drawstr, "%s%.5f", but->str, value);
- else if(but->a2==6) sprintf(but->drawstr, "%s%.6f", but->str, value);
- else if(but->a2==7) sprintf(but->drawstr, "%s%.7f", but->str, value);
- else sprintf(but->drawstr, "%s%.4f", but->str, value);
- }
else {
- if(but->hardmax<10.001) sprintf(but->drawstr, "%s%.3f", but->str, value);
- else sprintf(but->drawstr, "%s%.2f", but->str, value);
+ int prec= (int)but->a2;
+ if(prec==0) prec= (but->hardmax < 10.001f) ? 3 : 2;
+ else CLAMP(prec, 1, 7);
+
+ BLI_snprintf(but->drawstr, sizeof(but->drawstr), "%s%.*f", but->str, prec, value);
}
}
else {
@@ -2161,22 +2014,16 @@ void ui_check_but(uiBut *but)
case LABEL:
if(ui_is_but_float(but)) {
+ int prec= (int)but->a2;
value= ui_get_but_val(but);
- if(but->a2) { /* amount of digits defined */
- if(but->a2==1) sprintf(but->drawstr, "%s%.1f", but->str, value);
- else if(but->a2==2) sprintf(but->drawstr, "%s%.2f", but->str, value);
- else if(but->a2==3) sprintf(but->drawstr, "%s%.3f", but->str, value);
- else if(but->a2==4) sprintf(but->drawstr, "%s%.4f", but->str, value);
- else if(but->a2==5) sprintf(but->drawstr, "%s%.5f", but->str, value);
- else if(but->a2==6) sprintf(but->drawstr, "%s%.6f", but->str, value);
- else if(but->a2==7) sprintf(but->drawstr, "%s%.7f", but->str, value);
- else sprintf(but->drawstr, "%s%.4f", but->str, value);
- }
- else {
- sprintf(but->drawstr, "%s%.2f", but->str, value);
- }
+ if(prec==0) prec= 3;
+ else CLAMP(prec, 1, 7);
+
+ BLI_snprintf(but->drawstr, sizeof(but->drawstr), "%s%.*f", but->str, prec, value);
+ }
+ else {
+ strncpy(but->drawstr, but->str, UI_MAX_DRAW_STR);
}
- else strncpy(but->drawstr, but->str, UI_MAX_DRAW_STR);
break;
@@ -2342,7 +2189,7 @@ static void ui_block_do_align_but(uiBut *first, int nr)
if(bt->next && bt->next->alignnr == nr && buts_are_horiz(bt, bt->next)==0 ) break;
bt= bt->next;
}
- if(bt==0 || bt->alignnr != nr) flag= UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT;
+ if(bt==NULL || bt->alignnr != nr) flag= UI_BUT_ALIGN_TOP|UI_BUT_ALIGN_RIGHT;
}
}
else flag |= UI_BUT_ALIGN_LEFT;
@@ -2383,23 +2230,23 @@ static void ui_block_do_align_but(uiBut *first, int nr)
if(prev) {
// simple cases
if(rows==0) {
- but->x1= (prev->x2+but->x1)/2.0;
+ but->x1= (prev->x2+but->x1)/2.0f;
prev->x2= but->x1;
}
else if(cols==0) {
- but->y2= (prev->y1+but->y2)/2.0;
+ but->y2= (prev->y1+but->y2)/2.0f;
prev->y1= but->y2;
}
else {
if(buts_are_horiz(prev, but)) {
- but->x1= (prev->x2+but->x1)/2.0;
+ but->x1= (prev->x2+but->x1)/2.0f;
prev->x2= but->x1;
/* copy height too */
but->y2= prev->y2;
}
else if(prev->prev && buts_are_horiz(prev->prev, prev)==0) {
/* the previous button is a single one in its row */
- but->y2= (prev->y1+but->y2)/2.0;
+ but->y2= (prev->y1+but->y2)/2.0f;
prev->y1= but->y2;
but->x1= prev->x1;
@@ -2533,7 +2380,7 @@ static uiBut *ui_def_but(uiBlock *block, int type, int retval, const char *str,
/* keep track of UI_interface.h */
if(ELEM7(but->type, BLOCK, BUT, LABEL, PULLDOWN, ROUNDBOX, LISTBOX, BUTM));
- else if(ELEM5(but->type, SCROLL, SEPR, LINK, INLINK, FTPREVIEW));
+ else if(ELEM3(but->type, SCROLL, SEPR, FTPREVIEW));
else if(but->type >= SEARCH_MENU);
else but->flag |= UI_BUT_UNDO;
@@ -2681,7 +2528,7 @@ static uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, const char *s
}
}
else {
- printf("ui_def_but_rna: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("ui_def_but_rna: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
str= propname;
}
@@ -3181,7 +3028,7 @@ void uiBlockFlipOrder(uiBlock *block)
if(but->y2 > maxy) maxy= but->y2;
}
/* mirror trick */
- centy= (miny+maxy)/2.0;
+ centy= (miny+maxy)/2.0f;
for(but= block->buttons.first; but; but= but->next) {
but->y1 = centy-(but->y1-centy);
but->y2 = centy-(but->y2-centy);
diff --git a/source/blender/editors/interface/interface_anim.c b/source/blender/editors/interface/interface_anim.c
index 0f77b437eeb..75e7ee701a2 100644
--- a/source/blender/editors/interface/interface_anim.c
+++ b/source/blender/editors/interface/interface_anim.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/interface/interface_anim.c
+ * \ingroup edinterface
+ */
#include <stdio.h>
#include <stdlib.h>
diff --git a/source/blender/editors/interface/interface_draw.c b/source/blender/editors/interface/interface_draw.c
index 940a9791a4e..f8ce278814f 100644
--- a/source/blender/editors/interface/interface_draw.c
+++ b/source/blender/editors/interface/interface_draw.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_draw.c
+ * \ingroup edinterface
+ */
+
+
#include <math.h>
#include <string.h>
@@ -139,9 +144,9 @@ static void round_box_shade_col(float *col1, float *col2, float fac)
{
float col[3];
- col[0]= (fac*col1[0] + (1.0-fac)*col2[0]);
- col[1]= (fac*col1[1] + (1.0-fac)*col2[1]);
- col[2]= (fac*col1[2] + (1.0-fac)*col2[2]);
+ col[0]= (fac*col1[0] + (1.0f-fac)*col2[0]);
+ col[1]= (fac*col1[1] + (1.0f-fac)*col2[1]);
+ col[2]= (fac*col1[2] + (1.0f-fac)*col2[2]);
glColor3fv(col);
}
@@ -165,12 +170,12 @@ void uiDrawBoxShade(int mode, float minx, float miny, float maxx, float maxy, fl
glGetFloatv(GL_CURRENT_COLOR, color);
/* 'shade' defines strength of shading */
- coltop[0]= color[0]+shadetop; if(coltop[0]>1.0) coltop[0]= 1.0;
- coltop[1]= color[1]+shadetop; if(coltop[1]>1.0) coltop[1]= 1.0;
- coltop[2]= color[2]+shadetop; if(coltop[2]>1.0) coltop[2]= 1.0;
- coldown[0]= color[0]+shadedown; if(coldown[0]<0.0) coldown[0]= 0.0;
- coldown[1]= color[1]+shadedown; if(coldown[1]<0.0) coldown[1]= 0.0;
- coldown[2]= color[2]+shadedown; if(coldown[2]<0.0) coldown[2]= 0.0;
+ coltop[0]= color[0]+shadetop; if(coltop[0]>1.0f) coltop[0]= 1.0f;
+ coltop[1]= color[1]+shadetop; if(coltop[1]>1.0f) coltop[1]= 1.0f;
+ coltop[2]= color[2]+shadetop; if(coltop[2]>1.0f) coltop[2]= 1.0f;
+ coldown[0]= color[0]+shadedown; if(coldown[0]<0.0f) coldown[0]= 0.0f;
+ coldown[1]= color[1]+shadedown; if(coldown[1]<0.0f) coldown[1]= 0.0f;
+ coldown[2]= color[2]+shadedown; if(coldown[2]<0.0f) coldown[2]= 0.0f;
glShadeModel(GL_SMOOTH);
glBegin(mode);
@@ -272,12 +277,12 @@ void uiDrawBoxVerticalShade(int mode, float minx, float miny, float maxx, float
glGetFloatv(GL_CURRENT_COLOR, color);
/* 'shade' defines strength of shading */
- colLeft[0]= color[0]+shadeLeft; if(colLeft[0]>1.0) colLeft[0]= 1.0;
- colLeft[1]= color[1]+shadeLeft; if(colLeft[1]>1.0) colLeft[1]= 1.0;
- colLeft[2]= color[2]+shadeLeft; if(colLeft[2]>1.0) colLeft[2]= 1.0;
- colRight[0]= color[0]+shadeRight; if(colRight[0]<0.0) colRight[0]= 0.0;
- colRight[1]= color[1]+shadeRight; if(colRight[1]<0.0) colRight[1]= 0.0;
- colRight[2]= color[2]+shadeRight; if(colRight[2]<0.0) colRight[2]= 0.0;
+ colLeft[0]= color[0]+shadeLeft; if(colLeft[0]>1.0f) colLeft[0]= 1.0f;
+ colLeft[1]= color[1]+shadeLeft; if(colLeft[1]>1.0f) colLeft[1]= 1.0f;
+ colLeft[2]= color[2]+shadeLeft; if(colLeft[2]>1.0f) colLeft[2]= 1.0f;
+ colRight[0]= color[0]+shadeRight; if(colRight[0]<0.0f) colRight[0]= 0.0f;
+ colRight[1]= color[1]+shadeRight; if(colRight[1]<0.0f) colRight[1]= 0.0f;
+ colRight[2]= color[2]+shadeRight; if(colRight[2]<0.0f) colRight[2]= 0.0f;
glShadeModel(GL_SMOOTH);
glBegin(mode);
@@ -946,9 +951,9 @@ void ui_draw_but_WAVEFORM(ARegion *ar, uiBut *but, uiWidgetColors *UNUSED(wcol),
/* min max */
for (c=0; c<3; c++) {
if (scopes->wavefrm_mode == SCOPES_WAVEFRM_RGB)
- glColor3f(colors[c][0]*0.75, colors[c][1]*0.75, colors[c][2]*0.75);
+ glColor3f(colors[c][0]*0.75f, colors[c][1]*0.75f, colors[c][2]*0.75f);
else
- glColor3f(colorsycc[c][0]*0.75, colorsycc[c][1]*0.75, colorsycc[c][2]*0.75);
+ glColor3f(colorsycc[c][0]*0.75f, colorsycc[c][1]*0.75f, colorsycc[c][2]*0.75f);
min= yofs+scopes->minmax[c][0]*h;
max= yofs+scopes->minmax[c][1]*h;
CLAMP(min, rect.ymin, rect.ymax);
@@ -981,15 +986,15 @@ static void vectorscope_draw_target(float centerx, float centery, float diam, fl
rgb_to_yuv(r,g,b, &y, &u, &v);
if (u>0 && v>=0) tangle=atanf(v/u);
- else if (u>0 && v<0) tangle=atanf(v/u)+2*M_PI;
- else if (u<0) tangle=atanf(v/u)+M_PI;
- else if (u==0 && v>0) tangle=M_PI/2.0f;
- else if (u==0 && v<0) tangle=-M_PI/2.0f;
+ else if (u>0 && v<0) tangle= atanf(v/u) + 2.0f * (float)M_PI;
+ else if (u<0) tangle=atanf(v/u) + (float)M_PI;
+ else if (u==0 && v > 0.0f) tangle= (float)M_PI/2.0f;
+ else if (u==0 && v < 0.0f) tangle=-(float)M_PI/2.0f;
tampli= sqrtf(u*u+v*v);
/* small target vary by 2.5 degree and 2.5 IRE unit */
glColor4f(1.0f, 1.0f, 1.0, 0.12f);
- dangle= 2.5*M_PI/180.0f;
+ dangle= 2.5f*(float)M_PI/180.0f;
dampli= 2.5f/200.0f;
glBegin(GL_LINE_STRIP);
glVertex2f(polar_to_x(centerx,diam,tampli+dampli,tangle+dangle), polar_to_y(centery,diam,tampli+dampli,tangle+dangle));
@@ -1000,9 +1005,9 @@ static void vectorscope_draw_target(float centerx, float centery, float diam, fl
glEnd();
/* big target vary by 10 degree and 20% amplitude */
glColor4f(1.0f, 1.0f, 1.0, 0.12f);
- dangle= 10*M_PI/180.0f;
- dampli= 0.2*tampli;
- dangle2= 5.0f*M_PI/180.0f;
+ dangle= 10.0f*(float)M_PI/180.0f;
+ dampli= 0.2f*tampli;
+ dangle2= 5.0f*(float)M_PI/180.0f;
dampli2= 0.5f*dampli;
glBegin(GL_LINE_STRIP);
glVertex2f(polar_to_x(centerx,diam,tampli+dampli-dampli2,tangle+dangle), polar_to_y(centery,diam,tampli+dampli-dampli2,tangle+dangle));
@@ -1126,13 +1131,13 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *rect)
sizey= rect->ymax-y1;
/* first background, to show tranparency */
- dx= sizex/12.0;
+ dx= sizex/12.0f;
v1[0]= x1;
for(a=0; a<12; a++) {
if(a & 1) glColor3f(0.3, 0.3, 0.3); else glColor3f(0.8, 0.8, 0.8);
- glRectf(v1[0], y1, v1[0]+dx, y1+0.5*sizey);
+ glRectf(v1[0], y1, v1[0]+dx, y1+0.5f*sizey);
if(a & 1) glColor3f(0.8, 0.8, 0.8); else glColor3f(0.3, 0.3, 0.3);
- glRectf(v1[0], y1+0.5*sizey, v1[0]+dx, y1+sizey);
+ glRectf(v1[0], y1+0.5f*sizey, v1[0]+dx, y1+sizey);
v1[0]+= dx;
}
@@ -1173,9 +1178,9 @@ void ui_draw_but_COLORBAND(uiBut *but, uiWidgetColors *UNUSED(wcol), rcti *rect)
/* help lines */
v1[0]= v2[0]=v3[0]= x1;
v1[1]= y1;
- v1a[1]= y1+0.25*sizey;
- v2[1]= y1+0.5*sizey;
- v2a[1]= y1+0.75*sizey;
+ v1a[1]= y1+0.25f*sizey;
+ v2[1]= y1+0.5f*sizey;
+ v2a[1]= y1+0.75f*sizey;
v3[1]= y1+sizey;
@@ -1325,7 +1330,7 @@ static void ui_draw_but_curve_grid(rcti *rect, float zoomx, float zoomy, float o
glBegin(GL_LINES);
dx= step*zoomx;
fx= rect->xmin + zoomx*(-offsx);
- if(fx > rect->xmin) fx -= dx*( floor(fx-rect->xmin));
+ if(fx > rect->xmin) fx -= dx*(floorf(fx-rect->xmin));
while(fx < rect->xmax) {
glVertex2f(fx, rect->ymin);
glVertex2f(fx, rect->ymax);
@@ -1334,7 +1339,7 @@ static void ui_draw_but_curve_grid(rcti *rect, float zoomx, float zoomy, float o
dy= step*zoomy;
fy= rect->ymin + zoomy*(-offsy);
- if(fy > rect->ymin) fy -= dy*( floor(fy-rect->ymin));
+ if(fy > rect->ymin) fy -= dy*(floorf(fy-rect->ymin));
while(fy < rect->ymax) {
glVertex2f(rect->xmin, fy);
glVertex2f(rect->xmax, fy);
@@ -1374,8 +1379,8 @@ void ui_draw_but_CURVE(ARegion *ar, uiBut *but, uiWidgetColors *wcol, rcti *rect
glScissor(scissor_new.xmin, scissor_new.ymin, scissor_new.xmax-scissor_new.xmin, scissor_new.ymax-scissor_new.ymin);
/* calculate offset and zoom */
- zoomx= (rect->xmax-rect->xmin-2.0*but->aspect)/(cumap->curr.xmax - cumap->curr.xmin);
- zoomy= (rect->ymax-rect->ymin-2.0*but->aspect)/(cumap->curr.ymax - cumap->curr.ymin);
+ zoomx= (rect->xmax-rect->xmin-2.0f*but->aspect)/(cumap->curr.xmax - cumap->curr.xmin);
+ zoomy= (rect->ymax-rect->ymin-2.0f*but->aspect)/(cumap->curr.ymax - cumap->curr.ymin);
offsx= cumap->curr.xmin-but->aspect/zoomx;
offsy= cumap->curr.ymin-but->aspect/zoomy;
@@ -1535,9 +1540,9 @@ static void ui_shadowbox(float minx, float miny, float maxx, float maxy, float s
glBegin(GL_POLYGON);
glColor4ub(0, 0, 0, alpha);
glVertex2f(maxx, miny);
- glVertex2f(maxx, maxy-0.3*shadsize);
+ glVertex2f(maxx, maxy-0.3f*shadsize);
glColor4ub(0, 0, 0, 0);
- glVertex2f(maxx+shadsize, maxy-0.75*shadsize);
+ glVertex2f(maxx+shadsize, maxy-0.75f*shadsize);
glVertex2f(maxx+shadsize, miny);
glEnd();
@@ -1547,18 +1552,18 @@ static void ui_shadowbox(float minx, float miny, float maxx, float maxy, float s
glVertex2f(maxx, miny);
glColor4ub(0, 0, 0, 0);
glVertex2f(maxx+shadsize, miny);
- glVertex2f(maxx+0.7*shadsize, miny-0.7*shadsize);
+ glVertex2f(maxx+0.7f*shadsize, miny-0.7f*shadsize);
glVertex2f(maxx, miny-shadsize);
glEnd();
/* bottom quad */
glBegin(GL_POLYGON);
glColor4ub(0, 0, 0, alpha);
- glVertex2f(minx+0.3*shadsize, miny);
+ glVertex2f(minx+0.3f*shadsize, miny);
glVertex2f(maxx, miny);
glColor4ub(0, 0, 0, 0);
glVertex2f(maxx, miny-shadsize);
- glVertex2f(minx+0.5*shadsize, miny-shadsize);
+ glVertex2f(minx+0.5f*shadsize, miny-shadsize);
glEnd();
glDisable(GL_BLEND);
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index a556d8322b2..fcf92d3bc65 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_handlers.c
+ * \ingroup edinterface
+ */
+
+
#include <float.h>
#include <limits.h>
#include <math.h>
@@ -33,6 +38,10 @@
#include "MEM_guardedalloc.h"
+#include "DNA_sensor_types.h"
+#include "DNA_controller_types.h"
+#include "DNA_actuator_types.h"
+
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -64,6 +73,10 @@
#include "WM_api.h"
#include "WM_types.h"
+/* proto */
+static void ui_add_smart_controller(bContext *C, uiBut *from, uiBut *to);
+static void ui_add_link(bContext *C, uiBut *from, uiBut *to);
+
/***************** structs and defines ****************/
#define BUTTON_TOOLTIP_DELAY 0.500
@@ -112,7 +125,6 @@ typedef struct uiHandleButtonData {
float vec[3], origvec[3];
int togdual, togonly;
ColorBand *coba;
- CurveMapping *cumap;
/* tooltip */
ARegion *tooltip;
@@ -132,11 +144,11 @@ typedef struct uiHandleButtonData {
float dragf, dragfstart;
CBData *dragcbd;
- /* menu open */
+ /* menu open (watch uiFreeActiveButtons) */
uiPopupBlockHandle *menu;
int menuretval;
- /* search box */
+ /* search box (watch uiFreeActiveButtons) */
ARegion *searchbox;
/* post activate */
@@ -744,7 +756,72 @@ static uiLinkLine *ui_is_a_link(uiBut *from, uiBut *to)
return NULL;
}
-static void ui_add_link(uiBut *from, uiBut *to)
+/* XXX BAD BAD HACK, fixme later **************** */
+/* Try to add an AND Controller between the sensor and the actuator logic bricks and to connect them all */
+static void ui_add_smart_controller(bContext *C, uiBut *from, uiBut *to)
+{
+ Object *ob= NULL;
+ bSensor *sens_iter;
+ bActuator *act_to, *act_iter;
+ bController *cont;
+ bController ***sens_from_links;
+ uiBut *tmp_but;
+
+ uiLink *link= from->link;
+
+ if(link->ppoin)
+ sens_from_links= (bController ***)(link->ppoin);
+ else return;
+
+ act_to = (bActuator *)(to->poin);
+
+ /* (1) get the object */
+ CTX_DATA_BEGIN(C, Object*, ob_iter, selected_editable_objects) {
+ for (sens_iter= ob_iter->sensors.first; sens_iter; sens_iter= sens_iter->next)
+ {
+ if (&(sens_iter->links) == sens_from_links) {
+ ob= ob_iter;
+ break;
+ }
+ }
+ if (ob) break;
+ } CTX_DATA_END;
+
+ if(!ob) return;
+
+ /* (2) check if the sensor and the actuator are from the same object */
+ for (act_iter= ob->actuators.first; act_iter; act_iter= (bActuator *)act_iter->next) {
+ if (act_iter == act_to)
+ break;
+ }
+
+ // only works if the sensor and the actuator are from the same object
+ if(!act_iter) return;
+
+ /* (3) add a new controller */
+ if (WM_operator_name_call(C, "LOGIC_OT_controller_add", WM_OP_EXEC_DEFAULT, NULL) & OPERATOR_FINISHED)
+ {
+ cont = (bController *)ob->controllers.last;
+
+ /* (4) link the sensor->controller->actuator */
+ tmp_but = MEM_callocN(sizeof(uiBut), "uiBut");
+ uiSetButLink(tmp_but, (void **)&cont, (void ***)&(cont->links), &(cont->totlinks), from->link->tocode, (int)to->hardmin);
+ tmp_but->hardmin= from->link->tocode;
+ tmp_but->poin= (char *)cont;
+
+ tmp_but->type= INLINK;
+ ui_add_link(C, from, tmp_but);
+
+ tmp_but->type= LINK;
+ ui_add_link(C, tmp_but, to);
+
+ /* (5) garbage collection */
+ MEM_freeN(tmp_but->link);
+ MEM_freeN(tmp_but);
+ }
+}
+
+static void ui_add_link(bContext *C, uiBut *from, uiBut *to)
{
/* in 'from' we have to add a link to 'to' */
uiLink *link;
@@ -763,6 +840,7 @@ static void ui_add_link(uiBut *from, uiBut *to)
}
else if (from->type==LINK && to->type==INLINK) {
if( from->link->tocode != (int)to->hardmin ) {
+ ui_add_smart_controller(C, from, to);
return;
}
}
@@ -808,8 +886,8 @@ static void ui_apply_but_LINK(bContext *C, uiBut *but, uiHandleButtonData *data)
if (!ELEM(bt->type, LINK, INLINK) || !ELEM(but->type, LINK, INLINK))
return;
- if(but->type==LINK) ui_add_link(but, bt);
- else ui_add_link(bt, but);
+ if(but->type==LINK) ui_add_link(C, but, bt);
+ else ui_add_link(C, bt, but);
ui_apply_but_func(C, but);
data->retval= but->retval;
@@ -1086,6 +1164,10 @@ static void ui_but_copy_paste(bContext *C, uiBut *but, uiHandleButtonData *data,
else {
button_activate_state(C, but, BUTTON_STATE_TEXT_EDITING);
BLI_strncpy(active_data->str, buf, active_data->maxlen);
+ if(but->type == SEARCH_MENU) {
+ /* else uiSearchboxData.active member is not updated [#26856] */
+ ui_searchbox_update(C, data->searchbox, but, 1);
+ }
button_activate_state(C, but, BUTTON_STATE_EXIT);
}
}
@@ -1176,7 +1258,7 @@ static int ui_textedit_delete_selection(uiBut *but, uiHandleButtonData *data)
int len= strlen(str);
int change= 0;
if(but->selsta != but->selend && len) {
- memmove( str+but->selsta, str+but->selend, len-but->selsta+1 );
+ memmove( str+but->selsta, str+but->selend, (len - but->selend) + 1 );
change= 1;
}
@@ -1218,19 +1300,19 @@ static void ui_textedit_set_cursor_pos(uiBut *but, uiHandleButtonData *data, sho
while (i > 0) {
i--;
- if (BLF_width(fstyle->uifont_id, origstr+i) > (startx - x)*0.25) break; // 0.25 == scale factor for less sensitivity
+ if (BLF_width(fstyle->uifont_id, origstr+i) > (startx - x)*0.25f) break; // 0.25 == scale factor for less sensitivity
}
but->ofs = i;
but->pos = but->ofs;
}
/* mouse inside the widget */
else if (x >= startx) {
- float aspect= sqrt(but->block->aspect);
+ float aspect= (but->block->aspect);
but->pos= strlen(origstr)-but->ofs;
/* XXX does not take zoom level into account */
- while (aspect*startx + aspect*BLF_width(fstyle->uifont_id, origstr+but->ofs) > x) {
+ while (startx + aspect*BLF_width(fstyle->uifont_id, origstr+but->ofs) > x) {
if (but->pos <= 0) break;
but->pos--;
origstr[but->pos+but->ofs] = 0;
@@ -1482,7 +1564,7 @@ static int ui_textedit_copypaste(uiBut *but, uiHandleButtonData *data, int paste
{
char buf[UI_MAX_DRAW_STR]={0};
char *str, *p, *pbuf;
- int len, x, y, i, changed= 0;
+ int len, x, i, changed= 0;
str= data->str;
len= strlen(str);
@@ -1493,6 +1575,7 @@ static int ui_textedit_copypaste(uiBut *but, uiHandleButtonData *data, int paste
p = pbuf= WM_clipboard_text_get(0);
if(p && p[0]) {
+ unsigned int y;
i= 0;
while (*p && *p!='\r' && *p!='\n' && i<UI_MAX_DRAW_STR-1) {
buf[i++]=*p;
@@ -1868,8 +1951,7 @@ static void ui_numedit_begin(uiBut *but, uiHandleButtonData *data)
float softrange, softmin, softmax;
if(but->type == BUT_CURVE) {
- data->cumap= (CurveMapping*)but->poin;
- but->editcumap= data->coba;
+ but->editcumap= (CurveMapping*)but->poin;
}
else if(but->type == BUT_COLORBAND) {
data->coba= (ColorBand*)but->poin;
@@ -1890,7 +1972,7 @@ static void ui_numedit_begin(uiBut *but, uiHandleButtonData *data)
softmax= but->softmax;
softrange= softmax - softmin;
- data->dragfstart= (softrange == 0.0)? 0.0: (data->value - softmin)/softrange;
+ data->dragfstart= (softrange == 0.0f)? 0.0f: ((float)data->value - softmin)/softrange;
data->dragf= data->dragfstart;
}
@@ -2240,13 +2322,13 @@ static float ui_numedit_apply_snapf(uiBut *but, float tempf, float softmin, floa
}
if(snap==1) {
- if(softrange < 2.10) tempf= 0.1*floor(10*tempf);
- else if(softrange < 21.0) tempf= floor(tempf);
- else tempf= 10.0*floor(tempf/10.0);
+ if(softrange < 2.10f) tempf= 0.1f*floorf(10.0f*tempf);
+ else if(softrange < 21.0f) tempf= floorf(tempf);
+ else tempf= 10.0f*floorf(tempf/10.0f);
}
else if(snap==2) {
- if(softrange < 2.10) tempf= 0.01*floor(100.0*tempf);
- else if(softrange < 21.0) tempf= 0.1*floor(10.0*tempf);
+ if(softrange < 2.10f) tempf= 0.01f*floorf(100.0f*tempf);
+ else if(softrange < 21.0f) tempf= 0.1f*floorf(10.0f*tempf);
else tempf= floor(tempf);
}
@@ -2302,8 +2384,8 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i
/* Mouse location isn't screen clamped to the screen so use a linear mapping
* 2px == 1-int, or 1px == 1-ClickStep */
if(ui_is_but_float(but)) {
- fac *= 0.01*but->a1;
- tempf = data->startvalue + ((mx - data->dragstartx) * fac);
+ fac *= 0.01f*but->a1;
+ tempf = (float)data->startvalue + ((float)(mx - data->dragstartx) * fac);
tempf= ui_numedit_apply_snapf(but, tempf, softmin, softmax, softrange, snap);
#if 1 /* fake moving the click start, nicer for dragging back after passing the limit */
@@ -2318,7 +2400,7 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i
CLAMP(tempf, softmin, softmax);
#endif
- if(tempf != data->value) {
+ if(tempf != (float)data->value) {
data->dragchange= 1;
data->value= tempf;
changed= 1;
@@ -2329,7 +2411,7 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i
else if(softrange > 32) fac= 1.0/2.0; /* 2px == 1 */
else fac= 1.0/16.0; /* 16px == 1? */
- temp= data->startvalue + ((mx - data->dragstartx) * fac);
+ temp= data->startvalue + (((double)mx - data->dragstartx) * (double)fac);
temp= ui_numedit_apply_snap(temp, softmin, softmax, snap);
#if 1 /* fake moving the click start, nicer for dragging back after passing the limit */
@@ -2367,22 +2449,22 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i
if(softrange > 11) {
/* non linear change in mouse input- good for high precicsion */
- data->dragf+= (((float)(mx-data->draglastx))/deler) * (fabs(data->dragstartx-mx)*0.002);
+ data->dragf+= (((float)(mx-data->draglastx))/deler) * (fabsf(data->dragstartx-mx)*0.002f);
} else if (softrange > 129) { /* only scale large int buttons */
/* non linear change in mouse input- good for high precicsionm ints need less fine tuning */
- data->dragf+= (((float)(mx-data->draglastx))/deler) * (fabs(data->dragstartx-mx)*0.004);
+ data->dragf+= (((float)(mx-data->draglastx))/deler) * (fabsf(data->dragstartx-mx)*0.004f);
} else {
/*no scaling */
data->dragf+= ((float)(mx-data->draglastx))/deler ;
}
- CLAMP(data->dragf, 0.0, 1.0);
+ CLAMP(data->dragf, 0.0f, 1.0f);
data->draglastx= mx;
tempf= (softmin + data->dragf*softrange);
if(!ui_is_but_float(but)) {
- temp= floor(tempf+.5);
+ temp= floorf(tempf + 0.5f);
temp= ui_numedit_apply_snap(temp, softmin, softmax, snap);
@@ -2401,7 +2483,7 @@ static int ui_numedit_but_NUM(uiBut *but, uiHandleButtonData *data, float fac, i
CLAMP(tempf, softmin, softmax);
- if(tempf != data->value) {
+ if(tempf != (float)data->value) {
data->dragchange= 1;
data->value= tempf;
changed= 1;
@@ -2531,7 +2613,7 @@ static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButton
if(mx < (but->x1 + (but->x2 - but->x1)/3 - 3)) {
button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
- tempf= data->value - 0.01*but->a1;
+ tempf= (float)data->value - 0.01f * but->a1;
if (tempf < softmin) tempf = softmin;
data->value= tempf;
@@ -2540,7 +2622,7 @@ static int ui_do_but_NUM(bContext *C, uiBlock *block, uiBut *but, uiHandleButton
else if(mx > but->x1 + (2*((but->x2 - but->x1)/3) + 3)) {
button_activate_state(C, but, BUTTON_STATE_NUM_EDITING);
- tempf= data->value + 0.01*but->a1;
+ tempf= (float)data->value + 0.01f * but->a1;
if (tempf > softmax) tempf = softmax;
data->value= tempf;
@@ -2565,23 +2647,23 @@ static int ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, int shift, i
softmax= but->softmax;
softrange= softmax - softmin;
- if(but->type==NUMSLI) deler= ((but->x2-but->x1) - 5.0*but->aspect);
- else if(but->type==HSVSLI) deler= ((but->x2-but->x1)/2 - 5.0*but->aspect);
+ if(but->type==NUMSLI) deler= ((but->x2-but->x1) - 5.0f*but->aspect);
+ else if(but->type==HSVSLI) deler= ((but->x2-but->x1)/2.0f - 5.0f*but->aspect);
else if(but->type==SCROLL) {
int horizontal= (but->x2 - but->x1 > but->y2 - but->y1);
float size= (horizontal)? (but->x2-but->x1): -(but->y2-but->y1);
deler= size*(but->softmax - but->softmin)/(but->softmax - but->softmin + but->a1);
}
- else deler= (but->x2-but->x1- 5.0*but->aspect);
+ else deler= (but->x2-but->x1- 5.0f*but->aspect);
f= (float)(mx-data->dragstartx)/deler + data->dragfstart;
if(shift)
- f= (f-data->dragfstart)/10.0 + data->dragfstart;
+ f= (f-data->dragfstart)/10.0f + data->dragfstart;
- CLAMP(f, 0.0, 1.0);
+ CLAMP(f, 0.0f, 1.0f);
tempf= softmin + f*softrange;
- temp= floor(tempf+.5);
+ temp= floorf(tempf+0.5f);
if(ctrl) {
if(tempf==softmin || tempf==softmax);
@@ -2589,14 +2671,14 @@ static int ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, int shift, i
if(shift) {
if(tempf==softmin || tempf==softmax);
- else if(softmax-softmin < 2.10) tempf= 0.01*floor(100.0*tempf);
- else if(softmax-softmin < 21.0) tempf= 0.1*floor(10.0*tempf);
- else tempf= floor(tempf);
+ else if(softmax-softmin < 2.10f) tempf= 0.01f * floorf(100.0f*tempf);
+ else if(softmax-softmin < 21.0f) tempf= 0.1f * floorf(10.0f*tempf);
+ else tempf= floorf(tempf);
}
else {
- if(softmax-softmin < 2.10) tempf= 0.1*floor(10*tempf);
- else if(softmax-softmin < 21.0) tempf= floor(tempf);
- else tempf= 10.0*floor(tempf/10.0);
+ if(softmax-softmin < 2.10f) tempf= 0.1f * floorf(10.0f*tempf);
+ else if(softmax-softmin < 21.0f) tempf= floorf(tempf);
+ else tempf= 10.0f*floorf(tempf/10.0f);
}
}
else {
@@ -2619,7 +2701,7 @@ static int ui_numedit_but_SLI(uiBut *but, uiHandleButtonData *data, int shift, i
else {
CLAMP(tempf, softmin, softmax);
- if(tempf != data->value) {
+ if(tempf != (float)data->value) {
data->value= tempf;
data->dragchange= 1;
changed= 1;
@@ -2736,8 +2818,8 @@ static int ui_do_but_SLI(bContext *C, uiBlock *block, uiBut *but, uiHandleButton
data->cancel= 1;
}
else {
- if(f<tempf) tempf-=.01;
- else tempf+=.01;
+ if(f<tempf) tempf -= 0.01f;
+ else tempf += 0.01f;
if(tempf>=softmin && tempf<=softmax)
data->value= tempf;
@@ -2905,7 +2987,7 @@ static int ui_numedit_but_NORMAL(uiBut *but, uiHandleButtonData *data, int mx, i
mdy= (rad*fp[1]);
}
else if(fp[2]> -1.0f) {
- mrad= rad/sqrt(fp[0]*fp[0] + fp[1]*fp[1]);
+ mrad= rad/sqrtf(fp[0]*fp[0] + fp[1]*fp[1]);
mdx= 2.0f*mrad*fp[0] - (rad*fp[0]);
mdy= 2.0f*mrad*fp[1] - (rad*fp[1]);
@@ -2924,7 +3006,7 @@ static int ui_numedit_but_NORMAL(uiBut *but, uiHandleButtonData *data, int mx, i
}
else { /* outer circle */
- mrad= rad/sqrt(mrad); // veclen
+ mrad= rad/sqrtf(mrad); // veclen
dx*= (2.0f*mrad - 1.0f);
dy*= (2.0f*mrad - 1.0f);
@@ -3003,8 +3085,8 @@ static int ui_numedit_but_HSVCUBE(uiBut *but, uiHandleButtonData *data, int mx,
/* relative position within box */
x= ((float)mx-but->x1)/(but->x2-but->x1);
y= ((float)my-but->y1)/(but->y2-but->y1);
- CLAMP(x, 0.0, 1.0);
- CLAMP(y, 0.0, 1.0);
+ CLAMP(x, 0.0f, 1.0f);
+ CLAMP(y, 0.0f, 1.0f);
switch((int)but->a1) {
case UI_GRAD_SV:
@@ -3148,7 +3230,7 @@ static int ui_numedit_but_HSVCIRCLE(uiBut *but, uiHandleButtonData *data, int mx
}
if(U.uiflag & USER_CONTINUOUS_MOUSE) {
- float fac= shift ? 0.05 : 1.0f;
+ float fac= shift ? 0.05f : 1.0f;
/* slow down the mouse, this is fairly picky */
mx = (data->dragstartx*(1.0f-fac) + mx*fac);
my = (data->dragstarty*(1.0f-fac) + my*fac);
@@ -3296,7 +3378,7 @@ static int ui_numedit_but_COLORBAND(uiBut *but, uiHandleButtonData *data, int mx
dx= ((float)(mx - data->draglastx))/(but->x2-but->x1);
data->dragcbd->pos += dx;
- CLAMP(data->dragcbd->pos, 0.0, 1.0);
+ CLAMP(data->dragcbd->pos, 0.0f, 1.0f);
ui_colorband_update(data->coba);
data->dragcbd= data->coba->data + data->coba->cur; /* because qsort */
@@ -3369,7 +3451,7 @@ static int ui_do_but_COLORBAND(bContext *C, uiBlock *block, uiBut *but, uiHandle
static int ui_numedit_but_CURVE(uiBut *but, uiHandleButtonData *data, int snap, int mx, int my)
{
- CurveMapping *cumap= data->cumap;
+ CurveMapping *cumap= (CurveMapping*)but->poin;
CurveMap *cuma= cumap->cm+cumap->cur;
CurveMapPoint *cmp= cuma->curve;
float fx, fy, zoomx, zoomy, offsx, offsy;
@@ -3401,8 +3483,8 @@ static int ui_numedit_but_CURVE(uiBut *but, uiHandleButtonData *data, int snap,
cmp[a].x+= fx;
cmp[a].y+= fy;
if(snap) {
- cmp[a].x= 0.125f*floor(0.5f + 8.0f*cmp[a].x);
- cmp[a].y= 0.125f*floor(0.5f + 8.0f*cmp[a].y);
+ cmp[a].x= 0.125f*floorf(0.5f + 8.0f*cmp[a].x);
+ cmp[a].y= 0.125f*floorf(0.5f + 8.0f*cmp[a].y);
}
if(cmp[a].x!=origx || cmp[a].y!=origy)
moved_point= 1;
@@ -3559,7 +3641,7 @@ static int ui_do_but_CURVE(bContext *C, uiBlock *block, uiBut *but, uiHandleButt
}
else if(event->type==LEFTMOUSE && event->val!=KM_PRESS) {
if(data->dragsel != -1) {
- CurveMapping *cumap= data->cumap;
+ CurveMapping *cumap= (CurveMapping*)but->poin;
CurveMap *cuma= cumap->cm+cumap->cur;
CurveMapPoint *cmp= cuma->curve;
@@ -3593,12 +3675,12 @@ static int in_scope_resize_zone(uiBut *but, int UNUSED(x), int y)
static int ui_numedit_but_HISTOGRAM(uiBut *but, uiHandleButtonData *data, int mx, int my)
{
Histogram *hist = (Histogram *)but->poin;
- rcti rect;
+ /* rcti rect; */
int changed= 1;
float dx, dy, yfac=1.f;
- rect.xmin= but->x1; rect.xmax= but->x2;
- rect.ymin= but->y1; rect.ymax= but->y2;
+ /* rect.xmin= but->x1; rect.xmax= but->x2; */
+ /* rect.ymin= but->y1; rect.ymax= but->y2; */
dx = mx - data->draglastx;
dy = my - data->draglasty;
@@ -3609,7 +3691,7 @@ static int ui_numedit_but_HISTOGRAM(uiBut *but, uiHandleButtonData *data, int mx
hist->height = (but->y2 - but->y1) + (data->dragstarty - my);
} else {
/* scale histogram values */
- yfac = MIN2(powf(hist->ymax, 2.f), 1.f) * 0.5;
+ yfac = MIN2(powf(hist->ymax, 2.f), 1.f) * 0.5f;
hist->ymax += dy * yfac;
CLAMP(hist->ymax, 1.f, 100.f);
@@ -3676,12 +3758,12 @@ static int ui_do_but_HISTOGRAM(bContext *C, uiBlock *block, uiBut *but, uiHandle
static int ui_numedit_but_WAVEFORM(uiBut *but, uiHandleButtonData *data, int mx, int my)
{
Scopes *scopes = (Scopes *)but->poin;
- rcti rect;
+ /* rcti rect; */
int changed= 1;
float dx, dy, yfac=1.f;
- rect.xmin= but->x1; rect.xmax= but->x2;
- rect.ymin= but->y1; rect.ymax= but->y2;
+ /* rect.xmin= but->x1; rect.xmax= but->x2; */
+ /* rect.ymin= but->y1; rect.ymax= but->y2; */
dx = mx - data->draglastx;
dy = my - data->draglasty;
@@ -3759,12 +3841,12 @@ static int ui_do_but_WAVEFORM(bContext *C, uiBlock *block, uiBut *but, uiHandleB
static int ui_numedit_but_VECTORSCOPE(uiBut *but, uiHandleButtonData *data, int mx, int my)
{
Scopes *scopes = (Scopes *)but->poin;
- rcti rect;
+ /* rcti rect; */
int changed= 1;
/* float dx, dy; */
- rect.xmin= but->x1; rect.xmax= but->x2;
- rect.ymin= but->y1; rect.ymax= but->y2;
+ /* rect.xmin= but->x1; rect.xmax= but->x2; */
+ /* rect.ymin= but->y1; rect.ymax= but->y2; */
/* dx = mx - data->draglastx; */
/* dy = my - data->draglasty; */
@@ -4023,7 +4105,7 @@ static uiBlock *menu_change_shortcut(bContext *C, ARegion *ar, void *arg)
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 200, 20, style);
- uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", ICON_NULL);
+ uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", ICON_NONE);
uiPopupBoundsBlock(block, 6, -50, 26);
uiEndBlock(C, block);
@@ -4042,6 +4124,7 @@ static uiBlock *menu_add_shortcut(bContext *C, ARegion *ar, void *arg)
uiStyle *style= U.uistyles.first;
IDProperty *prop= (but->opptr)? but->opptr->data: NULL;
+ /* XXX this guess_opname can potentially return a different keymap than being found on adding later... */
km = WM_keymap_guess_opname(C, but->optype->idname);
kmi = WM_keymap_add_item(km, but->optype->idname, AKEY, KM_PRESS, 0, 0);
@@ -4061,7 +4144,7 @@ static uiBlock *menu_add_shortcut(bContext *C, ARegion *ar, void *arg)
layout= uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, 0, 0, 200, 20, style);
- uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", ICON_NULL);
+ uiItemR(layout, &ptr, "type", UI_ITEM_R_FULL_EVENT|UI_ITEM_R_IMMEDIATE, "", ICON_NONE);
uiPopupBoundsBlock(block, 6, -50, 26);
uiEndBlock(C, block);
@@ -4117,7 +4200,7 @@ static int ui_but_menu(bContext *C, uiBut *but)
else
name= "<needs_name>"; // XXX - should never happen.
- pup= uiPupMenuBegin(C, name, ICON_NULL);
+ pup= uiPupMenuBegin(C, name, ICON_NONE);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_INVOKE_DEFAULT);
@@ -4134,24 +4217,24 @@ static int ui_but_menu(bContext *C, uiBut *but)
/* Keyframes */
if(but->flag & UI_BUT_ANIMATED_KEY) {
if(length) {
- uiItemBooleanO(layout, "Replace Keyframes", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 1);
- uiItemBooleanO(layout, "Replace Single Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
- uiItemBooleanO(layout, "Delete Keyframes", ICON_NULL, "ANIM_OT_keyframe_delete_button", "all", 1);
- uiItemBooleanO(layout, "Delete Single Keyframe", ICON_NULL, "ANIM_OT_keyframe_delete_button", "all", 0);
+ uiItemBooleanO(layout, "Replace Keyframes", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 1);
+ uiItemBooleanO(layout, "Replace Single Keyframe", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Delete Keyframes", ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 1);
+ uiItemBooleanO(layout, "Delete Single Keyframe", ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 0);
}
else {
- uiItemBooleanO(layout, "Replace Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
- uiItemBooleanO(layout, "Delete Keyframe", ICON_NULL, "ANIM_OT_keyframe_delete_button", "all", 0);
+ uiItemBooleanO(layout, "Replace Keyframe", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Delete Keyframe", ICON_NONE, "ANIM_OT_keyframe_delete_button", "all", 0);
}
}
else if(but->flag & UI_BUT_DRIVEN);
else if(is_anim) {
if(length) {
- uiItemBooleanO(layout, "Insert Keyframes", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 1);
- uiItemBooleanO(layout, "Insert Single Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Insert Keyframes", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 1);
+ uiItemBooleanO(layout, "Insert Single Keyframe", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0);
}
else
- uiItemBooleanO(layout, "Insert Keyframe", ICON_NULL, "ANIM_OT_keyframe_insert_button", "all", 0);
+ uiItemBooleanO(layout, "Insert Keyframe", ICON_NONE, "ANIM_OT_keyframe_insert_button", "all", 0);
}
/* Drivers */
@@ -4159,29 +4242,29 @@ static int ui_but_menu(bContext *C, uiBut *but)
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Delete Drivers", ICON_NULL, "ANIM_OT_driver_button_remove", "all", 1);
- uiItemBooleanO(layout, "Delete Single Driver", ICON_NULL, "ANIM_OT_driver_button_remove", "all", 0);
+ uiItemBooleanO(layout, "Delete Drivers", ICON_NONE, "ANIM_OT_driver_button_remove", "all", 1);
+ uiItemBooleanO(layout, "Delete Single Driver", ICON_NONE, "ANIM_OT_driver_button_remove", "all", 0);
}
else
- uiItemBooleanO(layout, "Delete Driver", ICON_NULL, "ANIM_OT_driver_button_remove", "all", 0);
+ uiItemBooleanO(layout, "Delete Driver", ICON_NONE, "ANIM_OT_driver_button_remove", "all", 0);
- uiItemO(layout, "Copy Driver", ICON_NULL, "ANIM_OT_copy_driver_button");
+ uiItemO(layout, "Copy Driver", ICON_NONE, "ANIM_OT_copy_driver_button");
if (ANIM_driver_can_paste())
- uiItemO(layout, "Paste Driver", ICON_NULL, "ANIM_OT_paste_driver_button");
+ uiItemO(layout, "Paste Driver", ICON_NONE, "ANIM_OT_paste_driver_button");
}
else if(but->flag & (UI_BUT_ANIMATED_KEY|UI_BUT_ANIMATED));
else if(is_anim) {
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Add Drivers", ICON_NULL, "ANIM_OT_driver_button_add", "all", 1);
- uiItemBooleanO(layout, "Add Single Driver", ICON_NULL, "ANIM_OT_driver_button_add", "all", 0);
+ uiItemBooleanO(layout, "Add Drivers", ICON_NONE, "ANIM_OT_driver_button_add", "all", 1);
+ uiItemBooleanO(layout, "Add Single Driver", ICON_NONE, "ANIM_OT_driver_button_add", "all", 0);
}
else
- uiItemBooleanO(layout, "Add Driver", ICON_NULL, "ANIM_OT_driver_button_add", "all", 0);
+ uiItemBooleanO(layout, "Add Driver", ICON_NONE, "ANIM_OT_driver_button_add", "all", 0);
if (ANIM_driver_can_paste())
- uiItemO(layout, "Paste Driver", ICON_NULL, "ANIM_OT_paste_driver_button");
+ uiItemO(layout, "Paste Driver", ICON_NONE, "ANIM_OT_paste_driver_button");
}
/* Keying Sets */
@@ -4189,13 +4272,13 @@ static int ui_but_menu(bContext *C, uiBut *but)
uiItemS(layout);
if(length) {
- uiItemBooleanO(layout, "Add All to Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_add", "all", 1);
- uiItemBooleanO(layout, "Add Single to Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_add", "all", 0);
- uiItemO(layout, "Remove from Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_remove");
+ uiItemBooleanO(layout, "Add All to Keying Set", ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 1);
+ uiItemBooleanO(layout, "Add Single to Keying Set", ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 0);
+ uiItemO(layout, "Remove from Keying Set", ICON_NONE, "ANIM_OT_keyingset_button_remove");
}
else {
- uiItemBooleanO(layout, "Add to Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_add", "all", 0);
- uiItemO(layout, "Remove from Keying Set", ICON_NULL, "ANIM_OT_keyingset_button_remove");
+ uiItemBooleanO(layout, "Add to Keying Set", ICON_NONE, "ANIM_OT_keyingset_button_add", "all", 0);
+ uiItemO(layout, "Remove from Keying Set", ICON_NONE, "ANIM_OT_keyingset_button_remove");
}
}
@@ -4207,14 +4290,14 @@ static int ui_but_menu(bContext *C, uiBut *but)
//Paste Property Value
if(length) {
- uiItemBooleanO(layout, "Reset All to Default Values", ICON_NULL, "UI_OT_reset_default_button", "all", 1);
- uiItemBooleanO(layout, "Reset Single to Default Value", ICON_NULL, "UI_OT_reset_default_button", "all", 0);
+ uiItemBooleanO(layout, "Reset All to Default Values", ICON_NONE, "UI_OT_reset_default_button", "all", 1);
+ uiItemBooleanO(layout, "Reset Single to Default Value", ICON_NONE, "UI_OT_reset_default_button", "all", 0);
}
else
- uiItemO(layout, "Reset to Default Value", ICON_NULL, "UI_OT_reset_default_button");
+ uiItemO(layout, "Reset to Default Value", ICON_NONE, "UI_OT_reset_default_button");
- uiItemO(layout, "Copy Data Path", ICON_NULL, "UI_OT_copy_data_path_button");
- uiItemO(layout, "Copy To Selected", ICON_NULL, "UI_OT_copy_to_selected_button");
+ uiItemO(layout, "Copy Data Path", ICON_NONE, "UI_OT_copy_data_path_button");
+ uiItemO(layout, "Copy To Selected", ICON_NONE, "UI_OT_copy_to_selected_button");
uiItemS(layout);
}
@@ -4263,14 +4346,14 @@ static int ui_but_menu(bContext *C, uiBut *but)
WM_operator_properties_create(&ptr_props, "WM_OT_doc_view");
RNA_string_set(&ptr_props, "doc_id", buf);
- uiItemFullO(layout, "WM_OT_doc_view", "View Docs", ICON_NULL, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "WM_OT_doc_view", "View Docs", ICON_NONE, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
/* XXX inactive option, not for public! */
/* WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit");
RNA_string_set(&ptr_props, "doc_id", buf);
RNA_string_set(&ptr_props, "doc_new", RNA_property_description(but->rnaprop));
- uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", ICON_NULL, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
+ uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", ICON_NONE, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
*/
}
else if (but->optype) {
@@ -4278,14 +4361,14 @@ static int ui_but_menu(bContext *C, uiBut *but)
WM_operator_properties_create(&ptr_props, "WM_OT_doc_view");
RNA_string_set(&ptr_props, "doc_id", buf);
- uiItemFullO(layout, "WM_OT_doc_view", "View Docs", ICON_NULL, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "WM_OT_doc_view", "View Docs", ICON_NONE, ptr_props.data, WM_OP_EXEC_DEFAULT, 0);
WM_operator_properties_create(&ptr_props, "WM_OT_doc_edit");
RNA_string_set(&ptr_props, "doc_id", buf);
RNA_string_set(&ptr_props, "doc_new", but->optype->description);
- uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", ICON_NULL, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
+ uiItemFullO(layout, "WM_OT_doc_edit", "Submit Description", ICON_NONE, ptr_props.data, WM_OP_INVOKE_DEFAULT, 0);
}
}
@@ -4380,7 +4463,7 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
return WM_UI_HANDLER_BREAK;
}
}
- else if(but->pointype && but->poin==0) {
+ else if(but->pointype && but->poin==NULL) {
/* there's a pointer needed */
BKE_reportf(NULL, RPT_WARNING, "DoButton pointer error: %s", but->str);
button_activate_state(C, but, BUTTON_STATE_EXIT);
@@ -4516,6 +4599,28 @@ int ui_button_is_active(ARegion *ar)
return (ui_but_find_activated(ar) != NULL);
}
+/* is called by notifier */
+void uiFreeActiveButtons(const bContext *C, bScreen *screen)
+{
+ ScrArea *sa= screen->areabase.first;
+
+ for(;sa; sa= sa->next) {
+ ARegion *ar= sa->regionbase.first;
+ for(;ar; ar= ar->next) {
+ uiBut *but= ui_but_find_activated(ar);
+ if(but) {
+ uiHandleButtonData *data= but->active;
+
+ if(data->menu==NULL && data->searchbox==NULL)
+ if(data->state == BUTTON_STATE_HIGHLIGHT)
+ ui_button_active_free(C, but);
+ }
+ }
+ }
+}
+
+
+
/* returns TRUE if highlighted button allows drop of names */
/* called in region context */
int UI_but_active_drop_name(bContext *C)
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index 6efed8c8e22..9507a1a07f4 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_icons.c
+ * \ingroup edinterface
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
@@ -124,7 +129,7 @@ typedef struct IconTexture {
/* ******************* STATIC LOCAL VARS ******************* */
/* static here to cache results of icon directory scan, so it's not
* scanning the filesystem each time the menu is drawn */
-static struct ListBase iconfilelist = {0, 0};
+static struct ListBase iconfilelist = {NULL, NULL};
static IconTexture icongltex = {0, 0, 0, 0.0f, 0.0f};
/* **************************************************** */
@@ -139,7 +144,7 @@ static void def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs, int
new_icon = MEM_callocN(sizeof(Icon), "texicon");
- new_icon->obj = 0; /* icon is not for library object */
+ new_icon->obj = NULL; /* icon is not for library object */
new_icon->type = 0;
di = MEM_callocN(sizeof(DrawInfo), "drawinfo");
@@ -179,14 +184,14 @@ static void def_internal_vicon( int icon_id, VectorDrawFunc drawFunc)
new_icon = MEM_callocN(sizeof(Icon), "texicon");
- new_icon->obj = 0; /* icon is not for library object */
+ new_icon->obj = NULL; /* icon is not for library object */
new_icon->type = 0;
di = MEM_callocN(sizeof(DrawInfo), "drawinfo");
di->type= ICON_TYPE_VECTOR;
di->data.vector.func =drawFunc;
- new_icon->drawinfo_free = 0;
+ new_icon->drawinfo_free = NULL;
new_icon->drawinfo = di;
BKE_icon_set(icon_id, new_icon);
@@ -509,18 +514,14 @@ static void init_internal_icons(void)
char iconfilestr[FILE_MAXDIR+FILE_MAXFILE];
if ((btheme!=NULL) && btheme->tui.iconfile[0]) {
- char *datadir= BLI_get_folder(BLENDER_DATAFILES, NULL);
- if (datadir) {
- BLI_make_file_string("/", iconfilestr, datadir, btheme->tui.iconfile);
-
- if (BLI_exists(iconfilestr)) {
- bbuf = IMB_loadiffname(iconfilestr, IB_rect);
- if(bbuf->x < ICON_IMAGE_W || bbuf->y < ICON_IMAGE_H) {
- if (G.f & G_DEBUG)
- printf("\n***WARNING***\nIcons file %s too small.\nUsing built-in Icons instead\n", iconfilestr);
- IMB_freeImBuf(bbuf);
- bbuf= NULL;
- }
+ char *icondir= BLI_get_folder(BLENDER_DATAFILES, "icons");
+ if (icondir) {
+ BLI_join_dirfile(iconfilestr, sizeof(iconfilestr), icondir, btheme->tui.iconfile);
+ bbuf = IMB_loadiffname(iconfilestr, IB_rect); /* if the image is missing bbuf will just be NULL */
+ if(bbuf && (bbuf->x < ICON_IMAGE_W || bbuf->y < ICON_IMAGE_H)) {
+ printf("\n***WARNING***\nIcons file %s too small.\nUsing built-in Icons instead\n", iconfilestr);
+ IMB_freeImBuf(bbuf);
+ bbuf= NULL;
}
}
}
@@ -592,31 +593,23 @@ static void init_internal_icons(void)
static void init_iconfile_list(struct ListBase *list)
{
IconFile *ifile;
- ImBuf *bbuf= NULL;
struct direntry *dir;
int restoredir = 1; /* restore to current directory */
int totfile, i, index=1;
- int ifilex, ifiley;
- char icondirstr[FILE_MAX];
- char iconfilestr[FILE_MAX+16]; /* allow 256 chars for file+dir */
+ const char *icondir;
char olddir[FILE_MAX];
- char *datadir= NULL;
list->first = list->last = NULL;
- datadir = BLI_get_folder(BLENDER_DATAFILES, NULL);
-
- if (!datadir) return;
+ icondir = BLI_get_folder(BLENDER_DATAFILES, "icons");
- BLI_make_file_string("/", icondirstr, datadir, "");
-
- if(BLI_exists(icondirstr)==0)
+ if(icondir==NULL)
return;
/* since BLI_getdir changes the current working directory, restore it
back to old value afterwards */
if(!BLI_getwdN(olddir, sizeof(olddir)))
restoredir = 0;
- totfile = BLI_getdir(icondirstr, &dir);
+ totfile = BLI_getdir(icondir, &dir);
if (restoredir && !chdir(olddir)) {} /* fix warning about checking return value */
for(i=0; i<totfile; i++) {
@@ -624,16 +617,17 @@ static void init_iconfile_list(struct ListBase *list)
char *filename = dir[i].relname;
if(BLI_testextensie(filename, ".png")) {
-
+ /* loading all icons on file start is overkill & slows startup
+ * its possible they change size after blender load anyway. */
+#if 0
+ int ifilex, ifiley;
+ char iconfilestr[FILE_MAX+16]; /* allow 256 chars for file+dir */
+ ImBuf *bbuf= NULL;
/* check to see if the image is the right size, continue if not */
/* copying strings here should go ok, assuming that we never get back
a complete path to file longer than 256 chars */
- sprintf(iconfilestr, "%s/%s", icondirstr, filename);
- if(BLI_exists(iconfilestr))
- bbuf= IMB_loadiffname(iconfilestr, IB_rect);
- else
- bbuf= NULL;
-
+ BLI_join_dirfile(iconfilestr, sizeof(iconfilestr), icondir, filename);
+ bbuf= IMB_loadiffname(iconfilestr, IB_rect);
if(bbuf) {
ifilex = bbuf->x;
@@ -645,8 +639,11 @@ static void init_iconfile_list(struct ListBase *list)
}
/* bad size or failed to load */
- if ((ifilex != ICON_IMAGE_W) || (ifiley != ICON_IMAGE_H))
+ if ((ifilex != ICON_IMAGE_W) || (ifiley != ICON_IMAGE_H)) {
+ printf("icon '%s' is wrong size %dx%d\n", iconfilestr, ifilex, ifiley);
continue;
+ }
+#endif /* removed */
/* found a potential icon file, so make an entry for it in the cache list */
ifile = MEM_callocN(sizeof(IconFile), "IconFile");
@@ -670,7 +667,7 @@ static void init_iconfile_list(struct ListBase *list)
if (dir[i].string) MEM_freeN(dir[i].string);
}
free(dir);
- dir= 0;
+ dir= NULL;
}
static void free_iconfile_list(struct ListBase *list)
@@ -689,7 +686,7 @@ int UI_iconfile_get_index(const char *filename)
ListBase *list=&(iconfilelist);
for(ifile=list->first; ifile; ifile=ifile->next) {
- if ( BLI_streq(filename, ifile->filename)) {
+ if (BLI_path_cmp(filename, ifile->filename) == 0) {
return ifile->index;
}
}
@@ -749,7 +746,7 @@ int UI_icon_get_width(int icon_id)
icon = BKE_icon_get(icon_id);
- if (icon==ICON_NULL) {
+ if (icon==NULL) {
if (G.f & G_DEBUG)
printf("UI_icon_get_width: Internal error, no icon for icon ID: %d\n", icon_id);
return 0;
@@ -774,7 +771,7 @@ int UI_icon_get_height(int icon_id)
icon = BKE_icon_get(icon_id);
- if (icon==ICON_NULL) {
+ if (icon==NULL) {
if (G.f & G_DEBUG)
printf("UI_icon_get_height: Internal error, no icon for icon ID: %d\n", icon_id);
return 0;
@@ -950,7 +947,7 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al
icon = BKE_icon_get(icon_id);
- if (icon==ICON_NULL) {
+ if (icon==NULL) {
if (G.f & G_DEBUG)
printf("icon_draw_mipmap: Internal error, no icon for icon ID: %d\n", icon_id);
return;
@@ -975,7 +972,7 @@ static void icon_draw_size(float x, float y, int icon_id, float aspect, float al
di->data.vector.func((int)x, (int)y, ICON_DEFAULT_HEIGHT, ICON_DEFAULT_HEIGHT, 1.0f);
}
else if(di->type == ICON_TYPE_TEXTURE) {
- icon_draw_texture(x, y, w, h, di->data.texture.x, di->data.texture.y,
+ icon_draw_texture(x, y, (float)w, (float)h, di->data.texture.x, di->data.texture.y,
di->data.texture.w, di->data.texture.h, alpha, rgb);
}
else if(di->type == ICON_TYPE_BUFFER) {
@@ -1075,11 +1072,11 @@ static int ui_id_brush_get_icon(bContext *C, ID *id)
tool = br->sculpt_tool;
}
else if(mode == OB_MODE_VERTEX_PAINT) {
- items = brush_vertexpaint_tool_items;
+ items = brush_vertex_tool_items;
tool = br->vertexpaint_tool;
}
else if(mode == OB_MODE_TEXTURE_PAINT) {
- items = brush_imagepaint_tool_items;
+ items = brush_image_tool_items;
tool = br->imagepaint_tool;
}
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index b5f8897d32c..6cca689d115 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_intern.h
+ * \ingroup edinterface
+ */
+
+
#ifndef INTERFACE_H
#define INTERFACE_H
@@ -371,6 +376,7 @@ extern void ui_set_but_soft_range(uiBut *but, double value);
extern void ui_check_but(uiBut *but);
extern int ui_is_but_float(uiBut *but);
extern int ui_is_but_unit(uiBut *but);
+extern int ui_is_but_rna_valid(uiBut *but);
extern void ui_bounds_block(uiBlock *block);
extern void ui_block_translate(uiBlock *block, int x, int y);
diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c
index 432904fd243..a208eee1649 100644
--- a/source/blender/editors/interface/interface_layout.c
+++ b/source/blender/editors/interface/interface_layout.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_layout.c
+ * \ingroup edinterface
+ */
+
+
#include <limits.h>
#include <math.h>
#include <stdlib.h>
@@ -408,14 +413,14 @@ static void ui_item_array(uiLayout *layout, uiBlock *block, const char *name, in
col= a % dim_size[0];
row= a / dim_size[0];
- but= uiDefAutoButR(block, ptr, prop, a, "", ICON_NULL, x + w*col, y+(dim_size[1]*UI_UNIT_Y)-(row*UI_UNIT_Y), w, UI_UNIT_Y);
+ but= uiDefAutoButR(block, ptr, prop, a, "", ICON_NONE, x + w*col, y+(dim_size[1]*UI_UNIT_Y)-(row*UI_UNIT_Y), w, UI_UNIT_Y);
if(slider && but->type==NUM)
but->type= NUMSLI;
}
}
else {
if(ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) && !expand)
- uiDefAutoButR(block, ptr, prop, -1, "", ICON_NULL, 0, 0, w, UI_UNIT_Y);
+ uiDefAutoButR(block, ptr, prop, -1, "", ICON_NONE, 0, 0, w, UI_UNIT_Y);
if(!ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA) || expand) {
/* layout for known array subtypes */
@@ -604,15 +609,16 @@ static void ui_item_disabled(uiLayout *layout, const char *name)
}
/* operator items */
-PointerRNA uiItemFullO(uiLayout *layout, const char *idname, const char *name, int icon, IDProperty *properties, int context, int flag)
+PointerRNA uiItemFullO(uiLayout *layout, const char *opname, const char *name, int icon, IDProperty *properties, int context, int flag)
{
uiBlock *block= layout->root->block;
- wmOperatorType *ot= WM_operatortype_find(idname, 0);
+ wmOperatorType *ot= WM_operatortype_find(opname, 1);
uiBut *but;
int w;
if(!ot) {
- ui_item_disabled(layout, idname);
+ ui_item_disabled(layout, opname);
+ RNA_warning("uiItemFullO: unknown operator '%s'\n", opname);
return PointerRNA_NULL;
}
@@ -708,7 +714,7 @@ void uiItemEnumO(uiLayout *layout, const char *opname, const char *name, int ico
void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname, IDProperty *properties, int context, int flag)
{
- wmOperatorType *ot= WM_operatortype_find(opname, 0);
+ wmOperatorType *ot= WM_operatortype_find(opname, 1);
PointerRNA ptr;
PropertyRNA *prop;
uiBut *bt;
@@ -716,6 +722,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname
if(!ot || !ot->srna) {
ui_item_disabled(layout, opname);
+ RNA_warning("uiItemsFullEnumO: %s '%s'\n", ot ? "unknown operator" : "operator missing srna", opname);
return;
}
@@ -756,7 +763,7 @@ void uiItemsFullEnumO(uiLayout *layout, const char *opname, const char *propname
block->flag |= UI_BLOCK_NO_FLIP;
}
- uiItemL(column, item[i].name, ICON_NULL);
+ uiItemL(column, item[i].name, ICON_NONE);
bt= block->buttons.last;
bt->flag= UI_TEXT_LEFT;
}
@@ -776,6 +783,33 @@ void uiItemsEnumO(uiLayout *layout, const char *opname, const char *propname)
}
/* for use in cases where we have */
+void uiItemEnumO_value(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, int value)
+{
+ PointerRNA ptr;
+
+ /* for getting the enum */
+ PropertyRNA *prop;
+
+ WM_operator_properties_create(&ptr, opname);
+
+ /* enum lookup */
+ if((prop= RNA_struct_find_property(&ptr, propname))) {
+ /* pass */
+ }
+ else {
+ RNA_warning("uiItemEnumO_value: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
+ return;
+ }
+
+ RNA_property_enum_set(&ptr, prop, value);
+
+ /* same as uiItemEnumO */
+ if(!name)
+ name= ui_menu_enumpropname(layout, opname, propname, value);
+
+ uiItemFullO(layout, opname, name, icon, ptr.data, layout->root->opcontext, 0);
+}
+
void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char *opname, const char *propname, const char *value_str)
{
PointerRNA ptr;
@@ -792,7 +826,7 @@ void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char
RNA_property_enum_items(layout->root->block->evil_C, &ptr, prop, &item, NULL, &free);
if(item==NULL || RNA_enum_value_from_id(item, value_str, &value)==0) {
if(free) MEM_freeN(item);
- printf("uiItemEnumO_string: %s.%s, enum %s not found.\n", RNA_struct_identifier(ptr.type), propname, value_str);
+ RNA_warning("uiItemEnumO_string: %s.%s, enum %s not found.\n", RNA_struct_identifier(ptr.type), propname, value_str);
return;
}
@@ -800,7 +834,7 @@ void uiItemEnumO_string(uiLayout *layout, const char *name, int icon, const char
MEM_freeN(item);
}
else {
- printf("uiItemEnumO_string: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
+ RNA_warning("uiItemEnumO_string: %s.%s not found.\n", RNA_struct_identifier(ptr.type), propname);
return;
}
@@ -881,7 +915,7 @@ static void ui_item_rna_size(uiLayout *layout, const char *name, int icon, Point
/* increase height for arrays */
if(index == RNA_NO_INDEX && len > 0) {
- if(!name[0] && icon == ICON_NULL)
+ if(!name[0] && icon == ICON_NONE)
h= 0;
if(ELEM(subtype, PROP_LAYER, PROP_LAYER_MEMBER))
@@ -921,7 +955,7 @@ void uiItemFullR(uiLayout *layout, PointerRNA *ptr, PropertyRNA *prop, int index
/* set name and icon */
if(!name)
name= RNA_property_ui_name(prop);
- if(icon == ICON_NULL)
+ if(icon == ICON_NONE)
icon= RNA_property_ui_icon(prop);
if(ELEM4(type, PROP_INT, PROP_FLOAT, PROP_STRING, PROP_POINTER))
@@ -1006,7 +1040,7 @@ void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, int flag,
if(!prop) {
ui_item_disabled(layout, propname);
- printf("uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1019,7 +1053,7 @@ void uiItemEnumR(uiLayout *layout, const char *name, int icon, struct PointerRNA
if(!prop || RNA_property_type(prop) != PROP_ENUM) {
ui_item_disabled(layout, propname);
- printf("uiItemEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("uiItemEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1034,7 +1068,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr
if(!prop || RNA_property_type(prop) != PROP_ENUM) {
ui_item_disabled(layout, propname);
- printf("uiItemEnumR_string: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("uiItemEnumR_string: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1043,7 +1077,7 @@ void uiItemEnumR_string(uiLayout *layout, struct PointerRNA *ptr, const char *pr
if(!RNA_enum_value_from_id(item, value, &ivalue)) {
if(free) MEM_freeN(item);
ui_item_disabled(layout, propname);
- printf("uiItemEnumR: enum property value not found: %s\n", value);
+ RNA_warning("uiItemEnumR: enum property value not found: %s\n", value);
return;
}
@@ -1068,10 +1102,15 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname
if(!prop) {
ui_item_disabled(layout, propname);
+ RNA_warning("uiItemsEnumR: enum property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
- if(RNA_property_type(prop) == PROP_ENUM) {
+ if(RNA_property_type(prop) != PROP_ENUM) {
+ RNA_warning("uiItemsEnumR: not an enum property: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ return;
+ }
+ else {
EnumPropertyItem *item;
int totitem, i, free;
uiLayout *split= uiLayoutSplit(layout, 0, 0);
@@ -1081,7 +1120,7 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname
for(i=0; i<totitem; i++) {
if(item[i].identifier[0]) {
- uiItemEnumR(column, item[i].name, ICON_NULL, ptr, propname, item[i].value);
+ uiItemEnumR(column, item[i].name, ICON_NONE, ptr, propname, item[i].value);
}
else {
if(item[i].name) {
@@ -1091,7 +1130,7 @@ void uiItemsEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propname
block->flag |= UI_BLOCK_NO_FLIP;
}
- uiItemL(column, item[i].name, ICON_NULL);
+ uiItemL(column, item[i].name, ICON_NONE);
bt= block->buttons.last;
bt->flag= UI_TEXT_LEFT;
}
@@ -1256,13 +1295,13 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
- printf("uiItemPointerR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("uiItemPointerR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
type= RNA_property_type(prop);
if(!ELEM(type, PROP_POINTER, PROP_STRING)) {
- printf("uiItemPointerR: property %s must be a pointer or string.\n", propname);
+ RNA_warning("uiItemPointerR: property %s must be a pointer or string.\n", propname);
return;
}
@@ -1270,16 +1309,16 @@ void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propna
if(!searchprop) {
- printf("uiItemPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+ RNA_warning("uiItemPointerR: search collection property not found: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
return;
}
else if (RNA_property_type(searchprop) != PROP_COLLECTION) {
- printf("uiItemPointerR: search collection property is not a collection type: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
+ RNA_warning("uiItemPointerR: search collection property is not a collection type: %s.%s\n", RNA_struct_identifier(ptr->type), searchpropname);
return;
}
/* get icon & name */
- if(icon==ICON_NULL) {
+ if(icon==ICON_NONE) {
if(type == PROP_POINTER)
icontype= RNA_property_pointer_type(ptr, prop);
else
@@ -1359,7 +1398,7 @@ void uiItemM(uiLayout *layout, bContext *UNUSED(C), const char *menuname, const
mt= WM_menutype_find(menuname, FALSE);
if(mt==NULL) {
- printf("uiItemM: not found %s\n", menuname);
+ RNA_warning("uiItemM: not found %s\n", menuname);
return;
}
@@ -1472,11 +1511,12 @@ static void menu_item_enum_opname_menu(bContext *UNUSED(C), uiLayout *layout, vo
void uiItemMenuEnumO(uiLayout *layout, const char *opname, const char *propname, const char *name, int icon)
{
- wmOperatorType *ot= WM_operatortype_find(opname, 0);
+ wmOperatorType *ot= WM_operatortype_find(opname, 1);
MenuItemLevel *lvl;
if(!ot || !ot->srna) {
ui_item_disabled(layout, opname);
+ RNA_warning("uiItemMenuEnumO: %s '%s'\n", ot ? "unknown operator" : "operator missing srna", name);
return;
}
@@ -1509,6 +1549,7 @@ void uiItemMenuEnumR(uiLayout *layout, struct PointerRNA *ptr, const char *propn
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
ui_item_disabled(layout, propname);
+ RNA_warning("uiItemMenuEnumR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1966,17 +2007,15 @@ static void ui_litem_layout_split(uiLayout *litem)
uiLayoutItemSplt *split= (uiLayoutItemSplt*)litem;
uiItem *item;
float percentage;
- int itemh, x, y, w, tot=0, colw=0;
+ const int tot= BLI_countlist(&litem->items);
+ int itemh, x, y, w, colw=0;
+
+ if(tot == 0)
+ return;
x= litem->x;
y= litem->y;
- for(item=litem->items.first; item; item=item->next)
- tot++;
-
- if(tot == 0)
- return;
-
percentage= (split->percentage == 0.0f)? 1.0f/(float)tot: split->percentage;
w= (litem->w - (tot-1)*litem->space);
@@ -2682,14 +2721,14 @@ void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,in
}
if(flag & UI_LAYOUT_OP_SHOW_TITLE) {
- uiItemL(layout, op->type->name, ICON_NULL);
+ uiItemL(layout, op->type->name, ICON_NONE);
}
/* poll() on this operator may still fail, at the moment there is no nice feedback when this happens
* just fails silently */
if(!WM_operator_repeat_check(C, op)) {
uiBlockSetButLock(uiLayoutGetBlock(layout), TRUE, "Operator cannot redo");
- uiItemL(layout, "* Redo Unsupported *", ICON_NULL); // XXX, could give some nicer feedback or not show redo panel at all?
+ uiItemL(layout, "* Redo Unsupported *", ICON_NONE); // XXX, could give some nicer feedback or not show redo panel at all?
}
if(op->type->ui) {
@@ -2713,7 +2752,7 @@ void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,in
uiLayout *row;
row= uiLayoutRow(layout, TRUE);
- uiItemM(row, (bContext *)C, "WM_MT_operator_presets", NULL, ICON_NULL);
+ uiItemM(row, (bContext *)C, "WM_MT_operator_presets", NULL, ICON_NONE);
WM_operator_properties_create(&op_ptr, "WM_OT_operator_preset_add");
RNA_string_set(&op_ptr, "operator", op->type->idname);
@@ -2729,7 +2768,7 @@ void uiLayoutOperatorButs(const bContext *C, uiLayout *layout, wmOperator *op,in
empty= uiDefAutoButsRNA(layout, &ptr, check_prop, label_align) == 0;
if(empty && (flag & UI_LAYOUT_OP_SHOW_EMPTY)) {
- uiItemL(layout, "No Properties.", ICON_NULL);
+ uiItemL(layout, "No Properties.", ICON_NONE);
}
}
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index 2e6793fb5d5..12506d28593 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_ops.c
+ * \ingroup edinterface
+ */
+
+
#include <stdio.h>
#include <math.h>
#include <string.h>
diff --git a/source/blender/editors/interface/interface_panel.c b/source/blender/editors/interface/interface_panel.c
index c069ae4d833..b47194ba1b4 100644
--- a/source/blender/editors/interface/interface_panel.c
+++ b/source/blender/editors/interface/interface_panel.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_panel.c
+ * \ingroup edinterface
+ */
+
+
/* a full doc with API notes can be found in bf-blender/trunk/blender/doc/guides/interface_API.txt */
#include <math.h>
@@ -372,7 +377,7 @@ static void ui_draw_anti_x(float x1, float y1, float x2, float y2)
static void ui_draw_x_icon(float x, float y)
{
- ui_draw_anti_x(x, y, x+9.375, y+9.375);
+ ui_draw_anti_x(x, y, x+9.375f, y+9.375f);
}
@@ -732,8 +737,8 @@ static int uiAlignPanelStep(ScrArea *sa, ARegion *ar, float fac, int drag)
for(a=0; a<tot; a++, ps++) {
if((ps->pa->flag & PNL_SELECT)==0) {
if((ps->orig->ofsx != ps->pa->ofsx) || (ps->orig->ofsy != ps->pa->ofsy)) {
- ps->orig->ofsx= floor(0.5 + fac*ps->pa->ofsx + (1.0-fac)*ps->orig->ofsx);
- ps->orig->ofsy= floor(0.5 + fac*ps->pa->ofsy + (1.0-fac)*ps->orig->ofsy);
+ ps->orig->ofsx= floorf(0.5f + fac*(float)ps->pa->ofsx + (1.0f-fac)*(float)ps->orig->ofsx);
+ ps->orig->ofsy= floorf(0.5f + fac*(float)ps->pa->ofsy + (1.0f-fac)*(float)ps->orig->ofsy);
done= 1;
}
}
@@ -881,9 +886,9 @@ static void check_panel_overlap(ARegion *ar, Panel *panel)
else if(panel->flag & PNL_CLOSEDY) safey= 0.05;
if(pa->ofsx > panel->ofsx- safex*panel->sizex)
- if(pa->ofsx+pa->sizex < panel->ofsx+ (1.0+safex)*panel->sizex)
+ if(pa->ofsx+pa->sizex < panel->ofsx+ (1.0f+safex)*panel->sizex)
if(pa->ofsy > panel->ofsy- safey*panel->sizey)
- if(pa->ofsy+pa->sizey < panel->ofsy+ (1.0+safey)*panel->sizey)
+ if(pa->ofsy+pa->sizey < panel->ofsy+ (1.0f+safey)*panel->sizey)
pa->flag |= PNL_OVERLAP;
}
}
@@ -1092,6 +1097,7 @@ int ui_handler_panel_region(bContext *C, wmEvent *event)
}*/
}
else if(event->type==PADPLUSKEY || event->type==PADMINUS) {
+#if 0 // XXX make float panel exception?
int zoom=0;
/* if panel is closed, only zoom if mouse is over the header */
@@ -1102,7 +1108,6 @@ int ui_handler_panel_region(bContext *C, wmEvent *event)
else
zoom=1;
-#if 0 // XXX make float panel exception?
if(zoom) {
ScrArea *sa= CTX_wm_area(C);
SpaceLink *sl= sa->spacedata.first;
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index c1eaf66fb65..4457ec6b323 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_regions.c
+ * \ingroup edinterface
+ */
+
+
#include <stdarg.h>
#include <stdlib.h>
@@ -524,9 +529,11 @@ ARegion *ui_tooltip_create(bContext *C, ARegion *butregion, uiBut *but)
x2= winx;
}
}
- if(y1 < 0) {
- y1 += 56;
- y2 += 56;
+ /* ensure at least 5 px above screen bounds
+ * 25 is just a guess to be above the menu item */
+ if(y1 < 5) {
+ y2 += (-y1) + 30;
+ y1 = 30;
}
/* widget rect, in region coords */
@@ -678,7 +685,7 @@ static void ui_searchbox_butrect(rcti *rect, uiSearchboxData *data, int itemnr)
rect->xmin += col * butw;
rect->xmax = rect->xmin + butw;
- rect->ymax = data->bbox.ymax - (row * buth);
+ rect->ymax = data->bbox.ymax - MENU_TOP - (row * buth);
rect->ymin = rect->ymax - buth;
}
/* list view */
@@ -980,7 +987,7 @@ ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
data->bbox.ymax= (ar->winrct.ymax-ar->winrct.ymin) - MENU_SHADOW_BOTTOM;
/* check if button is lower half */
- if( but->y2 < (but->block->minx+but->block->maxx)/2 ) {
+ if( but->y2 < (but->block->miny+but->block->maxy)/2 ) {
data->bbox.ymin += (but->y2-but->y1);
}
else {
@@ -1034,7 +1041,7 @@ ARegion *ui_searchbox_create(bContext *C, ARegion *butregion, uiBut *but)
}
if(y1 < 0) { /* XXX butregion NULL check?, there is one above */
int newy1;
- UI_view2d_to_region_no_clip(&butregion->v2d, 0, but->y2 + ofsy, 0, &newy1);
+ UI_view2d_to_region_no_clip(&butregion->v2d, 0, but->y2 + ofsy, NULL, &newy1);
newy1 += butregion->winrct.ymin;
y2= y2-y1 + newy1;
@@ -1086,9 +1093,17 @@ void ui_searchbox_free(bContext *C, ARegion *ar)
/* XXX weak: search_func adds all partial matches... */
void ui_but_search_test(uiBut *but)
{
- uiSearchItems *items= MEM_callocN(sizeof(uiSearchItems), "search items");
+ uiSearchItems *items;
int x1;
-
+
+ /* possibly very large lists (such as ID datablocks) only
+ * only validate string RNA buts (not pointers) */
+ if(but->rnaprop && RNA_property_type(but->rnaprop) != PROP_STRING) {
+ return;
+ }
+
+ items= MEM_callocN(sizeof(uiSearchItems), "search items");
+
/* setup search struct */
items->maxitem= 10;
items->maxstrlen= 256;
@@ -1180,9 +1195,9 @@ static void ui_block_position(wmWindow *window, ARegion *butregion, uiBut *but,
if(block->direction & UI_CENTER) center= ysize/2;
else center= 0;
- if( butrct.xmin-xsize > 0.0) left= 1;
+ if( butrct.xmin-xsize > 0.0f) left= 1;
if( butrct.xmax+xsize < winx) right= 1;
- if( butrct.ymin-ysize+center > 0.0) down= 1;
+ if( butrct.ymin-ysize+center > 0.0f) down= 1;
if( butrct.ymax+ysize-center < winy) top= 1;
dir1= block->direction & UI_DIRECTION;
@@ -1295,8 +1310,8 @@ static void ui_block_position(wmWindow *window, ARegion *butregion, uiBut *but,
/* safety calculus */
if(but) {
- float midx= (butrct.xmin+butrct.xmax)/2.0;
- float midy= (butrct.ymin+butrct.ymax)/2.0;
+ float midx= (butrct.xmin+butrct.xmax)/2.0f;
+ float midy= (butrct.ymin+butrct.ymax)/2.0f;
/* when you are outside parent button, safety there should be smaller */
@@ -1495,7 +1510,7 @@ static void ui_block_func_MENUSTR(bContext *UNUSED(C), uiLayout *layout, void *a
uiItemL(layout, md->title, md->titleicon);
}
else {
- uiItemL(layout, md->title, ICON_NULL);
+ uiItemL(layout, md->title, ICON_NONE);
bt= block->buttons.last;
bt->flag= UI_TEXT_LEFT;
}
@@ -1895,7 +1910,7 @@ static void uiBlockPicker(uiBlock *block, float *rgb, PointerRNA *ptr, PropertyR
bt= uiDefButR(block, NUMSLI, 0, "B ", 0, -100, butwidth, UI_UNIT_Y, ptr, propname, 2, 0.0, 0.0, 0, 3, "Blue");
uiButSetFunc(bt, do_picker_rna_cb, bt, NULL);
- // could use uiItemFullR(col, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER, "", ICON_NULL);
+ // could use uiItemFullR(col, ptr, prop, -1, 0, UI_ITEM_R_EXPAND|UI_ITEM_R_SLIDER, "", ICON_NONE);
// but need to use uiButSetFunc for updating other fake buttons
/* HSV values */
@@ -2420,7 +2435,7 @@ void uiPupMenuInvoke(bContext *C, const char *idname)
if(mt->poll && mt->poll(C, mt)==0)
return;
- pup= uiPupMenuBegin(C, mt->label, ICON_NULL);
+ pup= uiPupMenuBegin(C, mt->label, ICON_NONE);
layout= uiPupMenuLayout(pup);
menu.layout= layout;
diff --git a/source/blender/editors/interface/interface_style.c b/source/blender/editors/interface/interface_style.c
index 8e206f35b7f..7be089fdf32 100644
--- a/source/blender/editors/interface/interface_style.c
+++ b/source/blender/editors/interface/interface_style.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_style.c
+ * \ingroup edinterface
+ */
+
+
#include <limits.h>
#include <math.h>
#include <stdlib.h>
@@ -286,7 +291,9 @@ void uiStyleInit(void)
uiStyle *style= U.uistyles.first;
/* recover from uninitialized dpi */
- CLAMP(U.dpi, 72, 240);
+ if(U.dpi == 0)
+ U.dpi= 72;
+ CLAMP(U.dpi, 48, 128);
/* default builtin */
if(font==NULL) {
diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c
index 9fd88fa75a9..01e785ef88c 100644
--- a/source/blender/editors/interface/interface_templates.c
+++ b/source/blender/editors/interface/interface_templates.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_templates.c
+ * \ingroup edinterface
+ */
+
+
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
@@ -186,6 +191,8 @@ static uiBlock *id_search_menu(bContext *C, ARegion *ar, void *arg_litem)
/* give search-field focus */
uiButSetFocusOnEnter(win, but);
+ /* this type of search menu requires undo */
+ but->flag |= UI_BUT_UNDO;
return block;
}
@@ -233,7 +240,7 @@ static void template_id_cb(bContext *C, void *arg_litem, void *arg_event)
switch(event) {
case UI_ID_BROWSE:
case UI_ID_PIN:
- printf("warning, id event %d shouldnt come here\n", event);
+ RNA_warning("warning, id event %d shouldnt come here\n", event);
break;
case UI_ID_OPEN:
case UI_ID_ADD_NEW:
@@ -323,13 +330,13 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
uiBut *but;
uiBlock *block;
PointerRNA idptr;
- ListBase *lb;
+ // ListBase *lb; // UNUSED
ID *id, *idfrom;
idptr= RNA_property_pointer_get(&template->ptr, template->prop);
id= idptr.data;
idfrom= template->ptr.id.data;
- lb= template->idlb;
+ // lb= template->idlb;
block= uiLayoutGetBlock(layout);
uiBlockBeginAlign(block);
@@ -378,12 +385,12 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
if(id->lib) {
if(id->flag & LIB_INDIRECT) {
- but= uiDefIconBut(block, BUT, 0, ICON_LIBRARY_DATA_INDIRECT, 0,0,UI_UNIT_X,UI_UNIT_Y, 0, 0, 0, 0, 0,
+ but= uiDefIconBut(block, BUT, 0, ICON_LIBRARY_DATA_INDIRECT, 0,0,UI_UNIT_X,UI_UNIT_Y, NULL, 0, 0, 0, 0,
"Indirect library datablock, cannot change.");
uiButSetFlag(but, UI_BUT_DISABLED);
}
else {
- but= uiDefIconBut(block, BUT, 0, ICON_LIBRARY_DATA_DIRECT, 0,0,UI_UNIT_X,UI_UNIT_Y, 0, 0, 0, 0, 0,
+ but= uiDefIconBut(block, BUT, 0, ICON_LIBRARY_DATA_DIRECT, 0,0,UI_UNIT_X,UI_UNIT_Y, NULL, 0, 0, 0, 0,
"Direct linked library datablock, click to make local.");
if(!id_make_local(id, 1 /* test */) || (idfrom && idfrom->lib))
uiButSetFlag(but, UI_BUT_DISABLED);
@@ -398,9 +405,9 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
sprintf(str, "%d", id->us);
if(id->us<10)
- but= uiDefBut(block, BUT, 0, str, 0,0,UI_UNIT_X,UI_UNIT_Y, 0, 0, 0, 0, 0, "Displays number of users of this data. Click to make a single-user copy.");
+ but= uiDefBut(block, BUT, 0, str, 0,0,UI_UNIT_X,UI_UNIT_Y, NULL, 0, 0, 0, 0, "Displays number of users of this data. Click to make a single-user copy.");
else
- but= uiDefBut(block, BUT, 0, str, 0,0,UI_UNIT_X+10,UI_UNIT_Y, 0, 0, 0, 0, 0, "Displays number of users of this data. Click to make a single-user copy.");
+ but= uiDefBut(block, BUT, 0, str, 0,0,UI_UNIT_X+10,UI_UNIT_Y, NULL, 0, 0, 0, 0, "Displays number of users of this data. Click to make a single-user copy.");
uiButSetNFunc(but, template_id_cb, MEM_dupallocN(template), SET_INT_IN_POINTER(UI_ID_ALONE));
if(!id_copy(id, NULL, 1 /* test only */) || (idfrom && idfrom->lib))
@@ -409,7 +416,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
if(user_alert) uiButSetFlag(but, UI_BUT_REDALERT);
- if(id->lib == NULL && !(ELEM4(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT))) {
+ if(id->lib == NULL && !(ELEM5(GS(id->name), ID_GR, ID_SCE, ID_SCR, ID_TXT, ID_OB))) {
uiDefButR(block, TOG, 0, "F", 0, 0, UI_UNIT_X, UI_UNIT_Y, &idptr, "use_fake_user", -1, 0, 0, -1, -1, NULL);
}
}
@@ -451,7 +458,7 @@ static void template_ID(bContext *C, uiLayout *layout, TemplateID *template, Str
if(unlinkop) {
but= uiDefIconButO(block, BUT, unlinkop, WM_OP_INVOKE_REGION_WIN, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL);
/* so we can access the template from operators, font unlinking needs this */
- uiButSetNFunc(but, NULL, MEM_dupallocN(template), 0);
+ uiButSetNFunc(but, NULL, MEM_dupallocN(template), NULL);
}
else {
but= uiDefIconBut(block, BUT, 0, ICON_X, 0, 0, UI_UNIT_X, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Unlink datablock. Shift + Click to set users to zero, data gets not saved");
@@ -477,7 +484,7 @@ static void ui_template_id(uiLayout *layout, bContext *C, PointerRNA *ptr, const
prop= RNA_struct_find_property(ptr, propname);
if(!prop || RNA_property_type(prop) != PROP_POINTER) {
- printf("uiTemplateID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("uiTemplateID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -538,11 +545,11 @@ void uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, co
propType= RNA_struct_find_property(ptr, proptypename);
if (!propID || RNA_property_type(propID) != PROP_POINTER) {
- printf("uiTemplateAnyID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("uiTemplateAnyID: pointer property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
if (!propType || RNA_property_type(propType) != PROP_ENUM) {
- printf("uiTemplateAnyID: pointer-type property not found: %s.%s\n", RNA_struct_identifier(ptr->type), proptypename);
+ RNA_warning("uiTemplateAnyID: pointer-type property not found: %s.%s\n", RNA_struct_identifier(ptr->type), proptypename);
return;
}
@@ -551,16 +558,16 @@ void uiTemplateAnyID(uiLayout *layout, PointerRNA *ptr, const char *propname, co
/* Label - either use the provided text, or will become "ID-Block:" */
if (text)
- uiItemL(row, text, ICON_NULL);
+ uiItemL(row, text, ICON_NONE);
else
- uiItemL(row, "ID-Block:", ICON_NULL);
+ uiItemL(row, "ID-Block:", ICON_NONE);
/* ID-Type Selector - just have a menu of icons */
// FIXME: the icon-only setting doesn't work when we supply a blank name
- uiItemFullR(row, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemFullR(row, ptr, propType, 0, 0, UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
/* ID-Block Selector - just use pointer widget... */
- uiItemFullR(row, ptr, propID, 0, 0, 0, "", ICON_NULL);
+ uiItemFullR(row, ptr, propID, 0, 0, 0, "", ICON_NONE);
}
/********************* RNA Path Builder Template ********************/
@@ -581,7 +588,7 @@ void uiTemplatePathBuilder(uiLayout *layout, PointerRNA *ptr, const char *propna
/* check that properties are valid */
propPath= RNA_struct_find_property(ptr, propname);
if (!propPath || RNA_property_type(propPath) != PROP_STRING) {
- printf("uiTemplatePathBuilder: path property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("uiTemplatePathBuilder: path property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -705,14 +712,14 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiBlockSetEmboss(block, UI_EMBOSSN);
/* Open/Close ................................. */
- uiItemR(row, &ptr, "show_expanded", 0, "", ICON_NULL);
+ uiItemR(row, &ptr, "show_expanded", 0, "", ICON_NONE);
/* modifier-type icon */
uiItemL(row, "", RNA_struct_ui_icon(ptr.type));
uiBlockSetEmboss(block, UI_EMBOSS);
/* modifier name */
- uiItemR(row, &ptr, "name", 0, "", ICON_NULL);
+ uiItemR(row, &ptr, "name", 0, "", ICON_NONE);
/* mode enabling buttons */
uiBlockBeginAlign(block);
@@ -720,11 +727,11 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
if ( ((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect))
&& (md->type!=eModifierType_Surface) )
{
- uiItemR(row, &ptr, "show_render", 0, "", ICON_NULL);
- uiItemR(row, &ptr, "show_viewport", 0, "", ICON_NULL);
+ uiItemR(row, &ptr, "show_render", 0, "", ICON_NONE);
+ uiItemR(row, &ptr, "show_viewport", 0, "", ICON_NONE);
if (mti->flags & eModifierTypeFlag_SupportsEditmode)
- uiItemR(row, &ptr, "show_in_editmode", 0, "", ICON_NULL);
+ uiItemR(row, &ptr, "show_in_editmode", 0, "", ICON_NONE);
}
if ((ob->type==OB_MESH) && modifier_couldBeCage(scene, md) && (index <= lastCageIndex))
{
@@ -745,7 +752,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiButSetFlag(but, UI_BUT_DISABLED);
} else if (mti->type != eModifierTypeType_Constructive) {
/* constructive modifiers tesselates curve before applying */
- uiItemR(row, &ptr, "use_apply_on_spline", 0, "", ICON_NULL);
+ uiItemR(row, &ptr, "use_apply_on_spline", 0, "", ICON_NONE);
}
}
@@ -779,9 +786,9 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
if (!(ob->mode & OB_MODE_PARTICLE_EDIT) && psys->pathcache) {
if(ELEM(psys->part->ren_as, PART_DRAW_GR, PART_DRAW_OB))
- uiItemO(row, "Convert", ICON_NULL, "OBJECT_OT_duplicates_make_real");
+ uiItemO(row, "Convert", ICON_NONE, "OBJECT_OT_duplicates_make_real");
else if(psys->part->ren_as == PART_DRAW_PATH)
- uiItemO(row, "Convert", ICON_NULL, "OBJECT_OT_modifier_convert");
+ uiItemO(row, "Convert", ICON_NONE, "OBJECT_OT_modifier_convert");
}
}
else {
@@ -796,7 +803,7 @@ static uiLayout *draw_modifier(uiLayout *layout, Scene *scene, Object *ob, Modif
uiBlockSetButLock(block, ob && ob->id.lib, ERROR_LIBDATA_MESSAGE);
if (!ELEM5(md->type, eModifierType_Fluidsim, eModifierType_Softbody, eModifierType_ParticleSystem, eModifierType_Cloth, eModifierType_Smoke))
- uiItemO(row, "Copy", ICON_NULL, "OBJECT_OT_modifier_copy");
+ uiItemO(row, "Copy", ICON_NONE, "OBJECT_OT_modifier_copy");
}
/* result is the layout block inside the box, that we return so that modifier settings can be drawn */
@@ -823,7 +830,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
/* verify we have valid data */
if(!RNA_struct_is_a(ptr->type, &RNA_Modifier)) {
- printf("uiTemplateModifier: expected modifier on object.\n");
+ RNA_warning("uiTemplateModifier: expected modifier on object.\n");
return NULL;
}
@@ -831,7 +838,7 @@ uiLayout *uiTemplateModifier(uiLayout *layout, bContext *C, PointerRNA *ptr)
md= ptr->data;
if(!ob || !(GS(ob->id.name) == ID_OB)) {
- printf("uiTemplateModifier: expected modifier on object.\n");
+ RNA_warning("uiTemplateModifier: expected modifier on object.\n");
return NULL;
}
@@ -913,7 +920,7 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
PointerRNA ptr;
char typestr[32];
short proxy_protected, xco=0, yco=0;
- int rb_col;
+ // int rb_col; // UNUSED
/* get constraint typeinfo */
cti= constraint_get_typeinfo(con);
@@ -950,11 +957,11 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
/* Draw constraint header */
/* rounded header */
- rb_col= (con->flag & CONSTRAINT_ACTIVE)?50:20;
+ // rb_col= (con->flag & CONSTRAINT_ACTIVE)?50:20; // UNUSED
/* open/close */
uiBlockSetEmboss(block, UI_EMBOSSN);
- uiItemR(row, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(row, &ptr, "show_expanded", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
uiBlockSetEmboss(block, UI_EMBOSS);
/* name */
@@ -964,10 +971,10 @@ static uiLayout *draw_constraint(uiLayout *layout, Object *ob, bConstraint *con)
uiLayoutSetRedAlert(row, 1);
if(proxy_protected == 0) {
- uiItemR(row, &ptr, "name", 0, "", ICON_NULL);
+ uiItemR(row, &ptr, "name", 0, "", ICON_NONE);
}
else
- uiItemL(row, con->name, ICON_NULL);
+ uiItemL(row, con->name, ICON_NONE);
uiLayoutSetRedAlert(row, 0);
@@ -1055,7 +1062,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
/* verify we have valid data */
if(!RNA_struct_is_a(ptr->type, &RNA_Constraint)) {
- printf("uiTemplateConstraint: expected constraint on object.\n");
+ RNA_warning("uiTemplateConstraint: expected constraint on object.\n");
return NULL;
}
@@ -1063,7 +1070,7 @@ uiLayout *uiTemplateConstraint(uiLayout *layout, PointerRNA *ptr)
con= ptr->data;
if(!ob || !(GS(ob->id.name) == ID_OB)) {
- printf("uiTemplateConstraint: expected constraint on object.\n");
+ RNA_warning("uiTemplateConstraint: expected constraint on object.\n");
return NULL;
}
@@ -1109,7 +1116,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
PointerRNA texture_ptr;
if(id && !ELEM4(GS(id->name), ID_MA, ID_TE, ID_WO, ID_LA)) {
- printf("uiTemplatePreview: expected ID of type material, texture, lamp or world.\n");
+ RNA_warning("uiTemplatePreview: expected ID of type material, texture, lamp or world.\n");
return;
}
@@ -1155,7 +1162,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
col = uiLayoutColumn(row, 1);
uiLayoutSetScaleX(col, 1.5);
- uiItemR(col, &material_ptr, "preview_render_type", UI_ITEM_R_EXPAND, "", ICON_NULL);
+ uiItemR(col, &material_ptr, "preview_render_type", UI_ITEM_R_EXPAND, "", ICON_NONE);
}
if(pr_texture) {
@@ -1175,7 +1182,7 @@ void uiTemplatePreview(uiLayout *layout, ID *id, int show_buttons, ID *parent, M
/* Alpha buton for texture preview */
if(*pr_texture!=TEX_PR_OTHER) {
row = uiLayoutRow(layout, 0);
- uiItemR(row, &texture_ptr, "use_preview_alpha", 0, NULL, ICON_NULL);
+ uiItemR(row, &texture_ptr, "use_preview_alpha", 0, NULL, ICON_NONE);
}
}
}
@@ -1260,15 +1267,15 @@ static void colorband_buttons_large(uiLayout *layout, uiBlock *block, ColorBand
if(coba==NULL) return;
- bt= uiDefBut(block, BUT, 0, "Add", 0+xoffs,100+yoffs,40,20, 0, 0, 0, 0, 0, "Add a new color stop to the colorband");
+ bt= uiDefBut(block, BUT, 0, "Add", 0+xoffs,100+yoffs,40,20, NULL, 0, 0, 0, 0, "Add a new color stop to the colorband");
uiButSetNFunc(bt, colorband_add_cb, MEM_dupallocN(cb), coba);
- bt= uiDefBut(block, BUT, 0, "Delete", 45+xoffs,100+yoffs,45,20, 0, 0, 0, 0, 0, "Delete the active position");
+ bt= uiDefBut(block, BUT, 0, "Delete", 45+xoffs,100+yoffs,45,20, NULL, 0, 0, 0, 0, "Delete the active position");
uiButSetNFunc(bt, colorband_del_cb, MEM_dupallocN(cb), coba);
/* XXX, todo for later - convert to operator - campbell */
- bt= uiDefBut(block, BUT, 0, "F", 95+xoffs,100+yoffs,20,20, 0, 0, 0, 0, 0, "Flip colorband");
+ bt= uiDefBut(block, BUT, 0, "F", 95+xoffs,100+yoffs,20,20, NULL, 0, 0, 0, 0, "Flip colorband");
uiButSetNFunc(bt, colorband_flip_cb, MEM_dupallocN(cb), coba);
uiDefButS(block, NUM, 0, "", 120+xoffs,100+yoffs,80, 20, &coba->cur, 0.0, (float)(MAX2(0, coba->tot-1)), 0, 0, "Choose active color stop");
@@ -1290,8 +1297,8 @@ static void colorband_buttons_large(uiLayout *layout, uiBlock *block, ColorBand
PointerRNA ptr;
RNA_pointer_create(cb->ptr.id.data, &RNA_ColorRampElement, cbd, &ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, &ptr, "position", 0, "Pos", ICON_NULL);
- uiItemR(row, &ptr, "color", 0, "", ICON_NULL);
+ uiItemR(row, &ptr, "position", 0, "Pos", ICON_NONE);
+ uiItemR(row, &ptr, "color", 0, "", ICON_NONE);
}
}
@@ -1315,7 +1322,7 @@ static void colorband_buttons_small(uiLayout *layout, uiBlock *block, ColorBand
CBData *cbd= coba->data + coba->cur;
PointerRNA ptr;
RNA_pointer_create(cb->ptr.id.data, &RNA_ColorRampElement, cbd, &ptr);
- uiItemR(layout, &ptr, "color", 0, "", ICON_NULL);
+ uiItemR(layout, &ptr, "color", 0, "", ICON_NONE);
}
bt= uiDefButS(block, MENU, 0, "Interpolation %t|Ease %x1|Cardinal %x3|Linear %x0|B-Spline %x2|Constant %x4",
@@ -1435,6 +1442,7 @@ void uiTemplateWaveform(uiLayout *layout, PointerRNA *ptr, const char *propname)
scopes->wavefrm_height= (scopes->wavefrm_height<=20)?20:scopes->wavefrm_height;
bt= uiDefBut(block, WAVEFORM, 0, "", rect.xmin, rect.ymin, rect.xmax-rect.xmin, scopes->wavefrm_height, scopes, 0, 0, 0, 0, "");
+ (void)bt; // UNUSED
MEM_freeN(cb);
}
@@ -1794,8 +1802,8 @@ static void curvemap_buttons_layout(uiLayout *layout, PointerRNA *ptr, char labe
/* black/white levels */
if(levels) {
split= uiLayoutSplit(layout, 0, 0);
- uiItemR(uiLayoutColumn(split, 0), ptr, "black_level", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
- uiItemR(uiLayoutColumn(split, 0), ptr, "white_level", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(uiLayoutColumn(split, 0), ptr, "black_level", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ uiItemR(uiLayoutColumn(split, 0), ptr, "white_level", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
uiLayoutRow(layout, 0);
bt=uiDefBut(block, BUT, 0, "Reset", 0, 0, UI_UNIT_X*10, UI_UNIT_Y, NULL, 0.0f, 0.0f, 0, 0, "Reset Black/White point and curves");
@@ -1811,8 +1819,15 @@ void uiTemplateCurveMapping(uiLayout *layout, PointerRNA *ptr, const char *propn
PropertyRNA *prop= RNA_struct_find_property(ptr, propname);
PointerRNA cptr;
- if(!prop || RNA_property_type(prop) != PROP_POINTER)
+ if(!prop) {
+ RNA_warning("uiTemplateCurveMapping: curve property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
+ }
+
+ if(RNA_property_type(prop) != PROP_POINTER) {
+ RNA_warning("uiTemplateCurveMapping: curve is not a pointer: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ return;
+ }
cptr= RNA_property_pointer_get(ptr, prop);
if(!cptr.data || !RNA_struct_is_a(cptr.type, &RNA_CurveMapping))
@@ -1840,7 +1855,7 @@ void uiTemplateColorWheel(uiLayout *layout, PointerRNA *ptr, const char *propnam
float softmin, softmax, step, precision;
if (!prop) {
- printf("uiTemplateColorWheel: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("uiTemplateColorWheel: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1890,6 +1905,9 @@ static void handle_layer_buttons(bContext *C, void *arg1, void *arg2)
RNA_property_boolean_set_index(&but->rnapoin, but->rnaprop, i, 0);
}
}
+
+ /* view3d layer change should update depsgraph (invisible object changed maybe) */
+ /* see view3d_header.c */
}
// TODO:
@@ -1907,7 +1925,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
prop= RNA_struct_find_property(ptr, propname);
if (!prop) {
- printf("uiTemplateLayer: layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("uiTemplateLayer: layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
@@ -1924,7 +1942,7 @@ void uiTemplateLayers(uiLayout *layout, PointerRNA *ptr, const char *propname,
if(used_ptr && used_propname) {
used_prop= RNA_struct_find_property(used_ptr, used_propname);
if (!used_prop) {
- printf("uiTemplateLayer: used layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), used_propname);
+ RNA_warning("uiTemplateLayer: used layers property not found: %s.%s\n", RNA_struct_identifier(ptr->type), used_propname);
return;
}
@@ -2017,7 +2035,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
/* retrieve icon and name */
icon= list_item_icon_get(C, itemptr, rnaicon, 0);
- if(icon == ICON_NULL || icon == ICON_DOT)
+ if(icon == ICON_NONE || icon == ICON_DOT)
icon= 0;
namebuf= RNA_struct_name_get_alloc(itemptr, NULL, 0);
@@ -2058,7 +2076,7 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
uiItemL(sub, str, ui_id_icon_get(C, &manode->id, 1));
}
else if(ma->use_nodes) {
- uiItemL(sub, "Node <none>", ICON_NULL);
+ uiItemL(sub, "Node <none>", ICON_NONE);
}
}
}
@@ -2071,8 +2089,8 @@ static void list_item_row(bContext *C, uiLayout *layout, PointerRNA *ptr, Pointe
uiBlockSetEmboss(block, UI_EMBOSSN);
row= uiLayoutRow(split, 1);
- if(i == 0) uiItemL(row, "", ICON_NULL);
- else uiItemR(row, itemptr, "value", 0, "", ICON_NULL);
+ if(i == 0) uiItemL(row, "", ICON_NONE);
+ else uiItemR(row, itemptr, "value", 0, "", ICON_NONE);
if(ob->mode == OB_MODE_EDIT && !((ob->shapeflag & OB_SHAPE_EDIT_MODE) && ob->type == OB_MESH))
uiLayoutSetActive(row, 0);
@@ -2105,7 +2123,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
pa= block->panel;
if(!pa) {
- printf("uiTemplateList: only works inside a panel.\n");
+ RNA_warning("uiTemplateList: only works inside a panel.\n");
return;
}
@@ -2115,28 +2133,28 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
if(ptr->data) {
prop= RNA_struct_find_property(ptr, propname);
if(!prop) {
- printf("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
}
activeprop= RNA_struct_find_property(activeptr, activepropname);
if(!activeprop) {
- printf("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), activepropname);
+ RNA_warning("uiTemplateList: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), activepropname);
return;
}
if(prop) {
type= RNA_property_type(prop);
if(type != PROP_COLLECTION) {
- printf("uiTemplateList: expected collection property.\n");
+ RNA_warning("uiTemplateList: expected collection property.\n");
return;
}
}
activetype= RNA_property_type(activeprop);
if(activetype != PROP_INT) {
- printf("uiTemplateList: expected integer property.\n");
+ RNA_warning("uiTemplateList: expected integer property.\n");
return;
}
@@ -2199,7 +2217,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
/* if not found, add in dummy button */
if(i == 0)
- uiItemL(row, "", ICON_NULL);
+ uiItemL(row, "", ICON_NONE);
/* next/prev button */
sprintf(str, "%d :", i);
@@ -2252,7 +2270,7 @@ void uiTemplateList(uiLayout *layout, bContext *C, PointerRNA *ptr, const char *
/* add dummy buttons to fill space */
while(i < pa->list_scroll+items) {
if(i >= pa->list_scroll)
- uiItemL(col, "", ICON_NULL);
+ uiItemL(col, "", ICON_NONE);
i++;
}
@@ -2372,6 +2390,7 @@ void uiTemplateRunningJobs(uiLayout *layout, bContext *C)
uiLayout *ui_abs;
ui_abs= uiLayoutAbsolute(layout, 0);
+ (void)ui_abs; // UNUSED
uiDefIconBut(block, BUT, handle_event, ICON_PANEL_CLOSE,
0, UI_UNIT_Y*0.1, UI_UNIT_X*0.8, UI_UNIT_Y*0.8, NULL, 0.0f, 0.0f, 0, 0, "Stop this job");
@@ -2406,7 +2425,7 @@ void uiTemplateReportsBanner(uiLayout *layout, bContext *C)
rti= (ReportTimerInfo *)reports->reporttimer->customdata;
- if (!rti || rti->widthfac==0.0 || !report) return;
+ if (!rti || rti->widthfac==0.0f || !report) return;
ui_abs= uiLayoutAbsolute(layout, 0);
block= uiLayoutGetBlock(ui_abs);
diff --git a/source/blender/editors/interface/interface_utils.c b/source/blender/editors/interface/interface_utils.c
index e7848c07095..f22c8eb4bfe 100644
--- a/source/blender/editors/interface/interface_utils.c
+++ b/source/blender/editors/interface/interface_utils.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_utils.c
+ * \ingroup edinterface
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -140,16 +145,22 @@ int uiDefAutoButsRNA(uiLayout *layout, PointerRNA *ptr, int (*check_prop)(Proper
continue;
if(label_align != '\0') {
+ PropertyType type = RNA_property_type(prop);
+ int is_boolean = (type == PROP_BOOLEAN && !RNA_property_array_check(ptr, prop));
+
name= RNA_property_ui_name(prop);
if(label_align=='V') {
col= uiLayoutColumn(layout, 1);
- uiItemL(col, name, ICON_NULL);
+
+ if(!is_boolean)
+ uiItemL(col, name, ICON_NONE);
}
else if(label_align=='H') {
split = uiLayoutSplit(layout, 0.5f, 0);
- uiItemL(uiLayoutColumn(split, 0), name, ICON_NULL);
+ col= uiLayoutColumn(split, 0);
+ uiItemL(col, (is_boolean)? "": name, ICON_NONE);
col= uiLayoutColumn(split, 0);
}
else {
@@ -158,19 +169,16 @@ int uiDefAutoButsRNA(uiLayout *layout, PointerRNA *ptr, int (*check_prop)(Proper
/* may meed to add more cases here.
* don't override enum flag names */
- if(flag & PROP_ENUM_FLAG) {
- name= NULL;
- }
- else {
- name= ""; /* name is shown above, empty name for button below */
- }
+
+ /* name is shown above, empty name for button below */
+ name= (flag & PROP_ENUM_FLAG || is_boolean)? NULL: "";
}
else {
col= layout;
name= NULL; /* no smart label alignment, show default name with button */
}
- uiItemFullR(col, ptr, prop, -1, 0, 0, name, ICON_NULL);
+ uiItemFullR(col, ptr, prop, -1, 0, 0, name, ICON_NONE);
tot++;
}
RNA_STRUCT_END;
@@ -187,7 +195,7 @@ int uiIconFromID(ID *id)
short idcode;
if(id==NULL)
- return ICON_NULL;
+ return ICON_NONE;
idcode= GS(id->name);
@@ -205,5 +213,5 @@ int uiIconFromID(ID *id)
will set the right type, also with subclassing */
RNA_id_pointer_create(id, &ptr);
- return (ptr.type)? RNA_struct_ui_icon(ptr.type) : ICON_NULL;
+ return (ptr.type)? RNA_struct_ui_icon(ptr.type) : ICON_NONE;
}
diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c
index aaa46a3105f..fc29a18154a 100644
--- a/source/blender/editors/interface/interface_widgets.c
+++ b/source/blender/editors/interface/interface_widgets.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/interface_widgets.c
+ * \ingroup edinterface
+ */
+
+
#include <limits.h>
#include <stdlib.h>
#include <string.h>
@@ -168,7 +173,7 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y
/* for each AA step */
for(j=0; j<8; j++) {
- glTranslatef(1.0*jit[j][0], 1.0*jit[j][1], 0.0f);
+ glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f);
glBegin(GL_POLYGON);
glVertex2f(x1, y1);
@@ -176,7 +181,7 @@ void ui_draw_anti_tria(float x1, float y1, float x2, float y2, float x3, float y
glVertex2f(x3, y3);
glEnd();
- glTranslatef(-1.0*jit[j][0], -1.0*jit[j][1], 0.0f);
+ glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f);
}
glDisable(GL_BLEND);
@@ -691,7 +696,7 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
/* for each AA step */
if(wtb->outline) {
for(j=0; j<8; j++) {
- glTranslatef(1.0*jit[j][0], 1.0*jit[j][1], 0.0f);
+ glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f);
/* outline */
glColor4ub(wcol->outline[0], wcol->outline[1], wcol->outline[2], 32);
@@ -715,7 +720,7 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
glEnd();
}
- glTranslatef(-1.0*jit[j][0], -1.0*jit[j][1], 0.0f);
+ glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f);
}
}
@@ -723,7 +728,7 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
if(wtb->tria1.tot || wtb->tria2.tot) {
/* for each AA step */
for(j=0; j<8; j++) {
- glTranslatef(1.0*jit[j][0], 1.0*jit[j][1], 0.0f);
+ glTranslatef(1.0f * jit[j][0], 1.0f * jit[j][1], 0.0f);
if(wtb->tria1.tot) {
glColor4ub(wcol->item[0], wcol->item[1], wcol->item[2], 32);
@@ -734,7 +739,7 @@ static void widgetbase_draw(uiWidgetBase *wtb, uiWidgetColors *wcol)
widget_trias_draw(&wtb->tria2);
}
- glTranslatef(-1.0*jit[j][0], -1.0*jit[j][1], 0.0f);
+ glTranslatef(-1.0f * jit[j][0], -1.0f * jit[j][1], 0.0f);
}
}
@@ -750,7 +755,7 @@ static void widget_draw_preview(BIFIconID icon, float UNUSED(alpha), rcti *rect)
{
int w, h, size;
- if(icon==ICON_NULL)
+ if(icon==ICON_NONE)
return;
w = rect->xmax - rect->xmin;
@@ -1549,6 +1554,24 @@ static void widget_state_label(uiWidgetType *wt, int state)
}
+/* labels use theme colors for text */
+static void widget_state_option_menu(uiWidgetType *wt, int state)
+{
+
+ /* call this for option button */
+ widget_state(wt, state);
+
+ /* if not selected we get theme from menu back */
+ if(state & UI_SELECT)
+ UI_GetThemeColor4ubv(TH_TEXT_HI, (unsigned char *)wt->wcol.text);
+ else {
+ bTheme *btheme= U.themes.first; /* XXX */
+
+ VECCOPY(wt->wcol.text, btheme->tui.wcol_menu_back.text);
+ }
+}
+
+
static void widget_state_nothing(uiWidgetType *wt, int UNUSED(state))
{
wt->wcol= *(wt->wcol_theme);
@@ -1695,7 +1718,7 @@ void ui_hsvcircle_vals_from_pos(float *valrad, float *valdist, rcti *rect, float
else
*valdist= 1.0f;
- *valrad= atan2(mx, my)/(2.0f*M_PI) + 0.5f;
+ *valrad= atan2f(mx, my)/(2.0f*(float)M_PI) + 0.5f;
}
static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
@@ -1710,7 +1733,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
if (but->rnaprop && RNA_property_subtype(but->rnaprop) == PROP_COLOR_GAMMA)
color_profile = BLI_PR_NONE;
- radstep= 2.0f*M_PI/(float)tot;
+ radstep= 2.0f*(float)M_PI/(float)tot;
centx= (float)(rect->xmin + rect->xmax)/2;
centy= (float)(rect->ymin + rect->ymax)/2;
@@ -1768,14 +1791,14 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, uiWidgetColors *wcol, rcti *rect)
glPopMatrix();
/* cursor */
- ang= 2.0f*M_PI*hsvo[0] + 0.5f*M_PI;
+ ang= 2.0f*(float)M_PI*hsvo[0] + 0.5f*(float)M_PI;
if(but->flag & UI_BUT_COLOR_CUBIC)
- radius= (1.0f - pow(1.0f - hsvo[1], 3.0f)) *radius;
+ radius= (1.0f - powf(1.0f - hsvo[1], 3.0f)) *radius;
else
radius= hsvo[1] * radius;
- ui_hsv_cursor(centx + cos(-ang)*radius, centy + sin(-ang)*radius);
+ ui_hsv_cursor(centx + cosf(-ang)*radius, centy + sinf(-ang)*radius);
}
@@ -1840,7 +1863,7 @@ void ui_draw_gradient(rcti *rect, float *hsv, int type, float alpha)
/* old below */
- for(dx=0.0; dx<1.0; dx+= 0.05) {
+ for(dx=0.0f; dx<1.0f; dx+= 0.05f) {
// previous color
VECCOPY(col0[0], col1[0]);
VECCOPY(col0[1], col1[1]);
@@ -1889,7 +1912,7 @@ void ui_draw_gradient(rcti *rect, float *hsv, int type, float alpha)
// rect
sx1= rect->xmin + dx*(rect->xmax-rect->xmin);
- sx2= rect->xmin + (dx+0.05)*(rect->xmax-rect->xmin);
+ sx2= rect->xmin + (dx+0.05f)*(rect->xmax-rect->xmin);
sy= rect->ymin;
dy= (rect->ymax-rect->ymin)/3.0;
@@ -1954,8 +1977,8 @@ static void ui_draw_but_HSVCUBE(uiBut *but, rcti *rect)
/* cursor */
x= rect->xmin + x*(rect->xmax-rect->xmin);
y= rect->ymin + y*(rect->ymax-rect->ymin);
- CLAMP(x, rect->xmin+3.0, rect->xmax-3.0);
- CLAMP(y, rect->ymin+3.0, rect->ymax-3.0);
+ CLAMP(x, rect->xmin+3.0f, rect->xmax-3.0f);
+ CLAMP(y, rect->ymin+3.0f, rect->ymax-3.0f);
ui_hsv_cursor(x, y);
@@ -2004,7 +2027,7 @@ static void ui_draw_but_HSV_v(uiBut *but, rcti *rect)
/* cursor */
x= rect->xmin + 0.5f * (rect->xmax-rect->xmin);
y= rect->ymin + v * (rect->ymax-rect->ymin);
- CLAMP(y, rect->ymin+3.0, rect->ymax-3.0);
+ CLAMP(y, rect->ymin+3.0f, rect->ymax-3.0f);
ui_hsv_cursor(x, y);
@@ -2034,7 +2057,7 @@ static void widget_numbut(uiWidgetColors *wcol, rcti *rect, int state, int round
{
uiWidgetBase wtb;
float rad= 0.5f*(rect->ymax - rect->ymin);
- float textofs = rad*0.75;
+ float textofs = rad*0.75f;
if(state & UI_SELECT)
SWAP(short, wcol->shadetop, wcol->shadedown);
@@ -2087,12 +2110,10 @@ void ui_draw_link_bezier(rcti *rect)
float coord_array[LINK_RESOL+1][2];
if(ui_link_bezier_points(rect, coord_array, LINK_RESOL)) {
- float dist;
- int i;
-
/* we can reuse the dist variable here to increment the GL curve eval amount*/
- dist = 1.0f/(float)LINK_RESOL;
-
+ // const float dist= 1.0f/(float)LINK_RESOL; // UNUSED
+ int i;
+
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
@@ -2205,8 +2226,8 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
if(horizontal) {
fac= (rect->xmax - rect->xmin)/(size);
- rect1.xmin= rect1.xmin + ceil(fac*(value - but->softmin));
- rect1.xmax= rect1.xmin + ceil(fac*(but->a1 - but->softmin));
+ rect1.xmin= rect1.xmin + ceilf(fac*((float)value - but->softmin));
+ rect1.xmax= rect1.xmin + ceilf(fac*(but->a1 - but->softmin));
/* ensure minimium size */
min= rect->ymax - rect->ymin;
@@ -2222,8 +2243,8 @@ static void widget_scroll(uiBut *but, uiWidgetColors *wcol, rcti *rect, int stat
}
else {
fac= (rect->ymax - rect->ymin)/(size);
- rect1.ymax= rect1.ymax - ceil(fac*(value - but->softmin));
- rect1.ymin= rect1.ymax - ceil(fac*(but->a1 - but->softmin));
+ rect1.ymax= rect1.ymax - ceilf(fac*((float)value - but->softmin));
+ rect1.ymin= rect1.ymax - ceilf(fac*(but->a1 - but->softmin));
/* ensure minimium size */
min= rect->xmax - rect->xmin;
@@ -2320,7 +2341,7 @@ static void widget_numslider(uiBut *but, uiWidgetColors *wcol, rcti *rect, int s
rect1= *rect;
value= ui_get_but_val(but);
- fac= (value-but->softmin)*(rect1.xmax - rect1.xmin - offs)/(but->softmax - but->softmin);
+ fac= ((float)value-but->softmin)*(rect1.xmax - rect1.xmin - offs)/(but->softmax - but->softmin);
/* left part of slider, always rounded */
rect1.xmax= rect1.xmin + ceil(offs+1.0f);
@@ -2935,6 +2956,11 @@ void ui_draw_but(const bContext *C, ARegion *ar, uiStyle *style, uiBut *but, rct
}
else
wt= widget_type(UI_WTYPE_TOGGLE);
+
+ /* option buttons have strings outside, on menus use different colors */
+ if(but->block->flag & UI_BLOCK_LOOP)
+ wt->state= widget_state_option_menu;
+
break;
case MENU:
diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c
index 890ce14f53b..351ce0e4ccb 100644
--- a/source/blender/editors/interface/resources.c
+++ b/source/blender/editors/interface/resources.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/interface/resources.c
+ * \ingroup edinterface
+ */
/*
* $Id$
*
@@ -262,6 +265,8 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
cp= ts->vertex_select; break;
case TH_VERTEX_SIZE:
cp= &ts->vertex_size; break;
+ case TH_OUTLINE_WIDTH:
+ cp= &ts->outline_width; break;
case TH_EDGE:
cp= ts->edge; break;
case TH_EDGE_SELECT:
@@ -415,8 +420,83 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo
return (unsigned char *)cp;
}
+
+#define SETCOL(col, r, g, b, a) col[0]=r; col[1]=g; col[2]= b; col[3]= a;
+#define SETCOLF(col, r, g, b, a) col[0]=r*255; col[1]=g*255; col[2]= b*255; col[3]= a*255;
#define SETCOLTEST(col, r, g, b, a) if(col[3]==0) {col[0]=r; col[1]=g; col[2]= b; col[3]= a;}
+/* use this call to init new bone color sets in Theme */
+static void ui_theme_init_boneColorSets(bTheme *btheme)
+{
+ int i;
+
+ /* define default color sets - currently we only define 15 of these, though that should be ample */
+ /* set 1 */
+ SETCOL(btheme->tarm[0].solid, 0x9a, 0x00, 0x00, 255);
+ SETCOL(btheme->tarm[0].select, 0xbd, 0x11, 0x11, 255);
+ SETCOL(btheme->tarm[0].active, 0xf7, 0x0a, 0x0a, 255);
+ /* set 2 */
+ SETCOL(btheme->tarm[1].solid, 0xf7, 0x40, 0x18, 255);
+ SETCOL(btheme->tarm[1].select, 0xf6, 0x69, 0x13, 255);
+ SETCOL(btheme->tarm[1].active, 0xfa, 0x99, 0x00, 255);
+ /* set 3 */
+ SETCOL(btheme->tarm[2].solid, 0x1e, 0x91, 0x09, 255);
+ SETCOL(btheme->tarm[2].select, 0x59, 0xb7, 0x0b, 255);
+ SETCOL(btheme->tarm[2].active, 0x83, 0xef, 0x1d, 255);
+ /* set 4 */
+ SETCOL(btheme->tarm[3].solid, 0x0a, 0x36, 0x94, 255);
+ SETCOL(btheme->tarm[3].select, 0x36, 0x67, 0xdf, 255);
+ SETCOL(btheme->tarm[3].active, 0x5e, 0xc1, 0xef, 255);
+ /* set 5 */
+ SETCOL(btheme->tarm[4].solid, 0xa9, 0x29, 0x4e, 255);
+ SETCOL(btheme->tarm[4].select, 0xc1, 0x41, 0x6a, 255);
+ SETCOL(btheme->tarm[4].active, 0xf0, 0x5d, 0x91, 255);
+ /* set 6 */
+ SETCOL(btheme->tarm[5].solid, 0x43, 0x0c, 0x78, 255);
+ SETCOL(btheme->tarm[5].select, 0x54, 0x3a, 0xa3, 255);
+ SETCOL(btheme->tarm[5].active, 0x87, 0x64, 0xd5, 255);
+ /* set 7 */
+ SETCOL(btheme->tarm[6].solid, 0x24, 0x78, 0x5a, 255);
+ SETCOL(btheme->tarm[6].select, 0x3c, 0x95, 0x79, 255);
+ SETCOL(btheme->tarm[6].active, 0x6f, 0xb6, 0xab, 255);
+ /* set 8 */
+ SETCOL(btheme->tarm[7].solid, 0x4b, 0x70, 0x7c, 255);
+ SETCOL(btheme->tarm[7].select, 0x6a, 0x86, 0x91, 255);
+ SETCOL(btheme->tarm[7].active, 0x9b, 0xc2, 0xcd, 255);
+ /* set 9 */
+ SETCOL(btheme->tarm[8].solid, 0xf4, 0xc9, 0x0c, 255);
+ SETCOL(btheme->tarm[8].select, 0xee, 0xc2, 0x36, 255);
+ SETCOL(btheme->tarm[8].active, 0xf3, 0xff, 0x00, 255);
+ /* set 10 */
+ SETCOL(btheme->tarm[9].solid, 0x1e, 0x20, 0x24, 255);
+ SETCOL(btheme->tarm[9].select, 0x48, 0x4c, 0x56, 255);
+ SETCOL(btheme->tarm[9].active, 0xff, 0xff, 0xff, 255);
+ /* set 11 */
+ SETCOL(btheme->tarm[10].solid, 0x6f, 0x2f, 0x6a, 255);
+ SETCOL(btheme->tarm[10].select, 0x98, 0x45, 0xbe, 255);
+ SETCOL(btheme->tarm[10].active, 0xd3, 0x30, 0xd6, 255);
+ /* set 12 */
+ SETCOL(btheme->tarm[11].solid, 0x6c, 0x8e, 0x22, 255);
+ SETCOL(btheme->tarm[11].select, 0x7f, 0xb0, 0x22, 255);
+ SETCOL(btheme->tarm[11].active, 0xbb, 0xef, 0x5b, 255);
+ /* set 13 */
+ SETCOL(btheme->tarm[12].solid, 0x8d, 0x8d, 0x8d, 255);
+ SETCOL(btheme->tarm[12].select, 0xb0, 0xb0, 0xb0, 255);
+ SETCOL(btheme->tarm[12].active, 0xde, 0xde, 0xde, 255);
+ /* set 14 */
+ SETCOL(btheme->tarm[13].solid, 0x83, 0x43, 0x26, 255);
+ SETCOL(btheme->tarm[13].select, 0x8b, 0x58, 0x11, 255);
+ SETCOL(btheme->tarm[13].active, 0xbd, 0x6a, 0x11, 255);
+ /* set 15 */
+ SETCOL(btheme->tarm[14].solid, 0x08, 0x31, 0x0e, 255);
+ SETCOL(btheme->tarm[14].select, 0x1c, 0x43, 0x0b, 255);
+ SETCOL(btheme->tarm[14].active, 0x34, 0x62, 0x2b, 255);
+
+ /* reset flags too */
+ for (i = 0; i < 20; i++)
+ btheme->tarm[i].flag = 0;
+}
+
/* use this call to init new variables in themespace, if they're same for all */
static void ui_theme_init_new_do(ThemeSpace *ts)
{
@@ -462,8 +542,6 @@ static void ui_theme_init_new(bTheme *btheme)
}
-#define SETCOL(col, r, g, b, a) col[0]=r; col[1]=g; col[2]= b; col[3]= a;
-#define SETCOLF(col, r, g, b, a) col[0]=r*255; col[1]=g*255; col[2]= b*255; col[3]= a*255;
/* initialize default theme
Note: when you add new colors, created & saved themes need initialized
@@ -488,7 +566,11 @@ void ui_theme_init_default(void)
/* UI buttons */
ui_widget_color_init(&btheme->tui);
-
+ btheme->tui.iconfile[0]= 0;
+
+ /* Bone Color Sets */
+ ui_theme_init_boneColorSets(btheme);
+
/* common (new) variables */
ui_theme_init_new(btheme);
@@ -515,6 +597,7 @@ void ui_theme_init_default(void)
SETCOL(btheme->tv3d.vertex, 0, 0, 0, 255);
SETCOL(btheme->tv3d.vertex_select, 255, 133, 0, 255);
btheme->tv3d.vertex_size= 3;
+ btheme->tv3d.outline_width= 1;
SETCOL(btheme->tv3d.edge, 0x0, 0x0, 0x0, 255);
SETCOL(btheme->tv3d.edge_select, 255, 160, 0, 255);
SETCOL(btheme->tv3d.edge_seam, 219, 37, 18, 255);
@@ -524,6 +607,16 @@ void ui_theme_init_default(void)
SETCOL(btheme->tv3d.normal, 0x22, 0xDD, 0xDD, 255);
SETCOL(btheme->tv3d.vertex_normal, 0x23, 0x61, 0xDD, 255);
SETCOL(btheme->tv3d.face_dot, 255, 133, 0, 255);
+ SETCOL(btheme->tv3d.editmesh_active, 255, 255, 255, 128);
+ SETCOLF(btheme->tv3d.edge_crease, 0.8, 0, 0.6, 1.0);
+ SETCOL(btheme->tv3d.edge_sharp, 255, 32, 32, 255);
+ SETCOL(btheme->tv3d.header_text, 0, 0, 0, 255);
+ SETCOL(btheme->tv3d.header_text_hi, 255, 255, 255, 255);
+ SETCOL(btheme->tv3d.button_text, 0, 0, 0, 255);
+ SETCOL(btheme->tv3d.button_text_hi, 255, 255, 255, 255);
+ SETCOL(btheme->tv3d.button_title, 0, 0, 0, 255);
+ SETCOL(btheme->tv3d.title, 0, 0, 0, 255);
+
btheme->tv3d.facedot_size= 4;
SETCOL(btheme->tv3d.extra_edge_len, 32, 0, 0, 255);
@@ -786,10 +879,10 @@ void UI_ThemeColorBlend(int colorid1, int colorid2, float fac)
cp1= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
cp2= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);
- if(fac<0.0) fac=0.0; else if(fac>1.0) fac= 1.0;
- r= floor((1.0-fac)*cp1[0] + fac*cp2[0]);
- g= floor((1.0-fac)*cp1[1] + fac*cp2[1]);
- b= floor((1.0-fac)*cp1[2] + fac*cp2[2]);
+ CLAMP(fac, 0.0f, 1.0f);
+ r= floorf((1.0f-fac)*cp1[0] + fac*cp2[0]);
+ g= floorf((1.0f-fac)*cp1[1] + fac*cp2[1]);
+ b= floorf((1.0f-fac)*cp1[2] + fac*cp2[2]);
glColor3ub(r, g, b);
}
@@ -803,10 +896,10 @@ void UI_ThemeColorBlendShade(int colorid1, int colorid2, float fac, int offset)
cp1= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
cp2= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);
- if(fac<0.0) fac=0.0; else if(fac>1.0) fac= 1.0;
- r= offset+floor((1.0-fac)*cp1[0] + fac*cp2[0]);
- g= offset+floor((1.0-fac)*cp1[1] + fac*cp2[1]);
- b= offset+floor((1.0-fac)*cp1[2] + fac*cp2[2]);
+ CLAMP(fac, 0.0f, 1.0f);
+ r= offset+floorf((1.0f-fac)*cp1[0] + fac*cp2[0]);
+ g= offset+floorf((1.0f-fac)*cp1[1] + fac*cp2[1]);
+ b= offset+floorf((1.0f-fac)*cp1[2] + fac*cp2[2]);
CLAMP(r, 0, 255);
CLAMP(g, 0, 255);
@@ -824,11 +917,11 @@ void UI_ThemeColorBlendShadeAlpha(int colorid1, int colorid2, float fac, int off
cp1= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid1);
cp2= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid2);
- if(fac<0.0) fac=0.0; else if(fac>1.0) fac= 1.0;
- r= offset+floor((1.0-fac)*cp1[0] + fac*cp2[0]);
- g= offset+floor((1.0-fac)*cp1[1] + fac*cp2[1]);
- b= offset+floor((1.0-fac)*cp1[2] + fac*cp2[2]);
- a= alphaoffset+floor((1.0-fac)*cp1[3] + fac*cp2[3]);
+ CLAMP(fac, 0.0f, 1.0f);
+ r= offset+floorf((1.0f-fac)*cp1[0] + fac*cp2[0]);
+ g= offset+floorf((1.0f-fac)*cp1[1] + fac*cp2[1]);
+ b= offset+floorf((1.0f-fac)*cp1[2] + fac*cp2[2]);
+ a= alphaoffset + floorf((1.0f-fac)*cp1[3] + fac*cp2[3]);
CLAMP(r, 0, 255);
CLAMP(g, 0, 255);
@@ -866,9 +959,9 @@ void UI_GetThemeColor3fv(int colorid, float *col)
const unsigned char *cp;
cp= UI_ThemeGetColorPtr(theme_active, theme_spacetype, colorid);
- col[0]= ((float)cp[0])/255.0;
- col[1]= ((float)cp[1])/255.0;
- col[2]= ((float)cp[2])/255.0;
+ col[0]= ((float)cp[0])/255.0f;
+ col[1]= ((float)cp[1])/255.0f;
+ col[2]= ((float)cp[2])/255.0f;
}
// get the color, range 0.0-1.0, complete with shading offset
@@ -886,9 +979,9 @@ void UI_GetThemeColorShade3fv(int colorid, int offset, float *col)
b= offset + (int) cp[2];
CLAMP(b, 0, 255);
- col[0]= ((float)r)/255.0;
- col[1]= ((float)g)/255.0;
- col[2]= ((float)b)/255.0;
+ col[0]= ((float)r)/255.0f;
+ col[1]= ((float)g)/255.0f;
+ col[2]= ((float)b)/255.0f;
}
// get the color, in char pointer
@@ -929,11 +1022,10 @@ void UI_GetThemeColorType4ubv(int colorid, int spacetype, char col[4])
void UI_ColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], float fac, int offset)
{
int r, g, b;
-
- if(fac<0.0) fac=0.0; else if(fac>1.0) fac= 1.0;
- r= offset+floor((1.0-fac)*cp1[0] + fac*cp2[0]);
- g= offset+floor((1.0-fac)*cp1[1] + fac*cp2[1]);
- b= offset+floor((1.0-fac)*cp1[2] + fac*cp2[2]);
+ CLAMP(fac, 0.0f, 1.0f);
+ r= offset+floorf((1.0f-fac)*cp1[0] + fac*cp2[0]);
+ g= offset+floorf((1.0f-fac)*cp1[1] + fac*cp2[1]);
+ b= offset+floorf((1.0f-fac)*cp1[2] + fac*cp2[2]);
r= r<0?0:(r>255?255:r);
g= g<0?0:(g>255?255:g);
@@ -946,16 +1038,16 @@ void UI_ColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char c
void UI_GetColorPtrBlendShade3ubv(const unsigned char cp1[3], const unsigned char cp2[3], unsigned char col[3], float fac, int offset)
{
int r, g, b;
-
- if(fac<0.0) fac=0.0; else if(fac>1.0) fac= 1.0;
- r= offset+floor((1.0-fac)*cp1[0] + fac*cp2[0]);
- g= offset+floor((1.0-fac)*cp1[1] + fac*cp2[1]);
- b= offset+floor((1.0-fac)*cp1[2] + fac*cp2[2]);
-
- r= r<0?0:(r>255?255:r);
- g= g<0?0:(g>255?255:g);
- b= b<0?0:(b>255?255:b);
-
+
+ CLAMP(fac, 0.0f, 1.0f);
+ r= offset+floor((1.0f-fac)*cp1[0] + fac*cp2[0]);
+ g= offset+floor((1.0f-fac)*cp1[1] + fac*cp2[1]);
+ b= offset+floor((1.0f-fac)*cp1[2] + fac*cp2[2]);
+
+ CLAMP(r, 0, 255);
+ CLAMP(g, 0, 255);
+ CLAMP(b, 0, 255);
+
col[0] = r;
col[1] = g;
col[2] = b;
@@ -1219,69 +1311,8 @@ void init_userdef_do_versions(void)
SETCOL(btheme->tact.group_active, 0x7d, 0xe9, 0x60, 255);
/* bone custom-color sets */
- // FIXME: this check for initialised colors is bad
- if (btheme->tarm[0].solid[3] == 0) {
- /* set 1 */
- SETCOL(btheme->tarm[0].solid, 0x9a, 0x00, 0x00, 255);
- SETCOL(btheme->tarm[0].select, 0xbd, 0x11, 0x11, 255);
- SETCOL(btheme->tarm[0].active, 0xf7, 0x0a, 0x0a, 255);
- /* set 2 */
- SETCOL(btheme->tarm[1].solid, 0xf7, 0x40, 0x18, 255);
- SETCOL(btheme->tarm[1].select, 0xf6, 0x69, 0x13, 255);
- SETCOL(btheme->tarm[1].active, 0xfa, 0x99, 0x00, 255);
- /* set 3 */
- SETCOL(btheme->tarm[2].solid, 0x1e, 0x91, 0x09, 255);
- SETCOL(btheme->tarm[2].select, 0x59, 0xb7, 0x0b, 255);
- SETCOL(btheme->tarm[2].active, 0x83, 0xef, 0x1d, 255);
- /* set 4 */
- SETCOL(btheme->tarm[3].solid, 0x0a, 0x36, 0x94, 255);
- SETCOL(btheme->tarm[3].select, 0x36, 0x67, 0xdf, 255);
- SETCOL(btheme->tarm[3].active, 0x5e, 0xc1, 0xef, 255);
- /* set 5 */
- SETCOL(btheme->tarm[4].solid, 0xa9, 0x29, 0x4e, 255);
- SETCOL(btheme->tarm[4].select, 0xc1, 0x41, 0x6a, 255);
- SETCOL(btheme->tarm[4].active, 0xf0, 0x5d, 0x91, 255);
- /* set 6 */
- SETCOL(btheme->tarm[5].solid, 0x43, 0x0c, 0x78, 255);
- SETCOL(btheme->tarm[5].select, 0x54, 0x3a, 0xa3, 255);
- SETCOL(btheme->tarm[5].active, 0x87, 0x64, 0xd5, 255);
- /* set 7 */
- SETCOL(btheme->tarm[6].solid, 0x24, 0x78, 0x5a, 255);
- SETCOL(btheme->tarm[6].select, 0x3c, 0x95, 0x79, 255);
- SETCOL(btheme->tarm[6].active, 0x6f, 0xb6, 0xab, 255);
- /* set 8 */
- SETCOL(btheme->tarm[7].solid, 0x4b, 0x70, 0x7c, 255);
- SETCOL(btheme->tarm[7].select, 0x6a, 0x86, 0x91, 255);
- SETCOL(btheme->tarm[7].active, 0x9b, 0xc2, 0xcd, 255);
- /* set 9 */
- SETCOL(btheme->tarm[8].solid, 0xf4, 0xc9, 0x0c, 255);
- SETCOL(btheme->tarm[8].select, 0xee, 0xc2, 0x36, 255);
- SETCOL(btheme->tarm[8].active, 0xf3, 0xff, 0x00, 255);
- /* set 10 */
- SETCOL(btheme->tarm[9].solid, 0x1e, 0x20, 0x24, 255);
- SETCOL(btheme->tarm[9].select, 0x48, 0x4c, 0x56, 255);
- SETCOL(btheme->tarm[9].active, 0xff, 0xff, 0xff, 255);
- /* set 11 */
- SETCOL(btheme->tarm[10].solid, 0x6f, 0x2f, 0x6a, 255);
- SETCOL(btheme->tarm[10].select, 0x98, 0x45, 0xbe, 255);
- SETCOL(btheme->tarm[10].active, 0xd3, 0x30, 0xd6, 255);
- /* set 12 */
- SETCOL(btheme->tarm[11].solid, 0x6c, 0x8e, 0x22, 255);
- SETCOL(btheme->tarm[11].select, 0x7f, 0xb0, 0x22, 255);
- SETCOL(btheme->tarm[11].active, 0xbb, 0xef, 0x5b, 255);
- /* set 13 */
- SETCOL(btheme->tarm[12].solid, 0x8d, 0x8d, 0x8d, 255);
- SETCOL(btheme->tarm[12].select, 0xb0, 0xb0, 0xb0, 255);
- SETCOL(btheme->tarm[12].active, 0xde, 0xde, 0xde, 255);
- /* set 14 */
- SETCOL(btheme->tarm[13].solid, 0x83, 0x43, 0x26, 255);
- SETCOL(btheme->tarm[13].select, 0x8b, 0x58, 0x11, 255);
- SETCOL(btheme->tarm[13].active, 0xbd, 0x6a, 0x11, 255);
- /* set 15 */
- SETCOL(btheme->tarm[14].solid, 0x08, 0x31, 0x0e, 255);
- SETCOL(btheme->tarm[14].select, 0x1c, 0x43, 0x0b, 255);
- SETCOL(btheme->tarm[14].active, 0x34, 0x62, 0x2b, 255);
- }
+ if (btheme->tarm[0].solid[3] == 0)
+ ui_theme_init_boneColorSets(btheme);
}
}
if ((bmain->versionfile < 245) || (bmain->versionfile == 245 && bmain->subversionfile < 16)) {
@@ -1517,6 +1548,13 @@ void init_userdef_do_versions(void)
}
}
+ if (bmain->versionfile < 256 || (bmain->versionfile == 256 && bmain->subversionfile < 4)) {
+ bTheme *btheme;
+ for(btheme= U.themes.first; btheme; btheme= btheme->next) {
+ if((btheme->tv3d.outline_width) == 0) btheme->tv3d.outline_width= 1;
+ }
+ }
+
if (bmain->versionfile < 257) {
/* clear "AUTOKEY_FLAG_ONLYKEYINGSET" flag from userprefs, so that it doesn't linger around from old configs like a ghost */
U.autokey_flag &= ~AUTOKEY_FLAG_ONLYKEYINGSET;
diff --git a/source/blender/editors/interface/view2d.c b/source/blender/editors/interface/view2d.c
index e4c328758c0..32301dd6423 100644
--- a/source/blender/editors/interface/view2d.c
+++ b/source/blender/editors/interface/view2d.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/view2d.c
+ * \ingroup edinterface
+ */
+
+
#include <float.h>
#include <limits.h>
#include <math.h>
@@ -991,17 +996,17 @@ void UI_view2d_view_ortho(View2D *v2d)
/* XXX ton: this flag set by outliner, for icons */
if(v2d->flag & V2D_PIXELOFS_X) {
- curmasked.xmin= floor(curmasked.xmin) - 0.001f;
- curmasked.xmax= floor(curmasked.xmax) - 0.001f;
+ curmasked.xmin= floorf(curmasked.xmin) - 0.001f;
+ curmasked.xmax= floorf(curmasked.xmax) - 0.001f;
}
if(v2d->flag & V2D_PIXELOFS_Y) {
- curmasked.ymin= floor(curmasked.ymin) - 0.001f;
- curmasked.ymax= floor(curmasked.ymax) - 0.001f;
+ curmasked.ymin= floorf(curmasked.ymin) - 0.001f;
+ curmasked.ymax= floorf(curmasked.ymax) - 0.001f;
}
/* set matrix on all appropriate axes */
wmOrtho2(curmasked.xmin-xofs, curmasked.xmax-xofs, curmasked.ymin-yofs, curmasked.ymax-yofs);
-
+
/* XXX is this necessary? */
glLoadIdentity();
}
@@ -1810,8 +1815,8 @@ void UI_view2d_listview_view_to_cell(View2D *v2d, short columnwidth, short rowhe
float viewx, float viewy, int *column, int *row)
{
/* adjust view coordinates to be all positive ints, corrected for the start offset */
- const int x= (int)(floor(fabs(viewx) + 0.5f) - startx);
- const int y= (int)(floor(fabs(viewy) + 0.5f) - starty);
+ const int x= (int)(floorf(fabsf(viewx) + 0.5f) - startx);
+ const int y= (int)(floorf(fabsf(viewy) + 0.5f) - starty);
/* sizes must not be negative */
if ( (v2d == NULL) || ((columnwidth <= 0) && (rowheight <= 0)) ) {
diff --git a/source/blender/editors/interface/view2d_ops.c b/source/blender/editors/interface/view2d_ops.c
index 66a58e71ed6..123f9e2044f 100644
--- a/source/blender/editors/interface/view2d_ops.c
+++ b/source/blender/editors/interface/view2d_ops.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/interface/view2d_ops.c
+ * \ingroup edinterface
+ */
+
+
#include <math.h>
#include "MEM_guardedalloc.h"
@@ -602,7 +607,7 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op)
else {
if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) {
float mval_fac = (vzd->mx_2d - v2d->cur.xmin) / (v2d->cur.xmax-v2d->cur.xmin);
- float mval_faci = 1.0 - mval_fac;
+ float mval_faci = 1.0f - mval_fac;
float ofs= (mval_fac * dx) - (mval_faci * dx);
v2d->cur.xmin += ofs + dx;
@@ -627,7 +632,7 @@ static void view_zoomstep_apply(bContext *C, wmOperator *op)
else {
if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) {
float mval_fac = (vzd->my_2d - v2d->cur.ymin) / (v2d->cur.ymax-v2d->cur.ymin);
- float mval_faci = 1.0 - mval_fac;
+ float mval_faci = 1.0f - mval_fac;
float ofs= (mval_fac * dy) - (mval_faci * dy);
v2d->cur.ymin += ofs + dy;
@@ -812,7 +817,7 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op)
else {
if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) {
float mval_fac = (vzd->mx_2d - v2d->cur.xmin) / (v2d->cur.xmax-v2d->cur.xmin);
- float mval_faci = 1.0 - mval_fac;
+ float mval_faci = 1.0f - mval_fac;
float ofs= (mval_fac * dx) - (mval_faci * dx);
v2d->cur.xmin += ofs + dx;
@@ -831,7 +836,7 @@ static void view_zoomdrag_apply(bContext *C, wmOperator *op)
else {
if (U.uiflag & USER_ZOOM_TO_MOUSEPOS) {
float mval_fac = (vzd->my_2d - v2d->cur.ymin) / (v2d->cur.ymax-v2d->cur.ymin);
- float mval_faci = 1.0 - mval_fac;
+ float mval_faci = 1.0f - mval_fac;
float ofs= (mval_fac * dy) - (mval_faci * dy);
v2d->cur.ymin += ofs + dy;
@@ -1443,9 +1448,9 @@ static int scroller_activate_modal(bContext *C, wmOperator *op, wmEvent *event)
/* single-click was in empty space outside bubble, so scroll by 1 'page' */
if (ELEM(vsm->zone, SCROLLHANDLE_MIN_OUTSIDE, SCROLLHANDLE_MAX_OUTSIDE)) {
if (vsm->zone == SCROLLHANDLE_MIN_OUTSIDE)
- vsm->delta = -vsm->scrollbarwidth * 0.8;
+ vsm->delta = -vsm->scrollbarwidth * 0.8f;
else if (vsm->zone == SCROLLHANDLE_MAX_OUTSIDE)
- vsm->delta = vsm->scrollbarwidth * 0.8;
+ vsm->delta = vsm->scrollbarwidth * 0.8f;
scroller_activate_apply(C, op);
scroller_activate_exit(C, op);
diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt
index 2295cca29a9..1581c91ab04 100644
--- a/source/blender/editors/mesh/CMakeLists.txt
+++ b/source/blender/editors/mesh/CMakeLists.txt
@@ -32,6 +32,7 @@ set(INC
../../windowmanager
../../render/extern/include
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index c692466a1ef..ed09eb9c4c4 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/mesh/editface.c
+ * \ingroup edmesh
+ */
+
+
#include <math.h>
#include <string.h>
@@ -169,7 +174,7 @@ void paintface_hide(Object *ob, const int unselected)
int a;
me= get_mesh(ob);
- if(me==0 || me->totpoly==0) return;
+ if(me==NULL || me->totpoly==0) return;
mface= me->mpoly;
a= me->totpoly;
@@ -198,7 +203,7 @@ void paintface_reveal(Object *ob)
int a;
me= get_mesh(ob);
- if(me==0 || me->totpoly==0) return;
+ if(me==NULL || me->totpoly==0) return;
mface= me->mpoly;
a= me->totpoly;
@@ -329,7 +334,7 @@ void paintface_select_linked(bContext *UNUSED(C), Object *ob, short UNUSED(mval[
unsigned int index=0;
me = get_mesh(ob);
- if(me==0 || me->totpoly==0) return;
+ if(me==NULL || me->totpoly==0) return;
if (mode==0 || mode==1) {
// XXX - Causes glitches, not sure why
@@ -352,7 +357,7 @@ void paintface_deselect_all_visible(Object *ob, int action, short flush_flags)
int a;
me= get_mesh(ob);
- if(me==0) return;
+ if(me==NULL) return;
if(action == SEL_INVERT) {
mface= me->mpoly;
@@ -457,7 +462,7 @@ static float edgetag_cut_cost(BMEditMesh *em, int e1, int e2, int vert)
sub_v3_v3v3(d1, v->co, v1->co);
sub_v3_v3v3(d2, v2->co, v->co);
- cost = cost + 0.5f*cost*(2.0f - fabs(d1[0]*d2[0] + d1[1]*d2[1] + d1[2]*d2[2]));
+ cost = cost + 0.5f*cost*(2.0f - fabsf(d1[0]*d2[0] + d1[1]*d2[1] + d1[2]*d2[2]));
return cost;
}
diff --git a/source/blender/editors/mesh/knifetool.c b/source/blender/editors/mesh/knifetool.c
index abb22f56cbb..5c36d548bff 100755
--- a/source/blender/editors/mesh/knifetool.c
+++ b/source/blender/editors/mesh/knifetool.c
@@ -406,6 +406,7 @@ static void knife_edge_append_face(knifetool_opdata *kcd, KnifeEdge *kfe, BMFace
BLI_addtail(&kfe->faces, ref);
}
+#if 0
static void knife_copy_edge_facelist(knifetool_opdata *kcd, KnifeEdge *dest, KnifeEdge *source)
{
Ref *ref, *ref2;
@@ -424,6 +425,7 @@ static void knife_copy_edge_facelist(knifetool_opdata *kcd, KnifeEdge *dest, Kni
BLI_addtail(&dest->faces, ref);
}
}
+#endif
static void knife_add_single_cut(knifetool_opdata *kcd)
{
diff --git a/source/blender/editors/mesh/loopcut.c b/source/blender/editors/mesh/loopcut.c
index 3304fdd87a0..bc6480e26d0 100644
--- a/source/blender/editors/mesh/loopcut.c
+++ b/source/blender/editors/mesh/loopcut.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/mesh/loopcut.c
+ * \ingroup edmesh
+ */
+
+
#include <float.h>
#define _USE_MATH_DEFINES
#include <math.h>
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index 0ae3076170c..640fcd55d3a 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/mesh/mesh_data.c
+ * \ingroup edmesh
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
@@ -584,7 +589,7 @@ void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges)
if(calc_edges || (mesh->totface && mesh->totedge == 0))
BKE_mesh_calc_edges(mesh, calc_edges);
- mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mface, mesh->totface, NULL);
+ mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL);
DAG_id_tag_update(&mesh->id, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, mesh);
@@ -620,15 +625,15 @@ static void mesh_add_verts(Mesh *mesh, int len)
mesh->totvert= totvert;
}
-void ED_mesh_transform(Mesh *me, float *mat)
+void ED_mesh_transform(Mesh *mesh, float *mat)
{
int i;
- MVert *mvert= me->mvert;
+ MVert *mvert= mesh->mvert;
- for(i= 0; i < me->totvert; i++, mvert++)
+ for(i= 0; i < mesh->totvert; i++, mvert++)
mul_m4_v3((float (*)[4])mat, mvert->co);
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+ mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL);
}
static void mesh_add_edges(Mesh *mesh, int len)
@@ -737,8 +742,8 @@ void ED_mesh_vertices_add(Mesh *mesh, ReportList *reports, int count)
mesh_add_verts(mesh, count);
}
-void ED_mesh_calc_normals(Mesh *me)
+void ED_mesh_calc_normals(Mesh *mesh)
{
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+ mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL);
}
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index 14ddd235a4b..3af641c222d 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/mesh/mesh_intern.h
+ * \ingroup edmesh
+ */
+
+
/* Internal for editmesh_xxxx.c functions */
#ifndef MESH_INTERN_H
@@ -98,7 +103,7 @@ int edgetag_shortest_path(Scene *scene, BMEditMesh *em, BMEdge *source, BMEdge *
extern void free_editvert(EditMesh *em, EditVert *eve);
extern void free_editedge(EditMesh *em, EditEdge *eed);
-extern void free_editface(EditMesh *em, EditFace *efa);;
+extern void free_editface(EditMesh *em, EditFace *efa);
/*frees dst mesh, then copies the contents of
*src (the struct) to dst. */
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
index d0ee4f78fd8..bb6169eab72 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/mesh/mesh_ops.c
+ * \ingroup edmesh
+ */
+
+
#include <stdlib.h>
#include <math.h>
@@ -280,7 +285,7 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "MESH_OT_fill", FKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_beautify_fill", FKEY, KM_PRESS, KM_SHIFT|KM_ALT, 0);
- //WM_keymap_add_item(keymap, "MESH_OT_sort_faces", FKEY, KM_PRESS, KM_ALT|KM_CTRL, 0);
+
WM_keymap_add_item(keymap, "MESH_OT_quads_convert_to_tris", TKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "MESH_OT_tris_convert_to_quads", JKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MESH_OT_edge_flip", FKEY, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index d84507267a8..9d83e956c0c 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/mesh/meshtools.c
+ * \ingroup edmesh
+ */
+
+
/*
meshtools.c: no editmode (violated already :), tools operating on meshes
*/
diff --git a/source/blender/editors/metaball/mball_edit.c b/source/blender/editors/metaball/mball_edit.c
index 48750e9c6b8..c766f05cac9 100644
--- a/source/blender/editors/metaball/mball_edit.c
+++ b/source/blender/editors/metaball/mball_edit.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/metaball/mball_edit.c
+ * \ingroup edmeta
+ */
+
+
#include <math.h>
#include <string.h>
@@ -43,6 +48,7 @@
#include "RNA_define.h"
#include "RNA_access.h"
+#include "RNA_enum_types.h"
#include "BKE_depsgraph.h"
#include "BKE_context.h"
@@ -225,7 +231,7 @@ static int select_random_metaelems_exec(bContext *C, wmOperator *op)
MetaElem *ml;
float percent= RNA_float_get(op->ptr, "percent");
- if(percent == 0.0)
+ if(percent == 0.0f)
return OPERATOR_CANCELLED;
ml= mb->editelems->first;
@@ -297,7 +303,7 @@ static int duplicate_metaelems_invoke(bContext *C, wmOperator *op, wmEvent *UNUS
int retv= duplicate_metaelems_exec(C, op);
if (retv == OPERATOR_FINISHED) {
- RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
+ RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION);
WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
}
@@ -321,7 +327,7 @@ void MBALL_OT_duplicate_metaelems(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+ RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
}
/***************************** Delete operator *****************************/
diff --git a/source/blender/editors/metaball/mball_intern.h b/source/blender/editors/metaball/mball_intern.h
index 36c263bde47..42cc609bec3 100644
--- a/source/blender/editors/metaball/mball_intern.h
+++ b/source/blender/editors/metaball/mball_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/metaball/mball_intern.h
+ * \ingroup edmeta
+ */
+
+
#ifndef ED_MBALL_INTERN_H
#define ED_MBALL_INTERN_H
diff --git a/source/blender/editors/metaball/mball_ops.c b/source/blender/editors/metaball/mball_ops.c
index 99d313e2a30..1b50cc6523a 100644
--- a/source/blender/editors/metaball/mball_ops.c
+++ b/source/blender/editors/metaball/mball_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/metaball/mball_ops.c
+ * \ingroup edmeta
+ */
+
+
#include "WM_api.h"
#include "WM_types.h"
@@ -60,7 +65,7 @@ void ED_keymap_metaball(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "MBALL_OT_reveal_metaelems", HKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, 0, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "MBALL_OT_hide_metaelems", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "MBALL_OT_delete_metaelems", DELKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index c997baa3a30..0138c44593b 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_add.c
+ * \ingroup edobj
+ */
+
+
#include <stdlib.h>
#include <string.h>
@@ -167,6 +172,8 @@ float ED_object_new_primitive_matrix(bContext *C, Object *obedit, float *loc, fl
void ED_object_add_generic_props(wmOperatorType *ot, int do_editmode)
{
PropertyRNA *prop;
+
+ /* note: this property gets hidden for add-camera operator */
RNA_def_boolean(ot->srna, "view_align", 0, "Align to View", "Align the new object to the view.");
if(do_editmode) {
@@ -412,7 +419,7 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type)
/* for object add operator */
static int effector_add_exec(bContext *C, wmOperator *op)
{
- if(effector_add_type(C, op, RNA_int_get(op->ptr, "type")) == NULL)
+ if(effector_add_type(C, op, RNA_enum_get(op->ptr, "type")) == NULL)
return OPERATOR_CANCELLED;
return OPERATOR_FINISHED;
@@ -473,6 +480,8 @@ static int object_camera_add_exec(bContext *C, wmOperator *op)
void OBJECT_OT_camera_add(wmOperatorType *ot)
{
+ PropertyRNA *prop;
+
/* identifiers */
ot->name= "Add Camera";
ot->description = "Add a camera object to the scene";
@@ -486,6 +495,11 @@ void OBJECT_OT_camera_add(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
ED_object_add_generic_props(ot, TRUE);
+
+ /* hide this for cameras, default */
+ prop= RNA_struct_type_find_property(ot->srna, "view_align");
+ RNA_def_property_flag(prop, PROP_HIDDEN);
+
}
@@ -533,7 +547,7 @@ static int object_metaball_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUS
object_add_generic_invoke_options(C, op);
- pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NONE);
layout= uiPupMenuLayout(pup);
if(!obedit || obedit->type == OB_MBALL)
uiItemsEnumO(layout, op->type->idname, "type");
@@ -838,13 +852,6 @@ void OBJECT_OT_delete(wmOperatorType *ot)
/**************************** Copy Utilities ******************************/
-static void copy_object__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob),
- ID **idpoin)
-{
- /* this is copied from ID_NEW; it might be better to have a macro */
- if(*idpoin && (*idpoin)->newid) *idpoin = (*idpoin)->newid;
-}
-
/* after copying objects, copied data should get new pointers */
static void copy_object_set_idnew(bContext *C, int dupflag)
{
@@ -855,17 +862,7 @@ static void copy_object_set_idnew(bContext *C, int dupflag)
/* XXX check object pointers */
CTX_DATA_BEGIN(C, Object*, ob, selected_editable_objects) {
- relink_constraints(&ob->constraints);
- if (ob->pose){
- bPoseChannel *chan;
- for (chan = ob->pose->chanbase.first; chan; chan=chan->next){
- relink_constraints(&chan->constraints);
- }
- }
- modifiers_foreachIDLink(ob, copy_object__forwardModifierLinks, NULL);
- ID_NEW(ob->parent);
- ID_NEW(ob->proxy);
- ID_NEW(ob->proxy_group);
+ object_relink(ob);
}
CTX_DATA_END;
@@ -1042,7 +1039,7 @@ static EnumPropertyItem convert_target_items[]= {
static void curvetomesh(Scene *scene, Object *ob)
{
- if(ob->disp.first==0)
+ if(ob->disp.first == NULL)
makeDispListCurveTypes(scene, ob, 0); /* force creation */
nurbs_to_mesh(ob); /* also does users */
@@ -1208,19 +1205,19 @@ static int convert_exec(bContext *C, wmOperator *op)
if(cu->vfont) {
cu->vfont->id.us--;
- cu->vfont= 0;
+ cu->vfont= NULL;
}
if(cu->vfontb) {
cu->vfontb->id.us--;
- cu->vfontb= 0;
+ cu->vfontb= NULL;
}
if(cu->vfonti) {
cu->vfonti->id.us--;
- cu->vfonti= 0;
+ cu->vfonti= NULL;
}
if(cu->vfontbi) {
cu->vfontbi->id.us--;
- cu->vfontbi= 0;
+ cu->vfontbi= NULL;
}
if (!keep_original) {
@@ -1633,7 +1630,8 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, Base *base
}
/* single object duplicate, if dupflag==0, fully linked, else it uses the flags given */
-/* leaves selection of base/object unaltered */
+/* leaves selection of base/object unaltered.
+ * note: don't call this within a loop since clear_* funcs loop over the entire database. */
Base *ED_object_add_duplicate(Main *bmain, Scene *scene, Base *base, int dupflag)
{
Base *basen;
@@ -1649,6 +1647,10 @@ Base *ED_object_add_duplicate(Main *bmain, Scene *scene, Base *base, int dupflag
ob= basen->object;
+ /* link own references to the newly duplicated data [#26816] */
+ object_relink(ob);
+ set_sca_new_poins_ob(ob);
+
DAG_scene_sort(bmain, scene);
ED_render_id_flush_update(bmain, ob->data);
@@ -1715,7 +1717,7 @@ void OBJECT_OT_duplicate(wmOperatorType *ot)
/* to give to transform */
RNA_def_boolean(ot->srna, "linked", 0, "Linked", "Duplicate object but not object data, linking to the original data.");
- prop= RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+ prop= RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
RNA_def_property_flag(prop, PROP_HIDDEN);
}
diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c
index e2b125fdbe7..b4a358150e8 100644
--- a/source/blender/editors/object/object_bake.c
+++ b/source/blender/editors/object/object_bake.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_bake.c
+ * \ingroup edobj
+ */
+
+
/*
meshtools.c: no editmode (violated already :), tools operating on meshes
*/
@@ -310,7 +315,7 @@ static int bake_image_exec(bContext *C, wmOperator *op)
}
else {
ListBase threads;
- BakeRender bkr= {0};
+ BakeRender bkr= {NULL};
init_bake_internal(&bkr, C);
bkr.reports= op->reports;
diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c
index 306f5f89275..743b061a45a 100644
--- a/source/blender/editors/object/object_constraint.c
+++ b/source/blender/editors/object/object_constraint.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_constraint.c
+ * \ingroup edobj
+ */
+
+
#include <stdio.h>
#include <string.h>
@@ -70,6 +75,7 @@
#include "ED_screen.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "object_intern.h"
@@ -561,8 +567,8 @@ static bConstraint *edit_constraint_property_get(wmOperator *op, Object *ob, int
}
con = constraints_findByName(list, constraint_name);
- printf("constraint found = %p, %s\n", con, (con)?con->name:"<Not found>");
-
+ printf("constraint found = %p, %s\n", (void *)con, (con)?con->name:"<Not found>");
+
if (con && (type != 0) && (con->type != type))
con = NULL;
@@ -1531,7 +1537,7 @@ static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
}
/* prepare popup menu to choose targetting options */
- pup= uiPupMenuBegin(C, "Add IK", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Add IK", ICON_NONE);
layout= uiPupMenuLayout(pup);
/* the type of targets we'll set determines the menu entries to show... */
@@ -1540,14 +1546,14 @@ static int pose_ik_add_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(evt))
* - the only thing that matters is that we want a target...
*/
if (tar_pchan)
- uiItemBooleanO(layout, "To Active Bone", ICON_NULL, "POSE_OT_ik_add", "with_targets", 1);
+ uiItemBooleanO(layout, "To Active Bone", ICON_NONE, "POSE_OT_ik_add", "with_targets", 1);
else
- uiItemBooleanO(layout, "To Active Object", ICON_NULL, "POSE_OT_ik_add", "with_targets", 1);
+ uiItemBooleanO(layout, "To Active Object", ICON_NONE, "POSE_OT_ik_add", "with_targets", 1);
}
else {
/* we have a choice of adding to a new empty, or not setting any target (targetless IK) */
- uiItemBooleanO(layout, "To New Empty Object", ICON_NULL, "POSE_OT_ik_add", "with_targets", 1);
- uiItemBooleanO(layout, "Without Targets", ICON_NULL, "POSE_OT_ik_add", "with_targets", 0);
+ uiItemBooleanO(layout, "To New Empty Object", ICON_NONE, "POSE_OT_ik_add", "with_targets", 1);
+ uiItemBooleanO(layout, "Without Targets", ICON_NONE, "POSE_OT_ik_add", "with_targets", 0);
}
/* finish building the menu, and process it (should result in calling self again) */
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c
index ba336ad388c..f7682345acf 100644
--- a/source/blender/editors/object/object_edit.c
+++ b/source/blender/editors/object/object_edit.c
@@ -24,6 +24,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/object/object_edit.c
+ * \ingroup edobj
+ */
+
#include <stdlib.h>
#include <string.h>
#include <math.h>
@@ -1795,7 +1800,7 @@ static void auto_timeoffs(Scene *scene, View3D *v3d)
int tot=0, a;
short offset=25;
- if(BASACT==0 || v3d==NULL) return;
+ if(BASACT==NULL || v3d==NULL) return;
// XXX if(button(&offset, 0, 1000,"Total time")==0) return;
/* make array of all bases, xco yco (screen) */
@@ -1833,7 +1838,7 @@ static void ofs_timeoffs(Scene *scene, View3D *v3d)
{
float offset=0.0f;
- if(BASACT==0 || v3d==NULL) return;
+ if(BASACT==NULL || v3d==NULL) return;
// XXX if(fbutton(&offset, -10000.0f, 10000.0f, 10, 10, "Offset")==0) return;
@@ -1853,7 +1858,7 @@ static void rand_timeoffs(Scene *scene, View3D *v3d)
Base *base;
float rand_ofs=0.0f;
- if(BASACT==0 || v3d==NULL) return;
+ if(BASACT==NULL || v3d==NULL) return;
// XXX if(fbutton(&rand_ofs, 0.0f, 10000.0f, 10, 10, "Randomize")==0) return;
@@ -1861,7 +1866,7 @@ static void rand_timeoffs(Scene *scene, View3D *v3d)
for(base= FIRSTBASE; base; base= base->next) {
if(TESTBASELIB(v3d, base)) {
- base->object->sf += (BLI_drand()-0.5) * rand_ofs;
+ base->object->sf += ((float)BLI_drand()-0.5f) * rand_ofs;
if (base->object->sf < -MAXFRAMEF) base->object->sf = -MAXFRAMEF;
else if (base->object->sf > MAXFRAMEF) base->object->sf = MAXFRAMEF;
}
diff --git a/source/blender/editors/object/object_group.c b/source/blender/editors/object/object_group.c
index fa78c7f052f..1fa17c34dd0 100644
--- a/source/blender/editors/object/object_group.c
+++ b/source/blender/editors/object/object_group.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_group.c
+ * \ingroup edobj
+ */
+
+
#include <string.h>
#include "BLI_blenlib.h"
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index aeb26035722..b80f9b4e421 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_hook.c
+ * \ingroup edobj
+ */
+
+
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 7c2d81f2ae3..71cd5de54eb 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/object/object_intern.h
+ * \ingroup edobj
+ */
+
#ifndef ED_OBJECT_INTERN_H
#define ED_OBJECT_INTERN_H
diff --git a/source/blender/editors/object/object_lattice.c b/source/blender/editors/object/object_lattice.c
index 97794e18e4d..125deeb92f6 100644
--- a/source/blender/editors/object/object_lattice.c
+++ b/source/blender/editors/object/object_lattice.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_lattice.c
+ * \ingroup edobj
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <math.h>
@@ -318,7 +323,7 @@ static BPoint *findnearestLattvert(ViewContext *vc, short mval[2], int sel)
/* sel==1: selected gets a disadvantage */
/* in nurb and bezt or bp the nearest is written */
/* return 0 1 2: handlepunt */
- struct { BPoint *bp; short dist, select, mval[2]; } data = {0};
+ struct { BPoint *bp; short dist, select, mval[2]; } data = {NULL};
data.dist = 100;
data.select = sel;
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index fe1906565a9..88fa19a32e4 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_modifier.c
+ * \ingroup edobj
+ */
+
+
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
@@ -292,7 +297,7 @@ int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *
psys=((ParticleSystemModifierData *)md)->psys;
part= psys->part;
- if(part->ren_as != PART_DRAW_PATH || psys->pathcache == 0)
+ if(part->ren_as != PART_DRAW_PATH || psys->pathcache == NULL)
return 0;
totpart= psys->totcached;
@@ -305,15 +310,21 @@ int ED_object_modifier_convert(ReportList *UNUSED(reports), Main *bmain, Scene *
cache= psys->pathcache;
for(a=0; a<totpart; a++) {
key= cache[a];
- totvert+= key->steps+1;
- totedge+= key->steps;
+
+ if(key->steps > 0) {
+ totvert+= key->steps+1;
+ totedge+= key->steps;
+ }
}
cache= psys->childcache;
for(a=0; a<totchild; a++) {
key= cache[a];
- totvert+= key->steps+1;
- totedge+= key->steps;
+
+ if(key->steps > 0) {
+ totvert+= key->steps+1;
+ totedge+= key->steps;
+ }
}
if(totvert==0) return 0;
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index e966372fc7a..9b66d77d3a4 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_ops.c
+ * \ingroup edobj
+ */
+
+
#include <stdlib.h>
#include <math.h>
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index b3b1d9123aa..084c98b1292 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_relations.c
+ * \ingroup edobj
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -279,7 +284,7 @@ static int make_proxy_invoke (bContext *C, wmOperator *op, wmEvent *evt)
uiLayout *layout= uiPupMenuLayout(pup);
/* create operator menu item with relevant properties filled in */
- uiItemFullO(layout, op->idname, op->type->name, ICON_NULL, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
+ uiItemFullO(layout, op->idname, op->type->name, ICON_NONE, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
/* present the menu and be done... */
uiPupMenuEnd(C, pup);
@@ -686,7 +691,7 @@ static int parent_set_exec(bContext *C, wmOperator *op)
static int parent_set_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(event))
{
Object *ob= ED_object_active_context(C);
- uiPopupMenu *pup= uiPupMenuBegin(C, "Set Parent To", ICON_NULL);
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Set Parent To", ICON_NONE);
uiLayout *layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
@@ -1248,7 +1253,7 @@ static int allow_make_links_data(int ev, Object *ob, Object *obt)
static int make_links_data_exec(bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
- int event = RNA_int_get(op->ptr, "type");
+ int event = RNA_enum_get(op->ptr, "type");
Object *ob;
ID *id;
int a;
@@ -1348,7 +1353,7 @@ void OBJECT_OT_make_links_data(wmOperatorType *ot)
/* api callbacks */
ot->exec= make_links_data_exec;
- ot->poll= ED_operator_objectmode;
+ ot->poll= ED_operator_object_active;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1360,11 +1365,6 @@ void OBJECT_OT_make_links_data(wmOperatorType *ot)
/**************************** Make Single User ********************************/
-static void single_object_users__forwardModifierLinks(void *UNUSED(userData), Object *UNUSED(ob), Object **obpoin)
-{
- ID_NEW(*obpoin);
-}
-
static void single_object_users(Scene *scene, View3D *v3d, int flag)
{
Base *base;
@@ -1396,19 +1396,7 @@ static void single_object_users(Scene *scene, View3D *v3d, int flag)
/* object pointers */
for(base= FIRSTBASE; base; base= base->next) {
- ob= base->object;
- if(ob->id.lib==NULL) {
- relink_constraints(&base->object->constraints);
- if (base->object->pose){
- bPoseChannel *chan;
- for (chan = base->object->pose->chanbase.first; chan; chan=chan->next){
- relink_constraints(&chan->constraints);
- }
- }
- modifiers_foreachObjectLink(base->object, single_object_users__forwardModifierLinks, NULL);
-
- ID_NEW(ob->parent);
- }
+ object_relink(base->object);
}
set_sca_new_poins();
@@ -1421,7 +1409,7 @@ static void new_id_matar(Material **matar, int totcol)
for(a=0; a<totcol; a++) {
id= (ID *)matar[a];
- if(id && id->lib==0) {
+ if(id && id->lib == NULL) {
if(id->newid) {
matar[a]= (Material *)id->newid;
id_us_plus(id->newid);
@@ -1575,7 +1563,7 @@ static void do_single_tex_user(Tex **from)
Tex *tex, *texn;
tex= *from;
- if(tex==0) return;
+ if(tex==NULL) return;
if(tex->id.newid) {
*from= (Tex *)tex->id.newid;
diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c
index 7a92b16020e..52486677e87 100644
--- a/source/blender/editors/object/object_select.c
+++ b/source/blender/editors/object/object_select.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_select.c
+ * \ingroup edobj
+ */
+
+
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
@@ -62,6 +67,7 @@
#include "ED_screen.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -181,7 +187,7 @@ static int object_select_linked_exec(bContext *C, wmOperator *op)
Object *ob;
void *obdata = NULL;
Material *mat = NULL, *mat1;
- Tex *tex=0;
+ Tex *tex= NULL;
int a, b;
int nr = RNA_enum_get(op->ptr, "type");
short changed = 0, extend;
@@ -216,15 +222,15 @@ static int object_select_linked_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
else if(nr==2) {
- if(ob->data==0) return OPERATOR_CANCELLED;
+ if(ob->data==NULL) return OPERATOR_CANCELLED;
obdata= ob->data;
}
else if(nr==3 || nr==4) {
mat= give_current_material(ob, ob->actcol);
- if(mat==0) return OPERATOR_CANCELLED;
+ if(mat==NULL) return OPERATOR_CANCELLED;
if(nr==4) {
if(mat->mtex[ (int)mat->texact ]) tex= mat->mtex[ (int)mat->texact ]->tex;
- if(tex==0) return OPERATOR_CANCELLED;
+ if(tex==NULL) return OPERATOR_CANCELLED;
}
}
else if(nr==5) {
@@ -433,7 +439,7 @@ static short select_grouped_group(bContext *C, Object *ob) /* Select objects in
}
/* build the menu. */
- pup= uiPupMenuBegin(C, "Select Group", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Select Group", ICON_NONE);
layout= uiPupMenuLayout(pup);
for (i=0; i<group_count; i++) {
@@ -586,7 +592,7 @@ static int object_select_grouped_exec(bContext *C, wmOperator *op)
}
ob= OBACT;
- if(ob==0){
+ if(ob==NULL) {
BKE_report(op->reports, RPT_ERROR, "No Active Object");
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c
index e3c3a4372c1..a277c99c7ed 100644
--- a/source/blender/editors/object/object_shapekey.c
+++ b/source/blender/editors/object/object_shapekey.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_shapekey.c
+ * \ingroup edobj
+ */
+
+
#include <math.h>
#include <string.h>
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index 92040cdbf03..dc663295167 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_transform.c
+ * \ingroup edobj
+ */
+
+
#include <stdlib.h>
#include <string.h>
@@ -97,9 +102,9 @@ static void object_clear_rot(Object *ob)
ob->rotAxis[2]= ob->drotAxis[2]= 0.0f;
/* check validity of axis - axis should never be 0,0,0 (if so, then we make it rotate about y) */
- if (IS_EQ(ob->rotAxis[0], ob->rotAxis[1]) && IS_EQ(ob->rotAxis[1], ob->rotAxis[2]))
+ if (IS_EQF(ob->rotAxis[0], ob->rotAxis[1]) && IS_EQF(ob->rotAxis[1], ob->rotAxis[2]))
ob->rotAxis[1] = 1.0f;
- if (IS_EQ(ob->drotAxis[0], ob->drotAxis[1]) && IS_EQ(ob->drotAxis[1], ob->drotAxis[2]))
+ if (IS_EQF(ob->drotAxis[0], ob->drotAxis[1]) && IS_EQF(ob->drotAxis[1], ob->drotAxis[2]))
ob->drotAxis[1]= 1.0f;
}
else if (ob->rotmode == ROT_MODE_QUAT) {
@@ -494,7 +499,7 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo
}
/* update normals */
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+ mesh_calc_normals(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
}
else if (ob->type==OB_ARMATURE) {
ED_armature_apply_transform(ob, mat);
@@ -603,7 +608,7 @@ void OBJECT_OT_location_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= location_apply_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode; /* editmode will crash */
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -623,7 +628,7 @@ void OBJECT_OT_scale_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= scale_apply_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -643,59 +648,12 @@ void OBJECT_OT_rotation_apply(wmOperatorType *ot)
/* api callbacks */
ot->exec= rotation_apply_exec;
- ot->poll= ED_operator_scene_editable;
+ ot->poll= ED_operator_objectmode;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-/************************ Texture Space Transform ****************************/
-
-static void texspace_edit(Scene *scene, View3D *v3d)
-{
- Base *base;
- int nr=0;
-
- /* first test if from visible and selected objects
- * texspacedraw is set:
- */
-
- if(scene->obedit) return; // XXX get from context
-
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- break;
- }
- }
-
- if(base==0) {
- return;
- }
-
- nr= 0; // XXX pupmenu("Texture Space %t|Grab/Move%x1|Size%x2");
- if(nr<1) return;
-
- for(base= FIRSTBASE; base; base= base->next) {
- if(TESTBASELIB(v3d, base)) {
- base->object->dtx |= OB_TEXSPACE;
- }
- }
-
-
- if(nr==1) {
-// XXX initTransform(TFM_TRANSLATION, CTX_TEXTURE);
-// XXX Transform();
- }
- else if(nr==2) {
-// XXX initTransform(TFM_RESIZE, CTX_TEXTURE);
-// XXX Transform();
- }
- else if(nr==3) {
-// XXX initTransform(TFM_ROTATION, CTX_TEXTURE);
-// XXX Transform();
- }
-}
-
/********************* Set Object Center ************************/
enum {
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 62bd4bfd184..8707932951e 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/object/object_vgroup.c
+ * \ingroup edobj
+ */
+
+
#include <string.h>
#include <stddef.h>
#include <math.h>
@@ -77,12 +82,9 @@ static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg);
static Lattice *vgroup_edit_lattice(Object *ob)
{
- if(ob->type==OB_LATTICE) {
- Lattice *lt= ob->data;
- return (lt->editlatt)? lt->editlatt->latt: lt;
- }
-
- return NULL;
+ Lattice *lt= ob->data;
+ BLI_assert(ob->type==OB_LATTICE);
+ return (lt->editlatt)? lt->editlatt->latt: lt;
}
int ED_vgroup_object_is_edit_mode(Object *ob)
@@ -207,14 +209,19 @@ static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_to
Lattice *lt= (Lattice *)id;
lt= (lt->editlatt)? lt->editlatt->latt: lt;
- *dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
- *dvert_arr= MEM_mallocN(sizeof(void*)*(*dvert_tot), "vgroup parray from me");
+ if(lt->dvert) {
+ *dvert_tot= lt->pntsu*lt->pntsv*lt->pntsw;
+ *dvert_arr= MEM_mallocN(sizeof(void*)*(*dvert_tot), "vgroup parray from me");
- for (i=0; i<*dvert_tot; i++) {
- (*dvert_arr)[i] = lt->dvert + i;
- }
+ for (i=0; i<*dvert_tot; i++) {
+ (*dvert_arr)[i] = lt->dvert + i;
+ }
- return 1;
+ return 1;
+ }
+ else {
+ return 0;
+ }
}
}
}
@@ -415,15 +422,15 @@ static void ED_vgroup_nr_vert_add(Object *ob, int def_nr, int vertnum, float wei
break;
case WEIGHT_ADD:
dv->dw[i].weight+=weight;
- if(dv->dw[i].weight >= 1.0)
- dv->dw[i].weight = 1.0;
+ if(dv->dw[i].weight >= 1.0f)
+ dv->dw[i].weight = 1.0f;
break;
case WEIGHT_SUBTRACT:
dv->dw[i].weight-=weight;
/* if the weight is zero or less then
* remove the vert from the deform group
*/
- if(dv->dw[i].weight <= 0.0)
+ if(dv->dw[i].weight <= 0.0f)
ED_vgroup_nr_vert_remove(ob, def_nr, vertnum);
break;
}
@@ -506,7 +513,7 @@ void ED_vgroup_vert_remove(Object *ob, bDeformGroup *dg, int vertnum)
static float get_vert_def_nr(Object *ob, int def_nr, int vertnum)
{
- MDeformVert *dvert= NULL;
+ MDeformVert *dvert;
BMVert *eve;
Mesh *me;
int i;
@@ -521,14 +528,22 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum)
dvert= CustomData_bmesh_get(&me->edit_btmesh->bm->vdata, eve->head.data, CD_MDEFORMVERT);
vertnum= 0;
}
- else
+ else {
+ if(vertnum >= me->totvert) {
+ return 0.0f;
+ }
dvert = me->dvert;
+ }
}
else if(ob->type==OB_LATTICE) {
Lattice *lt= vgroup_edit_lattice(ob);
-
- if(lt->dvert)
+
+ if(lt->dvert) {
+ if(vertnum >= lt->pntsu*lt->pntsv*lt->pntsw) {
+ return 0.0f;
+ }
dvert = lt->dvert;
+ }
}
if(dvert==NULL)
@@ -2051,6 +2066,7 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
}
else {
BKE_report(op->reports, RPT_ERROR, "Editmode lattice isnt supported yet.");
+ MEM_freeN(sort_map_update);
return OPERATOR_CANCELLED;
}
}
diff --git a/source/blender/editors/physics/CMakeLists.txt b/source/blender/editors/physics/CMakeLists.txt
index a0aa3e489dd..8d51d6eec37 100644
--- a/source/blender/editors/physics/CMakeLists.txt
+++ b/source/blender/editors/physics/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
../../windowmanager
../../../../intern/elbeem/extern
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/physics/particle_boids.c b/source/blender/editors/physics/particle_boids.c
index f659c33b5e1..3b7d6743e42 100644
--- a/source/blender/editors/physics/particle_boids.c
+++ b/source/blender/editors/physics/particle_boids.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/physics/particle_boids.c
+ * \ingroup edphys
+ */
+
+
#include <stdlib.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c
index b5d07025ca5..7e56113b598 100644
--- a/source/blender/editors/physics/particle_edit.c
+++ b/source/blender/editors/physics/particle_edit.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/physics/particle_edit.c
+ * \ingroup edphys
+ */
+
+
#include <stdlib.h>
#include <math.h>
#include <string.h>
@@ -425,7 +430,7 @@ static int key_test_depth(PEData *data, float co[3])
}
#endif
- if((float)uz - 0.00001 > depth)
+ if((float)uz - 0.00001f > depth)
return 0;
else
return 1;
@@ -1965,6 +1970,7 @@ static void rekey_particle(PEData *data, int pa_index)
for(k=0, key=pa->hair; k<pa->totkey; k++, key++, ekey++) {
ekey->co= key->co;
ekey->time= &key->time;
+ ekey->flag |= PEK_SELECT;
if(!(psys->flag & PSYS_GLOBAL_HAIR))
ekey->flag |= PEK_USE_WCO;
}
@@ -3126,6 +3132,149 @@ static void brush_smooth_do(PEData *data, float UNUSED(mat[][4]), float imat[][4
(data->edit->points + point_index)->flag |= PEP_EDIT_RECALC;
}
+/* convert from triangle barycentric weights to quad mean value weights */
+static void intersect_dm_quad_weights(float *v1, float *v2, float *v3, float *v4, float *w)
+{
+ float co[3], vert[4][3];
+
+ VECCOPY(vert[0], v1);
+ VECCOPY(vert[1], v2);
+ VECCOPY(vert[2], v3);
+ VECCOPY(vert[3], v4);
+
+ co[0]= v1[0]*w[0] + v2[0]*w[1] + v3[0]*w[2] + v4[0]*w[3];
+ co[1]= v1[1]*w[0] + v2[1]*w[1] + v3[1]*w[2] + v4[1]*w[3];
+ co[2]= v1[2]*w[0] + v2[2]*w[1] + v3[2]*w[2] + v4[2]*w[3];
+
+ interp_weights_poly_v3( w,vert, 4, co);
+}
+
+/* check intersection with a derivedmesh */
+static int particle_intersect_dm(Scene *scene, Object *ob, DerivedMesh *dm, float *vert_cos, float *co1, float* co2, float *min_d, int *min_face, float *min_w,
+ float *face_minmax, float *pa_minmax, float radius, float *ipoint)
+{
+ MFace *mface=0;
+ MVert *mvert=0;
+ int i, totface, intersect=0;
+ float cur_d, cur_uv[2], v1[3], v2[3], v3[3], v4[3], min[3], max[3], p_min[3],p_max[3];
+ float cur_ipoint[3];
+
+ if(dm==0){
+ psys_disable_all(ob);
+
+ dm=mesh_get_derived_final(scene, ob, 0);
+ if(dm==0)
+ dm=mesh_get_derived_deform(scene, ob, 0);
+
+ psys_enable_all(ob);
+
+ if(dm==0)
+ return 0;
+ }
+
+
+
+ if(pa_minmax==0){
+ INIT_MINMAX(p_min,p_max);
+ DO_MINMAX(co1,p_min,p_max);
+ DO_MINMAX(co2,p_min,p_max);
+ }
+ else{
+ VECCOPY(p_min,pa_minmax);
+ VECCOPY(p_max,pa_minmax+3);
+ }
+
+ totface=dm->getNumTessFaces(dm);
+ mface=dm->getTessFaceDataArray(dm,CD_MFACE);
+ mvert=dm->getVertDataArray(dm,CD_MVERT);
+
+ /* lets intersect the faces */
+ for(i=0; i<totface; i++,mface++){
+ if(vert_cos){
+ VECCOPY(v1,vert_cos+3*mface->v1);
+ VECCOPY(v2,vert_cos+3*mface->v2);
+ VECCOPY(v3,vert_cos+3*mface->v3);
+ if(mface->v4)
+ VECCOPY(v4,vert_cos+3*mface->v4)
+ }
+ else{
+ VECCOPY(v1,mvert[mface->v1].co);
+ VECCOPY(v2,mvert[mface->v2].co);
+ VECCOPY(v3,mvert[mface->v3].co);
+ if(mface->v4)
+ VECCOPY(v4,mvert[mface->v4].co)
+ }
+
+ if(face_minmax==0){
+ INIT_MINMAX(min,max);
+ DO_MINMAX(v1,min,max);
+ DO_MINMAX(v2,min,max);
+ DO_MINMAX(v3,min,max);
+ if(mface->v4)
+ DO_MINMAX(v4,min,max)
+ if(isect_aabb_aabb_v3(min,max,p_min,p_max)==0)
+ continue;
+ }
+ else{
+ VECCOPY(min, face_minmax+6*i);
+ VECCOPY(max, face_minmax+6*i+3);
+ if(isect_aabb_aabb_v3(min,max,p_min,p_max)==0)
+ continue;
+ }
+
+ if(radius>0.0f){
+ if(isect_sweeping_sphere_tri_v3(co1, co2, radius, v2, v3, v1, &cur_d, cur_ipoint)){
+ if(cur_d<*min_d){
+ *min_d=cur_d;
+ VECCOPY(ipoint,cur_ipoint);
+ *min_face=i;
+ intersect=1;
+ }
+ }
+ if(mface->v4){
+ if(isect_sweeping_sphere_tri_v3(co1, co2, radius, v4, v1, v3, &cur_d, cur_ipoint)){
+ if(cur_d<*min_d){
+ *min_d=cur_d;
+ VECCOPY(ipoint,cur_ipoint);
+ *min_face=i;
+ intersect=1;
+ }
+ }
+ }
+ }
+ else{
+ if(isect_line_tri_v3(co1, co2, v1, v2, v3, &cur_d, cur_uv)){
+ if(cur_d<*min_d){
+ *min_d=cur_d;
+ min_w[0]= 1.0f - cur_uv[0] - cur_uv[1];
+ min_w[1]= cur_uv[0];
+ min_w[2]= cur_uv[1];
+ min_w[3]= 0.0f;
+ if(mface->v4)
+ intersect_dm_quad_weights(v1, v2, v3, v4, min_w);
+ *min_face=i;
+ intersect=1;
+ }
+ }
+ if(mface->v4){
+ if(isect_line_tri_v3(co1, co2, v1, v3, v4, &cur_d, cur_uv)){
+ if(cur_d<*min_d){
+ *min_d=cur_d;
+ min_w[0]= 1.0f - cur_uv[0] - cur_uv[1];
+ min_w[1]= 0.0f;
+ min_w[2]= cur_uv[0];
+ min_w[3]= cur_uv[1];
+ intersect_dm_quad_weights(v1, v2, v3, v4, min_w);
+ *min_face=i;
+ intersect=1;
+ }
+ }
+ }
+ }
+ }
+ return intersect;
+}
+
static int brush_add(PEData *data, short number)
{
Scene *scene= data->scene;
@@ -3182,7 +3331,7 @@ static int brush_add(PEData *data, short number)
min_d=2.0;
/* warning, returns the derived mesh face */
- if(psys_intersect_dm(scene, ob,dm,0,co1,co2,&min_d,&add_pars[n].num,add_pars[n].fuv,0,0,0,0)) {
+ if(particle_intersect_dm(scene, ob,dm,0,co1,co2,&min_d,&add_pars[n].num,add_pars[n].fuv,0,0,0,0)) {
add_pars[n].num_dmcache= psys_particle_dm_face_lookup(ob,psmd->dm,add_pars[n].num,add_pars[n].fuv,NULL);
n++;
}
@@ -3805,7 +3954,7 @@ static void get_PTCacheUndo(PTCacheEdit *edit, PTCacheUndo *undo)
LOOP_POINTS {
LOOP_KEYS {
- if((int)key->ftime == pm->frame) {
+ if((int)key->ftime == (int)pm->frame) {
key->co = pm->cur[BPHYS_DATA_LOCATION];
key->vel = pm->cur[BPHYS_DATA_VELOCITY];
key->rot = pm->cur[BPHYS_DATA_ROTATION];
@@ -4029,7 +4178,7 @@ static void PE_create_particle_edit(Scene *scene, Object *ob, PointCache *cache,
return;
if(!edit) {
- totpoint = psys ? psys->totpart : ((PTCacheMem*)cache->mem_cache.first)->totpoint;
+ totpoint = psys ? psys->totpart : (int)((PTCacheMem*)cache->mem_cache.first)->totpoint;
edit= MEM_callocN(sizeof(PTCacheEdit), "PE_create_particle_edit");
edit->points=MEM_callocN(totpoint*sizeof(PTCacheEditPoint),"PTCacheEditPoints");
diff --git a/source/blender/editors/physics/particle_object.c b/source/blender/editors/physics/particle_object.c
index 7f830478f2a..d0deec70b51 100644
--- a/source/blender/editors/physics/particle_object.c
+++ b/source/blender/editors/physics/particle_object.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/physics/particle_object.c
+ * \ingroup edphys
+ */
+
+
#include <stdlib.h>
#include <string.h>
@@ -624,7 +629,7 @@ static void connect_hair(Scene *scene, Object *ob, ParticleSystem *psys)
PTCacheEditPoint *point;
PTCacheEditKey *ekey = NULL;
HairKey *key;
- BVHTreeFromMesh bvhtree= {0};
+ BVHTreeFromMesh bvhtree= {NULL};
BVHTreeNearest nearest;
MFace *mface;
DerivedMesh *dm = NULL;
diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c
index 93b0ca49915..4aa9b942cf3 100644
--- a/source/blender/editors/physics/physics_fluid.c
+++ b/source/blender/editors/physics/physics_fluid.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/physics/physics_fluid.c
+ * \ingroup edphys
+ */
+
+
#include <math.h>
@@ -82,6 +87,7 @@
#include "ED_fluidsim.h"
#include "WM_types.h"
+#include "WM_api.h"
#include "physics_intern.h" // own include
@@ -437,15 +443,20 @@ static void fluid_init_all_channels(bContext *C, Object *UNUSED(fsDomain), Fluid
Object *ob = fobj->object;
FluidsimModifierData *fluidmd = (FluidsimModifierData *)modifiers_findByType(ob, eModifierType_Fluidsim);
float active= (float)(fluidmd->fss->flag & OB_FLUIDSIM_ACTIVE);
- float rot_d[3], rot_360[3] = {360.f, 360.f, 360.f};
+ float rot_d[3], old_rot[3] = {0.f, 0.f, 0.f};
if (ELEM(fluidmd->fss->type, OB_FLUIDSIM_DOMAIN, OB_FLUIDSIM_PARTICLE))
continue;
/* init euler rotation values and convert to elbeem format */
- BKE_rotMode_change_values(ob->quat, ob->rot, ob->rotAxis, &ob->rotAngle, ob->rotmode, ROT_MODE_EUL);
- mul_v3_v3fl(rot_d, ob->rot, 180.f/M_PI);
- sub_v3_v3v3(rot_d, rot_360, rot_d);
+ /* get the rotation from ob->obmat rather than ob->rot to account for parent animations */
+ if(i) {
+ copy_v3_v3(old_rot, fobj->Rotation + 4*(i-1));
+ mul_v3_fl(old_rot, -M_PI/180.f);
+ }
+
+ mat4_to_compatible_eulO(rot_d, old_rot, 0, ob->obmat);
+ mul_v3_fl(rot_d, -180.f/M_PI);
set_channel(fobj->Translation, timeAtFrame, ob->loc, i, CHANNEL_VEC);
set_channel(fobj->Rotation, timeAtFrame, rot_d, i, CHANNEL_VEC);
@@ -798,7 +809,7 @@ static void fluidbake_free_data(FluidAnimChannels *channels, ListBase *fobjects,
}
}
-int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
+static int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain)
{
Scene *scene= CTX_data_scene(C);
int i;
@@ -1070,19 +1081,17 @@ static int fluidsimBake(bContext *UNUSED(C), ReportList *UNUSED(reports), Object
return 0;
}
-static void fluidsimFreeBake(Object *UNUSED(ob))
-{
-}
-
#endif /* DISABLE_ELBEEM */
/***************************** Operators ******************************/
static int fluid_bake_exec(bContext *C, wmOperator *op)
{
- Object *ob= CTX_data_active_object(C);
+ /* only one bake job at a time */
+ if(WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C)))
+ return 0;
- if(!fluidsimBake(C, op->reports, ob))
+ if(!fluidsimBake(C, op->reports, CTX_data_active_object(C)))
return OPERATOR_CANCELLED;
return OPERATOR_FINISHED;
diff --git a/source/blender/editors/physics/physics_intern.h b/source/blender/editors/physics/physics_intern.h
index b3d11810c43..d447da3f8c4 100644
--- a/source/blender/editors/physics/physics_intern.h
+++ b/source/blender/editors/physics/physics_intern.h
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/physics/physics_intern.h
+ * \ingroup edphys
+ */
+
+
#ifndef ED_PHYSICS_INTERN_H
#define ED_PHYSICS_INTERN_H
diff --git a/source/blender/editors/physics/physics_ops.c b/source/blender/editors/physics/physics_ops.c
index 7d2b872038f..02b2fad7a00 100644
--- a/source/blender/editors/physics/physics_ops.c
+++ b/source/blender/editors/physics/physics_ops.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/physics/physics_ops.c
+ * \ingroup edphys
+ */
+
+
#include <stdlib.h>
@@ -103,7 +108,7 @@ static void keymap_particle(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "PARTICLE_OT_reveal", HKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, 0, 0);
- RNA_enum_set(WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "PARTICLE_OT_hide", HKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "unselected", 1);
WM_keymap_add_item(keymap, "PARTICLE_OT_brush_edit", LEFTMOUSE, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "PARTICLE_OT_brush_edit", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
diff --git a/source/blender/editors/physics/physics_pointcache.c b/source/blender/editors/physics/physics_pointcache.c
index 4c8c69bce01..df6cdb577a2 100644
--- a/source/blender/editors/physics/physics_pointcache.c
+++ b/source/blender/editors/physics/physics_pointcache.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/physics/physics_pointcache.c
+ * \ingroup edphys
+ */
+
+
#include <stdlib.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/editors/render/CMakeLists.txt b/source/blender/editors/render/CMakeLists.txt
index ec62588b8fa..2f5641196fe 100644
--- a/source/blender/editors/render/CMakeLists.txt
+++ b/source/blender/editors/render/CMakeLists.txt
@@ -33,7 +33,7 @@ set(INC
../../render/extern/include
../../windowmanager
../../../../intern/guardedalloc
- ../../../../extern/glew/include
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/render/render_intern.h b/source/blender/editors/render/render_intern.h
index c61d00f22a7..e6d8c98d068 100644
--- a/source/blender/editors/render/render_intern.h
+++ b/source/blender/editors/render/render_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/render/render_intern.h
+ * \ingroup edrend
+ */
+
+
#ifndef RENDER_INTERN_H
#define RENDER_INTERN_H
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index 52280fa8e6a..857a36c3029 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/render/render_internal.c
+ * \ingroup edrend
+ */
+
+
#include <math.h>
#include <string.h>
#include <stddef.h>
@@ -48,6 +53,7 @@
#include "BKE_multires.h"
#include "BKE_report.h"
#include "BKE_sequencer.h"
+#include "BKE_screen.h"
#include "WM_api.h"
#include "WM_types.h"
@@ -141,12 +147,12 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat
float *rf= rectf;
float srgb[3];
char *rc= rectc;
- const float dither = ibuf->dither / 255.0;
+ const float dither = ibuf->dither / 255.0f;
/* XXX temp. because crop offset */
if( rectc >= (char *)(ibuf->rect)) {
for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
- const float d = (BLI_frand()-0.5)*dither;
+ const float d = (BLI_frand()-0.5f)*dither;
srgb[0]= d + linearrgb_to_srgb(rf[0]);
srgb[1]= d + linearrgb_to_srgb(rf[1]);
srgb[2]= d + linearrgb_to_srgb(rf[2]);
@@ -165,12 +171,12 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat
float *rf= rectf;
char *rc= rectc;
float rgb[3];
- const float dither = ibuf->dither / 255.0;
+ const float dither = ibuf->dither / 255.0f;
/* XXX temp. because crop offset */
if( rectc >= (char *)(ibuf->rect)) {
for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
- const float d = (BLI_frand()-0.5)*dither;
+ const float d = (BLI_frand()-0.5f)*dither;
rgb[0] = d + rf[0];
rgb[1] = d + rf[1];
@@ -631,6 +637,14 @@ static int render_breakjob(void *rjv)
return 0;
}
+/* runs in thread, no cursor setting here works. careful with notifiers too (malloc conflicts) */
+/* maybe need a way to get job send notifer? */
+static void render_drawlock(void *UNUSED(rjv), int lock)
+{
+ BKE_spacedata_draw_locks(lock);
+
+}
+
/* catch esc */
static int screen_render_modal(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
@@ -764,6 +778,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* setup new render */
re= RE_NewRender(scene->id.name);
RE_test_break_cb(re, rj, render_breakjob);
+ RE_draw_lock_cb(re, rj, render_drawlock);
RE_display_draw_cb(re, rj, image_rect_update);
RE_stats_draw_cb(re, rj, image_renderinfo_cb);
RE_progress_cb(re, rj, render_progress_update);
diff --git a/source/blender/editors/render/render_opengl.c b/source/blender/editors/render/render_opengl.c
index 68bf4fa9b5b..364b0805237 100644
--- a/source/blender/editors/render/render_opengl.c
+++ b/source/blender/editors/render/render_opengl.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/render/render_opengl.c
+ * \ingroup edrend
+ */
+
+
#include <math.h>
#include <string.h>
#include <stddef.h>
@@ -183,9 +188,17 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
GPU_offscreen_unbind(oglrender->ofs); /* unbind */
}
else {
- ImBuf *ibuf_view= ED_view3d_draw_offscreen_imbuf_simple(scene, oglrender->sizex, oglrender->sizey, IB_rectfloat, OB_SOLID);
- memcpy(rr->rectf, ibuf_view->rect_float, sizeof(float) * 4 * oglrender->sizex * oglrender->sizey);
- IMB_freeImBuf(ibuf_view);
+ /* shouldnt suddenly give errors mid-render but possible */
+ char err_out[256]= "unknown";
+ ImBuf *ibuf_view= ED_view3d_draw_offscreen_imbuf_simple(scene, oglrender->sizex, oglrender->sizey, IB_rectfloat, OB_SOLID, err_out);
+
+ if(ibuf_view) {
+ memcpy(rr->rectf, ibuf_view->rect_float, sizeof(float) * 4 * oglrender->sizex * oglrender->sizey);
+ IMB_freeImBuf(ibuf_view);
+ }
+ else {
+ fprintf(stderr, "screen_opengl_render_apply: failed to get buffer, %s\n", err_out);
+ }
}
/* rr->rectf is now filled with image data */
@@ -225,6 +238,7 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
short is_view_context= RNA_boolean_get(op->ptr, "view_context");
const short is_animation= RNA_boolean_get(op->ptr, "animation");
const short is_write_still= RNA_boolean_get(op->ptr, "write_still");
+ char err_out[256]= "unknown";
/* ensure we have a 3d view */
@@ -258,10 +272,10 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
sizey= (scene->r.size*scene->r.ysch)/100;
/* corrects render size with actual size, not every card supports non-power-of-two dimensions */
- ofs= GPU_offscreen_create(&sizex, &sizey);
+ ofs= GPU_offscreen_create(&sizex, &sizey, err_out);
if(!ofs) {
- BKE_report(op->reports, RPT_ERROR, "Failed to create OpenGL offscreen buffer.");
+ BKE_reportf(op->reports, RPT_ERROR, "Failed to create OpenGL offscreen buffer, %s", err_out);
return 0;
}
@@ -280,6 +294,9 @@ static int screen_opengl_render_init(bContext *C, wmOperator *op)
oglrender->v3d= CTX_wm_view3d(C);
oglrender->ar= CTX_wm_region(C);
oglrender->rv3d= CTX_wm_region_view3d(C);
+
+ /* MUST be cleared on exit */
+ oglrender->scene->customdata_mask_modal= ED_view3d_datamask(oglrender->scene, oglrender->v3d);
}
/* create image and image user */
@@ -323,6 +340,8 @@ static void screen_opengl_render_end(bContext *C, OGLRender *oglrender)
GPU_offscreen_free(oglrender->ofs);
+ oglrender->scene->customdata_mask_modal= 0;
+
MEM_freeN(oglrender);
}
diff --git a/source/blender/editors/render/render_ops.c b/source/blender/editors/render/render_ops.c
index 11cbf120391..dd488154198 100644
--- a/source/blender/editors/render/render_ops.c
+++ b/source/blender/editors/render/render_ops.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/render/render_ops.c
+ * \ingroup edrend
+ */
+
+
#include <stdlib.h>
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 95a5220d562..239b078a910 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/render/render_preview.c
+ * \ingroup edrend
+ */
+
+
/* global includes */
#include <stdlib.h>
@@ -62,13 +67,14 @@
#include "BKE_context.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
+#include "BKE_idprop.h"
#include "BKE_image.h"
#include "BKE_icons.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_material.h"
#include "BKE_node.h"
-#include "BKE_idprop.h"
+#include "BKE_texture.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -151,8 +157,10 @@ typedef struct ShaderPreview {
ID *parent;
MTex *slot;
- /* node materials need full copy during preview render, glsl uses it too */
+ /* node materials/texture need full copy during preview render, glsl uses it too */
Material *matcopy;
+ Tex *texcopy;
+
float col[4]; /* active object color */
int sizex, sizey;
@@ -169,7 +177,7 @@ void draw_tex_crop(Tex *tex)
rcti rct;
int ret= 0;
- if(tex==0) return;
+ if(tex==NULL) return;
if(tex->type==TEX_IMAGE) {
if(tex->cropxmin==0.0f) ret++;
@@ -477,8 +485,13 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
}
else if(id_type==ID_TE) {
- Tex *tex= (Tex *)id;
+ Tex *tex= NULL, *origtex= (Tex *)id;
+ if(origtex) {
+ tex= localize_texture(origtex);
+ sp->texcopy= tex;
+ BLI_addtail(&pr_main->tex, tex);
+ }
sce->lay= 1<<MA_TEXTURE;
for(base= sce->base.first; base; base= base->next) {
@@ -503,8 +516,11 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
}
}
- if(tex && tex->nodetree && sp->pr_method==PR_NODE_RENDER)
+ if(tex && tex->nodetree && sp->pr_method==PR_NODE_RENDER) {
+ /* two previews, they get copied by wmJob */
+ ntreeInitPreview(origtex->nodetree, sp->sizex, sp->sizey);
ntreeInitPreview(tex->nodetree, sp->sizex, sp->sizey);
+ }
}
else if(id_type==ID_LA) {
Lamp *la= (Lamp *)id;
@@ -966,11 +982,21 @@ static void shader_preview_updatejob(void *spv)
{
ShaderPreview *sp= spv;
- if(sp->id && GS(sp->id->name) == ID_MA) {
- Material *mat= (Material *)sp->id;
-
- if(sp->matcopy && mat->nodetree && sp->matcopy->nodetree)
- ntreeLocalSync(sp->matcopy->nodetree, mat->nodetree);
+ if(sp->id) {
+ if(sp->pr_method==PR_NODE_RENDER) {
+ if( GS(sp->id->name) == ID_MA) {
+ Material *mat= (Material *)sp->id;
+
+ if(sp->matcopy && mat->nodetree && sp->matcopy->nodetree)
+ ntreeLocalSync(sp->matcopy->nodetree, mat->nodetree);
+ }
+ else if( GS(sp->id->name) == ID_TE) {
+ Tex *tex= (Tex *)sp->id;
+
+ if(sp->texcopy && tex->nodetree && sp->texcopy->nodetree)
+ ntreeLocalSync(sp->texcopy->nodetree, tex->nodetree);
+ }
+ }
}
}
@@ -1027,8 +1053,10 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
/* callbacs are cleared on GetRender() */
if(ELEM(sp->pr_method, PR_BUTS_RENDER, PR_NODE_RENDER)) {
RE_display_draw_cb(re, sp, shader_preview_draw);
- RE_test_break_cb(re, sp, shader_preview_break);
}
+ /* set this for all previews, default is react to G.afbreek still */
+ RE_test_break_cb(re, sp, shader_preview_break);
+
/* lens adjust */
oldlens= ((Camera *)sce->camera->data)->lens;
if(sizex > sp->sizey)
@@ -1055,6 +1083,14 @@ static void shader_preview_render(ShaderPreview *sp, ID *id, int split, int firs
/* unassign the pointers, reset vars */
preview_prepare_scene(sp->scene, NULL, GS(id->name), sp);
+
+ /* XXX bad exception, end-exec is not being called in render, because it uses local main */
+// if(idtype == ID_TE) {
+// Tex *tex= (Tex *)id;
+// if(tex->use_nodes && tex->nodetree)
+// ntreeEndExecTree(tex->nodetree);
+// }
+
}
/* runs inside thread for material and icons */
@@ -1081,11 +1117,20 @@ static void shader_preview_free(void *customdata)
if(sp->matcopy) {
struct IDProperty *properties;
+ int a;
+
/* node previews */
shader_preview_updatejob(sp);
/* get rid of copied material */
BLI_remlink(&pr_main->mat, sp->matcopy);
+
+ /* free_material decrements texture, prevent this. hack alert! */
+ for(a=0; a<MAX_MTEX; a++) {
+ MTex *mtex= sp->matcopy->mtex[a];
+ if(mtex && mtex->tex) mtex->tex= NULL;
+ }
+
free_material(sp->matcopy);
properties= IDP_GetProperties((ID *)sp->matcopy, FALSE);
@@ -1095,6 +1140,22 @@ static void shader_preview_free(void *customdata)
}
MEM_freeN(sp->matcopy);
}
+ if(sp->texcopy) {
+ struct IDProperty *properties;
+ /* node previews */
+ shader_preview_updatejob(sp);
+
+ /* get rid of copied texture */
+ BLI_remlink(&pr_main->tex, sp->texcopy);
+ free_texture(sp->texcopy);
+
+ properties= IDP_GetProperties((ID *)sp->texcopy, FALSE);
+ if (properties) {
+ IDP_FreeProperty(properties);
+ MEM_freeN(properties);
+ }
+ MEM_freeN(sp->texcopy);
+ }
MEM_freeN(sp);
}
@@ -1169,7 +1230,7 @@ static void icon_preview_startjob(void *customdata, short *stop, short *do_updat
if(idtype == ID_IM) {
Image *ima= (Image*)id;
ImBuf *ibuf= NULL;
- ImageUser iuser= {0};
+ ImageUser iuser= {NULL};
/* ima->ok is zero when Image cannot load */
if(ima==NULL || ima->ok==0)
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index e4e3ee7576c..1a0d481fadc 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/render/render_shading.c
+ * \ingroup edrend
+ */
+
+
#include <stdlib.h>
#include <string.h>
@@ -72,9 +77,10 @@
#include "WM_api.h"
#include "WM_types.h"
-#include "ED_render.h"
#include "ED_curve.h"
#include "ED_mesh.h"
+#include "ED_render.h"
+#include "ED_screen.h"
#include "RNA_define.h"
@@ -281,6 +287,7 @@ void OBJECT_OT_material_slot_add(wmOperatorType *ot)
/* api callbacks */
ot->exec= material_slot_add_exec;
+ ot->poll= ED_operator_object_active_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -316,6 +323,7 @@ void OBJECT_OT_material_slot_remove(wmOperatorType *ot)
/* api callbacks */
ot->exec= material_slot_remove_exec;
+ ot->poll= ED_operator_object_active_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -357,7 +365,7 @@ static int material_slot_assign_exec(bContext *C, wmOperator *UNUSED(op))
if(ef && BKE_font_getselection(ob, &selstart, &selend)) {
for(i=selstart; i<=selend; i++)
- ef->textbufinfo[i].mat_nr = ob->actcol-1;
+ ef->textbufinfo[i].mat_nr = ob->actcol;
}
}
}
@@ -377,6 +385,7 @@ void OBJECT_OT_material_slot_assign(wmOperatorType *ot)
/* api callbacks */
ot->exec= material_slot_assign_exec;
+ ot->poll= ED_operator_object_active_editable;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -1152,6 +1161,9 @@ static void paste_mtex_copybuf(ID *id)
case ID_PA:
mtex= &(((ParticleSettings *)id)->mtex[(int)((ParticleSettings *)id)->texact]);
break;
+ default:
+ BLI_assert("invalid id type");
+ return;
}
if(mtex) {
diff --git a/source/blender/editors/screen/CMakeLists.txt b/source/blender/editors/screen/CMakeLists.txt
index 5663a9ee750..3098c26f638 100644
--- a/source/blender/editors/screen/CMakeLists.txt
+++ b/source/blender/editors/screen/CMakeLists.txt
@@ -31,6 +31,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 4ddb5d059e4..5a80799fc3b 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/screen/area.c
+ * \ingroup edscr
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -102,7 +107,7 @@ void ED_region_pixelspace(ARegion *ar)
int width= ar->winrct.xmax-ar->winrct.xmin+1;
int height= ar->winrct.ymax-ar->winrct.ymin+1;
- wmOrtho2(-0.375, (float)width-0.375, -0.375, (float)height-0.375);
+ wmOrtho2(-0.375f, (float)width-0.375f, -0.375f, (float)height-0.375f);
glLoadIdentity();
}
@@ -309,6 +314,10 @@ void ED_region_do_draw(bContext *C, ARegion *ar)
ARegionType *at= ar->type;
rcti winrct;
+ /* see BKE_spacedata_draw_locks() */
+ if(at->do_lock)
+ return;
+
/* checks other overlapping regions */
region_scissor_winrct(ar, &winrct);
@@ -426,7 +435,11 @@ void ED_area_tag_refresh(ScrArea *sa)
void ED_area_headerprint(ScrArea *sa, const char *str)
{
ARegion *ar;
-
+
+ /* happens when running transform operators in backround mode */
+ if(sa == NULL)
+ return;
+
for(ar= sa->regionbase.first; ar; ar= ar->next) {
if(ar->regiontype==RGN_TYPE_HEADER) {
if(str) {
@@ -838,7 +851,7 @@ static void region_subwindow(wmWindow *win, ARegion *ar)
wm_subwindow_position(win, ar->swinid, &ar->winrct);
}
-static void ed_default_handlers(wmWindowManager *wm, ListBase *handlers, int flag)
+static void ed_default_handlers(wmWindowManager *wm, ScrArea *sa, ListBase *handlers, int flag)
{
/* note, add-handler checks if it already exists */
@@ -855,8 +868,20 @@ static void ed_default_handlers(wmWindowManager *wm, ListBase *handlers, int fla
if(flag & ED_KEYMAP_MARKERS) {
/* time-markers */
wmKeyMap *keymap= WM_keymap_find(wm->defaultconf, "Markers", 0, 0);
- WM_event_add_keymap_handler(handlers, keymap);
- // XXX need boundbox check urgently!!!
+
+ /* time space only has this keymap, the others get a boundbox restricted map */
+ if(sa->spacetype!=SPACE_TIME) {
+ ARegion *ar;
+ static rcti rect= {0, 10000, 0, 30}; /* same local check for all areas */
+
+ for(ar= sa->regionbase.first; ar; ar= ar->next)
+ if(ar->regiontype == RGN_TYPE_WINDOW)
+ break;
+ if(ar)
+ WM_event_add_keymap_handler_bb(handlers, keymap, &rect, &ar->winrct);
+ }
+ else
+ WM_event_add_keymap_handler(handlers, keymap);
}
if(flag & ED_KEYMAP_ANIMATION) {
/* frame changing and timeline operators (for time spaces) */
@@ -909,7 +934,7 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
region_rect_recursive(sa, sa->regionbase.first, &rect, 0);
/* default area handlers */
- ed_default_handlers(wm, &sa->handlers, sa->type->keymapflag);
+ ed_default_handlers(wm, sa, &sa->handlers, sa->type->keymapflag);
/* checks spacedata, adds own handlers */
if(sa->type->init)
sa->type->init(wm, sa);
@@ -920,7 +945,7 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
if(ar->swinid) {
/* default region handlers */
- ed_default_handlers(wm, &ar->handlers, ar->type->keymapflag);
+ ed_default_handlers(wm, sa, &ar->handlers, ar->type->keymapflag);
/* own handlers */
if(ar->type->init)
ar->type->init(wm, ar);
@@ -1062,6 +1087,9 @@ void ED_area_newspace(bContext *C, ScrArea *sa, int type)
if(sl && sl->regionbase.first==NULL) {
st->free(sl);
BLI_freelinkN(&sa->spacedata, sl);
+ if(slold == sl) {
+ slold= NULL;
+ }
sl= NULL;
}
@@ -1418,7 +1446,7 @@ void ED_region_header(const bContext *C, ARegion *ar)
uiBlock *block;
uiLayout *layout;
HeaderType *ht;
- Header header = {0};
+ Header header = {NULL};
int maxco, xco, yco;
/* clear */
diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c
index ce96df5d3b1..2918c98c84a 100644
--- a/source/blender/editors/screen/glutil.c
+++ b/source/blender/editors/screen/glutil.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/screen/glutil.c
+ * \ingroup edscr
+ */
+
+
#include <stdio.h>
#include <string.h>
@@ -341,7 +346,7 @@ void glutil_draw_filled_arc(float start, float angle, float radius, int nsegment
float t= (float) i/(nsegments-1);
float cur= start + t*angle;
- glVertex2f(cos(cur)*radius, sin(cur)*radius);
+ glVertex2f(cosf(cur)*radius, sinf(cur)*radius);
}
glEnd();
}
@@ -354,7 +359,7 @@ void glutil_draw_lined_arc(float start, float angle, float radius, int nsegments
float t= (float) i/(nsegments-1);
float cur= start + t*angle;
- glVertex2f(cos(cur)*radius, sin(cur)*radius);
+ glVertex2f(cosf(cur)*radius, sinf(cur)*radius);
}
glEnd();
}
@@ -756,9 +761,9 @@ void bglBegin(int mode)
if(mode==GL_POINTS) {
float value[4];
glGetFloatv(GL_POINT_SIZE_RANGE, value);
- if(value[1]<2.0) {
+ if(value[1] < 2.0f) {
glGetFloatv(GL_POINT_SIZE, value);
- pointhack= floor(value[0]+0.5);
+ pointhack= floor(value[0] + 0.5f);
if(pointhack>4) pointhack= 4;
}
else glBegin(mode);
@@ -769,9 +774,9 @@ int bglPointHack(void) {
float value[4];
int pointhack_px;
glGetFloatv(GL_POINT_SIZE_RANGE, value);
- if(value[1]<2.0) {
+ if(value[1] < 2.0f) {
glGetFloatv(GL_POINT_SIZE, value);
- pointhack_px= floor(value[0]+0.5);
+ pointhack_px= floorf(value[0]+0.5f);
if(pointhack_px>4) pointhack_px= 4;
return pointhack_px;
}
@@ -784,7 +789,7 @@ void bglVertex3fv(float *vec)
case GL_POINTS:
if(pointhack) {
glRasterPos3fv(vec);
- glBitmap(pointhack, pointhack, (float)pointhack/2.0, (float)pointhack/2.0, 0.0, 0.0, Squaredot);
+ glBitmap(pointhack, pointhack, (float)pointhack/2.0f, (float)pointhack/2.0f, 0.0, 0.0, Squaredot);
}
else glVertex3fv(vec);
break;
@@ -797,7 +802,7 @@ void bglVertex3f(float x, float y, float z)
case GL_POINTS:
if(pointhack) {
glRasterPos3f(x, y, z);
- glBitmap(pointhack, pointhack, (float)pointhack/2.0, (float)pointhack/2.0, 0.0, 0.0, Squaredot);
+ glBitmap(pointhack, pointhack, (float)pointhack/2.0f, (float)pointhack/2.0f, 0.0, 0.0, Squaredot);
}
else glVertex3f(x, y, z);
break;
@@ -855,7 +860,7 @@ void bglPolygonOffset(float viewdist, float dist)
{
static float winmat[16], offset=0.0;
- if(dist!=0.0) {
+ if(dist != 0.0f) {
float offs;
// glEnable(GL_POLYGON_OFFSET_FILL);
@@ -867,8 +872,8 @@ void bglPolygonOffset(float viewdist, float dist)
/* dist is from camera to center point */
- if(winmat[15]>0.5) offs= 0.00001*dist*viewdist; // ortho tweaking
- else offs= 0.0005*dist; // should be clipping value or so...
+ if(winmat[15]>0.5f) offs= 0.00001f*dist*viewdist; // ortho tweaking
+ else offs= 0.0005f*dist; // should be clipping value or so...
winmat[14]-= offs;
offset+= offs;
diff --git a/source/blender/editors/screen/screen_context.c b/source/blender/editors/screen/screen_context.c
index 754d75fe9a5..f73ede19724 100644
--- a/source/blender/editors/screen/screen_context.c
+++ b/source/blender/editors/screen/screen_context.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/screen/screen_context.c
+ * \ingroup edscr
+ */
+
+
#include <stdlib.h>
#include <string.h>
@@ -57,7 +62,7 @@ const char *screen_context_dir[] = {
"visible_pose_bones", "selected_pose_bones", "active_bone", "active_pose_bone",
"active_base", "active_object", "object", "edit_object",
"sculpt_object", "vertex_paint_object", "weight_paint_object",
- "texture_paint_object", "particle_edit_object",
+ "image_paint_object", "particle_edit_object",
"sequences", "selected_sequences", "selected_editable_sequences", /* sequencer */
NULL};
@@ -149,7 +154,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
return 1;
}
else if(CTX_data_equals(member, "visible_bones") || CTX_data_equals(member, "editable_bones")) {
- bArmature *arm= (obedit) ? obedit->data : NULL;
+ bArmature *arm= (obedit && obedit->type == OB_ARMATURE) ? obedit->data : NULL;
EditBone *ebone, *flipbone=NULL;
int editable_bones= CTX_data_equals(member, "editable_bones");
@@ -191,7 +196,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
}
}
else if(CTX_data_equals(member, "selected_bones") || CTX_data_equals(member, "selected_editable_bones")) {
- bArmature *arm= (obedit) ? obedit->data : NULL;
+ bArmature *arm= (obedit && obedit->type == OB_ARMATURE) ? obedit->data : NULL;
EditBone *ebone, *flipbone=NULL;
int selected_editable_bones= CTX_data_equals(member, "selected_editable_bones");
@@ -335,7 +340,7 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
return 1;
}
- else if(CTX_data_equals(member, "texture_paint_object")) {
+ else if(CTX_data_equals(member, "image_paint_object")) {
if(obact && (obact->mode & OB_MODE_TEXTURE_PAINT))
CTX_data_id_pointer_set(result, &obact->id);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index f2f11f42204..2467140bde4 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/screen/screen_edit.c
+ * \ingroup edscr
+ */
+
+
#include <string.h>
#include <math.h>
@@ -222,16 +227,16 @@ void removenotused_scredges(bScreen *sc)
sa= sc->areabase.first;
while(sa) {
se= screen_findedge(sc, sa->v1, sa->v2);
- if(se==0) printf("error: area %d edge 1 doesn't exist\n", a);
+ if(se==NULL) printf("error: area %d edge 1 doesn't exist\n", a);
else se->flag= 1;
se= screen_findedge(sc, sa->v2, sa->v3);
- if(se==0) printf("error: area %d edge 2 doesn't exist\n", a);
+ if(se==NULL) printf("error: area %d edge 2 doesn't exist\n", a);
else se->flag= 1;
se= screen_findedge(sc, sa->v3, sa->v4);
- if(se==0) printf("error: area %d edge 3 doesn't exist\n", a);
+ if(se==NULL) printf("error: area %d edge 3 doesn't exist\n", a);
else se->flag= 1;
se= screen_findedge(sc, sa->v4, sa->v1);
- if(se==0) printf("error: area %d edge 4 doesn't exist\n", a);
+ if(se==NULL) printf("error: area %d edge 4 doesn't exist\n", a);
else se->flag= 1;
sa= sa->next;
a++;
@@ -319,8 +324,7 @@ static short testsplitpoint(ScrArea *sa, char dir, float fac)
if(dir=='h' && (sa->v2->vec.y- sa->v1->vec.y <= 2*AREAMINY)) return 0;
// to be sure
- if(fac<0.0) fac= 0.0;
- if(fac>1.0) fac= 1.0;
+ CLAMP(fac, 0.0f, 1.0f);
if(dir=='h') {
y= sa->v1->vec.y+ fac*(sa->v2->vec.y- sa->v1->vec.y);
@@ -649,14 +653,14 @@ static void screen_test_scale(bScreen *sc, int winsizex, int winsizey)
/* FIXME, this resizing logic is no good when resizing the window + redrawing [#24428]
* need some way to store these as floats internally and re-apply from there. */
tempf= ((float)sv->vec.x)*facx;
- sv->vec.x= (short)(tempf+0.5);
+ sv->vec.x= (short)(tempf+0.5f);
sv->vec.x+= AREAGRID-1;
sv->vec.x-= (sv->vec.x % AREAGRID);
CLAMP(sv->vec.x, 0, winsizex);
tempf= ((float)sv->vec.y)*facy;
- sv->vec.y= (short)(tempf+0.5);
+ sv->vec.y= (short)(tempf+0.5f);
sv->vec.y+= AREAGRID-1;
sv->vec.y-= (sv->vec.y % AREAGRID);
@@ -955,8 +959,9 @@ static void region_cursor_set(wmWindow *win, int swinid)
}
}
-void ED_screen_do_listen(wmWindow *win, wmNotifier *note)
+void ED_screen_do_listen(bContext *C, wmNotifier *note)
{
+ wmWindow *win= CTX_wm_window(C);
/* generic notes */
switch(note->category) {
@@ -968,8 +973,11 @@ void ED_screen_do_listen(wmWindow *win, wmNotifier *note)
win->screen->do_draw= 1;
break;
case NC_SCREEN:
+ if(note->data==ND_SUBWINACTIVE)
+ uiFreeActiveButtons(C, win->screen);
if(note->action==NA_EDITED)
win->screen->do_draw= win->screen->do_refresh= 1;
+ break;
case NC_SCENE:
if(note->data==ND_MODE)
region_cursor_set(win, note->swinid);
@@ -981,8 +989,9 @@ void ED_screen_do_listen(wmWindow *win, wmNotifier *note)
void ED_screen_draw(wmWindow *win)
{
ScrArea *sa;
- ScrArea *sa1=NULL;
- ScrArea *sa2=NULL;
+ ScrArea *sa1= NULL;
+ ScrArea *sa2= NULL;
+ ScrArea *sa3= NULL;
int dir = -1;
int dira = -1;
@@ -991,6 +1000,7 @@ void ED_screen_draw(wmWindow *win)
for(sa= win->screen->areabase.first; sa; sa= sa->next) {
if (sa->flag & AREA_FLAG_DRAWJOINFROM) sa1 = sa;
if (sa->flag & AREA_FLAG_DRAWJOINTO) sa2 = sa;
+ if (sa->flag & (AREA_FLAG_DRAWSPLIT_H|AREA_FLAG_DRAWSPLIT_V)) sa3 = sa;
drawscredge_area(sa, win->sizex, win->sizey, 0);
}
for(sa= win->screen->areabase.first; sa; sa= sa->next)
@@ -1023,7 +1033,25 @@ void ED_screen_draw(wmWindow *win)
scrarea_draw_shape_light(sa1, dira);
}
-// if(G.f & G_DEBUG) printf("draw screen\n");
+ /* splitpoint */
+ if(sa3) {
+ glEnable(GL_BLEND);
+ glColor4ub(255, 255, 255, 100);
+
+ if(sa3->flag & AREA_FLAG_DRAWSPLIT_H) {
+ sdrawline(sa3->totrct.xmin, win->eventstate->y, sa3->totrct.xmax, win->eventstate->y);
+ glColor4ub(0, 0, 0, 100);
+ sdrawline(sa3->totrct.xmin, win->eventstate->y+1, sa3->totrct.xmax, win->eventstate->y+1);
+ }
+ else {
+ sdrawline(win->eventstate->x, sa3->totrct.ymin, win->eventstate->x, sa3->totrct.ymax);
+ glColor4ub(0, 0, 0, 100);
+ sdrawline(win->eventstate->x+1, sa3->totrct.ymin, win->eventstate->x+1, sa3->totrct.ymax);
+ }
+
+ glDisable(GL_BLEND);
+ }
+
win->screen->do_draw= 0;
}
@@ -1192,8 +1220,10 @@ static void screen_cursor_set(wmWindow *win, wmEvent *event)
/* called in wm_event_system.c. sets state vars in screen, cursors */
/* event type is mouse move */
-void ED_screen_set_subwinactive(wmWindow *win, wmEvent *event)
+void ED_screen_set_subwinactive(bContext *C, wmEvent *event)
{
+ wmWindow *win= CTX_wm_window(C);
+
if(win->screen) {
bScreen *scr= win->screen;
ScrArea *sa;
@@ -1239,6 +1269,7 @@ void ED_screen_set_subwinactive(wmWindow *win, wmEvent *event)
}
else if(oldswin!=scr->subwinactive) {
region_cursor_set(win, scr->subwinactive);
+ WM_event_add_notifier(C, NC_SCREEN|ND_SUBWINACTIVE, scr);
}
}
}
@@ -1470,7 +1501,7 @@ int ED_screen_full_newspace(bContext *C, ScrArea *sa, int type)
bScreen *screen= CTX_wm_screen(C);
ScrArea *newsa= NULL;
- if(!sa || sa->full==0) {
+ if(!sa || sa->full==NULL) {
newsa= ED_screen_full_toggle(C, win, sa);
}
@@ -1554,6 +1585,9 @@ ScrArea *ED_screen_full_toggle(bContext *C, wmWindow *win, ScrArea *sa)
are no longer in the same screen */
for(ar=sa->regionbase.first; ar; ar=ar->next)
uiFreeBlocks(C, &ar->uiblocks);
+
+ /* prevent hanging header prints */
+ ED_area_headerprint(sa, NULL);
}
if(sa && sa->full) {
diff --git a/source/blender/editors/screen/screen_intern.h b/source/blender/editors/screen/screen_intern.h
index 50a3159644d..f15b1a70afa 100644
--- a/source/blender/editors/screen/screen_intern.h
+++ b/source/blender/editors/screen/screen_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/screen/screen_intern.h
+ * \ingroup edscr
+ */
+
#ifndef ED_SCREEN_INTERN_H
#define ED_SCREEN_INTERN_H
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 2c9a11b2112..136d9fb7af1 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/screen/screen_ops.c
+ * \ingroup edscr
+ */
+
+
#include <math.h>
#include <string.h>
@@ -44,6 +49,7 @@
#include "BKE_context.h"
#include "BKE_customdata.h"
+#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_report.h"
@@ -62,6 +68,7 @@
#include "ED_armature.h"
#include "ED_screen_types.h"
#include "ED_keyframes_draw.h"
+#include "ED_view3d.h"
#include "RNA_access.h"
#include "RNA_define.h"
@@ -103,6 +110,27 @@ int ED_operator_screenactive(bContext *C)
return 1;
}
+/* XXX added this to prevent anim state to change during renders */
+int ED_operator_screenactive_norender(bContext *C)
+{
+ if(G.rendering) return 0;
+ if(CTX_wm_window(C)==NULL) return 0;
+ if(CTX_wm_screen(C)==NULL) return 0;
+ return 1;
+}
+
+
+static int screen_active_editable(bContext *C)
+{
+ if(ED_operator_screenactive(C)) {
+ /* no full window splitting allowed */
+ if(CTX_wm_screen(C)->full != SCREENNORMAL)
+ return 0;
+ return 1;
+ }
+ return 0;
+}
+
/* when mouse is over area-edge */
int ED_operator_screen_mainwinactive(bContext *C)
{
@@ -277,6 +305,12 @@ int ED_operator_object_active_editable_mesh(bContext *C)
return ((ob != NULL) && !(ob->id.lib) && !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->type == OB_MESH);
}
+int ED_operator_object_active_editable_font(bContext *C)
+{
+ Object *ob = ED_object_active_context(C);
+ return ((ob != NULL) && !(ob->id.lib) && !(ob->restrictflag & OB_RESTRICT_VIEW) && ob->type == OB_FONT);
+}
+
int ED_operator_editmesh(bContext *C)
{
Object *obedit= CTX_data_edit_object(C);
@@ -1087,21 +1121,44 @@ static void SCREEN_OT_area_move(wmOperatorType *ot)
#define SPLIT_STARTED 1
#define SPLIT_PROGRESS 2
-typedef struct sAreaSplitData
- {
- int x, y; /* last used mouse position */
-
- int origval; /* for move areas */
- int bigger, smaller; /* constraints for moving new edge */
- int delta; /* delta move edge */
- int origmin, origsize; /* to calculate fac, for property storage */
-
- ScrEdge *nedge; /* new edge */
- ScrArea *sarea; /* start area */
- ScrArea *narea; /* new area */
- } sAreaSplitData;
+typedef struct sAreaSplitData {
+ int x, y; /* last used mouse position */
+
+ int origval; /* for move areas */
+ int bigger, smaller; /* constraints for moving new edge */
+ int delta; /* delta move edge */
+ int origmin, origsize; /* to calculate fac, for property storage */
+ int previewmode; /* draw previewline, then split */
+
+ ScrEdge *nedge; /* new edge */
+ ScrArea *sarea; /* start area */
+ ScrArea *narea; /* new area */
+
+} sAreaSplitData;
+
+/* generic init, menu case, doesn't need active area */
+static int area_split_menu_init(bContext *C, wmOperator *op)
+{
+ sAreaSplitData *sd;
+
+ /* custom data */
+ sd= (sAreaSplitData*)MEM_callocN(sizeof (sAreaSplitData), "op_area_split");
+ op->customdata= sd;
+
+ sd->sarea= CTX_wm_area(C);
+
+ if(sd->sarea) {
+ int dir= RNA_enum_get(op->ptr, "direction");
-/* generic init, no UI stuff here */
+ if(dir=='h')
+ sd->sarea->flag |= AREA_FLAG_DRAWSPLIT_H;
+ else
+ sd->sarea->flag |= AREA_FLAG_DRAWSPLIT_V;
+ }
+ return 1;
+}
+
+/* generic init, no UI stuff here, assumes active area */
static int area_split_init(bContext *C, wmOperator *op)
{
ScrArea *sa= CTX_wm_area(C);
@@ -1205,6 +1262,9 @@ static void area_split_exit(bContext *C, wmOperator *op)
if(sd->sarea) ED_area_tag_redraw(sd->sarea);
if(sd->narea) ED_area_tag_redraw(sd->narea);
+ if(sd->sarea)
+ sd->sarea->flag &= ~(AREA_FLAG_DRAWSPLIT_H|AREA_FLAG_DRAWSPLIT_V);
+
MEM_freeN(op->customdata);
op->customdata = NULL;
}
@@ -1221,19 +1281,19 @@ static void area_split_exit(bContext *C, wmOperator *op)
static int area_split_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
sAreaSplitData *sd;
+ int dir;
+
+ /* no full window splitting allowed */
+ if(CTX_wm_screen(C)->full != SCREENNORMAL)
+ return OPERATOR_CANCELLED;
if(event->type==EVT_ACTIONZONE_AREA) {
sActionzoneData *sad= event->customdata;
- int dir;
if(sad->modifier>0) {
return OPERATOR_PASS_THROUGH;
}
- /* no full window splitting allowed */
- if(CTX_wm_area(C)->full)
- return OPERATOR_PASS_THROUGH;
-
/* verify *sad itself */
if(sad==NULL || sad->sa1==NULL || sad->az==NULL)
return OPERATOR_PASS_THROUGH;
@@ -1257,10 +1317,42 @@ static int area_split_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(!area_split_init(C, op))
return OPERATOR_PASS_THROUGH;
- sd= (sAreaSplitData *)op->customdata;
+ }
+ else {
+ ScrEdge *actedge;
+ int x, y;
+
+ /* retrieve initial mouse coord, so we can find the active edge */
+ if(RNA_property_is_set(op->ptr, "mouse_x"))
+ x= RNA_int_get(op->ptr, "mouse_x");
+ else
+ x= event->x;
+
+ if(RNA_property_is_set(op->ptr, "mouse_y"))
+ y= RNA_int_get(op->ptr, "mouse_y");
+ else
+ y= event->x;
+
+ actedge= screen_find_active_scredge(CTX_wm_screen(C), x, y);
+ if(actedge==NULL)
+ return OPERATOR_CANCELLED;
- sd->x= event->x;
- sd->y= event->y;
+ dir= scredge_is_horizontal(actedge)?'v':'h';
+
+ RNA_enum_set(op->ptr, "direction", dir);
+
+ /* special case, adds customdata, sets defaults */
+ if(!area_split_menu_init(C, op))
+ return OPERATOR_CANCELLED;
+
+ }
+
+ sd= (sAreaSplitData *)op->customdata;
+
+ sd->x= event->x;
+ sd->y= event->y;
+
+ if(event->type==EVT_ACTIONZONE_AREA) {
/* do the split */
if(area_split_apply(C, op)) {
@@ -1271,11 +1363,14 @@ static int area_split_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-
}
else {
- /* nonmodal for now */
- return op->type->exec(C, op);
+ sd->previewmode= 1;
+ /* add temp handler for edge move or cancel */
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
+
}
return OPERATOR_PASS_THROUGH;
@@ -1299,12 +1394,16 @@ static int area_split_cancel(bContext *C, wmOperator *op)
{
sAreaSplitData *sd= (sAreaSplitData *)op->customdata;
- if (screen_area_join(C, CTX_wm_screen(C), sd->sarea, sd->narea)) {
- if (CTX_wm_area(C) == sd->narea) {
- CTX_wm_area_set(C, NULL);
- CTX_wm_region_set(C, NULL);
+ if(sd->previewmode) {
+ }
+ else {
+ if (screen_area_join(C, CTX_wm_screen(C), sd->sarea, sd->narea)) {
+ if (CTX_wm_area(C) == sd->narea) {
+ CTX_wm_area_set(C, NULL);
+ CTX_wm_region_set(C, NULL);
+ }
+ sd->narea = NULL;
}
- sd->narea = NULL;
}
area_split_exit(C, op);
@@ -1323,17 +1422,50 @@ static int area_split_modal(bContext *C, wmOperator *op, wmEvent *event)
dir= RNA_enum_get(op->ptr, "direction");
sd->delta= (dir == 'v')? event->x - sd->origval: event->y - sd->origval;
- area_move_apply_do(C, sd->origval, sd->delta, dir, sd->bigger, sd->smaller);
+ if(sd->previewmode==0)
+ area_move_apply_do(C, sd->origval, sd->delta, dir, sd->bigger, sd->smaller);
+ else {
+ if(sd->sarea) {
+ sd->sarea->flag &= ~(AREA_FLAG_DRAWSPLIT_H|AREA_FLAG_DRAWSPLIT_V);
+ ED_area_tag_redraw(sd->sarea);
+ }
+ sd->sarea= screen_areahascursor(CTX_wm_screen(C), event->x, event->y); /* area context not set */
+
+ if(sd->sarea) {
+ ED_area_tag_redraw(sd->sarea);
+ if (dir=='v') {
+ sd->origsize= sd->sarea->winx;
+ sd->origmin= sd->sarea->totrct.xmin;
+ sd->sarea->flag |= AREA_FLAG_DRAWSPLIT_V;
+ }
+ else {
+ sd->origsize= sd->sarea->winy;
+ sd->origmin= sd->sarea->totrct.ymin;
+ sd->sarea->flag |= AREA_FLAG_DRAWSPLIT_H;
+ }
+ }
+
+ CTX_wm_window(C)->screen->do_draw= 1;
+
+ }
fac= (dir == 'v') ? event->x-sd->origmin : event->y-sd->origmin;
RNA_float_set(op->ptr, "factor", fac / (float)sd->origsize);
+
break;
case LEFTMOUSE:
- if(event->val==KM_RELEASE) { /* mouse up */
+ if(sd->previewmode) {
+ area_split_apply(C, op);
area_split_exit(C, op);
return OPERATOR_FINISHED;
}
+ else {
+ if(event->val==KM_RELEASE) { /* mouse up */
+ area_split_exit(C, op);
+ return OPERATOR_FINISHED;
+ }
+ }
break;
case RIGHTMOUSE: /* cancel operation */
case ESCKEY:
@@ -1358,12 +1490,14 @@ static void SCREEN_OT_area_split(wmOperatorType *ot)
ot->invoke= area_split_invoke;
ot->modal= area_split_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= screen_active_editable;
ot->flag= OPTYPE_BLOCKING;
/* rna */
RNA_def_enum(ot->srna, "direction", prop_direction_items, 'h', "Direction", "");
RNA_def_float(ot->srna, "factor", 0.5f, 0.0, 1.0, "Factor", "", 0.0, 1.0);
+ RNA_def_int(ot->srna, "mouse_x", -100, INT_MIN, INT_MAX, "Mouse X", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "mouse_y", -100, INT_MIN, INT_MAX, "Mouse Y", "", INT_MIN, INT_MAX);
}
@@ -1591,7 +1725,7 @@ static void SCREEN_OT_frame_offset(wmOperatorType *ot)
ot->exec= frame_offset_exec;
- ot->poll= ED_operator_screenactive;
+ ot->poll= ED_operator_screenactive_norender;
ot->flag= 0;
/* rna */
@@ -1641,7 +1775,7 @@ static void SCREEN_OT_frame_jump(wmOperatorType *ot)
ot->exec= frame_jump_exec;
- ot->poll= ED_operator_screenactive;
+ ot->poll= ED_operator_screenactive_norender;
ot->flag= OPTYPE_UNDO;
/* rna */
@@ -1656,7 +1790,7 @@ static int keyframe_jump_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- bDopeSheet ads= {0};
+ bDopeSheet ads= {NULL};
DLRBT_Tree keys;
ActKeyColumn *ak;
float cfra= (scene)? (float)(CFRA) : 0.0f;
@@ -1721,7 +1855,7 @@ static void SCREEN_OT_keyframe_jump(wmOperatorType *ot)
ot->exec= keyframe_jump_exec;
- ot->poll= ED_operator_screenactive;
+ ot->poll= ED_operator_screenactive_norender;
ot->flag= OPTYPE_UNDO;
/* rna */
@@ -1793,7 +1927,18 @@ static void SCREEN_OT_screen_set(wmOperatorType *ot)
/* function to be called outside UI context, or for redo */
static int screen_full_area_exec(bContext *C, wmOperator *UNUSED(op))
{
- ED_screen_full_toggle(C, CTX_wm_window(C), CTX_wm_area(C));
+ bScreen *screen = CTX_wm_screen(C);
+ ScrArea *sa=NULL;
+
+ /* search current screen for 'fullscreen' areas */
+ /* prevents restoring info header, when mouse is over it */
+ for (sa=screen->areabase.first; sa; sa=sa->next) {
+ if (sa->full) break;
+ }
+
+ if(sa==NULL) sa= CTX_wm_area(C);
+
+ ED_screen_full_toggle(C, CTX_wm_window(C), sa);
return OPERATOR_FINISHED;
}
@@ -1859,6 +2004,7 @@ static int area_join_init(bContext *C, wmOperator *op)
sAreaJoinData* jd= NULL;
int x1, y1;
int x2, y2;
+ int shared= 0;
/* required properties, make negative to get return 0 if not set by caller */
x1= RNA_int_get(op->ptr, "min_x");
@@ -1871,6 +2017,16 @@ static int area_join_init(bContext *C, wmOperator *op)
if(sa1==NULL || sa2==NULL || sa1==sa2)
return 0;
+ /* do areas share an edge? */
+ if(sa1->v1==sa2->v1 || sa1->v1==sa2->v2 || sa1->v1==sa2->v3 || sa1->v1==sa2->v4) shared++;
+ if(sa1->v2==sa2->v1 || sa1->v2==sa2->v2 || sa1->v2==sa2->v3 || sa1->v2==sa2->v4) shared++;
+ if(sa1->v3==sa2->v1 || sa1->v3==sa2->v2 || sa1->v3==sa2->v3 || sa1->v3==sa2->v4) shared++;
+ if(sa1->v4==sa2->v1 || sa1->v4==sa2->v2 || sa1->v4==sa2->v3 || sa1->v4==sa2->v4) shared++;
+ if(shared!=2) {
+ printf("areas don't share edge\n");
+ return 0;
+ }
+
jd = (sAreaJoinData*)MEM_callocN(sizeof (sAreaJoinData), "op_area_join");
jd->sa1 = sa1;
@@ -1949,17 +2105,16 @@ static int area_join_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_int_set(op->ptr, "min_y", sad->y);
RNA_int_set(op->ptr, "max_x", event->x);
RNA_int_set(op->ptr, "max_y", event->y);
-
- if(!area_join_init(C, op))
- return OPERATOR_PASS_THROUGH;
-
- /* add temp handler */
- WM_event_add_modal_handler(C, op);
-
- return OPERATOR_RUNNING_MODAL;
}
- return OPERATOR_PASS_THROUGH;
+
+ if(!area_join_init(C, op))
+ return OPERATOR_PASS_THROUGH;
+
+ /* add temp handler */
+ WM_event_add_modal_handler(C, op);
+
+ return OPERATOR_RUNNING_MODAL;
}
static int area_join_cancel(bContext *C, wmOperator *op)
@@ -2085,7 +2240,7 @@ static void SCREEN_OT_area_join(wmOperatorType *ot)
ot->exec= area_join_exec;
ot->invoke= area_join_invoke;
ot->modal= area_join_modal;
- ot->poll= ED_operator_areaactive;
+ ot->poll= screen_active_editable;
ot->flag= OPTYPE_BLOCKING;
@@ -2096,6 +2251,58 @@ static void SCREEN_OT_area_join(wmOperatorType *ot)
RNA_def_int(ot->srna, "max_y", -100, INT_MIN, INT_MAX, "Y 2", "", INT_MIN, INT_MAX);
}
+/* ******************************* */
+
+static int screen_area_options_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ uiPopupMenu *pup;
+ uiLayout *layout;
+ PointerRNA ptr1, ptr2;
+ ScrEdge *actedge= screen_find_active_scredge(CTX_wm_screen(C), event->x, event->y);
+
+ if(actedge==NULL) return OPERATOR_CANCELLED;
+
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NONE);
+ layout= uiPupMenuLayout(pup);
+
+ WM_operator_properties_create(&ptr1, "SCREEN_OT_area_join");
+
+ /* mouse cursor on edge, '4' can fail on wide edges... */
+ RNA_int_set(&ptr1, "min_x", event->x+4);
+ RNA_int_set(&ptr1, "min_y", event->y+4);
+ RNA_int_set(&ptr1, "max_x", event->x-4);
+ RNA_int_set(&ptr1, "max_y", event->y-4);
+
+ WM_operator_properties_create(&ptr2, "SCREEN_OT_area_split");
+
+ /* store initial mouse cursor position */
+ RNA_int_set(&ptr2, "mouse_x", event->x);
+ RNA_int_set(&ptr2, "mouse_y", event->y);
+
+ uiItemFullO(layout, "SCREEN_OT_area_split", "Split Area", ICON_NONE, ptr2.data, WM_OP_INVOKE_DEFAULT, 0);
+ uiItemFullO(layout, "SCREEN_OT_area_join", "Join Area", ICON_NONE, ptr1.data, WM_OP_INVOKE_DEFAULT, 0);
+
+ uiPupMenuEnd(C, pup);
+
+ return OPERATOR_CANCELLED;
+}
+
+static void SCREEN_OT_area_options(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Area Options";
+ ot->description= "Operations for splitting and merging";
+ ot->idname= "SCREEN_OT_area_options";
+
+ /* api callbacks */
+ ot->invoke= screen_area_options_invoke;
+
+ ot->poll= ED_operator_screen_mainwinactive;
+}
+
+
+/* ******************************* */
+
static int spacedata_cleanup(bContext *C, wmOperator *op)
{
@@ -2172,11 +2379,11 @@ static int repeat_history_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(ev
if(items==0)
return OPERATOR_CANCELLED;
- pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NONE);
layout= uiPupMenuLayout(pup);
for (i=items-1, lastop= wm->operators.last; lastop; lastop= lastop->prev, i--)
- uiItemIntO(layout, lastop->type->name, ICON_NULL, op->type->idname, "index", i);
+ uiItemIntO(layout, lastop->type->name, ICON_NONE, op->type->idname, "index", i);
uiPupMenuEnd(C, pup);
@@ -2297,26 +2504,36 @@ static int region_quadview_exec(bContext *C, wmOperator *op)
/* lock views and set them */
if(sa->spacetype==SPACE_VIEW3D) {
+ /* run ED_view3d_lock() so the correct 'rv3d->viewquat' is set,
+ * otherwise when restoring rv3d->localvd the 'viewquat' won't
+ * match the 'view', set on entering localview See: [#26315],
+ *
+ * We could avoid manipulating rv3d->localvd here if exiting
+ * localview with a 4-split would assign these view locks */
RegionView3D *rv3d;
rv3d= ar->regiondata;
rv3d->viewlock= RV3D_LOCKED; rv3d->view= RV3D_VIEW_FRONT; rv3d->persp= RV3D_ORTHO;
- if (rv3d->localvd) { rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; }
+ ED_view3d_lock(rv3d);
+ if (rv3d->localvd) { rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; copy_qt_qt(rv3d->localvd->viewquat, rv3d->viewquat);}
ar= ar->next;
rv3d= ar->regiondata;
rv3d->viewlock= RV3D_LOCKED; rv3d->view= RV3D_VIEW_TOP; rv3d->persp= RV3D_ORTHO;
- if (rv3d->localvd) { rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; }
+ ED_view3d_lock(rv3d);
+ if (rv3d->localvd) { rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; copy_qt_qt(rv3d->localvd->viewquat, rv3d->viewquat);}
ar= ar->next;
rv3d= ar->regiondata;
rv3d->viewlock= RV3D_LOCKED; rv3d->view= RV3D_VIEW_RIGHT; rv3d->persp= RV3D_ORTHO;
- if (rv3d->localvd) { rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; }
+ ED_view3d_lock(rv3d);
+ if (rv3d->localvd) { rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; copy_qt_qt(rv3d->localvd->viewquat, rv3d->viewquat);}
ar= ar->next;
rv3d= ar->regiondata;
rv3d->view= RV3D_VIEW_CAMERA; rv3d->persp= RV3D_CAMOB;
- if (rv3d->localvd) {rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; }
+ ED_view3d_lock(rv3d);
+ if (rv3d->localvd) {rv3d->localvd->view = rv3d->view; rv3d->localvd->persp = rv3d->persp; copy_qt_qt(rv3d->localvd->viewquat, rv3d->viewquat);}
}
ED_area_tag_redraw(sa);
WM_event_add_notifier(C, NC_SCREEN|NA_EDITED, NULL);
@@ -2444,23 +2661,23 @@ static int header_toolbox_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *U
uiPopupMenu *pup;
uiLayout *layout;
- pup= uiPupMenuBegin(C, "Header", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Header", ICON_NONE);
layout= uiPupMenuLayout(pup);
// XXX SCREEN_OT_region_flip doesn't work - gets wrong context for active region, so added custom operator
if (ar->alignment == RGN_ALIGN_TOP)
- uiItemO(layout, "Flip to Bottom", ICON_NULL, "SCREEN_OT_header_flip");
+ uiItemO(layout, "Flip to Bottom", ICON_NONE, "SCREEN_OT_header_flip");
else
- uiItemO(layout, "Flip to Top", ICON_NULL, "SCREEN_OT_header_flip");
+ uiItemO(layout, "Flip to Top", ICON_NONE, "SCREEN_OT_header_flip");
uiItemS(layout);
/* file browser should be fullscreen all the time, but other regions can be maximised/restored... */
if (sa->spacetype != SPACE_FILE) {
if (sa->full)
- uiItemO(layout, "Tile Area", ICON_NULL, "SCREEN_OT_screen_full_area");
+ uiItemO(layout, "Tile Area", ICON_NONE, "SCREEN_OT_screen_full_area");
else
- uiItemO(layout, "Maximize Area", ICON_NULL, "SCREEN_OT_screen_full_area");
+ uiItemO(layout, "Maximize Area", ICON_NONE, "SCREEN_OT_screen_full_area");
}
uiPupMenuEnd(C, pup);
@@ -2569,7 +2786,7 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *e
else sync= (scene->flag & SCE_FRAME_DROP);
if((scene->audio.flag & AUDIO_SYNC) && !(sad->flag & ANIMPLAY_FLAG_REVERSE) && finite(time = sound_sync_scene(scene)))
- scene->r.cfra = time * FPS + 0.5;
+ scene->r.cfra = (double)time * FPS + 0.5;
else
{
if (sync) {
@@ -2579,7 +2796,7 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), wmEvent *e
scene->r.cfra -= step;
else
scene->r.cfra += step;
- wt->duration -= ((float)step)/FPS;
+ wt->duration -= ((double)step)/FPS;
}
else {
/* one frame +/- */
@@ -2678,7 +2895,7 @@ static void SCREEN_OT_animation_step(wmOperatorType *ot)
/* api callbacks */
ot->invoke= screen_animation_step;
- ot->poll= ED_operator_screenactive;
+ ot->poll= ED_operator_screenactive_norender;
}
@@ -2735,26 +2952,29 @@ static void SCREEN_OT_animation_play(wmOperatorType *ot)
/* api callbacks */
ot->exec= screen_animation_play_exec;
- ot->poll= ED_operator_screenactive;
+ ot->poll= ED_operator_screenactive_norender;
RNA_def_boolean(ot->srna, "reverse", 0, "Play in Reverse", "Animation is played backwards");
RNA_def_boolean(ot->srna, "sync", 0, "Sync", "Drop frames to maintain framerate");
}
-static int screen_animation_cancel_exec(bContext *C, wmOperator *UNUSED(op))
+static int screen_animation_cancel_exec(bContext *C, wmOperator *op)
{
bScreen *screen= CTX_wm_screen(C);
-
+
if (screen->animtimer) {
- ScreenAnimData *sad= screen->animtimer->customdata;
- Scene *scene= CTX_data_scene(C);
-
- /* reset current frame before stopping, and just send a notifier to deal with the rest
- * (since playback still needs to be stopped)
- */
- scene->r.cfra= sad->sfra;
- WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
-
+ if(RNA_boolean_get(op->ptr, "restore_frame")) {
+ ScreenAnimData *sad= screen->animtimer->customdata;
+ Scene *scene= CTX_data_scene(C);
+
+ /* reset current frame before stopping, and just send a notifier to deal with the rest
+ * (since playback still needs to be stopped)
+ */
+ scene->r.cfra= sad->sfra;
+
+ WM_event_add_notifier(C, NC_SCENE|ND_FRAME, scene);
+ }
+
/* call the other "toggling" operator to clean up now */
ED_screen_animation_play(C, 0, 0);
}
@@ -2773,6 +2993,8 @@ static void SCREEN_OT_animation_cancel(wmOperatorType *ot)
ot->exec= screen_animation_cancel_exec;
ot->poll= ED_operator_screenactive;
+
+ RNA_def_boolean(ot->srna, "restore_frame", TRUE, "Restore Frame", "Restore the frame when animation was initialized.");
}
/* ************** border select operator (template) ***************************** */
@@ -2924,6 +3146,7 @@ static void SCREEN_OT_new(wmOperatorType *ot)
/* api callbacks */
ot->exec= screen_new_exec;
+ ot->poll= WM_operator_winactive;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -2959,26 +3182,39 @@ static void SCREEN_OT_delete(wmOperatorType *ot)
static int scene_new_exec(bContext *C, wmOperator *op)
{
Scene *newscene, *scene= CTX_data_scene(C);
+ bScreen *screen= CTX_wm_screen(C);
Main *bmain= CTX_data_main(C);
int type= RNA_enum_get(op->ptr, "type");
+
+ if(type == SCE_COPY_NEW) {
+ newscene= add_scene("Scene");
+ }
+ else { /* different kinds of copying */
+ newscene= copy_scene(scene, type);
+
+ /* these can't be handled in blenkernel curently, so do them here */
+ if(type == SCE_COPY_LINK_DATA) {
+ ED_object_single_users(bmain, newscene, 0);
+ }
+ else if(type == SCE_COPY_FULL) {
+ ED_object_single_users(bmain, newscene, 1);
+ }
+ }
- newscene= copy_scene(scene, type);
-
- /* these can't be handled in blenkernel curently, so do them here */
- if(type == SCE_COPY_LINK_DATA)
- ED_object_single_users(bmain, newscene, 0);
- else if(type == SCE_COPY_FULL)
- ED_object_single_users(bmain, newscene, 1);
-
+ /* this notifier calls ED_screen_set_scene, doing a lot of UI stuff, not for inside event loops */
WM_event_add_notifier(C, NC_SCENE|ND_SCENEBROWSE, newscene);
+ if(screen)
+ screen->scene= newscene;
+
return OPERATOR_FINISHED;
}
static void SCENE_OT_new(wmOperatorType *ot)
{
static EnumPropertyItem type_items[]= {
- {SCE_COPY_EMPTY, "EMPTY", 0, "Empty", "Add empty scene"},
+ {SCE_COPY_NEW, "NEW", 0, "New", "Add new scene"},
+ {SCE_COPY_EMPTY, "EMPTY", 0, "Copy Settings", "Make a copy without any objects"},
{SCE_COPY_LINK_OB, "LINK_OBJECTS", 0, "Link Objects", "Link to the objects from the current scene"},
{SCE_COPY_LINK_DATA, "LINK_OBJECT_DATA", 0, "Link Object Data", "Copy objects linked to data from the current scene"},
{SCE_COPY_FULL, "FULL_COPY", 0, "Full Copy", "Make a full copy of the current scene"},
@@ -3041,6 +3277,7 @@ void ED_operatortypes_screen(void)
WM_operatortype_append(SCREEN_OT_area_move);
WM_operatortype_append(SCREEN_OT_area_split);
WM_operatortype_append(SCREEN_OT_area_join);
+ WM_operatortype_append(SCREEN_OT_area_options);
WM_operatortype_append(SCREEN_OT_area_dupli);
WM_operatortype_append(SCREEN_OT_area_swap);
WM_operatortype_append(SCREEN_OT_region_quadview);
@@ -3143,6 +3380,9 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
/* area move after action zones */
WM_keymap_verify_item(keymap, "SCREEN_OT_area_move", LEFTMOUSE, KM_PRESS, 0, 0);
+ WM_keymap_verify_item(keymap, "SCREEN_OT_area_options", RIGHTMOUSE, KM_PRESS, 0, 0);
+
+
/* Header Editing ------------------------------------------------ */
keymap= WM_keymap_find(keyconf, "Header", 0, 0);
@@ -3219,11 +3459,17 @@ void ED_keymap_screen(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", PAGEUPKEY, KM_PRESS, KM_CTRL, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", PAGEDOWNKEY, KM_PRESS, KM_CTRL, 0)->ptr, "next", 0);
+ WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", MEDIALAST, KM_PRESS, 0, 0);
+ RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_keyframe_jump", MEDIAFIRST, KM_PRESS, 0, 0)->ptr, "next", 0);
+
/* play (forward and backwards) */
WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", AKEY, KM_PRESS, KM_ALT|KM_SHIFT, 0)->ptr, "reverse", 1);
WM_keymap_add_item(keymap, "SCREEN_OT_animation_cancel", ESCKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "SCREEN_OT_animation_play", MEDIAPLAY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "SCREEN_OT_animation_cancel", MEDIASTOP, KM_PRESS, 0, 0);
+
/* Alternative keys for animation and sequencer playing */
#if 0 // XXX: disabled for restoring later... bad implementation
keymap= WM_keymap_find(keyconf, "Frames", 0, 0);
diff --git a/source/blender/editors/screen/screendump.c b/source/blender/editors/screen/screendump.c
index 7ac73eb8c14..c38544fdc37 100644
--- a/source/blender/editors/screen/screendump.c
+++ b/source/blender/editors/screen/screendump.c
@@ -26,6 +26,11 @@
* Making screendumps.
*/
+/** \file blender/editors/screen/screendump.c
+ * \ingroup edscr
+ */
+
+
#include <string.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/editors/sculpt_paint/CMakeLists.txt b/source/blender/editors/sculpt_paint/CMakeLists.txt
index a22ed87c182..248b6ea2b94 100644
--- a/source/blender/editors/sculpt_paint/CMakeLists.txt
+++ b/source/blender/editors/sculpt_paint/CMakeLists.txt
@@ -31,6 +31,7 @@ set(INC
../../windowmanager
../../render/extern/include
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index 44c14e2db85..37bfa460db1 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/sculpt_paint/paint_image.c
+ * \ingroup edsculpt
+ */
+
+
#include <float.h>
#include <string.h>
#include <stdio.h>
@@ -52,24 +57,26 @@
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
+#include "DNA_brush_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
-#include "DNA_brush_types.h"
+#include "DNA_texture_types.h"
#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_idprop.h"
-#include "BKE_object.h"
#include "BKE_brush.h"
#include "BKE_image.h"
+#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
+#include "BKE_node.h"
+#include "BKE_object.h"
#include "BKE_paint.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_report.h"
-#include "BKE_depsgraph.h"
-#include "BKE_library.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -505,8 +512,34 @@ static float VecZDepthOrtho(float pt[2], float v1[3], float v2[3], float v3[3],
static float VecZDepthPersp(float pt[2], float v1[3], float v2[3], float v3[3], float w[3])
{
+ float wtot_inv, wtot;
+ float w_tmp[3];
+
barycentric_weights_v2_persp(v1, v2, v3, pt, w);
- return (v1[2]*w[0]) + (v2[2]*w[1]) + (v3[2]*w[2]);
+ /* for the depth we need the weights to match what
+ * barycentric_weights_v2 would return, in this case its easiest just to
+ * undo the 4th axis division and make it unit-sum
+ *
+ * don't call barycentric_weights_v2() becaue our callers expect 'w'
+ * to be weighted from the perspective */
+ w_tmp[0]= w[0] * v1[3];
+ w_tmp[1]= w[1] * v2[3];
+ w_tmp[2]= w[2] * v3[3];
+
+ wtot = w_tmp[0]+w_tmp[1]+w_tmp[2];
+
+ if (wtot != 0.0f) {
+ wtot_inv = 1.0f/wtot;
+
+ w_tmp[0] = w_tmp[0]*wtot_inv;
+ w_tmp[1] = w_tmp[1]*wtot_inv;
+ w_tmp[2] = w_tmp[2]*wtot_inv;
+ }
+ else /* dummy values for zero area face */
+ w_tmp[0] = w_tmp[1] = w_tmp[2] = 1.0f/3.0f;
+ /* done mimicing barycentric_weights_v2() */
+
+ return (v1[2]*w_tmp[0]) + (v2[2]*w_tmp[1]) + (v3[2]*w_tmp[2]);
}
@@ -780,7 +813,7 @@ static int project_bucket_point_occluded(const ProjPaintState *ps, LinkNode *buc
return 0;
}
-/* basic line intersection, could move to arithb.c, 2 points with a horiz line
+/* basic line intersection, could move to math_geom.c, 2 points with a horiz line
* 1 for an intersection, 2 if the first point is aligned, 3 if the second point is aligned */
#define ISECT_TRUE 1
#define ISECT_TRUE_P1 2
@@ -833,7 +866,7 @@ static int line_isect_x(const float p1[2], const float p2[2], const float x_leve
x_diff= fabsf(p1[0]-p2[0]); /* yuck, horizontal line, we cant do much here */
- if (x_diff < 0.000001) { /* yuck, vertical line, we cant do much here */
+ if (x_diff < 0.000001f) { /* yuck, vertical line, we cant do much here */
*y_isect = (p1[0]+p2[0]) * 0.5f;
return ISECT_TRUE;
}
@@ -942,7 +975,7 @@ static int check_seam(const ProjPaintState *ps, const int orig_face, const int o
{
LinkNode *node;
int face_index;
- int i1, i2;
+ unsigned int i1, i2;
int i1_fidx = -1, i2_fidx = -1; /* index in face */
MFace *mf;
MTFace *tf;
@@ -1139,7 +1172,7 @@ static void project_face_seams_init(const ProjPaintState *ps, const int face_ind
#endif // PROJ_DEBUG_NOSEAMBLEED
-/* TODO - move to arithb.c */
+/* TODO - move to math_geom.c */
/* little sister we only need to know lambda */
#ifndef PROJ_DEBUG_NOSEAMBLEED
@@ -4619,6 +4652,17 @@ static void project_state_init(bContext *C, Object *ob, ProjPaintState *ps)
ps->do_mask_normal = 0; /* no need to do blending */
}
+static void paint_brush_init_tex(Brush *brush)
+{
+ /* init mtex nodes */
+ if(brush) {
+ MTex *mtex= &brush->mtex;
+ if(mtex->tex && mtex->tex->nodetree)
+ ntreeBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */
+ }
+
+}
+
static int texture_paint_init(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
@@ -4697,12 +4741,16 @@ static int texture_paint_init(bContext *C, wmOperator *op)
return 0;
}
}
-
+
+ paint_brush_init_tex(pop->s.brush);
+
/* note, if we have no UVs on the derived mesh, then we must return here */
if(pop->mode == PAINT_MODE_3D_PROJECT) {
/* initialize all data from the context */
project_state_init(C, OBACT, &pop->ps);
+
+ paint_brush_init_tex(pop->ps.brush);
pop->ps.source= PROJ_SRC_VIEW;
@@ -4767,6 +4815,15 @@ static void paint_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
pop->first= 0;
}
+static void paint_brush_exit_tex(Brush *brush)
+{
+ if(brush) {
+ MTex *mtex= &brush->mtex;
+ if(mtex->tex && mtex->tex->nodetree)
+ ntreeEndExecTree(mtex->tex->nodetree);
+ }
+}
+
static void paint_exit(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
@@ -4779,12 +4836,16 @@ static void paint_exit(bContext *C, wmOperator *op)
if(pop->restore_projection)
settings->imapaint.flag &= ~IMAGEPAINT_PROJECT_DISABLE;
+ paint_brush_exit_tex(pop->s.brush);
+
settings->imapaint.flag &= ~IMAGEPAINT_DRAWING;
imapaint_canvas_free(&pop->s);
brush_painter_free(pop->painter);
if(pop->mode == PAINT_MODE_3D_PROJECT) {
brush_set_size(pop->ps.brush, pop->orig_brush_size);
+ paint_brush_exit_tex(pop->ps.brush);
+
project_paint_end(&pop->ps);
}
@@ -5323,7 +5384,7 @@ static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *ob= CTX_data_active_object(C);
- Mesh *me= 0;
+ Mesh *me= NULL;
if(ob==NULL)
return OPERATOR_CANCELLED;
@@ -5448,7 +5509,7 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op)
{
Image *image= BLI_findlink(&CTX_data_main(C)->image, RNA_enum_get(op->ptr, "image"));
Scene *scene= CTX_data_scene(C);
- ProjPaintState ps= {0};
+ ProjPaintState ps= {NULL};
int orig_brush_size;
IDProperty *idgroup;
IDProperty *view_data= NULL;
@@ -5576,6 +5637,7 @@ static int texture_paint_image_from_view_exec(bContext *C, wmOperator *op)
int w= settings->imapaint.screen_grab_size[0];
int h= settings->imapaint.screen_grab_size[1];
int maxsize;
+ char err_out[256]= "unknown";
RNA_string_get(op->ptr, "filepath", filename);
@@ -5584,11 +5646,11 @@ static int texture_paint_image_from_view_exec(bContext *C, wmOperator *op)
if(w > maxsize) w= maxsize;
if(h > maxsize) h= maxsize;
- ibuf= ED_view3d_draw_offscreen_imbuf(CTX_data_scene(C), CTX_wm_view3d(C), CTX_wm_region(C), w, h, IB_rect);
+ ibuf= ED_view3d_draw_offscreen_imbuf(CTX_data_scene(C), CTX_wm_view3d(C), CTX_wm_region(C), w, h, IB_rect, err_out);
if(!ibuf) {
/* Mostly happens when OpenGL offscreen buffer was failed to create, */
/* but could be other reasons. Should be handled in the future. nazgul */
- BKE_report(op->reports, RPT_ERROR, "Failed to create OpenGL offscreen buffer.");
+ BKE_reportf(op->reports, RPT_ERROR, "Failed to create OpenGL offscreen buffer: %s", err_out);
return OPERATOR_CANCELLED;
}
diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h
index e0a09184e28..48fca04ac87 100644
--- a/source/blender/editors/sculpt_paint/paint_intern.h
+++ b/source/blender/editors/sculpt_paint/paint_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/sculpt_paint/paint_intern.h
+ * \ingroup edsculpt
+ */
+
+
#ifndef ED_PAINT_INTERN_H
#define ED_PAINT_INTERN_H
@@ -53,7 +58,7 @@ typedef void (*StrokeDone)(struct bContext *C, struct PaintStroke *stroke);
struct PaintStroke *paint_stroke_new(struct bContext *C,
StrokeGetLocation get_location, StrokeTestStart test_start,
- StrokeUpdateStep update_step, StrokeDone done);
+ StrokeUpdateStep update_step, StrokeDone done, int event_type);
void paint_stroke_free(struct PaintStroke *stroke);
int paint_space_stroke_enabled(struct Brush *br);
diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c
index 979b6508b16..3b4b828d0f6 100644
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@ -19,14 +19,21 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/sculpt_paint/paint_ops.c
+ * \ingroup edsculpt
+ */
+
+
#include "BLI_utildefines.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
+#include "DNA_brush_types.h"
#include "BKE_brush.h"
#include "BKE_context.h"
#include "BKE_paint.h"
+#include "BKE_main.h"
#include "ED_sculpt.h"
#include "ED_screen.h"
@@ -37,12 +44,14 @@
#include "RNA_access.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "paint_intern.h"
#include "sculpt_intern.h"
#include <string.h>
//#include <stdio.h>
+#include <stddef.h>
/* Brush operators */
static int brush_add_exec(bContext *C, wmOperator *UNUSED(op))
@@ -106,7 +115,7 @@ static int brush_scale_size_exec(bContext *C, wmOperator *op)
{
float unprojected_radius= scalar*brush_unprojected_radius(brush);
- if (unprojected_radius < 0.001) // XXX magic number
+ if (unprojected_radius < 0.001f) // XXX magic number
unprojected_radius= 0.001f;
brush_set_unprojected_radius(brush, unprojected_radius);
@@ -186,6 +195,148 @@ static void BRUSH_OT_reset(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+/* generic functions for setting the active brush based on the tool */
+static Brush *brush_tool_cycle(Main *bmain, Brush *brush_orig, const int tool, const size_t tool_offset, const int ob_mode)
+{
+ struct Brush *brush;
+
+ if(!brush_orig && !(brush_orig= bmain->brush.first)) {
+ return NULL;
+ }
+
+ /* get the next brush with the active tool */
+ for( brush= brush_orig->id.next ? brush_orig->id.next : bmain->brush.first;
+ brush != brush_orig;
+ brush= brush->id.next ? brush->id.next : bmain->brush.first)
+ {
+ if( (brush->ob_mode & ob_mode) &&
+ (*(((char *)brush) + tool_offset) == tool)
+ ) {
+ return brush;
+ }
+ }
+
+ return NULL;
+
+}
+
+static int brush_generic_tool_set(Main *bmain, Paint *paint, const int tool, const size_t tool_offset, const int ob_mode)
+{
+ struct Brush *brush, *brush_orig= paint_brush(paint);
+
+ brush= brush_tool_cycle(bmain, brush_orig, tool, tool_offset, ob_mode);
+
+ if(brush) {
+ paint_brush_set(paint, brush);
+ WM_main_add_notifier(NC_BRUSH|NA_EDITED, brush);
+ return OPERATOR_FINISHED;
+ }
+ else {
+ return OPERATOR_CANCELLED;
+ }
+}
+
+static int brush_sculpt_tool_set_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+
+ return brush_generic_tool_set(bmain, &scene->toolsettings->sculpt->paint, RNA_enum_get(op->ptr, "tool"), offsetof(Brush, sculpt_tool), OB_MODE_SCULPT);
+}
+
+static void BRUSH_OT_sculpt_tool_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Sculpt Tool Set";
+ ot->description= "Set the sculpt tool";
+ ot->idname= "BRUSH_OT_sculpt_tool_set";
+
+ /* api callbacks */
+ ot->exec= brush_sculpt_tool_set_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ ot->prop= RNA_def_enum(ot->srna, "tool", brush_sculpt_tool_items, 0, "Tool", "");
+}
+
+static int brush_vertex_tool_set_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+
+ return brush_generic_tool_set(bmain, &scene->toolsettings->vpaint->paint, RNA_enum_get(op->ptr, "tool"), offsetof(Brush, vertexpaint_tool), OB_MODE_VERTEX_PAINT);
+}
+
+static void BRUSH_OT_vertex_tool_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Vertex Paint Tool Set";
+ ot->description= "Set the vertex paint tool";
+ ot->idname= "BRUSH_OT_vertex_tool_set";
+
+ /* api callbacks */
+ ot->exec= brush_vertex_tool_set_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ ot->prop= RNA_def_enum(ot->srna, "tool", brush_vertex_tool_items, 0, "Tool", "");
+}
+
+static int brush_weight_tool_set_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+ /* vertexpaint_tool is used for weight paint mode */
+ return brush_generic_tool_set(bmain, &scene->toolsettings->wpaint->paint, RNA_enum_get(op->ptr, "tool"), offsetof(Brush, vertexpaint_tool), OB_MODE_WEIGHT_PAINT);
+}
+
+static void BRUSH_OT_weight_tool_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Weight Paint Tool Set";
+ ot->description= "Set the weight paint tool";
+ ot->idname= "BRUSH_OT_weight_tool_set";
+
+ /* api callbacks */
+ ot->exec= brush_weight_tool_set_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ ot->prop= RNA_def_enum(ot->srna, "tool", brush_vertex_tool_items, 0, "Tool", "");
+}
+
+static int brush_image_tool_set_exec(bContext *C, wmOperator *op)
+{
+ Main *bmain= CTX_data_main(C);
+ Scene *scene= CTX_data_scene(C);
+
+ return brush_generic_tool_set(bmain, &scene->toolsettings->imapaint.paint, RNA_enum_get(op->ptr, "tool"), offsetof(Brush, imagepaint_tool), OB_MODE_TEXTURE_PAINT);
+}
+
+static void BRUSH_OT_image_tool_set(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Image Paint Tool Set";
+ ot->description= "Set the image tool";
+ ot->idname= "BRUSH_OT_image_tool_set";
+
+ /* api callbacks */
+ ot->exec= brush_image_tool_set_exec;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+
+ /* props */
+ ot->prop= RNA_def_enum(ot->srna, "tool", brush_image_tool_items, 0, "Tool", "");
+}
+
+
/**************************** registration **********************************/
void ED_operatortypes_paint(void)
@@ -196,6 +347,12 @@ void ED_operatortypes_paint(void)
WM_operatortype_append(BRUSH_OT_curve_preset);
WM_operatortype_append(BRUSH_OT_reset);
+ /* note, particle uses a different system, can be added with existing operators in wm.py */
+ WM_operatortype_append(BRUSH_OT_sculpt_tool_set);
+ WM_operatortype_append(BRUSH_OT_vertex_tool_set);
+ WM_operatortype_append(BRUSH_OT_weight_tool_set);
+ WM_operatortype_append(BRUSH_OT_image_tool_set);
+
/* image */
WM_operatortype_append(PAINT_OT_texture_paint_toggle);
WM_operatortype_append(PAINT_OT_texture_paint_radial_control);
@@ -234,66 +391,66 @@ static void ed_keymap_paint_brush_switch(wmKeyMap *keymap, const char *mode)
{
wmKeyMapItem *kmi;
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ONEKEY, KM_PRESS, 0, 0);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", ONEKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 0);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", TWOKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 0);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", TWOKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 1);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", THREEKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 1);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", THREEKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 2);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FOURKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 2);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", FOURKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 3);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FIVEKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 3);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", FIVEKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 4);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SIXKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 4);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", SIXKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 5);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SEVENKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 5);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", SEVENKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 6);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", EIGHTKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 6);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", EIGHTKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 7);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", NINEKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 7);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", NINEKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 8);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ZEROKEY, KM_PRESS, 0, 0);
+ RNA_int_set(kmi->ptr, "index", 8);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", ZEROKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 9);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ONEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 9);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", ONEKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 10);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", TWOKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 10);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", TWOKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 11);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", THREEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 11);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", THREEKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 12);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FOURKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 12);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", FOURKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 13);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", FIVEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 13);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", FIVEKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 14);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SIXKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 14);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", SIXKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 15);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", SEVENKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 15);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", SEVENKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 16);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", EIGHTKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 16);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", EIGHTKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 17);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", NINEKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 17);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", NINEKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 18);
- kmi= WM_keymap_add_item(keymap, "BRUSH_OT_set_active_number", ZEROKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_int_set(kmi->ptr, "index", 18);
+ kmi= WM_keymap_add_item(keymap, "BRUSH_OT_active_index_set", ZEROKEY, KM_PRESS, KM_SHIFT, 0);
RNA_string_set(kmi->ptr, "mode", mode);
- RNA_int_set(kmi->ptr, "number", 19);
+ RNA_int_set(kmi->ptr, "index", 19);
}
static void ed_keymap_paint_brush_size(wmKeyMap *keymap, const char *UNUSED(path))
@@ -340,6 +497,16 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
ed_keymap_paint_brush_switch(keymap, "sculpt");
ed_keymap_paint_brush_size(keymap, "tool_settings.sculpt.brush.size");
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", DKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_DRAW);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", SKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_SMOOTH);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", PKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_PINCH);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", IKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_INFLATE);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", GKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_GRAB);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", LKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_LAYER);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", TKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "tool", SCULPT_TOOL_FLATTEN); /* was just TKEY in 2.4x */
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", CKEY, KM_PRESS, 0, 0)->ptr, "tool", SCULPT_TOOL_CLAY);
+ RNA_enum_set(WM_keymap_add_item(keymap, "BRUSH_OT_sculpt_tool_set", CKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "tool", SCULPT_TOOL_CREASE);
+
/* */
kmi = WM_keymap_add_item(keymap, "WM_OT_context_menu_enum", AKEY, KM_PRESS, 0, 0);
RNA_string_set(kmi->ptr, "data_path", "tool_settings.sculpt.brush.stroke_method");
@@ -410,7 +577,7 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
ed_keymap_paint_brush_size(keymap, "tool_settings.image_paint.brush.size");
kmi = WM_keymap_add_item(keymap, "WM_OT_context_toggle", MKEY, KM_PRESS, 0, 0); /* mask toggle */
- RNA_string_set(kmi->ptr, "data_path", "texture_paint_object.data.use_paint_mask");
+ RNA_string_set(kmi->ptr, "data_path", "image_paint_object.data.use_paint_mask");
/* face-mask mode */
keymap= WM_keymap_find(keyconf, "Face Mask", 0, 0);
diff --git a/source/blender/editors/sculpt_paint/paint_stroke.c b/source/blender/editors/sculpt_paint/paint_stroke.c
index 3a67775cb98..b63c2973758 100644
--- a/source/blender/editors/sculpt_paint/paint_stroke.c
+++ b/source/blender/editors/sculpt_paint/paint_stroke.c
@@ -26,6 +26,11 @@
*
*/
+/** \file blender/editors/sculpt_paint/paint_stroke.c
+ * \ingroup edsculpt
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
@@ -74,7 +79,9 @@ typedef struct PaintStroke {
e.g. in sculpt mode, stroke doesn't start until cursor
passes over the mesh */
int stroke_started;
-
+ /* event that started stroke, for modal() return */
+ int event_type;
+
StrokeGetLocation get_location;
StrokeTestStart test_start;
StrokeUpdateStep update_step;
@@ -160,7 +167,7 @@ static int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
static Snapshot snap;
static int old_size = -1;
- GLubyte* buffer = 0;
+ GLubyte* buffer = NULL;
int size;
int j;
@@ -258,11 +265,11 @@ static int load_tex(Sculpt *sd, Brush* br, ViewContext* vc)
/* it is probably worth optimizing for those cases where
the texture is not rotated by skipping the calls to
atan2, sqrtf, sin, and cos. */
- if (br->mtex.tex && (rotation > 0.001 || rotation < -0.001)) {
- const float angle = atan2(y, x) + rotation;
+ if (br->mtex.tex && (rotation > 0.001f || rotation < -0.001f)) {
+ const float angle = atan2f(y, x) + rotation;
- x = len * cos(angle);
- y = len * sin(angle);
+ x = len * cosf(angle);
+ y = len * sinf(angle);
}
x *= br->mtex.size[0];
@@ -330,20 +337,20 @@ static int project_brush_radius(RegionView3D* rv3d, float radius, float location
// create a vector that is not orthogonal to view
- if (fabsf(view[0]) < 0.1) {
- nonortho[0] = view[0] + 1;
+ if (fabsf(view[0]) < 0.1f) {
+ nonortho[0] = view[0] + 1.0f;
nonortho[1] = view[1];
nonortho[2] = view[2];
}
- else if (fabsf(view[1]) < 0.1) {
+ else if (fabsf(view[1]) < 0.1f) {
nonortho[0] = view[0];
- nonortho[1] = view[1] + 1;
+ nonortho[1] = view[1] + 1.0f;
nonortho[2] = view[2];
}
else {
nonortho[0] = view[0];
nonortho[1] = view[1];
- nonortho[2] = view[2] + 1;
+ nonortho[2] = view[2] + 1.0f;
}
// get a vector in the plane of the view
@@ -369,7 +376,7 @@ static int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radiu
float window[2];
int hit;
- stroke = paint_stroke_new(C, NULL, NULL, NULL, NULL);
+ stroke = paint_stroke_new(C, NULL, NULL, NULL, NULL, 0);
window[0] = x + stroke->vc.ar->winrct.xmin;
window[1] = y + stroke->vc.ar->winrct.ymin;
@@ -383,7 +390,7 @@ static int sculpt_get_brush_geometry(bContext* C, int x, int y, int* pixel_radiu
if (*pixel_radius == 0)
*pixel_radius = brush_size(stroke->brush);
- mul_m4_v3(stroke->vc.obact->sculpt->ob->obmat, location);
+ mul_m4_v3(stroke->vc.obact->obmat, location);
hit = 1;
}
@@ -439,10 +446,10 @@ static void paint_draw_alpha_overlay(Sculpt *sd, Brush *brush,
if(brush->mtex.brush_map_mode == MTEX_MAP_MODE_FIXED) {
/* brush rotation */
- glTranslatef(0.5f, 0.5f, 0);
- glRotatef(((brush->flag & BRUSH_RAKE) ?
- sd->last_angle : sd->special_rotation) * (180.0f/M_PI),
- 0, 0, 1);
+ glTranslatef(0.5, 0.5, 0);
+ glRotatef((double)((brush->flag & BRUSH_RAKE) ?
+ sd->last_angle : sd->special_rotation) * (180.0/M_PI),
+ 0.0, 0.0, 1.0);
glTranslatef(-0.5f, -0.5f, 0);
/* scale based on tablet pressure */
@@ -723,7 +730,7 @@ static int paint_smooth_stroke(PaintStroke *stroke, float output[2], wmEvent *ev
!(stroke->brush->flag & BRUSH_ANCHORED) &&
!(stroke->brush->flag & BRUSH_RESTORE_MESH))
{
- float u = stroke->brush->smooth_stroke_factor, v = 1.0 - u;
+ float u = stroke->brush->smooth_stroke_factor, v = 1.0f - u;
float dx = stroke->last_mouse_position[0] - event->x, dy = stroke->last_mouse_position[1] - event->y;
/* If the mouse is moving within the radius of the last move,
@@ -789,7 +796,7 @@ PaintStroke *paint_stroke_new(bContext *C,
StrokeGetLocation get_location,
StrokeTestStart test_start,
StrokeUpdateStep update_step,
- StrokeDone done)
+ StrokeDone done, int event_type)
{
PaintStroke *stroke = MEM_callocN(sizeof(PaintStroke), "PaintStroke");
@@ -801,7 +808,8 @@ PaintStroke *paint_stroke_new(bContext *C,
stroke->test_start = test_start;
stroke->update_step = update_step;
stroke->done = done;
-
+ stroke->event_type= event_type; /* for modal, return event */
+
return stroke;
}
@@ -841,8 +849,7 @@ int paint_stroke_modal(bContext *C, wmOperator *op, wmEvent *event)
//ED_region_tag_redraw(ar);
}
- /* TODO: fix hardcoded events here */
- if(event->type == LEFTMOUSE && event->val == KM_RELEASE) {
+ if(event->type == stroke->event_type && event->val == KM_RELEASE) {
/* exit stroke, free data */
if(stroke->smooth_stroke_cursor)
WM_paint_cursor_end(CTX_wm_manager(C), stroke->smooth_stroke_cursor);
diff --git a/source/blender/editors/sculpt_paint/paint_undo.c b/source/blender/editors/sculpt_paint/paint_undo.c
index 49fc1f01869..ba0c2c8be92 100644
--- a/source/blender/editors/sculpt_paint/paint_undo.c
+++ b/source/blender/editors/sculpt_paint/paint_undo.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/sculpt_paint/paint_undo.c
+ * \ingroup edsculpt
+ */
+
+
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index 9090093bd7c..1a672355e0e 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/sculpt_paint/paint_utils.c
+ * \ingroup edsculpt
+ */
#include <math.h>
#include <stdlib.h>
@@ -81,7 +84,7 @@ float paint_get_tex_pixel(Brush* br, float u, float v)
hasrgb = multitex_ext(br->mtex.tex, co, NULL, NULL, 0, &texres);
if (hasrgb & TEX_RGB)
- texres.tin = (0.35*texres.tr + 0.45*texres.tg + 0.2*texres.tb)*texres.ta;
+ texres.tin = (0.35f*texres.tr + 0.45f*texres.tg + 0.2f*texres.tb)*texres.ta;
return texres.tin;
}
@@ -144,7 +147,7 @@ static void imapaint_tri_weights(Object *ob, float *v1, float *v2, float *v3, fl
void imapaint_pick_uv(Scene *scene, Object *ob, unsigned int faceindex, int *xy, float *uv)
{
DerivedMesh *dm = mesh_get_derived_final(scene, ob, CD_MASK_BAREMESH);
- int *index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
+ const int *index = dm->getTessFaceDataArray(dm, CD_ORIGINDEX);
MTFace *tface = dm->getTessFaceDataArray(dm, CD_MTFACE), *tf;
int numfaces = dm->getNumTessFaces(dm), a, findex;
float p[2], w[3], absw, minabsw;
@@ -156,7 +159,7 @@ void imapaint_pick_uv(Scene *scene, Object *ob, unsigned int faceindex, int *xy,
/* test all faces in the derivedmesh with the original index of the picked face */
for(a = 0; a < numfaces; a++) {
- findex= (index)? index[a]: a;
+ findex= index ? index[a]: a;
if(findex == faceindex) {
dm->getTessFace(dm, a, &mf);
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index e16dac94076..0b28d84bf39 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/sculpt_paint/paint_vertex.c
+ * \ingroup edsculpt
+ */
+
+
#include <math.h>
#include <string.h>
@@ -124,15 +129,18 @@ int weight_paint_mode_poll(bContext *C)
int weight_paint_poll(bContext *C)
{
- Object *ob = CTX_data_active_object(C);
-
- if(ob && ob->mode & OB_MODE_WEIGHT_PAINT &&
- paint_brush(&CTX_data_tool_settings(C)->wpaint->paint)) {
- ScrArea *sa= CTX_wm_area(C);
- if(sa->spacetype==SPACE_VIEW3D) {
- ARegion *ar= CTX_wm_region(C);
- if(ar->regiontype==RGN_TYPE_WINDOW)
- return 1;
+ Object *ob= CTX_data_active_object(C);
+ ScrArea *sa;
+
+ if( (ob != NULL) &&
+ (ob->mode & OB_MODE_WEIGHT_PAINT) &&
+ (paint_brush(&CTX_data_tool_settings(C)->wpaint->paint) != NULL) &&
+ (sa= CTX_wm_area(C)) &&
+ (sa->spacetype == SPACE_VIEW3D)
+ ) {
+ ARegion *ar= CTX_wm_region(C);
+ if(ar->regiontype==RGN_TYPE_WINDOW) {
+ return 1;
}
}
return 0;
@@ -165,13 +173,13 @@ static unsigned int rgba_to_mcol(float r, float g, float b, float a)
unsigned int col;
char *cp;
- ir= floor(255.0*r);
+ ir= floor(255.0f * r);
if(ir<0) ir= 0; else if(ir>255) ir= 255;
- ig= floor(255.0*g);
+ ig= floor(255.0f * g);
if(ig<0) ig= 0; else if(ig>255) ig= 255;
- ib= floor(255.0*b);
+ ib= floor(255.0f * b);
if(ib<0) ib= 0; else if(ib>255) ib= 255;
- ia= floor(255.0*a);
+ ia= floor(255.0f * a);
if(ia<0) ia= 0; else if(ia>255) ia= 255;
cp= (char *)&col;
@@ -200,7 +208,7 @@ static void do_shared_vertex_tesscol(Mesh *me)
short *scolmain, *scol;
char *mcol;
- if(me->mcol==0 || me->totvert==0 || me->totface==0) return;
+ if(me->mcol==NULL || me->totvert==0 || me->totface==0) return;
scolmain= MEM_callocN(4*sizeof(short)*me->totvert, "colmain");
@@ -318,7 +326,7 @@ static void make_vertexcol(Object *ob) /* single ob */
Mesh *me;
if(!ob || ob->id.lib) return;
me= get_mesh(ob);
- if(me==0) return;
+ if(me==NULL) return;
if(me->edit_btmesh) return;
/* copies from shadedisplist to mcol */
@@ -380,7 +388,7 @@ void vpaint_fill(Object *ob, unsigned int paintcol)
int i, j, selected;
me= get_mesh(ob);
- if(me==0 || me->totface==0) return;
+ if(me==NULL || me->totface==0) return;
if(!me->mcol)
make_vertexcol(ob);
@@ -428,7 +436,7 @@ void wpaint_fill(VPaint *wp, Object *ob, float paintweight)
int selected;
me= ob->data;
- if(me==0 || me->totface==0 || me->dvert==0 || !me->mface) return;
+ if(me==NULL || me->totface==0 || me->dvert==NULL || !me->mface) return;
selected= (me->editflag & ME_EDIT_PAINT_MASK);
@@ -734,7 +742,7 @@ static void vpaint_blend(VPaint *vp, unsigned int *col, unsigned int *colorig, u
unsigned int testcol=0, a;
char *cp, *ct, *co;
- alpha= (int)(255.0*brush_alpha(brush));
+ alpha= (int)(255.0f*brush_alpha(brush));
if(brush->vertexpaint_tool==VP_MIX || brush->vertexpaint_tool==VP_BLUR) testcol= mcol_blend( *colorig, paintcol, alpha);
else if(brush->vertexpaint_tool==VP_ADD) testcol= mcol_add( *colorig, paintcol, alpha);
@@ -829,7 +837,7 @@ static float calc_vp_alpha_dl(VPaint *vp, ViewContext *vc, float vpimat[][3], fl
/* transpose ! */
fac= vpimat[2][0]*no[0]+vpimat[2][1]*no[1]+vpimat[2][2]*no[2];
- if(fac>0.0) {
+ if(fac > 0.0f) {
dx= vpimat[0][0]*no[0]+vpimat[0][1]*no[1]+vpimat[0][2]*no[2];
dy= vpimat[1][0]*no[0]+vpimat[1][1]*no[1]+vpimat[1][2]*no[2];
@@ -864,20 +872,20 @@ static void wpaint_blend(VPaint *wp, MDeformWeight *dw, MDeformWeight *uw, float
}
if(tool==VP_MIX || tool==VP_BLUR)
- dw->weight = paintval*alpha + dw->weight*(1.0-alpha);
+ dw->weight = paintval*alpha + dw->weight*(1.0f-alpha);
else if(tool==VP_ADD)
dw->weight += paintval*alpha;
else if(tool==VP_SUB)
dw->weight -= paintval*alpha;
else if(tool==VP_MUL)
/* first mul, then blend the fac */
- dw->weight = ((1.0-alpha) + alpha*paintval)*dw->weight;
+ dw->weight = ((1.0f-alpha) + alpha*paintval)*dw->weight;
else if(tool==VP_LIGHTEN) {
if (dw->weight < paintval)
- dw->weight = paintval*alpha + dw->weight*(1.0-alpha);
+ dw->weight = paintval*alpha + dw->weight*(1.0f-alpha);
} else if(tool==VP_DARKEN) {
if (dw->weight > paintval)
- dw->weight = paintval*alpha + dw->weight*(1.0-alpha);
+ dw->weight = paintval*alpha + dw->weight*(1.0f-alpha);
}
CLAMP(dw->weight, 0.0f, 1.0f);
@@ -887,22 +895,22 @@ static void wpaint_blend(VPaint *wp, MDeformWeight *dw, MDeformWeight *uw, float
alpha= brush_alpha(brush);
if(tool==VP_MIX || tool==VP_BLUR)
- testw = paintval*alpha + uw->weight*(1.0-alpha);
+ testw = paintval*alpha + uw->weight*(1.0f-alpha);
else if(tool==VP_ADD)
testw = uw->weight + paintval*alpha;
else if(tool==VP_SUB)
testw = uw->weight - paintval*alpha;
else if(tool==VP_MUL)
/* first mul, then blend the fac */
- testw = ((1.0-alpha) + alpha*paintval)*uw->weight;
+ testw = ((1.0f-alpha) + alpha*paintval)*uw->weight;
else if(tool==VP_LIGHTEN) {
if (uw->weight < paintval)
- testw = paintval*alpha + uw->weight*(1.0-alpha);
+ testw = paintval*alpha + uw->weight*(1.0f-alpha);
else
testw = uw->weight;
} else if(tool==VP_DARKEN) {
if (uw->weight > paintval)
- testw = paintval*alpha + uw->weight*(1.0-alpha);
+ testw = paintval*alpha + uw->weight*(1.0f-alpha);
else
testw = uw->weight;
}
@@ -1673,7 +1681,7 @@ static int wpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
op->customdata = paint_stroke_new(C, NULL, wpaint_stroke_test_start,
wpaint_stroke_update_step,
- wpaint_stroke_done);
+ wpaint_stroke_done, event->type);
/* add modal handler */
WM_event_add_modal_handler(C, op);
@@ -1715,7 +1723,7 @@ static int weight_paint_set_exec(bContext *C, wmOperator *UNUSED(op))
void PAINT_OT_weight_set(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Weight Set";
+ ot->name= "Set Weight";
ot->idname= "PAINT_OT_weight_set";
/* api callbacks */
@@ -1938,7 +1946,7 @@ static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob, int index
for(i = 0; i < (mface->v4 ? 4 : 3); ++i) {
alpha= calc_vp_alpha_dl(vp, vc, vpd->vpimat, vpd->vertexcosnos+6*(&mface->v1)[i], mval, pressure);
if(alpha)
- vpaint_blend(vp, mcol+i, mcolorig+i, vpd->paintcol, (int)(alpha*255.0));
+ vpaint_blend(vp, mcol+i, mcolorig+i, vpd->paintcol, (int)(alpha*255.0f));
}
}
#endif
@@ -2115,7 +2123,7 @@ static int vpaint_invoke(bContext *C, wmOperator *op, wmEvent *event)
op->customdata = paint_stroke_new(C, NULL, vpaint_stroke_test_start,
vpaint_stroke_update_step,
- vpaint_stroke_done);
+ vpaint_stroke_done, event->type);
/* add modal handler */
WM_event_add_modal_handler(C, op);
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index a94cb9dd971..8b7be205b12 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/editors/sculpt_paint/sculpt.c
+ * \ingroup edsculpt
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
@@ -59,6 +64,7 @@
#include "BKE_paint.h"
#include "BKE_report.h"
#include "BKE_lattice.h" /* for armature_deform_verts */
+#include "BKE_node.h"
#include "BIF_glutil.h"
@@ -259,6 +265,8 @@ typedef struct StrokeCache {
int alt_smooth;
float plane_trim_squared;
+
+ rcti previous_r; /* previous redraw rectangle */
} StrokeCache;
/*** BVH Tree ***/
@@ -551,8 +559,8 @@ static float calc_overlap(StrokeCache *cache, const char symm, const char axis,
//distsq = len_squared_v3v3(mirror, cache->traced_location);
distsq = len_squared_v3v3(mirror, cache->true_location);
- if (distsq <= 4*(cache->radius_squared))
- return (2*(cache->radius) - sqrt(distsq)) / (2*(cache->radius));
+ if (distsq <= 4.0f*(cache->radius_squared))
+ return (2.0f*(cache->radius) - sqrtf(distsq)) / (2.0f*(cache->radius));
else
return 0;
}
@@ -745,12 +753,12 @@ static float tex_strength(SculptSession *ss, Brush *br, float *point, const floa
/* it is probably worth optimizing for those cases where
the texture is not rotated by skipping the calls to
atan2, sqrtf, sin, and cos. */
- if (rotation > 0.001 || rotation < -0.001) {
- const float angle = atan2(y, x) + rotation;
+ if (rotation > 0.001f || rotation < -0.001f) {
+ const float angle = atan2f(y, x) + rotation;
const float flen = sqrtf(x*x + y*y);
- x = flen * cos(angle);
- y = flen * sin(angle);
+ x = flen * cosf(angle);
+ y = flen * sinf(angle);
}
x *= br->mtex.size[0];
@@ -812,7 +820,7 @@ static void sculpt_clip(Sculpt *sd, SculptSession *ss, float *co, const float va
if(sd->flags & (SCULPT_LOCK_X << i))
continue;
- if((ss->cache->flag & (CLIP_X << i)) && (fabs(co[i]) <= ss->cache->clip_tolerance[i]))
+ if((ss->cache->flag & (CLIP_X << i)) && (fabsf(co[i]) <= ss->cache->clip_tolerance[i]))
co[i]= 0.0f;
else
co[i]= val[i];
@@ -828,8 +836,9 @@ static void add_norm_if(float view_vec[3], float out[3], float out_flip[3], floa
}
}
-static void calc_area_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNode **nodes, int totnode)
+static void calc_area_normal(Sculpt *sd, Object *ob, float an[3], PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
int n;
float out_flip[3] = {0.0f, 0.0f, 0.0f};
@@ -846,7 +855,7 @@ static void calc_area_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNod
float private_an[3] = {0.0f, 0.0f, 0.0f};
float private_out_flip[3] = {0.0f, 0.0f, 0.0f};
- unode = sculpt_undo_push_node(ss, nodes[n]);
+ unode = sculpt_undo_push_node(ob, nodes[n]);
sculpt_brush_test_init(ss, &test);
if(ss->cache->original) {
@@ -892,8 +901,9 @@ static void calc_area_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNod
/* This initializes the faces to be moved for this sculpt for draw/layer/flatten; then it
finds average normal for all active vertices - note that this is called once for each mirroring direction */
-static void calc_sculpt_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHNode **nodes, int totnode)
+static void calc_sculpt_normal(Sculpt *sd, Object *ob, float an[3], PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
if (ss->cache->mirror_symmetry_pass == 0 &&
@@ -924,7 +934,7 @@ static void calc_sculpt_normal(Sculpt *sd, SculptSession *ss, float an[3], PBVHN
break;
case SCULPT_DISP_DIR_AREA:
- calc_area_normal(sd, ss, an, nodes, totnode);
+ calc_area_normal(sd, ob, an, nodes, totnode);
default:
break;
@@ -1127,8 +1137,9 @@ static void do_multires_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode *no
}
}
-static void smooth(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float bstrength)
+static void smooth(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float bstrength)
{
+ SculptSession *ss = ob->sculpt;
const int max_iterations = 4;
const float fract = 1.0f/max_iterations;
int iteration, n, count;
@@ -1150,23 +1161,25 @@ static void smooth(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode,
}
if(ss->multires)
- multires_stitch_grids(ss->ob);
+ multires_stitch_grids(ob);
}
}
-static void do_smooth_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_smooth_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
- smooth(sd, ss, nodes, totnode, ss->cache->bstrength);
+ SculptSession *ss = ob->sculpt;
+ smooth(sd, ob, nodes, totnode, ss->cache->bstrength);
}
-static void do_draw_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_draw_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float offset[3], area_normal[3];
float bstrength= ss->cache->bstrength;
int n;
- calc_sculpt_normal(sd, ss, area_normal, nodes, totnode);
+ calc_sculpt_normal(sd, ob, area_normal, nodes, totnode);
/* offset with as much as possible factored in already */
mul_v3_v3fl(offset, area_normal, ss->cache->radius);
@@ -1200,15 +1213,16 @@ static void do_draw_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int t
}
}
-static void do_crease_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_crease_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float offset[3], area_normal[3];
float bstrength= ss->cache->bstrength;
float flippedbstrength, crease_correction;
int n;
- calc_sculpt_normal(sd, ss, area_normal, nodes, totnode);
+ calc_sculpt_normal(sd, ob, area_normal, nodes, totnode);
/* offset with as much as possible factored in already */
mul_v3_v3fl(offset, area_normal, ss->cache->radius);
@@ -1263,8 +1277,9 @@ static void do_crease_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
}
}
-static void do_pinch_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_pinch_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float bstrength= ss->cache->bstrength;
int n;
@@ -1295,8 +1310,9 @@ static void do_pinch_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
}
}
-static void do_grab_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_grab_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush= paint_brush(&sd->paint);
float bstrength= ss->cache->bstrength;
float grab_delta[3], an[3];
@@ -1307,7 +1323,7 @@ static void do_grab_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int t
int cache= 1;
/* grab brush requires to test on original data */
SWAP(int, ss->cache->original, cache);
- calc_sculpt_normal(sd, ss, an, nodes, totnode);
+ calc_sculpt_normal(sd, ob, an, nodes, totnode);
SWAP(int, ss->cache->original, cache);
}
@@ -1330,7 +1346,7 @@ static void do_grab_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int t
short (*origno)[3];
float (*proxy)[3];
- unode= sculpt_undo_push_node(ss, nodes[n]);
+ unode= sculpt_undo_push_node(ob, nodes[n]);
origco= unode->co;
origno= unode->no;
@@ -1352,8 +1368,9 @@ static void do_grab_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int t
}
}
-static void do_nudge_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_nudge_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float bstrength = ss->cache->bstrength;
float grab_delta[3];
@@ -1363,7 +1380,7 @@ static void do_nudge_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
- calc_sculpt_normal(sd, ss, an, nodes, totnode);
+ calc_sculpt_normal(sd, ob, an, nodes, totnode);
cross_v3_v3v3(tmp, an, grab_delta);
cross_v3_v3v3(cono, tmp, an);
@@ -1392,8 +1409,9 @@ static void do_nudge_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
}
}
-static void do_snake_hook_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_snake_hook_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float bstrength = ss->cache->bstrength;
float grab_delta[3], an[3];
@@ -1401,7 +1419,7 @@ static void do_snake_hook_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes,
float len;
if (brush->normal_weight > 0 || brush->flag & BRUSH_FRONTFACE)
- calc_sculpt_normal(sd, ss, an, nodes, totnode);
+ calc_sculpt_normal(sd, ob, an, nodes, totnode);
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
@@ -1440,8 +1458,9 @@ static void do_snake_hook_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes,
}
}
-static void do_thumb_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_thumb_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float bstrength = ss->cache->bstrength;
float grab_delta[3];
@@ -1451,7 +1470,7 @@ static void do_thumb_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
copy_v3_v3(grab_delta, ss->cache->grab_delta_symmetry);
- calc_sculpt_normal(sd, ss, an, nodes, totnode);
+ calc_sculpt_normal(sd, ob, an, nodes, totnode);
cross_v3_v3v3(tmp, an, grab_delta);
cross_v3_v3v3(cono, tmp, an);
@@ -1465,7 +1484,7 @@ static void do_thumb_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
short (*origno)[3];
float (*proxy)[3];
- unode= sculpt_undo_push_node(ss, nodes[n]);
+ unode= sculpt_undo_push_node(ob, nodes[n]);
origco= unode->co;
origno= unode->no;
@@ -1487,8 +1506,9 @@ static void do_thumb_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
}
}
-static void do_rotate_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_rotate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush= paint_brush(&sd->paint);
float bstrength= ss->cache->bstrength;
float an[3];
@@ -1497,7 +1517,7 @@ static void do_rotate_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
static const int flip[8] = { 1, -1, -1, 1, -1, 1, 1, -1 };
float angle = ss->cache->vertex_rotation * flip[ss->cache->mirror_symmetry_pass];
- calc_sculpt_normal(sd, ss, an, nodes, totnode);
+ calc_sculpt_normal(sd, ob, an, nodes, totnode);
axis_angle_to_mat3(m, an, angle);
@@ -1510,7 +1530,7 @@ static void do_rotate_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
short (*origno)[3];
float (*proxy)[3];
- unode= sculpt_undo_push_node(ss, nodes[n]);
+ unode= sculpt_undo_push_node(ob, nodes[n]);
origco= unode->co;
origno= unode->no;
@@ -1534,8 +1554,9 @@ static void do_rotate_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
}
}
-static void do_layer_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_layer_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float bstrength= ss->cache->bstrength;
float area_normal[3], offset[3];
@@ -1545,7 +1566,7 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
if(bstrength < 0)
lim = -lim;
- calc_sculpt_normal(sd, ss, area_normal, nodes, totnode);
+ calc_sculpt_normal(sd, ob, area_normal, nodes, totnode);
mul_v3_v3v3(offset, ss->cache->scale, area_normal);
@@ -1559,7 +1580,7 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
//proxy= BLI_pbvh_node_add_proxy(ss->pbvh, nodes[n])->co;
- unode= sculpt_undo_push_node(ss, nodes[n]);
+ unode= sculpt_undo_push_node(ob, nodes[n]);
origco=unode->co;
if(!unode->layer_disp)
{
@@ -1605,8 +1626,9 @@ static void do_layer_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
}
}
-static void do_inflate_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_inflate_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float bstrength= ss->cache->bstrength;
int n;
@@ -1640,8 +1662,9 @@ static void do_inflate_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, in
}
}
-static void calc_flatten_center(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float fc[3])
+static void calc_flatten_center(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float fc[3])
{
+ SculptSession *ss = ob->sculpt;
int n;
float count = 0;
@@ -1658,7 +1681,7 @@ static void calc_flatten_center(Sculpt *sd, SculptSession *ss, PBVHNode **nodes,
float private_fc[3] = {0.0f, 0.0f, 0.0f};
int private_count = 0;
- unode = sculpt_undo_push_node(ss, nodes[n]);
+ unode = sculpt_undo_push_node(ob, nodes[n]);
sculpt_brush_test_init(ss, &test);
if(ss->cache->original) {
@@ -1692,8 +1715,9 @@ static void calc_flatten_center(Sculpt *sd, SculptSession *ss, PBVHNode **nodes,
/* this calculates flatten center and area normal together,
amortizing the memory bandwidth and loop overhead to calculate both at the same time */
-static void calc_area_normal_and_flatten_center(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float an[3], float fc[3])
+static void calc_area_normal_and_flatten_center(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float an[3], float fc[3])
{
+ SculptSession *ss = ob->sculpt;
int n;
// an
@@ -1720,7 +1744,7 @@ static void calc_area_normal_and_flatten_center(Sculpt *sd, SculptSession *ss, P
float private_fc[3] = {0.0f, 0.0f, 0.0f};
int private_count = 0;
- unode = sculpt_undo_push_node(ss, nodes[n]);
+ unode = sculpt_undo_push_node(ob, nodes[n]);
sculpt_brush_test_init(ss, &test);
if(ss->cache->original) {
@@ -1788,8 +1812,9 @@ static void calc_area_normal_and_flatten_center(Sculpt *sd, SculptSession *ss, P
}
}
-static void calc_sculpt_plane(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode, float an[3], float fc[3])
+static void calc_sculpt_plane(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode, float an[3], float fc[3])
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
if (ss->cache->mirror_symmetry_pass == 0 &&
@@ -1820,7 +1845,7 @@ static void calc_sculpt_plane(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, i
break;
case SCULPT_DISP_DIR_AREA:
- calc_area_normal_and_flatten_center(sd, ss, nodes, totnode, an, fc);
+ calc_area_normal_and_flatten_center(sd, ob, nodes, totnode, an, fc);
default:
break;
@@ -1829,7 +1854,7 @@ static void calc_sculpt_plane(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, i
// fc
/* flatten center has not been calculated yet if we are not using the area normal */
if (brush->sculpt_plane != SCULPT_DISP_DIR_AREA)
- calc_flatten_center(sd, ss, nodes, totnode, fc);
+ calc_flatten_center(sd, ob, nodes, totnode, fc);
// an
copy_v3_v3(ss->cache->last_area_normal, an);
@@ -1905,8 +1930,9 @@ static float get_offset(Sculpt *sd, SculptSession *ss)
return rv;
}
-static void do_flatten_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_flatten_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float bstrength = ss->cache->bstrength;
@@ -1923,7 +1949,7 @@ static void do_flatten_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, in
float temp[3];
- calc_sculpt_plane(sd, ss, nodes, totnode, an, fc);
+ calc_sculpt_plane(sd, ob, nodes, totnode, an, fc);
displace = radius*offset;
@@ -1964,8 +1990,9 @@ static void do_flatten_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, in
}
}
-static void do_clay_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_clay_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float bstrength = ss->cache->bstrength;
@@ -1984,7 +2011,7 @@ static void do_clay_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int t
int flip;
- calc_sculpt_plane(sd, ss, nodes, totnode, an, fc);
+ calc_sculpt_plane(sd, ob, nodes, totnode, an, fc);
flip = bstrength < 0;
@@ -2037,8 +2064,9 @@ static void do_clay_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int t
}
}
-static void do_clay_tubes_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_clay_tubes_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float bstrength = ss->cache->bstrength;
@@ -2060,10 +2088,10 @@ static void do_clay_tubes_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes,
int flip;
- calc_sculpt_plane(sd, ss, nodes, totnode, sn, fc);
+ calc_sculpt_plane(sd, ob, nodes, totnode, sn, fc);
if (brush->sculpt_plane != SCULPT_DISP_DIR_AREA || (brush->flag & BRUSH_ORIGINAL_NORMAL))
- calc_area_normal(sd, ss, an, nodes, totnode);
+ calc_area_normal(sd, ob, an, nodes, totnode);
else
copy_v3_v3(an, sn);
@@ -2127,8 +2155,9 @@ static void do_clay_tubes_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes,
}
}
-static void do_fill_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_fill_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
float bstrength = ss->cache->bstrength;
@@ -2144,7 +2173,7 @@ static void do_fill_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int t
float temp[3];
- calc_sculpt_plane(sd, ss, nodes, totnode, an, fc);
+ calc_sculpt_plane(sd, ob, nodes, totnode, an, fc);
displace = radius*offset;
@@ -2187,8 +2216,9 @@ static void do_fill_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int t
}
}
-static void do_scrape_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int totnode)
+static void do_scrape_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
rctf mr;
float xrad, yrad;
@@ -2205,7 +2235,7 @@ static void do_scrape_brush(Sculpt *sd, SculptSession *ss, PBVHNode **nodes, int
float temp[3];
- calc_sculpt_plane(sd, ss, nodes, totnode, an, fc);
+ calc_sculpt_plane(sd, ob, nodes, totnode, an, fc);
displace = -radius*offset;
@@ -2291,15 +2321,16 @@ void sculpt_vertcos_to_key(Object *ob, KeyBlock *kb, float (*vertCos)[3])
for (a= 0; a < me->totvert; a++, mvert++)
VECCOPY(mvert->co, vertCos[a]);
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+ mesh_calc_normals(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
}
/* apply new coords on active key block */
vertcos_to_key(ob, kb, vertCos);
}
-static void do_brush_action(Sculpt *sd, SculptSession *ss, Brush *brush)
+static void do_brush_action(Sculpt *sd, Object *ob, Brush *brush)
{
+ SculptSession *ss = ob->sculpt;
SculptSearchSphereData data;
PBVHNode **nodes = NULL;
int n, totnode;
@@ -2315,71 +2346,71 @@ static void do_brush_action(Sculpt *sd, SculptSession *ss, Brush *brush)
if (totnode) {
#pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
for (n= 0; n < totnode; n++) {
- sculpt_undo_push_node(ss, nodes[n]);
+ sculpt_undo_push_node(ob, nodes[n]);
BLI_pbvh_node_mark_update(nodes[n]);
}
/* Apply one type of brush action */
switch(brush->sculpt_tool){
case SCULPT_TOOL_DRAW:
- do_draw_brush(sd, ss, nodes, totnode);
+ do_draw_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_SMOOTH:
- do_smooth_brush(sd, ss, nodes, totnode);
+ do_smooth_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_CREASE:
- do_crease_brush(sd, ss, nodes, totnode);
+ do_crease_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_BLOB:
- do_crease_brush(sd, ss, nodes, totnode);
+ do_crease_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_PINCH:
- do_pinch_brush(sd, ss, nodes, totnode);
+ do_pinch_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_INFLATE:
- do_inflate_brush(sd, ss, nodes, totnode);
+ do_inflate_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_GRAB:
- do_grab_brush(sd, ss, nodes, totnode);
+ do_grab_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_ROTATE:
- do_rotate_brush(sd, ss, nodes, totnode);
+ do_rotate_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_SNAKE_HOOK:
- do_snake_hook_brush(sd, ss, nodes, totnode);
+ do_snake_hook_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_NUDGE:
- do_nudge_brush(sd, ss, nodes, totnode);
+ do_nudge_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_THUMB:
- do_thumb_brush(sd, ss, nodes, totnode);
+ do_thumb_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_LAYER:
- do_layer_brush(sd, ss, nodes, totnode);
+ do_layer_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_FLATTEN:
- do_flatten_brush(sd, ss, nodes, totnode);
+ do_flatten_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_CLAY:
- do_clay_brush(sd, ss, nodes, totnode);
+ do_clay_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_CLAY_TUBES:
- do_clay_tubes_brush(sd, ss, nodes, totnode);
+ do_clay_tubes_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_FILL:
- do_fill_brush(sd, ss, nodes, totnode);
+ do_fill_brush(sd, ob, nodes, totnode);
break;
case SCULPT_TOOL_SCRAPE:
- do_scrape_brush(sd, ss, nodes, totnode);
+ do_scrape_brush(sd, ob, nodes, totnode);
break;
}
if (brush->sculpt_tool != SCULPT_TOOL_SMOOTH && brush->autosmooth_factor > 0) {
if (brush->flag & BRUSH_INVERSE_SMOOTH_PRESSURE) {
- smooth(sd, ss, nodes, totnode, brush->autosmooth_factor*(1-ss->cache->pressure));
+ smooth(sd, ob, nodes, totnode, brush->autosmooth_factor*(1-ss->cache->pressure));
}
else {
- smooth(sd, ss, nodes, totnode, brush->autosmooth_factor);
+ smooth(sd, ob, nodes, totnode, brush->autosmooth_factor);
}
}
@@ -2388,9 +2419,9 @@ static void do_brush_action(Sculpt *sd, SculptSession *ss, Brush *brush)
}
/* flush displacement from deformed PBVH vertex to original mesh */
-static void sculpt_flush_pbvhvert_deform(SculptSession *ss, PBVHVertexIter *vd)
+static void sculpt_flush_pbvhvert_deform(Object *ob, PBVHVertexIter *vd)
{
- Object *ob= ss->ob;
+ SculptSession *ss = ob->sculpt;
Mesh *me= ob->data;
float disp[3], newco[3];
int index= vd->vert_indices[vd->i];
@@ -2406,8 +2437,9 @@ static void sculpt_flush_pbvhvert_deform(SculptSession *ss, PBVHVertexIter *vd)
copy_v3_v3(me->mvert[index].co, newco);
}
-static void sculpt_combine_proxies(Sculpt *sd, SculptSession *ss)
+static void sculpt_combine_proxies(Sculpt *sd, Object *ob)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush= paint_brush(&sd->paint);
PBVHNode** nodes;
int totnode, n;
@@ -2427,7 +2459,7 @@ static void sculpt_combine_proxies(Sculpt *sd, SculptSession *ss)
float (*orco)[3];
if(use_orco)
- orco= sculpt_undo_push_node(ss, nodes[n])->co;
+ orco= sculpt_undo_push_node(ob, nodes[n])->co;
BLI_pbvh_node_get_proxies(nodes[n], &proxies, &proxy_count);
@@ -2446,7 +2478,7 @@ static void sculpt_combine_proxies(Sculpt *sd, SculptSession *ss)
sculpt_clip(sd, ss, vd.co, val);
if(ss->modifiers_active)
- sculpt_flush_pbvhvert_deform(ss, &vd);
+ sculpt_flush_pbvhvert_deform(ob, &vd);
}
BLI_pbvh_vertex_iter_end;
@@ -2459,8 +2491,9 @@ static void sculpt_combine_proxies(Sculpt *sd, SculptSession *ss)
}
/* copy the modified vertices from bvh to the active key */
-static void sculpt_update_keyblock(SculptSession *ss)
+static void sculpt_update_keyblock(Object *ob)
{
+ SculptSession *ss = ob->sculpt;
float (*vertCos)[3];
/* Keyblock update happens after hadning deformation caused by modifiers,
@@ -2469,7 +2502,7 @@ static void sculpt_update_keyblock(SculptSession *ss)
else vertCos = BLI_pbvh_get_vertCos(ss->pbvh);
if (vertCos) {
- sculpt_vertcos_to_key(ss->ob, ss->kb, vertCos);
+ sculpt_vertcos_to_key(ob, ss->kb, vertCos);
if(vertCos != ss->orig_cos)
MEM_freeN(vertCos);
@@ -2477,40 +2510,53 @@ static void sculpt_update_keyblock(SculptSession *ss)
}
/* flush displacement from deformed PBVH to original layer */
-static void sculpt_flush_stroke_deform(Sculpt *sd, SculptSession *ss)
+static void sculpt_flush_stroke_deform(Sculpt *sd, Object *ob)
{
- if(!ss->kb) {
- Object *ob= ss->ob;
+ SculptSession *ss = ob->sculpt;
+ Brush *brush= paint_brush(&sd->paint);
+
+ if(ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER)) {
+ /* this brushes aren't using proxies, so sculpt_combine_proxies() wouldn't
+ propagate needed deformation to original base */
+
+ int n, totnode;
Mesh *me= (Mesh*)ob->data;
- Brush *brush= paint_brush(&sd->paint);
+ PBVHNode** nodes;
+ float (*vertCos)[3]= NULL;
- if(ELEM(brush->sculpt_tool, SCULPT_TOOL_SMOOTH, SCULPT_TOOL_LAYER)) {
- /* this brushes aren't using proxies, so sculpt_combine_proxies() wouldn't
- propagate needed deformation to original base */
+ if(ss->kb)
+ vertCos= MEM_callocN(sizeof(*vertCos)*me->totvert, "flushStrokeDeofrm keyVerts");
- int n, totnode;
- PBVHNode** nodes;
+ BLI_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
- BLI_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
+ #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
+ for (n= 0; n < totnode; n++) {
+ PBVHVertexIter vd;
- #pragma omp parallel for schedule(guided) if (sd->flags & SCULPT_USE_OPENMP)
- for (n= 0; n < totnode; n++) {
- PBVHVertexIter vd;
+ BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
+ sculpt_flush_pbvhvert_deform(ob, &vd);
- BLI_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, PBVH_ITER_UNIQUE) {
- sculpt_flush_pbvhvert_deform(ss, &vd);
+ if(vertCos) {
+ int index= vd.vert_indices[vd.i];
+ copy_v3_v3(vertCos[index], ss->orig_cos[index]);
}
- BLI_pbvh_vertex_iter_end;
}
+ BLI_pbvh_vertex_iter_end;
+ }
- MEM_freeN(nodes);
+ if(vertCos) {
+ sculpt_vertcos_to_key(ob, ss->kb, vertCos);
+ MEM_freeN(vertCos);
}
+ MEM_freeN(nodes);
+
/* Modifiers could depend on mesh normals, so we should update them/
Note, then if sculpting happens on locked key, normals should be re-calculated
after applying coords from keyblock on base mesh */
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
- } else sculpt_update_keyblock(ss);
+ mesh_calc_normals(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
+ } else if (ss->kb)
+ sculpt_update_keyblock(ob);
}
//static int max_overlap_count(Sculpt *sd)
@@ -2564,33 +2610,36 @@ static void calc_brushdata_symm(Sculpt *sd, StrokeCache *cache, const char symm,
mul_m4_v3(cache->symm_rot_mat, cache->grab_delta_symmetry);
}
-static void do_radial_symmetry(Sculpt *sd, SculptSession *ss, Brush *brush, const char symm, const int axis, const float feather)
+static void do_radial_symmetry(Sculpt *sd, Object *ob, Brush *brush, const char symm, const int axis, const float feather)
{
+ SculptSession *ss = ob->sculpt;
int i;
for(i = 1; i < sd->radial_symm[axis-'X']; ++i) {
const float angle = 2*M_PI*i/sd->radial_symm[axis-'X'];
ss->cache->radial_symmetry_pass= i;
calc_brushdata_symm(sd, ss->cache, symm, axis, angle, feather);
- do_brush_action(sd, ss, brush);
+ do_brush_action(sd, ob, brush);
}
}
/* noise texture gives different values for the same input coord; this
can tear a multires mesh during sculpting so do a stitch in this
case */
-static void sculpt_fix_noise_tear(Sculpt *sd, SculptSession *ss)
+static void sculpt_fix_noise_tear(Sculpt *sd, Object *ob)
{
+ SculptSession *ss = ob->sculpt;
Brush *brush = paint_brush(&sd->paint);
MTex *mtex = &brush->mtex;
if(ss->multires && mtex->tex && mtex->tex->type == TEX_NOISE)
- multires_stitch_grids(ss->ob);
+ multires_stitch_grids(ob);
}
-static void do_symmetrical_brush_actions(Sculpt *sd, SculptSession *ss)
+static void do_symmetrical_brush_actions(Sculpt *sd, Object *ob)
{
Brush *brush = paint_brush(&sd->paint);
+ SculptSession *ss = ob->sculpt;
StrokeCache *cache = ss->cache;
const char symm = sd->flags & 7;
int i;
@@ -2608,21 +2657,21 @@ static void do_symmetrical_brush_actions(Sculpt *sd, SculptSession *ss)
cache->radial_symmetry_pass= 0;
calc_brushdata_symm(sd, cache, i, 0, 0, feather);
- do_brush_action(sd, ss, brush);
+ do_brush_action(sd, ob, brush);
- do_radial_symmetry(sd, ss, brush, i, 'X', feather);
- do_radial_symmetry(sd, ss, brush, i, 'Y', feather);
- do_radial_symmetry(sd, ss, brush, i, 'Z', feather);
+ do_radial_symmetry(sd, ob, brush, i, 'X', feather);
+ do_radial_symmetry(sd, ob, brush, i, 'Y', feather);
+ do_radial_symmetry(sd, ob, brush, i, 'Z', feather);
}
}
- sculpt_combine_proxies(sd, ss);
+ sculpt_combine_proxies(sd, ob);
/* hack to fix noise texture tearing mesh */
- sculpt_fix_noise_tear(sd, ss);
+ sculpt_fix_noise_tear(sd, ob);
if (ss->modifiers_active)
- sculpt_flush_stroke_deform(sd, ss);
+ sculpt_flush_stroke_deform(sd, ob);
cache->first_time= 0;
}
@@ -2662,8 +2711,6 @@ void sculpt_update_mesh_elements(Scene *scene, Object *ob, int need_fmap)
SculptSession *ss = ob->sculpt;
MultiresModifierData *mmd= sculpt_multires_active(scene, ob);
- ss->ob= ob;
-
ss->modifiers_active= sculpt_modifiers_active(scene, ob);
if((ob->shapeflag & OB_SHAPE_LOCK) && !mmd) ss->kb= ob_get_keyblock(ob);
@@ -2909,7 +2956,7 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
ss->cache->initial_mouse[1] = 0;
}
- mode = RNA_int_get(op->ptr, "mode");
+ mode = RNA_enum_get(op->ptr, "mode");
cache->invert = mode == BRUSH_STROKE_INVERT;
cache->alt_smooth = mode == BRUSH_STROKE_SMOOTH;
@@ -2987,8 +3034,9 @@ static void sculpt_update_cache_invariants(bContext* C, Sculpt *sd, SculptSessio
cache->vertex_rotation= 0;
}
-static void sculpt_update_brush_delta(Sculpt *sd, SculptSession *ss, Brush *brush)
+static void sculpt_update_brush_delta(Sculpt *sd, Object *ob, Brush *brush)
{
+ SculptSession *ss = ob->sculpt;
StrokeCache *cache = ss->cache;
int tool = brush->sculpt_tool;
@@ -3020,19 +3068,19 @@ static void sculpt_update_brush_delta(Sculpt *sd, SculptSession *ss, Brush *brus
case SCULPT_TOOL_GRAB:
case SCULPT_TOOL_THUMB:
sub_v3_v3v3(delta, grab_location, cache->old_grab_location);
- invert_m4_m4(imat, ss->ob->obmat);
+ invert_m4_m4(imat, ob->obmat);
mul_mat3_m4_v3(imat, delta);
add_v3_v3(cache->grab_delta, delta);
break;
case SCULPT_TOOL_CLAY_TUBES:
case SCULPT_TOOL_NUDGE:
sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location);
- invert_m4_m4(imat, ss->ob->obmat);
+ invert_m4_m4(imat, ob->obmat);
mul_mat3_m4_v3(imat, cache->grab_delta);
break;
case SCULPT_TOOL_SNAKE_HOOK:
sub_v3_v3v3(cache->grab_delta, grab_location, cache->old_grab_location);
- invert_m4_m4(imat, ss->ob->obmat);
+ invert_m4_m4(imat, ob->obmat);
mul_mat3_m4_v3(imat, cache->grab_delta);
break;
}
@@ -3060,8 +3108,9 @@ static void sculpt_update_brush_delta(Sculpt *sd, SculptSession *ss, Brush *brus
}
/* Initialize the stroke cache variants from operator properties */
-static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession *ss, struct PaintStroke *stroke, PointerRNA *ptr)
+static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, Object *ob, struct PaintStroke *stroke, PointerRNA *ptr)
{
+ SculptSession *ss = ob->sculpt;
StrokeCache *cache = ss->cache;
Brush *brush = paint_brush(&sd->paint);
@@ -3126,7 +3175,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession
(brush->flag & BRUSH_RANDOM_ROTATION) &&
!(brush->flag & BRUSH_RAKE))
{
- cache->special_rotation = 2*M_PI*BLI_frand();
+ cache->special_rotation = 2.0f*(float)M_PI*BLI_frand();
}
}
@@ -3144,8 +3193,8 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession
float halfway[2];
float out[3];
- halfway[0] = dx*0.5 + cache->initial_mouse[0];
- halfway[1] = dy*0.5 + cache->initial_mouse[1];
+ halfway[0] = (float)dx * 0.5f + cache->initial_mouse[0];
+ halfway[1] = (float)dy * 0.5f + cache->initial_mouse[1];
if (sculpt_stroke_get_location(C, stroke, out, halfway)) {
copy_v3_v3(sd->anchored_location, out);
@@ -3187,7 +3236,7 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession
}
}
- sculpt_update_brush_delta(sd, ss, brush);
+ sculpt_update_brush_delta(sd, ob, brush);
if(brush->sculpt_tool == SCULPT_TOOL_ROTATE) {
dx = cache->mouse[0] - cache->initial_mouse[0];
@@ -3204,13 +3253,15 @@ static void sculpt_update_cache_variants(bContext *C, Sculpt *sd, SculptSession
sd->special_rotation = cache->special_rotation;
}
-static void sculpt_stroke_modifiers_check(bContext *C, SculptSession *ss)
+static void sculpt_stroke_modifiers_check(bContext *C, Object *ob)
{
+ SculptSession *ss = ob->sculpt;
+
if(ss->modifiers_active) {
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
Brush *brush = paint_brush(&sd->paint);
- sculpt_update_mesh_elements(CTX_data_scene(C), ss->ob, brush->sculpt_tool == SCULPT_TOOL_SMOOTH);
+ sculpt_update_mesh_elements(CTX_data_scene(C), ob, brush->sculpt_tool == SCULPT_TOOL_SMOOTH);
}
}
@@ -3248,7 +3299,8 @@ static void sculpt_raycast_cb(PBVHNode *node, void *data_v, float* tmin)
int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float out[3], float mouse[2])
{
ViewContext *vc = paint_stroke_view_context(stroke);
- SculptSession *ss= vc->obact->sculpt;
+ Object *ob = vc->obact;
+ SculptSession *ss= ob->sculpt;
StrokeCache *cache= ss->cache;
float ray_start[3], ray_end[3], ray_normal[3], dist;
float obimat[4][4];
@@ -3258,11 +3310,11 @@ int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float ou
mval[0] = mouse[0] - vc->ar->winrct.xmin;
mval[1] = mouse[1] - vc->ar->winrct.ymin;
- sculpt_stroke_modifiers_check(C, ss);
+ sculpt_stroke_modifiers_check(C, ob);
viewline(vc->ar, vc->v3d, mval, ray_start, ray_end);
- invert_m4_m4(obimat, ss->ob->obmat);
+ invert_m4_m4(obimat, ob->obmat);
mul_m4_v3(obimat, ray_start);
mul_m4_v3(obimat, ray_end);
@@ -3285,6 +3337,21 @@ int sculpt_stroke_get_location(bContext *C, struct PaintStroke *stroke, float ou
return srd.hit;
}
+static void sculpt_brush_init_tex(Sculpt *sd, SculptSession *ss)
+{
+ Brush *brush = paint_brush(&sd->paint);
+ MTex *mtex= &brush->mtex;
+
+ /* init mtex nodes */
+ if(mtex->tex && mtex->tex->nodetree)
+ ntreeBeginExecTree(mtex->tex->nodetree); /* has internal flag to detect it only does it once */
+
+ /* TODO: Shouldn't really have to do this at the start of every
+ stroke, but sculpt would need some sort of notification when
+ changes are made to the texture. */
+ sculpt_update_tex(sd, ss);
+}
+
static int sculpt_brush_stroke_init(bContext *C, ReportList *reports)
{
Scene *scene= CTX_data_scene(C);
@@ -3299,11 +3366,7 @@ static int sculpt_brush_stroke_init(bContext *C, ReportList *reports)
}
view3d_operator_needs_opengl(C);
-
- /* TODO: Shouldn't really have to do this at the start of every
- stroke, but sculpt would need some sort of notification when
- changes are made to the texture. */
- sculpt_update_tex(sd, ss);
+ sculpt_brush_init_tex(sd, ss);
sculpt_update_mesh_elements(scene, ob, brush->sculpt_tool == SCULPT_TOOL_SMOOTH);
@@ -3381,19 +3444,19 @@ static void sculpt_flush_update(bContext *C)
BLI_pbvh_update(ss->pbvh, PBVH_UpdateBB, NULL);
if (sculpt_get_redraw_rect(ar, CTX_wm_region_view3d(C), ob, &r)) {
- //rcti tmp;
-
r.xmin += ar->winrct.xmin + 1 + off;
r.xmax += ar->winrct.xmin - 1 - off;
r.ymin += ar->winrct.ymin + 1 + off;
r.ymax += ar->winrct.ymin - 1 - off;
- //tmp = r;
+ if (ss->cache) {
+ rcti tmp = r;
- //if (!BLI_rcti_is_empty(&ss->previous_r))
- // BLI_union_rcti(&r, &ss->previous_r);
+ if (!BLI_rcti_is_empty(&ss->cache->previous_r))
+ BLI_union_rcti(&r, &ss->cache->previous_r);
- //ss->previous_r= tmp;
+ ss->cache->previous_r= tmp;
+ }
ss->partial_redraw = 1;
ED_region_tag_redraw_partial(ar, &r);
@@ -3450,17 +3513,27 @@ static int sculpt_stroke_test_start(bContext *C, struct wmOperator *op,
static void sculpt_stroke_update_step(bContext *C, struct PaintStroke *stroke, PointerRNA *itemptr)
{
Sculpt *sd = CTX_data_tool_settings(C)->sculpt;
- SculptSession *ss = CTX_data_active_object(C)->sculpt;
-
- sculpt_stroke_modifiers_check(C, ss);
- sculpt_update_cache_variants(C, sd, ss, stroke, itemptr);
+ Object *ob = CTX_data_active_object(C);
+ SculptSession *ss = ob->sculpt;
+
+ sculpt_stroke_modifiers_check(C, ob);
+ sculpt_update_cache_variants(C, sd, ob, stroke, itemptr);
sculpt_restore_mesh(sd, ss);
- do_symmetrical_brush_actions(sd, ss);
+ do_symmetrical_brush_actions(sd, ob);
/* Cleanup */
sculpt_flush_update(C);
}
+static void sculpt_brush_exit_tex(Sculpt *sd)
+{
+ Brush *brush= paint_brush(&sd->paint);
+ MTex *mtex= &brush->mtex;
+
+ if(mtex->tex && mtex->tex->nodetree)
+ ntreeEndExecTree(mtex->tex->nodetree);
+}
+
static void sculpt_stroke_done(bContext *C, struct PaintStroke *unused)
{
Object *ob= CTX_data_active_object(C);
@@ -3479,7 +3552,7 @@ static void sculpt_stroke_done(bContext *C, struct PaintStroke *unused)
Brush *brush= paint_brush(&sd->paint);
brush->flag &= ~BRUSH_INVERTED;
- sculpt_stroke_modifiers_check(C, ss);
+ sculpt_stroke_modifiers_check(C, ob);
/* Alt-Smooth */
if (ss->cache->alt_smooth) {
@@ -3500,7 +3573,7 @@ static void sculpt_stroke_done(bContext *C, struct PaintStroke *unused)
/* optimization: if there is locked key and active modifiers present in */
/* the stack, keyblock is updating at each step. otherwise we could update */
/* keyblock only when stroke is finished */
- if(ss->kb && !ss->modifiers_active) sculpt_update_keyblock(ss);
+ if(ss->kb && !ss->modifiers_active) sculpt_update_keyblock(ob);
ss->partial_redraw = 0;
@@ -3510,6 +3583,8 @@ static void sculpt_stroke_done(bContext *C, struct PaintStroke *unused)
WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob);
}
+
+ sculpt_brush_exit_tex(sd);
}
static int sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, wmEvent *event)
@@ -3523,7 +3598,7 @@ static int sculpt_brush_stroke_invoke(bContext *C, wmOperator *op, wmEvent *even
stroke = paint_stroke_new(C, sculpt_stroke_get_location,
sculpt_stroke_test_start,
sculpt_stroke_update_step,
- sculpt_stroke_done);
+ sculpt_stroke_done, event->type);
op->customdata = stroke;
@@ -3553,7 +3628,7 @@ static int sculpt_brush_stroke_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
op->customdata = paint_stroke_new(C, sculpt_stroke_get_location, sculpt_stroke_test_start,
- sculpt_stroke_update_step, sculpt_stroke_done);
+ sculpt_stroke_update_step, sculpt_stroke_done, 0);
sculpt_update_cache_invariants(C, sd, ss, op, NULL);
@@ -3636,7 +3711,6 @@ static void SCULPT_OT_set_persistent_base(wmOperatorType *ot)
static void sculpt_init_session(Scene *scene, Object *ob)
{
ob->sculpt = MEM_callocN(sizeof(SculptSession), "sculpt session");
- ob->sculpt->ob = ob;
sculpt_update_mesh_elements(scene, ob, 0);
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index 76a7349606c..5e017d0dc20 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -25,7 +25,12 @@
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
- */
+ */
+
+/** \file blender/editors/sculpt_paint/sculpt_intern.h
+ * \ingroup edsculpt
+ */
+
#ifndef BDR_SCULPTMODE_H
#define BDR_SCULPTMODE_H
@@ -99,10 +104,10 @@ typedef struct SculptUndoNode {
float *layer_disp;
/* shape keys */
- char *shapeName[32]; /* keep size in sync with keyblock dna */
+ char shapeName[sizeof(((KeyBlock *)0))->name];
} SculptUndoNode;
-SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node);
+SculptUndoNode *sculpt_undo_push_node(Object *ob, PBVHNode *node);
SculptUndoNode *sculpt_undo_get_node(PBVHNode *node);
void sculpt_undo_push_begin(const char *name);
void sculpt_undo_push_end(void);
diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c
index d88d7a5ac49..3c81315911e 100644
--- a/source/blender/editors/sculpt_paint/sculpt_undo.c
+++ b/source/blender/editors/sculpt_paint/sculpt_undo.c
@@ -30,6 +30,11 @@
*
*/
+/** \file blender/editors/sculpt_paint/sculpt_undo.c
+ * \ingroup edsculpt
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
@@ -70,8 +75,10 @@ static void update_cb(PBVHNode *node, void *unused)
static void sculpt_restore_deformed(SculptSession *ss, SculptUndoNode *unode, int uindex, int oindex, float coord[3])
{
- swap_v3_v3(coord, unode->orig_co[uindex]);
- copy_v3_v3(unode->co[uindex], ss->deform_cos[oindex]);
+ if(unode->orig_co) {
+ swap_v3_v3(coord, unode->orig_co[uindex]);
+ copy_v3_v3(unode->co[uindex], ss->deform_cos[oindex]);
+ } else swap_v3_v3(coord, unode->co[uindex]);
}
static void sculpt_undo_restore(bContext *C, ListBase *lb)
@@ -93,17 +100,15 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
continue;
if(unode->maxvert) {
- char *shapeName= (char*)unode->shapeName;
-
/* regular mesh restore */
if(ss->totvert != unode->maxvert)
continue;
- if (ss->kb && strcmp(ss->kb->name, shapeName)) {
+ if (ss->kb && strcmp(ss->kb->name, unode->shapeName)) {
/* shape key has been changed before calling undo operator */
Key *key= ob_get_key(ob);
- KeyBlock *kb= key_get_named_keyblock(key, shapeName);
+ KeyBlock *kb= key_get_named_keyblock(key, unode->shapeName);
if (kb) {
ob->shapenr= BLI_findindex(&key->block, kb) + 1;
@@ -126,7 +131,10 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
for(i=0; i<unode->totvert; i++) {
if(ss->modifiers_active) sculpt_restore_deformed(ss, unode, i, index[i], vertCos[index[i]]);
- else swap_v3_v3(vertCos[index[i]], unode->co[i]);
+ else {
+ if(unode->orig_co) swap_v3_v3(vertCos[index[i]], unode->orig_co[i]);
+ else swap_v3_v3(vertCos[index[i]], unode->co[i]);
+ }
}
/* propagate new coords to keyblock */
@@ -140,7 +148,10 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
} else {
for(i=0; i<unode->totvert; i++) {
if(ss->modifiers_active) sculpt_restore_deformed(ss, unode, i, index[i], mvert[index[i]].co);
- else swap_v3_v3(mvert[index[i]].co, unode->co[i]);
+ else {
+ if(unode->orig_co) swap_v3_v3(mvert[index[i]].co, unode->orig_co[i]);
+ else swap_v3_v3(mvert[index[i]].co, unode->co[i]);
+ }
mvert[index[i]].flag |= ME_VERT_PBVH_UPDATE;
}
}
@@ -185,8 +196,8 @@ static void sculpt_undo_restore(bContext *C, ListBase *lb)
tag_update= ((Mesh*)ob->data)->id.us > 1;
if(ss->modifiers_active) {
- Mesh *me= ob->data;
- mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
+ Mesh *mesh= ob->data;
+ mesh_calc_normals(mesh->mvert, mesh->totvert, mesh->mloop, mesh->mpoly, mesh->totloop, mesh->totpoly, NULL, NULL, 0, NULL, NULL);
sculpt_free_deformMats(ss);
tag_update|= 1;
@@ -235,10 +246,10 @@ SculptUndoNode *sculpt_undo_get_node(PBVHNode *node)
return NULL;
}
-SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node)
+SculptUndoNode *sculpt_undo_push_node(Object *ob, PBVHNode *node)
{
ListBase *lb= undo_paint_push_get_list(UNDO_PAINT_MESH);
- Object *ob= ss->ob;
+ SculptSession *ss = ob->sculpt;
SculptUndoNode *unode;
int totvert, allvert, totgrid, maxgrid, gridsize, *grids;
@@ -303,7 +314,7 @@ SculptUndoNode *sculpt_undo_push_node(SculptSession *ss, PBVHNode *node)
memcpy(unode->grids, grids, sizeof(int)*totgrid);
/* store active shape key */
- if(ss->kb) BLI_strncpy((char*)unode->shapeName, ss->kb->name, sizeof(ss->kb->name));
+ if(ss->kb) BLI_strncpy(unode->shapeName, ss->kb->name, sizeof(ss->kb->name));
else unode->shapeName[0]= '\0';
return unode;
diff --git a/source/blender/editors/sound/sound_intern.h b/source/blender/editors/sound/sound_intern.h
index 4cc91c9fec4..b17ef99132f 100644
--- a/source/blender/editors/sound/sound_intern.h
+++ b/source/blender/editors/sound/sound_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/sound/sound_intern.h
+ * \ingroup edsnd
+ */
+
+
#ifndef ED_SOUND_INTERN_H
#define ED_SOUND_INTERN_H
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index 2d8f1dc240c..a07f4ff0f5f 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/sound/sound_ops.c
+ * \ingroup edsnd
+ */
+
+
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_action/CMakeLists.txt b/source/blender/editors/space_action/CMakeLists.txt
index 9280e4d0e7f..7c52f4a9efb 100644
--- a/source/blender/editors/space_action/CMakeLists.txt
+++ b/source/blender/editors/space_action/CMakeLists.txt
@@ -28,6 +28,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_action/action_draw.c b/source/blender/editors/space_action/action_draw.c
index 040c5ebaf47..f0f34645ebf 100644
--- a/source/blender/editors/space_action/action_draw.c
+++ b/source/blender/editors/space_action/action_draw.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_action/action_draw.c
+ * \ingroup spaction
+ */
+
+
/* System includes ----------------------------------------------------- */
#include <math.h>
diff --git a/source/blender/editors/space_action/action_edit.c b/source/blender/editors/space_action/action_edit.c
index 2c3a88c390e..b3aa9349da8 100644
--- a/source/blender/editors/space_action/action_edit.c
+++ b/source/blender/editors/space_action/action_edit.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_action/action_edit.c
+ * \ingroup spaction
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
@@ -121,7 +126,7 @@ static int act_new_exec(bContext *C, wmOperator *UNUSED(op))
void ACTION_OT_new (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "New";
+ ot->name= "New Action";
ot->idname= "ACTION_OT_new";
ot->description= "Create new action";
@@ -135,12 +140,94 @@ void ACTION_OT_new (wmOperatorType *ot)
}
/* ************************************************************************** */
+/* POSE MARKERS STUFF */
+
+/* *************************** Localise Markers ***************************** */
+
+/* ensure that there is:
+ * 1) an active action editor
+ * 2) that the mode will have an active action available
+ * 3) that the set of markers being shown are the scene markers, not the list we're merging
+ * 4) that there are some selected markers
+ */
+static int act_markers_make_local_poll(bContext *C)
+{
+ SpaceAction *sact = CTX_wm_space_action(C);
+
+ /* 1) */
+ if (sact == NULL)
+ return 0;
+
+ /* 2) */
+ if (ELEM(sact->mode, SACTCONT_ACTION, SACTCONT_SHAPEKEY) == 0)
+ return 0;
+ if (sact->action == NULL)
+ return 0;
+
+ /* 3) */
+ if (sact->flag & SACTION_POSEMARKERS_SHOW)
+ return 0;
+
+ /* 4) */
+ return ED_markers_get_first_selected(ED_context_get_markers(C)) != NULL;
+}
+
+static int act_markers_make_local_exec (bContext *C, wmOperator *UNUSED(op))
+{
+ ListBase *markers = ED_context_get_markers(C);
+
+ SpaceAction *sact = CTX_wm_space_action(C);
+ bAction *act = (sact)? sact->action : NULL;
+
+ TimeMarker *marker, *markern=NULL;
+
+ /* sanity checks */
+ if (ELEM(NULL, markers, act))
+ return OPERATOR_CANCELLED;
+
+ /* migrate markers */
+ for (marker = markers->first; marker; marker = markern) {
+ markern = marker->next;
+
+ /* move if marker is selected */
+ if (marker->flag & SELECT) {
+ BLI_remlink(markers, marker);
+ BLI_addtail(&act->markers, marker);
+ }
+ }
+
+ /* now enable the "show posemarkers only" setting, so that we can see that something did happen */
+ sact->flag |= SACTION_POSEMARKERS_SHOW;
+
+ /* notifiers - both sets, as this change affects both */
+ WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+ WM_event_add_notifier(C, NC_ANIMATION|ND_MARKERS, NULL);
+
+ return OPERATOR_FINISHED;
+}
+
+void ACTION_OT_markers_make_local (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "Make Markers Local";
+ ot->idname= "ACTION_OT_markers_make_local";
+ ot->description= "Move selected scene markers to the active Action as local 'pose' markers";
+
+ /* callbacks */
+ ot->exec = act_markers_make_local_exec;
+ ot->poll = act_markers_make_local_poll;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+/* ************************************************************************** */
/* KEYFRAME-RANGE STUFF */
/* *************************** Calculate Range ************************** */
/* Get the min/max keyframes*/
-static void get_keyframe_extents (bAnimContext *ac, float *min, float *max)
+static void get_keyframe_extents (bAnimContext *ac, float *min, float *max, const short onlySel)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -162,8 +249,8 @@ static void get_keyframe_extents (bAnimContext *ac, float *min, float *max)
FCurve *fcu= (FCurve *)ale->key_data;
float tmin, tmax;
- /* get range and apply necessary scaling before */
- calc_fcurve_range(fcu, &tmin, &tmax);
+ /* get range and apply necessary scaling before processing */
+ calc_fcurve_range(fcu, &tmin, &tmax, onlySel);
if (adt) {
tmin= BKE_nla_tweakedit_remap(adt, tmin, NLATIME_CONVERT_MAP);
@@ -208,7 +295,7 @@ static int actkeys_previewrange_exec(bContext *C, wmOperator *UNUSED(op))
scene= ac.scene;
/* set the range directly */
- get_keyframe_extents(&ac, &min, &max);
+ get_keyframe_extents(&ac, &min, &max, FALSE);
scene->r.flag |= SCER_PRV_RANGE;
scene->r.psfra= (int)floor(min + 0.5f);
scene->r.pefra= (int)floor(max + 0.5f);
@@ -237,7 +324,7 @@ void ACTION_OT_previewrange_set (wmOperatorType *ot)
/* ****************** View-All Operator ****************** */
-static int actkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
+static int actkeys_viewall(bContext *C, const short onlySel)
{
bAnimContext ac;
View2D *v2d;
@@ -249,7 +336,7 @@ static int actkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
v2d= &ac.ar->v2d;
/* set the horizontal range, with an extra offset so that the extreme keys will be in view */
- get_keyframe_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax);
+ get_keyframe_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax, onlySel);
extra= 0.1f * (v2d->cur.xmax - v2d->cur.xmin);
v2d->cur.xmin -= extra;
@@ -267,6 +354,20 @@ static int actkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_FINISHED;
}
+
+/* ......... */
+
+static int actkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ /* whole range */
+ return actkeys_viewall(C, FALSE);
+}
+
+static int actkeys_viewsel_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ /* only selected */
+ return actkeys_viewall(C, TRUE);
+}
void ACTION_OT_view_all (wmOperatorType *ot)
{
@@ -283,6 +384,21 @@ void ACTION_OT_view_all (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+void ACTION_OT_view_selected (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "View Selected";
+ ot->idname= "ACTION_OT_view_selected";
+ ot->description= "Reset viewable area to show selected keyframes range";
+
+ /* api callbacks */
+ ot->exec= actkeys_viewsel_exec;
+ ot->poll= ED_operator_action_active;
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ************************************************************************** */
/* GENERAL STUFF */
@@ -576,9 +692,6 @@ static int actkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED
{
actkeys_duplicate_exec(C, op);
- RNA_int_set(op->ptr, "mode", TFM_TIME_TRANSLATE);
- WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
-
return OPERATOR_FINISHED;
}
@@ -598,7 +711,7 @@ void ACTION_OT_duplicate (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TIME_TRANSLATE, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+ RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
}
/* ******************** Delete Keyframes Operator ************************* */
@@ -1133,7 +1246,7 @@ static int actkeys_framejump_exec(bContext *C, wmOperator *UNUSED(op))
ListBase anim_data= {NULL, NULL};
bAnimListElem *ale;
int filter;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -1203,7 +1316,7 @@ static void snap_action_keys(bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
KeyframeEditFunc edit_cb;
/* filter data */
@@ -1302,7 +1415,7 @@ static void mirror_action_keys(bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
KeyframeEditFunc edit_cb;
/* get beztriple editing callbacks */
diff --git a/source/blender/editors/space_action/action_intern.h b/source/blender/editors/space_action/action_intern.h
index feaf2c2d786..512b6e329dd 100644
--- a/source/blender/editors/space_action/action_intern.h
+++ b/source/blender/editors/space_action/action_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_action/action_intern.h
+ * \ingroup spaction
+ */
+
#ifndef ED_ACTION_INTERN_H
#define ED_ACTION_INTERN_H
@@ -82,6 +87,7 @@ enum {
void ACTION_OT_previewrange_set(struct wmOperatorType *ot);
void ACTION_OT_view_all(struct wmOperatorType *ot);
+void ACTION_OT_view_selected(struct wmOperatorType *ot);
void ACTION_OT_copy(struct wmOperatorType *ot);
void ACTION_OT_paste(struct wmOperatorType *ot);
@@ -104,6 +110,8 @@ void ACTION_OT_mirror(struct wmOperatorType *ot);
void ACTION_OT_new(struct wmOperatorType *ot);
+void ACTION_OT_markers_make_local(struct wmOperatorType *ot);
+
/* defines for snap keyframes
* NOTE: keep in sync with eEditKeyframes_Snap (in ED_keyframes_edit.h)
*/
diff --git a/source/blender/editors/space_action/action_ops.c b/source/blender/editors/space_action/action_ops.c
index acb2fa09d04..6c3f80cda41 100644
--- a/source/blender/editors/space_action/action_ops.c
+++ b/source/blender/editors/space_action/action_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_action/action_ops.c
+ * \ingroup spaction
+ */
+
+
#include <stdlib.h>
#include <math.h>
@@ -34,8 +39,7 @@
#include "BLI_blenlib.h"
-
-
+#include "ED_anim_api.h"
#include "ED_transform.h"
#include "action_intern.h"
@@ -79,6 +83,23 @@ void action_operatortypes(void)
WM_operatortype_append(ACTION_OT_previewrange_set);
WM_operatortype_append(ACTION_OT_view_all);
+ WM_operatortype_append(ACTION_OT_view_selected);
+
+ WM_operatortype_append(ACTION_OT_markers_make_local);
+}
+
+void ED_operatormacros_action(void)
+{
+ wmOperatorType *ot;
+ wmOperatorTypeMacro *otmacro;
+
+ ot= WM_operatortype_append_macro("ACTION_OT_duplicate_move", "Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER);
+ if (ot) {
+ WM_operatortype_macro_define(ot, "ACTION_OT_duplicate");
+ otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_transform");
+ RNA_enum_set(otmacro->ptr, "mode", TFM_TIME_DUPLICATE);
+ }
+
}
/* ************************** registration - keymaps **********************************/
@@ -152,7 +173,7 @@ static void action_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
WM_keymap_add_item(keymap, "ACTION_OT_delete", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "ACTION_OT_delete", DELKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "ACTION_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "ACTION_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
WM_keymap_add_item(keymap, "ACTION_OT_keyframe_insert", IKEY, KM_PRESS, 0, 0);
/* copy/paste */
@@ -162,6 +183,7 @@ static void action_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
/* auto-set range */
WM_keymap_add_item(keymap, "ACTION_OT_previewrange_set", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
WM_keymap_add_item(keymap, "ACTION_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "ACTION_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
/* animation module */
/* channels list
diff --git a/source/blender/editors/space_action/action_select.c b/source/blender/editors/space_action/action_select.c
index b9662a8b8e5..bee872dbe60 100644
--- a/source/blender/editors/space_action/action_select.c
+++ b/source/blender/editors/space_action/action_select.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_action/action_select.c
+ * \ingroup spaction
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
@@ -85,7 +90,7 @@ static void deselect_action_keys (bAnimContext *ac, short test, short sel)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
KeyframeEditFunc test_cb, sel_cb;
/* determine type-based settings */
@@ -366,7 +371,7 @@ static void markers_selectkeys_between (bAnimContext *ac)
int filter;
KeyframeEditFunc ok_cb, select_cb;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
float min, max;
/* get extreme markers */
@@ -417,7 +422,7 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
Scene *scene= ac->scene;
CfraElem *ce;
KeyframeEditFunc select_cb, ok_cb;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
/* initialise keyframe editing data */
@@ -450,7 +455,7 @@ static void columnselect_action_keys (bAnimContext *ac, short mode)
break;
case ACTKEYS_COLUMNSEL_MARKERS_COLUMN: /* list of selected markers */
- ED_markers_make_cfra_list(ac->markers, &ked.list, 1);
+ ED_markers_make_cfra_list(ac->markers, &ked.list, SELECT);
break;
default: /* invalid option */
@@ -603,7 +608,7 @@ static void select_moreless_action_keys (bAnimContext *ac, short mode)
bAnimListElem *ale;
int filter;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
KeyframeEditFunc build_cb;
@@ -725,7 +730,7 @@ static void actkeys_select_leftright (bAnimContext *ac, short leftright, short s
int filter;
KeyframeEditFunc ok_cb, select_cb;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
Scene *scene= ac->scene;
/* if select mode is replace, deselect all keyframes (and channels) first */
@@ -903,7 +908,7 @@ static void actkeys_mselect_single (bAnimContext *ac, bAnimListElem *ale, short
bDopeSheet *ads= (ac->datatype == ANIMCONT_DOPESHEET) ? ac->data : NULL;
int ds_filter = ((ads) ? (ads->filterflag) : (0));
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
KeyframeEditFunc select_cb, ok_cb;
/* get functions for selecting keyframes */
@@ -929,7 +934,7 @@ static void actkeys_mselect_column(bAnimContext *ac, short select_mode, float se
int filter;
KeyframeEditFunc select_cb, ok_cb;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
/* initialise keyframe editing data */
@@ -1152,9 +1157,7 @@ static void mouse_action_keys (bAnimContext *ac, int mval[2], short select_mode,
static int actkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
bAnimContext ac;
- Scene *scene;
ARegion *ar;
- View2D *v2d;
short selectmode, column;
int mval[2];
@@ -1163,9 +1166,7 @@ static int actkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *even
return OPERATOR_CANCELLED;
/* get useful pointers from animation context data */
- scene= ac.scene;
ar= ac.ar;
- v2d= &ar->v2d;
/* get mouse coordinates (in region coordinates) */
mval[0]= (event->x - ar->winrct.xmin);
diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c
index b08ddfbcba9..06ff061f5ea 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_action/space_action.c
+ * \ingroup spaction
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -193,7 +198,7 @@ static void action_main_area_draw(const bContext *C, ARegion *ar)
/* markers */
UI_view2d_view_orthoSpecial(ar, v2d, 1);
- flag = (saction->flag & SACTION_POSEMARKERS_SHOW)? DRAW_MARKERS_LOCAL : 0;
+ flag = (ac.markers && (ac.markers != &ac.scene->markers))? DRAW_MARKERS_LOCAL : 0;
draw_markers_time(C, flag);
/* preview range */
diff --git a/source/blender/editors/space_api/space.c b/source/blender/editors/space_api/space.c
index bfe47f6e35a..1ba8f00995c 100644
--- a/source/blender/editors/space_api/space.c
+++ b/source/blender/editors/space_api/space.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_api/space.c
+ * \ingroup spapi
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_api/spacetypes.c b/source/blender/editors/space_api/spacetypes.c
index db857d4be9f..cb89b92336f 100644
--- a/source/blender/editors/space_api/spacetypes.c
+++ b/source/blender/editors/space_api/spacetypes.c
@@ -22,6 +22,11 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_api/spacetypes.c
+ * \ingroup spapi
+ */
+
+
#include <stdlib.h>
#include "MEM_guardedalloc.h"
@@ -125,7 +130,9 @@ void ED_spacetypes_init(void)
ED_operatormacros_node();
ED_operatormacros_object();
ED_operatormacros_file();
-
+ ED_operatormacros_graph();
+ ED_operatormacros_action();
+
/* register dropboxes (can use macros) */
spacetypes = BKE_spacetypes_list();
for(type=spacetypes->first; type; type=type->next) {
@@ -228,6 +235,8 @@ void ED_region_draw_cb_draw(const bContext *C, ARegion *ar, int type)
/* ********************* space template *********************** */
+/* forward declare */
+void ED_spacetype_xxx(void);
/* allocate and init some vars */
static SpaceLink *xxx_new(const bContext *UNUSED(C))
@@ -269,7 +278,7 @@ static void xxx_keymap(wmKeyConfig *UNUSED(keyconf))
}
/* only called once, from screen/spacetypes.c */
-static void ED_spacetype_xxx(void)
+void ED_spacetype_xxx(void)
{
static SpaceType st;
diff --git a/source/blender/editors/space_buttons/CMakeLists.txt b/source/blender/editors/space_buttons/CMakeLists.txt
index 94b3f1c3926..e9670949cd5 100644
--- a/source/blender/editors/space_buttons/CMakeLists.txt
+++ b/source/blender/editors/space_buttons/CMakeLists.txt
@@ -28,6 +28,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_buttons/buttons_context.c b/source/blender/editors/space_buttons/buttons_context.c
index 486cc462584..f91e830d52e 100644
--- a/source/blender/editors/space_buttons/buttons_context.c
+++ b/source/blender/editors/space_buttons/buttons_context.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_buttons/buttons_context.c
+ * \ingroup spbuttons
+ */
+
+
#include <stdlib.h>
#include <string.h>
@@ -231,6 +236,12 @@ static int buttons_context_path_material(ButsContextPath *path)
ma= give_current_material(ob, ob->actcol);
RNA_id_pointer_create(&ma->id, &path->ptr[path->len]);
path->len++;
+
+ ma= give_node_material(ma);
+ if(ma) {
+ RNA_id_pointer_create(&ma->id, &path->ptr[path->len]);
+ path->len++;
+ }
return 1;
}
}
diff --git a/source/blender/editors/space_buttons/buttons_header.c b/source/blender/editors/space_buttons/buttons_header.c
index cf0ae07d891..dc588f08ff1 100644
--- a/source/blender/editors/space_buttons/buttons_header.c
+++ b/source/blender/editors/space_buttons/buttons_header.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_buttons/buttons_header.c
+ * \ingroup spbuttons
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_buttons/buttons_intern.h b/source/blender/editors/space_buttons/buttons_intern.h
index dda64ae1b40..d92488e47ef 100644
--- a/source/blender/editors/space_buttons/buttons_intern.h
+++ b/source/blender/editors/space_buttons/buttons_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_buttons/buttons_intern.h
+ * \ingroup spbuttons
+ */
+
#ifndef ED_BUTTONS_INTERN_H
#define ED_BUTTONS_INTERN_H
diff --git a/source/blender/editors/space_buttons/buttons_ops.c b/source/blender/editors/space_buttons/buttons_ops.c
index b2edff87f9c..9190d5aff54 100644
--- a/source/blender/editors/space_buttons/buttons_ops.c
+++ b/source/blender/editors/space_buttons/buttons_ops.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_buttons/buttons_ops.c
+ * \ingroup spbuttons
+ */
+
+
#include <stdlib.h>
#include <string.h>
@@ -50,6 +55,7 @@
#include "RNA_access.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "buttons_intern.h" // own include
@@ -65,7 +71,7 @@ static int toolbox_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(e
RNA_pointer_create(&sc->id, &RNA_SpaceProperties, sbuts, &ptr);
- pup= uiPupMenuBegin(C, "Align", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Align", ICON_NONE);
layout= uiPupMenuLayout(pup);
uiItemsEnumR(layout, &ptr, "align");
uiPupMenuEnd(C, pup);
@@ -101,7 +107,7 @@ static int file_browse_exec(bContext *C, wmOperator *op)
if (RNA_property_is_set(op->ptr, "filepath")==0 || fbo==NULL)
return OPERATOR_CANCELLED;
- str= RNA_string_get_alloc(op->ptr, "filepath", 0, 0);
+ str= RNA_string_get_alloc(op->ptr, "filepath", NULL, 0);
/* add slash for directories, important for some properties */
if(RNA_property_subtype(fbo->prop) == PROP_DIRPATH) {
@@ -149,7 +155,7 @@ static int file_browse_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(!prop)
return OPERATOR_CANCELLED;
- str= RNA_property_string_get_alloc(&ptr, prop, 0, 0);
+ str= RNA_property_string_get_alloc(&ptr, prop, NULL, 0);
/* useful yet irritating feature, Shift+Click to open the file
* Alt+Click to browse a folder in the OS's browser */
diff --git a/source/blender/editors/space_buttons/space_buttons.c b/source/blender/editors/space_buttons/space_buttons.c
index b6feb4ee1d6..a808e9885c4 100644
--- a/source/blender/editors/space_buttons/space_buttons.c
+++ b/source/blender/editors/space_buttons/space_buttons.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_buttons/space_buttons.c
+ * \ingroup spbuttons
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -63,7 +68,7 @@ static SpaceLink *buttons_new(const bContext *UNUSED(C))
sbuts= MEM_callocN(sizeof(SpaceButs), "initbuts");
sbuts->spacetype= SPACE_BUTS;
- sbuts->align= BUT_AUTO;
+ sbuts->align= BUT_VERTICAL;
/* header */
ar= MEM_callocN(sizeof(ARegion), "header for buts");
@@ -351,8 +356,12 @@ static void buttons_area_listener(ScrArea *sa, wmNotifier *wmn)
}
break;
case NC_NODE:
- if(wmn->action==NA_SELECTED)
+ if(wmn->action==NA_SELECTED) {
ED_area_tag_redraw(sa);
+ /* new active node, update texture preview */
+ if(sbuts->mainb == BCONTEXT_TEXTURE)
+ sbuts->preview= 1;
+ }
break;
/* Listener for preview render, when doing an global undo. */
case NC_WINDOW:
diff --git a/source/blender/editors/space_console/CMakeLists.txt b/source/blender/editors/space_console/CMakeLists.txt
index d1cb716fa84..14e7f4a90d0 100644
--- a/source/blender/editors/space_console/CMakeLists.txt
+++ b/source/blender/editors/space_console/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_console/console_draw.c b/source/blender/editors/space_console/console_draw.c
index ffb6bdb1f57..bf5df87610c 100644
--- a/source/blender/editors/space_console/console_draw.c
+++ b/source/blender/editors/space_console/console_draw.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_console/console_draw.c
+ * \ingroup spconsole
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/editors/space_console/console_intern.h b/source/blender/editors/space_console/console_intern.h
index acdd7e33a8e..ad20c026e6c 100644
--- a/source/blender/editors/space_console/console_intern.h
+++ b/source/blender/editors/space_console/console_intern.h
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_console/console_intern.h
+ * \ingroup spconsole
+ */
+
#ifndef ED_CONSOLE_INTERN_H
#define ED_CONSOLE_INTERN_H
diff --git a/source/blender/editors/space_console/console_ops.c b/source/blender/editors/space_console/console_ops.c
index b3de56995bd..97c2d9e3eb4 100644
--- a/source/blender/editors/space_console/console_ops.c
+++ b/source/blender/editors/space_console/console_ops.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_console/console_ops.c
+ * \ingroup spconsole
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <ctype.h> /* ispunct */
@@ -712,7 +717,7 @@ static int copy_exec(bContext *C, wmOperator *UNUSED(op))
int sel[2];
int offset= 0;
- ConsoleLine cl_dummy= {0};
+ ConsoleLine cl_dummy= {NULL};
#if 0
/* copy whole file */
diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c
index ebf96cca191..22170bb439f 100644
--- a/source/blender/editors/space_console/space_console.c
+++ b/source/blender/editors/space_console/space_console.c
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_console/space_console.c
+ * \ingroup spconsole
+ */
+
#include <string.h>
#include <stdio.h>
@@ -299,6 +304,7 @@ static void console_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_CHAR);
RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR);
+ RNA_enum_set(WM_keymap_add_item(keymap, "CONSOLE_OT_delete", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", DEL_PREV_CHAR); /* same as above [#26623] */
#ifdef WITH_PYTHON
WM_keymap_add_item(keymap, "CONSOLE_OT_execute", RETKEY, KM_PRESS, 0, 0); /* python operator - space_text.py */
diff --git a/source/blender/editors/space_file/CMakeLists.txt b/source/blender/editors/space_file/CMakeLists.txt
index d77ed306daf..0a3bce76466 100644
--- a/source/blender/editors/space_file/CMakeLists.txt
+++ b/source/blender/editors/space_file/CMakeLists.txt
@@ -31,6 +31,7 @@ set(INC
../../windowmanager
../../render/extern/include
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index 041280aaf7e..bf7501ae5ce 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_file/file_draw.c
+ * \ingroup spfile
+ */
+
+
#include <math.h>
#include <string.h>
@@ -238,8 +243,8 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
static void draw_tile(int sx, int sy, int width, int height, int colorid, int shade)
{
UI_ThemeColorShade(colorid, shade);
- uiSetRoundBox(15);
- uiRoundBox(sx, sy - height, sx + width, sy, 5);
+ uiSetRoundBox(15);
+ uiRoundBox((float)sx, (float)(sy - height), (float)(sx + width), (float)sy, 5.0f);
}
@@ -281,15 +286,15 @@ static int get_file_icon(struct direntry *file)
static void file_draw_icon(uiBlock *block, char *path, int sx, int sy, int icon, int width, int height)
{
uiBut *but;
- float x,y;
+ int x,y;
/*float alpha=1.0f;*/
- x = (float)(sx);
- y = (float)(sy-height);
+ x = sx;
+ y = sy-height;
/*if (icon == ICON_FILE_BLANK) alpha = 0.375f;*/
-
- but= uiDefIconBut(block, LABEL, 0, icon, x, y, width, height, NULL, 0.0, 0.0, 0, 0, "");
+
+ but= uiDefIconBut(block, LABEL, 0, icon, x, y, width, height, NULL, 0.0f, 0.0f, 0.0f, 0.0f, "");
uiButSetDragPath(but, path);
}
@@ -304,11 +309,11 @@ static void file_draw_string(int sx, int sy, const char* string, float width, in
fs.align = align;
BLI_strncpy(fname,string, FILE_MAXFILE);
- file_shorten_string(fname, width+1.0, 0);
+ file_shorten_string(fname, width + 1.0f, 0);
/* no text clipping needed, uiStyleFontDraw does it but is a bit too strict (for buttons it works) */
rect.xmin = sx;
- rect.xmax = sx + ceil(width+4.0f);
+ rect.xmax = (int)(sx + ceil(width+4.0f));
rect.ymin = sy - height;
rect.ymax = sy;
@@ -358,25 +363,25 @@ static void file_draw_preview(uiBlock *block, struct direntry *file, int sx, int
fy = ((float)layout->prv_h - (float)ey)/2.0f;
dx = (fx + 0.5f + layout->prv_border_x);
dy = (fy + 0.5f - layout->prv_border_y);
- xco = (float)sx + dx;
- yco = (float)sy - layout->prv_h + dy;
+ xco = sx + (int)dx;
+ yco = sy - layout->prv_h + (int)dy;
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
/* shadow */
if (dropshadow)
- uiDrawBoxShadow(220, xco, yco, xco + ex, yco + ey);
-
+ uiDrawBoxShadow(220, (float)xco, (float)yco, (float)(xco + ex), (float)(yco + ey));
+
glEnable(GL_BLEND);
/* the image */
glColor4f(1.0, 1.0, 1.0, 1.0);
- glaDrawPixelsTexScaled(xco, yco, imb->x, imb->y, GL_UNSIGNED_BYTE, imb->rect, scale, scale);
+ glaDrawPixelsTexScaled((float)xco, (float)yco, imb->x, imb->y, GL_UNSIGNED_BYTE, imb->rect, scale, scale);
/* border */
if (dropshadow) {
glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
- fdrawbox(xco, yco, xco + ex, yco + ey);
+ fdrawbox((float)xco, (float)yco, (float)(xco + ex), (float)(yco + ey));
}
/* dragregion */
@@ -384,7 +389,7 @@ static void file_draw_preview(uiBlock *block, struct direntry *file, int sx, int
uiButSetDragImage(but, file->path, get_file_icon(file), imb, scale);
glDisable(GL_BLEND);
- imb = 0;
+ imb = NULL;
}
}
@@ -396,10 +401,6 @@ static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
SpaceFile *sfile= (SpaceFile*)CTX_wm_space_data(C);
ARegion* ar = CTX_wm_region(C);
-#if 0
- struct direntry *file = (struct direntry *)arg1;
-#endif
-
BLI_make_file_string(G.main->name, orgname, sfile->params->dir, oldname);
BLI_strncpy(filename, sfile->params->renameedit, sizeof(filename));
BLI_make_file_string(G.main->name, newname, sfile->params->dir, filename);
@@ -408,10 +409,6 @@ static void renamebutton_cb(bContext *C, void *UNUSED(arg1), char *oldname)
if (!BLI_exists(newname)) {
BLI_rename(orgname, newname);
/* to make sure we show what is on disk */
-#if 0 /* this is cleared anyway, no need */
- MEM_freeN(file->relname);
- file->relname= BLI_strdup(sfile->params->renameedit);
-#endif
ED_fileselect_clear(C, sfile);
}
@@ -428,10 +425,10 @@ static void draw_background(FileLayout *layout, View2D *v2d)
/* alternating flat shade background */
for (i=0; (i <= layout->rows); i+=2)
{
- sy = v2d->cur.ymax - i*(layout->tile_h+2*layout->tile_border_y) - layout->tile_border_y;
+ sy = (int)v2d->cur.ymax - i*(layout->tile_h+2*layout->tile_border_y) - layout->tile_border_y;
UI_ThemeColorShade(TH_BACK, -7);
- glRectf(v2d->cur.xmin, sy, v2d->cur.xmax, sy+layout->tile_h+2*layout->tile_border_y);
+ glRectf(v2d->cur.xmin, (float)sy, v2d->cur.xmax, (float)(sy+layout->tile_h+2*layout->tile_border_y));
}
}
@@ -441,14 +438,14 @@ static void draw_dividers(FileLayout *layout, View2D *v2d)
int sx;
/* vertical column dividers */
- sx = v2d->tot.xmin;
+ sx = (int)v2d->tot.xmin;
while (sx < v2d->cur.xmax) {
sx += (layout->tile_w+2*layout->tile_border_x);
UI_ThemeColorShade(TH_BACK, 30);
- sdrawline(sx+1, v2d->cur.ymax - layout->tile_border_y , sx+1, v2d->cur.ymin);
+ sdrawline(sx+1, (short)(v2d->cur.ymax - layout->tile_border_y), sx+1, (short)v2d->cur.ymin);
UI_ThemeColorShade(TH_BACK, -30);
- sdrawline(sx, v2d->cur.ymax - layout->tile_border_y , sx, v2d->cur.ymin);
+ sdrawline(sx, (short)(v2d->cur.ymax - layout->tile_border_y), sx, (short)v2d->cur.ymin);
}
}
@@ -464,7 +461,6 @@ void file_draw_list(const bContext *C, ARegion *ar)
uiBlock *block = uiBeginBlock(C, ar, "FileNames", UI_EMBOSS);
int numfiles;
int numfiles_layout;
- int colorid = 0;
int sx, sy;
int offset;
int textwidth, textheight;
@@ -482,7 +478,7 @@ void file_draw_list(const bContext *C, ARegion *ar)
draw_dividers(layout, v2d);
}
- offset = ED_fileselect_layout_offset(layout, 0, ar->v2d.cur.xmin, -ar->v2d.cur.ymax);
+ offset = ED_fileselect_layout_offset(layout, (int)ar->v2d.cur.xmin, (int)-ar->v2d.cur.ymax);
if (offset<0) offset=0;
numfiles_layout = ED_fileselect_layout_numfiles(layout, ar);
@@ -494,31 +490,28 @@ void file_draw_list(const bContext *C, ARegion *ar)
numfiles_layout += layout->columns;
}
- textwidth =( FILE_IMGDISPLAY == params->display) ? layout->tile_w : layout->column_widths[COLUMN_NAME];
- textheight = layout->textheight*3.0/2.0 + 0.5;
+ textwidth =( FILE_IMGDISPLAY == params->display) ? layout->tile_w : (int)layout->column_widths[COLUMN_NAME];
+ textheight = (int)(layout->textheight*3.0/2.0 + 0.5);
align = ( FILE_IMGDISPLAY == params->display) ? UI_STYLE_TEXT_CENTER : UI_STYLE_TEXT_LEFT;
for (i=offset; (i < numfiles) && (i<offset+numfiles_layout); ++i)
{
ED_fileselect_layout_tilepos(layout, i, &sx, &sy);
- sx += v2d->tot.xmin+2;
- sy = v2d->tot.ymax - sy;
+ sx += (int)(v2d->tot.xmin+2.0f);
+ sy = (int)(v2d->tot.ymax - sy);
file = filelist_file(files, i);
UI_ThemeColor4(TH_TEXT);
- if (!(file->flags & EDITING)) {
- if (params->active_file == i) {
- if (file->flags & ACTIVEFILE) colorid= TH_HILITE;
- else colorid = TH_BACK;
- draw_tile(sx, sy-1, layout->tile_w+4, sfile->layout->tile_h+layout->tile_border_y, colorid,20);
- } else if (file->flags & ACTIVEFILE) {
- colorid = TH_HILITE;
- draw_tile(sx, sy-1, layout->tile_w+4, sfile->layout->tile_h+layout->tile_border_y, colorid,0);
- }
+ if (!(file->selflag & EDITING_FILE)) {
+ if ((params->active_file == i) || (file->selflag & HILITED_FILE) || (file->selflag & SELECTED_FILE) ) {
+ int colorid = (file->selflag & SELECTED_FILE) ? TH_HILITE : TH_BACK;
+ int shade = (params->active_file == i) || (file->selflag & HILITED_FILE) ? 20 : 0;
+ draw_tile(sx, sy-1, layout->tile_w+4, sfile->layout->tile_h+layout->tile_border_y, colorid, shade);
+ }
}
uiSetRoundBox(0);
@@ -538,29 +531,29 @@ void file_draw_list(const bContext *C, ARegion *ar)
UI_ThemeColor4(TH_TEXT);
- if (file->flags & EDITING) {
+ if (file->selflag & EDITING_FILE) {
uiBut *but = uiDefBut(block, TEX, 1, "", sx , sy-layout->tile_h-3,
textwidth, textheight, sfile->params->renameedit, 1.0f, (float)sizeof(sfile->params->renameedit),0,0,"");
uiButSetRenameFunc(but, renamebutton_cb, file);
uiButSetFlag(but, UI_BUT_NO_UTF8); /* allow non utf8 names */
if ( 0 == uiButActiveOnly(C, block, but)) {
- file->flags &= ~EDITING;
+ file->selflag &= ~EDITING_FILE;
}
}
- if (!(file->flags & EDITING)) {
+ if (!(file->selflag & EDITING_FILE)) {
int tpos = (FILE_IMGDISPLAY == params->display) ? sy - layout->tile_h + layout->textheight : sy;
- file_draw_string(sx+1, tpos, file->relname, textwidth, textheight, align);
+ file_draw_string(sx+1, tpos, file->relname, (float)textwidth, textheight, align);
}
if (params->display == FILE_SHORTDISPLAY) {
- sx += layout->column_widths[COLUMN_NAME] + 12;
+ sx += (int)layout->column_widths[COLUMN_NAME] + 12;
if (!(file->type & S_IFDIR)) {
file_draw_string(sx, sy, file->size, layout->column_widths[COLUMN_SIZE], layout->tile_h, align);
- sx += layout->column_widths[COLUMN_SIZE] + 12;
+ sx += (int)layout->column_widths[COLUMN_SIZE] + 12;
}
} else if (params->display == FILE_LONGDISPLAY) {
- sx += layout->column_widths[COLUMN_NAME] + 12;
+ sx += (int)layout->column_widths[COLUMN_NAME] + 12;
#ifndef WIN32
/* rwx rwx rwx */
@@ -578,14 +571,14 @@ void file_draw_list(const bContext *C, ARegion *ar)
#endif
file_draw_string(sx, sy, file->date, layout->column_widths[COLUMN_DATE], layout->tile_h, align);
- sx += layout->column_widths[COLUMN_DATE] + 12;
+ sx += (int)layout->column_widths[COLUMN_DATE] + 12;
file_draw_string(sx, sy, file->time, layout->column_widths[COLUMN_TIME] , layout->tile_h, align);
- sx += layout->column_widths[COLUMN_TIME] + 12;
+ sx += (int)layout->column_widths[COLUMN_TIME] + 12;
if (!(file->type & S_IFDIR)) {
file_draw_string(sx, sy, file->size, layout->column_widths[COLUMN_SIZE], layout->tile_h, align);
- sx += layout->column_widths[COLUMN_SIZE] + 12;
+ sx += (int)layout->column_widths[COLUMN_SIZE] + 12;
}
}
}
@@ -594,4 +587,3 @@ void file_draw_list(const bContext *C, ARegion *ar)
uiDrawBlock(C, block);
}
-
diff --git a/source/blender/editors/space_file/file_intern.h b/source/blender/editors/space_file/file_intern.h
index d9f7e7dc833..f171c4936fc 100644
--- a/source/blender/editors/space_file/file_intern.h
+++ b/source/blender/editors/space_file/file_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_file/file_intern.h
+ * \ingroup spfile
+ */
+
#ifndef ED_FILE_INTERN_H
#define ED_FILE_INTERN_H
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index 100931e02eb..775f06ea7a4 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_file/file_ops.c
+ * \ingroup spfile
+ */
+
+
#include "BKE_context.h"
#include "BKE_screen.h"
#include "BKE_global.h"
@@ -66,121 +71,103 @@
#define INACTIVATE 2
/* ---------- FILE SELECTION ------------ */
-
-static int find_file_mouse(SpaceFile *sfile, struct ARegion* ar, int clamp_bounds, int x, int y)
+static FileSelection find_file_mouse_rect(SpaceFile *sfile, struct ARegion* ar, const rcti* rect)
{
- float fx,fy;
- int active_file = -1;
+ FileSelection sel;
+ float fxmin,fymin,fxmax, fymax;
+
View2D* v2d = &ar->v2d;
+ rcti rect_view;
+
+ UI_view2d_region_to_view(v2d, rect->xmin, rect->ymin, &fxmin, &fymin);
+ UI_view2d_region_to_view(v2d, rect->xmax, rect->ymax, &fxmax, &fymax);
- UI_view2d_region_to_view(v2d, x, y, &fx, &fy);
+ BLI_init_rcti(&rect_view, (int)(v2d->tot.xmin + fxmin), (int)(v2d->tot.xmin + fxmax), (int)(v2d->tot.ymax - fymin), (int)(v2d->tot.ymax - fymax));
- active_file = ED_fileselect_layout_offset(sfile->layout, clamp_bounds, v2d->tot.xmin + fx, v2d->tot.ymax - fy);
+ sel = ED_fileselect_layout_offset_rect(sfile->layout, &rect_view);
- return active_file;
+ return sel;
}
-
-static void file_deselect_all(SpaceFile* sfile)
+static void file_deselect_all(SpaceFile* sfile, unsigned int flag)
{
- int numfiles = filelist_numfiles(sfile->files);
- int i;
-
- for ( i=0; i < numfiles; ++i) {
- struct direntry* file = filelist_file(sfile->files, i);
- if (file && (file->flags & ACTIVEFILE)) {
- file->flags &= ~ACTIVEFILE;
- }
- }
+ FileSelection sel;
+ sel.first = 0;
+ sel.last = filelist_numfiles(sfile->files)-1;
+
+ filelist_select(sfile->files, &sel, FILE_SEL_REMOVE, flag, CHECK_ALL);
}
-typedef enum FileSelect { FILE_SELECT_DIR = 1,
- FILE_SELECT_FILE = 2 } FileSelect;
+typedef enum FileSelect {
+ FILE_SELECT_NOTHING = 0,
+ FILE_SELECT_DIR = 1,
+ FILE_SELECT_FILE = 2
+} FileSelect;
-
-static void clamp_to_filelist(int numfiles, int *first_file, int *last_file)
+static void clamp_to_filelist(int numfiles, FileSelection* sel)
{
/* border select before the first file */
- if ( (*first_file < 0) && (*last_file >=0 ) ) {
- *first_file = 0;
+ if ( (sel->first < 0) && (sel->last >=0 ) ) {
+ sel->first = 0;
}
/* don't select if everything is outside filelist */
- if ( (*first_file >= numfiles) && ((*last_file < 0) || (*last_file >= numfiles)) ) {
- *first_file = -1;
- *last_file = -1;
+ if ( (sel->first >= numfiles) && ((sel->last < 0) || (sel->last >= numfiles)) ) {
+ sel->first = -1;
+ sel->last = -1;
}
/* fix if last file invalid */
- if ( (*first_file > 0) && (*last_file < 0) )
- *last_file = numfiles-1;
+ if ( (sel->first > 0) && (sel->last < 0) )
+ sel->last = numfiles-1;
/* clamp */
- if ( (*first_file >= numfiles) ) {
- *first_file = numfiles-1;
+ if ( (sel->first >= numfiles) ) {
+ sel->first = numfiles-1;
}
- if ( (*last_file >= numfiles) ) {
- *last_file = numfiles-1;
+ if ( (sel->last >= numfiles) ) {
+ sel->last = numfiles-1;
}
}
-static FileSelect file_select(bContext* C, const rcti* rect, short selecting, short toggle_one, short fill)
+static FileSelection file_selection_get(bContext* C, const rcti* rect, short fill)
{
ARegion *ar= CTX_wm_region(C);
SpaceFile *sfile= CTX_wm_space_file(C);
- int first_file = -1;
- int last_file = -1;
- int act_file;
- FileSelect retval = FILE_SELECT_FILE;
+ int numfiles = filelist_numfiles(sfile->files);
+ FileSelection sel;
- FileSelectParams *params = ED_fileselect_get_params(sfile);
- // FileLayout *layout = ED_fileselect_get_layout(sfile, ar);
+ sel = find_file_mouse_rect(sfile, ar, rect);
+ if ( !((sel.first == -1) && (sel.last == -1)) ) {
+ clamp_to_filelist(numfiles, &sel);
+ }
- int numfiles = filelist_numfiles(sfile->files);
-
- params->selstate = NOTACTIVEFILE;
- first_file = find_file_mouse(sfile, ar, 1, rect->xmin, rect->ymax);
- last_file = find_file_mouse(sfile, ar, 1, rect->xmax, rect->ymin);
-
- clamp_to_filelist(numfiles, &first_file, &last_file);
- if (fill && (last_file >= 0) && (last_file < numfiles) ) {
- int f= last_file;
+ /* if desired, fill the selection up from the last selected file to the current one */
+ if (fill && (sel.last >= 0) && (sel.last < numfiles) ) {
+ int f= sel.last;
while (f >= 0) {
- struct direntry* file = filelist_file(sfile->files, f);
- if (file->flags & ACTIVEFILE)
+ if ( filelist_is_selected(sfile->files, f, CHECK_ALL) )
break;
f--;
}
if (f >= 0) {
- first_file = f+1;
- }
- }
-
- /* select all valid files between first and last indicated */
- if ( (first_file >= 0) && (first_file < numfiles) && (last_file >= 0) && (last_file < numfiles) ) {
- for (act_file = first_file; act_file <= last_file; act_file++) {
- struct direntry* file = filelist_file(sfile->files, act_file);
-
- if (toggle_one) {
- if (file->flags & ACTIVEFILE) {
- file->flags &= ~ACTIVEFILE;
- selecting=0;
- } else
- file->flags |= ACTIVEFILE;
- } else if (selecting)
- file->flags |= ACTIVEFILE;
- else
- file->flags &= ~ACTIVEFILE;
+ sel.first = f+1;
}
}
+ return sel;
+}
- /* Don't act on multiple selected files */
- if (first_file != last_file) selecting= 0;
+static FileSelect file_select_do(bContext* C, int selected_idx)
+{
+ FileSelect retval = FILE_SELECT_NOTHING;
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ FileSelectParams *params = ED_fileselect_get_params(sfile);
+ int numfiles = filelist_numfiles(sfile->files);
- /* make the last file active */
- if (selecting && (last_file >= 0 && last_file < numfiles)) {
- struct direntry* file = filelist_file(sfile->files, last_file);
- params->active_file = last_file;
+ /* make the selected file active */
+ if ( (selected_idx >= 0) && (selected_idx < numfiles)) {
+ struct direntry* file = filelist_file(sfile->files, selected_idx);
+ params->active_file = selected_idx;
if(file && S_ISDIR(file->type)) {
/* the path is too long and we are not going up! */
@@ -206,35 +193,97 @@ static FileSelect file_select(bContext* C, const rcti* rect, short selecting, sh
if (file->relname) {
BLI_strncpy(params->file, file->relname, FILE_MAXFILE);
}
-
- }
+ retval = FILE_SELECT_FILE;
+ }
}
+ return retval;
+}
+
+
+static FileSelect file_select(bContext* C, const rcti* rect, FileSelType select, short fill)
+{
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ FileSelect retval = FILE_SELECT_NOTHING;
+ FileSelection sel= file_selection_get(C, rect, fill); /* get the selection */
+ /* flag the files as selected in the filelist */
+ filelist_select(sfile->files, &sel, select, SELECTED_FILE, CHECK_ALL);
+
+ /* Don't act on multiple selected files */
+ if (sel.first != sel.last) select = 0;
+
+ /* Do we have a valid selection and are we actually selecting */
+ if ( (sel.last >= 0) && ((select == FILE_SEL_ADD) || (select == FILE_SEL_TOGGLE)) )
+ {
+ /* Check last selection, if selected, act on the file or dir */
+ if (filelist_is_selected(sfile->files, sel.last, CHECK_ALL)) {
+ retval = file_select_do(C, sel.last);
+ }
+ }
+
/* update operator for name change event */
file_draw_check_cb(C, NULL, NULL);
return retval;
}
+static int file_border_select_modal(bContext *C, wmOperator *op, wmEvent *event)
+{
+ ARegion *ar= CTX_wm_region(C);
+ SpaceFile *sfile= CTX_wm_space_file(C);
+ FileSelectParams *params = ED_fileselect_get_params(sfile);
+ FileSelection sel;
+ rcti rect;
+
+ int result;
+
+ result= WM_border_select_modal(C, op, event);
+
+ if(result==OPERATOR_RUNNING_MODAL) {
+
+ rect.xmin= RNA_int_get(op->ptr, "xmin");
+ rect.ymin= RNA_int_get(op->ptr, "ymin");
+ rect.xmax= RNA_int_get(op->ptr, "xmax");
+ rect.ymax= RNA_int_get(op->ptr, "ymax");
+ BLI_isect_rcti(&(ar->v2d.mask), &rect, &rect);
+
+ sel = file_selection_get(C, &rect, 0);
+ if ( (sel.first != params->sel_first) || (sel.last != params->sel_last) ) {
+ file_deselect_all(sfile, HILITED_FILE);
+ filelist_select(sfile->files, &sel, FILE_SEL_ADD, HILITED_FILE, CHECK_ALL);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
+ }
+ params->sel_first = sel.first; params->sel_last = sel.last;
+
+ }else {
+ params->active_file = -1;
+ params->sel_first = params->sel_last = -1;
+ file_deselect_all(sfile, HILITED_FILE);
+ WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
+ }
+
+ return result;
+}
static int file_border_select_exec(bContext *C, wmOperator *op)
{
ARegion *ar= CTX_wm_region(C);
- short selecting;
rcti rect;
-
- selecting= (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT);
+ FileSelect ret;
+
+ short select= (RNA_int_get(op->ptr, "gesture_mode")==GESTURE_MODAL_SELECT);
rect.xmin= RNA_int_get(op->ptr, "xmin");
rect.ymin= RNA_int_get(op->ptr, "ymin");
rect.xmax= RNA_int_get(op->ptr, "xmax");
rect.ymax= RNA_int_get(op->ptr, "ymax");
BLI_isect_rcti(&(ar->v2d.mask), &rect, &rect);
-
- if (FILE_SELECT_DIR == file_select(C, &rect, selecting, 0, 0)) {
+
+ ret = file_select(C, &rect, select ? FILE_SEL_ADD : FILE_SEL_REMOVE, 0);
+ if (FILE_SELECT_DIR == ret) {
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
- } else {
+ } else if (FILE_SELECT_FILE == ret) {
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
}
return OPERATOR_FINISHED;
@@ -250,7 +299,7 @@ void FILE_OT_select_border(wmOperatorType *ot)
/* api callbacks */
ot->invoke= WM_border_select_invoke;
ot->exec= file_border_select_exec;
- ot->modal= WM_border_select_modal;
+ ot->modal= file_border_select_modal;
ot->poll= ED_operator_file_active;
/* rna */
@@ -261,6 +310,7 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
ARegion *ar= CTX_wm_region(C);
SpaceFile *sfile= CTX_wm_space_file(C);
+ FileSelect ret;
rcti rect;
int extend = RNA_boolean_get(op->ptr, "extend");
int fill = RNA_boolean_get(op->ptr, "fill");
@@ -275,11 +325,12 @@ static int file_select_invoke(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_CANCELLED;
/* single select, deselect all selected first */
- if (!extend) file_deselect_all(sfile);
+ if (!extend) file_deselect_all(sfile, SELECTED_FILE);
- if (FILE_SELECT_DIR == file_select(C, &rect, 1, extend, fill ))
+ ret = file_select(C, &rect, extend ? FILE_SEL_TOGGLE : FILE_SEL_ADD, fill);
+ if (FILE_SELECT_DIR == ret)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_LIST, NULL);
- else
+ else if (FILE_SELECT_FILE == ret)
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_FILE_PARAMS, NULL);
WM_event_add_mousemove(C); /* for directory changes */
@@ -308,29 +359,28 @@ static int file_select_all_exec(bContext *C, wmOperator *UNUSED(op))
{
ScrArea *sa= CTX_wm_area(C);
SpaceFile *sfile= CTX_wm_space_file(C);
+ FileSelection sel;
int numfiles = filelist_numfiles(sfile->files);
int i;
- int select = 1;
+ int is_selected = 0;
+
+ sel.first = 0;
+ sel.last = numfiles-1;
- /* if any file is selected, deselect all first */
+ /* Is any file selected ? */
for ( i=0; i < numfiles; ++i) {
- struct direntry* file = filelist_file(sfile->files, i);
- if (file && (file->flags & ACTIVEFILE)) {
- file->flags &= ~ACTIVEFILE;
- select = 0;
- ED_area_tag_redraw(sa);
+ if (filelist_is_selected(sfile->files, i, CHECK_ALL)) {
+ is_selected = 1;
+ break;
}
}
/* select all only if previously no file was selected */
- if (select) {
- for ( i=0; i < numfiles; ++i) {
- struct direntry* file = filelist_file(sfile->files, i);
- if(file && !S_ISDIR(file->type)) {
- file->flags |= ACTIVEFILE;
- ED_area_tag_redraw(sa);
- }
- }
+ if (is_selected) {
+ filelist_select(sfile->files, &sel, FILE_SEL_REMOVE, SELECTED_FILE, CHECK_ALL);
+ } else {
+ filelist_select(sfile->files, &sel, FILE_SEL_ADD, SELECTED_FILE, CHECK_FILES);
}
+ ED_area_tag_redraw(sa);
return OPERATOR_FINISHED;
}
@@ -343,10 +393,11 @@ void FILE_OT_select_all_toggle(wmOperatorType *ot)
/* api callbacks */
ot->exec= file_select_all_exec;
+ ot->poll= ED_operator_file_active;
/* rna */
- ot->poll= ED_operator_file_active;
+
}
/* ---------- BOOKMARKS ----------- */
@@ -452,9 +503,10 @@ void FILE_OT_delete_bookmark(wmOperatorType *ot)
int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
{
+ View2D* v2d = &ar->v2d;
FileSelectParams* params;
- int numfiles, actfile, origfile;
-
+ int numfiles, origfile;
+
if(sfile==NULL || sfile->files==NULL) return 0;
numfiles = filelist_numfiles(sfile->files);
@@ -466,10 +518,15 @@ int file_hilight_set(SpaceFile *sfile, ARegion *ar, int mx, int my)
my -= ar->winrct.ymin;
if(BLI_in_rcti(&ar->v2d.mask, mx, my)) {
- actfile = find_file_mouse(sfile, ar, 0, mx , my);
+ float fx, fy;
+ int active_file;
+
+ UI_view2d_region_to_view(v2d, mx, my, &fx, &fy);
- if((actfile >= 0) && (actfile < numfiles))
- params->active_file=actfile;
+ active_file = ED_fileselect_layout_offset(sfile->layout, (int)(v2d->tot.xmin + fx), (int)(v2d->tot.ymax - fy));
+
+ if((active_file >= 0) && (active_file < numfiles))
+ params->active_file=active_file;
else
params->active_file= -1;
}
@@ -562,30 +619,28 @@ void file_sfile_to_operator(wmOperator *op, SpaceFile *sfile, char *filepath)
{
PointerRNA itemptr;
int i, numfiles = filelist_numfiles(sfile->files);
- struct direntry *file;
+
if(RNA_struct_find_property(op->ptr, "files")) {
for (i=0; i<numfiles; i++) {
- file = filelist_file(sfile->files, i);
- if(file->flags & ACTIVEFILE) {
- if ((file->type & S_IFDIR)==0) {
- RNA_collection_add(op->ptr, "files", &itemptr);
- RNA_string_set(&itemptr, "name", file->relname);
- }
+ if (filelist_is_selected(sfile->files, i, CHECK_FILES)) {
+ struct direntry *file= filelist_file(sfile->files, i);
+ RNA_collection_add(op->ptr, "files", &itemptr);
+ RNA_string_set(&itemptr, "name", file->relname);
}
}
}
if(RNA_struct_find_property(op->ptr, "dirs")) {
for (i=0; i<numfiles; i++) {
- file = filelist_file(sfile->files, i);
- if(file->flags & ACTIVEFILE) {
- if ((file->type & S_IFDIR)) {
- RNA_collection_add(op->ptr, "dirs", &itemptr);
- RNA_string_set(&itemptr, "name", file->relname);
- }
+ if (filelist_is_selected(sfile->files, i, CHECK_DIRS)) {
+ struct direntry *file= filelist_file(sfile->files, i);
+ RNA_collection_add(op->ptr, "dirs", &itemptr);
+ RNA_string_set(&itemptr, "name", file->relname);
}
}
}
+
+
}
}
@@ -663,12 +718,11 @@ int file_exec(bContext *C, wmOperator *exec_op)
to prevent closing when doubleclicking on .. item */
if (RNA_boolean_get(exec_op->ptr, "need_active")) {
int i, active=0;
- struct direntry *file;
for (i=0; i<filelist_numfiles(sfile->files); i++) {
- file = filelist_file(sfile->files, i);
- if(file->flags & ACTIVEFILE) {
+ if(filelist_is_selected(sfile->files, i, CHECK_ALL)) {
active=1;
+ break;
}
}
if (active == 0)
@@ -817,9 +871,9 @@ static int file_smoothscroll_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent
ScrArea *sa = CTX_wm_area(C);
SpaceFile *sfile= CTX_wm_space_file(C);
ARegion *ar, *oldar= CTX_wm_region(C);
- int numfiles, offset;
+ int offset;
+ int numfiles, numfiles_layout;
int edit_idx = 0;
- int numfiles_layout;
int i;
/* escape if not our timer */
@@ -831,8 +885,7 @@ static int file_smoothscroll_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent
/* check if we are editing a name */
for (i=0; i < numfiles; ++i)
{
- struct direntry *file = filelist_file(sfile->files, i);
- if (file->flags & EDITING) {
+ if (filelist_is_selected(sfile->files, i, CHECK_ALL) ) {
edit_idx=i;
break;
}
@@ -853,7 +906,7 @@ static int file_smoothscroll_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent
return OPERATOR_PASS_THROUGH;
}
- offset = ED_fileselect_layout_offset(sfile->layout, 0, ar->v2d.cur.xmin, -ar->v2d.cur.ymax);
+ offset = ED_fileselect_layout_offset(sfile->layout, (int)ar->v2d.cur.xmin, (int)-ar->v2d.cur.ymax);
if (offset<0) offset=0;
/* scroll offset is the first file in the row/column we are editing in */
@@ -1235,7 +1288,7 @@ static int file_rename_exec(bContext *C, wmOperator *UNUSED(op))
int numfiles = filelist_numfiles(sfile->files);
if ( (0<=idx) && (idx<numfiles) ) {
struct direntry *file= filelist_file(sfile->files, idx);
- file->flags |= EDITING;
+ filelist_select_file(sfile->files, idx, FILE_SEL_ADD, EDITING_FILE, CHECK_ALL);
BLI_strncpy(sfile->params->renameedit, file->relname, FILE_MAXFILE);
sfile->params->renamefile[0]= '\0';
}
@@ -1332,12 +1385,8 @@ void FILE_OT_delete(struct wmOperatorType *ot)
void ED_operatormacros_file(void)
{
- wmOperatorType *ot;
- wmOperatorTypeMacro *otmacro;
+// wmOperatorType *ot;
+// wmOperatorTypeMacro *otmacro;
- ot= WM_operatortype_append_macro("FILE_OT_select_execute", "Select and Execute", OPTYPE_UNDO|OPTYPE_REGISTER);
- WM_operatortype_macro_define(ot, "FILE_OT_select");
- otmacro= WM_operatortype_macro_define(ot, "FILE_OT_execute");
- RNA_boolean_set(otmacro->ptr, "need_active", 1);
-
+ /* future macros */
}
diff --git a/source/blender/editors/space_file/file_panels.c b/source/blender/editors/space_file/file_panels.c
index 37abc854937..959b1ddf1b5 100644
--- a/source/blender/editors/space_file/file_panels.c
+++ b/source/blender/editors/space_file/file_panels.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_file/file_panels.c
+ * \ingroup spfile
+ */
+
+
#include "BKE_context.h"
#include "BKE_screen.h"
@@ -96,7 +101,7 @@ static void file_panel_category(const bContext *C, Panel *pa, FSMenuCategory cat
/* set this list item as active if we have a match */
if(sfile->params) {
- if(strcmp(sfile->params->dir, entry) == 0) {
+ if(BLI_path_cmp(sfile->params->dir, entry) == 0) {
*nr= i;
}
}
@@ -140,7 +145,7 @@ static void file_panel_bookmarks(const bContext *C, Panel *pa)
if(sfile) {
row= uiLayoutRow(pa->layout, 0);
uiItemO(row, "Add", ICON_ZOOMIN, "file.bookmark_add");
- uiItemL(row, NULL, ICON_NULL);
+ uiItemL(row, NULL, ICON_NONE);
file_panel_category(C, pa, FS_CATEGORY_BOOKMARKS, &sfile->bookmarknr, ICON_BOOKMARKS, 1, 0);
}
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 41667a96ab6..f0ffe34476f 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_file/filelist.c
+ * \ingroup spfile
+ */
+
+
/* global includes */
#include <stdlib.h>
@@ -454,7 +459,7 @@ int folderlist_clear_next(struct SpaceFile *sfile)
// if previous_folder, next_folder or refresh_folder operators are executed it doesn't clear folder_next
folder = sfile->folders_prev->last;
- if ((!folder) ||(!strcmp(folder->foldername, sfile->params->dir)))
+ if ((!folder) ||(BLI_path_cmp(folder->foldername, sfile->params->dir) == 0))
return 0;
// eventually clear flist->folders_next
@@ -535,20 +540,20 @@ void filelist_free(struct FileList* filelist)
if (filelist->filelist[i].image) {
IMB_freeImBuf(filelist->filelist[i].image);
}
- filelist->filelist[i].image = 0;
+ filelist->filelist[i].image = NULL;
if (filelist->filelist[i].relname)
MEM_freeN(filelist->filelist[i].relname);
if (filelist->filelist[i].path)
MEM_freeN(filelist->filelist[i].path);
- filelist->filelist[i].relname = 0;
+ filelist->filelist[i].relname = NULL;
if (filelist->filelist[i].string)
MEM_freeN(filelist->filelist[i].string);
- filelist->filelist[i].string = 0;
+ filelist->filelist[i].string = NULL;
}
filelist->numfiles = 0;
free(filelist->filelist);
- filelist->filelist = 0;
+ filelist->filelist = NULL;
filelist->filter = 0;
filelist->filter_glob[0] = '\0';
filelist->numfiltered =0;
@@ -559,7 +564,7 @@ void filelist_freelib(struct FileList* filelist)
{
if(filelist->libfiledata)
BLO_blendhandle_close(filelist->libfiledata);
- filelist->libfiledata= 0;
+ filelist->libfiledata= NULL;
}
struct BlendHandle *filelist_lib(struct FileList* filelist)
@@ -692,7 +697,7 @@ int filelist_find(struct FileList* filelist, char *file)
for (i = 0; i < filelist->numfiles; ++i) {
- if ( strcmp(filelist->filelist[i].relname, file) == 0) {
+ if ( strcmp(filelist->filelist[i].relname, file) == 0) { /* not dealing with user input so dont need BLI_path_cmp */
index = i;
break;
}
@@ -836,8 +841,8 @@ static void filelist_read_dir(struct FileList* filelist)
char wdir[FILE_MAX]= "";
if (!filelist) return;
- filelist->fidx = 0;
- filelist->filelist = 0;
+ filelist->fidx = NULL;
+ filelist->filelist = NULL;
BLI_getwdN(wdir, sizeof(wdir)); /* backup cwd to restore after */
@@ -875,7 +880,7 @@ static void filelist_read_library(struct FileList* filelist)
strcat(name, file->relname);
/* prevent current file being used as acceptable dir */
- if (BLI_streq(G.main->name, name)==0) {
+ if (BLI_path_cmp(G.main->name, name) != 0) {
file->type &= ~S_IFMT;
file->type |= S_IFDIR;
}
@@ -891,7 +896,7 @@ void filelist_readdir(struct FileList* filelist)
int filelist_empty(struct FileList* filelist)
{
- return filelist->filelist == 0;
+ return filelist->filelist == NULL;
}
void filelist_parent(struct FileList* filelist)
@@ -901,23 +906,62 @@ void filelist_parent(struct FileList* filelist)
filelist_readdir(filelist);
}
+void filelist_select_file(struct FileList* filelist, int index, FileSelType select, unsigned int flag, FileCheckType check)
+{
+ struct direntry* file = filelist_file(filelist, index);
+ if (file != NULL) {
+ int check_ok = 0;
+ switch (check) {
+ case CHECK_DIRS:
+ case CHECK_ALL:
+ check_ok = 1;
+ break;
+ case CHECK_FILES:
+ default:
+ check_ok = !S_ISDIR(file->type);
+ break;
+ }
+ if (check_ok) {
+ switch (select) {
+ case FILE_SEL_REMOVE:
+ file->selflag &= ~flag;
+ break;
+ case FILE_SEL_ADD:
+ file->selflag |= flag;
+ break;
+ case FILE_SEL_TOGGLE:
+ file->selflag ^= flag;
+ break;
+ }
+ }
+ }
+}
-void filelist_swapselect(struct FileList* filelist)
+void filelist_select(struct FileList* filelist, FileSelection* sel, FileSelType select, unsigned int flag, FileCheckType check)
{
- struct direntry *file;
- int num, act= 0;
-
- file= filelist->filelist;
- for(num=0; num<filelist->numfiles; num++, file++) {
- if(file->flags & ACTIVEFILE) {
- act= 1;
- break;
+ /* select all valid files between first and last indicated */
+ if ( (sel->first >= 0) && (sel->first < filelist->numfiltered) && (sel->last >= 0) && (sel->last < filelist->numfiltered) ) {
+ int current_file;
+ for (current_file = sel->first; current_file <= sel->last; current_file++) {
+ filelist_select_file(filelist, current_file, select, flag, check);
}
}
- file= filelist->filelist+2;
- for(num=2; num<filelist->numfiles; num++, file++) {
- if(act) file->flags &= ~ACTIVEFILE;
- else file->flags |= ACTIVEFILE;
+}
+
+int filelist_is_selected(struct FileList* filelist, int index, FileCheckType check)
+{
+ struct direntry* file = filelist_file(filelist, index);
+ if (!file) {
+ return 0;
+ }
+ switch (check) {
+ case CHECK_DIRS:
+ return S_ISDIR(file->type) && (file->selflag & SELECTED_FILE);
+ case CHECK_FILES:
+ return S_ISREG(file->type) && (file->selflag & SELECTED_FILE);
+ case CHECK_ALL:
+ default:
+ return (file->selflag & SELECTED_FILE);
}
}
@@ -972,7 +1016,7 @@ void filelist_from_library(struct FileList* filelist)
if (!ok) {
/* free */
if(filelist->libfiledata) BLO_blendhandle_close(filelist->libfiledata);
- filelist->libfiledata= 0;
+ filelist->libfiledata= NULL;
return;
}
@@ -980,9 +1024,9 @@ void filelist_from_library(struct FileList* filelist)
/* there we go */
/* for the time being only read filedata when libfiledata==0 */
- if (filelist->libfiledata==0) {
- filelist->libfiledata= BLO_blendhandle_from_file(dir);
- if(filelist->libfiledata==0) return;
+ if (filelist->libfiledata == NULL) {
+ filelist->libfiledata= BLO_blendhandle_from_file(dir, NULL);
+ if(filelist->libfiledata == NULL) return;
}
idcode= groupname_to_code(group);
@@ -992,16 +1036,15 @@ void filelist_from_library(struct FileList* filelist)
previews = NULL;
if (idcode) {
previews= BLO_blendhandle_get_previews(filelist->libfiledata, idcode);
- names= BLO_blendhandle_get_datablock_names(filelist->libfiledata, idcode);
+ names= BLO_blendhandle_get_datablock_names(filelist->libfiledata, idcode, &nnames);
/* ugh, no rewind, need to reopen */
BLO_blendhandle_close(filelist->libfiledata);
- filelist->libfiledata= BLO_blendhandle_from_file(dir);
+ filelist->libfiledata= BLO_blendhandle_from_file(dir, NULL);
} else {
names= BLO_blendhandle_get_linkable_groups(filelist->libfiledata);
+ nnames= BLI_linklist_length(names);
}
-
- nnames= BLI_linklist_length(names);
filelist->numfiles= nnames + 1;
filelist->filelist= malloc(filelist->numfiles * sizeof(*filelist->filelist));
@@ -1014,8 +1057,11 @@ void filelist_from_library(struct FileList* filelist)
char *blockname= l->link;
filelist->filelist[i + 1].relname= BLI_strdup(blockname);
- if (!idcode)
+ if (idcode) {
+ filelist->filelist[i + 1].type |= S_IFREG;
+ } else {
filelist->filelist[i + 1].type |= S_IFDIR;
+ }
}
if(previews) {
@@ -1111,7 +1157,7 @@ void filelist_from_main(struct FileList *filelist)
idcode= groupname_to_code(filelist->dir);
lb= which_libbase(G.main, idcode );
- if(lb==0) return;
+ if(lb == NULL) return;
id= lb->first;
filelist->numfiles= 0;
@@ -1151,14 +1197,14 @@ void filelist_from_main(struct FileList *filelist)
files->relname= MEM_mallocN(FILE_MAXDIR+FILE_MAXFILE+32, "filename for lib");
sprintf(files->relname, "%s | %s", id->lib->name, id->name+2);
}
- /* files->type |= S_IFDIR; */
+ files->type |= S_IFREG;
#if 0 // XXXXX TODO show the selection status of the objects
if(!filelist->has_func) { /* F4 DATA BROWSE */
if(idcode==ID_OB) {
- if( ((Object *)id)->flag & SELECT) files->flags |= ACTIVEFILE;
+ if( ((Object *)id)->flag & SELECT) files->selflag |= SELECTED_FILE;
}
else if(idcode==ID_SCE) {
- if( ((Scene *)id)->r.scemode & R_BG_RENDER) files->flags |= ACTIVEFILE;
+ if( ((Scene *)id)->r.scemode & R_BG_RENDER) files->selflag |= SELECTED_FILE;
}
}
#endif
diff --git a/source/blender/editors/space_file/filelist.h b/source/blender/editors/space_file/filelist.h
index ff7e6869ee3..c5535b22f22 100644
--- a/source/blender/editors/space_file/filelist.h
+++ b/source/blender/editors/space_file/filelist.h
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_file/filelist.h
+ * \ingroup spfile
+ */
+
+
#ifndef FILELIST_H
#define FILELIST_H
@@ -45,6 +50,20 @@ struct Scene;
struct Main;
struct rcti;
struct ReportList;
+struct FileSelection;
+
+typedef enum FileSelType {
+ FILE_SEL_REMOVE = 0,
+ FILE_SEL_ADD = 1,
+ FILE_SEL_TOGGLE = 2
+} FileSelType;
+
+typedef enum FileCheckType
+{
+ CHECK_DIRS = 1,
+ CHECK_FILES = 2,
+ CHECK_ALL = 3
+} FileCheckType;
struct FileList * filelist_new(short type);
void filelist_init_icons(void);
@@ -56,11 +75,13 @@ int filelist_numfiles(struct FileList* filelist);
const char * filelist_dir(struct FileList* filelist);
void filelist_setdir(struct FileList* filelist, const char *dir);
struct direntry * filelist_file(struct FileList* filelist, int index);
+void filelist_select(struct FileList* filelist, FileSelection* sel, FileSelType select, unsigned int flag, FileCheckType check);
+void filelist_select_file(struct FileList* filelist, int index, FileSelType select, unsigned int flag, FileCheckType check);
+int filelist_is_selected(struct FileList* filelist, int index, FileCheckType check);
void filelist_hidedot(struct FileList* filelist, short hide);
void filelist_setfilter(struct FileList* filelist, unsigned int filter);
void filelist_setfilter_types(struct FileList* filelist, const char *filter_glob);
void filelist_filter(struct FileList* filelist);
-void filelist_swapselect(struct FileList* filelist);
void filelist_imgsize(struct FileList* filelist, short w, short h);
struct ImBuf * filelist_getimage(struct FileList* filelist, int index);
struct ImBuf * filelist_geticon(struct FileList* filelist, int index);
diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c
index c481c5afffc..ea3512b456d 100644
--- a/source/blender/editors/space_file/filesel.c
+++ b/source/blender/editors/space_file/filesel.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_file/filesel.c
+ * \ingroup spfile
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -242,34 +247,76 @@ int ED_fileselect_layout_numfiles(FileLayout* layout, struct ARegion *ar)
int numfiles;
if (layout->flag & FILE_LAYOUT_HOR) {
- int width = ar->v2d.cur.xmax - ar->v2d.cur.xmin - 2*layout->tile_border_x;
- numfiles = (float)width/(float)layout->tile_w+0.5;
+ int width = (int)(ar->v2d.cur.xmax - ar->v2d.cur.xmin - 2*layout->tile_border_x);
+ numfiles = (int)((float)width / (float)layout->tile_w + 0.5f);
return numfiles*layout->rows;
} else {
- int height = ar->v2d.cur.ymax - ar->v2d.cur.ymin - 2*layout->tile_border_y;
- numfiles = (float)height/(float)layout->tile_h+0.5;
+ int height = (int)(ar->v2d.cur.ymax - ar->v2d.cur.ymin - 2*layout->tile_border_y);
+ numfiles = (int)((float)height/(float)layout->tile_h + 0.5f);
return numfiles*layout->columns;
}
}
-int ED_fileselect_layout_offset(FileLayout* layout, int clamp_bounds, int x, int y)
+static int is_inside(int x, int y, int cols, int rows)
+{
+ return ( (x >= 0) && (x<cols) && (y>=0) && (y<rows) );
+}
+
+FileSelection ED_fileselect_layout_offset_rect(FileLayout* layout, const rcti* rect)
+{
+ int colmin, colmax, rowmin, rowmax;
+ FileSelection sel;
+ sel.first = sel.last = -1;
+
+ if (layout == NULL)
+ return sel;
+
+ colmin = (rect->xmin)/(layout->tile_w + 2*layout->tile_border_x);
+ rowmin = (rect->ymin)/(layout->tile_h + 2*layout->tile_border_y);
+ colmax = (rect->xmax)/(layout->tile_w + 2*layout->tile_border_x);
+ rowmax = (rect->ymax)/(layout->tile_h + 2*layout->tile_border_y);
+
+ if ( is_inside(colmin, rowmin, layout->columns, layout->rows) ||
+ is_inside(colmax, rowmax, layout->columns, layout->rows) ) {
+ CLAMP(colmin, 0, layout->columns-1);
+ CLAMP(rowmin, 0, layout->rows-1);
+ CLAMP(colmax, 0, layout->columns-1);
+ CLAMP(rowmax, 0, layout->rows-1);
+ }
+
+ if ( (colmin > layout->columns-1) || (rowmin > layout->rows-1) ) {
+ sel.first = -1;
+ } else {
+ if (layout->flag & FILE_LAYOUT_HOR)
+ sel.first = layout->rows*colmin + rowmin;
+ else
+ sel.first = colmin + layout->columns*rowmin;
+ }
+ if ( (colmax > layout->columns-1) || (rowmax > layout->rows-1) ) {
+ sel.last = -1;
+ } else {
+ if (layout->flag & FILE_LAYOUT_HOR)
+ sel.last = layout->rows*colmax + rowmax;
+ else
+ sel.last = colmax + layout->columns*rowmax;
+ }
+
+ return sel;
+}
+
+int ED_fileselect_layout_offset(FileLayout* layout, int x, int y)
{
int offsetx, offsety;
int active_file;
if (layout == NULL)
- return 0;
+ return -1;
offsetx = (x)/(layout->tile_w + 2*layout->tile_border_x);
offsety = (y)/(layout->tile_h + 2*layout->tile_border_y);
- if (clamp_bounds) {
- CLAMP(offsetx, 0, layout->columns-1);
- CLAMP(offsety, 0, layout->rows-1);
- } else {
- if (offsetx > layout->columns-1) return -1 ;
- if (offsety > layout->rows-1) return -1 ;
- }
+ if (offsetx > layout->columns-1) return -1 ;
+ if (offsety > layout->rows-1) return -1 ;
if (layout->flag & FILE_LAYOUT_HOR)
active_file = layout->rows*offsetx + offsety;
@@ -376,7 +423,7 @@ static void column_widths(struct FileList* files, struct FileLayout* layout)
{
struct direntry* file = filelist_file(files, i);
if (file) {
- int len;
+ float len;
len = file_string_width(file->relname);
if (len > layout->column_widths[COLUMN_NAME]) layout->column_widths[COLUMN_NAME] = len;
len = file_string_width(file->date);
@@ -400,12 +447,12 @@ static void column_widths(struct FileList* files, struct FileLayout* layout)
void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar)
{
FileSelectParams *params = ED_fileselect_get_params(sfile);
- FileLayout *layout=0;
+ FileLayout *layout= NULL;
View2D *v2d= &ar->v2d;
int maxlen = 0;
int numfiles;
int textheight;
- if (sfile->layout == 0) {
+ if (sfile->layout == NULL) {
sfile->layout = MEM_callocN(sizeof(struct FileLayout), "file_layout");
sfile->layout->dirty = 1;
}
@@ -413,7 +460,7 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar)
if (!sfile->layout->dirty) return;
numfiles = filelist_numfiles(sfile->files);
- textheight = file_font_pointsize();
+ textheight = (int)file_font_pointsize();
layout = sfile->layout;
layout->textheight = textheight;
@@ -426,7 +473,7 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar)
layout->prv_border_y = 6;
layout->tile_w = layout->prv_w + 2*layout->prv_border_x;
layout->tile_h = layout->prv_h + 2*layout->prv_border_y + textheight;
- layout->width= (v2d->cur.xmax - v2d->cur.xmin - 2*layout->tile_border_x);
+ layout->width= (int)(v2d->cur.xmax - v2d->cur.xmin - 2*layout->tile_border_x);
layout->columns= layout->width / (layout->tile_w + 2*layout->tile_border_x);
if(layout->columns > 0)
layout->rows= numfiles/layout->columns + 1; // XXX dirty, modulo is zero
@@ -444,27 +491,27 @@ void ED_fileselect_init_layout(struct SpaceFile *sfile, struct ARegion *ar)
layout->prv_border_x = 0;
layout->prv_border_y = 0;
layout->tile_h = textheight*3/2;
- layout->height= v2d->cur.ymax - v2d->cur.ymin - 2*layout->tile_border_y;
+ layout->height= (int)(v2d->cur.ymax - v2d->cur.ymin - 2*layout->tile_border_y);
layout->rows = layout->height / (layout->tile_h + 2*layout->tile_border_y);
column_widths(sfile->files, layout);
if (params->display == FILE_SHORTDISPLAY) {
maxlen = ICON_DEFAULT_WIDTH + 4 +
- layout->column_widths[COLUMN_NAME] + 12 +
- layout->column_widths[COLUMN_SIZE] + 12;
+ (int)layout->column_widths[COLUMN_NAME] + 12 +
+ (int)layout->column_widths[COLUMN_SIZE] + 12;
} else {
maxlen = ICON_DEFAULT_WIDTH + 4 +
- layout->column_widths[COLUMN_NAME] + 12 +
+ (int)layout->column_widths[COLUMN_NAME] + 12 +
#ifndef WIN32
- layout->column_widths[COLUMN_MODE1] + 12 +
- layout->column_widths[COLUMN_MODE2] + 12 +
- layout->column_widths[COLUMN_MODE3] + 12 +
- layout->column_widths[COLUMN_OWNER] + 12 +
+ (int)layout->column_widths[COLUMN_MODE1] + 12 +
+ (int)layout->column_widths[COLUMN_MODE2] + 12 +
+ (int)layout->column_widths[COLUMN_MODE3] + 12 +
+ (int)layout->column_widths[COLUMN_OWNER] + 12 +
#endif
- layout->column_widths[COLUMN_DATE] + 12 +
- layout->column_widths[COLUMN_TIME] + 12 +
- layout->column_widths[COLUMN_SIZE] + 12;
+ (int)layout->column_widths[COLUMN_DATE] + 12 +
+ (int)layout->column_widths[COLUMN_TIME] + 12 +
+ (int)layout->column_widths[COLUMN_SIZE] + 12;
}
layout->tile_w = maxlen;
@@ -521,7 +568,7 @@ int file_select_match(struct SpaceFile *sfile, const char *pattern)
for (i = 0; i < n; i++) {
file = filelist_file(sfile->files, i);
if (fnmatch(pattern, file->relname, 0) == 0) {
- file->flags |= ACTIVEFILE;
+ file->selflag |= SELECTED_FILE;
match = 1;
}
}
diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c
index 340c7f72e4a..a6e84b0c41d 100644
--- a/source/blender/editors/space_file/fsmenu.c
+++ b/source/blender/editors/space_file/fsmenu.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_file/fsmenu.c
+ * \ingroup spfile
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
@@ -168,9 +173,11 @@ void fsmenu_insert_entry(struct FSMenu* fsmenu, FSMenuCategory category, const c
for (; fsme; prev= fsme, fsme= fsme->next) {
if (fsme->path) {
- if (BLI_streq(path, fsme->path)) {
+ const int cmp_ret= BLI_path_cmp(path, fsme->path);
+ if (cmp_ret == 0) {
return;
- } else if (sorted && strcmp(path, fsme->path)<0) {
+ }
+ else if (sorted && cmp_ret < 0) {
break;
}
} else {
@@ -227,7 +234,7 @@ void fsmenu_remove_entry(struct FSMenu* fsmenu, FSMenuCategory category, int idx
void fsmenu_write_file(struct FSMenu* fsmenu, const char *filename)
{
FSMenuEntry *fsme= NULL;
- int count=FSMENU_RECENT_MAX;
+ int nskip= 0;
FILE *fp = fopen(filename, "w");
if (!fp) return;
@@ -239,7 +246,11 @@ void fsmenu_write_file(struct FSMenu* fsmenu, const char *filename)
}
}
fprintf(fp, "[Recent]\n");
- for (fsme= fsmenu_get_category(fsmenu, FS_CATEGORY_RECENT); fsme && count; fsme= fsme->next, --count) {
+ nskip = fsmenu_get_nentries(fsmenu, FS_CATEGORY_RECENT) - FSMENU_RECENT_MAX;
+ // skip first entries if list too long
+ for (fsme= fsmenu_get_category(fsmenu, FS_CATEGORY_RECENT); fsme && (nskip>0); fsme= fsme->next, --nskip)
+ ;
+ for (; fsme; fsme= fsme->next) {
if (fsme->path && fsme->save) {
fprintf(fp, "%s\n", fsme->path);
}
@@ -312,7 +323,7 @@ void fsmenu_read_system(struct FSMenu* fsmenu)
#if (MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4)
OSErr err=noErr;
int i;
- char *home;
+ const char *home;
/* loop through all the OS X Volumes, and add them to the SYSTEM section */
for (i=1; err!=nsvErr; i++)
@@ -454,7 +465,7 @@ void fsmenu_read_system(struct FSMenu* fsmenu)
#else
/* unix */
{
- char *home= getenv("HOME");
+ const char *home= getenv("HOME");
if(home) {
BLI_snprintf(line, FILE_MAXDIR, "%s/", home);
diff --git a/source/blender/editors/space_file/fsmenu.h b/source/blender/editors/space_file/fsmenu.h
index ec322de5c52..c300dd84986 100644
--- a/source/blender/editors/space_file/fsmenu.h
+++ b/source/blender/editors/space_file/fsmenu.h
@@ -28,6 +28,11 @@
*
*/
+/** \file blender/editors/space_file/fsmenu.h
+ * \ingroup spfile
+ */
+
+
#ifndef BSE_FSMENU_H
#define BSE_FSMENU_H
diff --git a/source/blender/editors/space_file/space_file.c b/source/blender/editors/space_file/space_file.c
index 4c475039c37..ec0d9806bca 100644
--- a/source/blender/editors/space_file/space_file.c
+++ b/source/blender/editors/space_file/space_file.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_file/space_file.c
+ * \ingroup spfile
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -231,7 +236,7 @@ static void file_refresh(const bContext *C, ScrArea *UNUSED(sa))
if (idx >= 0) {
struct direntry *file= filelist_file(sfile->files, idx);
if (file) {
- file->flags |= EDITING;
+ file->selflag |= EDITING_FILE;
}
}
BLI_strncpy(sfile->params->renameedit, sfile->params->renamefile, sizeof(sfile->params->renameedit));
@@ -407,7 +412,8 @@ static void file_keymap(struct wmKeyConfig *keyconf)
/* keys for main area */
keymap= WM_keymap_find(keyconf, "File Browser Main", SPACE_FILE, 0);
- WM_keymap_add_item(keymap, "FILE_OT_select_execute", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
+ kmi= WM_keymap_add_item(keymap, "FILE_OT_execute", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
+ RNA_boolean_set(kmi->ptr, "need_active", 1);
WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, 0, 0);
kmi = WM_keymap_add_item(keymap, "FILE_OT_select", LEFTMOUSE, KM_CLICK, KM_SHIFT, 0);
RNA_boolean_set(kmi->ptr, "extend", 1);
@@ -415,6 +421,7 @@ static void file_keymap(struct wmKeyConfig *keyconf)
RNA_boolean_set(kmi->ptr, "extend", 1);
RNA_boolean_set(kmi->ptr, "fill", 1);
WM_keymap_add_item(keymap, "FILE_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "FILE_OT_refresh", PADPERIOD, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "FILE_OT_select_border", BKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "FILE_OT_select_border", EVT_TWEAK_L, KM_ANY, 0, 0);
WM_keymap_add_item(keymap, "FILE_OT_rename", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
diff --git a/source/blender/editors/space_graph/CMakeLists.txt b/source/blender/editors/space_graph/CMakeLists.txt
index 5b5fd41bf23..59f2b22516d 100644
--- a/source/blender/editors/space_graph/CMakeLists.txt
+++ b/source/blender/editors/space_graph/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
../../windowmanager
../../../../intern/guardedalloc
../../../../intern/audaspace/intern
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c
index 8c97e269aa4..17e7b1b5b18 100644
--- a/source/blender/editors/space_graph/graph_buttons.c
+++ b/source/blender/editors/space_graph/graph_buttons.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_graph/graph_buttons.c
+ * \ingroup spgraph
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -139,19 +144,19 @@ static void graph_panel_view(const bContext *C, Panel *pa)
/* 2D-Cursor */
col= uiLayoutColumn(pa->layout, 0);
- uiItemR(col, &spaceptr, "show_cursor", 0, NULL, ICON_NULL);
+ uiItemR(col, &spaceptr, "show_cursor", 0, NULL, ICON_NONE);
subcol= uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&spaceptr, "show_cursor"));
- uiItemO(subcol, "Cursor from Selection", ICON_NULL, "GRAPH_OT_frame_jump");
+ uiItemO(subcol, "Cursor from Selection", ICON_NONE, "GRAPH_OT_frame_jump");
subcol= uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&spaceptr, "show_cursor"));
row= uiLayoutSplit(subcol, 0.7, 1);
- uiItemR(row, &sceneptr, "frame_current", 0, "Cursor X", ICON_NULL);
+ uiItemR(row, &sceneptr, "frame_current", 0, "Cursor X", ICON_NONE);
uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_CFRA);
row= uiLayoutSplit(subcol, 0.7, 1);
- uiItemR(row, &spaceptr, "cursor_position_y", 0, "Cursor Y", ICON_NULL);
+ uiItemR(row, &spaceptr, "cursor_position_y", 0, "Cursor Y", ICON_NONE);
uiItemEnumO(row, "GRAPH_OT_snap", "To Keys", 0, "type", GRAPHKEYS_SNAP_VALUE);
}
@@ -187,18 +192,18 @@ static void graph_panel_properties(const bContext *C, Panel *pa)
col= uiLayoutColumn(layout, 1);
uiLayoutSetEnabled(col, (fcu->flag & FCURVE_DISABLED)!=0);
uiItemR(col, &fcu_ptr, "data_path", 0, "", ICON_RNA);
- uiItemR(col, &fcu_ptr, "array_index", 0, NULL, ICON_NULL);
+ uiItemR(col, &fcu_ptr, "array_index", 0, NULL, ICON_NONE);
/* color settings */
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Display Color:", ICON_NULL);
+ uiItemL(col, "Display Color:", ICON_NONE);
row= uiLayoutRow(col, 1);
- uiItemR(row, &fcu_ptr, "color_mode", 0, "", ICON_NULL);
+ uiItemR(row, &fcu_ptr, "color_mode", 0, "", ICON_NONE);
subrow= uiLayoutRow(row, 1);
uiLayoutSetEnabled(subrow, (fcu->color_mode==FCURVE_COLOR_CUSTOM));
- uiItemR(subrow, &fcu_ptr, "color", 0, "", ICON_NULL);
+ uiItemR(subrow, &fcu_ptr, "color", 0, "", ICON_NONE);
MEM_freeN(ale);
}
@@ -264,33 +269,33 @@ static void graph_panel_key_properties(const bContext *C, Panel *pa)
/* interpolation */
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &bezt_ptr, "interpolation", 0, NULL, ICON_NULL);
+ uiItemR(col, &bezt_ptr, "interpolation", 0, NULL, ICON_NONE);
/* numerical coordinate editing */
col= uiLayoutColumn(layout, 1);
/* keyframe itself */
- uiItemR(col, &bezt_ptr, "co", 0, "Key", ICON_NULL);
+ uiItemR(col, &bezt_ptr, "co", 0, "Key", ICON_NONE);
/* previous handle - only if previous was Bezier interpolation */
if ((prevbezt) && (prevbezt->ipo == BEZT_IPO_BEZ))
- uiItemR(col, &bezt_ptr, "handle_left", 0, NULL, ICON_NULL);
+ uiItemR(col, &bezt_ptr, "handle_left", 0, NULL, ICON_NONE);
/* next handle - only if current is Bezier interpolation */
if (bezt->ipo == BEZT_IPO_BEZ)
- uiItemR(col, &bezt_ptr, "handle_right", 0, NULL, ICON_NULL);
+ uiItemR(col, &bezt_ptr, "handle_right", 0, NULL, ICON_NONE);
}
else {
if ((fcu->bezt == NULL) && (fcu->modifiers.first)) {
/* modifiers only - so no keyframes to be active */
- uiItemL(layout, "F-Curve only has F-Modifiers", ICON_NULL);
+ uiItemL(layout, "F-Curve only has F-Modifiers", ICON_NONE);
uiItemL(layout, "See Modifiers panel below", ICON_INFO);
}
else if (fcu->fpt) {
/* samples only */
- uiItemL(layout, "F-Curve doesn't have any keyframes as it only contains sampled points", ICON_NULL);
+ uiItemL(layout, "F-Curve doesn't have any keyframes as it only contains sampled points", ICON_NONE);
}
else
- uiItemL(layout, "No active keyframe on F-Curve", ICON_NULL);
+ uiItemL(layout, "No active keyframe on F-Curve", ICON_NONE);
}
MEM_freeN(ale);
@@ -384,7 +389,6 @@ static void graph_panel_driverVar__singleProp(uiLayout *layout, ID *id, DriverVa
DriverTarget *dtar= &dvar->targets[0];
PointerRNA dtar_ptr;
uiLayout *row, *col;
- uiBlock *block;
/* initialise RNA pointer to the target */
RNA_pointer_create(id, &RNA_DriverTarget, dtar, &dtar_ptr);
@@ -402,9 +406,8 @@ static void graph_panel_driverVar__singleProp(uiLayout *layout, ID *id, DriverVa
RNA_id_pointer_create(dtar->id, &root_ptr);
col= uiLayoutColumn(layout, 1);
- block= uiLayoutGetBlock(col);
- /* rna path */
- uiTemplatePathBuilder(col, &dtar_ptr, "data_path", &root_ptr, "Path");
+ /* rna path */
+ uiTemplatePathBuilder(col, &dtar_ptr, "data_path", &root_ptr, "Path");
}
}
@@ -469,7 +472,7 @@ static void graph_panel_driverVar__locDiff(uiLayout *layout, ID *id, DriverVar *
uiItemPointerR(col, &dtar_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
}
- uiItemR(col, &dtar_ptr, "use_local_space_transform", 0, NULL, ICON_NULL);
+ uiItemR(col, &dtar_ptr, "use_local_space_transform", 0, NULL, ICON_NONE);
col= uiLayoutColumn(layout, 1);
uiTemplateAnyID(col, &dtar2_ptr, "id", "id_type", "Ob/Bone 2:");
@@ -481,7 +484,7 @@ static void graph_panel_driverVar__locDiff(uiLayout *layout, ID *id, DriverVar *
uiItemPointerR(col, &dtar2_ptr, "bone_target", &tar_ptr, "bones", "", ICON_BONE_DATA);
}
- uiItemR(col, &dtar2_ptr, "use_local_space_transform", 0, NULL, ICON_NULL);
+ uiItemR(col, &dtar2_ptr, "use_local_space_transform", 0, NULL, ICON_NONE);
}
/* settings for 'transform channel' driver variable type */
@@ -507,8 +510,8 @@ static void graph_panel_driverVar__transChan(uiLayout *layout, ID *id, DriverVar
}
row= uiLayoutRow(layout, 1);
- uiItemR(row, &dtar_ptr, "transform_type", 0, "", ICON_NULL);
- uiItemR(row, &dtar_ptr, "use_local_space_transform", 0, NULL, ICON_NULL);
+ uiItemR(row, &dtar_ptr, "transform_type", 0, "", ICON_NONE);
+ uiItemR(row, &dtar_ptr, "use_local_space_transform", 0, NULL, ICON_NONE);
}
/* driver settings for active F-Curve (only for 'Drivers' mode) */
@@ -547,12 +550,12 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
col= uiLayoutColumn(pa->layout, 1);
block= uiLayoutGetBlock(col);
- uiItemR(col, &driver_ptr, "type", 0, NULL, ICON_NULL);
+ uiItemR(col, &driver_ptr, "type", 0, NULL, ICON_NONE);
/* show expression box if doing scripted drivers, and/or error messages when invalid drivers exist */
if (driver->type == DRIVER_TYPE_PYTHON) {
/* expression */
- uiItemR(col, &driver_ptr, "expression", 0, "Expr", ICON_NULL);
+ uiItemR(col, &driver_ptr, "expression", 0, "Expr", ICON_NONE);
/* errors? */
if (driver->flag & DRIVER_FLAG_INVALID)
@@ -566,17 +569,17 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
col= uiLayoutColumn(pa->layout, 1);
/* debug setting */
- uiItemR(col, &driver_ptr, "show_debug_info", 0, NULL, ICON_NULL);
+ uiItemR(col, &driver_ptr, "show_debug_info", 0, NULL, ICON_NONE);
/* value of driver */
if (driver->flag & DRIVER_FLAG_SHOWDEBUG) {
uiLayout *row= uiLayoutRow(col, 1);
char valBuf[32];
- uiItemL(row, "Driver Value:", ICON_NULL);
+ uiItemL(row, "Driver Value:", ICON_NONE);
sprintf(valBuf, "%.3f", driver->curval);
- uiItemL(row, valBuf, ICON_NULL);
+ uiItemL(row, valBuf, ICON_NONE);
}
/* add driver variables */
@@ -601,7 +604,7 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
row= uiLayoutRow(box, 0);
block= uiLayoutGetBlock(row);
/* variable name */
- uiItemR(row, &dvar_ptr, "name", 0, "", ICON_NULL);
+ uiItemR(row, &dvar_ptr, "name", 0, "", ICON_NONE);
/* remove button */
uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -611,7 +614,7 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
/* variable type */
row= uiLayoutRow(box, 0);
- uiItemR(row, &dvar_ptr, "type", 0, "", ICON_NULL);
+ uiItemR(row, &dvar_ptr, "type", 0, "", ICON_NONE);
/* variable type settings */
box= uiLayoutBox(col);
@@ -637,10 +640,10 @@ static void graph_panel_drivers(const bContext *C, Panel *pa)
box= uiLayoutBox(col);
row= uiLayoutRow(box, 1);
- uiItemL(row, "Value:", ICON_NULL);
+ uiItemL(row, "Value:", ICON_NONE);
sprintf(valBuf, "%.3f", dvar->curval);
- uiItemL(row, valBuf, ICON_NULL);
+ uiItemL(row, valBuf, ICON_NONE);
}
}
diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index 44bc3fe7d94..d3b9c68a492 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_graph/graph_draw.c
+ * \ingroup spgraph
+ */
+
+
#include <stdio.h>
#include <math.h>
#include <string.h>
diff --git a/source/blender/editors/space_graph/graph_edit.c b/source/blender/editors/space_graph/graph_edit.c
index 5756c99862d..962cadba1f3 100644
--- a/source/blender/editors/space_graph/graph_edit.c
+++ b/source/blender/editors/space_graph/graph_edit.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_graph/graph_edit.c
+ * \ingroup spgraph
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
@@ -54,6 +59,7 @@
#include "BKE_report.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "UI_view2d.h"
#include "ED_anim_api.h"
@@ -75,7 +81,7 @@
/* Get the min/max keyframes*/
/* note: it should return total boundbox, filter for selection only can be argument... */
-void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, float *ymin, float *ymax)
+void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, float *ymin, float *ymax, const short selOnly)
{
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
@@ -101,7 +107,7 @@ void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, flo
float unitFac;
/* get range */
- calc_fcurve_bounds(fcu, &txmin, &txmax, &tymin, &tymax);
+ calc_fcurve_bounds(fcu, &txmin, &txmax, &tymin, &tymax, selOnly);
/* apply NLA scaling */
if (adt) {
@@ -122,8 +128,8 @@ void get_graph_keyframe_extents (bAnimContext *ac, float *xmin, float *xmax, flo
}
/* ensure that the extents are not too extreme that view implodes...*/
- if ((xmin && xmax) && (fabs(*xmax - *xmin) < 0.1)) *xmax += 0.1;
- if ((ymin && ymax) && (fabs(*ymax - *ymin) < 0.1)) *ymax += 0.1;
+ if ((xmin && xmax) && (fabsf(*xmax - *xmin) < 0.1f)) *xmax += 0.1f;
+ if ((ymin && ymax) && (fabsf(*ymax - *ymin) < 0.1f)) *ymax += 0.1f;
/* free memory */
BLI_freelistN(&anim_data);
@@ -161,7 +167,7 @@ static int graphkeys_previewrange_exec(bContext *C, wmOperator *UNUSED(op))
scene= ac.scene;
/* set the range directly */
- get_graph_keyframe_extents(&ac, &min, &max, NULL, NULL);
+ get_graph_keyframe_extents(&ac, &min, &max, NULL, NULL, FALSE);
scene->r.flag |= SCER_PRV_RANGE;
scene->r.psfra= (int)floor(min + 0.5f);
scene->r.pefra= (int)floor(max + 0.5f);
@@ -190,37 +196,51 @@ void GRAPH_OT_previewrange_set (wmOperatorType *ot)
/* ****************** View-All Operator ****************** */
-static int graphkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
+static int graphkeys_viewall(bContext *C, const short selOnly)
{
bAnimContext ac;
View2D *v2d;
float extra;
-
+
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
return OPERATOR_CANCELLED;
v2d= &ac.ar->v2d;
-
+
/* set the horizontal range, with an extra offset so that the extreme keys will be in view */
- get_graph_keyframe_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax, &v2d->cur.ymin, &v2d->cur.ymax);
-
+ get_graph_keyframe_extents(&ac, &v2d->cur.xmin, &v2d->cur.xmax, &v2d->cur.ymin, &v2d->cur.ymax, selOnly);
+
extra= 0.1f * (v2d->cur.xmax - v2d->cur.xmin);
v2d->cur.xmin -= extra;
v2d->cur.xmax += extra;
-
+
extra= 0.1f * (v2d->cur.ymax - v2d->cur.ymin);
v2d->cur.ymin -= extra;
v2d->cur.ymax += extra;
-
+
/* do View2D syncing */
UI_view2d_sync(CTX_wm_screen(C), CTX_wm_area(C), v2d, V2D_LOCK_COPY);
-
+
/* set notifier that things have changed */
ED_area_tag_redraw(CTX_wm_area(C));
-
+
return OPERATOR_FINISHED;
}
+
+/* ......... */
+
+static int graphkeys_viewall_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ /* whole range */
+ return graphkeys_viewall(C, FALSE);
+}
+static int graphkeys_view_selected_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ /* only selected */
+ return graphkeys_viewall(C, TRUE);
+}
+
void GRAPH_OT_view_all (wmOperatorType *ot)
{
/* identifiers */
@@ -236,6 +256,21 @@ void GRAPH_OT_view_all (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
+void GRAPH_OT_view_selected (wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name= "View Selected";
+ ot->idname= "GRAPH_OT_view_selected";
+ ot->description= "Reset viewable area to show selected keyframe range";
+
+ /* api callbacks */
+ ot->exec= graphkeys_view_selected_exec;
+ ot->poll= ED_operator_graphedit_active; // XXX: unchecked poll to get fsamples working too, but makes modifier damage trickier...
+
+ /* flags */
+ ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
/* ******************** Create Ghost-Curves Operator *********************** */
/* This operator samples the data of the selected F-Curves to F-Points, storing them
* as 'ghost curves' in the active Graph Editor
@@ -775,9 +810,6 @@ static int graphkeys_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
static int graphkeys_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
graphkeys_duplicate_exec(C, op);
-
- RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
- WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
return OPERATOR_FINISHED;
}
@@ -798,7 +830,7 @@ void GRAPH_OT_duplicate (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+ RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
}
/* ******************** Delete Keyframes Operator ************************* */
@@ -1469,12 +1501,13 @@ static int graphkeys_handletype_exec(bContext *C, wmOperator *op)
* of values to -180 degrees to 180 degrees.
*/
-#if 0 // XXX this is not ready for the primetime yet
-
/* set of three euler-rotation F-Curves */
typedef struct tEulerFilter {
+ struct tEulerFilter *next, *prev;
+
ID *id; /* ID-block which owns the channels */
- FCurve (*fcurves)[3]; /* 3 Pointers to F-Curves */
+ FCurve *(fcurves[3]); /* 3 Pointers to F-Curves */
+ char *rna_path; /* Pointer to one of the RNA Path's used by one of the F-Curves */
} tEulerFilter;
static int graphkeys_euler_filter_exec (bContext *C, wmOperator *op)
@@ -1486,7 +1519,8 @@ static int graphkeys_euler_filter_exec (bContext *C, wmOperator *op)
int filter;
ListBase eulers = {NULL, NULL};
- tEulerFilter *euf= NULL;
+ tEulerFilter *euf= NULL;
+ int groups=0, failed=0;
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -1496,7 +1530,7 @@ static int graphkeys_euler_filter_exec (bContext *C, wmOperator *op)
* 1) Sets of three related rotation curves are identified from the selected channels,
* and are stored as a single 'operation unit' for the next step
* 2) Each set of three F-Curves is processed for each keyframe, with the values being
- * processed according to one of several ways.
+ * processed as necessary
*/
/* step 1: extract only the rotation f-curves */
@@ -1510,45 +1544,134 @@ static int graphkeys_euler_filter_exec (bContext *C, wmOperator *op)
* - only rotation curves
* - for pchan curves, make sure we're only using the euler curves
*/
- if (strstr(fcu->rna_path, "rotation_euler") == 0)
+ if (strstr(fcu->rna_path, "rotation_euler") == NULL)
continue;
+ else if (ELEM3(fcu->array_index, 0, 1, 2) == 0) {
+ BKE_reportf(op->reports, RPT_WARNING,
+ "Euler Rotation F-Curve has invalid index (ID='%s', Path='%s', Index=%d)",
+ (ale->id)? ale->id->name:"<No ID>", fcu->rna_path, fcu->array_index);
+ continue;
+ }
- /* check if current set of 3-curves is suitable to add this curve to
- * - things like whether the current set of curves is 'full' should be checked later only
- * - first check if id-blocks are compatible
+ /* optimisation: assume that xyz curves will always be stored consecutively,
+ * so if the paths or the ID's don't match up, then a curve needs to be added
+ * to a new group
*/
- if ((euf) && (ale->id != euf->id)) {
- /* if the paths match, add this curve to the set of curves */
- // NOTE: simple string compare for now... could be a bit more fancy...
-
+ if ((euf) && (euf->id == ale->id) && (strcmp(euf->rna_path, fcu->rna_path)==0)) {
+ /* this should be fine to add to the existing group then */
+ euf->fcurves[fcu->array_index]= fcu;
}
else {
/* just add to a new block */
euf= MEM_callocN(sizeof(tEulerFilter), "tEulerFilter");
BLI_addtail(&eulers, euf);
+ groups++;
euf->id= ale->id;
+ euf->rna_path = fcu->rna_path; /* this should be safe, since we're only using it for a short time */
euf->fcurves[fcu->array_index]= fcu;
}
}
BLI_freelistN(&anim_data);
+ if (groups == 0) {
+ BKE_report(op->reports, RPT_WARNING, "No Euler Rotation F-Curves to fix up");
+ return OPERATOR_CANCELLED;
+ }
+
/* step 2: go through each set of curves, processing the values at each keyframe
* - it is assumed that there must be a full set of keyframes at each keyframe position
*/
for (euf= eulers.first; euf; euf= euf->next) {
+ int f;
+
+ /* sanity check: ensure that there are enough F-Curves to work on in this group */
+ // TODO: also enforce assumption that there be a full set of keyframes at each position by ensuring that totvert counts are same?
+ if (ELEM3(NULL, euf->fcurves[0], euf->fcurves[1], euf->fcurves[2])) {
+ /* report which components are missing */
+ BKE_reportf(op->reports, RPT_WARNING,
+ "Missing %s%s%s component(s) of euler rotation for ID='%s' and RNA-Path='%s'",
+ (euf->fcurves[0]==NULL)? "X":"",
+ (euf->fcurves[1]==NULL)? "Y":"",
+ (euf->fcurves[2]==NULL)? "Z":"",
+ euf->id->name, euf->rna_path);
+
+ /* keep track of number of failed sets, and carry on to next group */
+ failed++;
+ continue;
+ }
+ /* simple method: just treat any difference between keys of greater than 180 degrees as being a flip */
+ // FIXME: there are more complicated methods that will be needed to fix more cases than just some
+ for (f = 0; f < 3; f++) {
+ FCurve *fcu = euf->fcurves[f];
+ BezTriple *bezt, *prev=NULL;
+ unsigned int i;
+
+ /* skip if not enough vets to do a decent analysis of... */
+ if (fcu->totvert <= 2)
+ continue;
+
+ /* prev follows bezt, bezt = "current" point to be fixed */
+ for (i=0, bezt=fcu->bezt; i < fcu->totvert; i++, prev=bezt, bezt++) {
+ /* our method depends on determining a "difference" from the previous vert */
+ if (prev == NULL)
+ continue;
+
+ /* > 180 degree flip? */
+ if (fabs(prev->vec[1][1] - bezt->vec[1][1]) >= M_PI) {
+ /* 360 degrees to add/subtract frame value until difference is acceptably small that there's no more flip */
+ const float fac = 2.0f * (float)M_PI;
+
+ if (prev->vec[1][1] > bezt->vec[1][1]) {
+ while (fabsf(bezt->vec[1][1] - prev->vec[1][1]) >= (float)M_PI) {
+ bezt->vec[0][1] += fac;
+ bezt->vec[1][1] += fac;
+ bezt->vec[2][1] += fac;
+ }
+ }
+ else /* if (prev->vec[1][1] < bezt->vec[1][1]) */ {
+ while (fabsf(bezt->vec[1][1] - prev->vec[1][1]) >= (float)M_PI) {
+ bezt->vec[0][1] -= fac;
+ bezt->vec[1][1] -= fac;
+ bezt->vec[2][1] -= fac;
+ }
+ }
+ }
+ }
+ }
}
BLI_freelistN(&eulers);
- return OPERATOR_FINISHED;
+ /* updates + finishing warnings */
+ if (failed == groups) {
+ BKE_report(op->reports, RPT_ERROR,
+ "No Euler Rotations could be corrected. Ensure each rotation has keys for all components, and that F-Curves for these are in consecutive XYZ order and selected.");
+ return OPERATOR_CANCELLED;
+ }
+ else {
+ if (failed) {
+ BKE_report(op->reports, RPT_ERROR,
+ "Some Euler Rotations couldn't be corrected due to missing/unselected/out-of-order F-Curves. Ensure each rotation has keys for all components, and that F-Curves for these are in consecutive XYZ order and selected.");
+ }
+
+ /* validate keyframes after editing */
+ ANIM_editkeyframes_refresh(&ac);
+
+ /* set notifier that keyframes have changed */
+ WM_event_add_notifier(C, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
+
+ /* done at last */
+ return OPERATOR_FINISHED;
+ }
}
void GRAPH_OT_euler_filter (wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Euler Filter";
+ ot->name= "Euler Discontinuity Filter";
ot->idname= "GRAPH_OT_euler_filter";
+ ot->description= "Fixes the most common causes of gimbal lock in the selected Euler Rotation F-Curves";
/* api callbacks */
ot->exec= graphkeys_euler_filter_exec;
@@ -1558,8 +1681,6 @@ void GRAPH_OT_euler_filter (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
}
-#endif // XXX this is not ready for the primetime yet
-
/* ***************** Jump to Selected Frames Operator *********************** */
/* snap current-frame indicator to 'average time' of selected keyframe */
@@ -1923,7 +2044,7 @@ static int graph_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *UNU
uiLayout *layout;
int i;
- pup= uiPupMenuBegin(C, "Add F-Curve Modifier", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Add F-Curve Modifier", ICON_NONE);
layout= uiPupMenuLayout(pup);
/* start from 1 to skip the 'Invalid' modifier type */
@@ -1936,7 +2057,7 @@ static int graph_fmodifier_add_invoke (bContext *C, wmOperator *op, wmEvent *UNU
continue;
/* create operator menu item with relevant properties filled in */
- props_ptr= uiItemFullO(layout, "GRAPH_OT_fmodifier_add", fmi->name, ICON_NULL, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, "GRAPH_OT_fmodifier_add", fmi->name, ICON_NONE, NULL, WM_OP_EXEC_REGION_WIN, UI_ITEM_O_RETURN_PROPS);
/* the only thing that gets set from the menu is the type of F-Modifier to add */
RNA_enum_set(&props_ptr, "type", i);
/* the following properties are just repeats of existing ones... */
diff --git a/source/blender/editors/space_graph/graph_intern.h b/source/blender/editors/space_graph/graph_intern.h
index b596e659b63..2aefb7c64dd 100644
--- a/source/blender/editors/space_graph/graph_intern.h
+++ b/source/blender/editors/space_graph/graph_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_graph/graph_intern.h
+ * \ingroup spgraph
+ */
+
#ifndef ED_GRAPH_INTERN_H
#define ED_GRAPH_INTERN_H
@@ -87,10 +92,11 @@ enum {
/* ***************************************** */
/* graph_edit.c */
-void get_graph_keyframe_extents (struct bAnimContext *ac, float *xmin, float *xmax, float *ymin, float *ymax);
+void get_graph_keyframe_extents (struct bAnimContext *ac, float *xmin, float *xmax, float *ymin, float *ymax, const short do_selected);
void GRAPH_OT_previewrange_set(struct wmOperatorType *ot);
void GRAPH_OT_view_all(struct wmOperatorType *ot);
+void GRAPH_OT_view_selected(struct wmOperatorType *ot);
void GRAPH_OT_click_insert(struct wmOperatorType *ot);
void GRAPH_OT_keyframe_insert(struct wmOperatorType *ot);
@@ -105,6 +111,7 @@ void GRAPH_OT_sample(struct wmOperatorType *ot);
void GRAPH_OT_bake(struct wmOperatorType *ot);
void GRAPH_OT_sound_bake(struct wmOperatorType *ot);
void GRAPH_OT_smooth(struct wmOperatorType *ot);
+void GRAPH_OT_euler_filter(struct wmOperatorType *ot);
void GRAPH_OT_handle_type(struct wmOperatorType *ot);
void GRAPH_OT_interpolation_type(struct wmOperatorType *ot);
diff --git a/source/blender/editors/space_graph/graph_ops.c b/source/blender/editors/space_graph/graph_ops.c
index 93004a871d0..8510446768d 100644
--- a/source/blender/editors/space_graph/graph_ops.c
+++ b/source/blender/editors/space_graph/graph_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_graph/graph_ops.c
+ * \ingroup spgraph
+ */
+
+
#include <stdlib.h>
#include <math.h>
@@ -40,6 +45,7 @@
#include "UI_view2d.h"
+#include "ED_anim_api.h"
#include "ED_screen.h"
#include "ED_transform.h"
@@ -221,6 +227,7 @@ void graphedit_operatortypes(void)
WM_operatortype_append(GRAPH_OT_previewrange_set);
WM_operatortype_append(GRAPH_OT_view_all);
+ WM_operatortype_append(GRAPH_OT_view_selected);
WM_operatortype_append(GRAPH_OT_properties);
WM_operatortype_append(GRAPH_OT_ghost_curves_create);
@@ -249,6 +256,7 @@ void graphedit_operatortypes(void)
WM_operatortype_append(GRAPH_OT_sound_bake);
WM_operatortype_append(GRAPH_OT_smooth);
WM_operatortype_append(GRAPH_OT_clean);
+ WM_operatortype_append(GRAPH_OT_euler_filter);
WM_operatortype_append(GRAPH_OT_delete);
WM_operatortype_append(GRAPH_OT_duplicate);
@@ -264,6 +272,20 @@ void graphedit_operatortypes(void)
WM_operatortype_append(GRAPH_OT_fmodifier_paste);
}
+void ED_operatormacros_graph(void)
+{
+ wmOperatorType *ot;
+ wmOperatorTypeMacro *otmacro;
+
+ ot= WM_operatortype_append_macro("GRAPH_OT_duplicate_move", "Duplicate", OPTYPE_UNDO|OPTYPE_REGISTER);
+ if (ot) {
+ WM_operatortype_macro_define(ot, "GRAPH_OT_duplicate");
+ otmacro= WM_operatortype_macro_define(ot, "TRANSFORM_OT_transform");
+ RNA_enum_set(otmacro->ptr, "mode", TFM_TIME_DUPLICATE);
+ }
+}
+
+
/* ************************** registration - keymaps **********************************/
static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
@@ -356,7 +378,7 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
WM_keymap_add_item(keymap, "GRAPH_OT_delete", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "GRAPH_OT_delete", DELKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "GRAPH_OT_duplicate", DKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_duplicate_move", DKEY, KM_PRESS, KM_SHIFT, 0);
/* insertkey */
WM_keymap_add_item(keymap, "GRAPH_OT_keyframe_insert", IKEY, KM_PRESS, 0, 0);
@@ -369,6 +391,7 @@ static void graphedit_keymap_keyframes (wmKeyConfig *keyconf, wmKeyMap *keymap)
/* auto-set range */
WM_keymap_add_item(keymap, "GRAPH_OT_previewrange_set", PKEY, KM_PRESS, KM_CTRL|KM_ALT, 0);
WM_keymap_add_item(keymap, "GRAPH_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "GRAPH_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
/* F-Modifiers */
RNA_boolean_set(WM_keymap_add_item(keymap, "GRAPH_OT_fmodifier_add", MKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "only_active", 0);
diff --git a/source/blender/editors/space_graph/graph_select.c b/source/blender/editors/space_graph/graph_select.c
index 0d6f097c613..920f477e7eb 100644
--- a/source/blender/editors/space_graph/graph_select.c
+++ b/source/blender/editors/space_graph/graph_select.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_graph/graph_select.c
+ * \ingroup spgraph
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
@@ -86,7 +91,7 @@ static void deselect_graph_keys (bAnimContext *ac, short test, short sel)
int filter;
SpaceIpo *sipo= (SpaceIpo *)ac->sa->spacedata.first;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
KeyframeEditFunc test_cb, sel_cb;
/* determine type-based settings */
@@ -234,7 +239,7 @@ static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, sho
* guess when a callback might use something different
*/
if (adt)
- ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, incl_handles==0);
/* set horizontal range (if applicable)
* NOTE: these values are only used for x-range and y-range but not region
@@ -264,7 +269,7 @@ static void borderselect_graphkeys (bAnimContext *ac, rcti rect, short mode, sho
/* un-apply NLA mapping from all the keyframes */
if (adt)
- ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, incl_handles==0);
/* unapply unit corrections */
ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_RESTORE|ANIM_UNITCONV_ONLYKEYS);
@@ -454,7 +459,7 @@ static void columnselect_graph_keys (bAnimContext *ac, short mode)
break;
case GRAPHKEYS_COLUMNSEL_MARKERS_COLUMN: /* list of selected markers */
- ED_markers_make_cfra_list(ac->markers, &ked.list, 1);
+ ED_markers_make_cfra_list(ac->markers, &ked.list, SELECT);
break;
default: /* invalid option */
@@ -724,7 +729,7 @@ static void graphkeys_select_leftright (bAnimContext *ac, short leftright, short
int filter;
KeyframeEditFunc ok_cb, select_cb;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
Scene *scene= ac->scene;
/* if select mode is replace, deselect all keyframes (and channels) first */
@@ -982,7 +987,7 @@ static void get_nearest_fcurve_verts_list (bAnimContext *ac, int mval[2], ListBa
/* apply NLA mapping to all the keyframes */
if (adt)
- ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 0);
if (fcu->bezt) {
BezTriple *bezt1=fcu->bezt, *prevbezt=NULL;
@@ -1015,7 +1020,7 @@ static void get_nearest_fcurve_verts_list (bAnimContext *ac, int mval[2], ListBa
/* un-apply NLA mapping from all the keyframes */
if (adt)
- ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 0);
/* unapply unit corrections */
ANIM_unit_mapping_apply_fcurve(ac->scene, ale->id, ale->key_data, ANIM_UNITCONV_RESTORE);
@@ -1198,14 +1203,15 @@ static void mouse_graph_keys (bAnimContext *ac, int mval[], short select_mode, s
else if (select_mode == SELECT_ADD)
nvi->fcu->flag |= FCURVE_SELECTED;
}
-
- /* set active F-Curve (NOTE: sync the filter flags with findnearest_fcurve_vert) */
- if (nvi->fcu->flag & FCURVE_SELECTED) {
- int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
- ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, nvi->fcu, ANIMTYPE_FCURVE);
- }
}
-
+
+ /* set active F-Curve (NOTE: sync the filter flags with findnearest_fcurve_vert) */
+ /* needs to be called with (sipo->flag & SIPO_SELCUVERTSONLY) otherwise the active flag won't be set [#26452] */
+ if (nvi->fcu->flag & FCURVE_SELECTED) {
+ int filter= (ANIMFILTER_VISIBLE | ANIMFILTER_CURVEVISIBLE | ANIMFILTER_CURVESONLY | ANIMFILTER_NODUPLIS);
+ ANIM_set_active_channel(ac, ac->data, ac->datatype, filter, nvi->fcu, ANIMTYPE_FCURVE);
+ }
+
/* free temp sample data for filtering */
MEM_freeN(nvi);
}
@@ -1294,9 +1300,7 @@ static void graphkeys_mselect_column (bAnimContext *ac, int mval[2], short selec
static int graphkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
bAnimContext ac;
- Scene *scene;
ARegion *ar;
- View2D *v2d;
short selectmode;
int mval[2];
@@ -1305,9 +1309,7 @@ static int graphkeys_clickselect_invoke(bContext *C, wmOperator *op, wmEvent *ev
return OPERATOR_CANCELLED;
/* get useful pointers from animation context data */
- scene= ac.scene;
ar= ac.ar;
- v2d= &ar->v2d;
/* get mouse coordinates (in region coordinates) */
mval[0]= (event->x - ar->winrct.xmin);
diff --git a/source/blender/editors/space_graph/graph_utils.c b/source/blender/editors/space_graph/graph_utils.c
index 7c3b61e79b3..e4509a29a91 100644
--- a/source/blender/editors/space_graph/graph_utils.c
+++ b/source/blender/editors/space_graph/graph_utils.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_graph/graph_utils.c
+ * \ingroup spgraph
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
diff --git a/source/blender/editors/space_graph/space_graph.c b/source/blender/editors/space_graph/space_graph.c
index 38919076b13..554d2e36ccf 100644
--- a/source/blender/editors/space_graph/space_graph.c
+++ b/source/blender/editors/space_graph/space_graph.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_graph/space_graph.c
+ * \ingroup spgraph
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -248,7 +253,7 @@ static void graph_main_area_draw(const bContext *C, ARegion *ar)
graph_draw_curves(&ac, sipo, ar, grid, 1);
/* XXX the slow way to set tot rect... but for nice sliders needed (ton) */
- get_graph_keyframe_extents(&ac, &v2d->tot.xmin, &v2d->tot.xmax, &v2d->tot.ymin, &v2d->tot.ymax);
+ get_graph_keyframe_extents(&ac, &v2d->tot.xmin, &v2d->tot.xmax, &v2d->tot.ymin, &v2d->tot.ymax, FALSE);
/* extra offset so that these items are visible */
v2d->tot.xmin -= 10.0f;
v2d->tot.xmax += 10.0f;
diff --git a/source/blender/editors/space_image/CMakeLists.txt b/source/blender/editors/space_image/CMakeLists.txt
index 8568278d0bb..80c04798e70 100644
--- a/source/blender/editors/space_image/CMakeLists.txt
+++ b/source/blender/editors/space_image/CMakeLists.txt
@@ -32,6 +32,7 @@ set(INC
../../windowmanager
../../render/extern/include
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c
index 6334fbc0008..fc56c8c6187 100644
--- a/source/blender/editors/space_image/image_buttons.c
+++ b/source/blender/editors/space_image/image_buttons.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_image/image_buttons.c
+ * \ingroup spimage
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -244,16 +249,10 @@ static void image_editvertex_buts(const bContext *C, uiBlock *block)
ocent[1] *= imy;
}
- //uiBlockBeginAlign(block);
- if(nactive==1) {
- uiDefButF(block, NUM, B_TRANS_IMAGE, "Vertex X:", 10, 10, 145, 19, &ocent[0], -10*imx, 10.0*imx, step, digits, "");
- uiDefButF(block, NUM, B_TRANS_IMAGE, "Vertex Y:", 165, 10, 145, 19, &ocent[1], -10*imy, 10.0*imy, step, digits, "");
- }
- else {
- uiDefButF(block, NUM, B_TRANS_IMAGE, "Median X:", 10, 10, 145, 19, &ocent[0], -10*imx, 10.0*imx, step, digits, "");
- uiDefButF(block, NUM, B_TRANS_IMAGE, "Median Y:", 165, 10, 145, 19, &ocent[1], -10*imy, 10.0*imy, step, digits, "");
- }
- //uiBlockEndAlign(block);
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_TRANS_IMAGE, "X:", 10, 10, 145, 19, &ocent[0], -10*imx, 10.0*imx, step, digits, "");
+ uiDefButF(block, NUM, B_TRANS_IMAGE, "Y:", 165, 10, 145, 19, &ocent[1], -10*imy, 10.0*imy, step, digits, "");
+ uiBlockEndAlign(block);
}
}
else { // apply event
@@ -326,7 +325,7 @@ static void image_panel_curves(const bContext *C, Panel *pa)
levels= (ibuf->channels==4);
RNA_pointer_create(&sc->id, &RNA_SpaceImageEditor, sima, &simaptr);
- uiTemplateCurveMapping(pa->layout, &simaptr, "curves", 'c', levels, 0);
+ uiTemplateCurveMapping(pa->layout, &simaptr, "curve", 'c', levels, 0);
}
ED_space_image_release_buffer(sima, lock);
@@ -705,7 +704,7 @@ static void uiblock_layer_pass_arrow_buttons(uiLayout *layout, RenderResult *rr,
if(rr==NULL || iuser==NULL)
return;
if(rr->layers.first==NULL) {
- uiItemL(row, "No Layers in Render Result.", ICON_NULL);
+ uiItemL(row, "No Layers in Render Result.", ICON_NONE);
return;
}
@@ -805,8 +804,8 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
image_info(ima, ibuf, str);
BKE_image_release_ibuf(ima, lock);
- uiItemL(layout, ima->id.name+2, ICON_NULL);
- uiItemL(layout, str, ICON_NULL);
+ uiItemL(layout, ima->id.name+2, ICON_NONE);
+ uiItemL(layout, str, ICON_NONE);
if(ima->type==IMA_TYPE_COMPOSITE) {
// XXX not working yet
@@ -838,7 +837,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
}
else {
row= uiLayoutRow(layout, 0);
- uiItemR(row, &imaptr, "source", 0, NULL, ICON_NULL);
+ uiItemR(row, &imaptr, "source", 0, NULL, ICON_NONE);
if(ima->source != IMA_SRC_GENERATED) {
row= uiLayoutRow(layout, 1);
@@ -852,7 +851,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
row= uiLayoutRow(split, 1);
uiLayoutSetEnabled(row, ima->packedfile==NULL);
- uiItemR(row, &imaptr, "filepath", 0, "", ICON_NULL);
+ uiItemR(row, &imaptr, "filepath", 0, "", ICON_NONE);
uiItemO(row, "", ICON_FILE_REFRESH, "image.reload");
}
@@ -876,7 +875,7 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
ibuf= BKE_image_acquire_ibuf(ima, iuser, &lock);
image_info(ima, ibuf, str);
BKE_image_release_ibuf(ima, lock);
- uiItemL(layout, str, ICON_NULL);
+ uiItemL(layout, str, ICON_NONE);
}
}
@@ -887,13 +886,13 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
split= uiLayoutSplit(layout, 0, 0);
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "use_fields", 0, NULL, ICON_NULL);
+ uiItemR(col, &imaptr, "use_fields", 0, NULL, ICON_NONE);
row= uiLayoutRow(col, 0);
- uiItemR(row, &imaptr, "field_order", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, &imaptr, "field_order", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
uiLayoutSetActive(row, RNA_boolean_get(&imaptr, "use_fields"));
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "use_premultiply", 0, NULL, ICON_NULL);
+ uiItemR(col, &imaptr, "use_premultiply", 0, NULL, ICON_NONE);
}
}
@@ -906,30 +905,30 @@ void uiTemplateImage(uiLayout *layout, bContext *C, PointerRNA *ptr, const char
sprintf(str, "(%d) Frames", iuser->framenr);
row= uiLayoutRow(col, 1);
- uiItemR(col, userptr, "frame_duration", 0, str, ICON_NULL);
+ uiItemR(col, userptr, "frame_duration", 0, str, ICON_NONE);
if(ima->anim) {
block= uiLayoutGetBlock(row);
- but= uiDefBut(block, BUT, 0, "Match Movie Length", 0, 0, UI_UNIT_X*2, UI_UNIT_Y, 0, 0, 0, 0, 0, "Set the number of frames to match the movie or sequence.");
+ but= uiDefBut(block, BUT, 0, "Match Movie Length", 0, 0, UI_UNIT_X*2, UI_UNIT_Y, NULL, 0, 0, 0, 0, "Set the number of frames to match the movie or sequence.");
uiButSetFunc(but, set_frames_cb, ima, iuser);
}
- uiItemR(col, userptr, "frame_start", 0, "Start", ICON_NULL);
- uiItemR(col, userptr, "frame_offset", 0, NULL, ICON_NULL);
+ uiItemR(col, userptr, "frame_start", 0, "Start", ICON_NONE);
+ uiItemR(col, userptr, "frame_offset", 0, NULL, ICON_NONE);
col= uiLayoutColumn(split, 0);
- uiItemR(col, userptr, "fields_per_frame", 0, "Fields", ICON_NULL);
- uiItemR(col, userptr, "use_auto_refresh", 0, NULL, ICON_NULL);
- uiItemR(col, userptr, "use_cyclic", 0, NULL, ICON_NULL);
+ uiItemR(col, userptr, "fields_per_frame", 0, "Fields", ICON_NONE);
+ uiItemR(col, userptr, "use_auto_refresh", 0, NULL, ICON_NONE);
+ uiItemR(col, userptr, "use_cyclic", 0, NULL, ICON_NONE);
}
else if(ima->source==IMA_SRC_GENERATED) {
split= uiLayoutSplit(layout, 0, 0);
col= uiLayoutColumn(split, 1);
- uiItemR(col, &imaptr, "generated_width", 0, "X", ICON_NULL);
- uiItemR(col, &imaptr, "generated_height", 0, "Y", ICON_NULL);
+ uiItemR(col, &imaptr, "generated_width", 0, "X", ICON_NONE);
+ uiItemR(col, &imaptr, "generated_height", 0, "Y", ICON_NONE);
col= uiLayoutColumn(split, 0);
- uiItemR(col, &imaptr, "generated_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(col, &imaptr, "generated_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
}
}
@@ -973,16 +972,6 @@ void image_buttons_register(ARegionType *art)
{
PanelType *pt;
- /* editvertex_buts not working atm */
- if(0) {
- pt= MEM_callocN(sizeof(PanelType), "spacetype image panel uv");
- strcpy(pt->idname, "IMAGE_PT_uv");
- strcpy(pt->label, "UV");
- pt->draw= image_panel_uv;
- pt->poll= image_panel_uv_poll;
- BLI_addtail(&art->paneltypes, pt);
- }
-
pt= MEM_callocN(sizeof(PanelType), "spacetype image panel curves");
strcpy(pt->idname, "IMAGE_PT_curves");
strcpy(pt->label, "Curves");
@@ -996,6 +985,13 @@ void image_buttons_register(ARegionType *art)
strcpy(pt->label, "Grease Pencil");
pt->draw= gpencil_panel_standard;
BLI_addtail(&art->paneltypes, pt);
+
+ pt= MEM_callocN(sizeof(PanelType), "spacetype image panel uv");
+ strcpy(pt->idname, "IMAGE_PT_uv");
+ strcpy(pt->label, "UV Vertex");
+ pt->draw= image_panel_uv;
+ pt->poll= image_panel_uv_poll;
+ BLI_addtail(&art->paneltypes, pt);
}
static int image_properties(bContext *C, wmOperator *UNUSED(op))
diff --git a/source/blender/editors/space_image/image_draw.c b/source/blender/editors/space_image/image_draw.c
index e19a001f005..2f007027e04 100644
--- a/source/blender/editors/space_image/image_draw.c
+++ b/source/blender/editors/space_image/image_draw.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_image/image_draw.c
+ * \ingroup spimage
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
@@ -138,23 +143,24 @@ void draw_image_info(ARegion *ar, int channels, int x, int y, char *cp, float *f
if(fp) {
if(channels==4)
- ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %.3f G: %.3f B: %.3f A: %.3f ", fp[0], fp[1], fp[2], fp[3]);
+ ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %.4f G: %.4f B: %.4f A: %.4f ", fp[0], fp[1], fp[2], fp[3]);
else if(channels==1)
- ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Val: %.3f ", fp[0]);
+ ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Val: %.4f ", fp[0]);
else if(channels==3)
- ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %.3f G: %.3f B: %.3f ", fp[0], fp[1], fp[2]);
+ ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| R: %.4f G: %.4f B: %.4f ", fp[0], fp[1], fp[2]);
}
if(zp)
- ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Z: %.4f ", 0.5+0.5*(((float)*zp)/(float)0x7fffffff));
+ ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Z: %.4f ", 0.5f+0.5f*(((float)*zp)/(float)0x7fffffff));
if(zpf)
ofs+= BLI_snprintf(str + ofs, sizeof(str)-ofs, "| Z: %.3f ", *zpf);
- (void)ofs;
+ (void)ofs; /* quiet clang */
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
-
- glColor4f(.0,.0,.0,.25);
+
+ /* noisy, high contrast make impossible to read if lower alpha is used. */
+ glColor4ub(0, 0, 0, 190);
glRecti(0.0, 0.0, ar->winrct.xmax - ar->winrct.xmin + 1, 20);
glDisable(GL_BLEND);
@@ -188,21 +194,21 @@ static void draw_image_grid(ARegion *ar, float zoomx, float zoomy)
if(gridsize<1.0f) {
while(gridsize<1.0f && gridsize<1000000.0f ) {
- gridsize*= 4.0;
- gridstep*= 4.0;
+ gridsize*= 4.0f;
+ gridstep*= 4.0f;
}
}
else {
while(gridsize>=4.0f && gridsize<1000000.0f) {
- gridsize/= 4.0;
- gridstep/= 4.0;
+ gridsize/= 4.0f;
+ gridstep/= 4.0f;
}
}
/* the fine resolution level */
- blendfac= 0.25*gridsize - floor(0.25*gridsize);
- CLAMP(blendfac, 0.0, 1.0);
- UI_ThemeColorShade(TH_BACK, (int)(20.0*(1.0-blendfac)));
+ blendfac= 0.25f*gridsize - floorf(0.25f*gridsize);
+ CLAMP(blendfac, 0.0f, 1.0f);
+ UI_ThemeColorShade(TH_BACK, (int)(20.0f*(1.0f-blendfac)));
fac= 0.0f;
glBegin(GL_LINES);
diff --git a/source/blender/editors/space_image/image_header.c b/source/blender/editors/space_image/image_header.c
index be481053693..92e829c0dbb 100644
--- a/source/blender/editors/space_image/image_header.c
+++ b/source/blender/editors/space_image/image_header.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_image/image_header.c
+ * \ingroup spimage
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -45,6 +50,7 @@
#include "WM_types.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "image_intern.h"
@@ -60,13 +66,13 @@ static int toolbox_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *UNUSED(e
show_uvedit= ED_space_image_show_uvedit(sima, obedit);
- pup= uiPupMenuBegin(C, "Toolbox", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Toolbox", ICON_NONE);
layout= uiPupMenuLayout(pup);
- uiItemM(layout, C, "IMAGE_MT_view", NULL, ICON_NULL);
- if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_select", NULL, ICON_NULL);
- uiItemM(layout, C, "IMAGE_MT_image", NULL, ICON_NULL);
- if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_uvs", NULL, ICON_NULL);
+ uiItemM(layout, C, "IMAGE_MT_view", NULL, ICON_NONE);
+ if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_select", NULL, ICON_NONE);
+ uiItemM(layout, C, "IMAGE_MT_image", NULL, ICON_NONE);
+ if(show_uvedit) uiItemM(layout, C, "IMAGE_MT_uvs", NULL, ICON_NONE);
uiPupMenuEnd(C, pup);
diff --git a/source/blender/editors/space_image/image_intern.h b/source/blender/editors/space_image/image_intern.h
index f3804fbc453..5857e62e78a 100644
--- a/source/blender/editors/space_image/image_intern.h
+++ b/source/blender/editors/space_image/image_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_image/image_intern.h
+ * \ingroup spimage
+ */
+
+
#ifndef ED_IMAGE_INTERN_H
#define ED_IMAGE_INTERN_H
diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c
index 19fe795bb58..4a732c5812b 100644
--- a/source/blender/editors/space_image/image_ops.c
+++ b/source/blender/editors/space_image/image_ops.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_image/image_ops.c
+ * \ingroup spimage
+ */
+
+
#include <stddef.h>
#include <string.h>
#include <stdlib.h>
@@ -66,6 +71,7 @@
#include "bmesh.h"
#include "ED_image.h"
+#include "ED_render.h"
#include "ED_screen.h"
#include "ED_space_api.h"
#include "ED_uvedit.h"
@@ -174,6 +180,7 @@ int space_image_main_area_poll(bContext *C)
typedef struct ViewPanData {
float x, y;
float xof, yof;
+ int event_type;
} ViewPanData;
static void view_pan_init(bContext *C, wmOperator *op, wmEvent *event)
@@ -188,6 +195,7 @@ static void view_pan_init(bContext *C, wmOperator *op, wmEvent *event)
vpd->y= event->y;
vpd->xof= sima->xof;
vpd->yof= sima->yof;
+ vpd->event_type= event->type;
WM_event_add_modal_handler(C, op);
}
@@ -264,9 +272,8 @@ static int view_pan_modal(bContext *C, wmOperator *op, wmEvent *event)
RNA_float_set_array(op->ptr, "offset", offset);
view_pan_exec(C, op);
break;
- case MIDDLEMOUSE:
- case LEFTMOUSE:
- if(event->val==KM_RELEASE) {
+ default:
+ if(event->type==vpd->event_type && event->val==KM_RELEASE) {
view_pan_exit(C, op, 0);
return OPERATOR_FINISHED;
}
@@ -308,6 +315,7 @@ void IMAGE_OT_view_pan(wmOperatorType *ot)
typedef struct ViewZoomData {
float x, y;
float zoom;
+ int event_type;
} ViewZoomData;
static void view_zoom_init(bContext *C, wmOperator *op, wmEvent *event)
@@ -321,7 +329,8 @@ static void view_zoom_init(bContext *C, wmOperator *op, wmEvent *event)
vpd->x= event->x;
vpd->y= event->y;
vpd->zoom= sima->zoom;
-
+ vpd->event_type= event->type;
+
WM_event_add_modal_handler(C, op);
}
@@ -367,7 +376,7 @@ static int view_zoom_invoke(bContext *C, wmOperator *op, wmEvent *event)
ARegion *ar= CTX_wm_region(C);
float factor;
- factor= 1.0 + (event->x-event->prevx+event->y-event->prevy)/300.0f;
+ factor= 1.0f + (event->x-event->prevx+event->y-event->prevy)/300.0f;
RNA_float_set(op->ptr, "factor", factor);
sima_zoom_set(sima, ar, sima->zoom*factor);
ED_region_tag_redraw(CTX_wm_region(C));
@@ -389,14 +398,13 @@ static int view_zoom_modal(bContext *C, wmOperator *op, wmEvent *event)
switch(event->type) {
case MOUSEMOVE:
- factor= 1.0 + (vpd->x-event->x+vpd->y-event->y)/300.0f;
+ factor= 1.0f + (vpd->x-event->x+vpd->y-event->y)/300.0f;
RNA_float_set(op->ptr, "factor", factor);
sima_zoom_set(sima, ar, vpd->zoom*factor);
ED_region_tag_redraw(CTX_wm_region(C));
break;
- case MIDDLEMOUSE:
- case LEFTMOUSE:
- if(event->val==KM_RELEASE) {
+ default:
+ if(event->type==vpd->event_type && event->val==KM_RELEASE) {
view_zoom_exit(C, op, 0);
return OPERATOR_FINISHED;
}
@@ -518,10 +526,10 @@ static int view_selected_exec(bContext *C, wmOperator *UNUSED(op))
d[0]= max[0] - min[0];
d[1]= max[1] - min[1];
- size= 0.5*MAX2(d[0], d[1])*MAX2(width, height)/256.0f;
+ size= 0.5f*MAX2(d[0], d[1])*MAX2(width, height)/256.0f;
- if(size<=0.01) size= 0.01;
- sima_zoom_set(sima, ar, 0.7/size);
+ if(size<=0.01f) size= 0.01f;
+ sima_zoom_set(sima, ar, 0.7f/size);
ED_region_tag_redraw(CTX_wm_region(C));
@@ -746,6 +754,9 @@ static int open_exec(bContext *C, wmOperator *op)
iuser->fie_ima= 2;
}
+ /* XXX unpackImage frees image buffers */
+ ED_preview_kill_jobs(C);
+
BKE_image_signal(ima, iuser, IMA_SIGNAL_RELOAD);
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, ima);
@@ -791,7 +802,7 @@ static int open_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
void IMAGE_OT_open(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Open";
+ ot->name= "Open Image";
ot->idname= "IMAGE_OT_open";
/* api callbacks */
@@ -819,6 +830,9 @@ static int replace_exec(bContext *C, wmOperator *op)
RNA_string_get(op->ptr, "filepath", str);
BLI_strncpy(sima->image->name, str, sizeof(sima->image->name)); /* we cant do much if the str is longer then 240 :/ */
+ /* XXX unpackImage frees image buffers */
+ ED_preview_kill_jobs(C);
+
BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_RELOAD);
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, sima->image);
@@ -846,7 +860,7 @@ static int replace_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
void IMAGE_OT_replace(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Replace";
+ ot->name= "Replace Image";
ot->idname= "IMAGE_OT_replace";
/* api callbacks */
@@ -1066,7 +1080,7 @@ static int save_as_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
void IMAGE_OT_save_as(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Save As";
+ ot->name= "Save As Image";
ot->idname= "IMAGE_OT_save_as";
/* api callbacks */
@@ -1137,7 +1151,7 @@ static int save_exec(bContext *C, wmOperator *op)
void IMAGE_OT_save(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Save";
+ ot->name= "Save Image";
ot->idname= "IMAGE_OT_save";
/* api callbacks */
@@ -1235,6 +1249,9 @@ static int reload_exec(bContext *C, wmOperator *UNUSED(op))
if(!ima)
return OPERATOR_CANCELLED;
+ /* XXX unpackImage frees image buffers */
+ ED_preview_kill_jobs(C);
+
// XXX other users?
BKE_image_signal(ima, (sima)? &sima->iuser: NULL, IMA_SIGNAL_RELOAD);
@@ -1246,7 +1263,7 @@ static int reload_exec(bContext *C, wmOperator *UNUSED(op))
void IMAGE_OT_reload(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Reload";
+ ot->name= "Reload Image";
ot->idname= "IMAGE_OT_reload";
/* api callbacks */
@@ -1328,7 +1345,7 @@ void IMAGE_OT_new(wmOperatorType *ot)
static float default_color[4]= {0.0f, 0.0f, 0.0f, 1.0f};
/* identifiers */
- ot->name= "New";
+ ot->name= "New Image";
ot->idname= "IMAGE_OT_new";
/* api callbacks */
@@ -1336,7 +1353,7 @@ void IMAGE_OT_new(wmOperatorType *ot)
ot->invoke= image_new_invoke;
/* flags */
- ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+ ot->flag= OPTYPE_UNDO;
/* properties */
RNA_def_string(ot->srna, "name", "untitled", 21, "Name", "Image datablock name.");
@@ -1365,19 +1382,18 @@ static int image_invert_exec(bContext *C, wmOperator *op)
{
Image *ima= CTX_data_edit_image(C);
ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
-
+
// flags indicate if this channel should be inverted
- short r,g,b,a;
- int i, dirty = 0;
-
+ const short r= RNA_boolean_get(op->ptr, "invert_r");
+ const short g= RNA_boolean_get(op->ptr, "invert_g");
+ const short b= RNA_boolean_get(op->ptr, "invert_b");
+ const short a= RNA_boolean_get(op->ptr, "invert_a");
+
+ int i;
+
if( ibuf == NULL) // TODO: this should actually never happen, but does for render-results -> cleanup
return OPERATOR_CANCELLED;
-
- r = RNA_boolean_get(op->ptr, "invert_r");
- g = RNA_boolean_get(op->ptr, "invert_g");
- b = RNA_boolean_get(op->ptr, "invert_b");
- a = RNA_boolean_get(op->ptr, "invert_a");
-
+
/* TODO: make this into an IMB_invert_channels(ibuf,r,g,b,a) method!? */
if (ibuf->rect_float) {
@@ -1388,8 +1404,10 @@ static int image_invert_exec(bContext *C, wmOperator *op)
if( b ) fp[2] = 1.0f - fp[2];
if( a ) fp[3] = 1.0f - fp[3];
}
- dirty = 1;
- IMB_rect_from_float(ibuf);
+
+ if(ibuf->rect) {
+ IMB_rect_from_float(ibuf);
+ }
}
else if(ibuf->rect) {
@@ -1400,16 +1418,14 @@ static int image_invert_exec(bContext *C, wmOperator *op)
if( b ) cp[2] = 255 - cp[2];
if( a ) cp[3] = 255 - cp[3];
}
- dirty = 1;
}
- else
+ else {
return OPERATOR_CANCELLED;
+ }
- ibuf->userflags |= IB_BITMAPDIRTY; // mark as modified
+ ibuf->userflags |= IB_BITMAPDIRTY;
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, ima);
-
return OPERATOR_FINISHED;
-
}
void IMAGE_OT_invert(wmOperatorType *ot)
@@ -1490,7 +1506,7 @@ static int pack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
if(!as_png && (ibuf && (ibuf->userflags & IB_BITMAPDIRTY))) {
pup= uiPupMenuBegin(C, "OK", ICON_QUESTION);
layout= uiPupMenuLayout(pup);
- uiItemBooleanO(layout, "Can't pack edited image from disk. Pack as internal PNG?", ICON_NULL, op->idname, "as_png", 1);
+ uiItemBooleanO(layout, "Can't pack edited image from disk. Pack as internal PNG?", ICON_NONE, op->idname, "as_png", 1);
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
@@ -1502,7 +1518,7 @@ static int pack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
void IMAGE_OT_pack(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Pack";
+ ot->name= "Pack Image";
ot->description= "Pack an image as embedded data into the .blend file";
ot->idname= "IMAGE_OT_pack";
@@ -1542,7 +1558,10 @@ static int image_unpack_exec(bContext *C, wmOperator *op)
if(G.fileflags & G_AUTOPACK)
BKE_report(op->reports, RPT_WARNING, "AutoPack is enabled, so image will be packed again on file save.");
-
+
+ /* XXX unpackImage frees image buffers */
+ ED_preview_kill_jobs(C);
+
unpackImage(op->reports, ima, method);
WM_event_add_notifier(C, NC_IMAGE|NA_EDITED, ima);
@@ -1576,7 +1595,7 @@ static int image_unpack_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(even
void IMAGE_OT_unpack(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Unpack";
+ ot->name= "Unpack Image";
ot->description= "Save an image packed in the .blend file to disk";
ot->idname= "IMAGE_OT_unpack";
@@ -1640,7 +1659,7 @@ static void sample_apply(bContext *C, wmOperator *op, wmEvent *event)
my= event->y - ar->winrct.ymin;
UI_view2d_region_to_view(&ar->v2d, mx, my, &fx, &fy);
- if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) {
+ if(fx>=0.0f && fy>=0.0f && fx<1.0f && fy<1.0f) {
float *fp;
char *cp;
int x= (int)(fx*ibuf->x), y= (int)(fy*ibuf->y);
@@ -1788,7 +1807,7 @@ static int sample_cancel(bContext *C, wmOperator *op)
void IMAGE_OT_sample(wmOperatorType *ot)
{
/* identifiers */
- ot->name= "Sample";
+ ot->name= "Sample Color";
ot->idname= "IMAGE_OT_sample";
/* api callbacks */
@@ -2120,6 +2139,10 @@ static int cycle_render_slot_exec(bContext *C, wmOperator *op)
WM_event_add_notifier(C, NC_IMAGE|ND_DRAW, NULL);
+ /* no undo push for browsing existing */
+ if(ima->renders[ima->render_slot] || ima->render_slot==ima->last_render_slot)
+ return OPERATOR_CANCELLED;
+
return OPERATOR_FINISHED;
}
diff --git a/source/blender/editors/space_image/image_render.c b/source/blender/editors/space_image/image_render.c
index 03ac3f4e79e..04b65af618e 100644
--- a/source/blender/editors/space_image/image_render.c
+++ b/source/blender/editors/space_image/image_render.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_image/image_render.c
+ * \ingroup spimage
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c
index ed59a35229a..381d4ff4ab3 100644
--- a/source/blender/editors/space_image/space_image.c
+++ b/source/blender/editors/space_image/space_image.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_image/space_image.c
+ * \ingroup spimage
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -200,7 +205,7 @@ void ED_image_aspect(Image *ima, float *aspx, float *aspy)
*aspx= *aspy= 1.0;
if((ima == NULL) || (ima->type == IMA_TYPE_R_RESULT) || (ima->type == IMA_TYPE_COMPOSITE) ||
- (ima->aspx==0.0 || ima->aspy==0.0))
+ (ima->aspx==0.0f || ima->aspy==0.0f))
return;
/* x is always 1 */
@@ -454,7 +459,9 @@ static SpaceLink *image_duplicate(SpaceLink *sl)
/* clear or remove stuff from old */
if(simagen->cumap)
simagen->cumap= curvemapping_copy(simagen->cumap);
-
+
+ scopes_new(&simagen->scopes);
+
return (SpaceLink *)simagen;
}
@@ -504,7 +511,7 @@ static void image_keymap(struct wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "IMAGE_OT_save", SKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_save_as", F3KEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_properties", NKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "IMAGE_OT_scopes", PKEY, KM_PRESS, 0, 0);
+ WM_keymap_add_item(keymap, "IMAGE_OT_scopes", TKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "IMAGE_OT_cycle_render_slot", JKEY, KM_PRESS, 0, 0);
RNA_boolean_set(WM_keymap_add_item(keymap, "IMAGE_OT_cycle_render_slot", JKEY, KM_PRESS, KM_ALT, 0)->ptr, "reverse", TRUE);
diff --git a/source/blender/editors/space_info/CMakeLists.txt b/source/blender/editors/space_info/CMakeLists.txt
index 9ebd86f5c2b..3322802de47 100644
--- a/source/blender/editors/space_info/CMakeLists.txt
+++ b/source/blender/editors/space_info/CMakeLists.txt
@@ -31,6 +31,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_info/info_draw.c b/source/blender/editors/space_info/info_draw.c
index 6b3c3f1ad25..3121ddaa3b4 100644
--- a/source/blender/editors/space_info/info_draw.c
+++ b/source/blender/editors/space_info/info_draw.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_info/info_draw.c
+ * \ingroup spinfo
+ */
+
+
#include <math.h>
#include <stdlib.h>
diff --git a/source/blender/editors/space_info/info_intern.h b/source/blender/editors/space_info/info_intern.h
index cda1123fa79..00aee75768f 100644
--- a/source/blender/editors/space_info/info_intern.h
+++ b/source/blender/editors/space_info/info_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_info/info_intern.h
+ * \ingroup spinfo
+ */
+
#ifndef ED_INFO_INTERN_H
#define ED_INFO_INTERN_H
diff --git a/source/blender/editors/space_info/info_ops.c b/source/blender/editors/space_info/info_ops.c
index a4243f7c19e..d58fb7b11f0 100644
--- a/source/blender/editors/space_info/info_ops.c
+++ b/source/blender/editors/space_info/info_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_info/info_ops.c
+ * \ingroup spinfo
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -53,6 +58,7 @@
#include "UI_interface.h"
+#include "UI_resources.h"
#include "IMB_imbuf_types.h"
@@ -155,7 +161,7 @@ static int unpack_all_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event)
else
sprintf(title, "Unpack %d files", count);
- pup= uiPupMenuBegin(C, title, ICON_NULL);
+ pup= uiPupMenuBegin(C, title, ICON_NONE);
layout= uiPupMenuLayout(pup);
uiLayoutSetOperatorContext(layout, WM_OP_EXEC_DEFAULT);
@@ -251,10 +257,6 @@ void FILE_OT_make_paths_absolute(wmOperatorType *ot)
static int report_missing_files_exec(bContext *UNUSED(C), wmOperator *op)
{
- char txtname[24]; /* text block name */
-
- txtname[0] = '\0';
-
/* run the missing file check */
checkMissingFiles(G.main, op->reports);
@@ -320,11 +322,11 @@ void FILE_OT_find_missing_files(wmOperatorType *ot)
* inactive regions, so use this for now. --matt
*/
-#define INFO_TIMEOUT 5.0
-#define INFO_COLOR_TIMEOUT 3.0
-#define ERROR_TIMEOUT 10.0
-#define ERROR_COLOR_TIMEOUT 6.0
-#define COLLAPSE_TIMEOUT 0.25
+#define INFO_TIMEOUT 5.0f
+#define INFO_COLOR_TIMEOUT 3.0f
+#define ERROR_TIMEOUT 10.0f
+#define ERROR_COLOR_TIMEOUT 6.0f
+#define COLLAPSE_TIMEOUT 0.25f
static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
{
wmWindowManager *wm= CTX_wm_manager(C);
@@ -351,7 +353,7 @@ static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), wm
color_timeout = (report->type & RPT_ERROR_ALL)?ERROR_COLOR_TIMEOUT:INFO_COLOR_TIMEOUT;
/* clear the report display after timeout */
- if (reports->reporttimer->duration > timeout) {
+ if ((float)reports->reporttimer->duration > timeout) {
WM_event_remove_timer(wm, NULL, reports->reporttimer);
reports->reporttimer = NULL;
@@ -360,7 +362,7 @@ static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), wm
return (OPERATOR_FINISHED|OPERATOR_PASS_THROUGH);
}
- if (rti->widthfac == 0.0) {
+ if (rti->widthfac == 0.0f) {
/* initialise colors based on report type */
if(report->type & RPT_ERROR_ALL) {
rti->col[0] = 1.0;
@@ -379,8 +381,8 @@ static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), wm
rti->widthfac=1.0;
}
- progress = reports->reporttimer->duration / timeout;
- color_progress = reports->reporttimer->duration / color_timeout;
+ progress = (float)reports->reporttimer->duration / timeout;
+ color_progress = (float)reports->reporttimer->duration / color_timeout;
/* save us from too many draws */
if(color_progress <= 1.0f) {
@@ -394,7 +396,7 @@ static int update_reports_display_invoke(bContext *C, wmOperator *UNUSED(op), wm
/* collapse report at end of timeout */
if (progress*timeout > timeout - COLLAPSE_TIMEOUT) {
rti->widthfac = (progress*timeout - (timeout - COLLAPSE_TIMEOUT)) / COLLAPSE_TIMEOUT;
- rti->widthfac = 1.0 - rti->widthfac;
+ rti->widthfac = 1.0f - rti->widthfac;
send_note= 1;
}
diff --git a/source/blender/editors/space_info/info_report.c b/source/blender/editors/space_info/info_report.c
index 8766df6a0b9..67f02ce4f8e 100644
--- a/source/blender/editors/space_info/info_report.c
+++ b/source/blender/editors/space_info/info_report.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_info/info_report.c
+ * \ingroup spinfo
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <limits.h>
diff --git a/source/blender/editors/space_info/info_stats.c b/source/blender/editors/space_info/info_stats.c
index b9e4730ec41..6a48dc4d004 100644
--- a/source/blender/editors/space_info/info_stats.c
+++ b/source/blender/editors/space_info/info_stats.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_info/info_stats.c
+ * \ingroup spinfo
+ */
+
+
#include <stdio.h>
#include <string.h>
diff --git a/source/blender/editors/space_info/space_info.c b/source/blender/editors/space_info/space_info.c
index b9415d630be..bd2e8077eab 100644
--- a/source/blender/editors/space_info/space_info.c
+++ b/source/blender/editors/space_info/space_info.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_info/space_info.c
+ * \ingroup spinfo
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -193,7 +198,7 @@ static void info_keymap(struct wmKeyConfig *keyconf)
{
wmKeyMap *keymap= WM_keymap_find(keyconf, "Window", 0, 0);
- WM_keymap_verify_item(keymap, "INFO_OT_reports_display_update", TIMER, KM_ANY, KM_ANY, 0);
+ WM_keymap_verify_item(keymap, "INFO_OT_reports_display_update", TIMERREPORT, KM_ANY, KM_ANY, 0);
/* info space */
keymap= WM_keymap_find(keyconf, "Info", SPACE_INFO, 0);
@@ -273,7 +278,7 @@ static void recent_files_menu_draw(const bContext *UNUSED(C), Menu *menu)
uiItemStringO(layout, BLI_path_basename(recent->filepath), ICON_FILE_BLEND, "WM_OT_open_mainfile", "filepath", recent->filepath);
}
} else {
- uiItemL(layout, "No Recent Files", ICON_NULL);
+ uiItemL(layout, "No Recent Files", ICON_NONE);
}
}
diff --git a/source/blender/editors/space_info/textview.c b/source/blender/editors/space_info/textview.c
index c718c3a9532..afe8aa39c16 100644
--- a/source/blender/editors/space_info/textview.c
+++ b/source/blender/editors/space_info/textview.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_info/textview.c
+ * \ingroup spinfo
+ */
+
+
#include <math.h>
#include <string.h>
#include <sys/stat.h>
diff --git a/source/blender/editors/space_info/textview.h b/source/blender/editors/space_info/textview.h
index 5d20eef56c9..a30c082575a 100644
--- a/source/blender/editors/space_info/textview.h
+++ b/source/blender/editors/space_info/textview.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_info/textview.h
+ * \ingroup spinfo
+ */
+
+
typedef struct TextViewContext {
int lheight;
int sel_start, sel_end;
diff --git a/source/blender/editors/space_logic/CMakeLists.txt b/source/blender/editors/space_logic/CMakeLists.txt
index d33bf2db5e1..6323ef779c2 100644
--- a/source/blender/editors/space_logic/CMakeLists.txt
+++ b/source/blender/editors/space_logic/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
../../windowmanager
../../editors/interface
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_logic/logic_buttons.c b/source/blender/editors/space_logic/logic_buttons.c
index 1450bc3b3b5..474ab81cdf8 100644
--- a/source/blender/editors/space_logic/logic_buttons.c
+++ b/source/blender/editors/space_logic/logic_buttons.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_logic/logic_buttons.c
+ * \ingroup splogic
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_logic/logic_intern.h b/source/blender/editors/space_logic/logic_intern.h
index acd5eb0e098..dc17297fa9e 100644
--- a/source/blender/editors/space_logic/logic_intern.h
+++ b/source/blender/editors/space_logic/logic_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_logic/logic_intern.h
+ * \ingroup splogic
+ */
+
+
#ifndef ED_LOGIC_INTERN_H
#define ED_LOGIC_INTERN_H
diff --git a/source/blender/editors/space_logic/logic_ops.c b/source/blender/editors/space_logic/logic_ops.c
index 979979ff23e..dc730e961fc 100644
--- a/source/blender/editors/space_logic/logic_ops.c
+++ b/source/blender/editors/space_logic/logic_ops.c
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_logic/logic_ops.c
+ * \ingroup splogic
+ */
+
#include <stddef.h>
#include "DNA_object_types.h"
diff --git a/source/blender/editors/space_logic/logic_window.c b/source/blender/editors/space_logic/logic_window.c
index f7a65d27bb3..66e19cf0400 100644
--- a/source/blender/editors/space_logic/logic_window.c
+++ b/source/blender/editors/space_logic/logic_window.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_logic/logic_window.c
+ * \ingroup splogic
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <stddef.h>
@@ -3178,9 +3183,9 @@ static uiBlock *object_state_mask_menu(bContext *C, ARegion *ar, void *arg_obj)
static int is_sensor_linked(uiBlock *block, bSensor *sens)
{
bController *cont;
- int i, count;
+ int i;
- for (count=0, i=0; i<sens->totlinks; i++) {
+ for (i=0; i<sens->totlinks; i++) {
cont = sens->links[i];
if (uiFindInlink(block, cont) != NULL)
return 1;
@@ -3198,19 +3203,19 @@ static void draw_sensor_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *lo
box= uiLayoutBox(layout);
row= uiLayoutRow(box, 0);
- uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NULL);
+ uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NONE);
if(RNA_boolean_get(ptr, "show_expanded")) {
- uiItemR(row, ptr, "type", 0, "", ICON_NULL);
- uiItemR(row, ptr, "name", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "type", 0, "", ICON_NONE);
+ uiItemR(row, ptr, "name", 0, "", ICON_NONE);
} else {
- uiItemL(row, sensor_name(sens->type), ICON_NULL);
- uiItemL(row, sens->name, ICON_NULL);
+ uiItemL(row, sensor_name(sens->type), ICON_NONE);
+ uiItemL(row, sens->name, ICON_NONE);
}
subrow= uiLayoutRow(row, 0);
uiLayoutSetActive(subrow, ((RNA_boolean_get(logic_ptr, "show_sensors_active_states")
&& RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin")));
- uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NULL);
+ uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NONE);
if(RNA_boolean_get(ptr, "show_expanded")==0) {
subrow= uiLayoutRow(row, 1);
@@ -3223,7 +3228,7 @@ static void draw_sensor_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *lo
static void draw_sensor_internal_header(uiLayout *layout, PointerRNA *ptr)
{
- uiLayout *box, *split, *row;
+ uiLayout *box, *split, *subrow, *row;
box= uiLayoutBox(layout);
split = uiLayoutSplit(box, 0.45, 0);
@@ -3231,14 +3236,18 @@ static void draw_sensor_internal_header(uiLayout *layout, PointerRNA *ptr)
row= uiLayoutRow(split, 1);
uiItemR(row, ptr, "use_pulse_true_level", 0, "", ICON_DOTSUP);
uiItemR(row, ptr, "use_pulse_false_level", 0, "", ICON_DOTSDOWN);
- uiItemR(row, ptr, "frequency", 0, "Freq", ICON_NULL);
+
+ subrow=uiLayoutRow(row, 0);
+ uiLayoutSetActive(subrow, (RNA_boolean_get(ptr, "use_pulse_true_level")
+ || RNA_boolean_get(ptr, "use_pulse_false_level")));
+ uiItemR(subrow, ptr, "frequency", 0, "Freq", ICON_NONE);
row= uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_level", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
- uiItemR(row, ptr, "use_tap", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_level", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+ uiItemR(row, ptr, "use_tap", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
row= uiLayoutRow(split, 1);
- uiItemR(row, ptr, "invert", UI_ITEM_R_TOGGLE, "Invert", ICON_NULL);
+ uiItemR(row, ptr, "invert", UI_ITEM_R_TOGGLE, "Invert", ICON_NONE);
}
/* sensors in alphabetical order */
@@ -3261,7 +3270,7 @@ static void draw_sensor_armature(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
if(ob->type != OB_ARMATURE){
- uiItemL(layout, "Sensor only available for armatures", ICON_NULL);
+ uiItemL(layout, "Sensor only available for armatures", ICON_NONE);
return;
}
@@ -3277,9 +3286,9 @@ static void draw_sensor_armature(uiLayout *layout, PointerRNA *ptr)
uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE);
}
row = uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "test_type", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "test_type", 0, NULL, ICON_NONE);
if (RNA_enum_get(ptr, "test_type") != SENS_ARM_STATE_CHANGED)
- uiItemR(row, ptr, "value", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "value", 0, NULL, ICON_NONE);
}
static void draw_sensor_collision(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3291,12 +3300,12 @@ static void draw_sensor_collision(uiLayout *layout, PointerRNA *ptr, bContext *C
split = uiLayoutSplit(layout, 0.3, 0);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_pulse", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
- uiItemR(row, ptr, "use_material", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_pulse", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+ uiItemR(row, ptr, "use_material", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
- switch (RNA_enum_get(ptr, "use_material")) {
+ switch (RNA_boolean_get(ptr, "use_material")) {
case SENS_COLLISION_PROPERTY:
- uiItemR(split, ptr, "property", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "property", 0, NULL, ICON_NONE);
break;
case SENS_COLLISION_MATERIAL:
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA);
@@ -3310,48 +3319,48 @@ static void draw_sensor_delay(uiLayout *layout, PointerRNA *ptr)
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "delay", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "duration", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "use_repeat", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "delay", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "duration", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "use_repeat", 0, NULL, ICON_NONE);
}
static void draw_sensor_joystick(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *col, *row;
- uiItemR(layout, ptr, "joystick_index", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "event_type", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "joystick_index", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "event_type", 0, NULL, ICON_NONE);
switch (RNA_enum_get(ptr, "event_type")) {
case SENS_JOY_BUTTON:
- uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NONE);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0);
- uiItemR(col, ptr, "button_number", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "button_number", 0, NULL, ICON_NONE);
break;
case SENS_JOY_AXIS:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "axis_number", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "axis_threshold", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "axis_number", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "axis_threshold", 0, NULL, ICON_NONE);
- uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NONE);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0);
- uiItemR(col, ptr, "axis_direction", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "axis_direction", 0, NULL, ICON_NONE);
break;
case SENS_JOY_HAT:
- uiItemR(layout, ptr, "hat_number", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "hat_number", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "use_all_events", 0, NULL, ICON_NONE);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_events")==0);
- uiItemR(col, ptr, "hat_direction", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "hat_direction", 0, NULL, ICON_NONE);
break;
case SENS_JOY_AXIS_SINGLE:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "single_axis_number", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "axis_threshold", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "single_axis_number", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "axis_threshold", 0, NULL, ICON_NONE);
break;
}
}
@@ -3363,47 +3372,47 @@ static void draw_sensor_keyboard(uiLayout *layout, PointerRNA *ptr)
uiLayout *row, *col;
row = uiLayoutRow(layout, 0);
- uiItemL(row, "Key:", ICON_NULL);
+ uiItemL(row, "Key:", ICON_NONE);
col = uiLayoutColumn(row, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys")==0);
- uiItemR(col, ptr, "key", UI_ITEM_R_EVENT, "", ICON_NULL);
+ uiItemR(col, ptr, "key", UI_ITEM_R_EVENT, "", ICON_NONE);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_all_keys", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_all_keys", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_all_keys")==0);
row = uiLayoutRow(col, 0);
- uiItemL(row, "First Modifier:", ICON_NULL);
- uiItemR(row, ptr, "modifier_key_1", UI_ITEM_R_EVENT, "", ICON_NULL);
+ uiItemL(row, "First Modifier:", ICON_NONE);
+ uiItemR(row, ptr, "modifier_key_1", UI_ITEM_R_EVENT, "", ICON_NONE);
row = uiLayoutRow(col, 0);
- uiItemL(row, "Second Modifier:", ICON_NULL);
- uiItemR(row, ptr, "modifier_key_2", UI_ITEM_R_EVENT, "", ICON_NULL);
+ uiItemL(row, "Second Modifier:", ICON_NONE);
+ uiItemR(row, ptr, "modifier_key_2", UI_ITEM_R_EVENT, "", ICON_NONE);
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
- uiItemPointerR(layout, ptr, "log", &settings_ptr, "properties", NULL, ICON_NULL);
- uiItemPointerR(layout, ptr, "target", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(layout, ptr, "log", &settings_ptr, "properties", NULL, ICON_NONE);
+ uiItemPointerR(layout, ptr, "target", &settings_ptr, "properties", NULL, ICON_NONE);
}
static void draw_sensor_message(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "subject", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "subject", 0, NULL, ICON_NONE);
}
static void draw_sensor_mouse(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mouse_event", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mouse_event", 0, NULL, ICON_NONE);
}
static void draw_sensor_near(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row;
- uiItemR(layout, ptr, "property", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "property", 0, NULL, ICON_NONE);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "distance", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "reset_distance", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "distance", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "reset_distance", 0, NULL, ICON_NONE);
}
static void draw_sensor_property(uiLayout *layout, PointerRNA *ptr)
@@ -3412,22 +3421,22 @@ static void draw_sensor_property(uiLayout *layout, PointerRNA *ptr)
PointerRNA settings_ptr;
uiLayout *row;
- uiItemR(layout, ptr, "evaluation_type", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "evaluation_type", 0, NULL, ICON_NONE);
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
- uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, ICON_NONE);
switch (RNA_enum_get(ptr, "evaluation_type")) {
case SENS_PROP_INTERVAL:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "value_min", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "value_max", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "value_min", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "value_max", 0, NULL, ICON_NONE);
break;
case SENS_PROP_EQUAL:
- uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NONE);
break;
case SENS_PROP_NEQUAL:
- uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NONE);
break;
case SENS_PROP_CHANGED:
break;
@@ -3438,17 +3447,17 @@ static void draw_sensor_radar(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row;
- uiItemR(layout, ptr, "property", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "axis", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "property", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "axis", 0, NULL, ICON_NONE);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "angle", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "distance", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "angle", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "distance", 0, NULL, ICON_NONE);
}
static void draw_sensor_random(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "seed", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "seed", 0, NULL, ICON_NONE);
}
static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3458,10 +3467,10 @@ static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr, bContext *C)
RNA_main_pointer_create(CTX_data_main(C), &main_ptr);
split= uiLayoutSplit(layout, 0.3, 0);
- uiItemR(split, ptr, "ray_type", 0, "", ICON_NULL);
+ uiItemR(split, ptr, "ray_type", 0, "", ICON_NONE);
switch (RNA_enum_get(ptr, "ray_type")) {
case SENS_RAY_PROPERTY:
- uiItemR(split, ptr, "property", 0, "", ICON_NULL);
+ uiItemR(split, ptr, "property", 0, "", ICON_NONE);
break;
case SENS_RAY_MATERIAL:
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", "", ICON_MATERIAL_DATA);
@@ -3469,15 +3478,15 @@ static void draw_sensor_ray(uiLayout *layout, PointerRNA *ptr, bContext *C)
}
split= uiLayoutSplit(layout, 0.3, 0);
- uiItemR(split, ptr, "axis", 0, "", ICON_NULL);
+ uiItemR(split, ptr, "axis", 0, "", ICON_NONE);
row= uiLayoutRow(split, 0);
- uiItemR(row, ptr, "range", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "use_x_ray", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "range", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "use_x_ray", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
}
static void draw_sensor_touch(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "material", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "material", 0, NULL, ICON_NONE);
}
static void draw_brick_sensor(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3552,19 +3561,19 @@ static void draw_controller_header(uiLayout *layout, PointerRNA *ptr, int xco, i
box= uiLayoutBox(layout);
row= uiLayoutRow(box, 0);
- uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NULL);
+ uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NONE);
if(RNA_boolean_get(ptr, "show_expanded")) {
- uiItemR(row, ptr, "type", 0, "", ICON_NULL);
- uiItemR(row, ptr, "name", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "type", 0, "", ICON_NONE);
+ uiItemR(row, ptr, "name", 0, "", ICON_NONE);
/* XXX provisory for Blender 2.50Beta */
uiDefBlockBut(uiLayoutGetBlock(layout), controller_state_mask_menu, cont, state, (short)(xco+width-44), yco, 22+22, UI_UNIT_Y, "Set controller state index (from 1 to 30)");
} else {
- uiItemL(row, controller_name(cont->type), ICON_NULL);
- uiItemL(row, cont->name, ICON_NULL);
- uiItemL(row, state, ICON_NULL);
+ uiItemL(row, controller_name(cont->type), ICON_NONE);
+ uiItemL(row, cont->name, ICON_NONE);
+ uiItemL(row, state, ICON_NONE);
}
- uiItemR(row, ptr, "use_priority", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "use_priority", 0, "", ICON_NONE);
if(RNA_boolean_get(ptr, "show_expanded")==0) {
subrow= uiLayoutRow(row, 1);
@@ -3576,7 +3585,7 @@ static void draw_controller_header(uiLayout *layout, PointerRNA *ptr, int xco, i
static void draw_controller_expression(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "expression", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "expression", 0, "", ICON_NONE);
}
static void draw_controller_python(uiLayout *layout, PointerRNA *ptr)
@@ -3584,14 +3593,14 @@ static void draw_controller_python(uiLayout *layout, PointerRNA *ptr)
uiLayout *split, *subsplit;
split = uiLayoutSplit(layout, 0.3, 1);
- uiItemR(split, ptr, "mode", 0, "", ICON_NULL);
+ uiItemR(split, ptr, "mode", 0, "", ICON_NONE);
if (RNA_enum_get(ptr, "mode") == CONT_PY_SCRIPT) {
- uiItemR(split, ptr, "text", 0, "", ICON_NULL);
+ uiItemR(split, ptr, "text", 0, "", ICON_NONE);
}
else {
subsplit = uiLayoutSplit(split, 0.8, 0);
- uiItemR(subsplit, ptr, "module", 0, "", ICON_NULL);
- uiItemR(subsplit, ptr, "use_debug", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(subsplit, ptr, "module", 0, "", ICON_NONE);
+ uiItemR(subsplit, ptr, "use_debug", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
}
}
@@ -3642,19 +3651,19 @@ static void draw_actuator_header(uiLayout *layout, PointerRNA *ptr, PointerRNA *
box= uiLayoutBox(layout);
row= uiLayoutRow(box, 0);
- uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NULL);
+ uiItemR(row, ptr, "show_expanded", UI_ITEM_R_NO_BG, "", ICON_NONE);
if(RNA_boolean_get(ptr, "show_expanded")) {
- uiItemR(row, ptr, "type", 0, "", ICON_NULL);
- uiItemR(row, ptr, "name", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "type", 0, "", ICON_NONE);
+ uiItemR(row, ptr, "name", 0, "", ICON_NONE);
} else {
- uiItemL(row, actuator_name(act->type), ICON_NULL);
- uiItemL(row, act->name, ICON_NULL);
+ uiItemL(row, actuator_name(act->type), ICON_NONE);
+ uiItemL(row, act->name, ICON_NONE);
}
subrow= uiLayoutRow(row, 0);
uiLayoutSetActive(subrow, ((RNA_boolean_get(logic_ptr, "show_actuators_active_states")
&& RNA_boolean_get(ptr, "show_expanded")) || RNA_boolean_get(ptr, "pin")));
- uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NULL);
+ uiItemR(subrow, ptr, "pin", UI_ITEM_R_NO_BG, "", ICON_NONE);
if(RNA_boolean_get(ptr, "show_expanded")==0) {
subrow= uiLayoutRow(row, 1);
@@ -3671,34 +3680,34 @@ static void draw_actuator_action(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
if(ob->type != OB_ARMATURE){
- uiItemL(layout, "Actuator only available for armatures", ICON_NULL);
+ uiItemL(layout, "Actuator only available for armatures", ICON_NONE);
return;
}
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "play_mode", 0, "", ICON_NULL);
- uiItemR(row, ptr, "action", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "play_mode", 0, "", ICON_NONE);
+ uiItemR(row, ptr, "action", 0, "", ICON_NONE);
+ uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, ICON_NONE);
row= uiLayoutRow(layout, 0);
if((RNA_enum_get(ptr, "play_mode") == ACT_ACTION_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NONE);
else {
- uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NONE);
}
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "frame_blend_in", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "priority", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_blend_in", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "priority", 0, NULL, ICON_NONE);
row= uiLayoutRow(layout, 0);
- uiItemPointerR(layout, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(layout, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NONE);
#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR
- uiItemR(row, "stride_length", 0, NULL, ICON_NULL);
+ uiItemR(row, "stride_length", 0, NULL, ICON_NONE);
#endif
}
@@ -3712,7 +3721,7 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
PropertyRNA *bones_prop = NULL;
if(ob->type != OB_ARMATURE){
- uiItemL(layout, "Actuator only available for armatures", ICON_NULL);
+ uiItemL(layout, "Actuator only available for armatures", ICON_NONE);
return;
}
@@ -3721,7 +3730,7 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
bones_prop = RNA_struct_find_property(&pose_ptr, "bones");
}
- uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
switch (RNA_enum_get(ptr, "mode"))
{
@@ -3744,12 +3753,12 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE);
}
- uiItemR(layout, ptr, "target", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "target", 0, NULL, ICON_NONE);
/* show second target only if the constraint supports it */
get_armature_bone_constraint(ob, aa->posechannel, aa->constraint, &constraint);
if (constraint && constraint->type == CONSTRAINT_TYPE_KINEMATIC) {
- uiItemR(layout, ptr, "secondary_target", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "secondary_target", 0, NULL, ICON_NONE);
}
break;
case ACT_ARM_SETWEIGHT:
@@ -3760,7 +3769,7 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
uiItemPointerR(layout, ptr, "constraint", &pchan_ptr, "constraints", NULL, ICON_CONSTRAINT_BONE);
}
- uiItemR(layout, ptr, "weight", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "weight", 0, NULL, ICON_NONE);
break;
}
}
@@ -3768,15 +3777,15 @@ static void draw_actuator_armature(uiLayout *layout, PointerRNA *ptr)
static void draw_actuator_camera(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row;
- uiItemR(layout, ptr, "object", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "object", 0, NULL, ICON_NONE);
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "height", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "axis", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "height", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "axis", 0, NULL, ICON_NONE);
row = uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "min", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "max", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "min", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "max", 0, NULL, ICON_NONE);
}
static void draw_actuator_constraint(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -3786,96 +3795,96 @@ static void draw_actuator_constraint(uiLayout *layout, PointerRNA *ptr, bContext
RNA_main_pointer_create(CTX_data_main(C), &main_ptr);
- uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
switch (RNA_enum_get(ptr, "mode"))
{
case ACT_CONST_TYPE_LOC:
- uiItemR(layout, ptr, "limit", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "limit", 0, NULL, ICON_NONE);
row = uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "limit_min", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "limit_max", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "limit_min", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "limit_max", 0, NULL, ICON_NONE);
- uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
break;
case ACT_CONST_TYPE_DIST:
split = uiLayoutSplit(layout, 0.8, 0);
- uiItemR(split, ptr, "direction", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "direction", 0, NULL, ICON_NONE);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
- uiItemR(row, ptr, "use_normal", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+ uiItemR(row, ptr, "use_normal", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
row = uiLayoutRow(layout, 0);
col = uiLayoutColumn(row, 0);
- uiItemL(col, "Range:", ICON_NULL);
- uiItemR(col, ptr, "range", 0, "", ICON_NULL);
+ uiItemL(col, "Range:", ICON_NONE);
+ uiItemR(col, ptr, "range", 0, "", ICON_NONE);
col = uiLayoutColumn(row, 1);
- uiItemR(col, ptr, "use_force_distance", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_force_distance", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
subcol = uiLayoutColumn(col, 0);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_force_distance")==1);
- uiItemR(subcol, ptr, "distance", 0, "", ICON_NULL);
+ uiItemR(subcol, ptr, "distance", 0, "", ICON_NONE);
- uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER , NULL, ICON_NULL);
+ uiItemR(layout, ptr, "damping", UI_ITEM_R_SLIDER , NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
if (RNA_boolean_get(ptr, "use_material_detect"))
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA);
else
- uiItemR(split, ptr, "property", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "property", 0, NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
break;
case ACT_CONST_TYPE_ORI:
- uiItemR(layout, ptr, "direction_axis_pos", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "direction_axis_pos", 0, NULL, ICON_NONE);
row=uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "damping", UI_ITEM_R_SLIDER , NULL, ICON_NULL);
- uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "damping", UI_ITEM_R_SLIDER , NULL, ICON_NONE);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NONE);
row=uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "rotation_max", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "rotation_max", 0, NULL, ICON_NONE);
row=uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "angle_min", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "angle_max", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "angle_min", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "angle_max", 0, NULL, ICON_NONE);
break;
case ACT_CONST_TYPE_FH:
split=uiLayoutSplit(layout, 0.75, 0);
row= uiLayoutRow(split, 0);
- uiItemR(row, ptr, "fh_damping", UI_ITEM_R_SLIDER , NULL, ICON_NULL);
+ uiItemR(row, ptr, "fh_damping", UI_ITEM_R_SLIDER , NULL, ICON_NONE);
- uiItemR(row, ptr, "fh_height", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_fh_paralel_axis", UI_ITEM_R_TOGGLE , NULL, ICON_NULL);
+ uiItemR(row, ptr, "fh_height", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_fh_paralel_axis", UI_ITEM_R_TOGGLE , NULL, ICON_NONE);
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "direction_axis", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "direction_axis", 0, NULL, ICON_NONE);
split = uiLayoutSplit(row, 0.9, 0);
- uiItemR(split, ptr, "spring", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_fh_normal", UI_ITEM_R_TOGGLE , NULL, ICON_NULL);
+ uiItemR(split, ptr, "fh_force", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_fh_normal", UI_ITEM_R_TOGGLE , NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_material_detect", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
if (RNA_boolean_get(ptr, "use_material_detect"))
uiItemPointerR(split, ptr, "material", &main_ptr, "materials", NULL, ICON_MATERIAL_DATA);
else
- uiItemR(split, ptr, "property", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "property", 0, NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.15, 0);
- uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(split, ptr, "use_persistent", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "damping_rotation", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
break;
}
}
@@ -3884,53 +3893,53 @@ static void draw_actuator_edit_object(uiLayout *layout, PointerRNA *ptr)
{
Object *ob = (Object *)ptr->id.data;
uiLayout *row, *split, *subsplit;
- uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
switch (RNA_enum_get(ptr, "mode"))
{
case ACT_EDOB_ADD_OBJECT:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "object", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "time", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "object", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "time", 0, NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "angular_velocity", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "angular_velocity", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
break;
case ACT_EDOB_END_OBJECT:
break;
case ACT_EDOB_REPLACE_MESH:
if(ob->type != OB_MESH) {
- uiItemL(layout, "Mode only available for mesh objects", ICON_NULL);
+ uiItemL(layout, "Mode only available for mesh objects", ICON_NONE);
break;
}
split = uiLayoutSplit(layout, 0.6, 0);
- uiItemR(split, ptr, "mesh", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "mesh", 0, NULL, ICON_NONE);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "use_replace_display_mesh", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
- uiItemR(row, ptr, "use_replace_physics_mesh", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_replace_display_mesh", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+ uiItemR(row, ptr, "use_replace_physics_mesh", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
break;
case ACT_EDOB_TRACK_TO:
split = uiLayoutSplit(layout, 0.5, 0);
- uiItemR(split, ptr, "track_object", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "track_object", 0, NULL, ICON_NONE);
subsplit = uiLayoutSplit(split, 0.7, 0);
- uiItemR(subsplit, ptr, "time", 0, NULL, ICON_NULL);
- uiItemR(subsplit, ptr, "use_3d_tracking", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(subsplit, ptr, "time", 0, NULL, ICON_NONE);
+ uiItemR(subsplit, ptr, "use_3d_tracking", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
break;
case ACT_EDOB_DYNAMICS:
if(ob->type != OB_MESH) {
- uiItemL(layout, "Mode only available for mesh objects", ICON_NULL);
+ uiItemL(layout, "Mode only available for mesh objects", ICON_NONE);
break;
}
- uiItemR(layout, ptr, "dynamic_operation", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "dynamic_operation", 0, NULL, ICON_NONE);
if (RNA_enum_get(ptr, "dynamic_operation") == ACT_EDOB_SET_MASS)
- uiItemR(layout, ptr, "mass", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mass", 0, NULL, ICON_NONE);
break;
}
}
@@ -3939,31 +3948,31 @@ static void draw_actuator_filter_2d(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row, *split;
- uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
switch (RNA_enum_get(ptr, "mode"))
{
case ACT_2DFILTER_CUSTOMFILTER:
- uiItemR(layout, ptr, "filter_pass", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "glsl_shader", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "filter_pass", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "glsl_shader", 0, NULL, ICON_NONE);
break;
case ACT_2DFILTER_MOTIONBLUR:
split=uiLayoutSplit(layout, 0.75, 1);
row= uiLayoutRow(split, 0);
uiLayoutSetActive(row, RNA_boolean_get(ptr, "use_motion_blur")==1);
- uiItemR(row, ptr, "motion_blur_factor", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_motion_blur", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "motion_blur_factor", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_motion_blur", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
break;
default: // all other 2D Filters
- uiItemR(layout, ptr, "filter_pass", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "filter_pass", 0, NULL, ICON_NONE);
break;
}
}
static void draw_actuator_game(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
if (RNA_enum_get(ptr, "mode") == ACT_GAME_LOAD)
- uiItemR(layout, ptr, "filename", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "filename", 0, NULL, ICON_NONE);
}
static void draw_actuator_ipo(uiLayout *layout, PointerRNA *ptr)
@@ -3976,27 +3985,27 @@ static void draw_actuator_ipo(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "play_type", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "play_type", 0, "", ICON_NONE);
subrow= uiLayoutRow(row, 1);
- uiItemR(subrow, ptr, "use_force", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
- uiItemR(subrow, ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(subrow, ptr, "use_force", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+ uiItemR(subrow, ptr, "use_additive", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
col = uiLayoutColumn(subrow, 0);
uiLayoutSetActive(col, (RNA_boolean_get(ptr, "use_additive") || RNA_boolean_get(ptr, "use_force")));
- uiItemR(col, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_local", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
row= uiLayoutRow(layout, 0);
if((RNA_enum_get(ptr, "play_type") == ACT_IPO_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NONE);
else {
- uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NONE);
}
- uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NONE);
row= uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NONE);
}
static void draw_actuator_message(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -4011,15 +4020,15 @@ static void draw_actuator_message(uiLayout *layout, PointerRNA *ptr, bContext *C
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
uiItemPointerR(layout, ptr, "to_property", &main_ptr, "objects", NULL, ICON_OBJECT_DATA);
- uiItemR(layout, ptr, "subject", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "subject", 0, NULL, ICON_NONE);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "body_type", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "body_type", 0, NULL, ICON_NONE);
if(RNA_enum_get(ptr, "body_type") == ACT_MESG_MESG)
- uiItemR(row, ptr, "body_message", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "body_message", 0, "", ICON_NONE);
else // mode == ACT_MESG_PROP
- uiItemPointerR(row, ptr, "body_property", &settings_ptr, "properties", "", ICON_NULL);
+ uiItemPointerR(row, ptr, "body_property", &settings_ptr, "properties", "", ICON_NONE);
}
static void draw_actuator_motion(uiLayout *layout, PointerRNA *ptr)
@@ -4033,85 +4042,85 @@ static void draw_actuator_motion(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
physics_type = RNA_enum_get(&settings_ptr, "physics_type");
- uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
switch (RNA_enum_get(ptr, "mode")) {
case ACT_OBJECT_NORMAL:
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "offset_location", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_local_location", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "offset_location", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_local_location", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "offset_rotation", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_local_rotation", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "offset_rotation", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_local_rotation", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
if (ELEM3(physics_type, OB_BODY_TYPE_DYNAMIC, OB_BODY_TYPE_RIGID, OB_BODY_TYPE_SOFT)) {
- uiItemL(layout, "Dynamic Object Settings:", ICON_NULL);
+ uiItemL(layout, "Dynamic Object Settings:", ICON_NONE);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "force", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_local_force", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "force", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_local_force", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "torque", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_local_torque", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "torque", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_local_torque", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NONE);
row = uiLayoutRow(split, 1);
- uiItemR(row, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
- uiItemR(row, ptr, "use_add_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+ uiItemR(row, ptr, "use_add_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "angular_velocity", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "angular_velocity", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_local_angular_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
- uiItemR(layout, ptr, "damping", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "damping", 0, NULL, ICON_NONE);
}
break;
case ACT_OBJECT_SERVO:
- uiItemR(layout, ptr, "reference_object", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "reference_object", 0, NULL, ICON_NONE);
split = uiLayoutSplit(layout, 0.9, 0);
row = uiLayoutRow(split, 0);
- uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NULL);
- uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "linear_velocity", 0, NULL, ICON_NONE);
+ uiItemR(split, ptr, "use_local_linear_velocity", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
row = uiLayoutRow(layout, 0);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_servo_limit_x", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_servo_limit_x", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_servo_limit_x")==1);
- uiItemR(subcol, ptr, "force_max_x", 0, NULL, ICON_NULL);
- uiItemR(subcol, ptr, "force_min_x", 0, NULL, ICON_NULL);
+ uiItemR(subcol, ptr, "force_max_x", 0, NULL, ICON_NONE);
+ uiItemR(subcol, ptr, "force_min_x", 0, NULL, ICON_NONE);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_servo_limit_y", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_servo_limit_y", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_servo_limit_y")==1);
- uiItemR(subcol, ptr, "force_max_y", 0, NULL, ICON_NULL);
- uiItemR(subcol, ptr, "force_min_y", 0, NULL, ICON_NULL);
+ uiItemR(subcol, ptr, "force_max_y", 0, NULL, ICON_NONE);
+ uiItemR(subcol, ptr, "force_min_y", 0, NULL, ICON_NONE);
col = uiLayoutColumn(row, 0);
- uiItemR(col, ptr, "use_servo_limit_z", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_servo_limit_z", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
subcol = uiLayoutColumn(col, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(ptr, "use_servo_limit_z")==1);
- uiItemR(subcol, ptr, "force_max_z", 0, NULL, ICON_NULL);
- uiItemR(subcol, ptr, "force_min_z", 0, NULL, ICON_NULL);
+ uiItemR(subcol, ptr, "force_max_z", 0, NULL, ICON_NONE);
+ uiItemR(subcol, ptr, "force_min_z", 0, NULL, ICON_NONE);
//XXXACTUATOR missing labels from original 2.49 ui (e.g. Servo, Min, Max, Fast)
//Layout designers willing to help on that, please compare with 2.49 ui
// (since the old code is going to be deleted ... soon)
col = uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "proportional_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "integral_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "derivate_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "proportional_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "integral_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "derivate_coefficient", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
break;
}
}
@@ -4120,16 +4129,16 @@ static void draw_actuator_parent(uiLayout *layout, PointerRNA *ptr)
{
uiLayout *row, *subrow;
- uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
if (RNA_enum_get(ptr, "mode") == ACT_PARENT_SET) {
- uiItemR(layout, ptr, "object", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "object", 0, NULL, ICON_NONE);
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "use_compound", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_compound", 0, NULL, ICON_NONE);
subrow= uiLayoutRow(row, 0);
uiLayoutSetActive(subrow, RNA_boolean_get(ptr, "use_compound")==1);
- uiItemR(subrow, ptr, "use_ghost", 0, NULL, ICON_NULL);
+ uiItemR(subrow, ptr, "use_ghost", 0, NULL, ICON_NONE);
}
}
@@ -4145,30 +4154,30 @@ static void draw_actuator_property(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
- uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
- uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
+ uiItemPointerR(layout, ptr, "property", &settings_ptr, "properties", NULL, ICON_NONE);
switch(RNA_enum_get(ptr, "mode"))
{
case ACT_PROP_TOGGLE:
break;
case ACT_PROP_ADD:
- uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NONE);
break;
case ACT_PROP_ASSIGN:
- uiItemR(layout, ptr, "value", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "value", 0, NULL, ICON_NONE);
break;
case ACT_PROP_COPY:
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "object", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "object", 0, NULL, ICON_NONE);
if(ob_from){
RNA_pointer_create((ID *)ob_from, &RNA_GameObjectSettings, ob_from, &obj_settings_ptr);
- uiItemPointerR(row, ptr, "object_property", &obj_settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(row, ptr, "object_property", &obj_settings_ptr, "properties", NULL, ICON_NONE);
}else
{
subrow= uiLayoutRow(row, 0);
uiLayoutSetActive(subrow, 0);
- uiItemR(subrow, ptr, "object_property", 0, NULL, ICON_NULL);
+ uiItemR(subrow, ptr, "object_property", 0, NULL, ICON_NONE);
}
break;
}
@@ -4185,72 +4194,72 @@ static void draw_actuator_random(uiLayout *layout, PointerRNA *ptr)
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "seed", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "distribution", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "seed", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "distribution", 0, NULL, ICON_NONE);
row = uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NONE);
row = uiLayoutRow(layout, 0);
switch (RNA_enum_get(ptr, "distribution")){
case ACT_RANDOM_BOOL_CONST:
- uiItemR(row, ptr, "use_always_true", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_always_true", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
break;
case ACT_RANDOM_BOOL_UNIFORM:
- uiItemL(row, "Choose between true and false, 50% chance each", ICON_NULL);
+ uiItemL(row, "Choose between true and false, 50% chance each", ICON_NONE);
break;
case ACT_RANDOM_BOOL_BERNOUILLI:
- uiItemR(row, ptr, "chance", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "chance", 0, NULL, ICON_NONE);
break;
case ACT_RANDOM_INT_CONST:
- uiItemR(row, ptr, "int_value", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "int_value", 0, NULL, ICON_NONE);
break;
case ACT_RANDOM_INT_UNIFORM:
- uiItemR(row, ptr, "int_min", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "int_max", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "int_min", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "int_max", 0, NULL, ICON_NONE);
break;
case ACT_RANDOM_INT_POISSON:
- uiItemR(row, ptr, "int_mean", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "int_mean", 0, NULL, ICON_NONE);
break;
case ACT_RANDOM_FLOAT_CONST:
- uiItemR(row, ptr, "float_value", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "float_value", 0, NULL, ICON_NONE);
break;
case ACT_RANDOM_FLOAT_UNIFORM:
- uiItemR(row, ptr, "float_min", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "float_max", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "float_min", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "float_max", 0, NULL, ICON_NONE);
break;
case ACT_RANDOM_FLOAT_NORMAL:
- uiItemR(row, ptr, "float_mean", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "standard_derivation", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "float_mean", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "standard_derivation", 0, NULL, ICON_NONE);
break;
case ACT_RANDOM_FLOAT_NEGATIVE_EXPONENTIAL:
- uiItemR(row, ptr, "half_life_time", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "half_life_time", 0, NULL, ICON_NONE);
break;
}
}
static void draw_actuator_scene(uiLayout *layout, PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
switch (RNA_enum_get(ptr, "mode")) {
case ACT_SCENE_CAMERA:
- uiItemR(layout, ptr, "camera", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "camera", 0, NULL, ICON_NONE);
break;
case ACT_SCENE_RESTART:
break;
default: // ACT_SCENE_SET|ACT_SCENE_ADD_FRONT|ACT_SCENE_ADD_BACK|ACT_SCENE_REMOVE|ACT_SCENE_SUSPEND|ACT_SCENE_RESUME
- uiItemR(layout, ptr, "scene", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "scene", 0, NULL, ICON_NONE);
break;
}
}
@@ -4262,35 +4271,35 @@ static void draw_actuator_shape_action(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
if(ob->type != OB_MESH){
- uiItemL(layout, "Actuator only available for mesh objects", ICON_NULL);
+ uiItemL(layout, "Actuator only available for mesh objects", ICON_NONE);
return;
}
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "mode", 0, "", ICON_NULL);
- uiItemR(row, ptr, "action", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "mode", 0, "", ICON_NONE);
+ uiItemR(row, ptr, "action", 0, "", ICON_NONE);
+ uiItemR(row, ptr, "use_continue_last_frame", 0, NULL, ICON_NONE);
row= uiLayoutRow(layout, 0);
if((RNA_enum_get(ptr, "mode") == ACT_ACTION_FROM_PROP))
- uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(row, ptr, "property", &settings_ptr, "properties", NULL, ICON_NONE);
else {
- uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_start", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "frame_end", 0, NULL, ICON_NONE);
}
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "frame_blend_in", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "priority", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "frame_blend_in", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "priority", 0, NULL, ICON_NONE);
row= uiLayoutRow(layout, 0);
- uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NULL);
+ uiItemPointerR(row, ptr, "frame_property", &settings_ptr, "properties", NULL, ICON_NONE);
#ifdef __NLA_ACTION_BY_MOTION_ACTUATOR
- uiItemR(row, "stride_length", 0, NULL, ICON_NULL);
+ uiItemR(row, "stride_length", 0, NULL, ICON_NONE);
#endif
}
@@ -4301,35 +4310,35 @@ static void draw_actuator_sound(uiLayout *layout, PointerRNA *ptr, bContext *C)
uiTemplateID(layout, C, ptr, "sound", NULL, "SOUND_OT_open", NULL);
if (!RNA_pointer_get(ptr, "sound").data)
{
- uiItemL(layout, "Select a sound from the list or load a new one", ICON_NULL);
+ uiItemL(layout, "Select a sound from the list or load a new one", ICON_NONE);
return;
}
- uiItemR(layout, ptr, "mode", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, NULL, ICON_NONE);
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "volume", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "pitch", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "volume", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "pitch", 0, NULL, ICON_NONE);
- uiItemR(layout, ptr, "use_sound_3d", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_sound_3d", 0, NULL, ICON_NONE);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_sound_3d")==1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "gain_3d_min", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "gain_3d_max", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "gain_3d_min", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "gain_3d_max", 0, NULL, ICON_NONE);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "distance_3d_reference", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "distance_3d_max", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "distance_3d_reference", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "distance_3d_max", 0, NULL, ICON_NONE);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "rolloff_factor_3d", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "cone_outer_gain_3d", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "rolloff_factor_3d", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "cone_outer_gain_3d", 0, NULL, ICON_NONE);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "cone_outer_angle_3d", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "cone_inner_angle_3d", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "cone_outer_angle_3d", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "cone_inner_angle_3d", 0, NULL, ICON_NONE);
}
static void draw_actuator_state(uiLayout *layout, PointerRNA *ptr)
@@ -4340,7 +4349,7 @@ static void draw_actuator_state(uiLayout *layout, PointerRNA *ptr)
RNA_pointer_create((ID *)ob, &RNA_GameObjectSettings, ob, &settings_ptr);
split = uiLayoutSplit(layout, 0.35, 0);
- uiItemR(split, ptr, "operation", 0, NULL, ICON_NULL);
+ uiItemR(split, ptr, "operation", 0, NULL, ICON_NONE);
uiTemplateLayers(split, ptr, "states", &settings_ptr, "used_states", 0);
}
@@ -4350,9 +4359,9 @@ static void draw_actuator_visibility(uiLayout *layout, PointerRNA *ptr)
uiLayout *row;
row = uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "use_visible", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "use_occlusion", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "use_visible", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "use_occlusion", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "apply_to_children", 0, NULL, ICON_NONE);
}
static void draw_brick_actuator(uiLayout *layout, PointerRNA *ptr, bContext *C)
@@ -4496,9 +4505,9 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiDefBlockBut(block, controller_menu, NULL, "Controllers", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */
- uiItemR(row, &logic_ptr, "show_controllers_selected_objects", 0, "Sel", ICON_NULL);
- uiItemR(row, &logic_ptr, "show_controllers_active_object", 0, "Act", ICON_NULL);
- uiItemR(row, &logic_ptr, "show_controllers_linked_controller", 0, "Link", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_controllers_selected_objects", 0, "Sel", ICON_NONE);
+ uiItemR(row, &logic_ptr, "show_controllers_active_object", 0, "Act", ICON_NONE);
+ uiItemR(row, &logic_ptr, "show_controllers_linked_controller", 0, "Link", ICON_NONE);
for(a=0; a<count; a++) {
bController *cont;
@@ -4521,7 +4530,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
row = uiLayoutRow(split, 1);
uiDefButBitS(block, TOG, OB_SHOWCONT, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide controllers");
if (ob == act_ob)
- uiItemMenuEnumO(row, "LOGIC_OT_controller_add", "type", "Add Controller", ICON_NULL);
+ uiItemMenuEnumO(row, "LOGIC_OT_controller_add", "type", "Add Controller", ICON_NONE);
if (RNA_boolean_get(&settings_ptr, "show_state_panel")) {
@@ -4529,8 +4538,8 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
split= uiLayoutSplit(box, 0.2, 0);
col= uiLayoutColumn(split, 0);
- uiItemL(col, "Visible", ICON_NULL);
- uiItemL(col, "Initial", ICON_NULL);
+ uiItemL(col, "Visible", ICON_NONE);
+ uiItemL(col, "Initial", ICON_NONE);
subsplit= uiLayoutSplit(split, 0.85, 0);
col= uiLayoutColumn(subsplit, 0);
@@ -4541,8 +4550,8 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiTemplateLayers(row, &settings_ptr, "states_initial", &settings_ptr, "used_states", 0);
col= uiLayoutColumn(subsplit, 0);
- uiItemR(col, &settings_ptr, "use_all_states", UI_ITEM_R_TOGGLE, NULL, ICON_NULL);
- uiItemR(col, &settings_ptr, "show_debug_state", 0, "", ICON_NULL);
+ uiItemR(col, &settings_ptr, "use_all_states", UI_ITEM_R_TOGGLE, NULL, ICON_NONE);
+ uiItemR(col, &settings_ptr, "show_debug_state", 0, "", ICON_NONE);
}
/* End of Drawing the Controller Header common to all Selected Objects */
@@ -4599,10 +4608,10 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiDefBlockBut(block, sensor_menu, NULL, "Sensors", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */
- uiItemR(row, &logic_ptr, "show_sensors_selected_objects", 0, "Sel", ICON_NULL);
- uiItemR(row, &logic_ptr, "show_sensors_active_object", 0, "Act", ICON_NULL);
- uiItemR(row, &logic_ptr, "show_sensors_linked_controller", 0, "Link", ICON_NULL);
- uiItemR(row, &logic_ptr, "show_sensors_active_states", 0, "State", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_sensors_selected_objects", 0, "Sel", ICON_NONE);
+ uiItemR(row, &logic_ptr, "show_sensors_active_object", 0, "Act", ICON_NONE);
+ uiItemR(row, &logic_ptr, "show_sensors_linked_controller", 0, "Link", ICON_NONE);
+ uiItemR(row, &logic_ptr, "show_sensors_active_states", 0, "State", ICON_NONE);
for(a=0; a<count; a++) {
bSensor *sens;
@@ -4616,7 +4625,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
row = uiLayoutRow(layout, 1);
uiDefButBitS(block, TOG, OB_SHOWSENS, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide sensors");
if (ob == act_ob)
- uiItemMenuEnumO(row, "LOGIC_OT_sensor_add", "type", "Add Sensor", ICON_NULL);
+ uiItemMenuEnumO(row, "LOGIC_OT_sensor_add", "type", "Add Sensor", ICON_NONE);
if ((ob->scaflag & OB_SHOWSENS) == 0) continue;
@@ -4665,10 +4674,10 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
uiDefBlockBut(block, actuator_menu, NULL, "Actuators", xco-10, yco, 300, UI_UNIT_Y, ""); /* replace this with uiLayout stuff later */
- uiItemR(row, &logic_ptr, "show_actuators_selected_objects", 0, "Sel", ICON_NULL);
- uiItemR(row, &logic_ptr, "show_actuators_active_object", 0, "Act", ICON_NULL);
- uiItemR(row, &logic_ptr, "show_actuators_linked_controller", 0, "Link", ICON_NULL);
- uiItemR(row, &logic_ptr, "show_actuators_active_states", 0, "State", ICON_NULL);
+ uiItemR(row, &logic_ptr, "show_actuators_selected_objects", 0, "Sel", ICON_NONE);
+ uiItemR(row, &logic_ptr, "show_actuators_active_object", 0, "Act", ICON_NONE);
+ uiItemR(row, &logic_ptr, "show_actuators_linked_controller", 0, "Link", ICON_NONE);
+ uiItemR(row, &logic_ptr, "show_actuators_active_states", 0, "State", ICON_NONE);
for(a=0; a<count; a++) {
bActuator *act;
@@ -4682,7 +4691,7 @@ static void logic_buttons_new(bContext *C, ARegion *ar)
row = uiLayoutRow(layout, 1);
uiDefButBitS(block, TOG, OB_SHOWACT, B_REDR, ob->id.name+2,(short)(xco-10), yco, (short)(width-30), UI_UNIT_Y, &ob->scaflag, 0, 31, 0, 0, "Object name, click to show/hide actuators");
if (ob == act_ob)
- uiItemMenuEnumO(row, "LOGIC_OT_actuator_add", "type", "Add Actuator", ICON_NULL);
+ uiItemMenuEnumO(row, "LOGIC_OT_actuator_add", "type", "Add Actuator", ICON_NONE);
if ((ob->scaflag & OB_SHOWACT) == 0) continue;
diff --git a/source/blender/editors/space_logic/space_logic.c b/source/blender/editors/space_logic/space_logic.c
index 69ac68f6f82..7944f0737e1 100644
--- a/source/blender/editors/space_logic/space_logic.c
+++ b/source/blender/editors/space_logic/space_logic.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_logic/space_logic.c
+ * \ingroup splogic
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_nla/CMakeLists.txt b/source/blender/editors/space_nla/CMakeLists.txt
index f8503739844..59ccb204d8c 100644
--- a/source/blender/editors/space_nla/CMakeLists.txt
+++ b/source/blender/editors/space_nla/CMakeLists.txt
@@ -28,6 +28,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_nla/nla_buttons.c b/source/blender/editors/space_nla/nla_buttons.c
index cc1a699e13f..3e6e75fc7ec 100644
--- a/source/blender/editors/space_nla/nla_buttons.c
+++ b/source/blender/editors/space_nla/nla_buttons.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_nla/nla_buttons.c
+ * \ingroup spnla
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -233,15 +238,15 @@ static void nla_panel_animdata (const bContext *C, Panel *pa)
/* extrapolation */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &adt_ptr, "action_extrapolation", 0, NULL, ICON_NULL);
+ uiItemR(row, &adt_ptr, "action_extrapolation", 0, NULL, ICON_NONE);
/* blending */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &adt_ptr, "action_blend_type", 0, NULL, ICON_NULL);
+ uiItemR(row, &adt_ptr, "action_blend_type", 0, NULL, ICON_NONE);
/* influence */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &adt_ptr, "action_influence", 0, NULL, ICON_NULL);
+ uiItemR(row, &adt_ptr, "action_influence", 0, NULL, ICON_NONE);
}
/* active NLA-Track */
@@ -282,40 +287,40 @@ static void nla_panel_properties(const bContext *C, Panel *pa)
/* strip type */
row= uiLayoutColumn(layout, 1);
uiItemR(row, &strip_ptr, "name", 0, NULL, ICON_NLA); // XXX icon?
- uiItemR(row, &strip_ptr, "type", 0, NULL, ICON_NULL);
+ uiItemR(row, &strip_ptr, "type", 0, NULL, ICON_NONE);
/* strip extents */
column= uiLayoutColumn(layout, 1);
- uiItemL(column, "Strip Extents:", ICON_NULL);
- uiItemR(column, &strip_ptr, "frame_start", 0, NULL, ICON_NULL);
- uiItemR(column, &strip_ptr, "frame_end", 0, NULL, ICON_NULL);
+ uiItemL(column, "Strip Extents:", ICON_NONE);
+ uiItemR(column, &strip_ptr, "frame_start", 0, NULL, ICON_NONE);
+ uiItemR(column, &strip_ptr, "frame_end", 0, NULL, ICON_NONE);
/* extrapolation */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &strip_ptr, "extrapolation", 0, NULL, ICON_NULL);
+ uiItemR(row, &strip_ptr, "extrapolation", 0, NULL, ICON_NONE);
/* blending */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &strip_ptr, "blend_type", 0, NULL, ICON_NULL);
+ uiItemR(row, &strip_ptr, "blend_type", 0, NULL, ICON_NONE);
/* blend in/out + autoblending
* - blend in/out can only be set when autoblending is off
*/
column= uiLayoutColumn(layout, 1);
uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_influence")==0);
- uiItemR(column, &strip_ptr, "use_auto_blend", 0, NULL, ICON_NULL); // XXX as toggle?
+ uiItemR(column, &strip_ptr, "use_auto_blend", 0, NULL, ICON_NONE); // XXX as toggle?
subcol= uiLayoutColumn(column, 1);
uiLayoutSetActive(subcol, RNA_boolean_get(&strip_ptr, "use_auto_blend")==0);
- uiItemR(subcol, &strip_ptr, "blend_in", 0, NULL, ICON_NULL);
- uiItemR(subcol, &strip_ptr, "blend_out", 0, NULL, ICON_NULL);
+ uiItemR(subcol, &strip_ptr, "blend_in", 0, NULL, ICON_NONE);
+ uiItemR(subcol, &strip_ptr, "blend_out", 0, NULL, ICON_NONE);
/* settings */
column= uiLayoutColumn(layout, 1);
uiLayoutSetActive(column, !(RNA_boolean_get(&strip_ptr, "use_animated_influence") || RNA_boolean_get(&strip_ptr, "use_animated_time")));
- uiItemL(column, "Playback Settings:", ICON_NULL);
- uiItemR(column, &strip_ptr, "mute", 0, NULL, ICON_NULL);
- uiItemR(column, &strip_ptr, "use_reverse", 0, NULL, ICON_NULL);
+ uiItemL(column, "Playback Settings:", ICON_NONE);
+ uiItemR(column, &strip_ptr, "mute", 0, NULL, ICON_NONE);
+ uiItemR(column, &strip_ptr, "use_reverse", 0, NULL, ICON_NONE);
}
@@ -342,17 +347,17 @@ static void nla_panel_actclip(const bContext *C, Panel *pa)
/* action extents */
// XXX custom names were used here (to avoid the prefixes)... probably not necessary in future?
column= uiLayoutColumn(layout, 1);
- uiItemL(column, "Action Extents:", ICON_NULL);
- uiItemR(column, &strip_ptr, "action_frame_start", 0, "Start Frame", ICON_NULL);
- uiItemR(column, &strip_ptr, "action_frame_end", 0, "End Frame", ICON_NULL);
- uiItemO(column, NULL, ICON_NULL, "NLA_OT_action_sync_length");
+ uiItemL(column, "Action Extents:", ICON_NONE);
+ uiItemR(column, &strip_ptr, "action_frame_start", 0, "Start Frame", ICON_NONE);
+ uiItemR(column, &strip_ptr, "action_frame_end", 0, "End Frame", ICON_NONE);
+ uiItemO(column, NULL, ICON_NONE, "NLA_OT_action_sync_length");
/* action usage */
column= uiLayoutColumn(layout, 1);
uiLayoutSetActive(column, RNA_boolean_get(&strip_ptr, "use_animated_time")==0);
- uiItemL(column, "Playback Settings:", ICON_NULL);
- uiItemR(column, &strip_ptr, "scale", 0, NULL, ICON_NULL);
- uiItemR(column, &strip_ptr, "repeat", 0, NULL, ICON_NULL);
+ uiItemL(column, "Playback Settings:", ICON_NONE);
+ uiItemR(column, &strip_ptr, "scale", 0, NULL, ICON_NONE);
+ uiItemR(column, &strip_ptr, "repeat", 0, NULL, ICON_NONE);
}
/* evaluation settings for active NLA-Strip */
@@ -371,22 +376,22 @@ static void nla_panel_evaluation(const bContext *C, Panel *pa)
uiBlockSetHandleFunc(block, do_nla_region_buttons, NULL);
column= uiLayoutColumn(layout, 1);
- uiItemR(column, &strip_ptr, "use_animated_influence", 0, NULL, ICON_NULL);
+ uiItemR(column, &strip_ptr, "use_animated_influence", 0, NULL, ICON_NONE);
subcolumn= uiLayoutColumn(column, 1);
uiLayoutSetEnabled(subcolumn, RNA_boolean_get(&strip_ptr, "use_animated_influence"));
- uiItemR(subcolumn, &strip_ptr, "influence", 0, NULL, ICON_NULL);
+ uiItemR(subcolumn, &strip_ptr, "influence", 0, NULL, ICON_NONE);
column= uiLayoutColumn(layout, 1);
subrow= uiLayoutRow(column, 0);
- uiItemR(subrow, &strip_ptr, "use_animated_time", 0, NULL, ICON_NULL);
- uiItemR(subrow, &strip_ptr, "use_animated_time_cyclic", 0, NULL, ICON_NULL);
+ uiItemR(subrow, &strip_ptr, "use_animated_time", 0, NULL, ICON_NONE);
+ uiItemR(subrow, &strip_ptr, "use_animated_time_cyclic", 0, NULL, ICON_NONE);
subcolumn= uiLayoutColumn(column, 1);
subrow= uiLayoutRow(subcolumn, 0);
uiLayoutSetEnabled(subrow, RNA_boolean_get(&strip_ptr, "use_animated_time"));
- uiItemR(subcolumn, &strip_ptr, "strip_time", 0, NULL, ICON_NULL);
+ uiItemR(subcolumn, &strip_ptr, "strip_time", 0, NULL, ICON_NONE);
}
/* F-Modifiers for active NLA-Strip */
diff --git a/source/blender/editors/space_nla/nla_channels.c b/source/blender/editors/space_nla/nla_channels.c
index 9212d6f678b..265616020d5 100644
--- a/source/blender/editors/space_nla/nla_channels.c
+++ b/source/blender/editors/space_nla/nla_channels.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_nla/nla_channels.c
+ * \ingroup spnla
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/source/blender/editors/space_nla/nla_draw.c b/source/blender/editors/space_nla/nla_draw.c
index b09fb97094e..e830a421a59 100644
--- a/source/blender/editors/space_nla/nla_draw.c
+++ b/source/blender/editors/space_nla/nla_draw.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_nla/nla_draw.c
+ * \ingroup spnla
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
@@ -250,10 +255,10 @@ static void nla_draw_strip_curves (NlaStrip *strip, float yminc, float ymaxc)
}
else {
/* use blend in/out values only if both aren't zero */
- if ((IS_EQ(strip->blendin, 0.0f) && IS_EQ(strip->blendout, 0.0f))==0) {
+ if ((IS_EQF(strip->blendin, 0.0f) && IS_EQF(strip->blendout, 0.0f))==0) {
glBegin(GL_LINE_STRIP);
/* start of strip - if no blendin, start straight at 1, otherwise from 0 to 1 over blendin frames */
- if (IS_EQ(strip->blendin, 0.0f) == 0) {
+ if (IS_EQF(strip->blendin, 0.0f) == 0) {
glVertex2f(strip->start, yminc);
glVertex2f(strip->start + strip->blendin, ymaxc);
}
@@ -261,7 +266,7 @@ static void nla_draw_strip_curves (NlaStrip *strip, float yminc, float ymaxc)
glVertex2f(strip->start, ymaxc);
/* end of strip */
- if (IS_EQ(strip->blendout, 0.0f) == 0) {
+ if (IS_EQF(strip->blendout, 0.0f) == 0) {
glVertex2f(strip->end - strip->blendout, ymaxc);
glVertex2f(strip->end, yminc);
}
@@ -316,7 +321,7 @@ static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *UNUSED(nlt)
/* this only draws after the strip */
case NLASTRIP_EXTEND_HOLD_FORWARD:
/* only need to try and draw if the next strip doesn't occur immediately after */
- if ((strip->next == NULL) || (IS_EQ(strip->next->start, strip->end)==0)) {
+ if ((strip->next == NULL) || (IS_EQF(strip->next->start, strip->end)==0)) {
/* set the drawing color to the color of the strip, but this time less faint */
glColor4f(color[0], color[1], color[2], 0.3f);
@@ -373,7 +378,7 @@ static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *UNUSED(nlt)
uiDrawBoxShade(GL_LINE_LOOP, strip->start, yminc, strip->end, ymaxc, 0.0, 0.0, 0.1);
/* if action-clip strip, draw lines delimiting repeats too (in the same color as outline) */
- if ((strip->type == NLASTRIP_TYPE_CLIP) && IS_EQ(strip->repeat, 1.0f)==0) {
+ if ((strip->type == NLASTRIP_TYPE_CLIP) && IS_EQF(strip->repeat, 1.0f)==0) {
float repeatLen = (strip->actend - strip->actstart) * strip->scale;
int i;
@@ -398,7 +403,7 @@ static void nla_draw_strip (SpaceNla *snla, AnimData *adt, NlaTrack *UNUSED(nlt)
/* draw start-line if not same as end of previous (and only if not the first strip)
* - on upper half of strip
*/
- if ((cs->prev) && IS_EQ(cs->prev->end, cs->start)==0)
+ if ((cs->prev) && IS_EQF(cs->prev->end, cs->start)==0)
fdrawline(cs->start, y, cs->start, ymaxc);
/* draw end-line if not the last strip
diff --git a/source/blender/editors/space_nla/nla_edit.c b/source/blender/editors/space_nla/nla_edit.c
index 64fcb8d6ac5..d058ea746b6 100644
--- a/source/blender/editors/space_nla/nla_edit.c
+++ b/source/blender/editors/space_nla/nla_edit.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_nla/nla_edit.c
+ * \ingroup spnla
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -62,6 +67,7 @@
#include "WM_types.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "nla_intern.h" // own include
#include "nla_private.h" // FIXME... maybe this shouldn't be included?
@@ -650,7 +656,7 @@ static int nlaedit_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED
{
nlaedit_duplicate_exec(C, op);
- RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
+ RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION);
WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
return OPERATOR_FINISHED;
@@ -672,7 +678,7 @@ void NLA_OT_duplicate (wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+ RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
}
/* ******************** Delete Strips Operator ***************************** */
@@ -1417,7 +1423,7 @@ static int nlaedit_apply_scale_exec (bContext *C, wmOperator *UNUSED(op))
bAnimListElem *ale;
int filter;
- KeyframeEditData ked= {{0}};
+ KeyframeEditData ked= {{NULL}};
/* get editor data */
if (ANIM_animdata_get_context(C, &ac) == 0)
@@ -1708,7 +1714,7 @@ static int nla_fmodifier_add_invoke (bContext *C, wmOperator *UNUSED(op), wmEven
uiLayout *layout;
int i;
- pup= uiPupMenuBegin(C, "Add F-Modifier", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Add F-Modifier", ICON_NONE);
layout= uiPupMenuLayout(pup);
/* start from 1 to skip the 'Invalid' modifier type */
diff --git a/source/blender/editors/space_nla/nla_intern.h b/source/blender/editors/space_nla/nla_intern.h
index bd3a80a65c2..dba7fca8d0f 100644
--- a/source/blender/editors/space_nla/nla_intern.h
+++ b/source/blender/editors/space_nla/nla_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_nla/nla_intern.h
+ * \ingroup spnla
+ */
+
#ifndef ED_NLA_INTERN_H
#define ED_NLA_INTERN_H
diff --git a/source/blender/editors/space_nla/nla_ops.c b/source/blender/editors/space_nla/nla_ops.c
index 358b847db20..85dcf14adac 100644
--- a/source/blender/editors/space_nla/nla_ops.c
+++ b/source/blender/editors/space_nla/nla_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_nla/nla_ops.c
+ * \ingroup spnla
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_nla/nla_select.c b/source/blender/editors/space_nla/nla_select.c
index ec51be4d419..d75c1aa7dd3 100644
--- a/source/blender/editors/space_nla/nla_select.c
+++ b/source/blender/editors/space_nla/nla_select.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_nla/nla_select.c
+ * \ingroup spnla
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -206,11 +211,11 @@ void NLA_OT_select_all_toggle (wmOperatorType *ot)
*/
/* defines for borderselect mode */
-static enum {
+enum {
NLA_BORDERSEL_ALLSTRIPS = 0,
NLA_BORDERSEL_FRAMERANGE,
NLA_BORDERSEL_CHANNELS,
-} eNLAEDIT_BorderSelect_Mode;
+} /* eNLAEDIT_BorderSelect_Mode */;
static void borderselect_nla_strips (bAnimContext *ac, rcti rect, short mode, short selectmode)
diff --git a/source/blender/editors/space_nla/space_nla.c b/source/blender/editors/space_nla/space_nla.c
index c1bd5a98551..941a88c5c40 100644
--- a/source/blender/editors/space_nla/space_nla.c
+++ b/source/blender/editors/space_nla/space_nla.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_nla/space_nla.c
+ * \ingroup spnla
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_node/CMakeLists.txt b/source/blender/editors/space_node/CMakeLists.txt
index 955f57002a5..8604ba3baed 100644
--- a/source/blender/editors/space_node/CMakeLists.txt
+++ b/source/blender/editors/space_node/CMakeLists.txt
@@ -33,6 +33,7 @@ set(INC
../../render/extern/include
../../../../intern/guardedalloc
../../../../intern/opennl/extern
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_node/drawnode.c b/source/blender/editors/space_node/drawnode.c
index 880b537de02..78c295a56cb 100644
--- a/source/blender/editors/space_node/drawnode.c
+++ b/source/blender/editors/space_node/drawnode.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_node/drawnode.c
+ * \ingroup spnode
+ */
+
+
#include <math.h>
#include <stdio.h>
#include <string.h>
@@ -87,7 +92,7 @@ static void node_buts_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *p
prop = RNA_struct_find_property(ptr, "outputs");
RNA_property_collection_lookup_int(ptr, prop, 0, &sockptr);
- uiItemR(layout, &sockptr, "default_value", 0, "", ICON_NULL);
+ uiItemR(layout, &sockptr, "default_value", 0, "", ICON_NONE);
}
static void node_buts_rgb(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -102,7 +107,7 @@ static void node_buts_rgb(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr
col = uiLayoutColumn(layout, 0);
uiTemplateColorWheel(col, &sockptr, "default_value", 1, 0, 0, 0);
- uiItemR(col, &sockptr, "default_value", 0, "", ICON_NULL);
+ uiItemR(col, &sockptr, "default_value", 0, "", ICON_NONE);
}
static void node_buts_mix_rgb(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -112,7 +117,7 @@ static void node_buts_mix_rgb(uiLayout *layout, bContext *UNUSED(C), PointerRNA
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "blend_type", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "blend_type", 0, "", ICON_NONE);
if(ntree->type == NTREE_COMPOSIT)
uiItemR(row, ptr, "use_alpha", 0, "", ICON_IMAGE_RGB_ALPHA);
}
@@ -135,8 +140,8 @@ static void node_buts_time(uiLayout *layout, bContext *UNUSED(C), PointerRNA *pt
uiTemplateCurveMapping(layout, ptr, "curve", 's', 0, 0);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "frame_start", 0, "Sta", ICON_NULL);
- uiItemR(row, ptr, "frame_end", 0, "End", ICON_NULL);
+ uiItemR(row, ptr, "frame_start", 0, "Sta", ICON_NONE);
+ uiItemR(row, ptr, "frame_end", 0, "End", ICON_NONE);
}
static void node_buts_colorramp(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -269,17 +274,17 @@ static void node_buts_texture(uiLayout *layout, bContext *UNUSED(C), PointerRNA
(node->type != TEX_NODE_TEXTURE)
);
- uiItemR(layout, ptr, "texture", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "texture", 0, "", ICON_NONE);
if(multi) {
/* Number Drawing not optimal here, better have a list*/
- uiItemR(layout, ptr, "node_output", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "node_output", 0, "", ICON_NONE);
}
}
static void node_buts_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "operation", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
}
/* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */
@@ -321,40 +326,40 @@ static void node_shader_buts_material(uiLayout *layout, bContext *C, PointerRNA
if(!node->id) return;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_diffuse", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "use_specular", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "invert_normal", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_diffuse", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "use_specular", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "invert_normal", 0, NULL, ICON_NONE);
}
static void node_shader_buts_mapping(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row;
- uiItemL(layout, "Location:", ICON_NULL);
+ uiItemL(layout, "Location:", ICON_NONE);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "location", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "location", 0, "", ICON_NONE);
- uiItemL(layout, "Rotation:", ICON_NULL);
+ uiItemL(layout, "Rotation:", ICON_NONE);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "rotation", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "rotation", 0, "", ICON_NONE);
- uiItemL(layout, "Scale:", ICON_NULL);
+ uiItemL(layout, "Scale:", ICON_NONE);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "scale", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "scale", 0, "", ICON_NONE);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "use_min", 0, "Min", ICON_NULL);
- uiItemR(row, ptr, "min", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "use_min", 0, "Min", ICON_NONE);
+ uiItemR(row, ptr, "min", 0, "", ICON_NONE);
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "use_max", 0, "Max", ICON_NULL);
- uiItemR(row, ptr, "max", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "use_max", 0, "Max", ICON_NONE);
+ uiItemR(row, ptr, "max", 0, "", ICON_NONE);
}
static void node_shader_buts_vect_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "operation", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
}
static void node_shader_buts_geometry(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -367,12 +372,12 @@ static void node_shader_buts_geometry(uiLayout *layout, bContext *C, PointerRNA
if(obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
PointerRNA dataptr= RNA_pointer_get(&obptr, "data");
- uiItemPointerR(col, ptr, "uv_layer", &dataptr, "uv_textures", "", ICON_NULL);
- uiItemPointerR(col, ptr, "color_layer", &dataptr, "vertex_colors", "", ICON_NULL);
+ uiItemPointerR(col, ptr, "uv_layer", &dataptr, "uv_textures", "", ICON_NONE);
+ uiItemPointerR(col, ptr, "color_layer", &dataptr, "vertex_colors", "", ICON_NONE);
}
else {
- uiItemR(col, ptr, "uv_layer", 0, "UV", ICON_NULL);
- uiItemR(col, ptr, "color_layer", 0, "VCol", ICON_NULL);
+ uiItemR(col, ptr, "uv_layer", 0, "UV", ICON_NONE);
+ uiItemR(col, ptr, "color_layer", 0, "VCol", ICON_NONE);
}
}
@@ -488,21 +493,21 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA *
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &imaptr, "source", 0, NULL, ICON_NULL);
+ uiItemR(col, &imaptr, "source", 0, NULL, ICON_NONE);
if (ELEM(RNA_enum_get(&imaptr, "source"), IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) {
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "frame_duration", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "frame_start", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "frame_offset", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "use_cyclic", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "use_auto_refresh", UI_ITEM_R_ICON_ONLY, NULL, ICON_NULL);
+ uiItemR(col, ptr, "frame_duration", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "frame_start", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "frame_offset", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "use_cyclic", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "use_auto_refresh", UI_ITEM_R_ICON_ONLY, NULL, ICON_NONE);
}
col= uiLayoutColumn(layout, 0);
if (RNA_enum_get(&imaptr, "type")== IMA_TYPE_MULTILAYER)
- uiItemR(col, ptr, "layer", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "layer", 0, NULL, ICON_NONE);
}
static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -521,7 +526,7 @@ static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, Point
col= uiLayoutColumn(layout, 0);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "layer", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "layer", 0, "", ICON_NONE);
prop = RNA_struct_find_property(ptr, "layer");
if (!(RNA_property_enum_identifier(C, ptr, prop, RNA_property_enum_get(ptr, prop), &layer_name)))
@@ -544,13 +549,13 @@ static void node_composit_buts_blur(uiLayout *layout, bContext *UNUSED(C), Point
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "filter_type", 0, "", ICON_NULL);
+ uiItemR(col, ptr, "filter_type", 0, "", ICON_NONE);
if (RNA_enum_get(ptr, "filter_type")!= R_FILTER_FAST_GAUSS) {
- uiItemR(col, ptr, "use_bokeh", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "use_gamma_correction", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_bokeh", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "use_gamma_correction", 0, NULL, ICON_NONE);
}
- uiItemR(col, ptr, "use_relative", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_relative", 0, NULL, ICON_NONE);
if (RNA_boolean_get(ptr, "use_relative")) {
uiItemL(col, "Aspect Correction", 0);
@@ -558,13 +563,13 @@ static void node_composit_buts_blur(uiLayout *layout, bContext *UNUSED(C), Point
uiItemR(row, ptr, "aspect_correction", UI_ITEM_R_EXPAND, NULL, 0);
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "factor_x", 0, "X", ICON_NULL);
- uiItemR(col, ptr, "factor_y", 0, "Y", ICON_NULL);
+ uiItemR(col, ptr, "factor_x", 0, "X", ICON_NONE);
+ uiItemR(col, ptr, "factor_y", 0, "Y", ICON_NONE);
}
else {
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "size_x", 0, "X", ICON_NULL);
- uiItemR(col, ptr, "size_y", 0, "Y", ICON_NULL);
+ uiItemR(col, ptr, "size_x", 0, "X", ICON_NONE);
+ uiItemR(col, ptr, "size_y", 0, "Y", ICON_NONE);
}
}
@@ -572,24 +577,24 @@ static void node_composit_buts_dblur(uiLayout *layout, bContext *UNUSED(C), Poin
{
uiLayout *col;
- uiItemR(layout, ptr, "iterations", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "use_wrap", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "iterations", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "use_wrap", 0, NULL, ICON_NONE);
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Center:", ICON_NULL);
- uiItemR(col, ptr, "center_x", 0, "X", ICON_NULL);
- uiItemR(col, ptr, "center_y", 0, "Y", ICON_NULL);
+ uiItemL(col, "Center:", ICON_NONE);
+ uiItemR(col, ptr, "center_x", 0, "X", ICON_NONE);
+ uiItemR(col, ptr, "center_y", 0, "Y", ICON_NONE);
uiItemS(layout);
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "distance", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "angle", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "distance", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "angle", 0, NULL, ICON_NONE);
uiItemS(layout);
- uiItemR(layout, ptr, "spin", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "zoom", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "spin", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "zoom", 0, NULL, ICON_NONE);
}
static void node_composit_buts_bilateralblur(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -597,9 +602,9 @@ static void node_composit_buts_bilateralblur(uiLayout *layout, bContext *UNUSED(
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "iterations", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "sigma_color", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "sigma_space", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "iterations", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "sigma_color", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "sigma_space", 0, NULL, ICON_NONE);
}
static void node_composit_buts_defocus(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -607,60 +612,60 @@ static void node_composit_buts_defocus(uiLayout *layout, bContext *UNUSED(C), Po
uiLayout *sub, *col;
col= uiLayoutColumn(layout, 0);
- uiItemL(col, "Bokeh Type:", ICON_NULL);
- uiItemR(col, ptr, "bokeh", 0, "", ICON_NULL);
- uiItemR(col, ptr, "angle", 0, NULL, ICON_NULL);
+ uiItemL(col, "Bokeh Type:", ICON_NONE);
+ uiItemR(col, ptr, "bokeh", 0, "", ICON_NONE);
+ uiItemR(col, ptr, "angle", 0, NULL, ICON_NONE);
- uiItemR(layout, ptr, "use_gamma_correction", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_gamma_correction", 0, NULL, ICON_NONE);
col = uiLayoutColumn(layout, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_zbuffer")==1);
- uiItemR(col, ptr, "f_stop", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "f_stop", 0, NULL, ICON_NONE);
- uiItemR(layout, ptr, "blur_max", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "threshold", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "blur_max", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "threshold", 0, NULL, ICON_NONE);
col = uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_preview", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_preview", 0, NULL, ICON_NONE);
sub = uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_preview"));
- uiItemR(sub, ptr, "samples", 0, NULL, ICON_NULL);
+ uiItemR(sub, ptr, "samples", 0, NULL, ICON_NONE);
col = uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_zbuffer", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_zbuffer", 0, NULL, ICON_NONE);
sub = uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_zbuffer")==0);
- uiItemR(sub, ptr, "z_scale", 0, NULL, ICON_NULL);
+ uiItemR(sub, ptr, "z_scale", 0, NULL, ICON_NONE);
}
/* qdn: glare node */
static void node_composit_buts_glare(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "glare_type", 0, "", ICON_NULL);
- uiItemR(layout, ptr, "quality", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "glare_type", 0, "", ICON_NONE);
+ uiItemR(layout, ptr, "quality", 0, "", ICON_NONE);
if (RNA_enum_get(ptr, "glare_type")!= 1) {
- uiItemR(layout, ptr, "iterations", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "iterations", 0, NULL, ICON_NONE);
if (RNA_enum_get(ptr, "glare_type")!= 0)
- uiItemR(layout, ptr, "color_modulation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "color_modulation", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
}
- uiItemR(layout, ptr, "mix", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "threshold", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "mix", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "threshold", 0, NULL, ICON_NONE);
if (RNA_enum_get(ptr, "glare_type")== 2) {
- uiItemR(layout, ptr, "streaks", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "angle_offset", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "streaks", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "angle_offset", 0, NULL, ICON_NONE);
}
if (RNA_enum_get(ptr, "glare_type")== 0 || RNA_enum_get(ptr, "glare_type")== 2) {
- uiItemR(layout, ptr, "fade", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "fade", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
if (RNA_enum_get(ptr, "glare_type")== 0)
- uiItemR(layout, ptr, "use_rotate_45", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_rotate_45", 0, NULL, ICON_NONE);
}
if (RNA_enum_get(ptr, "glare_type")== 1) {
- uiItemR(layout, ptr, "size", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "size", 0, NULL, ICON_NONE);
}
}
@@ -669,17 +674,17 @@ static void node_composit_buts_tonemap(uiLayout *layout, bContext *UNUSED(C), Po
uiLayout *col;
col = uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "tonemap_type", 0, "", ICON_NULL);
+ uiItemR(col, ptr, "tonemap_type", 0, "", ICON_NONE);
if (RNA_enum_get(ptr, "tonemap_type")== 0) {
- uiItemR(col, ptr, "key", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "offset", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "gamma", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "key", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "offset", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "gamma", 0, NULL, ICON_NONE);
}
else {
- uiItemR(col, ptr, "intensity", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "contrast", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "adaptation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "correction", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "intensity", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "contrast", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "adaptation", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "correction", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
}
}
@@ -688,12 +693,12 @@ static void node_composit_buts_lensdist(uiLayout *layout, bContext *UNUSED(C), P
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "use_projector", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_projector", 0, NULL, ICON_NONE);
col = uiLayoutColumn(col, 0);
uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_projector")==0);
- uiItemR(col, ptr, "use_jitter", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "use_fit", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_jitter", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "use_fit", 0, NULL, ICON_NONE);
}
static void node_composit_buts_vecblur(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -701,45 +706,45 @@ static void node_composit_buts_vecblur(uiLayout *layout, bContext *UNUSED(C), Po
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "samples", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "factor", 0, "Blur", ICON_NULL);
+ uiItemR(col, ptr, "samples", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "factor", 0, "Blur", ICON_NONE);
col= uiLayoutColumn(layout, 1);
- uiItemL(col, "Speed:", ICON_NULL);
- uiItemR(col, ptr, "speed_min", 0, "Min", ICON_NULL);
- uiItemR(col, ptr, "speed_max", 0, "Max", ICON_NULL);
+ uiItemL(col, "Speed:", ICON_NONE);
+ uiItemR(col, ptr, "speed_min", 0, "Min", ICON_NONE);
+ uiItemR(col, ptr, "speed_max", 0, "Max", ICON_NONE);
- uiItemR(layout, ptr, "use_curved", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_curved", 0, NULL, ICON_NONE);
}
static void node_composit_buts_filter(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "filter_type", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "filter_type", 0, "", ICON_NONE);
}
static void node_composit_buts_flip(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "axis", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "axis", 0, "", ICON_NONE);
}
static void node_composit_buts_crop(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col;
- uiItemR(layout, ptr, "use_crop_size", 0, NULL, ICON_NULL);
- uiItemR(layout, ptr, "relative", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "use_crop_size", 0, NULL, ICON_NONE);
+ uiItemR(layout, ptr, "relative", 0, NULL, ICON_NONE);
col= uiLayoutColumn(layout, 1);
if (RNA_boolean_get(ptr, "relative")){
- uiItemR(col, ptr, "rel_min_x", 0, "Left", ICON_NULL);
- uiItemR(col, ptr, "rel_max_x", 0, "Right", ICON_NULL);
- uiItemR(col, ptr, "rel_min_y", 0, "Up", ICON_NULL);
- uiItemR(col, ptr, "rel_max_y", 0, "Down", ICON_NULL);
+ uiItemR(col, ptr, "rel_min_x", 0, "Left", ICON_NONE);
+ uiItemR(col, ptr, "rel_max_x", 0, "Right", ICON_NONE);
+ uiItemR(col, ptr, "rel_min_y", 0, "Up", ICON_NONE);
+ uiItemR(col, ptr, "rel_max_y", 0, "Down", ICON_NONE);
} else {
- uiItemR(col, ptr, "min_x", 0, "Left", ICON_NULL);
- uiItemR(col, ptr, "max_x", 0, "Right", ICON_NULL);
- uiItemR(col, ptr, "min_y", 0, "Up", ICON_NULL);
- uiItemR(col, ptr, "max_y", 0, "Down", ICON_NULL);
+ uiItemR(col, ptr, "min_x", 0, "Left", ICON_NONE);
+ uiItemR(col, ptr, "max_x", 0, "Right", ICON_NONE);
+ uiItemR(col, ptr, "min_y", 0, "Up", ICON_NONE);
+ uiItemR(col, ptr, "max_y", 0, "Down", ICON_NONE);
}
}
@@ -749,8 +754,8 @@ static void node_composit_buts_splitviewer(uiLayout *layout, bContext *UNUSED(C)
col= uiLayoutColumn(layout, 0);
row= uiLayoutRow(col, 0);
- uiItemR(row, ptr, "axis", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
- uiItemR(col, ptr, "factor", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ uiItemR(col, ptr, "factor", 0, NULL, ICON_NONE);
}
static void node_composit_buts_map_value(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -758,20 +763,20 @@ static void node_composit_buts_map_value(uiLayout *layout, bContext *UNUSED(C),
uiLayout *sub, *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "offset", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "size", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "offset", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "size", 0, NULL, ICON_NONE);
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "use_min", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_min", 0, NULL, ICON_NONE);
sub =uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min"));
- uiItemR(sub, ptr, "min", 0, "", ICON_NULL);
+ uiItemR(sub, ptr, "min", 0, "", ICON_NONE);
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "use_max", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_max", 0, NULL, ICON_NONE);
sub =uiLayoutColumn(col, 0);
uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max"));
- uiItemR(sub, ptr, "max", 0, "", ICON_NULL);
+ uiItemR(sub, ptr, "max", 0, "", ICON_NONE);
}
static void node_composit_buts_alphaover(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -779,8 +784,8 @@ static void node_composit_buts_alphaover(uiLayout *layout, bContext *UNUSED(C),
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "use_premultiply", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "premul", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_premultiply", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "premul", 0, NULL, ICON_NONE);
}
static void node_composit_buts_zcombine(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -788,7 +793,7 @@ static void node_composit_buts_zcombine(uiLayout *layout, bContext *UNUSED(C), P
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "use_alpha", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "use_alpha", 0, NULL, ICON_NONE);
}
@@ -797,14 +802,14 @@ static void node_composit_buts_hue_sat(uiLayout *layout, bContext *UNUSED(C), Po
uiLayout *col;
col =uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
}
static void node_composit_buts_dilateerode(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "distance", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "distance", 0, NULL, ICON_NONE);
}
static void node_composit_buts_diff_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -812,8 +817,8 @@ static void node_composit_buts_diff_matte(uiLayout *layout, bContext *UNUSED(C),
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
}
static void node_composit_buts_distance_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -821,33 +826,33 @@ static void node_composit_buts_distance_matte(uiLayout *layout, bContext *UNUSED
uiLayout *col;
col =uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
}
static void node_composit_buts_color_spill(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *row, *col;
- uiItemL(layout, "Despill Channel:", ICON_NULL);
+ uiItemL(layout, "Despill Channel:", ICON_NONE);
row =uiLayoutRow(layout,0);
- uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NONE);
if(RNA_enum_get(ptr, "limit_method")==0) {
- uiItemL(col, "Limiting Channel:", ICON_NULL);
+ uiItemL(col, "Limiting Channel:", ICON_NONE);
row=uiLayoutRow(col,0);
- uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
}
- uiItemR(col, ptr, "ratio", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "use_unspill", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "ratio", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "use_unspill", 0, NULL, ICON_NONE);
if (RNA_enum_get(ptr, "use_unspill")== 1) {
- uiItemR(col, ptr, "unspill_red", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "unspill_green", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "unspill_blue", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "unspill_red", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "unspill_green", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "unspill_blue", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
}
}
@@ -856,13 +861,13 @@ static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *UNUSED(C
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "tolerance", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "threshold", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "tolerance", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "threshold", 0, NULL, ICON_NONE);
col= uiLayoutColumn(layout, 1);
- /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, ICON_NULL); Removed for now */
- uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, ICON_NULL); Removed for now*/
+ /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE); Removed for now */
+ uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, ICON_NONE); Removed for now*/
}
static void node_composit_buts_color_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -870,35 +875,35 @@ static void node_composit_buts_color_matte(uiLayout *layout, bContext *UNUSED(C)
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
}
static void node_composit_buts_channel_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *col, *row;
- uiItemL(layout, "Color Space:", ICON_NULL);
+ uiItemL(layout, "Color Space:", ICON_NONE);
row= uiLayoutRow(layout, 0);
- uiItemR(row, ptr, "color_space", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, ptr, "color_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
col=uiLayoutColumn(layout, 0);
- uiItemL(col, "Key Channel:", ICON_NULL);
+ uiItemL(col, "Key Channel:", ICON_NONE);
row= uiLayoutRow(col, 0);
- uiItemR(row, ptr, "matte_channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, ptr, "matte_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
col =uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NONE);
if(RNA_enum_get(ptr, "limit_method")==0) {
- uiItemL(col, "Limiting Channel:", ICON_NULL);
+ uiItemL(col, "Limiting Channel:", ICON_NONE);
row=uiLayoutRow(col,0);
- uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
}
- uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
}
static void node_composit_buts_luma_matte(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -906,18 +911,18 @@ static void node_composit_buts_luma_matte(uiLayout *layout, bContext *UNUSED(C),
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
- uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, ICON_NULL);
+ uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
+ uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
}
static void node_composit_buts_map_uv(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "alpha", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "alpha", 0, NULL, ICON_NONE);
}
static void node_composit_buts_id_mask(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "index", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "index", 0, NULL, ICON_NONE);
}
static void node_composit_buts_file_output(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -925,34 +930,34 @@ static void node_composit_buts_file_output(uiLayout *layout, bContext *UNUSED(C)
uiLayout *col, *row;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "filepath", 0, "", ICON_NULL);
- uiItemR(col, ptr, "image_type", 0, "", ICON_NULL);
+ uiItemR(col, ptr, "filepath", 0, "", ICON_NONE);
+ uiItemR(col, ptr, "image_type", 0, "", ICON_NONE);
row= uiLayoutRow(layout, 0);
if (RNA_enum_get(ptr, "image_type")== R_OPENEXR) {
- uiItemR(row, ptr, "use_exr_half", 0, NULL, ICON_NULL);
- uiItemR(row, ptr, "exr_codec", 0, "", ICON_NULL);
+ uiItemR(row, ptr, "use_exr_half", 0, NULL, ICON_NONE);
+ uiItemR(row, ptr, "exr_codec", 0, "", ICON_NONE);
}
else if (RNA_enum_get(ptr, "image_type")== R_JPEG90) {
- uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Quality", ICON_NULL);
+ uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Quality", ICON_NONE);
}
else if (RNA_enum_get(ptr, "image_type")== R_PNG) {
- uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Compression", ICON_NULL);
+ uiItemR(row, ptr, "quality", UI_ITEM_R_SLIDER, "Compression", ICON_NONE);
}
row= uiLayoutRow(layout, 1);
- uiItemR(row, ptr, "frame_start", 0, "Start", ICON_NULL);
- uiItemR(row, ptr, "frame_end", 0, "End", ICON_NULL);
+ uiItemR(row, ptr, "frame_start", 0, "Start", ICON_NONE);
+ uiItemR(row, ptr, "frame_end", 0, "End", ICON_NONE);
}
static void node_composit_buts_scale(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "space", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "space", 0, "", ICON_NONE);
}
static void node_composit_buts_rotate(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "filter_type", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "filter_type", 0, "", ICON_NONE);
}
static void node_composit_buts_invert(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -960,25 +965,25 @@ static void node_composit_buts_invert(uiLayout *layout, bContext *UNUSED(C), Poi
uiLayout *col;
col= uiLayoutColumn(layout, 0);
- uiItemR(col, ptr, "invert_rgb", 0, NULL, ICON_NULL);
- uiItemR(col, ptr, "invert_alpha", 0, NULL, ICON_NULL);
+ uiItemR(col, ptr, "invert_rgb", 0, NULL, ICON_NONE);
+ uiItemR(col, ptr, "invert_alpha", 0, NULL, ICON_NONE);
}
static void node_composit_buts_premulkey(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mapping", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "mapping", 0, "", ICON_NONE);
}
static void node_composit_buts_view_levels(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
}
static void node_composit_buts_colorbalance(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
uiLayout *split, *col, *row;
- uiItemR(layout, ptr, "correction_method", 0, NULL, ICON_NULL);
+ uiItemR(layout, ptr, "correction_method", 0, NULL, ICON_NONE);
if (RNA_enum_get(ptr, "correction_method")== 0) {
@@ -986,17 +991,17 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *UNUSED(C
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "lift", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "lift", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "lift", 0, NULL, ICON_NONE);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "gamma", 1, 1, 1, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "gamma", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "gamma", 0, NULL, ICON_NONE);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "gain", 1, 1, 1, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "gain", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "gain", 0, NULL, ICON_NONE);
} else {
@@ -1004,17 +1009,17 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *UNUSED(C
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "offset", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "offset", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "offset", 0, NULL, ICON_NONE);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "power", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "power", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "power", 0, NULL, ICON_NONE);
col = uiLayoutColumn(split, 0);
uiTemplateColorWheel(col, ptr, "slope", 1, 1, 0, 1);
row = uiLayoutRow(col, 0);
- uiItemR(row, ptr, "slope", 0, NULL, ICON_NULL);
+ uiItemR(row, ptr, "slope", 0, NULL, ICON_NONE);
}
}
@@ -1026,7 +1031,7 @@ static void node_composit_buts_huecorrect(uiLayout *layout, bContext *UNUSED(C),
static void node_composit_buts_ycc(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "mode", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "mode", 0, "", ICON_NONE);
}
/* only once called */
@@ -1189,12 +1194,12 @@ static void node_texture_buts_bricks(uiLayout *layout, bContext *UNUSED(C), Poin
uiLayout *col;
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "offset", 0, "Offset", ICON_NULL);
- uiItemR(col, ptr, "offset_frequency", 0, "Frequency", ICON_NULL);
+ uiItemR(col, ptr, "offset", 0, "Offset", ICON_NONE);
+ uiItemR(col, ptr, "offset_frequency", 0, "Frequency", ICON_NONE);
col= uiLayoutColumn(layout, 1);
- uiItemR(col, ptr, "squash", 0, "Squash", ICON_NULL);
- uiItemR(col, ptr, "squash_frequency", 0, "Frequency", ICON_NULL);
+ uiItemR(col, ptr, "squash", 0, "Squash", ICON_NONE);
+ uiItemR(col, ptr, "squash_frequency", 0, "Frequency", ICON_NONE);
}
static void node_texture_buts_proc(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -1211,42 +1216,68 @@ static void node_texture_buts_proc(uiLayout *layout, bContext *UNUSED(C), Pointe
switch( tex->type ) {
case TEX_BLEND:
- uiItemR(col, &tex_ptr, "progression", 0, "", ICON_NULL);
+ uiItemR(col, &tex_ptr, "progression", 0, "", ICON_NONE);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "use_flip_axis", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, &tex_ptr, "use_flip_axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
break;
case TEX_MARBLE:
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "marble_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, &tex_ptr, "marble_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ row= uiLayoutRow(col, 0);
+ uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ row= uiLayoutRow(col, 0);
+ uiItemR(row, &tex_ptr, "noise_basis", 0, "", ICON_NONE);
+ row= uiLayoutRow(col, 0);
+ uiItemR(row, &tex_ptr, "noise_basis_2", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ break;
+
+ case TEX_MAGIC:
+ uiItemR(col, &tex_ptr, "noise_depth", 0, NULL, ICON_NONE);
+ break;
+
+ case TEX_STUCCI:
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, &tex_ptr, "stucci_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NONE);
break;
case TEX_WOOD:
- uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NULL);
- uiItemR(col, &tex_ptr, "wood_type", 0, "", ICON_NULL);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NONE);
+ uiItemR(col, &tex_ptr, "wood_type", 0, "", ICON_NONE);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noisebasis_2", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, &tex_ptr, "noise_basis_2", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
row= uiLayoutRow(col, 0);
uiLayoutSetActive(row, !(RNA_enum_get(&tex_ptr, "wood_type")==TEX_BAND || RNA_enum_get(&tex_ptr, "wood_type")==TEX_RING));
- uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
break;
case TEX_CLOUDS:
- uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NULL);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NONE);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "cloud_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
+ uiItemR(row, &tex_ptr, "cloud_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
row= uiLayoutRow(col, 0);
- uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NULL);
- uiItemR(col, &tex_ptr, "noise_depth", UI_ITEM_R_EXPAND, "Depth", ICON_NULL);
+ uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+ uiItemR(col, &tex_ptr, "noise_depth", UI_ITEM_R_EXPAND, "Depth", ICON_NONE);
break;
case TEX_DISTNOISE:
- uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NULL);
- uiItemR(col, &tex_ptr, "noise_distortion", 0, "", ICON_NULL);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NONE);
+ uiItemR(col, &tex_ptr, "noise_distortion", 0, "", ICON_NONE);
+ break;
+
+ case TEX_MUSGRAVE:
+ uiItemR(col, &tex_ptr, "musgrave_type", 0, "", ICON_NONE);
+ uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NONE);
+ break;
+ case TEX_VORONOI:
+ uiItemR(col, &tex_ptr, "distance_metric", 0, "", ICON_NONE);
+ if(tex->vn_distm == TEX_MINKOVSKY) {
+ uiItemR(col, &tex_ptr, "minkovsky_exponent", 0, NULL, ICON_NONE);
+ }
+ uiItemR(col, &tex_ptr, "color_mode", 0, "", ICON_NONE);
break;
}
}
@@ -1258,7 +1289,7 @@ static void node_texture_buts_image(uiLayout *layout, bContext *C, PointerRNA *p
static void node_texture_buts_output(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
{
- uiItemR(layout, ptr, "filepath", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "filepath", 0, "", ICON_NONE);
}
/* only once called */
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index 12f99baa800..684961f2606 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_node/node_buttons.c
+ * \ingroup spnode
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -107,8 +112,10 @@ static void active_node_panel(const bContext *C, Panel *pa)
uiBlockSetHandleFunc(block, do_node_region_buttons, NULL);
/* draw this node's name, etc. */
+ uiItemR(layout, &ptr, "label", 0, NULL, ICON_NODE);
+ uiItemS(layout);
uiItemR(layout, &ptr, "name", 0, NULL, ICON_NODE);
- // TODO: a separator would be nice...
+ uiItemS(layout);
/* draw this node's settings */
if (node->typeinfo && node->typeinfo->uifunc)
diff --git a/source/blender/editors/space_node/node_draw.c b/source/blender/editors/space_node/node_draw.c
index c766b797534..0c9f12966ef 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_node/node_draw.c
+ * \ingroup spnode
+ */
+
+
#include <math.h>
#include <stdio.h>
#include <string.h>
@@ -279,7 +284,7 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
node->butr.xmax= node->width - 2*NODE_DYS;
node->butr.ymin= 0;
node->butr.ymax= 0;
-
+
RNA_pointer_create(&ntree->id, &RNA_Node, node, &ptr);
layout= uiBlockLayout(node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
@@ -308,7 +313,7 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
node->totr.xmin= node->locx;
node->totr.xmax= node->locx + node->width;
node->totr.ymax= node->locy;
- node->totr.ymin= dy;
+ node->totr.ymin= MIN2(dy, node->locy-2*NODE_DY);
}
/* based on settings in node, sets drawing rect info. each redraw! */
@@ -381,7 +386,7 @@ static int node_get_colorid(bNode *node)
/* based on settings in node, sets drawing rect info. each redraw! */
/* note: this assumes only 1 group at a time is drawn (linked data) */
/* in node->totr the entire boundbox for the group is stored */
-static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode)
+static void node_update_group(const bContext *C, bNodeTree *UNUSED(ntree), bNode *gnode)
{
bNodeTree *ngroup= (bNodeTree *)gnode->id;
bNode *node;
@@ -401,7 +406,7 @@ static void node_update_group(const bContext *C, bNodeTree *ntree, bNode *gnode)
if(node->flag & NODE_HIDDEN)
node_update_hidden(node);
else
- node_update(C, ntree, node);
+ node_update(C, ngroup, node);
node->locx-= gnode->locx;
node->locy-= gnode->locy;
}
@@ -459,7 +464,7 @@ static void node_draw_mute_line(View2D *v2d, SpaceNode *snode, bNode *node)
{
bNodeSocket *valsock= NULL, *colsock= NULL, *vecsock= NULL;
bNodeSocket *sock;
- bNodeLink link= {0};
+ bNodeLink link= {NULL};
int a;
/* connect the first value buffer in with first value out */
@@ -651,7 +656,7 @@ static uiBlock *socket_vector_menu(bContext *C, ARegion *ar, void *args_v)
layout= uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, args->x, args->y+2, args->width, 20, U.uistyles.first), 0);
- uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NULL);
+ uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NONE);
return block;
}
@@ -799,7 +804,9 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
else
UI_ThemeColor(TH_TEXT); */
- if (node->typeinfo->labelfunc)
+ if (node->label[0]!='\0')
+ BLI_strncpy(showname, node->label, sizeof(showname));
+ else if (node->typeinfo->labelfunc)
BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname));
else
BLI_strncpy(showname, node->typeinfo->name, sizeof(showname));
@@ -943,7 +950,9 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
UI_ThemeColor(TH_TEXT);
if(node->miniwidth>0.0f) {
- if (node->typeinfo->labelfunc)
+ if (node->label[0]!='\0')
+ BLI_strncpy(showname, node->label, sizeof(showname));
+ else if (node->typeinfo->labelfunc)
BLI_strncpy(showname, node->typeinfo->labelfunc(node), sizeof(showname));
else
BLI_strncpy(showname, node->typeinfo->name, sizeof(showname));
@@ -1195,6 +1204,7 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
SpaceNode *snode= CTX_wm_space_node(C);
Scene *scene= CTX_data_scene(C);
int color_manage = scene->r.color_mgt_flag & R_COLOR_MANAGEMENT;
+ bNodeLinkDrag *nldrag;
UI_ThemeClearColor(TH_BACK);
glClear(GL_COLOR_BUFFER_BIT);
@@ -1250,6 +1260,14 @@ void drawnodespace(const bContext *C, ARegion *ar, View2D *v2d)
}
}
+ /* temporary links */
+ glEnable(GL_BLEND);
+ glEnable(GL_LINE_SMOOTH);
+ for(nldrag= snode->linkdrag.first; nldrag; nldrag= nldrag->next)
+ node_draw_link(&ar->v2d, snode, nldrag->link);
+ glDisable(GL_LINE_SMOOTH);
+ glDisable(GL_BLEND);
+
/* draw grease-pencil ('canvas' strokes) */
if (/*(snode->flag & SNODE_DISPGP) &&*/ (snode->nodetree))
draw_gpencil_view2d((bContext*)C, 1);
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index 8086ce3621a..3877e7abf5e 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_node/node_edit.c
+ * \ingroup spnode
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
@@ -1170,7 +1175,7 @@ static void sample_apply(bContext *C, wmOperator *op, wmEvent *event)
fx = (bufx > 0.0f ? ((float)mx - 0.5f*ar->winx - snode->xof) / bufx + 0.5f : 0.0f);
fy = (bufy > 0.0f ? ((float)my - 0.5f*ar->winy - snode->yof) / bufy + 0.5f : 0.0f);
- if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) {
+ if(fx>=0.0f && fy>=0.0f && fx<1.0f && fy<1.0f) {
float *fp;
char *cp;
int x= (int)(fx*ibuf->x), y= (int)(fy*ibuf->y);
@@ -2023,15 +2028,6 @@ void NODE_OT_duplicate(wmOperatorType *ot)
/* *************************** add link op ******************** */
-/* temp data to pass on to modal */
-typedef struct NodeLinkDrag
-{
- bNode *node;
- bNodeSocket *sock;
- bNodeLink *link;
- int in_out;
-} NodeLinkDrag;
-
static void node_remove_extra_links(SpaceNode *snode, bNodeSocket *tsock, bNodeLink *link)
{
bNodeLink *tlink;
@@ -2072,7 +2068,7 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
- NodeLinkDrag *nldrag= op->customdata;
+ bNodeLinkDrag *nldrag= op->customdata;
bNode *tnode, *node;
bNodeSocket *tsock= NULL, *sock;
bNodeLink *link;
@@ -2095,11 +2091,15 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
if( link->tosock!= tsock && (!tnode || (tnode!=node && link->tonode!=tnode)) ) {
link->tonode= tnode;
link->tosock= tsock;
+ if (link->prev==NULL && link->next==NULL)
+ BLI_addtail(&snode->edittree->links, link);
ntreeSolveOrder(snode->edittree); /* for interactive red line warning */
}
}
}
else {
+ BLI_remlink(&snode->edittree->links, link);
+ link->prev = link->next = NULL;
link->tonode= NULL;
link->tosock= NULL;
}
@@ -2111,12 +2111,16 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
if( link->fromsock!= tsock && (!tnode || (tnode!=node && link->fromnode!=tnode)) ) {
link->fromnode= tnode;
link->fromsock= tsock;
+ if (link->prev==NULL && link->next==NULL)
+ BLI_addtail(&snode->edittree->links, link);
ntreeSolveOrder(snode->edittree); /* for interactive red line warning */
}
}
}
}
else {
+ BLI_remlink(&snode->edittree->links, link);
+ link->prev = link->next = NULL;
link->fromnode= NULL;
link->fromsock= NULL;
}
@@ -2143,10 +2147,14 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
if (link->tonode && link->tosock) {
link->fromsock = nodeGroupExposeSocket(snode->edittree, link->tosock, SOCK_IN);
link->fromnode = NULL;
+ if (link->prev==NULL && link->next==NULL)
+ BLI_addtail(&snode->edittree->links, link);
}
else if (link->fromnode && link->fromsock) {
link->tosock = nodeGroupExposeSocket(snode->edittree, link->fromsock, SOCK_OUT);
link->tonode = NULL;
+ if (link->prev==NULL && link->next==NULL)
+ BLI_addtail(&snode->edittree->links, link);
}
}
else
@@ -2156,8 +2164,8 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
node_tree_verify_groups(snode->nodetree);
snode_notify(C, snode);
- MEM_freeN(op->customdata);
- op->customdata= NULL;
+ BLI_remlink(&snode->linkdrag, nldrag);
+ MEM_freeN(nldrag);
return OPERATOR_FINISHED;
}
@@ -2166,7 +2174,7 @@ static int node_link_modal(bContext *C, wmOperator *op, wmEvent *event)
}
/* return 1 when socket clicked */
-static int node_link_init(SpaceNode *snode, NodeLinkDrag *nldrag)
+static int node_link_init(SpaceNode *snode, bNodeLinkDrag *nldrag)
{
bNodeLink *link;
@@ -2218,7 +2226,8 @@ static int node_link_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
SpaceNode *snode= CTX_wm_space_node(C);
ARegion *ar= CTX_wm_region(C);
- NodeLinkDrag *nldrag= MEM_callocN(sizeof(NodeLinkDrag), "drag link op customdata");
+ bNodeLinkDrag *nldrag= MEM_callocN(sizeof(bNodeLinkDrag), "drag link op customdata");
+
UI_view2d_region_to_view(&ar->v2d, event->x - ar->winrct.xmin, event->y - ar->winrct.ymin,
&snode->mx, &snode->my);
@@ -2231,10 +2240,21 @@ static int node_link_invoke(bContext *C, wmOperator *op, wmEvent *event)
op->customdata= nldrag;
/* we make a temporal link */
- if(nldrag->in_out==SOCK_OUT)
- nldrag->link= nodeAddLink(snode->edittree, nldrag->node, nldrag->sock, NULL, NULL);
- else
- nldrag->link= nodeAddLink(snode->edittree, NULL, NULL, nldrag->node, nldrag->sock);
+ if(nldrag->in_out==SOCK_OUT) {
+ nldrag->link= MEM_callocN(sizeof(bNodeLink), "link");
+ nldrag->link->fromnode= nldrag->node;
+ nldrag->link->fromsock= nldrag->sock;
+ nldrag->link->tonode= NULL;
+ nldrag->link->tosock= NULL;
+ }
+ else {
+ nldrag->link= MEM_callocN(sizeof(bNodeLink), "link");
+ nldrag->link->fromnode= NULL;
+ nldrag->link->fromsock= NULL;
+ nldrag->link->tonode= nldrag->node;
+ nldrag->link->tosock= nldrag->sock;
+ }
+ BLI_addtail(&snode->linkdrag, nldrag);
/* add modal handler */
WM_event_add_modal_handler(C, op);
diff --git a/source/blender/editors/space_node/node_header.c b/source/blender/editors/space_node/node_header.c
index 4d4896d65a0..d7084d51180 100644
--- a/source/blender/editors/space_node/node_header.c
+++ b/source/blender/editors/space_node/node_header.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_node/node_header.c
+ * \ingroup spnode
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -49,6 +54,8 @@
#include "UI_interface.h"
+#include "UI_resources.h"
+#include "UI_interface_icons.h"
#include "UI_view2d.h"
#include "node_intern.h"
@@ -140,7 +147,7 @@ static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclas
for(tot=0, a=0; ngroup; ngroup= ngroup->id.next, tot++) {
if(ngroup->type==ntree->type) {
- uiItemV(layout, ngroup->id.name+2, ICON_NULL, NODE_GROUP_MENU+tot);
+ uiItemV(layout, ngroup->id.name+2, ICON_NONE, NODE_GROUP_MENU+tot);
a++;
}
}
@@ -152,11 +159,11 @@ static void node_auto_add_menu(bContext *C, uiLayout *layout, void *arg_nodeclas
for(a=0, type= ntree->alltypes.first; type; type=type->next) {
if(type->nclass == nodeclass && type->name) {
if(type->type == NODE_DYNAMIC) {
- uiItemV(layout, type->name, ICON_NULL, NODE_DYNAMIC_MENU+script);
+ uiItemV(layout, type->name, ICON_NONE, NODE_DYNAMIC_MENU+script);
script++;
}
else
- uiItemV(layout, type->name, ICON_NULL, type->type);
+ uiItemV(layout, type->name, ICON_NONE, type->type);
a++;
}
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index 31eb7a7bfd2..205cf099776 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_node/node_intern.h
+ * \ingroup spnode
+ */
+
#ifndef ED_NODE_INTERN_H
#define ED_NODE_INTERN_H
@@ -35,6 +40,20 @@ struct ARegionType;
struct View2D;
struct bContext;
struct wmWindowManager;
+struct bNode;
+struct bNodeSocket;
+struct bNodeLink;
+
+/* temp data to pass on to modal */
+typedef struct bNodeLinkDrag
+{
+ struct bNodeLinkDrag *next, *prev;
+
+ struct bNode *node;
+ struct bNodeSocket *sock;
+ struct bNodeLink *link;
+ int in_out;
+} bNodeLinkDrag;
/* space_node.c */
ARegion *node_has_buttons_region(ScrArea *sa);
diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c
index e563ae4e3f4..11e7949791d 100644
--- a/source/blender/editors/space_node/node_ops.c
+++ b/source/blender/editors/space_node/node_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_node/node_ops.c
+ * \ingroup spnode
+ */
+
+
#include "DNA_node_types.h"
#include "DNA_scene_types.h"
diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c
index bcc69c1f260..4aa56ef370d 100644
--- a/source/blender/editors/space_node/node_select.c
+++ b/source/blender/editors/space_node/node_select.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_node/node_select.c
+ * \ingroup spnode
+ */
+
+
#include <stdio.h>
#include "DNA_node_types.h"
diff --git a/source/blender/editors/space_node/node_state.c b/source/blender/editors/space_node/node_state.c
index abb3d83d336..6172f212aef 100644
--- a/source/blender/editors/space_node/node_state.c
+++ b/source/blender/editors/space_node/node_state.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_node/node_state.c
+ * \ingroup spnode
+ */
+
+
#include <stdio.h>
#include "DNA_node_types.h"
diff --git a/source/blender/editors/space_node/space_node.c b/source/blender/editors/space_node/space_node.c
index 4bccd14bb42..c0e9e8e22e1 100644
--- a/source/blender/editors/space_node/space_node.c
+++ b/source/blender/editors/space_node/space_node.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_node/space_node.c
+ * \ingroup spnode
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -278,6 +283,7 @@ static SpaceLink *node_duplicate(SpaceLink *sl)
/* clear or remove stuff from old */
snoden->nodetree= NULL;
+ snoden->linkdrag.first= snoden->linkdrag.last= NULL;
return (SpaceLink *)snoden;
}
@@ -425,7 +431,7 @@ static int node_context(const bContext *C, const char *member, bContextDataResul
bNode *node;
for(next_node(snode->edittree); (node=next_node(NULL));) {
- if(node->flag & SELECT) {
+ if(node->flag & NODE_SELECT) {
CTX_data_list_add(result, &snode->edittree->id, &RNA_Node, node);
}
}
diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt
index 6dc5792ad0c..871dec4dfc5 100644
--- a/source/blender/editors/space_outliner/CMakeLists.txt
+++ b/source/blender/editors/space_outliner/CMakeLists.txt
@@ -30,6 +30,7 @@ set(INC
../../windowmanager
../../../../intern/guardedalloc
../../../../intern/opennl/extern
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_outliner/outliner.c b/source/blender/editors/space_outliner/outliner.c
index 91a2754545b..aab7b352df9 100644
--- a/source/blender/editors/space_outliner/outliner.c
+++ b/source/blender/editors/space_outliner/outliner.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_outliner/outliner.c
+ * \ingroup spoutliner
+ */
+
+
#include <math.h>
#include <string.h>
#include <stdlib.h>
@@ -56,7 +61,9 @@
#if defined WIN32 && !defined _LIBC
# include "BLI_fnmatch.h" /* use fnmatch included in blenlib */
#else
-# define _GNU_SOURCE
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE
+# endif
# include <fnmatch.h>
#endif
@@ -3284,7 +3291,7 @@ static void id_local_cb(bContext *UNUSED(C), Scene *UNUSED(scene), TreeElement *
if(tselem->id->lib && (tselem->id->flag & LIB_EXTERN)) {
tselem->id->lib= NULL;
tselem->id->flag= LIB_LOCAL;
- new_id(0, tselem->id, 0);
+ new_id(NULL, tselem->id, NULL);
}
}
@@ -5244,15 +5251,15 @@ static void outliner_draw_restrictbuts(uiBlock *block, Scene *scene, ARegion *ar
uiBlockSetEmboss(block, UI_EMBOSSN);
restrict_bool= group_restrict_flag(gr, OB_RESTRICT_VIEW);
- bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_VIEW_ON : ICON_RESTRICT_VIEW_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_VIEW_ON : ICON_RESTRICT_VIEW_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, (int)te->ys, 17, OL_H-1, NULL, 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
uiButSetFunc(bt, restrictbutton_gr_restrict_view, scene, gr);
restrict_bool= group_restrict_flag(gr, OB_RESTRICT_SELECT);
- bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_SELECT_ON : ICON_RESTRICT_SELECT_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
+ bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_SELECT_ON : ICON_RESTRICT_SELECT_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, (int)te->ys, 17, OL_H-1, NULL, 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
uiButSetFunc(bt, restrictbutton_gr_restrict_select, scene, gr);
restrict_bool= group_restrict_flag(gr, OB_RESTRICT_RENDER);
- bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_RENDER_ON : ICON_RESTRICT_RENDER_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (int)te->ys, 17, OL_H-1, 0, 0, 0, 0, 0, "Restrict/Allow renderability");
+ bt = uiDefIconBut(block, BUT, 0, restrict_bool ? ICON_RESTRICT_RENDER_ON : ICON_RESTRICT_RENDER_OFF, (int)ar->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, (int)te->ys, 17, OL_H-1, NULL, 0, 0, 0, 0, "Restrict/Allow renderability");
uiButSetFunc(bt, restrictbutton_gr_restrict_render, scene, gr);
uiBlockSetEmboss(block, UI_EMBOSS);
@@ -5368,13 +5375,13 @@ static void outliner_draw_rnabuts(uiBlock *block, Scene *scene, ARegion *ar, Spa
prop= te->directdata;
if(!(RNA_property_type(prop) == PROP_POINTER && (tselem->flag & TSE_CLOSED)==0))
- uiDefAutoButR(block, ptr, prop, -1, "", ICON_NULL, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
+ uiDefAutoButR(block, ptr, prop, -1, "", ICON_NONE, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
}
else if(tselem->type == TSE_RNA_ARRAY_ELEM) {
ptr= &te->rnaptr;
prop= te->directdata;
- uiDefAutoButR(block, ptr, prop, te->index, "", ICON_NULL, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
+ uiDefAutoButR(block, ptr, prop, te->index, "", ICON_NONE, sizex, (int)te->ys, OL_RNA_COL_SIZEX, OL_H-1);
}
}
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 5f9165a6a31..cbb26d79c4b 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_outliner/outliner_intern.h
+ * \ingroup spoutliner
+ */
+
+
#ifndef ED_OUTLINER_INTERN_H
#define ED_OUTLINER_INTERN_H
diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c
index da1b831aefc..8bd30235931 100644
--- a/source/blender/editors/space_outliner/outliner_ops.c
+++ b/source/blender/editors/space_outliner/outliner_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_outliner/outliner_ops.c
+ * \ingroup spoutliner
+ */
+
+
#include <stdlib.h>
#include "DNA_space_types.h"
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index a4900eb919b..13b186b174b 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_outliner/space_outliner.c
+ * \ingroup spoutliner
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_script/CMakeLists.txt b/source/blender/editors/space_script/CMakeLists.txt
index 165a43568e4..974dc66e22c 100644
--- a/source/blender/editors/space_script/CMakeLists.txt
+++ b/source/blender/editors/space_script/CMakeLists.txt
@@ -28,6 +28,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_script/script_edit.c b/source/blender/editors/space_script/script_edit.c
index aff9774b2a9..02cbc81aaa5 100644
--- a/source/blender/editors/space_script/script_edit.c
+++ b/source/blender/editors/space_script/script_edit.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_script/script_edit.c
+ * \ingroup spscript
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_script/script_header.c b/source/blender/editors/space_script/script_header.c
index 278b07408cb..57a1d36e3a2 100644
--- a/source/blender/editors/space_script/script_header.c
+++ b/source/blender/editors/space_script/script_header.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_script/script_header.c
+ * \ingroup spscript
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_script/script_intern.h b/source/blender/editors/space_script/script_intern.h
index 28d80b76705..c818a4e1f9b 100644
--- a/source/blender/editors/space_script/script_intern.h
+++ b/source/blender/editors/space_script/script_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_script/script_intern.h
+ * \ingroup spscript
+ */
+
#ifndef ED_SCRIPT_INTERN_H
#define ED_SCRIPT_INTERN_H
diff --git a/source/blender/editors/space_script/script_ops.c b/source/blender/editors/space_script/script_ops.c
index c0b4979e80e..215c66b2519 100644
--- a/source/blender/editors/space_script/script_ops.c
+++ b/source/blender/editors/space_script/script_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_script/script_ops.c
+ * \ingroup spscript
+ */
+
+
#include <stdlib.h>
#include <math.h>
diff --git a/source/blender/editors/space_script/space_script.c b/source/blender/editors/space_script/space_script.c
index 64e0307aec9..b81394a87e2 100644
--- a/source/blender/editors/space_script/space_script.c
+++ b/source/blender/editors/space_script/space_script.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_script/space_script.c
+ * \ingroup spscript
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_sequencer/CMakeLists.txt b/source/blender/editors/space_sequencer/CMakeLists.txt
index d162ac2f4fc..9dc0b7a4258 100644
--- a/source/blender/editors/space_sequencer/CMakeLists.txt
+++ b/source/blender/editors/space_sequencer/CMakeLists.txt
@@ -30,6 +30,7 @@ set(INC
../../windowmanager
../../../../intern/guardedalloc
../../../../intern/audaspace/intern
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index 9e5f6a1d065..2ef8fb12965 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_sequencer/sequencer_add.c
+ * \ingroup spseq
+ */
+
+
#include <stdlib.h>
#include <math.h>
#include <string.h>
diff --git a/source/blender/editors/space_sequencer/sequencer_buttons.c b/source/blender/editors/space_sequencer/sequencer_buttons.c
index 956dfda1764..01a43fd7fe1 100644
--- a/source/blender/editors/space_sequencer/sequencer_buttons.c
+++ b/source/blender/editors/space_sequencer/sequencer_buttons.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_sequencer/sequencer_buttons.c
+ * \ingroup spseq
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index b344077a69a..2f95e8fa64c 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_sequencer/sequencer_draw.c
+ * \ingroup spseq
+ */
+
+
#include <string.h>
#include <math.h>
@@ -298,20 +303,20 @@ static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short dire
/* set up co-ordinates/dimensions for either left or right handle */
if (direction == SEQ_LEFTHANDLE) {
rx1 = x1;
- rx2 = x1+handsize*0.75;
+ rx2 = x1+handsize * 0.75f;
- v1[0]= x1+handsize/4; v1[1]= y1+( ((y1+y2)/2.0 - y1)/2);
- v2[0]= x1+handsize/4; v2[1]= y2-( ((y1+y2)/2.0 - y1)/2);
- v3[0]= v2[0] + handsize/4; v3[1]= (y1+y2)/2.0;
+ v1[0]= x1+handsize/4; v1[1]= y1+( ((y1+y2)/2.0f - y1)/2);
+ v2[0]= x1+handsize/4; v2[1]= y2-( ((y1+y2)/2.0f - y1)/2);
+ v3[0]= v2[0] + handsize/4; v3[1]= (y1+y2)/2.0f;
whichsel = SEQ_LEFTSEL;
} else if (direction == SEQ_RIGHTHANDLE) {
- rx1 = x2-handsize*0.75;
+ rx1 = x2-handsize*0.75f;
rx2 = x2;
- v1[0]= x2-handsize/4; v1[1]= y1+( ((y1+y2)/2.0 - y1)/2);
- v2[0]= x2-handsize/4; v2[1]= y2-( ((y1+y2)/2.0 - y1)/2);
- v3[0]= v2[0] - handsize/4; v3[1]= (y1+y2)/2.0;
+ v1[0]= x2-handsize/4; v1[1]= y1+( ((y1+y2)/2.0f - y1)/2);
+ v2[0]= x2-handsize/4; v2[1]= y2-( ((y1+y2)/2.0f - y1)/2);
+ v3[0]= v2[0] - handsize/4; v3[1]= (y1+y2)/2.0f;
whichsel = SEQ_RIGHTSEL;
}
@@ -346,11 +351,11 @@ static void draw_seq_handle(View2D *v2d, Sequence *seq, float pixelx, short dire
if (direction == SEQ_LEFTHANDLE) {
sprintf(str, "%d", seq->startdisp);
x1= rx1;
- y1 -= 0.45;
+ y1 -= 0.45f;
} else {
sprintf(str, "%d", seq->enddisp - 1);
- x1= x2 - handsize*0.75;
- y1= y2 + 0.05;
+ x1= x2 - handsize*0.75f;
+ y1= y2 + 0.05f;
}
UI_view2d_text_cache_add(v2d, x1, y1, str, col);
}
@@ -436,7 +441,7 @@ static void draw_seq_extensions(Scene *scene, ARegion *ar, Sequence *seq)
glColor3ubv((GLubyte *)col);
- for(a=y1; a< y2; a+= pixely*2.0 ) {
+ for(a=y1; a< y2; a+= pixely * 2.0f) {
fdrawline(x1, a, (float)(seq->start), a);
}
}
@@ -454,7 +459,7 @@ static void draw_seq_extensions(Scene *scene, ARegion *ar, Sequence *seq)
glColor3ubv((GLubyte *)col);
- for(a=y1; a< y2; a+= pixely*2.0 ) {
+ for(a=y1; a< y2; a+= pixely * 2.0f) {
fdrawline((float)(seq->start+seq->len), a, x2, a);
}
}
@@ -536,8 +541,8 @@ static void draw_shadedstrip(Sequence *seq, unsigned char col[3], float x1, floa
glPolygonStipple(stipple_halftone);
}
- ymid1 = (y2-y1)*0.25 + y1;
- ymid2 = (y2-y1)*0.65 + y1;
+ ymid1 = (y2-y1)*0.25f + y1;
+ ymid2 = (y2-y1)*0.65f + y1;
glShadeModel(GL_SMOOTH);
glBegin(GL_QUADS);
@@ -714,8 +719,8 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
if (sseq->mainb == SEQ_DRAW_IMG_IMBUF) {
viewrectx *= scene->r.xasp / scene->r.yasp;
- viewrectx /= proxy_size / 100.0;
- viewrecty /= proxy_size / 100.0;
+ viewrectx /= proxy_size / 100.0f;
+ viewrecty /= proxy_size / 100.0f;
}
if(frame_ofs == 0) {
@@ -830,10 +835,10 @@ void draw_image_seq(const bContext* C, Scene *scene, ARegion *ar, SpaceSeq *sseq
UI_ThemeColorBlendShade(TH_WIRE, TH_BACK, 1.0, 0);
glBegin(GL_LINE_LOOP);
- glVertex2f(x1-0.5, y1-0.5);
- glVertex2f(x1-0.5, y2+0.5);
- glVertex2f(x2+0.5, y2+0.5);
- glVertex2f(x2+0.5, y1-0.5);
+ glVertex2f(x1-0.5f, y1-0.5f);
+ glVertex2f(x1-0.5f, y2+0.5f);
+ glVertex2f(x2+0.5f, y2+0.5f);
+ glVertex2f(x2+0.5f, y1-0.5f);
glEnd();
/* safety border */
@@ -963,7 +968,7 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *ar)
else if (seq == last_seq) continue;
else if (MIN2(seq->startdisp, seq->start) > v2d->cur.xmax) continue;
else if (MAX2(seq->enddisp, seq->start+seq->len) < v2d->cur.xmin) continue;
- else if (seq->machine+1.0 < v2d->cur.ymin) continue;
+ else if (seq->machine+1.0f < v2d->cur.ymin) continue;
else if (seq->machine > v2d->cur.ymax) continue;
/* strip passed all tests unscathed... so draw it now */
@@ -1017,9 +1022,9 @@ void draw_timeline_seq(const bContext *C, ARegion *ar)
/* clear and setup matrix */
UI_GetThemeColor3fv(TH_BACK, col);
if (ed && ed->metastack.first)
- glClearColor(col[0], col[1], col[2]-0.1, 0.0);
+ glClearColor(col[0], col[1], col[2]-0.1f, 0.0f);
else
- glClearColor(col[0], col[1], col[2], 0.0);
+ glClearColor(col[0], col[1], col[2], 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
UI_view2d_view_ortho(v2d);
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index b0547ff9994..115d1ad7bae 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_sequencer/sequencer_edit.c
+ * \ingroup spseq
+ */
+
+
#include <stdlib.h>
#include <math.h>
#include <string.h>
@@ -57,6 +62,7 @@
#include "WM_types.h"
#include "RNA_define.h"
+#include "RNA_enum_types.h"
/* for menu/popup icons etc etc*/
@@ -171,7 +177,7 @@ void boundbox_seq(Scene *scene, rctf *rect)
if( min[0] > seq->startdisp-1) min[0]= seq->startdisp-1;
if( max[0] < seq->enddisp+1) max[0]= seq->enddisp+1;
- if( max[1] < seq->machine+2.0) max[1]= seq->machine+2.0;
+ if( max[1] < seq->machine+2) max[1]= seq->machine+2;
seq= seq->next;
}
@@ -331,7 +337,7 @@ Sequence *find_nearest_seq(Scene *scene, View2D *v2d, int *hand, short mval[2])
}
seq= seq->next;
}
- return 0;
+ return NULL;
}
@@ -455,12 +461,12 @@ static void reload_image_strip(Scene *scene, char *UNUSED(name))
- if(last_seq==0 || last_seq->type!=SEQ_IMAGE) return;
+ if(last_seq==NULL || last_seq->type!=SEQ_IMAGE) return;
seqact= last_seq; /* last_seq changes in alloc_sequence */
/* search sfile */
// sfile= scrarea_find_space_of_type(curarea, SPACE_FILE);
- if(sfile==0) return;
+ if(sfile == NULL) return;
waitcursor(1);
@@ -473,7 +479,7 @@ static void reload_image_strip(Scene *scene, char *UNUSED(name))
seqact->len= seq->len;
calc_sequence(scene, seqact);
- seq->strip= 0;
+ seq->strip= NULL;
seq_free_sequence(scene, seq);
BLI_remlink(ed->seqbasep, seq);
@@ -491,7 +497,7 @@ static void change_sequence(Scene *scene)
Scene *sce;
short event;
- if(last_seq==0) return;
+ if(last_seq == NULL) return;
if(last_seq->type & SEQ_EFFECT) {
event = pupmenu("Change Effect%t"
@@ -584,7 +590,7 @@ static void change_sequence(Scene *scene)
int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequence **selseq1, Sequence **selseq2, Sequence **selseq3, const char **error_str)
{
Editing *ed = seq_give_editing(scene, FALSE);
- Sequence *seq1= 0, *seq2= 0, *seq3= 0, *seq;
+ Sequence *seq1= NULL, *seq2= NULL, *seq3= NULL, *seq;
*error_str= NULL;
@@ -598,9 +604,9 @@ int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequen
return 0;
}
if((seq != activeseq) && (seq != seq2)) {
- if(seq2==0) seq2= seq;
- else if(seq1==0) seq1= seq;
- else if(seq3==0) seq3= seq;
+ if(seq2 == NULL) seq2= seq;
+ else if(seq1 == NULL) seq1= seq;
+ else if(seq3 == NULL) seq3= seq;
else {
*error_str= "Can't apply effect to more than 3 sequence strips";
return 0;
@@ -611,7 +617,7 @@ int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequen
/* make sequence selection a little bit more intuitive
for 3 strips: the last-strip should be sequence3 */
- if (seq3 != 0 && seq2 != 0) {
+ if (seq3 != NULL && seq2 != NULL) {
Sequence *tmp = seq2;
seq2 = seq3;
seq3 = tmp;
@@ -620,21 +626,21 @@ int seq_effect_find_selected(Scene *scene, Sequence *activeseq, int type, Sequen
switch(get_sequence_effect_num_inputs(type)) {
case 0:
- *selseq1 = *selseq2 = *selseq3 = 0;
+ *selseq1 = *selseq2 = *selseq3 = NULL;
return 1; /* succsess */
case 1:
- if(seq2==0) {
+ if(seq2==NULL) {
*error_str= "Need at least one selected sequence strip";
return 0;
}
- if(seq1==0) seq1= seq2;
- if(seq3==0) seq3= seq2;
+ if(seq1==NULL) seq1= seq2;
+ if(seq3==NULL) seq3= seq2;
case 2:
- if(seq1==0 || seq2==0) {
+ if(seq1==NULL || seq2==NULL) {
*error_str= "Need 2 selected sequence strips";
return 0;
}
- if(seq3==0) seq3= seq2;
+ if(seq3 == NULL) seq3= seq2;
}
if (seq1==NULL && seq2==NULL && seq3==NULL) {
@@ -716,7 +722,7 @@ static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short de
static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe)
{
TransSeq ts;
- Sequence *seqn = 0;
+ Sequence *seqn = NULL;
int skip_dup = FALSE;
/* backup values */
@@ -810,7 +816,7 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence * seq, int cutframe)
static Sequence *cut_seq_soft(Scene *scene, Sequence * seq, int cutframe)
{
TransSeq ts;
- Sequence *seqn = 0;
+ Sequence *seqn = NULL;
int skip_dup = FALSE;
/* backup values */
@@ -1651,7 +1657,7 @@ static int sequencer_add_duplicate_invoke(bContext *C, wmOperator *op, wmEvent *
{
sequencer_add_duplicate_exec(C, op);
- RNA_int_set(op->ptr, "mode", TFM_TRANSLATION);
+ RNA_enum_set(op->ptr, "mode", TFM_TRANSLATION);
WM_operator_name_call(C, "TRANSFORM_OT_transform", WM_OP_INVOKE_REGION_WIN, op->ptr);
return OPERATOR_FINISHED;
@@ -1673,7 +1679,7 @@ void SEQUENCER_OT_duplicate(wmOperatorType *ot)
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* to give to transform */
- RNA_def_int(ot->srna, "mode", TFM_TRANSLATION, 0, INT_MAX, "Mode", "", 0, INT_MAX);
+ RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
}
/* delete operator */
@@ -2007,8 +2013,8 @@ static int sequencer_meta_separate_exec(bContext *C, wmOperator *UNUSED(op))
BLI_movelisttolist(ed->seqbasep, &last_seq->seqbase);
- last_seq->seqbase.first= 0;
- last_seq->seqbase.last= 0;
+ last_seq->seqbase.first= NULL;
+ last_seq->seqbase.last= NULL;
BLI_remlink(ed->seqbasep, last_seq);
seq_free_sequence(scene, last_seq);
@@ -2608,6 +2614,8 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op)
Editing *ed= seq_give_editing(scene, FALSE);
Sequence *seq;
+ ListBase nseqbase= {NULL, NULL};
+
seq_free_clipboard();
if(seqbase_isolated_sel_check(ed->seqbasep)==FALSE) {
@@ -2615,7 +2623,28 @@ static int sequencer_copy_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- seqbase_dupli_recursive(scene, NULL, &seqbase_clipboard, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME);
+ seqbase_dupli_recursive(scene, NULL, &nseqbase, ed->seqbasep, SEQ_DUPE_UNIQUE_NAME);
+
+ /* To make sure the copied strips have unique names between each other add
+ * them temporarily to the end of the original seqbase. (bug 25932)
+ */
+ if(nseqbase.first) {
+ Sequence *seq, *first_seq = nseqbase.first;
+ BLI_movelisttolist(ed->seqbasep, &nseqbase);
+
+ for(seq=first_seq; seq; seq=seq->next)
+ seq_recursive_apply(seq, apply_unique_name_cb, scene);
+
+ seqbase_clipboard.first = first_seq;
+ seqbase_clipboard.last = ed->seqbasep->last;
+
+ if(first_seq->prev) {
+ first_seq->prev->next = NULL;
+ ed->seqbasep->last = first_seq->prev;
+ first_seq->prev = NULL;
+ }
+ }
+
seqbase_clipboard_frame= scene->r.cfra;
/* Need to remove anything that references the current scene */
@@ -2643,21 +2672,6 @@ void SEQUENCER_OT_copy(wmOperatorType *ot)
/* properties */
}
-static void seq_offset(Scene *scene, Sequence *seq, int ofs)
-{
- if(seq->type == SEQ_META) {
- Sequence *iseq;
- for(iseq= seq->seqbase.first; iseq; iseq= iseq->next) {
- seq_offset(scene, iseq, ofs);
- }
- }
- else {
- seq->start += ofs;
- }
-
- calc_sequence_disp(scene, seq);
-}
-
static int sequencer_paste_exec(bContext *C, wmOperator *UNUSED(op))
{
Scene *scene= CTX_data_scene(C);
@@ -2674,12 +2688,19 @@ static int sequencer_paste_exec(bContext *C, wmOperator *UNUSED(op))
/* transform pasted strips before adding */
if(ofs) {
for(iseq= nseqbase.first; iseq; iseq= iseq->next) {
- seq_offset(scene, iseq, ofs);
+ seq_translate(scene, iseq, ofs);
+ seq_sound_init(scene, iseq);
}
}
+ iseq = nseqbase.first;
+
BLI_movelisttolist(ed->seqbasep, &nseqbase);
+ /* make sure the pasted strips have unique names between them */
+ for(; iseq; iseq=iseq->next)
+ seq_recursive_apply(iseq, apply_unique_name_cb, scene);
+
WM_event_add_notifier(C, NC_SCENE|ND_SEQUENCER, scene);
return OPERATOR_FINISHED;
@@ -2774,10 +2795,10 @@ static int view_ghost_border_exec(bContext *C, wmOperator *op)
rect.xmax /= (float)(ABS(v2d->tot.xmax - v2d->tot.xmin));
rect.ymax /= (float)(ABS(v2d->tot.ymax - v2d->tot.ymin));
- rect.xmin+=0.5;
- rect.xmax+=0.5;
- rect.ymin+=0.5;
- rect.ymax+=0.5;
+ rect.xmin+=0.5f;
+ rect.xmax+=0.5f;
+ rect.ymin+=0.5f;
+ rect.ymax+=0.5f;
CLAMP(rect.xmin, 0.0f, 1.0f);
CLAMP(rect.ymin, 0.0f, 1.0f);
diff --git a/source/blender/editors/space_sequencer/sequencer_intern.h b/source/blender/editors/space_sequencer/sequencer_intern.h
index e0266e88bc9..f29919476cc 100644
--- a/source/blender/editors/space_sequencer/sequencer_intern.h
+++ b/source/blender/editors/space_sequencer/sequencer_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_sequencer/sequencer_intern.h
+ * \ingroup spseq
+ */
+
#ifndef ED_SEQUENCER_INTERN_H
#define ED_SEQUENCER_INTERN_H
diff --git a/source/blender/editors/space_sequencer/sequencer_ops.c b/source/blender/editors/space_sequencer/sequencer_ops.c
index 62c478f916f..f5c26cb17d3 100644
--- a/source/blender/editors/space_sequencer/sequencer_ops.c
+++ b/source/blender/editors/space_sequencer/sequencer_ops.c
@@ -1,5 +1,5 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_sequencer/sequencer_ops.c
+ * \ingroup spseq
+ */
+
+
#include <stdlib.h>
#include <math.h>
@@ -119,12 +124,7 @@ void sequencer_keymap(wmKeyConfig *keyconf)
/* operators for sequence */
keymap= WM_keymap_find(keyconf, "Sequencer", SPACE_SEQ, 0);
-
- WM_keymap_add_item(keymap, "MARKER_OT_add", MKEY, KM_PRESS, KM_CTRL | KM_ALT, 0);
- WM_keymap_add_item(keymap, "MARKER_OT_move", GKEY, KM_PRESS, KM_CTRL, 0);
- WM_keymap_add_item(keymap, "MARKER_OT_duplicate", DKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0);
- WM_keymap_add_item(keymap, "MARKER_OT_delete", XKEY, KM_PRESS, KM_SHIFT, 0);
-
+
WM_keymap_add_item(keymap, "SEQUENCER_OT_properties", NKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_select_all_toggle", AKEY, KM_PRESS, 0, 0);
@@ -157,8 +157,8 @@ void sequencer_keymap(wmKeyConfig *keyconf)
WM_keymap_add_item(keymap, "SEQUENCER_OT_meta_toggle", TABKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_meta_make", MKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "SEQUENCER_OT_meta_separate", MKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "SEQUENCER_OT_meta_make", GKEY, KM_PRESS, KM_SHIFT, 0);
+ WM_keymap_add_item(keymap, "SEQUENCER_OT_meta_separate", GKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_view_all", HOMEKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "SEQUENCER_OT_view_selected", PADPERIOD, KM_PRESS, 0, 0);
@@ -180,7 +180,7 @@ void sequencer_keymap(wmKeyConfig *keyconf)
int i;
for (i = 1; i <= 10; i++) {
- RNA_enum_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut_multicam", keys[i-1], KM_PRESS, 0, 0)->ptr, "camera", i);
+ RNA_int_set(WM_keymap_add_item(keymap, "SEQUENCER_OT_cut_multicam", keys[i-1], KM_PRESS, 0, 0)->ptr, "camera", i);
}
}
diff --git a/source/blender/editors/space_sequencer/sequencer_scopes.c b/source/blender/editors/space_sequencer/sequencer_scopes.c
index 87ad27403da..b617d012237 100644
--- a/source/blender/editors/space_sequencer/sequencer_scopes.c
+++ b/source/blender/editors/space_sequencer/sequencer_scopes.c
@@ -23,6 +23,11 @@
*
*/
+/** \file blender/editors/space_sequencer/sequencer_scopes.c
+ * \ingroup spseq
+ */
+
+
#include <math.h>
#include <string.h>
@@ -37,16 +42,16 @@
static void rgb_to_yuv(float rgb[3], float yuv[3])
{
- yuv[0]= 0.299*rgb[0] + 0.587*rgb[1] + 0.114*rgb[2];
- yuv[1]= 0.492*(rgb[2] - yuv[0]);
- yuv[2]= 0.877*(rgb[0] - yuv[0]);
+ yuv[0]= 0.299f*rgb[0] + 0.587f*rgb[1] + 0.114f*rgb[2];
+ yuv[1]= 0.492f*(rgb[2] - yuv[0]);
+ yuv[2]= 0.877f*(rgb[0] - yuv[0]);
/* Normalize */
- yuv[1]*= 255.0/(122*2.0);
- yuv[1]+= 0.5;
+ yuv[1]*= 255.0f/(122*2.0f);
+ yuv[1]+= 0.5f;
- yuv[2]*= 255.0/(157*2.0);
- yuv[2]+= 0.5;
+ yuv[2]*= 255.0f/(157*2.0f);
+ yuv[2]+= 0.5f;
}
static void scope_put_pixel(unsigned char* table, unsigned char * pos)
@@ -127,7 +132,7 @@ static void wform_put_gridrow(unsigned char * tgt, float perc, int w, int h)
{
int i;
- tgt += (int) (perc/100.0 * h) * w * 4;
+ tgt += (int) (perc/100.0f * h) * w * 4;
for (i = 0; i < w*2; i++) {
tgt[0] = 255;
@@ -162,7 +167,7 @@ static struct ImBuf *make_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
}
for (y = 0; y < ibuf->y; y++) {
- unsigned char * last_p = 0;
+ unsigned char * last_p = NULL;
for (x = 0; x < ibuf->x; x++) {
unsigned char * rgb = src + 4 * (ibuf->x * y + x);
@@ -177,7 +182,7 @@ static struct ImBuf *make_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
p += 4 * w;
scope_put_pixel(wtable, p);
- if (last_p != 0) {
+ if (last_p != NULL) {
wform_put_line(w, last_p, p);
}
last_p = p;
@@ -208,17 +213,17 @@ static struct ImBuf *make_waveform_view_from_ibuf_float(struct ImBuf * ibuf)
}
for (y = 0; y < ibuf->y; y++) {
- unsigned char * last_p = 0;
+ unsigned char * last_p = NULL;
for (x = 0; x < ibuf->x; x++) {
float * rgb = src + 4 * (ibuf->x * y + x);
- float v = 1.0 *
- ( 0.299*rgb[0]
- + 0.587*rgb[1]
- + 0.114*rgb[2]);
+ float v = 1.0f *
+ ( 0.299f*rgb[0]
+ + 0.587f*rgb[1]
+ + 0.114f*rgb[2]);
unsigned char * p = tgt;
- CLAMP(v, 0.0, 1.0);
+ CLAMP(v, 0.0f, 1.0f);
p += 4 * (w * ((int) (v * (h - 3)) + 1) + x + 1);
@@ -226,7 +231,7 @@ static struct ImBuf *make_waveform_view_from_ibuf_float(struct ImBuf * ibuf)
p += 4 * w;
scope_put_pixel(wtable, p);
- if (last_p != 0) {
+ if (last_p != NULL) {
wform_put_line(w, last_p, p);
}
last_p = p;
@@ -269,7 +274,7 @@ static struct ImBuf *make_sep_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
}
for (y = 0; y < ibuf->y; y++) {
- unsigned char * last_p[3] = {0,0,0};
+ unsigned char *last_p[3] = {NULL, NULL, NULL};
for (x = 0; x < ibuf->x; x++) {
int c;
@@ -283,7 +288,7 @@ static struct ImBuf *make_sep_waveform_view_from_ibuf_byte(struct ImBuf * ibuf)
p += 4 * w;
scope_put_pixel_single(wtable, p, c);
- if (last_p[c] != 0) {
+ if (last_p[c] != NULL) {
wform_put_line_single(
w, last_p[c], p, c);
}
@@ -319,7 +324,7 @@ static struct ImBuf *make_sep_waveform_view_from_ibuf_float(
}
for (y = 0; y < ibuf->y; y++) {
- unsigned char * last_p[3] = {0, 0, 0};
+ unsigned char *last_p[3] = {NULL, NULL, NULL};
for (x = 0; x < ibuf->x; x++) {
int c;
@@ -328,7 +333,7 @@ static struct ImBuf *make_sep_waveform_view_from_ibuf_float(
unsigned char * p = tgt;
float v = rgb[c];
- CLAMP(v, 0.0, 1.0);
+ CLAMP(v, 0.0f, 1.0f);
p += 4 * (w * ((int) (v * (h - 3)) + 1)
+ c * sw + x/3 + 1);
@@ -337,7 +342,7 @@ static struct ImBuf *make_sep_waveform_view_from_ibuf_float(
p += 4 * w;
scope_put_pixel_single(wtable, p, c);
- if (last_p[c] != 0) {
+ if (last_p[c] != NULL) {
wform_put_line_single(
w, last_p[c], p, c);
}
@@ -362,7 +367,7 @@ struct ImBuf *make_sep_waveform_view_from_ibuf(struct ImBuf * ibuf)
static void draw_zebra_byte(struct ImBuf * src,struct ImBuf * ibuf, float perc)
{
- unsigned int limit = 255 * perc / 100.0;
+ unsigned int limit = 255.0f * perc / 100.0f;
unsigned char * p = (unsigned char*) src->rect;
unsigned char * o = (unsigned char*) ibuf->rect;
int x;
@@ -393,7 +398,7 @@ static void draw_zebra_byte(struct ImBuf * src,struct ImBuf * ibuf, float perc)
static void draw_zebra_float(struct ImBuf * src,struct ImBuf * ibuf,float perc)
{
- float limit = perc / 100.0;
+ float limit = perc / 100.0f;
float * p = src->rect_float;
unsigned char * o = (unsigned char*) ibuf->rect;
int x;
@@ -451,7 +456,7 @@ static void draw_histogram_marker(struct ImBuf * ibuf, int x)
static void draw_histogram_bar(struct ImBuf * ibuf, int x,float val, int col)
{
unsigned char * p = (unsigned char*) ibuf->rect;
- int barh = ibuf->y * val * 0.9;
+ int barh = ibuf->y * val * 0.9f;
int i;
p += 4 * (x + ibuf->x);
@@ -466,7 +471,8 @@ static struct ImBuf *make_histogram_view_from_ibuf_byte(
struct ImBuf * ibuf)
{
struct ImBuf * rval = IMB_allocImBuf(515, 128, 32, IB_rect);
- int n,c,x,y;
+ int c,x,y;
+ unsigned int n;
unsigned char* src = (unsigned char*) ibuf->rect;
unsigned int bins[3][256];
@@ -507,13 +513,13 @@ static struct ImBuf *make_histogram_view_from_ibuf_byte(
static int get_bin_float(float f)
{
- if (f < -0.25) {
- f = -0.25;
- } else if (f > 1.25) {
- f = 1.25;
+ if (f < -0.25f) {
+ f = -0.25f;
+ } else if (f > 1.25f) {
+ f = 1.25f;
}
- return (int) (((f + 0.25) / 1.5) * 512);
+ return (int) (((f + 0.25f) / 1.5f) * 512);
}
static struct ImBuf *make_histogram_view_from_ibuf_float(
@@ -576,9 +582,9 @@ static void vectorscope_put_cross(unsigned char r, unsigned char g,
int x = 0;
int y = 0;
- rgb[0]= (float)r/255.0;
- rgb[1]= (float)g/255.0;
- rgb[2]= (float)b/255.0;
+ rgb[0]= (float)r/255.0f;
+ rgb[1]= (float)g/255.0f;
+ rgb[2]= (float)b/255.0f;
rgb_to_yuv(rgb, yuv);
p = tgt + 4 * (w * (int) ((yuv[2] * (h - 3) + 1))
@@ -627,9 +633,9 @@ static struct ImBuf *make_vectorscope_view_from_ibuf_byte(struct ImBuf * ibuf)
char * src1 = src + 4 * (ibuf->x * y + x);
char * p;
- rgb[0]= (float)src1[0]/255.0;
- rgb[1]= (float)src1[1]/255.0;
- rgb[2]= (float)src1[2]/255.0;
+ rgb[0]= (float)src1[0]/255.0f;
+ rgb[1]= (float)src1[1]/255.0f;
+ rgb[2]= (float)src1[2]/255.0f;
rgb_to_yuv(rgb, yuv);
p = tgt + 4 * (w * (int) ((yuv[2] * (h - 3) + 1))
@@ -676,9 +682,9 @@ static struct ImBuf *make_vectorscope_view_from_ibuf_float(struct ImBuf * ibuf)
memcpy(rgb, src1, 3 * sizeof(float));
- CLAMP(rgb[0], 0.0, 1.0);
- CLAMP(rgb[1], 0.0, 1.0);
- CLAMP(rgb[2], 0.0, 1.0);
+ CLAMP(rgb[0], 0.0f, 1.0f);
+ CLAMP(rgb[1], 0.0f, 1.0f);
+ CLAMP(rgb[2], 0.0f, 1.0f);
rgb_to_yuv(rgb, yuv);
diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c
index 7a6f5f0890b..b2d6ab6f8ca 100644
--- a/source/blender/editors/space_sequencer/sequencer_select.c
+++ b/source/blender/editors/space_sequencer/sequencer_select.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_sequencer/sequencer_select.c
+ * \ingroup spseq
+ */
+
+
#include <stdlib.h>
#include <math.h>
#include <string.h>
diff --git a/source/blender/editors/space_sequencer/space_sequencer.c b/source/blender/editors/space_sequencer/space_sequencer.c
index 4816de46511..32bd9ce604c 100644
--- a/source/blender/editors/space_sequencer/space_sequencer.c
+++ b/source/blender/editors/space_sequencer/space_sequencer.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_sequencer/space_sequencer.c
+ * \ingroup spseq
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_sound/CMakeLists.txt b/source/blender/editors/space_sound/CMakeLists.txt
index d0054836381..9e70d1dbda3 100644
--- a/source/blender/editors/space_sound/CMakeLists.txt
+++ b/source/blender/editors/space_sound/CMakeLists.txt
@@ -28,6 +28,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_sound/sound_header.c b/source/blender/editors/space_sound/sound_header.c
index a78990d74ff..60707e18187 100644
--- a/source/blender/editors/space_sound/sound_header.c
+++ b/source/blender/editors/space_sound/sound_header.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_sound/sound_header.c
+ * \ingroup spsnd
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_sound/sound_intern.h b/source/blender/editors/space_sound/sound_intern.h
index 485876e20db..05a67fac03c 100644
--- a/source/blender/editors/space_sound/sound_intern.h
+++ b/source/blender/editors/space_sound/sound_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_sound/sound_intern.h
+ * \ingroup spsnd
+ */
+
#ifndef ED_SOUND_INTERN_H
#define ED_SOUND_INTERN_H
diff --git a/source/blender/editors/space_sound/space_sound.c b/source/blender/editors/space_sound/space_sound.c
index 8218ce09ad8..1879469d288 100644
--- a/source/blender/editors/space_sound/space_sound.c
+++ b/source/blender/editors/space_sound/space_sound.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_sound/space_sound.c
+ * \ingroup spsnd
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_text/CMakeLists.txt b/source/blender/editors/space_text/CMakeLists.txt
index 21481dc6543..6241d397417 100644
--- a/source/blender/editors/space_text/CMakeLists.txt
+++ b/source/blender/editors/space_text/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index 93240d3f318..550f2c937fd 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_text/space_text.c
+ * \ingroup sptext
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -338,6 +343,7 @@ static void text_keymap(struct wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DELKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_NEXT_CHAR);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_CHAR);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, 0, 0)->ptr, "type", DEL_PREV_CHAR);
+ RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "type", DEL_PREV_CHAR); /* same as above [#26623] */
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", DELKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_NEXT_WORD);
RNA_enum_set(WM_keymap_add_item(keymap, "TEXT_OT_delete", BACKSPACEKEY, KM_PRESS, KM_CTRL, 0)->ptr, "type", DEL_PREV_WORD);
diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c
index c047d99c894..2601d1ffdf3 100644
--- a/source/blender/editors/space_text/text_draw.c
+++ b/source/blender/editors/space_text/text_draw.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_text/text_draw.c
+ * \ingroup sptext
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
@@ -1103,7 +1108,7 @@ static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll, rcti *back)
CLAMP(st->txtbar.ymax, pix_bottom_margin, ar->winy - pix_top_margin);
st->pix_per_line= (pix_available > 0)? (float) ltexth/pix_available: 0;
- if(st->pix_per_line<.1) st->pix_per_line=.1f;
+ if(st->pix_per_line < 0.1f) st->pix_per_line=0.1f;
curl_off= text_get_span_wrap(st, ar, st->text->lines.first, st->text->curl);
sell_off= text_get_span_wrap(st, ar, st->text->lines.first, st->text->sell);
@@ -1758,7 +1763,7 @@ void draw_text_main(SpaceText *st, ARegion *ar)
else
UI_ThemeColor(TH_TEXT);
- sprintf(linenr, "%d", i + linecount + 1);
+ sprintf(linenr, "%*d", st->linenrs_tot, i + linecount + 1);
/* itoa(i + linecount + 1, linenr, 10); */ /* not ansi-c :/ */
text_font_draw(st, TXT_OFFSET - 7, y, linenr);
diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c
index 8e209365c0c..bfc600c774a 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_text/text_header.c
+ * \ingroup sptext
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
@@ -134,23 +139,23 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
if(text) {
- pup= uiPupMenuBegin(C, "Text", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Text", ICON_NONE);
if(txt_has_sel(text)) {
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_cut");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_copy");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_cut");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_copy");
}
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_paste");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save_as");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_run_script");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_paste");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_open");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_save");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_save_as");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_run_script");
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "File", ICON_NULL);
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
+ pup= uiPupMenuBegin(C, "File", ICON_NONE);
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_open");
uiPupMenuEnd(C, pup);
}
}
@@ -160,10 +165,10 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
- pup= uiPupMenuBegin(C, "Edit", ICON_NULL);
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_cut");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_copy");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_paste");
+ pup= uiPupMenuBegin(C, "Edit", ICON_NONE);
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_cut");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_copy");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_paste");
uiPupMenuEnd(C, pup);
}
@@ -173,18 +178,18 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
if(text) {
- pup= uiPupMenuBegin(C, "Text", ICON_NULL);
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_save_as");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_run_script");
+ pup= uiPupMenuBegin(C, "Text", ICON_NONE);
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_open");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_save");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_save_as");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_run_script");
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "File", ICON_NULL);
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_new");
- uiItemO(layout, NULL, ICON_NULL, "TEXT_OT_open");
+ pup= uiPupMenuBegin(C, "File", ICON_NONE);
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_new");
+ uiItemO(layout, NULL, ICON_NONE, "TEXT_OT_open");
uiPupMenuEnd(C, pup);
}
}
@@ -194,7 +199,7 @@ void TEXT_OT_properties(wmOperatorType *ot)
uiPopupMenu *pup;
- pup= uiPupMenuBegin(C, "Text", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Text", ICON_NONE);
uiItemEnumO(layout, "TEXT_OT_move", "Top of File", 0, "type", FILE_TOP);
uiItemEnumO(layout, "TEXT_OT_move", "Bottom of File", 0, "type", FILE_BOTTOM);
uiItemEnumO(layout, "TEXT_OT_move", "Page Up", 0, "type", PREV_PAGE);
diff --git a/source/blender/editors/space_text/text_intern.h b/source/blender/editors/space_text/text_intern.h
index c8e973811e2..cb55f41acb5 100644
--- a/source/blender/editors/space_text/text_intern.h
+++ b/source/blender/editors/space_text/text_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_text/text_intern.h
+ * \ingroup sptext
+ */
+
#ifndef ED_TEXT_INTERN_H
#define ED_TEXT_INTERN_H
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index 10c98a06511..5325bed15fd 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_text/text_ops.c
+ * \ingroup sptext
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <ctype.h> /* ispunct */
@@ -565,35 +570,50 @@ static int run_script_poll(bContext *C)
return (CTX_data_edit_text(C) != NULL);
}
-static int run_script_exec(bContext *C, wmOperator *op)
+static int run_script(bContext *C, ReportList *reports)
{
-#ifndef WITH_PYTHON
- (void)C; /* unused */
-
- BKE_report(op->reports, RPT_ERROR, "Python disabled in this build");
-
- return OPERATOR_CANCELLED;
-#else
+#ifdef WITH_PYTHON
Text *text= CTX_data_edit_text(C);
- SpaceText *st= CTX_wm_space_text(C);
+ const short is_live= (reports == NULL);
/* only for comparison */
void *curl_prev= text->curl;
int curc_prev= text->curc;
- if (BPY_text_exec(C, text, op->reports))
+ if (BPY_text_exec(C, text, reports, !is_live)) {
+ if(is_live) {
+ /* for nice live updates */
+ WM_event_add_notifier(C, NC_WINDOW|NA_EDITED, NULL);
+ }
return OPERATOR_FINISHED;
+ }
/* Dont report error messages while live editing */
- if(!(st && st->live_edit)) {
+ if(!is_live) {
if(text->curl != curl_prev || curc_prev != text->curc) {
text_update_cursor_moved(C);
WM_event_add_notifier(C, NC_TEXT|NA_EDITED, text);
}
-
- BKE_report(op->reports, RPT_ERROR, "Python script fail, look in the console for now...");
+
+ BKE_report(reports, RPT_ERROR, "Python script fail, look in the console for now...");
}
+#else
+ (void)C;
+ (void)reports;
+#endif /* !WITH_PYTHON */
+ return OPERATOR_CANCELLED;
+}
+
+static int run_script_exec(bContext *C, wmOperator *op)
+{
+#ifndef WITH_PYTHON
+ (void)C; /* unused */
+
+ BKE_report(op->reports, RPT_ERROR, "Python disabled in this build");
+
return OPERATOR_CANCELLED;
+#else
+ return run_script(C, op->reports);
#endif
}
@@ -776,8 +796,8 @@ static int paste_exec(bContext *C, wmOperator *op)
/* run the script while editing, evil but useful */
if(CTX_wm_space_text(C)->live_edit)
- run_script_exec(C, op);
-
+ run_script(C, NULL);
+
return OPERATOR_FINISHED;
}
@@ -833,7 +853,7 @@ void TEXT_OT_copy(wmOperatorType *ot)
/******************* cut operator *********************/
-static int cut_exec(bContext *C, wmOperator *op)
+static int cut_exec(bContext *C, wmOperator *UNUSED(op))
{
Text *text= CTX_data_edit_text(C);
@@ -847,8 +867,8 @@ static int cut_exec(bContext *C, wmOperator *op)
/* run the script while editing, evil but useful */
if(CTX_wm_space_text(C)->live_edit)
- run_script_exec(C, op);
-
+ run_script(C, NULL);
+
return OPERATOR_FINISHED;
}
@@ -1983,7 +2003,7 @@ static int delete_exec(bContext *C, wmOperator *op)
/* run the script while editing, evil but useful */
if(CTX_wm_space_text(C)->live_edit)
- run_script_exec(C, op);
+ run_script(C, NULL);
return OPERATOR_FINISHED;
}
@@ -2663,8 +2683,8 @@ void TEXT_OT_cursor_set(wmOperatorType *ot)
ot->poll= text_region_edit_poll;
/* properties */
- RNA_def_boolean(ot->srna, "x", 0, "X", "X-coordinate to set cursor to.");
- RNA_def_boolean(ot->srna, "y", 0, "Y", "X-coordinate to set cursor to.");
+ RNA_def_int(ot->srna, "x", 0, INT_MIN, INT_MAX, "X", "", INT_MIN, INT_MAX);
+ RNA_def_int(ot->srna, "y", 0, INT_MIN, INT_MAX, "Y", "", INT_MIN, INT_MAX);
}
/******************* line number operator **********************/
@@ -2776,7 +2796,7 @@ static int insert_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* run the script while editing, evil but useful */
if(ret==OPERATOR_FINISHED && CTX_wm_space_text(C)->live_edit)
- run_script_exec(C, op);
+ run_script(C, NULL);
return ret;
}
@@ -3093,7 +3113,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(
case 1:
if(text->flags & TXT_ISDIRTY) {
/* modified locally and externally, ahhh. offer more possibilites. */
- pup= uiPupMenuBegin(C, "File Modified Outside and Inside Blender", ICON_NULL);
+ pup= uiPupMenuBegin(C, "File Modified Outside and Inside Blender", ICON_NONE);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, "Reload from disk (ignore local changes)", 0, "resolution", RESOLVE_RELOAD);
uiItemEnumO(layout, op->type->idname, "Save to disk (ignore outside changes)", 0, "resolution", RESOLVE_SAVE);
@@ -3101,7 +3121,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(
uiPupMenuEnd(C, pup);
}
else {
- pup= uiPupMenuBegin(C, "File Modified Outside Blender", ICON_NULL);
+ pup= uiPupMenuBegin(C, "File Modified Outside Blender", ICON_NONE);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, "Reload from disk", 0, "resolution", RESOLVE_RELOAD);
uiItemEnumO(layout, op->type->idname, "Make text internal (separate copy)", 0, "resolution", RESOLVE_MAKE_INTERNAL);
@@ -3110,7 +3130,7 @@ static int resolve_conflict_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(
}
break;
case 2:
- pup= uiPupMenuBegin(C, "File Deleted Outside Blender", ICON_NULL);
+ pup= uiPupMenuBegin(C, "File Deleted Outside Blender", ICON_NONE);
layout= uiPupMenuLayout(pup);
uiItemEnumO(layout, op->type->idname, "Make text internal", 0, "resolution", RESOLVE_MAKE_INTERNAL);
uiItemEnumO(layout, op->type->idname, "Recreate file", 0, "resolution", RESOLVE_SAVE);
diff --git a/source/blender/editors/space_text/text_python.c b/source/blender/editors/space_text/text_python.c
index b60a6a1abe4..bd8710ec120 100644
--- a/source/blender/editors/space_text/text_python.c
+++ b/source/blender/editors/space_text/text_python.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_text/text_python.c
+ * \ingroup sptext
+ */
+
+
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
diff --git a/source/blender/editors/space_time/CMakeLists.txt b/source/blender/editors/space_time/CMakeLists.txt
index c8727084548..654930fc95d 100644
--- a/source/blender/editors/space_time/CMakeLists.txt
+++ b/source/blender/editors/space_time/CMakeLists.txt
@@ -28,6 +28,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_time/space_time.c b/source/blender/editors/space_time/space_time.c
index 65902c692c4..ca9d786c4de 100644
--- a/source/blender/editors/space_time/space_time.c
+++ b/source/blender/editors/space_time/space_time.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_time/space_time.c
+ * \ingroup sptime
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -187,9 +192,9 @@ static void time_draw_cache(SpaceTime *stime, Object *ob)
glRectf((float)sta, 0.0, (float)end, 1.0);
- col[3] = 0.4;
+ col[3] = 0.4f;
if (pid->cache->flag & PTCACHE_BAKED) {
- col[0] -= 0.4; col[1] -= 0.4; col[2] -= 0.4;
+ col[0] -= 0.4f; col[1] -= 0.4f; col[2] -= 0.4f;
}
glColor4fv(col);
@@ -264,7 +269,7 @@ static ActKeyColumn *time_cfra_find_ak (ActKeyColumn *ak, float cframe)
/* helper for time_draw_keyframes() */
static void time_draw_idblock_keyframes(View2D *v2d, ID *id, short onlysel)
{
- bDopeSheet ads= {0};
+ bDopeSheet ads= {NULL};
DLRBT_Tree keys;
ActKeyColumn *ak;
diff --git a/source/blender/editors/space_time/time_intern.h b/source/blender/editors/space_time/time_intern.h
index f6faeb8ffda..03ba617de14 100644
--- a/source/blender/editors/space_time/time_intern.h
+++ b/source/blender/editors/space_time/time_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_time/time_intern.h
+ * \ingroup sptime
+ */
+
+
#ifndef ED_TIME_INTERN_H
#define ED_TIME_INTERN_H
diff --git a/source/blender/editors/space_time/time_ops.c b/source/blender/editors/space_time/time_ops.c
index 3abee9df5a0..34380fe4fd6 100644
--- a/source/blender/editors/space_time/time_ops.c
+++ b/source/blender/editors/space_time/time_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_time/time_ops.c
+ * \ingroup sptime
+ */
+
+
#include <stdlib.h>
#include <math.h>
diff --git a/source/blender/editors/space_userpref/space_userpref.c b/source/blender/editors/space_userpref/space_userpref.c
index 96881fde320..248b65e4e9c 100644
--- a/source/blender/editors/space_userpref/space_userpref.c
+++ b/source/blender/editors/space_userpref/space_userpref.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_userpref/space_userpref.c
+ * \ingroup spuserpref
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -44,6 +49,8 @@
#include "WM_api.h"
#include "WM_types.h"
+#include "UI_view2d.h"
+
#include "userpref_intern.h" // own include
/* ******************** default callbacks for userpref space ***************** */
@@ -105,6 +112,9 @@ static void userpref_main_area_init(wmWindowManager *wm, ARegion *ar)
static void userpref_main_area_draw(const bContext *C, ARegion *ar)
{
+ /* this solves "vibrating UI" bug #25422 */
+ UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_PANELS_UI, ar->winx, ar->winy);
+
ED_region_panels(C, ar, 1, NULL, -1);
}
diff --git a/source/blender/editors/space_userpref/userpref_intern.h b/source/blender/editors/space_userpref/userpref_intern.h
index ca1f231df00..66f394af0e4 100644
--- a/source/blender/editors/space_userpref/userpref_intern.h
+++ b/source/blender/editors/space_userpref/userpref_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_userpref/userpref_intern.h
+ * \ingroup spuserpref
+ */
+
#ifndef ED_USERPREF_INTERN_H
#define ED_USERPREF_INTERN_H
diff --git a/source/blender/editors/space_userpref/userpref_ops.c b/source/blender/editors/space_userpref/userpref_ops.c
index 29449202ed9..0f0cbc0ee3f 100644
--- a/source/blender/editors/space_userpref/userpref_ops.c
+++ b/source/blender/editors/space_userpref/userpref_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_userpref/userpref_ops.c
+ * \ingroup spuserpref
+ */
+
+
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/editors/space_view3d/CMakeLists.txt b/source/blender/editors/space_view3d/CMakeLists.txt
index 3e611ab406e..8c1ad00742d 100644
--- a/source/blender/editors/space_view3d/CMakeLists.txt
+++ b/source/blender/editors/space_view3d/CMakeLists.txt
@@ -34,6 +34,7 @@ set(INC
../../render/extern/include
../../../../intern/guardedalloc
../../../../intern/smoke/extern
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/space_view3d/drawanimviz.c b/source/blender/editors/space_view3d/drawanimviz.c
index 3c72547bd66..ee78fd92b79 100644
--- a/source/blender/editors/space_view3d/drawanimviz.c
+++ b/source/blender/editors/space_view3d/drawanimviz.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/drawanimviz.c
+ * \ingroup spview3d
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <math.h>
diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c
index 93a08af6903..98bf1e9877f 100644
--- a/source/blender/editors/space_view3d/drawarmature.c
+++ b/source/blender/editors/space_view3d/drawarmature.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/drawarmature.c
+ * \ingroup spview3d
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <math.h>
@@ -1510,7 +1515,7 @@ static void draw_pose_dofs(Object *ob)
/* arcs */
if (pchan->ikflag & BONE_IK_ZLIMIT) {
/* OpenGL requires rotations in degrees; so we're taking the average angle here */
- theta= 0.5f*(pchan->limitmin[2]+pchan->limitmax[2]) * (float)(180.0f/M_PI);
+ theta= RAD2DEGF(0.5f * (pchan->limitmin[2]+pchan->limitmax[2]));
glRotatef(theta, 0.0f, 0.0f, 1.0f);
glColor3ub(50, 50, 255); // blue, Z axis limit
@@ -1533,7 +1538,7 @@ static void draw_pose_dofs(Object *ob)
if (pchan->ikflag & BONE_IK_XLIMIT) {
/* OpenGL requires rotations in degrees; so we're taking the average angle here */
- theta= 0.5f*(pchan->limitmin[0] + pchan->limitmax[0]) * (float)(180.0f/M_PI);
+ theta= RAD2DEGF(0.5f * (pchan->limitmin[0] + pchan->limitmax[0]));
glRotatef(theta, 1.0f, 0.0f, 0.0f);
glColor3ub(255, 50, 50); // Red, X axis limit
@@ -1591,7 +1596,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
/* hacky... prevent outline select from drawing dashed helplines */
glGetFloatv(GL_LINE_WIDTH, &tmp);
- if (tmp > 1.1) do_dashed &= ~1;
+ if (tmp > 1.1f) do_dashed &= ~1;
if (v3d->flag & V3D_HIDE_HELPLINES) do_dashed &= ~2;
/* precalc inverse matrix for drawing screen aligned */
@@ -1889,7 +1894,7 @@ static void draw_pose_bones(Scene *scene, View3D *v3d, ARegion *ar, Base *base,
float vec[3];
unsigned char col[4];
- float col_f[3];
+ float col_f[4];
glGetFloatv(GL_CURRENT_COLOR, col_f); /* incase this is not set below */
rgb_float_to_byte(col_f, col);
col[3]= 255;
@@ -2455,12 +2460,16 @@ int draw_armature(Scene *scene, View3D *v3d, ARegion *ar, Base *base, int dt, in
/* drawing posemode selection indices or colors only in these cases */
if(!(base->flag & OB_FROMDUPLI)) {
if(G.f & G_PICKSEL) {
+#if 0 /* nifty but actually confusing to allow bone selection out of posemode */
if(OBACT && (OBACT->mode & OB_MODE_WEIGHT_PAINT)) {
if(ob==modifiers_isDeformedByArmature(OBACT))
arm->flag |= ARM_POSEMODE;
}
- else if(ob->mode & OB_MODE_POSE)
+ else
+#endif
+ if(ob->mode & OB_MODE_POSE) {
arm->flag |= ARM_POSEMODE;
+ }
}
else if(ob->mode & OB_MODE_POSE) {
if (arm->ghosttype == ARM_GHOST_RANGE) {
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index 456e1a390ff..66137520a06 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/drawmesh.c
+ * \ingroup spview3d
+ */
+
+
#include <string.h>
#include <math.h>
@@ -83,7 +88,7 @@ static void get_marked_edge_info__orFlags(EdgeHash *eh, int v0, int v1, int flag
int *flags_p;
if (!BLI_edgehash_haskey(eh, v0, v1)) {
- BLI_edgehash_insert(eh, v0, v1, 0);
+ BLI_edgehash_insert(eh, v0, v1, NULL);
}
flags_p = (int*) BLI_edgehash_lookup_p(eh, v0, v1);
@@ -325,6 +330,7 @@ static int set_draw_settings_cached(int clearcache, int textured, MTFace *texfac
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, CLAMPIS(ma->har, 0, 128));
glEnable(GL_LIGHTING);
glEnable(GL_COLOR_MATERIAL);
}
@@ -378,7 +384,7 @@ static void draw_textured_begin(Scene *scene, View3D *v3d, RegionView3D *rv3d, O
Gtexdraw.istex = istex;
Gtexdraw.color_profile = scene->r.color_mgt_flag & R_COLOR_MANAGEMENT;
memcpy(Gtexdraw.obcol, obcol, sizeof(obcol));
- set_draw_settings_cached(1, 0, 0, Gtexdraw.islit, 0, 0, 0);
+ set_draw_settings_cached(1, 0, NULL, Gtexdraw.islit, NULL, 0, 0);
glShadeModel(GL_SMOOTH);
}
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 11a1658b30d..48923cc9593 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/drawobject.c
+ * \ingroup spview3d
+ */
+
+
#include <string.h>
#include <math.h>
@@ -150,16 +155,16 @@ static void view3d_project_short_clip(ARegion *ar, float *vec, short *adr, int l
mul_m4_v4(rv3d->persmatob, vec4);
/* clipplanes in window space */
- if( vec4[3]>BL_NEAR_CLIP ) { /* is the NEAR clipping cutoff for picking */
+ if( vec4[3] > (float)BL_NEAR_CLIP ) { /* is the NEAR clipping cutoff for picking */
fx= (ar->winx/2)*(1 + vec4[0]/vec4[3]);
if( fx>0 && fx<ar->winx) {
fy= (ar->winy/2)*(1 + vec4[1]/vec4[3]);
- if(fy>0.0 && fy< (float)ar->winy) {
- adr[0]= (short)floor(fx);
- adr[1]= (short)floor(fy);
+ if(fy > 0.0f && fy < (float)ar->winy) {
+ adr[0]= (short)floorf(fx);
+ adr[1]= (short)floorf(fy);
}
}
}
@@ -178,16 +183,16 @@ static void view3d_project_short_noclip(ARegion *ar, float *vec, short *adr)
mul_m4_v4(rv3d->persmatob, vec4);
- if( vec4[3]>BL_NEAR_CLIP ) { /* is the NEAR clipping cutoff for picking */
+ if( vec4[3] > (float)BL_NEAR_CLIP ) { /* is the NEAR clipping cutoff for picking */
fx= (ar->winx/2)*(1 + vec4[0]/vec4[3]);
if( fx>-32700 && fx<32700) {
fy= (ar->winy/2)*(1 + vec4[1]/vec4[3]);
- if(fy>-32700.0 && fy<32700.0) {
- adr[0]= (short)floor(fx);
- adr[1]= (short)floor(fy);
+ if(fy > -32700.0f && fy < 32700.0f) {
+ adr[0]= (short)floorf(fx);
+ adr[1]= (short)floorf(fy);
}
}
}
@@ -322,7 +327,7 @@ static float cosval[32] ={
static void draw_xyz_wire(const float c[3], float size, int axis)
{
float v1[3]= {0.f, 0.f, 0.f}, v2[3] = {0.f, 0.f, 0.f};
- float dim = size * 0.1;
+ float dim = size * 0.1f;
float dx[3], dy[3], dz[3];
dx[0]=dim; dx[1]=0.f; dx[2]=0.f;
@@ -441,9 +446,9 @@ void drawaxes(float size, char drawtype)
/* square pyramid */
glBegin(GL_TRIANGLES);
- v2[0]= size*0.035; v2[1] = size*0.035;
- v3[0]= size*-0.035; v3[1] = size*0.035;
- v2[2]= v3[2]= size*0.75;
+ v2[0]= size * 0.035f; v2[1] = size * 0.035f;
+ v3[0]= size * -0.035f; v3[1] = size * 0.035f;
+ v2[2]= v3[2]= size * 0.75f;
for (axis=0; axis<4; axis++) {
if (axis % 2 == 1) {
@@ -489,18 +494,18 @@ void drawaxes(float size, char drawtype)
glVertex3fv(v1);
glVertex3fv(v2);
- v1[axis]= size*0.85;
- v1[arrow_axis]= -size*0.08;
+ v1[axis]= size*0.85f;
+ v1[arrow_axis]= -size*0.08f;
glVertex3fv(v1);
glVertex3fv(v2);
- v1[arrow_axis]= size*0.08;
+ v1[arrow_axis]= size*0.08f;
glVertex3fv(v1);
glVertex3fv(v2);
glEnd();
- v2[axis]+= size*0.125;
+ v2[axis]+= size*0.125f;
draw_xyz_wire(v2, size, axis);
@@ -572,6 +577,7 @@ typedef struct ViewCachedString {
short mval[2];
short xoffs;
short flag;
+ int str_len, pad;
/* str is allocated past the end */
} ViewCachedString;
@@ -593,6 +599,7 @@ void view3d_cached_text_draw_add(const float co[3], const char *str, short xoffs
vos->col.pack= *((int *)col);
vos->xoffs= xoffs;
vos->flag= flag;
+ vos->str_len= alloc_len-1;
/* allocate past the end */
memcpy(++vos, str, alloc_len);
@@ -658,10 +665,10 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa
col_pack_prev= vos->col.pack;
}
if(vos->flag & V3D_CACHE_TEXT_ASCII) {
- BLF_draw_default_ascii((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, 65535); /* XXX, use real length */
+ BLF_draw_default_ascii((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, vos->str_len);
}
else {
- BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, 65535); /* XXX, use real length */
+ BLF_draw_default((float)vos->mval[0]+vos->xoffs, (float)vos->mval[1], (depth_write)? 0.0f: 2.0f, str, vos->str_len);
}
}
}
@@ -819,7 +826,7 @@ static void spotvolume(float *lvec, float *vvec, float inp)
q[3] = 0 ;
normalize_v3(&q[1]);
- angle = saacos(plane[2])/2.0;
+ angle = saacos(plane[2])/2.0f;
co = cos(angle);
si = sqrt(1-co*co);
@@ -876,7 +883,7 @@ static void draw_spot_cone(Lamp *la, float x, float z)
for(a=0; a<33; a++) {
angle= a*M_PI*2/(33-1);
- glVertex3f(z*cos(angle), z*sin(angle), 0);
+ glVertex3f(z*cosf(angle), z*sinf(angle), 0);
}
}
@@ -996,7 +1003,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
short axis;
/* setup a 45 degree rotation matrix */
- vec_rot_to_mat3( mat,imat[2], M_PI/4.0f);
+ vec_rot_to_mat3(mat, imat[2], (float)M_PI/4.0f);
/* vectors */
mul_v3_v3fl(v1, imat[0], circrad * 1.2f);
@@ -1043,7 +1050,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
vvec[1]= x*ob->obmat[1][0] + y*ob->obmat[1][1] + z*ob->obmat[1][2];
vvec[2]= x*ob->obmat[2][0] + y*ob->obmat[2][1] + z*ob->obmat[2][2];
- y = cos( M_PI*la->spotsize/360.0 );
+ y = cosf(la->spotsize*(float)(M_PI/360.0));
spotvolume(lvec, vvec, y);
x = -la->dist;
mul_v3_fl(lvec, x);
@@ -1056,7 +1063,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
glVertex3fv(lvec);
glEnd();
- z = x*sqrt(1.0 - y*y);
+ z = x*sqrtf(1.0f - y*y);
x *= y;
/* draw the circle/square at the end of the cone */
@@ -1078,7 +1085,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
glVertex3fv(tvec);
glEnd();
}
- else circ(0.0, 0.0, fabs(z));
+ else circ(0.0, 0.0, fabsf(z));
/* draw the circle/square representing spotbl */
if(la->type==LA_SPOT) {
@@ -1086,7 +1093,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
/* hide line if it is zero size or overlaps with outer border,
previously it adjusted to always to show it but that seems
confusing because it doesn't show the actual blend size */
- if (spotblcirc != 0 && spotblcirc != fabs(z))
+ if (spotblcirc != 0 && spotblcirc != fabsf(z))
circ(0.0, 0.0, spotblcirc);
}
@@ -1160,9 +1167,9 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
} else if(la->type==LA_AREA) {
setlinestyle(3);
if(la->area_shape==LA_AREA_SQUARE)
- fdrawbox(-la->area_size*0.5, -la->area_size*0.5, la->area_size*0.5, la->area_size*0.5);
+ fdrawbox(-la->area_size*0.5f, -la->area_size*0.5f, la->area_size*0.5f, la->area_size*0.5f);
else if(la->area_shape==LA_AREA_RECT)
- fdrawbox(-la->area_size*0.5, -la->area_sizey*0.5, la->area_size*0.5, la->area_sizey*0.5);
+ fdrawbox(-la->area_size*0.5f, -la->area_sizey*0.5f, la->area_size*0.5f, la->area_sizey*0.5f);
glBegin(GL_LINE_STRIP);
glVertex3f(0.0,0.0,-circrad);
@@ -1282,7 +1289,7 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
if(is_view) {
/* fixed depth, variable size (avoids exceeding clipping range) */
- depth = -(cam->clipsta + 0.1);
+ depth = -(cam->clipsta + 0.1f);
fac = depth / (cam->lens/-16.0f * scaz);
}
else {
@@ -1337,15 +1344,15 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob
else if (i==1 && (ob == v3d->camera)) glBegin(GL_TRIANGLES);
else break;
- vec[0][0]= shx + ((-0.7 * drawsize) * scax);
- vec[0][1]= shy + ((drawsize * (caspy + 0.1)) * scay);
+ vec[0][0]= shx + ((-0.7f * drawsize) * scax);
+ vec[0][1]= shy + ((drawsize * (caspy + 0.1f)) * scay);
glVertex3fv(vec[0]); /* left */
- vec[0][0]= shx + ((0.7 * drawsize) * scax);
+ vec[0][0]= shx + ((0.7f * drawsize) * scax);
glVertex3fv(vec[0]); /* right */
vec[0][0]= shx;
- vec[0][1]= shy + ((1.1 * drawsize * (caspy + 0.7)) * scay);
+ vec[0][1]= shy + ((1.1f * drawsize * (caspy + 0.7f)) * scay);
glVertex3fv(vec[0]); /* top */
glEnd();
@@ -2102,7 +2109,7 @@ static int draw_dm_creases__setDrawOptions(void *userData, int index)
if (!crease)
return 0;
- if (!BM_TestHFlag(eed, BM_HIDDEN) && *crease!=0.0) {
+ if (!BM_TestHFlag(eed, BM_HIDDEN) && *crease!=0.0f) {
UI_ThemeColorBlend(TH_WIRE, TH_EDGE_CREASE, *crease);
return 1;
} else {
@@ -2125,7 +2132,7 @@ static int draw_dm_bweights__setDrawOptions(void *userData, int index)
if (!bweight)
return 0;
- if (!BM_TestHFlag(eed, BM_HIDDEN) && *bweight!=0.0) {
+ if (!BM_TestHFlag(eed, BM_HIDDEN) && *bweight!=0.0f) {
UI_ThemeColorBlend(TH_WIRE, TH_EDGE_SELECT, *bweight);
return 1;
} else {
@@ -2141,7 +2148,7 @@ static void draw_dm_bweights__mapFunc(void *userData, int index, float *co, floa
if (!bweight)
return;
- if (!BM_TestHFlag(eve, BM_HIDDEN) && *bweight!=0.0) {
+ if (!BM_TestHFlag(eve, BM_HIDDEN) && *bweight!=0.0f) {
UI_ThemeColorBlend(TH_VERTEX, TH_VERTEX_SELECT, *bweight);
bglVertex3fv(co);
}
@@ -2200,8 +2207,8 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit,
continue;
}
- size = (size>2.1?size/2.0:size);
- fsize = (fsize>2.1?fsize/2.0:fsize);
+ size = (size > 2.1f ? size/2.0f:size);
+ fsize = (fsize > 2.1f ? fsize/2.0f:fsize);
col[3] = fcol[3] = 100;
} else {
col[3] = fcol[3] = 255;
@@ -2301,7 +2308,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d,
float fvec[3];
char val[32]; /* Stores the measurement display text here */
const char *conv_float; /* Use a float conversion matching the grid size */
- unsigned char col[3]; /* color of the text to draw */
+ unsigned char col[4]= {0, 0, 0, 255}; /* color of the text to draw */
float area; /* area of the face */
float grid= unit->system ? unit->scale_length : v3d->grid;
const int do_split= unit->flag & USER_UNIT_OPT_SPLIT;
@@ -2340,7 +2347,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d,
bUnit_AsString(val, sizeof(val), len_v3v3(v1, v2)*unit->scale_length, 3, unit->system, B_UNIT_LENGTH, do_split, FALSE);
else
sprintf(val, conv_float, len_v3v3(v1, v2));
-
+
view3d_cached_text_draw_add(vmid, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
}
@@ -2409,29 +2416,29 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d,
if( (e4->f & e1->f & SELECT) || (do_moving && (efa->v1->f & SELECT)) ) {
/* Vec 1 */
- sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v4, v1, v2)));
+ sprintf(val,"%.3g", RAD2DEGF(angle_v3v3v3(v4, v1, v2)));
interp_v3_v3v3(fvec, efa->cent, efa->v1->co, 0.8f);
view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
if( (e1->f & e2->f & SELECT) || (do_moving && (efa->v2->f & SELECT)) ) {
/* Vec 2 */
- sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v1, v2, v3)));
+ sprintf(val,"%.3g", RAD2DEGF(angle_v3v3v3(v1, v2, v3)));
interp_v3_v3v3(fvec, efa->cent, efa->v2->co, 0.8f);
view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
if( (e2->f & e3->f & SELECT) || (do_moving && (efa->v3->f & SELECT)) ) {
/* Vec 3 */
if(efa->v4)
- sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v2, v3, v4)));
+ sprintf(val,"%.3g", RAD2DEGF(angle_v3v3v3(v2, v3, v4)));
else
- sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v2, v3, v1)));
+ sprintf(val,"%.3g", RAD2DEGF(angle_v3v3v3(v2, v3, v1)));
interp_v3_v3v3(fvec, efa->cent, efa->v3->co, 0.8f);
view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
/* Vec 4 */
if(efa->v4) {
if( (e3->f & e4->f & SELECT) || (do_moving && (efa->v4->f & SELECT)) ) {
- sprintf(val,"%.3g", RAD2DEG(angle_v3v3v3(v3, v4, v1)));
+ sprintf(val,"%.3g", RAD2DEGF(angle_v3v3v3(v3, v4, v1)));
interp_v3_v3v3(fvec, efa->cent, efa->v4->co, 0.8f);
view3d_cached_text_draw_add(fvec, val, 0, V3D_CACHE_TEXT_ASCII, col);
}
@@ -2649,7 +2656,7 @@ static void draw_mesh_object_outline(View3D *v3d, Object *ob, DerivedMesh *dm)
{
if(v3d->transp==0) { // not when we draw the transparent pass
- glLineWidth(2.0);
+ glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f);
glDepthMask(0);
/* if transparent, we cannot draw the edges for solid select... edges have no material info.
@@ -3332,12 +3339,12 @@ static int drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, B
static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int dt)
{
Object *ob= base->object;
- ListBase *lb=0;
+ ListBase *lb=NULL;
DispList *dl;
Curve *cu;
- int solid, retval= 0;
-
- solid= (dt > OB_WIRE);
+ const short render_only= (v3d->flag2 & V3D_RENDER_OVERRIDE);
+ const short solid= (dt > OB_WIRE);
+ int retval= 0;
if (drawCurveDerivedMesh(scene, v3d, rv3d, base, dt) == 0) {
return 0;
@@ -3354,13 +3361,15 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
dl= lb->first;
if(dl==NULL) return 1;
- if(dl->nors==0) addnormalsDispList(lb);
+ if(dl->nors==NULL) addnormalsDispList(lb);
index3_nors_incr= 0;
if( displist_has_faces(lb)==0) {
- draw_index_wire= 0;
- drawDispListwire(lb);
- draw_index_wire= 1;
+ if(!render_only) {
+ draw_index_wire= 0;
+ drawDispListwire(lb);
+ draw_index_wire= 1;
+ }
}
else {
if(draw_glsl_material(scene, ob, v3d, dt)) {
@@ -3369,7 +3378,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
GPU_end_object_materials();
}
else if(dt == OB_SHADED) {
- if(ob->disp.first==0) shadeDispList(scene, base);
+ if(ob->disp.first==NULL) shadeDispList(scene, base);
drawDispListshaded(lb, ob);
}
else {
@@ -3378,7 +3387,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
drawDispListsolid(lb, ob, 0);
GPU_end_object_materials();
}
- if(cu->editnurb && cu->bevobj==NULL && cu->taperobj==NULL && cu->ext1 == 0.0 && cu->ext2 == 0.0) {
+ if(cu->editnurb && cu->bevobj==NULL && cu->taperobj==NULL && cu->ext1 == 0.0f && cu->ext2 == 0.0f) {
cpack(0);
draw_index_wire= 0;
drawDispListwire(lb);
@@ -3388,9 +3397,11 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
index3_nors_incr= 1;
}
else {
- draw_index_wire= 0;
- retval= drawDispListwire(lb);
- draw_index_wire= 1;
+ if(!render_only || (render_only && displist_has_faces(lb))) {
+ draw_index_wire= 0;
+ retval= drawDispListwire(lb);
+ draw_index_wire= 1;
+ }
}
break;
case OB_SURF:
@@ -3439,7 +3450,7 @@ static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *bas
}
else if(dt == OB_SHADED) {
dl= lb->first;
- if(dl && dl->col1==0) shadeDispList(scene, base);
+ if(dl && dl->col1==NULL) shadeDispList(scene, base);
drawDispListshaded(lb, ob);
}
else {
@@ -3652,14 +3663,14 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
ParticleEditSettings *pset = PE_settings(scene);
ParticleSettings *part;
ParticleData *pars, *pa;
- ParticleKey state, *states=0;
+ ParticleKey state, *states=NULL;
ParticleBillboardData bb;
- ParticleSimulationData sim= {0};
+ ParticleSimulationData sim= {NULL};
ParticleDrawData *pdd = psys->pdd;
Material *ma;
float vel[3], imat[4][4];
float timestep, pixsize=1.0, pa_size, r_tilt, r_length;
- float pa_time, pa_birthtime, pa_dietime, pa_health;
+ float pa_time, pa_birthtime, pa_dietime, pa_health, intensity;
float cfra;
float ma_r=0.0f, ma_g=0.0f, ma_b=0.0f;
int a, totpart, totpoint=0, totve=0, drawn, draw_as, totchild=0;
@@ -3669,16 +3680,16 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
unsigned char tcol[4]= {0, 0, 0, 255};
/* 1. */
- if(psys==0)
+ if(psys==NULL)
return;
part=psys->part;
pars=psys->particles;
- if(part==0 || !psys_check_enabled(ob, psys))
+ if(part==NULL || !psys_check_enabled(ob, psys))
return;
- if(pars==0) return;
+ if(pars==NULL) return;
/* don't draw normal paths in edit mode */
if(psys_in_edit_mode(scene, psys) && (pset->flag & PE_DRAW_PART)==0)
@@ -3723,7 +3734,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(v3d->zbuf) glDepthMask(1);
- if((ma) && (part->draw&PART_DRAW_MAT_COL)) {
+ if((ma) && (part->draw_col == PART_DRAW_COL_MAT)) {
rgb_float_to_byte(&(ma->r), tcol);
ma_r = ma->r;
@@ -3746,7 +3757,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
totpart=psys->totpart;
- cfra=bsystem_time(scene, 0, (float)CFRA, 0.0f);
+ cfra= bsystem_time(scene, NULL, (float)CFRA, 0.0f);
if(draw_as==PART_DRAW_PATH && psys->pathcache==NULL && psys->childcache==NULL)
draw_as=PART_DRAW_DOT;
@@ -3771,7 +3782,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
pixsize= view3d_pixel_size(rv3d, ob->obmat[3]);
if(part->draw_size==0.0)
- pixsize*=2.0;
+ pixsize *= 2.0f;
else
pixsize*=part->draw_size;
@@ -3779,19 +3790,19 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
create_cdata = 1;
break;
case PART_DRAW_OB:
- if(part->dup_ob==0)
+ if(part->dup_ob==NULL)
draw_as=PART_DRAW_DOT;
else
draw_as=0;
break;
case PART_DRAW_GR:
- if(part->dup_group==0)
+ if(part->dup_group==NULL)
draw_as=PART_DRAW_DOT;
else
draw_as=0;
break;
case PART_DRAW_BB:
- if(v3d->camera==0 && part->bb_ob==0){
+ if(v3d->camera==NULL && part->bb_ob==NULL){
printf("Billboards need an active camera or a target object!\n");
draw_as=part->draw_as=PART_DRAW_DOT;
@@ -3824,6 +3835,10 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
normalize_v3(imat[1]);
}
+ if(ELEM3(draw_as, PART_DRAW_DOT, PART_DRAW_CROSS, PART_DRAW_LINE)
+ && part->draw_col > PART_DRAW_COL_MAT)
+ create_cdata = 1;
+
if(!create_cdata && pdd && pdd->cdata) {
MEM_freeN(pdd->cdata);
pdd->cdata = pdd->cd = NULL;
@@ -3866,7 +3881,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(create_cdata && !pdd->cdata)
pdd->cdata = MEM_callocN(tot_vec_size, "particle_cdata");
if(create_ndata && !pdd->ndata)
- pdd->ndata = MEM_callocN(tot_vec_size, "particle_vdata");
+ pdd->ndata = MEM_callocN(tot_vec_size, "particle_ndata");
if(part->draw & PART_DRAW_VEL && draw_as != PART_DRAW_LINE) {
if(!pdd->vedata)
@@ -3921,66 +3936,27 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
else
pa_health = -1.0;
-#if 0 // XXX old animation system
- if((part->flag&PART_ABS_TIME)==0){
- if(ma && ma->ipo){
- IpoCurve *icu;
-
- /* correction for lifetime */
- calc_ipo(ma->ipo, 100.0f*pa_time);
-
- for(icu = ma->ipo->curve.first; icu; icu=icu->next) {
- if(icu->adrcode == MA_COL_R)
- ma_r = icu->curval;
- else if(icu->adrcode == MA_COL_G)
- ma_g = icu->curval;
- else if(icu->adrcode == MA_COL_B)
- ma_b = icu->curval;
- }
- }
- if(part->ipo) {
- IpoCurve *icu;
-
- /* correction for lifetime */
- calc_ipo(part->ipo, 100*pa_time);
+ r_tilt = 2.0f*(PSYS_FRAND(a + 21) - 0.5f);
+ r_length = PSYS_FRAND(a + 22);
- for(icu = part->ipo->curve.first; icu; icu=icu->next) {
- if(icu->adrcode == PART_SIZE)
- pa_size = icu->curval;
- }
+ if(part->draw_col > PART_DRAW_COL_MAT) {
+ switch(part->draw_col) {
+ case PART_DRAW_COL_VEL:
+ intensity = len_v3(pa->state.vel)/part->color_vec_max;
+ break;
+ case PART_DRAW_COL_ACC:
+ intensity = len_v3v3(pa->state.vel, pa->prev_state.vel)/((pa->state.time-pa->prev_state.time)*part->color_vec_max);
+ break;
}
+ CLAMP(intensity, 0.f, 1.f);
+ weight_to_rgb(intensity, &ma_r, &ma_g, &ma_b);
}
-#endif // XXX old animation system
-
- r_tilt = 2.0f*(PSYS_FRAND(a + 21) - 0.5f);
- r_length = PSYS_FRAND(a + 22);
}
else{
ChildParticle *cpa= &psys->child[a-totpart];
pa_time=psys_get_child_time(psys,cpa,cfra,&pa_birthtime,&pa_dietime);
-
-#if 0 // XXX old animation system
- if((part->flag&PART_ABS_TIME)==0) {
- if(ma && ma->ipo){
- IpoCurve *icu;
-
- /* correction for lifetime */
- calc_ipo(ma->ipo, 100.0f*pa_time);
-
- for(icu = ma->ipo->curve.first; icu; icu=icu->next) {
- if(icu->adrcode == MA_COL_R)
- ma_r = icu->curval;
- else if(icu->adrcode == MA_COL_G)
- ma_g = icu->curval;
- else if(icu->adrcode == MA_COL_B)
- ma_b = icu->curval;
- }
- }
- }
-#endif // XXX old animation system
-
- pa_size=psys_get_child_size(psys,cpa,cfra,0);
+ pa_size=psys_get_child_size(psys,cpa,cfra,NULL);
pa_health = -1.0;
@@ -3990,8 +3966,8 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
drawn = 0;
if(part->draw_as == PART_DRAW_REND && part->trail_count > 1) {
- float length = part->path_end * (1.0 - part->randlength * r_length);
- int trail_count = part->trail_count * (1.0 - part->randlength * r_length);
+ float length = part->path_end * (1.0f - part->randlength * r_length);
+ int trail_count = part->trail_count * (1.0f - part->randlength * r_length);
float ct = ((part->draw & PART_ABS_PATH_TIME) ? cfra : pa_time) - length;
float dt = length / (trail_count ? (float)trail_count : 1.0f);
int i=0;
@@ -4099,13 +4075,13 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(draw_as==PART_DRAW_PATH){
ParticleCacheKey **cache, *path;
- float *cd2=0,*cdata2=0;
+ float *cd2=NULL,*cdata2=NULL;
/* setup gl flags */
if (1) { //ob_dt > OB_WIRE) {
glEnableClientState(GL_NORMAL_ARRAY);
- if(part->draw&PART_DRAW_MAT_COL)
+ if(part->draw_col == PART_DRAW_COL_MAT)
glEnableClientState(GL_COLOR_ARRAY);
glEnable(GL_LIGHTING);
@@ -4134,7 +4110,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(1) { //ob_dt > OB_WIRE) {
glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel);
- if(part->draw&PART_DRAW_MAT_COL)
+ if(part->draw_col == PART_DRAW_COL_MAT)
glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col);
}
@@ -4150,7 +4126,7 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
if(1) { //ob_dt > OB_WIRE) {
glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel);
- if(part->draw&PART_DRAW_MAT_COL)
+ if(part->draw_col == PART_DRAW_COL_MAT)
glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->col);
}
@@ -4160,14 +4136,14 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv
/* restore & clean up */
if(1) { //ob_dt > OB_WIRE) {
- if(part->draw&PART_DRAW_MAT_COL)
+ if(part->draw_col == PART_DRAW_COL_MAT)
glDisable(GL_COLOR_ARRAY);
glDisable(GL_COLOR_MATERIAL);
}
if(cdata2)
MEM_freeN(cdata2);
- cd2=cdata2=0;
+ cd2=cdata2=NULL;
glLineWidth(1.0f);
@@ -4287,7 +4263,7 @@ static void draw_update_ptcache_edit(Scene *scene, Object *ob, PTCacheEdit *edit
PE_update_object(scene, ob, 0);
/* create path and child path cache if it doesn't exist already */
- if(edit->pathcache==0)
+ if(edit->pathcache == NULL)
psys_cache_edit_paths(scene, ob, edit, CFRA);
}
@@ -4303,7 +4279,7 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit)
float nosel_col[3];
float *pathcol = NULL, *pcol;
- if(edit->pathcache==0)
+ if(edit->pathcache == NULL)
return;
PE_hide_keys_time(scene, edit, CFRA);
@@ -4343,7 +4319,7 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit)
if(timed) {
for(k=0, pcol=pathcol, pkey=path; k<steps; k++, pkey++, pcol+=4){
copy_v3_v3(pcol, pkey->col);
- pcol[3] = 1.0f - fabs((float)CFRA - pkey->time)/(float)pset->fade_frames;
+ pcol[3] = 1.0f - fabsf((float)(CFRA) - pkey->time)/(float)pset->fade_frames;
}
glColorPointer(4, GL_FLOAT, 4*sizeof(float), pathcol);
@@ -4362,8 +4338,8 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit)
glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE));
if(pset->selectmode==SCE_SELECT_POINT){
- float *pd=0,*pdata=0;
- float *cd=0,*cdata=0;
+ float *pd=NULL,*pdata=NULL;
+ float *cd=NULL,*cdata=NULL;
int totkeys = 0;
for (i=0, point=edit->points; i<totpoint; i++, point++)
@@ -4392,7 +4368,7 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit)
}
if(timed)
- *(cd+3) = 1.0f - fabs((float)CFRA - *key->time)/(float)pset->fade_frames;
+ *(cd+3) = 1.0f - fabsf((float)CFRA - *key->time)/(float)pset->fade_frames;
cd += (timed?4:3);
}
@@ -4415,8 +4391,8 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit)
pd += pd ? 3 * point->totkey : 0;
cd += (timed?4:3) * point->totkey;
}
- if(pdata) { MEM_freeN(pdata); pd=pdata=0; }
- if(cdata) { MEM_freeN(cdata); cd=cdata=0; }
+ if(pdata) { MEM_freeN(pdata); pd=pdata=NULL; }
+ if(cdata) { MEM_freeN(cdata); cd=cdata=NULL; }
}
else if(pset->selectmode == SCE_SELECT_END){
for(i=0, point=edit->points; i<totpoint; i++, point++){
@@ -4986,7 +4962,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
/* direction vectors for 3d curve paths
when at its lowest, dont render normals */
- if(cu->flag & CU_3D && ts->normalsize > 0.0015 && (cu->drawflag & CU_HIDE_NORMALS)==0) {
+ if(cu->flag & CU_3D && ts->normalsize > 0.0015f && (cu->drawflag & CU_HIDE_NORMALS)==0) {
UI_ThemeColor(TH_WIRE);
for (bl=cu->bev.first,nu=nurb; nu && bl; bl=bl->next,nu=nu->next) {
@@ -5083,7 +5059,7 @@ static void draw_empty_cone (float size)
radius = size;
glTranslatef(cent,cent, cent);
- glScalef(radius, 2.0*size, radius);
+ glScalef(radius, size * 2.0f, radius);
glRotatef(-90., 1.0, 0.0, 0.0);
gluCylinder(qobj, 1.0, 0.0, 1.0, 8, 1);
@@ -5312,7 +5288,7 @@ static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
ml->selcol2= code;
glLoadName(code++);
}
- drawcircball(GL_LINE_LOOP, &(ml->x), ml->rad*atan(ml->s)/M_PI_2, imat);
+ drawcircball(GL_LINE_LOOP, &(ml->x), ml->rad*atanf(ml->s)/(float)M_PI_2, imat);
}
ml= ml->next;
@@ -5354,15 +5330,15 @@ static void draw_forcefield(Scene *scene, Object *ob, RegionView3D *rv3d)
// force_val = IPO_GetFloatValue(ob->ipo, OB_PD_FSTR, scene->r.cfra);
//else
force_val = pd->f_strength;
- force_val*= 0.1;
+ force_val *= 0.1f;
drawcircball(GL_LINE_LOOP, vec, size, tmat);
- vec[2]= 0.5*force_val;
+ vec[2]= 0.5f * force_val;
drawcircball(GL_LINE_LOOP, vec, size, tmat);
- vec[2]= 1.0*force_val;
+ vec[2]= 1.0f * force_val;
drawcircball(GL_LINE_LOOP, vec, size, tmat);
- vec[2]= 1.5*force_val;
+ vec[2]= 1.5f * force_val;
drawcircball(GL_LINE_LOOP, vec, size, tmat);
- vec[2] = 0; /* reset vec for max dist circle */
+ vec[2] = 0.0f; /* reset vec for max dist circle */
}
else if (pd->forcefield == PFIELD_FORCE) {
@@ -5375,33 +5351,33 @@ static void draw_forcefield(Scene *scene, Object *ob, RegionView3D *rv3d)
UI_ThemeColorBlend(curcol, TH_BACK, 0.5);
drawcircball(GL_LINE_LOOP, vec, size, imat);
- UI_ThemeColorBlend(curcol, TH_BACK, 0.9 - 0.4 / pow(1.5, (double)ffall_val));
- drawcircball(GL_LINE_LOOP, vec, size*1.5, imat);
- UI_ThemeColorBlend(curcol, TH_BACK, 0.9 - 0.4 / pow(2.0, (double)ffall_val));
- drawcircball(GL_LINE_LOOP, vec, size*2.0, imat);
+ UI_ThemeColorBlend(curcol, TH_BACK, 0.9f - 0.4f / powf(1.5f, ffall_val));
+ drawcircball(GL_LINE_LOOP, vec, size * 1.5f, imat);
+ UI_ThemeColorBlend(curcol, TH_BACK, 0.9f - 0.4f / powf(2.0f, ffall_val));
+ drawcircball(GL_LINE_LOOP, vec, size*2.0f, imat);
}
else if (pd->forcefield == PFIELD_VORTEX) {
- float ffall_val, force_val;
+ float /*ffall_val,*/ force_val;
unit_m4(tmat);
//if (has_ipo_code(ob->ipo, OB_PD_FFALL))
// ffall_val = IPO_GetFloatValue(ob->ipo, OB_PD_FFALL, scene->r.cfra);
//else
- ffall_val = pd->f_power;
+ // ffall_val = pd->f_power;
//if (has_ipo_code(ob->ipo, OB_PD_FSTR))
// force_val = IPO_GetFloatValue(ob->ipo, OB_PD_FSTR, scene->r.cfra);
//else
force_val = pd->f_strength;
- UI_ThemeColorBlend(curcol, TH_BACK, 0.7);
+ UI_ThemeColorBlend(curcol, TH_BACK, 0.7f);
if (force_val < 0) {
- drawspiral(vec, size*1.0, tmat, 1);
- drawspiral(vec, size*1.0, tmat, 16);
+ drawspiral(vec, size, tmat, 1);
+ drawspiral(vec, size, tmat, 16);
}
else {
- drawspiral(vec, size*1.0, tmat, -1);
- drawspiral(vec, size*1.0, tmat, -16);
+ drawspiral(vec, size, tmat, -1);
+ drawspiral(vec, size, tmat, -16);
}
}
else if (pd->forcefield == PFIELD_GUIDE && ob->type==OB_CURVE) {
@@ -5473,9 +5449,9 @@ static void draw_forcefield(Scene *scene, Object *ob, RegionView3D *rv3d)
distance=(pd->flag&PFIELD_USEMAX)?pd->maxdist:0.0f;
if(pd->flag & (PFIELD_USEMAX|PFIELD_USEMAXR)){
- drawcone(vec,distance*sin(radius),distance*cos(radius),tmat);
+ drawcone(vec, distance * sinf(radius),distance * cosf(radius), tmat);
if((pd->flag & PFIELD_POSZ)==0)
- drawcone(vec,distance*sin(radius),-distance*cos(radius),tmat);
+ drawcone(vec, distance * sinf(radius),-distance * cosf(radius),tmat);
}
radius=(pd->flag&PFIELD_USEMINR)?pd->minrad:1.0f;
@@ -5483,9 +5459,9 @@ static void draw_forcefield(Scene *scene, Object *ob, RegionView3D *rv3d)
distance=(pd->flag&PFIELD_USEMIN)?pd->mindist:0.0f;
if(pd->flag & (PFIELD_USEMIN|PFIELD_USEMINR)){
- drawcone(vec,distance*sin(radius),distance*cos(radius),tmat);
+ drawcone(vec,distance*sinf(radius),distance*cosf(radius),tmat);
if((pd->flag & PFIELD_POSZ)==0)
- drawcone(vec,distance*sin(radius),-distance*cos(radius),tmat);
+ drawcone(vec, distance * sinf(radius), -distance * cosf(radius), tmat);
}
}
setlinestyle(0);
@@ -5535,13 +5511,13 @@ static void draw_bb_quadric(BoundBox *bb, short type)
gluQuadricDrawStyle(qobj, GLU_SILHOUETTE);
- size[0]= 0.5*fabs(bb->vec[0][0] - bb->vec[4][0]);
- size[1]= 0.5*fabs(bb->vec[0][1] - bb->vec[2][1]);
- size[2]= 0.5*fabs(bb->vec[0][2] - bb->vec[1][2]);
+ size[0]= 0.5f*fabsf(bb->vec[0][0] - bb->vec[4][0]);
+ size[1]= 0.5f*fabsf(bb->vec[0][1] - bb->vec[2][1]);
+ size[2]= 0.5f*fabsf(bb->vec[0][2] - bb->vec[1][2]);
- cent[0]= (bb->vec[0][0] + bb->vec[4][0])/2.0;
- cent[1]= (bb->vec[0][1] + bb->vec[2][1])/2.0;
- cent[2]= (bb->vec[0][2] + bb->vec[1][2])/2.0;
+ cent[0]= 0.5f*(bb->vec[0][0] + bb->vec[4][0]);
+ cent[1]= 0.5f*(bb->vec[0][1] + bb->vec[2][1]);
+ cent[2]= 0.5f*(bb->vec[0][2] + bb->vec[1][2]);
glPushMatrix();
if(type==OB_BOUND_SPHERE) {
@@ -5552,13 +5528,13 @@ static void draw_bb_quadric(BoundBox *bb, short type)
else if(type==OB_BOUND_CYLINDER) {
float radius = size[0] > size[1] ? size[0] : size[1];
glTranslatef(cent[0], cent[1], cent[2]-size[2]);
- glScalef(radius, radius, 2.0*size[2]);
+ glScalef(radius, radius, 2.0f * size[2]);
gluCylinder(qobj, 1.0, 1.0, 1.0, 8, 1);
}
else if(type==OB_BOUND_CONE) {
float radius = size[0] > size[1] ? size[0] : size[1];
glTranslatef(cent[0], cent[2]-size[2], cent[1]);
- glScalef(radius, 2.0*size[2], radius);
+ glScalef(radius, 2.0f * size[2], radius);
glRotatef(-90., 1.0, 0.0, 0.0);
gluCylinder(qobj, 1.0, 0.0, 1.0, 8, 1);
}
@@ -6067,7 +6043,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
drawDispList(scene, v3d, rv3d, base, dt);
}
- if (cu->linewidth != 0.0) {
+ if (cu->linewidth != 0.0f) {
cpack(0xff44ff);
UI_ThemeColor(TH_WIRE);
copy_v3_v3(vec1, ob->orig);
@@ -6086,7 +6062,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
setlinestyle(3);
for (i=0; i<cu->totbox; i++) {
- if (cu->tb[i].w != 0.0) {
+ if (cu->tb[i].w != 0.0f) {
if (i == (cu->actbox-1))
UI_ThemeColor(TH_ACTIVE);
else
@@ -6214,7 +6190,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag)
if(ob->soft /*&& flag & OB_SBMOTION*/){
float mrt[3][3],msc[3][3],mtr[3][3];
- SoftBody *sb = 0;
+ SoftBody *sb= NULL;
float tipw = 0.5f, tiph = 0.5f,drawsize = 4.0f;
if ((sb= ob->soft)){
if(sb->solverflags & SBSO_ESTIMATEIPO){
diff --git a/source/blender/editors/space_view3d/drawvolume.c b/source/blender/editors/space_view3d/drawvolume.c
index a2eefa2aad1..acdbcb0d06d 100644
--- a/source/blender/editors/space_view3d/drawvolume.c
+++ b/source/blender/editors/space_view3d/drawvolume.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/drawvolume.c
+ * \ingroup spview3d
+ */
+
+
#include <string.h>
#include <math.h>
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index dd3b5f42b89..3d29d9d0fda 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/space_view3d.c
+ * \ingroup spview3d
+ */
+
+
#include <string.h>
#include <stdio.h>
@@ -209,7 +214,7 @@ static SpaceLink *view3d_new(const bContext *C)
v3d->lens= 35.0f;
v3d->near= 0.01f;
- v3d->far= 500.0f;
+ v3d->far= 1000.0f;
v3d->twflag |= U.tw_flag & V3D_USE_MANIPULATOR;
v3d->twtype= V3D_MANIP_TRANSLATE;
@@ -526,7 +531,6 @@ static void *view3d_main_area_duplicate(void *poin)
new->clipbb= MEM_dupallocN(rv3d->clipbb);
new->depths= NULL;
- new->retopo_view_data= NULL;
new->ri= NULL;
new->gpd= NULL;
new->sms= NULL;
@@ -1075,7 +1079,7 @@ void ED_spacetype_view3d(void)
st->context= view3d_context;
/* regions: main window */
- art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
+ art= MEM_callocN(sizeof(ARegionType), "spacetype view3d main region");
art->regionid = RGN_TYPE_WINDOW;
art->keymapflag= ED_KEYMAP_GPENCIL;
art->draw= view3d_main_area_draw;
@@ -1084,10 +1088,11 @@ void ED_spacetype_view3d(void)
art->duplicate= view3d_main_area_duplicate;
art->listener= view3d_main_area_listener;
art->cursor= view3d_main_area_cursor;
+ art->lock= 1; /* can become flag, see BKE_spacedata_draw_locks */
BLI_addhead(&st->regiontypes, art);
/* regions: listview/buttons */
- art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
+ art= MEM_callocN(sizeof(ARegionType), "spacetype view3d buttons region");
art->regionid = RGN_TYPE_UI;
art->prefsizex= 180; // XXX
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_FRAMES;
@@ -1099,7 +1104,7 @@ void ED_spacetype_view3d(void)
view3d_buttons_register(art);
/* regions: tool(bar) */
- art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
+ art= MEM_callocN(sizeof(ARegionType), "spacetype view3d tools region");
art->regionid = RGN_TYPE_TOOLS;
art->prefsizex= 160; // XXX
art->prefsizey= 50; // XXX
@@ -1115,7 +1120,7 @@ void ED_spacetype_view3d(void)
#endif
/* regions: tool properties */
- art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
+ art= MEM_callocN(sizeof(ARegionType), "spacetype view3d tool properties region");
art->regionid = RGN_TYPE_TOOL_PROPS;
art->prefsizex= 0;
art->prefsizey= 120;
@@ -1129,7 +1134,7 @@ void ED_spacetype_view3d(void)
/* regions: header */
- art= MEM_callocN(sizeof(ARegionType), "spacetype view3d region");
+ art= MEM_callocN(sizeof(ARegionType), "spacetype view3d header region");
art->regionid = RGN_TYPE_HEADER;
art->prefsizey= HEADERY;
art->keymapflag= ED_KEYMAP_UI|ED_KEYMAP_VIEW2D|ED_KEYMAP_FRAMES|ED_KEYMAP_HEADER;
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index 7c80db76e9e..c278646698f 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/view3d_buttons.c
+ * \ingroup spview3d
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -133,7 +138,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
{
uiBlock *block= (layout)? uiLayoutAbsoluteBlock(layout): NULL;
MDeformVert *dvert=NULL;
- TransformProperties *tfp= v3d->properties_storage;
+ TransformProperties *tfp;
float median[6], ve_median[6];
int tot, totw, totweight, totedge, totradius;
char defstr[320];
@@ -142,6 +147,11 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
tot= totw= totweight= totedge= totradius= 0;
defstr[0]= 0;
+ /* make sure we got storage */
+ if(v3d->properties_storage==NULL)
+ v3d->properties_storage= MEM_callocN(sizeof(TransformProperties), "TransformProperties");
+ tfp= v3d->properties_storage;
+
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
BMEditMesh *em = me->edit_btmesh;
@@ -267,8 +277,10 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
}
}
- if(tot==0) return;
-
+ if(tot==0) {
+ uiDefBut(block, LABEL, 0, "Nothing selected",0, 130, 200, 20, NULL, 0, 0, 0, 0, "");
+ return;
+ }
median[0] /= (float)tot;
median[1] /= (float)tot;
median[2] /= (float)tot;
@@ -287,7 +299,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
uiBlockBeginAlign(block);
if(tot==1) {
- uiDefBut(block, LABEL, 0, "Vertex:", 0, 130, 200, 20, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "Vertex:", 0, 130, 200, 20, NULL, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 110, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
@@ -320,7 +332,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
}
}
else {
- uiDefBut(block, LABEL, 0, "Median:", 0, 130, 200, 20, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "Median:", 0, 130, 200, 20, NULL, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
but= uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 110, 200, 20, &(tfp->ve_median[0]), -lim, lim, 10, 3, "");
uiButSetUnitType(but, PROP_UNIT_LENGTH);
@@ -379,7 +391,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
BMVert *eve;
BMIter iter;
- if(len_v3(median) > 0.000001) {
+ if(len_v3(median) > 0.000001f) {
BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
if(BM_TestHFlag(eve, BM_SELECT)) {
@@ -392,7 +404,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
if(median[3] != 0.0f) {
BMEdge *eed;
- const float fixed_crease= (ve_median[3] <= 0.0f ? 0.0 : (ve_median[3] >= 1.0f ? 1.0 : FLT_MAX));
+ const float fixed_crease= (ve_median[3] <= 0.0f ? 0.0f : (ve_median[3] >= 1.0f ? 1.0f : FLT_MAX));
if(fixed_crease != FLT_MAX) {
/* simple case */
@@ -412,21 +424,21 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
float median_orig= ve_median[3] - median[3]; /* previous median value */
/* incase of floating point error */
- CLAMP(median_orig, 0.0, 1.0);
- CLAMP(median_new, 0.0, 1.0);
+ CLAMP(median_orig, 0.0f, 1.0f);
+ CLAMP(median_new, 0.0f, 1.0f);
if(median_new < median_orig) {
/* scale down */
const float sca= median_new / median_orig;
BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
- if(BM_TestHFlag(eed, BM_SELECT)) {
+ if(BM_TestHFlag(eed, BM_SELECT) && !BM_TestHFlag(eed, BM_HIDDEN)) {
float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
if (!crease) break;
*crease *= sca;
- CLAMP(*crease, 0.0, 1.0);
+ CLAMP(*crease, 0.0f, 1.0f);
}
}
}
@@ -435,12 +447,12 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
const float sca= (1.0f - median_new) / (1.0f - median_orig);
BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
- if(BM_TestHFlag(eed, BM_SELECT)) {
+ if(BM_TestHFlag(eed, BM_SELECT) && !BM_TestHFlag(eed, BM_HIDDEN)) {
float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
if (!crease) break;
*crease = 1.0f - ((1.0f - *crease) * sca);
- CLAMP(*crease, 0.0, 1.0);
+ CLAMP(*crease, 0.0f, 1.0f);
}
}
}
@@ -763,7 +775,7 @@ static void view3d_panel_vgroup(const bContext *C, Panel *pa)
dg = BLI_findlink (&ob->defbase, dvert->dw[i].def_nr);
if(dg) {
uiDefButF(block, NUM, B_VGRP_PNL_EDIT_SINGLE + dvert->dw[i].def_nr, dg->name, 0, yco, 180, 20, &dvert->dw[i].weight, 0.0, 1.0, 1, 3, "");
- uiDefBut(block, BUT, B_VGRP_PNL_COPY_SINGLE + dvert->dw[i].def_nr, "C", 180,yco,20,20, 0, 0, 0, 0, 0, "Copy this groups weight to other selected verts");
+ uiDefBut(block, BUT, B_VGRP_PNL_COPY_SINGLE + dvert->dw[i].def_nr, "C", 180,yco,20,20, NULL, 0, 0, 0, 0, "Copy this groups weight to other selected verts");
yco -= 20;
}
}
@@ -771,8 +783,8 @@ static void view3d_panel_vgroup(const bContext *C, Panel *pa)
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefBut(block, BUT, B_VGRP_PNL_NORMALIZE, "Normalize", 0, yco,100,20, 0, 0, 0, 0, 0, "Normalize active vertex weights");
- uiDefBut(block, BUT, B_VGRP_PNL_COPY, "Copy", 100,yco,100,20, 0, 0, 0, 0, 0, "Copy active vertex to other seleted verts");
+ uiDefBut(block, BUT, B_VGRP_PNL_NORMALIZE, "Normalize", 0, yco,100,20, NULL, 0, 0, 0, 0, "Normalize active vertex weights");
+ uiDefBut(block, BUT, B_VGRP_PNL_COPY, "Copy", 100,yco,100,20, NULL, 0, 0, 0, 0, "Copy active vertex to other seleted verts");
uiBlockEndAlign(block);
}
}
@@ -792,57 +804,57 @@ static void v3d_transform_butsR(uiLayout *layout, PointerRNA *ptr)
uiLayoutSetActive(split, !(bone->parent && bone->flag & BONE_CONNECTED));
}
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "location", 0, "Location", ICON_NULL);
+ uiItemR(colsub, ptr, "location", 0, "Location", ICON_NONE);
colsub = uiLayoutColumn(split, 1);
- uiItemL(colsub, "", ICON_NULL);
- uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemL(colsub, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_location", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
split = uiLayoutSplit(layout, 0.8, 0);
switch(RNA_enum_get(ptr, "rotation_mode")) {
case ROT_MODE_QUAT: /* quaternion */
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "rotation_quaternion", 0, "Rotation", ICON_NULL);
+ uiItemR(colsub, ptr, "rotation_quaternion", 0, "Rotation", ICON_NONE);
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", ICON_NONE);
if (RNA_boolean_get(ptr, "lock_rotations_4d"))
- uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
else
- uiItemL(colsub, "", ICON_NULL);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemL(colsub, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
break;
case ROT_MODE_AXISANGLE: /* axis angle */
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "rotation_axis_angle", 0, "Rotation", ICON_NULL);
+ uiItemR(colsub, ptr, "rotation_axis_angle", 0, "Rotation", ICON_NONE);
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_rotations_4d", UI_ITEM_R_TOGGLE, "4L", ICON_NONE);
if (RNA_boolean_get(ptr, "lock_rotations_4d"))
- uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(colsub, ptr, "lock_rotation_w", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
else
- uiItemL(colsub, "", ICON_NULL);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemL(colsub, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
break;
default: /* euler rotations */
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "rotation_euler", 0, "Rotation", ICON_NULL);
+ uiItemR(colsub, ptr, "rotation_euler", 0, "Rotation", ICON_NONE);
colsub = uiLayoutColumn(split, 1);
- uiItemL(colsub, "", ICON_NULL);
- uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemL(colsub, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_rotation", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
break;
}
- uiItemR(layout, ptr, "rotation_mode", 0, "", ICON_NULL);
+ uiItemR(layout, ptr, "rotation_mode", 0, "", ICON_NONE);
split = uiLayoutSplit(layout, 0.8, 0);
colsub = uiLayoutColumn(split, 1);
- uiItemR(colsub, ptr, "scale", 0, "Scale", ICON_NULL);
+ uiItemR(colsub, ptr, "scale", 0, "Scale", ICON_NONE);
colsub = uiLayoutColumn(split, 1);
- uiItemL(colsub, "", ICON_NULL);
- uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemL(colsub, "", ICON_NONE);
+ uiItemR(colsub, ptr, "lock_scale", UI_ITEM_R_TOGGLE+UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
if (ptr->type == &RNA_Object) {
Object *ob = ptr->data;
if (ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL))
- uiItemR(layout, ptr, "dimensions", 0, "Dimensions", ICON_NULL);
+ uiItemR(layout, ptr, "dimensions", 0, "Dimensions", ICON_NONE);
}
}
@@ -862,7 +874,7 @@ static void v3d_posearmature_buts(uiLayout *layout, Object *ob)
// row= uiLayoutRow(layout, 0);
if (!pchan) {
- uiItemL(layout, "No Bone Active", ICON_NULL);
+ uiItemL(layout, "No Bone Active", ICON_NONE);
return;
}
@@ -975,18 +987,18 @@ static void v3d_editarmature_buts(uiLayout *layout, Object *ob)
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &eboneptr, "head", 0, "Head", ICON_NULL);
+ uiItemR(col, &eboneptr, "head", 0, "Head", ICON_NONE);
if (ebone->parent && ebone->flag & BONE_CONNECTED ) {
PointerRNA parptr = RNA_pointer_get(&eboneptr, "parent");
- uiItemR(col, &parptr, "tail_radius", 0, "Radius (Parent)", ICON_NULL);
+ uiItemR(col, &parptr, "tail_radius", 0, "Radius (Parent)", ICON_NONE);
} else {
- uiItemR(col, &eboneptr, "head_radius", 0, "Radius", ICON_NULL);
+ uiItemR(col, &eboneptr, "head_radius", 0, "Radius", ICON_NONE);
}
- uiItemR(col, &eboneptr, "tail", 0, "Tail", ICON_NULL);
- uiItemR(col, &eboneptr, "tail_radius", 0, "Radius", ICON_NULL);
+ uiItemR(col, &eboneptr, "tail", 0, "Tail", ICON_NONE);
+ uiItemR(col, &eboneptr, "tail_radius", 0, "Radius", ICON_NONE);
- uiItemR(col, &eboneptr, "roll", 0, "Roll", ICON_NULL);
+ uiItemR(col, &eboneptr, "roll", 0, "Roll", ICON_NONE);
}
static void v3d_editmetaball_buts(uiLayout *layout, Object *ob)
@@ -1005,37 +1017,37 @@ static void v3d_editmetaball_buts(uiLayout *layout, Object *ob)
RNA_pointer_create(&mball->id, &RNA_MetaElement, mball->lastelem, &ptr);
col= uiLayoutColumn(layout, 0);
- uiItemR(col, &ptr, "co", 0, "Location", ICON_NULL);
+ uiItemR(col, &ptr, "co", 0, "Location", ICON_NONE);
- uiItemR(col, &ptr, "radius", 0, "Radius", ICON_NULL);
- uiItemR(col, &ptr, "stiffness", 0, "Stiffness", ICON_NULL);
+ uiItemR(col, &ptr, "radius", 0, "Radius", ICON_NONE);
+ uiItemR(col, &ptr, "stiffness", 0, "Stiffness", ICON_NONE);
- uiItemR(col, &ptr, "type", 0, "Type", ICON_NULL);
+ uiItemR(col, &ptr, "type", 0, "Type", ICON_NONE);
col= uiLayoutColumn(layout, 1);
switch (RNA_enum_get(&ptr, "type")) {
case MB_BALL:
break;
case MB_CUBE:
- uiItemL(col, "Size:", ICON_NULL);
- uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
- uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NULL);
- uiItemR(col, &ptr, "size_z", 0, "Z", ICON_NULL);
+ uiItemL(col, "Size:", ICON_NONE);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NONE);
+ uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NONE);
+ uiItemR(col, &ptr, "size_z", 0, "Z", ICON_NONE);
break;
case MB_TUBE:
- uiItemL(col, "Size:", ICON_NULL);
- uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
+ uiItemL(col, "Size:", ICON_NONE);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NONE);
break;
case MB_PLANE:
- uiItemL(col, "Size:", ICON_NULL);
- uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
- uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NULL);
+ uiItemL(col, "Size:", ICON_NONE);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NONE);
+ uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NONE);
break;
case MB_ELIPSOID:
- uiItemL(col, "Size:", ICON_NULL);
- uiItemR(col, &ptr, "size_x", 0, "X", ICON_NULL);
- uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NULL);
- uiItemR(col, &ptr, "size_z", 0, "Z", ICON_NULL);
+ uiItemL(col, "Size:", ICON_NONE);
+ uiItemR(col, &ptr, "size_x", 0, "X", ICON_NONE);
+ uiItemR(col, &ptr, "size_y", 0, "Y", ICON_NONE);
+ uiItemR(col, &ptr, "size_z", 0, "Z", ICON_NONE);
break;
}
}
@@ -1098,9 +1110,9 @@ static void do_view3d_region_buttons(bContext *C, void *UNUSED(index), int event
if (!pchan) return;
/* make a copy to eul[3], to allow TAB on buttons to work */
- eul[0]= M_PI*tfp->ob_eul[0]/180.0;
- eul[1]= M_PI*tfp->ob_eul[1]/180.0;
- eul[2]= M_PI*tfp->ob_eul[2]/180.0;
+ eul[0]= (float)M_PI*tfp->ob_eul[0]/180.0f;
+ eul[1]= (float)M_PI*tfp->ob_eul[1]/180.0f;
+ eul[2]= (float)M_PI*tfp->ob_eul[2]/180.0f;
if (pchan->rotmode == ROT_MODE_AXISANGLE) {
float quat[4];
@@ -1222,7 +1234,7 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
View3D *v3d= CTX_wm_view3d(C);
//uiBut *bt;
Object *ob= OBACT;
- TransformProperties *tfp;
+ // TransformProperties *tfp; // UNUSED
PointerRNA obptr;
uiLayout *col, *row;
float lim;
@@ -1230,12 +1242,13 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
if(ob==NULL) return;
/* make sure we got storage */
+ /*
if(v3d->properties_storage==NULL)
v3d->properties_storage= MEM_callocN(sizeof(TransformProperties), "TransformProperties");
tfp= v3d->properties_storage;
// XXX uiSetButLock(object_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
- /*
+
if(ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)) {
}
else {
@@ -1245,7 +1258,7 @@ static void view3d_panel_object(const bContext *C, Panel *pa)
}
*/
- lim= 10000.0f*MAX2(1.0, v3d->grid);
+ lim= 10000.0f * MAX2(1.0f, v3d->grid);
block= uiLayoutGetBlock(pa->layout);
uiBlockSetHandleFunc(block, do_view3d_region_buttons, NULL);
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c
index 4d591645679..1c830b7022a 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/view3d_draw.c
+ * \ingroup spview3d
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -218,7 +223,7 @@ static void drawgrid_draw(ARegion *ar, float wx, float wy, float x, float y, flo
v1[1]= 0.0f;
v2[1]= (float)ar->winy;
- v1[0] = v2[0] = x-dx*floor(x/dx);
+ v1[0] = v2[0] = x-dx*floorf(x/dx);
glBegin(GL_LINES);
@@ -231,7 +236,7 @@ static void drawgrid_draw(ARegion *ar, float wx, float wy, float x, float y, flo
v1[0]= 0.0f;
v2[0]= (float)ar->winx;
- v1[1]= v2[1]= y-dx*floor(y/dx);
+ v1[1]= v2[1]= y-dx*floorf(y/dx);
while(v1[1] < ar->winy) {
glVertex2fv(v1);
@@ -287,7 +292,6 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char **
* items are less useful when dealing with units */
void *usys;
int len, i;
- double scalar;
float dx_scalar;
float blend_fac;
@@ -296,7 +300,7 @@ static void drawgrid(UnitSettings *unit, ARegion *ar, View3D *v3d, const char **
if(usys) {
i= len;
while(i--) {
- scalar= bUnit_GetScaler(usys, i);
+ float scalar= bUnit_GetScaler(usys, i);
dx_scalar = dx * scalar / unit->scale_length;
if (dx_scalar < (GRID_MIN_PX*2))
@@ -442,7 +446,7 @@ static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
if(usys) {
int i= bUnit_GetBaseUnit(usys);
*grid_unit= bUnit_GetNameDisplay(usys, i);
- grid_scale = (grid_scale * bUnit_GetScaler(usys, i)) / scene->unit.scale_length;
+ grid_scale = (grid_scale * (float)bUnit_GetScaler(usys, i)) / scene->unit.scale_length;
}
}
@@ -595,7 +599,7 @@ static void draw_view_axis(RegionView3D *rv3d)
{
const float k = U.rvisize; /* axis size */
const float toll = 0.5; /* used to see when view is quasi-orthogonal */
- const float start = k + 1.0; /* axis center in screen coordinates, x=y */
+ const float start = k + 1.0f;/* axis center in screen coordinates, x=y */
float ydisp = 0.0; /* vertical displacement to allow obj info text */
int bright = 25*(float)U.rvibright + 5; /* axis alpha (rvibright has range 0-10) */
@@ -621,7 +625,7 @@ static void draw_view_axis(RegionView3D *rv3d)
glVertex2f(start + dx, start + dy + ydisp);
glEnd();
- if (fabs(dx) > toll || fabs(dy) > toll) {
+ if (fabsf(dx) > toll || fabsf(dy) > toll) {
BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "x", 1);
}
@@ -641,7 +645,7 @@ static void draw_view_axis(RegionView3D *rv3d)
glVertex2f(start + dx, start + dy + ydisp);
glEnd();
- if (fabs(dx) > toll || fabs(dy) > toll) {
+ if (fabsf(dx) > toll || fabsf(dy) > toll) {
BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "y", 1);
}
@@ -660,7 +664,7 @@ static void draw_view_axis(RegionView3D *rv3d)
glVertex2f(start + dx, start + dy + ydisp);
glEnd();
- if (fabs(dx) > toll || fabs(dy) > toll) {
+ if (fabsf(dx) > toll || fabsf(dy) > toll) {
BLF_draw_default(start + dx + 2, start + dy + ydisp + 2, 0.0f, "z", 1);
}
@@ -855,7 +859,7 @@ void view3d_viewborder_size_get(Scene *scene, ARegion *ar, float size_r[2])
float winmax= MAX2(ar->winx, ar->winy);
float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp);
- if(aspect>1.0) {
+ if(aspect > 1.0f) {
size_r[0]= winmax;
size_r[1]= winmax/aspect;
} else {
@@ -882,15 +886,15 @@ void view3d_calc_camera_border(Scene *scene, ARegion *ar, RegionView3D *rv3d, Vi
* with multiple keypad presses (ton)
*/
- zoomfac= (M_SQRT2 + rv3d->camzoom/50.0);
- zoomfac= (zoomfac*zoomfac)*0.25;
+ zoomfac= ((float)M_SQRT2 + rv3d->camzoom/50.0f);
+ zoomfac= (zoomfac*zoomfac) * 0.25f;
size[0]= size[0]*zoomfac;
size[1]= size[1]*zoomfac;
/* center in window */
- viewborder_r->xmin= 0.5*ar->winx - 0.5*size[0];
- viewborder_r->ymin= 0.5*ar->winy - 0.5*size[1];
+ viewborder_r->xmin= 0.5f * ar->winx - 0.5f * size[0];
+ viewborder_r->ymin= 0.5f * ar->winy - 0.5f * size[1];
viewborder_r->xmax= viewborder_r->xmin + size[0];
viewborder_r->ymax= viewborder_r->ymin + size[1];
@@ -946,21 +950,21 @@ static void drawviewborder(Scene *scene, ARegion *ar, View3D *v3d)
y2i= (int)(y2 + 1.0f);
/* passepartout, specified in camera edit buttons */
- if (ca && (ca->flag & CAM_SHOWPASSEPARTOUT) && ca->passepartalpha > 0.000001) {
- if (ca->passepartalpha == 1.0) {
+ if (ca && (ca->flag & CAM_SHOWPASSEPARTOUT) && ca->passepartalpha > 0.000001f) {
+ if (ca->passepartalpha == 1.0f) {
glColor3f(0, 0, 0);
} else {
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable(GL_BLEND);
glColor4f(0, 0, 0, ca->passepartalpha);
}
- if (x1i > 0.0)
+ if (x1i > 0.0f)
glRectf(0.0, (float)ar->winy, x1i, 0.0);
if (x2i < (float)ar->winx)
glRectf(x2i, (float)ar->winy, (float)ar->winx, 0.0);
if (y2i < (float)ar->winy)
glRectf(x1i, (float)ar->winy, x2i, y2i);
- if (y2i > 0.0)
+ if (y2i > 0.0f)
glRectf(x1i, y1i, x2i, 0.0);
glDisable(GL_BLEND);
@@ -1283,7 +1287,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
initgrabz(rv3d, 0.0, 0.0, 0.0);
window_to_3d_delta(ar, vec, 1, 0);
fac= MAX3( fabs(vec[0]), fabs(vec[1]), fabs(vec[1]) );
- fac= 1.0/fac;
+ fac= 1.0f/fac;
asp= ( (float)ibuf->y)/(float)ibuf->x;
@@ -1339,7 +1343,7 @@ static void draw_bgpic(Scene *scene, ARegion *ar, View3D *v3d)
ED_region_pixelspace(ar);
glPixelZoom(zoomx, zoomy);
- glColor4f(1.0, 1.0, 1.0, 1.0-bgpic->blend);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f-bgpic->blend);
glaDrawPixelsTex(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect);
glPixelZoom(1.0, 1.0);
@@ -1903,7 +1907,7 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
/* this needs to be done better .. */
float viewmat[4][4], winmat[4][4];
int drawtype, lay, winsize, flag2=v3d->flag2;
- ARegion ar= {0};
+ ARegion ar= {NULL};
RegionView3D rv3d= {{{0}}};
drawtype= v3d->drawtype;
@@ -1938,6 +1942,22 @@ static void gpu_update_lamps_shadows(Scene *scene, View3D *v3d)
/* *********************** customdata **************** */
+CustomDataMask ED_view3d_datamask(Scene *scene, View3D *v3d)
+{
+ CustomDataMask mask= 0;
+ if(v3d->drawtype == OB_SHADED) {
+ /* this includes normals for mesh_create_shadedColors */
+ mask |= CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_NORMAL | CD_MASK_ORCO;
+ }
+ if((v3d->drawtype == OB_TEXTURE) || ((v3d->drawtype == OB_SOLID) && (v3d->flag2 & V3D_SOLID_TEX))) {
+ mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
+
+ if(scene->gm.matmode == GAME_MAT_GLSL)
+ mask |= CD_MASK_ORCO;
+ }
+
+ return mask;
+}
/* goes over all modes and view3d settings */
CustomDataMask ED_viewedit_datamask(bScreen *screen)
{
@@ -1953,17 +1973,7 @@ CustomDataMask ED_viewedit_datamask(bScreen *screen)
/* check if we need tfaces & mcols due to view mode */
for(sa = screen->areabase.first; sa; sa = sa->next) {
if(sa->spacetype == SPACE_VIEW3D) {
- View3D *view = sa->spacedata.first;
- if(view->drawtype == OB_SHADED) {
- /* this includes normals for mesh_create_shadedColors */
- mask |= CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_NORMAL | CD_MASK_ORCO;
- }
- if((view->drawtype == OB_TEXTURE) || ((view->drawtype == OB_SOLID) && (view->flag2 & V3D_SOLID_TEX))) {
- mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
-
- if(scene->gm.matmode == GAME_MAT_GLSL)
- mask |= CD_MASK_ORCO;
- }
+ mask |= ED_view3d_datamask(scene, (View3D *)sa->spacedata.first);
}
}
@@ -2110,6 +2120,11 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
}
}
+ /* must be before xray draw which clears the depth buffer */
+ if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
+ draw_gpencil_view3d_ext(scene, v3d, ar, 1);
+ if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
+
/* transp and X-ray afterdraw stuff */
if(v3d->afterdraw_transp.first) view3d_draw_transp(scene, ar, v3d);
if(v3d->afterdraw_xray.first) view3d_draw_xray(scene, ar, v3d, 1); // clears zbuffer if it is used!
@@ -2122,8 +2137,6 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
}
/* draw grease-pencil stuff */
- draw_gpencil_view3d_ext(scene, v3d, ar, 1);
-
ED_region_pixelspace(ar);
/* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */
@@ -2145,7 +2158,7 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
}
/* utility func for ED_view3d_draw_offscreen */
-ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, int sizex, int sizey, unsigned int flag)
+ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, int sizex, int sizey, unsigned int flag, char err_out[256])
{
RegionView3D *rv3d= ar->regiondata;
ImBuf *ibuf;
@@ -2155,7 +2168,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
glPushAttrib(GL_LIGHTING_BIT);
/* bind */
- ofs= GPU_offscreen_create(&sizex, &sizey);
+ ofs= GPU_offscreen_create(&sizex, &sizey, err_out);
if(ofs == NULL)
return NULL;
@@ -2199,10 +2212,10 @@ ImBuf *ED_view3d_draw_offscreen_imbuf(Scene *scene, View3D *v3d, ARegion *ar, in
}
/* creates own 3d views, used by the sequencer */
-ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype)
+ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height, unsigned int flag, int drawtype, char err_out[256])
{
- View3D v3d= {0};
- ARegion ar= {0};
+ View3D v3d= {NULL};
+ ARegion ar= {NULL};
RegionView3D rv3d= {{{0}}};
/* connect data */
@@ -2230,7 +2243,7 @@ ImBuf *ED_view3d_draw_offscreen_imbuf_simple(Scene *scene, int width, int height
mul_m4_m4m4(rv3d.persmat, rv3d.viewmat, rv3d.winmat);
invert_m4_m4(rv3d.persinv, rv3d.viewinv);
- return ED_view3d_draw_offscreen_imbuf(scene, &v3d, &ar, width, height, flag);
+ return ED_view3d_draw_offscreen_imbuf(scene, &v3d, &ar, width, height, flag, err_out);
// seq_view3d_cb(scene, cfra, render_size, seqrectx, seqrecty);
}
@@ -2275,13 +2288,13 @@ static void draw_viewport_fps(Scene *scene, ARegion *ar)
#endif
/* is this more then half a frame behind? */
- if (fps+0.5 < FPS) {
+ if (fps+0.5f < (float)(FPS)) {
UI_ThemeColor(TH_REDALERT);
- BLI_snprintf(printable, sizeof(printable), "fps: %.2f", (float)fps);
+ BLI_snprintf(printable, sizeof(printable), "fps: %.2f", fps);
}
else {
UI_ThemeColor(TH_TEXT_HI);
- BLI_snprintf(printable, sizeof(printable), "fps: %i", (int)(fps+0.5));
+ BLI_snprintf(printable, sizeof(printable), "fps: %i", (int)(fps+0.5f));
}
BLF_draw_default(22, ar->winy-17, 0.0f, printable, sizeof(printable)-1);
@@ -2441,7 +2454,14 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
}
// REEB_draw();
-
+
+ if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
+ /* must be before xray draw which clears the depth buffer */
+ if(v3d->zbuf) glDisable(GL_DEPTH_TEST);
+ draw_gpencil_view3d((bContext *)C, 1);
+ if(v3d->zbuf) glEnable(GL_DEPTH_TEST);
+ }
+
/* Transp and X-ray afterdraw stuff */
if(v3d->afterdraw_transp.first) view3d_draw_transp(scene, ar, v3d);
if(v3d->afterdraw_xray.first) view3d_draw_xray(scene, ar, v3d, 1); // clears zbuffer if it is used!
@@ -2462,12 +2482,8 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
v3d->zbuf= FALSE;
glDisable(GL_DEPTH_TEST);
}
-
- if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
- /* draw grease-pencil stuff (3d-space strokes) */
- //if (v3d->flag2 & V3D_DISPGP)
- draw_gpencil_view3d((bContext *)C, 1);
+ if ((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
BDR_drawSketch(C);
}
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index 7e93f8999f4..7d0312a79f2 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/view3d_edit.c
+ * \ingroup spview3d
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -309,11 +314,11 @@ static void calctrackballvec(rcti *rect, int mx, int my, float *vec)
y/= (float)((rect->ymax - rect->ymin)/2);
d = sqrt(x*x + y*y);
- if (d < radius*M_SQRT1_2) /* Inside sphere */
+ if (d < radius * (float)M_SQRT1_2) /* Inside sphere */
z = sqrt(radius*radius - d*d);
else
{ /* On hyperbola */
- t = radius / M_SQRT2;
+ t = radius / (float)M_SQRT2;
z = t*t / d;
}
@@ -548,22 +553,22 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
sub_v3_v3v3(dvec, newvec, vod->trackvec);
si= sqrt(dvec[0]*dvec[0]+ dvec[1]*dvec[1]+ dvec[2]*dvec[2]);
- si/= (2.0*TRACKBALLSIZE);
+ si /= (float)(2.0 * TRACKBALLSIZE);
cross_v3_v3v3(q1+1, vod->trackvec, newvec);
normalize_v3(q1+1);
/* Allow for rotation beyond the interval
* [-pi, pi] */
- while (si > 1.0)
- si -= 2.0;
+ while (si > 1.0f)
+ si -= 2.0f;
/* This relation is used instead of
* phi = asin(si) so that the angle
* of rotation is linearly proportional
* to the distance that the mouse is
* dragged. */
- phi = si * M_PI / 2.0;
+ phi = si * (float)(M_PI / 2.0);
q1[0]= cos(phi);
mul_v3_fl(q1+1, sin(phi));
@@ -587,12 +592,12 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
float phi, q1[4];
float m[3][3];
float m_inv[3][3];
- float xvec[3] = {1,0,0};
+ float xvec[3] = {1.0f, 0.0f, 0.0f};
/* Sensitivity will control how fast the viewport rotates. 0.0035 was
obtained experimentally by looking at viewport rotation sensitivities
on other modeling programs. */
/* Perhaps this should be a configurable user parameter. */
- const float sensitivity = 0.0035;
+ const float sensitivity = 0.0035f;
/* Get the 3x3 matrix and its inverse from the quaternion */
quat_to_mat3( m,rv3d->viewquat);
@@ -648,7 +653,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
invert_qt_qt(viewquat_inv_test, snapquats[i]);
mul_qt_v3(viewquat_inv_test, zaxis_test);
- if(angle_v3v3(zaxis_test, zaxis) < DEG2RAD(45/3)) {
+ if(angle_v3v3(zaxis_test, zaxis) < DEG2RADF(45/3)) {
/* find the best roll */
float quat_roll[4], quat_final[4], quat_best[4];
float viewquat_align[4]; /* viewquat aligned to zaxis_test */
@@ -671,7 +676,7 @@ static void viewrotate_apply(ViewOpsData *vod, int x, int y)
float xaxis2[3]={1,0,0};
float quat_final_inv[4];
- axis_angle_to_quat(quat_roll, zaxis_test, j * DEG2RAD(45.0));
+ axis_angle_to_quat(quat_roll, zaxis_test, (float)j * DEG2RADF(45.0f));
normalize_qt(quat_roll);
mul_qt_qtqt(quat_final, snapquats[i], quat_roll);
@@ -887,8 +892,8 @@ void viewmove_modal_keymap(wmKeyConfig *keyconf)
static void viewmove_apply(ViewOpsData *vod, int x, int y)
{
if(vod->rv3d->persp==RV3D_CAMOB) {
- float zoomfac= (M_SQRT2 + vod->rv3d->camzoom/50.0);
- zoomfac= (zoomfac*zoomfac)*0.5;
+ float zoomfac= ((float)M_SQRT2 + (float)vod->rv3d->camzoom / 50.0f);
+ zoomfac= (zoomfac * zoomfac) * 0.5f;
vod->rv3d->camdx += (vod->oldx - x)/(vod->ar->winx * zoomfac);
vod->rv3d->camdy += (vod->oldy - y)/(vod->ar->winy * zoomfac);
@@ -1080,7 +1085,7 @@ static void viewzoom_apply(ViewOpsData *vod, int x, int y, short viewzoom)
float time_step= (float)(time - vod->timer_lastdraw);
// oldstyle zoom
- zfac = 1.0f + (((float)(vod->origx - x + vod->origy - y)/20.0) * time_step);
+ zfac = 1.0f + (((float)(vod->origx - x + vod->origy - y) / 20.0f) * time_step);
vod->timer_lastdraw= time;
}
else if(viewzoom==USER_ZOOM_SCALE) {
@@ -1109,11 +1114,11 @@ static void viewzoom_apply(ViewOpsData *vod, int x, int y, short viewzoom)
if (U.uiflag & USER_ZOOM_INVERT)
SWAP(float, len1, len2);
- zfac = vod->dist0 * (2.0*((len2/len1)-1.0) + 1.0) / vod->rv3d->dist;
+ zfac = vod->dist0 * (2.0f * ((len2/len1)-1.0f) + 1.0f) / vod->rv3d->dist;
}
- if(zfac != 1.0 && zfac*vod->rv3d->dist > 0.001*vod->grid &&
- zfac*vod->rv3d->dist < 10.0*vod->far)
+ if(zfac != 1.0f && zfac*vod->rv3d->dist > 0.001f * vod->grid &&
+ zfac * vod->rv3d->dist < 10.0f * vod->far)
view_zoom_mouseloc(vod->ar, zfac, vod->oldx, vod->oldy);
@@ -1129,8 +1134,8 @@ static void viewzoom_apply(ViewOpsData *vod, int x, int y, short viewzoom)
add_v3_v3(vod->rv3d->ofs, upvec);
} else {
/* these limits were in old code too */
- if(vod->rv3d->dist<0.001*vod->grid) vod->rv3d->dist= 0.001*vod->grid;
- if(vod->rv3d->dist>10.0*vod->far) vod->rv3d->dist=10.0*vod->far;
+ if(vod->rv3d->dist<0.001f * vod->grid) vod->rv3d->dist= 0.001f * vod->grid;
+ if(vod->rv3d->dist>10.0f * vod->far) vod->rv3d->dist=10.0f * vod->far;
}
// XXX if(vod->rv3d->persp==RV3D_ORTHO || vod->rv3d->persp==RV3D_CAMOB) preview3d_event= 0;
@@ -1220,7 +1225,7 @@ static int viewzoom_exec(bContext *C, wmOperator *op)
rv3d->camzoom-= 10;
if(rv3d->camzoom < RV3D_CAMZOOM_MIN) rv3d->camzoom= RV3D_CAMZOOM_MIN;
}
- else if(rv3d->dist<10.0*v3d->far) {
+ else if(rv3d->dist < 10.0f * v3d->far) {
view_zoom_mouseloc(ar, 1.2f, mx, my);
}
}
@@ -1229,7 +1234,7 @@ static int viewzoom_exec(bContext *C, wmOperator *op)
rv3d->camzoom+= 10;
if(rv3d->camzoom > RV3D_CAMZOOM_MAX) rv3d->camzoom= RV3D_CAMZOOM_MAX;
}
- else if(rv3d->dist> 0.001*v3d->grid) {
+ else if(rv3d->dist> 0.001f * v3d->grid) {
view_zoom_mouseloc(ar, .83333f, mx, my);
}
}
@@ -1369,7 +1374,7 @@ static int view3d_all_exec(bContext *C, wmOperator *op) /* was view3d_home() in
sub_v3_v3v3(afm, max, min);
size= 0.7f*MAX3(afm[0], afm[1], afm[2]);
- if(size==0.0) ok= 0;
+ if(size == 0.0f) ok= 0;
if(ok) {
float new_dist;
@@ -1383,7 +1388,7 @@ static int view3d_all_exec(bContext *C, wmOperator *op) /* was view3d_home() in
// correction for window aspect ratio
if(ar->winy>2 && ar->winx>2) {
size= (float)ar->winx/(float)ar->winy;
- if(size<1.0) size= 1.0f/size;
+ if(size < 1.0f) size= 1.0f/size;
new_dist*= size;
}
@@ -1647,15 +1652,15 @@ static int render_border_exec(bContext *C, wmOperator *op)
scene->r.border.ymax= ((float)rect.ymax-vb.ymin)/(vb.ymax-vb.ymin);
/* actually set border */
- CLAMP(scene->r.border.xmin, 0.0, 1.0);
- CLAMP(scene->r.border.ymin, 0.0, 1.0);
- CLAMP(scene->r.border.xmax, 0.0, 1.0);
- CLAMP(scene->r.border.ymax, 0.0, 1.0);
+ CLAMP(scene->r.border.xmin, 0.0f, 1.0f);
+ CLAMP(scene->r.border.ymin, 0.0f, 1.0f);
+ CLAMP(scene->r.border.xmax, 0.0f, 1.0f);
+ CLAMP(scene->r.border.ymax, 0.0f, 1.0f);
/* drawing a border surrounding the entire camera view switches off border rendering
* or the border covers no pixels */
- if ((scene->r.border.xmin <= 0.0 && scene->r.border.xmax >= 1.0 &&
- scene->r.border.ymin <= 0.0 && scene->r.border.ymax >= 1.0) ||
+ if ((scene->r.border.xmin <= 0.0f && scene->r.border.xmax >= 1.0f &&
+ scene->r.border.ymin <= 0.0f && scene->r.border.ymax >= 1.0f) ||
(scene->r.border.xmin == scene->r.border.xmax ||
scene->r.border.ymin == scene->r.border.ymax ))
{
@@ -1763,7 +1768,7 @@ static int view3d_zoom_border_exec(bContext *C, wmOperator *op)
dvec[2] = p[2]-p_corner[2];
new_dist = len_v3(dvec);
- if(new_dist <= v3d->near*1.5) new_dist= v3d->near*1.5;
+ if(new_dist <= v3d->near * 1.5f) new_dist= v3d->near * 1.5f;
new_ofs[0] = -p[0];
new_ofs[1] = -p[1];
@@ -1798,7 +1803,7 @@ static int view3d_zoom_border_exec(bContext *C, wmOperator *op)
scale = (xscale >= yscale)?xscale:yscale;
/* zoom in as required, or as far as we can go */
- new_dist = ((new_dist*scale) >= 0.001*v3d->grid)? new_dist*scale:0.001*v3d->grid;
+ new_dist = ((new_dist*scale) >= 0.001f * v3d->grid)? new_dist*scale:0.001f * v3d->grid;
}
smooth_view(C, NULL, NULL, new_ofs, NULL, &new_dist, NULL);
@@ -1854,7 +1859,7 @@ static void view3d_set_1_to_1_viewborder(Scene *scene, ARegion *ar)
view3d_viewborder_size_get(scene, ar, size);
- rv3d->camzoom= (sqrt(4.0*im_width/size[0]) - M_SQRT2)*50.0;
+ rv3d->camzoom= (sqrtf(4.0f * (float)im_width/size[0]) - (float)M_SQRT2) * 50.0f;
rv3d->camzoom= CLAMPIS(rv3d->camzoom, RV3D_CAMZOOM_MIN, RV3D_CAMZOOM_MAX);
}
@@ -2774,7 +2779,7 @@ static int depth_segment_cb(int x, int y, void *userData)
int view_autodist_depth_segment(struct ARegion *ar, short mval_sta[2], short mval_end[2], int margin, float *depth)
{
- struct { struct ARegion *ar; int margin; float depth; } data = {0};
+ struct { struct ARegion *ar; int margin; float depth; } data = {NULL};
int p1[2];
int p2[2];
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
index 7a4fb86a4dd..7d84a47bddf 100644
--- a/source/blender/editors/space_view3d/view3d_fly.c
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/view3d_fly.c
+ * \ingroup spview3d
+ */
+
+
/* defines VIEW3D_OT_fly modal operator */
#include "DNA_anim_types.h"
@@ -199,10 +204,10 @@ static void drawFlyPixel(const struct bContext *UNUSED(C), struct ARegion *UNUSE
mouse can move during fly mode without spinning the view */
float x1, x2, y1, y2;
- x1= 0.45*(float)fly->ar->winx;
- y1= 0.45*(float)fly->ar->winy;
- x2= 0.55*(float)fly->ar->winx;
- y2= 0.55*(float)fly->ar->winy;
+ x1= 0.45f * (float)fly->ar->winx;
+ y1= 0.45f * (float)fly->ar->winy;
+ x2= 0.55f * (float)fly->ar->winx;
+ y2= 0.55f * (float)fly->ar->winy;
cpack(0);
@@ -435,14 +440,14 @@ static void flyEvent(FlyInfo *fly, wmEvent *event)
fly->time_lastwheel = time_currwheel;
/*printf("Wheel %f\n", time_wheel);*/
/*Mouse wheel delays range from 0.5==slow to 0.01==fast*/
- time_wheel = 1+ (10 - (20*MIN2(time_wheel, 0.5))); /* 0-0.5 -> 0-5.0 */
+ time_wheel = 1.0f + (10.0f - (20.0f * MIN2(time_wheel, 0.5f))); /* 0-0.5 -> 0-5.0 */
if (fly->speed<0.0f) fly->speed= 0.0f;
else {
if (event->shift)
- fly->speed+= fly->grid*time_wheel*0.1;
+ fly->speed += fly->grid*time_wheel * 0.1f;
else
- fly->speed+= fly->grid*time_wheel;
+ fly->speed += fly->grid*time_wheel;
}
break;
}
@@ -454,12 +459,12 @@ static void flyEvent(FlyInfo *fly, wmEvent *event)
time_currwheel= PIL_check_seconds_timer();
time_wheel = (float)(time_currwheel - fly->time_lastwheel);
fly->time_lastwheel = time_currwheel;
- time_wheel = 1+ (10 - (20*MIN2(time_wheel, 0.5))); /* 0-0.5 -> 0-5.0 */
+ time_wheel = 1.0f + (10.0f - (20.0f * MIN2(time_wheel, 0.5f))); /* 0-0.5 -> 0-5.0 */
if (fly->speed>0) fly->speed=0;
else {
if (event->shift)
- fly->speed-= fly->grid*time_wheel*0.1;
+ fly->speed-= fly->grid*time_wheel * 0.1f;
else
fly->speed-= fly->grid*time_wheel;
}
@@ -558,7 +563,8 @@ static int flyApply(bContext *C, FlyInfo *fly)
moffset[2], /* mouse offset from the views center */
tmp_quat[4]; /* used for rotating the view */
- int cent_orig[2], /* view center */
+ int
+// cent_orig[2], /* view center */
//XXX- can avoid using // cent[2], /* view center modified */
xmargin, ymargin; /* x and y margin are define the safe area where the mouses movement wont rotate the view */
unsigned char
@@ -577,8 +583,9 @@ static int flyApply(bContext *C, FlyInfo *fly)
xmargin= ar->winx/20.0f;
ymargin= ar->winy/20.0f;
- cent_orig[0]= ar->winrct.xmin + ar->winx/2;
- cent_orig[1]= ar->winrct.ymin + ar->winy/2;
+ // UNUSED
+ // cent_orig[0]= ar->winrct.xmin + ar->winx/2;
+ // cent_orig[1]= ar->winrct.ymin + ar->winy/2;
{
@@ -603,18 +610,19 @@ static int flyApply(bContext *C, FlyInfo *fly)
if(moffset[0]) {
moffset[0] /= ar->winx - (xmargin*2);
- moffset[0] *= fabs(moffset[0]);
+ moffset[0] *= fabsf(moffset[0]);
}
if(moffset[1]) {
moffset[1] /= ar->winy - (ymargin*2);
- moffset[1] *= fabs(moffset[1]);
+ moffset[1] *= fabsf(moffset[1]);
}
/* Should we redraw? */
if(fly->speed != 0.0f || moffset[0] || moffset[1] || fly->zlock || fly->xlock || dvec[0] || dvec[1] || dvec[2] ) {
float dvec_tmp[3];
- double time_current, time_redraw; /*time how fast it takes for us to redraw, this is so simple scenes dont fly too fast */
+ double time_current; /*time how fast it takes for us to redraw, this is so simple scenes dont fly too fast */
+ float time_redraw;
float time_redraw_clamped;
time_current= PIL_check_seconds_timer();
@@ -637,12 +645,12 @@ static int flyApply(bContext *C, FlyInfo *fly)
dvec_tmp[2]= 0;
if (fly->use_precision) {
- dvec_tmp[0] *= 0.1;
- dvec_tmp[1] *= 0.1;
+ dvec_tmp[0] *= 0.1f;
+ dvec_tmp[1] *= 0.1f;
}
mul_m3_v3(mat, dvec_tmp);
- mul_v3_fl(dvec_tmp, time_redraw*200.0 * fly->grid);
+ mul_v3_fl(dvec_tmp, time_redraw * 200.0f * fly->grid);
} else {
float roll; /* similar to the angle between the camera's up and the Z-up, but its very rough so just roll*/
@@ -699,7 +707,7 @@ static int flyApply(bContext *C, FlyInfo *fly)
mul_m3_v3(mat, upvec);
/*make sure we have some z rolling*/
- if (fabs(upvec[2]) > 0.00001f) {
+ if (fabsf(upvec[2]) > 0.00001f) {
roll= upvec[2]*5;
upvec[0]=0; /*rotate the view about this axis*/
upvec[1]=0;
diff --git a/source/blender/editors/space_view3d/view3d_header.c b/source/blender/editors/space_view3d/view3d_header.c
index 05735d810d3..fea3ac20ca9 100644
--- a/source/blender/editors/space_view3d/view3d_header.c
+++ b/source/blender/editors/space_view3d/view3d_header.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/view3d_header.c
+ * \ingroup spview3d
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
@@ -138,13 +143,31 @@ static void handle_view3d_lock(bContext *C)
}
}
+/* layer code is on three levels actually:
+- here for operator
+- uiTemplateLayers in interface/ code for buttons
+- ED_view3d_scene_layer_set for RNA
+ */
+static void view3d_layers_editmode_ensure(Scene *scene, View3D *v3d)
+{
+ /* sanity check - when in editmode disallow switching the editmode layer off since its confusing
+ * an alternative would be to always draw the editmode object. */
+ if(scene->obedit && (scene->obedit->lay & v3d->lay)==0) {
+ int bit;
+ for(bit=0; bit<32; bit++) {
+ if(scene->obedit->lay & (1<<bit)) {
+ v3d->lay |= 1<<bit;
+ break;
+ }
+ }
+ }
+}
+
static int view3d_layers_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
ScrArea *sa= CTX_wm_area(C);
View3D *v3d= sa->spacedata.first;
- Base *base;
- int oldlay= v3d->lay;
int nr= RNA_int_get(op->ptr, "nr");
int toggle= RNA_boolean_get(op->ptr, "toggle");
@@ -159,7 +182,10 @@ static int view3d_layers_exec(bContext *C, wmOperator *op)
if (toggle && v3d->lay == ((1<<20)-1)) {
/* return to active layer only */
v3d->lay = v3d->layact;
- } else {
+
+ view3d_layers_editmode_ensure(scene, v3d);
+ }
+ else {
v3d->lay |= (1<<20)-1;
}
}
@@ -174,19 +200,10 @@ static int view3d_layers_exec(bContext *C, wmOperator *op)
v3d->lay |= (1<<nr);
} else {
v3d->lay = (1<<nr);
-
- /* sanity check - when in editmode disallow switching the editmode layer off since its confusing
- * an alternative would be to always draw the editmode object. */
- if(scene->obedit && (scene->obedit->lay & v3d->lay)==0) {
- for(bit=0; bit<32; bit++) {
- if(scene->obedit->lay & (1<<bit)) {
- v3d->lay |= 1<<bit;
- break;
- }
- }
- }
}
-
+
+ view3d_layers_editmode_ensure(scene, v3d);
+
/* set active layer, ensure to always have one */
if(v3d->lay & (1<<nr))
v3d->layact= 1<<nr;
@@ -202,12 +219,7 @@ static int view3d_layers_exec(bContext *C, wmOperator *op)
if(v3d->scenelock) handle_view3d_lock(C);
- /* XXX new layers might need updates, there is no provision yet to detect if that's needed */
- oldlay= ~oldlay & v3d->lay;
- for (base= scene->base.first; base; base= base->next) {
- if(base->lay & oldlay)
- base->object->recalc= OB_RECALC_OB|OB_RECALC_DATA;
- }
+ DAG_on_visible_update(CTX_data_main(C), FALSE);
ED_area_tag_redraw(sa);
@@ -458,7 +470,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
uiBlockEndAlign(block);
/* Draw type */
- uiItemR(layout, &v3dptr, "viewport_shade", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(layout, &v3dptr, "viewport_shade", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
if (obedit==NULL && ((ob && ob->mode & (OB_MODE_VERTEX_PAINT|OB_MODE_WEIGHT_PAINT|OB_MODE_TEXTURE_PAINT)))) {
/* Manipulators aren't used in weight paint mode */
@@ -466,13 +478,13 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
PointerRNA meshptr;
RNA_pointer_create(&ob->id, &RNA_Mesh, ob->data, &meshptr);
- uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(layout, &meshptr, "use_paint_mask", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
} else {
const char *str_menu;
row= uiLayoutRow(layout, 1);
- uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
- uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(row, &v3dptr, "pivot_point", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
+ uiItemR(row, &v3dptr, "use_pivot_point_align", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
/* NDOF */
/* Not implemented yet
@@ -487,7 +499,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
/* Transform widget / manipulators */
row= uiLayoutRow(layout, 1);
- uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(row, &v3dptr, "show_manipulator", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
block= uiLayoutGetBlock(row);
if(v3d->twflag & V3D_USE_MANIPULATOR) {
@@ -515,7 +527,7 @@ void uiTemplateHeader3D(uiLayout *layout, struct bContext *C)
uiTemplateLayers(layout, &v3dptr, "layers", &v3dptr, "layers_used", ob_lay);
/* Scene lock */
- uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", ICON_NULL);
+ uiItemR(layout, &v3dptr, "lock_camera_and_layers", UI_ITEM_R_ICON_ONLY, "", ICON_NONE);
}
/* selection modus, dont use python for this since it cant do the toggle buttons with shift+click as well as clicking to set one. */
diff --git a/source/blender/editors/space_view3d/view3d_intern.h b/source/blender/editors/space_view3d/view3d_intern.h
index 8cd07916b7b..4ad0b6acbc3 100644
--- a/source/blender/editors/space_view3d/view3d_intern.h
+++ b/source/blender/editors/space_view3d/view3d_intern.h
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/space_view3d/view3d_intern.h
+ * \ingroup spview3d
+ */
+
#ifndef ED_VIEW3D_INTERN_H
#define ED_VIEW3D_INTERN_H
diff --git a/source/blender/editors/space_view3d/view3d_ops.c b/source/blender/editors/space_view3d/view3d_ops.c
index dc1d2e26de0..1b1a66db95e 100644
--- a/source/blender/editors/space_view3d/view3d_ops.c
+++ b/source/blender/editors/space_view3d/view3d_ops.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/view3d_ops.c
+ * \ingroup spview3d
+ */
+
+
#include <stdlib.h>
#include <math.h>
@@ -187,26 +192,6 @@ void view3d_keymap(wmKeyConfig *keyconf)
RNA_enum_set(WM_keymap_add_item(keymap, "VIEW3D_OT_view_orbit", WHEELDOWNMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0)->ptr, "type", V3D_VIEW_STEPDOWN);
/* active aligned, replaces '*' key in 2.4x */
-#ifdef WIN32
- kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_FRONT);
- RNA_boolean_set(kmi->ptr, "align_active", TRUE);
- kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD3, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_RIGHT);
- RNA_boolean_set(kmi->ptr, "align_active", TRUE);
- kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_ALT, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_TOP);
- RNA_boolean_set(kmi->ptr, "align_active", TRUE);
- kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_ALT|KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BACK);
- RNA_boolean_set(kmi->ptr, "align_active", TRUE);
- kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD3, KM_PRESS, KM_ALT|KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_LEFT);
- RNA_boolean_set(kmi->ptr, "align_active", TRUE);
- kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_ALT|KM_CTRL, 0);
- RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BOTTOM);
- RNA_boolean_set(kmi->ptr, "align_active", TRUE);
-#else
kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD1, KM_PRESS, KM_SHIFT, 0);
RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_FRONT);
RNA_boolean_set(kmi->ptr, "align_active", TRUE);
@@ -225,7 +210,6 @@ void view3d_keymap(wmKeyConfig *keyconf)
kmi= WM_keymap_add_item(keymap, "VIEW3D_OT_viewnumpad", PAD7, KM_PRESS, KM_SHIFT|KM_CTRL, 0);
RNA_enum_set(kmi->ptr, "type", RV3D_VIEW_BOTTOM);
RNA_boolean_set(kmi->ptr, "align_active", TRUE);
-#endif
WM_keymap_add_item(keymap, "VIEW3D_OT_localview", PADSLASHKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index c557952a454..522ec117b37 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/view3d_select.c
+ * \ingroup spview3d
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -72,7 +77,7 @@
#include "ED_mball.h"
#include "UI_interface.h"
-
+#include "UI_resources.h"
#include "view3d_intern.h" // own include
@@ -199,26 +204,6 @@ void EDBM_backbuf_checkAndSelectTFaces(Mesh *me, int select)
}
}
-#if 0
-void arrows_move_cursor(unsigned short event)
-{
- short mval[2];
-
- getmouseco_sc(mval);
-
- if(event==UPARROWKEY) {
- warp_pointer(mval[0], mval[1]+1);
- } else if(event==DOWNARROWKEY) {
- warp_pointer(mval[0], mval[1]-1);
- } else if(event==LEFTARROWKEY) {
- warp_pointer(mval[0]-1, mval[1]);
- } else if(event==RIGHTARROWKEY) {
- warp_pointer(mval[0]+1, mval[1]);
- }
-}
-#endif
-
-
/* *********************** GESTURE AND LASSO ******************* */
static int view3d_selectable_data(bContext *C)
@@ -317,7 +302,7 @@ int lasso_inside(short mcords[][2], short moves, short sx, short sy)
cross= (float)((p1[1]-p2[1])*(p1[0]-sx) + (p2[0]-p1[0])*(p1[1]-sy));
- if(cross<0.0) angletot-= ang;
+ if(cross<0.0f) angletot-= ang;
else angletot+= ang;
/* circulate */
@@ -1013,7 +998,7 @@ static Base *mouse_select_menu(bContext *C, ViewContext *vc, unsigned int *buffe
}
else {
/* UI */
- uiPopupMenu *pup= uiPupMenuBegin(C, "Select Object", ICON_NULL);
+ uiPopupMenu *pup= uiPupMenuBegin(C, "Select Object", ICON_NONE);
uiLayout *layout= uiPupMenuLayout(pup);
uiLayout *split= uiLayoutSplit(layout, 0, 0);
uiLayout *column= uiLayoutColumn(split, 0);
@@ -1264,7 +1249,7 @@ static int mouse_select(bContext *C, short *mval, short extend, short obcenter,
}
base= base->next;
- if(base==0) base= FIRSTBASE;
+ if(base==NULL) base= FIRSTBASE;
if(base==startbase) break;
}
}
@@ -1993,7 +1978,7 @@ static void paint_facesel_circle_select(ViewContext *vc, int select, short *mval
int bbsel;
if (me) {
- bm_vertoffs= me->totface+1; /* max index array */
+ bm_vertoffs= me->totpoly+1; /* max index array */
bbsel= EDBM_init_backbuf_circle(vc, mval[0], mval[1], (short)(rad+1.0));
EDBM_backbuf_checkAndSelectTFaces(me, select==LEFTMOUSE);
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index 84985a7b81e..a2fb58d386a 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/view3d_snap.c
+ * \ingroup spview3d
+ */
+
+
#include <math.h>
#include <string.h>
@@ -266,7 +271,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
if(BMINDEX_GET(eve)) {
VECCOPY(tv->oldloc, eve->co);
tv->loc= eve->co;
- if(eve->no[0]!=0.0 || eve->no[1]!=0.0 ||eve->no[2]!=0.0)
+ if(eve->no[0] != 0.0f || eve->no[1] != 0.0f ||eve->no[2] != 0.0f)
tv->nor= eve->no; // note this is a hackish signal (ton)
tv->flag= BMINDEX_GET(eve) & SELECT;
tv++;
@@ -450,11 +455,11 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
for(a=0; a<tottrans; a++, tv++) {
if(tv->flag & SELECT) {
add_v3_v3(centroid, tv->oldloc);
- total+= 1.0;
+ total += 1.0f;
DO_MINMAX(tv->oldloc, min, max);
}
}
- if(total!=0.0) {
+ if(total != 0.0f) {
mul_v3_fl(centroid, 1.0f/total);
}
@@ -492,9 +497,9 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
VECCOPY(vec, tv->loc);
mul_m3_v3(bmat, vec);
add_v3_v3(vec, obedit->obmat[3]);
- vec[0]= gridf*floor(.5+ vec[0]/gridf);
- vec[1]= gridf*floor(.5+ vec[1]/gridf);
- vec[2]= gridf*floor(.5+ vec[2]/gridf);
+ vec[0]= gridf*floorf(0.5f+ vec[0]/gridf);
+ vec[1]= gridf*floorf(0.5f+ vec[1]/gridf);
+ vec[2]= gridf*floorf(0.5f+ vec[2]/gridf);
sub_v3_v3(vec, obedit->obmat[3]);
mul_m3_v3(imat, vec);
@@ -522,9 +527,9 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
/* get nearest grid point to snap to */
VECCOPY(nLoc, pchan->pose_mat[3]);
- vec[0]= gridf * (float)(floor(.5+ nLoc[0]/gridf));
- vec[1]= gridf * (float)(floor(.5+ nLoc[1]/gridf));
- vec[2]= gridf * (float)(floor(.5+ nLoc[2]/gridf));
+ vec[0]= gridf * (float)(floor(0.5f+ nLoc[0]/gridf));
+ vec[1]= gridf * (float)(floor(0.5f+ nLoc[1]/gridf));
+ vec[2]= gridf * (float)(floor(0.5f+ nLoc[2]/gridf));
/* get bone-space location of grid point */
armature_loc_pose_to_bone(pchan, vec, vecN);
@@ -552,9 +557,9 @@ static int snap_sel_to_grid(bContext *C, wmOperator *UNUSED(op))
else {
ob->recalc |= OB_RECALC_OB;
- vec[0]= -ob->obmat[3][0]+gridf*floor(.5+ ob->obmat[3][0]/gridf);
- vec[1]= -ob->obmat[3][1]+gridf*floor(.5+ ob->obmat[3][1]/gridf);
- vec[2]= -ob->obmat[3][2]+gridf*floor(.5+ ob->obmat[3][2]/gridf);
+ vec[0]= -ob->obmat[3][0]+gridf*floorf(0.5f+ ob->obmat[3][0]/gridf);
+ vec[1]= -ob->obmat[3][1]+gridf*floorf(0.5f+ ob->obmat[3][1]/gridf);
+ vec[2]= -ob->obmat[3][2]+gridf*floorf(0.5f+ ob->obmat[3][2]/gridf);
if(ob->parent) {
where_is_object(scene, ob);
@@ -737,9 +742,9 @@ static int snap_curs_to_grid(bContext *C, wmOperator *UNUSED(op))
gridf= rv3d->gridview;
curs= give_cursor(scene, v3d);
- curs[0]= gridf*floor(.5+curs[0]/gridf);
- curs[1]= gridf*floor(.5+curs[1]/gridf);
- curs[2]= gridf*floor(.5+curs[2]/gridf);
+ curs[0]= gridf*floorf(0.5f+curs[0]/gridf);
+ curs[1]= gridf*floorf(0.5f+curs[1]/gridf);
+ curs[2]= gridf*floorf(0.5f+curs[2]/gridf);
WM_event_add_notifier(C, NC_SPACE|ND_SPACE_VIEW3D, v3d); // hrm
@@ -798,7 +803,7 @@ static int snap_curs_to_sel(bContext *C, wmOperator *UNUSED(op))
}
if(v3d->around==V3D_CENTROID) {
- mul_v3_fl(centroid, 1.0/(float)tottrans);
+ mul_v3_fl(centroid, 1.0f/(float)tottrans);
VECCOPY(curs, centroid);
}
else {
@@ -838,7 +843,7 @@ static int snap_curs_to_sel(bContext *C, wmOperator *UNUSED(op))
}
if(count) {
if(v3d->around==V3D_CENTROID) {
- mul_v3_fl(centroid, 1.0/(float)count);
+ mul_v3_fl(centroid, 1.0f/(float)count);
VECCOPY(curs, centroid);
}
else {
diff --git a/source/blender/editors/space_view3d/view3d_toolbar.c b/source/blender/editors/space_view3d/view3d_toolbar.c
index 3292c5d396c..20d3db2b599 100644
--- a/source/blender/editors/space_view3d/view3d_toolbar.c
+++ b/source/blender/editors/space_view3d/view3d_toolbar.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/view3d_toolbar.c
+ * \ingroup spview3d
+ */
+
+
#include <string.h>
#include <stdio.h>
#include <math.h>
@@ -94,7 +99,7 @@ static void view3d_panel_operator_redo_operator(const bContext *C, Panel *pa, wm
{
if(op->type->flag & OPTYPE_MACRO) {
for(op= op->macro.first; op; op= op->next) {
- uiItemL(pa->layout, op->type->name, ICON_NULL);
+ uiItemL(pa->layout, op->type->name, ICON_NONE);
view3d_panel_operator_redo_operator(C, pa, op);
}
}
@@ -215,7 +220,7 @@ static void view3d_panel_tool_shelf(const bContext *C, Panel *pa)
for(ct= st->toolshelf.first; ct; ct= ct->next) {
if(0==strncmp(context, ct->context, OP_MAX_TYPENAME)) {
col= uiLayoutColumn(pa->layout, 1);
- uiItemFullO(col, ct->opname, NULL, ICON_NULL, NULL, WM_OP_INVOKE_REGION_WIN, 0);
+ uiItemFullO(col, ct->opname, NULL, ICON_NONE, NULL, WM_OP_INVOKE_REGION_WIN, 0);
}
}
}
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 794088de20c..1d93f5ebc83 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/space_view3d/view3d_view.c
+ * \ingroup spview3d
+ */
+
+
#include "DNA_camera_types.h"
#include "DNA_lamp_types.h"
#include "DNA_scene_types.h"
@@ -41,6 +46,7 @@
#include "BKE_anim.h"
#include "BKE_action.h"
#include "BKE_context.h"
+#include "BKE_depsgraph.h"
#include "BKE_object.h"
#include "BKE_global.h"
#include "BKE_main.h"
@@ -107,9 +113,9 @@ static void object_lens_clip_settings(Object *ob, float *lens, float *clipsta, f
Lamp *la = ob->data;
if (lens) {
float x1, fac;
- fac= cos( M_PI*la->spotsize/360.0);
+ fac= cosf((float)M_PI*la->spotsize/360.0f);
x1= saacos(fac);
- *lens= 16.0*fac/sin(x1);
+ *lens= 16.0f*fac/sinf(x1);
}
if (clipsta) *clipsta= la->clipsta;
if (clipend) *clipend= la->clipend;
@@ -261,7 +267,7 @@ void smooth_view(bContext *C, Object *oldcamera, Object *camera, float *ofs, flo
mul_qt_v3(q2, vec2);
/* scale the time allowed by the rotation */
- sms.time_allowed *= angle_v3v3(vec1, vec2) / M_PI; /* 180deg == 1.0 */
+ sms.time_allowed *= (double)angle_v3v3(vec1, vec2) / M_PI; /* 180deg == 1.0 */
}
/* ensure it shows correct */
@@ -306,14 +312,14 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent
View3D *v3d = CTX_wm_view3d(C);
RegionView3D *rv3d= CTX_wm_region_view3d(C);
struct SmoothViewStore *sms= rv3d->sms;
- double step, step_inv;
+ float step, step_inv;
/* escape if not our timer */
if(rv3d->smooth_timer==NULL || rv3d->smooth_timer!=event->customdata)
return OPERATOR_PASS_THROUGH;
- if(sms->time_allowed != 0.0f)
- step = (rv3d->smooth_timer->duration)/sms->time_allowed;
+ if(sms->time_allowed != 0.0)
+ step = (float)((rv3d->smooth_timer->duration)/sms->time_allowed);
else
step = 1.0f;
@@ -350,18 +356,18 @@ static int view3d_smoothview_invoke(bContext *C, wmOperator *UNUSED(op), wmEvent
int i;
/* ease in/out */
- if (step < 0.5) step = (float)pow(step*2, 2)/2;
- else step = (float)1-(pow(2*(1-step),2)/2);
+ if (step < 0.5f) step = (float)pow(step*2.0f, 2.0)/2.0f;
+ else step = (float)1.0f-(powf(2.0f*(1.0f-step),2.0f)/2.0f);
- step_inv = 1.0-step;
+ step_inv = 1.0f-step;
for (i=0; i<3; i++)
- rv3d->ofs[i] = sms->new_ofs[i]*step + sms->orig_ofs[i]*step_inv;
+ rv3d->ofs[i] = sms->new_ofs[i] * step + sms->orig_ofs[i]*step_inv;
interp_qt_qtqt(rv3d->viewquat, sms->orig_quat, sms->new_quat, step);
- rv3d->dist = sms->new_dist*step + sms->orig_dist*step_inv;
- v3d->lens = sms->new_lens*step + sms->orig_lens*step_inv;
+ rv3d->dist = sms->new_dist * step + sms->orig_dist*step_inv;
+ v3d->lens = sms->new_lens * step + sms->orig_lens*step_inv;
}
if(rv3d->viewlock & RV3D_BOXVIEW)
@@ -419,6 +425,7 @@ static int view3d_setcameratoview_exec(bContext *C, wmOperator *UNUSED(op))
}
setcameratoview3d(rv3d, v3d->camera);
+ DAG_id_tag_update(&v3d->camera->id, OB_RECALC_OB);
rv3d->persp = RV3D_CAMOB;
WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, v3d->camera);
@@ -670,6 +677,28 @@ void window_to_3d_delta(ARegion *ar, float *vec, short mx, short my)
vec[2]= (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy);
}
+/* doesn't rely on initgrabz */
+/* for perspective view, get the vector direction to
+ * the mouse cursor as a normalized vector */
+void window_to_3d_vector(ARegion *ar, float *vec, short mx, short my)
+{
+ RegionView3D *rv3d= ar->regiondata;
+ float dx, dy;
+ float viewvec[3];
+
+ dx= 2.0f*mx/ar->winx;
+ dy= 2.0f*my/ar->winy;
+
+ /* normalize here so vecs are proportional to eachother */
+ normalize_v3_v3(viewvec, rv3d->viewinv[2]);
+
+ vec[0]= viewvec[0] - (rv3d->persinv[0][0]*dx + rv3d->persinv[1][0]*dy);
+ vec[1]= viewvec[1] - (rv3d->persinv[0][1]*dx + rv3d->persinv[1][1]*dy);
+ vec[2]= viewvec[2] - (rv3d->persinv[0][2]*dx + rv3d->persinv[1][2]*dy);
+
+ normalize_v3(vec);
+}
+
float read_cached_depth(ViewContext *vc, int x, int y)
{
ViewDepths *vd = vc->rv3d->depths;
@@ -801,14 +830,14 @@ void project_short(ARegion *ar, float *vec, short *adr) /* clips */
vec4[3]= 1.0;
mul_m4_v4(rv3d->persmat, vec4);
- if( vec4[3]>BL_NEAR_CLIP ) { /* 0.001 is the NEAR clipping cutoff for picking */
+ if( vec4[3] > (float)BL_NEAR_CLIP ) { /* 0.001 is the NEAR clipping cutoff for picking */
fx= (ar->winx/2)*(1 + vec4[0]/vec4[3]);
if( fx>0 && fx<ar->winx) {
fy= (ar->winy/2)*(1 + vec4[1]/vec4[3]);
- if(fy>0.0 && fy< (float)ar->winy) {
+ if(fy > 0.0f && fy < (float)ar->winy) {
adr[0]= (short)floor(fx);
adr[1]= (short)floor(fy);
}
@@ -827,7 +856,7 @@ void project_int(ARegion *ar, float *vec, int *adr)
mul_m4_v4(rv3d->persmat, vec4);
- if( vec4[3]>BL_NEAR_CLIP ) { /* 0.001 is the NEAR clipping cutoff for picking */
+ if( vec4[3] > (float)BL_NEAR_CLIP ) { /* 0.001 is the NEAR clipping cutoff for picking */
fx= (ar->winx/2)*(1 + vec4[0]/vec4[3]);
if( fx>-2140000000.0f && fx<2140000000.0f) {
@@ -876,14 +905,14 @@ void project_short_noclip(ARegion *ar, float *vec, short *adr)
mul_m4_v4(rv3d->persmat, vec4);
- if( vec4[3]>BL_NEAR_CLIP ) { /* 0.001 is the NEAR clipping cutoff for picking */
+ if( vec4[3] > (float)BL_NEAR_CLIP ) { /* 0.001 is the NEAR clipping cutoff for picking */
fx= (ar->winx/2)*(1 + vec4[0]/vec4[3]);
if( fx>-32700 && fx<32700) {
fy= (ar->winy/2)*(1 + vec4[1]/vec4[3]);
- if(fy>-32700.0 && fy<32700.0) {
+ if(fy > -32700.0f && fy < 32700.0f) {
adr[0]= (short)floor(fx);
adr[1]= (short)floor(fy);
}
@@ -902,9 +931,9 @@ void project_float(ARegion *ar, float *vec, float *adr)
mul_m4_v4(rv3d->persmat, vec4);
- if( vec4[3]>BL_NEAR_CLIP ) {
- adr[0] = (float)(ar->winx/2.0)+(ar->winx/2.0)*vec4[0]/vec4[3];
- adr[1] = (float)(ar->winy/2.0)+(ar->winy/2.0)*vec4[1]/vec4[3];
+ if(vec4[3] > (float)BL_NEAR_CLIP) {
+ adr[0] = (float)(ar->winx/2.0f)+(ar->winx/2.0f)*vec4[0]/vec4[3];
+ adr[1] = (float)(ar->winy/2.0f)+(ar->winy/2.0f)*vec4[1]/vec4[3];
}
}
@@ -919,8 +948,8 @@ void project_float_noclip(ARegion *ar, float *vec, float *adr)
mul_m4_v4(rv3d->persmat, vec4);
if( fabs(vec4[3]) > BL_NEAR_CLIP ) {
- adr[0] = (float)(ar->winx/2.0)+(ar->winx/2.0)*vec4[0]/vec4[3];
- adr[1] = (float)(ar->winy/2.0)+(ar->winy/2.0)*vec4[1]/vec4[3];
+ adr[0] = (float)(ar->winx/2.0f)+(ar->winx/2.0f)*vec4[0]/vec4[3];
+ adr[1] = (float)(ar->winy/2.0f)+(ar->winy/2.0f)*vec4[1]/vec4[3];
}
else
{
@@ -979,7 +1008,7 @@ int get_view3d_cliprange(View3D *v3d, RegionView3D *rv3d, float *clipsta, float
}
if(rv3d->persp==RV3D_ORTHO) {
- *clipend *= 0.5; // otherwise too extreme low zbuffer quality
+ *clipend *= 0.5f; // otherwise too extreme low zbuffer quality
*clipsta= - *clipend;
orth= 1;
}
@@ -1006,10 +1035,10 @@ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi,
Lamp *la;
la= v3d->camera->data;
- fac= cos( M_PI*la->spotsize/360.0);
+ fac= cosf(((float)M_PI)*la->spotsize/360.0f);
x1= saacos(fac);
- lens= 16.0*fac/sin(x1);
+ lens= 16.0f*fac/sinf(x1);
*clipsta= la->clipsta;
*clipend= la->clipend;
@@ -1032,14 +1061,14 @@ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi,
else y1= -rv3d->dist;
y2= -y1;
- *clipend *= 0.5; // otherwise too extreme low zbuffer quality
+ *clipend *= 0.5f; // otherwise too extreme low zbuffer quality
*clipsta= - *clipend;
orth= 1;
}
else {
/* fac for zoom, also used for camdx */
if(rv3d->persp==RV3D_CAMOB) {
- fac= (1.41421+( (float)rv3d->camzoom )/50.0);
+ fac= (1.41421f + ( (float)rv3d->camzoom )/50.0f);
fac*= fac;
}
else fac= 2.0;
@@ -1047,7 +1076,7 @@ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi,
/* viewplane size depends... */
if(cam && cam->type==CAM_ORTHO) {
/* ortho_scale == 1 means exact 1 to 1 mapping */
- float dfac= 2.0*cam->ortho_scale/fac;
+ float dfac= 2.0f*cam->ortho_scale/fac;
if(winx>winy) x1= -dfac;
else x1= -winx*dfac/winy;
@@ -1061,8 +1090,8 @@ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi,
else {
float dfac;
- if(winx>winy) dfac= 64.0/(fac*winx*lens);
- else dfac= 64.0/(fac*winy*lens);
+ if(winx>winy) dfac= 64.0f/(fac*winx*lens);
+ else dfac= 64.0f/(fac*winy*lens);
x1= - *clipsta * winx*dfac;
x2= -x1;
@@ -1072,8 +1101,8 @@ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi,
}
/* cam view offset */
if(cam) {
- float dx= 0.5*fac*rv3d->camdx*(x2-x1);
- float dy= 0.5*fac*rv3d->camdy*(y2-y1);
+ float dx= 0.5f*fac*rv3d->camdx*(x2-x1);
+ float dy= 0.5f*fac*rv3d->camdy*(y2-y1);
/* shift offset */
if(cam->type==CAM_ORTHO) {
@@ -1081,8 +1110,8 @@ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi,
dy += cam->shifty * cam->ortho_scale;
}
else {
- dx += cam->shiftx * (cam->clipsta / cam->lens) * 32.0;
- dy += cam->shifty * (cam->clipsta / cam->lens) * 32.0;
+ dx += cam->shiftx * (cam->clipsta / cam->lens) * 32.0f;
+ dy += cam->shifty * (cam->clipsta / cam->lens) * 32.0f;
}
x1+= dx;
@@ -1100,7 +1129,7 @@ int get_view3d_viewplane(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi,
*pixsize= 1.0f/viewfac;
}
else {
- viewfac= (((winx >= winy)? winx: winy)*lens)/32.0;
+ viewfac= (((winx >= winy)? winx: winy)*lens)/32.0f;
*pixsize= *clipsta/viewfac;
}
}
@@ -1195,33 +1224,37 @@ static void obmat_to_viewmat(View3D *v3d, RegionView3D *rv3d, Object *ob, short
#define QUATSET(a, b, c, d, e) a[0]=b; a[1]=c; a[2]=d; a[3]=e;
-static void view3d_viewlock(RegionView3D *rv3d)
+int ED_view3d_lock(RegionView3D *rv3d)
{
switch(rv3d->view) {
case RV3D_VIEW_BOTTOM :
QUATSET(rv3d->viewquat,0.0, -1.0, 0.0, 0.0);
break;
-
+
case RV3D_VIEW_BACK:
QUATSET(rv3d->viewquat,0.0, 0.0, (float)-cos(M_PI/4.0), (float)-cos(M_PI/4.0));
break;
-
+
case RV3D_VIEW_LEFT:
QUATSET(rv3d->viewquat,0.5, -0.5, 0.5, 0.5);
break;
-
+
case RV3D_VIEW_TOP:
QUATSET(rv3d->viewquat,1.0, 0.0, 0.0, 0.0);
break;
-
+
case RV3D_VIEW_FRONT:
QUATSET(rv3d->viewquat,(float)cos(M_PI/4.0), (float)-sin(M_PI/4.0), 0.0, 0.0);
break;
-
+
case RV3D_VIEW_RIGHT:
QUATSET(rv3d->viewquat, 0.5, -0.5, -0.5, -0.5);
break;
+ default:
+ return FALSE;
}
+
+ return TRUE;
}
/* dont set windows active in in here, is used by renderwin too */
@@ -1240,7 +1273,7 @@ void setviewmatrixview3d(Scene *scene, View3D *v3d, RegionView3D *rv3d)
else {
/* should be moved to better initialize later on XXX */
if(rv3d->viewlock)
- view3d_viewlock(rv3d);
+ ED_view3d_lock(rv3d);
quat_to_mat4( rv3d->viewmat,rv3d->viewquat);
if(rv3d->persp==RV3D_PERSP) rv3d->viewmat[3][2]-= rv3d->dist;
@@ -1508,7 +1541,7 @@ static void initlocalview(Main *bmain, Scene *scene, ScrArea *sa)
box[1]= (max[1]-min[1]);
box[2]= (max[2]-min[2]);
size= MAX3(box[0], box[1], box[2]);
- if(size<=0.01) size= 0.01;
+ if(size <= 0.01f) size= 0.01f;
}
if(ok) {
@@ -1525,19 +1558,19 @@ static void initlocalview(Main *bmain, Scene *scene, ScrArea *sa)
rv3d->localvd= MEM_mallocN(sizeof(RegionView3D), "localview region");
memcpy(rv3d->localvd, rv3d, sizeof(RegionView3D));
- rv3d->ofs[0]= -(min[0]+max[0])/2.0;
- rv3d->ofs[1]= -(min[1]+max[1])/2.0;
- rv3d->ofs[2]= -(min[2]+max[2])/2.0;
+ rv3d->ofs[0]= -(min[0]+max[0])/2.0f;
+ rv3d->ofs[1]= -(min[1]+max[1])/2.0f;
+ rv3d->ofs[2]= -(min[2]+max[2])/2.0f;
rv3d->dist= size;
/* perspective should be a bit farther away to look nice */
if(rv3d->persp==RV3D_ORTHO)
- rv3d->dist*= 0.7;
+ rv3d->dist*= 0.7f;
// correction for window aspect ratio
if(ar->winy>2 && ar->winx>2) {
float asp= (float)ar->winx/(float)ar->winy;
- if(asp<1.0) asp= 1.0/asp;
+ if(asp < 1.0f) asp= 1.0f/asp;
rv3d->dist*= asp;
}
@@ -1706,7 +1739,7 @@ static void RestoreState(bContext *C, wmWindow *win)
}
/* was space_set_commmandline_options in 2.4x */
-void game_set_commmandline_options(GameData *gm)
+static void game_set_commmandline_options(GameData *gm)
{
SYS_SystemHandle syshandle;
int test;
diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt
index f31d7ba6449..05f46edb7a4 100644
--- a/source/blender/editors/transform/CMakeLists.txt
+++ b/source/blender/editors/transform/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
../../makesrna
../../windowmanager
../../../../intern/guardedalloc
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 4a920e15e34..363421b0ca3 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/transform/transform.c
+ * \ingroup edtransform
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -49,22 +54,10 @@
#include "RNA_access.h"
-//#include "BIF_editview.h" /* arrows_move_cursor */
#include "BIF_gl.h"
#include "BIF_glutil.h"
-//#include "BIF_mywindow.h"
-//#include "BIF_resources.h"
-//#include "BIF_screen.h"
-//#include "BIF_space.h" /* undo */
-//#include "BIF_toets.h" /* persptoetsen */
-//#include "BIF_mywindow.h" /* warp_pointer */
-//#include "BIF_toolbox.h" /* notice */
-//#include "BIF_editmesh.h"
-//#include "BIF_editsima.h"
-//#include "BIF_editparticle.h"
#include "BKE_nla.h"
-//#include "BKE_bad_level_calls.h"/* popmenu and error */
#include "BKE_bmesh.h"
#include "BKE_context.h"
#include "BKE_constraint.h"
@@ -73,8 +66,6 @@
#include "BKE_pointcache.h"
#include "BKE_unit.h"
-//#include "BSE_view.h"
-
#include "ED_image.h"
#include "ED_keyframing.h"
#include "ED_screen.h"
@@ -550,9 +541,6 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, 0, 0, TFM_MODAL_ADD_SNAP);
WM_modalkeymap_add_item(keymap, AKEY, KM_PRESS, KM_ALT, 0, TFM_MODAL_REMOVE_SNAP);
- WM_modalkeymap_add_item(keymap, UPARROWKEY, KM_PRESS, 0, 0, NUM_MODAL_INCREMENT_UP);
- WM_modalkeymap_add_item(keymap, DOWNARROWKEY, KM_PRESS, 0, 0, NUM_MODAL_INCREMENT_DOWN);
-
WM_modalkeymap_add_item(keymap, PAGEUPKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP);
WM_modalkeymap_add_item(keymap, PAGEDOWNKEY, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_DOWN);
WM_modalkeymap_add_item(keymap, WHEELDOWNMOUSE, KM_PRESS, 0, 0, TFM_MODAL_PROPSIZE_UP);
@@ -1069,7 +1057,6 @@ int transformEvent(TransInfo *t, wmEvent *event)
// Snapping events
t->redraw |= handleSnapping(t, event);
- //arrows_move_cursor(event->type);
}
else if (event->val==KM_RELEASE) {
switch (event->type){
@@ -1242,6 +1229,15 @@ static void drawArc(float size, float angle_start, float angle_end, int segments
glEnd();
}
+static int helpline_poll(bContext *C)
+{
+ ARegion *ar= CTX_wm_region(C);
+
+ if(ar && ar->regiontype==RGN_TYPE_WINDOW)
+ return 1;
+ return 0;
+}
+
static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
{
TransInfo *t = (TransInfo*)customdata;
@@ -1280,7 +1276,7 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
glEnd();
glTranslatef(mval[0], mval[1], 0);
- glRotatef(-180 / M_PI * atan2f(cent[0] - t->mval[0], cent[1] - t->mval[1]), 0, 0, 1);
+ glRotatef(-RAD2DEGF(atan2f(cent[0] - t->mval[0], cent[1] - t->mval[1])), 0, 0, 1);
setlinestyle(0);
glLineWidth(3.0);
@@ -1314,8 +1310,8 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
float dx = t->mval[0] - cent[0], dy = t->mval[1] - cent[1];
float angle = atan2f(dy, dx);
float dist = sqrtf(dx*dx + dy*dy);
- float delta_angle = MIN2(15 / dist, M_PI/4);
- float spacing_angle = MIN2(5 / dist, M_PI/12);
+ float delta_angle = MIN2(15.0f / dist, (float)M_PI/4.0f);
+ float spacing_angle = MIN2(5.0f / dist, (float)M_PI/12.0f);
UI_ThemeColor(TH_WIRE);
setlinestyle(3);
@@ -1334,14 +1330,14 @@ static void drawHelpline(bContext *UNUSED(C), int x, int y, void *customdata)
glPushMatrix();
glTranslatef(cosf(angle - delta_angle) * dist, sinf(angle - delta_angle) * dist, 0);
- glRotatef(180 / M_PI * (angle - delta_angle), 0, 0, 1);
+ glRotatef(RAD2DEGF(angle - delta_angle), 0, 0, 1);
drawArrowHead(DOWN, 5);
glPopMatrix();
glTranslatef(cosf(angle + delta_angle) * dist, sinf(angle + delta_angle) * dist, 0);
- glRotatef(180 / M_PI * (angle + delta_angle), 0, 0, 1);
+ glRotatef(RAD2DEGF(angle + delta_angle), 0, 0, 1);
drawArrowHead(UP, 5);
@@ -1556,7 +1552,7 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
t->draw_handle_apply = ED_region_draw_cb_activate(t->ar->type, drawTransformApply, t, REGION_DRAW_PRE_VIEW);
t->draw_handle_view = ED_region_draw_cb_activate(t->ar->type, drawTransformView, t, REGION_DRAW_POST_VIEW);
//t->draw_handle_pixel = ED_region_draw_cb_activate(t->ar->type, drawTransformPixel, t, REGION_DRAW_POST_PIXEL);
- t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), NULL, drawHelpline, t);
+ t->draw_handle_cursor = WM_paint_cursor_activate(CTX_wm_manager(C), helpline_poll, drawHelpline, t);
}
else if(t->spacetype == SPACE_IMAGE) {
unit_m3(t->spacemtx);
@@ -1658,11 +1654,6 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
break;
case TFM_EDGE_SLIDE:
initEdgeSlide(t);
- if(t->state == TRANS_CANCEL)
- {
- postTrans(C, t);
- return 0;
- }
break;
case TFM_BONE_ROLL:
initBoneRoll(t);
@@ -1676,6 +1667,16 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
case TFM_TIME_SCALE:
initTimeScale(t);
break;
+ case TFM_TIME_DUPLICATE:
+ /* same as TFM_TIME_EXTEND, but we need the mode info for later
+ * so that duplicate-culling will work properly
+ */
+ if ELEM(t->spacetype, SPACE_IPO, SPACE_NLA)
+ initTranslation(t);
+ else
+ initTimeTranslate(t);
+ t->mode = mode;
+ break;
case TFM_TIME_EXTEND:
/* now that transdata has been made, do like for TFM_TIME_TRANSLATE (for most Animation
* Editors because they have only 1D transforms for time values) or TFM_TRANSLATION
@@ -1707,6 +1708,13 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
break;
}
+ if(t->state == TRANS_CANCEL)
+ {
+ postTrans(C, t);
+ return 0;
+ }
+
+
/* overwrite initial values if operator supplied a non-null vector */
if (RNA_property_is_set(op->ptr, "value"))
{
@@ -1917,7 +1925,7 @@ static void protectedAxisAngleBits(short protectflag, float axis[3], float *angl
eulO_to_axis_angle( axis, angle,eul, EULER_ORDER_DEFAULT);
/* when converting to axis-angle, we need a special exception for the case when there is no axis */
- if (IS_EQ(axis[0], axis[1]) && IS_EQ(axis[1], axis[2])) {
+ if (IS_EQF(axis[0], axis[1]) && IS_EQF(axis[1], axis[2])) {
/* for now, rotate around y-axis then (so that it simply becomes the roll) */
axis[1]= 1.0f;
}
@@ -1978,7 +1986,7 @@ static void constraintTransLim(TransInfo *UNUSED(t), TransData *td)
{
if (td->con) {
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_LOCLIMIT);
- bConstraintOb cob= {0};
+ bConstraintOb cob= {NULL};
bConstraint *con;
/* Make a temporary bConstraintOb for using these limit constraints
@@ -2134,7 +2142,7 @@ static void constraintSizeLim(TransInfo *t, TransData *td)
{
if (td->con && td->ext) {
bConstraintTypeInfo *cti= get_constraint_typeinfo(CONSTRAINT_TYPE_SIZELIMIT);
- bConstraintOb cob= {0};
+ bConstraintOb cob= {NULL};
bConstraint *con;
/* Make a temporary bConstraintOb for using these limit constraints
@@ -2233,8 +2241,8 @@ void initWarp(TransInfo *t)
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
- t->snap[1] = 5.0f / 180 * M_PI;
- t->snap[2] = 1.0f / 180 * M_PI;
+ t->snap[1] = 5.0f / 180.0f * (float)M_PI;
+ t->snap[2] = 1.0f / 180.0f * (float)M_PI;
t->num.increment = 1.0f;
@@ -2257,7 +2265,7 @@ void initWarp(TransInfo *t)
mid_v3_v3v3(t->center, min, max);
- if (max[0] == min[0]) max[0] += 0.1; /* not optimal, but flipping is better than invalid garbage (i.e. division by zero!) */
+ if (max[0] == min[0]) max[0] += 0.1f; /* not optimal, but flipping is better than invalid garbage (i.e. division by zero!) */
t->val= (max[0]-min[0])/2.0f; /* t->val is X dimension projected boundbox */
}
@@ -2268,10 +2276,10 @@ int handleEventWarp(TransInfo *t, wmEvent *event)
if (event->type == MIDDLEMOUSE && event->val==KM_PRESS)
{
// Use customData pointer to signal warp direction
- if (t->customData == 0)
+ if (t->customData == NULL)
t->customData = (void*)1;
else
- t->customData = 0;
+ t->customData = NULL;
status = 1;
}
@@ -2321,11 +2329,11 @@ int Warp(TransInfo *t, short UNUSED(mval[2]))
sprintf(str, "Warp: %s", c);
- circumfac = circumfac / 180 * M_PI;
+ circumfac = DEG2RADF(circumfac);
}
else {
/* default header print */
- sprintf(str, "Warp: %.3f", circumfac * 180 / M_PI);
+ sprintf(str, "Warp: %.3f", RAD2DEGF(circumfac));
}
t->values[0] = circumfac;
@@ -2409,7 +2417,7 @@ int handleEventShear(TransInfo *t, wmEvent *event)
if (event->type == MIDDLEMOUSE && event->val==KM_PRESS)
{
// Use customData pointer to signal Shear direction
- if (t->customData == 0)
+ if (t->customData == NULL)
{
initMouseInputMode(t, &t->mouse, INPUT_VERTICAL_ABSOLUTE);
t->customData = (void*)1;
@@ -2417,7 +2425,7 @@ int handleEventShear(TransInfo *t, wmEvent *event)
else
{
initMouseInputMode(t, &t->mouse, INPUT_HORIZONTAL_ABSOLUTE);
- t->customData = 0;
+ t->customData = NULL;
}
status = 1;
@@ -2461,7 +2469,7 @@ int Shear(TransInfo *t, short UNUSED(mval[2]))
unit_m3(smat);
// Custom data signals shear direction
- if (t->customData == 0)
+ if (t->customData == NULL)
smat[1][0] = value;
else
smat[0][1] = value;
@@ -3174,18 +3182,12 @@ int Rotation(TransInfo *t, short UNUSED(mval[2]))
outputNumInput(&(t->num), c);
sprintf(str, "Rot: %s %s %s", &c[0], t->con.text, t->proptext);
-
+
/* Clamp between -180 and 180 */
- while (final >= 180.0)
- final -= 360.0;
-
- while (final <= -180.0)
- final += 360.0;
-
- final *= (float)(M_PI / 180.0);
+ final= angle_wrap_rad(DEG2RADF(final));
}
else {
- sprintf(str, "Rot: %.2f%s %s", 180.0*final/M_PI, t->con.text, t->proptext);
+ sprintf(str, "Rot: %.2f%s %s", RAD2DEGF(final), t->con.text, t->proptext);
}
if (t->flag & (T_PROP_EDIT|T_PROP_CONNECTED))
@@ -3285,11 +3287,11 @@ int Trackball(TransInfo *t, short UNUSED(mval[2]))
sprintf(str, "Trackball: %s %s %s", &c[0], &c[20], t->proptext);
- phi[0] *= (float)(M_PI / 180.0);
- phi[1] *= (float)(M_PI / 180.0);
+ phi[0] = DEG2RADF(phi[0]);
+ phi[1] = DEG2RADF(phi[1]);
}
else {
- sprintf(str, "Trackball: %.2f %.2f %s", 180.0*phi[0]/M_PI, 180.0*phi[1]/M_PI, t->proptext);
+ sprintf(str, "Trackball: %.2f %.2f %s", RAD2DEGF(phi[0]), RAD2DEGF(phi[1]), t->proptext);
}
vec_rot_to_mat3( smat,axis1, phi[0]);
@@ -3378,7 +3380,7 @@ static void headerTranslation(TransInfo *t, float vec[3], char *str) {
if(!(t->flag & T_2D_EDIT) && t->scene->unit.system)
bUnit_AsString(distvec, sizeof(distvec), dist*t->scene->unit.scale_length, 4, t->scene->unit.system, B_UNIT_LENGTH, t->scene->unit.flag & USER_UNIT_OPT_SPLIT, 0);
- else if( dist > 1e10 || dist < -1e10 ) /* prevent string buffer overflow */
+ else if( dist > 1e10f || dist < -1e10f ) /* prevent string buffer overflow */
sprintf(distvec, "%.4e", dist);
else
sprintf(distvec, "%.4f", dist);
@@ -3645,10 +3647,10 @@ int Tilt(TransInfo *t, short UNUSED(mval[2]))
sprintf(str, "Tilt: %s %s", &c[0], t->proptext);
- final *= (float)(M_PI / 180.0);
+ final = DEG2RADF(final);
}
else {
- sprintf(str, "Tilt: %.2f %s", 180.0*final/M_PI, t->proptext);
+ sprintf(str, "Tilt: %.2f %s", RAD2DEGF(final), t->proptext);
}
for(i = 0 ; i < t->total; i++, td++) {
@@ -4361,7 +4363,7 @@ static int createSlideVerts(TransInfo *t)
BMBVHTree *btree = BMBVH_NewBVH(em);
SmallHash table;
SlideData *sld = MEM_callocN(sizeof(*sld), "sld");
- RegionView3D *v3d = t->ar->regiondata;
+ RegionView3D *v3d = t->ar ? t->ar->regiondata : NULL; /* background mode support */
ARegion *ar = t->ar;
float projectMat[4][4];
float start[3] = {0.0f, 0.0f, 0.0f}, dir[3], end[3] = {0.0f, 0.0f, 0.0f};
@@ -4914,10 +4916,10 @@ int BoneRoll(TransInfo *t, short UNUSED(mval[2]))
sprintf(str, "Roll: %s", &c[0]);
- final *= (float)(M_PI / 180.0);
+ final = DEG2RADF(final);
}
else {
- sprintf(str, "Roll: %.2f", 180.0*final/M_PI);
+ sprintf(str, "Roll: %.2f", RAD2DEGF(final));
}
/* set roll values */
@@ -5225,8 +5227,8 @@ int SeqSlide(TransInfo *t, short UNUSED(mval[2]))
applyNumInput(&t->num, t->values);
}
- t->values[0] = floor(t->values[0] + 0.5);
- t->values[1] = floor(t->values[1] + 0.5);
+ t->values[0] = floor(t->values[0] + 0.5f);
+ t->values[1] = floor(t->values[1] + 0.5f);
headerSeqSlide(t, t->values, str);
applySeqSlide(t, t->values);
@@ -5384,6 +5386,11 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d,
void initTimeTranslate(TransInfo *t)
{
+ /* this tool is only really available in the Action Editor... */
+ if (t->spacetype != SPACE_ACTION) {
+ t->state = TRANS_CANCEL;
+ }
+
t->mode = TFM_TIME_TRANSLATE;
t->transform = TimeTranslate;
@@ -5532,8 +5539,11 @@ void initTimeSlide(TransInfo *t)
/* set flag for drawing stuff */
saction->flag |= SACTION_MOVING;
+ } else {
+ t->state = TRANS_CANCEL;
}
+
t->mode = TFM_TIME_SLIDE;
t->transform = TimeSlide;
t->flag |= T_FREE_CUSTOMDATA;
@@ -5640,7 +5650,7 @@ int TimeSlide(TransInfo *t, short mval[2])
/* handle numeric-input stuff */
t->vec[0] = 2.0f*(cval[0]-sval[0]) / (maxx-minx);
applyNumInput(&t->num, &t->vec[0]);
- t->values[0] = (maxx-minx) * t->vec[0] / 2.0 + sval[0];
+ t->values[0] = (maxx-minx) * t->vec[0] / 2.0f + sval[0];
headerTimeSlide(t, sval[0], str);
applyTimeSlide(t, sval[0]);
@@ -5658,6 +5668,13 @@ void initTimeScale(TransInfo *t)
{
int center[2];
+ /* this tool is only really available in the Action Editor
+ * AND NLA Editor (for strip scaling)
+ */
+ if (ELEM(t->spacetype, SPACE_ACTION, SPACE_NLA) == 0) {
+ t->state = TRANS_CANCEL;
+ }
+
t->mode = TFM_TIME_SCALE;
t->transform = TimeScale;
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 9c9400d034e..76569a86e11 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/transform/transform.h
+ * \ingroup edtransform
+ */
+
+
#ifndef TRANSFORM_H
#define TRANSFORM_H
diff --git a/source/blender/editors/transform/transform_constraints.c b/source/blender/editors/transform/transform_constraints.c
index 4427e472412..0ef8633e6e3 100644
--- a/source/blender/editors/transform/transform_constraints.c
+++ b/source/blender/editors/transform/transform_constraints.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/transform/transform_constraints.c
+ * \ingroup edtransform
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -186,11 +191,11 @@ static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3
if(in[0]==0.0f && in[1]==0.0f && in[2]==0.0f)
return;
- angle = fabs(angle_v3v3(axis, t->viewinv[2]));
- if (angle > M_PI / 2) {
- angle = M_PI - angle;
+ angle = fabsf(angle_v3v3(axis, t->viewinv[2]));
+ if (angle > (float)M_PI / 2.0f) {
+ angle = (float)M_PI - angle;
}
- angle = 180.0f * angle / M_PI;
+ angle = RAD2DEGF(angle);
/* For when view is parallel to constraint... will cause NaNs otherwise
So we take vertical motion in 3D space and apply it to the
@@ -223,12 +228,12 @@ static void axisProjection(TransInfo *t, float axis[3], float in[3], float out[3
/* give arbitrary large value if projection is impossible */
factor = dot_v3v3(axis, norm);
- if (1 - fabs(factor) < 0.0002f) {
+ if (1.0f - fabsf(factor) < 0.0002f) {
VECCOPY(out, axis);
if (factor > 0) {
- mul_v3_fl(out, 1000000000);
+ mul_v3_fl(out, 1000000000.0f);
} else {
- mul_v3_fl(out, -1000000000);
+ mul_v3_fl(out, -1000000000.0f);
}
} else {
add_v3_v3v3(v2, t->con.center, axis);
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 3b3a5a6877e..2b308ffeb70 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/transform/transform_conversions.c
+ * \ingroup edtransform
+ */
+
+
#ifndef WIN32
#include <unistd.h>
#else
@@ -95,6 +100,7 @@
#include "BLI_editVert.h"
#include "BLI_array.h"
#include "BLI_utildefines.h"
+#include "BLI_smallhash.h"
#include "RNA_access.h"
@@ -359,7 +365,7 @@ static bKinematicConstraint *has_targetless_ik(bPoseChannel *pchan)
bConstraint *con= pchan->constraints.first;
for(;con; con= con->next) {
- if(con->type==CONSTRAINT_TYPE_KINEMATIC && (con->enforce!=0.0)) {
+ if(con->type==CONSTRAINT_TYPE_KINEMATIC && (con->enforce!=0.0f)) {
bKinematicConstraint *data= con->data;
if(data->tar==NULL)
@@ -760,7 +766,7 @@ static void pchan_autoik_adjust (bPoseChannel *pchan, short chainlen)
/* check if pchan has ik-constraint */
for (con= pchan->constraints.first; con; con= con->next) {
- if (con->type == CONSTRAINT_TYPE_KINEMATIC && (con->enforce!=0.0)) {
+ if (con->type == CONSTRAINT_TYPE_KINEMATIC && (con->enforce!=0.0f)) {
bKinematicConstraint *data= con->data;
/* only accept if a temporary one (for auto-ik) */
@@ -1745,10 +1751,10 @@ static void createTransParticleVerts(bContext *C, TransInfo *t)
td->ival = *(key->time);
/* abuse size and quat for min/max values */
td->flag |= TD_NO_EXT;
- if(k==0) tx->size = 0;
+ if(k==0) tx->size = NULL;
else tx->size = (key - 1)->time;
- if(k == point->totkey - 1) tx->quat = 0;
+ if(k == point->totkey - 1) tx->quat = NULL;
else tx->quat = (key + 1)->time;
}
@@ -1812,94 +1818,76 @@ void flushTransParticles(TransInfo *t)
/* proportional distance based on connectivity */
#define THRESHOLD 0.0001f
-static int connectivity_edge(float mtx[][3], EditVert *v1, EditVert *v2)
+/*I did this wrong, it should be a breadth-first search
+ but instead it's a depth-first search, fudged
+ to report shortest distances. I have no idea how fast
+ or slow this is.*/
+static void editmesh_set_connectivity_distance(BMEditMesh *em, float mtx[][3], float *dists)
{
- float edge_vec[3];
- float edge_len;
- int done = 0;
-
- /* note: hidden verts are not being checked for, this assumes
- * flushing of hidden faces & edges is working right */
+ BMVert **stack = NULL;
+ float *dstack = NULL;
+ BLI_array_declare(stack);
+ BLI_array_declare(dstack);
+ SmallHash svisit, *visit=&svisit;
+ BMVert *v;
+ BMIter viter;
+ int i;
- if (v1->f2 + v2->f2 == 4)
- return 0;
+ BLI_smallhash_init(visit);
- sub_v3_v3v3(edge_vec, v1->co, v2->co);
- mul_m3_v3(mtx, edge_vec);
-
- edge_len = len_v3(edge_vec);
-
- if (v1->f2) {
- if (v2->f2) {
- if (v2->tmp.fp + edge_len + THRESHOLD < v1->tmp.fp) {
- v1->tmp.fp = v2->tmp.fp + edge_len;
- done = 1;
- } else if (v1->tmp.fp + edge_len + THRESHOLD < v2->tmp.fp) {
- v2->tmp.fp = v1->tmp.fp + edge_len;
- done = 1;
- }
- }
- else {
- v2->f2 = 1;
- v2->tmp.fp = v1->tmp.fp + edge_len;
- done = 1;
- }
- }
- else if (v2->f2) {
- v1->f2 = 1;
- v1->tmp.fp = v2->tmp.fp + edge_len;
- done = 1;
- }
-
- return done;
-}
-
-static void editmesh_set_connectivity_distance(EditMesh *em, float mtx[][3])
-{
- EditVert *eve;
- EditEdge *eed;
- EditFace *efa;
- int done= 1;
-
- /* f2 flag is used for 'selection' */
- /* tmp.l is offset on scratch array */
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->h==0) {
- eve->tmp.fp = 0;
-
- if(eve->f & SELECT) {
- eve->f2= 2;
- }
- else {
- eve->f2 = 0;
- }
- }
+ i = 0;
+ BM_ITER(v, &viter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BMINDEX_SET(v, i);
+ dists[i] = FLT_MAX;
+ i++;
}
-
-
- /* Floodfill routine */
- /*
- At worst this is n*n of complexity where n is number of edges
- Best case would be n if the list is ordered perfectly.
- Estimate is n log n in average (so not too bad)
- */
- while(done) {
- done= 0;
-
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->h==0) {
- done |= connectivity_edge(mtx, eed->v1, eed->v2);
- }
- }
-
- /* do internal edges for quads */
- for(efa= em->faces.first; efa; efa= efa->next) {
- if (efa->v4 && efa->h==0) {
- done |= connectivity_edge(mtx, efa->v1, efa->v3);
- done |= connectivity_edge(mtx, efa->v2, efa->v4);
+
+ BM_ITER(v, &viter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BMVert *v2;
+
+ if (BLI_smallhash_haskey(visit, (uintptr_t)v) || BM_TestHFlag(v, BM_SELECT)==0 || BM_TestHFlag(v, BM_HIDDEN))
+ continue;
+
+ BLI_array_empty(stack);
+ BLI_array_append(stack, v);
+ BLI_smallhash_insert(visit, (uintptr_t)v, NULL);
+ BLI_array_append(dstack, 0.0f);
+
+ while (BLI_array_count(stack)) {
+ BMIter eiter;
+ BMEdge *e;
+ BMVert *v3;
+ float d, d2, vec[3];
+
+ v2 = BLI_array_pop(stack);
+
+ d = dstack[BLI_array_count(dstack)-1];
+ BLI_array_pop(dstack);
+
+ dists[BMINDEX_GET(v2)] = d;
+ BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v2) {
+ float d2;
+ v3 = BM_OtherEdgeVert(e, v2);
+
+ sub_v3_v3v3(vec, v2->co, v3->co);
+ mul_m3_v3(mtx, vec);
+
+ d2 = d + len_v3(vec);
+
+ if (d2 >= dists[BMINDEX_GET(v3)] && BLI_smallhash_haskey(visit, (uintptr_t)v3))
+ continue;
+
+ BLI_smallhash_insert(visit, (uintptr_t)v3, NULL);
+
+ BLI_array_append(stack, v3);
+ BLI_array_append(dstack, d2);
}
}
}
+
+ BLI_smallhash_release(visit);
+ BLI_array_free(stack);
+ BLI_array_free(dstack);
}
/* loop-in-a-loop I know, but we need it! (ton) */
@@ -2052,106 +2040,6 @@ static void set_crazy_vertex_quat(float *quat, float *v1, float *v2, float *v3,
}
#undef TAN_MAKE_VEC
-static void set_crazyspace_quats(BMEditMesh *em, float *origcos, float *mappedcos, float *quats)
-{
-#if 0
- BMVert *eve, *prev;
- BMFace *efa;
- float *v1, *v2, *v3, *v4, *co1, *co2, *co3, *co4;
- intptr_t index= 0;
-
- /* two abused locations in vertices */
- for(eve= em->verts.first; eve; eve= eve->next, index++) {
- eve->tmp.p = NULL;
- eve->prev= (BMVert *)index;
- }
-
- /* first store two sets of tangent vectors in vertices, we derive it just from the face-edges */
- for(efa= em->faces.first; efa; efa= efa->next) {
-
- /* retrieve mapped coordinates */
- v1= mappedcos + 3*(intptr_t)(efa->v1->prev);
- v2= mappedcos + 3*(intptr_t)(efa->v2->prev);
- v3= mappedcos + 3*(intptr_t)(efa->v3->prev);
-
- co1= (origcos)? origcos + 3*(intptr_t)(efa->v1->prev): efa->v1->co;
- co2= (origcos)? origcos + 3*(intptr_t)(efa->v2->prev): efa->v2->co;
- co3= (origcos)? origcos + 3*(intptr_t)(efa->v3->prev): efa->v3->co;
-
- if(efa->v2->tmp.p==NULL && efa->v2->f1) {
- set_crazy_vertex_quat(quats, co2, co3, co1, v2, v3, v1);
- efa->v2->tmp.p= (void*)quats;
- quats+= 4;
- }
-
- if(efa->v4) {
- v4= mappedcos + 3*(intptr_t)(efa->v4->prev);
- co4= (origcos)? origcos + 3*(intptr_t)(efa->v4->prev): efa->v4->co;
-
- if(efa->v1->tmp.p==NULL && efa->v1->f1) {
- set_crazy_vertex_quat(quats, co1, co2, co4, v1, v2, v4);
- efa->v1->tmp.p= (void*)quats;
- quats+= 4;
- }
- if(efa->v3->tmp.p==NULL && efa->v3->f1) {
- set_crazy_vertex_quat(quats, co3, co4, co2, v3, v4, v2);
- efa->v3->tmp.p= (void*)quats;
- quats+= 4;
- }
- if(efa->v4->tmp.p==NULL && efa->v4->f1) {
- set_crazy_vertex_quat(quats, co4, co1, co3, v4, v1, v3);
- efa->v4->tmp.p= (void*)quats;
- quats+= 4;
- }
- }
- else {
- if(efa->v1->tmp.p==NULL && efa->v1->f1) {
- set_crazy_vertex_quat(quats, co1, co2, co3, v1, v2, v3);
- efa->v1->tmp.p= (void*)quats;
- quats+= 4;
- }
- if(efa->v3->tmp.p==NULL && efa->v3->f1) {
- set_crazy_vertex_quat(quats, co3, co1, co2, v3, v1, v2);
- efa->v3->tmp.p= (void*)quats;
- quats+= 4;
- }
- }
- }
-
- /* restore abused prev pointer */
- for(prev= NULL, eve= em->verts.first; eve; prev= eve, eve= eve->next)
- eve->prev= prev;
-#endif
-}
-
-static void createTransBMeshVerts(TransInfo *t, BME_Mesh *bm, BME_TransData_Head *td) {
-#if 0
- BME_Vert *v;
- BME_TransData *vtd;
- TransData *tob;
- int i;
-
- tob = t->data = MEM_callocN(td->len*sizeof(TransData), "TransObData(Bevel tool)");
-
- for (i=0,v=bm->verts.first;v;v=v->next) {
- if ( (vtd = BME_get_transdata(td,v)) ) {
- tob->loc = vtd->loc;
- tob->val = &vtd->factor;
- VECCOPY(tob->iloc,vtd->co);
- VECCOPY(tob->center,vtd->org);
- VECCOPY(tob->axismtx[0],vtd->vec);
- tob->axismtx[1][0] = vtd->max ? *vtd->max : 0;
- tob++;
- i++;
- }
- }
- /* since td is a memarena, it can hold more transdata than actual elements
- * (i.e. we can't depend on td->len to determine the number of actual elements) */
- t->total = i;
-#endif
- t->total = 0;
-}
-
static void createTransEditVerts(bContext *C, TransInfo *t)
{
ToolSettings *ts = CTX_data_tool_settings(C);
@@ -2159,15 +2047,14 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
BMEditMesh *em = ((Mesh *)t->obedit->data)->edit_btmesh;
BMesh *bm = em->bm;
BMVert *eve;
- BMVert **nears = NULL;
BMIter iter;
BMVert *eve_act = NULL;
float *mappedcos = NULL, *quats= NULL;
float mtx[3][3], smtx[3][3], (*defmats)[3][3] = NULL, (*defcos)[3] = NULL;
- float *vectors=NULL;
+ float *dists=NULL;
int count=0, countsel=0, a, totleft, *selstate = NULL;
BLI_array_declare(selstate);
- int propmode = t->flag & T_PROP_EDIT;
+ int propmode = t->flag & (T_PROP_EDIT|T_PROP_CONNECTED);
int mirror = 0;
short selectmode = ts->selectmode;
@@ -2254,8 +2141,8 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
t->total = count;
/* allocating scratch arrays */
- vectors = (float *)MEM_mallocN(t->total * 3 * sizeof(float), "scratch vectors");
- nears = (BMVert**)MEM_mallocN(t->total * sizeof(BMVert*), "scratch nears");
+ if (propmode & T_PROP_CONNECTED)
+ dists = MEM_mallocN(em->bm->totvert * sizeof(float), "scratch nears");
}
else t->total = countsel;
@@ -2264,31 +2151,29 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
copy_m3_m4(mtx, t->obedit->obmat);
invert_m3_m3(smtx, mtx);
- //BMESH_TODO if(propmode) editmesh_set_connectivity_distance(em, t->total, vectors, nears);
+ if(propmode & T_PROP_CONNECTED)
+ editmesh_set_connectivity_distance(em, mtx, dists);
/* detect CrazySpace [tm] */
- if(propmode==0) {
- if(modifiers_getCageIndex(t->scene, t->obedit, NULL, 1)>=0) {
- if(modifiers_isCorrectableDeformed(t->obedit)) {
- /* check if we can use deform matrices for modifier from the
- start up to stack, they are more accurate than quats */
-
- totleft= editbmesh_get_first_deform_matrices(t->scene, t->obedit, em, &defmats, &defcos);
-
- /* if we still have more modifiers, also do crazyspace
- correction with quats, relative to the coordinates after
- the modifiers that support deform matrices (defcos) */
- if(totleft > 0) {
- mappedcos= crazyspace_get_mapped_editverts(t->scene, t->obedit);
- quats= MEM_mallocN( (t->total)*sizeof(float)*4, "crazy quats");
- crazyspace_set_quats_editmesh(em, (float*)defcos, mappedcos, quats);
- if(mappedcos)
- MEM_freeN(mappedcos);
- }
-
- if(defcos)
- MEM_freeN(defcos);
+ if(modifiers_getCageIndex(t->scene, t->obedit, NULL, 1)>=0) {
+ if(modifiers_isCorrectableDeformed(t->obedit)) {
+ /* check if we can use deform matrices for modifier from the
+ start up to stack, they are more accurate than quats */
+ totleft= editbmesh_get_first_deform_matrices(t->scene, t->obedit, em, &defmats, &defcos);
+
+ /* if we still have more modifiers, also do crazyspace
+ correction with quats, relative to the coordinates after
+ the modifiers that support deform matrices (defcos) */
+ if(totleft > 0) {
+ mappedcos= crazyspace_get_mapped_editverts(t->scene, t->obedit);
+ quats= MEM_mallocN( (t->total)*sizeof(float)*4, "crazy quats");
+ crazyspace_set_quats_editmesh(em, (float*)defcos, mappedcos, quats);
+ if(mappedcos)
+ MEM_freeN(mappedcos);
}
+
+ if(defcos)
+ MEM_freeN(defcos);
}
}
@@ -2325,26 +2210,21 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
if(eve == eve_act) tob->flag |= TD_ACTIVE;
if(propmode) {
- /*BMESH_TODO
- this has to do with edge connectivity
- PEP mode, I think. -joeedh
- if (eve->f2) {
- tob->dist= eve->tmp.fp;
- }
- else {*/
+ if (propmode & T_PROP_CONNECTED) {
+ tob->dist = dists[a];
+ } else {
tob->flag |= TD_NOTCONNECTED;
tob->dist = MAXFLOAT;
- //}
+ }
}
/* CrazySpace */
- if(defmats) { // || (quats && eve->tmp.p)) {
- float mat[3][3], imat[3][3];
+ if(defmats || (quats && BMINDEX_GET(eve) != -1)) {
+ float mat[3][3], qmat[3][3], imat[3][3];
/* use both or either quat and defmat correction */
- //BMESH_TODO, need to restore this quats thing
- /*if(quats && eve->tmp.f) {
- quat_to_mat3( qmat,eve->tmp.p);
+ if(quats && BMINDEX_GET(eve) != -1) {
+ quat_to_mat3(qmat, quats + 4*BMINDEX_GET(eve));
if(defmats)
mul_serie_m3(mat, mtx, qmat, defmats[a],
@@ -2352,7 +2232,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
else
mul_m3_m3m3(mat, mtx, qmat);
}
- else*/
+ else
mul_m3_m3m3(mat, mtx, defmats[a]);
invert_m3_m3(imat, mat);
@@ -2397,7 +2277,9 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
MEM_freeN(quats);
if(defmats)
MEM_freeN(defmats);
-
+ if (dists)
+ MEM_freeN(dists);
+
BLI_array_free(selstate);
if (t->flag & T_MIRROR)
@@ -2851,6 +2733,7 @@ static void createTransNlaData(bContext *C, TransInfo *t)
unit_m3(td->smtx);
}
else {
+ /* time scaling only needs single value */
td->val= &tdn->h1[0];
td->ival= tdn->h1[0];
}
@@ -2882,6 +2765,7 @@ static void createTransNlaData(bContext *C, TransInfo *t)
unit_m3(td->smtx);
}
else {
+ /* time scaling only needs single value */
td->val= &tdn->h2[0];
td->ival= tdn->h2[0];
}
@@ -2902,7 +2786,7 @@ static void createTransNlaData(bContext *C, TransInfo *t)
}
}
}
-
+
/* cleanup temp list */
BLI_freelistN(&anim_data);
}
@@ -3040,7 +2924,7 @@ static void posttrans_fcurve_clean (FCurve *fcu)
if (BEZSELECTED(bezt) == 0) {
/* check beztriple should be removed according to cache */
for (index= 0; index < len; index++) {
- if (IS_EQ(bezt->vec[1][0], selcache[index])) {
+ if (IS_EQF(bezt->vec[1][0], selcache[index])) {
delete_fcurve_key(fcu, i, 0);
break;
}
@@ -3213,7 +3097,7 @@ void flushTransGPactionData (TransInfo *t)
/* flush data! */
for (i = 0; i < t->total; i++, tfd++) {
- *(tfd->sdata)= (int)floor(tfd->val + 0.5);
+ *(tfd->sdata)= (int)floor(tfd->val + 0.5f);
}
}
@@ -3596,8 +3480,8 @@ static void createTransGraphEditData(bContext *C, TransInfo *t)
mul_v3_fl(mtx[1], yscale);
/* smtx is global (i.e. view) to data conversion */
- if (IS_EQ(xscale, 0.0f) == 0) mul_v3_fl(smtx[0], 1.0f/xscale);
- if (IS_EQ(yscale, 0.0f) == 0) mul_v3_fl(smtx[1], 1.0f/yscale);
+ if (IS_EQF(xscale, 0.0f) == 0) mul_v3_fl(smtx[0], 1.0f/xscale);
+ if (IS_EQF(yscale, 0.0f) == 0) mul_v3_fl(smtx[1], 1.0f/yscale);
}
/* loop 2: build transdata arrays */
@@ -3779,11 +3663,12 @@ static void sort_time_beztmaps (BeztMap *bezms, int totvert, const short UNUSED(
}
/* This function firstly adjusts the pointers that the transdata has to each BezTriple */
-static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totvert, const short use_handle)
+static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totvert, const short UNUSED(use_handle))
{
BezTriple *bezts = fcu->bezt;
BeztMap *bezm;
- TransData2D *td;
+ TransData2D *td2d;
+ TransData *td;
int i, j;
char *adjusted;
@@ -3799,43 +3684,50 @@ static void beztmap_to_data (TransInfo *t, FCurve *fcu, BeztMap *bezms, int totv
/* loop through transdata, testing if we have a hit
* for the handles (vec[0]/vec[2]), we must also check if they need to be swapped...
*/
- td= t->data2d;
- for (j= 0; j < t->total; j++, td++) {
+ td2d= t->data2d;
+ td= t->data;
+ for (j= 0; j < t->total; j++, td2d++, td++) {
/* skip item if already marked */
if (adjusted[j] != 0) continue;
- /* only selected verts */
- if (bezm->pipo == BEZT_IPO_BEZ) {
- if (use_handle && bezm->bezt->f1 & SELECT) {
- if (td->loc2d == bezm->bezt->vec[0]) {
- if (bezm->swapHs == 1)
- td->loc2d= (bezts + bezm->newIndex)->vec[2];
- else
- td->loc2d= (bezts + bezm->newIndex)->vec[0];
- adjusted[j] = 1;
- }
- }
+ /* update all transdata pointers, no need to check for selections etc,
+ * since only points that are really needed were created as transdata
+ */
+ if (td2d->loc2d == bezm->bezt->vec[0]) {
+ if (bezm->swapHs == 1)
+ td2d->loc2d= (bezts + bezm->newIndex)->vec[2];
+ else
+ td2d->loc2d= (bezts + bezm->newIndex)->vec[0];
+ adjusted[j] = 1;
}
- if (bezm->cipo == BEZT_IPO_BEZ) {
- if (use_handle && bezm->bezt->f3 & SELECT) {
- if (td->loc2d == bezm->bezt->vec[2]) {
- if (bezm->swapHs == 1)
- td->loc2d= (bezts + bezm->newIndex)->vec[0];
- else
- td->loc2d= (bezts + bezm->newIndex)->vec[2];
- adjusted[j] = 1;
- }
- }
+ else if (td2d->loc2d == bezm->bezt->vec[2]) {
+ if (bezm->swapHs == 1)
+ td2d->loc2d= (bezts + bezm->newIndex)->vec[0];
+ else
+ td2d->loc2d= (bezts + bezm->newIndex)->vec[2];
+ adjusted[j] = 1;
}
- if (bezm->bezt->f2 & SELECT) {
- if (td->loc2d == bezm->bezt->vec[1]) {
- td->loc2d= (bezts + bezm->newIndex)->vec[1];
+ else if (td2d->loc2d == bezm->bezt->vec[1]) {
+ td2d->loc2d= (bezts + bezm->newIndex)->vec[1];
- /* if only control point is selected, the handle pointers need to be updated as well */
- td->h1= (bezts + bezm->newIndex)->vec[0];
- td->h2= (bezts + bezm->newIndex)->vec[2];
+ /* if only control point is selected, the handle pointers need to be updated as well */
+ if(td2d->h1)
+ td2d->h1= (bezts + bezm->newIndex)->vec[0];
+ if(td2d->h2)
+ td2d->h2= (bezts + bezm->newIndex)->vec[2];
- adjusted[j] = 1;
+ adjusted[j] = 1;
+ }
+
+ /* the handle type pointer has to be updated too */
+ if (adjusted[j] && td->flag & TD_BEZTRIPLE && td->hdata) {
+ if(bezm->swapHs == 1) {
+ td->hdata->h1 = &(bezts + bezm->newIndex)->h2;
+ td->hdata->h2 = &(bezts + bezm->newIndex)->h1;
+ }
+ else {
+ td->hdata->h1 = &(bezts + bezm->newIndex)->h1;
+ td->hdata->h2 = &(bezts + bezm->newIndex)->h2;
}
}
}
@@ -3867,6 +3759,7 @@ void remake_graph_transdata (TransInfo *t, ListBase *anim_data)
BeztMap *bezm;
/* adjust transform-data pointers */
+ /* note, none of these functions use 'use_handle', it could be removed */
bezm= bezt_to_beztmaps(fcu->bezt, fcu->totvert, use_handle);
sort_time_beztmaps(bezm, fcu->totvert, use_handle);
beztmap_to_data(t, fcu, bezm, fcu->totvert, use_handle);
@@ -4366,7 +4259,7 @@ static short constraints_list_needinv(TransInfo *t, ListBase *list)
if (list) {
for (con= list->first; con; con=con->next) {
/* only consider constraint if it is enabled, and has influence on result */
- if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0)) {
+ if ((con->flag & CONSTRAINT_DISABLE)==0 && (con->enforce!=0.0f)) {
/* (affirmative) returns for specific constraints here... */
/* constraints that require this regardless */
if (con->type == CONSTRAINT_TYPE_CHILDOF) return 1;
@@ -4908,7 +4801,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
Object *ob;
// short redrawipo=0, resetslowpar=1;
int cancelled= (t->state == TRANS_CANCEL);
- short duplicate= (t->undostr && strstr(t->undostr, "Duplicate")) ? 1 : 0; /* see bugreport #21229 for reasons for this data */
+ short duplicate= (t->mode == TFM_TIME_DUPLICATE);
/* early out when nothing happened */
if (t->total == 0 || t->mode == TFM_DUMMY)
@@ -4936,10 +4829,10 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
if(t->mode == TFM_SEQ_SLIDE) {
if(t->frame_side == 'B')
- scene_marker_tfm_translate(t->scene, floor(t->values[0] + 0.5f), SELECT);
+ ED_markers_post_apply_transform(&t->scene->markers, t->scene, TFM_TIME_TRANSLATE, t->vec[0], t->frame_side);
}
else if (ELEM(t->frame_side, 'L', 'R')) {
- scene_marker_tfm_extend(t->scene, floor(t->vec[0] + 0.5f), SELECT, t->scene->r.cfra, t->frame_side);
+ ED_markers_post_apply_transform(&t->scene->markers, t->scene, TFM_TIME_EXTEND, t->vec[0], t->frame_side);
}
}
@@ -4970,6 +4863,11 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
+ /* 3 cases here for curve cleanups:
+ * 1) NOTRANSKEYCULL on -> cleanup of duplicates shouldn't be done
+ * 2) cancelled == 0 -> user confirmed the transform, so duplicates should be removed
+ * 3) cancelled + duplicate -> user cancelled the transform, but we made duplicates, so get rid of these
+ */
if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
((cancelled == 0) || (duplicate)) )
{
@@ -4996,34 +4894,26 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
DAG_id_tag_update(&ob->id, OB_RECALC_OB);
}
- /* Do curve cleanups? */
+ /* 3 cases here for curve cleanups:
+ * 1) NOTRANSKEYCULL on -> cleanup of duplicates shouldn't be done
+ * 2) cancelled == 0 -> user confirmed the transform, so duplicates should be removed
+ * 3) cancelled + duplicate -> user cancelled the transform, but we made duplicates, so get rid of these
+ */
if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
((cancelled == 0) || (duplicate)) )
{
posttrans_action_clean(&ac, (bAction *)ac.data);
}
}
-
- /* marker transform, not especially nice but we may want to move markers
- * at the same time as keyframes in the dope sheet. */
- if ((saction->flag & SACTION_MARKERS_MOVE) && (cancelled == 0)) {
- /* cant use , TFM_TIME_EXTEND
- * for some reason EXTEND is changed into TRANSLATE, so use frame_side instead */
-
- if(t->mode == TFM_TIME_TRANSLATE) {
- if(t->frame_side == 'B')
- scene_marker_tfm_translate(t->scene, floor(t->vec[0] + 0.5f), SELECT);
- else if (ELEM(t->frame_side, 'L', 'R'))
- scene_marker_tfm_extend(t->scene, floor(t->vec[0] + 0.5f), SELECT, t->scene->r.cfra, t->frame_side);
- }
- else if(t->mode == TFM_TIME_SCALE) {
- scene_marker_tfm_scale(t->scene, t->vec[0], SELECT);
- }
- }
-
else if (ac.datatype == ANIMCONT_GPENCIL) {
/* remove duplicate frames and also make sure points are in order! */
- if ((cancelled == 0) || (duplicate))
+ /* 3 cases here for curve cleanups:
+ * 1) NOTRANSKEYCULL on -> cleanup of duplicates shouldn't be done
+ * 2) cancelled == 0 -> user confirmed the transform, so duplicates should be removed
+ * 3) cancelled + duplicate -> user cancelled the transform, but we made duplicates, so get rid of these
+ */
+ if ( (saction->flag & SACTION_NOTRANSKEYCULL)==0 &&
+ ((cancelled == 0) || (duplicate)) )
{
bGPdata *gpd;
@@ -5036,6 +4926,21 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
}
+ /* marker transform, not especially nice but we may want to move markers
+ * at the same time as keyframes in the dope sheet.
+ */
+ if ((saction->flag & SACTION_MARKERS_MOVE) && (cancelled == 0)) {
+ if (t->mode == TFM_TIME_TRANSLATE) {
+ if (ELEM(t->frame_side, 'L', 'R')) /* TFM_TIME_EXTEND */
+ ED_markers_post_apply_transform(ED_context_get_markers(C), t->scene, t->mode, t->vec[0], t->frame_side);
+ else /* TFM_TIME_TRANSLATE */
+ ED_markers_post_apply_transform(ED_context_get_markers(C), t->scene, t->mode, t->vec[0], t->frame_side);
+ }
+ else if (t->mode == TFM_TIME_SCALE) {
+ ED_markers_post_apply_transform(ED_context_get_markers(C), t->scene, t->mode, t->vec[0], t->frame_side);
+ }
+ }
+
/* make sure all F-Curves are set correctly */
ANIM_editkeyframes_refresh(&ac);
@@ -5063,13 +4968,18 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
AnimData *adt= ANIM_nla_mapping_get(&ac, ale);
FCurve *fcu= (FCurve *)ale->key_data;
+ /* 3 cases here for curve cleanups:
+ * 1) NOTRANSKEYCULL on -> cleanup of duplicates shouldn't be done
+ * 2) cancelled == 0 -> user confirmed the transform, so duplicates should be removed
+ * 3) cancelled + duplicate -> user cancelled the transform, but we made duplicates, so get rid of these
+ */
if ( (sipo->flag & SIPO_NOTRANSKEYCULL)==0 &&
((cancelled == 0) || (duplicate)) )
{
if (adt) {
- ANIM_nla_mapping_apply_fcurve(adt, fcu, 0, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, fcu, 0, 0);
posttrans_fcurve_clean(fcu);
- ANIM_nla_mapping_apply_fcurve(adt, fcu, 1, 1);
+ ANIM_nla_mapping_apply_fcurve(adt, fcu, 1, 0);
}
else
posttrans_fcurve_clean(fcu);
@@ -5295,7 +5205,7 @@ static void createTransObject(struct bContext *C, TransInfo *t)
}
/* select linked objects, but skip them later */
- if (ob->id.lib != 0) {
+ if (ob->id.lib != NULL) {
td->flag |= TD_SKIP;
}
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index cf66a9f9d93..efff37c74ea 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/transform/transform_generics.c
+ * \ingroup edtransform
+ */
+
+
#include <string.h>
#include <math.h>
@@ -334,7 +339,7 @@ void recalcData(TransInfo *t)
Scene *scene= t->scene;
SpaceAction *saction= (SpaceAction *)t->sa->spacedata.first;
- bAnimContext ac= {0};
+ bAnimContext ac= {NULL};
ListBase anim_data = {NULL, NULL};
bAnimListElem *ale;
int filter;
@@ -962,7 +967,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
t->options |= CTX_EDGE;
}
- t->spacetype = sa->spacetype;
+ t->spacetype = sa ? sa->spacetype : SPACE_EMPTY; /* background mode */
if(t->spacetype == SPACE_VIEW3D)
{
View3D *v3d = sa->spacedata.first;
@@ -1006,7 +1011,7 @@ int initTransInfo (bContext *C, TransInfo *t, wmOperator *op, wmEvent *event)
SpaceImage *sima = sa->spacedata.first;
// XXX for now, get View2D from the active region
t->view = &ar->v2d;
- t->around = sima->around;
+ t->around = (sima ? sima->around : 0);
}
else if(t->spacetype==SPACE_IPO)
{
diff --git a/source/blender/editors/transform/transform_input.c b/source/blender/editors/transform/transform_input.c
index 486fed91e3e..45ed983fce5 100644
--- a/source/blender/editors/transform/transform_input.c
+++ b/source/blender/editors/transform/transform_input.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/transform/transform_input.c
+ * \ingroup edtransform
+ */
+
+
#include <stdlib.h>
#include <math.h>
@@ -87,8 +92,9 @@ static void InputSpringFlip(TransInfo *t, MouseInput *mi, short mval[2], float o
InputSpring(t, mi, mval, output);
/* flip scale */
- if ((mi->center[0] - mval[0]) * (mi->center[0] - mi->imval[0]) +
- (mi->center[1] - mval[1]) * (mi->center[1] - mi->imval[1]) < 0)
+ /* values can become really big when zoomed in so use longs [#26598] */
+ if ((long long int)(mi->center[0] - mval[0]) * (long long int)(mi->center[0] - mi->imval[0]) +
+ (long long int)(mi->center[1] - mval[1]) * (long long int)(mi->center[1] - mi->imval[1]) < 0)
{
output[0] *= -1.0f;
}
@@ -268,7 +274,7 @@ static void InputAngle(TransInfo *UNUSED(t), MouseInput *mi, short mval[2], floa
mi->imval[1] = mval[1];
}
- *angle += dphi;
+ *angle += (double)dphi;
output[0] = *angle;
}
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index a281b388084..607fd59e0ec 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/transform/transform_manipulator.c
+ * \ingroup edtransform
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <math.h>
@@ -558,29 +563,29 @@ static void test_manipulator_axis(const bContext *C)
viewvector(rv3d, rv3d->twmat[3], vec);
angle = fabs(angle_v3v3(rv3d->twmat[0], vec));
- if (angle > M_PI / 2) {
- angle = M_PI - angle;
+ if (angle > (float)M_PI / 2.0f) {
+ angle = (float)M_PI - angle;
}
- angle = rv3d->twangle[0] = 180.0f * angle / M_PI;
- if (angle < 5) {
+ angle = rv3d->twangle[0] = RAD2DEGF(angle);
+ if (angle < 5.0f) {
rv3d->twdrawflag &= ~(MAN_TRANS_X|MAN_SCALE_X);
}
angle = fabs(angle_v3v3(rv3d->twmat[1], vec));
- if (angle > M_PI / 2) {
- angle = M_PI - angle;
+ if (angle > (float)M_PI / 2.0f) {
+ angle = (float)M_PI - angle;
}
- angle = rv3d->twangle[1] = 180.0f * angle / M_PI;
- if (angle < 5) {
+ angle = rv3d->twangle[1] = RAD2DEGF(angle);
+ if (angle < 5.0f) {
rv3d->twdrawflag &= ~(MAN_TRANS_Y|MAN_SCALE_Y);
}
angle = fabs(angle_v3v3(rv3d->twmat[2], vec));
- if (angle > M_PI / 2) {
- angle = M_PI - angle;
+ if (angle > (float)M_PI / 2.0f) {
+ angle = (float)M_PI - angle;
}
- angle = rv3d->twangle[2] = 180.0f * angle / M_PI;
- if (angle < 5) {
+ angle = rv3d->twangle[2] = RAD2DEGF(angle);
+ if (angle < 5.0f) {
rv3d->twdrawflag &= ~(MAN_TRANS_Z|MAN_SCALE_Z);
}
}
@@ -830,7 +835,7 @@ static void draw_manipulator_rotate(View3D *v3d, RegionView3D *rv3d, int moving,
if(arcs) {
/* clipplane makes nice handles, calc here because of multmatrix but with translate! */
VECCOPY(plane, rv3d->viewinv[2]);
- plane[3]= -0.02*size; // clip just a bit more
+ plane[3]= -0.02f*size; // clip just a bit more
glClipPlane(GL_CLIP_PLANE0, plane);
}
/* sets view screen aligned */
@@ -1564,7 +1569,6 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, short *mval, float ho
return 0;
}
-int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties, ReportList *reports);
/* return 0; nothing happened */
int BIF_do_manipulator(bContext *C, struct wmEvent *event, wmOperator *op)
@@ -1621,7 +1625,7 @@ int BIF_do_manipulator(bContext *C, struct wmEvent *event, wmOperator *op)
}
RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis);
WM_operator_name_call(C, "TRANSFORM_OT_translate", WM_OP_INVOKE_DEFAULT, op->ptr);
- //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_translate", 0), event, op->ptr, NULL);
+ //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_translate", 0), event, op->ptr, NULL, FALSE);
}
else if (drawflags & MAN_SCALE_C) {
switch(drawflags) {
@@ -1652,11 +1656,11 @@ int BIF_do_manipulator(bContext *C, struct wmEvent *event, wmOperator *op)
}
RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis);
WM_operator_name_call(C, "TRANSFORM_OT_resize", WM_OP_INVOKE_DEFAULT, op->ptr);
- //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_resize", 0), event, op->ptr, NULL);
+ //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_resize", 0), event, op->ptr, NULL, FALSE);
}
else if (drawflags == MAN_ROT_T) { /* trackball need special case, init is different */
- //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_trackball", 0), event, op->ptr, NULL);
WM_operator_name_call(C, "TRANSFORM_OT_trackball", WM_OP_INVOKE_DEFAULT, op->ptr);
+ //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_trackball", 0), event, op->ptr, NULL, FALSE);
}
else if (drawflags & MAN_ROT_C) {
switch(drawflags) {
@@ -1672,7 +1676,7 @@ int BIF_do_manipulator(bContext *C, struct wmEvent *event, wmOperator *op)
}
RNA_boolean_set_array(op->ptr, "constraint_axis", constraint_axis);
WM_operator_name_call(C, "TRANSFORM_OT_rotate", WM_OP_INVOKE_DEFAULT, op->ptr);
- //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_rotate", 0), event, op->ptr, NULL);
+ //wm_operator_invoke(C, WM_operatortype_find("TRANSFORM_OT_rotate", 0), event, op->ptr, NULL, FALSE);
}
}
/* after transform, restore drawflags */
diff --git a/source/blender/editors/transform/transform_ndofinput.c b/source/blender/editors/transform/transform_ndofinput.c
index f9ac1bd38d1..c5946163770 100644
--- a/source/blender/editors/transform/transform_ndofinput.c
+++ b/source/blender/editors/transform/transform_ndofinput.c
@@ -23,6 +23,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/transform/transform_ndofinput.c
+ * \ingroup edtransform
+ */
+
#include <math.h> /* fabs */
#include <stdio.h> /* for sprintf */
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index e1dd0191c0d..4edaabb9508 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/transform/transform_ops.c
+ * \ingroup edtransform
+ */
+
+
#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
@@ -41,6 +46,7 @@
#include "WM_types.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "ED_screen.h"
@@ -104,6 +110,39 @@ static TransformModeItem transform_modes[] =
{NULL, 0}
};
+EnumPropertyItem transform_mode_types[] =
+{
+ {TFM_INIT, "INIT", 0, "Init", ""},
+ {TFM_DUMMY, "DUMMY", 0, "Dummy", ""},
+ {TFM_TRANSLATION, "TRANSLATION", 0, "Translation", ""},
+ {TFM_ROTATION, "ROTATION", 0, "Rotation", ""},
+ {TFM_RESIZE, "RESIZE", 0, "Resize", ""},
+ {TFM_TOSPHERE, "TOSPHERE", 0, "Tosphere", ""},
+ {TFM_SHEAR, "SHEAR", 0, "Shear", ""},
+ {TFM_WARP, "WARP", 0, "Warp", ""},
+ {TFM_SHRINKFATTEN, "SHRINKFATTEN", 0, "Shrinkfatten", ""},
+ {TFM_TILT, "TILT", 0, "Tilt", ""},
+ {TFM_TRACKBALL, "TRACKBALL", 0, "Trackball", ""},
+ {TFM_PUSHPULL, "PUSHPULL", 0, "Pushpull", ""},
+ {TFM_CREASE, "CREASE", 0, "Crease", ""},
+ {TFM_MIRROR, "MIRROR", 0, "Mirror", ""},
+ {TFM_BONESIZE, "BONE_SIZE", 0, "Bonesize", ""},
+ {TFM_BONE_ENVELOPE, "BONE_ENVELOPE", 0, "Bone_Envelope", ""},
+ {TFM_CURVE_SHRINKFATTEN, "CURVE_SHRINKFATTEN", 0, "Curve_Shrinkfatten", ""},
+ {TFM_BONE_ROLL, "BONE_ROLL", 0, "Bone_Roll", ""},
+ {TFM_TIME_TRANSLATE, "TIME_TRANSLATE", 0, "Time_Translate", ""},
+ {TFM_TIME_SLIDE, "TIME_SLIDE", 0, "Time_Slide", ""},
+ {TFM_TIME_SCALE, "TIME_SCALE", 0, "Time_Scale", ""},
+ {TFM_TIME_EXTEND, "TIME_EXTEND", 0, "Time_Extend", ""},
+ {TFM_BAKE_TIME, "BAKE_TIME", 0, "Bake_Time", ""},
+ {TFM_BEVEL, "BEVEL", 0, "Bevel", ""},
+ {TFM_BWEIGHT, "BWEIGHT", 0, "Bweight", ""},
+ {TFM_ALIGN, "ALIGN", 0, "Align", ""},
+ {TFM_EDGE_SLIDE, "EDGESLIDE", 0, "Edge Slide", ""},
+ {TFM_SEQ_SLIDE, "SEQSLIDE", 0, "Sequence Slide", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
static int snap_type_exec(bContext *C, wmOperator *op)
{
ToolSettings *ts= CTX_data_tool_settings(C);
@@ -152,7 +191,7 @@ static int select_orientation_invoke(bContext *C, wmOperator *UNUSED(op), wmEven
uiPopupMenu *pup;
uiLayout *layout;
- pup= uiPupMenuBegin(C, "Orientation", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Orientation", ICON_NONE);
layout= uiPupMenuLayout(pup);
uiItemsEnumO(layout, "TRANSFORM_OT_select_orientation", "orientation");
uiPupMenuEnd(C, pup);
@@ -297,7 +336,7 @@ static int transformops_data(bContext *C, wmOperator *op, wmEvent *event)
if (mode == -1)
{
- mode = RNA_int_get(op->ptr, "mode");
+ mode = RNA_enum_get(op->ptr, "mode");
}
retval = initTransform(C, t, op, event, mode);
@@ -369,6 +408,8 @@ static int transform_exec(bContext *C, wmOperator *op)
transformEnd(C, t);
transformops_exit(C, op);
+
+ WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
return OPERATOR_FINISHED;
}
@@ -747,37 +788,7 @@ void TRANSFORM_OT_seq_slide(struct wmOperatorType *ot)
void TRANSFORM_OT_transform(struct wmOperatorType *ot)
{
- static EnumPropertyItem transform_mode_types[] = {
- {TFM_INIT, "INIT", 0, "Init", ""},
- {TFM_DUMMY, "DUMMY", 0, "Dummy", ""},
- {TFM_TRANSLATION, "TRANSLATION", 0, "Translation", ""},
- {TFM_ROTATION, "ROTATION", 0, "Rotation", ""},
- {TFM_RESIZE, "RESIZE", 0, "Resize", ""},
- {TFM_TOSPHERE, "TOSPHERE", 0, "Tosphere", ""},
- {TFM_SHEAR, "SHEAR", 0, "Shear", ""},
- {TFM_WARP, "WARP", 0, "Warp", ""},
- {TFM_SHRINKFATTEN, "SHRINKFATTEN", 0, "Shrinkfatten", ""},
- {TFM_TILT, "TILT", 0, "Tilt", ""},
- {TFM_TRACKBALL, "TRACKBALL", 0, "Trackball", ""},
- {TFM_PUSHPULL, "PUSHPULL", 0, "Pushpull", ""},
- {TFM_CREASE, "CREASE", 0, "Crease", ""},
- {TFM_MIRROR, "MIRROR", 0, "Mirror", ""},
- {TFM_BONESIZE, "BONE_SIZE", 0, "Bonesize", ""},
- {TFM_BONE_ENVELOPE, "BONE_ENVELOPE", 0, "Bone_Envelope", ""},
- {TFM_CURVE_SHRINKFATTEN, "CURVE_SHRINKFATTEN", 0, "Curve_Shrinkfatten", ""},
- {TFM_BONE_ROLL, "BONE_ROLL", 0, "Bone_Roll", ""},
- {TFM_TIME_TRANSLATE, "TIME_TRANSLATE", 0, "Time_Translate", ""},
- {TFM_TIME_SLIDE, "TIME_SLIDE", 0, "Time_Slide", ""},
- {TFM_TIME_SCALE, "TIME_SCALE", 0, "Time_Scale", ""},
- {TFM_TIME_EXTEND, "TIME_EXTEND", 0, "Time_Extend", ""},
- {TFM_BAKE_TIME, "BAKE_TIME", 0, "Bake_Time", ""},
- {TFM_BEVEL, "BEVEL", 0, "Bevel", ""},
- {TFM_BWEIGHT, "BWEIGHT", 0, "Bweight", ""},
- {TFM_ALIGN, "ALIGN", 0, "Align", ""},
- {TFM_EDGE_SLIDE, "EDGESLIDE", 0, "Edge Slide", ""},
- {TFM_SEQ_SLIDE, "SEQSLIDE", 0, "Sequence Slide", ""},
- {0, NULL, 0, NULL, NULL}
- };
+ PropertyRNA *prop;
/* identifiers */
ot->name = "Transform";
@@ -792,7 +803,8 @@ void TRANSFORM_OT_transform(struct wmOperatorType *ot)
ot->cancel = transform_cancel;
ot->poll = ED_operator_areaactive;
- RNA_def_enum(ot->srna, "mode", transform_mode_types, 0, "Mode", "");
+ prop= RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", "");
+ RNA_def_property_flag(prop, PROP_HIDDEN);
RNA_def_float_vector(ot->srna, "value", 4, NULL, -FLT_MAX, FLT_MAX, "Values", "", -FLT_MAX, FLT_MAX);
@@ -874,19 +886,19 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
break;
case SPACE_ACTION:
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", GKEY, KM_PRESS, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TIME_TRANSLATE);
+ RNA_enum_set(km->ptr, "mode", TFM_TIME_TRANSLATE);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EVT_TWEAK_S, KM_ANY, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TIME_TRANSLATE);
+ RNA_enum_set(km->ptr, "mode", TFM_TIME_TRANSLATE);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
+ RNA_enum_set(km->ptr, "mode", TFM_TIME_EXTEND);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TIME_SCALE);
+ RNA_enum_set(km->ptr, "mode", TFM_TIME_SCALE);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", TKEY, KM_PRESS, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TIME_SLIDE);
+ RNA_enum_set(km->ptr, "mode", TFM_TIME_SLIDE);
break;
case SPACE_IPO:
WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
@@ -894,7 +906,7 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
+ RNA_enum_set(km->ptr, "mode", TFM_TIME_EXTEND);
WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
@@ -902,24 +914,24 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
break;
case SPACE_NLA:
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", GKEY, KM_PRESS, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TRANSLATION);
+ RNA_enum_set(km->ptr, "mode", TFM_TRANSLATION);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EVT_TWEAK_S, KM_ANY, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TRANSLATION);
+ RNA_enum_set(km->ptr, "mode", TFM_TRANSLATION);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
+ RNA_enum_set(km->ptr, "mode", TFM_TIME_EXTEND);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TIME_SCALE);
+ RNA_enum_set(km->ptr, "mode", TFM_TIME_SCALE);
break;
case SPACE_NODE:
WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_A, KM_ANY, 0, 0);
- RNA_enum_set(km->ptr, "release_confirm", 1);
+ RNA_boolean_set(km->ptr, "release_confirm", 1);
km= WM_keymap_add_item(keymap, OP_TRANSLATION, EVT_TWEAK_S, KM_ANY, 0, 0);
- RNA_enum_set(km->ptr, "release_confirm", 1);
+ RNA_boolean_set(km->ptr, "release_confirm", 1);
WM_keymap_add_item(keymap, OP_ROTATION, RKEY, KM_PRESS, 0, 0);
@@ -931,7 +943,7 @@ void transform_keymap_for_space(wmKeyConfig *keyconf, wmKeyMap *keymap, int spac
WM_keymap_add_item(keymap, OP_SEQ_SLIDE, EVT_TWEAK_S, KM_ANY, 0, 0);
km= WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", EKEY, KM_PRESS, 0, 0);
- RNA_int_set(km->ptr, "mode", TFM_TIME_EXTEND);
+ RNA_enum_set(km->ptr, "mode", TFM_TIME_EXTEND);
break;
case SPACE_IMAGE:
WM_keymap_add_item(keymap, OP_TRANSLATION, GKEY, KM_PRESS, 0, 0);
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index b63d279a42b..46f601e25e1 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/transform/transform_orientations.c
+ * \ingroup edtransform
+ */
+
+
#include <string.h>
#include <ctype.h>
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index 7379eb46a3a..16c2856ff8b 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/editors/transform/transform_snap.c
+ * \ingroup edtransform
+ */
+
#include <stdlib.h>
#include <math.h>
@@ -642,7 +647,7 @@ float RotationBetween(TransInfo *t, float p1[3], float p2[3])
cross_v3_v3v3(tmp, start, end);
- if (dot_v3v3(tmp, axis) < 0.0)
+ if (dot_v3v3(tmp, axis) < 0.0f)
angle = -acos(dot_v3v3(start, end));
else
angle = acos(dot_v3v3(start, end));
@@ -658,11 +663,11 @@ float RotationBetween(TransInfo *t, float p1[3], float p2[3])
angle = atan2(start[1],start[0]) - atan2(end[1],end[0]);
}
- if (angle > M_PI) {
- angle = angle - 2 * M_PI;
+ if (angle > (float)M_PI) {
+ angle = angle - 2 * (float)M_PI;
}
- else if (angle < -(M_PI)) {
- angle = 2 * M_PI + angle;
+ else if (angle < -((float)M_PI)) {
+ angle = 2.0f * (float)M_PI + angle;
}
return angle;
@@ -1131,7 +1136,7 @@ static int snapEdge(ARegion *ar, float v1co[3], short v1no[3], float v2co[3], sh
* this takes care of series of connected edges a bit slanted w.r.t the viewport
* otherwise, it would stick to the verts of the closest edge and not slide along merrily
* */
- if (new_dist <= *dist && new_depth < *depth * 1.001)
+ if (new_dist <= *dist && new_depth < *depth * 1.001f)
{
float n1[3], n2[3];
@@ -1683,7 +1688,7 @@ static void removeDoublesPeel(ListBase *depth_peels)
{
DepthPeel *next_peel = peel->next;
- if (peel && next_peel && ABS(peel->depth - next_peel->depth) < 0.0015)
+ if (peel && next_peel && ABS(peel->depth - next_peel->depth) < 0.0015f)
{
peel->next = next_peel->next;
@@ -1954,7 +1959,7 @@ static void applyGrid(TransInfo *t, float *val, int max_index, float fac[3], Gea
float asp[3] = {1.0f, 1.0f, 1.0f}; // TODO: Remove hard coded limit here (3)
// Early bailing out if no need to snap
- if (fac[action] == 0.0)
+ if (fac[action] == 0.0f)
return;
/* evil hack - snapping needs to be adapted for image aspect ratio */
@@ -1963,6 +1968,6 @@ static void applyGrid(TransInfo *t, float *val, int max_index, float fac[3], Gea
}
for (i=0; i<=max_index; i++) {
- val[i]= fac[action]*asp[i]*(float)floor(val[i]/(fac[action]*asp[i]) +.5);
+ val[i]= fac[action]*asp[i]*(float)floor(val[i]/(fac[action]*asp[i]) +0.5f);
}
}
diff --git a/source/blender/editors/util/crazyspace.c b/source/blender/editors/util/crazyspace.c
index 6b7292fe6c7..13c8204f8a3 100644
--- a/source/blender/editors/util/crazyspace.c
+++ b/source/blender/editors/util/crazyspace.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/util/crazyspace.c
+ * \ingroup edutil
+ */
+
+
#include "MEM_guardedalloc.h"
#include "DNA_scene_types.h"
@@ -46,6 +51,11 @@
#include "ED_util.h"
+typedef struct {
+ float *vertexcos;
+ short *flags;
+} MappedUserData;
+
#define TAN_MAKE_VEC(a, b, c) a[0]= b[0] + 0.2f*(b[0]-c[0]); a[1]= b[1] + 0.2f*(b[1]-c[1]); a[2]= b[2] + 0.2f*(b[2]-c[2])
static void set_crazy_vertex_quat(float *quat, float *v1, float *v2, float *v3, float *def1, float *def2, float *def3)
{
@@ -66,10 +76,16 @@ static void set_crazy_vertex_quat(float *quat, float *v1, float *v2, float *v3,
static void make_vertexcos__mapFunc(void *userData, int index, float *co, float *UNUSED(no_f), short *UNUSED(no_s))
{
- float *vec = userData;
+ MappedUserData *mappedData= (MappedUserData*)userData;
+ float *vec = mappedData->vertexcos;
vec+= 3*index;
- VECCOPY(vec, co);
+ if(!mappedData->flags[index]) {
+ /* we need coord from prototype vertex, not it clones or images,
+ suppose they stored in the beginning of vertex array stored in DM */
+ VECCOPY(vec, co);
+ mappedData->flags[index]= 1;
+ }
}
static int modifiers_disable_subsurf_temporary(Object *ob)
@@ -93,6 +109,9 @@ float *crazyspace_get_mapped_editverts(Scene *scene, Object *obedit)
Mesh *me= obedit->data;
DerivedMesh *dm;
float *vertexcos;
+ int nverts= me->edit_btmesh->bm->totvert;
+ short *flags;
+ MappedUserData userData;
/* disable subsurf temporal, get mapped cos, and enable it */
if(modifiers_disable_subsurf_temporary(obedit)) {
@@ -103,19 +122,73 @@ float *crazyspace_get_mapped_editverts(Scene *scene, Object *obedit)
/* now get the cage */
dm= editbmesh_get_derived_cage(scene, obedit, me->edit_btmesh, CD_MASK_BAREMESH);
- vertexcos= MEM_mallocN(3*sizeof(float)*me->edit_btmesh->bm->totvert, "vertexcos map");
- dm->foreachMappedVert(dm, make_vertexcos__mapFunc, vertexcos);
+ vertexcos= MEM_callocN(3*sizeof(float)*nverts, "vertexcos map");
+ flags= MEM_callocN(sizeof(short)*nverts, "vertexcos flags");
+
+ userData.vertexcos= vertexcos;
+ userData.flags= flags;
+ dm->foreachMappedVert(dm, make_vertexcos__mapFunc, &userData);
dm->release(dm);
/* set back the flag, no new cage needs to be built, transform does it */
modifiers_disable_subsurf_temporary(obedit);
+ MEM_freeN(flags);
+
return vertexcos;
}
void crazyspace_set_quats_editmesh(BMEditMesh *em, float *origcos, float *mappedcos, float *quats)
{
+ BMVert *v;
+ BMIter iter, liter;
+ BMEdge *e;
+ BMLoop *l;
+ float *v1, *v2, *v3, *v4, *co1, *co2, *co3, *co4;
+ int *vert_table = MEM_callocN(sizeof(int)*em->bm->totvert, "vert_table");
+ int index = 0;
+
+ BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BMINDEX_SET(v, index);
+ index++;
+ }
+
+ index = 0;
+ BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_VERT, v) {
+ BMLoop *l2 = BM_OtherFaceLoop(l->e, l->f, v);
+
+ /* retrieve mapped coordinates */
+ v1= mappedcos + 3*BMINDEX_GET(l->v);
+ v2= mappedcos + 3*BMINDEX_GET(BM_OtherEdgeVert(l2->e, l->v));
+ v3= mappedcos + 3*BMINDEX_GET(BM_OtherEdgeVert(l->e, l->v));
+
+ co1= (origcos)? origcos + 3*BMINDEX_GET(l->v) : l->v->co;
+ co2= (origcos)? origcos + 3*BMINDEX_GET(BM_OtherEdgeVert(l2->e, l->v)) : BM_OtherEdgeVert(l2->e, l->v)->co;
+ co3= (origcos)? origcos + 3*BMINDEX_GET(BM_OtherEdgeVert(l->e, l->v)) : BM_OtherEdgeVert(l->e, l->v)->co;
+
+ set_crazy_vertex_quat(quats, v1, v2, v3, co1, co2, co3);
+ quats+= 4;
+
+ vert_table[BMINDEX_GET(l->v)] = index+1;
+
+ index++;
+ break; /*just do one corner*/
+ }
+ }
+
+ index = 0;
+ BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ if (vert_table[index] != 0)
+ BMINDEX_SET(v, vert_table[index]-1);
+ else
+ BMINDEX_SET(v, -1);
+
+ index++;
+ }
+
+ MEM_freeN(vert_table);
#if 0
BMEditVert *eve, *prev;
BMEditFace *efa;
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 314fcdc601b..e83138acf46 100644
--- a/source/blender/editors/util/ed_util.c
+++ b/source/blender/editors/util/ed_util.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/util/ed_util.c
+ * \ingroup edutil
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <math.h>
@@ -52,6 +57,7 @@
#include "ED_util.h"
#include "UI_interface.h"
+#include "UI_resources.h"
#include "WM_types.h"
#include "RNA_access.h"
@@ -151,13 +157,13 @@ void apply_keyb_grid(int shift, int ctrl, float *val, float fac1, float fac2, fl
ctrl= !ctrl;
if(ctrl && shift) {
- if(fac3!= 0.0) *val= fac3*floor(*val/fac3 +.5);
+ if(fac3 != 0.0f) *val= fac3*floorf(*val/fac3 +0.5f);
}
else if(ctrl) {
- if(fac2!= 0.0) *val= fac2*floor(*val/fac2 +.5);
+ if(fac2 != 0.0f) *val= fac2*floorf(*val/fac2 +0.5f);
}
else {
- if(fac1!= 0.0) *val= fac1*floor(*val/fac1 +.5);
+ if(fac1 != 0.0f) *val= fac1*floorf(*val/fac1 +0.5f);
}
}
@@ -179,11 +185,11 @@ void unpack_menu(bContext *C, const char *opname, const char *id_name, const cha
uiLayout *layout;
char line[FILE_MAXDIR + FILE_MAXFILE + 100];
- pup= uiPupMenuBegin(C, "Unpack file", ICON_NULL);
+ pup= uiPupMenuBegin(C, "Unpack file", ICON_NONE);
layout= uiPupMenuLayout(pup);
sprintf(line, "Remove Pack");
- props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
RNA_enum_set(&props_ptr, "method", PF_REMOVE);
RNA_string_set(&props_ptr, "id", id_name);
@@ -197,7 +203,7 @@ void unpack_menu(bContext *C, const char *opname, const char *id_name, const cha
switch(checkPackedFile(local_name, pf)) {
case PF_NOFILE:
sprintf(line, "Create %s", local_name);
- props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
RNA_string_set(&props_ptr, "id", id_name);
@@ -205,7 +211,7 @@ void unpack_menu(bContext *C, const char *opname, const char *id_name, const cha
case PF_EQUAL:
sprintf(line, "Use %s (identical)", local_name);
//uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
- props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
RNA_string_set(&props_ptr, "id", id_name);
@@ -213,13 +219,13 @@ void unpack_menu(bContext *C, const char *opname, const char *id_name, const cha
case PF_DIFFERS:
sprintf(line, "Use %s (differs)", local_name);
//uiItemEnumO(layout, opname, line, 0, "method", PF_USE_LOCAL);
- props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
RNA_enum_set(&props_ptr, "method", PF_USE_LOCAL);
RNA_string_set(&props_ptr, "id", id_name);
sprintf(line, "Overwrite %s", local_name);
//uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_LOCAL);
- props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
RNA_enum_set(&props_ptr, "method", PF_WRITE_LOCAL);
RNA_string_set(&props_ptr, "id", id_name);
break;
@@ -231,27 +237,27 @@ void unpack_menu(bContext *C, const char *opname, const char *id_name, const cha
case PF_NOFILE:
sprintf(line, "Create %s", abs_name);
//uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
RNA_string_set(&props_ptr, "id", id_name);
break;
case PF_EQUAL:
sprintf(line, "Use %s (identical)", abs_name);
//uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
RNA_string_set(&props_ptr, "id", id_name);
break;
case PF_DIFFERS:
sprintf(line, "Use %s (differs)", abs_name);
//uiItemEnumO(layout, opname, line, 0, "method", PF_USE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
RNA_enum_set(&props_ptr, "method", PF_USE_ORIGINAL);
RNA_string_set(&props_ptr, "id", id_name);
sprintf(line, "Overwrite %s", abs_name);
//uiItemEnumO(layout, opname, line, 0, "method", PF_WRITE_ORIGINAL);
- props_ptr= uiItemFullO(layout, opname, line, ICON_NULL, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+ props_ptr= uiItemFullO(layout, opname, line, ICON_NONE, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_O_RETURN_PROPS);
RNA_enum_set(&props_ptr, "method", PF_WRITE_ORIGINAL);
RNA_string_set(&props_ptr, "id", id_name);
break;
diff --git a/source/blender/editors/util/editmode_undo.c b/source/blender/editors/util/editmode_undo.c
index 1e6f7cd8804..6f4bbff8a0b 100644
--- a/source/blender/editors/util/editmode_undo.c
+++ b/source/blender/editors/util/editmode_undo.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/util/editmode_undo.c
+ * \ingroup edutil
+ */
+
+
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/editors/util/numinput.c b/source/blender/editors/util/numinput.c
index 6ae5963564e..1b58a1e2a58 100644
--- a/source/blender/editors/util/numinput.c
+++ b/source/blender/editors/util/numinput.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/util/numinput.c
+ * \ingroup edutil
+ */
+
+
#include <math.h> /* fabs */
#include <stdio.h> /* for sprintf */
@@ -80,7 +85,7 @@ void outputNumInput(NumInput *n, char *str)
else
inv[0] = 0;
- if( n->val[i] > 1e10 || n->val[i] < -1e10 )
+ if( n->val[i] > 1e10f || n->val[i] < -1e10f )
sprintf(&str[j*20], "%s%.4e%c", inv, n->val[i], cur);
else
switch (n->ctrl[i]) {
@@ -276,7 +281,7 @@ char handleNumInput(NumInput *n, wmEvent *event)
if (!n->ctrl[idx])
n->ctrl[idx] = 1;
- if (fabs(n->val[idx]) > 9999999.0f);
+ if (fabsf(n->val[idx]) > 9999999.0f);
else if (n->ctrl[idx] == 1) {
n->val[idx] *= 10;
n->val[idx] += Val;
@@ -298,7 +303,7 @@ char handleNumInput(NumInput *n, wmEvent *event)
}
}
- printf("%f\n", n->val[idx]);
+ // printf("%f\n", n->val[idx]);
/* REDRAW SINCE NUMBERS HAVE CHANGED */
return 1;
diff --git a/source/blender/editors/util/undo.c b/source/blender/editors/util/undo.c
index c2f8ae16cb8..60f551afa6e 100644
--- a/source/blender/editors/util/undo.c
+++ b/source/blender/editors/util/undo.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/util/undo.c
+ * \ingroup edutil
+ */
+
+
#include <stdlib.h>
#include <string.h>
@@ -75,6 +80,9 @@ void ED_undo_push(bContext *C, const char *str)
Object *obedit= CTX_data_edit_object(C);
Object *obact= CTX_data_active_object(C);
+ if (G.f & G_DEBUG)
+ printf("undo push %s\n", str);
+
if(obedit) {
if (U.undosteps == 0) return;
@@ -354,6 +362,11 @@ int ED_undo_operator_repeat(bContext *C, struct wmOperator *op)
if (G.f & G_DEBUG)
printf("redo_cb: operator redo %s\n", op->type->name);
ED_undo_pop_op(C, op);
+
+ if(op->type->check) {
+ op->type->check(C, op); /* ignore return value since its running again anyway */
+ }
+
retval= WM_operator_repeat(C, op);
if((retval & OPERATOR_FINISHED)==0) {
if (G.f & G_DEBUG)
diff --git a/source/blender/editors/util/util_intern.h b/source/blender/editors/util/util_intern.h
index c448377f6b0..9ecfb07d535 100644
--- a/source/blender/editors/util/util_intern.h
+++ b/source/blender/editors/util/util_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/util/util_intern.h
+ * \ingroup edutil
+ */
+
+
#ifndef ED_UTIL_INTERN_H
#define ED_UTIL_INTERN_H
diff --git a/source/blender/editors/uvedit/CMakeLists.txt b/source/blender/editors/uvedit/CMakeLists.txt
index b9e718b3e7d..04b27a37c0d 100644
--- a/source/blender/editors/uvedit/CMakeLists.txt
+++ b/source/blender/editors/uvedit/CMakeLists.txt
@@ -30,6 +30,7 @@ set(INC
../../windowmanager
../../../../intern/guardedalloc
../../../../intern/opennl/extern
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index 04a6cf5c5b0..4986f4b46ba 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/uvedit/uvedit_draw.c
+ * \ingroup eduv
+ */
+
+
#include <float.h>
#include <math.h>
#include <stdlib.h>
@@ -73,35 +78,35 @@ static void drawcursor_sima(SpaceImage *sima, ARegion *ar)
h= zoomy*height/256.0f;
cpack(0xFFFFFF);
- glTranslatef(sima->cursor[0], sima->cursor[1], 0.0f);
- fdrawline(-0.05/w, 0, 0, 0.05/h);
- fdrawline(0, 0.05/h, 0.05/w, 0);
- fdrawline(0.05/w, 0, 0, -0.05/h);
- fdrawline(0, -0.05/h, -0.05/w, 0);
-
+ glTranslatef(sima->cursor[0], sima->cursor[1], 0.0);
+ fdrawline(-0.05f/w, 0, 0, 0.05f/h);
+ fdrawline(0, 0.05f/h, 0.05f/w, 0.0f);
+ fdrawline(0.05f/w, 0.0f, 0.0f, -0.05f/h);
+ fdrawline(0.0f, -0.05f/h, -0.05f/w, 0.0f);
+
setlinestyle(4);
cpack(0xFF);
- fdrawline(-0.05/w, 0, 0, 0.05/h);
- fdrawline(0, 0.05/h, 0.05/w, 0);
- fdrawline(0.05/w, 0, 0, -0.05/h);
- fdrawline(0, -0.05/h, -0.05/w, 0);
-
-
- setlinestyle(0);
+ fdrawline(-0.05f/w, 0.0f, 0.0f, 0.05f/h);
+ fdrawline(0.0f, 0.05f/h, 0.05f/w, 0.0f);
+ fdrawline(0.05f/w, 0.0f, 0.0f, -0.05f/h);
+ fdrawline(0.0f, -0.05f/h, -0.05f/w, 0.0f);
+
+
+ setlinestyle(0.0f);
cpack(0x0);
- fdrawline(-0.020/w, 0, -0.1/w, 0);
- fdrawline(0.1/w, 0, .020/w, 0);
- fdrawline(0, -0.020/h, 0, -0.1/h);
- fdrawline(0, 0.1/h, 0, 0.020/h);
-
+ fdrawline(-0.020f/w, 0.0f, -0.1f/w, 0.0f);
+ fdrawline(0.1f/w, 0.0f, 0.020f/w, 0.0f);
+ fdrawline(0.0f, -0.020f/h, 0.0f, -0.1f/h);
+ fdrawline(0.0f, 0.1f/h, 0.0f, 0.020f/h);
+
setlinestyle(1);
cpack(0xFFFFFF);
- fdrawline(-0.020/w, 0, -0.1/w, 0);
- fdrawline(0.1/w, 0, .020/w, 0);
- fdrawline(0, -0.020/h, 0, -0.1/h);
- fdrawline(0, 0.1/h, 0, 0.020/h);
-
- glTranslatef(-sima->cursor[0], -sima->cursor[1], 0.0f);
+ fdrawline(-0.020f/w, 0.0f, -0.1f/w, 0.0f);
+ fdrawline(0.1f/w, 0.0f, 0.020f/w, 0.0f);
+ fdrawline(0.0f, -0.020f/h, 0.0f, -0.1f/h);
+ fdrawline(0.0f, 0.1f/h, 0.0f, 0.020f/h);
+
+ glTranslatef(-sima->cursor[0], -sima->cursor[1], 0.0);
setlinestyle(0);
}
@@ -254,11 +259,11 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
uvarea = poly_uv_area(tf_uv, efa->len) / totuvarea;
if(area < FLT_EPSILON || uvarea < FLT_EPSILON)
- areadiff = 1.0;
+ areadiff = 1.0f;
else if(area>uvarea)
- areadiff = 1.0-(uvarea/area);
+ areadiff = 1.0f-(uvarea/area);
else
- areadiff = 1.0-(area/uvarea);
+ areadiff = 1.0f-(area/uvarea);
weight_to_rgb(areadiff, col, col+1, col+2);
glColor3fv(col);
@@ -316,10 +321,10 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
/* This is the correct angle however we are only comparing angles
* uvang1 = 90-((angle_normalized_v2v2(av1, av2) * 180.0/M_PI)-90);*/
- uvang1 = angle_normalized_v2v2(av1, av2)*180.0/M_PI;
- uvang2 = angle_normalized_v2v2(av2, av3)*180.0/M_PI;
- uvang3 = angle_normalized_v2v2(av3, av4)*180.0/M_PI;
- uvang4 = angle_normalized_v2v2(av4, av1)*180.0/M_PI;
+ uvang1 = angle_normalized_v2v2(av1, av2);
+ uvang2 = angle_normalized_v2v2(av2, av3);
+ uvang3 = angle_normalized_v2v2(av3, av4);
+ uvang4 = angle_normalized_v2v2(av4, av1);
/* 3d angles */
VECSUB(av1, efa->v4->co, efa->v1->co); normalize_v3(av1);
@@ -329,30 +334,30 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
/* This is the correct angle however we are only comparing angles
* ang1 = 90-((angle_normalized_v3v3(av1, av2) * 180.0/M_PI)-90);*/
- ang1 = angle_normalized_v3v3(av1, av2)*180.0/M_PI;
- ang2 = angle_normalized_v3v3(av2, av3)*180.0/M_PI;
- ang3 = angle_normalized_v3v3(av3, av4)*180.0/M_PI;
- ang4 = angle_normalized_v3v3(av4, av1)*180.0/M_PI;
+ ang1 = angle_normalized_v3v3(av1, av2);
+ ang2 = angle_normalized_v3v3(av2, av3);
+ ang3 = angle_normalized_v3v3(av3, av4);
+ ang4 = angle_normalized_v3v3(av4, av1);
glBegin(GL_QUADS);
/* This simple makes the angles display worse then they really are ;)
- * 1.0-pow((1.0-a), 2) */
+ * 1.0-powf((1.0-a), 2) */
- a = fabs(uvang1-ang1)/180.0;
- weight_to_rgb(1.0-pow((1.0-a), 2), col, col+1, col+2);
+ a = fabsf(uvang1-ang1)/(float)M_PI;
+ weight_to_rgb(1.0f-powf((1.0f-a), 2.0f), col, col+1, col+2);
glColor3fv(col);
glVertex2fv(tf->uv[0]);
- a = fabs(uvang2-ang2)/180.0;
- weight_to_rgb(1.0-pow((1.0-a), 2), col, col+1, col+2);
+ a = fabsf(uvang2-ang2)/(float)M_PI;
+ weight_to_rgb(1.0f-powf((1.0f-a), 2.0f), col, col+1, col+2);
glColor3fv(col);
glVertex2fv(tf->uv[1]);
- a = fabs(uvang3-ang3)/180.0;
- weight_to_rgb(1.0-pow((1.0-a), 2), col, col+1, col+2);
+ a = fabsf(uvang3-ang3)/(float)M_PI;
+ weight_to_rgb(1.0f-powf((1.0f-a), 2.0f), col, col+1, col+2);
glColor3fv(col);
glVertex2fv(tf->uv[2]);
- a = fabs(uvang4-ang4)/180.0;
- weight_to_rgb(1.0-pow((1.0-a), 2), col, col+1, col+2);
+ a = fabsf(uvang4-ang4)/(float)M_PI;
+ weight_to_rgb(1.0f-powf((1.0f-a), 2.0f), col, col+1, col+2);
glColor3fv(col);
glVertex2fv(tf->uv[3]);
@@ -376,9 +381,9 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
/* This is the correct angle however we are only comparing angles
* uvang1 = 90-((angle_normalized_v2v2(av1, av2) * 180.0/M_PI)-90); */
- uvang1 = angle_normalized_v2v2(av1, av2)*180.0/M_PI;
- uvang2 = angle_normalized_v2v2(av2, av3)*180.0/M_PI;
- uvang3 = angle_normalized_v2v2(av3, av1)*180.0/M_PI;
+ uvang1 = angle_normalized_v2v2(av1, av2);
+ uvang2 = angle_normalized_v2v2(av2, av3);
+ uvang3 = angle_normalized_v2v2(av3, av1);
/* 3d angles */
VECSUB(av1, efa->v3->co, efa->v1->co); normalize_v3(av1);
@@ -386,24 +391,24 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
VECSUB(av3, efa->v2->co, efa->v3->co); normalize_v3(av3);
/* This is the correct angle however we are only comparing angles
* ang1 = 90-((angle_normalized_v3v3(av1, av2) * 180.0/M_PI)-90); */
- ang1 = angle_normalized_v3v3(av1, av2)*180.0/M_PI;
- ang2 = angle_normalized_v3v3(av2, av3)*180.0/M_PI;
- ang3 = angle_normalized_v3v3(av3, av1)*180.0/M_PI;
+ ang1 = angle_normalized_v3v3(av1, av2);
+ ang2 = angle_normalized_v3v3(av2, av3);
+ ang3 = angle_normalized_v3v3(av3, av1);
/* This simple makes the angles display worse then they really are ;)
- * 1.0-pow((1.0-a), 2) */
+ * 1.0f-powf((1.0-a), 2) */
glBegin(GL_TRIANGLES);
- a = fabs(uvang1-ang1)/180.0;
- weight_to_rgb(1.0-pow((1.0-a), 2), col, col+1, col+2);
+ a = fabsf(uvang1-ang1)/(float)M_PI;
+ weight_to_rgb(1.0f-powf((1.0f-a), 2.0f), col, col+1, col+2);
glColor3fv(col);
glVertex2fv(tf->uv[0]);
- a = fabs(uvang2-ang2)/180.0;
- weight_to_rgb(1.0-pow((1.0-a), 2), col, col+1, col+2);
+ a = fabsf(uvang2-ang2)/(float)M_PI;
+ weight_to_rgb(1.0f-powf((1.0f-a), 2.0f), col, col+1, col+2);
glColor3fv(col);
glVertex2fv(tf->uv[1]);
- a = fabs(uvang3-ang3)/180.0;
- weight_to_rgb(1.0-pow((1.0-a), 2), col, col+1, col+2);
+ a = fabsf(uvang3-ang3)/(float)M_PI;
+ weight_to_rgb(1.0f-powf((1.0f-a), 2.0f), col, col+1, col+2);
glColor3fv(col);
glVertex2fv(tf->uv[2]);
}
diff --git a/source/blender/editors/uvedit/uvedit_intern.h b/source/blender/editors/uvedit/uvedit_intern.h
index 276dc4cef12..34dd0108f46 100644
--- a/source/blender/editors/uvedit/uvedit_intern.h
+++ b/source/blender/editors/uvedit/uvedit_intern.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/uvedit/uvedit_intern.h
+ * \ingroup eduv
+ */
+
+
#ifndef ED_UVEDIT_INTERN_H
#define ED_UVEDIT_INTERN_H
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 30b3fde7b80..2276673329d 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/uvedit/uvedit_ops.c
+ * \ingroup eduv
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <math.h>
@@ -404,6 +409,17 @@ void uvedit_uv_deselect(BMEditMesh *em, Scene *scene, BMLoop *l)
}
}
+/*********************** live unwrap utilities ***********************/
+
+static void uvedit_live_unwrap_update(SpaceImage *sima, Scene *scene, Object *obedit)
+{
+ if(sima && (sima->flag & SI_LIVE_UNWRAP)) {
+ ED_uvedit_live_unwrap_begin(scene, obedit);
+ ED_uvedit_live_unwrap_re_solve();
+ ED_uvedit_live_unwrap_end(0);
+ }
+}
+
/*********************** geometric utilities ***********************/
void poly_uv_center(BMEditMesh *em, BMFace *f, float cent[2])
{
@@ -427,12 +443,12 @@ void poly_uv_center(BMEditMesh *em, BMFace *f, float cent[2])
void uv_center(float uv[][2], float cent[2], int quad)
{
if(quad) {
- cent[0] = (uv[0][0] + uv[1][0] + uv[2][0] + uv[3][0]) / 4.0;
- cent[1] = (uv[0][1] + uv[1][1] + uv[2][1] + uv[3][1]) / 4.0;
+ cent[0] = (uv[0][0] + uv[1][0] + uv[2][0] + uv[3][0]) / 4.0f;
+ cent[1] = (uv[0][1] + uv[1][1] + uv[2][1] + uv[3][1]) / 4.0f;
}
else {
- cent[0] = (uv[0][0] + uv[1][0] + uv[2][0]) / 3.0;
- cent[1] = (uv[0][1] + uv[1][1] + uv[2][1]) / 3.0;
+ cent[0] = (uv[0][0] + uv[1][0] + uv[2][0]) / 3.0f;
+ cent[1] = (uv[0][1] + uv[1][1] + uv[2][1]) / 3.0f;
}
}
@@ -510,8 +526,7 @@ int ED_uvedit_minmax(Scene *scene, Image *ima, Object *obedit, float *min, float
return sel;
}
-static int uvedit_center(Scene *scene, Image *ima, Object *obedit,
- float *cent, int mode)
+int ED_uvedit_median(Scene *scene, Image *ima, Object *obedit, float co[3])
{
BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
BMFace *efa;
@@ -519,36 +534,49 @@ static int uvedit_center(Scene *scene, Image *ima, Object *obedit,
BMIter iter, liter;
MTexPoly *tf;
MLoopUV *luv;
+ unsigned int sel= 0;
+
+ zero_v3(co);
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ tf= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
+ if(!uvedit_face_visible(scene, ima, efa, tf))
+ continue;
+
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ if (uvedit_uv_selected(em, scene, l)) {
+ add_v2_v2(co, luv->uv);
+ sel++;
+ }
+ }
+ }
+
+ mul_v3_fl(co, 1.0f/(float)sel);
+
+ return (sel != 0);
+}
+
+static int uvedit_center(Scene *scene, Image *ima, Object *obedit, float *cent, char mode)
+{
float min[2], max[2];
int change= 0;
- if(mode==0) {
- if(ED_uvedit_minmax(scene, ima, obedit, min, max))
+ if(mode==V3D_CENTER) { /* bounding box */
+ if(ED_uvedit_minmax(scene, ima, obedit, min, max)) {
change = 1;
+
+ cent[0]= (min[0]+max[0])/2.0f;
+ cent[1]= (min[1]+max[1])/2.0f;
+ }
}
- else if(mode==1) {
- INIT_MINMAX2(min, max);
-
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
- tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
- if(!uvedit_face_visible(scene, ima, efa, tf))
- continue;
-
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
- if (uvedit_uv_selected(em, scene, l)) {
- luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
-
- DO_MINMAX2(luv->uv, min, max);
- change= 1;
- }
- }
+ else {
+ if(ED_uvedit_median(scene, ima, obedit, cent)) {
+ change = 1;
}
+
}
-
+
if(change) {
- cent[0]= (min[0]+max[0])/2.0;
- cent[1]= (min[1]+max[1])/2.0;
-
return 1;
}
@@ -1024,7 +1052,8 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
MLoopUV *luv;
UvVertMap *vmap;
UvMapVert *vlist, *iterv, *startv;
- int a, i, nverts, stacksize= 0, *stack;
+ int i, nverts, stacksize= 0, *stack;
+ unsigned int a;
char *flag;
EDBM_init_index_arrays(em, 0, 0, 1); /* we can use this too */
@@ -1182,6 +1211,7 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
static void weld_align_uv(bContext *C, int tool)
{
+ SpaceImage *sima;
Scene *scene;
Object *obedit;
Image *ima;
@@ -1197,6 +1227,7 @@ static void weld_align_uv(bContext *C, int tool)
obedit= CTX_data_edit_object(C);
em= ((Mesh*)obedit->data)->edit_btmesh;
ima= CTX_data_edit_image(C);
+ sima= CTX_wm_space_image(C);
INIT_MINMAX2(min, max);
@@ -1252,6 +1283,7 @@ static void weld_align_uv(bContext *C, int tool)
}
}
+ uvedit_live_unwrap_update(sima, scene, obedit);
DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
}
@@ -1279,7 +1311,7 @@ static void UV_OT_align(wmOperatorType *ot)
/* api callbacks */
ot->exec= align_exec;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */;
/* properties */
RNA_def_enum(ot->srna, "axis", axis_items, 'a', "Axis", "Axis to align UV locations on.");
@@ -1333,6 +1365,7 @@ static int stitch_exec(bContext *C, wmOperator *op)
obedit= CTX_data_edit_object(C);
em= ((Mesh*)obedit->data)->edit_btmesh;
ima= CTX_data_edit_image(C);
+ sima= CTX_wm_space_image(C);
if(RNA_boolean_get(op->ptr, "use_limit")) {
UvVertMap *vmap;
@@ -1455,6 +1488,7 @@ static int stitch_exec(bContext *C, wmOperator *op)
MEM_freeN(uv_average);
}
+ uvedit_live_unwrap_update(sima, scene, obedit);
DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -1652,7 +1686,7 @@ static int sticky_select(float *limit, int hitv[4], int v, float *hituv[4], floa
for(i=0; i<hitlen; i++) {
if(hitv[i] == v) {
if(sticky == SI_STICKY_LOC) {
- if(fabs(hituv[i][0]-uv[0]) < limit[0] && fabs(hituv[i][1]-uv[1]) < limit[1])
+ if(fabsf(hituv[i][0]-uv[0]) < limit[0] && fabsf(hituv[i][1]-uv[1]) < limit[1])
return 1;
}
else if(sticky == SI_STICKY_VERTEX)
@@ -1684,8 +1718,14 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop)
BLI_array_declare(hituv);
float penalty[2];
+ /* notice 'limit' is the same no matter the zoom level, since this is like
+ * remove doubles and could annoying if it joined points when zoomed out.
+ * 'penalty' is in screen pixel space otherwise zooming in on a uv-vert and
+ * shift-selecting can consider an adjacent point close enough to add to
+ * the selection rather then de-selecting the closest. */
+
uvedit_pixel_to_float(sima, limit, 0.05f);
- uvedit_pixel_to_float(sima, penalty, 5.0f);
+ uvedit_pixel_to_float(sima, penalty, 5.0f / sima->zoom);
/* retrieve operation mode */
if(ts->uv_flag & UV_SYNC_SELECTION) {
@@ -1977,7 +2017,7 @@ static void UV_OT_select(wmOperatorType *ot)
/* api callbacks */
ot->exec= select_exec;
ot->invoke= select_invoke;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */;
/* properties */
RNA_def_boolean(ot->srna, "extend", 0,
@@ -2026,7 +2066,7 @@ static void UV_OT_select_loop(wmOperatorType *ot)
/* api callbacks */
ot->exec= select_loop_exec;
ot->invoke= select_loop_invoke;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */;
/* properties */
RNA_def_boolean(ot->srna, "extend", 0,
@@ -2104,7 +2144,7 @@ static void UV_OT_select_linked(wmOperatorType *ot)
/* api callbacks */
ot->exec= select_linked_exec;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */
/* properties */
RNA_def_boolean(ot->srna, "extend", 0,
@@ -2132,7 +2172,7 @@ static void UV_OT_select_linked_pick(wmOperatorType *ot)
/* api callbacks */
ot->invoke= select_linked_pick_invoke;
ot->exec= select_linked_pick_exec;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */;
/* properties */
RNA_def_boolean(ot->srna, "extend", 0,
@@ -2192,12 +2232,12 @@ static int unlink_selection_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
-static void UV_OT_unlink_selection(wmOperatorType *ot)
+static void UV_OT_unlink_selected(wmOperatorType *ot)
{
/* identifiers */
ot->name= "Unlink Selection";
ot->description= "Unlink selected UV vertices from active UV map";
- ot->idname= "UV_OT_unlink_selection";
+ ot->idname= "UV_OT_unlink_selected";
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* api callbacks */
@@ -2265,7 +2305,7 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje
UvMapVert *start_vlist=NULL, *vlist_iter;
struct UvVertMap *vmap;
float limit[2];
- int efa_index;
+ unsigned int efa_index;
//BMVert *eve; /* removed vert counting for now */
//int a;
@@ -2461,7 +2501,7 @@ static void UV_OT_select_border(wmOperatorType *ot)
ot->invoke= WM_border_select_invoke;
ot->exec= border_select_exec;
ot->modal= WM_border_select_modal;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -2487,7 +2527,7 @@ static void select_uv_inside_ellipse(BMEditMesh *em, SpaceImage *sima, Scene *sc
y= (uv[1] - offset[1])*ell[1];
r2 = x*x + y*y;
- if(r2 < 1.0) {
+ if(r2 < 1.0f) {
if(select) uvedit_uv_select(em, scene, l);
else uvedit_uv_deselect(em, scene, l);
}
@@ -2553,7 +2593,7 @@ static void UV_OT_circle_select(wmOperatorType *ot)
ot->invoke= WM_gesture_circle_invoke;
ot->modal= WM_gesture_circle_modal;
ot->exec= circle_select_exec;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -2583,7 +2623,7 @@ static void snap_cursor_to_pixels(SpaceImage *sima)
static int snap_cursor_to_selection(Scene *scene, Image *ima, Object *obedit, SpaceImage *sima)
{
- return uvedit_center(scene, ima, obedit, sima->cursor, 0);
+ return uvedit_center(scene, ima, obedit, sima->cursor, sima->around);
}
static int snap_cursor_exec(bContext *C, wmOperator *op)
@@ -2594,7 +2634,7 @@ static int snap_cursor_exec(bContext *C, wmOperator *op)
Image *ima= CTX_data_edit_image(C);
int change= 0;
- switch(RNA_boolean_get(op->ptr, "target")) {
+ switch(RNA_enum_get(op->ptr, "target")) {
case 0:
snap_cursor_to_pixels(sima);
change= 1;
@@ -2616,7 +2656,7 @@ static void UV_OT_snap_cursor(wmOperatorType *ot)
{
static EnumPropertyItem target_items[] = {
{0, "PIXELS", 0, "Pixels", ""},
- {1, "SELECTION", 0, "Selection", ""},
+ {1, "SELECTED", 0, "Selected", ""},
{0, NULL, 0, NULL, NULL}};
/* identifiers */
@@ -2627,7 +2667,7 @@ static void UV_OT_snap_cursor(wmOperatorType *ot)
/* api callbacks */
ot->exec= snap_cursor_exec;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */;
/* properties */
RNA_def_enum(ot->srna, "target", target_items, 0, "Target", "Target to snap the selected UV's to.");
@@ -2798,7 +2838,7 @@ static int snap_selection_exec(bContext *C, wmOperator *op)
Image *ima= CTX_data_edit_image(C);
int change= 0;
- switch(RNA_boolean_get(op->ptr, "target")) {
+ switch(RNA_enum_get(op->ptr, "target")) {
case 0:
change= snap_uvs_to_pixels(sima, scene, obedit);
break;
@@ -2812,14 +2852,15 @@ static int snap_selection_exec(bContext *C, wmOperator *op)
if(!change)
return OPERATOR_CANCELLED;
-
+
+ uvedit_live_unwrap_update(sima, scene, obedit);
DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
return OPERATOR_FINISHED;
}
-static void UV_OT_snap_selection(wmOperatorType *ot)
+static void UV_OT_snap_selected(wmOperatorType *ot)
{
static EnumPropertyItem target_items[] = {
{0, "PIXELS", 0, "Pixels", ""},
@@ -2830,12 +2871,12 @@ static void UV_OT_snap_selection(wmOperatorType *ot)
/* identifiers */
ot->name= "Snap Selection";
ot->description= "Snap selected UV vertices to target type";
- ot->idname= "UV_OT_snap_selection";
+ ot->idname= "UV_OT_snap_selected";
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
/* api callbacks */
ot->exec= snap_selection_exec;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */;
/* properties */
RNA_def_enum(ot->srna, "target", target_items, 0, "Target", "Target to snap the selected UV's to.");
@@ -3051,6 +3092,8 @@ static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
BMIter iter, liter;
MTexPoly *tf;
MLoopUV *luv;
+ int facemode= sima ? sima->flag & SI_SELACTFACE : 0;
+ int stickymode= sima ? (sima->sticky != SI_STICKY_DISABLE) : 1;
BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
BMINDEX_SET(v, BM_TestHFlag(v, BM_SELECT));
@@ -3063,22 +3106,79 @@ static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
return OPERATOR_FINISHED;
}
-
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
- if (em->selectmode == SCE_SELECT_FACE) {
- uvedit_face_select(scene, em, efa);
- } else {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
- if (!BMINDEX_GET(l->v)) {
+ if(facemode) {
+ if(em->selectmode == SCE_SELECT_FACE) {
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ if (!BM_TestHFlag(efa, BM_HIDDEN) && !BM_TestHFlag(efa, BM_SELECT)) {
+ BM_Select(em->bm, efa, 1);
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ luv->flag |= MLOOPUV_VERTSEL;
+ }
+ }
+ }
+ }
+ else {
+ /* enable adjacent faces to have disconnected UV selections if sticky is disabled */
+ if(!stickymode) {
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ if (!BM_TestHFlag(efa, BM_HIDDEN) && !BM_TestHFlag(efa, BM_SELECT)) {
+ int totsel=0;
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ totsel += BM_TestHFlag(l->v, BM_SELECT);
+ }
+
+ if (!totsel) {
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ luv->flag |= MLOOPUV_VERTSEL;
+ }
+
+ BM_Select(em->bm, efa, 1);
+ }
+ }
+ }
+ } else {
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ if (!BM_TestHFlag(efa, BM_HIDDEN) && !BM_TestHFlag(efa, BM_SELECT)) {
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ if (BM_TestHFlag(l->v, BM_SELECT)==0) {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ luv->flag |= MLOOPUV_VERTSEL;
+ }
+ }
+
+ BM_Select(em->bm, efa, 1);
+ }
+ }
+ }
+ }
+ } else if(em->selectmode == SCE_SELECT_FACE) {
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ if (!BM_TestHFlag(efa, BM_HIDDEN) && !BM_TestHFlag(efa, BM_SELECT)) {
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag |= MLOOPUV_VERTSEL;
}
+
+ BM_Select(em->bm, efa, 1);
+ }
+ }
+ } else {
+ BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ if (!BM_TestHFlag(efa, BM_HIDDEN) && !BM_TestHFlag(efa, BM_SELECT)) {
+ BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ if (BM_TestHFlag(l->v, BM_SELECT)==0) {
+ luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ luv->flag |= MLOOPUV_VERTSEL;
+ }
+ }
+
+ BM_Select(em->bm, efa, 1);
}
}
-
- BM_Select(em->bm, efa, 1);
}
-
+
WM_event_add_notifier(C, NC_GEOM|ND_SELECT, obedit->data);
return OPERATOR_FINISHED;
@@ -3140,7 +3240,7 @@ static void UV_OT_cursor_set(wmOperatorType *ot)
/* api callbacks */
ot->exec= set_2d_cursor_exec;
ot->invoke= set_2d_cursor_invoke;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -3184,7 +3284,7 @@ static int set_tile_invoke(bContext *C, wmOperator *op, wmEvent *event)
y= event->y - ar->winrct.ymin;
UI_view2d_region_to_view(&ar->v2d, x, y, &fx, &fy);
- if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) {
+ if(fx >= 0.0f && fy >= 0.0f && fx < 1.0f && fy < 1.0f) {
fx= fx*ima->xrep;
fy= fy*ima->yrep;
@@ -3208,7 +3308,7 @@ static void UV_OT_tile_set(wmOperatorType *ot)
/* api callbacks */
ot->exec= set_tile_exec;
ot->invoke= set_tile_invoke;
- ot->poll= ED_operator_uvedit;
+ ot->poll= ED_operator_image_active; /* requires space image */;
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -3227,13 +3327,13 @@ void ED_operatortypes_uvedit(void)
WM_operatortype_append(UV_OT_select_loop);
WM_operatortype_append(UV_OT_select_linked);
WM_operatortype_append(UV_OT_select_linked_pick);
- WM_operatortype_append(UV_OT_unlink_selection);
+ WM_operatortype_append(UV_OT_unlink_selected);
WM_operatortype_append(UV_OT_select_pinned);
WM_operatortype_append(UV_OT_select_border);
WM_operatortype_append(UV_OT_circle_select);
WM_operatortype_append(UV_OT_snap_cursor);
- WM_operatortype_append(UV_OT_snap_selection);
+ WM_operatortype_append(UV_OT_snap_selected);
WM_operatortype_append(UV_OT_align);
WM_operatortype_append(UV_OT_stitch);
@@ -3282,7 +3382,7 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf)
RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL|KM_SHIFT, 0)->ptr, "extend", TRUE);
RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", TRUE);
- WM_keymap_add_item(keymap, "UV_OT_unlink_selection", LKEY, KM_PRESS, KM_ALT, 0);
+ WM_keymap_add_item(keymap, "UV_OT_unlink_selected", LKEY, KM_PRESS, KM_ALT, 0);
WM_keymap_add_item(keymap, "UV_OT_select_all", AKEY, KM_PRESS, 0, 0);
WM_keymap_add_item(keymap, "UV_OT_select_inverse", IKEY, KM_PRESS, KM_CTRL, 0);
WM_keymap_add_item(keymap, "UV_OT_select_pinned", PKEY, KM_PRESS, KM_SHIFT, 0);
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index 524706fe42d..b2f3c0572f1 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -1,3 +1,6 @@
+/** \file blender/editors/uvedit/uvedit_parametrizer.c
+ * \ingroup eduv
+ */
#include "MEM_guardedalloc.h"
@@ -260,7 +263,7 @@ static int phash_size(PHash *ph)
static void phash_insert(PHash *ph, PHashLink *link)
{
int size = ph->cursize;
- int hash = PHASH_hash(ph, link->key);
+ uintptr_t hash = PHASH_hash(ph, link->key);
PHashLink *lookup = ph->buckets[hash];
if (lookup == NULL) {
@@ -296,7 +299,7 @@ static void phash_insert(PHash *ph, PHashLink *link)
static PHashLink *phash_lookup(PHash *ph, PHashKey key)
{
PHashLink *link;
- int hash = PHASH_hash(ph, key);
+ uintptr_t hash = PHASH_hash(ph, key);
for (link = ph->buckets[hash]; link; link = link->next)
if (link->key == key)
@@ -309,7 +312,7 @@ static PHashLink *phash_lookup(PHash *ph, PHashKey key)
static PHashLink *phash_next(PHash *ph, PHashKey key, PHashLink *link)
{
- int hash = PHASH_hash(ph, key);
+ uintptr_t hash = PHASH_hash(ph, key);
for (link = link->next; link; link = link->next)
if (link->key == key)
@@ -367,7 +370,7 @@ static void p_triangle_angles(float *v1, float *v2, float *v3, float *a1, float
{
*a1 = p_vec_angle(v3, v1, v2);
*a2 = p_vec_angle(v1, v2, v3);
- *a3 = M_PI - *a2 - *a1;
+ *a3 = (float)M_PI - *a2 - *a1;
}
static void p_face_angles(PFace *f, float *a1, float *a2, float *a3)
@@ -785,12 +788,12 @@ static PBool p_edge_implicit_seam(PEdge *e, PEdge *ep)
uvp2 = ep->orig_uv;
}
- if((fabs(uv1[0]-uvp1[0]) > limit[0]) || (fabs(uv1[1]-uvp1[1]) > limit[1])) {
+ if((fabsf(uv1[0]-uvp1[0]) > limit[0]) || (fabsf(uv1[1]-uvp1[1]) > limit[1])) {
e->flag |= PEDGE_SEAM;
ep->flag |= PEDGE_SEAM;
return P_TRUE;
}
- if((fabs(uv2[0]-uvp2[0]) > limit[0]) || (fabs(uv2[1]-uvp2[1]) > limit[1])) {
+ if((fabsf(uv2[0]-uvp2[0]) > limit[0]) || (fabsf(uv2[1]-uvp2[1]) > limit[1])) {
e->flag |= PEDGE_SEAM;
ep->flag |= PEDGE_SEAM;
return P_TRUE;
@@ -2258,8 +2261,8 @@ static void p_abf_setup_system(PAbfSystem *sys)
for (i = 0; i < sys->ninterior; i++)
sys->lambdaLength[i] = 1.0;
- sys->minangle = 7.5f*M_PI/180.0f;
- sys->maxangle = M_PI - sys->minangle;
+ sys->minangle = 7.5*M_PI/180.0;
+ sys->maxangle = (float)M_PI - sys->minangle;
}
static void p_abf_free_system(PAbfSystem *sys)
@@ -2372,7 +2375,7 @@ static float p_abf_compute_gradient(PAbfSystem *sys, PChart *chart)
norm += galpha1*galpha1 + galpha2*galpha2 + galpha3*galpha3;
- gtriangle = sys->alpha[e1->u.id] + sys->alpha[e2->u.id] + sys->alpha[e3->u.id] - M_PI;
+ gtriangle = sys->alpha[e1->u.id] + sys->alpha[e2->u.id] + sys->alpha[e3->u.id] - (float)M_PI;
sys->bTriangle[f->u.id] = -gtriangle;
norm += gtriangle*gtriangle;
}
@@ -2423,9 +2426,9 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
PEdge *e1 = f->edge, *e2 = e1->next, *e3 = e2->next;
PVert *v1 = e1->vert, *v2 = e2->vert, *v3 = e3->vert;
- wi1 = 1.0/sys->weight[e1->u.id];
- wi2 = 1.0/sys->weight[e2->u.id];
- wi3 = 1.0/sys->weight[e3->u.id];
+ wi1 = 1.0f/sys->weight[e1->u.id];
+ wi2 = 1.0f/sys->weight[e2->u.id];
+ wi3 = 1.0f/sys->weight[e3->u.id];
/* bstar1 = (J1*dInv*bAlpha - bTriangle) */
b = sys->bAlpha[e1->u.id]*wi1;
@@ -2434,7 +2437,7 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
b -= sys->bTriangle[f->u.id];
/* si = J1*d*J1t */
- si = 1.0/(wi1 + wi2 + wi3);
+ si = 1.0f/(wi1 + wi2 + wi3);
/* J1t*si*bstar1 - bAlpha */
beta[0] = b*si - sys->bAlpha[e1->u.id];
@@ -2456,7 +2459,7 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
vid[0] = v1->u.id;
vid[3] = ninterior + v1->u.id;
- sys->J2dt[e1->u.id][0] = j2[0][0] = 1.0*wi1;
+ sys->J2dt[e1->u.id][0] = j2[0][0] = 1.0f * wi1;
sys->J2dt[e2->u.id][0] = j2[1][0] = p_abf_compute_sin_product(sys, v1, e2->u.id)*wi2;
sys->J2dt[e3->u.id][0] = j2[2][0] = p_abf_compute_sin_product(sys, v1, e3->u.id)*wi3;
@@ -2477,7 +2480,7 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
vid[4] = ninterior + v2->u.id;
sys->J2dt[e1->u.id][1] = j2[0][1] = p_abf_compute_sin_product(sys, v2, e1->u.id)*wi1;
- sys->J2dt[e2->u.id][1] = j2[1][1] = 1.0*wi2;
+ sys->J2dt[e2->u.id][1] = j2[1][1] = 1.0f*wi2;
sys->J2dt[e3->u.id][1] = j2[2][1] = p_abf_compute_sin_product(sys, v2, e3->u.id)*wi3;
nlRightHandSideAdd(0, v2->u.id, j2[1][1]*beta[1]);
@@ -2498,7 +2501,7 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
sys->J2dt[e1->u.id][2] = j2[0][2] = p_abf_compute_sin_product(sys, v3, e1->u.id)*wi1;
sys->J2dt[e2->u.id][2] = j2[1][2] = p_abf_compute_sin_product(sys, v3, e2->u.id)*wi2;
- sys->J2dt[e3->u.id][2] = j2[2][2] = 1.0*wi3;
+ sys->J2dt[e3->u.id][2] = j2[2][2] = 1.0f * wi3;
nlRightHandSideAdd(0, v3->u.id, j2[2][2]*beta[2]);
nlRightHandSideAdd(0, ninterior + v3->u.id, j2[0][2]*beta[0] + j2[1][2]*beta[1]);
@@ -2598,8 +2601,8 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
/* clamp */
e = f->edge;
do {
- if (sys->alpha[e->u.id] > M_PI)
- sys->alpha[e->u.id] = M_PI;
+ if (sys->alpha[e->u.id] > (float)M_PI)
+ sys->alpha[e->u.id] = (float)M_PI;
else if (sys->alpha[e->u.id] < 0.0f)
sys->alpha[e->u.id] = 0.0f;
} while (e != f->edge);
@@ -2673,9 +2676,9 @@ static PBool p_chart_abf_solve(PChart *chart)
sys.alpha[e2->u.id] = sys.beta[e2->u.id] = a2;
sys.alpha[e3->u.id] = sys.beta[e3->u.id] = a3;
- sys.weight[e1->u.id] = 2.0/(a1*a1);
- sys.weight[e2->u.id] = 2.0/(a2*a2);
- sys.weight[e3->u.id] = 2.0/(a3*a3);
+ sys.weight[e1->u.id] = 2.0f/(a1*a1);
+ sys.weight[e2->u.id] = 2.0f/(a2*a2);
+ sys.weight[e3->u.id] = 2.0f/(a3*a3);
}
for (v=chart->verts; v; v=v->nextlink) {
@@ -2688,7 +2691,7 @@ static PBool p_chart_abf_solve(PChart *chart)
e = e->next->next->pair;
} while (e && (e != v->edge));
- scale = (anglesum == 0.0f)? 0.0f: 2*M_PI/anglesum;
+ scale = (anglesum == 0.0f)? 0.0f: 2.0f*(float)M_PI/anglesum;
e = v->edge;
do {
@@ -3088,7 +3091,7 @@ static PBool p_chart_lscm_solve(PHandle *handle, PChart *chart)
/* angle based lscm formulation */
ratio = (sina3 == 0.0f)? 1.0f: sina2/sina3;
- cosine = cos(a1)*ratio;
+ cosine = cosf(a1)*ratio;
sine = sina1*ratio;
#if 0
@@ -3108,7 +3111,7 @@ static PBool p_chart_lscm_solve(PHandle *handle, PChart *chart)
nlCoefficient(2*v3->u.id+1, 1.0);
nlEnd(NL_ROW);
#else
- nlMatrixAdd(row, 2*v1->u.id, cosine - 1.0);
+ nlMatrixAdd(row, 2*v1->u.id, cosine - 1.0f);
nlMatrixAdd(row, 2*v1->u.id+1, -sine);
nlMatrixAdd(row, 2*v2->u.id, -cosine);
nlMatrixAdd(row, 2*v2->u.id+1, sine);
@@ -3116,7 +3119,7 @@ static PBool p_chart_lscm_solve(PHandle *handle, PChart *chart)
row++;
nlMatrixAdd(row, 2*v1->u.id, sine);
- nlMatrixAdd(row, 2*v1->u.id+1, cosine - 1.0);
+ nlMatrixAdd(row, 2*v1->u.id+1, cosine - 1.0f);
nlMatrixAdd(row, 2*v2->u.id, -sine);
nlMatrixAdd(row, 2*v2->u.id+1, -cosine);
nlMatrixAdd(row, 2*v3->u.id+1, 1.0);
@@ -3220,7 +3223,7 @@ static float p_face_stretch(PFace *f)
T = sqrt(0.5f*(a + c));
if (f->flag & PFACE_FILLED)
- T *= 0.2;
+ T *= 0.2f;
return T;
}
@@ -3268,9 +3271,9 @@ static void p_chart_stretch_minimize(PChart *chart, RNG *rng)
trusted_radius /= 2 * nedges;
- random_angle = rng_getFloat(rng) * 2.0 * M_PI;
- dir[0] = trusted_radius * cos(random_angle);
- dir[1] = trusted_radius * sin(random_angle);
+ random_angle = rng_getFloat(rng) * 2.0f * (float)M_PI;
+ dir[0] = trusted_radius * cosf(random_angle);
+ dir[1] = trusted_radius * sinf(random_angle);
/* calculate old and new stretch */
low = 0;
@@ -3282,7 +3285,7 @@ static void p_chart_stretch_minimize(PChart *chart, RNG *rng)
/* binary search for lowest stretch position */
for (j = 0; j < P_STRETCH_ITER; j++) {
- mid = 0.5 * (low + high);
+ mid = 0.5f * (low + high);
v->uv[0]= orig_uv[0] + mid*dir[0];
v->uv[1]= orig_uv[1] + mid*dir[1];
stretch = p_stretch_compute_vertex(v);
@@ -3436,7 +3439,7 @@ static float p_chart_minimum_area_angle(PChart *chart)
p2 = points[i];
p3 = (i == npoints-1)? points[0]: points[i+1];
- angles[i] = M_PI - p_vec2_angle(p1->uv, p2->uv, p3->uv);
+ angles[i] = (float)M_PI - p_vec2_angle(p1->uv, p2->uv, p3->uv);
if (points[i]->uv[1] < miny) {
miny = points[i]->uv[1];
@@ -3476,7 +3479,7 @@ static float p_chart_minimum_area_angle(PChart *chart)
minarea = 1e10;
minangle = 0.0;
- while (rotated <= M_PI/2) { /* INVESTIGATE: how far to rotate? */
+ while (rotated <= (float)(M_PI/2.0)) { /* INVESTIGATE: how far to rotate? */
/* rotate with the smallest angle */
mini = 0;
mina = 1e10;
@@ -3505,7 +3508,7 @@ static float p_chart_minimum_area_angle(PChart *chart)
len = len_v2v2(p1->uv, p1n->uv);
if (len > 0.0f) {
- len = 1.0/len;
+ len = 1.0f/len;
v[0] = (p1n->uv[0] - p1->uv[0])*len;
v[1] = (p1n->uv[1] - p1->uv[1])*len;
@@ -3522,8 +3525,8 @@ static float p_chart_minimum_area_angle(PChart *chart)
}
/* try keeping rotation as small as possible */
- if (minangle > M_PI/4)
- minangle -= M_PI/2;
+ if (minangle > (float)(M_PI/4))
+ minangle -= (float)(M_PI/2.0);
MEM_freeN(angles);
MEM_freeN(points);
@@ -3585,7 +3588,7 @@ static void p_barycentric_2d(float *v1, float *v2, float *v3, float *p, float *b
b[1] = (h[0]*c[1] - h[1]*c[0])*div;
b[2] = (a[0]*h[1] - a[1]*h[0])*div;
- b[0] = 1.0 - b[1] - b[2];
+ b[0] = 1.0f - b[1] - b[2];
}
}
@@ -3595,7 +3598,7 @@ static PBool p_triangle_inside(SmoothTriangle *t, float *co)
p_barycentric_2d(t->co1, t->co2, t->co3, co, b);
- if ((b[0] >= 0.0) && (b[1] >= 0.0) && (b[2] >= 0.0f)) {
+ if ((b[0] >= 0.0f) && (b[1] >= 0.0f) && (b[2] >= 0.0f)) {
co[0] = t->oco1[0]*b[0] + t->oco2[0]*b[1] + t->oco3[0]*b[2];
co[1] = t->oco1[1]*b[0] + t->oco2[1]*b[1] + t->oco3[1]*b[2];
return P_TRUE;
@@ -3751,10 +3754,10 @@ static void p_smooth(PChart *chart)
p_chart_uv_bbox(chart, minv, maxv);
median = p_smooth_median_edge_length(chart)*0.10f;
- if (median == 0.0)
+ if (median == 0.0f)
return;
- invmedian = 1.0/median;
+ invmedian = 1.0f/median;
/* compute edge distortion */
avglen2d = avglen3d = 0.0;
@@ -3873,7 +3876,7 @@ static void p_smooth(PChart *chart)
p_barycentric_2d(e1->vert->uv, e2->vert->uv, e3->vert->uv, p, b);
- if ((b[0] > 0.0) && (b[1] > 0.0) && (b[2] > 0.0)) {
+ if ((b[0] > 0.0f) && (b[1] > 0.0f) && (b[2] > 0.0f)) {
nodes[i] = e1->vert->u.distortion*b[0];
nodes[i] += e2->vert->u.distortion*b[1];
nodes[i] += e3->vert->u.distortion*b[2];
@@ -4365,7 +4368,7 @@ void param_pack(ParamHandle *handle, float margin)
/* multiply the margin by the area to give predictable results not dependant on UV scale,
* ...Without using the area running pack multiple times also gives a bad feedback loop.
* multiply by 0.1 so the margin value from the UI can be from 0.0 to 1.0 but not give a massive margin */
- margin = (margin*(float)area) * 0.1;
+ margin = (margin*(float)area) * 0.1f;
unpacked= 0;
for (i = 0; i < phandle->ncharts; i++) {
chart = phandle->charts[i];
@@ -4387,9 +4390,9 @@ void param_pack(ParamHandle *handle, float margin)
boxPack2D(boxarray, phandle->ncharts-unpacked, &tot_width, &tot_height);
if (tot_height>tot_width)
- scale = 1.0/tot_height;
+ scale = 1.0f/tot_height;
else
- scale = 1.0/tot_width;
+ scale = 1.0f/tot_width;
for (i = 0; i < phandle->ncharts-unpacked; i++) {
box = boxarray+i;
@@ -4427,7 +4430,7 @@ void param_average(ParamHandle *handle)
for (f=chart->faces; f; f=f->nextlink) {
chart->u.pack.area += p_face_area(f);
- chart->u.pack.rescale += fabs(p_face_uv_area_signed(f));
+ chart->u.pack.rescale += fabsf(p_face_uv_area_signed(f));
}
tot_facearea += chart->u.pack.area;
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h
index 92ec80987e5..df2fbfa193e 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -1,3 +1,6 @@
+/** \file blender/editors/uvedit/uvedit_parametrizer.h
+ * \ingroup eduv
+ */
#ifndef __PARAMETRIZER_H__
#define __PARAMETRIZER_H__
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index b9959afa0f9..56fd04e8360 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/editors/uvedit/uvedit_unwrap_ops.c
+ * \ingroup eduv
+ */
+
+
#include <string.h>
#include <stdlib.h>
#include <math.h>
@@ -476,13 +481,20 @@ void UV_OT_minimize_stretch(wmOperatorType *ot)
/* ******************** Pack Islands operator **************** */
-static int pack_islands_exec(bContext *C, wmOperator *UNUSED(op))
+static int pack_islands_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
ParamHandle *handle;
+ if(RNA_property_is_set(op->ptr, "margin")) {
+ scene->toolsettings->uvcalc_margin= RNA_float_get(op->ptr, "margin");
+ }
+ else {
+ RNA_float_set(op->ptr, "margin", scene->toolsettings->uvcalc_margin);
+ }
+
handle = construct_param_handle(scene, em, 1, 0, 1, 1);
param_pack(handle, scene->toolsettings->uvcalc_margin);
param_flush(handle);
@@ -504,6 +516,9 @@ void UV_OT_pack_islands(wmOperatorType *ot)
/* api callbacks */
ot->exec= pack_islands_exec;
ot->poll= ED_operator_uvedit;
+
+ /* properties */
+ RNA_def_float_factor(ot->srna, "margin", 0.0f, 0.0f, 1.0f, "Margin", "Space between islands", 0.0f, 1.0f);
}
/* ******************** Average Islands Scale operator **************** */
@@ -750,7 +765,7 @@ static void correct_uv_aspect(BMEditMesh *em)
BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
- if (!BM_TestHFlag(efa, BM_SELECT))
+ if (!BM_TestHFlag(efa, BM_SELECT) || BM_TestHFlag(efa, BM_HIDDEN))
continue;
BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
@@ -764,7 +779,7 @@ static void correct_uv_aspect(BMEditMesh *em)
BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
- if (!BM_TestHFlag(efa, BM_SELECT))
+ if (!BM_TestHFlag(efa, BM_SELECT)||BM_TestHFlag(efa, BM_HIDDEN))
continue;
BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
@@ -842,8 +857,8 @@ static void uv_map_clip_correct(BMEditMesh *em, wmOperator *op)
BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
- CLAMP(luv->uv[0], 0.0, 1.0);
- CLAMP(luv->uv[1], 0.0, 1.0);
+ CLAMP(luv->uv[0], 0.0f, 1.0f);
+ CLAMP(luv->uv[1], 0.0f, 1.0f);
}
}
}
@@ -851,6 +866,27 @@ static void uv_map_clip_correct(BMEditMesh *em, wmOperator *op)
/* ******************** Unwrap operator **************** */
+/* assumes UV layer is checked, doesn't run update funcs */
+void ED_unwrap_lscm(Scene *scene, Object *obedit, const short sel)
+{
+ BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
+
+ const short fill_holes= scene->toolsettings->uvcalc_flag & UVCALC_FILLHOLES;
+ const short correct_aspect= !(scene->toolsettings->uvcalc_flag & UVCALC_NO_ASPECT_CORRECT);
+
+ ParamHandle *handle= construct_param_handle(scene, em, 0, fill_holes, sel, correct_aspect);
+
+ param_lscm_begin(handle, PARAM_FALSE, scene->toolsettings->unwrapper == 0);
+ param_lscm_solve(handle);
+ param_lscm_end(handle);
+
+ param_pack(handle, scene->toolsettings->uvcalc_margin);
+
+ param_flush(handle);
+
+ param_delete(handle);
+}
+
static int unwrap_exec(bContext *C, wmOperator *op)
{
Scene *scene= CTX_data_scene(C);
@@ -869,17 +905,14 @@ static int unwrap_exec(bContext *C, wmOperator *op)
/* remember last method for live unwrap */
scene->toolsettings->unwrapper = method;
- handle= construct_param_handle(scene, em, 0, fill_holes, 1, correct_aspect);
-
- param_lscm_begin(handle, PARAM_FALSE, method == 0);
- param_lscm_solve(handle);
- param_lscm_end(handle);
-
- param_pack(handle, scene->toolsettings->uvcalc_margin);
+ if(fill_holes) scene->toolsettings->uvcalc_flag |= UVCALC_FILLHOLES;
+ else scene->toolsettings->uvcalc_flag &= ~UVCALC_FILLHOLES;
- param_flush(handle);
+ if(correct_aspect) scene->toolsettings->uvcalc_flag &= ~UVCALC_NO_ASPECT_CORRECT;
+ else scene->toolsettings->uvcalc_flag |= UVCALC_NO_ASPECT_CORRECT;
- param_delete(handle);
+ /* execute unwrap */
+ ED_unwrap_lscm(scene, obedit, TRUE);
DAG_id_tag_update(obedit->data, 0);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -1146,7 +1179,7 @@ static void uv_map_mirror(BMEditMesh *em, BMFace *efa, MTexPoly *tf)
for(i=0; i<efa->len; i++) {
if(i != mi) {
dx = uvs[mi][0] - uvs[i][0];
- if(dx > 0.5) uvs[i][0] += 1.0;
+ if(dx > 0.5f) uvs[i][0] += 1.0f;
}
}
@@ -1326,18 +1359,20 @@ static int cube_project_exec(bContext *C, wmOperator *op)
if(no[2]>=no[0] && no[2]>=no[1]);
else if(no[1]>=no[0] && no[1]>=no[2]) coy= 2;
else { cox= 1; coy= 2; }
-
+
+ dx = dy = 0;
BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
- luv->uv[0] = 0.5+0.5*cube_size*(loc[cox] + l->v->co[cox]);
- luv->uv[1] = 0.5+0.5*cube_size*(loc[coy] + l->v->co[coy]);
+ luv->uv[0] = 0.5f+0.5f*cube_size*(loc[cox] + l->v->co[cox]);
+ luv->uv[1] = 0.5f+0.5f*cube_size*(loc[coy] + l->v->co[coy]);
if (first) {
dx = floor(luv->uv[0]);
dy = floor(luv->uv[1]);
first = 0;
}
+
luv->uv[0] -= dx;
luv->uv[1] -= dy;
diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index c79206a5641..fc7e3408683 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -32,9 +32,9 @@ set(INC
../imbuf
../makesdna
../makesrna
- ../../../extern/glew/include
../../../intern/guardedalloc
../../../intern/smoke/extern
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/gpu/GPU_extensions.h b/source/blender/gpu/GPU_extensions.h
index 90c99257087..8bf923a5679 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -108,10 +108,10 @@ int GPU_type_matches(GPUDeviceType device, GPUOSType os, GPUDriverType driver);
- if created with from_blender, will not free the texture
*/
-GPUTexture *GPU_texture_create_1D(int w, float *pixels);
-GPUTexture *GPU_texture_create_2D(int w, int h, float *pixels);
+GPUTexture *GPU_texture_create_1D(int w, float *pixels, char err_out[256]);
+GPUTexture *GPU_texture_create_2D(int w, int h, float *pixels, char err_out[256]);
GPUTexture *GPU_texture_create_3D(int w, int h, int depth, float *fpixels);
-GPUTexture *GPU_texture_create_depth(int w, int h);
+GPUTexture *GPU_texture_create_depth(int w, int h, char err_out[256]);
GPUTexture *GPU_texture_from_blender(struct Image *ima,
struct ImageUser *iuser, double time, int mipmap);
void GPU_texture_free(GPUTexture *tex);
@@ -135,7 +135,7 @@ int GPU_texture_opengl_height(GPUTexture *tex);
be called before rendering to the window framebuffer again */
GPUFrameBuffer *GPU_framebuffer_create(void);
-int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex);
+int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, char err_out[256]);
void GPU_framebuffer_texture_detach(GPUFrameBuffer *fb, GPUTexture *tex);
void GPU_framebuffer_texture_bind(GPUFrameBuffer *fb, GPUTexture *tex);
void GPU_framebuffer_texture_unbind(GPUFrameBuffer *fb, GPUTexture *tex);
@@ -147,7 +147,7 @@ void GPU_framebuffer_restore(void);
- wrapper around framebuffer and texture for simple offscreen drawing
- changes size if graphics card can't support it */
-GPUOffScreen *GPU_offscreen_create(int *width, int *height);
+GPUOffScreen *GPU_offscreen_create(int *width, int *height, char err_out[256]);
void GPU_offscreen_free(GPUOffScreen *ofs);
void GPU_offscreen_bind(GPUOffScreen *ofs);
void GPU_offscreen_unbind(GPUOffScreen *ofs);
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 7d45640da63..a0a8b9ce8a6 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/gpu/intern/gpu_buffers.c
+ * \ingroup gpu
+ */
+
+
#include <limits.h>
#include <stddef.h>
#include <string.h>
diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c
index 6225e5a3acc..470b99de00b 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/gpu/intern/gpu_codegen.c
+ * \ingroup gpu
+ */
+
+
#include "GL/glew.h"
#include "MEM_guardedalloc.h"
@@ -978,11 +983,11 @@ static void gpu_node_input_link(GPUNode *node, GPUNodeLink *link, int type)
input->textype = type;
if (type == GPU_TEX1D) {
- input->tex = GPU_texture_create_1D(link->texturesize, link->ptr1);
+ input->tex = GPU_texture_create_1D(link->texturesize, link->ptr1, NULL);
input->textarget = GL_TEXTURE_1D;
}
else {
- input->tex = GPU_texture_create_2D(link->texturesize, link->texturesize, link->ptr2);
+ input->tex = GPU_texture_create_2D(link->texturesize, link->texturesize, link->ptr2, NULL);
input->textarget = GL_TEXTURE_2D;
}
diff --git a/source/blender/gpu/intern/gpu_codegen.h b/source/blender/gpu/intern/gpu_codegen.h
index 3a9fe528345..b0a131f5989 100644
--- a/source/blender/gpu/intern/gpu_codegen.h
+++ b/source/blender/gpu/intern/gpu_codegen.h
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/gpu/intern/gpu_codegen.h
+ * \ingroup gpu
+ */
+
+
#ifndef __GPU_CODEGEN_H__
#define __GPU_CODEGEN_H__
diff --git a/source/blender/gpu/intern/gpu_draw.c b/source/blender/gpu/intern/gpu_draw.c
index e1ca64388ae..8594743f61d 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/gpu/intern/gpu_draw.c
+ * \ingroup gpu
+ */
+
+
#include <string.h>
#include "GL/glew.h"
@@ -101,7 +106,7 @@ void GPU_render_text(MTFace *tface, int mode,
line_height= MAX4(v1[1], v2[1], v3[1], v4[2]) - MIN4(v1[1], v2[1], v3[1], v4[2]);
else
line_height= MAX3(v1[1], v2[1], v3[1]) - MIN3(v1[1], v2[1], v3[1]);
- line_height *= 1.2; /* could be an option? */
+ line_height *= 1.2f; /* could be an option? */
/* end multiline */
@@ -298,7 +303,7 @@ static void gpu_make_repbind(Image *ima)
if(ima->repbind) {
glDeleteTextures(ima->totbind, (GLuint *)ima->repbind);
MEM_freeN(ima->repbind);
- ima->repbind= 0;
+ ima->repbind= NULL;
ima->tpageflag &= ~IMA_MIPMAP_COMPLETE;
}
@@ -310,12 +315,12 @@ static void gpu_make_repbind(Image *ima)
static void gpu_clear_tpage(void)
{
- if(GTS.lasttface==0)
+ if(GTS.lasttface==NULL)
return;
- GTS.lasttface= 0;
+ GTS.lasttface= NULL;
GTS.curtile= 0;
- GTS.curima= 0;
+ GTS.curima= NULL;
if(GTS.curtilemode!=0) {
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
@@ -353,7 +358,7 @@ static void gpu_set_blend_mode(GPUBlendMode blendmode)
* turn off alpha test in this case */
/* added after 2.45 to clip alpha */
- if(U.glalphaclip == 1.0) {
+ if(U.glalphaclip == 1.0f) {
glDisable(GL_ALPHA_TEST);
}
else {
@@ -427,7 +432,7 @@ int GPU_verify_image(Image *ima, ImageUser *iuser, int tftile, int compare, int
if(compare && ima == GTS.curima && GTS.curtile == GTS.tile &&
GTS.tilemode == GTS.curtilemode && GTS.curtileXRep == GTS.tileXRep &&
GTS.curtileYRep == GTS.tileYRep)
- return (ima!=0);
+ return (ima != NULL);
/* if tiling mode or repeat changed, change texture matrix to fit */
if(GTS.tilemode!=GTS.curtilemode || GTS.curtileXRep!=GTS.tileXRep ||
@@ -464,7 +469,7 @@ int GPU_verify_image(Image *ima, ImageUser *iuser, int tftile, int compare, int
if(GTS.tilemode) {
/* tiled mode */
- if(ima->repbind==0) gpu_make_repbind(ima);
+ if(ima->repbind==NULL) gpu_make_repbind(ima);
if(GTS.tile>=ima->totbind) GTS.tile= 0;
/* this happens when you change repeat buttons */
@@ -583,7 +588,7 @@ int GPU_set_tpage(MTFace *tface, int mipmap)
Image *ima;
/* check if we need to clear the state */
- if(tface==0) {
+ if(tface==NULL) {
gpu_clear_tpage();
return 0;
}
@@ -607,7 +612,7 @@ int GPU_set_tpage(MTFace *tface, int mipmap)
glDisable(GL_TEXTURE_2D);
GTS.curtile= 0;
- GTS.curima= 0;
+ GTS.curima= NULL;
GTS.curtilemode= 0;
GTS.curtileXRep = 0;
GTS.curtileYRep = 0;
@@ -1283,8 +1288,8 @@ int GPU_scene_object_lights(Scene *scene, Object *ob, int lay, float viewmat[][4
/* spot lamp */
negate_v3_v3(direction, base->object->obmat[2]);
glLightfv(GL_LIGHT0+count, GL_SPOT_DIRECTION, direction);
- glLightf(GL_LIGHT0+count, GL_SPOT_CUTOFF, la->spotsize/2.0);
- glLightf(GL_LIGHT0+count, GL_SPOT_EXPONENT, 128.0*la->spotblend);
+ glLightf(GL_LIGHT0+count, GL_SPOT_CUTOFF, la->spotsize/2.0f);
+ glLightf(GL_LIGHT0+count, GL_SPOT_EXPONENT, 128.0f*la->spotblend);
}
else
glLightf(GL_LIGHT0+count, GL_SPOT_CUTOFF, 180.0);
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index cc21572bfa1..453eb995113 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/gpu/intern/gpu_extensions.c
+ * \ingroup gpu
+ */
+
+
#include "GL/glew.h"
#include "DNA_image_types.h"
@@ -49,6 +54,8 @@
#include <stdio.h>
#include <string.h>
+#include "BLI_winstuff.h"
+
/* Extensions support */
/* extensions used:
@@ -220,39 +227,44 @@ int GPU_print_error(const char *str)
return 0;
}
-static void GPU_print_framebuffer_error(GLenum status)
+static void GPU_print_framebuffer_error(GLenum status, char err_out[256])
{
- fprintf(stderr, "GPUFrameBuffer: framebuffer incomplete error %d\n",
- (int)status);
+ const char *err= "unknown";
switch(status) {
case GL_FRAMEBUFFER_COMPLETE_EXT:
break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT:
- fprintf(stderr, "Incomplete attachment.\n");
+ err= "Incomplete attachment";
break;
case GL_FRAMEBUFFER_UNSUPPORTED_EXT:
- fprintf(stderr, "Unsupported framebuffer format.\n");
+ err= "Unsupported framebuffer format";
break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT:
- fprintf(stderr, "Missing attachment.\n");
+ err= "Missing attachment";
break;
case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT:
- fprintf(stderr, "Attached images must have same dimensions.\n");
+ err= "Attached images must have same dimensions";
break;
case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT:
- fprintf(stderr, "Attached images must have same format.\n");
+ err= "Attached images must have same format";
break;
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT:
- fprintf(stderr, "Missing draw buffer.\n");
+ err= "Missing draw buffer";
break;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT:
- fprintf(stderr, "Missing read buffer.\n");
- break;
- default:
- fprintf(stderr, "Unknown.\n");
+ err= "Missing read buffer";
break;
}
+
+ if(err_out) {
+ BLI_snprintf(err_out, 256, "GPUFrameBuffer: framebuffer incomplete error %d '%s'",
+ (int)status, err);
+ }
+ else {
+ fprintf(stderr, "GPUFrameBuffer: framebuffer incomplete error %d '%s'\n",
+ (int)status, err);
+ }
}
/* GPUTexture */
@@ -313,7 +325,7 @@ static void GPU_glTexSubImageEmpty(GLenum target, GLenum format, int x, int y, i
MEM_freeN(pixels);
}
-static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, int depth)
+static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, int depth, char err_out[256])
{
GPUTexture *tex;
GLenum type, format, internalformat;
@@ -333,8 +345,14 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in
glGenTextures(1, &tex->bindcode);
if (!tex->bindcode) {
- fprintf(stderr, "GPUTexture: texture create failed: %d\n",
- (int)glGetError());
+ if(err_out) {
+ BLI_snprintf(err_out, 256, "GPUTexture: texture create failed: %d",
+ (int)glGetError());
+ }
+ else {
+ fprintf(stderr, "GPUTexture: texture create failed: %d\n",
+ (int)glGetError());
+ }
GPU_texture_free(tex);
return NULL;
}
@@ -362,7 +380,7 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in
}
if (tex->target == GL_TEXTURE_1D) {
- glTexImage1D(tex->target, 0, internalformat, tex->w, 0, format, type, 0);
+ glTexImage1D(tex->target, 0, internalformat, tex->w, 0, format, type, NULL);
if (fpixels) {
glTexSubImage1D(tex->target, 0, 0, w, format, type,
@@ -375,7 +393,7 @@ static GPUTexture *GPU_texture_create_nD(int w, int h, int n, float *fpixels, in
}
else {
glTexImage2D(tex->target, 0, internalformat, tex->w, tex->h, 0,
- format, type, 0);
+ format, type, NULL);
if (fpixels) {
glTexSubImage2D(tex->target, 0, 0, 0, w, h,
@@ -550,9 +568,9 @@ GPUTexture *GPU_texture_from_blender(Image *ima, ImageUser *iuser, double time,
return tex;
}
-GPUTexture *GPU_texture_create_1D(int w, float *fpixels)
+GPUTexture *GPU_texture_create_1D(int w, float *fpixels, char err_out[256])
{
- GPUTexture *tex = GPU_texture_create_nD(w, 1, 1, fpixels, 0);
+ GPUTexture *tex = GPU_texture_create_nD(w, 1, 1, fpixels, 0, err_out);
if (tex)
GPU_texture_unbind(tex);
@@ -560,9 +578,9 @@ GPUTexture *GPU_texture_create_1D(int w, float *fpixels)
return tex;
}
-GPUTexture *GPU_texture_create_2D(int w, int h, float *fpixels)
+GPUTexture *GPU_texture_create_2D(int w, int h, float *fpixels, char err_out[256])
{
- GPUTexture *tex = GPU_texture_create_nD(w, h, 2, fpixels, 0);
+ GPUTexture *tex = GPU_texture_create_nD(w, h, 2, fpixels, 0, err_out);
if (tex)
GPU_texture_unbind(tex);
@@ -570,9 +588,9 @@ GPUTexture *GPU_texture_create_2D(int w, int h, float *fpixels)
return tex;
}
-GPUTexture *GPU_texture_create_depth(int w, int h)
+GPUTexture *GPU_texture_create_depth(int w, int h, char err_out[256])
{
- GPUTexture *tex = GPU_texture_create_nD(w, h, 2, NULL, 1);
+ GPUTexture *tex = GPU_texture_create_nD(w, h, 2, NULL, 1, err_out);
if (tex)
GPU_texture_unbind(tex);
@@ -700,7 +718,7 @@ GPUFrameBuffer *GPU_framebuffer_create(void)
return fb;
}
-int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex)
+int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex, char err_out[256])
{
GLenum status;
GLenum attachment;
@@ -729,7 +747,7 @@ int GPU_framebuffer_texture_attach(GPUFrameBuffer *fb, GPUTexture *tex)
if (status != GL_FRAMEBUFFER_COMPLETE_EXT) {
GPU_framebuffer_restore();
- GPU_print_framebuffer_error(status);
+ GPU_print_framebuffer_error(status, err_out);
return 0;
}
@@ -841,7 +859,7 @@ struct GPUOffScreen {
GPUTexture *depth;
};
-GPUOffScreen *GPU_offscreen_create(int *width, int *height)
+GPUOffScreen *GPU_offscreen_create(int *width, int *height, char err_out[256])
{
GPUOffScreen *ofs;
@@ -853,7 +871,7 @@ GPUOffScreen *GPU_offscreen_create(int *width, int *height)
return NULL;
}
- ofs->depth = GPU_texture_create_depth(*width, *height);
+ ofs->depth = GPU_texture_create_depth(*width, *height, err_out);
if(!ofs->depth) {
GPU_offscreen_free(ofs);
return NULL;
@@ -865,18 +883,18 @@ GPUOffScreen *GPU_offscreen_create(int *width, int *height)
printf("Offscreen size differs from given size!\n");
}
- if(!GPU_framebuffer_texture_attach(ofs->fb, ofs->depth)) {
+ if(!GPU_framebuffer_texture_attach(ofs->fb, ofs->depth, err_out)) {
GPU_offscreen_free(ofs);
return NULL;
}
- ofs->color = GPU_texture_create_2D(*width, *height, NULL);
+ ofs->color = GPU_texture_create_2D(*width, *height, NULL, err_out);
if(!ofs->color) {
GPU_offscreen_free(ofs);
return NULL;
}
- if(!GPU_framebuffer_texture_attach(ofs->fb, ofs->color)) {
+ if(!GPU_framebuffer_texture_attach(ofs->fb, ofs->color, err_out)) {
GPU_offscreen_free(ofs);
return NULL;
}
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c
index 675c73da960..4155b7a8ac0 100644
--- a/source/blender/gpu/intern/gpu_material.c
+++ b/source/blender/gpu/intern/gpu_material.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/gpu/intern/gpu_material.c
+ * \ingroup gpu
+ */
+
+
#include <math.h>
#include <string.h>
@@ -104,8 +109,8 @@ struct GPULamp {
int type, mode, lay, hide;
- float dynpower, dyncol[3];
- float power, col[3];
+ float dynenergy, dyncol[3];
+ float energy, col[3];
float co[3], vec[3];
float dynco[3], dynvec[3];
@@ -114,7 +119,7 @@ struct GPULamp {
float dynimat[4][4];
float spotsi, spotbl, k;
- float dist;
+ float dist, att1, att2;
float bias, d, clipend;
int size;
@@ -256,11 +261,11 @@ void GPU_material_bind(GPUMaterial *material, int oblay, int viewlay, double tim
lamp= nlink->data;
if(!lamp->hide && (lamp->lay & viewlay) && (!(lamp->mode & LA_LAYER) || (lamp->lay & oblay))) {
- lamp->dynpower = lamp->power;
+ lamp->dynenergy = lamp->energy;
VECCOPY(lamp->dyncol, lamp->col);
}
else {
- lamp->dynpower = 0.0f;
+ lamp->dynenergy = 0.0f;
lamp->dyncol[0]= lamp->dyncol[1]= lamp->dyncol[2] = 0.0f;
}
}
@@ -395,6 +400,9 @@ static GPUNodeLink *lamp_get_visibility(GPUMaterial *mat, GPULamp *lamp, GPUNode
case LA_FALLOFF_INVSQUARE:
GPU_link(mat, "lamp_falloff_invsquare", GPU_uniform(&lamp->dist), *dist, &visifac);
break;
+ case LA_FALLOFF_SLIDERS:
+ GPU_link(mat, "lamp_falloff_sliders", GPU_uniform(&lamp->dist), GPU_uniform(&lamp->att1), GPU_uniform(&lamp->att2), *dist, &visifac);
+ break;
case LA_FALLOFF_CURVE:
{
float *array;
@@ -521,6 +529,9 @@ static void add_to_diffuse(GPUMaterial *mat, Material *ma, GPUShadeInput *shi, G
else {
/* input */
switch(ma->rampin_col) {
+ case MA_RAMP_IN_ENERGY:
+ GPU_link(mat, "ramp_rgbtobw", rgb, &fac);
+ break;
case MA_RAMP_IN_SHADER:
fac= is;
break;
@@ -571,6 +582,9 @@ static void do_specular_ramp(GPUShadeInput *shi, GPUNodeLink *is, GPUNodeLink *t
/* input */
switch(ma->rampin_spec) {
+ case MA_RAMP_IN_ENERGY:
+ fac = t;
+ break;
case MA_RAMP_IN_SHADER:
fac = is;
break;
@@ -670,7 +684,7 @@ static void shade_one_light(GPUShadeInput *shi, GPUShadeResult *shr, GPULamp *la
if(lamp->mode & LA_ONLYSHADOW) {
GPU_link(mat, "shade_only_shadow", i, shadfac,
- GPU_dynamic_uniform(&lamp->dynpower), &shadfac);
+ GPU_dynamic_uniform(&lamp->dynenergy), &shadfac);
if(!(lamp->mode & LA_NO_DIFF))
GPU_link(mat, "shade_only_shadow_diffuse", shadfac, shi->rgb,
@@ -909,7 +923,7 @@ static void do_material_tex(GPUShadeInput *shi)
mtex= ma->mtex[tex_nr];
tex= mtex->tex;
- if(tex==0) continue;
+ if(tex == NULL) continue;
/* which coords */
if(mtex->texco==TEXCO_ORCO)
@@ -1046,7 +1060,7 @@ static void do_material_tex(GPUShadeInput *shi)
else
newnor = tnor;
- norfac = MIN2(fabsf(mtex->norfac), 1.0);
+ norfac = MIN2(fabsf(mtex->norfac), 1.0f);
if(norfac == 1.0f && !GPU_link_changed(stencil)) {
shi->vn = newnor;
@@ -1250,10 +1264,10 @@ void GPU_shadeinput_set(GPUMaterial *mat, Material *ma, GPUShadeInput *shi)
void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
{
GPUMaterial *mat= shi->gpumat;
- GPUNodeLink *emit, *mistfac;
+ GPUNodeLink *emit, *ulinfac, *ulogfac, *mistfac;
Material *ma= shi->mat;
World *world= mat->scene->world;
- float misttype;
+ float linfac, logfac, misttype;
memset(shr, 0, sizeof(*shr));
@@ -1291,6 +1305,20 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr)
shr->alpha = shi->alpha;
if(world) {
+ /* exposure correction */
+ if(world->exp!=0.0f || world->range!=1.0f) {
+ linfac= 1.0 + pow((2.0*world->exp + 0.5), -10);
+ logfac= log((linfac-1.0f)/linfac)/world->range;
+
+ GPU_link(mat, "set_value", GPU_uniform(&linfac), &ulinfac);
+ GPU_link(mat, "set_value", GPU_uniform(&logfac), &ulogfac);
+
+ GPU_link(mat, "shade_exposure_correct", shr->combined,
+ ulinfac, ulogfac, &shr->combined);
+ GPU_link(mat, "shade_exposure_correct", shr->spec,
+ ulinfac, ulogfac, &shr->spec);
+ }
+
/* ambient color */
if(world->ambr!=0.0f || world->ambg!=0.0f || world->ambb!=0.0f) {
if(GPU_link_changed(shi->amb) || ma->amb != 0.0f)
@@ -1419,14 +1447,14 @@ void GPU_lamp_update(GPULamp *lamp, int lay, int hide, float obmat[][4])
invert_m4_m4(lamp->imat, mat);
}
-void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float power)
+void GPU_lamp_update_colors(GPULamp *lamp, float r, float g, float b, float energy)
{
- lamp->power = power;
- if(lamp->mode & LA_NEG) lamp->power= -lamp->power;
+ lamp->energy = energy;
+ if(lamp->mode & LA_NEG) lamp->energy= -lamp->energy;
- lamp->col[0]= r* lamp->power;
- lamp->col[1]= g* lamp->power;
- lamp->col[2]= b* lamp->power;
+ lamp->col[0]= r* lamp->energy;
+ lamp->col[1]= g* lamp->energy;
+ lamp->col[2]= b* lamp->energy;
}
static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *la, GPULamp *lamp)
@@ -1442,25 +1470,27 @@ static void gpu_lamp_from_blender(Scene *scene, Object *ob, Object *par, Lamp *l
lamp->mode = la->mode;
lamp->type = la->type;
- lamp->power= (ELEM(la->type, LA_SUN, LA_HEMI))? la->energy*M_PI: la->energy*M_PI; //XXX la->power;
- if(lamp->mode & LA_NEG) lamp->power= -lamp->power;
+ lamp->energy = la->energy;
+ if(lamp->mode & LA_NEG) lamp->energy= -lamp->energy;
- lamp->col[0]= la->r*lamp->power;
- lamp->col[1]= la->g*lamp->power;
- lamp->col[2]= la->b*lamp->power;
+ lamp->col[0]= la->r*lamp->energy;
+ lamp->col[1]= la->g*lamp->energy;
+ lamp->col[2]= la->b*lamp->energy;
GPU_lamp_update(lamp, ob->lay, (ob->restrictflag & OB_RESTRICT_RENDER), ob->obmat);
lamp->spotsi= la->spotsize;
if(lamp->mode & LA_HALO)
- if(lamp->spotsi > 170.0)
- lamp->spotsi = 170.0;
+ if(lamp->spotsi > 170.0f)
+ lamp->spotsi = 170.0f;
lamp->spotsi= cos(M_PI*lamp->spotsi/360.0);
- lamp->spotbl= (1.0 - lamp->spotsi)*la->spotblend;
+ lamp->spotbl= (1.0f - lamp->spotsi)*la->spotblend;
lamp->k= la->k;
lamp->dist= la->dist;
lamp->falloff_type= la->falloff_type;
+ lamp->att1= la->att1;
+ lamp->att2= la->att2;
lamp->curfalloff= la->curfalloff;
/* initshadowbuf */
@@ -1523,13 +1553,13 @@ GPULamp *GPU_lamp_from_blender(Scene *scene, Object *ob, Object *par)
return lamp;
}
- lamp->tex = GPU_texture_create_depth(lamp->size, lamp->size);
+ lamp->tex = GPU_texture_create_depth(lamp->size, lamp->size, NULL);
if(!lamp->tex) {
gpu_lamp_shadow_free(lamp);
return lamp;
}
- if(!GPU_framebuffer_texture_attach(lamp->fb, lamp->tex)) {
+ if(!GPU_framebuffer_texture_attach(lamp->fb, lamp->tex, NULL)) {
gpu_lamp_shadow_free(lamp);
return lamp;
}
diff --git a/source/blender/gpu/intern/gpu_shader_material.glsl.c b/source/blender/gpu/intern/gpu_shader_material.glsl.c
index b1557552143..52963799f92 100644
--- a/source/blender/gpu/intern/gpu_shader_material.glsl.c
+++ b/source/blender/gpu/intern/gpu_shader_material.glsl.c
@@ -1,3 +1,6 @@
+/** \file blender/gpu/intern/gpu_shader_material.glsl.c
+ * \ingroup gpu
+ */
/* DataToC output of file <gpu_shader_material_glsl> */
int datatoc_gpu_shader_material_glsl_size= 38950;
diff --git a/source/blender/gpu/intern/gpu_shader_vertex.glsl.c b/source/blender/gpu/intern/gpu_shader_vertex.glsl.c
index 5d9bd7c60d9..d7a7bac771d 100644
--- a/source/blender/gpu/intern/gpu_shader_vertex.glsl.c
+++ b/source/blender/gpu/intern/gpu_shader_vertex.glsl.c
@@ -1,3 +1,6 @@
+/** \file blender/gpu/intern/gpu_shader_vertex.glsl.c
+ * \ingroup gpu
+ */
/* DataToC output of file <gpu_shader_vertex_glsl> */
int datatoc_gpu_shader_vertex_glsl_size= 228;
diff --git a/source/blender/ikplugin/BIK_api.h b/source/blender/ikplugin/BIK_api.h
index 2ccd70723a3..413eb3c24f4 100644
--- a/source/blender/ikplugin/BIK_api.h
+++ b/source/blender/ikplugin/BIK_api.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/ikplugin/BIK_api.h
+ * \ingroup ikplugin
+ */
+
+
#ifndef BIK_API_H
#define BIK_API_H
diff --git a/source/blender/ikplugin/intern/ikplugin_api.c b/source/blender/ikplugin/intern/ikplugin_api.c
index e26e3150669..f5b6715be9c 100644
--- a/source/blender/ikplugin/intern/ikplugin_api.c
+++ b/source/blender/ikplugin/intern/ikplugin_api.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/ikplugin/intern/ikplugin_api.c
+ * \ingroup ikplugin
+ */
+
+
#include "BIK_api.h"
#include "BLI_blenlib.h"
diff --git a/source/blender/ikplugin/intern/ikplugin_api.h b/source/blender/ikplugin/intern/ikplugin_api.h
index f93c7ccd292..f8f9b2447bf 100644
--- a/source/blender/ikplugin/intern/ikplugin_api.h
+++ b/source/blender/ikplugin/intern/ikplugin_api.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/ikplugin/intern/ikplugin_api.h
+ * \ingroup ikplugin
+ */
+
+
#ifndef IKPLUGIN_API_H
#define IKPLUGIN_API_H
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c
index a79d46c2780..6d915a18f78 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.c
+++ b/source/blender/ikplugin/intern/iksolver_plugin.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/ikplugin/intern/iksolver_plugin.c
+ * \ingroup ikplugin
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BIK_api.h"
@@ -395,7 +400,7 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
/* end effector in world space */
copy_m4_m4(end_pose, pchan->pose_mat);
VECCOPY(end_pose[3], pchan->pose_tail);
- mul_serie_m4(world_pose, goalinv, ob->obmat, end_pose, 0, 0, 0, 0, 0);
+ mul_serie_m4(world_pose, goalinv, ob->obmat, end_pose, NULL, NULL, NULL, NULL, NULL);
/* blend position */
goalpos[0]= fac*goalpos[0] + mfac*world_pose[3][0];
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.h b/source/blender/ikplugin/intern/iksolver_plugin.h
index 0cf03e78d8d..8b7bd0bff6c 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.h
+++ b/source/blender/ikplugin/intern/iksolver_plugin.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/ikplugin/intern/iksolver_plugin.h
+ * \ingroup ikplugin
+ */
+
+
#ifndef IKSOLVER_PLUGIN_H
#define IKSOLVER_PLUGIN_H
diff --git a/source/blender/ikplugin/intern/itasc_plugin.cpp b/source/blender/ikplugin/intern/itasc_plugin.cpp
index e392a05cc54..80faa5e301e 100644
--- a/source/blender/ikplugin/intern/itasc_plugin.cpp
+++ b/source/blender/ikplugin/intern/itasc_plugin.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/ikplugin/intern/itasc_plugin.cpp
+ * \ingroup ikplugin
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include <vector>
@@ -855,13 +860,11 @@ static int convert_channels(IK_Scene *ikscene, PoseTree *tree)
{
IK_Channel *ikchan;
bPoseChannel *pchan;
- Bone *bone;
int a, flag, njoint;
njoint = 0;
for(a=0, ikchan = ikscene->channels; a<ikscene->numchan; ++a, ++ikchan) {
pchan= tree->pchan[a];
- bone= pchan->bone;
ikchan->pchan = pchan;
ikchan->parent = (a>0) ? tree->parent[a] : -1;
ikchan->owner = ikscene->blArmature;
diff --git a/source/blender/ikplugin/intern/itasc_plugin.h b/source/blender/ikplugin/intern/itasc_plugin.h
index 906fa9c8ed3..a32343c1a09 100644
--- a/source/blender/ikplugin/intern/itasc_plugin.h
+++ b/source/blender/ikplugin/intern/itasc_plugin.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/ikplugin/intern/itasc_plugin.h
+ * \ingroup ikplugin
+ */
+
+
#ifndef ITASC_PLUGIN_H
#define ITASC_PLUGIN_H
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index 625e684ea67..21249c9e8f7 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/imbuf/IMB_imbuf.h
+ * \ingroup imbuf
+ */
+
/**
* @file IMB_imbuf.h
* @brief IMage Buffer module.
diff --git a/source/blender/imbuf/IMB_thumbs.h b/source/blender/imbuf/IMB_thumbs.h
index ae7ccab98a1..583a677ebd9 100644
--- a/source/blender/imbuf/IMB_thumbs.h
+++ b/source/blender/imbuf/IMB_thumbs.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/IMB_thumbs.h
+ * \ingroup imbuf
+ */
+
+
#ifndef _IMB_THUMBS_H
#define _IMB_THUMBS_H
diff --git a/source/blender/imbuf/intern/IMB_anim.h b/source/blender/imbuf/intern/IMB_anim.h
index ea492d8bbf5..4804d363628 100644
--- a/source/blender/imbuf/intern/IMB_anim.h
+++ b/source/blender/imbuf/intern/IMB_anim.h
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/IMB_anim.h
+ * \ingroup imbuf
+ */
+
+
#ifndef IMB_ANIM_H
#define IMB_ANIM_H
diff --git a/source/blender/imbuf/intern/IMB_filetype.h b/source/blender/imbuf/intern/IMB_filetype.h
index a1066634aea..cf0d0990d33 100644
--- a/source/blender/imbuf/intern/IMB_filetype.h
+++ b/source/blender/imbuf/intern/IMB_filetype.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/IMB_filetype.h
+ * \ingroup imbuf
+ */
+
+
#ifndef IMB_FILETYPE_H
#define IMB_FILETYPE_H
diff --git a/source/blender/imbuf/intern/IMB_metadata.h b/source/blender/imbuf/intern/IMB_metadata.h
index 9011c7d04a7..723124bd2f5 100644
--- a/source/blender/imbuf/intern/IMB_metadata.h
+++ b/source/blender/imbuf/intern/IMB_metadata.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/IMB_metadata.h
+ * \ingroup imbuf
+ */
+
+
#ifndef _IMB_IMGINFO_H
#define _IMB_IMGINFO_H
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index 99b3c3a58d6..a8b9e21331d 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/allocimbuf.c
+ * \ingroup imbuf
+ */
+
+
/* It's become a bit messy... Basically, only the IMB_ prefixed files
* should remain. */
@@ -123,7 +128,7 @@ static void freeencodedbufferImBuf(ImBuf *ibuf)
if(ibuf->encodedbuffer && (ibuf->mall & IB_mem))
MEM_freeN(ibuf->encodedbuffer);
- ibuf->encodedbuffer = 0;
+ ibuf->encodedbuffer = NULL;
ibuf->encodedbuffersize = 0;
ibuf->encodedsize = 0;
ibuf->mall &= ~IB_mem;
@@ -422,11 +427,11 @@ ImBuf *IMB_dupImBuf(ImBuf *ibuf1)
// set malloc flag
tbuf.mall = ibuf2->mall;
- tbuf.c_handle = 0;
+ tbuf.c_handle = NULL;
tbuf.refcounter = 0;
// for now don't duplicate metadata
- tbuf.metadata = 0;
+ tbuf.metadata = NULL;
*ibuf2 = tbuf;
@@ -445,12 +450,12 @@ static void imbuf_cache_destructor(void *data)
IMB_freezbuffloatImBuf(ibuf);
freeencodedbufferImBuf(ibuf);
- ibuf->c_handle = 0;
+ ibuf->c_handle = NULL;
}
static MEM_CacheLimiterC **get_imbuf_cache_limiter(void)
{
- static MEM_CacheLimiterC *c = 0;
+ static MEM_CacheLimiterC *c = NULL;
if(!c)
c = new_MEM_CacheLimiter(imbuf_cache_destructor);
@@ -461,7 +466,7 @@ static MEM_CacheLimiterC **get_imbuf_cache_limiter(void)
void IMB_free_cache_limiter(void)
{
delete_MEM_CacheLimiter(*get_imbuf_cache_limiter());
- *get_imbuf_cache_limiter() = 0;
+ *get_imbuf_cache_limiter() = NULL;
}
void IMB_cache_limiter_insert(ImBuf *i)
@@ -480,7 +485,7 @@ void IMB_cache_limiter_unmanage(ImBuf *i)
{
if(i->c_handle) {
MEM_CacheLimiter_unmanage(i->c_handle);
- i->c_handle = 0;
+ i->c_handle = NULL;
}
}
diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c
index 15369e17b28..a964f345b2b 100644
--- a/source/blender/imbuf/intern/anim_movie.c
+++ b/source/blender/imbuf/intern/anim_movie.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/anim_movie.c
+ * \ingroup imbuf
+ */
+
+
#ifdef _WIN32
#define INC_OLE2
#include <windows.h>
@@ -348,7 +353,7 @@ void IMB_free_anim(struct anim * anim) {
}
void IMB_close_anim(struct anim * anim) {
- if (anim == 0) return;
+ if (anim == NULL) return;
IMB_free_anim(anim);
}
@@ -449,7 +454,7 @@ static int startavi (struct anim *anim) {
}
anim->duration = anim->avi->header->TotalFrames;
- anim->params = 0;
+ anim->params = NULL;
anim->x = anim->avi->header->Width;
anim->y = anim->avi->header->Height;
@@ -1029,9 +1034,9 @@ static void free_anim_redcode(struct anim * anim) {
/* gelukt, haal dan eerste plaatje van animatie */
static struct ImBuf * anim_getnew(struct anim * anim) {
- struct ImBuf *ibuf = 0;
+ struct ImBuf *ibuf = NULL;
- if (anim == NULL) return(0);
+ if (anim == NULL) return(NULL);
free_anim_movie(anim);
free_anim_avi(anim);
@@ -1046,7 +1051,7 @@ static struct ImBuf * anim_getnew(struct anim * anim) {
#endif
- if (anim->curtype != 0) return (0);
+ if (anim->curtype != 0) return (NULL);
anim->curtype = imb_get_anim_type(anim->name);
switch (anim->curtype) {
@@ -1058,13 +1063,13 @@ static struct ImBuf * anim_getnew(struct anim * anim) {
}
break;
case ANIM_MOVIE:
- if (startmovie(anim)) return (0);
+ if (startmovie(anim)) return (NULL);
ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0); /* fake */
break;
case ANIM_AVI:
if (startavi(anim)) {
printf("couldnt start avi\n");
- return (0);
+ return (NULL);
}
ibuf = IMB_allocImBuf (anim->x, anim->y, 24, 0);
break;
@@ -1091,7 +1096,7 @@ static struct ImBuf * anim_getnew(struct anim * anim) {
}
struct ImBuf * IMB_anim_previewframe(struct anim * anim) {
- struct ImBuf * ibuf = 0;
+ struct ImBuf * ibuf = NULL;
int position = 0;
ibuf = IMB_anim_absolute(anim, 0);
@@ -1104,27 +1109,27 @@ struct ImBuf * IMB_anim_previewframe(struct anim * anim) {
}
struct ImBuf * IMB_anim_absolute(struct anim * anim, int position) {
- struct ImBuf * ibuf = 0;
+ struct ImBuf * ibuf = NULL;
char head[256], tail[256];
unsigned short digits;
int pic;
int filter_y;
- if (anim == NULL) return(0);
+ if (anim == NULL) return(NULL);
filter_y = (anim->ib_flags & IB_animdeinterlace);
if (anim->curtype == 0) {
ibuf = anim_getnew(anim);
if (ibuf == NULL) {
- return (0);
+ return(NULL);
}
IMB_freeImBuf(ibuf); /* ???? */
ibuf= NULL;
}
- if (position < 0) return(0);
- if (position >= anim->duration) return(0);
+ if (position < 0) return(NULL);
+ if (position >= anim->duration) return(NULL);
switch(anim->curtype) {
case ANIM_SEQUENCE:
diff --git a/source/blender/imbuf/intern/bmp.c b/source/blender/imbuf/intern/bmp.c
index cf2638071bb..d79acc88a80 100644
--- a/source/blender/imbuf/intern/bmp.c
+++ b/source/blender/imbuf/intern/bmp.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/bmp.c
+ * \ingroup imbuf
+ */
+
+
#include "BLI_blenlib.h"
#include "imbuf.h"
@@ -103,7 +108,7 @@ int imb_is_a_bmp(unsigned char *buf) {
struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags)
{
- struct ImBuf *ibuf = 0;
+ struct ImBuf *ibuf = NULL;
BMPINFOHEADER bmi;
int x, y, depth, skip, i;
unsigned char *bmp, *rect;
@@ -111,7 +116,7 @@ struct ImBuf *imb_bmp_decode(unsigned char *mem, size_t size, int flags)
(void)size; /* unused */
- if (checkbmp(mem) == 0) return(0);
+ if (checkbmp(mem) == 0) return(NULL);
if ((mem[0] == 'B') && (mem[1] == 'M')) {
/* skip fileheader */
diff --git a/source/blender/imbuf/intern/cache.c b/source/blender/imbuf/intern/cache.c
index 23f0dd87b1a..0b53c6bf79c 100644
--- a/source/blender/imbuf/intern/cache.c
+++ b/source/blender/imbuf/intern/cache.c
@@ -20,6 +20,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/cache.c
+ * \ingroup imbuf
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
diff --git a/source/blender/imbuf/intern/cineon/cin_debug_stuff.h b/source/blender/imbuf/intern/cineon/cin_debug_stuff.h
index 5d7daa19c61..a97499fb1ae 100644
--- a/source/blender/imbuf/intern/cineon/cin_debug_stuff.h
+++ b/source/blender/imbuf/intern/cineon/cin_debug_stuff.h
@@ -1 +1,4 @@
+/** \file blender/imbuf/intern/cineon/cin_debug_stuff.h
+ * \ingroup imbcineon
+ */
#define d_printf printf
diff --git a/source/blender/imbuf/intern/cineon/cineon_dpx.c b/source/blender/imbuf/intern/cineon/cineon_dpx.c
index 9882a9ea5ae..504817b263f 100644
--- a/source/blender/imbuf/intern/cineon/cineon_dpx.c
+++ b/source/blender/imbuf/intern/cineon/cineon_dpx.c
@@ -29,6 +29,11 @@
* I hearby donate this code and all rights to the Blender Foundation.
* $Id$
*/
+
+/** \file blender/imbuf/intern/cineon/cineon_dpx.c
+ * \ingroup imbcineon
+ */
+
#include <stdio.h>
#include <string.h> /*for memcpy*/
diff --git a/source/blender/imbuf/intern/cineon/cineonfile.h b/source/blender/imbuf/intern/cineon/cineonfile.h
index 6703630179c..31aa56f560c 100644
--- a/source/blender/imbuf/intern/cineon/cineonfile.h
+++ b/source/blender/imbuf/intern/cineon/cineonfile.h
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/cineonfile.h
+ * \ingroup imbcineon
+ */
/*
* Cineon image file format library definitions.
* Cineon file format structures.
diff --git a/source/blender/imbuf/intern/cineon/cineonlib.c b/source/blender/imbuf/intern/cineon/cineonlib.c
index a2a0fae526d..fdcd3491af1 100644
--- a/source/blender/imbuf/intern/cineon/cineonlib.c
+++ b/source/blender/imbuf/intern/cineon/cineonlib.c
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/cineonlib.c
+ * \ingroup imbcineon
+ */
/*
* Cineon image file format library routines.
*
@@ -603,7 +606,6 @@ CineonFile*
cineonOpenFromMem(unsigned char *mem, unsigned int size) {
CineonGenericHeader header;
- int i;
CineonFile* cineon = (CineonFile* )malloc(sizeof(CineonFile));
if (cineon == 0) {
@@ -667,8 +669,6 @@ cineonOpenFromMem(unsigned char *mem, unsigned int size) {
return 0;
}
cineon->pixelBufferUsed = 0;
-
- i = cineon->imageOffset;
if (logimage_fseek(cineon, cineon->imageOffset, SEEK_SET) != 0) {
if (verbose) d_printf("Couldn't seek to image data at %d\n", cineon->imageOffset);
diff --git a/source/blender/imbuf/intern/cineon/cineonlib.h b/source/blender/imbuf/intern/cineon/cineonlib.h
index edb96924807..c24503e2ada 100644
--- a/source/blender/imbuf/intern/cineon/cineonlib.h
+++ b/source/blender/imbuf/intern/cineon/cineonlib.h
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/cineonlib.h
+ * \ingroup imbcineon
+ */
/*
* Cineon image file format library definitions.
* Also handles DPX files (almost)
diff --git a/source/blender/imbuf/intern/cineon/dpxfile.h b/source/blender/imbuf/intern/cineon/dpxfile.h
index 947c9bfce6e..abb11ec2e8c 100644
--- a/source/blender/imbuf/intern/cineon/dpxfile.h
+++ b/source/blender/imbuf/intern/cineon/dpxfile.h
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/dpxfile.h
+ * \ingroup imbcineon
+ */
/*
* Cineon image file format library definitions.
* Dpx file format structures.
diff --git a/source/blender/imbuf/intern/cineon/dpxlib.c b/source/blender/imbuf/intern/cineon/dpxlib.c
index ade69b4d7c0..a63a2ea1dab 100644
--- a/source/blender/imbuf/intern/cineon/dpxlib.c
+++ b/source/blender/imbuf/intern/cineon/dpxlib.c
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/dpxlib.c
+ * \ingroup imbcineon
+ */
/*
* Dpx image file format library routines.
*
diff --git a/source/blender/imbuf/intern/cineon/dpxlib.h b/source/blender/imbuf/intern/cineon/dpxlib.h
index 243bffa6227..1607de311c3 100644
--- a/source/blender/imbuf/intern/cineon/dpxlib.h
+++ b/source/blender/imbuf/intern/cineon/dpxlib.h
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/dpxlib.h
+ * \ingroup imbcineon
+ */
/*
* DPX image file format library definitions.
*
diff --git a/source/blender/imbuf/intern/cineon/logImageCore.c b/source/blender/imbuf/intern/cineon/logImageCore.c
index a340a81d2eb..e1f1500cb83 100644
--- a/source/blender/imbuf/intern/cineon/logImageCore.c
+++ b/source/blender/imbuf/intern/cineon/logImageCore.c
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/logImageCore.c
+ * \ingroup imbcineon
+ */
/*
* Cineon image file format library routines.
*
diff --git a/source/blender/imbuf/intern/cineon/logImageCore.h b/source/blender/imbuf/intern/cineon/logImageCore.h
index 0ff8e086622..f05c19c4f47 100644
--- a/source/blender/imbuf/intern/cineon/logImageCore.h
+++ b/source/blender/imbuf/intern/cineon/logImageCore.h
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/logImageCore.h
+ * \ingroup imbcineon
+ */
/*
* Cineon image file format library definitions.
* Cineon and DPX common structures.
diff --git a/source/blender/imbuf/intern/cineon/logImageLib.c b/source/blender/imbuf/intern/cineon/logImageLib.c
index 195dd65b08d..6c330fb3dae 100644
--- a/source/blender/imbuf/intern/cineon/logImageLib.c
+++ b/source/blender/imbuf/intern/cineon/logImageLib.c
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/logImageLib.c
+ * \ingroup imbcineon
+ */
/*
* Cineon and DPX image file format library routines.
*
diff --git a/source/blender/imbuf/intern/cineon/logImageLib.h b/source/blender/imbuf/intern/cineon/logImageLib.h
index 8aaf5ff63f4..9f6d3ad2adf 100644
--- a/source/blender/imbuf/intern/cineon/logImageLib.h
+++ b/source/blender/imbuf/intern/cineon/logImageLib.h
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/logImageLib.h
+ * \ingroup imbcineon
+ */
/*
* Common library definitions for Cineon and DPX image files.
*
diff --git a/source/blender/imbuf/intern/cineon/logmemfile.c b/source/blender/imbuf/intern/cineon/logmemfile.c
index 20eabf6dfc3..6347eb5fdf9 100644
--- a/source/blender/imbuf/intern/cineon/logmemfile.c
+++ b/source/blender/imbuf/intern/cineon/logmemfile.c
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/logmemfile.c
+ * \ingroup imbcineon
+ */
/*
* Cineon image file format library routines.
*
diff --git a/source/blender/imbuf/intern/cineon/logmemfile.h b/source/blender/imbuf/intern/cineon/logmemfile.h
index 213b84f8f1d..36f950232ac 100644
--- a/source/blender/imbuf/intern/cineon/logmemfile.h
+++ b/source/blender/imbuf/intern/cineon/logmemfile.h
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/cineon/logmemfile.h
+ * \ingroup imbcineon
+ */
/*
* Cineon image file format library routines.
*
diff --git a/source/blender/imbuf/intern/dds/BlockDXT.cpp b/source/blender/imbuf/intern/dds/BlockDXT.cpp
index b718c1255b2..2989361efe6 100644
--- a/source/blender/imbuf/intern/dds/BlockDXT.cpp
+++ b/source/blender/imbuf/intern/dds/BlockDXT.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/BlockDXT.cpp
+ * \ingroup imbdds
+ */
+
+
/*
* This file is based on a similar file from the NVIDIA texture tools
* (http://nvidia-texture-tools.googlecode.com/)
diff --git a/source/blender/imbuf/intern/dds/BlockDXT.h b/source/blender/imbuf/intern/dds/BlockDXT.h
index cabd7cfeaea..7c5b9acffd2 100644
--- a/source/blender/imbuf/intern/dds/BlockDXT.h
+++ b/source/blender/imbuf/intern/dds/BlockDXT.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/BlockDXT.h
+ * \ingroup imbdds
+ */
+
+
/*
* This file is based on a similar file from the NVIDIA texture tools
* (http://nvidia-texture-tools.googlecode.com/)
diff --git a/source/blender/imbuf/intern/dds/Color.h b/source/blender/imbuf/intern/dds/Color.h
index fc180225522..5efc259b795 100644
--- a/source/blender/imbuf/intern/dds/Color.h
+++ b/source/blender/imbuf/intern/dds/Color.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/Color.h
+ * \ingroup imbdds
+ */
+
+
/*
* This file is based on a similar file from the NVIDIA texture tools
* (http://nvidia-texture-tools.googlecode.com/)
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.cpp b/source/blender/imbuf/intern/dds/ColorBlock.cpp
index c03a8a2ebc4..711d1b54cfa 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.cpp
+++ b/source/blender/imbuf/intern/dds/ColorBlock.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/ColorBlock.cpp
+ * \ingroup imbdds
+ */
+
+
/*
* This file is based on a similar file from the NVIDIA texture tools
* (http://nvidia-texture-tools.googlecode.com/)
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.h b/source/blender/imbuf/intern/dds/ColorBlock.h
index f400a3ee0bb..dd40d21e8b3 100644
--- a/source/blender/imbuf/intern/dds/ColorBlock.h
+++ b/source/blender/imbuf/intern/dds/ColorBlock.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/ColorBlock.h
+ * \ingroup imbdds
+ */
+
+
/*
* This file is based on a similar file from the NVIDIA texture tools
* (http://nvidia-texture-tools.googlecode.com/)
diff --git a/source/blender/imbuf/intern/dds/Common.h b/source/blender/imbuf/intern/dds/Common.h
index 5fdeadd2a39..25b743311d2 100644
--- a/source/blender/imbuf/intern/dds/Common.h
+++ b/source/blender/imbuf/intern/dds/Common.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/Common.h
+ * \ingroup imbdds
+ */
+
+
#ifndef _DDS_COMMON_H
#define _DDS_COMMON_H
diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
index 8acec006ed8..ede82896554 100644
--- a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
+++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/DirectDrawSurface.cpp
+ * \ingroup imbdds
+ */
+
+
/*
* This file is based on a similar file from the NVIDIA texture tools
* (http://nvidia-texture-tools.googlecode.com/)
diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.h b/source/blender/imbuf/intern/dds/DirectDrawSurface.h
index 1b4694f9306..cc04c50e795 100644
--- a/source/blender/imbuf/intern/dds/DirectDrawSurface.h
+++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/DirectDrawSurface.h
+ * \ingroup imbdds
+ */
+
+
/*
* This file is based on a similar file from the NVIDIA texture tools
* (http://nvidia-texture-tools.googlecode.com/)
diff --git a/source/blender/imbuf/intern/dds/Image.cpp b/source/blender/imbuf/intern/dds/Image.cpp
index 7041aab2e47..a775a9125d2 100644
--- a/source/blender/imbuf/intern/dds/Image.cpp
+++ b/source/blender/imbuf/intern/dds/Image.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/Image.cpp
+ * \ingroup imbdds
+ */
+
+
/*
* This file is based on a similar file from the NVIDIA texture tools
* (http://nvidia-texture-tools.googlecode.com/)
diff --git a/source/blender/imbuf/intern/dds/Image.h b/source/blender/imbuf/intern/dds/Image.h
index e4286cba58a..88051410056 100644
--- a/source/blender/imbuf/intern/dds/Image.h
+++ b/source/blender/imbuf/intern/dds/Image.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/Image.h
+ * \ingroup imbdds
+ */
+
+
/*
* This file is based on a similar file from the NVIDIA texture tools
* (http://nvidia-texture-tools.googlecode.com/)
diff --git a/source/blender/imbuf/intern/dds/PixelFormat.h b/source/blender/imbuf/intern/dds/PixelFormat.h
index a9a41b71326..c483c525570 100644
--- a/source/blender/imbuf/intern/dds/PixelFormat.h
+++ b/source/blender/imbuf/intern/dds/PixelFormat.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/PixelFormat.h
+ * \ingroup imbdds
+ */
+
+
/*
* This file is based on a similar file from the NVIDIA texture tools
* (http://nvidia-texture-tools.googlecode.com/)
diff --git a/source/blender/imbuf/intern/dds/Stream.cpp b/source/blender/imbuf/intern/dds/Stream.cpp
index b9cb10d9acc..88c5277e097 100644
--- a/source/blender/imbuf/intern/dds/Stream.cpp
+++ b/source/blender/imbuf/intern/dds/Stream.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/Stream.cpp
+ * \ingroup imbdds
+ */
+
+
#include <Stream.h>
#include <stdio.h> // printf
diff --git a/source/blender/imbuf/intern/dds/Stream.h b/source/blender/imbuf/intern/dds/Stream.h
index 991caea50da..acc2c8bb176 100644
--- a/source/blender/imbuf/intern/dds/Stream.h
+++ b/source/blender/imbuf/intern/dds/Stream.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/Stream.h
+ * \ingroup imbdds
+ */
+
+
/* simple memory stream functions with buffer overflow check */
#ifndef _STREAM_H
diff --git a/source/blender/imbuf/intern/dds/dds_api.cpp b/source/blender/imbuf/intern/dds/dds_api.cpp
index 16832ef9a47..a7b2934cafa 100644
--- a/source/blender/imbuf/intern/dds/dds_api.cpp
+++ b/source/blender/imbuf/intern/dds/dds_api.cpp
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/dds_api.cpp
+ * \ingroup imbdds
+ */
+
+
#include <stddef.h>
#include <dds_api.h>
#include <Stream.h>
diff --git a/source/blender/imbuf/intern/dds/dds_api.h b/source/blender/imbuf/intern/dds/dds_api.h
index d3f2048d5eb..cfc6910e71d 100644
--- a/source/blender/imbuf/intern/dds/dds_api.h
+++ b/source/blender/imbuf/intern/dds/dds_api.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/dds/dds_api.h
+ * \ingroup imbdds
+ */
+
+
#ifndef _DDS_API_H
#define _DDS_API_H
diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c
index 3a89251a2fc..6b35d7df397 100644
--- a/source/blender/imbuf/intern/divers.c
+++ b/source/blender/imbuf/intern/divers.c
@@ -29,6 +29,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/divers.c
+ * \ingroup imbuf
+ */
+
+
#include "BLI_blenlib.h"
#include "BLI_rand.h"
#include "BLI_math.h"
@@ -47,7 +52,7 @@ void IMB_de_interlace(struct ImBuf *ibuf)
{
struct ImBuf * tbuf1, * tbuf2;
- if (ibuf == 0) return;
+ if (ibuf == NULL) return;
if (ibuf->flags & IB_fields) return;
ibuf->flags |= IB_fields;
@@ -74,7 +79,7 @@ void IMB_interlace(struct ImBuf *ibuf)
{
struct ImBuf * tbuf1, * tbuf2;
- if (ibuf == 0) return;
+ if (ibuf == NULL) return;
ibuf->flags &= ~IB_fields;
ibuf->y *= 2;
@@ -104,7 +109,7 @@ void IMB_rect_from_float(struct ImBuf *ibuf)
/* quick method to convert floatbuf to byte */
float *tof = (float *)ibuf->rect_float;
// int do_dither = ibuf->dither != 0.f;
- float dither= ibuf->dither / 255.0;
+ float dither= ibuf->dither / 255.0f;
float srgb[4];
int i, channels= ibuf->channels;
short profile= ibuf->profile;
@@ -136,7 +141,7 @@ void IMB_rect_from_float(struct ImBuf *ibuf)
else if (channels == 4) {
if (dither != 0.f) {
for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof+=4) {
- const float d = (BLI_frand()-0.5)*dither;
+ const float d = (BLI_frand()-0.5f)*dither;
srgb[0]= d + linearrgb_to_srgb(tof[0]);
srgb[1]= d + linearrgb_to_srgb(tof[1]);
@@ -165,7 +170,7 @@ void IMB_rect_from_float(struct ImBuf *ibuf)
else {
if (dither != 0.f) {
for (i = ibuf->x * ibuf->y; i > 0; i--, to+=4, tof+=4) {
- const float d = (BLI_frand()-0.5)*dither;
+ const float d = (BLI_frand()-0.5f)*dither;
float col[4];
col[0]= d + tof[0];
diff --git a/source/blender/imbuf/intern/filetype.c b/source/blender/imbuf/intern/filetype.c
index 4e96fd94555..c5121189952 100644
--- a/source/blender/imbuf/intern/filetype.c
+++ b/source/blender/imbuf/intern/filetype.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/filetype.c
+ * \ingroup imbuf
+ */
+
+
#include <stddef.h>
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -85,7 +90,7 @@ ImFileType IMB_FILE_TYPES[]= {
#ifdef WITH_QUICKTIME
{quicktime_init, quicktime_exit, imb_is_a_quicktime, imb_ftype_quicktime, imb_quicktime_decode, NULL, NULL, 0, QUICKTIME},
#endif
- {NULL, NULL, NULL, NULL, NULL, NULL, 0}};
+ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0}};
void imb_filetypes_init(void)
{
diff --git a/source/blender/imbuf/intern/filter.c b/source/blender/imbuf/intern/filter.c
index 52ec4825d2b..2821ba2a361 100644
--- a/source/blender/imbuf/intern/filter.c
+++ b/source/blender/imbuf/intern/filter.c
@@ -29,6 +29,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/filter.c
+ * \ingroup imbuf
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
diff --git a/source/blender/imbuf/intern/imageprocess.c b/source/blender/imbuf/intern/imageprocess.c
index 0bc311744a1..fa5e951067d 100644
--- a/source/blender/imbuf/intern/imageprocess.c
+++ b/source/blender/imbuf/intern/imageprocess.c
@@ -30,6 +30,11 @@
* function remained. It should probably move to imbuf/intern/util.c,
* but we'll keep it here for the time being. (nzc)*/
+/** \file blender/imbuf/intern/imageprocess.c
+ * \ingroup imbuf
+ */
+
+
/* imageprocess.c MIXED MODEL
*
* april 95
@@ -269,8 +274,8 @@ void bilinear_interpolation_color(struct ImBuf *in, unsigned char *outI, float *
if (x2>in->x-1 || y2>in->y-1) row4= empty;
else row4= (float *)in->rect_float + in->x * y2 * 4 + 4*x2;
- a= u-floor(u);
- b= v-floor(v);
+ a= u-floorf(u);
+ b= v-floorf(v);
a_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b);
outF[0]= ma_mb*row1[0] + a_mb*row3[0] + ma_b*row2[0]+ a_b*row4[0];
@@ -292,8 +297,8 @@ void bilinear_interpolation_color(struct ImBuf *in, unsigned char *outI, float *
if (x2>in->x-1 || y2>in->y-1) row4I= emptyI;
else row4I= (unsigned char *)in->rect + in->x * y2 * 4 + 4*x2;
- a= u-floor(u);
- b= v-floor(v);
+ a= u-floorf(u);
+ b= v-floorf(v);
a_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b);
/* need to add 0.5 to avoid rounding down (causes darken with the smear brush)
@@ -343,8 +348,8 @@ void bilinear_interpolation_color_wrap(struct ImBuf *in, unsigned char *outI, fl
row3= (float *)in->rect_float + in->x * y1 * 4 + 4*x2;
row4= (float *)in->rect_float + in->x * y2 * 4 + 4*x2;
- a= u-floor(u);
- b= v-floor(v);
+ a= u-floorf(u);
+ b= v-floorf(v);
a_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b);
outF[0]= ma_mb*row1[0] + a_mb*row3[0] + ma_b*row2[0]+ a_b*row4[0];
@@ -359,8 +364,8 @@ void bilinear_interpolation_color_wrap(struct ImBuf *in, unsigned char *outI, fl
row3I= (unsigned char *)in->rect + in->x * y1 * 4 + 4*x2;
row4I= (unsigned char *)in->rect + in->x * y2 * 4 + 4*x2;
- a= u-floor(u);
- b= v-floor(v);
+ a= u-floorf(u);
+ b= v-floorf(v);
a_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b);
/* need to add 0.5 to avoid rounding down (causes darken with the smear brush)
diff --git a/source/blender/imbuf/intern/imbuf.h b/source/blender/imbuf/intern/imbuf.h
index 885bca29ac2..cd7d385ed92 100644
--- a/source/blender/imbuf/intern/imbuf.h
+++ b/source/blender/imbuf/intern/imbuf.h
@@ -31,6 +31,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/imbuf.h
+ * \ingroup imbuf
+ */
+
+
#ifndef IMBUF_H
#define IMBUF_H
diff --git a/source/blender/imbuf/intern/iris.c b/source/blender/imbuf/intern/iris.c
index f29f68bdcb4..adbf3659d3a 100644
--- a/source/blender/imbuf/intern/iris.c
+++ b/source/blender/imbuf/intern/iris.c
@@ -29,6 +29,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/iris.c
+ * \ingroup imbuf
+ */
+
+
#include <string.h>
#include "BLI_blenlib.h"
@@ -216,7 +221,7 @@ static void test_endian_zbuf(struct ImBuf *ibuf)
int *zval;
if( BIG_LONG(1) == 1 ) return;
- if(ibuf->zbuf==0) return;
+ if(ibuf->zbuf == NULL) return;
len= ibuf->x*ibuf->y;
zval= ibuf->zbuf;
@@ -271,14 +276,14 @@ struct ImBuf *imb_loadiris(unsigned char *mem, size_t size, int flags)
readheader(inf, &image);
if(image.imagic != IMAGIC) {
fprintf(stderr,"longimagedata: bad magic number in image file\n");
- return(0);
+ return(NULL);
}
rle = ISRLE(image.type);
bpp = BPP(image.type);
if(bpp != 1 && bpp != 2) {
fprintf(stderr,"longimagedata: image must have 1 or 2 byte per pix chan\n");
- return(0);
+ return(NULL);
}
xsize = image.xsize;
@@ -821,7 +826,7 @@ int imb_saveiris(struct ImBuf * ibuf, const char *name, int flags)
int ret;
zsize = (ibuf->depth + 7) >> 3;
- if (flags & IB_zbuf && ibuf->zbuf != 0) zsize = 8;
+ if (flags & IB_zbuf && ibuf->zbuf != NULL) zsize = 8;
IMB_convert_rgba_to_abgr(ibuf);
test_endian_zbuf(ibuf);
diff --git a/source/blender/imbuf/intern/jp2.c b/source/blender/imbuf/intern/jp2.c
index 72b317c36da..a4eae492a58 100644
--- a/source/blender/imbuf/intern/jp2.c
+++ b/source/blender/imbuf/intern/jp2.c
@@ -21,6 +21,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/jp2.c
+ * \ingroup imbuf
+ */
+
+
#ifdef WITH_OPENJPEG
#include "MEM_guardedalloc.h"
diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c
index d23223e4c11..32dae3c982e 100644
--- a/source/blender/imbuf/intern/jpeg.c
+++ b/source/blender/imbuf/intern/jpeg.c
@@ -29,6 +29,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/jpeg.c
+ * \ingroup imbuf
+ */
+
+
/* This little block needed for linking to Blender... */
#include <stdio.h>
@@ -158,8 +163,11 @@ static void skip_input_data(j_decompress_ptr cinfo, long num_bytes)
my_src_ptr src = (my_src_ptr) cinfo->src;
if(num_bytes > 0) {
- src->pub.next_input_byte = src->pub.next_input_byte + num_bytes;
- src->pub.bytes_in_buffer = src->pub.bytes_in_buffer - num_bytes;
+ // prevent skipping over file end
+ size_t skip_size = (size_t)num_bytes <= src->pub.bytes_in_buffer ? num_bytes : src->pub.bytes_in_buffer;
+
+ src->pub.next_input_byte = src->pub.next_input_byte + skip_size;
+ src->pub.bytes_in_buffer = src->pub.bytes_in_buffer - skip_size;
}
}
@@ -217,17 +225,19 @@ static void memory_source(j_decompress_ptr cinfo, unsigned char *buffer, size_t
*/
#define MAKE_BYTE_AVAIL(cinfo,action) \
if (bytes_in_buffer == 0) { \
- if (! (*datasrc->fill_input_buffer) (cinfo)) \
- { action; } \
- INPUT_RELOAD(cinfo); \
- } \
- bytes_in_buffer--
+ if (! (*datasrc->fill_input_buffer) (cinfo)) \
+ { action; } \
+ INPUT_RELOAD(cinfo); \
+ }
+
+
/* Read a byte into variable V.
* If must suspend, take the specified action (typically "return FALSE").
*/
#define INPUT_BYTE(cinfo,V,action) \
MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
+ bytes_in_buffer--; \
V = GETJOCTET(*next_input_byte++); )
/* As above, but read two bytes interpreted as an unsigned 16-bit integer.
@@ -235,8 +245,10 @@ static void memory_source(j_decompress_ptr cinfo, unsigned char *buffer, size_t
*/
#define INPUT_2BYTES(cinfo,V,action) \
MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
+ bytes_in_buffer--; \
V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \
MAKE_BYTE_AVAIL(cinfo,action); \
+ bytes_in_buffer--; \
V += GETJOCTET(*next_input_byte++); )
@@ -247,7 +259,8 @@ handle_app1 (j_decompress_ptr cinfo)
char neogeo[128];
INPUT_VARS(cinfo);
-
+
+ length = 0;
INPUT_2BYTES(cinfo, length, return FALSE);
length -= 2;
@@ -266,10 +279,10 @@ handle_app1 (j_decompress_ptr cinfo)
static ImBuf * ibJpegImageFromCinfo(struct jpeg_decompress_struct * cinfo, int flags)
{
JSAMPARRAY row_pointer;
- JSAMPLE * buffer = 0;
+ JSAMPLE * buffer = NULL;
int row_stride;
int x, y, depth, r, g, b, k;
- struct ImBuf * ibuf = 0;
+ struct ImBuf * ibuf = NULL;
uchar * rect;
jpeg_saved_marker_ptr marker;
char *str, *key, *value;
@@ -465,7 +478,7 @@ ImBuf * imb_load_jpeg (unsigned char * buffer, size_t size, int flags)
static void write_jpeg(struct jpeg_compress_struct * cinfo, struct ImBuf * ibuf)
{
- JSAMPLE * buffer = 0;
+ JSAMPLE * buffer = NULL;
JSAMPROW row_pointer[1];
uchar * rect;
int x, y;
diff --git a/source/blender/imbuf/intern/md5.c b/source/blender/imbuf/intern/md5.c
index 19a5f25e7a4..18148143eb9 100644
--- a/source/blender/imbuf/intern/md5.c
+++ b/source/blender/imbuf/intern/md5.c
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/md5.c
+ * \ingroup imbuf
+ */
/* md5.c - Functions to compute MD5 message digest of files or memory blocks
according to the definition of MD5 in RFC 1321 from April 1992.
Copyright (C) 1995 Software Foundation, Inc.
diff --git a/source/blender/imbuf/intern/md5.h b/source/blender/imbuf/intern/md5.h
index 1299eacffbf..5fc1f80216f 100644
--- a/source/blender/imbuf/intern/md5.h
+++ b/source/blender/imbuf/intern/md5.h
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/md5.h
+ * \ingroup imbuf
+ */
/* md5.h - Declaration of functions and data types used for MD5 sum
computing library functions.
Copyright (C) 1995 Free Software Foundation, Inc.
diff --git a/source/blender/imbuf/intern/metadata.c b/source/blender/imbuf/intern/metadata.c
index 67daaf36aad..9faab6eec48 100644
--- a/source/blender/imbuf/intern/metadata.c
+++ b/source/blender/imbuf/intern/metadata.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/metadata.c
+ * \ingroup imbuf
+ */
+
+
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/imbuf/intern/module.c b/source/blender/imbuf/intern/module.c
index f291c0de776..f732500b82e 100644
--- a/source/blender/imbuf/intern/module.c
+++ b/source/blender/imbuf/intern/module.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/module.c
+ * \ingroup imbuf
+ */
+
+
#include <stddef.h>
#include "IMB_imbuf.h"
#include "IMB_filetype.h"
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index fe18984e528..9fd6cd1c3fa 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -1,3 +1,6 @@
+/** \file blender/imbuf/intern/openexr/openexr_api.cpp
+ * \ingroup openexr
+ */
/*
*
* ***** BEGIN GPLLICENSE BLOCK *****
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.h b/source/blender/imbuf/intern/openexr/openexr_api.h
index cd9f370f295..55aea13950e 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.h
+++ b/source/blender/imbuf/intern/openexr/openexr_api.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/openexr/openexr_api.h
+ * \ingroup openexr
+ */
+
+
#ifndef _OPENEXR_API_H
#define _OPENEXR_API_H
diff --git a/source/blender/imbuf/intern/openexr/openexr_multi.h b/source/blender/imbuf/intern/openexr/openexr_multi.h
index 490c7050661..3d95bb7c306 100644
--- a/source/blender/imbuf/intern/openexr/openexr_multi.h
+++ b/source/blender/imbuf/intern/openexr/openexr_multi.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/openexr/openexr_multi.h
+ * \ingroup openexr
+ */
+
+
#ifndef _OPENEXR_MULTI_H
#define _OPENEXR_MULTI_H
diff --git a/source/blender/imbuf/intern/png.c b/source/blender/imbuf/intern/png.c
index 23a18df6197..200ff0af9af 100644
--- a/source/blender/imbuf/intern/png.c
+++ b/source/blender/imbuf/intern/png.c
@@ -27,6 +27,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/png.c
+ * \ingroup imbuf
+ */
+
+
#include "png.h"
@@ -99,11 +104,11 @@ int imb_savepng(struct ImBuf *ibuf, const char *name, int flags)
png_structp png_ptr;
png_infop info_ptr;
- unsigned char *pixels = 0;
+ unsigned char *pixels = NULL;
unsigned char *from, *to;
- png_bytepp row_pointers = 0;
+ png_bytepp row_pointers = NULL;
int i, bytesperpixel, color_type = PNG_COLOR_TYPE_GRAY;
- FILE *fp = 0;
+ FILE *fp = NULL;
/* use the jpeg quality setting for compression */
int compression;
@@ -294,11 +299,11 @@ int imb_savepng(struct ImBuf *ibuf, const char *name, int flags)
struct ImBuf *imb_loadpng(unsigned char *mem, size_t size, int flags)
{
- struct ImBuf *ibuf = 0;
+ struct ImBuf *ibuf = NULL;
png_structp png_ptr;
png_infop info_ptr;
- unsigned char *pixels = 0;
- png_bytepp row_pointers = 0;
+ unsigned char *pixels = NULL;
+ png_bytepp row_pointers = NULL;
png_uint_32 width, height;
int bit_depth, color_type;
PNGReadStruct ps;
@@ -306,13 +311,13 @@ struct ImBuf *imb_loadpng(unsigned char *mem, size_t size, int flags)
unsigned char *from, *to;
int i, bytesperpixel;
- if (imb_is_a_png(mem) == 0) return(0);
+ if (imb_is_a_png(mem) == 0) return(NULL);
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
NULL, NULL, NULL);
if (png_ptr == NULL) {
printf("Cannot png_create_read_struct\n");
- return 0;
+ return NULL;
}
info_ptr = png_create_info_struct(png_ptr);
@@ -320,7 +325,7 @@ struct ImBuf *imb_loadpng(unsigned char *mem, size_t size, int flags)
png_destroy_read_struct(&png_ptr, (png_infopp)NULL,
(png_infopp)NULL);
printf("Cannot png_create_info_struct\n");
- return 0;
+ return NULL;
}
ps.size = size; /* XXX, 4gig limit! */
@@ -334,7 +339,7 @@ struct ImBuf *imb_loadpng(unsigned char *mem, size_t size, int flags)
if (pixels) MEM_freeN(pixels);
if (row_pointers) MEM_freeN(row_pointers);
if (ibuf) IMB_freeImBuf(ibuf);
- return 0;
+ return NULL;
}
// png_set_sig_bytes(png_ptr, 8);
diff --git a/source/blender/imbuf/intern/radiance_hdr.c b/source/blender/imbuf/intern/radiance_hdr.c
index 9dbb4512e1f..ddddec1c09f 100644
--- a/source/blender/imbuf/intern/radiance_hdr.c
+++ b/source/blender/imbuf/intern/radiance_hdr.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/radiance_hdr.c
+ * \ingroup imbuf
+ */
+
+
#ifdef WITH_HDR
/* ----------------------------------------------------------------------
diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c
index d4bd0ea59d0..849b3ff0ce2 100644
--- a/source/blender/imbuf/intern/readimage.c
+++ b/source/blender/imbuf/intern/readimage.c
@@ -29,6 +29,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/readimage.c
+ * \ingroup imbuf
+ */
+
+
#ifdef _WIN32
#include <io.h>
#include <stddef.h>
@@ -81,14 +86,14 @@ ImBuf *IMB_loadifffile(int file, int flags)
unsigned char *mem;
size_t size;
- if(file == -1) return 0;
+ if(file == -1) return NULL;
size= BLI_filesize(file);
- mem= mmap(0, size, PROT_READ, MAP_SHARED, file, 0);
+ mem= mmap(NULL, size, PROT_READ, MAP_SHARED, file, 0);
if(mem==(unsigned char*)-1) {
fprintf(stderr, "Couldn't get mapping\n");
- return 0;
+ return NULL;
}
ibuf= IMB_ibImageFromMemory(mem, size, flags);
@@ -123,7 +128,7 @@ ImBuf *IMB_loadiffname(const char *name, int flags)
imb_cache_filename(filename, name, flags);
file = open(filename, O_BINARY|O_RDONLY);
- if(file < 0) return 0;
+ if(file < 0) return NULL;
ibuf= IMB_loadifffile(file, flags);
@@ -149,7 +154,7 @@ ImBuf *IMB_testiffname(char *name, int flags)
imb_cache_filename(filename, name, flags);
file = open(filename,O_BINARY|O_RDONLY);
- if(file < 0) return 0;
+ if(file < 0) return NULL;
ibuf=IMB_loadifffile(file, flags|IB_test|IB_multilayer);
if(ibuf) {
@@ -172,7 +177,7 @@ static void imb_loadtilefile(ImBuf *ibuf, int file, int tx, int ty, unsigned int
size= BLI_filesize(file);
- mem= mmap(0, size, PROT_READ, MAP_SHARED, file, 0);
+ mem= mmap(NULL, size, PROT_READ, MAP_SHARED, file, 0);
if(mem==(unsigned char*)-1) {
fprintf(stderr, "Couldn't get memory mapping for %s\n", ibuf->cachename);
return;
diff --git a/source/blender/imbuf/intern/rectop.c b/source/blender/imbuf/intern/rectop.c
index 322e887ba8e..44af7ffdb3f 100644
--- a/source/blender/imbuf/intern/rectop.c
+++ b/source/blender/imbuf/intern/rectop.c
@@ -29,6 +29,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/rectop.c
+ * \ingroup imbuf
+ */
+
+
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
@@ -159,7 +164,7 @@ unsigned int IMB_blend_color(unsigned int src1, unsigned int src2, int fac, IMB_
static void blend_color_mix_float(float *cp, float *cp1, float *cp2, float fac)
{
- float mfac= 1.0-fac;
+ float mfac= 1.0f-fac;
cp[0]= mfac*cp1[0] + fac*cp2[0];
cp[1]= mfac*cp1[1] + fac*cp2[1];
cp[2]= mfac*cp1[2] + fac*cp2[2];
@@ -189,7 +194,7 @@ static void blend_color_sub_float(float *cp, float *cp1, float *cp2, float fac)
static void blend_color_mul_float(float *cp, float *cp1, float *cp2, float fac)
{
- float mfac= 1.0-fac;
+ float mfac= 1.0f-fac;
cp[0]= mfac*cp1[0] + fac*(cp1[0]*cp2[0]);
cp[1]= mfac*cp1[1] + fac*(cp1[1]*cp2[1]);
@@ -483,7 +488,7 @@ void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height,
float a; /* alpha */
float ai; /* alpha inverted */
float aich; /* alpha, inverted, ai/255.0 - Convert char to float at the same time */
- if ((!rect && !rectf) || (!col) || col[3]==0.0)
+ if ((!rect && !rectf) || (!col) || col[3]==0.0f)
return;
/* sanity checks for coords */
@@ -505,7 +510,7 @@ void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height,
unsigned char chr=0, chg=0, chb=0;
float fr=0, fg=0, fb=0;
- if (a == 1.0) {
+ if (a == 1.0f) {
chr = FTOCHAR(col[0]);
chg = FTOCHAR(col[1]);
chb = FTOCHAR(col[2]);
@@ -518,7 +523,7 @@ void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height,
for (i = 0; i < x2-x1; i++) {
pixel = rect + 4 * (((y1 + j) * width) + (x1 + i));
if (pixel >= rect && pixel < rect+ (4 * (width * height))) {
- if (a == 1.0) {
+ if (a == 1.0f) {
pixel[0] = chr;
pixel[1] = chg;
pixel[2] = chb;
@@ -537,7 +542,7 @@ void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height,
for (j = 0; j < y2-y1; j++) {
for (i = 0; i < x2-x1; i++) {
pixel = rectf + 4 * (((y1 + j) * width) + (x1 + i));
- if (a == 1.0) {
+ if (a == 1.0f) {
pixel[0] = col[0];
pixel[1] = col[1];
pixel[2] = col[2];
diff --git a/source/blender/imbuf/intern/rotate.c b/source/blender/imbuf/intern/rotate.c
index ba4e3664c89..2f9d5d60baa 100644
--- a/source/blender/imbuf/intern/rotate.c
+++ b/source/blender/imbuf/intern/rotate.c
@@ -29,6 +29,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/rotate.c
+ * \ingroup imbuf
+ */
+
+
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
@@ -96,7 +101,7 @@ void IMB_flipy(struct ImBuf * ibuf)
void IMB_flipx(struct ImBuf * ibuf)
{
- short x, y, xr, xl, yi;
+ int x, y, xr, xl, yi;
float px_f[4];
if (ibuf == NULL) return;
diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c
index ea6cd0ffd78..6ebb86f646d 100644
--- a/source/blender/imbuf/intern/scaling.c
+++ b/source/blender/imbuf/intern/scaling.c
@@ -29,7 +29,13 @@
* $Id$
*/
+/** \file blender/imbuf/intern/scaling.c
+ * \ingroup imbuf
+ */
+
+
#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
#include "MEM_guardedalloc.h"
#include "imbuf.h"
@@ -50,12 +56,13 @@ struct ImBuf *IMB_half_x(struct ImBuf *ibuf1)
{
struct ImBuf *ibuf2;
uchar *p1,*_p1,*dest;
- short a,r,g,b,x,y;
+ short a,r,g,b;
+ int x,y;
float af,rf,gf,bf, *p1f, *_p1f, *destf;
int do_rect, do_float;
- if (ibuf1==NULL) return (0);
- if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
+ if (ibuf1==NULL) return (NULL);
+ if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (NULL);
do_rect= (ibuf1->rect != NULL);
do_float= (ibuf1->rect_float != NULL);
@@ -63,7 +70,7 @@ struct ImBuf *IMB_half_x(struct ImBuf *ibuf1)
if (ibuf1->x <= 1) return(IMB_dupImBuf(ibuf1));
ibuf2 = IMB_allocImBuf((ibuf1->x)/2, ibuf1->y, ibuf1->depth, ibuf1->flags);
- if (ibuf2==NULL) return (0);
+ if (ibuf2==NULL) return (NULL);
_p1 = (uchar *) ibuf1->rect;
dest=(uchar *) ibuf2->rect;
@@ -117,14 +124,14 @@ struct ImBuf *IMB_double_fast_x(struct ImBuf *ibuf1)
int *p1,*dest, i, col, do_rect, do_float;
float *p1f, *destf;
- if (ibuf1==NULL) return (0);
- if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
+ if (ibuf1==NULL) return (NULL);
+ if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (NULL);
do_rect= (ibuf1->rect != NULL);
do_float= (ibuf1->rect_float != NULL);
ibuf2 = IMB_allocImBuf(2 * ibuf1->x , ibuf1->y , ibuf1->depth, ibuf1->flags);
- if (ibuf2==NULL) return (0);
+ if (ibuf2==NULL) return (NULL);
p1 = (int *) ibuf1->rect;
dest=(int *) ibuf2->rect;
@@ -154,8 +161,8 @@ struct ImBuf *IMB_double_x(struct ImBuf *ibuf1)
{
struct ImBuf *ibuf2;
- if (ibuf1==NULL) return (0);
- if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
+ if (ibuf1==NULL) return (NULL);
+ if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (NULL);
ibuf2 = IMB_double_fast_x(ibuf1);
@@ -168,21 +175,22 @@ struct ImBuf *IMB_half_y(struct ImBuf *ibuf1)
{
struct ImBuf *ibuf2;
uchar *p1,*p2,*_p1,*dest;
- short a,r,g,b,x,y;
+ short a,r,g,b;
+ int x,y;
int do_rect, do_float;
float af,rf,gf,bf,*p1f,*p2f,*_p1f,*destf;
p1= p2= NULL;
p1f= p2f= NULL;
- if (ibuf1==NULL) return (0);
- if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
+ if (ibuf1==NULL) return (NULL);
+ if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (NULL);
if (ibuf1->y <= 1) return(IMB_dupImBuf(ibuf1));
do_rect= (ibuf1->rect != NULL);
do_float= (ibuf1->rect_float != NULL);
ibuf2 = IMB_allocImBuf(ibuf1->x , (ibuf1->y) / 2 , ibuf1->depth, ibuf1->flags);
- if (ibuf2==NULL) return (0);
+ if (ibuf2==NULL) return (NULL);
_p1 = (uchar *) ibuf1->rect;
dest=(uchar *) ibuf2->rect;
@@ -240,17 +248,17 @@ struct ImBuf *IMB_double_fast_y(struct ImBuf *ibuf1)
struct ImBuf *ibuf2;
int *p1, *dest1, *dest2;
float *p1f, *dest1f, *dest2f;
- short x,y;
+ int x,y;
int do_rect, do_float;
- if (ibuf1==NULL) return (0);
- if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
+ if (ibuf1==NULL) return (NULL);
+ if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (NULL);
do_rect= (ibuf1->rect != NULL);
do_float= (ibuf1->rect_float != NULL);
ibuf2 = IMB_allocImBuf(ibuf1->x , 2 * ibuf1->y , ibuf1->depth, ibuf1->flags);
- if (ibuf2==NULL) return (0);
+ if (ibuf2==NULL) return (NULL);
p1 = (int *) ibuf1->rect;
dest1= (int *) ibuf2->rect;
@@ -277,8 +285,8 @@ struct ImBuf *IMB_double_y(struct ImBuf *ibuf1)
{
struct ImBuf *ibuf2;
- if (ibuf1==NULL) return (0);
- if (ibuf1->rect==NULL) return (0);
+ if (ibuf1==NULL) return (NULL);
+ if (ibuf1->rect==NULL) return (NULL);
ibuf2 = IMB_double_fast_y(ibuf1);
@@ -340,14 +348,14 @@ struct ImBuf *IMB_onehalf(struct ImBuf *ibuf1)
{
struct ImBuf *ibuf2;
- if (ibuf1==NULL) return (0);
- if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (0);
+ if (ibuf1==NULL) return (NULL);
+ if (ibuf1->rect==NULL && ibuf1->rect_float==NULL) return (NULL);
if (ibuf1->x <= 1) return(IMB_half_y(ibuf1));
if (ibuf1->y <= 1) return(IMB_half_x(ibuf1));
ibuf2=IMB_allocImBuf((ibuf1->x)/2, (ibuf1->y)/2, ibuf1->depth, ibuf1->flags);
- if (ibuf2==NULL) return (0);
+ if (ibuf2==NULL) return (NULL);
imb_onehalf_no_alloc(ibuf2, ibuf1);
@@ -586,8 +594,8 @@ static void enlarge_picture_float(
for (y_dst = 0; y_dst < dst_height; y_dst++) {
float* line1 = src + ((int) y_src) * 4 * src_width;
float* line2 = line1 + 4 * src_width;
- float weight1y = 1.0 - (y_src - (int) y_src);
- float weight2y = 1.0 - weight1y;
+ const float weight1y = (float)(1.0 - (y_src - (int) y_src));
+ const float weight2y = 1.0f - weight1y;
if ((int) y_src == src_height - 1) {
line2 = line1;
@@ -595,13 +603,13 @@ static void enlarge_picture_float(
x_src = 0;
for (x_dst = 0; x_dst < dst_width; x_dst++) {
- float weight1x = 1.0 - (x_src - (int) x_src);
- float weight2x = 1.0 - weight1x;
+ const float weight1x = (float)(1.0 - (x_src - (int) x_src));
+ const float weight2x = (float)(1.0f - weight1x);
- float w11 = weight1y * weight1x;
- float w21 = weight2y * weight1x;
- float w12 = weight1y * weight2x;
- float w22 = weight2y * weight2x;
+ const float w11 = weight1y * weight1x;
+ const float w21 = weight2y * weight1x;
+ const float w12 = weight1y * weight2x;
+ const float w22 = weight2y * weight2x;
uintptr_t x = ((int) x_src) * 4;
@@ -670,12 +678,12 @@ static void shrink_picture_float(
y_counter = 1.0;
for (y_src = 0; y_src < src_height; y_src++) {
float* line = src + y_src * 4 * src_width;
- uintptr_t weight1y = 1.0 - (y_dst - (int) y_dst);
- uintptr_t weight2y = 1.0 - weight1y;
+ uintptr_t weight1y = 1.0f - (y_dst - (int) y_dst);
+ uintptr_t weight2y = 1.0f - weight1y;
x_dst = 0;
for (x_src = 0; x_src < src_width; x_src++) {
- uintptr_t weight1x = 1.0 - (x_dst - (int) x_dst);
- uintptr_t weight2x = 1.0 - weight1x;
+ uintptr_t weight1x = 1.0f - (x_dst - (int) x_dst);
+ uintptr_t weight2x = 1.0f - weight1x;
uintptr_t x = (int) x_dst;
@@ -723,10 +731,10 @@ static void shrink_picture_float(
uintptr_t x;
struct scale_outpix_float * temp;
- y_counter += 1.0;
+ y_counter += 1.0f;
for (x=0; x < dst_width; x++) {
- float f = 1.0 / dst_line1[x].weight;
+ float f = 1.0f / dst_line1[x].weight;
*dst++ = dst_line1[x].r * f;
*dst++ = dst_line1[x].g * f;
*dst++ = dst_line1[x].b * f;
@@ -742,7 +750,7 @@ static void shrink_picture_float(
if (dst - dst_begin < dst_width * dst_height * 4) {
uintptr_t x;
for (x = 0; x < dst_width; x++) {
- float f = 1.0 / dst_line1[x].weight;
+ float f = 1.0f / dst_line1[x].weight;
*dst++ = dst_line1[x].r * f;
*dst++ = dst_line1[x].g * f;
*dst++ = dst_line1[x].b * f;
@@ -823,26 +831,27 @@ static int q_scale_linear_interpolation(
static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx)
{
+ const int do_rect= (ibuf->rect != NULL);
+ const int do_float= (ibuf->rect_float != NULL);
+ const size_t rect_size= ibuf->x * ibuf->y * 4;
+
uchar *rect, *_newrect, *newrect;
float *rectf, *_newrectf, *newrectf;
float sample, add, val[4], nval[4], valf[4], nvalf[4];
- int x, y, do_rect = 0, do_float = 0;
+ int x, y;
rectf= _newrectf= newrectf= NULL;
rect=_newrect= newrect= NULL;
nval[0]= nval[1]= nval[2]= nval[3]= 0.0f;
nvalf[0]=nvalf[1]=nvalf[2]=nvalf[3]= 0.0f;
-
- if (ibuf==NULL) return(0);
- if (ibuf->rect==NULL && ibuf->rect_float==NULL) return (ibuf);
- if (ibuf->rect) {
- do_rect = 1;
- _newrect = MEM_mallocN(newx * ibuf->y * sizeof(int), "scaledownx");
+ if (!do_rect && !do_float) return (ibuf);
+
+ if (do_rect) {
+ _newrect = MEM_mallocN(newx * ibuf->y * sizeof(uchar) * 4, "scaledownx");
if (_newrect==NULL) return(ibuf);
}
- if (ibuf->rect_float) {
- do_float = 1;
+ if (do_float) {
_newrectf = MEM_mallocN(newx * ibuf->y * sizeof(float) * 4, "scaledownxf");
if (_newrectf==NULL) {
if (_newrect) MEM_freeN(_newrect);
@@ -850,7 +859,7 @@ static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx)
}
}
- add = (ibuf->x - 0.001) / newx;
+ add = (ibuf->x - 0.01) / newx;
if (do_rect) {
rect = (uchar *) ibuf->rect;
@@ -930,11 +939,15 @@ static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx)
}
if (do_rect) {
+ // printf("%ld %ld\n", (uchar *)rect - ((uchar *)ibuf->rect), rect_size);
+ BLI_assert((uchar *)rect - ((uchar *)ibuf->rect) == rect_size); /* see bug [#26502] */
imb_freerectImBuf(ibuf);
ibuf->mall |= IB_rect;
ibuf->rect = (unsigned int *) _newrect;
}
if (do_float) {
+ // printf("%ld %ld\n", rectf - ibuf->rect_float, rect_size);
+ BLI_assert((rectf - ibuf->rect_float) == rect_size); /* see bug [#26502] */
imb_freerectfloatImBuf(ibuf);
ibuf->mall |= IB_rectfloat;
ibuf->rect_float = _newrectf;
@@ -947,26 +960,27 @@ static struct ImBuf *scaledownx(struct ImBuf *ibuf, int newx)
static struct ImBuf *scaledowny(struct ImBuf *ibuf, int newy)
{
+ const int do_rect= (ibuf->rect != NULL);
+ const int do_float= (ibuf->rect_float != NULL);
+ const size_t rect_size= ibuf->x * ibuf->y * 4;
+
uchar *rect, *_newrect, *newrect;
float *rectf, *_newrectf, *newrectf;
float sample, add, val[4], nval[4], valf[4], nvalf[4];
- int x, y, skipx, do_rect = 0, do_float = 0;
+ int x, y, skipx;
rectf= _newrectf= newrectf= NULL;
rect= _newrect= newrect= NULL;
nval[0]= nval[1]= nval[2]= nval[3]= 0.0f;
nvalf[0]=nvalf[1]=nvalf[2]=nvalf[3]= 0.0f;
- if (ibuf==NULL) return(0);
- if (ibuf->rect==NULL && ibuf->rect_float==NULL) return (ibuf);
+ if (!do_rect && !do_float) return (ibuf);
- if (ibuf->rect) {
- do_rect = 1;
- _newrect = MEM_mallocN(newy * ibuf->x * sizeof(int), "scaledowny");
+ if (do_rect) {
+ _newrect = MEM_mallocN(newy * ibuf->x * sizeof(uchar) * 4, "scaledowny");
if (_newrect==NULL) return(ibuf);
}
- if (ibuf->rect_float) {
- do_float = 1;
+ if (do_float) {
_newrectf = MEM_mallocN(newy * ibuf->x * sizeof(float) * 4, "scaledownyf");
if (_newrectf==NULL) {
if (_newrect) MEM_freeN(_newrect);
@@ -974,7 +988,7 @@ static struct ImBuf *scaledowny(struct ImBuf *ibuf, int newy)
}
}
- add = (ibuf->y - 0.001) / newy;
+ add = (ibuf->y - 0.01) / newy;
skipx = 4 * ibuf->x;
for (x = skipx - 4; x>=0 ; x-= 4) {
@@ -1007,8 +1021,8 @@ static struct ImBuf *scaledowny(struct ImBuf *ibuf, int newy)
sample += add;
- while (sample >= 1.0) {
- sample -= 1.0;
+ while (sample >= 1.0f) {
+ sample -= 1.0f;
if (do_rect) {
nval[0] += rect[0];
@@ -1050,16 +1064,20 @@ static struct ImBuf *scaledowny(struct ImBuf *ibuf, int newy)
newrectf += skipx;
}
- sample -= 1.0;
+ sample -= 1.0f;
}
}
if (do_rect) {
+ // printf("%ld %ld\n", (uchar *)rect - ((uchar *)ibuf->rect), rect_size);
+ BLI_assert((uchar *)rect - ((uchar *)ibuf->rect) == rect_size); /* see bug [#26502] */
imb_freerectImBuf(ibuf);
ibuf->mall |= IB_rect;
ibuf->rect = (unsigned int *) _newrect;
}
if (do_float) {
+ // printf("%ld %ld\n", rectf - ibuf->rect_float, rect_size);
+ BLI_assert((rectf - ibuf->rect_float) == rect_size); /* see bug [#26502] */
imb_freerectfloatImBuf(ibuf);
ibuf->mall |= IB_rectfloat;
ibuf->rect_float = (float *) _newrectf;
@@ -1089,7 +1107,7 @@ static struct ImBuf *scaleupx(struct ImBuf *ibuf, int newx)
val_g = nval_g = diff_g = val_r = nval_r = diff_r = 0;
val_af = nval_af = diff_af = val_bf = nval_bf = diff_bf = 0;
val_gf = nval_gf = diff_gf = val_rf = nval_rf = diff_rf = 0;
- if (ibuf==NULL) return(0);
+ if (ibuf==NULL) return(NULL);
if (ibuf->rect==NULL && ibuf->rect_float==NULL) return (ibuf);
if (ibuf->rect) {
@@ -1121,22 +1139,22 @@ static struct ImBuf *scaleupx(struct ImBuf *ibuf, int newx)
val_a = rect[0] ;
nval_a = rect[4];
diff_a = nval_a - val_a ;
- val_a += 0.5;
+ val_a += 0.5f;
val_b = rect[1] ;
nval_b = rect[5];
diff_b = nval_b - val_b ;
- val_b += 0.5;
+ val_b += 0.5f;
val_g = rect[2] ;
nval_g = rect[6];
diff_g = nval_g - val_g ;
- val_g += 0.5;
+ val_g += 0.5f;
val_r = rect[3] ;
nval_r = rect[7];
diff_r = nval_r - val_r ;
- val_r += 0.5;
+ val_r += 0.5f;
rect += 8;
}
@@ -1160,29 +1178,29 @@ static struct ImBuf *scaleupx(struct ImBuf *ibuf, int newx)
rectf += 8;
}
for (x = newx ; x>0 ; x--){
- if (sample >= 1.0){
- sample -= 1.0;
+ if (sample >= 1.0f){
+ sample -= 1.0f;
if (do_rect) {
val_a = nval_a ;
nval_a = rect[0] ;
diff_a = nval_a - val_a ;
- val_a += 0.5;
+ val_a += 0.5f;
val_b = nval_b ;
nval_b = rect[1] ;
diff_b = nval_b - val_b ;
- val_b += 0.5;
+ val_b += 0.5f;
val_g = nval_g ;
nval_g = rect[2] ;
diff_g = nval_g - val_g ;
- val_g += 0.5;
+ val_g += 0.5f;
val_r = nval_r ;
nval_r = rect[3] ;
diff_r = nval_r - val_r ;
- val_r += 0.5;
+ val_r += 0.5f;
rect += 4;
}
if (do_float) {
@@ -1256,7 +1274,7 @@ static struct ImBuf *scaleupy(struct ImBuf *ibuf, int newy)
val_g = nval_g = diff_g = val_r = nval_r = diff_r = 0;
val_af = nval_af = diff_af = val_bf = nval_bf = diff_bf = 0;
val_gf = nval_gf = diff_gf = val_rf = nval_rf = diff_rf = 0;
- if (ibuf==NULL) return(0);
+ if (ibuf==NULL) return(NULL);
if (ibuf->rect==NULL && ibuf->rect_float==NULL) return (ibuf);
if (ibuf->rect) {
@@ -1291,22 +1309,22 @@ static struct ImBuf *scaleupy(struct ImBuf *ibuf, int newy)
val_a = rect[0] ;
nval_a = rect[skipx];
diff_a = nval_a - val_a ;
- val_a += 0.5;
+ val_a += 0.5f;
val_b = rect[1] ;
nval_b = rect[skipx+1];
diff_b = nval_b - val_b ;
- val_b += 0.5;
+ val_b += 0.5f;
val_g = rect[2] ;
nval_g = rect[skipx+2];
diff_g = nval_g - val_g ;
- val_g += 0.5;
+ val_g += 0.5f;
val_r = rect[3] ;
nval_r = rect[skipx+4];
diff_r = nval_r - val_r ;
- val_r += 0.5;
+ val_r += 0.5f;
rect += 2*skipx;
}
@@ -1334,29 +1352,29 @@ static struct ImBuf *scaleupy(struct ImBuf *ibuf, int newy)
}
for (y = newy ; y>0 ; y--){
- if (sample >= 1.0){
- sample -= 1.0;
+ if (sample >= 1.0f){
+ sample -= 1.0f;
if (do_rect) {
val_a = nval_a ;
nval_a = rect[0] ;
diff_a = nval_a - val_a ;
- val_a += 0.5;
+ val_a += 0.5f;
val_b = nval_b ;
nval_b = rect[1] ;
diff_b = nval_b - val_b ;
- val_b += 0.5;
+ val_b += 0.5f;
val_g = nval_g ;
nval_g = rect[2] ;
diff_g = nval_g - val_g ;
- val_g += 0.5;
+ val_g += 0.5f;
val_r = nval_r ;
nval_r = rect[3] ;
diff_r = nval_r - val_r ;
- val_r += 0.5;
+ val_r += 0.5f;
rect += skipx;
}
if (do_float) {
@@ -1413,7 +1431,7 @@ static struct ImBuf *scaleupy(struct ImBuf *ibuf, int newy)
/* no float buf needed here! */
-static void scalefast_Z_ImBuf(ImBuf *ibuf, short newx, short newy)
+static void scalefast_Z_ImBuf(ImBuf *ibuf, int newx, int newy)
{
unsigned int *rect, *_newrect, *newrect;
int x, y;
@@ -1448,7 +1466,7 @@ static void scalefast_Z_ImBuf(ImBuf *ibuf, short newx, short newy)
struct ImBuf *IMB_scaleImBuf(struct ImBuf * ibuf, unsigned int newx, unsigned int newy)
{
- if (ibuf==NULL) return (0);
+ if (ibuf==NULL) return (NULL);
if (ibuf->rect==NULL && ibuf->rect_float==NULL) return (ibuf);
if (newx == ibuf->x && newy == ibuf->y) { return ibuf; }
@@ -1485,7 +1503,7 @@ struct ImBuf *IMB_scalefastImBuf(struct ImBuf *ibuf, unsigned int newx, unsigned
rect = NULL; _newrect = NULL; newrect = NULL;
rectf = NULL; _newrectf = NULL; newrectf = NULL;
- if (ibuf==NULL) return(0);
+ if (ibuf==NULL) return(NULL);
if (ibuf->rect) do_rect = 1;
if (ibuf->rect_float) do_float = 1;
if (do_rect==0 && do_float==0) return(ibuf);
diff --git a/source/blender/imbuf/intern/targa.c b/source/blender/imbuf/intern/targa.c
index fe1e00b4c2f..f334409133f 100644
--- a/source/blender/imbuf/intern/targa.c
+++ b/source/blender/imbuf/intern/targa.c
@@ -27,6 +27,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/targa.c
+ * \ingroup imbuf
+ */
+
+
#ifdef WIN32
#include <io.h>
#endif
@@ -191,8 +196,8 @@ static int dumptarga(struct ImBuf * ibuf, FILE * file)
int size;
uchar *rect;
- if (ibuf == 0) return (0);
- if (ibuf->rect == 0) return (0);
+ if (ibuf == NULL) return (0);
+ if (ibuf->rect == NULL) return (0);
size = ibuf->x * ibuf->y;
rect = (uchar *) ibuf->rect;
@@ -361,8 +366,8 @@ static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, size_t mem_size,
unsigned int *rect;
uchar * cp = (uchar *) &col;
- if (ibuf == 0) return;
- if (ibuf->rect == 0) return;
+ if (ibuf == NULL) return;
+ if (ibuf->rect == NULL) return;
size = ibuf->x * ibuf->y;
rect = ibuf->rect;
@@ -472,8 +477,8 @@ static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, size_t mem_size, in
unsigned int *rect;
uchar * cp = (uchar *) &col;
- if (ibuf == 0) return;
- if (ibuf->rect == 0) return;
+ if (ibuf == NULL) return;
+ if (ibuf->rect == NULL) return;
size = ibuf->x * ibuf->y;
rect = ibuf->rect;
@@ -530,12 +535,12 @@ struct ImBuf *imb_loadtarga(unsigned char *mem, size_t mem_size, int flags)
unsigned int *rect, *cmap= NULL, mincol= 0, maxcol= 0;
uchar * cp = (uchar *) &col;
- if (checktarga(&tga,mem) == 0) return(0);
+ if (checktarga(&tga,mem) == 0) return(NULL);
if (flags & IB_test) ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,tga.pixsize, 0);
else ibuf = IMB_allocImBuf(tga.xsize,tga.ysize,(tga.pixsize + 0x7) & ~0x7, IB_rect);
- if (ibuf == 0) return(0);
+ if (ibuf == NULL) return(NULL);
ibuf->ftype = TGA;
ibuf->profile = IB_PROFILE_SRGB;
mem = mem + 18 + tga.numid;
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
index 24c5a755aef..1f2eebbedc0 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/thumbs.c
+ * \ingroup imbuf
+ */
+
+
#include <stdio.h>
#include "BKE_utildefines.h"
@@ -69,7 +74,7 @@ static int get_thumb_dir( char* dir , ThumbSize size)
/* yes, applications shouldn't store data there, but so does GIMP :)*/
SHGetSpecialFolderPath(0, dir, CSIDL_PROFILE, 0);
#else
- char* home = getenv("HOME");
+ const char* home = getenv("HOME");
if (!home) return 0;
BLI_strncpy(dir, home, FILE_MAX);
#endif
@@ -267,7 +272,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
tsize = 1;
break;
default:
- return 0; /* unknown size */
+ return NULL; /* unknown size */
}
uri_from_filename(path, uri);
@@ -276,12 +281,12 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
BLI_snprintf(tpath, FILE_MAX, "%s%s", tdir, thumb);
thumb[8] = '\0'; /* shorten for tempname, not needed anymore */
BLI_snprintf(temp, FILE_MAX, "%sblender_%d_%s.png", tdir, abs(getpid()), thumb);
- if (strncmp(path, tdir, strlen(tdir)) == 0) {
+ if (BLI_path_ncmp(path, tdir, sizeof(tdir)) == 0) {
return NULL;
}
if (size == THB_FAIL) {
img = IMB_allocImBuf(1,1,32, IB_rect | IB_metadata);
- if (!img) return 0;
+ if (!img) return NULL;
} else {
if (THB_SOURCE_IMAGE == source || THB_SOURCE_BLEND == source) {
@@ -317,7 +322,7 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
stat(path, &info);
BLI_snprintf(mtime, sizeof(mtime), "%ld", info.st_mtime);
}
- if (!img) return 0;
+ if (!img) return NULL;
if (img->x > img->y) {
scaledx = (float)tsize;
@@ -330,6 +335,15 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
ex = (short)scaledx;
ey = (short)scaledy;
+ /* save some time by only scaling byte buf */
+ if(img->rect_float) {
+ if(img->rect == NULL) {
+ IMB_rect_from_float(img);
+ }
+
+ imb_freerectfloatImBuf(img);
+ }
+
IMB_scaleImBuf(img, ex, ey);
}
BLI_snprintf(desc, sizeof(desc), "Thumbnail for %s", uri);
@@ -360,7 +374,7 @@ ImBuf* IMB_thumb_read(const char* path, ThumbSize size)
{
char thumb[FILE_MAX];
char uri[FILE_MAX*3+8];
- ImBuf *img = 0;
+ ImBuf *img = NULL;
if (!uri_from_filename(path,uri)) {
return NULL;
@@ -382,7 +396,7 @@ void IMB_thumb_delete(const char* path, ThumbSize size)
return;
}
if (thumbpath_from_uri(uri, thumb, sizeof(thumb), size)) {
- if (strncmp(path, thumb, strlen(thumb)) == 0) {
+ if (BLI_path_ncmp(path, thumb, sizeof(thumb)) == 0) {
return;
}
if (BLI_exists(thumb)) {
@@ -414,7 +428,7 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source)
}
if (thumbpath_from_uri(uri, thumb, sizeof(thumb), size)) {
- if (strncmp(path, thumb, strlen(thumb)) == 0) {
+ if (BLI_path_ncmp(path, thumb, sizeof(thumb)) == 0) {
img = IMB_loadiffname(path, IB_rect);
} else {
img = IMB_loadiffname(thumb, IB_rect | IB_metadata);
@@ -423,13 +437,13 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source)
if (!IMB_metadata_get_field(img, "Thumb::MTime", mtime, 40)) {
/* illegal thumb, forget it! */
IMB_freeImBuf(img);
- img = 0;
+ img = NULL;
} else {
time_t t = atol(mtime);
if (st.st_mtime != t) {
/* recreate all thumbs */
IMB_freeImBuf(img);
- img = 0;
+ img = NULL;
IMB_thumb_delete(path, THB_NORMAL);
IMB_thumb_delete(path, THB_LARGE);
IMB_thumb_delete(path, THB_FAIL);
@@ -440,7 +454,7 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source)
if (img) {
/* we don't need failed thumb anymore */
IMB_freeImBuf(img);
- img = 0;
+ img = NULL;
}
}
}
@@ -453,7 +467,7 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source)
if (img) {
/* we don't need failed thumb anymore */
IMB_freeImBuf(img);
- img = 0;
+ img = NULL;
}
}
}
diff --git a/source/blender/imbuf/intern/thumbs_blend.c b/source/blender/imbuf/intern/thumbs_blend.c
index f12a795b0d6..03c80787920 100644
--- a/source/blender/imbuf/intern/thumbs_blend.c
+++ b/source/blender/imbuf/intern/thumbs_blend.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/thumbs_blend.c
+ * \ingroup imbuf
+ */
+
+
#include <string.h>
#include "zlib.h"
diff --git a/source/blender/imbuf/intern/tiff.c b/source/blender/imbuf/intern/tiff.c
index 35c1c372e71..155696fb199 100644
--- a/source/blender/imbuf/intern/tiff.c
+++ b/source/blender/imbuf/intern/tiff.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/imbuf/intern/tiff.c
+ * \ingroup imbuf
+ */
+
+
/**
* Provides TIFF file loading and saving for Blender, via libtiff.
*
@@ -331,7 +336,7 @@ static void scanline_contig_32bit(float *rectf, float *fbuf, int scanline_w, int
rectf[i*4 + 0] = fbuf[i*spp + 0];
rectf[i*4 + 1] = fbuf[i*spp + 1];
rectf[i*4 + 2] = fbuf[i*spp + 2];
- rectf[i*4 + 3] = (spp==4)?fbuf[i*spp + 3]:1.0;
+ rectf[i*4 + 3] = (spp==4)?fbuf[i*spp + 3]:1.0f;
}
}
diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c
index cdb7823e4f5..3e4136cbef9 100644
--- a/source/blender/imbuf/intern/util.c
+++ b/source/blender/imbuf/intern/util.c
@@ -29,6 +29,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/util.c
+ * \ingroup imbuf
+ */
+
+
#ifdef _WIN32
#include <io.h>
#define open _open
diff --git a/source/blender/imbuf/intern/writeimage.c b/source/blender/imbuf/intern/writeimage.c
index d6694efec91..cd660e11f26 100644
--- a/source/blender/imbuf/intern/writeimage.c
+++ b/source/blender/imbuf/intern/writeimage.c
@@ -29,6 +29,11 @@
* $Id$
*/
+/** \file blender/imbuf/intern/writeimage.c
+ * \ingroup imbuf
+ */
+
+
#include <stdio.h>
#include "IMB_imbuf_types.h"
diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h
index 1618da90392..412b9bc56f6 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -303,8 +303,8 @@ typedef enum eRotationModes {
/* quaternion rotations (default, and for older Blender versions) */
ROT_MODE_QUAT = 0,
/* euler rotations - keep in sync with enum in BLI_math.h */
- ROT_MODE_EUL = 1, /* Blender 'default' (classic) - must be as 1 to sync with arithb defines */
- ROT_MODE_XYZ = 1, /* Blender 'default' (classic) - must be as 1 to sync with arithb defines */
+ ROT_MODE_EUL = 1, /* Blender 'default' (classic) - must be as 1 to sync with BLI_math_rotation.h defines */
+ ROT_MODE_XYZ = 1,
ROT_MODE_XZY,
ROT_MODE_YXZ,
ROT_MODE_YZX,
@@ -511,7 +511,8 @@ typedef struct bDopeSheet {
ID *source; /* currently ID_SCE (for Dopesheet), and ID_SC (for Grease Pencil) */
ListBase chanbase; /* cache for channels (only initialised when pinned) */ // XXX not used!
- struct Group *filter_grp; /* object group for ADS_FILTER_ONLYOBGROUP filtering option */
+ struct Group *filter_grp; /* object group for ADS_FILTER_ONLYOBGROUP filtering option */
+ char searchstr[64]; /* string to search for in displayed names of F-Curves for ADS_FILTER_BY_FCU_NAME filtering option */
int filterflag; /* flags to use for filtering data */
int flag; /* standard flags */
@@ -554,6 +555,7 @@ typedef enum eDopeSheet_FilterFlag {
/* general filtering 3 */
ADS_FILTER_INCL_HIDDEN = (1<<26), /* include 'hidden' channels too (i.e. those from hidden Objects/Bones) */
+ ADS_FILTER_BY_FCU_NAME = (1<<27), /* for F-Curves, filter by the displayed name (i.e. to isolate all Location curves only) */
/* combination filters (some only used at runtime) */
ADS_FILTER_NOOBDATA = (ADS_FILTER_NOCAM|ADS_FILTER_NOMAT|ADS_FILTER_NOLAM|ADS_FILTER_NOCUR|ADS_FILTER_NOPART|ADS_FILTER_NOARM)
diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h
index 31e02ff1877..4b649031f97 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -261,7 +261,7 @@ typedef enum eFMod_Stepped_Flags {
* Defines how to access a dependency needed for a driver variable.
*/
typedef struct DriverTarget {
- ID *id; /* ID-block which owns the target */
+ ID *id; /* ID-block which owns the target, no user count */
char *rna_path; /* RNA path defining the setting to use (for DVAR_TYPE_SINGLE_PROP) */
diff --git a/source/blender/makesdna/DNA_gpencil_types.h b/source/blender/makesdna/DNA_gpencil_types.h
index ffccc08048e..6eb5f64ffc3 100644
--- a/source/blender/makesdna/DNA_gpencil_types.h
+++ b/source/blender/makesdna/DNA_gpencil_types.h
@@ -119,6 +119,8 @@ typedef struct bGPDlayer {
#define GP_LAYER_SELECT (1<<5)
/* current frame for layer can't be changed */
#define GP_LAYER_FRAMELOCK (1<<6)
+ /* don't render xray (which is default) */
+#define GP_LAYER_NO_XRAY (1<<7)
/* Grease-Pencil Annotations - 'DataBlock' */
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index 860da1d80a4..1489593f7f6 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -160,7 +160,8 @@ typedef struct Material {
short sss_flag, sss_preset;
int mapto_textured; /* render-time cache to optimise texture lookups */
- int pad4;
+ short shadowonly_flag; /* "shadowsonly" type */
+ short pad;
ListBase gpumaterial; /* runtime */
} Material;
@@ -238,6 +239,11 @@ typedef struct Material {
#define MA_RAYMIR_FADETOSKY 0
#define MA_RAYMIR_FADETOMAT 1
+/* shadowonly_flag */
+#define MA_SO_OLD 0
+#define MA_SO_SHADOW 1
+#define MA_SO_SHADED 2
+
/* shade_flag */
#define MA_CUBIC 1
#define MA_OBCOLOR 2
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index ec30a01c8e2..d505b22c773 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -63,8 +63,6 @@ typedef struct Mesh {
struct AnimData *adt; /* animation data (must be immediately after id for utilities to use it) */
struct BoundBox *bb;
-
- ListBase effect;
struct Ipo *ipo; // XXX depreceated... old animation system
struct Key *key;
@@ -104,22 +102,20 @@ typedef struct Mesh {
* of the last selected face and is similar to the old active face flag where
* the face does not need to be selected, -1 is inactive */
int act_face;
-
- short texflag, editflag;
-
+
/* texture space, copied as one block in editobject.c */
float loc[3];
float size[3];
float rot[3];
-
- float cubemapsize;
-
- int drawflag;
+
+ short texflag, drawflag;
short smoothresh, flag;
short subdiv, subdivr;
+ char subsurftype; /* only kept for backwards compat, not used anymore */
+ char editflag;
+
short totcol;
- short subsurftype; /* only kept for backwards compat, not used anymore */
struct Multires *mr; /* Multiresolution modeling data */
struct PartialVisibility *pv;
@@ -145,7 +141,7 @@ typedef struct TFace {
#define ME_EDIT_MIRROR_Z (1 << 2) // unused so far
#define ME_EDIT_PAINT_MASK (1 << 3)
-#define ME_EDIT_MIRROR_TOPO (1 << 4) // unused so far
+#define ME_EDIT_MIRROR_TOPO (1 << 4)
/* me->flag */
@@ -160,7 +156,7 @@ typedef struct TFace {
#define ME_OPT_EDGES 256
#define ME_DS_EXPAND 512
-/* me->drawflag, int */
+/* me->drawflag, short */
#define ME_DRAWEDGES (1 << 0)
#define ME_DRAWFACES (1 << 1)
#define ME_DRAWNORMALS (1 << 2)
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index e5d37c5e43e..62f14d4b8fe 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -475,7 +475,7 @@ typedef struct CollisionModifierData {
unsigned int numverts;
unsigned int numfaces;
- float time, pad; /* cfra time of modifier */
+ float time_x, time_xnew; /* cfra time of modifier */
struct BVHTree *bvhtree; /* bounding volume hierarchy for this cloth object */
} CollisionModifierData;
@@ -706,13 +706,16 @@ typedef struct SolidifyModifierData {
float crease_outer;
float crease_rim;
int flag;
+ short mat_ofs;
+ short mat_ofs_rim;
+ int pad;
} SolidifyModifierData;
#define MOD_SOLIDIFY_RIM (1<<0)
#define MOD_SOLIDIFY_EVEN (1<<1)
#define MOD_SOLIDIFY_NORMAL_CALC (1<<2)
#define MOD_SOLIDIFY_VGROUP_INV (1<<3)
-#define MOD_SOLIDIFY_RIM_MATERIAL (1<<4)
+#define MOD_SOLIDIFY_RIM_MATERIAL (1<<4) /* deprecated, used in do_versions */
typedef struct ScrewModifierData {
ModifierData modifier;
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 803e5418bcc..03387c3a63a 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -136,7 +136,8 @@ typedef struct bNode {
void *storage; /* custom data, must be struct, for storage in file */
float locx, locy; /* root offset for drawing */
- float width, miniwidth;
+ float width, miniwidth;
+ char label[32]; /* custom user-defined label */
short custom1, custom2; /* to be abused for buttons */
float custom3, custom4;
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 5b4fc2e554f..fb04e001cad 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -145,7 +145,13 @@ typedef struct Object {
float obmat[4][4]; /* final worldspace matrix with constraints & animsys applied */
float parentinv[4][4]; /* inverse result of parent, so that object doesn't 'stick' to parent */
float constinv[4][4]; /* inverse result of constraints. doesn't include effect of parent or object local transform */
- float imat[4][4]; /* inverse matrix of 'obmat' for during render, old game engine, temporally: ipokeys of transform */
+ float imat[4][4]; /* inverse matrix of 'obmat' for any other use than rendering! */
+
+ /* Previously 'imat' was used at render time, but as other places use it too
+ * the interactive ui of 2.5 creates problems. So now only 'imat_ren' should
+ * be used when ever the inverse of ob->obmat * re->viewmat is needed! - jahka
+ */
+ float imat_ren[4][4];
unsigned int lay; /* copy of Base */
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
index ae97b023e58..09053848b28 100644
--- a/source/blender/makesdna/DNA_particle_types.h
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -123,16 +123,23 @@ typedef struct ParticleData {
typedef struct SPHFluidSettings {
/*Particle Fluid*/
- float spring_k, radius, rest_length, plasticity_constant, yield_ratio;
+ float radius, spring_k, rest_length;
+ float plasticity_constant, yield_ratio;
+ float plasticity_balance, yield_balance;
float viscosity_omega, viscosity_beta;
float stiffness_k, stiffness_knear, rest_density;
float buoyancy;
- int flag, pad;
+ int flag, spring_frames;
} SPHFluidSettings;
/* fluid->flag */
#define SPH_VISCOELASTIC_SPRINGS 1
#define SPH_CURRENT_REST_LENGTH 2
+#define SPH_FAC_REPULSION 4
+#define SPH_FAC_DENSITY 8
+#define SPH_FAC_RADIUS 16
+#define SPH_FAC_VISCOSITY 32
+#define SPH_FAC_REST_LENGTH 64
typedef struct ParticleSettings {
ID id;
@@ -143,12 +150,12 @@ typedef struct ParticleSettings {
struct EffectorWeights *effector_weights;
- int flag;
+ int flag, rt;
short type, from, distr, texact;
/* physics modes */
short phystype, rotmode, avemode, reactevent;
short draw, draw_as, draw_size, childtype;
- short ren_as, subframes;
+ short ren_as, subframes, draw_col;
/* number of path segments, power of 2 except */
short draw_step, ren_step;
short hair_step, keys_step;
@@ -157,12 +164,15 @@ typedef struct ParticleSettings {
short adapt_angle, adapt_pix;
short disp, omat, interpolation, rotfrom, integrator;
- short kink, kink_axis, rt2;
+ short kink, kink_axis;
/* billboards */
short bb_align, bb_uv_split, bb_anim, bb_split_offset;
float bb_tilt, bb_rand_tilt, bb_offset[2];
+ /* draw color */
+ float color_vec_max;
+
/* simplification */
short simplify_flag, simplify_refsize;
float simplify_rate, simplify_transition;
@@ -249,9 +259,9 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
char name[32]; /* particle system name */
float imat[4][4]; /* used for duplicators */
- float cfra, tree_frame;
+ float cfra, tree_frame, bvhtree_frame;
int seed, child_seed;
- int flag, totpart, totunexist, totchild, totcached, totchildcache, rt;
+ int flag, totpart, totunexist, totchild, totcached, totchildcache;
short recalc, target_psys, totkeyed, bakespace;
char bb_uvname[3][32]; /* billboard uv name */
@@ -271,7 +281,8 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
ParticleSpring *fluid_springs;
int tot_fluidsprings, alloc_fluidsprings;
- struct KDTree *tree; /* used for interactions with self and other systems */
+ struct KDTree *tree; /* used for interactions with self and other systems */
+ struct BVHTree *bvhtree; /* used for interactions with self and other systems */
struct ParticleDrawData *pdd;
@@ -339,7 +350,7 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PART_FROM_VERT 0
#define PART_FROM_FACE 1
#define PART_FROM_VOLUME 2
-#define PART_FROM_PARTICLE 3
+/* #define PART_FROM_PARTICLE 3 deprecated! */
#define PART_FROM_CHILD 4
/* part->distr */
@@ -375,10 +386,17 @@ typedef struct ParticleSystem{ /* note, make sure all (runtime) are NULL's in
#define PART_DRAW_RAND_GR 1024
#define PART_DRAW_REN_ADAPT 2048
#define PART_DRAW_VEL_LENGTH (1<<12)
-#define PART_DRAW_MAT_COL (1<<13)
+#define PART_DRAW_MAT_COL (1<<13) /* deprecated, but used in do_versions */
#define PART_DRAW_WHOLE_GR (1<<14)
#define PART_DRAW_REN_STRAND (1<<15)
+/* part->draw_col */
+#define PART_DRAW_COL_NONE 0
+#define PART_DRAW_COL_MAT 1
+#define PART_DRAW_COL_VEL 2
+#define PART_DRAW_COL_ACC 3
+
+
/* part->simplify_flag */
#define PART_SIMPLIFY_ENABLE 1
#define PART_SIMPLIFY_VIEWPORT 2
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index e3057e862b8..b1586068220 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -726,9 +726,11 @@ typedef struct ToolSettings {
/* Alt+RMB option */
char edge_mode;
+ char edge_mode_live_unwrap;
/* Transform */
- short snap_mode, snap_flag, snap_target;
+ char snap_mode;
+ short snap_flag, snap_target;
short proportional, prop_mode;
char proportional_objects; /* proportional edit, object mode */
char pad[3];
@@ -781,7 +783,9 @@ typedef struct Scene {
unsigned int lay; /* bitflags for layer visibility */
int layact; /* active layer */
+ unsigned int lay_updated; /* runtime flag, has layer ever been updated since load? */
unsigned int customdata_mask; /* XXX. runtime flag for drawing, actually belongs in the window, only used by object_handle_update() */
+ unsigned int customdata_mask_modal; /* XXX. same as above but for temp operator use (gl renders) */
short flag; /* various settings */
@@ -1039,9 +1043,9 @@ typedef struct Scene {
/* depricate this! */
#define TESTBASE(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0) )
-#define TESTBASELIB(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
-#define TESTBASELIB_BGMODE(v3d, scene, base) ( ((base)->flag & SELECT) && ((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
-#define BASE_EDITABLE_BGMODE(v3d, scene, base) (((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==0) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
+#define TESTBASELIB(v3d, base) ( ((base)->flag & SELECT) && ((base)->lay & v3d->lay) && ((base)->object->id.lib==NULL) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
+#define TESTBASELIB_BGMODE(v3d, scene, base) ( ((base)->flag & SELECT) && ((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==NULL) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
+#define BASE_EDITABLE_BGMODE(v3d, scene, base) (((base)->lay & (v3d ? v3d->lay : scene->lay)) && ((base)->object->id.lib==NULL) && (((base)->object->restrictflag & OB_RESTRICT_VIEW)==0))
#define BASE_SELECTABLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & (OB_RESTRICT_SELECT|OB_RESTRICT_VIEW))==0)
#define BASE_VISIBLE(v3d, base) ((base->lay & v3d->lay) && (base->object->restrictflag & OB_RESTRICT_VIEW)==0)
#define FIRSTBASE scene->base.first
@@ -1059,9 +1063,9 @@ typedef struct Scene {
#define PRVRANGEON (scene->r.flag & SCER_PRV_RANGE)
#define PSFRA ((PRVRANGEON)? (scene->r.psfra): (scene->r.sfra))
#define PEFRA ((PRVRANGEON)? (scene->r.pefra): (scene->r.efra))
-#define FRA2TIME(a) ((((double) scene->r.frs_sec_base) * (a)) / scene->r.frs_sec)
-#define TIME2FRA(a) ((((double) scene->r.frs_sec) * (a)) / scene->r.frs_sec_base)
-#define FPS (((double) scene->r.frs_sec) / scene->r.frs_sec_base)
+#define FRA2TIME(a) ((((double) scene->r.frs_sec_base) * (double)(a)) / (double)scene->r.frs_sec)
+#define TIME2FRA(a) ((((double) scene->r.frs_sec) * (double)(a)) / (double)scene->r.frs_sec_base)
+#define FPS (((double) scene->r.frs_sec) / (double)scene->r.frs_sec_base)
#define RAD_PHASE_PATCHES 1
#define RAD_PHASE_FACES 2
@@ -1176,7 +1180,7 @@ typedef enum SculptFlags {
/* toolsettings->uvcalc_flag */
#define UVCALC_FILLHOLES 1
-/*#define UVCALC_NO_ASPECT_CORRECT 2*/ /* would call this UVCALC_ASPECT_CORRECT, except it should be default with old file */
+#define UVCALC_NO_ASPECT_CORRECT 2 /* would call this UVCALC_ASPECT_CORRECT, except it should be default with old file */
#define UVCALC_TRANSFORM_CORRECT 4 /* adjust UV's while transforming to avoid distortion */
/* toolsettings->uv_flag */
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 381046daedc..cd19f4cb3de 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -184,6 +184,8 @@ typedef struct ARegion {
#define AREA_FLAG_DRAWJOINTO 2
#define AREA_FLAG_DRAWJOINFROM 4
#define AREA_TEMP_INFO 8
+#define AREA_FLAG_DRAWSPLIT_H 16
+#define AREA_FLAG_DRAWSPLIT_V 32
/* If you change EDGEWIDTH, also do the global arrat edcol[] */
#define EDGEWIDTH 1
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index a23aed505ae..7cb0c9456db 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -178,22 +178,19 @@ typedef struct FileSelectParams {
char filter_glob[64]; /* list of filetypes to filter */
+ int active_file;
+ int sel_first;
+ int sel_last;
+
+ /* short */
short type; /* XXXXX for now store type here, should be moved to the operator */
short flag; /* settings for filter, hiding dots files,... */
short sort; /* sort order */
short display; /* display mode flag */
short filter; /* filter when (flags & FILE_FILTER) is true */
- /* XXX - temporary, better move to filelist */
- short active_bookmark;
-
- int active_file;
- int selstate;
-
- /* short */
/* XXX --- still unused -- */
short f_fp; /* show font preview */
- short pad;
char fp_str[8]; /* string to use for font preview */
/* XXX --- end unused -- */
@@ -406,6 +403,7 @@ typedef struct SpaceNode {
int treetype; /* treetype: as same nodetree->type */
short texfrom; /* texfrom object, world or brush */
short recalc; /* currently on 0/1, for auto compo */
+ ListBase linkdrag; /* temporary data for modal linking operator */
struct bGPdata *gpd; /* grease-pencil data */
} SpaceNode;
@@ -711,9 +709,7 @@ enum FileSortTypeE {
#define FILE_BOOKMARKS 512
#define FILE_GROUP_INSTANCE 1024
-/* files in filesel list: 2=ACTIVE */
-#define EDITING (1<<0)
-#define ACTIVEFILE (1<<1)
+/* files in filesel list: file types */
#define BLENDERFILE (1<<2)
#define BLENDERFILE_BACKUP (1<<3)
#define IMAGEFILE (1<<4)
@@ -728,6 +724,13 @@ enum FileSortTypeE {
#define COLLADAFILE (1<<13)
#define OPERATORFILE (1<<14) /* from filter_glob operator property */
+
+/* Selection Flags in filesel: struct direntry, unsigned char selflag */
+#define ACTIVE_FILE (1<<1)
+#define HILITED_FILE (1<<2)
+#define SELECTED_FILE (1<<3)
+#define EDITING_FILE (1<<4)
+
/* SpaceImage->dt_uv */
#define SI_UVDT_OUTLINE 0
#define SI_UVDT_DASH 1
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index d66f612155a..3672e28644a 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -219,8 +219,8 @@ typedef struct ThemeSpace {
char console_output[4], console_input[4], console_info[4], console_error[4];
char console_cursor[4];
- char vertex_size, facedot_size;
- char bpad[2];
+ char vertex_size, outline_width, facedot_size;
+ char bpad;
char syntaxl[4], syntaxn[4], syntaxb[4]; // syntax for textwindow and nodes
char syntaxv[4], syntaxc[4];
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 3ffef475e1b..c9a440522d1 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -41,7 +41,6 @@ struct SpaceLink;
struct Base;
struct BoundBox;
struct RenderInfo;
-struct RetopoViewData;
struct bGPdata;
struct SmoothViewStore;
struct wmTimer;
@@ -113,9 +112,8 @@ typedef struct RegionView3D {
struct bGPdata *gpd; /* Grease-Pencil Data (annotation layers) */
- struct RegionView3D *localvd;
+ struct RegionView3D *localvd; /* allocated backup of its self while in localview */
struct RenderInfo *ri;
- struct RetopoViewData *retopo_view_data;
struct ViewDepths *depths;
/* animated smooth view */
@@ -153,7 +151,7 @@ typedef struct View3D {
struct ListBase bgpicbase;
struct BGpic *bgpic; /* deprecated, use bgpicbase, only kept for do_versions(...) */
- struct View3D *localvd;
+ struct View3D *localvd; /* allocated backup of its self while in localview */
char ob_centre_bone[32]; /* optional string for armature bone to define center */
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index 1325272d94f..769f0ad17db 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -85,7 +85,8 @@ typedef enum ReportType {
enum ReportListFlags {
RPT_PRINT = 1,
RPT_STORE = 2,
- RPT_FREE = 4
+ RPT_FREE = 4,
+ RPT_OP_HOLD = 8 /* dont move them into the operator global list (caller will use) */
};
#
#
diff --git a/source/blender/makesdna/intern/dna_genfile.c b/source/blender/makesdna/intern/dna_genfile.c
index 3b6aafaffa0..e0e521a81d5 100644
--- a/source/blender/makesdna/intern/dna_genfile.c
+++ b/source/blender/makesdna/intern/dna_genfile.c
@@ -170,7 +170,7 @@ static int le_int(int temp)
int DNA_elem_array_size(const char *astr, int len)
{
int a, mul=1;
- char str[100], *cp=0;
+ char str[100], *cp= NULL;
memcpy(str, astr, len+1);
@@ -194,7 +194,7 @@ int DNA_elem_array_size(const char *astr, int len)
void DNA_sdna_free(SDNA *sdna)
{
MEM_freeN(sdna->data);
- MEM_freeN(sdna->names);
+ MEM_freeN((void *)sdna->names);
MEM_freeN(sdna->types);
MEM_freeN(sdna->structs);
@@ -259,7 +259,7 @@ static void printstruct(SDNA *sdna, short strnr)
static short *findstruct_name(SDNA *sdna, const char *str)
{
int a;
- short *sp=0;
+ short *sp= NULL;
for(a=0; a<sdna->nr_structs; a++) {
@@ -269,12 +269,12 @@ static short *findstruct_name(SDNA *sdna, const char *str)
if(strcmp( sdna->types[ sp[0] ], str )==0) return sp;
}
- return 0;
+ return NULL;
}
int DNA_struct_find_nr(SDNA *sdna, const char *str)
{
- short *sp=0;
+ short *sp= NULL;
int a;
if(sdna->lastfind<sdna->nr_structs) {
@@ -808,12 +808,12 @@ static char *find_elem(SDNA *sdna, const char *type, const char *name, short *ol
return olddata;
}
- return 0;
+ return NULL;
}
olddata+= len;
}
- return 0;
+ return NULL;
}
static void reconstruct_elem(SDNA *newsdna, SDNA *oldsdna, char *type, const char *name, char *curdata, short *old, char *olddata)
@@ -999,7 +999,7 @@ void DNA_struct_switch_endian(SDNA *oldsdna, int oldSDNAnr, char *data)
/* test: is type a struct? */
if(spc[0]>=firststructtypenr && !ispointer(name)) {
/* where does the old data start (is there one?) */
- cpo= find_elem(oldsdna, type, name, spo, data, 0);
+ cpo= find_elem(oldsdna, type, name, spo, data, NULL);
if(cpo) {
oldSDNAnr= DNA_struct_find_nr(oldsdna, type);
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index 711d7a08687..47ddbc59580 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -615,7 +615,7 @@ int convert_include(char *filename)
sp[0]= type;
sp[1]= name;
- if ((debugSDNA>1) && (names[name] != 0 )) printf("%s |", names[name]);
+ if ((debugSDNA>1) && (names[name] != NULL)) printf("%s |", names[name]);
structpoin[1]++;
sp+= 2;
@@ -630,7 +630,7 @@ int convert_include(char *filename)
sp[0]= type;
sp[1]= name;
- if ((debugSDNA > 1) && (names[name] != 0 )) printf("%s ||", names[name]);
+ if ((debugSDNA > 1) && (names[name] != NULL)) printf("%s ||", names[name]);
structpoin[1]++;
sp+= 2;
@@ -660,7 +660,7 @@ int convert_include(char *filename)
int arraysize(char *astr, int len)
{
int a, mul=1;
- char str[100], *cp=0;
+ char str[100], *cp=NULL;
memcpy(str, astr, len+1);
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index f02ea29d5e2..2816a8717c1 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -532,6 +532,7 @@ extern StructRNA RNA_ThemeView3D;
extern StructRNA RNA_ThemeWidgetColors;
extern StructRNA RNA_ThemeWidgetStateColors;
extern StructRNA RNA_TimelineMarker;
+extern StructRNA RNA_Timer;
extern StructRNA RNA_ToolSettings;
extern StructRNA RNA_TouchSensor;
extern StructRNA RNA_TrackToConstraint;
@@ -621,6 +622,7 @@ int RNA_struct_idprops_register_check(StructRNA *type);
PropertyRNA *RNA_struct_find_property(PointerRNA *ptr, const char *identifier);
+int RNA_struct_contains_property(PointerRNA *ptr, PropertyRNA *prop_test);
/* lower level functions for access to type properties */
const struct ListBase *RNA_struct_type_properties(StructRNA *srna);
@@ -938,12 +940,12 @@ int RNA_function_call_lookup(struct bContext *C, struct ReportList *reports, Poi
int RNA_function_call_direct(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, ...)
#ifdef __GNUC__
-__attribute__ ((format (printf, 5, 6)));
+__attribute__ ((format (printf, 5, 6)))
#endif
;
int RNA_function_call_direct_lookup(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, const char *identifier, const char *format, ...)
#ifdef __GNUC__
-__attribute__ ((format (printf, 5, 6)));
+__attribute__ ((format (printf, 5, 6)))
#endif
;
int RNA_function_call_direct_va(struct bContext *C, struct ReportList *reports, PointerRNA *ptr, FunctionRNA *func, const char *format, va_list args);
@@ -954,6 +956,12 @@ int RNA_function_call_direct_va_lookup(struct bContext *C, struct ReportList *re
short RNA_type_to_ID_code(StructRNA *type);
StructRNA *ID_code_to_RNA_type(short idcode);
+void RNA_warning(const char *format, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 1, 2)))
+#endif
+;
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesrna/RNA_documentation.h b/source/blender/makesrna/RNA_documentation.h
index de8e2336bf2..491b3836f02 100644
--- a/source/blender/makesrna/RNA_documentation.h
+++ b/source/blender/makesrna/RNA_documentation.h
@@ -1,4 +1,5 @@
-/** \page makesrna makesrna
+/** \file blender/makesrna/RNA_documentation.h
+ * \page makesrna makesrna
* \ingroup RNA
* \section aboutmakesrna About RNA
* The \ref RNA module defines and provides the access API to the data, thus encapsulating \ref DNA
diff --git a/source/blender/makesrna/RNA_enum_types.h b/source/blender/makesrna/RNA_enum_types.h
index b9fb7c89468..0bda47b4c7c 100644
--- a/source/blender/makesrna/RNA_enum_types.h
+++ b/source/blender/makesrna/RNA_enum_types.h
@@ -74,8 +74,8 @@ extern EnumPropertyItem event_type_items[];
extern EnumPropertyItem operator_return_items[];
extern EnumPropertyItem brush_sculpt_tool_items[];
-extern EnumPropertyItem brush_vertexpaint_tool_items[];
-extern EnumPropertyItem brush_imagepaint_tool_items[];
+extern EnumPropertyItem brush_vertex_tool_items[];
+extern EnumPropertyItem brush_image_tool_items[];
extern EnumPropertyItem texture_type_items[];
@@ -95,6 +95,8 @@ extern EnumPropertyItem operator_context_items[];
extern EnumPropertyItem wm_report_items[];
+extern EnumPropertyItem transform_mode_types[];
+
extern EnumPropertyItem property_type_items[];
extern EnumPropertyItem property_unit_items[];
@@ -102,11 +104,12 @@ extern EnumPropertyItem viewport_shade_items[];
extern EnumPropertyItem node_socket_type_items[];
-extern EnumPropertyItem node_blend_type_items[];
extern EnumPropertyItem node_math_items[];
extern EnumPropertyItem node_vec_math_items[];
extern EnumPropertyItem node_filter_items[];
+extern EnumPropertyItem ramp_blend_items[];
+
struct bContext;
struct PointerRNA;
EnumPropertyItem *rna_TransformOrientation_itemf(struct bContext *C, struct PointerRNA *ptr, int *free);
diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h
index 13422415c2d..3a15146770f 100644
--- a/source/blender/makesrna/RNA_types.h
+++ b/source/blender/makesrna/RNA_types.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/RNA_types.h
+ * \ingroup RNA
+ */
+
+
#include "BLO_sys_types.h"
#ifndef RNA_TYPES_H
@@ -40,7 +45,7 @@ struct IDProperty;
struct bContext;
struct ReportList;
-/* Pointer
+/** Pointer
*
* RNA pointers are not a single C pointer but include the type,
* and a pointer to the ID struct that owns the struct, since
@@ -122,6 +127,7 @@ typedef enum PropertySubType {
PROP_XYZ = 29,
PROP_XYZ_LENGTH = 29|PROP_UNIT_LENGTH,
PROP_COLOR_GAMMA = 30,
+ PROP_COORDS = 31, /* generic array, no units applied, only that x/y/z/w are used (python vec) */
/* booleans */
PROP_LAYER = 40,
@@ -348,34 +354,6 @@ typedef struct ExtensionRNA {
} ExtensionRNA;
-/* fake struct definitions, needed otherwise collections end up owning the C
- * structs like 'Object' when defined first */
-#define BlendDataActions Main
-#define BlendDataArmatures Main
-#define BlendDataBrushes Main
-#define BlendDataCameras Main
-#define BlendDataCurves Main
-#define BlendDataFonts Main
-#define BlendDataGreasePencils Main
-#define BlendDataGroups Main
-#define BlendDataImages Main
-#define BlendDataLamps Main
-#define BlendDataLattices Main
-#define BlendDataLibraries Main
-#define BlendDataMaterials Main
-#define BlendDataMeshes Main
-#define BlendDataMetaBalls Main
-#define BlendDataNodeTrees Main
-#define BlendDataObjects Main
-#define BlendDataParticles Main
-#define BlendDataScenes Main
-#define BlendDataScreens Main
-#define BlendDataSounds Main
-#define BlendDataTexts Main
-#define BlendDataTextures Main
-#define BlendDataWindowManagers Main
-#define BlendDataWorlds Main
-
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript
index 7f41fb758dd..9942420ae48 100644
--- a/source/blender/makesrna/SConscript
+++ b/source/blender/makesrna/SConscript
@@ -9,6 +9,7 @@ objs += o
incs = '#/intern/guardedalloc #/intern/memutil #/intern/audaspace/intern ../blenkernel ../blenlib ../makesdna intern .'
incs += ' ../windowmanager ../editors/include ../gpu ../imbuf ../ikplugin ../blenfont ../blenloader'
incs += ' ../render/extern/include ../bmesh'
+incs += ' #/extern/glew/include'
defs = []
@@ -54,6 +55,9 @@ if env['BF_UNIT_TEST']:
if env['WITH_BF_PYTHON']:
defs.append('WITH_PYTHON')
+if env['WITH_BF_COLLADA']:
+ defs.append('WITH_COLLADA')
+
if env['OURPLATFORM'] == 'linux2':
cflags='-pthread'
incs += ' ../../../extern/binreloc/include'
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index 0b54d181a78..62e1e018fc9 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -125,6 +125,10 @@ if(WITH_JACK)
add_definitions(-DWITH_JACK)
endif()
+if(WITH_OPENCOLLADA)
+ add_definitions(-DWITH_COLLADA)
+endif()
+
# Build makesrna executable
blender_include_dirs(
.
@@ -141,10 +145,10 @@ blender_include_dirs(
../../windowmanager
../../editors/include
../../render/extern/include
- ../../../../extern/glew/include
../../../../intern/audaspace/intern
../../../../intern/guardedalloc
../../../../intern/memutil
+ ${GLEW_INCLUDE_PATH}
)
add_executable(makesrna ${SRC} ${SRC_RNA_INC} ${SRC_DNA_INC})
diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript
index 998acc3c228..3c76fbf1edb 100644
--- a/source/blender/makesrna/intern/SConscript
+++ b/source/blender/makesrna/intern/SConscript
@@ -34,6 +34,7 @@ incs += ' ../../imbuf ../../makesdna ../../makesrna ../../ikplugin'
incs += ' ../../windowmanager ../../editors/include ../../blenfont'
incs += ' ../../render/extern/include ../../bmesh'
incs += ' #/intern/audaspace/intern '
+incs += ' #/extern/glew/include '
if env['WITH_BF_OPENEXR']:
defs.append('WITH_OPENEXR')
@@ -88,6 +89,9 @@ if env['BF_UNIT_TEST']:
if env['WITH_BF_PYTHON']:
defs.append('WITH_PYTHON')
+if env['WITH_BF_COLLADA']:
+ defs.append('WITH_COLLADA')
+
if env['OURPLATFORM'] == 'linux2':
cflags='-pthread'
incs += ' ../../../extern/binreloc/include'
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 247b87d7bc4..d4bb3957d70 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/makesrna.c
+ * \ingroup RNA
+ */
+
+
#include <float.h>
#include <limits.h>
#include <stdio.h>
@@ -1772,6 +1777,7 @@ static const char *rna_property_subtypename(PropertySubType type)
case PROP_ACCELERATION: return "PROP_ACCELERATION";
case PROP_XYZ: return "PROP_XYZ";
case PROP_COLOR_GAMMA: return "PROP_COLOR_GAMMA";
+ case PROP_COORDS: return "PROP_COORDS";
case PROP_LAYER: return "PROP_LAYER";
case PROP_LAYER_MEMBER: return "PROP_LAYER_MEMBER";
default: {
@@ -1786,7 +1792,7 @@ static const char *rna_property_subtypename(PropertySubType type)
}
}
-static const char *rna_property_subtype_unit(PropertyType type)
+static const char *rna_property_subtype_unit(PropertySubType type)
{
switch(RNA_SUBTYPE_UNIT(type)) {
case PROP_UNIT_NONE: return "PROP_UNIT_NONE";
diff --git a/source/blender/makesrna/intern/rna_ID.c b/source/blender/makesrna/intern/rna_ID.c
index dfc2040b0aa..ae62ef55c01 100644
--- a/source/blender/makesrna/intern/rna_ID.c
+++ b/source/blender/makesrna/intern/rna_ID.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_ID.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
@@ -358,7 +363,7 @@ static void rna_def_ID_properties(BlenderRNA *brna)
prop= RNA_def_property(srna, "idp_array", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "PropertyGroup");
- RNA_def_property_collection_funcs(prop, "rna_IDPArray_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", "rna_IDPArray_length", 0, 0);
+ RNA_def_property_collection_funcs(prop, "rna_IDPArray_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", "rna_IDPArray_length", NULL, NULL);
RNA_def_property_flag(prop, PROP_EXPORT|PROP_IDPROPERTY);
// never tested, maybe its useful to have this?
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index cbde3fe1398..cd9b23da5d3 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_access.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
@@ -57,7 +62,7 @@
#include "rna_internal.h"
-const PointerRNA PointerRNA_NULL= {{0}};
+const PointerRNA PointerRNA_NULL= {{NULL}};
/* Init/Exit */
@@ -105,7 +110,7 @@ void RNA_id_pointer_create(ID *id, PointerRNA *r_ptr)
StructRNA *type, *idtype= NULL;
if(id) {
- PointerRNA tmp= {{0}};
+ PointerRNA tmp= {{NULL}};
tmp.data= id;
idtype= rna_ID_refine(&tmp);
@@ -569,6 +574,28 @@ PropertyRNA *RNA_struct_find_nested(PointerRNA *ptr, StructRNA *srna)
return prop;
}
+int RNA_struct_contains_property(PointerRNA *ptr, PropertyRNA *prop_test)
+{
+ /* note, prop_test could be freed memory, only use for comparison */
+
+ /* validate the RNA is ok */
+ PropertyRNA *iterprop;
+ int found= FALSE;
+
+ iterprop= RNA_struct_iterator_property(ptr->type);
+
+ RNA_PROP_BEGIN(ptr, itemptr, iterprop) {
+ /* PropertyRNA *prop= itemptr.data; */
+ if(prop_test == (PropertyRNA *)itemptr.data) {
+ found= TRUE;
+ break;
+ }
+ }
+ RNA_PROP_END;
+
+ return found;
+}
+
/* low level direct access to type->properties, note this ignores parent classes so should be used with care */
const struct ListBase *RNA_struct_type_properties(StructRNA *srna)
{
@@ -739,7 +766,7 @@ char RNA_property_array_item_char(PropertyRNA *prop, int index)
/* get string to use for array index */
if ((index < 4) && ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE))
return quatitem[index];
- else if((index < 4) && ELEM7(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_XYZ_LENGTH, PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION))
+ else if((index < 4) && ELEM8(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_XYZ_LENGTH, PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION, PROP_COORDS))
return vectoritem[index];
else if ((index < 4) && ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA))
return coloritem[index];
@@ -751,43 +778,41 @@ int RNA_property_array_item_index(PropertyRNA *prop, char name)
{
PropertySubType subtype= rna_ensure_property(prop)->subtype;
- name= toupper(name);
-
/* get index based on string name/alias */
/* maybe a function to find char index in string would be better than all the switches */
if (ELEM(subtype, PROP_QUATERNION, PROP_AXISANGLE)) {
switch (name) {
- case 'W':
+ case 'w':
return 0;
- case 'X':
+ case 'x':
return 1;
- case 'Y':
+ case 'y':
return 2;
- case 'Z':
+ case 'z':
return 3;
}
}
else if(ELEM6(subtype, PROP_TRANSLATION, PROP_DIRECTION, PROP_XYZ, PROP_EULER, PROP_VELOCITY, PROP_ACCELERATION)) {
switch (name) {
- case 'X':
+ case 'x':
return 0;
- case 'Y':
+ case 'y':
return 1;
- case 'Z':
+ case 'z':
return 2;
- case 'W':
+ case 'w':
return 3;
}
}
else if (ELEM(subtype, PROP_COLOR, PROP_COLOR_GAMMA)) {
switch (name) {
- case 'R':
+ case 'r':
return 0;
- case 'G':
+ case 'g':
return 1;
- case 'B':
+ case 'b':
return 2;
- case 'A':
+ case 'a':
return 3;
}
}
@@ -876,10 +901,10 @@ void RNA_property_float_range(PointerRNA *ptr, PropertyRNA *prop, float *hardmin
IDProperty *item;
item= IDP_GetPropertyTypeFromGroup(idp_ui, "min", IDP_DOUBLE);
- *hardmin= item ? IDP_Double(item) : FLT_MIN;
+ *hardmin= item ? (float)IDP_Double(item) : FLT_MIN;
item= IDP_GetPropertyTypeFromGroup(idp_ui, "max", IDP_DOUBLE);
- *hardmax= item ? IDP_Double(item) : FLT_MAX;
+ *hardmax= item ? (float)IDP_Double(item) : FLT_MAX;
return;
}
@@ -907,16 +932,16 @@ void RNA_property_float_ui_range(PointerRNA *ptr, PropertyRNA *prop, float *soft
IDProperty *item;
item= IDP_GetPropertyTypeFromGroup(idp_ui, "soft_min", IDP_DOUBLE);
- *softmin= item ? IDP_Double(item) : FLT_MIN;
+ *softmin= item ? (float)IDP_Double(item) : FLT_MIN;
item= IDP_GetPropertyTypeFromGroup(idp_ui, "soft_max", IDP_DOUBLE);
- *softmax= item ? IDP_Double(item) : FLT_MAX;
+ *softmax= item ? (float)IDP_Double(item) : FLT_MAX;
item= IDP_GetPropertyTypeFromGroup(idp_ui, "step", IDP_DOUBLE);
- *step= item ? IDP_Double(item) : 1.0f;
+ *step= item ? (float)IDP_Double(item) : 1.0f;
item= IDP_GetPropertyTypeFromGroup(idp_ui, "precision", IDP_DOUBLE);
- *precision= item ? IDP_Double(item) : 3.0f;
+ *precision= item ? (float)IDP_Double(item) : 3.0f;
return;
}
@@ -1326,6 +1351,8 @@ int RNA_property_boolean_get(PointerRNA *ptr, PropertyRNA *prop)
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
+
if((idprop=rna_idproperty_check(&prop, ptr)))
return IDP_Int(idprop);
else if(bprop->get)
@@ -1339,6 +1366,8 @@ void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, int value)
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
+
/* just incase other values are passed */
if(value) value= 1;
@@ -1363,6 +1392,8 @@ void RNA_property_boolean_get_array(PointerRNA *ptr, PropertyRNA *prop, int *val
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
if(prop->arraydimension == 0)
values[0]= RNA_property_boolean_get(ptr, prop);
@@ -1384,6 +1415,8 @@ int RNA_property_boolean_get_index(PointerRNA *ptr, PropertyRNA *prop, int index
int tmp[RNA_MAX_ARRAY_LENGTH];
int len= rna_ensure_property_array_length(ptr, prop);
+ BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
+
if(len <= RNA_MAX_ARRAY_LENGTH) {
RNA_property_boolean_get_array(ptr, prop, tmp);
return tmp[index];
@@ -1405,6 +1438,8 @@ void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const in
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
if(prop->arraydimension == 0)
IDP_Int(idprop)= values[0];
@@ -1436,6 +1471,8 @@ void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int inde
int tmp[RNA_MAX_ARRAY_LENGTH];
int len= rna_ensure_property_array_length(ptr, prop);
+ BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
+
if(len <= RNA_MAX_ARRAY_LENGTH) {
RNA_property_boolean_get_array(ptr, prop, tmp);
tmp[index]= value;
@@ -1455,6 +1492,9 @@ void RNA_property_boolean_set_index(PointerRNA *ptr, PropertyRNA *prop, int inde
int RNA_property_boolean_get_default(PointerRNA *ptr, PropertyRNA *prop)
{
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+
+ BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
+
return bprop->defaultvalue;
}
@@ -1462,6 +1502,8 @@ void RNA_property_boolean_get_default_array(PointerRNA *ptr, PropertyRNA *prop,
{
BooleanPropertyRNA *bprop= (BooleanPropertyRNA*)prop;
+ BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
+
if(prop->arraydimension == 0)
values[0]= bprop->defaultvalue;
else if(bprop->defaultarray)
@@ -1475,6 +1517,8 @@ int RNA_property_boolean_get_default_index(PointerRNA *ptr, PropertyRNA *prop, i
int tmp[RNA_MAX_ARRAY_LENGTH];
int len= rna_ensure_property_array_length(ptr, prop);
+ BLI_assert(RNA_property_type(prop) == PROP_BOOLEAN);
+
if(len <= RNA_MAX_ARRAY_LENGTH) {
RNA_property_boolean_get_default_array(ptr, prop, tmp);
return tmp[index];
@@ -1496,6 +1540,8 @@ int RNA_property_int_get(PointerRNA *ptr, PropertyRNA *prop)
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_INT);
+
if((idprop=rna_idproperty_check(&prop, ptr)))
return IDP_Int(idprop);
else if(iprop->get)
@@ -1509,6 +1555,8 @@ void RNA_property_int_set(PointerRNA *ptr, PropertyRNA *prop, int value)
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_INT);
+
if((idprop=rna_idproperty_check(&prop, ptr)))
IDP_Int(idprop)= value;
else if(iprop->set)
@@ -1530,6 +1578,8 @@ void RNA_property_int_get_array(PointerRNA *ptr, PropertyRNA *prop, int *values)
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_INT);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
if(prop->arraydimension == 0)
values[0]= RNA_property_int_get(ptr, prop);
@@ -1551,6 +1601,8 @@ int RNA_property_int_get_index(PointerRNA *ptr, PropertyRNA *prop, int index)
int tmp[RNA_MAX_ARRAY_LENGTH];
int len= rna_ensure_property_array_length(ptr, prop);
+ BLI_assert(RNA_property_type(prop) == PROP_INT);
+
if(len <= RNA_MAX_ARRAY_LENGTH) {
RNA_property_int_get_array(ptr, prop, tmp);
return tmp[index];
@@ -1572,6 +1624,8 @@ void RNA_property_int_set_array(PointerRNA *ptr, PropertyRNA *prop, const int *v
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_INT);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
if(prop->arraydimension == 0)
IDP_Int(idprop)= values[0];
@@ -1603,6 +1657,8 @@ void RNA_property_int_set_index(PointerRNA *ptr, PropertyRNA *prop, int index, i
int tmp[RNA_MAX_ARRAY_LENGTH];
int len= rna_ensure_property_array_length(ptr, prop);
+ BLI_assert(RNA_property_type(prop) == PROP_INT);
+
if(len <= RNA_MAX_ARRAY_LENGTH) {
RNA_property_int_get_array(ptr, prop, tmp);
tmp[index]= value;
@@ -1629,6 +1685,8 @@ void RNA_property_int_get_default_array(PointerRNA *ptr, PropertyRNA *prop, int
{
IntPropertyRNA *iprop= (IntPropertyRNA*)prop;
+ BLI_assert(RNA_property_type(prop) == PROP_INT);
+
if(prop->arraydimension == 0)
values[0]= iprop->defaultvalue;
else if(iprop->defaultarray)
@@ -1663,6 +1721,8 @@ float RNA_property_float_get(PointerRNA *ptr, PropertyRNA *prop)
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_FLOAT);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
if(idprop->type == IDP_FLOAT)
return IDP_Float(idprop);
@@ -1680,6 +1740,8 @@ void RNA_property_float_set(PointerRNA *ptr, PropertyRNA *prop, float value)
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_FLOAT);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
if(idprop->type == IDP_FLOAT)
IDP_Float(idprop)= value;
@@ -1707,6 +1769,8 @@ void RNA_property_float_get_array(PointerRNA *ptr, PropertyRNA *prop, float *val
IDProperty *idprop;
int i;
+ BLI_assert(RNA_property_type(prop) == PROP_FLOAT);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
if(prop->arraydimension == 0)
values[0]= RNA_property_float_get(ptr, prop);
@@ -1733,6 +1797,8 @@ float RNA_property_float_get_index(PointerRNA *ptr, PropertyRNA *prop, int index
float tmp[RNA_MAX_ARRAY_LENGTH];
int len= rna_ensure_property_array_length(ptr, prop);
+ BLI_assert(RNA_property_type(prop) == PROP_FLOAT);
+
if(len <= RNA_MAX_ARRAY_LENGTH) {
RNA_property_float_get_array(ptr, prop, tmp);
return tmp[index];
@@ -1756,6 +1822,8 @@ void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const floa
IDProperty *idprop;
int i;
+ BLI_assert(RNA_property_type(prop) == PROP_FLOAT);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
if(prop->arraydimension == 0) {
if(idprop->type == IDP_FLOAT)
@@ -1797,6 +1865,8 @@ void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index,
float tmp[RNA_MAX_ARRAY_LENGTH];
int len= rna_ensure_property_array_length(ptr, prop);
+ BLI_assert(RNA_property_type(prop) == PROP_FLOAT);
+
if(len <= RNA_MAX_ARRAY_LENGTH) {
RNA_property_float_get_array(ptr, prop, tmp);
tmp[index]= value;
@@ -1816,6 +1886,9 @@ void RNA_property_float_set_index(PointerRNA *ptr, PropertyRNA *prop, int index,
float RNA_property_float_get_default(PointerRNA *ptr, PropertyRNA *prop)
{
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
+
+ BLI_assert(RNA_property_type(prop) == PROP_FLOAT);
+
return fprop->defaultvalue;
}
@@ -1823,6 +1896,8 @@ void RNA_property_float_get_default_array(PointerRNA *ptr, PropertyRNA *prop, fl
{
FloatPropertyRNA *fprop= (FloatPropertyRNA*)prop;
+ BLI_assert(RNA_property_type(prop) == PROP_FLOAT);
+
if(prop->arraydimension == 0)
values[0]= fprop->defaultvalue;
else if(fprop->defaultarray)
@@ -1836,6 +1911,8 @@ float RNA_property_float_get_default_index(PointerRNA *ptr, PropertyRNA *prop, i
float tmp[RNA_MAX_ARRAY_LENGTH];
int len= rna_ensure_property_array_length(ptr, prop);
+ BLI_assert(RNA_property_type(prop) == PROP_FLOAT);
+
if(len <= RNA_MAX_ARRAY_LENGTH) {
RNA_property_float_get_default_array(ptr, prop, tmp);
return tmp[index];
@@ -1857,6 +1934,8 @@ void RNA_property_string_get(PointerRNA *ptr, PropertyRNA *prop, char *value)
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_STRING);
+
if((idprop=rna_idproperty_check(&prop, ptr)))
strcpy(value, IDP_String(idprop));
else if(sprop->get)
@@ -1870,6 +1949,8 @@ char *RNA_property_string_get_alloc(PointerRNA *ptr, PropertyRNA *prop, char *fi
char *buf;
int length;
+ BLI_assert(RNA_property_type(prop) == PROP_STRING);
+
length= RNA_property_string_length(ptr, prop);
if(length+1 < fixedlen)
@@ -1888,6 +1969,8 @@ int RNA_property_string_length(PointerRNA *ptr, PropertyRNA *prop)
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_STRING);
+
if((idprop=rna_idproperty_check(&prop, ptr)))
return strlen(IDP_String(idprop));
else if(sprop->length)
@@ -1901,6 +1984,8 @@ void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *val
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_STRING);
+
if((idprop=rna_idproperty_check(&prop, ptr)))
IDP_AssignString(idprop, (char*)value, RNA_property_string_maxlength(prop) - 1);
else if(sprop->set)
@@ -1917,6 +2002,9 @@ void RNA_property_string_set(PointerRNA *ptr, PropertyRNA *prop, const char *val
void RNA_property_string_get_default(PointerRNA *ptr, PropertyRNA *prop, char *value)
{
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
+
+ BLI_assert(RNA_property_type(prop) == PROP_STRING);
+
strcpy(value, sprop->defaultvalue);
}
@@ -1925,6 +2013,8 @@ char *RNA_property_string_get_default_alloc(PointerRNA *ptr, PropertyRNA *prop,
char *buf;
int length;
+ BLI_assert(RNA_property_type(prop) == PROP_STRING);
+
length= RNA_property_string_default_length(ptr, prop);
if(length+1 < fixedlen)
@@ -1941,6 +2031,9 @@ char *RNA_property_string_get_default_alloc(PointerRNA *ptr, PropertyRNA *prop,
int RNA_property_string_default_length(PointerRNA *ptr, PropertyRNA *prop)
{
StringPropertyRNA *sprop= (StringPropertyRNA*)prop;
+
+ BLI_assert(RNA_property_type(prop) == PROP_STRING);
+
return strlen(sprop->defaultvalue);
}
@@ -1949,6 +2042,8 @@ int RNA_property_enum_get(PointerRNA *ptr, PropertyRNA *prop)
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_ENUM);
+
if((idprop=rna_idproperty_check(&prop, ptr)))
return IDP_Int(idprop);
else if(eprop->get)
@@ -1962,6 +2057,8 @@ void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_ENUM);
+
if((idprop=rna_idproperty_check(&prop, ptr)))
IDP_Int(idprop)= value;
else if(eprop->set) {
@@ -1982,6 +2079,9 @@ void RNA_property_enum_set(PointerRNA *ptr, PropertyRNA *prop, int value)
int RNA_property_enum_get_default(PointerRNA *ptr, PropertyRNA *prop)
{
EnumPropertyRNA *eprop= (EnumPropertyRNA*)prop;
+
+ BLI_assert(RNA_property_type(prop) == PROP_ENUM);
+
return eprop->defaultvalue;
}
@@ -1991,6 +2091,8 @@ PointerRNA RNA_property_pointer_get(PointerRNA *ptr, PropertyRNA *prop)
PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_POINTER);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
pprop= (PointerPropertyRNA*)prop;
@@ -2015,6 +2117,8 @@ void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr
{
/*IDProperty *idprop;*/
+ BLI_assert(RNA_property_type(prop) == PROP_POINTER);
+
if((/*idprop=*/ rna_idproperty_check(&prop, ptr))) {
/* not supported */
}
@@ -2033,6 +2137,9 @@ void RNA_property_pointer_set(PointerRNA *ptr, PropertyRNA *prop, PointerRNA ptr
PointerRNA RNA_property_pointer_get_default(PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop))
{
//PointerPropertyRNA *pprop= (PointerPropertyRNA*)prop;
+
+ // BLI_assert(RNA_property_type(prop) == PROP_POINTER);
+
return PointerRNA_NULL; // FIXME: there has to be a way...
}
@@ -2040,6 +2147,8 @@ void RNA_property_pointer_add(PointerRNA *ptr, PropertyRNA *prop)
{
/*IDProperty *idprop;*/
+ BLI_assert(RNA_property_type(prop) == PROP_POINTER);
+
if((/*idprop=*/rna_idproperty_check(&prop, ptr))) {
/* already exists */
}
@@ -2061,6 +2170,8 @@ void RNA_property_pointer_remove(PointerRNA *ptr, PropertyRNA *prop)
{
IDProperty *idprop, *group;
+ BLI_assert(RNA_property_type(prop) == PROP_POINTER);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
group= RNA_struct_idprops(ptr, 0);
@@ -2087,6 +2198,8 @@ void RNA_property_collection_begin(PointerRNA *ptr, PropertyRNA *prop, Collectio
{
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
memset(iter, 0, sizeof(*iter));
if((idprop=rna_idproperty_check(&prop, ptr)) || (prop->flag & PROP_IDPROPERTY)) {
@@ -2138,6 +2251,8 @@ int RNA_property_collection_length(PointerRNA *ptr, PropertyRNA *prop)
CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
return idprop->len;
}
@@ -2162,6 +2277,8 @@ void RNA_property_collection_add(PointerRNA *ptr, PropertyRNA *prop, PointerRNA
IDProperty *idprop;
// CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
IDPropertyTemplate val = {0};
IDProperty *item;
@@ -2219,6 +2336,8 @@ int RNA_property_collection_remove(PointerRNA *ptr, PropertyRNA *prop, int key)
IDProperty *idprop;
// CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)prop;
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
IDProperty tmp, *array;
int len;
@@ -2264,6 +2383,8 @@ int RNA_property_collection_move(PointerRNA *ptr, PropertyRNA *prop, int key, in
{
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
if((idprop=rna_idproperty_check(&prop, ptr))) {
IDProperty tmp, *array;
int len;
@@ -2292,6 +2413,8 @@ void RNA_property_collection_clear(PointerRNA *ptr, PropertyRNA *prop)
{
IDProperty *idprop;
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
if((idprop=rna_idproperty_check(&prop, ptr)))
IDP_ResizeIDPArray(idprop, 0);
}
@@ -2301,6 +2424,8 @@ int RNA_property_collection_lookup_index(PointerRNA *ptr, PropertyRNA *prop, Poi
CollectionPropertyIterator iter;
int index= 0;
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
RNA_property_collection_begin(ptr, prop, &iter);
for(index=0; iter.valid; RNA_property_collection_next(&iter), index++) {
if (iter.ptr.data == t_ptr->data)
@@ -2319,6 +2444,8 @@ int RNA_property_collection_lookup_int(PointerRNA *ptr, PropertyRNA *prop, int k
{
CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)rna_ensure_property(prop);
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
if(cprop->lookupint) {
/* we have a callback defined, use it */
return cprop->lookupint(ptr, key, r_ptr);
@@ -2348,6 +2475,8 @@ int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, co
{
CollectionPropertyRNA *cprop= (CollectionPropertyRNA*)rna_ensure_property(prop);
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
if(cprop->lookupstring) {
/* we have a callback defined, use it */
return cprop->lookupstring(ptr, key, r_ptr);
@@ -2389,6 +2518,8 @@ int RNA_property_collection_lookup_string(PointerRNA *ptr, PropertyRNA *prop, co
int RNA_property_collection_type_get(PointerRNA *ptr, PropertyRNA *prop, PointerRNA *r_ptr)
{
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
*r_ptr= *ptr;
return ((r_ptr->type = prop->srna) ? 1:0);
}
@@ -2399,6 +2530,8 @@ int RNA_property_collection_raw_array(PointerRNA *ptr, PropertyRNA *prop, Proper
ArrayIterator *internal;
char *arrayp;
+ BLI_assert(RNA_property_type(prop) == PROP_COLLECTION);
+
if(!(prop->flag & PROP_RAW_ARRAY) || !(itemprop->flag & PROP_RAW_ACCESS))
return 0;
@@ -3756,7 +3889,7 @@ char *RNA_string_get_alloc(PointerRNA *ptr, const char *name, char *fixedbuf, in
}
else {
printf("RNA_string_get_alloc: %s.%s not found.\n", ptr->type->identifier, name);
- return 0;
+ return NULL;
}
}
@@ -4942,3 +5075,19 @@ int RNA_property_copy(PointerRNA *ptr, PointerRNA *fromptr, PropertyRNA *prop, i
return 0;
}
+
+void RNA_warning(const char *format, ...)
+{
+ va_list args;
+
+ va_start(args, format);
+ vprintf(format, args);
+ va_end(args);
+
+#ifdef WITH_PYTHON
+ {
+ extern void PyC_LineSpit(void);
+ PyC_LineSpit();
+ }
+#endif
+}
diff --git a/source/blender/makesrna/intern/rna_action.c b/source/blender/makesrna/intern/rna_action.c
index 0cc52c93b95..418451801ca 100644
--- a/source/blender/makesrna/intern/rna_action.c
+++ b/source/blender/makesrna/intern/rna_action.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_action.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -231,6 +236,18 @@ static void rna_def_dopesheet(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Filtering Group", "Group that included Object should be a member of");
RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+ /* FCurve Display Name Search Settings */
+ prop= RNA_def_property(srna, "show_only_matching_fcurves", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "filterflag", ADS_FILTER_BY_FCU_NAME);
+ RNA_def_property_ui_text(prop, "Only Matching F-Curves", "Only include F-Curves with names containing search text");
+ RNA_def_property_ui_icon(prop, ICON_VIEWZOOM, 0);
+ RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+
+ prop= RNA_def_property(srna, "filter_fcurve_name", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "searchstr");
+ RNA_def_property_ui_text(prop, "F-Curve Name Filter", "F-Curve live filtering string");
+ RNA_def_property_update(prop, NC_ANIMATION|ND_ANIMCHAN|NA_EDITED, NULL);
+
/* NLA Specific Settings */
prop= RNA_def_property(srna, "show_missing_nla", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "filterflag", ADS_FILTER_NLA_NOACT);
@@ -440,7 +457,7 @@ static void rna_def_action_fcurves(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_string(func, "data_path", "", 0, "Data Path", "FCurve data path to use.");
RNA_def_property_flag(parm, PROP_REQUIRED);
- RNA_def_int(func, "array_index", 0, 0, INT_MAX, "Index", "Array index.", 0, INT_MAX);
+ RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "Array index.", 0, INT_MAX);
RNA_def_string(func, "action_group", "", 0, "Action Group", "Acton group to add this fcurve into.");
parm= RNA_def_pointer(func, "fcurve", "FCurve", "", "Newly created fcurve");
diff --git a/source/blender/makesrna/intern/rna_action_api.c b/source/blender/makesrna/intern/rna_action_api.c
index 7c26b4d40fa..07c42cf0d20 100644
--- a/source/blender/makesrna/intern/rna_action_api.c
+++ b/source/blender/makesrna/intern/rna_action_api.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_action_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
diff --git a/source/blender/makesrna/intern/rna_actuator.c b/source/blender/makesrna/intern/rna_actuator.c
index 248d878e9e0..863c30f8ef2 100644
--- a/source/blender/makesrna/intern/rna_actuator.c
+++ b/source/blender/makesrna/intern/rna_actuator.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_actuator.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -48,7 +53,7 @@ EnumPropertyItem actuator_type_items[] ={
{ACT_2DFILTER, "FILTER_2D", 0, "Filter 2D", ""},
{ACT_GAME, "GAME", 0, "Game", ""},
{ACT_MESSAGE, "MESSAGE", 0, "Message", ""},
- {ACT_OBJECT, "OBJECT", 0, "Motion", ""},
+ {ACT_OBJECT, "MOTION", 0, "Motion", ""},
{ACT_PARENT, "PARENT", 0, "Parent", ""},
{ACT_PROPERTY, "PROPERTY", 0, "Property", ""},
{ACT_RANDOM, "RANDOM", 0, "Random", ""},
@@ -1168,7 +1173,7 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_distance_get", "rna_ConstraintActuator_distance_set", NULL);
RNA_def_property_ui_range(prop, -2000.f, 2000.f, 1, 2);
- RNA_def_property_ui_text(prop, "Distance", "Set the maximum length of ray");
+ RNA_def_property_ui_text(prop, "Distance", "Keep this distance to target");
RNA_def_property_update(prop, NC_LOGIC, NULL);
//XXX to use a pointer or add a material lookup
@@ -1209,35 +1214,37 @@ static void rna_def_constraint_actuator(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Reference Direction", "Reference Direction");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_ANGLE);
+ //XXX TODO - use radians internally then change to PROP_ANGLE
+ prop= RNA_def_property(srna, "angle_min", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "minloc[0]");
RNA_def_property_range(prop, 0.0, 180.0);
- RNA_def_property_ui_text(prop, "Min Angle", "Minimum angle to maintain with target direction. No correction is done if angle with target direction is between min and max");
+ RNA_def_property_ui_text(prop, "Min Angle", "Minimum angle (in degree) to maintain with target direction. No correction is done if angle with target direction is between min and max");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_ANGLE);
+ //XXX TODO - use radians internally then change to PROP_ANGLE
+ prop= RNA_def_property(srna, "angle_max", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxloc[0]");
RNA_def_property_range(prop, 0.0, 180.0);
- RNA_def_property_ui_text(prop, "Max Angle", "Maximum angle allowed with target direction. No correction is done if angle with target direction is between min and max");
+ RNA_def_property_ui_text(prop, "Max Angle", "Maximum angle (in degree) allowed with target direction. No correction is done if angle with target direction is between min and max");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* ACT_CONST_TYPE_FH */
prop= RNA_def_property(srna, "fh_height", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_fhheight_get", "rna_ConstraintActuator_fhheight_set", NULL);
RNA_def_property_ui_range(prop, 0.01, 2000.0, 10, 2);
- RNA_def_property_ui_text(prop, "Distance", "Height of the Fh area");
+ RNA_def_property_ui_text(prop, "Distance", "Height of the force field area");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "spring", PROP_FLOAT, PROP_PERCENTAGE);
+ prop= RNA_def_property(srna, "fh_force", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_funcs(prop, "rna_ConstraintActuator_spring_get", "rna_ConstraintActuator_spring_set", NULL);
RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 2);
- RNA_def_property_ui_text(prop, "Fh", "Spring force within the Fh area");
+ RNA_def_property_ui_text(prop, "Force", "Spring force within the force field area");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "fh_damping", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "maxrot[0]");
RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 2);
- RNA_def_property_ui_text(prop, "Damping", "Damping factor of the Fh spring force");
+ RNA_def_property_ui_text(prop, "Damping", "Damping factor of the force field spring");
RNA_def_property_update(prop, NC_LOGIC, NULL);
/* booleans */
@@ -1455,7 +1462,7 @@ static void rna_def_random_actuator(BlenderRNA *brna)
static EnumPropertyItem prop_distribution_items[] ={
{ACT_RANDOM_BOOL_CONST, "BOOL_CONSTANT", 0, "Bool Constant", ""},
{ACT_RANDOM_BOOL_UNIFORM, "BOOL_UNIFORM", 0, "Bool Uniform", ""},
- {ACT_RANDOM_BOOL_BERNOUILLI, "BOOL_BERNOUILLI", 0, "Bool Bernouilli", ""},
+ {ACT_RANDOM_BOOL_BERNOUILLI, "BOOL_BERNOUILLI", 0, "Bool Bernoulli", ""},
{ACT_RANDOM_INT_CONST, "INT_CONSTANT", 0, "Int Constant", ""},
{ACT_RANDOM_INT_UNIFORM, "INT_UNIFORM", 0, "Int Uniform", ""},
{ACT_RANDOM_INT_POISSON, "INT_POISSON", 0, "Int Poisson", ""},
diff --git a/source/blender/makesrna/intern/rna_actuator_api.c b/source/blender/makesrna/intern/rna_actuator_api.c
index e587b6f86e4..3c1f78c21c3 100644
--- a/source/blender/makesrna/intern/rna_actuator_api.c
+++ b/source/blender/makesrna/intern/rna_actuator_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_actuator_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/makesrna/intern/rna_animation.c b/source/blender/makesrna/intern/rna_animation.c
index 0214def4d07..17d2e27c462 100644
--- a/source/blender/makesrna/intern/rna_animation.c
+++ b/source/blender/makesrna/intern/rna_animation.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_animation.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_access.h"
@@ -164,9 +169,9 @@ static void rna_KeyingSetInfo_unregister(const bContext *C, StructRNA *type)
static StructRNA *rna_KeyingSetInfo_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
- KeyingSetInfo dummyksi = {0};
+ KeyingSetInfo dummyksi = {NULL};
KeyingSetInfo *ksi;
- PointerRNA dummyptr = {{0}};
+ PointerRNA dummyptr = {{NULL}};
int have_function[3];
/* setup dummy type info to store static properties in */
@@ -545,7 +550,8 @@ static void rna_def_keyingset_path(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Data Path", "Path to property setting");
RNA_def_struct_name_property(srna, prop); // XXX this is the best indicator for now...
RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL);
-
+
+ /* called 'index' when given as function arg */
prop= RNA_def_property(srna, "array_index", PROP_INT, PROP_NONE);
RNA_def_property_ui_text(prop, "RNA Array Index", "Index to the specific setting if applicable");
RNA_def_property_update(prop, NC_SCENE|ND_KEYINGSET|NA_EDITED, NULL); // XXX: maybe a bit too noisy
diff --git a/source/blender/makesrna/intern/rna_animation_api.c b/source/blender/makesrna/intern/rna_animation_api.c
index 6feb86ff45d..4f1a94d62c5 100644
--- a/source/blender/makesrna/intern/rna_animation_api.c
+++ b/source/blender/makesrna/intern/rna_animation_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_animation_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/makesrna/intern/rna_animviz.c b/source/blender/makesrna/intern/rna_animviz.c
index 91a5659f9aa..5bbd71bf8bc 100644
--- a/source/blender/makesrna/intern/rna_animviz.c
+++ b/source/blender/makesrna/intern/rna_animviz.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_animviz.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c
index a86a7bb2c18..1b07b224f87 100644
--- a/source/blender/makesrna/intern/rna_armature.c
+++ b/source/blender/makesrna/intern/rna_armature.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_armature.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "BLI_math.h"
@@ -795,7 +800,7 @@ static void rna_def_armature(BlenderRNA *brna)
{ARM_OCTA, "OCTAHEDRAL", 0, "Octahedral", "Display bones as octahedral shape (default)"},
{ARM_LINE, "STICK", 0, "Stick", "Display bones as simple 2D lines with dots"},
{ARM_B_BONE, "BBONE", 0, "B-Bone", "Display bones as boxes, showing subdivision and B-Splines"},
- {ARM_ENVELOPE, "ENVELOPE", 0, "Envelope", "Display bones as extruded spheres, showing defomation influence volume"},
+ {ARM_ENVELOPE, "ENVELOPE", 0, "Envelope", "Display bones as extruded spheres, showing deformation influence volume"},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem prop_ghost_type_items[] = {
{ARM_GHOST_CUR, "CURRENT_FRAME", 0, "Around Frame", "Display Ghosts of poses within a fixed number of frames around the current frame"},
diff --git a/source/blender/makesrna/intern/rna_armature_api.c b/source/blender/makesrna/intern/rna_armature_api.c
index 00c0342ac3e..fd9ae7f11c2 100644
--- a/source/blender/makesrna/intern/rna_armature_api.c
+++ b/source/blender/makesrna/intern/rna_armature_api.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_armature_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
diff --git a/source/blender/makesrna/intern/rna_boid.c b/source/blender/makesrna/intern/rna_boid.c
index 1a7f7f99c8f..c9d261e8143 100644
--- a/source/blender/makesrna/intern/rna_boid.c
+++ b/source/blender/makesrna/intern/rna_boid.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_boid.c
+ * \ingroup RNA
+ */
+
+
#include <float.h>
#include <limits.h>
#include <stdlib.h>
@@ -46,7 +51,7 @@
EnumPropertyItem boidrule_type_items[] ={
{eBoidRuleType_Goal, "GOAL", 0, "Goal", "Go to assigned object or loudest assigned signal source"},
{eBoidRuleType_Avoid, "AVOID", 0, "Avoid", "Get away from assigned object or loudest assigned signal source"},
- {eBoidRuleType_AvoidCollision, "AVOID_COLLISION", 0, "Avoid Collision", "Maneuver to avoid collisions with other boids and deflector objects in near future"},
+ {eBoidRuleType_AvoidCollision, "AVOID_COLLISION", 0, "Avoid Collision", "Manoeuvre to avoid collisions with other boids and deflector objects in near future"},
{eBoidRuleType_Separate, "SEPARATE", 0, "Separate", "Keep from going through other boids"},
{eBoidRuleType_Flock, "FLOCK", 0, "Flock", "Move to center of neighbors and match their velocity"},
{eBoidRuleType_FollowLeader, "FOLLOW_LEADER", 0, "Follow Leader", "Follow a boid or assigned object"},
diff --git a/source/blender/makesrna/intern/rna_brush.c b/source/blender/makesrna/intern/rna_brush.c
index 3f8e38a99c6..74857115bc5 100644
--- a/source/blender/makesrna/intern/rna_brush.c
+++ b/source/blender/makesrna/intern/rna_brush.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_brush.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -64,7 +69,7 @@ EnumPropertyItem brush_sculpt_tool_items[] = {
{0, NULL, 0, NULL, NULL}};
-EnumPropertyItem brush_vertexpaint_tool_items[] = {
+EnumPropertyItem brush_vertex_tool_items[] = {
{0, "MIX", ICON_BRUSH_MIX, "Mix", "Use mix blending mode while painting"},
{1, "ADD", ICON_BRUSH_ADD, "Add", "Use add blending mode while painting"},
{2, "SUB", ICON_BRUSH_SUBTRACT, "Subtract", "Use subtract blending mode while painting"},
@@ -74,7 +79,7 @@ EnumPropertyItem brush_vertexpaint_tool_items[] = {
{6, "DARKEN", ICON_BRUSH_DARKEN, "Darken", "Use darken blending mode while painting"},
{0, NULL, 0, NULL, NULL}};
-EnumPropertyItem brush_imagepaint_tool_items[] = {
+EnumPropertyItem brush_image_tool_items[] = {
{PAINT_TOOL_DRAW, "DRAW", ICON_BRUSH_TEXDRAW, "Draw", ""},
{PAINT_TOOL_SOFTEN, "SOFTEN", ICON_BRUSH_SOFTEN, "Soften", ""},
{PAINT_TOOL_SMEAR, "SMEAR", ICON_BRUSH_SMEAR, "Smear", ""},
@@ -125,7 +130,7 @@ static void rna_Brush_sculpt_tool_update(Main *bmain, Scene *scene, PointerRNA *
rna_Brush_update(bmain, scene, ptr);
}
-static void rna_Brush_vertexpaint_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Brush_vertex_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Brush *br= (Brush*)ptr->data;
rna_Brush_reset_icon(br, "vertex_paint");
@@ -135,7 +140,7 @@ static void rna_Brush_vertexpaint_tool_update(Main *bmain, Scene *scene, Pointer
static void rna_Brush_imagepaint_tool_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
Brush *br= (Brush*)ptr->data;
- rna_Brush_reset_icon(br, "texture_paint");
+ rna_Brush_reset_icon(br, "image_paint");
rna_Brush_update(bmain, scene, ptr);
}
@@ -378,13 +383,15 @@ static void rna_def_brush(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Sculpt Tool", "");
RNA_def_property_update(prop, 0, "rna_Brush_sculpt_tool_update");
- prop= RNA_def_property(srna, "vertexpaint_tool", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, brush_vertexpaint_tool_items);
+ prop= RNA_def_property(srna, "vertex_tool", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "vertexpaint_tool");
+ RNA_def_property_enum_items(prop, brush_vertex_tool_items);
RNA_def_property_ui_text(prop, "Vertex/Weight Paint Tool", "");
- RNA_def_property_update(prop, 0, "rna_Brush_vertexpaint_tool_update");
+ RNA_def_property_update(prop, 0, "rna_Brush_vertex_tool_update");
- prop= RNA_def_property(srna, "imagepaint_tool", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_items(prop, brush_imagepaint_tool_items);
+ prop= RNA_def_property(srna, "image_tool", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "imagepaint_tool");
+ RNA_def_property_enum_items(prop, brush_image_tool_items);
RNA_def_property_ui_text(prop, "Image Paint Tool", "");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_Brush_imagepaint_tool_update");
@@ -423,7 +430,7 @@ static void rna_def_brush(BlenderRNA *brna)
RNA_def_property_int_funcs(prop, "rna_Brush_get_size", "rna_Brush_set_size", NULL);
RNA_def_property_range(prop, 1, MAX_BRUSH_PIXEL_RADIUS*10);
RNA_def_property_ui_range(prop, 1, MAX_BRUSH_PIXEL_RADIUS, 1, 0);
- RNA_def_property_ui_text(prop, "Size", "Radius of the brush in pixels");
+ RNA_def_property_ui_text(prop, "Radius", "Radius of the brush in pixels");
RNA_def_property_update(prop, 0, "rna_Brush_update");
prop= RNA_def_property(srna, "unprojected_radius", PROP_FLOAT, PROP_DISTANCE);
@@ -660,11 +667,10 @@ static void rna_def_brush(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Restore Mesh", "Allows a single dot to be carefully positioned");
RNA_def_property_update(prop, 0, "rna_Brush_update");
- /* not exposed in the interface yet
- prop= RNA_def_property(srna, "fixed_tex", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_fixed_texture", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_FIXED_TEX);
RNA_def_property_ui_text(prop, "Fixed Texture", "Keep texture origin in fixed position");
- RNA_def_property_update(prop, 0, "rna_Brush_update"); */
+ RNA_def_property_update(prop, 0, "rna_Brush_update");
/* only for projection paint, TODO, other paint modes */
prop= RNA_def_property(srna, "use_alpha", PROP_BOOLEAN, PROP_NONE);
@@ -690,7 +696,7 @@ static void rna_def_brush(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_WEIGHT_PAINT);
RNA_def_property_ui_text(prop, "Use Weight", "Use this brush in weight paint mode");
- prop= RNA_def_property(srna, "use_paint_texture", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_paint_image", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_TEXTURE_PAINT);
RNA_def_property_ui_text(prop, "Use Texture", "Use this brush in texture paint mode");
@@ -722,7 +728,7 @@ static void rna_def_brush(BlenderRNA *brna)
prop= RNA_def_property(srna, "cursor_color_subtract", PROP_FLOAT, PROP_COLOR);
RNA_def_property_float_sdna(prop, NULL, "sub_col");
RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Subract Color", "Color of cursor when subtracting");
+ RNA_def_property_ui_text(prop, "Subtract Color", "Color of cursor when subtracting");
RNA_def_property_update(prop, 0, "rna_Brush_update");
prop= RNA_def_property(srna, "use_custom_icon", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_camera.c b/source/blender/makesrna/intern/rna_camera.c
index ad5fdbe9aba..34b1dc85881 100644
--- a/source/blender/makesrna/intern/rna_camera.c
+++ b/source/blender/makesrna/intern/rna_camera.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_camera.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
diff --git a/source/blender/makesrna/intern/rna_cloth.c b/source/blender/makesrna/intern/rna_cloth.c
index ed40eb95620..a7f308742ac 100644
--- a/source/blender/makesrna/intern/rna_cloth.c
+++ b/source/blender/makesrna/intern/rna_cloth.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_cloth.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <limits.h>
diff --git a/source/blender/makesrna/intern/rna_color.c b/source/blender/makesrna/intern/rna_color.c
index 64f7c02da44..a8e3500f08f 100644
--- a/source/blender/makesrna/intern/rna_color.c
+++ b/source/blender/makesrna/intern/rna_color.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_color.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
@@ -328,7 +333,7 @@ static void rna_def_curvemappoint(BlenderRNA *brna)
RNA_def_property_enum_bitflag_sdna(prop, NULL, "flag");
RNA_def_property_enum_items(prop, prop_handle_type_items);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Handle Type", "Curve interpolation at this point: bezier or vector");
+ RNA_def_property_ui_text(prop, "Handle Type", "Curve interpolation at this point: Bezier or vector");
prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", CUMA_SELECT);
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index 9570d817726..fcfbb4eb990 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_constraint.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -70,32 +75,20 @@ EnumPropertyItem constraint_type_items[] ={
{CONSTRAINT_TYPE_SHRINKWRAP, "SHRINKWRAP", ICON_CONSTRAINT_DATA, "Shrinkwrap", ""},
{0, NULL, 0, NULL, NULL}};
-EnumPropertyItem space_pchan_items[] = {
+static EnumPropertyItem space_pchan_items[] = {
{0, "WORLD", 0, "World Space", ""},
{2, "POSE", 0, "Pose Space", ""},
{3, "LOCAL_WITH_PARENT", 0, "Local With Parent", ""},
{1, "LOCAL", 0, "Local Space", ""},
{0, NULL, 0, NULL, NULL}};
-EnumPropertyItem space_object_items[] = {
+#ifdef RNA_RUNTIME
+
+static EnumPropertyItem space_object_items[] = {
{0, "WORLD", 0, "World Space", ""},
{1, "LOCAL", 0, "Local Space", ""},
{0, NULL, 0, NULL, NULL}};
-EnumPropertyItem constraint_ik_type_items[] ={
- {CONSTRAINT_IK_COPYPOSE, "COPY_POSE", 0, "Copy Pose", ""},
- {CONSTRAINT_IK_DISTANCE, "DISTANCE", 0, "Distance", ""},
- {0, NULL, 0, NULL, NULL},
-};
-
-EnumPropertyItem constraint_ik_axisref_items[] ={
- {0, "BONE", 0, "Bone", ""},
- {CONSTRAINT_IK_TARGETAXIS, "TARGET", 0, "Target", ""},
- {0, NULL, 0, NULL, NULL},
-};
-
-#ifdef RNA_RUNTIME
-
#include "BKE_animsys.h"
#include "BKE_action.h"
#include "BKE_constraint.h"
@@ -322,47 +315,6 @@ static void rna_SplineIKConstraint_joint_bindings_set(PointerRNA *ptr, const flo
memcpy(ikData->points, values, ikData->numpoints * sizeof(float));
}
-/* Array Get/Set Functions for RigidBodyJointConstraint Min/Max Cone Limits */
-void rna_RigidBodyJointConstraint_limit_cone_min_get(PointerRNA *ptr, float values[3])
-{
- bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
- float *limit = data->minLimit;
-
- values[0]= limit[3];
- values[1]= limit[4];
- values[2]= limit[5];
-}
-
-static void rna_RigidBodyJointConstraint_limit_cone_min_set(PointerRNA *ptr, const float values[3])
-{
- bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
- float *limit = data->minLimit;
-
- limit[3]= values[0];
- limit[4]= values[1];
- limit[5]= values[2];
-}
-
-void rna_RigidBodyJointConstraint_limit_cone_max_get(PointerRNA *ptr, float values[3])
-{
- bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
- float *limit = data->maxLimit;
-
- values[0]= limit[3];
- values[1]= limit[4];
- values[2]= limit[5];
-}
-
-static void rna_RigidBodyJointConstraint_limit_cone_max_set(PointerRNA *ptr, const float values[3])
-{
- bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint*)(((bConstraint*)ptr->data)->data);
- float *limit = data->maxLimit;
-
- limit[3]= values[0];
- limit[4]= values[1];
- limit[5]= values[2];
-}
-
#else
EnumPropertyItem constraint_distance_items[] = {
@@ -502,6 +454,18 @@ static void rna_def_constraint_kinematic(BlenderRNA *brna)
StructRNA *srna;
PropertyRNA *prop;
+ static EnumPropertyItem constraint_ik_axisref_items[] ={
+ {0, "BONE", 0, "Bone", ""},
+ {CONSTRAINT_IK_TARGETAXIS, "TARGET", 0, "Target", ""},
+ {0, NULL, 0, NULL, NULL},
+ };
+
+ static EnumPropertyItem constraint_ik_type_items[] ={
+ {CONSTRAINT_IK_COPYPOSE, "COPY_POSE", 0, "Copy Pose", ""},
+ {CONSTRAINT_IK_DISTANCE, "DISTANCE", 0, "Distance", ""},
+ {0, NULL, 0, NULL, NULL},
+ };
+
srna= RNA_def_struct(brna, "KinematicConstraint", "Constraint");
RNA_def_struct_ui_text(srna, "Kinematic Constraint", "Inverse Kinematics");
RNA_def_struct_sdna_from(srna, "bKinematicConstraint", "data");
@@ -1158,7 +1122,7 @@ static void rna_def_constraint_stretch_to(BlenderRNA *brna)
static EnumPropertyItem volume_items[] = {
{VOLUME_XZ, "VOLUME_XZX", 0, "XZ", ""},
- {VOLUME_X, "VOLUME_X", 0, "Y", ""},
+ {VOLUME_X, "VOLUME_X", 0, "X", ""},
{VOLUME_Z, "VOLUME_Z", 0, "Z", ""},
{NO_VOLUME, "NO_VOLUME", 0, "None", ""},
{0, NULL, 0, NULL, NULL}};
@@ -1293,62 +1257,92 @@ static void rna_def_constraint_rigid_body_joint(BlenderRNA *brna)
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
- /* Limit */
-
- /* Limit Min/Max for genereic 6 DoF */
- prop= RNA_def_property(srna, "limit_generic_min", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "minLimit");
- RNA_def_property_array(prop, 6);
- RNA_def_property_ui_text(prop, "Minimum Limit", "");
-
- prop= RNA_def_property(srna, "limit_generic_max", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "maxLimit");
- RNA_def_property_array(prop, 6);
- RNA_def_property_ui_text(prop, "Maximum Limit", "");
-
- /* Limit Min/Max for Cone Twist */
- prop= RNA_def_property(srna, "limit_cone_min", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "minLimit");
- RNA_def_property_float_funcs(prop, "rna_RigidBodyJointConstraint_limit_cone_min_get", "rna_RigidBodyJointConstraint_limit_cone_min_set", NULL);
- RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Minimum Limit", "");
-
- prop= RNA_def_property(srna, "limit_cone_max", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "maxLimit");
- RNA_def_property_float_funcs(prop, "rna_RigidBodyJointConstraint_limit_cone_max_get", "rna_RigidBodyJointConstraint_limit_cone_max_set", NULL);
- RNA_def_property_array(prop, 3);
- RNA_def_property_ui_text(prop, "Maximum Limit", "");
+ /* Limits */
+ /* Limit Min/Max */
+ prop= RNA_def_property(srna, "limit_min_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "minLimit[0]");
+ RNA_def_property_ui_text(prop, "Minimum Limit X", "");
+
+ prop= RNA_def_property(srna, "limit_min_y", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "minLimit[1]");
+ RNA_def_property_ui_text(prop, "Minimum Limit Y", "");
+
+ prop= RNA_def_property(srna, "limit_min_z", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "minLimit[2]");
+ RNA_def_property_ui_text(prop, "Minimum Limit Z", "");
+
+ prop= RNA_def_property(srna, "limit_max_x", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxLimit[0]");
+ RNA_def_property_ui_text(prop, "Maximum Limit X", "");
+
+ prop= RNA_def_property(srna, "limit_max_y", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxLimit[1]");
+ RNA_def_property_ui_text(prop, "Maximum Limit Y", "");
+
+ prop= RNA_def_property(srna, "limit_max_z", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "maxLimit[2]");
+ RNA_def_property_ui_text(prop, "Maximum Limit Z", "");
+
+ /* Limit Min/Max for angle */
+ prop= RNA_def_property(srna, "limit_angle_min_x", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "minLimit[3]");
+ RNA_def_property_range(prop, -M_PI*2, M_PI*2);
+ RNA_def_property_ui_text(prop, "Minimum Angular Limit X", "");
-
- /* Limit Booleans */
+ prop= RNA_def_property(srna, "limit_angle_min_y", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "minLimit[4]");
+ RNA_def_property_range(prop, -M_PI*2, M_PI*2);
+ RNA_def_property_ui_text(prop, "Minimum Angular Limit Y", "");
+
+ prop= RNA_def_property(srna, "limit_angle_min_z", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "minLimit[5]");
+ RNA_def_property_range(prop, -M_PI*2, M_PI*2);
+ RNA_def_property_ui_text(prop, "Minimum Angular Limit Z", "");
+
+ prop= RNA_def_property(srna, "limit_angle_max_x", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "maxLimit[3]");
+ RNA_def_property_range(prop, -M_PI*2, M_PI*2);
+ RNA_def_property_ui_text(prop, "Maximum Angular Limit X", "");
+
+ prop= RNA_def_property(srna, "limit_angle_max_y", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "maxLimit[4]");
+ RNA_def_property_range(prop, -M_PI*2, M_PI*2);
+ RNA_def_property_ui_text(prop, "Maximum Angular Limit Y", "");
+
+ prop= RNA_def_property(srna, "limit_angle_max_z", PROP_FLOAT, PROP_ANGLE);
+ RNA_def_property_float_sdna(prop, NULL, "maxLimit[5]");
+ RNA_def_property_range(prop, -M_PI*2, M_PI*2);
+ RNA_def_property_ui_text(prop, "Maximum Angular Limit Z", "");
+
+ /* Limit Booleans */
prop= RNA_def_property(srna, "use_limit_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", 1);
- RNA_def_property_ui_text(prop, "Use X Limit", "Use minimum/maximum x limit");
+ RNA_def_property_ui_text(prop, "Limit X", "Use minimum/maximum x limit");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
prop= RNA_def_property(srna, "use_limit_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", 2);
- RNA_def_property_ui_text(prop, "Use Y Limit", "Use minimum/maximum y limit");
+ RNA_def_property_ui_text(prop, "Limit Y", "Use minimum/maximum y limit");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
prop= RNA_def_property(srna, "use_limit_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", 4);
- RNA_def_property_ui_text(prop, "Use Z Limit", "Use minimum/maximum z limit");
+ RNA_def_property_ui_text(prop, "Limit Z", "Use minimum/maximum z limit");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
prop= RNA_def_property(srna, "use_angular_limit_x", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", 8);
- RNA_def_property_ui_text(prop, "Use Angular X Limit", "Use minimum/maximum x angular limit");
+ RNA_def_property_ui_text(prop, "Angular X Limit", "Use minimum/maximum x angular limit");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
prop= RNA_def_property(srna, "use_angular_limit_y", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", 16);
- RNA_def_property_ui_text(prop, "Use Angular Y Limit", "Use minimum/maximum y angular limit");
+ RNA_def_property_ui_text(prop, "Angular Y Limit", "Use minimum/maximum y angular limit");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
prop= RNA_def_property(srna, "use_angular_limit_z", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", 32);
- RNA_def_property_ui_text(prop, "Use Angular Z Limit", "Use minimum/maximum z angular limit");
+ RNA_def_property_ui_text(prop, "Angular Z Limit", "Use minimum/maximum z angular limit");
RNA_def_property_update(prop, NC_OBJECT|ND_CONSTRAINT, "rna_Constraint_update");
}
diff --git a/source/blender/makesrna/intern/rna_context.c b/source/blender/makesrna/intern/rna_context.c
index 58081d13867..42ef12e7d1e 100644
--- a/source/blender/makesrna/intern/rna_context.c
+++ b/source/blender/makesrna/intern/rna_context.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_context.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "DNA_ID.h"
diff --git a/source/blender/makesrna/intern/rna_controller.c b/source/blender/makesrna/intern/rna_controller.c
index 535476685cd..12d27bc80c2 100644
--- a/source/blender/makesrna/intern/rna_controller.c
+++ b/source/blender/makesrna/intern/rna_controller.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_controller.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "WM_types.h"
@@ -39,7 +44,7 @@ EnumPropertyItem controller_type_items[] ={
{CONT_LOGIC_XOR, "LOGIC_XOR", 0, "Xor", "Logic Xor"},
{CONT_LOGIC_XNOR, "LOGIC_XNOR", 0, "Xnor", "Logic Xnor"},
{CONT_EXPRESSION, "EXPRESSION", 0, "Expression", ""},
- {CONT_PYTHON, "PYTHON", 0, "Python Script", ""},
+ {CONT_PYTHON, "PYTHON", 0, "Python", ""},
{0, NULL, 0, NULL, NULL}};
#ifdef RNA_RUNTIME
diff --git a/source/blender/makesrna/intern/rna_controller_api.c b/source/blender/makesrna/intern/rna_controller_api.c
index c46a61fb1d8..d9defe3f8aa 100644
--- a/source/blender/makesrna/intern/rna_controller_api.c
+++ b/source/blender/makesrna/intern/rna_controller_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_controller_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/makesrna/intern/rna_curve.c b/source/blender/makesrna/intern/rna_curve.c
index e103da253dc..03314bca6a3 100644
--- a/source/blender/makesrna/intern/rna_curve.c
+++ b/source/blender/makesrna/intern/rna_curve.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_curve.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -515,7 +520,7 @@ static void rna_Curve_spline_points_add(ID *id, Nurb *nu, ReportList *reports, i
static void rna_Curve_spline_bezpoints_add(ID *id, Nurb *nu, ReportList *reports, int number)
{
if(nu->type != CU_BEZIER) {
- BKE_report(reports, RPT_ERROR, "Only bezier splines can be added");
+ BKE_report(reports, RPT_ERROR, "Only Bezier splines can be added");
}
else if(number==0) {
// do nothing
@@ -1207,7 +1212,7 @@ static void rna_def_curve(BlenderRNA *brna)
static const EnumPropertyItem curve_axis_items[]= {
{0, "2D", 0, "2D", "Clamp the Z axis of of the curve"},
- {CU_3D, "3D", 0, "3D", "Allow editing on the Z axis of this curve, also alows tilt and curve radius to be used"},
+ {CU_3D, "3D", 0, "3D", "Allow editing on the Z axis of this curve, also allows tilt and curve radius to be used"},
{0, NULL, 0, NULL, NULL}};
srna= RNA_def_struct(brna, "Curve", "ID");
@@ -1235,7 +1240,7 @@ static void rna_def_curve(BlenderRNA *brna)
prop= RNA_def_property(srna, "show_handles", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "drawflag", CU_HIDE_HANDLES);
- RNA_def_property_ui_text(prop, "Draw Handles", "Display bezier handles in editmode");
+ RNA_def_property_ui_text(prop, "Draw Handles", "Display Bezier handles in editmode");
RNA_def_property_update(prop, NC_GEOM|ND_DATA, NULL);
prop= RNA_def_property(srna, "show_normal_face", PROP_BOOLEAN, PROP_NONE);
@@ -1425,7 +1430,7 @@ static void rna_def_curve_nurb(BlenderRNA *brna)
prop= RNA_def_property(srna, "bezier_points", PROP_COLLECTION, PROP_NONE);
RNA_def_property_struct_type(prop, "BezierSplinePoint");
RNA_def_property_collection_sdna(prop, NULL, "bezt", "pntsu");
- RNA_def_property_ui_text(prop, "Bezier Points", "Collection of points for bezier curves only");
+ RNA_def_property_ui_text(prop, "Bezier Points", "Collection of points for Bezier curves only");
rna_def_curve_spline_bezpoints(brna, prop);
@@ -1512,12 +1517,12 @@ static void rna_def_curve_nurb(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_bezier_u", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagu", CU_NURB_BEZIER);
- RNA_def_property_ui_text(prop, "Bezier U", "Make this nurbs curve or surface act like a bezier spline in the U direction (Order U must be 3 or 4, Cyclic U must be disabled)");
+ RNA_def_property_ui_text(prop, "Bezier U", "Make this nurbs curve or surface act like a Bezier spline in the U direction (Order U must be 3 or 4, Cyclic U must be disabled)");
RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_u");
prop= RNA_def_property(srna, "use_bezier_v", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flagv", CU_NURB_BEZIER);
- RNA_def_property_ui_text(prop, "Bezier V", "Make this nurbs surface act like a bezier spline in the V direction (Order V must be 3 or 4, Cyclic V must be disabled)");
+ RNA_def_property_ui_text(prop, "Bezier V", "Make this nurbs surface act like a Bezier spline in the V direction (Order V must be 3 or 4, Cyclic V must be disabled)");
RNA_def_property_update(prop, 0, "rna_Nurb_update_knot_v");
diff --git a/source/blender/makesrna/intern/rna_define.c b/source/blender/makesrna/intern/rna_define.c
index 97c7df253a1..3afec03a13f 100644
--- a/source/blender/makesrna/intern/rna_define.c
+++ b/source/blender/makesrna/intern/rna_define.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_define.c
+ * \ingroup RNA
+ */
+
+
#include <float.h>
#include <limits.h>
#include <stdio.h>
@@ -44,7 +49,7 @@
/* Global used during defining */
-BlenderDefRNA DefRNA = {0, {0, 0}, {0, 0}, 0, 0, 0, 0, 1};
+BlenderDefRNA DefRNA = {NULL, {NULL, NULL}, {NULL, NULL}, NULL, 0, 0, 0, 1};
/* Duplicated code since we can't link in blenkernel or blenlib */
@@ -61,7 +66,7 @@ void rna_addtail(ListBase *listbase, void *vlink)
link->prev = listbase->last;
if (listbase->last) ((Link *)listbase->last)->next = link;
- if (listbase->first == 0) listbase->first = link;
+ if (listbase->first == NULL) listbase->first = link;
listbase->last = link;
}
@@ -390,7 +395,7 @@ static int rna_validate_identifier(const char *identifier, char *error, int prop
}
if (identifier[a]==' ') {
- strcpy(error, "spaces are not ok in identifier names");
+ strcpy(error, "spaces are not okay in identifier names");
return 0;
}
@@ -406,6 +411,21 @@ static int rna_validate_identifier(const char *identifier, char *error, int prop
return 0;
}
}
+
+ if(property) {
+ static const char *kwlist_prop[] = {
+ /* not keywords but reserved all the same because py uses */
+ "keys", "values", "items", "get",
+ NULL
+ };
+
+ for(a=0; kwlist_prop[a]; a++) {
+ if (strcmp(identifier, kwlist_prop[a]) == 0) {
+ strcpy(error, "this keyword is reserved by python");
+ return 0;
+ }
+ }
+ }
return 1;
}
@@ -654,7 +674,7 @@ StructRNA *RNA_def_struct(BlenderRNA *brna, const char *identifier, const char *
if(DefRNA.preprocess) {
RNA_def_property_struct_type(prop, "Property");
- RNA_def_property_collection_funcs(prop, "rna_builtin_properties_begin", "rna_builtin_properties_next", "rna_iterator_listbase_end", "rna_builtin_properties_get", 0, 0, "rna_builtin_properties_lookup_string");
+ RNA_def_property_collection_funcs(prop, "rna_builtin_properties_begin", "rna_builtin_properties_next", "rna_iterator_listbase_end", "rna_builtin_properties_get", NULL, NULL, "rna_builtin_properties_lookup_string");
}
else {
#ifdef RNA_RUNTIME
@@ -1810,7 +1830,7 @@ void RNA_def_property_editable_array_func(PropertyRNA *prop, const char *editabl
void RNA_def_property_update(PropertyRNA *prop, int noteflag, const char *func)
{
if(!DefRNA.preprocess) {
- fprintf(stderr, "RNA_def_struct_refine_func: only during preprocessing.\n");
+ fprintf(stderr, "RNA_def_property_update: only during preprocessing.\n");
return;
}
@@ -2835,7 +2855,7 @@ void RNA_def_property_free_pointers(PropertyRNA *prop)
}
}
-void RNA_def_property_free(StructOrFunctionRNA *cont_, PropertyRNA *prop)
+static void rna_def_property_free(StructOrFunctionRNA *cont_, PropertyRNA *prop)
{
ContainerRNA *cont= cont_;
@@ -2860,7 +2880,7 @@ int RNA_def_property_free_identifier(StructOrFunctionRNA *cont_, const char *ide
for(prop= cont->properties.first; prop; prop= prop->next) {
if(strcmp(prop->identifier, identifier)==0) {
if(prop->flag & PROP_RUNTIME) {
- RNA_def_property_free(cont_, prop);
+ rna_def_property_free(cont_, prop);
return 1;
}
else {
diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c
index 72f74f5a3e9..c5200181133 100644
--- a/source/blender/makesrna/intern/rna_fcurve.c
+++ b/source/blender/makesrna/intern/rna_fcurve.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_fcurve.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_access.h"
@@ -556,6 +561,7 @@ static BezTriple *rna_FKeyframe_points_insert(FCurve *fcu, float frame, float va
static void rna_FKeyframe_points_add(FCurve *fcu, int tot)
{
if(tot > 0) {
+ BezTriple *bezt;
if(fcu->totvert) {
BezTriple *nbezt= MEM_callocN(sizeof(BezTriple) * (fcu->totvert + tot), "rna_FKeyframe_points_add");
memcpy(nbezt, fcu->bezt, sizeof(BezTriple) * fcu->totvert);
@@ -566,7 +572,16 @@ static void rna_FKeyframe_points_add(FCurve *fcu, int tot)
fcu->bezt= MEM_callocN(sizeof(BezTriple) * tot, "rna_FKeyframe_points_add");
}
+ bezt= fcu->bezt + fcu->totvert;
fcu->totvert += tot;
+
+ while(tot--) {
+ /* defaults, no userprefs gives pradictable results for API */
+ bezt->f1= bezt->f2= bezt->f3= SELECT;
+ bezt->ipo= BEZT_IPO_BEZ;
+ bezt->h1= bezt->h2= HD_AUTO;
+ bezt++;
+ }
}
}
@@ -583,7 +598,7 @@ static void rna_FKeyframe_points_remove(FCurve *fcu, ReportList *reports, BezTri
static void rna_fcurve_range(FCurve *fcu, float range[2])
{
- calc_fcurve_range(fcu, range, range+1);
+ calc_fcurve_range(fcu, range, range+1, FALSE);
}
#else
@@ -1204,7 +1219,7 @@ static void rna_def_fpoint(BlenderRNA *brna)
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_SELECTED, NULL);
/* Vector value */
- prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_XYZ);
+ prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_COORDS); /* keyframes are dimensionless */
RNA_def_property_float_sdna(prop, NULL, "vec");
RNA_def_property_array(prop, 2);
RNA_def_property_ui_text(prop, "Point", "Point coordinates");
@@ -1266,19 +1281,19 @@ static void rna_def_fkeyframe(BlenderRNA *brna)
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME_PROP, NULL);
/* Vector values */
- prop= RNA_def_property(srna, "handle_left", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "handle_left", PROP_FLOAT, PROP_COORDS); /* keyframes are dimensionless */
RNA_def_property_array(prop, 2);
RNA_def_property_float_funcs(prop, "rna_FKeyframe_handle1_get", "rna_FKeyframe_handle1_set", NULL);
RNA_def_property_ui_text(prop, "Handle 1", "Coordinates of the first handle");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
- prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_COORDS); /* keyframes are dimensionless */
RNA_def_property_array(prop, 2);
RNA_def_property_float_funcs(prop, "rna_FKeyframe_ctrlpoint_get", "rna_FKeyframe_ctrlpoint_set", NULL);
RNA_def_property_ui_text(prop, "Control Point", "Coordinates of the control point");
RNA_def_property_update(prop, NC_ANIMATION|ND_KEYFRAME|NA_EDITED, NULL);
- prop= RNA_def_property(srna, "handle_right", PROP_FLOAT, PROP_TRANSLATION);
+ prop= RNA_def_property(srna, "handle_right", PROP_FLOAT, PROP_COORDS); /* keyframes are dimensionless */
RNA_def_property_array(prop, 2);
RNA_def_property_float_funcs(prop, "rna_FKeyframe_handle2_get", "rna_FKeyframe_handle2_set", NULL);
RNA_def_property_ui_text(prop, "Handle 2", "Coordinates of the second handle");
@@ -1414,7 +1429,8 @@ static void rna_def_fcurve(BlenderRNA *brna)
RNA_def_property_string_funcs(prop, "rna_FCurve_RnaPath_get", "rna_FCurve_RnaPath_length", "rna_FCurve_RnaPath_set");
RNA_def_property_ui_text(prop, "Data Path", "RNA Path to property affected by F-Curve");
RNA_def_property_update(prop, NC_ANIMATION, NULL); // XXX need an update callback for this to that animation gets evaluated
-
+
+ /* called 'index' when given as function arg */
prop= RNA_def_property(srna, "array_index", PROP_INT, PROP_NONE);
RNA_def_property_ui_text(prop, "RNA Array Index", "Index to the specific property affected by F-Curve if applicable");
RNA_def_property_update(prop, NC_ANIMATION, NULL); // XXX need an update callback for this so that animation gets evaluated
diff --git a/source/blender/makesrna/intern/rna_fcurve_api.c b/source/blender/makesrna/intern/rna_fcurve_api.c
index 12211f33966..a1b84f5bcfe 100644
--- a/source/blender/makesrna/intern/rna_fcurve_api.c
+++ b/source/blender/makesrna/intern/rna_fcurve_api.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_fcurve_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
diff --git a/source/blender/makesrna/intern/rna_fluidsim.c b/source/blender/makesrna/intern/rna_fluidsim.c
index 525f402e5fd..acec2ca7a24 100644
--- a/source/blender/makesrna/intern/rna_fluidsim.c
+++ b/source/blender/makesrna/intern/rna_fluidsim.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_fluidsim.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
diff --git a/source/blender/makesrna/intern/rna_gpencil.c b/source/blender/makesrna/intern/rna_gpencil.c
index 3b5c8f9e8a9..228b00e7937 100644
--- a/source/blender/makesrna/intern/rna_gpencil.c
+++ b/source/blender/makesrna/intern/rna_gpencil.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_gpencil.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -40,7 +45,7 @@
static int rna_GPencilLayer_active_frame_editable(PointerRNA *ptr)
{
bGPDlayer *gpl= (bGPDlayer *)ptr->data;
-
+
/* surely there must be other criteria too... */
if (gpl->flag & GP_LAYER_LOCKED)
return 0;
@@ -48,22 +53,43 @@ static int rna_GPencilLayer_active_frame_editable(PointerRNA *ptr)
return 1;
}
-static void rna_GPencilLayer_active_set(PointerRNA *ptr, int value)
+static PointerRNA rna_GPencil_active_layer_get(PointerRNA *ptr)
{
bGPdata *gpd= ptr->id.data;
- bGPDlayer *gpl= ptr->data;
-
- /* disabled all other layers anyway */
- if (GS(gpd->id.name) == ID_GD) {
+
+ if (GS(gpd->id.name) == ID_GD) { /* why would this ever be not GD */
bGPDlayer *gl;
-
- for (gl= gpd->layers.first; gl; gl= gl->next)
- gl->flag &= ~GP_LAYER_ACTIVE;
- }
-
- /* if enabling value, make it active */
- if (value)
- gpl->flag |= GP_LAYER_ACTIVE;
+
+ for (gl= gpd->layers.first; gl; gl= gl->next) {
+ if(gl->flag & GP_LAYER_ACTIVE) {
+ break;
+ }
+ }
+
+ if(gl) {
+ return rna_pointer_inherit_refine(ptr, &RNA_GPencilLayer, gl);
+ }
+ }
+
+ return rna_pointer_inherit_refine(ptr, NULL, NULL);
+}
+
+static void rna_GPencil_active_layer_set(PointerRNA *ptr, PointerRNA value)
+{
+ bGPdata *gpd= ptr->id.data;
+
+ if (GS(gpd->id.name) == ID_GD) { /* why would this ever be not GD */
+ bGPDlayer *gl;
+
+ for (gl= gpd->layers.first; gl; gl= gl->next) {
+ if(gl == value.data) {
+ gl->flag |= GP_LAYER_ACTIVE;
+ }
+ else {
+ gl->flag &= ~GP_LAYER_ACTIVE;
+ }
+ }
+ }
}
#else
@@ -213,13 +239,16 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_FRAMELOCK);
RNA_def_property_ui_text(prop, "Frame Locked", "Lock current frame displayed by layer");
RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL);
-
+
+ /* expose as layers.active */
+ /*
prop= RNA_def_property(srna, "active", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_ACTIVE);
RNA_def_property_boolean_funcs(prop, NULL, "rna_GPencilLayer_active_set");
RNA_def_property_ui_text(prop, "Active", "Set active layer for editing");
RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL);
-
+ */
+
prop= RNA_def_property(srna, "select", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_SELECT);
RNA_def_property_ui_text(prop, "Select", "Layer is selected for editing in the DopeSheet");
@@ -230,6 +259,47 @@ static void rna_def_gpencil_layer(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_LAYER_DRAWDEBUG);
RNA_def_property_ui_text(prop, "Show Points", "Draw the points which make up the strokes (for debugging purposes)");
RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL);
+
+ /* X-Ray */
+ prop= RNA_def_property(srna, "show_x_ray", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", GP_LAYER_NO_XRAY);
+ RNA_def_property_ui_text(prop, "X Ray", "");
+ RNA_def_property_update(prop, NC_SCREEN|ND_GPENCIL, NULL);
+}
+
+static void rna_def_gpencil_layers(BlenderRNA *brna, PropertyRNA *cprop)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+// FunctionRNA *func;
+// PropertyRNA *parm;
+
+ RNA_def_property_srna(cprop, "GreasePencilLayers");
+ srna= RNA_def_struct(brna, "GreasePencilLayers", NULL);
+ RNA_def_struct_sdna(srna, "bGPdata");
+ RNA_def_struct_ui_text(srna, "Grease Pencil Layers", "Collection of grease pencil layers");
+
+#if 0
+ func= RNA_def_function(srna, "new", "rna_GPencil_layer_new");
+ RNA_def_function_ui_description(func, "Add a new spline to the curve.");
+ parm= RNA_def_enum(func, "type", curve_type_items, CU_POLY, "", "type for the new spline.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_pointer(func, "spline", "Spline", "", "The newly created spline.");
+ RNA_def_function_return(func, parm);
+
+ func= RNA_def_function(srna, "remove", "rna_GPencil_layer_remove");
+ RNA_def_function_ui_description(func, "Remove a spline from a curve.");
+ RNA_def_function_flag(func, FUNC_USE_REPORTS);
+ parm= RNA_def_pointer(func, "spline", "Spline", "", "The spline to remove.");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+#endif
+
+ prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
+ RNA_def_property_struct_type(prop, "GreasePencil");
+ RNA_def_property_pointer_funcs(prop, "rna_GPencil_active_layer_get", "rna_GPencil_active_layer_set", NULL, NULL);
+ RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Active Layer", "Active grease pencil layer");
}
static void rna_def_gpencil_data(BlenderRNA *brna)
@@ -254,6 +324,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "layers", NULL);
RNA_def_property_struct_type(prop, "GPencilLayer");
RNA_def_property_ui_text(prop, "Layers", "");
+ rna_def_gpencil_layers(brna, prop);
/* Flags */
prop= RNA_def_property(srna, "draw_mode", PROP_ENUM, PROP_NONE);
@@ -273,7 +344,7 @@ static void rna_def_gpencil_data(BlenderRNA *brna)
void RNA_def_gpencil(BlenderRNA *brna)
{
rna_def_gpencil_data(brna);
-
+
rna_def_gpencil_layer(brna);
rna_def_gpencil_frame(brna);
rna_def_gpencil_stroke(brna);
diff --git a/source/blender/makesrna/intern/rna_group.c b/source/blender/makesrna/intern/rna_group.c
index ebe6bdd5872..a5097cc8b41 100644
--- a/source/blender/makesrna/intern/rna_group.c
+++ b/source/blender/makesrna/intern/rna_group.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_group.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
diff --git a/source/blender/makesrna/intern/rna_image.c b/source/blender/makesrna/intern/rna_image.c
index 96d85cda5e7..df5bd9f27f3 100644
--- a/source/blender/makesrna/intern/rna_image.c
+++ b/source/blender/makesrna/intern/rna_image.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_image.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -229,7 +234,7 @@ static int rna_Image_depth_get(PointerRNA *ptr)
if(!ibuf)
depth= 0;
else if(ibuf->rect_float)
- depth= 128;
+ depth= ibuf->depth * 4;
else
depth= ibuf->depth;
@@ -238,6 +243,74 @@ static int rna_Image_depth_get(PointerRNA *ptr)
return depth;
}
+static int rna_Image_pixels_get_length(PointerRNA *ptr, int length[RNA_MAX_ARRAY_DIMENSION])
+{
+ Image *ima= ptr->id.data;
+ ImBuf *ibuf;
+ void *lock;
+
+ ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
+
+ if(ibuf)
+ length[0]= ibuf->x*ibuf->y*ibuf->channels;
+ else
+ length[0]= 0;
+
+ BKE_image_release_ibuf(ima, lock);
+
+ return length[0];
+}
+
+static void rna_Image_pixels_get(PointerRNA *ptr, float *values)
+{
+ Image *ima= ptr->id.data;
+ ImBuf *ibuf;
+ void *lock;
+ int i, size;
+
+ ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
+
+ if(ibuf) {
+ size= ibuf->x*ibuf->y*ibuf->channels;
+
+ if(ibuf->rect_float) {
+ memcpy(values, ibuf->rect_float, sizeof(float)*size);
+ }
+ else {
+ for(i = 0; i < size; i++)
+ values[i] = ((unsigned char*)ibuf->rect)[i]*(1.0f/255.0f);
+ }
+ }
+
+ BKE_image_release_ibuf(ima, lock);
+}
+
+static void rna_Image_pixels_set(PointerRNA *ptr, const float *values)
+{
+ Image *ima= ptr->id.data;
+ ImBuf *ibuf;
+ void *lock;
+ int i, size;
+
+ ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
+
+ if(ibuf) {
+ size= ibuf->x*ibuf->y*ibuf->channels;
+
+ if(ibuf->rect_float) {
+ memcpy(ibuf->rect_float, values, sizeof(float)*size);
+ }
+ else {
+ for(i = 0; i < size; i++)
+ ((unsigned char*)ibuf->rect)[i] = FTOCHAR(values[i]);
+ }
+
+ ibuf->userflags |= IB_BITMAPDIRTY;
+ }
+
+ BKE_image_release_ibuf(ima, lock);
+}
+
#else
static void rna_def_imageuser(BlenderRNA *brna)
@@ -484,6 +557,13 @@ static void rna_def_image(BlenderRNA *brna)
RNA_def_property_int_funcs(prop, "rna_Image_size_get" , NULL, NULL);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ prop= RNA_def_property(srna, "pixels", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_flag(prop, PROP_DYNAMIC);
+ RNA_def_property_multi_array(prop, 1, NULL);
+ RNA_def_property_ui_text(prop, "Pixels", "Image pixels in floating point values");
+ RNA_def_property_dynamic_array_funcs(prop, "rna_Image_pixels_get_length");
+ RNA_def_property_float_funcs(prop, "rna_Image_pixels_get", "rna_Image_pixels_set", NULL);
+
RNA_api_image(srna);
}
diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c
index c858c25afe1..cc6214fbcd7 100644
--- a/source/blender/makesrna/intern/rna_image_api.c
+++ b/source/blender/makesrna/intern/rna_image_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_image_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
diff --git a/source/blender/makesrna/intern/rna_internal.h b/source/blender/makesrna/intern/rna_internal.h
index 08f1fb7d2a1..4dc98ceb0a4 100644
--- a/source/blender/makesrna/intern/rna_internal.h
+++ b/source/blender/makesrna/intern/rna_internal.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_internal.h
+ * \ingroup RNA
+ */
+
+
#ifndef RNA_INTERNAL_H
#define RNA_INTERNAL_H
diff --git a/source/blender/makesrna/intern/rna_internal_types.h b/source/blender/makesrna/intern/rna_internal_types.h
index 35a80fdec79..eb1beb90567 100644
--- a/source/blender/makesrna/intern/rna_internal_types.h
+++ b/source/blender/makesrna/intern/rna_internal_types.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_internal_types.h
+ * \ingroup RNA
+ */
+
+
#ifndef RNA_INTERNAL_TYPES_H
#define RNA_INTERNAL_TYPES_H
@@ -341,6 +346,6 @@ struct BlenderRNA {
ListBase structs;
};
-#define CONTAINER_RNA_ID(cont) (const char *)(((ContainerRNA *)(cont))+1)
+#define CONTAINER_RNA_ID(cont) (*(const char **)(((ContainerRNA *)(cont))+1))
#endif /* RNA_INTERNAL_TYPES_H */
diff --git a/source/blender/makesrna/intern/rna_key.c b/source/blender/makesrna/intern/rna_key.c
index 464d1d850a1..3f0ccf99266 100644
--- a/source/blender/makesrna/intern/rna_key.c
+++ b/source/blender/makesrna/intern/rna_key.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_key.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_access.h"
@@ -80,7 +85,7 @@ void rna_ShapeKey_name_set(PointerRNA *ptr, const char *value)
}
/* fix all the animation data which may link to this */
- BKE_all_animdata_fix_paths_rename("keys", oldname, kb->name);
+ BKE_all_animdata_fix_paths_rename("key_blocks", oldname, kb->name);
}
static void rna_ShapeKey_value_set(PointerRNA *ptr, float value)
@@ -99,7 +104,7 @@ static void rna_ShapeKey_value_range(PointerRNA *ptr, float *min, float *max)
}
/* epsilon for how close one end of shapekey range can get to the other */
-#define SHAPEKEY_SLIDER_TOL 0.001
+#define SHAPEKEY_SLIDER_TOL 0.001f
static void rna_ShapeKey_slider_min_range(PointerRNA *ptr, float *min, float *max)
{
@@ -343,9 +348,9 @@ static char *rna_ShapeKey_path(PointerRNA *ptr)
ID *id= ptr->id.data;
if ((id) && (GS(id->name) != ID_KE))
- return BLI_sprintfN("shape_keys.keys[\"%s\"]", kb->name);
+ return BLI_sprintfN("shape_keys.key_blocks[\"%s\"]", kb->name);
else
- return BLI_sprintfN("keys[\"%s\"]", kb->name);
+ return BLI_sprintfN("key_blocks[\"%s\"]", kb->name);
}
static void rna_Key_update_data(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -429,9 +434,9 @@ static char *rna_ShapeKeyPoint_path(PointerRNA *ptr)
int index = rna_ShapeKeyPoint_get_index(key, kb, point);
if (GS(id->name) == ID_KE)
- return BLI_sprintfN("keys[\"%s\"].data[%d]", kb->name, index);
+ return BLI_sprintfN("key_blocks[\"%s\"].data[%d]", kb->name, index);
else
- return BLI_sprintfN("shape_keys.keys[\"%s\"].data[%d]", kb->name, index);
+ return BLI_sprintfN("shape_keys.key_blocks[\"%s\"].data[%d]", kb->name, index);
}
else
return NULL; // XXX: there's really no way to resolve this...
@@ -470,7 +475,7 @@ static void rna_def_keydata(BlenderRNA *brna)
RNA_def_property_update(prop, 0, "rna_Key_update_data");
srna= RNA_def_struct(brna, "ShapeKeyBezierPoint", NULL);
- RNA_def_struct_ui_text(srna, "Shape Key Bezier Point", "Point in a shape key for bezier curves");
+ RNA_def_struct_ui_text(srna, "Shape Key Bezier Point", "Point in a shape key for Bezier curves");
RNA_def_struct_path_func(srna, "rna_ShapeKeyPoint_path"); /* there's nothing type specific here, so this is fine for now */
prop= RNA_def_property(srna, "co", PROP_FLOAT, PROP_TRANSLATION);
@@ -594,10 +599,10 @@ static void rna_def_key(BlenderRNA *brna)
RNA_def_property_pointer_sdna(prop, NULL, "refkey");
RNA_def_property_ui_text(prop, "Reference Key", "");
- prop= RNA_def_property(srna, "keys", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "key_blocks", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "block", NULL);
RNA_def_property_struct_type(prop, "ShapeKey");
- RNA_def_property_ui_text(prop, "Keys", "Shape keys");
+ RNA_def_property_ui_text(prop, "Key Blocks", "Shape keys");
rna_def_animdata_common(srna);
diff --git a/source/blender/makesrna/intern/rna_lamp.c b/source/blender/makesrna/intern/rna_lamp.c
index 63857fad62d..dbb068c9cf0 100644
--- a/source/blender/makesrna/intern/rna_lamp.c
+++ b/source/blender/makesrna/intern/rna_lamp.c
@@ -22,9 +22,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_lamp.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "rna_internal.h"
@@ -132,13 +138,13 @@ static void rna_Lamp_sky_update(Main *bmain, Scene *scene, PointerRNA *ptr)
static float rna_Lamp_spot_size_get(PointerRNA *ptr)
{
Lamp *la= ptr->id.data;
- return la->spotsize * (M_PI / 180.0);
+ return DEG2RADF(la->spotsize);
}
static void rna_Lamp_spot_size_set(PointerRNA *ptr, float value)
{
Lamp *la= ptr->id.data;
- la->spotsize= value * (180.0 / M_PI);
+ la->spotsize= RAD2DEGF(value);
}
@@ -212,25 +218,6 @@ static void rna_def_lamp_sky_settings(BlenderRNA *brna)
{2, "CIE", 0, "CIE", ""},
{0, NULL, 0, NULL, NULL}};
- static EnumPropertyItem prop_blendmode_items[] = {
- {0, "MIX", 0, "Mix", ""},
- {1, "ADD", 0, "Add", ""},
- {2, "MULTIPLY", 0, "Multiply", ""},
- {3, "SUBTRACT", 0, "Subtract", ""},
- {4, "SCREEN", 0, "Screen", ""},
- {5, "DIVIDE", 0, "Divide", ""},
- {6, "DIFFERENCE", 0, "Difference", ""},
- {7, "DARKEN", 0, "Darken", ""},
- {8, "LIGHTEN", 0, "Lighten", ""},
- {9, "OVERLAY", 0, "Overlay", ""},
- {10, "DODGE", 0, "Dodge", ""},
- {11, "BURN", 0, "Burn", ""},
- {12, "HUE", 0, "Hue", ""},
- {13, "SATURATION", 0, "Saturation", ""},
- {14, "VALUE", 0, "Value", ""},
- {15, "COLOR", 0, "Color", ""},
- {0, NULL, 0, NULL, NULL}};
-
srna= RNA_def_struct(brna, "LampSkySettings", NULL);
RNA_def_struct_sdna(srna, "Lamp");
RNA_def_struct_nested(brna, srna, "SunLamp");
@@ -244,7 +231,7 @@ static void rna_def_lamp_sky_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "sky_blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "skyblendtype");
- RNA_def_property_enum_items(prop, prop_blendmode_items);
+ RNA_def_property_enum_items(prop, ramp_blend_items);
RNA_def_property_ui_text(prop, "Sky Blend Mode", "Blend mode for combining sun sky with world sky");
RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
@@ -588,7 +575,7 @@ static void rna_def_spot_lamp(BlenderRNA *brna)
static EnumPropertyItem prop_shadbuftype_items[] = {
{LA_SHADBUF_REGULAR , "REGULAR", 0, "Classical", "Classic shadow buffer"},
- {LA_SHADBUF_HALFWAY, "HALFWAY", 0, "Classic-Halfway", "Regular buffer, averaging the closest and 2nd closest Z value to reducing bias artifaces"},
+ {LA_SHADBUF_HALFWAY, "HALFWAY", 0, "Classic-Halfway", "Regular buffer, averaging the closest and 2nd closest Z value to reducing bias artifacts"},
{LA_SHADBUF_IRREGULAR, "IRREGULAR", 0, "Irregular", "Irregular buffer produces sharp shadow always, but it doesn't show up for raytracing"},
{LA_SHADBUF_DEEP, "DEEP", 0, "Deep", "Deep shadow buffer supports transparency and better filtering, at the cost of more memory usage and processing time"},
{0, NULL, 0, NULL, NULL}};
@@ -662,7 +649,7 @@ static void rna_def_spot_lamp(BlenderRNA *brna)
prop= RNA_def_property(srna, "spot_size", PROP_FLOAT, PROP_ANGLE);
// RNA_def_property_float_sdna(prop, NULL, "spotsize");
- RNA_def_property_range(prop, M_PI/180.0f, M_PI);
+ RNA_def_property_range(prop, M_PI/180.0, M_PI);
RNA_def_property_ui_text(prop, "Spot Size", "Angle of the spotlight beam in degrees");
RNA_def_property_float_funcs(prop, "rna_Lamp_spot_size_get", "rna_Lamp_spot_size_set", NULL); /* only for deg/rad conversion */
RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
diff --git a/source/blender/makesrna/intern/rna_lattice.c b/source/blender/makesrna/intern/rna_lattice.c
index 5d5480e3761..a3503999a4c 100644
--- a/source/blender/makesrna/intern/rna_lattice.c
+++ b/source/blender/makesrna/intern/rna_lattice.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_lattice.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
diff --git a/source/blender/makesrna/intern/rna_main.c b/source/blender/makesrna/intern/rna_main.c
index b01d217376a..eedf199bf1c 100644
--- a/source/blender/makesrna/intern/rna_main.c
+++ b/source/blender/makesrna/intern/rna_main.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_main.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <string.h>
@@ -37,9 +42,20 @@
/* all the list begin functions are added manually here, Main is not in SDNA */
+static int rna_Main_is_saved_get(PointerRNA *ptr)
+{
+ return G.relbase_valid;
+}
+
static int rna_Main_is_dirty_get(PointerRNA *ptr)
{
- return !G.relbase_valid;
+ /* XXX, not totally nice to do it this way, should store in main ? */
+ wmWindowManager *wm;
+ for(wm= G.main->wm.first; wm; wm= wm->id.next) {
+ return !wm->file_saved;
+ }
+
+ return TRUE;
}
static void rna_Main_filepath_get(PointerRNA *ptr, char *value)
@@ -277,7 +293,7 @@ void RNA_def_main(BlenderRNA *brna)
{"brushes", "Brush", "rna_Main_brush_begin", "Brushes", "Brush datablocks.", RNA_def_main_brushes},
{"worlds", "World", "rna_Main_world_begin", "Worlds", "World datablocks.", RNA_def_main_worlds},
{"groups", "Group", "rna_Main_group_begin", "Groups", "Group datablocks.", RNA_def_main_groups},
- {"shape_keys", "Key", "rna_Main_key_begin", "Keys", "Key datablocks.", NULL},
+ {"shape_keys", "Key", "rna_Main_key_begin", "Shape Keys", "Shape Key datablocks.", NULL},
{"scripts", "ID", "rna_Main_script_begin", "Scripts", "Script datablocks (DEPRECATED).", NULL},
{"texts", "Text", "rna_Main_text_begin", "Texts", "Text datablocks.", RNA_def_main_texts},
{"sounds", "Sound", "rna_Main_sound_begin", "Sounds", "Sound datablocks.", RNA_def_main_sounds},
@@ -302,6 +318,11 @@ void RNA_def_main(BlenderRNA *brna)
prop= RNA_def_property(srna, "is_dirty", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_boolean_funcs(prop, "rna_Main_is_dirty_get", NULL);
+ RNA_def_property_ui_text(prop, "File is Saved", "Have recent edits been saved to disk");
+
+ prop= RNA_def_property(srna, "is_saved", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_boolean_funcs(prop, "rna_Main_is_saved_get", NULL);
RNA_def_property_ui_text(prop, "File is Saved", "Has the current session been saved to disk as a .blend file");
for(i=0; lists[i].name; i++)
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 9b3f4209edd..07c2313e50f 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_main_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
@@ -532,6 +537,7 @@ void RNA_def_main_cameras(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataCameras");
srna= RNA_def_struct(brna, "BlendDataCameras", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Cameras", "Collection of cameras");
func= RNA_def_function(srna, "new", "rna_Main_cameras_new");
@@ -561,6 +567,7 @@ void RNA_def_main_scenes(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataScenes");
srna= RNA_def_struct(brna, "BlendDataScenes", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Scenes", "Collection of scenes");
func= RNA_def_function(srna, "new", "rna_Main_scenes_new");
@@ -586,6 +593,7 @@ void RNA_def_main_objects(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataObjects");
srna= RNA_def_struct(brna, "BlendDataObjects", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Objects", "Collection of objects");
func= RNA_def_function(srna, "new", "rna_Main_objects_new");
@@ -619,6 +627,7 @@ void RNA_def_main_materials(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataMaterials");
srna= RNA_def_struct(brna, "BlendDataMaterials", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Material", "Collection of materials");
func= RNA_def_function(srna, "new", "rna_Main_materials_new");
@@ -653,6 +662,7 @@ void RNA_def_main_node_groups(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataNodeTrees");
srna= RNA_def_struct(brna, "BlendDataNodeTrees", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Node Trees", "Collection of node trees");
func= RNA_def_function(srna, "new", "rna_Main_nodetree_new");
@@ -683,6 +693,7 @@ void RNA_def_main_meshes(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataMeshes");
srna= RNA_def_struct(brna, "BlendDataMeshes", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Meshes", "Collection of meshes");
func= RNA_def_function(srna, "new", "rna_Main_meshes_new");
@@ -711,6 +722,7 @@ void RNA_def_main_lamps(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataLamps");
srna= RNA_def_struct(brna, "BlendDataLamps", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Lamps", "Collection of lamps");
func= RNA_def_function(srna, "new", "rna_Main_lamps_new");
@@ -742,6 +754,7 @@ void RNA_def_main_libraries(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataLibraries");
srna= RNA_def_struct(brna, "BlendDataLibraries", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Libraries", "Collection of libraries");
func= RNA_def_function(srna, "tag", "rna_Main_libraries_tag");
@@ -757,6 +770,7 @@ void RNA_def_main_screens(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataScreens");
srna= RNA_def_struct(brna, "BlendDataScreens", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Screens", "Collection of screens");
func= RNA_def_function(srna, "tag", "rna_Main_screens_tag");
@@ -772,6 +786,7 @@ void RNA_def_main_window_managers(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataWindowManagers");
srna= RNA_def_struct(brna, "BlendDataWindowManagers", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Window Managers", "Collection of window managers");
func= RNA_def_function(srna, "tag", "rna_Main_window_managers_tag");
@@ -786,6 +801,7 @@ void RNA_def_main_images(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataImages");
srna= RNA_def_struct(brna, "BlendDataImages", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Images", "Collection of images");
func= RNA_def_function(srna, "new", "rna_Main_images_new");
@@ -830,6 +846,7 @@ void RNA_def_main_lattices(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataLattices");
srna= RNA_def_struct(brna, "BlendDataLattices", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Lattices", "Collection of lattices");
func= RNA_def_function(srna, "new", "rna_Main_lattices_new");
@@ -858,6 +875,7 @@ void RNA_def_main_curves(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataCurves");
srna= RNA_def_struct(brna, "BlendDataCurves", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Curves", "Collection of curves");
func= RNA_def_function(srna, "new", "rna_Main_curves_new");
@@ -888,6 +906,7 @@ void RNA_def_main_metaballs(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataMetaBalls");
srna= RNA_def_struct(brna, "BlendDataMetaBalls", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main MetaBall", "Collection of metaballs");
func= RNA_def_function(srna, "new", "rna_Main_metaballs_new");
@@ -916,6 +935,7 @@ void RNA_def_main_fonts(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataFonts");
srna= RNA_def_struct(brna, "BlendDataFonts", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Fonts", "Collection of fonts");
func= RNA_def_function(srna, "load", "rna_Main_fonts_load");
@@ -945,6 +965,7 @@ void RNA_def_main_textures(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataTextures");
srna= RNA_def_struct(brna, "BlendDataTextures", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Textures", "Collection of groups");
func= RNA_def_function(srna, "new", "rna_Main_textures_new");
@@ -975,6 +996,7 @@ void RNA_def_main_brushes(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataBrushes");
srna= RNA_def_struct(brna, "BlendDataBrushes", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Brushes", "Collection of brushes");
func= RNA_def_function(srna, "new", "rna_Main_brushes_new");
@@ -1004,6 +1026,7 @@ void RNA_def_main_worlds(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataWorlds");
srna= RNA_def_struct(brna, "BlendDataWorlds", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Worlds", "Collection of worlds");
func= RNA_def_function(srna, "new", "rna_Main_worlds_new");
@@ -1033,6 +1056,7 @@ void RNA_def_main_groups(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataGroups");
srna= RNA_def_struct(brna, "BlendDataGroups", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Groups", "Collection of groups");
func= RNA_def_function(srna, "new", "rna_Main_groups_new");
@@ -1060,6 +1084,7 @@ void RNA_def_main_texts(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataTexts");
srna= RNA_def_struct(brna, "BlendDataTexts", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Texts", "Collection of texts");
func= RNA_def_function(srna, "new", "rna_Main_texts_new");
@@ -1098,6 +1123,7 @@ void RNA_def_main_sounds(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataSounds");
srna= RNA_def_struct(brna, "BlendDataSounds", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Sounds", "Collection of sounds");
/* TODO, 'load' */
@@ -1115,6 +1141,7 @@ void RNA_def_main_armatures(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataArmatures");
srna= RNA_def_struct(brna, "BlendDataArmatures", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Armatures", "Collection of armatures");
func= RNA_def_function(srna, "new", "rna_Main_armatures_new");
@@ -1143,6 +1170,7 @@ void RNA_def_main_actions(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataActions");
srna= RNA_def_struct(brna, "BlendDataActions", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Actions", "Collection of actions");
func= RNA_def_function(srna, "new", "rna_Main_actions_new");
@@ -1171,6 +1199,7 @@ void RNA_def_main_particles(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataParticles");
srna= RNA_def_struct(brna, "BlendDataParticles", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Particle Settings", "Collection of particle settings");
func= RNA_def_function(srna, "new", "rna_Main_particles_new");
@@ -1200,6 +1229,7 @@ void RNA_def_main_gpencil(BlenderRNA *brna, PropertyRNA *cprop)
RNA_def_property_srna(cprop, "BlendDataGreasePencils");
srna= RNA_def_struct(brna, "BlendDataGreasePencils", NULL);
+ RNA_def_struct_sdna(srna, "Main");
RNA_def_struct_ui_text(srna, "Main Grease Pencils", "Collection of grease pencils");
func= RNA_def_function(srna, "tag", "rna_Main_gpencil_tag");
diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c
index 7732e9157bd..909c824074e 100644
--- a/source/blender/makesrna/intern/rna_material.c
+++ b/source/blender/makesrna/intern/rna_material.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_material.c
+ * \ingroup RNA
+ */
+
+
#include <float.h>
#include <stdlib.h>
@@ -49,6 +54,27 @@ static EnumPropertyItem prop_texture_coordinates_items[] = {
{TEXCO_TANGENT, "TANGENT", 0, "Tangent", "Uses the optional tangent vector as texture coordinates"},
{0, NULL, 0, NULL, NULL}};
+EnumPropertyItem ramp_blend_items[] = {
+{MA_RAMP_BLEND, "MIX", 0, "Mix", ""},
+{MA_RAMP_ADD, "ADD", 0, "Add", ""},
+{MA_RAMP_MULT, "MULTIPLY", 0, "Multiply", ""},
+{MA_RAMP_SUB, "SUBTRACT", 0, "Subtract", ""},
+{MA_RAMP_SCREEN, "SCREEN", 0, "Screen", ""},
+{MA_RAMP_DIV, "DIVIDE", 0, "Divide", ""},
+{MA_RAMP_DIFF, "DIFFERENCE", 0, "Difference", ""},
+{MA_RAMP_DARK, "DARKEN", 0, "Darken", ""},
+{MA_RAMP_LIGHT, "LIGHTEN", 0, "Lighten", ""},
+{MA_RAMP_OVERLAY, "OVERLAY", 0, "Overlay", ""},
+{MA_RAMP_DODGE, "DODGE", 0, "Dodge", ""},
+{MA_RAMP_BURN, "BURN", 0, "Burn", ""},
+{MA_RAMP_HUE, "HUE", 0, "Hue", ""},
+{MA_RAMP_SAT, "SATURATION", 0, "Saturation", ""},
+{MA_RAMP_VAL, "VALUE", 0, "Value", ""},
+{MA_RAMP_COLOR, "COLOR", 0, "Color", ""},
+{MA_RAMP_SOFT, "SOFT_LIGHT", 0, "Soft Light", ""},
+{MA_RAMP_LINEAR, "LINEAR_LIGHT", 0, "Linear Light", ""},
+{0, NULL, 0, NULL, NULL}};
+
#ifdef RNA_RUNTIME
#include "MEM_guardedalloc.h"
@@ -706,27 +732,6 @@ static void rna_def_material_mtex(BlenderRNA *brna)
static void rna_def_material_colors(StructRNA *srna)
{
PropertyRNA *prop;
-
- static EnumPropertyItem prop_ramp_blend_diffuse_items[] = {
- {MA_RAMP_BLEND, "MIX", 0, "Mix", ""},
- {MA_RAMP_ADD, "ADD", 0, "Add", ""},
- {MA_RAMP_MULT, "MULTIPLY", 0, "Multiply", ""},
- {MA_RAMP_SUB, "SUBTRACT", 0, "Subtract", ""},
- {MA_RAMP_SCREEN, "SCREEN", 0, "Screen", ""},
- {MA_RAMP_DIV, "DIVIDE", 0, "Divide", ""},
- {MA_RAMP_DIFF, "DIFFERENCE", 0, "Difference", ""},
- {MA_RAMP_DARK, "DARKEN", 0, "Darken", ""},
- {MA_RAMP_LIGHT, "LIGHTEN", 0, "Lighten", ""},
- {MA_RAMP_OVERLAY, "OVERLAY", 0, "Overlay", ""},
- {MA_RAMP_DODGE, "DODGE", 0, "Dodge", ""},
- {MA_RAMP_BURN, "BURN", 0, "Burn", ""},
- {MA_RAMP_HUE, "HUE", 0, "Hue", ""},
- {MA_RAMP_SAT, "SATURATION", 0, "Saturation", ""},
- {MA_RAMP_VAL, "VALUE", 0, "Value", ""},
- {MA_RAMP_COLOR, "COLOR", 0, "Color", ""},
- {MA_RAMP_SOFT, "SOFT_LIGHT", 0, "Soft Light", ""},
- {MA_RAMP_LINEAR, "LINEAR_LIGHT", 0, "Linear Light", ""},
- {0, NULL, 0, NULL, NULL}};
static EnumPropertyItem prop_ramp_input_items[] = {
{MA_RAMP_IN_SHADER, "SHADER", 0, "Shader", ""},
@@ -791,13 +796,13 @@ static void rna_def_material_colors(StructRNA *srna)
prop= RNA_def_property(srna, "diffuse_ramp_blend", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "rampblend_col");
- RNA_def_property_enum_items(prop, prop_ramp_blend_diffuse_items);
+ RNA_def_property_enum_items(prop, ramp_blend_items);
RNA_def_property_ui_text(prop, "Diffuse Ramp Blend", "");
RNA_def_property_update(prop, 0, "rna_Material_update");
prop= RNA_def_property(srna, "specular_ramp_blend", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "rampblend_spec");
- RNA_def_property_enum_items(prop, prop_ramp_blend_diffuse_items);
+ RNA_def_property_enum_items(prop, ramp_blend_items);
RNA_def_property_ui_text(prop, "Diffuse Ramp Blend", "");
RNA_def_property_update(prop, 0, "rna_Material_update");
@@ -1235,7 +1240,7 @@ static void rna_def_material_halo(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_flare_mode", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_FLARE); /* use bitflags */
- RNA_def_property_ui_text(prop, "Flare", "Renders halo as a lensflare");
+ RNA_def_property_ui_text(prop, "Flare", "Renders halo as a lens flare");
RNA_def_property_update(prop, 0, "rna_Material_update");
prop= RNA_def_property(srna, "flare_size", PROP_FLOAT, PROP_NONE);
@@ -1247,7 +1252,7 @@ static void rna_def_material_halo(BlenderRNA *brna)
prop= RNA_def_property(srna, "flare_subflare_size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "subsize");
RNA_def_property_range(prop, 0.1f, 25.0f);
- RNA_def_property_ui_text(prop, "Flare Subsize", "Sets the dimension of the subflares, dots and circles");
+ RNA_def_property_ui_text(prop, "Flare Subsize", "Sets the dimension of the sub-flares, dots and circles");
RNA_def_property_update(prop, 0, "rna_Material_update");
prop= RNA_def_property(srna, "flare_boost", PROP_FLOAT, PROP_NONE);
@@ -1265,7 +1270,7 @@ static void rna_def_material_halo(BlenderRNA *brna)
prop= RNA_def_property(srna, "flare_subflare_count", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "flarec");
RNA_def_property_range(prop, 1, 32);
- RNA_def_property_ui_text(prop, "Flares Sub", "Sets the number of subflares");
+ RNA_def_property_ui_text(prop, "Flares Sub", "Sets the number of sub-flares");
RNA_def_property_update(prop, 0, "rna_Material_update");
prop= RNA_def_property(srna, "use_ring", PROP_BOOLEAN, PROP_NONE);
@@ -1520,31 +1525,33 @@ static void rna_def_material_physics(BlenderRNA *brna)
RNA_def_struct_nested(brna, srna, "Material");
RNA_def_struct_ui_text(srna, "Material Physics", "Physics settings for a Material datablock");
- prop= RNA_def_property(srna, "use_normal_align", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "dynamode", MA_FH_NOR);
- RNA_def_property_ui_text(prop, "Align to Normal", "Align dynamic game objects along the surface normal, when inside the physics distance area");
-
prop= RNA_def_property(srna, "friction", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "friction");
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Friction", "Coulomb friction coefficient, when inside the physics distance area");
- prop= RNA_def_property(srna, "force", PROP_FLOAT, PROP_NONE);
- RNA_def_property_float_sdna(prop, NULL, "fh");
- RNA_def_property_range(prop, 0, 1);
- RNA_def_property_ui_text(prop, "Force", "Upward spring force, when inside the physics distance area");
-
prop= RNA_def_property(srna, "elasticity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "reflect");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Elasticity", "Elasticity of collisions");
+
+ /* FH/Force Field Settings */
+ prop= RNA_def_property(srna, "use_fh_normal", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "dynamode", MA_FH_NOR);
+ RNA_def_property_ui_text(prop, "Align to Normal", "Align dynamic game objects along the surface normal, when inside the physics distance area");
+
+ prop= RNA_def_property(srna, "fh_force", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "fh");
+ RNA_def_property_range(prop, 0, 1);
+ RNA_def_property_ui_range(prop, 0.0, 1.0, 10, 2);
+ RNA_def_property_ui_text(prop, "Force", "Upward spring force, when inside the physics distance area");
- prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "fh_distance", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "fhdist");
RNA_def_property_range(prop, 0, 20);
RNA_def_property_ui_text(prop, "Distance", "Distance of the physics area");
- prop= RNA_def_property(srna, "damping", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "fh_damping", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "xyfrict");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_text(prop, "Damping", "Damping of the spring force, when inside the physics distance area");
@@ -1562,6 +1569,7 @@ void RNA_def_material(BlenderRNA *brna)
{MA_TYPE_HALO, "HALO", 0, "Halo", "Render object as halo particles"},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem transparency_items[] = {
+ {0, "MASK", 0, "Mask", "Mask the background"},
{MA_ZTRANSP, "Z_TRANSPARENCY", 0, "Z Transparency", "Use alpha buffer for transparent faces"},
{MA_RAYTRANSP, "RAYTRACE", 0, "Raytrace", "Use raytracing for transparent refraction rendering"},
{0, NULL, 0, NULL, NULL}};
@@ -1576,6 +1584,12 @@ void RNA_def_material(BlenderRNA *brna)
{MA_SPHERE_A, "SPHERE_A", ICON_MAT_SPHERE_SKY, "Flat", "Preview type: Large sphere with sky"},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem prop_shadows_only_items[] = {
+ {MA_SO_OLD, "SHADOW_ONLY_OLD", 0, "Shadow and Distance", ""},
+ {MA_SO_SHADOW, "SHADOW_ONLY", 0, "Shadow Only", ""},
+ {MA_SO_SHADED, "SHADOW_ONLY_SHADED", 0, "Shadow and Shading", ""},
+ {0, NULL, 0, NULL, NULL}};
+
srna= RNA_def_struct(brna, "Material", "ID");
RNA_def_struct_ui_text(srna, "Material", "Material datablock to defined the appearance of geometric objects for rendering");
RNA_def_struct_ui_icon(srna, ICON_MATERIAL_DATA);
@@ -1706,6 +1720,12 @@ void RNA_def_material(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_ONLYSHADOW);
RNA_def_property_ui_text(prop, "Only Shadow", "Renders shadows as the material's alpha value, making materials transparent except for shadowed areas");
RNA_def_property_update(prop, 0, "rna_Material_update");
+
+ prop= RNA_def_property(srna, "shadow_only_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_bitflag_sdna(prop, NULL, "shadowonly_flag");
+ RNA_def_property_enum_items(prop, prop_shadows_only_items);
+ RNA_def_property_ui_text(prop, "Shadow Type", "How to draw shadows");
+ RNA_def_property_update(prop, 0, "rna_Material_update");
prop= RNA_def_property(srna, "use_face_texture", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_FACETEXTURE);
@@ -1729,7 +1749,7 @@ void RNA_def_material(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_transparent_shadows", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_SHADOW_TRA);
- RNA_def_property_ui_text(prop, "Receive Transparent Shadows", "Allow this object to receive transparent shadows casted through other objects");
+ RNA_def_property_ui_text(prop, "Receive Transparent Shadows", "Allow this object to receive transparent shadows cast through other objects");
RNA_def_property_update(prop, 0, "rna_Material_update");
prop= RNA_def_property(srna, "use_ray_shadow_bias", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_material_api.c b/source/blender/makesrna/intern/rna_material_api.c
index 063f87caa3a..f563f53744b 100644
--- a/source/blender/makesrna/intern/rna_material_api.c
+++ b/source/blender/makesrna/intern/rna_material_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_material_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index dd072ba99c0..babe6d9c6b0 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -26,6 +26,10 @@
getting info on the layers themselves, accessing the data is
done through the (not yet written) mpoly interfaces.*/
+/** \file blender/makesrna/intern/rna_mesh.c
+ * \ingroup RNA
+ */
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -1915,7 +1919,7 @@ static void rna_def_mesh(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_mirror_topology", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "editflag", ME_EDIT_MIRROR_TOPO);
- RNA_def_property_ui_text(prop, "Topology Mirror", "Use topology based mirroring");
+ RNA_def_property_ui_text(prop, "Topology Mirror", "Use topology based mirroring. For when both sides of mesh have matching, unique topology");
prop= RNA_def_property(srna, "use_paint_mask", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "editflag", ME_EDIT_PAINT_MASK);
diff --git a/source/blender/makesrna/intern/rna_mesh_api.c b/source/blender/makesrna/intern/rna_mesh_api.c
index f6c9405dc78..8912a576710 100644
--- a/source/blender/makesrna/intern/rna_mesh_api.c
+++ b/source/blender/makesrna/intern/rna_mesh_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_mesh_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/makesrna/intern/rna_meta.c b/source/blender/makesrna/intern/rna_meta.c
index e575ecabac9..d94fa130163 100644
--- a/source/blender/makesrna/intern/rna_meta.c
+++ b/source/blender/makesrna/intern/rna_meta.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_meta.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -232,8 +237,8 @@ static void rna_def_metaball_elements(BlenderRNA *brna, PropertyRNA *cprop)
func= RNA_def_function(srna, "new", "rna_MetaBall_elements_new");
RNA_def_function_ui_description(func, "Add a new spline to the curve.");
- RNA_def_enum(func, "type", metaelem_type_items, MB_BALL, "", "type for the new meta element.");
- parm= RNA_def_pointer(func, "element", "MetaElement", "", "The newly created metaelement.");
+ RNA_def_enum(func, "type", metaelem_type_items, MB_BALL, "", "type for the new meta-element.");
+ parm= RNA_def_pointer(func, "element", "MetaElement", "", "The newly created meta-element.");
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "remove", "rna_MetaBall_elements_remove");
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index f37598743c1..d04d24f35f2 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_modifier.c
+ * \ingroup RNA
+ */
+
+
#include <float.h>
#include <limits.h>
#include <stdlib.h>
@@ -435,9 +440,12 @@ static void modifier_object_set(Object *self, Object **ob_p, int type, PointerRN
{
Object *ob= value.data;
- if(!self || ob != self)
- if(!ob || type == OB_EMPTY || ob->type == type)
+ if(!self || ob != self) {
+ if(!ob || type == OB_EMPTY || ob->type == type) {
+ id_lib_extern((ID *)ob);
*ob_p= ob;
+ }
+ }
}
static void rna_LatticeModifier_object_set(PointerRNA *ptr, PointerRNA value)
@@ -795,7 +803,7 @@ static void rna_def_modifier_mirror(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_mirror_merge", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "flag", MOD_MIR_NO_MERGE);
- RNA_def_property_ui_text(prop, "Merge Verticies", "Merge vertices within the merge threshold");
+ RNA_def_property_ui_text(prop, "Merge Vertices", "Merge vertices within the merge threshold");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "use_mirror_u", PROP_BOOLEAN, PROP_NONE);
@@ -1124,7 +1132,7 @@ static void rna_def_modifier_boolean(BlenderRNA *brna)
prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
RNA_def_property_ui_text(prop, "Object", "Mesh object to use for Boolean operation");
- RNA_def_property_pointer_funcs(prop, NULL, "rna_BooleanModifier_object_set", NULL, NULL);
+ RNA_def_property_pointer_funcs(prop, NULL, "rna_BooleanModifier_object_set", NULL, "rna_Mesh_object_poll");
RNA_def_property_flag(prop, PROP_EDITABLE|PROP_ID_SELF_CHECK);
RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
@@ -2160,6 +2168,18 @@ static void rna_def_modifier_solidify(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Rim Crease", "Assign a crease to the edges making up the rim");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
+ prop= RNA_def_property(srna, "material_offset", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "mat_ofs");
+ RNA_def_property_range(prop, SHRT_MIN, SHRT_MAX);
+ RNA_def_property_ui_text(prop, "Material Offset", "Offset material index of generated faces");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
+ prop= RNA_def_property(srna, "material_offset_rim", PROP_INT, PROP_NONE);
+ RNA_def_property_int_sdna(prop, NULL, "mat_ofs_rim");
+ RNA_def_property_range(prop, SHRT_MIN, SHRT_MAX);
+ RNA_def_property_ui_text(prop, "Rim Material Offset", "Offset material index of generated rim faces");
+ RNA_def_property_update(prop, 0, "rna_Modifier_update");
+
prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "defgrp_name");
RNA_def_property_ui_text(prop, "Vertex Group", "Vertex group name");
@@ -2170,11 +2190,6 @@ static void rna_def_modifier_solidify(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_RIM);
RNA_def_property_ui_text(prop, "Fill Rim", "Create edge loops between the inner and outer surfaces on face edges (slow, disable when not needed)");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
-
- prop= RNA_def_property(srna, "use_rim_material", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_RIM_MATERIAL);
- RNA_def_property_ui_text(prop, "Rim Material", "Use in the next material for rim faces");
- RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop= RNA_def_property(srna, "use_even_offset", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_SOLIDIFY_EVEN);
diff --git a/source/blender/makesrna/intern/rna_nla.c b/source/blender/makesrna/intern/rna_nla.c
index d63fd39a728..5fba18bb6cd 100644
--- a/source/blender/makesrna/intern/rna_nla.c
+++ b/source/blender/makesrna/intern/rna_nla.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_nla.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -158,7 +163,7 @@ static void rna_NlaStrip_end_frame_set(PointerRNA *ptr, float value)
len= data->end - data->start;
actlen= data->actend - data->actstart;
- if (IS_EQ(actlen, 0.0f)) actlen= 1.0f;
+ if (IS_EQF(actlen, 0.0f)) actlen= 1.0f;
/* now, adjust the 'scale' setting to reflect this (so that this change can be valid) */
data->scale= len / ((actlen) * data->repeat);
@@ -291,7 +296,7 @@ static NlaStrip *rna_NlaStrip_new(NlaTrack *track, bContext *C, ReportList *repo
* - only the nla_tracks list is needed there, which we aim to reverse engineer here...
*/
{
- AnimData adt = {0};
+ AnimData adt = {NULL};
NlaTrack *nlt, *nlt_p;
/* 'first' NLA track is found by going back up chain of given track's parents until we fall off */
@@ -332,9 +337,9 @@ static void rna_NlaStrip_remove(NlaTrack *track, bContext *C, ReportList *report
/* enum defines exported for rna_animation.c */
EnumPropertyItem nla_mode_blend_items[] = {
{NLASTRIP_MODE_REPLACE, "REPLACE", 0, "Replace", "Result strip replaces the accumulated results by amount specified by influence"},
- {NLASTRIP_MODE_ADD, "ADD", 0, "Add", "Weighted result of strip is added to the accumlated results"},
- {NLASTRIP_MODE_SUBTRACT, "SUBTRACT", 0, "Subtract", "Weighted result of strip is removed from the accumlated results"},
- {NLASTRIP_MODE_MULTIPLY, "MULITPLY", 0, "Multiply", "Weighted result of strip is multiplied with the accumlated results"},
+ {NLASTRIP_MODE_ADD, "ADD", 0, "Add", "Weighted result of strip is added to the accumulated results"},
+ {NLASTRIP_MODE_SUBTRACT, "SUBTRACT", 0, "Subtract", "Weighted result of strip is removed from the accumulated results"},
+ {NLASTRIP_MODE_MULTIPLY, "MULITPLY", 0, "Multiply", "Weighted result of strip is multiplied with the accumulated results"},
{0, NULL, 0, NULL, NULL}};
EnumPropertyItem nla_mode_extend_items[] = {
{NLASTRIP_EXTEND_NOTHING, "NOTHING", 0, "Nothing", "Strip has no influence past its extents"},
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index a526f360355..0dd536b64c2 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -22,10 +22,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_nodetree.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <string.h>
#include "RNA_define.h"
+#include "RNA_enum_types.h"
#include "rna_internal.h"
@@ -54,27 +60,6 @@ EnumPropertyItem node_socket_type_items[] = {
{SOCK_RGBA, "RGBA", 0, "RGBA", ""},
{0, NULL, 0, NULL, NULL}};
-EnumPropertyItem node_blend_type_items[] = {
-{ 0, "MIX", 0, "Mix", ""},
-{ 1, "ADD", 0, "Add", ""},
-{ 3, "SUBTRACT", 0, "Subtract", ""},
-{ 2, "MULTIPLY", 0, "Multiply", ""},
-{ 4, "SCREEN", 0, "Screen", ""},
-{ 9, "OVERLAY", 0, "Overlay", ""},
-{ 5, "DIVIDE", 0, "Divide", ""},
-{ 6, "DIFFERENCE", 0, "Difference", ""},
-{ 7, "DARKEN", 0, "Darken", ""},
-{ 8, "LIGHTEN", 0, "Lighten", ""},
-{10, "DODGE", 0, "Dodge", ""},
-{11, "BURN", 0, "Burn", ""},
-{15, "COLOR", 0, "Color", ""},
-{14, "VALUE", 0, "Value", ""},
-{13, "SATURATION", 0, "Saturation", ""},
-{12, "HUE", 0, "Hue", ""},
-{16, "SOFT_LIGHT", 0, "Soft Light", ""},
-{17, "LINEAR_LIGHT", 0, "Linear Light",""},
-{0, NULL, 0, NULL, NULL}};
-
EnumPropertyItem node_math_items[] = {
{ 0, "ADD", 0, "Add", ""},
{ 1, "SUBTRACT", 0, "Subtract", ""},
@@ -312,55 +297,6 @@ static void rna_Node_name_set(PointerRNA *ptr, const char *value)
BKE_all_animdata_fix_paths_rename("nodes", oldname, node->name);
}
-/* this should be done at display time! if no custom names are set */
-#if 0
-static void rna_Node_update_username(Main *bmain, Scene *scene, PointerRNA *ptr)
-{
- bNode *node= (bNode*)ptr->data;
- const char *name;
-
-
- /*
- if (!node->username[0]) {
- if(node->id) {
- BLI_strncpy(node->username, node->id->name+2, NODE_MAXSTR);
- }
- else {
-
- switch(node->typeinfo->type) {
- case SH_NODE_MIX_RGB:
- case CMP_NODE_MIX_RGB:
- case TEX_NODE_MIX_RGB:
- if(RNA_enum_name(node_blend_type_items, node->custom1, &name))
- BLI_strncpy(node->username, name, NODE_MAXSTR);
- break;
- case CMP_NODE_FILTER:
- if(RNA_enum_name(node_filter_items, node->custom1, &name))
- BLI_strncpy(node->username, name, NODE_MAXSTR);
- break;
- case CMP_NODE_FLIP:
- if(RNA_enum_name(node_flip_items, node->custom1, &name))
- BLI_strncpy(node->username, name, NODE_MAXSTR);
- break;
- case SH_NODE_MATH:
- case CMP_NODE_MATH:
- case TEX_NODE_MATH:
- if(RNA_enum_name(node_math_items, node->custom1, &name))
- BLI_strncpy(node->username, name, NODE_MAXSTR);
- break;
- case SH_NODE_VECT_MATH:
- if(RNA_enum_name(node_vec_math_items, node->custom1, &name))
- BLI_strncpy(node->username, name, NODE_MAXSTR);
- break;
- }
- */
- }
- }
-
- rna_Node_update(bmain, scene, ptr);
-}
-#endif
-
static void rna_NodeSocket_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
bNodeTree *ntree= (bNodeTree*)ptr->id.data;
@@ -596,15 +532,14 @@ static void rna_NodeTree_node_remove(bNodeTree *ntree, ReportList *reports, bNod
static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, bNodeSocket *in, bNodeSocket *out)
{
bNodeLink *ret;
- bNode *fromnode, *tonode;
-
- if (!nodeFindNode(ntree, in, &fromnode, NULL, NULL)) {
- BKE_reportf(reports, RPT_ERROR, "Unable to locate input socket's node in nodetree");
- return NULL;
- }
+ bNode *fromnode= NULL, *tonode= NULL;
+ int from_in_out, to_in_out;
- if (!nodeFindNode(ntree, out, &tonode, NULL, NULL)) {
- BKE_reportf(reports, RPT_ERROR, "Unable to locate output socket's node in nodetree");
+ nodeFindNode(ntree, in, &fromnode, NULL, &from_in_out);
+ nodeFindNode(ntree, out, &tonode, NULL, &to_in_out);
+
+ if (&from_in_out == &to_in_out) {
+ BKE_reportf(reports, RPT_ERROR, "Same input/output direction of sockets");
return NULL;
}
@@ -941,7 +876,7 @@ static void def_mix_rgb(StructRNA *srna)
prop = RNA_def_property(srna, "blend_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "custom1");
- RNA_def_property_enum_items(prop, node_blend_type_items);
+ RNA_def_property_enum_items(prop, ramp_blend_items);
RNA_def_property_ui_text(prop, "Blend Type", "");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -1279,7 +1214,7 @@ static void def_cmp_vector_blur(StructRNA *srna)
prop = RNA_def_property(srna, "use_curved", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "curved", 1);
- RNA_def_property_ui_text(prop, "Curved", "Interpolate between frames in a bezier curve, rather than linearly");
+ RNA_def_property_ui_text(prop, "Curved", "Interpolate between frames in a Bezier curve, rather than linearly");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
}
@@ -1612,7 +1547,7 @@ static void def_cmp_color_spill(StructRNA *srna)
prop = RNA_def_property(srna, "use_unspill", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "unspill", 0);
- RNA_def_property_ui_text(prop, "Unspill", "Compensate all channels (diffenrently) by hand");
+ RNA_def_property_ui_text(prop, "Unspill", "Compensate all channels (differently) by hand");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "unspill_red", PROP_FLOAT, PROP_NONE);
@@ -1874,13 +1809,13 @@ static void def_cmp_defocus(StructRNA *srna)
prop = RNA_def_property(srna, "use_zbuffer", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_negative_sdna(prop, NULL, "no_zbuf", 1);
- RNA_def_property_ui_text(prop, "Use Z-Buffer", "Disable when using an image as input instead of actual zbuffer (auto enabled if node not image based, eg. time node)");
+ RNA_def_property_ui_text(prop, "Use Z-Buffer", "Disable when using an image as input instead of actual z-buffer (auto enabled if node not image based, eg. time node)");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "z_scale", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "scale");
RNA_def_property_range(prop, 0.0f, 1000.0f);
- RNA_def_property_ui_text(prop, "Z-Scale", "Scales the Z input when not using a zbuffer, controls maximum blur designated by the color white or input value 1");
+ RNA_def_property_ui_text(prop, "Z-Scale", "Scales the Z input when not using a z-buffer, controls maximum blur designated by the color white or input value 1");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
}
@@ -2680,7 +2615,7 @@ static void rna_def_node(BlenderRNA *brna)
RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
- RNA_def_property_ui_text(prop, "Name", "Node name");
+ RNA_def_property_ui_text(prop, "Name", "Unique node identifier");
RNA_def_struct_name_property(srna, prop);
RNA_def_property_string_funcs(prop, NULL, NULL, "rna_Node_name_set");
RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_update");
@@ -2694,6 +2629,11 @@ static void rna_def_node(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "outputs", NULL);
RNA_def_property_struct_type(prop, "NodeSocket");
RNA_def_property_ui_text(prop, "Outputs", "");
+
+ prop = RNA_def_property(srna, "label", PROP_STRING, PROP_NONE);
+ RNA_def_property_string_sdna(prop, NULL, "label");
+ RNA_def_property_ui_text(prop, "Label", "Optional custom node label");
+ RNA_def_property_update(prop, NC_NODE, "rna_Node_update");
}
static void rna_def_node_link(BlenderRNA *brna)
diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h
index 0dd622924fc..d48df85697a 100644
--- a/source/blender/makesrna/intern/rna_nodetree_types.h
+++ b/source/blender/makesrna/intern/rna_nodetree_types.h
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/makesrna/intern/rna_nodetree_types.h
+ * \ingroup RNA
+ */
+
/* Tree type Node ID RNA def function Enum name Struct name UI Name UI Description */
DefNode( ShaderNode, SH_NODE_OUTPUT, 0, "OUTPUT", Output, "Output", "" )
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 48054604a25..b73c447e860 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_object.c
+ * \ingroup RNA
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
@@ -1301,7 +1306,7 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
PropertyRNA *prop;
static EnumPropertyItem body_type_items[] = {
- {OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", "Disable colision for this object"},
+ {OB_BODY_TYPE_NO_COLLISION, "NO_COLLISION", 0, "No Collision", "Disable collision for this object"},
{OB_BODY_TYPE_STATIC, "STATIC", 0, "Static", "Stationary object"},
{OB_BODY_TYPE_DYNAMIC, "DYNAMIC", 0, "Dynamic", "Linear physics"},
{OB_BODY_TYPE_RIGID, "RIGID_BODY", 0, "Rigid Body", "Linear and angular physics"},
@@ -1431,9 +1436,9 @@ static void rna_def_object_game_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Lock Z Rotation Axis", "Disable simulation of angular motion along the Z axis");
- prop= RNA_def_property(srna, "use_material_physics", PROP_BOOLEAN, PROP_NONE);
+ prop= RNA_def_property(srna, "use_material_physics_fh", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_DO_FH);
- RNA_def_property_ui_text(prop, "Use Material Physics", "Use physics settings in materials");
+ RNA_def_property_ui_text(prop, "Use Material Force Field", "React to force field physics settings in materials");
prop= RNA_def_property(srna, "use_rotate_from_normal", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ROT_FH);
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index f2e12c91c49..2a369ba9044 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_object_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -34,6 +39,7 @@
#include "RNA_define.h"
#include "DNA_object_types.h"
+#include "DNA_modifier_types.h"
// #include "BLO_sys_types.h" /* needed for intptr_t used in ED_mesh.h */
@@ -72,12 +78,12 @@
/* copied from Mesh_getFromObject and adapted to RNA interface */
/* settings: 0 - preview, 1 - render */
-static Mesh *rna_Object_create_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_modifiers, int settings)
+static Mesh *rna_Object_to_mesh(Object *ob, ReportList *reports, Scene *sce, int apply_modifiers, int settings)
{
Mesh *tmpmesh;
Curve *tmpcu = NULL;
Object *tmpobj = NULL;
- int render = settings, i;
+ int render = settings == eModifierMode_Render, i;
int cage = !apply_modifiers;
/* perform the mesh extraction based on type */
@@ -372,7 +378,7 @@ static void rna_Mesh_assign_verts_to_group(Object *ob, bDeformGroup *group, int
void rna_Object_ray_cast(Object *ob, ReportList *reports, float ray_start[3], float ray_end[3], float r_location[3], float r_normal[3], int *index)
{
- BVHTreeFromMesh treeData= {0};
+ BVHTreeFromMesh treeData= {NULL};
if(ob->derivedFinal==NULL) {
BKE_reportf(reports, RPT_ERROR, "object \"%s\" has no mesh data to be used for ray casting.", ob->id.name+2);
@@ -416,6 +422,11 @@ void rna_ObjectBase_layers_from_view(Base *base, View3D *v3d)
base->lay= base->object->lay= v3d->lay;
}
+int rna_Object_is_modified(Object *ob, Scene *scene, int settings)
+{
+ return object_is_modified(scene, ob) & settings;
+}
+
#else
void RNA_api_object(StructRNA *srna)
@@ -424,13 +435,13 @@ void RNA_api_object(StructRNA *srna)
PropertyRNA *parm;
static EnumPropertyItem mesh_type_items[] = {
- {0, "PREVIEW", 0, "Preview", "Apply modifier preview settings"},
- {1, "RENDER", 0, "Render", "Apply modifier render settings"},
+ {eModifierMode_Realtime, "PREVIEW", 0, "Preview", "Apply modifier preview settings"},
+ {eModifierMode_Render, "RENDER", 0, "Render", "Apply modifier render settings"},
{0, NULL, 0, NULL, NULL}
};
/* mesh */
- func= RNA_def_function(srna, "create_mesh", "rna_Object_create_mesh");
+ func= RNA_def_function(srna, "to_mesh", "rna_Object_to_mesh");
RNA_def_function_ui_description(func, "Create a Mesh datablock with modifiers applied.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene within which to evaluate modifiers.");
@@ -443,13 +454,13 @@ void RNA_api_object(StructRNA *srna)
RNA_def_function_return(func, parm);
/* duplis */
- func= RNA_def_function(srna, "create_dupli_list", "rna_Object_create_duplilist");
+ func= RNA_def_function(srna, "dupli_list_create", "rna_Object_create_duplilist");
RNA_def_function_ui_description(func, "Create a list of dupli objects for this object, needs to be freed manually with free_dupli_list to restore the objects real matrix and layers.");
parm= RNA_def_pointer(func, "scene", "Scene", "", "Scene within which to evaluate duplis.");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- func= RNA_def_function(srna, "free_dupli_list", "rna_Object_free_duplilist");
+ func= RNA_def_function(srna, "dupli_list_clear", "rna_Object_free_duplilist");
RNA_def_function_ui_description(func, "Free the list of dupli objects.");
/* Armature */
@@ -495,7 +506,17 @@ void RNA_api_object(StructRNA *srna)
RNA_def_function_ui_description(func, "Determine if object is visible in a given scene.");
parm= RNA_def_pointer(func, "scene", "Scene", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
- parm= RNA_def_boolean(func, "is_visible", 0, "", "Object visibility.");
+ parm= RNA_def_boolean(func, "result", 0, "", "Object visibility.");
+ RNA_def_function_return(func, parm);
+
+ /* utility function for checking if the object is modified */
+ func= RNA_def_function(srna, "is_modified", "rna_Object_is_modified");
+ RNA_def_function_ui_description(func, "Determine if this object is modified from the base mesh data.");
+ parm= RNA_def_pointer(func, "scene", "Scene", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+ parm= RNA_def_enum(func, "settings", mesh_type_items, 0, "", "Modifier settings to apply.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ parm= RNA_def_boolean(func, "result", 0, "", "Object visibility.");
RNA_def_function_return(func, parm);
}
diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c
index fe69fefa879..9aedcab1301 100644
--- a/source/blender/makesrna/intern/rna_object_force.c
+++ b/source/blender/makesrna/intern/rna_object_force.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_object_force.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -472,12 +477,12 @@ static void rna_FieldSettings_update(Main *bmain, Scene *scene, PointerRNA *ptr)
if(part->pd->forcefield != PFIELD_TEXTURE && part->pd->tex) {
part->pd->tex->id.us--;
- part->pd->tex= 0;
+ part->pd->tex= NULL;
}
if(part->pd2->forcefield != PFIELD_TEXTURE && part->pd2->tex) {
part->pd2->tex->id.us--;
- part->pd2->tex= 0;
+ part->pd2->tex= NULL;
}
DAG_id_tag_update(&part->id, OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME|PSYS_RECALC_RESET);
@@ -489,7 +494,7 @@ static void rna_FieldSettings_update(Main *bmain, Scene *scene, PointerRNA *ptr)
if(ob->pd->forcefield != PFIELD_TEXTURE && ob->pd->tex) {
ob->pd->tex->id.us--;
- ob->pd->tex= 0;
+ ob->pd->tex= NULL;
}
DAG_id_tag_update(&ob->id, OB_RECALC_OB);
@@ -1653,7 +1658,7 @@ static void rna_def_softbody(BlenderRNA *brna)
prop= RNA_def_property(srna, "fuzzy", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "fuzzyness");
RNA_def_property_range(prop, 1, 100);
- RNA_def_property_ui_text(prop, "Fuzzy", "Fuzziness while on collision, high values make collsion handling faster but less stable");
+ RNA_def_property_ui_text(prop, "Fuzzy", "Fuzziness while on collision, high values make collision handling faster but less stable");
RNA_def_property_update(prop, 0, "rna_softbody_update");
prop= RNA_def_property(srna, "use_auto_step", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_packedfile.c b/source/blender/makesrna/intern/rna_packedfile.c
index 2effc616e53..b414ce8ac09 100644
--- a/source/blender/makesrna/intern/rna_packedfile.c
+++ b/source/blender/makesrna/intern/rna_packedfile.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_packedfile.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index 2a4e018b741..fe164cbd3c1 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_particle.c
+ * \ingroup RNA
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
@@ -32,6 +37,7 @@
#include "rna_internal.h"
#include "DNA_material_types.h"
+#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h"
#include "DNA_cloth_types.h"
#include "DNA_particle_types.h"
@@ -55,7 +61,19 @@ EnumPropertyItem part_reactor_from_items[] = {
{PART_FROM_VERT, "VERT", 0, "Verts", ""},
{PART_FROM_FACE, "FACE", 0, "Faces", ""},
{PART_FROM_VOLUME, "VOLUME", 0, "Volume", ""},
- {PART_FROM_PARTICLE, "PARTICLE", 0, "Particle", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+EnumPropertyItem part_dist_items[] = {
+ {PART_DISTR_JIT, "JIT", 0, "Jittered", ""},
+ {PART_DISTR_RAND, "RAND", 0, "Random", ""},
+ {PART_DISTR_GRID, "GRID", 0, "Grid", ""},
+ {0, NULL, 0, NULL, NULL}
+};
+
+EnumPropertyItem part_hair_dist_items[] = {
+ {PART_DISTR_JIT, "JIT", 0, "Jittered", ""},
+ {PART_DISTR_RAND, "RAND", 0, "Random", ""},
{0, NULL, 0, NULL, NULL}
};
@@ -104,6 +122,8 @@ EnumPropertyItem part_hair_ren_as_items[] = {
#include "BKE_cloth.h"
#include "BKE_deform.h"
#include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_cdderivedmesh.h"
#include "BKE_effect.h"
#include "BKE_modifier.h"
#include "BKE_particle.h"
@@ -163,10 +183,18 @@ static void rna_ParticleHairKey_location_object_get(PointerRNA *ptr, float *valu
rna_ParticleHairKey_location_object_info(ptr, &psmd, &pa);
if(pa) {
- float hairmat[4][4];
- psys_mat_hair_to_object(ob, psmd->dm, psmd->psys->part->from, pa, hairmat);
- copy_v3_v3(values, hkey->co);
- mul_m4_v3(hairmat, values);
+ DerivedMesh *hairdm = (psmd->psys->flag & PSYS_HAIR_DYNAMICS) ? psmd->psys->hair_out_dm : NULL;
+
+ if(hairdm) {
+ MVert *mvert = CDDM_get_vert(hairdm, pa->hair_index + (hkey - pa->hair));
+ copy_v3_v3(values, mvert->co);
+ }
+ else {
+ float hairmat[4][4];
+ psys_mat_hair_to_object(ob, psmd->dm, psmd->psys->part->from, pa, hairmat);
+ copy_v3_v3(values, hkey->co);
+ mul_m4_v3(hairmat, values);
+ }
}
else {
zero_v3(values);
@@ -183,13 +211,21 @@ static void rna_ParticleHairKey_location_object_set(PointerRNA *ptr, const float
rna_ParticleHairKey_location_object_info(ptr, &psmd, &pa);
if(pa) {
- float hairmat[4][4];
- float imat[4][4];
+ DerivedMesh *hairdm = (psmd->psys->flag & PSYS_HAIR_DYNAMICS) ? psmd->psys->hair_out_dm : NULL;
- psys_mat_hair_to_object(ob, psmd->dm, psmd->psys->part->from, pa, hairmat);
- invert_m4_m4(imat, hairmat);
- copy_v3_v3(hkey->co, values);
- mul_m4_v3(imat, hkey->co);
+ if(hairdm) {
+ MVert *mvert = CDDM_get_vert(hairdm, pa->hair_index + (hkey - pa->hair));
+ copy_v3_v3(mvert->co, values);
+ }
+ else {
+ float hairmat[4][4];
+ float imat[4][4];
+
+ psys_mat_hair_to_object(ob, psmd->dm, psmd->psys->part->from, pa, hairmat);
+ invert_m4_m4(imat, hairmat);
+ copy_v3_v3(hkey->co, values);
+ mul_m4_v3(imat, hkey->co);
+ }
}
else {
zero_v3(hkey->co);
@@ -390,6 +426,20 @@ static void rna_PartSettings_end_set(struct PointerRNA *ptr, float value)
settings->end = value;
}
+static void rna_PartSetings_timestep_set(struct PointerRNA *ptr, float value)
+{
+ ParticleSettings *settings = (ParticleSettings*)ptr->data;
+
+ settings->timetweak = value/0.04f;
+}
+
+static float rna_PartSettings_timestep_get(struct PointerRNA *ptr)
+{
+ ParticleSettings *settings = (ParticleSettings*)ptr->data;
+
+ return settings->timetweak * 0.04f;
+}
+
static void rna_PartSetting_hairlength_set(struct PointerRNA *ptr, float value)
{
ParticleSettings *settings = (ParticleSettings*)ptr->data;
@@ -419,7 +469,7 @@ static void rna_PartSetting_pathstartend_range(PointerRNA *ptr, float *min, floa
if(settings->type==PART_HAIR) {
*min = 0.0f;
- *max = (settings->draw & PART_ABS_PATH_TIME) ? 100.0f : 1.0;
+ *max = (settings->draw & PART_ABS_PATH_TIME) ? 100.0f : 1.0f;
}
else {
*min = (settings->draw & PART_ABS_PATH_TIME) ? settings->sta : 0.0f;
@@ -660,6 +710,16 @@ static EnumPropertyItem *rna_Particle_from_itemf(bContext *C, PointerRNA *ptr, i
return part_from_items;
}
+static EnumPropertyItem *rna_Particle_dist_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+ ParticleSettings *part = ptr->id.data;
+
+ if(part->type==PART_HAIR)
+ return part_hair_dist_items;
+ else
+ return part_dist_items;
+}
+
static EnumPropertyItem *rna_Particle_draw_as_itemf(bContext *C, PointerRNA *ptr, int *free)
{
ParticleSettings *part = ptr->id.data;
@@ -865,7 +925,7 @@ static void rna_def_particle_key(BlenderRNA *brna)
prop= RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_QUATERNION);
RNA_def_property_float_sdna(prop, NULL, "rot");
- RNA_def_property_ui_text(prop, "Rotation", "Key rotation quaterion");
+ RNA_def_property_ui_text(prop, "Rotation", "Key rotation quaternion");
prop= RNA_def_property(srna, "angular_velocity", PROP_FLOAT, PROP_VELOCITY);
RNA_def_property_float_sdna(prop, NULL, "ave");
@@ -944,12 +1004,12 @@ static void rna_def_particle(BlenderRNA *brna)
/* Hair & Keyed Keys */
- prop= RNA_def_property(srna, "hair", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "hair_keys", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "hair", "totkey");
RNA_def_property_struct_type(prop, "ParticleHairKey");
RNA_def_property_ui_text(prop, "Hair", "");
- prop= RNA_def_property(srna, "keys", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "particle_keys", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "keys", "totkey");
RNA_def_property_struct_type(prop, "ParticleKey");
RNA_def_property_ui_text(prop, "Keyed States", "");
@@ -1046,10 +1106,9 @@ static void rna_def_fluid_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Interaction Radius", "Fluid interaction radius");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- /* Hidden in ui to give a little easier user experience. */
prop= RNA_def_property(srna, "rest_length", PROP_FLOAT, PROP_NONE);
- RNA_def_property_range(prop, 0.0f, 1.0f);
- RNA_def_property_ui_text(prop, "Rest Length", "Spring rest length (factor of interaction radius)");
+ RNA_def_property_range(prop, 0.0f, 2.0f);
+ RNA_def_property_ui_text(prop, "Rest Length", "Spring rest length (factor of particle radius)");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "use_viscoelastic_springs", PROP_BOOLEAN, PROP_NONE);
@@ -1059,12 +1118,12 @@ static void rna_def_fluid_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_initial_rest_length", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_CURRENT_REST_LENGTH);
- RNA_def_property_ui_text(prop, "Initial Rest Length", "Use the initial length as spring rest length instead of interaction radius/2");
+ RNA_def_property_ui_text(prop, "Initial Rest Length", "Use the initial length as spring rest length instead of 2 * particle size");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "plasticity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "plasticity_constant");
- RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_text(prop, "Plasticity", "How much the spring rest length can change after the elastic limit is crossed");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -1073,6 +1132,11 @@ static void rna_def_fluid_settings(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Elastic Limit", "How much the spring has to be stretched/compressed in order to change it's rest length");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "spring_frames", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_text(prop, "Spring Frames", "Create springs for this number of frames since particles birth (0 is always)");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Viscosity */
prop= RNA_def_property(srna, "linear_viscosity", PROP_FLOAT, PROP_NONE);
@@ -1082,42 +1146,69 @@ static void rna_def_fluid_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Viscosity", "Linear viscosity");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "square_viscosity", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "stiff_viscosity", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "viscosity_beta");
RNA_def_property_range(prop, 0.0f, 100.0f);
- RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
- RNA_def_property_ui_text(prop, "Square viscosity", "Square viscosity");
+ RNA_def_property_ui_range(prop, 0.0f, 2.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Stiff viscosity", "Creates viscosity for expanding fluid)");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Double density relaxation */
- prop= RNA_def_property(srna, "density_force", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "stiffness", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "stiffness_k");
RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
- RNA_def_property_ui_text(prop, "Density Force", "How strongly the fluid tends to rest density");
+ RNA_def_property_ui_text(prop, "Stiffness", "How incompressible the fluid is");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
- prop= RNA_def_property(srna, "repulsion_force", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "repulsion", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "stiffness_knear");
RNA_def_property_range(prop, 0.0f, 100.0f);
- RNA_def_property_ui_range(prop, 0.0f, 10.0f, 1, 3);
- RNA_def_property_ui_text(prop, "Repulsion", "How strongly the fluid tries to keep from clustering");
+ RNA_def_property_ui_range(prop, 0.0f, 2.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Repulsion Factor", "How strongly the fluid tries to keep from clustering (factor of stiffness)");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "rest_density", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "rest_density");
- RNA_def_property_range(prop, 0.0f, 1000.0f);
- RNA_def_property_ui_range(prop, 0.0f, 100.0f, 1, 3);
- RNA_def_property_ui_text(prop, "Rest Density", "Rest density of the fluid");
+ RNA_def_property_range(prop, 0.0f, 100.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 2.0f, 1, 3);
+ RNA_def_property_ui_text(prop, "Rest Density", "Fluid rest density");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Buoyancy */
prop= RNA_def_property(srna, "buoyancy", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "buoyancy");
- RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_range(prop, 0.0f, 10.0f);
+ RNA_def_property_ui_range(prop, 0.0f, 1.0f, 1, 3);
RNA_def_property_ui_text(prop, "Buoyancy", "Artificial buoyancy force in negative gravity direction based on pressure differences inside the fluid");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ /* Factor flags */
+ prop= RNA_def_property(srna, "factor_repulsion", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_FAC_REPULSION);
+ RNA_def_property_ui_text(prop, "Factor Repulsion", "Repulsion is a factor of stiffness");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "factor_density", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_FAC_DENSITY);
+ RNA_def_property_ui_text(prop, "Factor Density", "Density is calculated as a factor of default density (depends on particle size)");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "factor_radius", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_FAC_RADIUS);
+ RNA_def_property_ui_text(prop, "Factor Radius", "Interaction radius is a factor of 4 * particle size");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "factor_stiff_viscosity", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_FAC_VISCOSITY);
+ RNA_def_property_ui_text(prop, "Factor Stiff Viscosity", "Stiff viscosity is a factor of normal viscosity");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "factor_rest_length", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "flag", SPH_FAC_REST_LENGTH);
+ RNA_def_property_ui_text(prop, "Factor Rest Length", "Spring rest length is a factor of 2 * particle size");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
}
static void rna_def_particle_settings_mtex(BlenderRNA *brna)
@@ -1356,13 +1447,6 @@ static void rna_def_particle_settings(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}
};
- static EnumPropertyItem dist_items[] = {
- {PART_DISTR_JIT, "JIT", 0, "Jittered", ""},
- {PART_DISTR_RAND, "RAND", 0, "Random", ""},
- {PART_DISTR_GRID, "GRID", 0, "Grid", ""},
- {0, NULL, 0, NULL, NULL}
- };
-
static EnumPropertyItem phys_type_items[] = {
{PART_PHYS_NO, "NO", 0, "No", ""},
{PART_PHYS_NEWTON, "NEWTON", 0, "Newtonian", ""},
@@ -1463,6 +1547,14 @@ static void rna_def_particle_settings(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}
};
+ static EnumPropertyItem draw_col_items[] = {
+ {PART_DRAW_COL_NONE, "NONE", 0, "None", ""},
+ {PART_DRAW_COL_MAT, "MATERIAL", 0, "Material", ""},
+ {PART_DRAW_COL_VEL, "VELOCITY", 0, "Velocity", ""},
+ {PART_DRAW_COL_ACC, "ACCELERATION", 0, "Acceleration", ""},
+ {0, NULL, 0, NULL, NULL}
+ };
+
srna= RNA_def_struct(brna, "ParticleSettings", "ID");
RNA_def_struct_ui_text(srna, "Particle Settings", "Particle settings, reusable by multiple particle systems");
RNA_def_struct_ui_icon(srna, ICON_PARTICLE_DATA);
@@ -1604,7 +1696,9 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "distribution", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "distr");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_enum_items(prop, dist_items);
+ RNA_def_property_enum_items(prop, part_dist_items);
+ RNA_def_property_enum_items(prop, part_draw_as_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_Particle_dist_itemf");
RNA_def_property_ui_text(prop, "Distribution", "How to distribute particles on selected element");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
@@ -1703,11 +1797,6 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Speed", "Multiply line length by particle speed");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
- prop= RNA_def_property(srna, "show_material_color", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_MAT_COL);
- RNA_def_property_ui_text(prop, "Material Color", "Draw particles using material's diffuse color");
- RNA_def_property_update(prop, 0, "rna_Particle_redo");
-
prop= RNA_def_property(srna, "use_whole_group", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "draw", PART_DRAW_WHOLE_GR);
RNA_def_property_ui_text(prop, "Whole Group", "Use whole group at once");
@@ -1732,6 +1821,12 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Particle Rendering", "How particles are rendered");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
+ prop= RNA_def_property(srna, "draw_color", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "draw_col");
+ RNA_def_property_enum_items(prop, draw_col_items);
+ RNA_def_property_ui_text(prop, "Draw Color", "Draw additional particle data as a color");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
+
prop= RNA_def_property(srna, "draw_size", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, 1000);
RNA_def_property_ui_range(prop, 0, 100, 1, 0);
@@ -1786,7 +1881,7 @@ static void rna_def_particle_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "material", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "omat");
- RNA_def_property_range(prop, 1, 16);
+ RNA_def_property_range(prop, 1, 32767);
RNA_def_property_ui_text(prop, "Material", "Specify material used for the particles");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
@@ -1843,6 +1938,12 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Tilt", "Tilt of the billboards");
RNA_def_property_update(prop, 0, "rna_Particle_redo");
+ prop= RNA_def_property(srna, "color_maximum", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "color_vec_max");
+ RNA_def_property_range(prop, 0.01f, 100.0f);
+ RNA_def_property_ui_text(prop, "Color Maximum", "Maximum length of the particle color vector");
+ RNA_def_property_update(prop, 0, "rna_Particle_redo");
+
prop= RNA_def_property(srna, "billboard_tilt_random", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "bb_rand_tilt");
RNA_def_property_range(prop, 0.0f, 1.0f);
@@ -1918,6 +2019,13 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_ui_range(prop, 0, 10, 1, 3);
RNA_def_property_ui_text(prop, "Tweak", "A multiplier for physics timestep (1.0 means one frame = 1/25 seconds)");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
+
+ prop= RNA_def_property(srna, "timestep", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_funcs(prop, "rna_PartSettings_timestep_get", "rna_PartSetings_timestep_set", NULL);
+ RNA_def_property_range(prop, 0.0001, 100.0);
+ RNA_def_property_ui_range(prop, 0.01, 10, 1, 3);
+ RNA_def_property_ui_text(prop, "Timestep", "The simulation timestep per frame (in seconds)");
+ RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop= RNA_def_property(srna, "subframes", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 0, 1000);
diff --git a/source/blender/makesrna/intern/rna_pose.c b/source/blender/makesrna/intern/rna_pose.c
index e6aa753147a..9b8b23e3c47 100644
--- a/source/blender/makesrna/intern/rna_pose.c
+++ b/source/blender/makesrna/intern/rna_pose.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_pose.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <string.h>
@@ -818,7 +823,7 @@ static void rna_def_pose_channel(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "pose_mat");
RNA_def_property_multi_array(prop, 2, matrix_dimsize);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
- RNA_def_property_ui_text(prop, "Pose Matrix", "Final 4x4 matrix for this channel");
+ RNA_def_property_ui_text(prop, "Pose Matrix", "Final 4x4 matrix after constraints and drivers are applied (object space)");
/* Head/Tail Coordinates (in Pose Space) - Automatically calculated... */
prop= RNA_def_property(srna, "head", PROP_FLOAT, PROP_TRANSLATION);
@@ -1206,7 +1211,7 @@ static void rna_def_pose(BlenderRNA *brna)
RNA_def_property_collection_sdna(prop, NULL, "chanbase", NULL);
RNA_def_property_struct_type(prop, "PoseBone");
RNA_def_property_ui_text(prop, "Pose Bones", "Individual pose bones for the armature");
- RNA_def_property_collection_funcs(prop, 0, 0, 0, 0, 0, 0, "rna_PoseBones_lookup_string"); /* can be removed, only for fast lookup */
+ RNA_def_property_collection_funcs(prop, NULL, NULL, NULL, NULL, NULL, NULL, "rna_PoseBones_lookup_string"); /* can be removed, only for fast lookup */
/* bone groups */
prop= RNA_def_property(srna, "bone_groups", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "agroups", NULL);
diff --git a/source/blender/makesrna/intern/rna_pose_api.c b/source/blender/makesrna/intern/rna_pose_api.c
index b1daf8adcde..258d67abb19 100644
--- a/source/blender/makesrna/intern/rna_pose_api.c
+++ b/source/blender/makesrna/intern/rna_pose_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_pose_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
diff --git a/source/blender/makesrna/intern/rna_property.c b/source/blender/makesrna/intern/rna_property.c
index 4ea54994561..08a3f174c15 100644
--- a/source/blender/makesrna/intern/rna_property.c
+++ b/source/blender/makesrna/intern/rna_property.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_property.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 1d8c335e88f..93754d324df 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_render.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "DNA_scene_types.h"
@@ -110,8 +115,8 @@ static void rna_RenderEngine_unregister(const bContext *C, StructRNA *type)
static StructRNA *rna_RenderEngine_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
- RenderEngineType *et, dummyet = {0};
- RenderEngine dummyengine= {0};
+ RenderEngineType *et, dummyet = {NULL};
+ RenderEngine dummyengine= {NULL};
PointerRNA dummyptr;
int have_function[1];
@@ -300,7 +305,7 @@ static void rna_def_render_result(BlenderRNA *brna)
func= RNA_def_function(srna, "load_from_file", "RE_result_load_from_file");
RNA_def_function_ui_description(func, "Copies the pixels of this render result from an image file.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- parm= RNA_def_string_file_name(func, "filename", "", FILE_MAX, "File Name", "Filename to load into this render tile, must be no smaller then the render result");
+ parm= RNA_def_string_file_name(func, "filename", "", FILE_MAX, "File Name", "Filename to load into this render tile, must be no smaller than the render result");
RNA_def_property_flag(parm, PROP_REQUIRED);
RNA_define_verify_sdna(0);
@@ -332,10 +337,10 @@ static void rna_def_render_layer(BlenderRNA *brna)
func= RNA_def_function(srna, "load_from_file", "RE_layer_load_from_file");
RNA_def_function_ui_description(func, "Copies the pixels of this renderlayer from an image file.");
RNA_def_function_flag(func, FUNC_USE_REPORTS);
- prop= RNA_def_string(func, "filename", "", 0, "Filename", "Filename to load into this render tile, must be no smaller then the renderlayer");
+ prop= RNA_def_string(func, "filename", "", 0, "Filename", "Filename to load into this render tile, must be no smaller than the renderlayer");
RNA_def_property_flag(prop, PROP_REQUIRED);
- prop= RNA_def_int(func, "x", 0, 0, INT_MAX, "Offset X", "Offset the position to copy from if the image is larger then the render layer", 0, INT_MAX);
- prop= RNA_def_int(func, "y", 0, 0, INT_MAX, "Offset Y", "Offset the position to copy from if the image is larger then the render layer", 0, INT_MAX);
+ prop= RNA_def_int(func, "x", 0, 0, INT_MAX, "Offset X", "Offset the position to copy from if the image is larger than the render layer", 0, INT_MAX);
+ prop= RNA_def_int(func, "y", 0, 0, INT_MAX, "Offset Y", "Offset the position to copy from if the image is larger than the render layer", 0, INT_MAX);
RNA_define_verify_sdna(0);
diff --git a/source/blender/makesrna/intern/rna_rna.c b/source/blender/makesrna/intern/rna_rna.c
index 4402f0a3665..de2b551909c 100644
--- a/source/blender/makesrna/intern/rna_rna.c
+++ b/source/blender/makesrna/intern/rna_rna.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_rna.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "DNA_ID.h"
@@ -305,7 +310,7 @@ int rna_builtin_properties_lookup_string(PointerRNA *ptr, const char *key, Point
{
StructRNA *srna;
PropertyRNA *prop;
- PointerRNA propptr= {{0}};
+ PointerRNA propptr= {{NULL}};
srna= ptr->type;
@@ -729,12 +734,12 @@ static int rna_enum_check_separator(CollectionPropertyIterator *iter, void *data
static void rna_EnumProperty_items_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
PropertyRNA *prop= (PropertyRNA*)ptr->data;
- EnumPropertyRNA *eprop;
+ // EnumPropertyRNA *eprop; // UNUSED
EnumPropertyItem *item= NULL;
int totitem, free= 0;
rna_idproperty_check(&prop, ptr);
- eprop= (EnumPropertyRNA*)prop;
+ // eprop= (EnumPropertyRNA*)prop;
RNA_property_enum_items(NULL, ptr, prop, &item, &totitem, &free);
rna_iterator_array_begin(iter, (void*)item, sizeof(EnumPropertyItem), totitem, free, rna_enum_check_separator);
@@ -962,6 +967,7 @@ static void rna_def_property(BlenderRNA *brna)
{PROP_QUATERNION, "QUATERNION", 0, "Quaternion", ""},
{PROP_XYZ, "XYZ", 0, "XYZ", ""},
{PROP_COLOR_GAMMA, "COLOR_GAMMA", 0, "Gamma Corrected Color", ""},
+ {PROP_COORDS, "COORDINATES", 0, "Vector Coordinates", ""},
{PROP_LAYER, "LAYER", 0, "Layer", ""},
{PROP_LAYER_MEMBER, "LAYER_MEMBERSHIP", 0, "Layer Membership", ""},
{0, NULL, 0, NULL, NULL}};
@@ -1228,7 +1234,7 @@ static void rna_def_enum_property(BlenderRNA *brna, StructRNA *srna)
RNA_def_property_enum_funcs(prop, "rna_EnumProperty_default_get", NULL, "rna_EnumProperty_default_itemf");
RNA_def_property_ui_text(prop, "Default", "Default value for this enum");
- prop= RNA_def_property(srna, "items", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "enum_items", PROP_COLLECTION, PROP_NONE);
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
RNA_def_property_struct_type(prop, "EnumPropertyItem");
RNA_def_property_collection_funcs(prop, "rna_EnumProperty_items_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_get", 0, 0, 0);
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index a8e8cbcc153..a3cd2d55c0a 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_scene.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -51,6 +56,7 @@
#include <libavformat/avformat.h>
#endif
+#include "WM_api.h"
#include "WM_types.h"
#include "BLI_threads.h"
@@ -74,9 +80,9 @@ EnumPropertyItem proportional_falloff_items[] ={
EnumPropertyItem proportional_editing_items[] = {
- {PROP_EDIT_OFF, "DISABLED", ICON_PROP_OFF, "Disable", ""},
- {PROP_EDIT_ON, "ENABLED", ICON_PROP_ON, "Enable", ""},
- {PROP_EDIT_CONNECTED, "CONNECTED", ICON_PROP_CON, "Connected", ""},
+ {PROP_EDIT_OFF, "DISABLED", ICON_PROP_OFF, "Disable", "Proportional Editing disabled"},
+ {PROP_EDIT_ON, "ENABLED", ICON_PROP_ON, "Enable", "Proportional Editing enabled"},
+ {PROP_EDIT_CONNECTED, "CONNECTED", ICON_PROP_CON, "Connected", "Proportional Editing using connected geometry only"},
{0, NULL, 0, NULL, NULL}};
/* keep for operators, not used here */
@@ -218,7 +224,7 @@ static Base *rna_Scene_object_link(Scene *scene, bContext *C, ReportList *report
}
base= scene_add_base(scene, ob);
- ob->id.us++;
+ id_us_plus(&ob->id);
/* this is similar to what object_add_type and add_object do */
base->lay= scene->lay;
@@ -316,6 +322,12 @@ static void rna_Scene_view3d_update(Main *bmain, Scene *unused, PointerRNA *ptr)
BKE_screen_view3d_main_sync(&bmain->screen, scene);
}
+static void rna_Scene_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ rna_Scene_view3d_update(bmain, scene, ptr);
+ DAG_on_visible_update(bmain, FALSE);
+}
+
static void rna_Scene_framelen_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
scene->r.framelen= (float)scene->r.framapto/(float)scene->r.images;
@@ -745,6 +757,9 @@ static void rna_RenderSettings_color_management_update(Main *bmain, Scene *unuse
bNode *node;
if(ntree && scene->use_nodes) {
+ /* XXX images are freed here, stop render and preview threads, until Image is threadsafe */
+ WM_jobs_stop_all(bmain->wm.first);
+
for (node=ntree->nodes.first; node; node=node->next) {
if (ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_IMAGE)) {
ED_node_changed_update(&scene->id, node);
@@ -899,6 +914,24 @@ static void rna_Scene_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr
rna_Scene_use_simplify_update(bmain, scene, ptr);
}
+static int rna_Scene_use_audio_get(PointerRNA *ptr)
+{
+ Scene *scene= (Scene*)ptr->data;
+ return scene->audio.flag & AUDIO_MUTE;
+}
+
+static void rna_Scene_use_audio_set(PointerRNA *ptr, int value)
+{
+ Scene *scene= (Scene*)ptr->data;
+
+ if(value)
+ scene->audio.flag |= AUDIO_MUTE;
+ else
+ scene->audio.flag &= ~AUDIO_MUTE;
+
+ sound_mute_scene(scene, value);
+}
+
static int rna_Scene_sync_mode_get(PointerRNA *ptr)
{
Scene *scene= (Scene*)ptr->data;
@@ -1074,7 +1107,7 @@ static void rna_def_tool_settings(BlenderRNA *brna)
prop= RNA_def_property(srna, "proportional_edit", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "proportional");
RNA_def_property_enum_items(prop, proportional_editing_items);
- RNA_def_property_ui_text(prop, "Proportional Editing", "Proportional editing mode");
+ RNA_def_property_ui_text(prop, "Proportional Editing", "Proportional Editing mode, allows transforms with distance fall-off");
RNA_def_property_update(prop, NC_SCENE|ND_TOOLSETTINGS, NULL); /* header redraw */
prop= RNA_def_property(srna, "use_proportional_edit_objects", PROP_BOOLEAN, PROP_NONE);
@@ -1203,6 +1236,10 @@ static void rna_def_tool_settings(BlenderRNA *brna)
RNA_def_property_enum_items(prop, edge_tag_items);
RNA_def_property_ui_text(prop, "Edge Tag Mode", "The edge flag to tag when selecting the shortest path");
+ prop= RNA_def_property(srna, "edge_path_live_unwrap", PROP_BOOLEAN, PROP_NONE);
+ RNA_def_property_boolean_sdna(prop, NULL, "edge_mode_live_unwrap", 1);
+ RNA_def_property_ui_text(prop, "Live Unwrap", "Changing edges seam re-calculates UV unwrap");
+
/* etch-a-ton */
prop= RNA_def_property(srna, "use_bone_sketching", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "bone_sketching", BONE_SKETCHING);
@@ -1942,7 +1979,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem color_mode_items[] ={
- {R_PLANESBW, "BW", 0, "BW", "Images are saved with BW (grayscale) data"},
+ {R_PLANESBW, "BW", 0, "BW", "Images get saved in 8 bits grayscale (only PNG, JPEG, TGA, TIF)"},
{R_PLANES24, "RGB", 0, "RGB", "Images are saved with RGB (color) data"},
{R_PLANES32, "RGBA", 0, "RGBA", "Images are saved with RGB and Alpha data (if supported)"},
{0, NULL, 0, NULL, NULL}};
@@ -1951,7 +1988,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
{R_OUTPUT_SCREEN, "SCREEN", 0, "Full Screen", "Images are rendered in full Screen"},
{R_OUTPUT_AREA, "AREA", 0, "Image Editor", "Images are rendered in Image Editor"},
{R_OUTPUT_WINDOW, "WINDOW", 0, "New Window", "Images are rendered in new Window"},
- {R_OUTPUT_NONE, "NONE", 0, "No Output", "Images are rendered without drawing"},
+ {R_OUTPUT_NONE, "NONE", 0, "Keep UI", "Images are rendered without forcing UI changes, optionally showing result"},
{0, NULL, 0, NULL, NULL}};
/* Bake */
@@ -2027,7 +2064,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
{1, "CINE_24FPS", 0, "Cinema 24fps 2048x1080", ""},
{2, "CINE_48FPS", 0, "Cinema 48fps 2048x1080", ""},
{3, "CINE_24FPS_4K", 0, "Cinema 24fps 4096x2160", ""},
- {4, "CINE_SCOPE_48FPS", 0, "Cine-Scope 24fps 2048x858", ""},
+ {4, "CINE_SCOPE_24FPS", 0, "Cine-Scope 24fps 2048x858", ""},
{5, "CINE_SCOPE_48FPS", 0, "Cine-Scope 48fps 2048x858", ""},
{6, "CINE_FLAT_24FPS", 0, "Cine-Flat 24fps 1998x1080", ""},
{7, "CINE_FLAT_48FPS", 0, "Cine-Flat 48fps 1998x1080", ""},
@@ -2148,7 +2185,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "resolution_percentage", PROP_INT, PROP_PERCENTAGE);
RNA_def_property_int_sdna(prop, NULL, "size");
- RNA_def_property_range(prop, 1, INT_MAX);
+ RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 100, 10, 1);
RNA_def_property_ui_text(prop, "Resolution %", "Percentage scale for render resolution");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
@@ -2233,7 +2270,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
prop= RNA_def_property(srna, "exr_zbuf", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "subimtype", R_OPENEXR_ZBUF);
- RNA_def_property_ui_text(prop, "Zbuf", "Save the z-depth per pixel (32 bit unsigned int zbuffer)");
+ RNA_def_property_ui_text(prop, "Zbuf", "Save the z-depth per pixel (32 bit unsigned int z-buffer)");
RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
prop= RNA_def_property(srna, "exr_preview", PROP_BOOLEAN, PROP_NONE);
@@ -2971,7 +3008,7 @@ static void rna_def_scene_objects(BlenderRNA *brna, PropertyRNA *cprop)
prop= RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE);
RNA_def_property_struct_type(prop, "Object");
RNA_def_property_pointer_funcs(prop, "rna_Scene_active_object_get", "rna_Scene_active_object_set", NULL, NULL);
- RNA_def_property_flag(prop, PROP_EDITABLE);
+ RNA_def_property_flag(prop, PROP_EDITABLE|PROP_NEVER_UNLINK);
RNA_def_property_ui_text(prop, "Active Object", "Active object for this scene");
/* Could call: ED_base_object_activate(C, scene->basact);
* but would be a bad level call and it seems the notifier is enough */
@@ -3170,7 +3207,7 @@ void RNA_def_scene(BlenderRNA *brna)
RNA_def_property_array(prop, 20);
RNA_def_property_boolean_funcs(prop, NULL, "rna_Scene_layer_set");
RNA_def_property_ui_text(prop, "Layers", "Layers visible when rendering the scene");
- RNA_def_property_update(prop, NC_SCENE|ND_LAYER, "rna_Scene_view3d_update");
+ RNA_def_property_update(prop, NC_SCENE|ND_LAYER, "rna_Scene_layer_update");
/* Frame Range Stuff */
prop= RNA_def_property(srna, "frame_current", PROP_INT, PROP_TIME);
@@ -3333,7 +3370,7 @@ void RNA_def_scene(BlenderRNA *brna)
/* Audio Settings */
prop= RNA_def_property(srna, "use_audio", PROP_BOOLEAN, PROP_NONE);
- RNA_def_property_boolean_negative_sdna(prop, NULL, "audio.flag", AUDIO_MUTE);
+ RNA_def_property_boolean_funcs(prop, "rna_Scene_use_audio_get", "rna_Scene_use_audio_set");
RNA_def_property_ui_text(prop, "Audio Muted", "Play back of audio from Sequence Editor will be muted");
RNA_def_property_update(prop, NC_SCENE, NULL);
diff --git a/source/blender/makesrna/intern/rna_scene_api.c b/source/blender/makesrna/intern/rna_scene_api.c
index 042d3214edf..c2194636cd3 100644
--- a/source/blender/makesrna/intern/rna_scene_api.c
+++ b/source/blender/makesrna/intern/rna_scene_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_scene_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
@@ -76,6 +81,17 @@ static void rna_SceneRender_get_frame_path(RenderData *rd, int frame, char *name
BKE_makepicstring(name, rd->pic, (frame==INT_MIN) ? rd->cfra : frame, rd->imtype, rd->scemode & R_EXTENSION, TRUE);
}
+#ifdef WITH_COLLADA
+/* don't remove this, as COLLADA exporting cannot be done through operators in render() callback. */
+#include "../../collada/collada.h"
+
+static void rna_Scene_collada_export(Scene *scene, const char *filepath)
+{
+ collada_export(scene, filepath);
+}
+
+#endif
+
#else
void RNA_api_scene(StructRNA *srna)
@@ -91,8 +107,18 @@ void RNA_api_scene(StructRNA *srna)
func= RNA_def_function(srna, "update", "rna_Scene_update_tagged");
RNA_def_function_ui_description(func, "Update data tagged to be updated from previous access to data or operators.");
+
+#ifdef WITH_COLLADA
+ /* don't remove this, as COLLADA exporting cannot be done through operators in render() callback. */
+ func= RNA_def_function(srna, "collada_export", "rna_Scene_collada_export");
+ parm= RNA_def_string(func, "filepath", "", FILE_MAX, "File Path", "File path to write Collada file.");
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_subtype(parm, PROP_FILEPATH); /* allow non utf8 */
+ RNA_def_function_ui_description(func, "Export to collada file.");
+#endif
}
+
void RNA_api_scene_render(StructRNA *srna)
{
FunctionRNA *func;
diff --git a/source/blender/makesrna/intern/rna_screen.c b/source/blender/makesrna/intern/rna_screen.c
index 892090b7f38..d129fccc717 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_screen.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stddef.h>
@@ -148,6 +153,16 @@ static void rna_def_area(BlenderRNA *brna)
RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
RNA_def_property_update(prop, 0, "rna_Area_type_update");
+ prop= RNA_def_property(srna, "width", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "winx");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Width", "Area width");
+
+ prop= RNA_def_property(srna, "height", PROP_INT, PROP_UNSIGNED);
+ RNA_def_property_int_sdna(prop, NULL, "winy");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Height", "Area height");
+
RNA_def_function(srna, "tag_redraw", "ED_area_tag_redraw");
func= RNA_def_function(srna, "header_text_set", "ED_area_headerprint");
diff --git a/source/blender/makesrna/intern/rna_sculpt_paint.c b/source/blender/makesrna/intern/rna_sculpt_paint.c
index a4face4de74..58f19fe8799 100644
--- a/source/blender/makesrna/intern/rna_sculpt_paint.c
+++ b/source/blender/makesrna/intern/rna_sculpt_paint.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_sculpt_paint.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -464,7 +469,7 @@ static void rna_def_particle_edit(BlenderRNA *brna)
prop= RNA_def_property(srna, "size", PROP_INT, PROP_NONE);
RNA_def_property_range(prop, 1, SHRT_MAX);
RNA_def_property_ui_range(prop, 1, 100, 10, 3);
- RNA_def_property_ui_text(prop, "Size", "Brush size");
+ RNA_def_property_ui_text(prop, "Radius", "Radius of the brush in pixels");
prop= RNA_def_property(srna, "strength", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.001, 1.0);
diff --git a/source/blender/makesrna/intern/rna_sensor.c b/source/blender/makesrna/intern/rna_sensor.c
index f4d732ee041..e19816a42f6 100644
--- a/source/blender/makesrna/intern/rna_sensor.c
+++ b/source/blender/makesrna/intern/rna_sensor.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_sensor.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -629,9 +634,10 @@ static void rna_def_radar_sensor(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Axis", "Specify along which axis the radar cone is cast");
RNA_def_property_update(prop, NC_LOGIC, NULL);
- prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
+ //XXX TODO - use radians internally then change to PROP_ANGLE
+ prop= RNA_def_property(srna, "angle", PROP_FLOAT, PROP_NONE);
RNA_def_property_range(prop, 0.0, 179.9);
- RNA_def_property_ui_text(prop, "Angle", "Opening angle of the radar cone");
+ RNA_def_property_ui_text(prop, "Angle", "Opening angle of the radar cone (in degrees)");
RNA_def_property_update(prop, NC_LOGIC, NULL);
prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_sensor_api.c b/source/blender/makesrna/intern/rna_sensor_api.c
index 5bf0e00f05d..cfa957bdd9e 100644
--- a/source/blender/makesrna/intern/rna_sensor_api.c
+++ b/source/blender/makesrna/intern/rna_sensor_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_sensor_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c
index dae4b484aef..34963e9507f 100644
--- a/source/blender/makesrna/intern/rna_sequencer.c
+++ b/source/blender/makesrna/intern/rna_sequencer.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_sequencer.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <limits.h>
@@ -1055,7 +1060,7 @@ static void rna_def_editor(BlenderRNA *brna)
prop= RNA_def_property(srna, "show_overlay", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "over_flag", SEQ_EDIT_OVERLAY_SHOW);
- RNA_def_property_ui_text(prop, "Draw Axes", "Partial overlay ontop of the sequencer");
+ RNA_def_property_ui_text(prop, "Draw Axes", "Partial overlay on top of the sequencer");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_SEQUENCER, NULL);
prop= RNA_def_property(srna, "overlay_lock", PROP_BOOLEAN, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c
index 614e3d7b031..d2c2787784b 100644
--- a/source/blender/makesrna/intern/rna_sequencer_api.c
+++ b/source/blender/makesrna/intern/rna_sequencer_api.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_sequencer_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index f0d5600ac06..922c68f45bd 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_smoke.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <limits.h>
diff --git a/source/blender/makesrna/intern/rna_sound.c b/source/blender/makesrna/intern/rna_sound.c
index dc30f0f09b4..97339058794 100644
--- a/source/blender/makesrna/intern/rna_sound.c
+++ b/source/blender/makesrna/intern/rna_sound.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_sound.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index c6ed60c90f7..3d9d8a8e9f4 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_space.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "MEM_guardedalloc.h"
@@ -79,7 +84,7 @@ static EnumPropertyItem draw_channels_items[] = {
static EnumPropertyItem transform_orientation_items[] = {
{V3D_MANIP_GLOBAL, "GLOBAL", 0, "Global", "Align the transformation axes to world space"},
{V3D_MANIP_LOCAL, "LOCAL", 0, "Local", "Align the transformation axes to the selected objects' local space"},
- {V3D_MANIP_GIMBAL, "GIMBAL", 0, "Gimbal", "Align each axis to the euler rotation axis as used for input"},
+ {V3D_MANIP_GIMBAL, "GIMBAL", 0, "Gimbal", "Align each axis to the Euler rotation axis as used for input"},
{V3D_MANIP_NORMAL, "NORMAL", 0, "Normal", "Align the transformation axes to average normal of selected elements (bone Y axis for pose mode)"},
{V3D_MANIP_VIEW, "VIEW", 0, "View", "Align the transformation axes to the window"},
{V3D_MANIP_CUSTOM, "CUSTOM", 0, "Custom", "Use a custom transform orientation"},
@@ -309,6 +314,11 @@ static void rna_SpaceView3D_layer_set(PointerRNA *ptr, const int *values)
v3d->lay= ED_view3d_scene_layer_set(v3d->lay, values, &v3d->layact);
}
+static void rna_SpaceView3D_layer_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+ DAG_on_visible_update(bmain, FALSE);
+}
+
static PointerRNA rna_SpaceView3D_region_3d_get(PointerRNA *ptr)
{
View3D *v3d= (View3D*)(ptr->data);
@@ -609,12 +619,11 @@ static void rna_ConsoleLine_body_set(PointerRNA *ptr, const char *value)
ConsoleLine *ci= (ConsoleLine*)ptr->data;
int len= strlen(value);
- if((len >= ci->len_alloc) || (len * 2 < ci->len_alloc) ) { /* allocate a new strnig */
+ if((len >= ci->len_alloc) || (len * 2 < ci->len_alloc) ) { /* allocate a new string */
MEM_freeN(ci->line);
ci->line= MEM_mallocN((len + 1) * sizeof(char), "rna_consoleline");
ci->len_alloc= len + 1;
}
-
memcpy(ci->line, value, len + 1);
ci->len= len;
@@ -725,7 +734,7 @@ static int rna_SpaceGraphEditor_has_ghost_curves_get(PointerRNA *ptr)
static void rna_Sequencer_display_mode_update(bContext *C, PointerRNA *ptr)
{
- int view = RNA_int_get(ptr, "view_type");
+ int view = RNA_enum_get(ptr, "view_type");
ED_sequencer_update_view(C, view);
}
@@ -893,7 +902,7 @@ static void rna_def_space_image_uv(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Normalized Coordinates", "Display UV coordinates from 0.0 to 1.0 rather than in pixels");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_NONE);
+ prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_XYZ);
RNA_def_property_array(prop, 2);
RNA_def_property_float_funcs(prop, "rna_SpaceImageEditor_cursor_location_get", "rna_SpaceImageEditor_cursor_location_set", NULL);
RNA_def_property_ui_text(prop, "2D Cursor Location", "2D cursor location for this view");
@@ -1271,7 +1280,7 @@ static void rna_def_space_view3d(BlenderRNA *brna)
RNA_def_property_array(prop, 20);
RNA_def_property_boolean_funcs(prop, NULL, "rna_SpaceView3D_layer_set");
RNA_def_property_ui_text(prop, "Visible Layers", "Layers visible in this 3D View");
- RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
+ RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, "rna_SpaceView3D_layer_update");
prop= RNA_def_property(srna, "layers_used", PROP_BOOLEAN, PROP_LAYER_MEMBER);
RNA_def_property_boolean_sdna(prop, NULL, "lay_used", 1);
@@ -1441,9 +1450,9 @@ static void rna_def_space_image(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Image User", "Parameters defining which layer, pass and frame of the image is displayed");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, NULL);
- prop= RNA_def_property(srna, "curves", PROP_POINTER, PROP_NONE);
+ prop= RNA_def_property(srna, "curve", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "cumap");
- RNA_def_property_ui_text(prop, "Curves", "Color curve mapping to use for displaying the image");
+ RNA_def_property_ui_text(prop, "Curve", "Color curve mapping to use for displaying the image");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_IMAGE, "rna_SpaceImageEditor_curves_update");
prop= RNA_def_property(srna, "scopes", PROP_POINTER, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_test.c b/source/blender/makesrna/intern/rna_test.c
index ba5fdfcc5cf..17a7590ba47 100644
--- a/source/blender/makesrna/intern/rna_test.c
+++ b/source/blender/makesrna/intern/rna_test.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_test.c
+ * \ingroup RNA
+ */
+
+
/* Defines a structure with properties used for array manipulation tests in BPY. */
#include <stdlib.h>
diff --git a/source/blender/makesrna/intern/rna_text.c b/source/blender/makesrna/intern/rna_text.c
index ec71dd0f2d6..959f9db851b 100644
--- a/source/blender/makesrna/intern/rna_text.c
+++ b/source/blender/makesrna/intern/rna_text.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_text.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <limits.h>
diff --git a/source/blender/makesrna/intern/rna_text_api.c b/source/blender/makesrna/intern/rna_text_api.c
index 9d884eaa257..54cb6714b1b 100644
--- a/source/blender/makesrna/intern/rna_text_api.c
+++ b/source/blender/makesrna/intern/rna_text_api.c
@@ -21,6 +21,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_text_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/makesrna/intern/rna_texture.c b/source/blender/makesrna/intern/rna_texture.c
index 23a98804771..82eb5d1d0c9 100644
--- a/source/blender/makesrna/intern/rna_texture.c
+++ b/source/blender/makesrna/intern/rna_texture.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_texture.c
+ * \ingroup RNA
+ */
+
+
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
@@ -144,7 +149,9 @@ static void rna_Texture_voxeldata_image_update(Main *bmain, Scene *scene, Pointe
{
Tex *tex= ptr->id.data;
- tex->ima->source = IMA_SRC_SEQUENCE;
+ if(tex->ima) { /* may be getting cleared too */
+ tex->ima->source = IMA_SRC_SEQUENCE;
+ }
rna_Texture_voxeldata_update(bmain, scene, ptr);
}
@@ -783,7 +790,7 @@ static void rna_def_texture_wood(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Pattern", "");
RNA_def_property_update(prop, 0, "rna_Texture_nodes_update");
- prop= RNA_def_property(srna, "noisebasis_2", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "noise_basis_2", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "noisebasis2");
RNA_def_property_enum_items(prop, prop_wood_noisebasis2);
RNA_def_property_ui_text(prop, "Noise Basis 2", "");
@@ -857,7 +864,7 @@ static void rna_def_texture_marble(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Noise Basis", "Sets the noise basis used for turbulence");
RNA_def_property_update(prop, 0, "rna_Texture_nodes_update");
- prop= RNA_def_property(srna, "noisebasis_2", PROP_ENUM, PROP_NONE);
+ prop= RNA_def_property(srna, "noise_basis_2", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "noisebasis2");
RNA_def_property_enum_items(prop, prop_marble_noisebasis2);
RNA_def_property_ui_text(prop, "Noise Basis 2", "");
@@ -1009,7 +1016,7 @@ static void rna_def_texture_image(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_interpolation", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "imaflag", TEX_INTERPOL);
- RNA_def_property_ui_text(prop, "Interpolation", "Interpolates pixels using Area filter");
+ RNA_def_property_ui_text(prop, "Interpolation", "Interpolates pixels using selected filter");
RNA_def_property_update(prop, 0, "rna_Texture_update");
/* XXX: I think flip_axis should be a generic Texture property, enabled for all the texture types */
diff --git a/source/blender/makesrna/intern/rna_timeline.c b/source/blender/makesrna/intern/rna_timeline.c
index edff898b8db..c36666846d9 100644
--- a/source/blender/makesrna/intern/rna_timeline.c
+++ b/source/blender/makesrna/intern/rna_timeline.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_timeline.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
diff --git a/source/blender/makesrna/intern/rna_ui.c b/source/blender/makesrna/intern/rna_ui.c
index d6117c393a5..d48c1d35c13 100644
--- a/source/blender/makesrna/intern/rna_ui.c
+++ b/source/blender/makesrna/intern/rna_ui.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_ui.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "DNA_screen_types.h"
@@ -166,8 +171,8 @@ static void rna_Panel_unregister(const bContext *C, StructRNA *type)
static StructRNA *rna_Panel_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
ARegionType *art;
- PanelType *pt, dummypt = {0};
- Panel dummypanel= {0};
+ PanelType *pt, dummypt = {NULL};
+ Panel dummypanel= {NULL};
PointerRNA dummyptr;
int have_function[3];
@@ -281,8 +286,8 @@ static void rna_Header_unregister(const bContext *C, StructRNA *type)
static StructRNA *rna_Header_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
ARegionType *art;
- HeaderType *ht, dummyht = {0};
- Header dummyheader= {0};
+ HeaderType *ht, dummyht = {NULL};
+ Header dummyheader= {NULL};
PointerRNA dummyhtr;
int have_function[1];
@@ -399,8 +404,8 @@ static void rna_Menu_unregister(const bContext *C, StructRNA *type)
static StructRNA *rna_Menu_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
- MenuType *mt, dummymt = {0};
- Menu dummymenu= {0};
+ MenuType *mt, dummymt = {NULL};
+ Menu dummymenu= {NULL};
PointerRNA dummymtr;
int have_function[2];
diff --git a/source/blender/makesrna/intern/rna_ui_api.c b/source/blender/makesrna/intern/rna_ui_api.c
index d7ff6af9bb2..2ee19b07d86 100644
--- a/source/blender/makesrna/intern/rna_ui_api.c
+++ b/source/blender/makesrna/intern/rna_ui_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_ui_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
@@ -41,7 +46,7 @@ static void rna_uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname,
int flag= 0;
if(!prop) {
- printf("rna_uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
+ RNA_warning("rna_uiItemR: property not found: %s.%s\n", RNA_struct_identifier(ptr->type), propname);
return;
}
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 1376786469a..687003b3421 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_userdef.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
@@ -976,6 +981,11 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna)
RNA_def_property_range(prop, 0, 100);
RNA_def_property_ui_text(prop, "Pin Face Opacity", "");
RNA_def_property_update(prop, NC_WINDOW, NULL);
+
+ prop= RNA_def_property(srna, "outline_width", PROP_INT, PROP_NONE);
+ RNA_def_property_range(prop, 1, 5);
+ RNA_def_property_ui_text(prop, "Outline Width", "");
+ RNA_def_property_update(prop, 0, "rna_userdef_update");
}
static void rna_def_userdef_theme_space_graph(BlenderRNA *brna)
@@ -1718,7 +1728,7 @@ static void rna_def_userdef_themes(BlenderRNA *brna)
static EnumPropertyItem active_theme_area[] = {
{0, "USER_INTERFACE", ICON_UI, "User Interface", ""},
- {18, "COLOR_SETS", ICON_COLOR, "Bone Color Sets", ""},
+ {18, "BONE_COLOR_SETS", ICON_COLOR, "Bone Color Sets", ""},
{1, "VIEW_3D", ICON_VIEW3D, "3D View", ""},
{2, "TIMELINE", ICON_TIME, "Timeline", ""},
{3, "GRAPH_EDITOR", ICON_IPO, "Graph Editor", ""},
@@ -2706,7 +2716,7 @@ static void rna_def_userdef_input(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_mouse_emulate_3_button", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_TWOBUTTONMOUSE);
- RNA_def_property_ui_text(prop, "Emulate 3 Button Mouse", "Emulates Middle Mouse with Alt+LeftMouse (doesn't work with Left Mouse Select option)");
+ RNA_def_property_ui_text(prop, "Emulate 3 Button Mouse", "Emulates Middle Mouse with Alt+Left Mouse (doesn't work with Left Mouse Select option)");
prop= RNA_def_property(srna, "use_emulate_numpad", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", USER_NONUMPAD);
@@ -2807,7 +2817,8 @@ static void rna_def_userdef_filepaths(BlenderRNA *brna)
prop= RNA_def_property(srna, "script_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "pythondir");
- RNA_def_property_ui_text(prop, "Python Scripts Directory", "The default directory to search for Python scripts (resets python module search path: sys.path)");
+ RNA_def_property_ui_text(prop, "Python Scripts Directory", "Alternate script path, matching the default layout with subdirs: startup, addons & modules (requires restart)");
+ /* TODO, editing should reset sys.path! */
prop= RNA_def_property(srna, "sound_directory", PROP_STRING, PROP_DIRPATH);
RNA_def_property_string_sdna(prop, NULL, "sounddir");
diff --git a/source/blender/makesrna/intern/rna_vfont.c b/source/blender/makesrna/intern/rna_vfont.c
index f6b39f648c4..c64cf61429a 100644
--- a/source/blender/makesrna/intern/rna_vfont.c
+++ b/source/blender/makesrna/intern/rna_vfont.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_vfont.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_define.h"
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 54d1b1a55b4..a6b6ae26ca5 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_wm.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include "RNA_access.h"
@@ -823,6 +828,30 @@ static void operator_draw(bContext *C, wmOperator *op)
RNA_parameter_list_free(&list);
}
+/* same as exec(), but call cancel */
+static int operator_cancel(bContext *C, wmOperator *op)
+{
+ PointerRNA opr;
+ ParameterList list;
+ FunctionRNA *func;
+ void *ret;
+ int result;
+
+ RNA_pointer_create(&CTX_wm_screen(C)->id, op->type->ext.srna, op, &opr);
+ func= RNA_struct_find_function(&opr, "cancel");
+
+ RNA_parameter_list_create(&list, &opr, func);
+ RNA_parameter_set_lookup(&list, "context", &C);
+ op->type->ext.call(C, &opr, func, &list);
+
+ RNA_parameter_get_lookup(&list, "result", &ret);
+ result= *(int*)ret;
+
+ RNA_parameter_list_free(&list);
+
+ return result;
+}
+
void operator_wrapper(wmOperatorType *ot, void *userdata);
void macro_wrapper(wmOperatorType *ot, void *userdata);
@@ -831,10 +860,10 @@ static char _operator_name[OP_MAX_TYPENAME];
static char _operator_descr[1024];
static StructRNA *rna_Operator_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
- wmOperatorType dummyot = {0};
- wmOperator dummyop= {0};
+ wmOperatorType dummyot = {NULL};
+ wmOperator dummyop= {NULL};
PointerRNA dummyotr;
- int have_function[6];
+ int have_function[7];
/* setup dummy operator & operator type to store static properties in */
dummyop.type= &dummyot;
@@ -889,8 +918,8 @@ static StructRNA *rna_Operator_register(bContext *C, ReportList *reports, void *
int idlen = strlen(_operator_idname) + 4;
int namelen = strlen(_operator_name) + 1;
int desclen = strlen(_operator_descr) + 1;
- char *ch, *ch_arr;
- ch_arr= ch= MEM_callocN(sizeof(char) * (idlen + namelen + desclen), "_operator_idname"); /* 2 terminators and 3 to convert a.b -> A_OT_b */
+ char *ch;
+ ch= MEM_callocN(sizeof(char) * (idlen + namelen + desclen), "_operator_idname"); /* 2 terminators and 3 to convert a.b -> A_OT_b */
WM_operator_bl_idname(ch, _operator_idname); /* convert the idname from python */
dummyot.idname= ch;
ch += idlen;
@@ -922,6 +951,7 @@ static StructRNA *rna_Operator_register(bContext *C, ReportList *reports, void *
dummyot.invoke= (have_function[3])? operator_invoke: NULL;
dummyot.modal= (have_function[4])? operator_modal: NULL;
dummyot.ui= (have_function[5])? operator_draw: NULL;
+ dummyot.cancel= (have_function[6])? operator_cancel: NULL;
WM_operatortype_append_ptr(operator_wrapper, (void *)&dummyot);
/* update while blender is running */
@@ -934,8 +964,8 @@ static StructRNA *rna_Operator_register(bContext *C, ReportList *reports, void *
static StructRNA *rna_MacroOperator_register(bContext *C, ReportList *reports, void *data, const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
{
- wmOperatorType dummyot = {0};
- wmOperator dummyop= {0};
+ wmOperatorType dummyot = {NULL};
+ wmOperator dummyop= {NULL};
PointerRNA dummyotr;
int have_function[4];
@@ -955,8 +985,8 @@ static StructRNA *rna_MacroOperator_register(bContext *C, ReportList *reports, v
int idlen = strlen(_operator_idname) + 4;
int namelen = strlen(_operator_name) + 1;
int desclen = strlen(_operator_descr) + 1;
- char *ch, *ch_arr;
- ch_arr= ch= MEM_callocN(sizeof(char) * (idlen + namelen + desclen), "_operator_idname"); /* 2 terminators and 3 to convert a.b -> A_OT_b */
+ char *ch;
+ ch= MEM_callocN(sizeof(char) * (idlen + namelen + desclen), "_operator_idname"); /* 2 terminators and 3 to convert a.b -> A_OT_b */
WM_operator_bl_idname(ch, _operator_idname); /* convert the idname from python */
dummyot.idname= ch;
ch += idlen;
@@ -1293,9 +1323,9 @@ static void rna_def_operator_filelist_element(BlenderRNA *brna)
srna= RNA_def_struct(brna, "OperatorFileListElement", "PropertyGroup");
RNA_def_struct_ui_text(srna, "Operator File List Element", "");
-
-
- prop= RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+
+
+ prop= RNA_def_property(srna, "name", PROP_STRING, PROP_FILENAME);
RNA_def_property_flag(prop, PROP_IDPROPERTY);
RNA_def_property_ui_text(prop, "Name", "the name of a file or directory within a file list");
}
@@ -1388,6 +1418,36 @@ static void rna_def_event(BlenderRNA *brna)
RNA_define_verify_sdna(1); // not in sdna
}
+static void rna_def_timer(BlenderRNA *brna)
+{
+ StructRNA *srna;
+ PropertyRNA *prop;
+
+ srna= RNA_def_struct(brna, "Timer", NULL);
+ RNA_def_struct_ui_text(srna, "Timer", "Window event timer");
+ RNA_def_struct_sdna(srna, "wmTimer");
+
+ RNA_define_verify_sdna(0); // not in sdna
+
+ /* could wrap more, for now this is enough */
+ prop= RNA_def_property(srna, "time_step", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "timestep");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Time Step", "");
+
+ prop= RNA_def_property(srna, "time_delta", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "delta");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Delta", "Time since last step in seconds");
+
+ prop= RNA_def_property(srna, "time_duration", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "duration");
+ RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+ RNA_def_property_ui_text(prop, "Delta", "Time since last step in seconds");
+
+ RNA_define_verify_sdna(1); // not in sdna
+}
+
static void rna_def_window(BlenderRNA *brna)
{
StructRNA *srna;
@@ -1634,7 +1694,8 @@ static void rna_def_keyconfig(BlenderRNA *brna)
RNA_def_property_enum_items(prop, region_type_items);
RNA_def_property_ui_text(prop, "Region Type", "Optional region type keymap is associated with");
- prop= RNA_def_property(srna, "items", PROP_COLLECTION, PROP_NONE);
+ prop= RNA_def_property(srna, "keymap_items", PROP_COLLECTION, PROP_NONE);
+ RNA_def_property_collection_sdna(prop, NULL, "items", NULL);
RNA_def_property_struct_type(prop, "KeyMapItem");
RNA_def_property_ui_text(prop, "Items", "Items in the keymap, linking an operator to an input event");
rna_def_keymap_items(brna, prop);
@@ -1770,6 +1831,7 @@ void RNA_def_wm(BlenderRNA *brna)
rna_def_macro_operator(brna);
rna_def_operator_type_macro(brna);
rna_def_event(brna);
+ rna_def_timer(brna);
rna_def_window(brna);
rna_def_windowmanager(brna);
rna_def_keyconfig(brna);
diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c
index 8c0be26d3a8..48daabefd01 100644
--- a/source/blender/makesrna/intern/rna_wm_api.c
+++ b/source/blender/makesrna/intern/rna_wm_api.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_wm_api.c
+ * \ingroup RNA
+ */
+
+
#include <stdlib.h>
#include <stdio.h>
@@ -68,6 +73,17 @@ static int rna_event_modal_handler_add(struct bContext *C, struct wmOperator *op
return WM_event_add_modal_handler(C, operator) != NULL;
}
+/* XXX, need a way for python to know event types, 0x0110 is hard coded */
+struct wmTimer *rna_event_timer_add(struct wmWindowManager *wm, float time_step, wmWindow *win)
+{
+ return WM_event_add_timer(wm, win, 0x0110, time_step);
+}
+
+void rna_event_timer_remove(struct wmWindowManager *wm, wmTimer *timer)
+{
+ WM_event_remove_timer(wm, timer->win, timer);
+}
+
#else
#define WM_GEN_INVOKE_EVENT (1<<0)
@@ -113,6 +129,22 @@ void RNA_api_wm(StructRNA *srna)
RNA_def_property_flag(parm, PROP_REQUIRED);
RNA_def_function_return(func, RNA_def_boolean(func, "handle", 1, "", ""));
+
+ func= RNA_def_function(srna, "event_timer_add", "rna_event_timer_add");
+ parm= RNA_def_property(func, "time_step", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_flag(parm, PROP_REQUIRED);
+ RNA_def_property_range(parm, 0.0, FLT_MAX);
+ RNA_def_property_ui_text(parm, "Time Step", "Interval in seconds between timer events");
+ parm= RNA_def_pointer(func, "window", "Window", "", "Window to attach the timer to or None.");
+ parm= RNA_def_pointer(func, "result", "Timer", "", "");
+ RNA_def_function_return(func, parm);
+
+
+ func= RNA_def_function(srna, "event_timer_remove", "rna_event_timer_remove");
+ parm= RNA_def_pointer(func, "timer", "Timer", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+
/* invoke functions, for use with python */
func= RNA_def_function(srna, "invoke_props_popup", "WM_operator_props_popup");
RNA_def_function_ui_description(func, "Operator popup invoke.");
@@ -210,6 +242,16 @@ void RNA_api_operator(StructRNA *srna)
RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
parm= RNA_def_pointer(func, "context", "Context", "", "");
RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ /* cancel */
+ func= RNA_def_function(srna, "cancel", NULL);
+ RNA_def_function_ui_description(func, "Called when the operator is cancelled.");
+ RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL);
+ parm= RNA_def_pointer(func, "context", "Context", "", "");
+ RNA_def_property_flag(parm, PROP_REQUIRED|PROP_NEVER_NULL);
+
+ parm= RNA_def_enum_flag(func, "result", operator_return_items, OPERATOR_CANCELLED, "result", ""); // better name?
+ RNA_def_function_return(func, parm);
}
void RNA_api_macro(StructRNA *srna)
diff --git a/source/blender/makesrna/intern/rna_world.c b/source/blender/makesrna/intern/rna_world.c
index 2de7e0e206f..7166d51da5a 100644
--- a/source/blender/makesrna/intern/rna_world.c
+++ b/source/blender/makesrna/intern/rna_world.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/makesrna/intern/rna_world.c
+ * \ingroup RNA
+ */
+
+
#include <float.h>
#include <stdlib.h>
@@ -286,7 +291,7 @@ static void rna_def_lighting(BlenderRNA *brna)
prop= RNA_def_property(srna, "indirect_bounces", PROP_INT, PROP_UNSIGNED);
RNA_def_property_int_sdna(prop, NULL, "ao_indirect_bounces");
RNA_def_property_range(prop, 1, SHRT_MAX);
- RNA_def_property_ui_text(prop, "Bounces", "Number of indirect diffuse light bounces to use for approximate ambient occlusion");
+ RNA_def_property_ui_text(prop, "Bounces", "Number of indirect diffuse light bounces");
RNA_def_property_update(prop, 0, "rna_World_update");
/* gathering parameters */
@@ -299,7 +304,7 @@ static void rna_def_lighting(BlenderRNA *brna)
prop= RNA_def_property(srna, "passes", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "ao_approx_passes");
RNA_def_property_range(prop, 0, 10);
- RNA_def_property_ui_text(prop, "Passes", "Number of preprocessing passes to reduce overocclusion (for approximate ambient occlusion)");
+ RNA_def_property_ui_text(prop, "Passes", "Number of preprocessing passes to reduce overocclusion");
RNA_def_property_update(prop, 0, "rna_World_update");
prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
@@ -333,14 +338,14 @@ static void rna_def_lighting(BlenderRNA *brna)
prop= RNA_def_property(srna, "error_threshold", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ao_approx_error");
RNA_def_property_range(prop, 0.0001, 10);
- RNA_def_property_ui_text(prop, "Error Tolerance", "Low values are slower and higher quality (for Approximate)");
+ RNA_def_property_ui_text(prop, "Error Tolerance", "Low values are slower and higher quality");
RNA_def_property_update(prop, 0, "rna_World_update");
prop= RNA_def_property(srna, "correction", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "ao_approx_correction");
RNA_def_property_range(prop, 0, 1);
RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
- RNA_def_property_ui_text(prop, "Correction", "Ad-hoc correction for over-occlusion due to the approximation (for Approximate)");
+ RNA_def_property_ui_text(prop, "Correction", "Ad-hoc correction for over-occlusion due to the approximation");
RNA_def_property_update(prop, 0, "rna_World_update");
prop= RNA_def_property(srna, "use_falloff", PROP_BOOLEAN, PROP_NONE);
@@ -350,7 +355,7 @@ static void rna_def_lighting(BlenderRNA *brna)
prop= RNA_def_property(srna, "use_cache", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AOCACHE);
- RNA_def_property_ui_text(prop, "Pixel Cache", "Cache AO results in pixels and interpolate over neighbouring pixels for speedup (for Approximate)");
+ RNA_def_property_ui_text(prop, "Pixel Cache", "Cache AO results in pixels and interpolate over neighbouring pixels for speedup");
RNA_def_property_update(prop, 0, "rna_World_update");
prop= RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
@@ -568,4 +573,3 @@ void RNA_def_world(BlenderRNA *brna)
}
#endif
-
diff --git a/source/blender/modifiers/intern/MOD_armature.c b/source/blender/modifiers/intern/MOD_armature.c
index 097438cf5a2..27b10f7cbe4 100644
--- a/source/blender/modifiers/intern/MOD_armature.c
+++ b/source/blender/modifiers/intern/MOD_armature.c
@@ -194,15 +194,15 @@ ModifierTypeInfo modifierType_Armature = {
/* deformMatrices */ deformMatrices,
/* deformVertsEM */ deformVertsEM,
/* deformMatricesEM */ deformMatricesEM,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
+ /* freeData */ NULL,
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index 51fbfc54840..54b3d12ad01 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -548,19 +548,19 @@ ModifierTypeInfo modifierType_Array = {
| eModifierTypeFlag_AcceptsCVs,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* initData */ initData,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
- /* isDisabled */ 0,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormal */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c
index 8d34fdcb10e..b952e92de4e 100644
--- a/source/blender/modifiers/intern/MOD_bevel.c
+++ b/source/blender/modifiers/intern/MOD_bevel.c
@@ -137,19 +137,19 @@ ModifierTypeInfo modifierType_Bevel = {
| eModifierTypeFlag_EnableInEditmode,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_boolean.c b/source/blender/modifiers/intern/MOD_boolean.c
index d4be9d3d03a..ec6387f44af 100644
--- a/source/blender/modifiers/intern/MOD_boolean.c
+++ b/source/blender/modifiers/intern/MOD_boolean.c
@@ -34,6 +34,7 @@
* \ingroup modifiers
*/
+#include <stdio.h>
#include "DNA_object_types.h"
@@ -144,19 +145,19 @@ ModifierTypeInfo modifierType_Boolean = {
| eModifierTypeFlag_UsesPointCache,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ 0,
- /* initData */ 0,
+ /* applyModifierEM */ NULL,
+ /* initData */ NULL,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
+ /* freeData */ NULL,
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_build.c b/source/blender/modifiers/intern/MOD_build.c
index e2a54648623..b2817aa11ea 100644
--- a/source/blender/modifiers/intern/MOD_build.c
+++ b/source/blender/modifiers/intern/MOD_build.c
@@ -114,7 +114,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
} else {
frac = BKE_curframe(md->scene) - bmd->start / bmd->length;
}
- CLAMP(frac, 0.0, 1.0);
+ CLAMP(frac, 0.0f, 1.0f);
numFaces = dm->getNumTessFaces(dm) * frac;
numEdges = dm->getNumEdges(dm) * frac;
diff --git a/source/blender/modifiers/intern/MOD_cast.c b/source/blender/modifiers/intern/MOD_cast.c
index 68e9e173ee6..5cb352ef482 100644
--- a/source/blender/modifiers/intern/MOD_cast.c
+++ b/source/blender/modifiers/intern/MOD_cast.c
@@ -427,9 +427,9 @@ static void cuboid_do(
}
if (has_radius) {
- if (fabs(tmp_co[0]) > cmd->radius ||
- fabs(tmp_co[1]) > cmd->radius ||
- fabs(tmp_co[2]) > cmd->radius) continue;
+ if (fabsf(tmp_co[0]) > cmd->radius ||
+ fabsf(tmp_co[1]) > cmd->radius ||
+ fabsf(tmp_co[2]) > cmd->radius) continue;
}
for (j = 0; j < dvert[i].totweight; ++j) {
@@ -479,7 +479,7 @@ static void cuboid_do(
/* ok, now we know which coordinate of the vertex to use */
- if (fabs(tmp_co[coord]) < FLT_EPSILON) /* avoid division by zero */
+ if (fabsf(tmp_co[coord]) < FLT_EPSILON) /* avoid division by zero */
continue;
/* finally, this is the factor we wanted, to project the vertex
@@ -523,9 +523,9 @@ static void cuboid_do(
}
if (has_radius) {
- if (fabs(tmp_co[0]) > cmd->radius ||
- fabs(tmp_co[1]) > cmd->radius ||
- fabs(tmp_co[2]) > cmd->radius) continue;
+ if (fabsf(tmp_co[0]) > cmd->radius ||
+ fabsf(tmp_co[1]) > cmd->radius ||
+ fabsf(tmp_co[2]) > cmd->radius) continue;
}
octant = 0;
@@ -550,7 +550,7 @@ static void cuboid_do(
coord = 2;
}
- if (fabs(tmp_co[coord]) < FLT_EPSILON)
+ if (fabsf(tmp_co[coord]) < FLT_EPSILON)
continue;
fbb = apex[coord] / tmp_co[coord];
@@ -624,18 +624,18 @@ ModifierTypeInfo modifierType_Cast = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
+ /* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
+ /* freeData */ NULL,
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_cloth.c b/source/blender/modifiers/intern/MOD_cloth.c
index 999349dca7f..30ddb3f7b9c 100644
--- a/source/blender/modifiers/intern/MOD_cloth.c
+++ b/source/blender/modifiers/intern/MOD_cloth.c
@@ -201,19 +201,19 @@ ModifierTypeInfo modifierType_Cloth = {
| eModifierTypeFlag_Single,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ 0,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ freeData,
- /* isDisabled */ 0,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_collision.c b/source/blender/modifiers/intern/MOD_collision.c
index 07b35cdf334..315361ff227 100644
--- a/source/blender/modifiers/intern/MOD_collision.c
+++ b/source/blender/modifiers/intern/MOD_collision.c
@@ -64,7 +64,7 @@ static void initData(ModifierData *md)
collmd->current_x = NULL;
collmd->current_xnew = NULL;
collmd->current_v = NULL;
- collmd->time = -1000;
+ collmd->time_x = collmd->time_xnew = -1000;
collmd->numverts = 0;
collmd->bvhtree = NULL;
}
@@ -95,7 +95,7 @@ static void freeData(ModifierData *md)
collmd->current_x = NULL;
collmd->current_xnew = NULL;
collmd->current_v = NULL;
- collmd->time = -1000;
+ collmd->time_x = collmd->time_xnew = -1000;
collmd->numverts = 0;
collmd->bvhtree = NULL;
collmd->mfaces = NULL;
@@ -139,11 +139,11 @@ static void deformVerts(ModifierData *md, Object *ob,
current_time = BKE_curframe(md->scene);
if(G.rt > 0)
- printf("current_time %f, collmd->time %f\n", current_time, collmd->time);
+ printf("current_time %f, collmd->time_xnew %f\n", current_time, collmd->time_xnew);
numverts = dm->getNumVerts ( dm );
- if((current_time > collmd->time)|| (BKE_ptcache_get_continue_physics()))
+ if((current_time > collmd->time_xnew)|| (BKE_ptcache_get_continue_physics()))
{
unsigned int i;
@@ -151,7 +151,7 @@ static void deformVerts(ModifierData *md, Object *ob,
if(collmd->x && (numverts != collmd->numverts))
freeData((ModifierData *)collmd);
- if(collmd->time == -1000) // first time
+ if(collmd->time_xnew == -1000) // first time
{
collmd->x = dm->dupVertArray(dm); // frame start position
@@ -174,7 +174,7 @@ static void deformVerts(ModifierData *md, Object *ob,
// create bounding box hierarchy
collmd->bvhtree = bvhtree_build_from_mvert(collmd->mfaces, collmd->numfaces, collmd->x, numverts, ob->pd->pdef_sboft);
- collmd->time = current_time;
+ collmd->time_x = collmd->time_xnew = current_time;
}
else if(numverts == collmd->numverts)
{
@@ -182,6 +182,7 @@ static void deformVerts(ModifierData *md, Object *ob,
tempVert = collmd->x;
collmd->x = collmd->xnew;
collmd->xnew = tempVert;
+ collmd->time_x = collmd->time_xnew;
memcpy(collmd->xnew, dm->getVertArray(dm), numverts*sizeof(MVert));
@@ -216,7 +217,7 @@ static void deformVerts(ModifierData *md, Object *ob,
bvhtree_update_from_mvert ( collmd->bvhtree, collmd->mfaces, collmd->numfaces, collmd->current_x, collmd->current_xnew, collmd->numverts, 1 );
}
- collmd->time = current_time;
+ collmd->time_xnew = current_time;
}
else if(numverts != collmd->numverts)
{
@@ -224,7 +225,7 @@ static void deformVerts(ModifierData *md, Object *ob,
}
}
- else if(current_time < collmd->time)
+ else if(current_time < collmd->time_xnew)
{
freeData((ModifierData *)collmd);
}
@@ -250,20 +251,20 @@ ModifierTypeInfo modifierType_Collision = {
/* flags */ eModifierTypeFlag_AcceptsMesh
| eModifierTypeFlag_Single,
- /* copyData */ 0,
+ /* copyData */ NULL,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
- /* requiredDataMask */ 0,
+ /* requiredDataMask */ NULL,
/* freeData */ freeData,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
/* dependsOnTime */ dependsOnTime,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_curve.c b/source/blender/modifiers/intern/MOD_curve.c
index 8b8273aab62..da793287520 100644
--- a/source/blender/modifiers/intern/MOD_curve.c
+++ b/source/blender/modifiers/intern/MOD_curve.c
@@ -148,18 +148,18 @@ ModifierTypeInfo modifierType_Curve = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
+ /* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
+ /* freeData */ NULL,
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_decimate.c b/source/blender/modifiers/intern/MOD_decimate.c
index 4eae988f92f..22c43d5e46a 100644
--- a/source/blender/modifiers/intern/MOD_decimate.c
+++ b/source/blender/modifiers/intern/MOD_decimate.c
@@ -208,19 +208,19 @@ ModifierTypeInfo modifierType_Decimate = {
/* type */ eModifierTypeType_Nonconstructive,
/* flags */ eModifierTypeFlag_AcceptsMesh,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ 0,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_displace.c b/source/blender/modifiers/intern/MOD_displace.c
index 6ae5c14d5ef..3ac615d2fc7 100644
--- a/source/blender/modifiers/intern/MOD_displace.c
+++ b/source/blender/modifiers/intern/MOD_displace.c
@@ -362,14 +362,14 @@ ModifierTypeInfo modifierType_Displace = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
+ /* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
+ /* freeData */ NULL,
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index bbb314cc085..c98905a8be1 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -323,10 +323,189 @@ DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd)
vu = etags[ml->e].v1user;
vu2 = etags[ml->e].v2user;
+<<<<<<< .working
if (vu)
medge[ml->e].v1 = vu->v;
if (vu2)
medge[ml->e].v2 = vu2->v;
+=======
+/* finds another sharp edge which uses vert, by traversing faces around the
+ * vert until it does one of the following:
+ * - hits a loose edge (the edge is returned)
+ * - hits a sharp edge (the edge is returned)
+ * - returns to the start edge (NULL is returned)
+ */
+static SmoothEdge *find_other_sharp_edge(SmoothVert *vert, SmoothEdge *edge, LinkNode **visited_faces)
+{
+ SmoothFace *face = NULL;
+ SmoothEdge *edge2 = NULL;
+ /* holds the edges we've seen so we can avoid looping indefinitely */
+ LinkNode *visited_edges = NULL;
+#ifdef EDGESPLIT_DEBUG_1
+ printf("=== START === find_other_sharp_edge(edge = %4d, vert = %4d)\n",
+ edge->newIndex, vert->newIndex);
+#endif
+
+ /* get a face on which to start */
+ if(edge->faces) face = edge->faces->link;
+ else return NULL;
+
+ /* record this edge as visited */
+ BLI_linklist_prepend(&visited_edges, edge);
+
+ /* get the next edge */
+ edge2 = other_edge(face, vert, edge);
+
+ /* record this face as visited */
+ if(visited_faces)
+ BLI_linklist_prepend(visited_faces, face);
+
+ /* search until we hit a loose edge or a sharp edge or an edge we've
+ * seen before
+ */
+ while(face && !edge_is_sharp(edge2)
+ && !linklist_contains(visited_edges, edge2)) {
+#ifdef EDGESPLIT_DEBUG_3
+ printf("current face %4d; current edge %4d\n", face->newIndex,
+ edge2->newIndex);
+#endif
+ /* get the next face */
+ face = other_face(edge2, face);
+
+ /* if face == NULL, edge2 is a loose edge */
+ if(face) {
+ /* record this face as visited */
+ if(visited_faces)
+ BLI_linklist_prepend(visited_faces, face);
+
+ /* record this edge as visited */
+ BLI_linklist_prepend(&visited_edges, edge2);
+
+ /* get the next edge */
+ edge2 = other_edge(face, vert, edge2);
+#ifdef EDGESPLIT_DEBUG_3
+ printf("next face %4d; next edge %4d\n",
+ face->newIndex, edge2->newIndex);
+ } else {
+ printf("loose edge: %4d\n", edge2->newIndex);
+#endif
+ }
+ }
+
+ /* either we came back to the start edge or we found a sharp/loose edge */
+ if(linklist_contains(visited_edges, edge2))
+ /* we came back to the start edge */
+ edge2 = NULL;
+
+ BLI_linklist_free(visited_edges, NULL);
+
+#ifdef EDGESPLIT_DEBUG_1
+ printf("=== END === find_other_sharp_edge(edge = %4d, vert = %4d), "
+ "returning edge %d\n",
+ edge->newIndex, vert->newIndex, edge2 ? edge2->newIndex : -1);
+#endif
+ return edge2;
+}
+
+static void split_single_vert(SmoothVert *vert, SmoothFace *face,
+ SmoothMesh *mesh)
+{
+ SmoothVert *copy_vert;
+ ReplaceData repdata;
+
+ copy_vert = smoothvert_copy(vert, mesh);
+
+ if(copy_vert == NULL) {
+ /* bug [#26316], this prevents a segfault
+ * but this still needs fixing */
+ return;
+ }
+
+ repdata.find = vert;
+ repdata.replace = copy_vert;
+ face_replace_vert(face, &repdata);
+}
+
+typedef struct PropagateEdge {
+ struct PropagateEdge *next, *prev;
+ SmoothEdge *edge;
+ SmoothVert *vert;
+} PropagateEdge;
+
+static void push_propagate_stack(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh)
+{
+ PropagateEdge *pedge = mesh->reusestack.first;
+
+ if(pedge) {
+ BLI_remlink(&mesh->reusestack, pedge);
+ }
+ else {
+ if(!mesh->arena) {
+ mesh->arena = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "edgesplit arena");
+ BLI_memarena_use_calloc(mesh->arena);
+ }
+
+ pedge = BLI_memarena_alloc(mesh->arena, sizeof(PropagateEdge));
+ }
+
+ pedge->edge = edge;
+ pedge->vert = vert;
+ BLI_addhead(&mesh->propagatestack, pedge);
+}
+
+static void pop_propagate_stack(SmoothEdge **edge, SmoothVert **vert, SmoothMesh *mesh)
+{
+ PropagateEdge *pedge = mesh->propagatestack.first;
+
+ if(pedge) {
+ *edge = pedge->edge;
+ *vert = pedge->vert;
+ BLI_remlink(&mesh->propagatestack, pedge);
+ BLI_addhead(&mesh->reusestack, pedge);
+ }
+ else {
+ *edge = NULL;
+ *vert = NULL;
+ }
+}
+
+static void split_edge(SmoothEdge *edge, SmoothVert *vert, SmoothMesh *mesh);
+
+static void propagate_split(SmoothEdge *edge, SmoothVert *vert,
+ SmoothMesh *mesh)
+{
+ SmoothEdge *edge2;
+ LinkNode *visited_faces = NULL;
+#ifdef EDGESPLIT_DEBUG_1
+ printf("=== START === propagate_split(edge = %4d, vert = %4d)\n",
+ edge->newIndex, vert->newIndex);
+#endif
+
+ edge2 = find_other_sharp_edge(vert, edge, &visited_faces);
+
+ if(!edge2) {
+ /* didn't find a sharp or loose edge, so we've hit a dead end */
+ } else if(!edge_is_loose(edge2)) {
+ /* edge2 is not loose, so it must be sharp */
+ if(edge_is_loose(edge)) {
+ /* edge is loose, so we can split edge2 at this vert */
+ split_edge(edge2, vert, mesh);
+ } else if(edge_is_sharp(edge)) {
+ /* both edges are sharp, so we can split the pair at vert */
+ split_edge(edge, vert, mesh);
+ } else {
+ /* edge is not sharp, so try to split edge2 at its other vert */
+ split_edge(edge2, other_vert(edge2, vert), mesh);
+ }
+ } else { /* edge2 is loose */
+ if(edge_is_loose(edge)) {
+ SmoothVert *vert2;
+ ReplaceData repdata;
+
+ /* can't split edge, what should we do with vert? */
+ if(linklist_subset(vert->faces, visited_faces)) {
+ /* vert has only one fan of faces attached; don't split it */
+>>>>>>> .merge-right.r36153
} else {
etags[ml->e].used = 1;
@@ -384,7 +563,6 @@ DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd)
return cddm;
}
-
static void initData(ModifierData *md)
{
EdgeSplitModifierData *emd = (EdgeSplitModifierData*) md;
@@ -447,19 +625,19 @@ ModifierTypeInfo modifierType_EdgeSplit = {
| eModifierTypeFlag_EnableInEditmode,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* initData */ initData,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
- /* dependsOnTime */ 0,
- /* dependsOnNormal */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_explode.c b/source/blender/modifiers/intern/MOD_explode.c
index 04687958efd..f448331d37f 100644
--- a/source/blender/modifiers/intern/MOD_explode.c
+++ b/source/blender/modifiers/intern/MOD_explode.c
@@ -62,7 +62,7 @@ static void initData(ModifierData *md)
{
ExplodeModifierData *emd= (ExplodeModifierData*) md;
- emd->facepa=0;
+ emd->facepa= NULL;
emd->flag |= eExplodeFlag_Unborn+eExplodeFlag_Alive+eExplodeFlag_Dead;
}
static void freeData(ModifierData *md)
@@ -76,7 +76,7 @@ static void copyData(ModifierData *md, ModifierData *target)
ExplodeModifierData *emd= (ExplodeModifierData*) md;
ExplodeModifierData *temd= (ExplodeModifierData*) target;
- temd->facepa = 0;
+ temd->facepa = NULL;
temd->flag = emd->flag;
temd->protect = emd->protect;
temd->vgroup = emd->vgroup;
@@ -101,12 +101,12 @@ static void createFacepa(ExplodeModifierData *emd,
DerivedMesh *dm)
{
ParticleSystem *psys=psmd->psys;
- MFace *fa=0, *mface=0;
- MVert *mvert = 0;
+ MFace *fa=NULL, *mface=NULL;
+ MVert *mvert = NULL;
ParticleData *pa;
KDTree *tree;
float center[3], co[3];
- int *facepa=0,*vertpa=0,totvert=0,totface=0,totpart=0;
+ int *facepa=NULL,*vertpa=NULL,totvert=0,totface=0,totpart=0;
int i,p,v1,v2,v3,v4=0;
mvert = dm->getVertArray(dm);
@@ -148,7 +148,7 @@ static void createFacepa(ExplodeModifierData *emd,
/* make tree of emitter locations */
tree=BLI_kdtree_new(totpart);
for(p=0,pa=psys->particles; p<totpart; p++,pa++){
- psys_particle_on_dm(psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0,0,0);
+ psys_particle_on_emitter(psmd,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,NULL,NULL,NULL,NULL,NULL);
BLI_kdtree_insert(tree, p, co, NULL);
}
BLI_kdtree_balance(tree);
@@ -191,14 +191,14 @@ static int edgecut_get(EdgeHash *edgehash, int v1, int v2)
}
-const short add_faces[24] = {
+static const short add_faces[24] = {
0,
0, 0, 2, 0, 1, 2, 2, 0, 2, 1,
2, 2, 2, 2, 3, 0, 0, 0, 1, 0,
1, 1, 2
};
-MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFace *mf)
+static MFace *get_dface(DerivedMesh *dm, DerivedMesh *split, int cur, int i, MFace *mf)
{
MFace *df = CDDM_get_tessface(split, cur);
DM_copy_face_data(dm, split, i, cur, 1);
@@ -518,14 +518,13 @@ static void remap_faces_23(DerivedMesh *dm, DerivedMesh *split, MFace *mf, int *
static void remap_uvs_23(DerivedMesh *dm, DerivedMesh *split, int numlayer, int i, int cur, int c0, int c1, int c2)
{
- MTFace *mf, *df1, *df2, *df3;
+ MTFace *mf, *df1, *df2;
int l;
for(l=0; l<numlayer; l++) {
mf = CustomData_get_layer_n(&split->faceData, CD_MTFACE, l);
df1 = mf+cur;
df2 = df1 + 1;
- df3 = df1 + 2;
mf = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, l);
mf += i;
@@ -779,14 +778,14 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
DerivedMesh *to_explode)
{
DerivedMesh *explode, *dm=to_explode;
- MFace *mf=0, *mface;
+ MFace *mf= NULL, *mface;
ParticleSettings *part=psmd->psys->part;
- ParticleSimulationData sim= {0};
+ ParticleSimulationData sim= {NULL};
ParticleData *pa=NULL, *pars=psmd->psys->particles;
ParticleKey state;
EdgeHash *vertpahash;
EdgeHashIterator *ehi;
- float *vertco=0, imat[4][4];
+ float *vertco= NULL, imat[4][4];
float loc0[3], nor[3];
float cfra;
/* float timestep; */
@@ -873,7 +872,7 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
pa= pars+i;
/* get particle state */
- psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc0,nor,0,0,0,0);
+ psys_particle_on_emitter(psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc0,nor,NULL,NULL,NULL,NULL);
mul_m4_v3(ob->obmat,loc0);
state.time=cfra;
@@ -967,7 +966,7 @@ static DerivedMesh * explodeMesh(ExplodeModifierData *emd,
static ParticleSystemModifierData * findPrecedingParticlesystem(Object *ob, ModifierData *emd)
{
ModifierData *md;
- ParticleSystemModifierData *psmd=0;
+ ParticleSystemModifierData *psmd= NULL;
for (md=ob->modifiers.first; emd!=md; md=md->next){
if(md->type==eModifierType_ParticleSystem)
@@ -987,12 +986,12 @@ static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
if(psmd){
ParticleSystem * psys=psmd->psys;
- if(psys==0 || psys->totpart==0) return derivedData;
- if(psys->part==0 || psys->particles==0) return derivedData;
- if(psmd->dm==0) return derivedData;
+ if(psys==NULL || psys->totpart==0) return derivedData;
+ if(psys->part==NULL || psys->particles==NULL) return derivedData;
+ if(psmd->dm==NULL) return derivedData;
/* 1. find faces to be exploded if needed */
- if(emd->facepa==0
+ if(emd->facepa == NULL
|| psmd->flag&eParticleSystemFlag_Pars
|| emd->flag&eExplodeFlag_CalcFaces
|| MEM_allocN_len(emd->facepa)/sizeof(int) != dm->getNumTessFaces(dm))
@@ -1030,19 +1029,19 @@ ModifierTypeInfo modifierType_Explode = {
/* type */ eModifierTypeType_Nonconstructive,
/* flags */ eModifierTypeFlag_AcceptsMesh,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ 0,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ freeData,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
/* dependsOnTime */ dependsOnTime,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_fluidsim.c b/source/blender/modifiers/intern/MOD_fluidsim.c
index 1cce9863ccc..354dc33ffe0 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim.c
+++ b/source/blender/modifiers/intern/MOD_fluidsim.c
@@ -147,19 +147,19 @@ ModifierTypeInfo modifierType_Fluidsim = {
| eModifierTypeFlag_Single,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ 0,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
- /* requiredDataMask */ 0,
+ /* requiredDataMask */ NULL,
/* freeData */ freeData,
- /* isDisabled */ 0,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_hook.c b/source/blender/modifiers/intern/MOD_hook.c
index dae1ac0cac6..7f79f74e7b6 100644
--- a/source/blender/modifiers/intern/MOD_hook.c
+++ b/source/blender/modifiers/intern/MOD_hook.c
@@ -136,8 +136,8 @@ static float hook_falloff(float *co_1, float *co_2, const float falloff_squared,
if(len_squared > falloff_squared) {
return 0.0f;
}
- else if(len_squared > 0.0) {
- return fac * (1.0 - (len_squared / falloff_squared));
+ else if(len_squared > 0.0f) {
+ return fac * (1.0f - (len_squared / falloff_squared));
}
}
@@ -289,18 +289,18 @@ ModifierTypeInfo modifierType_Hook = {
| eModifierTypeFlag_SupportsEditmode,
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
+ /* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ freeData,
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_lattice.c b/source/blender/modifiers/intern/MOD_lattice.c
index 8d57846f335..0d7c0f1509c 100644
--- a/source/blender/modifiers/intern/MOD_lattice.c
+++ b/source/blender/modifiers/intern/MOD_lattice.c
@@ -142,18 +142,18 @@ ModifierTypeInfo modifierType_Lattice = {
| eModifierTypeFlag_SupportsEditmode,
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
+ /* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
- /* initData */ 0,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
+ /* initData */ NULL,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
+ /* freeData */ NULL,
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_mask.c b/source/blender/modifiers/intern/MOD_mask.c
index 7b969f9322e..6f0bb27b208 100644
--- a/source/blender/modifiers/intern/MOD_mask.c
+++ b/source/blender/modifiers/intern/MOD_mask.c
@@ -408,19 +408,19 @@ ModifierTypeInfo modifierType_Mask = {
/* flags */ eModifierTypeFlag_AcceptsMesh|eModifierTypeFlag_SupportsMapping|eModifierTypeFlag_SupportsEditmode,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ 0,
- /* initData */ 0,
+ /* applyModifierEM */ NULL,
+ /* initData */ NULL,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
- /* isDisabled */ 0,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_meshdeform.c b/source/blender/modifiers/intern/MOD_meshdeform.c
index a34eff6120c..890121fdd44 100644
--- a/source/blender/modifiers/intern/MOD_meshdeform.c
+++ b/source/blender/modifiers/intern/MOD_meshdeform.c
@@ -377,7 +377,7 @@ static void deformVertsEM(ModifierData *md, Object *ob,
dm->release(dm);
}
-#define MESHDEFORM_MIN_INFLUENCE 0.00001
+#define MESHDEFORM_MIN_INFLUENCE 0.00001f
void modifier_mdef_compact_influences(ModifierData *md)
{
@@ -450,18 +450,18 @@ ModifierTypeInfo modifierType_MeshDeform = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
+ /* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ freeData,
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_mirror.c b/source/blender/modifiers/intern/MOD_mirror.c
index 79cc541f35b..22fba3ceb35 100644
--- a/source/blender/modifiers/intern/MOD_mirror.c
+++ b/source/blender/modifiers/intern/MOD_mirror.c
@@ -309,19 +309,19 @@ ModifierTypeInfo modifierType_Mirror = {
| eModifierTypeFlag_AcceptsCVs,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* initData */ initData,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
- /* isDisabled */ 0,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormal */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c
index 8159865b977..7296271eeb0 100644
--- a/source/blender/modifiers/intern/MOD_multires.c
+++ b/source/blender/modifiers/intern/MOD_multires.c
@@ -115,19 +115,19 @@ ModifierTypeInfo modifierType_Multires = {
| eModifierTypeFlag_RequiresOriginalData,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
- /* applyModifierEM */ 0,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_none.c b/source/blender/modifiers/intern/MOD_none.c
index bebb9b58774..489733c8480 100644
--- a/source/blender/modifiers/intern/MOD_none.c
+++ b/source/blender/modifiers/intern/MOD_none.c
@@ -38,8 +38,7 @@
* \ingroup modifiers
*/
-
-
+#include <stdio.h>
#include "BLI_utildefines.h"
@@ -62,20 +61,20 @@ ModifierTypeInfo modifierType_None = {
/* flags */ eModifierTypeFlag_AcceptsMesh
| eModifierTypeFlag_AcceptsCVs,
- /* copyData */ 0,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
- /* initData */ 0,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
+ /* copyData */ NULL,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
+ /* initData */ NULL,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
/* isDisabled */ isDisabled,
- /* updateDepgraph */ 0,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_particleinstance.c b/source/blender/modifiers/intern/MOD_particleinstance.c
index 92c8b089360..a2aa0e47e54 100644
--- a/source/blender/modifiers/intern/MOD_particleinstance.c
+++ b/source/blender/modifiers/intern/MOD_particleinstance.c
@@ -115,8 +115,8 @@ static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
DerivedMesh *dm = derivedData, *result;
ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md;
ParticleSimulationData sim;
- ParticleSystem * psys=0;
- ParticleData *pa=0, *pars=0;
+ ParticleSystem *psys= NULL;
+ ParticleData *pa= NULL, *pars= NULL;
MFace *mface, *orig_mface;
MVert *mvert, *orig_mvert;
int i,totvert, totpart=0, totface, maxvert, maxface, first_particle=0;
@@ -127,13 +127,13 @@ static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
trackneg=((ob->trackflag>2)?1:0);
if(pimd->ob==ob){
- pimd->ob=0;
+ pimd->ob= NULL;
return derivedData;
}
if(pimd->ob){
psys = BLI_findlink(&pimd->ob->particlesystem,pimd->psys-1);
- if(psys==0 || psys->totpart==0)
+ if(psys==NULL || psys->totpart==0)
return derivedData;
}
else return derivedData;
@@ -236,7 +236,7 @@ static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
normalize_v3(state.vel);
/* TODO: incremental rotations somehow */
- if(state.vel[axis] < -0.9999 || state.vel[axis] > 0.9999) {
+ if(state.vel[axis] < -0.9999f || state.vel[axis] > 0.9999f) {
state.rot[0] = 1;
state.rot[1] = state.rot[2] = state.rot[3] = 0.0f;
}
@@ -274,7 +274,7 @@ static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
if(psys->part->childtype==PART_CHILD_PARTICLES)
pa=psys->particles+(psys->child+i/totface-psys->totpart)->parent;
else
- pa=0;
+ pa= NULL;
}
else
pa=pars+i/totface;
@@ -283,7 +283,7 @@ static DerivedMesh * applyModifier(ModifierData *md, Object *ob,
if(psys->part->childtype==PART_CHILD_PARTICLES)
pa=psys->particles+(psys->child+i/totface)->parent;
else
- pa=0;
+ pa= NULL;
}
if(pa){
@@ -339,19 +339,19 @@ ModifierTypeInfo modifierType_ParticleInstance = {
| eModifierTypeFlag_EnableInEditmode,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* initData */ initData,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
- /* isDisabled */ 0,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
- /* dependsOnNormals */ 0,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_particlesystem.c b/source/blender/modifiers/intern/MOD_particlesystem.c
index 80c96fd8553..7ab23cfd27b 100644
--- a/source/blender/modifiers/intern/MOD_particlesystem.c
+++ b/source/blender/modifiers/intern/MOD_particlesystem.c
@@ -35,7 +35,7 @@
*/
-#include "stddef.h"
+#include <stddef.h>
#include "DNA_material_types.h"
@@ -53,8 +53,8 @@
static void initData(ModifierData *md)
{
ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
- psmd->psys= 0;
- psmd->dm=0;
+ psmd->psys= NULL;
+ psmd->dm= NULL;
psmd->totdmvert= psmd->totdmedge= psmd->totdmface= 0;
}
static void freeData(ModifierData *md)
@@ -64,7 +64,7 @@ static void freeData(ModifierData *md)
if(psmd->dm){
psmd->dm->needsFree = 1;
psmd->dm->release(psmd->dm);
- psmd->dm=0;
+ psmd->dm = NULL;
}
/* ED_object_modifier_remove may have freed this first before calling
@@ -77,7 +77,7 @@ static void copyData(ModifierData *md, ModifierData *target)
ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
ParticleSystemModifierData *tpsmd= (ParticleSystemModifierData*) target;
- tpsmd->dm = 0;
+ tpsmd->dm = NULL;
tpsmd->totdmvert = tpsmd->totdmedge = tpsmd->totdmface = 0;
//tpsmd->facepa = 0;
tpsmd->flag = psmd->flag;
@@ -101,7 +101,7 @@ static CustomDataMask requiredDataMask(Object *UNUSED(ob), ModifierData *md)
dataMask |= CD_MASK_MTFACE;
}
- if(psmd->psys->part->tanfac!=0.0)
+ if(psmd->psys->part->tanfac != 0.0f)
dataMask |= CD_MASK_MTFACE;
/* ask for vertexgroups if we need them */
@@ -131,7 +131,7 @@ static void deformVerts(ModifierData *md, Object *ob,
{
DerivedMesh *dm = derivedData;
ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
- ParticleSystem * psys=0;
+ ParticleSystem * psys= NULL;
int needsFree=0;
if(ob->particlesystem.first)
@@ -142,7 +142,7 @@ static void deformVerts(ModifierData *md, Object *ob,
if(!psys_check_enabled(ob, psys))
return;
- if(dm==0) {
+ if(dm==NULL) {
dm= get_dm(ob, NULL, NULL, vertexCos, 1);
if(!dm)
@@ -228,18 +228,18 @@ ModifierTypeInfo modifierType_ParticleSystem = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformVertsEM */ 0 /* deformVertsEM */ ,
- /* deformMatrices */ 0,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformVertsEM */ NULL /* deformVertsEM */ ,
+ /* deformMatrices */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
/* freeData */ freeData,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_screw.c b/source/blender/modifiers/intern/MOD_screw.c
index 68ad5437585..db7482b79ee 100644
--- a/source/blender/modifiers/intern/MOD_screw.c
+++ b/source/blender/modifiers/intern/MOD_screw.c
@@ -272,7 +272,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
/* will the screw be closed?
* Note! smaller then FLT_EPSILON*100 gives problems with float precision so its never closed. */
- if (fabs(screw_ofs) <= (FLT_EPSILON*100) && fabs(fabs(angle) - (M_PI * 2)) <= (FLT_EPSILON*100)) {
+ if (fabsf(screw_ofs) <= (FLT_EPSILON*100.0f) && fabsf(fabsf(angle) - ((float)M_PI * 2.0f)) <= (FLT_EPSILON*100.0f)) {
close= 1;
step_tot--;
if(step_tot < 2) step_tot= 2;
@@ -892,19 +892,19 @@ ModifierTypeInfo modifierType_Screw = {
| eModifierTypeFlag_EnableInEditmode,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* initData */ initData,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
- /* isDisabled */ 0,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
- /* dependsOnNormals */ 0,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_shrinkwrap.c b/source/blender/modifiers/intern/MOD_shrinkwrap.c
index cfd12833a38..e1fc4bc969f 100644
--- a/source/blender/modifiers/intern/MOD_shrinkwrap.c
+++ b/source/blender/modifiers/intern/MOD_shrinkwrap.c
@@ -172,18 +172,18 @@ ModifierTypeInfo modifierType_Shrinkwrap = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
+ /* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
+ /* freeData */ NULL,
/* isDisabled */ isDisabled,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c
index 0150322ae8c..2e6d9350148 100644
--- a/source/blender/modifiers/intern/MOD_simpledeform.c
+++ b/source/blender/modifiers/intern/MOD_simpledeform.c
@@ -89,11 +89,11 @@ static void simpleDeform_stretch(const float factor, const float dcut[3], float
float x = co[0], y = co[1], z = co[2];
float scale;
- scale = (z*z*factor-factor + 1.0);
+ scale = (z*z*factor-factor + 1.0f);
co[0] = x*scale;
co[1] = y*scale;
- co[2] = z*(1.0+factor);
+ co[2] = z*(1.0f+factor);
if(dcut)
@@ -134,7 +134,7 @@ static void simpleDeform_bend(const float factor, const float dcut[3], float *co
sint = sin(theta);
cost = cos(theta);
- if(fabs(factor) > 1e-7f)
+ if(fabsf(factor) > 1e-7f)
{
co[0] = -(y-1.0f/factor)*sint;
co[1] = (y-1.0f/factor)*cost + 1.0f/factor;
@@ -168,8 +168,8 @@ static void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object
//Safe-check
if(smd->origin == ob) smd->origin = NULL; //No self references
- if(smd->limit[0] < 0.0) smd->limit[0] = 0.0f;
- if(smd->limit[0] > 1.0) smd->limit[0] = 1.0f;
+ if(smd->limit[0] < 0.0f) smd->limit[0] = 0.0f;
+ if(smd->limit[0] > 1.0f) smd->limit[0] = 1.0f;
smd->limit[0] = MIN2(smd->limit[0], smd->limit[1]); //Upper limit >= than lower limit
@@ -381,18 +381,18 @@ ModifierTypeInfo modifierType_SimpleDeform = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
+ /* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
- /* isDisabled */ 0,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
- /* foreachIDLink */ 0,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_smoke.c b/source/blender/modifiers/intern/MOD_smoke.c
index 46f0483dbff..d8e94e92bfa 100644
--- a/source/blender/modifiers/intern/MOD_smoke.c
+++ b/source/blender/modifiers/intern/MOD_smoke.c
@@ -35,7 +35,7 @@
*/
-#include "stddef.h"
+#include <stddef.h>
#include "MEM_guardedalloc.h"
@@ -147,6 +147,17 @@ static void updateDepgraph(ModifierData *md, DagForest *forest,
}
}
+static void foreachIDLink(ModifierData *md, Object *ob,
+ IDWalkFunc walk, void *userData)
+{
+ SmokeModifierData *smd = (SmokeModifierData*) md;
+
+ if(smd->type==MOD_SMOKE_TYPE_DOMAIN && smd->domain) {
+ walk(userData, ob, (ID **)&smd->domain->coll_group);
+ walk(userData, ob, (ID **)&smd->domain->fluid_group);
+ walk(userData, ob, (ID **)&smd->domain->eff_group);
+ }
+}
ModifierTypeInfo modifierType_Smoke = {
/* name */ "Smoke",
@@ -159,18 +170,18 @@ ModifierTypeInfo modifierType_Smoke = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
- /* requiredDataMask */ 0,
+ /* requiredDataMask */ NULL,
/* freeData */ freeData,
- /* isDisabled */ 0,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ foreachIDLink,
};
diff --git a/source/blender/modifiers/intern/MOD_smooth.c b/source/blender/modifiers/intern/MOD_smooth.c
index 526b54d1cf8..5f76fad14b1 100644
--- a/source/blender/modifiers/intern/MOD_smooth.c
+++ b/source/blender/modifiers/intern/MOD_smooth.c
@@ -142,9 +142,7 @@ static void smoothModifier_do(
v1 = vertexCos[idx1];
v2 = vertexCos[idx2];
- fvec[0] = (v1[0] + v2[0]) / 2.0;
- fvec[1] = (v1[1] + v2[1]) / 2.0;
- fvec[2] = (v1[2] + v2[2]) / 2.0;
+ mid_v3_v3v3(fvec, v1, v2);
v1 = &ftmp[idx1*3];
v2 = &ftmp[idx2*3];
@@ -261,18 +259,18 @@ ModifierTypeInfo modifierType_Smooth = {
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
+ /* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
+ /* freeData */ NULL,
/* isDisabled */ isDisabled,
- /* updateDepgraph */ 0,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_softbody.c b/source/blender/modifiers/intern/MOD_softbody.c
index 0abf2fa6281..25996286735 100644
--- a/source/blender/modifiers/intern/MOD_softbody.c
+++ b/source/blender/modifiers/intern/MOD_softbody.c
@@ -34,12 +34,12 @@
* \ingroup modifiers
*/
+#include <stdio.h>
#include "DNA_scene_types.h"
#include "BLI_utildefines.h"
-
#include "BKE_cdderivedmesh.h"
#include "BKE_particle.h"
#include "BKE_softbody.h"
@@ -71,20 +71,20 @@ ModifierTypeInfo modifierType_Softbody = {
| eModifierTypeFlag_RequiresOriginalData
| eModifierTypeFlag_Single,
- /* copyData */ 0,
+ /* copyData */ NULL,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
- /* initData */ 0,
- /* requiredDataMask */ 0,
- /* freeData */ 0,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
+ /* initData */ NULL,
+ /* requiredDataMask */ NULL,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
/* dependsOnTime */ dependsOnTime,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_solidify.c b/source/blender/modifiers/intern/MOD_solidify.c
index f3c99bf9e3e..c591272c9c4 100644
--- a/source/blender/modifiers/intern/MOD_solidify.c
+++ b/source/blender/modifiers/intern/MOD_solidify.c
@@ -211,6 +211,11 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
int numLoops=0, newLoops=0, newFaces=0, newEdges=0;
int j;
+ /* only use material offsets if we have 2 or more materials */
+ const short mat_nr_max= ob->totcol > 1 ? ob->totcol - 1 : 0;
+ const short mat_ofs= mat_nr_max ? smd->mat_ofs : 0;
+ const short mat_ofs_rim= mat_nr_max ? smd->mat_ofs_rim : 0;
+
/* use for edges */
int *new_vert_arr= NULL;
BLI_array_declare(new_vert_arr);
@@ -355,6 +360,11 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
for (j=0; j<mp->totloop; j++) {
CustomData_copy_data(&dm->loopData, &result->loopData, mp->loopstart+j,
mp->loopstart+(mp->totloop-j-1)+dm->numLoopData, 1);
+
+ if(mat_ofs) {
+ mp->mat_nr += mat_ofs;
+ CLAMP(mp->mat_nr, 0, mat_nr_max);
+ }
}
e = ml2[0].e;
@@ -526,9 +536,6 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
float (*edge_vert_nos)[3]= MEM_callocN(sizeof(float) * numVerts * 3, "solidify_edge_nos");
float nor[3];
#endif
- /* maximum value -1, so we have room to increase */
- const short mat_nr_shift= (smd->flag & MOD_SOLIDIFY_RIM_MATERIAL) ? ob->totcol-1 : -1;
-
const unsigned char crease_rim= smd->crease_rim * 255.0f;
const unsigned char crease_outer= smd->crease_outer * 255.0f;
const unsigned char crease_inner= smd->crease_inner * 255.0f;
@@ -629,15 +636,17 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
ml[j++].e = numEdges*2 + old_vert_arr[ed->v1];
}
- /* use the next material index if option enabled */
- if(mp->mat_nr < mat_nr_shift)
- mp->mat_nr++;
-
- if(crease_outer)
- ed->crease= crease_outer;
-
+ if(crease_outer) {
+ /* crease += crease_outer; without wrapping */
+ unsigned char *cr= (unsigned char *)&(medge[numEdges + eidx].crease);
+ int tcr= *cr + crease_outer;
+ *cr= tcr > 255 ? 255 : tcr;
+ }
if(crease_inner) {
- medge[numEdges + eidx].crease= crease_inner;
+ /* crease += crease_inner; without wrapping */
+ unsigned char *cr= (unsigned char *)&(medge[numEdges + eidx].crease);
+ int tcr= *cr + crease_inner;
+ *cr= tcr > 255 ? 255 : tcr;
}
#ifdef SOLIDIFY_SIDE_NORMALS
@@ -678,8 +687,14 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
if (old_vert_arr)
MEM_freeN(old_vert_arr);
+
CDDM_recalc_tesselation(result, 1);
+ /* must recalculate normals with vgroups since they can displace unevenly [#26888] */
+ if(dvert) {
+ CDDM_calc_normals(result);
+ }
+
return result;
}
@@ -687,7 +702,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
static DerivedMesh *applyModifierEM(ModifierData *md,
Object *ob,
- struct EditMesh *UNUSED(editData),
+ struct BMEditMesh *UNUSED(editData),
DerivedMesh *derivedData)
{
return applyModifier(md, ob, derivedData, 0, 1);
diff --git a/source/blender/modifiers/intern/MOD_subsurf.c b/source/blender/modifiers/intern/MOD_subsurf.c
index 6d5477e5ec8..fa3d8ae9a33 100644
--- a/source/blender/modifiers/intern/MOD_subsurf.c
+++ b/source/blender/modifiers/intern/MOD_subsurf.c
@@ -35,7 +35,7 @@
*/
-#include "stddef.h"
+#include <stddef.h>
#include "DNA_scene_types.h"
#include "DNA_object_types.h"
@@ -137,19 +137,19 @@ ModifierTypeInfo modifierType_Subsurf = {
| eModifierTypeFlag_AcceptsCVs,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* initData */ initData,
- /* requiredDataMask */ 0,
+ /* requiredDataMask */ NULL,
/* freeData */ freeData,
/* isDisabled */ isDisabled,
- /* updateDepgraph */ 0,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* updateDepgraph */ NULL,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_surface.c b/source/blender/modifiers/intern/MOD_surface.c
index d229f75189f..05ecee6ab29 100644
--- a/source/blender/modifiers/intern/MOD_surface.c
+++ b/source/blender/modifiers/intern/MOD_surface.c
@@ -176,20 +176,20 @@ ModifierTypeInfo modifierType_Surface = {
/* flags */ eModifierTypeFlag_AcceptsMesh
| eModifierTypeFlag_NoUserAdd,
- /* copyData */ 0,
+ /* copyData */ NULL,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
- /* requiredDataMask */ 0,
+ /* requiredDataMask */ NULL,
/* freeData */ freeData,
- /* isDisabled */ 0,
- /* updateDepgraph */ 0,
+ /* isDisabled */ NULL,
+ /* updateDepgraph */ NULL,
/* dependsOnTime */ dependsOnTime,
- /* dependsOnNormals */ 0,
- /* foreachObjectLink */ 0,
- /* foreachIDLink */ 0,
+ /* dependsOnNormals */ NULL,
+ /* foreachObjectLink */ NULL,
+ /* foreachIDLink */ NULL,
};
diff --git a/source/blender/modifiers/intern/MOD_uvproject.c b/source/blender/modifiers/intern/MOD_uvproject.c
index 29bdde4d2f6..a6ff728af37 100644
--- a/source/blender/modifiers/intern/MOD_uvproject.c
+++ b/source/blender/modifiers/intern/MOD_uvproject.c
@@ -194,7 +194,7 @@ static DerivedMesh *uvprojectModifier_do(UVProjectModifierData *umd,
free_uci= 1;
}
else {
- float scale= (cam->type == CAM_PERSP) ? cam->clipsta * 32.0 / cam->lens : cam->ortho_scale;
+ float scale= (cam->type == CAM_PERSP) ? cam->clipsta * 32.0f / cam->lens : cam->ortho_scale;
float xmax, xmin, ymax, ymin;
if(aspect > 1.0f) {
@@ -417,19 +417,19 @@ ModifierTypeInfo modifierType_UVProject = {
| eModifierTypeFlag_EnableInEditmode,
/* copyData */ copyData,
- /* deformVerts */ 0,
- /* deformMatrices */ 0,
- /* deformVertsEM */ 0,
- /* deformMatricesEM */ 0,
+ /* deformVerts */ NULL,
+ /* deformMatrices */ NULL,
+ /* deformVertsEM */ NULL,
+ /* deformMatricesEM */ NULL,
/* applyModifier */ applyModifier,
/* applyModifierEM */ applyModifierEM,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
- /* isDisabled */ 0,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
- /* dependsOnTime */ 0,
- /* dependsOnNormals */ 0,
+ /* dependsOnTime */ NULL,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink,
};
diff --git a/source/blender/modifiers/intern/MOD_wave.c b/source/blender/modifiers/intern/MOD_wave.c
index 42b1369e8ca..e3ee612374a 100644
--- a/source/blender/modifiers/intern/MOD_wave.c
+++ b/source/blender/modifiers/intern/MOD_wave.c
@@ -286,7 +286,7 @@ static void waveModifier_do(WaveModifierData *md,
if(wmd->damp == 0) wmd->damp = 10.0f;
- if(wmd->lifetime != 0.0) {
+ if(wmd->lifetime != 0.0f) {
float x = ctime - wmd->timeoffs;
if(x > wmd->lifetime) {
@@ -294,7 +294,7 @@ static void waveModifier_do(WaveModifierData *md,
if(lifefac > wmd->damp) lifefac = 0.0;
else lifefac =
- (float)(wmd->height * (1.0 - sqrt(lifefac / wmd->damp)));
+ (float)(wmd->height * (1.0f - sqrtf(lifefac / wmd->damp)));
}
}
@@ -304,9 +304,9 @@ static void waveModifier_do(WaveModifierData *md,
wavemod_get_texture_coords(wmd, ob, dm, vertexCos, tex_co, numVerts);
}
- if(lifefac != 0.0) {
+ if(lifefac != 0.0f) {
/* avoid divide by zero checks within the loop */
- float falloff_inv= wmd->falloff ? 1.0f / wmd->falloff : 1.0;
+ float falloff_inv= wmd->falloff ? 1.0f / wmd->falloff : 1.0f;
int i;
for(i = 0; i < numVerts; i++) {
@@ -364,14 +364,14 @@ static void waveModifier_do(WaveModifierData *md,
amplit -= (ctime - wmd->timeoffs) * wmd->speed;
if(wmd->flag & MOD_WAVE_CYCL) {
- amplit = (float)fmod(amplit - wmd->width, 2.0 * wmd->width)
+ amplit = (float)fmodf(amplit - wmd->width, 2.0f * wmd->width)
+ wmd->width;
}
/* GAUSSIAN */
if(amplit > -wmd->width && amplit < wmd->width) {
amplit = amplit * wmd->narrow;
- amplit = (float)(1.0 / exp(amplit * amplit) - minfac);
+ amplit = (float)(1.0f / expf(amplit * amplit) - minfac);
/*apply texture*/
if(wmd->texture)
@@ -457,18 +457,18 @@ ModifierTypeInfo modifierType_Wave = {
| eModifierTypeFlag_SupportsEditmode,
/* copyData */ copyData,
/* deformVerts */ deformVerts,
- /* deformMatrices */ 0,
+ /* deformMatrices */ NULL,
/* deformVertsEM */ deformVertsEM,
- /* deformMatricesEM */ 0,
- /* applyModifier */ 0,
- /* applyModifierEM */ 0,
+ /* deformMatricesEM */ NULL,
+ /* applyModifier */ NULL,
+ /* applyModifierEM */ NULL,
/* initData */ initData,
/* requiredDataMask */ requiredDataMask,
- /* freeData */ 0,
- /* isDisabled */ 0,
+ /* freeData */ NULL,
+ /* isDisabled */ NULL,
/* updateDepgraph */ updateDepgraph,
/* dependsOnTime */ dependsOnTime,
- /* dependsOnNormals */ 0,
+ /* dependsOnNormals */ NULL,
/* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink,
};
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt
index 09a627b51d4..efd5523f5b2 100644
--- a/source/blender/nodes/CMakeLists.txt
+++ b/source/blender/nodes/CMakeLists.txt
@@ -34,7 +34,7 @@ set(INC
../makesrna
../render/extern/include
../../../intern/guardedalloc
- ../../../extern/glew/include
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c b/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
index f18bfb79405..cba7e150633 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_alphaOver.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** ALPHAOVER ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c b/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
index bb677521435..c106b437e17 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/nodes/intern/CMP_nodes/CMP_bilateralblur.c
+ * \ingroup cmpnodes
+ */
+
#include "../CMP_util.h"
/* **************** BILATERALBLUR ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
index e01d5ee29bd..1031ab3d360 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
@@ -28,6 +28,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_blur.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** BLUR ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c b/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
index 8d7524d71f5..50a8d05b03d 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_brightness.c
@@ -28,6 +28,11 @@
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_brightness.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
index ee3dfbc6e1b..cdd360dc0fe 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_channelMatte.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
index d028fede25f..fc0e9b3ee4b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* ******************* Chroma Key ********************************************************** */
@@ -170,7 +175,7 @@ static void node_composit_exec_chroma_matte(void *data, bNode *node, bNodeStack
if(cbuf!=in[0]->data)
free_compbuf(cbuf);
-};
+}
static void node_composit_init_chroma_matte(bNode *node)
@@ -182,7 +187,7 @@ static void node_composit_init_chroma_matte(bNode *node)
c->t3= 0.0f;
c->fsize= 0.0f;
c->fstrength= 1.0f;
-};
+}
void register_node_type_cmp_chroma_matte(ListBase *lb)
{
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
index 5022c25819c..90916284f1e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_colorMatte.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* ******************* Color Key ********************************************************** */
@@ -99,7 +104,7 @@ static void node_composit_exec_color_matte(void *data, bNode *node, bNodeStack *
if(cbuf!=in[0]->data)
free_compbuf(cbuf);
-};
+}
static void node_composit_init_color_matte(bNode *node)
{
@@ -110,7 +115,7 @@ static void node_composit_init_color_matte(bNode *node)
c->t3= 0.1f;
c->fsize= 0.0f;
c->fstrength= 1.0f;
-};
+}
void register_node_type_cmp_color_matte(ListBase *lb)
{
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
index 65d3d598c65..c9997ba8a75 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_colorSpill.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c b/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
index 0cecb764722..4074ea2fa29 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_colorbalance.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c b/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
index d54e47a5647..fb68f56ae64 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_composite.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
index a07301a2cb8..5a0e2047ed7 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_crop.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** Crop ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
index 3c6fc72488f..f0b399ae1e8 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_curves.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_curves.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
@@ -93,12 +98,12 @@ static void node_composit_exec_curve_vec(void *UNUSED(data), bNode *node, bNodeS
/* stack order output: vec */
curvemapping_evaluate_premulRGBF(node->storage, out[0]->vec, in[0]->vec);
-};
+}
static void node_composit_init_curve_vec(bNode* node)
{
node->storage= curvemapping_add(3, -1.0f, -1.0f, 1.0f, 1.0f);
-};
+}
void register_node_type_cmp_curve_vec(ListBase *lb)
{
@@ -180,12 +185,12 @@ static void node_composit_exec_curve_rgb(void *UNUSED(data), bNode *node, bNodeS
out[0]->data= stackbuf;
}
-};
+}
static void node_composit_init_curve_rgb(bNode* node)
{
node->storage= curvemapping_add(4, 0.0f, 0.0f, 1.0f, 1.0f);
-};
+}
void register_node_type_cmp_curve_rgb(ListBase *lb)
{
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
index c0168309533..303d5ee01aa 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_defocus.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* ************ qdn: Defocus node ****************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
index 2996551fff5..f0e112761e3 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_diffMatte.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* ******************* channel Difference Matte ********************************* */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c b/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
index 8533acdd5a5..f5d16ff0ab8 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_dilate.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_dilate.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c b/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
index b00bdba768d..2a8bbcc9ad5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_directionalblur.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
static bNodeSocketType cmp_node_dblur_in[]= {
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
index 49b65ef0598..d52a47993d2 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_displace.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_displace.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
index 1d379904949..3eb38465c4f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_distanceMatte.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* ******************* channel Distance Matte ********************************* */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c b/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
index c3450f80979..915cb01d2d4 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_filter.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_filter.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** FILTER ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c b/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
index b1af4ac9d3c..b5fd7b46e03 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_flip.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_flip.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** Flip ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c b/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
index dfe28e881f4..261257d3b5f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_gamma.c
@@ -28,6 +28,11 @@
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_gamma.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** Gamma Tools ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c b/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
index 7449b8436ea..1a339b45a05 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_glare.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
static bNodeSocketType cmp_node_glare_in[]= {
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c b/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
index 32e133c3bec..238f9b063c2 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_hueSatVal.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
index 53cb5cc096d..ce5092e2859 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_huecorrect.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
static bNodeSocketType cmp_node_huecorrect_in[]= {
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c b/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
index eeae5fb06de..72d0de7d15e 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_idMask.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_idMask.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_image.c b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
index bb01f591512..1ea3cf96ad0 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_image.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_image.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_image.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
@@ -75,9 +80,9 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i
IMB_float_from_rect(ibuf);
}
- /* now we need a float buffer from the image
- * with matching color management */
- if(ibuf->channels == 4) {
+ /* now we need a float buffer from the image with matching color management */
+ /* XXX weak code, multilayer is excluded from this */
+ if(ibuf->channels == 4 && ima->rr==NULL) {
if(rd->color_mgt_flag & R_COLOR_MANAGEMENT) {
if(ibuf->profile != IB_PROFILE_NONE) {
rect= ibuf->rect_float;
@@ -136,7 +141,7 @@ static CompBuf *node_composit_get_image(RenderData *rd, Image *ima, ImageUser *i
}
*/
return stackbuf;
-};
+}
static CompBuf *node_composit_get_zimage(bNode *node, RenderData *rd)
{
@@ -153,7 +158,7 @@ static CompBuf *node_composit_get_zimage(bNode *node, RenderData *rd)
}
}
return zbuf;
-};
+}
/* check if layer is available, returns pass buffer */
static CompBuf *compbuf_multilayer_get(RenderData *rd, RenderLayer *rl, Image *ima, ImageUser *iuser, int passtype)
@@ -175,7 +180,7 @@ static CompBuf *compbuf_multilayer_get(RenderData *rd, RenderLayer *rl, Image *i
return cbuf;
}
return NULL;
-};
+}
static void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack **out, Image *ima, ImageUser *iuser)
{
@@ -212,7 +217,7 @@ static void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack *
out[RRES_OUT_EMIT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_EMIT);
if(out[RRES_OUT_ENV]->hasoutput)
out[RRES_OUT_ENV]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_ENVIRONMENT);
-};
+}
static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
@@ -285,7 +290,7 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE
generate_preview(data, node, stackbuf);
}
}
-};
+}
static void node_composit_init_image(bNode* node)
{
@@ -337,7 +342,7 @@ static CompBuf *compbuf_from_pass(RenderData *rd, RenderLayer *rl, int rectx, in
return buf;
}
return NULL;
-};
+}
static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStack **out, int rectx, int recty)
{
@@ -374,7 +379,7 @@ static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStac
out[RRES_OUT_EMIT]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_EMIT);
if(out[RRES_OUT_ENV]->hasoutput)
out[RRES_OUT_ENV]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_ENVIRONMENT);
-};
+}
static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
@@ -423,7 +428,7 @@ static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **UNU
if(re)
RE_ReleaseResult(re);
-};
+}
void register_node_type_cmp_rlayers(ListBase *lb)
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
index 5cf652b8af6..f42bcb576fd 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/nodes/intern/CMP_nodes/CMP_invert.c
+ * \ingroup cmpnodes
+ */
+
#include "../CMP_util.h"
/* **************** INVERT ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c b/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
index 4343e043c34..37c28514679 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_lensdist.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
static bNodeSocketType cmp_node_lensdist_in[]= {
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c b/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
index 876ee565ec7..4436be14b5c 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_levels.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_levels.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
index 42430ffeff8..7ed38996cf8 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_lummaMatte.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
@@ -101,7 +106,7 @@ static void node_composit_init_luma_matte(bNode *node)
node->storage=c;
c->t1= 1.0f;
c->t2= 0.0f;
-};
+}
void register_node_type_cmp_luma_matte(ListBase *lb)
{
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c b/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
index bc294b3be79..6b2c561b14a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_mapUV.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_mapUV.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** Map UV ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c b/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
index b7da0ed578c..b4af253ac3a 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_mapValue.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_mapValue.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** MAP VALUE ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_math.c b/source/blender/nodes/intern/CMP_nodes/CMP_math.c
index 86b602d4086..039f7e6fab1 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_math.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_math.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_math.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** SCALAR MATH ******************** */
@@ -135,7 +140,7 @@ static void do_math(bNode *node, float *out, float *in, float *in2)
break;
case 14: /* Round */
{
- out[0]= (int)(in[0] + 0.5f);
+ out[0]= (out[0]<0)?(int)(in[0] - 0.5f):(int)(in[0] + 0.5f);
}
break;
case 15: /* Less Than */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
index 2a7937ef1d8..d2454b37c29 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/nodes/intern/CMP_nodes/CMP_mixrgb.c
+ * \ingroup cmpnodes
+ */
+
#include "../CMP_util.h"
/* **************** MIX RGB ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c b/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
index 920a99f1b93..f53d3041947 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_normal.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_normal.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c b/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
index b9a4dd4ab8a..22ebd924f09 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_normalize.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c b/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
index 3cb342aa5ff..61a1c5d1c94 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_outputFile.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_outputFile.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** OUTPUT FILE ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c b/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
index 5bf3af8e5cb..15d2ac25180 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_premulkey.c
@@ -28,6 +28,11 @@
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_premulkey.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** Premul and Key Alpha Convert ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
index 1d8db72584e..a6ce77b64f0 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_rgb.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_rgb.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
index 17d22d41543..14f25aa442b 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_rotate.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_rotate.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** Rotate ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c b/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
index 6f030d3d7b3..b6030cc5a5f 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_scale.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** Scale ******************** */
@@ -107,7 +112,7 @@ static void node_composit_exec_scale(void *data, bNode *node, bNodeStack **in, b
if(cbuf!=in[0]->data)
free_compbuf(cbuf);
}
-};
+}
void register_node_type_cmp_scale(ListBase *lb)
{
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
index 469425c4ace..4e338c73c39 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
index 969fadf65ad..11afd1eaaef 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombRGBA.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** SEPARATE RGBA ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
index b00885f6940..81591602dae 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombYCCA.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
index 65b0e5a645c..8687e307df3 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_sepcombYUVA.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c b/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
index 920bb33604f..bb8533a79f6 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_setalpha.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_setalpha.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** SET ALPHA ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
index e66abd994dd..69499f25b39 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_splitViewer.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** SPLIT VIEWER ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
index 8d8480688c7..46e71b8b8e5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_texture.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** TEXTURE ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c b/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
index ac305ad0319..f15811ec790 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_tonemap.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
static bNodeSocketType cmp_node_tonemap_in[]= {
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c b/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
index 9db7819658d..eb69523e7a9 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_translate.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_translate.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c b/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
index 9de4a8ca4ef..fa6b5db89f6 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_valToRgb.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_value.c b/source/blender/nodes/intern/CMP_nodes/CMP_value.c
index bd5f6853dc5..46762065bb4 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_value.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_value.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_value.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
/* **************** VALUE ******************** */
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c b/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
index ff17a27d5e5..b21418f6698 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_vecBlur.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
@@ -88,7 +93,7 @@ static void node_composit_init_vecblur(bNode* node)
node->storage= nbd;
nbd->samples= 32;
nbd->fac= 1.0f;
-};
+}
/* custom1: itterations, custom2: maxspeed (0 = nolimit) */
void register_node_type_cmp_vecblur(ListBase *lb)
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
index 18b445c25fd..b3629eb1e16 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_viewer.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_viewer.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c b/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
index 33e3bd94708..0fae0fcd4d5 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_zcombine.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_nodes/CMP_zcombine.c
+ * \ingroup cmpnodes
+ */
+
+
#include "../CMP_util.h"
diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/intern/CMP_util.c
index 28497b98197..45e7cf9d3e7 100644
--- a/source/blender/nodes/intern/CMP_util.c
+++ b/source/blender/nodes/intern/CMP_util.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_util.c
+ * \ingroup nodes
+ */
+
+
#include "CMP_util.h"
CompBuf *alloc_compbuf(int sizex, int sizey, int type, int alloc)
@@ -118,7 +123,7 @@ void free_compbuf(CompBuf *cbuf)
void print_compbuf(char *str, CompBuf *cbuf)
{
- printf("Compbuf %s %d %d %p\n", str, cbuf->x, cbuf->y, cbuf->rect);
+ printf("Compbuf %s %d %d %p\n", str, cbuf->x, cbuf->y, (void *)cbuf->rect);
}
diff --git a/source/blender/nodes/intern/CMP_util.h b/source/blender/nodes/intern/CMP_util.h
index 5df670641ca..3f37eae2af9 100644
--- a/source/blender/nodes/intern/CMP_util.h
+++ b/source/blender/nodes/intern/CMP_util.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/CMP_util.h
+ * \ingroup nodes
+ */
+
+
#ifndef CMP_NODE_UTILS_H_
#define CMP_NODE_UTILS_H_
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c b/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
index d6339b0677c..eea572bf271 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_camera.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_camera.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** CAMERA INFO ******************** */
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c b/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
index 7e44a090d85..78b5e4c1e56 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_curves.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_curves.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
index 75c6799c92a..d5e5d5eeb93 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_dynamic.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_dynamic.c
+ * \ingroup shdnodes
+ */
+
+
/* TODO, support python3.x */
#undef WITH_PYTHON
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
index dbefa819be0..c08d5f3548d 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_geom.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_geom.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
#include "DNA_customdata_types.h"
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c b/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
index 78a0c197525..91fd995dbbe 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
@@ -47,12 +52,12 @@ static bNodeSocketType sh_node_hue_sat_out[]= {
/* note: it would be possible to use CMP version for both nodes */
static void do_hue_sat_fac(bNode *UNUSED(node), float *out, float *hue, float *sat, float *val, float *in, float *fac)
{
- if(*fac!=0.0f && (*hue!=0.5f || *sat!=1.0 || *val!=1.0)) {
+ if(*fac!=0.0f && (*hue!=0.5f || *sat!=1.0f || *val!=1.0f)) {
float col[3], hsv[3], mfac= 1.0f - *fac;
rgb_to_hsv(in[0], in[1], in[2], hsv, hsv+1, hsv+2);
hsv[0]+= (*hue - 0.5f);
- if(hsv[0]>1.0) hsv[0]-=1.0; else if(hsv[0]<0.0) hsv[0]+= 1.0;
+ if(hsv[0]>1.0f) hsv[0]-=1.0f; else if(hsv[0]<0.0f) hsv[0]+= 1.0f;
hsv[1]*= *sat;
hsv[2]*= *val;
hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c b/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
index 1699493b446..f8d6e54859e 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_invert.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_invert.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
@@ -54,7 +59,7 @@ bNodeStack **out)
/* if fac, blend result against original input */
if (in[0]->vec[0] < 1.0f) {
- facm = 1.0 - in[0]->vec[0];
+ facm = 1.0f - in[0]->vec[0];
col[0] = in[0]->vec[0]*col[0] + (facm*in[1]->vec[0]);
col[1] = in[0]->vec[0]*col[1] + (facm*in[1]->vec[1]);
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c b/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
index a6f4f7c80df..528b43ae56e 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_mapping.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_mapping.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** MAPPING ******************** */
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_material.c b/source/blender/nodes/intern/SHD_nodes/SHD_material.c
index e8c30b621f5..317dd07f8fe 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_material.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_material.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_material.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** MATERIAL ******************** */
@@ -150,7 +155,7 @@ static void node_shader_exec_material(void *data, bNode *node, bNodeStack **in,
col[3]= shrnode.alpha;
if(shi->do_preview)
- nodeAddToPreview(node, col, shi->xs, shi->ys);
+ nodeAddToPreview(node, col, shi->xs, shi->ys, shi->do_manage);
VECCOPY(out[MAT_OUT_COLOR]->vec, col);
out[MAT_OUT_ALPHA]->vec[0]= shrnode.alpha;
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_math.c b/source/blender/nodes/intern/SHD_nodes/SHD_math.c
index 7d31ab05c85..dd0a564dc4b 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_math.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_math.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_math.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
@@ -169,9 +174,9 @@ bNodeStack **out)
case 14: /* Round */
{
if(in[0]->hasinput || !in[1]->hasinput) /* This one only takes one input, so we've got to choose. */
- out[0]->vec[0]= (int)(in[0]->vec[0] + 0.5f);
+ out[0]->vec[0]= (in[0]->vec[0]<0)?(int)(in[0]->vec[0] - 0.5f):(int)(in[0]->vec[0] + 0.5f);
else
- out[0]->vec[0]= (int)(in[1]->vec[0] + 0.5f);
+ out[0]->vec[0]= (in[1]->vec[0]<0)?(int)(in[1]->vec[0] - 0.5f):(int)(in[1]->vec[0] + 0.5f);
}
break;
case 15: /* Less Than */
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c b/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
index 1520618ced2..8b3033a98ca 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_mixRgb.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** MIX RGB ******************** */
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c b/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
index 66045902b69..a4e39935cea 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_normal.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_normal.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** NORMAL ******************** */
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_output.c b/source/blender/nodes/intern/SHD_nodes/SHD_output.c
index 12a6953363f..058594944b5 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_output.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_output.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_output.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** OUTPUT ******************** */
@@ -47,7 +52,7 @@ static void node_shader_exec_output(void *data, bNode *node, bNodeStack **in, bN
nodestack_get_vec(col+3, SOCK_VALUE, in[1]);
if(shi->do_preview) {
- nodeAddToPreview(node, col, shi->xs, shi->ys);
+ nodeAddToPreview(node, col, shi->xs, shi->ys, shi->do_manage);
node->lasty= shi->ys;
}
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c b/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
index 821254ad832..3d7f401b055 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_rgb.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_rgb.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** RGB ******************** */
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c b/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
index 5939a86df03..e4fa0b02521 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** SEPARATE RGBA ******************** */
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c b/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
index b3edc3de716..80693ff08f0 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_squeeze.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_squeeze.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** VALUE SQUEEZE ******************** */
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c b/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
index 56c8cd062a3..249e4eeca5d 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_texture.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_texture.c
+ * \ingroup shdnodes
+ */
+
+
#include "DNA_texture_types.h"
#include "../SHD_util.h"
@@ -111,7 +116,7 @@ static void node_shader_exec_texture(void *data, bNode *node, bNodeStack **in, b
VECCOPY(out[2]->vec, nor);
if(shi->do_preview)
- nodeAddToPreview(node, out[1]->vec, shi->xs, shi->ys);
+ nodeAddToPreview(node, out[1]->vec, shi->xs, shi->ys, shi->do_manage);
}
}
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c b/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
index 723aeaa82f3..d2538f4c819 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_valToRgb.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** VALTORGB ******************** */
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_value.c b/source/blender/nodes/intern/SHD_nodes/SHD_value.c
index 22603b880fa..29a75bbf36d 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_value.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_value.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_value.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
/* **************** VALUE ******************** */
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c b/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
index c39fff262e4..9979e488a71 100644
--- a/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_vectMath.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_nodes/SHD_vectMath.c
+ * \ingroup shdnodes
+ */
+
+
#include "../SHD_util.h"
diff --git a/source/blender/nodes/intern/SHD_util.c b/source/blender/nodes/intern/SHD_util.c
index 33061d61354..cf7c64c9d5e 100644
--- a/source/blender/nodes/intern/SHD_util.c
+++ b/source/blender/nodes/intern/SHD_util.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_util.c
+ * \ingroup nodes
+ */
+
+
#include "SHD_util.h"
diff --git a/source/blender/nodes/intern/SHD_util.h b/source/blender/nodes/intern/SHD_util.h
index 70b6cae3232..4c5d56776da 100644
--- a/source/blender/nodes/intern/SHD_util.h
+++ b/source/blender/nodes/intern/SHD_util.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/SHD_util.h
+ * \ingroup nodes
+ */
+
+
#ifndef SHD_NODE_UTIL_H_
#define SHD_NODE_UTIL_H_
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_at.c b/source/blender/nodes/intern/TEX_nodes/TEX_at.c
index f4221d63d04..d5980b786b0 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_at.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_at.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "../TEX_util.h"
+/** \file blender/nodes/intern/TEX_nodes/TEX_at.c
+ * \ingroup texnodes
+ */
+
+
+#include "../TEX_util.h"
+#include "TEX_node.h"
static bNodeSocketType inputs[]= {
{ SOCK_RGBA, 1, "Texture", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c b/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
index 5ad20c0755e..0eb982496a9 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_bricks.c
@@ -26,7 +26,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "../TEX_util.h"
+/** \file blender/nodes/intern/TEX_nodes/TEX_bricks.c
+ * \ingroup texnodes
+ */
+
+
+#include "../TEX_util.h"
+#include "TEX_node.h"
+
#include <math.h>
static bNodeSocketType inputs[]= {
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c b/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
index 7f5648f3d88..c6c25ba1a8a 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_checker.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "../TEX_util.h"
+/** \file blender/nodes/intern/TEX_nodes/TEX_checker.c
+ * \ingroup texnodes
+ */
+
+
+#include "../TEX_util.h"
+#include "TEX_node.h"
#include <math.h>
static bNodeSocketType inputs[]= {
@@ -48,9 +54,9 @@ static void colorfn(float *out, TexParams *p, bNode *UNUSED(node), bNodeStack **
float sz = tex_input_value(in[2], p, thread);
/* 0.00001 because of unit sized stuff */
- int xi = (int)fabs(floor(0.00001 + x / sz));
- int yi = (int)fabs(floor(0.00001 + y / sz));
- int zi = (int)fabs(floor(0.00001 + z / sz));
+ int xi = (int)fabs(floor(0.00001f + x / sz));
+ int yi = (int)fabs(floor(0.00001f + y / sz));
+ int zi = (int)fabs(floor(0.00001f + z / sz));
if( (xi % 2 == yi % 2) == (zi % 2) ) {
tex_input_rgba(out, in[0], p, thread);
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c b/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
index d2f82992122..6eae78ec3de 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_compose.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "../TEX_util.h"
+/** \file blender/nodes/intern/TEX_nodes/TEX_compose.c
+ * \ingroup texnodes
+ */
+
+
+#include "../TEX_util.h"
+#include "TEX_node.h"
static bNodeSocketType inputs[]= {
{ SOCK_VALUE, 1, "Red", 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f },
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c b/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
index 6f208b48eee..3c46971f0d4 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_coord.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_coord.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
static bNodeSocketType outputs[]= {
{ SOCK_VECTOR, 0, "Coordinates", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c b/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
index f470924e810..e388efd17c0 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_curves.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_curves.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
/* **************** CURVE Time ******************** */
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c b/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
index 635b59a2b44..f27d8c98716 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_decompose.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "../TEX_util.h"
+/** \file blender/nodes/intern/TEX_nodes/TEX_decompose.c
+ * \ingroup texnodes
+ */
+
+
+#include "../TEX_util.h"
+#include "TEX_node.h"
#include <math.h>
static bNodeSocketType inputs[]= {
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c b/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
index 70e2da14808..b460844ba4a 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_distance.c
@@ -26,9 +26,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_distance.c
+ * \ingroup texnodes
+ */
+
+
#include <math.h>
#include "BLI_math.h"
#include "../TEX_util.h"
+#include "TEX_node.h"
static bNodeSocketType inputs[]= {
{ SOCK_VECTOR, 1, "Coordinate 1", 0.0f, 0.0f, 0.0f, 0.0f, -1.0f, 1.0f },
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c b/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
index 13d7e239ca2..471d8db2c03 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_hueSatVal.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
static bNodeSocketType inputs[]= {
@@ -49,11 +55,11 @@ static void do_hue_sat_fac(bNode *UNUSED(node), float *out, float hue, float sat
rgb_to_hsv(in[0], in[1], in[2], hsv, hsv+1, hsv+2);
hsv[0]+= (hue - 0.5f);
- if(hsv[0]>1.0) hsv[0]-=1.0; else if(hsv[0]<0.0) hsv[0]+= 1.0;
+ if(hsv[0]>1.0f) hsv[0]-=1.0f; else if(hsv[0]<0.0f) hsv[0]+= 1.0f;
hsv[1]*= sat;
- if(hsv[1]>1.0) hsv[1]= 1.0; else if(hsv[1]<0.0) hsv[1]= 0.0;
+ if(hsv[1]>1.0f) hsv[1]= 1.0f; else if(hsv[1]<0.0f) hsv[1]= 0.0f;
hsv[2]*= val;
- if(hsv[2]>1.0) hsv[2]= 1.0; else if(hsv[2]<0.0) hsv[2]= 0.0;
+ if(hsv[2]>1.0f) hsv[2]= 1.0f; else if(hsv[2]<0.0f) hsv[2]= 0.0f;
hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2);
out[0]= mfac*in[0] + fac*col[0];
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_image.c b/source/blender/nodes/intern/TEX_nodes/TEX_image.c
index f629db0628e..fcb18ab3342 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_image.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_image.c
@@ -27,7 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_image.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
static bNodeSocketType outputs[]= {
{ SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c b/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
index b6dcaecad6c..e908bdcff07 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_invert.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_invert.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
/* **************** INVERT ******************** */
static bNodeSocketType inputs[]= {
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_math.c b/source/blender/nodes/intern/TEX_nodes/TEX_math.c
index 1e48e4d521d..e00781741a0 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_math.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_math.c
@@ -26,9 +26,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "../TEX_util.h"
+/** \file blender/nodes/intern/TEX_nodes/TEX_math.c
+ * \ingroup texnodes
+ */
+#include "../TEX_util.h"
+#include "TEX_node.h"
+
/* **************** SCALAR MATH ******************** */
static bNodeSocketType inputs[]= {
@@ -111,8 +116,8 @@ static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
out[0]= pow(in0, in1);
} else {
float y_mod_1 = fmod(in1, 1);
- if (y_mod_1 > 0.999 || y_mod_1 < 0.001) {
- *out = pow(in0, floor(in1 + 0.5));
+ if (y_mod_1 > 0.999f || y_mod_1 < 0.001f) {
+ *out = pow(in0, floor(in1 + 0.5f));
} else {
*out = 0.0;
}
@@ -146,7 +151,7 @@ static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
break;
case 14: /* Round */
{
- *out= (int)(in0 + 0.5f);
+ *out= (in0<0)?(int)(in0 - 0.5f):(int)(in0 + 0.5f);
}
break;
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c b/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
index 9e651b0f0bb..c7668c27b99 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_mixRgb.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
/* **************** MIX RGB ******************** */
static bNodeSocketType inputs[]= {
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_output.c b/source/blender/nodes/intern/TEX_nodes/TEX_output.c
index c52291a211c..046ad724507 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_output.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_output.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_output.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
/* **************** COMPOSITE ******************** */
static bNodeSocketType inputs[]= {
@@ -60,13 +66,13 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(o
tex_input_rgba(&target->tr, in[0], &params, cdata->thread);
target->tin = (target->tr + target->tg + target->tb) / 3.0f;
- target->talpha = 1.0f;
+ target->talpha = 1;
if(target->nor) {
if(in[1] && in[1]->hasinput)
tex_input_vec(target->nor, in[1], &params, cdata->thread);
else
- target->nor = 0;
+ target->nor = NULL;
}
}
}
@@ -75,7 +81,7 @@ static void exec(void *data, bNode *node, bNodeStack **in, bNodeStack **UNUSED(o
static void unique_name(bNode *node)
{
TexNodeOutput *tno = (TexNodeOutput *)node->storage;
- char *new_name = 0;
+ char *new_name = NULL;
int new_len = 0;
int suffix;
bNode *i;
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c b/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
index 084ce045203..294c1f7322f 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_proc.c
@@ -26,7 +26,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_proc.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
+
#include "RE_shader_ext.h"
/*
@@ -306,13 +313,13 @@ void register_node_type_tex_proc_##name(ListBase *lb) \
#define C outputs_color_only
#define CV outputs_both
-TexDef(TEX_VORONOI, CV, voronoi, "Voronoi" );
-TexDef(TEX_BLEND, C, blend, "Blend" );
-TexDef(TEX_MAGIC, C, magic, "Magic" );
-TexDef(TEX_MARBLE, CV, marble, "Marble" );
-TexDef(TEX_CLOUDS, CV, clouds, "Clouds" );
-TexDef(TEX_WOOD, CV, wood, "Wood" );
-TexDef(TEX_MUSGRAVE, CV, musgrave, "Musgrave" );
-TexDef(TEX_NOISE, C, noise, "Noise" );
-TexDef(TEX_STUCCI, CV, stucci, "Stucci" );
-TexDef(TEX_DISTNOISE, CV, distnoise, "Distorted Noise" );
+TexDef(TEX_VORONOI, CV, voronoi, "Voronoi" )
+TexDef(TEX_BLEND, C, blend, "Blend" )
+TexDef(TEX_MAGIC, C, magic, "Magic" )
+TexDef(TEX_MARBLE, CV, marble, "Marble" )
+TexDef(TEX_CLOUDS, CV, clouds, "Clouds" )
+TexDef(TEX_WOOD, CV, wood, "Wood" )
+TexDef(TEX_MUSGRAVE, CV, musgrave, "Musgrave" )
+TexDef(TEX_NOISE, C, noise, "Noise" )
+TexDef(TEX_STUCCI, CV, stucci, "Stucci" )
+TexDef(TEX_DISTNOISE, CV, distnoise, "Distorted Noise" )
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c b/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
index 89d8c10156c..1be6152a2b3 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_rotate.c
@@ -26,9 +26,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_rotate.c
+ * \ingroup texnodes
+ */
+
+
#include <math.h>
#include "../TEX_util.h"
+#include "TEX_node.h"
static bNodeSocketType inputs[]= {
{ SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
@@ -48,8 +54,8 @@ static void rotate(float new_co[3], float a, float ax[3], float co[3])
float perp[3];
float cp[3];
- float cos_a = cos(a * 2 * M_PI);
- float sin_a = sin(a * 2 * M_PI);
+ float cos_a = cos(a * (float)(2*M_PI));
+ float sin_a = sin(a * (float)(2*M_PI));
// x' = xcosa + n(n.x)(1-cosa) + (x*n)sina
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c b/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
index 51a17385bd0..cfffcfda2e5 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_scale.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_scale.c
+ * \ingroup texnodes
+ */
+
+
#include <math.h>
#include "../TEX_util.h"
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
index c0fcddc85b8..d4d77b5fd5a 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_texture.c
@@ -26,7 +26,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_texture.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
+
#include "RE_shader_ext.h"
static bNodeSocketType inputs[]= {
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c b/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
index 1cd0b17e330..8f7d6d837d7 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_translate.c
@@ -26,8 +26,14 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_translate.c
+ * \ingroup texnodes
+ */
+
+
#include <math.h>
#include "../TEX_util.h"
+#include "TEX_node.h"
static bNodeSocketType inputs[]= {
{ SOCK_RGBA, 1, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c b/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
index 4a41b8ab8a2..e430c0c9a95 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_valToNor.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_valToNor.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
static bNodeSocketType inputs[]= {
{ SOCK_VALUE, 1, "Val", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f },
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c b/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
index f55229c08bc..19fa6c67c09 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
@@ -27,7 +27,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_nodes/TEX_valToRgb.c
+ * \ingroup texnodes
+ */
+
+
#include "../TEX_util.h"
+#include "TEX_node.h"
/* **************** VALTORGB ******************** */
static bNodeSocketType valtorgb_in[]= {
diff --git a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c b/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
index ffbb3e08bbd..e917e525e17 100644
--- a/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
+++ b/source/blender/nodes/intern/TEX_nodes/TEX_viewer.c
@@ -26,7 +26,13 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#include "../TEX_util.h"
+/** \file blender/nodes/intern/TEX_nodes/TEX_viewer.c
+ * \ingroup texnodes
+ */
+
+
+#include "../TEX_util.h"
+#include "TEX_node.h"
#include <math.h>
static bNodeSocketType inputs[]= {
diff --git a/source/blender/nodes/intern/TEX_util.c b/source/blender/nodes/intern/TEX_util.c
index bb97e2f82fa..51b3c6d909f 100644
--- a/source/blender/nodes/intern/TEX_util.c
+++ b/source/blender/nodes/intern/TEX_util.c
@@ -25,6 +25,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/nodes/intern/TEX_util.c
+ * \ingroup nodes
+ */
+
/*
HOW TEXTURE NODES WORK
@@ -119,7 +124,7 @@ void tex_do_preview(bNode *node, float *co, float *col)
int xs= ((co[0] + 1.0f)*0.5f)*preview->xsize;
int ys= ((co[1] + 1.0f)*0.5f)*preview->ysize;
- nodeAddToPreview(node, col, xs, ys);
+ nodeAddToPreview(node, col, xs, ys, 0); /* 0 = no color management */
}
}
diff --git a/source/blender/nodes/intern/TEX_util.h b/source/blender/nodes/intern/TEX_util.h
index 152b01979ba..0875bcd52bf 100644
--- a/source/blender/nodes/intern/TEX_util.h
+++ b/source/blender/nodes/intern/TEX_util.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/TEX_util.h
+ * \ingroup nodes
+ */
+
+
#ifndef TEX_NODE_UTIL_H_
#define TEX_NODE_UTIL_H_
diff --git a/source/blender/nodes/intern/node_util.c b/source/blender/nodes/intern/node_util.c
index cf0be3fd53a..1cc8c282179 100644
--- a/source/blender/nodes/intern/node_util.c
+++ b/source/blender/nodes/intern/node_util.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/node_util.c
+ * \ingroup nodes
+ */
+
+
#include "CMP_util.h"
#include "SHD_util.h"
@@ -56,7 +61,7 @@ void node_copy_standard_storage(bNode *orig_node, bNode *new_node)
const char *node_blend_label(bNode *node)
{
const char *name;
- RNA_enum_name(node_blend_type_items, node->custom1, &name);
+ RNA_enum_name(ramp_blend_items, node->custom1, &name);
return name;
}
diff --git a/source/blender/nodes/intern/node_util.h b/source/blender/nodes/intern/node_util.h
index 44a82d81d30..5a78fc07883 100644
--- a/source/blender/nodes/intern/node_util.h
+++ b/source/blender/nodes/intern/node_util.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/nodes/intern/node_util.h
+ * \ingroup nodes
+ */
+
+
#ifndef NODE_UTIL_H_
#define NODE_UTIL_H_
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index 2abe6044ca3..7901957e5e4 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -78,7 +78,7 @@ void BPY_python_end( void );
/* 2.5 UI Scripts */
int BPY_filepath_exec(struct bContext *C, const char *filepath, struct ReportList *reports);
-int BPY_text_exec(struct bContext *C, struct Text *text, struct ReportList *reports);
+int BPY_text_exec(struct bContext *C, struct Text *text, struct ReportList *reports, const short do_jump);
void BPY_text_free_code(struct Text *text);
void BPY_modules_update(struct bContext *C); // XXX - annoying, need this for pointers that get out of date
void BPY_modules_load_user(struct bContext *C);
@@ -93,6 +93,8 @@ void BPY_DECREF(void *pyob_ptr); /* Py_DECREF() */
int BPY_context_member_get(struct bContext *C, const char *member, struct bContextDataResult *result);
void BPY_context_set(struct bContext *C);
+void BPY_id_release(struct ID *id);
+
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index 315fc5ca9a3..de6b859d259 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -1,24 +1,37 @@
#!/usr/bin/python
-Import ('env')
-sources = env.Glob('intern/*.c')
+# TODO, split into 2 files.
+
+Import ('env')
incs = '. ../editors/include ../makesdna ../makesrna ../blenlib ../blenkernel ../nodes'
incs += ' ../imbuf ../blenloader ../render/extern/include ../windowmanager'
incs += ' #intern/guardedalloc #intern/memutil #extern/glew/include'
incs += ' #intern/audaspace/intern ' + env['BF_PYTHON_INC']
+is_debug = (env['OURPLATFORM'] in ('win32-mingw', 'win32-vc','win64-vc') and env['BF_DEBUG'])
+
+# generic
defs = []
-if env['BF_BUILDINFO']:
- defs.append('BUILD_DATE')
+if is_debug:
+ defs.append('_DEBUG')
-if env['OURPLATFORM'] in ('win32-mingw', 'win32-vc','win64-vc') and env['BF_DEBUG']:
+sources = env.Glob('generic/*.c')
+env.BlenderLib( libname = 'bf_python_ext', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [362,165]) # ketsji is 360
+
+
+# bpy
+defs = []
+
+if is_debug:
defs.append('_DEBUG')
-env.BlenderLib( libname = 'bf_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [361,160])
+if env['WITH_BF_PYTHON_SAFETY']:
+ defs.append('WITH_PYTHON_SAFETY')
+if env['BF_BUILDINFO']:
+ defs.append('BUILD_DATE')
-# generic
-sources = env.Glob('generic/*.c')
-env.BlenderLib( libname = 'bf_python_ext', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core','player'], priority = [362,165]) # ketsji is 360
+sources = env.Glob('intern/*.c')
+env.BlenderLib( libname = 'bf_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype = ['core'], priority = [361])
diff --git a/source/blender/python/generic/CMakeLists.txt b/source/blender/python/generic/CMakeLists.txt
index 0ea478adbf6..5e4eae4f809 100644
--- a/source/blender/python/generic/CMakeLists.txt
+++ b/source/blender/python/generic/CMakeLists.txt
@@ -25,7 +25,7 @@ set(INC
../../blenkernel
../../blenloader
../../../../intern/guardedalloc
- ../../../../extern/glew/include
+ ${GLEW_INCLUDE_PATH}
${PYTHON_INCLUDE_DIRS}
)
diff --git a/source/blender/python/generic/IDProp.c b/source/blender/python/generic/IDProp.c
index a83359c31f7..36dc6fca503 100644
--- a/source/blender/python/generic/IDProp.c
+++ b/source/blender/python/generic/IDProp.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/IDProp.c
+ * \ingroup pygen
+ */
+
+
#include <Python.h>
#include "IDProp.h"
@@ -311,10 +316,12 @@ const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, IDProperty *g
if (PyFloat_Check(ob)) {
val.d = PyFloat_AsDouble(ob);
prop = IDP_New(IDP_DOUBLE, val, name);
- } else if (PyLong_Check(ob)) {
+ }
+ else if (PyLong_Check(ob)) {
val.i = (int) PyLong_AsSsize_t(ob);
prop = IDP_New(IDP_INT, val, name);
- } else if (PyUnicode_Check(ob)) {
+ }
+ else if (PyUnicode_Check(ob)) {
#ifdef USE_STRING_COERCE
PyObject *value_coerce= NULL;
val.str = (char *)PyC_UnicodeAsByte(ob, &value_coerce);
@@ -324,7 +331,8 @@ const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, IDProperty *g
val.str = _PyUnicode_AsString(ob);
prop = IDP_New(IDP_STRING, val, name);
#endif
- } else if (PySequence_Check(ob)) {
+ }
+ else if (PySequence_Check(ob)) {
PyObject *item;
int i;
@@ -367,7 +375,8 @@ const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, IDProperty *g
}
break;
}
- } else if (PyMapping_Check(ob)) {
+ }
+ else if (PyMapping_Check(ob)) {
PyObject *keys, *vals, *key, *pval;
int i, len;
/*yay! we get into recursive stuff now!*/
@@ -404,13 +413,15 @@ const char *BPy_IDProperty_Map_ValidateAndCreate(const char *name, IDProperty *g
}
Py_XDECREF(keys);
Py_XDECREF(vals);
- } else return "invalid property value";
+ }
+ else return "invalid property value";
if(group->type==IDP_IDPARRAY) {
IDP_AppendArray(group, prop);
// IDP_FreeProperty(item); // IDP_AppendArray does a shallow copy (memcpy), only free memory
MEM_freeN(prop);
- } else {
+ }
+ else {
IDP_ReplaceInGroup(group, prop);
}
@@ -431,7 +442,8 @@ int BPy_Wrap_SetMapItem(IDProperty *prop, PyObject *key, PyObject *val)
IDP_FreeProperty(pkey);
MEM_freeN(pkey);
return 0;
- } else {
+ }
+ else {
PyErr_SetString(PyExc_KeyError, "property not found in group");
return -1;
}
@@ -502,10 +514,12 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
if (prop->subtype == IDP_FLOAT) {
PyList_SET_ITEM(seq, i,
PyFloat_FromDouble(((float*)prop->data.pointer)[i]));
- } else if (prop->subtype == IDP_DOUBLE) {
+ }
+ else if (prop->subtype == IDP_DOUBLE) {
PyList_SET_ITEM(seq, i,
PyFloat_FromDouble(((double*)prop->data.pointer)[i]));
- } else {
+ }
+ else {
PyList_SET_ITEM(seq, i,
PyLong_FromLong(((int*)prop->data.pointer)[i]));
}
@@ -1087,10 +1101,12 @@ static PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self)
PyTuple_SET_ITEM(ret, 0, PyUnicode_FromString(cur->name));
PyTuple_SET_ITEM(ret, 1, BPy_IDGroup_WrapData(self->group->id, cur));
return ret;
- } else {
+ }
+ else {
return PyUnicode_FromString(cur->name);
}
- } else {
+ }
+ else {
PyErr_SetString(PyExc_StopIteration, "iterator at end");
return NULL;
}
diff --git a/source/blender/python/generic/IDProp.h b/source/blender/python/generic/IDProp.h
index 2b2afb3f792..0ca8af81f7c 100644
--- a/source/blender/python/generic/IDProp.h
+++ b/source/blender/python/generic/IDProp.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/IDProp.h
+ * \ingroup pygen
+ */
+
+
#ifndef IDPROP_H
#define IDPROP_H
diff --git a/source/blender/python/generic/bgl.c b/source/blender/python/generic/bgl.c
index 63d310ae4e0..2c15755a642 100644
--- a/source/blender/python/generic/bgl.c
+++ b/source/blender/python/generic/bgl.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/bgl.c
+ * \ingroup pygen
+ */
+
+
/* This file is the 'bgl' module.
* The BGL submodule "wraps" OpenGL functions and constants,
* allowing script writers to make OpenGL calls in their Python scripts. */
@@ -165,7 +170,8 @@ Buffer *BGL_MakeBuffer(int type, int ndimensions, int *dimensions, void *initbuf
if (initbuffer) {
memcpy(buffer->buf.asvoid, initbuffer, length*size);
- } else {
+ }
+ else {
memset(buffer->buf.asvoid, 0, length*size);
/*
for (i= 0; i<length; i++) {
@@ -275,7 +281,8 @@ static PyObject *Buffer_item(PyObject *self, int i)
case GL_FLOAT: return PyFloat_FromDouble(buf->buf.asfloat[i]);
case GL_DOUBLE: return Py_BuildValue("d", buf->buf.asdouble[i]);
}
- } else {
+ }
+ else {
Buffer *newbuf;
int j, length, size;
@@ -345,17 +352,21 @@ static int Buffer_ass_item(PyObject *self, int i, PyObject *v)
if (buf->type==GL_BYTE) {
if (!PyArg_Parse(v, "b:Coordinates must be ints", &buf->buf.asbyte[i]))
return -1;
- } else if (buf->type==GL_SHORT) {
+ }
+ else if (buf->type==GL_SHORT) {
if (!PyArg_Parse(v, "h:Coordinates must be ints", &buf->buf.asshort[i]))
return -1;
- } else if (buf->type==GL_INT) {
+ }
+ else if (buf->type==GL_INT) {
if (!PyArg_Parse(v, "i:Coordinates must be ints", &buf->buf.asint[i]))
return -1;
- } else if (buf->type==GL_FLOAT) {
+ }
+ else if (buf->type==GL_FLOAT) {
if (!PyArg_Parse(v, "f:Coordinates must be floats", &buf->buf.asfloat[i]))
return -1;
- } else if (buf->type==GL_DOUBLE) {
+ }
+ else if (buf->type==GL_DOUBLE) {
if (!PyArg_Parse(v, "d:Coordinates must be floats", &buf->buf.asdouble[i]))
return -1;
}
diff --git a/source/blender/python/generic/bgl.h b/source/blender/python/generic/bgl.h
index 48462bc108e..a870e82d4fd 100644
--- a/source/blender/python/generic/bgl.h
+++ b/source/blender/python/generic/bgl.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/bgl.h
+ * \ingroup pygen
+ */
+
+
/* This is the Blender.BGL part of opy_draw.c, from the old bpython/intern
* dir, with minor changes to adapt it to the new Python implementation.
* The BGL submodule "wraps" OpenGL functions and constants, allowing script
diff --git a/source/blender/python/generic/blf_py_api.c b/source/blender/python/generic/blf_py_api.c
index a32e40133bd..0653f967c14 100644
--- a/source/blender/python/generic/blf_py_api.c
+++ b/source/blender/python/generic/blf_py_api.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/blf_py_api.c
+ * \ingroup pygen
+ */
+
+
#include <Python.h>
#include "blf_py_api.h"
diff --git a/source/blender/python/generic/blf_py_api.h b/source/blender/python/generic/blf_py_api.h
index 316bad3a4c9..ff834077486 100644
--- a/source/blender/python/generic/blf_py_api.h
+++ b/source/blender/python/generic/blf_py_api.h
@@ -22,4 +22,9 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/blf_py_api.h
+ * \ingroup pygen
+ */
+
+
PyObject *BPyInit_blf(void);
diff --git a/source/blender/python/generic/bpy_internal_import.c b/source/blender/python/generic/bpy_internal_import.c
index f68f499a28c..0ea4e083e3e 100644
--- a/source/blender/python/generic/bpy_internal_import.c
+++ b/source/blender/python/generic/bpy_internal_import.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/bpy_internal_import.c
+ * \ingroup pygen
+ */
+
+
#include <Python.h>
#include <stddef.h>
@@ -50,10 +55,31 @@
static Main *bpy_import_main= NULL;
+/* 'builtins' is most likely PyEval_GetBuiltins() */
+void bpy_import_init(PyObject *builtins)
+{
+ PyObject *item;
+ PyObject *mod;
+
+ PyDict_SetItemString(builtins, "__import__", item=PyCFunction_New(&bpy_import_meth, NULL)); Py_DECREF(item);
+
+ /* move reload here
+ * XXX, use import hooks */
+ mod= PyImport_ImportModuleLevel((char *)"imp", NULL, NULL, NULL, 0);
+ if(mod) {
+ PyDict_SetItemString(PyModule_GetDict(mod), "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
+ Py_DECREF(mod);
+ }
+ else {
+ BLI_assert(!"unable to load 'imp' module.");
+ }
+}
+
+
static void free_compiled_text(Text *text)
{
if(text->compiled) {
- Py_DECREF(( PyObject * )text->compiled);
+ Py_DECREF((PyObject *)text->compiled);
}
text->compiled= NULL;
}
@@ -69,37 +95,30 @@ void bpy_import_main_set(struct Main *maggie)
}
/* returns a dummy filename for a textblock so we can tell what file a text block comes from */
-void bpy_text_filename_get(char *fn, Text *text)
+void bpy_text_filename_get(char *fn, size_t fn_len, Text *text)
{
-#if PY_VERSION_HEX >= 0x03020000
- sprintf(fn, "%s%c%s", text->id.lib ? text->id.lib->filepath : G.main->name, SEP, text->id.name+2);
-#else
- /* this is a bug in python's Py_CompileString()!, fixed for python 3.2.
- the string encoding should not be required to be utf-8
- reported: http://bugs.python.org/msg115202 */
- strcpy(fn, text->id.name+2);
-#endif
+ BLI_snprintf(fn, fn_len, "%s%c%s", text->id.lib ? text->id.lib->filepath : G.main->name, SEP, text->id.name+2);
}
PyObject *bpy_text_import(Text *text)
{
- char *buf = NULL;
+ char *buf= NULL;
char modulename[24];
int len;
- if( !text->compiled ) {
+ if(!text->compiled) {
char fn_dummy[256];
- bpy_text_filename_get(fn_dummy, text);
+ bpy_text_filename_get(fn_dummy, sizeof(fn_dummy), text);
- buf = txt_to_buf( text );
- text->compiled = Py_CompileString( buf, fn_dummy, Py_file_input );
- MEM_freeN( buf );
+ buf= txt_to_buf(text);
+ text->compiled= Py_CompileString(buf, fn_dummy, Py_file_input);
+ MEM_freeN(buf);
- if( PyErr_Occurred( ) ) {
- PyErr_Print( );
- PyErr_Clear( );
+ if(PyErr_Occurred()) {
+ PyErr_Print();
+ PyErr_Clear();
PySys_SetObject("last_traceback", NULL);
- free_compiled_text( text );
+ free_compiled_text(text);
return NULL;
}
}
@@ -110,11 +129,11 @@ PyObject *bpy_text_import(Text *text)
return PyImport_ExecCodeModule(modulename, text->compiled);
}
-PyObject *bpy_text_import_name( char *name, int *found )
+PyObject *bpy_text_import_name(char *name, int *found)
{
Text *text;
char txtname[22]; /* 21+NULL */
- int namelen = strlen( name );
+ int namelen= strlen(name);
//XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main;
Main *maggie= bpy_import_main;
@@ -127,15 +146,15 @@ PyObject *bpy_text_import_name( char *name, int *found )
if (namelen>21-3) return NULL; /* we know this cant be importable, the name is too long for blender! */
- memcpy( txtname, name, namelen );
- memcpy( &txtname[namelen], ".py", 4 );
+ memcpy(txtname, name, namelen);
+ memcpy(&txtname[namelen], ".py", 4);
text= BLI_findstring(&maggie->text, txtname, offsetof(ID, name) + 2);
- if( !text )
+ if(!text)
return NULL;
else
- *found = 1;
+ *found= 1;
return bpy_text_import(text);
}
@@ -145,12 +164,12 @@ PyObject *bpy_text_import_name( char *name, int *found )
* find in-memory module and recompile
*/
-PyObject *bpy_text_reimport( PyObject *module, int *found )
+PyObject *bpy_text_reimport(PyObject *module, int *found)
{
Text *text;
const char *name;
char *filepath;
- char *buf = NULL;
+ char *buf= NULL;
//XXX Main *maggie= bpy_import_main ? bpy_import_main:G.main;
Main *maggie= bpy_import_main;
@@ -172,50 +191,50 @@ PyObject *bpy_text_reimport( PyObject *module, int *found )
text= BLI_findstring(&maggie->text, BLI_path_basename(filepath), offsetof(ID, name) + 2);
/* uh-oh.... didn't find it */
- if( !text )
+ if(!text)
return NULL;
else
- *found = 1;
+ *found= 1;
/* if previously compiled, free the object */
/* (can't see how could be NULL, but check just in case) */
- if( text->compiled ){
- Py_DECREF( (PyObject *)text->compiled );
+ if(text->compiled){
+ Py_DECREF((PyObject *)text->compiled);
}
/* compile the buffer */
- buf = txt_to_buf( text );
- text->compiled = Py_CompileString( buf, text->id.name+2, Py_file_input );
- MEM_freeN( buf );
+ buf= txt_to_buf(text);
+ text->compiled= Py_CompileString(buf, text->id.name+2, Py_file_input);
+ MEM_freeN(buf);
/* if compile failed.... return this error */
- if( PyErr_Occurred( ) ) {
- PyErr_Print( );
- PyErr_Clear( );
+ if(PyErr_Occurred()) {
+ PyErr_Print();
+ PyErr_Clear();
PySys_SetObject("last_traceback", NULL);
- free_compiled_text( text );
+ free_compiled_text(text);
return NULL;
}
/* make into a module */
- return PyImport_ExecCodeModule( (char *)name, text->compiled );
+ return PyImport_ExecCodeModule((char *)name, text->compiled);
}
-static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject * kw)
+static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObject * kw)
{
PyObject *exception, *err, *tb;
char *name;
int found= 0;
- PyObject *globals = NULL, *locals = NULL, *fromlist = NULL;
+ PyObject *globals= NULL, *locals= NULL, *fromlist= NULL;
int level= -1; /* relative imports */
PyObject *newmodule;
//PyObject_Print(args, stderr, 0);
- static const char *kwlist[] = {"name", "globals", "locals", "fromlist", "level", NULL};
+ static const char *kwlist[]= {"name", "globals", "locals", "fromlist", "level", NULL};
- if( !PyArg_ParseTupleAndKeywords(args, kw, "s|OOOi:bpy_import_meth", (char **)kwlist,
- &name, &globals, &locals, &fromlist, &level) )
+ if(!PyArg_ParseTupleAndKeywords(args, kw, "s|OOOi:bpy_import_meth", (char **)kwlist,
+ &name, &globals, &locals, &fromlist, &level))
return NULL;
/* import existing builtin modules or modules that have been imported already */
@@ -224,28 +243,28 @@ static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObjec
if(newmodule)
return newmodule;
- PyErr_Fetch( &exception, &err, &tb ); /* get the python error incase we cant import as blender text either */
+ PyErr_Fetch(&exception, &err, &tb); /* get the python error incase we cant import as blender text either */
/* importing from existing modules failed, see if we have this module as blender text */
- newmodule = bpy_text_import_name( name, &found );
+ newmodule= bpy_text_import_name(name, &found);
- if( newmodule ) {/* found module as blender text, ignore above exception */
- PyErr_Clear( );
- Py_XDECREF( exception );
- Py_XDECREF( err );
- Py_XDECREF( tb );
- /* printf( "imported from text buffer...\n" ); */
+ if(newmodule) {/* found module as blender text, ignore above exception */
+ PyErr_Clear();
+ Py_XDECREF(exception);
+ Py_XDECREF(err);
+ Py_XDECREF(tb);
+ /* printf("imported from text buffer...\n"); */
}
else if (found==1) { /* blender text module failed to execute but was found, use its error message */
- Py_XDECREF( exception );
- Py_XDECREF( err );
- Py_XDECREF( tb );
+ Py_XDECREF(exception);
+ Py_XDECREF(err);
+ Py_XDECREF(tb);
return NULL;
}
else {
/* no blender text was found that could import the module
* rause the original error from PyImport_ImportModuleEx */
- PyErr_Restore( exception, err, tb );
+ PyErr_Restore(exception, err, tb);
}
return newmodule;
}
@@ -258,42 +277,42 @@ static PyObject *blender_import(PyObject *UNUSED(self), PyObject *args, PyObjec
static PyObject *blender_reload(PyObject *UNUSED(self), PyObject * module)
{
PyObject *exception, *err, *tb;
- PyObject *newmodule = NULL;
+ PyObject *newmodule= NULL;
int found= 0;
/* try reimporting from file */
- newmodule = PyImport_ReloadModule( module );
- if( newmodule )
+ newmodule= PyImport_ReloadModule(module);
+ if(newmodule)
return newmodule;
/* no file, try importing from memory */
- PyErr_Fetch( &exception, &err, &tb ); /*restore for probable later use */
-
- newmodule = bpy_text_reimport( module, &found );
- if( newmodule ) {/* found module as blender text, ignore above exception */
- PyErr_Clear( );
- Py_XDECREF( exception );
- Py_XDECREF( err );
- Py_XDECREF( tb );
- /* printf( "imported from text buffer...\n" ); */
+ PyErr_Fetch(&exception, &err, &tb); /*restore for probable later use */
+
+ newmodule= bpy_text_reimport(module, &found);
+ if(newmodule) {/* found module as blender text, ignore above exception */
+ PyErr_Clear();
+ Py_XDECREF(exception);
+ Py_XDECREF(err);
+ Py_XDECREF(tb);
+ /* printf("imported from text buffer...\n"); */
}
else if (found==1) { /* blender text module failed to execute but was found, use its error message */
- Py_XDECREF( exception );
- Py_XDECREF( err );
- Py_XDECREF( tb );
+ Py_XDECREF(exception);
+ Py_XDECREF(err);
+ Py_XDECREF(tb);
return NULL;
}
else {
/* no blender text was found that could import the module
* rause the original error from PyImport_ImportModuleEx */
- PyErr_Restore( exception, err, tb );
+ PyErr_Restore(exception, err, tb);
}
return newmodule;
}
-PyMethodDef bpy_import_meth = {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"};
-PyMethodDef bpy_reload_meth = {"bpy_reload_meth", (PyCFunction)blender_reload, METH_O, "blenders reload"};
+PyMethodDef bpy_import_meth= {"bpy_import_meth", (PyCFunction)blender_import, METH_VARARGS | METH_KEYWORDS, "blenders import"};
+PyMethodDef bpy_reload_meth= {"bpy_reload_meth", (PyCFunction)blender_reload, METH_O, "blenders reload"};
/* Clear user modules.
@@ -329,7 +348,7 @@ void bpy_text_clear_modules(int clear_all)
/* looping over the dict */
PyObject *key, *value;
- int pos = 0;
+ int pos= 0;
/* new list */
PyObject *list;
@@ -346,7 +365,7 @@ void bpy_text_clear_modules(int clear_all)
fname= PyModule_GetFilename(value);
if(fname) {
if (clear_all || ((strstr(fname, SEPSTR))==0)) { /* no path ? */
- file_extension = strstr(fname, ".py");
+ file_extension= strstr(fname, ".py");
if(file_extension && (*(file_extension + 3) == '\0' || *(file_extension + 4) == '\0')) { /* .py or pyc extension? */
/* now we can be fairly sure its a python import from the blendfile */
PyList_Append(list, key); /* free'd with the list */
diff --git a/source/blender/python/generic/bpy_internal_import.h b/source/blender/python/generic/bpy_internal_import.h
index 529c2c44df1..eb49a3e7c6c 100644
--- a/source/blender/python/generic/bpy_internal_import.h
+++ b/source/blender/python/generic/bpy_internal_import.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/bpy_internal_import.h
+ * \ingroup pygen
+ */
+
+
/* Note, the BGE needs to use this too, keep it minimal */
#ifndef BPY_INTERNAL_IMPORT_H
@@ -42,12 +47,14 @@
struct Text;
+void bpy_import_init(PyObject *builtins);
+
PyObject* bpy_text_import(struct Text *text);
PyObject* bpy_text_import_name(char *name, int *found);
PyObject* bpy_text_reimport(PyObject *module, int *found);
/* void bpy_text_clear_modules(int clear_all);*/ /* Clear user modules */
-void bpy_text_filename_get(char *fn, struct Text *text);
+void bpy_text_filename_get(char *fn, size_t fn_len, struct Text *text);
extern PyMethodDef bpy_import_meth;
extern PyMethodDef bpy_reload_meth;
diff --git a/source/blender/python/generic/mathutils.c b/source/blender/python/generic/mathutils.c
index b925dfc0d32..e94f7f798fc 100644
--- a/source/blender/python/generic/mathutils.c
+++ b/source/blender/python/generic/mathutils.c
@@ -27,64 +27,8 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/* Note: Changes to Mathutils since 2.4x
- * use radians rather then degrees
- * - Mathutils.Vector/Euler/Quaternion(), now only take single sequence arguments.
- * - Mathutils.MidpointVecs --> vector.lerp(other, fac)
- * - Mathutils.AngleBetweenVecs --> vector.angle(other)
- * - Mathutils.ProjectVecs --> vector.project(other)
- * - Mathutils.DifferenceQuats --> quat.difference(other)
- * - Mathutils.Slerp --> quat.slerp(other, fac)
- * - Mathutils.Rand: removed, use pythons random module
- * - Mathutils.RotationMatrix(angle, size, axis_flag, axis) --> Mathutils.RotationMatrix(angle, size, axis); merge axis & axis_flag args
- * - Mathutils.OrthoProjectionMatrix(plane, size, axis) --> Mathutils.OrthoProjectionMatrix(axis, size); merge axis & plane args
- * - Mathutils.ShearMatrix(plane, factor, size) --> Mathutils.ShearMatrix(plane, size, factor); swap size & factor args, match other constructors.
- * - Matrix.scalePart --> Matrix.scale_part
- * - Matrix.translationPart --> Matrix.translation_part
- * - Matrix.rotationPart --> Matrix.rotation_part
- * - mathutils.Matrix.Shear(plane, fac, size), now takes a pair of floats for 3x3 or 4x4 shear factor.
- * - toMatrix --> to_matrix
- * - toEuler --> to_euler
- * - toQuat --> to_quat
- * - Vector.toTrackQuat --> Vector.to_track_quat
- * - Vector.rotate(axis, angle) --> rotate(other), where other can be Euler/Quaternion/Matrix.
- * - Quaternion * Quaternion --> cross product (not dot product)
- * - Euler.rotate(angle, axis) --> Euler.rotate_axis(axis, angle)
- * - Euler.unique() *removed*, not a standard function only toggled different rotations.
- * - Matrix.rotation_part() -> to_3x3()
- * - Matrix.scale_part() -> to_scale()
- * - Matrix.translation_part() -> to_translation()
- * - Matrix.resize4x4() -> resize_4x4()
- * - Euler.to_quat() -> to_quaternion()
- * - Matrix.to_quat() -> to_quaternion()
- * resizing nolonger returns the resized value.
- * - Vector.resize2D -> resize_2d
- * - Vector.resize3D -> resize_3d
- * - Vector.resize4D -> resize_4d
- * added new functions.
- * - Vector.to_2d()
- * - Vector.to_3d()
- * - Vector.to_4d()
- * moved into class functions.
- * - Mathutils.RotationMatrix -> mathutils.Matrix.Rotation
- * - Mathutils.ScaleMatrix -> mathutils.Matrix.Scale
- * - Mathutils.ShearMatrix -> mathutils.Matrix.Shear
- * - Mathutils.TranslationMatrix -> mathutils.Matrix.Translation
- * - Mathutils.OrthoProjectionMatrix -> mathutils.Matrix.OrthoProjection
- *
- * Moved to Geometry module: Intersect, TriangleArea, TriangleNormal, QuadNormal, LineIntersect
- * - geometry.Intersect -> intersect_ray_tri
- * - geometry.ClosestPointOnLine -> intersect_point_line
- * - geometry.PointInTriangle2D -> intersect_point_tri_2d
- * - geometry.PointInQuad2D -> intersect_point_quad_2d
- * - geometry.LineIntersect -> intersect_line_line
- * - geometry.LineIntersect2D -> intersect_line_line_2d
- * - geometry.BezierInterp -> interpolate_bezier
- * - geometry.TriangleArea -> area_tri
- * - geometry.QuadNormal, TriangleNormal -> normal
- * - geometry.PolyFill -> tesselate_polygon
- * - geometry.BoxPack2D -> box_pack_2d
- * - geometry.BarycentricTransform -> barycentric_transform
+/** \file blender/python/generic/mathutils.c
+ * \ingroup pygen
*/
#include <Python.h>
@@ -94,9 +38,6 @@
#include "BLI_math.h"
#include "BLI_utildefines.h"
-
-
-//-------------------------DOC STRINGS ---------------------------
static char M_Mathutils_doc[] =
"This module provides access to matrices, eulers, quaternions and vectors."
;
@@ -125,7 +66,7 @@ static int mathutils_array_parse_fast(float *array, int array_min, int array_max
i= size;
do {
i--;
- if(((array[i]= PyFloat_AsDouble((item= PySequence_Fast_GET_ITEM(value_fast, i)))) == -1.0) && PyErr_Occurred()) {
+ if(((array[i]= PyFloat_AsDouble((item= PySequence_Fast_GET_ITEM(value_fast, i)))) == -1.0f) && PyErr_Occurred()) {
PyErr_Format(PyExc_ValueError, "%.200s: sequence index %d expected a number, found '%.200s' type, ", error_prefix, i, Py_TYPE(item)->tp_name);
Py_DECREF(value_fast);
return -1;
@@ -147,7 +88,7 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *
(QuaternionObject_Check(value) && (size= 4)) ||
(ColorObject_Check(value) && (size= 3))
) {
- if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ if(BaseMath_ReadCallback((BaseMathObject *)value) == -1) {
return -1;
}
@@ -170,7 +111,7 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *
int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error_prefix)
{
if(EulerObject_Check(value)) {
- if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ if(BaseMath_ReadCallback((BaseMathObject *)value) == -1) {
return -1;
}
else {
@@ -179,7 +120,7 @@ int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error
}
}
else if (QuaternionObject_Check(value)) {
- if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ if(BaseMath_ReadCallback((BaseMathObject *)value) == -1) {
return -1;
}
else {
@@ -190,7 +131,7 @@ int mathutils_any_to_rotmat(float rmat[3][3], PyObject *value, const char *error
}
}
else if (MatrixObject_Check(value)) {
- if(!BaseMath_ReadCallback((BaseMathObject *)value)) {
+ if(BaseMath_ReadCallback((BaseMathObject *)value) == -1) {
return -1;
}
else if(((MatrixObject *)value)->col_size < 3 || ((MatrixObject *)value)->row_size < 3) {
@@ -269,45 +210,45 @@ int Mathutils_RegisterCallback(Mathutils_Callback *cb)
int _BaseMathObject_ReadCallback(BaseMathObject *self)
{
Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
- if(cb->get(self, self->cb_subtype))
- return 1;
+ if(cb->get(self, self->cb_subtype) != -1)
+ return 0;
if(!PyErr_Occurred())
- PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name);
- return 0;
+ PyErr_Format(PyExc_RuntimeError, "%s read, user has become invalid", Py_TYPE(self)->tp_name);
+ return -1;
}
int _BaseMathObject_WriteCallback(BaseMathObject *self)
{
Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
- if(cb->set(self, self->cb_subtype))
- return 1;
+ if(cb->set(self, self->cb_subtype) != -1)
+ return 0;
if(!PyErr_Occurred())
- PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name);
- return 0;
+ PyErr_Format(PyExc_RuntimeError, "%s write, user has become invalid", Py_TYPE(self)->tp_name);
+ return -1;
}
int _BaseMathObject_ReadIndexCallback(BaseMathObject *self, int index)
{
Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
- if(cb->get_index(self, self->cb_subtype, index))
- return 1;
+ if(cb->get_index(self, self->cb_subtype, index) != -1)
+ return 0;
if(!PyErr_Occurred())
- PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name);
- return 0;
+ PyErr_Format(PyExc_RuntimeError, "%s read index, user has become invalid", Py_TYPE(self)->tp_name);
+ return -1;
}
int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index)
{
Mathutils_Callback *cb= mathutils_callbacks[self->cb_type];
- if(cb->set_index(self, self->cb_subtype, index))
- return 1;
+ if(cb->set_index(self, self->cb_subtype, index) != -1)
+ return 0;
if(!PyErr_Occurred())
- PyErr_Format(PyExc_RuntimeError, "%s user has become invalid", Py_TYPE(self)->tp_name);
- return 0;
+ PyErr_Format(PyExc_RuntimeError, "%s write index, user has become invalid", Py_TYPE(self)->tp_name);
+ return -1;
}
/* BaseMathObject generic functions for all mathutils types */
@@ -344,7 +285,10 @@ void BaseMathObject_dealloc(BaseMathObject *self)
PyMem_Free(self->data);
}
- BaseMathObject_clear(self);
+ if(self->cb_user) {
+ PyObject_GC_UnTrack(self);
+ BaseMathObject_clear(self);
+ }
Py_TYPE(self)->tp_free(self); // PyObject_DEL(self); // breaks subtypes
}
@@ -371,28 +315,28 @@ PyMODINIT_FUNC BPyInit_mathutils(void)
PyObject *submodule;
PyObject *item;
- if( PyType_Ready( &vector_Type ) < 0 )
+ if(PyType_Ready(&vector_Type) < 0)
return NULL;
- if( PyType_Ready( &matrix_Type ) < 0 )
+ if(PyType_Ready(&matrix_Type) < 0)
return NULL;
- if( PyType_Ready( &euler_Type ) < 0 )
+ if(PyType_Ready(&euler_Type) < 0)
return NULL;
- if( PyType_Ready( &quaternion_Type ) < 0 )
+ if(PyType_Ready(&quaternion_Type) < 0)
return NULL;
- if( PyType_Ready( &color_Type ) < 0 )
+ if(PyType_Ready(&color_Type) < 0)
return NULL;
submodule = PyModule_Create(&M_Mathutils_module_def);
/* each type has its own new() function */
- PyModule_AddObject( submodule, "Vector", (PyObject *)&vector_Type );
- PyModule_AddObject( submodule, "Matrix", (PyObject *)&matrix_Type );
- PyModule_AddObject( submodule, "Euler", (PyObject *)&euler_Type );
- PyModule_AddObject( submodule, "Quaternion", (PyObject *)&quaternion_Type );
- PyModule_AddObject( submodule, "Color", (PyObject *)&color_Type );
+ PyModule_AddObject(submodule, "Vector", (PyObject *)&vector_Type);
+ PyModule_AddObject(submodule, "Matrix", (PyObject *)&matrix_Type);
+ PyModule_AddObject(submodule, "Euler", (PyObject *)&euler_Type);
+ PyModule_AddObject(submodule, "Quaternion", (PyObject *)&quaternion_Type);
+ PyModule_AddObject(submodule, "Color", (PyObject *)&color_Type);
/* submodule */
- PyModule_AddObject( submodule, "geometry", (item=BPyInit_mathutils_geometry()));
+ PyModule_AddObject(submodule, "geometry", (item=BPyInit_mathutils_geometry()));
/* XXX, python doesnt do imports with this usefully yet
* 'from mathutils.geometry import PolyFill'
* ...fails without this. */
diff --git a/source/blender/python/generic/mathutils.h b/source/blender/python/generic/mathutils.h
index 7d0644b3c76..449708d1ac1 100644
--- a/source/blender/python/generic/mathutils.h
+++ b/source/blender/python/generic/mathutils.h
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/generic/mathutils.h
+ * \ingroup pygen
+ */
+
//Include this file for access to vector, quat, matrix, euler, etc...
#ifndef MATHUTILS_H
@@ -94,10 +99,10 @@ int _BaseMathObject_ReadIndexCallback(BaseMathObject *self, int index);
int _BaseMathObject_WriteIndexCallback(BaseMathObject *self, int index);
/* since this is called so often avoid where possible */
-#define BaseMath_ReadCallback(_self) (((_self)->cb_user ? _BaseMathObject_ReadCallback((BaseMathObject *)_self):1))
-#define BaseMath_WriteCallback(_self) (((_self)->cb_user ?_BaseMathObject_WriteCallback((BaseMathObject *)_self):1))
-#define BaseMath_ReadIndexCallback(_self, _index) (((_self)->cb_user ? _BaseMathObject_ReadIndexCallback((BaseMathObject *)_self, _index):1))
-#define BaseMath_WriteIndexCallback(_self, _index) (((_self)->cb_user ? _BaseMathObject_WriteIndexCallback((BaseMathObject *)_self, _index):1))
+#define BaseMath_ReadCallback(_self) (((_self)->cb_user ? _BaseMathObject_ReadCallback((BaseMathObject *)_self):0))
+#define BaseMath_WriteCallback(_self) (((_self)->cb_user ?_BaseMathObject_WriteCallback((BaseMathObject *)_self):0))
+#define BaseMath_ReadIndexCallback(_self, _index) (((_self)->cb_user ? _BaseMathObject_ReadIndexCallback((BaseMathObject *)_self, _index):0))
+#define BaseMath_WriteIndexCallback(_self, _index) (((_self)->cb_user ? _BaseMathObject_WriteIndexCallback((BaseMathObject *)_self, _index):0))
/* utility func */
int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *value, const char *error_prefix);
diff --git a/source/blender/python/generic/mathutils_Color.c b/source/blender/python/generic/mathutils_Color.c
index 047bda1b2c5..2b68828ea0a 100644
--- a/source/blender/python/generic/mathutils_Color.c
+++ b/source/blender/python/generic/mathutils_Color.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/mathutils_Color.c
+ * \ingroup pygen
+ */
+
+
#include <Python.h>
#include "mathutils.h"
@@ -92,7 +97,7 @@ static char Color_copy_doc[] =
;
static PyObject *Color_copy(ColorObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
return newColorObject(self->col, Py_NEW, Py_TYPE(self));
@@ -104,8 +109,8 @@ static PyObject *Color_copy(ColorObject *self)
static PyObject *Color_repr(ColorObject * self)
{
PyObject *ret, *tuple;
-
- if(!BaseMath_ReadCallback(self))
+
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
tuple= Color_ToTupleExt(self, -1);
@@ -127,7 +132,7 @@ static PyObject* Color_richcmpr(PyObject *a, PyObject *b, int op)
ColorObject *colA= (ColorObject*)a;
ColorObject *colB= (ColorObject*)b;
- if(!BaseMath_ReadCallback(colA) || !BaseMath_ReadCallback(colB))
+ if(BaseMath_ReadCallback(colA) == -1 || BaseMath_ReadCallback(colB) == -1)
return NULL;
ok= EXPP_VectorsAreEqual(colA->col, colB->col, COLOR_SIZE, 1) ? 0 : -1;
@@ -172,7 +177,7 @@ static PyObject *Color_item(ColorObject * self, int i)
return NULL;
}
- if(!BaseMath_ReadIndexCallback(self, i))
+ if(BaseMath_ReadIndexCallback(self, i) == -1)
return NULL;
return PyFloat_FromDouble(self->col[i]);
@@ -198,7 +203,7 @@ static int Color_ass_item(ColorObject * self, int i, PyObject * value)
self->col[i] = f;
- if(!BaseMath_WriteIndexCallback(self, i))
+ if(BaseMath_WriteIndexCallback(self, i) == -1)
return -1;
return 0;
@@ -210,7 +215,7 @@ static PyObject *Color_slice(ColorObject * self, int begin, int end)
PyObject *tuple;
int count;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
CLAMP(begin, 0, COLOR_SIZE);
@@ -232,13 +237,13 @@ static int Color_ass_slice(ColorObject * self, int begin, int end, PyObject * se
int i, size;
float col[COLOR_SIZE];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
CLAMP(begin, 0, COLOR_SIZE);
if (end<0) end= (COLOR_SIZE + 1) + end;
CLAMP(end, 0, COLOR_SIZE);
- begin = MIN2(begin,end);
+ begin = MIN2(begin, end);
if((size=mathutils_array_parse(col, 0, COLOR_SIZE, seq, "mathutils.Color[begin:end] = []")) == -1)
return -1;
@@ -265,7 +270,8 @@ static PyObject *Color_subscript(ColorObject *self, PyObject *item)
if (i < 0)
i += COLOR_SIZE;
return Color_item(self, i);
- } else if (PySlice_Check(item)) {
+ }
+ else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
if (PySlice_GetIndicesEx((void *)item, COLOR_SIZE, &start, &stop, &step, &slicelength) < 0)
@@ -338,7 +344,7 @@ static PyMappingMethods Color_AsMapping = {
};
/* color channel, vector.r/g/b */
-static PyObject *Color_getChannel( ColorObject * self, void *type )
+static PyObject *Color_getChannel(ColorObject * self, void *type)
{
return Color_item(self, GET_INT_FROM_POINTER(type));
}
@@ -349,12 +355,12 @@ static int Color_setChannel(ColorObject * self, PyObject * value, void * type)
}
/* color channel (HSV), color.h/s/v */
-static PyObject *Color_getChannelHSV( ColorObject * self, void *type )
+static PyObject *Color_getChannelHSV(ColorObject * self, void *type)
{
float hsv[3];
int i= GET_INT_FROM_POINTER(type);
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
rgb_to_hsv(self->col[0], self->col[1], self->col[2], &(hsv[0]), &(hsv[1]), &(hsv[2]));
@@ -373,7 +379,7 @@ static int Color_setChannelHSV(ColorObject * self, PyObject * value, void * type
return -1;
}
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
rgb_to_hsv(self->col[0], self->col[1], self->col[2], &(hsv[0]), &(hsv[1]), &(hsv[2]));
@@ -381,7 +387,7 @@ static int Color_setChannelHSV(ColorObject * self, PyObject * value, void * type
hsv[i] = f;
hsv_to_rgb(hsv[0], hsv[1], hsv[2], &(self->col[0]), &(self->col[1]), &(self->col[2]));
- if(!BaseMath_WriteCallback(self))
+ if(BaseMath_WriteCallback(self) == -1)
return -1;
return 0;
@@ -393,7 +399,7 @@ static PyObject *Color_getHSV(ColorObject * self, void *UNUSED(closure))
float hsv[3];
PyObject *ret;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
rgb_to_hsv(self->col[0], self->col[1], self->col[2], &(hsv[0]), &(hsv[1]), &(hsv[2]));
@@ -418,7 +424,7 @@ static int Color_setHSV(ColorObject * self, PyObject * value, void *UNUSED(closu
hsv_to_rgb(hsv[0], hsv[1], hsv[2], &(self->col[0]), &(self->col[1]), &(self->col[2]));
- if(!BaseMath_WriteCallback(self))
+ if(BaseMath_WriteCallback(self) == -1)
return -1;
return 0;
@@ -440,7 +446,7 @@ static PyGetSetDef Color_getseters[] = {
{(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, BaseMathObject_Wrapped_doc, NULL},
{(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, BaseMathObject_Owner_doc, NULL},
- {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
@@ -551,6 +557,7 @@ PyObject *newColorObject_cb(PyObject *cb_user, int cb_type, int cb_subtype)
self->cb_user= cb_user;
self->cb_type= (unsigned char)cb_type;
self->cb_subtype= (unsigned char)cb_subtype;
+ PyObject_GC_Track(self);
}
return (PyObject *)self;
diff --git a/source/blender/python/generic/mathutils_Color.h b/source/blender/python/generic/mathutils_Color.h
index 619cccbe085..0fc880363f4 100644
--- a/source/blender/python/generic/mathutils_Color.h
+++ b/source/blender/python/generic/mathutils_Color.h
@@ -28,6 +28,11 @@
*
*/
+/** \file blender/python/generic/mathutils_Color.h
+ * \ingroup pygen
+ */
+
+
#ifndef MATHUTILS_COLOR_H
#define MATHUTILS_COLOR_H
diff --git a/source/blender/python/generic/mathutils_Euler.c b/source/blender/python/generic/mathutils_Euler.c
index 95e7483d7be..d8dd4e5fbb3 100644
--- a/source/blender/python/generic/mathutils_Euler.c
+++ b/source/blender/python/generic/mathutils_Euler.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/mathutils_Euler.c
+ * \ingroup pygen
+ */
+
+
#include <Python.h>
#include "mathutils.h"
@@ -133,7 +138,7 @@ static PyObject *Euler_to_quaternion(EulerObject * self)
{
float quat[4];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
eulO_to_quat(quat, self->eul, self->order);
@@ -154,7 +159,7 @@ static PyObject *Euler_to_matrix(EulerObject * self)
{
float mat[9];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
eulO_to_mat3((float (*)[3])mat, self->eul, self->order);
@@ -172,7 +177,9 @@ static PyObject *Euler_zero(EulerObject * self)
{
zero_v3(self->eul);
- (void)BaseMath_WriteCallback(self);
+ if(BaseMath_WriteCallback(self) == -1)
+ return NULL;
+
Py_RETURN_NONE;
}
@@ -192,7 +199,7 @@ static PyObject *Euler_rotate_axis(EulerObject * self, PyObject *args)
const char *axis;
if(!PyArg_ParseTuple(args, "sf:rotate", &axis, &angle)){
- PyErr_SetString(PyExc_TypeError, "euler.rotate(): expected angle (float) and axis (x,y,z)");
+ PyErr_SetString(PyExc_TypeError, "euler.rotate(): expected angle (float) and axis (x, y, z)");
return NULL;
}
if(!(ELEM3(*axis, 'X', 'Y', 'Z') && axis[1]=='\0')){
@@ -200,7 +207,7 @@ static PyObject *Euler_rotate_axis(EulerObject * self, PyObject *args)
return NULL;
}
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
@@ -223,7 +230,7 @@ static PyObject *Euler_rotate(EulerObject * self, PyObject *value)
{
float self_rmat[3][3], other_rmat[3][3], rmat[3][3];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_any_to_rotmat(other_rmat, value, "euler.rotate(value)") == -1)
@@ -249,7 +256,7 @@ static PyObject *Euler_make_compatible(EulerObject * self, PyObject *value)
{
float teul[EULER_SIZE];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_array_parse(teul, EULER_SIZE, EULER_SIZE, value, "euler.make_compatible(other), invalid 'other' arg") == -1)
@@ -277,7 +284,7 @@ static char Euler_copy_doc[] =
;
static PyObject *Euler_copy(EulerObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
return newEulerObject(self->eul, self->order, Py_NEW, Py_TYPE(self));
@@ -290,7 +297,7 @@ static PyObject *Euler_repr(EulerObject * self)
{
PyObject *ret, *tuple;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
tuple= Euler_ToTupleExt(self, -1);
@@ -310,7 +317,7 @@ static PyObject* Euler_richcmpr(PyObject *a, PyObject *b, int op)
EulerObject *eulA= (EulerObject*)a;
EulerObject *eulB= (EulerObject*)b;
- if(!BaseMath_ReadCallback(eulA) || !BaseMath_ReadCallback(eulB))
+ if(BaseMath_ReadCallback(eulA) == -1 || BaseMath_ReadCallback(eulB) == -1)
return NULL;
ok= ((eulA->order == eulB->order) && EXPP_VectorsAreEqual(eulA->eul, eulB->eul, EULER_SIZE, 1)) ? 0 : -1;
@@ -355,7 +362,7 @@ static PyObject *Euler_item(EulerObject * self, int i)
return NULL;
}
- if(!BaseMath_ReadIndexCallback(self, i))
+ if(BaseMath_ReadIndexCallback(self, i) == -1)
return NULL;
return PyFloat_FromDouble(self->eul[i]);
@@ -381,7 +388,7 @@ static int Euler_ass_item(EulerObject * self, int i, PyObject *value)
self->eul[i] = f;
- if(!BaseMath_WriteIndexCallback(self, i))
+ if(BaseMath_WriteIndexCallback(self, i) == -1)
return -1;
return 0;
@@ -393,7 +400,7 @@ static PyObject *Euler_slice(EulerObject * self, int begin, int end)
PyObject *tuple;
int count;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
CLAMP(begin, 0, EULER_SIZE);
@@ -415,13 +422,13 @@ static int Euler_ass_slice(EulerObject * self, int begin, int end, PyObject * se
int i, size;
float eul[EULER_SIZE];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
CLAMP(begin, 0, EULER_SIZE);
if (end<0) end= (EULER_SIZE + 1) + end;
CLAMP(end, 0, EULER_SIZE);
- begin = MIN2(begin,end);
+ begin = MIN2(begin, end);
if((size=mathutils_array_parse(eul, 0, EULER_SIZE, seq, "mathutils.Euler[begin:end] = []")) == -1)
return -1;
@@ -448,7 +455,8 @@ static PyObject *Euler_subscript(EulerObject *self, PyObject *item)
if (i < 0)
i += EULER_SIZE;
return Euler_item(self, i);
- } else if (PySlice_Check(item)) {
+ }
+ else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
if (PySlice_GetIndicesEx((void *)item, EULER_SIZE, &start, &stop, &step, &slicelength) < 0)
@@ -524,7 +532,7 @@ static PyMappingMethods Euler_AsMapping = {
/*
* euler axis, euler.x/y/z
*/
-static PyObject *Euler_getAxis(EulerObject *self, void *type )
+static PyObject *Euler_getAxis(EulerObject *self, void *type)
{
return Euler_item(self, GET_INT_FROM_POINTER(type));
}
@@ -537,7 +545,7 @@ static int Euler_setAxis(EulerObject *self, PyObject *value, void *type)
/* rotation order */
static PyObject *Euler_getOrder(EulerObject *self, void *UNUSED(closure))
{
- if(!BaseMath_ReadCallback(self)) /* can read order too */
+ if(BaseMath_ReadCallback(self) == -1) /* can read order too */
return NULL;
return PyUnicode_FromString(euler_order_str(self));
@@ -567,7 +575,7 @@ static PyGetSetDef Euler_getseters[] = {
{(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
{(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
- {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
@@ -688,6 +696,7 @@ PyObject *newEulerObject_cb(PyObject *cb_user, short order, int cb_type, int cb_
self->cb_user= cb_user;
self->cb_type= (unsigned char)cb_type;
self->cb_subtype= (unsigned char)cb_subtype;
+ PyObject_GC_Track(self);
}
return (PyObject *)self;
diff --git a/source/blender/python/generic/mathutils_Euler.h b/source/blender/python/generic/mathutils_Euler.h
index 1bb26ec21d2..849e16c2bb7 100644
--- a/source/blender/python/generic/mathutils_Euler.h
+++ b/source/blender/python/generic/mathutils_Euler.h
@@ -28,6 +28,11 @@
*
*/
+/** \file blender/python/generic/mathutils_Euler.h
+ * \ingroup pygen
+ */
+
+
#ifndef MATHUTILS_EULER_H
#define MATHUTILS_EULER_H
diff --git a/source/blender/python/generic/mathutils_Matrix.c b/source/blender/python/generic/mathutils_Matrix.c
index 07d4dc880c2..41d9626db16 100644
--- a/source/blender/python/generic/mathutils_Matrix.c
+++ b/source/blender/python/generic/mathutils_Matrix.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/mathutils_Matrix.c
+ * \ingroup pygen
+ */
+
+
#include <Python.h>
#include "mathutils.h"
@@ -51,13 +56,13 @@ static int mathutils_matrix_vector_get(BaseMathObject *bmo, int subtype)
MatrixObject *self= (MatrixObject *)bmo->cb_user;
int i;
- if(!BaseMath_ReadCallback(self))
- return 0;
+ if(BaseMath_ReadCallback(self) == -1)
+ return -1;
for(i=0; i < self->col_size; i++)
bmo->data[i]= self->matrix[subtype][i];
- return 1;
+ return 0;
}
static int mathutils_matrix_vector_set(BaseMathObject *bmo, int subtype)
@@ -65,38 +70,38 @@ static int mathutils_matrix_vector_set(BaseMathObject *bmo, int subtype)
MatrixObject *self= (MatrixObject *)bmo->cb_user;
int i;
- if(!BaseMath_ReadCallback(self))
- return 0;
+ if(BaseMath_ReadCallback(self) == -1)
+ return -1;
for(i=0; i < self->col_size; i++)
self->matrix[subtype][i]= bmo->data[i];
(void)BaseMath_WriteCallback(self);
- return 1;
+ return 0;
}
static int mathutils_matrix_vector_get_index(BaseMathObject *bmo, int subtype, int index)
{
MatrixObject *self= (MatrixObject *)bmo->cb_user;
- if(!BaseMath_ReadCallback(self))
- return 0;
+ if(BaseMath_ReadCallback(self) == -1)
+ return -1;
bmo->data[index]= self->matrix[subtype][index];
- return 1;
+ return 0;
}
static int mathutils_matrix_vector_set_index(BaseMathObject *bmo, int subtype, int index)
{
MatrixObject *self= (MatrixObject *)bmo->cb_user;
- if(!BaseMath_ReadCallback(self))
- return 0;
+ if(BaseMath_ReadCallback(self) == -1)
+ return -1;
self->matrix[subtype][index]= bmo->data[index];
(void)BaseMath_WriteCallback(self);
- return 1;
+ return 0;
}
Mathutils_Callback mathutils_matrix_vector_cb = {
@@ -109,7 +114,7 @@ Mathutils_Callback mathutils_matrix_vector_cb = {
/* matrix vector callbacks, this is so you can do matrix[i][j] = val */
//----------------------------------mathutils.Matrix() -----------------
-//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+//mat is a 1D array of floats - row[0][0], row[0][1], row[1][0], etc.
//create a new matrix type
static PyObject *Matrix_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
@@ -180,7 +185,7 @@ static void matrix_3x3_as_4x4(float mat[16])
/*-----------------------CLASS-METHODS----------------------------*/
-//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+//mat is a 1D array of floats - row[0][0], row[0][1], row[1][0], etc.
static char C_Matrix_Rotation_doc[] =
".. classmethod:: Rotation(angle, size, axis)\n"
"\n"
@@ -221,8 +226,7 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
}
}
- /* clamp angle between -360 and 360 in radians */
- angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2;
+ angle= angle_wrap_rad(angle);
if(matSize != 2 && matSize != 3 && matSize != 4) {
PyErr_SetString(PyExc_AttributeError, "mathutils.RotationMatrix(): can only return a 2x2 3x3 or 4x4 matrix");
@@ -252,21 +256,24 @@ static PyObject *C_Matrix_Rotation(PyObject *cls, PyObject *args)
mat[1] = (float) sin (angle);
mat[2] = -((float) sin(angle));
mat[3] = (float) cos(angle);
- } else if(strcmp(axis, "X") == 0) {
+ }
+ else if(strcmp(axis, "X") == 0) {
//rotation around X
mat[0] = 1.0f;
mat[4] = (float) cos(angle);
mat[5] = (float) sin(angle);
mat[7] = -((float) sin(angle));
mat[8] = (float) cos(angle);
- } else if(strcmp(axis, "Y") == 0) {
+ }
+ else if(strcmp(axis, "Y") == 0) {
//rotation around Y
mat[0] = (float) cos(angle);
mat[2] = -((float) sin(angle));
mat[4] = 1.0f;
mat[6] = (float) sin(angle);
mat[8] = (float) cos(angle);
- } else if(strcmp(axis, "Z") == 0) {
+ }
+ else if(strcmp(axis, "Z") == 0) {
//rotation around Z
mat[0] = (float) cos(angle);
mat[1] = (float) sin(angle);
@@ -311,7 +318,7 @@ static PyObject *C_Matrix_Translation(PyObject *cls, PyObject *value)
return newMatrixObject(mat, 4, 4, Py_NEW, (PyTypeObject *)cls);
}
//----------------------------------mathutils.Matrix.Scale() -------------
-//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+//mat is a 1D array of floats - row[0][0], row[0][1], row[1][0], etc.
static char C_Matrix_Scale_doc[] =
".. classmethod:: Scale(factor, size, axis)\n"
"\n"
@@ -394,7 +401,7 @@ static PyObject *C_Matrix_Scale(PyObject *cls, PyObject *args)
return newMatrixObject(mat, matSize, matSize, Py_NEW, (PyTypeObject *)cls);
}
//----------------------------------mathutils.Matrix.OrthoProjection() ---
-//mat is a 1D array of floats - row[0][0],row[0][1], row[1][0], etc.
+//mat is a 1D array of floats - row[0][0], row[0][1], row[1][0], etc.
static char C_Matrix_OrthoProjection_doc[] =
".. classmethod:: OrthoProjection(axis, size)\n"
"\n"
@@ -534,7 +541,7 @@ static PyObject *C_Matrix_Shear(PyObject *cls, PyObject *args)
if(matSize == 2) {
float const factor= PyFloat_AsDouble(fac);
- if(factor==-1.0 && PyErr_Occurred()) {
+ if(factor==-1.0f && PyErr_Occurred()) {
PyErr_SetString(PyExc_AttributeError, "mathutils.Matrix.Shear(): the factor to be a float");
return NULL;
}
@@ -605,7 +612,8 @@ static float matrix_determinant_internal(MatrixObject *self)
if(self->row_size == 2) {
return determinant_m2(self->matrix[0][0], self->matrix[0][1],
self->matrix[1][0], self->matrix[1][1]);
- } else if(self->row_size == 3) {
+ }
+ else if(self->row_size == 3) {
return determinant_m3(self->matrix[0][0], self->matrix[0][1],
self->matrix[0][2], self->matrix[1][0],
self->matrix[1][1], self->matrix[1][2],
@@ -630,7 +638,7 @@ static PyObject *Matrix_to_quaternion(MatrixObject *self)
{
float quat[4];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
/*must be 3-4 cols, 3-4 rows, square matrix*/
@@ -639,9 +647,10 @@ static PyObject *Matrix_to_quaternion(MatrixObject *self)
return NULL;
}
if(self->col_size == 3){
- mat3_to_quat( quat,(float (*)[3])self->contigPtr);
- }else{
- mat4_to_quat( quat,(float (*)[4])self->contigPtr);
+ mat3_to_quat(quat, (float (*)[3])self->contigPtr);
+ }
+ else {
+ mat4_to_quat(quat, (float (*)[4])self->contigPtr);
}
return newQuaternionObject(quat, Py_NEW, NULL);
@@ -670,14 +679,14 @@ static PyObject *Matrix_to_euler(MatrixObject *self, PyObject *args)
float tmat[3][3];
float (*mat)[3];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(!PyArg_ParseTuple(args, "|sO!:to_euler", &order_str, &euler_Type, &eul_compat))
return NULL;
if(eul_compat) {
- if(!BaseMath_ReadCallback(eul_compat))
+ if(BaseMath_ReadCallback(eul_compat) == -1)
return NULL;
copy_v3_v3(eul_compatf, eul_compat->eul);
@@ -686,10 +695,12 @@ static PyObject *Matrix_to_euler(MatrixObject *self, PyObject *args)
/*must be 3-4 cols, 3-4 rows, square matrix*/
if(self->col_size ==3 && self->row_size ==3) {
mat= (float (*)[3])self->contigPtr;
- }else if (self->col_size ==4 && self->row_size ==4) {
+ }
+ else if (self->col_size ==4 && self->row_size ==4) {
copy_m3_m4(tmat, (float (*)[4])self->contigPtr);
mat= tmat;
- }else {
+ }
+ else {
PyErr_SetString(PyExc_AttributeError, "Matrix.to_euler(): inappropriate matrix size - expects 3x3 or 4x4 matrix");
return NULL;
}
@@ -702,7 +713,7 @@ static PyObject *Matrix_to_euler(MatrixObject *self, PyObject *args)
}
if(eul_compat) {
- if(order == 1) mat3_to_compatible_eul( eul, eul_compatf, mat);
+ if(order == 1) mat3_to_compatible_eul(eul, eul_compatf, mat);
else mat3_to_compatible_eulO(eul, eul_compatf, order, mat);
}
else {
@@ -746,7 +757,8 @@ static PyObject *Matrix_resize_4x4(MatrixObject *self)
index = (4 * (self->row_size + (blank_rows - 1))) + x;
if (index == 10 || index == 15){
self->contigPtr[index] = 1.0f;
- }else{
+ }
+ else {
self->contigPtr[index] = 0.0f;
}
}
@@ -754,7 +766,7 @@ static PyObject *Matrix_resize_4x4(MatrixObject *self)
for(x = 1; x <= self->row_size; x++){
first_row_elem = (self->col_size * (self->row_size - x));
curr_pos = (first_row_elem + (self->col_size -1));
- new_pos = (4 * (self->row_size - x )) + (curr_pos - first_row_elem);
+ new_pos = (4 * (self->row_size - x)) + (curr_pos - first_row_elem);
for(blank_columns = (4 - self->col_size); blank_columns > 0; blank_columns--){
self->contigPtr[new_pos + blank_columns] = 0.0f;
}
@@ -779,7 +791,7 @@ static char Matrix_to_4x4_doc[] =
;
static PyObject *Matrix_to_4x4(MatrixObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(self->col_size==4 && self->row_size==4) {
@@ -808,7 +820,7 @@ static PyObject *Matrix_to_3x3(MatrixObject *self)
{
float mat[3][3];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if((self->col_size < 3) || (self->row_size < 3)) {
@@ -831,7 +843,7 @@ static char Matrix_to_translation_doc[] =
;
static PyObject *Matrix_to_translation(MatrixObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if((self->col_size < 3) || self->row_size < 4){
@@ -858,7 +870,7 @@ static PyObject *Matrix_to_scale(MatrixObject *self)
float mat[3][3];
float size[3];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
/*must be 3-4 cols, 3-4 rows, square matrix*/
@@ -893,7 +905,7 @@ static PyObject *Matrix_invert(MatrixObject *self)
float mat[16] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(self->row_size != self->col_size){
@@ -967,7 +979,7 @@ static PyObject *Matrix_rotate(MatrixObject *self, PyObject *value)
{
float self_rmat[3][3], other_rmat[3][3], rmat[3][3];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_any_to_rotmat(other_rmat, value, "matrix.rotate(value)") == -1)
@@ -1009,7 +1021,7 @@ static PyObject *Matrix_decompose(MatrixObject *self)
return NULL;
}
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
mat4_to_loc_rot_size(loc, rot, size, (float (*)[4])self->contigPtr);
@@ -1050,7 +1062,7 @@ static PyObject *Matrix_lerp(MatrixObject *self, PyObject *args)
return NULL;
}
- if(!BaseMath_ReadCallback(self) || !BaseMath_ReadCallback(mat2))
+ if(BaseMath_ReadCallback(self) == -1 || BaseMath_ReadCallback(mat2) == -1)
return NULL;
/* TODO, different sized matrix */
@@ -1081,7 +1093,7 @@ static char Matrix_determinant_doc[] =
;
static PyObject *Matrix_determinant(MatrixObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(self->row_size != self->col_size){
@@ -1103,7 +1115,7 @@ static PyObject *Matrix_transpose(MatrixObject *self)
{
float t = 0.0f;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(self->row_size != self->col_size){
@@ -1151,7 +1163,7 @@ static PyObject *Matrix_zero(MatrixObject *self)
{
fill_vn(self->contigPtr, self->row_size * self->col_size, 0.0f);
- if(!BaseMath_WriteCallback(self))
+ if(BaseMath_WriteCallback(self) == -1)
return NULL;
Py_RETURN_NONE;
@@ -1168,7 +1180,7 @@ static char Matrix_identity_doc[] =
;
static PyObject *Matrix_identity(MatrixObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(self->row_size != self->col_size){
@@ -1187,7 +1199,7 @@ static PyObject *Matrix_identity(MatrixObject *self)
unit_m4((float (*)[4])self->contigPtr);
}
- if(!BaseMath_WriteCallback(self))
+ if(BaseMath_WriteCallback(self) == -1)
return NULL;
Py_RETURN_NONE;
@@ -1204,7 +1216,7 @@ static char Matrix_copy_doc[] =
;
static PyObject *Matrix_copy(MatrixObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
return (PyObject*)newMatrixObject((float (*))self->contigPtr, self->row_size, self->col_size, Py_NEW, Py_TYPE(self));
@@ -1217,7 +1229,7 @@ static PyObject *Matrix_repr(MatrixObject *self)
int x, y;
PyObject *rows[MATRIX_MAX_DIM]= {NULL};
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
for(x = 0; x < self->row_size; x++){
@@ -1253,7 +1265,7 @@ static PyObject* Matrix_richcmpr(PyObject *a, PyObject *b, int op)
MatrixObject *matA= (MatrixObject*)a;
MatrixObject *matB= (MatrixObject*)b;
- if(!BaseMath_ReadCallback(matA) || !BaseMath_ReadCallback(matB))
+ if(BaseMath_ReadCallback(matA) == -1 || BaseMath_ReadCallback(matB) == -1)
return NULL;
ok= ( (matA->col_size == matB->col_size) &&
@@ -1295,7 +1307,7 @@ static int Matrix_len(MatrixObject *self)
the wrapped vector gives direct access to the matrix data*/
static PyObject *Matrix_item(MatrixObject *self, int i)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(i < 0 || i >= self->row_size) {
@@ -1310,7 +1322,7 @@ static PyObject *Matrix_item(MatrixObject *self, int i)
static int Matrix_ass_item(MatrixObject *self, int i, PyObject *value)
{
float vec[4];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
if(i >= self->row_size || i < 0){
@@ -1336,12 +1348,12 @@ static PyObject *Matrix_slice(MatrixObject *self, int begin, int end)
PyObject *tuple;
int count;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
CLAMP(begin, 0, self->row_size);
CLAMP(end, 0, self->row_size);
- begin= MIN2(begin,end);
+ begin= MIN2(begin, end);
tuple= PyTuple_New(end - begin);
for(count= begin; count < end; count++) {
@@ -1358,12 +1370,12 @@ static int Matrix_ass_slice(MatrixObject *self, int begin, int end, PyObject *va
{
PyObject *value_fast= NULL;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
CLAMP(begin, 0, self->row_size);
CLAMP(end, 0, self->row_size);
- begin = MIN2(begin,end);
+ begin = MIN2(begin, end);
/* non list/tuple cases */
if(!(value_fast=PySequence_Fast(value, "matrix[begin:end] = value"))) {
@@ -1415,7 +1427,7 @@ static PyObject *Matrix_add(PyObject *m1, PyObject *m2)
return NULL;
}
- if(!BaseMath_ReadCallback(mat1) || !BaseMath_ReadCallback(mat2))
+ if(BaseMath_ReadCallback(mat1) == -1 || BaseMath_ReadCallback(mat2) == -1)
return NULL;
if(mat1->row_size != mat2->row_size || mat1->col_size != mat2->col_size){
@@ -1442,7 +1454,7 @@ static PyObject *Matrix_sub(PyObject *m1, PyObject *m2)
return NULL;
}
- if(!BaseMath_ReadCallback(mat1) || !BaseMath_ReadCallback(mat2))
+ if(BaseMath_ReadCallback(mat1) == -1 || BaseMath_ReadCallback(mat2) == -1)
return NULL;
if(mat1->row_size != mat2->row_size || mat1->col_size != mat2->col_size){
@@ -1471,12 +1483,12 @@ static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
if(MatrixObject_Check(m1)) {
mat1 = (MatrixObject*)m1;
- if(!BaseMath_ReadCallback(mat1))
+ if(BaseMath_ReadCallback(mat1) == -1)
return NULL;
}
if(MatrixObject_Check(m2)) {
mat2 = (MatrixObject*)m2;
- if(!BaseMath_ReadCallback(mat2))
+ if(BaseMath_ReadCallback(mat2) == -1)
return NULL;
}
@@ -1507,12 +1519,12 @@ static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
}
}
else if(mat2) {
- if (((scalar= PyFloat_AsDouble(m1)) == -1.0 && PyErr_Occurred())==0) { /*FLOAT/INT * MATRIX */
+ if (((scalar= PyFloat_AsDouble(m1)) == -1.0f && PyErr_Occurred())==0) { /*FLOAT/INT * MATRIX */
return matrix_mul_float(mat2, scalar);
}
}
else if(mat1) {
- if (((scalar= PyFloat_AsDouble(m2)) == -1.0 && PyErr_Occurred())==0) { /*FLOAT/INT * MATRIX */
+ if (((scalar= PyFloat_AsDouble(m2)) == -1.0f && PyErr_Occurred())==0) { /*FLOAT/INT * MATRIX */
return matrix_mul_float(mat1, scalar);
}
}
@@ -1525,7 +1537,7 @@ static PyObject *Matrix_mul(PyObject * m1, PyObject * m2)
}
static PyObject* Matrix_inv(MatrixObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
return Matrix_invert(self);
@@ -1666,7 +1678,7 @@ static PyObject *Matrix_getMedianScale(MatrixObject *self, void *UNUSED(closure)
{
float mat[3][3];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
/*must be 3-4 cols, 3-4 rows, square matrix*/
@@ -1682,7 +1694,7 @@ static PyObject *Matrix_getMedianScale(MatrixObject *self, void *UNUSED(closure)
static PyObject *Matrix_getIsNegative(MatrixObject *self, void *UNUSED(closure))
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
/*must be 3-4 cols, 3-4 rows, square matrix*/
@@ -1707,7 +1719,7 @@ static PyGetSetDef Matrix_getseters[] = {
{(char *)"is_negative", (getter)Matrix_getIsNegative, (setter)NULL, (char *)"True if this matrix results in a negative scale, 3x3 and 4x4 only, (readonly).\n\n:type: bool", NULL},
{(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
{(char *)"owner",(getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
- {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
/*-----------------------METHOD DEFINITIONS ----------------------*/
@@ -1868,7 +1880,7 @@ PyObject *newMatrixObject(float *mat, const unsigned short rowSize, const unsign
}
}
}
- else if (rowSize == colSize ) { /*or if no arguments are passed return identity matrix for square matrices */
+ else if (rowSize == colSize) { /*or if no arguments are passed return identity matrix for square matrices */
PyObject *ret_dummy= Matrix_identity(self);
Py_DECREF(ret_dummy);
}
@@ -1890,6 +1902,7 @@ PyObject *newMatrixObject_cb(PyObject *cb_user, int rowSize, int colSize, int cb
self->cb_user= cb_user;
self->cb_type= (unsigned char)cb_type;
self->cb_subtype= (unsigned char)cb_subtype;
+ PyObject_GC_Track(self);
}
return (PyObject *) self;
}
diff --git a/source/blender/python/generic/mathutils_Matrix.h b/source/blender/python/generic/mathutils_Matrix.h
index 505a7253f1a..aa736d1e959 100644
--- a/source/blender/python/generic/mathutils_Matrix.h
+++ b/source/blender/python/generic/mathutils_Matrix.h
@@ -27,6 +27,11 @@
*
*/
+/** \file blender/python/generic/mathutils_Matrix.h
+ * \ingroup pygen
+ */
+
+
#ifndef MATHUTILS_MATRIX_H
#define MATHUTILS_MATRIX_H
diff --git a/source/blender/python/generic/mathutils_Quaternion.c b/source/blender/python/generic/mathutils_Quaternion.c
index 42c295c0d7e..9c79ccb442f 100644
--- a/source/blender/python/generic/mathutils_Quaternion.c
+++ b/source/blender/python/generic/mathutils_Quaternion.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/mathutils_Quaternion.c
+ * \ingroup pygen
+ */
+
+
#include <Python.h>
#include "mathutils.h"
@@ -85,7 +90,7 @@ static PyObject *Quaternion_to_euler(QuaternionObject *self, PyObject *args)
if(!PyArg_ParseTuple(args, "|sO!:to_euler", &order_str, &euler_Type, &eul_compat))
return NULL;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(order_str) {
@@ -100,7 +105,7 @@ static PyObject *Quaternion_to_euler(QuaternionObject *self, PyObject *args)
if(eul_compat) {
float mat[3][3];
- if(!BaseMath_ReadCallback(eul_compat))
+ if(BaseMath_ReadCallback(eul_compat) == -1)
return NULL;
quat_to_mat3(mat, tquat);
@@ -128,10 +133,10 @@ static PyObject *Quaternion_to_matrix(QuaternionObject *self)
{
float mat[9]; /* all values are set */
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
- quat_to_mat3( (float (*)[3]) mat,self->quat);
+ quat_to_mat3((float (*)[3])mat, self->quat);
return newMatrixObject(mat, 3, 3, Py_NEW, NULL);
}
@@ -150,7 +155,7 @@ static PyObject *Quaternion_cross(QuaternionObject *self, PyObject *value)
{
float quat[QUAT_SIZE], tquat[QUAT_SIZE];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.cross(other), invalid 'other' arg") == -1)
@@ -175,7 +180,7 @@ static PyObject *Quaternion_dot(QuaternionObject *self, PyObject *value)
{
float tquat[QUAT_SIZE];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.dot(other), invalid 'other' arg") == -1)
@@ -184,7 +189,7 @@ static PyObject *Quaternion_dot(QuaternionObject *self, PyObject *value)
return PyFloat_FromDouble(dot_qtqt(self->quat, tquat));
}
-static char Quaternion_difference_doc[] =
+static char Quaternion_rotation_difference_doc[] =
".. function:: difference(other)\n"
"\n"
" Returns a quaternion representing the rotational difference.\n"
@@ -194,11 +199,11 @@ static char Quaternion_difference_doc[] =
" :return: the rotational difference between the two quat rotations.\n"
" :rtype: :class:`Quaternion`\n"
;
-static PyObject *Quaternion_difference(QuaternionObject *self, PyObject *value)
+static PyObject *Quaternion_rotation_difference(QuaternionObject *self, PyObject *value)
{
float tquat[QUAT_SIZE], quat[QUAT_SIZE];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.difference(other), invalid 'other' arg") == -1)
@@ -231,7 +236,7 @@ static PyObject *Quaternion_slerp(QuaternionObject *self, PyObject *args)
return NULL;
}
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_array_parse(tquat, QUAT_SIZE, QUAT_SIZE, value, "quaternion.slerp(other), invalid 'other' arg") == -1)
@@ -260,7 +265,7 @@ static PyObject *Quaternion_rotate(QuaternionObject *self, PyObject *value)
float self_rmat[3][3], other_rmat[3][3], rmat[3][3];
float tquat[4], length;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_any_to_rotmat(other_rmat, value, "quaternion.rotate(value)") == -1)
@@ -278,7 +283,7 @@ static PyObject *Quaternion_rotate(QuaternionObject *self, PyObject *value)
}
//----------------------------Quaternion.normalize()----------------
-//normalize the axis of rotation of [theta,vector]
+//normalize the axis of rotation of [theta, vector]
static char Quaternion_normalize_doc[] =
".. function:: normalize()\n"
"\n"
@@ -286,7 +291,7 @@ static char Quaternion_normalize_doc[] =
;
static PyObject *Quaternion_normalize(QuaternionObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
normalize_qt(self->quat);
@@ -315,7 +320,7 @@ static char Quaternion_invert_doc[] =
;
static PyObject *Quaternion_invert(QuaternionObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
invert_qt(self->quat);
@@ -347,7 +352,7 @@ static char Quaternion_identity_doc[] =
;
static PyObject *Quaternion_identity(QuaternionObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
unit_qt(self->quat);
@@ -366,7 +371,7 @@ static char Quaternion_negate_doc[] =
;
static PyObject *Quaternion_negate(QuaternionObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
mul_qt_fl(self->quat, -1.0f);
@@ -382,7 +387,7 @@ static char Quaternion_conjugate_doc[] =
;
static PyObject *Quaternion_conjugate(QuaternionObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
conjugate_qt(self->quat);
@@ -416,7 +421,7 @@ static char Quaternion_copy_doc[] =
;
static PyObject *Quaternion_copy(QuaternionObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
return newQuaternionObject(self->quat, Py_NEW, Py_TYPE(self));
@@ -428,7 +433,7 @@ static PyObject *Quaternion_repr(QuaternionObject *self)
{
PyObject *ret, *tuple;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
tuple= Quaternion_to_tuple_ext(self, -1);
@@ -448,7 +453,7 @@ static PyObject* Quaternion_richcmpr(PyObject *a, PyObject *b, int op)
QuaternionObject *quatA= (QuaternionObject *)a;
QuaternionObject *quatB= (QuaternionObject *)b;
- if(!BaseMath_ReadCallback(quatA) || !BaseMath_ReadCallback(quatB))
+ if(BaseMath_ReadCallback(quatA) == -1 || BaseMath_ReadCallback(quatB) == -1)
return NULL;
ok= (EXPP_VectorsAreEqual(quatA->quat, quatB->quat, QUAT_SIZE, 1)) ? 0 : -1;
@@ -493,7 +498,7 @@ static PyObject *Quaternion_item(QuaternionObject *self, int i)
return NULL;
}
- if(!BaseMath_ReadIndexCallback(self, i))
+ if(BaseMath_ReadIndexCallback(self, i) == -1)
return NULL;
return PyFloat_FromDouble(self->quat[i]);
@@ -517,7 +522,7 @@ static int Quaternion_ass_item(QuaternionObject *self, int i, PyObject *ob)
}
self->quat[i] = scalar;
- if(!BaseMath_WriteIndexCallback(self, i))
+ if(BaseMath_WriteIndexCallback(self, i) == -1)
return -1;
return 0;
@@ -529,7 +534,7 @@ static PyObject *Quaternion_slice(QuaternionObject *self, int begin, int end)
PyObject *tuple;
int count;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
CLAMP(begin, 0, QUAT_SIZE);
@@ -551,13 +556,13 @@ static int Quaternion_ass_slice(QuaternionObject *self, int begin, int end, PyOb
int i, size;
float quat[QUAT_SIZE];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
CLAMP(begin, 0, QUAT_SIZE);
if (end<0) end= (QUAT_SIZE + 1) + end;
CLAMP(end, 0, QUAT_SIZE);
- begin = MIN2(begin,end);
+ begin = MIN2(begin, end);
if((size=mathutils_array_parse(quat, 0, QUAT_SIZE, seq, "mathutils.Quaternion[begin:end] = []")) == -1)
return -1;
@@ -654,7 +659,7 @@ static PyObject *Quaternion_add(PyObject *q1, PyObject *q2)
quat1 = (QuaternionObject*)q1;
quat2 = (QuaternionObject*)q2;
- if(!BaseMath_ReadCallback(quat1) || !BaseMath_ReadCallback(quat2))
+ if(BaseMath_ReadCallback(quat1) == -1 || BaseMath_ReadCallback(quat2) == -1)
return NULL;
add_qt_qtqt(quat, quat1->quat, quat2->quat, 1.0f);
@@ -676,7 +681,7 @@ static PyObject *Quaternion_sub(PyObject *q1, PyObject *q2)
quat1 = (QuaternionObject*)q1;
quat2 = (QuaternionObject*)q2;
- if(!BaseMath_ReadCallback(quat1) || !BaseMath_ReadCallback(quat2))
+ if(BaseMath_ReadCallback(quat1) == -1 || BaseMath_ReadCallback(quat2) == -1)
return NULL;
for(x = 0; x < QUAT_SIZE; x++) {
@@ -703,12 +708,12 @@ static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
if(QuaternionObject_Check(q1)) {
quat1 = (QuaternionObject*)q1;
- if(!BaseMath_ReadCallback(quat1))
+ if(BaseMath_ReadCallback(quat1) == -1)
return NULL;
}
if(QuaternionObject_Check(q2)) {
quat2 = (QuaternionObject*)q2;
- if(!BaseMath_ReadCallback(quat2))
+ if(BaseMath_ReadCallback(quat2) == -1)
return NULL;
}
@@ -716,14 +721,14 @@ static PyObject *Quaternion_mul(PyObject *q1, PyObject *q2)
mul_qt_qtqt(quat, quat1->quat, quat2->quat);
return newQuaternionObject(quat, Py_NEW, Py_TYPE(q1));
}
- /* the only case this can happen (for a supported type is "FLOAT*QUAT" ) */
+ /* the only case this can happen (for a supported type is "FLOAT*QUAT") */
else if(quat2) { /* FLOAT*QUAT */
- if(((scalar= PyFloat_AsDouble(q1)) == -1.0 && PyErr_Occurred())==0) {
+ if(((scalar= PyFloat_AsDouble(q1)) == -1.0f && PyErr_Occurred())==0) {
return quat_mul_float(quat2, scalar);
}
}
else if (quat1) { /* QUAT*FLOAT */
- if((((scalar= PyFloat_AsDouble(q2)) == -1.0 && PyErr_Occurred())==0)) {
+ if((((scalar= PyFloat_AsDouble(q2)) == -1.0f && PyErr_Occurred())==0)) {
return quat_mul_float(quat1, scalar);
}
}
@@ -741,7 +746,7 @@ static PyObject *Quaternion_neg(QuaternionObject *self)
{
float tquat[QUAT_SIZE];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
negate_v4_v4(tquat, self->quat);
@@ -806,19 +811,19 @@ static PyNumberMethods Quaternion_NumMethods = {
NULL, /* nb_index */
};
-static PyObject *Quaternion_getAxis( QuaternionObject *self, void *type )
+static PyObject *Quaternion_getAxis(QuaternionObject *self, void *type)
{
return Quaternion_item(self, GET_INT_FROM_POINTER(type));
}
-static int Quaternion_setAxis( QuaternionObject *self, PyObject *value, void *type )
+static int Quaternion_setAxis(QuaternionObject *self, PyObject *value, void *type)
{
return Quaternion_ass_item(self, GET_INT_FROM_POINTER(type), value);
}
static PyObject *Quaternion_getMagnitude(QuaternionObject *self, void *UNUSED(closure))
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
return PyFloat_FromDouble(sqrt(dot_qtqt(self->quat, self->quat)));
@@ -828,11 +833,11 @@ static PyObject *Quaternion_getAngle(QuaternionObject *self, void *UNUSED(closur
{
float tquat[4];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
normalize_qt_qt(tquat, self->quat);
- return PyFloat_FromDouble(2.0 * (saacos(tquat[0])));
+ return PyFloat_FromDouble(2.0f * (saacos(tquat[0])));
}
static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UNUSED(closure))
@@ -843,7 +848,7 @@ static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UN
float axis[3], angle_dummy;
double angle;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
len= normalize_qt_qt(tquat, self->quat);
@@ -851,15 +856,15 @@ static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UN
angle= PyFloat_AsDouble(value);
- if(angle==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ if(angle==-1.0 && PyErr_Occurred()) { /* parsed item not a number */
PyErr_SetString(PyExc_TypeError, "quaternion.angle = value: float expected");
return -1;
}
- angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2;
+ angle= angle_wrap_rad(angle);
/* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
- if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
+ if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
EXPP_FloatsAreEqual(axis[2], 0.0f, 10)
) {
@@ -869,7 +874,7 @@ static int Quaternion_setAngle(QuaternionObject *self, PyObject *value, void *UN
axis_angle_to_quat(self->quat, axis, angle);
mul_qt_fl(self->quat, len);
- if(!BaseMath_WriteCallback(self))
+ if(BaseMath_WriteCallback(self) == -1)
return -1;
return 0;
@@ -882,14 +887,14 @@ static PyObject *Quaternion_getAxisVec(QuaternionObject *self, void *UNUSED(clos
float axis[3];
float angle;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
normalize_qt_qt(tquat, self->quat);
quat_to_axis_angle(axis, &angle, tquat);
/* If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations */
- if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
+ if( EXPP_FloatsAreEqual(axis[0], 0.0f, 10) &&
EXPP_FloatsAreEqual(axis[1], 0.0f, 10) &&
EXPP_FloatsAreEqual(axis[2], 0.0f, 10)
) {
@@ -907,7 +912,7 @@ static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *
float axis[3];
float angle;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
len= normalize_qt_qt(tquat, self->quat);
@@ -919,7 +924,7 @@ static int Quaternion_setAxisVec(QuaternionObject *self, PyObject *value, void *
axis_angle_to_quat(self->quat, axis, angle);
mul_qt_fl(self->quat, len);
- if(!BaseMath_WriteCallback(self))
+ if(BaseMath_WriteCallback(self) == -1)
return -1;
return 0;
@@ -950,7 +955,7 @@ static PyObject *Quaternion_new(PyTypeObject *type, PyObject *args, PyObject *kw
case 2:
if (mathutils_array_parse(quat, 3, 3, seq, "mathutils.Quaternion()") == -1)
return NULL;
- angle= fmod(angle + M_PI*2, M_PI*4) - M_PI*2; /* clamp because of precision issues */
+ angle= angle_wrap_rad(angle); /* clamp because of precision issues */
axis_angle_to_quat(quat, quat, angle);
break;
/* PyArg_ParseTuple assures no more then 2 */
@@ -995,7 +1000,7 @@ static struct PyMethodDef Quaternion_methods[] = {
/* operation between 2 or more types */
{"cross", (PyCFunction) Quaternion_cross, METH_O, Quaternion_cross_doc},
{"dot", (PyCFunction) Quaternion_dot, METH_O, Quaternion_dot_doc},
- {"difference", (PyCFunction) Quaternion_difference, METH_O, Quaternion_difference_doc},
+ {"rotation_difference", (PyCFunction) Quaternion_rotation_difference, METH_O, Quaternion_rotation_difference_doc},
{"slerp", (PyCFunction) Quaternion_slerp, METH_VARARGS, Quaternion_slerp_doc},
{"rotate", (PyCFunction) Quaternion_rotate, METH_O, Quaternion_rotate_doc},
@@ -1017,7 +1022,7 @@ static PyGetSetDef Quaternion_getseters[] = {
{(char *)"axis",(getter)Quaternion_getAxisVec, (setter)Quaternion_setAxisVec, (char *)"quaternion axis as a vector.\n\n:type: :class:`Vector`", NULL},
{(char *)"is_wrapped", (getter)BaseMathObject_getWrapped, (setter)NULL, (char *)BaseMathObject_Wrapped_doc, NULL},
{(char *)"owner", (getter)BaseMathObject_getOwner, (setter)NULL, (char *)BaseMathObject_Owner_doc, NULL},
- {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
//------------------PY_OBECT DEFINITION--------------------------
@@ -1098,12 +1103,13 @@ PyObject *newQuaternionObject(float *quat, int type, PyTypeObject *base_type)
self->quat = PyMem_Malloc(QUAT_SIZE * sizeof(float));
if(!quat) { //new empty
unit_qt(self->quat);
- }else{
+ }
+ else {
QUATCOPY(self->quat, quat);
}
self->wrapped = Py_NEW;
}
- else{
+ else {
PyErr_SetString(PyExc_RuntimeError, "Quaternion(): invalid type");
return NULL;
}
@@ -1119,6 +1125,7 @@ PyObject *newQuaternionObject_cb(PyObject *cb_user, int cb_type, int cb_subtype)
self->cb_user= cb_user;
self->cb_type= (unsigned char)cb_type;
self->cb_subtype= (unsigned char)cb_subtype;
+ PyObject_GC_Track(self);
}
return (PyObject *)self;
diff --git a/source/blender/python/generic/mathutils_Quaternion.h b/source/blender/python/generic/mathutils_Quaternion.h
index 6052dfa1a41..d606621390a 100644
--- a/source/blender/python/generic/mathutils_Quaternion.h
+++ b/source/blender/python/generic/mathutils_Quaternion.h
@@ -28,6 +28,11 @@
*
*/
+/** \file blender/python/generic/mathutils_Quaternion.h
+ * \ingroup pygen
+ */
+
+
#ifndef MATHUTILS_QUAT_H
#define MATHUTILS_QUAT_H
diff --git a/source/blender/python/generic/mathutils_Vector.c b/source/blender/python/generic/mathutils_Vector.c
index 9408a61a368..8e0c53be308 100644
--- a/source/blender/python/generic/mathutils_Vector.c
+++ b/source/blender/python/generic/mathutils_Vector.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/mathutils_Vector.c
+ * \ingroup pygen
+ */
+
+
#include <Python.h>
#include "mathutils.h"
@@ -91,7 +96,9 @@ static PyObject *Vector_zero(VectorObject *self)
{
fill_vn(self->vec, self->size, 0.0f);
- (void)BaseMath_WriteCallback(self);
+ if(BaseMath_WriteCallback(self) == -1)
+ return NULL;
+
Py_RETURN_NONE;
}
@@ -109,7 +116,7 @@ static PyObject *Vector_normalize(VectorObject *self)
int i;
float norm = 0.0f;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
for(i = 0; i < self->size; i++) {
@@ -221,10 +228,12 @@ static PyObject *Vector_resize_4d(VectorObject *self)
PyErr_SetString(PyExc_MemoryError, "vector.resize_4d(): problem allocating pointer space");
return NULL;
}
+
if(self->size == 2){
self->vec[2] = 0.0f;
self->vec[3] = 1.0f;
- }else if(self->size == 3){
+ }
+ else if(self->size == 3){
self->vec[3] = 1.0f;
}
self->size = 4;
@@ -240,7 +249,7 @@ static char Vector_to_2d_doc[] =
;
static PyObject *Vector_to_2d(VectorObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
return newVectorObject(self->vec, 2, Py_NEW, Py_TYPE(self));
@@ -257,7 +266,7 @@ static PyObject *Vector_to_3d(VectorObject *self)
{
float tvec[3]= {0.0f};
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
memcpy(tvec, self->vec, sizeof(float) * MIN2(self->size, 3));
@@ -275,7 +284,7 @@ static PyObject *Vector_to_4d(VectorObject *self)
{
float tvec[4]= {0.0f, 0.0f, 0.0f, 1.0f};
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
memcpy(tvec, self->vec, sizeof(float) * MIN2(self->size, 4));
@@ -329,7 +338,7 @@ static PyObject *Vector_to_tuple(VectorObject *self, PyObject *args)
if(PyTuple_GET_SIZE(args)==0)
ndigits= -1;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
return Vector_to_tuple_ext(self, ndigits);
@@ -347,13 +356,13 @@ static char Vector_to_track_quat_doc[] =
" :return: rotation from the vector and the track and up axis.\n"
" :rtype: :class:`Quaternion`\n"
;
-static PyObject *Vector_to_track_quat(VectorObject *self, PyObject *args )
+static PyObject *Vector_to_track_quat(VectorObject *self, PyObject *args)
{
float vec[3], quat[4];
const char *strack, *sup;
short track = 2, up = 1;
- if(!PyArg_ParseTuple( args, "|ss:to_track_quat", &strack, &sup))
+ if(!PyArg_ParseTuple(args, "|ss:to_track_quat", &strack, &sup))
return NULL;
if (self->size != 3) {
@@ -361,7 +370,7 @@ static PyObject *Vector_to_track_quat(VectorObject *self, PyObject *args )
return NULL;
}
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if (strack) {
@@ -444,7 +453,7 @@ static PyObject *Vector_to_track_quat(VectorObject *self, PyObject *args )
*/
negate_v3_v3(vec, self->vec);
- vec_to_quat( quat,vec, track, up);
+ vec_to_quat(quat, vec, track, up);
return newQuaternionObject(quat, Py_NEW, NULL);
}
@@ -470,7 +479,7 @@ static PyObject *Vector_reflect(VectorObject *self, PyObject *value)
float reflect[3] = {0.0f};
float tvec[MAX_DIMENSIONS];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if((value_size= mathutils_array_parse(tvec, 2, 4, value, "vector.reflect(other), invalid 'other' arg")) == -1)
@@ -509,7 +518,7 @@ static PyObject *Vector_cross(VectorObject *self, PyObject *value)
VectorObject *ret;
float tvec[MAX_DIMENSIONS];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_array_parse(tvec, self->size, self->size, value, "vector.cross(other), invalid 'other' arg") == -1)
@@ -536,14 +545,14 @@ static PyObject *Vector_dot(VectorObject *self, PyObject *value)
double dot = 0.0;
int x;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_array_parse(tvec, self->size, self->size, value, "vector.dot(other), invalid 'other' arg") == -1)
return NULL;
for(x = 0; x < self->size; x++) {
- dot += self->vec[x] * tvec[x];
+ dot += (double)(self->vec[x] * tvec[x]);
}
return PyFloat_FromDouble(dot);
@@ -575,15 +584,15 @@ static PyObject *Vector_angle(VectorObject *self, PyObject *args)
if(!PyArg_ParseTuple(args, "O|O:angle", &value, &fallback))
return NULL;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_array_parse(tvec, size, size, value, "vector.angle(other), invalid 'other' arg") == -1)
return NULL;
for(x = 0; x < size; x++) {
- test_v1 += self->vec[x] * self->vec[x];
- test_v2 += tvec[x] * tvec[x];
+ test_v1 += (double)(self->vec[x] * self->vec[x]);
+ test_v2 += (double)(tvec[x] * tvec[x]);
}
if (!test_v1 || !test_v2){
/* avoid exception */
@@ -599,14 +608,14 @@ static PyObject *Vector_angle(VectorObject *self, PyObject *args)
//dot product
for(x = 0; x < self->size; x++) {
- dot += self->vec[x] * tvec[x];
+ dot += (double)(self->vec[x] * tvec[x]);
}
dot /= (sqrt(test_v1) * sqrt(test_v2));
return PyFloat_FromDouble(saacos(dot));
}
-static char Vector_difference_doc[] =
+static char Vector_rotation_difference_doc[] =
".. function:: difference(other)\n"
"\n"
" Returns a quaternion representing the rotational difference between this vector and another.\n"
@@ -618,7 +627,7 @@ static char Vector_difference_doc[] =
"\n"
" .. note:: 2D vectors raise an :exc:`AttributeError`.\n"
;
-static PyObject *Vector_difference(VectorObject *self, PyObject *value)
+static PyObject *Vector_rotation_difference(VectorObject *self, PyObject *value)
{
float quat[4], vec_a[3], vec_b[3];
@@ -627,7 +636,7 @@ static PyObject *Vector_difference(VectorObject *self, PyObject *value)
return NULL;
}
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_array_parse(vec_b, 3, MAX_DIMENSIONS, value, "vector.difference(other), invalid 'other' arg") == -1)
@@ -659,24 +668,24 @@ static PyObject *Vector_project(VectorObject *self, PyObject *value)
double dot = 0.0f, dot2 = 0.0f;
int x;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_array_parse(tvec, size, size, value, "vector.project(other), invalid 'other' arg") == -1)
return NULL;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
//get dot products
for(x = 0; x < size; x++) {
- dot += self->vec[x] * tvec[x];
- dot2 += tvec[x] * tvec[x];
+ dot += (double)(self->vec[x] * tvec[x]);
+ dot2 += (double)(tvec[x] * tvec[x]);
}
//projection
dot /= dot2;
for(x = 0; x < size; x++) {
- vec[x] = (float)(dot * tvec[x]);
+ vec[x] = (float)dot * tvec[x];
}
return newVectorObject(vec, size, Py_NEW, Py_TYPE(self));
}
@@ -707,10 +716,10 @@ static PyObject *Vector_lerp(VectorObject *self, PyObject *args)
if(mathutils_array_parse(tvec, size, size, value, "vector.lerp(other), invalid 'other' arg") == -1)
return NULL;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
- ifac= 1.0 - fac;
+ ifac= 1.0f - fac;
for(x = 0; x < size; x++) {
vec[x] = (ifac * self->vec[x]) + (fac * tvec[x]);
@@ -730,7 +739,7 @@ static PyObject *Vector_rotate(VectorObject *self, PyObject *value)
{
float other_rmat[3][3];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
if(mathutils_any_to_rotmat(other_rmat, value, "vector.rotate(value)") == -1)
@@ -759,7 +768,7 @@ static char Vector_copy_doc[] =
;
static PyObject *Vector_copy(VectorObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
return newVectorObject(self->vec, self->size, Py_NEW, Py_TYPE(self));
@@ -769,7 +778,7 @@ static PyObject *Vector_repr(VectorObject *self)
{
PyObject *ret, *tuple;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
tuple= Vector_to_tuple_ext(self, -1);
@@ -785,25 +794,31 @@ static int Vector_len(VectorObject *self)
return self->size;
}
/* sequence accessor (get): vector[index] */
-static PyObject *Vector_item(VectorObject *self, int i)
+static PyObject *vector_item_internal(VectorObject *self, int i, const int is_attr)
{
if(i<0) i= self->size-i;
if(i < 0 || i >= self->size) {
- PyErr_SetString(PyExc_IndexError,"vector[index]: out of range");
+ if(is_attr) PyErr_Format(PyExc_AttributeError,"vector.%c: unavailable on %dd vector", *(((char *)"xyzw") + i), self->size);
+ else PyErr_SetString(PyExc_IndexError,"vector[index]: out of range");
return NULL;
}
- if(!BaseMath_ReadIndexCallback(self, i))
+ if(BaseMath_ReadIndexCallback(self, i) == -1)
return NULL;
return PyFloat_FromDouble(self->vec[i]);
}
+
+static PyObject *Vector_item(VectorObject *self, int i)
+{
+ return vector_item_internal(self, i, FALSE);
+}
/* sequence accessor (set): vector[index] = value */
-static int Vector_ass_item(VectorObject *self, int i, PyObject * ob)
+static int vector_ass_item_internal(VectorObject *self, int i, PyObject *value, const int is_attr)
{
float scalar;
- if((scalar=PyFloat_AsDouble(ob))==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
+ if((scalar=PyFloat_AsDouble(value))==-1.0f && PyErr_Occurred()) { /* parsed item not a number */
PyErr_SetString(PyExc_TypeError, "vector[index] = x: index argument not a number");
return -1;
}
@@ -811,23 +826,29 @@ static int Vector_ass_item(VectorObject *self, int i, PyObject * ob)
if(i<0) i= self->size-i;
if(i < 0 || i >= self->size){
- PyErr_SetString(PyExc_IndexError, "vector[index] = x: assignment index out of range");
+ if(is_attr) PyErr_Format(PyExc_AttributeError,"vector.%c = x: unavailable on %dd vector", *(((char *)"xyzw") + i), self->size);
+ else PyErr_SetString(PyExc_IndexError, "vector[index] = x: assignment index out of range");
return -1;
}
self->vec[i] = scalar;
- if(!BaseMath_WriteIndexCallback(self, i))
+ if(BaseMath_WriteIndexCallback(self, i) == -1)
return -1;
return 0;
}
+static int Vector_ass_item(VectorObject *self, int i, PyObject *value)
+{
+ return vector_ass_item_internal(self, i, value, FALSE);
+}
+
/* sequence slice (get): vector[a:b] */
static PyObject *Vector_slice(VectorObject *self, int begin, int end)
{
PyObject *tuple;
int count;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
CLAMP(begin, 0, self->size);
@@ -849,12 +870,12 @@ static int Vector_ass_slice(VectorObject *self, int begin, int end,
int y, size = 0;
float vec[MAX_DIMENSIONS];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
CLAMP(begin, 0, self->size);
CLAMP(end, 0, self->size);
- begin = MIN2(begin,end);
+ begin = MIN2(begin, end);
size = (end - begin);
if(mathutils_array_parse(vec, size, size, seq, "vector[begin:end] = [...]") == -1)
@@ -865,7 +886,7 @@ static int Vector_ass_slice(VectorObject *self, int begin, int end,
self->vec[begin + y] = vec[y];
}
- if(!BaseMath_WriteCallback(self))
+ if(BaseMath_WriteCallback(self) == -1)
return -1;
return 0;
@@ -885,7 +906,7 @@ static PyObject *Vector_add(PyObject * v1, PyObject * v2)
vec1 = (VectorObject*)v1;
vec2 = (VectorObject*)v2;
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
+ if(BaseMath_ReadCallback(vec1) == -1 || BaseMath_ReadCallback(vec2) == -1)
return NULL;
/*VECTOR + VECTOR*/
@@ -916,7 +937,7 @@ static PyObject *Vector_iadd(PyObject * v1, PyObject * v2)
return NULL;
}
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
+ if(BaseMath_ReadCallback(vec1) == -1 || BaseMath_ReadCallback(vec2) == -1)
return NULL;
add_vn_vn(vec1->vec, vec2->vec, vec1->size);
@@ -939,7 +960,7 @@ static PyObject *Vector_sub(PyObject * v1, PyObject * v2)
vec1 = (VectorObject*)v1;
vec2 = (VectorObject*)v2;
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
+ if(BaseMath_ReadCallback(vec1) == -1 || BaseMath_ReadCallback(vec2) == -1)
return NULL;
if(vec1->size != vec2->size) {
@@ -969,7 +990,7 @@ static PyObject *Vector_isub(PyObject * v1, PyObject * v2)
return NULL;
}
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2))
+ if(BaseMath_ReadCallback(vec1) == -1 || BaseMath_ReadCallback(vec2) == -1)
return NULL;
sub_vn_vn(vec1->vec, vec2->vec, vec1->size);
@@ -1013,7 +1034,7 @@ static int column_vector_multiplication(float rvec[MAX_DIMENSIONS], VectorObject
for(x = 0; x < mat->col_size; x++) {
for(y = 0; y < mat->row_size; y++) {
- dot += mat->matrix[y][x] * vec_cpy[y];
+ dot += (double)(mat->matrix[y][x] * vec_cpy[y]);
}
rvec[z++] = (float)dot;
dot = 0.0f;
@@ -1036,18 +1057,18 @@ static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
if VectorObject_Check(v1) {
vec1= (VectorObject *)v1;
- if(!BaseMath_ReadCallback(vec1))
+ if(BaseMath_ReadCallback(vec1) == -1)
return NULL;
}
if VectorObject_Check(v2) {
vec2= (VectorObject *)v2;
- if(!BaseMath_ReadCallback(vec2))
+ if(BaseMath_ReadCallback(vec2) == -1)
return NULL;
}
/* make sure v1 is always the vector */
- if (vec1 && vec2 ) {
+ if (vec1 && vec2) {
int i;
double dot = 0.0f;
@@ -1058,7 +1079,7 @@ static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
/*dot product*/
for(i = 0; i < vec1->size; i++) {
- dot += vec1->vec[i] * vec2->vec[i];
+ dot += (double)(vec1->vec[i] * vec2->vec[i]);
}
return PyFloat_FromDouble(dot);
}
@@ -1066,7 +1087,7 @@ static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
if (MatrixObject_Check(v2)) {
/* VEC * MATRIX */
float tvec[MAX_DIMENSIONS];
- if(!BaseMath_ReadCallback((MatrixObject *)v2))
+ if(BaseMath_ReadCallback((MatrixObject *)v2) == -1)
return NULL;
if(column_vector_multiplication(tvec, vec1, (MatrixObject*)v2) == -1) {
return NULL;
@@ -1083,19 +1104,19 @@ static PyObject *Vector_mul(PyObject * v1, PyObject * v2)
PyErr_SetString(PyExc_TypeError, "Vector multiplication: only 3D vector rotations (with quats) currently supported");
return NULL;
}
- if(!BaseMath_ReadCallback(quat2)) {
+ if(BaseMath_ReadCallback(quat2) == -1) {
return NULL;
}
copy_v3_v3(tvec, vec1->vec);
mul_qt_v3(quat2->quat, tvec);
return newVectorObject(tvec, 3, Py_NEW, Py_TYPE(vec1));
}
- else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*FLOAT */
+ else if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* VEC*FLOAT */
return vector_mul_float(vec1, scalar);
}
}
else if (vec2) {
- if (((scalar= PyFloat_AsDouble(v1)) == -1.0 && PyErr_Occurred())==0) { /* VEC*FLOAT */
+ if (((scalar= PyFloat_AsDouble(v1)) == -1.0f && PyErr_Occurred())==0) { /* VEC*FLOAT */
return vector_mul_float(vec2, scalar);
}
}
@@ -1113,14 +1134,14 @@ static PyObject *Vector_imul(PyObject * v1, PyObject * v2)
VectorObject *vec = (VectorObject *)v1;
float scalar;
- if(!BaseMath_ReadCallback(vec))
+ if(BaseMath_ReadCallback(vec) == -1)
return NULL;
/* only support vec*=float and vec*=mat
vec*=vec result is a float so that wont work */
if (MatrixObject_Check(v2)) {
float rvec[MAX_DIMENSIONS];
- if(!BaseMath_ReadCallback((MatrixObject *)v2))
+ if(BaseMath_ReadCallback((MatrixObject *)v2) == -1)
return NULL;
if(column_vector_multiplication(rvec, vec, (MatrixObject*)v2) == -1)
@@ -1137,12 +1158,12 @@ static PyObject *Vector_imul(PyObject * v1, PyObject * v2)
return NULL;
}
- if(!BaseMath_ReadCallback(quat2)) {
+ if(BaseMath_ReadCallback(quat2) == -1) {
return NULL;
}
mul_qt_v3(quat2->quat, vec->vec);
}
- else if (((scalar= PyFloat_AsDouble(v2)) == -1.0 && PyErr_Occurred())==0) { /* VEC*=FLOAT */
+ else if (((scalar= PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred())==0) { /* VEC*=FLOAT */
mul_vn_fl(vec->vec, vec->size, scalar);
}
else {
@@ -1151,7 +1172,7 @@ static PyObject *Vector_imul(PyObject * v1, PyObject * v2)
}
(void)BaseMath_WriteCallback(vec);
- Py_INCREF( v1 );
+ Py_INCREF(v1);
return v1;
}
@@ -1168,7 +1189,7 @@ static PyObject *Vector_div(PyObject * v1, PyObject * v2)
}
vec1 = (VectorObject*)v1; /* vector */
- if(!BaseMath_ReadCallback(vec1))
+ if(BaseMath_ReadCallback(vec1) == -1)
return NULL;
if((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
@@ -1176,7 +1197,7 @@ static PyObject *Vector_div(PyObject * v1, PyObject * v2)
return NULL;
}
- if(scalar==0.0) {
+ if(scalar==0.0f) {
PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error");
return NULL;
}
@@ -1194,7 +1215,7 @@ static PyObject *Vector_idiv(PyObject * v1, PyObject * v2)
float scalar;
VectorObject *vec1 = (VectorObject*)v1;
- if(!BaseMath_ReadCallback(vec1))
+ if(BaseMath_ReadCallback(vec1) == -1)
return NULL;
if((scalar=PyFloat_AsDouble(v2)) == -1.0f && PyErr_Occurred()) { /* parsed item not a number */
@@ -1202,7 +1223,7 @@ static PyObject *Vector_idiv(PyObject * v1, PyObject * v2)
return NULL;
}
- if(scalar==0.0) {
+ if(scalar==0.0f) {
PyErr_SetString(PyExc_ZeroDivisionError, "Vector division: divide by zero error");
return NULL;
}
@@ -1212,7 +1233,7 @@ static PyObject *Vector_idiv(PyObject * v1, PyObject * v2)
(void)BaseMath_WriteCallback(vec1);
- Py_INCREF( v1 );
+ Py_INCREF(v1);
return v1;
}
@@ -1222,7 +1243,7 @@ static PyObject *Vector_neg(VectorObject *self)
{
float tvec[MAX_DIMENSIONS];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
negate_vn_vn(tvec, self->vec, self->size);
@@ -1236,7 +1257,7 @@ static double vec_magnitude_nosqrt(float *data, int size)
int i;
for(i=0; i<size; i++){
- dot += data[i];
+ dot += (double)data[i];
}
/*return (double)sqrt(dot);*/
/* warning, line above removed because we are not using the length,
@@ -1252,26 +1273,28 @@ static PyObject* Vector_richcmpr(PyObject *objectA, PyObject *objectB, int compa
{
VectorObject *vecA = NULL, *vecB = NULL;
int result = 0;
- float epsilon = .000001f;
- double lenA,lenB;
+ double epsilon = .000001f;
+ double lenA, lenB;
if (!VectorObject_Check(objectA) || !VectorObject_Check(objectB)){
if (comparison_type == Py_NE){
Py_RETURN_TRUE;
- }else{
+ }
+ else {
Py_RETURN_FALSE;
}
}
vecA = (VectorObject*)objectA;
vecB = (VectorObject*)objectB;
- if(!BaseMath_ReadCallback(vecA) || !BaseMath_ReadCallback(vecB))
+ if(BaseMath_ReadCallback(vecA) == -1 || BaseMath_ReadCallback(vecB) == -1)
return NULL;
if (vecA->size != vecB->size){
if (comparison_type == Py_NE){
Py_RETURN_TRUE;
- }else{
+ }
+ else {
Py_RETURN_FALSE;
}
}
@@ -1280,16 +1303,17 @@ static PyObject* Vector_richcmpr(PyObject *objectA, PyObject *objectB, int compa
case Py_LT:
lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
- if( lenA < lenB ){
+ if(lenA < lenB){
result = 1;
}
break;
case Py_LE:
lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
- if( lenA < lenB ){
+ if(lenA < lenB){
result = 1;
- }else{
+ }
+ else {
result = (((lenA + epsilon) > lenB) && ((lenA - epsilon) < lenB));
}
break;
@@ -1302,16 +1326,17 @@ static PyObject* Vector_richcmpr(PyObject *objectA, PyObject *objectB, int compa
case Py_GT:
lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
- if( lenA > lenB ){
+ if(lenA > lenB){
result = 1;
}
break;
case Py_GE:
lenA = vec_magnitude_nosqrt(vecA->vec, vecA->size);
lenB = vec_magnitude_nosqrt(vecB->vec, vecB->size);
- if( lenA > lenB ){
+ if(lenA > lenB){
result = 1;
- }else{
+ }
+ else {
result = (((lenA + epsilon) > lenB) && ((lenA - epsilon) < lenB));
}
break;
@@ -1321,7 +1346,8 @@ static PyObject* Vector_richcmpr(PyObject *objectA, PyObject *objectB, int compa
}
if (result == 1){
Py_RETURN_TRUE;
- }else{
+ }
+ else {
Py_RETURN_FALSE;
}
}
@@ -1350,7 +1376,8 @@ static PyObject *Vector_subscript(VectorObject* self, PyObject* item)
if (i < 0)
i += self->size;
return Vector_item(self, i);
- } else if (PySlice_Check(item)) {
+ }
+ else if (PySlice_Check(item)) {
Py_ssize_t start, stop, step, slicelength;
if (PySlice_GetIndicesEx((void *)item, self->size, &start, &stop, &step, &slicelength) < 0)
@@ -1454,12 +1481,12 @@ static PyNumberMethods Vector_NumMethods = {
static PyObject *Vector_getAxis(VectorObject *self, void *type)
{
- return Vector_item(self, GET_INT_FROM_POINTER(type));
+ return vector_item_internal(self, GET_INT_FROM_POINTER(type), TRUE);
}
static int Vector_setAxis(VectorObject *self, PyObject * value, void *type)
{
- return Vector_ass_item(self, GET_INT_FROM_POINTER(type), value);
+ return vector_ass_item_internal(self, GET_INT_FROM_POINTER(type), value, TRUE);
}
/* vector.length */
@@ -1468,11 +1495,11 @@ static PyObject *Vector_getLength(VectorObject *self, void *UNUSED(closure))
double dot = 0.0f;
int i;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
for(i = 0; i < self->size; i++){
- dot += (self->vec[i] * self->vec[i]);
+ dot += (double)(self->vec[i] * self->vec[i]);
}
return PyFloat_FromDouble(sqrt(dot));
}
@@ -1482,7 +1509,7 @@ static int Vector_setLength(VectorObject *self, PyObject *value)
double dot = 0.0f, param;
int i;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
if((param=PyFloat_AsDouble(value)) == -1.0 && PyErr_Occurred()) {
@@ -1490,17 +1517,17 @@ static int Vector_setLength(VectorObject *self, PyObject *value)
return -1;
}
- if (param < 0.0f) {
+ if (param < 0.0) {
PyErr_SetString(PyExc_TypeError, "cannot set a vectors length to a negative value");
return -1;
}
- if (param == 0.0f) {
+ if (param == 0.0) {
fill_vn(self->vec, self->size, 0.0f);
return 0;
}
for(i = 0; i < self->size; i++){
- dot += (self->vec[i] * self->vec[i]);
+ dot += (double)(self->vec[i] * self->vec[i]);
}
if (!dot) /* cant sqrt zero */
@@ -1532,7 +1559,7 @@ static PyObject *Vector_getSwizzle(VectorObject *self, void *closure)
float vec[MAX_DIMENSIONS];
unsigned int swizzleClosure;
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
/* Unpack the axes from the closure into an array. */
@@ -1577,7 +1604,7 @@ static int Vector_setSwizzle(VectorObject *self, PyObject * value, void *closure
float tvec[MAX_DIMENSIONS];
float vec_assign[MAX_DIMENSIONS];
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return -1;
/* Check that the closure can be used with this vector: even 2D vectors have
@@ -1626,7 +1653,7 @@ static int Vector_setSwizzle(VectorObject *self, PyObject * value, void *closure
memcpy(self->vec, tvec, axis_from * sizeof(float));
/* continue with BaseMathObject_WriteCallback at the end */
- if(!BaseMath_WriteCallback(self))
+ if(BaseMath_WriteCallback(self) == -1)
return -1;
else
return 0;
@@ -1982,7 +2009,7 @@ static PyGetSetDef Vector_getseters[] = {
{(char *)"wwwy", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((1|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3071
{(char *)"wwwz", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((2|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 3583
{(char *)"wwww", (getter)Vector_getSwizzle, (setter)NULL, NULL, SET_INT_IN_POINTER(((3|SWIZZLE_VALID_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((3|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) )}, // 4095
- {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
/* Python script used to make swizzle array */
@@ -1994,7 +2021,7 @@ axis_dict = {}
axis_pos = {'x':0, 'y':1, 'z':2, 'w':3}
axises = 'xyzw'
while len(axises) >= 2:
-
+
for axis_0 in axises:
axis_0_pos = axis_pos[axis_0]
for axis_1 in axises:
@@ -2008,7 +2035,7 @@ while len(axises) >= 2:
for axis_3 in axises:
axis_3_pos = axis_pos[axis_3]
axis_dict[axis_0+axis_1+axis_2+axis_3] = '((%s|SWIZZLE_VALID_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<SWIZZLE_BITS_PER_AXIS) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*2)) | ((%s|SWIZZLE_VALID_AXIS)<<(SWIZZLE_BITS_PER_AXIS*3))) ' % (axis_0_pos, axis_1_pos, axis_2_pos, axis_3_pos)
-
+
axises = axises[:-1]
@@ -2042,12 +2069,13 @@ static int row_vector_multiplication(float rvec[4], VectorObject* vec, MatrixObj
if(mat->colSize == 4 && vec_size != 3){
PyErr_SetString(PyExc_AttributeError, "vector * matrix: matrix column size and the vector size must be the same");
return -1;
- }else{
+ }
+ else {
vec_cpy[3] = 1.0f;
}
}
-
- if(!BaseMath_ReadCallback(vec) || !BaseMath_ReadCallback(mat))
+
+ if(BaseMath_ReadCallback(vec) == -1 || BaseMath_ReadCallback(mat) == -1)
return -1;
memcpy(vec_cpy, vec->vec, vec_size * sizeof(float));
@@ -2076,9 +2104,9 @@ static char Vector_negate_doc[] =
;
static PyObject *Vector_negate(VectorObject *self)
{
- if(!BaseMath_ReadCallback(self))
+ if(BaseMath_ReadCallback(self) == -1)
return NULL;
-
+
negate_vn(self->vec, self->size);
(void)BaseMath_WriteCallback(self); // already checked for error
@@ -2108,7 +2136,7 @@ static struct PyMethodDef Vector_methods[] = {
{"cross", (PyCFunction) Vector_cross, METH_O, Vector_cross_doc},
{"dot", (PyCFunction) Vector_dot, METH_O, Vector_dot_doc},
{"angle", (PyCFunction) Vector_angle, METH_VARARGS, Vector_angle_doc},
- {"difference", (PyCFunction) Vector_difference, METH_O, Vector_difference_doc},
+ {"rotation_difference", (PyCFunction) Vector_rotation_difference, METH_O, Vector_rotation_difference_doc},
{"project", (PyCFunction) Vector_project, METH_O, Vector_project_doc},
{"lerp", (PyCFunction) Vector_lerp, METH_VARARGS, Vector_lerp_doc},
{"rotate", (PyCFunction) Vector_rotate, METH_O, Vector_rotate_doc},
@@ -2121,7 +2149,7 @@ static struct PyMethodDef Vector_methods[] = {
/* Note
Py_TPFLAGS_CHECKTYPES allows us to avoid casting all types to Vector when coercing
- but this means for eg that
+ but this means for eg that
vec*mat and mat*vec both get sent to Vector_mul and it neesd to sort out the order
*/
@@ -2137,12 +2165,12 @@ PyTypeObject vector_Type = {
/* Methods to implement standard operations */
- ( destructor ) BaseMathObject_dealloc,/* destructor tp_dealloc; */
+ (destructor) BaseMathObject_dealloc,/* destructor tp_dealloc; */
NULL, /* printfunc tp_print; */
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL, /* cmpfunc tp_compare; */
- ( reprfunc ) Vector_repr, /* reprfunc tp_repr; */
+ (reprfunc)Vector_repr, /* reprfunc tp_repr; */
/* Method suites for standard classes */
@@ -2162,7 +2190,7 @@ PyTypeObject vector_Type = {
NULL, /* PyBufferProcs *tp_as_buffer; */
/*** Flags to define presence of optional/expanded features ***/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,
vector_doc, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
@@ -2268,6 +2296,7 @@ PyObject *newVectorObject_cb(PyObject *cb_user, int size, int cb_type, int cb_su
self->cb_user= cb_user;
self->cb_type= (unsigned char)cb_type;
self->cb_subtype= (unsigned char)cb_subtype;
+ PyObject_GC_Track(self);
}
return (PyObject *)self;
diff --git a/source/blender/python/generic/mathutils_Vector.h b/source/blender/python/generic/mathutils_Vector.h
index 4013a392ff9..0ede836ce44 100644
--- a/source/blender/python/generic/mathutils_Vector.h
+++ b/source/blender/python/generic/mathutils_Vector.h
@@ -28,6 +28,11 @@
*
*/
+/** \file blender/python/generic/mathutils_Vector.h
+ * \ingroup pygen
+ */
+
+
#ifndef MATHUTILS_VECTOR_H
#define MATHUTILS_VECTOR_H
diff --git a/source/blender/python/generic/mathutils_geometry.c b/source/blender/python/generic/mathutils_geometry.c
index 62867eb46c1..fc821f2697a 100644
--- a/source/blender/python/generic/mathutils_geometry.c
+++ b/source/blender/python/generic/mathutils_geometry.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/mathutils_geometry.c
+ * \ingroup pygen
+ */
+
+
#include <Python.h>
#include "mathutils_geometry.h"
@@ -43,7 +48,7 @@
#include "BKE_curve.h"
-#define SWAP_FLOAT(a,b,tmp) tmp=a; a=b; b=tmp
+#define SWAP_FLOAT(a, b, tmp) tmp=a; a=b; b=tmp
#define eps 0.000001
@@ -87,7 +92,7 @@ static PyObject *M_Geometry_intersect_ray_tri(PyObject *UNUSED(self), PyObject*
return NULL;
}
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(ray) || !BaseMath_ReadCallback(ray_off))
+ if(BaseMath_ReadCallback(vec1) == -1 || BaseMath_ReadCallback(vec2) == -1 || BaseMath_ReadCallback(vec3) == -1 || BaseMath_ReadCallback(ray) == -1 || BaseMath_ReadCallback(ray_off) == -1)
return NULL;
VECCOPY(v1, vec1->vec);
@@ -109,7 +114,7 @@ static PyObject *M_Geometry_intersect_ray_tri(PyObject *UNUSED(self), PyObject*
/* if determinant is near zero, ray lies in plane of triangle */
det= dot_v3v3(e1, pvec);
- if (det > -0.000001 && det < 0.000001) {
+ if (det > -0.000001f && det < 0.000001f) {
Py_RETURN_NONE;
}
@@ -174,7 +179,7 @@ static PyObject *M_Geometry_intersect_line_line(PyObject *UNUSED(self), PyObject
return NULL;
}
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
+ if(BaseMath_ReadCallback(vec1) == -1 || BaseMath_ReadCallback(vec2) == -1 || BaseMath_ReadCallback(vec3) == -1 || BaseMath_ReadCallback(vec4) == -1)
return NULL;
if(vec1->size == 3 || vec1->size == 2) {
@@ -260,7 +265,7 @@ static PyObject *M_Geometry_normal(PyObject *UNUSED(self), PyObject* args)
return NULL;
}
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
+ if(BaseMath_ReadCallback(vec1) == -1 || BaseMath_ReadCallback(vec2) == -1 || BaseMath_ReadCallback(vec3) == -1)
return NULL;
normal_tri_v3(n, vec1->vec, vec2->vec, vec3->vec);
@@ -278,7 +283,7 @@ static PyObject *M_Geometry_normal(PyObject *UNUSED(self), PyObject* args)
return NULL;
}
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3) || !BaseMath_ReadCallback(vec4))
+ if(BaseMath_ReadCallback(vec1) == -1 || BaseMath_ReadCallback(vec2) == -1 || BaseMath_ReadCallback(vec3) == -1 || BaseMath_ReadCallback(vec4) == -1)
return NULL;
normal_quad_v3(n, vec1->vec, vec2->vec, vec3->vec, vec4->vec);
@@ -315,7 +320,7 @@ static PyObject *M_Geometry_area_tri(PyObject *UNUSED(self), PyObject* args)
return NULL;
}
- if(!BaseMath_ReadCallback(vec1) || !BaseMath_ReadCallback(vec2) || !BaseMath_ReadCallback(vec3))
+ if(BaseMath_ReadCallback(vec1) == -1 || BaseMath_ReadCallback(vec2) == -1 || BaseMath_ReadCallback(vec3) == -1)
return NULL;
if (vec1->size == 3) {
@@ -392,7 +397,7 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
polyVec= PySequence_GetItem(polyLine, index);
if(VectorObject_Check(polyVec)) {
- if(!BaseMath_ReadCallback((VectorObject *)polyVec))
+ if(BaseMath_ReadCallback((VectorObject *)polyVec) == -1)
ls_error= 1;
fp[0]= ((VectorObject *)polyVec)->vec[0];
@@ -441,7 +446,8 @@ static PyObject *M_Geometry_tesselate_polygon(PyObject *UNUSED(self), PyObject *
index++;
}
freedisplist(&dispbase);
- } else {
+ }
+ else {
/* no points, do this so scripts dont barf */
freedisplist(&dispbase); /* possible some dl was allocated */
tri_list= PyList_New(0);
@@ -479,12 +485,13 @@ static PyObject *M_Geometry_intersect_line_line_2d(PyObject *UNUSED(self), PyObj
return NULL;
}
- if(!BaseMath_ReadCallback(line_a1) || !BaseMath_ReadCallback(line_a2) || !BaseMath_ReadCallback(line_b1) || !BaseMath_ReadCallback(line_b2))
+ if(BaseMath_ReadCallback(line_a1) == -1 || BaseMath_ReadCallback(line_a2) == -1 || BaseMath_ReadCallback(line_b1) == -1 || BaseMath_ReadCallback(line_b2) == -1)
return NULL;
if(isect_seg_seg_v2_point(line_a1->vec, line_a2->vec, line_b1->vec, line_b2->vec, vi) == 1) {
return newVectorObject(vi, 2, Py_NEW, NULL);
- } else {
+ }
+ else {
Py_RETURN_NONE;
}
}
@@ -518,7 +525,7 @@ static PyObject *M_Geometry_intersect_point_line(PyObject *UNUSED(self), PyObjec
return NULL;
}
- if(!BaseMath_ReadCallback(pt) || !BaseMath_ReadCallback(line_1) || !BaseMath_ReadCallback(line_2))
+ if(BaseMath_ReadCallback(pt) == -1 || BaseMath_ReadCallback(line_1) == -1 || BaseMath_ReadCallback(line_2) == -1)
return NULL;
/* accept 2d verts */
@@ -532,7 +539,7 @@ static PyObject *M_Geometry_intersect_point_line(PyObject *UNUSED(self), PyObjec
else { l2[2]=0.0; VECCOPY2D(l2, line_2->vec) }
/* do the calculation */
- lambda= closest_to_line_v3(pt_out,pt_in, l1, l2);
+ lambda= closest_to_line_v3(pt_out, pt_in, l1, l2);
ret= PyTuple_New(2);
PyTuple_SET_ITEM(ret, 0, newVectorObject(pt_out, 3, Py_NEW, NULL));
@@ -568,7 +575,7 @@ static PyObject *M_Geometry_intersect_point_tri_2d(PyObject *UNUSED(self), PyObj
return NULL;
}
- if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(tri_p1) || !BaseMath_ReadCallback(tri_p2) || !BaseMath_ReadCallback(tri_p3))
+ if(BaseMath_ReadCallback(pt_vec) == -1 || BaseMath_ReadCallback(tri_p1) == -1 || BaseMath_ReadCallback(tri_p2) == -1 || BaseMath_ReadCallback(tri_p3) == -1)
return NULL;
return PyLong_FromLong(isect_point_tri_v2(pt_vec->vec, tri_p1->vec, tri_p2->vec, tri_p3->vec));
@@ -605,7 +612,7 @@ static PyObject *M_Geometry_intersect_point_quad_2d(PyObject *UNUSED(self), PyOb
return NULL;
}
- if(!BaseMath_ReadCallback(pt_vec) || !BaseMath_ReadCallback(quad_p1) || !BaseMath_ReadCallback(quad_p2) || !BaseMath_ReadCallback(quad_p3) || !BaseMath_ReadCallback(quad_p4))
+ if(BaseMath_ReadCallback(pt_vec) == -1 || BaseMath_ReadCallback(quad_p1) == -1 || BaseMath_ReadCallback(quad_p2) == -1 || BaseMath_ReadCallback(quad_p3) == -1 || BaseMath_ReadCallback(quad_p4) == -1)
return NULL;
return PyLong_FromLong(isect_point_quad_v2(pt_vec->vec, quad_p1->vec, quad_p2->vec, quad_p3->vec, quad_p4->vec));
@@ -679,7 +686,7 @@ static char M_Geometry_box_pack_2d_doc[] =
"\n"
" Returns the normal of the 3D tri or quad.\n"
"\n"
-" :arg boxes: list of boxes, each box is a list where the first 4 items are [x,y, width, height, ...] other items are ignored.\n"
+" :arg boxes: list of boxes, each box is a list where the first 4 items are [x, y, width, height, ...] other items are ignored.\n"
" :type boxes: list\n"
" :return: the width and height of the packed bounding box\n"
" :rtype: tuple, pair of floats\n"
@@ -692,7 +699,7 @@ static PyObject *M_Geometry_box_pack_2d(PyObject *UNUSED(self), PyObject *boxlis
PyObject *ret;
if(!PyList_Check(boxlist)) {
- PyErr_SetString(PyExc_TypeError, "expected a list of boxes [[x,y,w,h], ... ]");
+ PyErr_SetString(PyExc_TypeError, "expected a list of boxes [[x, y, w, h], ... ]");
return NULL;
}
@@ -762,7 +769,7 @@ static PyObject *M_Geometry_interpolate_bezier(PyObject *UNUSED(self), PyObject*
return NULL;
}
- if(!BaseMath_ReadCallback(vec_k1) || !BaseMath_ReadCallback(vec_h1) || !BaseMath_ReadCallback(vec_k2) || !BaseMath_ReadCallback(vec_h2))
+ if(BaseMath_ReadCallback(vec_k1) == -1 || BaseMath_ReadCallback(vec_h1) == -1 || BaseMath_ReadCallback(vec_k2) == -1 || BaseMath_ReadCallback(vec_h2) == -1)
return NULL;
dims= MAX4(vec_k1->size, vec_h1->size, vec_h2->size, vec_k2->size);
diff --git a/source/blender/python/generic/mathutils_geometry.h b/source/blender/python/generic/mathutils_geometry.h
index 1af25c7a751..929b8cc8d75 100644
--- a/source/blender/python/generic/mathutils_geometry.h
+++ b/source/blender/python/generic/mathutils_geometry.h
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/generic/mathutils_geometry.h
+ * \ingroup pygen
+ */
+
/*Include this file for access to vector, quat, matrix, euler, etc...*/
#ifndef MATHUTILS_GEOMETRY_H
diff --git a/source/blender/python/generic/noise_py_api.c b/source/blender/python/generic/noise_py_api.c
index f4c662f3170..dbae0fb13bc 100644
--- a/source/blender/python/generic/noise_py_api.c
+++ b/source/blender/python/generic/noise_py_api.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/noise_py_api.c
+ * \ingroup pygen
+ */
+
+
/************************/
/* Blender Noise Module */
/************************/
@@ -207,8 +212,10 @@ static void randuvec(float v[3])
r = (float)sqrt(r);
v[0] = (float)(r * cos(a));
v[1] = (float)(r * sin(a));
- } else
+ }
+ else {
v[2] = 1.f;
+ }
}
static PyObject *Noise_random(PyObject *UNUSED(self))
diff --git a/source/blender/python/generic/noise_py_api.h b/source/blender/python/generic/noise_py_api.h
index 0a1bc09157b..2bf779a6b72 100644
--- a/source/blender/python/generic/noise_py_api.h
+++ b/source/blender/python/generic/noise_py_api.h
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/generic/noise_py_api.h
+ * \ingroup pygen
+ */
+
#ifndef NOISE_PY_API_H
#define NOISE_PY_API_H
diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c
index e8315938748..7182d5f75d0 100644
--- a/source/blender/python/generic/py_capi_utils.c
+++ b/source/blender/python/generic/py_capi_utils.c
@@ -20,11 +20,18 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/generic/py_capi_utils.c
+ * \ingroup pygen
+ */
+
+
#include <Python.h>
#include <frameobject.h>
#include "py_capi_utils.h"
+#define PYC_INTERPRETER_ACTIVE (((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) != NULL)
+
/* for debugging */
void PyC_ObSpit(const char *name, PyObject *var) {
fprintf(stderr, "<%s> : ", name);
@@ -46,27 +53,22 @@ void PyC_ObSpit(const char *name, PyObject *var) {
}
void PyC_LineSpit(void) {
+
const char *filename;
int lineno;
+ /* Note, allow calling from outside python (RNA) */
+ if(!PYC_INTERPRETER_ACTIVE) {
+ fprintf(stderr, "python line lookup failed, interpreter inactive\n");
+ return;
+ }
+
PyErr_Clear();
PyC_FileAndNum(&filename, &lineno);
fprintf(stderr, "%s:%d\n", filename, lineno);
}
-/* python 3.2 only, copied from frameobjec.c */
-#if PY_VERSION_HEX < 0x03020000
-int
-PyFrame_GetLineNumber(PyFrameObject *f)
-{
- if (f->f_trace)
- return f->f_lineno;
- else
- return PyCode_Addr2Line(f->f_code, f->f_lasti);
-}
-#endif
-
void PyC_FileAndNum(const char **filename, int *lineno)
{
PyFrameObject *frame;
@@ -157,9 +159,11 @@ PyObject *PyC_ExceptionBuffer(void)
if(! (string_io_mod= PyImport_ImportModule("io")) ) {
goto error_cleanup;
- } else if (! (string_io = PyObject_CallMethod(string_io_mod, (char *)"StringIO", NULL))) {
+ }
+ else if (! (string_io = PyObject_CallMethod(string_io_mod, (char *)"StringIO", NULL))) {
goto error_cleanup;
- } else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
+ }
+ else if (! (string_io_getvalue= PyObject_GetAttrString(string_io, "getvalue"))) {
goto error_cleanup;
}
@@ -219,29 +223,7 @@ const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
return PyBytes_AS_STRING(py_str);
}
else {
- /* mostly copied from fileio.c's, fileio_init */
- PyObject *stringobj;
- PyObject *u;
-
- PyErr_Clear();
-
- u= PyUnicode_FromObject(py_str); /* coerce into unicode */
-
- if (u == NULL)
- return NULL;
-
- stringobj= PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(u), PyUnicode_GET_SIZE(u), "surrogateescape");
- Py_DECREF(u);
- if (stringobj == NULL)
- return NULL;
- if (!PyBytes_Check(stringobj)) { /* this seems wrong but it works fine */
- // printf("encoder failed to return bytes\n");
- Py_DECREF(stringobj);
- return NULL;
- }
- *coerce= stringobj;
-
- return PyBytes_AS_STRING(stringobj);
+ return PyBytes_AS_STRING((*coerce= PyUnicode_EncodeFSDefault(py_str)));
}
}
diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h
index 8d16068441a..0b821759bec 100644
--- a/source/blender/python/generic/py_capi_utils.h
+++ b/source/blender/python/generic/py_capi_utils.h
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/generic/py_capi_utils.h
+ * \ingroup pygen
+ */
+
#ifndef PY_CAPI_UTILS_H
#define PY_CAPI_UTILS_H
@@ -42,4 +47,5 @@ void PyC_RunQuicky(const char *filepath, int n, ...);
void PyC_MainModule_Backup(PyObject **main_mod);
void PyC_MainModule_Restore(PyObject *main_mod);
+
#endif // PY_CAPI_UTILS_H
diff --git a/source/blender/python/intern/CMakeLists.txt b/source/blender/python/intern/CMakeLists.txt
index 123c8e5b3e0..ab08dc14f07 100644
--- a/source/blender/python/intern/CMakeLists.txt
+++ b/source/blender/python/intern/CMakeLists.txt
@@ -42,10 +42,12 @@ set(SRC
bpy_app.c
bpy_driver.c
bpy_interface.c
+ bpy_library.c
bpy_operator.c
bpy_operator_wrap.c
bpy_props.c
bpy_rna.c
+ bpy_rna_anim.c
bpy_rna_array.c
bpy_rna_callback.c
bpy_traceback.c
@@ -59,6 +61,7 @@ set(SRC
bpy_operator_wrap.h
bpy_props.h
bpy_rna.h
+ bpy_rna_anim.h
bpy_rna_callback.h
bpy_traceback.h
bpy_util.h
@@ -74,4 +77,8 @@ if(WITH_PYTHON_MODULE)
add_definitions(-DWITH_PYTHON_MODULE)
endif()
+if(WITH_PYTHON_SAFETY)
+ add_definitions(-DWITH_PYTHON_SAFETY)
+endif()
+
blender_add_lib(bf_python "${SRC}" "${INC}")
diff --git a/source/blender/python/intern/bpy.c b/source/blender/python/intern/bpy.c
index 44daef06cb4..18129af28be 100644
--- a/source/blender/python/intern/bpy.c
+++ b/source/blender/python/intern/bpy.c
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/intern/bpy.c
+ * \ingroup pythonintern
+ */
+
/* This file defines the '_bpy' module which is used by python's 'bpy' package.
* a script writer should never directly access this module */
@@ -37,11 +42,15 @@
#include "bpy_operator.h"
#include "BLI_path_util.h"
+#include "BLI_string.h"
#include "BLI_bpath.h"
#include "BLI_utildefines.h"
#include "BKE_global.h" /* XXX, G.main only */
+#include "BKE_blender.h"
+
+#include "RNA_access.h"
#include "MEM_guardedalloc.h"
@@ -61,8 +70,8 @@ static char bpy_script_paths_doc[] =
" Return 2 paths to blender scripts directories.\n"
"\n"
" :return: (system, user) strings will be empty when not found.\n"
-" :rtype: tuple of strigs\n";
-
+" :rtype: tuple of strings\n"
+;
static PyObject *bpy_script_paths(PyObject *UNUSED(self))
{
PyObject *ret= PyTuple_New(2);
@@ -84,7 +93,8 @@ static char bpy_blend_paths_doc[] =
" :arg absolute: When true the paths returned are made absolute.\n"
" :type absolute: boolean\n"
" :return: path list.\n"
-" :rtype: list of strigs\n";
+" :rtype: list of strings\n"
+;
static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
struct BPathIterator *bpi;
@@ -93,8 +103,8 @@ static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObjec
char filepath_expanded[1024];
const char *lib;
- int absolute = 0;
- static const char *kwlist[] = {"absolute", NULL};
+ int absolute= 0;
+ static const char *kwlist[]= {"absolute", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kw, "|i:blend_paths", (char **)kwlist, &absolute))
return NULL;
@@ -107,8 +117,8 @@ static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObjec
BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
}
else {
- lib = BLI_bpathIterator_getLib(bpi);
- if (lib && (strcmp(lib, BLI_bpathIterator_getBasePath(bpi)))) { /* relative path to the library is NOT the same as our blendfile path, return an absolute path */
+ lib= BLI_bpathIterator_getLib(bpi);
+ if (lib && (BLI_path_cmp(lib, BLI_bpathIterator_getBasePath(bpi)))) { /* relative path to the library is NOT the same as our blendfile path, return an absolute path */
BLI_bpathIterator_getPathExpanded(bpi, filepath_expanded);
}
else {
@@ -127,13 +137,13 @@ static PyObject *bpy_blend_paths(PyObject *UNUSED(self), PyObject *args, PyObjec
}
-// static char bpy_user_resource_doc[] = // now in bpy/utils.py
+// static char bpy_user_resource_doc[]= // now in bpy/utils.py
static PyObject *bpy_user_resource(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
{
char *type;
char *subdir= NULL;
int folder_id;
- static const char *kwlist[] = {"type", "subdir", NULL};
+ static const char *kwlist[]= {"type", "subdir", NULL};
char *path;
@@ -154,14 +164,55 @@ static PyObject *bpy_user_resource(PyObject *UNUSED(self), PyObject *args, PyObj
path= BLI_get_folder(folder_id, subdir);
if (!path)
- path = BLI_get_user_folder_notest(folder_id, subdir);
+ path= BLI_get_user_folder_notest(folder_id, subdir);
+
+ return PyUnicode_DecodeFSDefault(path ? path : "");
+}
+
+static char bpy_resource_path_doc[] =
+".. function:: resource_path(type, major=2, minor=57)\n"
+"\n"
+" Return the base path for storing system files.\n"
+"\n"
+" :arg type: string in ['USER', 'LOCAL', 'SYSTEM'].\n"
+" :type type: string\n"
+" :arg major: major version, defaults to current.\n"
+" :type major: int\n"
+" :arg minor: minor version, defaults to current.\n"
+" :type minor: string\n"
+" :return: the resource path (not necessarily existing).\n"
+" :rtype: string\n"
+;
+static PyObject *bpy_resource_path(PyObject *UNUSED(self), PyObject *args, PyObject *kw)
+{
+ char *type;
+ int major= BLENDER_VERSION/100, minor= BLENDER_VERSION%100;
+ static const char *kwlist[]= {"type", "major", "minor", NULL};
+ int folder_id;
+ char *path;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kw, "s|ii:resource_path", (char **)kwlist, &type, &major, &minor))
+ return NULL;
- return PyUnicode_FromString(path ? path : "");
+ /* stupid string compare */
+ if (!strcmp(type, "USER")) folder_id= BLENDER_RESOURCE_PATH_USER;
+ else if(!strcmp(type, "LOCAL")) folder_id= BLENDER_RESOURCE_PATH_LOCAL;
+ else if(!strcmp(type, "SYSTEM")) folder_id= BLENDER_RESOURCE_PATH_SYSTEM;
+ else {
+ PyErr_SetString(PyExc_ValueError, "invalid resource argument");
+ return NULL;
+ }
+
+ path= BLI_get_folder_version(folder_id, (major * 100) + minor, FALSE);
+
+ return PyUnicode_DecodeFSDefault(path);
}
-static PyMethodDef meth_bpy_script_paths = {"script_paths", (PyCFunction)bpy_script_paths, METH_NOARGS, bpy_script_paths_doc};
-static PyMethodDef meth_bpy_blend_paths = {"blend_paths", (PyCFunction)bpy_blend_paths, METH_VARARGS|METH_KEYWORDS, bpy_blend_paths_doc};
-static PyMethodDef meth_bpy_user_resource = {"user_resource", (PyCFunction)bpy_user_resource, METH_VARARGS|METH_KEYWORDS, NULL};
+static PyMethodDef meth_bpy_script_paths= {"script_paths", (PyCFunction)bpy_script_paths, METH_NOARGS, bpy_script_paths_doc};
+static PyMethodDef meth_bpy_blend_paths= {"blend_paths", (PyCFunction)bpy_blend_paths, METH_VARARGS|METH_KEYWORDS, bpy_blend_paths_doc};
+static PyMethodDef meth_bpy_user_resource= {"user_resource", (PyCFunction)bpy_user_resource, METH_VARARGS|METH_KEYWORDS, NULL};
+static PyMethodDef meth_bpy_resource_path= {"resource_path", (PyCFunction)bpy_resource_path, METH_VARARGS|METH_KEYWORDS, bpy_resource_path_doc};
+
static PyObject *bpy_import_test(const char *modname)
{
@@ -183,6 +234,7 @@ static PyObject *bpy_import_test(const char *modname)
void BPy_init_modules( void )
{
extern BPy_StructRNA *bpy_context_module;
+ extern int bpy_lib_init(PyObject *);
PointerRNA ctx_ptr;
PyObject *mod;
@@ -201,7 +253,7 @@ void BPy_init_modules( void )
/* stand alone utility modules not related to blender directly */
IDProp_Init_Types(); /* not actually a submodule, just types */
- mod = PyModule_New("_bpy");
+ mod= PyModule_New("_bpy");
/* add the module so we can import it */
PyDict_SetItemString(PyImport_GetModuleDict(), "_bpy", mod);
@@ -212,7 +264,9 @@ void BPy_init_modules( void )
PyModule_AddObject( mod, "types", BPY_rna_types() ); /* needs to be first so bpy_types can run */
PyModule_AddObject(mod, "StructMetaPropGroup", (PyObject *)&pyrna_struct_meta_idprop_Type); /* metaclass for idprop types, bpy_types.py needs access */
-
+
+ bpy_lib_init(mod); /* adds '_bpy._library_load', must be called before 'bpy_types' which uses it */
+
bpy_import_test("bpy_types");
PyModule_AddObject( mod, "data", BPY_rna_module() ); /* imports bpy_types by running this */
bpy_import_test("bpy_types");
@@ -233,6 +287,7 @@ void BPy_init_modules( void )
PyModule_AddObject(mod, meth_bpy_script_paths.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_script_paths, NULL));
PyModule_AddObject(mod, meth_bpy_blend_paths.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_blend_paths, NULL));
PyModule_AddObject(mod, meth_bpy_user_resource.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_user_resource, NULL));
+ PyModule_AddObject(mod, meth_bpy_resource_path.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_resource_path, NULL));
/* register funcs (bpy_rna.c) */
PyModule_AddObject(mod, meth_bpy_register_class.ml_name, (PyObject *)PyCFunction_New(&meth_bpy_register_class, NULL));
diff --git a/source/blender/python/intern/bpy.h b/source/blender/python/intern/bpy.h
index e3064fe3ca1..0f298c1daf1 100644
--- a/source/blender/python/intern/bpy.h
+++ b/source/blender/python/intern/bpy.h
@@ -20,6 +20,11 @@
* Contributor(s): Campbell Barton
*
* ***** END GPL LICENSE BLOCK ***** */
+
+/** \file blender/python/intern/bpy.h
+ * \ingroup pythonintern
+ */
+
void BPy_init_modules( void );
extern PyObject *bpy_package_py;
diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c
index e58afe8eace..41de1171aaa 100644
--- a/source/blender/python/intern/bpy_app.c
+++ b/source/blender/python/intern/bpy_app.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_app.c
+ * \ingroup pythonintern
+ */
+
+
#include <Python.h>
#include "bpy_app.h"
@@ -51,9 +56,11 @@ extern char build_system[];
static PyTypeObject BlenderAppType;
-static PyStructSequence_Field app_info_fields[] = {
+static PyStructSequence_Field app_info_fields[]= {
{(char *)"version", (char *)"The Blender version as a tuple of 3 numbers. eg. (2, 50, 11)"},
{(char *)"version_string", (char *)"The Blender version formatted as a string"},
+ {(char *)"version_char", (char *)"The Blender version character (for minor releases)"},
+ {(char *)"version_cycle", (char *)"The release status of this build alpha/beta/rc/release"},
{(char *)"binary_path", (char *)"The location of blenders executable, useful for utilities that spawn new instances"},
{(char *)"background", (char *)"Boolean, True when blender is running without a user interface (started with -b)"},
@@ -70,21 +77,24 @@ static PyStructSequence_Field app_info_fields[] = {
{NULL}
};
-static PyStructSequence_Desc app_info_desc = {
+static PyStructSequence_Desc app_info_desc= {
(char *)"bpy.app", /* name */
(char *)"This module contains application values that remain unchanged during runtime.", /* doc */
app_info_fields, /* fields */
(sizeof(app_info_fields)/sizeof(PyStructSequence_Field)) - 1
};
+#define DO_EXPAND(VAL) VAL ## 1
+#define EXPAND(VAL) DO_EXPAND(VAL)
+
static PyObject *make_app_info(void)
{
extern char bprogname[]; /* argv[0] from creator.c */
PyObject *app_info;
- int pos = 0;
+ int pos= 0;
- app_info = PyStructSequence_New(&BlenderAppType);
+ app_info= PyStructSequence_New(&BlenderAppType);
if (app_info == NULL) {
return NULL;
}
@@ -98,6 +108,12 @@ static PyObject *make_app_info(void)
SetObjItem(Py_BuildValue("(iii)", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION));
SetObjItem(PyUnicode_FromFormat("%d.%02d (sub %d)", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION));
+#if defined(BLENDER_VERSION_CHAR) && EXPAND(BLENDER_VERSION_CHAR) != 1
+ SetStrItem(STRINGIFY(BLENDER_VERSION_CHAR));
+#else
+ SetStrItem("");
+#endif
+ SetStrItem(STRINGIFY(BLENDER_VERSION_CYCLE));
SetStrItem(bprogname);
SetObjItem(PyBool_FromLong(G.background));
@@ -224,8 +240,8 @@ PyObject *BPY_app_struct(void)
ret= make_app_info();
/* prevent user from creating new instances */
- BlenderAppType.tp_init = NULL;
- BlenderAppType.tp_new = NULL;
+ BlenderAppType.tp_init= NULL;
+ BlenderAppType.tp_new= NULL;
/* kindof a hack ontop of PyStructSequence */
py_struct_seq_getset_init();
diff --git a/source/blender/python/intern/bpy_app.h b/source/blender/python/intern/bpy_app.h
index cf19218f0b0..d57e4688f46 100644
--- a/source/blender/python/intern/bpy_app.h
+++ b/source/blender/python/intern/bpy_app.h
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/intern/bpy_app.h
+ * \ingroup pythonintern
+ */
+
#ifndef BPY_APP_H
#define BPY_APP_H
diff --git a/source/blender/python/intern/bpy_driver.c b/source/blender/python/intern/bpy_driver.c
index 7072fbc09a7..27260aed8d2 100644
--- a/source/blender/python/intern/bpy_driver.c
+++ b/source/blender/python/intern/bpy_driver.c
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/intern/bpy_driver.c
+ * \ingroup pythonintern
+ */
+
/* ****************************************** */
/* Drivers - PyExpression Evaluation */
@@ -37,7 +42,7 @@
#include "bpy_driver.h"
/* for pydrivers (drivers using one-line Python expressions to express relationships between targets) */
-PyObject *bpy_pydriver_Dict = NULL;
+PyObject *bpy_pydriver_Dict= NULL;
/* For faster execution we keep a special dictionary for pydrivers, with
* the needed modules and aliases.
@@ -49,16 +54,16 @@ int bpy_pydriver_create_dict(void)
/* validate namespace for driver evaluation */
if (bpy_pydriver_Dict) return -1;
- d = PyDict_New();
+ d= PyDict_New();
if (d == NULL)
return -1;
else
- bpy_pydriver_Dict = d;
+ bpy_pydriver_Dict= d;
/* import some modules: builtins, bpy, math, (Blender.noise )*/
PyDict_SetItemString(d, "__builtins__", PyEval_GetBuiltins());
- mod = PyImport_ImportModule("math");
+ mod= PyImport_ImportModule("math");
if (mod) {
PyDict_Merge(d, PyModule_GetDict(mod), 0); /* 0 - dont overwrite existing values */
Py_DECREF(mod);
@@ -85,12 +90,12 @@ void BPY_driver_reset(void)
int use_gil= 1; // (PyThreadState_Get()==NULL);
if(use_gil)
- gilstate = PyGILState_Ensure();
+ gilstate= PyGILState_Ensure();
if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */
PyDict_Clear(bpy_pydriver_Dict);
Py_DECREF(bpy_pydriver_Dict);
- bpy_pydriver_Dict = NULL;
+ bpy_pydriver_Dict= NULL;
}
if(use_gil)
@@ -127,13 +132,13 @@ float BPY_driver_exec(ChannelDriver *driver)
int use_gil;
DriverVar *dvar;
- double result = 0.0; /* default return */
- char *expr = NULL;
+ double result= 0.0; /* default return */
+ char *expr= NULL;
short targets_ok= 1;
int i;
/* get the py expression to be evaluated */
- expr = driver->expression;
+ expr= driver->expression;
if ((expr == NULL) || (expr[0]=='\0'))
return 0.0f;
@@ -145,7 +150,7 @@ float BPY_driver_exec(ChannelDriver *driver)
use_gil= 1; //(PyThreadState_Get()==NULL);
if(use_gil)
- gilstate = PyGILState_Ensure();
+ gilstate= PyGILState_Ensure();
/* init global dictionary for py-driver evaluation settings */
if (!bpy_pydriver_Dict) {
@@ -195,10 +200,10 @@ float BPY_driver_exec(ChannelDriver *driver)
}
/* add target values to a dict that will be used as '__locals__' dict */
- driver_vars = PyDict_New(); // XXX do we need to decref this?
+ driver_vars= PyDict_New(); // XXX do we need to decref this?
for (dvar= driver->variables.first, i=0; dvar; dvar= dvar->next) {
- PyObject *driver_arg = NULL;
- float tval = 0.0f;
+ PyObject *driver_arg= NULL;
+ float tval= 0.0f;
/* try to get variable value */
tval= driver_get_variable_value(driver, dvar);
@@ -223,7 +228,7 @@ float BPY_driver_exec(ChannelDriver *driver)
#if 0 // slow, with this can avoid all Py_CompileString above.
/* execute expression to get a value */
- retval = PyRun_String(expr, Py_eval_input, bpy_pydriver_Dict, driver_vars);
+ retval= PyRun_String(expr, Py_eval_input, bpy_pydriver_Dict, driver_vars);
#else
/* evaluate the compiled expression */
if (expr_code)
@@ -236,10 +241,11 @@ float BPY_driver_exec(ChannelDriver *driver)
/* process the result */
if (retval == NULL) {
pydriver_error(driver);
- } else if((result= PyFloat_AsDouble(retval)) == -1.0 && PyErr_Occurred()) {
+ }
+ else if((result= PyFloat_AsDouble(retval)) == -1.0 && PyErr_Occurred()) {
pydriver_error(driver);
Py_DECREF(retval);
- result = 0.0;
+ result= 0.0;
}
else {
/* all fine, make sure the "invalid expression" flag is cleared */
diff --git a/source/blender/python/intern/bpy_driver.h b/source/blender/python/intern/bpy_driver.h
index 3e7cd68eef0..5d29e171e2d 100644
--- a/source/blender/python/intern/bpy_driver.h
+++ b/source/blender/python/intern/bpy_driver.h
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/intern/bpy_driver.h
+ * \ingroup pythonintern
+ */
+
#ifndef BPY_DRIVER_H
#define BPY_DRIVER_H
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 4f59467a9d6..83c52464c9c 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -22,6 +22,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/intern/bpy_interface.c
+ * \ingroup pythonintern
+ */
+
/* grr, python redefines */
#ifdef _POSIX_C_SOURCE
@@ -32,6 +37,8 @@
#include "MEM_guardedalloc.h"
+#include "RNA_types.h"
+
#include "bpy.h"
#include "bpy_rna.h"
#include "bpy_util.h"
@@ -73,7 +80,7 @@ BPy_StructRNA *bpy_context_module= NULL; /* for fast access */
#ifdef TIME_PY_RUN
#include "PIL_time.h"
-static int bpy_timer_count = 0;
+static int bpy_timer_count= 0;
static double bpy_timer; /* time since python starts */
static double bpy_timer_run; /* time for each python script run */
static double bpy_timer_run_tot; /* accumulate python runs */
@@ -84,7 +91,7 @@ void bpy_context_set(bContext *C, PyGILState_STATE *gilstate)
py_call_level++;
if(gilstate)
- *gilstate = PyGILState_Ensure();
+ *gilstate= PyGILState_Ensure();
if(py_call_level==1) {
@@ -102,7 +109,7 @@ void bpy_context_set(bContext *C, PyGILState_STATE *gilstate)
if(bpy_timer_count==0) {
/* record time from the beginning */
bpy_timer= PIL_check_seconds_timer();
- bpy_timer_run = bpy_timer_run_tot = 0.0;
+ bpy_timer_run= bpy_timer_run_tot= 0.0;
}
bpy_timer_run= PIL_check_seconds_timer();
@@ -138,9 +145,9 @@ void bpy_context_clear(bContext *UNUSED(C), PyGILState_STATE *gilstate)
void BPY_text_free_code(Text *text)
{
- if( text->compiled ) {
- Py_DECREF( ( PyObject * ) text->compiled );
- text->compiled = NULL;
+ if(text->compiled) {
+ Py_DECREF((PyObject *)text->compiled);
+ text->compiled= NULL;
}
}
@@ -148,8 +155,8 @@ void BPY_modules_update(bContext *C)
{
#if 0 // slow, this runs all the time poll, draw etc 100's of time a sec.
PyObject *mod= PyImport_ImportModuleLevel("bpy", NULL, NULL, NULL, 0);
- PyModule_AddObject( mod, "data", BPY_rna_module() );
- PyModule_AddObject( mod, "types", BPY_rna_types() ); // atm this does not need updating
+ PyModule_AddObject(mod, "data", BPY_rna_module());
+ PyModule_AddObject(mod, "types", BPY_rna_types()); // atm this does not need updating
#endif
/* refreshes the main struct */
@@ -163,9 +170,13 @@ static void bpy_python_start_path(void)
{
char *py_path_bundle= BLI_get_folder(BLENDER_PYTHON, NULL);
- if(py_path_bundle==NULL)
+ if(py_path_bundle==NULL) {
+ /* Common enough to have bundled *nix python but complain on OSX/Win */
+#if defined(__APPLE__) || defined(_WIN32)
+ fprintf(stderr, "Warning! bundled python not found and is expected on this platform. (if you built with CMake: 'install' target may have not been built)\n");
+#endif
return;
-
+ }
/* set the environment path */
printf("found bundled python: %s\n", py_path_bundle);
@@ -221,26 +232,26 @@ static struct _inittab bpy_internal_modules[]= {
void BPY_python_start(int argc, const char **argv)
{
#ifndef WITH_PYTHON_MODULE
- PyThreadState *py_tstate = NULL;
+ PyThreadState *py_tstate= NULL;
/* not essential but nice to set our name */
static wchar_t bprogname_wchar[FILE_MAXDIR+FILE_MAXFILE]; /* python holds a reference */
utf8towchar(bprogname_wchar, bprogname);
Py_SetProgramName(bprogname_wchar);
- /* builtin modules */
+ /* must run before python initializes */
PyImport_ExtendInittab(bpy_internal_modules);
bpy_python_start_path(); /* allow to use our own included python */
- /* Python 3.2 now looks for '2.56/python/include/python3.2d/pyconfig.h' to parse
+ /* Python 3.2 now looks for '2.57/python/include/python3.2d/pyconfig.h' to parse
* from the 'sysconfig' module which is used by 'site', so for now disable site.
* alternatively we could copy the file. */
Py_NoSiteFlag= 1;
- Py_Initialize( );
+ Py_Initialize();
- // PySys_SetArgv( argc, argv); // broken in py3, not a huge deal
+ // PySys_SetArgv(argc, argv); // broken in py3, not a huge deal
/* sigh, why do python guys not have a char** version anymore? :( */
{
int i;
@@ -257,39 +268,20 @@ void BPY_python_start(int argc, const char **argv)
#else
(void)argc;
(void)argv;
-
+
+ /* must run before python initializes */
PyImport_ExtendInittab(bpy_internal_modules);
#endif
/* bpy.* and lets us import it */
BPy_init_modules();
- { /* our own import and reload functions */
- PyObject *item;
- PyObject *mod;
- //PyObject *m = PyImport_AddModule("__builtin__");
- //PyObject *d = PyModule_GetDict(m);
- PyObject *d = PyEval_GetBuiltins( );
-// PyDict_SetItemString(d, "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
- PyDict_SetItemString(d, "__import__", item=PyCFunction_New(&bpy_import_meth, NULL)); Py_DECREF(item);
-
- /* move reload here
- * XXX, use import hooks */
- mod= PyImport_ImportModuleLevel((char *)"imp", NULL, NULL, NULL, 0);
- if(mod) {
- PyDict_SetItemString(PyModule_GetDict(mod), "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
- Py_DECREF(mod);
- }
- else {
- BLI_assert(!"unable to load 'imp' module.");
- }
-
- }
+ bpy_import_init(PyEval_GetBuiltins());
pyrna_alloc_types();
#ifndef WITH_PYTHON_MODULE
- py_tstate = PyGILState_GetThisThreadState();
+ py_tstate= PyGILState_GetThisThreadState();
PyEval_ReleaseThread(py_tstate);
#endif
}
@@ -305,11 +297,11 @@ void BPY_python_end(void)
/* clear all python data from structs */
- Py_Finalize( );
+ Py_Finalize();
#ifdef TIME_PY_RUN
// measure time since py started
- bpy_timer = PIL_check_seconds_timer() - bpy_timer;
+ bpy_timer= PIL_check_seconds_timer() - bpy_timer;
printf("*bpy stats* - ");
printf("tot exec: %d, ", bpy_timer_count);
@@ -353,7 +345,7 @@ typedef struct {
} PyModuleObject;
#endif
-static int python_script_exec(bContext *C, const char *fn, struct Text *text, struct ReportList *reports)
+static int python_script_exec(bContext *C, const char *fn, struct Text *text, struct ReportList *reports, const short do_jump)
{
PyObject *main_mod= NULL;
PyObject *py_dict= NULL, *py_result= NULL;
@@ -371,25 +363,26 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text, st
if (text) {
char fn_dummy[FILE_MAXDIR];
- bpy_text_filename_get(fn_dummy, text);
+ bpy_text_filename_get(fn_dummy, sizeof(fn_dummy), text);
- if( !text->compiled ) { /* if it wasn't already compiled, do it now */
- char *buf = txt_to_buf( text );
+ if(text->compiled == NULL) { /* if it wasn't already compiled, do it now */
+ char *buf= txt_to_buf(text);
- text->compiled =
- Py_CompileString( buf, fn_dummy, Py_file_input );
+ text->compiled= Py_CompileString(buf, fn_dummy, Py_file_input);
- MEM_freeN( buf );
+ MEM_freeN(buf);
if(PyErr_Occurred()) {
- python_script_error_jump_text(text);
+ if(do_jump) {
+ python_script_error_jump_text(text);
+ }
BPY_text_free_code(text);
}
}
if(text->compiled) {
- py_dict = PyC_DefaultNameSpace(fn_dummy);
- py_result = PyEval_EvalCode(text->compiled, py_dict, py_dict);
+ py_dict= PyC_DefaultNameSpace(fn_dummy);
+ py_result= PyEval_EvalCode(text->compiled, py_dict, py_dict);
}
}
@@ -397,7 +390,7 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text, st
FILE *fp= fopen(fn, "r");
if(fp) {
- py_dict = PyC_DefaultNameSpace(fn);
+ py_dict= PyC_DefaultNameSpace(fn);
#ifdef _WIN32
/* Previously we used PyRun_File to run directly the code on a FILE
@@ -413,11 +406,11 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text, st
pystring= MEM_mallocN(strlen(fn) + 32, "pystring");
pystring[0]= '\0';
sprintf(pystring, "exec(open(r'%s').read())", fn);
- py_result = PyRun_String( pystring, Py_file_input, py_dict, py_dict );
+ py_result= PyRun_String(pystring, Py_file_input, py_dict, py_dict);
MEM_freeN(pystring);
}
#else
- py_result = PyRun_File(fp, fn, Py_file_input, py_dict, py_dict);
+ py_result= PyRun_File(fp, fn, Py_file_input, py_dict, py_dict);
fclose(fp);
#endif
}
@@ -429,17 +422,20 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text, st
if (!py_result) {
if(text) {
- python_script_error_jump_text(text);
+ if(do_jump) {
+ python_script_error_jump_text(text);
+ }
}
BPy_errors_to_report(reports);
- } else {
- Py_DECREF( py_result );
+ }
+ else {
+ Py_DECREF(py_result);
}
if(py_dict) {
#ifdef PYMODULE_CLEAR_WORKAROUND
PyModuleObject *mmod= (PyModuleObject *)PyDict_GetItemString(PyThreadState_GET()->interp->modules, "__main__");
- PyObject *dict_back = mmod->md_dict;
+ PyObject *dict_back= mmod->md_dict;
/* freeing the module will clear the namespace,
* gives problems running classes defined in this namespace being used later. */
mmod->md_dict= NULL;
@@ -459,18 +455,18 @@ static int python_script_exec(bContext *C, const char *fn, struct Text *text, st
/* Can run a file or text block */
int BPY_filepath_exec(bContext *C, const char *filepath, struct ReportList *reports)
{
- return python_script_exec(C, filepath, NULL, reports);
+ return python_script_exec(C, filepath, NULL, reports, FALSE);
}
-int BPY_text_exec(bContext *C, struct Text *text, struct ReportList *reports)
+int BPY_text_exec(bContext *C, struct Text *text, struct ReportList *reports, const short do_jump)
{
- return python_script_exec(C, NULL, text, reports);
+ return python_script_exec(C, NULL, text, reports, do_jump);
}
void BPY_DECREF(void *pyob_ptr)
{
- PyGILState_STATE gilstate = PyGILState_Ensure();
+ PyGILState_STATE gilstate= PyGILState_Ensure();
Py_DECREF((PyObject *)pyob_ptr);
PyGILState_Release(gilstate);
}
@@ -479,7 +475,7 @@ int BPY_button_exec(bContext *C, const char *expr, double *value)
{
PyGILState_STATE gilstate;
PyObject *py_dict, *mod, *retval;
- int error_ret = 0;
+ int error_ret= 0;
PyObject *main_mod= NULL;
if (!value || !expr) return -1;
@@ -495,7 +491,7 @@ int BPY_button_exec(bContext *C, const char *expr, double *value)
py_dict= PyC_DefaultNameSpace("<blender button>");
- mod = PyImport_ImportModule("math");
+ mod= PyImport_ImportModule("math");
if (mod) {
PyDict_Merge(py_dict, PyModule_GetDict(mod), 0); /* 0 - dont overwrite existing values */
Py_DECREF(mod);
@@ -505,7 +501,7 @@ int BPY_button_exec(bContext *C, const char *expr, double *value)
PyErr_Clear();
}
- retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
+ retval= PyRun_String(expr, Py_eval_input, py_dict, py_dict);
if (retval == NULL) {
error_ret= -1;
@@ -524,7 +520,7 @@ int BPY_button_exec(bContext *C, const char *expr, double *value)
}
}
else {
- val = PyFloat_AsDouble(retval);
+ val= PyFloat_AsDouble(retval);
}
Py_DECREF(retval);
@@ -555,7 +551,8 @@ int BPY_string_exec(bContext *C, const char *expr)
PyGILState_STATE gilstate;
PyObject *main_mod= NULL;
PyObject *py_dict, *retval;
- int error_ret = 0;
+ int error_ret= 0;
+ Main *bmain_back; /* XXX, quick fix for release (Copy Settings crash), needs further investigation */
if (!expr) return -1;
@@ -569,7 +566,12 @@ int BPY_string_exec(bContext *C, const char *expr)
py_dict= PyC_DefaultNameSpace("<blender string>");
- retval = PyRun_String(expr, Py_eval_input, py_dict, py_dict);
+ bmain_back= bpy_import_main_get();
+ bpy_import_main_set(CTX_data_main(C));
+
+ retval= PyRun_String(expr, Py_eval_input, py_dict, py_dict);
+
+ bpy_import_main_set(bmain_back);
if (retval == NULL) {
error_ret= -1;
@@ -650,7 +652,7 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *
else {
int len= PySequence_Fast_GET_SIZE(seq_fast);
int i;
- for(i = 0; i < len; i++) {
+ for(i= 0; i < len; i++) {
PyObject *list_item= PySequence_Fast_GET_ITEM(seq_fast, i);
if(BPy_StructRNA_Check(list_item)) {
@@ -674,11 +676,13 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *
}
if(done==0) {
- if (item) printf("Context '%s' not a valid type\n", member);
- else printf("Context '%s' not found\n", member);
+ if (item) printf("PyContext '%s' not a valid type\n", member);
+ else printf("PyContext '%s' not found\n", member);
}
else {
- printf("Context '%s' found\n", member);
+ if(G.f & G_DEBUG) {
+ printf("PyContext '%s' found\n", member);
+ }
}
return done;
@@ -690,7 +694,7 @@ int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *
/* TODO, reloading the module isnt functional at the moment. */
extern int main_python(int argc, const char **argv);
-static struct PyModuleDef bpy_proxy_def = {
+static struct PyModuleDef bpy_proxy_def= {
PyModuleDef_HEAD_INIT,
"bpy", /* m_name */
NULL, /* m_doc */
@@ -713,13 +717,13 @@ void bpy_module_delay_init(PyObject *bpy_proxy)
{
const int argc= 1;
const char *argv[2];
-
- const char *filename_rel= PyModule_GetFilename(bpy_proxy); /* can be relative */
+ PyObject *filename_obj= PyModule_GetFilenameObject(bpy_proxy); /* updating the module dict below will loose the reference to __file__ */
+ const char *filename_rel= _PyUnicode_AsString(filename_obj); /* can be relative */
char filename_abs[1024];
BLI_strncpy(filename_abs, filename_rel, sizeof(filename_abs));
BLI_path_cwd(filename_abs);
-
+
argv[0]= filename_abs;
argv[1]= NULL;
@@ -733,7 +737,7 @@ void bpy_module_delay_init(PyObject *bpy_proxy)
static void dealloc_obj_dealloc(PyObject *self);
-static PyTypeObject dealloc_obj_Type = {{{0}}};
+static PyTypeObject dealloc_obj_Type= {{{0}}};
/* use our own dealloc so we can free a property if we use one */
static void dealloc_obj_dealloc(PyObject *self)
@@ -767,10 +771,10 @@ PyInit_bpy(void)
dealloc_obj *dob;
/* assign dummy type */
- dealloc_obj_Type.tp_name = "dealloc_obj";
- dealloc_obj_Type.tp_basicsize = sizeof(dealloc_obj);
- dealloc_obj_Type.tp_dealloc = dealloc_obj_dealloc;
- dealloc_obj_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+ dealloc_obj_Type.tp_name= "dealloc_obj";
+ dealloc_obj_Type.tp_basicsize= sizeof(dealloc_obj);
+ dealloc_obj_Type.tp_dealloc= dealloc_obj_dealloc;
+ dealloc_obj_Type.tp_flags= Py_TPFLAGS_DEFAULT;
if(PyType_Ready(&dealloc_obj_Type) < 0)
return NULL;
diff --git a/source/blender/python/intern/bpy_library.c b/source/blender/python/intern/bpy_library.c
new file mode 100644
index 00000000000..08a0b514a0c
--- /dev/null
+++ b/source/blender/python/intern/bpy_library.c
@@ -0,0 +1,367 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/bpy_library.c
+ * \ingroup pythonintern
+ */
+
+#include <Python.h>
+#include <stddef.h>
+
+#include "BLO_readfile.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_library.h"
+#include "BKE_idcode.h"
+#include "BKE_report.h"
+
+#include "BLI_utildefines.h"
+#include "BLI_string.h"
+#include "BLI_linklist.h"
+#include "BLI_path_util.h"
+#include "BLI_listbase.h"
+
+#include "DNA_space_types.h" /* FILE_LINK, FILE_RELPATH */
+
+#include "bpy_util.h"
+
+typedef struct {
+ PyObject_HEAD /* required python macro */
+ /* collection iterator spesific parts */
+ char relpath[FILE_MAX];
+ char abspath[FILE_MAX]; /* absolute path */
+ BlendHandle *blo_handle;
+ int flag;
+ PyObject *dict;
+} BPy_Library;
+
+static PyObject *bpy_lib_load(PyObject *self, PyObject *args, PyObject *kwds);
+static PyObject *bpy_lib_enter(BPy_Library *self, PyObject *args);
+static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *args);
+static PyObject *bpy_lib_dir(BPy_Library *self);
+
+static PyMethodDef bpy_lib_methods[]= {
+ {"__enter__", (PyCFunction)bpy_lib_enter, METH_NOARGS},
+ {"__exit__", (PyCFunction)bpy_lib_exit, METH_VARARGS},
+ {"__dir__", (PyCFunction)bpy_lib_dir, METH_NOARGS},
+ {NULL} /* sentinel */
+};
+
+static void bpy_lib_dealloc(BPy_Library *self)
+{
+ Py_XDECREF(self->dict);
+ Py_TYPE(self)->tp_free(self);
+}
+
+
+PyTypeObject bpy_lib_Type= {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "bpy_lib", /* tp_name */
+ sizeof(BPy_Library), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)bpy_lib_dealloc,/* tp_dealloc */
+ NULL, /* printfunc tp_print; */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
+ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ NULL, /* tp_repr */
+
+ /* Method suites for standard classes */
+
+ NULL, /* PyNumberMethods *tp_as_number; */
+ NULL, /* PySequenceMethods *tp_as_sequence; */
+ NULL, /* PyMappingMethods *tp_as_mapping; */
+
+ /* More standard operations (here for binary compatibility) */
+
+ NULL, /* hashfunc tp_hash; */
+ NULL, /* ternaryfunc tp_call; */
+ NULL, /* reprfunc tp_str; */
+
+ /* will only use these if this is a subtype of a py class */
+ NULL /*PyObject_GenericGetAttr is assigned later */, /* getattrofunc tp_getattro; */
+ NULL, /* setattrofunc tp_setattro; */
+
+ /* Functions to access object as input/output buffer */
+ NULL, /* PyBufferProcs *tp_as_buffer; */
+
+ /*** Flags to define presence of optional/expanded features ***/
+ Py_TPFLAGS_DEFAULT, /* long tp_flags; */
+
+ NULL, /* char *tp_doc; Documentation string */
+ /*** Assigned meaning in release 2.0 ***/
+ /* call function for all accessible objects */
+ NULL, /* traverseproc tp_traverse; */
+
+ /* delete references to contained objects */
+ NULL, /* inquiry tp_clear; */
+
+ /*** Assigned meaning in release 2.1 ***/
+ /*** rich comparisons ***/
+ NULL, /* subclassed */ /* richcmpfunc tp_richcompare; */
+
+ /*** weak reference enabler ***/
+ 0,
+ /*** Added in release 2.2 ***/
+ /* Iterators */
+ NULL, /* getiterfunc tp_iter; */
+ NULL, /* iternextfunc tp_iternext; */
+
+ /*** Attribute descriptor and subclassing stuff ***/
+ bpy_lib_methods, /* struct PyMethodDef *tp_methods; */
+ NULL, /* struct PyMemberDef *tp_members; */
+ NULL, /* struct PyGetSetDef *tp_getset; */
+ NULL, /* struct _typeobject *tp_base; */
+ NULL, /* PyObject *tp_dict; */
+ NULL, /* descrgetfunc tp_descr_get; */
+ NULL, /* descrsetfunc tp_descr_set; */
+ offsetof(BPy_Library, dict),/* long tp_dictoffset; */
+ NULL, /* initproc tp_init; */
+ NULL, /* allocfunc tp_alloc; */
+ NULL, /* newfunc tp_new; */
+ /* Low-level free-memory routine */
+ NULL, /* freefunc tp_free; */
+ /* For PyObject_IS_GC */
+ NULL, /* inquiry tp_is_gc; */
+ NULL, /* PyObject *tp_bases; */
+ /* method resolution order */
+ NULL, /* PyObject *tp_mro; */
+ NULL, /* PyObject *tp_cache; */
+ NULL, /* PyObject *tp_subclasses; */
+ NULL, /* PyObject *tp_weaklist; */
+ NULL
+};
+
+static char bpy_lib_load_doc[] =
+".. method:: load(filepath, link=False, relative=False)\n"
+"\n"
+" Returns a context manager which exposes 2 library objects on entering.\n"
+" Each object has attributes matching bpy.data which are lists of strings to be linked.\n"
+"\n"
+" :arg filepath: The path to a blend file.\n"
+" :type filepath: string\n"
+" :arg link: When False reference to the original file is lost.\n"
+" :type link: bool\n"
+" :arg relative: When True the path is stored relative to the open blend file.\n"
+" :type relative: bool\n"
+;
+static PyObject *bpy_lib_load(PyObject *UNUSED(self), PyObject *args, PyObject *kwds)
+{
+ static const char *kwlist[]= {"filepath", "link", "relative", NULL};
+ BPy_Library *ret;
+ const char* filename= NULL;
+ int is_rel= 0, is_link= 0;
+
+ if(!PyArg_ParseTupleAndKeywords(args, kwds, "s|ii:load", (char **)kwlist, &filename, &is_link, &is_rel))
+ return NULL;
+
+ ret= PyObject_New(BPy_Library, &bpy_lib_Type);
+
+ BLI_strncpy(ret->relpath, filename, sizeof(ret->relpath));
+ BLI_strncpy(ret->abspath, filename, sizeof(ret->abspath));
+ BLI_path_abs(ret->abspath, G.main->name);
+
+ ret->blo_handle= NULL;
+ ret->flag= (is_link ? FILE_LINK : 0) |
+ (is_rel ? FILE_RELPATH : 0);
+
+ ret->dict= PyDict_New();
+
+ return (PyObject *)ret;
+}
+
+static PyObject *_bpy_names(BPy_Library *self, int blocktype)
+{
+ PyObject *list;
+ LinkNode *l, *names;
+ int totnames;
+
+ names= BLO_blendhandle_get_datablock_names(self->blo_handle, blocktype, &totnames);
+
+ if(names) {
+ int counter= 0;
+ list= PyList_New(totnames);
+ for(l= names; l; l= l->next) {
+ PyList_SET_ITEM(list, counter, PyUnicode_FromString((char * )l->link));
+ counter++;
+ }
+ BLI_linklist_free(names, free); /* free linklist *and* each node's data */
+ }
+ else {
+ list= PyList_New(0);
+ }
+
+ return list;
+}
+
+static PyObject *bpy_lib_enter(BPy_Library *self, PyObject *UNUSED(args))
+{
+ PyObject *ret;
+ BPy_Library *self_from;
+ PyObject *from_dict= PyDict_New();
+ ReportList reports;
+
+ BKE_reports_init(&reports, RPT_STORE);
+
+ self->blo_handle= BLO_blendhandle_from_file(self->abspath, &reports);
+
+ if(self->blo_handle == NULL) {
+ if(BPy_reports_to_error(&reports, PyExc_IOError, TRUE) != -1) {
+ PyErr_Format(PyExc_IOError, "load: %s failed to open blend file", self->abspath);
+ }
+ return NULL;
+ }
+ else {
+ int i= 0, code;
+ while((code= BKE_idcode_iter_step(&i))) {
+ if(BKE_idcode_is_linkable(code)) {
+ const char *name_plural= BKE_idcode_to_name_plural(code);
+ PyObject *str= PyUnicode_FromString(name_plural);
+ PyDict_SetItem(self->dict, str, PyList_New(0));
+ PyDict_SetItem(from_dict, str, _bpy_names(self, code));
+ Py_DECREF(str);
+ }
+ }
+ }
+
+ /* create a dummy */
+ self_from= PyObject_New(BPy_Library, &bpy_lib_Type);
+ BLI_strncpy(self_from->relpath, self->relpath, sizeof(BPy_Library));
+ BLI_strncpy(self_from->abspath, self->abspath, sizeof(BPy_Library));
+
+ self_from->blo_handle= NULL;
+ self_from->flag= 0;
+ self_from->dict= from_dict; /* owns the dict */
+
+ /* return pair */
+ ret= PyTuple_New(2);
+
+ PyTuple_SET_ITEM(ret, 0, (PyObject *)self_from);
+
+ PyTuple_SET_ITEM(ret, 1, (PyObject *)self);
+ Py_INCREF(self);
+
+ BKE_reports_clear(&reports);
+
+ return ret;
+}
+
+static PyObject *bpy_lib_exit(BPy_Library *self, PyObject *UNUSED(args))
+{
+ Main *mainl= NULL;
+ int err= 0;
+
+ flag_all_listbases_ids(LIB_PRE_EXISTING, 1);
+
+ /* here appending/linking starts */
+ mainl= BLO_library_append_begin(BPy_GetContext(), &(self->blo_handle), self->relpath);
+
+ {
+ int i= 0, code;
+ while((code= BKE_idcode_iter_step(&i))) {
+ if(BKE_idcode_is_linkable(code)) {
+ const char *name_plural= BKE_idcode_to_name_plural(code);
+ PyObject *ls= PyDict_GetItemString(self->dict, name_plural);
+ // printf("lib: %s\n", name_plural);
+ if(ls && PyList_Check(ls)) {
+ /* loop */
+ Py_ssize_t size= PyList_GET_SIZE(ls);
+ Py_ssize_t i;
+ PyObject *item;
+ const char *item_str;
+
+ for(i= 0; i < size; i++) {
+ item= PyList_GET_ITEM(ls, i);
+ item_str= _PyUnicode_AsString(item);
+
+ // printf(" %s\n", item_str);
+
+ if(item_str) {
+ if(!BLO_library_append_named_part(NULL, mainl, &(self->blo_handle), item_str, code, self->flag)) {
+ PyErr_Format(PyExc_KeyError, "load: %s does not contain %s[\"%s\"]", self->abspath, name_plural, item_str);
+ err= -1;
+ break;
+ }
+ }
+ else {
+ /* XXX, could complain about this */
+ PyErr_Clear();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(err == -1) {
+ /* exception raised above, XXX, this leaks some memory */
+ BLO_blendhandle_close(self->blo_handle);
+ self->blo_handle= NULL;
+ flag_all_listbases_ids(LIB_PRE_EXISTING, 0);
+ return NULL;
+ }
+ else {
+ BLO_library_append_end(NULL, mainl, &(self->blo_handle), 0, self->flag);
+ BLO_blendhandle_close(self->blo_handle);
+ self->blo_handle= NULL;
+
+ { /* copied from wm_operator.c */
+ /* mark all library linked objects to be updated */
+ recalc_all_library_objects(G.main);
+
+ /* append, rather than linking */
+ if((self->flag & FILE_LINK)==0) {
+ Library *lib= BLI_findstring(&G.main->library, self->abspath, offsetof(Library, name));
+ if(lib) all_local(lib, 1);
+ else BLI_assert(!"cant find name of just added library!");
+ }
+ }
+
+ flag_all_listbases_ids(LIB_PRE_EXISTING, 0);
+
+ Py_RETURN_NONE;
+ }
+}
+
+static PyObject *bpy_lib_dir(BPy_Library *self)
+{
+ return PyDict_Keys(self->dict);
+}
+
+
+int bpy_lib_init(PyObject *mod_par)
+{
+ static PyMethodDef load_meth= {"load", (PyCFunction)bpy_lib_load, METH_STATIC|METH_VARARGS|METH_KEYWORDS, bpy_lib_load_doc};
+ PyModule_AddObject(mod_par, "_library_load", PyCFunction_New(&load_meth, NULL));
+
+ /* some compilers dont like accessing this directly, delay assignment */
+ bpy_lib_Type.tp_getattro= PyObject_GenericGetAttr;
+
+ if(PyType_Ready(&bpy_lib_Type) < 0)
+ return -1;
+
+ return 0;
+}
diff --git a/source/blender/python/intern/bpy_operator.c b/source/blender/python/intern/bpy_operator.c
index cb527f562eb..ebe6e05ee43 100644
--- a/source/blender/python/intern/bpy_operator.c
+++ b/source/blender/python/intern/bpy_operator.c
@@ -1,5 +1,5 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -23,19 +23,28 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_operator.c
+ * \ingroup pythonintern
+ */
+
+
/* Note, this module is not to be used directly by the user.
* Internally its exposed as '_bpy.ops', which provides functions for 'bpy.ops', a python package.
* */
#include <Python.h>
+#include "RNA_types.h"
+
#include "bpy_operator.h"
#include "bpy_operator_wrap.h"
#include "bpy_rna.h" /* for setting arg props only - pyrna_py_to_prop() */
#include "bpy_util.h"
+#include "../generic/bpy_internal_import.h"
#include "BLI_utildefines.h"
+#include "RNA_access.h"
#include "RNA_enum_types.h"
#include "WM_api.h"
@@ -110,7 +119,7 @@ static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args)
static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
{
wmOperatorType *ot;
- int error_val = 0;
+ int error_val= 0;
PointerRNA ptr;
int operator_ret= OPERATOR_CANCELLED;
@@ -124,7 +133,7 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
int context= WM_OP_EXEC_DEFAULT;
// XXX Todo, work out a better solution for passing on context, could make a tuple from self and pack the name and Context into it...
- bContext *C = (bContext *)BPy_GetContext();
+ bContext *C= (bContext *)BPy_GetContext();
if(C==NULL) {
PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators");
@@ -186,12 +195,11 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
ReportList *reports;
reports= MEM_mallocN(sizeof(ReportList), "wmOperatorReportList");
- BKE_reports_init(reports, RPT_STORE);
+ BKE_reports_init(reports, RPT_STORE | RPT_OP_HOLD); /* own so these dont move into global reports */
operator_ret= WM_operator_call_py(C, ot, context, &ptr, reports);
- if(BPy_reports_to_error(reports, FALSE))
- error_val = -1;
+ error_val= BPy_reports_to_error(reports, PyExc_RuntimeError, FALSE);
/* operator output is nice to have in the terminal/console too */
if(reports->list.first) {
@@ -239,6 +247,8 @@ static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args)
* function corrects bpy.data (internal Main pointer) */
BPY_modules_update(C);
+ /* needed for when WM_OT_read_factory_settings us called fro within a script */
+ bpy_import_main_set(CTX_data_main(C));
/* return operator_ret as a bpy enum */
return pyrna_enum_bitfield_to_py(operator_return_items, operator_ret);
@@ -252,10 +262,10 @@ static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args)
char *opname;
PyObject *kw= NULL; /* optional args */
- int all_args = 1;
+ int all_args= 1;
int error_val= 0;
- char *buf = NULL;
+ char *buf= NULL;
PyObject *pybuf;
bContext *C= (bContext *)BPy_GetContext();
@@ -304,11 +314,11 @@ static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args)
static PyObject *pyop_dir(PyObject *UNUSED(self))
{
- PyObject *list = PyList_New(0), *name;
+ PyObject *list= PyList_New(0), *name;
wmOperatorType *ot;
for(ot= WM_operatortype_first(); ot; ot= ot->next) {
- name = PyUnicode_FromString(ot->idname);
+ name= PyUnicode_FromString(ot->idname);
PyList_Append(list, name);
Py_DECREF(name);
}
@@ -346,7 +356,7 @@ static PyObject *pyop_getrna(PyObject *UNUSED(self), PyObject *value)
return (PyObject *)pyrna;
}
-static struct PyMethodDef bpy_ops_methods[] = {
+static struct PyMethodDef bpy_ops_methods[]= {
{"poll", (PyCFunction) pyop_poll, METH_VARARGS, NULL},
{"call", (PyCFunction) pyop_call, METH_VARARGS, NULL},
{"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL},
@@ -356,7 +366,7 @@ static struct PyMethodDef bpy_ops_methods[] = {
{NULL, NULL, 0, NULL}
};
-static struct PyModuleDef bpy_ops_module = {
+static struct PyModuleDef bpy_ops_module= {
PyModuleDef_HEAD_INIT,
"_bpy.ops",
NULL,
diff --git a/source/blender/python/intern/bpy_operator.h b/source/blender/python/intern/bpy_operator.h
index a8bf8436e83..60cb78f9af5 100644
--- a/source/blender/python/intern/bpy_operator.h
+++ b/source/blender/python/intern/bpy_operator.h
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/intern/bpy_operator.h
+ * \ingroup pythonintern
+ */
+
#ifndef BPY_OPERATOR_H
#define BPY_OPERATOR_H
diff --git a/source/blender/python/intern/bpy_operator_wrap.c b/source/blender/python/intern/bpy_operator_wrap.c
index f890ab81948..de29cb2aeac 100644
--- a/source/blender/python/intern/bpy_operator_wrap.c
+++ b/source/blender/python/intern/bpy_operator_wrap.c
@@ -1,4 +1,4 @@
-/**
+/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_operator_wrap.c
+ * \ingroup pythonintern
+ */
+
+
#include <Python.h>
#include "bpy_operator_wrap.h"
@@ -30,13 +35,14 @@
#include "BLI_utildefines.h"
+#include "RNA_access.h"
#include "RNA_define.h"
#include "bpy_rna.h"
static void operator_properties_init(wmOperatorType *ot)
{
- PyObject *py_class = ot->ext.data;
+ PyObject *py_class= ot->ext.data;
RNA_struct_blender_type_set(ot->ext.srna, ot);
/* only call this so pyrna_deferred_register_class gives a useful error
@@ -54,7 +60,7 @@ void operator_wrapper(wmOperatorType *ot, void *userdata)
{
/* take care not to overwrite anything set in
* WM_operatortype_append_ptr before opfunc() is called */
- StructRNA *srna = ot->srna;
+ StructRNA *srna= ot->srna;
*ot= *((wmOperatorType *)userdata);
ot->srna= srna; /* restore */
@@ -65,7 +71,7 @@ void operator_wrapper(wmOperatorType *ot, void *userdata)
PropertyRNA *prop;
RNA_pointer_create(NULL, ot->srna, NULL, &ptr);
- prop = RNA_struct_find_property(&ptr, "type");
+ prop= RNA_struct_find_property(&ptr, "type");
if(prop)
ot->prop= prop;
}
@@ -73,16 +79,16 @@ void operator_wrapper(wmOperatorType *ot, void *userdata)
void macro_wrapper(wmOperatorType *ot, void *userdata)
{
- wmOperatorType *data = (wmOperatorType *)userdata;
+ wmOperatorType *data= (wmOperatorType *)userdata;
/* only copy a couple of things, the rest is set by the macro registration */
- ot->name = data->name;
- ot->idname = data->idname;
- ot->description = data->description;
+ ot->name= data->name;
+ ot->idname= data->idname;
+ ot->description= data->description;
ot->flag |= data->flag; /* append flags to the one set by registration */
- ot->pyop_poll = data->pyop_poll;
- ot->ui = data->ui;
- ot->ext = data->ext;
+ ot->pyop_poll= data->pyop_poll;
+ ot->ui= data->ui;
+ ot->ext= data->ext;
operator_properties_init(ot);
}
@@ -108,16 +114,16 @@ PyObject *PYOP_wrap_macro_define(PyObject *UNUSED(self), PyObject *args)
/* identifiers */
srna= srna_from_self(macro, "Macro Define:");
- macroname = RNA_struct_identifier(srna);
+ macroname= RNA_struct_identifier(srna);
- ot = WM_operatortype_find(macroname, TRUE);
+ ot= WM_operatortype_find(macroname, TRUE);
if (!ot) {
PyErr_Format(PyExc_ValueError, "Macro Define: '%s' is not a valid macro or hasn't been registered yet", macroname);
return NULL;
}
- otmacro = WM_operatortype_macro_define(ot, opname);
+ otmacro= WM_operatortype_macro_define(ot, opname);
RNA_pointer_create(NULL, &RNA_OperatorTypeMacro, otmacro, &ptr_otmacro);
diff --git a/source/blender/python/intern/bpy_operator_wrap.h b/source/blender/python/intern/bpy_operator_wrap.h
index 599a42f7bd8..f833b2f0028 100644
--- a/source/blender/python/intern/bpy_operator_wrap.h
+++ b/source/blender/python/intern/bpy_operator_wrap.h
@@ -21,6 +21,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/intern/bpy_operator_wrap.h
+ * \ingroup pythonintern
+ */
+
#ifndef BPY_OPERATOR_WRAP_H
#define BPY_OPERATOR_WRAP_H
diff --git a/source/blender/python/intern/bpy_props.c b/source/blender/python/intern/bpy_props.c
index c8af0d63e3b..e51ea048b92 100644
--- a/source/blender/python/intern/bpy_props.c
+++ b/source/blender/python/intern/bpy_props.c
@@ -22,14 +22,24 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_props.c
+ * \ingroup pythonintern
+ */
+
+
#include <Python.h>
+#include "RNA_types.h"
+
#include "bpy_props.h"
#include "bpy_rna.h"
#include "bpy_util.h"
#include "BLI_utildefines.h"
+#include "BKE_idprop.h"
+
+#include "RNA_access.h"
#include "RNA_define.h" /* for defining our own rna */
#include "RNA_enum_types.h"
@@ -37,19 +47,19 @@
#include "../generic/py_capi_utils.h"
-static EnumPropertyItem property_flag_items[] = {
+static EnumPropertyItem property_flag_items[]= {
{PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""},
{PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem property_flag_enum_items[] = {
+static EnumPropertyItem property_flag_enum_items[]= {
{PROP_HIDDEN, "HIDDEN", 0, "Hidden", ""},
{PROP_ANIMATABLE, "ANIMATABLE", 0, "Animateable", ""},
{PROP_ENUM_FLAG, "ENUM_FLAG", 0, "Enum Flag", ""},
{0, NULL, 0, NULL, NULL}};
/* subtypes */
-static EnumPropertyItem property_subtype_string_items[] = {
+static EnumPropertyItem property_subtype_string_items[]= {
{PROP_FILEPATH, "FILE_PATH", 0, "File Path", ""},
{PROP_DIRPATH, "DIR_PATH", 0, "Directory Path", ""},
{PROP_FILENAME, "FILENAME", 0, "Filename", ""},
@@ -57,7 +67,7 @@ static EnumPropertyItem property_subtype_string_items[] = {
{PROP_NONE, "NONE", 0, "None", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem property_subtype_number_items[] = {
+static EnumPropertyItem property_subtype_number_items[]= {
{PROP_UNSIGNED, "UNSIGNED", 0, "Unsigned", ""},
{PROP_PERCENTAGE, "PERCENTAGE", 0, "Percentage", ""},
{PROP_FACTOR, "FACTOR", 0, "Factor", ""},
@@ -68,7 +78,7 @@ static EnumPropertyItem property_subtype_number_items[] = {
{PROP_NONE, "NONE", 0, "None", ""},
{0, NULL, 0, NULL, NULL}};
-static EnumPropertyItem property_subtype_array_items[] = {
+static EnumPropertyItem property_subtype_array_items[]= {
{PROP_COLOR, "COLOR", 0, "Color", ""},
{PROP_TRANSLATION, "TRANSLATION", 0, "Translation", ""},
{PROP_DIRECTION, "DIRECTION", 0, "Direction", ""},
@@ -86,17 +96,17 @@ static EnumPropertyItem property_subtype_array_items[] = {
{0, NULL, 0, NULL, NULL}};
/* PyObject's */
-static PyObject *pymeth_BoolProperty = NULL;
-static PyObject *pymeth_BoolVectorProperty = NULL;
-static PyObject *pymeth_IntProperty = NULL;
-static PyObject *pymeth_IntVectorProperty = NULL;
-static PyObject *pymeth_FloatProperty = NULL;
-static PyObject *pymeth_FloatVectorProperty = NULL;
-static PyObject *pymeth_StringProperty = NULL;
-static PyObject *pymeth_EnumProperty = NULL;
-static PyObject *pymeth_PointerProperty = NULL;
-static PyObject *pymeth_CollectionProperty = NULL;
-static PyObject *pymeth_RemoveProperty = NULL;
+static PyObject *pymeth_BoolProperty= NULL;
+static PyObject *pymeth_BoolVectorProperty= NULL;
+static PyObject *pymeth_IntProperty= NULL;
+static PyObject *pymeth_IntVectorProperty= NULL;
+static PyObject *pymeth_FloatProperty= NULL;
+static PyObject *pymeth_FloatVectorProperty= NULL;
+static PyObject *pymeth_StringProperty= NULL;
+static PyObject *pymeth_EnumProperty= NULL;
+static PyObject *pymeth_PointerProperty= NULL;
+static PyObject *pymeth_CollectionProperty= NULL;
+static PyObject *pymeth_RemoveProperty= NULL;
/* operators and classes use this so it can store the args given but defer
@@ -104,7 +114,7 @@ static PyObject *pymeth_RemoveProperty = NULL;
* the default args for that operator instance */
static PyObject *bpy_prop_deferred_return(PyObject *func, PyObject *kw)
{
- PyObject *ret = PyTuple_New(2);
+ PyObject *ret= PyTuple_New(2);
PyTuple_SET_ITEM(ret, 0, func);
Py_INCREF(func);
@@ -203,7 +213,7 @@ static PyObject *BPy_BoolProperty(PyObject *self, PyObject *args, PyObject *kw)
BPY_PROPDEF_HEAD(BoolProperty)
if(srna) {
- static const char *kwlist[] = {"attr", "name", "description", "default", "options", "subtype", NULL};
+ static const char *kwlist[]= {"attr", "name", "description", "default", "options", "subtype", NULL};
const char *id=NULL, *name="", *description="";
int id_len;
int def=0;
@@ -245,7 +255,7 @@ BPY_PROPDEF_DESC_DOC
" :type options: set\n"
" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n"
" :type subtype: string\n"
-" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n"
+" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n"
" :type size: int\n"
;
static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
@@ -255,7 +265,7 @@ static PyObject *BPy_BoolVectorProperty(PyObject *self, PyObject *args, PyObject
BPY_PROPDEF_HEAD(BoolVectorProperty)
if(srna) {
- static const char *kwlist[] = {"attr", "name", "description", "default", "options", "subtype", "size", NULL};
+ static const char *kwlist[]= {"attr", "name", "description", "default", "options", "subtype", "size", NULL};
const char *id=NULL, *name="", *description="";
int id_len;
int def[PYRNA_STACK_ARRAY]={0};
@@ -315,7 +325,7 @@ static PyObject *BPy_IntProperty(PyObject *self, PyObject *args, PyObject *kw)
BPY_PROPDEF_HEAD(IntProperty)
if(srna) {
- static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "options", "subtype", NULL};
+ static const char *kwlist[]= {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "options", "subtype", NULL};
const char *id=NULL, *name="", *description="";
int id_len;
int min=INT_MIN, max=INT_MAX, soft_min=INT_MIN, soft_max=INT_MAX, step=1, def=0;
@@ -358,7 +368,7 @@ BPY_PROPDEF_DESC_DOC
" :type options: set\n"
" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n"
" :type subtype: string\n"
-" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n"
+" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n"
" :type size: int\n"
;
static PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
@@ -368,7 +378,7 @@ static PyObject *BPy_IntVectorProperty(PyObject *self, PyObject *args, PyObject
BPY_PROPDEF_HEAD(IntVectorProperty)
if(srna) {
- static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "options", "subtype", "size", NULL};
+ static const char *kwlist[]= {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "options", "subtype", "size", NULL};
const char *id=NULL, *name="", *description="";
int id_len;
int min=INT_MIN, max=INT_MAX, soft_min=INT_MIN, soft_max=INT_MAX, step=1, def[PYRNA_STACK_ARRAY]={0};
@@ -431,7 +441,7 @@ static PyObject *BPy_FloatProperty(PyObject *self, PyObject *args, PyObject *kw)
BPY_PROPDEF_HEAD(FloatProperty)
if(srna) {
- static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "precision", "options", "subtype", "unit", NULL};
+ static const char *kwlist[]= {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "precision", "options", "subtype", "unit", NULL};
const char *id=NULL, *name="", *description="";
int id_len;
float min=-FLT_MAX, max=FLT_MAX, soft_min=-FLT_MAX, soft_max=FLT_MAX, step=3, def=0.0f;
@@ -482,7 +492,7 @@ BPY_PROPDEF_DESC_DOC
" :type options: set\n"
" :arg subtype: Enumerator in ['COLOR', 'TRANSLATION', 'DIRECTION', 'VELOCITY', 'ACCELERATION', 'MATRIX', 'EULER', 'QUATERNION', 'AXISANGLE', 'XYZ', 'COLOR_GAMMA', 'LAYER', 'NONE'].\n"
" :type subtype: string\n"
-" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n"
+" :arg size: Vector dimensions in [1, and " STRINGIFY(PYRNA_STACK_ARRAY) "].\n"
" :type size: int\n"
;
static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObject *kw)
@@ -492,7 +502,7 @@ static PyObject *BPy_FloatVectorProperty(PyObject *self, PyObject *args, PyObjec
BPY_PROPDEF_HEAD(FloatVectorProperty)
if(srna) {
- static const char *kwlist[] = {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "precision", "options", "subtype", "size", NULL};
+ static const char *kwlist[]= {"attr", "name", "description", "default", "min", "max", "soft_min", "soft_max", "step", "precision", "options", "subtype", "size", NULL};
const char *id=NULL, *name="", *description="";
int id_len;
float min=-FLT_MAX, max=FLT_MAX, soft_min=-FLT_MAX, soft_max=FLT_MAX, step=3, def[PYRNA_STACK_ARRAY]={0.0f};
@@ -552,7 +562,7 @@ static PyObject *BPy_StringProperty(PyObject *self, PyObject *args, PyObject *kw
BPY_PROPDEF_HEAD(StringProperty)
if(srna) {
- static const char *kwlist[] = {"attr", "name", "description", "default", "maxlen", "options", "subtype", NULL};
+ static const char *kwlist[]= {"attr", "name", "description", "default", "maxlen", "options", "subtype", NULL};
const char *id=NULL, *name="", *description="", *def="";
int id_len;
int maxlen=0;
@@ -693,7 +703,7 @@ static PyObject *BPy_EnumProperty(PyObject *self, PyObject *args, PyObject *kw)
BPY_PROPDEF_HEAD(EnumProperty)
if(srna) {
- static const char *kwlist[] = {"attr", "items", "name", "description", "default", "options", NULL};
+ static const char *kwlist[]= {"attr", "items", "name", "description", "default", "options", NULL};
const char *id=NULL, *name="", *description="";
PyObject *def= NULL;
int id_len;
@@ -778,7 +788,7 @@ static PyObject *BPy_PointerProperty(PyObject *self, PyObject *args, PyObject *k
BPY_PROPDEF_HEAD(PointerProperty)
if(srna) {
- static const char *kwlist[] = {"attr", "type", "name", "description", "options", NULL};
+ static const char *kwlist[]= {"attr", "type", "name", "description", "options", NULL};
const char *id=NULL, *name="", *description="";
int id_len;
PropertyRNA *prop;
@@ -825,7 +835,7 @@ static PyObject *BPy_CollectionProperty(PyObject *self, PyObject *args, PyObject
BPY_PROPDEF_HEAD(CollectionProperty)
if(srna) {
- static const char *kwlist[] = {"attr", "type", "name", "description", "options", NULL};
+ static const char *kwlist[]= {"attr", "type", "name", "description", "options", NULL};
const char *id=NULL, *name="", *description="";
int id_len;
PropertyRNA *prop;
@@ -887,7 +897,7 @@ static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw
return NULL;
}
else {
- static const char *kwlist[] = {"attr", NULL};
+ static const char *kwlist[]= {"attr", NULL};
char *id=NULL;
@@ -902,7 +912,7 @@ static PyObject *BPy_RemoveProperty(PyObject *self, PyObject *args, PyObject *kw
Py_RETURN_NONE;
}
-static struct PyMethodDef props_methods[] = {
+static struct PyMethodDef props_methods[]= {
{"BoolProperty", (PyCFunction)BPy_BoolProperty, METH_VARARGS|METH_KEYWORDS, BPy_BoolProperty_doc},
{"BoolVectorProperty", (PyCFunction)BPy_BoolVectorProperty, METH_VARARGS|METH_KEYWORDS, BPy_BoolVectorProperty_doc},
{"IntProperty", (PyCFunction)BPy_IntProperty, METH_VARARGS|METH_KEYWORDS, BPy_IntProperty_doc},
@@ -918,7 +928,7 @@ static struct PyMethodDef props_methods[] = {
{NULL, NULL, 0, NULL}
};
-static struct PyModuleDef props_module = {
+static struct PyModuleDef props_module= {
PyModuleDef_HEAD_INIT,
"bpy.props",
"This module defines properties to extend blenders internal data, the result of these functions"
@@ -944,7 +954,7 @@ PyObject *BPY_rna_props( void )
/* api needs the PyObjects internally */
submodule_dict= PyModule_GetDict(submodule);
-#define ASSIGN_STATIC(_name) pymeth_##_name = PyDict_GetItemString(submodule_dict, #_name)
+#define ASSIGN_STATIC(_name) pymeth_##_name= PyDict_GetItemString(submodule_dict, #_name)
ASSIGN_STATIC(BoolProperty);
ASSIGN_STATIC(BoolVectorProperty);
diff --git a/source/blender/python/intern/bpy_props.h b/source/blender/python/intern/bpy_props.h
index 828c6719ffc..f306d6898d1 100644
--- a/source/blender/python/intern/bpy_props.h
+++ b/source/blender/python/intern/bpy_props.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_props.h
+ * \ingroup pythonintern
+ */
+
+
#ifndef BPY_PROPS_H
#define BPY_PROPS_H
diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index f18b1aee5ab..61ccd0d9310 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -22,23 +22,41 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_rna.c
+ * \ingroup pythonintern
+ */
+
+
#include <Python.h>
#include <stddef.h>
#include <float.h> /* FLT_MIN/MAX */
+#include "RNA_types.h"
+
#include "bpy_rna.h"
+#include "bpy_rna_anim.h"
#include "bpy_props.h"
#include "bpy_util.h"
#include "bpy_rna_callback.h"
+#ifdef USE_PYRNA_INVALIDATE_WEAKREF
+#include "MEM_guardedalloc.h"
+#endif
+
#include "BLI_dynstr.h"
#include "BLI_string.h"
#include "BLI_listbase.h"
+#include "BLI_math_rotation.h"
#include "BLI_utildefines.h"
+#ifdef USE_PYRNA_INVALIDATE_WEAKREF
+#include "BLI_ghash.h"
+#endif
+
#include "RNA_enum_types.h"
#include "RNA_define.h" /* RNA_def_property_free_identifier */
+#include "RNA_access.h"
#include "MEM_guardedalloc.h"
@@ -46,15 +64,11 @@
#include "BKE_context.h"
#include "BKE_global.h" /* evil G.* */
#include "BKE_report.h"
+#include "BKE_idprop.h"
#include "BKE_animsys.h"
#include "BKE_fcurve.h"
-/* only for keyframing */
-#include "DNA_scene_types.h"
-#include "DNA_anim_types.h"
-#include "ED_keyframing.h"
-
#include "../generic/IDProp.h" /* for IDprop lookups */
#include "../generic/py_capi_utils.h"
@@ -62,8 +76,217 @@
#define USE_MATHUTILS
#define USE_STRING_COERCE
+static PyObject* pyrna_struct_Subtype(PointerRNA *ptr);
static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self);
+int pyrna_struct_validity_check(BPy_StructRNA *pysrna)
+{
+ if(pysrna->ptr.type)
+ return 0;
+ PyErr_Format(PyExc_ReferenceError, "StructRNA of type %.200s has been removed", Py_TYPE(pysrna)->tp_name);
+ return -1;
+}
+
+int pyrna_prop_validity_check(BPy_PropertyRNA *self)
+{
+ if(self->ptr.type)
+ return 0;
+ PyErr_Format(PyExc_ReferenceError, "PropertyRNA of type %.200s.%.200s has been removed", Py_TYPE(self)->tp_name, RNA_property_identifier(self->prop));
+ return -1;
+}
+
+#if defined(USE_PYRNA_INVALIDATE_GC) || defined(USE_PYRNA_INVALIDATE_WEAKREF)
+static void pyrna_invalidate(BPy_DummyPointerRNA *self)
+{
+ self->ptr.type= NULL; /* this is checked for validity */
+ self->ptr.id.data= NULL; /* should not be needed but prevent bad pointer access, just incase */
+}
+#endif
+
+#ifdef USE_PYRNA_INVALIDATE_GC
+#define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))
+
+/* only for sizeof() */
+struct gc_generation {
+ PyGC_Head head;
+ int threshold;
+ int count;
+} gc_generation;
+
+static void id_release_gc(struct ID *id)
+{
+ unsigned int j;
+ // unsigned int i= 0;
+ for(j=0; j<3; j++) {
+ /* hack below to get the 2 other lists from _PyGC_generation0 that are normally not exposed */
+ PyGC_Head *gen= (PyGC_Head *)(((char *)_PyGC_generation0) + (sizeof(gc_generation) * j));
+ PyGC_Head *g= gen->gc.gc_next;
+ while ((g= g->gc.gc_next) != gen) {
+ PyObject *ob= FROM_GC(g);
+ if(PyType_IsSubtype(Py_TYPE(ob), &pyrna_struct_Type) || PyType_IsSubtype(Py_TYPE(ob), &pyrna_prop_Type)) {
+ BPy_DummyPointerRNA *ob_ptr= (BPy_DummyPointerRNA *)ob;
+ if(ob_ptr->ptr.id.data == id) {
+ pyrna_invalidate(ob_ptr);
+ // printf("freeing: %p %s, %.200s\n", (void *)ob, id->name, Py_TYPE(ob)->tp_name);
+ // i++;
+ }
+ }
+ }
+ }
+ // printf("id_release_gc freed '%s': %d\n", id->name, i);
+}
+#endif
+
+#ifdef USE_PYRNA_INVALIDATE_WEAKREF
+//#define DEBUG_RNA_WEAKREF
+
+struct GHash *id_weakref_pool= NULL;
+static PyObject *id_free_weakref_cb(PyObject *weakinfo_pair, PyObject *weakref);
+static PyMethodDef id_free_weakref_cb_def= {"id_free_weakref_cb", (PyCFunction)id_free_weakref_cb, METH_O, NULL};
+
+/* adds a reference to the list, remember ot decref */
+static GHash *id_weakref_pool_get(ID *id)
+{
+ GHash *weakinfo_hash= NULL;
+
+ if(id_weakref_pool) {
+ weakinfo_hash= BLI_ghash_lookup(id_weakref_pool, (void *)id);
+ }
+ else {
+ /* first time, allocate pool */
+ id_weakref_pool= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "rna_global_pool");
+ weakinfo_hash= NULL;
+ }
+
+ if(weakinfo_hash==NULL) {
+ /* we're using a ghash as a set, could use libHX's HXMAP_SINGULAR but would be an extra dep. */
+ weakinfo_hash= BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "rna_id");
+ BLI_ghash_insert(id_weakref_pool, (void *)id, weakinfo_hash);
+ }
+
+ return weakinfo_hash;
+}
+
+/* called from pyrna_struct_CreatePyObject() and pyrna_prop_CreatePyObject() */
+void id_weakref_pool_add(ID *id, BPy_DummyPointerRNA *pyrna)
+{
+ PyObject *weakref;
+ PyObject *weakref_capsule;
+ PyObject *weakref_cb_py;
+
+ /* create a new function instance and insert the list as 'self' so we can remove ourself from it */
+ GHash *weakinfo_hash= id_weakref_pool_get(id); /* new or existing */
+
+ weakref_capsule= PyCapsule_New(weakinfo_hash, NULL, NULL);
+ weakref_cb_py= PyCFunction_New(&id_free_weakref_cb_def, weakref_capsule);
+ Py_DECREF(weakref_capsule);
+
+ /* add weakref to weakinfo_hash list */
+ weakref= PyWeakref_NewRef((PyObject *)pyrna, weakref_cb_py);
+
+ Py_DECREF(weakref_cb_py); /* function owned by the weakref now */
+
+ /* important to add at the end, since first removal looks at the end */
+ BLI_ghash_insert(weakinfo_hash, (void *)weakref, id); /* using a hash table as a set, all 'id's are the same */
+ /* weakinfo_hash owns the weakref */
+
+}
+
+/* workaround to get the last id without a lookup */
+static ID *_id_tmp_ptr;
+static void value_id_set(void *id)
+{
+ _id_tmp_ptr= (ID *)id;
+}
+
+static void id_release_weakref_list(struct ID *id, GHash *weakinfo_hash);
+static PyObject *id_free_weakref_cb(PyObject *weakinfo_capsule, PyObject *weakref)
+{
+ /* important to search backwards */
+ GHash *weakinfo_hash= PyCapsule_GetPointer(weakinfo_capsule, NULL);
+
+
+ if(BLI_ghash_size(weakinfo_hash) > 1) {
+ BLI_ghash_remove(weakinfo_hash, weakref, NULL, NULL);
+ }
+ else { /* get the last id and free it */
+ BLI_ghash_remove(weakinfo_hash, weakref, NULL, value_id_set);
+ id_release_weakref_list(_id_tmp_ptr, weakinfo_hash);
+ }
+
+ Py_DECREF(weakref);
+
+ Py_RETURN_NONE;
+}
+
+static void id_release_weakref_list(struct ID *id, GHash *weakinfo_hash)
+{
+ GHashIterator weakinfo_hash_iter;
+
+ BLI_ghashIterator_init(&weakinfo_hash_iter, weakinfo_hash);
+
+#ifdef DEBUG_RNA_WEAKREF
+ fprintf(stdout, "id_release_weakref: '%s', %d items\n", id->name, BLI_ghash_size(weakinfo_hash));
+#endif
+
+ while (!BLI_ghashIterator_isDone(&weakinfo_hash_iter)) {
+ PyObject *weakref= (PyObject *)BLI_ghashIterator_getKey(&weakinfo_hash_iter);
+ PyObject *item= PyWeakref_GET_OBJECT(weakref);
+ if(item != Py_None) {
+
+#ifdef DEBUG_RNA_WEAKREF
+ PyC_ObSpit("id_release_weakref item ", item);
+#endif
+
+ pyrna_invalidate((BPy_DummyPointerRNA *)item);
+ }
+
+ Py_DECREF(weakref);
+
+ BLI_ghashIterator_step(&weakinfo_hash_iter);
+ }
+
+ BLI_ghash_remove(id_weakref_pool, (void *)id, NULL, NULL);
+ BLI_ghash_free(weakinfo_hash, NULL, NULL);
+
+ if(BLI_ghash_size(id_weakref_pool) == 0) {
+ BLI_ghash_free(id_weakref_pool, NULL, NULL);
+ id_weakref_pool= NULL;
+#ifdef DEBUG_RNA_WEAKREF
+ printf("id_release_weakref freeing pool\n");
+#endif
+ }
+}
+
+static void id_release_weakref(struct ID *id)
+{
+ GHash *weakinfo_hash= BLI_ghash_lookup(id_weakref_pool, (void *)id);
+ if(weakinfo_hash) {
+ id_release_weakref_list(id, weakinfo_hash);
+ }
+}
+
+#endif /* USE_PYRNA_INVALIDATE_WEAKREF */
+
+void BPY_id_release(struct ID *id)
+{
+#ifdef USE_PYRNA_INVALIDATE_GC
+ id_release_gc(id);
+#endif
+
+#ifdef USE_PYRNA_INVALIDATE_WEAKREF
+ if(id_weakref_pool) {
+ PyGILState_STATE gilstate= PyGILState_Ensure();
+
+ id_release_weakref(id);
+
+ PyGILState_Release(gilstate);
+ }
+#endif /* USE_PYRNA_INVALIDATE_WEAKREF */
+
+ (void)id;
+}
+
#ifdef USE_PEDANTIC_WRITE
static short rna_disallow_writes= FALSE;
@@ -125,14 +348,20 @@ static int mathutils_rna_array_cb_index= -1; /* index for our callbacks */
static int mathutils_rna_generic_check(BaseMathObject *bmo)
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
- return self->prop ? 1:0;
+
+ PYRNA_PROP_CHECK_INT(self)
+
+ return self->prop ? 0 : -1;
}
static int mathutils_rna_vector_get(BaseMathObject *bmo, int subtype)
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+
+ PYRNA_PROP_CHECK_INT(self)
+
if(self->prop==NULL)
- return 0;
+ return -1;
RNA_property_float_get_array(&self->ptr, self->prop, bmo->data);
@@ -143,25 +372,28 @@ static int mathutils_rna_vector_get(BaseMathObject *bmo, int subtype)
eul->order= pyrna_rotation_euler_order_get(&self->ptr, &prop_eul_order, eul->order);
}
- return 1;
+ return 0;
}
static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
float min, max;
+
+ PYRNA_PROP_CHECK_INT(self)
+
if(self->prop==NULL)
- return 0;
+ return -1;
#ifdef USE_PEDANTIC_WRITE
if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
- return 0;
+ return -1;
}
#endif // USE_PEDANTIC_WRITE
if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
PyErr_Format(PyExc_AttributeError, "bpy_prop \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
- return 0;
+ return -1;
}
RNA_property_float_range(&self->ptr, self->prop, &min, &max);
@@ -190,36 +422,40 @@ static int mathutils_rna_vector_set(BaseMathObject *bmo, int subtype)
}
}
}
- return 1;
+ return 0;
}
static int mathutils_rna_vector_get_index(BaseMathObject *bmo, int UNUSED(subtype), int index)
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ PYRNA_PROP_CHECK_INT(self)
+
if(self->prop==NULL)
- return 0;
+ return -1;
bmo->data[index]= RNA_property_float_get_index(&self->ptr, self->prop, index);
- return 1;
+ return 0;
}
static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int UNUSED(subtype), int index)
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ PYRNA_PROP_CHECK_INT(self)
+
if(self->prop==NULL)
- return 0;
+ return -1;
#ifdef USE_PEDANTIC_WRITE
if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
- return 0;
+ return -1;
}
#endif // USE_PEDANTIC_WRITE
if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
PyErr_Format(PyExc_AttributeError, "bpy_prop \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
- return 0;
+ return -1;
}
RNA_property_float_clamp(&self->ptr, self->prop, &bmo->data[index]);
@@ -229,10 +465,10 @@ static int mathutils_rna_vector_set_index(BaseMathObject *bmo, int UNUSED(subtyp
RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
}
- return 1;
+ return 0;
}
-static Mathutils_Callback mathutils_rna_array_cb = {
+static Mathutils_Callback mathutils_rna_array_cb= {
(BaseMathCheckFunc) mathutils_rna_generic_check,
(BaseMathGetFunc) mathutils_rna_vector_get,
(BaseMathSetFunc) mathutils_rna_vector_set,
@@ -248,29 +484,33 @@ static int mathutils_rna_matrix_get(BaseMathObject *bmo, int UNUSED(subtype))
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ PYRNA_PROP_CHECK_INT(self)
+
if(self->prop==NULL)
- return 0;
+ return -1;
RNA_property_float_get_array(&self->ptr, self->prop, bmo->data);
- return 1;
+ return 0;
}
static int mathutils_rna_matrix_set(BaseMathObject *bmo, int UNUSED(subtype))
{
BPy_PropertyRNA *self= (BPy_PropertyRNA *)bmo->cb_user;
+ PYRNA_PROP_CHECK_INT(self)
+
if(self->prop==NULL)
- return 0;
+ return -1;
#ifdef USE_PEDANTIC_WRITE
if(rna_disallow_writes && rna_id_write_error(&self->ptr, NULL)) {
- return 0;
+ return -1;
}
#endif // USE_PEDANTIC_WRITE
if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
PyErr_Format(PyExc_AttributeError, "bpy_prop \"%.200s.%.200s\" is read-only", RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
- return 0;
+ return -1;
}
/* can ignore clamping here */
@@ -279,10 +519,10 @@ static int mathutils_rna_matrix_set(BaseMathObject *bmo, int UNUSED(subtype))
if(RNA_property_update_check(self->prop)) {
RNA_property_update(BPy_GetContext(), &self->ptr, self->prop);
}
- return 1;
+ return 0;
}
-static Mathutils_Callback mathutils_rna_matrix_cb = {
+static Mathutils_Callback mathutils_rna_matrix_cb= {
mathutils_rna_generic_check,
mathutils_rna_matrix_get,
mathutils_rna_matrix_set,
@@ -298,7 +538,7 @@ static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_
if(*prop_eul_order) {
short order= RNA_property_enum_get(ptr, *prop_eul_order);
- if (order >= ROT_MODE_XYZ && order <= ROT_MODE_ZYX) /* could be quat or axisangle */
+ if (order >= EULER_ORDER_XYZ && order <= EULER_ORDER_ZYX) /* could be quat or axisangle */
return order;
}
@@ -307,7 +547,9 @@ static short pyrna_rotation_euler_order_get(PointerRNA *ptr, PropertyRNA **prop_
#endif // USE_MATHUTILS
-#define PROP_ALL_VECTOR_SUBTYPES PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ_LENGTH
+/* note that PROP_NONE is included as a vector subtype. this is because its handy to
+ * have x/y access to fcurve keyframes and other fixed size float arrayas of length 2-4. */
+#define PROP_ALL_VECTOR_SUBTYPES PROP_COORDS: case PROP_TRANSLATION: case PROP_DIRECTION: case PROP_VELOCITY: case PROP_ACCELERATION: case PROP_XYZ: case PROP_XYZ_LENGTH
PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
{
@@ -327,11 +569,11 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
len= RNA_property_array_length(ptr, prop);
subtype= RNA_property_subtype(prop);
totdim= RNA_property_array_dimension(ptr, prop, NULL);
- is_thick = (flag & PROP_THICK_WRAP);
+ is_thick= (flag & PROP_THICK_WRAP);
if (totdim == 1 || (totdim == 2 && subtype == PROP_MATRIX)) {
if(!is_thick)
- ret = pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
+ ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
switch(RNA_property_subtype(prop)) {
case PROP_ALL_VECTOR_SUBTYPES:
@@ -377,14 +619,14 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
if(is_thick) {
/* attempt to get order, only needed for thick types since wrapped with update via callbacks */
PropertyRNA *prop_eul_order= NULL;
- short order= pyrna_rotation_euler_order_get(ptr, &prop_eul_order, ROT_MODE_XYZ);
+ short order= pyrna_rotation_euler_order_get(ptr, &prop_eul_order, EULER_ORDER_XYZ);
ret= newEulerObject(NULL, order, Py_NEW, NULL); // TODO, get order from RNA
RNA_property_float_get_array(ptr, prop, ((EulerObject *)ret)->eul);
}
else {
/* order will be updated from callback on use */
- PyObject *eul_cb= newEulerObject_cb(ret, ROT_MODE_XYZ, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_EUL); // TODO, get order from RNA
+ PyObject *eul_cb= newEulerObject_cb(ret, EULER_ORDER_XYZ, mathutils_rna_array_cb_index, MATHUTILS_CB_SUBTYPE_EUL); // TODO, get order from RNA
Py_DECREF(ret); /* the euler owns now */
ret= eul_cb; /* return the euler instead */
}
@@ -402,6 +644,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
}
break;
case PROP_COLOR:
+ case PROP_COLOR_GAMMA:
if(len==3) { /* color */
if(is_thick) {
ret= newColorObject(NULL, Py_NEW, NULL); // TODO, get order from RNA
@@ -422,9 +665,10 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
if(is_thick) {
/* this is an array we cant reference (since its not thin wrappable)
* and cannot be coerced into a mathutils type, so return as a list */
- ret = pyrna_prop_array_subscript_slice(NULL, ptr, prop, 0, len, len);
- } else {
- ret = pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
+ ret= pyrna_prop_array_subscript_slice(NULL, ptr, prop, 0, len, len);
+ }
+ else {
+ ret= pyrna_prop_CreatePyObject(ptr, prop); /* owned by the Mathutils PyObject */
}
}
#else // USE_MATHUTILS
@@ -435,7 +679,7 @@ PyObject *pyrna_math_object_from_array(PointerRNA *ptr, PropertyRNA *prop)
return ret;
}
-/* same as RNA_enum_value_from_id but raises an exception */
+/* same as RNA_enum_value_from_id but raises an exception */
int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int *value, const char *error_prefix)
{
if(RNA_enum_value_from_id(item, identifier, value) == 0) {
@@ -448,14 +692,14 @@ int pyrna_enum_value_from_id(EnumPropertyItem *item, const char *identifier, int
return 0;
}
-static int pyrna_struct_compare( BPy_StructRNA * a, BPy_StructRNA * b )
+static int pyrna_struct_compare(BPy_StructRNA *a, BPy_StructRNA *b)
{
return (a->ptr.data==b->ptr.data) ? 0 : -1;
}
-static int pyrna_prop_compare( BPy_PropertyRNA * a, BPy_PropertyRNA * b )
+static int pyrna_prop_compare(BPy_PropertyRNA *a, BPy_PropertyRNA *b)
{
- return (a->prop==b->prop && a->ptr.data==b->ptr.data ) ? 0 : -1;
+ return (a->prop==b->prop && a->ptr.data==b->ptr.data) ? 0 : -1;
}
static PyObject *pyrna_struct_richcmp(PyObject *a, PyObject *b, int op)
@@ -468,16 +712,16 @@ static PyObject *pyrna_struct_richcmp(PyObject *a, PyObject *b, int op)
switch (op) {
case Py_NE:
- ok = !ok; /* pass through */
+ ok= !ok; /* pass through */
case Py_EQ:
- res = ok ? Py_False : Py_True;
+ res= ok ? Py_False : Py_True;
break;
case Py_LT:
case Py_LE:
case Py_GT:
case Py_GE:
- res = Py_NotImplemented;
+ res= Py_NotImplemented;
break;
default:
PyErr_BadArgument();
@@ -497,16 +741,16 @@ static PyObject *pyrna_prop_richcmp(PyObject *a, PyObject *b, int op)
switch (op) {
case Py_NE:
- ok = !ok; /* pass through */
+ ok= !ok; /* pass through */
case Py_EQ:
- res = ok ? Py_False : Py_True;
+ res= ok ? Py_False : Py_True;
break;
case Py_LT:
case Py_LE:
case Py_GT:
case Py_GE:
- res = Py_NotImplemented;
+ res= Py_NotImplemented;
break;
default:
PyErr_BadArgument();
@@ -517,55 +761,63 @@ static PyObject *pyrna_prop_richcmp(PyObject *a, PyObject *b, int op)
}
/*----------------------repr--------------------------------------------*/
-static PyObject *pyrna_struct_str( BPy_StructRNA *self )
+static PyObject *pyrna_struct_str(BPy_StructRNA *self)
{
PyObject *ret;
const char *name;
+ if(!PYRNA_STRUCT_IS_VALID(self)) {
+ return PyUnicode_FromFormat("<bpy_struct, %.200s dead>", Py_TYPE(self)->tp_name);
+ }
+
/* print name if available */
name= RNA_struct_name_get_alloc(&self->ptr, NULL, FALSE);
if(name) {
- ret= PyUnicode_FromFormat( "<bpy_struct, %.200s(\"%.200s\")>", RNA_struct_identifier(self->ptr.type), name);
+ ret= PyUnicode_FromFormat("<bpy_struct, %.200s(\"%.200s\")>", RNA_struct_identifier(self->ptr.type), name);
MEM_freeN((void *)name);
return ret;
}
- return PyUnicode_FromFormat( "<bpy_struct, %.200s at %p>", RNA_struct_identifier(self->ptr.type), self->ptr.data);
+ return PyUnicode_FromFormat("<bpy_struct, %.200s at %p>", RNA_struct_identifier(self->ptr.type), self->ptr.data);
}
static PyObject *pyrna_struct_repr(BPy_StructRNA *self)
{
ID *id= self->ptr.id.data;
- if(id == NULL)
+ if(id == NULL || !PYRNA_STRUCT_IS_VALID(self))
return pyrna_struct_str(self); /* fallback */
if(RNA_struct_is_ID(self->ptr.type)) {
- return PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]", BKE_idcode_to_name_plural(GS(id->name)), id->name+2);
+ return PyUnicode_FromFormat("bpy.data.%s[\"%s\"]", BKE_idcode_to_name_plural(GS(id->name)), id->name+2);
}
else {
PyObject *ret;
const char *path;
path= RNA_path_from_ID_to_struct(&self->ptr);
if(path) {
- ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"].%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, path);
+ ret= PyUnicode_FromFormat("bpy.data.%s[\"%s\"].%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, path);
MEM_freeN((void *)path);
}
else { /* cant find, print something sane */
- ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]...%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, RNA_struct_identifier(self->ptr.type));
+ ret= PyUnicode_FromFormat("bpy.data.%s[\"%s\"]...%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, RNA_struct_identifier(self->ptr.type));
}
return ret;
}
}
-static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
+static PyObject *pyrna_prop_str(BPy_PropertyRNA *self)
{
PyObject *ret;
PointerRNA ptr;
const char *name;
const char *type_id= NULL;
char type_fmt[64]= "";
- int type= RNA_property_type(self->prop);
+ int type;
+
+ PYRNA_PROP_CHECK_OBJ(self)
+
+ type= RNA_property_type(self->prop);
if(RNA_enum_id_from_value(property_type_items, type, &type_id)==0) {
PyErr_SetString(PyExc_RuntimeError, "could not use property type, internal error"); /* should never happen */
@@ -573,14 +825,15 @@ static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
}
else {
/* this should never fail */
- int len = -1;
+ int len= -1;
char *c= type_fmt;
- while ( (*c++= tolower(*type_id++)) ) {} ;
+ while ((*c++= tolower(*type_id++))) {} ;
if(type==PROP_COLLECTION) {
len= pyrna_prop_collection_length(self);
- } else if (RNA_property_array_check(&self->ptr, self->prop)) {
+ }
+ else if (RNA_property_array_check(&self->ptr, self->prop)) {
len= pyrna_prop_array_length((BPy_PropertyArrayRNA *)self);
}
@@ -594,7 +847,7 @@ static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
name= RNA_struct_name_get_alloc(&ptr, NULL, FALSE);
if(name) {
- ret= PyUnicode_FromFormat( "<bpy_%.200s, %.200s.%.200s(\"%.200s\")>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop), name);
+ ret= PyUnicode_FromFormat("<bpy_%.200s, %.200s.%.200s(\"%.200s\")>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop), name);
MEM_freeN((void *)name);
return ret;
}
@@ -602,35 +855,37 @@ static PyObject *pyrna_prop_str( BPy_PropertyRNA *self )
if(RNA_property_type(self->prop) == PROP_COLLECTION) {
PointerRNA r_ptr;
if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
- return PyUnicode_FromFormat( "<bpy_%.200s, %.200s>", type_fmt, RNA_struct_identifier(r_ptr.type));
+ return PyUnicode_FromFormat("<bpy_%.200s, %.200s>", type_fmt, RNA_struct_identifier(r_ptr.type));
}
}
- return PyUnicode_FromFormat( "<bpy_%.200s, %.200s.%.200s>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
+ return PyUnicode_FromFormat("<bpy_%.200s, %.200s.%.200s>", type_fmt, RNA_struct_identifier(self->ptr.type), RNA_property_identifier(self->prop));
}
static PyObject *pyrna_prop_repr(BPy_PropertyRNA *self)
{
- ID *id= self->ptr.id.data;
+ ID *id;
PyObject *ret;
const char *path;
- if(id == NULL)
+ PYRNA_PROP_CHECK_OBJ(self)
+
+ if((id= self->ptr.id.data) == NULL)
return pyrna_prop_str(self); /* fallback */
path= RNA_path_from_ID_to_property(&self->ptr, self->prop);
if(path) {
- ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"].%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, path);
+ ret= PyUnicode_FromFormat("bpy.data.%s[\"%s\"].%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, path);
MEM_freeN((void *)path);
}
else { /* cant find, print something sane */
- ret= PyUnicode_FromFormat( "bpy.data.%s[\"%s\"]...%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, RNA_property_identifier(self->prop));
+ ret= PyUnicode_FromFormat("bpy.data.%s[\"%s\"]...%s", BKE_idcode_to_name_plural(GS(id->name)), id->name+2, RNA_property_identifier(self->prop));
}
return ret;
}
-static long pyrna_struct_hash( BPy_StructRNA *self )
+static long pyrna_struct_hash(BPy_StructRNA *self)
{
return _Py_HashPointer(self->ptr.data);
}
@@ -638,23 +893,37 @@ static long pyrna_struct_hash( BPy_StructRNA *self )
/* from python's meth_hash v3.1.2 */
static long pyrna_prop_hash(BPy_PropertyRNA *self)
{
- long x,y;
+ long x, y;
if (self->ptr.data == NULL)
- x = 0;
+ x= 0;
else {
- x = _Py_HashPointer(self->ptr.data);
+ x= _Py_HashPointer(self->ptr.data);
if (x == -1)
return -1;
}
- y = _Py_HashPointer((void*)(self->prop));
+ y= _Py_HashPointer((void*)(self->prop));
if (y == -1)
return -1;
x ^= y;
if (x == -1)
- x = -2;
+ x= -2;
return x;
}
+#ifdef USE_PYRNA_STRUCT_REFERENCE
+static int pyrna_struct_traverse(BPy_StructRNA *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->reference);
+ return 0;
+}
+
+static int pyrna_struct_clear(BPy_StructRNA *self)
+{
+ Py_CLEAR(self->reference);
+ return 0;
+}
+#endif /* !USE_PYRNA_STRUCT_REFERENCE */
+
/* use our own dealloc so we can free a property if we use one */
static void pyrna_struct_dealloc(BPy_StructRNA *self)
{
@@ -665,21 +934,45 @@ static void pyrna_struct_dealloc(BPy_StructRNA *self)
}
#ifdef USE_WEAKREFS
- if (self->in_weakreflist != NULL) {
- PyObject_ClearWeakRefs((PyObject *)self);
+ if (self->in_weakreflist != NULL) {
+ PyObject_ClearWeakRefs((PyObject *)self);
}
#endif
+#ifdef USE_PYRNA_STRUCT_REFERENCE
+ if(self->reference) {
+ PyObject_GC_UnTrack(self);
+ pyrna_struct_clear(self);
+ }
+#endif /* !USE_PYRNA_STRUCT_REFERENCE */
+
/* Note, for subclassed PyObjects we cant just call PyObject_DEL() directly or it will crash */
Py_TYPE(self)->tp_free(self);
}
+#ifdef USE_PYRNA_STRUCT_REFERENCE
+static void pyrna_struct_reference_set(BPy_StructRNA *self, PyObject *reference)
+{
+ if(self->reference) {
+// PyObject_GC_UnTrack(self); /* INITIALIZED TRACKED? */
+ pyrna_struct_clear(self);
+ }
+ /* reference is now NULL */
+
+ if(reference) {
+ self->reference= reference;
+ Py_INCREF(reference);
+// PyObject_GC_Track(self); /* INITIALIZED TRACKED? */
+ }
+}
+#endif /* !USE_PYRNA_STRUCT_REFERENCE */
+
/* use our own dealloc so we can free a property if we use one */
static void pyrna_prop_dealloc(BPy_PropertyRNA *self)
{
#ifdef USE_WEAKREFS
- if (self->in_weakreflist != NULL) {
- PyObject_ClearWeakRefs((PyObject *)self);
+ if (self->in_weakreflist != NULL) {
+ PyObject_ClearWeakRefs((PyObject *)self);
}
#endif
/* Note, for subclassed PyObjects we cant just call PyObject_DEL() directly or it will crash */
@@ -689,8 +982,8 @@ static void pyrna_prop_dealloc(BPy_PropertyRNA *self)
static void pyrna_prop_array_dealloc(BPy_PropertyRNA *self)
{
#ifdef USE_WEAKREFS
- if (self->in_weakreflist != NULL) {
- PyObject_ClearWeakRefs((PyObject *)self);
+ if (self->in_weakreflist != NULL) {
+ PyObject_ClearWeakRefs((PyObject *)self);
}
#endif
/* Note, for subclassed PyObjects we cant just call PyObject_DEL() directly or it will crash */
@@ -727,11 +1020,12 @@ static int pyrna_string_to_enum(PyObject *item, PointerRNA *ptr, PropertyRNA *pr
PyErr_Format(PyExc_TypeError, "%.200s expected a string enum type in (%.200s)", error_prefix, enum_str);
MEM_freeN((void *)enum_str);
return 0;
- } else {
+ }
+ else {
/* hack so that dynamic enums used for operator properties will be able to be built (i.e. context will be supplied to itemf)
* and thus running defining operator buttons for such operators in UI will work */
- RNA_def_property_clear_flag(prop, PROP_ENUM_NO_CONTEXT);
-
+ RNA_def_property_clear_flag(prop, PROP_ENUM_NO_CONTEXT);
+
if (!RNA_property_enum_value(BPy_GetContext(), ptr, prop, param, val)) {
const char *enum_str= pyrna_enum_as_string(ptr, prop);
PyErr_Format(PyExc_TypeError, "%.200s enum \"%.200s\" not found in (%.200s)", error_prefix, param, enum_str);
@@ -749,9 +1043,9 @@ int pyrna_set_to_enum_bitfield(EnumPropertyItem *items, PyObject *value, int *r_
int ret, flag= 0;
/* set looping */
- Py_ssize_t pos = 0;
+ Py_ssize_t pos= 0;
+ Py_ssize_t hash= 0;
PyObject *key;
- long hash;
*r_value= 0;
@@ -842,8 +1136,9 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
else {
const char *identifier;
if (RNA_property_enum_identifier(BPy_GetContext(), ptr, prop, val, &identifier)) {
- ret = PyUnicode_FromString(identifier);
- } else {
+ ret= PyUnicode_FromString(identifier);
+ }
+ else {
EnumPropertyItem *enum_item;
int free= FALSE;
@@ -859,7 +1154,7 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
/* prefer not fail silently incase of api errors, maybe disable it later */
printf("RNA Warning: Current value \"%d\" matches no enum in '%s', '%s', '%s'\n", val, RNA_struct_identifier(ptr->type), ptr_name, RNA_property_identifier(prop));
-#if 0 // gives python decoding errors while generating docs :(
+#if 0 // gives python decoding errors while generating docs :(
char error_str[256];
snprintf(error_str, sizeof(error_str), "RNA Warning: Current value \"%d\" matches no enum in '%s', '%s', '%s'", val, RNA_struct_identifier(ptr->type), ptr_name, RNA_property_identifier(prop));
PyErr_Warn(PyExc_RuntimeWarning, error_str);
@@ -868,14 +1163,14 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
if(ptr_name)
MEM_freeN((void *)ptr_name);
- ret = PyUnicode_FromString("");
+ ret= PyUnicode_FromString("");
}
if(free)
MEM_freeN(enum_item);
/*PyErr_Format(PyExc_AttributeError, "RNA Error: Current value \"%d\" matches no enum", val);
- ret = NULL;*/
+ ret= NULL;*/
}
}
@@ -885,7 +1180,7 @@ static PyObject *pyrna_enum_to_py(PointerRNA *ptr, PropertyRNA *prop, int val)
PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
{
PyObject *ret;
- int type = RNA_property_type(prop);
+ int type= RNA_property_type(prop);
if (RNA_property_array_check(ptr, prop)) {
return pyrna_py_from_array(ptr, prop);
@@ -894,19 +1189,19 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
/* see if we can coorce into a python type - PropertyType */
switch (type) {
case PROP_BOOLEAN:
- ret = PyBool_FromLong( RNA_property_boolean_get(ptr, prop) );
+ ret= PyBool_FromLong(RNA_property_boolean_get(ptr, prop));
break;
case PROP_INT:
- ret = PyLong_FromSsize_t( (Py_ssize_t)RNA_property_int_get(ptr, prop) );
+ ret= PyLong_FromSsize_t((Py_ssize_t)RNA_property_int_get(ptr, prop));
break;
case PROP_FLOAT:
- ret = PyFloat_FromDouble( RNA_property_float_get(ptr, prop) );
+ ret= PyFloat_FromDouble(RNA_property_float_get(ptr, prop));
break;
case PROP_STRING:
{
int subtype= RNA_property_subtype(prop);
const char *buf;
- buf = RNA_property_string_get_alloc(ptr, prop, NULL, -1);
+ buf= RNA_property_string_get_alloc(ptr, prop, NULL, -1);
#ifdef USE_STRING_COERCE
/* only file paths get special treatment, they may contain non utf-8 chars */
if(ELEM3(subtype, PROP_FILEPATH, PROP_DIRPATH, PROP_FILENAME)) {
@@ -931,19 +1226,20 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
PointerRNA newptr;
newptr= RNA_property_pointer_get(ptr, prop);
if (newptr.data) {
- ret = pyrna_struct_CreatePyObject(&newptr);
- } else {
- ret = Py_None;
+ ret= pyrna_struct_CreatePyObject(&newptr);
+ }
+ else {
+ ret= Py_None;
Py_INCREF(ret);
}
break;
}
case PROP_COLLECTION:
- ret = pyrna_prop_CreatePyObject(ptr, prop);
+ ret= pyrna_prop_CreatePyObject(ptr, prop);
break;
default:
PyErr_Format(PyExc_TypeError, "bpy_struct internal error: unknown type '%d' (pyrna_prop_to_py)", type);
- ret = NULL;
+ ret= NULL;
break;
}
@@ -954,12 +1250,12 @@ PyObject * pyrna_prop_to_py(PointerRNA *ptr, PropertyRNA *prop)
* Its takes keyword args and fills them with property values */
int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const char *error_prefix)
{
- int error_val = 0;
+ int error_val= 0;
int totkw;
const char *arg_name= NULL;
PyObject *item;
- totkw = kw ? PyDict_Size(kw):0;
+ totkw= kw ? PyDict_Size(kw):0;
RNA_STRUCT_BEGIN(ptr, prop) {
arg_name= RNA_property_identifier(prop);
@@ -977,10 +1273,11 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
if (item == NULL) {
if(all_args) {
PyErr_Format(PyExc_TypeError, "%.200s: keyword \"%.200s\" missing", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
- error_val = -1; /* pyrna_py_to_prop sets the error */
+ error_val= -1; /* pyrna_py_to_prop sets the error */
break;
}
- } else {
+ }
+ else {
if (pyrna_py_to_prop(ptr, prop, NULL, item, error_prefix)) {
error_val= -1;
break;
@@ -992,7 +1289,7 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
if (error_val==0 && totkw > 0) { /* some keywords were given that were not used :/ */
PyObject *key, *value;
- Py_ssize_t pos = 0;
+ Py_ssize_t pos= 0;
while (PyDict_Next(kw, &pos, &key, &value)) {
arg_name= _PyUnicode_AsString(key);
@@ -1001,7 +1298,7 @@ int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, int all_args, const cha
}
PyErr_Format(PyExc_TypeError, "%.200s: keyword \"%.200s\" unrecognized", error_prefix, arg_name ? arg_name : "<UNKNOWN>");
- error_val = -1;
+ error_val= -1;
}
return error_val;
@@ -1011,7 +1308,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw);
static PyObject *pyrna_func_to_py(BPy_DummyPointerRNA *pyrna, FunctionRNA *func)
{
- static PyMethodDef func_meth = {"<generic rna function>", (PyCFunction)pyrna_func_call, METH_VARARGS|METH_KEYWORDS, "python rna function"};
+ static PyMethodDef func_meth= {"<generic rna function>", (PyCFunction)pyrna_func_call, METH_VARARGS|METH_KEYWORDS, "python rna function"};
PyObject *self;
PyObject *ret;
@@ -1038,7 +1335,7 @@ static PyObject *pyrna_func_to_py(BPy_DummyPointerRNA *pyrna, FunctionRNA *func)
static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyObject *value, const char *error_prefix)
{
/* XXX hard limits should be checked here */
- int type = RNA_property_type(prop);
+ int type= RNA_property_type(prop);
if (RNA_property_array_check(ptr, prop)) {
@@ -1063,14 +1360,15 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
* however so many poll functions return None or a valid Object.
* its a hassle to convert these into a bool before returning, */
if(RNA_property_flag(prop) & PROP_OUTPUT)
- param = PyObject_IsTrue( value );
+ param= PyObject_IsTrue(value);
else
- param = PyLong_AsLong( value );
+ param= PyLong_AsLong(value);
if(param < 0) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected True/False or 0/1, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
return -1;
- } else {
+ }
+ else {
if(data) *((int*)data)= param;
else RNA_property_boolean_set(ptr, prop, param);
}
@@ -1087,7 +1385,8 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
else if (param==-1 && PyErr_Occurred()) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected an int type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
return -1;
- } else {
+ }
+ else {
int param_i= (int)param;
RNA_property_int_clamp(ptr, prop, &param_i);
if(data) *((int*)data)= param_i;
@@ -1097,11 +1396,12 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
}
case PROP_FLOAT:
{
- float param = PyFloat_AsDouble(value);
+ float param= PyFloat_AsDouble(value);
if (PyErr_Occurred()) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a float type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), Py_TYPE(value)->tp_name);
return -1;
- } else {
+ }
+ else {
RNA_property_float_clamp(ptr, prop, (float *)&param);
if(data) *((float*)data)= param;
else RNA_property_float_set(ptr, prop, param);
@@ -1174,7 +1474,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
PyObject *value_new= NULL;
StructRNA *ptr_type= RNA_property_pointer_type(ptr, prop);
- int flag = RNA_property_flag(prop);
+ int flag= RNA_property_flag(prop);
/* this is really nasty!, so we can fake the operator having direct properties eg:
* layout.prop(self, "filepath")
@@ -1198,7 +1498,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
/* if property is an OperatorProperties pointer and value is a map, forward back to pyrna_pydict_to_props */
if (RNA_struct_is_a(ptr_type, &RNA_OperatorProperties) && PyDict_Check(value)) {
- PointerRNA opptr = RNA_property_pointer_get(ptr, prop);
+ PointerRNA opptr= RNA_property_pointer_get(ptr, prop);
return pyrna_pydict_to_props(&opptr, value, 0, error_prefix);
}
@@ -1219,13 +1519,16 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
if(!BPy_StructRNA_Check(value) && value != Py_None) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s expected a %.200s type, not %.200s", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptr_type), Py_TYPE(value)->tp_name);
Py_XDECREF(value_new); return -1;
- } else if((flag & PROP_NEVER_NULL) && value == Py_None) {
+ }
+ else if((flag & PROP_NEVER_NULL) && value == Py_None) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s does not support a 'None' assignment %.200s type", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop), RNA_struct_identifier(ptr_type));
Py_XDECREF(value_new); return -1;
- } else if(value != Py_None && ((flag & PROP_ID_SELF_CHECK) && ptr->id.data == ((BPy_StructRNA*)value)->ptr.id.data)) {
+ }
+ else if(value != Py_None && ((flag & PROP_ID_SELF_CHECK) && ptr->id.data == ((BPy_StructRNA*)value)->ptr.id.data)) {
PyErr_Format(PyExc_TypeError, "%.200s %.200s.%.200s ID type does not support assignment to its self", error_prefix, RNA_struct_identifier(ptr->type), RNA_property_identifier(prop));
Py_XDECREF(value_new); return -1;
- } else {
+ }
+ else {
BPy_StructRNA *param= (BPy_StructRNA*)value;
int raise_error= FALSE;
if(data) {
@@ -1291,7 +1594,7 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
return -1;
}
- seq_len = PySequence_Size(value);
+ seq_len= PySequence_Size(value);
for(i=0; i<seq_len; i++) {
item= PySequence_GetItem(value, i);
@@ -1345,14 +1648,15 @@ static int pyrna_py_to_prop(PointerRNA *ptr, PropertyRNA *prop, void *data, PyOb
return 0;
}
-static PyObject * pyrna_prop_array_to_py_index(BPy_PropertyArrayRNA *self, int index)
+static PyObject *pyrna_prop_array_to_py_index(BPy_PropertyArrayRNA *self, int index)
{
+ PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self)
return pyrna_py_from_array_index(self, &self->ptr, self->prop, index);
}
static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, PyObject *value)
{
- int ret = 0;
+ int ret= 0;
PointerRNA *ptr= &self->ptr;
PropertyRNA *prop= self->prop;
@@ -1370,23 +1674,25 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
switch (RNA_property_type(prop)) {
case PROP_BOOLEAN:
{
- int param = PyLong_AsLong( value );
+ int param= PyLong_AsLong(value);
- if( param < 0 || param > 1) {
+ if(param < 0 || param > 1) {
PyErr_SetString(PyExc_TypeError, "expected True/False or 0/1");
- ret = -1;
- } else {
+ ret= -1;
+ }
+ else {
RNA_property_boolean_set_index(ptr, prop, index, param);
}
break;
}
case PROP_INT:
{
- int param = PyLong_AsLong(value);
+ int param= PyLong_AsLong(value);
if (param==-1 && PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError, "expected an int type");
- ret = -1;
- } else {
+ ret= -1;
+ }
+ else {
RNA_property_int_clamp(ptr, prop, &param);
RNA_property_int_set_index(ptr, prop, index, param);
}
@@ -1394,11 +1700,12 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
case PROP_FLOAT:
{
- float param = PyFloat_AsDouble(value);
+ float param= PyFloat_AsDouble(value);
if (PyErr_Occurred()) {
PyErr_SetString(PyExc_TypeError, "expected a float type");
- ret = -1;
- } else {
+ ret= -1;
+ }
+ else {
RNA_property_float_clamp(ptr, prop, &param);
RNA_property_float_set_index(ptr, prop, index, param);
}
@@ -1406,7 +1713,7 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
}
default:
PyErr_SetString(PyExc_AttributeError, "not an array type");
- ret = -1;
+ ret= -1;
break;
}
}
@@ -1422,14 +1729,18 @@ static int pyrna_py_to_prop_array_index(BPy_PropertyArrayRNA *self, int index, P
//---------------sequence-------------------------------------------
static Py_ssize_t pyrna_prop_array_length(BPy_PropertyArrayRNA *self)
{
+ PYRNA_PROP_CHECK_INT((BPy_PropertyRNA *)self)
+
if (RNA_property_array_dimension(&self->ptr, self->prop, NULL) > 1)
return RNA_property_multi_array_length(&self->ptr, self->prop, self->arraydim);
else
return RNA_property_array_length(&self->ptr, self->prop);
}
-static Py_ssize_t pyrna_prop_collection_length( BPy_PropertyRNA *self )
+static Py_ssize_t pyrna_prop_collection_length(BPy_PropertyRNA *self)
{
+ PYRNA_PROP_CHECK_INT(self)
+
return RNA_property_collection_length(&self->ptr, self->prop);
}
@@ -1437,17 +1748,21 @@ static Py_ssize_t pyrna_prop_collection_length( BPy_PropertyRNA *self )
* of 1000's of items in a linked list for eg. */
static int pyrna_prop_array_bool(BPy_PropertyRNA *self)
{
+ PYRNA_PROP_CHECK_INT(self)
+
return RNA_property_array_length(&self->ptr, self->prop) ? 1 : 0;
}
-static int pyrna_prop_collection_bool( BPy_PropertyRNA *self )
+static int pyrna_prop_collection_bool(BPy_PropertyRNA *self)
{
/* no callback defined, just iterate and find the nth item */
CollectionPropertyIterator iter;
int test;
+ PYRNA_PROP_CHECK_INT(self)
+
RNA_property_collection_begin(&self->ptr, self->prop, &iter);
- test = iter.valid;
+ test= iter.valid;
RNA_property_collection_end(&iter);
return test;
}
@@ -1458,6 +1773,8 @@ static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_s
PointerRNA newptr;
Py_ssize_t keynum_abs= keynum;
+ PYRNA_PROP_CHECK_OBJ(self)
+
/* notice getting the length of the collection is avoided unless negative index is used
* or to detect internal error with a valid index.
* This is done for faster lookups. */
@@ -1488,7 +1805,11 @@ static PyObject *pyrna_prop_collection_subscript_int(BPy_PropertyRNA *self, Py_s
static PyObject *pyrna_prop_array_subscript_int(BPy_PropertyArrayRNA *self, int keynum)
{
- int len= pyrna_prop_array_length(self);
+ int len;
+
+ PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self)
+
+ len= pyrna_prop_array_length(self);
if(keynum < 0) keynum += len;
@@ -1502,6 +1823,9 @@ static PyObject *pyrna_prop_array_subscript_int(BPy_PropertyArrayRNA *self, int
static PyObject *pyrna_prop_collection_subscript_str(BPy_PropertyRNA *self, const char *keyname)
{
PointerRNA newptr;
+
+ PYRNA_PROP_CHECK_OBJ(self)
+
if(RNA_property_collection_lookup_string(&self->ptr, self->prop, keyname, &newptr))
return pyrna_struct_CreatePyObject(&newptr);
@@ -1512,13 +1836,17 @@ static PyObject *pyrna_prop_collection_subscript_str(BPy_PropertyRNA *self, cons
static PyObject *pyrna_prop_collection_subscript_slice(BPy_PropertyRNA *self, Py_ssize_t start, Py_ssize_t stop)
{
+ CollectionPropertyIterator rna_macro_iter;
int count= 0;
- PyObject *list= PyList_New(0);
+ PyObject *list;
PyObject *item;
+ PYRNA_PROP_CHECK_OBJ(self)
+
+ list= PyList_New(0);
+
/* first loop up-until the start */
- CollectionPropertyIterator rna_macro_iter;
for(RNA_property_collection_begin(&self->ptr, self->prop, &rna_macro_iter); rna_macro_iter.valid; RNA_property_collection_next(&rna_macro_iter)) {
/* PointerRNA itemptr= rna_macro_iter.ptr; */
if(count == start) {
@@ -1551,13 +1879,18 @@ static PyObject *pyrna_prop_collection_subscript_slice(BPy_PropertyRNA *self, Py
static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, PointerRNA *ptr, PropertyRNA *prop, Py_ssize_t start, Py_ssize_t stop, Py_ssize_t length)
{
int count, totdim;
+ PyObject *tuple;
+
+ PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self)
- PyObject *tuple= PyTuple_New(stop - start);
+ tuple= PyTuple_New(stop - start);
- totdim = RNA_property_array_dimension(ptr, prop, NULL);
+ /* PYRNA_PROP_CHECK_OBJ(self) isnt needed, internal use only */
+
+ totdim= RNA_property_array_dimension(ptr, prop, NULL);
if (totdim > 1) {
- for (count = start; count < stop; count++)
+ for (count= start; count < stop; count++)
PyTuple_SET_ITEM(tuple, count - start, pyrna_prop_array_to_py_index(self, count));
}
else {
@@ -1623,11 +1956,13 @@ static PyObject *pyrna_prop_array_subscript_slice(BPy_PropertyArrayRNA *self, Po
static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject *key)
{
+ PYRNA_PROP_CHECK_OBJ(self)
+
if (PyUnicode_Check(key)) {
return pyrna_prop_collection_subscript_str(self, _PyUnicode_AsString(key));
}
else if (PyIndex_Check(key)) {
- Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
+ Py_ssize_t i= PyNumber_AsSsize_t(key, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
return NULL;
@@ -1677,11 +2012,14 @@ static PyObject *pyrna_prop_collection_subscript(BPy_PropertyRNA *self, PyObject
static PyObject *pyrna_prop_array_subscript(BPy_PropertyArrayRNA *self, PyObject *key)
{
+ PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self)
+
/*if (PyUnicode_Check(key)) {
return pyrna_prop_array_subscript_str(self, _PyUnicode_AsString(key));
- } else*/
+ }
+ else */
if (PyIndex_Check(key)) {
- Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
+ Py_ssize_t i= PyNumber_AsSsize_t(key, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
return NULL;
return pyrna_prop_array_subscript_int(self, PyLong_AsLong(key));
@@ -1732,17 +2070,17 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
int ret= 0;
if(value_orig == NULL) {
- PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice] = value: deleting with list types is not supported by bpy_struct");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice]= value: deleting with list types is not supported by bpy_struct");
return -1;
}
- if(!(value=PySequence_Fast(value_orig, "bpy_prop_array[slice] = value: assignment is not a sequence type"))) {
+ if(!(value=PySequence_Fast(value_orig, "bpy_prop_array[slice]= value: assignment is not a sequence type"))) {
return -1;
}
if(PySequence_Fast_GET_SIZE(value) != stop-start) {
Py_DECREF(value);
- PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice] = value: resizing bpy_struct arrays isn't supported");
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_array[slice]= value: resizing bpy_struct arrays isn't supported");
return -1;
}
@@ -1761,9 +2099,9 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
RNA_property_float_get_array(ptr, prop, values);
for(count=start; count<stop; count++) {
- fval = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, count-start));
+ fval= PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value, count-start));
CLAMP(fval, min, max);
- values[count] = fval;
+ values[count]= fval;
}
if(PyErr_Occurred()) ret= -1;
@@ -1781,7 +2119,7 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
RNA_property_boolean_get_array(ptr, prop, values);
for(count=start; count<stop; count++)
- values[count] = PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
+ values[count]= PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
if(PyErr_Occurred()) ret= -1;
else RNA_property_boolean_set_array(ptr, prop, values);
@@ -1802,9 +2140,9 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
RNA_property_int_get_array(ptr, prop, values);
for(count=start; count<stop; count++) {
- ival = PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
+ ival= PyLong_AsLong(PySequence_Fast_GET_ITEM(value, count-start));
CLAMP(ival, min, max);
- values[count] = ival;
+ values[count]= ival;
}
if(PyErr_Occurred()) ret= -1;
@@ -1828,29 +2166,35 @@ static int prop_subscript_ass_array_slice(PointerRNA *ptr, PropertyRNA *prop, in
static int prop_subscript_ass_array_int(BPy_PropertyArrayRNA *self, Py_ssize_t keynum, PyObject *value)
{
- int len= pyrna_prop_array_length(self);
+ int len;
+
+ PYRNA_PROP_CHECK_INT((BPy_PropertyRNA *)self)
+
+ len= pyrna_prop_array_length(self);
if(keynum < 0) keynum += len;
if(keynum >= 0 && keynum < len)
return pyrna_py_to_prop_array_index(self, keynum, value);
- PyErr_SetString(PyExc_IndexError, "bpy_prop_array[index] = value: index out of range");
+ PyErr_SetString(PyExc_IndexError, "bpy_prop_array[index]= value: index out of range");
return -1;
}
-static int pyrna_prop_array_ass_subscript( BPy_PropertyArrayRNA *self, PyObject *key, PyObject *value )
+static int pyrna_prop_array_ass_subscript(BPy_PropertyArrayRNA *self, PyObject *key, PyObject *value)
{
- /* char *keyname = NULL; */ /* not supported yet */
+ /* char *keyname= NULL; */ /* not supported yet */
int ret= -1;
+ PYRNA_PROP_CHECK_INT((BPy_PropertyRNA *)self)
+
if (!RNA_property_editable_flag(&self->ptr, self->prop)) {
- PyErr_Format(PyExc_AttributeError, "bpy_prop_collection: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(self->prop), RNA_struct_identifier(self->ptr.type) );
+ PyErr_Format(PyExc_AttributeError, "bpy_prop_collection: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(self->prop), RNA_struct_identifier(self->ptr.type));
ret= -1;
}
else if (PyIndex_Check(key)) {
- Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
+ Py_ssize_t i= PyNumber_AsSsize_t(key, PyExc_IndexError);
if (i == -1 && PyErr_Occurred()) {
ret= -1;
}
@@ -1891,20 +2235,20 @@ static int pyrna_prop_array_ass_subscript( BPy_PropertyArrayRNA *self, PyObject
}
/* for slice only */
-static PyMappingMethods pyrna_prop_array_as_mapping = {
- ( lenfunc ) pyrna_prop_array_length, /* mp_length */
- ( binaryfunc ) pyrna_prop_array_subscript, /* mp_subscript */
- ( objobjargproc ) pyrna_prop_array_ass_subscript, /* mp_ass_subscript */
+static PyMappingMethods pyrna_prop_array_as_mapping= {
+ (lenfunc) pyrna_prop_array_length, /* mp_length */
+ (binaryfunc) pyrna_prop_array_subscript, /* mp_subscript */
+ (objobjargproc) pyrna_prop_array_ass_subscript, /* mp_ass_subscript */
};
-static PyMappingMethods pyrna_prop_collection_as_mapping = {
- ( lenfunc ) pyrna_prop_collection_length, /* mp_length */
- ( binaryfunc ) pyrna_prop_collection_subscript, /* mp_subscript */
- ( objobjargproc ) NULL, /* mp_ass_subscript */
+static PyMappingMethods pyrna_prop_collection_as_mapping= {
+ (lenfunc) pyrna_prop_collection_length, /* mp_length */
+ (binaryfunc) pyrna_prop_collection_subscript, /* mp_subscript */
+ (objobjargproc) NULL, /* mp_ass_subscript */
};
/* only for fast bool's, large structs, assign nb_bool on init */
-static PyNumberMethods pyrna_prop_array_as_number = {
+static PyNumberMethods pyrna_prop_array_as_number= {
NULL, /* nb_add */
NULL, /* nb_subtract */
NULL, /* nb_multiply */
@@ -1916,7 +2260,7 @@ static PyNumberMethods pyrna_prop_array_as_number = {
NULL, /* nb_absolute */
(inquiry) pyrna_prop_array_bool, /* nb_bool */
};
-static PyNumberMethods pyrna_prop_collection_as_number = {
+static PyNumberMethods pyrna_prop_collection_as_number= {
NULL, /* nb_add */
NULL, /* nb_subtract */
NULL, /* nb_multiply */
@@ -1939,7 +2283,7 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *value
PointerRNA newptr; /* not used, just so RNA_property_collection_lookup_string runs */
/* key in dict style check */
- const char *keyname = _PyUnicode_AsString(value);
+ const char *keyname= _PyUnicode_AsString(value);
if(keyname==NULL) {
PyErr_SetString(PyExc_TypeError, "bpy_prop_collection.__contains__: expected a string");
@@ -1955,7 +2299,9 @@ static int pyrna_prop_collection_contains(BPy_PropertyRNA *self, PyObject *value
static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
{
IDProperty *group;
- const char *name = _PyUnicode_AsString(value);
+ const char *name= _PyUnicode_AsString(value);
+
+ PYRNA_STRUCT_CHECK_INT(self)
if (!name) {
PyErr_SetString(PyExc_TypeError, "bpy_struct.__contains__: expected a string");
@@ -1975,7 +2321,7 @@ static int pyrna_struct_contains(BPy_StructRNA *self, PyObject *value)
return IDP_GetPropertyFromGroup(group, name) ? 1:0;
}
-static PySequenceMethods pyrna_prop_array_as_sequence = {
+static PySequenceMethods pyrna_prop_array_as_sequence= {
(lenfunc)pyrna_prop_array_length, /* Cant set the len otherwise it can evaluate as false */
NULL, /* sq_concat */
NULL, /* sq_repeat */
@@ -1988,7 +2334,7 @@ static PySequenceMethods pyrna_prop_array_as_sequence = {
(ssizeargfunc) NULL, /* sq_inplace_repeat */
};
-static PySequenceMethods pyrna_prop_collection_as_sequence = {
+static PySequenceMethods pyrna_prop_collection_as_sequence= {
(lenfunc)pyrna_prop_collection_length, /* Cant set the len otherwise it can evaluate as false */
NULL, /* sq_concat */
NULL, /* sq_repeat */
@@ -2001,7 +2347,7 @@ static PySequenceMethods pyrna_prop_collection_as_sequence = {
(ssizeargfunc) NULL, /* sq_inplace_repeat */
};
-static PySequenceMethods pyrna_struct_as_sequence = {
+static PySequenceMethods pyrna_struct_as_sequence= {
NULL, /* Cant set the len otherwise it can evaluate as false */
NULL, /* sq_concat */
NULL, /* sq_repeat */
@@ -2014,12 +2360,14 @@ static PySequenceMethods pyrna_struct_as_sequence = {
(ssizeargfunc) NULL, /* sq_inplace_repeat */
};
-static PyObject *pyrna_struct_subscript( BPy_StructRNA *self, PyObject *key )
+static PyObject *pyrna_struct_subscript(BPy_StructRNA *self, PyObject *key)
{
/* mostly copied from BPy_IDGroup_Map_GetItem */
IDProperty *group, *idprop;
const char *name= _PyUnicode_AsString(key);
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
if(RNA_struct_idprops_check(self->ptr.type)==0) {
PyErr_SetString(PyExc_TypeError, "this type doesn't support IDProperties");
return NULL;
@@ -2047,9 +2395,13 @@ static PyObject *pyrna_struct_subscript( BPy_StructRNA *self, PyObject *key )
return BPy_IDGroup_WrapData(self->ptr.id.data, idprop);
}
-static int pyrna_struct_ass_subscript( BPy_StructRNA *self, PyObject *key, PyObject *value )
+static int pyrna_struct_ass_subscript(BPy_StructRNA *self, PyObject *key, PyObject *value)
{
- IDProperty *group= RNA_struct_idprops(&self->ptr, 1);
+ IDProperty *group;
+
+ PYRNA_STRUCT_CHECK_INT(self)
+
+ group= RNA_struct_idprops(&self->ptr, 1);
#ifdef USE_PEDANTIC_WRITE
if(rna_disallow_writes && rna_id_write_error(&self->ptr, key)) {
@@ -2058,17 +2410,17 @@ static int pyrna_struct_ass_subscript( BPy_StructRNA *self, PyObject *key, PyObj
#endif // USE_STRING_COERCE
if(group==NULL) {
- PyErr_SetString(PyExc_TypeError, "bpy_struct[key] = val: id properties not supported for this type");
+ PyErr_SetString(PyExc_TypeError, "bpy_struct[key]= val: id properties not supported for this type");
return -1;
}
return BPy_Wrap_SetMapItem(group, key, value);
}
-static PyMappingMethods pyrna_struct_as_mapping = {
- ( lenfunc ) NULL, /* mp_length */
- ( binaryfunc ) pyrna_struct_subscript, /* mp_subscript */
- ( objobjargproc ) pyrna_struct_ass_subscript, /* mp_ass_subscript */
+static PyMappingMethods pyrna_struct_as_mapping= {
+ (lenfunc) NULL, /* mp_length */
+ (binaryfunc) pyrna_struct_subscript, /* mp_subscript */
+ (objobjargproc) pyrna_struct_ass_subscript, /* mp_ass_subscript */
};
static char pyrna_struct_keys_doc[] =
@@ -2152,300 +2504,6 @@ static PyObject *pyrna_struct_values(BPy_PropertyRNA *self)
return BPy_Wrap_GetValues(self->ptr.id.data, group);
}
-/* for keyframes and drivers */
-static int pyrna_struct_anim_args_parse(PointerRNA *ptr, const char *error_prefix, const char *path,
- const char **path_full, int *index)
-{
- const int is_idbase= RNA_struct_is_ID(ptr->type);
- PropertyRNA *prop;
- PointerRNA r_ptr;
-
- if (ptr->data==NULL) {
- PyErr_Format(PyExc_TypeError, "%.200s this struct has no data, can't be animated", error_prefix);
- return -1;
- }
-
- /* full paths can only be given from ID base */
- if(is_idbase) {
- int r_index= -1;
- if(RNA_path_resolve_full(ptr, path, &r_ptr, &prop, &r_index)==0) {
- prop= NULL;
- }
- else if(r_index != -1) {
- PyErr_Format(PyExc_ValueError, "%.200s path includes index, must be a separate argument", error_prefix, path);
- return -1;
- }
- else if(ptr->id.data != r_ptr.id.data) {
- PyErr_Format(PyExc_ValueError, "%.200s path spans ID blocks", error_prefix, path);
- return -1;
- }
- }
- else {
- prop = RNA_struct_find_property(ptr, path);
- r_ptr= *ptr;
- }
-
- if (prop==NULL) {
- PyErr_Format(PyExc_TypeError, "%.200s property \"%s\" not found", error_prefix, path);
- return -1;
- }
-
- if (!RNA_property_animateable(&r_ptr, prop)) {
- PyErr_Format(PyExc_TypeError, "%.200s property \"%s\" not animatable", error_prefix, path);
- return -1;
- }
-
- if(RNA_property_array_check(&r_ptr, prop) == 0) {
- if((*index) == -1) {
- *index= 0;
- }
- else {
- PyErr_Format(PyExc_TypeError, "%.200s index %d was given while property \"%s\" is not an array", error_prefix, *index, path);
- return -1;
- }
- }
- else {
- int array_len= RNA_property_array_length(&r_ptr, prop);
- if((*index) < -1 || (*index) >= array_len) {
- PyErr_Format(PyExc_TypeError, "%.200s index out of range \"%s\", given %d, array length is %d", error_prefix, path, *index, array_len);
- return -1;
- }
- }
-
- if(is_idbase) {
- *path_full= BLI_strdup(path);
- }
- else {
- *path_full= RNA_path_from_ID_to_property(&r_ptr, prop);
-
- if (*path_full==NULL) {
- PyErr_Format(PyExc_TypeError, "%.200s could not make path to \"%s\"", error_prefix, path);
- return -1;
- }
- }
-
- return 0;
-}
-
-/* internal use for insert and delete */
-static int pyrna_struct_keyframe_parse(PointerRNA *ptr, PyObject *args, PyObject *kw, const char *parse_str, const char *error_prefix,
- const char **path_full, int *index, float *cfra, const char **group_name) /* return values */
-{
- static const char *kwlist[] = {"data_path", "index", "frame", "group", NULL};
- const char *path;
-
- /* note, parse_str MUST start with 's|ifs' */
- if (!PyArg_ParseTupleAndKeywords(args, kw, parse_str, (char **)kwlist, &path, index, cfra, group_name))
- return -1;
-
- if(pyrna_struct_anim_args_parse(ptr, error_prefix, path, path_full, index) < 0)
- return -1;
-
- if(*cfra==FLT_MAX)
- *cfra= CTX_data_scene(BPy_GetContext())->r.cfra;
-
- return 0; /* success */
-}
-
-static char pyrna_struct_keyframe_insert_doc[] =
-".. method:: keyframe_insert(data_path, index=-1, frame=bpy.context.scene.frame_current, group=\"\")\n"
-"\n"
-" Insert a keyframe on the property given, adding fcurves and animation data when necessary.\n"
-"\n"
-" :arg data_path: path to the property to key, analogous to the fcurve's data path.\n"
-" :type data_path: string\n"
-" :arg index: array index of the property to key. Defaults to -1 which will key all indices or a single channel if the property is not an array.\n"
-" :type index: int\n"
-" :arg frame: The frame on which the keyframe is inserted, defaulting to the current frame.\n"
-" :type frame: float\n"
-" :arg group: The name of the group the F-Curve should be added to if it doesn't exist yet.\n"
-" :type group: str\n"
-" :return: Success of keyframe insertion.\n"
-" :rtype: boolean\n"
-;
-static PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyObject *kw)
-{
- /* args, pyrna_struct_keyframe_parse handles these */
- const char *path_full= NULL;
- int index= -1;
- float cfra= FLT_MAX;
- const char *group_name= NULL;
-
- if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_insert()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) {
- return NULL;
- }
- else {
- short result;
- ReportList reports;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- result= insert_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
- MEM_freeN((void *)path_full);
-
- if(BPy_reports_to_error(&reports, TRUE))
- return NULL;
-
- return PyBool_FromLong(result);
- }
-}
-
-static char pyrna_struct_keyframe_delete_doc[] =
-".. method:: keyframe_delete(data_path, index=-1, frame=bpy.context.scene.frame_current, group=\"\")\n"
-"\n"
-" Remove a keyframe from this properties fcurve.\n"
-"\n"
-" :arg data_path: path to the property to remove a key, analogous to the fcurve's data path.\n"
-" :type data_path: string\n"
-" :arg index: array index of the property to remove a key. Defaults to -1 removing all indices or a single channel if the property is not an array.\n"
-" :type index: int\n"
-" :arg frame: The frame on which the keyframe is deleted, defaulting to the current frame.\n"
-" :type frame: float\n"
-" :arg group: The name of the group the F-Curve should be added to if it doesn't exist yet.\n"
-" :type group: str\n"
-" :return: Success of keyframe deleation.\n"
-" :rtype: boolean\n"
-;
-static PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args, PyObject *kw)
-{
- /* args, pyrna_struct_keyframe_parse handles these */
- const char *path_full= NULL;
- int index= -1;
- float cfra= FLT_MAX;
- const char *group_name= NULL;
-
- if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_delete()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) {
- return NULL;
- }
- else {
- short result;
- ReportList reports;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- result= delete_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
- MEM_freeN((void *)path_full);
-
- if(BPy_reports_to_error(&reports, TRUE))
- return NULL;
-
- return PyBool_FromLong(result);
- }
-
-}
-
-static char pyrna_struct_driver_add_doc[] =
-".. method:: driver_add(path, index=-1)\n"
-"\n"
-" Adds driver(s) to the given property\n"
-"\n"
-" :arg path: path to the property to drive, analogous to the fcurve's data path.\n"
-" :type path: string\n"
-" :arg index: array index of the property drive. Defaults to -1 for all indices or a single channel if the property is not an array.\n"
-" :type index: int\n"
-" :return: The driver(s) added.\n"
-" :rtype: :class:`FCurve` or list if index is -1 with an array property.\n"
-;
-static PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args)
-{
- const char *path, *path_full;
- int index= -1;
-
- if (!PyArg_ParseTuple(args, "s|i:driver_add", &path, &index))
- return NULL;
-
- if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_add():", path, &path_full, &index) < 0) {
- return NULL;
- }
- else {
- PyObject *ret= NULL;
- ReportList reports;
- int result;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- result= ANIM_add_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0, DRIVER_TYPE_PYTHON);
-
- if(BPy_reports_to_error(&reports, TRUE))
- return NULL;
-
- if(result) {
- ID *id= self->ptr.id.data;
- AnimData *adt= BKE_animdata_from_id(id);
- FCurve *fcu;
-
- PointerRNA tptr;
- PyObject *item;
-
- if(index == -1) { /* all, use a list */
- int i= 0;
- ret= PyList_New(0);
- while((fcu= list_find_fcurve(&adt->drivers, path_full, i++))) {
- RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
- item= pyrna_struct_CreatePyObject(&tptr);
- PyList_Append(ret, item);
- Py_DECREF(item);
- }
- }
- else {
- fcu= list_find_fcurve(&adt->drivers, path_full, index);
- RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
- ret= pyrna_struct_CreatePyObject(&tptr);
- }
- }
- else {
- /* XXX, should be handled by reports, */
- PyErr_SetString(PyExc_TypeError, "bpy_struct.driver_add(): failed because of an internal error");
- return NULL;
- }
-
- MEM_freeN((void *)path_full);
-
- return ret;
- }
-}
-
-
-static char pyrna_struct_driver_remove_doc[] =
-".. method:: driver_remove(path, index=-1)\n"
-"\n"
-" Remove driver(s) from the given property\n"
-"\n"
-" :arg path: path to the property to drive, analogous to the fcurve's data path.\n"
-" :type path: string\n"
-" :arg index: array index of the property drive. Defaults to -1 for all indices or a single channel if the property is not an array.\n"
-" :type index: int\n"
-" :return: Success of driver removal.\n"
-" :rtype: boolean\n"
-;
-static PyObject *pyrna_struct_driver_remove(BPy_StructRNA *self, PyObject *args)
-{
- const char *path, *path_full;
- int index= -1;
-
- if (!PyArg_ParseTuple(args, "s|i:driver_remove", &path, &index))
- return NULL;
-
- if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_remove():", path, &path_full, &index) < 0) {
- return NULL;
- }
- else {
- short result;
- ReportList reports;
-
- BKE_reports_init(&reports, RPT_STORE);
-
- result= ANIM_remove_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0);
-
- MEM_freeN((void *)path_full);
-
- if(BPy_reports_to_error(&reports, TRUE))
- return NULL;
-
- return PyBool_FromLong(result);
- }
-}
-
static char pyrna_struct_is_property_set_doc[] =
".. method:: is_property_set(property)\n"
@@ -2461,6 +2519,8 @@ static PyObject *pyrna_struct_is_property_set(BPy_StructRNA *self, PyObject *arg
const char *name;
int ret;
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
if (!PyArg_ParseTuple(args, "s:is_property_set", &name))
return NULL;
@@ -2500,6 +2560,8 @@ static PyObject *pyrna_struct_is_property_hidden(BPy_StructRNA *self, PyObject *
PropertyRNA *prop;
const char *name;
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
if (!PyArg_ParseTuple(args, "s:is_property_hidden", &name))
return NULL;
@@ -2529,6 +2591,8 @@ static PyObject *pyrna_struct_path_resolve(BPy_StructRNA *self, PyObject *args)
PropertyRNA *r_prop;
int index= -1;
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
if (!PyArg_ParseTuple(args, "s|O!:path_resolve", &path, &PyBool_Type, &coerce))
return NULL;
@@ -2579,6 +2643,8 @@ static PyObject *pyrna_struct_path_from_id(BPy_StructRNA *self, PyObject *args)
PropertyRNA *prop;
PyObject *ret;
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
if (!PyArg_ParseTuple(args, "|s:path_from_id", &name))
return NULL;
@@ -2618,7 +2684,7 @@ static char pyrna_prop_path_from_id_doc[] =
static PyObject *pyrna_prop_path_from_id(BPy_PropertyRNA *self)
{
const char *path;
- PropertyRNA *prop = self->prop;
+ PropertyRNA *prop= self->prop;
PyObject *ret;
path= RNA_path_from_ID_to_property(&self->ptr, self->prop);
@@ -2645,6 +2711,9 @@ static char pyrna_struct_type_recast_doc[] =
static PyObject *pyrna_struct_type_recast(BPy_StructRNA *self)
{
PointerRNA r_ptr;
+
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
RNA_pointer_recast(&self->ptr, &r_ptr);
return pyrna_struct_CreatePyObject(&r_ptr);
}
@@ -2658,14 +2727,14 @@ static void pyrna_dir_members_py(PyObject *list, PyObject *self)
dict_ptr= _PyObject_GetDictPtr((PyObject *)self);
if(dict_ptr && (dict=*dict_ptr)) {
- list_tmp = PyDict_Keys(dict);
+ list_tmp= PyDict_Keys(dict);
PyList_SetSlice(list, INT_MAX, INT_MAX, list_tmp);
Py_DECREF(list_tmp);
}
dict= ((PyTypeObject *)Py_TYPE(self))->tp_dict;
if(dict) {
- list_tmp = PyDict_Keys(dict);
+ list_tmp= PyDict_Keys(dict);
PyList_SetSlice(list, INT_MAX, INT_MAX, list_tmp);
Py_DECREF(list_tmp);
}
@@ -2687,7 +2756,7 @@ static void pyrna_dir_members_rna(PyObject *list, PointerRNA *ptr)
RNA_PROP_BEGIN(&tptr, itemptr, iterprop) {
idname= RNA_function_identifier(itemptr.data);
- pystring = PyUnicode_FromString(idname);
+ pystring= PyUnicode_FromString(idname);
PyList_Append(list, pystring);
Py_DECREF(pystring);
}
@@ -2706,7 +2775,7 @@ static void pyrna_dir_members_rna(PyObject *list, PointerRNA *ptr)
nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name));
if(nameptr) {
- pystring = PyUnicode_FromString(nameptr);
+ pystring= PyUnicode_FromString(nameptr);
PyList_Append(list, pystring);
Py_DECREF(pystring);
@@ -2724,10 +2793,12 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
PyObject *ret;
PyObject *pystring;
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
/* Include this incase this instance is a subtype of a python class
* In these instances we may want to return a function or variable provided by the subtype
* */
- ret = PyList_New(0);
+ ret= PyList_New(0);
if (!BPy_StructRNA_CheckExact(self))
pyrna_dir_members_py(ret, (PyObject *)self);
@@ -2735,11 +2806,11 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
pyrna_dir_members_rna(ret, &self->ptr);
if(self->ptr.type == &RNA_Context) {
- ListBase lb = CTX_data_dir_get(self->ptr.data);
+ ListBase lb= CTX_data_dir_get(self->ptr.data);
LinkData *link;
for(link=lb.first; link; link=link->next) {
- pystring = PyUnicode_FromString(link->data);
+ pystring= PyUnicode_FromString(link->data);
PyList_Append(ret, pystring);
Py_DECREF(pystring);
}
@@ -2762,36 +2833,38 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA *self)
}
//---------------getattr--------------------------------------------
-static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
+static PyObject *pyrna_struct_getattro(BPy_StructRNA *self, PyObject *pyname)
{
- const char *name = _PyUnicode_AsString(pyname);
+ const char *name= _PyUnicode_AsString(pyname);
PyObject *ret;
PropertyRNA *prop;
FunctionRNA *func;
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
if(name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy_struct: __getattr__ must be a string");
- ret = NULL;
+ ret= NULL;
}
else if(name[0]=='_') { // rna can't start with a "_", so for __dict__ and similar we can skip using rna lookups
/* annoying exception, maybe we need to have different types for this... */
if((strcmp(name, "__getitem__")==0 || strcmp(name, "__setitem__")==0) && !RNA_struct_idprops_check(self->ptr.type)) {
PyErr_SetString(PyExc_AttributeError, "bpy_struct: no __getitem__ support for this type");
- ret = NULL;
+ ret= NULL;
}
else {
- ret = PyObject_GenericGetAttr((PyObject *)self, pyname);
+ ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
}
}
- else if ((prop = RNA_struct_find_property(&self->ptr, name))) {
- ret = pyrna_prop_to_py(&self->ptr, prop);
+ else if ((prop= RNA_struct_find_property(&self->ptr, name))) {
+ ret= pyrna_prop_to_py(&self->ptr, prop);
}
/* RNA function only if callback is declared (no optional functions) */
- else if ((func = RNA_struct_find_function(&self->ptr, name)) && RNA_function_defined(func)) {
- ret = pyrna_func_to_py((BPy_DummyPointerRNA *)self, func);
+ else if ((func= RNA_struct_find_function(&self->ptr, name)) && RNA_function_defined(func)) {
+ ret= pyrna_func_to_py((BPy_DummyPointerRNA *)self, func);
}
else if (self->ptr.type == &RNA_Context) {
- bContext *C = self->ptr.data;
+ bContext *C= self->ptr.data;
if(C==NULL) {
PyErr_Format(PyExc_AttributeError, "bpy_struct: Context is 'NULL', can't get \"%.200s\" from context", name);
ret= NULL;
@@ -2819,7 +2892,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
CollectionPointerLink *link;
PyObject *linkptr;
- ret = PyList_New(0);
+ ret= PyList_New(0);
for(link=newlb.first; link; link=link->next) {
linkptr= pyrna_struct_CreatePyObject(&link->ptr);
@@ -2837,12 +2910,12 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
}
}
else if (done==-1) { /* found but not set */
- ret = Py_None;
+ ret= Py_None;
Py_INCREF(ret);
}
else { /* not found in the context */
/* lookup the subclass. raise an error if its not found */
- ret = PyObject_GenericGetAttr((PyObject *)self, pyname);
+ ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
}
BLI_freelistN(&newlb);
@@ -2851,7 +2924,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
else {
#if 0
PyErr_Format(PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" not found", name);
- ret = NULL;
+ ret= NULL;
#endif
/* Include this incase this instance is a subtype of a python class
* In these instances we may want to return a function or variable provided by the subtype
@@ -2860,7 +2933,7 @@ static PyObject *pyrna_struct_getattro( BPy_StructRNA *self, PyObject *pyname )
* */
/* The error raised here will be displayed */
- ret = PyObject_GenericGetAttr((PyObject *)self, pyname);
+ ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
}
return ret;
@@ -2889,7 +2962,7 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr
PyObject *ret= PyType_Type.tp_getattro(cls, attr);
/* Allows:
- * >>> bpy.types.Scene.foo = BoolProperty()
+ * >>> bpy.types.Scene.foo= BoolProperty()
* >>> bpy.types.Scene.foo
* <bpy_struct, BooleanProperty("foo")>
* ...rather then returning the defered class register tuple as checked by pyrna_is_deferred_prop()
@@ -2917,13 +2990,21 @@ static PyObject *pyrna_struct_meta_idprop_getattro(PyObject *cls, PyObject *attr
static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyObject *value)
{
StructRNA *srna= srna_from_self(cls, "StructRNA.__setattr__");
+ const int is_deferred_prop= (value && pyrna_is_deferred_prop(value));
+
+ if(srna && !pyrna_write_check() && (is_deferred_prop || RNA_struct_type_find_property(srna, _PyUnicode_AsString(attr)))) {
+ PyErr_Format(PyExc_AttributeError, "pyrna_struct_meta_idprop_setattro() can't set in readonly state '%.200s.%S'", ((PyTypeObject *)cls)->tp_name, attr);
+ return -1;
+ }
if(srna == NULL) {
- if(value && pyrna_is_deferred_prop(value)) {
+ /* allow setting on unregistered classes which can be registered later on */
+ /*
+ if(value && is_deferred_prop) {
PyErr_Format(PyExc_AttributeError, "pyrna_struct_meta_idprop_setattro() unable to get srna from class '%.200s'", ((PyTypeObject *)cls)->tp_name);
return -1;
}
-
+ */
/* srna_from_self may set an error */
PyErr_Clear();
return PyType_Type.tp_setattro(cls, attr, value);
@@ -2931,7 +3012,7 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
if(value) {
/* check if the value is a property */
- if(pyrna_is_deferred_prop(value)) {
+ if(is_deferred_prop) {
int ret= deferred_register_prop(srna, attr, value);
if(ret == -1) {
/* error set */
@@ -2962,11 +3043,13 @@ static int pyrna_struct_meta_idprop_setattro(PyObject *cls, PyObject *attr, PyOb
return PyType_Type.tp_setattro(cls, attr, value);
}
-static int pyrna_struct_setattro( BPy_StructRNA *self, PyObject *pyname, PyObject *value )
+static int pyrna_struct_setattro(BPy_StructRNA *self, PyObject *pyname, PyObject *value)
{
- const char *name = _PyUnicode_AsString(pyname);
+ const char *name= _PyUnicode_AsString(pyname);
PropertyRNA *prop= NULL;
+ PYRNA_STRUCT_CHECK_INT(self)
+
#ifdef USE_PEDANTIC_WRITE
if(rna_disallow_writes && rna_id_write_error(&self->ptr, pyname)) {
return -1;
@@ -2979,13 +3062,13 @@ static int pyrna_struct_setattro( BPy_StructRNA *self, PyObject *pyname, PyObjec
}
else if (name[0] != '_' && (prop= RNA_struct_find_property(&self->ptr, name))) {
if (!RNA_property_editable_flag(&self->ptr, prop)) {
- PyErr_Format(PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(prop), RNA_struct_identifier(self->ptr.type) );
+ PyErr_Format(PyExc_AttributeError, "bpy_struct: attribute \"%.200s\" from \"%.200s\" is read-only", RNA_property_identifier(prop), RNA_struct_identifier(self->ptr.type));
return -1;
}
}
else if (self->ptr.type == &RNA_Context) {
/* code just raises correct error, context prop's cant be set, unless its apart of the py class */
- bContext *C = self->ptr.data;
+ bContext *C= self->ptr.data;
if(C==NULL) {
PyErr_Format(PyExc_AttributeError, "bpy_struct: Context is 'NULL', can't set \"%.200s\" from context", name);
return -1;
@@ -3013,7 +3096,7 @@ static int pyrna_struct_setattro( BPy_StructRNA *self, PyObject *pyname, PyObjec
PyErr_SetString(PyExc_AttributeError, "bpy_struct: del not supported");
return -1;
}
- return pyrna_py_to_prop(&self->ptr, prop, NULL, value, "bpy_struct: item.attr = val:");
+ return pyrna_py_to_prop(&self->ptr, prop, NULL, value, "bpy_struct: item.attr= val:");
}
else {
return PyObject_GenericSetAttr((PyObject *)self, pyname, value);
@@ -3028,7 +3111,7 @@ static PyObject *pyrna_prop_dir(BPy_PropertyRNA *self)
/* Include this incase this instance is a subtype of a python class
* In these instances we may want to return a function or variable provided by the subtype
* */
- ret = PyList_New(0);
+ ret= PyList_New(0);
if (!BPy_PropertyRNA_CheckExact(self))
pyrna_dir_members_py(ret, (PyObject *)self);
@@ -3040,14 +3123,14 @@ static PyObject *pyrna_prop_dir(BPy_PropertyRNA *self)
}
-static PyObject *pyrna_prop_array_getattro( BPy_PropertyRNA *self, PyObject *pyname )
+static PyObject *pyrna_prop_array_getattro(BPy_PropertyRNA *self, PyObject *pyname)
{
return PyObject_GenericGetAttr((PyObject *)self, pyname);
}
-static PyObject *pyrna_prop_collection_getattro( BPy_PropertyRNA *self, PyObject *pyname )
+static PyObject *pyrna_prop_collection_getattro(BPy_PropertyRNA *self, PyObject *pyname)
{
- const char *name = _PyUnicode_AsString(pyname);
+ const char *name= _PyUnicode_AsString(pyname);
if(name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy_prop_collection: __getattr__ must be a string");
@@ -3060,14 +3143,14 @@ static PyObject *pyrna_prop_collection_getattro( BPy_PropertyRNA *self, PyObject
PointerRNA r_ptr;
if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
- if ((prop = RNA_struct_find_property(&r_ptr, name))) {
- ret = pyrna_prop_to_py(&r_ptr, prop);
+ if ((prop= RNA_struct_find_property(&r_ptr, name))) {
+ ret= pyrna_prop_to_py(&r_ptr, prop);
return ret;
}
- else if ((func = RNA_struct_find_function(&r_ptr, name))) {
+ else if ((func= RNA_struct_find_function(&r_ptr, name))) {
PyObject *self_collection= pyrna_struct_CreatePyObject(&r_ptr);
- ret = pyrna_func_to_py((BPy_DummyPointerRNA *)self_collection, func);
+ ret= pyrna_func_to_py((BPy_DummyPointerRNA *)self_collection, func);
Py_DECREF(self_collection);
return ret;
@@ -3075,14 +3158,45 @@ static PyObject *pyrna_prop_collection_getattro( BPy_PropertyRNA *self, PyObject
}
}
- /* The error raised here will be displayed */
+#if 0
return PyObject_GenericGetAttr((PyObject *)self, pyname);
+#else
+ {
+ /* Could just do this except for 1 awkward case.
+ * PyObject_GenericGetAttr((PyObject *)self, pyname);
+ * so as to support 'bpy.data.library.load()'
+ * note, this _only_ supports static methods */
+
+ PyObject *ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
+
+ if(ret == NULL && name[0] != '_') { /* avoid inheriting __call__ and similar */
+ /* since this is least common case, handle it last */
+ PointerRNA r_ptr;
+ if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
+ PyObject *cls;
+
+ PyObject *error_type, *error_value, *error_traceback;
+ PyErr_Fetch(&error_type, &error_value, &error_traceback);
+ PyErr_Clear();
+
+ cls= pyrna_struct_Subtype(&r_ptr); /* borrows */
+ ret= PyObject_GenericGetAttr(cls, pyname);
+ /* restore the original error */
+ if(ret == NULL) {
+ PyErr_Restore(error_type, error_value, error_traceback);
+ }
+ }
+ }
+
+ return ret;
+ }
+#endif
}
//--------------- setattr-------------------------------------------
-static int pyrna_prop_collection_setattro( BPy_PropertyRNA *self, PyObject *pyname, PyObject *value )
+static int pyrna_prop_collection_setattro(BPy_PropertyRNA *self, PyObject *pyname, PyObject *value)
{
- const char *name = _PyUnicode_AsString(pyname);
+ const char *name= _PyUnicode_AsString(pyname);
PropertyRNA *prop;
PointerRNA r_ptr;
@@ -3101,7 +3215,7 @@ static int pyrna_prop_collection_setattro( BPy_PropertyRNA *self, PyObject *pyna
return -1;
}
else if(RNA_property_collection_type_get(&self->ptr, self->prop, &r_ptr)) {
- if ((prop = RNA_struct_find_property(&r_ptr, name))) {
+ if ((prop= RNA_struct_find_property(&r_ptr, name))) {
/* pyrna_py_to_prop sets its own exceptions */
return pyrna_py_to_prop(&r_ptr, prop, NULL, value, "BPy_PropertyRNA - Attribute (setattr):");
}
@@ -3176,17 +3290,25 @@ static PyObject *pyrna_struct_get_id_data(BPy_DummyPointerRNA *self)
/* Python attributes get/set structure: */
/*****************************************************************************/
-static PyGetSetDef pyrna_prop_getseters[] = {
+static PyGetSetDef pyrna_prop_getseters[]= {
{(char *)"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, (char *)"The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL},
- {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
-static PyGetSetDef pyrna_struct_getseters[] = {
+static PyGetSetDef pyrna_struct_getseters[]= {
{(char *)"id_data", (getter)pyrna_struct_get_id_data, (setter)NULL, (char *)"The :class:`ID` object this datablock is from or None, (not available for all data types)", NULL},
- {NULL,NULL,NULL,NULL,NULL} /* Sentinel */
+ {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
+static char pyrna_prop_collection_keys_doc[] =
+".. method:: keys()\n"
+"\n"
+" Return the identifiers of collection members (matching pythons dict.keys() functionality).\n"
+"\n"
+" :return: the identifiers for each member of this collection.\n"
+" :rtype: list of stings\n"
+;
static PyObject *pyrna_prop_collection_keys(BPy_PropertyRNA *self)
{
PyObject *ret= PyList_New(0);
@@ -3198,7 +3320,7 @@ static PyObject *pyrna_prop_collection_keys(BPy_PropertyRNA *self)
if(nameptr) {
/* add to python list */
- item = PyUnicode_FromString( nameptr );
+ item= PyUnicode_FromString(nameptr);
PyList_Append(ret, item);
Py_DECREF(item);
/* done */
@@ -3212,6 +3334,14 @@ static PyObject *pyrna_prop_collection_keys(BPy_PropertyRNA *self)
return ret;
}
+static char pyrna_prop_collection_items_doc[] =
+".. method:: items()\n"
+"\n"
+" Return the identifiers of collection members (matching pythons dict.items() functionality).\n"
+"\n"
+" :return: (key, value) pairs for each member of this collection.\n"
+" :rtype: list of tuples\n"
+;
static PyObject *pyrna_prop_collection_items(BPy_PropertyRNA *self)
{
PyObject *ret= PyList_New(0);
@@ -3225,7 +3355,7 @@ static PyObject *pyrna_prop_collection_items(BPy_PropertyRNA *self)
item= PyTuple_New(2);
nameptr= RNA_struct_name_get_alloc(&itemptr, name, sizeof(name));
if(nameptr) {
- PyTuple_SET_ITEM(item, 0, PyUnicode_FromString( nameptr ));
+ PyTuple_SET_ITEM(item, 0, PyUnicode_FromString(nameptr));
if(name != nameptr)
MEM_freeN(nameptr);
}
@@ -3245,6 +3375,14 @@ static PyObject *pyrna_prop_collection_items(BPy_PropertyRNA *self)
return ret;
}
+static char pyrna_prop_collection_values_doc[] =
+".. method:: values()\n"
+"\n"
+" Return the values of collection (matching pythons dict.values() functionality).\n"
+"\n"
+" :return: the members of this collection.\n"
+" :rtype: list\n"
+;
static PyObject *pyrna_prop_collection_values(BPy_PropertyRNA *self)
{
/* re-use slice*/
@@ -3268,7 +3406,9 @@ static PyObject *pyrna_struct_get(BPy_StructRNA *self, PyObject *args)
IDProperty *group, *idprop;
const char *key;
- PyObject* def = Py_None;
+ PyObject* def= Py_None;
+
+ PYRNA_STRUCT_CHECK_OBJ(self)
if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
return NULL;
@@ -3305,12 +3445,24 @@ static PyObject *pyrna_struct_as_pointer(BPy_StructRNA *self)
return PyLong_FromVoidPtr(self->ptr.data);
}
+static char pyrna_prop_collection_get_doc[] =
+".. method:: get(key, default=None)\n"
+"\n"
+" Returns the value of the item assigned to key or default when not found (matches pythons dictionary function of the same name).\n"
+"\n"
+" :arg key: The identifier for the collection member.\n"
+" :type key: string\n"
+" :arg default: Optional argument for the value to return if *key* is not found.\n"
+" :type default: Undefined\n"
+;
static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args)
{
PointerRNA newptr;
const char *key;
- PyObject* def = Py_None;
+ PyObject* def= Py_None;
+
+ PYRNA_PROP_CHECK_OBJ(self)
if (!PyArg_ParseTuple(args, "s|O:get", &key, &def))
return NULL;
@@ -3323,7 +3475,7 @@ static PyObject *pyrna_prop_collection_get(BPy_PropertyRNA *self, PyObject *args
static void foreach_attr_type( BPy_PropertyRNA *self, const char *attr,
/* values to assign */
- RawPropertyType *raw_type, int *attr_tot, int *attr_signed )
+ RawPropertyType *raw_type, int *attr_tot, int *attr_signed)
{
PropertyRNA *prop;
*raw_type= PROP_RAW_UNSET;
@@ -3332,9 +3484,9 @@ static void foreach_attr_type( BPy_PropertyRNA *self, const char *attr,
/* note: this is fail with zero length lists, so dont let this get caled in that case */
RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
- prop = RNA_struct_find_property(&itemptr, attr);
+ prop= RNA_struct_find_property(&itemptr, attr);
*raw_type= RNA_property_raw_type(prop);
- *attr_tot = RNA_property_array_length(&itemptr, prop);
+ *attr_tot= RNA_property_array_length(&itemptr, prop);
*attr_signed= (RNA_property_subtype(prop)==PROP_UNSIGNED) ? FALSE:TRUE;
break;
}
@@ -3372,9 +3524,9 @@ static int foreach_parse_args(
*attr_tot= 1;
if (RNA_property_type(self->prop) == PROP_COLLECTION)
- array_tot = RNA_property_collection_length(&self->ptr, self->prop);
+ array_tot= RNA_property_collection_length(&self->ptr, self->prop);
else
- array_tot = RNA_property_array_length(&self->ptr, self->prop);
+ array_tot= RNA_property_array_length(&self->ptr, self->prop);
target_tot= array_tot * (*attr_tot);
@@ -3398,7 +3550,7 @@ static int foreach_parse_args(
static int foreach_compat_buffer(RawPropertyType raw_type, int attr_signed, const char *format)
{
- char f = format ? *format:'B'; /* B is assumed when not set */
+ char f= format ? *format:'B'; /* B is assumed when not set */
switch(raw_type) {
case PROP_RAW_CHAR:
@@ -3423,7 +3575,7 @@ static int foreach_compat_buffer(RawPropertyType raw_type, int attr_signed, cons
static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
{
- PyObject *item = NULL;
+ PyObject *item= NULL;
int i=0, ok=0, buffer_is_compat;
void *array= NULL;
@@ -3433,7 +3585,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
int tot, size, attr_tot, attr_signed;
RawPropertyType raw_type;
- if(foreach_parse_args(self, args, &attr, &seq, &tot, &size, &raw_type, &attr_tot, &attr_signed) < 0)
+ if(foreach_parse_args(self, args, &attr, &seq, &tot, &size, &raw_type, &attr_tot, &attr_signed) < 0)
return NULL;
if(tot==0)
@@ -3442,17 +3594,17 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
if(set) { /* get the array from python */
- buffer_is_compat = FALSE;
+ buffer_is_compat= FALSE;
if(PyObject_CheckBuffer(seq)) {
Py_buffer buf;
PyObject_GetBuffer(seq, &buf, PyBUF_SIMPLE | PyBUF_FORMAT);
/* check if the buffer matches */
- buffer_is_compat = foreach_compat_buffer(raw_type, attr_signed, buf.format);
+ buffer_is_compat= foreach_compat_buffer(raw_type, attr_signed, buf.format);
if(buffer_is_compat) {
- ok = RNA_property_collection_raw_set(NULL, &self->ptr, self->prop, attr, buf.buf, raw_type, tot);
+ ok= RNA_property_collection_raw_set(NULL, &self->ptr, self->prop, attr, buf.buf, raw_type, tot);
}
PyBuffer_Release(&buf);
@@ -3489,21 +3641,21 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
Py_DECREF(item);
}
- ok = RNA_property_collection_raw_set(NULL, &self->ptr, self->prop, attr, array, raw_type, tot);
+ ok= RNA_property_collection_raw_set(NULL, &self->ptr, self->prop, attr, array, raw_type, tot);
}
}
else {
- buffer_is_compat = FALSE;
+ buffer_is_compat= FALSE;
if(PyObject_CheckBuffer(seq)) {
Py_buffer buf;
PyObject_GetBuffer(seq, &buf, PyBUF_SIMPLE | PyBUF_FORMAT);
/* check if the buffer matches, TODO - signed/unsigned types */
- buffer_is_compat = foreach_compat_buffer(raw_type, attr_signed, buf.format);
+ buffer_is_compat= foreach_compat_buffer(raw_type, attr_signed, buf.format);
if(buffer_is_compat) {
- ok = RNA_property_collection_raw_get(NULL, &self->ptr, self->prop, attr, buf.buf, raw_type, tot);
+ ok= RNA_property_collection_raw_get(NULL, &self->ptr, self->prop, attr, buf.buf, raw_type, tot);
}
PyBuffer_Release(&buf);
@@ -3513,7 +3665,7 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
if(!buffer_is_compat) {
array= PyMem_Malloc(size * tot);
- ok = RNA_property_collection_raw_get(NULL, &self->ptr, self->prop, attr, array, raw_type, tot);
+ ok= RNA_property_collection_raw_get(NULL, &self->ptr, self->prop, attr, array, raw_type, tot);
if(!ok) i= tot; /* skip the loop */
@@ -3521,19 +3673,19 @@ static PyObject *foreach_getset(BPy_PropertyRNA *self, PyObject *args, int set)
switch(raw_type) {
case PROP_RAW_CHAR:
- item= PyLong_FromSsize_t( (Py_ssize_t) ((char *)array)[i] );
+ item= PyLong_FromSsize_t((Py_ssize_t) ((char *)array)[i]);
break;
case PROP_RAW_SHORT:
- item= PyLong_FromSsize_t( (Py_ssize_t) ((short *)array)[i] );
+ item= PyLong_FromSsize_t((Py_ssize_t) ((short *)array)[i]);
break;
case PROP_RAW_INT:
- item= PyLong_FromSsize_t( (Py_ssize_t) ((int *)array)[i] );
+ item= PyLong_FromSsize_t((Py_ssize_t) ((int *)array)[i]);
break;
case PROP_RAW_FLOAT:
- item= PyFloat_FromDouble( (double) ((float *)array)[i] );
+ item= PyFloat_FromDouble((double) ((float *)array)[i]);
break;
case PROP_RAW_DOUBLE:
- item= PyFloat_FromDouble( (double) ((double *)array)[i] );
+ item= PyFloat_FromDouble((double) ((double *)array)[i]);
break;
case PROP_RAW_UNSET:
/* should never happen */
@@ -3574,11 +3726,13 @@ static char pyrna_prop_collection_foreach_get_doc[] =
" collection.foreach_get(someseq, attr)\n"
"\n"
" # Python equivelent\n"
-" for i in range(len(seq)): someseq[i] = getattr(collection, attr)\n"
+" for i in range(len(seq)): someseq[i]= getattr(collection, attr)\n"
"\n"
;
static PyObject *pyrna_prop_collection_foreach_get(BPy_PropertyRNA *self, PyObject *args)
{
+ PYRNA_PROP_CHECK_OBJ(self)
+
return foreach_getset(self, args, 0);
}
@@ -3595,8 +3749,10 @@ static char pyrna_prop_collection_foreach_set_doc[] =
" for i in range(len(seq)): setattr(collection[i], attr, seq[i])\n"
"\n"
;
-static PyObject *pyrna_prop_collection_foreach_set(BPy_PropertyRNA *self, PyObject *args)
+static PyObject *pyrna_prop_collection_foreach_set(BPy_PropertyRNA *self, PyObject *args)
{
+ PYRNA_PROP_CHECK_OBJ(self)
+
return foreach_getset(self, args, 1);
}
@@ -3607,19 +3763,26 @@ static PyObject *pyrna_prop_array_iter(BPy_PropertyArrayRNA *self)
/* Try get values from a collection */
PyObject *ret;
PyObject *iter= NULL;
- int len= pyrna_prop_array_length(self);
- ret = pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
+ int len;
+
+ PYRNA_PROP_CHECK_OBJ((BPy_PropertyRNA *)self)
+
+ len= pyrna_prop_array_length(self);
+ ret= pyrna_prop_array_subscript_slice(self, &self->ptr, self->prop, 0, len, len);
/* we know this is a list so no need to PyIter_Check
* otherwise it could be NULL (unlikely) if conversion failed */
if(ret) {
- iter = PyObject_GetIter(ret);
+ iter= PyObject_GetIter(ret);
Py_DECREF(ret);
}
return iter;
}
+static PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self);
+
+#ifndef USE_PYRNA_ITER
static PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self)
{
/* Try get values from a collection */
@@ -3630,14 +3793,15 @@ static PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self)
/* we know this is a list so no need to PyIter_Check
* otherwise it could be NULL (unlikely) if conversion failed */
if(ret) {
- iter = PyObject_GetIter(ret);
+ iter= PyObject_GetIter(ret);
Py_DECREF(ret);
}
return iter;
}
+#endif /* # !USE_PYRNA_ITER */
-static struct PyMethodDef pyrna_struct_methods[] = {
+static struct PyMethodDef pyrna_struct_methods[]= {
/* only for PointerRNA's with ID'props */
{"keys", (PyCFunction)pyrna_struct_keys, METH_NOARGS, pyrna_struct_keys_doc},
@@ -3648,10 +3812,12 @@ static struct PyMethodDef pyrna_struct_methods[] = {
{"as_pointer", (PyCFunction)pyrna_struct_as_pointer, METH_NOARGS, pyrna_struct_as_pointer_doc},
+ /* bpy_rna_anim.c */
{"keyframe_insert", (PyCFunction)pyrna_struct_keyframe_insert, METH_VARARGS|METH_KEYWORDS, pyrna_struct_keyframe_insert_doc},
{"keyframe_delete", (PyCFunction)pyrna_struct_keyframe_delete, METH_VARARGS|METH_KEYWORDS, pyrna_struct_keyframe_delete_doc},
{"driver_add", (PyCFunction)pyrna_struct_driver_add, METH_VARARGS, pyrna_struct_driver_add_doc},
{"driver_remove", (PyCFunction)pyrna_struct_driver_remove, METH_VARARGS, pyrna_struct_driver_remove_doc},
+
{"is_property_set", (PyCFunction)pyrna_struct_is_property_set, METH_VARARGS, pyrna_struct_is_property_set_doc},
{"is_property_hidden", (PyCFunction)pyrna_struct_is_property_hidden, METH_VARARGS, pyrna_struct_is_property_hidden_doc},
{"path_resolve", (PyCFunction)pyrna_struct_path_resolve, METH_VARARGS, pyrna_struct_path_resolve_doc},
@@ -3665,29 +3831,29 @@ static struct PyMethodDef pyrna_struct_methods[] = {
{NULL, NULL, 0, NULL}
};
-static struct PyMethodDef pyrna_prop_methods[] = {
+static struct PyMethodDef pyrna_prop_methods[]= {
{"path_from_id", (PyCFunction)pyrna_prop_path_from_id, METH_NOARGS, pyrna_prop_path_from_id_doc},
{"__dir__", (PyCFunction)pyrna_prop_dir, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}
};
-static struct PyMethodDef pyrna_prop_array_methods[] = {
+static struct PyMethodDef pyrna_prop_array_methods[]= {
{NULL, NULL, 0, NULL}
};
-static struct PyMethodDef pyrna_prop_collection_methods[] = {
+static struct PyMethodDef pyrna_prop_collection_methods[]= {
{"foreach_get", (PyCFunction)pyrna_prop_collection_foreach_get, METH_VARARGS, pyrna_prop_collection_foreach_get_doc},
{"foreach_set", (PyCFunction)pyrna_prop_collection_foreach_set, METH_VARARGS, pyrna_prop_collection_foreach_set_doc},
- {"keys", (PyCFunction)pyrna_prop_collection_keys, METH_NOARGS, NULL},
- {"items", (PyCFunction)pyrna_prop_collection_items, METH_NOARGS,NULL},
- {"values", (PyCFunction)pyrna_prop_collection_values, METH_NOARGS, NULL},
+ {"keys", (PyCFunction)pyrna_prop_collection_keys, METH_NOARGS, pyrna_prop_collection_keys_doc},
+ {"items", (PyCFunction)pyrna_prop_collection_items, METH_NOARGS, pyrna_prop_collection_items_doc},
+ {"values", (PyCFunction)pyrna_prop_collection_values, METH_NOARGS, pyrna_prop_collection_values_doc},
- {"get", (PyCFunction)pyrna_prop_collection_get, METH_VARARGS, NULL},
+ {"get", (PyCFunction)pyrna_prop_collection_get, METH_VARARGS, pyrna_prop_collection_get_doc},
{NULL, NULL, 0, NULL}
};
-static struct PyMethodDef pyrna_prop_collection_idprop_methods[] = {
+static struct PyMethodDef pyrna_prop_collection_idprop_methods[]= {
{"add", (PyCFunction)pyrna_prop_collection_idprop_add, METH_NOARGS, NULL},
{"remove", (PyCFunction)pyrna_prop_collection_idprop_remove, METH_O, NULL},
{"move", (PyCFunction)pyrna_prop_collection_idprop_move, METH_VARARGS, NULL},
@@ -3696,31 +3862,31 @@ static struct PyMethodDef pyrna_prop_collection_idprop_methods[] = {
/* only needed for subtyping, so a new class gets a valid BPy_StructRNA
* todo - also accept useful args */
-static PyObject * pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds))
+static PyObject *pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds))
{
if(PyTuple_GET_SIZE(args) == 1) {
BPy_StructRNA *base= (BPy_StructRNA *)PyTuple_GET_ITEM(args, 0);
- if (type == Py_TYPE(base)) {
+ if (Py_TYPE(base) == type) {
Py_INCREF(base);
return (PyObject *)base;
}
- else if (PyType_IsSubtype(type, &pyrna_struct_Type)) {
+ else if (PyType_IsSubtype(Py_TYPE(base), &pyrna_struct_Type)) {
/* this almost never runs, only when using user defined subclasses of built-in object.
* this isnt common since its NOT related to registerable subclasses. eg:
>>> class MyObSubclass(bpy.types.Object):
... def test_func(self):
... print(100)
- ...
- >>> myob = MyObSubclass(bpy.context.object)
+ ...
+ >>> myob= MyObSubclass(bpy.context.object)
>>> myob.test_func()
100
- *
+ *
* Keep this since it could be useful.
*/
BPy_StructRNA *ret;
if((ret= (BPy_StructRNA *)type->tp_alloc(type, 0))) {
- ret->ptr = base->ptr;
+ ret->ptr= base->ptr;
}
/* pass on exception & NULL if tp_alloc fails */
return (PyObject *)ret;
@@ -3738,7 +3904,7 @@ static PyObject * pyrna_struct_new(PyTypeObject *type, PyObject *args, PyObject
/* only needed for subtyping, so a new class gets a valid BPy_StructRNA
* todo - also accept useful args */
-static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds)) {
+static PyObject *pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *UNUSED(kwds)) {
BPy_PropertyRNA *base;
@@ -3748,10 +3914,11 @@ static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *U
if (type == Py_TYPE(base)) {
Py_INCREF(base);
return (PyObject *)base;
- } else if (PyType_IsSubtype(type, &pyrna_prop_Type)) {
- BPy_PropertyRNA *ret = (BPy_PropertyRNA *) type->tp_alloc(type, 0);
- ret->ptr = base->ptr;
- ret->prop = base->prop;
+ }
+ else if (PyType_IsSubtype(type, &pyrna_prop_Type)) {
+ BPy_PropertyRNA *ret= (BPy_PropertyRNA *) type->tp_alloc(type, 0);
+ ret->ptr= base->ptr;
+ ret->prop= base->prop;
return (PyObject *)ret;
}
else {
@@ -3763,8 +3930,8 @@ static PyObject * pyrna_prop_new(PyTypeObject *type, PyObject *args, PyObject *U
static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *data)
{
PyObject *ret;
- int type = RNA_property_type(prop);
- int flag = RNA_property_flag(prop);
+ int type= RNA_property_type(prop);
+ int flag= RNA_property_flag(prop);
if(RNA_property_array_check(ptr, prop)) {
int a, len;
@@ -3783,14 +3950,14 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
switch (type) {
case PROP_BOOLEAN:
- ret = PyTuple_New(len);
+ ret= PyTuple_New(len);
for(a=0; a<len; a++)
- PyTuple_SET_ITEM(ret, a, PyBool_FromLong( ((int*)data)[a] ));
+ PyTuple_SET_ITEM(ret, a, PyBool_FromLong(((int*)data)[a]));
break;
case PROP_INT:
- ret = PyTuple_New(len);
+ ret= PyTuple_New(len);
for(a=0; a<len; a++)
- PyTuple_SET_ITEM(ret, a, PyLong_FromSsize_t( (Py_ssize_t)((int*)data)[a] ));
+ PyTuple_SET_ITEM(ret, a, PyLong_FromSsize_t((Py_ssize_t)((int*)data)[a]));
break;
case PROP_FLOAT:
switch(RNA_property_subtype(prop)) {
@@ -3810,15 +3977,15 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
/* pass through */
#endif
default:
- ret = PyTuple_New(len);
+ ret= PyTuple_New(len);
for(a=0; a<len; a++)
- PyTuple_SET_ITEM(ret, a, PyFloat_FromDouble( ((float*)data)[a] ));
+ PyTuple_SET_ITEM(ret, a, PyFloat_FromDouble(((float*)data)[a]));
}
break;
default:
PyErr_Format(PyExc_TypeError, "RNA Error: unknown array type \"%d\" (pyrna_param_to_py)", type);
- ret = NULL;
+ ret= NULL;
break;
}
}
@@ -3826,13 +3993,13 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
/* see if we can coorce into a python type - PropertyType */
switch (type) {
case PROP_BOOLEAN:
- ret = PyBool_FromLong( *(int*)data );
+ ret= PyBool_FromLong(*(int*)data);
break;
case PROP_INT:
- ret = PyLong_FromSsize_t( (Py_ssize_t)*(int*)data );
+ ret= PyLong_FromSsize_t((Py_ssize_t)*(int*)data);
break;
case PROP_FLOAT:
- ret = PyFloat_FromDouble( *(float*)data );
+ ret= PyFloat_FromDouble(*(float*)data);
break;
case PROP_STRING:
{
@@ -3853,7 +4020,7 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
ret= PyUnicode_FromString(data_ch);
}
#else
- ret = PyUnicode_FromString(data_ch);
+ ret= PyUnicode_FromString(data_ch);
#endif
#ifdef USE_STRING_COERCE
@@ -3879,7 +4046,8 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
else {
if(RNA_struct_is_ID(ptype)) {
RNA_id_pointer_create(*(void**)data, &newptr);
- } else {
+ }
+ else {
/* note: this is taken from the function's ID pointer
* and will break if a function returns a pointer from
* another ID block, watch this! - it should at least be
@@ -3889,9 +4057,10 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
}
if (newptr.data) {
- ret = pyrna_struct_CreatePyObject(&newptr);
- } else {
- ret = Py_None;
+ ret= pyrna_struct_CreatePyObject(&newptr);
+ }
+ else {
+ ret= Py_None;
Py_INCREF(ret);
}
break;
@@ -3902,7 +4071,7 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
CollectionPointerLink *link;
PyObject *linkptr;
- ret = PyList_New(0);
+ ret= PyList_New(0);
for(link=lb->first; link; link=link->next) {
linkptr= pyrna_struct_CreatePyObject(&link->ptr);
@@ -3914,7 +4083,7 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
}
default:
PyErr_Format(PyExc_TypeError, "RNA Error: unknown type \"%d\" (pyrna_param_to_py)", type);
- ret = NULL;
+ ret= NULL;
break;
}
}
@@ -3922,11 +4091,11 @@ static PyObject *pyrna_param_to_py(PointerRNA *ptr, PropertyRNA *prop, void *dat
return ret;
}
-static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
+static PyObject *pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
{
/* Note, both BPy_StructRNA and BPy_PropertyRNA can be used here */
PointerRNA *self_ptr= &(((BPy_DummyPointerRNA *)PyTuple_GET_ITEM(self, 0))->ptr);
- FunctionRNA *self_func= PyCapsule_GetPointer(PyTuple_GET_ITEM(self, 1), NULL);
+ FunctionRNA *self_func= PyCapsule_GetPointer(PyTuple_GET_ITEM(self, 1), NULL);
PointerRNA funcptr;
ParameterList parms;
@@ -4007,7 +4176,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
kw_arg= FALSE;
}
else if (kw != NULL) {
- item= PyDict_GetItemString(kw, parm_id); /* borrow ref */
+ item= PyDict_GetItemString(kw, parm_id); /* borrow ref */
if(item)
kw_tot++; /* make sure invalid keywords are not given */
@@ -4052,7 +4221,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
*/
if(err == 0 && kw && (pykw_len > kw_tot)) {
PyObject *key, *value;
- Py_ssize_t pos = 0;
+ Py_ssize_t pos= 0;
DynStr *bad_args= BLI_dynstr_new();
DynStr *good_args= BLI_dynstr_new();
@@ -4125,10 +4294,10 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
BKE_reports_init(&reports, RPT_STORE);
RNA_function_call(C, &reports, self_ptr, self_func, &parms);
- err= (BPy_reports_to_error(&reports, TRUE))? -1: 0;
+ err= (BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE));
/* return value */
- if(err==0) {
+ if(err != -1) {
if (ret_len > 0) {
if (ret_len > 1) {
ret= PyTuple_New(ret_len);
@@ -4172,7 +4341,7 @@ static PyObject * pyrna_func_call(PyObject *self, PyObject *args, PyObject *kw)
/* subclasses of pyrna_struct_Type which support idprop definitions use this as a metaclass */
/* note: tp_base member is set to &PyType_Type on init */
-PyTypeObject pyrna_struct_meta_idprop_Type = {
+PyTypeObject pyrna_struct_meta_idprop_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_struct_meta_idprop", /* tp_name */
sizeof(PyHeapTypeObject), /* tp_basicsize */ // XXX, would be PyTypeObject, but subtypes of Type must be PyHeapTypeObject's
@@ -4250,7 +4419,7 @@ PyTypeObject pyrna_struct_meta_idprop_Type = {
/*-----------------------BPy_StructRNA method def------------------------------*/
-PyTypeObject pyrna_struct_Type = {
+PyTypeObject pyrna_struct_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_struct", /* tp_name */
sizeof(BPy_StructRNA), /* tp_basicsize */
@@ -4261,7 +4430,7 @@ PyTypeObject pyrna_struct_Type = {
NULL, /* getattrfunc tp_getattr; */
NULL, /* setattrfunc tp_setattr; */
NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
- ( reprfunc ) pyrna_struct_repr, /* tp_repr */
+ (reprfunc) pyrna_struct_repr, /* tp_repr */
/* Method suites for standard classes */
@@ -4271,25 +4440,32 @@ PyTypeObject pyrna_struct_Type = {
/* More standard operations (here for binary compatibility) */
- ( hashfunc )pyrna_struct_hash, /* hashfunc tp_hash; */
+ (hashfunc) pyrna_struct_hash, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
(reprfunc) pyrna_struct_str, /* reprfunc tp_str; */
- ( getattrofunc ) pyrna_struct_getattro, /* getattrofunc tp_getattro; */
- ( setattrofunc ) pyrna_struct_setattro, /* setattrofunc tp_setattro; */
+ (getattrofunc) pyrna_struct_getattro, /* getattrofunc tp_getattro; */
+ (setattrofunc) pyrna_struct_setattro, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL, /* PyBufferProcs *tp_as_buffer; */
/*** Flags to define presence of optional/expanded features ***/
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* long tp_flags; */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* long tp_flags; */
NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
- NULL, /* traverseproc tp_traverse; */
+#ifdef USE_PYRNA_STRUCT_REFERENCE
+ (traverseproc) pyrna_struct_traverse, /* traverseproc tp_traverse; */
/* delete references to contained objects */
+ (inquiry)pyrna_struct_clear, /* inquiry tp_clear; */
+#else
+ NULL, /* traverseproc tp_traverse; */
+
+/* delete references to contained objects */
NULL, /* inquiry tp_clear; */
+#endif /* !USE_PYRNA_STRUCT_REFERENCE */
/*** Assigned meaning in release 2.1 ***/
/*** rich comparisons ***/
@@ -4332,7 +4508,7 @@ PyTypeObject pyrna_struct_Type = {
};
/*-----------------------BPy_PropertyRNA method def------------------------------*/
-PyTypeObject pyrna_prop_Type = {
+PyTypeObject pyrna_prop_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop", /* tp_name */
sizeof(BPy_PropertyRNA), /* tp_basicsize */
@@ -4353,7 +4529,7 @@ PyTypeObject pyrna_prop_Type = {
/* More standard operations (here for binary compatibility) */
- ( hashfunc ) pyrna_prop_hash, /* hashfunc tp_hash; */
+ (hashfunc) pyrna_prop_hash, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
(reprfunc) pyrna_prop_str, /* reprfunc tp_str; */
@@ -4416,7 +4592,7 @@ PyTypeObject pyrna_prop_Type = {
NULL
};
-PyTypeObject pyrna_prop_array_Type = {
+PyTypeObject pyrna_prop_array_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop_array", /* tp_name */
sizeof(BPy_PropertyArrayRNA), /* tp_basicsize */
@@ -4442,7 +4618,7 @@ PyTypeObject pyrna_prop_array_Type = {
NULL, /* reprfunc tp_str; */
/* will only use these if this is a subtype of a py class */
- ( getattrofunc ) pyrna_prop_array_getattro, /* getattrofunc tp_getattro; */
+ (getattrofunc) pyrna_prop_array_getattro, /* getattrofunc tp_getattro; */
NULL, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
@@ -4499,7 +4675,7 @@ PyTypeObject pyrna_prop_array_Type = {
NULL
};
-PyTypeObject pyrna_prop_collection_Type = {
+PyTypeObject pyrna_prop_collection_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop_collection", /* tp_name */
sizeof(BPy_PropertyRNA), /* tp_basicsize */
@@ -4525,8 +4701,8 @@ PyTypeObject pyrna_prop_collection_Type = {
NULL, /* reprfunc tp_str; */
/* will only use these if this is a subtype of a py class */
- ( getattrofunc ) pyrna_prop_collection_getattro, /* getattrofunc tp_getattro; */
- ( setattrofunc ) pyrna_prop_collection_setattro, /* setattrofunc tp_setattro; */
+ (getattrofunc) pyrna_prop_collection_getattro, /* getattrofunc tp_getattro; */
+ (setattrofunc) pyrna_prop_collection_setattro, /* setattrofunc tp_setattro; */
/* Functions to access object as input/output buffer */
NULL, /* PyBufferProcs *tp_as_buffer; */
@@ -4584,7 +4760,7 @@ PyTypeObject pyrna_prop_collection_Type = {
};
/* only for add/remove/move methods */
-static PyTypeObject pyrna_prop_collection_idprop_Type = {
+static PyTypeObject pyrna_prop_collection_idprop_Type= {
PyVarObject_HEAD_INIT(NULL, 0)
"bpy_prop_collection_idprop", /* tp_name */
sizeof(BPy_PropertyRNA), /* tp_basicsize */
@@ -4668,18 +4844,175 @@ static PyTypeObject pyrna_prop_collection_idprop_Type = {
NULL
};
+#ifdef USE_PYRNA_ITER
+/* --- collection iterator: start --- */
+/* wrap rna collection iterator functions */
+/*
+ * RNA_property_collection_begin(...)
+ * RNA_property_collection_next(...)
+ * RNA_property_collection_end(...)
+ */
+
+static void pyrna_prop_collection_iter_dealloc(BPy_PropertyCollectionIterRNA *self);
+static PyObject *pyrna_prop_collection_iter_next(BPy_PropertyCollectionIterRNA *self);
+
+PyTypeObject pyrna_prop_collection_iter_Type= {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "bpy_prop_collection_iter", /* tp_name */
+ sizeof(BPy_PropertyCollectionIterRNA), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ /* methods */
+ (destructor)pyrna_prop_collection_iter_dealloc, /* tp_dealloc */
+ NULL, /* printfunc tp_print; */
+ NULL, /* getattrfunc tp_getattr; */
+ NULL, /* setattrfunc tp_setattr; */
+ NULL, /* tp_compare */ /* DEPRECATED in python 3.0! */
+ NULL,/* subclassed */ /* tp_repr */
+
+ /* Method suites for standard classes */
+
+ NULL, /* PyNumberMethods *tp_as_number; */
+ NULL, /* PySequenceMethods *tp_as_sequence; */
+ NULL, /* PyMappingMethods *tp_as_mapping; */
+
+ /* More standard operations (here for binary compatibility) */
+
+ NULL, /* hashfunc tp_hash; */
+ NULL, /* ternaryfunc tp_call; */
+ NULL, /* reprfunc tp_str; */
+
+ /* will only use these if this is a subtype of a py class */
+ PyObject_GenericGetAttr, /* getattrofunc tp_getattro; */
+ NULL, /* setattrofunc tp_setattro; */
+
+ /* Functions to access object as input/output buffer */
+ NULL, /* PyBufferProcs *tp_as_buffer; */
+
+ /*** Flags to define presence of optional/expanded features ***/
+ Py_TPFLAGS_DEFAULT, /* long tp_flags; */
+
+ NULL, /* char *tp_doc; Documentation string */
+ /*** Assigned meaning in release 2.0 ***/
+ /* call function for all accessible objects */
+ NULL, /* traverseproc tp_traverse; */
+
+ /* delete references to contained objects */
+ NULL, /* inquiry tp_clear; */
+
+ /*** Assigned meaning in release 2.1 ***/
+ /*** rich comparisons ***/
+ NULL, /* subclassed */ /* richcmpfunc tp_richcompare; */
+
+ /*** weak reference enabler ***/
+#ifdef USE_WEAKREFS
+ offsetof(BPy_PropertyCollectionIterRNA, in_weakreflist), /* long tp_weaklistoffset; */
+#else
+ 0,
+#endif
+ /*** Added in release 2.2 ***/
+ /* Iterators */
+ PyObject_SelfIter, /* getiterfunc tp_iter; */
+ (iternextfunc) pyrna_prop_collection_iter_next, /* iternextfunc tp_iternext; */
+
+ /*** Attribute descriptor and subclassing stuff ***/
+ NULL, /* struct PyMethodDef *tp_methods; */
+ NULL, /* struct PyMemberDef *tp_members; */
+ NULL, /* struct PyGetSetDef *tp_getset; */
+ NULL, /* struct _typeobject *tp_base; */
+ NULL, /* PyObject *tp_dict; */
+ NULL, /* descrgetfunc tp_descr_get; */
+ NULL, /* descrsetfunc tp_descr_set; */
+ 0, /* long tp_dictoffset; */
+ NULL, /* initproc tp_init; */
+ NULL, /* allocfunc tp_alloc; */
+ NULL, /* newfunc tp_new; */
+ /* Low-level free-memory routine */
+ NULL, /* freefunc tp_free; */
+ /* For PyObject_IS_GC */
+ NULL, /* inquiry tp_is_gc; */
+ NULL, /* PyObject *tp_bases; */
+ /* method resolution order */
+ NULL, /* PyObject *tp_mro; */
+ NULL, /* PyObject *tp_cache; */
+ NULL, /* PyObject *tp_subclasses; */
+ NULL, /* PyObject *tp_weaklist; */
+ NULL
+};
+
+PyObject *pyrna_prop_collection_iter_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop)
+{
+ BPy_PropertyCollectionIterRNA *self= PyObject_New(BPy_PropertyCollectionIterRNA, &pyrna_prop_collection_iter_Type);
+
+#ifdef USE_WEAKREFS
+ self->in_weakreflist= NULL;
+#endif
+
+ RNA_property_collection_begin(ptr, prop, &self->iter);
+
+ return (PyObject *)self;
+}
+
+static PyObject *pyrna_prop_collection_iter(BPy_PropertyRNA *self)
+{
+ return pyrna_prop_collection_iter_CreatePyObject(&self->ptr, self->prop);
+}
+
+static PyObject *pyrna_prop_collection_iter_next(BPy_PropertyCollectionIterRNA *self)
+{
+ if(self->iter.valid == FALSE) {
+ PyErr_SetString(PyExc_StopIteration, "pyrna_prop_collection_iter stop");
+ return NULL;
+ }
+ else {
+ BPy_StructRNA *pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&self->iter.ptr);
+
+#ifdef USE_PYRNA_STRUCT_REFERENCE
+ if(pyrna) { /* unlikely but may fail */
+ if((PyObject *)pyrna != Py_None) {
+ /* hold a reference to the iterator since it may have
+ * allocated memory 'pyrna' needs. eg: introspecting dynamic enum's */
+ /* TODO, we could have an api call to know if this is needed since most collections don't */
+ pyrna_struct_reference_set(pyrna, (PyObject *)self);
+ }
+ }
+#endif /* !USE_PYRNA_STRUCT_REFERENCE */
+
+ RNA_property_collection_next(&self->iter);
+
+ return (PyObject *)pyrna;
+ }
+}
+
+
+static void pyrna_prop_collection_iter_dealloc(BPy_PropertyCollectionIterRNA *self)
+{
+#ifdef USE_WEAKREFS
+ if (self->in_weakreflist != NULL) {
+ PyObject_ClearWeakRefs((PyObject *)self);
+ }
+#endif
+
+ RNA_property_collection_end(&self->iter);
+
+ PyObject_DEL(self);
+}
+
+/* --- collection iterator: end --- */
+#endif /* !USE_PYRNA_ITER */
+
+
static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
{
PointerRNA ptr;
PyObject *item;
-
+
Py_INCREF(newclass);
if (RNA_struct_py_type_get(srna))
PyC_ObSpit("RNA WAS SET - ", RNA_struct_py_type_get(srna));
-
+
Py_XDECREF(((PyObject *)RNA_struct_py_type_get(srna)));
-
+
RNA_struct_py_type_set(srna, (void *)newclass); /* Store for later use */
/* Not 100% needed but useful,
@@ -4687,12 +5020,12 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
/* python deals with the curcular ref */
RNA_pointer_create(NULL, &RNA_Struct, srna, &ptr);
- item = pyrna_struct_CreatePyObject(&ptr);
+ item= pyrna_struct_CreatePyObject(&ptr);
/* note, must set the class not the __dict__ else the internal slots are not updated correctly */
PyObject_SetAttrString(newclass, "bl_rna", item);
Py_DECREF(item);
-
+
/* done with rna instance */
}
@@ -4740,7 +5073,7 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
fprintf(stderr, "pyrna_srna_ExternalType: failed to find 'bpy_types' module\n");
return NULL;
}
- bpy_types_dict = PyModule_GetDict(bpy_types); // borrow
+ bpy_types_dict= PyModule_GetDict(bpy_types); // borrow
Py_DECREF(bpy_types); // fairly safe to assume the dict is kept
}
@@ -4752,7 +5085,7 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
//PyObject *slots= PyObject_GetAttrString(newclass, "__slots__"); // cant do this because it gets superclasses values!
//PyObject *bases= PyObject_GetAttrString(newclass, "__bases__"); // can do this but faster not to.
PyObject *bases= ((PyTypeObject *)newclass)->tp_bases;
- PyObject *slots = PyDict_GetItemString(((PyTypeObject *)newclass)->tp_dict, "__slots__");
+ PyObject *slots= PyDict_GetItemString(((PyTypeObject *)newclass)->tp_dict, "__slots__");
if(slots==NULL) {
fprintf(stderr, "pyrna_srna_ExternalType: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", idname);
@@ -4778,7 +5111,7 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
static PyObject* pyrna_srna_Subtype(StructRNA *srna)
{
- PyObject *newclass = NULL;
+ PyObject *newclass= NULL;
/* stupid/simple case */
if (srna == NULL) {
@@ -4796,7 +5129,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
/* subclass equivelents
- class myClass(myBase):
some='value' # or ...
- - myClass = type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'})
+ - myClass= type(name='myClass', bases=(myBase,), dict={'__module__':'bpy.types'})
*/
/* Assume RNA_struct_py_type_get(srna) was already checked */
@@ -4807,7 +5140,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
/* remove __doc__ for now */
// const char *descr= RNA_struct_ui_description(srna);
// if(!descr) descr= "(no docs)";
- // "__doc__",descr
+ // "__doc__", descr
if(RNA_struct_idprops_check(srna) && !PyObject_IsSubclass(py_base, (PyObject *)&pyrna_struct_meta_idprop_Type)) {
metaclass= (PyObject *)&pyrna_struct_meta_idprop_Type;
@@ -4817,7 +5150,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
}
/* always use O not N when calling, N causes refcount errors */
- newclass = PyObject_CallFunction(metaclass, (char *)"s(O){sss()}", idname, py_base, "__module__","bpy.types", "__slots__");
+ newclass= PyObject_CallFunction(metaclass, (char *)"s(O){sss()}", idname, py_base, "__module__","bpy.types", "__slots__");
/* newclass will now have 2 ref's, ???, probably 1 is internal since decrefing here segfaults */
@@ -4837,7 +5170,7 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna)
PyErr_Clear();
}
}
-
+
return newclass;
}
@@ -4859,7 +5192,7 @@ static PyObject* pyrna_struct_Subtype(PointerRNA *ptr)
}
/*-----------------------CreatePyObject---------------------------------*/
-PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr )
+PyObject *pyrna_struct_CreatePyObject(PointerRNA *ptr)
{
BPy_StructRNA *pyrna= NULL;
@@ -4868,35 +5201,44 @@ PyObject *pyrna_struct_CreatePyObject( PointerRNA *ptr )
Py_RETURN_NONE;
}
else {
- PyTypeObject *tp = (PyTypeObject *)pyrna_struct_Subtype(ptr);
-
+ PyTypeObject *tp= (PyTypeObject *)pyrna_struct_Subtype(ptr);
+
if (tp) {
- pyrna = (BPy_StructRNA *) tp->tp_alloc(tp, 0);
+ pyrna= (BPy_StructRNA *) tp->tp_alloc(tp, 0);
Py_DECREF(tp); /* srna owns, cant hold a ref */
}
else {
fprintf(stderr, "Could not make type\n");
- pyrna = ( BPy_StructRNA * ) PyObject_NEW( BPy_StructRNA, &pyrna_struct_Type );
+ pyrna= (BPy_StructRNA *) PyObject_GC_New(BPy_StructRNA, &pyrna_struct_Type);
#ifdef USE_WEAKREFS
pyrna->in_weakreflist= NULL;
#endif
}
}
- if( !pyrna ) {
+ if(pyrna == NULL) {
PyErr_SetString(PyExc_MemoryError, "couldn't create bpy_struct object");
return NULL;
}
-
+
pyrna->ptr= *ptr;
pyrna->freeptr= FALSE;
-
+
+#ifdef USE_PYRNA_STRUCT_REFERENCE
+ pyrna->reference= NULL;
+#endif
+
// PyC_ObSpit("NewStructRNA: ", (PyObject *)pyrna);
-
- return ( PyObject * ) pyrna;
+
+#ifdef USE_PYRNA_INVALIDATE_WEAKREF
+ if(ptr->id.data) {
+ id_weakref_pool_add(ptr->id.data, (BPy_DummyPointerRNA *)pyrna);
+ }
+#endif
+ return (PyObject *)pyrna;
}
-PyObject *pyrna_prop_CreatePyObject( PointerRNA *ptr, PropertyRNA *prop )
+PyObject *pyrna_prop_CreatePyObject(PointerRNA *ptr, PropertyRNA *prop)
{
BPy_PropertyRNA *pyrna;
@@ -4911,17 +5253,17 @@ PyObject *pyrna_prop_CreatePyObject( PointerRNA *ptr, PropertyRNA *prop )
type= &pyrna_prop_collection_Type;
}
else {
- type= &pyrna_prop_collection_idprop_Type;
+ type= &pyrna_prop_collection_idprop_Type;
}
}
- pyrna = (BPy_PropertyRNA *) PyObject_NEW(BPy_PropertyRNA, type);
+ pyrna= (BPy_PropertyRNA *) PyObject_NEW(BPy_PropertyRNA, type);
#ifdef USE_WEAKREFS
pyrna->in_weakreflist= NULL;
#endif
}
else {
- pyrna = (BPy_PropertyRNA *) PyObject_NEW(BPy_PropertyArrayRNA, &pyrna_prop_array_Type);
+ pyrna= (BPy_PropertyRNA *) PyObject_NEW(BPy_PropertyArrayRNA, &pyrna_prop_array_Type);
((BPy_PropertyArrayRNA *)pyrna)->arraydim= 0;
((BPy_PropertyArrayRNA *)pyrna)->arrayoffset= 0;
#ifdef USE_WEAKREFS
@@ -4929,15 +5271,21 @@ PyObject *pyrna_prop_CreatePyObject( PointerRNA *ptr, PropertyRNA *prop )
#endif
}
- if( !pyrna ) {
+ if(pyrna == NULL) {
PyErr_SetString(PyExc_MemoryError, "couldn't create BPy_rna object");
return NULL;
}
-
- pyrna->ptr = *ptr;
- pyrna->prop = prop;
-
- return ( PyObject * ) pyrna;
+
+ pyrna->ptr= *ptr;
+ pyrna->prop= prop;
+
+#ifdef USE_PYRNA_INVALIDATE_WEAKREF
+ if(ptr->id.data) {
+ id_weakref_pool_add(ptr->id.data, (BPy_DummyPointerRNA *)pyrna);
+ }
+#endif
+
+ return (PyObject *)pyrna;
}
void BPY_rna_init(void)
@@ -4946,26 +5294,31 @@ void BPY_rna_init(void)
mathutils_rna_array_cb_index= Mathutils_RegisterCallback(&mathutils_rna_array_cb);
mathutils_rna_matrix_cb_index= Mathutils_RegisterCallback(&mathutils_rna_matrix_cb);
#endif
-
+
/* metaclass */
pyrna_struct_meta_idprop_Type.tp_base= &PyType_Type;
- if( PyType_Ready( &pyrna_struct_meta_idprop_Type ) < 0 )
+ if(PyType_Ready(&pyrna_struct_meta_idprop_Type) < 0)
return;
-
- if( PyType_Ready( &pyrna_struct_Type ) < 0 )
+
+ if(PyType_Ready(&pyrna_struct_Type) < 0)
+ return;
+
+ if(PyType_Ready(&pyrna_prop_Type) < 0)
return;
- if( PyType_Ready( &pyrna_prop_Type ) < 0 )
+ if(PyType_Ready(&pyrna_prop_array_Type) < 0)
return;
- if( PyType_Ready( &pyrna_prop_array_Type ) < 0 )
+ if(PyType_Ready(&pyrna_prop_collection_Type) < 0)
return;
- if( PyType_Ready( &pyrna_prop_collection_Type ) < 0 )
+ if(PyType_Ready(&pyrna_prop_collection_idprop_Type) < 0)
return;
- if( PyType_Ready( &pyrna_prop_collection_idprop_Type ) < 0 )
+#ifdef USE_PYRNA_ITER
+ if(PyType_Ready(&pyrna_prop_collection_iter_Type) < 0)
return;
+#endif
}
/* bpy.data from python */
@@ -4978,7 +5331,7 @@ PyObject *BPY_rna_module(void)
/* for now, return the base RNA type rather then a real module */
RNA_main_pointer_create(G.main, &ptr);
pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr);
-
+
rna_module_ptr= &pyrna->ptr;
return (PyObject *)pyrna;
}
@@ -4991,13 +5344,13 @@ void BPY_update_rna_module(void)
#if 0
/* This is a way we can access docstrings for RNA types
* without having the datatypes in blender */
-PyObject *BPY_rna_doc( void )
+PyObject *BPY_rna_doc(void)
{
PointerRNA ptr;
-
+
/* for now, return the base RNA type rather then a real module */
RNA_blender_rna_pointer_create(&ptr);
-
+
return pyrna_struct_CreatePyObject(&ptr);
}
#endif
@@ -5006,7 +5359,7 @@ PyObject *BPY_rna_doc( void )
/* pyrna_basetype_* - BPy_BaseTypeRNA is just a BPy_PropertyRNA struct with a differnt type
* the self->ptr and self->prop are always set to the "structs" collection */
//---------------getattr--------------------------------------------
-static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA *self, PyObject *pyname )
+static PyObject *pyrna_basetype_getattro(BPy_BaseTypeRNA *self, PyObject *pyname)
{
PointerRNA newptr;
PyObject *ret;
@@ -5014,7 +5367,7 @@ static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA *self, PyObject *pynam
if(name == NULL) {
PyErr_SetString(PyExc_AttributeError, "bpy.types: __getattr__ must be a string");
- ret = NULL;
+ ret= NULL;
}
else if (RNA_property_collection_lookup_string(&self->ptr, self->prop, name, &newptr)) {
ret= pyrna_struct_Subtype(&newptr);
@@ -5038,7 +5391,7 @@ static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self);
static PyObject *pyrna_register_class(PyObject *self, PyObject *py_class);
static PyObject *pyrna_unregister_class(PyObject *self, PyObject *py_class);
-static struct PyMethodDef pyrna_basetype_methods[] = {
+static struct PyMethodDef pyrna_basetype_methods[]= {
{"__dir__", (PyCFunction)pyrna_basetype_dir, METH_NOARGS, ""},
{NULL, NULL, 0, NULL}
};
@@ -5055,7 +5408,7 @@ static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
#if 0 /* for now only contains __dir__ */
for(meth=pyrna_basetype_methods; meth->ml_name; meth++) {
- name = PyUnicode_FromString(meth->ml_name);
+ name= PyUnicode_FromString(meth->ml_name);
PyList_Append(list, name);
Py_DECREF(name);
}
@@ -5063,28 +5416,28 @@ static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
return list;
}
-static PyTypeObject pyrna_basetype_Type = BLANK_PYTHON_TYPE;
+static PyTypeObject pyrna_basetype_Type= BLANK_PYTHON_TYPE;
PyObject *BPY_rna_types(void)
{
BPy_BaseTypeRNA *self;
- if ((pyrna_basetype_Type.tp_flags & Py_TPFLAGS_READY)==0) {
- pyrna_basetype_Type.tp_name = "RNA_Types";
- pyrna_basetype_Type.tp_basicsize = sizeof(BPy_BaseTypeRNA);
- pyrna_basetype_Type.tp_getattro = ( getattrofunc )pyrna_basetype_getattro;
- pyrna_basetype_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- pyrna_basetype_Type.tp_methods = pyrna_basetype_methods;
-
- if( PyType_Ready( &pyrna_basetype_Type ) < 0 )
+ if ((pyrna_basetype_Type.tp_flags & Py_TPFLAGS_READY)==0) {
+ pyrna_basetype_Type.tp_name= "RNA_Types";
+ pyrna_basetype_Type.tp_basicsize= sizeof(BPy_BaseTypeRNA);
+ pyrna_basetype_Type.tp_getattro= (getattrofunc) pyrna_basetype_getattro;
+ pyrna_basetype_Type.tp_flags= Py_TPFLAGS_DEFAULT;
+ pyrna_basetype_Type.tp_methods= pyrna_basetype_methods;
+
+ if(PyType_Ready(&pyrna_basetype_Type) < 0)
return NULL;
}
-
- self= (BPy_BaseTypeRNA *)PyObject_NEW( BPy_BaseTypeRNA, &pyrna_basetype_Type );
+
+ self= (BPy_BaseTypeRNA *)PyObject_NEW(BPy_BaseTypeRNA, &pyrna_basetype_Type);
/* avoid doing this lookup for every getattr */
RNA_blender_rna_pointer_create(&self->ptr);
- self->prop = RNA_struct_find_property(&self->ptr, "structs");
+ self->prop= RNA_struct_find_property(&self->ptr, "structs");
#ifdef USE_WEAKREFS
self->in_weakreflist= NULL;
#endif
@@ -5093,12 +5446,12 @@ PyObject *BPY_rna_types(void)
StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_prefix)
{
- BPy_StructRNA *py_srna = NULL;
+ BPy_StructRNA *py_srna= NULL;
StructRNA *srna;
-
+
/* ack, PyObject_GetAttrString wont look up this types tp_dict first :/ */
if(PyType_Check(self)) {
- py_srna = (BPy_StructRNA *)PyDict_GetItemString(((PyTypeObject *)self)->tp_dict, "bl_rna");
+ py_srna= (BPy_StructRNA *)PyDict_GetItemString(((PyTypeObject *)self)->tp_dict, "bl_rna");
Py_XINCREF(py_srna);
}
@@ -5106,7 +5459,7 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr
/* be very careful with this since it will return a parent classes srna.
* modifying this will do confusing stuff! */
if(py_srna==NULL)
- py_srna = (BPy_StructRNA*)PyObject_GetAttrString(self, "bl_rna");
+ py_srna= (BPy_StructRNA*)PyObject_GetAttrString(self, "bl_rna");
}
if(py_srna==NULL) {
@@ -5183,15 +5536,15 @@ static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item
PyErr_Format(PyExc_ValueError, "bpy_struct \"%.200s\" registration error: %.200s could not register because the property starts with an '_'\n", RNA_struct_identifier(srna), _PyUnicode_AsString(key));
return -1;
}
- py_srna_cobject = PyCapsule_New(srna, NULL, NULL);
+ py_srna_cobject= PyCapsule_New(srna, NULL, NULL);
/* not 100% nice :/, modifies the dict passed, should be ok */
PyDict_SetItemString(py_kw, "attr", key);
-
+
args_fake= PyTuple_New(1);
PyTuple_SET_ITEM(args_fake, 0, py_srna_cobject);
- py_ret = PyObject_Call(py_func, args_fake, py_kw);
+ py_ret= PyObject_Call(py_func, args_fake, py_kw);
Py_DECREF(args_fake); /* free's py_srna_cobject too */
@@ -5224,7 +5577,7 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
{
PyObject *item, *key;
PyObject *order;
- Py_ssize_t pos = 0;
+ Py_ssize_t pos= 0;
int ret= 0;
/* in both cases PyDict_CheckExact(class_dict) will be true even
@@ -5273,7 +5626,7 @@ static int pyrna_deferred_register_class_recursive(StructRNA *srna, PyTypeObject
!PyObject_IsSubclass((PyObject *)py_superclass, (PyObject *)&pyrna_struct_Type)
) {
ret= pyrna_deferred_register_class_recursive(srna, py_superclass);
-
+
if(ret != 0) {
return ret;
}
@@ -5281,7 +5634,7 @@ static int pyrna_deferred_register_class_recursive(StructRNA *srna, PyTypeObject
}
/* not register out own properties */
- return pyrna_deferred_register_props(srna, py_class->tp_dict); /* getattr(..., "__dict__") returns a proxy */
+ return pyrna_deferred_register_props(srna, py_class->tp_dict); /* getattr(..., "__dict__") returns a proxy */
}
int pyrna_deferred_register_class(StructRNA *srna, PyObject *py_class)
@@ -5308,7 +5661,7 @@ static int rna_function_arg_count(FunctionRNA *func)
if(!(RNA_property_flag(parm) & PROP_OUTPUT))
count++;
}
-
+
return count;
}
@@ -5325,7 +5678,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
PyObject *item;
PyObject *py_arg_count;
int i, flag, arg_count, func_arg_count;
- const char *py_class_name = ((PyTypeObject *)py_class)->tp_name; // __name__
+ const char *py_class_name= ((PyTypeObject *)py_class)->tp_name; // __name__
if (base_class) {
@@ -5345,7 +5698,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
if(!(flag & FUNC_REGISTER))
continue;
- item = PyObject_GetAttrString(py_class, RNA_function_identifier(func));
+ item= PyObject_GetAttrString(py_class, RNA_function_identifier(func));
have_function[i]= (item != NULL);
i++;
@@ -5377,8 +5730,8 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
func_arg_count= rna_function_arg_count(func);
if (func_arg_count >= 0) { /* -1 if we dont care*/
- py_arg_count = PyObject_GetAttrString(PyFunction_GET_CODE(item), "co_argcount");
- arg_count = PyLong_AsLong(py_arg_count);
+ py_arg_count= PyObject_GetAttrString(PyFunction_GET_CODE(item), "co_argcount");
+ arg_count= PyLong_AsLong(py_arg_count);
Py_DECREF(py_arg_count);
/* note, the number of args we check for and the number of args we give to
@@ -5405,7 +5758,7 @@ static int bpy_class_validate(PointerRNA *dummyptr, void *py_data, int *have_fun
continue;
identifier= RNA_property_identifier(prop);
- item = PyObject_GetAttrString(py_class, identifier);
+ item= PyObject_GetAttrString(py_class, identifier);
if (item==NULL) {
/* Sneaky workaround to use the class name as the bl_idname */
@@ -5457,7 +5810,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
ParameterIterator iter;
PointerRNA funcptr;
int err= 0, i, flag, ret_len=0;
- int is_static = RNA_function_flag(func) & FUNC_NO_SELF;
+ int is_static= RNA_function_flag(func) & FUNC_NO_SELF;
PropertyRNA *pret_single= NULL;
void *retdata_single= NULL;
@@ -5469,9 +5822,9 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
/* testing, for correctness, not operator and not draw function */
const short is_readonly= strstr("draw", func_id) || /*strstr("render", func_id) ||*/ !RNA_struct_is_a(ptr->type, &RNA_Operator);
#endif
-
+
py_class= RNA_struct_py_type_get(ptr->type);
-
+
/* rare case. can happen when registering subclasses */
if(py_class==NULL) {
fprintf(stderr, "bpy_class_call(): unable to get python class for rna struct '%.200s'\n", RNA_struct_identifier(ptr->type));
@@ -5501,19 +5854,19 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
}
}
/* end exception */
-
+
if(py_class_instance==NULL)
py_srna= pyrna_struct_CreatePyObject(ptr);
-
+
if(py_class_instance) {
/* special case, instance is cached */
}
else if(py_srna == NULL) {
- py_class_instance = NULL;
+ py_class_instance= NULL;
}
else if(py_srna == Py_None) { /* probably wont ever happen but possible */
Py_DECREF(py_srna);
- py_class_instance = NULL;
+ py_class_instance= NULL;
}
else {
#if 1
@@ -5523,10 +5876,10 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
*/
if(py_class->tp_init) {
/* true in most cases even when the class its self doesnt define an __init__ function. */
- args = PyTuple_New(0);
- if (py_class->tp_init(py_srna, args, NULL) < 0) {
- Py_DECREF(py_srna);
- py_srna= NULL;
+ args= PyTuple_New(0);
+ if (py_class->tp_init(py_srna, args, NULL) < 0) {
+ Py_DECREF(py_srna);
+ py_srna= NULL;
/* err set below */
}
Py_DECREF(args);
@@ -5537,23 +5890,23 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
#else
/* 'almost' all the time calling the class isnt needed.
* We could just do...
- py_class_instance = py_srna;
+ py_class_instance= py_srna;
Py_INCREF(py_class_instance);
* This would work fine but means __init__ functions wouldnt run.
* none of blenders default scripts use __init__ but its nice to call it
* for general correctness. just to note why this is here when it could be safely removed.
*/
- args = PyTuple_New(1);
+ args= PyTuple_New(1);
PyTuple_SET_ITEM(args, 0, py_srna);
py_class_instance= PyObject_Call(py_class, args, NULL);
Py_DECREF(args);
-#endif
+#endif
if(py_class_instance == NULL) {
err= -1; /* so the error is not overridden below */
}
else if(py_class_instance_store) {
- *py_class_instance_store = py_class_instance;
+ *py_class_instance_store= py_class_instance;
Py_INCREF(py_class_instance);
}
}
@@ -5566,8 +5919,8 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
if(item) {
RNA_pointer_create(NULL, &RNA_Function, func, &funcptr);
- args = PyTuple_New(rna_function_arg_count(func)); /* first arg is included in 'item' */
-
+ args= PyTuple_New(rna_function_arg_count(func)); /* first arg is included in 'item' */
+
if(is_static) {
i= 0;
}
@@ -5600,11 +5953,11 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
}
#ifdef USE_PEDANTIC_WRITE
- rna_disallow_writes= is_readonly ? TRUE:FALSE;
+ rna_disallow_writes= is_readonly ? TRUE:FALSE;
#endif
/* *** Main Caller *** */
-
- ret = PyObject_Call(item, args, NULL);
+
+ ret= PyObject_Call(item, args, NULL);
/* *** Done Calling *** */
@@ -5695,7 +6048,7 @@ static int bpy_class_call(bContext *C, PointerRNA *ptr, FunctionRNA *func, Param
}
bpy_context_clear(C, &gilstate);
-
+
return err;
}
@@ -5704,7 +6057,7 @@ static void bpy_class_free(void *pyob_ptr)
PyObject *self= (PyObject *)pyob_ptr;
PyGILState_STATE gilstate;
- gilstate = PyGILState_Ensure();
+ gilstate= PyGILState_Ensure();
// breaks re-registering classes
// PyDict_Clear(((PyTypeObject*)self)->tp_dict);
@@ -5732,12 +6085,12 @@ void pyrna_alloc_types(void)
PointerRNA ptr;
PropertyRNA *prop;
-
- gilstate = PyGILState_Ensure();
+
+ gilstate= PyGILState_Ensure();
/* avoid doing this lookup for every getattr */
RNA_blender_rna_pointer_create(&ptr);
- prop = RNA_struct_find_property(&ptr, "structs");
+ prop= RNA_struct_find_property(&ptr, "structs");
RNA_PROP_BEGIN(&ptr, itemptr, prop) {
PyObject *item= pyrna_struct_Subtype(&itemptr);
@@ -5764,7 +6117,7 @@ void pyrna_free_types(void)
/* avoid doing this lookup for every getattr */
RNA_blender_rna_pointer_create(&ptr);
- prop = RNA_struct_find_property(&ptr, "structs");
+ prop= RNA_struct_find_property(&ptr, "structs");
RNA_PROP_BEGIN(&ptr, itemptr, prop) {
@@ -5796,10 +6149,12 @@ static char pyrna_register_class_doc[] =
"\n"
" Register a subclass of a blender type in (:class:`Panel`, :class:`Menu`, :class:`Header`, :class:`Operator`, :class:`KeyingSetInfo`, :class:`RenderEngine`).\n"
"\n"
+" If the class has a *register* class method it will be called before registration.\n"
+"\n"
" .. note:: :exc:`ValueError` exception is raised if the class is not a subclass of a registerable blender class.\n"
"\n"
;
-PyMethodDef meth_bpy_register_class = {"register_class", pyrna_register_class, METH_O, pyrna_register_class_doc};
+PyMethodDef meth_bpy_register_class= {"register_class", pyrna_register_class, METH_O, pyrna_register_class_doc};
static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class)
{
bContext *C= NULL;
@@ -5808,6 +6163,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
StructRNA *srna;
StructRNA *srna_new;
const char *identifier;
+ PyObject *py_cls_meth;
if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")) {
PyErr_SetString(PyExc_AttributeError, "register_class(...): already registered as a subclass");
@@ -5818,7 +6174,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
srna= pyrna_struct_as_srna(py_class, 1, "register_class(...):");
if(srna==NULL)
return NULL;
-
+
/* fails in cases, cant use this check but would like to :| */
/*
if(RNA_struct_py_type_get(srna)) {
@@ -5834,7 +6190,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
PyErr_Format(PyExc_ValueError, "register_class(...): expected a subclass of a registerable rna type (%.200s does not support registration)", RNA_struct_identifier(srna));
return NULL;
}
-
+
/* get the context, so register callback can do necessary refreshes */
C= BPy_GetContext();
@@ -5845,7 +6201,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
srna_new= reg(C, &reports, py_class, identifier, bpy_class_validate, bpy_class_call, bpy_class_free);
- if(BPy_reports_to_error(&reports, TRUE))
+ if(BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE) == -1)
return NULL;
/* python errors validating are not converted into reports so the check above will fail.
@@ -5855,7 +6211,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
pyrna_subtype_set_rna(py_class, srna_new); /* takes a ref to py_class */
- /* old srna still references us, keep the check incase registering somehow can free it */
+ /* old srna still references us, keep the check incase registering somehow can free it */
if(RNA_struct_py_type_get(srna)) {
RNA_struct_py_type_set(srna, NULL);
// Py_DECREF(py_class); // shuld be able to do this XXX since the old rna adds a new ref.
@@ -5868,6 +6224,21 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
if(pyrna_deferred_register_class(srna_new, py_class)!=0)
return NULL;
+ /* call classed register method () */
+ py_cls_meth= PyObject_GetAttrString(py_class, "register");
+ if(py_cls_meth == NULL) {
+ PyErr_Clear();
+ }
+ else {
+ PyObject *ret= PyObject_CallObject(py_cls_meth, NULL);
+ if(ret) {
+ Py_DECREF(ret);
+ }
+ else {
+ return NULL;
+ }
+ }
+
Py_RETURN_NONE;
}
@@ -5900,13 +6271,16 @@ static char pyrna_unregister_class_doc[] =
".. method:: unregister_class(cls)\n"
"\n"
" Unload the python class from blender.\n"
+"\n"
+" If the class has an *unregister* class method it will be called before unregistering.\n"
;
-PyMethodDef meth_bpy_unregister_class = {"unregister_class", pyrna_unregister_class, METH_O, pyrna_unregister_class_doc};
+PyMethodDef meth_bpy_unregister_class= {"unregister_class", pyrna_unregister_class, METH_O, pyrna_unregister_class_doc};
static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_class)
{
bContext *C= NULL;
StructUnregisterFunc unreg;
StructRNA *srna;
+ PyObject *py_cls_meth;
/*if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")==NULL) {
PWM_cursor_wait(0);
@@ -5917,7 +6291,7 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
srna= pyrna_struct_as_srna(py_class, 0, "unregister_class(...):");
if(srna==NULL)
return NULL;
-
+
/* check that we have a unregister callback for this type */
unreg= RNA_struct_unregister(srna);
@@ -5925,7 +6299,22 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
PyErr_SetString(PyExc_ValueError, "unregister_class(...): expected a Type subclassed from a registerable rna type (no unregister supported)");
return NULL;
}
-
+
+ /* call classed unregister method */
+ py_cls_meth= PyObject_GetAttrString(py_class, "unregister");
+ if(py_cls_meth == NULL) {
+ PyErr_Clear();
+ }
+ else {
+ PyObject *ret= PyObject_CallObject(py_cls_meth, NULL);
+ if(ret) {
+ Py_DECREF(ret);
+ }
+ else {
+ return NULL;
+ }
+ }
+
/* should happen all the time but very slow */
if(G.f & G_DEBUG) {
/* remove all properties using this class */
@@ -5935,25 +6324,25 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
const char *prop_identifier= NULL;
RNA_blender_rna_pointer_create(&ptr_rna);
- prop_rna = RNA_struct_find_property(&ptr_rna, "structs");
-
-
-
+ prop_rna= RNA_struct_find_property(&ptr_rna, "structs");
+
+
+
/* loop over all structs */
RNA_PROP_BEGIN(&ptr_rna, itemptr, prop_rna) {
- srna_iter = itemptr.data;
+ srna_iter= itemptr.data;
if(pyrna_srna_contains_pointer_prop_srna(srna_iter, srna, &prop_identifier)) {
break;
}
}
RNA_PROP_END;
-
+
if(prop_identifier) {
PyErr_Format(PyExc_RuntimeError, "unregister_class(...): can't unregister %s because %s.%s pointer property is using this", RNA_struct_identifier(srna), RNA_struct_identifier(srna_iter), prop_identifier);
return NULL;
- }
+ }
}
-
+
/* get the context, so register callback can do necessary refreshes */
C= BPy_GetContext();
diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h
index f04e1e8ca32..e9969277550 100644
--- a/source/blender/python/intern/bpy_rna.h
+++ b/source/blender/python/intern/bpy_rna.h
@@ -21,14 +21,52 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/intern/bpy_rna.h
+ * \ingroup pythonintern
+ */
+
#ifndef BPY_RNA_H
#define BPY_RNA_H
-#include "RNA_access.h"
-#include "RNA_types.h"
-#include "BKE_idprop.h"
+/* --- bpy build options --- */
+#ifdef WITH_PYTHON_SAFETY
#include <Python.h>
+/* play it safe and keep optional for now, need to test further now this affects looping on 10000's of verts for eg. */
+#define USE_WEAKREFS
+
+/* method to invalidate removed py data, XXX, slow to remove objects, otherwise no overhead */
+/* #define USE_PYRNA_INVALIDATE_GC */
+
+/* different method */
+#define USE_PYRNA_INVALIDATE_WEAKREF
+
+/* support for inter references, currently only needed for corner case */
+#define USE_PYRNA_STRUCT_REFERENCE
+
+/* use real collection iterators rather then faking with a list */
+#define USE_PYRNA_ITER
+
+#else /* WITH_PYTHON_SAFETY */
+
+ /* default, no defines! */
+
+#endif /* !WITH_PYTHON_SAFETY */
+
+
+/* sanity checks on above defs */
+#if defined(USE_PYRNA_INVALIDATE_WEAKREF) && !defined(USE_WEAKREFS)
+#define USE_WEAKREFS
+#endif
+
+#if defined(USE_PYRNA_INVALIDATE_GC) && defined(USE_PYRNA_INVALIDATE_WEAKREF)
+#error "Only 1 reference check method at a time!"
+#endif
+/* --- end bpy build options --- */
+
+struct ID;
+
extern PyTypeObject pyrna_struct_meta_idprop_Type;
extern PyTypeObject pyrna_struct_Type;
extern PyTypeObject pyrna_prop_Type;
@@ -40,47 +78,70 @@ extern PyTypeObject pyrna_prop_collection_Type;
#define BPy_PropertyRNA_Check(v) (PyObject_TypeCheck(v, &pyrna_prop_Type))
#define BPy_PropertyRNA_CheckExact(v) (Py_TYPE(v) == &pyrna_prop_Type)
-/* play it safe and keep optional for now, need to test further now this affects looping on 10000's of verts for eg. */
-// #define USE_WEAKREFS
+#define PYRNA_STRUCT_CHECK_OBJ(obj) if(pyrna_struct_validity_check(obj) == -1) { return NULL; }
+#define PYRNA_STRUCT_CHECK_INT(obj) if(pyrna_struct_validity_check(obj) == -1) { return -1; }
+
+#define PYRNA_PROP_CHECK_OBJ(obj) if(pyrna_prop_validity_check(obj) == -1) { return NULL; }
+#define PYRNA_PROP_CHECK_INT(obj) if(pyrna_prop_validity_check(obj) == -1) { return -1; }
+
+#define PYRNA_STRUCT_IS_VALID(pysrna) (((BPy_StructRNA *)(pysrna))->ptr.type != NULL)
+#define PYRNA_PROP_IS_VALID(pysrna) (((BPy_PropertyRNA *)(pysrna))->ptr.type != NULL)
+
+/* 'in_weakreflist' MUST be aligned */
typedef struct {
PyObject_HEAD /* required python macro */
- PointerRNA ptr;
#ifdef USE_WEAKREFS
PyObject *in_weakreflist;
#endif
+ PointerRNA ptr;
} BPy_DummyPointerRNA;
typedef struct {
PyObject_HEAD /* required python macro */
- PointerRNA ptr;
- int freeptr; /* needed in some cases if ptr.data is created on the fly, free when deallocing */
#ifdef USE_WEAKREFS
PyObject *in_weakreflist;
#endif
+ PointerRNA ptr;
+#ifdef USE_PYRNA_STRUCT_REFERENCE
+ /* generic PyObject we hold a reference to, example use:
+ * hold onto the collection iterator to prevent it from freeing allocated data we may use */
+ PyObject *reference;
+#endif /* !USE_PYRNA_STRUCT_REFERENCE */
+ int freeptr; /* needed in some cases if ptr.data is created on the fly, free when deallocing */
} BPy_StructRNA;
typedef struct {
PyObject_HEAD /* required python macro */
- PointerRNA ptr;
- PropertyRNA *prop;
#ifdef USE_WEAKREFS
PyObject *in_weakreflist;
#endif
+ PointerRNA ptr;
+ PropertyRNA *prop;
} BPy_PropertyRNA;
typedef struct {
PyObject_HEAD /* required python macro */
+#ifdef USE_WEAKREFS
+ PyObject *in_weakreflist;
+#endif
PointerRNA ptr;
PropertyRNA *prop;
/* Arystan: this is a hack to allow sub-item r/w access like: face.uv[n][m] */
int arraydim; /* array dimension, e.g: 0 for face.uv, 2 for face.uv[n][m], etc. */
int arrayoffset; /* array first item offset, e.g. if face.uv is [4][2], arrayoffset for face.uv[n] is 2n */
+} BPy_PropertyArrayRNA;
+
+typedef struct {
+ PyObject_HEAD /* required python macro */
#ifdef USE_WEAKREFS
PyObject *in_weakreflist;
#endif
-} BPy_PropertyArrayRNA;
+
+ /* collection iterator spesific parts */
+ CollectionPropertyIterator iter;
+} BPy_PropertyCollectionIterRNA;
/* cheap trick */
#define BPy_BaseTypeRNA BPy_PropertyRNA
@@ -124,10 +185,15 @@ int pyrna_array_contains_py(PointerRNA *ptr, PropertyRNA *prop, PyObject *value)
int pyrna_write_check(void);
+int pyrna_struct_validity_check(BPy_StructRNA *pysrna);
+int pyrna_prop_validity_check(BPy_PropertyRNA *self);
+
void BPY_modules_update(struct bContext *C); //XXX temp solution
/* bpy.utils.(un)register_class */
extern PyMethodDef meth_bpy_register_class;
extern PyMethodDef meth_bpy_unregister_class;
+void BPY_id_release(struct ID *id);
+
#endif
diff --git a/source/blender/python/intern/bpy_rna_anim.c b/source/blender/python/intern/bpy_rna_anim.c
new file mode 100644
index 00000000000..b7f638b6441
--- /dev/null
+++ b/source/blender/python/intern/bpy_rna_anim.c
@@ -0,0 +1,354 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/bpy_rna_anim.c
+ * \ingroup pythonintern
+ */
+
+#include <Python.h>
+#include <float.h> /* FLT_MIN/MAX */
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_string.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_anim_types.h"
+#include "ED_keyframing.h"
+
+#include "BKE_report.h"
+#include "BKE_context.h"
+#include "BKE_animsys.h"
+#include "BKE_fcurve.h"
+
+#include "RNA_access.h"
+
+#include "bpy_rna.h"
+#include "bpy_util.h"
+#include "bpy_rna_anim.h"
+
+#define TRUE 1
+#define FALSE 0
+
+/* for keyframes and drivers */
+static int pyrna_struct_anim_args_parse(PointerRNA *ptr, const char *error_prefix, const char *path,
+ const char **path_full, int *index)
+{
+ const int is_idbase= RNA_struct_is_ID(ptr->type);
+ PropertyRNA *prop;
+ PointerRNA r_ptr;
+
+ if (ptr->data==NULL) {
+ PyErr_Format(PyExc_TypeError, "%.200s this struct has no data, can't be animated", error_prefix);
+ return -1;
+ }
+
+ /* full paths can only be given from ID base */
+ if(is_idbase) {
+ int r_index= -1;
+ if(RNA_path_resolve_full(ptr, path, &r_ptr, &prop, &r_index)==0) {
+ prop= NULL;
+ }
+ else if(r_index != -1) {
+ PyErr_Format(PyExc_ValueError, "%.200s path includes index, must be a separate argument", error_prefix, path);
+ return -1;
+ }
+ else if(ptr->id.data != r_ptr.id.data) {
+ PyErr_Format(PyExc_ValueError, "%.200s path spans ID blocks", error_prefix, path);
+ return -1;
+ }
+ }
+ else {
+ prop= RNA_struct_find_property(ptr, path);
+ r_ptr= *ptr;
+ }
+
+ if (prop==NULL) {
+ PyErr_Format(PyExc_TypeError, "%.200s property \"%s\" not found", error_prefix, path);
+ return -1;
+ }
+
+ if (!RNA_property_animateable(&r_ptr, prop)) {
+ PyErr_Format(PyExc_TypeError, "%.200s property \"%s\" not animatable", error_prefix, path);
+ return -1;
+ }
+
+ if(RNA_property_array_check(&r_ptr, prop) == 0) {
+ if((*index) == -1) {
+ *index= 0;
+ }
+ else {
+ PyErr_Format(PyExc_TypeError, "%.200s index %d was given while property \"%s\" is not an array", error_prefix, *index, path);
+ return -1;
+ }
+ }
+ else {
+ int array_len= RNA_property_array_length(&r_ptr, prop);
+ if((*index) < -1 || (*index) >= array_len) {
+ PyErr_Format(PyExc_TypeError, "%.200s index out of range \"%s\", given %d, array length is %d", error_prefix, path, *index, array_len);
+ return -1;
+ }
+ }
+
+ if(is_idbase) {
+ *path_full= BLI_strdup(path);
+ }
+ else {
+ *path_full= RNA_path_from_ID_to_property(&r_ptr, prop);
+
+ if (*path_full==NULL) {
+ PyErr_Format(PyExc_TypeError, "%.200s could not make path to \"%s\"", error_prefix, path);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+/* internal use for insert and delete */
+static int pyrna_struct_keyframe_parse(PointerRNA *ptr, PyObject *args, PyObject *kw, const char *parse_str, const char *error_prefix,
+ const char **path_full, int *index, float *cfra, const char **group_name) /* return values */
+{
+ static const char *kwlist[]= {"data_path", "index", "frame", "group", NULL};
+ const char *path;
+
+ /* note, parse_str MUST start with 's|ifs' */
+ if (!PyArg_ParseTupleAndKeywords(args, kw, parse_str, (char **)kwlist, &path, index, cfra, group_name))
+ return -1;
+
+ if(pyrna_struct_anim_args_parse(ptr, error_prefix, path, path_full, index) < 0)
+ return -1;
+
+ if(*cfra==FLT_MAX)
+ *cfra= CTX_data_scene(BPy_GetContext())->r.cfra;
+
+ return 0; /* success */
+}
+
+char pyrna_struct_keyframe_insert_doc[] =
+".. method:: keyframe_insert(data_path, index=-1, frame=bpy.context.scene.frame_current, group=\"\")\n"
+"\n"
+" Insert a keyframe on the property given, adding fcurves and animation data when necessary.\n"
+"\n"
+" :arg data_path: path to the property to key, analogous to the fcurve's data path.\n"
+" :type data_path: string\n"
+" :arg index: array index of the property to key. Defaults to -1 which will key all indices or a single channel if the property is not an array.\n"
+" :type index: int\n"
+" :arg frame: The frame on which the keyframe is inserted, defaulting to the current frame.\n"
+" :type frame: float\n"
+" :arg group: The name of the group the F-Curve should be added to if it doesn't exist yet.\n"
+" :type group: str\n"
+" :return: Success of keyframe insertion.\n"
+" :rtype: boolean\n"
+;
+PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyObject *kw)
+{
+ /* args, pyrna_struct_keyframe_parse handles these */
+ const char *path_full= NULL;
+ int index= -1;
+ float cfra= FLT_MAX;
+ const char *group_name= NULL;
+
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
+ if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_insert()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) {
+ return NULL;
+ }
+ else {
+ short result;
+ ReportList reports;
+
+ BKE_reports_init(&reports, RPT_STORE);
+
+ result= insert_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
+ MEM_freeN((void *)path_full);
+
+ if(BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE) == -1)
+ return NULL;
+
+ return PyBool_FromLong(result);
+ }
+}
+
+char pyrna_struct_keyframe_delete_doc[] =
+".. method:: keyframe_delete(data_path, index=-1, frame=bpy.context.scene.frame_current, group=\"\")\n"
+"\n"
+" Remove a keyframe from this properties fcurve.\n"
+"\n"
+" :arg data_path: path to the property to remove a key, analogous to the fcurve's data path.\n"
+" :type data_path: string\n"
+" :arg index: array index of the property to remove a key. Defaults to -1 removing all indices or a single channel if the property is not an array.\n"
+" :type index: int\n"
+" :arg frame: The frame on which the keyframe is deleted, defaulting to the current frame.\n"
+" :type frame: float\n"
+" :arg group: The name of the group the F-Curve should be added to if it doesn't exist yet.\n"
+" :type group: str\n"
+" :return: Success of keyframe deleation.\n"
+" :rtype: boolean\n"
+;
+PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args, PyObject *kw)
+{
+ /* args, pyrna_struct_keyframe_parse handles these */
+ const char *path_full= NULL;
+ int index= -1;
+ float cfra= FLT_MAX;
+ const char *group_name= NULL;
+
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
+ if(pyrna_struct_keyframe_parse(&self->ptr, args, kw, "s|ifs:bpy_struct.keyframe_delete()", "bpy_struct.keyframe_insert()", &path_full, &index, &cfra, &group_name) == -1) {
+ return NULL;
+ }
+ else {
+ short result;
+ ReportList reports;
+
+ BKE_reports_init(&reports, RPT_STORE);
+
+ result= delete_keyframe(&reports, (ID *)self->ptr.id.data, NULL, group_name, path_full, index, cfra, 0);
+ MEM_freeN((void *)path_full);
+
+ if(BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE) == -1)
+ return NULL;
+
+ return PyBool_FromLong(result);
+ }
+
+}
+
+char pyrna_struct_driver_add_doc[] =
+".. method:: driver_add(path, index=-1)\n"
+"\n"
+" Adds driver(s) to the given property\n"
+"\n"
+" :arg path: path to the property to drive, analogous to the fcurve's data path.\n"
+" :type path: string\n"
+" :arg index: array index of the property drive. Defaults to -1 for all indices or a single channel if the property is not an array.\n"
+" :type index: int\n"
+" :return: The driver(s) added.\n"
+" :rtype: :class:`FCurve` or list if index is -1 with an array property.\n"
+;
+PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args)
+{
+ const char *path, *path_full;
+ int index= -1;
+
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
+ if (!PyArg_ParseTuple(args, "s|i:driver_add", &path, &index))
+ return NULL;
+
+ if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_add():", path, &path_full, &index) < 0) {
+ return NULL;
+ }
+ else {
+ PyObject *ret= NULL;
+ ReportList reports;
+ int result;
+
+ BKE_reports_init(&reports, RPT_STORE);
+
+ result= ANIM_add_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0, DRIVER_TYPE_PYTHON);
+
+ if(BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE) == -1)
+ return NULL;
+
+ if(result) {
+ ID *id= self->ptr.id.data;
+ AnimData *adt= BKE_animdata_from_id(id);
+ FCurve *fcu;
+
+ PointerRNA tptr;
+ PyObject *item;
+
+ if(index == -1) { /* all, use a list */
+ int i= 0;
+ ret= PyList_New(0);
+ while((fcu= list_find_fcurve(&adt->drivers, path_full, i++))) {
+ RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
+ item= pyrna_struct_CreatePyObject(&tptr);
+ PyList_Append(ret, item);
+ Py_DECREF(item);
+ }
+ }
+ else {
+ fcu= list_find_fcurve(&adt->drivers, path_full, index);
+ RNA_pointer_create(id, &RNA_FCurve, fcu, &tptr);
+ ret= pyrna_struct_CreatePyObject(&tptr);
+ }
+ }
+ else {
+ /* XXX, should be handled by reports, */
+ PyErr_SetString(PyExc_TypeError, "bpy_struct.driver_add(): failed because of an internal error");
+ return NULL;
+ }
+
+ MEM_freeN((void *)path_full);
+
+ return ret;
+ }
+}
+
+
+char pyrna_struct_driver_remove_doc[] =
+".. method:: driver_remove(path, index=-1)\n"
+"\n"
+" Remove driver(s) from the given property\n"
+"\n"
+" :arg path: path to the property to drive, analogous to the fcurve's data path.\n"
+" :type path: string\n"
+" :arg index: array index of the property drive. Defaults to -1 for all indices or a single channel if the property is not an array.\n"
+" :type index: int\n"
+" :return: Success of driver removal.\n"
+" :rtype: boolean\n"
+;
+PyObject *pyrna_struct_driver_remove(BPy_StructRNA *self, PyObject *args)
+{
+ const char *path, *path_full;
+ int index= -1;
+
+ PYRNA_STRUCT_CHECK_OBJ(self)
+
+ if (!PyArg_ParseTuple(args, "s|i:driver_remove", &path, &index))
+ return NULL;
+
+ if(pyrna_struct_anim_args_parse(&self->ptr, "bpy_struct.driver_remove():", path, &path_full, &index) < 0) {
+ return NULL;
+ }
+ else {
+ short result;
+ ReportList reports;
+
+ BKE_reports_init(&reports, RPT_STORE);
+
+ result= ANIM_remove_driver(&reports, (ID *)self->ptr.id.data, path_full, index, 0);
+
+ MEM_freeN((void *)path_full);
+
+ if(BPy_reports_to_error(&reports, PyExc_RuntimeError, TRUE) == -1)
+ return NULL;
+
+ return PyBool_FromLong(result);
+ }
+}
diff --git a/source/blender/python/intern/bpy_rna_anim.h b/source/blender/python/intern/bpy_rna_anim.h
new file mode 100644
index 00000000000..8dc31e9cf83
--- /dev/null
+++ b/source/blender/python/intern/bpy_rna_anim.h
@@ -0,0 +1,37 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/bpy_rna_anim.h
+ * \ingroup pythonintern
+ */
+
+extern char pyrna_struct_keyframe_insert_doc[];
+extern char pyrna_struct_keyframe_delete_doc[];
+extern char pyrna_struct_driver_add_doc[];
+extern char pyrna_struct_driver_remove_doc[];
+
+PyObject *pyrna_struct_keyframe_insert(BPy_StructRNA *self, PyObject *args, PyObject *kw);
+PyObject *pyrna_struct_keyframe_delete(BPy_StructRNA *self, PyObject *args, PyObject *kw);
+PyObject *pyrna_struct_driver_add(BPy_StructRNA *self, PyObject *args);
+PyObject *pyrna_struct_driver_remove(BPy_StructRNA *self, PyObject *args);
diff --git a/source/blender/python/intern/bpy_rna_array.c b/source/blender/python/intern/bpy_rna_array.c
index 74ce5f66cfd..df295e812be 100644
--- a/source/blender/python/intern/bpy_rna_array.c
+++ b/source/blender/python/intern/bpy_rna_array.c
@@ -21,12 +21,21 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/python/intern/bpy_rna_array.c
+ * \ingroup pythonintern
+ */
+
#include <Python.h>
+#include "RNA_types.h"
+
#include "bpy_rna.h"
#include "BKE_global.h"
#include "MEM_guardedalloc.h"
+#include "RNA_access.h"
+
#define MAX_ARRAY_DIMENSION 10
typedef void (*ItemConvertFunc)(PyObject *, char *);
@@ -40,7 +49,7 @@ typedef void (*RNA_SetIndexFunc)(PointerRNA *, PropertyRNA *, int index, void *)
*/
/*
- arr[2] = x
+ arr[2]= x
py_to_array_index(arraydim=0, arrayoffset=0, index=2)
validate_array(lvalue_dim=0)
@@ -58,6 +67,10 @@ static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[]
if (dim + 1 < totdim) {
/* check that a sequence contains dimsize[dim] items */
const int seq_size= PySequence_Size(seq);
+ if(seq_size == -1) {
+ PyErr_Format(PyExc_ValueError, "%s sequence expected at dimension %d, not %s", error_prefix, (int)dim + 1, Py_TYPE(seq)->tp_name);
+ return 0;
+ }
for (i= 0; i < seq_size; i++) {
PyObject *item;
int ok= 1;
@@ -91,6 +104,10 @@ static int validate_array_type(PyObject *seq, int dim, int totdim, int dimsize[]
else {
/* check that items are of correct type */
const int seq_size= PySequence_Size(seq);
+ if(seq_size == -1) {
+ PyErr_Format(PyExc_ValueError, "%s sequence expected at dimension %d, not %s", error_prefix, (int)dim + 1, Py_TYPE(seq)->tp_name);
+ return 0;
+ }
for (i= 0; i < seq_size; i++) {
PyObject *item= PySequence_GetItem(seq, i);
@@ -137,7 +154,7 @@ static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA
int tot, totdim, len;
totdim= RNA_property_array_dimension(ptr, prop, dimsize);
- tot= count_items(rvalue, totdim);
+ tot= count_items(rvalue, totdim - lvalue_dim);
if ((RNA_property_flag(prop) & PROP_DYNAMIC) && lvalue_dim == 0) {
if (RNA_property_array_length(ptr, prop) != tot) {
@@ -170,16 +187,16 @@ static int validate_array_length(PyObject *rvalue, PointerRNA *ptr, PropertyRNA
/* arr[3][4][5]
- arr[2] = x
+ arr[2]= x
dimsize={4, 5}
- dimsize[1] = 4
- dimsize[2] = 5
+ dimsize[1]= 4
+ dimsize[2]= 5
lvalue_dim=0, totdim=3
- arr[2][3] = x
+ arr[2][3]= x
lvalue_dim=1
- arr[2][3][4] = x
+ arr[2][3][4]= x
lvalue_dim=2 */
for (i= lvalue_dim; i < totdim; i++)
len *= dimsize[i];
@@ -217,7 +234,7 @@ static char *copy_value_single(PyObject *item, PointerRNA *ptr, PropertyRNA *pro
convert_item(item, value);
rna_set_index(ptr, prop, *index, value);
- *index = *index + 1;
+ *index= *index + 1;
}
else {
convert_item(item, data);
@@ -233,6 +250,8 @@ static char *copy_values(PyObject *seq, PointerRNA *ptr, PropertyRNA *prop, int
int totdim= RNA_property_array_dimension(ptr, prop, NULL);
const int seq_size= PySequence_Size(seq);
+ assert(seq_size != -1);
+
for (i= 0; i < seq_size; i++) {
PyObject *item= PySequence_GetItem(seq, i);
@@ -301,11 +320,11 @@ static int py_to_array_index(PyObject *py, PointerRNA *ptr, PropertyRNA *prop, i
/* arr[3][4][5]
- arr[2] = x
- lvalue_dim=0, index = 0 + 2 * 4 * 5
+ arr[2]= x
+ lvalue_dim=0, index= 0 + 2 * 4 * 5
- arr[2][3] = x
- lvalue_dim=1, index = 40 + 3 * 5 */
+ arr[2][3]= x
+ lvalue_dim=1, index= 40 + 3 * 5 */
lvalue_dim++;
@@ -485,7 +504,7 @@ PyObject *pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr,
BPy_PropertyArrayRNA *ret= NULL;
arraydim= self ? self->arraydim : 0;
- arrayoffset = self ? self->arrayoffset : 0;
+ arrayoffset= self ? self->arrayoffset : 0;
/* just in case check */
len= RNA_property_multi_array_length(ptr, prop, arraydim);
@@ -505,11 +524,11 @@ PyObject *pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr,
/* arr[3][4][5]
- x = arr[2]
- index = 0 + 2 * 4 * 5
+ x= arr[2]
+ index= 0 + 2 * 4 * 5
- x = arr[2][3]
- index = offset + 3 * 5 */
+ x= arr[2][3]
+ index= offset + 3 * 5 */
for (i= arraydim + 1; i < totdim; i++)
index *= dimsize[i];
@@ -517,7 +536,7 @@ PyObject *pyrna_py_from_array_index(BPy_PropertyArrayRNA *self, PointerRNA *ptr,
ret->arrayoffset= arrayoffset + index;
}
else {
- index = arrayoffset + index;
+ index= arrayoffset + index;
ret= (BPy_PropertyArrayRNA *)pyrna_array_index(ptr, prop, index);
}
diff --git a/source/blender/python/intern/bpy_rna_callback.c b/source/blender/python/intern/bpy_rna_callback.c
index a455a588c04..20f5c6c522e 100644
--- a/source/blender/python/intern/bpy_rna_callback.c
+++ b/source/blender/python/intern/bpy_rna_callback.c
@@ -22,8 +22,15 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_rna_callback.c
+ * \ingroup pythonintern
+ */
+
+
#include <Python.h>
+#include "RNA_types.h"
+
#include "bpy_rna.h"
#include "bpy_rna_callback.h"
#include "bpy_util.h"
@@ -32,6 +39,8 @@
#include "DNA_screen_types.h"
+#include "RNA_access.h"
+
#include "BKE_context.h"
#include "ED_space_api.h"
@@ -48,7 +57,7 @@ static void cb_region_draw(const bContext *C, ARegion *UNUSED(ar), void *customd
cb_func= PyTuple_GET_ITEM((PyObject *)customdata, 0);
cb_args= PyTuple_GET_ITEM((PyObject *)customdata, 1);
- result = PyObject_CallObject(cb_func, cb_args);
+ result= PyObject_CallObject(cb_func, cb_args);
if(result) {
Py_DECREF(result);
@@ -79,7 +88,7 @@ PyObject *pyrna_callback_add(BPy_StructRNA *self, PyObject *args)
if(RNA_struct_is_a(self->ptr.type, &RNA_Region)) {
if(cb_event_str) {
- static EnumPropertyItem region_draw_mode_items[] = {
+ static EnumPropertyItem region_draw_mode_items[]= {
{REGION_DRAW_POST_PIXEL, "POST_PIXEL", 0, "Post Pixel", ""},
{REGION_DRAW_POST_VIEW, "POST_VIEW", 0, "Post View", ""},
{REGION_DRAW_PRE_VIEW, "PRE_VIEW", 0, "Pre View", ""},
diff --git a/source/blender/python/intern/bpy_rna_callback.h b/source/blender/python/intern/bpy_rna_callback.h
index 8b218aaefb2..2cea99fe20c 100644
--- a/source/blender/python/intern/bpy_rna_callback.h
+++ b/source/blender/python/intern/bpy_rna_callback.h
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_rna_callback.h
+ * \ingroup pythonintern
+ */
+
+
struct BPy_StructRNA;
struct PyObject;
diff --git a/source/blender/python/intern/bpy_traceback.c b/source/blender/python/intern/bpy_traceback.c
index ca94378a72a..b5dec7205a6 100644
--- a/source/blender/python/intern/bpy_traceback.c
+++ b/source/blender/python/intern/bpy_traceback.c
@@ -20,6 +20,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_traceback.c
+ * \ingroup pythonintern
+ */
+
+
#include <Python.h>
#include <frameobject.h>
@@ -72,7 +77,8 @@ parse_syntax_error(PyObject *err, PyObject **message, const char **filename,
*offset = -1;
Py_DECREF(v);
v = NULL;
- } else {
+ }
+ else {
hold = PyLong_AsLong(v);
Py_DECREF(v);
v = NULL;
diff --git a/source/blender/python/intern/bpy_traceback.h b/source/blender/python/intern/bpy_traceback.h
index ade1c067c9c..3ed1f99aa20 100644
--- a/source/blender/python/intern/bpy_traceback.h
+++ b/source/blender/python/intern/bpy_traceback.h
@@ -20,6 +20,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_traceback.h
+ * \ingroup pythonintern
+ */
+
+
#ifndef BPY_TRACEBACK_H
#define BPY_TRACEBACK_H
diff --git a/source/blender/python/intern/bpy_util.c b/source/blender/python/intern/bpy_util.c
index 95d2f3bba9f..0d3b036850d 100644
--- a/source/blender/python/intern/bpy_util.c
+++ b/source/blender/python/intern/bpy_util.c
@@ -22,6 +22,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_util.c
+ * \ingroup pythonintern
+ */
+
+
#include <Python.h>
#include "bpy_util.h"
@@ -32,7 +37,7 @@
#include "../generic/py_capi_utils.h"
-static bContext* __py_context = NULL;
+static bContext* __py_context= NULL;
bContext* BPy_GetContext(void) { return __py_context; }
void BPy_SetContext(bContext *C) { __py_context= C; }
@@ -47,12 +52,12 @@ char *BPy_enum_as_string(EnumPropertyItem *item)
BLI_dynstr_appendf(dynstr, (e==item)?"'%s'":", '%s'", item->identifier);
}
- cstring = BLI_dynstr_get_cstring(dynstr);
+ cstring= BLI_dynstr_get_cstring(dynstr);
BLI_dynstr_free(dynstr);
return cstring;
}
-short BPy_reports_to_error(ReportList *reports, const short clear)
+short BPy_reports_to_error(ReportList *reports, PyObject *exception, const short clear)
{
char *report_str;
@@ -63,11 +68,11 @@ short BPy_reports_to_error(ReportList *reports, const short clear)
}
if(report_str) {
- PyErr_SetString(PyExc_RuntimeError, report_str);
+ PyErr_SetString(exception, report_str);
MEM_freeN(report_str);
}
- return (report_str != NULL);
+ return (report_str == NULL) ? 0 : -1;
}
@@ -141,19 +146,19 @@ int PyC_AsArray(void *array, PyObject *value, int length, PyTypeObject *type, co
if(type == &PyFloat_Type) {
float *array_float= array;
for(i=0; i<length; i++) {
- array_float[i] = PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value_fast, i));
+ array_float[i]= PyFloat_AsDouble(PySequence_Fast_GET_ITEM(value_fast, i));
}
}
else if(type == &PyLong_Type) {
int *array_int= array;
for(i=0; i<length; i++) {
- array_int[i] = PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value_fast, i));
+ array_int[i]= PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value_fast, i));
}
}
else if(type == &PyBool_Type) {
int *array_bool= array;
for(i=0; i<length; i++) {
- array_bool[i] = (PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value_fast, i)) != 0);
+ array_bool[i]= (PyLong_AsSsize_t(PySequence_Fast_GET_ITEM(value_fast, i)) != 0);
}
}
else {
diff --git a/source/blender/python/intern/bpy_util.h b/source/blender/python/intern/bpy_util.h
index b35a6b20306..b16c8fe2e8c 100644
--- a/source/blender/python/intern/bpy_util.h
+++ b/source/blender/python/intern/bpy_util.h
@@ -22,11 +22,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/bpy_util.h
+ * \ingroup pythonintern
+ */
+
+
#ifndef BPY_UTIL_H
#define BPY_UTIL_H
-#if PY_VERSION_HEX < 0x03010000
-#error "Python versions below 3.1 are not supported anymore, you'll need to update your python."
+#if PY_VERSION_HEX < 0x03020000
+#error "Python 3.2 or greater is required, you'll need to update your python."
#endif
#include "RNA_types.h" /* for EnumPropertyItem only */
@@ -39,7 +44,7 @@ char *BPy_enum_as_string(struct EnumPropertyItem *item);
#define BLANK_PYTHON_TYPE {PyVarObject_HEAD_INIT(NULL, 0) NULL}
/* error reporting */
-short BPy_reports_to_error(struct ReportList *reports, const short clear);
+short BPy_reports_to_error(struct ReportList *reports, PyObject *exception, const short clear);
short BPy_errors_to_report(struct ReportList *reports);
/* TODO - find a better solution! */
diff --git a/source/blender/python/intern/stubs.c b/source/blender/python/intern/stubs.c
index 7f87dd36f6d..1e9f430e2b3 100644
--- a/source/blender/python/intern/stubs.c
+++ b/source/blender/python/intern/stubs.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/python/intern/stubs.c
+ * \ingroup pythonintern
+ */
+
+
/* python, will come back */
//void BPY_script_exec(void) {}
//void BPY_python_start(void) {}
diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c
index d61e0b16155..9b8f0bce6fb 100644
--- a/source/blender/quicktime/apple/quicktime_export.c
+++ b/source/blender/quicktime/apple/quicktime_export.c
@@ -28,6 +28,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/quicktime/apple/quicktime_export.c
+ * \ingroup quicktime
+ */
+
+
#ifdef WITH_QUICKTIME
#if defined(_WIN32) || defined(__APPLE__)
#ifndef USE_QTKIT
diff --git a/source/blender/quicktime/apple/quicktime_import.c b/source/blender/quicktime/apple/quicktime_import.c
index 8241fea447a..192fd3c4332 100644
--- a/source/blender/quicktime/apple/quicktime_import.c
+++ b/source/blender/quicktime/apple/quicktime_import.c
@@ -27,6 +27,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/quicktime/apple/quicktime_import.c
+ * \ingroup quicktime
+ */
+
#ifdef WITH_QUICKTIME
#if defined(_WIN32) || defined(__APPLE__)
diff --git a/source/blender/quicktime/quicktime_export.h b/source/blender/quicktime/quicktime_export.h
index ece19c2a521..1c4f7a65e1e 100644
--- a/source/blender/quicktime/quicktime_export.h
+++ b/source/blender/quicktime/quicktime_export.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/quicktime/quicktime_export.h
+ * \ingroup quicktime
+ */
+
+
#ifndef __QUICKTIME_EXPORT_H__
#define __QUICKTIME_EXPORT_H__
diff --git a/source/blender/quicktime/quicktime_import.h b/source/blender/quicktime/quicktime_import.h
index d7f96375fa4..7ca71cb9d4f 100644
--- a/source/blender/quicktime/quicktime_import.h
+++ b/source/blender/quicktime/quicktime_import.h
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/quicktime/quicktime_import.h
+ * \ingroup quicktime
+ */
+
+
#ifndef __QUICKTIME_IMP_H__
#define __QUICKTIME_IMP_H__
diff --git a/source/blender/readblenfile/BLO_readblenfile.h b/source/blender/readblenfile/BLO_readblenfile.h
index a928148f208..9b4e15165f5 100644
--- a/source/blender/readblenfile/BLO_readblenfile.h
+++ b/source/blender/readblenfile/BLO_readblenfile.h
@@ -32,7 +32,7 @@
#define BLO_READBLENFILE_H
/** \file BLO_readblenfile.h
- * \ingroup readblenfile
+ * \ingroup blo
*/
#ifdef __cplusplus
diff --git a/source/blender/readblenfile/intern/BLO_readblenfile.c b/source/blender/readblenfile/intern/BLO_readblenfile.c
index ac059b12c0a..1559ba7bfdc 100644
--- a/source/blender/readblenfile/intern/BLO_readblenfile.c
+++ b/source/blender/readblenfile/intern/BLO_readblenfile.c
@@ -30,7 +30,7 @@
/**
* \file BLO_readblenfile.c
* \brief This file handles the loading if .blend files
- * \ingroup mainmodule
+ * \ingroup blo
*/
#include <stdio.h>
#include <stdlib.h>
diff --git a/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c b/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c
index ed8c22f4288..4900f0c3338 100644
--- a/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c
+++ b/source/blender/readblenfile/stub/BLO_readblenfileSTUB.c
@@ -28,6 +28,11 @@
*
*/
+/** \file blender/readblenfile/stub/BLO_readblenfileSTUB.c
+ * \ingroup blo
+ */
+
+
#include <stdio.h>
#include "GEN_messaging.h"
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index b64538cb452..4cc3207a05e 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -239,6 +239,7 @@ void RE_display_clear_cb(struct Render *re, void *handle, void (*f)(void *handle
void RE_display_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderResult *rr, volatile struct rcti *rect));
void RE_stats_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, RenderStats *rs));
void RE_progress_cb (struct Render *re, void *handle, void (*f)(void *handle, float));
+void RE_draw_lock_cb (struct Render *re, void *handle, void (*f)(void *handle, int));
void RE_test_break_cb (struct Render *re, void *handle, int (*f)(void *handle));
void RE_error_cb (struct Render *re, void *handle, void (*f)(void *handle, const char *str));
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h
index ca04990efad..958c19ab9ca 100644
--- a/source/blender/render/extern/include/RE_shader_ext.h
+++ b/source/blender/render/extern/include/RE_shader_ext.h
@@ -174,6 +174,7 @@ typedef struct ShadeInput
/* from initialize, part or renderlayer */
short do_preview; /* for nodes, in previewrender */
+ short do_manage; /* color management flag */
short thread, sample; /* sample: ShadeSample array index */
short nodes; /* indicate node shading, temp hack to prevent recursion */
diff --git a/source/blender/render/intern/include/envmap.h b/source/blender/render/intern/include/envmap.h
index 4893baaa998..ae669006b84 100644
--- a/source/blender/render/intern/include/envmap.h
+++ b/source/blender/render/intern/include/envmap.h
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/envmap.h
+ * \ingroup render
+ */
+
+
#ifndef ENVMAP_EXT_H
#define ENVMAP_EXT_H
diff --git a/source/blender/render/intern/include/gammaCorrectionTables.h b/source/blender/render/intern/include/gammaCorrectionTables.h
index ded30cdeea7..2bff6b1f778 100644
--- a/source/blender/render/intern/include/gammaCorrectionTables.h
+++ b/source/blender/render/intern/include/gammaCorrectionTables.h
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/gammaCorrectionTables.h
+ * \ingroup render
+ */
+
+
#ifndef GAMMACORRECTIONTABLES_H
#define GAMMACORRECTIONTABLES_H
diff --git a/source/blender/render/intern/include/initrender.h b/source/blender/render/intern/include/initrender.h
index 4fbc21077f1..30302181c04 100644
--- a/source/blender/render/intern/include/initrender.h
+++ b/source/blender/render/intern/include/initrender.h
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/initrender.h
+ * \ingroup render
+ */
+
+
#ifndef INITRENDER_H
#define INITRENDER_H
diff --git a/source/blender/render/intern/include/occlusion.h b/source/blender/render/intern/include/occlusion.h
index 812bc0605cf..87ed348a9f9 100644
--- a/source/blender/render/intern/include/occlusion.h
+++ b/source/blender/render/intern/include/occlusion.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/occlusion.h
+ * \ingroup render
+ */
+
+
#ifndef OCCLUSION_H
#define OCCLUSION_H
diff --git a/source/blender/render/intern/include/pixelblending.h b/source/blender/render/intern/include/pixelblending.h
index 47aa36a2ea8..0ec2e457275 100644
--- a/source/blender/render/intern/include/pixelblending.h
+++ b/source/blender/render/intern/include/pixelblending.h
@@ -25,6 +25,11 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/pixelblending.h
+ * \ingroup render
+ */
+
+
#ifndef PIXELBLENDING_EXT_H
#define PIXELBLENDING_EXT_H
diff --git a/source/blender/render/intern/include/pixelshading.h b/source/blender/render/intern/include/pixelshading.h
index 9542600d533..0298f90c0d0 100644
--- a/source/blender/render/intern/include/pixelshading.h
+++ b/source/blender/render/intern/include/pixelshading.h
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/pixelshading.h
+ * \ingroup render
+ */
+
+
/* pixelshading.h
*
* These functions determine what actual color a pixel will have.
diff --git a/source/blender/render/intern/include/pointdensity.h b/source/blender/render/intern/include/pointdensity.h
index 6feec12a446..bf697b0dcad 100644
--- a/source/blender/render/intern/include/pointdensity.h
+++ b/source/blender/render/intern/include/pointdensity.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/pointdensity.h
+ * \ingroup render
+ */
+
+
#ifndef POINTDENSITY_H
#define POINTDENSITY_H
diff --git a/source/blender/render/intern/include/raycounter.h b/source/blender/render/intern/include/raycounter.h
index 6c5e2b2f064..dbb83b2ac2d 100644
--- a/source/blender/render/intern/include/raycounter.h
+++ b/source/blender/render/intern/include/raycounter.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/raycounter.h
+ * \ingroup render
+ */
+
+
#ifndef RE_RAYCOUNTER_H
#define RE_RAYCOUNTER_H
diff --git a/source/blender/render/intern/include/rayintersection.h b/source/blender/render/intern/include/rayintersection.h
index 021801db2fa..6db935fba24 100644
--- a/source/blender/render/intern/include/rayintersection.h
+++ b/source/blender/render/intern/include/rayintersection.h
@@ -28,6 +28,11 @@
* RE_raytrace.h: ray tracing api, can be used independently from the renderer.
*/
+/** \file blender/render/intern/include/rayintersection.h
+ * \ingroup render
+ */
+
+
#ifndef __RENDER_RAYINTERSECTION_H__
#define __RENDER_RAYINTERSECTION_H__
diff --git a/source/blender/render/intern/include/rayobject.h b/source/blender/render/intern/include/rayobject.h
index f5c9dd32b85..08fbccf8d11 100644
--- a/source/blender/render/intern/include/rayobject.h
+++ b/source/blender/render/intern/include/rayobject.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/rayobject.h
+ * \ingroup render
+ */
+
+
#ifndef RE_RAYOBJECT_H
#define RE_RAYOBJECT_H
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index cab44644819..672b5080fbf 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/render_types.h
+ * \ingroup render
+ */
+
+
#ifndef RENDER_TYPES_H
#define RENDER_TYPES_H
@@ -241,6 +246,8 @@ struct Render
void (*progress)(void *handle, float i);
void *prh;
+ void (*draw_lock)(void *handle, int i);
+ void *dlh;
int (*test_break)(void *handle);
void *tbh;
diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h
index 3b0929bbe27..67c3cbcebe2 100644
--- a/source/blender/render/intern/include/rendercore.h
+++ b/source/blender/render/intern/include/rendercore.h
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/rendercore.h
+ * \ingroup render
+ */
+
+
#ifndef RENDERCORE_H
#define RENDERCORE_H
diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index 7b8dddd1ce6..e1fa208d0b6 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/renderdatabase.h
+ * \ingroup render
+ */
+
+
#ifndef RENDERDATABASE_H
#define RENDERDATABASE_H
diff --git a/source/blender/render/intern/include/renderpipeline.h b/source/blender/render/intern/include/renderpipeline.h
index 289e9bc9f04..7e50af97216 100644
--- a/source/blender/render/intern/include/renderpipeline.h
+++ b/source/blender/render/intern/include/renderpipeline.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/renderpipeline.h
+ * \ingroup render
+ */
+
+
#ifndef PIPELINE_H
#define PIPELINE_H
diff --git a/source/blender/render/intern/include/shadbuf.h b/source/blender/render/intern/include/shadbuf.h
index 3e2d4ccd412..2dca9963e4f 100644
--- a/source/blender/render/intern/include/shadbuf.h
+++ b/source/blender/render/intern/include/shadbuf.h
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/shadbuf.h
+ * \ingroup render
+ */
+
+
#ifndef SHADBUF_EXT_H
#define SHADBUF_EXT_H
diff --git a/source/blender/render/intern/include/shading.h b/source/blender/render/intern/include/shading.h
index 739c7cd3d26..865cb056a61 100644
--- a/source/blender/render/intern/include/shading.h
+++ b/source/blender/render/intern/include/shading.h
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/shading.h
+ * \ingroup render
+ */
+
+
struct ShadeInput;
struct ShadeResult;
struct RenderPart;
diff --git a/source/blender/render/intern/include/sss.h b/source/blender/render/intern/include/sss.h
index 8e54f90fca3..fbc74691188 100644
--- a/source/blender/render/intern/include/sss.h
+++ b/source/blender/render/intern/include/sss.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/sss.h
+ * \ingroup render
+ */
+
+
#ifndef SSS_H
#define SSS_H
diff --git a/source/blender/render/intern/include/strand.h b/source/blender/render/intern/include/strand.h
index ffb2b8aa809..7ffa5924dee 100644
--- a/source/blender/render/intern/include/strand.h
+++ b/source/blender/render/intern/include/strand.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/strand.h
+ * \ingroup render
+ */
+
+
#ifndef STRAND_H
#define STRAND_H
diff --git a/source/blender/render/intern/include/sunsky.h b/source/blender/render/intern/include/sunsky.h
index 26d74d21e18..8c0cbfd18e7 100644
--- a/source/blender/render/intern/include/sunsky.h
+++ b/source/blender/render/intern/include/sunsky.h
@@ -19,6 +19,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/render/intern/include/sunsky.h
+ * \ingroup render
+ */
+
/**
* This feature comes from Preetham paper on "A Practical Analytic Model for Daylight"
* and example code from Brian Smits, another author of that paper in
diff --git a/source/blender/render/intern/include/texture.h b/source/blender/render/intern/include/texture.h
index 8eb91f3299f..a63c4f7f253 100644
--- a/source/blender/render/intern/include/texture.h
+++ b/source/blender/render/intern/include/texture.h
@@ -29,18 +29,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/texture.h
+ * \ingroup render
+ */
+
+
#ifndef TEXTURE_EXT_H
#define TEXTURE_EXT_H
-#define BRICONT texres->tin= (texres->tin-0.5)*tex->contrast+tex->bright-0.5; \
-if(texres->tin<0.0) texres->tin= 0.0; else if(texres->tin>1.0) texres->tin= 1.0;
+#define BRICONT texres->tin= (texres->tin-0.5f)*tex->contrast+tex->bright-0.5f; \
+if(texres->tin<0.0f) texres->tin= 0.0f; else if(texres->tin>1.0f) texres->tin= 1.0f;
-#define BRICONTRGB texres->tr= tex->rfac*((texres->tr-0.5)*tex->contrast+tex->bright-0.5); \
-if(texres->tr<0.0) texres->tr= 0.0; \
-texres->tg= tex->gfac*((texres->tg-0.5)*tex->contrast+tex->bright-0.5); \
-if(texres->tg<0.0) texres->tg= 0.0; \
-texres->tb= tex->bfac*((texres->tb-0.5)*tex->contrast+tex->bright-0.5); \
-if(texres->tb<0.0) texres->tb= 0.0; \
+#define BRICONTRGB texres->tr= tex->rfac*((texres->tr-0.5f)*tex->contrast+tex->bright-0.5f); \
+if(texres->tr<0.0f) texres->tr= 0.0f; \
+texres->tg= tex->gfac*((texres->tg-0.5f)*tex->contrast+tex->bright-0.5f); \
+if(texres->tg<0.0f) texres->tg= 0.0f; \
+texres->tb= tex->bfac*((texres->tb-0.5f)*tex->contrast+tex->bright-0.5f); \
+if(texres->tb<0.0f) texres->tb= 0.0f; \
if(tex->saturation != 1.0f) { \
float _hsv[3]; \
rgb_to_hsv(texres->tr, texres->tg, texres->tb, _hsv, _hsv+1, _hsv+2); \
@@ -48,7 +53,7 @@ if(tex->saturation != 1.0f) { \
hsv_to_rgb(_hsv[0], _hsv[1], _hsv[2], &texres->tr, &texres->tg, &texres->tb); \
} \
-#define RGBTOBW(r,g,b) ( r*0.35 + g*0.45 + b*0.2 ) /* keep this in sync with gpu_shader_material.glsl:rgbtobw */
+#define RGBTOBW(r,g,b) ( r*0.35f + g*0.45f + b*0.2f ) /* keep this in sync with gpu_shader_material.glsl:rgbtobw */
struct HaloRen;
struct ShadeInput;
diff --git a/source/blender/render/intern/include/volume_precache.h b/source/blender/render/intern/include/volume_precache.h
index 2dfe205f850..9c6d523a005 100644
--- a/source/blender/render/intern/include/volume_precache.h
+++ b/source/blender/render/intern/include/volume_precache.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/volume_precache.h
+ * \ingroup render
+ */
+
+
void global_bounds_obi(Render *re, ObjectInstanceRen *obi, float *bbmin, float *bbmax);
int point_inside_volume_objectinstance(Render *re, ObjectInstanceRen *obi, float *co);
diff --git a/source/blender/render/intern/include/volumetric.h b/source/blender/render/intern/include/volumetric.h
index 70012058c34..6d8d4cbe0f2 100644
--- a/source/blender/render/intern/include/volumetric.h
+++ b/source/blender/render/intern/include/volumetric.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/volumetric.h
+ * \ingroup render
+ */
+
+
struct Isect;
struct ShadeInput;
struct ShadeResult;
diff --git a/source/blender/render/intern/include/voxeldata.h b/source/blender/render/intern/include/voxeldata.h
index 89cb18844d5..e9991a2a19c 100644
--- a/source/blender/render/intern/include/voxeldata.h
+++ b/source/blender/render/intern/include/voxeldata.h
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/voxeldata.h
+ * \ingroup render
+ */
+
+
#ifndef VOXELDATA_H
#define VOXELDATA_H
diff --git a/source/blender/render/intern/include/zbuf.h b/source/blender/render/intern/include/zbuf.h
index dcaaca7d718..4c87520d4d1 100644
--- a/source/blender/render/intern/include/zbuf.h
+++ b/source/blender/render/intern/include/zbuf.h
@@ -27,6 +27,11 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/include/zbuf.h
+ * \ingroup render
+ */
+
+
#ifndef ZBUF_H
#define ZBUF_H
diff --git a/source/blender/render/intern/raytrace/bvh.h b/source/blender/render/intern/raytrace/bvh.h
index e581bbf369a..3ba5bbc624e 100644
--- a/source/blender/render/intern/raytrace/bvh.h
+++ b/source/blender/render/intern/raytrace/bvh.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/bvh.h
+ * \ingroup render
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_math.h"
@@ -124,7 +129,8 @@ static void bvh_free(Tree *obj)
template<class Tree>
static void bvh_bb(Tree *obj, float *min, float *max)
{
- bvh_node_merge_bb(obj->root, min, max);
+ if(obj->root)
+ bvh_node_merge_bb(obj->root, min, max);
}
diff --git a/source/blender/render/intern/raytrace/rayobject.cpp b/source/blender/render/intern/raytrace/rayobject.cpp
index 1bcda3ca039..dfff35ba51a 100644
--- a/source/blender/render/intern/raytrace/rayobject.cpp
+++ b/source/blender/render/intern/raytrace/rayobject.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/rayobject.cpp
+ * \ingroup render
+ */
+
+
#include <assert.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/render/intern/raytrace/rayobject_blibvh.cpp b/source/blender/render/intern/raytrace/rayobject_blibvh.cpp
index 396ca7fc0ef..17c8f31a507 100644
--- a/source/blender/render/intern/raytrace/rayobject_blibvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_blibvh.cpp
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/render/intern/raytrace/rayobject_blibvh.cpp
+ * \ingroup render
+ */
+
#include <assert.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/render/intern/raytrace/rayobject_empty.cpp b/source/blender/render/intern/raytrace/rayobject_empty.cpp
index fd6e02fecc1..f11849af882 100644
--- a/source/blender/render/intern/raytrace/rayobject_empty.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_empty.cpp
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/rayobject_empty.cpp
+ * \ingroup render
+ */
+
+
#include "MEM_guardedalloc.h"
#include "rayobject.h"
diff --git a/source/blender/render/intern/raytrace/rayobject_hint.h b/source/blender/render/intern/raytrace/rayobject_hint.h
index 6f49b276681..47c11d6d354 100644
--- a/source/blender/render/intern/raytrace/rayobject_hint.h
+++ b/source/blender/render/intern/raytrace/rayobject_hint.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/rayobject_hint.h
+ * \ingroup render
+ */
+
+
#ifndef RE_RAYTRACE_RAYOBJECT_HINT_H
#define RE_RAYTRACE_RAYOBJECT_HINT_H
diff --git a/source/blender/render/intern/raytrace/rayobject_instance.cpp b/source/blender/render/intern/raytrace/rayobject_instance.cpp
index 0dd8dc97944..910624b695d 100644
--- a/source/blender/render/intern/raytrace/rayobject_instance.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_instance.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/rayobject_instance.cpp
+ * \ingroup render
+ */
+
+
#include <assert.h>
#include "MEM_guardedalloc.h"
diff --git a/source/blender/render/intern/raytrace/rayobject_internal.h b/source/blender/render/intern/raytrace/rayobject_internal.h
index 6067be07c50..458c892d410 100644
--- a/source/blender/render/intern/raytrace/rayobject_internal.h
+++ b/source/blender/render/intern/raytrace/rayobject_internal.h
@@ -1,3 +1,6 @@
+/** \file blender/render/intern/raytrace/rayobject_internal.h
+ * \ingroup render
+ */
#ifndef RE_RAYOBJECT_INTERNAL_H
#define RE_RAYOBJECT_INTERNAL_H
diff --git a/source/blender/render/intern/raytrace/rayobject_octree.cpp b/source/blender/render/intern/raytrace/rayobject_octree.cpp
index 190fcd3a95a..e35fcbc2df7 100644
--- a/source/blender/render/intern/raytrace/rayobject_octree.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_octree.cpp
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/rayobject_octree.cpp
+ * \ingroup render
+ */
+
+
/* IMPORTANT NOTE: this code must be independent of any other render code
to use it outside the renderer! */
diff --git a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
index e9d4d271e72..331358f727b 100644
--- a/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_qbvh.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/rayobject_qbvh.cpp
+ * \ingroup render
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
@@ -75,9 +80,12 @@ void bvh_done<QBVHTree>(QBVHTree *obj)
return;
}
- pushup_simd<VBVHNode,4>(root);
-
- obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
+ if(root) {
+ pushup_simd<VBVHNode,4>(root);
+ obj->root = Reorganize_SVBVH<VBVHNode>(arena2).transform(root);
+ }
+ else
+ obj->root = NULL;
//Free data
BLI_memarena_free(arena1);
diff --git a/source/blender/render/intern/raytrace/rayobject_raycounter.cpp b/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
index 0788b2f31cc..5b041e1a91f 100644
--- a/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_raycounter.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/rayobject_raycounter.cpp
+ * \ingroup render
+ */
+
+
#include "rayobject.h"
#include "raycounter.h"
diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
index 2d6916cd60d..c9de887d392 100644
--- a/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_rtbuild.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/rayobject_rtbuild.cpp
+ * \ingroup render
+ */
+
+
#include <assert.h>
#include <math.h>
#include <stdlib.h>
@@ -101,9 +106,19 @@ void rtbuild_add(RTBuilder *b, RayObject *o)
INIT_MINMAX(bb, bb+3);
RE_rayobject_merge_bb(o, bb, bb+3);
+ /* skip objects with invalid bounding boxes, nan causes DO_MINMAX
+ to do nothing, so we get these invalid values. this shouldn't
+ happen usually, but bugs earlier in the pipeline can cause it. */
+ if(bb[0] > bb[3] || bb[1] > bb[4] || bb[2] > bb[5])
+ return;
+ /* skip objects with inf bounding boxes */
+ if(!finite(bb[0]) || !finite(bb[1]) || !finite(bb[2]))
+ return;
+ if(!finite(bb[3]) || !finite(bb[4]) || !finite(bb[5]))
+ return;
/* skip objects with zero bounding box, they are of no use, and
will give problems in rtbuild_heuristic_object_split later */
- if(len_squared_v3v3(bb, bb+3) == 0.0f)
+ if(bb[0] == bb[3] && bb[1] == bb[4] && bb[2] == bb[5])
return;
copy_v3_v3(b->primitives.end->bb, bb);
diff --git a/source/blender/render/intern/raytrace/rayobject_rtbuild.h b/source/blender/render/intern/raytrace/rayobject_rtbuild.h
index 7c9706097fe..353d6f1066b 100644
--- a/source/blender/render/intern/raytrace/rayobject_rtbuild.h
+++ b/source/blender/render/intern/raytrace/rayobject_rtbuild.h
@@ -26,6 +26,11 @@
*
* ***** END GPL LICENSE BLOCK *****
*/
+
+/** \file blender/render/intern/raytrace/rayobject_rtbuild.h
+ * \ingroup render
+ */
+
#ifndef RE_RAYOBJECT_RTBUILD_H
#define RE_RAYOBJECT_RTBUILD_H
diff --git a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
index c4e30f97881..a99c57ab233 100644
--- a/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_svbvh.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/rayobject_svbvh.cpp
+ * \ingroup render
+ */
+
+
#include "MEM_guardedalloc.h"
#include "BLI_utildefines.h"
@@ -110,8 +115,12 @@ void bvh_done<SVBVHTree>(SVBVHTree *obj)
return;
}
- VBVH_optimalPackSIMD<OVBVHNode,PackCost>(PackCost()).transform(root);
- obj->root = Reorganize_SVBVH<OVBVHNode>(arena2).transform(root);
+ if(root) {
+ VBVH_optimalPackSIMD<OVBVHNode,PackCost>(PackCost()).transform(root);
+ obj->root = Reorganize_SVBVH<OVBVHNode>(arena2).transform(root);
+ }
+ else
+ obj->root = NULL;
}
//Free data
diff --git a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
index b0fc70d7875..25eada43a4a 100644
--- a/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
+++ b/source/blender/render/intern/raytrace/rayobject_vbvh.cpp
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/rayobject_vbvh.cpp
+ * \ingroup render
+ */
+
+
int tot_pushup = 0;
int tot_pushdown = 0;
int tot_hints = 0;
@@ -93,13 +98,17 @@ void bvh_done<VBVHTree>(VBVHTree *obj)
return;
}
- reorganize(root);
- remove_useless(root, &root);
- bvh_refit(root);
-
- pushup(root);
- pushdown(root);
- obj->root = root;
+ if(root) {
+ reorganize(root);
+ remove_useless(root, &root);
+ bvh_refit(root);
+
+ pushup(root);
+ pushdown(root);
+ obj->root = root;
+ }
+ else
+ obj->root = NULL;
}
else
{
diff --git a/source/blender/render/intern/raytrace/reorganize.h b/source/blender/render/intern/raytrace/reorganize.h
index 2f89cd47faa..df3326f3109 100644
--- a/source/blender/render/intern/raytrace/reorganize.h
+++ b/source/blender/render/intern/raytrace/reorganize.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/reorganize.h
+ * \ingroup render
+ */
+
+
#include <float.h>
#include <math.h>
#include <stdio.h>
@@ -39,7 +44,10 @@
#include "BKE_global.h"
#ifdef _WIN32
-#define INFINITY FLT_MAX // in mingw math.h: (1.0F/0.0F). This generates compile error, though.
+# ifdef INFINITY
+# undef INFINITY
+# endif
+# define INFINITY FLT_MAX // in mingw math.h: (1.0F/0.0F). This generates compile error, though.
#endif
extern int tot_pushup;
diff --git a/source/blender/render/intern/raytrace/svbvh.h b/source/blender/render/intern/raytrace/svbvh.h
index 573240df2d6..f38724b7af7 100644
--- a/source/blender/render/intern/raytrace/svbvh.h
+++ b/source/blender/render/intern/raytrace/svbvh.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/svbvh.h
+ * \ingroup render
+ */
+
+
#ifdef __SSE__
#ifndef RE_RAYTRACE_SVBVH_H
diff --git a/source/blender/render/intern/raytrace/vbvh.h b/source/blender/render/intern/raytrace/vbvh.h
index deddc7059a4..62cccdb5af9 100644
--- a/source/blender/render/intern/raytrace/vbvh.h
+++ b/source/blender/render/intern/raytrace/vbvh.h
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/raytrace/vbvh.h
+ * \ingroup render
+ */
+
+
#include <assert.h>
#include <algorithm>
@@ -152,9 +157,12 @@ struct BuildBinaryVBVH
Node *_transform(RTBuilder *builder)
{
-
int size = rtbuild_size(builder);
- if(size == 1)
+
+ if(size == 0) {
+ return NULL;
+ }
+ else if(size == 1)
{
Node *node = create_node();
INIT_MINMAX(node->bb, node->bb+3);
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index c2c33df1e99..30f25e05c58 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/convertblender.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
@@ -494,6 +499,11 @@ static void calc_tangent_vector(ObjectRen *obr, VertexTangent **vtangents, MemAr
}
+
+/****************************************************************
+************ tangent space generation interface *****************
+****************************************************************/
+
typedef struct
{
ObjectRen *obr;
@@ -589,53 +599,11 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d
for(a=0; a<obr->totvlak; a++) {
VlakRen *vlr= RE_findOrAddVlak(obr, a);
if(vlr->flag & ME_SMOOTH) {
- VertRen *v1= vlr->v1;
- VertRen *v2= vlr->v2;
- VertRen *v3= vlr->v3;
- VertRen *v4= vlr->v4;
- float n1[3], n2[3], n3[3], n4[3];
- float fac1, fac2, fac3, fac4=0.0f;
-
- sub_v3_v3v3(n1, v2->co, v1->co);
- normalize_v3(n1);
- sub_v3_v3v3(n2, v3->co, v2->co);
- normalize_v3(n2);
- if(v4==NULL) {
- sub_v3_v3v3(n3, v1->co, v3->co);
- normalize_v3(n3);
-
- fac1= saacos(-n1[0]*n3[0]-n1[1]*n3[1]-n1[2]*n3[2]);
- fac2= saacos(-n1[0]*n2[0]-n1[1]*n2[1]-n1[2]*n2[2]);
- fac3= saacos(-n2[0]*n3[0]-n2[1]*n3[1]-n2[2]*n3[2]);
- }
- else {
- sub_v3_v3v3(n3, v4->co, v3->co);
- normalize_v3(n3);
- sub_v3_v3v3(n4, v1->co, v4->co);
- normalize_v3(n4);
-
- fac1= saacos(-n4[0]*n1[0]-n4[1]*n1[1]-n4[2]*n1[2]);
- fac2= saacos(-n1[0]*n2[0]-n1[1]*n2[1]-n1[2]*n2[2]);
- fac3= saacos(-n2[0]*n3[0]-n2[1]*n3[1]-n2[2]*n3[2]);
- fac4= saacos(-n3[0]*n4[0]-n3[1]*n4[1]-n3[2]*n4[2]);
-
- v4->n[0] +=fac4*vlr->n[0];
- v4->n[1] +=fac4*vlr->n[1];
- v4->n[2] +=fac4*vlr->n[2];
- }
-
- v1->n[0] +=fac1*vlr->n[0];
- v1->n[1] +=fac1*vlr->n[1];
- v1->n[2] +=fac1*vlr->n[2];
+ float *n4= (vlr->v4)? vlr->v4->n: NULL;
+ float *c4= (vlr->v4)? vlr->v4->co: NULL;
- v2->n[0] +=fac2*vlr->n[0];
- v2->n[1] +=fac2*vlr->n[1];
- v2->n[2] +=fac2*vlr->n[2];
-
- v3->n[0] +=fac3*vlr->n[0];
- v3->n[1] +=fac3*vlr->n[1];
- v3->n[2] +=fac3*vlr->n[2];
-
+ accumulate_vertex_normals(vlr->v1->n, vlr->v2->n, vlr->v3->n, n4,
+ vlr->n, vlr->v1->co, vlr->v2->co, vlr->v3->co, c4);
}
if(do_nmap_tangent || do_tangent) {
/* tangents still need to be calculated for flat faces too */
@@ -647,17 +615,12 @@ static void calc_vertexnormals(Render *re, ObjectRen *obr, int do_tangent, int d
/* do solid faces */
for(a=0; a<obr->totvlak; a++) {
VlakRen *vlr= RE_findOrAddVlak(obr, a);
+
if((vlr->flag & ME_SMOOTH)==0) {
- float *f1= vlr->v1->n;
- if(f1[0]==0.0 && f1[1]==0.0 && f1[2]==0.0) VECCOPY(f1, vlr->n);
- f1= vlr->v2->n;
- if(f1[0]==0.0 && f1[1]==0.0 && f1[2]==0.0) VECCOPY(f1, vlr->n);
- f1= vlr->v3->n;
- if(f1[0]==0.0 && f1[1]==0.0 && f1[2]==0.0) VECCOPY(f1, vlr->n);
- if(vlr->v4) {
- f1= vlr->v4->n;
- if(f1[0]==0.0 && f1[1]==0.0 && f1[2]==0.0) VECCOPY(f1, vlr->n);
- }
+ if(is_zero_v3(vlr->v1->n)) VECCOPY(vlr->v1->n, vlr->n);
+ if(is_zero_v3(vlr->v2->n)) VECCOPY(vlr->v2->n, vlr->n);
+ if(is_zero_v3(vlr->v3->n)) VECCOPY(vlr->v3->n, vlr->n);
+ if(vlr->v4 && is_zero_v3(vlr->v4->n)) VECCOPY(vlr->v4->n, vlr->n);
}
if(do_nmap_tangent) {
@@ -1708,25 +1671,6 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
bb.totnum = totpart+totchild;
bb.uv_split = part->bb_uv_split;
}
-
-#if 0 // XXX old animation system
-/* 2.3 setup time */
- if(part->flag&PART_ABS_TIME && part->ipo) {
- calc_ipo(part->ipo, cfra);
- execute_ipo((ID *)part, part->ipo);
- }
-
- if(part->flag & PART_GLOB_TIME)
-#endif // XXX old animation system
-
-///* 2.4 setup reactors */
-// if(part->type == PART_REACTOR){
-// psys_get_reactor_target(ob, psys, &tob, &tpsys);
-// if(tpsys && (part->from==PART_FROM_PARTICLE || part->phystype==PART_PHYS_NO)){
-// psmd = psys_get_modifier(tob,tpsys);
-// tpart = tpsys->part;
-// }
-// }
/* 2.5 setup matrices */
mul_m4_m4m4(mat, ob->obmat, re->viewmat);
@@ -1823,7 +1767,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
hasize = ma->hasize;
/* get orco */
- if(tpsys && (part->from==PART_FROM_PARTICLE || part->phystype==PART_PHYS_NO)){
+ if(tpsys && part->phystype==PART_PHYS_NO){
tpa=tpsys->particles+pa->num;
psys_particle_on_emitter(psmd,tpart->from,tpa->num,pa->num_dmcache,tpa->fuv,tpa->foffset,co,nor,0,0,sd.orco,0);
}
@@ -1887,7 +1831,7 @@ static int render_new_particle_system(Render *re, ObjectRen *obr, ParticleSystem
}
/* get uvco & mcol */
- if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES) {
+ if(part->childtype==PART_CHILD_FACES) {
get_particle_uvco_mcol(PART_FROM_FACE, psmd->dm, cpa->fuv, cpa->num, &sd);
}
else {
@@ -3250,12 +3194,15 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
int a, a1, ok, vertofs;
int end, do_autosmooth=0, totvert = 0;
int use_original_normals= 0;
+ int recalc_normals = 0; // false by default
+ int negative_scale;
me= ob->data;
mul_m4_m4m4(mat, ob->obmat, re->viewmat);
invert_m4_m4(ob->imat, mat);
copy_m3_m4(imat, ob->imat);
+ negative_scale= is_negative_m4(mat);
if(me->totvert==0)
return;
@@ -3327,6 +3274,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
ma= give_render_material(re, ob, 1);
+
if(ma->material_type == MA_TYPE_HALO) {
make_render_halos(re, obr, me, totvert, mvert, ma, orco);
}
@@ -3335,8 +3283,15 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
for(a=0; a<totvert; a++, mvert++) {
ver= RE_findOrAddVert(obr, obr->totvert++);
VECCOPY(ver->co, mvert->co);
- if(do_autosmooth==0) /* autosmooth on original unrotated data to prevent differences between frames */
+ if(do_autosmooth==0) { /* autosmooth on original unrotated data to prevent differences between frames */
+ normal_short_to_float_v3(ver->n, mvert->no);
mul_m4_v3(mat, ver->co);
+ mul_transposed_m3_v3(imat, ver->n);
+ normalize_v3(ver->n);
+
+ if(!negative_scale)
+ negate_v3(ver->n);
+ }
if(orco) {
ver->orco= orco;
@@ -3353,6 +3308,10 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
if(!timeoffset) {
/* store customdata names, because DerivedMesh is freed */
RE_set_customdata_names(obr, &dm->faceData);
+
+ /* add tangent layer if we need one */
+ if(need_nmap_tangent!=0 && CustomData_get_layer_index(&dm->faceData, CD_TANGENT) == -1)
+ DM_add_tangent_layer(dm);
/* still to do for keys: the correct local texture coordinate */
@@ -3364,7 +3323,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
/* test for 100% transparant */
ok= 1;
- if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f) {
+ if(ma->alpha==0.0f && ma->spectra==0.0f && ma->filter==0.0f && (ma->mode & MA_TRANSP)) {
ok= 0;
/* texture on transparency? */
for(a=0; a<MAX_MTEX; a++) {
@@ -3383,7 +3342,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
if(ok) {
end= dm->getNumTessFaces(dm);
mface= dm->getTessFaceArray(dm);
-
+
for(a=0; a<end; a++, mface++) {
int v1, v2, v3, v4, flag;
@@ -3429,7 +3388,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
CustomDataLayer *layer;
MTFace *mtface, *mtf;
MCol *mcol, *mc;
- int index, mtfn= 0, mcn= 0;
+ int index, mtfn= 0, mcn= 0, mtng=0;
char *name;
for(index=0; index<dm->faceData.totlayer; index++) {
@@ -3446,6 +3405,22 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
mcol= (MCol*)layer->data;
memcpy(mc, &mcol[a*4], sizeof(MCol)*4);
}
+ else if(layer->type == CD_TANGENT && mtng < 1)
+ {
+ if(need_nmap_tangent!=0)
+ {
+ const float * tangent = (const float *) layer->data;
+ int t;
+ int nr_verts = v4!=0 ? 4 : 3;
+ float * ftang = RE_vlakren_get_nmap_tangent(obr, vlr, 1);
+ for(t=0; t<nr_verts; t++)
+ {
+ QUATCOPY(ftang+t*4, tangent+a*16+t*4);
+ mul_mat3_m4_v3(mat, ftang+t*4);
+ normalize_v3(ftang+t*4);
+ }
+ }
+ }
}
}
}
@@ -3461,6 +3436,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
MEdge *medge;
struct edgesort *edgetable;
int totedge= 0;
+ recalc_normals= 1;
medge= dm->getEdgeArray(dm);
@@ -3503,6 +3479,7 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
if(!timeoffset) {
if (test_for_displace(re, ob ) ) {
+ recalc_normals= 1;
calc_vertexnormals(re, obr, 0, 0);
if(do_autosmooth)
do_displacement(re, obr, mat, imat);
@@ -3511,11 +3488,13 @@ static void init_render_mesh(Render *re, ObjectRen *obr, int timeoffset)
}
if(do_autosmooth) {
+ recalc_normals= 1;
autosmooth(re, obr, mat, me->smoothresh);
}
- calc_vertexnormals(re, obr, need_tangent, need_nmap_tangent);
-
+ if(recalc_normals!=0 || need_tangent!=0)
+ calc_vertexnormals(re, obr, need_tangent, need_nmap_tangent);
+
if(need_stress)
calc_edge_stress(re, obr, me);
}
@@ -4657,7 +4636,10 @@ void RE_Database_Free(Render *re)
re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
re->i.convertdone= 0;
-
+
+ re->backbuf= NULL;
+ re->bakebuf= NULL;
+
if(re->scene)
if(re->scene->r.scemode & R_FREE_IMAGE)
if((re->r.scemode & R_PREVIEWBUTS)==0)
@@ -4739,7 +4721,7 @@ static void dupli_render_particle_set(Render *re, Object *ob, int timeoffset, in
}
}
- if(level == 0 && enable) {
+ if(enable) {
/* this is to make sure we get render level duplis in groups:
* the derivedmesh must be created before init_render_mesh,
* since object_duplilist does dupliparticles before that */
@@ -4805,7 +4787,7 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
ObjectInstanceRen *obi;
Scene *sce_iter;
float mat[4][4];
- int lay, vectorlay, redoimat= 0;
+ int lay, vectorlay;
/* for duplis we need the Object texture mapping to work as if
* untransformed, set_dupli_tex_mat sets the matrix to allow that
@@ -4816,7 +4798,8 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
ob= base->object;
/* imat objects has to be done here, since displace can have texture using Object map-input */
mul_m4_m4m4(mat, ob->obmat, re->viewmat);
- invert_m4_m4(ob->imat, mat);
+ invert_m4_m4(ob->imat_ren, mat);
+ copy_m4_m4(ob->imat, ob->imat_ren);
/* each object should only be rendered once */
ob->flag &= ~OB_DONE;
ob->transflag &= ~OB_RENDER_DUPLI;
@@ -4850,8 +4833,6 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
DupliObject *dob;
ListBase *lb;
- redoimat= 1;
-
/* create list of duplis generated by this object, particle
* system need to have render settings set for dupli particles */
dupli_render_particle_set(re, ob, timeoffset, 0, 1);
@@ -4963,15 +4944,6 @@ static void database_init_objects(Render *re, unsigned int renderlay, int nolamp
for(group= re->main->group.first; group; group=group->id.next)
add_group_render_dupli_obs(re, group, nolamps, onlyselected, actob, timeoffset, renderlay, 0);
- /* imat objects has to be done again, since groups can mess it up */
- if(redoimat) {
- for(SETLOOPER(re->scene, sce_iter, base)) {
- ob= base->object;
- mul_m4_m4m4(mat, ob->obmat, re->viewmat);
- invert_m4_m4(ob->imat, mat);
- }
- }
-
if(!re->test_break(re->tbh))
RE_makeRenderInstances(re);
}
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index 55f7433da96..1e40ab886ae 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/envmap.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <string.h>
@@ -70,47 +75,54 @@ static void envmap_split_ima(EnvMap *env, ImBuf *ibuf)
{
int dx, part;
- BKE_free_envmapdata(env);
-
- dx= ibuf->y;
- dx/= 2;
- if (3*dx == ibuf->x) {
- env->type = ENV_CUBE;
- } else if (ibuf->x == ibuf->y) {
- env->type = ENV_PLANE;
- } else {
- printf("Incorrect envmap size\n");
- env->ok= 0;
- env->ima->ok= 0;
- return;
- }
-
- if (env->type == ENV_CUBE) {
- for(part=0; part<6; part++) {
- env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect|IB_rectfloat);
+ /* after lock we test cube[1], if set the other thread has done it fine */
+ BLI_lock_thread(LOCK_IMAGE);
+ if(env->cube[1]==NULL) {
+
+ BKE_free_envmapdata(env);
+
+ dx= ibuf->y;
+ dx/= 2;
+ if (3*dx == ibuf->x) {
+ env->type = ENV_CUBE;
+ env->ok= ENV_OSA;
+ } else if (ibuf->x == ibuf->y) {
+ env->type = ENV_PLANE;
+ env->ok= ENV_OSA;
+ } else {
+ printf("Incorrect envmap size\n");
+ env->ok= 0;
+ env->ima->ok= 0;
}
- IMB_float_from_rect(ibuf);
-
- IMB_rectcpy(env->cube[0], ibuf,
- 0, 0, 0, 0, dx, dx);
- IMB_rectcpy(env->cube[1], ibuf,
- 0, 0, dx, 0, dx, dx);
- IMB_rectcpy(env->cube[2], ibuf,
- 0, 0, 2*dx, 0, dx, dx);
- IMB_rectcpy(env->cube[3], ibuf,
- 0, 0, 0, dx, dx, dx);
- IMB_rectcpy(env->cube[4], ibuf,
- 0, 0, dx, dx, dx, dx);
- IMB_rectcpy(env->cube[5], ibuf,
- 0, 0, 2*dx, dx, dx, dx);
- env->ok= ENV_OSA;
- }
- else { /* ENV_PLANE */
- env->cube[1]= IMB_dupImBuf(ibuf);
- IMB_float_from_rect(env->cube[1]);
- env->ok= ENV_OSA;
- }
+ if(env->ok) {
+ if (env->type == ENV_CUBE) {
+ for(part=0; part<6; part++) {
+ env->cube[part]= IMB_allocImBuf(dx, dx, 24, IB_rect|IB_rectfloat);
+ }
+ IMB_float_from_rect(ibuf);
+
+ IMB_rectcpy(env->cube[0], ibuf,
+ 0, 0, 0, 0, dx, dx);
+ IMB_rectcpy(env->cube[1], ibuf,
+ 0, 0, dx, 0, dx, dx);
+ IMB_rectcpy(env->cube[2], ibuf,
+ 0, 0, 2*dx, 0, dx, dx);
+ IMB_rectcpy(env->cube[3], ibuf,
+ 0, 0, 0, dx, dx, dx);
+ IMB_rectcpy(env->cube[4], ibuf,
+ 0, 0, dx, dx, dx, dx);
+ IMB_rectcpy(env->cube[5], ibuf,
+ 0, 0, 2*dx, dx, dx, dx);
+
+ }
+ else { /* ENV_PLANE */
+ env->cube[1]= IMB_dupImBuf(ibuf);
+ IMB_float_from_rect(env->cube[1]);
+ }
+ }
+ }
+ BLI_unlock_thread(LOCK_IMAGE);
}
/* ------------------------------------------------------------------------- */
@@ -718,6 +730,7 @@ int envmaptex(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, TexRe
TexResult texr1, texr2;
texr1.nor= texr2.nor= NULL;
+ texr1.talpha= texr2.talpha= texres->talpha; /* boxclip expects this initialized */
add_v3_v3(vec, dxt);
face1= envcube_isect(env, vec, sco);
diff --git a/source/blender/render/intern/source/gammaCorrectionTables.c b/source/blender/render/intern/source/gammaCorrectionTables.c
index cd1539bdda0..4a16341093c 100644
--- a/source/blender/render/intern/source/gammaCorrectionTables.c
+++ b/source/blender/render/intern/source/gammaCorrectionTables.c
@@ -29,6 +29,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/gammaCorrectionTables.c
+ * \ingroup render
+ */
+
+
#include "gammaCorrectionTables.h"
#include <stdlib.h>
#include <math.h>
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index 4baa3480ae9..264c82e4f47 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -26,6 +26,11 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/imagetexture.c
+ * \ingroup render
+ */
+
+
#include <stdio.h>
@@ -153,9 +158,9 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, TexResult *texre
if((xs+ys) & 1) return retval;
}
/* scale around center, (0.5, 0.5) */
- if(tex->checkerdist<1.0) {
- fx= (fx-0.5)/(1.0-tex->checkerdist) +0.5;
- fy= (fy-0.5)/(1.0-tex->checkerdist) +0.5;
+ if(tex->checkerdist<1.0f) {
+ fx= (fx-0.5f)/(1.0f-tex->checkerdist) +0.5f;
+ fy= (fy-0.5f)/(1.0f-tex->checkerdist) +0.5f;
}
}
@@ -163,7 +168,7 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, TexResult *texre
y = (int)floorf(fy*ibuf->y);
if(tex->extend == TEX_CLIPCUBE) {
- if(x<0 || y<0 || x>=ibuf->x || y>=ibuf->y || texvec[2]<-1.0 || texvec[2]>1.0) {
+ if(x<0 || y<0 || x>=ibuf->x || y>=ibuf->y || texvec[2]<-1.0f || texvec[2]>1.0f) {
return retval;
}
}
@@ -253,7 +258,7 @@ int imagewrap(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, TexResult *texre
if(tex->flag & TEX_NEGALPHA) texres->ta= 1.0f-texres->ta;
/* de-premul, this is being premulled in shade_input_do_shade() */
- if(texres->ta!=1.0f && texres->ta>FLT_EPSILON) {
+ if(texres->ta!=1.0f && texres->ta>1e-4f) {
fx= 1.0f/texres->ta;
texres->tr*= fx;
texres->tg*= fx;
@@ -395,7 +400,7 @@ static float clipx_rctf(rctf *rf, float x1, float x2)
rf->xmin = rf->xmax;
return 0.0;
}
- else if(size!=0.0) {
+ else if(size!=0.0f) {
return (rf->xmax - rf->xmin)/size;
}
return 1.0;
@@ -418,7 +423,7 @@ static float clipy_rctf(rctf *rf, float y1, float y2)
rf->ymin = rf->ymax;
return 0.0;
}
- else if(size!=0.0) {
+ else if(size!=0.0f) {
return (rf->ymax - rf->ymin)/size;
}
return 1.0;
@@ -477,12 +482,12 @@ static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres)
ibuf_get_color(col, ibuf, x, y);
- if(mulx==1.0) {
+ if(mulx==1.0f) {
texres->ta+= col[3];
texres->tr+= col[0];
texres->tg+= col[1];
texres->tb+= col[2];
- div+= 1.0;
+ div+= 1.0f;
}
else {
texres->ta+= mulx*col[3];
@@ -495,7 +500,7 @@ static void boxsampleclip(struct ImBuf *ibuf, rctf *rf, TexResult *texres)
}
}
- if(div!=0.0) {
+ if(div!=0.0f) {
div= 1.0f/div;
texres->tb*= div;
texres->tg*= div;
@@ -516,6 +521,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
* clipped-away parts are sampled as well.
*/
/* note: actually minx etc isnt in the proper range... this due to filter size and offset vectors for bump */
+ /* note: talpha must be initialized */
TexResult texr;
rctf *rf, stack[8];
float opp, tot, alphaclip= 1.0;
@@ -538,7 +544,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
else {
alphaclip= clipx_rctf(rf, 0.0, (float)(ibuf->x));
- if(alphaclip<=0.0) {
+ if(alphaclip<=0.0f) {
texres->tr= texres->tb= texres->tg= texres->ta= 0.0;
return;
}
@@ -553,7 +559,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
else {
alphaclip*= clipy_rctf(rf, 0.0, (float)(ibuf->y));
- if(alphaclip<=0.0) {
+ if(alphaclip<=0.0f) {
texres->tr= texres->tb= texres->tg= texres->ta= 0.0;
return;
}
@@ -573,7 +579,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
if(texres->talpha) texres->ta+= opp*texr.ta;
rf++;
}
- if(tot!= 0.0) {
+ if(tot!= 0.0f) {
texres->tr/= tot;
texres->tg/= tot;
texres->tb/= tot;
@@ -585,7 +591,7 @@ static void boxsample(ImBuf *ibuf, float minx, float miny, float maxx, float max
if(texres->talpha==0) texres->ta= 1.0;
- if(alphaclip!=1.0) {
+ if(alphaclip!=1.0f) {
/* premul it all */
texres->tr*= alphaclip;
texres->tg*= alphaclip;
@@ -958,7 +964,7 @@ static void alpha_clip_aniso(ImBuf *ibuf, float minx, float miny, float maxx, fl
alphaclip*= clipy_rctf(&rf, 0.0, (float)(ibuf->y));
alphaclip= MAX2(alphaclip, 0.0f);
- if(alphaclip!=1.0) {
+ if(alphaclip!=1.0f) {
/* premul it all */
texres->tr*= alphaclip;
texres->tg*= alphaclip;
@@ -1094,8 +1100,8 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec,
}
// side faces of unit-cube
- minx = (minx > 0.25f) ? 0.25f : ((minx < 1e-5f) ? 1e-5 : minx);
- miny = (miny > 0.25f) ? 0.25f : ((miny < 1e-5f) ? 1e-5 : miny);
+ minx = (minx > 0.25f) ? 0.25f : ((minx < 1e-5f) ? 1e-5f : minx);
+ miny = (miny > 0.25f) ? 0.25f : ((miny < 1e-5f) ? 1e-5f : miny);
// repeat and clip
@@ -1183,10 +1189,8 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec,
// brecht: added stupid clamping here, large dx/dy can give very large
// filter sizes which take ages to render, it may be better to do this
// more intelligently later in the code .. probably it's not noticeable
- if(AFD.dxt[0]*AFD.dxt[0] + AFD.dxt[1]*AFD.dxt[1] > 2.0f*2.0f) {
+ if(AFD.dxt[0]*AFD.dxt[0] + AFD.dxt[1]*AFD.dxt[1] > 2.0f*2.0f)
mul_v2_fl(AFD.dxt, 2.0f/len_v2(AFD.dxt));
- mul_v2_fl(AFD.dyt, 2.0f/len_v2(AFD.dyt));
- }
if(AFD.dyt[0]*AFD.dyt[0] + AFD.dyt[1]*AFD.dyt[1] > 2.0f*2.0f)
mul_v2_fl(AFD.dyt, 2.0f/len_v2(AFD.dyt));
@@ -1371,7 +1375,7 @@ static int imagewraposa_aniso(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec,
// brecht: tried to fix this, see "TXF alpha" comments
- if (texres->ta != 1.f && (texres->ta > FLT_EPSILON)) {
+ if (texres->ta != 1.f && (texres->ta > 1e-4f)) {
fx = 1.f/texres->ta;
texres->tr *= fx;
texres->tg *= fx;
@@ -1482,9 +1486,9 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
if(tex->imaflag & TEX_IMAROT) SWAP(float, minx, miny);
- if(minx>0.25) minx= 0.25;
+ if(minx>0.25f) minx= 0.25f;
else if(minx<0.00001f) minx= 0.00001f; /* side faces of unit-cube */
- if(miny>0.25) miny= 0.25;
+ if(miny>0.25f) miny= 0.25f;
else if(miny<0.00001f) miny= 0.00001f;
@@ -1548,41 +1552,41 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
}
/* scale around center, (0.5, 0.5) */
- if(tex->checkerdist<1.0) {
- fx= (fx-0.5)/(1.0-tex->checkerdist) +0.5;
- fy= (fy-0.5)/(1.0-tex->checkerdist) +0.5;
- minx/= (1.0-tex->checkerdist);
- miny/= (1.0-tex->checkerdist);
+ if(tex->checkerdist<1.0f) {
+ fx= (fx-0.5f)/(1.0f-tex->checkerdist) +0.5f;
+ fy= (fy-0.5f)/(1.0f-tex->checkerdist) +0.5f;
+ minx/= (1.0f-tex->checkerdist);
+ miny/= (1.0f-tex->checkerdist);
}
}
if(tex->extend == TEX_CLIPCUBE) {
- if(fx+minx<0.0 || fy+miny<0.0 || fx-minx>1.0 || fy-miny>1.0 || texvec[2]<-1.0 || texvec[2]>1.0) {
+ if(fx+minx<0.0f || fy+miny<0.0f || fx-minx>1.0f || fy-miny>1.0f || texvec[2]<-1.0f || texvec[2]>1.0f) {
return retval;
}
}
else if(tex->extend==TEX_CLIP || tex->extend==TEX_CHECKER) {
- if(fx+minx<0.0 || fy+miny<0.0 || fx-minx>1.0 || fy-miny>1.0) {
+ if(fx+minx<0.0f || fy+miny<0.0f || fx-minx>1.0f || fy-miny>1.0f) {
return retval;
}
}
else {
if(imapextend) {
- if(fx>1.0) fx = 1.0;
- else if(fx<0.0) fx= 0.0;
+ if(fx>1.0f) fx = 1.0f;
+ else if(fx<0.0f) fx= 0.0f;
}
else {
- if(fx>1.0) fx -= (int)(fx);
- else if(fx<0.0) fx+= 1-(int)(fx);
+ if(fx>1.0f) fx -= (int)(fx);
+ else if(fx<0.0f) fx+= 1-(int)(fx);
}
if(imapextend) {
- if(fy>1.0) fy = 1.0;
- else if(fy<0.0) fy= 0.0;
+ if(fy>1.0f) fy = 1.0f;
+ else if(fy<0.0f) fy= 0.0f;
}
else {
- if(fy>1.0) fy -= (int)(fy);
- else if(fy<0.0) fy+= 1-(int)(fy);
+ if(fy>1.0f) fy -= (int)(fy);
+ else if(fy<0.0f) fy+= 1-(int)(fy);
}
}
@@ -1599,7 +1603,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
dx= minx;
dy= miny;
maxd= MAX2(dx, dy);
- if(maxd>0.5) maxd= 0.5;
+ if(maxd>0.5f) maxd= 0.5f;
pixsize = 1.0f/ (float) MIN2(ibuf->x, ibuf->y);
@@ -1690,7 +1694,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
fx= 2.0f*(pixsize-maxd)/pixsize;
- if(fx>=1.0) {
+ if(fx>=1.0f) {
texres->ta= texr.ta; texres->tb= texr.tb;
texres->tg= texr.tg; texres->tr= texr.tr;
} else {
@@ -1752,7 +1756,7 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *DXT, f
}
/* de-premul, this is being premulled in shade_input_do_shade() */
- if(texres->ta!=1.0f && texres->ta>FLT_EPSILON) {
+ if(texres->ta!=1.0f && texres->ta>1e-4f) {
fx= 1.0f/texres->ta;
texres->tr*= fx;
texres->tg*= fx;
@@ -1776,7 +1780,8 @@ void image_sample(Image *ima, float fx, float fy, float dx, float dy, float *res
if( (R.flag & R_SEC_FIELD) && (ibuf->flags & IB_fields) )
ibuf->rect+= (ibuf->x*ibuf->y);
-
+
+ texres.talpha= 1; /* boxsample expects to be initialized */
boxsample(ibuf, fx, fy, fx+dx, fy+dy, &texres, 0, 1);
result[0]= texres.tr;
result[1]= texres.tg;
diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c
index 7ba2d2d9c88..e0440528168 100644
--- a/source/blender/render/intern/source/initrender.c
+++ b/source/blender/render/intern/source/initrender.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/initrender.c
+ * \ingroup render
+ */
+
+
/* Global includes */
diff --git a/source/blender/render/intern/source/occlusion.c b/source/blender/render/intern/source/occlusion.c
index 4d129312672..0aa65479a4f 100644
--- a/source/blender/render/intern/source/occlusion.c
+++ b/source/blender/render/intern/source/occlusion.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/occlusion.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
@@ -189,6 +194,7 @@ static void occ_shade(ShadeSample *ssamp, ObjectInstanceRen *obi, VlakRen *vlr,
if(shi->obr->ob && shi->obr->ob->transflag & OB_NEG_SCALE) {
negate_v3(shi->vn);
negate_v3(shi->vno);
+ negate_v3(shi->nmapnorm);
}
/* init material vars */
@@ -608,7 +614,8 @@ static void occ_build_recursive(OcclusionTree *tree, OccNode *node, int begin, i
/* compute maximum distance from center */
node->dco= 0.0f;
- occ_build_dco(tree, node, node->co, &node->dco);
+ if(node->area > 0.0f)
+ occ_build_dco(tree, node, node->co, &node->dco);
}
static void occ_build_sh_normalize(OccNode *node)
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index abb7acd91fc..5f3c473d41d 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -26,10 +26,16 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/pipeline.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>
+#include <stddef.h>
#include "DNA_group_types.h"
#include "DNA_image_types.h"
@@ -41,18 +47,18 @@
#include "MEM_guardedalloc.h"
-#include "BKE_utildefines.h"
+#include "BKE_animsys.h" /* <------ should this be here?, needed for sequencer update */
#include "BKE_global.h"
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_object.h"
+#include "BKE_pointcache.h"
#include "BKE_report.h"
#include "BKE_scene.h"
-#include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */
#include "BKE_sequencer.h"
-#include "BKE_pointcache.h"
-#include "BKE_animsys.h" /* <------ should this be here?, needed for sequencer update */
+#include "BKE_utildefines.h"
+#include "BKE_writeavi.h" /* <------ should be replaced once with generic movie module */
#include "BLI_math.h"
#include "BLI_blenlib.h"
@@ -1399,6 +1405,12 @@ void RE_progress_cb(Render *re, void *handle, void (*f)(void *handle, float))
re->prh= handle;
}
+void RE_draw_lock_cb(Render *re, void *handle, void (*f)(void *handle, int i))
+{
+ re->draw_lock= f;
+ re->tbh= handle;
+}
+
void RE_test_break_cb(Render *re, void *handle, int (*f)(void *handle))
{
re->test_break= f;
@@ -1785,12 +1797,20 @@ static void do_render_3d(Render *re)
// re->cfra= cfra; /* <- unused! */
re->scene->r.subframe = re->mblur_offs + re->field_offs;
+ /* lock drawing in UI during data phase */
+ if(re->draw_lock)
+ re->draw_lock(re->dlh, 1);
+
/* make render verts/faces/halos/lamps */
if(render_scene_needs_vector(re))
RE_Database_FromScene_Vectors(re, re->main, re->scene, re->lay);
else
RE_Database_FromScene(re, re->main, re->scene, re->lay, 1);
+ /* clear UI drawing locks */
+ if(re->draw_lock)
+ re->draw_lock(re->dlh, 0);
+
threaded_tile_processor(re);
/* do left-over 3d post effects (flares) */
@@ -2284,9 +2304,12 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
tag_scenes_for_render(re);
for(re1= RenderGlobal.renderlist.first; re1; re1= re1->next) {
- if(re1->scene->id.flag & LIB_DOIT)
- if(re1->r.scemode & R_FULL_SAMPLE)
+ if(re1->scene->id.flag & LIB_DOIT) {
+ if(re1->r.scemode & R_FULL_SAMPLE) {
read_render_result(re1, sample);
+ ntreeCompositTagRender(re1->scene); /* ensure node gets exec to put buffers on stack */
+ }
+ }
}
}
@@ -3327,13 +3350,9 @@ void RE_result_load_from_file(RenderResult *result, ReportList *reports, const c
static int external_render_3d(Render *re, int do_all)
{
- RenderEngineType *type;
+ RenderEngineType *type= BLI_findstring(&R_engines, re->r.engine, offsetof(RenderEngineType, idname));
RenderEngine engine;
- for(type=R_engines.first; type; type=type->next)
- if(strcmp(type->idname, re->r.engine) == 0)
- break;
-
if(!(type && type->render))
return 0;
if((re->r.scemode & R_PREVIEWBUTS) && !(type->flag & RE_DO_PREVIEW))
diff --git a/source/blender/render/intern/source/pixelblending.c b/source/blender/render/intern/source/pixelblending.c
index 8ff35bc9bae..a22680c7085 100644
--- a/source/blender/render/intern/source/pixelblending.c
+++ b/source/blender/render/intern/source/pixelblending.c
@@ -30,6 +30,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/pixelblending.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <string.h>
diff --git a/source/blender/render/intern/source/pixelshading.c b/source/blender/render/intern/source/pixelshading.c
index a814b74dcfc..84523975589 100644
--- a/source/blender/render/intern/source/pixelshading.c
+++ b/source/blender/render/intern/source/pixelshading.c
@@ -24,6 +24,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/pixelshading.c
+ * \ingroup render
+ */
+
+
#include <float.h>
#include <math.h>
#include <string.h>
diff --git a/source/blender/render/intern/source/pointdensity.c b/source/blender/render/intern/source/pointdensity.c
index 5cf65eccd9a..54c2f020f5b 100644
--- a/source/blender/render/intern/source/pointdensity.c
+++ b/source/blender/render/intern/source/pointdensity.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/pointdensity.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
@@ -63,10 +68,12 @@ static int point_data_used(PointDensity *pd)
{
int pd_bitflag = 0;
- if ((pd->noise_influence == TEX_PD_NOISE_VEL) || (pd->color_source == TEX_PD_COLOR_PARTVEL) || (pd->color_source == TEX_PD_COLOR_PARTSPEED))
- pd_bitflag |= POINT_DATA_VEL;
- if ((pd->noise_influence == TEX_PD_NOISE_AGE) || (pd->color_source == TEX_PD_COLOR_PARTAGE))
- pd_bitflag |= POINT_DATA_LIFE;
+ if (pd->source == TEX_PD_PSYS) {
+ if ((pd->noise_influence == TEX_PD_NOISE_VEL) || (pd->color_source == TEX_PD_COLOR_PARTVEL) || (pd->color_source == TEX_PD_COLOR_PARTSPEED))
+ pd_bitflag |= POINT_DATA_VEL;
+ if ((pd->noise_influence == TEX_PD_NOISE_AGE) || (pd->color_source == TEX_PD_COLOR_PARTAGE))
+ pd_bitflag |= POINT_DATA_LIFE;
+ }
return pd_bitflag;
}
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
index 99e17a1999f..0acae258cf8 100644
--- a/source/blender/render/intern/source/rayshade.c
+++ b/source/blender/render/intern/source/rayshade.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/rayshade.c
+ * \ingroup render
+ */
+
+
#include <stdio.h>
#include <math.h>
#include <string.h>
@@ -757,7 +762,7 @@ static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, flo
if(depth>0) {
float fr, fg, fb, f, f1;
- if((shi.mat->mode_l & MA_TRANSP) && shr.alpha < 1.0f) {
+ if((shi.mat->mode_l & MA_TRANSP) && shr.alpha < 1.0f && (shi.mat->mode_l & (MA_ZTRANSP | MA_RAYTRANSP))) {
float nf, f, refract[3], tracol[4];
tracol[0]= shi.r;
@@ -1819,7 +1824,7 @@ static float *threadsafe_table_sphere(int test, int thread, int xs, int ys, int
return R.wrld.aotables+ thread*tot*3;
}
-static float *sphere_sampler(int type, int resol, int thread, int xs, int ys)
+static float *sphere_sampler(int type, int resol, int thread, int xs, int ys, int reset)
{
int tot;
float *vec;
@@ -1847,8 +1852,8 @@ static float *sphere_sampler(int type, int resol, int thread, int xs, int ys)
float ang, *vec1;
int a;
- // returns table if xs and ys were equal to last call
- sphere= threadsafe_table_sphere(1, thread, xs, ys, tot);
+ // returns table if xs and ys were equal to last call, and not resetting
+ sphere= (reset)? NULL: threadsafe_table_sphere(1, thread, xs, ys, tot);
if(sphere==NULL) {
sphere= threadsafe_table_sphere(0, thread, xs, ys, tot);
@@ -2066,8 +2071,10 @@ static void ray_ao_spheresamp(ShadeInput *shi, float *ao, float *env)
envcolor= WO_AOPLAIN;
if(resol>32) resol= 32;
-
- vec= sphere_sampler(R.wrld.aomode, resol, shi->thread, shi->xs, shi->ys);
+
+ /* get sphere samples. for faces we get the same samples for sample x/y values,
+ for strand render we always require a new sampler because x/y are not set */
+ vec= sphere_sampler(R.wrld.aomode, resol, shi->thread, shi->xs, shi->ys, shi->strand != NULL);
// warning: since we use full sphere now, and dotproduct is below, we do twice as much
tot= 2*resol*resol;
@@ -2342,7 +2349,7 @@ static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *
samples++;
- if ((lar->ray_samp_method == LA_SAMP_HALTON)) {
+ if (lar->ray_samp_method == LA_SAMP_HALTON) {
/* adaptive sampling - consider samples below threshold as in shadow (or vice versa) and exit early */
if ((max_samples > min_adapt_samples) && (adapt_thresh > 0.0) && (samples > max_samples / 3)) {
diff --git a/source/blender/render/intern/source/render_texture.c b/source/blender/render/intern/source/render_texture.c
index 0da1070679e..2b98e7a3f96 100644
--- a/source/blender/render/intern/source/render_texture.c
+++ b/source/blender/render/intern/source/render_texture.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/render_texture.c
+ * \ingroup render
+ */
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -1825,8 +1830,8 @@ static int compatible_bump_compute(CompatibleBump *compat_bump, ShadeInput *shi,
idv = (dv < 1e-5f) ? bf : (bf/dv);
if ((mtex->texco == TEXCO_ORCO) && shi->obr && shi->obr->ob) {
- mul_mat3_m4_v3(shi->obr->ob->imat, tu);
- mul_mat3_m4_v3(shi->obr->ob->imat, tv);
+ mul_mat3_m4_v3(shi->obr->ob->imat_ren, tu);
+ mul_mat3_m4_v3(shi->obr->ob->imat_ren, tv);
normalize_v3(tu);
normalize_v3(tv);
}
@@ -1835,8 +1840,8 @@ static int compatible_bump_compute(CompatibleBump *compat_bump, ShadeInput *shi,
mul_mat3_m4_v3(R.viewinv, tv);
}
else if (mtex->texco == TEXCO_OBJECT && mtex->object) {
- mul_mat3_m4_v3(mtex->object->imat, tu);
- mul_mat3_m4_v3(mtex->object->imat, tv);
+ mul_mat3_m4_v3(mtex->object->imat_ren, tu);
+ mul_mat3_m4_v3(mtex->object->imat_ren, tv);
normalize_v3(tu);
normalize_v3(tv);
}
@@ -2172,12 +2177,12 @@ void do_material_tex(ShadeInput *shi)
if(mtex->texflag & MTEX_OB_DUPLI_ORIG)
if(shi->obi && shi->obi->duplitexmat)
mul_m4_v3(shi->obi->duplitexmat, tempvec);
- mul_m4_v3(ob->imat, tempvec);
+ mul_m4_v3(ob->imat_ren, tempvec);
if(shi->osatex) {
VECCOPY(dxt, shi->dxco);
VECCOPY(dyt, shi->dyco);
- mul_mat3_m4_v3(ob->imat, dxt);
- mul_mat3_m4_v3(ob->imat, dyt);
+ mul_mat3_m4_v3(ob->imat_ren, dxt);
+ mul_mat3_m4_v3(ob->imat_ren, dyt);
}
}
else {
@@ -2334,9 +2339,16 @@ void do_material_tex(ShadeInput *shi)
}
// warping, local space
if(mtex->mapto & MAP_WARP) {
- warpvec[0]= mtex->warpfac*texres.nor[0];
- warpvec[1]= mtex->warpfac*texres.nor[1];
- warpvec[2]= mtex->warpfac*texres.nor[2];
+ float *warpnor= texres.nor, warpnor_[3];
+
+ if(use_ntap_bump) {
+ VECCOPY(warpnor_, texres.nor);
+ warpnor= warpnor_;
+ normalize_v3(warpnor_);
+ }
+ warpvec[0]= mtex->warpfac*warpnor[0];
+ warpvec[1]= mtex->warpfac*warpnor[1];
+ warpvec[2]= mtex->warpfac*warpnor[2];
warpdone= 1;
}
#if 0
@@ -2648,7 +2660,7 @@ void do_volume_tex(ShadeInput *shi, float *xyz, int mapto_flag, float *col, floa
if(shi->obi && shi->obi->duplitexmat)
mul_m4_v3(shi->obi->duplitexmat, co);
}
- mul_m4_v3(ob->imat, co);
+ mul_m4_v3(ob->imat_ren, co);
}
}
/* not really orco, but 'local' */
@@ -2660,7 +2672,7 @@ void do_volume_tex(ShadeInput *shi, float *xyz, int mapto_flag, float *col, floa
else {
Object *ob= shi->obi->ob;
VECCOPY(co, xyz);
- mul_m4_v3(ob->imat, co);
+ mul_m4_v3(ob->imat_ren, co);
}
}
else if(mtex->texco==TEXCO_GLOB) {
@@ -3011,7 +3023,7 @@ void do_sky_tex(float *rco, float *lo, float *dxyview, float *hor, float *zen, f
case TEXCO_OBJECT:
if(mtex->object) {
VECCOPY(tempvec, lo);
- mul_m4_v3(mtex->object->imat, tempvec);
+ mul_m4_v3(mtex->object->imat_ren, tempvec);
co= tempvec;
}
break;
@@ -3160,12 +3172,12 @@ void do_lamp_tex(LampRen *la, float *lavec, ShadeInput *shi, float *colf, int ef
dx= dxt;
dy= dyt;
VECCOPY(tempvec, shi->co);
- mul_m4_v3(ob->imat, tempvec);
+ mul_m4_v3(ob->imat_ren, tempvec);
if(shi->osatex) {
VECCOPY(dxt, shi->dxco);
VECCOPY(dyt, shi->dyco);
- mul_mat3_m4_v3(ob->imat, dxt);
- mul_mat3_m4_v3(ob->imat, dyt);
+ mul_mat3_m4_v3(ob->imat_ren, dxt);
+ mul_mat3_m4_v3(ob->imat_ren, dyt);
}
}
else {
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 52a80fba5bf..6d19846d80a 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/rendercore.c
+ * \ingroup render
+ */
+
+
/* system includes */
#include <stdio.h>
#include <math.h>
@@ -1538,6 +1543,7 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, ObjectInstanceRe
if(shi->obr->ob && shi->obr->ob->transflag & OB_NEG_SCALE) {
negate_v3(shi->vn);
negate_v3(shi->vno);
+ negate_v3(shi->nmapnorm);
}
/* if nodetree, use the material that we are currently preprocessing
@@ -2174,7 +2180,7 @@ static void bake_shade(void *handle, Object *ob, ShadeInput *shi, int quad, int
mul_m3_v3(imat, nor);
}
else if(R.r.bake_normal_space == R_BAKE_SPACE_OBJECT)
- mul_mat3_m4_v3(ob->imat, nor); /* ob->imat includes viewinv! */
+ mul_mat3_m4_v3(ob->imat_ren, nor); /* ob->imat_ren includes viewinv! */
else if(R.r.bake_normal_space == R_BAKE_SPACE_WORLD)
mul_mat3_m4_v3(R.viewinv, nor);
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index e000d7731f4..74c99d1a92f 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -25,6 +25,11 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/renderdatabase.c
+ * \ingroup render
+ */
+
+
/*
* Storage, retrieval and query of render specific data.
*
@@ -1124,16 +1129,8 @@ HaloRen *RE_inithalo_particle(Render *re, ObjectRen *obr, DerivedMesh *dm, Mater
;
}
else if(mtex->texco & TEXCO_OBJECT) {
- if(mtex->object){
- float imat[4][4];
- /* imat should really be cached somewhere before this */
- invert_m4_m4(imat,mtex->object->obmat);
- mul_m4_v3(imat,texvec);
- }
- /* texvec[0]+= imatbase->ivec[0]; */
- /* texvec[1]+= imatbase->ivec[1]; */
- /* texvec[2]+= imatbase->ivec[2]; */
- /* mul_m3_v3(imatbase->imat, texvec); */
+ if(mtex->object)
+ mul_m4_v3(mtex->object->imat_ren,texvec);
}
else if(mtex->texco & TEXCO_GLOB){
VECCOPY(texvec,vec);
diff --git a/source/blender/render/intern/source/shadbuf.c b/source/blender/render/intern/source/shadbuf.c
index 8dd07fad022..038d1bd40cb 100644
--- a/source/blender/render/intern/source/shadbuf.c
+++ b/source/blender/render/intern/source/shadbuf.c
@@ -23,6 +23,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/shadbuf.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <string.h>
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index 41afbb4b5d6..d34ef85baa4 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/shadeinput.c
+ * \ingroup render
+ */
+
+
#include <stdio.h>
#include <math.h>
#include <string.h>
@@ -577,7 +582,7 @@ void shade_input_set_strand_texco(ShadeInput *shi, StrandRen *strand, StrandVert
}
}
- if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ if (shi->do_manage) {
if(mode & (MA_VERTEXCOL|MA_VERTEXCOLP|MA_FACETEXTURE)) {
srgb_to_linearrgb_v3_v3(shi->vcol, shi->vcol);
}
@@ -1310,7 +1315,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
} /* else {
Note! For raytracing winco is not set, important because thus means all shader input's need to have their variables set to zero else in-initialized values are used
*/
- if (R.r.color_mgt_flag & R_COLOR_MANAGEMENT) {
+ if (shi->do_manage) {
if(mode & (MA_VERTEXCOL|MA_VERTEXCOLP|MA_FACETEXTURE)) {
srgb_to_linearrgb_v3_v3(shi->vcol, shi->vcol);
}
@@ -1329,6 +1334,7 @@ void shade_input_initialize(ShadeInput *shi, RenderPart *pa, RenderLayer *rl, in
shi->sample= sample;
shi->thread= pa->thread;
shi->do_preview= (R.r.scemode & R_MATNODE_PREVIEW) != 0;
+ shi->do_manage= (R.r.color_mgt_flag & R_COLOR_MANAGEMENT);
shi->lay= rl->lay;
shi->layflag= rl->layflag;
shi->passflag= rl->passflag;
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 1dec0d2a6b2..d98fc3ceeb7 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -25,6 +25,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/shadeoutput.c
+ * \ingroup render
+ */
+
+
#include <stdio.h>
#include <float.h>
#include <math.h>
@@ -854,7 +859,9 @@ void shade_color(ShadeInput *shi, ShadeResult *shr)
if(ma->fresnel_tra!=0.0f)
shi->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
-
+
+ if (!(shi->mode & MA_TRANSP)) shi->alpha= 1.0f;
+
shr->diff[0]= shi->r;
shr->diff[1]= shi->g;
shr->diff[2]= shi->b;
@@ -1478,10 +1485,10 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
float inpr, lv[3];
float *view, shadfac[4];
float ir, accum, visifac, lampdist;
+ float shaded = 0.0f, lightness = 0.0f;
view= shi->view;
-
accum= ir= 0.0f;
lights= get_lights(shi);
@@ -1498,27 +1505,69 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
if(lar->shb || (lar->mode & LA_SHAD_RAY)) {
visifac= lamp_get_visibility(lar, shi->co, lv, &lampdist);
if(visifac <= 0.0f) {
- ir+= 1.0f;
- accum+= 1.0f;
+ if (shi->mat->shadowonly_flag == MA_SO_OLD) {
+ ir+= 1.0f;
+ accum+= 1.0f;
+ }
continue;
}
inpr= INPR(shi->vn, lv);
if(inpr <= 0.0f) {
- ir+= 1.0f;
- accum+= 1.0f;
+ if (shi->mat->shadowonly_flag == MA_SO_OLD) {
+ ir+= 1.0f;
+ accum+= 1.0f;
+ }
continue;
- }
+ }
+
lamp_get_shadow(lar, shi, inpr, shadfac, shi->depth);
- ir+= 1.0f;
- accum+= (1.0f-visifac) + (visifac)*rgb_to_grayscale(shadfac)*shadfac[3];
+ if (shi->mat->shadowonly_flag == MA_SO_OLD) {
+ /* Old "Shadows Only" */
+ ir+= 1.0f;
+ accum+= (1.0f-visifac) + (visifac)*rgb_to_grayscale(shadfac)*shadfac[3];
+ }
+ else {
+ ir+= lar->energy;
+ shaded += rgb_to_grayscale(shadfac)*shadfac[3] * visifac * lar->energy;
+
+ if (shi->mat->shadowonly_flag == MA_SO_SHADOW) {
+ lightness += visifac * lar->energy;
+ }
+ }
}
}
+
+ /* Apply shadows as alpha */
if(ir>0.0f) {
- accum/= ir;
- shr->alpha= (shi->mat->alpha)*(1.0f-accum);
+ if (shi->mat->shadowonly_flag == MA_SO_OLD) {
+ accum = 1.0f - accum/ir;
+ }
+ else {
+ shaded/= ir;
+ lightness/= ir;
+
+ if (shi->mat->shadowonly_flag == MA_SO_SHADOW) {
+ if (lightness > 0.0f) {
+ /* Get shadow value from between 0.0f and non-shadowed lightness */
+ accum = (lightness - shaded) / (lightness);
+ }
+ else {
+ accum = 0.0f;
+ }
+ }
+ else { /* shadowonly_flag == MA_SO_SHADED */
+ /* Use shaded value */
+ accum = 1.0f - shaded;
+ }}
+
+ shr->alpha= (shi->alpha)*(accum);
+ }
+ else {
+ /* If "fully shaded", use full alpha even on areas that have no lights */
+ if (shi->mat->shadowonly_flag == MA_SO_SHADED) shr->alpha=1.0f;
+ else shr->alpha= 0.f;
}
- else shr->alpha= 0.f;
}
/* quite disputable this... also note it doesn't mirror-raytrace */
@@ -1527,18 +1576,31 @@ static void shade_lamp_loop_only_shadow(ShadeInput *shi, ShadeResult *shr)
if(R.wrld.mode & WO_AMB_OCC) {
f= R.wrld.aoenergy*shi->amb;
-
+
if(R.wrld.aomix==WO_AOADD) {
- f= f*(1.0f - rgb_to_grayscale(shi->ao));
- shr->alpha= (shr->alpha + f)*f;
+ if (shi->mat->shadowonly_flag == MA_SO_OLD) {
+ f= f*(1.0f - rgb_to_grayscale(shi->ao));
+ shr->alpha= (shr->alpha + f)*f;
+ }
+ else {
+ shr->alpha -= f*rgb_to_grayscale(shi->ao);
+ if (shr->alpha<0.0f) shr->alpha=0.0f;
+ }
}
- else
+ else /* AO Multiply */
shr->alpha= (1.0f - f)*shr->alpha + f*(1.0f - (1.0f - shr->alpha)*rgb_to_grayscale(shi->ao));
}
if(R.wrld.mode & WO_ENV_LIGHT) {
- f= R.wrld.ao_env_energy*shi->amb*(1.0f - rgb_to_grayscale(shi->env));
- shr->alpha= (shr->alpha + f)*f;
+ if (shi->mat->shadowonly_flag == MA_SO_OLD) {
+ f= R.wrld.ao_env_energy*shi->amb*(1.0f - rgb_to_grayscale(shi->env));
+ shr->alpha= (shr->alpha + f)*f;
+ }
+ else {
+ f= R.wrld.ao_env_energy*shi->amb;
+ shr->alpha -= f*rgb_to_grayscale(shi->env);
+ if (shr->alpha<0.0f) shr->alpha=0.0f;
+ }
}
}
}
@@ -1559,6 +1621,8 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
memset(shr, 0, sizeof(ShadeResult));
+ if(!(shi->mode & MA_TRANSP)) shi->alpha = 1.0f;
+
/* separate loop */
if(ma->mode & MA_ONLYSHADOW) {
shade_lamp_loop_only_shadow(shi, shr);
@@ -1575,10 +1639,12 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
shi->g= shi->vcol[1];
shi->b= shi->vcol[2];
if(ma->mode & (MA_FACETEXTURE_ALPHA))
- shi->alpha= shi->vcol[3];
+ shi->alpha= (shi->mode & MA_TRANSP) ? shi->vcol[3] : 1.0f;
}
- if(ma->texco)
+ if(ma->texco){
do_material_tex(shi);
+ if (!(shi->mode & MA_TRANSP)) shi->alpha = 1.0f;
+ }
shr->col[0]= shi->r*shi->alpha;
shr->col[1]= shi->g*shi->alpha;
@@ -1733,11 +1799,11 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
/* alpha in end, spec can influence it */
if(passflag & (SCE_PASS_COMBINED)) {
- if(ma->fresnel_tra!=0.0f)
+ if((ma->fresnel_tra!=0.0f) && (shi->mode & MA_TRANSP))
shi->alpha*= fresnel_fac(shi->view, shi->vn, ma->fresnel_tra_i, ma->fresnel_tra);
/* note: shi->mode! */
- if(shi->mode & MA_TRANSP) {
+ if(shi->mode & MA_TRANSP && (shi->mode & (MA_ZTRANSP|MA_RAYTRANSP))) {
if(shi->spectra!=0.0f) {
float t = MAX3(shr->spec[0], shr->spec[1], shr->spec[2]);
t *= shi->spectra;
@@ -1807,7 +1873,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
shr->combined[0] *= obcol[0];
shr->combined[1] *= obcol[1];
shr->combined[2] *= obcol[2];
- shr->alpha *= obcol[3];
+ if (shi->mode & MA_TRANSP) shr->alpha *= obcol[3];
}
}
diff --git a/source/blender/render/intern/source/sss.c b/source/blender/render/intern/source/sss.c
index 44c89f8cbd5..f7d1b43d4f7 100644
--- a/source/blender/render/intern/source/sss.c
+++ b/source/blender/render/intern/source/sss.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/sss.c
+ * \ingroup render
+ */
+
+
/* Possible Improvements:
- add fresnel terms
- adapt Rd table to scale, now with small scale there are a lot of misses?
diff --git a/source/blender/render/intern/source/strand.c b/source/blender/render/intern/source/strand.c
index 67da11f4988..ef8b56738e4 100644
--- a/source/blender/render/intern/source/strand.c
+++ b/source/blender/render/intern/source/strand.c
@@ -27,6 +27,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/strand.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <string.h>
#include <stdlib.h>
@@ -42,6 +47,7 @@
#include "BLI_utildefines.h"
#include "BLI_ghash.h"
#include "BLI_memarena.h"
+#include "BLI_rand.h"
#include "BKE_DerivedMesh.h"
#include "BKE_key.h"
@@ -263,11 +269,12 @@ void strand_apply_shaderesult_alpha(ShadeResult *shr, float alpha)
}
}
-void strand_shade_point(Render *re, ShadeSample *ssamp, StrandSegment *sseg, StrandPoint *spoint)
+static void strand_shade_point(Render *re, ShadeSample *ssamp, StrandSegment *sseg, StrandVert *svert, StrandPoint *spoint)
{
ShadeInput *shi= ssamp->shi;
ShadeResult *shr= ssamp->shr;
VlakRen vlr;
+ int seed;
memset(&vlr, 0, sizeof(vlr));
vlr.flag= R_SMOOTH;
@@ -285,6 +292,13 @@ void strand_shade_point(Render *re, ShadeSample *ssamp, StrandSegment *sseg, Str
/* cache for shadow */
shi->samplenr= re->shadowsamplenr[shi->thread]++;
+ /* all samples */
+ shi->mask= 0xFFFF;
+
+ /* seed RNG for consistent results across tiles */
+ seed = shi->strand->index + (svert - shi->strand->vert);
+ BLI_thread_srandom(shi->thread, seed);
+
shade_input_set_strand(shi, sseg->strand, spoint);
shade_input_set_strand_texco(shi, sseg->strand, sseg->v[1], spoint);
@@ -347,7 +361,7 @@ static void strand_shade_get(Render *re, StrandShadeCache *cache, ShadeSample *s
/* not shaded yet, shade and insert into hash */
p.t= (sseg->v[1] == svert)? 0.0f: 1.0f;
strand_eval_point(sseg, &p);
- strand_shade_point(re, ssamp, sseg, &p);
+ strand_shade_point(re, ssamp, sseg, svert, &p);
hashshr= MEM_callocN(sizeof(ShadeResult), "HashShadeResult");
*hashshr= ssamp->shr[0];
@@ -661,8 +675,9 @@ static void strand_render(Render *re, StrandSegment *sseg, float winmat[][4], St
obi= sseg->obi - re->objectinstance;
index= sseg->strand->index;
- projectvert(p1->co, winmat, hoco1);
- projectvert(p2->co, winmat, hoco2);
+ projectvert(p1->co, winmat, hoco1);
+ projectvert(p2->co, winmat, hoco2);
+
for(a=0; a<totzspan; a++) {
#if 0
@@ -850,7 +865,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
else if(!shadow && (ma->mode & MA_ONLYCAST))
continue;
- if(clip_render_object(obi->obr->boundbox, bounds, winmat))
+ if(clip_render_object(obi->obr->boundbox, bounds, obwinmat))
continue;
widthx= obr->strandbuf->maxwidth*obwinmat[0][0];
@@ -859,7 +874,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
/* for each bounding box containing a number of strands */
sbound= obr->strandbuf->bound;
for(c=0; c<obr->strandbuf->totbound; c++, sbound++) {
- if(clip_render_object(sbound->boundbox, bounds, winmat))
+ if(clip_render_object(sbound->boundbox, bounds, obwinmat))
continue;
/* for each strand in this bounding box */
@@ -926,11 +941,6 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
obi= &re->objectinstance[sortseg->obi];
obr= obi->obr;
- if(obi->flag & R_TRANSFORMED)
- mul_m4_m4m4(obwinmat, obi->mat, winmat);
- else
- copy_m4_m4(obwinmat, winmat);
-
sseg.obi= obi;
sseg.strand= RE_findOrAddStrand(obr, sortseg->strand);
sseg.buffer= sseg.strand->buffer;
@@ -946,7 +956,7 @@ int zbuffer_strands_abuf(Render *re, RenderPart *pa, APixstrand *apixbuf, ListBa
spart.segment= &sseg;
- render_strand_segment(re, obwinmat, &spart, &zspan, 1, &sseg);
+ render_strand_segment(re, winmat, &spart, &zspan, 1, &sseg);
}
}
diff --git a/source/blender/render/intern/source/sunsky.c b/source/blender/render/intern/source/sunsky.c
index 193fd2aa46f..f10398388c1 100644
--- a/source/blender/render/intern/source/sunsky.c
+++ b/source/blender/render/intern/source/sunsky.c
@@ -1,4 +1,4 @@
- /**
+ /*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -18,6 +18,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/sunsky.c
+ * \ingroup render
+ */
+
+
#include "sunsky.h"
#include "math.h"
diff --git a/source/blender/render/intern/source/volume_precache.c b/source/blender/render/intern/source/volume_precache.c
index 173e1e0595a..54a8ba99db5 100644
--- a/source/blender/render/intern/source/volume_precache.c
+++ b/source/blender/render/intern/source/volume_precache.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/volume_precache.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/render/intern/source/volumetric.c b/source/blender/render/intern/source/volumetric.c
index 58466a9b169..dde9dbb8485 100644
--- a/source/blender/render/intern/source/volumetric.c
+++ b/source/blender/render/intern/source/volumetric.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/volumetric.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <string.h>
diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c
index 6190aca0e7f..4cb18c8cdcc 100644
--- a/source/blender/render/intern/source/voxeldata.c
+++ b/source/blender/render/intern/source/voxeldata.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/voxeldata.c
+ * \ingroup render
+ */
+
+
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
diff --git a/source/blender/render/intern/source/zbuf.c b/source/blender/render/intern/source/zbuf.c
index d16431068e0..79ee3994386 100644
--- a/source/blender/render/intern/source/zbuf.c
+++ b/source/blender/render/intern/source/zbuf.c
@@ -26,6 +26,11 @@
* ***** END GPL LICENSE BLOCK *****
*/
+/** \file blender/render/intern/source/zbuf.c
+ * \ingroup render
+ */
+
+
/*---------------------------------------------------------------------------*/
/* Common includes */
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index 5726ce47df7..b015e7bbb86 100644
--- a/source/blender/windowmanager/CMakeLists.txt
+++ b/source/blender/windowmanager/CMakeLists.txt
@@ -43,8 +43,8 @@ set(INC
../../../intern/elbeem/extern
../../../intern/ghost
../../../intern/opennl/extern
- ../../../extern/glew/include
${OPENGL_INCLUDE_DIR}
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index c21c714f125..dafa05fd974 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -359,7 +359,7 @@ void WM_progress_clear(struct wmWindow *win);
#ifdef WIN32
/* Windows System Console */
-void WM_toggle_console(struct bContext *C, short show);
+void WM_console_toggle(struct bContext *C, short show);
#endif
/* debugging only, convenience function to write on crash */
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index a0202d2b4cc..8a05c6b3fa8 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -179,6 +179,7 @@ typedef struct wmNotifier {
#define ND_EDITOR_CHANGED (6<<16) /*sent to new editors after switching to them*/
#define ND_SCREENSET (7<<16)
#define ND_SKETCH (8<<16)
+#define ND_SUBWINACTIVE (9<<16)
/* NC_SCENE Scene */
#define ND_SCENEBROWSE (1<<16)
diff --git a/source/blender/windowmanager/intern/wm_cursors.c b/source/blender/windowmanager/intern/wm_cursors.c
index 5951393a497..32a4648c7f8 100644
--- a/source/blender/windowmanager/intern/wm_cursors.c
+++ b/source/blender/windowmanager/intern/wm_cursors.c
@@ -47,6 +47,7 @@
#include "BKE_main.h"
#include "WM_api.h"
+#include "WM_types.h"
#include "wm_cursors.h"
/* XXX this still is mess from old code */
@@ -211,6 +212,29 @@ void WM_cursor_ungrab(wmWindow *win)
}
}
+/* give it a modal keymap one day? */
+int wm_cursor_arrow_move(wmWindow *win, wmEvent *event)
+{
+ if(win && event->val==KM_PRESS) {
+
+ if(event->type==UPARROWKEY) {
+ WM_cursor_warp(win, event->x, event->y+1);
+ return 1;
+ } else if(event->type==DOWNARROWKEY) {
+ WM_cursor_warp(win, event->x, event->y-1);
+ return 1;
+ } else if(event->type==LEFTARROWKEY) {
+ WM_cursor_warp(win, event->x-1, event->y);
+ return 1;
+ } else if(event->type==RIGHTARROWKEY) {
+ WM_cursor_warp(win, event->x+1, event->y);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
/* afer this you can call restore too */
void WM_timecursor(wmWindow *win, int nr)
{
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index c15916cf3d4..9dbb555725f 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -183,6 +183,7 @@ void wm_event_do_notifiers(bContext *C)
wmWindowManager *wm= CTX_wm_manager(C);
wmNotifier *note, *next;
wmWindow *win;
+ unsigned int win_combine_v3d_datamask= 0;
if(wm==NULL)
return;
@@ -270,7 +271,7 @@ void wm_event_do_notifiers(bContext *C)
CTX_wm_window_set(C, win);
/* printf("notifier win %d screen %s cat %x\n", win->winid, win->screen->id.name+2, note->category); */
- ED_screen_do_listen(win, note);
+ ED_screen_do_listen(C, note);
for(ar=win->screen->regionbase.first; ar; ar= ar->next) {
ED_region_do_listen(ar, note);
@@ -288,6 +289,11 @@ void wm_event_do_notifiers(bContext *C)
MEM_freeN(note);
}
+ /* combine datamasks so 1 win doesn't disable UV's in another [#26448] */
+ for(win= wm->windows.first; win; win= win->next) {
+ win_combine_v3d_datamask |= ED_viewedit_datamask(win->screen);
+ }
+
/* cached: editor refresh callbacks now, they get context */
for(win= wm->windows.first; win; win= win->next) {
ScrArea *sa;
@@ -305,7 +311,10 @@ void wm_event_do_notifiers(bContext *C)
/* depsgraph & animation: update tagged datablocks */
/* copied to set's in scene_update_tagged_recursive() */
- win->screen->scene->customdata_mask= ED_viewedit_datamask(win->screen);
+ win->screen->scene->customdata_mask= win_combine_v3d_datamask;
+
+ /* XXX, hack so operators can enforce datamasks [#26482], gl render */
+ win->screen->scene->customdata_mask |= win->screen->scene->customdata_mask_modal;
scene_update_tagged(CTX_data_main(C), win->screen->scene);
}
@@ -436,15 +445,19 @@ static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int pop
if(G.f & G_DEBUG)
wm_operator_print(C, op); /* todo - this print may double up, might want to check more flags then the FINISHED */
+ BKE_reports_print(op->reports, RPT_DEBUG); /* print out reports to console. */
if (op->type->flag & OPTYPE_REGISTER) {
- /* Report the python string representation of the operator */
- char *buf = WM_operator_pystring(C, op->type, op->ptr, 1);
- BKE_report(CTX_wm_reports(C), RPT_OPERATOR, buf);
- MEM_freeN(buf);
+ if(G.background == 0) { /* ends up printing these in the terminal, gets annoying */
+ /* Report the python string representation of the operator */
+ char *buf = WM_operator_pystring(C, op->type, op->ptr, 1);
+ BKE_report(CTX_wm_reports(C), RPT_OPERATOR, buf);
+ MEM_freeN(buf);
+ }
}
}
- if (op->reports->list.first) {
+ /* if the caller owns them them handle this */
+ if (op->reports->list.first && (op->reports->flag & RPT_OP_HOLD) == 0) {
wmWindowManager *wm = CTX_wm_manager(C);
ReportList *wm_reports= CTX_wm_reports(C);
@@ -457,7 +470,7 @@ static void wm_operator_reports(bContext *C, wmOperator *op, int retval, int pop
WM_event_remove_timer(wm, NULL, wm_reports->reporttimer);
/* Records time since last report was added */
- wm_reports->reporttimer= WM_event_add_timer(wm, CTX_wm_window(C), TIMER, 0.05);
+ wm_reports->reporttimer= WM_event_add_timer(wm, CTX_wm_window(C), TIMERREPORT, 0.05);
rti = MEM_callocN(sizeof(ReportTimerInfo), "ReportTimerInfo");
wm_reports->reporttimer->customdata = rti;
@@ -693,7 +706,6 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, P
if (!(retval & OPERATOR_HANDLED) && retval & (OPERATOR_FINISHED|OPERATOR_CANCELLED))
/* only show the report if the report list was not given in the function */
wm_operator_reports(C, op, retval, (reports==NULL));
-
if(retval & OPERATOR_HANDLED)
; /* do nothing, wm_operator_exec() has been called somewhere */
@@ -714,6 +726,14 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, P
wrap = (U.uiflag & USER_CONTINUOUS_MOUSE) && ((op->flag & OP_GRAB_POINTER) || (ot->flag & OPTYPE_GRAB_POINTER));
}
+ /* exception, cont. grab in header is annoying */
+ if(wrap) {
+ ARegion *ar= CTX_wm_region(C);
+ if(ar && ar->regiontype == RGN_TYPE_HEADER) {
+ wrap= FALSE;
+ }
+ }
+
if(wrap) {
rcti *winrect= NULL;
ARegion *ar= CTX_wm_region(C);
@@ -1557,6 +1577,9 @@ static int wm_handlers_do(bContext *C, wmEvent *event, ListBase *handlers)
}
}
}
+
+ if(action == (WM_HANDLER_BREAK|WM_HANDLER_MODAL))
+ wm_cursor_arrow_move(CTX_wm_window(C), event);
return action;
}
@@ -1622,6 +1645,7 @@ static void wm_paintcursor_test(bContext *C, wmEvent *event)
if(wm->paintcursors.first) {
ARegion *ar= CTX_wm_region(C);
+
if(ar)
wm_paintcursor_tag(C, wm->paintcursors.first, ar);
@@ -1705,7 +1729,7 @@ void wm_event_do_handlers(bContext *C)
}
if(playing == 0) {
- int ncfra = sound_sync_scene(scene) * FPS + 0.5;
+ int ncfra = sound_sync_scene(scene) * (float)FPS + 0.5f;
if(ncfra != scene->r.cfra) {
scene->r.cfra = ncfra;
ED_update_for_newframe(CTX_data_main(C), scene, win->screen, 1);
@@ -1757,15 +1781,15 @@ void wm_event_do_handlers(bContext *C)
ScrArea *sa;
ARegion *ar;
int doit= 0;
-
- /* XXX to solve, here screen handlers? */
+
+ /* Note: setting subwin active should be done here, after modal handlers have been done */
if(event->type==MOUSEMOVE) {
- /* state variables in screen, cursors */
- ED_screen_set_subwinactive(win, event);
+ /* state variables in screen, cursors. Also used in wm_draw.c, fails for modal handlers though */
+ ED_screen_set_subwinactive(C, event);
/* for regions having custom cursors */
wm_paintcursor_test(C, event);
}
-
+
for(sa= win->screen->areabase.first; sa; sa= sa->next) {
if(wm_event_inside_i(event, &sa->totrct)) {
CTX_wm_area_set(C, sa);
@@ -1943,11 +1967,13 @@ void WM_event_add_fileselect(bContext *C, wmOperator *op)
WM_event_fileselect_event(C, op, full?EVT_FILESELECT_FULL_OPEN:EVT_FILESELECT_OPEN);
}
+#if 0
/* lets not expose struct outside wm? */
static void WM_event_set_handler_flag(wmEventHandler *handler, int flag)
{
handler->flag= flag;
}
+#endif
wmEventHandler *WM_event_add_modal_handler(bContext *C, wmOperator *op)
{
@@ -2093,11 +2119,13 @@ void WM_event_remove_area_handler(ListBase *handlers, void *area)
}
}
+#if 0
static void WM_event_remove_handler(ListBase *handlers, wmEventHandler *handler)
{
BLI_remlink(handlers, handler);
wm_event_free_handler(handler);
}
+#endif
void WM_event_add_mousemove(bContext *C)
{
@@ -2122,6 +2150,13 @@ int WM_modal_tweak_exit(wmEvent *evt, int tweak_event)
return 1;
}
}
+ else {
+ /* if the initial event wasn't a tweak event then
+ * ignore USER_RELEASECONFIRM setting: see [#26756] */
+ if(ELEM3(tweak_event, EVT_TWEAK_L, EVT_TWEAK_M, EVT_TWEAK_R) == 0) {
+ return 1;
+ }
+ }
}
else {
/* this is fine as long as not doing km-release, otherwise
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 141c51adc58..f5fe98ae4d4 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -33,7 +33,7 @@
/* placed up here because of crappy
* winsock stuff.
*/
-#include <stdio.h>
+#include <stddef.h>
#include <string.h>
#include <errno.h>
@@ -96,6 +96,8 @@
#include "ED_view3d.h"
#include "ED_util.h"
+#include "RE_pipeline.h" /* only to report missing engine */
+
#include "GHOST_C-api.h"
#include "GHOST_Path-api.h"
@@ -267,8 +269,11 @@ static void wm_init_userdef(bContext *C)
else G.fileflags &= ~G_FILE_NO_UI;
/* set the python auto-execute setting from user prefs */
- /* disabled by default, unless explicitly enabled in the command line */
- if ((U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0) G.f |= G_SCRIPT_AUTOEXEC;
+ /* enabled by default, unless explicitly enabled in the command line which overrides */
+ if((G.f & G_SCRIPT_OVERRIDE_PREF) == 0) {
+ if ((U.flag & USER_SCRIPT_AUTOEXEC_DISABLE) == 0) G.f |= G_SCRIPT_AUTOEXEC;
+ else G.f &= ~G_SCRIPT_AUTOEXEC;
+ }
if(U.tempdir[0]) BLI_where_is_temp(btempdir, FILE_MAX, 1);
}
@@ -300,8 +305,10 @@ void WM_read_file(bContext *C, const char *name, ReportList *reports)
/* this flag is initialized by the operator but overwritten on read.
* need to re-enable it here else drivers + registered scripts wont work. */
- if(G_f & G_SCRIPT_AUTOEXEC) G.f |= G_SCRIPT_AUTOEXEC;
- else G.f &= ~G_SCRIPT_AUTOEXEC;
+ if(G.f != G_f) {
+ const int flags_keep= (G_SCRIPT_AUTOEXEC | G_SCRIPT_OVERRIDE_PREF);
+ G.f= (G.f & ~flags_keep) | (G_f & flags_keep);
+ }
/* match the read WM with current WM */
wm_window_match_do(C, &wmbase);
@@ -324,7 +331,7 @@ void WM_read_file(bContext *C, const char *name, ReportList *reports)
CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first);
ED_editors_init(C);
- DAG_on_load_update(CTX_data_main(C), TRUE);
+ DAG_on_visible_update(CTX_data_main(C), TRUE);
#ifdef WITH_PYTHON
/* run any texts that were loaded in and flagged as modules */
@@ -333,6 +340,18 @@ void WM_read_file(bContext *C, const char *name, ReportList *reports)
#endif
CTX_wm_window_set(C, NULL); /* exits queues */
+#if 0 /* gives popups on windows but not linux, bug in report API but disable for now to stop users getting annoyed */
+ /* TODO, make this show in header info window */
+ {
+ Scene *sce;
+ for(sce= G.main->scene.first; sce; sce= sce->id.next) {
+ if(sce->r.engine[0] && BLI_findstring(&R_engines, sce->r.engine, offsetof(RenderEngineType, idname)) == NULL) {
+ BKE_reportf(reports, RPT_WARNING, "Engine not available: '%s' for scene: %s, an addon may need to be installed or enabled", sce->r.engine, sce->id.name+2);
+ }
+ }
+ }
+#endif
+
// XXX undo_editmode_clear();
BKE_reset_undo();
BKE_write_undo(C, "original"); /* save current state */
@@ -428,7 +447,7 @@ int WM_read_homefile(bContext *C, ReportList *reports, short from_memory)
BKE_write_undo(C, "original"); /* save current state */
ED_editors_init(C);
- DAG_on_load_update(CTX_data_main(C), TRUE);
+ DAG_on_visible_update(CTX_data_main(C), TRUE);
#ifdef WITH_PYTHON
if(CTX_py_init_get(C)) {
@@ -505,7 +524,7 @@ static void write_history(void)
recent = G.recent_files.first;
/* refresh recent-files.txt of recent opened files, when current file was changed */
- if(!(recent) || (strcmp(recent->filepath, G.main->name)!=0)) {
+ if(!(recent) || (BLI_path_cmp(recent->filepath, G.main->name)!=0)) {
fp= fopen(name, "w");
if (fp) {
/* add current file to the beginning of list */
@@ -519,7 +538,7 @@ static void write_history(void)
/* write rest of recent opened files to recent-files.txt */
while((i<U.recent_files) && (recent)){
/* this prevents to have duplicities in list */
- if (strcmp(recent->filepath, G.main->name)!=0) {
+ if (BLI_path_cmp(recent->filepath, G.main->name)!=0) {
fprintf(fp, "%s\n", recent->filepath);
recent = recent->next;
}
@@ -569,6 +588,7 @@ static ImBuf *blend_file_thumb(Scene *scene, int **thumb_pt)
/* will be scaled down, but gives some nice oversampling */
ImBuf *ibuf;
int *thumb;
+ char err_out[256]= "unknown";
*thumb_pt= NULL;
@@ -576,7 +596,7 @@ static ImBuf *blend_file_thumb(Scene *scene, int **thumb_pt)
return NULL;
/* gets scaled to BLEN_THUMB_SIZE */
- ibuf= ED_view3d_draw_offscreen_imbuf_simple(scene, BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2, IB_rect, OB_SOLID);
+ ibuf= ED_view3d_draw_offscreen_imbuf_simple(scene, BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2, IB_rect, OB_SOLID, err_out);
if(ibuf) {
float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp);
@@ -597,6 +617,7 @@ static ImBuf *blend_file_thumb(Scene *scene, int **thumb_pt)
}
else {
/* '*thumb_pt' needs to stay NULL to prevent a bad thumbnail from being handled */
+ fprintf(stderr, "blend_file_thumb failed to create thumbnail: %s\n", err_out);
thumb= NULL;
}
@@ -649,7 +670,7 @@ int WM_write_file(bContext *C, const char *target, int fileflags, ReportList *re
/* send the OnSave event */
for (li= G.main->library.first; li; li= li->id.next) {
- if (strcmp(li->filepath, di) == 0) {
+ if (BLI_path_cmp(li->filepath, di) == 0) {
BKE_reportf(reports, RPT_ERROR, "Can't overwrite used library '%.200s'", di);
return -1;
}
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index eddd7ae1642..de4afa79448 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -134,7 +134,7 @@ int wm_gesture_evaluate(wmGesture *gesture)
int dx= rect->xmax - rect->xmin;
int dy= rect->ymax - rect->ymin;
if(ABS(dx)+ABS(dy) > TWEAK_THRESHOLD) {
- int theta= (int)floor(4.0f*atan2((float)dy, (float)dx)/M_PI + 0.5);
+ int theta= (int)floor(4.0f*atan2f((float)dy, (float)dx)/(float)M_PI + 0.5f);
int val= EVT_GESTURE_W;
if(theta==0) val= EVT_GESTURE_E;
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 34a6359b6dc..04020200b79 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -64,6 +64,7 @@
#include "BLI_blenlib.h"
#include "BLI_cellalloc.h"
+#include "BLI_winstuff.h"
#include "RE_pipeline.h" /* RE_ free stuff */
@@ -115,7 +116,7 @@ static void wm_free_reports(bContext *C)
BKE_reports_clear(CTX_wm_reports(C));
}
-
+int wm_start_with_console = 0;
/* only called once, for startup */
void WM_init(bContext *C, int argc, const char **argv)
@@ -124,6 +125,10 @@ void WM_init(bContext *C, int argc, const char **argv)
if (!G.background) {
wm_ghost_init(C); /* note: it assigns C to ghost! */
wm_init_cursor_data();
+#ifdef WIN32
+ if (IsConsoleEmpty()) /* never hide if the console window pre-existed */
+ WM_console_toggle(C, wm_start_with_console);
+#endif
}
GHOST_CreateSystemPaths();
@@ -280,7 +285,7 @@ int WM_init_game(bContext *C)
/* full screen the area */
if(!sa->full) {
- ED_screen_full_toggle(C, wm->windows.first, sa);
+ ED_screen_full_toggle(C, win, sa);
}
/* Fullscreen */
@@ -353,6 +358,10 @@ void WM_exit(bContext *C)
sound_exit();
+#ifdef WIN32
+ WM_console_toggle(C, 1); /* never leave behind invisible consoles */
+#endif
+
/* first wrap up running stuff, we assume only the active WM is running */
/* modal handlers are on window level freed, others too? */
/* note; same code copied in wm_files.c */
@@ -431,7 +440,7 @@ void WM_exit(bContext *C)
// XXX UI_filelist_free_icons();
}
- GPU_buffer_pool_free(0);
+ GPU_buffer_pool_free(NULL);
GPU_free_unused_buffers();
GPU_extensions_exit();
@@ -458,12 +467,11 @@ void WM_exit(bContext *C)
GHOST_DisposeSystemPaths();
- if(MEM_get_memory_blocks_in_use()!=0 || BLI_cellalloc_get_totblock()!=0) {
- printf("Error Totblock: %d\n",
- BLI_cellalloc_get_totblock()+MEM_get_memory_blocks_in_use());
+ if(MEM_get_memory_blocks_in_use()!=0) {
+ printf("Error: Not freed memory blocks: %d\n", MEM_get_memory_blocks_in_use()+BLI_cellalloc_get_totblock());
+ MEM_printmemlist();
BLI_cellalloc_printleaks();
BLI_cellalloc_destroy();
- MEM_printmemlist();
}
wm_autosave_delete();
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 57b84fc18f4..336acd9f9bf 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -104,7 +104,7 @@ wmKeyConfig *WM_keyconfig_new_user(wmWindowManager *wm, const char *idname)
void WM_keyconfig_remove(wmWindowManager *wm, wmKeyConfig *keyconf)
{
if (keyconf) {
- if (BLI_streq(U.keyconfigstr, keyconf->idname)) {
+ if (strncmp(U.keyconfigstr, keyconf->idname, sizeof(U.keyconfigstr)) == 0) {
BLI_strncpy(U.keyconfigstr, wm->defaultconf->idname, sizeof(U.keyconfigstr));
}
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index 12862f559d4..ae275096263 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -655,7 +655,7 @@ int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
return op->type->exec(C, op);
}
else {
- pup= uiPupMenuBegin(C, op->type->name, ICON_NULL);
+ pup= uiPupMenuBegin(C, op->type->name, ICON_NONE);
layout= uiPupMenuLayout(pup);
uiItemsFullEnumO(layout, op->type->idname, (char*)RNA_property_identifier(prop), op->ptr->data, WM_OP_EXEC_REGION_WIN, 0);
uiPupMenuEnd(C, pup);
@@ -764,7 +764,7 @@ int WM_operator_confirm_message(bContext *C, wmOperator *op, const char *message
pup= uiPupMenuBegin(C, "OK?", ICON_QUESTION);
layout= uiPupMenuLayout(pup);
- uiItemFullO(layout, op->type->idname, message, ICON_NULL, properties, WM_OP_EXEC_REGION_WIN, 0);
+ uiItemFullO(layout, op->type->idname, message, ICON_NONE, properties, WM_OP_EXEC_REGION_WIN, 0);
uiPupMenuEnd(C, pup);
return OPERATOR_CANCELLED;
@@ -906,7 +906,7 @@ static uiBlock *wm_block_create_redo(bContext *C, ARegion *ar, void *arg_op)
uiLayoutOperatorButs(C, layout, op, NULL, 'H', UI_LAYOUT_OP_SHOW_TITLE);
- uiPopupBoundsBlock(block, 4.0f, 0, 0);
+ uiPopupBoundsBlock(block, 4, 0, 0);
uiEndBlock(C, block);
return block;
@@ -940,7 +940,6 @@ static uiBlock *wm_block_create_dialog(bContext *C, ARegion *ar, void *userData)
wmOperator *op= data->op;
uiBlock *block;
uiLayout *layout;
- uiBut *btn;
uiStyle *style= U.uistyles.first;
block = uiBeginBlock(C, ar, "operator dialog", UI_EMBOSS);
@@ -956,12 +955,21 @@ static uiBlock *wm_block_create_dialog(bContext *C, ARegion *ar, void *userData)
/* clear so the OK button is left alone */
uiBlockSetFunc(block, NULL, NULL, NULL);
- /* Create OK button, the callback of which will execute op */
- btn= uiDefBut(block, BUT, 0, "OK", 0, 0, 0, 20, NULL, 0, 0, 0, 0, "");
- uiButSetFunc(btn, dialog_exec_cb, op, block);
+ /* new column so as not to interfear with custom layouts [#26436] */
+ {
+ uiBlock *col_block;
+ uiLayout *col;
+ uiBut *btn;
+
+ col= uiLayoutColumn(layout, FALSE);
+ col_block= uiLayoutGetBlock(col);
+ /* Create OK button, the callback of which will execute op */
+ btn= uiDefBut(col_block, BUT, 0, "OK", 0, -30, 0, 20, NULL, 0, 0, 0, 0, "");
+ uiButSetFunc(btn, dialog_exec_cb, op, col_block);
+ }
/* center around the mouse */
- uiPopupBoundsBlock(block, 4.0f, data->width/-2, data->height/2);
+ uiPopupBoundsBlock(block, 4, data->width/-2, data->height/2);
uiEndBlock(C, block);
return block;
@@ -984,7 +992,7 @@ static uiBlock *wm_operator_create_ui(bContext *C, ARegion *ar, void *userData)
/* since ui is defined the auto-layout args are not used */
uiLayoutOperatorButs(C, layout, op, NULL, 'V', 0);
- uiPopupBoundsBlock(block, 4.0f, 0, 0);
+ uiPopupBoundsBlock(block, 4, 0, 0);
uiEndBlock(C, block);
return block;
@@ -1033,8 +1041,13 @@ int WM_operator_ui_popup(bContext *C, wmOperator *op, int width, int height)
int WM_operator_redo_popup(bContext *C, wmOperator *op)
{
+ /* CTX_wm_reports(C) because operator is on stack, not active in event system */
if((op->type->flag & OPTYPE_REGISTER)==0) {
- BKE_reportf(op->reports, RPT_ERROR, "Operator '%s' does not have register enabled, incorrect invoke function.", op->type->idname);
+ BKE_reportf(CTX_wm_reports(C), RPT_ERROR, "Operator redo '%s' does not have register enabled, incorrect invoke function.", op->type->idname);
+ return OPERATOR_CANCELLED;
+ }
+ if(op->type->poll && op->type->poll(C)==0) {
+ BKE_reportf(CTX_wm_reports(C), RPT_ERROR, "Operator redo '%s': wrong context.", op->type->idname);
return OPERATOR_CANCELLED;
}
@@ -1094,6 +1107,29 @@ static void wm_block_splash_refreshmenu (bContext *UNUSED(C), void *UNUSED(arg_b
*/
}
+static int wm_resource_check_prev(void)
+{
+
+ char *res= BLI_get_folder_version(BLENDER_RESOURCE_PATH_USER, BLENDER_VERSION, TRUE);
+
+ // if(res) printf("USER: %s\n", res);
+
+#if 0 /* ignore the local folder */
+ if(res == NULL) {
+ /* with a local dir, copying old files isnt useful since local dir get priority for config */
+ res= BLI_get_folder_version(BLENDER_RESOURCE_PATH_LOCAL, BLENDER_VERSION, TRUE);
+ }
+#endif
+
+ // if(res) printf("LOCAL: %s\n", res);
+ if(res) {
+ return FALSE;
+ }
+ else {
+ return (BLI_get_folder_version(BLENDER_RESOURCE_PATH_USER, BLENDER_VERSION - 1, TRUE) != NULL);
+ }
+}
+
static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(arg))
{
uiBlock *block;
@@ -1103,7 +1139,7 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
struct RecentFile *recent;
int i;
MenuType *mt= WM_menutype_find("USERPREF_MT_splash", TRUE);
- char url[64];
+ char url[96];
#ifdef NAN_BUILDINFO
int ver_width, rev_width;
@@ -1120,8 +1156,8 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
sprintf(revision_str, "r%s", build_rev);
BLF_size(style->widgetlabel.uifont_id, style->widgetlabel.points, U.dpi);
- ver_width = BLF_width(style->widgetlabel.uifont_id, version_str)+5;
- rev_width = BLF_width(style->widgetlabel.uifont_id, revision_str)+5;
+ ver_width = (int)BLF_width(style->widgetlabel.uifont_id, version_str) + 5;
+ rev_width = (int)BLF_width(style->widgetlabel.uifont_id, revision_str) + 5;
#endif //NAN_BUILDINFO
block= uiBeginBlock(C, ar, "_popup", UI_EMBOSS);
@@ -1141,13 +1177,13 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
uiBlockSetEmboss(block, UI_EMBOSS);
/* show the splash menu (containing interaction presets), using python */
if (mt) {
- Menu menu= {0};
+ Menu menu= {NULL};
menu.layout= layout;
menu.type= mt;
mt->draw(C, &menu);
// wmWindowManager *wm= CTX_wm_manager(C);
-// uiItemM(layout, C, "USERPREF_MT_keyconfigs", U.keyconfigstr, ICON_NULL);
+// uiItemM(layout, C, "USERPREF_MT_keyconfigs", U.keyconfigstr, ICON_NONE);
}
uiBlockSetEmboss(block, UI_EMBOSSP);
@@ -1155,26 +1191,38 @@ static uiBlock *wm_block_create_splash(bContext *C, ARegion *ar, void *UNUSED(ar
split = uiLayoutSplit(layout, 0, 0);
col = uiLayoutColumn(split, 0);
- uiItemL(col, "Links", ICON_NULL);
+ uiItemL(col, "Links", ICON_NONE);
uiItemStringO(col, "Donations", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/blenderorg/blender-foundation/donation-payment/");
- uiItemStringO(col, "Release Log", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-256-beta/");
+ uiItemStringO(col, "Release Log", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/development/release-logs/blender-257/");
uiItemStringO(col, "Manual", ICON_URL, "WM_OT_url_open", "url", "http://wiki.blender.org/index.php/Doc:Manual");
uiItemStringO(col, "Blender Website", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/");
uiItemStringO(col, "User Community", ICON_URL, "WM_OT_url_open", "url", "http://www.blender.org/community/user-community/"); //
- BLI_snprintf(url, sizeof(url), "http://www.blender.org/documentation/blender_python_api_%d_%d_%d", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION);
+ if(strcmp(STRINGIFY(BLENDER_VERSION_CYCLE), "release")==0) {
+ BLI_snprintf(url, sizeof(url), "http://www.blender.org/documentation/blender_python_api_%d_%d" STRINGIFY(BLENDER_VERSION_CHAR) "_release", BLENDER_VERSION/100, BLENDER_VERSION%100);
+ }
+ else {
+ BLI_snprintf(url, sizeof(url), "http://www.blender.org/documentation/blender_python_api_%d_%d_%d", BLENDER_VERSION/100, BLENDER_VERSION%100, BLENDER_SUBVERSION);
+ }
uiItemStringO(col, "Python API Reference", ICON_URL, "WM_OT_url_open", "url", url);
- uiItemL(col, "", ICON_NULL);
+ uiItemL(col, "", ICON_NONE);
col = uiLayoutColumn(split, 0);
- uiItemL(col, "Recent", ICON_NULL);
+
+ if(wm_resource_check_prev()) {
+ uiItemO(col, NULL, ICON_NEW, "WM_OT_copy_prev_settings");
+ uiItemS(col);
+ }
+
+ uiItemL(col, "Recent", ICON_NONE);
for(recent = G.recent_files.first, i=0; (i<5) && (recent); recent = recent->next, i++) {
uiItemStringO(col, BLI_path_basename(recent->filepath), ICON_FILE_BLEND, "WM_OT_open_mainfile", "filepath", recent->filepath);
}
+
uiItemS(col);
uiItemO(col, NULL, ICON_RECOVER_LAST, "WM_OT_recover_last_session");
- uiItemL(col, "", ICON_NULL);
+ uiItemL(col, "", ICON_NONE);
- uiCenteredBoundsBlock(block, 0.0f);
+ uiCenteredBoundsBlock(block, 0);
uiEndBlock(C, block);
return block;
@@ -1251,7 +1299,7 @@ static uiBlock *wm_block_search_menu(bContext *C, ARegion *ar, void *UNUSED(arg_
/* fake button, it holds space for search items */
uiDefBut(block, LABEL, 0, "", 10, 10 - uiSearchBoxhHeight(), 180, uiSearchBoxhHeight(), NULL, 0, 0, 0, 0, NULL);
- uiPopupBoundsBlock(block, 6.0f, 0, -20); /* move it downwards, mouse over button */
+ uiPopupBoundsBlock(block, 6, 0, -20); /* move it downwards, mouse over button */
uiEndBlock(C, block);
event= *(win->eventstate); /* XXX huh huh? make api call */
@@ -1312,6 +1360,7 @@ static void WM_OT_call_menu(wmOperatorType *ot)
ot->idname= "WM_OT_call_menu";
ot->exec= wm_call_menu_exec;
+ ot->poll= WM_operator_winactive;
RNA_def_string(ot->srna, "name", "", BKE_ST_MAXNAME, "Name", "Name of the menu");
}
@@ -1383,8 +1432,12 @@ static void open_set_load_ui(wmOperator *op)
static void open_set_use_scripts(wmOperator *op)
{
- if(!RNA_property_is_set(op->ptr, "use_scripts"))
- RNA_boolean_set(op->ptr, "use_scripts", !(U.flag & USER_SCRIPT_AUTOEXEC_DISABLE));
+ if(!RNA_property_is_set(op->ptr, "use_scripts")) {
+ /* use G_SCRIPT_AUTOEXEC rather then the userpref because this means if
+ * the flag has been disabled from the command line, then opening
+ * from the menu wont enable this setting. */
+ RNA_boolean_set(op->ptr, "use_scripts", (G.f & G_SCRIPT_AUTOEXEC));
+ }
}
static int wm_open_mainfile_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
@@ -1480,26 +1533,11 @@ static short wm_link_append_flag(wmOperator *op)
return flag;
}
-static void wm_link_make_library_local(Main *main, const char *libname)
-{
- Library *lib;
-
- /* and now find the latest append lib file */
- for(lib= main->library.first; lib; lib=lib->id.next)
- if(BLI_streq(libname, lib->filepath))
- break;
-
- /* make local */
- if(lib) {
- all_local(lib, 1);
- }
-}
-
static int wm_link_append_exec(bContext *C, wmOperator *op)
{
Main *bmain= CTX_data_main(C);
Scene *scene= CTX_data_scene(C);
- Main *mainl= 0;
+ Main *mainl= NULL;
BlendHandle *bh;
PropertyRNA *prop;
char name[FILE_MAX], dir[FILE_MAX], libname[FILE_MAX], group[GROUP_MAX];
@@ -1519,7 +1557,7 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
BKE_report(op->reports, RPT_ERROR, "Nothing indicated");
return OPERATOR_CANCELLED;
}
- else if(BLI_streq(bmain->name, libname)) {
+ else if(BLI_path_cmp(bmain->name, libname) == 0) {
BKE_report(op->reports, RPT_ERROR, "Cannot use current file as library");
return OPERATOR_CANCELLED;
}
@@ -1540,12 +1578,23 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
+ bh = BLO_blendhandle_from_file(libname, op->reports);
+
+ if(bh == NULL) {
+ /* unlikely since we just browsed it, but possible
+ * error reports will have been made by BLO_blendhandle_from_file() */
+ return OPERATOR_CANCELLED;
+ }
+
+
+ /* from here down, no error returns */
+
+ idcode = BKE_idcode_from_name(group);
+
/* now we have or selected, or an indicated file */
if(RNA_boolean_get(op->ptr, "autoselect"))
scene_deselect_all(scene);
- bh = BLO_blendhandle_from_file(libname);
- idcode = BKE_idcode_from_name(group);
flag = wm_link_append_flag(op);
@@ -1581,8 +1630,11 @@ static int wm_link_append_exec(bContext *C, wmOperator *op)
recalc_all_library_objects(bmain);
/* append, rather than linking */
- if((flag & FILE_LINK)==0)
- wm_link_make_library_local(bmain, libname);
+ if((flag & FILE_LINK)==0) {
+ Library *lib= BLI_findstring(&bmain->library, libname, offsetof(Library, filepath));
+ if(lib) all_local(lib, 1);
+ else BLI_assert(!"cant find name of just added library!");
+ }
/* important we unset, otherwise these object wont
* link into other scenes from this blend file */
@@ -1982,7 +2034,7 @@ static void WM_OT_quit_blender(wmOperatorType *ot)
/* *********************** */
#if defined(WIN32)
static int console= 1;
-void WM_toggle_console(bContext *UNUSED(C), short show)
+void WM_console_toggle(bContext *UNUSED(C), short show)
{
if(show) {
ShowWindow(GetConsoleWindow(),SW_SHOW);
@@ -1994,24 +2046,24 @@ void WM_toggle_console(bContext *UNUSED(C), short show)
}
}
-static int wm_toggle_console_op(bContext *C, wmOperator *UNUSED(op))
+static int wm_console_toggle_op(bContext *C, wmOperator *UNUSED(op))
{
if(console) {
- WM_toggle_console(C, 0);
+ WM_console_toggle(C, 0);
}
else {
- WM_toggle_console(C, 1);
+ WM_console_toggle(C, 1);
}
return OPERATOR_FINISHED;
}
-static void WM_OT_toggle_console(wmOperatorType *ot)
+static void WM_OT_console_toggle(wmOperatorType *ot)
{
ot->name= "Toggle System Console";
- ot->idname= "WM_OT_toggle_console";
+ ot->idname= "WM_OT_console_toggle";
ot->description= "Toggle System Console";
- ot->exec= wm_toggle_console_op;
+ ot->exec= wm_console_toggle_op;
ot->poll= WM_operator_winactive;
}
#endif
@@ -2064,31 +2116,34 @@ void WM_paint_cursor_end(wmWindowManager *wm, void *handle)
It stores 4 values (xmin, xmax, ymin, ymax) and event it ended with (event_type)
*/
-static int border_apply(bContext *C, wmOperator *op, int gesture_mode)
+static int border_apply_rect(wmOperator *op)
{
wmGesture *gesture= op->customdata;
rcti *rect= gesture->customdata;
- if(rect->xmin > rect->xmax)
- SWAP(int, rect->xmin, rect->xmax);
- if(rect->ymin > rect->ymax)
- SWAP(int, rect->ymin, rect->ymax);
-
if(rect->xmin==rect->xmax || rect->ymin==rect->ymax)
return 0;
-
+
+
/* operator arguments and storage. */
- RNA_int_set(op->ptr, "xmin", rect->xmin);
- RNA_int_set(op->ptr, "ymin", rect->ymin);
- RNA_int_set(op->ptr, "xmax", rect->xmax);
- RNA_int_set(op->ptr, "ymax", rect->ymax);
+ RNA_int_set(op->ptr, "xmin", MIN2(rect->xmin, rect->xmax) );
+ RNA_int_set(op->ptr, "ymin", MIN2(rect->ymin, rect->ymax) );
+ RNA_int_set(op->ptr, "xmax", MAX2(rect->xmin, rect->xmax) );
+ RNA_int_set(op->ptr, "ymax", MAX2(rect->ymin, rect->ymax) );
+
+ return 1;
+}
+
+static int border_apply(bContext *C, wmOperator *op, int gesture_mode)
+{
+ if (!border_apply_rect(op))
+ return 0;
/* XXX weak; border should be configured for this without reading event types */
if( RNA_struct_find_property(op->ptr, "gesture_mode") )
RNA_int_set(op->ptr, "gesture_mode", gesture_mode);
op->type->exec(C, op);
-
return 1;
}
@@ -2137,6 +2192,7 @@ int WM_border_select_modal(bContext *C, wmOperator *op, wmEvent *event)
rect->xmax= event->x - sx;
rect->ymax= event->y - sy;
}
+ border_apply_rect(op);
wm_gesture_tag_redraw(C);
}
@@ -2649,7 +2705,7 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata)
// int hit = 0;
if(rc->mode == WM_RADIALCONTROL_STRENGTH)
- rc->tex_col[3]= (rc->value + 0.5);
+ rc->tex_col[3]= (rc->value + 0.5f);
if(rc->mode == WM_RADIALCONTROL_SIZE) {
r1= rc->value;
@@ -2657,9 +2713,9 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata)
r3= r1;
} else if(rc->mode == WM_RADIALCONTROL_STRENGTH) {
r1= (1 - rc->value) * WM_RADIAL_CONTROL_DISPLAY_SIZE;
- r2= r3= WM_RADIAL_CONTROL_DISPLAY_SIZE;
+ r2= r3= (float)WM_RADIAL_CONTROL_DISPLAY_SIZE;
} else if(rc->mode == WM_RADIALCONTROL_ANGLE) {
- r1= r2= r3= WM_RADIAL_CONTROL_DISPLAY_SIZE;
+ r1= r2= r3= (float)WM_RADIAL_CONTROL_DISPLAY_SIZE;
angle = rc->value;
}
@@ -2700,15 +2756,15 @@ static void wm_radial_control_paint(bContext *C, int x, int y, void *customdata)
glColor4f(rc->col[0], rc->col[1], rc->col[2], rc->col[3]);
glEnable(GL_LINE_SMOOTH);
glRotatef(-angle, 0, 0, 1);
- fdrawline(0, 0, WM_RADIAL_CONTROL_DISPLAY_SIZE, 0);
+ fdrawline(0.0f, 0.0f, (float)WM_RADIAL_CONTROL_DISPLAY_SIZE, 0.0f);
glRotatef(angle, 0, 0, 1);
- fdrawline(0, 0, WM_RADIAL_CONTROL_DISPLAY_SIZE, 0);
+ fdrawline(0.0f, 0.0f, (float)WM_RADIAL_CONTROL_DISPLAY_SIZE, 0.0f);
glDisable(GL_LINE_SMOOTH);
}
glColor4f(rc->col[0], rc->col[1], rc->col[2], rc->col[3]);
- glutil_draw_lined_arc(0.0, M_PI*2.0, r1, 40);
- glutil_draw_lined_arc(0.0, M_PI*2.0, r2, 40);
+ glutil_draw_lined_arc(0.0, (float)(M_PI*2.0), r1, 40);
+ glutil_draw_lined_arc(0.0, (float)(M_PI*2.0), r2, 40);
glDisable(GL_BLEND);
}
@@ -2721,7 +2777,7 @@ int WM_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event)
int ret = OPERATOR_RUNNING_MODAL;
// float initial_value = RNA_float_get(op->ptr, "initial_value");
- mode = RNA_int_get(op->ptr, "mode");
+ mode = RNA_enum_get(op->ptr, "mode");
RNA_int_get_array(op->ptr, "initial_mouse", initial_mouse);
switch(event->type) {
@@ -2738,18 +2794,18 @@ int WM_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event)
// delta[1]+= WM_RADIAL_CONTROL_DISPLAY_SIZE * sin(initial_value*M_PI/180.0f);
//}
- dist= sqrt(delta[0]*delta[0]+delta[1]*delta[1]);
+ dist= sqrtf(delta[0]*delta[0]+delta[1]*delta[1]);
if(mode == WM_RADIALCONTROL_SIZE)
new_value = dist;
else if(mode == WM_RADIALCONTROL_STRENGTH) {
new_value = 1 - dist / WM_RADIAL_CONTROL_DISPLAY_SIZE;
} else if(mode == WM_RADIALCONTROL_ANGLE)
- new_value = ((int)(atan2(delta[1], delta[0]) * (180.0 / M_PI)) + 180);
+ new_value = ((int)(atan2f(delta[1], delta[0]) * (float)(180.0 / M_PI)) + 180);
if(event->ctrl) {
if(mode == WM_RADIALCONTROL_STRENGTH)
- new_value = ((int)ceil(new_value * 10.f) * 10.0f) / 100.f;
+ new_value = ((int)ceilf(new_value * 10.f) * 10.0f) / 100.f;
else
new_value = ((int)new_value + 5) / 10*10;
}
@@ -2773,9 +2829,9 @@ int WM_radial_control_modal(bContext *C, wmOperator *op, wmEvent *event)
new_value = 0;
/* Update paint data */
- rc->value = new_value;
+ rc->value = (float)new_value;
- RNA_float_set(op->ptr, "new_value", new_value);
+ RNA_float_set(op->ptr, "new_value", rc->value);
if(ret != OPERATOR_RUNNING_MODAL) {
WM_paint_cursor_end(CTX_wm_manager(C), rc->cursor);
@@ -2797,7 +2853,7 @@ int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
{
wmRadialControl *rc = MEM_callocN(sizeof(wmRadialControl), "radial control");
// wmWindow *win = CTX_wm_window(C);
- int mode = RNA_int_get(op->ptr, "mode");
+ int mode = RNA_enum_get(op->ptr, "mode");
float initial_value = RNA_float_get(op->ptr, "initial_value");
//float initial_size = RNA_float_get(op->ptr, "initial_size");
int mouse[2];
@@ -2810,17 +2866,17 @@ int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
if(mode == WM_RADIALCONTROL_SIZE) {
rc->max_value = 200;
- mouse[0]-= initial_value;
+ mouse[0]-= (int)initial_value;
}
else if(mode == WM_RADIALCONTROL_STRENGTH) {
rc->max_value = 1;
- mouse[0]-= WM_RADIAL_CONTROL_DISPLAY_SIZE * (1 - initial_value);
+ mouse[0]-= (int)(WM_RADIAL_CONTROL_DISPLAY_SIZE * (1.0f - initial_value));
}
else if(mode == WM_RADIALCONTROL_ANGLE) {
rc->max_value = 360;
- mouse[0]-= WM_RADIAL_CONTROL_DISPLAY_SIZE * cos(initial_value);
- mouse[1]-= WM_RADIAL_CONTROL_DISPLAY_SIZE * sin(initial_value);
- initial_value *= 180.0f/M_PI;
+ mouse[0]-= (int)(WM_RADIAL_CONTROL_DISPLAY_SIZE * cos(initial_value));
+ mouse[1]-= (int)(WM_RADIAL_CONTROL_DISPLAY_SIZE * sin(initial_value));
+ initial_value *= 180.0f/(float)M_PI;
}
if(op->customdata) {
@@ -2860,7 +2916,7 @@ int WM_radial_control_invoke(bContext *C, wmOperator *op, wmEvent *event)
/* Gets a descriptive string of the operation */
void WM_radial_control_string(wmOperator *op, char str[], int maxlen)
{
- int mode = RNA_int_get(op->ptr, "mode");
+ int mode = RNA_enum_get(op->ptr, "mode");
float v = RNA_float_get(op->ptr, "new_value");
if(mode == WM_RADIALCONTROL_SIZE)
@@ -2868,7 +2924,7 @@ void WM_radial_control_string(wmOperator *op, char str[], int maxlen)
else if(mode == WM_RADIALCONTROL_STRENGTH)
BLI_snprintf(str, maxlen, "Strength: %d", (int)v);
else if(mode == WM_RADIALCONTROL_ANGLE)
- BLI_snprintf(str, maxlen, "Angle: %d", (int)(v * 180.0f/M_PI));
+ BLI_snprintf(str, maxlen, "Angle: %d", (int)(v * 180.0f/(float)M_PI));
}
/** Important: this doesn't define an actual operator, it
@@ -2929,7 +2985,7 @@ static int redraw_timer_exec(bContext *C, wmOperator *op)
{
ARegion *ar= CTX_wm_region(C);
double stime= PIL_check_seconds_timer();
- int type = RNA_int_get(op->ptr, "type");
+ int type = RNA_enum_get(op->ptr, "type");
int iter = RNA_int_get(op->ptr, "iterations");
int a;
float time;
@@ -3008,7 +3064,7 @@ static int redraw_timer_exec(bContext *C, wmOperator *op)
}
}
- time= ((PIL_check_seconds_timer()-stime)*1000);
+ time= (float)((PIL_check_seconds_timer()-stime)*1000);
RNA_enum_description(redraw_timer_type_items, type, &infostr);
@@ -3091,7 +3147,7 @@ void wm_operatortype_init(void)
WM_operatortype_append(WM_OT_search_menu);
WM_operatortype_append(WM_OT_call_menu);
#if defined(WIN32)
- WM_operatortype_append(WM_OT_toggle_console);
+ WM_operatortype_append(WM_OT_console_toggle);
#endif
#ifdef WITH_COLLADA
diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c
index 1117d296f94..a87001fb1b4 100644
--- a/source/blender/windowmanager/intern/wm_subwindow.c
+++ b/source/blender/windowmanager/intern/wm_subwindow.c
@@ -143,7 +143,7 @@ void wm_subwindow_getmatrix(wmWindow *win, int swinid, float mat[][4])
int width, height;
wm_subwindow_getsize(win, swin->swinid, &width, &height);
- orthographic_m4(mat, -0.375, (float)width-0.375, -0.375, (float)height-0.375, -100, 100);
+ orthographic_m4(mat, -0.375f, (float)width-0.375f, -0.375f, (float)height-0.375f, -100, 100);
}
else
glGetFloatv(GL_PROJECTION_MATRIX, (float*)mat);
@@ -174,7 +174,7 @@ int wm_subwindow_open(wmWindow *win, rcti *winrct)
/* extra service */
wm_subwindow_getsize(win, swin->swinid, &width, &height);
- wmOrtho2(-0.375, (float)width-0.375, -0.375, (float)height-0.375);
+ wmOrtho2(-0.375f, (float)width-0.375f, -0.375f, (float)height-0.375f);
glLoadIdentity();
return swin->swinid;
@@ -229,7 +229,7 @@ void wm_subwindow_position(wmWindow *win, int swinid, rcti *winrct)
/* extra service */
wmSubWindowSet(win, swinid);
wm_subwindow_getsize(win, swinid, &width, &height);
- wmOrtho2(-0.375, (float)width-0.375, -0.375, (float)height-0.375);
+ wmOrtho2(-0.375f, (float)width-0.375f, -0.375f, (float)height-0.375f);
}
else {
printf("wm_subwindow_position: Internal error, bad winid: %d\n", swinid);
@@ -268,7 +268,7 @@ void wmSubWindowScissorSet(wmWindow *win, int swinid, rcti *srct)
else
glScissor(_curswin->winrct.xmin, _curswin->winrct.ymin, width, height);
- wmOrtho2(-0.375, (float)width-0.375, -0.375, (float)height-0.375);
+ wmOrtho2(-0.375f, (float)width-0.375f, -0.375f, (float)height-0.375f);
glLoadIdentity();
glFlush();
@@ -302,8 +302,8 @@ void wmOrtho(float x1, float x2, float y1, float y2, float n, float f)
void wmOrtho2(float x1, float x2, float y1, float y2)
{
/* prevent opengl from generating errors */
- if(x1==x2) x2+=1.0;
- if(y1==y2) y2+=1.0;
+ if(x1==x2) x2+=1.0f;
+ if(y1==y2) y2+=1.0f;
wmOrtho(x1, x2, y1, y2, -100, 100);
}
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index 44200294b6c..630c3921a95 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -238,6 +238,8 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig)
/* this is event from ghost, or exit-blender op */
void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
{
+ bScreen *screen= win->screen;
+
BLI_remlink(&wm->windows, win);
wm_draw_window_clear(win);
@@ -246,14 +248,14 @@ void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
WM_event_remove_handlers(C, &win->modalhandlers);
ED_screen_exit(C, win, win->screen);
- /* if temp screen, delete it */
- if(win->screen->temp) {
+ wm_window_free(C, wm, win);
+
+ /* if temp screen, delete it after window free (it stops jobs that can access it) */
+ if(screen->temp) {
Main *bmain= CTX_data_main(C);
- free_libblock(&bmain->screen, win->screen);
+ free_libblock(&bmain->screen, screen);
}
- wm_window_free(C, wm, win);
-
/* check remaining windows */
if(wm->windows.first) {
for(win= wm->windows.first; win; win= win->next)
@@ -528,7 +530,12 @@ int wm_window_duplicate_exec(bContext *C, wmOperator *UNUSED(op))
int wm_window_fullscreen_toggle_exec(bContext *C, wmOperator *UNUSED(op))
{
wmWindow *window= CTX_wm_window(C);
- GHOST_TWindowState state = GHOST_GetWindowState(window->ghostwin);
+ GHOST_TWindowState state;
+
+ if(G.background)
+ return OPERATOR_CANCELLED;
+
+ state= GHOST_GetWindowState(window->ghostwin);
if(state!=GHOST_kWindowStateFullScreen)
GHOST_SetWindowState(window->ghostwin, GHOST_kWindowStateFullScreen);
else
diff --git a/source/blender/windowmanager/wm_cursors.h b/source/blender/windowmanager/wm_cursors.h
index c858b9d94f3..5f262f34724 100644
--- a/source/blender/windowmanager/wm_cursors.h
+++ b/source/blender/windowmanager/wm_cursors.h
@@ -116,5 +116,11 @@ enum {
#define SMALL_CURSOR 0
#define BIG_CURSOR 1
+struct wmWindow;
+struct wmEvent;
+
+int wm_cursor_arrow_move(struct wmWindow *win, struct wmEvent *event);
+
+
#endif /* WM_CURSORS_H */
diff --git a/source/blender/windowmanager/wm_event_types.h b/source/blender/windowmanager/wm_event_types.h
index 39545a0ad01..ee080e7c0aa 100644
--- a/source/blender/windowmanager/wm_event_types.h
+++ b/source/blender/windowmanager/wm_event_types.h
@@ -86,8 +86,14 @@
#define TIMER0 0x0111 /* timer event, slot for internal use */
#define TIMER1 0x0112 /* timer event, slot for internal use */
#define TIMER2 0x0113 /* timer event, slot for internal use */
-#define TIMERJOBS 0x0114 /* timer event, internal use */
-#define TIMERAUTOSAVE 0x0115 /* timer event, internal use */
+#define TIMERJOBS 0x0114 /* timer event, jobs system */
+#define TIMERAUTOSAVE 0x0115 /* timer event, autosave */
+#define TIMERREPORT 0x0116 /* timer event, reports */
+#define TIMERF 0x011F /* last timer */
+
+/* test whether the event is timer event */
+#define ISTIMER(event) (event >= TIMER && event <= TIMERF)
+
/* standard keyboard */
#define AKEY 'a'
@@ -231,9 +237,6 @@
/* test whether the event is a mouse button */
#define ISMOUSE(event) (event >= LEFTMOUSE && event <= MOUSEROTATE)
- /* test whether the event is timer event */
-#define ISTIMER(event) (event >= TIMER && event <= TIMERAUTOSAVE)
-
/* test whether the event is tweak event */
#define ISTWEAK(event) (event >= EVT_TWEAK_L && event <= EVT_GESTURE)
diff --git a/source/blenderplayer/CMakeLists.txt b/source/blenderplayer/CMakeLists.txt
index 4bc4931cfb4..cccb5e5ddaf 100644
--- a/source/blenderplayer/CMakeLists.txt
+++ b/source/blenderplayer/CMakeLists.txt
@@ -40,6 +40,16 @@ add_custom_command(
)
if(WIN32 AND NOT UNIX)
+ string(SUBSTRING ${BLENDER_VERSION} 0 1 bver1)
+ string(SUBSTRING ${BLENDER_VERSION} 2 1 bver2)
+ string(SUBSTRING ${BLENDER_VERSION} 3 1 bver3)
+ add_definitions(
+ -DBLEN_VER_RC_STR=${BLENDER_VERSION}
+ -DBLEN_VER_RC_1=${bver1}
+ -DBLEN_VER_RC_2=${bver2}
+ -DBLEN_VER_RC_3=${bver3}
+ -DBLEN_VER_RC_4=0
+ )
add_executable(blenderplayer ${EXETYPE} ${CMAKE_CURRENT_BINARY_DIR}/dna.c ../icons/winblender.rc)
else()
add_executable(blenderplayer ${CMAKE_CURRENT_BINARY_DIR}/dna.c)
@@ -59,42 +69,18 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux")
list(APPEND BLENDER_LINK_LIBS extern_binreloc)
endif()
-if(UNIX)
+# if(UNIX)
# Sort libraries
-<<<<<<< .working
- SET(BLENDER_SORTED_LIBS
- gp_ghost
- gp_common
- bf_intern_string
- bf_intern_ghost
-=======
set(BLENDER_SORTED_LIBS
ge_player_ghost
ge_player_common
bf_intern_string
bf_intern_ghost
->>>>>>> .merge-right.r35190
bf_rna
+ bf_bmesh
bf_blenkernel
bf_blenloader
bf_blenpluginapi
-<<<<<<< .working
- bf_blroutines
- bf_converter
- bf_ketsji
- bf_bullet
- bf_common
- bf_dummy
- bf_logic
- bf_rasterizer
- bf_oglrasterizer
- bf_expressions
- bf_scenegraph
- bf_ikplugin
- bf_intern_itasc
- bf_intern_ik
- bf_intern_smoke
-=======
ge_blen_routines
bf_editor_datafiles
ge_converter
@@ -111,15 +97,9 @@ if(UNIX)
bf_intern_itasc
bf_intern_ik
bf_intern_smoke
->>>>>>> .merge-right.r35190
bf_modifiers
-<<<<<<< .working
- bf_intern_moto
- bf_kernel
-=======
bf_intern_moto
bf_gen_system
->>>>>>> .merge-right.r35190
bf_nodes
bf_gpu
bf_imbuf
@@ -130,43 +110,47 @@ if(UNIX)
extern_bullet
bf_intern_guardedalloc
bf_intern_memutil
- bf_python
bf_python_ext
bf_blenlib
-<<<<<<< .working
- bf_cineon
- bf_openexr
- extern_openjpeg
- bf_dds
-=======
bf_imbuf_cineon
bf_imbuf_openexr
extern_openjpeg
bf_imbuf_dds
->>>>>>> .merge-right.r35190
bf_readblenfile
bf_dna
ge_videotex
bf_blenfont
bf_intern_audaspace
blenkernel_blc
+ bf_bmesh
extern_binreloc
- extern_glew
extern_minilzo
bf_intern_ghost # duplicate for linking
bf_blenkernel # duplicate for linking
bf_intern_mikktspace
)
-<<<<<<< .working
- IF(WITH_CXX_GUARDEDALLOC)
- SET(BLENDER_SORTED_LIBS ${BLENDER_SORTED_LIBS} bf_intern_guardedalloc_cpp)
- ENDIF(WITH_CXX_GUARDEDALLOC)
-=======
+ if(WITH_BUILTIN_GLEW)
+ list(APPEND BLENDER_SORTED_LIBS extern_glew)
+ endif()
+
+ if(WITH_LZMA)
+ list(APPEND BLENDER_SORTED_LIBS extern_lzma)
+ endif()
+
+ if(WITH_MOD_DECIMATE)
+ list(APPEND BLENDER_SORTED_LIBS bf_intern_decimate)
+ endif()
+
+ if(WITH_MOD_BOOLEAN)
+ list(APPEND BLENDER_SORTED_LIBS bf_intern_bsp)
+ list(APPEND BLENDER_SORTED_LIBS bf_intern_bop)
+ list(APPEND BLENDER_SORTED_LIBS bf_intern_moto)
+ endif()
+
if(WITH_CODEC_QUICKTIME)
list(APPEND BLENDER_SORTED_LIBS bf_quicktime)
endif()
->>>>>>> .merge-right.r35190
if(WITH_CXX_GUARDEDALLOC)
list(APPEND BLENDER_SORTED_LIBS bf_intern_guardedalloc_cpp)
@@ -190,9 +174,9 @@ if(UNIX)
message(STATUS "Player Skipping: (${REM_MSG})")
endif()
target_link_libraries(blenderplayer ${BLENDER_SORTED_LIBS})
-else()
- target_link_libraries(blenderplayer ${BLENDER_LINK_LIBS})
-endif()
+# else()
+# target_link_libraries(blenderplayer ${BLENDER_LINK_LIBS})
+# endif()
if(WITH_PLAYER)
add_subdirectory(bad_level_call_stubs)
diff --git a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
index 73fa01ebff2..6d92bad0bcd 100644
--- a/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
+++ b/source/blenderplayer/bad_level_call_stubs/CMakeLists.txt
@@ -56,4 +56,5 @@ if(WITH_INTERNATIONAL)
add_definitions(-DWITH_FREETYPE2)
endif()
+add_definitions(-DBUILDING_GAMEPLAYER)
blender_add_lib_nolist(blenkernel_blc "${SRC}" "${INC}")
diff --git a/source/blenderplayer/bad_level_call_stubs/SConscript b/source/blenderplayer/bad_level_call_stubs/SConscript
index 5efe9aa5761..6508bf06912 100644
--- a/source/blenderplayer/bad_level_call_stubs/SConscript
+++ b/source/blenderplayer/bad_level_call_stubs/SConscript
@@ -8,9 +8,9 @@ incs += ' #/source/blender/makesdna'
incs += ' #/source/blender/makesrna'
incs += ' #/source/blender/blenloader'
-defs = ''
+defs = 'BUILDING_GAMEPLAYER'
if env['WITH_BF_INTERNATIONAL']:
- defs += 'WITH_FREETYPE2'
+ defs += ' WITH_FREETYPE2'
if env['WITH_BF_GAMEENGINE']:
defs += ' WITH_GAMEENGINE'
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index 292e9ddd1ff..49635dfc038 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -92,12 +92,37 @@ struct wmEvent;
struct wmKeyConfig;
struct wmKeyMap;
struct wmOperator;
+struct wmWindow;
struct wmWindowManager;
struct View3D;
struct ToolSettings;
-
+struct bContextDataResult;
+struct bConstraintTarget;
+struct bPythonConstraint;
+struct bConstraintOb;
+struct Context;
+struct ChannelDriver;
+struct BMEditMesh;
+struct Heap;
+struct HeapNode;
+struct Scene;
/*new render funcs */
+void EDBM_selectmode_set(struct BMEditMesh *em) {}
+void EDBM_LoadEditBMesh(struct Scene *scene, struct Object *ob) {}
+void EDBM_MakeEditBMesh(struct ToolSettings *ts, struct Scene *scene, struct Object *ob) {}
+void *g_system;
+
+struct Heap* BLI_heap_new (void){return NULL;}
+void BLI_heap_free (struct Heap *heap, void *ptrfreefp) {}
+struct HeapNode* BLI_heap_insert (struct Heap *heap, float value, void *ptr){return NULL;}
+void BLI_heap_remove (struct Heap *heap, struct HeapNode *node) {}
+int BLI_heap_empty (struct Heap *heap) {return 0;}
+int BLI_heap_size (struct Heap *heap){return 0;}
+struct HeapNode* BLI_heap_top (struct Heap *heap){return NULL;}
+void* BLI_heap_popmin (struct Heap *heap){return NULL;}
+
+
float *RE_RenderLayerGetPass(struct RenderLayer *rl, int passtype) {return (float *) NULL;}
float RE_filter_value(int type, float x) {return 0.0f;}
struct RenderLayer *RE_GetRenderLayer(struct RenderResult *rr, const char *name) {return (struct RenderLayer *)NULL;}
@@ -160,7 +185,9 @@ int WM_enum_search_invoke(struct bContext *C, struct wmOperator *op, struct wmEv
void WM_event_add_notifier(const struct bContext *C, unsigned int type, void *reference){}
void WM_main_add_notifier(unsigned int type, void *reference){}
void ED_armature_bone_rename(struct bArmature *arm, char *oldnamep, char *newnamep){}
-struct wmEventHandler *WM_event_add_modal_handler(struct bContext *C, struct wmOperator *op){return (struct wmEventHandler *)NULL;};
+struct wmEventHandler *WM_event_add_modal_handler(struct bContext *C, struct wmOperator *op){return (struct wmEventHandler *)NULL;}
+struct wmTimer *WM_event_add_timer(struct wmWindowManager *wm, struct wmWindow *win, int event_type, double timestep){return (struct wmTimer *)NULL;}
+void WM_event_remove_timer(struct wmWindowManager *wm, struct wmWindow *win, struct wmTimer *timer){}
void ED_armature_edit_bone_remove(struct bArmature *arm, struct EditBone *exBone){}
void object_test_constraints (struct Object *owner){}
void ED_object_parent(struct Object *ob, struct Object *par, int type, const char *substr){}
@@ -388,6 +415,9 @@ char *WM_operator_pystring(struct bContext *C, struct wmOperatorType *ot, struct
struct wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value){return (struct wmKeyMapItem *)NULL;}
struct wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, char *idname, EnumPropertyItem *items){return (struct wmKeyMap *) NULL;}
+/* RNA COLLADA dependency */
+int collada_export(struct Scene *sce, const char *filepath){ return 0; }
+
int sculpt_get_brush_size(struct Brush *brush) {return 0;}
void sculpt_set_brush_size(struct Brush *brush, int size) {}
int sculpt_get_lock_brush_size(struct Brush *brush){ return 0;}
@@ -397,6 +427,19 @@ float sculpt_get_brush_alpha(struct Brush *brush){return 0.0f;}
void sculpt_set_brush_alpha(struct Brush *brush, float alpha){}
void ED_sculpt_modifiers_changed(struct Object *ob){};
+
+/* bpy/python internal api */
+void operator_wrapper(struct wmOperatorType *ot, void *userdata) {}
+void BPY_text_free_code(struct Text *text) {}
+void BPY_id_release(struct Text *text) {}
+int BPY_context_member_get(struct Context *C, const char *member, struct bContextDataResult *result) { return 0; }
+void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct) {}
+float BPY_driver_exec(struct ChannelDriver *driver) {return 0.0f;} /* might need this one! */
+void BPY_DECREF(void *pyob_ptr) {}
+void BPY_pyconstraint_exec(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets) {}
+void macro_wrapper(struct wmOperatorType *ot, void *userdata) {} ;
+
+
char blender_path[] = "";
#endif // WITH_GAMEENGINE
diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt
index e9faa1c0669..1dd3f8a725a 100644
--- a/source/creator/CMakeLists.txt
+++ b/source/creator/CMakeLists.txt
@@ -101,7 +101,31 @@ set(SRC
creator.c
)
+# MSVC 2010 gives linking errors with the manifest
if(WIN32 AND NOT UNIX)
+ string(SUBSTRING ${BLENDER_VERSION} 0 1 bver1)
+ string(SUBSTRING ${BLENDER_VERSION} 2 1 bver2)
+ string(SUBSTRING ${BLENDER_VERSION} 3 1 bver3)
+ if(MINGW)
+ add_definitions(
+ -DWINDRES
+ -DBLEN_VER_RC_STR_M=${BLENDER_VERSION}
+ -DBLEN_VER_RC_1=${bver1}
+ -DBLEN_VER_RC_2=${bver2}
+ -DBLEN_VER_RC_3=${bver3}
+ -DBLEN_VER_RC_4=0
+ )
+ else()
+ add_definitions(
+ -DBLEN_VER_RC_STR=${BLENDER_VERSION}
+ -DBLEN_VER_RC_1=${bver1}
+ -DBLEN_VER_RC_2=${bver2}
+ -DBLEN_VER_RC_3=${bver3}
+ -DBLEN_VER_RC_4=0
+ )
+ endif()
+
+
list(APPEND SRC
../icons/winblender.rc
)
@@ -149,7 +173,7 @@ if(WITH_BUILDINFO)
set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/buildinfo.h
PROPERTIES GENERATED TRUE
HEADER_FILE_ONLY TRUE)
-
+
# add deps below, after adding blender
# -------------- done with header values.
@@ -170,7 +194,18 @@ if(WITH_PYTHON_MODULE)
PREFIX ""
OUTPUT_NAME bpy
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/
+ RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/ # only needed on windows
)
+
+ if(WIN32)
+ # python modules use this
+ set_target_properties(
+ blender
+ PROPERTIES
+ SUFFIX ".pyd"
+ )
+ endif()
+
else()
add_executable(blender ${EXETYPE} ${SRC})
endif()
@@ -182,79 +217,60 @@ endif()
# Post build steps for bundling/packaging.
-set(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR})
-if(WITH_INSTALL)
+if(MSVC)
+ # ${CMAKE_CFG_INTDIR} should replace \${BUILD_TYPE} when using add_command
+ set(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/\${BUILD_TYPE})
+elseif(APPLE)
+ set(TARGETDIR ${EXECUTABLE_OUTPUT_PATH}/\${BUILD_TYPE})
+else()
+ set(TARGETDIR ${EXECUTABLE_OUTPUT_PATH})
+endif()
+
+# install target
+if(UNIX AND NOT APPLE)
- if(UNIX)
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- #COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/plugins ${TARGETDIR}/
- #COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/text/* ${TARGETDIR}/
- )
+ if(WITH_INSTALL_PORTABLE)
+ set(TARGETDIR_VER ${TARGETDIR}/${BLENDER_VERSION})
+ else()
+ set(TARGETDIR_VER ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION})
endif()
- if(UNIX AND NOT APPLE)
-
- # Local installation, "make install" can be done after this optionally
-
- add_custom_command(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND rm -Rf ${TARGETDIR}/${BLENDER_VERSION}
- COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/
- COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf ${TARGETDIR}/${BLENDER_VERSION}/
+ # important to make a clean install each time
+ # else old scripts get loaded.
+ install(
+ CODE
+ "file(REMOVE_RECURSE ${TARGETDIR_VER})"
+ )
+ # message after building.
+ add_custom_command(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND ${CMAKE_COMMAND} -E echo 'now run: \"make install\" to copy runtime files & scripts to ${TARGETDIR_VER}'
+ )
+
+ # there are a few differences between portable and system install
+ if(WITH_INSTALL_PORTABLE)
+ install(
+ FILES
+ ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop
+ ${CMAKE_SOURCE_DIR}/release/freedesktop/icons/scalable/blender.svg
+ ${CMAKE_SOURCE_DIR}/doc/manpage/blender.1
+ DESTINATION ${TARGETDIR}
)
-
- if(WITH_INTERNATIONAL)
- add_custom_command(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages ${TARGETDIR}/${BLENDER_VERSION}/
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale ${TARGETDIR}/${BLENDER_VERSION}/
- )
- endif()
-
- if(WITH_PYTHON)
- add_custom_command(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMENT "copying blender scripts..."
- COMMAND cp -R ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/${BLENDER_VERSION}/
- COMMAND find ${TARGETDIR} -name "*.py?" -prune -exec rm -rf {} "\;"
- )
- if(WITH_PYTHON_INSTALL)
- # Copy the systems python into the install directory
- # Scons copy in tools/Blender.py
- add_custom_command(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMENT "copying a subset of the systems python..."
- COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/python # PYTHONPATH and PYTHONHOME is set here
- COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/python/lib/
- COMMAND cp -R ${PYTHON_LIBPATH}/python${PYTHON_VERSION} ${TARGETDIR}/${BLENDER_VERSION}/python/lib/
-
- COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/distutils
- COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/lib2to3
- COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/idlelib
- COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/tkinter
- COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/config
-
- COMMAND rm -rf ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/site-packages
- COMMAND mkdir ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/site-packages # python needs it.
-
- COMMAND rm -f ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION}/lib-dynload/_tkinter.so
- COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "test" -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "*.py?" -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/python${PYTHON_VERSION} -name "*.so"-exec strip -s {} "\;"
- )
- endif()
- endif()
-
- add_custom_command(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND find ${TARGETDIR} -name .svn -prune -exec rm -rf {} "\;"
+
+ install(
+ PROGRAMS
+ ${CMAKE_SOURCE_DIR}/release/bin/blender-thumbnailer.py
+ DESTINATION ${TARGETDIR}
)
-
-
- # Above we bundle a portable distribution in ./bin
- # This is an optional "make install" which installs blender on the system.
+
+ install(
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/text/
+ DESTINATION ${TARGETDIR}
+ PATTERN ".svn" EXCLUDE
+ )
+
+ else()
+ # main blender binary
install(
PROGRAMS ${TARGETDIR}/blender
DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
@@ -267,6 +283,7 @@ if(WITH_INSTALL)
)
endif()
+ # misc files
install(
FILES ${CMAKE_SOURCE_DIR}/release/freedesktop/blender.desktop
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications
@@ -288,229 +305,386 @@ if(WITH_INSTALL)
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/doc/blender
PATTERN ".svn" EXCLUDE
)
+ endif()
+
+ install(
+ FILES ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf
+ DESTINATION ${TARGETDIR_VER}/config
+ )
+
+ if(WITH_INTERNATIONAL)
+ install(
+ FILES ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages
+ DESTINATION ${TARGETDIR_VER}/config
+ )
+
install(
- DIRECTORY ${CMAKE_SOURCE_DIR}/release/scripts/
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION}/scripts
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale
+ DESTINATION ${TARGETDIR_VER}/datafiles/
PATTERN ".svn" EXCLUDE
- PATTERN "*.pyc" EXCLUDE
- PATTERN "__pycache__" EXCLUDE
)
+ endif()
+
+ # plugins in blender 2.5 don't work at the moment.
+ #
+ # install(
+ # DIRECTORY ${CMAKE_SOURCE_DIR}/release/plugins
+ # DESTINATION ${TARGETDIR_VER}/
+ # PATTERN ".svn" EXCLUDE
+ # )
+
+ if(WITH_PYTHON)
+ # install(CODE "message(\"copying blender scripts...\")")
install(
- DIRECTORY ${CMAKE_SOURCE_DIR}/release/datafiles/brushicons/
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION}/datafiles/brushicons
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/scripts
+ DESTINATION ${TARGETDIR_VER}/
PATTERN ".svn" EXCLUDE
+ PATTERN "__pycache__" EXCLUDE
)
- if(WITH_INTERNATIONAL)
+
+ if(WITH_PYTHON_INSTALL)
+ # Copy the systems python into the install directory
+ # Scons copy in tools/Blender.py
+ # install(CODE "message(\"copying a subset of the systems python...\")")
install(
- DIRECTORY ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale/
- DESTINATION ${CMAKE_INSTALL_PREFIX}/share/blender/${BLENDER_VERSION}/datafiles/locale
+ DIRECTORY ${PYTHON_LIBPATH}/python${PYTHON_VERSION}
+ DESTINATION ${TARGETDIR_VER}/python/lib/
PATTERN ".svn" EXCLUDE
+ PATTERN "__pycache__" EXCLUDE # ./distutils
+ PATTERN "distutils" EXCLUDE # ./distutils
+ PATTERN "lib2to3" EXCLUDE # ./lib2to3
+ PATTERN "config" EXCLUDE # ./config
+ PATTERN "config-*" EXCLUDE # ./config-*
+ PATTERN "site-packages/*" EXCLUDE # ./site-packages/*
+ PATTERN "tkinter" EXCLUDE # ./tkinter
+ PATTERN "lib-dynload/_tkinter.*" EXCLUDE # ./lib-dynload/_tkinter.co
+ PATTERN "test" EXCLUDE # ./test
+ PATTERN "turtledemo" EXCLUDE # ./turtledemo
)
+
+ # # doesnt work, todo
+ # install(CODE "execute_process(COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/ -name '*.so' -exec strip -s {} '\;')")
endif()
-
- # end "make install"
-
- elseif(WIN32)
- # notice 'xcopy /Y /H' on .bfont.ttf, this is needed when building over samba
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\"
- COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\scripts\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\scripts\"
- COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\config\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\config\"
- COMMAND if not exist \"${TARGETDIR}\\plugins\" mkdir \"${TARGETDIR}\\plugins\"
- COMMAND xcopy /Y /H \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.bfont.ttf\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
- COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\scripts\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\scripts\\\"
- COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\plugins\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\plugins\\\"
- COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\text\\*.*\" \"${TARGETDIR}\\\"
+ endif()
+elseif(WIN32)
+
+ set(TARGETDIR_VER ${TARGETDIR}/${BLENDER_VERSION})
+
+ install( # same as linux!, deduplicate
+ CODE
+ "file(REMOVE_RECURSE ${TARGETDIR_VER})"
+ )
+
+ install( # same as linux!, deduplicate
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/text/
+ DESTINATION ${TARGETDIR}/
+ PATTERN ".svn" EXCLUDE
+ )
+
+ install( # same as linux!, deduplicate
+ FILES ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf
+ DESTINATION ${TARGETDIR_VER}/config
+ )
+
+ if(WITH_INTERNATIONAL) # same as linux!, deduplicate
+ install(
+ FILES ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages
+ DESTINATION ${TARGETDIR_VER}/config
)
-
- if(CMAKE_CL_64)
- # gettext and png are statically linked on win64
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\"
+ install(
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale
+ DESTINATION ${TARGETDIR_VER}/datafiles/
+ PATTERN ".svn" EXCLUDE
+ )
+
+ if(NOT CMAKE_CL_64)
+ install(
+ FILES ${LIBDIR}/gettext/lib/gnu_gettext.dll
+ DESTINATION ${TARGETDIR}/
COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\"
COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\\\"
)
- else()
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\gettext\\lib\\gnu_gettext.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\png\\lib\\libpng.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\zlib\\lib\\zlib.dll\" \"${TARGETDIR}\\\"
+
+ install(
+ FILES ${LIBDIR}/iconv/lib/iconv.dll
+ DESTINATION ${TARGETDIR}/
)
endif()
-
-
- if(MSVC)
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\pthreads\\lib\\pthreadVC2.dll\" \"${TARGETDIR}\\\"
+ endif()
+
+ install( # same as linux!, deduplicate
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale/
+ DESTINATION ${TARGETDIR_VER}/datafiles/locale
+ PATTERN ".svn" EXCLUDE
+ )
+
+ # plugins in blender 2.5 don't work at the moment.
+ #
+ # install(
+ # DIRECTORY ${CMAKE_SOURCE_DIR}/release/plugins
+ # DESTINATION ${TARGETDIR_VER}/
+ # PATTERN ".svn" EXCLUDE
+ # )
+
+ if(WITH_PYTHON)
+ # install(CODE "message(\"copying blender scripts...\")")
+ install( # same as linux!, deduplicate
+ DIRECTORY ${CMAKE_SOURCE_DIR}/release/scripts
+ DESTINATION ${TARGETDIR_VER}/
+ PATTERN ".svn" EXCLUDE
+ PATTERN "__pycache__" EXCLUDE
+ )
+
+ # TODO, multiple targets?
+ install(FILES ${LIBDIR}/python/lib/python32.dll DESTINATION ${TARGETDIR}/ CONFIGURATIONS Release)
+ install(FILES ${LIBDIR}/python/lib/python32.dll DESTINATION ${TARGETDIR}/ CONFIGURATIONS RelWithDebInfo)
+ install(FILES ${LIBDIR}/python/lib/python32.dll DESTINATION ${TARGETDIR}/ CONFIGURATIONS MinSizeRel)
+
+ install(
+ FILES ${LIBDIR}/python/lib/python32_d.dll
+ DESTINATION ${TARGETDIR}/
+ CONFIGURATIONS Debug
+ )
+
+ if(WITH_PYTHON_INSTALL)
+ #~ # note, as far as python is concerned 'RelWithDebInfo' is not debug since its without debug flags.
+
+ # create the directory in multiple steps, so it actually gets created when it doesn't exist yet
+ install(CODE "
+ message(\"creating ${TARGETDIR_VER}/python/lib\")
+ file(MAKE_DIRECTORY ${TARGETDIR_VER}/python/)
+ file(MAKE_DIRECTORY ${TARGETDIR_VER}/python/lib/)
+ message(\"done creating dir\")
+ ")
+
+ install(
+ CODE
+ "
+ execute_process(COMMAND \"${CMAKE_COMMAND}\" -E chdir \"${TARGETDIR_VER}/python/lib/\"
+ \"${CMAKE_COMMAND}\" -E tar xzfv \"${LIBDIR}/release/python32.tar.gz\")
+ "
+ CONFIGURATIONS Release
)
- else()
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\pthreads\\lib\\pthreadGC2.dll\" \"${TARGETDIR}\\\"
+ install(
+ CODE
+ "
+ execute_process(COMMAND \"${CMAKE_COMMAND}\" -E chdir \"${TARGETDIR_VER}/python/lib/\"
+ \"${CMAKE_COMMAND}\" -E tar xzfv \"${LIBDIR}/release/python32.tar.gz\")
+ "
+ CONFIGURATIONS RelWithDebInfo
+ )
+ install(
+ CODE
+ "
+ execute_process(COMMAND \"${CMAKE_COMMAND}\" -E chdir \"${TARGETDIR_VER}/python/lib/\"
+ \"${CMAKE_COMMAND}\" -E tar xzfv \"${LIBDIR}/release/python32.tar.gz\")
+ "
+ CONFIGURATIONS MinSizeRel
+ )
+ install(
+ CODE
+ "
+ execute_process(COMMAND \"${CMAKE_COMMAND}\" -E chdir \"${TARGETDIR_VER}/python/lib/\"
+ \"${CMAKE_COMMAND}\" -E tar xzfv \"${LIBDIR}/release/python32_d.tar.gz\")
+ "
+ CONFIGURATIONS Debug
)
- endif()
- if(WITH_PYTHON)
- # note, as far as python is concerned 'RelWithDebInfo' is not debug since its without debug flags.
- if(NOT CMAKE_BUILD_TYPE) # hack: with multi-configuration generator this is "", so for now copy both python31.dll/zip and python31_d.dll/zip
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\"
- COMMAND if \"$(ConfigurationName)\" == \"\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
- COMMAND if \"$(ConfigurationName)\" == \"\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
- COMMAND if \"$(ConfigurationName)\" == \"Debug\" copy /Y \"${LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\"
- COMMAND if \"$(ConfigurationName)\" == \"Debug\" xcopy /E /Y \"${LIBDIR}\\release\\python31_d\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
- COMMAND if \"$(ConfigurationName)\" == \"RelWithDebInfo\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
- COMMAND if \"$(ConfigurationName)\" == \"RelWithDebInfo\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
- COMMAND if \"$(ConfigurationName)\" == \"Release\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
- COMMAND if \"$(ConfigurationName)\" == \"Release\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
- COMMAND if \"$(ConfigurationName)\" == \"MinSizeRel\" copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
- COMMAND if \"$(ConfigurationName)\" == \"MinSizeRel\" xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
- )
- else()
- if(CMAKE_BUILD_TYPE STREQUAL Debug)
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31_d.dll\" \"${TARGETDIR}\\\"
- COMMAND xcopy /E /Y \"${LIBDIR}\\release\\python31_d\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
- )
- else()
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\python\\lib\\python31.dll\" \"${TARGETDIR}\\\"
- COMMAND xcopy /E /Y \"${LIBDIR}\\release\\python31\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\python\\lib\\\"
- )
- endif()
- endif()
+ # doesnt work, todo
+ # install(CODE "execute_process(COMMAND find ${TARGETDIR}/${BLENDER_VERSION}/python/lib/ -name '*.so' -exec strip -s {} '\;')")
endif()
+ endif()
- if(WITH_INTERNATIONAL)
- if(CMAKE_CL_64)
- # iconv is statically linked on win64
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\"
- COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
- COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\\\"
- )
- else()
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\iconv\\lib\\iconv.dll\" \"${TARGETDIR}\\\"
- COMMAND if not exist \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\" mkdir \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\"
- COMMAND copy /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\.Blanguages\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\\"
- COMMAND xcopy /E /Y \"${CMAKE_SOURCE_DIR}\\release\\bin\\.blender\\locale\\*.*\" \"${TARGETDIR}\\${BLENDER_VERSION}\\config\\locale\\\"
- )
- endif()
- endif()
+ if(CMAKE_CL_64)
+ # gettext and png are statically linked on win64
+ install(
+ FILES ${LIBDIR}/zlib/lib/zlib.dll
+ DESTINATION ${TARGETDIR}/
+ )
+ else()
+ install(
+ FILES
+ ${LIBDIR}/png/lib/libpng.dll
+ ${LIBDIR}/zlib/lib/zlib.dll
+ DESTINATION ${TARGETDIR}/
+ )
+ endif()
- if(WITH_CODEC_FFMPEG)
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avcodec-52.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avformat-52.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avdevice-52.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\avutil-50.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\ffmpeg\\lib\\swscale-0.dll\" \"${TARGETDIR}\\\"
- )
- endif()
+ if(MSVC)
+ install(
+ FILES ${LIBDIR}/pthreads/lib/pthreadVC2.dll
+ DESTINATION ${TARGETDIR}/
+ )
+ else()
+ install(
+ FILES ${LIBDIR}/pthreads/lib/pthreadGC2.dll
+ DESTINATION ${TARGETDIR}/
+ )
+ endif()
- if(WITH_CODEC_SNDFILE)
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\sndfile\\lib\\libsndfile-1.dll\" \"${TARGETDIR}\\\"
- )
- endif()
+ if(WITH_CODEC_FFMPEG)
+ install(
+ FILES
+ ${LIBDIR}/ffmpeg/lib/avcodec-52.dll
+ ${LIBDIR}/ffmpeg/lib/avformat-52.dll
+ ${LIBDIR}/ffmpeg/lib/avdevice-52.dll
+ ${LIBDIR}/ffmpeg/lib/avutil-50.dll
+ ${LIBDIR}/ffmpeg/lib/swscale-0.dll
+ DESTINATION ${TARGETDIR}/
+ )
- if(WITH_JACK)
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\jack\\lib\\libjack.dll\" \"${TARGETDIR}\\\"
- )
- endif()
+ endif()
+
+ if(WITH_CODEC_SNDFILE)
+ install(
+ FILES
+ ${LIBDIR}/sndfile/lib/libsndfile-1.dll
+ DESTINATION ${TARGETDIR}/
+ )
+ endif()
- if(WITH_OPENAL)
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\openal\\lib\\OpenAL32.dll\" \"${TARGETDIR}\\\"
- COMMAND copy /Y \"${LIBDIR}\\openal\\lib\\wrap_oal.dll\" \"${TARGETDIR}\\\"
+ if(WITH_OPENAL)
+ install(
+ FILES
+ ${LIBDIR}/openal/lib/OpenAL32.dll
+ ${LIBDIR}/openal/lib/wrap_oal.dll
+ DESTINATION ${TARGETDIR}/
+ )
+ endif()
+ if(WITH_SDL)
+ if(NOT CMAKE_CL_64)
+ install(
+ FILES
+ ${LIBDIR}/sdl/lib/SDL.dll
+ DESTINATION ${TARGETDIR}/
)
endif()
+ endif()
- if(WITH_SDL)
- if(NOT CMAKE_CL_64)
- add_custom_command(TARGET blender
- POST_BUILD
- MAIN_DEPENDENCY blender
- COMMAND copy /Y \"${LIBDIR}\\sdl\\lib\\SDL.dll\" \"${TARGETDIR}\\\"
- )
- endif()
- endif()
+ if(NOT CMAKE_CL_64)
+ install(
+ FILES
+ ${LIBDIR}/thumbhandler/lib/BlendThumb.dll
+ DESTINATION ${TARGETDIR}/
+ )
+ else()
+ install(
+ FILES
+ ${LIBDIR}/thumbhandler/lib/BlendThumb64.dll
+ DESTINATION ${TARGETDIR}/
+ )
+ endif()
+
+elseif(APPLE)
+ set(SOURCEDIR ${CMAKE_SOURCE_DIR}/source/darwin/blender.app)
+ set(SOURCEINFO ${SOURCEDIR}/Contents/Info.plist)
+ set(TARGETDIR_VER ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION})
+
+ # setup Info.plist
+ execute_process(COMMAND date "+%Y-%m-%d" OUTPUT_VARIABLE BLENDER_DATE OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ set_target_properties(blender PROPERTIES
+ MACOSX_BUNDLE_INFO_PLIST ${SOURCEINFO}
+ MACOSX_BUNDLE_SHORT_VERSION_STRING ${BLENDER_VERSION}
+ MACOSX_BUNDLE_LONG_VERSION_STRING "${BLENDER_VERSION} ${BLENDER_DATE}")
+
+ # important to make a clean install each time else old scripts get loaded.
+ install(
+ CODE
+ "file(REMOVE_RECURSE ${TARGETDIR_VER})"
+ )
- elseif(APPLE)
- set(SOURCEDIR ${CMAKE_SOURCE_DIR}/source/darwin/blender.app)
- set(SOURCEINFO ${SOURCEDIR}/Contents/Info.plist)
- set(TARGETINFO ${TARGETDIR}/blender.app/Contents/Info.plist)
+ # message after building.
+ add_custom_command(
+ TARGET blender POST_BUILD MAIN_DEPENDENCY blender
+ COMMAND ${CMAKE_COMMAND} -E echo 'now run: \"make install\" to copy runtime files & scripts to ${TARGETDIR_VER}'
+ )
- add_custom_command(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp -Rf ${SOURCEINFO} ${TARGETDIR}/blender.app/Contents/
- COMMAND cp -Rf ${SOURCEDIR}/Contents/PkgInfo ${TARGETDIR}/blender.app/Contents/
- COMMAND cp -Rf ${SOURCEDIR}/Contents/Resources ${TARGETDIR}/blender.app/Contents/
- COMMAND cat ${SOURCEINFO} | sed s/VERSION/${BLENDER_VERSION}${BLENDER_VERSION_CHAR}/ | sed s/DATE/`date +'%Y-%b-%d'`/ > ${TARGETINFO}
- COMMAND rm -Rf ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}
- COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}
- COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
- COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
+ # handy install macro to exclude files, we use \$ escape for the "to"
+ # argument when calling so ${BUILD_TYPE} does not get expanded
+ macro(install_dir from to)
+ install(
+ DIRECTORY ${from}
+ DESTINATION ${to}
+ PATTERN ".svn" EXCLUDE
+ PATTERN "*.pyc" EXCLUDE
+ PATTERN "*.pyo" EXCLUDE
+ PATTERN "*.orig" EXCLUDE
+ PATTERN "*.rej" EXCLUDE
+ PATTERN "__pycache__" EXCLUDE
+ PATTERN "__MACOSX" EXCLUDE
+ PATTERN ".DS_Store" EXCLUDE
)
-
- if(WITH_INTERNATIONAL)
- add_custom_command(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
- COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/datafiles/
- )
- endif()
-
- if(WITH_PYTHON)
- set(PYTHON_ZIP "python_${CMAKE_OSX_ARCHITECTURES}.zip")
- add_custom_command(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND cp -Rf ${CMAKE_SOURCE_DIR}/release/scripts ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/
- COMMAND mkdir ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/python/
- COMMAND unzip -q ${LIBDIR}/release/${PYTHON_ZIP} -d ${TARGETDIR}/blender.app/Contents/MacOS/${BLENDER_VERSION}/python/
- COMMAND find ${TARGETDIR}/blender.app -name "*.py?" -prune -exec rm -rf {} "\;"
- )
- endif()
-
- add_custom_command(
- TARGET blender POST_BUILD MAIN_DEPENDENCY blender
- COMMAND find ${TARGETDIR}/blender.app -name .DS_Store -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/blender.app -name .svn -prune -exec rm -rf {} "\;"
- COMMAND find ${TARGETDIR}/blender.app -name __MACOSX -prune -exec rm -rf {} "\;"
+ endmacro()
+
+ # install release and app files
+ install_dir(
+ ${CMAKE_SOURCE_DIR}/release/text/
+ \${TARGETDIR}
+ )
+
+ install(
+ FILES ${SOURCEDIR}/Contents/PkgInfo
+ DESTINATION ${TARGETDIR}/blender.app/Contents/
+ )
+
+ install_dir(
+ ${SOURCEDIR}/Contents/Resources
+ \${TARGETDIR}/blender.app/Contents/
+ )
+
+ install(
+ FILES ${CMAKE_SOURCE_DIR}/release/bin/.blender/.bfont.ttf
+ DESTINATION ${TARGETDIR_VER}/datafiles
+ )
+
+ # localization
+ if(WITH_INTERNATIONAL)
+ install(
+ FILES ${CMAKE_SOURCE_DIR}/release/bin/.blender/.Blanguages
+ DESTINATION ${TARGETDIR_VER}/datafiles
+ )
+
+ install_dir(
+ ${CMAKE_SOURCE_DIR}/release/bin/.blender/locale/
+ \${TARGETDIR_VER}/datafiles/locale
)
endif()
+ # python
+ if(WITH_PYTHON)
+ # the python zip is first extract as part of the build process,
+ # and then later installed as part of make install. this is much
+ # quicker, and means we can easily exclude files on copy
+ add_custom_target(
+ extractpyzip
+ DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/python)
+
+ set(PYTHON_ZIP "python_${CMAKE_OSX_ARCHITECTURES}.zip")
+
+ add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/python
+ COMMAND rm -rf ${CMAKE_CURRENT_BINARY_DIR}/python/
+ COMMAND mkdir ${CMAKE_CURRENT_BINARY_DIR}/python/
+ COMMAND unzip -q ${LIBDIR}/release/${PYTHON_ZIP} -d ${CMAKE_CURRENT_BINARY_DIR}/python/
+ DEPENDS ${LIBDIR}/release/${PYTHON_ZIP})
+
+ add_dependencies(blender extractpyzip)
+
+ # copy extracted python files
+ install_dir(
+ ${CMAKE_CURRENT_BINARY_DIR}/python
+ \${TARGETDIR_VER}
+ )
+
+ # copy scripts
+ install_dir(
+ ${CMAKE_SOURCE_DIR}/release/scripts
+ \${TARGETDIR_VER}
+ )
+ endif()
endif()
add_dependencies(blender makesdna)
@@ -567,10 +741,10 @@ endif()
bf_editor_animation
bf_editor_datafiles
- bf_render
- bf_intern_opennl
- bf_python
- bf_python_ext
+ bf_render
+ bf_intern_opennl
+ bf_python
+ bf_python_ext
bf_ikplugin
bf_bmesh
bf_modifiers
@@ -581,45 +755,44 @@ endif()
bf_blenlib
bf_intern_ghost
bf_intern_string
- bf_blenpluginapi
- bf_imbuf
- bf_avi
- bf_imbuf_cineon
- bf_imbuf_openexr
+ bf_blenpluginapi
+ bf_imbuf
+ bf_avi
+ bf_imbuf_cineon
+ bf_imbuf_openexr
bf_imbuf_dds
bf_readblenfile
bf_collada
- bf_intern_bsp
- bf_intern_bop
- bf_gen_system
- bf_intern_decimate
- bf_intern_elbeem
- bf_intern_ik
- bf_intern_memutil
- bf_intern_guardedalloc
- bf_intern_ctr
- ge_blen_routines
- ge_converter
+ bf_intern_bsp
+ bf_intern_bop
+ bf_gen_system
+ bf_intern_decimate
+ bf_intern_elbeem
+ bf_intern_ik
+ bf_intern_memutil
+ bf_intern_guardedalloc
+ bf_intern_ctr
+ ge_blen_routines
+ ge_converter
ge_phys_dummy
- ge_phys_bullet
+ ge_phys_bullet
bf_intern_smoke
extern_minilzo
extern_lzma
- ge_logic_ketsji
+ ge_logic_ketsji
ge_phys_common
- ge_logic
- ge_rasterizer
- ge_oglrasterizer
- ge_logic_expressions
- ge_scenegraph
- ge_logic_network
+ ge_logic
+ ge_rasterizer
+ ge_oglrasterizer
+ ge_logic_expressions
+ ge_scenegraph
+ ge_logic_network
bf_gen_system
bf_python # duplicate for BPY_driver_exec
- ge_logic_ngnetwork
- extern_bullet
- ge_logic_loopbacknetwork
- bf_intern_moto
- extern_glew
+ ge_logic_ngnetwork
+ extern_bullet
+ ge_logic_loopbacknetwork
+ bf_intern_moto
extern_openjpeg
extern_redcode
ge_videotex
@@ -629,6 +802,10 @@ endif()
bf_intern_audaspace
bf_intern_mikktspace
)
+ if(WITH_BUILTIN_GLEW)
+ list(APPEND BLENDER_SORTED_LIBS extern_glew)
+ endif()
+
if(WITH_BINRELOC)
list(APPEND BLENDER_SORTED_LIBS extern_binreloc)
endif()
diff --git a/source/creator/creator.c b/source/creator/creator.c
index e5a68a6300c..8d398b0cc5a 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -43,6 +43,7 @@
#endif
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#include <signal.h>
@@ -73,7 +74,7 @@
#include "BKE_utildefines.h"
#include "BKE_blender.h"
#include "BKE_context.h"
-#include "BKE_depsgraph.h" // for DAG_on_load_update
+#include "BKE_depsgraph.h" // for DAG_on_visible_update
#include "BKE_font.h"
#include "BKE_global.h"
#include "BKE_main.h"
@@ -250,6 +251,7 @@ static int print_help(int UNUSED(argc), const char **UNUSED(argv), void *data)
BLI_argsPrintArgDoc(ba, "--window-border");
BLI_argsPrintArgDoc(ba, "--window-borderless");
BLI_argsPrintArgDoc(ba, "--window-geometry");
+ BLI_argsPrintArgDoc(ba, "--start-console");
printf("\n");
printf ("Game Engine Specific Options:\n");
@@ -293,6 +295,7 @@ static int print_help(int UNUSED(argc), const char **UNUSED(argv), void *data)
#ifdef WIN32
BLI_argsPrintArgDoc(ba, "-R");
+ BLI_argsPrintArgDoc(ba, "-r");
#endif
BLI_argsPrintArgDoc(ba, "--version");
@@ -390,12 +393,14 @@ static int end_arguments(int UNUSED(argc), const char **UNUSED(argv), void *UNUS
static int enable_python(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
G.f |= G_SCRIPT_AUTOEXEC;
+ G.f |= G_SCRIPT_OVERRIDE_PREF;
return 0;
}
-static int disable_python(int UNUSED(argc), const const char **UNUSED(argv), void *UNUSED(data))
+static int disable_python(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
{
G.f &= ~G_SCRIPT_AUTOEXEC;
+ G.f |= G_SCRIPT_OVERRIDE_PREF;
return 0;
}
@@ -515,15 +520,22 @@ static int without_borders(int UNUSED(argc), const char **UNUSED(argv), void *UN
return 0;
}
+extern int wm_start_with_console; // blender/windowmanager/intern/wm_init_exit.c
+static int start_with_console(int UNUSED(argc), const char **UNUSED(argv), void *UNUSED(data))
+{
+ wm_start_with_console = 1;
+ return 0;
+}
+
static int register_extension(int UNUSED(argc), const char **UNUSED(argv), void *data)
{
#ifdef WIN32
- char *path = BLI_argsArgv(data)[0];
- RegisterBlendExtension(path);
+ if (data)
+ G.background = 1;
+ RegisterBlendExtension();
#else
(void)data; /* unused */
#endif
-
return 0;
}
@@ -606,18 +618,12 @@ static int set_engine(int argc, const char **argv, void *data)
{
printf("\nError: no blend loaded. order the arguments so '-E / --engine ' is after a blend is loaded.\n");
}
- else
- {
+ else {
Scene *scene= CTX_data_scene(C);
RenderData *rd = &scene->r;
- RenderEngineType *type = NULL;
-
- for( type = R_engines.first; type; type = type->next )
- {
- if (!strcmp(argv[1],type->idname))
- {
- BLI_strncpy(rd->engine, type->idname, sizeof(rd->engine));
- }
+
+ if(BLI_findstring(&R_engines, argv[1], offsetof(RenderEngineType, idname))) {
+ BLI_strncpy(rd->engine, argv[1], sizeof(rd->engine));
}
}
}
@@ -990,10 +996,10 @@ static int set_addons(int argc, const char **argv, void *data)
/* workaround for scripts not getting a bpy.context.scene, causes internal errors elsewhere */
if (argc > 1) {
#ifdef WITH_PYTHON
- const int slen= strlen(argv[1]) + 10;
+ const int slen= strlen(argv[1]) + 128;
char *str= malloc(slen);
bContext *C= data;
- BLI_snprintf(str, slen, "[__import__('addon_utils').enable(i) for i in '%s'.split(',')]", argv[1]);
+ BLI_snprintf(str, slen, "[__import__('addon_utils').enable(i, default_set=False) for i in '%s'.split(',')]", argv[1]);
BPY_CTX_SETUP(BPY_string_exec(C, str));
free(str);
#else
@@ -1039,7 +1045,7 @@ static int load_file(int UNUSED(argc), const char **argv, void *data)
G.relbase_valid = 1;
if (CTX_wm_manager(C) == NULL) CTX_wm_manager_set(C, wm); /* reset wm */
- DAG_on_load_update(CTX_data_main(C), TRUE);
+ DAG_on_visible_update(CTX_data_main(C), TRUE);
}
/* WM_read_file() runs normally but since we're in background mode do here */
@@ -1140,7 +1146,9 @@ static void setupArguments(bContext *C, bArgs *ba, SYS_SystemHandle *syshandle)
BLI_argsAdd(ba, 2, "-p", "--window-geometry", "<sx> <sy> <w> <h>\n\tOpen with lower left corner at <sx>, <sy> and width and height as <w>, <h>", prefsize, NULL);
BLI_argsAdd(ba, 2, "-w", "--window-border", "\n\tForce opening with borders (default)", with_borders, NULL);
BLI_argsAdd(ba, 2, "-W", "--window-borderless", "\n\tForce opening without borders", without_borders, NULL);
- BLI_argsAdd(ba, 2, "-R", NULL, "\n\tRegister .blend extension (windows only)", register_extension, ba);
+ BLI_argsAdd(ba, 2, "-con", "--start-console", "\n\tStart with the console window open (ignored if -b is set)", start_with_console, NULL);
+ BLI_argsAdd(ba, 2, "-R", NULL, "\n\tRegister .blend extension, then exit (Windows only)", register_extension, NULL);
+ BLI_argsAdd(ba, 2, "-r", NULL, "\n\tSilently register .blend extension, then exit (Windows only)", register_extension, ba);
BLI_argsAdd(ba, 2, "--no_crash_handler", NULL, "disable crash handler", nocrashhandler, NULL);
/* third pass: disabling things and forcing settings */
diff --git a/source/darwin/blender.app/Contents/Info.plist b/source/darwin/blender.app/Contents/Info.plist
index 0accb3e9940..2f5d235a619 100644
--- a/source/darwin/blender.app/Contents/Info.plist
+++ b/source/darwin/blender.app/Contents/Info.plist
@@ -20,13 +20,13 @@
<string>Blender</string>
<key>CFBundleIdentifier</key>
<string>org.blenderfoundation.blender</string>
-
+
<key>CFBundleVersion</key>
- <string>VERSION, DATE, Blender Foundation</string>
+ <string>${MACOSX_BUNDLE_LONG_VERSION_STRING}, Blender Foundation</string>
<key>CFBundleShortVersionString</key>
- <string>VERSION</string>
+ <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>CFBundleGetInfoString</key>
- <string>VERSION, DATE, Blender Foundation</string>
+ <string>${MACOSX_BUNDLE_LONG_VERSION_STRING}, Blender Foundation</string>
<key>CFBundleDocumentTypes</key>
<array>
diff --git a/source/darwin/blendercreator.app/Contents/Info.plist b/source/darwin/blendercreator.app/Contents/Info.plist
deleted file mode 100644
index 08709cd26e3..00000000000
--- a/source/darwin/blendercreator.app/Contents/Info.plist
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
-<plist version="0.9">
-<dict>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
-
- <key>CFBundleExecutable</key>
- <string>blendercreator</string>
-
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>????</string>
-
- <key>CFBundleIconFile</key>
- <string>blender creator icon.icns</string>
-
- <key>CFBundleName</key>
- <string>BlenderCreator</string>
- <key>CFBundleIdentifier</key>
- <string>com.nantechnologies.blendercreator</string>
-
- <key>CFBundleVersion</key>
- <string>VERSION, DATE, Copyright NaN Technologies BV</string>
- <key>CFBundleShortVersionString</key>
- <string>VERSION</string>
- <key>CFBundleGetInfoString</key>
- <string>VERSION, DATE, Copyright NaN Technologies BV</string>
-
- <key>CFBundleDocumentTypes</key>
- <array>
- <dict>
- <key>CFBundleTypeIconFile</key>
- <string>blender file icon.icns</string>
- <key>CFBundleTypeName</key>
- <string>Blender File</string>
- <key>CFBundleTypeOSTypes</key>
- <array>
- <string>BLND</string>
- </array>
- <key>CFBundleTypeExtensions</key>
- <array>
- <string>blend</string>
- </array>
- <key>CFBundleTypeRole</key>
- <string>Editor</string>
- <key>LSIsAppleDefaultForType</key>
- <true/>
- </dict>
- </array>
-</dict>
-</plist>
diff --git a/source/darwin/blendercreator.app/Contents/MacOS/blendercreator b/source/darwin/blendercreator.app/Contents/MacOS/blendercreator
deleted file mode 100644
index 5e05e74a307..00000000000
--- a/source/darwin/blendercreator.app/Contents/MacOS/blendercreator
+++ /dev/null
@@ -1 +0,0 @@
-placeholder
diff --git a/source/darwin/blendercreator.app/Contents/PkgInfo b/source/darwin/blendercreator.app/Contents/PkgInfo
deleted file mode 100644
index bd04210fb49..00000000000
--- a/source/darwin/blendercreator.app/Contents/PkgInfo
+++ /dev/null
@@ -1 +0,0 @@
-APPL???? \ No newline at end of file
diff --git a/source/darwin/blendercreator.app/Contents/Resources/blender creator icon.icns b/source/darwin/blendercreator.app/Contents/Resources/blender creator icon.icns
deleted file mode 100644
index 5eef94afde9..00000000000
--- a/source/darwin/blendercreator.app/Contents/Resources/blender creator icon.icns
+++ /dev/null
Binary files differ
diff --git a/source/darwin/blendercreator.app/Contents/Resources/blender file icon.icns b/source/darwin/blendercreator.app/Contents/Resources/blender file icon.icns
deleted file mode 100644
index 9065f1b359c..00000000000
--- a/source/darwin/blendercreator.app/Contents/Resources/blender file icon.icns
+++ /dev/null
Binary files differ
diff --git a/source/darwin/blenderplayer.app/Contents/Info.plist b/source/darwin/blenderplayer.app/Contents/Info.plist
index 18c4438884a..f99338d6c47 100644
--- a/source/darwin/blenderplayer.app/Contents/Info.plist
+++ b/source/darwin/blenderplayer.app/Contents/Info.plist
@@ -2,13 +2,35 @@
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="0.9">
<dict>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+
+ <key>CFBundleExecutable</key>
+ <string>blenderplayer</string>
+
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+
+ <key>CFBundleIconFile</key>
+ <string>blender player icon.icns</string>
+
+ <key>CFBundleName</key>
+ <string>BlenderPlayer</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.blenderfoundation.blenderplayer</string>
+
+ <key>CFBundleVersion</key>
+ <string>${MACOSX_BUNDLE_LONG_VERSION_STRING}, Blender Foundation</string>
+ <key>CFBundleShortVersionString</key>
+ <string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
+ <key>CFBundleGetInfoString</key>
+ <string>${MACOSX_BUNDLE_LONG_VERSION_STRING}, Blender Foundation</string>
+
<key>CFBundleDocumentTypes</key>
<array>
<dict>
- <key>CFBundleTypeExtensions</key>
- <array>
- <string>blend</string>
- </array>
<key>CFBundleTypeIconFile</key>
<string>blender file icon.icns</string>
<key>CFBundleTypeName</key>
@@ -17,31 +39,15 @@
<array>
<string>BLND</string>
</array>
+ <key>CFBundleTypeExtensions</key>
+ <array>
+ <string>blend</string>
+ </array>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSIsAppleDefaultForType</key>
<false/>
</dict>
</array>
- <key>CFBundleExecutable</key>
- <string>blenderplayer</string>
- <key>CFBundleGetInfoString</key>
- <string>VERSION, DATE, Blender Foundation</string>
- <key>CFBundleIconFile</key>
- <string>blender player icon.icns</string>
- <key>CFBundleIdentifier</key>
- <string>org.blenderfoundation.blenderplayer</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundleName</key>
- <string>BlenderPlayer</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleShortVersionString</key>
- <string>VERSION</string>
- <key>CFBundleSignature</key>
- <string>????</string>
- <key>CFBundleVersion</key>
- <string>VERSION, DATE, Blender Foundation</string>
</dict>
</plist>
diff --git a/source/darwin/blenderpublisher.app/Contents/Info.plist b/source/darwin/blenderpublisher.app/Contents/Info.plist
deleted file mode 100644
index f22de5a4460..00000000000
--- a/source/darwin/blenderpublisher.app/Contents/Info.plist
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
-<plist version="0.9">
-<dict>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
-
- <key>CFBundleExecutable</key>
- <string>blenderpublisher</string>
-
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleSignature</key>
- <string>????</string>
-
- <key>CFBundleIconFile</key>
- <string>blender publisher icon.icns</string>
-
- <key>CFBundleName</key>
- <string>BlenderPublisher</string>
- <key>CFBundleIdentifier</key>
- <string>com.nantechnologies.blenderpublisher</string>
-
- <key>CFBundleVersion</key>
- <string>VERSION, DATE, Copyright NaN Technologies BV</string>
- <key>CFBundleShortVersionString</key>
- <string>VERSION</string>
- <key>CFBundleGetInfoString</key>
- <string>VERSION, DATE, Copyright NaN Technologies BV</string>
-
- <key>CFBundleDocumentTypes</key>
- <array>
- <dict>
- <key>CFBundleTypeIconFile</key>
- <string>blender file icon.icns</string>
- <key>CFBundleTypeName</key>
- <string>Blender File</string>
- <key>CFBundleTypeOSTypes</key>
- <array>
- <string>BLND</string>
- </array>
- <key>CFBundleTypeExtensions</key>
- <array>
- <string>blend</string>
- </array>
- <key>CFBundleTypeRole</key>
- <string>Editor</string>
- <key>LSIsAppleDefaultForType</key>
- <true/>
- </dict>
- </array>
-</dict>
-</plist>
diff --git a/source/darwin/blenderpublisher.app/Contents/MacOS/blenderpublisher b/source/darwin/blenderpublisher.app/Contents/MacOS/blenderpublisher
deleted file mode 100644
index 5e05e74a307..00000000000
--- a/source/darwin/blenderpublisher.app/Contents/MacOS/blenderpublisher
+++ /dev/null
@@ -1 +0,0 @@
-placeholder
diff --git a/source/darwin/blenderpublisher.app/Contents/PkgInfo b/source/darwin/blenderpublisher.app/Contents/PkgInfo
deleted file mode 100644
index bd04210fb49..00000000000
--- a/source/darwin/blenderpublisher.app/Contents/PkgInfo
+++ /dev/null
@@ -1 +0,0 @@
-APPL???? \ No newline at end of file
diff --git a/source/darwin/blenderpublisher.app/Contents/Resources/blender file icon.icns b/source/darwin/blenderpublisher.app/Contents/Resources/blender file icon.icns
deleted file mode 100644
index a6041899cfb..00000000000
--- a/source/darwin/blenderpublisher.app/Contents/Resources/blender file icon.icns
+++ /dev/null
Binary files differ
diff --git a/source/darwin/blenderpublisher.app/Contents/Resources/blender publisher icon.icns b/source/darwin/blenderpublisher.app/Contents/Resources/blender publisher icon.icns
deleted file mode 100644
index 90784597129..00000000000
--- a/source/darwin/blenderpublisher.app/Contents/Resources/blender publisher icon.icns
+++ /dev/null
Binary files differ
diff --git a/source/gameengine/BlenderRoutines/CMakeLists.txt b/source/gameengine/BlenderRoutines/CMakeLists.txt
index 81db7da5cee..f5103034316 100644
--- a/source/gameengine/BlenderRoutines/CMakeLists.txt
+++ b/source/gameengine/BlenderRoutines/CMakeLists.txt
@@ -29,7 +29,7 @@ set(INC
../../../source/blender/blenloader
../../../source/blender/gpu
../../../extern/bullet2/src
- ../../../extern/glew/include
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
index 9dd63fa3089..ded72b45b81 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
@@ -33,7 +33,7 @@
#include "KX_BlenderCanvas.h"
#include "DNA_screen_types.h"
-#include "stdio.h"
+#include <stdio.h>
KX_BlenderCanvas::KX_BlenderCanvas(struct wmWindow *win, RAS_Rect &rect, struct ARegion *ar) :
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
index 92cb0167192..edf9d244e85 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
@@ -171,7 +171,7 @@ void BL_print_gamedebug_line(const char* text, int xco, int yco, int width, int
/* the actual drawing */
glColor3ub(255, 255, 255);
- BLF_draw_default(xco, height-yco, 0.0f, (char *)text, 65535); /* XXX, use real len */
+ BLF_draw_default((float)xco, (float)(height-yco), 0.0f, (char *)text, 65535); /* XXX, use real len */
glMatrixMode(GL_PROJECTION);
glPopMatrix();
@@ -200,9 +200,9 @@ void BL_print_gamedebug_line_padded(const char* text, int xco, int yco, int widt
/* draw in black first*/
glColor3ub(0, 0, 0);
- BLF_draw_default(xco+2, height-yco-2, 0.0f, text, 65535); /* XXX, use real len */
+ BLF_draw_default((float)(xco+2), (float)(height-yco-2), 0.0f, text, 65535); /* XXX, use real len */
glColor3ub(255, 255, 255);
- BLF_draw_default(xco, height-yco, 0.0f, text, 65535); /* XXX, use real len */
+ BLF_draw_default((float)xco, (float)(height-yco), 0.0f, text, 65535); /* XXX, use real len */
glMatrixMode(GL_PROJECTION);
glPopMatrix();
diff --git a/source/gameengine/Converter/BL_ArmatureChannel.cpp b/source/gameengine/Converter/BL_ArmatureChannel.cpp
index 626d8a19deb..df3a575850b 100644
--- a/source/gameengine/Converter/BL_ArmatureChannel.cpp
+++ b/source/gameengine/Converter/BL_ArmatureChannel.cpp
@@ -37,6 +37,7 @@
#include "BL_ArmatureConstraint.h"
#include "BLI_math.h"
#include "BLI_string.h"
+#include <stddef.h>
#ifdef WITH_PYTHON
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 1b79478b37e..c781159787f 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -964,7 +964,7 @@ RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, KX_Scene* scene,
if (ma) {
polymat->m_specular = MT_Vector3(ma->specr, ma->specg, ma->specb)*ma->spec;
- polymat->m_shininess = (float)ma->har/4.0; // 0 < ma->har <= 512
+ polymat->m_shininess = (float)ma->har/4.0f; // 0 < ma->har <= 512
polymat->m_diffuse = MT_Vector3(ma->r, ma->g, ma->b)*(ma->emit + ma->ref);
}
else {
@@ -1135,7 +1135,7 @@ static float my_boundbox_mesh(Mesh *me, float *loc, float *size)
{
MVert *mvert;
BoundBox *bb;
- MT_Point3 min, max;
+ float min[3], max[3];
float mloc[3], msize[3];
float radius=0.0f, vert_radius, *co;
int a;
@@ -1162,17 +1162,17 @@ static float my_boundbox_mesh(Mesh *me, float *loc, float *size)
}
if(me->totvert) {
- loc[0]= (min[0]+max[0])/2.0;
- loc[1]= (min[1]+max[1])/2.0;
- loc[2]= (min[2]+max[2])/2.0;
+ loc[0]= (min[0]+max[0])/2.0f;
+ loc[1]= (min[1]+max[1])/2.0f;
+ loc[2]= (min[2]+max[2])/2.0f;
- size[0]= (max[0]-min[0])/2.0;
- size[1]= (max[1]-min[1])/2.0;
- size[2]= (max[2]-min[2])/2.0;
+ size[0]= (max[0]-min[0])/2.0f;
+ size[1]= (max[1]-min[1])/2.0f;
+ size[2]= (max[2]-min[2])/2.0f;
}
else {
- loc[0]= loc[1]= loc[2]= 0.0;
- size[0]= size[1]= size[2]= 0.0;
+ loc[0]= loc[1]= loc[2]= 0.0f;
+ size[0]= size[1]= size[2]= 0.0f;
}
bb->vec[0][0]=bb->vec[1][0]=bb->vec[2][0]=bb->vec[3][0]= loc[0]-size[0];
@@ -1210,8 +1210,8 @@ static void my_tex_space_mesh(Mesh *me)
DO_MINMAX(fp, min, max);
}
if(kb->totelem) {
- loc[0]= (min[0]+max[0])/2.0; loc[1]= (min[1]+max[1])/2.0; loc[2]= (min[2]+max[2])/2.0;
- size[0]= (max[0]-min[0])/2.0; size[1]= (max[1]-min[1])/2.0; size[2]= (max[2]-min[2])/2.0;
+ loc[0]= (min[0]+max[0])/2.0f; loc[1]= (min[1]+max[1])/2.0f; loc[2]= (min[2]+max[2])/2.0f;
+ size[0]= (max[0]-min[0])/2.0f; size[1]= (max[1]-min[1])/2.0f; size[2]= (max[2]-min[2])/2.0f;
}
else {
loc[0]= loc[1]= loc[2]= 0.0;
@@ -1223,19 +1223,19 @@ static void my_tex_space_mesh(Mesh *me)
VECCOPY(me->loc, loc);
VECCOPY(me->size, size);
- me->rot[0]= me->rot[1]= me->rot[2]= 0.0;
+ me->rot[0]= me->rot[1]= me->rot[2]= 0.0f;
- if(me->size[0]==0.0) me->size[0]= 1.0;
- else if(me->size[0]>0.0 && me->size[0]<0.00001) me->size[0]= 0.00001;
- else if(me->size[0]<0.0 && me->size[0]> -0.00001) me->size[0]= -0.00001;
+ if(me->size[0]==0.0) me->size[0]= 1.0f;
+ else if(me->size[0]>0.0 && me->size[0]< 0.00001f) me->size[0]= 0.00001f;
+ else if(me->size[0]<0.0 && me->size[0]> -0.00001f) me->size[0]= -0.00001f;
- if(me->size[1]==0.0) me->size[1]= 1.0;
- else if(me->size[1]>0.0 && me->size[1]<0.00001) me->size[1]= 0.00001;
- else if(me->size[1]<0.0 && me->size[1]> -0.00001) me->size[1]= -0.00001;
+ if(me->size[1]==0.0) me->size[1]= 1.0f;
+ else if(me->size[1]>0.0 && me->size[1]< 0.00001f) me->size[1]= 0.00001f;
+ else if(me->size[1]<0.0 && me->size[1]> -0.00001f) me->size[1]= -0.00001f;
- if(me->size[2]==0.0) me->size[2]= 1.0;
- else if(me->size[2]>0.0 && me->size[2]<0.00001) me->size[2]= 0.00001;
- else if(me->size[2]<0.0 && me->size[2]> -0.00001) me->size[2]= -0.00001;
+ if(me->size[2]==0.0) me->size[2]= 1.0f;
+ else if(me->size[2]>0.0 && me->size[2]< 0.00001f) me->size[2]= 0.00001f;
+ else if(me->size[2]<0.0 && me->size[2]> -0.00001f) me->size[2]= -0.00001f;
}
}
@@ -1252,13 +1252,13 @@ static void my_get_local_bounds(Object *ob, DerivedMesh *dm, float *center, floa
float min_r[3], max_r[3];
INIT_MINMAX(min_r, max_r);
dm->getMinMax(dm, min_r, max_r);
- size[0]= 0.5*fabs(max_r[0] - min_r[0]);
- size[1]= 0.5*fabs(max_r[1] - min_r[1]);
- size[2]= 0.5*fabs(max_r[2] - min_r[2]);
+ size[0]= 0.5f*fabsf(max_r[0] - min_r[0]);
+ size[1]= 0.5f*fabsf(max_r[1] - min_r[1]);
+ size[2]= 0.5f*fabsf(max_r[2] - min_r[2]);
- center[0]= 0.5*(max_r[0] + min_r[0]);
- center[1]= 0.5*(max_r[1] + min_r[1]);
- center[2]= 0.5*(max_r[2] + min_r[2]);
+ center[0]= 0.5f*(max_r[0] + min_r[0]);
+ center[1]= 0.5f*(max_r[1] + min_r[1]);
+ center[2]= 0.5f*(max_r[2] + min_r[2]);
return;
} else
{
@@ -1291,13 +1291,13 @@ static void my_get_local_bounds(Object *ob, DerivedMesh *dm, float *center, floa
}
else
{
- size[0]= 0.5*fabs(bb->vec[0][0] - bb->vec[4][0]);
- size[1]= 0.5*fabs(bb->vec[0][1] - bb->vec[2][1]);
- size[2]= 0.5*fabs(bb->vec[0][2] - bb->vec[1][2]);
+ size[0]= 0.5f*fabs(bb->vec[0][0] - bb->vec[4][0]);
+ size[1]= 0.5f*fabs(bb->vec[0][1] - bb->vec[2][1]);
+ size[2]= 0.5f*fabs(bb->vec[0][2] - bb->vec[1][2]);
- center[0]= 0.5*(bb->vec[0][0] + bb->vec[4][0]);
- center[1]= 0.5*(bb->vec[0][1] + bb->vec[2][1]);
- center[2]= 0.5*(bb->vec[0][2] + bb->vec[1][2]);
+ center[0]= 0.5f*(bb->vec[0][0] + bb->vec[4][0]);
+ center[1]= 0.5f*(bb->vec[0][1] + bb->vec[2][1]);
+ center[2]= 0.5f*(bb->vec[0][2] + bb->vec[1][2]);
}
}
@@ -1638,7 +1638,7 @@ static KX_LightObject *gamelight_from_blamp(Object *ob, Lamp *la, unsigned int l
KX_LightObject *gamelight;
lightobj.m_att1 = la->att1;
- lightobj.m_att2 = (la->mode & LA_QUAD)?la->att2:0.0;
+ lightobj.m_att2 = (la->mode & LA_QUAD) ? la->att2 : 0.0f;
lightobj.m_red = la->r;
lightobj.m_green = la->g;
lightobj.m_blue = la->b;
@@ -2651,6 +2651,40 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
dofbit<<=1;
}
}
+ else if(dat->type == PHY_CONE_TWIST_CONSTRAINT)
+ {
+ int dof;
+ int dofbit = 1<<3; // bitflag use_angular_limit_x
+
+ for (dof=3;dof<6;dof++)
+ {
+ if(dat->flag & dofbit)
+ {
+ kxscene->GetPhysicsEnvironment()->setConstraintParam(constraintId,dof,dat->minLimit[dof],dat->maxLimit[dof]);
+ }
+ else
+ {
+ //maxLimit < 0 means free(disabled limit) for this degree of freedom
+ kxscene->GetPhysicsEnvironment()->setConstraintParam(constraintId,dof,1,-1);
+ }
+ dofbit<<=1;
+ }
+ }
+ else if (dat->type == PHY_LINEHINGE_CONSTRAINT)
+ {
+ int dof = 3; // dof for angular x
+ int dofbit = 1<<3; // bitflag use_angular_limit_x
+
+ if (dat->flag & dofbit)
+ {
+ kxscene->GetPhysicsEnvironment()->setConstraintParam(constraintId,dof,
+ dat->minLimit[dof],dat->maxLimit[dof]);
+ } else
+ {
+ //minLimit > maxLimit means free(disabled limit) for this degree of freedom
+ kxscene->GetPhysicsEnvironment()->setConstraintParam(constraintId,dof,1,-1);
+ }
+ }
}
}
}
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index a98fe87a0ef..a0d58ece396 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -778,12 +778,12 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
float tmat[3][3];
for (int r=0;r<3;r++)
for (int c=0;c<3;c++)
- tmat[r][c] = orn[c][r];
+ tmat[r][c] = (float)orn[c][r];
mat3_to_compatible_eul(blenderObject->rot, blenderObject->rot, tmat);
- insert_keyframe(NULL, &blenderObject->id, NULL, NULL, "location", -1, frameNumber, INSERTKEY_FAST);
- insert_keyframe(NULL, &blenderObject->id, NULL, NULL, "rotation_euler", -1, frameNumber, INSERTKEY_FAST);
+ insert_keyframe(NULL, &blenderObject->id, NULL, NULL, "location", -1, (float)frameNumber, INSERTKEY_FAST);
+ insert_keyframe(NULL, &blenderObject->id, NULL, NULL, "rotation_euler", -1, (float)frameNumber, INSERTKEY_FAST);
#if 0
const MT_Point3& position = gameObj->NodeGetWorldPosition();
@@ -926,29 +926,29 @@ vector<Main*> &KX_BlenderSceneConverter::GetMainDynamic()
Main* KX_BlenderSceneConverter::GetMainDynamicPath(const char *path)
{
for (vector<Main*>::iterator it=m_DynamicMaggie.begin(); !(it==m_DynamicMaggie.end()); it++)
- if(strcmp((*it)->name, path)==0)
+ if(BLI_path_cmp((*it)->name, path) == 0)
return *it;
return NULL;
}
-bool KX_BlenderSceneConverter::LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str)
+bool KX_BlenderSceneConverter::LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
{
BlendHandle *bpy_openlib = BLO_blendhandle_from_memory(data, length);
// Error checking is done in LinkBlendFile
- return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str);
+ return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str, options);
}
-bool KX_BlenderSceneConverter::LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str)
+bool KX_BlenderSceneConverter::LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
{
- BlendHandle *bpy_openlib = BLO_blendhandle_from_file( (char *)path );
+ BlendHandle *bpy_openlib = BLO_blendhandle_from_file((char *)path, NULL);
// Error checking is done in LinkBlendFile
- return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str);
+ return LinkBlendFile(bpy_openlib, path, group, scene_merge, err_str, options);
}
-bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str)
+bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options)
{
bContext *C;
Main *main_newlib; /* stored as a dynamic 'main' until we free it */
@@ -962,12 +962,15 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha
/* only scene and mesh supported right now */
if(idcode!=ID_SCE && idcode!=ID_ME &&idcode!=ID_AC) {
snprintf(err_local, sizeof(err_local), "invalid ID type given \"%s\"\n", group);
+ *err_str= err_local;
+ BLO_blendhandle_close(bpy_openlib);
return false;
}
if(GetMainDynamicPath(path)) {
snprintf(err_local, sizeof(err_local), "blend file already open \"%s\"\n", path);
*err_str= err_local;
+ BLO_blendhandle_close(bpy_openlib);
return false;
}
@@ -984,8 +987,9 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha
/* here appending/linking starts */
main_tmp = BLO_library_append_begin(C, &bpy_openlib, (char *)path);
-
- names = BLO_blendhandle_get_datablock_names( bpy_openlib, idcode);
+
+ int totnames_dummy;
+ names = BLO_blendhandle_get_datablock_names( bpy_openlib, idcode, &totnames_dummy);
int i=0;
LinkNode *n= names;
@@ -997,6 +1001,26 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha
BLI_linklist_free(names, free); /* free linklist *and* each node's data */
BLO_library_append_end(C, main_tmp, &bpy_openlib, idcode, flag);
+
+ /* now do another round of linking for Scenes so all actions are properly loaded */
+ if (idcode==ID_SCE && options & LIB_LOAD_LOAD_ACTIONS) {
+ main_tmp = BLO_library_append_begin(C, &bpy_openlib, (char *)path);
+
+ int totnames_dummy;
+ names = BLO_blendhandle_get_datablock_names( bpy_openlib, ID_AC, &totnames_dummy);
+
+ int i=0;
+ LinkNode *n= names;
+ while(n) {
+ BLO_library_append_named_part(C, main_tmp, &bpy_openlib, (char *)n->link, ID_AC, 0);
+ n= (LinkNode *)n->next;
+ i++;
+ }
+ BLI_linklist_free(names, free); /* free linklist *and* each node's data */
+
+ BLO_library_append_end(C, main_tmp, &bpy_openlib, ID_AC, flag);
+ }
+
BLO_blendhandle_close(bpy_openlib);
CTX_free(C);
@@ -1011,28 +1035,30 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha
if(idcode==ID_ME) {
/* Convert all new meshes into BGE meshes */
ID* mesh;
- KX_Scene *kx_scene= m_currentScene;
for(mesh= (ID *)main_newlib->mesh.first; mesh; mesh= (ID *)mesh->next ) {
+ if (options & LIB_LOAD_VERBOSE)
+ printf("MeshName: %s\n", mesh->name+2);
RAS_MeshObject *meshobj = BL_ConvertMesh((Mesh *)mesh, NULL, scene_merge, this);
- kx_scene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
+ scene_merge->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
}
}
else if(idcode==ID_AC) {
/* Convert all actions */
ID *action;
- KX_Scene *kx_scene= m_currentScene;
for(action= (ID *)main_newlib->action.first; action; action= (ID *)action->next) {
- printf("ActionName: %s\n", action->name);
- kx_scene->GetLogicManager()->RegisterActionName(action->name+2, action);
+ if (options & LIB_LOAD_VERBOSE)
+ printf("ActionName: %s\n", action->name+2);
+ scene_merge->GetLogicManager()->RegisterActionName(action->name+2, action);
}
}
else if(idcode==ID_SCE) {
/* Merge all new linked in scene into the existing one */
ID *scene;
for(scene= (ID *)main_newlib->scene.first; scene; scene= (ID *)scene->next ) {
- printf("SceneName: %s\n", scene->name);
+ if (options & LIB_LOAD_VERBOSE)
+ printf("SceneName: %s\n", scene->name+2);
/* merge into the base scene */
KX_Scene* other= m_ketsjiEngine->CreateScene((Scene *)scene);
@@ -1041,6 +1067,17 @@ bool KX_BlenderSceneConverter::LinkBlendFile(BlendHandle *bpy_openlib, const cha
// RemoveScene(other); // Dont run this, it frees the entire scene converter data, just delete the scene
delete other;
}
+
+ /* Now handle all the actions */
+ if (options & LIB_LOAD_LOAD_ACTIONS) {
+ ID *action;
+
+ for(action= (ID *)main_newlib->action.first; action; action= (ID *)action->next) {
+ if (options & LIB_LOAD_VERBOSE)
+ printf("ActionName: %s\n", action->name+2);
+ scene_merge->GetLogicManager()->RegisterActionName(action->name+2, action);
+ }
+ }
}
return true;
@@ -1098,6 +1135,7 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie)
{
STR_HashedString mn = meshobj->GetName();
mapStringToMeshes.remove(mn);
+ m_map_mesh_to_gamemesh.remove(CHashedPtr(meshobj->GetMesh()));
i--;
}
}
@@ -1157,7 +1195,7 @@ bool KX_BlenderSceneConverter::FreeBlendFile(struct Main *maggie)
}
/* make sure action actuators are not referencing tagged actions */
- for (int act_idx=0; act_idx<gameobj->GetActuators().size(); act_idx++)
+ for (unsigned int act_idx=0; act_idx<gameobj->GetActuators().size(); act_idx++)
{
if (gameobj->GetActuators()[act_idx]->IsType(SCA_IActuator::KX_ACT_ACTION))
{
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.h b/source/gameengine/Converter/KX_BlenderSceneConverter.h
index f99ed3aa412..741b3ea8757 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.h
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.h
@@ -147,9 +147,9 @@ public:
struct Main* GetMainDynamicPath(const char *path);
vector<struct Main*> &GetMainDynamic();
- bool LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str);
- bool LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str);
- bool LinkBlendFile(struct BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str);
+ bool LinkBlendFileMemory(void *data, int length, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
+ bool LinkBlendFilePath(const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
+ bool LinkBlendFile(struct BlendHandle *bpy_openlib, const char *path, char *group, KX_Scene *scene_merge, char **err_str, short options);
bool MergeScene(KX_Scene *to, KX_Scene *from);
RAS_MeshObject *ConvertMeshSpecial(KX_Scene* kx_scene, Main *maggie, const char *name);
bool FreeBlendFile(struct Main *maggie);
@@ -176,6 +176,13 @@ public:
#endif
// /printf("\t m_ketsjiEngine->m_scenes: %d\n", m_ketsjiEngine->CurrentScenes()->size());
}
+
+ /* LibLoad Options */
+ enum
+ {
+ LIB_LOAD_LOAD_ACTIONS = 1,
+ LIB_LOAD_VERBOSE = 2,
+ };
diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp
index b9e41d553b3..01516a24182 100644
--- a/source/gameengine/Converter/KX_ConvertActuators.cpp
+++ b/source/gameengine/Converter/KX_ConvertActuators.cpp
@@ -37,6 +37,8 @@
#pragma warning (disable : 4786)
#endif //WIN32
+#include <math.h>
+
#include "MEM_guardedalloc.h"
#include "KX_BlenderSceneConverter.h"
@@ -395,7 +397,7 @@ void BL_ConvertActuators(char* maggiename,
new KX_SoundActuator(gameobj,
snd_sound,
soundact->volume,
- exp((soundact->pitch / 12.0) * log(2.0)),
+ (float)(exp((soundact->pitch / 12.0) * log(2.0))),
is3d,
settings,
soundActuatorType);
@@ -542,8 +544,8 @@ void BL_ConvertActuators(char* maggiename,
/* convert settings... degrees in the ui become radians */
/* internally */
if (conact->type == ACT_CONST_TYPE_ORI) {
- min = (MT_2_PI * conact->minloc[0])/360.0;
- max = (MT_2_PI * conact->maxloc[0])/360.0;
+ min = (float)((MT_2_PI * conact->minloc[0])/360.0);
+ max = (float)((MT_2_PI * conact->maxloc[0])/360.0);
switch (conact->mode) {
case ACT_CONST_DIRPX:
locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIX;
@@ -642,18 +644,18 @@ void BL_ConvertActuators(char* maggiename,
break;
case ACT_CONST_ROTX:
locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTX;
- min = MT_2_PI * conact->minrot[0] / 360.0;
- max = MT_2_PI * conact->maxrot[0] / 360.0;
+ min = conact->minrot[0] * (float)MT_RADS_PER_DEG;
+ max = conact->maxrot[0] * (float)MT_RADS_PER_DEG;
break;
case ACT_CONST_ROTY:
locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTY;
- min = MT_2_PI * conact->minrot[1] / 360.0;
- max = MT_2_PI * conact->maxrot[1] / 360.0;
+ min = conact->minrot[1] * (float)MT_RADS_PER_DEG;
+ max = conact->maxrot[1] * (float)MT_RADS_PER_DEG;
break;
case ACT_CONST_ROTZ:
locrot = KX_ConstraintActuator::KX_ACT_CONSTRAINT_ROTZ;
- min = MT_2_PI * conact->minrot[2] / 360.0;
- max = MT_2_PI * conact->maxrot[2] / 360.0;
+ min = conact->minrot[2] * (float)MT_RADS_PER_DEG;
+ max = conact->maxrot[2] * (float)MT_RADS_PER_DEG;
break;
default:
; /* error */
diff --git a/source/gameengine/Converter/KX_ConvertSensors.cpp b/source/gameengine/Converter/KX_ConvertSensors.cpp
index d0984c161ab..ad6941dcdc7 100644
--- a/source/gameengine/Converter/KX_ConvertSensors.cpp
+++ b/source/gameengine/Converter/KX_ConvertSensors.cpp
@@ -438,9 +438,9 @@ void BL_ConvertSensors(struct Object* blenderobject,
float radius = blendernearsensor->dist;
PHY__Vector3 pos;
const MT_Vector3& wpos = gameobj->NodeGetWorldPosition();
- pos[0] = wpos[0];
- pos[1] = wpos[1];
- pos[2] = wpos[2];
+ pos[0] = (float)wpos[0];
+ pos[1] = (float)wpos[1];
+ pos[2] = (float)wpos[2];
pos[3] = 0.f;
bool bFindMaterial = false;
PHY_IPhysicsController* physCtrl = kxscene->GetPhysicsEnvironment()->CreateSphereController(radius,pos);
@@ -662,7 +662,7 @@ void BL_ConvertSensors(struct Object* blenderobject,
MT_Scalar largemargin = 0.0;
bool bFindMaterial = false;
- PHY_IPhysicsController* ctrl = kxscene->GetPhysicsEnvironment()->CreateConeController(coneradius,coneheight);
+ PHY_IPhysicsController* ctrl = kxscene->GetPhysicsEnvironment()->CreateConeController((float)coneradius, (float)coneheight);
gamesensor = new KX_RadarSensor(
eventmgr,
diff --git a/source/gameengine/Expressions/PyObjectPlus.cpp b/source/gameengine/Expressions/PyObjectPlus.cpp
index e205ddfda2e..c340d13b3d4 100644
--- a/source/gameengine/Expressions/PyObjectPlus.cpp
+++ b/source/gameengine/Expressions/PyObjectPlus.cpp
@@ -45,8 +45,9 @@
* http://www.python.org/doc/PyCPP.html
*
------------------------------*/
-#include <MT_assert.h>
-#include "stdlib.h"
+#include <stdlib.h>
+#include <stddef.h>
+
#include "PyObjectPlus.h"
#include "STR_String.h"
#include "MT_Vector3.h"
diff --git a/source/gameengine/Expressions/PyObjectPlus.h b/source/gameengine/Expressions/PyObjectPlus.h
index 7d06cc64ee9..157124ebc81 100644
--- a/source/gameengine/Expressions/PyObjectPlus.h
+++ b/source/gameengine/Expressions/PyObjectPlus.h
@@ -45,6 +45,7 @@
#include "STR_String.h"
#include "MT_Vector3.h"
#include "SG_QList.h"
+#include <stddef.h>
/*------------------------------
* Python defines
diff --git a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
index b32114722d4..6aee6bd19e7 100644
--- a/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
+++ b/source/gameengine/GameLogic/SCA_JoystickSensor.cpp
@@ -38,6 +38,7 @@
#include "PyObjectPlus.h"
#include <stdio.h>
+#include <stddef.h>
#include <iostream>
diff --git a/source/gameengine/GameLogic/SCA_PythonController.cpp b/source/gameengine/GameLogic/SCA_PythonController.cpp
index 4e021141f22..d0c1155de96 100644
--- a/source/gameengine/GameLogic/SCA_PythonController.cpp
+++ b/source/gameengine/GameLogic/SCA_PythonController.cpp
@@ -262,10 +262,7 @@ PyAttributeDef SCA_PythonController::Attributes[] = {
void SCA_PythonController::ErrorPrint(const char *error_msg)
{
- // didn't compile, so instead of compile, complain
- // something is wrong, tell the user what went wrong
- printf("%s - controller \"%s\":\n", error_msg, GetName().Ptr());
- //PyRun_SimpleString(m_scriptText.Ptr());
+ printf("%s - object '%s', controller '%s':\n", error_msg, GetParent()->GetName().Ptr(), GetName().Ptr());
PyErr_Print();
/* Added in 2.48a, the last_traceback can reference Objects for example, increasing
@@ -314,7 +311,7 @@ bool SCA_PythonController::Import()
function_string= strrchr(mod_path, '.');
if(function_string == NULL) {
- printf("Python module name formatting error \"%s\":\n\texpected \"SomeModule.Func\", got \"%s\"\n", GetName().Ptr(), m_scriptText.Ptr());
+ printf("Python module name formatting error in object '%s', controller '%s':\n\texpected 'SomeModule.Func', got '%s'\n", GetParent()->GetName().Ptr(), GetName().Ptr(), m_scriptText.Ptr());
return false;
}
@@ -347,13 +344,14 @@ bool SCA_PythonController::Import()
if(PyErr_Occurred())
ErrorPrint("Python controller found the module but could not access the function");
else
- printf("Python module error \"%s\":\n \"%s\" module found but function missing\n", GetName().Ptr(), m_scriptText.Ptr());
+ printf("Python module error in object '%s', controller '%s':\n '%s' module found but function missing\n", GetParent()->GetName().Ptr(), GetName().Ptr(), m_scriptText.Ptr());
return false;
}
if(!PyCallable_Check(m_function)) {
Py_DECREF(m_function);
- printf("Python module function error \"%s\":\n \"%s\" not callable\n", GetName().Ptr(), m_scriptText.Ptr());
+ m_function = NULL;
+ printf("Python module function error in object '%s', controller '%s':\n '%s' not callable\n", GetParent()->GetName().Ptr(), GetName().Ptr(), m_scriptText.Ptr());
return false;
}
@@ -371,7 +369,8 @@ bool SCA_PythonController::Import()
if(m_function_argc > 1) {
Py_DECREF(m_function);
- printf("Python module function has \"%s\":\n \"%s\" takes %d args, should be zero or 1 controller arg\n", GetName().Ptr(), m_scriptText.Ptr(), m_function_argc);
+ m_function = NULL;
+ printf("Python module function in object '%s', controller '%s':\n '%s' takes %d args, should be zero or 1 controller arg\n", GetParent()->GetName().Ptr(), GetName().Ptr(), m_scriptText.Ptr(), m_function_argc);
return false;
}
@@ -416,11 +415,7 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
excdict= PyDict_Copy(m_pythondictionary);
-#if PY_VERSION_HEX >= 0x03020000
resultobj = PyEval_EvalCode((PyObject *)m_bytecode, excdict, excdict);
-#else
- resultobj = PyEval_EvalCode((PyCodeObject *)m_bytecode, excdict, excdict);
-#endif
/* PyRun_SimpleString(m_scriptText.Ptr()); */
break;
@@ -451,22 +446,9 @@ void SCA_PythonController::Trigger(SCA_LogicManager* logicmgr)
/* Free the return value and print the error */
if (resultobj)
- {
Py_DECREF(resultobj);
- }
else
- {
- // something is wrong, tell the user what went wrong
- printf("Python script error from controller \"%s\":\n", GetName().Ptr());
- PyErr_Print();
-
- /* Added in 2.48a, the last_traceback can reference Objects for example, increasing
- * their user count. Not to mention holding references to wrapped data.
- * This is especially bad when the PyObject for the wrapped data is free'd, after blender
- * has already dealocated the pointer */
- PySys_SetObject( (char *)"last_traceback", NULL);
- PyErr_Clear(); /* just to be sure */
- }
+ ErrorPrint("Python script error");
if(excdict) /* Only for SCA_PYEXEC_SCRIPT types */
{
diff --git a/source/gameengine/GamePlayer/common/CMakeLists.txt b/source/gameengine/GamePlayer/common/CMakeLists.txt
index 0bd8a0dd9a3..604dd9296a1 100644
--- a/source/gameengine/GamePlayer/common/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/common/CMakeLists.txt
@@ -51,7 +51,7 @@ set(INC
../../../../source/gameengine/GamePlayer/ghost
../../../../source/blender/blenloader
../../../../source/blender/gpu
- ../../../../extern/glew/include
+ ${GLEW_INCLUDE_PATH}
${PYTHON_INCLUDE_DIRS}
${PNG_INCLUDE_DIR}
${ZLIB_INCLUDE_DIRS}
diff --git a/source/gameengine/GamePlayer/ghost/CMakeLists.txt b/source/gameengine/GamePlayer/ghost/CMakeLists.txt
index dc137861745..a88de69b272 100644
--- a/source/gameengine/GamePlayer/ghost/CMakeLists.txt
+++ b/source/gameengine/GamePlayer/ghost/CMakeLists.txt
@@ -53,7 +53,7 @@ set(INC
../../../../source/gameengine/GamePlayer/common
../../../../source/blender/blenloader
../../../../source/blender/gpu
- ../../../../extern/glew/include
+ ${GLEW_INCLUDE_PATH}
${PYTHON_INCLUDE_DIRS}
)
diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
index 767ccff4259..968d6caeb1c 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
@@ -115,6 +115,12 @@ const int kMinWindowHeight = 100;
char bprogname[FILE_MAX];
+static void mem_error_cb(const char *errorStr)
+{
+ fprintf(stderr, "%s", errorStr);
+ fflush(stderr);
+}
+
#ifdef WIN32
typedef enum
{
@@ -834,9 +840,10 @@ int main(int argc, char** argv)
// GPG_Application app (system, maggie, startscenename);
app.SetGameEngineData(maggie, scene, argc, argv); /* this argc cant be argc_py_clamped, since python uses it */
-
BLI_strncpy(pathname, maggie->name, sizeof(pathname));
- BLI_strncpy(G.main->name, maggie->name, sizeof(G.main->name));
+ if(G.main != maggie) {
+ BLI_strncpy(G.main->name, maggie->name, sizeof(G.main->name));
+ }
#ifdef WITH_PYTHON
setGamePythonPath(G.main->name);
#endif
@@ -932,6 +939,10 @@ int main(int argc, char** argv)
}
app.StopGameEngine();
+ /* 'app' is freed automatic when out of scope.
+ * removal is needed else the system will free an already freed value */
+ system->removeEventConsumer(&app);
+
BLO_blendfiledata_free(bfd);
}
} while (exitcode == KX_EXIT_REQUEST_RESTART_GAME || exitcode == KX_EXIT_REQUEST_START_OTHER_GAME);
@@ -956,6 +967,13 @@ int main(int argc, char** argv)
SYS_DeleteSystem(syshandle);
+ int totblock= MEM_get_memory_blocks_in_use();
+ if(totblock!=0) {
+ printf("Error Totblock: %d\n",totblock);
+ MEM_set_error_callback(mem_error_cb);
+ MEM_printmemlist();
+ }
+
return error ? -1 : 0;
}
diff --git a/source/gameengine/Ketsji/CMakeLists.txt b/source/gameengine/Ketsji/CMakeLists.txt
index 67ac8a02255..d5ea39f5b35 100644
--- a/source/gameengine/Ketsji/CMakeLists.txt
+++ b/source/gameengine/Ketsji/CMakeLists.txt
@@ -52,7 +52,7 @@ set(INC
../../../intern/audaspace/intern
../../../source/blender/blenloader
../../../source/blender/gpu
- ../../../extern/glew/include
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
index 74f410f05f9..fde01961fd5 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
@@ -524,4 +524,15 @@ bool KX_BulletPhysicsController::Update(double time)
// return false;
}
+
+const char* KX_BulletPhysicsController::getName()
+{
+ if (m_pObject)
+ {
+ KX_GameObject* gameobj = (KX_GameObject*) m_pObject->GetSGClientObject();
+ return gameobj->GetName();
+ }
+ return 0;
+}
+
#endif // USE_BULLET
diff --git a/source/gameengine/Ketsji/KX_BulletPhysicsController.h b/source/gameengine/Ketsji/KX_BulletPhysicsController.h
index d46caca49f1..c0ff143919d 100644
--- a/source/gameengine/Ketsji/KX_BulletPhysicsController.h
+++ b/source/gameengine/Ketsji/KX_BulletPhysicsController.h
@@ -80,6 +80,8 @@ public:
virtual bool Update(double time);
void* GetUserData() { return m_userdata;}
+ virtual const char* getName();
+
void
SetOption(
int option,
diff --git a/source/gameengine/Ketsji/KX_Camera.cpp b/source/gameengine/Ketsji/KX_Camera.cpp
index f9368959c92..98ea25c135a 100644
--- a/source/gameengine/Ketsji/KX_Camera.cpp
+++ b/source/gameengine/Ketsji/KX_Camera.cpp
@@ -387,7 +387,7 @@ int KX_Camera::BoxInsideFrustum(const MT_Point3 *box)
for( unsigned int p = 0; p < 6 ; p++ )
{
unsigned int behindCount = 0;
- // 8 box verticies.
+ // 8 box vertices.
for (unsigned int v = 0; v < 8 ; v++)
{
if (m_planes[p][0]*box[v][0] + m_planes[p][1]*box[v][1] + m_planes[p][2]*box[v][2] + m_planes[p][3] < 0.)
@@ -403,7 +403,7 @@ int KX_Camera::BoxInsideFrustum(const MT_Point3 *box)
insideCount++;
}
- // All box verticies are on the front side of all frustum planes.
+ // All box vertices are on the front side of all frustum planes.
if (insideCount == 6)
return INSIDE;
diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp
index 5ca780bb319..85d09d9f5d5 100644
--- a/source/gameengine/Ketsji/KX_GameObject.cpp
+++ b/source/gameengine/Ketsji/KX_GameObject.cpp
@@ -157,7 +157,8 @@ KX_GameObject::~KX_GameObject()
#ifdef WITH_PYTHON
if (m_attr_dict) {
PyDict_Clear(m_attr_dict); /* incase of circular refs or other weired cases */
- Py_DECREF(m_attr_dict);
+ /* Py_CLEAR: Py_DECREF's and NULL's */
+ Py_CLEAR(m_attr_dict);
}
#endif // WITH_PYTHON
}
@@ -1262,16 +1263,16 @@ static int mathutils_kxgameob_generic_check(BaseMathObject *bmo)
{
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(bmo->cb_user);
if(self==NULL)
- return 0;
+ return -1;
- return 1;
+ return 0;
}
static int mathutils_kxgameob_vector_get(BaseMathObject *bmo, int subtype)
{
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(bmo->cb_user);
if(self==NULL)
- return 0;
+ return -1;
#define PHYS_ERR(attr) PyErr_SetString(PyExc_AttributeError, "KX_GameObject." attr ", is missing a physics controller")
@@ -1289,26 +1290,26 @@ static int mathutils_kxgameob_vector_get(BaseMathObject *bmo, int subtype)
self->NodeGetWorldScaling().getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_INERTIA_LOCAL:
- if(!self->GetPhysicsController()) return PHYS_ERR("localInertia"), 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("localInertia"), -1;
self->GetPhysicsController()->GetLocalInertia().getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_OBJECT_COLOR:
self->GetObjectColor().getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_LINVEL_LOCAL:
- if(!self->GetPhysicsController()) return PHYS_ERR("localLinearVelocity"), 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("localLinearVelocity"), -1;
self->GetLinearVelocity(true).getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_LINVEL_GLOBAL:
- if(!self->GetPhysicsController()) return PHYS_ERR("worldLinearVelocity"), 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("worldLinearVelocity"), -1;
self->GetLinearVelocity(false).getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_ANGVEL_LOCAL:
- if(!self->GetPhysicsController()) return PHYS_ERR("localLinearVelocity"), 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("localLinearVelocity"), -1;
self->GetAngularVelocity(true).getValue(bmo->data);
break;
case MATHUTILS_VEC_CB_ANGVEL_GLOBAL:
- if(!self->GetPhysicsController()) return PHYS_ERR("worldLinearVelocity"), 0;
+ if(!self->GetPhysicsController()) return PHYS_ERR("worldLinearVelocity"), -1;
self->GetAngularVelocity(false).getValue(bmo->data);
break;
@@ -1316,14 +1317,14 @@ static int mathutils_kxgameob_vector_get(BaseMathObject *bmo, int subtype)
#undef PHYS_ERR
- return 1;
+ return 0;
}
static int mathutils_kxgameob_vector_set(BaseMathObject *bmo, int subtype)
{
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(bmo->cb_user);
if(self==NULL)
- return 0;
+ return -1;
switch(subtype) {
case MATHUTILS_VEC_CB_POS_LOCAL:
@@ -1340,7 +1341,7 @@ static int mathutils_kxgameob_vector_set(BaseMathObject *bmo, int subtype)
break;
case MATHUTILS_VEC_CB_SCALE_GLOBAL:
PyErr_SetString(PyExc_AttributeError, "KX_GameObject.worldScale is read-only");
- return 0;
+ return -1;
case MATHUTILS_VEC_CB_INERTIA_LOCAL:
/* read only */
break;
@@ -1361,15 +1362,15 @@ static int mathutils_kxgameob_vector_set(BaseMathObject *bmo, int subtype)
break;
}
- return 1;
+ return 0;
}
static int mathutils_kxgameob_vector_get_index(BaseMathObject *bmo, int subtype, int index)
{
/* lazy, avoid repeteing the case statement */
- if(!mathutils_kxgameob_vector_get(bmo, subtype))
- return 0;
- return 1;
+ if(mathutils_kxgameob_vector_get(bmo, subtype) == -1)
+ return -1;
+ return 0;
}
static int mathutils_kxgameob_vector_set_index(BaseMathObject *bmo, int subtype, int index)
@@ -1377,8 +1378,8 @@ static int mathutils_kxgameob_vector_set_index(BaseMathObject *bmo, int subtype,
float f= bmo->data[index];
/* lazy, avoid repeteing the case statement */
- if(!mathutils_kxgameob_vector_get(bmo, subtype))
- return 0;
+ if(mathutils_kxgameob_vector_get(bmo, subtype) == -1)
+ return -1;
bmo->data[index]= f;
return mathutils_kxgameob_vector_set(bmo, subtype);
@@ -1402,7 +1403,7 @@ static int mathutils_kxgameob_matrix_get(BaseMathObject *bmo, int subtype)
{
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(bmo->cb_user);
if(self==NULL)
- return 0;
+ return -1;
switch(subtype) {
case MATHUTILS_MAT_CB_ORI_LOCAL:
@@ -1413,7 +1414,7 @@ static int mathutils_kxgameob_matrix_get(BaseMathObject *bmo, int subtype)
break;
}
- return 1;
+ return 0;
}
@@ -1421,7 +1422,7 @@ static int mathutils_kxgameob_matrix_set(BaseMathObject *bmo, int subtype)
{
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(bmo->cb_user);
if(self==NULL)
- return 0;
+ return -1;
MT_Matrix3x3 mat3x3;
switch(subtype) {
@@ -1437,7 +1438,7 @@ static int mathutils_kxgameob_matrix_set(BaseMathObject *bmo, int subtype)
break;
}
- return 1;
+ return 0;
}
Mathutils_Callback mathutils_kxgameob_matrix_cb = {
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index 88e178dda19..1b35219a36d 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -38,6 +38,7 @@
#endif //WIN32
#include <iostream>
+#include <stdio.h>
#include "KX_KetsjiEngine.h"
@@ -77,7 +78,6 @@
#include "KX_TimeCategoryLogger.h"
#include "RAS_FramingManager.h"
-#include "stdio.h"
#include "DNA_world_types.h"
#include "DNA_scene_types.h"
diff --git a/source/gameengine/Ketsji/KX_ObjectActuator.cpp b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
index 83d8f4b883b..8c3e25cf3e2 100644
--- a/source/gameengine/Ketsji/KX_ObjectActuator.cpp
+++ b/source/gameengine/Ketsji/KX_ObjectActuator.cpp
@@ -392,16 +392,16 @@ static int mathutils_obactu_generic_check(BaseMathObject *bmo)
{
KX_ObjectActuator* self= static_cast<KX_ObjectActuator*>BGE_PROXY_REF(bmo->cb_user);
if(self==NULL)
- return 0;
+ return -1;
- return 1;
+ return 0;
}
static int mathutils_obactu_vector_get(BaseMathObject *bmo, int subtype)
{
KX_ObjectActuator* self= static_cast<KX_ObjectActuator*>BGE_PROXY_REF(bmo->cb_user);
if(self==NULL)
- return 0;
+ return -1;
switch(subtype) {
case MATHUTILS_VEC_CB_LINV:
@@ -412,14 +412,14 @@ static int mathutils_obactu_vector_get(BaseMathObject *bmo, int subtype)
break;
}
- return 1;
+ return 0;
}
static int mathutils_obactu_vector_set(BaseMathObject *bmo, int subtype)
{
KX_ObjectActuator* self= static_cast<KX_ObjectActuator*>BGE_PROXY_REF(bmo->cb_user);
if(self==NULL)
- return 0;
+ return -1;
switch(subtype) {
case MATHUTILS_VEC_CB_LINV:
@@ -430,15 +430,15 @@ static int mathutils_obactu_vector_set(BaseMathObject *bmo, int subtype)
break;
}
- return 1;
+ return 0;
}
static int mathutils_obactu_vector_get_index(BaseMathObject *bmo, int subtype, int index)
{
/* lazy, avoid repeteing the case statement */
- if(!mathutils_obactu_vector_get(bmo, subtype))
- return 0;
- return 1;
+ if(mathutils_obactu_vector_get(bmo, subtype) == -1)
+ return -1;
+ return 0;
}
static int mathutils_obactu_vector_set_index(BaseMathObject *bmo, int subtype, int index)
@@ -446,8 +446,8 @@ static int mathutils_obactu_vector_set_index(BaseMathObject *bmo, int subtype, i
float f= bmo->data[index];
/* lazy, avoid repeteing the case statement */
- if(!mathutils_obactu_vector_get(bmo, subtype))
- return 0;
+ if(mathutils_obactu_vector_get(bmo, subtype) == -1)
+ return -1;
bmo->data[index]= f;
return mathutils_obactu_vector_set(bmo, subtype);
diff --git a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
index dfaf079f36f..9d0597051ad 100644
--- a/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
+++ b/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
@@ -172,7 +172,7 @@ void KX_PolygonMaterial::DefaultActivate(RAS_IRasterizer* rasty, TCachingInfo& c
cachingInfo = GetCachingInfo();
- if ((m_drawingmode & 4)&& (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED))
+ if ((m_drawingmode & RAS_IRasterizer::KX_TEX)&& (rasty->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED))
{
Image *ima = (Image*)m_tface->tpage;
GPU_update_image_time(ima, rasty->GetTime());
diff --git a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
index f08fc14c29c..bf288e1f1ad 100644
--- a/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
+++ b/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
@@ -405,6 +405,7 @@ static PyObject* gPyCreateConstraint(PyObject* self,
PyObject* args,
PyObject* kwds)
{
+ /* FIXME - physicsid is an int being cast to a pointer, should at least use PyCapsule */
int physicsid=0,physicsid2 = 0,constrainttype=0,extrainfo=0;
int len = PyTuple_Size(args);
int success = 1;
@@ -542,6 +543,18 @@ static PyObject* gPyRemoveConstraint(PyObject* self,
Py_RETURN_NONE;
}
+static PyObject* gPyExportBulletFile(PyObject*, PyObject* args)
+{
+ char* filename;
+ if (!PyArg_ParseTuple(args,"s:exportBulletFile",&filename))
+ return NULL;
+
+ if (PHY_GetActiveEnvironment())
+ {
+ PHY_GetActiveEnvironment()->exportFile(filename);
+ }
+ Py_RETURN_NONE;
+}
static struct PyMethodDef physicsconstraints_methods[] = {
{"setGravity",(PyCFunction) gPySetGravity,
@@ -594,6 +607,9 @@ static struct PyMethodDef physicsconstraints_methods[] = {
{"getAppliedImpulse",(PyCFunction) gPyGetAppliedImpulse,
METH_VARARGS, (const char *)gPyGetAppliedImpulse__doc__},
+ {"exportBulletFile",(PyCFunction)gPyExportBulletFile,
+ METH_VARARGS, "export a .bullet file"},
+
//sentinel
{ NULL, (PyCFunction) NULL, 0, NULL }
@@ -664,5 +680,7 @@ PHY_IPhysicsEnvironment* PHY_GetActiveEnvironment()
return g_CurrentActivePhysicsEnvironment;
}
+
+
#endif // WITH_PYTHON
diff --git a/source/gameengine/Ketsji/KX_PyMath.h b/source/gameengine/Ketsji/KX_PyMath.h
index d7ea63c9880..9b198f85664 100644
--- a/source/gameengine/Ketsji/KX_PyMath.h
+++ b/source/gameengine/Ketsji/KX_PyMath.h
@@ -114,7 +114,7 @@ bool PyVecTo(PyObject* pyval, T& vec)
if(VectorObject_Check(pyval)) {
VectorObject *pyvec= (VectorObject *)pyval;
- if(!BaseMath_ReadCallback(pyvec)) {
+ if(BaseMath_ReadCallback(pyvec) == -1) {
return false; /* exception raised */
}
if (pyvec->size != Size(vec)) {
@@ -126,7 +126,7 @@ bool PyVecTo(PyObject* pyval, T& vec)
}
else if(QuaternionObject_Check(pyval)) {
QuaternionObject *pyquat= (QuaternionObject *)pyval;
- if(!BaseMath_ReadCallback(pyquat)) {
+ if(BaseMath_ReadCallback(pyquat) == -1) {
return false; /* exception raised */
}
if (4 != Size(vec)) {
@@ -139,7 +139,7 @@ bool PyVecTo(PyObject* pyval, T& vec)
}
else if(EulerObject_Check(pyval)) {
EulerObject *pyeul= (EulerObject *)pyval;
- if(!BaseMath_ReadCallback(pyeul)) {
+ if(BaseMath_ReadCallback(pyeul) == -1) {
return false; /* exception raised */
}
if (3 != Size(vec)) {
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 60ee86c52c4..ba698d79fdd 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -638,7 +638,7 @@ static PyObject *pyPrintExt(PyObject *,PyObject *,PyObject *)
Py_RETURN_NONE;
}
-static PyObject *gLibLoad(PyObject*, PyObject* args)
+static PyObject *gLibLoad(PyObject*, PyObject* args, PyObject* kwds)
{
KX_Scene *kx_scene= gp_KetsjiScene;
char *path;
@@ -646,20 +646,37 @@ static PyObject *gLibLoad(PyObject*, PyObject* args)
Py_buffer py_buffer;
py_buffer.buf = NULL;
char *err_str= NULL;
+
+ short options=0;
+ int load_actions=0, verbose=0;
+
+ static const char *kwlist[] = {"path", "group", "buffer", "load_actions", "verbose", NULL};
- if (!PyArg_ParseTuple(args,"ss|y*:LibLoad",&path, &group, &py_buffer))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss|y*ii:LibLoad", const_cast<char**>(kwlist),
+ &path, &group, &py_buffer, &load_actions, &verbose))
return NULL;
+ /* setup options */
+ if (load_actions != 0)
+ options |= KX_BlenderSceneConverter::LIB_LOAD_LOAD_ACTIONS;
+ if (verbose != 0)
+ options |= KX_BlenderSceneConverter::LIB_LOAD_VERBOSE;
+
if (!py_buffer.buf)
{
- if(kx_scene->GetSceneConverter()->LinkBlendFilePath(path, group, kx_scene, &err_str)) {
+ char abs_path[FILE_MAX];
+ // Make the path absolute
+ BLI_strncpy(abs_path, path, sizeof(abs_path));
+ BLI_path_abs(abs_path, gp_GamePythonPath);
+
+ if(kx_scene->GetSceneConverter()->LinkBlendFilePath(abs_path, group, kx_scene, &err_str, options)) {
Py_RETURN_TRUE;
}
}
else
{
- if(kx_scene->GetSceneConverter()->LinkBlendFileMemory(py_buffer.buf, py_buffer.len, path, group, kx_scene, &err_str)) {
+ if(kx_scene->GetSceneConverter()->LinkBlendFileMemory(py_buffer.buf, py_buffer.len, path, group, kx_scene, &err_str, options)) {
PyBuffer_Release(&py_buffer);
Py_RETURN_TRUE;
}
@@ -793,7 +810,7 @@ static struct PyMethodDef game_methods[] = {
{"PrintMemInfo", (PyCFunction)pyPrintStats, METH_NOARGS, (const char *)"Print engine stastics"},
/* library functions */
- {"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS, (const char *)""},
+ {"LibLoad", (PyCFunction)gLibLoad, METH_VARARGS|METH_KEYWORDS, (const char *)""},
{"LibNew", (PyCFunction)gLibNew, METH_VARARGS, (const char *)""},
{"LibFree", (PyCFunction)gLibFree, METH_VARARGS, (const char *)""},
{"LibList", (PyCFunction)gLibList, METH_VARARGS, (const char *)""},
@@ -926,12 +943,12 @@ static PyObject* gPySetBackgroundColor(PyObject*, PyObject* value)
if (gp_Canvas)
{
- gp_Rasterizer->SetBackColor(vec[0], vec[1], vec[2], vec[3]);
+ gp_Rasterizer->SetBackColor((float)vec[0], (float)vec[1], (float)vec[2], (float)vec[3]);
}
KX_WorldInfo *wi = gp_KetsjiScene->GetWorldInfo();
if (wi->hasWorld())
- wi->setBackColor(vec[0], vec[1], vec[2]);
+ wi->setBackColor((float)vec[0], (float)vec[1], (float)vec[2]);
Py_RETURN_NONE;
}
@@ -949,7 +966,7 @@ static PyObject* gPySetMistColor(PyObject*, PyObject* value)
PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setMistColor(color), Rasterizer not available");
return NULL;
}
- gp_Rasterizer->SetFogColor(vec[0], vec[1], vec[2]);
+ gp_Rasterizer->SetFogColor((float)vec[0], (float)vec[1], (float)vec[2]);
Py_RETURN_NONE;
}
@@ -1014,7 +1031,7 @@ static PyObject* gPySetAmbientColor(PyObject*, PyObject* value)
PyErr_SetString(PyExc_RuntimeError, "Rasterizer.setAmbientColor(color), Rasterizer not available");
return NULL;
}
- gp_Rasterizer->SetAmbientColor(vec[0], vec[1], vec[2]);
+ gp_Rasterizer->SetAmbientColor((float)vec[0], (float)vec[1], (float)vec[2]);
Py_RETURN_NONE;
}
@@ -1620,176 +1637,6 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack
return m;
}
-// Python Sandbox code
-// override builtin functions import() and open()
-
-
-PyObject *KXpy_open(PyObject *self, PyObject *args) {
- PyErr_SetString(PyExc_RuntimeError, "Sandbox: open() function disabled!\nGame Scripts should not use this function.");
- return NULL;
-}
-
-PyObject *KXpy_file(PyObject *self, PyObject *args) {
- PyErr_SetString(PyExc_RuntimeError, "Sandbox: file() function disabled!\nGame Scripts should not use this function.");
- return NULL;
-}
-
-PyObject *KXpy_execfile(PyObject *self, PyObject *args) {
- PyErr_SetString(PyExc_RuntimeError, "Sandbox: execfile() function disabled!\nGame Scripts should not use this function.");
- return NULL;
-}
-
-PyObject *KXpy_compile(PyObject *self, PyObject *args) {
- PyErr_SetString(PyExc_RuntimeError, "Sandbox: compile() function disabled!\nGame Scripts should not use this function.");
- return NULL;
-}
-
-PyObject *KXpy_import(PyObject *self, PyObject *args)
-{
- char *name;
- int found;
- PyObject *globals = NULL;
- PyObject *locals = NULL;
- PyObject *fromlist = NULL;
- PyObject *l, *m, *n;
- int level; /* not used yet */
-
- if (!PyArg_ParseTuple(args, "s|OOOi:m_import",
- &name, &globals, &locals, &fromlist, &level))
- return NULL;
-
- /* check for builtin modules */
- m = PyImport_AddModule("sys");
- l = PyObject_GetAttrString(m, "builtin_module_names");
- n = PyUnicode_FromString(name);
-
- if (PySequence_Contains(l, n)) {
- return PyImport_ImportModuleEx(name, globals, locals, fromlist);
- }
-
- /* quick hack for GamePython modules
- TODO: register builtin modules properly by ExtendInittab */
- if (!strcmp(name, "GameLogic") || !strcmp(name, "GameKeys") || !strcmp(name, "PhysicsConstraints") ||
- !strcmp(name, "Rasterizer") || !strcmp(name, "mathutils") || !strcmp(name, "bgl") || !strcmp(name, "geometry")) {
- return PyImport_ImportModuleEx(name, globals, locals, fromlist);
- }
-
- /* Import blender texts as python modules */
- m= bpy_text_import_name(name, &found);
- if (m)
- return m;
-
- if(found==0) /* if its found but could not import then it has its own error */
- PyErr_Format(PyExc_ImportError, "Import of external Module %.20s not allowed.", name);
-
- return NULL;
-
-}
-
-PyObject *KXpy_reload(PyObject *self, PyObject *args) {
-
- /* Used to be sandboxed, bettet to allow importing of internal text only */
-#if 0
- PyErr_SetString(PyExc_RuntimeError, "Sandbox: reload() function disabled!\nGame Scripts should not use this function.");
- return NULL;
-#endif
- int found;
- PyObject *module = NULL;
- PyObject *newmodule = NULL;
-
- /* check for a module arg */
- if( !PyArg_ParseTuple( args, "O:bpy_reload_meth", &module ) )
- return NULL;
-
- newmodule= bpy_text_reimport( module, &found );
- if (newmodule)
- return newmodule;
-
- if (found==0) /* if its found but could not import then it has its own error */
- PyErr_SetString(PyExc_ImportError, "reload(module): failed to reload from blenders internal text");
-
- return newmodule;
-}
-
-/* override python file type functions */
-#if 0
-static int
-file_init(PyObject *self, PyObject *args, PyObject *kwds)
-{
- KXpy_file(NULL, NULL);
- return -1;
-}
-
-static PyObject *
-file_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
- return KXpy_file(NULL, NULL);
-}
-#endif
-
-static PyMethodDef meth_open[] = {{ "open", KXpy_open, METH_VARARGS, "(disabled)"}};
-static PyMethodDef meth_reload[] = {{ "reload", KXpy_reload, METH_VARARGS, "(disabled)"}};
-static PyMethodDef meth_file[] = {{ "file", KXpy_file, METH_VARARGS, "(disabled)"}};
-static PyMethodDef meth_execfile[] = {{ "execfile", KXpy_execfile, METH_VARARGS, "(disabled)"}};
-static PyMethodDef meth_compile[] = {{ "compile", KXpy_compile, METH_VARARGS, "(disabled)"}};
-
-static PyMethodDef meth_import[] = {{ "import", KXpy_import, METH_VARARGS, "our own import"}};
-
-//static PyObject *g_oldopen = 0;
-//static PyObject *g_oldimport = 0;
-//static int g_security = 0;
-
-static void setSandbox(TPythonSecurityLevel level)
-{
- PyObject *m = PyImport_AddModule("__builtin__");
- PyObject *d = PyModule_GetDict(m);
- PyObject *item;
- switch (level) {
- case psl_Highest:
- //if (!g_security) {
- //g_oldopen = PyDict_GetItemString(d, "open");
-
- // functions we cant trust
- PyDict_SetItemString(d, "open", item=PyCFunction_New(meth_open, NULL)); Py_DECREF(item);
- PyDict_SetItemString(d, "reload", item=PyCFunction_New(meth_reload, NULL)); Py_DECREF(item);
- PyDict_SetItemString(d, "file", item=PyCFunction_New(meth_file, NULL)); Py_DECREF(item);
- PyDict_SetItemString(d, "execfile", item=PyCFunction_New(meth_execfile, NULL)); Py_DECREF(item);
- PyDict_SetItemString(d, "compile", item=PyCFunction_New(meth_compile, NULL)); Py_DECREF(item);
-
- // our own import
- PyDict_SetItemString(d, "__import__", PyCFunction_New(meth_import, NULL));
- //g_security = level;
-
- // Overiding file dosnt stop it being accessed if your sneaky
- // f = [ t for t in (1).__class__.__mro__[-1].__subclasses__() if t.__name__ == 'file'][0]('/some_file.txt', 'w')
- // f.write('...')
- // so overwrite the file types functions. be very careful here still, since python uses python.
- // ps - python devs frown deeply upon this.
-
- /* this could mess up pythons internals, if we are serious about sandboxing
- * issues like the one above need to be solved, possibly modify __subclasses__ is safer? */
-#if 0
- PyFile_Type.tp_init = file_init;
- PyFile_Type.tp_new = file_new;
-#endif
- //}
- break;
- /*
- case psl_Lowest:
- if (g_security) {
- PyDict_SetItemString(d, "open", g_oldopen);
- PyDict_SetItemString(d, "__import__", g_oldimport);
- g_security = level;
- }
- */
- default:
- /* Allow importing internal text, from bpy_internal_import.py */
- PyDict_SetItemString(d, "reload", item=PyCFunction_New(&bpy_reload_meth, NULL)); Py_DECREF(item);
- PyDict_SetItemString(d, "__import__", item=PyCFunction_New(&bpy_import_meth, NULL)); Py_DECREF(item);
- break;
- }
-}
-
/* Explanation of
*
* - backupPySysObjects() : stores sys.path in gp_OrigPythonSysPath
@@ -1900,6 +1747,15 @@ static void restorePySysObjects(void)
// PyObject_Print(sys_path, stderr, 0);
}
+// Copied from bpy_interface.c
+static struct _inittab bge_internal_modules[]= {
+ {(char *)"mathutils", BPyInit_mathutils},
+ {(char *)"bgl", BPyInit_bgl},
+ {(char *)"blf", BPyInit_blf},
+ {(char *)"aud", AUD_initPython},
+ {NULL, NULL}
+};
+
/**
* Python is not initialised.
*/
@@ -1919,6 +1775,10 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur
#endif
Py_NoSiteFlag=1;
Py_FrozenFlag=1;
+
+ /* must run before python initializes */
+ PyImport_ExtendInittab(bge_internal_modules);
+
Py_Initialize();
if(argv && first_time) { /* browser plugins dont currently set this */
@@ -1933,8 +1793,15 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur
PySys_SetObject("argv", py_argv);
Py_DECREF(py_argv);
}
-
- setSandbox(level);
+
+ bpy_import_init(PyEval_GetBuiltins());
+
+ /* mathutils types are used by the BGE even if we dont import them */
+ {
+ PyObject *mod= PyImport_ImportModuleLevel((char *)"mathutils", NULL, NULL, NULL, 0);
+ Py_DECREF(mod);
+ }
+
initPyTypes();
bpy_import_main_set(maggie);
@@ -1979,7 +1846,6 @@ PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLev
Py_NoSiteFlag=1;
Py_FrozenFlag=1;
- setSandbox(level);
initPyTypes();
bpy_import_main_set(maggie);
@@ -2028,11 +1894,6 @@ void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main *
initGameKeys();
initPythonConstraintBinding();
- initMathutils();
- initGeometry();
- initBGL();
- initBLF();
- AUD_initPython();
initVideoTexture();
/* could be done a lot more nicely, but for now a quick way to get bge.* working */
@@ -2341,26 +2202,6 @@ PyObject* initGameKeys()
return d;
}
-PyObject* initMathutils()
-{
- return BPyInit_mathutils();
-}
-
-PyObject* initGeometry()
-{
- return BPyInit_mathutils_geometry();
-}
-
-PyObject* initBGL()
-{
- return BPyInit_bgl();
-}
-
-PyObject* initBLF()
-{
- return BPyInit_blf();
-}
-
// utility function for loading and saving the globalDict
int saveGamePythonConfig( char **marshal_buffer)
{
diff --git a/source/gameengine/Ketsji/KX_PythonInit.h b/source/gameengine/Ketsji/KX_PythonInit.h
index f062aa2d661..1b172c35eff 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.h
+++ b/source/gameengine/Ketsji/KX_PythonInit.h
@@ -49,10 +49,6 @@ PyObject* initGameLogic(class KX_KetsjiEngine *engine, class KX_Scene* ketsjisce
PyObject* initGameKeys();
PyObject* initRasterizer(class RAS_IRasterizer* rasty,class RAS_ICanvas* canvas);
PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecurityLevel level, struct Main *maggie, int argc, char** argv);
-PyObject* initMathutils();
-PyObject* initGeometry();
-PyObject* initBGL();
-PyObject* initBLF();
PyObject* initVideoTexture(void);
void exitGamePlayerPythonScripting();
PyObject* initGamePythonScripting(const STR_String& progname, TPythonSecurityLevel level, struct Main *maggie);
diff --git a/source/gameengine/Ketsji/KX_PythonSeq.cpp b/source/gameengine/Ketsji/KX_PythonSeq.cpp
index d60b5a7dc74..04a53fbb493 100644
--- a/source/gameengine/Ketsji/KX_PythonSeq.cpp
+++ b/source/gameengine/Ketsji/KX_PythonSeq.cpp
@@ -45,18 +45,30 @@
PyObject *KX_PythonSeq_CreatePyObject( PyObject *base, short type )
{
- KX_PythonSeq *seq = PyObject_NEW( KX_PythonSeq, &KX_PythonSeq_Type);
+ KX_PythonSeq *seq = PyObject_GC_New(KX_PythonSeq, &KX_PythonSeq_Type);
seq->base = base;
Py_INCREF(base); /* so we can always access to check if its valid */
seq->type = type;
seq->iter = -1; /* init */
return (PyObject *)seq;
- }
-
- static void KX_PythonSeq_dealloc( KX_PythonSeq * self )
+}
+
+static int KX_PythonSeq_traverse(KX_PythonSeq *self, visitproc visit, void *arg)
+{
+ Py_VISIT(self->base);
+ return 0;
+}
+
+static int KX_PythonSeq_clear(KX_PythonSeq *self)
+{
+ Py_CLEAR(self->base);
+ return 0;
+}
+
+static void KX_PythonSeq_dealloc(KX_PythonSeq * self)
{
- Py_DECREF(self->base);
- PyObject_DEL( self );
+ KX_PythonSeq_clear(self);
+ PyObject_GC_Del(self);
}
static Py_ssize_t KX_PythonSeq_len( PyObject * self )
@@ -470,15 +482,15 @@ PyTypeObject KX_PythonSeq_Type = {
NULL, /* PyBufferProcs *tp_as_buffer; */
/*** Flags to define presence of optional/expanded features ***/
- Py_TPFLAGS_DEFAULT, /* long tp_flags; */
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* long tp_flags; */
NULL, /* char *tp_doc; Documentation string */
/*** Assigned meaning in release 2.0 ***/
/* call function for all accessible objects */
- NULL, /* traverseproc tp_traverse; */
+ (traverseproc)KX_PythonSeq_traverse, /* traverseproc tp_traverse; */
/* delete references to contained objects */
- NULL, /* inquiry tp_clear; */
+ (inquiry)KX_PythonSeq_clear, /* inquiry tp_clear; */
/*** Assigned meaning in release 2.1 ***/
/*** rich comparisons ***/
diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp
index 0a8c3039ae3..4a379f46440 100644
--- a/source/gameengine/Ketsji/KX_Scene.cpp
+++ b/source/gameengine/Ketsji/KX_Scene.cpp
@@ -269,10 +269,12 @@ KX_Scene::~KX_Scene()
#ifdef WITH_PYTHON
PyDict_Clear(m_attr_dict);
- Py_DECREF(m_attr_dict);
+ /* Py_CLEAR: Py_DECREF's and NULL's */
+ Py_CLEAR(m_attr_dict);
- Py_XDECREF(m_draw_call_pre);
- Py_XDECREF(m_draw_call_post);
+ /* these may be NULL but the macro checks */
+ Py_CLEAR(m_draw_call_pre);
+ Py_CLEAR(m_draw_call_post);
#endif
}
diff --git a/source/gameengine/Physics/Bullet/CMakeLists.txt b/source/gameengine/Physics/Bullet/CMakeLists.txt
index c677685de49..cc469c3772a 100644
--- a/source/gameengine/Physics/Bullet/CMakeLists.txt
+++ b/source/gameengine/Physics/Bullet/CMakeLists.txt
@@ -31,7 +31,6 @@ set(INC
.
../common
../../../../extern/bullet2/src
- ../../../../extern/glew/include
../../../../intern/moto/include
../../../../intern/guardedalloc
../../../kernel/gen_system
@@ -44,6 +43,7 @@ set(INC
../../../../source/blender/makesdna
../../../../source/blender/blenlib
../../../../source/blender/blenkernel
+ ${GLEW_INCLUDE_PATH}
${PYTHON_INCLUDE_DIRS}
)
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.h b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
index dc7a88e8db1..00ecc64c41e 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.h
@@ -577,6 +577,10 @@ protected:
return m_parentCtrl;
}
+ virtual const char* getName()
+ {
+ return 0;
+ }
#ifdef WITH_CXX_GUARDEDALLOC
public:
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index 93f1d0962d7..c87157ee993 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -470,8 +470,12 @@ void CcdPhysicsEnvironment::updateCcdPhysicsController(CcdPhysicsController* ctr
if (newMass)
body->getCollisionShape()->calculateLocalInertia(newMass, inertia);
body->setMassProps(newMass, inertia);
+ m_dynamicsWorld->addRigidBody(body, newCollisionGroup, newCollisionMask);
+ }
+ else
+ {
+ m_dynamicsWorld->addCollisionObject(obj, newCollisionGroup, newCollisionMask);
}
- m_dynamicsWorld->addCollisionObject(obj, newCollisionGroup, newCollisionMask);
}
// to avoid nasty interaction, we must update the property of the controller as well
ctrl->m_cci.m_mass = newMass;
@@ -1457,7 +1461,7 @@ struct OcclusionBuffer
const float face,
const btScalar minarea)
{
- const btScalar a2=cross(b-a,c-a)[2];
+ const btScalar a2=btCross(b-a,c-a)[2];
if((face*a2)<0.f || btFabs(a2)<minarea)
return false;
// further down we are normally going to write to the Zbuffer, mark it so
@@ -1990,6 +1994,44 @@ void CcdPhysicsEnvironment::setConstraintParam(int constraintId,int param,float
default:
{
}
+ };
+ break;
+ };
+ case PHY_CONE_TWIST_CONSTRAINT:
+ {
+ switch (param)
+ {
+ case 3: case 4: case 5:
+ {
+ //param = 3,4,5 are constraint limits, high limit values
+ btConeTwistConstraint* coneTwist = (btConeTwistConstraint*)typedConstraint;
+ if(value1<0.0f)
+ coneTwist->setLimit(param,btScalar(BT_LARGE_FLOAT));
+ else
+ coneTwist->setLimit(param,value1);
+ break;
+ }
+ default:
+ {
+ }
+ };
+ break;
+ };
+ case PHY_ANGULAR_CONSTRAINT:
+ case PHY_LINEHINGE_CONSTRAINT:
+ {
+ switch (param)
+ {
+ case 3:
+ {
+ //param = 3 is a constraint limit, with low/high limit value
+ btHingeConstraint* hingeCons = (btHingeConstraint*)typedConstraint;
+ hingeCons->setLimit(value0,value1);
+ break;
+ }
+ default:
+ {
+ }
}
break;
};
@@ -2623,20 +2665,54 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
if (rb1)
{
- btVector3 axisInB = rb1 ?
- (rb1->getCenterOfMassTransform().getBasis().inverse()*(rb0->getCenterOfMassTransform().getBasis() * axisInA)) :
- rb0->getCenterOfMassTransform().getBasis() * axisInA;
+ // We know the orientations so we should use them instead of
+ // having btHingeConstraint fill in the blanks any way it wants to.
+ btTransform frameInA;
+ btTransform frameInB;
+
+ btVector3 axis1(axis1X,axis1Y,axis1Z), axis2(axis2X,axis2Y,axis2Z);
+ if (axis1.length() == 0.0)
+ {
+ btPlaneSpace1( axisInA, axis1, axis2 );
+ }
+
+ // Internally btHingeConstraint's hinge-axis is z
+ frameInA.getBasis().setValue( axis1.x(), axis2.x(), axisInA.x(),
+ axis1.y(), axis2.y(), axisInA.y(),
+ axis1.z(), axis2.z(), axisInA.z() );
+
+ frameInA.setOrigin( pivotInA );
- hinge = new btHingeConstraint(
- *rb0,
- *rb1,pivotInA,pivotInB,axisInA,axisInB);
+ btTransform inv = rb1->getCenterOfMassTransform().inverse();
+
+ btTransform globalFrameA = rb0->getCenterOfMassTransform() * frameInA;
+
+ frameInB = inv * globalFrameA;
+
+ hinge = new btHingeConstraint(*rb0,*rb1,frameInA,frameInB);
} else
{
- hinge = new btHingeConstraint(*rb0,
- pivotInA,axisInA);
+ static btRigidBody s_fixedObject2( 0,0,0);
+
+ btTransform frameInA;
+ btTransform frameInB;
+
+ btVector3 axis1(axis1X,axis1Y,axis1Z), axis2(axis2X,axis2Y,axis2Z);
+ if (axis1.length() == 0.0)
+ {
+ btPlaneSpace1( axisInA, axis1, axis2 );
+ }
+
+ // Internally btHingeConstraint's hinge-axis is z
+ frameInA.getBasis().setValue( axis1.x(), axis2.x(), axisInA.x(),
+ axis1.y(), axis2.y(), axisInA.y(),
+ axis1.z(), axis2.z(), axisInA.z() );
+ frameInA.setOrigin( pivotInA );
+ frameInB = rb0->getCenterOfMassTransform() * frameInA;
+ hinge = new btHingeConstraint(*rb0, s_fixedObject2, frameInA, frameInB);
}
hinge->setAngularOnly(angularOnly);
@@ -2721,3 +2797,35 @@ float CcdPhysicsEnvironment::getAppliedImpulse(int constraintid)
return 0.f;
}
+
+void CcdPhysicsEnvironment::exportFile(const char* filename)
+{
+ btDefaultSerializer* serializer = new btDefaultSerializer();
+
+
+ for (int i=0;i<m_dynamicsWorld->getNumCollisionObjects();i++)
+ {
+
+ btCollisionObject* colObj = m_dynamicsWorld->getCollisionObjectArray()[i];
+
+ CcdPhysicsController* controller = static_cast<CcdPhysicsController*>(colObj->getUserPointer());
+ if (controller)
+ {
+ const char* name = controller->getName();
+ if (name)
+ {
+ serializer->registerNameForPointer(colObj,name);
+ }
+ }
+ }
+
+ m_dynamicsWorld->serialize(serializer);
+
+ FILE* file = fopen(filename,"wb");
+ if (file)
+ {
+ fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1, file);
+ fclose(file);
+ }
+}
+
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
index 4b97dc95179..51e00b9111f 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
@@ -125,7 +125,11 @@ protected:
virtual void debugDrawWorld();
// virtual bool proceedDeltaTimeOneStep(float timeStep);
- virtual void setFixedTimeStep(bool useFixedTimeStep,float fixedTimeStep){};
+ virtual void setFixedTimeStep(bool useFixedTimeStep,float fixedTimeStep)
+ {
+ //based on DEFAULT_PHYSICS_TIC_RATE of 60 hertz
+ setNumTimeSubSteps(fixedTimeStep/60.f);
+ }
//returns 0.f if no fixed timestep is used
virtual float getFixedTimeStep(){ return 0.f;};
@@ -280,6 +284,8 @@ protected:
bool m_scalingPropagated;
+ virtual void exportFile(const char* filename);
+
#ifdef WITH_CXX_GUARDEDALLOC
public:
diff --git a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
index e2a9b5e99e4..60da4523dd5 100644
--- a/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
+++ b/source/gameengine/Physics/common/PHY_IPhysicsEnvironment.h
@@ -180,6 +180,7 @@ class PHY_IPhysicsEnvironment
virtual void setConstraintParam(int constraintId,int param,float value,float value1) = 0;
virtual float getConstraintParam(int constraintId,int param) = 0;
+ virtual void exportFile(const char* filename) {};
#ifdef WITH_CXX_GUARDEDALLOC
public:
diff --git a/source/gameengine/Rasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/CMakeLists.txt
index d899fc38162..7e2fda177d7 100644
--- a/source/gameengine/Rasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/CMakeLists.txt
@@ -32,9 +32,9 @@ set(INC
../../../source/gameengine/Ketsji
../../../intern/string
../../../intern/moto/include
- ../../../extern/glew/include
../../../intern/guardedalloc
../Expressions
+ ${GLEW_INCLUDE_PATH}
${PYTHON_INCLUDE_DIRS}
)
diff --git a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
index e8c0a73813e..47f1dcb412a 100644
--- a/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
+++ b/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
@@ -241,7 +241,7 @@ bool RAS_IPolyMaterial::UsesLighting(RAS_IRasterizer *rasty) const
else if(rasty->GetDrawingMode() < RAS_IRasterizer::KX_SOLID);
else if(rasty->GetDrawingMode() == RAS_IRasterizer::KX_SHADOW);
else
- dolights = (m_drawingmode & 16)!=0;
+ dolights = (m_drawingmode & RAS_IRasterizer::KX_LIGHT)!=0;
return dolights;
}
diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h
index f76799953a1..305e2bca756 100644
--- a/source/gameengine/Rasterizer/RAS_IRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h
@@ -71,7 +71,7 @@ public:
/**
*/
enum {
- RAS_RENDER_3DPOLYGON_TEXT = 16384
+ RAS_RENDER_3DPOLYGON_TEXT = 16384 /* TF_BMFONT */
};
/**
* Drawing types
@@ -106,7 +106,9 @@ public:
/**
*/
enum {
- KX_TWOSIDE = 512,
+ KX_TEX = 4, /* TF_TEX */
+ KX_LIGHT = 16, /* TF_LIGHT */
+ KX_TWOSIDE = 512, /* TF_TWOSIDE */
KX_LINES = 32768
};
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
index d47f19eda90..7c1dd8a2de8 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
@@ -31,12 +31,12 @@ set(INC
../../../../source/gameengine/Rasterizer
../../../../source/gameengine/Ketsji
../../../../source/gameengine/SceneGraph
- ../../../../extern/glew/include
../../../../source/blender/gpu
../../../../source/blender/makesdna
../../../../source/blender/blenkernel
../../../../source/blender/blenlib
../../../../source/blender/blenloader
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index 597cec17c61..4eeb6796c14 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -124,16 +124,16 @@ bool RAS_OpenGLRasterizer::Init()
glFrontFace(GL_CCW);
m_last_frontface = true;
- glClearColor(m_redback,m_greenback,m_blueback,m_alphaback);
- glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-
m_redback = 0.4375;
m_greenback = 0.4375;
m_blueback = 0.4375;
m_alphaback = 0.0;
+ glClearColor(m_redback,m_greenback,m_blueback,m_alphaback);
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+
glShadeModel(GL_SMOOTH);
return true;
@@ -778,7 +778,7 @@ static int CheckTexfaceDM(void *mcol, int index)
}
*/
-static int CheckTexDM(MTFace *tface, MCol *mcol, int matnr)
+static int CheckTexDM(MTFace *tface, int has_vcol, int matnr)
{
// index is the original face index, retrieve the polygon
@@ -793,7 +793,7 @@ static int CheckTexDM(MTFace *tface, MCol *mcol, int matnr)
// don't use mcol
return 2;
}
- if (!mcol) {
+ if (!has_vcol) {
// we have to set the color from the material
unsigned char rgba[4];
current_polymat->GetMaterialRGBAColor(rgba);
diff --git a/source/gameengine/VideoTexture/CMakeLists.txt b/source/gameengine/VideoTexture/CMakeLists.txt
index acab8de8d38..aae57fce679 100644
--- a/source/gameengine/VideoTexture/CMakeLists.txt
+++ b/source/gameengine/VideoTexture/CMakeLists.txt
@@ -45,7 +45,7 @@ set(INC
../../../intern/string
../../../intern/moto/include
../../../intern/guardedalloc
- ../../../extern/glew/include
+ ${GLEW_INCLUDE_PATH}
)
set(SRC
diff --git a/source/icons/SConscript b/source/icons/SConscript
index ca6308781e9..4bb27a7d4fb 100644
--- a/source/icons/SConscript
+++ b/source/icons/SConscript
@@ -1,9 +1,12 @@
#!/usr/bin/python
Import ('env')
+import btools
-if env['OURPLATFORM'] == 'linuxcross':
- source = 'linuxcrossblender.rcscons'
-else:
- source = 'winblender.rcscons'
+env['RCFLAGS'].append("-DWINDRES")
+env['RCFLAGS'].append("-DBLEN_VER_RC_STR_M=" + btools.VERSION)
+env['RCFLAGS'].append("-DBLEN_VER_RC_1=" + btools.VERSION[0])
+env['RCFLAGS'].append("-DBLEN_VER_RC_2=" + btools.VERSION[2])
+env['RCFLAGS'].append("-DBLEN_VER_RC_3=" + btools.VERSION[3])
+env['RCFLAGS'].append("-DBLEN_VER_RC_4=0")
-env.BlenderRes('winresource', source, ['core'], priority=[95])
+env.BlenderRes('winresource', 'winblender.rc', ['core'], priority=[95])
diff --git a/source/icons/blender.exe.manifest b/source/icons/blender.exe.manifest
new file mode 100644
index 00000000000..bc13bf4c586
--- /dev/null
+++ b/source/icons/blender.exe.manifest
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+ <security>
+ <requestedPrivileges>
+ <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
+ </requestedPrivileges>
+ </security>
+ </trustInfo>
+</assembly>
diff --git a/source/icons/linuxcrossblender.rcscons b/source/icons/linuxcrossblender.rcscons
deleted file mode 100644
index cf3083aa472..00000000000
--- a/source/icons/linuxcrossblender.rcscons
+++ /dev/null
@@ -1,2 +0,0 @@
-APPICON ICON "source/icons/winblender.ico"
-BLENDERFILE ICON "source/icons/winblenderfile.ico"
diff --git a/source/icons/winblender.rc b/source/icons/winblender.rc
index 77e62111d2d..244c2cb2e2c 100644
--- a/source/icons/winblender.rc
+++ b/source/icons/winblender.rc
@@ -1,2 +1,40 @@
-APPICON ICON "winblender.ico"
-BLENDERFILE ICON "winblenderfile.ico"
+#define BLENDERFILE 1
+#define IDR_VERSION1 1
+
+#ifdef WINDRES
+ #include "winresrc.h"
+ #define IDC_STATIC (-1)
+ #define STRINGIFY_(x) #x
+ #define STRINGIFY(x) STRINGIFY_(x)
+ #define BLEN_VER_RC_STR STRINGIFY(BLEN_VER_RC_STR_M)
+ 1 RT_MANIFEST "blender.exe.manifest"
+#endif
+
+APPICON ICON DISCARDABLE "winblender.ico"
+BLENDERFILE ICON DISCARDABLE "winblenderfile.ico"
+
+IDR_VERSION1 VERSIONINFO
+FILEVERSION BLEN_VER_RC_1, BLEN_VER_RC_2, BLEN_VER_RC_3, BLEN_VER_RC_4
+PRODUCTVERSION BLEN_VER_RC_1, BLEN_VER_RC_2, BLEN_VER_RC_3, BLEN_VER_RC_4
+FILEOS 0x00000004
+FILETYPE 0x00000001
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "04090000"
+ BEGIN
+ VALUE "FileVersion", BLEN_VER_RC_STR
+ VALUE "ProductVersion", BLEN_VER_RC_STR
+ VALUE "CompanyName", "Blender Foundation"
+ VALUE "FileDescription", "Blender"
+ VALUE "LegalCopyright", "GPLv2 (Blender Foundation)"
+ VALUE "OriginalFilename", "blender.exe"
+ VALUE "ProductName", "Blender"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 0x0000
+ END
+END
+
diff --git a/source/icons/winblender.rcscons b/source/icons/winblender.rcscons
deleted file mode 100644
index 97579f1ffe0..00000000000
--- a/source/icons/winblender.rcscons
+++ /dev/null
@@ -1,2 +0,0 @@
-APPICON ICON "source\\icons\\winblender.ico"
-BLENDERFILE ICON "source\\icons\\winblenderfile.ico"
diff --git a/source/tests/CMakeLists.txt b/source/tests/CMakeLists.txt
index 27b4ea7a6bd..5acbf7aa903 100644
--- a/source/tests/CMakeLists.txt
+++ b/source/tests/CMakeLists.txt
@@ -20,7 +20,7 @@
#
# ***** END GPL LICENSE BLOCK *****
-# --env-system-scripts allows to run without WITH_INSTALL
+# --env-system-scripts allows to run without the install target.
# Use '--write-blend=/tmp/test.blend' to view output
@@ -28,81 +28,114 @@
set(TEST_SRC_DIR ${CMAKE_SOURCE_DIR}/../lib/tests)
set(TEST_OUT_DIR ${CMAKE_BINARY_DIR}/tests)
+# ugh, any better way to do this on testing only?
+execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${TEST_OUT_DIR})
+
#~ if(NOT IS_DIRECTORY ${TEST_SRC_DIR})
#~ message(FATAL_ERROR "CMake test directory not found!")
#~ endif()
# all calls to blender use this
-set(GENERIC_ARGS --background --factory-startup --env-system-scripts ${CMAKE_SOURCE_DIR}/release/scripts)
+if(APPLE)
+ set(TEST_BLENDER_EXE ${EXECUTABLE_OUTPUT_PATH}/blender.app/Contents/MacOS/blender)
+else()
+ set(TEST_BLENDER_EXE ${EXECUTABLE_OUTPUT_PATH}/blender)
+endif()
+
+# for testing with valgrind prefix: valgrind --track-origins=yes --error-limit=no
+set(TEST_BLENDER_EXE ${TEST_BLENDER_EXE} --background --factory-startup --env-system-scripts ${CMAKE_SOURCE_DIR}/release/scripts)
+
+
+# ------------------------------------------------------------------------------
+# GENERAL PYTHON CORRECTNESS TESTS
+add_test(script_load_addons ${TEST_BLENDER_EXE}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_load_addons.py
+)
+
+add_test(script_load_modules ${TEST_BLENDER_EXE}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_load_py_modules.py
+)
+
+# test running operators doesn't segfault under various conditions
+add_test(script_run_operators ${TEST_BLENDER_EXE}
+ --python ${CMAKE_CURRENT_LIST_DIR}/bl_run_operators.py
+)
+# ------------------------------------------------------------------------------
+# IO TESTS
# OBJ Import tests
-add_test(import_obj_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_obj_cube ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_scene.obj\(filepath='${TEST_SRC_DIR}/io_tests/obj/cube.obj'\)
--md5=4d090508b812b5e08168aa2614746bda --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_obj_cube.blend
)
-add_test(import_obj_nurbs_cyclic ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_obj_nurbs_cyclic ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_scene.obj\(filepath='${TEST_SRC_DIR}/io_tests/obj/nurbs_cyclic.obj'\)
--md5=9e0da7b65b4c4f818a203d56af2d3a4b --md5_method=SCENE
- --write-blend=/root/foo99.blend
+ --write-blend=${TEST_OUT_DIR}/import_obj_nurbs_cyclic.blend
)
-add_test(import_obj_makehuman ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_obj_makehuman ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_scene.obj\(filepath='${TEST_SRC_DIR}/io_tests/obj/makehuman.obj'\)
--md5=e0829dc078b0789e1d81f1071235bc4f --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_obj_makehuman.blend
)
# OBJ Export tests
-add_test(export_obj_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_obj_cube ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.obj\(filepath='${TEST_OUT_DIR}/export_obj_cube.obj',use_selection=False\)
--md5_source=${TEST_OUT_DIR}/export_obj_cube.obj
--md5_source=${TEST_OUT_DIR}/export_obj_cube.mtl
- --md5=70bdc394c2726203ad26c085176e3484 --md5_method=FILE
+ --md5=f0580f0e5d7b379e0460f11d8fde244d --md5_method=FILE
)
-add_test(export_obj_nurbs ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_obj_nurbs ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.obj\(filepath='${TEST_OUT_DIR}/export_obj_nurbs.obj',use_selection=False,use_nurbs=True\)
--md5_source=${TEST_OUT_DIR}/export_obj_nurbs.obj
--md5_source=${TEST_OUT_DIR}/export_obj_nurbs.mtl
- --md5=a733ae4fa4a591ea9b0912da3af042de --md5_method=FILE
+ --md5=aa00875343e0feea449739146d26d7d0 --md5_method=FILE
)
-add_test(export_obj_all_objects ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_obj_all_objects ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.obj\(filepath='${TEST_OUT_DIR}/export_obj_all_objects.obj',use_selection=False,use_nurbs=True\)
--md5_source=${TEST_OUT_DIR}/export_obj_all_objects.obj
--md5_source=${TEST_OUT_DIR}/export_obj_all_objects.mtl
- --md5=6e033a6a9c923d7aa3613b36e373f55b --md5_method=FILE
+ --md5=4c93980ecfb7d02ca68d3da8e2fced69 --md5_method=FILE
)
# PLY Import tests
-add_test(import_ply_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_ply_cube ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_mesh.ply\(filepath='${TEST_SRC_DIR}/io_tests/ply/cube_ascii.ply'\)
--md5=527134343c27fc0ea73115b85fbfd3ac --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_ply_cube.blend
)
-add_test(import_ply_bunny ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_ply_bunny ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_mesh.ply\(filepath='${TEST_SRC_DIR}/io_tests/ply/bunny2.ply'\)
--md5=6ea5b8533400a17accf928b8fd024eaa --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_ply_bunny.blend
)
-add_test(import_ply_small_holes ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_ply_small_holes ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_mesh.ply\(filepath='${TEST_SRC_DIR}/io_tests/ply/many_small_holes.ply'\)
--md5=c3093e26ecae5b6d59fbbcf2a0d0b39f --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_ply_small_holes.blend
)
# PLY Export tests (TODO)
@@ -110,22 +143,25 @@ add_test(import_ply_small_holes ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS
# STL Import tests
-add_test(import_stl_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_stl_cube ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_mesh.stl\(filepath='${TEST_SRC_DIR}/io_tests/stl/cube.stl'\)
--md5=8ceb5bb7e1cb5f4342fa1669988c66b4 --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_stl_cube.blend
)
-add_test(import_stl_conrod ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_stl_conrod ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_mesh.stl\(filepath='${TEST_SRC_DIR}/io_tests/stl/conrod.stl'\)
--md5=690a4b8eb9002dcd8631c5a575ea7348 --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_stl_conrod.blend
)
-add_test(import_stl_knot_max_simplified ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_stl_knot_max_simplified ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_mesh.stl\(filepath='${TEST_SRC_DIR}/io_tests/stl/knot_max_simplified.stl'\)
--md5=baf82803f45a84ec4ddbad9cef57dd3e --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_stl_knot_max_simplified.blend
)
# STL Export tests (TODO)
@@ -133,35 +169,37 @@ add_test(import_stl_knot_max_simplified ${EXECUTABLE_OUTPUT_PATH}/blender ${GENE
# X3D Import
-add_test(import_x3d_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_x3d_cube ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_scene.x3d\(filepath='${TEST_SRC_DIR}/io_tests/x3d/color_cube.x3d'\)
- --md5=c80538e272812c9d765d43df269d8a9b --md5_method=SCENE
+ --md5=330c0cf6e8c44d5fe5b662d30b75be89 --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_x3d_cube.blend
)
-add_test(import_x3d_teapot ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_x3d_teapot ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_scene.x3d\(filepath='${TEST_SRC_DIR}/io_tests/x3d/teapot.x3d'\)
- --md5=fa19713ff71d4b3893dcbe0ab3a73955 --md5_method=SCENE
- --write-blend=/root/foo99.blend
+ --md5=b2f02157bc918b54b835d1e6ece70423 --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_x3d_teapot.blend
)
-add_test(import_x3d_suzanne_material ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_x3d_suzanne_material ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_scene.x3d\(filepath='${TEST_SRC_DIR}/io_tests/x3d/suzanne_material.x3d'\)
- --md5=52a59dcf731904ac49953dd82c020ae5 --md5_method=SCENE
+ --md5=11837901cbbfabef52b6ab4f26fe97b3 --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_x3d_suzanne_material.blend
)
# X3D Export
-add_test(export_x3d_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_x3d_cube ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_cube.x3d',use_selection=False\)
--md5_source=${TEST_OUT_DIR}/export_x3d_cube.x3d
- --md5=560ba3762a6604669994f661235ef93c --md5_method=FILE
+ --md5=9198ca86f19b68a4f1eb75bb48cb3dea --md5_method=FILE
)
-add_test(export_x3d_nurbs ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_x3d_nurbs ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_nurbs.x3d',use_selection=False\)
@@ -169,38 +207,40 @@ add_test(export_x3d_nurbs ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
--md5=078c0ca5a08f123cd2cdac48afb54853 --md5_method=FILE
)
-add_test(export_x3d_all_objects ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_x3d_all_objects ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.x3d\(filepath='${TEST_OUT_DIR}/export_x3d_all_objects.x3d',use_selection=False\)
--md5_source=${TEST_OUT_DIR}/export_x3d_all_objects.x3d
- --md5=5f8153d1475e187efca15dcb029d280d --md5_method=FILE
+ --md5=090f4f36c450826a043f9cd074d9cbb4 --md5_method=FILE
)
# 3DS Import
-add_test(import_3ds_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_3ds_cube ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_scene.autodesk_3ds\(filepath='${TEST_SRC_DIR}/io_tests/3ds/cube.3ds'\)
--md5=cb5a45c35a343c3f5beca2a918472951 --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_3ds_cube.blend
)
-add_test(import_3ds_hierarchy_lara ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_3ds_hierarchy_lara ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_scene.autodesk_3ds\(filepath='${TEST_SRC_DIR}/io_tests/3ds/hierarchy_lara.3ds'\)
--md5=2e9812099b26ad607fdcf4c7be918c71 --md5_method=SCENE
- --write-blend=/root/foo99.blend
+ --write-blend=${TEST_OUT_DIR}/import_3ds_hierarchy_lara.blend
)
-add_test(import_3ds_hierarchy_greek_trireme ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(import_3ds_hierarchy_greek_trireme ${TEST_BLENDER_EXE}
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.import_scene.autodesk_3ds\(filepath='${TEST_SRC_DIR}/io_tests/3ds/hierarchy_greek_trireme.3ds'\)
--md5=d05b922d7be20356d8409d1f768a3a9a --md5_method=SCENE
+ --write-blend=${TEST_OUT_DIR}/import_3ds_hierarchy_greek_trireme.blend
)
# 3DS Export
-add_test(export_3ds_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_3ds_cube ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_cube.3ds',use_selection=False\)
@@ -208,7 +248,7 @@ add_test(export_3ds_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
--md5=0df6cfb130052d01e31ef77d391d4cc0 --md5_method=FILE
)
-add_test(export_3ds_nurbs ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_3ds_nurbs ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_nurbs.3ds',use_selection=False\)
@@ -216,7 +256,7 @@ add_test(export_3ds_nurbs ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
--md5=ba1a6d43346fee3bcadc7e30e3c95935 --md5_method=FILE
)
-add_test(export_3ds_all_objects ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_3ds_all_objects ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.autodesk_3ds\(filepath='${TEST_OUT_DIR}/export_3ds_all_objects.3ds',use_selection=False\)
@@ -228,26 +268,26 @@ add_test(export_3ds_all_objects ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS
# FBX Export
# 'use_metadata=False' for reliable md5's
-add_test(export_fbx_cube ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_fbx_cube ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_geometry/all_quads.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_cube.fbx',use_selection=False,use_metadata=False\)
--md5_source=${TEST_OUT_DIR}/export_fbx_cube.fbx
- --md5=a0806dc974d814f338b821ab326a6be0 --md5_method=FILE
+ --md5=f06510778487dc5ff24ee6460b8682f4 --md5_method=FILE
)
-add_test(export_fbx_nurbs ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_fbx_nurbs ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_geometry/nurbs.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_nurbs.fbx',use_selection=False,use_metadata=False\)
--md5_source=${TEST_OUT_DIR}/export_fbx_nurbs.fbx
- --md5=2cda2b37ee6698aff4129af48fce1291 --md5_method=FILE
+ --md5=6d03eea19394db240d92ec35c8eb8cc5 --md5_method=FILE
)
-add_test(export_fbx_all_objects ${EXECUTABLE_OUTPUT_PATH}/blender ${GENERIC_ARGS}
+add_test(export_fbx_all_objects ${TEST_BLENDER_EXE}
${TEST_SRC_DIR}/io_tests/blend_scene/all_objects.blend
--python ${CMAKE_CURRENT_LIST_DIR}/bl_test.py --
--run={'FINISHED'}&bpy.ops.export_scene.fbx\(filepath='${TEST_OUT_DIR}/export_fbx_all_objects.fbx',use_selection=False,use_metadata=False\)
--md5_source=${TEST_OUT_DIR}/export_fbx_all_objects.fbx
- --md5=be69cf0baf51dcf43f579183310cb383 --md5_method=FILE
+ --md5=8fe9140054eb90b1190809ea8f1c2358 --md5_method=FILE
)
diff --git a/source/tests/batch_import.py b/source/tests/batch_import.py
index 5fbe38e08ce..5c228c014ca 100644
--- a/source/tests/batch_import.py
+++ b/source/tests/batch_import.py
@@ -34,6 +34,14 @@ Example Usage:
--match="*.3ds" \
--start=0 --end=1000 \
--save_path=/tmp/test
+
+./blender.bin --background --addons io_curve_svg --python source/tests/batch_import.py -- \
+ --operator="bpy.ops.import_curve.svg" \
+ --path="/usr/" \
+ --match="*.svg" \
+ --start=0 --end=1000 \
+ --save_path=/tmp/test
+
"""
import os
@@ -61,8 +69,9 @@ def batch_import(operator="",
start=0,
end=sys.maxsize,
):
+ import addon_utils
+ _reset_all = addon_utils.reset_all # XXX, hack
- print(list(globals().keys()))
import fnmatch
path = os.path.normpath(path)
@@ -94,16 +103,29 @@ def batch_import(operator="",
if len(files) != files_len:
print(" using a subset in (%d, %d), total %d" % (start, end, len(files)), end="")
- print("")
-
import bpy
op = eval(operator)
+
+ tot_done = 0
+ tot_fail = 0
+
for i, f in enumerate(files):
print(" %s(filepath=%r) # %d of %d" % (operator, f, i + start, len(files)))
+
+ # hack so loading the new file doesnt undo our loaded addons
+ addon_utils.reset_all = lambda: None # XXX, hack
+
bpy.ops.wm.read_factory_settings()
+
+ addon_utils.reset_all = _reset_all # XXX, hack
clear_scene()
- op(filepath=f)
+ result = op(filepath=f)
+
+ if 'FINISHED' in result:
+ tot_done += 1
+ else:
+ tot_fail += 1
if save_path:
fout = os.path.join(save_path, os.path.relpath(f, path))
@@ -117,6 +139,8 @@ def batch_import(operator="",
bpy.ops.wm.save_as_mainfile(filepath=fout_blend)
+ print("finished, done:%d, fail:%d" % (tot_done, tot_fail))
+
def main():
import optparse
diff --git a/source/tests/bl_load_addons.py b/source/tests/bl_load_addons.py
new file mode 100644
index 00000000000..5bd83abbcb6
--- /dev/null
+++ b/source/tests/bl_load_addons.py
@@ -0,0 +1,78 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# simple script to enable all addons, and disable
+
+import bpy
+import addon_utils
+
+import sys
+import imp
+
+
+def reload_addons(do_reload=True, do_reverse=True):
+ modules = addon_utils.modules({})
+ modules.sort(key=lambda mod: mod.__name__)
+ addons = bpy.context.user_preferences.addons
+
+ # first disable all
+ for mod_name in list(addons.keys()):
+ addon_utils.disable(mod_name)
+
+ assert(bool(addons) == False)
+
+ # Run twice each time.
+ for i in (0, 1):
+ for mod in modules:
+ mod_name = mod.__name__
+ print("\tenabling:", mod_name)
+ addon_utils.enable(mod_name)
+ assert(mod_name in addons)
+
+ for mod in addon_utils.modules({}):
+ mod_name = mod.__name__
+ print("\tdisabling:", mod_name)
+ addon_utils.disable(mod_name)
+ assert(not (mod_name in addons))
+
+ # now test reloading
+ if do_reload:
+ imp.reload(sys.modules[mod_name])
+
+ if do_reverse:
+ # incase order matters when it shouldnt
+ modules.reverse()
+
+
+def main():
+ reload_addons(do_reload=False, do_reverse=False)
+ reload_addons(do_reload=False, do_reverse=True)
+ reload_addons(do_reload=True, do_reverse=True)
+
+
+if __name__ == "__main__":
+
+ # So a python error exits(1)
+ try:
+ main()
+ except:
+ import traceback
+ traceback.print_exc()
+ sys.exit(1)
diff --git a/source/tests/bl_load_py_modules.py b/source/tests/bl_load_py_modules.py
new file mode 100644
index 00000000000..5a65578d8d3
--- /dev/null
+++ b/source/tests/bl_load_py_modules.py
@@ -0,0 +1,145 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# simple script to enable all addons, and disable
+
+import bpy
+import addon_utils
+
+import sys
+import os
+import imp
+
+
+def source_list(path, filename_check=None):
+ from os.path import join
+ for dirpath, dirnames, filenames in os.walk(path):
+ # skip '.svn'
+ if dirpath.startswith("."):
+ continue
+
+ for filename in filenames:
+ filepath = join(dirpath, filename)
+ if filename_check is None or filename_check(filepath):
+ yield filepath
+
+
+def load_addons():
+ modules = addon_utils.modules({})
+ modules.sort(key=lambda mod: mod.__name__)
+ addons = bpy.context.user_preferences.addons
+
+ # first disable all
+ for mod_name in list(addons.keys()):
+ addon_utils.disable(mod_name)
+
+ assert(bool(addons) == False)
+
+ for mod in modules:
+ mod_name = mod.__name__
+ addon_utils.enable(mod_name)
+ assert(mod_name in addons)
+
+
+def load_modules():
+ modules = []
+ module_paths = []
+
+ # paths blender stores scripts in.
+ paths = bpy.utils.script_paths()
+
+ #
+ # find all sys.path we added
+ for script_path in paths:
+ for mod_dir in sys.path:
+ if mod_dir.startswith(script_path):
+ module_paths.append(mod_dir)
+
+ #
+ # collect modules from our paths.
+ for mod_dir in module_paths:
+ # print("mod_dir", mod_dir)
+ for mod, mod_full in bpy.path.module_names(mod_dir):
+ modules.append(__import__(mod))
+
+ #
+ # now submodules
+ for m in modules:
+ filepath = m.__file__
+ if os.path.basename(filepath).startswith("__init__."):
+ mod_dir = os.path.dirname(filepath)
+ for submod, submod_full in bpy.path.module_names(mod_dir):
+ # fromlist is ignored, ugh.
+ mod_name_full = m.__name__ + "." + submod
+ __import__(mod_name_full)
+ mod_imp = sys.modules[mod_name_full]
+
+ # check we load what we ask for.
+ assert(os.path.samefile(mod_imp.__file__, submod_full))
+
+ modules.append(mod_imp)
+
+ #
+ # check which filepaths we didnt load
+ source_files = []
+ for mod_dir in module_paths:
+ source_files.extend(source_list(mod_dir, filename_check=lambda f: f.endswith(".py")))
+
+ source_files = list(set(source_files))
+ source_files.sort()
+
+ #
+ # remove loaded files
+ loaded_files = list({m.__file__ for m in modules})
+ loaded_files.sort()
+
+ for f in loaded_files:
+ source_files.remove(f)
+
+ #
+ # test we tested all files except for presets and templates
+ ignore_paths = [
+ os.sep + "presets" + os.sep,
+ os.sep + "templates" + os.sep,
+ ]
+
+ for f in source_files:
+ ok = False
+ for ignore in ignore_paths:
+ if ignore in f:
+ ok = True
+ if not ok:
+ raise Exception("Source file %r not loaded in test" % f)
+
+ print("loaded %d modules" % len(loaded_files))
+
+
+def main():
+ load_addons()
+ load_modules()
+
+if __name__ == "__main__":
+ # So a python error exits(1)
+ try:
+ main()
+ except:
+ import traceback
+ traceback.print_exc()
+ sys.exit(1)
diff --git a/source/tests/bl_run_operators.py b/source/tests/bl_run_operators.py
new file mode 100644
index 00000000000..668b4e69228
--- /dev/null
+++ b/source/tests/bl_run_operators.py
@@ -0,0 +1,176 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8 compliant>
+
+# semi-useful script, runs all operators in a number of different
+# contexts, cheap way to find misc small bugs but is in no way a complete test.
+#
+# only error checked for here is a segfault.
+
+import bpy
+import sys
+
+op_blacklist = (
+ "script.reload",
+ "export*.*",
+ "import*.*",
+ "*.save_*",
+ "*.read_*",
+ "*.open_*",
+ "*.link_append",
+ "render.render",
+ "*.*_export",
+ "*.*_import",
+ "wm.url_open",
+ "wm.doc_view",
+ "wm.path_open",
+ "help.operator_cheat_sheet",
+ )
+
+
+def filter_op_list(operators):
+ from fnmatch import fnmatchcase
+
+ def is_op_ok(op):
+ for op_match in op_blacklist:
+ if fnmatchcase(op, op_match):
+ print(" skipping: %s (%s)" % (op, op_match))
+ return False
+ return True
+
+ operators[:] = [op for op in operators if is_op_ok(op[0])]
+
+
+def run_ops(operators, setup_func=None):
+ print("\ncontext:", setup_func.__name__)
+ # first invoke
+ for op_id, op in operators:
+ if op.poll():
+ print(" operator:", op_id)
+ sys.stdout.flush() # incase of crash
+
+ # disable will get blender in a bad state and crash easy!
+ bpy.ops.wm.read_factory_settings()
+
+ setup_func()
+
+ for mode in ('EXEC_DEFAULT', 'INVOKE_DEFAULT'):
+ try:
+ op(mode)
+ except:
+ #import traceback
+ #traceback.print_exc()
+ pass
+
+
+# contexts
+def ctx_clear_scene(): # copied from batch_import.py
+ unique_obs = set()
+ for scene in bpy.data.scenes:
+ for obj in scene.objects[:]:
+ scene.objects.unlink(obj)
+ unique_obs.add(obj)
+
+ # remove obdata, for now only worry about the startup scene
+ for bpy_data_iter in (bpy.data.objects, bpy.data.meshes, bpy.data.lamps, bpy.data.cameras):
+ for id_data in bpy_data_iter:
+ bpy_data_iter.remove(id_data)
+
+
+def ctx_editmode_mesh():
+ bpy.ops.object.mode_set(mode='EDIT')
+ bpy.ops.object.vertex_group_add()
+
+
+def ctx_editmode_curves():
+ bpy.ops.curve.primitive_nurbs_circle_add()
+ bpy.ops.object.mode_set(mode='EDIT')
+
+
+def ctx_editmode_surface():
+ bpy.ops.surface.primitive_nurbs_surface_torus_add()
+ bpy.ops.object.mode_set(mode='EDIT')
+
+
+def ctx_editmode_mball():
+ bpy.ops.object.metaball_add()
+ bpy.ops.object.mode_set(mode='EDIT')
+
+
+def ctx_editmode_text():
+ bpy.ops.object.text_add()
+ bpy.ops.object.mode_set(mode='EDIT')
+
+
+def ctx_editmode_armature():
+ bpy.ops.object.armature_add()
+ bpy.ops.object.mode_set(mode='EDIT')
+
+
+def ctx_editmode_lattice():
+ bpy.ops.object.add(type='LATTICE')
+ bpy.ops.object.mode_set(mode='EDIT')
+ # bpy.ops.object.vertex_group_add()
+
+
+def ctx_object_empty():
+ bpy.ops.object.add(type='EMPTY')
+
+
+def ctx_weightpaint():
+ bpy.ops.object.mode_set(mode='WEIGHT_PAINT')
+
+
+def main():
+ # bpy.ops.wm.read_factory_settings()
+ import bpy
+ operators = []
+ for mod_name in dir(bpy.ops):
+ mod = getattr(bpy.ops, mod_name)
+ for submod_name in dir(mod):
+ op = getattr(mod, submod_name)
+ operators.append(("%s.%s" % (mod_name, submod_name), op))
+
+ operators.sort(key=lambda op: op[0])
+
+ filter_op_list(operators)
+
+ # for testing, mix the list up.
+ #operators.reverse()
+
+ #import random
+ #random.shuffle(operators)
+
+ # Run the operator tests in different contexts
+ run_ops(operators, setup_func=lambda: None)
+ run_ops(operators, setup_func=ctx_editmode_surface)
+ run_ops(operators, setup_func=ctx_object_empty)
+ run_ops(operators, setup_func=ctx_editmode_armature)
+ run_ops(operators, setup_func=ctx_editmode_mesh)
+ run_ops(operators, setup_func=ctx_clear_scene)
+ run_ops(operators, setup_func=ctx_editmode_curves)
+ run_ops(operators, setup_func=ctx_editmode_mball)
+ run_ops(operators, setup_func=ctx_editmode_text)
+ run_ops(operators, setup_func=ctx_weightpaint)
+ run_ops(operators, setup_func=ctx_editmode_lattice)
+
+ print("finished")
+
+if __name__ == "__main__":
+ main()
diff --git a/source/tests/bl_test.py b/source/tests/bl_test.py
index 5dd7dbe32d7..cfe91356444 100644
--- a/source/tests/bl_test.py
+++ b/source/tests/bl_test.py
@@ -170,7 +170,9 @@ def main():
md5_update = md5_instance.update
for f in md5_source:
- md5_update(open(f, "rb").read())
+ filehandle = open(f, "rb")
+ md5_update(filehandle.read())
+ filehandle.close()
md5_new = md5_instance.hexdigest()
diff --git a/source/tests/pep8.py b/source/tests/pep8.py
index ee71c877533..f7c416553b2 100644
--- a/source/tests/pep8.py
+++ b/source/tests/pep8.py
@@ -31,7 +31,7 @@ import os
# in debian install pylint pyflakes pep8 with apt-get/aptitude/etc
#
# on *nix run
-# python release/test/pep8.py > pep8_error.txt 2>&1
+# python source/tests/pep8.py > test_pep8.log 2>&1
# how many lines to read into the file, pep8 comment
# should be directly after the licence header, ~20 in most cases
@@ -42,7 +42,7 @@ SKIP_PREFIX = "./tools", "./config", "./scons", "./extern"
def file_list_py(path):
for dirpath, dirnames, filenames in os.walk(path):
for filename in filenames:
- if filename.endswith(".py"):
+ if filename.endswith(".py") or filename.endswith(".cfg"):
yield os.path.join(dirpath, filename)
@@ -87,7 +87,15 @@ def main():
for f in files_skip:
print(" %s" % f)
- # pyflakes
+ # strict imports
+ print("\n\n\n# running pep8...")
+ import re
+ import_check = re.compile(r"\s*from\s+[A-z\.]+\s+import \*\s*")
+ for f, pep8_type in files:
+ for i, l in enumerate(open(f, 'r', encoding='utf8')):
+ if import_check.match(l):
+ print("%s:%d:0: global import bad practice" % (f, i + 1))
+
print("\n\n\n# running pep8...")
for f, pep8_type in files:
if pep8_type == 1:
@@ -96,6 +104,7 @@ def main():
else:
os.system("pep8 --repeat '%s'" % (f))
+ # pyflakes
print("\n\n\n# running pyflakes...")
for f, pep8_type in files:
os.system("pyflakes '%s'" % f)